From d1174bb12f7acb679cfd4aaedcfd64ea4a1a9900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kato=E2=84=A2?= <20778155+Kato-iOS@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:30:20 +0400 Subject: [PATCH 01/20] Update README.md Updated: 0.6.0 to 0.8.3 Updated: old wrong code "gas: 21000" with "gasLimit: EthereumQuantity(quantity: 21000)" --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 651290f3..af907971 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Web3 is compatible with Swift Package Manager v5 (Swift 5 and above). Simply add ```Swift dependencies: [ - .package(url: "https://github.com/Boilertalk/Web3.swift.git", from: "0.6.0") + .package(url: "https://github.com/Boilertalk/Web3.swift.git", from: "0.8.3") ] ``` @@ -267,7 +267,7 @@ firstly { let tx = try EthereumTransaction( nonce: nonce, gasPrice: EthereumQuantity(quantity: 21.gwei), - gas: 21000, + gasLimit: EthereumQuantity(quantity: 21000), to: EthereumAddress(hex: "0xC0866A1a0ed41e1aa75c932cA3c55fad847fd90D", eip55: true), value: EthereumQuantity(quantity: 1.eth) ) From 24dc89f1f5601c69edbbde877993a846492b7e36 Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 17 May 2023 16:28:08 +0900 Subject: [PATCH 02/20] Update Web3HttpProvider.swift add header value --- Sources/FoundationHTTP/Web3HttpProvider.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Sources/FoundationHTTP/Web3HttpProvider.swift b/Sources/FoundationHTTP/Web3HttpProvider.swift index ae1277af..95799b13 100644 --- a/Sources/FoundationHTTP/Web3HttpProvider.swift +++ b/Sources/FoundationHTTP/Web3HttpProvider.swift @@ -20,7 +20,7 @@ public struct Web3HttpProvider: Web3Provider { let session: URLSession - static let headers = [ + static var headers = [ "Accept": "application/json", "Content-Type": "application/json" ] @@ -88,4 +88,8 @@ public struct Web3HttpProvider: Web3Provider { task.resume() } } + + func addheaders(key:String, value:String) { + Web3HttpProvider.headers[key] = value + } } From d37141e16095218181e9ba16e942d01cf4a681ca Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 17 May 2023 16:53:24 +0900 Subject: [PATCH 03/20] Update Web3HttpProvider.swift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 추가 수정 --- Sources/FoundationHTTP/Web3HttpProvider.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/FoundationHTTP/Web3HttpProvider.swift b/Sources/FoundationHTTP/Web3HttpProvider.swift index 95799b13..d31bdb32 100644 --- a/Sources/FoundationHTTP/Web3HttpProvider.swift +++ b/Sources/FoundationHTTP/Web3HttpProvider.swift @@ -89,7 +89,7 @@ public struct Web3HttpProvider: Web3Provider { } } - func addheaders(key:String, value:String) { + public func addheaders(key:String, value:String) { Web3HttpProvider.headers[key] = value } } From c70ffaa73170aa6b9138896419e79c612b0f357e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kato=E2=84=A2?= <20778155+Kato-iOS@users.noreply.github.com> Date: Sun, 30 Apr 2023 15:30:20 +0400 Subject: [PATCH 04/20] Update README.md Updated: 0.6.0 to 0.8.3 Updated: old wrong code "gas: 21000" with "gasLimit: EthereumQuantity(quantity: 21000)" (cherry picked from commit d1174bb12f7acb679cfd4aaedcfd64ea4a1a9900) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 651290f3..af907971 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Web3 is compatible with Swift Package Manager v5 (Swift 5 and above). Simply add ```Swift dependencies: [ - .package(url: "https://github.com/Boilertalk/Web3.swift.git", from: "0.6.0") + .package(url: "https://github.com/Boilertalk/Web3.swift.git", from: "0.8.3") ] ``` @@ -267,7 +267,7 @@ firstly { let tx = try EthereumTransaction( nonce: nonce, gasPrice: EthereumQuantity(quantity: 21.gwei), - gas: 21000, + gasLimit: EthereumQuantity(quantity: 21000), to: EthereumAddress(hex: "0xC0866A1a0ed41e1aa75c932cA3c55fad847fd90D", eip55: true), value: EthereumQuantity(quantity: 1.eth) ) From 5daf46fc9034d6341029ad5e612fa92af7cbb816 Mon Sep 17 00:00:00 2001 From: junhojo Date: Fri, 19 May 2023 13:32:22 +0900 Subject: [PATCH 05/20] Update Web3.swift Add eth_chainId --- Sources/Core/Web3/Web3.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index 99bbf4db..0866ab53 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -156,6 +156,17 @@ public struct Web3 { properties.provider.send(request: req, response: response) } + public func chainId(response: @escaping Web3ResponseCompletion) { + let req = BasicRPCRequest( + id: properties.rpcId, + jsonrpc: Web3.jsonrpc, + method: "eth_chainId", + params: [] + ) + + properties.provider.send(request: req, response: response) + } + public func blockNumber(response: @escaping Web3ResponseCompletion) { let req = BasicRPCRequest( id: properties.rpcId, From 81836d533fbda5d7b12e3ca52cbdd956b69ba181 Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 23 Oct 2023 16:27:23 +0900 Subject: [PATCH 06/20] signTypedData_v4 add --- Sources/Core/Web3/Web3.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index 0866ab53..a5cd0eaf 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -342,6 +342,21 @@ public struct Web3 { properties.provider.send(request: req, response: response) } + public func signTypedData_v4( + address: EthereumAddress, + typedData: EthereumData, + response: @escaping Web3ResponseCompletion + ) { + let req = RPCRequest( + id: properties.rpcId, + jsonrpc: Web3.jsonrpc, + method: "eth_signTypedData_v4", + params: [address, typedData] + ) + + properties.provider.send(request: req, response: response) + } + public func estimateGas(call: EthereumCall, response: @escaping Web3ResponseCompletion) { let req = RPCRequest<[EthereumCall]>( id: properties.rpcId, From 88ec14b1687aa7697ef7e2b131d0bb481ff991fa Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 23 Oct 2023 16:27:23 +0900 Subject: [PATCH 07/20] signTypedData_v4 add (cherry picked from commit 81836d533fbda5d7b12e3ca52cbdd956b69ba181) --- Sources/Core/Web3/Web3.swift | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index 99bbf4db..a9898c0d 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -331,6 +331,21 @@ public struct Web3 { properties.provider.send(request: req, response: response) } + public func signTypedData_v4( + address: EthereumAddress, + typedData: EthereumData, + response: @escaping Web3ResponseCompletion + ) { + let req = RPCRequest( + id: properties.rpcId, + jsonrpc: Web3.jsonrpc, + method: "eth_signTypedData_v4", + params: [address, typedData] + ) + + properties.provider.send(request: req, response: response) + } + public func estimateGas(call: EthereumCall, response: @escaping Web3ResponseCompletion) { let req = RPCRequest<[EthereumCall]>( id: properties.rpcId, From 845abc3db3540f70169e8d2df1edeed3d56defc9 Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 23 Oct 2023 18:31:34 +0900 Subject: [PATCH 08/20] fix signTypedData_v4 fix signTypedData_v4 --- Sources/Core/Json/EthereumTypedData.swift | 72 +++++++++++++++++++++++ Sources/Core/Web3/Web3.swift | 6 +- 2 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 Sources/Core/Json/EthereumTypedData.swift diff --git a/Sources/Core/Json/EthereumTypedData.swift b/Sources/Core/Json/EthereumTypedData.swift new file mode 100644 index 00000000..ef8953af --- /dev/null +++ b/Sources/Core/Json/EthereumTypedData.swift @@ -0,0 +1,72 @@ +// +// EthereumTypedDataParams.swift +// Web3 +// +import Foundation + +public struct EthereumTypedData: Codable { + public struct EIP712Domain: Codable { + var name: String + var version: String + } + + public struct DomainType: Codable { + var name: String + var type: String + } + + public struct Pass: Codable { + var holder: String + var contractAddress: String + var tokenId: BigUInt + var environmentId: String + } + + public struct TypedDataMessage: Codable { + var domain: EIP712Domain + var message: Pass + var primaryType: String + var types: [String: [DomainType]] + } + public let typedData: TypedDataMessage + + public init( + typedData: TypedDataMessage + ) { + self.typedData = typedData + } + +} +public struct EthereumTypedDataParams: Codable { + + /// The actual call parameters + public let typedData: EthereumTypedData + + public let address: EthereumAddress + + public init( + typedData: EthereumTypedData, + address: EthereumAddress + ) { + self.typedData = typedData + self.address = address + } + + public init(from decoder: Decoder) throws { + var container = try decoder.unkeyedContainer() + + let typedData = try container.decode(EthereumTypedData.self) + + let address = try container.decode(EthereumAddress.self) + + self.init(typedData: typedData, address: address) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + + try container.encode(typedData) + + try container.encode(address) + } +} diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index a5cd0eaf..c00bef59 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -344,14 +344,14 @@ public struct Web3 { public func signTypedData_v4( address: EthereumAddress, - typedData: EthereumData, + typedData: EthereumTypedData, response: @escaping Web3ResponseCompletion ) { - let req = RPCRequest( + let req = RPCRequest( id: properties.rpcId, jsonrpc: Web3.jsonrpc, method: "eth_signTypedData_v4", - params: [address, typedData] + params: EthereumTypedDataParams(typedData: typedData, address: address) ) properties.provider.send(request: req, response: response) From 7de89042a932ab426991c9ebe5e84fd64423d83e Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 23 Oct 2023 19:11:26 +0900 Subject: [PATCH 09/20] Update EthereumTypedData.swift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit init 추가 --- Sources/Core/Json/EthereumTypedData.swift | 31 +++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/Sources/Core/Json/EthereumTypedData.swift b/Sources/Core/Json/EthereumTypedData.swift index ef8953af..67af714b 100644 --- a/Sources/Core/Json/EthereumTypedData.swift +++ b/Sources/Core/Json/EthereumTypedData.swift @@ -8,30 +8,51 @@ public struct EthereumTypedData: Codable { public struct EIP712Domain: Codable { var name: String var version: String + init(name: String, version: String) { + self.name = name + self.version = version + } } public struct DomainType: Codable { var name: String var type: String + init(name: String, type: String) { + self.name = name + self.type = type + } } - public struct Pass: Codable { + public struct TypedDataMessage: Codable { var holder: String var contractAddress: String var tokenId: BigUInt var environmentId: String + init(holder: String, contractAddress: String, tokenId: BigUInt, environmentId: String) { + self.holder = holder + self.contractAddress = contractAddress + self.tokenId = tokenId + self.environmentId = environmentId + } } - public struct TypedDataMessage: Codable { + public struct TypedData: Codable { var domain: EIP712Domain - var message: Pass + var message: TypedDataMessage var primaryType: String var types: [String: [DomainType]] + init(domain: EIP712Domain, message: TypedDataMessage, primaryType: String, types: [String: [DomainType]]) { + self.domain = domain + self.message = message + self.primaryType = primaryType + self.types = types + } + } - public let typedData: TypedDataMessage + public let typedData: TypedData public init( - typedData: TypedDataMessage + typedData: TypedData ) { self.typedData = typedData } From 1a5b69c924efbf7639784001d35bc958107b2908 Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 23 Oct 2023 19:36:23 +0900 Subject: [PATCH 10/20] public public --- Sources/Core/Json/EthereumTypedData.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/Core/Json/EthereumTypedData.swift b/Sources/Core/Json/EthereumTypedData.swift index 67af714b..7f1f29c4 100644 --- a/Sources/Core/Json/EthereumTypedData.swift +++ b/Sources/Core/Json/EthereumTypedData.swift @@ -8,7 +8,7 @@ public struct EthereumTypedData: Codable { public struct EIP712Domain: Codable { var name: String var version: String - init(name: String, version: String) { + public init(name: String, version: String) { self.name = name self.version = version } @@ -17,7 +17,7 @@ public struct EthereumTypedData: Codable { public struct DomainType: Codable { var name: String var type: String - init(name: String, type: String) { + public init(name: String, type: String) { self.name = name self.type = type } @@ -28,7 +28,7 @@ public struct EthereumTypedData: Codable { var contractAddress: String var tokenId: BigUInt var environmentId: String - init(holder: String, contractAddress: String, tokenId: BigUInt, environmentId: String) { + public init(holder: String, contractAddress: String, tokenId: BigUInt, environmentId: String) { self.holder = holder self.contractAddress = contractAddress self.tokenId = tokenId @@ -41,7 +41,7 @@ public struct EthereumTypedData: Codable { var message: TypedDataMessage var primaryType: String var types: [String: [DomainType]] - init(domain: EIP712Domain, message: TypedDataMessage, primaryType: String, types: [String: [DomainType]]) { + public init(domain: EIP712Domain, message: TypedDataMessage, primaryType: String, types: [String: [DomainType]]) { self.domain = domain self.message = message self.primaryType = primaryType From 415af58aa736ee61db44ac601f4bbc5439d58ec8 Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 25 Oct 2023 19:08:51 +0900 Subject: [PATCH 11/20] CryptoSwift version up CryptoSwift version up --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index d9ae29d3..8ff0bba4 100644 --- a/Package.swift +++ b/Package.swift @@ -26,7 +26,7 @@ let package = Package( dependencies: [ // Core dependencies .package(url: "https://github.com/attaswift/BigInt.git", from: "5.3.0"), - .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.6.0"), + .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.8.0"), .package(name: "secp256k1", url: "https://github.com/Boilertalk/secp256k1.swift.git", from: "0.1.7"), .package(url: "https://github.com/apple/swift-collections.git", .upToNextMajor(from: "1.0.3")), .package(url: "https://github.com/vapor/websocket-kit", .upToNextMajor(from: "2.6.1")), From 606fc3aa719533dcc82e259a61a6c25e516e27d3 Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 25 Oct 2023 19:13:10 +0900 Subject: [PATCH 12/20] CryptoSwift CryptoSwift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 8ff0bba4..394c65ca 100644 --- a/Package.swift +++ b/Package.swift @@ -26,7 +26,7 @@ let package = Package( dependencies: [ // Core dependencies .package(url: "https://github.com/attaswift/BigInt.git", from: "5.3.0"), - .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.8.0"), + .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.5.1"), .package(name: "secp256k1", url: "https://github.com/Boilertalk/secp256k1.swift.git", from: "0.1.7"), .package(url: "https://github.com/apple/swift-collections.git", .upToNextMajor(from: "1.0.3")), .package(url: "https://github.com/vapor/websocket-kit", .upToNextMajor(from: "2.6.1")), From 010bf5787d78e9cb28a4e7fe9e112ff4528bce69 Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 25 Oct 2023 19:20:09 +0900 Subject: [PATCH 13/20] CryptoSwift CryptoSwift --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 394c65ca..d9ae29d3 100644 --- a/Package.swift +++ b/Package.swift @@ -26,7 +26,7 @@ let package = Package( dependencies: [ // Core dependencies .package(url: "https://github.com/attaswift/BigInt.git", from: "5.3.0"), - .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.5.1"), + .package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", from: "1.6.0"), .package(name: "secp256k1", url: "https://github.com/Boilertalk/secp256k1.swift.git", from: "0.1.7"), .package(url: "https://github.com/apple/swift-collections.git", .upToNextMajor(from: "1.0.3")), .package(url: "https://github.com/vapor/websocket-kit", .upToNextMajor(from: "2.6.1")), From ad9a5daf68bc0d2c13c9d7adb786ec4f8f7fec7c Mon Sep 17 00:00:00 2001 From: junhojo Date: Mon, 6 Nov 2023 19:03:34 +0900 Subject: [PATCH 14/20] Update Web3.swift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 수정 사용안함 --- Sources/Core/Web3/Web3.swift | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index c00bef59..0866ab53 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -342,21 +342,6 @@ public struct Web3 { properties.provider.send(request: req, response: response) } - public func signTypedData_v4( - address: EthereumAddress, - typedData: EthereumTypedData, - response: @escaping Web3ResponseCompletion - ) { - let req = RPCRequest( - id: properties.rpcId, - jsonrpc: Web3.jsonrpc, - method: "eth_signTypedData_v4", - params: EthereumTypedDataParams(typedData: typedData, address: address) - ) - - properties.provider.send(request: req, response: response) - } - public func estimateGas(call: EthereumCall, response: @escaping Web3ResponseCompletion) { let req = RPCRequest<[EthereumCall]>( id: properties.rpcId, From e12ba645a725fd4087c7610c0015834739074549 Mon Sep 17 00:00:00 2001 From: junhojo Date: Wed, 10 Jan 2024 15:36:15 +0900 Subject: [PATCH 15/20] =?UTF-8?q?build=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Package.swift | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Package.swift b/Package.swift index d9ae29d3..fab4ed7b 100644 --- a/Package.swift +++ b/Package.swift @@ -6,11 +6,6 @@ let package = Package( name: "Web3", platforms: [ .iOS(.v13), - .macOS(.v10_15), - .watchOS(.v6), - .tvOS(.v13), - .macCatalyst(.v14), - .driverKit(.v20), ], products: [ .library( From 96e0b30157abb2ce35ea6cf69e90c82f8ce01905 Mon Sep 17 00:00:00 2001 From: junhojo Date: Fri, 19 Jan 2024 14:36:39 +0900 Subject: [PATCH 16/20] =?UTF-8?q?=ED=97=A4=EB=93=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 헤드 추가 리팩토링 --- Sources/FoundationHTTP/Web3HttpProvider.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Sources/FoundationHTTP/Web3HttpProvider.swift b/Sources/FoundationHTTP/Web3HttpProvider.swift index d31bdb32..7f871de7 100644 --- a/Sources/FoundationHTTP/Web3HttpProvider.swift +++ b/Sources/FoundationHTTP/Web3HttpProvider.swift @@ -20,11 +20,15 @@ public struct Web3HttpProvider: Web3Provider { let session: URLSession - static var headers = [ + static var headers: [String: String] = [ "Accept": "application/json", "Content-Type": "application/json" ] + static func addHeader(key: String, value: String) { + headers[key] = value + } + public let rpcURL: String public init(rpcURL: String, session: URLSession = URLSession(configuration: .default)) { @@ -90,6 +94,6 @@ public struct Web3HttpProvider: Web3Provider { } public func addheaders(key:String, value:String) { - Web3HttpProvider.headers[key] = value + Web3HttpProvider.addHeader(key: key, value: value) } } From a1b94f0471c0120080fe38f28b63336144187500 Mon Sep 17 00:00:00 2001 From: junhojo Date: Fri, 19 Jan 2024 14:44:04 +0900 Subject: [PATCH 17/20] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sources/Core/Web3/Web3.swift | 11 +++++++++++ Sources/FoundationHTTP/Web3HttpProvider.swift | 10 +++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index a9898c0d..a5cd0eaf 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -156,6 +156,17 @@ public struct Web3 { properties.provider.send(request: req, response: response) } + public func chainId(response: @escaping Web3ResponseCompletion) { + let req = BasicRPCRequest( + id: properties.rpcId, + jsonrpc: Web3.jsonrpc, + method: "eth_chainId", + params: [] + ) + + properties.provider.send(request: req, response: response) + } + public func blockNumber(response: @escaping Web3ResponseCompletion) { let req = BasicRPCRequest( id: properties.rpcId, diff --git a/Sources/FoundationHTTP/Web3HttpProvider.swift b/Sources/FoundationHTTP/Web3HttpProvider.swift index ae1277af..7f871de7 100644 --- a/Sources/FoundationHTTP/Web3HttpProvider.swift +++ b/Sources/FoundationHTTP/Web3HttpProvider.swift @@ -20,11 +20,15 @@ public struct Web3HttpProvider: Web3Provider { let session: URLSession - static let headers = [ + static var headers: [String: String] = [ "Accept": "application/json", "Content-Type": "application/json" ] + static func addHeader(key: String, value: String) { + headers[key] = value + } + public let rpcURL: String public init(rpcURL: String, session: URLSession = URLSession(configuration: .default)) { @@ -88,4 +92,8 @@ public struct Web3HttpProvider: Web3Provider { task.resume() } } + + public func addheaders(key:String, value:String) { + Web3HttpProvider.addHeader(key: key, value: value) + } } From d9595cafad3af384e3adcf15a2981e1b196c9ded Mon Sep 17 00:00:00 2001 From: junhojo Date: Fri, 19 Jan 2024 14:51:38 +0900 Subject: [PATCH 18/20] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Package.swift | 7 ++++++- Sources/Core/Web3/Web3.swift | 15 --------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Package.swift b/Package.swift index fab4ed7b..3c67d2ca 100644 --- a/Package.swift +++ b/Package.swift @@ -5,7 +5,12 @@ import PackageDescription let package = Package( name: "Web3", platforms: [ - .iOS(.v13), + .iOS(.v13), + .macOS(.v10_15), + .watchOS(.v6), + .tvOS(.v13), + .macCatalyst(.v14), + .driverKit(.v20), ], products: [ .library( diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index a5cd0eaf..0866ab53 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -342,21 +342,6 @@ public struct Web3 { properties.provider.send(request: req, response: response) } - public func signTypedData_v4( - address: EthereumAddress, - typedData: EthereumData, - response: @escaping Web3ResponseCompletion - ) { - let req = RPCRequest( - id: properties.rpcId, - jsonrpc: Web3.jsonrpc, - method: "eth_signTypedData_v4", - params: [address, typedData] - ) - - properties.provider.send(request: req, response: response) - } - public func estimateGas(call: EthereumCall, response: @escaping Web3ResponseCompletion) { let req = RPCRequest<[EthereumCall]>( id: properties.rpcId, From a4c71768649fec562194bfdd5cce11dfb667f97b Mon Sep 17 00:00:00 2001 From: junhojo Date: Fri, 19 Jan 2024 15:53:15 +0900 Subject: [PATCH 19/20] signTypedData_v4 signTypedData_v4 delete --- Sources/Core/Web3/Web3.swift | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/Sources/Core/Web3/Web3.swift b/Sources/Core/Web3/Web3.swift index a5cd0eaf..0866ab53 100644 --- a/Sources/Core/Web3/Web3.swift +++ b/Sources/Core/Web3/Web3.swift @@ -342,21 +342,6 @@ public struct Web3 { properties.provider.send(request: req, response: response) } - public func signTypedData_v4( - address: EthereumAddress, - typedData: EthereumData, - response: @escaping Web3ResponseCompletion - ) { - let req = RPCRequest( - id: properties.rpcId, - jsonrpc: Web3.jsonrpc, - method: "eth_signTypedData_v4", - params: [address, typedData] - ) - - properties.provider.send(request: req, response: response) - } - public func estimateGas(call: EthereumCall, response: @escaping Web3ResponseCompletion) { let req = RPCRequest<[EthereumCall]>( id: properties.rpcId, From 9144abefb75ef751ee0cca0dd0e9611fbf236d1e Mon Sep 17 00:00:00 2001 From: "colin.jo" Date: Thu, 24 Oct 2024 18:31:18 +0900 Subject: [PATCH 20/20] init --- Cartfile | 1 + ...file \353\263\265\354\202\254\353\263\270" | 6 + Cartfile.resolved | 1 + Carthage/Checkouts/Alamofire/.dockerignore | 2 + .../Checkouts/Alamofire/.github/FUNDING.yml | 1 + .../.github/ISSUE_TEMPLATE/bug_report.md | 39 + .../.github/ISSUE_TEMPLATE/config.yml | 11 + .../.github/ISSUE_TEMPLATE/feature_request.md | 29 + .../.github/PULL_REQUEST_TEMPLATE.md | 13 + .../Alamofire/.github/workflows/ci.yml | 362 + Carthage/Checkouts/Alamofire/.gitignore | 42 + Carthage/Checkouts/Alamofire/.jazzy.yaml | 8 + Carthage/Checkouts/Alamofire/.ruby-gemset | 1 + Carthage/Checkouts/Alamofire/.ruby-version | 1 + Carthage/Checkouts/Alamofire/.swiftformat | 28 + .../Checkouts/Alamofire/Alamofire.podspec | 21 + .../Alamofire.xcodeproj/project.pbxproj | 2766 ++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/Alamofire iOS.xcscheme | 141 + .../xcschemes/Alamofire macOS.xcscheme | 139 + .../xcschemes/Alamofire tvOS.xcscheme | 141 + .../xcschemes/Alamofire visionOS.xcscheme | 71 + .../xcschemes/Alamofire watchOS.xcscheme | 116 + .../contents.xcworkspacedata | 13 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Carthage/Checkouts/Alamofire/CHANGELOG.md | 3324 +++++++ Carthage/Checkouts/Alamofire/CONTRIBUTING.md | 91 + .../Alamofire/Documentation/AdvancedUsage.md | 1550 ++++ .../Alamofire 2.0 Migration Guide.md | 202 + .../Alamofire 3.0 Migration Guide.md | 186 + .../Alamofire 4.0 Migration Guide.md | 930 ++ .../Alamofire 5.0 Migration Guide.md | 64 + .../Alamofire/Documentation/Usage.md | 1083 +++ .../Base.lproj/LaunchScreen.storyboard | 48 + .../Resources/Base.lproj/Main.storyboard | 369 + .../AppIcon.appiconset/Contents.json | 98 + .../Resources/Images.xcassets/Contents.json | 6 + .../Logo.imageset/Contents.json | 22 + .../Images.xcassets/Logo.imageset/Logo.png | Bin 0 -> 5710 bytes .../Images.xcassets/Logo.imageset/Logo@2x.png | Bin 0 -> 14538 bytes .../Alamofire/Example/Resources/Info.plist | 57 + .../Example/Source/AppDelegate.swift | 59 + .../Example/Source/DetailViewController.swift | 215 + .../Example/Source/MasterViewController.swift | 101 + .../iOS Example.xcodeproj/project.pbxproj | 532 ++ .../contents.xcworkspacedata | 7 + .../xcschemes/iOS Example.xcscheme | 94 + Carthage/Checkouts/Alamofire/Gemfile | 5 + Carthage/Checkouts/Alamofire/Gemfile.lock | 133 + Carthage/Checkouts/Alamofire/LICENSE | 19 + Carthage/Checkouts/Alamofire/Package.swift | 48 + .../Alamofire/Package@swift-5.5.swift | 48 + .../Alamofire/Package@swift-5.6.swift | 48 + .../Alamofire/Package@swift-5.7.swift | 48 + .../Alamofire/Package@swift-5.8.swift | 48 + Carthage/Checkouts/Alamofire/README.md | 256 + .../Alamofire/Resources/AlamofireLogo.png | Bin 0 -> 18006 bytes .../Alamofire/Resources/MacStadiumLogo.png | Bin 0 -> 30509 bytes .../Checkouts/Alamofire/Source/AFError.swift | 874 ++ .../Alamofire/Source/Alamofire.swift | 40 + .../Alamofire/Source/AlamofireExtended.swift | 61 + .../Source/AuthenticationInterceptor.swift | 402 + .../Source/CachedResponseHandler.swift | 107 + .../Checkouts/Alamofire/Source/Combine.swift | 652 ++ .../Alamofire/Source/Concurrency.swift | 832 ++ .../Source/DispatchQueue+Alamofire.swift | 37 + .../Alamofire/Source/EventMonitor.swift | 907 ++ .../Alamofire/Source/HTTPHeaders.swift | 452 + .../Alamofire/Source/HTTPMethod.swift | 56 + .../Checkouts/Alamofire/Source/Info.plist | 24 + .../Alamofire/Source/MultipartFormData.swift | 601 ++ .../Alamofire/Source/MultipartUpload.swift | 89 + .../Source/NetworkReachabilityManager.swift | 292 + .../Alamofire/Source/Notifications.swift | 115 + .../Source/OperationQueue+Alamofire.swift | 49 + .../Alamofire/Source/ParameterEncoder.swift | 213 + .../Alamofire/Source/ParameterEncoding.swift | 346 + .../Alamofire/Source/Protected.swift | 168 + .../Alamofire/Source/RedirectHandler.swift | 111 + .../Checkouts/Alamofire/Source/Request.swift | 2066 +++++ .../Alamofire/Source/RequestCompression.swift | 153 + .../Alamofire/Source/RequestInterceptor.swift | 351 + .../Alamofire/Source/RequestTaskMap.swift | 149 + .../Checkouts/Alamofire/Source/Response.swift | 453 + .../Source/ResponseSerialization.swift | 1270 +++ .../Alamofire/Source/Result+Alamofire.swift | 120 + .../Alamofire/Source/RetryPolicy.swift | 430 + .../Source/ServerTrustEvaluation.swift | 772 ++ .../Checkouts/Alamofire/Source/Session.swift | 1264 +++ .../Alamofire/Source/SessionDelegate.swift | 355 + .../Source/StringEncoding+Alamofire.swift | 55 + ...URLConvertible+URLRequestConvertible.swift | 105 + .../Source/URLEncodedFormEncoder.swift | 1151 +++ .../Source/URLRequest+Alamofire.swift | 39 + .../URLSessionConfiguration+Alamofire.swift | 46 + .../Alamofire/Source/Validation.swift | 302 + .../Tests/AFError+AlamofireTests.swift | 402 + .../AuthenticationInterceptorTests.swift | 695 ++ .../Alamofire/Tests/AuthenticationTests.swift | 198 + .../Alamofire/Tests/BaseTestCase.swift | 94 + .../Tests/Bundle+AlamofireTests.swift | 38 + .../Alamofire/Tests/CacheTests.swift | 281 + .../Tests/CachedResponseHandlerTests.swift | 243 + .../Alamofire/Tests/CombineTests.swift | 1439 +++ .../Alamofire/Tests/ConcurrencyTests.swift | 802 ++ .../Alamofire/Tests/DataStreamTests.swift | 1181 +++ .../Alamofire/Tests/DownloadTests.swift | 1025 +++ .../Tests/FileManager+AlamofireTests.swift | 87 + .../Alamofire/Tests/HTTPHeadersTests.swift | 133 + Carthage/Checkouts/Alamofire/Tests/Info.plist | 24 + .../Tests/InternalRequestTests.swift | 77 + .../Alamofire/Tests/LeaksTests.swift | 69 + .../Tests/MultipartFormDataTests.swift | 989 ++ .../Tests/NSLoggingEventMonitor.swift | 222 + .../NetworkReachabilityManagerTests.swift | 303 + .../Tests/ParameterEncoderTests.swift | 1247 +++ .../Tests/ParameterEncodingTests.swift | 625 ++ .../Alamofire/Tests/ProtectedTests.swift | 266 + .../Tests/RedirectHandlerTests.swift | 242 + .../Tests/Request+AlamofireTests.swift | 40 + .../Tests/RequestInterceptorTests.swift | 704 ++ .../Tests/RequestModifierTests.swift | 196 + .../Alamofire/Tests/RequestTests.swift | 1451 +++ .../alamofire-org/alamofire-root-ca.cer | Bin 0 -> 988 bytes .../alamofire-org/alamofire-signing-ca1.cer | Bin 0 -> 1025 bytes .../alamofire-org/alamofire-signing-ca2.cer | Bin 0 -> 1025 bytes .../Certificates/alamofire-org/expired.cer | Bin 0 -> 1052 bytes .../missing-dns-name-and-uri.cer | Bin 0 -> 1015 bytes .../alamofire-org/multiple-dns-names.cer | Bin 0 -> 1081 bytes .../alamofire-org/signed-by-ca1.cer | Bin 0 -> 1058 bytes .../alamofire-org/signed-by-ca2.cer | Bin 0 -> 1058 bytes .../alamofire-org/test.alamofire.org.cer | Bin 0 -> 1063 bytes .../alamofire-org/valid-dns-name.cer | Bin 0 -> 1039 bytes .../Certificates/alamofire-org/valid-uri.cer | Bin 0 -> 1034 bytes .../alamofire-org/wildcard.alamofire.org.cer | Bin 0 -> 1054 bytes .../expired.badssl.com-intermediate-ca-1.cer | Bin 0 -> 1400 bytes .../expired.badssl.com-intermediate-ca-2.cer | Bin 0 -> 1548 bytes .../expired.badssl.com-leaf.cer | Bin 0 -> 1359 bytes .../expired.badssl.com-root-ca.cer | Bin 0 -> 1082 bytes .../selfSignedAndMalformedCerts/certDER.cer | Bin 0 -> 1016 bytes .../selfSignedAndMalformedCerts/certDER.crt | Bin 0 -> 1016 bytes .../selfSignedAndMalformedCerts/certDER.der | Bin 0 -> 1016 bytes .../selfSignedAndMalformedCerts/certPEM.cer | 24 + .../selfSignedAndMalformedCerts/certPEM.crt | 24 + .../selfSignedAndMalformedCerts/keyDER.der | Bin 0 -> 1192 bytes .../randomGibberish.crt | Bin 0 -> 4096 bytes .../Tests/Resources/Images/rainbow.jpg | Bin 0 -> 16104 bytes .../Tests/Resources/Images/unicorn.png | Bin 0 -> 41646 bytes .../Resources/Responses/JSON/empty_data.json | 0 .../Responses/JSON/invalid_data.json | 6 + .../Resources/Responses/JSON/valid_data.json | 4 + .../Responses/String/empty_string.txt | 0 .../Responses/String/utf32_string.txt | Bin 0 -> 48 bytes .../Responses/String/utf8_string.txt | 1 + .../Tests/ResponseSerializationTests.swift | 1410 +++ .../Alamofire/Tests/ResponseTests.swift | 652 ++ .../Tests/Result+AlamofireTests.swift | 46 + .../Alamofire/Tests/RetryPolicyTests.swift | 448 + .../Tests/ServerTrustEvaluatorTests.swift | 1448 +++ .../Tests/SessionDelegateTests.swift | 222 + .../Alamofire/Tests/SessionTests.swift | 1795 ++++ .../Alamofire/Tests/TLSEvaluationTests.swift | 557 ++ .../Tests/Test Plans/iOS-NoTS.xctestplan | 30 + .../Tests/Test Plans/iOS-Old.xctestplan | 30 + .../Alamofire/Tests/Test Plans/iOS.xctestplan | 24 + .../Tests/Test Plans/macOS-NoTS.xctestplan | 30 + .../Tests/Test Plans/macOS.xctestplan | 24 + .../Tests/Test Plans/tvOS-NoTS.xctestplan | 30 + .../Tests/Test Plans/tvOS-Old.xctestplan | 34 + .../Tests/Test Plans/tvOS.xctestplan | 24 + .../Tests/Test Plans/visionOS.xctestplan | 24 + .../Tests/Test Plans/watchOS-NoTS.xctestplan | 30 + .../Tests/Test Plans/watchOS.xctestplan | 25 + .../Alamofire/Tests/TestHelpers.swift | 417 + .../Alamofire/Tests/URLProtocolTests.swift | 160 + .../Alamofire/Tests/UploadTests.swift | 872 ++ .../Alamofire/Tests/ValidationTests.swift | 965 ++ .../Checkouts/Alamofire/docs/Classes.html | 1699 ++++ .../Alamofire/docs/Classes/Adapter.html | 677 ++ .../docs/Classes/AlamofireNotifications.html | 787 ++ .../Classes/AuthenticationInterceptor.html | 866 ++ .../RefreshWindow.html | 697 ++ .../docs/Classes/ClosureEventMonitor.html | 2860 ++++++ .../docs/Classes/CompositeEventMonitor.html | 1780 ++++ .../docs/Classes/CompositeTrustEvaluator.html | 652 ++ .../Classes/ConnectionLostRetryPolicy.html | 670 ++ .../Alamofire/docs/Classes/DataRequest.html | 2857 ++++++ .../docs/Classes/DataResponseSerializer.html | 757 ++ .../docs/Classes/DataStreamRequest.html | 1998 ++++ .../DataStreamRequest/CancellationToken.html | 606 ++ .../Classes/DataStreamRequest/Completion.html | 687 ++ .../docs/Classes/DataStreamRequest/Event.html | 636 ++ .../Classes/DataStreamRequest/Stream.html | 782 ++ .../Classes/DecodableResponseSerializer.html | 800 ++ .../docs/Classes/DefaultTrustEvaluator.html | 653 ++ .../docs/Classes/DisabledEvaluator.html | 553 ++ .../docs/Classes/DisabledTrustEvaluator.html | 640 ++ .../docs/Classes/DownloadRequest.html | 3278 +++++++ .../Classes/DownloadRequest/Downloadable.html | 633 ++ .../docs/Classes/DownloadRequest/Options.html | 686 ++ .../Alamofire/docs/Classes/Interceptor.html | 900 ++ .../docs/Classes/JSONParameterEncoder.html | 763 ++ .../docs/Classes/JSONResponseSerializer.html | 798 ++ .../docs/Classes/MultipartFormData.html | 1340 +++ .../docs/Classes/MultipartUpload.html | 525 ++ .../Classes/NetworkReachabilityManager.html | 1052 +++ .../ConnectionType.html | 490 + .../NetworkReachabilityStatus.html | 689 ++ .../ConnectionType.html | 633 ++ .../PinnedCertificatesTrustEvaluator.html | 700 ++ .../Classes/PublicKeysTrustEvaluator.html | 691 ++ .../Alamofire/docs/Classes/Request.html | 3157 +++++++ .../Classes/Request/ResponseDisposition.html | 633 ++ .../Alamofire/docs/Classes/Request/State.html | 720 ++ .../Alamofire/docs/Classes/Retrier.html | 654 ++ .../Alamofire/docs/Classes/RetryPolicy.html | 1111 +++ .../Classes/RevocationTrustEvaluator.html | 718 ++ .../RevocationTrustEvaluator/Options.html | 817 ++ .../docs/Classes/ServerTrustManager.html | 756 ++ .../Alamofire/docs/Classes/Session.html | 4079 +++++++++ .../docs/Classes/SessionDelegate.html | 1086 +++ .../Classes/StringResponseSerializer.html | 798 ++ .../docs/Classes/URLEncodedFormEncoder.html | 1405 +++ .../URLEncodedFormEncoder/ArrayEncoding.html | 687 ++ .../URLEncodedFormEncoder/BoolEncoding.html | 633 ++ .../URLEncodedFormEncoder/DataEncoding.html | 660 ++ .../URLEncodedFormEncoder/DateEncoding.html | 741 ++ .../Classes/URLEncodedFormEncoder/Error.html | 606 ++ .../URLEncodedFormEncoder/KeyEncoding.html | 798 ++ .../KeyPathEncoding.html | 684 ++ .../URLEncodedFormEncoder/NilEncoding.html | 706 ++ .../URLEncodedFormEncoder/SpaceEncoding.html | 633 ++ .../URLEncodedFormParameterEncoder.html | 779 ++ .../Destination.html | 661 ++ .../Alamofire/docs/Classes/UploadRequest.html | 742 ++ .../Classes/UploadRequest/Uploadable.html | 701 ++ Carthage/Checkouts/Alamofire/docs/Enums.html | 660 ++ .../Checkouts/Alamofire/docs/Enums/AF.html | 2419 +++++ .../Alamofire/docs/Enums/AFError.html | 2046 +++++ .../MultipartEncodingFailureReason.html | 930 ++ .../ParameterEncoderFailureReason.html | 661 ++ .../RequiredComponent.html | 633 ++ .../ParameterEncodingFailureReason.html | 660 ++ .../ResponseSerializationFailureReason.html | 795 ++ .../ResponseValidationFailureReason.html | 742 ++ .../AFError/ServerTrustFailureReason.html | 958 ++ .../ServerTrustFailureReason/Output.html | 687 ++ .../URLRequestValidationFailureReason.html | 606 ++ .../AFError/UnexpectedInputStreamLength.html | 634 ++ .../docs/Enums/AuthenticationError.html | 635 ++ .../Alamofire/docs/Enums/HTTPMethod.html | 681 ++ .../Alamofire/docs/Enums/Result.html | 1242 +++ .../Alamofire/docs/Enums/RetryResult.html | 687 ++ .../Checkouts/Alamofire/docs/Extensions.html | 1098 +++ .../Alamofire/docs/Extensions/Array.html | 650 ++ .../Alamofire/docs/Extensions/Bundle.html | 494 + .../docs/Extensions/CharacterSet.html | 616 ++ .../Alamofire/docs/Extensions/Collection.html | 530 ++ .../docs/Extensions/DispatchQueue.html | 552 ++ .../Alamofire/docs/Extensions/Error.html | 632 ++ .../docs/Extensions/HTTPURLResponse.html | 605 ++ .../docs/Extensions/Notification.html | 605 ++ .../docs/Extensions/NotificationCenter.html | 552 ++ .../docs/Extensions/OperationQueue.html | 593 ++ .../Alamofire/docs/Extensions/Result.html | 722 ++ .../SCNetworkReachabilityFlags.html | 683 ++ .../Alamofire/docs/Extensions/SecTrust.html | 683 ++ .../Alamofire/docs/Extensions/String.html | 614 ++ .../Alamofire/docs/Extensions/URL.html | 605 ++ .../docs/Extensions/URLComponents.html | 614 ++ .../Alamofire/docs/Extensions/URLRequest.html | 762 ++ .../Extensions/URLSessionConfiguration.html | 606 ++ .../Checkouts/Alamofire/docs/Functions.html | 494 + .../Alamofire/docs/Global Variables.html | 599 ++ .../Checkouts/Alamofire/docs/Protocols.html | 1337 +++ .../docs/Protocols/AlamofireExtended.html | 676 ++ .../Protocols/AuthenticationCredential.html | 616 ++ .../docs/Protocols/Authenticator.html | 929 ++ .../docs/Protocols/CachedResponseHandler.html | 785 ++ .../Alamofire/docs/Protocols/DataDecoder.html | 646 ++ .../docs/Protocols/DataPreprocessor.html | 711 ++ .../DataResponseSerializerProtocol.html | 697 ++ .../docs/Protocols/DataStreamSerializer.html | 832 ++ .../DownloadResponseSerializerProtocol.html | 740 ++ .../docs/Protocols/EmptyResponse.html | 610 ++ .../docs/Protocols/EventMonitor.html | 2317 +++++ .../docs/Protocols/ParameterEncoder.html | 852 ++ .../docs/Protocols/ParameterEncoding.html | 646 ++ .../docs/Protocols/RedirectHandler.html | 798 ++ .../docs/Protocols/RequestAdapter.html | 792 ++ .../docs/Protocols/RequestDelegate.html | 807 ++ .../docs/Protocols/RequestInterceptor.html | 1277 +++ .../docs/Protocols/RequestRetrier.html | 732 ++ .../docs/Protocols/ResponseSerializer.html | 1331 +++ .../docs/Protocols/ServerTrustEvaluating.html | 1100 +++ .../docs/Protocols/SessionStateProvider.html | 630 ++ .../docs/Protocols/URLConvertible.html | 616 ++ .../docs/Protocols/URLRequestConvertible.html | 645 ++ .../docs/Protocols/UploadableConvertible.html | 615 ++ .../Checkouts/Alamofire/docs/Structs.html | 1468 +++ .../docs/Structs/AlamofireExtension.html | 1688 ++++ .../Alamofire/docs/Structs/DataResponse.html | 1198 +++ .../docs/Structs/DataResponsePublisher.html | 905 ++ .../docs/Structs/DataStreamPublisher.html | 792 ++ .../docs/Structs/DataStreamTask.html | 969 ++ .../Alamofire/docs/Structs/DataTask.html | 751 ++ .../Structs/DecodableStreamSerializer.html | 718 ++ .../Structs/DeflateRequestCompressor.html | 786 ++ .../DuplicateHeaderBehavior.html | 660 ++ .../docs/Structs/DownloadResponse.html | 1237 +++ .../Structs/DownloadResponsePublisher.html | 906 ++ .../Alamofire/docs/Structs/DownloadTask.html | 751 ++ .../Alamofire/docs/Structs/Empty.html | 646 ++ .../docs/Structs/GoogleXSSIPreprocessor.html | 632 ++ .../Alamofire/docs/Structs/HTTPHeader.html | 1410 +++ .../Alamofire/docs/Structs/HTTPHeaders.html | 1353 +++ .../Alamofire/docs/Structs/HTTPMethod.html | 904 ++ .../Alamofire/docs/Structs/JSONEncoding.html | 867 ++ .../docs/Structs/JSONEncoding/Error.html | 633 ++ .../docs/Structs/PassthroughPreprocessor.html | 632 ++ .../Structs/PassthroughStreamSerializer.html | 632 ++ .../Alamofire/docs/Structs/Redirector.html | 764 ++ .../docs/Structs/Redirector/Behavior.html | 660 ++ .../docs/Structs/RequestAdapterState.html | 633 ++ .../docs/Structs/ResponseCacher.html | 764 ++ .../docs/Structs/ResponseCacher/Behavior.html | 660 ++ .../Alamofire/docs/Structs/StreamOf.html | 687 ++ .../docs/Structs/StreamOf/Iterator.html | 608 ++ .../docs/Structs/StringStreamSerializer.html | 632 ++ .../Alamofire/docs/Structs/URLEncoding.html | 1098 +++ .../Structs/URLEncoding/ArrayEncoding.html | 687 ++ .../Structs/URLEncoding/BoolEncoding.html | 633 ++ .../docs/Structs/URLEncoding/Destination.html | 662 ++ .../docs/Structs/URLResponseSerializer.html | 636 ++ .../Checkouts/Alamofire/docs/Typealiases.html | 783 ++ Carthage/Checkouts/Alamofire/docs/badge.svg | 28 + .../Alamofire/docs/css/highlight.css | 202 + .../Checkouts/Alamofire/docs/css/jazzy.css | 404 + .../Alamofire.docset/Contents/Info.plist | 22 + .../Contents/Resources/Documents/Classes.html | 1699 ++++ .../Resources/Documents/Classes/Adapter.html | 677 ++ .../Classes/AlamofireNotifications.html | 787 ++ .../Classes/AuthenticationInterceptor.html | 866 ++ .../RefreshWindow.html | 697 ++ .../Classes/ClosureEventMonitor.html | 2860 ++++++ .../Classes/CompositeEventMonitor.html | 1780 ++++ .../Classes/CompositeTrustEvaluator.html | 652 ++ .../Classes/ConnectionLostRetryPolicy.html | 670 ++ .../Documents/Classes/DataRequest.html | 2857 ++++++ .../Classes/DataResponseSerializer.html | 757 ++ .../Documents/Classes/DataStreamRequest.html | 1998 ++++ .../DataStreamRequest/CancellationToken.html | 606 ++ .../Classes/DataStreamRequest/Completion.html | 687 ++ .../Classes/DataStreamRequest/Event.html | 636 ++ .../Classes/DataStreamRequest/Stream.html | 782 ++ .../Classes/DecodableResponseSerializer.html | 800 ++ .../Classes/DefaultTrustEvaluator.html | 653 ++ .../Documents/Classes/DisabledEvaluator.html | 553 ++ .../Classes/DisabledTrustEvaluator.html | 640 ++ .../Documents/Classes/DownloadRequest.html | 3278 +++++++ .../Classes/DownloadRequest/Downloadable.html | 633 ++ .../Classes/DownloadRequest/Options.html | 686 ++ .../Documents/Classes/Interceptor.html | 900 ++ .../Classes/JSONParameterEncoder.html | 763 ++ .../Classes/JSONResponseSerializer.html | 798 ++ .../Documents/Classes/MultipartFormData.html | 1340 +++ .../Documents/Classes/MultipartUpload.html | 525 ++ .../Classes/NetworkReachabilityManager.html | 1052 +++ .../ConnectionType.html | 490 + .../NetworkReachabilityStatus.html | 689 ++ .../ConnectionType.html | 633 ++ .../PinnedCertificatesTrustEvaluator.html | 700 ++ .../Classes/PublicKeysTrustEvaluator.html | 691 ++ .../Resources/Documents/Classes/Request.html | 3157 +++++++ .../Classes/Request/ResponseDisposition.html | 633 ++ .../Documents/Classes/Request/State.html | 720 ++ .../Resources/Documents/Classes/Retrier.html | 654 ++ .../Documents/Classes/RetryPolicy.html | 1111 +++ .../Classes/RevocationTrustEvaluator.html | 718 ++ .../RevocationTrustEvaluator/Options.html | 817 ++ .../Documents/Classes/ServerTrustManager.html | 756 ++ .../Resources/Documents/Classes/Session.html | 4079 +++++++++ .../Documents/Classes/SessionDelegate.html | 1086 +++ .../Classes/StringResponseSerializer.html | 798 ++ .../Classes/URLEncodedFormEncoder.html | 1405 +++ .../URLEncodedFormEncoder/ArrayEncoding.html | 687 ++ .../URLEncodedFormEncoder/BoolEncoding.html | 633 ++ .../URLEncodedFormEncoder/DataEncoding.html | 660 ++ .../URLEncodedFormEncoder/DateEncoding.html | 741 ++ .../Classes/URLEncodedFormEncoder/Error.html | 606 ++ .../URLEncodedFormEncoder/KeyEncoding.html | 798 ++ .../KeyPathEncoding.html | 684 ++ .../URLEncodedFormEncoder/NilEncoding.html | 706 ++ .../URLEncodedFormEncoder/SpaceEncoding.html | 633 ++ .../URLEncodedFormParameterEncoder.html | 779 ++ .../Destination.html | 661 ++ .../Documents/Classes/UploadRequest.html | 742 ++ .../Classes/UploadRequest/Uploadable.html | 701 ++ .../Contents/Resources/Documents/Enums.html | 660 ++ .../Resources/Documents/Enums/AF.html | 2419 +++++ .../Resources/Documents/Enums/AFError.html | 2046 +++++ .../MultipartEncodingFailureReason.html | 930 ++ .../ParameterEncoderFailureReason.html | 661 ++ .../RequiredComponent.html | 633 ++ .../ParameterEncodingFailureReason.html | 660 ++ .../ResponseSerializationFailureReason.html | 795 ++ .../ResponseValidationFailureReason.html | 742 ++ .../AFError/ServerTrustFailureReason.html | 958 ++ .../ServerTrustFailureReason/Output.html | 687 ++ .../URLRequestValidationFailureReason.html | 606 ++ .../AFError/UnexpectedInputStreamLength.html | 634 ++ .../Documents/Enums/AuthenticationError.html | 635 ++ .../Resources/Documents/Enums/HTTPMethod.html | 681 ++ .../Resources/Documents/Enums/Result.html | 1242 +++ .../Documents/Enums/RetryResult.html | 687 ++ .../Resources/Documents/Extensions.html | 1098 +++ .../Resources/Documents/Extensions/Array.html | 650 ++ .../Documents/Extensions/Bundle.html | 494 + .../Documents/Extensions/CharacterSet.html | 616 ++ .../Documents/Extensions/Collection.html | 530 ++ .../Documents/Extensions/DispatchQueue.html | 552 ++ .../Resources/Documents/Extensions/Error.html | 632 ++ .../Documents/Extensions/HTTPURLResponse.html | 605 ++ .../Documents/Extensions/Notification.html | 605 ++ .../Extensions/NotificationCenter.html | 552 ++ .../Documents/Extensions/OperationQueue.html | 593 ++ .../Documents/Extensions/Result.html | 722 ++ .../SCNetworkReachabilityFlags.html | 683 ++ .../Documents/Extensions/SecTrust.html | 683 ++ .../Documents/Extensions/String.html | 614 ++ .../Resources/Documents/Extensions/URL.html | 605 ++ .../Documents/Extensions/URLComponents.html | 614 ++ .../Documents/Extensions/URLRequest.html | 762 ++ .../Extensions/URLSessionConfiguration.html | 606 ++ .../Resources/Documents/Functions.html | 494 + .../Resources/Documents/Global Variables.html | 599 ++ .../Resources/Documents/Protocols.html | 1337 +++ .../Protocols/AlamofireExtended.html | 676 ++ .../Protocols/AuthenticationCredential.html | 616 ++ .../Documents/Protocols/Authenticator.html | 929 ++ .../Protocols/CachedResponseHandler.html | 785 ++ .../Documents/Protocols/DataDecoder.html | 646 ++ .../Documents/Protocols/DataPreprocessor.html | 711 ++ .../DataResponseSerializerProtocol.html | 697 ++ .../Protocols/DataStreamSerializer.html | 832 ++ .../DownloadResponseSerializerProtocol.html | 740 ++ .../Documents/Protocols/EmptyResponse.html | 610 ++ .../Documents/Protocols/EventMonitor.html | 2317 +++++ .../Documents/Protocols/ParameterEncoder.html | 852 ++ .../Protocols/ParameterEncoding.html | 646 ++ .../Documents/Protocols/RedirectHandler.html | 798 ++ .../Documents/Protocols/RequestAdapter.html | 792 ++ .../Documents/Protocols/RequestDelegate.html | 807 ++ .../Protocols/RequestInterceptor.html | 1277 +++ .../Documents/Protocols/RequestRetrier.html | 732 ++ .../Protocols/ResponseSerializer.html | 1331 +++ .../Protocols/ServerTrustEvaluating.html | 1100 +++ .../Protocols/SessionStateProvider.html | 630 ++ .../Documents/Protocols/URLConvertible.html | 616 ++ .../Protocols/URLRequestConvertible.html | 645 ++ .../Protocols/UploadableConvertible.html | 615 ++ .../Contents/Resources/Documents/Structs.html | 1468 +++ .../Documents/Structs/AlamofireExtension.html | 1688 ++++ .../Documents/Structs/DataResponse.html | 1198 +++ .../Structs/DataResponsePublisher.html | 905 ++ .../Structs/DataStreamPublisher.html | 792 ++ .../Documents/Structs/DataStreamTask.html | 969 ++ .../Resources/Documents/Structs/DataTask.html | 751 ++ .../Structs/DecodableStreamSerializer.html | 718 ++ .../Structs/DeflateRequestCompressor.html | 786 ++ .../DuplicateHeaderBehavior.html | 660 ++ .../Documents/Structs/DownloadResponse.html | 1237 +++ .../Structs/DownloadResponsePublisher.html | 906 ++ .../Documents/Structs/DownloadTask.html | 751 ++ .../Resources/Documents/Structs/Empty.html | 646 ++ .../Structs/GoogleXSSIPreprocessor.html | 632 ++ .../Documents/Structs/HTTPHeader.html | 1410 +++ .../Documents/Structs/HTTPHeaders.html | 1353 +++ .../Documents/Structs/HTTPMethod.html | 904 ++ .../Documents/Structs/JSONEncoding.html | 867 ++ .../Documents/Structs/JSONEncoding/Error.html | 633 ++ .../Structs/PassthroughPreprocessor.html | 632 ++ .../Structs/PassthroughStreamSerializer.html | 632 ++ .../Documents/Structs/Redirector.html | 764 ++ .../Structs/Redirector/Behavior.html | 660 ++ .../Structs/RequestAdapterState.html | 633 ++ .../Documents/Structs/ResponseCacher.html | 764 ++ .../Structs/ResponseCacher/Behavior.html | 660 ++ .../Resources/Documents/Structs/StreamOf.html | 687 ++ .../Documents/Structs/StreamOf/Iterator.html | 608 ++ .../Structs/StringStreamSerializer.html | 632 ++ .../Documents/Structs/URLEncoding.html | 1098 +++ .../Structs/URLEncoding/ArrayEncoding.html | 687 ++ .../Structs/URLEncoding/BoolEncoding.html | 633 ++ .../Structs/URLEncoding/Destination.html | 662 ++ .../Structs/URLResponseSerializer.html | 636 ++ .../Resources/Documents/Typealiases.html | 783 ++ .../Contents/Resources/Documents/badge.svg | 28 + .../Resources/Documents/css/highlight.css | 202 + .../Resources/Documents/css/jazzy.css | 404 + .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 863 ++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 ++++ .../Contents/Resources/Documents/search.json | 1 + .../Resources/Documents/undocumented.json | 264 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 417792 bytes .../Alamofire/docs/docsets/Alamofire.tgz | Bin 0 -> 834016 bytes .../Alamofire/docs/docsets/Alamofire.xml | 1 + .../Checkouts/Alamofire/docs/img/carat.png | Bin 0 -> 274 bytes .../Checkouts/Alamofire/docs/img/dash.png | Bin 0 -> 1338 bytes Carthage/Checkouts/Alamofire/docs/img/gh.png | Bin 0 -> 1571 bytes .../Checkouts/Alamofire/docs/img/spinner.gif | Bin 0 -> 1849 bytes Carthage/Checkouts/Alamofire/docs/index.html | 863 ++ Carthage/Checkouts/Alamofire/docs/js/jazzy.js | 74 + .../Alamofire/docs/js/jazzy.search.js | 74 + .../Checkouts/Alamofire/docs/js/jquery.min.js | 2 + .../Checkouts/Alamofire/docs/js/lunr.min.js | 6 + .../Alamofire/docs/js/typeahead.jquery.js | 1694 ++++ Carthage/Checkouts/Alamofire/docs/search.json | 1 + .../Alamofire/docs/undocumented.json | 264 + .../AppIcon.appiconset/Contents.json | 81 + .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/Interface.storyboard | 16 + .../watchOS Example WatchKit App/Info.plist | 31 + .../Circular.imageset/Contents.json | 28 + .../Contents.json | 48 + .../Extra Large.imageset/Contents.json | 28 + .../Graphic Bezel.imageset/Contents.json | 28 + .../Graphic Circular.imageset/Contents.json | 28 + .../Graphic Corner.imageset/Contents.json | 28 + .../Contents.json | 28 + .../Modular.imageset/Contents.json | 28 + .../Utilitarian.imageset/Contents.json | 28 + .../Assets.xcassets/Contents.json | 6 + .../ContentView.swift | 46 + .../ExtensionDelegate.swift | 57 + .../HostingController.swift | 35 + .../Info.plist | 38 + .../Networking.swift | 57 + .../Preview Assets.xcassets/Contents.json | 6 + .../watchOS Example.xcodeproj/project.pbxproj | 597 ++ .../watchOS Example WatchKit App.xcscheme | 101 + Carthage/Checkouts/BigInt/.codecov.yml | 14 + .../BigInt/.github/workflows/jazzy.yml | 29 + .../BigInt/.github/workflows/swift.yml | 47 + Carthage/Checkouts/BigInt/.gitignore | 6 + Carthage/Checkouts/BigInt/.jazzy.yml | 8 + Carthage/Checkouts/BigInt/.swift-version | 1 + Carthage/Checkouts/BigInt/BigInt.podspec | 17 + .../BigInt/BigInt.xcodeproj/project.pbxproj | 1301 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/BigInt.xcscmblueprint | 30 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + ...3714311D-5102-4569-B213-8DC87DC6C2F3.plist | 92 + ...3B06D4DF-FC61-43AE-8115-CA5059B5AB1B.plist | 92 + ...E75E9014-DB8C-4424-B05B-83660CCFB7ED.plist | 122 + .../Info.plist | 57 + .../xcschemes/BigInt Benchmark.xcscheme | 53 + .../xcschemes/BigInt-iOS.xcscheme | 96 + .../xcschemes/BigInt-macOS.xcscheme | 96 + .../xcschemes/BigInt-tvOS.xcscheme | 96 + .../xcschemes/BigInt-watchOS.xcscheme | 77 + .../contents.xcworkspacedata | 7 + .../xcshareddata/BigInt.xcscmblueprint | 30 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Carthage/Checkouts/BigInt/CHANGELOG.md | 232 + .../BigInt/Demo.playground/Contents.o | Bin 0 -> 12432 bytes .../Contents.swift | 28 + .../timeline.xctimeline | 28 + .../Contents.swift | 30 + .../timeline.xctimeline | 66 + .../Contents.swift | 25 + .../timeline.xctimeline | 41 + .../Contents.swift | 31 + .../timeline.xctimeline | 81 + .../Contents.swift | 57 + .../timeline.xctimeline | 142 + .../Demo.playground/contents.xcplayground | 10 + Carthage/Checkouts/BigInt/LICENSE.md | 20 + Carthage/Checkouts/BigInt/Package.swift | 21 + Carthage/Checkouts/BigInt/README.md | 431 + .../Checkouts/BigInt/Sources/Addition.swift | 126 + .../Checkouts/BigInt/Sources/BigInt.swift | 74 + .../Checkouts/BigInt/Sources/BigUInt.swift | 386 + .../BigInt/Sources/Bitwise Ops.swift | 121 + .../Checkouts/BigInt/Sources/Codable.swift | 155 + .../Checkouts/BigInt/Sources/Comparable.swift | 63 + .../BigInt/Sources/Data Conversion.swift | 179 + .../Checkouts/BigInt/Sources/Division.swift | 375 + .../BigInt/Sources/Exponentiation.swift | 119 + .../Sources/Floating Point Conversion.swift | 73 + Carthage/Checkouts/BigInt/Sources/GCD.swift | 80 + .../Checkouts/BigInt/Sources/Hashable.swift | 26 + Carthage/Checkouts/BigInt/Sources/Info.plist | 28 + .../BigInt/Sources/Integer Conversion.swift | 89 + .../BigInt/Sources/Multiplication.swift | 165 + .../Checkouts/BigInt/Sources/Prime Test.swift | 153 + .../Checkouts/BigInt/Sources/Random.swift | 101 + .../Checkouts/BigInt/Sources/Shifts.swift | 211 + .../BigInt/Sources/Square Root.swift | 41 + .../Checkouts/BigInt/Sources/Strideable.swift | 38 + .../BigInt/Sources/String Conversion.swift | 236 + .../BigInt/Sources/Subtraction.swift | 169 + .../BigInt/Sources/Words and Bits.swift | 202 + .../Tests/BigIntTests/BigIntTests.swift | 638 ++ .../Tests/BigIntTests/BigUIntTests.swift | 1481 +++ .../BigInt/Tests/BigIntTests/Info.plist | 24 + .../Tests/BigIntTests/ProfileTests.swift | 228 + .../BigInt/Tests/BigIntTests/Tools.swift | 48 + .../BigInt/Tests/BigIntTests/WordTests.swift | 138 + .../Checkouts/BigInt/docs/Extensions.html | 173 + .../docs/Extensions/BinaryFloatingPoint.html | 194 + .../BigInt/docs/Extensions/String.html | 244 + Carthage/Checkouts/BigInt/docs/Structs.html | 229 + .../Checkouts/BigInt/docs/Structs/BigInt.html | 2546 ++++++ .../BigInt/docs/Structs/BigInt/Sign.html | 189 + .../BigInt/docs/Structs/BigInt/Words.html | 302 + .../BigInt/docs/Structs/BigUInt.html | 3220 +++++++ .../BigInt/docs/Structs/BigUInt/Words.html | 215 + Carthage/Checkouts/BigInt/docs/badge.svg | 28 + .../Checkouts/BigInt/docs/css/highlight.css | 200 + Carthage/Checkouts/BigInt/docs/css/jazzy.css | 395 + .../docsets/BigInt.docset/Contents/Info.plist | 22 + .../Resources/Documents/Extensions.html | 173 + .../Extensions/BinaryFloatingPoint.html | 194 + .../Documents/Extensions/String.html | 244 + .../Contents/Resources/Documents/Structs.html | 229 + .../Resources/Documents/Structs/BigInt.html | 2546 ++++++ .../Documents/Structs/BigInt/Sign.html | 189 + .../Documents/Structs/BigInt/Words.html | 302 + .../Resources/Documents/Structs/BigUInt.html | 3220 +++++++ .../Documents/Structs/BigUInt/Words.html | 215 + .../Resources/Documents/css/highlight.css | 200 + .../Resources/Documents/css/jazzy.css | 395 + .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Contents/Resources/Documents/img/gh.png | Bin 0 -> 1571 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 493 + .../Contents/Resources/Documents/js/jazzy.js | 70 + .../Resources/Documents/js/jazzy.search.js | 70 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 ++++ .../Contents/Resources/Documents/search.json | 1 + .../Contents/Resources/docSet.dsidx | Bin 0 -> 45056 bytes .../Checkouts/BigInt/docs/docsets/BigInt.tgz | Bin 0 -> 111706 bytes .../Checkouts/BigInt/docs/docsets/BigInt.xml | 1 + Carthage/Checkouts/BigInt/docs/img/carat.png | Bin 0 -> 274 bytes Carthage/Checkouts/BigInt/docs/img/dash.png | Bin 0 -> 1338 bytes Carthage/Checkouts/BigInt/docs/img/gh.png | Bin 0 -> 1571 bytes .../Checkouts/BigInt/docs/img/spinner.gif | Bin 0 -> 1849 bytes Carthage/Checkouts/BigInt/docs/index.html | 493 + Carthage/Checkouts/BigInt/docs/js/jazzy.js | 70 + .../Checkouts/BigInt/docs/js/jazzy.search.js | 70 + .../Checkouts/BigInt/docs/js/jquery.min.js | 2 + Carthage/Checkouts/BigInt/docs/js/lunr.min.js | 6 + .../BigInt/docs/js/typeahead.jquery.js | 1694 ++++ Carthage/Checkouts/BigInt/docs/search.json | 1 + .../Checkouts/BigInt/docs/undocumented.json | 229 + .../Checkouts/BigInt/images/BigInt.sketch | Bin 0 -> 65536 bytes Carthage/Checkouts/BigInt/images/banner.png | Bin 0 -> 97499 bytes Carthage/Checkouts/BigInt/version.xcconfig | 13 + .../Checkouts/CryptoSwift/.github/CODEOWNERS | 1 + .../Checkouts/CryptoSwift/.github/FUNDING.yml | 1 + .../.github/ISSUE_TEMPLATE/bug_report.md | 12 + .../.github/PULL_REQUEST_TEMPLATE.md | 9 + .../CryptoSwift/.github/workflows/linux.yml | 21 + .../CryptoSwift/.github/workflows/macos.yml | 26 + Carthage/Checkouts/CryptoSwift/.gitignore | 27 + Carthage/Checkouts/CryptoSwift/.mailmap | 6 + Carthage/Checkouts/CryptoSwift/.spi.yml | 4 + Carthage/Checkouts/CryptoSwift/.swiftformat | 36 + Carthage/Checkouts/CryptoSwift/CHANGELOG | 348 + Carthage/Checkouts/CryptoSwift/CNAME | 1 + .../Checkouts/CryptoSwift/CODE_OF_CONDUCT.md | 46 + .../Checkouts/CryptoSwift/CONTRIBUTING.md | 27 + .../Checkouts/CryptoSwift/CONTRIBUTORS.txt | 120 + .../CryptoSwift-TestHostApp/AppDelegate.swift | 49 + .../Default-568h@2x.png | Bin 0 -> 18594 bytes .../CryptoSwift-TestHostApp/Info.plist | 43 + .../Checkouts/CryptoSwift/CryptoSwift.podspec | 19 + .../CryptoSwift.xcodeproj/project.pbxproj | 1368 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/CryptoSwift.xcscmblueprint | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/IDETemplateMacros.plist | 1 + .../CryptoSwift-TestHostApp.xcscheme | 87 + .../xcschemes/CryptoSwift.xcscheme | 140 + .../xcshareddata/xcschemes/Tests.xcscheme | 52 + .../xcschemes/TestsPerformance-Mac.xcscheme | 52 + .../xcschemes/TestsPerformance-iOS.xcscheme | 52 + .../CryptoSwift/IDETemplateMacros.plist | 20 + Carthage/Checkouts/CryptoSwift/Info.plist | 26 + Carthage/Checkouts/CryptoSwift/LICENSE | 11 + Carthage/Checkouts/CryptoSwift/Makefile | 9 + Carthage/Checkouts/CryptoSwift/Package.swift | 29 + Carthage/Checkouts/CryptoSwift/README.md | 677 ++ .../CryptoSwift/Sources/CryptoSwift.h | 15 + .../Sources/CryptoSwift/AEAD/AEAD.swift | 40 + .../AEAD/AEADChaCha20Poly1305.swift | 59 + .../Sources/CryptoSwift/AES.Cryptors.swift | 39 + .../CryptoSwift/Sources/CryptoSwift/AES.swift | 556 ++ .../Sources/CryptoSwift/ASN1/ASN1.swift | 87 + .../CryptoSwift/ASN1/ASN1Decoder.swift | 107 + .../CryptoSwift/ASN1/ASN1Encoder.swift | 69 + .../CryptoSwift/ASN1/ASN1Scanner.swift | 123 + .../Sources/CryptoSwift/Array+Extension.swift | 155 + .../Sources/CryptoSwift/Authenticator.swift | 20 + .../CryptoSwift/BatchedCollection.swift | 81 + .../CryptoSwift/Sources/CryptoSwift/Bit.swift | 26 + .../Sources/CryptoSwift/BlockCipher.swift | 18 + .../Sources/CryptoSwift/BlockDecryptor.swift | 98 + .../Sources/CryptoSwift/BlockEncryptor.swift | 62 + .../CryptoSwift/BlockMode/BlockMode.swift | 26 + .../BlockMode/BlockModeOptions.swift | 34 + .../Sources/CryptoSwift/BlockMode/CBC.swift | 76 + .../Sources/CryptoSwift/BlockMode/CCM.swift | 367 + .../Sources/CryptoSwift/BlockMode/CFB.swift | 102 + .../Sources/CryptoSwift/BlockMode/CTR.swift | 138 + .../BlockMode/CipherModeWorker.swift | 64 + .../Sources/CryptoSwift/BlockMode/ECB.swift | 53 + .../Sources/CryptoSwift/BlockMode/GCM.swift | 374 + .../Sources/CryptoSwift/BlockMode/OCB.swift | 398 + .../Sources/CryptoSwift/BlockMode/OFB.swift | 73 + .../Sources/CryptoSwift/BlockMode/PCBC.swift | 74 + .../Sources/CryptoSwift/Blowfish.swift | 545 ++ .../Sources/CryptoSwift/CBCMAC.swift | 30 + .../Sources/CryptoSwift/CMAC.swift | 106 + .../CryptoSwift/CS_BigInt/Addition.swift | 126 + .../CryptoSwift/CS_BigInt/BigInt.swift | 78 + .../CryptoSwift/CS_BigInt/BigUInt.swift | 389 + .../CryptoSwift/CS_BigInt/Bitwise Ops.swift | 121 + .../Sources/CryptoSwift/CS_BigInt/CS.swift | 24 + .../CryptoSwift/CS_BigInt/Codable.swift | 157 + .../CryptoSwift/CS_BigInt/Comparable.swift | 63 + .../CS_BigInt/Data Conversion.swift | 179 + .../CryptoSwift/CS_BigInt/Division.swift | 375 + .../CS_BigInt/Exponentiation.swift | 119 + .../CS_BigInt/Floating Point Conversion.swift | 73 + .../Sources/CryptoSwift/CS_BigInt/GCD.swift | 80 + .../CryptoSwift/CS_BigInt/Hashable.swift | 26 + .../CS_BigInt/Integer Conversion.swift | 89 + .../CS_BigInt/Multiplication.swift | 165 + .../CryptoSwift/CS_BigInt/Prime Test.swift | 153 + .../CryptoSwift/CS_BigInt/Random.swift | 101 + .../CryptoSwift/CS_BigInt/Shifts.swift | 211 + .../CryptoSwift/CS_BigInt/Square Root.swift | 41 + .../CryptoSwift/CS_BigInt/Strideable.swift | 38 + .../CS_BigInt/String Conversion.swift | 240 + .../CryptoSwift/CS_BigInt/Subtraction.swift | 169 + .../CS_BigInt/Words and Bits.swift | 202 + .../Sources/CryptoSwift/ChaCha20.swift | 347 + .../Sources/CryptoSwift/Checksum.swift | 208 + .../Sources/CryptoSwift/Cipher.swift | 47 + .../CryptoSwift/Collection+Extension.swift | 61 + .../Sources/CryptoSwift/CompactMap.swift | 25 + .../Sources/CryptoSwift/Cryptor.swift | 22 + .../Sources/CryptoSwift/Cryptors.swift | 44 + .../Sources/CryptoSwift/Digest.swift | 78 + .../Sources/CryptoSwift/DigestType.swift | 18 + .../Foundation/AES+Foundation.swift | 32 + .../Foundation/Array+Foundation.swift | 32 + .../Foundation/Blowfish+Foundation.swift | 23 + .../Foundation/ChaCha20+Foundation.swift | 22 + .../Foundation/Data+Extension.swift | 92 + .../Foundation/HMAC+Foundation.swift | 22 + .../Foundation/Rabbit+Foundation.swift | 26 + .../String+FoundationExtension.swift | 41 + .../Foundation/Utils+Foundation.swift | 27 + .../Sources/CryptoSwift/Generics.swift | 43 + .../Sources/CryptoSwift/HKDF.swift | 88 + .../Sources/CryptoSwift/HMAC.swift | 124 + .../Sources/CryptoSwift/ISO10126Padding.swift | 56 + .../Sources/CryptoSwift/ISO78164Padding.swift | 44 + .../Sources/CryptoSwift/Int+Extension.swift | 33 + .../CryptoSwift/Sources/CryptoSwift/MD5.swift | 161 + .../Sources/CryptoSwift/NoPadding.swift | 27 + .../Sources/CryptoSwift/Operators.swift | 32 + .../Sources/CryptoSwift/PEM/DER.swift | 90 + .../Sources/CryptoSwift/PKCS/PBKDF1.swift | 97 + .../Sources/CryptoSwift/PKCS/PBKDF2.swift | 120 + .../Sources/CryptoSwift/PKCS/PKCS1v15.swift | 96 + .../Sources/CryptoSwift/PKCS/PKCS5.swift | 22 + .../Sources/CryptoSwift/PKCS/PKCS7.swift | 18 + .../CryptoSwift/PKCS/PKCS7Padding.swift | 62 + .../Sources/CryptoSwift/Padding.swift | 65 + .../Sources/CryptoSwift/Poly1305.swift | 165 + .../Sources/CryptoSwift/RSA/RSA+Cipher.swift | 136 + .../CryptoSwift/RSA/RSA+Signature.swift | 262 + .../Sources/CryptoSwift/RSA/RSA.swift | 423 + .../Sources/CryptoSwift/Rabbit.swift | 221 + .../Sources/CryptoSwift/SHA1.swift | 158 + .../Sources/CryptoSwift/SHA2.swift | 368 + .../Sources/CryptoSwift/SHA3.swift | 299 + .../Sources/CryptoSwift/Scrypt.swift | 256 + .../Sources/CryptoSwift/SecureBytes.swift | 91 + .../Sources/CryptoSwift/Signature.swift | 66 + .../Sources/CryptoSwift/StreamDecryptor.swift | 92 + .../Sources/CryptoSwift/StreamEncryptor.swift | 68 + .../CryptoSwift/String+Extension.swift | 96 + .../Sources/CryptoSwift/UInt128.swift | 90 + .../CryptoSwift/UInt16+Extension.swift | 37 + .../CryptoSwift/UInt32+Extension.swift | 51 + .../CryptoSwift/UInt64+Extension.swift | 44 + .../Sources/CryptoSwift/UInt8+Extension.swift | 74 + .../Sources/CryptoSwift/Updatable.swift | 107 + .../Sources/CryptoSwift/Utils.swift | 117 + .../Sources/CryptoSwift/ZeroPadding.swift | 40 + .../Tests/CryptoSwiftTests/AESCCMTests.swift | 488 + .../Tests/CryptoSwiftTests/AESOCBTests.swift | 154 + .../Tests/CryptoSwiftTests/AESTests.swift | 713 ++ .../Tests/CryptoSwiftTests/AESTestsPerf.swift | 50 + .../Tests/CryptoSwiftTests/ASN1Tests.swift | 521 ++ .../Tests/CryptoSwiftTests/Access.swift | 294 + .../CryptoSwiftTests/BlowfishTests.swift | 223 + .../Tests/CryptoSwiftTests/Bridging.h | 21 + .../Tests/CryptoSwiftTests/CBCMacTests.swift | 61 + .../Tests/CryptoSwiftTests/CMACTests.swift | 103 + .../ChaCha20Poly1305Tests.swift | 84 + .../CryptoSwiftTests/ChaCha20Tests.swift | 122 + .../CryptoSwiftTests/ChaCha20TestsPerf.swift | 41 + .../Tests/CryptoSwiftTests/DigestTests.swift | 299 + .../CryptoSwiftTests/DigestTestsPerf.swift | 63 + .../CryptoSwiftTests/Error+Extension.swift | 25 + .../CryptoSwiftTests/ExtensionsTest.swift | 140 + .../CryptoSwiftTests/ExtensionsTestPerf.swift | 39 + .../Tests/CryptoSwiftTests/HKDFTests.swift | 97 + .../Tests/CryptoSwiftTests/HMACTests.swift | 71 + .../Tests/CryptoSwiftTests/PBKDF.swift | 74 + .../Tests/CryptoSwiftTests/PBKDFPerf.swift | 32 + .../Tests/CryptoSwiftTests/PaddingTests.swift | 243 + .../CryptoSwiftTests/Poly1305Tests.swift | 45 + .../CryptoSwiftTests/RSASecKeyTests.swift | 527 ++ .../Tests/CryptoSwiftTests/RSATests.swift | 1327 +++ .../Tests/CryptoSwiftTests/RabbitTests.swift | 128 + .../CryptoSwiftTests/RabbitTestsPerf.swift | 37 + .../Tests/CryptoSwiftTests/SHATestsPerf.swift | 108 + .../Tests/CryptoSwiftTests/ScryptTests.swift | 71 + .../CryptoSwiftTests/ScryptTestsPerf.swift | 37 + .../CryptoSwiftTests/XCTestManifests.swift | 406 + .../CryptoSwift/Tests/LinuxMain.swift | 10 + .../Tests/TestsPerformance/Bridging.h | 21 + .../TestsPerformance/TestsPerformance.swift | 34 + .../TestsPerformance/XCTestManifests.swift | 19 + Carthage/Checkouts/CryptoSwift/_config.yml | 1 + .../config/CryptoSwift-Debug.xcconfig | 6 + .../config/CryptoSwift-Release.xcconfig | 10 + .../config/CryptoSwift-Shared.xcconfig | 16 + .../config/CryptoSwift-Test.xcconfig | 8 + .../CryptoSwift-TestHostApp-Shared.xcconfig | 68 + .../CryptoSwift-TestHostApp-Test.xcconfig | 14 + .../CryptoSwift/config/Project-Debug.xcconfig | 9 + .../config/Project-Release.xcconfig | 10 + .../config/Project-Shared.xcconfig | 86 + .../CryptoSwift/config/Tests-Shared.xcconfig | 19 + .../CryptoSwift/config/Tests-Test.xcconfig | 16 + .../CryptoSwift/scripts/build-framework.sh | 119 + .../scripts/generate-contributors-list.sh | 31 + .../CryptoSwift/scripts/swiftformat.sh | 3 + .../Checkouts/PromiseKit/.github/FUNDING.yml | 3 + .../PromiseKit/.github/ISSUE_TEMPLATE.md | 11 + .../PromiseKit/.github/LinuxMain.stencil | 19 + .../Checkouts/PromiseKit/.github/codecov.yml | 31 + .../Checkouts/PromiseKit/.github/jazzy.yml | 18 + .../Checkouts/PromiseKit/.github/ranger.yml | 2 + .../Checkouts/PromiseKit/.github/sourcery.yml | 12 + .../PromiseKit/.github/workflows/cd.yml | 119 + .../.github/workflows/ci-podspec.yml | 13 + .../PromiseKit/.github/workflows/ci.yml | 124 + .../PromiseKit/.github/workflows/publish.yml | 73 + Carthage/Checkouts/PromiseKit/.gitignore | 8 + Carthage/Checkouts/PromiseKit/.gitmodules | 69 + Carthage/Checkouts/PromiseKit/.tidelift.yml | 1 + Carthage/Checkouts/PromiseKit/.travis.yml | 30 + .../PromiseKit/Documentation/Appendix.md | 211 + .../Documentation/CommonPatterns.md | 495 + .../Documentation/Examples/ImageCache.md | 131 + .../URLSession+BadResponseErrors.swift | 20 + .../Documentation/Examples/detweet.swift | 102 + .../Checkouts/PromiseKit/Documentation/FAQ.md | 398 + .../Documentation/GettingStarted.md | 535 ++ .../PromiseKit/Documentation/Installation.md | 222 + .../PromiseKit/Documentation/ObjectiveC.md | 219 + .../PromiseKit/Documentation/README.md | 14 + .../Documentation/Troubleshooting.md | 304 + .../Extensions/AVFoundation/.gitignore | 5 + .../Extensions/AVFoundation/.travis.yml | 78 + .../Extensions/AVFoundation/Cartfile | 1 + .../Extensions/AVFoundation/Cartfile.resolved | 1 + .../Extensions/AVFoundation/Carthage.xcconfig | 7 + .../Extensions/AVFoundation/Info.plist | 24 + .../Extensions/AVFoundation/LICENSE | 20 + .../PMKAVFoundation.xcodeproj/project.pbxproj | 456 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKAVFoundation.xcscheme | 113 + .../Extensions/AVFoundation/README.markdown | 34 + .../Sources/AVAudioSession+AnyPromise.h | 30 + .../Sources/AVAudioSession+AnyPromise.m | 21 + .../Sources/AVAudioSession+Promise.swift | 21 + .../AVFoundation/Tests/TestAVFoundation.m | 17 + .../AVFoundation/Tests/TestAVFoundation.swift | 24 + .../PromiseKit/Extensions/Accounts/.gitignore | 5 + .../Extensions/Accounts/.travis.yml | 84 + .../PromiseKit/Extensions/Accounts/Cartfile | 1 + .../Extensions/Accounts/Cartfile.resolved | 1 + .../Extensions/Accounts/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/Accounts/Info.plist | 24 + .../PromiseKit/Extensions/Accounts/LICENSE | 20 + .../PMKAccounts.xcodeproj/project.pbxproj | 448 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKAccounts.xcscheme | 113 + .../Extensions/Accounts/README.markdown | 34 + .../Sources/ACAccountStore+AnyPromise.h | 66 + .../Sources/ACAccountStore+AnyPromise.m | 48 + .../Sources/ACAccountStore+Promise.swift | 59 + .../Accounts/Tests/TestAccounts.swift | 80 + .../Extensions/AddressBook/.gitignore | 5 + .../Extensions/AddressBook/.travis.yml | 76 + .../Extensions/AddressBook/Cartfile | 1 + .../Extensions/AddressBook/Cartfile.resolved | 1 + .../Extensions/AddressBook/Carthage.xcconfig | 7 + .../Extensions/AddressBook/Info.plist | 24 + .../PromiseKit/Extensions/AddressBook/LICENSE | 20 + .../PMKAddressBook.xcodeproj/project.pbxproj | 442 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKAddressBook.xcscheme | 99 + .../Extensions/AddressBook/README.markdown | 34 + .../ABAddressBookRequestAccess+Promise.swift | 107 + .../AddressBook/Tests/TestAddressBook.swift | 15 + .../Extensions/Alamofire/.gitignore | 5 + .../Extensions/Alamofire/.travis.yml | 97 + .../PromiseKit/Extensions/Alamofire/Cartfile | 2 + .../Extensions/Alamofire/Cartfile.private | 1 + .../Extensions/Alamofire/Cartfile.resolved | 3 + .../Extensions/Alamofire/Carthage.xcconfig | 7 + .../Extensions/Alamofire/Info.plist | 24 + .../PromiseKit/Extensions/Alamofire/LICENSE | 20 + .../PMKAlamofire.xcodeproj/project.pbxproj | 454 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKAlamofire.xcscheme | 107 + .../Extensions/Alamofire/Package.swift | 10 + .../Alamofire/Package@swift-4.2.swift | 23 + .../Extensions/Alamofire/README.markdown | 93 + .../Alamofire/Sources/Alamofire+Promise.swift | 189 + .../Alamofire/Tests/TestAlamofire.swift | 74 + .../Extensions/AssetsLibrary/.gitignore | 5 + .../Extensions/AssetsLibrary/.travis.yml | 79 + .../Extensions/AssetsLibrary/Cartfile | 1 + .../AssetsLibrary/Cartfile.resolved | 1 + .../AssetsLibrary/Carthage.xcconfig | 7 + .../Extensions/AssetsLibrary/Info.plist | 24 + .../Extensions/AssetsLibrary/LICENSE | 20 + .../project.pbxproj | 601 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKAssetsLibrary.xcscheme | 127 + .../Extensions/AssetsLibrary/README.markdown | 34 + .../Sources/ALAssetsLibrary+Promise.swift | 100 + .../AssetsLibrary/Tests/Default-568h@2x.png | Bin 0 -> 4594 bytes .../AssetsLibrary/Tests/Entitlements.plist | 12 + .../Tests/TestUIImagePickerController.swift | 30 + .../Extensions/AssetsLibrary/Tests/app.swift | 39 + .../PromiseKit/Extensions/Bolts/.gitignore | 5 + .../PromiseKit/Extensions/Bolts/.travis.yml | 88 + .../PromiseKit/Extensions/Bolts/Cartfile | 2 + .../Extensions/Bolts/Cartfile.resolved | 2 + .../Extensions/Bolts/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/Bolts/Info.plist | 24 + .../PromiseKit/Extensions/Bolts/LICENSE | 20 + .../Bolts/PMKBolts.xcodeproj/project.pbxproj | 430 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/PMKBolts.xcscheme | 113 + .../Extensions/Bolts/README.markdown | 47 + .../Bolts/Sources/BFTask+Promise.swift | 27 + .../Extensions/Bolts/Tests/TestBolts.swift | 23 + .../PromiseKit/Extensions/CloudKit/.gitignore | 5 + .../Extensions/CloudKit/.travis.yml | 95 + .../PromiseKit/Extensions/CloudKit/Cartfile | 1 + .../Extensions/CloudKit/Cartfile.resolved | 1 + .../Extensions/CloudKit/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/CloudKit/Info.plist | 24 + .../PromiseKit/Extensions/CloudKit/LICENSE | 20 + .../PMKCloudKit.xcodeproj/project.pbxproj | 484 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKCloudKit.xcscheme | 113 + .../Extensions/CloudKit/Package.swift | 16 + .../CloudKit/Package@swift-4.2.swift | 26 + .../CloudKit/Package@swift-5.0.swift | 30 + .../Extensions/CloudKit/README.markdown | 34 + .../CloudKit/Sources/CKContainer+AnyPromise.h | 79 + .../CloudKit/Sources/CKContainer+AnyPromise.m | 71 + .../Sources/CKContainer+Promise.swift | 79 + .../CloudKit/Sources/CKDatabase+AnyPromise.h | 46 + .../CloudKit/Sources/CKDatabase+AnyPromise.m | 41 + .../CloudKit/Sources/CKDatabase+Promise.swift | 91 + .../Extensions/CloudKit/Sources/PMKCloudKit.h | 2 + .../CloudKit/Tests/TestCloudKit.swift | 146 + .../CloudKit/Tests/infrastructure.h | 2 + .../CloudKit/Tests/infrastructure.m | 5 + .../Extensions/CoreBluetooth/.gitignore | 5 + .../Extensions/CoreBluetooth/.travis.yml | 14 + .../Extensions/CoreBluetooth/Cartfile | 1 + .../CoreBluetooth/Cartfile.resolved | 1 + .../CoreBluetooth/Carthage.xcconfig | 7 + .../Extensions/CoreBluetooth/Info.plist | 24 + .../project.pbxproj | 447 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKCoreBluetooth.xcscheme | 113 + .../Extensions/CoreBluetooth/README.markdown | 38 + .../Sources/CBCentralManager+Promise.swift | 29 + .../CoreBluetooth/Tests/CBTests.swift | 10 + .../Extensions/CoreLocation/.gitignore | 5 + .../Extensions/CoreLocation/.travis.yml | 78 + .../Extensions/CoreLocation/Cartfile | 1 + .../Extensions/CoreLocation/Cartfile.resolved | 1 + .../Extensions/CoreLocation/Carthage.xcconfig | 7 + .../Extensions/CoreLocation/Info.plist | 24 + .../Extensions/CoreLocation/LICENSE | 20 + .../PMKCoreLocation.xcodeproj/project.pbxproj | 476 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKCoreLocation.xcscheme | 113 + .../Extensions/CoreLocation/Package.swift | 30 + .../Extensions/CoreLocation/README.markdown | 34 + .../Sources/CLGeocoder+AnyPromise.h | 40 + .../Sources/CLGeocoder+AnyPromise.m | 47 + .../Sources/CLGeocoder+Promise.swift | 81 + .../Sources/CLLocationManager+AnyPromise.h | 46 + .../Sources/CLLocationManager+AnyPromise.m | 72 + .../Sources/CLLocationManager+Promise.swift | 311 + .../CoreLocation/Sources/PMKCoreLocation.h | 2 + .../CoreLocation/Tests/CLGeocoderTests.swift | 121 + .../Tests/CLLocationManagerTests.swift | 95 + .../CoreLocation/Tests/Entitlements.plist | 12 + .../PromiseKit/Extensions/EventKit/.gitignore | 5 + .../Extensions/EventKit/.travis.yml | 78 + .../PromiseKit/Extensions/EventKit/Cartfile | 1 + .../Extensions/EventKit/Cartfile.resolved | 1 + .../Extensions/EventKit/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/EventKit/Info.plist | 24 + .../PromiseKit/Extensions/EventKit/LICENSE | 20 + .../PMKEventKit.xcodeproj/project.pbxproj | 450 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKEventKit.xcscheme | 113 + .../Extensions/EventKit/Package.swift | 21 + .../Extensions/EventKit/README.markdown | 34 + .../Sources/EKEventStore+Promise.swift | 41 + .../EventKit/Tests/Entitlements.plist | 12 + .../EventKit/Tests/TestEventKit.swift | 19 + .../Extensions/Foundation/.codecov.yml | 26 + .../Extensions/Foundation/.gitignore | 5 + .../Extensions/Foundation/.travis.yml | 147 + .../PromiseKit/Extensions/Foundation/Cartfile | 1 + .../Extensions/Foundation/Cartfile.private | 1 + .../Extensions/Foundation/Cartfile.resolved | 2 + .../Extensions/Foundation/Carthage.xcconfig | 7 + .../Extensions/Foundation/Info.plist | 24 + .../PromiseKit/Extensions/Foundation/LICENSE | 20 + .../PMKFoundation.xcodeproj/project.pbxproj | 507 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKFoundation.xcscheme | 99 + .../Extensions/Foundation/Package.swift | 23 + .../Foundation/Package@swift-4.2.swift | 32 + .../Foundation/Package@swift-5.0.swift | 36 + .../Extensions/Foundation/README.markdown | 47 + .../Sources/NSNotificationCenter+AnyPromise.h | 44 + .../Sources/NSNotificationCenter+AnyPromise.m | 18 + .../NSNotificationCenter+Promise.swift | 33 + .../Foundation/Sources/NSObject+Promise.swift | 57 + .../Foundation/Sources/NSTask+AnyPromise.h | 53 + .../Foundation/Sources/NSTask+AnyPromise.m | 59 + .../Sources/NSURLSession+AnyPromise.h | 79 + .../Sources/NSURLSession+AnyPromise.m | 113 + .../Sources/NSURLSession+Promise.swift | 246 + .../Foundation/Sources/PMKFoundation.h | 3 + .../Foundation/Sources/Process+Promise.swift | 190 + .../Foundation/Sources/afterlife.swift | 26 + .../Tests/TestNSNotificationCenter.swift | 22 + .../Foundation/Tests/TestNSObject.swift | 76 + .../Foundation/Tests/TestNSTask.swift | 50 + .../Foundation/Tests/TestNSURLSession.m | 55 + .../Foundation/Tests/TestNSURLSession.swift | 76 + .../Extensions/HealthKit/.gitignore | 5 + .../Extensions/HealthKit/.travis.yml | 76 + .../PromiseKit/Extensions/HealthKit/Cartfile | 1 + .../Extensions/HealthKit/Cartfile.resolved | 1 + .../Extensions/HealthKit/Carthage.xcconfig | 7 + .../Extensions/HealthKit/Info.plist | 24 + .../PromiseKit/Extensions/HealthKit/LICENSE | 20 + .../PMKHealthKit.xcodeproj/project.pbxproj | 450 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKHealthKit.xcscheme | 104 + .../Extensions/HealthKit/README.markdown | 34 + .../HealthKit/Sources/HealthKit+Promise.swift | 83 + .../HealthKit/Tests/TestHealthKit.swift | 4 + .../PromiseKit/Extensions/HomeKit/.gitignore | 5 + .../PromiseKit/Extensions/HomeKit/.travis.yml | 67 + .../PromiseKit/Extensions/HomeKit/Cartfile | 1 + .../Extensions/HomeKit/Cartfile.resolved | 1 + .../Extensions/HomeKit/Carthage.xcconfig | 6 + .../PromiseKit/Extensions/HomeKit/Info.plist | 24 + .../PromiseKit/Extensions/HomeKit/LICENSE | 20 + .../PMKHomeKit.xcodeproj/project.pbxproj | 480 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKHomeKit.xcscheme | 104 + .../Extensions/HomeKit/README.markdown | 32 + .../Sources/HMAcessoryBrowser+Promise.swift | 78 + .../HomeKit/Sources/HMActionSet+Promise.swift | 26 + .../Sources/HMCharacteristic+Promise.swift | 46 + .../Sources/HMEventTrigger+Promise.swift | 21 + .../HomeKit/Sources/HMHome+Promise.swift | 116 + .../Sources/HMHomeManager+Promise.swift | 62 + .../HomeKit/Sources/HMTrigger+Promise.swift | 41 + .../Extensions/HomeKit/Sources/Utils.swift | 45 + .../HomeKit/Tests/Entitlements.plist | 12 + .../Tests/HMAccessoryBrowserTests.swift | 84 + .../Extensions/HomeKit/Tests/UtilsTests.swift | 63 + .../PromiseKit/Extensions/MapKit/.gitignore | 5 + .../PromiseKit/Extensions/MapKit/.travis.yml | 80 + .../PromiseKit/Extensions/MapKit/Cartfile | 1 + .../Extensions/MapKit/Cartfile.resolved | 1 + .../Extensions/MapKit/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/MapKit/Info.plist | 24 + .../PromiseKit/Extensions/MapKit/LICENSE | 20 + .../PMKMapKit.xcodeproj/project.pbxproj | 474 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/PMKMapKit.xcscheme | 113 + .../Extensions/MapKit/README.markdown | 34 + .../MapKit/Sources/MKDirections+AnyPromise.h | 30 + .../MapKit/Sources/MKDirections+AnyPromise.m | 22 + .../MapKit/Sources/MKDirections+Promise.swift | 38 + .../Sources/MKMapSnapshotter+AnyPromise.h | 23 + .../Sources/MKMapSnapshotter+AnyPromise.m | 14 + .../Sources/MKMapSnapshotter+Promise.swift | 28 + .../Extensions/MapKit/Sources/PMKMapKit.h | 2 + .../Extensions/MapKit/Tests/TestMapKit.swift | 63 + .../Extensions/MessagesUI/.gitignore | 5 + .../Extensions/MessagesUI/.travis.yml | 80 + .../PromiseKit/Extensions/MessagesUI/Cartfile | 1 + .../Extensions/MessagesUI/Cartfile.resolved | 1 + .../Extensions/MessagesUI/Carthage.xcconfig | 7 + .../Extensions/MessagesUI/Info.plist | 24 + .../PromiseKit/Extensions/MessagesUI/LICENSE | 20 + .../PMKMessagesUI.xcodeproj/project.pbxproj | 452 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKMessagesUI.xcscheme | 121 + .../Extensions/MessagesUI/README.markdown | 36 + .../MFMailComposeViewController+Promise.swift | 81 + ...MessageComposeViewController+Promise.swift | 82 + .../MessagesUI/Tests/TestMessageUI.swift | 69 + .../Extensions/OMGHTTPURLRQ/.gitignore | 5 + .../Extensions/OMGHTTPURLRQ/.travis.yml | 42 + .../Extensions/OMGHTTPURLRQ/Cartfile | 3 + .../Extensions/OMGHTTPURLRQ/Cartfile.private | 1 + .../Extensions/OMGHTTPURLRQ/Cartfile.resolved | 4 + .../Extensions/OMGHTTPURLRQ/Carthage.xcconfig | 7 + .../Extensions/OMGHTTPURLRQ/Info.plist | 24 + .../PMKOMGHTTPURLRQ.xcodeproj/project.pbxproj | 466 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKOMGHTTPURLRQ.xcscheme | 104 + .../Extensions/OMGHTTPURLRQ/README.markdown | 65 + .../Sources/NSURLSession+OMG+AnyPromise.m | 100 + .../Sources/NSURLSession+OMG+Promise.swift | 170 + .../OMGHTTPURLRQ/Sources/PMKOMGHTTPURLRQ.h | 200 + .../OMGHTTPURLRQ/Tests/TestNSURLSession.m | 48 + .../OMGHTTPURLRQ/Tests/TestNSURLSession.swift | 74 + .../PromiseKit/Extensions/Photos/.gitignore | 5 + .../PromiseKit/Extensions/Photos/.travis.yml | 73 + .../PromiseKit/Extensions/Photos/Cartfile | 1 + .../Extensions/Photos/Cartfile.resolved | 1 + .../Extensions/Photos/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/Photos/Info.plist | 24 + .../PromiseKit/Extensions/Photos/LICENSE | 20 + .../PMKPhotos.xcodeproj/project.pbxproj | 450 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/PMKPhotos.xcscheme | 113 + .../Extensions/Photos/README.markdown | 34 + .../Sources/PHPhotoLibrary+Promise.swift | 24 + .../Photos/Tests/PHPhototLibraryTests.swift | 12 + .../Extensions/QuartzCore/.gitignore | 5 + .../Extensions/QuartzCore/.travis.yml | 82 + .../PromiseKit/Extensions/QuartzCore/Cartfile | 1 + .../Extensions/QuartzCore/Cartfile.resolved | 1 + .../Extensions/QuartzCore/Carthage.xcconfig | 7 + .../Extensions/QuartzCore/Info.plist | 24 + .../PromiseKit/Extensions/QuartzCore/LICENSE | 20 + .../QuartzCore/PMKQCTests/Info.plist | 22 + .../QuartzCore/PMKQCTests/PMKQCTests.swift | 35 + .../PMKQuartzCore.xcodeproj/project.pbxproj | 485 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKQuartzCore.xcscheme | 113 + .../Extensions/QuartzCore/README.markdown | 34 + .../QuartzCore/Sources/CALayer+AnyPromise.h | 40 + .../QuartzCore/Sources/CALayer+AnyPromise.m | 36 + .../QuartzCore/Sources/CALayer+Promise.swift | 31 + .../QuartzCore/Sources/PMKQuartzCore.h | 1 + .../QuartzCore/Tests/TestQuartzCore.m | 18 + .../QuartzCore/Tests/TestQuartzCore.swift | 16 + .../PromiseKit/Extensions/Social/.gitignore | 5 + .../PromiseKit/Extensions/Social/.travis.yml | 78 + .../PromiseKit/Extensions/Social/Cartfile | 2 + .../Extensions/Social/Cartfile.resolved | 2 + .../Extensions/Social/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/Social/Info.plist | 24 + .../PromiseKit/Extensions/Social/LICENSE | 20 + .../PMKSocial.xcodeproj/project.pbxproj | 469 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/PMKSocial.xcscheme | 113 + .../Extensions/Social/README.markdown | 34 + .../Extensions/Social/Sources/PMKSocial.h | 1 + .../SLComposeViewController+Promise.swift | 48 + .../Social/Sources/SLRequest+AnyPromise.h | 36 + .../Social/Sources/SLRequest+AnyPromise.m | 51 + .../Social/Sources/SLRequest+Promise.swift | 37 + .../Tests/TestSLComposeViewController.swift | 16 + .../Extensions/Social/Tests/TestSocial.m | 136 + .../Extensions/Social/Tests/TestSocial.swift | 56 + .../PromiseKit/Extensions/StoreKit/.gitignore | 5 + .../Extensions/StoreKit/.travis.yml | 91 + .../PromiseKit/Extensions/StoreKit/Cartfile | 1 + .../Extensions/StoreKit/Cartfile.resolved | 1 + .../Extensions/StoreKit/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/StoreKit/Info.plist | 24 + .../PromiseKit/Extensions/StoreKit/LICENSE | 20 + .../PMKStoreKit.xcodeproj/project.pbxproj | 480 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKStoreKit.xcscheme | 113 + .../Extensions/StoreKit/Package.swift | 24 + .../Extensions/StoreKit/Package@4.2.swift | 24 + .../Extensions/StoreKit/README.markdown | 34 + .../Extensions/StoreKit/Sources/PMKStoreKit.h | 1 + .../StoreKit/Sources/SKPayment+Promise.swift | 45 + .../Sources/SKPaymentQueue+Promise.swift | 55 + .../Sources/SKProductsRequest+Promise.swift | 52 + .../SKReceiptRefreshRequest+Promise.swift | 35 + .../StoreKit/Sources/SKRequest+AnyPromise.h | 31 + .../StoreKit/Sources/SKRequest+AnyPromise.m | 48 + .../Extensions/StoreKit/Tests/TestStoreKit.m | 27 + .../StoreKit/Tests/TestStoreKit.swift | 22 + .../Extensions/SystemConfiguration/.gitignore | 5 + .../SystemConfiguration/.travis.yml | 22 + .../Extensions/SystemConfiguration/Cartfile | 1 + .../SystemConfiguration/Cartfile.resolved | 1 + .../SystemConfiguration/Carthage.xcconfig | 7 + .../Extensions/SystemConfiguration/Info.plist | 24 + .../Extensions/SystemConfiguration/LICENSE | 20 + .../project.pbxproj | 457 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKSystemConfiguration.xcscheme | 113 + .../SystemConfiguration/README.markdown | 34 + .../Sources/PMKSystemConfiguration.h | 1 + .../SCNetworkReachability+AnyPromise.h | 18 + .../SCNetworkReachability+AnyPromise.m | 116 + .../SCNetworkReachability+Promise.swift | 62 + .../SystemConfiguration/Tests/SCTests.swift | 9 + .../PromiseKit/Extensions/UIKit/.gitignore | 5 + .../PromiseKit/Extensions/UIKit/.travis.yml | 78 + .../PromiseKit/Extensions/UIKit/Cartfile | 1 + .../Extensions/UIKit/Cartfile.resolved | 1 + .../Extensions/UIKit/Carthage.xcconfig | 7 + .../PromiseKit/Extensions/UIKit/Info.plist | 24 + .../PromiseKit/Extensions/UIKit/LICENSE | 20 + .../UIKit/PMKUIKit.xcodeproj/project.pbxproj | 757 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/PMKUIKit.xcscheme | 134 + .../Extensions/UIKit/README.markdown | 48 + .../Extensions/UIKit/Sources/PMKUIKit.h | 8 + .../UIImagePickerController+Promise.swift | 80 + .../UIKit/Sources/UIView+AnyPromise.h | 80 + .../UIKit/Sources/UIView+AnyPromise.m | 64 + .../UIKit/Sources/UIView+Promise.swift | 115 + .../Sources/UIViewController+AnyPromise.h | 71 + .../Sources/UIViewController+AnyPromise.m | 140 + .../UIViewPropertyAnimator+Promise.swift | 14 + .../Tests/TestUIImagePickerController.swift | 34 + .../Extensions/UIKit/Tests/TestUIView.swift | 19 + .../UIKit/Tests/TestUIViewController.m | 135 + .../UIKit/Tests/infrastructure.swift | 16 + .../UIKit/UITests/Default-568h@2x.png | Bin 0 -> 4594 bytes .../UIKit/UITests/Entitlements.plist | 12 + .../UITests/TestUIImagePickerController.swift | 61 + .../Extensions/UIKit/UITests/app.swift | 100 + .../Extensions/WatchConnectivity/.gitignore | 5 + .../Extensions/WatchConnectivity/.travis.yml | 78 + .../Extensions/WatchConnectivity/Cartfile | 1 + .../WatchConnectivity/Cartfile.resolved | 1 + .../WatchConnectivity/Carthage.xcconfig | 7 + .../Extensions/WatchConnectivity/Info.plist | 24 + .../Extensions/WatchConnectivity/LICENSE | 20 + .../project.pbxproj | 450 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PMKWatchConnectivity.xcscheme | 113 + .../WatchConnectivity/README.markdown | 34 + .../Sources/WCSession+Promise.swift | 21 + .../Tests/TestWatchConnectivity.swift | 52 + Carthage/Checkouts/PromiseKit/LICENSE | 20 + Carthage/Checkouts/PromiseKit/Package.swift | 30 + .../PromiseKit/Package@swift-4.2.swift | 30 + .../PromiseKit/Package@swift-5.0.swift | 33 + .../PromiseKit/Package@swift-5.3.swift | 34 + .../PromiseKit.playground/Contents.swift | 27 + .../contents.xcplayground | 7 + .../contents.xcworkspacedata | 7 + .../Checkouts/PromiseKit/PromiseKit.podspec | 302 + .../PromiseKit.xcodeproj/project.pbxproj | 1242 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcschemes/PromiseKit.xcscheme | 147 + Carthage/Checkouts/PromiseKit/README.md | 210 + .../PromiseKit/Sources/AnyPromise+Private.h | 32 + .../Checkouts/PromiseKit/Sources/AnyPromise.h | 315 + .../Checkouts/PromiseKit/Sources/AnyPromise.m | 185 + .../PromiseKit/Sources/AnyPromise.swift | 224 + .../Checkouts/PromiseKit/Sources/Async.swift | 28 + .../Checkouts/PromiseKit/Sources/Box.swift | 101 + .../PromiseKit/Sources/Catchable.swift | 256 + .../PromiseKit/Sources/Configuration.swift | 35 + .../Sources/CustomStringConvertible.swift | 44 + .../PromiseKit/Sources/Deprecations.swift | 93 + .../Checkouts/PromiseKit/Sources/Error.swift | 111 + .../PromiseKit/Sources/Guarantee.swift | 390 + .../Checkouts/PromiseKit/Sources/Info.plist | 28 + .../PromiseKit/Sources/LogEvent.swift | 30 + .../Sources/NSMethodSignatureForBlock.m | 77 + .../PromiseKit/Sources/PMKCallVariadicBlock.m | 120 + .../PromiseKit/Sources/Promise.swift | 184 + .../Checkouts/PromiseKit/Sources/PromiseKit.h | 7 + .../PromiseKit/Sources/Resolver.swift | 111 + .../PromiseKit/Sources/Thenable.swift | 533 ++ Carthage/Checkouts/PromiseKit/Sources/after.m | 14 + .../Checkouts/PromiseKit/Sources/after.swift | 46 + .../PromiseKit/Sources/dispatch_promise.m | 10 + .../PromiseKit/Sources/firstly.swift | 39 + Carthage/Checkouts/PromiseKit/Sources/fwd.h | 171 + Carthage/Checkouts/PromiseKit/Sources/hang.m | 29 + .../Checkouts/PromiseKit/Sources/hang.swift | 55 + Carthage/Checkouts/PromiseKit/Sources/join.m | 54 + Carthage/Checkouts/PromiseKit/Sources/race.m | 48 + .../Checkouts/PromiseKit/Sources/race.swift | 102 + Carthage/Checkouts/PromiseKit/Sources/when.m | 107 + .../Checkouts/PromiseKit/Sources/when.swift | 363 + .../Checkouts/PromiseKit/Tests/A+/0.0.0.swift | 185 + .../Checkouts/PromiseKit/Tests/A+/2.1.2.swift | 26 + .../Checkouts/PromiseKit/Tests/A+/2.1.3.swift | 34 + .../Checkouts/PromiseKit/Tests/A+/2.2.2.swift | 92 + .../Checkouts/PromiseKit/Tests/A+/2.2.3.swift | 93 + .../Checkouts/PromiseKit/Tests/A+/2.2.4.swift | 146 + .../Checkouts/PromiseKit/Tests/A+/2.2.6.swift | 275 + .../Checkouts/PromiseKit/Tests/A+/2.2.7.swift | 33 + .../Checkouts/PromiseKit/Tests/A+/2.3.1.swift | 31 + .../Checkouts/PromiseKit/Tests/A+/2.3.2.swift | 116 + .../Checkouts/PromiseKit/Tests/A+/2.3.4.swift | 26 + .../Checkouts/PromiseKit/Tests/A+/README.md | 13 + .../PromiseKit/Tests/A+/XCTestManifests.swift | 108 + .../PromiseKit/Tests/Bridging/BridgingTests.m | 34 + .../Tests/Bridging/BridgingTests.swift | 280 + .../Tests/Bridging/Infrastructure.h | 14 + .../Tests/Bridging/Infrastructure.m | 38 + .../Tests/Bridging/Infrastructure.swift | 24 + .../Tests/CoreObjC/AnyPromiseTests.m | 908 ++ .../Tests/CoreObjC/AnyPromiseTests.swift | 38 + .../PromiseKit/Tests/CoreObjC/HangTests.m | 13 + .../PromiseKit/Tests/CoreObjC/JoinTests.m | 90 + .../Tests/CoreObjC/PMKManifoldTests.m | 83 + .../PromiseKit/Tests/CoreObjC/RaceTests.m | 88 + .../PromiseKit/Tests/CoreObjC/WhenTests.m | 265 + .../Tests/CorePromise/AfterTests.swift | 52 + .../Tests/CorePromise/AsyncTests.swift | 99 + .../CorePromise/CancellableErrorTests.swift | 167 + .../Tests/CorePromise/CatchableTests.swift | 267 + .../DefaultDispatchQueueTests.swift | 70 + .../Tests/CorePromise/ErrorTests.swift | 22 + .../Tests/CorePromise/GuaranteeTests.swift | 205 + .../Tests/CorePromise/HangTests.swift | 38 + .../Tests/CorePromise/LoggingTests.swift | 199 + .../Tests/CorePromise/PromiseTests.swift | 152 + .../Tests/CorePromise/RaceTests.swift | 91 + .../Tests/CorePromise/RegressionTests.swift | 27 + .../Tests/CorePromise/ResolverTests.swift | 234 + .../Tests/CorePromise/StressTests.swift | 78 + .../Tests/CorePromise/ThenableTests.swift | 249 + .../Tests/CorePromise/Utilities.swift | 33 + .../CorePromise/WhenConcurrentTests.swift | 190 + .../Tests/CorePromise/WhenResolvedTests.swift | 41 + .../Tests/CorePromise/WhenTests.swift | 267 + .../Tests/CorePromise/XCTestManifests.swift | 326 + .../Tests/CorePromise/ZalgoTests.swift | 59 + .../PromiseKit/Tests/DeprecationTests.swift | 158 + .../PromiseKit/Tests/JS-A+/.gitignore | 63 + .../PromiseKit/Tests/JS-A+/AllTests.swift | 84 + .../PromiseKit/Tests/JS-A+/JSAdapter.swift | 53 + .../PromiseKit/Tests/JS-A+/JSPromise.swift | 94 + .../PromiseKit/Tests/JS-A+/JSUtils.swift | 116 + .../Tests/JS-A+/MockNodeEnvironment.swift | 129 + .../PromiseKit/Tests/JS-A+/README.md | 75 + .../Checkouts/PromiseKit/Tests/JS-A+/index.js | 42 + .../PromiseKit/Tests/JS-A+/package-lock.json | 8036 +++++++++++++++++ .../PromiseKit/Tests/JS-A+/package.json | 17 + .../PromiseKit/Tests/JS-A+/webpack.config.js | 32 + .../PromiseKit/Tests/LinuxMain.swift | 10 + Carthage/Checkouts/secp256k1.swift/.gitignore | 37 + .../Checkouts/secp256k1.swift/.gitmodules | 3 + .../Checkouts/secp256k1.swift/.travis.yml | 16 + .../Checkouts/secp256k1.swift/Example/Podfile | 5 + .../secp256k1.swift/Example/Podfile.lock | 16 + .../secp256k1.swift.podspec.json | 51 + .../Example/Pods/Manifest.lock | 16 + .../Pods/Pods.xcodeproj/project.pbxproj | 865 ++ .../Pods-secp256k1_Example-Info.plist | 26 + ...ecp256k1_Example-acknowledgements.markdown | 28 + ...s-secp256k1_Example-acknowledgements.plist | 60 + .../Pods-secp256k1_Example-dummy.m | 5 + .../Pods-secp256k1_Example-frameworks.sh | 185 + .../Pods-secp256k1_Example-umbrella.h | 16 + .../Pods-secp256k1_Example.debug.xcconfig | 12 + .../Pods-secp256k1_Example.modulemap | 6 + .../Pods-secp256k1_Example.release.xcconfig | 12 + .../secp256k1.swift-Info.plist | 26 + .../secp256k1.swift/secp256k1.swift-dummy.m | 5 + .../secp256k1.swift-prefix.pch | 12 + .../secp256k1.swift-umbrella.h | 19 + .../secp256k1.swift.debug.xcconfig | 14 + .../secp256k1.swift/secp256k1.swift.modulemap | 6 + .../secp256k1.swift.release.xcconfig | 14 + .../secp256k1.swift/Example/Tests/Info.plist | 24 + .../secp256k1.swift/Example/Tests/Tests.swift | 9 + .../secp256k1.xcodeproj/project.pbxproj | 539 ++ .../contents.xcworkspacedata | 7 + .../xcschemes/secp256k1-Example.xcscheme | 117 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../Example/secp256k1/AppDelegate.swift | 46 + .../secp256k1/Base.lproj/LaunchScreen.xib | 46 + .../secp256k1/Base.lproj/Main.storyboard | 30 + .../AppIcon.appiconset/Contents.json | 53 + .../Example/secp256k1/Info.plist | 39 + .../Example/secp256k1/ViewController.swift | 32 + Carthage/Checkouts/secp256k1.swift/LICENSE | 21 + .../Checkouts/secp256k1.swift/Package.swift | 65 + Carthage/Checkouts/secp256k1.swift/README.md | 83 + .../Checkouts/secp256k1.swift/_Pods.xcodeproj | 1 + .../secp256k1.swift/secp256k1.swift.podspec | 56 + .../secp256k1.swift/secp256k1/Assets/.gitkeep | 0 .../secp256k1/Classes/.gitkeep | 0 .../secp256k1/Classes/exporter/Exporter.swift | 1 + .../secp256k1/Classes/secp256k1-config.h | 169 + .../secp256k1/Classes/secp256k1/.gitignore | 50 + .../secp256k1/Classes/secp256k1/.travis.yml | 69 + .../secp256k1/Classes/secp256k1/COPYING | 19 + .../secp256k1/Classes/secp256k1/Makefile.am | 183 + .../secp256k1/Classes/secp256k1/README.md | 61 + .../secp256k1/Classes/secp256k1/TODO | 3 + .../secp256k1/Classes/secp256k1/autogen.sh | 3 + .../build-aux/m4/ax_jni_include_dir.m4 | 145 + .../build-aux/m4/ax_prog_cc_for_build.m4 | 125 + .../secp256k1/build-aux/m4/bitcoin_secp.m4 | 68 + .../secp256k1/Classes/secp256k1/configure.ac | 494 + .../secp256k1/contrib/lax_der_parsing.c | 150 + .../secp256k1/contrib/lax_der_parsing.h | 91 + .../contrib/lax_der_privatekey_parsing.c | 113 + .../contrib/lax_der_privatekey_parsing.h | 90 + .../Classes/secp256k1/include/secp256k1.h | 654 ++ .../secp256k1/include/secp256k1_ecdh.h | 31 + .../secp256k1/include/secp256k1_recovery.h | 110 + .../Classes/secp256k1/libsecp256k1.pc.in | 13 + .../Classes/secp256k1/obj/.gitignore | 0 .../Classes/secp256k1/sage/group_prover.sage | 322 + .../Classes/secp256k1/sage/secp256k1.sage | 306 + .../secp256k1/sage/weierstrass_prover.sage | 264 + .../secp256k1/src/asm/field_10x26_arm.s | 919 ++ .../Classes/secp256k1/src/basic-config.h | 33 + .../secp256k1/Classes/secp256k1/src/bench.h | 82 + .../Classes/secp256k1/src/bench_ecdh.c | 54 + .../Classes/secp256k1/src/bench_ecmult.c | 196 + .../Classes/secp256k1/src/bench_internal.c | 367 + .../Classes/secp256k1/src/bench_recover.c | 60 + .../Classes/secp256k1/src/bench_sign.c | 56 + .../Classes/secp256k1/src/bench_verify.c | 112 + .../secp256k1/Classes/secp256k1/src/ecdsa.h | 21 + .../Classes/secp256k1/src/ecdsa_impl.h | 313 + .../secp256k1/Classes/secp256k1/src/eckey.h | 25 + .../Classes/secp256k1/src/eckey_impl.h | 100 + .../secp256k1/Classes/secp256k1/src/ecmult.h | 47 + .../Classes/secp256k1/src/ecmult_const.h | 17 + .../Classes/secp256k1/src/ecmult_const_impl.h | 257 + .../Classes/secp256k1/src/ecmult_gen.h | 43 + .../Classes/secp256k1/src/ecmult_gen_impl.h | 210 + .../Classes/secp256k1/src/ecmult_impl.h | 1027 +++ .../secp256k1/Classes/secp256k1/src/field.h | 130 + .../Classes/secp256k1/src/field_10x26.h | 48 + .../Classes/secp256k1/src/field_10x26_impl.h | 1161 +++ .../Classes/secp256k1/src/field_5x52.h | 47 + .../secp256k1/src/field_5x52_asm_impl.h | 502 + .../Classes/secp256k1/src/field_5x52_impl.h | 494 + .../secp256k1/src/field_5x52_int128_impl.h | 277 + .../Classes/secp256k1/src/field_impl.h | 313 + .../Classes/secp256k1/src/gen_context.c | 74 + .../secp256k1/Classes/secp256k1/src/group.h | 147 + .../Classes/secp256k1/src/group_impl.h | 706 ++ .../secp256k1/Classes/secp256k1/src/hash.h | 41 + .../Classes/secp256k1/src/hash_impl.h | 282 + .../src/java/org/bitcoin/NativeSecp256k1.java | 446 + .../java/org/bitcoin/NativeSecp256k1Test.java | 226 + .../java/org/bitcoin/NativeSecp256k1Util.java | 45 + .../java/org/bitcoin/Secp256k1Context.java | 51 + .../src/java/org_bitcoin_NativeSecp256k1.c | 377 + .../src/java/org_bitcoin_NativeSecp256k1.h | 119 + .../src/java/org_bitcoin_Secp256k1Context.c | 15 + .../src/java/org_bitcoin_Secp256k1Context.h | 22 + .../src/modules/ecdh/Makefile.am.include | 8 + .../secp256k1/src/modules/ecdh/main_impl.h | 54 + .../secp256k1/src/modules/ecdh/tests_impl.h | 105 + .../src/modules/recovery/Makefile.am.include | 8 + .../src/modules/recovery/main_impl.h | 193 + .../src/modules/recovery/tests_impl.h | 393 + .../secp256k1/Classes/secp256k1/src/num.h | 72 + .../secp256k1/Classes/secp256k1/src/num_gmp.h | 20 + .../Classes/secp256k1/src/num_gmp_impl.h | 288 + .../Classes/secp256k1/src/num_impl.h | 22 + .../secp256k1/Classes/secp256k1/src/scalar.h | 104 + .../Classes/secp256k1/src/scalar_4x64.h | 19 + .../Classes/secp256k1/src/scalar_4x64_impl.h | 949 ++ .../Classes/secp256k1/src/scalar_8x32.h | 19 + .../Classes/secp256k1/src/scalar_8x32_impl.h | 721 ++ .../Classes/secp256k1/src/scalar_impl.h | 331 + .../Classes/secp256k1/src/scalar_low.h | 15 + .../Classes/secp256k1/src/scalar_low_impl.h | 114 + .../secp256k1/Classes/secp256k1/src/scratch.h | 39 + .../Classes/secp256k1/src/scratch_impl.h | 86 + .../Classes/secp256k1/src/secp256k1.c | 597 ++ .../Classes/secp256k1/src/testrand.h | 36 + .../Classes/secp256k1/src/testrand_impl.h | 110 + .../secp256k1/Classes/secp256k1/src/tests.c | 5079 +++++++++++ .../Classes/secp256k1/src/tests_exhaustive.c | 508 ++ .../secp256k1/Classes/secp256k1/src/util.h | 119 + .../secp256k1_ec_mult_static_context.h | 1160 +++ .../secp256k1/Classes/secp256k1_main.h | 5 + .../.github/ISSUE_TEMPLATE/BUG_REPORT.md | 40 + .../.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md | 16 + .../.github/ISSUE_TEMPLATE/config.yml | 5 + .../.github/PULL_REQUEST_TEMPLATE.md | 24 + .../.github/PULL_REQUEST_TEMPLATE/NEW.md | 45 + .../Checkouts/swift-collections/.gitignore | 9 + .../Benchmarks/ArrayBenchmarks.swift | 276 + .../Benchmarks/Benchmarks/CppBenchmarks.swift | 629 ++ .../Benchmarks/DequeBenchmarks.swift | 490 + .../Benchmarks/DictionaryBenchmarks.swift | 342 + .../Benchmarks/Benchmarks/Kalimba.swift | 64 + .../Benchmarks/Benchmarks/Library.json | 2001 ++++ .../Benchmarks/Benchmarks/Library.swift | 20 + .../OrderedDictionaryBenchmarks.swift | 486 + .../Benchmarks/OrderedSetBenchmarks.swift | 541 ++ .../Benchmarks/Benchmarks/SetBenchmarks.swift | 397 + .../CppBenchmarks/include/DequeBenchmarks.h | 50 + .../CppBenchmarks/include/Hashing.h | 33 + .../include/UnorderedMapBenchmarks.h | 44 + .../include/UnorderedSetBenchmarks.h | 46 + .../CppBenchmarks/include/VectorBenchmarks.h | 50 + .../CppBenchmarks/include/module.modulemap | 9 + .../Benchmarks/CppBenchmarks/src/CustomHash.h | 31 + .../CppBenchmarks/src/DequeBenchmarks.cpp | 140 + .../Benchmarks/CppBenchmarks/src/Hashing.cpp | 39 + .../src/UnorderedMapBenchmarks.cpp | 96 + .../src/UnorderedSetBenchmarks.cpp | 90 + .../CppBenchmarks/src/VectorBenchmarks.cpp | 143 + .../Benchmarks/CppBenchmarks/src/utils.cpp | 42 + .../Benchmarks/CppBenchmarks/src/utils.h | 38 + .../Benchmarks/Package.swift | 47 + .../Benchmarks/benchmark-tool/main.swift | 26 + .../swift-collections/CMakeLists.txt | 32 + .../Checkouts/swift-collections/CODEOWNERS | 19 + .../swift-collections/CODE_OF_CONDUCT.md | 38 + .../swift-collections/CONTRIBUTING.md | 11 + .../Announcement-benchmarks/Library.json | 62 + .../Announcement-benchmarks/README.md | 17 + .../Announcement-benchmarks/Results.md | 32 + .../01 Deque - random access lookups.png | Bin 0 -> 350275 bytes ...Deque - prepending individual integers.png | Bin 0 -> 444177 bytes .../Results/03 OrderedSet lookups.png | Bin 0 -> 578651 bytes .../Results/04 OrderedSet insertions.png | Bin 0 -> 483045 bytes .../Results/05 OrderedDictionary lookups.png | Bin 0 -> 479512 bytes .../06 OrderedDictionary insertions.png | Bin 0 -> 479445 bytes .../Announcement-benchmarks/Theme.json | 98 + .../generate-results.sh | 16 + .../Announcement-benchmarks/results.json | 1 + .../swift-collections/Documentation/Deque.md | 93 + .../Documentation/Internals/README.md | 119 + .../Internals/ReleaseChecklist.md | 58 + .../Documentation/OrderedDictionary.md | 224 + .../Documentation/OrderedSet.md | 255 + .../Checkouts/swift-collections/LICENSE.txt | 211 + .../Checkouts/swift-collections/Package.swift | 105 + .../Checkouts/swift-collections/README.md | 137 + .../swift-collections/Sources/CMakeLists.txt | 12 + .../Sources/Collections/CMakeLists.txt | 19 + .../Sources/Collections/Collections.swift | 13 + .../Sources/DequeModule/CMakeLists.txt | 34 + .../Sources/DequeModule/Compatibility.swift | 62 + .../Sources/DequeModule/Deque+Codable.swift | 49 + .../DequeModule/Deque+Collection.swift | 913 ++ .../Deque+CustomDebugStringConvertible.swift | 28 + .../DequeModule/Deque+CustomReflectable.swift | 17 + .../Deque+CustomStringConvertible.swift | 28 + .../Sources/DequeModule/Deque+Equatable.swift | 22 + .../Deque+ExpressibleByArrayLiteral.swift | 27 + .../Sources/DequeModule/Deque+Extras.swift | 186 + .../Sources/DequeModule/Deque+Hashable.swift | 24 + .../Sources/DequeModule/Deque+Testing.swift | 76 + .../Sources/DequeModule/Deque._Storage.swift | 214 + .../DequeModule/Deque._UnsafeHandle.swift | 833 ++ .../Sources/DequeModule/Deque.swift | 105 + ...UnsafeMutableBufferPointer+Utilities.swift | 65 + .../Sources/DequeModule/_DequeBuffer.swift | 49 + .../DequeModule/_DequeBufferHeader.swift | 49 + .../Sources/DequeModule/_DequeSlot.swift | 72 + .../DequeModule/_UnsafeWrappedBuffer.swift | 217 + .../Sources/OrderedCollections/CMakeLists.txt | 68 + .../HashTable/_HashTable+Bucket.swift | 37 + .../HashTable/_HashTable+BucketIterator.swift | 265 + .../HashTable/_HashTable+Constants.swift | 97 + .../_HashTable+CustomStringConvertible.swift | 61 + .../HashTable/_HashTable+Testing.swift | 63 + .../HashTable/_HashTable+UnsafeHandle.swift | 542 ++ .../HashTable/_HashTable.swift | 202 + .../HashTable/_Hashtable+Header.swift | 99 + .../OrderedDictionary+Codable.swift | 87 + ...tionary+CustomDebugStringConvertible.swift | 44 + .../OrderedDictionary+CustomReflectable.swift | 17 + ...edDictionary+CustomStringConvertible.swift | 29 + .../OrderedDictionary+Deprecations.swift | 52 + ...deredDictionary+Elements+SubSequence.swift | 330 + .../OrderedDictionary+Elements.swift | 653 ++ .../OrderedDictionary+Equatable.swift | 23 + ...onary+ExpressibleByDictionaryLiteral.swift | 31 + .../OrderedDictionary+Hashable.swift | 25 + .../OrderedDictionary+Initializers.swift | 455 + .../OrderedDictionary+Invariants.swift | 23 + ...Dictionary+Partial MutableCollection.swift | 193 + ...y+Partial RangeReplaceableCollection.swift | 184 + .../OrderedDictionary+Sequence.swift | 63 + .../OrderedDictionary+Values.swift | 381 + .../OrderedDictionary/OrderedDictionary.swift | 1060 +++ .../OrderedSet/OrderedSet+Codable.swift | 46 + ...eredSet+CustomDebugStringConvertible.swift | 36 + .../OrderedSet+CustomReflectable.swift | 17 + .../OrderedSet+CustomStringConvertible.swift | 28 + .../OrderedSet/OrderedSet+Diffing.swift | 100 + .../OrderedSet/OrderedSet+Equatable.swift | 23 + ...OrderedSet+ExpressibleByArrayLiteral.swift | 32 + .../OrderedSet/OrderedSet+Hashable.swift | 24 + .../OrderedSet/OrderedSet+Initializers.swift | 150 + .../OrderedSet/OrderedSet+Insertions.swift | 255 + .../OrderedSet/OrderedSet+Invariants.swift | 54 + ...OrderedSet+Partial MutableCollection.swift | 442 + ...t+Partial RangeReplaceableCollection.swift | 224 + ...OrderedSet+Partial SetAlgebra+Basics.swift | 76 + ...redSet+Partial SetAlgebra+Operations.swift | 589 ++ ...redSet+Partial SetAlgebra+Predicates.swift | 551 ++ .../OrderedSet+RandomAccessCollection.swift | 300 + .../OrderedSet+ReserveCapacity.swift | 129 + .../OrderedSet/OrderedSet+SubSequence.swift | 355 + .../OrderedSet/OrderedSet+Testing.swift | 128 + .../OrderedSet/OrderedSet+UnorderedView.swift | 987 ++ .../OrderedSet+UnstableInternals.swift | 48 + .../OrderedSet/OrderedSet.swift | 497 + .../RandomAccessCollection+Offsets.swift | 30 + .../Utilities/_UnsafeBitset.swift | 395 + .../AssertionContexts/Assertions.swift | 404 + .../CollectionTestCase.swift | 30 + .../AssertionContexts/Combinatorics.swift | 183 + .../AssertionContexts/TestContext.swift | 259 + .../CheckBidirectionalCollection.swift | 147 + .../ConformanceCheckers/CheckCollection.swift | 270 + .../ConformanceCheckers/CheckComparable.swift | 176 + .../ConformanceCheckers/CheckEquatable.swift | 116 + .../ConformanceCheckers/CheckHashable.swift | 124 + .../ConformanceCheckers/CheckSequence.swift | 96 + .../MinimalBidirectionalCollection.swift | 143 + .../MinimalTypes/MinimalCollection.swift | 137 + .../MinimalTypes/MinimalDecoder.swift | 756 ++ .../MinimalTypes/MinimalEncoder.swift | 716 ++ .../MinimalTypes/MinimalIndex.swift | 59 + .../MinimalTypes/MinimalIterator.swift | 54 + ...MinimalMutableRandomAccessCollection.swift | 182 + ...ngeReplaceableRandomAccessCollection.swift | 249 + .../MinimalRandomAccessCollection.swift | 125 + ...ngeReplaceableRandomAccessCollection.swift | 204 + .../MinimalTypes/MinimalSequence.swift | 96 + .../MinimalTypes/ResettableValue.swift | 37 + .../MinimalTypes/StringConvertibleValue.swift | 34 + .../MinimalTypes/_CollectionState.swift | 241 + .../MinimalTypes/_MinimalCollectionCore.swift | 349 + .../Utilities/Box.swift | 16 + .../Utilities/HashableBox.swift | 24 + .../Utilities/LifetimeTracked.swift | 77 + .../Utilities/LifetimeTracker.swift | 54 + .../SeedableRandomNumberGenerator.swift | 40 + .../MinimalTypeConformances.swift | 44 + .../Tests/DequeTests/DequeInternals.swift | 83 + .../Tests/DequeTests/DequeTests.swift | 374 + .../DequeTests/MutableCollectionTests.swift | 163 + .../RangeReplaceableCollectionTests.swift | 496 + .../HashTable/BitsetTests.swift | 187 + .../HashTable/HashTableTests.swift | 618 ++ .../OrderedDictionary Tests.swift | 1364 +++ .../OrderedDictionary Utils.swift | 30 + .../OrderedDictionary+Elements Tests.swift | 493 + .../OrderedDictionary+Values Tests.swift | 212 + .../OrderedSet/OrderedSet Diffing Tests.swift | 143 + .../OrderedSet.UnorderedView Tests.swift | 78 + .../OrderedSet/OrderedSetInternals.swift | 81 + .../OrderedSet/OrderedSetTests.swift | 1363 +++ .../RandomAccessCollection+Offsets.swift | 61 + .../swift-collections/Utils/run-benchmarks.sh | 40 + .../swift-collections/Utils/run-full-tests.sh | 145 + .../Utils/shuffle-sources.sh | 48 + .../contents.xcworkspacedata | 13 + .../xcshareddata/IDETemplateMacros.plist | 17 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/Collections.xcscheme | 143 + .../xcschemes/CollectionsBenchmark.xcscheme | 81 + .../xcschemes/CollectionsTestSupport.xcscheme | 78 + .../xcschemes/DequeModule.xcscheme | 95 + .../xcschemes/OrderedCollections.xcscheme | 81 + .../xcshareddata/xcschemes/benchmark.xcscheme | 81 + .../swift-collections-Package.xcscheme | 185 + ...ift-collections-benchmark-Package.xcscheme | 100 + .../cmake/modules/CMakeLists.txt | 19 + .../modules/SwiftCollectionsConfig.cmake.in | 12 + .../cmake/modules/SwiftSupport.cmake | 100 + .../.github/workflows/api-docs.yml | 18 + .../.github/workflows/main-codecov.yml | 9 + .../.github/workflows/projectboard.yml | 31 + .../websocket-kit/.github/workflows/test.yml | 41 + Carthage/Checkouts/websocket-kit/.gitignore | 7 + Carthage/Checkouts/websocket-kit/LICENSE | 21 + Carthage/Checkouts/websocket-kit/NOTICES.txt | 19 + .../Checkouts/websocket-kit/Package.swift | 36 + Carthage/Checkouts/websocket-kit/README.md | 24 + .../Concurrency/WebSocket+Concurrency.swift | 145 + .../Sources/WebSocketKit/Exports.swift | 10 + .../HTTPInitialRequestHandler.swift | 61 + .../WebSocketKit/WebSocket+Connect.swift | 66 + .../Sources/WebSocketKit/WebSocket.swift | 323 + .../WebSocketKit/WebSocketClient.swift | 173 + .../WebSocketKit/WebSocketHandler.swift | 77 + .../AsyncWebSocketKitTests.swift | 55 + .../WebSocketKitTests/SSLTestHelpers.swift | 142 + .../WebSocketKitTests/WebSocketKitTests.swift | 341 + Web3.xcodeproj/project.pbxproj | 864 ++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + Web3/Web3.h | 18 + Web3Tests/Web3Tests.swift | 36 + 1809 files changed, 508988 insertions(+) create mode 100644 Cartfile create mode 100644 "Cartfile \353\263\265\354\202\254\353\263\270" create mode 100644 Cartfile.resolved create mode 100644 Carthage/Checkouts/Alamofire/.dockerignore create mode 100644 Carthage/Checkouts/Alamofire/.github/FUNDING.yml create mode 100644 Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/config.yml create mode 100644 Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 Carthage/Checkouts/Alamofire/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 Carthage/Checkouts/Alamofire/.github/workflows/ci.yml create mode 100644 Carthage/Checkouts/Alamofire/.gitignore create mode 100644 Carthage/Checkouts/Alamofire/.jazzy.yaml create mode 100644 Carthage/Checkouts/Alamofire/.ruby-gemset create mode 100644 Carthage/Checkouts/Alamofire/.ruby-version create mode 100644 Carthage/Checkouts/Alamofire/.swiftformat create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.podspec create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire iOS.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire macOS.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire tvOS.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire visionOS.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire watchOS.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/Alamofire/CHANGELOG.md create mode 100644 Carthage/Checkouts/Alamofire/CONTRIBUTING.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/AdvancedUsage.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/Alamofire 2.0 Migration Guide.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/Alamofire 3.0 Migration Guide.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/Alamofire 4.0 Migration Guide.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/Alamofire 5.0 Migration Guide.md create mode 100644 Carthage/Checkouts/Alamofire/Documentation/Usage.md create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/LaunchScreen.storyboard create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/Main.storyboard create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Logo.png create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Logo@2x.png create mode 100644 Carthage/Checkouts/Alamofire/Example/Resources/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/Example/Source/AppDelegate.swift create mode 100644 Carthage/Checkouts/Alamofire/Example/Source/DetailViewController.swift create mode 100644 Carthage/Checkouts/Alamofire/Example/Source/MasterViewController.swift create mode 100644 Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme create mode 100644 Carthage/Checkouts/Alamofire/Gemfile create mode 100644 Carthage/Checkouts/Alamofire/Gemfile.lock create mode 100644 Carthage/Checkouts/Alamofire/LICENSE create mode 100644 Carthage/Checkouts/Alamofire/Package.swift create mode 100644 Carthage/Checkouts/Alamofire/Package@swift-5.5.swift create mode 100644 Carthage/Checkouts/Alamofire/Package@swift-5.6.swift create mode 100644 Carthage/Checkouts/Alamofire/Package@swift-5.7.swift create mode 100644 Carthage/Checkouts/Alamofire/Package@swift-5.8.swift create mode 100644 Carthage/Checkouts/Alamofire/README.md create mode 100644 Carthage/Checkouts/Alamofire/Resources/AlamofireLogo.png create mode 100644 Carthage/Checkouts/Alamofire/Resources/MacStadiumLogo.png create mode 100644 Carthage/Checkouts/Alamofire/Source/AFError.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/AlamofireExtended.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/AuthenticationInterceptor.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/CachedResponseHandler.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Combine.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Concurrency.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/DispatchQueue+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/EventMonitor.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/HTTPHeaders.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/HTTPMethod.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/Source/MultipartFormData.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/MultipartUpload.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/NetworkReachabilityManager.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Notifications.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/OperationQueue+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/ParameterEncoder.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/ParameterEncoding.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Protected.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/RedirectHandler.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Request.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/RequestCompression.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/RequestInterceptor.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/RequestTaskMap.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Response.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/ResponseSerialization.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Result+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/RetryPolicy.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/ServerTrustEvaluation.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Session.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/SessionDelegate.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/StringEncoding+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/URLConvertible+URLRequestConvertible.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/URLEncodedFormEncoder.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/URLRequest+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/URLSessionConfiguration+Alamofire.swift create mode 100644 Carthage/Checkouts/Alamofire/Source/Validation.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/AFError+AlamofireTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/AuthenticationInterceptorTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/AuthenticationTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/BaseTestCase.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Bundle+AlamofireTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/CacheTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/CachedResponseHandlerTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/CombineTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ConcurrencyTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/DataStreamTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/DownloadTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/FileManager+AlamofireTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/HTTPHeadersTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/Tests/InternalRequestTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/LeaksTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/MultipartFormDataTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/NSLoggingEventMonitor.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/NetworkReachabilityManagerTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ParameterEncoderTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ParameterEncodingTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ProtectedTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/RedirectHandlerTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Request+AlamofireTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/RequestInterceptorTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/RequestModifierTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/RequestTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-root-ca.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca1.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca2.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/expired.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/missing-dns-name-and-uri.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/multiple-dns-names.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/signed-by-ca1.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/signed-by-ca2.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/test.alamofire.org.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/valid-dns-name.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/valid-uri.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/wildcard.alamofire.org.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-1.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-2.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-leaf.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-root-ca.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.crt create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.der create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.cer create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.crt create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/keyDER.der create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/randomGibberish.crt create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Images/rainbow.jpg create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Images/unicorn.png create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/JSON/empty_data.json create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/JSON/invalid_data.json create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/JSON/valid_data.json create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/String/empty_string.txt create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/String/utf32_string.txt create mode 100644 Carthage/Checkouts/Alamofire/Tests/Resources/Responses/String/utf8_string.txt create mode 100644 Carthage/Checkouts/Alamofire/Tests/ResponseSerializationTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ResponseTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Result+AlamofireTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/RetryPolicyTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ServerTrustEvaluatorTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/SessionDelegateTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/SessionTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/TLSEvaluationTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-NoTS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-Old.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS-NoTS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-NoTS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-Old.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/visionOS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS-NoTS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS.xctestplan create mode 100644 Carthage/Checkouts/Alamofire/Tests/TestHelpers.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/URLProtocolTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/UploadTests.swift create mode 100644 Carthage/Checkouts/Alamofire/Tests/ValidationTests.swift create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Adapter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/AlamofireNotifications.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor/RefreshWindow.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/ClosureEventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/CompositeEventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/CompositeTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/ConnectionLostRetryPolicy.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/CancellationToken.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Completion.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Event.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Stream.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DecodableResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DefaultTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DisabledEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DisabledTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Downloadable.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Options.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Interceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/JSONParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/JSONResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/MultipartFormData.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/MultipartUpload.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/ConnectionType.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/PinnedCertificatesTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/PublicKeysTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Request.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Request/ResponseDisposition.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Request/State.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Retrier.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/RetryPolicy.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator/Options.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/ServerTrustManager.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/Session.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/SessionDelegate.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/StringResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/ArrayEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/BoolEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DataEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DateEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyPathEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/NilEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/SpaceEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder/Destination.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest/Uploadable.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AF.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/MultipartEncodingFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncodingFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseSerializationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseValidationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason/Output.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/URLRequestValidationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AFError/UnexpectedInputStreamLength.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/AuthenticationError.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/HTTPMethod.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/Result.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Enums/RetryResult.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Array.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Bundle.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/CharacterSet.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Collection.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/DispatchQueue.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/HTTPURLResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Notification.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/NotificationCenter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/OperationQueue.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/Result.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/SCNetworkReachabilityFlags.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/SecTrust.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/String.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/URL.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/URLComponents.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/URLRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Extensions/URLSessionConfiguration.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Functions.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Global Variables.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/AlamofireExtended.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/AuthenticationCredential.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/Authenticator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/CachedResponseHandler.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/DataDecoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/DataPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/DataResponseSerializerProtocol.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/DataStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/DownloadResponseSerializerProtocol.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/EmptyResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/EventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/RedirectHandler.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/RequestAdapter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/RequestDelegate.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/RequestInterceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/RequestRetrier.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/ResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/ServerTrustEvaluating.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/SessionStateProvider.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/URLConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/URLRequestConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Protocols/UploadableConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/AlamofireExtension.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DataResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DataResponsePublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DataStreamPublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DataStreamTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DataTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DecodableStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponsePublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/DownloadTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/Empty.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/GoogleXSSIPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeader.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeaders.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/HTTPMethod.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/PassthroughPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/PassthroughStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/Redirector.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/Redirector/Behavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/RequestAdapterState.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher/Behavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/StreamOf.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/StreamOf/Iterator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/StringStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/ArrayEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/BoolEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/Destination.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Structs/URLResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/Typealiases.html create mode 100644 Carthage/Checkouts/Alamofire/docs/badge.svg create mode 100644 Carthage/Checkouts/Alamofire/docs/css/highlight.css create mode 100644 Carthage/Checkouts/Alamofire/docs/css/jazzy.css create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Adapter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AlamofireNotifications.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor/RefreshWindow.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ClosureEventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeEventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ConnectionLostRetryPolicy.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/CancellationToken.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Completion.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Event.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Stream.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DecodableResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DefaultTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Downloadable.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Options.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Interceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartFormData.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartUpload.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/ConnectionType.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PinnedCertificatesTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PublicKeysTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/ResponseDisposition.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/State.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Retrier.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RetryPolicy.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator/Options.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ServerTrustManager.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Session.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/SessionDelegate.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/StringResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/ArrayEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/BoolEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DataEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DateEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyPathEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/NilEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/SpaceEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder/Destination.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest/Uploadable.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AF.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/MultipartEncodingFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncodingFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseSerializationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseValidationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason/Output.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/URLRequestValidationFailureReason.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/UnexpectedInputStreamLength.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AuthenticationError.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/HTTPMethod.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/Result.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/RetryResult.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Array.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Bundle.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/CharacterSet.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Collection.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/HTTPURLResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Notification.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/NotificationCenter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/OperationQueue.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Result.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SCNetworkReachabilityFlags.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SecTrust.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/String.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URL.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLComponents.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLRequest.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLSessionConfiguration.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Functions.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Global Variables.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AlamofireExtended.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AuthenticationCredential.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/Authenticator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/CachedResponseHandler.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataDecoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataResponseSerializerProtocol.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DownloadResponseSerializerProtocol.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EmptyResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EventMonitor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoder.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RedirectHandler.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestAdapter.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestDelegate.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestInterceptor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestRetrier.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ServerTrustEvaluating.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/SessionStateProvider.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLRequestConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/UploadableConvertible.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/AlamofireExtension.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponsePublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamPublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DecodableStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponse.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponsePublisher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadTask.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Empty.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/GoogleXSSIPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeader.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeaders.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPMethod.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding/Error.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughPreprocessor.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector/Behavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/RequestAdapterState.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher/Behavior.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf/Iterator.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StringStreamSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/ArrayEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/BoolEncoding.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/Destination.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLResponseSerializer.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Typealiases.html create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/badge.svg create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/carat.png create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/dash.png create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/gh.png create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/index.html create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100755 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/search.json create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/undocumented.json create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/docSet.dsidx create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.tgz create mode 100644 Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.xml create mode 100755 Carthage/Checkouts/Alamofire/docs/img/carat.png create mode 100755 Carthage/Checkouts/Alamofire/docs/img/dash.png create mode 100755 Carthage/Checkouts/Alamofire/docs/img/gh.png create mode 100644 Carthage/Checkouts/Alamofire/docs/img/spinner.gif create mode 100644 Carthage/Checkouts/Alamofire/docs/index.html create mode 100755 Carthage/Checkouts/Alamofire/docs/js/jazzy.js create mode 100644 Carthage/Checkouts/Alamofire/docs/js/jazzy.search.js create mode 100755 Carthage/Checkouts/Alamofire/docs/js/jquery.min.js create mode 100755 Carthage/Checkouts/Alamofire/docs/js/lunr.min.js create mode 100644 Carthage/Checkouts/Alamofire/docs/js/typeahead.jquery.js create mode 100644 Carthage/Checkouts/Alamofire/docs/search.json create mode 100644 Carthage/Checkouts/Alamofire/docs/undocumented.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Base.lproj/Interface.storyboard create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ContentView.swift create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ExtensionDelegate.swift create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/HostingController.swift create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Info.plist create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Networking.swift create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/xcshareddata/xcschemes/watchOS Example WatchKit App.xcscheme create mode 100644 Carthage/Checkouts/BigInt/.codecov.yml create mode 100644 Carthage/Checkouts/BigInt/.github/workflows/jazzy.yml create mode 100644 Carthage/Checkouts/BigInt/.github/workflows/swift.yml create mode 100644 Carthage/Checkouts/BigInt/.gitignore create mode 100644 Carthage/Checkouts/BigInt/.jazzy.yml create mode 100644 Carthage/Checkouts/BigInt/.swift-version create mode 100644 Carthage/Checkouts/BigInt/BigInt.podspec create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/BigInt.xcscmblueprint create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3714311D-5102-4569-B213-8DC87DC6C2F3.plist create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3B06D4DF-FC61-43AE-8115-CA5059B5AB1B.plist create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/E75E9014-DB8C-4424-B05B-83660CCFB7ED.plist create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/Info.plist create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt Benchmark.xcscheme create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-iOS.xcscheme create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-macOS.xcscheme create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-tvOS.xcscheme create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-watchOS.xcscheme create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/BigInt.xcscmblueprint create mode 100644 Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/BigInt/CHANGELOG.md create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Contents.o create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/timeline.xctimeline create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/timeline.xctimeline create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/timeline.xctimeline create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/timeline.xctimeline create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/Contents.swift create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/timeline.xctimeline create mode 100644 Carthage/Checkouts/BigInt/Demo.playground/contents.xcplayground create mode 100644 Carthage/Checkouts/BigInt/LICENSE.md create mode 100644 Carthage/Checkouts/BigInt/Package.swift create mode 100644 Carthage/Checkouts/BigInt/README.md create mode 100644 Carthage/Checkouts/BigInt/Sources/Addition.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/BigInt.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/BigUInt.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Bitwise Ops.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Codable.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Comparable.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Data Conversion.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Division.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Exponentiation.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Floating Point Conversion.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/GCD.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Hashable.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Info.plist create mode 100644 Carthage/Checkouts/BigInt/Sources/Integer Conversion.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Multiplication.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Prime Test.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Random.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Shifts.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Square Root.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Strideable.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/String Conversion.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Subtraction.swift create mode 100644 Carthage/Checkouts/BigInt/Sources/Words and Bits.swift create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/BigIntTests.swift create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/BigUIntTests.swift create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/Info.plist create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/ProfileTests.swift create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/Tools.swift create mode 100644 Carthage/Checkouts/BigInt/Tests/BigIntTests/WordTests.swift create mode 100644 Carthage/Checkouts/BigInt/docs/Extensions.html create mode 100644 Carthage/Checkouts/BigInt/docs/Extensions/BinaryFloatingPoint.html create mode 100644 Carthage/Checkouts/BigInt/docs/Extensions/String.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs/BigInt.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs/BigInt/Sign.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs/BigInt/Words.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs/BigUInt.html create mode 100644 Carthage/Checkouts/BigInt/docs/Structs/BigUInt/Words.html create mode 100644 Carthage/Checkouts/BigInt/docs/badge.svg create mode 100644 Carthage/Checkouts/BigInt/docs/css/highlight.css create mode 100644 Carthage/Checkouts/BigInt/docs/css/jazzy.css create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Info.plist create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/BinaryFloatingPoint.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/String.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Sign.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Words.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt/Words.html create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/carat.png create mode 100755 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/dash.png create mode 100755 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/gh.png create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/index.html create mode 100755 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/search.json create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/docSet.dsidx create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.tgz create mode 100644 Carthage/Checkouts/BigInt/docs/docsets/BigInt.xml create mode 100755 Carthage/Checkouts/BigInt/docs/img/carat.png create mode 100755 Carthage/Checkouts/BigInt/docs/img/dash.png create mode 100755 Carthage/Checkouts/BigInt/docs/img/gh.png create mode 100644 Carthage/Checkouts/BigInt/docs/img/spinner.gif create mode 100644 Carthage/Checkouts/BigInt/docs/index.html create mode 100755 Carthage/Checkouts/BigInt/docs/js/jazzy.js create mode 100644 Carthage/Checkouts/BigInt/docs/js/jazzy.search.js create mode 100644 Carthage/Checkouts/BigInt/docs/js/jquery.min.js create mode 100644 Carthage/Checkouts/BigInt/docs/js/lunr.min.js create mode 100644 Carthage/Checkouts/BigInt/docs/js/typeahead.jquery.js create mode 100644 Carthage/Checkouts/BigInt/docs/search.json create mode 100644 Carthage/Checkouts/BigInt/docs/undocumented.json create mode 100644 Carthage/Checkouts/BigInt/images/BigInt.sketch create mode 100644 Carthage/Checkouts/BigInt/images/banner.png create mode 100644 Carthage/Checkouts/BigInt/version.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/.github/CODEOWNERS create mode 100644 Carthage/Checkouts/CryptoSwift/.github/FUNDING.yml create mode 100644 Carthage/Checkouts/CryptoSwift/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 Carthage/Checkouts/CryptoSwift/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 Carthage/Checkouts/CryptoSwift/.github/workflows/linux.yml create mode 100644 Carthage/Checkouts/CryptoSwift/.github/workflows/macos.yml create mode 100644 Carthage/Checkouts/CryptoSwift/.gitignore create mode 100644 Carthage/Checkouts/CryptoSwift/.mailmap create mode 100644 Carthage/Checkouts/CryptoSwift/.spi.yml create mode 100644 Carthage/Checkouts/CryptoSwift/.swiftformat create mode 100644 Carthage/Checkouts/CryptoSwift/CHANGELOG create mode 100644 Carthage/Checkouts/CryptoSwift/CNAME create mode 100644 Carthage/Checkouts/CryptoSwift/CODE_OF_CONDUCT.md create mode 100644 Carthage/Checkouts/CryptoSwift/CONTRIBUTING.md create mode 100644 Carthage/Checkouts/CryptoSwift/CONTRIBUTORS.txt create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/AppDelegate.swift create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Default-568h@2x.png create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Info.plist create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.podspec create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/CryptoSwift.xcscmblueprint create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 120000 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/IDETemplateMacros.plist create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift-TestHostApp.xcscheme create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift.xcscheme create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-Mac.xcscheme create mode 100644 Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-iOS.xcscheme create mode 100644 Carthage/Checkouts/CryptoSwift/IDETemplateMacros.plist create mode 100644 Carthage/Checkouts/CryptoSwift/Info.plist create mode 100644 Carthage/Checkouts/CryptoSwift/LICENSE create mode 100644 Carthage/Checkouts/CryptoSwift/Makefile create mode 100644 Carthage/Checkouts/CryptoSwift/Package.swift create mode 100644 Carthage/Checkouts/CryptoSwift/README.md create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift.h create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEAD.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEADChaCha20Poly1305.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.Cryptors.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Decoder.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Encoder.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Scanner.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Array+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Authenticator.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BatchedCollection.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Bit.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockCipher.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockDecryptor.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockEncryptor.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockMode.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockModeOptions.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CBC.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CCM.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CFB.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CTR.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CipherModeWorker.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/ECB.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/GCM.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/OCB.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/OFB.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/PCBC.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Blowfish.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CBCMAC.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CMAC.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Addition.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigInt.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigUInt.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Bitwise Ops.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/CS.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Codable.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Comparable.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Data Conversion.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Division.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Exponentiation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Floating Point Conversion.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/GCD.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Hashable.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Integer Conversion.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Multiplication.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Prime Test.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Random.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Shifts.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Square Root.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Strideable.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/String Conversion.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Subtraction.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Words and Bits.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ChaCha20.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Checksum.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cipher.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Collection+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CompactMap.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptor.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptors.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Digest.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/DigestType.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/AES+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Array+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Blowfish+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/ChaCha20+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Data+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/HMAC+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Rabbit+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/String+FoundationExtension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Utils+Foundation.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Generics.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HKDF.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HMAC.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ISO10126Padding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ISO78164Padding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Int+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/MD5.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/NoPadding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Operators.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PEM/DER.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PBKDF1.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PBKDF2.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS1v15.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS5.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7Padding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Padding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Poly1305.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA+Cipher.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA+Signature.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Rabbit.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA1.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA2.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA3.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Scrypt.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SecureBytes.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Signature.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamDecryptor.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamEncryptor.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/String+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt128.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt16+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt32+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt64+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt8+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Updatable.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Utils.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ZeroPadding.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESCCMTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESOCBTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ASN1Tests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Access.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/BlowfishTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Bridging.h create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CBCMacTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CMACTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Poly1305Tests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Tests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20TestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Error+Extension.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTest.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTestPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HKDFTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HMACTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDF.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDFPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PaddingTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Poly1305Tests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSASecKeyTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSATests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/SHATestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ScryptTests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ScryptTestsPerf.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/XCTestManifests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/LinuxMain.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/Bridging.h create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/TestsPerformance.swift create mode 100644 Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/XCTestManifests.swift create mode 100644 Carthage/Checkouts/CryptoSwift/_config.yml create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Debug.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Release.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Shared.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Test.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Shared.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Test.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/Project-Debug.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/Project-Release.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/Project-Shared.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/Tests-Shared.xcconfig create mode 100644 Carthage/Checkouts/CryptoSwift/config/Tests-Test.xcconfig create mode 100755 Carthage/Checkouts/CryptoSwift/scripts/build-framework.sh create mode 100755 Carthage/Checkouts/CryptoSwift/scripts/generate-contributors-list.sh create mode 100755 Carthage/Checkouts/CryptoSwift/scripts/swiftformat.sh create mode 100644 Carthage/Checkouts/PromiseKit/.github/FUNDING.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/ISSUE_TEMPLATE.md create mode 100644 Carthage/Checkouts/PromiseKit/.github/LinuxMain.stencil create mode 100644 Carthage/Checkouts/PromiseKit/.github/codecov.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/jazzy.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/ranger.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/sourcery.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/workflows/cd.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/workflows/ci-podspec.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/workflows/ci.yml create mode 100644 Carthage/Checkouts/PromiseKit/.github/workflows/publish.yml create mode 100644 Carthage/Checkouts/PromiseKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/.gitmodules create mode 100644 Carthage/Checkouts/PromiseKit/.tidelift.yml create mode 100644 Carthage/Checkouts/PromiseKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Appendix.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/CommonPatterns.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Examples/ImageCache.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Examples/URLSession+BadResponseErrors.swift create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Examples/detweet.swift create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/FAQ.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/GettingStarted.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Installation.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/ObjectiveC.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/README.md create mode 100644 Carthage/Checkouts/PromiseKit/Documentation/Troubleshooting.md create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/xcshareddata/xcschemes/PMKAVFoundation.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/xcshareddata/xcschemes/PMKAccounts.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Accounts/Tests/TestAccounts.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/xcshareddata/xcschemes/PMKAddressBook.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Sources/ABAddressBookRequestAccess+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Tests/TestAddressBook.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.private create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/xcshareddata/xcschemes/PMKAlamofire.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package@swift-4.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Sources/Alamofire+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Tests/TestAlamofire.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/xcshareddata/xcschemes/PMKAssetsLibrary.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Sources/ALAssetsLibrary+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Default-568h@2x.png create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Entitlements.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/TestUIImagePickerController.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/app.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/xcshareddata/xcschemes/PMKBolts.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Sources/BFTask+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Bolts/Tests/TestBolts.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/xcshareddata/xcschemes/PMKCloudKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-4.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-5.0.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/PMKCloudKit.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/TestCloudKit.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/xcshareddata/xcschemes/PMKCoreBluetooth.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Sources/CBCentralManager+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Tests/CBTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/xcshareddata/xcschemes/PMKCoreLocation.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/PMKCoreLocation.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLGeocoderTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLLocationManagerTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/Entitlements.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/xcshareddata/xcschemes/PMKEventKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Sources/EKEventStore+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/Entitlements.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/TestEventKit.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/.codecov.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.private create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/xcshareddata/xcschemes/PMKFoundation.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-4.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-5.0.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSObject+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/PMKFoundation.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/Process+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/afterlife.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSNotificationCenter.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSObject.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSTask.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/xcshareddata/xcschemes/PMKHealthKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Sources/HealthKit+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Tests/TestHealthKit.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/xcshareddata/xcschemes/PMKHomeKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMAcessoryBrowser+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMActionSet+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMCharacteristic+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMEventTrigger+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHome+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHomeManager+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMTrigger+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/Utils.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/Entitlements.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/HMAccessoryBrowserTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/UtilsTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/xcshareddata/xcschemes/PMKMapKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/PMKMapKit.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MapKit/Tests/TestMapKit.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/xcshareddata/xcschemes/PMKMessagesUI.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMailComposeViewController+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMessageComposeViewController+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Tests/TestMessageUI.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.private create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/xcshareddata/xcschemes/PMKOMGHTTPURLRQ.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/PMKOMGHTTPURLRQ.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/xcshareddata/xcschemes/PMKPhotos.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Sources/PHPhotoLibrary+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Photos/Tests/PHPhototLibraryTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/PMKQCTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/xcshareddata/xcschemes/PMKQuartzCore.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/PMKQuartzCore.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/xcshareddata/xcschemes/PMKSocial.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/PMKSocial.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLComposeViewController+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSLComposeViewController.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/xcshareddata/xcschemes/PMKStoreKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package@4.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/PMKStoreKit.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPayment+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPaymentQueue+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKProductsRequest+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKReceiptRefreshRequest+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/xcshareddata/xcschemes/PMKSystemConfiguration.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/PMKSystemConfiguration.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Tests/SCTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/xcshareddata/xcschemes/PMKUIKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/PMKUIKit.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIImagePickerController+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewPropertyAnimator+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIImagePickerController.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIView.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIViewController.m create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/infrastructure.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Default-568h@2x.png create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Entitlements.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/TestUIImagePickerController.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/app.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.travis.yml create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile.resolved create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Carthage.xcconfig create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/xcshareddata/xcschemes/PMKWatchConnectivity.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/README.markdown create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Sources/WCSession+Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Tests/TestWatchConnectivity.swift create mode 100644 Carthage/Checkouts/PromiseKit/LICENSE create mode 100644 Carthage/Checkouts/PromiseKit/Package.swift create mode 100644 Carthage/Checkouts/PromiseKit/Package@swift-4.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Package@swift-5.0.swift create mode 100644 Carthage/Checkouts/PromiseKit/Package@swift-5.3.swift create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.playground/Contents.swift create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.playground/contents.xcplayground create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.podspec create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/xcshareddata/xcschemes/PromiseKit.xcscheme create mode 100644 Carthage/Checkouts/PromiseKit/README.md create mode 100644 Carthage/Checkouts/PromiseKit/Sources/AnyPromise+Private.h create mode 100644 Carthage/Checkouts/PromiseKit/Sources/AnyPromise.h create mode 100644 Carthage/Checkouts/PromiseKit/Sources/AnyPromise.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/AnyPromise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Async.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Box.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Catchable.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Configuration.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/CustomStringConvertible.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Deprecations.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Error.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Guarantee.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Info.plist create mode 100644 Carthage/Checkouts/PromiseKit/Sources/LogEvent.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/NSMethodSignatureForBlock.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/PMKCallVariadicBlock.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Promise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/PromiseKit.h create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Resolver.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/Thenable.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/after.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/after.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/dispatch_promise.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/firstly.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/fwd.h create mode 100644 Carthage/Checkouts/PromiseKit/Sources/hang.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/hang.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/join.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/race.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/race.swift create mode 100644 Carthage/Checkouts/PromiseKit/Sources/when.m create mode 100644 Carthage/Checkouts/PromiseKit/Sources/when.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/0.0.0.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.1.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.1.3.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.2.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.2.3.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.2.4.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.2.6.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.2.7.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.3.1.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.3.2.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/2.3.4.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/README.md create mode 100644 Carthage/Checkouts/PromiseKit/Tests/A+/XCTestManifests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.h create mode 100644 Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/HangTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/JoinTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/PMKManifoldTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/RaceTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CoreObjC/WhenTests.m create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/AfterTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/AsyncTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/CancellableErrorTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/CatchableTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/DefaultDispatchQueueTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/ErrorTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/GuaranteeTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/HangTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/LoggingTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/PromiseTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/RaceTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/RegressionTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/ResolverTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/StressTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/ThenableTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/Utilities.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenConcurrentTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenResolvedTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/XCTestManifests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/CorePromise/ZalgoTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/DeprecationTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/.gitignore create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/AllTests.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSAdapter.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSPromise.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSUtils.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/MockNodeEnvironment.swift create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/README.md create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/index.js create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/package-lock.json create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/package.json create mode 100644 Carthage/Checkouts/PromiseKit/Tests/JS-A+/webpack.config.js create mode 100644 Carthage/Checkouts/PromiseKit/Tests/LinuxMain.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/.gitignore create mode 100644 Carthage/Checkouts/secp256k1.swift/.gitmodules create mode 100644 Carthage/Checkouts/secp256k1.swift/.travis.yml create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Podfile create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Podfile.lock create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Local Podspecs/secp256k1.swift.podspec.json create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Manifest.lock create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.markdown create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-dummy.m create mode 100755 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-umbrella.h create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.debug.xcconfig create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.release.xcconfig create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-dummy.m create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-umbrella.h create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.debug.xcconfig create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.modulemap create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.release.xcconfig create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Tests/Info.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/Tests/Tests.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.pbxproj create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/xcshareddata/xcschemes/secp256k1-Example.xcscheme create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/AppDelegate.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/LaunchScreen.xib create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/Main.storyboard create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Info.plist create mode 100644 Carthage/Checkouts/secp256k1.swift/Example/secp256k1/ViewController.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/LICENSE create mode 100644 Carthage/Checkouts/secp256k1.swift/Package.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/README.md create mode 120000 Carthage/Checkouts/secp256k1.swift/_Pods.xcodeproj create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1.swift.podspec create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Assets/.gitkeep create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/.gitkeep create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/exporter/Exporter.swift create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1-config.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.gitignore create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.travis.yml create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/COPYING create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/Makefile.am create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/README.md create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/TODO create mode 100755 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/autogen.sh create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_jni_include_dir.m4 create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/bitcoin_secp.m4 create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/configure.ac create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_ecdh.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_recovery.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/libsecp256k1.pc.in create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/obj/.gitignore create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/group_prover.sage create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/secp256k1.sage create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/weierstrass_prover.sage create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/asm/field_10x26_arm.s create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/basic-config.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecdh.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecmult.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_internal.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_recover.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_sign.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_verify.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_asm_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_int128_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/gen_context.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/Secp256k1Context.java create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/Makefile.am.include create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/main_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/tests_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/Makefile.am.include create mode 100755 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/main_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/tests_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/secp256k1.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand_impl.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests_exhaustive.c create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/util.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_ec_mult_static_context.h create mode 100644 Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_main.h create mode 100755 Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/BUG_REPORT.md create mode 100755 Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md create mode 100644 Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/config.yml create mode 100644 Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE/NEW.md create mode 100644 Carthage/Checkouts/swift-collections/.gitignore create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/ArrayBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/CppBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DequeBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DictionaryBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Kalimba.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.json create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedDictionaryBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedSetBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/SetBenchmarks.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/DequeBenchmarks.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/Hashing.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedMapBenchmarks.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedSetBenchmarks.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/VectorBenchmarks.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/module.modulemap create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/CustomHash.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/DequeBenchmarks.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/Hashing.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedMapBenchmarks.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedSetBenchmarks.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/VectorBenchmarks.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.cpp create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.h create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/Package.swift create mode 100644 Carthage/Checkouts/swift-collections/Benchmarks/benchmark-tool/main.swift create mode 100644 Carthage/Checkouts/swift-collections/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/CODEOWNERS create mode 100644 Carthage/Checkouts/swift-collections/CODE_OF_CONDUCT.md create mode 100644 Carthage/Checkouts/swift-collections/CONTRIBUTING.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Library.json create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/README.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/01 Deque - random access lookups.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/02 Deque - prepending individual integers.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/03 OrderedSet lookups.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/04 OrderedSet insertions.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/05 OrderedDictionary lookups.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/06 OrderedDictionary insertions.png create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Theme.json create mode 100755 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/generate-results.sh create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/results.json create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Deque.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Internals/README.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/Internals/ReleaseChecklist.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/OrderedDictionary.md create mode 100644 Carthage/Checkouts/swift-collections/Documentation/OrderedSet.md create mode 100644 Carthage/Checkouts/swift-collections/LICENSE.txt create mode 100644 Carthage/Checkouts/swift-collections/Package.swift create mode 100644 Carthage/Checkouts/swift-collections/README.md create mode 100644 Carthage/Checkouts/swift-collections/Sources/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/Sources/Collections/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/Sources/Collections/Collections.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Compatibility.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Codable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Collection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomDebugStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomReflectable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Equatable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+ExpressibleByArrayLiteral.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Extras.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Hashable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Testing.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._Storage.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._UnsafeHandle.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/UnsafeMutableBufferPointer+Utilities.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBuffer.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBufferHeader.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeSlot.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/DequeModule/_UnsafeWrappedBuffer.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Bucket.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+BucketIterator.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Constants.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+CustomStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Testing.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+UnsafeHandle.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_Hashtable+Header.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Codable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomDebugStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomReflectable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Deprecations.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements+SubSequence.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Equatable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+ExpressibleByDictionaryLiteral.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Hashable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Initializers.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Invariants.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial MutableCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial RangeReplaceableCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Sequence.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Values.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Codable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomDebugStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomReflectable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomStringConvertible.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Diffing.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Equatable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ExpressibleByArrayLiteral.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Hashable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Initializers.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Insertions.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Invariants.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial MutableCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial RangeReplaceableCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Basics.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Operations.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Predicates.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+RandomAccessCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ReserveCapacity.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+SubSequence.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Testing.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnorderedView.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnstableInternals.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/RandomAccessCollection+Offsets.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/_UnsafeBitset.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Assertions.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/CollectionTestCase.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Combinatorics.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/TestContext.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckBidirectionalCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckComparable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckEquatable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckHashable.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckSequence.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalBidirectionalCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalDecoder.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalEncoder.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIndex.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIterator.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRandomAccessCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRangeReplaceableRandomAccessCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRandomAccessCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRangeReplaceableRandomAccessCollection.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalSequence.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/ResettableValue.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/StringConvertibleValue.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_CollectionState.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_MinimalCollectionCore.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/Box.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/HashableBox.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracked.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracker.swift create mode 100644 Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/SeedableRandomNumberGenerator.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/CollectionsTestSupportTests/MinimalTypeConformances.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeInternals.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/DequeTests/MutableCollectionTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/DequeTests/RangeReplaceableCollectionTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/BitsetTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/HashTableTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Tests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Utils.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Elements Tests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Values Tests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet Diffing Tests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet.UnorderedView Tests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetInternals.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetTests.swift create mode 100644 Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/RandomAccessCollection+Offsets.swift create mode 100755 Carthage/Checkouts/swift-collections/Utils/run-benchmarks.sh create mode 100755 Carthage/Checkouts/swift-collections/Utils/run-full-tests.sh create mode 100755 Carthage/Checkouts/swift-collections/Utils/shuffle-sources.sh create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/contents.xcworkspacedata create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDETemplateMacros.plist create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/Collections.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsBenchmark.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsTestSupport.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/DequeModule.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/OrderedCollections.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/benchmark.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-Package.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-benchmark-Package.xcscheme create mode 100644 Carthage/Checkouts/swift-collections/cmake/modules/CMakeLists.txt create mode 100644 Carthage/Checkouts/swift-collections/cmake/modules/SwiftCollectionsConfig.cmake.in create mode 100644 Carthage/Checkouts/swift-collections/cmake/modules/SwiftSupport.cmake create mode 100644 Carthage/Checkouts/websocket-kit/.github/workflows/api-docs.yml create mode 100644 Carthage/Checkouts/websocket-kit/.github/workflows/main-codecov.yml create mode 100644 Carthage/Checkouts/websocket-kit/.github/workflows/projectboard.yml create mode 100644 Carthage/Checkouts/websocket-kit/.github/workflows/test.yml create mode 100644 Carthage/Checkouts/websocket-kit/.gitignore create mode 100644 Carthage/Checkouts/websocket-kit/LICENSE create mode 100644 Carthage/Checkouts/websocket-kit/NOTICES.txt create mode 100644 Carthage/Checkouts/websocket-kit/Package.swift create mode 100644 Carthage/Checkouts/websocket-kit/README.md create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Concurrency/WebSocket+Concurrency.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Exports.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/HTTPInitialRequestHandler.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket+Connect.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketClient.swift create mode 100644 Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketHandler.swift create mode 100644 Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/AsyncWebSocketKitTests.swift create mode 100644 Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/SSLTestHelpers.swift create mode 100644 Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/WebSocketKitTests.swift create mode 100644 Web3.xcodeproj/project.pbxproj create mode 100644 Web3.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Web3.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Web3/Web3.h create mode 100644 Web3Tests/Web3Tests.swift diff --git a/Cartfile b/Cartfile new file mode 100644 index 00000000..7b571562 --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "Alamofire/Alamofire" == 5.8.1 diff --git "a/Cartfile \353\263\265\354\202\254\353\263\270" "b/Cartfile \353\263\265\354\202\254\353\263\270" new file mode 100644 index 00000000..56ed2442 --- /dev/null +++ "b/Cartfile \353\263\265\354\202\254\353\263\270" @@ -0,0 +1,6 @@ +github "attaswift/BigInt" == 5.3.0 +github "krzyzanowskim/CryptoSwift" == 1.6.0 +github "Boilertalk/secp256k1.swift" == 0.1.7 +github "apple/swift-collections" == 1.0.3 +github "vapor/websocket-kit" == 2.6.1 +github "mxcl/PromiseKit" == 6.18.1 diff --git a/Cartfile.resolved b/Cartfile.resolved new file mode 100644 index 00000000..56ad396a --- /dev/null +++ b/Cartfile.resolved @@ -0,0 +1 @@ +github "Alamofire/Alamofire" "5.8.1" diff --git a/Carthage/Checkouts/Alamofire/.dockerignore b/Carthage/Checkouts/Alamofire/.dockerignore new file mode 100644 index 00000000..8e021dad --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.dockerignore @@ -0,0 +1,2 @@ +.build/ +.git/ diff --git a/Carthage/Checkouts/Alamofire/.github/FUNDING.yml b/Carthage/Checkouts/Alamofire/.github/FUNDING.yml new file mode 100644 index 00000000..7b009530 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [Alamofire, jshier] diff --git a/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/bug_report.md b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..bb167cec --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,39 @@ +--- +name: Bug Report +about: Create a report to help us improve +--- + +> ℹ Please fill out this template when filing an issue. +> All lines beginning with an ℹ symbol instruct you with what info we expect. You can delete those lines once you've filled in the info. +> +> Per our [*CONTRIBUTING guidelines](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md), we use GitHub for +> bugs and feature requests, not general support. Other issues should be opened on Stack Overflow with the tag `alamofire`. +> +> Please remove this line and everything above it before submitting. + +* [ ] I've read, understood, and done my best to follow the [*CONTRIBUTING guidelines](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md). + +## What did you do? + +ℹ Please replace this with what you did. + +## What did you expect to happen? + +ℹ Please replace this with what you expected to happen. + +## What happened instead? + +ℹ Please replace this with of what happened instead. + +## Alamofire Environment + +**Alamofire Version:** +**Dependency Manager:** +**Xcode Version:** +**Swift Version:** +**Platform(s) Running Alamofire:** +**macOS Version Running Xcode:** + +## Demo Project + +ℹ Please link to or upload a project we can download that reproduces the issue. diff --git a/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/config.yml b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..b21421c0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: General Questions + url: https://stackoverflow.com/questions/tagged/alamofire + about: Please ask and answer questions here. + - name: Discuss Alamofire + url: https://forums.swift.org/c/related-projects/alamofire/ + about: Discuss Alamofire best practices, advanced usage, and ideas for new features. + - name: Report Security Issues + url: mailto://security@alamofire.org + about: Please report security vulnerabilities here. diff --git a/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/feature_request.md b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..ad23ebb1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,29 @@ +--- +name: Feature Request +about: Suggest an idea for this project + +--- + +> ℹ Please fill out this template when filing a feature request. +> All lines beginning with an ℹ symbol instruct you with what info we expect. You can delete those lines once you've filled in the info. +> +> Feature requests should code examples whenever possible. +> +> Per our [*CONTRIBUTING guidelines](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md), we use GitHub for +> bugs and feature requests, not general support. Other issues should be opened on Stack Overflow with the tag `alamofire`. +> +> Please remove this line and everything above it before submitting. + +* [ ] I've read, understood, and done my best to follow the [*CONTRIBUTING guidelines](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md). + +## Problem + +ℹ Please replace this with a summary of the problem you're trying to solve. + +## Feature Request + +ℹ Please replace this with a summary of the feature you're requesting. + +## Value to Alamofire + +ℹ Please replace this with a summary of why you think this is something Alamofire should have, rather than it existing in your codebase or as a separate library. diff --git a/Carthage/Checkouts/Alamofire/.github/PULL_REQUEST_TEMPLATE.md b/Carthage/Checkouts/Alamofire/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..6e04c374 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,13 @@ +### Issue Link :link: + + +### Goals :soccer: + + + +### Implementation Details :construction: + + + +### Testing Details :mag: + diff --git a/Carthage/Checkouts/Alamofire/.github/workflows/ci.yml b/Carthage/Checkouts/Alamofire/.github/workflows/ci.yml new file mode 100644 index 00000000..a5ab96ef --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.github/workflows/ci.yml @@ -0,0 +1,362 @@ +name: "Alamofire CI" + +on: + push: + branches: + - master + - hotfix + paths: + - ".github/workflows/**" + - "Package.swift" + - "Source/**" + - "Tests/**" + pull_request: + paths: + - ".github/workflows/**" + - "Package.swift" + - "Source/**" + - "Tests/**" + +concurrency: + group: ${{ github.ref_name }} + cancel-in-progress: true +jobs: + macOS: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: "/Applications/${{ matrix.xcode }}.app/Contents/Developer" + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - xcode: "Xcode_15.0" + runsOn: firebreak + name: "macOS 13, Xcode 15.0, Swift 5.9.0" + testPlan: "macOS" + - xcode: "Xcode_14.3.1" + runsOn: firebreak + name: "macOS 13, Xcode 14.3.1, Swift 5.8.0" + testPlan: "macOS" + - xcode: "Xcode_14.2" + runsOn: macOS-12 + name: "macOS 12, Xcode 14.2, Swift 5.7.2" + testPlan: "macOS" + - xcode: "Xcode_14.1" + runsOn: macOS-12 + name: "macOS 12, Xcode 14.1, Swift 5.7.1" + testPlan: "macOS" + - xcode: "Xcode_14.0.1" + runsOn: macOS-12 + name: "macOS 12, Xcode 14.0.1, Swift 5.7.0" + testPlan: "macOS" + - xcode: "Xcode_13.4.1" + runsOn: macOS-12 + name: "macOS 12, Xcode 13.4.1, Swift 5.6.1" + testPlan: "macOS-NoTS" + - xcode: "Xcode_13.3.1" + runsOn: macOS-12 + name: "macOS 12, Xcode 13.3.1, Swift 5.6.0" + testPlan: "macOS-NoTS" + - xcode: "Xcode_13.2.1" + runsOn: macOS-11 + name: "macOS 11, Xcode 13.2.1, Swift 5.5.2" + testPlan: "macOS-NoTS" + - xcode: "Xcode_13.1" + runsOn: macOS-11 + name: "macOS 11, Xcode 13.1, Swift 5.5.1" + testPlan: "macOS-NoTS" + - xcode: "Xcode_13.0" + runsOn: macOS-11 + name: "macOS 11, Xcode 13.0, Swift 5.5.0" + testPlan: "macOS-NoTS" + steps: + - uses: actions/checkout@v4 + - name: ${{ matrix.name }} + run: |- + set -o pipefail + brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk + firewalk & + env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire macOS" -destination "platform=macOS" -testPlan "${{ matrix.testPlan }}" clean test | xcpretty + Catalyst: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: /Applications/${{ matrix.xcode }}.app/Contents/Developer + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - xcode: "Xcode_15.0" + name: "Catalyst 15.0" + runsOn: firebreak + - xcode: "Xcode_14.3.1" + name: "Catalyst 14.3.1" + runsOn: macOS-13 + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk && firewalk & + - name: Catalyst + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire iOS" -destination "platform=macOS" clean test 2>&1 | xcpretty + Beta: + name: ${{ matrix.name }} + runs-on: firebreak + env: + DEVELOPER_DIR: "/Applications/Xcode_15.1.app/Contents/Developer" + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - destination: "OS=1.0,name=Apple Vision Pro" + name: "visionOS 1.0" + testPlan: "visionOS" + scheme: "Alamofire visionOS" + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk && firewalk & + - name: ${{ matrix.name }} + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "${{ matrix.scheme }}" -destination "${{ matrix.destination }}" -testPlan "${{ matrix.testPlan }}" clean test 2>&1 | xcpretty + iOS: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: "/Applications/${{ matrix.xcode }}.app/Contents/Developer" + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - destination: "OS=17.0,name=iPhone 14 Pro" + name: "iOS 17.0" + testPlan: "iOS" + xcode: "Xcode_15.0" + runsOn: firebreak + - destination: "OS=16.4,name=iPhone 14 Pro" + name: "iOS 16.4" + testPlan: "iOS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + - destination: "OS=15.5,name=iPhone 13 Pro" + name: "iOS 15.5" + testPlan: "iOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: macOS-13 + - destination: "OS=14.5,name=iPhone 12 Pro" + name: "iOS 14.5" + testPlan: "iOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: macOS-13 + # - destination: "OS=13.7,name=iPhone 11 Pro" + # name: "iOS 13.7" + # testPlan: "iOS-NoTS" + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk && firewalk & + - name: ${{ matrix.name }} + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire iOS" -destination "${{ matrix.destination }}" -testPlan "${{ matrix.testPlan }}" clean test 2>&1 | xcpretty + tvOS: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: /Applications/${{ matrix.xcode }}.app/Contents/Developer + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - destination: "OS=17.0,name=Apple TV" + name: "tvOS 17.0" + testPlan: "tvOS" + xcode: "Xcode_15.0" + runsOn: firebreak + - destination: "OS=16.4,name=Apple TV" + name: "tvOS 16.4" + testPlan: "tvOS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + - destination: "OS=15.4,name=Apple TV" + name: "tvOS 15.4" + testPlan: "tvOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + - destination: "OS=14.5,name=Apple TV" + name: "tvOS 14.5" + testPlan: "tvOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + # - destination: "OS=13.4,name=Apple TV" + # name: "tvOS 13.4" + # testPlan: "tvOS-NoTS" + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk && firewalk & + - name: ${{ matrix.name }} + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire tvOS" -destination "${{ matrix.destination }}" -testPlan "${{ matrix.testPlan }}" clean test 2>&1 | xcpretty + watchOS: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: /Applications/${{ matrix.xcode }}.app/Contents/Developer + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - destination: "OS=10.0,name=Apple Watch Series 9 (45mm)" + name: "watchOS 10.0" + testPlan: "watchOS" + xcode: "Xcode_15.0" + runsOn: firebreak + - destination: "OS=9.4,name=Apple Watch Series 8 (45mm)" + name: "watchOS 9.4" + testPlan: "watchOS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + - destination: "OS=8.5,name=Apple Watch Series 7 (45mm)" + name: "watchOS 8.5" + testPlan: "watchOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + - destination: "OS=7.4,name=Apple Watch Series 6 (44mm)" + name: "watchOS 7.4" + testPlan: "watchOS-NoTS" + xcode: "Xcode_14.3.1" + runsOn: firebreak + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew update && brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk && firewalk & + - name: ${{ matrix.name }} + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire watchOS" -destination "${{ matrix.destination }}" -testPlan "${{ matrix.testPlan }}" clean test 2>&1 | xcpretty + SPM: + name: ${{ matrix.name }} + runs-on: ${{ matrix.runsOn }} + env: + DEVELOPER_DIR: "/Applications/${{ matrix.xcode }}.app/Contents/Developer" + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - xcode: "Xcode_15.0" + runsOn: firebreak + name: "macOS 13, SPM 5.9.0 Test" + - xcode: "Xcode_14.3.1" + runsOn: firebreak + name: "macOS 13, SPM 5.8.0 Test" + - xcode: "Xcode_14.2" + runsOn: macOS-12 + name: "macOS 12, SPM 5.7.2 Test" + - xcode: "Xcode_14.1" + runsOn: macOS-12 + name: "macOS 12, SPM 5.7.1 Test" + - xcode: "Xcode_14.0.1" + runsOn: macOS-12 + name: "macOS 12, SPM 5.7.0 Test" + - xcode: "Xcode_13.4.1" + runsOn: macOS-12 + name: "macOS 12, SPM 5.6.1 Test" + - xcode: "Xcode_13.3.1" + runsOn: macOS-12 + name: "macOS 12, SPM 5.6.0 Test" + - xcode: "Xcode_13.2.1" + runsOn: macOS-11 + name: "macOS 11, SPM 5.5.2 Test" + - xcode: "Xcode_13.1" + runsOn: macOS-11 + name: "macOS 11, SPM 5.5.1 Test" + - xcode: "Xcode_13.0" + runsOn: macOS-11 + name: "macOS 11, SPM 5.5.0 Test" + steps: + - uses: actions/checkout@v4 + - name: Install Firewalk + run: brew install alamofire/alamofire/firewalk || brew upgrade alamofire/alamofire/firewalk xcbeautify && firewalk & + - name: Test SPM + run: swift test -c debug + Linux: + name: Linux + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + include: + - image: swift:5.8-focal + - image: swift:5.8-jammy + - image: swift:5.8-centos7 + - image: swift:5.8-amazonlinux2 + - image: swift:5.8-rhel-ubi9 + - image: swift:5.9-focal + - image: swift:5.9-jammy + - image: swift:5.9-centos7 + - image: swift:5.9-amazonlinux2 + - image: swift:5.9-rhel-ubi9 + - image: swiftlang/swift:nightly-focal + - image: swiftlang/swift:nightly-jammy + - image: swiftlang/swift:nightly-amazonlinux2 + container: + image: ${{ matrix.image }} + timeout-minutes: 10 + steps: + - uses: actions/checkout@v3 + - name: ${{ matrix.image }} + run: swift build --build-tests -c debug + Android: + name: Android + uses: hggz/swift-android-sdk/.github/workflows/sdks.yml@ci + strategy: + fail-fast: false + with: + target-repo: ${{ github.repository }} + checkout-hash: ${{ github.sha }} + Windows: + name: ${{ matrix.name }} + runs-on: windows-latest + timeout-minutes: 10 + strategy: + fail-fast: false + matrix: + include: + - branch: swift-5.8-release + tag: 5.8-RELEASE + name: Windows Swift 5.8 + - branch: swift-5.9-release + tag: 5.9-RELEASE + name: Windows Swift 5.9 + steps: + - name: Setup + uses: compnerd/gha-setup-swift@main + with: + branch: ${{ matrix.branch }} + tag: ${{ matrix.tag }} + - name: Clone + uses: actions/checkout@v4 + - name: SPM ${{ matrix.name }} + run: | + swift build --build-tests -c debug -Xlinker /INCREMENTAL:NO -v + CodeQL: + name: Analyze with CodeQL + runs-on: macOS-13 + env: + DEVELOPER_DIR: "/Applications/Xcode_14.3.1.app/Contents/Developer" + timeout-minutes: 10 + steps: + - name: Clone + uses: actions/checkout@v4 + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: swift + - name: Build macOS + run: set -o pipefail && env NSUnbufferedIO=YES xcodebuild -project "Alamofire.xcodeproj" -scheme "Alamofire macOS" -destination "platform=macOS" clean build | xcpretty + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:swift" diff --git a/Carthage/Checkouts/Alamofire/.gitignore b/Carthage/Checkouts/Alamofire/.gitignore new file mode 100644 index 00000000..58b219cb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.gitignore @@ -0,0 +1,42 @@ +# Mac OS X +.DS_Store + +# Xcode + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +.build/ + +# Carthage +Carthage/Build +.UlyssesRoot +.Ulysses-Settings.plist +.Ulysses-Group.plist diff --git a/Carthage/Checkouts/Alamofire/.jazzy.yaml b/Carthage/Checkouts/Alamofire/.jazzy.yaml new file mode 100644 index 00000000..1fa4beb3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.jazzy.yaml @@ -0,0 +1,8 @@ +author: Alamofire Software Foundation +author_url: http://alamofire.org/ +github_url: https://github.com/Alamofire/Alamofire +root_url: https://alamofire.github.io/Alamofire/ +module: Alamofire +output: docs +theme: fullwidth +xcodebuild_arguments: [-workspace, 'Alamofire.xcworkspace', -scheme, 'Alamofire iOS'] diff --git a/Carthage/Checkouts/Alamofire/.ruby-gemset b/Carthage/Checkouts/Alamofire/.ruby-gemset new file mode 100644 index 00000000..bbc11e12 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.ruby-gemset @@ -0,0 +1 @@ +Alamofire diff --git a/Carthage/Checkouts/Alamofire/.ruby-version b/Carthage/Checkouts/Alamofire/.ruby-version new file mode 100644 index 00000000..be94e6f5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.ruby-version @@ -0,0 +1 @@ +3.2.2 diff --git a/Carthage/Checkouts/Alamofire/.swiftformat b/Carthage/Checkouts/Alamofire/.swiftformat new file mode 100644 index 00000000..f9439735 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/.swiftformat @@ -0,0 +1,28 @@ +# file options + +--symlinks ignore +--swiftversion 5.5 + +# rules +--enable isEmpty +--disable andOperator +--disable wrapMultilineStatementBraces + +# format options + +--commas inline +--comments indent +--decimalgrouping 3,5 +--exponentcase lowercase +--exponentgrouping disabled +--extensionacl on-declarations +--fractiongrouping disabled +--ifdef no-indent +--importgrouping testable-top +--operatorfunc no-space +--nospaceoperators ..<, ... +--selfrequired validate +--stripunusedargs closure-only +--wraparguments preserve +--wrapcollections preserve +--wrapparameters preserve diff --git a/Carthage/Checkouts/Alamofire/Alamofire.podspec b/Carthage/Checkouts/Alamofire/Alamofire.podspec new file mode 100644 index 00000000..3ccff7bc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.podspec @@ -0,0 +1,21 @@ +Pod::Spec.new do |s| + s.name = 'Alamofire' + s.version = '5.8.1' + s.license = 'MIT' + s.summary = 'Elegant HTTP Networking in Swift' + s.homepage = 'https://github.com/Alamofire/Alamofire' + s.authors = { 'Alamofire Software Foundation' => 'info@alamofire.org' } + s.source = { :git => 'https://github.com/Alamofire/Alamofire.git', :tag => s.version } + s.documentation_url = 'https://alamofire.github.io/Alamofire/' + + s.ios.deployment_target = '10.0' + s.osx.deployment_target = '10.12' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '3.0' + + s.swift_versions = ['5'] + + s.source_files = 'Source/*.swift' + + s.frameworks = 'CFNetwork' +end diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.pbxproj b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.pbxproj new file mode 100644 index 00000000..4f8f8d73 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.pbxproj @@ -0,0 +1,2766 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 3106FB6123F8C53A007FAB43 /* ProtectedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */; }; + 3106FB6223F8C53A007FAB43 /* ProtectedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */; }; + 3106FB6323F8C53A007FAB43 /* ProtectedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */; }; + 3106FB6523F8D9E0007FAB43 /* DataStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */; }; + 3106FB6623F8D9E0007FAB43 /* DataStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */; }; + 3106FB6723F8D9E0007FAB43 /* DataStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */; }; + 3107EA3520A11AE100445260 /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */; }; + 3107EA3620A11AE100445260 /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */; }; + 3107EA3720A11AE200445260 /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */; }; + 3107EA3820A11F9600445260 /* ResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */; }; + 3107EA3920A11F9600445260 /* ResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */; }; + 3107EA3A20A11F9700445260 /* ResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */; }; + 3107EA3F20A1267C00445260 /* SessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */; }; + 3107EA4020A1267C00445260 /* SessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */; }; + 3107EA4120A1267D00445260 /* SessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */; }; + 3111CE8420A7636E008315E2 /* SessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D1C6F419D52968002E74FE /* SessionTests.swift */; }; + 3111CE8520A7636F008315E2 /* SessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D1C6F419D52968002E74FE /* SessionTests.swift */; }; + 3111CE8620A76370008315E2 /* SessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D1C6F419D52968002E74FE /* SessionTests.swift */; }; + 3111CE8820A77843008315E2 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111CE8720A77843008315E2 /* EventMonitor.swift */; }; + 3111CE8920A77944008315E2 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111CE8720A77843008315E2 /* EventMonitor.swift */; }; + 3111CE8A20A77945008315E2 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111CE8720A77843008315E2 /* EventMonitor.swift */; }; + 3111CE8B20A77945008315E2 /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111CE8720A77843008315E2 /* EventMonitor.swift */; }; + 3111CE8C20A7EBE6008315E2 /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */; }; + 3111CE8D20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */; }; + 3111CE8E20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */; }; + 3111CE8F20A7EC26008315E2 /* NetworkReachabilityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */; }; + 3111CE9020A7EC27008315E2 /* NetworkReachabilityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */; }; + 3111CE9120A7EC27008315E2 /* NetworkReachabilityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */; }; + 3111CE9220A7EC30008315E2 /* ResponseSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */; }; + 3111CE9320A7EC31008315E2 /* ResponseSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */; }; + 3111CE9420A7EC32008315E2 /* ResponseSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */; }; + 3111CE9520A7EC39008315E2 /* ServerTrustEvaluatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */; }; + 3111CE9620A7EC3A008315E2 /* ServerTrustEvaluatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */; }; + 3111CE9720A7EC3A008315E2 /* ServerTrustEvaluatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */; }; + 3111CE9B20A7EC57008315E2 /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; }; + 3111CE9C20A7EC58008315E2 /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; }; + 3111CE9D20A7EC58008315E2 /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; }; + 3113D46B21878227001CCD21 /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */; }; + 3113D46C21878227001CCD21 /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */; }; + 3113D46D21878227001CCD21 /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */; }; + 31181E122794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */; }; + 31181E132794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */; }; + 31181E142794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */; }; + 31181E152794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */; }; + 31181E302794FF9600E88600 /* certPEM.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E172794FF9600E88600 /* certPEM.cer */; }; + 31181E312794FF9600E88600 /* certPEM.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E172794FF9600E88600 /* certPEM.cer */; }; + 31181E322794FF9600E88600 /* certPEM.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E172794FF9600E88600 /* certPEM.cer */; }; + 31181E332794FF9600E88600 /* certPEM.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E172794FF9600E88600 /* certPEM.cer */; }; + 31181E342794FF9600E88600 /* randomGibberish.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E182794FF9600E88600 /* randomGibberish.crt */; }; + 31181E352794FF9600E88600 /* randomGibberish.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E182794FF9600E88600 /* randomGibberish.crt */; }; + 31181E362794FF9600E88600 /* randomGibberish.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E182794FF9600E88600 /* randomGibberish.crt */; }; + 31181E372794FF9600E88600 /* randomGibberish.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E182794FF9600E88600 /* randomGibberish.crt */; }; + 31181E382794FF9600E88600 /* certDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E192794FF9600E88600 /* certDER.der */; }; + 31181E392794FF9600E88600 /* certDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E192794FF9600E88600 /* certDER.der */; }; + 31181E3A2794FF9600E88600 /* certDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E192794FF9600E88600 /* certDER.der */; }; + 31181E3B2794FF9600E88600 /* certDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E192794FF9600E88600 /* certDER.der */; }; + 31181E3C2794FF9600E88600 /* keyDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1A2794FF9600E88600 /* keyDER.der */; }; + 31181E3D2794FF9600E88600 /* keyDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1A2794FF9600E88600 /* keyDER.der */; }; + 31181E3E2794FF9600E88600 /* keyDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1A2794FF9600E88600 /* keyDER.der */; }; + 31181E3F2794FF9600E88600 /* keyDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1A2794FF9600E88600 /* keyDER.der */; }; + 31181E402794FF9600E88600 /* certDER.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1B2794FF9600E88600 /* certDER.cer */; }; + 31181E412794FF9600E88600 /* certDER.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1B2794FF9600E88600 /* certDER.cer */; }; + 31181E422794FF9600E88600 /* certDER.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1B2794FF9600E88600 /* certDER.cer */; }; + 31181E432794FF9600E88600 /* certDER.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1B2794FF9600E88600 /* certDER.cer */; }; + 31181E442794FF9600E88600 /* certPEM.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1C2794FF9600E88600 /* certPEM.crt */; }; + 31181E452794FF9600E88600 /* certPEM.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1C2794FF9600E88600 /* certPEM.crt */; }; + 31181E462794FF9600E88600 /* certPEM.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1C2794FF9600E88600 /* certPEM.crt */; }; + 31181E472794FF9600E88600 /* certPEM.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1C2794FF9600E88600 /* certPEM.crt */; }; + 31181E482794FF9600E88600 /* certDER.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1D2794FF9600E88600 /* certDER.crt */; }; + 31181E492794FF9600E88600 /* certDER.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1D2794FF9600E88600 /* certDER.crt */; }; + 31181E4A2794FF9600E88600 /* certDER.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1D2794FF9600E88600 /* certDER.crt */; }; + 31181E4B2794FF9600E88600 /* certDER.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1D2794FF9600E88600 /* certDER.crt */; }; + 31181E4C2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */; }; + 31181E4D2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */; }; + 31181E4E2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */; }; + 31181E4F2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */; }; + 31181E502794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */; }; + 31181E512794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */; }; + 31181E522794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */; }; + 31181E532794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */; }; + 31181E542794FF9600E88600 /* signed-by-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E212794FF9600E88600 /* signed-by-ca2.cer */; }; + 31181E552794FF9600E88600 /* signed-by-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E212794FF9600E88600 /* signed-by-ca2.cer */; }; + 31181E562794FF9600E88600 /* signed-by-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E212794FF9600E88600 /* signed-by-ca2.cer */; }; + 31181E572794FF9600E88600 /* signed-by-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E212794FF9600E88600 /* signed-by-ca2.cer */; }; + 31181E582794FF9600E88600 /* signed-by-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E222794FF9600E88600 /* signed-by-ca1.cer */; }; + 31181E592794FF9600E88600 /* signed-by-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E222794FF9600E88600 /* signed-by-ca1.cer */; }; + 31181E5A2794FF9600E88600 /* signed-by-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E222794FF9600E88600 /* signed-by-ca1.cer */; }; + 31181E5B2794FF9600E88600 /* signed-by-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E222794FF9600E88600 /* signed-by-ca1.cer */; }; + 31181E5C2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */; }; + 31181E5D2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */; }; + 31181E5E2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */; }; + 31181E5F2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */; }; + 31181E602794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */; }; + 31181E612794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */; }; + 31181E622794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */; }; + 31181E632794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */; }; + 31181E642794FF9600E88600 /* test.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E252794FF9600E88600 /* test.alamofire.org.cer */; }; + 31181E652794FF9600E88600 /* test.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E252794FF9600E88600 /* test.alamofire.org.cer */; }; + 31181E662794FF9600E88600 /* test.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E252794FF9600E88600 /* test.alamofire.org.cer */; }; + 31181E672794FF9600E88600 /* test.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E252794FF9600E88600 /* test.alamofire.org.cer */; }; + 31181E682794FF9600E88600 /* alamofire-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E262794FF9600E88600 /* alamofire-root-ca.cer */; }; + 31181E692794FF9600E88600 /* alamofire-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E262794FF9600E88600 /* alamofire-root-ca.cer */; }; + 31181E6A2794FF9600E88600 /* alamofire-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E262794FF9600E88600 /* alamofire-root-ca.cer */; }; + 31181E6B2794FF9600E88600 /* alamofire-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E262794FF9600E88600 /* alamofire-root-ca.cer */; }; + 31181E6C2794FF9600E88600 /* valid-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E272794FF9600E88600 /* valid-uri.cer */; }; + 31181E6D2794FF9600E88600 /* valid-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E272794FF9600E88600 /* valid-uri.cer */; }; + 31181E6E2794FF9600E88600 /* valid-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E272794FF9600E88600 /* valid-uri.cer */; }; + 31181E6F2794FF9600E88600 /* valid-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E272794FF9600E88600 /* valid-uri.cer */; }; + 31181E702794FF9600E88600 /* multiple-dns-names.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E282794FF9600E88600 /* multiple-dns-names.cer */; }; + 31181E712794FF9600E88600 /* multiple-dns-names.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E282794FF9600E88600 /* multiple-dns-names.cer */; }; + 31181E722794FF9600E88600 /* multiple-dns-names.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E282794FF9600E88600 /* multiple-dns-names.cer */; }; + 31181E732794FF9600E88600 /* multiple-dns-names.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E282794FF9600E88600 /* multiple-dns-names.cer */; }; + 31181E742794FF9600E88600 /* expired.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E292794FF9600E88600 /* expired.cer */; }; + 31181E752794FF9600E88600 /* expired.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E292794FF9600E88600 /* expired.cer */; }; + 31181E762794FF9600E88600 /* expired.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E292794FF9600E88600 /* expired.cer */; }; + 31181E772794FF9600E88600 /* expired.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E292794FF9600E88600 /* expired.cer */; }; + 31181E782794FF9600E88600 /* valid-dns-name.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2A2794FF9600E88600 /* valid-dns-name.cer */; }; + 31181E792794FF9600E88600 /* valid-dns-name.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2A2794FF9600E88600 /* valid-dns-name.cer */; }; + 31181E7A2794FF9600E88600 /* valid-dns-name.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2A2794FF9600E88600 /* valid-dns-name.cer */; }; + 31181E7B2794FF9600E88600 /* valid-dns-name.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2A2794FF9600E88600 /* valid-dns-name.cer */; }; + 31181E7C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */; }; + 31181E7D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */; }; + 31181E7E2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */; }; + 31181E7F2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */; }; + 31181E802794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */; }; + 31181E812794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */; }; + 31181E822794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */; }; + 31181E832794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */; }; + 31181E842794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */; }; + 31181E852794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */; }; + 31181E862794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */; }; + 31181E872794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */; }; + 31181E882794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */; }; + 31181E892794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */; }; + 31181E8A2794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */; }; + 31181E8B2794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */; }; + 311A89BF23185BBF003BB714 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; }; + 311A89C023185BBF003BB714 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; }; + 311A89C123185BC0003BB714 /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; }; + 311B199020B0D3B40036823B /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B198F20B0D3B40036823B /* MultipartUpload.swift */; }; + 311B199120B0E3470036823B /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B198F20B0D3B40036823B /* MultipartUpload.swift */; }; + 311B199220B0E3480036823B /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B198F20B0D3B40036823B /* MultipartUpload.swift */; }; + 311B199320B0E3480036823B /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B198F20B0D3B40036823B /* MultipartUpload.swift */; }; + 311B199420B0ED980036823B /* UploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5F19A9674D0040E7D1 /* UploadTests.swift */; }; + 311B199520B0ED980036823B /* UploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5F19A9674D0040E7D1 /* UploadTests.swift */; }; + 311B199620B0ED990036823B /* UploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5F19A9674D0040E7D1 /* UploadTests.swift */; }; + 3129306A263E17D600473CEA /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4202FE01B667AA100C997FB /* Alamofire.framework */; }; + 31293070263E183500473CEA /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; }; + 31293071263E183800473CEA /* LeaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31762DC9247738FA0025C704 /* LeaksTests.swift */; }; + 31293072263E183800473CEA /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727421218BB9A50039FFCC /* TestHelpers.swift */; }; + 31293073263E183800473CEA /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; }; + 31293074263E183C00473CEA /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5D19A9674D0040E7D1 /* RequestTests.swift */; }; + 31293075263E183C00473CEA /* SessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */; }; + 31293076263E183C00473CEA /* DownloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */; }; + 31293077263E183C00473CEA /* ResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */; }; + 31293078263E183C00473CEA /* SessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D1C6F419D52968002E74FE /* SessionTests.swift */; }; + 31293079263E183C00473CEA /* InternalRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */; }; + 3129307A263E183C00473CEA /* UploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5F19A9674D0040E7D1 /* UploadTests.swift */; }; + 3129307B263E183C00473CEA /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */; }; + 3129307C263E183C00473CEA /* ParameterEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31501E872196962A005829F2 /* ParameterEncoderTests.swift */; }; + 3129307D263E183C00473CEA /* DataStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */; }; + 3129307E263E183C00473CEA /* RequestModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */; }; + 3129307F263E183C00473CEA /* ParameterEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */; }; + 31293080263E184000473CEA /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; }; + 31293081263E184000473CEA /* FileManager+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */; }; + 31293082263E184500473CEA /* ProtectedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */; }; + 31293083263E184500473CEA /* NetworkReachabilityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */; }; + 31293084263E184500473CEA /* RetryPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */; }; + 31293085263E184500473CEA /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */; }; + 31293086263E184500473CEA /* CombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */; }; + 31293087263E184500473CEA /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; }; + 31293088263E184500473CEA /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; }; + 31293089263E184500473CEA /* ServerTrustEvaluatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */; }; + 3129308A263E184500473CEA /* AuthenticationInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */; }; + 3129308B263E184500473CEA /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; }; + 3129308C263E184500473CEA /* ResponseSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */; }; + 3129308D263E184500473CEA /* ValidationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */; }; + 3129308E263E184500473CEA /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; }; + 3129308F263E184500473CEA /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */; }; + 31293090263E184500473CEA /* TLSEvaluationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */; }; + 31293091263E184500473CEA /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; }; + 31293092263E184900473CEA /* Result+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */; }; + 312930AA263E187200473CEA /* unicorn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1241B5207DB00873DFF /* unicorn.png */; }; + 312930AB263E187200473CEA /* rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1231B5207DB00873DFF /* rainbow.jpg */; }; + 312930AC263E187500473CEA /* empty_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EA1D7D2FA20056F249 /* empty_data.json */; }; + 312930AD263E187500473CEA /* valid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EC1D7D2FA20056F249 /* valid_data.json */; }; + 312930AE263E187500473CEA /* invalid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */; }; + 312930AF263E187800473CEA /* empty_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F21D7D2FA20056F249 /* empty_string.txt */; }; + 312930B0263E187800473CEA /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; }; + 312930B1263E187800473CEA /* utf32_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */; }; + 31425AC1241F098000EE3CCC /* InternalRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */; }; + 31425AC2241F098000EE3CCC /* InternalRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */; }; + 31425AC3241F098000EE3CCC /* InternalRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */; }; + 3145E0EA2797DA4200949557 /* ConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */; }; + 314998EA27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */; }; + 314998EB27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */; }; + 314998EC27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */; }; + 314998ED27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */; }; + 31501E882196962A005829F2 /* ParameterEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31501E872196962A005829F2 /* ParameterEncoderTests.swift */; }; + 31501E892196962A005829F2 /* ParameterEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31501E872196962A005829F2 /* ParameterEncoderTests.swift */; }; + 31501E8A2196962A005829F2 /* ParameterEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31501E872196962A005829F2 /* ParameterEncoderTests.swift */; }; + 315A4C56241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */; }; + 315A4C57241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */; }; + 315A4C58241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */; }; + 315A4C59241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */; }; + 3165407329AEBC0400C9BE08 /* RequestCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165407229AEBC0400C9BE08 /* RequestCompression.swift */; }; + 3165407429AEBC0400C9BE08 /* RequestCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165407229AEBC0400C9BE08 /* RequestCompression.swift */; }; + 3165407529AEBC0400C9BE08 /* RequestCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165407229AEBC0400C9BE08 /* RequestCompression.swift */; }; + 3165407629AEBC0400C9BE08 /* RequestCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165407229AEBC0400C9BE08 /* RequestCompression.swift */; }; + 31727418218BAEC90039FFCC /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727417218BAEC90039FFCC /* HTTPMethod.swift */; }; + 31727419218BAEC90039FFCC /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727417218BAEC90039FFCC /* HTTPMethod.swift */; }; + 3172741A218BAEC90039FFCC /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727417218BAEC90039FFCC /* HTTPMethod.swift */; }; + 3172741B218BAEC90039FFCC /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727417218BAEC90039FFCC /* HTTPMethod.swift */; }; + 3172741D218BB1790039FFCC /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3172741C218BB1790039FFCC /* ParameterEncoder.swift */; }; + 3172741E218BB1790039FFCC /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3172741C218BB1790039FFCC /* ParameterEncoder.swift */; }; + 3172741F218BB1790039FFCC /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3172741C218BB1790039FFCC /* ParameterEncoder.swift */; }; + 31727420218BB1790039FFCC /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3172741C218BB1790039FFCC /* ParameterEncoder.swift */; }; + 31727422218BB9A50039FFCC /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727421218BB9A50039FFCC /* TestHelpers.swift */; }; + 31727423218BB9A50039FFCC /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727421218BB9A50039FFCC /* TestHelpers.swift */; }; + 31727424218BB9A50039FFCC /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727421218BB9A50039FFCC /* TestHelpers.swift */; }; + 317338CB2A43A51100D4EA0A /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; }; + 317338CC2A43A51100D4EA0A /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; }; + 317338CD2A43A51100D4EA0A /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A9209CDCB000103A19 /* HTTPHeaders.swift */; }; + 317338CE2A43A51100D4EA0A /* HTTPMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727417218BAEC90039FFCC /* HTTPMethod.swift */; }; + 317338CF2A43A51100D4EA0A /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB928281C66BFBC00CE5F08 /* Notifications.swift */; }; + 317338D02A43A51100D4EA0A /* ParameterEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3172741C218BB1790039FFCC /* ParameterEncoder.swift */; }; + 317338D12A43A51100D4EA0A /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; }; + 317338D22A43A51100D4EA0A /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3191B5741F5F53A6003960A8 /* Protected.swift */; }; + 317338D32A43A51100D4EA0A /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991790209CDA7F00103A19 /* Request.swift */; }; + 317338D42A43A51100D4EA0A /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A4209CDAC400103A19 /* RequestTaskMap.swift */; }; + 317338D52A43A51100D4EA0A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991791209CDA7F00103A19 /* Response.swift */; }; + 317338D62A43A51100D4EA0A /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991792209CDA7F00103A19 /* Session.swift */; }; + 317338D72A43A51100D4EA0A /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991793209CDA7F00103A19 /* SessionDelegate.swift */; }; + 317338D82A43A51100D4EA0A /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */; }; + 317338D92A43A51100D4EA0A /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */; }; + 317338DA2A43A51100D4EA0A /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */; }; + 317338DB2A43A51100D4EA0A /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */; }; + 317338DC2A43A51100D4EA0A /* StringEncoding+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */; }; + 317338DD2A43A51100D4EA0A /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; }; + 317338DE2A43A51100D4EA0A /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */; }; + 317338DF2A43A51100D4EA0A /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DADDFA224811ED0051390F /* AlamofireExtended.swift */; }; + 317338E02A43A51100D4EA0A /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */; }; + 317338E12A43A51100D4EA0A /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */; }; + 317338E22A43A51100D4EA0A /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318DD40E2439780500963291 /* Combine.swift */; }; + 317338E32A43A51100D4EA0A /* Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE3A25C11CEA00760641 /* Concurrency.swift */; }; + 317338E42A43A51100D4EA0A /* EventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3111CE8720A77843008315E2 /* EventMonitor.swift */; }; + 317338E52A43A51100D4EA0A /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */; }; + 317338E62A43A51100D4EA0A /* MultipartUpload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 311B198F20B0D3B40036823B /* MultipartUpload.swift */; }; + 317338E72A43A51100D4EA0A /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */; }; + 317338E82A43A51100D4EA0A /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; }; + 317338E92A43A51100D4EA0A /* RequestCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165407229AEBC0400C9BE08 /* RequestCompression.swift */; }; + 317338EA2A43A51100D4EA0A /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */; }; + 317338EB2A43A51100D4EA0A /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */; }; + 317338EC2A43A51100D4EA0A /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */; }; + 317338ED2A43A51100D4EA0A /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */; }; + 317338EE2A43A51100D4EA0A /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */; }; + 317338EF2A43A51100D4EA0A /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C421AF89F0900BABAE5 /* Validation.swift */; }; + 317338F82A43BE5F00D4EA0A /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 317338C42A43A4FA00D4EA0A /* Alamofire.framework */; }; + 317338FE2A43BE9000D4EA0A /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; }; + 317338FF2A43BE9000D4EA0A /* LeaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31762DC9247738FA0025C704 /* LeaksTests.swift */; }; + 317339002A43BE9000D4EA0A /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; }; + 317339012A43BE9000D4EA0A /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31727421218BB9A50039FFCC /* TestHelpers.swift */; }; + 317339022A43BE9000D4EA0A /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */; }; + 317339032A43BE9000D4EA0A /* DataStreamTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */; }; + 317339042A43BE9000D4EA0A /* DownloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */; }; + 317339052A43BE9000D4EA0A /* InternalRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */; }; + 317339062A43BE9000D4EA0A /* ParameterEncoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31501E872196962A005829F2 /* ParameterEncoderTests.swift */; }; + 317339072A43BE9000D4EA0A /* ParameterEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */; }; + 317339082A43BE9000D4EA0A /* RequestModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */; }; + 317339092A43BE9000D4EA0A /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5D19A9674D0040E7D1 /* RequestTests.swift */; }; + 3173390A2A43BE9000D4EA0A /* ResponseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */; }; + 3173390B2A43BE9000D4EA0A /* SessionDelegateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */; }; + 3173390C2A43BE9000D4EA0A /* SessionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D1C6F419D52968002E74FE /* SessionTests.swift */; }; + 3173390D2A43BE9000D4EA0A /* UploadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5F19A9674D0040E7D1 /* UploadTests.swift */; }; + 3173390E2A43BE9000D4EA0A /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; }; + 3173390F2A43BE9000D4EA0A /* Bundle+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */; }; + 317339102A43BE9000D4EA0A /* FileManager+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */; }; + 317339112A43BE9000D4EA0A /* Request+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */; }; + 317339122A43BE9000D4EA0A /* Result+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */; }; + 317339132A43BE9000D4EA0A /* AuthenticationInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */; }; + 317339142A43BE9000D4EA0A /* CachedResponseHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */; }; + 317339152A43BE9000D4EA0A /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; }; + 317339162A43BE9000D4EA0A /* CombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */; }; + 317339172A43BE9000D4EA0A /* ConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */; }; + 317339182A43BE9000D4EA0A /* HTTPHeadersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */; }; + 317339192A43BE9000D4EA0A /* MultipartFormDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */; }; + 3173391A2A43BE9000D4EA0A /* NetworkReachabilityManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */; }; + 3173391B2A43BE9000D4EA0A /* ProtectedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */; }; + 3173391C2A43BE9000D4EA0A /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; }; + 3173391D2A43BE9000D4EA0A /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; }; + 3173391E2A43BE9000D4EA0A /* ResponseSerializationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */; }; + 3173391F2A43BE9000D4EA0A /* RetryPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */; }; + 317339202A43BE9000D4EA0A /* ServerTrustEvaluatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */; }; + 317339212A43BE9000D4EA0A /* TLSEvaluationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */; }; + 317339222A43BE9000D4EA0A /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; }; + 317339232A43BE9000D4EA0A /* ValidationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */; }; + 317339242A43BEAC00D4EA0A /* alamofire-signing-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */; }; + 317339252A43BEAC00D4EA0A /* alamofire-signing-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */; }; + 317339262A43BEAC00D4EA0A /* signed-by-ca2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E212794FF9600E88600 /* signed-by-ca2.cer */; }; + 317339272A43BEAC00D4EA0A /* signed-by-ca1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E222794FF9600E88600 /* signed-by-ca1.cer */; }; + 317339282A43BEAC00D4EA0A /* missing-dns-name-and-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */; }; + 317339292A43BEAC00D4EA0A /* wildcard.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */; }; + 3173392A2A43BEAC00D4EA0A /* test.alamofire.org.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E252794FF9600E88600 /* test.alamofire.org.cer */; }; + 3173392B2A43BEAC00D4EA0A /* alamofire-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E262794FF9600E88600 /* alamofire-root-ca.cer */; }; + 3173392C2A43BEAC00D4EA0A /* valid-uri.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E272794FF9600E88600 /* valid-uri.cer */; }; + 3173392D2A43BEAC00D4EA0A /* multiple-dns-names.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E282794FF9600E88600 /* multiple-dns-names.cer */; }; + 3173392E2A43BEAC00D4EA0A /* expired.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E292794FF9600E88600 /* expired.cer */; }; + 3173392F2A43BEAC00D4EA0A /* valid-dns-name.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2A2794FF9600E88600 /* valid-dns-name.cer */; }; + 317339302A43BEAC00D4EA0A /* expired.badssl.com-intermediate-ca-1.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */; }; + 317339312A43BEAC00D4EA0A /* expired.badssl.com-intermediate-ca-2.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */; }; + 317339322A43BEAC00D4EA0A /* expired.badssl.com-root-ca.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */; }; + 317339332A43BEAC00D4EA0A /* expired.badssl.com-leaf.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */; }; + 317339342A43BEAC00D4EA0A /* certPEM.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E172794FF9600E88600 /* certPEM.cer */; }; + 317339352A43BEAC00D4EA0A /* randomGibberish.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E182794FF9600E88600 /* randomGibberish.crt */; }; + 317339362A43BEAC00D4EA0A /* certDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E192794FF9600E88600 /* certDER.der */; }; + 317339372A43BEAC00D4EA0A /* keyDER.der in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1A2794FF9600E88600 /* keyDER.der */; }; + 317339382A43BEAC00D4EA0A /* certDER.cer in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1B2794FF9600E88600 /* certDER.cer */; }; + 317339392A43BEAC00D4EA0A /* certPEM.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1C2794FF9600E88600 /* certPEM.crt */; }; + 3173393A2A43BEAC00D4EA0A /* certDER.crt in Resources */ = {isa = PBXBuildFile; fileRef = 31181E1D2794FF9600E88600 /* certDER.crt */; }; + 3173393B2A43BEAC00D4EA0A /* rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1231B5207DB00873DFF /* rainbow.jpg */; }; + 3173393C2A43BEAC00D4EA0A /* unicorn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1241B5207DB00873DFF /* unicorn.png */; }; + 3173393D2A43BEAC00D4EA0A /* empty_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EA1D7D2FA20056F249 /* empty_data.json */; }; + 3173393E2A43BEAC00D4EA0A /* invalid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */; }; + 3173393F2A43BEAC00D4EA0A /* valid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EC1D7D2FA20056F249 /* valid_data.json */; }; + 317339402A43BEAC00D4EA0A /* empty_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F21D7D2FA20056F249 /* empty_string.txt */; }; + 317339412A43BEAC00D4EA0A /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; }; + 317339422A43BEAC00D4EA0A /* utf32_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */; }; + 31762DCA247738FA0025C704 /* LeaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31762DC9247738FA0025C704 /* LeaksTests.swift */; }; + 31762DCB247738FA0025C704 /* LeaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31762DC9247738FA0025C704 /* LeaksTests.swift */; }; + 31762DCC247738FA0025C704 /* LeaksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31762DC9247738FA0025C704 /* LeaksTests.swift */; }; + 317A6A7620B2207F00A9FEC5 /* DownloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */; }; + 317A6A7720B2208000A9FEC5 /* DownloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */; }; + 317A6A7820B2208000A9FEC5 /* DownloadTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */; }; + 318DD40F2439780500963291 /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318DD40E2439780500963291 /* Combine.swift */; }; + 318DD4102439780500963291 /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318DD40E2439780500963291 /* Combine.swift */; }; + 318DD4112439780500963291 /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318DD40E2439780500963291 /* Combine.swift */; }; + 318DD4122439780500963291 /* Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318DD40E2439780500963291 /* Combine.swift */; }; + 3191B5751F5F53A6003960A8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3191B5741F5F53A6003960A8 /* Protected.swift */; }; + 3191B5761F5F53A6003960A8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3191B5741F5F53A6003960A8 /* Protected.swift */; }; + 3191B5771F5F53A6003960A8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3191B5741F5F53A6003960A8 /* Protected.swift */; }; + 3191B5781F5F53A6003960A8 /* Protected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3191B5741F5F53A6003960A8 /* Protected.swift */; }; + 31991794209CDA7F00103A19 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991790209CDA7F00103A19 /* Request.swift */; }; + 31991795209CDA7F00103A19 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991790209CDA7F00103A19 /* Request.swift */; }; + 31991796209CDA7F00103A19 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991790209CDA7F00103A19 /* Request.swift */; }; + 31991797209CDA7F00103A19 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991790209CDA7F00103A19 /* Request.swift */; }; + 31991798209CDA7F00103A19 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991791209CDA7F00103A19 /* Response.swift */; }; + 31991799209CDA7F00103A19 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991791209CDA7F00103A19 /* Response.swift */; }; + 3199179A209CDA7F00103A19 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991791209CDA7F00103A19 /* Response.swift */; }; + 3199179B209CDA7F00103A19 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991791209CDA7F00103A19 /* Response.swift */; }; + 3199179C209CDA7F00103A19 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991792209CDA7F00103A19 /* Session.swift */; }; + 3199179D209CDA7F00103A19 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991792209CDA7F00103A19 /* Session.swift */; }; + 3199179E209CDA7F00103A19 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991792209CDA7F00103A19 /* Session.swift */; }; + 3199179F209CDA7F00103A19 /* Session.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991792209CDA7F00103A19 /* Session.swift */; }; + 319917A0209CDA7F00103A19 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991793209CDA7F00103A19 /* SessionDelegate.swift */; }; + 319917A1209CDA7F00103A19 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991793209CDA7F00103A19 /* SessionDelegate.swift */; }; + 319917A2209CDA7F00103A19 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991793209CDA7F00103A19 /* SessionDelegate.swift */; }; + 319917A3209CDA7F00103A19 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31991793209CDA7F00103A19 /* SessionDelegate.swift */; }; + 319917A5209CDAC400103A19 /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A4209CDAC400103A19 /* RequestTaskMap.swift */; }; + 319917A6209CDAC400103A19 /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A4209CDAC400103A19 /* RequestTaskMap.swift */; }; + 319917A7209CDAC400103A19 /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A4209CDAC400103A19 /* RequestTaskMap.swift */; }; + 319917A8209CDAC400103A19 /* RequestTaskMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A4209CDAC400103A19 /* RequestTaskMap.swift */; }; + 319917AA209CDCB000103A19 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A9209CDCB000103A19 /* HTTPHeaders.swift */; }; + 319917AB209CDCB000103A19 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A9209CDCB000103A19 /* HTTPHeaders.swift */; }; + 319917AC209CDCB000103A19 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A9209CDCB000103A19 /* HTTPHeaders.swift */; }; + 319917AD209CDCB000103A19 /* HTTPHeaders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917A9209CDCB000103A19 /* HTTPHeaders.swift */; }; + 319917B9209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */; }; + 319917BA209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */; }; + 319917BB209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */; }; + 319917BC209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */; }; + 31B3DE3B25C11CEA00760641 /* Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE3A25C11CEA00760641 /* Concurrency.swift */; }; + 31B3DE3C25C11CEA00760641 /* Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE3A25C11CEA00760641 /* Concurrency.swift */; }; + 31B3DE3D25C11CEA00760641 /* Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE3A25C11CEA00760641 /* Concurrency.swift */; }; + 31B3DE3E25C11CEA00760641 /* Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE3A25C11CEA00760641 /* Concurrency.swift */; }; + 31B3DE4F25C120D800760641 /* ConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */; }; + 31B3DE5025C120D800760641 /* ConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */; }; + 31B3DE5125C120D800760641 /* ConcurrencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */; }; + 31B51E8C2434FECB005356DB /* RequestModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */; }; + 31B51E8D2434FECB005356DB /* RequestModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */; }; + 31B51E8E2434FECB005356DB /* RequestModifierTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */; }; + 31BADE4E2439A8D1007D2AB9 /* CombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */; }; + 31BADE4F2439A8D1007D2AB9 /* CombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */; }; + 31BADE502439A8D1007D2AB9 /* CombineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */; }; + 31C2B0EA20B271040089BA7C /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; }; + 31C2B0EB20B271050089BA7C /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; }; + 31C2B0EC20B271060089BA7C /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; }; + 31C2B0F020B271370089BA7C /* TLSEvaluationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */; }; + 31C2B0F120B271370089BA7C /* TLSEvaluationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */; }; + 31C2B0F220B271380089BA7C /* TLSEvaluationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */; }; + 31D83FCE20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */; }; + 31D83FCF20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */; }; + 31D83FD020D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */; }; + 31D83FD120D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */; }; + 31DADDFB224811ED0051390F /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DADDFA224811ED0051390F /* AlamofireExtended.swift */; }; + 31DADDFC224811ED0051390F /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DADDFA224811ED0051390F /* AlamofireExtended.swift */; }; + 31DADDFD224811ED0051390F /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DADDFA224811ED0051390F /* AlamofireExtended.swift */; }; + 31DADDFE224811ED0051390F /* AlamofireExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DADDFA224811ED0051390F /* AlamofireExtended.swift */; }; + 31EBD9C120D1D89C00D1FF34 /* ValidationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */; }; + 31EBD9C220D1D89C00D1FF34 /* ValidationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */; }; + 31EBD9C320D1D89D00D1FF34 /* ValidationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */; }; + 31ED52E81D73891B00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; }; + 31ED52E91D73891C00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; }; + 31ED52EA1D73891C00199085 /* AFError+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */; }; + 31F5085D20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */; }; + 31F5085E20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */; }; + 31F5085F20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */; }; + 31F5086020B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */; }; + 31F9683C20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; }; + 31F9683D20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; }; + 31F9683E20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */; }; + 31FB2F8722C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */; }; + 31FB2F8822C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */; }; + 31FB2F8922C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */; }; + 31FB2F8A22C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */; }; + 4196936222FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */; }; + 4196936322FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */; }; + 4196936422FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */; }; + 4196936522FA1EAD001EA5D5 /* Result+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */; }; + 4C0CB631220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; }; + 4C0CB632220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; }; + 4C0CB633220BC70300604EDC /* RequestInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */; }; + 4C0CB641220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; }; + 4C0CB642220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; }; + 4C0CB643220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; }; + 4C0CB644220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */; }; + 4C0CB646220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; }; + 4C0CB647220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; }; + 4C0CB648220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; }; + 4C0CB649220CA8A400604EDC /* RedirectHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */; }; + 4C0CB64B220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; }; + 4C0CB64C220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; }; + 4C0CB64D220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */; }; + 4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; }; + 4C1DC8551B68908E00476DE3 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; }; + 4C23EB431B327C5B0090E0BC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */; }; + 4C23EB441B327C5B0090E0BC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */; }; + 4C256A0621EEB69000AD5D87 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */; }; + 4C256A0721EEB69000AD5D87 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */; }; + 4C256A0821EEB69000AD5D87 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */; }; + 4C256A0921EEB69000AD5D87 /* RequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */; }; + 4C256A1A21F1449C00AD5D87 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */; }; + 4C256A1B21F1449C00AD5D87 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */; }; + 4C256A1C21F1449C00AD5D87 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */; }; + 4C256A1D21F1449C00AD5D87 /* RetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */; }; + 4C256A531B096C770065714F /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; }; + 4C256A541B096C770065714F /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; }; + 4C33A1391B5207DB00873DFF /* rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1231B5207DB00873DFF /* rainbow.jpg */; }; + 4C33A13A1B5207DB00873DFF /* rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1231B5207DB00873DFF /* rainbow.jpg */; }; + 4C33A13B1B5207DB00873DFF /* unicorn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1241B5207DB00873DFF /* unicorn.png */; }; + 4C33A13C1B5207DB00873DFF /* unicorn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1241B5207DB00873DFF /* unicorn.png */; }; + 4C3D00541C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */; }; + 4C3D00551C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */; }; + 4C3D00561C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */; }; + 4C43669B1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */; }; + 4C43669C1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */; }; + 4C43669D1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */; }; + 4C43669E1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */; }; + 4C4466EB21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */; }; + 4C4466EC21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */; }; + 4C4466ED21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */; }; + 4C4466EE21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */; }; + 4C67D1362454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */; }; + 4C67D1372454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */; }; + 4C67D1382454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */; }; + 4C67D1392454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */; }; + 4C7DD7EB224C627300249836 /* Result+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */; }; + 4C7DD7EC224C627300249836 /* Result+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */; }; + 4C7DD7ED224C627300249836 /* Result+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */; }; + 4C811F8D1B51856D00E0F59A /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */; }; + 4C811F8E1B51856D00E0F59A /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */; }; + 4CB0080D2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */; }; + 4CB0080E2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */; }; + 4CB0080F2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */; }; + 4CB928291C66BFBC00CE5F08 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB928281C66BFBC00CE5F08 /* Notifications.swift */; }; + 4CB9282A1C66BFBC00CE5F08 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB928281C66BFBC00CE5F08 /* Notifications.swift */; }; + 4CB9282B1C66BFBC00CE5F08 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB928281C66BFBC00CE5F08 /* Notifications.swift */; }; + 4CB9282C1C66BFBC00CE5F08 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB928281C66BFBC00CE5F08 /* Notifications.swift */; }; + 4CBD2180220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */; }; + 4CBD2181220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */; }; + 4CBD2182220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */; }; + 4CDE2C431AF89F0900BABAE5 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C421AF89F0900BABAE5 /* Validation.swift */; }; + 4CDE2C441AF89F0900BABAE5 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C421AF89F0900BABAE5 /* Validation.swift */; }; + 4CDE2C461AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */; }; + 4CDE2C471AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */; }; + 4CE2724F1AF88FB500F1D59A /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; }; + 4CE272501AF88FB500F1D59A /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; }; + 4CEC605A1B745C9100E684F4 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; }; + 4CEE82AD1C6813CF00E9C9F0 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */; }; + 4CF626F91BA7CB3E0011A099 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CF626EF1BA7CB3E0011A099 /* Alamofire.framework */; }; + 4CF627071BA7CBF60011A099 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; }; + 4CF627081BA7CBF60011A099 /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1DC8531B68908E00476DE3 /* AFError.swift */; }; + 4CF6270A1BA7CBF60011A099 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; }; + 4CF6270E1BA7CBF60011A099 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */; }; + 4CF6270F1BA7CBF60011A099 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */; }; + 4CF627101BA7CBF60011A099 /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */; }; + 4CF627131BA7CBF60011A099 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C421AF89F0900BABAE5 /* Validation.swift */; }; + 4CF627141BA7CC240011A099 /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; }; + 4CF627171BA7CC240011A099 /* ParameterEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */; }; + 4CF627181BA7CC240011A099 /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5D19A9674D0040E7D1 /* RequestTests.swift */; }; + 4CF627341BA7CC300011A099 /* rainbow.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1231B5207DB00873DFF /* rainbow.jpg */; }; + 4CF627351BA7CC300011A099 /* unicorn.png in Resources */ = {isa = PBXBuildFile; fileRef = 4C33A1241B5207DB00873DFF /* unicorn.png */; }; + 4CFB02901D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */; }; + 4CFB02911D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */; }; + 4CFB02921D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */; }; + 4CFB02F51D7D2FA20056F249 /* empty_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EA1D7D2FA20056F249 /* empty_data.json */; }; + 4CFB02F61D7D2FA20056F249 /* empty_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EA1D7D2FA20056F249 /* empty_data.json */; }; + 4CFB02F71D7D2FA20056F249 /* empty_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EA1D7D2FA20056F249 /* empty_data.json */; }; + 4CFB02F81D7D2FA20056F249 /* invalid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */; }; + 4CFB02F91D7D2FA20056F249 /* invalid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */; }; + 4CFB02FA1D7D2FA20056F249 /* invalid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */; }; + 4CFB02FB1D7D2FA20056F249 /* valid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EC1D7D2FA20056F249 /* valid_data.json */; }; + 4CFB02FC1D7D2FA20056F249 /* valid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EC1D7D2FA20056F249 /* valid_data.json */; }; + 4CFB02FD1D7D2FA20056F249 /* valid_data.json in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02EC1D7D2FA20056F249 /* valid_data.json */; }; + 4CFB03071D7D2FA20056F249 /* empty_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F21D7D2FA20056F249 /* empty_string.txt */; }; + 4CFB03081D7D2FA20056F249 /* empty_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F21D7D2FA20056F249 /* empty_string.txt */; }; + 4CFB03091D7D2FA20056F249 /* empty_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F21D7D2FA20056F249 /* empty_string.txt */; }; + 4CFB030A1D7D2FA20056F249 /* utf32_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */; }; + 4CFB030B1D7D2FA20056F249 /* utf32_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */; }; + 4CFB030C1D7D2FA20056F249 /* utf32_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */; }; + 4CFB030D1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; }; + 4CFB030E1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; }; + 4CFB030F1D7D2FA20056F249 /* utf8_string.txt in Resources */ = {isa = PBXBuildFile; fileRef = 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */; }; + 4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; }; + 8035DB621BAB492500466CB3 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8111E3319A95C8B0040E7D1 /* Alamofire.framework */; }; + E4202FD01B667AA100C997FB /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */; }; + E4202FD21B667AA100C997FB /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */; }; + E4202FD41B667AA100C997FB /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; }; + E4202FD51B667AA100C997FB /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */; }; + E4202FD61B667AA100C997FB /* ServerTrustEvaluation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */; }; + E4202FD81B667AA100C997FB /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C421AF89F0900BABAE5 /* Validation.swift */; }; + F8111E6119A9674D0040E7D1 /* ParameterEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */; }; + F829C6B81A7A94F100A2CD59 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */; }; + F829C6BE1A7A950600A2CD59 /* ParameterEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */; }; + F829C6BF1A7A950600A2CD59 /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5D19A9674D0040E7D1 /* RequestTests.swift */; }; + F8858DDD19A96B4300F55F93 /* RequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8111E5D19A9674D0040E7D1 /* RequestTests.swift */; }; + F897FF4119AA800700AB5182 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = F897FF4019AA800700AB5182 /* Alamofire.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 3129306B263E17D600473CEA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8111E2A19A95C8B0040E7D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E4202FCD1B667AA100C997FB; + remoteInfo = "Alamofire watchOS"; + }; + 317338F92A43BE5F00D4EA0A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8111E2A19A95C8B0040E7D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 317338C32A43A4FA00D4EA0A; + remoteInfo = "Alamofire visionOS"; + }; + 4CF626FA1BA7CB3E0011A099 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8111E2A19A95C8B0040E7D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4CF626EE1BA7CB3E0011A099; + remoteInfo = "Alamofire tvOS"; + }; + F8111E6519A967880040E7D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8111E2A19A95C8B0040E7D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = F8111E3219A95C8B0040E7D1; + remoteInfo = Alamofire; + }; + F829C6B91A7A94F100A2CD59 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = F8111E2A19A95C8B0040E7D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4DD67C0A1A5C55C900ED2280; + remoteInfo = "Alamofire OSX"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProtectedTests.swift; sourceTree = ""; }; + 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataStreamTests.swift; sourceTree = ""; }; + 3111CE8720A77843008315E2 /* EventMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventMonitor.swift; sourceTree = ""; }; + 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPHeadersTests.swift; sourceTree = ""; }; + 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+AlamofireTests.swift"; sourceTree = ""; }; + 31181E172794FF9600E88600 /* certPEM.cer */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = certPEM.cer; sourceTree = ""; }; + 31181E182794FF9600E88600 /* randomGibberish.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = randomGibberish.crt; sourceTree = ""; }; + 31181E192794FF9600E88600 /* certDER.der */ = {isa = PBXFileReference; lastKnownFileType = file; path = certDER.der; sourceTree = ""; }; + 31181E1A2794FF9600E88600 /* keyDER.der */ = {isa = PBXFileReference; lastKnownFileType = file; path = keyDER.der; sourceTree = ""; }; + 31181E1B2794FF9600E88600 /* certDER.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = certDER.cer; sourceTree = ""; }; + 31181E1C2794FF9600E88600 /* certPEM.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = certPEM.crt; sourceTree = ""; }; + 31181E1D2794FF9600E88600 /* certDER.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = certDER.crt; sourceTree = ""; }; + 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "alamofire-signing-ca2.cer"; sourceTree = ""; }; + 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "alamofire-signing-ca1.cer"; sourceTree = ""; }; + 31181E212794FF9600E88600 /* signed-by-ca2.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "signed-by-ca2.cer"; sourceTree = ""; }; + 31181E222794FF9600E88600 /* signed-by-ca1.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "signed-by-ca1.cer"; sourceTree = ""; }; + 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "missing-dns-name-and-uri.cer"; sourceTree = ""; }; + 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = wildcard.alamofire.org.cer; sourceTree = ""; }; + 31181E252794FF9600E88600 /* test.alamofire.org.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = test.alamofire.org.cer; sourceTree = ""; }; + 31181E262794FF9600E88600 /* alamofire-root-ca.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "alamofire-root-ca.cer"; sourceTree = ""; }; + 31181E272794FF9600E88600 /* valid-uri.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "valid-uri.cer"; sourceTree = ""; }; + 31181E282794FF9600E88600 /* multiple-dns-names.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "multiple-dns-names.cer"; sourceTree = ""; }; + 31181E292794FF9600E88600 /* expired.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = expired.cer; sourceTree = ""; }; + 31181E2A2794FF9600E88600 /* valid-dns-name.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "valid-dns-name.cer"; sourceTree = ""; }; + 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "expired.badssl.com-intermediate-ca-1.cer"; sourceTree = ""; }; + 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "expired.badssl.com-intermediate-ca-2.cer"; sourceTree = ""; }; + 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "expired.badssl.com-root-ca.cer"; sourceTree = ""; }; + 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = "expired.badssl.com-leaf.cer"; sourceTree = ""; }; + 311B198F20B0D3B40036823B /* MultipartUpload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipartUpload.swift; sourceTree = ""; }; + 31293065263E17D600473CEA /* Alamofire watchOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Alamofire watchOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 312D1E0B1FC2551400E51FF1 /* Usage.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = Usage.md; path = Documentation/Usage.md; sourceTree = ""; }; + 312D1E0C1FC2551400E51FF1 /* AdvancedUsage.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = AdvancedUsage.md; path = Documentation/AdvancedUsage.md; sourceTree = ""; }; + 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InternalRequestTests.swift; sourceTree = ""; }; + 3145E0E227977AA300949557 /* iOS-NoTS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "iOS-NoTS.xctestplan"; sourceTree = ""; }; + 3145E0E32797A8EF00949557 /* tvOS-NoTS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "tvOS-NoTS.xctestplan"; sourceTree = ""; }; + 3145E0E42797A8EF00949557 /* tvOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = tvOS.xctestplan; sourceTree = ""; }; + 3145E0E52797A8EF00949557 /* tvOS-Old.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "tvOS-Old.xctestplan"; sourceTree = ""; }; + 3145E0E62797D91600949557 /* watchOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = watchOS.xctestplan; sourceTree = ""; }; + 3145E0E72797D94200949557 /* watchOS-NoTS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "watchOS-NoTS.xctestplan"; sourceTree = ""; }; + 3145E0E82797D9E700949557 /* macOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = macOS.xctestplan; sourceTree = ""; }; + 3145E0E92797D9E900949557 /* macOS-NoTS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "macOS-NoTS.xctestplan"; sourceTree = ""; }; + 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Request+AlamofireTests.swift"; sourceTree = ""; }; + 31501E872196962A005829F2 /* ParameterEncoderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParameterEncoderTests.swift; sourceTree = ""; }; + 31577E0A2676E72D001C7532 /* FUNDING.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = FUNDING.yml; sourceTree = ""; }; + 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StringEncoding+Alamofire.swift"; sourceTree = ""; }; + 3165407229AEBC0400C9BE08 /* RequestCompression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestCompression.swift; sourceTree = ""; }; + 31727417218BAEC90039FFCC /* HTTPMethod.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPMethod.swift; sourceTree = ""; }; + 3172741C218BB1790039FFCC /* ParameterEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParameterEncoder.swift; sourceTree = ""; }; + 31727421218BB9A50039FFCC /* TestHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestHelpers.swift; sourceTree = ""; }; + 317338C42A43A4FA00D4EA0A /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 317338F42A43BE5F00D4EA0A /* Alamofire visionOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Alamofire visionOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 317339432A43BF9E00D4EA0A /* visionOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = visionOS.xctestplan; sourceTree = ""; }; + 31762DC9247738FA0025C704 /* LeaksTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeaksTests.swift; sourceTree = ""; }; + 318DD40E2439780500963291 /* Combine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Combine.swift; sourceTree = ""; }; + 3191B5741F5F53A6003960A8 /* Protected.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Protected.swift; sourceTree = ""; }; + 31991790209CDA7F00103A19 /* Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = ""; }; + 31991791209CDA7F00103A19 /* Response.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Response.swift; sourceTree = ""; }; + 31991792209CDA7F00103A19 /* Session.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Session.swift; sourceTree = ""; }; + 31991793209CDA7F00103A19 /* SessionDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionDelegate.swift; sourceTree = ""; }; + 319917A4209CDAC400103A19 /* RequestTaskMap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestTaskMap.swift; sourceTree = ""; }; + 319917A9209CDCB000103A19 /* HTTPHeaders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPHeaders.swift; sourceTree = ""; }; + 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OperationQueue+Alamofire.swift"; sourceTree = ""; }; + 319ECEA025EC96E8001C38CA /* ci.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = ci.yml; sourceTree = ""; }; + 319ECEA125EC96E8001C38CA /* PULL_REQUEST_TEMPLATE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = PULL_REQUEST_TEMPLATE.md; sourceTree = ""; }; + 319ECEA225EC96E8001C38CA /* BUG_REPORT.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = BUG_REPORT.md; sourceTree = ""; }; + 319ECEA425EC96E8001C38CA /* config.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = config.yml; sourceTree = ""; }; + 319ECEA525EC9710001C38CA /* FEATURE_REQUEST.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = FEATURE_REQUEST.md; sourceTree = ""; }; + 31B2CA9521AA25CD005B371A /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + 31B3DE3A25C11CEA00760641 /* Concurrency.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Concurrency.swift; sourceTree = ""; }; + 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrencyTests.swift; sourceTree = ""; }; + 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestModifierTests.swift; sourceTree = ""; }; + 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombineTests.swift; sourceTree = ""; }; + 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLConvertible+URLRequestConvertible.swift"; sourceTree = ""; }; + 31DADDFA224811ED0051390F /* AlamofireExtended.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlamofireExtended.swift; sourceTree = ""; }; + 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "AFError+AlamofireTests.swift"; sourceTree = ""; }; + 31EF4BF5279646450048A19D /* iOS.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = iOS.xctestplan; sourceTree = ""; }; + 31EF4BF627964B520048A19D /* iOS-Old.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "iOS-Old.xctestplan"; sourceTree = ""; }; + 31F1AA4123F75AEE00C2BB80 /* Alamofire 5.0 Migration Guide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Alamofire 5.0 Migration Guide.md"; path = "Documentation/Alamofire 5.0 Migration Guide.md"; sourceTree = ""; }; + 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "URLSessionConfiguration+Alamofire.swift"; sourceTree = ""; }; + 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLoggingEventMonitor.swift; sourceTree = ""; }; + 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLEncodedFormEncoder.swift; sourceTree = ""; }; + 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+Alamofire.swift"; sourceTree = ""; }; + 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseSerializationTests.swift; sourceTree = ""; }; + 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestInterceptorTests.swift; sourceTree = ""; }; + 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "URLRequest+Alamofire.swift"; sourceTree = ""; }; + 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandler.swift; sourceTree = ""; }; + 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RedirectHandlerTests.swift; sourceTree = ""; }; + 4C1DC8531B68908E00476DE3 /* AFError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AFError.swift; sourceTree = ""; }; + 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormData.swift; sourceTree = ""; }; + 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestInterceptor.swift; sourceTree = ""; }; + 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryPolicy.swift; sourceTree = ""; }; + 4C256A501B096C2C0065714F /* BaseTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTestCase.swift; sourceTree = ""; }; + 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultipartFormDataTests.swift; sourceTree = ""; }; + 4C33A1231B5207DB00873DFF /* rainbow.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = rainbow.jpg; sourceTree = ""; }; + 4C33A1241B5207DB00873DFF /* unicorn.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = unicorn.png; sourceTree = ""; }; + 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerTrustEvaluatorTests.swift; sourceTree = ""; }; + 4C341BB91B1A865A00C1B34D /* CacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheTests.swift; sourceTree = ""; }; + 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkReachabilityManager.swift; sourceTree = ""; }; + 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkReachabilityManagerTests.swift; sourceTree = ""; }; + 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DispatchQueue+Alamofire.swift"; sourceTree = ""; }; + 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedResponseHandler.swift; sourceTree = ""; }; + 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationInterceptor.swift; sourceTree = ""; }; + 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Result+AlamofireTests.swift"; sourceTree = ""; }; + 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerTrustEvaluation.swift; sourceTree = ""; }; + 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionDelegateTests.swift; sourceTree = ""; }; + 4C9E88371F5FB3B0000BEC61 /* Alamofire 2.0 Migration Guide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Alamofire 2.0 Migration Guide.md"; path = "Documentation/Alamofire 2.0 Migration Guide.md"; sourceTree = ""; }; + 4C9E88381F5FB3B0000BEC61 /* Alamofire 3.0 Migration Guide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Alamofire 3.0 Migration Guide.md"; path = "Documentation/Alamofire 3.0 Migration Guide.md"; sourceTree = ""; }; + 4C9E88391F5FB3B0000BEC61 /* Alamofire 4.0 Migration Guide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Alamofire 4.0 Migration Guide.md"; path = "Documentation/Alamofire 4.0 Migration Guide.md"; sourceTree = ""; }; + 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationInterceptorTests.swift; sourceTree = ""; }; + 4CB928281C66BFBC00CE5F08 /* Notifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Notifications.swift; sourceTree = ""; }; + 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RetryPolicyTests.swift; sourceTree = ""; }; + 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLProtocolTests.swift; sourceTree = ""; }; + 4CDE2C421AF89F0900BABAE5 /* Validation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Validation.swift; sourceTree = ""; }; + 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseSerialization.swift; sourceTree = ""; }; + 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParameterEncoding.swift; sourceTree = ""; }; + 4CE292311EF4A393008DA555 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 4CE292321EF4A393008DA555 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + 4CE292331EF4A393008DA555 /* CONTRIBUTING.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CONTRIBUTING.md; sourceTree = ""; }; + 4CE292391EF4B12B008DA555 /* Alamofire.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = Alamofire.podspec; sourceTree = ""; }; + 4CF3B4281F5FC7900075BE59 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 4CF626EF1BA7CB3E0011A099 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CF626F81BA7CB3E0011A099 /* Alamofire tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Alamofire tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FileManager+AlamofireTests.swift"; sourceTree = ""; }; + 4CFB02EA1D7D2FA20056F249 /* empty_data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = empty_data.json; sourceTree = ""; }; + 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = invalid_data.json; sourceTree = ""; }; + 4CFB02EC1D7D2FA20056F249 /* valid_data.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = valid_data.json; sourceTree = ""; }; + 4CFB02F21D7D2FA20056F249 /* empty_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = empty_string.txt; sourceTree = ""; }; + 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = utf32_string.txt; sourceTree = ""; }; + 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = utf8_string.txt; sourceTree = ""; }; + 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedResponseHandlerTests.swift; sourceTree = ""; }; + 4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E4202FE01B667AA100C997FB /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F8111E3319A95C8B0040E7D1 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F8111E3719A95C8B0040E7D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F8111E3E19A95C8B0040E7D1 /* Alamofire iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Alamofire iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + F8111E4119A95C8B0040E7D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadTests.swift; sourceTree = ""; }; + F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParameterEncodingTests.swift; sourceTree = ""; }; + F8111E5D19A9674D0040E7D1 /* RequestTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestTests.swift; sourceTree = ""; }; + F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseTests.swift; sourceTree = ""; }; + F8111E5F19A9674D0040E7D1 /* UploadTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UploadTests.swift; sourceTree = ""; }; + F829C6B21A7A94F100A2CD59 /* Alamofire macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Alamofire macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TLSEvaluationTests.swift; sourceTree = ""; }; + F897FF4019AA800700AB5182 /* Alamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Alamofire.swift; sourceTree = ""; }; + F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationTests.swift; sourceTree = ""; }; + F8D1C6F419D52968002E74FE /* SessionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SessionTests.swift; sourceTree = ""; }; + F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 31293062263E17D600473CEA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3129306A263E17D600473CEA /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338C12A43A4FA00D4EA0A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338F12A43BE5F00D4EA0A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 317338F82A43BE5F00D4EA0A /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626EB1BA7CB3E0011A099 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626F51BA7CB3E0011A099 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CF626F91BA7CB3E0011A099 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4DD67C071A5C55C900ED2280 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E4202FD91B667AA100C997FB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E2F19A95C8B0040E7D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E3B19A95C8B0040E7D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8035DB621BAB492500466CB3 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F829C6AF1A7A94F100A2CD59 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F829C6B81A7A94F100A2CD59 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 31181E162794FF9600E88600 /* selfSignedAndMalformedCerts */ = { + isa = PBXGroup; + children = ( + 31181E172794FF9600E88600 /* certPEM.cer */, + 31181E182794FF9600E88600 /* randomGibberish.crt */, + 31181E192794FF9600E88600 /* certDER.der */, + 31181E1A2794FF9600E88600 /* keyDER.der */, + 31181E1B2794FF9600E88600 /* certDER.cer */, + 31181E1C2794FF9600E88600 /* certPEM.crt */, + 31181E1D2794FF9600E88600 /* certDER.crt */, + ); + path = selfSignedAndMalformedCerts; + sourceTree = ""; + }; + 31181E1E2794FF9600E88600 /* alamofire-org */ = { + isa = PBXGroup; + children = ( + 31181E1F2794FF9600E88600 /* alamofire-signing-ca2.cer */, + 31181E202794FF9600E88600 /* alamofire-signing-ca1.cer */, + 31181E212794FF9600E88600 /* signed-by-ca2.cer */, + 31181E222794FF9600E88600 /* signed-by-ca1.cer */, + 31181E232794FF9600E88600 /* missing-dns-name-and-uri.cer */, + 31181E242794FF9600E88600 /* wildcard.alamofire.org.cer */, + 31181E252794FF9600E88600 /* test.alamofire.org.cer */, + 31181E262794FF9600E88600 /* alamofire-root-ca.cer */, + 31181E272794FF9600E88600 /* valid-uri.cer */, + 31181E282794FF9600E88600 /* multiple-dns-names.cer */, + 31181E292794FF9600E88600 /* expired.cer */, + 31181E2A2794FF9600E88600 /* valid-dns-name.cer */, + ); + path = "alamofire-org"; + sourceTree = ""; + }; + 31181E2B2794FF9600E88600 /* expired-badssl-com */ = { + isa = PBXGroup; + children = ( + 31181E2C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer */, + 31181E2D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer */, + 31181E2E2794FF9600E88600 /* expired.badssl.com-root-ca.cer */, + 31181E2F2794FF9600E88600 /* expired.badssl.com-leaf.cer */, + ); + path = "expired-badssl-com"; + sourceTree = ""; + }; + 319ECE9E25EC96E8001C38CA /* .github */ = { + isa = PBXGroup; + children = ( + 319ECEA125EC96E8001C38CA /* PULL_REQUEST_TEMPLATE.md */, + 31577E0A2676E72D001C7532 /* FUNDING.yml */, + 319ECEA325EC96E8001C38CA /* ISSUE_TEMPLATE */, + 319ECE9F25EC96E8001C38CA /* workflows */, + ); + path = .github; + sourceTree = ""; + }; + 319ECE9F25EC96E8001C38CA /* workflows */ = { + isa = PBXGroup; + children = ( + 319ECEA025EC96E8001C38CA /* ci.yml */, + ); + path = workflows; + sourceTree = ""; + }; + 319ECEA325EC96E8001C38CA /* ISSUE_TEMPLATE */ = { + isa = PBXGroup; + children = ( + 319ECEA225EC96E8001C38CA /* BUG_REPORT.md */, + 319ECEA525EC9710001C38CA /* FEATURE_REQUEST.md */, + 319ECEA425EC96E8001C38CA /* config.yml */, + ); + path = ISSUE_TEMPLATE; + sourceTree = ""; + }; + 31EF4BF4279646000048A19D /* Test Plans */ = { + isa = PBXGroup; + children = ( + 3145E0E227977AA300949557 /* iOS-NoTS.xctestplan */, + 31EF4BF627964B520048A19D /* iOS-Old.xctestplan */, + 31EF4BF5279646450048A19D /* iOS.xctestplan */, + 3145E0E92797D9E900949557 /* macOS-NoTS.xctestplan */, + 3145E0E82797D9E700949557 /* macOS.xctestplan */, + 3145E0E32797A8EF00949557 /* tvOS-NoTS.xctestplan */, + 3145E0E52797A8EF00949557 /* tvOS-Old.xctestplan */, + 3145E0E42797A8EF00949557 /* tvOS.xctestplan */, + 317339432A43BF9E00D4EA0A /* visionOS.xctestplan */, + 3145E0E72797D94200949557 /* watchOS-NoTS.xctestplan */, + 3145E0E62797D91600949557 /* watchOS.xctestplan */, + ); + path = "Test Plans"; + sourceTree = ""; + }; + 4C256A4E1B09656A0065714F /* Core */ = { + isa = PBXGroup; + children = ( + F8E6024419CB46A800A3E7F1 /* AuthenticationTests.swift */, + 3106FB6423F8D9E0007FAB43 /* DataStreamTests.swift */, + F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */, + 31425AC0241F098000EE3CCC /* InternalRequestTests.swift */, + 31501E872196962A005829F2 /* ParameterEncoderTests.swift */, + F8111E5C19A9674D0040E7D1 /* ParameterEncodingTests.swift */, + 31B51E8B2434FECB005356DB /* RequestModifierTests.swift */, + F8111E5D19A9674D0040E7D1 /* RequestTests.swift */, + F8111E5E19A9674D0040E7D1 /* ResponseTests.swift */, + 4C9DCE771CB1BCE2003E6463 /* SessionDelegateTests.swift */, + F8D1C6F419D52968002E74FE /* SessionTests.swift */, + F8111E5F19A9674D0040E7D1 /* UploadTests.swift */, + ); + name = Core; + sourceTree = ""; + }; + 4C256A4F1B09656E0065714F /* Features */ = { + isa = PBXGroup; + children = ( + 4CB0080C2455FE9700C38783 /* AuthenticationInterceptorTests.swift */, + 4CFD6B132201338E00FFB5E3 /* CachedResponseHandlerTests.swift */, + 4C341BB91B1A865A00C1B34D /* CacheTests.swift */, + 31BADE4D2439A8D1007D2AB9 /* CombineTests.swift */, + 31B3DE4E25C120D800760641 /* ConcurrencyTests.swift */, + 3113D46A21878227001CCD21 /* HTTPHeadersTests.swift */, + 4C3238E61B3604DB00FE04AE /* MultipartFormDataTests.swift */, + 4C3D00571C66A8B900D1F709 /* NetworkReachabilityManagerTests.swift */, + 3106FB6023F8C53A007FAB43 /* ProtectedTests.swift */, + 4C0CB64A220CA8D600604EDC /* RedirectHandlerTests.swift */, + 4C0CB630220BC70300604EDC /* RequestInterceptorTests.swift */, + 4C0B58381B747A4400C0B99C /* ResponseSerializationTests.swift */, + 4CBD217F220B48AE008F1C59 /* RetryPolicyTests.swift */, + 4C33A1421B52089C00873DFF /* ServerTrustEvaluatorTests.swift */, + F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */, + 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */, + F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */, + ); + name = Features; + sourceTree = ""; + }; + 4C3238E91B3617A600FE04AE /* Resources */ = { + isa = PBXGroup; + children = ( + 4C33A1171B5207DB00873DFF /* Certificates */, + 4C33A1221B5207DB00873DFF /* Images */, + 4CFB02E81D7D2FA20056F249 /* Responses */, + ); + name = Resources; + sourceTree = ""; + }; + 4C33A1171B5207DB00873DFF /* Certificates */ = { + isa = PBXGroup; + children = ( + 31181E1E2794FF9600E88600 /* alamofire-org */, + 31181E2B2794FF9600E88600 /* expired-badssl-com */, + 31181E162794FF9600E88600 /* selfSignedAndMalformedCerts */, + ); + name = Certificates; + path = Resources/Certificates; + sourceTree = ""; + }; + 4C33A1221B5207DB00873DFF /* Images */ = { + isa = PBXGroup; + children = ( + 4C33A1231B5207DB00873DFF /* rainbow.jpg */, + 4C33A1241B5207DB00873DFF /* unicorn.png */, + ); + name = Images; + path = Resources/Images; + sourceTree = ""; + }; + 4C4366991D7BB92700C38AAD /* Extensions */ = { + isa = PBXGroup; + children = ( + 4C43669A1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift */, + 319917B8209CE53A00103A19 /* OperationQueue+Alamofire.swift */, + 4196936122FA1E05001EA5D5 /* Result+Alamofire.swift */, + 315A4C55241EF28B00D57C7A /* StringEncoding+Alamofire.swift */, + 4C0CB640220CA89400604EDC /* URLRequest+Alamofire.swift */, + 31F5085C20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift */, + ); + name = Extensions; + sourceTree = ""; + }; + 4C7C8D201B9D0D7300948136 /* Extensions */ = { + isa = PBXGroup; + children = ( + 31ED52E61D73889D00199085 /* AFError+AlamofireTests.swift */, + 31181E112794FE5400E88600 /* Bundle+AlamofireTests.swift */, + 4CFB028F1D7CF28F0056F249 /* FileManager+AlamofireTests.swift */, + 314998E927A6560600ABB856 /* Request+AlamofireTests.swift */, + 4C7DD7EA224C627300249836 /* Result+AlamofireTests.swift */, + ); + name = Extensions; + sourceTree = ""; + }; + 4C9E88361F5FB39F000BEC61 /* Migration Guides */ = { + isa = PBXGroup; + children = ( + 4C9E88371F5FB3B0000BEC61 /* Alamofire 2.0 Migration Guide.md */, + 4C9E88381F5FB3B0000BEC61 /* Alamofire 3.0 Migration Guide.md */, + 4C9E88391F5FB3B0000BEC61 /* Alamofire 4.0 Migration Guide.md */, + 31F1AA4123F75AEE00C2BB80 /* Alamofire 5.0 Migration Guide.md */, + ); + name = "Migration Guides"; + sourceTree = ""; + }; + 4CDE2C481AF8A14A00BABAE5 /* Core */ = { + isa = PBXGroup; + children = ( + 4C1DC8531B68908E00476DE3 /* AFError.swift */, + 319917A9209CDCB000103A19 /* HTTPHeaders.swift */, + 31727417218BAEC90039FFCC /* HTTPMethod.swift */, + 4CB928281C66BFBC00CE5F08 /* Notifications.swift */, + 3172741C218BB1790039FFCC /* ParameterEncoder.swift */, + 4CE2724E1AF88FB500F1D59A /* ParameterEncoding.swift */, + 3191B5741F5F53A6003960A8 /* Protected.swift */, + 31991790209CDA7F00103A19 /* Request.swift */, + 319917A4209CDAC400103A19 /* RequestTaskMap.swift */, + 31991791209CDA7F00103A19 /* Response.swift */, + 31991792209CDA7F00103A19 /* Session.swift */, + 31991793209CDA7F00103A19 /* SessionDelegate.swift */, + 31D83FCD20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift */, + ); + name = Core; + sourceTree = ""; + }; + 4CDE2C491AF8A14E00BABAE5 /* Features */ = { + isa = PBXGroup; + children = ( + 31DADDFA224811ED0051390F /* AlamofireExtended.swift */, + 4C67D1352454B12A00CBA725 /* AuthenticationInterceptor.swift */, + 4C4466EA21F8F5D800AC9703 /* CachedResponseHandler.swift */, + 318DD40E2439780500963291 /* Combine.swift */, + 31B3DE3A25C11CEA00760641 /* Concurrency.swift */, + 3111CE8720A77843008315E2 /* EventMonitor.swift */, + 4C23EB421B327C5B0090E0BC /* MultipartFormData.swift */, + 311B198F20B0D3B40036823B /* MultipartUpload.swift */, + 4C3D00531C66A63000D1F709 /* NetworkReachabilityManager.swift */, + 4C0CB645220CA8A400604EDC /* RedirectHandler.swift */, + 3165407229AEBC0400C9BE08 /* RequestCompression.swift */, + 4C256A0521EEB69000AD5D87 /* RequestInterceptor.swift */, + 4CDE2C451AF89FF300BABAE5 /* ResponseSerialization.swift */, + 4C256A1921F1449C00AD5D87 /* RetryPolicy.swift */, + 4C811F8C1B51856D00E0F59A /* ServerTrustEvaluation.swift */, + 31FB2F8622C828D8007FD6D5 /* URLEncodedFormEncoder.swift */, + 4CDE2C421AF89F0900BABAE5 /* Validation.swift */, + ); + name = Features; + sourceTree = ""; + }; + 4CE292301EF4A386008DA555 /* Documentation */ = { + isa = PBXGroup; + children = ( + 312D1E0C1FC2551400E51FF1 /* AdvancedUsage.md */, + 312D1E0B1FC2551400E51FF1 /* Usage.md */, + 4C9E88361F5FB39F000BEC61 /* Migration Guides */, + ); + name = Documentation; + sourceTree = ""; + }; + 4CE292381EF4B116008DA555 /* Deployment */ = { + isa = PBXGroup; + children = ( + 319ECE9E25EC96E8001C38CA /* .github */, + 4CE292391EF4B12B008DA555 /* Alamofire.podspec */, + 4CE292321EF4A393008DA555 /* CHANGELOG.md */, + 4CE292331EF4A393008DA555 /* CONTRIBUTING.md */, + 4CF3B4281F5FC7900075BE59 /* LICENSE */, + 31B2CA9521AA25CD005B371A /* Package.swift */, + 4CE292311EF4A393008DA555 /* README.md */, + ); + name = Deployment; + sourceTree = ""; + }; + 4CFB02E81D7D2FA20056F249 /* Responses */ = { + isa = PBXGroup; + children = ( + 4CFB02E91D7D2FA20056F249 /* JSON */, + 4CFB02F11D7D2FA20056F249 /* String */, + ); + name = Responses; + path = Resources/Responses; + sourceTree = ""; + }; + 4CFB02E91D7D2FA20056F249 /* JSON */ = { + isa = PBXGroup; + children = ( + 4CFB02EA1D7D2FA20056F249 /* empty_data.json */, + 4CFB02EB1D7D2FA20056F249 /* invalid_data.json */, + 4CFB02EC1D7D2FA20056F249 /* valid_data.json */, + ); + path = JSON; + sourceTree = ""; + }; + 4CFB02F11D7D2FA20056F249 /* String */ = { + isa = PBXGroup; + children = ( + 4CFB02F21D7D2FA20056F249 /* empty_string.txt */, + 4CFB02F41D7D2FA20056F249 /* utf8_string.txt */, + 4CFB02F31D7D2FA20056F249 /* utf32_string.txt */, + ); + path = String; + sourceTree = ""; + }; + F8111E2919A95C8B0040E7D1 = { + isa = PBXGroup; + children = ( + 4CE292381EF4B116008DA555 /* Deployment */, + 4CE292301EF4A386008DA555 /* Documentation */, + F8111E3519A95C8B0040E7D1 /* Source */, + F8111E3F19A95C8B0040E7D1 /* Tests */, + F8111E3419A95C8B0040E7D1 /* Products */, + ); + indentWidth = 4; + sourceTree = ""; + tabWidth = 4; + usesTabs = 0; + }; + F8111E3419A95C8B0040E7D1 /* Products */ = { + isa = PBXGroup; + children = ( + F8111E3319A95C8B0040E7D1 /* Alamofire.framework */, + F8111E3E19A95C8B0040E7D1 /* Alamofire iOS Tests.xctest */, + 4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */, + F829C6B21A7A94F100A2CD59 /* Alamofire macOS Tests.xctest */, + E4202FE01B667AA100C997FB /* Alamofire.framework */, + 4CF626EF1BA7CB3E0011A099 /* Alamofire.framework */, + 4CF626F81BA7CB3E0011A099 /* Alamofire tvOS Tests.xctest */, + 31293065263E17D600473CEA /* Alamofire watchOS Tests.xctest */, + 317338C42A43A4FA00D4EA0A /* Alamofire.framework */, + 317338F42A43BE5F00D4EA0A /* Alamofire visionOS Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + F8111E3519A95C8B0040E7D1 /* Source */ = { + isa = PBXGroup; + children = ( + F897FF4019AA800700AB5182 /* Alamofire.swift */, + 4CDE2C481AF8A14A00BABAE5 /* Core */, + 4C4366991D7BB92700C38AAD /* Extensions */, + 4CDE2C491AF8A14E00BABAE5 /* Features */, + F8111E3619A95C8B0040E7D1 /* Supporting Files */, + ); + path = Source; + sourceTree = ""; + }; + F8111E3619A95C8B0040E7D1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + F8111E3719A95C8B0040E7D1 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + F8111E3F19A95C8B0040E7D1 /* Tests */ = { + isa = PBXGroup; + children = ( + 4C256A501B096C2C0065714F /* BaseTestCase.swift */, + 31762DC9247738FA0025C704 /* LeaksTests.swift */, + 31F9683B20BB70290009606F /* NSLoggingEventMonitor.swift */, + 31727421218BB9A50039FFCC /* TestHelpers.swift */, + 4C256A4E1B09656A0065714F /* Core */, + 4C7C8D201B9D0D7300948136 /* Extensions */, + 4C256A4F1B09656E0065714F /* Features */, + 4C3238E91B3617A600FE04AE /* Resources */, + F8111E4019A95C8B0040E7D1 /* Supporting Files */, + 31EF4BF4279646000048A19D /* Test Plans */, + ); + path = Tests; + sourceTree = ""; + }; + F8111E4019A95C8B0040E7D1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + F8111E4119A95C8B0040E7D1 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 31293064263E17D600473CEA /* Alamofire watchOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3129306F263E17D600473CEA /* Build configuration list for PBXNativeTarget "Alamofire watchOS Tests" */; + buildPhases = ( + 31293061263E17D600473CEA /* Sources */, + 31293062263E17D600473CEA /* Frameworks */, + 31293063263E17D600473CEA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3129306C263E17D600473CEA /* PBXTargetDependency */, + ); + name = "Alamofire watchOS Tests"; + productName = "Alamofire watchOS Tests"; + productReference = 31293065263E17D600473CEA /* Alamofire watchOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 317338C32A43A4FA00D4EA0A /* Alamofire visionOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 317338CA2A43A4FB00D4EA0A /* Build configuration list for PBXNativeTarget "Alamofire visionOS" */; + buildPhases = ( + 317338C02A43A4FA00D4EA0A /* Sources */, + 317338C12A43A4FA00D4EA0A /* Frameworks */, + 317338C22A43A4FA00D4EA0A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Alamofire visionOS"; + productName = "Alamofire visionOS"; + productReference = 317338C42A43A4FA00D4EA0A /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + 317338F32A43BE5F00D4EA0A /* Alamofire visionOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 317338FB2A43BE5F00D4EA0A /* Build configuration list for PBXNativeTarget "Alamofire visionOS Tests" */; + buildPhases = ( + 317338F02A43BE5F00D4EA0A /* Sources */, + 317338F12A43BE5F00D4EA0A /* Frameworks */, + 317338F22A43BE5F00D4EA0A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 317338FA2A43BE5F00D4EA0A /* PBXTargetDependency */, + ); + name = "Alamofire visionOS Tests"; + productName = "Alamofire visionOS Tests"; + productReference = 317338F42A43BE5F00D4EA0A /* Alamofire visionOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4CF626EE1BA7CB3E0011A099 /* Alamofire tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CF627041BA7CB3E0011A099 /* Build configuration list for PBXNativeTarget "Alamofire tvOS" */; + buildPhases = ( + 4CF626EA1BA7CB3E0011A099 /* Sources */, + 4CF626EB1BA7CB3E0011A099 /* Frameworks */, + 4CF626ED1BA7CB3E0011A099 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Alamofire tvOS"; + productName = "Alamofire tvOS"; + productReference = 4CF626EF1BA7CB3E0011A099 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + 4CF626F71BA7CB3E0011A099 /* Alamofire tvOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CF627051BA7CB3E0011A099 /* Build configuration list for PBXNativeTarget "Alamofire tvOS Tests" */; + buildPhases = ( + 4CF626F41BA7CB3E0011A099 /* Sources */, + 4CF626F51BA7CB3E0011A099 /* Frameworks */, + 4CF626F61BA7CB3E0011A099 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4CF626FB1BA7CB3E0011A099 /* PBXTargetDependency */, + ); + name = "Alamofire tvOS Tests"; + productName = "Alamofire tvOSTests"; + productReference = 4CF626F81BA7CB3E0011A099 /* Alamofire tvOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4DD67C0A1A5C55C900ED2280 /* Alamofire macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4DD67C1E1A5C55C900ED2280 /* Build configuration list for PBXNativeTarget "Alamofire macOS" */; + buildPhases = ( + 4DD67C061A5C55C900ED2280 /* Sources */, + 4DD67C071A5C55C900ED2280 /* Frameworks */, + 4DD67C091A5C55C900ED2280 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Alamofire macOS"; + productName = AlamofireOSX; + productReference = 4DD67C0B1A5C55C900ED2280 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + E4202FCD1B667AA100C997FB /* Alamofire watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = E4202FDD1B667AA100C997FB /* Build configuration list for PBXNativeTarget "Alamofire watchOS" */; + buildPhases = ( + E4202FCE1B667AA100C997FB /* Sources */, + E4202FD91B667AA100C997FB /* Frameworks */, + E4202FDC1B667AA100C997FB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Alamofire watchOS"; + productName = Alamofire; + productReference = E4202FE01B667AA100C997FB /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + F8111E3219A95C8B0040E7D1 /* Alamofire iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = F8111E4619A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Alamofire iOS" */; + buildPhases = ( + F8111E2E19A95C8B0040E7D1 /* Sources */, + F8111E2F19A95C8B0040E7D1 /* Frameworks */, + F8111E3119A95C8B0040E7D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Alamofire iOS"; + productName = Alamofire; + productReference = F8111E3319A95C8B0040E7D1 /* Alamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + F8111E3D19A95C8B0040E7D1 /* Alamofire iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F8111E4919A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Alamofire iOS Tests" */; + buildPhases = ( + F8111E3A19A95C8B0040E7D1 /* Sources */, + F8111E3B19A95C8B0040E7D1 /* Frameworks */, + F8111E3C19A95C8B0040E7D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F8111E6619A967880040E7D1 /* PBXTargetDependency */, + ); + name = "Alamofire iOS Tests"; + productName = AlamofireTests; + productReference = F8111E3E19A95C8B0040E7D1 /* Alamofire iOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + F829C6B11A7A94F100A2CD59 /* Alamofire macOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = F829C6BB1A7A94F100A2CD59 /* Build configuration list for PBXNativeTarget "Alamofire macOS Tests" */; + buildPhases = ( + F829C6AE1A7A94F100A2CD59 /* Sources */, + F829C6AF1A7A94F100A2CD59 /* Frameworks */, + F829C6B01A7A94F100A2CD59 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F829C6BA1A7A94F100A2CD59 /* PBXTargetDependency */, + ); + name = "Alamofire macOS Tests"; + productName = "Alamofire OSX Tests"; + productReference = F829C6B21A7A94F100A2CD59 /* Alamofire macOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F8111E2A19A95C8B0040E7D1 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + ORGANIZATIONNAME = Alamofire; + TargetAttributes = { + 31293064263E17D600473CEA = { + CreatedOnToolsVersion = 12.5; + }; + 317338C32A43A4FA00D4EA0A = { + CreatedOnToolsVersion = 15.0; + }; + 317338F32A43BE5F00D4EA0A = { + CreatedOnToolsVersion = 15.0; + }; + 4CF626EE1BA7CB3E0011A099 = { + CreatedOnToolsVersion = 7.1; + LastSwiftMigration = 0900; + }; + 4CF626F71BA7CB3E0011A099 = { + CreatedOnToolsVersion = 7.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Manual; + }; + 4DD67C0A1A5C55C900ED2280 = { + CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0900; + }; + E4202FCD1B667AA100C997FB = { + LastSwiftMigration = 0900; + }; + F8111E3219A95C8B0040E7D1 = { + CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 1020; + }; + F8111E3D19A95C8B0040E7D1 = { + CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 1020; + }; + F829C6B11A7A94F100A2CD59 = { + CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0900; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = F8111E2D19A95C8B0040E7D1 /* Build configuration list for PBXProject "Alamofire" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F8111E2919A95C8B0040E7D1; + productRefGroup = F8111E3419A95C8B0040E7D1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + F8111E3219A95C8B0040E7D1 /* Alamofire iOS */, + F8111E3D19A95C8B0040E7D1 /* Alamofire iOS Tests */, + 4DD67C0A1A5C55C900ED2280 /* Alamofire macOS */, + F829C6B11A7A94F100A2CD59 /* Alamofire macOS Tests */, + 4CF626EE1BA7CB3E0011A099 /* Alamofire tvOS */, + 4CF626F71BA7CB3E0011A099 /* Alamofire tvOS Tests */, + E4202FCD1B667AA100C997FB /* Alamofire watchOS */, + 31293064263E17D600473CEA /* Alamofire watchOS Tests */, + 317338C32A43A4FA00D4EA0A /* Alamofire visionOS */, + 317338F32A43BE5F00D4EA0A /* Alamofire visionOS Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 31293063263E17D600473CEA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31181E4F2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */, + 31181E632794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */, + 31181E772794FF9600E88600 /* expired.cer in Resources */, + 31181E332794FF9600E88600 /* certPEM.cer in Resources */, + 312930AA263E187200473CEA /* unicorn.png in Resources */, + 31181E432794FF9600E88600 /* certDER.cer in Resources */, + 312930AE263E187500473CEA /* invalid_data.json in Resources */, + 312930AD263E187500473CEA /* valid_data.json in Resources */, + 312930B1263E187800473CEA /* utf32_string.txt in Resources */, + 31181E5F2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */, + 312930AF263E187800473CEA /* empty_string.txt in Resources */, + 31181E6F2794FF9600E88600 /* valid-uri.cer in Resources */, + 31181E7F2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */, + 31181E832794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */, + 31181E4B2794FF9600E88600 /* certDER.crt in Resources */, + 31181E372794FF9600E88600 /* randomGibberish.crt in Resources */, + 31181E532794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */, + 31181E7B2794FF9600E88600 /* valid-dns-name.cer in Resources */, + 31181E8B2794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */, + 31181E3F2794FF9600E88600 /* keyDER.der in Resources */, + 31181E5B2794FF9600E88600 /* signed-by-ca1.cer in Resources */, + 312930AB263E187200473CEA /* rainbow.jpg in Resources */, + 31181E672794FF9600E88600 /* test.alamofire.org.cer in Resources */, + 312930B0263E187800473CEA /* utf8_string.txt in Resources */, + 31181E6B2794FF9600E88600 /* alamofire-root-ca.cer in Resources */, + 31181E572794FF9600E88600 /* signed-by-ca2.cer in Resources */, + 31181E872794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */, + 312930AC263E187500473CEA /* empty_data.json in Resources */, + 31181E732794FF9600E88600 /* multiple-dns-names.cer in Resources */, + 31181E472794FF9600E88600 /* certPEM.crt in Resources */, + 31181E3B2794FF9600E88600 /* certDER.der in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338C22A43A4FA00D4EA0A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338F22A43BE5F00D4EA0A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 317339242A43BEAC00D4EA0A /* alamofire-signing-ca2.cer in Resources */, + 317339252A43BEAC00D4EA0A /* alamofire-signing-ca1.cer in Resources */, + 317339262A43BEAC00D4EA0A /* signed-by-ca2.cer in Resources */, + 317339272A43BEAC00D4EA0A /* signed-by-ca1.cer in Resources */, + 317339282A43BEAC00D4EA0A /* missing-dns-name-and-uri.cer in Resources */, + 317339292A43BEAC00D4EA0A /* wildcard.alamofire.org.cer in Resources */, + 3173392A2A43BEAC00D4EA0A /* test.alamofire.org.cer in Resources */, + 3173392B2A43BEAC00D4EA0A /* alamofire-root-ca.cer in Resources */, + 3173392C2A43BEAC00D4EA0A /* valid-uri.cer in Resources */, + 3173392D2A43BEAC00D4EA0A /* multiple-dns-names.cer in Resources */, + 3173392E2A43BEAC00D4EA0A /* expired.cer in Resources */, + 3173392F2A43BEAC00D4EA0A /* valid-dns-name.cer in Resources */, + 317339302A43BEAC00D4EA0A /* expired.badssl.com-intermediate-ca-1.cer in Resources */, + 317339312A43BEAC00D4EA0A /* expired.badssl.com-intermediate-ca-2.cer in Resources */, + 317339322A43BEAC00D4EA0A /* expired.badssl.com-root-ca.cer in Resources */, + 317339332A43BEAC00D4EA0A /* expired.badssl.com-leaf.cer in Resources */, + 317339342A43BEAC00D4EA0A /* certPEM.cer in Resources */, + 317339352A43BEAC00D4EA0A /* randomGibberish.crt in Resources */, + 317339362A43BEAC00D4EA0A /* certDER.der in Resources */, + 317339372A43BEAC00D4EA0A /* keyDER.der in Resources */, + 317339382A43BEAC00D4EA0A /* certDER.cer in Resources */, + 317339392A43BEAC00D4EA0A /* certPEM.crt in Resources */, + 3173393A2A43BEAC00D4EA0A /* certDER.crt in Resources */, + 3173393B2A43BEAC00D4EA0A /* rainbow.jpg in Resources */, + 3173393C2A43BEAC00D4EA0A /* unicorn.png in Resources */, + 3173393D2A43BEAC00D4EA0A /* empty_data.json in Resources */, + 3173393E2A43BEAC00D4EA0A /* invalid_data.json in Resources */, + 3173393F2A43BEAC00D4EA0A /* valid_data.json in Resources */, + 317339402A43BEAC00D4EA0A /* empty_string.txt in Resources */, + 317339412A43BEAC00D4EA0A /* utf8_string.txt in Resources */, + 317339422A43BEAC00D4EA0A /* utf32_string.txt in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626ED1BA7CB3E0011A099 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626F61BA7CB3E0011A099 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31181E4E2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */, + 31181E622794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */, + 31181E762794FF9600E88600 /* expired.cer in Resources */, + 31181E322794FF9600E88600 /* certPEM.cer in Resources */, + 4CFB03091D7D2FA20056F249 /* empty_string.txt in Resources */, + 31181E422794FF9600E88600 /* certDER.cer in Resources */, + 4CF627341BA7CC300011A099 /* rainbow.jpg in Resources */, + 4CFB02FD1D7D2FA20056F249 /* valid_data.json in Resources */, + 4CFB030C1D7D2FA20056F249 /* utf32_string.txt in Resources */, + 31181E5E2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */, + 4CFB030F1D7D2FA20056F249 /* utf8_string.txt in Resources */, + 31181E6E2794FF9600E88600 /* valid-uri.cer in Resources */, + 31181E7E2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */, + 31181E822794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */, + 31181E4A2794FF9600E88600 /* certDER.crt in Resources */, + 31181E362794FF9600E88600 /* randomGibberish.crt in Resources */, + 31181E522794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */, + 31181E7A2794FF9600E88600 /* valid-dns-name.cer in Resources */, + 31181E8A2794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */, + 31181E3E2794FF9600E88600 /* keyDER.der in Resources */, + 31181E5A2794FF9600E88600 /* signed-by-ca1.cer in Resources */, + 4CF627351BA7CC300011A099 /* unicorn.png in Resources */, + 31181E662794FF9600E88600 /* test.alamofire.org.cer in Resources */, + 4CFB02FA1D7D2FA20056F249 /* invalid_data.json in Resources */, + 31181E6A2794FF9600E88600 /* alamofire-root-ca.cer in Resources */, + 31181E562794FF9600E88600 /* signed-by-ca2.cer in Resources */, + 31181E862794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */, + 4CFB02F71D7D2FA20056F249 /* empty_data.json in Resources */, + 31181E722794FF9600E88600 /* multiple-dns-names.cer in Resources */, + 31181E462794FF9600E88600 /* certPEM.crt in Resources */, + 31181E3A2794FF9600E88600 /* certDER.der in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4DD67C091A5C55C900ED2280 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E4202FDC1B667AA100C997FB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E3119A95C8B0040E7D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E3C19A95C8B0040E7D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31181E4C2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */, + 31181E602794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */, + 31181E742794FF9600E88600 /* expired.cer in Resources */, + 31181E302794FF9600E88600 /* certPEM.cer in Resources */, + 4CFB03071D7D2FA20056F249 /* empty_string.txt in Resources */, + 31181E402794FF9600E88600 /* certDER.cer in Resources */, + 4C33A13B1B5207DB00873DFF /* unicorn.png in Resources */, + 4CFB02FB1D7D2FA20056F249 /* valid_data.json in Resources */, + 4CFB030A1D7D2FA20056F249 /* utf32_string.txt in Resources */, + 31181E5C2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */, + 4CFB030D1D7D2FA20056F249 /* utf8_string.txt in Resources */, + 31181E6C2794FF9600E88600 /* valid-uri.cer in Resources */, + 31181E7C2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */, + 31181E802794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */, + 31181E482794FF9600E88600 /* certDER.crt in Resources */, + 31181E342794FF9600E88600 /* randomGibberish.crt in Resources */, + 31181E502794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */, + 31181E782794FF9600E88600 /* valid-dns-name.cer in Resources */, + 31181E882794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */, + 31181E3C2794FF9600E88600 /* keyDER.der in Resources */, + 31181E582794FF9600E88600 /* signed-by-ca1.cer in Resources */, + 4C33A1391B5207DB00873DFF /* rainbow.jpg in Resources */, + 31181E642794FF9600E88600 /* test.alamofire.org.cer in Resources */, + 4CFB02F81D7D2FA20056F249 /* invalid_data.json in Resources */, + 31181E682794FF9600E88600 /* alamofire-root-ca.cer in Resources */, + 31181E542794FF9600E88600 /* signed-by-ca2.cer in Resources */, + 31181E842794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */, + 4CFB02F51D7D2FA20056F249 /* empty_data.json in Resources */, + 31181E702794FF9600E88600 /* multiple-dns-names.cer in Resources */, + 31181E442794FF9600E88600 /* certPEM.crt in Resources */, + 31181E382794FF9600E88600 /* certDER.der in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F829C6B01A7A94F100A2CD59 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31181E4D2794FF9600E88600 /* alamofire-signing-ca2.cer in Resources */, + 31181E612794FF9600E88600 /* wildcard.alamofire.org.cer in Resources */, + 31181E752794FF9600E88600 /* expired.cer in Resources */, + 31181E312794FF9600E88600 /* certPEM.cer in Resources */, + 4CFB03081D7D2FA20056F249 /* empty_string.txt in Resources */, + 31181E412794FF9600E88600 /* certDER.cer in Resources */, + 4C33A13C1B5207DB00873DFF /* unicorn.png in Resources */, + 4CFB02FC1D7D2FA20056F249 /* valid_data.json in Resources */, + 4CFB030B1D7D2FA20056F249 /* utf32_string.txt in Resources */, + 31181E5D2794FF9600E88600 /* missing-dns-name-and-uri.cer in Resources */, + 4CFB030E1D7D2FA20056F249 /* utf8_string.txt in Resources */, + 31181E6D2794FF9600E88600 /* valid-uri.cer in Resources */, + 31181E7D2794FF9600E88600 /* expired.badssl.com-intermediate-ca-1.cer in Resources */, + 31181E812794FF9600E88600 /* expired.badssl.com-intermediate-ca-2.cer in Resources */, + 31181E492794FF9600E88600 /* certDER.crt in Resources */, + 31181E352794FF9600E88600 /* randomGibberish.crt in Resources */, + 31181E512794FF9600E88600 /* alamofire-signing-ca1.cer in Resources */, + 31181E792794FF9600E88600 /* valid-dns-name.cer in Resources */, + 31181E892794FF9600E88600 /* expired.badssl.com-leaf.cer in Resources */, + 31181E3D2794FF9600E88600 /* keyDER.der in Resources */, + 31181E592794FF9600E88600 /* signed-by-ca1.cer in Resources */, + 4C33A13A1B5207DB00873DFF /* rainbow.jpg in Resources */, + 31181E652794FF9600E88600 /* test.alamofire.org.cer in Resources */, + 4CFB02F91D7D2FA20056F249 /* invalid_data.json in Resources */, + 31181E692794FF9600E88600 /* alamofire-root-ca.cer in Resources */, + 31181E552794FF9600E88600 /* signed-by-ca2.cer in Resources */, + 31181E852794FF9600E88600 /* expired.badssl.com-root-ca.cer in Resources */, + 4CFB02F61D7D2FA20056F249 /* empty_data.json in Resources */, + 31181E712794FF9600E88600 /* multiple-dns-names.cer in Resources */, + 31181E452794FF9600E88600 /* certPEM.crt in Resources */, + 31181E392794FF9600E88600 /* certDER.der in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 31293061263E17D600473CEA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31293080263E184000473CEA /* AFError+AlamofireTests.swift in Sources */, + 31293077263E183C00473CEA /* ResponseTests.swift in Sources */, + 31293081263E184000473CEA /* FileManager+AlamofireTests.swift in Sources */, + 3145E0EA2797DA4200949557 /* ConcurrencyTests.swift in Sources */, + 31293076263E183C00473CEA /* DownloadTests.swift in Sources */, + 3129308D263E184500473CEA /* ValidationTests.swift in Sources */, + 31293084263E184500473CEA /* RetryPolicyTests.swift in Sources */, + 3129307F263E183C00473CEA /* ParameterEncodingTests.swift in Sources */, + 3129308C263E184500473CEA /* ResponseSerializationTests.swift in Sources */, + 31293074263E183C00473CEA /* RequestTests.swift in Sources */, + 31293073263E183800473CEA /* NSLoggingEventMonitor.swift in Sources */, + 31293071263E183800473CEA /* LeaksTests.swift in Sources */, + 31293090263E184500473CEA /* TLSEvaluationTests.swift in Sources */, + 31293075263E183C00473CEA /* SessionDelegateTests.swift in Sources */, + 314998ED27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */, + 3129308B263E184500473CEA /* CacheTests.swift in Sources */, + 3129307A263E183C00473CEA /* UploadTests.swift in Sources */, + 31293091263E184500473CEA /* URLProtocolTests.swift in Sources */, + 3129307C263E183C00473CEA /* ParameterEncoderTests.swift in Sources */, + 3129308A263E184500473CEA /* AuthenticationInterceptorTests.swift in Sources */, + 31293086263E184500473CEA /* CombineTests.swift in Sources */, + 3129307E263E183C00473CEA /* RequestModifierTests.swift in Sources */, + 3129307B263E183C00473CEA /* AuthenticationTests.swift in Sources */, + 31293083263E184500473CEA /* NetworkReachabilityManagerTests.swift in Sources */, + 3129308E263E184500473CEA /* CachedResponseHandlerTests.swift in Sources */, + 31293087263E184500473CEA /* RedirectHandlerTests.swift in Sources */, + 31293089263E184500473CEA /* ServerTrustEvaluatorTests.swift in Sources */, + 3129307D263E183C00473CEA /* DataStreamTests.swift in Sources */, + 31293085263E184500473CEA /* HTTPHeadersTests.swift in Sources */, + 31293079263E183C00473CEA /* InternalRequestTests.swift in Sources */, + 3129308F263E184500473CEA /* MultipartFormDataTests.swift in Sources */, + 31293078263E183C00473CEA /* SessionTests.swift in Sources */, + 31181E152794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */, + 31293088263E184500473CEA /* RequestInterceptorTests.swift in Sources */, + 31293082263E184500473CEA /* ProtectedTests.swift in Sources */, + 31293070263E183500473CEA /* BaseTestCase.swift in Sources */, + 31293072263E183800473CEA /* TestHelpers.swift in Sources */, + 31293092263E184900473CEA /* Result+AlamofireTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338C02A43A4FA00D4EA0A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 317338CB2A43A51100D4EA0A /* Alamofire.swift in Sources */, + 317338CC2A43A51100D4EA0A /* AFError.swift in Sources */, + 317338CD2A43A51100D4EA0A /* HTTPHeaders.swift in Sources */, + 317338CE2A43A51100D4EA0A /* HTTPMethod.swift in Sources */, + 317338CF2A43A51100D4EA0A /* Notifications.swift in Sources */, + 317338D02A43A51100D4EA0A /* ParameterEncoder.swift in Sources */, + 317338D12A43A51100D4EA0A /* ParameterEncoding.swift in Sources */, + 317338D22A43A51100D4EA0A /* Protected.swift in Sources */, + 317338D32A43A51100D4EA0A /* Request.swift in Sources */, + 317338D42A43A51100D4EA0A /* RequestTaskMap.swift in Sources */, + 317338D52A43A51100D4EA0A /* Response.swift in Sources */, + 317338D62A43A51100D4EA0A /* Session.swift in Sources */, + 317338D72A43A51100D4EA0A /* SessionDelegate.swift in Sources */, + 317338D82A43A51100D4EA0A /* URLConvertible+URLRequestConvertible.swift in Sources */, + 317338D92A43A51100D4EA0A /* DispatchQueue+Alamofire.swift in Sources */, + 317338DA2A43A51100D4EA0A /* OperationQueue+Alamofire.swift in Sources */, + 317338DB2A43A51100D4EA0A /* Result+Alamofire.swift in Sources */, + 317338DC2A43A51100D4EA0A /* StringEncoding+Alamofire.swift in Sources */, + 317338DD2A43A51100D4EA0A /* URLRequest+Alamofire.swift in Sources */, + 317338DE2A43A51100D4EA0A /* URLSessionConfiguration+Alamofire.swift in Sources */, + 317338DF2A43A51100D4EA0A /* AlamofireExtended.swift in Sources */, + 317338E02A43A51100D4EA0A /* AuthenticationInterceptor.swift in Sources */, + 317338E12A43A51100D4EA0A /* CachedResponseHandler.swift in Sources */, + 317338E22A43A51100D4EA0A /* Combine.swift in Sources */, + 317338E32A43A51100D4EA0A /* Concurrency.swift in Sources */, + 317338E42A43A51100D4EA0A /* EventMonitor.swift in Sources */, + 317338E52A43A51100D4EA0A /* MultipartFormData.swift in Sources */, + 317338E62A43A51100D4EA0A /* MultipartUpload.swift in Sources */, + 317338E72A43A51100D4EA0A /* NetworkReachabilityManager.swift in Sources */, + 317338E82A43A51100D4EA0A /* RedirectHandler.swift in Sources */, + 317338E92A43A51100D4EA0A /* RequestCompression.swift in Sources */, + 317338EA2A43A51100D4EA0A /* RequestInterceptor.swift in Sources */, + 317338EB2A43A51100D4EA0A /* ResponseSerialization.swift in Sources */, + 317338EC2A43A51100D4EA0A /* RetryPolicy.swift in Sources */, + 317338ED2A43A51100D4EA0A /* ServerTrustEvaluation.swift in Sources */, + 317338EE2A43A51100D4EA0A /* URLEncodedFormEncoder.swift in Sources */, + 317338EF2A43A51100D4EA0A /* Validation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 317338F02A43BE5F00D4EA0A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 317338FE2A43BE9000D4EA0A /* BaseTestCase.swift in Sources */, + 317338FF2A43BE9000D4EA0A /* LeaksTests.swift in Sources */, + 317339002A43BE9000D4EA0A /* NSLoggingEventMonitor.swift in Sources */, + 317339012A43BE9000D4EA0A /* TestHelpers.swift in Sources */, + 317339022A43BE9000D4EA0A /* AuthenticationTests.swift in Sources */, + 317339032A43BE9000D4EA0A /* DataStreamTests.swift in Sources */, + 317339042A43BE9000D4EA0A /* DownloadTests.swift in Sources */, + 317339052A43BE9000D4EA0A /* InternalRequestTests.swift in Sources */, + 317339062A43BE9000D4EA0A /* ParameterEncoderTests.swift in Sources */, + 317339072A43BE9000D4EA0A /* ParameterEncodingTests.swift in Sources */, + 317339082A43BE9000D4EA0A /* RequestModifierTests.swift in Sources */, + 317339092A43BE9000D4EA0A /* RequestTests.swift in Sources */, + 3173390A2A43BE9000D4EA0A /* ResponseTests.swift in Sources */, + 3173390B2A43BE9000D4EA0A /* SessionDelegateTests.swift in Sources */, + 3173390C2A43BE9000D4EA0A /* SessionTests.swift in Sources */, + 3173390D2A43BE9000D4EA0A /* UploadTests.swift in Sources */, + 3173390E2A43BE9000D4EA0A /* AFError+AlamofireTests.swift in Sources */, + 3173390F2A43BE9000D4EA0A /* Bundle+AlamofireTests.swift in Sources */, + 317339102A43BE9000D4EA0A /* FileManager+AlamofireTests.swift in Sources */, + 317339112A43BE9000D4EA0A /* Request+AlamofireTests.swift in Sources */, + 317339122A43BE9000D4EA0A /* Result+AlamofireTests.swift in Sources */, + 317339132A43BE9000D4EA0A /* AuthenticationInterceptorTests.swift in Sources */, + 317339142A43BE9000D4EA0A /* CachedResponseHandlerTests.swift in Sources */, + 317339152A43BE9000D4EA0A /* CacheTests.swift in Sources */, + 317339162A43BE9000D4EA0A /* CombineTests.swift in Sources */, + 317339172A43BE9000D4EA0A /* ConcurrencyTests.swift in Sources */, + 317339182A43BE9000D4EA0A /* HTTPHeadersTests.swift in Sources */, + 317339192A43BE9000D4EA0A /* MultipartFormDataTests.swift in Sources */, + 3173391A2A43BE9000D4EA0A /* NetworkReachabilityManagerTests.swift in Sources */, + 3173391B2A43BE9000D4EA0A /* ProtectedTests.swift in Sources */, + 3173391C2A43BE9000D4EA0A /* RedirectHandlerTests.swift in Sources */, + 3173391D2A43BE9000D4EA0A /* RequestInterceptorTests.swift in Sources */, + 3173391E2A43BE9000D4EA0A /* ResponseSerializationTests.swift in Sources */, + 3173391F2A43BE9000D4EA0A /* RetryPolicyTests.swift in Sources */, + 317339202A43BE9000D4EA0A /* ServerTrustEvaluatorTests.swift in Sources */, + 317339212A43BE9000D4EA0A /* TLSEvaluationTests.swift in Sources */, + 317339222A43BE9000D4EA0A /* URLProtocolTests.swift in Sources */, + 317339232A43BE9000D4EA0A /* ValidationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626EA1BA7CB3E0011A099 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CF627081BA7CBF60011A099 /* AFError.swift in Sources */, + 3191B5771F5F53A6003960A8 /* Protected.swift in Sources */, + 3199179A209CDA7F00103A19 /* Response.swift in Sources */, + 31D83FD020D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */, + 31B3DE3D25C11CEA00760641 /* Concurrency.swift in Sources */, + 319917A7209CDAC400103A19 /* RequestTaskMap.swift in Sources */, + 4CF627131BA7CBF60011A099 /* Validation.swift in Sources */, + 31F5085F20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */, + 4196936422FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */, + 3172741F218BB1790039FFCC /* ParameterEncoder.swift in Sources */, + 4C67D1382454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */, + 319917BB209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */, + 319917AC209CDCB000103A19 /* HTTPHeaders.swift in Sources */, + 3172741A218BAEC90039FFCC /* HTTPMethod.swift in Sources */, + 4C0CB648220CA8A400604EDC /* RedirectHandler.swift in Sources */, + 4CF6270E1BA7CBF60011A099 /* MultipartFormData.swift in Sources */, + 4CB9282B1C66BFBC00CE5F08 /* Notifications.swift in Sources */, + 31FB2F8922C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */, + 4C0CB643220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */, + 4CF6270F1BA7CBF60011A099 /* ResponseSerialization.swift in Sources */, + 4C256A0821EEB69000AD5D87 /* RequestInterceptor.swift in Sources */, + 3165407529AEBC0400C9BE08 /* RequestCompression.swift in Sources */, + 4C43669D1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */, + 315A4C58241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */, + 4C3D00561C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */, + 311B199220B0E3480036823B /* MultipartUpload.swift in Sources */, + 4C4466ED21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */, + 319917A2209CDA7F00103A19 /* SessionDelegate.swift in Sources */, + 4CF6270A1BA7CBF60011A099 /* ParameterEncoding.swift in Sources */, + 4C256A1C21F1449C00AD5D87 /* RetryPolicy.swift in Sources */, + 31991796209CDA7F00103A19 /* Request.swift in Sources */, + 4CF627101BA7CBF60011A099 /* ServerTrustEvaluation.swift in Sources */, + 318DD4112439780500963291 /* Combine.swift in Sources */, + 3199179E209CDA7F00103A19 /* Session.swift in Sources */, + 4CF627071BA7CBF60011A099 /* Alamofire.swift in Sources */, + 3111CE8A20A77945008315E2 /* EventMonitor.swift in Sources */, + 31DADDFD224811ED0051390F /* AlamofireExtended.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CF626F41BA7CB3E0011A099 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B51E8E2434FECB005356DB /* RequestModifierTests.swift in Sources */, + 4CF627181BA7CC240011A099 /* RequestTests.swift in Sources */, + 3111CE9720A7EC3A008315E2 /* ServerTrustEvaluatorTests.swift in Sources */, + 3111CE9420A7EC32008315E2 /* ResponseSerializationTests.swift in Sources */, + 3111CE8E20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */, + 311B199620B0ED990036823B /* UploadTests.swift in Sources */, + 4C0CB633220BC70300604EDC /* RequestInterceptorTests.swift in Sources */, + 3107EA3720A11AE200445260 /* AuthenticationTests.swift in Sources */, + 31ED52EA1D73891C00199085 /* AFError+AlamofireTests.swift in Sources */, + 4C0CB64D220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */, + 3107EA3A20A11F9700445260 /* ResponseTests.swift in Sources */, + 4CFB02921D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */, + 4CF627141BA7CC240011A099 /* BaseTestCase.swift in Sources */, + 4C7DD7ED224C627300249836 /* Result+AlamofireTests.swift in Sources */, + 314998EC27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */, + 3106FB6323F8C53A007FAB43 /* ProtectedTests.swift in Sources */, + 4CB0080F2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */, + 31727424218BB9A50039FFCC /* TestHelpers.swift in Sources */, + 311A89C123185BC0003BB714 /* CachedResponseHandlerTests.swift in Sources */, + 31EBD9C320D1D89D00D1FF34 /* ValidationTests.swift in Sources */, + 3111CE8620A76370008315E2 /* SessionTests.swift in Sources */, + 31C2B0F220B271380089BA7C /* TLSEvaluationTests.swift in Sources */, + 3106FB6723F8D9E0007FAB43 /* DataStreamTests.swift in Sources */, + 3111CE9D20A7EC58008315E2 /* URLProtocolTests.swift in Sources */, + 4CBD2182220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */, + 317A6A7820B2208000A9FEC5 /* DownloadTests.swift in Sources */, + 31F9683E20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */, + 3113D46D21878227001CCD21 /* HTTPHeadersTests.swift in Sources */, + 31181E142794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */, + 31501E8A2196962A005829F2 /* ParameterEncoderTests.swift in Sources */, + 3107EA4120A1267D00445260 /* SessionDelegateTests.swift in Sources */, + 31C2B0EC20B271060089BA7C /* CacheTests.swift in Sources */, + 3111CE9120A7EC27008315E2 /* NetworkReachabilityManagerTests.swift in Sources */, + 31BADE502439A8D1007D2AB9 /* CombineTests.swift in Sources */, + 31B3DE5125C120D800760641 /* ConcurrencyTests.swift in Sources */, + 31762DCC247738FA0025C704 /* LeaksTests.swift in Sources */, + 31425AC3241F098000EE3CCC /* InternalRequestTests.swift in Sources */, + 4CF627171BA7CC240011A099 /* ParameterEncodingTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4DD67C061A5C55C900ED2280 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CE272501AF88FB500F1D59A /* ParameterEncoding.swift in Sources */, + 3191B5761F5F53A6003960A8 /* Protected.swift in Sources */, + 4CDE2C471AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */, + 31991799209CDA7F00103A19 /* Response.swift in Sources */, + 31B3DE3C25C11CEA00760641 /* Concurrency.swift in Sources */, + 31D83FCF20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */, + 319917A6209CDAC400103A19 /* RequestTaskMap.swift in Sources */, + 4C1DC8551B68908E00476DE3 /* AFError.swift in Sources */, + 31F5085E20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */, + 4196936322FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */, + 4C67D1372454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */, + 3172741E218BB1790039FFCC /* ParameterEncoder.swift in Sources */, + 319917BA209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */, + 319917AB209CDCB000103A19 /* HTTPHeaders.swift in Sources */, + 31727419218BAEC90039FFCC /* HTTPMethod.swift in Sources */, + 4C0CB647220CA8A400604EDC /* RedirectHandler.swift in Sources */, + 4CB9282A1C66BFBC00CE5F08 /* Notifications.swift in Sources */, + 4DD67C251A5C590000ED2280 /* Alamofire.swift in Sources */, + 31FB2F8822C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */, + 4C0CB642220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */, + 4C23EB441B327C5B0090E0BC /* MultipartFormData.swift in Sources */, + 3165407429AEBC0400C9BE08 /* RequestCompression.swift in Sources */, + 4C256A0721EEB69000AD5D87 /* RequestInterceptor.swift in Sources */, + 315A4C57241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */, + 4C43669C1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */, + 4C811F8E1B51856D00E0F59A /* ServerTrustEvaluation.swift in Sources */, + 311B199120B0E3470036823B /* MultipartUpload.swift in Sources */, + 4C4466EC21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */, + 319917A1209CDA7F00103A19 /* SessionDelegate.swift in Sources */, + 4C3D00551C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */, + 4C256A1B21F1449C00AD5D87 /* RetryPolicy.swift in Sources */, + 31991795209CDA7F00103A19 /* Request.swift in Sources */, + 318DD4102439780500963291 /* Combine.swift in Sources */, + 4CDE2C441AF89F0900BABAE5 /* Validation.swift in Sources */, + 3199179D209CDA7F00103A19 /* Session.swift in Sources */, + 3111CE8920A77944008315E2 /* EventMonitor.swift in Sources */, + 31DADDFC224811ED0051390F /* AlamofireExtended.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E4202FCE1B667AA100C997FB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CEE82AD1C6813CF00E9C9F0 /* NetworkReachabilityManager.swift in Sources */, + E4202FD01B667AA100C997FB /* ParameterEncoding.swift in Sources */, + 3191B5781F5F53A6003960A8 /* Protected.swift in Sources */, + 3199179B209CDA7F00103A19 /* Response.swift in Sources */, + 31B3DE3E25C11CEA00760641 /* Concurrency.swift in Sources */, + 31D83FD120D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */, + 319917A8209CDAC400103A19 /* RequestTaskMap.swift in Sources */, + 4CEC605A1B745C9100E684F4 /* AFError.swift in Sources */, + 31F5086020B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */, + 4196936522FA1EAD001EA5D5 /* Result+Alamofire.swift in Sources */, + 4C67D1392454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */, + 31727420218BB1790039FFCC /* ParameterEncoder.swift in Sources */, + 319917BC209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */, + 319917AD209CDCB000103A19 /* HTTPHeaders.swift in Sources */, + 3172741B218BAEC90039FFCC /* HTTPMethod.swift in Sources */, + 4C0CB649220CA8A400604EDC /* RedirectHandler.swift in Sources */, + E4202FD21B667AA100C997FB /* ResponseSerialization.swift in Sources */, + 4CB9282C1C66BFBC00CE5F08 /* Notifications.swift in Sources */, + 31FB2F8A22C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */, + 4C0CB644220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */, + 4C256A0921EEB69000AD5D87 /* RequestInterceptor.swift in Sources */, + 3165407629AEBC0400C9BE08 /* RequestCompression.swift in Sources */, + 4C43669E1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */, + 315A4C59241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */, + E4202FD41B667AA100C997FB /* Alamofire.swift in Sources */, + 311B199320B0E3480036823B /* MultipartUpload.swift in Sources */, + 4C4466EE21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */, + 319917A3209CDA7F00103A19 /* SessionDelegate.swift in Sources */, + E4202FD51B667AA100C997FB /* MultipartFormData.swift in Sources */, + 4C256A1D21F1449C00AD5D87 /* RetryPolicy.swift in Sources */, + 31991797209CDA7F00103A19 /* Request.swift in Sources */, + E4202FD61B667AA100C997FB /* ServerTrustEvaluation.swift in Sources */, + 318DD4122439780500963291 /* Combine.swift in Sources */, + 3199179F209CDA7F00103A19 /* Session.swift in Sources */, + E4202FD81B667AA100C997FB /* Validation.swift in Sources */, + 3111CE8B20A77945008315E2 /* EventMonitor.swift in Sources */, + 31DADDFE224811ED0051390F /* AlamofireExtended.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E2E19A95C8B0040E7D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4CE2724F1AF88FB500F1D59A /* ParameterEncoding.swift in Sources */, + 3191B5751F5F53A6003960A8 /* Protected.swift in Sources */, + 4CDE2C461AF89FF300BABAE5 /* ResponseSerialization.swift in Sources */, + 31991798209CDA7F00103A19 /* Response.swift in Sources */, + 31B3DE3B25C11CEA00760641 /* Concurrency.swift in Sources */, + 31D83FCE20D5C29300D93E47 /* URLConvertible+URLRequestConvertible.swift in Sources */, + 319917A5209CDAC400103A19 /* RequestTaskMap.swift in Sources */, + 4C1DC8541B68908E00476DE3 /* AFError.swift in Sources */, + 31F5085D20B50DC400FE2A0C /* URLSessionConfiguration+Alamofire.swift in Sources */, + 4196936222FA1E05001EA5D5 /* Result+Alamofire.swift in Sources */, + 4C67D1362454B12A00CBA725 /* AuthenticationInterceptor.swift in Sources */, + 3172741D218BB1790039FFCC /* ParameterEncoder.swift in Sources */, + 319917B9209CE53A00103A19 /* OperationQueue+Alamofire.swift in Sources */, + 319917AA209CDCB000103A19 /* HTTPHeaders.swift in Sources */, + 31727418218BAEC90039FFCC /* HTTPMethod.swift in Sources */, + 4C0CB646220CA8A400604EDC /* RedirectHandler.swift in Sources */, + F897FF4119AA800700AB5182 /* Alamofire.swift in Sources */, + 4C23EB431B327C5B0090E0BC /* MultipartFormData.swift in Sources */, + 31FB2F8722C828D8007FD6D5 /* URLEncodedFormEncoder.swift in Sources */, + 4C0CB641220CA89400604EDC /* URLRequest+Alamofire.swift in Sources */, + 4C811F8D1B51856D00E0F59A /* ServerTrustEvaluation.swift in Sources */, + 3165407329AEBC0400C9BE08 /* RequestCompression.swift in Sources */, + 4C256A0621EEB69000AD5D87 /* RequestInterceptor.swift in Sources */, + 315A4C56241EF28B00D57C7A /* StringEncoding+Alamofire.swift in Sources */, + 4C43669B1D7BB93D00C38AAD /* DispatchQueue+Alamofire.swift in Sources */, + 4C3D00541C66A63000D1F709 /* NetworkReachabilityManager.swift in Sources */, + 311B199020B0D3B40036823B /* MultipartUpload.swift in Sources */, + 4C4466EB21F8F5D800AC9703 /* CachedResponseHandler.swift in Sources */, + 319917A0209CDA7F00103A19 /* SessionDelegate.swift in Sources */, + 4CDE2C431AF89F0900BABAE5 /* Validation.swift in Sources */, + 4C256A1A21F1449C00AD5D87 /* RetryPolicy.swift in Sources */, + 31991794209CDA7F00103A19 /* Request.swift in Sources */, + 318DD40F2439780500963291 /* Combine.swift in Sources */, + 4CB928291C66BFBC00CE5F08 /* Notifications.swift in Sources */, + 3199179C209CDA7F00103A19 /* Session.swift in Sources */, + 3111CE8820A77843008315E2 /* EventMonitor.swift in Sources */, + 31DADDFB224811ED0051390F /* AlamofireExtended.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F8111E3A19A95C8B0040E7D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B51E8C2434FECB005356DB /* RequestModifierTests.swift in Sources */, + 31ED52E81D73891B00199085 /* AFError+AlamofireTests.swift in Sources */, + 3111CE9520A7EC39008315E2 /* ServerTrustEvaluatorTests.swift in Sources */, + 3111CE9220A7EC30008315E2 /* ResponseSerializationTests.swift in Sources */, + 3111CE8C20A7EBE6008315E2 /* MultipartFormDataTests.swift in Sources */, + 311B199420B0ED980036823B /* UploadTests.swift in Sources */, + 4C0CB631220BC70300604EDC /* RequestInterceptorTests.swift in Sources */, + 3107EA3520A11AE100445260 /* AuthenticationTests.swift in Sources */, + 4CFB02901D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */, + 4C0CB64B220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */, + 3107EA3820A11F9600445260 /* ResponseTests.swift in Sources */, + F8858DDD19A96B4300F55F93 /* RequestTests.swift in Sources */, + 4C256A531B096C770065714F /* BaseTestCase.swift in Sources */, + 4C7DD7EB224C627300249836 /* Result+AlamofireTests.swift in Sources */, + 314998EA27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */, + 3106FB6123F8C53A007FAB43 /* ProtectedTests.swift in Sources */, + 4CB0080D2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */, + 31727422218BB9A50039FFCC /* TestHelpers.swift in Sources */, + 311A89BF23185BBF003BB714 /* CachedResponseHandlerTests.swift in Sources */, + 31EBD9C120D1D89C00D1FF34 /* ValidationTests.swift in Sources */, + 3111CE8420A7636E008315E2 /* SessionTests.swift in Sources */, + 31C2B0F020B271370089BA7C /* TLSEvaluationTests.swift in Sources */, + 3106FB6523F8D9E0007FAB43 /* DataStreamTests.swift in Sources */, + 3111CE9B20A7EC57008315E2 /* URLProtocolTests.swift in Sources */, + 4CBD2180220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */, + 317A6A7620B2207F00A9FEC5 /* DownloadTests.swift in Sources */, + 31F9683C20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */, + 3113D46B21878227001CCD21 /* HTTPHeadersTests.swift in Sources */, + 31181E122794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */, + 31501E882196962A005829F2 /* ParameterEncoderTests.swift in Sources */, + 3107EA3F20A1267C00445260 /* SessionDelegateTests.swift in Sources */, + 31C2B0EA20B271040089BA7C /* CacheTests.swift in Sources */, + 3111CE8F20A7EC26008315E2 /* NetworkReachabilityManagerTests.swift in Sources */, + 31BADE4E2439A8D1007D2AB9 /* CombineTests.swift in Sources */, + 31B3DE4F25C120D800760641 /* ConcurrencyTests.swift in Sources */, + 31762DCA247738FA0025C704 /* LeaksTests.swift in Sources */, + 31425AC1241F098000EE3CCC /* InternalRequestTests.swift in Sources */, + F8111E6119A9674D0040E7D1 /* ParameterEncodingTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F829C6AE1A7A94F100A2CD59 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 31B51E8D2434FECB005356DB /* RequestModifierTests.swift in Sources */, + 31ED52E91D73891C00199085 /* AFError+AlamofireTests.swift in Sources */, + 3111CE9620A7EC3A008315E2 /* ServerTrustEvaluatorTests.swift in Sources */, + 3111CE9320A7EC31008315E2 /* ResponseSerializationTests.swift in Sources */, + 3111CE8D20A7EBE7008315E2 /* MultipartFormDataTests.swift in Sources */, + 311B199520B0ED980036823B /* UploadTests.swift in Sources */, + 4C0CB632220BC70300604EDC /* RequestInterceptorTests.swift in Sources */, + 3107EA3620A11AE100445260 /* AuthenticationTests.swift in Sources */, + 4CFB02911D7CF28F0056F249 /* FileManager+AlamofireTests.swift in Sources */, + 4C0CB64C220CA8D600604EDC /* RedirectHandlerTests.swift in Sources */, + 3107EA3920A11F9600445260 /* ResponseTests.swift in Sources */, + F829C6BE1A7A950600A2CD59 /* ParameterEncodingTests.swift in Sources */, + F829C6BF1A7A950600A2CD59 /* RequestTests.swift in Sources */, + 4C7DD7EC224C627300249836 /* Result+AlamofireTests.swift in Sources */, + 314998EB27A6560600ABB856 /* Request+AlamofireTests.swift in Sources */, + 3106FB6223F8C53A007FAB43 /* ProtectedTests.swift in Sources */, + 4CB0080E2455FE9700C38783 /* AuthenticationInterceptorTests.swift in Sources */, + 31727423218BB9A50039FFCC /* TestHelpers.swift in Sources */, + 311A89C023185BBF003BB714 /* CachedResponseHandlerTests.swift in Sources */, + 31EBD9C220D1D89C00D1FF34 /* ValidationTests.swift in Sources */, + 3111CE8520A7636F008315E2 /* SessionTests.swift in Sources */, + 31C2B0F120B271370089BA7C /* TLSEvaluationTests.swift in Sources */, + 3106FB6623F8D9E0007FAB43 /* DataStreamTests.swift in Sources */, + 3111CE9C20A7EC58008315E2 /* URLProtocolTests.swift in Sources */, + 4CBD2181220B48AE008F1C59 /* RetryPolicyTests.swift in Sources */, + 317A6A7720B2208000A9FEC5 /* DownloadTests.swift in Sources */, + 31F9683D20BB70290009606F /* NSLoggingEventMonitor.swift in Sources */, + 3113D46C21878227001CCD21 /* HTTPHeadersTests.swift in Sources */, + 31181E132794FE5400E88600 /* Bundle+AlamofireTests.swift in Sources */, + 31501E892196962A005829F2 /* ParameterEncoderTests.swift in Sources */, + 3107EA4020A1267C00445260 /* SessionDelegateTests.swift in Sources */, + 31C2B0EB20B271050089BA7C /* CacheTests.swift in Sources */, + 3111CE9020A7EC27008315E2 /* NetworkReachabilityManagerTests.swift in Sources */, + 31BADE4F2439A8D1007D2AB9 /* CombineTests.swift in Sources */, + 31B3DE5025C120D800760641 /* ConcurrencyTests.swift in Sources */, + 31762DCB247738FA0025C704 /* LeaksTests.swift in Sources */, + 31425AC2241F098000EE3CCC /* InternalRequestTests.swift in Sources */, + 4C256A541B096C770065714F /* BaseTestCase.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3129306C263E17D600473CEA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = E4202FCD1B667AA100C997FB /* Alamofire watchOS */; + targetProxy = 3129306B263E17D600473CEA /* PBXContainerItemProxy */; + }; + 317338FA2A43BE5F00D4EA0A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 317338C32A43A4FA00D4EA0A /* Alamofire visionOS */; + targetProxy = 317338F92A43BE5F00D4EA0A /* PBXContainerItemProxy */; + }; + 4CF626FB1BA7CB3E0011A099 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4CF626EE1BA7CB3E0011A099 /* Alamofire tvOS */; + targetProxy = 4CF626FA1BA7CB3E0011A099 /* PBXContainerItemProxy */; + }; + F8111E6619A967880040E7D1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = F8111E3219A95C8B0040E7D1 /* Alamofire iOS */; + targetProxy = F8111E6519A967880040E7D1 /* PBXContainerItemProxy */; + }; + F829C6BA1A7A94F100A2CD59 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4DD67C0A1A5C55C900ED2280 /* Alamofire macOS */; + targetProxy = F829C6B91A7A94F100A2CD59 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 3129306D263E17D600473CEA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-watchOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 7.4; + }; + name = Debug; + }; + 3129306E263E17D600473CEA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = ""; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-watchOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 7.4; + }; + name = Release; + }; + 317338C82A43A4FB00D4EA0A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = xros; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Debug; + }; + 317338C92A43A4FB00D4EA0A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = xros; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Release; + }; + 317338FC2A43BE5F00D4EA0A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-visionOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + }; + name = Debug; + }; + 317338FD2A43BE5F00D4EA0A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = Tests/Info.plist; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-visionOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = xros; + SUPPORTED_PLATFORMS = "xros xrsimulator"; + }; + name = Release; + }; + 4CF627001BA7CB3E0011A099 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = appletvos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 4CF627011BA7CB3E0011A099 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = appletvos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 4CF627021BA7CB3E0011A099 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + }; + name = Debug; + }; + 4CF627031BA7CB3E0011A099 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.Alamofire-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + }; + name = Release; + }; + 4DD67C1F1A5C55C900ED2280 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEAD_CODE_STRIPPING = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 4DD67C201A5C55C900ED2280 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEAD_CODE_STRIPPING = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + E4202FDE1B667AA100C997FB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.alamofire.Alamofire.watchOS; + SDKROOT = watchos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + E4202FDF1B667AA100C997FB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.alamofire.Alamofire.watchOS; + SDKROOT = watchos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + F8111E4419A95C8B0040E7D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES; + CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Source/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MARKETING_VERSION = 5.8.1; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = ( + "-framework", + CFNetwork, + ); + PRODUCT_BUNDLE_IDENTIFIER = org.alamofire.Alamofire; + PRODUCT_NAME = Alamofire; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Debug; + }; + F8111E4519A95C8B0040E7D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES; + CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = YES; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Source/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MARKETING_VERSION = 5.8.1; + OTHER_LDFLAGS = ( + "-framework", + CFNetwork, + ); + PRODUCT_BUNDLE_IDENTIFIER = org.alamofire.Alamofire; + PRODUCT_NAME = Alamofire; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + XROS_DEPLOYMENT_TARGET = 1.0; + }; + name = Release; + }; + F8111E4719A95C8B0040E7D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + F8111E4819A95C8B0040E7D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + F8111E4A19A95C8B0040E7D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + F8111E4B19A95C8B0040E7D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + }; + name = Release; + }; + F829C6BC1A7A94F100A2CD59 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + DEAD_CODE_STRIPPING = YES; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + F829C6BD1A7A94F100A2CD59 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + DEAD_CODE_STRIPPING = YES; + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@loader_path/../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3129306F263E17D600473CEA /* Build configuration list for PBXNativeTarget "Alamofire watchOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3129306D263E17D600473CEA /* Debug */, + 3129306E263E17D600473CEA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 317338CA2A43A4FB00D4EA0A /* Build configuration list for PBXNativeTarget "Alamofire visionOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 317338C82A43A4FB00D4EA0A /* Debug */, + 317338C92A43A4FB00D4EA0A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 317338FB2A43BE5F00D4EA0A /* Build configuration list for PBXNativeTarget "Alamofire visionOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 317338FC2A43BE5F00D4EA0A /* Debug */, + 317338FD2A43BE5F00D4EA0A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CF627041BA7CB3E0011A099 /* Build configuration list for PBXNativeTarget "Alamofire tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CF627001BA7CB3E0011A099 /* Debug */, + 4CF627011BA7CB3E0011A099 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CF627051BA7CB3E0011A099 /* Build configuration list for PBXNativeTarget "Alamofire tvOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CF627021BA7CB3E0011A099 /* Debug */, + 4CF627031BA7CB3E0011A099 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4DD67C1E1A5C55C900ED2280 /* Build configuration list for PBXNativeTarget "Alamofire macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4DD67C1F1A5C55C900ED2280 /* Debug */, + 4DD67C201A5C55C900ED2280 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E4202FDD1B667AA100C997FB /* Build configuration list for PBXNativeTarget "Alamofire watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E4202FDE1B667AA100C997FB /* Debug */, + E4202FDF1B667AA100C997FB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F8111E2D19A95C8B0040E7D1 /* Build configuration list for PBXProject "Alamofire" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8111E4419A95C8B0040E7D1 /* Debug */, + F8111E4519A95C8B0040E7D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F8111E4619A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Alamofire iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8111E4719A95C8B0040E7D1 /* Debug */, + F8111E4819A95C8B0040E7D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F8111E4919A95C8B0040E7D1 /* Build configuration list for PBXNativeTarget "Alamofire iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8111E4A19A95C8B0040E7D1 /* Debug */, + F8111E4B19A95C8B0040E7D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F829C6BB1A7A94F100A2CD59 /* Build configuration list for PBXNativeTarget "Alamofire macOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F829C6BC1A7A94F100A2CD59 /* Debug */, + F829C6BD1A7A94F100A2CD59 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F8111E2A19A95C8B0040E7D1 /* Project object */; +} diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..7d39b0eb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire iOS.xcscheme b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire iOS.xcscheme new file mode 100644 index 00000000..c89f426a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire iOS.xcscheme @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire macOS.xcscheme b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire macOS.xcscheme new file mode 100644 index 00000000..8ff4307a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire macOS.xcscheme @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire tvOS.xcscheme b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire tvOS.xcscheme new file mode 100644 index 00000000..0e0ba75f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire tvOS.xcscheme @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire visionOS.xcscheme b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire visionOS.xcscheme new file mode 100644 index 00000000..9e90c02a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire visionOS.xcscheme @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire watchOS.xcscheme b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire watchOS.xcscheme new file mode 100644 index 00000000..15bc4ac7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcodeproj/xcshareddata/xcschemes/Alamofire watchOS.xcscheme @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..60560fd5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Alamofire.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/Alamofire/CHANGELOG.md b/Carthage/Checkouts/Alamofire/CHANGELOG.md new file mode 100644 index 00000000..c226acd1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/CHANGELOG.md @@ -0,0 +1,3324 @@ +# Change Log + +All notable changes to this project will be documented in this file. +Aside from features marked [🔥 Experimental 🔥], `Alamofire` adheres to [Semantic Versioning](https://semver.org/). +[🔥 Experimental 🔥] features may require breaking changes in minor, rather than major, releases. This will be rare and +compatibility should be preserved in most cases, but cannot be guaranteed. + +#### 5.x Releases + +- `5.8.x` Releases - [5.8.0](#580) | [5.8.1](#581) +- `5.7.x` Releases - [5.7.0](#570) | [5.7.1](#571) +- `5.6.x` Releases - [5.6.0](#560) | [5.6.1](#561) | [5.6.2](#562) | [5.6.3](#563) | [5.6.4](#564) +- `5.5.x` Releases - [5.5.0](#550) +- `5.4.x` Releases - [5.4.0](#540) | [5.4.1](#541) | [5.4.2](#542) | [5.4.3](#543) | [5.4.4](#544) +- `5.3.x` Releases - [5.3.0](#530) +- `5.2.x` Releases - [5.2.0](#520) | [5.2.1](#521) | [5.2.2](#522) +- `5.1.x` Releases - [5.1.0](#510) +- `5.0.x` Releases - [5.0.0](#500) | [5.0.1](#501) | [5.0.2](#502) | [5.0.3](#503) | [5.0.4](#504) | [5.0.5](#505) +- `5.0.0` Release Candidates - [5.0.0-rc.1](#500-rc1) | [5.0.0-rc.2](#500-rc2) | [5.0.0-rc.3](#500-rc3) +- `5.0.0` Betas - [5.0.0-beta.1](#500-beta1) | [5.0.0-beta.2](#500-beta2) | [5.0.0-beta.3](#500-beta3) | [5.0.0-beta.4](#500-beta4) | [5.0.0-beta.5](#500-beta5) | [5.0.0-beta.6](#500-beta6) | [5.0.0-beta.7](#500-beta7) + +#### 4.x Releases + +- `4.9.x` Releases - [4.9.0](#490) | [4.9.1](#491) +- `4.8.x` Releases - [4.8.0](#480) | [4.8.1](#481) | [4.8.2](#482) +- `4.7.x` Releases - [4.7.0](#470) | [4.7.1](#471) | [4.7.2](#472) | [4.7.3](#473) +- `4.6.x` Releases - [4.6.0](#460) +- `4.5.x` Releases - [4.5.0](#450) | [4.5.1](#451) +- `4.4.x` Releases - [4.4.0](#440) +- `4.3.x` Releases - [4.3.0](#430) +- `4.2.x` Releases - [4.2.0](#420) +- `4.1.x` Releases - [4.1.0](#410) +- `4.0.x` Releases - [4.0.0](#400) | [4.0.1](#401) +- `4.0.0` Betas - [4.0.0-beta.1](#400-beta1) | [4.0.0-beta.2](#400-beta2) + +#### 3.x Releases + +- `3.5.x` Releases - [3.5.0](#350) | [3.5.1](#351) +- `3.4.x` Releases - [3.4.0](#340) | [3.4.1](#341) | [3.4.2](#342) +- `3.3.x` Releases - [3.3.0](#330) | [3.3.1](#331) +- `3.2.x` Releases - [3.2.0](#320) | [3.2.1](#321) +- `3.1.x` Releases - [3.1.0](#310) | [3.1.1](#311) | [3.1.2](#312) | [3.1.3](#313) | [3.1.4](#314) | [3.1.5](#315) +- `3.0.x` Releases - [3.0.0](#300) | [3.0.1](#301) +- `3.0.0` Betas - [3.0.0-beta.1](#300-beta1) | [3.0.0-beta.2](#300-beta2) | [3.0.0-beta.3](#300-beta3) + +#### 2.x Releases + +- `2.0.x` Releases - [2.0.0](#200) | [2.0.1](#201) | [2.0.2](#202) +- `2.0.0` Betas - [2.0.0-beta.1](#200-beta1) | [2.0.0-beta.2](#200-beta2) | [2.0.0-beta.3](#200-beta3) | [2.0.0-beta.4](#200-beta4) + +#### 1.x Releases + +- `1.3.x` Releases - [1.3.0](#130) | [1.3.1](#131) +- `1.2.x` Releases - [1.2.0](#120) | [1.2.1](#121) | [1.2.2](#122) | [1.2.3](#123) +- `1.1.x` Releases - [1.1.0](#110) | [1.1.1](#111) | [1.1.2](#112) | [1.1.3](#113) | [1.1.4](#114) | [1.1.5](#115) +- `1.0.x` Releases - [1.0.0](#100) | [1.0.1](#101) + +--- + +## [5.8.1](https://github.com/Alamofire/Alamofire/releases/tag/5.8.1) + +Released on 2023-10-26. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/88?closed=1). + +### Updated + +- Internal: `Protected` to no longer be a `@propertyWrapper`. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3777](https://github.com/Alamofire/Alamofire/pull/3777). + +### Fixed + +- `URLEncodedFormEncoder` encoding of `Encodable` values with optional properties using `encodeIfPresent`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3779](https://github.com/Alamofire/Alamofire/pull/3779). +- Missing "Skip Install" setting for visionOS target. + - Fixed by [Sai](https://github.com/Sai) in Pull Request [#3788](https://github.com/Alamofire/Alamofire/pull/3788). + +## [5.8.0](https://github.com/Alamofire/Alamofire/releases/tag/5.8.0) + +Released on 2023-08-31. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/87?closed=1). + +#### Added + +- visionOS support. + - Added by [Jon Shier](https://github.com/jshier) in Pull Requests [#3738](https://github.com/Alamofire/Alamofire/pull/3738) and [#3750](https://github.com/Alamofire/Alamofire/pull/3750). +- Hooks for initial `HTTPURLResponse` values. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3762](https://github.com/Alamofire/Alamofire/pull/3738). +- Android build support. + - Added by [Hugo Gonzalez](https://github.com/hggz) in Pull Request [#3744](https://github.com/Alamofire/Alamofire/pull/3744). + +#### Updated + +- Async integration to obey automatic cancellation by default. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3757](https://github.com/Alamofire/Alamofire/pull/3757). +- Platform `#if` checks. + - Updated by [brenno](https://github.com/brennobemoura) in Pull Request [#3756](https://github.com/Alamofire/Alamofire/pull/3756). +- Windows CI. + - Updated by [Saleem Abdulrasool](https://github.com/compnerd) in Pull Request [#3763](https://github.com/Alamofire/Alamofire/pull/3763). +- `URL` conversion tests for 2023 `URL` changes. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3734](https://github.com/Alamofire/Alamofire/pull/3734). +- for-loop to `contains`. + - Updated by [Mayank Kumar Gupta](https://github.com/Mayank-84) in Pull Request [#3726](https://github.com/Alamofire/Alamofire/pull/3726). + +#### Fixed + +- `MultipartFormData` stream to properly obey `bodyContentLength`. + - Fixed by [Henrique Valcanaia](https://github.com/hvsw) in Pull Request [#3730](https://github.com/Alamofire/Alamofire/pull/3730). +- Unnecessary call to empty init. + - Fixed by [Shinolr](https://github.com/Shinolr) in Pull Request [#3742](https://github.com/Alamofire/Alamofire/pull/3742). +- Documentation typos. + - Fixed by [Jenna](https://github.com/ueunli) in Pull Request [#3733](https://github.com/Alamofire/Alamofire/pull/3733). + +--- + +## [5.7.1](https://github.com/Alamofire/Alamofire/releases/tag/5.7.1) + +Released on 2023-05-10. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/86?closed=1). + +#### Updated + +- Deployment targets reverted to (macOS 10.12, iOS 10, tvOS 10, and watchOS 3)+ + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3720](https://github.com/Alamofire/Alamofire/pull/3720). + +## [5.7.0](https://github.com/Alamofire/Alamofire/releases/tag/5.7.0) + +Released on 2023-05-09. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/84?closed=1). + +#### Added + +- Request body compression support. This is disabled by default. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3701](https://github.com/Alamofire/Alamofire/pull/3701). +- `ArrayEncoding.custom` to `URLEncodedFormEncoder` and `URLEncoding`. + - Added by [Mike Naquin](https://github.com/naquin) in Pull Request [#3699](https://github.com/Alamofire/Alamofire/pull/3699). +- `KeyPathEncoding` to `URLEncodedFormEncoder`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3689](https://github.com/Alamofire/Alamofire/pull/3689). +- `NilEncoding` to `URLEncodedFormEncoder`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3686](https://github.com/Alamofire/Alamofire/pull/3686). + +#### Updated + +- Alamofire now requires Swift 5.5+ and (macOS 10.13, iOS 11, tvOS 11, and watchOS 4)+. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3670](https://github.com/Alamofire/Alamofire/pull/3670) and [#3717](https://github.com/Alamofire/Alamofire/pull/3717). +- `flatMap` to `map` in `HTTPHeaders`. + - Updated by [kati](https://github.com/kati-kms) in Pull Request [#3704](https://github.com/Alamofire/Alamofire/pull/3704). +- Various CI integrations. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3685](https://github.com/Alamofire/Alamofire/pull/3685) and [#3712](https://github.com/Alamofire/Alamofire/pull/3712). + +#### Fixed + +- Reachability API usage safety. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3684](https://github.com/Alamofire/Alamofire/pull/3684). +- Unused `bufferingPolicy` in `StreamOf`. + - Fixed by [Duc](https://github.com/trungducc) in Pull Request [#3668](https://github.com/Alamofire/Alamofire/pull/3668). +- Various documentation typos. + - Fixed by [Timo Wälisch](https://github.com/TimoWaelischIdealo), [Tony](https://github.com/iamtony), and [uhooi](https://github.com/uhooi) in various PRs. + +--- + +## [5.6.4](https://github.com/Alamofire/Alamofire/releases/tag/5.6.4) + +Released on 2022-11-21. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/85?closed=1). + +#### Fixed + +- Deprecated OS version support in Swift 5.7 SPM Package. + - Fixed by [Guglielmo Faglioni](https://github.com/guidev) in Pull Request [#3665](https://github.com/Alamofire/Alamofire/pull/3665). + +## [5.6.3](https://github.com/Alamofire/Alamofire/releases/tag/5.6.3) + +Released on 2022-11-20. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/83?closed=1). + +#### Updated + +- Swift package to 5.7, CI to Xcode 14.1. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3653](https://github.com/Alamofire/Alamofire/pull/3653). + +#### Fixed + +- Calls to deprecated cancellation handler function. + - Fixed by [Sven Münnich](https://github.com/svenmuennich) in Pull Request [#3657](https://github.com/Alamofire/Alamofire/pull/3657). +- Unnecessary protocol conformance on Combine publishers. + - Fixed by [MoonkiKim(김문기)](https://github.com/tedKim5178) in Pull Request [#3650](https://github.com/Alamofire/Alamofire/pull/3650). +- Don't attempt retry when `Request` has already been cancelled. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3641](https://github.com/Alamofire/Alamofire/pull/3641). + +## [5.6.2](https://github.com/Alamofire/Alamofire/releases/tag/5.6.2) + +Released on 2022-07-17. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/82?closed=1). + +#### Added + +- Error when object provided to `JSONEcoding` contains values that can't be passed through `JSONSerialization`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3624](https://github.com/Alamofire/Alamofire/pull/3624). + +#### Updated + +- CI support for all supported Xcode, macOS, and Linux versions. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3607](https://github.com/Alamofire/Alamofire/pull/3607) and [#3622](https://github.com/Alamofire/Alamofire/pull/3622). +- Support for various Xcode version. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3616](https://github.com/Alamofire/Alamofire/pull/3616) and [#3632](https://github.com/Alamofire/Alamofire/pull/3632). +- `Cache-Control` header tests to not require hard-coded delays. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3601](https://github.com/Alamofire/Alamofire/pull/3601). + +#### Fixed + +- Swift version check for `SecTrustCopyCertificateChain`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3606](https://github.com/Alamofire/Alamofire/pull/3606). +- Various documentation issues. + - Fixed by [Jacob Lange](https://github.com/jacoblange-dev), [rain2540](https://github.com/rain2540), [bondxf](https://github.com/bondxf), [Ikko Ashimine](https://github.com/eltociear), and [Elon Park](https://github.com/ElonPark) in various Pull Requests. + +## [5.6.1](https://github.com/Alamofire/Alamofire/releases/tag/5.6.1) + +Released on 2022-04-17. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/81?closed=1). + +#### Fixed + +- Missing `automaticallyCancelling` parameter in `serializingDownloadedFileURL`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3597](https://github.com/Alamofire/Alamofire/pull/3597). + +## [5.6.0](https://github.com/Alamofire/Alamofire/releases/tag/5.6.0) + +Released on 2022-04-13. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/80?closed=1). + +#### Added + +- Support for `HTTPMethod.query` to support the [upcoming standard](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-safe-method-w-body-02). + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3553](https://github.com/Alamofire/Alamofire/pull/3553). +- Compile-time Swift version check to enforce minimum supported Swift version. + - Added by [Dave Verwer](https://github.com/daveverwer) in Pull Request [#3549](https://github.com/Alamofire/Alamofire/pull/3549). +- GitHub Sponsors support. You can now sponsor Alamofire directly through GitHub. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3543](https://github.com/Alamofire/Alamofire/pull/3543). + +#### Updated + +- Swift version required to build [🔥 Experimental 🔥] Swift Concurrency support to 5.6.0 to avoid various Apple bugs with Xcode 13.2.0 and 13.2.1. Support now requires Xcode 13.3.1. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3590](https://github.com/Alamofire/Alamofire/pull/3590). +- `DownloadRequest` to avoid producing resume data when not explicitly requested on cancellation. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3538](https://github.com/Alamofire/Alamofire/pull/3538). +- Testing infrastructure to use XCTestPlans on Apple platforms. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3538](https://github.com/Alamofire/Alamofire/pull/3538). +- GitHub Actions support for greater OS coverage, more SPM platforms, and Swift 5.6. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3534](https://github.com/Alamofire/Alamofire/pull/3534), [#3545](https://github.com/Alamofire/Alamofire/pull/3545), [#3570](https://github.com/Alamofire/Alamofire/pull/3570), and [#3587](https://github.com/Alamofire/Alamofire/pull/3587). + +#### Fixed + +- Various Security framework deprecation warnings when deploying to newer OSes. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3555](https://github.com/Alamofire/Alamofire/pull/3555). +- Various documentation issues. + - Fixed by [Jon Shier](https://github.com/jshier), [Emanuele Fumagalli](https://github.com/emanuelef), [Huang-Libo](https://github.com/Huang-Libo), and [rain2540](https://github.com/rain2540) in Pull Requests [#3548](https://github.com/Alamofire/Alamofire/pull/3548), [#3562](https://github.com/Alamofire/Alamofire/pull/3562), [#3573](https://github.com/Alamofire/Alamofire/pull/3573), [#3574](https://github.com/Alamofire/Alamofire/pull/3574), and [#3585](https://github.com/Alamofire/Alamofire/pull/3585). + +--- + +## [5.5.0](https://github.com/Alamofire/Alamofire/releases/tag/5.5.0) + +Released on 2021-12-13. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/79?closed=1). + +#### Added + +- [🔥 Experimental 🔥] support for Swift Concurrency, including `async`-`await` for requests and `StreamOf` for streaming values. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3463](https://github.com/Alamofire/Alamofire/pull/3463). +- Generic static accessors for various protocols types for Swift 5.5. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3499](https://github.com/Alamofire/Alamofire/pull/3499). +- `.indexInBrackets` options for array encoding in query parameters. + - Added by [Tiago Lopes](https://github.com/TiagoMaiaL) in Pull Request [#3516](https://github.com/Alamofire/Alamofire/pull/3516). +- `RequestAdapterState` and new protocol requirements for `RequestAdapter` to allow for additional state to be available. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#3504](https://github.com/Alamofire/Alamofire/pull/3504). + +#### Updated + +- `Session` to more safely target provided custom `DispatchQueue`s for internal use. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3523](https://github.com/Alamofire/Alamofire/pull/3523). +- `AFError` message regarding unacceptable `Content-Type`s to sort the types. + - Updated by [Timur Yusipov](https://github.com/Usipov) in Pull Request [#3518](https://github.com/Alamofire/Alamofire/pull/3518). +- Base Swift language version requirement to 5.3. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3495](https://github.com/Alamofire/Alamofire/pull/3495). +- Sample app to show proper loading state for requests. + - Updated by [Tiago Lopes](https://github.com/TiagoMaiaL) in Pull Request [#3514](https://github.com/Alamofire/Alamofire/pull/3514). + +#### Deprecated + +- `responseJSON` and associated methods, in preference to `responseDecodable`. + - Deprecated by [Jon Shier](https://github.com/jshier) in Pull Request [#3502](https://github.com/Alamofire/Alamofire/pull/3502). + +#### Fixed + +- Use of `Protected` wrapper when accessing properties of the wrapped values to ensure proper thread-safety. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3505](https://github.com/Alamofire/Alamofire/pull/3505). +- Various documentation typos. + - Fixed by [Christos Koninis](https://github.com/csknns), [Tiago Lopes](https://github.com/TiagoMaiaL), and [Eugene Berdnikov](https://github.com/evnik) in various Pull Requests. + +--- + +## [5.4.4](https://github.com/Alamofire/Alamofire/releases/tag/5.4.4) + +Released on 2021-09-20. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/78?closed=1). + +#### Added + +- Support for Xcode 13, including a workaround for Combine compilation on older architectures. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3486](https://github.com/Alamofire/Alamofire/pull/3486). +- Testing on watchOS. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3449](https://github.com/Alamofire/Alamofire/pull/3449). +- Support for building on Windows and Linux. Alamofire is unsupported on these platforms but should build correctly. + - Added by [Jon Shier](https://github.com/jshier) and [Alex Taffe](https://github.com/alex-taffe) in Pull Requests [#3446](https://github.com/Alamofire/Alamofire/pull/3446) and [#3462](https://github.com/Alamofire/Alamofire/pull/3462). + +#### Updated + +- Usage of `.count >= 0` to `!.isEmpty`. + - Updated by [Shafeer P](https://github.com/shafeerp) in Pull Request [#3478](https://github.com/Alamofire/Alamofire/pull/3478). + +#### Fixed + +- Async navigation title updating in example app. + - Fixed by [Tiago Maia](https://github.com/TiagoMaiaL) in Pull Request [3494](https://github.com/Alamofire/Alamofire/pull/3494). +- Various documentation bugs. + - Fixed by [Jordan de Laune](https://github.com/jdelaune), [Cédric Luthi](https://github.com/0xced), [Romain Bertozzi](https://github.com/r-mckay), and [Tiago Maia](https://github.com/TiagoMaiaL). + +## [5.4.3](https://github.com/Alamofire/Alamofire/releases/tag/5.4.3) + +Released on 2021-04-21. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/77?closed=1). + +#### Fixed + +- Change in multipart upload creation order. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#3438](https://github.com/Alamofire/Alamofire/pull/3438). +- Typo in Alamofire 5 migration guide. + - Fixed by [DevYeom](https://github.com/DevYeom) in Pull Request [#3431](https://github.com/Alamofire/Alamofire/pull/3431). + +## [5.4.2](https://github.com/Alamofire/Alamofire/releases/tag/5.4.2) + +Released on 2021-04-03. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/76?closed=1). + +#### Updated + +- Resume data handling for `DownloadRequest`s to access resume data from errors as well as cancellation. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3419](https://github.com/Alamofire/Alamofire/pull/3419). +- Project files and templates for Xcode 12.4 and GitHub templates. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3414](https://github.com/Alamofire/Alamofire/pull/3414). + +#### Fixed + +- `MultipartUpload` thread-safety. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3421](https://github.com/Alamofire/Alamofire/pull/3421). +- Multipart body stream length handling to better handle partial streams. + - Fixed by [Yu Ao](https://github.com/YuAo) and [Jon Shier](https://github.com/jshier) in Pull Requests [#3380](https://github.com/Alamofire/Alamofire/pull/3380) and [#3420](https://github.com/Alamofire/Alamofire/pull/3420). + +## [5.4.1](https://github.com/Alamofire/Alamofire/releases/tag/5.4.1) + +Released on 2020-12-20. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/75?closed=1). + +#### Updated + +- Project and CocoaPods installation of Obj-C header. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3378](https://github.com/Alamofire/Alamofire/pull/3378). + +## [5.4.0](https://github.com/Alamofire/Alamofire/releases/tag/5.4.0) + +Released on 2020-10-17. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/74?closed=1). + +#### Added + +- `URLResponseSerializer` and attendant convenience methods so downloads can produce a non-optional `URL`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3343](https://github.com/Alamofire/Alamofire/pull/3343). + +#### Updated + +- Handing of `file://` `URL`s, removing error added in 5.3.0 and adding support for `DownloadRequest`. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3342](https://github.com/Alamofire/Alamofire/pull/3342). + +--- + +## [5.3.0](https://github.com/Alamofire/Alamofire/releases/tag/5.3.0) + +Released on 2020-10-17. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/73?closed=1). + +#### Added + +- Closure callback APIs for the production of `URLRequest`s and `URLSessionTask`s. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3219](https://github.com/Alamofire/Alamofire/pull/3219). +- `URLSessionTaskMetrics` gathering on watchOS 7+. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3321](https://github.com/Alamofire/Alamofire/pull/3321). + +#### Updated + +- Project settings, GitHub Actions, tests, and formatting for newer Xcodes. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#3278](https://github.com/Alamofire/Alamofire/pull/3278), [#3284](https://github.com/Alamofire/Alamofire/pull/3284), [#3285](https://github.com/Alamofire/Alamofire/pull/3285), [#3309](https://github.com/Alamofire/Alamofire/pull/3309), and [#3320](https://github.com/Alamofire/Alamofire/pull/3320). +- Use of `URLRequest.headers` extension property in `URLEncoding`. + - Updated by [tomisacat](https://github.com/tomisacat) in Pull Request [#3264](https://github.com/Alamofire/Alamofire/pull/3264). +- iOS example app. + - Updated by [rain2540](https://github.com/rain2540) in Pull Request [#3268](https://github.com/Alamofire/Alamofire/pull/3268). +- Various documentation. + - Updated by [Jaydeep Vora](https://github.com/jaydeep-vora), [Minhyuk Kim](https://github.com/mininny), and [Tieda](https://github.com/weitieda) in Pull Requests [#3274](https://github.com/Alamofire/Alamofire/pull/3274), [#3292](https://github.com/Alamofire/Alamofire/pull/3292), and [#3317](https://github.com/Alamofire/Alamofire/pull/3317). + +#### Fixed + +- Double lock crash in `AuthenticationInterceptor` caused by synchronous `refresh` implementations. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3322](https://github.com/Alamofire/Alamofire/pull/3322). +- Crash when requesting `file://` `URL`s by producing validation error. + - Fixed by [hyotak.yun](https://github.com/devtak) in Pull Request [#3318](https://github.com/Alamofire/Alamofire/pull/3318). +- Missing rethrow of error produced when writing temporary multipart files fails. + - Fixed by [sudo.park](https://github.com/sudopark) in Pull Request [#3306](https://github.com/Alamofire/Alamofire/pull/3306). +- Objective-C module conflicts in Xcode 12 by removing Obj-C module support. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3308](https://github.com/Alamofire/Alamofire/pull/3308). + +--- + +## [5.2.2](https://github.com/Alamofire/Alamofire/releases/tag/5.2.2) + +Released on 2020-07-17. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/72?closed=1). + +#### Added + +- `macOS(Catalyst)` `User-Agent` string. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3236](https://github.com/Alamofire/Alamofire/pull/3236). + +#### Updated + +- `debugDescription` of `DataRequest` and `DownloadRequest` to better handle non-text and long content, with better formatting. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3256](https://github.com/Alamofire/Alamofire/pull/3256). +- Code to use `switch` instead of `if else` statement. + - Updated by [dirtmelon](https://github.com/dirtmelon) in Pull Request [#3214](https://github.com/Alamofire/Alamofire/pull/3214). + +#### Fixed + +- Linking on some Apple OS versions when using Swift Package Manager. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3259](https://github.com/Alamofire/Alamofire/pull/3259). +- Reliability issues with `DataStreamRequest`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3216](https://github.com/Alamofire/Alamofire/pull/3216). + +## [5.2.1](https://github.com/Alamofire/Alamofire/releases/tag/5.2.1) + +Released on 2020-05-25. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/71?closed=1). + +#### Updated + +- Usage of `.background` `DispatchQoS` to `.utility` to avoid low-power issues. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3207](https://github.com/Alamofire/Alamofire/pull/3207). + +#### Fixed + +- Various memory leaks. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3199](https://github.com/Alamofire/Alamofire/pull/3199). + +## [5.2.0](https://github.com/Alamofire/Alamofire/releases/tag/5.2.0) + +Released on 2020-05-16. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/70?closed=1). + +#### Added + +- Combine support! `DataResponsePublisher`, `DownloadResponsePublisher`, and `DataStreamPublisher` to stream Alamofire responses. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3160](https://github.com/Alamofire/Alamofire/pull/3160). +- `AuthenticationInterceptor`, for easier adaptation and retry of requests with credentials. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#3164](https://github.com/Alamofire/Alamofire/pull/3164). + +#### Updated + +- Response handlers to take all serializer parameters. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3188](https://github.com/Alamofire/Alamofire/pull/3188). +- `DisabledEvaluator` to `DisabledTrustEvaluator`, deprecating the previous name. + - Updated by [Florian Petit](https://github.com/MrCloud) in Pull Request [#3162](https://github.com/Alamofire/Alamofire/pull/3162). +- `Interceptor` to be initialized with multiple `RequestInterceptor`s, in addition to `RequestAdapter`s and `RequestRetrier`s. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3155](https://github.com/Alamofire/Alamofire/pull/3155). + +#### Fixed + +- Minor documentation issues. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3187](https://github.com/Alamofire/Alamofire/pull/3187). +- Encoding of `Decimal` values in `URLEncodedFormEncoder`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3185](https://github.com/Alamofire/Alamofire/pull/3185). +- Thread-safety issue in `Session`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3179](https://github.com/Alamofire/Alamofire/pull/3179). +- Memory leak in `NetworkReachabilityManager`. + - Fixed by [dirtmelon](https://github.com/dirtmelon) in Pull Reqeust [#3180](https://github.com/Alamofire/Alamofire/pull/3180). + +--- + +## [5.1.0](https://github.com/Alamofire/Alamofire/releases/tag/5.1.0) + +Released on 2020-04-04. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/64?closed=1). + +#### Added + +- `RequestModifier` closure to request APIs, allowing mutation of created `URLRequest`s. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3137](https://github.com/Alamofire/Alamofire/pull/3137). +- `DataStreamRequest`, for streaming HTTP responses. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3074](https://github.com/Alamofire/Alamofire/pull/3074). + +#### Updated + +- Various framework internals to make porting to Linux easier. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3115](https://github.com/Alamofire/Alamofire/pull/3115). +- Project to require Swift 5.1. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3066](https://github.com/Alamofire/Alamofire/pull/3066). + +#### Fixed + +- Typo in `ServerTrustEvaluating` documentation. + - Fixed by [Lucas Tavares](https://github.com/tavares1) in Pull Request [#3138](https://github.com/Alamofire/Alamofire/pull/3138). + +--- + +## [5.0.5](https://github.com/Alamofire/Alamofire/releases/tag/5.0.5) + +Released on 2020-03-23. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/69?closed=1). + +#### Fixed + +- `Request` casting issue on retry that could lead to incomplete retry of `UploadRequest`s. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3127](https://github.com/Alamofire/Alamofire/pull/3127). +- Rare scenario where `finish()` could be called multiple times, leading to duplicate response handler calls. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3116](https://github.com/Alamofire/Alamofire/pull/3116). + +## [5.0.4](https://github.com/Alamofire/Alamofire/releases/tag/5.0.4) + +Released on 2020-03-15. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/68?closed=1). + +#### Fixed + +- Incompatibility with bitcode on watchOS. + - Fixed by [Roman Podymov](https://github.com/RomanPodymov) in Pull Request [#3112](https://github.com/Alamofire/Alamofire/pull/3112). + +## [5.0.3](https://github.com/Alamofire/Alamofire/releases/tag/5.0.3) + +Released on 2020-03-14. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/67?closed=1). + +#### Added + +- SwiftPM testing support. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3102](https://github.com/Alamofire/Alamofire/pull/3102). +- Documentation around the prohibition of background `URLSessionConfiguration`s in Alamofire 5. + - Added by [Teameh](https://github.com/teameh) in Pull Request [#3094](https://github.com/Alamofire/Alamofire/pull/3094). + +#### Fixed + +- watchOS memory leaks due to missing `didFinishCollecting` event. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3110](https://github.com/Alamofire/Alamofire/pull/3110). +- `RetryPolicy`'s handling of `AFError`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3103](https://github.com/Alamofire/Alamofire/pull/3103). +- `DownloadRequest` cancellation reliability. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3102](https://github.com/Alamofire/Alamofire/pull/3102). +- `-no_compact_unwind` linker warning on watchOS by disabling the warning. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#3083](https://github.com/Alamofire/Alamofire/pull/3083). +- SwiftPM package snippet in README. + - Fixed by [Eddie Seay](https://github.com/eseay) in Pull Request [#3081](https://github.com/Alamofire/Alamofire/pull/3081). +- Various documentation issues. + - Fixed by [dirtmelon](https://github.com/dirtmelon) in Pull Requests [#3105](https://github.com/Alamofire/Alamofire/pull/3105) and [#3097](https://github.com/Alamofire/Alamofire/pull/3097). + - Fixed by [Josip Ćavar](https://github.com/jcavar) in Pull Request [#3095](https://github.com/Alamofire/Alamofire/pull/3095). + - Fixed by [Teameh](https://github.com/dirtmelon) in Pull Request [#3093](https://github.com/Alamofire/Alamofire/pull/3093). + - Fixed by [Michael Clifford](https://github.com/michaeldclifford) in Pull Request [#3087](https://github.com/Alamofire/Alamofire/pull/3087). + +## [5.0.2](https://github.com/Alamofire/Alamofire/releases/tag/5.0.2) + +Released on 2020-02-23. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/66?closed=1). + +#### Fixed + +- Swift 5 support for `AlamofireExtension`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3077](https://github.com/Alamofire/Alamofire/pull/3077). + +## [5.0.1](https://github.com/Alamofire/Alamofire/releases/tag/5.0.1) + +Released on 2020-02-23. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/64?closed=1). + +#### Updated + +- `AlamofireExtension` to have public properties and initializer, and conform to `@dynamicMemberLookup`. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3075](https://github.com/Alamofire/Alamofire/pull/3075). + +## [5.0.0](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0) + +Released on 2020-02-14. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/63?closed=1). + +#### Added + +- Support for `NSURLAuthenticationMethodClientCertificate` when handling auth challenges using `URLCredential`s. + - Added by [刘富东](https://github.com/liuwin7) in Pull Request [#2993](https://github.com/Alamofire/Alamofire/pull/2993). +- Migration Guide for Alamofire 5. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#3061](https://github.com/Alamofire/Alamofire/pull/3061). + +#### Updated + +- Advanced Usage documentation for Alamofire 5. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3062](https://github.com/Alamofire/Alamofire/pull/3062). +- `AF` namespace to be a reference to `Session.default`. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#3059](https://github.com/Alamofire/Alamofire/pull/3059). + +#### Fixed + +- Runtime crashes due to overzealous state checking in `SessionDelegate` by reducing the severity of the assertions. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#3010](https://github.com/Alamofire/Alamofire/pull/3010). +- Unwanted `public` attribute on `_URLEncodedFormEncoder`. + - Fixed by [Mattt](https://github.com/mattt) in Pull Request [#3053](https://github.com/Alamofire/Alamofire/pull/3053). + +--- + +## [5.0.0-rc.3](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-rc.3) + +Released on 2019-10-26. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/62?closed=1). **Note:** Alamofire 5 is now API stable. + +#### Updated + +- Automatic `resume()` behavior to be called after the first response handler is added instead of immediately after task creation. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2965](https://github.com/Alamofire/Alamofire/pull/2965). + +#### Fixed + +- Incorrect header convenience method in Usage documentation. + - Fixed by [Sebastian](https://github.com/Buesing-Sebastian) in Pull Request [#2952](https://github.com/Alamofire/Alamofire/pull/2952). +- Unstable parameter ordering in `URLEncodedFormEncoder`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2961](https://github.com/Alamofire/Alamofire/pull/2961). +- Xcode build issues and precompiled binary build issues by removing the dynamic bundle identifier. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2966](https://github.com/Alamofire/Alamofire/pull/2966). +- Build warnings for deprecated `SecTrust` API when building for Catalyst. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2977](https://github.com/Alamofire/Alamofire/pull/2977). +- Regression from Alamofire 4 causing Alamofire to reject NTLM and Negotiate authentication methods. + - Fixed by [Adrian Kashivskyy](https://github.com/akashivskyy) in Pull Request [#2975](https://github.com/Alamofire/Alamofire/pull/2975). + +## [5.0.0-rc.2](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-rc.2) + +Released on 2019-09-08. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/59?closed=1). **Note:** Alamofire 5 is now API stable. + +#### Fixed + +- Single remaining use of `Error` instead of generic `Failure` constraint in `DataResponse` API. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2937](https://github.com/Alamofire/Alamofire/pull/2937). + +## [5.0.0-rc.1](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-rc.1) + +Released on 2019-09-04. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/58?closed=1). **Note:** Alamofire 5 is now API stable. + +#### Added + +- `cancelAllRequests` method on `Session` to cancel all in flight requests. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2890](https://github.com/Alamofire/Alamofire/pull/2890). +- Ability to inject `FileManager` instance into `UploadRequest`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2898](https://github.com/Alamofire/Alamofire/pull/2898). +- `DataPreprocessor` protocol and implementations, allowing the preprocessing of data before serialization. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2903](https://github.com/Alamofire/Alamofire/pull/2903). +- Internal `URLRequest` validation and error. `GET` requests with body data will now produce an error. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2905](https://github.com/Alamofire/Alamofire/pull/2905). +- Generic `Failure` constraint to `DataResponse` and `DownloadResponse`, making them `DataResponse` and `DownloadResponse`. + - Added by [philtre](https://github.com/philtre) in Pull Request [#2893](https://github.com/Alamofire/Alamofire/pull/2893). +- Precondition to ensure `Session` can't be used with background `URLSessionConfiguration`s. Alamofire will explicitly support such functionality at some point in the future. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2917](https://github.com/Alamofire/Alamofire/pull/2917). +- SwiftFormat configuration and updated styling. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2918](https://github.com/Alamofire/Alamofire/pull/2918). +- `AFDataResponse` and `AFDownloadResponse` typealiases to help deal with the doubly generic responses. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2921](https://github.com/Alamofire/Alamofire/pull/2921). + +#### Updated + +- All internal `Result` usage to use the fully qualified type instead of `AFResult`. + - Updated by [philtre](https://github.com/philtre) in Pull Request [#2891](https://github.com/Alamofire/Alamofire/pull/2891). +- `DataRequest` and `DownloadRequest` functional API, renaming `flatMap` to `tryMap`. + - Updated by [philtre](https://github.com/philtre) in Pull Request [#2892](https://github.com/Alamofire/Alamofire/pull/2892). +- `HTTPMethod` to be a struct rather than an enum. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2901](https://github.com/Alamofire/Alamofire/pull/2901). +- All errors produced by Alamofire to be `AFError` by default. All responses will now start with an `AFError` `Failure` type. + - Updated by [philtre](https://github.com/philtre) in Pull Request [#2893](https://github.com/Alamofire/Alamofire/pull/2893). +- `NetworkReachabilityManager` to simplify and modernize its API. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2915](https://github.com/Alamofire/Alamofire/pull/2915). +- `Usage.md` documentation to be fully up-to-date with Alamofire 5. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2895](https://github.com/Alamofire/Alamofire/pull/2895). +- Bundle identifiers to include the platform name, fixing ITMS-90806. + - Updated by [Jonathan](https://github.com/JonMo) in Pull Request [#2928](https://github.com/Alamofire/Alamofire/pull/2928). + +#### Fixed + +- Thread-safety issue with serialization queue usage. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2885](https://github.com/Alamofire/Alamofire/pull/2885). + +## [5.0.0-beta.7](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.7) + +Released on 2019-07-29. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/57?closed=1). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- `URLEncodedFormEncoder.DataEncoding` and `URLEncodedFormEncoder.KeyEncoding` to customize the encoding of `Data` and `CodingKeys` in `URLEncodedFormEncoder`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2858](https://github.com/Alamofire/Alamofire/pull/2858). +- Asynchronous `cURLDescription` method to produce `cURL` commands for `Request`s which are in the process of creating their initial `URLRequest`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2863](https://github.com/Alamofire/Alamofire/pull/2863). + +#### Updated + +- All inline API documentation. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2845](https://github.com/Alamofire/Alamofire/pull/2845). +- Handling of response serializers appended after a `Request` has completed. This no longer produces an error but will instead trigger the normal `Request` lifetime methods. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2862](https://github.com/Alamofire/Alamofire/pull/2862). + +#### Fixed + +- Empty parameters being encoded as an empty `String` instead of `nil` by `URLEncodedFormEncoder`. + - Fixed by [David Barry](https://github.com/DavidBarry) in Pull Request [#2818](https://github.com/Alamofire/Alamofire/pull/2818). +- Handling of `os_unfair_lock` to prevent rare crash. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2836](https://github.com/Alamofire/Alamofire/pull/2836). + +## [5.0.0-beta.6](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.6) + +Released on 2019-04-23. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/56?closed=1). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Updated + +- `ServerTrustEvaluation` logic by simplifying public key equality checks for `SecKey` types. + - Updated by [Aleksandar Vacić](https://github.com/radianttap) in Pull Request [#2800](https://github.com/Alamofire/Alamofire/pull/2800). +- `Request.State` access to lock access and task updates using internal locking API. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2814](https://github.com/Alamofire/Alamofire/pull/2814). + +#### Fixed + +- Issues in `DownloadRequest` where some events were being duplicated and some were missing. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2807](https://github.com/Alamofire/Alamofire/pull/2807). +- Issue with AppStore submissions where the pre-release version in the bundle short versions string was being rejected when built with Carthage or as a submodule. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2808](https://github.com/Alamofire/Alamofire/pull/2808). +- Issue where response serializer completions were not called when appended to a completed `Request`. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2810](https://github.com/Alamofire/Alamofire/pull/2810). + +## [5.0.0-beta.5](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.5) + +Released on 2019-04-12. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/55). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- `Request.didResumeTaskNotification`, `Request.didSuspendTaskNotification`, `Request.didCancelTaskNotification`, and `Request.didCompleteTaskNotification` notifications. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2803](https://github.com/Alamofire/Alamofire/pull/2803). +- Separate `URLSessionTask` lifetime events to `EventMonitor`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2796](https://github.com/Alamofire/Alamofire/pull/2796). + +#### Updated + +- `SessionStateProvider` to no longer be `public` and renamed the file it lives in. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2801](https://github.com/Alamofire/Alamofire/pull/2801). +- `MultipartUpload` to no longer be `public`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2805](https://github.com/Alamofire/Alamofire/pull/2805). +- `Request`, `DataRequest`, `UploadRequest`, and `DownloadRequest` to longer be `open`, as Alamofire does not support subclassing these types. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2804](https://github.com/Alamofire/Alamofire/pull/2804). +- Names of the notifications posted by `Request` to include `Notification`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2803](https://github.com/Alamofire/Alamofire/pull/2803). +- `httpHeaders` extensions on `URLRequest`, `HTTPURLResponse`, and `URLSessionConfiguration` to be `headers` instead. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2802](https://github.com/Alamofire/Alamofire/pull/2802). + +#### Fixed + +- Issue in `Request` where calling `cancel()` inside a response serializer would result in the serializer running again. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2778](https://github.com/Alamofire/Alamofire/pull/2778). +- Issue in `Session` where the delegate `precondition` would be triggered when running with a swizzled `URLSessionDelegate`. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2783](https://github.com/Alamofire/Alamofire/pull/2783). +- Compiler error in the example app. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2786](https://github.com/Alamofire/Alamofire/pull/2786). +- Issues `Request` where certain lifetime events could be triggered more than once by repeatedly calling `resume()`, `suspend()`, or `cancel()`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2796](https://github.com/Alamofire/Alamofire/pull/2796) in Regards to Issue [#2759](https://github.com/Alamofire/Alamofire/issues/2759). +- Framework version string to be compatible with TestFlight and AppStore releases. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2799](https://github.com/Alamofire/Alamofire/pull/2799) in Regards to Issue [#2797](https://github.com/Alamofire/Alamofire/issues/2797). + +## [5.0.0-beta.4](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.4) + +Released on 2019-03-29. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A5.0.0-beta.4). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- The `AlamofireExtended` protocol and used it to namespace all public extensions. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2758](https://github.com/Alamofire/Alamofire/pull/2758). +- The ability to retry requests after encountering response serialization errors. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2716](https://github.com/Alamofire/Alamofire/pull/2716). + +#### Updated + +- The `switch` and `DispatchQueue` logic throughout codebase to simplify usage patterns. + - Updated by [Joan Disho](https://github.com/jdisho) and [Christian Noon](https://github.com/cnoon) in Pull Requests [#2691](https://github.com/Alamofire/Alamofire/pull/2691) and [#2765](https://github.com/Alamofire/Alamofire/pull/2765). +- The `MultipartFormData` data APIs by condensing them using optional parameters. + - Updated by [Ernesto Rivera](https://github.com/rivera-ernesto) in Pull Request [#2766](https://github.com/Alamofire/Alamofire/pull/2766). +- The upload APIs for `MultipartFormData` to support custom boundaries. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2764](https://github.com/Alamofire/Alamofire/pull/2764). +- The Xcode project, source code, SPM package, and podspec to support Swift 5 only. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2771](https://github.com/Alamofire/Alamofire/pull/2771). +- The Alamofire `Result` type to be a new `AFResult` typealias on the new `Swift.Result` type in Swift 5 and removed all public extensions. + - Updated by [Dave Camp](https://github.com/AtomicCat), [Eric Jensen](https://github.com/ejensen), and [Christian Noon](https://github.com/cnoon) in Pull Requests [#2769](https://github.com/Alamofire/Alamofire/pull/2769) and [#2774](https://github.com/Alamofire/Alamofire/pull/2774). + +#### Fixed + +- Issue in `RequestInterceptor` closures where callback arguments were not marked as `@escaping`. + - Fixed by [Scott Talbot](https://github.com/cysp) in Pull Request [#2747](https://github.com/Alamofire/Alamofire/pull/2747). +- Issue in response serializers where `emptyResponseAllowed` logic was not working as expected. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2772](https://github.com/Alamofire/Alamofire/pull/2772) in Regards to Issue [#2770](https://github.com/Alamofire/Alamofire/issues/2770). + +## [5.0.0-beta.3](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.3) + +Released on 2019-01-07. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A5.0.0-beta.3). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- The `EmptyResponse` protocol, to allow any type to provides values to stand in for an empty response. + - Added by [James Van Noord](https://github.com/jvannoord) in Pull Request [#2664](https://github.com/Alamofire/Alamofire/pull/2664). +- Request and response bodies to `Request`'s `debugDescription`. + - Added by [rain2540](https://github.com/rain2540) in Pull Request [#2700](https://github.com/Alamofire/Alamofire/pull/2700). + +#### Updated + +- `Package.swift` for Swift 5 support, moving Swift 4.2 support to `Package@swift-4.2.swift`. + - Updated by [Mattt](https://github.com/mattt) in Pull Requests [#2737](https://github.com/Alamofire/Alamofire/pull/2737) and [#2736](https://github.com/Alamofire/Alamofire/pull/2736). +- Use of `Array` to `Range` in `Request`'s default `acceptableResponseCodes`. + - Updated by [StevenArmandLee](https://github.com/StevenArmandLee) in Pull Request [#2720](https://github.com/Alamofire/Alamofire/pull/2720). +- `RetryPolicy` to allow subclasses to override `retry(_:, for: Session, dueTo:, completion:)`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2713](https://github.com/Alamofire/Alamofire/pull/2713). +- Alamofire's `didResume` notification to `didFinish`, which is now called when a `Request` finished, not when tasks resume. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2728](https://github.com/Alamofire/Alamofire/pull/2728). + +#### Fixed + +- `Request`s not finishing when their controlling `Session` is `deinit`d or invalidated. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2728](https://github.com/Alamofire/Alamofire/pull/2728). +- Memory leak when using `validate()` due to reference cycle from implicit `self` capture when using an `@autoclosure`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2728](https://github.com/Alamofire/Alamofire/pull/2728). +- Crash when using `requestDidParseAnyResponse` when using `ClosureEventMonitor`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2740](https://github.com/Alamofire/Alamofire/pull/2740). +- `RetryPolicy` to properly conform to `RequestInterceptor`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2739](https://github.com/Alamofire/Alamofire/pull/2739). +- Typos in documentation. + - Fixed by [Łukasz Mróz](https://github.com/sunshinejr), [Jacob Wood](https://github.com/jacoblukewood), [Paulo Henrique](https://github.com/Cardoso222), and [Todd Lahtinen](https://github.com/toddlahtinen0) in Pull Requests [#2715](https://github.com/Alamofire/Alamofire/pull/2715), [#2725](https://github.com/Alamofire/Alamofire/pull/2725), [#2729](https://github.com/Alamofire/Alamofire/pull/2729), and [#2697](https://github.com/Alamofire/Alamofire/pull/2697). + +## [5.0.0-beta.2](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.2) + +Released on 2019-01-07. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A5.0.0-beta.2). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- Support for controlling redirect behavior per `Session` and per `Request` using the `RedirectHandler` protocol. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2699](https://github.com/Alamofire/Alamofire/pull/2699). +- Support for controlling cached response behavior per `Session` and per `Request` using the `CachedResponseHandler` protocol. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2701](https://github.com/Alamofire/Alamofire/pull/2701). +- Support for controlling retry behavior per `Session` and per `Request` using the `RequestInterceptor` protocol. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2704](https://github.com/Alamofire/Alamofire/pull/2704) in regards to Issue [#2241](https://github.com/Alamofire/Alamofire/issues/2241). +- The `Adapter`, `Retrier`, and `Interceptor` types to provide fine grained control of retry behavior. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2704](https://github.com/Alamofire/Alamofire/pull/2704). +- Support for exponential backoff retry policies through the new `RetryPolicy` and `ConnectionLostRetryPolicy` types. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2704](https://github.com/Alamofire/Alamofire/pull/2704). + +#### Updated + +- The `RequestRetrier` protocol to take a `RetryResult` in the `completion` closure allowing custom retry errors to be thrown. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request [#2704](https://github.com/Alamofire/Alamofire/pull/2704). +- The `Hashable` implementation on `Request` to use new `hash(into:)` API. + - Updated by [Jeff Kelley](https://github.com/SlaunchaMan) in Pull Request [#2696](https://github.com/Alamofire/Alamofire/pull/2696). + +## [5.0.0-beta.1](https://github.com/Alamofire/Alamofire/releases/tag/5.0.0-beta.1) + +Released on 2018-12-06. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A5.0.0.beta-1). **Note:** Alamofire will not be following semantic versioning during the beta process. There may be breaking changes until 5.0.0 is released. + +#### Added + +- Support for `Decodable` response serialization with `responseDecodable`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Requests [#2265](https://github.com/Alamofire/Alamofire/pull/2265) and [#2657](https://github.com/Alamofire/Alamofire/pull/2657). +- Support for Brotli `Content-Encoding` in Alamofire's default headers. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2346](https://github.com/Alamofire/Alamofire/pull/2346). +- `HTTPHeaders` type and convenience APIs. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2629](https://github.com/Alamofire/Alamofire/pull/2629). +- Support for `Encodable` parameter types with `JSONParameterEncoder` and `URLEncodedFormParameterEncoder`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2637](https://github.com/Alamofire/Alamofire/pull/2637). +- Customizable empty response handling in response serializers. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2639](https://github.com/Alamofire/Alamofire/pull/2639). +- `EventMonitor` protocol, to tap in to internal Alamofire lifetime events. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- `ServerTrustFailureReason` to `AFError`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2608](https://github.com/Alamofire/Alamofire/pull/2608). +- Asynchronous request creation. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). + +#### Updated + +- `ResponseSerializer` and associated protocols' requirements and implementations. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests [#2265](https://github.com/Alamofire/Alamofire/pull/2265) and [#2639](https://github.com/Alamofire/Alamofire/pull/2639). +- `RequestAdapter` to allow for asynchronous adaptation. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2628](https://github.com/Alamofire/Alamofire/pull/2628) . +- `SessionManager` to `Session`, with rewritten implementation and API. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- `Request`, `DataRequest`, `UploadRequest`, and `DownloadRequest` with rewritten implementation and API. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- Top level `request` API to be inside a real `AF` namespace enum rather than unnecessary `Alamofire.` usage. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2585](https://github.com/Alamofire/Alamofire/pull/2585). + +#### Removed + +- Support for iOS < 10, macOS < 10.12, tvOS < 10, watchOS < 3. + - Removed by [Jon Shier](https://github.com/jshier) in Pull Requests [#2254](https://github.com/Alamofire/Alamofire/pull/2254) and [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- Support for `PropertyListSerialization` and `responsePropertyList`. + - Removed by [Jon Shier](https://github.com/jshier) in Pull Request [#2265](https://github.com/Alamofire/Alamofire/pull/2265). +- Support for `URLSessionStreamTask`. + - Removed by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- Closure override and customization API. + - Removed by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). +- `Timeline` type, as Alamofire now gathers `URLSessionTaskMetrics` for every request. + - Removed by [Jon Shier](https://github.com/jshier) in Pull Request [#2521](https://github.com/Alamofire/Alamofire/pull/2521). + +--- + +## [4.9.1](https://github.com/Alamofire/Alamofire/releases/tag/4.9.1) + +Released on 2019-10-26. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/milestone/61?closed=1). + +#### Added + +- Support for GitHub Actions for CI. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request [#2979](https://github.com/Alamofire/Alamofire/pull/2979). + +#### Updated + +- `DataResponse` and `DownloadResponse` `debugDescription` to include more useful information. + - Updated by [rain2540](https://github.com/rain2540) in Pull Request [#2976](https://github.com/Alamofire/Alamofire/pull/2976). + +#### Fixed + +- Dynamic bundle identifier causing issues with Xcode and precompiled binaries by removing the dynamic behavior. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2967](https://github.com/Alamofire/Alamofire/pull/2967). +- Compiler warnings when building for Catalyst by updating the usage of deprecated API. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2979](https://github.com/Alamofire/Alamofire/pull/2979). + +## [4.9.0](https://github.com/Alamofire/Alamofire/releases/tag/4.9.0) + +Released on 2019-09-03. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.9.0). + +#### Added + +- API to cancel `DownloadRequest`s without producing resume data. + - Added by [ullstrm](https://github.com/ullstrm) in Pull Request [#2851](https://github.com/Alamofire/Alamofire/pull/2851). + +#### Updated + +- Bundle identifiers to include the platform name, fixing ITMS-90806. + - Updated by [Jonathan](https://github.com/JonMo) in Pull Request [#2930](https://github.com/Alamofire/Alamofire/pull/2930). + +#### Fixed + +- `NetworkReachabilityManager` behavior regression from 4.8.1. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2931](https://github.com/Alamofire/Alamofire/pull/2931). +- Memory leak when using `validate()`. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request [#2931](https://github.com/Alamofire/Alamofire/pull/2931). + +## [4.8.2](https://github.com/Alamofire/Alamofire/releases/tag/4.8.2) + +Released on 2019-03-27. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.8.2). + +#### Updated + +- Project for compatability with Xcode 10.2. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2767](https://github.com/Alamofire/Alamofire/pull/2767). +- MultipartFormData to have a mutable boundary. + - Updated by [Ondrej Stocek](https://github.com/ondrejstocek) in Pull Request [#2705](https://github.com/Alamofire/Alamofire/pull/2705). + +#### Fixed + +- Compatability with SPM from Xcode 10.2. + - Fixed by [Klaas](https://github.com/klaas) in Pull Request [#2762](https://github.com/Alamofire/Alamofire/pull/2762). + +## [4.8.1](https://github.com/Alamofire/Alamofire/releases/tag/4.8.1) + +Released on 2019-01-15. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.8.1). + +#### Fixed + +- Issue where the network reachability listener closure was not being called immediately when launching an app in airplane mode. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request [#2688](https://github.com/Alamofire/Alamofire/pull/2688) regards to Issues [#2275](https://github.com/Alamofire/Alamofire/issues/2275) and [#2677](https://github.com/Alamofire/Alamofire/issues/2677). + +## [4.8.0](https://github.com/Alamofire/Alamofire/releases/tag/4.8.0) + +Released on 2018-11-24. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.8.0). + +#### Added + +- Optional encoding completion callback queue for multipart upload. + - Added by [jaltreuter](https://github.com/jaltreuter) in Pull Request [#2620](https://github.com/Alamofire/Alamofire/pull/2620). +- Versioned Swift package manifests. + - Added by [Wanbok Choi (Wayne)](https://github.com/wanbok) in Pull Request [#2621](https://github.com/Alamofire/Alamofire/pull/2621) and [Jon Shier](https://github.com/jshier) in Pull Request [#2648](https://github.com/Alamofire/Alamofire/pull/2648). + +#### Updated + +- Project Swift version to 4. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2648](https://github.com/Alamofire/Alamofire/pull/2648). +- Various `Result` methods to be `throw`/`rethrows`. + - Updated by [Stéphane Copin](https://github.com/stephanecopin) in Pull Request [#2488](https://github.com/Alamofire/Alamofire/pull/2488). +- cURL representation implementation readability. + - Updated by [Giulio](https://github.com/giulio92) in Pull Request [#2625](https://github.com/Alamofire/Alamofire/pull/2625). + +--- + +## [4.7.3](https://github.com/Alamofire/Alamofire/releases/tag/4.7.3) + +Released on 2018-7-8. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.7.3). + +#### Updated + +- Project for Xcode 10 and Swift 4.2 beta versions. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2552](https://github.com/Alamofire/Alamofire/pull/2552). +- Documentation styling and content. + - Updated by [Constantin Lungu](https://github.com/nemesis) in Pull Request [#2505](https://github.com/Alamofire/Alamofire/pull/2505), [Xing He](https://github.com/kukushi) in Pull Request [#2484](https://github.com/Alamofire/Alamofire/pull/2484), and [Karim](https://github.com/karimhm) in Pull Request [#2550](https://github.com/Alamofire/Alamofire/pull/2550). + +## [4.7.2](https://github.com/Alamofire/Alamofire/releases/tag/4.7.2) + +Released on 2018-4-15. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.7.2). + +#### Fixed + +- Leak of `Requests` after retry. + - Fixed by [Artem Shimankski](https://github.com/mrdepth) in Pull Request [#2412](https://github.com/Alamofire/Alamofire/pull/2412). + +## [4.7.1](https://github.com/Alamofire/Alamofire/releases/tag/4.7.1) + +Released on 2018-3-31. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.7.1). + +#### Updated + +- Project for Xcode 9.3 and Swift 4.1 release versions. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2473](https://github.com/Alamofire/Alamofire/pull/2473). + +#### Fixed + +- Quote escaping in cURL representation. + - Fixed by [Jonah](https://github.com/jonah-williams) in Pull Request [#2474](https://github.com/Alamofire/Alamofire/pull/2474). + +## [4.7.0](https://github.com/Alamofire/Alamofire/releases/tag/4.7.0) + +Released on 2018-3-5. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.7.0). + +#### Added + +- Open accessibility to `NetworkReachabilityManager` + - Added by [Pär Strindevall](https://github.com/parski) in Pull Request [#2393](https://github.com/Alamofire/Alamofire/pull/2393). +- Configurable parameter encoding for `URLEncoding` + - Added by [Morten Heiberg](https://github.com/heiberg) in Pull Request [#2431](https://github.com/Alamofire/Alamofire/pull/2431). +- Response `Data` to `.DidComplete` notification. + - Added by [Sven Driemecker](https://github.com/svendr) in Pull Request [#2427](https://github.com/Alamofire/Alamofire/pull/2427). +- Radar link for `URLSessionTaskMetrics` bug on watchOS. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request [#2387](https://github.com/Alamofire/Alamofire/pull/2387). + +#### Updated + +- Project for Xcode 9.3 and Swift 4.1. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request [#2441](https://github.com/Alamofire/Alamofire/pull/2441). +- OS versions affected by resume data bug. + - Updated by [Aaron Brager](https://github.com/getaaron) in Pull Request [#2389](https://github.com/Alamofire/Alamofire/pull/2389). + +#### Fixed + +- Typos in `ResultTests`. + - Fixed by [Aleph Retamal](https://github.com/alaphao) in Pull Request [#2416](https://github.com/Alamofire/Alamofire/pull/2416). + +--- + +## [4.6.0](https://github.com/Alamofire/Alamofire/releases/tag/4.6.0) + +Released on 2017-12-3. All issues associated with this milestone can be found using this [filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.6.0). + +#### Added + +- Error mapping functions to `Response` types. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request + [#2361](https://github.com/Alamofire/Alamofire/pull/2361). +- Separation of Usage and Advanced Usage docs from README. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request + [#2360](https://github.com/Alamofire/Alamofire/pull/2360). + +#### Updated + +- Travis CI and Ruby dependencies. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Requests + [#2361](https://github.com/Alamofire/Alamofire/pull/2361), [#2302](https://github.com/Alamofire/Alamofire/pull/2302), [#2345](https://github.com/Alamofire/Alamofire/pull/2345). +- Swift Package Manager instructions. + - Updated by [Ryosuke Hayashi](https://github.com/hayashikun) in Pull Request + [#2341](https://github.com/Alamofire/Alamofire/pull/2341). + +#### Fixed + +- `#session-manager` link in Advanced Usage docs. + - Fixed by [Naeem Shaikh](https://github.com/naeemshaikh90) in Pull Request + [#2373](https://github.com/Alamofire/Alamofire/pull/2373). +- Missing `@discardableResult`. + - Fixed by [Aron Cedercrantz](https://github.com/rastersize) in Pull Request + [#2338](https://github.com/Alamofire/Alamofire/pull/2338). +- Colon placement. + - Fixed by [Issarapong Poesua](https://github.com/Dekablade01) in Pull Request + [#2329](https://github.com/Alamofire/Alamofire/pull/2329). + +--- + +## [4.5.1](https://github.com/Alamofire/Alamofire/releases/tag/4.5.1) + +Released on 2017-09-06. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.5.1). + +#### Added + +- GitHub templates for issues and pull requests. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request + [#2179](https://github.com/Alamofire/Alamofire/pull/2179). +- Jazzy docs for the release to work with GitHub Pages. + - Added by [Aaron McTavish](https://github.com/aamctustwo) in Pull Request + [#2250](https://github.com/Alamofire/Alamofire/pull/2250). +- Dash support for Jazzy docs. + - Added by [Jon Shier](https://github.com/jshier). + +#### Updated + +- The project to work with Xcode 9 beta 6 on Swift 3.2 and 4.0. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#2198](https://github.com/Alamofire/Alamofire/pull/2198). +- The Travis CI config to work with Xcode 9 beta 6. + - Updated by [Jon Shier](https://github.com/jshier). +- The cURL representation logic to no longer force unwrap `URLCredential` values. + - Updated by [Andrey Chernoprudov](https://github.com/achernoprudov) in Pull Request + [#2184](https://github.com/Alamofire/Alamofire/pull/2184). +- The radars section of the README to split out open vs. resolved radars. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#2263](https://github.com/Alamofire/Alamofire/pull/2263). +- The installation section of the README to use the current version. + - Updated by [Kim de Vos](https://github.com/kimdv) in Pull Request + [#2266](https://github.com/Alamofire/Alamofire/pull/2266). + +#### Fixed + +- Issue in `TaskDelegate` where task access was not thread safe. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#2190](https://github.com/Alamofire/Alamofire/pull/2190). +- Issue in AF 4 migration guide where supported iOS versions was incorrect. + - Fixed by [Antoine Cœur](https://github.com/Coeur) in Pull Request + [#2212](https://github.com/Alamofire/Alamofire/pull/2212). +- Issue in README sample code where PNG representation API was incorrect. + - Fixed by [Andy Ron](https://github.com/andyRon) in Pull Request + [#2244](https://github.com/Alamofire/Alamofire/pull/2244). +- Swift 3.2+ API warnings for `substring` APIs. + - Fixed by [htinlinn](https://github.com/htinlinn) in Pull Request + [#2240](https://github.com/Alamofire/Alamofire/pull/2240). + +## [4.5.0](https://github.com/Alamofire/Alamofire/releases/tag/4.5.0) + +Released on 2017-06-16. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.5.0). + +#### Added + +- Missing `@escaping` annotation for session delegate closures. + - Added by [Alexey Aleshkov](https://github.com/djmadcat) in Pull Request + [#1951](https://github.com/Alamofire/Alamofire/pull/1951). +- New `mapError`, `flatMapError`, `withValue`, `withError`, `ifSuccess`, and `ifFailure` APIs to `Result`. + - Added by [Jon Shier](https://github.com/jshier) in Pull Request + [#2135](https://github.com/Alamofire/Alamofire/pull/2135). + +#### Updated + +- The Travis config file to Xcode 8.3. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#2059](https://github.com/Alamofire/Alamofire/pull/2059). +- Response serialization implementation to use separate internal variable. + - Updated by [Eunju Amy Sohn](https://github.com/EJSohn) in Pull Request + [#2125](https://github.com/Alamofire/Alamofire/pull/2125). +- `SessionDelegate` internal implementation by removing redundant optional unwrap. + - Updated by [Boris Dušek](https://github.com/dusek) in Pull Request + [#2056](https://github.com/Alamofire/Alamofire/pull/2056). +- The `debugPrintable` implementation of `Request` to use `curl -v` instead of `curl -i` to be more verbose. + - Updated by [Simon Warta](https://github.com/webmaster128) in Pull Request + [#2070](https://github.com/Alamofire/Alamofire/pull/2070). +- The `MultipartFormData` contentType property to be mutable. + - Updated by [Eric Desa](https://github.com/ericdesa) in Pull Request + [#2072](https://github.com/Alamofire/Alamofire/pull/2072). +- Travis CI yaml file to enable watchOS 3.2 builds. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#2135](https://github.com/Alamofire/Alamofire/pull/2135). +- Alamofire to build with Xcode 9 with Swift 3.2 and 4.0 in addition to Xcode 8.3 and Swift 3.1. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#2163](https://github.com/Alamofire/Alamofire/pull/2163). + +#### Removed + +- Custom string extension no longer needed in the test suite. + - Removed by [Nicholas Maccharoli](https://github.com/Nirma) in Pull Request + [#1994](https://github.com/Alamofire/Alamofire/pull/1994). + +#### Fixed + +- Issue in the `URLProtocolTestCase` where HTTP header capitalization was wrong due to httpbin.org change. + - Fixed by [Natascha Fadeeva](https://github.com/Tanaschita) in Pull Request + [#2025](https://github.com/Alamofire/Alamofire/pull/2025). +- Issues and typos throughout the README documentation and sample code and source code docstrings. + - Fixed by + [Raphael R.](https://github.com/reitzig), + [helloyako](https://github.com/helloyako), + [DongHyuk Kim](https://github.com/sss989870), + [Bas Broek](https://github.com/BasThomas), + [Jorge Lucena](https://github.com/jorgifumi), + [MasahitoMizogaki](https://github.com/MMizogaki), + [José Manuel Sánchez](https://github.com/buscarini), + [SabinLee](https://github.com/SabinLee), + [Mat Trudel](https://github.com/mtrudel), + [Wolfgang Lutz](https://github.com/Lutzifer), and + [Christian Noon](https://github.com/cnoon) in Pull Requests + [#1995](https://github.com/Alamofire/Alamofire/pull/1995), + [#1997](https://github.com/Alamofire/Alamofire/pull/1997), + [#1998](https://github.com/Alamofire/Alamofire/pull/1998), + [#2022](https://github.com/Alamofire/Alamofire/pull/2022), + [#2031](https://github.com/Alamofire/Alamofire/pull/2031), + [#2035](https://github.com/Alamofire/Alamofire/pull/2035), + [#2080](https://github.com/Alamofire/Alamofire/pull/2080), + [#2081](https://github.com/Alamofire/Alamofire/pull/2081), + [#2092](https://github.com/Alamofire/Alamofire/pull/2092), + [#2095](https://github.com/Alamofire/Alamofire/pull/2095), + [#2104](https://github.com/Alamofire/Alamofire/pull/2104). +- Several warnings in the test suite related to Xcode 8.3. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#2057](https://github.com/Alamofire/Alamofire/pull/2057). +- Issue where reachability calculation incorrectly reported `.reachable` status with [`.connectionRequired`, `.isWWAN`] combination. + - Fixed by [Marco Santarossa](https://github.com/MarcoSantarossa) in Pull Request + [#2060](https://github.com/Alamofire/Alamofire/pull/2060). + +--- + +## [4.4.0](https://github.com/Alamofire/Alamofire/releases/tag/4.4.0) + +Released on 2017-02-26. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.4.0). + +#### Added + +- A new `Alamofire/Alamofire` Gitter channel and also added badge to the README. + - Added by [Christian Noon](https://github.com/cnoon). +- Functional extensions for Result, Data and Download Response. + - Added by [Gwendal Roué](https://github.com/groue) in Pull Request + [#1836](https://github.com/Alamofire/Alamofire/pull/1836). + +### Fixed + +- Typo in the README in the Swift Package Manager section. + - Fixed by [Sebastian Limbach](https://github.com/bastilimbach) in Pull Request + [#1918](https://github.com/Alamofire/Alamofire/pull/1918). +- Issue in the "Modifying the Session Configuration" example code of the README where the + `defaultHTTPHeaders` property was called incorrectly. + - Fixed by [Artur Antonov](https://github.com/goingreen) in Pull Request + [#1927](https://github.com/Alamofire/Alamofire/pull/1927). +- Issue in the "Security" section of the README where some example code was outdated. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#1973](https://github.com/Alamofire/Alamofire/pull/1973). +- Issue in the README where the POST request with parameters example was using the wrong method. + - Fixed by [Pablo Bartolome](https://github.com/pbartolome) in Pull Request + [#1984](https://github.com/Alamofire/Alamofire/pull/1984). +- Issue where `taskDidComplete` override closure was not calling task delegate leading to + potential memory leaks. + - Fixed by [Jon Shier](https://github.com/jshier) in regards to Issue + [#1938](https://github.com/Alamofire/Alamofire/pull/1938). + +--- + +## [4.3.0](https://github.com/Alamofire/Alamofire/releases/tag/4.3.0) + +Released on 2017-01-15. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.3.0). + +#### Added + +- The host and path to router example in README. + - Added by [Michael](https://github.com/muescha) in Pull Request + [#1830](https://github.com/Alamofire/Alamofire/pull/1830). +- A `macOS` disclaimer to download request example in README. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1818](https://github.com/Alamofire/Alamofire/issues/1818). +- New `value` and `error` computed properties to data and download responses. + - Added by [Christian Noon](https://github.com/cnoon) in Pull request + [#1865](https://github.com/Alamofire/Alamofire/pull/1865). +- The HTTP method to the data and download response debug descriptions. + - Added by [Jon Shier](https://github.com/jshier) in Pull request + [#1880](https://github.com/Alamofire/Alamofire/pull/1880). +- A README entry about installing through SPM. + - Added by [Jon Shier](https://github.com/jshier) in Pull request + [#1898](https://github.com/Alamofire/Alamofire/pull/1898). +- The `dependencies` parameter to `Package` file for SPM since it's now required. + - Added by [Arnaldo Capo](https://github.com/cyberdude) in Pull request + [#1905](https://github.com/Alamofire/Alamofire/pull/1905). +- TLS evaluation tests for revoked certs for no policy and default policy. + - Added by [Christian Noon](https://github.com/cnoon). +- New server trust policy for revoked certificates along with matching tests. + - Added by [Wataru Suzuki](https://github.com/WataruSuzuki) in Pull request + [#1822](https://github.com/Alamofire/Alamofire/pull/1822). + +#### Updated + +- Project to Xcode 8.2 recommend settings. + - Updated by [Jon Shier](https://github.com/jshier) in Pull request + [#1854](https://github.com/Alamofire/Alamofire/pull/1854). +- The `NetworkReachabilityManager` to have a `public` instead of `open` ACL. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1809](https://github.com/Alamofire/Alamofire/issues/1809). +- The initializers for both default responses public and added metrics parameter. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1865](https://github.com/Alamofire/Alamofire/pull/1865). +- Internals by replacing `syncResult` extension with DispatchQueue `sync`. + - Updated by [Alexander Ignition](https://github.com/Alexander-Ignition) in Pull Request + [#1893](https://github.com/Alamofire/Alamofire/pull/1893). +- TLS tests for tvOS 10.1 and added expiration test for revoked evaluation. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- `DownloadRequest` sample code issue in AF 4 migration guide. + - Fixed by [Luca Torella](https://github.com/lucatorella) in Pull Request + [#1802](https://github.com/Alamofire/Alamofire/pull/1802). +- `URLConvertible` compiler issue in the README example. + - Fixed by [Wu Zhong](https://github.com/zhongwuzw) in Pull Request + [#1844](https://github.com/Alamofire/Alamofire/pull/1844). +- An invalid comment in AF 4 migration guide. + - Fixed by [Tom Brow](https://github.com/brow) in Pull Request + [#1863](https://github.com/Alamofire/Alamofire/pull/1863). +- An issue where the `SessionManager` did not respect retry time delay. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1864](https://github.com/Alamofire/Alamofire/pull/1864) in regards to Issue + [#1853](https://github.com/Alamofire/Alamofire/issues/1853). +- A broken reference link in the README. + - Fixed by [Ulug'bek Ro'zimboyev](https://github.com/ulugbekrozimboyev) in Pull Request + [#1866](https://github.com/Alamofire/Alamofire/pull/1866). +- Compiler issues in `RequestAdapter` and `RequestRetrier` examples in README. + - Fixed by [William Entriken](https://github.com/fulldecent) in Pull Request + [#1916](https://github.com/Alamofire/Alamofire/pull/1916). + +--- + +## [4.2.0](https://github.com/Alamofire/Alamofire/releases/tag/4.2.0) + +Released on 2016-11-20. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.2.0). + +#### Added + +- Request property overrides to fallback on original task if available. + - Added by [Aron Cedercrantz](https://github.com/rastersize) in Pull Request + [#1792](https://github.com/Alamofire/Alamofire/pull/1792). +- `Timeline` generation to `DefaultDataResponse` and `DefaultDownloadResponse`. + - Added by [Christian Noon](https://github.com/cnoon). +- JSON encoding `encode` method that takes a JSON object along with unit tests. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- The `RequestRetrier` example in the README to safely extract tokens. + - Updated by [Pontus Andersson](https://github.com/pontus-andersson) in Pull Request + [#1794](https://github.com/Alamofire/Alamofire/pull/1794). +- `TaskDelegate` `data` and `error` properties to a `public` ACL. + - Updated by [Christian Noon](https://github.com/cnoon). +- Multipart form data uploads to now delete temp file if encoding fails. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue where `AdaptError` instances were being incorrectly sent to the `RequestRetrier`. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1785](https://github.com/Alamofire/Alamofire/issues/1785). +- Issue where TLS tests were failing on iOS 10.0 and not on iOS 10.1. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [4.1.0](https://github.com/Alamofire/Alamofire/releases/tag/4.1.0) + +Released on 2016-11-15. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.1.0). + +#### Added + +- Docstrings and a note to the README about `resumeData` and background session behavior. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1553](https://github.com/Alamofire/Alamofire/issues/1553). +- Request `retryCount` property to support the `RequestRetrier`. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1672](https://github.com/Alamofire/Alamofire/issues/1672). + +#### Updated + +- SPM package file to exclude tests since current configuration is not supported. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1544](https://github.com/Alamofire/Alamofire/issues/1544). +- An example in the README to use proper error checking in download response handler. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1722](https://github.com/Alamofire/Alamofire/pull/1722). +- Embedded framework installation instructions. + - Updated by [ILI4S K4RIM](https://github.com/ILI4S) in Pull Request + [#1721](https://github.com/Alamofire/Alamofire/pull/1721). +- The AF4 Migration Guide to no longer use `DispatchQueue` internal APIs in the example. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1736](https://github.com/Alamofire/Alamofire/pull/1736). +- The `RequestAdapter` to call the `RequestRetrier` when an `Error` is thrown. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1682](https://github.com/Alamofire/Alamofire/pull/1682). +- The `SessionManager` to clean up the temporary multipart form data file after upload. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1742](https://github.com/Alamofire/Alamofire/issues/1742). +- The deployment targets to **iOS 8.0** and **macOS 10.10**. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1774](https://github.com/Alamofire/Alamofire/pull/1774). +- The Travis CI yaml file to support iOS 8 simulators. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1774](https://github.com/Alamofire/Alamofire/pull/1774). +- The iOS Example app deployment target to iOS 8.0. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1774](https://github.com/Alamofire/Alamofire/pull/1774). + +#### Removed + +- Duplicate auto-code signing on macOS. + - Removed by [Christian Noon](https://github.com/cnoon) +- Duplicate code signing identities on various targets. + - Removed by [Christian Noon](https://github.com/cnoon) + +#### Fixed + +- A compiler error in response validation sample code in the README. + - Fixed by [Vishrut Shah](https://github.com/vishrutshah) in Pull Request + [#1615](https://github.com/Alamofire/Alamofire/pull/1615). +- Several internal `SessionManager` links that were broken in the README. + - Fixed by [Vishrut Shah](https://github.com/vishrutshah) in Pull Request + [#1625](https://github.com/Alamofire/Alamofire/pull/1625). +- Issue in the sample code of the README where `response.error` was used incorrectly. + - Fixed by [Bob](https://github.com/bot2600) in Pull Request + [#1633](https://github.com/Alamofire/Alamofire/pull/1633). +- Issue in the `ServerTrustPolicy` tests where a `macOS 10.12` check was needed. + - Fixed by [Jon Shier](https://github.com/jshier). +- Compiler issue with `DownloadRequest` in AF4 Migration Guide. + - Fixed by [Wolfgang Lutz](https://github.com/Lutzifer) in Pull Request + [#1670](https://github.com/Alamofire/Alamofire/pull/1670). +- Test target compiler warning by not requiring app extension APIs only. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Typo in the HTTP Headers section of the README. + - Fixed by [Carlos McEvilly](https://github.com/carlosmcevilly) in Pull Request + [#1734](https://github.com/Alamofire/Alamofire/pull/1734). +- Incorrect response type in the response README examples. + - Fixed by [Julien Chaumond](https://github.com/julien-c) in Pull Request + [#1760](https://github.com/Alamofire/Alamofire/pull/1760). +- Xcode 8.1 compiler warnings and project suggestions. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#1735](https://github.com/Alamofire/Alamofire/pull/1735). +- Issue where download completion could crash on a `nil` response. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#1723](https://github.com/Alamofire/Alamofire/pull/1723). +- Issue in TLS tests where root certificate was missing from server trust. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [4.0.1](https://github.com/Alamofire/Alamofire/releases/tag/4.0.1) + +Released on 2016-09-24. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.0.1). + +#### Added + +- The `OS_ACTIVITY_MODE` environment variable to iOS, tvOS and iOS Example. + - Added by [Christian Noon](https://github.com/cnoon). +- Test verifying download request can be resumed with resume data. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- All instances of `com.alamofire` with `org.alamofire` throughout the project. + - Updated by [Christian Noon](https://github.com/cnoon). +- Project by adding `.swift-version` file and re-enabling `pod lib lint` in Travis file. + - Updated by [Thibault Vlacich](https://github.com/ThibaultVlacich) in Pull Request + [#1534](https://github.com/Alamofire/Alamofire/pull/1534). +- The entire project to use `macOS` in place of `OS X`. + - Updated by [Justin Jia](https://github.com/JustinJiaDev) in Pull Request + [#1520](https://github.com/Alamofire/Alamofire/pull/1520). +- Framework and test target override settings that duplicated the project settings. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue where the test suite was accidentally deleting contents of `~/Library/Application Support` + on macOS. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1512](https://github.com/Alamofire/Alamofire/issues/1512). +- Typo in the migration guide around availability checks. + - Fixed by [Alexsander Akers](https://github.com/a2) in Pull Request + [#1510](https://github.com/Alamofire/Alamofire/pull/1510). +- Typo in the README around response handlers. + - Fixed by [Glenn R. Fisher](https://github.com/glennrfisher) in Pull Request + [#1515](https://github.com/Alamofire/Alamofire/pull/1515). +- Issue in the download example in the README where a `to` parameter was missing. + - Fixed by [Julien Colin](https://github.com/Toldy) in Pull Request + [#1532](https://github.com/Alamofire/Alamofire/pull/1532). +- Issue in `AFError` where wrong case was used in several property implementations. + - Fixed by [Victor Chee](https://github.com/victorchee) in Pull Request + [#1558](https://github.com/Alamofire/Alamofire/pull/1558). +- Typo in AF 4 migration guide where "enhancements" was spelled incorrectly. + - Fixed by [YeralYamil](https://github.com/YeralYamil) in Pull Request + [#1590](https://github.com/Alamofire/Alamofire/pull/1590). +- Typo in code sample documentation where "already" was misspelled. + - Fixed by [Fuad Kamal](https://github.com/abunur) in Pull Request + [#1599](https://github.com/Alamofire/Alamofire/pull/1599). +- Typos in the Open Radars and Donations sections of README. + - Fixed by [Brian Lu](https://github.com/bakemecookies) in Pull Request + [#1606](https://github.com/Alamofire/Alamofire/pull/1606). +- Issue in `DispatchQueue` extension where `Foundation` needed to be imported for submodules. + - Fixed by [CodeEagle](https://github.com/CodeEagle) in Pull Request + [#1603](https://github.com/Alamofire/Alamofire/pull/1603). +- Memory leak in `Validation` closures where reference to `self` was causing retain cycle. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1551](https://github.com/Alamofire/Alamofire/issues/1551). +- Compilation issue in response handler section of the README. + - Fixed by [Vishrut Shah](https://github.com/vishrutshah) in Pull Request + [#1612](https://github.com/Alamofire/Alamofire/pull/1612). + +## [4.0.0](https://github.com/Alamofire/Alamofire/releases/tag/4.0.0) + +Released on 2016-09-11. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.0.0). + +#### Added + +- Internal `DispatchQueue` extension set of convenience properties and methods. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1450](https://github.com/Alamofire/Alamofire/pull/1450). +- `RequestAdapter` and `RequestRetrier` protocols allowing requests to be retried. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1450](https://github.com/Alamofire/Alamofire/pull/1450). +- `RequestAdapter` tests on all testable `SessionManager` request APIs. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1450](https://github.com/Alamofire/Alamofire/pull/1450). +- Added an `Adapting and Retrying Requests` section to the README. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1450](https://github.com/Alamofire/Alamofire/pull/1450). +- `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` subclasses. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- Top-level APIs for creating `StreamRequest` instances. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- Extra `responseToSelector` overrides for stream delegate APIs. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- A new `syncResult` extension to `DispatchQueue` to simplify thread-safe locking. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- Two serialization failure reasons to support download response serializers. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1457](https://github.com/Alamofire/Alamofire/pull/1457). +- Download response serialization tests for all serializer types. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1457](https://github.com/Alamofire/Alamofire/pull/1457). +- The `dataFileNil` and `dataFileReadFailed` cases to `ResponseValidationFailureReason`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1461](https://github.com/Alamofire/Alamofire/pull/1461). +- The `isWildcard` property to MIMEType struct for convenience. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1461](https://github.com/Alamofire/Alamofire/pull/1461). +- Missing `CustomDebugStringCovertible` conformance to `DownloadResponse`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- URL variants to the `FileManager` extension in the test suite. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- `DownloadOptions` option set to make moving files more robust. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- Tests validating success and failure scenarios for `DownloadOptions`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- Parameter encoding failure docstrings and refactored reasons to be consistent. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1465](https://github.com/Alamofire/Alamofire/pull/1465). +- Safeguards to url parameter encoding when extracting the url request’s url. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1465](https://github.com/Alamofire/Alamofire/pull/1465). +- The new `URLSessionTaskMetrics` to all `Response types`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1492](https://github.com/Alamofire/Alamofire/pull/1492). +- The Alamofire 4.0 Migration Guide to the README. + - Added by [Christian Noon](https://github.com/cnoon). +- `HTTPHeaders` typealias for top-level API convenience. + - Added by [Christian Noon](https://github.com/cnoon). +- Complete safeguards to `URLStringConvertible`, `URLRequestConvertible` and `RequestAdapter`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). +- Tests around invalidURL error cases for `Request` creation and adaptation. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). + +#### Updated + +- The `authorizationHeader` static method over to returning optional tuple. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- `SessionManager` queues to each have a unique name using a UUID suffix. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- The progress tracking system across all `Request` subclasses to improve accuracy. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1455](https://github.com/Alamofire/Alamofire/pull/1455). +- `BaseTestCase` to delete contents of common directories at the start of each test. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1457](https://github.com/Alamofire/Alamofire/pull/1457). +- Response handler extensions by moving them into `DataRequest` and added equivalents + for `DownloadRequest`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1457](https://github.com/Alamofire/Alamofire/pull/1457). +- The response serializer types to use the `Protocol` suffix. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1457](https://github.com/Alamofire/Alamofire/pull/1457). +- `Validation` typealias to include response data in a `DataRequest` type. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1461](https://github.com/Alamofire/Alamofire/pull/1461). +- `Validation` typealias to include temporary and destination URLs in a `DownloadRequest` type. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1461](https://github.com/Alamofire/Alamofire/pull/1461). +- `SessionManager` APIs to all leverage `TaskConvertible` conformance. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1461](https://github.com/Alamofire/Alamofire/pull/1461). +- `DownloadFileDestination` closures to be optional on top-level `DownloadRequest` APIs. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- The `request` and `download` APIs now default to `.get` method and `upload` defaults to `.post`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1462](https://github.com/Alamofire/Alamofire/pull/1462). +- The `ParameterEncoding` encode API to throw instead of returning tuple. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1465](https://github.com/Alamofire/Alamofire/pull/1465). +- The `TaskDelegate` to only store the url session task error if `error` is `nil`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1465](https://github.com/Alamofire/Alamofire/pull/1465). +- `ParameterEncoding` enum by switching to a protocol backed by url, json and plist structs. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1465](https://github.com/Alamofire/Alamofire/pull/1465). +- Updated RequestRetrier completion to be escaping. + - Updated by [Aron Cedercrantz](https://github.com/rastersize) in Pull Request + [#1489](https://github.com/Alamofire/Alamofire/pull/1489). +- Code signing to automatic with no team on framework, test and app targets. + - Updated by [Christian Noon](https://github.com/cnoon). +- README for Swift 3 and Alamofire 4 along with reorganization. + - Updated by [Christian Noon](https://github.com/cnoon). +- README with improved `Error` examples as well as typo and whitespace fixes. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1504](https://github.com/Alamofire/Alamofire/pull/1504). +- `Request` task property is now optional allowing errors to propagate through. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). +- The Travis-CI device list in the yaml file. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). +- The top-level APIs by removing external `resource` parameter name. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). +- The `URLStringCovertible` by renaming to `URLConvertible` and removed protocol property. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). +- The README and migration guide with the `URLConvertible` and top-level API changes. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1505](https://github.com/Alamofire/Alamofire/pull/1505). + +#### Removed + +- Unnecessary `public` ACL declarations on `AFError` extensions. + - Removed by [Christian Noon](https://github.com/cnoon). +- `URLStringConvertible` conformance on `URLRequest`. + - Removed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1491](https://github.com/Alamofire/Alamofire/pull/1491). +- Removed `downloadProgress` and `uploadProgress` Int64 variants. + - Removed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1467](https://github.com/Alamofire/Alamofire/issues/1467) reported by + [thebluepotato](https://github.com/thebluepotato). +- Duplicated change log message in the migration guide. + - Removed by [Justin Jia](https://github.com/JustinJiaDev) in Pull Request + [#1503](https://github.com/Alamofire/Alamofire/pull/1503). +- Code coverage generation by default to improve test suite stability. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Fixed `URLEncoding` issue around `NSNumber` parameter encoding. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1458](https://github.com/Alamofire/Alamofire/issues/1458) reported by + [Dhanush Balachandran](https://github.com/dhanushram). +- Issue where `MultipartFormData` temp directory creation needed to be done serially. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1333](https://github.com/Alamofire/Alamofire/issues/1333) reported by + [Fernando Mazzon](https://github.com/fer662). +- Issue in resume data tests where request was being cancelled multiple times. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [4.0.0-beta.2](https://github.com/Alamofire/Alamofire/releases/tag/4.0.0-beta.2) + +Released on 2016-08-29. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.0.0-beta.2). + +#### Fixed + +- Build issue with `Manager` class due to cherry picked change that merged incorrectly. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1438](https://github.com/Alamofire/Alamofire/pull/1438). + +## [4.0.0-beta.1](https://github.com/Alamofire/Alamofire/releases/tag/4.0.0-beta.1) + +Released on 2016-08-28. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A4.0.0-beta.1). + +#### Added + +- `discardableResult` annotations to all top-level Request APIs. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- All source, test and example logic as well as project settings to compile against + the Xcode 8 beta releases. + - Updated by [Kevin Harwood](https://github.com/kcharwood), + [Jon Shier](https://github.com/jshier) and + [Christian Noon](https://github.com/cnoon). +- Deployment targets to iOS 9.0, macOS 10.11, tvOS 9.0 and watchOS 2.0. + - Updated by [Christian Noon](https://github.com/cnoon). +- Notifications to use nested structs inside `Notification.Name` namespace. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `Manager` class to `SessionManager` to be more descriptive. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1385](https://github.com/Alamofire/Alamofire/pull/1385). +- The `SessionDelegate`, `TaskDelegate` and subclasses by pulling them into the global namespace. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1385](https://github.com/Alamofire/Alamofire/pull/1385). +- All the Core APIs and documentation to match Swift 3 API design guidelines. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1385](https://github.com/Alamofire/Alamofire/pull/1385). +- The `SessionDelegate` to store `Request` instances internally to prepare for retry logic. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1391](https://github.com/Alamofire/Alamofire/pull/1391). +- The podspec to 4.0.0-beta.1 and bumped the deployment targets. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1401](https://github.com/Alamofire/Alamofire/pull/1401). +- The parameter order of custom `URLRequest` initializer to match other APIs. + - Updated by [Christian Noon](https://github.com/cnoon). +- The travis yaml file for Xcode 8. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `Error` enum to `AFError` which now conforms to the new `Error` protocol. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1419](https://github.com/Alamofire/Alamofire/pull/1419). + +#### Fixed + +- Typo in a parameter name in the `MultipartFormData` Swift 3 API refactor. + - Fixed by [Joshua Hudson](https://github.com/jhudsonWA) in Pull Request + [#1395](https://github.com/Alamofire/Alamofire/pull/1395). + +#### Upgrade Notes + +This release requires Xcode 8.0 beta 6+ because it has been completely refactored to compile against Swift 3.0. Any older versions of Xcode will **NOT COMPILE**. + +This release is the start of the Alamofire 4.0.0 beta releases. We still have quite a few large changes we're trying to squeeze in before the Xcode 8 GM drops, so the APIs will continue to change over the next few weeks. Please keep in mind that each beta will likely bring new APIs and also refactor others. The betas **WILL NOT** follow semantic versioning. We'll most likely conform to semantic versioning once we start releasing the RCs unless we run into a major unforeseen issue. + +We'd really appreciate everyone trying out the betas and letting us know if you find issues. We want to address every possible issue prior to the official Alamofire 4.0.0 release. + +--- + +## [3.5.1](https://github.com/Alamofire/Alamofire/releases/tag/3.5.1) + +Released on 2016-10-01. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.5.1). + +#### Fixed + +- Assorted memory leaks caused by underlying Swift runtime bugs. + - Fixed by [Jon Shier](https://github.com/jshier) in regards to Issue + [#1626](https://github.com/Alamofire/Alamofire/issues/1626). +- Issue in the test suite logic on macOS 10.12. + - Fixed by [Jon Shier](https://github.com/jshier). + +## [3.5.0](https://github.com/Alamofire/Alamofire/releases/tag/3.5.0) + +Released on 2016-09-07. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.5.0). + +#### Updated + +- The `User-Agent` header generation formatting and also added docs and tests. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1456](https://github.com/Alamofire/Alamofire/pull/1456) in regards to Issue + [#1452](https://github.com/Alamofire/Alamofire/issues/1452). +- All source, test and example logic as well as project settings to compile against + Xcode 7 and 8 against Swift 2.2 or 2.3 respectively. + - Updated by [Kevin Harwood](https://github.com/kcharwood), + [Jon Shier](https://github.com/jshier) and + [Christian Noon](https://github.com/cnoon). +- The Travis CI yaml file to support both Xcode 7.3 and 8 simultaneously. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- A TLS evaluation test that could fail with a different error when behind a proxy. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [3.4.2](https://github.com/Alamofire/Alamofire/releases/tag/3.4.2) + +Released on 2016-08-28. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.4.2). + +#### Added + +- Added Cleanup Whitespace target to remove excess whitespace from Swift files. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- All TLS evaluation tests from `disig.sk` to `badssl.com` to be more reliant and robust. + - Updated by [Christian Noon](https://github.com/cnoon). +- Internal `URLRequest` method to maintain mutable variant data on an `NSURLRequest` passed + into the top-level APIs. + - Updated by [Greedwolf DSS](https://github.com/passchaos) in Pull Request + [#1330](https://github.com/Alamofire/Alamofire/pull/1330). +- The `User-Agent` header to include version and build numbers. + - Updated by [Sergey Demchenko](https://github.com/antrix1989) in Pull Request + [#1420](https://github.com/Alamofire/Alamofire/pull/1420). + +#### Removed + +- All excess whitespace from Swift files using the `Cleanup Whitespace` target. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- `Request` debug description tests to no longer require parameters in a specific order. + - Fixed by [Marius Serban](https://github.com/marius-serban) in Pull Request + [#1318](https://github.com/Alamofire/Alamofire/pull/1318). +- Small ACL issue in code sample of the Handling Errors section of the README. + - Fixed by [Adrian Brink](https://github.com/adrianbrink) in Pull Request + [#1315](https://github.com/Alamofire/Alamofire/pull/1315). + +## [3.4.1](https://github.com/Alamofire/Alamofire/releases/tag/3.4.1) + +Released on 2016-06-12. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.4.1). + +#### Added + +- Rdar `26761490` to the list of rdars affecting Alamofire. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1262](https://github.com/Alamofire/Alamofire/pull/1262). +- A new `debugDescription` test for a MultipartFormData Request with duplicate headers. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1303](https://github.com/Alamofire/Alamofire/issues/1303). + +#### Updated + +- CocoaPod installation instructions in README to be compatible with 1.x. + - Updated by [Luis Ferro](https://github.com/lferro9000) in Pull Request + [#1288](https://github.com/Alamofire/Alamofire/pull/1288). +- The README to reflect the best error practices in response serializers. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1273](https://github.com/Alamofire/Alamofire/pull/1273). +- The generation of the `User-Agent` header to use non-localized sources. + - Updated by [Jon Shier](https://github.com/jshier) in Pull Request + [#1292](https://github.com/Alamofire/Alamofire/pull/1292) in regards to Issue + [#1269](https://github.com/Alamofire/Alamofire/pull/1269). +- The `Generic Response Object Serialization` section of the README to use protocol extension. + - Updated by [Raphael Oliveira](https://github.com/raphaeloliveira) in Pull Request + [#1257](https://github.com/Alamofire/Alamofire/pull/1257). +- Reachability by removing explicit IPv6 logic since OS handles this automatically. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1308](https://github.com/Alamofire/Alamofire/pull/1308) in regards to Issue + [#1228](https://github.com/Alamofire/Alamofire/pull/1228). +- Host manager reachability test to use different hostname to improve test reliability. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1308](https://github.com/Alamofire/Alamofire/pull/1308). + +#### Removed + +- `ReleaseTest` configuration and updated Travis-CI yaml file to enable testability directly. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Memory leak in `Timeline` description and debugDescription due to string interpolation. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1262](https://github.com/Alamofire/Alamofire/issues/1262) in regards to Issue + [#1232](https://github.com/Alamofire/Alamofire/issues/1232). + +## [3.4.0](https://github.com/Alamofire/Alamofire/releases/tag/3.4.0) + +Released on 2016-05-08. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.4.0). + +#### Added + +- Status code and content type values into validation `NSError` userInfo dictionaries. + - Added by [Cédric Luthi](https://github.com/0xced) in Pull Request + [#1166](https://github.com/Alamofire/Alamofire/pull/1166). +- New `authorizationHeader` API to generate base64 encoded authorization header. + - Added by [Cédric Luthi](https://github.com/0xced) in Pull Request + [#1187](https://github.com/Alamofire/Alamofire/pull/1187). + +#### Updated + +- URLProtocol tests to demonstrate using `NSURLProtocol` with `NSURLSession`. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1160](https://github.com/Alamofire/Alamofire/issues/1160). +- The `SesionDelegate` to no longer be `final` to allow subclassing. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1172](https://github.com/Alamofire/Alamofire/issues/1172) in regards to Issue + [#1145](https://github.com/Alamofire/Alamofire/issues/1145). +- The `SessionDelegate` subscript public to allow full control when subclassing. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1172](https://github.com/Alamofire/Alamofire/issues/1172). +- The `Response Serialization` section of the README to include validation examples. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1213](https://github.com/Alamofire/Alamofire/issues/1213). +- The delegate guard in the `Manager` initializer in front of property assignment. + - Updated by [Broccoliii](https://github.com/broccolii) in Pull Request + [#1226](https://github.com/Alamofire/Alamofire/issues/1226). +- Header example in the README to use `Accept` header instead of `Content-Type`. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Pull Request + [#1229](https://github.com/Alamofire/Alamofire/issues/1229). + +#### Deprecated + +- The `errorWithCode` APIs and updated NSURLError\* domains to `NSURLErrorDomain`. + - Deprecated by [Cédric Luthi](https://github.com/0xced) in Pull Request + [#1166](https://github.com/Alamofire/Alamofire/pull/1166). + +#### Fixed + +- Issue where Requests with invalid credentials were not terminating with 401 status code. + - Fixed by [Cédric Luthi](https://github.com/0xced) in Pull Request + [#1164](https://github.com/Alamofire/Alamofire/pull/1164) in regards to Issue + [#1159](https://github.com/Alamofire/Alamofire/issues/1159). +- Issue in URLProtocol test where config headers are not passed prior to iOS 9.0. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Issue where Request `cURLRepresentation` method was not coalescing duplicate headers. + - Fixed by [Chris Richards](https://github.com/chrisrichards) in Pull Request + [#1186](https://github.com/Alamofire/Alamofire/pull/1186) in regards to Issue + [#1184](https://github.com/Alamofire/Alamofire/issues/1184). +- Issue where incorrect dash in License file was breaking markdown parsing. + - Fixed by [Gemma Barlow](https://github.com/gemmakbarlow) in Pull Request + [#1218](https://github.com/Alamofire/Alamofire/issues/1218). +- Issue where internal quotes were not escaped correctly in cURL output. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [3.3.1](https://github.com/Alamofire/Alamofire/releases/tag/3.3.1) + +Released on 2016-04-06. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.3.1). + +#### Added + +- Tests for the `SessionDelegate` redirect with completion override closure. + - Added by [Kevin Harwood](https://github.com/kcharwood) in Pull Request + [#1141](https://github.com/Alamofire/Alamofire/issues/1141). +- Tests for all the `SessionDelegate` override closures. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- The authentication test cases to clear out all cookies to help stabilize Travis-CI. + - Updated by [Christian Noon](https://github.com/cnoon). +- The cache test check for no store header to use availability checks. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- The `respondsToSelector` check for the new HTTP redirect closure with completion. + - Fixed by [Kevin Harwood](https://github.com/kcharwood) in Pull Request + [#1141](https://github.com/Alamofire/Alamofire/issues/1141) in regards to Issue + [#1140](https://github.com/Alamofire/Alamofire/issues/1140). +- Issue where the challenge and response `SessionDelegate` override closures were not called. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Typo in the Travis YAML file that was causing all tests to always fail on iOS 9.1. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Race condition in the cache tests that was causing random failures on Travis-CI. + - Fixed by [Christian Noon](https://github.com/cnoon). + +## [3.3.0](https://github.com/Alamofire/Alamofire/releases/tag/3.3.0) + +Released on 2016-03-23. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.3.0). + +#### Added + +- Added override closures for all `SessionDelegate` APIs with completion handlers. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1099](https://github.com/Alamofire/Alamofire/pull/1099). + +#### Updated + +- The `User-Agent` header implementation to use more aggressive type-safety checks. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1100](https://github.com/Alamofire/Alamofire/issues/1100). +- All shared response serializers to accept a custom queue for execution. + - Updated by [Luca Torella](https://github.com/lucatorella) in Pull Request + [#1112](https://github.com/Alamofire/Alamofire/pull/1112). +- The network reachability manager to use IPv4 on iOS 8.x and OSX 10.9.x. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#1086](https://github.com/Alamofire/Alamofire/issues/1086). +- All source, test and example code to compile against Swift 2.2. + - Updated by [James Barrow](https://github.com/Baza207) and [Dominik Hadl](https://github.com/nickskull) in Pull Requests + [#1030](https://github.com/Alamofire/Alamofire/pull/1030) and + [#1128](https://github.com/Alamofire/Alamofire/pull/1128). +- The Travis CI YAML file to use Xcode 7.3 and also updated matrix targets. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue in JSON response serialization test case where the wrong serializer was being tested. + - Fixed by [Gregory J.H. Rho](https://github.com/topchul) in Pull Request + [#1108](https://github.com/Alamofire/Alamofire/pull/1108). +- Issue where multipart form data encoding was unnecessarily scheduling input and output + streams with the current runloop. + - Fixed by [Brian King](https://github.com/KingOfBrian) in Pull Request + [#1121](https://github.com/Alamofire/Alamofire/pull/1121). + +#### Upgrade Notes + +This release requires Xcode 7.3+ otherwise the Swift 2.2 changes will **NOT COMPILE**. There are several reasons why this was deployed as a MINOR and not MAJOR release. First off, the public API changes of this release are fully backwards compatible. There are no breaking API changes in the public APIs. Strictly following semver dictates that this is a MINOR, not MAJOR release. + +> See [semver](https://semver.org/#semantic-versioning-specification-semver) for more info. + +We also realize that this can be frustrating for those out there not ready to upgrade to Xcode 7.3. Please know that we consider each release version carefully before deploying. Our decision to bump the MINOR version was not only due to strictly following semver, but also because it's difficult and undesirable for all OSS libraries to bump MAJOR versions each time the Swift APIs are incremented. Alamofire would have had to go through 6 additional MAJOR versions if this was the policy. That would mean we'd already be running on Alamofire 10.x. Incrementing MAJOR versions this quickly is disruptive to the community and would cause even more confusion. Instead, we try to carefully plan our MAJOR version releases and accompany them with detailed Migration Guides to help make the transition as smooth as possible. + +If anyone has additional questions, please feel free to open an issue and we'll be more than happy to discuss further. + +--- + +## [3.2.1](https://github.com/Alamofire/Alamofire/releases/tag/3.2.1) + +Released on 2016-02-27. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.2.1). + +#### Updated + +- `StringResponseSerializer` implementation to build with the latest Swift toolchain. + - Updated by [Chris Cieslak](https://github.com/vivid-cieslak) in Pull Request + [#1050](https://github.com/Alamofire/Alamofire/pull/1050). +- Expanded the Component Libraries section and moved it up in the README. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue where JSON and plist custom content types were not retained during parameter encoding. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1088](https://github.com/Alamofire/Alamofire/pull/1088). + +## [3.2.0](https://github.com/Alamofire/Alamofire/releases/tag/3.2.0) + +Released on 2016-02-07. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.2.0). + +#### Added + +- Notifications that post when an `NSURLSessionTask` changes state to allow support for the + network activity indicator. + - Added by [Christian Noon](https://github.com/cnoon). +- `Timeline` struct to capture timings throughout the lifecycle of a `Request`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1054](https://github.com/Alamofire/Alamofire/issues/1054). +- A new `Timeline` section to the README. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1054](https://github.com/Alamofire/Alamofire/issues/1054). +- `NetworkReachabilityManager` to listen for reachability status changes. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1053](https://github.com/Alamofire/Alamofire/issues/1053). +- Unit tests for all the testable network reachability manager APIs. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1053](https://github.com/Alamofire/Alamofire/issues/1053). +- A new `Network Reachability` section to the README. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#1053](https://github.com/Alamofire/Alamofire/issues/1053). + +#### Updated + +- The `NSURLSessionStream` APIs to support `tvOS`. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `ParameterEncoding` encode method to allow empty parameters to still be encoded. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issues + [#1032](https://github.com/Alamofire/Alamofire/issues/1032) and + [#1049](https://github.com/Alamofire/Alamofire/issues/1049). + +#### Fixed + +- Broken CocoaDocs generation by moving iOS Example project into Examples folder. + - Fixed by [Jon Shier](https://github.com/jshier) in Pull Request + [#1027](https://github.com/Alamofire/Alamofire/issues/1027) in regards to Issue + [#1025](https://github.com/Alamofire/Alamofire/issues/1025). + +--- + +## [3.1.5](https://github.com/Alamofire/Alamofire/releases/tag/3.1.5) + +Released on 2016-01-17. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.5). + +#### Added + +- `Package.swift` to the project to support Swift Package Manager (SPM). + - Added by [Kyle Fuller](https://github.com/kylef) in Pull Request + [#979](https://github.com/Alamofire/Alamofire/pull/979). +- Safeguards to the `Request` class's `debugDescription` property. + - Added by [tokorom](https://github.com/tokorom) in Pull Request + [#983](https://github.com/Alamofire/Alamofire/pull/983). + +#### Updated + +- `Accept-Language` header generation to use functional style. + - Updated by [Dapeng Gao](https://github.com/dapenggao) in Pull Request + [#982](https://github.com/Alamofire/Alamofire/pull/982). +- `Accept-Encoding` and `Accept-Language` header values to have separator spaces between values. + - Updated by [Christian Noon](https://github.com/cnoon). +- Copyright headers to include 2016! 🎉🎉🎉 + - Updated by [Christian Noon](https://github.com/cnoon). + +## [3.1.4](https://github.com/Alamofire/Alamofire/releases/tag/3.1.4) + +Released on 2015-12-16. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.4). + +#### Added + +- `NSTemporaryExceptionMinimumTLSVersion` documentation to the ATS section in the README. + - Added by [Marandon Antoine](https://github.com/ntnmrndn) in Pull Request + [#952](https://github.com/Alamofire/Alamofire/pull/952). +- Added `ReleaseTest` configuration to allow running tests against optimized build. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- Carthage instructions in the README to clearly callout the `carthage update` command. + - Updated by [vlad](https://github.com/vlastachu) in Pull Request + [#955](https://github.com/Alamofire/Alamofire/pull/955). +- `ParameterEncoding` to early out when passed an empty parameters dictionary. + - Updated by [Anthony Miller](https://github.com/AnthonyMDev) in Pull Request + [#954](https://github.com/Alamofire/Alamofire/pull/954). +- The `certificatesInBundle` to support `cer`, `crt` and `der` extensions. + - Updated by [Jacob Jennings](https://github.com/jacobjennings) in Pull Request + [#956](https://github.com/Alamofire/Alamofire/pull/956). +- The `ENABLE_TESTABILITY` flag to `NO` for Release configuration and disabled tests for + non-test builds to better support Carthage. + - Updated by [Jed Lewison](https://github.com/jedlewison) in Pull Request + [#953](https://github.com/Alamofire/Alamofire/pull/953). +- The server certificates for the TLS tests and added all certificates to all test targets. + - Updated by [Christian Noon](https://github.com/cnoon). +- The Travis-CI configuration to Xcode 7.2, iOS 9.2, tvOS 9.1 and watchOS 2.1. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Removed + +- `SecCertificate` array Swift workaround in `ServerTrustPolicy` for Xcode 7.2. + - Removed by [Christian Noon](https://github.com/cnoon). + +## [3.1.3](https://github.com/Alamofire/Alamofire/releases/tag/3.1.3) + +Released on 2015-11-22. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.3). + +#### Added + +- Custom `Info.plist` for tvOS setting the `UIRequiredDeviceCapabilities` to `arm64`. + - Added by [Simon Støvring](https://github.com/simonbs) in Pull Request + [#913](https://github.com/Alamofire/Alamofire/pull/913). + +#### Updated + +- All code samples in the README to use `https` instead of `http`. + - Updated by [Tomonobu Sato](https://github.com/tmnb) in Pull Request + [#912](https://github.com/Alamofire/Alamofire/pull/912). + +## [3.1.2](https://github.com/Alamofire/Alamofire/releases/tag/3.1.2) + +Released on 2015-11-06. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.2). + +#### Updated + +- Code signing on iOS simulator builds to not sign simulator builds. + - Updated by [John Heaton](https://github.com/JRHeaton) in Pull Request + [#903](https://github.com/Alamofire/Alamofire/pull/903). +- Code signing on watchOS and tvOS simulators builds to not sign simulator builds. + - Updated by [Christian Noon](https://github.com/cnoon). + +## [3.1.1](https://github.com/Alamofire/Alamofire/releases/tag/3.1.1) + +Released on 2015-10-31. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.1). + +#### Added + +- Support for 204 response status codes in the response serializers. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#889](https://github.com/Alamofire/Alamofire/pull/889). +- ATS section to the README explaining how to configure the settings. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#876](https://github.com/Alamofire/Alamofire/issues/876). + +#### Updated + +- Several unnecessary uses of `NSString` with `String`. + - Updated by [Nicholas Maccharoli](https://github.com/Nirma) in Pull Request + [#885](https://github.com/Alamofire/Alamofire/pull/885). +- Content type validation to always succeeds when server data is `nil` or zero length. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#890](https://github.com/Alamofire/Alamofire/pull/890). + +#### Removed + +- The mention of rdar://22307360 from the README since Xcode 7.1 has been released. + - Removed by [Elvis Nuñez](https://github.com/3lvis) in Pull Request + [#891](https://github.com/Alamofire/Alamofire/pull/891). +- An unnecessary availability check now that Xcode 7.1 is out of beta. + - Removed by [Christian Noon](https://github.com/cnoon). +- The playground from the project due to instability reasons. + - Removed by [Christian Noon](https://github.com/cnoon). +- The data length checks in the `responseData` and `responseString` serializers. + - Removed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#889](https://github.com/Alamofire/Alamofire/pull/889). + +## [3.1.0](https://github.com/Alamofire/Alamofire/releases/tag/3.1.0) + +Released on 2015-10-22. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.1.0). + +#### Added + +- New tvOS framework and test targets to the project. + - Added by [Bob Scarano](https://github.com/bscarano) in Pull Request + [#767](https://github.com/Alamofire/Alamofire/pull/767). +- The tvOS deployment target to the podspec. + - Added by [Christian Noon](https://github.com/cnoon). +- The `BITCODE_GENERATION_MODE` user defined setting to tvOS framework target. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- The README to include tvOS and bumped the required version of Xcode. + - Updated by [Christian Noon](https://github.com/cnoon). +- The default tvOS and watchOS deployment targets in the Xcode project. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `APPLICATION_EXTENSION_API_ONLY` enabled flag to `YES` in the tvOS framework target. + - Updated by [James Barrow](https://github.com/Baza207) in Pull Request + [#771](https://github.com/Alamofire/Alamofire/pull/771). +- The Travis-CI yaml file to run watchOS and tvOS builds and tests on xcode7.1 osx_image. + - Updated by [Christian Noon](https://github.com/cnoon). + +--- + +## [3.0.1](https://github.com/Alamofire/Alamofire/releases/tag/3.0.1) + +Released on 2015-10-19. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.0.1). + +#### Added + +- Tests around content type validation with accept parameters. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Content type validation issue where parameter parsing on `;` was incorrect. + - Fixed by [Christian Noon](https://github.com/cnoon). + +## [3.0.0](https://github.com/Alamofire/Alamofire/releases/tag/3.0.0) + +Released on 2015-10-10. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.0.0). + +#### Updated + +- `Downloading a File` code sample in the README to compile against Swift 2.0. + - Updated by [Screon](https://github.com/Screon) in Pull Request + [#827](https://github.com/Alamofire/Alamofire/pull/827). +- Download code samples in the README to use `response` serializer. + - Updated by [Christian Noon](https://github.com/cnoon). +- CocoaPods and Carthage installation instructions for 3.0. + - Updated by [Christian Noon](https://github.com/cnoon). +- Carthage description and installation instructions in the README. + - Updated by [Ashton Williams](https://github.com/Ashton-W) in Pull Request + [#843](https://github.com/Alamofire/Alamofire/pull/843). +- URL encoding internals to leverage the dictionary keys lazy evaluation. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Small typo in the Alamofire 3.0 Migration Guide `Response` section. + - Fixed by [neugartf](https://github.com/neugartf) in Pull Request + [#826](https://github.com/Alamofire/Alamofire/pull/826). +- User defined `BITCODE_GENERATION_MODE` setting for Carthage builds. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#835](https://github.com/Alamofire/Alamofire/issues/835). + +--- + +## [3.0.0-beta.3](https://github.com/Alamofire/Alamofire/releases/tag/3.0.0-beta.3) + +Released on 2015-09-27. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.0.0-beta.3). + +#### Updated + +- The `Response` initializer to have a `public` ACL instead of `internal`. + - Updated by [Christian Noon](https://github.com/cnoon). + +## [3.0.0-beta.2](https://github.com/Alamofire/Alamofire/releases/tag/3.0.0-beta.2) + +Released on 2015-09-26. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.0.0-beta.2). + +#### Added + +- Tests around the header behavior for redirected requests. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#798](https://github.com/Alamofire/Alamofire/issues/798). +- A migration guide for Alamofire 3.0 documenting all API changes. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- `Response` initializer to have `internal` ACL. + - Updated by [Christian Noon](https://github.com/cnoon). +- All sample code in the README to conform to the Alamofire 3.0 APIs. + - Updated by [Christian Noon](https://github.com/cnoon). +- URL percent escaping to only batch on OS's where required improving + overall performance. + - Updated by [Christian Noon](https://github.com/cnoon). +- Basic auth example in the README to compile on Swift 2.0. + - Updated by [David F. Muir V](https://github.com/dfmuir) in Pull Request + [#810](https://github.com/Alamofire/Alamofire/issues/810). + +#### Fixed + +- Compiler errors in the playground due to the new response serializer APIs. + - Fixed by [Christian Noon](https://github.com/cnoon). + +## [3.0.0-beta.1](https://github.com/Alamofire/Alamofire/releases/tag/3.0.0-beta.1) + +Released on 2015-09-21. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A3.0.0-beta.1). + +#### Added + +- A new `Response` struct to simplify response serialization. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#792](https://github.com/Alamofire/Alamofire/pull/792). +- A new initializer to the `Manager` allowing dependency injection of the + underlying `NSURLSession`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#795](https://github.com/Alamofire/Alamofire/pull/795). +- Tests around the new `Manager` initialization methods. + +#### Updated + +- Result type to take two generic parameters (`Value` and `Error`) where `Error` + conforms to `ErrorType`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#791](https://github.com/Alamofire/Alamofire/pull/791). +- All response serializers to now return the original server data as `NSData?`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#791](https://github.com/Alamofire/Alamofire/pull/791). +- The `TaskDelegate` to store an error as an `NSError` instead of `ErrorType`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#791](https://github.com/Alamofire/Alamofire/pull/791). +- The `ValidationResult` failure case to require an `NSError` instead of `ErrorType`. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#791](https://github.com/Alamofire/Alamofire/pull/791). +- All tests around response serialization and `Result` type usage. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#791](https://github.com/Alamofire/Alamofire/pull/791). +- All response serializers to use the new `Response` type. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request - + [#792](https://github.com/Alamofire/Alamofire/pull/792). +- The designated initializer for a `Manager` to accept a `SessionDelegate` parameter + allowing dependency injection for better background session support. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#795](https://github.com/Alamofire/Alamofire/pull/795). + +--- + +## [2.0.2](https://github.com/Alamofire/Alamofire/releases/tag/2.0.2) + +Released on 2015-09-20. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.2). + +#### Updated + +- The Embedded Framework documentation to include `git init` info. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#782](https://github.com/Alamofire/Alamofire/issues/782). + +#### Fixed + +- Alamofire iOS framework target by adding Alamofire iOS Tests as Target Dependency. + - Fixed by [Nicky Gerritsen](https://github.com/nickygerritsen) in Pull Request + [#780](https://github.com/Alamofire/Alamofire/pull/780). +- Percent encoding issue for long Chinese strings using URL parameter encoding. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#206](https://github.com/Alamofire/Alamofire/issues/206). + +## [2.0.1](https://github.com/Alamofire/Alamofire/releases/tag/2.0.1) + +Released on 2015-09-16. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.1). + +#### Updated + +- The CocoaPods installation instructions in the README. + - Updated by [Christian Noon](https://github.com/cnoon). +- The Carthage installation instructions in the README. + - Updated by [Gustavo Barbosa](https://github.com/barbosa) in Pull Request + [#759](https://github.com/Alamofire/Alamofire/pull/759). + +#### Fixed + +- The link to the 2.0 migration guide in the README. + - Fixed by [Dwight Watson](https://github.com/dwightwatson) in Pull Request + [#750](https://github.com/Alamofire/Alamofire/pull/750). +- Issue where NTLM authentication credentials were not used for authentication challenges. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#721](https://github.com/Alamofire/Alamofire/pull/721). + +## [2.0.0](https://github.com/Alamofire/Alamofire/releases/tag/2.0.0) + +Released on 2015-09-09. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.0). + +#### Added + +- A new `URLEncodedInURL` case to the `ParameterEncoding` for encoding in the URL. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#742](https://github.com/Alamofire/Alamofire/pull/742). + +--- + +## [2.0.0-beta.4](https://github.com/Alamofire/Alamofire/releases/tag/2.0.0-beta.4) + +Released on 2015-09-06. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.0-beta.4). + +#### Added + +- The `parameters` and `encoding` parameters to download APIs. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#719](https://github.com/Alamofire/Alamofire/issues/719). +- Section to the README about wildcard domain matching with server trust policies. + - Added by [Sai](https://github.com/sai-prasanna) in Pull Request + [#718](https://github.com/Alamofire/Alamofire/pull/718). +- A UTF-8 charset to Content-Type header for a URL encoded body. + - Added by [Cheolhee Han](https://github.com/cheolhee) in Pull Request + [#731](https://github.com/Alamofire/Alamofire/pull/731). +- Tests around posting unicode parameters with URL encoding. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Pull Request + [#731](https://github.com/Alamofire/Alamofire/pull/731). +- Tests for uploading base 64 encoded image data inside JSON. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#738](https://github.com/Alamofire/Alamofire/issues/738). +- An Alamofire 2.0 migration guide document to the new Documentation folder. + - Added by [Christian Noon](https://github.com/cnoon). +- A Migration Guides section to the README with link to 2.0 guide. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- Response serialization to prevent unnecessary call to response serializer. + - Updated by [Julien Ducret](https://github.com/brocoo) in Pull Request + [#716](https://github.com/Alamofire/Alamofire/pull/716). +- Travis-CI yaml file to support iOS 9, OSX 10.11 and Xcode 7. + - Updated by [Christian Noon](https://github.com/cnoon). +- Result types to store an `ErrorType` instead of `NSError`. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#732](https://github.com/Alamofire/Alamofire/issues/732). +- Docstrings on the download method to be more accurate. + - Updated by [Christian Noon](https://github.com/cnoon). +- The README to require Xcode 7 beta 6. + - Updated by [Christian Noon](https://github.com/cnoon). +- The background session section of the README to use non-deprecated API. + - Updated by [David F. Muir V](https://github.com/dfmuir) in Pull Request + [#724](https://github.com/Alamofire/Alamofire/pull/724). +- The playground to use the `Result` type. + - Updated by [Jonas Schmid](https://github.com/jschmid) in Pull Request + [#726](https://github.com/Alamofire/Alamofire/pull/726). +- Updated progress code samples in the README to show how to call onto the main queue. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Removed + +- The AFNetworking sections from the FAQ in the README. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue on Windows where the wildcarded cert name in the test suite included asterisk. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#723](https://github.com/Alamofire/Alamofire/issues/723). +- Crash when multipart form data was uploaded from in-memory data on background session. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#740](https://github.com/Alamofire/Alamofire/issues/740). +- Issue where the background session completion handler was not called on the main queue. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#728](https://github.com/Alamofire/Alamofire/issues/728). + +## [2.0.0-beta.3](https://github.com/Alamofire/Alamofire/releases/tag/2.0.0-beta.3) + +Released on 2015-08-25. + +#### Removed + +- The override for `NSMutableURLRequest` for the `URLRequestConvertible` protocol + conformance that could cause unwanted URL request referencing. + - Removed by [Christian Noon](https://github.com/cnoon). + +## [2.0.0-beta.2](https://github.com/Alamofire/Alamofire/releases/tag/2.0.0-beta.2) + +Released on 2015-08-24. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.0-beta.2). + +#### Added + +- Host and certificate chain validation section to the README. + - Added by [Christian Noon](https://github.com/cnoon). +- Tests verifying configuration headers are sent with all configuration types. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#692](https://github.com/Alamofire/Alamofire/issues/692). +- New rdar to the list in the README about the #available check issue. + - Added by [Christian Noon](https://github.com/cnoon). +- Override for `NSMutableURLRequest` for the `URLRequestConvertible` protocol. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- The README to note that CocoaPods 0.38.2 is required. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#682](https://github.com/Alamofire/Alamofire/issues/682). +- The README to include note about keeping a reference to the `Manager`. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#681](https://github.com/Alamofire/Alamofire/issues/681). +- Server trust host validation over to use SSL policy evaluation. + - Updated by [Christian Noon](https://github.com/cnoon). +- The documentation for the `URLRequestConvertible` section in the README. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `ServerTrustPolicyManager` to be more flexible by using `public` ACL. + - Updated by [Jan Riehn](https://github.com/jriehn) in Pull Request + [#696](https://github.com/Alamofire/Alamofire/pull/696). +- The `ServerTrustPolicyManager` policies property to use `public` ACL and + added docstrings. + - Updated by [Christian Noon](https://github.com/cnoon). +- The Ono response serializer example for Swift 2.0 in the README. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#700](https://github.com/Alamofire/Alamofire/issues/700). +- `Result` failure case to store an `ErrorType` instead of `NSError`. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#703](https://github.com/Alamofire/Alamofire/issues/703). +- All source code to compile with Xcode 7 beta 6. + - Updated by [Michael Gray](https://github.com/mishagray) in Pull Request + [#707](https://github.com/Alamofire/Alamofire/pull/707). + +#### Removed + +- The `required` declaration on the `Manager` init method. + - Removed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#672](https://github.com/Alamofire/Alamofire/issues/672). + +#### Fixed + +- Issue where the `TaskDelegate` operation queue would leak if the task was + never started. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Compiler issue on OS X target when creating background configurations + in the test suite. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#693](https://github.com/Alamofire/Alamofire/issues/693). + +## [2.0.0-beta.1](https://github.com/Alamofire/Alamofire/releases/tag/2.0.0-beta.1) + +Released on 2015-08-10. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A2.0.0-beta.1). + +#### Added + +- A `watchOS` deployment target to the podspec. + - Added by [Kyle Fuller](https://github.com/kylef) in Pull Request + [#574](https://github.com/Alamofire/Alamofire/pull/574). +- Full screen support in the iOS Example App. + - Added by [Corinne Krych](https://github.com/corinnekrych) in Pull Request + [#612](https://github.com/Alamofire/Alamofire/pull/612). +- Temporary workaround for `SecCertificate` array compiler crash. + - Added by [Robert Rasmussen](https://github.com/robrasmussen) in Issue + [#610](https://github.com/Alamofire/Alamofire/issues/610). +- `Result` and `Error` types to refactor response validation and serialization. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#627](https://github.com/Alamofire/Alamofire/pull/627). +- Tests around response data, string and json serialization result behavior. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#627](https://github.com/Alamofire/Alamofire/pull/627). +- `CustomStringConvertible` and `CustomDebugStringConvertible` conformance + to the `Result` enumeration. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#648](https://github.com/Alamofire/Alamofire/pull/648). +- A Resume Data section to the README inside the Downloads section. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#648](https://github.com/Alamofire/Alamofire/pull/648). +- A `watchOS` framework target to the project. + - Added by [Tobias Ottenweller](https://github.com/tomco) in Pull Request + [#616](https://github.com/Alamofire/Alamofire/pull/616). +- `Result` tests pushing code coverage for `Result` enum to 100%. + - Added by [Christian Noon](https://github.com/cnoon). +- Tests around all response serializer usage. + - Added by [Christian Noon](https://github.com/cnoon). +- Public docstrings for all public `SessionDelegate` methods. + - Added by [Christian Noon](https://github.com/cnoon). +- A section to the README that calls out all open rdars affecting Alamofire. + - Added by [Christian Noon](https://github.com/cnoon). +- Test for wildcard validation that contains response with nil MIME type. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#662](https://github.com/Alamofire/Alamofire/pull/662). +- Support for stream tasks in iOS 9+ and OSX 10.11+. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#659](https://github.com/Alamofire/Alamofire/pull/659). + +#### Updated + +- All logic to compile against Swift 2.0. + - Updated by [Christian Noon](https://github.com/cnoon). +- All logic to use the latest Swift 2.0 conventions. + - Updated by [Christian Noon](https://github.com/cnoon). +- All public docstrings to the latest Swift 2.0 syntax. + - Updated by [Christian Noon](https://github.com/cnoon). +- `URLRequestConvertible` to return an `NSMutableURLRequest`. + - Updated by [Christian Noon](https://github.com/cnoon). +- All HTTP requests to HTTPS to better align with ATS. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `escape` method in `ParameterEncoding` to use non-deprecated methods. + - Updated by [Christian Noon](https://github.com/cnoon). +- All source code and docstrings to fit roughly within 120 characters. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `MultipartFormData` encoding to leverage Swift 2.0 error handling. + - Updated by [Christian Noon](https://github.com/cnoon). +- All README code samples to match the latest Swift 2.0 API changes. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#648](https://github.com/Alamofire/Alamofire/pull/648). +- All frameworks to enable code coverage generation. + - Updated by [Christian Noon](https://github.com/cnoon). +- All frameworks to set the enable testability flag to YES for release builds. + - Updated by [Christian Noon](https://github.com/cnoon) in regard to Issue + [#652](https://github.com/Alamofire/Alamofire/issues/652). +- `ParameterEncoding` to leverage guard for parameters to increase safety. + - Updated by [Christian Noon](https://github.com/cnoon). +- iOS Example App to use optional bind around response to safely extract headers. + - Updated by [John Pope](https://github.com/johndpope) in Pull Request + [#665](https://github.com/Alamofire/Alamofire/pull/665). +- The `queryComponents` and `escape` methods in `ParameterEncoding` to `public` to + better support `.Custom` encoding. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#660](https://github.com/Alamofire/Alamofire/pull/660). +- The static error convenience functions to a public ACL. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#668](https://github.com/Alamofire/Alamofire/issues/668). + +#### Removed + +- Explicit string values in `ParameterEncoding` since they are now implied. + - Removed by [Christian Noon](https://github.com/cnoon). +- An OSX cookie check in the `CustomDebugStringConvertible` conformance of a `Request`. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Issue in automatic validation tests where mutable URL request was not used. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Potential crash cases in Validation MIME type logic exposed by chaining. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Compiler issue in the iOS Example App around `Result` type usage. + - Fixed by [Jan Kase](https://github.com/jankase) in Pull Request + [#639](https://github.com/Alamofire/Alamofire/pull/639). +- The error code in the custom response serializers section of the README. + - Fixed by [Christian Noon](https://github.com/cnoon). + +--- + +## [1.3.1](https://github.com/Alamofire/Alamofire/releases/tag/1.3.1) + +Released on 2015-08-10. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A1.3.1). + +#### Fixed + +- Issue where a completed task was not released by the `SessionDelegate` if the + task override closure was set. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#622](https://github.com/Alamofire/Alamofire/issues/622). + +## [1.3.0](https://github.com/Alamofire/Alamofire/releases/tag/1.3.0) + +Released on 2015-07-24. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A1.3.0). + +#### Added + +- Test case around `NSURLProtocol` checking header passthrough behaviors. + - Added by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#473](https://github.com/Alamofire/Alamofire/issues/473). +- Stream method on `Request` to receive data incrementally from data responses. + - Added by [Peter Sobot](https://github.com/psobot) in Pull Request + [#512](https://github.com/Alamofire/Alamofire/pull/512). +- Example to the README demonstrating how to use the `responseCollection` serializer. + - Added by [Josh Brown](https://github.com/joshuatbrown) in Pull Request + [#532](https://github.com/Alamofire/Alamofire/pull/532). +- Link to the README to the CocoaDocs documentation for Alamofire. + - Added by [Robert](https://github.com/rojotek) in Pull Request + [#541](https://github.com/Alamofire/Alamofire/pull/541). +- Support for uploading `MultipartFormData` in-memory and streaming from disk. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#539](https://github.com/Alamofire/Alamofire/pull/539). +- Tests for uploading `MultipartFormData` with complete code coverage. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#539](https://github.com/Alamofire/Alamofire/pull/539). +- The iOS 8.4 simulator to the Travis CI builds by switching to the Xcode 6.4 build. + - Added by [Syo Ikeda](https://github.com/ikesyo) in Pull Request + [#568](https://github.com/Alamofire/Alamofire/pull/568). +- Tests for the custom header support with complete code coverage. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#586](https://github.com/Alamofire/Alamofire/pull/586). +- Section to the README about new HTTP header support in the global functions. + - Added by [Christian Noon](https://github.com/cnoon). +- Basic auth `Authorization` header example to the README. + - Added by [Christian Noon](https://github.com/cnoon). +- TLS certificate and public key pinning support through the `ServerTrustPolicy`. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#581](https://github.com/Alamofire/Alamofire/pull/581). +- Tests for TLS certificate and public key pinning with complete code coverage. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#581](https://github.com/Alamofire/Alamofire/pull/581). +- Security section to the README detailing various server trust policies. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#581](https://github.com/Alamofire/Alamofire/pull/581). +- The `resumeData` property to `Request` to expose outside data response serializer. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#595](https://github.com/Alamofire/Alamofire/pull/595). +- Download request sample to iOS example app. + - Added by [Kengo Yokoyama](https://github.com/kentya6) in Pull Request + [#579](https://github.com/Alamofire/Alamofire/pull/579). + +#### Updated + +- The INFOPLIST_FILE Xcode project setting to be a relative path. + - Updated by [Christian Noon](https://github.com/cnoon). +- Exposed persistence parameter for basic auth credentials. + - Updated by [Christian Noon](https://github.com/cnoon) in regard to Issue + [#537](https://github.com/Alamofire/Alamofire/issues/537). +- The Travis CI builds to run a full `pod lib lint` pass on the source. + - Updated by [Kyle Fuller](https://github.com/kylef) in Pull Request + [#542](https://github.com/Alamofire/Alamofire/pull/542). +- All cases of force unwrapping with optional binding and where clause when applicable. + - Updated by [Syo Ikeda](https://github.com/ikesyo) in Pull Request + [#557](https://github.com/Alamofire/Alamofire/pull/557). +- The `ParameterEncoding` encode return tuple to return a mutable URL request. + - Updated by [Petr Korolev](https://github.com/skywinder) in Pull Request + [#478](https://github.com/Alamofire/Alamofire/pull/478). +- The `URLRequest` convenience method to return a mutable `NSURLRequest`. + - Updated by [Christian Noon](https://github.com/cnoon). +- The `request` / `download` / `upload` methods to support custom headers. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#586](https://github.com/Alamofire/Alamofire/pull/586). +- The global `request` / `download` / `upload` method external parameters convention. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#586](https://github.com/Alamofire/Alamofire/pull/586). +- Response serialization to use generics and a `ResponseSerializer` protocol. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#593](https://github.com/Alamofire/Alamofire/pull/593). +- Download task delegate to store resume data for a failed download if available. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#595](https://github.com/Alamofire/Alamofire/pull/595). +- The `TaskDelegate.queue` to public to allow custom request extension operations. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#590](https://github.com/Alamofire/Alamofire/pull/590). +- The README code samples for Advanced Response Serialization. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Removed + +- An unnecessary `NSURLSessionConfiguration` type declaration that can be inferred. + - Removed by [Avismara](https://github.com/avismarahl) in Pull Request + [#576](https://github.com/Alamofire/Alamofire/pull/576). +- Unnecessary `respondsToSelector` overrides for `SessionDelegate` methods. + - Removed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#590](https://github.com/Alamofire/Alamofire/pull/590). +- Unnecessary calls to `self` throughout source, test and example logic. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- Random test suite basic auth failures by clearing credentials in `setUp` method. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Error where wildcard was failing due to missing response MIME type. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#598](https://github.com/Alamofire/Alamofire/pull/598). +- Typo in the basic auth headers example code in the README. + - Fixed by [蒲公英の生活](https://github.com/fewspider) in Pull Request + [#605](https://github.com/Alamofire/Alamofire/pull/605). +- Issue where the example app was printing elapsed time in optional form. + - Fixed by [Christian Noon](https://github.com/cnoon). + +#### Upgrade Notes + +There are a couple changes in the 1.3.0 release that are not fully backwards +compatible and need to be called out. + +- The global `request` / `download` / `upload` external parameter naming conventions + were not consistent nor did they match the `Manager` equivalents. By making them + consistent across the board, this introduced the possibility that you "may" need to + make slight modifications to your global function calls. +- In order to support generic response serializers, the lowest level + `Request.response` method had to be converted to a generic method leveraging the new + `ResponseSerializer` protocol. This has many advantages, the most obvious being that + the `response` convenience method now returns an `NSData?` optional instead of an + `AnyObject?` optional. Nice! + + > Please note that every effort is taken to maintain proper semantic versioning. In + > these two rare cases, it was deemed to be in the best interest of the community to + > slightly break semantic versioning to unify naming conventions as well as expose a + > much more powerful form of response serialization. + + > If you have any issues, please don't hesitate to reach out through + > [GitHub](https://github.com/Alamofire/Alamofire/issues) or + > [Twitter](https://twitter.com/AlamofireSF). + +--- + +## [1.2.3](https://github.com/Alamofire/Alamofire/releases/tag/1.2.3) + +Released on 2015-06-12. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A1.2.3). + +#### Added + +- Tests for data task progress closure and NSProgress updates. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#494](https://github.com/Alamofire/Alamofire/pull/494). +- More robust tests around download and upload progress. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#494](https://github.com/Alamofire/Alamofire/pull/494). +- More robust redirect tests around default behavior and task override closures. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#507](https://github.com/Alamofire/Alamofire/pull/507). +- The "[" and "]" to the legal escape characters and added more documentation. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#504](https://github.com/Alamofire/Alamofire/pull/504). +- Percent escaping tests around reserved / unreserved / illegal characters. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#504](https://github.com/Alamofire/Alamofire/pull/504). +- Tests for various Cache-Control headers with different request cache policies. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#505](https://github.com/Alamofire/Alamofire/pull/505). +- Link to Carthage in the README. + - Added by [Josh Brown](https://github.com/joshuatbrown) in Pull Request + [#520](https://github.com/Alamofire/Alamofire/pull/520). + +#### Updated + +- iOS 7 instructions to cover multiple Swift files in the README. + - Updated by [Sébastien Michoy](https://github.com/SebastienMichoy) in regards + to Issue [#479](https://github.com/Alamofire/Alamofire/pull/479). +- All tests to follow the Given / When / Then structure. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#489](https://github.com/Alamofire/Alamofire/pull/489). +- All tests to be crash safe. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#489](https://github.com/Alamofire/Alamofire/pull/489). +- The OS X tests so that they are all passing again. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#489](https://github.com/Alamofire/Alamofire/pull/489). +- Re-enabled Travis-CI tests for both iOS and Mac OS X. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#506](https://github.com/Alamofire/Alamofire/pull/506). +- Travis-CI test suite to run all tests in both debug and release. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#506](https://github.com/Alamofire/Alamofire/pull/506). +- Travis-CI test suite to run all tests on iOS 8.1, 8.2 and 8.3 as well as Mac OS X 10.10. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#506](https://github.com/Alamofire/Alamofire/pull/506). +- Travis-CI test suite to run `pod lib lint` against the latest version of CocoaPods. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#506](https://github.com/Alamofire/Alamofire/pull/506). + +#### Fixed + +- Random deinitialization test failure by handling task state race condition. + - Fixed by [Christian Noon](https://github.com/cnoon). +- Typo in the API Parameter Abstraction in the README. + - Fixed by [Josh Brown](https://github.com/joshuatbrown) in Pull Request + [#500](https://github.com/Alamofire/Alamofire/pull/500). +- Cookies are now only applied in the DebugPrintable API when appropriate. + - Fixed by [Alex Plescan](https://github.com/alexpls) in Pull Request + [#516](https://github.com/Alamofire/Alamofire/pull/516). + +## [1.2.2](https://github.com/Alamofire/Alamofire/releases/tag/1.2.2) + +Released on 2015-05-13. All issues associated with this milestone can be found using this +[filter](https://github.com/Alamofire/Alamofire/issues?utf8=✓&q=milestone%3A1.2.2). + +#### Added + +- Contributing Guidelines document to the project. + - Added by [Mattt Thompson](https://github.com/mattt). +- Documentation to the `URLStringConvertible` protocol around RFC specs. + - Added by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#464](https://github.com/Alamofire/Alamofire/pull/464). +- The `Carthage/Build` ignore flag to the `.gitignore` file. + - Added by [Tomáš Slíž](https://github.com/tomassliz) in Pull Request + [#451](https://github.com/Alamofire/Alamofire/pull/451). +- The `.DS_Store` ignore flag to the `.gitignore` file. + - Added by [Christian Noon](https://github.com/cnoon). +- Response status code asserts for redirect tests. + - Added by [Christian Noon](https://github.com/cnoon). +- A CHANGELOG to the project documenting each official release. + - Added by [Christian Noon](https://github.com/cnoon). + +#### Updated + +- `SessionDelegate` override closure properties to match the method signatures. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#456](https://github.com/Alamofire/Alamofire/pull/456). +- Documentation for the `Printable` protocol on `Request` to reference output stream + rather than the specific `OutputStreamType`. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Deployment targets to iOS 8.0 and OS X 10.9 for the respective frameworks. + - Updated by [Christian Noon](https://github.com/cnoon). +- `SessionDelegate` willPerformHTTPRedirection method to accept optional return type + from override closure. + - Updated by [Chungsub Kim](https://github.com/subicura) in Pull Request + [#469](https://github.com/Alamofire/Alamofire/pull/469). +- Embedded Framework and Source File documentation in the README. + - Updated by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#427](https://github.com/Alamofire/Alamofire/pull/427). +- Alamofire source to be split into multiple core files and feature files. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#471](https://github.com/Alamofire/Alamofire/pull/471). +- `TaskDelegate` override closure signatures and delegate method implementations. + - Updated by [Christian Noon](https://github.com/cnoon). + +#### Removed + +- Travis-CI build status from the README until Xcode 6.3 is supported. + - Removed by [Mattt Thompson](https://github.com/mattt). +- Unnecessary parentheses from closure parameters and typealiases. + - Removed by [Christian Noon](https://github.com/cnoon). + +#### Fixed + +- `SessionDelegate` override closure documentation. + - Fixed by [Siemen Sikkema](https://github.com/siemensikkema) in Pull Request + [#448](https://github.com/Alamofire/Alamofire/pull/448). +- Some inaccurate documentation on several of the public `SessionDelegate` closures. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#456](https://github.com/Alamofire/Alamofire/pull/456). +- A deinit race condition where the task delegate queue could fail to `dispatch_release`. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#379](https://github.com/Alamofire/Alamofire/pull/379). +- `TaskDelegate` to only set `qualityOfService` for `NSOperationQueue` on iOS 8+. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#472](https://github.com/Alamofire/Alamofire/pull/472). +- Expectation order issue in the redirect tests. + - Fixed by [Christian Noon](https://github.com/cnoon). +- `DataTaskDelegate` behavior ensuring `NSProgress` values and `progress` override + closures are always updated and executed. + - Fixed by [Christian Noon](https://github.com/cnoon) in regards to Issue + [#407](https://github.com/Alamofire/Alamofire/pull/407). + +## [1.2.1](https://github.com/Alamofire/Alamofire/releases/tag/1.2.1) + +Released on 2015-04-21. + +#### Added + +- Redirect tests for the `SessionDelegate`. + - Added by [Jonathan Hersh](https://github.com/jhersh) in Pull Request + [#424](https://github.com/Alamofire/Alamofire/pull/424). +- TLS evaluation test case. + - Added by [Mattt Thompson](https://github.com/mattt). +- Additional guards to ensure unique task identifiers for upload and download tasks. + - Added by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#393](https://github.com/Alamofire/Alamofire/pull/393). + +#### Updated + +- Required Xcode version to Xcode to 6.3 in the README. + - Updated by [Mattt Thompson](https://github.com/mattt). +- SSL validation to use default system validation by default. + - Updated by [Michael Thole](https://github.com/mthole) in Pull Request + [#394](https://github.com/Alamofire/Alamofire/pull/394). + +## [1.2.0](https://github.com/Alamofire/Alamofire/releases/tag/1.2.0) + +Released on 2015-04-09. + +#### Added + +- New `testURLParameterEncodeStringWithSlashKeyStringWithQuestionMarkValueParameter` + test. + - Added by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#370](https://github.com/Alamofire/Alamofire/pull/370). +- New `backgroundCompletionHandler` property to the `Manager` called when the + session background tasks finish. + - Added by [Christian Noon](https://github.com/cnoon) in Pull Request + [#317](https://github.com/Alamofire/Alamofire/pull/317). + +#### Updated + +- `Request` computed property `progress` to no longer be an optional type. + - Updated by [Pitiphong Phongpattranont](https://github.com/pitiphong-p) in + Pull Request + [#404](https://github.com/Alamofire/Alamofire/pull/404). +- All logic to Swift 1.2. + - Updated by [Aron Cedercrantz](https://github.com/rastersize) and + [Mattt Thompson](https://github.com/mattt). +- The `responseString` serializer to respect server provided character encoding with + overrideable configuration, default string response serialization to ISO-8859-1, as + per the HTTP/1.1 specification. + - Updated by [Kyle Fuller](https://github.com/kylef) and + [Mattt Thompson](https://github.com/mattt) in Pull Request + [#359](https://github.com/Alamofire/Alamofire/pull/359) which also resolved Issue + [#358](https://github.com/Alamofire/Alamofire/pull/358). +- `SessionDelegate` methods to first call the override closures if set. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#317](https://github.com/Alamofire/Alamofire/pull/317). +- `SessionDelegate` and all override closures to a public ACL allowing for customization. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#317](https://github.com/Alamofire/Alamofire/pull/317). +- `SessionDelegate` class to `final`. + - Updated by [Mattt Thompson](https://github.com/mattt). +- `SessionDelegate` header documentation for method override properties. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Xcode project to set `APPLICATION_EXTENSION_API_ONLY` to `YES` for OS X target. + - Updated by [Mattt Thompson](https://github.com/mattt). + +#### Removed + +- Ambiguous response serializer methods that collided with default parameters. + - Removed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#408](https://github.com/Alamofire/Alamofire/pull/408). +- `SessionDelegate` initializer and replaced with default property value. + - Removed by [Mattt Thompson](https://github.com/mattt). + +#### Fixed + +- Async tests where asserts were potentially not being run by by moving + `expectation.fullfill()` to end of closures. + - Fixed by [Nate Cook](https://github.com/natecook1000) in Pull Request + [#420](https://github.com/Alamofire/Alamofire/pull/420). +- Small grammatical error in the ParameterEncoding section of the README. + - Fixed by [Aaron Brager](https://github.com/getaaron) in Pull Request + [#416](https://github.com/Alamofire/Alamofire/pull/416). +- Typo in a download test comment. + - Fixed by [Aaron Brager](https://github.com/getaaron) in Pull Request + [#413](https://github.com/Alamofire/Alamofire/pull/413). +- Signature mismatch in the `dataTaskDidBecomeDownloadTask` override closure. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#317](https://github.com/Alamofire/Alamofire/pull/317). +- Issue in the `SessionDelegate` where the `DataTaskDelegate` was not being called. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#317](https://github.com/Alamofire/Alamofire/pull/317). + +--- + +## [1.1.5](https://github.com/Alamofire/Alamofire/releases/tag/1.1.5) + +Released on 2015-03-26. + +#### Added + +- Convenience upload functions to the `Manager`. + - Added by [Olivier Bohrer](https://github.com/obohrer) in Pull Request + [#334](https://github.com/Alamofire/Alamofire/pull/334). +- Info to the README about Swift 1.2 support. + - Added by [Mattt Thompson](https://github.com/mattt). + +#### Updated + +- All request / upload / download methods on `Manager` to match the top-level functions. + - Updated by [Mattt Thompson](https://github.com/mattt). +- The `testDownloadRequest` to no longer remove the downloaded file. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Ono XML response serializer example in the README. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Travis-CI settings to only build the master branch. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Code signing identities for the frameworks and targets to better support Carthage. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#400](https://github.com/Alamofire/Alamofire/pull/400). +- iOS deployment target to iOS 8.0 for iOS target and tests. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#401](https://github.com/Alamofire/Alamofire/pull/401). +- Legal characters to be escaped according to RFC 3986 Section 3.4. + - Updated by [Stephane Lizeray](https://github.com/slizeray) in Pull Request + [#370](https://github.com/Alamofire/Alamofire/pull/370). + +#### Fixed + +- Travis-CI scheme issue, added podspec linting and added ENV variables. + - Fixed by [Jonathan Hersh](https://github.com/jhersh) in Pull Request + [#351](https://github.com/Alamofire/Alamofire/pull/351). +- Code sample in the README in the Manual Parameter Encoding section. + - Fixed by [Petr Korolev](https://github.com/skywinder) in Pull Request + [#381](https://github.com/Alamofire/Alamofire/pull/381). + +## [1.1.4](https://github.com/Alamofire/Alamofire/releases/tag/1.1.4) + +Released on 2015-01-30. + +#### Added + +- Podspec argument `requires_arc` to the podspec file. + - Added by [Mattt Thompson](https://github.com/mattt). +- Support for Travis-CI for automated testing purposes. + - Added by [Kyle Fuller](https://github.com/kylef) in Pull Request + [#279](https://github.com/Alamofire/Alamofire/pull/279). + +#### Updated + +- Installation instructions in the README to include CocoaPods, Carthage and + Embedded Frameworks. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Travis-CI to use Xcode 6.1.1. + - Updated by [Mattt Thompson](https://github.com/mattt). +- The `download` method on `Manager` to use `Request.DownloadFileDestination` typealias. + - Updated by [Alexander Strakovich](https://github.com/astrabot) in Pull Request + [#318](https://github.com/Alamofire/Alamofire/pull/318). +- `RequestTests` to no longer delete all cookies in default session configuration. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Travis-CI yaml file to only build the active architecture. + - Updated by [Mattt Thompson](https://github.com/mattt). +- Deployment targets to iOS 7.0 and Mac OS X 10.9. + - Updated by [Mattt Thompson](https://github.com/mattt). + +#### Removed + +- The `tearDown` method in the `AlamofireDownloadResponseTestCase`. + - Removed by [Mattt Thompson](https://github.com/mattt). + +#### Fixed + +- Small formatting issue in the CocoaPods Podfile example in the README. + - Fixed by [rborkow](https://github.com/rborkow) in Pull Request + [#313](https://github.com/Alamofire/Alamofire/pull/313). +- Several issues with the iOS and OSX targets in the Xcode project. + - Fixed by [Mattt Thompson](https://github.com/mattt). +- The `testDownloadRequest` in `DownloadTests` by adding `.json` file extension. + - Fixed by [Martin Kavalar](https://github.com/mk) in Pull Request + [#302](https://github.com/Alamofire/Alamofire/pull/302). +- The `AlamofireRequestDebugDescriptionTestCase` on OSX. + - Fixed by [Mattt Thompson](https://github.com/mattt). +- Spec validation error with CocoaPods 0.36.0.beta-1 by disabling -b flags in `cURL` + debug on OSX. + - Fixed by [Mattt Thompson](https://github.com/mattt). +- Travis-CI build issue by adding suppport for an `iOS Example` scheme. + - Fixed by [Yasuharu Ozaki](https://github.com/yasuoza) in Pull Request + [#322](https://github.com/Alamofire/Alamofire/pull/322). + +## [1.1.3](https://github.com/Alamofire/Alamofire/releases/tag/1.1.3) + +Released on 2015-01-09. + +#### Added + +- Podspec file to support CocoaPods deployment. + - Added by [Marius Rackwitz](https://github.com/mrackwitz) in Pull Request + [#218](https://github.com/Alamofire/Alamofire/pull/218). +- Shared scheme to support Carthage deployments. + - Added by [Yosuke Ishikawa](https://github.com/ishkawa) in Pull Request + [#228](https://github.com/Alamofire/Alamofire/pull/228). +- New target for Alamofire OSX framework. + - Added by [Martin Kavalar](https://github.com/mk) in Pull Request + [#293](https://github.com/Alamofire/Alamofire/pull/293). + +#### Updated + +- Upload and Download progress state to be updated before calling progress closure. + - Updated by [Alexander Strakovich](https://github.com/astrabot) in Pull Request + [#278](https://github.com/Alamofire/Alamofire/pull/278). + +#### Fixed + +- Some casting code logic in the Generic Response Object Serialization example in + the README. + - Fixed by [Philip Heinser](https://github.com/philipheinser) in Pull Request + [#258](https://github.com/Alamofire/Alamofire/pull/258). +- Indentation formatting of the `responseString` parameter documentation. + - Fixed by [Ah.Miao](https://github.com/mrahmiao) in Pull Request + [#291](https://github.com/Alamofire/Alamofire/pull/291). + +## [1.1.2](https://github.com/Alamofire/Alamofire/releases/tag/1.1.2) + +Released on 2014-12-21. + +#### Added + +- POST request JSON response test. + - Added by [Mattt Thompson](https://github.com/mattt). + +#### Updated + +- The response object example to use a failable initializer in the README. + - Updated by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#230](https://github.com/Alamofire/Alamofire/pull/230). +- Router example in the README by removing extraneous force unwrap. + - Updated by [Arnaud Mesureur](https://github.com/nsarno) in Pull Request + [#247](https://github.com/Alamofire/Alamofire/pull/247). +- Xcode project `APPLICATION_EXTENSION_API_ONLY` flag to `YES`. + - Updated by [Michael Latta](https://github.com/technomage) in Pull Request + [#273](https://github.com/Alamofire/Alamofire/pull/273). +- Default HTTP header creation by moving it into a public class method. + - Updated by [Christian Noon](https://github.com/cnoon) in Pull Request + [#261](https://github.com/Alamofire/Alamofire/pull/261). + +#### Fixed + +- Upload stream method to set `HTTPBodyStream` for streamed request. + - Fixed by [Florent Vilmart](https://github.com/flovilmart) and + [Mattt Thompson](https://github.com/mattt) in Pull Request + [#241](https://github.com/Alamofire/Alamofire/pull/241). +- ParameterEncoding to compose percent-encoded query strings from + percent-encoded components. + - Fixed by [Oleh Sannikov](https://github.com/sunnycows) in Pull Request + [#249](https://github.com/Alamofire/Alamofire/pull/249). +- Serialization handling of NSData with 0 bytes. + - Fixed by [Mike Owens](https://github.com/mowens) in Pull Request + [#254](https://github.com/Alamofire/Alamofire/pull/254). +- Issue where `suggestedDownloadDestination` parameters were being ignored. + - Fixed by [Christian Noon](https://github.com/cnoon) in Pull Request + [#257](https://github.com/Alamofire/Alamofire/pull/257). +- Crash caused by `Manager` deinitialization and added documentation. + - Fixed by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#269](https://github.com/Alamofire/Alamofire/pull/269). + +## [1.1.1](https://github.com/Alamofire/Alamofire/releases/tag/1.1.1) + +Released on 2014-11-20. + +#### Updated + +- Dispatch-based synchronized access to subdelegates. + - Updated by [Mattt Thompson](https://github.com/mattt) in regards to Pull Request + [#175](https://github.com/Alamofire/Alamofire/pull/175). +- iOS 7 instructions in the README. + - Updated by [Mattt Thompson](https://github.com/mattt). +- CRUD example in the README to work on Xcode 6.1. + - Updated by [John Beynon](https://github.com/johnbeynon) in Pull Request + [#187](https://github.com/Alamofire/Alamofire/pull/187). +- The `cURL` example annotation in the README to pick up `bash` syntax highlighting. + - Updated by [Samuel E. Giddins](https://github.com/segiddins) in Pull Request + [#208](https://github.com/Alamofire/Alamofire/pull/208). + +#### Fixed + +- Out-of-memory exception by replacing `stringByAddingPercentEncodingWithAllowedCharacters` + with `CFURLCreateStringByAddingPercentEscapes`. + - Fixed by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#206](https://github.com/Alamofire/Alamofire/pull/206). +- Several issues in the README examples where an NSURL initializer needs to be unwrapped. + - Fixed by [Mattt Thompson](https://github.com/mattt) in regards to Pull Request + [#213](https://github.com/Alamofire/Alamofire/pull/213). +- Possible exception when force unwrapping optional header properties. + - Fixed by [Mattt Thompson](https://github.com/mattt). +- Optional cookie entry in `cURL` output. + - Fixed by [Mattt Thompson](https://github.com/mattt) in regards to Issue + [#226](https://github.com/Alamofire/Alamofire/pull/226). +- Optional `textLabel` property on cells in the example app. + - Fixed by [Mattt Thompson](https://github.com/mattt). + +## [1.1.0](https://github.com/Alamofire/Alamofire/releases/tag/1.1.0) + +Released on 2014-10-20. + +#### Updated + +- Project to support Swift 1.1 and Xcode 6.1. + - Updated by [Aral Balkan](https://github.com/aral), + [Ross Kimes](https://github.com/rosskimes), + [Orta Therox](https://github.com/orta), + [Nico du Plessis](https://github.com/nduplessis) + and [Mattt Thompson](https://github.com/mattt). + +--- + +## [1.0.1](https://github.com/Alamofire/Alamofire/releases/tag/1.0.1) + +Released on 2014-10-20. + +#### Added + +- Tests for upload and download with progress. + - Added by [Mattt Thompson](https://github.com/mattt). +- Test for question marks in url encoded query. + - Added by [Mattt Thompson](https://github.com/mattt). +- The `NSURLSessionConfiguration` headers to `cURL` representation. + - Added by [Matthias Ryne Cheow](https://github.com/rynecheow) in Pull Request + [#140](https://github.com/Alamofire/Alamofire/pull/140). +- Parameter encoding tests for key/value pairs containing spaces. + - Added by [Mattt Thompson](https://github.com/mattt). +- Percent character encoding for the `+` character. + - Added by [Niels van Hoorn](https://github.com/nvh) in Pull Request + [#167](https://github.com/Alamofire/Alamofire/pull/167). +- Escaping for quotes to support JSON in `cURL` commands. + - Added by [John Gibb](https://github.com/johngibb) in Pull Request + [#178](https://github.com/Alamofire/Alamofire/pull/178). +- The `request` method to the `Manager` bringing it more inline with the top-level methods. + - Added by Brian Smith. + +#### Fixed + +- Parameter encoding of ampersands and escaping of characters. + - Fixed by [Mattt Thompson](https://github.com/mattt) in regards to Issues + [#146](https://github.com/Alamofire/Alamofire/pull/146) and + [#162](https://github.com/Alamofire/Alamofire/pull/162). +- Parameter encoding of `HTTPBody` from occurring twice. + - Fixed by Yuri in Pull Request + [#153](https://github.com/Alamofire/Alamofire/pull/153). +- Extraneous dispatch to background by using weak reference for delegate in response. + - Fixed by [Mattt Thompson](https://github.com/mattt). +- Response handler threading issue by adding a `subdelegateQueue` to the `SessionDelegate`. + - Fixed by [Essan Parto](https://github.com/parto) in Pull Request + [#171](https://github.com/Alamofire/Alamofire/pull/171). +- Challenge issue where basic auth credentials were not being unwrapped. + - Fixed by [Mattt Thompson](https://github.com/mattt). + +## [1.0.0](https://github.com/Alamofire/Alamofire/releases/tag/1.0.0) + +Released on 2014-09-25. + +#### Added + +- Initial release of Alamofire. + - Added by [Mattt Thompson](https://github.com/mattt). diff --git a/Carthage/Checkouts/Alamofire/CONTRIBUTING.md b/Carthage/Checkouts/Alamofire/CONTRIBUTING.md new file mode 100644 index 00000000..1ec24b2e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/CONTRIBUTING.md @@ -0,0 +1,91 @@ +# Contributing Guidelines + +This document contains information and guidelines about contributing to this project. +Please read it before you start participating. + +**Topics** + +* [Asking Questions](#asking-questions) +* [Reporting Security Issues](#reporting-security-issues) +* [Reporting Issues](#reporting-other-issues) +* [Triage Issues](#triage-issues) +* [Submitting Pull Requests](#submitting-pull-requests) +* [Developers Certificate of Origin](#developers-certificate-of-origin) +* [Code of Conduct](#code-of-conduct) + +## Asking Questions + +**We don't use GitHub as a support forum.** +For any usage questions that are not specific to the project itself, please ask on [Stack Overflow](https://stackoverflow.com) instead. By doing so, you'll be more likely to quickly solve your problem, and you'll allow anyone else with the same question to find the answer. This also allows maintainers to focus on improving the project for others. + +If you'd like to discuss Alamofire best practices, common usage patterns, ideas for new features, or ongoing development, please use our [Swift Forums](https://forums.swift.org/c/related-projects/alamofire/). + +## Reporting Security Issues + +The Alamofire Software Foundation takes security seriously. +If you discover a security issue, please bring it to our attention right away! + +Please **DO NOT** file a public issue, instead send your report privately to . This will help ensure that any vulnerabilities that _are_ found can be [disclosed responsibly](https://en.wikipedia.org/wiki/Responsible_disclosure) to any affected parties. + +## Reporting Other Issues + +A great way to contribute to the project is to send a detailed issue when you encounter a problem. We always appreciate a well-written, thorough bug report. + +Check that the project issues database doesn't already include that problem or suggestion before submitting an issue. If you find a match, feel free to vote for the issue by adding a reaction. Doing this helps prioritize the most common problems and requests. + +When reporting issues, please fill out our issue template. The information the template asks for will help us review and fix your issue faster. + +## Triage Issues [![Open Source Helpers](https://www.codetriage.com/alamofire/alamofire/badges/users.svg)](https://www.codetriage.com/alamofire/alamofire) + +You can triage issues which may include reproducing bug reports or asking for vital information, such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to alamofire on CodeTriage](https://www.codetriage.com/alamofire/alamofire). + +## Submitting Pull Requests + +You can contribute by fixing bugs or adding new features. For larger code changes, we recommend first discussing your ideas on our [GitHub Discussions](https://github.com/Alamofire/Alamofire/discussions) or [Swift Forums](https://forums.swift.org/c/related-projects/alamofire/). When submitting a pull request, please add relevant tests and ensure your changes don't break any existing tests (see [Automated Tests](#automated-tests) below). + +### Automated Tests + +Alamofire's tests depend on our [Firewalk](https://github.com/Alamofire/Firewalk) test server. To run the automated tests, you first need to have the server running locally. + +In your terminal, run the following commands: +- To install Firewalk: `brew install alamofire/alamofire/firewalk` +- To run and detach the server: `firewalk &` +- To stop the server, run `kill` and provide the pid output after launch. + +## Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +- (a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +- (b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +- (c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +- (d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +## Code of Conduct + +The Code of Conduct governs how we behave in public or in private +whenever the project will be judged by our actions. +We expect it to be honored by everyone who contributes to this project. + +See [CONDUCT.md](https://github.com/Alamofire/Foundation/blob/master/CONDUCT.md) for details. + +--- + +*Some of the ideas and wording for the statements above were based on work by the [Docker](https://github.com/docker/docker/blob/master/CONTRIBUTING.md) and [Linux](https://elinux.org/Developer_Certificate_Of_Origin) communities. We commend them for their efforts to facilitate collaboration in their projects.* diff --git a/Carthage/Checkouts/Alamofire/Documentation/AdvancedUsage.md b/Carthage/Checkouts/Alamofire/Documentation/AdvancedUsage.md new file mode 100644 index 00000000..cba47073 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/AdvancedUsage.md @@ -0,0 +1,1550 @@ +- [`Session`](#session) + - [Creating Custom `Session` Instances](#creating-custom-session-instances) + - [Creating a `Session` With a `URLSessionConfiguration`](#creating-a-session-with-a-urlsessionconfiguration) + - [`SessionDelegate`](#sessiondelegate) + - [`startRequestsImmediately`](#startrequestsimmediately) + - [A `Session`’s `DispatchQueue`s](#a-sessions-dispatchqueues) + - [Adding a `RequestInterceptor`](#adding-a-requestinterceptor) + - [Adding a `ServerTrustManager`](#adding-a-servertrustmanager) + - [Adding a `RedirectHandler`](#adding-a-redirecthandler) + - [Adding a `CachedResponseHandler`](#adding-a-cachedresponsehandler) + - [Adding `EventMonitor`s](#adding-eventmonitors) + - [Creating Instances From `URLSession`s](#creating-instances-from-urlsessions) +- [Requests](#requests) + - [The Request Pipeline](#the-request-pipeline) + - [`Request`](#request) + - [State](#state) + - [Progress](#progress) + - [Handling Redirects](#handling-redirects) + - [Customizing Caching](#customizing-caching) + - [Credentials](#credentials) + - [A `Request`’s `URLRequest`s](#a-requests-urlrequests) + - [`URLSessionTask`s](#urlsessiontasks) + - [Response](#response) + - [`URLSessionTaskMetrics`](#urlsessiontaskmetrics) + - [`DataRequest`](#datarequest) + - [Additional State](#additional-state) + - [Validation](#validation) + - [`DataStreamRequest`](#datastreamrequest) + - [Additional State](#additional-state-1) + - [Validation](#validation-1) + - [`UploadRequest`](#uploadrequest) + - [Additional State](#additional-state-2) + - [`DownloadRequest`](#downloadrequest) + - [Additional State](#additional-state-3) + - [Cancellation](#cancellation) + - [Validation](#validation-2) +- [Adapting and Retrying Requests with `RequestInterceptor`](#adapting-and-retrying-requests-with-requestinterceptor) + - [`RequestAdapter`](#requestadapter) + - [`RequestRetrier`](#requestretrier) + - [Using Multiple `RequestInterceptor`s](#using-multiple-requestinterceptors) + - [`AuthenticationInterceptor`](#authenticationinterceptor) + - [Compressing Request Body Data With `DeflateRequestCompressor`](#compressing-request-body-data-with-deflaterequestcompressor) +- [Security](#security) + - [Evaluating Server Trusts with `ServerTrustManager` and `ServerTrustEvaluating`](#evaluating-server-trusts-with-servertrustmanager-and-servertrustevaluating) + - [`ServerTrustEvaluting`](#servertrustevaluting) + - [`ServerTrustManager`](#servertrustmanager) + - [Subclassing `ServerTrustManager`](#subclassing-servertrustmanager) + - [App Transport Security](#app-transport-security) + - [Using Self-Signed Certificates with Local Networking](#using-self-signed-certificates-with-local-networking) +- [Customizing Caching and Redirect Handling](#customizing-caching-and-redirect-handling) + - [`CachedResponseHandler`](#cachedresponsehandler) + - [`RedirectHandler`](#redirecthandler) +- [Using `EventMonitor`s](#using-eventmonitors) + - [Logging](#logging) +- [Making Requests](#making-requests) + - [`URLConvertible`](#urlconvertible) + - [`URLRequestConvertible`](#urlrequestconvertible) + - [Routing Requests](#routing-requests) +- [Response Handling](#response-handling) + - [Handling Responses Without Serialization](#handling-responses-without-serialization) + - [`ResponseSerializer`](#responseserializer) + - [`DataResponseSerializer`](#dataresponseserializer) + - [`StringResponseSerializer`](#stringresponseserializer) + - [`DecodableResponseSerializer`](#decodableresponseserializer) + - [Customizing Response Handlers](#customizing-response-handlers) + - [Response Transforms](#response-transforms) + - [Creating a Custom Response Serializer](#creating-a-custom-response-serializer) + - [Streaming Response Handlers](#streaming-response-handlers) +- [Using Alamofire with Combine](#using-alamofire-with-combine) + - [`DownloadResponsePublisher`](#downloadresponsepublisher) + - [`DataStreamPublisher`](#datastreampublisher) +- [Using Alamofire with Swift Concurrency](#using-alamofire-with-swift-concurrency) + - [`DataRequest` and `UploadRequest` Support](#datarequest-and-uploadrequest-support) + - [`DownloadRequest` Support](#downloadrequest-support) + - [Automatic Cancellation](#automatic-cancellation) + - [`DataStreamRequest` Support](#datastreamrequest-support) + - [Value Stream Handlers](#value-stream-handlers) +- [Network Reachability](#network-reachability) + +# Advanced Usage + +Alamofire is built on top of `URLSession` and the Foundation URL Loading System. To make the most of this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack. + +**Recommended Reading** + +- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html) +- [`URLSession` Class Reference](https://developer.apple.com/reference/foundation/urlsession) +- [`URLCache` Class Reference](https://developer.apple.com/reference/foundation/urlcache) +- [`URLAuthenticationChallenge` Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge) + +## `Session` + +Alamofire’s `Session` is roughly equivalent in responsibility to the `URLSession` instance it maintains: it provides API to produce the various `Request` subclasses encapsulating different `URLSessionTask` subclasses, as well as encapsulating a variety of configuration applied to all `Request`s produced by the instance. + +`Session` provides a `default` singleton instance which powers the top-level API from the `AF` enum namespace. As such, the following two statements are equivalent: + +```swift +AF.request("https://httpbin.org/get") +``` + +```swift +let session = Session.default +session.request("https://httpbin.org/get") +``` + +### Creating Custom `Session` Instances + +Most applications will need to customize the behavior of their `Session` instances in a variety of ways. The easiest way to accomplish this is to use the following convenience initializer and store the result in a singleton used throughout the app. + +```swift +public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default, + delegate: SessionDelegate = SessionDelegate(), + rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"), + startRequestsImmediately: Bool = true, + requestQueue: DispatchQueue? = nil, + serializationQueue: DispatchQueue? = nil, + interceptor: RequestInterceptor? = nil, + serverTrustManager: ServerTrustManager? = nil, + redirectHandler: RedirectHandler? = nil, + cachedResponseHandler: CachedResponseHandler? = nil, + eventMonitors: [EventMonitor] = []) +``` + +This initializer allows the customization of all fundamental `Session` behaviors. + +#### Creating a `Session` With a `URLSessionConfiguration` + +To customize the behavior of the underlying `URLSession`, a customized `URLSessionConfiguration` instance can be provided. Starting from the `URLSessionConfiguration.af.default` instance is recommended, as it adds the default `Accept-Encoding`, `Accept-Language`, and `User-Agent` headers provided by Alamofire, but any `URLSessionConfiguration` can be used. + +```swift +let configuration = URLSessionConfiguration.af.default +configuration.allowsCellularAccess = false + +let session = Session(configuration: configuration) +``` + +> `URLSessionConfiguration` is **not** the recommended location to set `Authorization` or `Content-Type` headers. Instead, add them to `Request`s using the provided `headers` APIs, using `ParameterEncoder`s, or a `RequestAdapter`. + +> As Apple states in their [documentation](https://developer.apple.com/documentation/foundation/urlsessionconfiguration), mutating `URLSessionConfiguration` properties after the instance has been added to a `URLSession` (or, in Alamofire’s case, used to initialize a`Session`) has no effect. + +### `SessionDelegate` + +A `SessionDelegate` instance encapsulates all handling of the various `URLSessionDelegate` and related protocols callbacks. `SessionDelegate` also acts as the `SessionStateProvider` for every `Request` produced by Alamofire, allowing the `Request` to indirectly import state from the `Session` instance that created them. `SessionDelegate` can be customized with a specific `FileManager` instance, which will be used for any disk access, like accessing files to be uploaded by `UploadRequest`s or files downloaded by `DownloadRequest`s. + +```swift +let delegate = SessionDelegate(fileManager: .default) +``` + +### `startRequestsImmediately` + +By default, `Session` will call `resume()` on a `Request` as soon as it has added at least one response handler. Setting `startRequestsImmediately` to `false` requires that all `Request`s have `resume()` called manually. + +```swift +let session = Session(startRequestsImmediately: false) +``` + +### A `Session`’s `DispatchQueue`s + +By default, `Session` instances use a single `DispatchQueue` for all asynchronous work. This includes the `underlyingQueue` of the `URLSession`’s `delegate` `OperationQueue`, for all `URLRequest` creation, all response serialization work, and all internal `Session` and `Request` state mutation. If performance analysis shows a particular bottleneck around `URLRequest` creation or response serialization, `Session` can be provided with separate `DispatchQueue`s for each area of work. + +```swift +let rootQueue = DispatchQueue(label: "com.app.session.rootQueue") +let requestQueue = DispatchQueue(label: "com.app.session.requestQueue") +let serializationQueue = DispatchQueue(label: "com.app.session.serializationQueue") + +let session = Session(rootQueue: rootQueue, + requestQueue: requestQueue, + serializationQueue: serializationQueue) +``` + +Any custom `rootQueue` provided **MUST** be a serial queue, but `requestQueue` and `serializationQueue` can be either serial or parallel queues. Serial queues are the recommended default unless performance analysis shows work being delayed, in which case making the queues parallel may help overall performance. + +### Adding a `RequestInterceptor` + +Alamofire’s `RequestInterceptor` protocol (`RequestAdapter & RequestRetrier`) provides important and powerful request adaptation and retry features. It can be applied at both the `Session` and `Request` level. For more details on `RequestInterceptor` and the various implementations Alamofire includes, like `RetryPolicy`, see [below](#adapting-and-retrying-requests-with-requestinterceptor). + +```swift +let policy = RetryPolicy() +let session = Session(interceptor: policy) +``` + +### Adding a `ServerTrustManager` + +> For projects deploying to iOS 14, tvOS 14, watchOS 7, or macOS 11 or later, [Apple now provides built in pinning capabilities](https://developer.apple.com/news/?id=g9ejcf8y) configurable in your app's Info.plist. Please use that capability before implementing your own using Alamofire. + +Alamofire’s `ServerTrustManager` class encapsulates mappings between domains and instances of `ServerTrustEvaluating`-conforming types, which provide the ability to customize a `Session`’s handling of TLS security. This includes the use of certificate and public key pinning as well as certificate revocation checking. For more information, see the section about the `ServerTrustManager` and `ServerTrustEvaluating`. Initializing a `ServerTrustManager` is as simple as providing a mapping between the domain and the type of evaluation to be performed: + +```swift +let manager = ServerTrustManager(evaluators: ["httpbin.org": PinnedCertificatesTrustEvaluator()]) +let session = Session(serverTrustManager: manager) +``` + +For more details on evaluating server trusts, see the detailed documentation [below](#evaluating-server-trusts-with-servertrustmanager-and-servertrustevaluating). + +### Adding a `RedirectHandler` + +Alamofire’s `RedirectHandler` protocol customizes the handling of HTTP redirect responses. It can be applied at both the `Session` and `Request` level. Alamofire includes the `Redirector` type which conforms to `RedirectHandler` and offers simple control over redirects. For more details on `RedirectHandler`, see the detailed documentation [below](#redirecthandler). + +```swift +let redirector = Redirector(behavior: .follow) +let session = Session(redirectHandler: redirector) +``` + +### Adding a `CachedResponseHandler` + +Alamofire’s `CachedResponseHandler` protocol customizes the caching of responses and can be applied at both the `Session` and `Request` level. Alamofire includes the `ResponseCacher` type which conforms to `CachedResponseHandler` and offers simple control over response caching. For more details, see the detailed documentation [below](#cachedresponsehandler). + +```swift +let cacher = ResponseCacher(behavior: .cache) +let session = Session(cachedResponseHandler: cacher) +``` + +### Adding `EventMonitor`s + +Alamofire’s `EventMonitor` protocol provides powerful insight into Alamofire’s internal events. It can be used to provide logging and other event-based features. `Session` accepts an array of `EventMonitor`-conforming instances at initialization time. + +```swift +let monitor = ClosureEventMonitor() +monitor.requestDidCompleteTaskWithError = { (request, task, error) in + debugPrint(request) +} +let session = Session(eventMonitors: [monitor]) +``` + +### Operating on All Requests + +Although use should be rare, `Session` provides the `withAllRequests` method to operate on all currently active `Request`s. This work is performed on the `Session`'s `rootQueue`, so it's important to keep it quick. If the work may take some time, creating a separate queue to process the `Set` of `Request`s should be used. + +```swift +let session = ... // Some Session. +session.withAllRequests { requests in + requests.forEach { $0.suspend() } +} +``` + +Additionally, `Session` offers a convenience method to cancel all `Request`s and call a completion handler when complete. + +```swift +let session = ... // Some Session. +session.cancelAllRequests(completingOn: .main) { // completingOn uses .main by default. + print("Cancelled all requests.") +} +``` + +> Note: These actions are performed asynchronously, so requests may be created or have finished by the time it's actually run, so it should not be assumed the action will be performed on a particular set of `Request`s. + +### Creating Instances From `URLSession`s + +In addition to the `convenience` initializer mentioned previously, `Session`s can be initialized directly from `URLSession`s. However, there are several requirements to keep in mind when using this initializer, so using the convenience initializer is recommended. These include: + +- Alamofire does not support `URLSession`s configured for background use. This will lead to a runtime error when the `Session` is initialized. +- A `SessionDelegate` instance must be created and used as the `URLSession`’s `delegate`, as well as passed to the `Session` initializer. +- A custom `OperationQueue` must be passed as the `URLSession`’s `delegateQueue`. This queue must be a serial queue, it must have a backing `DispatchQueue`, and that `DispatchQueue` must be passed to the `Session` as its `rootQueue`. + +```swift +let rootQueue = DispatchQueue(label: "org.alamofire.customQueue") +let queue = OperationQueue() +queue.maxConcurrentOperationCount = 1 +queue.underlyingQueue = rootQueue +let delegate = SessionDelegate() +let configuration = URLSessionConfiguration.af.default +let urlSession = URLSession(configuration: configuration, + delegate: delegate, + delegateQueue: queue) +let session = Session(session: urlSession, delegate: delegate, rootQueue: rootQueue) +``` + +## Requests + +Each request performed by Alamofire is encapsulated by particular class, `DataRequest`, `UploadRequest`, and `DownloadRequest`. Each of these classes encapsulate functionality unique to each type of request, but `DataRequest` and `DownloadRequest` inherit from a common superclass, `Request` (`UploadRequest` inherits from `DataRequest`). `Request` instances are never created directly, but are instead vended from a `Session` instance through one of the various `request` methods. + +### The Request Pipeline + +Once a `Request` subclass has been created with it’s initial parameters or `URLRequestConvertible` value, it is passed through the series of steps making up Alamofire’s request pipeline. For a successful request, these include: + +1. Initial parameters, like HTTP method, headers, and parameters are encapsulated into an internal `URLRequestConvertible` value. If a `URLRequestConvertible` value is passed directly, that value is used unchanged. +2. `asURLRequest()` is called on the the `URLRequestConvertible` value, creating the first `URLRequest` value. This value is passed to the `Request` and stored in `requests`. If the `URLRequestConvertible` value was created from the parameters passed to a `Session` method, any provided `RequestModifier` is called when the `URLRequest` is created. +3. If there are any `Session` or `Request` `RequestAdapter`s or `RequestInterceptor`s, they’re called using the previously created `URLRequest`. The adapted `URLRequest` is then passed to the `Request` and stored in `request`s as well. +4. `Session` calls the `Request` to create the `URLSessionTask` to perform the network request based on the `URLRequest`. +5. Once the `URLSessionTask` is complete and `URLSessionTaskMetrics` have been gathered, the `Request` executes its `Validator`s. +6. Request executes any response handlers, such as `responseDecodable`, that have been appended. + +At any one of these steps, a failure can be indicated through a created or received `Error` value, which is then passed to the associated `Request`. For example, aside from steps 1 and 4, all of the steps above can create an `Error` which is then passed to the response handlers or available for retry. Here are a few examples of what can or cannot fail throughout the `Request` pipeline. + +1. Parameter encapsulation cannot fail. +2. Any `URLRequestConvertible` value can create an error when `asURLRequest()` is called. This allows for the initial validation of various `URLRequest` properties or the failure of parameter encoding. +3. `RequestAdapter`s can fail during adaptation, perhaps due to a missing authorization token. +4. `URLSessionTask` creation cannot fail. +5. `URLSessionTask`s can complete with errors for a variety of reasons, including network availability and cancellation. These `Error` values are passed back to the `Request`. +6. Response handlers can produce any `Error`, usually due to an invalid response or other parsing error. + +Once an error is passed to the `Request`, the `Request` will attempt to run any `RequestRetrier`s associated with the `Session` or `Request`. If any `RequestRetrier`s choose to retry the `Request`, the complete pipeline is run again. `RequestRetrier`s can also produce `Error`s, which do not trigger retry. + +### `Request` + +Although `Request` doesn’t encapsulate any particular type of request, it contains the state and functionality common to all requests Alamofire performs. This includes: + +#### State + +All `Request` types include the notion of state, indicating the major events in the `Request`’s lifetime. + +```swift +public enum State { + case initialized + case resumed + case suspended + case cancelled + case finished +} +``` + +`Request`s start in the `.initialized` state after their creation. `Request`s can be suspended, resumed, and cancelled by calling the appropriate lifetime method. + +- `resume()` resumes, or starts, a `Request`’s network traffic. If `startRequestsImmediately` is `true`, this is called automatically once a response handler has been added to the `Request`. +- `suspend()` suspends, or pauses the `Request` and its network traffic. `Request`s in this state can be resumed, but only `DownloadRequests` may be able continue transferring data. Other `Request`s will start over. +- `cancel()` cancels a `Request`. Once in this state, a `Request` cannot be resumed or suspended. When `cancel()` is called, the `Request`’s `error` property will be set with an `AFError.explicitlyCancelled` instance. + If a `Request` is resumed and isn’t later cancelled, it will reach the `.finished` state once all response validators and response serializers have been run. However, if additional response serializers are added to the `Request` after it has reached the `.finished` state, it will transition back to the `.resumed` state and perform the network request again. + +#### Progress + +In order to track the progress of a request, `Request` offers a both `uploadProgress` and `downloadProgress` properties as well as closure-based `uploadProgress` and `downloadProgress` methods. Like all closure-based `Request` APIs, the progress APIs can be chained off of the `Request` with other methods. Also like the other closure-based APIs, they should be added to a request _before_ adding any response handlers, like `responseDecodable`. + +```swift +AF.request(...) + .uploadProgress { progress in + print(progress) + } + .downloadProgress { progress in + print(progress) + } + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +Importantly, not all `Request` subclasses are able to report their progress accurately, or may have other dependencies to do so. + +- For upload progress, progress can be determined in the following ways: + - By the length of the `Data` object provided as the upload body to an `UploadRequest`. + - By the length of a file on disk provided as the upload body of an `UploadRequest`. + - By the value of the `Content-Length` header on the request, if it has been manually set. +- For download progress, there is a single requirement: - The server response must contain a `Content-Length` header. + Unfortunately there may be other, undocumented requirements for progress reporting from `URLSession` which prevents accurate progress reporting. + +#### Handling Redirects + +Alamofire’s `RedirectHandler` protocol provides control and customization of redirect handling for `Request`. In addition to per-`Session` `RedirectHandler`s, each `Request` can be given its own `RedirectHandler` which overrides any provided by the `Session`. + +```swift +let redirector = Redirector(behavior: .follow) +AF.request(...) + .redirect(using: redirector) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +> Note: Only one `RedirectHandler` can be set on a `Request`. Attempting to set more than one will result in a runtime exception. + +#### Customizing Caching + +Alamofire’s `CachedResponseHandler` protocol provides control and customization over the caching of responses. In addition to per-`Session` `CachedResponseHandler`s, each `Request` can be given its own `CachedResponseHandler` which overrides any provided by the `Session`. + +```swift +let cacher = ResponseCacher(behavior: .cache) +AF.request(...) + .cacheResponse(using: cacher) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +> Note: Only one `CachedResponseHandler` can be set on a `Request`. Attempting to set more than one will result in a runtime exception. + +#### Credentials + +In order to take advantage of the automatic credential handling provided by `URLSession`, Alamofire provides per-`Request` API to allow the automatic addition of `URLCredential` instances to requests. These include both convenience API for HTTP authentication using a username and password, as well as any `URLCredential` instance. + +Adding a credential to automatically reply to any HTTP authentication challenge is straightforward: + +```swift +AF.request(...) + .authenticate(username: "user@example.domain", password: "password") + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +> Note: This mechanism only supports HTTP authentication prompts. If a request requires an `Authentication` header for all requests, it should be provided directly, either as part of the `Request`, or through a `RequestInterceptor`. + +Additionally, adding a raw `URLCredential` is just as easy: + +```swift +let credential = URLCredential(...) +AF.request(...) + .authenticate(using: credential) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +#### Lifetime Values + +Alamofire creates a variety of underlying values throughout the lifetime of a `Request`. Most of these are internal implementation details, but the creation of `URLRequest`s and `URLSessionTask`s are exposed to allow for direct interaction with other APIs. + +##### A `Request`’s `URLRequest`s + +Each network request issued by a `Request` is ultimately encapsulated in a `URLRequest` value created from the various parameters passed to one of the `Session` request methods. `Request` will keep a copy of these `URLRequest`s in its `requests` array property. These values include both the initial `URLRequest` created from the passed parameters, as well any `URLRequest`s created by `RequestInterceptor`s. That array does not, however, include the `URLRequest`s performed by the `URLSessionTask`s issued on behalf of the `Request`. To inspect those values, the `tasks` property gives access to all of the `URLSessionTasks` performed by the `Request`. + +In addition to accumulating these values, every `Request` has an `onURLRequestCreation` method which calls a closure whenever a `URLRequest` is created for the `Request`. This `URLRequest` is the product of the initial parameters passed to the `Session`'s `request` method, as well as changes applied by any `RequestInterceptor`s. It will be called multiple times if the `Request` is retried and only one closure can be set at a time. `URLRequest` values cannot be modified in this closure; if you need to modify `URLRequest`s before they're issued, use a `RequestInterceptor` or compose your requests using the `URLRequestConvertible` protocol before passing them to Alamofire. + +```swift +AF.request(...) + .onURLRequestCreation { request in + print(request) + } + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +##### `URLSessionTask`s + +In many ways, the various `Request` subclasses act as a wrapper for a `URLSessionTask` and present specific API for interacting with the different types of tasks. These tasks are made visible on the `Request` instance through the `tasks` array property. This includes both the initial task created for the `Request`, as well as any subsequent tasks created as part of the retry process, with one task per retry. + +In addition to accumulating these values, every `Request` has an `onURLSessionTaskCreation` method which calls a closure whenever a `URLSessionTask` is created for the `Request`. This closure will be called multiple times if the `Request` is retried and only one closure can be set at a time. The provided `URLSessionTask` \*SHOULD **NOT\*** be used to interact with the `task`'s lifetime, which should only be done by the `Request` itself. Instead, you can use this method to provide the `Request`'s active `task` to other APIs, like `NSFileProvider`. + +```swift +AF.request(...) + .onURLSessionTaskCreation { task in + print(task) + } + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +#### `HTTPURLResponse`s + +Alamofire receives `HTTPURLResponse` values from its underlying `URLSession` as the session starts the connection to the server. These values can be received in an `onHTTPResponse` closure and used to determine whether the request should continue or be cancelled. Both `DataRequest` / `UploadRequest` and `DataStreamRequest` provide these hooks. + +In the case of `DataStreamRequest`, this event can be used in conjunction with the stream handlers to parse `HTTPURLResponse`s as part of the stream handling. To guarantee proper event ordering in that case, ensure the same `DispatchQueue` is used for both APIs. By default both APIs use `.main` for the completion handler, so this should only be a concern if you customize the queue used in either case. + +In the case of multiple `.onHTTPResponse` calls on a request, only the last one will be called. + +In it's simplest form `onHTTPResponse` simply provides the `HTTPURLResponse` value. + +```swift +AF.request(...) + .onHTTPResponse { response in + print(response) + } +``` + +If control over the future of the request is desired, a completion handler value is provided which returns a `Request.ResponseDisposition` value. + +```swift +AF.request(...) + .onHTTPResponse { response, completionHandler in + print(response) + completionHandler(.allow) + } +``` + +> The `completionHandler` MUST be called otherwise the request will hang until it times out. + +The `completionHandler` can also be used to cancel the request. This acts much like `cancel()` being called on the request itself. + +```swift +AF.request(...) + .onHTTPResponse { response, completionHandler in + print(response) + completionHandler(.cancel) + } +``` + +Additionally, there are forms of both versions of `onHTTPResponse` available which provide `async` closures, allowing the use of `await` in the body. These versions are available on Swift 5.7 and above. + +```swift +AF.request(...) + .onHTTPResponse { response in + await someAsyncMethod() + return .allow + } +``` + +Finally, an async stream of `HTTPURLResponse` values can also be used. + +```swift +let responses = AF.request(...).httpResponses() + +for await response in responses { + print(response) +} +``` + +#### `URLSessionTaskMetrics` + +Alamofire gathers `URLSessionTaskMetrics` values for every `URLSessionTask` performed for a `Request`. These values are available in the `metrics` property, with each value corresponding to the `URLSessionTask` in `tasks` at the same index. + +`URLSessionTaskMetrics` are also made available on Alamofire’s various response types, like `DataResponse`. For instance: + +```swift +AF.request(...) + .responseDecodable(of: DecodableType.self) { response in { + print(response.metrics) + } +``` + +> Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS < 7 is currently disabled. + +### `DataRequest` + +`DataRequest` is a subclass of `Request` which encapsulates a `URLSessionDataTask` downloading a server response into `Data` stored in memory. Therefore, it’s important to realize that extremely large downloads may adversely affect system performance. For those types of downloads, using `DownloadRequest` to save the data to disk is recommended. + +#### Additional State + +`DataRequest`s have a few properties in addition to those provided by `Request`. These include `data`, which is the accumulated `Data` from the server response, and `convertible`, which is the `URLRequestConvertible` the `DataRequest` was created with, containing the original parameters creating the instance. + +#### Validation + +`DataRequest`s do not validate responses by default. Instead, a call to `validate()` must be added to the request in order to verify various properties are valid. + +```swift +public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> Result +``` + +By default, adding `validate()` ensures the response status code is within the `200..<300` range and that the response’s `Content-Type` matches the request's `Accept` value. Validation can be further customized by passing a `Validation` closure: + +```swift +AF.request(...) + .validate { request, response, data in + ... + } +``` + +### `DataStreamRequest` + +`DataStreamRequest` is a subclass of `Request` which encapsulates a `URLSessionDataTask` and streams `Data` from an HTTP connection over time. + +#### Additional State + +`DataStreamRequest` contains no additional public state. + +#### Validation + +`DataStreamRequest`s do not validate responses by default. Instead, a call to `validate()` must be added to the request in order to verify various properties are valid. + +```swift +public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> Result +``` + +By default, adding `validate()` ensures the response status code is within the `200..<300` range and that the response’s `Content-Type` matches the request's `Accept` value. Validation can be further customized by passing a `Validation` closure: + +```swift +AF.request(...) + .validate { request, response in + ... + } +``` + +### `UploadRequest` + +`UploadRequest` is a subclass of `DataRequest` which encapsulates a `URLSessionUploadTask`, uploading a `Data` value, file on disk, or `InputStream` to a remote server. + +#### Additional State + +`UploadRequest`s have a few properties in addition to those provided by `DataRequest`. These include a `FileManager` instance, used to customize access to disk when uploading a file, and `upload`, which encapsulates both the `URLRequestConvertible` value used to describe the request, as well as the `Uploadable`, which determines the type of upload being performed. + +### `DownloadRequest` + +`DownloadRequest` is a concrete subclass of `Request` which encapsulates a `URLSessionDownloadTask`, downloading response `Data` to disk. + +#### Additional State + +`DownloadRequest`s have a few properties in addition to those provided by `Request`. These include `resumeData`, the `Data` produced when cancelling a `DownloadRequest`, which may be used to resume the download later, and `fileURL`, the `URL` at which the downloaded file is available once the download completes. + +#### Cancellation + +In addition to supporting the `cancel()` method provided by `Request`, `DownloadRequest` includes `cancel(producingResumeData shouldProduceResumeData: Bool)`, which optionally populates the `resumeData` property when cancelled, if possible, and `cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void)`, which provides the produced resume data to the passed closure. + +```swift +AF.download(...) + .cancel { resumeData in + ... + } +``` + +#### Validation + +`DownloadRequest` supports a slightly different version of validation than `DataRequest` and `UploadRequest`, due to the fact it’s data is downloaded to disk. + +```swift +public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse, _ fileURL: URL?) +``` + +Instead of accessing the downloaded `Data` directly it must be accessed using the `fileURL` provided. Otherwise, the capabilities of `DownloadRequest`’s validators are the same as `DataRequest`’s. + +## Adapting and Retrying Requests with `RequestInterceptor` + +Alamofire’s `RequestInterceptor` protocol (composed of the `RequestAdapter` and `RequestRetrier` protocols) enables powerful per-`Session` and per-`Request` capabilities. These include authentication systems, where a common header is added to every `Request` and `Request`s are retried when authorization expires. Additionally, Alamofire includes a built in `RetryPolicy` type, which enables easy retry when requests fail due to a variety of common network errors. + +### `RequestAdapter` + +Alamofire’s `RequestAdapter` protocol allows each `URLRequest` that’s to be performed by a `Session` to be inspected and mutated before being issued over the network. One very common use of an adapter is to add an `Authorization` header to requests behind a certain type of authentication. + +The `RequestAdapter` protocol has one required method: + +```swift +func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) +``` + +Its parameters include: + +- `urlRequest`: The `URLRequest` initially created from the parameters or `URLRequestConvertible` value used to create the `Request`. +- `session`: The `Session` which created the `Request` for which the adapter is being called. +- `completion`: The asynchronous completion handler that _must_ be called to indicate the adapter is finished. It’s asynchronous nature enables `RequestAdapter`s to access asynchronous resources from the network or disk before the `Request` is sent over the network. The `Result` provided to the `completion` closure can either return a `.success` value with the modified `URLRequest` value, or a `.failure` value with an associated `Error` which will then be used to fail the `Request`. + For example, adding an `Authorization` header requires modifying the `URLRequest` and then calling the completion handler. + +```swift +let accessToken: String + +func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + var urlRequest = urlRequest + urlRequest.headers.add(.authorization(bearerToken: accessToken)) + + completion(.success(urlRequest)) +} +``` + +The `RequestAdapter` also contains a second method with a default protocol extension implementation to support backwards compatibility: + +```swift +func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) +``` + +This second method uses a `RequestAdapterState` type to expose additional internal state beyond the first method including: + +- `requestID`: The `UUID` of the `Request` associated with the `URLRequest` to adapt. + +This `requestID` is very useful when trying to map custom types associated with the original `Request` to perform custom operations inside the `RequestAdapter`. + +> This second method will become the new requirement in the next MAJOR version of Alamofire. + +### `RequestRetrier` + +Alamofire’s `RequestRetrier` protocol allows a `Request` that encountered an `Error` while being executed to be retried. This includes `Error`s produced at any stage of Alamofire’s [request pipeline](#the-request-pipeline). + +`RequestRetrier` has a single requirement. + +```swift +func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) +``` + +Its parameters include: + +- `request`: The `Request` which encountered an error. +- `session`: The `Session` managing the `Request`. +- `error`: The `Error` which triggered the retry attempt. Usually an `AFError`. +- `completion`: The asynchronous completion handler that _must_ be called to indicate whether the `Request` should be retried. It must be called with a `RetryResult`. + +The `RetryResult` type represents the outcome of whatever logic is implemented in the `RequestRetrier`. It’s defined as: + +```swift +/// Outcome of determination whether retry is necessary. +public enum RetryResult { + /// Retry should be attempted immediately. + case retry + /// Retry should be attempted after the associated `TimeInterval`. + case retryWithDelay(TimeInterval) + /// Do not retry. + case doNotRetry + /// Do not retry due to the associated `Error`. + case doNotRetryWithError(Error) +} +``` + +For example, Alamofire’s `RetryPolicy` type will automatically retry `Request`s that fail due to a network error of some kind, if the request is idempotent. + +```swift +open func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + if request.retryCount < retryLimit, + let httpMethod = request.request?.method, + retryableHTTPMethods.contains(httpMethod), + shouldRetry(response: request.response, error: error) { + let timeDelay = pow(Double(exponentialBackoffBase), Double(request.retryCount)) * exponentialBackoffScale + completion(.retryWithDelay(timeDelay)) + } else { + completion(.doNotRetry) + } +} +``` + +### Using Multiple `RequestInterceptor`s + +Alamofire supports the use of multiple `RequestInterceptor`s at both the `Session` and `Request` levels through the use of the `Interceptor` type. `Interceptor`s can be composed of adapter and retrier closures, a single combination of a `RequestAdapter` and `RequestRetrier`, or a combination of arrays of `RequestAdapter`s, `RequestRetrier`s, and `RequestInterceptor`s. + +```swift +let adapter = // Some RequestAdapter +let retrier = // Some RequestRetrier +let interceptor = // Some RequestInterceptor + +let adapterAndRetrier = Interceptor(adapter: adapter, retrier: retrier) +let composite = Interceptor(interceptors: [adapterAndRetrier, interceptor]) +``` + +When composed of multiple `RequestAdapter`s, `Interceptor` will call each `RequestAdapter` in succession. If they all succeed, the final `URLRequest` out of the chain of `RequestAdapter`s will be used to perform the request. If one fails, adaptation stops and the `Request` fails with the error returned. Similarly, when composed of multiple `RequestRetrier`s, retries are executed in the same order as the retriers were added to the instance, until either all of them complete or one of them fails with an error. + +### `AuthenticationInterceptor` + +Alamofire's `AuthenticationInterceptor` class is a `RequestInterceptor` designed to handle the queueing and threading complexity involved with authenticating requests. +It leverages an injected `Authenticator` protocol that manages the lifecycle of the matching `AuthenticationCredential`. +Here is a simple example of how an `OAuthAuthenticator` class could be implemented along with an `OAuthCredential`. + +**`OAuthCredential`** + +```swift +struct OAuthCredential: AuthenticationCredential { + let accessToken: String + let refreshToken: String + let userID: String + let expiration: Date + + // Require refresh if within 5 minutes of expiration + var requiresRefresh: Bool { Date(timeIntervalSinceNow: 60 * 5) > expiration } +} +``` + +**`OAuthAuthenticator`** + +```swift +class OAuthAuthenticator: Authenticator { + func apply(_ credential: OAuthCredential, to urlRequest: inout URLRequest) { + urlRequest.headers.add(.authorization(bearerToken: credential.accessToken)) + } + + func refresh(_ credential: OAuthCredential, + for session: Session, + completion: @escaping (Result) -> Void) { + // Refresh the credential using the refresh token...then call completion with the new credential. + // + // The new credential will automatically be stored within the `AuthenticationInterceptor`. Future requests will + // be authenticated using the `apply(_:to:)` method using the new credential. + } + + func didRequest(_ urlRequest: URLRequest, + with response: HTTPURLResponse, + failDueToAuthenticationError error: Error) -> Bool { + // If authentication server CANNOT invalidate credentials, return `false` + return false + + // If authentication server CAN invalidate credentials, then inspect the response matching against what the + // authentication server returns as an authentication failure. This is generally a 401 along with a custom + // header value. + // return response.statusCode == 401 + } + + func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: OAuthCredential) -> Bool { + // If authentication server CANNOT invalidate credentials, return `true` + return true + + // If authentication server CAN invalidate credentials, then compare the "Authorization" header value in the + // `URLRequest` against the Bearer token generated with the access token of the `Credential`. + // let bearerToken = HTTPHeader.authorization(bearerToken: credential.accessToken).value + // return urlRequest.headers["Authorization"] == bearerToken + } +} +``` + +**Usage** + +```swift +// Generally load from keychain if it exists +let credential = OAuthCredential(accessToken: "a0", + refreshToken: "r0", + userID: "u0", + expiration: Date(timeIntervalSinceNow: 60 * 60)) + +// Create the interceptor +let authenticator = OAuthAuthenticator() +let interceptor = AuthenticationInterceptor(authenticator: authenticator, + credential: credential) + +// Execute requests with the interceptor +let session = Session() +let urlRequest = URLRequest(url: URL(string: "https://api.example.com/example/user")!) +session.request(urlRequest, interceptor: interceptor) +``` + +### Compressing Request Body Data With `DeflateRequestCompressor` + +When sending requests with very large bodies, such as large JSON objects (hundreds of KB or more, but not data that's already compressed, like images), it may be beneficial for performance and the user's data usage to compress outgoing request bodies. The `DeflateRequestCompressor` `RequestInterceptor` can be used to perform such compression using the `deflate` `Content-Encoding`. + +Adding a compressor to a `Request` can be done like any other `RequestInterceptor`: + +```swift +session.request(..., interceptor: .deflateCompressor) +``` + +If there are other uses of the `Content-Encoding` header in the request pipeline, it may be necessary to customize `DeflateRequestCompressor`'s behavior when it encounters a request that already has such a header. In that case you can provide a `DuplicateHeaderBehavior` value to determine what should happen. By default `DeflateRequestCompressor` will produce a `DuplicateHeaderError` that will fail the request. + +```swift +/// Type that determines the action taken when the `URLRequest` already has a `Content-Encoding` header. +public enum DuplicateHeaderBehavior { + /// Throws a `DuplicateHeaderError`. The default. + case error + /// Replaces the existing header value with `deflate`. + case replace + /// Silently skips compression when the header exists. + case skip +} +``` + +This value can be provided when creating a compressor: + +```swift +session.request(..., interceptor: .deflateCompressor(duplicateHeaderBehavior: .replace)) +``` + +Adding a compressor is only suggested for requests which are known to produce large body data, but the compressor can also be added `Session` instances directly. In that case the `shouldCompressBodyData` closure should be used to determine whether or not to apply compression. This would usually be based on the overall size of the body data. + +```swift +let compressor = DeflateRequestCompressor { bodyData in + bodyData.count > 100 * 1024 // Only compress when bodyData exceeds 100KB. +} + +let session = Session(..., interceptor: compressor) +``` + +The most beneficial compression limit will be determined by the user's network capacity (if users are usually on 5G or wifi, request compression is less valuable) and typical device (audiences with older devices may be more impacted by compression), so testing should be done to determine whether compression is valuable and what the limit should be. + +## Security + +Using a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire receives the same automatic TLS certificate and certificate chain validation as `URLSession`. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by Alamofire’s `ServerTrustEvaluating` protocol. + +### Evaluating Server Trusts with `ServerTrustManager` and `ServerTrustEvaluating` + +#### `ServerTrustEvaluating` + +The `ServerTrustEvaluating` protocol provides a way to perform any sort of server trust evaluation. It has a single requirement: + +```swift +func evaluate(_ trust: SecTrust, forHost host: String) throws +``` + +This method provides the [`SecTrust`](https://developer.apple.com/documentation/security/certificate_key_and_trust_services/trust) value and host `String` received from the underlying `URLSession` and provides the opportunity to perform various evaluations. + +Alamofire includes many different types of trust evaluators, providing composable control over the evaluation process: + +- `DefaultTrustEvaluator`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge. +- `RevocationTrustEvaluator`: Checks the status of the received certificate to ensure it hasn’t been revoked. This isn’t usually performed on every request due to the network request overhead it entails. +- `PinnedCertificatesTrustEvaluator`: Uses the provided certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates. This evaluator can also accept self-signed certificates. +- `PublicKeysTrustEvaluator`: Uses the provided public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys. +- `CompositeTrustEvaluator`: Evaluates an array of `ServerTrustEvaluating` values, only succeeding if all of them are successful. This type can be used to combine, for example, the `RevocationTrustEvaluator` and the `PinnedCertificatesTrustEvaluator`. +- `DisabledTrustEvaluator`: This evaluator should only be used in debug scenarios as it disables all evaluation which in turn will always consider any server trust as valid. This evaluator should **never** be used in production environments! + +#### `ServerTrustManager` + +The `ServerTrustManager` is responsible for storing an internal mapping of `ServerTrustEvaluating` values to a particular host. This allows Alamofire to evaluate each host with different evaluators. + +```swift +let evaluators: [String: ServerTrustEvaluating] = [ + // By default, certificates included in the app bundle are pinned automatically. + "cert.example.com": PinnedCertificatesTrustEvaluator(), + // By default, public keys from certificates included in the app bundle are used automatically. + "keys.example.com": PublicKeysTrustEvaluator(), +] + +let manager = ServerTrustManager(evaluators: evaluators) +``` + +This `ServerTrustManager` will have the following behaviors: + +- `cert.example.com` will always use certificate pinning with default and host validation enabled , thus requiring the following criteria to be met in order to allow the TLS handshake to succeed: + - Certificate chain _must_ be valid. + - Certificate chain _must_ include one of the pinned certificates. + - Challenge host _must_ match the host in the certificate chain's leaf certificate. +- `keys.example.com` will always use public key pinning with default and host validation enabled, thus requiring the following criteria to be met in order to allow the TLS handshake to succeed: + - Certificate chain _must_ be valid. + - Certificate chain _must_ include one of the pinned public keys. + - Challenge host _must_ match the host in the certificate chain's leaf certificate. +- Requests to other hosts will produce an error, as `ServerTrustManager` requires all hosts to be evaluated by default. + +##### Subclassing `ServerTrustManager` + +If you find yourself needing more flexible server trust policy matching behavior (i.e. wildcard domains), then subclass the `ServerTrustManager` and override the `serverTrustEvaluator(forHost:)` method with your own custom implementation. + +```swift +final class CustomServerTrustManager: ServerTrustManager { + override func serverTrustEvaluator(forHost host: String) -> ServerTrustEvaluating? { + var policy: ServerTrustPolicy? + + // Implement your custom domain matching behavior... + + return policy + } +} +``` + +### App Transport Security + +With the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustManager` with several `ServerTrustEvaluating` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust. If you run into this problem (high probability with self-signed certificates), you can work around this issue by adding [`NSAppTransportSecurity` overrides](https://developer.apple.com/documentation/bundleresources/information_property_list/nsapptransportsecurity) to your `Info.plist`. You can use the `nscurl` tool’s `--ats-diagnostics` option to perform a series of tests against a host to see which ATS overrides might be required. + +#### Using Self-Signed Certificates with Local Networking + +If you are attempting to connect to a server running on your localhost, and you are using self-signed certificates, you will need to add the following to your `Info.plist`. + +```xml + + NSAppTransportSecurity + + NSAllowsLocalNetworking + + + +``` + +According to [Apple documentation](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW35), setting `NSAllowsLocalNetworking` to `YES` allows loading local resources without disabling ATS for the rest of your app. + +## Customizing Caching and Redirect Handling + +`URLSession` allows the customization of caching and redirect behaviors using `URLSessionDataDelegate` and `URLSessionTaskDelegate` methods. Alamofire surfaces these customization points as the `CachedResponseHandler` and `RedirectHandler` protocols. + +### `CachedResponseHandler` + +The `CachedResponseHandler` protocol allows control over the caching of HTTP responses into the `URLCache` instance associated with the `Session` making a request. The protocol has a single requirement: + +```swift +func dataTask(_ task: URLSessionDataTask, + willCacheResponse response: CachedURLResponse, + completion: @escaping (CachedURLResponse?) -> Void) +``` + +As can be seen in the method signature, this control only applies to `Request`s that use an underlying `URLSessionDataTask` for network transfers, which include `DataRequest`s and `UploadRequest`s (since `URLSessionUploadTask` is a subclass of `URLSessionDataTask`). The conditions under which a response will be considered for caching are extensive, so it’s best to review the documentation of the `URLSessionDataDelegate` method [`urlSession(_:dataTask:willCacheResponse:completionHandler:)`](https://developer.apple.com/documentation/foundation/urlsessiondatadelegate/1411612-urlsession). Once a response is considered for caching, there are variety of valuable manipulations that can be made: + +- Prevent caching the response altogether by returning a `nil` `CachedURLResponse`. +- Modify the `CachedURLResponse`’s `storagePolicy` to change where the cached value should live. +- Modify the underlying `URLResponse` directly, adding or removing values. +- Modify the `Data` associated with the response, if any. + +Alamofire includes the `ResponseCacher` type which conforms to `CachedResponseHandler`, making it easy to cache, not cache, or modify a response. `ResponseCacher` takes a `Behavior` value to control the caching behavior. + +```swift +public enum Behavior { + /// Stores the cached response in the cache. + case cache + /// Prevents the cached response from being stored in the cache. + case doNotCache + /// Modifies the cached response before storing it in the cache. + case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?) +} +``` + +`ResponseCacher` can be used on both a `Session` and `Request` basis, as outlined above. + +### `RedirectHandler` + +The `RedirectHandler` protocol allows control over the redirect behavior of particular `Request`s. It has a single requirement: + +```swift +func task(_ task: URLSessionTask, + willBeRedirectedTo request: URLRequest, + for response: HTTPURLResponse, + completion: @escaping (URLRequest?) -> Void) +``` + +This method provides an opportunity to modify the redirected `URLRequest` or pass `nil` to disable the redirect entirely. Alamofire provides the `Redirector`type which conforms to `RedirectHandler`, making it easy to follow, not follow, or modify a redirected request. `Redirector` takes a `Behavior` value to control the redirect behavior. + +```swift +public enum Behavior { + /// Follow the redirect as defined in the response. + case follow + /// Do not follow the redirect defined in the response. + case doNotFollow + /// Modify the redirect request defined in the response. + case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) +} +``` + +`Redirector` can be used on both a `Session` and `Request` basis, as outlined above. + +## Using `EventMonitor`s + +The `EventMonitor` protocol allows the observation and inspection of a large number of internal Alamofire events. These include all `URLSessionDelegate`, `URLSessionTaskDelegate`, and `URLSessionDownloadDelegate` methods implemented by Alamofire as well as a large number of internal `Request` events. In addition to these events, which by default are an empty method that does no work, the `EventMonitor` protocol also requires a `DispatchQueue` on which all the events are dispatched in order to maintain performance. This `DispatchQueue` defaults to `.main`, but dedicated serial queues are recommended for any custom conforming types. + +### Logging + +Perhaps the biggest use of the `EventMonitor` protocol is to implement the logging of relevant events. A simple implementation may look something like this: + +```swift +final class Logger: EventMonitor { + let queue = DispatchQueue(label: ...) + + // Event called when any type of Request is resumed. + func requestDidResume(_ request: Request) { + print("Resuming: \(request)") + } + + // Event called whenever a DataRequest has parsed a response. + func request(_ request: DataRequest, didParseResponse response: DataResponse) { + debugPrint("Finished: \(response)") + } +} +``` + +This `Logger` type can be added to a `Session` in the same way demonstrated above: + +```swift +let logger = Logger() +let session = Session(eventMonitors: [logger]) +``` + +## Making Requests + +As a framework, Alamofire has two main goals: + +1. To enable the easy implementation of network requests for prototypes and tools +2. To serve as the generic foundation of app networking + +It accomplishes these goals through the use of powerful abstractions, providing useful defaults, and included implementations of common tasks. However, once use of Alamofire has gone beyond a few requests, it’s necessary to move beyond the high level, default implementations into behavior customized for particular applications. Alamofire provides the `URLConvertible` and `URLRequestConvertible` protocols to help with this customization. + +### `URLConvertible` + +Types adopting the `URLConvertible` protocol can be used to construct URLs, which are then used to construct URL requests internally. `String`, `URL`, and `URLComponents` conform to `URLConvertible` by default, allowing any of them to be passed as `url` parameters to the `request`, `upload`, and `download` methods: + +```swift +let urlString = "https://httpbin.org/get" +AF.request(urlString) + +let url = URL(string: urlString)! +AF.request(url) + +let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)! +AF.request(urlComponents) +``` + +Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLConvertible` as a convenient way to map domain-specific models to server resources. + +### `URLRequestConvertible` + +Types adopting the `URLRequestConvertible` protocol can be used to construct `URLRequest`s. `URLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly. Alamofire uses `URLRequestConvertible` as the foundation of all requests flowing through the request pipeline. Using `URLRequest`s directly is the recommended way to customize `URLRequest` creation outside of the `ParameterEncoder`s that Alamofire provides. + +```swift +let url = URL(string: "https://httpbin.org/post")! +var urlRequest = URLRequest(url: url) +urlRequest.method = .post + +let parameters = ["foo": "bar"] + +do { + urlRequest.httpBody = try JSONEncoder().encode(parameters) +} catch { + // Handle error. +} + +urlRequest.headers.add(.contentType("application/json")) + +AF.request(urlRequest) +``` + +Applications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage other state. + +### Routing Requests + +As apps grow in size, it's important to adopt common patterns as you build out your network stack. An important part of that design is how to route your requests. The Alamofire `URLConvertible` and `URLRequestConvertible` protocols along with the `Router` design pattern are here to help. + +A “router” is a type that defines “routes”, or the components of a request. These components can include the parts of a `URLRequest`, the parameters required to make a request, as well as various per-request Alamofire settings. A simple router could look something like this: + +```swift +enum Router: URLRequestConvertible { + case get, post + + var baseURL: URL { + return URL(string: "https://httpbin.org")! + } + + var method: HTTPMethod { + switch self { + case .get: return .get + case .post: return .post + } + } + + var path: String { + switch self { + case .get: return "get" + case .post: return "post" + } + } + + func asURLRequest() throws -> URLRequest { + let url = baseURL.appendingPathComponent(path) + var request = URLRequest(url: url) + request.method = method + + return request + } +} + +AF.request(Router.get) +``` + +More complex routers may include the parameters of a request. With Alamofire’s `ParameterEncoder` protocol and included encoders, any `Encodable` type can be used as parameters: + +```swift +enum Router: URLRequestConvertible { + case get([String: String]), post([String: String]) + + var baseURL: URL { + return URL(string: "https://httpbin.org")! + } + + var method: HTTPMethod { + switch self { + case .get: return .get + case .post: return .post + } + } + + var path: String { + switch self { + case .get: return "get" + case .post: return "post" + } + } + + func asURLRequest() throws -> URLRequest { + let url = baseURL.appendingPathComponent(path) + var request = URLRequest(url: url) + request.method = method + + switch self { + case let .get(parameters): + request = try URLEncodedFormParameterEncoder().encode(parameters, into: request) + case let .post(parameters): + request = try JSONParameterEncoder().encode(parameters, into: request) + } + + return request + } +} +``` + +Routers can be expanded for any number of endpoints with any number of configurable properties, but once a certain level of complexity has been reached, separating one big router into smaller routers for parts of an API should be considered. + +## Response Handling + +Alamofire provides response handling through various `response` methods and the `ResponseSerializer` protocol. + +### Handling Responses Without Serialization + +Both `DataRequest` and `DownloadRequest` offer methods that allow response handling without invoking any `ResponseSerializer` at all. This is most important for `DownloadRequest`s where loading large files into memory may not be possible. + +```swift +// DataRequest +func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// DownloadRequest +func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self +``` + +As with all response handlers, all serialization work (in this case none) is performed on an internal queue and the completion handler called on the `queue` passed to the method. This means that it’s not necessary to dispatch back to the `main` queue by default. However, if there is to be any significant work performed in the completion handler, passing a custom queue to the response methods is recommended, with a dispatch back to `main` in the handler itself if necessary. + +### `ResponseSerializer` + +The `ResponseSerializer` protocol is composed of the `DataResponseSerializerProtocol` and `DownloadResponseSerializerProtocol` protocols. The combined version of `ResponseSerializer` looks like this: + +```swift +public protocol ResponseSerializer: DataResponseSerializerProtocol & DownloadResponseSerializerProtocol { + /// The type of serialized object to be created. + associatedtype SerializedObject + + /// `DataPreprocessor` used to prepare incoming `Data` for serialization. + var dataPreprocessor: DataPreprocessor { get } + /// `HTTPMethod`s for which empty response bodies are considered appropriate. + var emptyRequestMethods: Set { get } + /// HTTP response codes for which empty response bodies are considered appropriate. + var emptyResponseCodes: Set { get } + + func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject + func serializeDownload(request: URLRequest?, + response: HTTPURLResponse?, + fileURL: URL?, + error: Error?) throws -> SerializedObject +} +``` + +By default, the `serializeDownload` method is implemented by reading the downloaded `Data` from disk and calling `serialize` with it. Therefore, it may be more appropriate to implement custom handling for large downloads using `DownloadRequest`’s `response(queue:completionHandler:)` method mentioned above. + +`ResponseSerializer` provides various default implementations for the `dataPreprocessor`, `emptyResponseMethods`, and `emptyResponseCodes` which can be customized in conforming types, like various `ResponseSerializer`s included with Alamofire. + +All `ResponseSerializer` usage flows through methods on `DataRequest` and `DownloadRequest`: + +```swift +// DataRequest +func response( + queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// DownloadRequest +func response( + queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self +``` + +Alamofire includes a few common responses handlers, including: + +- `responseData(queue:completionHandler:)`: Validates and preprocesses the response `Data` using `DataResponseSerializer`. +- `responseString(queue:encoding:completionHandler:)`: Parses the response `Data` as a `String` using the provided `String.Encoding`. +- `responseDecodable(of:queue:decoder:completionHandler:)`: Parses the response `Data` into the provided or inferred `Decodable` type using the provided `DataDecoder`. Uses `JSONDecoder` by default. Recommend method for JSON and generic response parsing. + +#### `DataResponseSerializer` + +Calling `responseData(queue:completionHandler:)` on `DataRequest` or `DownloadRequest` uses a `DataResponseSerializer` to validate that `Data` has been returned appropriately (no empty responses unless allowed by the `emptyResponseMethods` and `emptyResponseCodes`) and passes that `Data` through the `dataPreprocessor`. This response handler is useful for customized `Data` handling but isn’t usually necessary. + +#### `StringResponseSerializer` + +Calling `responseString(queue:encoding:completionHandler:)` on `DataRequest` or `DownloadRequest` uses a `StringResponseSerializer` to validate that `Data` has been returned appropriately (no empty responses unless allowed by the `emptyResponseMethods` and `emptyResponseCodes`) and passes that `Data` through the `dataPreprocessor`. The preprocessed `Data` is then used to initialize a `String` using the `String.Encoding` parsed from the `HTTPURLResponse`. + +#### `DecodableResponseSerializer` + +Calling `responseDecodable(of:queue:decoder:completionHandler:)` on `DataRequest` or `DownloadRequest` uses a `DecodableResponseSerializer`to validate that `Data` has been returned appropriately (no empty responses unless allowed by the `emptyResponseMethods` and `emptyResponseCodes`) and passes that `Data` through the `dataPreprocessor`. The preprocessed `Data` is then passed through the provided `DataDecoder` and parsed into the provided or inferred `Decodable` type. + +### Customizing Response Handlers + +In addition to the flexible `ResponseSerializer`s included with Alamofire, there are additional ways to customize response handling. + +#### Response Transforms + +Using an existing `ResponseSerializer` and then transforming the output is one of the simplest ways of customizing response handlers. Both `DataResponse` and `DownloadResponse` have `map`, `tryMap`, `mapError`, and `tryMapError` methods that can transform responses while preserving the metadata associated with the response. For example, extracting a property from a `Decodable` response can be achieved using `map`, while also preserving any previous parsing errors. + +```swift +AF.request(...).responseDecodable(of: DecodableType.self) { response in + let propertyResponse = response.map { $0.someProperty } + + debugPrint(propertyResponse) +} +``` + +Transforms that throw errors can also be used with `tryMap`, perhaps to perform validation: + +```swift +AF.request(..).responseDecodable(of: DecodableType.self) { response in + let propertyResponse = response.tryMap { try $0.someProperty.validated() } + + debugPrint(propertyResponse) +} +``` + +#### Creating a Custom Response Serializer + +When Alamofire’s provided `ResponseSerializer`s or response transforms aren’t flexible enough, or the amount of customization is extensive, creating a `ResponseSerializer` is a good way to encapsulate that logic. There are usually two parts to integrating a custom `ResponseSerializer`: creating the conforming type and extending the relevant `Request` type(s) to make it convenient to use. For example, if a server returned a specially encoded `String`, perhaps values separated by commas, the `ResponseSerializer` for such a format could look something like this: + +```swift +struct CommaDelimitedSerializer: ResponseSerializer { + func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> [String] { + // Call the existing StringResponseSerializer to get many behaviors automatically. + let string = try StringResponseSerializer().serialize(request: request, + response: response, + data: data, + error: error) + + return Array(string.split(separator: ",")) + } +} +``` + +Note that the `SerializedObject` `associatedtype` requirement is met by the return type of the `serialize` method. In more complex serializers, this return type itself can be generic, allowing the serialization of generic types, as seen by the `DecodableResponseSerializer`. + +To make the `CommaDelimitedSerializer` more useful, additional behaviors could be added, like allowing the customization of empty HTTP methods and response codes by passing them through to the underlying `StringResponseSerializer`. + +### Streaming Response Handlers + +`DataStreamRequest` uses its own unique response handler type to process incoming `Data` as part of a stream. In addition to the provided handlers, custom serialization can be performed through the use of the `DataStreamSerializer` protocol. + +```swift +public protocol DataStreamSerializer { + /// Type produced from the serialized `Data`. + associatedtype SerializedObject + + /// Serializes incoming `Data` into a `SerializedObject` value. + /// + /// - Parameter data: `Data` to be serialized. + /// + /// - Throws: Any error produced during serialization. + func serialize(_ data: Data) throws -> SerializedObject +} +``` + +Any custom `DataStreamSerializer` can be used to process streaming `Data` by using the `responseStream` method: + +```swift +AF.streamRequest(...).responseStream(using: CustomSerializer()) { stream in + // Process stream. +} +``` + +Alamofire includes `DecodableStreamSerializer`, a `DataStreamSerializer` which can parse `Decodable` types from incoming `Data`. It can be customized with both a `DataDecoder` instance and a `DataPreprocessor` and used through the `responseStreamDecodable` method: + +```swift +AF.streamRequest(...).responseDecodable(of: DecodableType.self) { stream in + // Process stream. +} +``` + +Or by using it directly in the previously mentioned `streamResponse` method: + +```swift +AF.streamRequest(...).responseStream(using: DecodableStreamSerializer(decoder: JSONDecoder())) { stream in + // Process stream. +} +``` + +## Using Alamofire with Combine + +On systems supporting the Combine framework, Alamofire offers the ability to publish responses using a custom `Publisher` type. These publishers work much like Alamofire's response handlers. They are chained onto requests and, like response handlers, should come after other API like `validate()`. For example: + +```swift +AF.request(...).publishDecodable(type: DecodableType.self) +``` + +This code produces a `DataResponsePublisher` value which will publish a `DataResponse` value. Like all Alamofire `Publisher`s, `DataResponsePublisher` is fully lazy, meaning that will only add the response handler and `resume` the request once a downstream `Subscriber` has made demand for values. It only provides one value and cannot be retried. + +> To properly handle retry when using Alamofire's `Publisher`s, use Alamofire's built in retry mechanisms, as explained [above](#adapting-and-retrying-requests-with-requestinterceptor). + +Additionally, `DataResponsePublisher` provides the ability to transform the outgoing `DataResponse` into a `Result` value or a `Success` value with `Failure` error. For example: + +```swift +let publisher = AF.request(...).publishDecodable(type: DecodableType.self) +let resultPublisher = publisher.result() // Provides an AnyPublisher, Never>. +let valuePublisher = publisher.value() // Provides an AnyPublisher. +``` + +As with any `Publisher`, `DataResponsePublisher` can be used with various Combine APIs, allow Alamofire to support easy simultaneous requests for the first time. + +```swift +// All usage of cancellable Combine API must have its token stored to maintain the subscription. +var tokens: Set = [] + +... + +let first = AF.request(...).publishDecodable(type: First.self) +let second = AF.request(...).publishDecodable(type: Second.self) +let both = Publishers.CombineLatest(first, second) +both.sink { first, second in // DataResponse, DataResponse + debugPrint(first) + debugPrint(second) +} +.store(in: &tokens) +``` + +Sequential requests are also possible: + +```swift +// All usage of cancellable Combine API must have its token stored to maintain the subscription. +var tokens: Set = [] + +... + +AF.request(...) + .publishDecodable(type: First.self) + .value() + .flatMap { + AF.request(...) // Use First value to create second request. + .publishDecodable(type: Second.self) + } + .sink { second in // DataResponse + debugPrint(second) + } + .store(in: &tokens) +``` + +Once subscribed, this chain of transformations will make the first request and then create a publisher for a second, finishing when the second request has finished. + +> As with all Combine usage, care must be taken to ensure that subscriptions are not cancelled early by maintaining the lifetime of the `AnyCancellable` tokens returned by functions like `sink`. If a request is cancelled prematurely, the response's error will be set to `AFError.explicitlyCancelled`. + +#### `DownloadResponsePublisher` + +Alamofire also offers a `Publisher` for `DownloadRequest`s, `DownloadResponsePublisher`. Its behavior and capabilities are the same as `DataResponsePublisher`. + +Like most `DownloadRequest`'s response handlers, `DownloadResponsePublisher` reads `Data` from disk to perform serialization, which can impact system performance if reading a large amount of `Data`. It's recommended you use `publishUnserialized()` to receive just the `URL?` that the file was downloaded to and perform your own read from disk for large files. + +#### `DataStreamPublisher` + +`DataStreamPublisher` is a `Publisher` for `DataStreamRequest`s. Like `DataStreamRequest` itself, and unlike Alamofire's other `Publisher`s, `DataStreamPublisher` can return multiple values serialized from `Data` received from the network, as well as a final completion event. For more information on how `DataStreamRequest` works, please see our [detailed usage documentation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#streaming-data-from-a-server). + +## Using Alamofire with Swift Concurrency + +Swift's concurrency features, released in Swift 5.5, provide fundamental asynchronous building blocks in the language, including `async`-`await` syntax, `Task`s, and actors. Alamofire provides extensions allowing the use of common Alamofire APIs with Swift's concurrency features. + +> Alamofire's concurrency support requires Swift 5.6.0 or Xcode 13.3.1 due to bugs with older Swift 5.5 compilers and Xcode versions. These examples also include the use of static protocol values added in Alamofire 5.5 for Swift 5.5. + +### `DataRequest` and `UploadRequest` Support + +Alamofire's concurrency support works by vending various `*Task` types, like `DataTask`, `DownloadTask`, and `DataStreamTask`. These types work similarly to Alamofire's existing response handlers and convert the standard completion handlers into `async` properties which can be `await`ed. For example, `DataRequest` (and `UploadRequest`, which inherits from `DataRequest`) can provide a `DataTask` used to `await` any of the asynchronous values: + +```swift +let value = try await AF.request(...).serializingDecodable(TestResponse.self).value +``` + +This code synchronously produces a `DataTask` value which can be used to `await` any part of the resulting `DataResponse`. Each `DataTask` can be used to `await` any of these properties as many times as needed. For example: + +```swift +let dataTask = AF.request(...).serializingDecodable(TestResponse.self) +// Later... +let response = await dataTask.response // Returns full DataResponse +// Elsewhere... +let result = await dataTask.result // Returns Result +// And... +let value = try await dataTask.value // Returns the TestResponse or throws the AFError as an Error +``` + +Similarly, and like Alamofire's existing closure and publisher-based response handlers, each request can produce multiple tasks that perform the same or different serializations. + +```swift +let request = AF.request(...) +// Later... +let stringResponse = await request.serializingString().response +// Elsewhere... +let decodableResponse = await request.serializingDecodable(TestResponse.self).response +``` + +Finally, like all Swift Concurrency APIs, these `await`able properties can be used to `await` multiple requests issued in parallel. For example: + +```swift +async let first = AF.request(...).serializingDecodable(TestResponse.self).response +async let second = AF.request(...).serializingString().response +async let third = AF.request(...).serializingData().response + +// Later... + +// Produces (DataResponse, DataResponse, DataResponse) +// when all requests are complete. +let responses = await (first, second, third) +``` + +Alamofire's concurrency APIs can also be used with other builtin concurrency constructs like `Task` and `TaskGroup`. + +### `DownloadRequest` Support + +Like `DataRequest`, `DownloadRequest` vends its own `DownloadTask` value which can be used to `await` the completion of the request. Like the existing response handlers, the `DownloadTask` will read the downloaded `Data` from disk, so if the `Data` is very large it's best to simply get the `URL` and read the `Data` in a way that won't read it all into memory at once. + +```swift +let url = try await AF.download(...).serializingURL().value +``` + +### Automatic Cancellation + +By default, `DataTask` and `DownloadTask` values do not cancel the underlying request when an enclosing concurrent context is cancelled. This means that request will complete even if the enclosing context is explicitly cancelled. For example: + +```swift +let request = AF.request(...) // Creates the DataRequest. +let task = Task { // Produces a `Task, Never> value. + await request.serializingDecodable(TestResponse.self).response +} + +// Later... + +task.cancel() // task is cancelled, but the DataRequest created inside it is not. +print(task.isCancelled) // true +print(request.isCancelled) // false +``` + +If automatic cancellation is desired, it can be configured when creating the `DataTask` or `DownloadTask`. For example: + +```swift +let request = AF.request(...) // Creates the DataRequest. +let task = Task { // Produces a `Task, Never> value. + await request.serializingDecodable(TestResponse.self, automaticallyCancelling: true).response +} + +// Later... + +task.cancel() // task is cancelled. +print(task.isCancelled) // true +print(request.isCancelled) // true +``` + +This automatic cancellation only takes affect when one of the asynchronous properties is `await`ed. + +### `DataStreamRequest` Support + +`DataStreamRequest`, unlike the other request types, does not read a single value and complete. Instead, it continuously streams `Data` from the server to be processed through a handler. With Swift Concurrency, this callback API has been replaced with `StreamOf` values vended by `DataStreamTask`. `StreamOf` conforms to `AsyncSequence`, allowing the use of `for await` syntax to observe values as they're received by the stream. Unlike `DataTask` and `DownloadTask`, `DataStreamTask` doesn't vend asynchronous properties itself. Instead, it vends the streams that can be observed. + +```swift +let streamTask = AF.dataStreamRequest(...).streamTask() + +// Later... + +for await data in streamTask.streamingData() { + // Streams Stream values. a.k.a StreamOf> +} +``` + +This loop only ends when the `DataStreamRequest` completes, either through the server closing the connection or the `DataStreamRequest` being cancelled. If the loop is ended early by `break`ing out of it, the `DataStreamRequest` is canceled and no further values can be received. If the use of multiple observers without automatically cancellation is desired, you can pass `false` for the `automaticallyCancelling` parameter. + +```swift +let streamTask = AF.dataStreamRequest(...).streamTask() + +// Later... + +for await data in streamTask.streamingData(automaticallyCancelling: false) { + // Streams Stream values. a.k.a StreamOf> + if condition { break } // Stream ends but underlying `DataStreamRequest` is not cancelled and keeps receiving data. +} +``` + +One observer setting `automaticallyCancelling` to `false` does not affect other from the same `DataStreamRequest`, so if any other observer exits the request will still be cancelled. + +### Value Stream Handlers + +Alamofire provides various handlers for internal values which are produced asynchronously, such as `Progress` values, `URLRequest`s and `URLSessionTask`s, as well as cURL descriptions of the request each time a new request is issued. Alamofire's concurrency support now exposes these handlers as `StreamOf` values that can be used to asynchronously observe the received values. For instance, if you wanted to print each cURL description produced by a request: + +```swift +let request = AF.request(...) + +// Later... + +for await description in request.cURLDescriptions() { + print(description) +} +``` + +## Network Reachability + +The `NetworkReachabilityManager` listens for changes in the reachability of hosts and addresses for both Cellular and WiFi network interfaces. + +```swift +let manager = NetworkReachabilityManager(host: "www.apple.com") + +manager?.startListening { status in + print("Network Status Changed: \(status)") +} +``` + +> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported. +> Also, do not include the scheme in the `host` string or reachability won't function correctly. + +There are some important things to remember when using network reachability to determine what to do next. + +- **DO NOT** use Reachability to determine if a network request should be sent. + - You should **ALWAYS** send it. +- When reachability is restored, use the event to retry failed network requests. + - Even though the network requests may still fail, this is a good moment to retry them. +- The network reachability status can be useful for determining why a network request may have failed. + - If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical error, such as "request timed out." + +Alternatively, using a `RequestRetrier`, like the built in `RetryPolicy`, instead of reachability updates to retry requests which failed to a network failure will likely be simpler and more reliable. By default, `RetryPolicy` will retry idempotent requests on a variety of error conditions, including an offline network connection. diff --git a/Carthage/Checkouts/Alamofire/Documentation/Alamofire 2.0 Migration Guide.md b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 2.0 Migration Guide.md new file mode 100644 index 00000000..57169069 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 2.0 Migration Guide.md @@ -0,0 +1,202 @@ +# Alamofire 2.0 Migration Guide + +Alamofire 2.0 is the latest major release of Alamofire, an HTTP networking library for iOS, Mac OS X and watchOS written in Swift. As a major release, following Semantic Versioning conventions, 2.0 introduces several API-breaking changes that one should be aware of. + +This guide is provided in order to ease the transition of existing applications using Alamofire 1.x to the latest APIs, as well as explain the design and structure of new and changed functionality. + +## New Requirements + +Alamofire 2.0 officially supports iOS 8+, Mac OS X 10.9+, Xcode 7 and Swift 2.0. If you'd like to use Alamofire in a project targeting iOS 7 and Swift 1.x, use the latest tagged 1.x release. + +--- + +## Breaking API Changes + +### Swift 2.0 + +The biggest change between Alamofire 1.x and Alamofire 2.0 is Swift 2.0. Swift 2 brought many new features to take advantage of such as error handling, protocol extensions and availability checking. Other new features such as `guard` and `defer` do not affect the public APIs, but allowed us to create much cleaner implementations of the same logic. All of the source files, test logic and example code has been updated to reflect the latest Swift 2.0 paradigms. + +> It is not possible to use Alamofire 2.0 without Swift 2.0. + +### Response Serializers + +The most significant logic change made to Alamofire 2.0 is its new response serialization system leveraging `Result` types. Previously in Alamofire 1.x, each response serializer used the same completion handler signature: + +```swift +public func response(completionHandler: (NSURLRequest, NSHTTPURLResponse?, AnyObject?, NSError?) -> Void) -> Self { + return response(serializer: Request.responseDataSerializer(), completionHandler: completionHandler) +} +``` + +Alamofire 2.0 has redesigned the entire response serialization process to make it much easier to access the original server data without serialization, or serialize the response into a non-optional `Result` type defining whether the `Request` was successful. + +#### No Response Serialization + +The first `response` serializer is non-generic and does not process the server data in any way. It merely forwards on the accumulated information from the `NSURLSessionDelegate` callbacks. + +```swift +public func response( + queue queue: dispatch_queue_t? = nil, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, NSData?, ErrorType?) -> Void) + -> Self +{ + delegate.queue.addOperationWithBlock { + dispatch_async(queue ?? dispatch_get_main_queue()) { + completionHandler(self.request, self.response, self.delegate.data, self.delegate.error) + } + } + + return self +} +``` + +Another important note of this change is the return type of `data` is now an `NSData` type. You no longer need to cast the `data` parameter from an `AnyObject?` to an `NSData?`. + +#### Generic Response Serializers + +The second, more powerful response serializer leverages generics along with a `Result` type to eliminate the case of the dreaded double optional. + +```swift +public func response( + queue queue: dispatch_queue_t? = nil, + responseSerializer: T, + completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result) -> Void) + -> Self +{ + delegate.queue.addOperationWithBlock { + let result: Result = { + if let error = self.delegate.error { + return .Failure(self.delegate.data, error) + } else { + return responseSerializer.serializeResponse(self.request, self.response, self.delegate.data) + } + }() + + dispatch_async(queue ?? dispatch_get_main_queue()) { + completionHandler(self.request, self.response, result) + } + } + + return self +} +``` + +##### Response Data + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseData { _, _, result in + print("Success: \(result.isSuccess)") + print("Response: \(result)") + } +``` + +##### Response String + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseString { _, _, result in + print("Success: \(result.isSuccess)") + print("Response String: \(result.value)") + } +``` + +##### Response JSON + +```swift +Alamofire.request(.GET, "http://httpbin.org/get") + .responseJSON { _, _, result in + print(result) + debugPrint(result) + } +``` + +#### Result Types + +The `Result` enumeration was added to handle the case of the double optional return type. Previously, the return value and error were both optionals. Checking if one was `nil` did not ensure the other was also not `nil`. This case has been blogged about many times and can be solved by a `Result` type. Alamofire 2.0 brings a `Result` type to the response serializers to make it much easier to handle success and failure cases. + +```swift +public enum Result { + case Success(Value) + case Failure(NSData?, ErrorType) +} +``` + +There are also many other convenience computed properties to make accessing the data inside easy. The `Result` type also conforms to the `CustomStringConvertible` and `CustomDebugStringConvertible` protocols to make it easier to debug. + +#### Error Types + +While Alamofire still only generates `NSError` objects, all `Result` types have been converted to store `ErrorType` objects to allow custom response serializer implementations to use any `ErrorType` they wish. This also includes the `ValidationResult` and `MultipartFormDataEncodingResult` types as well. + +### URLRequestConvertible + +In order to make it easier to deal with non-common scenarios, the `URLRequestConvertible` protocol now returns an `NSMutableURLRequest`. Alamofire 2.0 makes it much easier to customize the URL request after is has been encoded. This should only affect a small amount of users. + +```swift +public protocol URLRequestConvertible { + var URLRequest: NSMutableURLRequest { get } +} +``` + +### Multipart Form Data + +Encoding `MultipartFormData` previous returned an `EncodingResult` to encapsulate any possible errors that occurred during encoding. Alamofire 2.0 uses the new Swift 2.0 error handling instead making it easier to use. This change is mostly encapsulated internally and should only affect a very small subset of users. + +--- + +## Updated ACLs and New Features + +### Parameter Encoding + +#### ACL Updates + +The `ParameterEncoding` enumeration implementation was previously hidden behind `internal` and `private` ACLs. Alamofire 2.0 opens up the `queryComponents` and `escape` methods to make it much easier to implement `.Custom` cases. + +#### Encoding in the URL + +In the previous versions of Alamofire, `.URL` encoding would automatically append the query string to either the URL or HTTP body depending on which HTTP method was set in the `NSURLRequest`. While this satisfies the majority of common use cases, it made it quite difficult to append query string parameter to a URL for HTTP methods such as `PUT` and `POST`. In Alamofire 2.0, we've added a second URL encoding case, `.URLEncodedInURL`, that always appends the query string to the URL regardless of HTTP method. + +### Server Trust Policies + +In Alamofire 1.x, the `ServerTrustPolicyManager` methods were internal making it impossible to implement any custom domain matching behavior. Alamofire 2.0 opens up the internals with a `public` ACL allowing more flexible server trust policy matching behavior (i.e. wildcarded domains) through subclassing. + +```swift +class CustomServerTrustPolicyManager: ServerTrustPolicyManager { + override func serverTrustPolicyForHost(host: String) -> ServerTrustPolicy? { + var policy: ServerTrustPolicy? + + // Implement your custom domain matching behavior... + + return policy + } +} +``` + +### Download Requests + +The global and `Manager` download APIs now support `parameters` and `encoding` parameters to better support dynamic payloads used in background sessions. Constructing a `download` request is now the same as constructing a `data` request with the addition of a `destination` parameter. + +```swift +public func download( + method: Method, + _ URLString: URLStringConvertible, + parameters: [String: AnyObject]? = nil, + encoding: ParameterEncoding = .URL, + headers: [String: String]? = nil, + destination: Request.DownloadFileDestination) + -> Request +{ + return Manager.sharedInstance.download( + method, + URLString, + parameters: parameters, + encoding: encoding, + headers: headers, + destination: destination + ) +} +``` + +### Stream Tasks + +Alamofire 2.0 adds support for creating `NSURLSessionStreamTask` tasks for iOS 9 and OS X 10.11. It also extends the `SessionDelegate` to support all the new `NSURLSessionStreamDelegate` APIs. diff --git a/Carthage/Checkouts/Alamofire/Documentation/Alamofire 3.0 Migration Guide.md b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 3.0 Migration Guide.md new file mode 100644 index 00000000..38736fc9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 3.0 Migration Guide.md @@ -0,0 +1,186 @@ +# Alamofire 3.0 Migration Guide + +Alamofire 3.0 is the latest major release of Alamofire, an HTTP networking library for iOS, Mac OS X and watchOS written in Swift. As a major release, following Semantic Versioning conventions, 3.0 introduces several API-breaking changes that one should be aware of. + +This guide is provided in order to ease the transition of existing applications using Alamofire 2.x to the latest APIs, as well as explain the design and structure of new and changed functionality. + +## Requirements + +Alamofire 3.0 officially supports iOS 8+, Mac OS X 10.9+, watchOS 2.0, Xcode 7 and Swift 2.0. If you'd like to use Alamofire in a project targeting iOS 7 and Swift 1.x, use the latest tagged 1.x release. + +## Reasons for Bumping to 3.0 + +The [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) (ASF) tries to do everything possible to avoid MAJOR version bumps. We realize the challenges involved with migrating large projects from one MAJOR version to another. With that said, we also want to make sure we're always producing the highest quality APIs and features possible. + +After releasing Alamofire 2.0, it became clear that the response serialization system still had some room for improvement. After much debate, we decided to strictly follow semver and move forward with all the core logic changes becoming Alamofire 3.0. We've also made some fairly significant changes that should give us more flexibility moving forward to help avoid the need for MAJOR version bumps to maintain backwards compatibility. + +## Benefits of Upgrading + +The benefits of upgrading can be summarized as follows: + +* No more casting a response serializer `error` from an `ErrorType` to an `NSError`. +* Original server data is now ALWAYS returned in all response serializers regardless of whether the result was a `.Success` or `.Failure`. +* Custom response serializers are now ALWAYS called regardless of whether an `error` occurred. +* Custom response serializers are now passed in the `error` allowing you to switch between different parsing schemes if necessary. +* Custom response serializers can now wrap up any Alamofire `NSError` into a `CustomError` type of your choosing. +* `Manager` initialization can now accept custom `NSURLSession` or `SessionDelegate` objects using dependency injection. + +--- + +## Breaking API Changes + +Alamofire 3.0 contains some breaking API changes to the foundational classes supporting the response serialization system. It is important to understand how these changes affect the common usage patterns. + +### Result Type + +The `Result` type was introduced in Alamofire 2.0 as a single generic parameter with the following signature: + +```swift +public enum Result { + case Success(Value) + case Failure(NSData?, ErrorType) +} +``` + +While this was a significant improvement on the behavior of Alamofire 1.0, there was still room for improvement. By defining the `.Failure` case to take an `ErrorType`, all consumers needed to cast the `ErrorType` to some concrete object such as an `NSError` before being able to interact with it. This was certainly not ideal. Additionally, by only allowing the `NSData?` from the server to be appended in a `.Failure` case, it was not possible to access the original server data in a `.Success` case. + +In Alamofire 3.0, the `Result` type has been redesigned to be a double generic type that does not store the `NSData?` in the `.Failure` case. + +```swift +public enum Result { + case Success(Value) + case Failure(Error) +} +``` + +These changes allow Alamofire to return the original server data in both cases. It also removes the requirement of having to cast the `ErrorType` when working with the `.Failure` case error object. + +### Response + +In order to avoid constantly having to change the response serializer completion closure signatures, Alamofire 3.0 introduces a `Response` struct. All response serializers (with the exception of `response`) return a generic `Response` struct. + +```swift +public struct Response { + /// The URL request sent to the server. + public let request: NSURLRequest? + + /// The server's response to the URL request. + public let response: NSHTTPURLResponse? + + /// The data returned by the server. + public let data: NSData? + + /// The result of response serialization. + public let result: Result +} +``` + +This unifies the signature of all response serializer completion closures by only needing to specify a single parameter rather than three or four. If another major release of Alamofire needs to modify the signature, thankfully the number of parameters in all response serializers will NOT need to change. Given the fact that the Swift compiler can present some fairly misleading compiler errors when the arguments are not correct, this should help alleviate some painful updates between MAJOR version bumps of Alamofire. + +### Response Serializers + +The biggest change in Alamofire 3.0 are the response serializers. They are now powered by the new `Response` struct and updated `Result` type. These two generic classes make it VERY easy to interact with the response serializers in a consistent, type-safe manner. + +```swift +Alamofire.request(.GET, "http://httpbin.org/get", parameters: ["foo": "bar"]) + .responseJSON { response in + debugPrint(response) // prints detailed description of all response properties + + print(response.request) // original URL request + print(response.response) // URL response + print(response.data) // server data + print(response.result) // result of response serialization + + if let JSON = response.result.value { + print("JSON: \(JSON)") + } + } +``` + +Besides the single response parameter in the completion closure, the other major callouts are that the original server data is always available whether the `Result` was a `.Success` or `.Failure`. Additionally, both the `value` and `error` of the `Result` type are strongly typed objects thanks to the power of generics. All default response serializer errors will be an `NSError` type. Custom response serializers can specify any custom `ErrorType`. + +#### Response Serializer Type + +For those wishing to create custom response serializer types, you'll need to familiarize yourself with the new `ResponseSerializerType` protocol and generic `ResponseSerializer` struct. + +```swift +public protocol ResponseSerializerType { + /// The type of serialized object to be created by this `ResponseSerializerType`. + typealias SerializedObject + + /// The type of error to be created by this `ResponseSerializer` if serialization fails. + typealias ErrorObject: ErrorType + + /** + A closure used by response handlers that takes a request, response, data and error and returns a result. + */ + var serializeResponse: (NSURLRequest?, NSHTTPURLResponse?, NSData?, NSError?) -> Result { get } +} +``` + +All the possible information about the `Request` is now passed into the `serializeResponse` closure. In Alamofire 3.0, the `serializeResponse` closure is ALWAYS called whether an error occurred or not. This is for several reasons. + +1. Passing the error into the response serializer allows the implementation to switch parsing schemes based on what error occurred. For example, some APIs will return different payload schemas when certain errors occur. The new design allows you to switch on the error type and use different parsing logic. +2. Any error produced by Alamofire will always be an `NSError`. If your custom response serializer returns `CustomError` types, then the `NSError` returned by Alamofire must be converted into a `CustomError` type. This makes it MUCH easier to wrap Alamofire errors in your own `CustomError` type objects. + > This is also required for all the generics logic to work properly. + +### Validation Result + +The `ValidationResult` enumeration in Alamofire 3.0 has been updated to take an `NSError` in the `.Failure` case. The reasoning for this change is that all Alamofire errors generated need to be `NSError` types. If not, it introduces the need to cast all error objects coming from Alamofire at the response serializer level. + +```swift +public enum ValidationResult { + case Success + case Failure(NSError) +} +``` + +> If you are extending the `Request` type in any way that can produce an error, that error always needs to be of type `NSError`. If you'd like to wrap the error into a `CustomError` type, it should be wrapped in a custom response serializer implementation. + +--- + +## New Features + +### Dependency Injection + +Alamofire 3.0 leverages [dependency injection](https://en.wikipedia.org/wiki/Dependency_injection) to allow some powerful new customizations to take place for the URL session and delegate. + +#### Session Delegate + +In previous versions of Alamofire, the `SessionDelegate` was automatically created by the `Manager` instance. While this is convenient, it can be problematic for background sessions. One may need to hook up the task override closures before instantiating the URL session. Otherwise the URL session delegate could be called before the task override closures are able to be set. + +In Alamofire 3.0, the `Manager` initializer adds the ability to provide a custom `SessionDelegate` object with the task override closures already set using dependency injection. This greatly increases the flexibility of Alamofire in regards to background sessions. + +```swift +public init( + configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(), + delegate: SessionDelegate = SessionDelegate(), + serverTrustPolicyManager: ServerTrustPolicyManager? = nil) +{ + self.delegate = delegate + self.session = NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil) + + commonInit(serverTrustPolicyManager: serverTrustPolicyManager) +} +``` + +#### URL Session + +Alamofire 3.0 also adds the ability to use dependency injection to provide a custom `NSURLSession` to the `Manager` instance. This provides complete control over the URL session initialization if you need it allowing `NSURLSession` subclasses for various kinds of testing and DVR implementations. + +```swift +public init?( + session: NSURLSession, + delegate: SessionDelegate, + serverTrustPolicyManager: ServerTrustPolicyManager? = nil) +{ + self.delegate = delegate + self.session = session + + guard delegate === session.delegate else { return nil } + + commonInit(serverTrustPolicyManager: serverTrustPolicyManager) +} +``` + +> We're very excited to see what the community comes up with given these new possibilities with Alamofire 3.0. diff --git a/Carthage/Checkouts/Alamofire/Documentation/Alamofire 4.0 Migration Guide.md b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 4.0 Migration Guide.md new file mode 100644 index 00000000..2902dc61 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 4.0 Migration Guide.md @@ -0,0 +1,930 @@ +# Alamofire 4.0 Migration Guide + +Alamofire 4.0 is the latest major release of Alamofire, an HTTP networking library for iOS, tvOS, macOS and watchOS written in Swift. As a major release, following Semantic Versioning conventions, 4.0 introduces API-breaking changes. + +This guide is provided in order to ease the transition of existing applications using Alamofire 3.x to the latest APIs, as well as explain the design and structure of new and updated functionality. + +- [Requirements](#requirements) +- [Benefits of Upgrading](#benefits-of-upgrading) +- [Breaking API Changes](#breaking-api-changes) + - [Namespace Changes](#namespace-changes) + - [Making Requests](#making-requests) + - [URLStringConvertible](#urlstringconvertible) + - [URLRequestConvertible](#urlrequestconvertible) +- [New Features](#new-features) + - [Request Adapter](#request-adapter) + - [Request Retrier](#request-retrier) + - [Task Metrics](#task-metrics) +- [Updated Features](#updated-features) + - [Errors](#errors) + - [Parameter Encoding Protocol](#parameter-encoding-protocol) + - [Request Subclasses](#request-subclasses) + - [Response Validation](#response-validation) + - [Response Serializers](#response-serializers) + +## Requirements + +- iOS 8.0+, macOS 10.10.0+, tvOS 9.0+ and watchOS 2.0+ +- Xcode 8.1+ +- Swift 3.0+ + +For those of you that would like to use Alamofire on macOS 10.9, please use the latest tagged 3.x release which supports both Swift 2.2 and 2.3. + +## Benefits of Upgrading + +- **Complete Swift 3 Compatibility:** includes the full adoption of the new [API Design Guidelines](https://swift.org/documentation/api-design-guidelines/). +- **New Error System:** uses a new `AFError` type to adhere to the new pattern proposed in [SE-0112](https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md). +- **New RequestAdapter Protocol:** allows inspection and adaptation of every `URLRequest` before instantiating a `Request` allowing for easy modification of properties like the `Authorization` header. +- **New RequestRetrier Protocol:** allows you to inspect and retry any failed `Request` if necessary allowing you to build custom authentication solutions (OAuth1, OAuth2, xAuth, Basic Auth, etc.) around a set of requests. +- **New Parameter Encoding Protocol:** replaces the `ParameterEncoding` enumeration allowing for easier extension and customization and also throws errors on failure instead of returning a tuple. +- **New Request Types:** include `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` that implement specialized progress, validation and serialization APIs and behaviors per `Request` type. +- **New Progress APIs:** include `downloadProgress` and `uploadProgress` APIs supporting both `Progress` and `Int64` types and called on a specified dispatch queue defaulting to `.main`. +- **Enhanced Response Validation:** now includes the `data` or `temporaryURL` and `destinationURL` allowing inline closures to parse the server data for error messages if validation failed. +- **New Download Destinations:** allow you to have full control over the move operation on the file system by disabling it, removing a previous file and creating intermediate directories. +- **New Response Types:** unify response API signatures and expose `temporaryURL` and `downloadURL` properties for downloads and the all new task metrics on newer platforms. + +--- + +## Breaking API Changes + +Alamofire 4 has fully adopted all the new Swift 3 changes and conventions, including the new [API Design Guidelines](https://swift.org/documentation/api-design-guidelines/). Because of this, almost every API in Alamofire has been modified in some way. We can't possibly document every single change, so we're going to attempt to identify the most common APIs and how they have changed to help you through those sometimes less than helpful compiler errors. + +### Namespace Changes + +Some of the common classes have been moved into the global namespace to make them a bit easier to work with and to make them first class types. + +- `Manager` is now `SessionManager` +- `Request.TaskDelegate` is now `TaskDelegate` +- `Request.DataTaskDelegate` is now `DataTaskDelegate` +- `Request.DownloadTaskDelegate` is now `DownloadTaskDelegate` +- `Request.UploadTaskDelegate` is now `UploadTaskDelegate` + +We've also reorganized the file structure and organization patterns significantly to make it easier to follow the code. We hope that this will encourage more users to get to know the internal structure and implementation of Alamofire. Knowledge is power. + +### Making Requests + +Since making requests is certainly the most common operation in Alamofire, here are some examples of Alamofire 3.x requests compared to their new equivalents in Alamofire 4. + +#### Data Request - Simple with URL string + +```swift +// Alamofire 3 +Alamofire.request(.GET, urlString).response { request, response, data, error in + print(request) + print(response) + print(data) + print(error) +} + +// Alamofire 4 +Alamofire.request(urlString).response { response in // method defaults to `.get` + debugPrint(response) +} +``` + +#### Data Request - Complex with URL string + +```swift +// Alamofire 3 +let parameters: [String: AnyObject] = ["foo": "bar"] + +Alamofire.request(.GET, urlString, parameters: parameters, encoding: .JSON) + .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in + print("Bytes: \(bytesRead), Total Bytes: \(totalBytesRead), Total Bytes Expected: \(totalBytesExpectedToRead)") + } + .validate { request, response in + // Custom evaluation closure (no access to server data) + return .success + } + .responseJSON { response in + debugPrint(response) + } + +// Alamofire 4 +let parameters: Parameters = ["foo": "bar"] + +Alamofire.request(urlString, method: .get, parameters: parameters, encoding: JSONEncoding.default) + .downloadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in + print("Progress: \(progress.fractionCompleted)") + } + .validate { request, response, data in + // Custom evaluation closure now includes data (allows you to parse data to dig out error messages if necessary) + return .success + } + .responseJSON { response in + debugPrint(response) + } +``` + +#### Download Request - Simple with URL string + +```swift +// Alamofire 3 +let destination = DownloadRequest.suggestedDownloadDestination() + +Alamofire.download(.GET, urlString, destination: destination).response { request, response, data, error in + // What is fileURL...not easy to get + print(request) + print(response) + print(data) + print(error) +} + +// Alamofire 4 +let destination = DownloadRequest.suggestedDownloadDestination() + +Alamofire.download(urlString, to: destination).response { response in // method defaults to `.get` + print(response.request) + print(response.response) + print(response.temporaryURL) + print(response.destinationURL) + print(response.error) +} +``` + +#### Download Request - Simple with URL request + +```swift +// Alamofire 3 +let destination = DownloadRequest.suggestedDownloadDestination() + +Alamofire.download(urlRequest, destination: destination).validate().responseData { response in + // What is fileURL...not easy to get + debugPrint(response) +} + +// Alamofire 4 +Alamofire.download(urlRequest, to: destination).validate().responseData { response in + debugPrint(response) + print(response.temporaryURL) + print(response.destinationURL) +} +``` + +#### Download Request - Complex with URL string + +```swift +// Alamofire 3 +let fileURL: NSURL +let destination: Request.DownloadFileDestination = { _, _ in fileURL } +let parameters: [String: AnyObject] = ["foo": "bar"] + +Alamofire.download(.GET, urlString, parameters: parameters, encoding: .JSON, to: destination) + .progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in + print("Bytes: \(bytesRead), Total Bytes: \(totalBytesRead), Total Bytes Expected: \(totalBytesExpectedToRead)") + } + .validate { request, response in + // Custom evaluation implementation (no access to temporary or destination URLs) + return .success + } + .responseJSON { response in + print(fileURL) // Only accessible if captured in closure scope, not ideal + debugPrint(response) + } + +// Alamofire 4 +let fileURL: URL +let destination: DownloadRequest.DownloadFileDestination = { _, _ in + return (fileURL, [.createIntermediateDirectories, .removePreviousFile]) +} +let parameters: Parameters = ["foo": "bar"] + +Alamofire.download(urlString, method: .get, parameters: parameters, encoding: JSONEncoding.default, to: destination) + .downloadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in + print("Progress: \(progress.fractionCompleted)") + } + .validate { request, response, temporaryURL, destinationURL in + // Custom evaluation closure now includes file URLs (allows you to parse out error messages if necessary) + return .success + } + .responseJSON { response in + debugPrint(response) + print(response.temporaryURL) + print(response.destinationURL) + } +``` + +#### Upload Request - Simple with URL string + +```swift +// Alamofire 3 +Alamofire.upload(.POST, urlString, data: data).response { request, response, data, error in + print(request) + print(response) + print(data) + print(error) +} + +// Alamofire 4 +Alamofire.upload(data, to: urlString).response { response in // method defaults to `.post` + debugPrint(response) +} +``` + +#### Upload Request - Simple with URL request + +```swift +// Alamofire 3 +Alamofire.upload(urlRequest, file: fileURL).validate().responseData { response in + debugPrint(response) +} + +// Alamofire 4 +Alamofire.upload(fileURL, with: urlRequest).validate().responseData { response in + debugPrint(response) +} +``` + +#### Upload Request - Complex with URL string + +```swift +// Alamofire 3 +Alamofire.upload(.PUT, urlString, file: fileURL) + .progress { bytes, totalBytes, totalBytesExpected in + // Are these for upload or for downloading the response? + print("Bytes: \(bytesRead), Total Bytes: \(totalBytesRead), Total Bytes Expected: \(totalBytesExpectedToRead)") + } + .validate { request, response in + // Custom evaluation implementation (no access to server data) + return .success + } + .responseJSON { response in + debugPrint(response) + } + +// Alamofire 4 +Alamofire.upload(fileURL, to: urlString, method: .put) + .uploadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in + print("Upload Progress: \(progress.fractionCompleted)") + } + .downloadProgress { progress in // called on main queue by default + print("Download Progress: \(progress.fractionCompleted)") + } + .validate { request, response, data in + // Custom evaluation closure now includes data (allows you to parse data to dig out error messages if necessary) + return .success + } + .responseJSON { response in + debugPrint(response) + } +``` + +As you can see, there are many breaking API changes, but the common APIs still adhere to the original design goals of being able to make complex requests through a single line of code in a concise, well defined manner. + +### URLStringConvertible + +There are two changes to the `URLStringConvertible` protocol that are worth noting. + +#### URLConvertible + +The first MAJOR change worth noting on the `URLStringConvertible` is that it has been renamed to `URLConvertible`. In Alamofire 3.x, the `URLStringConvertible` was defined as: + +```swift +public protocol URLStringConvertible { + var URLString: String { get } +} +``` + +Now in Alamofire 4, the `URLConvertible` protocol is defined as: + +```swift +public protocol URLConvertible { + func asURL() throws -> URL +} +``` + +As you can see, the `URLString` property is completely gone and replaced by a new `asURL` method that throws. To explain, let's first backup. + +A VERY common problem in Alamofire is that users forget to percent escape their URL strings and Alamofire will crash. Up until now, we (the Alamofire team) have taken the stance that this is how Alamofire is designed and your URLs need to conform to [RFC 2396](https://tools.ietf.org/html/rfc2396). This is certainly not ideal for the community because we all would rather have Alamofire tell us that our URL was invalid rather than having it crash. + +Now, back to the new `URLConvertible` protocol. The reason Alamofire was not previously able to safely handle invalid URL strings was, in fact, due to the lack of safety on `URLStringConvertible`. It's not possible for Alamofire to know how to intelligently make an invalid URL string valid. Therefore, if the `URL` is unable to be created from the `URLConvertible`, an `AFError.invalidURL` error is thrown. + +This change (along with many others) allows Alamofire to safely handle invalid URLs and report the error back in the response handlers. + +#### URLRequest Conformance + +The `URLRequest` no longer conforms to the `URLStringConvertible`, now `URLConvertible` protocol. This was always a bit of a stretch in the previous versions of Alamofire and wasn't really necessary. It also had a high potential to introduce ambiguity into many Alamofire APIs. Because of these reasons, `URLRequest` no longer conforms to `URLStringConvertible` (now `URLConvertible`). + +What this means in code is that you can no longer do the following: + +```swift +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!) +let urlString = urlRequest.urlString +``` + +Instead, in Alamofire 4, you now have to do the following: + +```swift +let urlRequest = URLRequest(url: URL(string: "https://httpbin.org/get")!) +let urlString = urlRequest.url?.absoluteString +``` + +> See [PR-1505](https://github.com/Alamofire/Alamofire/pull/1505) for more info. + +### URLRequestConvertible + +The `URLRequestConvertible` was susceptible to the same safety issues concerns as the `URLStringConvertible` in Alamofire 3.x. In Alamofire 3, the `URLRequestConvertible` was: + +```swift +public protocol URLRequestConvertible { + var URLRequest: URLRequest { get } +} +``` + +Now, in Alamofire 4, it is: + +```swift +public protocol URLRequestConvertible { + func asURLRequest() throws -> URLRequest +} +``` + +As you can see, the `URLRequest` property has been replaced by an `asURLRequest` method that throws when encountering an error generating the `URLRequest`. + +The most likely place this will affect your code is in the `Router` design pattern. If you have a `Router`, it's going to have to change, but for the better! You will now implement the `asURLRequest` method instead of the property which gives you the ability to throw an error if necessary. You no longer have to force unwrap unsafe data or parameters or wrap `ParameterEncoding` in a do-catch. Any error encountered in a `Router` can now be automatically handled by Alamofire. + +> See [PR-1505](https://github.com/Alamofire/Alamofire/pull/1505) for more info. + +--- + +## New Features + +### Request Adapter + +The `RequestAdapter` protocol is a completely new feature in Alamofire 4. + +```swift +public protocol RequestAdapter { + func adapt(_ urlRequest: URLRequest) throws -> URLRequest +} +``` + +It allows each `Request` made on a `SessionManager` to be inspected and adapted before being created. One very specific way to use an adapter is to append an `Authorization` header to requests behind a certain type of authentication. + +```swift +class AccessTokenAdapter: RequestAdapter { + private let accessToken: String + + init(accessToken: String) { + self.accessToken = accessToken + } + + func adapt(_ urlRequest: URLRequest) throws -> URLRequest { + var urlRequest = urlRequest + + if urlRequest.urlString.hasPrefix("https://httpbin.org") { + urlRequest.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") + } + + return urlRequest + } +} + +let sessionManager = SessionManager() +sessionManager.adapter = AccessTokenAdapter(accessToken: "1234") + +sessionManager.request("https://httpbin.org/get") +``` + +If an `Error` occurs during the adaptation process, it should be thrown and will be delivered in the response handler of the `Request`. + +> See [PR-1450](https://github.com/Alamofire/Alamofire/pull/1450) for more info. + +### Request Retrier + +The `RequestRetrier` is another brand new Alamofire 4 protocol. + +```swift +public typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: TimeInterval) -> Void + +public protocol RequestRetrier { + func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) +} +``` + +It allows a `Request` that encountered an `Error` while being executed to be retried with an optional delay if specified. + +```swift +class OAuth2Handler: RequestAdapter, RequestRetrier { + public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: RequestRetryCompletion) { + if let response = request.task.response as? HTTPURLResponse, response.statusCode == 401 { + completion(true, 1.0) // retry after 1 second + } else { + completion(false, 0.0) // don't retry + } + } +} + +let sessionManager = SessionManager() +sessionManager.retrier = OAuth2Handler() + +sessionManager.request(urlString).responseJSON { response in + debugPrint(response) +} +``` + +The retrier allows you to inspect the `Request` after it has completed and run all `Validation` closures to determine whether it should be retried. When using both the `RequestAdapter` and `RequestRetrier` protocols together, you can create credential refresh systems for OAuth1, OAuth2, Basic Auth and even exponential backoff retry policies. The possibilities are endless. For more information and examples on this topic, please refer to the README. + +> See [PR-1391](https://github.com/Alamofire/Alamofire/pull/1391) and [PR-1450](https://github.com/Alamofire/Alamofire/pull/1450) for more info. + +### Task Metrics + +In iOS and tvOS 10 and macOS 10.12, Apple introduced the new [URLSessionTaskMetrics](https://developer.apple.com/reference/foundation/urlsessiontaskmetrics) APIs. The task metrics encapsulate some fantastic statistical information about the request and response execution. The API is very similar to Alamofire's `Timeline`, but provide many more statistics that Alamofire was unable to compute. We're really excited about these APIs and have exposed them on each `Response` type meaning they couldn't be easier to use. + +```swift +Alamofire.request(urlString).response { response in + debugPrint(response.metrics) +} +``` + +It's important to note that these APIs are only available on iOS and tvOS 10+ and macOS 10.12+. Therefore, depending on your deployment target, you may need to use these inside availability checks: + +```swift +Alamofire.request(urlString).response { response in + if #available(iOS 10.0, *) { + debugPrint(response.metrics) + } +} +``` + +> See [PR-1492](https://github.com/Alamofire/Alamofire/pull/1492) for more info. + +--- + +## Updated Features + +Alamofire 4 contains many new features and enhancements on existing ones. This section is designed to give a brief overview of the features and demonstrate their uses. For more information on each each, please refer to the linked pull request. + +### Errors + +Alamofire 4 contains a completely new error system that adopts the new pattern proposed in [SE-0112](https://github.com/apple/swift-evolution/blob/master/proposals/0112-nserror-bridging.md). At the heart of the new error system is `AFError`, a new `Error` type enumeration backed by five main cases. + +- `.invalidURL(url: URLConvertible)` - Returned when a `URLConvertible` type fails to create a valid `URL`. +- `.parameterEncodingFailed(reason: ParameterEncodingFailureReason)` - Returned when a parameter encoding object throws an error during the encoding process. +- `.multipartEncodingFailed(reason: MultipartEncodingFailureReason)` - Returned when some step in the multipart encoding process fails. +- `.responseValidationFailed(reason: ResponseValidationFailureReason)` - Returned when a `validate()` call fails. +- `.responseSerializationFailed(reason: ResponseSerializationFailureReason)` - Returned when a response serializer encounters an error in the serialization process. + +Each case contains a specific failure reason which is another nested enumeration with multiple cases that contain additional information about the exact type of error that occurred. What this ultimately means is that is is much easier in Alamofire to identify where an error came from and what to do about it. + +```swift +Alamofire.request(urlString).responseJSON { response in + guard case let .failure(error) = response.result else { return } + + if let error = error as? AFError { + switch error { + case .invalidURL(let url): + print("Invalid URL: \(url) - \(error.localizedDescription)") + case .parameterEncodingFailed(let reason): + print("Parameter encoding failed: \(error.localizedDescription)") + print("Failure Reason: \(reason)") + case .multipartEncodingFailed(let reason): + print("Multipart encoding failed: \(error.localizedDescription)") + print("Failure Reason: \(reason)") + case .responseValidationFailed(let reason): + print("Response validation failed: \(error.localizedDescription)") + print("Failure Reason: \(reason)") + + switch reason { + case .dataFileNil, .dataFileReadFailed: + print("Downloaded file could not be read") + case .missingContentType(let acceptableContentTypes): + print("Content Type Missing: \(acceptableContentTypes)") + case .unacceptableContentType(let acceptableContentTypes, let responseContentType): + print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)") + case .unacceptableStatusCode(let code): + print("Response status code was unacceptable: \(code)") + } + case .responseSerializationFailed(let reason): + print("Response serialization failed: \(error.localizedDescription)") + print("Failure Reason: \(reason)") + } + + print("Underlying error: \(error.underlyingError)") + } else if let error = error as? URLError { + print("URLError occurred: \(error)") + } else { + print("Unknown error: \(error)") + } +} +``` + +This new design allows you to drill down into errors as deep as you may need to in order to figure out the best way to proceed. It also frees developers from the burden of having to deal with `NSError` types everywhere. By switching to our own custom `Error` type in Alamofire, we've been able to simplify the `Result` and `Response` generic types to only require a single generic parameter. This simplifies the response serialization logic. + +> See [PR-1419](https://github.com/Alamofire/Alamofire/pull/1419) for more info. + +### Parameter Encoding Protocol + +The `ParameterEncoding` enumeration has served us well for over two years at this point. However, it had some limitations that we wanted to address in Alamofire 4. + +- The `.url` case has always been a bit confusing since it selects a destination based on the HTTP method. +- The `.urlEncodedInURL` case has always been an eye sore to work around the behavior of the `.url` case. +- `.JSON` and `.PropertyList` encoding could not accept formatting or writing options. +- The `.Custom` encoding was a bit difficult for users to get the hang of. + +Because of these reasons, we decided to eliminate the enumeration altogether in Alamofire 4! Now, `ParameterEncoding` is a protocol backed by three concrete `URLEncoding`, `JSONEncoding` and `PropertyList` encoding structs with a new `Parameters` typealias for creating your parameter dictionaries. + +```swift +public typealias Parameters = [String: Any] + +public protocol ParameterEncoding { + func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest +} +``` + +#### URL Encoding + +The new `URLEncoding` struct contains a `Destination` enumeration supporting three types of destinations: + +- `.methodDependent` - Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and sets as the HTTP body for requests with any other HTTP method. +- `.queryString` - Sets or appends encoded query string result to existing query string. +- `.httpBody` - Sets encoded query string result as the HTTP body of the URL request. + +These destinations make it much easier to control where the parameters are encoded onto the `URLRequest`. Creating requests still uses the same signature as before in regards to parameter encoding and also has the same default behavior. + +```swift +let parameters: Parameters = ["foo": "bar"] + +Alamofire.request(urlString, parameters: parameters) // Encoding => URLEncoding(destination: .methodDependent) +Alamofire.request(urlString, parameters: parameters, encoding: URLEncoding(destination: .queryString)) +Alamofire.request(urlString, parameters: parameters, encoding: URLEncoding(destination: .httpBody)) + +// Static convenience properties (we'd like to encourage everyone to use this more concise form) +Alamofire.request(urlString, parameters: parameters, encoding: URLEncoding.default) +Alamofire.request(urlString, parameters: parameters, encoding: URLEncoding.queryString) +Alamofire.request(urlString, parameters: parameters, encoding: URLEncoding.httpBody) +``` + +#### JSON Encoding + +The new `JSONEncoding` struct exposes the ability to customize the JSON writing options. + +```swift +let parameters: Parameters = ["foo": "bar"] + +Alamofire.request(urlString, parameters: parameters, encoding: JSONEncoding(options: [])) +Alamofire.request(urlString, parameters: parameters, encoding: JSONEncoding(options: .prettyPrinted)) + +// Static convenience properties (we'd like to encourage everyone to use this more concise form) +Alamofire.request(urlString, parameters: parameters, encoding: JSONEncoding.default) +Alamofire.request(urlString, parameters: parameters, encoding: JSONEncoding.prettyPrinted) +``` + +#### Property List Encoding + +The new `PropertyListEncoding` struct allows customizing the plist format and write options. + +```swift +let parameters: Parameters = ["foo": "bar"] + +Alamofire.request(urlString, parameters: parameters, encoding: PropertyListEncoding(format: .xml, options: 0)) +Alamofire.request(urlString, parameters: parameters, encoding: PropertyListEncoding(format: .binary, options: 0)) + +// Static convenience properties (we'd like to encourage everyone to use this more concise form) +Alamofire.request(urlString, parameters: parameters, encoding: PropertyListEncoding.xml) +Alamofire.request(urlString, parameters: parameters, encoding: PropertyListEncoding.binary) +``` + +#### Custom Encoding + +Creating a custom custom `ParameterEncoding` is now as simple as implementing the protocol. For more examples on how to do this, please refer to the README. + +> See [PR-1465](https://github.com/Alamofire/Alamofire/pull/1465) for more info. + +### Request Subclasses + +In Alamofire 4, the `request`, `download`, `upload` and `stream` APIs no longer return a `Request`. Instead, they return a specific type of `Request` subclass. There were several motivating factors and community questions that led us to making this change: + +- **Progress:** The behavior of the `progress` method was confusing for upload requests. + - What does `progress` report on an upload `Request`? The progress of the upload? The progress of the response download? + - If it reports both, how do you know if or when it switches? +- **Response Serializers:** The response serializers were designed for data and upload requests, not download or stream requests. + - How do you access the fileURL when a download is complete? + - What would `responseData`, `responseString` or `responseJSON` do for a download request? Stream request? + +At a high level, Alamofire 4 now has four `Request` subclasses that each support their own custom chained APIs. This allows each subclass to create extensions tailored to that specific type of request. + +```swift +open class Request { + // Contains common properties, authentication and state methods as well as + // CustomStringConvertible and CustomDebugStringConvertible conformance +} + +open class DataRequest: Request { + // Contains stream (not to be confused with StreamRequest) and download progress methods. +} + +open class DownloadRequest: Request { + // Contains download destination and options, resume data and download progress methods. +} + +open class UploadRequest: DataRequest { + // Inherits all DataRequest APIs and also contains upload progress methods. +} + +open class StreamRequest: Request { + // Only inherits Request APIs, there are no other custom APIs at this time. +} +``` + +By making this split, Alamofire 4 was able to create customized chaining APIs for each type of `Request`. This opened up all sorts of possibilities, but let's take a moment to focus on what this change means in terms of progress reporting and download destinations. + +> See [PR-1455](https://github.com/Alamofire/Alamofire/pull/1455) for more info. + +#### Download and Upload Progress + +The progress reporting system for data, download and upload requests has been completely redesigned. Each request type contains progress APIs for executing a closure during each progress update by returning the underlying `Progress` instance. The closure will be called on the specified queue that defaults to main. + +**Data Request Progress** + +```swift +Alamofire.request(urlString) + .downloadProgress { progress in + // Called on main dispatch queue by default + print("Download progress: \(progress.fractionCompleted)") + } + .responseJSON { response in + debugPrint(response) + } +``` + +**Download Request Progress** + +```swift +Alamofire.download(urlString, to: destination) + .downloadProgress(queue: DispatchQueue.global(qos: .utility)) { progress in + // Called on utility dispatch queue + print("Download progress: \(progress.fractionCompleted)") + } + .responseJSON { response in + debugPrint(response) + } +``` + +**Upload Request Progress** + +```swift +Alamofire.upload(data, to: urlString, withMethod: .post) + .uploadProgress { progress in + // Called on main dispatch queue by default + print("Upload progress: \(progress.fractionCompleted)") + } + .downloadProgress { progress in + // Called on main dispatch queue by default + print("Download progress: \(progress.fractionCompleted)") + } + .responseData { response in + debugPrint(response) + } +``` + +It's now easy to differentiate between upload and download progress for upload requests. + +> See [PR-1455](https://github.com/Alamofire/Alamofire/pull/1455) for more info. + +#### Download File Destinations + +In Alamofire 3.x, successful download requests would always move the temporary file to a final destination URL provided by the `destination` closure. While this was a nice convenience, it had several limitations: + +- `Forced` - The API forces you to provide a destination closure to move the file even if you have a valid use case for not moving it. +- `Limiting` - There was no way to adjust the file system prior to moving the file. + - What if you need to delete a pre-existing file at the destination URL before moving the temporary file? + - What if you need to create intermediate directories to the destination URL before moving the temporary file? + +These limitations led to several enhancements in Alamofire 4. The first of which is the optionality of the destination closure. Now, by default, the `destination` closure is `nil` which means the file is not moved anywhere on the file system and the temporary URL is returned. + +```swift +Alamofire.download(urlString).responseData { response in + print("Temporary URL: \(response.temporaryURL)") +} +``` + +> We'll cover the `DownloadResponse` type in more detail in the [Response Serializers](#response-serializers) section. + +#### Download Options + +The other major change made was to add download options to the destination closure allowing more file system control over the move operation. To accomplish this, the `DownloadOptions` type was created and added to the `DownloadFileDestination` closure. + +```swift +public typealias DownloadFileDestination = ( + _ temporaryURL: URL, + _ response: HTTPURLResponse) + -> (destinationURL: URL, options: DownloadOptions) +``` + +The two currently supported `DownloadOptions` are: + +- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified. +- `.removePreviousFile` - Removes a previous file from the destination URL if specified. + +They can then be used as follows: + +```swift +let destination: DownloadRequest.DownloadFileDestination = { _, _ in + return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) +} + +Alamofire.download(urlString, to: destination).response { response in + debugPrint(response) +} +``` + +If an error occurs during the file system operations, the `error` on the `DownloadResponse` will be of type `URLError`. + +> See [PR-1462](https://github.com/Alamofire/Alamofire/pull/1462) for more info. + +### Response Validation + +There were several opportunity areas for improving the response validation system in Alamofire 4. These areas included: + +- Exposing the underlying `data` to the `Validation` closure. +- Custom validation between different `Request` subclasses types allowing `temporaryURL` and `destinationURL` to be exposed for download requests. + +By creating `Request` subclasses, the validation closure typealias and request APIs were able to be tailored to each request type. + +#### Data Request + +The `Validation` closure exposed on the `DataRequest` (inherited by `UploadRequest`) is now as follows: + +```swift +extension DataRequest { + public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult +} +``` + +By exposing the `Data?` property directly in the closure, you no longer have to write an extension on `Request` to access it. Now you can do something like this: + +```swift +Alamofire.request(urlString) + .validate { request, response, data in + guard let data = data else { return .failure(customError) } + + // 1) Validate the response to make sure everything looks good + // 2) If validation fails, you can now parse the error message out of the + // data if necessary and add that to your custom error if you wish. + + return .success + } + .response { response in + debugPrint(response) + } +``` + +#### Download Request + +The `Validation` closure on the `DownloadRequest` is very similar to the `DataRequest` API, but tailored more to downloads. + +```swift +extension DownloadRequest { + public typealias Validation = ( + _ request: URLRequest?, + _ response: HTTPURLResponse, + _ temporaryURL: URL?, + _ destinationURL: URL?) + -> ValidationResult +} +``` + +The `temporaryURL` and `destinationURL` parameters now allow you access the data returned by the server directly in an inline closure. This allows you to inspect the data inside the file if you've determined you need to in order to create a custom error. + +```swift +Alamofire.download(urlString) + .validate { request, response, temporaryURL, destinationURL in + guard let fileURL = temporaryURL else { return .failure(customError) } + + do { + let _ = try Data(contentsOf: fileURL) + return .success + } catch { + return .failure(customError) + } + } + .response { response in + debugPrint(response) + } +``` + +By exposing the underlying server data directly to the inline closures, error messages embedded in those responses can be parsed out inside the `Validation` closure to create a custom error including the server error message. If the payload is the same schema as used in a response serializer closure, the response serializer could be called to parse out the error message rather than duplicating the logic. For an example of how to do this, please refer to the README. + +> See [PR-1461](https://github.com/Alamofire/Alamofire/pull/1461) for more info. + +### Response Serializers + +The response serialization system in Alamofire 3.x had several pretty severe limitations: + +- Response serialization APIs could be applied to download and stream requests but resulted in undefined behavior. + - How do you access the fileURL when a download is complete? + - What would `responseData`, `responseString` or `responseJSON` do when chained onto a download request? A stream request? +- The `response` API returned 4 parameters instead of an encapsulating `Response` type. + - The biggest issue here is that any change to that API could not be done in a backwards compatible manner. + - Created confusion when switching between the serialized and unserialized APIs which led to difficult to debug compiler errors. + +As you can see, there were some very strong limitations to this system in Alamofire 3.x. Therefore, in Alamofire 4, the `Request` type was first broken down into subclasses, which opened up the opportunity to create customized response serializers and APIs for specific types of requests. Before getting to far into response serializers, we should first walk through the new `Response` types. + +#### Default Data Response + +The `DefaultDataResponse` represents an unserialized server response. There's no Alamofire processing that happens, it just collects all the response information from the `SessionDelegate` APIs and returns it in a simple struct. + +```swift +public struct DefaultDataResponse { + public let request: URLRequest? + public let response: HTTPURLResponse? + public let data: Data? + public let error: Error? + public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics } +} +``` + +This is the type of response you will get back from the `DataRequest.response` API. + +```swift +Alamofire.request(urlString).response { response in + debugPrint(response) +} + +Alamofire.upload(file, to: urlString).response { response in + debugPrint(response) +} +``` + +#### Data Response + +The generic `DataResponse` type is the same as the generic `Response` in Alamofire 3.x, but refactored and contains the new `metrics` property. + +```swift +public struct DataResponse { + public let request: URLRequest? + public let response: HTTPURLResponse? + public let data: Data? + public let result: Result + public let timeline: Timeline + public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics } +} +``` + +You still have access to the same response serialization APIs as before on the `DataRequest` and `UploadRequest` types. + +```swift +Alamofire.request(urlString).responseJSON { response in + debugPrint(response) + print(response.result.isSuccess) +} + +Alamofire.upload(fileURL, to: urlString).responseData { response in + debugPrint(response) + print(response.result.isSuccess) +} +``` + +#### Default Download Response + +Since downloads work differently than data and upload requests, Alamofire 4 contains custom download `Response` types tailored to their behavior. The `DefaultDownloadResponse` type represents an unserialized server response for a `DownloadRequest` that collects all the `SessionDelegate` information into a simple struct. + +```swift +public struct DefaultDownloadResponse { + public let request: URLRequest? + public let response: HTTPURLResponse? + public let temporaryURL: URL? + public let destinationURL: URL? + public let resumeData: Data? + public let error: Error? + public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics } +} +``` + +The `DefaultDownloadResponse` type is returned when using the new `DownloadRequest.response` API. + +```swift +Alamofire.download(urlString).response { response in + debugPrint(response) + print(response.temporaryURL) +} +``` + +#### Download Response + +The new generic `DownloadResponse` type is similar to the generic `DataResponse` type, but contains information tailored to download requests. The `DownloadResponse` type is returned when one of four new APIs exposed on the `DownloadRequest` type. These new APIs match the `DataRequest` ones, and provide the same functionality by loading the data from the underlying temporary or destination URL. + +```swift +Alamofire.download(urlString, to: destination) + .responseData { response in + debugPrint(response) + } + .responseString { response in + debugPrint(response) + } + .responseJSON { response in + debugPrint(response) + } + .responsePropertyList { response in + debugPrint(response) + } +``` + +These new response serialization APIs make it MUCH easier to download a request to a file and serialize the response all in a single call. + +#### Custom Response Serializers + +If you have created your own custom response serializers, you may want to extend support across both data and download requests similar to what we've done with the Alamofire response serializers. If you do decide to do this, take a close look at how Alamofire shares the response serializer implementation between both request types by moving the implementation to the `Request`. This allowed us to DRY up our logic to avoid duplication between types. + +> See [PR-1457](https://github.com/Alamofire/Alamofire/pull/1457) for more info. diff --git a/Carthage/Checkouts/Alamofire/Documentation/Alamofire 5.0 Migration Guide.md b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 5.0 Migration Guide.md new file mode 100644 index 00000000..e0aa954c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/Alamofire 5.0 Migration Guide.md @@ -0,0 +1,64 @@ +# Alamofire 5.0 Migration Guide +Alamofire 5.0 is the latest major release of Alamofire, an HTTP networking library for iOS, tvOS, macOS and watchOS written in Swift. As a major release, following Semantic Versioning conventions, 5.0 introduces API-breaking changes. + +This guide is provided in order to ease the transition of existing applications using Alamofire 4.x to the latest APIs, as well as explain the design and structure of new and updated functionality. Due to the extensive nature of the changes in Alamofire 5, this guide does not provide a complete overview of all changes. Instead, the largest changes are summarized and users encouraged to read Alamofire’s extensive API, Usage, and Advanced Usage documentation. + +## Benefits of Upgrading +- **Rewritten Core:** Alamofire’s core architecture has been rewritten to follow a variety of best practices. + - `DispatchQueue` usage has been updated to follow Apple’s recommended best practices. This means Alamofire will scale much better when many requests are in flight at the same time cannot lead to queue exhaustion like previous versions could. This should improve overall performance and lower the impact of Alamofire on the app and system. + - Areas of responsibility have been clarified among internal APIs, making it easier to implement certain features, like the new `EventMonitor` protocol and per-request SSL failure errors, among many others. + - It was written with the benefit of the various sanitizers, especially the thread sanitizer, from the very beginning, so there will be far fewer threading and other runtime issues than seen in previous versions. +- **Decodable Responses:** `responseDecodable` and the `DecodableResponseSerializer` now provide built-in support for parsing `Decodable` types from network responses using any `DataDecoder` type. +- **Encodable Parameters:** Alamofire now supports and prefers `Encodable` types as parameters using the `ParameterEncoder` protocol, allowing fully type-safe representation of request parameters. +- **URLEncodedFormEncoder:** In addition to supporting `Encodable` parameters in general, Alamofire now includes the `URLEncodedFormEncoder`, an `Encoder` for URL form encoding. +- **`EventMonitor` Protocol:** `EventMonitor`s allow access to Alamofire’s internal events, making it far easier to observe specific actions through a request’s lifetime. This makes logging requests very easy. +- **Async `RequestAdapter`s:** The `RequestAdapter` protocol now operates asynchronously, making it possible to add async resources to requests. +- **Per-`Request` `RequestInterceptor`s:** `RequestInterceptor`s can now be added to individual `Request`s, allowing fine-grained control for the first time. +- **`CachedResponseHandler` and `RedirectHandler` Protocols:** Easy access and control over response caching and redirect behaviors, on both a `Session` and `Request` basis. +- **`HTTPHeaders` Type:** Type safe access to common HTTP headers, with extensions to `URLRequest`, `HTTPURLResponse`, and `URLSessionConfiguration` to allow setting the headers of those types using Alamofire’s new type. +- **`RetryPolicy`:** A `RequestRetrier` with automatic support for retrying requests which failed due to a network or other system error, with customizable exponential backoff, retry limits, and other parameters. + +## Breaking API Changes +Most APIs have changed in Alamofire 5, so this list is not complete. While most top level `request` APIs remain the same, nearly every other type has changed in some way. For up to date examples, see our Usage and Advanced Usage documentation. + +- `SessionManager` has been renamed to `Session` and its APIs have completely changed. +- Background `URLSessionConfiguration`s are no longer supported and attempting to use one will result in a fatal runtime error. Alamofire was never designed to work in the background and its closure-based APIs cannot survive a background transition, leading to ongoing issues around background behavior. Explicit background support will be added through dedicated APIs at some point in the future. +- `SessionDelegate` has been rebuilt and it’s public API completely changed. The various closure overrides have been removed, with most now able to be replaced with specific Alamofire features. If there is a need for control over something the closures used to provide, feel free to open a feature request. +- `TaskDelegate` and the various `*TaskDelegate` classes have been removed. All `URLSession*Delegate` handling is now performed by `SessionDelegate`. +- `Result` has been removed. Alamofire now uses Swift’s `Result` type. +- Global `Alamofire` namespace usage, which was never really necessary, has been removed and replaced with a single `AF` reference to `Session.default`. +- `ServerTrustPolicyManager` has been renamed `ServerTrustManager` and now requires every evaluated request to match one of the provided hosts. This can be disabled by initializing an instance with `allHostsMustBeEvaluated: false`. +- `ServerTrustPolicy` has be separated into a protocol, `ServerTrustEvaluating`, and several conforming types. Each case of `ServerTrustPolicy` now has equivalent types: + - `.performDefaultEvaluation` is replaced by `DefaultTrustEvaluator`. + - `.performRevokedEvaluation` is replaced by `RevocationTrustEvaluator`. + - `.pinCertificates` is replaced by `PinnedCertificatesTrustEvaluator`. + - `.pinPublicKeys` is replaced by `PublicKeysTrustEvaluator`. + - `.disableEvaluation` is replaced by `DisabledTrustEvaluator`. + - `.customEvaluation` is replaced by either using `CompositeTrustEvalutor` to combine existing `ServerTrustEvaluating` types or by creating a new type that conforms to `ServerTrustEvaluating`. +- `DataResponse` and `DownloadResponse` are now both doubly generic to both the response type as well as the error type. By default all Alamofire APIs return a `AF` prefixed response type, which defaults the `Error` type to `AFError`. +- Alamofire now returns `AFError` for all of its APIs, wrapping any underlying system or custom APIs in `AFError` instances. +- `HTTPMethod` is now a `struct` and not an `enum` and can be expanded to provide custom methods. +- `HTTPHeaders` and other types are now native Swift types rather than `typealias`es, so care must be taken when passing them to Obj-C bridged collections. +- `AFError` now has several new cases, so switching over it exhaustively will have to be updated. +- `Notification`s provided by Alamofire have had their keys renamed. You can now subscribe to: + - `Request.didResumeNotification` and `Request.didResumeTaskNotification` to be notified when `Request`s and their `URLSessionTask`s have `resume()` called. + - `Request.didSuspendNotification` and `Request.didSuspendTaskNotification` to be notified when `Request`s and their `URLSessionTask`s have `suspend()` called. + - `Request.didCancelNotification` and `Request.didCancelTaskNotification` to be notified when `Request`s and their `URLSessionTask`s have `cancel()` called. + - `Request.didFinishNotification` and `Request.didCompleteTaskNotification` to be notified when `Request`s have `finish()` called and when `URLSessionTask`s trigger the `didComplete` delegate method. +- `MultipartFormData`’s API has changed and the top level `upload` methods to create and upload `MultipartFormData` have been updated to match other request APIs, so it’s not longer necessary to deal with the `Result` of the multipart encoding. +- `NetworkReachabilityManager` has been refactored for greater reliability and simplicity. Instead of setting an update closure and then starting the listener, the closure is provided to the `startListening` method. +- `Request` and its various subclasses have been rewritten and the public API completely changed. Please see the documentation for an exhaustive list of the current functionality. +- `Timeline` and Alamofire’s previous `URLSessionTaskMetrics` handling have been replaced with native support for `URLSessionTaskMetrics`, which nows provides all timing information for Alamofire’s requests. +- cURL representations of `Request`s have been removed from the `debugDescription`, which is now useful for debug output, to a `cURLDescription` method which provides completion handler based access to the cURL command. +- `DefaultDataResponse` and `DefaultDownloadResponse` have been removed. All `response` methods now return the normal `DataResponse` or `DownloadResponse` types. +- Requirements for the `DataResponseSerializerProtocol` and `DownloadResponseSerializer` protocol have been changed from a property, `serializeResponse`, to a function, `serializeResponse`. This function can return a serialized value or throw an error, no longer requiring a `Result` return value. The new `ResponseSerializer` protocol combines the two previous protocols to simplify implementation. +- `RequestAdapter` has been updated to have an asynchronous requirement, allowing for access to async resources during request adaptation. + +## New Features +- Alamofire now vends its extensions of Swift and Foundation types through an `af` namespace. +- Serializers updated with more configuration options, including allowed empty response methods and codes, as well as the `DataPreprocessor` protocol, to prepare the received `Data` for serialization. +- **`RetryPolicy`:** A `RequestRetrier` to retry requests which failed due to system errors, such as network connectivity. Configurable with custom debounce settings and defaults to an extensive set of errors to make your requests more reliable. +- **`CachedResponseHandler`:** New protocol that provides control over whether a response is cached or not. The `ResponseCacher` type is provided as an easy to use implementation of the protocol. +- **`RedirectHandler`:** New protocol that provides control over a request’s redirect behavior. The `Redirector` type is provided as an easy to use implementation of the protocol. +- **`ParameterEncoder`:** New protocol that provides support for encoding `Encodable` values into `URLRequest`s. `JSONParameterEncoder` and `URLEncodedFormParameterEncoder` are included with Alamofire. +- **`URLEncodedFormEncoder`:** An `Encoder` that produced `URLEncodedForm` strings. diff --git a/Carthage/Checkouts/Alamofire/Documentation/Usage.md b/Carthage/Checkouts/Alamofire/Documentation/Usage.md new file mode 100644 index 00000000..b7f34e64 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Documentation/Usage.md @@ -0,0 +1,1083 @@ +* [Introduction](#introduction) + - [Aside: The `AF` Namespace](#aside-the-af-namespace-and-reference) +* [Making Requests](#making-requests) + + [HTTP Methods](#http-methods) + + [Request Parameters and Parameter Encoders](#request-parameters-and-parameter-encoders) + - [`URLEncodedFormParameterEncoder`](#urlencodedformparameterencoder) + * [GET Request With URL-Encoded Parameters](#get-request-with-url-encoded-parameters) + * [POST Request With URL-Encoded Parameters](#post-request-with-url-encoded-parameters) + * [Configuring the Sorting of Encoded Parameters](#configuring-the-sorting-of-encoded-parameters) + * [Configuring the Encoding of `Array` Parameters](#configuring-the-encoding-of-array-parameters) + * [Configuring the Encoding of `Bool` Parameters](#configuring-the-encoding-of-bool-parameters) + * [Configuring the Encoding of `Data` Parameters](#configuring-the-encoding-of-data-parameters) + * [Configuring the Encoding of `Date` Parameters](#configuring-the-encoding-of-date-parameters) + * [Configuring the Encoding of Coding Keys](#configuring-the-encoding-of-coding-keys) + * [Configuring the Encoding of Spaces](#configuring-the-encoding-of-spaces) + - [`JSONParameterEncoder`](#jsonparameterencoder) + * [POST Request with JSON-Encoded Parameters](#post-request-with-json-encoded-parameters) + * [Configuring a Custom `JSONEncoder`](#configuring-a-custom-jsonencoder) + * [Manual Parameter Encoding of a `URLRequest`](#manual-parameter-encoding-of-a-urlrequest) + + [HTTP Headers](#http-headers) + + [Response Validation](#response-validation) + - [Automatic Validation](#automatic-validation) + - [Manual Validation](#manual-validation) + + [Response Handling](#response-handling) + - [Response Handler](#response-handler) + - [Response Data Handler](#response-data-handler) + - [Response String Handler](#response-string-handler) + - [Response `Decodable` Handler](#response-decodable-handler) + - [Chained Response Handlers](#chained-response-handlers) + - [Response Handler Queue](#response-handler-queue) + + [Response Caching](#response-caching) + + [Authentication](#authentication) + - [HTTP Basic Authentication](#http-basic-authentication) + - [Authentication with `URLCredential`](#authentication-with-urlcredential) + - [Manual Authentication](#manual-authentication) + + [Downloading Data to a File](#downloading-data-to-a-file) + - [Download File Destination](#download-file-destination) + - [Download Progress](#download-progress) + - [Canceling and Resuming a Download](#canceling-and-resuming-a-download) + + [Uploading Data to a Server](#uploading-data-to-a-server) + - [Uploading Data](#uploading-data) + - [Uploading a File](#uploading-a-file) + - [Uploading Multipart Form Data](#uploading-multipart-form-data) + - [Upload Progress](#upload-progress) + + [Streaming Data from a Server](#streaming-data-from-a-server) + - [Streaming `Data`](#streaming-data) + - [Streaming `String`s](#streaming-strings) + - [Streaming `Decodable` Values](#streaming-decodable-values) + - [Producing an `InputStream`](#producing-an-inputstream) + + [Statistical Metrics](#statistical-metrics) + - [`URLSessionTaskMetrics`](#urlsessiontaskmetrics) + + [cURL Command Output](#curl-command-output) + +# Using Alamofire + +## Introduction +Alamofire provides an elegant and composable interface to HTTP network requests. It does not implement its own HTTP networking functionality. Instead it builds on top of Apple's [URL Loading System](https://developer.apple.com/documentation/foundation/url_loading_system/) provided by the Foundation framework. At the core of the system is [`URLSession`](https://developer.apple.com/documentation/foundation/urlsession) and the [`URLSessionTask`](https://developer.apple.com/documentation/foundation/urlsessiontask) subclasses. Alamofire wraps these APIs, and many others, in an easier to use interface and provides a variety of functionality necessary for modern application development using HTTP networking. However, it's important to know where many of Alamofire's core behaviors come from, so familiarity with the URL Loading System is important. Ultimately, the networking features of Alamofire are limited by the capabilities of that system, and the behaviors and best practices should always be remembered and observed. + +Additionally, networking in Alamofire (and the URL Loading System in general) is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way. + +#### Aside: The `AF` Namespace and Reference +Previous versions of Alamofire's documentation used examples like `Alamofire.request()`. This API, while it appeared to require the `Alamofire` prefix, in fact worked fine without it. The `request` method and other functions were available globally in any file with `import Alamofire`. Starting in Alamofire 5, this functionality has been removed and instead the `AF` global is a reference to `Session.default`. This allows Alamofire to offer the same convenience functionality while not having to pollute the global namespace every time Alamofire is used and not having to duplicate the `Session` API globally. Similarly, types extended by Alamofire will use an `af` property extension to separate the functionality Alamofire adds from other extensions. + +## Making Requests +Alamofire provides a variety of convenience methods for making HTTP requests. At the simplest, just provide a `String` that can be converted into a `URL`: + +```swift +AF.request("https://httpbin.org/get").response { response in + debugPrint(response) +} +``` + +> All examples require `import Alamofire` somewhere in the source file. + +> For examples of use with Swift's `async`-`await` syntax, see our [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#using-alamofire-with-swift-concurrency) documentation. + +This is actually one form of the two top-level APIs on Alamofire's `Session` type for making requests. Its full definition looks like this: + +```swift +open func request(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil) -> DataRequest +``` +This method creates a `DataRequest` while allowing the composition of requests from individual components, such as the `method` and `headers`, while also allowing per-request `RequestInterceptor`s and `Encodable` parameters. + +> There are additional methods that allow you to make requests using `Parameters` dictionaries and `ParameterEncoding` types. This API is no longer recommended and will eventually be deprecated and removed from Alamofire. + +The second version of this API is much simpler: + +```swift +open func request(_ urlRequest: URLRequestConvertible, + interceptor: RequestInterceptor? = nil) -> DataRequest +``` + +This method creates a `DataRequest` for any type conforming to Alamofire's `URLRequestConvertible` protocol. All of the different parameters from the previous version are encapsulated in that value, which can give rise to very powerful abstractions. This is discussed in our [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md) documentation. + +### HTTP Methods + +The `HTTPMethod` type lists the HTTP methods defined in [RFC 7231 §4.3](https://tools.ietf.org/html/rfc7231#section-4.3): + +```swift +public struct HTTPMethod: RawRepresentable, Equatable, Hashable { + public static let connect = HTTPMethod(rawValue: "CONNECT") + public static let delete = HTTPMethod(rawValue: "DELETE") + public static let get = HTTPMethod(rawValue: "GET") + public static let head = HTTPMethod(rawValue: "HEAD") + public static let options = HTTPMethod(rawValue: "OPTIONS") + public static let patch = HTTPMethod(rawValue: "PATCH") + public static let post = HTTPMethod(rawValue: "POST") + public static let put = HTTPMethod(rawValue: "PUT") + public static let query = HTTPMethod(rawValue: "QUERY") + public static let trace = HTTPMethod(rawValue: "TRACE") + + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} +``` + +These values can be passed as the `method` argument to the `AF.request` API: + +```swift +AF.request("https://httpbin.org/get") +AF.request("https://httpbin.org/post", method: .post) +AF.request("https://httpbin.org/put", method: .put) +AF.request("https://httpbin.org/delete", method: .delete) +``` + +It's important to remember that the different HTTP methods may have different semantics and require different parameter encodings depending on what the server expects. For instance, passing body data in a `GET` request is not supported by `URLSession` or Alamofire and will return an error. + +Alamofire also offers an extension on `URLRequest` to bridge the `httpMethod` property that returns a `String` to an `HTTPMethod` value: + +```swift +extension URLRequest { + /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type. + public var method: HTTPMethod? { + get { httpMethod.flatMap(HTTPMethod.init) } + set { httpMethod = newValue?.rawValue } + } +} +``` + +If you need to use an HTTP method that Alamofire's `HTTPMethod` type doesn't support, you can extend the type to add your custom values: + +```swift +extension HTTPMethod { + static let custom = HTTPMethod(rawValue: "CUSTOM") +} + +AF.request("https://httpbin.org/headers", method: .custom) +``` + +### Setting Other `URLRequest` Properties + +Alamofire's request creation methods offer the most common parameters for customization but sometimes those just aren't enough. The `URLRequest`s created from the passed values can be modified by using a `RequestModifier` closure when creating requests. For example, to set the `URLRequest`'s `timeoutInterval` to 5 seconds, modify the request in the closure. + +```swift +AF.request("https://httpbin.org/get", requestModifier: { $0.timeoutInterval = 5 }).response(...) +``` + +`RequestModifier`s also work with trailing closure syntax. + +```swift +AF.request("https://httpbin.org/get") { urlRequest in + urlRequest.timeoutInterval = 5 + urlRequest.allowsConstrainedNetworkAccess = false +} +.response(...) +``` + +`RequestModifier`s only apply to request created using methods taking a `URL` and other individual components, not to values created directly from `URLRequestConvertible` values, as those values should be able to set all parameters themselves. Additionally, adoption of `URLRequestConvertible` is recommended once *most* requests start needing to be modified during creation. You can read more in our [Advanced Usage documentation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#making-requests). + +### Request Parameters and Parameter Encoders + +Alamofire supports passing any `Encodable` type as the parameters of a request. These parameters are then passed through a type conforming to the `ParameterEncoder` protocol and added to the `URLRequest` which is then sent over the network. Alamofire includes two `ParameterEncoder` conforming types: `JSONParameterEncoder` and `URLEncodedFormParameterEncoder`. These types cover the most common encodings used by modern services (XML encoding is left as an exercise for the reader). + +```swift +struct Login: Encodable { + let email: String + let password: String +} + +let login = Login(email: "test@test.test", password: "testPassword") + +AF.request("https://httpbin.org/post", + method: .post, + parameters: login, + encoder: JSONParameterEncoder.default).response { response in + debugPrint(response) +} +``` + +#### `URLEncodedFormParameterEncoder` + +The `URLEncodedFormParameterEncoder` encodes values into a url-encoded string to be set as or appended to any existing URL query string or set as the HTTP body of the request. Controlling where the encoded string is set can be done by setting the `destination` of the encoding. The `URLEncodedFormParameterEncoder.Destination` enumeration has three cases: + +- `.methodDependent` - Applies the encoded query string result to existing query string for `.get`, `.head` and `.delete` requests and sets it as the HTTP body for requests with any other HTTP method. +- `.queryString` - Sets or appends the encoded string to the query of the request's `URL`. +- `.httpBody` - Sets the encoded string as the HTTP body of the `URLRequest`. + +The `Content-Type` HTTP header of an encoded request with HTTP body is set to `application/x-www-form-urlencoded; charset=utf-8`, if `Content-Type` is not already set. + +Internally, `URLEncodedFormParameterEncoder` uses `URLEncodedFormEncoder` to perform the actual encoding from an `Encodable` type to a URL encoded form `String`. This encoder can be used to customize the encoding for various types, including `Array` using the `ArrayEncoding`, `Bool` using the `BoolEncoding`, `Data` using the `DataEncoding`, `Date` using the `DateEncoding`, coding keys using the `KeyEncoding`, and spaces using the `SpaceEncoding`. + +##### GET Request With URL-Encoded Parameters + +```swift +let parameters = ["foo": "bar"] + +// All three of these calls are equivalent +AF.request("https://httpbin.org/get", parameters: parameters) // encoding defaults to `URLEncoding.default` +AF.request("https://httpbin.org/get", parameters: parameters, encoder: URLEncodedFormParameterEncoder.default) +AF.request("https://httpbin.org/get", parameters: parameters, encoder: URLEncodedFormParameterEncoder(destination: .methodDependent)) + +// https://httpbin.org/get?foo=bar +``` + +##### POST Request With URL-Encoded Parameters + +```swift +let parameters: [String: [String]] = [ + "foo": ["bar"], + "baz": ["a", "b"], + "qux": ["x", "y", "z"] +] + +// All three of these calls are equivalent +AF.request("https://httpbin.org/post", method: .post, parameters: parameters) +AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder.default) +AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: URLEncodedFormParameterEncoder(destination: .httpBody)) + +// HTTP body: "qux[]=x&qux[]=y&qux[]=z&baz[]=a&baz[]=b&foo[]=bar" +``` + +#### Configuring the Sorting of Encoded Values + +Since Swift 4.2, the hashing algorithm used by Swift's `Dictionary` type produces a random internal ordering at runtime which differs between app launches. This can cause encoded parameters to change order, which may have an impact on caching and other behaviors. By default `URLEncodedFormEncoder` will sort its encoded key-value pairs. While this produces constant output for all `Encodable` types, it may not match the actual encoding order implemented by the type. You can set `alphabetizeKeyValuePairs` to `false` to return to implementation order, though that will also have the randomized `Dictionary` order as well. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `alphabetizeKeyValuePairs` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(alphabetizeKeyValuePairs: false)) +``` + +##### Configuring the Encoding of `Array` Parameters + +Since there is no published specification for how to encode collection types, by default Alamofire follows the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`). + +The `URLEncodedFormEncoder.ArrayEncoding` enumeration provides the following methods for encoding `Array` parameters: + +- `.brackets` - An empty set of square brackets is appended to the key for every value. This is the default case. +- `.noBrackets` - No brackets are appended. The key is encoded as is. + +By default, Alamofire uses the `.brackets` encoding, where `foo = [1, 2]` is encoded as `foo[]=1&foo[]=2`. + +Using the `.noBrackets` encoding will encode `foo = [1, 2]` as `foo=1&foo=2`. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `ArrayEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(arrayEncoding: .noBrackets)) +``` + +##### Configuring the Encoding of `Bool` Parameters + +The `URLEncodedFormEncoder.BoolEncoding` enumeration provides the following methods for encoding `Bool` parameters: + +- `.numeric` - Encode `true` as `1` and `false` as `0`. This is the default case. +- `.literal` - Encode `true` and `false` as string literals. + +By default, Alamofire uses the `.numeric` encoding. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `BoolEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(boolEncoding: .numeric)) +``` + +##### Configuring the Encoding of `Data` Parameters + +`DataEncoding` includes the following methods for encoding `Data` parameters: + +- `.deferredToData` - Uses `Data`'s native `Encodable` support. +- `.base64` - Encodes `Data` as a Base 64 encoded `String`. This is the default case. +- `.custom((Data) -> throws -> String)` - Encodes `Data` using the given closure. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `DataEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(dataEncoding: .base64)) +``` + +##### Configuring the Encoding of `Date` Parameters + +Given the sheer number of ways to encode a `Date` into a `String`, `DateEncoding` includes the following methods for encoding `Date` parameters: + +- `.deferredToDate` - Uses `Date`'s native `Encodable` support. This is the default case. +- `.secondsSince1970` - Encodes `Date`s as seconds since midnight UTC on January 1, 1970. +- `.millisecondsSince1970` - Encodes `Date`s as milliseconds since midnight UTC on January 1, 1970. +- `.iso8601` - Encodes `Date`s according to the ISO 8601 and RFC3339 standards. +- `.formatted(DateFormatter)` - Encodes `Date`s using the given `DateFormatter`. +- `.custom((Date) throws -> String)` - Encodes `Date`s using the given closure. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `DateEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(dateEncoding: .iso8601)) +``` + +##### Configuring the Encoding of Coding Keys + +Due to the variety of parameter key styles, `KeyEncoding` provides the following methods to customize key encoding from keys in `lowerCamelCase`: + +- `.useDefaultKeys` - Uses the keys specified by each type. This is the default case. +- `.convertToSnakeCase` - Converts keys to snake case: `oneTwoThree` becomes `one_two_three`. +- `.convertToKebabCase` - Converts keys to kebab case: `oneTwoThree` becomes `one-two-three`. +- `.capitalized` - Capitalizes the first letter only, a.k.a `UpperCamelCase`: `oneTwoThree` becomes `OneTwoThree`. +- `.uppercased` - Uppercases all letters: `oneTwoThree` becomes `ONETWOTHREE`. +- `.lowercased` - Lowercases all letters: `oneTwoThree` becomes `onetwothree`. +- `.custom((String) -> String)` - Encodes keys using the given closure. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `KeyEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(keyEncoding: .convertToSnakeCase)) +``` + +#### Configuring the Encoding of Object Key Paths + +Nest object key paths are typically encoded using brackets (e.g. `parent[child][grandchild]`). Alamofire provides the `KeyPathEncoding` to customize that behavior. + +- `.brackets` - Wraps each sub-key in the key path in brackets. e.g `parent[child][grandchild]`. +- `.dots` - Separates each sub-key in the key path with dots. e.g. `parent.child.grandchild`. + +Additionally, you can create your own encoding by creating an instance with a custom encoding closure. For example, `KeyPathEncoding { "-\($0)" }` will separate each sub-key path with hyphens. e.g. `parent-child-grandchild`. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `KeyPathEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(keyPathEncoding: .brackets)) +``` + +##### Configuring the Encoding of Spaces + +Older form encoders used `+` to encode spaces and some servers still expect this encoding instead of the modern percent encoding, so Alamofire includes the following methods for encoding spaces: + +- `.percentEscaped` - Encodes space characters by applying standard percent escaping. `" "` is encoded as `"%20"`. This is the default case. +- `.plusReplaced` - Encodes space characters by replacing them with `+`. `" "` is encoded as `"+"`. + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `SpaceEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(spaceEncoding: .plusReplaced)) +``` + +##### Configuring the Encoding of Optionals + +There is no standard for encoding `Optional` values as part of form data. Nonetheless, Alamofire provides `NilEncoding` with the following methods for encoding optionals: + +- `.dropKey` - Encodes `nil` values by dropping them from the output entirely. This matches other Swift encoders. e.g. `otherValue=2`. +- `.dropValue` - Encodes `nil` values by dropping the value from the output. e.g. `nilValue=&otherValue=2`. +- `.null` - Encodes `nil` values as the string `null`. e.g. `nilValue=null&otherValue=2`. + +Additionally, custom encodings can be created by specifying an encoding closure that provides the `nil` replacement value. + +```swift +extension URLEncodedFormEncoder.NilEncoding { + static let customEncoding = NilEncoding { "customNilValue" } +} +``` + +You can create your own `URLEncodedFormParameterEncoder` and specify the desired `NilEncoding` in the initializer of the passed `URLEncodedFormEncoder`: + +```swift +let encoder = URLEncodedFormParameterEncoder(encoder: URLEncodedFormEncoder(nilEncoding: .dropKey)) +``` + +#### `JSONParameterEncoder` + +`JSONParameterEncoder` encodes `Encodable` values using Swift's `JSONEncoder` and sets the result as the `httpBody` of the `URLRequest`. The `Content-Type` HTTP header field of an encoded request is set to `application/json` if not already set. + +##### POST Request with JSON-Encoded Parameters + +```swift +let parameters: [String: [String]] = [ + "foo": ["bar"], + "baz": ["a", "b"], + "qux": ["x", "y", "z"] +] + +AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.default) +AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.prettyPrinted) +AF.request("https://httpbin.org/post", method: .post, parameters: parameters, encoder: JSONParameterEncoder.sortedKeys) + +// HTTP body: {"baz":["a","b"],"foo":["bar"],"qux":["x","y","z"]} +``` + +##### Configuring a Custom `JSONEncoder` + +You can customize the behavior of `JSONParameterEncoder` by passing it a `JSONEncoder` instance configured to your needs: + +```swift +let encoder = JSONEncoder() +encoder.dateEncoding = .iso8601 +encoder.keyEncodingStrategy = .convertToSnakeCase +let parameterEncoder = JSONParameterEncoder(encoder: encoder) +``` + +##### Manual Parameter Encoding of a `URLRequest` + +The `ParameterEncoder` APIs can also be used outside of Alamofire by encoding parameters directly in `URLRequest`s. + +```swift +let url = URL(string: "https://httpbin.org/get")! +var urlRequest = URLRequest(url: url) + +let parameters = ["foo": "bar"] +let encodedURLRequest = try URLEncodedFormParameterEncoder.default.encode(parameters, + into: urlRequest) +``` + +### HTTP Headers + +Alamofire includes its own `HTTPHeaders` type, an order-preserving and case-insensitive representation of HTTP header name / value pairs. The `HTTPHeader` types encapsulate a single name / value pair and provides a variety of static values for common headers. + +Adding custom `HTTPHeaders` to a `Request` is as simple as passing a value to one of the `request` methods: + +```swift +let headers: HTTPHeaders = [ + "Authorization": "Basic VXNlcm5hbWU6UGFzc3dvcmQ=", + "Accept": "application/json" +] + +AF.request("https://httpbin.org/headers", headers: headers).responseDecodable(of: DecodableType.self) { response in + debugPrint(response) +} +``` + +`HTTPHeaders` can also be constructed from an array of `HTTPHeader` values: + +```swift +let headers: HTTPHeaders = [ + .authorization(username: "Username", password: "Password"), + .accept("application/json") +] + +AF.request("https://httpbin.org/headers", headers: headers).responseDecodable(of: DecodableType.self) { response in + debugPrint(response) +} +``` + +> For HTTP headers that do not change, it is recommended to set them on the `URLSessionConfiguration` so they are automatically applied to any `URLSessionTask` created by the underlying `URLSession`. For more information, see the [Session Configurations](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#creating-a-session-with-a-urlsessionconfiguration) section. + +The default Alamofire `Session` provides a default set of headers for every `Request`. These include: + +- `Accept-Encoding`, which defaults to `br;q=1.0, gzip;q=0.8, deflate;q=0.6`, per [RFC 7230 §4.2.3](https://tools.ietf.org/html/rfc7230#section-4.2.3). +- `Accept-Language`, which defaults to up to the top 6 preferred languages on the system, formatted like `en;q=1.0`, per [RFC 7231 §5.3.5](https://tools.ietf.org/html/rfc7231#section-5.3.5). +- `User-Agent`, which contains versioning information about the current app. For example: `iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0`, per [RFC 7231 §5.5.3](https://tools.ietf.org/html/rfc7231#section-5.5.3). + +If you need to customize these headers, a custom `URLSessionConfiguration` should be created, the `headers` property updated, and the configuration applied to a new `Session` instance. Use `URLSessionConfiguration.af.default` to customize your configuration while keeping Alamofire's default headers. + +### Response Validation + +By default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate()` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type. + +#### Automatic Validation + +The `validate()` API automatically validates that status codes are within the `200..<300` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided. + +```swift +AF.request("https://httpbin.org/get").validate().responseData { response in + debugPrint(response) +} +``` + +#### Manual Validation + +```swift +AF.request("https://httpbin.org/get") + .validate(statusCode: 200..<300) + .validate(contentType: ["application/json"]) + .responseData { response in + switch response.result { + case .success: + print("Validation Successful") + case let .failure(error): + print(error) + } + } +``` + +### Response Handling + +Alamofire's `DataRequest` and `DownloadRequest` both have a corresponding response type: `DataResponse` and `DownloadResponse`. Both of these are composed of two generics: the serialized type and the error type. By default, all response values will produce the `AFError` error type (i.e. `DataResponse`). Alamofire uses the simpler `AFDataResponse` and `AFDownloadResponse`, in its public API, which always have `AFError` error types. `UploadRequest`, a subclass of `DataRequest`, uses the same `DataResponse` type. + +Handling the `DataResponse` of a `DataRequest` or `UploadRequest` made in Alamofire involves chaining a response handler like `responseDecodable` onto the `DataRequest`: + +```swift +AF.request("https://httpbin.org/get").responseDecodable(of: DecodableType.self) { response in + debugPrint(response) +} +``` + +In the above example, the `responseDecodable` handler is added to the `DataRequest` to be executed once the `DataRequest` is complete. The closure passed to the handler receives the `DataResponse` value produced by the `DecodableResponseSerializer` from the `URLRequest`, `HTTPURLResponse`, `Data`, and `Error` produced by the request. + +Rather than blocking execution to wait for a response from the server, this closure is added as a [callback](https://en.wikipedia.org/wiki/Callback_%28computer_programming%29) to handle the response once it's received. The result of a request is only available inside the scope of a response closure. Any execution contingent on the response or data received from the server must be done within a response closure. + +> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way. + +Alamofire contains five different data response handlers by default, including: + +```swift +// Response Handler - Unserialized Response +func response(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// Response Serializer Handler - Serialize using the passed Serializer +func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// Response Data Handler - Serialized into Data +func responseData(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// Response String Handler - Serialized into String +func responseString(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self + +// Response Decodable Handler - Serialized into Decodable Type +func responseDecodable(of type: T.Type = T.self, + queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self +``` + +None of the response handlers perform any validation of the `HTTPURLResponse` it gets back from the server. + +> For example, response status codes in the `400..<500` and `500..<600` ranges do NOT automatically trigger an `Error`. Alamofire uses [Response Validation](#response-validation) method chaining to achieve this. + +#### Response Handler + +The `response` handler does NOT evaluate any of the response data. It merely forwards on all information directly from the `URLSessionDelegate`. It is the Alamofire equivalent of using `cURL` to execute a `Request`. + +```swift +AF.request("https://httpbin.org/get").response { response in + debugPrint("Response: \(response)") +} +``` + +> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types. + +#### Response Data Handler + +The `responseData` handler uses a `DataResponseSerializer` to extract and validate the `Data` returned by the server. If no errors occur and `Data` is returned, the response `Result` will be a `.success` and the `value` will be the `Data` returned from the server. + +```swift +AF.request("https://httpbin.org/get").responseData { response in + debugPrint("Response: \(response)") +} +``` + +#### Response String Handler + +The `responseString` handler uses a `StringResponseSerializer` to convert the `Data` returned by the server into a `String` with the specified encoding. If no errors occur and the server data is successfully serialized into a `String`, the response `Result` will be a `.success` and the `value` will be of type `String`. + +```swift +AF.request("https://httpbin.org/get").responseString { response in + debugPrint("Response: \(response)") +} +``` + +> If no encoding is specified, Alamofire will use the text encoding specified in the `HTTPURLResponse` from the server. If the text encoding cannot be determined by the server response, it defaults to `.isoLatin1`. + +#### Response `Decodable` Handler + +The `responseDecodable` handler uses a `DecodableResponseSerializer` to convert the `Data` returned by the server into the passed `Decodable` type using the specified `DataDecoder` (a protocol abstraction for `Decoder`s which can decode from `Data`). If no errors occur and the server data is successfully decoded into a `Decodable` type, the response `Result` will be a `.success` and the `value` will be of the passed type. + +```swift +struct DecodableType: Decodable { let url: String } + +AF.request("https://httpbin.org/get").responseDecodable(of: DecodableType.self) { response in + debugPrint("Response: \(response)") +} +``` + +#### Chained Response Handlers + +Response handlers can also be chained: + +```swift +Alamofire.request("https://httpbin.org/get") + .responseString { response in + print("Response String: \(response.value)") + } + .responseDecodable(of: DecodableType.self) { response in + print("Response DecodableType: \(response.value)") + } +``` + +> It is important to note that using multiple response handlers on the same `Request` requires the server data to be serialized multiple times, once for each response handler. Using multiple response handlers on the same `Request` should generally be avoided as best practice, especially in production environments. They should only be used for debugging or in circumstances where there is no better option. + +#### Response Handler Queue + +Closures passed to response handlers are executed on the `.main` queue by default, but a specific `DispatchQueue` can be passed on which to execute the closure. Actual serialization work (conversion of `Data` to some other type) is always executed in the background on either the `rootQueue` or the `serializationQueue`, if one was provided, of the `Session` issuing the request. + +```swift +let utilityQueue = DispatchQueue.global(qos: .utility) + +AF.request("https://httpbin.org/get").responseDecodable(of: DecodableType.self, queue: utilityQueue) { response in + print("This closure is executed on utilityQueue.") + debugPrint(response) +} +``` + +### Response Caching + +Response caching is handled on the system framework level by [`URLCache`](https://developer.apple.com/reference/foundation/urlcache). It provides a composite in-memory and on-disk cache and lets you manipulate the sizes of both the in-memory and on-disk portions. + +> By default, Alamofire leverages the `URLCache.shared` instance. In order to customize the `URLCache` instance used, see the [Session Configuration](AdvancedUsage.md#session-manager) section. + +### Authentication + +Authentication is handled on the system framework level by [`URLCredential`](https://developer.apple.com/reference/foundation/nsurlcredential) and [`URLAuthenticationChallenge`](https://developer.apple.com/reference/foundation/urlauthenticationchallenge). + +> These authentication APIs are for servers which prompt for authorization, not general use with APIs which require an `Authenticate` or equivalent header. + +**Supported Authentication Schemes** + +- [HTTP Basic](https://en.wikipedia.org/wiki/Basic_access_authentication) +- [HTTP Digest](https://en.wikipedia.org/wiki/Digest_access_authentication) +- [Kerberos](https://en.wikipedia.org/wiki/Kerberos_%28protocol%29) +- [NTLM](https://en.wikipedia.org/wiki/NT_LAN_Manager) + +#### HTTP Basic Authentication + +The `authenticate` method on a `Request` will automatically provide a `URLCredential` when challenged with a `URLAuthenticationChallenge` when appropriate: + +```swift +let user = "user" +let password = "password" + +AF.request("https://httpbin.org/basic-auth/\(user)/\(password)") + .authenticate(username: user, password: password) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +#### Authentication with `URLCredential` + +```swift +let user = "user" +let password = "password" + +let credential = URLCredential(user: user, password: password, persistence: .forSession) + +AF.request("https://httpbin.org/basic-auth/\(user)/\(password)") + .authenticate(with: credential) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +> It is important to note that when using a `URLCredential` for authentication, the underlying `URLSession` will actually end up making two requests if a challenge is issued by the server. The first request will not include the credential which "may" trigger a challenge from the server. The challenge is then received by Alamofire, the credential is appended and the request is retried by the underlying `URLSession`. + +#### Manual Authentication + +If you are communicating with an API that always requires an `Authenticate` or similar header without prompting, it can be added manually: + +```swift +let user = "user" +let password = "password" + +let headers: HTTPHeaders = [.authorization(username: user, password: password)] + +AF.request("https://httpbin.org/basic-auth/user/password", headers: headers) + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +However, headers that must be part of all requests are often better handled as part of a custom [`URLSessionConfiguration`](AdvancedUsage.md#session-manager), or by using a [`RequestAdapter`](AdvancedUsage.md#request-adapter). + +### Downloading Data to a File + +In addition to fetching data into memory, Alamofire also provides the `Session.download`, `DownloadRequest`, and `DownloadResponse` APIs to facilitate downloading to disk. While downloading into memory works great for small payloads like most JSON API responses, fetching larger assets like images and videos should be downloaded to disk to avoid memory issues with your application. + +```swift +AF.download("https://httpbin.org/image/png").responseURL { response in + // Read file from provided file URL. +} +``` + +In addition to having the same response handlers that `DataRequest` does, `DownloadRequest` also includes `responseURL`. Unlike the other response handlers, this handler just returns the `URL` containing the location of the downloaded data and does not read the `Data` from disk. + +Other response handlers, like `responseDecodable`, involve reading the response `Data` from disk. This may involve reading large amounts of data into memory, so it's important to keep that in mind when using those handlers for downloads. + +#### Download File Destination + +All downloaded data is initially stored in the system temporary directory. It will eventually be deleted by the system at some point in the future, so if it's something that needs to live longer, it's important to move the file somewhere else. + +You can provide a `Destination` closure to move the file from the temporary directory to a final destination. Before the temporary file is actually moved to the `destinationURL`, the `Options` specified in the closure will be executed. The two currently supported `Options` are: + +- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified. +- `.removePreviousFile` - Removes a previous file from the destination URL if specified. + +```swift +let destination: DownloadRequest.Destination = { _, _ in + let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + let fileURL = documentsURL.appendingPathComponent("image.png") + + return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) +} + +AF.download("https://httpbin.org/image/png", to: destination).response { response in + debugPrint(response) + + if response.error == nil, let imagePath = response.fileURL?.path { + let image = UIImage(contentsOfFile: imagePath) + } +} +``` + +You can also use the suggested download destination API: + +```swift +let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory) + +AF.download("https://httpbin.org/image/png", to: destination) +``` + +#### Download Progress + +Many times it can be helpful to report download progress to the user. Any `DownloadRequest` can report download progress using the `downloadProgress` API. + +```swift +AF.download("https://httpbin.org/image/png") + .downloadProgress { progress in + print("Download Progress: \(progress.fractionCompleted)") + } + .responseData { response in + if let data = response.value { + let image = UIImage(data: data) + } + } +``` + +> The progress reporting APIs for `URLSession`, and therefore Alamofire, only work if the server properly returns a `Content-Length` header that can be used to calculate the progress. Without that header, progress will stay at `0.0` until the download completes, at which point the progress will jump to `1.0`. + +The `downloadProgress` API can also take a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on. + +```swift +let progressQueue = DispatchQueue(label: "com.alamofire.progressQueue", qos: .utility) + +AF.download("https://httpbin.org/image/png") + .downloadProgress(queue: progressQueue) { progress in + print("Download Progress: \(progress.fractionCompleted)") + } + .responseData { response in + if let data = response.value { + let image = UIImage(data: data) + } + } +``` + +#### Canceling and Resuming a Download + +In addition to the `cancel()` API that all `Request` classes have, `DownloadRequest`s can also produce resume data, which can be used to later resume a download. There are two forms of this API: `cancel(producingResumeData: Bool)`, which allows control over whether resume data is produced, but only makes it available on the `DownloadResponse`; and `cancel(byProducingResumeData: (_ resumeData: Data?) -> Void)`, which performs the same actions but makes the resume data available in the completion handler. + +If a `DownloadRequest` is canceled or interrupted, the underlying `URLSessionDownloadTask` *may* generate resume data. If this happens, the resume data can be re-used to restart the `DownloadRequest` where it left off. + +> **IMPORTANT:** On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1), `resumeData` is broken on background `URLSessionConfiguration`s. There's an underlying bug in the `resumeData` generation logic where the data is written incorrectly and will always fail to resume the download. For more information about the bug and possible workarounds, please see this [Stack Overflow post](https://stackoverflow.com/a/39347461/1342462). + +```swift +var resumeData: Data! + +let download = AF.download("https://httpbin.org/image/png").responseData { response in + if let data = response.value { + let image = UIImage(data: data) + } +} + +// download.cancel(producingResumeData: true) // Makes resumeData available in response only. +download.cancel { data in + resumeData = data +} + +AF.download(resumingWith: resumeData).responseData { response in + if let data = response.value { + let image = UIImage(data: data) + } +} +``` + +### Uploading Data to a Server + +When sending relatively small amounts of data to a server using JSON or URL encoded parameters, the `request()` APIs are usually sufficient. If you need to send much larger amounts of data from `Data` in memory, a file `URL`, or an `InputStream`, then the `upload()` APIs are what you want to use. + +#### Uploading Data + +```swift +let data = Data("data".utf8) + +AF.upload(data, to: "https://httpbin.org/post").responseDecodable(of: DecodableType.self) { response in + debugPrint(response) +} +``` + +#### Uploading a File + +```swift +let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") + +AF.upload(fileURL, to: "https://httpbin.org/post").responseDecodable(of: DecodableType.self) { response in + debugPrint(response) +} +``` + +#### Uploading Multipart Form Data + +```swift +AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(Data("one".utf8), withName: "one") + multipartFormData.append(Data("two".utf8), withName: "two") +}, to: "https://httpbin.org/post") + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +#### Upload Progress + +While your user is waiting for their upload to complete, sometimes it can be handy to show the progress of the upload to the user. Any `UploadRequest` can report both upload progress of the upload and download progress of the response data download using the `uploadProgress` and `downloadProgress` APIs. + +```swift +let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") + +AF.upload(fileURL, to: "https://httpbin.org/post") + .uploadProgress { progress in + print("Upload Progress: \(progress.fractionCompleted)") + } + .downloadProgress { progress in + print("Download Progress: \(progress.fractionCompleted)") + } + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response) + } +``` + +### Streaming Data from a Server + +Large downloads or long lasting server connections which receive data over time may be better served by streaming rather than accumulating `Data` as it arrives. Alamofire offers the `DataStreamRequest` type and associated APIs to handle this usage. Although it offers much of the same API as other `Request`s, there are several key differences. Most notably, `DataStreamRequest` never accumulates `Data` in memory or saves it to disk. Instead, added `responseStream` closures are repeatedly called as `Data` arrives. The same closures are called again when the connection has completed or received an error. + +Every `Handler` closure captures a `Stream` value, which contains both the `Event` being processed as well as a `CancellationToken`, which can be used to cancel the request. + +```swift +public struct Stream { + /// Latest `Event` from the stream. + public let event: Event + /// Token used to cancel the stream. + public let token: CancellationToken + /// Cancel the ongoing stream by canceling the underlying `DataStreamRequest`. + public func cancel() { + token.cancel() + } +} +``` + +An `Event` is an `enum` representing two possible stream states. + +```swift +public enum Event { + /// Output produced every time the instance receives additional `Data`. The associated value contains the + /// `Result` of processing the incoming `Data`. + case stream(Result) + /// Output produced when the instance has completed, whether due to stream end, cancellation, or an error. + /// Associated `Completion` value contains the final state. + case complete(Completion) +} +``` + +When complete, the `Completion` value will contain the state of the `DataStreamRequest` when the stream ended. + +```swift +public struct Completion { + /// Last `URLRequest` issued by the instance. + public let request: URLRequest? + /// Last `HTTPURLResponse` received by the instance. + public let response: HTTPURLResponse? + /// Last `URLSessionTaskMetrics` produced for the instance. + public let metrics: URLSessionTaskMetrics? + /// `AFError` produced for the instance, if any. + public let error: AFError? +} +``` + +#### Streaming `Data` + +Streaming `Data` from a server can be accomplished like other Alamofire requests, but with a `Handler` closure added. + +```swift +func responseStream(on queue: DispatchQueue = .main, stream: @escaping Handler) -> Self +``` + +The provided `queue` is where the `Handler` closure will be called. + +```swift +AF.streamRequest(...).responseStream { stream in + switch stream.event { + case let .stream(result): + switch result { + case let .success(data): + print(data) + } + case let .complete(completion): + print(completion) + } +} +``` + +> Handling the `.failure` case of the `Result` in the example above is unnecessary, as receiving `Data` can never fail. + +#### Streaming `String`s + +Like `Data` streaming, `String`s can be streamed by adding a `Handler`. + +```swift +func responseStreamString(on queue: DispatchQueue = .main, + stream: @escaping StreamHandler) -> Self +``` + +`String` values are decoded as `UTF8` and the decoding cannot fail. + +```swift +AF.streamRequest(...).responseStreamString { stream in + switch stream.event { + case let .stream(result): + switch result { + case let .success(string): + print(string) + } + case let .complete(completion): + print(completion) + } +} +``` + +#### Streaming `Decodable` Values + +Incoming stream `Data` values can be turned into any `Decodable` value using `responseStreamDecodable`. + +```swift +func responseStreamDecodable(of type: T.Type = T.self, + on queue: DispatchQueue = .main, + using decoder: DataDecoder = JSONDecoder(), + preprocessor: DataPreprocessor = PassthroughPreprocessor(), + stream: @escaping Handler) -> Self +``` + +Decoding failures do not end the stream, but instead produce an `AFError` in the `Result` of the `Output`. + +```swift +AF.streamRequest(...).responseStreamDecodable(of: SomeType.self) { stream in + switch stream.event { + case let .stream(result): + switch result { + case let .success(value): + print(value) + case let .failure(error): + print(error) + } + case let .complete(completion): + print(completion) + } +} +``` + +#### Producing an `InputStream` + +In addition to handling incoming `Data` using `StreamHandler` closures, `DataStreamRequest` can produce an `InputStream` value which can be used to read bytes as they arrive. + +```swift +func asInputStream(bufferSize: Int = 1024) -> InputStream +``` + +`InputStream`s produced in this manner must have `open()` called before reading can start, or be passed to an API that opens the stream automatically. Once returned from this method, it's the caller's responsibility to keep the `InputStream` value alive and to call `close()` after reading is complete. + +```swift +let inputStream = AF.streamRequest(...) + .responseStream { output in + ... + } + .asInputStream() +``` + +#### Cancellation + +`DataStreamRequest`s can be cancelled in four ways. First, like all other Alamofire `Request`s, `DataStreamRequest` can have `cancel()` called, canceling the underlying task and completing the stream. + +```swift +let request = AF.streamRequest(...).responseStream(...) +... +request.cancel() +``` + +Second, `DataStreamRequest`s can be cancelled automatically when their `DataStreamSerializer` encounters and error. This behavior is disabled by default and can be enabled by passing the `automaticallyCancelOnStreamError` parameter when creating the request. + +```swift +AF.streamRequest(..., automaticallyCancelOnStreamError: true).responseStream(...) +``` + +Third, `DataStreamRequest`s will be cancelled if an error is thrown out of the `Handler` closure. This error is then stored on the request and is available in the `Completion` value. + +```swift +AF.streamRequest(...).responseStream { stream in + // Process stream. + throw SomeError() // Cancels request. +} +``` + +Finally, `DataStreamRequest`s can be cancelled by using the `Stream` value's `cancel()` method. + +```swift +AF.streamRequest(...).responseStream { stream in + // Decide to cancel request. + stream.cancel() +} +``` + +### Statistical Metrics + +#### `URLSessionTaskMetrics` + +Alamofire gathers `URLSessionTaskMetrics` for every `Request`. `URLSessionTaskMetrics` encapsulate some fantastic statistical information about the underlying network connection and request and response timing. + +```swift +AF.request("https://httpbin.org/get").responseDecodable(of: DecodableType.self) { response in + print(response.metrics) +} +``` + +> Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS is currently disabled. + +### cURL Command Output + +Debugging platform issues can be frustrating. Thankfully, Alamofire's `Request` type can produce the equivalent cURL command for easy debugging. Due to the asynchronous nature of Alamofire's `Request` creation, this API has both synchronous and asynchronous versions. To get the cURL command as soon as possible, you can chain the `cURLDescription` onto a request: + +```swift +AF.request("https://httpbin.org/get") + .cURLDescription { description in + print(description) + } + .responseDecodable(of: DecodableType.self) { response in + debugPrint(response.metrics) + } +``` + +This should produce: + +```bash +$ curl -v \ +-X GET \ +-H "Accept-Language: en;q=1.0" \ +-H "Accept-Encoding: br;q=1.0, gzip;q=0.9, deflate;q=0.8" \ +-H "User-Agent: Demo/1.0 (com.demo.Demo; build:1; iOS 15.0.0) Alamofire/1.0" \ +"https://httpbin.org/get" +``` diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/LaunchScreen.storyboard b/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..2d5bcd20 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/Main.storyboard b/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/Main.storyboard new file mode 100644 index 00000000..b74839e5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Base.lproj/Main.storyboard @@ -0,0 +1,369 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d8db8d65 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Contents.json b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Contents.json b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Contents.json new file mode 100644 index 00000000..bd086a5b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Logo.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Logo@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Logo.png b/Carthage/Checkouts/Alamofire/Example/Resources/Images.xcassets/Logo.imageset/Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4060979e1fd1d494326f16a587fb776564fd42db GIT binary patch literal 5710 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�`?0BIRk+%}&$3Y+=eI`EQ!G4W3>*m+`u=>I@ z^bWi51Kkvim`TaQXEqw$zsL={ha*Kq%{6GmEYlVm++kU7rlb0bHsn+Y*wqmpd4|AM zV!5Md{WOPbK+PAlAeDC4fZzZ(Mj)SPF% zZQ-6gnzk9GRQyA^$BUo?KB%ZSrye_+dIvI9kN$F<)C^O6;xtGQDQs60I|Y4;(y*w> zu&Ap5-m@d z?v=C6xIfEd9f{#X+DhvMguo!_kGM~&>H0rbmqvn_h5WX~UVE@A&kM^ox!&58GR!wi z8OVmo*{bVP(_2*7y0nHT5iH18xpUpCWU>7L()ljqiQ`C*dXK+dOdaEq{&1Fto`k;{ z(69IWV5v7bHlTXGzvZtwG@41gD;2Men4>~>8Aa=_Le1VA$#RI6%~RZ{&!#w9@Vq_3 zN0OaT1!|Grj3Hbtv8ii3d^KOiNMAB3+pFK+q4~r7V-nu<+5(b%liBQr_paXgQE?%; zI1lDqy##G@#e4SYeOUbo2QifY3{0UGCnm?_qano(a-01^DU(b+!`XyacQ2gE=m@cp zf;795FuL(XTg02Za*^rGarEOuSGQRPC3YfM_=;^g8}@0B!}#=L1D5%tOInYK$s8LG z7!Q5&rLF012dzi$*xek5*|j~*ior;Ay5;{0xLWb0d~dP%n@NC<Ey*uIQby*XP z6Iwof%S|zAZ)h~u419_cc9!ugalsv^n){N&wogp2_Ob_?@~X!am$so4-`F9qG`ECN zsg(R&u=QDK5X`l{n#Vti?icXtlv?4W31ae#_HH1;5?Y=J=#*r0@?Tx4QmNoe)18$& zt7T&VeNru9xdv0pP5v6rCD#2mT~&yG3CcQ^Yyg{KOzX|0X{qgR`lWnx$>aoc62#g* zr_-Gir2;JZX=3Q(Jf&a~t1Q_1OyHVASaP_KUACe`mG9ZuYgnsNrGLcy_N|Bs>^t0 z4HX0hE1VI1mZX=<&7>R=!9tY^`>133o&cKd3|Sp9O_M|CKQ6@$(mAmI5im}hWMO(S zaZINcUW)0cxyZT4WV~V`@C13!WRAz=`_YAd^rhFZ`gTe#6_$Hva;E3^LKHKU|GOn& d+Ro@eWJhqh_=R~RhTk{5IUI-M#S+etGxV`+Rqd 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

F4mjn*ITn!dUWa|u#B4O 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 JrIcC7{{vs>`_}*f literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Example/Resources/Info.plist b/Carthage/Checkouts/Alamofire/Example/Resources/Info.plist new file mode 100644 index 00000000..5c42ca7c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Resources/Info.plist @@ -0,0 +1,57 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Alamofire + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Carthage/Checkouts/Alamofire/Example/Source/AppDelegate.swift b/Carthage/Checkouts/Alamofire/Example/Source/AppDelegate.swift new file mode 100644 index 00000000..171a59b2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Source/AppDelegate.swift @@ -0,0 +1,59 @@ +// +// AppDelegate.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { + // MARK: - Properties + + var window: UIWindow? + + // MARK: - UIApplicationDelegate + + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { + let splitViewController = window!.rootViewController as! UISplitViewController + let navigationController = splitViewController.viewControllers.last as! UINavigationController + navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem + splitViewController.delegate = self + + return true + } + + // MARK: - UISplitViewControllerDelegate + + func splitViewController(_ splitViewController: UISplitViewController, + collapseSecondary secondaryViewController: UIViewController, + onto primaryViewController: UIViewController) + -> Bool { + if + let secondaryAsNavController = secondaryViewController as? UINavigationController, + let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController { + return topAsDetailController.request == nil + } + + return false + } +} diff --git a/Carthage/Checkouts/Alamofire/Example/Source/DetailViewController.swift b/Carthage/Checkouts/Alamofire/Example/Source/DetailViewController.swift new file mode 100644 index 00000000..8719b88b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Source/DetailViewController.swift @@ -0,0 +1,215 @@ +// +// DetailViewController.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import UIKit + +class DetailViewController: UITableViewController { + enum Sections: Int { + case headers, body + } + + var request: Request? { + didSet { + oldValue?.cancel() + + title = request?.description + request?.onURLRequestCreation { [weak self] _ in + self?.title = self?.request?.description + } + + refreshControl?.endRefreshing() + headers.removeAll() + body = nil + elapsedTime = nil + } + } + + var headers: [String: String] = [:] + var body: String? + var elapsedTime: TimeInterval? + var segueIdentifier: String? + + static let numberFormatter: NumberFormatter = { + let formatter = NumberFormatter() + formatter.numberStyle = .decimal + return formatter + }() + + // MARK: View Lifecycle + + override func awakeFromNib() { + super.awakeFromNib() + refreshControl?.addTarget(self, action: #selector(DetailViewController.refresh), for: .valueChanged) + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + refresh() + } + + // MARK: IBActions + + @IBAction func refresh() { + guard let request = request else { + return + } + + refreshControl?.isHidden = false + refreshControl?.beginRefreshing() + + let start = CACurrentMediaTime() + + let requestComplete: (HTTPURLResponse?, Result) -> Void = { response, result in + let end = CACurrentMediaTime() + self.elapsedTime = end - start + + if let response = response { + for (field, value) in response.allHeaderFields { + self.headers["\(field)"] = "\(value)" + } + } + + if let segueIdentifier = self.segueIdentifier { + switch segueIdentifier { + case "GET", "POST", "PUT", "DELETE": + if case let .success(value) = result { self.body = value } + case "DOWNLOAD": + self.body = self.downloadedBodyString() + default: + break + } + } + + self.tableView.reloadData() + self.refreshControl?.endRefreshing() + } + + if let request = request as? DataRequest { + request.responseString { response in + requestComplete(response.response, response.result) + } + } else if let request = request as? DownloadRequest { + request.responseString { response in + requestComplete(response.response, response.result) + } + } + } + + private func downloadedBodyString() -> String { + let fileManager = FileManager.default + let cachesDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0] + + do { + let contents = try fileManager.contentsOfDirectory(at: cachesDirectory, + includingPropertiesForKeys: nil, + options: .skipsHiddenFiles) + + if let fileURL = contents.first, let data = try? Data(contentsOf: fileURL) { + let json = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) + let prettyData = try JSONSerialization.data(withJSONObject: json, options: .prettyPrinted) + + if let prettyString = String(data: prettyData, encoding: String.Encoding.utf8) { + try fileManager.removeItem(at: fileURL) + return prettyString + } + } + } catch { + // No-op + } + + return "" + } +} + +// MARK: - UITableViewDataSource + +extension DetailViewController { + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + switch Sections(rawValue: section)! { + case .headers: + return headers.count + case .body: + return body == nil ? 0 : 1 + } + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + switch Sections(rawValue: indexPath.section)! { + case .headers: + let cell = tableView.dequeueReusableCell(withIdentifier: "Header")! + let field = headers.keys.sorted(by: <)[indexPath.row] + let value = headers[field] + + cell.textLabel?.text = field + cell.detailTextLabel?.text = value + + return cell + case .body: + let cell = tableView.dequeueReusableCell(withIdentifier: "Body")! + cell.textLabel?.text = body + + return cell + } + } +} + +// MARK: - UITableViewDelegate + +extension DetailViewController { + override func numberOfSections(in tableView: UITableView) -> Int { + 2 + } + + override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + if self.tableView(tableView, numberOfRowsInSection: section) == 0 { + return "" + } + + switch Sections(rawValue: section)! { + case .headers: + return "Headers" + case .body: + return "Body" + } + } + + override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + switch Sections(rawValue: indexPath.section)! { + case .body: + return 300 + default: + return tableView.rowHeight + } + } + + override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? { + if Sections(rawValue: section) == .body, let elapsedTime = elapsedTime { + let elapsedTimeText = DetailViewController.numberFormatter.string(from: elapsedTime as NSNumber) ?? "???" + return "Elapsed Time: \(elapsedTimeText) sec" + } + + return "" + } +} diff --git a/Carthage/Checkouts/Alamofire/Example/Source/MasterViewController.swift b/Carthage/Checkouts/Alamofire/Example/Source/MasterViewController.swift new file mode 100644 index 00000000..df18280e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/Source/MasterViewController.swift @@ -0,0 +1,101 @@ +// +// MasterViewController.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import UIKit + +class MasterViewController: UITableViewController { + // MARK: - Properties + + @IBOutlet var titleImageView: UIImageView! + + var detailViewController: DetailViewController? + + private var reachability: NetworkReachabilityManager! + + // MARK: - View Lifecycle + + override func awakeFromNib() { + super.awakeFromNib() + + navigationItem.titleView = titleImageView + clearsSelectionOnViewWillAppear = true + + reachability = NetworkReachabilityManager.default + monitorReachability() + } + + // MARK: - UIStoryboardSegue + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if + let navigationController = segue.destination as? UINavigationController, + let detailViewController = navigationController.topViewController as? DetailViewController { + func requestForSegue(_ segue: UIStoryboardSegue) -> Request? { + switch segue.identifier! { + case "GET": + detailViewController.segueIdentifier = "GET" + return AF.request("https://httpbin.org/get") + case "POST": + detailViewController.segueIdentifier = "POST" + return AF.request("https://httpbin.org/post", method: .post) + case "PUT": + detailViewController.segueIdentifier = "PUT" + return AF.request("https://httpbin.org/put", method: .put) + case "DELETE": + detailViewController.segueIdentifier = "DELETE" + return AF.request("https://httpbin.org/delete", method: .delete) + case "DOWNLOAD": + detailViewController.segueIdentifier = "DOWNLOAD" + let destination = DownloadRequest.suggestedDownloadDestination(for: .cachesDirectory, + in: .userDomainMask) + return AF.download("https://httpbin.org/stream/1", to: destination) + default: + return nil + } + } + + if let request = requestForSegue(segue) { + detailViewController.request = request + } + } + } + + // MARK: - UITableViewDelegate + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if indexPath.section == 3 && indexPath.row == 0 { + print("Reachability Status: \(reachability.status)") + tableView.deselectRow(at: indexPath, animated: true) + } + } + + // MARK: - Private - Reachability + + private func monitorReachability() { + reachability.startListening { status in + print("Reachability Status Changed: \(status)") + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.pbxproj b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c0db7e1e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.pbxproj @@ -0,0 +1,532 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 3129D57622F230AE009C145F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3129D57422F230AE009C145F /* LaunchScreen.storyboard */; }; + 31E476821C55DE6D00968569 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 31E4766A1C55DD5900968569 /* Alamofire.framework */; }; + 31E476831C55DE6D00968569 /* Alamofire.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 31E4766A1C55DD5900968569 /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4C6D2C801C67EFE100846168 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6D2C7D1C67EFE100846168 /* AppDelegate.swift */; }; + 4C6D2C811C67EFE100846168 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6D2C7E1C67EFE100846168 /* DetailViewController.swift */; }; + 4C6D2C821C67EFE100846168 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C6D2C7F1C67EFE100846168 /* MasterViewController.swift */; }; + 4C6D2C8F1C67EFEC00846168 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C6D2C8C1C67EFEC00846168 /* Images.xcassets */; }; + 4C6D2C981C67F03B00846168 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4C6D2C961C67F03B00846168 /* Main.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 31AB09122733010700986A70 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 31293065263E17D600473CEA; + remoteInfo = "Alamofire watchOS Tests"; + }; + 31E476691C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = F8111E3319A95C8B0040E7D1; + remoteInfo = "Alamofire iOS"; + }; + 31E4766B1C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = F8111E3E19A95C8B0040E7D1; + remoteInfo = "Alamofire iOS Tests"; + }; + 31E4766D1C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4DD67C0B1A5C55C900ED2280; + remoteInfo = "Alamofire OSX"; + }; + 31E4766F1C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = F829C6B21A7A94F100A2CD59; + remoteInfo = "Alamofire OSX Tests"; + }; + 31E476711C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4CF626EF1BA7CB3E0011A099; + remoteInfo = "Alamofire tvOS"; + }; + 31E476731C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 4CF626F81BA7CB3E0011A099; + remoteInfo = "Alamofire tvOS Tests"; + }; + 31E476751C55DD5900968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = E4202FE01B667AA100C997FB; + remoteInfo = "Alamofire watchOS"; + }; + 31E476841C55DE6D00968569 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = F8111E3219A95C8B0040E7D1; + remoteInfo = "Alamofire iOS"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + F818D0E519CA8D15006034B1 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 31E476831C55DE6D00968569 /* Alamofire.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 3129D57522F230AE009C145F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Resources/Base.lproj/LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; + 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Alamofire.xcodeproj; path = ../Alamofire.xcodeproj; sourceTree = ""; }; + 4C6D2C7D1C67EFE100846168 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Source/AppDelegate.swift; sourceTree = SOURCE_ROOT; }; + 4C6D2C7E1C67EFE100846168 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DetailViewController.swift; path = Source/DetailViewController.swift; sourceTree = SOURCE_ROOT; }; + 4C6D2C7F1C67EFE100846168 /* MasterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MasterViewController.swift; path = Source/MasterViewController.swift; sourceTree = SOURCE_ROOT; }; + 4C6D2C8C1C67EFEC00846168 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Resources/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 4C6D2C8D1C67EFEC00846168 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = SOURCE_ROOT; }; + 4C6D2C971C67F03B00846168 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Main.storyboard; sourceTree = ""; }; + F8111E0519A951050040E7D1 /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + F8111E0219A951050040E7D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 31E476821C55DE6D00968569 /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 31E476601C55DD5900968569 /* Products */ = { + isa = PBXGroup; + children = ( + 31E4766A1C55DD5900968569 /* Alamofire.framework */, + 31E4766C1C55DD5900968569 /* Alamofire iOS Tests.xctest */, + 31E4766E1C55DD5900968569 /* Alamofire.framework */, + 31E476701C55DD5900968569 /* Alamofire macOS Tests.xctest */, + 31E476721C55DD5900968569 /* Alamofire.framework */, + 31E476741C55DD5900968569 /* Alamofire tvOS Tests.xctest */, + 31E476761C55DD5900968569 /* Alamofire.framework */, + 31AB09132733010700986A70 /* Alamofire watchOS Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 4C6D2C951C67F03B00846168 /* Base.lproj */ = { + isa = PBXGroup; + children = ( + 3129D57422F230AE009C145F /* LaunchScreen.storyboard */, + 4C6D2C961C67F03B00846168 /* Main.storyboard */, + ); + name = Base.lproj; + path = Resources/Base.lproj; + sourceTree = SOURCE_ROOT; + }; + F8111DFC19A951050040E7D1 = { + isa = PBXGroup; + children = ( + F8111E0719A951050040E7D1 /* Source */, + F8111E0619A951050040E7D1 /* Products */, + 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */, + ); + indentWidth = 4; + sourceTree = ""; + tabWidth = 4; + usesTabs = 0; + }; + F8111E0619A951050040E7D1 /* Products */ = { + isa = PBXGroup; + children = ( + F8111E0519A951050040E7D1 /* iOS Example.app */, + ); + name = Products; + sourceTree = ""; + }; + F8111E0719A951050040E7D1 /* Source */ = { + isa = PBXGroup; + children = ( + 4C6D2C7D1C67EFE100846168 /* AppDelegate.swift */, + 4C6D2C7E1C67EFE100846168 /* DetailViewController.swift */, + 4C6D2C7F1C67EFE100846168 /* MasterViewController.swift */, + F8111E0819A951050040E7D1 /* Supporting Files */, + ); + path = Source; + sourceTree = ""; + }; + F8111E0819A951050040E7D1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 4C6D2C8D1C67EFEC00846168 /* Info.plist */, + 4C6D2C8C1C67EFEC00846168 /* Images.xcassets */, + 4C6D2C951C67F03B00846168 /* Base.lproj */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + F8111E0419A951050040E7D1 /* iOS Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = F8111E2319A951050040E7D1 /* Build configuration list for PBXNativeTarget "iOS Example" */; + buildPhases = ( + F8111E0119A951050040E7D1 /* Sources */, + F8111E0219A951050040E7D1 /* Frameworks */, + F8111E0319A951050040E7D1 /* Resources */, + F818D0E519CA8D15006034B1 /* Copy Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 31E476851C55DE6D00968569 /* PBXTargetDependency */, + ); + name = "iOS Example"; + productName = Alamofire; + productReference = F8111E0519A951050040E7D1 /* iOS Example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + F8111DFD19A951050040E7D1 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 1400; + ORGANIZATIONNAME = Alamofire; + TargetAttributes = { + F8111E0419A951050040E7D1 = { + CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 0900; + }; + }; + }; + buildConfigurationList = F8111E0019A951050040E7D1 /* Build configuration list for PBXProject "iOS Example" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = F8111DFC19A951050040E7D1; + productRefGroup = F8111E0619A951050040E7D1 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 31E476601C55DD5900968569 /* Products */; + ProjectRef = 31E4765F1C55DD5900968569 /* Alamofire.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + F8111E0419A951050040E7D1 /* iOS Example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 31AB09132733010700986A70 /* Alamofire watchOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Alamofire watchOS Tests.xctest"; + remoteRef = 31AB09122733010700986A70 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E4766A1C55DD5900968569 /* Alamofire.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Alamofire.framework; + remoteRef = 31E476691C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E4766C1C55DD5900968569 /* Alamofire iOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Alamofire iOS Tests.xctest"; + remoteRef = 31E4766B1C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E4766E1C55DD5900968569 /* Alamofire.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Alamofire.framework; + remoteRef = 31E4766D1C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E476701C55DD5900968569 /* Alamofire macOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Alamofire macOS Tests.xctest"; + remoteRef = 31E4766F1C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E476721C55DD5900968569 /* Alamofire.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Alamofire.framework; + remoteRef = 31E476711C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E476741C55DD5900968569 /* Alamofire tvOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "Alamofire tvOS Tests.xctest"; + remoteRef = 31E476731C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 31E476761C55DD5900968569 /* Alamofire.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Alamofire.framework; + remoteRef = 31E476751C55DD5900968569 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + F8111E0319A951050040E7D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3129D57622F230AE009C145F /* LaunchScreen.storyboard in Resources */, + 4C6D2C8F1C67EFEC00846168 /* Images.xcassets in Resources */, + 4C6D2C981C67F03B00846168 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + F8111E0119A951050040E7D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4C6D2C801C67EFE100846168 /* AppDelegate.swift in Sources */, + 4C6D2C821C67EFE100846168 /* MasterViewController.swift in Sources */, + 4C6D2C811C67EFE100846168 /* DetailViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 31E476851C55DE6D00968569 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Alamofire iOS"; + targetProxy = 31E476841C55DE6D00968569 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 3129D57422F230AE009C145F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 3129D57522F230AE009C145F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + 4C6D2C961C67F03B00846168 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4C6D2C971C67F03B00846168 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + F8111E2119A951050040E7D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TVOS_DEPLOYMENT_TARGET = 10.0; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + F8111E2219A951050040E7D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + F8111E2419A951050040E7D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Resources/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.iOS-Example"; + PRODUCT_NAME = "iOS Example"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + F8111E2519A951050040E7D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Resources/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.iOS-Example"; + PRODUCT_NAME = "iOS Example"; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + F8111E0019A951050040E7D1 /* Build configuration list for PBXProject "iOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8111E2119A951050040E7D1 /* Debug */, + F8111E2219A951050040E7D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + F8111E2319A951050040E7D1 /* Build configuration list for PBXNativeTarget "iOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F8111E2419A951050040E7D1 /* Debug */, + F8111E2519A951050040E7D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = F8111DFD19A951050040E7D1 /* Project object */; +} diff --git a/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..bfe77a2a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme new file mode 100644 index 00000000..b0f97eef --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Example/iOS Example.xcodeproj/xcshareddata/xcschemes/iOS Example.xcscheme @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/Gemfile b/Carthage/Checkouts/Alamofire/Gemfile new file mode 100644 index 00000000..db0490c9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Gemfile @@ -0,0 +1,5 @@ +source "https://rubygems.org" + +gem "cocoapods" +gem "xcpretty" +gem "jazzy" diff --git a/Carthage/Checkouts/Alamofire/Gemfile.lock b/Carthage/Checkouts/Alamofire/Gemfile.lock new file mode 100644 index 00000000..d82eb39b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Gemfile.lock @@ -0,0 +1,133 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + activesupport (7.1.1) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.0.2) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + minitest (>= 5.1) + mutex_m + tzinfo (~> 2.0) + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + base64 (0.1.1) + bigdecimal (3.1.4) + claide (1.1.0) + cocoapods (1.14.0) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.14.0) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.14.0) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (2.0) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.2.2) + connection_pool (2.4.1) + drb (2.1.1) + ruby2_keywords + escape (0.0.4) + ethon (0.16.0) + ffi (>= 1.15.0) + ffi (1.16.3) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + jazzy (0.14.4) + cocoapods (~> 1.5) + mustache (~> 1.1) + open4 (~> 1.3) + redcarpet (~> 3.4) + rexml (~> 3.2) + rouge (>= 2.0.6, < 5.0) + sassc (~> 2.1) + sqlite3 (~> 1.3) + xcinvoke (~> 0.3.0) + json (2.6.3) + liferaft (0.0.6) + mini_portile2 (2.8.5) + minitest (5.20.0) + molinillo (0.8.0) + mustache (1.1.1) + mutex_m (0.1.2) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + open4 (1.3.4) + public_suffix (4.0.7) + redcarpet (3.6.0) + rexml (3.2.6) + rouge (2.0.7) + ruby-macho (2.5.1) + ruby2_keywords (0.0.5) + sassc (2.4.0) + ffi (~> 1.9) + sqlite3 (1.6.7) + mini_portile2 (~> 2.8.0) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcinvoke (0.3.0) + liferaft (~> 0.0.6) + xcodeproj (1.23.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods + jazzy + xcpretty + +BUNDLED WITH + 2.4.10 diff --git a/Carthage/Checkouts/Alamofire/LICENSE b/Carthage/Checkouts/Alamofire/LICENSE new file mode 100644 index 00000000..cae030a0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014-2022 Alamofire Software Foundation (http://alamofire.org/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Carthage/Checkouts/Alamofire/Package.swift b/Carthage/Checkouts/Alamofire/Package.swift new file mode 100644 index 00000000..b3ecf255 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Package.swift @@ -0,0 +1,48 @@ +// swift-tools-version:5.9 +// +// Package.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "Alamofire", + platforms: [.macOS(.v10_13), + .iOS(.v11), + .tvOS(.v11), + .watchOS(.v4)], + products: [.library(name: "Alamofire", + targets: ["Alamofire"])], + targets: [.target(name: "Alamofire", + path: "Source", + exclude: ["Info.plist"], + linkerSettings: [.linkedFramework("CFNetwork", + .when(platforms: [.iOS, + .macOS, + .tvOS, + .watchOS]))]), + .testTarget(name: "AlamofireTests", + dependencies: ["Alamofire"], + path: "Tests", + exclude: ["Info.plist", "Test Plans"], + resources: [.process("Resources")])], + swiftLanguageVersions: [.v5]) diff --git a/Carthage/Checkouts/Alamofire/Package@swift-5.5.swift b/Carthage/Checkouts/Alamofire/Package@swift-5.5.swift new file mode 100644 index 00000000..22b266ac --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Package@swift-5.5.swift @@ -0,0 +1,48 @@ +// swift-tools-version:5.5 +// +// Package@swift-5.5.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "Alamofire", + platforms: [.macOS(.v10_12), + .iOS(.v10), + .tvOS(.v10), + .watchOS(.v3)], + products: [.library(name: "Alamofire", + targets: ["Alamofire"])], + targets: [.target(name: "Alamofire", + path: "Source", + exclude: ["Info.plist"], + linkerSettings: [.linkedFramework("CFNetwork", + .when(platforms: [.iOS, + .macOS, + .tvOS, + .watchOS]))]), + .testTarget(name: "AlamofireTests", + dependencies: ["Alamofire"], + path: "Tests", + exclude: ["Info.plist", "Test Plans"], + resources: [.process("Resources")])], + swiftLanguageVersions: [.v5]) diff --git a/Carthage/Checkouts/Alamofire/Package@swift-5.6.swift b/Carthage/Checkouts/Alamofire/Package@swift-5.6.swift new file mode 100644 index 00000000..29dc8445 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Package@swift-5.6.swift @@ -0,0 +1,48 @@ +// swift-tools-version:5.6 +// +// Package@swift-5.6.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "Alamofire", + platforms: [.macOS(.v10_12), + .iOS(.v10), + .tvOS(.v10), + .watchOS(.v3)], + products: [.library(name: "Alamofire", + targets: ["Alamofire"])], + targets: [.target(name: "Alamofire", + path: "Source", + exclude: ["Info.plist"], + linkerSettings: [.linkedFramework("CFNetwork", + .when(platforms: [.iOS, + .macOS, + .tvOS, + .watchOS]))]), + .testTarget(name: "AlamofireTests", + dependencies: ["Alamofire"], + path: "Tests", + exclude: ["Info.plist", "Test Plans"], + resources: [.process("Resources")])], + swiftLanguageVersions: [.v5]) diff --git a/Carthage/Checkouts/Alamofire/Package@swift-5.7.swift b/Carthage/Checkouts/Alamofire/Package@swift-5.7.swift new file mode 100644 index 00000000..b70c0649 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Package@swift-5.7.swift @@ -0,0 +1,48 @@ +// swift-tools-version:5.7 +// +// Package.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "Alamofire", + platforms: [.macOS(.v10_13), + .iOS(.v11), + .tvOS(.v11), + .watchOS(.v4)], + products: [.library(name: "Alamofire", + targets: ["Alamofire"])], + targets: [.target(name: "Alamofire", + path: "Source", + exclude: ["Info.plist"], + linkerSettings: [.linkedFramework("CFNetwork", + .when(platforms: [.iOS, + .macOS, + .tvOS, + .watchOS]))]), + .testTarget(name: "AlamofireTests", + dependencies: ["Alamofire"], + path: "Tests", + exclude: ["Info.plist", "Test Plans"], + resources: [.process("Resources")])], + swiftLanguageVersions: [.v5]) diff --git a/Carthage/Checkouts/Alamofire/Package@swift-5.8.swift b/Carthage/Checkouts/Alamofire/Package@swift-5.8.swift new file mode 100644 index 00000000..b1f00fbe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Package@swift-5.8.swift @@ -0,0 +1,48 @@ +// swift-tools-version:5.8 +// +// Package.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import PackageDescription + +let package = Package(name: "Alamofire", + platforms: [.macOS(.v10_13), + .iOS(.v11), + .tvOS(.v11), + .watchOS(.v4)], + products: [.library(name: "Alamofire", + targets: ["Alamofire"])], + targets: [.target(name: "Alamofire", + path: "Source", + exclude: ["Info.plist"], + linkerSettings: [.linkedFramework("CFNetwork", + .when(platforms: [.iOS, + .macOS, + .tvOS, + .watchOS]))]), + .testTarget(name: "AlamofireTests", + dependencies: ["Alamofire"], + path: "Tests", + exclude: ["Info.plist", "Test Plans"], + resources: [.process("Resources")])], + swiftLanguageVersions: [.v5]) diff --git a/Carthage/Checkouts/Alamofire/README.md b/Carthage/Checkouts/Alamofire/README.md new file mode 100644 index 00000000..c9adb9fb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/README.md @@ -0,0 +1,256 @@ +![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/Resources/AlamofireLogo.png) + +[![Swift](https://img.shields.io/badge/Swift-5.6_5.7_5.8_5.9-orange?style=flat-square)](https://img.shields.io/badge/Swift-5.6_5.7_5.8_5.9-Orange?style=flat-square) +[![Platforms](https://img.shields.io/badge/Platforms-macOS_iOS_tvOS_watchOS_visionOS_Linux_Windows_Android-yellowgreen?style=flat-square)](https://img.shields.io/badge/Platforms-macOS_iOS_tvOS_watchOS_vision_OS_Linux_Windows_Android-Green?style=flat-square) +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg?style=flat-square)](https://img.shields.io/cocoapods/v/Alamofire.svg) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat-square)](https://github.com/Carthage/Carthage) +[![Swift Package Manager](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square)](https://img.shields.io/badge/Swift_Package_Manager-compatible-orange?style=flat-square) +[![Swift Forums](https://img.shields.io/badge/Swift_Forums-Alamofire-orange?style=flat-square)](https://forums.swift.org/c/related-projects/alamofire/37) + +Alamofire is an HTTP networking library written in Swift. + +- [Features](#features) +- [Component Libraries](#component-libraries) +- [Requirements](#requirements) +- [Migration Guides](#migration-guides) +- [Communication](#communication) +- [Installation](#installation) +- [Contributing](#contributing) +- [Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#using-alamofire) + - [**Introduction -**](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#introduction) [Making Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#making-requests), [Response Handling](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-handling), [Response Validation](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation), [Response Caching](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-caching) + - **HTTP -** [HTTP Methods](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-methods), [Parameters and Parameter Encoder](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md##request-parameters-and-parameter-encoders), [HTTP Headers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#http-headers), [Authentication](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#authentication) + - **Large Data -** [Downloading Data to a File](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#downloading-data-to-a-file), [Uploading Data to a Server](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#uploading-data-to-a-server) + - **Tools -** [Statistical Metrics](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#statistical-metrics), [cURL Command Output](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#curl-command-output) +- [Advanced Usage](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md) + - **URL Session -** [Session Manager](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#session), [Session Delegate](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#sessiondelegate), [Request](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#request) + - **Routing -** [Routing Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#routing-requests), [Adapting and Retrying Requests](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#adapting-and-retrying-requests-with-requestinterceptor) + - **Model Objects -** [Custom Response Handlers](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#customizing-response-handlers) + - **Advanced Concurrency -** [Swift Concurrency](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#using-alamofire-with-swift-concurrency) and [Combine](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#using-alamofire-with-combine) + - **Connection -** [Security](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#security), [Network Reachability](https://github.com/Alamofire/Alamofire/blob/master/Documentation/AdvancedUsage.md#network-reachability) +- [Open Radars](#open-radars) +- [FAQ](#faq) +- [Credits](#credits) +- [Donations](#donations) +- [License](#license) + +## Features + +- [x] Chainable Request / Response Methods +- [x] Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6. +- [x] Combine Support +- [x] URL / JSON Parameter Encoding +- [x] Upload File / Data / Stream / MultipartFormData +- [x] Download File using Request or Resume Data +- [x] Authentication with `URLCredential` +- [x] HTTP Response Validation +- [x] Upload and Download Progress Closures with Progress +- [x] cURL Command Output +- [x] Dynamically Adapt and Retry Requests +- [x] TLS Certificate and Public Key Pinning +- [x] Network Reachability +- [x] Comprehensive Unit and Integration Test Coverage +- [x] [Complete Documentation](https://alamofire.github.io/Alamofire) + +## Write Requests Fast! + +Alamofire's compact syntax and extensive feature set allow requests with powerful features like automatic retry to be written in just a few lines of code. + +```swift +// Automatic String to URL conversion, Swift concurrency support, and automatic retry. +let response = await AF.request("https://httpbin.org/get", interceptor: .retryPolicy) + // Automatic HTTP Basic Auth. + .authenticate(username: "user", password: "pass") + // Caching customization. + .cacheResponse(using: .cache) + // Redirect customization. + .redirect(using: .follow) + // Validate response code and Content-Type. + .validate() + // Produce a cURL command for the request. + .cURLDescription { description in + print(description) + } + // Automatic Decodable support with background parsing. + .serializingDecodable(DecodableType.self) + // Await the full response with metrics and a parsed body. + .response +// Detailed response description for easy debugging. +debugPrint(response) +``` + +## Component Libraries + +In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem. + +- [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache, and a priority-based image downloading system. +- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator) - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support `URLSession` instances not managed by Alamofire. + +## Requirements + +| Platform | Minimum Swift Version | Installation | Status | +| ---------------------------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------ | +| iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+ | 5.6 | [CocoaPods](#cocoapods), [Carthage](#carthage), [Swift Package Manager](#swift-package-manager), [Manual](#manually) | Fully Tested | +| Linux | Latest Only | [Swift Package Manager](#swift-package-manager) | Building But Unsupported | +| Windows | Latest Only | [Swift Package Manager](#swift-package-manager) | Building But Unsupported | +| Android | Latest Only | [Swift Package Manager](#swift-package-manager) | Building But Unsupported | + +#### Known Issues on Linux and Windows + +Alamofire builds on Linux, Windows, and Android but there are missing features and many issues in the underlying `swift-corelibs-foundation` that prevent full functionality and may cause crashes. These include: + +- `ServerTrustManager` and associated certificate functionality is unavailable, so there is no certificate pinning and no client certificate support. +- Various methods of HTTP authentication may crash, including HTTP Basic and HTTP Digest. Crashes may occur if responses contain server challenges. +- Cache control through `CachedResponseHandler` and associated APIs is unavailable, as the underlying delegate methods aren't called. +- `URLSessionTaskMetrics` are never gathered. + +Due to these issues, Alamofire is unsupported on Linux, Windows, and Android. Please report any crashes to the [Swift bug reporter](https://bugs.swift.org). + +## Migration Guides + +- [Alamofire 5.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%205.0%20Migration%20Guide.md) +- [Alamofire 4.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md) +- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md) +- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md) + +## Communication + +- If you **need help with making network requests** using Alamofire, use [Stack Overflow](https://stackoverflow.com/questions/tagged/alamofire) and tag `alamofire`. +- If you need to **find or understand an API**, check [our documentation](http://alamofire.github.io/Alamofire/) or [Apple's documentation for `URLSession`](https://developer.apple.com/documentation/foundation/url_loading_system), on top of which Alamofire is built. +- If you need **help with an Alamofire feature**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you'd like to **discuss Alamofire best practices**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you'd like to **discuss a feature request**, use [our forum on swift.org](https://forums.swift.org/c/related-projects/alamofire). +- If you **found a bug**, open an issue here on GitHub and follow the guide. The more detail the better! + +## Installation + +### CocoaPods + +[CocoaPods](https://cocoapods.org) is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`: + +```ruby +pod 'Alamofire' +``` + +### Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "Alamofire/Alamofire" +``` + +### Swift Package Manager + +The [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. + +Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`. + +```swift +dependencies: [ + .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.8.1")) +] +``` + +### Manually + +If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually. + +#### Embedded Framework + +- Open up Terminal, `cd` into your top-level project directory, and run the following command "if" your project is not initialized as a git repository: + + ```bash + $ git init + ``` + +- Add Alamofire as a git [submodule](https://git-scm.com/docs/git-submodule) by running the following command: + + ```bash + $ git submodule add https://github.com/Alamofire/Alamofire.git + ``` + +- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. + + > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter. + +- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target. +- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the "Targets" heading in the sidebar. +- In the tab bar at the top of that window, open the "General" panel. +- Click on the `+` button under the "Embedded Binaries" section. +- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder. + + > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`. + +- Select the top `Alamofire.framework` for iOS and the bottom one for macOS. + + > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS`, or `Alamofire watchOS`. + +- And that's it! + + > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device. + +## Contributing + +Before contributing to Alamofire, please read the instructions detailed in our [contribution guide](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md). + +## Open Radars + +The following radars have some effect on the current implementation of Alamofire. + +- [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in the test case +- `rdar://26870455` - Background URL Session Configurations do not work in the simulator +- `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest` + +## Resolved Radars + +The following radars have been resolved over time after being filed against the Alamofire project. + +- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage. + - (Resolved): 9/1/17 in Xcode 9 beta 6. +- [`rdar://36082113`](http://openradar.appspot.com/radar?id=4942308441063424) - `URLSessionTaskMetrics` failing to link on watchOS 3.0+ + - (Resolved): Just add `CFNetwork` to your linked frameworks. +- `FB7624529` - `urlSession(_:task:didFinishCollecting:)` never called on watchOS + - (Resolved): Metrics now collected on watchOS 7+. + +## FAQ + +### What's the origin of the name Alamofire? + +Alamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas. + +## Credits + +Alamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases. + +### Security Disclosure + +If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker. + +## Sponsorship + +The [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially stay registered as a federal non-profit organization. +Registering will allow Foundation members to gain some legal protections and also allow us to put donations to use, tax-free. +Sponsoring the ASF will enable us to: + +- Pay our yearly legal fees to keep the non-profit in good status +- Pay for our mail servers to help us stay on top of all questions and security issues +- Potentially fund test servers to make it easier for us to test the edge cases +- Potentially fund developers to work on one of our projects full-time + +The community adoption of the ASF libraries has been amazing. +We are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward. +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. +If you use any of our libraries for work, see if your employers would be interested in donating. +Any amount you can donate, whether once or monthly, to help us reach our goal would be greatly appreciated. + +[Sponsor Alamofire](https://github.com/sponsors/Alamofire) + +## Supporters + +[MacStadium](https://macstadium.com) provides Alamofire with a free, hosted Mac mini. + +![Powered by MacStadium](https://raw.githubusercontent.com/Alamofire/Alamofire/master/Resources/MacStadiumLogo.png) + +## License + +Alamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details. diff --git a/Carthage/Checkouts/Alamofire/Resources/AlamofireLogo.png b/Carthage/Checkouts/Alamofire/Resources/AlamofireLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..116fcd2418771edb703ad56c924b2dc039244df5 GIT binary patch literal 18006 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 String, file: StaticString = #file, line: UInt = #line) -> AFError { + guard let afError = self as? AFError else { + fatalError(message(), file: file, line: line) + } + return afError + } + + /// Casts the instance as `AFError` or returns `defaultAFError` + func asAFError(or defaultAFError: @autoclosure () -> AFError) -> AFError { + self as? AFError ?? defaultAFError() + } +} + +// MARK: - Error Booleans + +extension AFError { + /// Returns whether the instance is `.sessionDeinitialized`. + public var isSessionDeinitializedError: Bool { + if case .sessionDeinitialized = self { return true } + return false + } + + /// Returns whether the instance is `.sessionInvalidated`. + public var isSessionInvalidatedError: Bool { + if case .sessionInvalidated = self { return true } + return false + } + + /// Returns whether the instance is `.explicitlyCancelled`. + public var isExplicitlyCancelledError: Bool { + if case .explicitlyCancelled = self { return true } + return false + } + + /// Returns whether the instance is `.invalidURL`. + public var isInvalidURLError: Bool { + if case .invalidURL = self { return true } + return false + } + + /// Returns whether the instance is `.parameterEncodingFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isParameterEncodingError: Bool { + if case .parameterEncodingFailed = self { return true } + return false + } + + /// Returns whether the instance is `.parameterEncoderFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isParameterEncoderError: Bool { + if case .parameterEncoderFailed = self { return true } + return false + } + + /// Returns whether the instance is `.multipartEncodingFailed`. When `true`, the `url` and `underlyingError` + /// properties will contain the associated values. + public var isMultipartEncodingError: Bool { + if case .multipartEncodingFailed = self { return true } + return false + } + + /// Returns whether the instance is `.requestAdaptationFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isRequestAdaptationError: Bool { + if case .requestAdaptationFailed = self { return true } + return false + } + + /// Returns whether the instance is `.responseValidationFailed`. When `true`, the `acceptableContentTypes`, + /// `responseContentType`, `responseCode`, and `underlyingError` properties will contain the associated values. + public var isResponseValidationError: Bool { + if case .responseValidationFailed = self { return true } + return false + } + + /// Returns whether the instance is `.responseSerializationFailed`. When `true`, the `failedStringEncoding` and + /// `underlyingError` properties will contain the associated values. + public var isResponseSerializationError: Bool { + if case .responseSerializationFailed = self { return true } + return false + } + + #if canImport(Security) + /// Returns whether the instance is `.serverTrustEvaluationFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isServerTrustEvaluationError: Bool { + if case .serverTrustEvaluationFailed = self { return true } + return false + } + #endif + + /// Returns whether the instance is `requestRetryFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isRequestRetryError: Bool { + if case .requestRetryFailed = self { return true } + return false + } + + /// Returns whether the instance is `createUploadableFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isCreateUploadableError: Bool { + if case .createUploadableFailed = self { return true } + return false + } + + /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isCreateURLRequestError: Bool { + if case .createURLRequestFailed = self { return true } + return false + } + + /// Returns whether the instance is `downloadedFileMoveFailed`. When `true`, the `destination` and `underlyingError` properties will + /// contain the associated values. + public var isDownloadedFileMoveError: Bool { + if case .downloadedFileMoveFailed = self { return true } + return false + } + + /// Returns whether the instance is `createURLRequestFailed`. When `true`, the `underlyingError` property will + /// contain the associated value. + public var isSessionTaskError: Bool { + if case .sessionTaskFailed = self { return true } + return false + } +} + +// MARK: - Convenience Properties + +extension AFError { + /// The `URLConvertible` associated with the error. + public var urlConvertible: URLConvertible? { + guard case let .invalidURL(url) = self else { return nil } + return url + } + + /// The `URL` associated with the error. + public var url: URL? { + guard case let .multipartEncodingFailed(reason) = self else { return nil } + return reason.url + } + + /// The underlying `Error` responsible for generating the failure associated with `.sessionInvalidated`, + /// `.parameterEncodingFailed`, `.parameterEncoderFailed`, `.multipartEncodingFailed`, `.requestAdaptationFailed`, + /// `.responseSerializationFailed`, `.requestRetryFailed` errors. + public var underlyingError: Error? { + switch self { + case let .multipartEncodingFailed(reason): + return reason.underlyingError + case let .parameterEncodingFailed(reason): + return reason.underlyingError + case let .parameterEncoderFailed(reason): + return reason.underlyingError + case let .requestAdaptationFailed(error): + return error + case let .requestRetryFailed(retryError, _): + return retryError + case let .responseValidationFailed(reason): + return reason.underlyingError + case let .responseSerializationFailed(reason): + return reason.underlyingError + #if canImport(Security) + case let .serverTrustEvaluationFailed(reason): + return reason.underlyingError + #endif + case let .sessionInvalidated(error): + return error + case let .createUploadableFailed(error): + return error + case let .createURLRequestFailed(error): + return error + case let .downloadedFileMoveFailed(error, _, _): + return error + case let .sessionTaskFailed(error): + return error + case .explicitlyCancelled, + .invalidURL, + .sessionDeinitialized, + .urlRequestValidationFailed: + return nil + } + } + + /// The acceptable `Content-Type`s of a `.responseValidationFailed` error. + public var acceptableContentTypes: [String]? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.acceptableContentTypes + } + + /// The response `Content-Type` of a `.responseValidationFailed` error. + public var responseContentType: String? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.responseContentType + } + + /// The response code of a `.responseValidationFailed` error. + public var responseCode: Int? { + guard case let .responseValidationFailed(reason) = self else { return nil } + return reason.responseCode + } + + /// The `String.Encoding` associated with a failed `.stringResponse()` call. + public var failedStringEncoding: String.Encoding? { + guard case let .responseSerializationFailed(reason) = self else { return nil } + return reason.failedStringEncoding + } + + /// The `source` URL of a `.downloadedFileMoveFailed` error. + public var sourceURL: URL? { + guard case let .downloadedFileMoveFailed(_, source, _) = self else { return nil } + return source + } + + /// The `destination` URL of a `.downloadedFileMoveFailed` error. + public var destinationURL: URL? { + guard case let .downloadedFileMoveFailed(_, _, destination) = self else { return nil } + return destination + } + + #if canImport(Security) + /// The download resume data of any underlying network error. Only produced by `DownloadRequest`s. + public var downloadResumeData: Data? { + (underlyingError as? URLError)?.userInfo[NSURLSessionDownloadTaskResumeData] as? Data + } + #endif +} + +extension AFError.ParameterEncodingFailureReason { + var underlyingError: Error? { + switch self { + case let .jsonEncodingFailed(error), + let .customEncodingFailed(error): + return error + case .missingURL: + return nil + } + } +} + +extension AFError.ParameterEncoderFailureReason { + var underlyingError: Error? { + switch self { + case let .encoderFailed(error): + return error + case .missingRequiredComponent: + return nil + } + } +} + +extension AFError.MultipartEncodingFailureReason { + var url: URL? { + switch self { + case let .bodyPartURLInvalid(url), + let .bodyPartFilenameInvalid(url), + let .bodyPartFileNotReachable(url), + let .bodyPartFileIsDirectory(url), + let .bodyPartFileSizeNotAvailable(url), + let .bodyPartInputStreamCreationFailed(url), + let .outputStreamCreationFailed(url), + let .outputStreamFileAlreadyExists(url), + let .outputStreamURLInvalid(url), + let .bodyPartFileNotReachableWithError(url, _), + let .bodyPartFileSizeQueryFailedWithError(url, _): + return url + case .outputStreamWriteFailed, + .inputStreamReadFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .bodyPartFileNotReachableWithError(_, error), + let .bodyPartFileSizeQueryFailedWithError(_, error), + let .outputStreamWriteFailed(error), + let .inputStreamReadFailed(error): + return error + case .bodyPartURLInvalid, + .bodyPartFilenameInvalid, + .bodyPartFileNotReachable, + .bodyPartFileIsDirectory, + .bodyPartFileSizeNotAvailable, + .bodyPartInputStreamCreationFailed, + .outputStreamCreationFailed, + .outputStreamFileAlreadyExists, + .outputStreamURLInvalid: + return nil + } + } +} + +extension AFError.ResponseValidationFailureReason { + var acceptableContentTypes: [String]? { + switch self { + case let .missingContentType(types), + let .unacceptableContentType(types, _): + return types + case .dataFileNil, + .dataFileReadFailed, + .unacceptableStatusCode, + .customValidationFailed: + return nil + } + } + + var responseContentType: String? { + switch self { + case let .unacceptableContentType(_, responseType): + return responseType + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableStatusCode, + .customValidationFailed: + return nil + } + } + + var responseCode: Int? { + switch self { + case let .unacceptableStatusCode(code): + return code + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableContentType, + .customValidationFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .customValidationFailed(error): + return error + case .dataFileNil, + .dataFileReadFailed, + .missingContentType, + .unacceptableContentType, + .unacceptableStatusCode: + return nil + } + } +} + +extension AFError.ResponseSerializationFailureReason { + var failedStringEncoding: String.Encoding? { + switch self { + case let .stringSerializationFailed(encoding): + return encoding + case .inputDataNilOrZeroLength, + .inputFileNil, + .inputFileReadFailed(_), + .jsonSerializationFailed(_), + .decodingFailed(_), + .customSerializationFailed(_), + .invalidEmptyResponse: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .jsonSerializationFailed(error), + let .decodingFailed(error), + let .customSerializationFailed(error): + return error + case .inputDataNilOrZeroLength, + .inputFileNil, + .inputFileReadFailed, + .stringSerializationFailed, + .invalidEmptyResponse: + return nil + } + } +} + +#if canImport(Security) +extension AFError.ServerTrustFailureReason { + var output: AFError.ServerTrustFailureReason.Output? { + switch self { + case let .defaultEvaluationFailed(output), + let .hostValidationFailed(output), + let .revocationCheckFailed(output, _): + return output + case .noRequiredEvaluator, + .noCertificatesFound, + .noPublicKeysFound, + .policyApplicationFailed, + .settingAnchorCertificatesFailed, + .revocationPolicyCreationFailed, + .trustEvaluationFailed, + .certificatePinningFailed, + .publicKeyPinningFailed, + .customEvaluationFailed: + return nil + } + } + + var underlyingError: Error? { + switch self { + case let .customEvaluationFailed(error): + return error + case let .trustEvaluationFailed(error): + return error + case .noRequiredEvaluator, + .noCertificatesFound, + .noPublicKeysFound, + .policyApplicationFailed, + .settingAnchorCertificatesFailed, + .revocationPolicyCreationFailed, + .defaultEvaluationFailed, + .hostValidationFailed, + .revocationCheckFailed, + .certificatePinningFailed, + .publicKeyPinningFailed: + return nil + } + } +} +#endif + +// MARK: - Error Descriptions + +extension AFError: LocalizedError { + public var errorDescription: String? { + switch self { + case .explicitlyCancelled: + return "Request explicitly cancelled." + case let .invalidURL(url): + return "URL is not valid: \(url)" + case let .parameterEncodingFailed(reason): + return reason.localizedDescription + case let .parameterEncoderFailed(reason): + return reason.localizedDescription + case let .multipartEncodingFailed(reason): + return reason.localizedDescription + case let .requestAdaptationFailed(error): + return "Request adaption failed with error: \(error.localizedDescription)" + case let .responseValidationFailed(reason): + return reason.localizedDescription + case let .responseSerializationFailed(reason): + return reason.localizedDescription + case let .requestRetryFailed(retryError, originalError): + return """ + Request retry failed with retry error: \(retryError.localizedDescription), \ + original error: \(originalError.localizedDescription) + """ + case .sessionDeinitialized: + return """ + Session was invalidated without error, so it was likely deinitialized unexpectedly. \ + Be sure to retain a reference to your Session for the duration of your requests. + """ + case let .sessionInvalidated(error): + return "Session was invalidated with error: \(error?.localizedDescription ?? "No description.")" + #if canImport(Security) + case let .serverTrustEvaluationFailed(reason): + return "Server trust evaluation failed due to reason: \(reason.localizedDescription)" + #endif + case let .urlRequestValidationFailed(reason): + return "URLRequest validation failed due to reason: \(reason.localizedDescription)" + case let .createUploadableFailed(error): + return "Uploadable creation failed with error: \(error.localizedDescription)" + case let .createURLRequestFailed(error): + return "URLRequest creation failed with error: \(error.localizedDescription)" + case let .downloadedFileMoveFailed(error, source, destination): + return "Moving downloaded file from: \(source) to: \(destination) failed with error: \(error.localizedDescription)" + case let .sessionTaskFailed(error): + return "URLSessionTask failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.ParameterEncodingFailureReason { + var localizedDescription: String { + switch self { + case .missingURL: + return "URL request to encode was missing a URL" + case let .jsonEncodingFailed(error): + return "JSON could not be encoded because of error:\n\(error.localizedDescription)" + case let .customEncodingFailed(error): + return "Custom parameter encoder failed with error: \(error.localizedDescription)" + } + } +} + +extension AFError.ParameterEncoderFailureReason { + var localizedDescription: String { + switch self { + case let .missingRequiredComponent(component): + return "Encoding failed due to a missing request component: \(component)" + case let .encoderFailed(error): + return "The underlying encoder failed with the error: \(error)" + } + } +} + +extension AFError.MultipartEncodingFailureReason { + var localizedDescription: String { + switch self { + case let .bodyPartURLInvalid(url): + return "The URL provided is not a file URL: \(url)" + case let .bodyPartFilenameInvalid(url): + return "The URL provided does not have a valid filename: \(url)" + case let .bodyPartFileNotReachable(url): + return "The URL provided is not reachable: \(url)" + case let .bodyPartFileNotReachableWithError(url, error): + return """ + The system returned an error while checking the provided URL for reachability. + URL: \(url) + Error: \(error) + """ + case let .bodyPartFileIsDirectory(url): + return "The URL provided is a directory: \(url)" + case let .bodyPartFileSizeNotAvailable(url): + return "Could not fetch the file size from the provided URL: \(url)" + case let .bodyPartFileSizeQueryFailedWithError(url, error): + return """ + The system returned an error while attempting to fetch the file size from the provided URL. + URL: \(url) + Error: \(error) + """ + case let .bodyPartInputStreamCreationFailed(url): + return "Failed to create an InputStream for the provided URL: \(url)" + case let .outputStreamCreationFailed(url): + return "Failed to create an OutputStream for URL: \(url)" + case let .outputStreamFileAlreadyExists(url): + return "A file already exists at the provided URL: \(url)" + case let .outputStreamURLInvalid(url): + return "The provided OutputStream URL is invalid: \(url)" + case let .outputStreamWriteFailed(error): + return "OutputStream write failed with error: \(error)" + case let .inputStreamReadFailed(error): + return "InputStream read failed with error: \(error)" + } + } +} + +extension AFError.ResponseSerializationFailureReason { + var localizedDescription: String { + switch self { + case .inputDataNilOrZeroLength: + return "Response could not be serialized, input data was nil or zero length." + case .inputFileNil: + return "Response could not be serialized, input file was nil." + case let .inputFileReadFailed(url): + return "Response could not be serialized, input file could not be read: \(url)." + case let .stringSerializationFailed(encoding): + return "String could not be serialized with encoding: \(encoding)." + case let .jsonSerializationFailed(error): + return "JSON could not be serialized because of error:\n\(error.localizedDescription)" + case let .invalidEmptyResponse(type): + return """ + Empty response could not be serialized to type: \(type). \ + Use Empty as the expected type for such responses. + """ + case let .decodingFailed(error): + return "Response could not be decoded because of error:\n\(error.localizedDescription)" + case let .customSerializationFailed(error): + return "Custom response serializer failed with error:\n\(error.localizedDescription)" + } + } +} + +extension AFError.ResponseValidationFailureReason { + var localizedDescription: String { + switch self { + case .dataFileNil: + return "Response could not be validated, data file was nil." + case let .dataFileReadFailed(url): + return "Response could not be validated, data file could not be read: \(url)." + case let .missingContentType(types): + return """ + Response Content-Type was missing and acceptable content types \ + (\(types.joined(separator: ","))) do not match "*/*". + """ + case let .unacceptableContentType(acceptableTypes, responseType): + return """ + Response Content-Type "\(responseType)" does not match any acceptable types: \ + \(acceptableTypes.joined(separator: ",")). + """ + case let .unacceptableStatusCode(code): + return "Response status code was unacceptable: \(code)." + case let .customValidationFailed(error): + return "Custom response validation failed with error: \(error.localizedDescription)" + } + } +} + +#if canImport(Security) +extension AFError.ServerTrustFailureReason { + var localizedDescription: String { + switch self { + case let .noRequiredEvaluator(host): + return "A ServerTrustEvaluating value is required for host \(host) but none was found." + case .noCertificatesFound: + return "No certificates were found or provided for evaluation." + case .noPublicKeysFound: + return "No public keys were found or provided for evaluation." + case .policyApplicationFailed: + return "Attempting to set a SecPolicy failed." + case .settingAnchorCertificatesFailed: + return "Attempting to set the provided certificates as anchor certificates failed." + case .revocationPolicyCreationFailed: + return "Attempting to create a revocation policy failed." + case let .trustEvaluationFailed(error): + return "SecTrust evaluation failed with error: \(error?.localizedDescription ?? "None")" + case let .defaultEvaluationFailed(output): + return "Default evaluation failed for host \(output.host)." + case let .hostValidationFailed(output): + return "Host validation failed for host \(output.host)." + case let .revocationCheckFailed(output, _): + return "Revocation check failed for host \(output.host)." + case let .certificatePinningFailed(host, _, _, _): + return "Certificate pinning failed for host \(host)." + case let .publicKeyPinningFailed(host, _, _, _): + return "Public key pinning failed for host \(host)." + case let .customEvaluationFailed(error): + return "Custom trust evaluation failed with error: \(error.localizedDescription)" + } + } +} +#endif + +extension AFError.URLRequestValidationFailureReason { + var localizedDescription: String { + switch self { + case let .bodyDataInGETRequest(data): + return """ + Invalid URLRequest: Requests with GET method cannot have body data: + \(String(decoding: data, as: UTF8.self)) + """ + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/Alamofire.swift new file mode 100644 index 00000000..c99fe49d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Alamofire.swift @@ -0,0 +1,40 @@ +// +// Alamofire.swift +// +// Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Dispatch +import Foundation +#if canImport(FoundationNetworking) +@_exported import FoundationNetworking +#endif + +// Enforce minimum Swift version for all platforms and build systems. +#if swift(<5.5) +#error("Alamofire doesn't support Swift versions below 5.5.") +#endif + +/// Reference to `Session.default` for quick bootstrapping and examples. +public let AF = Session.default + +/// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate. +let version = "5.8.0" diff --git a/Carthage/Checkouts/Alamofire/Source/AlamofireExtended.swift b/Carthage/Checkouts/Alamofire/Source/AlamofireExtended.swift new file mode 100644 index 00000000..280c6de9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/AlamofireExtended.swift @@ -0,0 +1,61 @@ +// +// AlamofireExtended.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +/// Type that acts as a generic extension point for all `AlamofireExtended` types. +public struct AlamofireExtension { + /// Stores the type or meta-type of any extended type. + public private(set) var type: ExtendedType + + /// Create an instance from the provided value. + /// + /// - Parameter type: Instance being extended. + public init(_ type: ExtendedType) { + self.type = type + } +} + +/// Protocol describing the `af` extension points for Alamofire extended types. +public protocol AlamofireExtended { + /// Type being extended. + associatedtype ExtendedType + + /// Static Alamofire extension point. + static var af: AlamofireExtension.Type { get set } + /// Instance Alamofire extension point. + var af: AlamofireExtension { get set } +} + +extension AlamofireExtended { + /// Static Alamofire extension point. + public static var af: AlamofireExtension.Type { + get { AlamofireExtension.self } + set {} + } + + /// Instance Alamofire extension point. + public var af: AlamofireExtension { + get { AlamofireExtension(self) } + set {} + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/AuthenticationInterceptor.swift b/Carthage/Checkouts/Alamofire/Source/AuthenticationInterceptor.swift new file mode 100644 index 00000000..5c882870 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/AuthenticationInterceptor.swift @@ -0,0 +1,402 @@ +// +// AuthenticationInterceptor.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Types adopting the `AuthenticationCredential` protocol can be used to authenticate `URLRequest`s. +/// +/// One common example of an `AuthenticationCredential` is an OAuth2 credential containing an access token used to +/// authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes +/// which will then require a refresh of the credential using the refresh token to generate a new access token. +public protocol AuthenticationCredential { + /// Whether the credential requires a refresh. This property should always return `true` when the credential is + /// expired. It is also wise to consider returning `true` when the credential will expire in several seconds or + /// minutes depending on the expiration window of the credential. + /// + /// For example, if the credential is valid for 60 minutes, then it would be wise to return `true` when the + /// credential is only valid for 5 minutes or less. That ensures the credential will not expire as it is passed + /// around backend services. + var requiresRefresh: Bool { get } +} + +// MARK: - + +/// Types adopting the `Authenticator` protocol can be used to authenticate `URLRequest`s with an +/// `AuthenticationCredential` as well as refresh the `AuthenticationCredential` when required. +public protocol Authenticator: AnyObject { + /// The type of credential associated with the `Authenticator` instance. + associatedtype Credential: AuthenticationCredential + + /// Applies the `Credential` to the `URLRequest`. + /// + /// In the case of OAuth2, the access token of the `Credential` would be added to the `URLRequest` as a Bearer + /// token to the `Authorization` header. + /// + /// - Parameters: + /// - credential: The `Credential`. + /// - urlRequest: The `URLRequest`. + func apply(_ credential: Credential, to urlRequest: inout URLRequest) + + /// Refreshes the `Credential` and executes the `completion` closure with the `Result` once complete. + /// + /// Refresh can be called in one of two ways. It can be called before the `Request` is actually executed due to + /// a `requiresRefresh` returning `true` during the adapt portion of the `Request` creation process. It can also + /// be triggered by a failed `Request` where the authentication server denied access due to an expired or + /// invalidated access token. + /// + /// In the case of OAuth2, this method would use the refresh token of the `Credential` to generate a new + /// `Credential` using the authentication service. Once complete, the `completion` closure should be called with + /// the new `Credential`, or the error that occurred. + /// + /// In general, if the refresh call fails with certain status codes from the authentication server (commonly a 401), + /// the refresh token in the `Credential` can no longer be used to generate a valid `Credential`. In these cases, + /// you will need to reauthenticate the user with their username / password. + /// + /// Please note, these are just general examples of common use cases. They are not meant to solve your specific + /// authentication server challenges. Please work with your authentication server team to ensure your + /// `Authenticator` logic matches their expectations. + /// + /// - Parameters: + /// - credential: The `Credential` to refresh. + /// - session: The `Session` requiring the refresh. + /// - completion: The closure to be executed once the refresh is complete. + func refresh(_ credential: Credential, for session: Session, completion: @escaping (Result) -> Void) + + /// Determines whether the `URLRequest` failed due to an authentication error based on the `HTTPURLResponse`. + /// + /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `false` + /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then you + /// will need to work with your authentication server team to understand how to identify when this occurs. + /// + /// In the case of OAuth2, where an authentication server can invalidate credentials, you will need to inspect the + /// `HTTPURLResponse` or possibly the `Error` for when this occurs. This is commonly handled by the authentication + /// server returning a 401 status code and some additional header to indicate an OAuth2 failure occurred. + /// + /// It is very important to understand how your authentication server works to be able to implement this correctly. + /// For example, if your authentication server returns a 401 when an OAuth2 error occurs, and your downstream + /// service also returns a 401 when you are not authorized to perform that operation, how do you know which layer + /// of the backend returned you a 401? You do not want to trigger a refresh unless you know your authentication + /// server is actually the layer rejecting the request. Again, work with your authentication server team to understand + /// how to identify an OAuth2 401 error vs. a downstream 401 error to avoid endless refresh loops. + /// + /// - Parameters: + /// - urlRequest: The `URLRequest`. + /// - response: The `HTTPURLResponse`. + /// - error: The `Error`. + /// + /// - Returns: `true` if the `URLRequest` failed due to an authentication error, `false` otherwise. + func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool + + /// Determines whether the `URLRequest` is authenticated with the `Credential`. + /// + /// If the authentication server **CANNOT** invalidate credentials after they are issued, then simply return `true` + /// for this method. If the authentication server **CAN** invalidate credentials due to security breaches, then + /// read on. + /// + /// When an authentication server can invalidate credentials, it means that you may have a non-expired credential + /// that appears to be valid, but will be rejected by the authentication server when used. Generally when this + /// happens, a number of requests are all sent when the application is foregrounded, and all of them will be + /// rejected by the authentication server in the order they are received. The first failed request will trigger a + /// refresh internally, which will update the credential, and then retry all the queued requests with the new + /// credential. However, it is possible that some of the original requests will not return from the authentication + /// server until the refresh has completed. This is where this method comes in. + /// + /// When the authentication server rejects a credential, we need to check to make sure we haven't refreshed the + /// credential while the request was in flight. If it has already refreshed, then we don't need to trigger an + /// additional refresh. If it hasn't refreshed, then we need to refresh. + /// + /// Now that it is understood how the result of this method is used in the refresh lifecyle, let's walk through how + /// to implement it. You should return `true` in this method if the `URLRequest` is authenticated in a way that + /// matches the values in the `Credential`. In the case of OAuth2, this would mean that the Bearer token in the + /// `Authorization` header of the `URLRequest` matches the access token in the `Credential`. If it matches, then we + /// know the `Credential` was used to authenticate the `URLRequest` and should return `true`. If the Bearer token + /// did not match the access token, then you should return `false`. + /// + /// - Parameters: + /// - urlRequest: The `URLRequest`. + /// - credential: The `Credential`. + /// + /// - Returns: `true` if the `URLRequest` is authenticated with the `Credential`, `false` otherwise. + func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: Credential) -> Bool +} + +// MARK: - + +/// Represents various authentication failures that occur when using the `AuthenticationInterceptor`. All errors are +/// still vended from Alamofire as `AFError` types. The `AuthenticationError` instances will be embedded within +/// `AFError` `.requestAdaptationFailed` or `.requestRetryFailed` cases. +public enum AuthenticationError: Error { + /// The credential was missing so the request could not be authenticated. + case missingCredential + /// The credential was refreshed too many times within the `RefreshWindow`. + case excessiveRefresh +} + +// MARK: - + +/// The `AuthenticationInterceptor` class manages the queuing and threading complexity of authenticating requests. +/// It relies on an `Authenticator` type to handle the actual `URLRequest` authentication and `Credential` refresh. +public class AuthenticationInterceptor: RequestInterceptor where AuthenticatorType: Authenticator { + // MARK: Typealiases + + /// Type of credential used to authenticate requests. + public typealias Credential = AuthenticatorType.Credential + + // MARK: Helper Types + + /// Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a + /// refresh, the `AuthenticationInterceptor` compares the timestamp history of previous refresh calls against the + /// `RefreshWindow`. If more refreshes have occurred within the refresh window than allowed, the refresh is + /// cancelled and an `AuthorizationError.excessiveRefresh` error is thrown. + public struct RefreshWindow { + /// `TimeInterval` defining the duration of the time window before the current time in which the number of + /// refresh attempts is compared against `maximumAttempts`. For example, if `interval` is 30 seconds, then the + /// `RefreshWindow` represents the past 30 seconds. If more attempts occurred in the past 30 seconds than + /// `maximumAttempts`, an `.excessiveRefresh` error will be thrown. + public let interval: TimeInterval + + /// Total refresh attempts allowed within `interval` before throwing an `.excessiveRefresh` error. + public let maximumAttempts: Int + + /// Creates a `RefreshWindow` instance from the specified `interval` and `maximumAttempts`. + /// + /// - Parameters: + /// - interval: `TimeInterval` defining the duration of the time window before the current time. + /// - maximumAttempts: The maximum attempts allowed within the `TimeInterval`. + public init(interval: TimeInterval = 30.0, maximumAttempts: Int = 5) { + self.interval = interval + self.maximumAttempts = maximumAttempts + } + } + + private struct AdaptOperation { + let urlRequest: URLRequest + let session: Session + let completion: (Result) -> Void + } + + private enum AdaptResult { + case adapt(Credential) + case doNotAdapt(AuthenticationError) + case adaptDeferred + } + + private struct MutableState { + var credential: Credential? + + var isRefreshing = false + var refreshTimestamps: [TimeInterval] = [] + var refreshWindow: RefreshWindow? + + var adaptOperations: [AdaptOperation] = [] + var requestsToRetry: [(RetryResult) -> Void] = [] + } + + // MARK: Properties + + /// The `Credential` used to authenticate requests. + public var credential: Credential? { + get { mutableState.credential } + set { mutableState.credential = newValue } + } + + let authenticator: AuthenticatorType + let queue = DispatchQueue(label: "org.alamofire.authentication.inspector") + + private let mutableState: Protected + + // MARK: Initialization + + /// Creates an `AuthenticationInterceptor` instance from the specified parameters. + /// + /// A `nil` `RefreshWindow` will result in the `AuthenticationInterceptor` not checking for excessive refresh calls. + /// It is recommended to always use a `RefreshWindow` to avoid endless refresh cycles. + /// + /// - Parameters: + /// - authenticator: The `Authenticator` type. + /// - credential: The `Credential` if it exists. `nil` by default. + /// - refreshWindow: The `RefreshWindow` used to identify excessive refresh calls. `RefreshWindow()` by default. + public init(authenticator: AuthenticatorType, + credential: Credential? = nil, + refreshWindow: RefreshWindow? = RefreshWindow()) { + self.authenticator = authenticator + mutableState = Protected(MutableState(credential: credential, refreshWindow: refreshWindow)) + } + + // MARK: Adapt + + public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + let adaptResult: AdaptResult = mutableState.write { mutableState in + // Queue the adapt operation if a refresh is already in place. + guard !mutableState.isRefreshing else { + let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion) + mutableState.adaptOperations.append(operation) + return .adaptDeferred + } + + // Throw missing credential error is the credential is missing. + guard let credential = mutableState.credential else { + let error = AuthenticationError.missingCredential + return .doNotAdapt(error) + } + + // Queue the adapt operation and trigger refresh operation if credential requires refresh. + guard !credential.requiresRefresh else { + let operation = AdaptOperation(urlRequest: urlRequest, session: session, completion: completion) + mutableState.adaptOperations.append(operation) + refresh(credential, for: session, insideLock: &mutableState) + return .adaptDeferred + } + + return .adapt(credential) + } + + switch adaptResult { + case let .adapt(credential): + var authenticatedRequest = urlRequest + authenticator.apply(credential, to: &authenticatedRequest) + completion(.success(authenticatedRequest)) + + case let .doNotAdapt(adaptError): + completion(.failure(adaptError)) + + case .adaptDeferred: + // No-op: adapt operation captured during refresh. + break + } + } + + // MARK: Retry + + public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + // Do not attempt retry if there was not an original request and response from the server. + guard let urlRequest = request.request, let response = request.response else { + completion(.doNotRetry) + return + } + + // Do not attempt retry unless the `Authenticator` verifies failure was due to authentication error (i.e. 401 status code). + guard authenticator.didRequest(urlRequest, with: response, failDueToAuthenticationError: error) else { + completion(.doNotRetry) + return + } + + // Do not attempt retry if there is no credential. + guard let credential = credential else { + let error = AuthenticationError.missingCredential + completion(.doNotRetryWithError(error)) + return + } + + // Retry the request if the `Authenticator` verifies it was authenticated with a previous credential. + guard authenticator.isRequest(urlRequest, authenticatedWith: credential) else { + completion(.retry) + return + } + + mutableState.write { mutableState in + mutableState.requestsToRetry.append(completion) + + guard !mutableState.isRefreshing else { return } + + refresh(credential, for: session, insideLock: &mutableState) + } + } + + // MARK: Refresh + + private func refresh(_ credential: Credential, for session: Session, insideLock mutableState: inout MutableState) { + guard !isRefreshExcessive(insideLock: &mutableState) else { + let error = AuthenticationError.excessiveRefresh + handleRefreshFailure(error, insideLock: &mutableState) + return + } + + mutableState.refreshTimestamps.append(ProcessInfo.processInfo.systemUptime) + mutableState.isRefreshing = true + + // Dispatch to queue to hop out of the lock in case authenticator.refresh is implemented synchronously. + queue.async { + self.authenticator.refresh(credential, for: session) { result in + self.mutableState.write { mutableState in + switch result { + case let .success(credential): + self.handleRefreshSuccess(credential, insideLock: &mutableState) + case let .failure(error): + self.handleRefreshFailure(error, insideLock: &mutableState) + } + } + } + } + } + + private func isRefreshExcessive(insideLock mutableState: inout MutableState) -> Bool { + guard let refreshWindow = mutableState.refreshWindow else { return false } + + let refreshWindowMin = ProcessInfo.processInfo.systemUptime - refreshWindow.interval + + let refreshAttemptsWithinWindow = mutableState.refreshTimestamps.reduce(into: 0) { attempts, refreshTimestamp in + guard refreshWindowMin <= refreshTimestamp else { return } + attempts += 1 + } + + let isRefreshExcessive = refreshAttemptsWithinWindow >= refreshWindow.maximumAttempts + + return isRefreshExcessive + } + + private func handleRefreshSuccess(_ credential: Credential, insideLock mutableState: inout MutableState) { + mutableState.credential = credential + + let adaptOperations = mutableState.adaptOperations + let requestsToRetry = mutableState.requestsToRetry + + mutableState.adaptOperations.removeAll() + mutableState.requestsToRetry.removeAll() + + mutableState.isRefreshing = false + + // Dispatch to queue to hop out of the mutable state lock + queue.async { + adaptOperations.forEach { self.adapt($0.urlRequest, for: $0.session, completion: $0.completion) } + requestsToRetry.forEach { $0(.retry) } + } + } + + private func handleRefreshFailure(_ error: Error, insideLock mutableState: inout MutableState) { + let adaptOperations = mutableState.adaptOperations + let requestsToRetry = mutableState.requestsToRetry + + mutableState.adaptOperations.removeAll() + mutableState.requestsToRetry.removeAll() + + mutableState.isRefreshing = false + + // Dispatch to queue to hop out of the mutable state lock + queue.async { + adaptOperations.forEach { $0.completion(.failure(error)) } + requestsToRetry.forEach { $0(.doNotRetryWithError(error)) } + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/CachedResponseHandler.swift b/Carthage/Checkouts/Alamofire/Source/CachedResponseHandler.swift new file mode 100644 index 00000000..1371b6e1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/CachedResponseHandler.swift @@ -0,0 +1,107 @@ +// +// CachedResponseHandler.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A type that handles whether the data task should store the HTTP response in the cache. +public protocol CachedResponseHandler { + /// Determines whether the HTTP response should be stored in the cache. + /// + /// The `completion` closure should be passed one of three possible options: + /// + /// 1. The cached response provided by the server (this is the most common use case). + /// 2. A modified version of the cached response (you may want to modify it in some way before caching). + /// 3. A `nil` value to prevent the cached response from being stored in the cache. + /// + /// - Parameters: + /// - task: The data task whose request resulted in the cached response. + /// - response: The cached response to potentially store in the cache. + /// - completion: The closure to execute containing cached response, a modified response, or `nil`. + func dataTask(_ task: URLSessionDataTask, + willCacheResponse response: CachedURLResponse, + completion: @escaping (CachedURLResponse?) -> Void) +} + +// MARK: - + +/// `ResponseCacher` is a convenience `CachedResponseHandler` making it easy to cache, not cache, or modify a cached +/// response. +public struct ResponseCacher { + /// Defines the behavior of the `ResponseCacher` type. + public enum Behavior { + /// Stores the cached response in the cache. + case cache + /// Prevents the cached response from being stored in the cache. + case doNotCache + /// Modifies the cached response before storing it in the cache. + case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?) + } + + /// Returns a `ResponseCacher` with a `.cache` `Behavior`. + public static let cache = ResponseCacher(behavior: .cache) + /// Returns a `ResponseCacher` with a `.doNotCache` `Behavior`. + public static let doNotCache = ResponseCacher(behavior: .doNotCache) + + /// The `Behavior` of the `ResponseCacher`. + public let behavior: Behavior + + /// Creates a `ResponseCacher` instance from the `Behavior`. + /// + /// - Parameter behavior: The `Behavior`. + public init(behavior: Behavior) { + self.behavior = behavior + } +} + +extension ResponseCacher: CachedResponseHandler { + public func dataTask(_ task: URLSessionDataTask, + willCacheResponse response: CachedURLResponse, + completion: @escaping (CachedURLResponse?) -> Void) { + switch behavior { + case .cache: + completion(response) + case .doNotCache: + completion(nil) + case let .modify(closure): + let response = closure(task, response) + completion(response) + } + } +} + +extension CachedResponseHandler where Self == ResponseCacher { + /// Provides a `ResponseCacher` which caches the response, if allowed. Equivalent to `ResponseCacher.cache`. + public static var cache: ResponseCacher { .cache } + + /// Provides a `ResponseCacher` which does not cache the response. Equivalent to `ResponseCacher.doNotCache`. + public static var doNotCache: ResponseCacher { .doNotCache } + + /// Creates a `ResponseCacher` which modifies the proposed `CachedURLResponse` using the provided closure. + /// + /// - Parameter closure: Closure used to modify the `CachedURLResponse`. + /// - Returns: The `ResponseCacher`. + public static func modify(using closure: @escaping ((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)) -> ResponseCacher { + ResponseCacher(behavior: .modify(closure)) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Combine.swift b/Carthage/Checkouts/Alamofire/Source/Combine.swift new file mode 100644 index 00000000..79fce0de --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Combine.swift @@ -0,0 +1,652 @@ +// +// Combine.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if !((os(iOS) && (arch(i386) || arch(arm))) || os(Windows) || os(Linux) || os(Android)) + +import Combine +import Dispatch +import Foundation + +// MARK: - DataRequest / UploadRequest + +/// A Combine `Publisher` that publishes the `DataResponse` of the provided `DataRequest`. +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +public struct DataResponsePublisher: Publisher { + public typealias Output = DataResponse + public typealias Failure = Never + + private typealias Handler = (@escaping (_ response: DataResponse) -> Void) -> DataRequest + + private let request: DataRequest + private let responseHandler: Handler + + /// Creates an instance which will serialize responses using the provided `ResponseSerializer`. + /// + /// - Parameters: + /// - request: `DataRequest` for which to publish the response. + /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default. + /// - serializer: `ResponseSerializer` used to produce the published `DataResponse`. + public init(_ request: DataRequest, queue: DispatchQueue, serializer: Serializer) + where Value == Serializer.SerializedObject { + self.request = request + responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) } + } + + /// Creates an instance which will serialize responses using the provided `DataResponseSerializerProtocol`. + /// + /// - Parameters: + /// - request: `DataRequest` for which to publish the response. + /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default. + /// - serializer: `DataResponseSerializerProtocol` used to produce the published `DataResponse`. + public init(_ request: DataRequest, + queue: DispatchQueue, + serializer: Serializer) + where Value == Serializer.SerializedObject { + self.request = request + responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) } + } + + /// Publishes only the `Result` of the `DataResponse` value. + /// + /// - Returns: The `AnyPublisher` publishing the `Result` value. + public func result() -> AnyPublisher, Never> { + map(\.result).eraseToAnyPublisher() + } + + /// Publishes the `Result` of the `DataResponse` as a single `Value` or fail with the `AFError` instance. + /// + /// - Returns: The `AnyPublisher` publishing the stream. + public func value() -> AnyPublisher { + setFailureType(to: AFError.self).flatMap(\.result.publisher).eraseToAnyPublisher() + } + + public func receive(subscriber: S) where S: Subscriber, DataResponsePublisher.Failure == S.Failure, DataResponsePublisher.Output == S.Input { + subscriber.receive(subscription: Inner(request: request, + responseHandler: responseHandler, + downstream: subscriber)) + } + + private final class Inner: Subscription + where Downstream.Input == Output { + typealias Failure = Downstream.Failure + + private let downstream: Protected + private let request: DataRequest + private let responseHandler: Handler + + init(request: DataRequest, responseHandler: @escaping Handler, downstream: Downstream) { + self.request = request + self.responseHandler = responseHandler + self.downstream = Protected(downstream) + } + + func request(_ demand: Subscribers.Demand) { + assert(demand > 0) + + guard let downstream = downstream.read({ $0 }) else { return } + + self.downstream.write(nil) + responseHandler { response in + _ = downstream.receive(response) + downstream.receive(completion: .finished) + }.resume() + } + + func cancel() { + request.cancel() + downstream.write(nil) + } + } +} + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +extension DataResponsePublisher where Value == Data? { + /// Creates an instance which publishes a `DataResponse` value without serialization. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public init(_ request: DataRequest, queue: DispatchQueue) { + self.request = request + responseHandler = { request.response(queue: queue, completionHandler: $0) } + } +} + +extension DataRequest { + /// Creates a `DataResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`. + /// + /// - Parameters: + /// - serializer: `ResponseSerializer` used to serialize response `Data`. + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// + /// - Returns: The `DataResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishResponse(using serializer: Serializer, on queue: DispatchQueue = .main) -> DataResponsePublisher + where Serializer.SerializedObject == T { + DataResponsePublisher(self, queue: queue, serializer: serializer) + } + + /// Creates a `DataResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the + /// response. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()` + /// by default. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless of + /// status code. `[.head]` by default. + /// - Returns: The `DataResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishData(queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher { + publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } + + /// Creates a `DataResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the + /// response. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()` + /// by default. + /// - encoding: `String.Encoding` to parse the response. `nil` by default, in which case the encoding + /// will be determined by the server response, falling back to the default HTTP character + /// set, `ISO-8859-1`. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless of + /// status code. `[.head]` by default. + /// + /// - Returns: The `DataResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishString(queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher { + publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } + + @_disfavoredOverload + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + @available(*, deprecated, message: "Renamed publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods).") + public func publishDecodable(type: T.Type = T.self, + queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyResponseMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher { + publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyResponseMethods), + on: queue) + } + + /// Creates a `DataResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize the + /// response. + /// + /// - Parameters: + /// - type: `Decodable` type to which to decode response `Data`. Inferred from the context by + /// default. + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. + /// `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless of + /// status code. `[.head]` by default. + /// + /// - Returns: The `DataResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishDecodable(type: T.Type = T.self, + queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DataResponsePublisher { + publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } + + /// Creates a `DataResponsePublisher` for this instance which does not serialize the response before publishing. + /// + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// + /// - Returns: The `DataResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishUnserialized(queue: DispatchQueue = .main) -> DataResponsePublisher { + DataResponsePublisher(self, queue: queue) + } +} + +// A Combine `Publisher` that publishes a sequence of `Stream` values received by the provided `DataStreamRequest`. +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +public struct DataStreamPublisher: Publisher { + public typealias Output = DataStreamRequest.Stream + public typealias Failure = Never + + private typealias Handler = (@escaping DataStreamRequest.Handler) -> DataStreamRequest + + private let request: DataStreamRequest + private let streamHandler: Handler + + /// Creates an instance which will serialize responses using the provided `DataStreamSerializer`. + /// + /// - Parameters: + /// - request: `DataStreamRequest` for which to publish the response. + /// - queue: `DispatchQueue` on which the `Stream` values will be published. `.main` by + /// default. + /// - serializer: `DataStreamSerializer` used to produce the published `Stream` values. + public init(_ request: DataStreamRequest, queue: DispatchQueue, serializer: Serializer) + where Value == Serializer.SerializedObject { + self.request = request + streamHandler = { request.responseStream(using: serializer, on: queue, stream: $0) } + } + + /// Publishes only the `Result` of the `DataStreamRequest.Stream`'s `Event`s. + /// + /// - Returns: The `AnyPublisher` publishing the `Result` value. + public func result() -> AnyPublisher, Never> { + compactMap { stream in + switch stream.event { + case let .stream(result): + return result + // If the stream has completed with an error, send the error value downstream as a `.failure`. + case let .complete(completion): + return completion.error.map(Result.failure) + } + } + .eraseToAnyPublisher() + } + + /// Publishes the streamed values of the `DataStreamRequest.Stream` as a sequence of `Value` or fail with the + /// `AFError` instance. + /// + /// - Returns: The `AnyPublisher` publishing the stream. + public func value() -> AnyPublisher { + result().setFailureType(to: AFError.self).flatMap(\.publisher).eraseToAnyPublisher() + } + + public func receive(subscriber: S) where S: Subscriber, DataStreamPublisher.Failure == S.Failure, DataStreamPublisher.Output == S.Input { + subscriber.receive(subscription: Inner(request: request, + streamHandler: streamHandler, + downstream: subscriber)) + } + + private final class Inner: Subscription + where Downstream.Input == Output { + typealias Failure = Downstream.Failure + + private let downstream: Protected + private let request: DataStreamRequest + private let streamHandler: Handler + + init(request: DataStreamRequest, streamHandler: @escaping Handler, downstream: Downstream) { + self.request = request + self.streamHandler = streamHandler + self.downstream = Protected(downstream) + } + + func request(_ demand: Subscribers.Demand) { + assert(demand > 0) + + guard let downstream = downstream.read({ $0 }) else { return } + + self.downstream.write(nil) + streamHandler { stream in + _ = downstream.receive(stream) + if case .complete = stream.event { + downstream.receive(completion: .finished) + } + }.resume() + } + + func cancel() { + request.cancel() + downstream.write(nil) + } + } +} + +extension DataStreamRequest { + /// Creates a `DataStreamPublisher` for this instance using the given `DataStreamSerializer` and `DispatchQueue`. + /// + /// - Parameters: + /// - serializer: `DataStreamSerializer` used to serialize the streamed `Data`. + /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default. + /// - Returns: The `DataStreamPublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishStream(using serializer: Serializer, + on queue: DispatchQueue = .main) -> DataStreamPublisher { + DataStreamPublisher(self, queue: queue, serializer: serializer) + } + + /// Creates a `DataStreamPublisher` for this instance which uses a `PassthroughStreamSerializer` to stream `Data` + /// unserialized. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default. + /// - Returns: The `DataStreamPublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishData(queue: DispatchQueue = .main) -> DataStreamPublisher { + publishStream(using: PassthroughStreamSerializer(), on: queue) + } + + /// Creates a `DataStreamPublisher` for this instance which uses a `StringStreamSerializer` to serialize stream + /// `Data` values into `String` values. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default. + /// - Returns: The `DataStreamPublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishString(queue: DispatchQueue = .main) -> DataStreamPublisher { + publishStream(using: StringStreamSerializer(), on: queue) + } + + /// Creates a `DataStreamPublisher` for this instance which uses a `DecodableStreamSerializer` with the provided + /// parameters to serialize stream `Data` values into the provided type. + /// + /// - Parameters: + /// - type: `Decodable` type to which to decode stream `Data`. Inferred from the context by default. + /// - queue: `DispatchQueue` on which the `DataRequest.Stream` values will be published. `.main` by default. + /// - decoder: `DataDecoder` instance used to decode stream `Data`. `JSONDecoder()` by default. + /// - preprocessor: `DataPreprocessor` which filters incoming stream `Data` before serialization. + /// `PassthroughPreprocessor()` by default. + /// - Returns: The `DataStreamPublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishDecodable(type: T.Type = T.self, + queue: DispatchQueue = .main, + decoder: DataDecoder = JSONDecoder(), + preprocessor: DataPreprocessor = PassthroughPreprocessor()) -> DataStreamPublisher { + publishStream(using: DecodableStreamSerializer(decoder: decoder, + dataPreprocessor: preprocessor), + on: queue) + } +} + +/// A Combine `Publisher` that publishes the `DownloadResponse` of the provided `DownloadRequest`. +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +public struct DownloadResponsePublisher: Publisher { + public typealias Output = DownloadResponse + public typealias Failure = Never + + private typealias Handler = (@escaping (_ response: DownloadResponse) -> Void) -> DownloadRequest + + private let request: DownloadRequest + private let responseHandler: Handler + + /// Creates an instance which will serialize responses using the provided `ResponseSerializer`. + /// + /// - Parameters: + /// - request: `DownloadRequest` for which to publish the response. + /// - queue: `DispatchQueue` on which the `DownloadResponse` value will be published. `.main` by default. + /// - serializer: `ResponseSerializer` used to produce the published `DownloadResponse`. + public init(_ request: DownloadRequest, queue: DispatchQueue, serializer: Serializer) + where Value == Serializer.SerializedObject { + self.request = request + responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) } + } + + /// Creates an instance which will serialize responses using the provided `DownloadResponseSerializerProtocol` value. + /// + /// - Parameters: + /// - request: `DownloadRequest` for which to publish the response. + /// - queue: `DispatchQueue` on which the `DataResponse` value will be published. `.main` by default. + /// - serializer: `DownloadResponseSerializerProtocol` used to produce the published `DownloadResponse`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public init(_ request: DownloadRequest, + queue: DispatchQueue, + serializer: Serializer) + where Value == Serializer.SerializedObject { + self.request = request + responseHandler = { request.response(queue: queue, responseSerializer: serializer, completionHandler: $0) } + } + + /// Publishes only the `Result` of the `DownloadResponse` value. + /// + /// - Returns: The `AnyPublisher` publishing the `Result` value. + public func result() -> AnyPublisher, Never> { + map(\.result).eraseToAnyPublisher() + } + + /// Publishes the `Result` of the `DownloadResponse` as a single `Value` or fail with the `AFError` instance. + /// + /// - Returns: The `AnyPublisher` publishing the stream. + public func value() -> AnyPublisher { + setFailureType(to: AFError.self).flatMap(\.result.publisher).eraseToAnyPublisher() + } + + public func receive(subscriber: S) where S: Subscriber, DownloadResponsePublisher.Failure == S.Failure, DownloadResponsePublisher.Output == S.Input { + subscriber.receive(subscription: Inner(request: request, + responseHandler: responseHandler, + downstream: subscriber)) + } + + private final class Inner: Subscription + where Downstream.Input == Output { + typealias Failure = Downstream.Failure + + private let downstream: Protected + private let request: DownloadRequest + private let responseHandler: Handler + + init(request: DownloadRequest, responseHandler: @escaping Handler, downstream: Downstream) { + self.request = request + self.responseHandler = responseHandler + self.downstream = Protected(downstream) + } + + func request(_ demand: Subscribers.Demand) { + assert(demand > 0) + + guard let downstream = downstream.read({ $0 }) else { return } + + self.downstream.write(nil) + responseHandler { response in + _ = downstream.receive(response) + downstream.receive(completion: .finished) + }.resume() + } + + func cancel() { + request.cancel() + downstream.write(nil) + } + } +} + +extension DownloadRequest { + /// Creates a `DownloadResponsePublisher` for this instance using the given `ResponseSerializer` and `DispatchQueue`. + /// + /// - Parameters: + /// - serializer: `ResponseSerializer` used to serialize the response `Data` from disk. + /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishResponse(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher + where Serializer.SerializedObject == T { + DownloadResponsePublisher(self, queue: queue, serializer: serializer) + } + + /// Creates a `DownloadResponsePublisher` for this instance using the given `DownloadResponseSerializerProtocol` and + /// `DispatchQueue`. + /// + /// - Parameters: + /// - serializer: `DownloadResponseSerializer` used to serialize the response `Data` from disk. + /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published.`.main` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishResponse(using serializer: Serializer, on queue: DispatchQueue = .main) -> DownloadResponsePublisher + where Serializer.SerializedObject == T { + DownloadResponsePublisher(self, queue: queue, serializer: serializer) + } + + /// Creates a `DownloadResponsePublisher` for this instance and uses a `URLResponseSerializer` to serialize the + /// response. + /// + /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishURL(queue: DispatchQueue = .main) -> DownloadResponsePublisher { + publishResponse(using: URLResponseSerializer(), on: queue) + } + + /// Creates a `DownloadResponsePublisher` for this instance and uses a `DataResponseSerializer` to serialize the + /// response. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()` + /// by default. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless of + /// status code. `[.head]` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishData(queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher { + publishResponse(using: DataResponseSerializer(dataPreprocessor: preprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } + + /// Creates a `DownloadResponsePublisher` for this instance and uses a `StringResponseSerializer` to serialize the + /// response. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. `PassthroughPreprocessor()` + /// by default. + /// - encoding: `String.Encoding` to parse the response. `nil` by default, in which case the encoding + /// will be determined by the server response, falling back to the default HTTP character + /// set, `ISO-8859-1`. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless of + /// status code. `[.head]` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishString(queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher { + publishResponse(using: StringResponseSerializer(dataPreprocessor: preprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } + + @_disfavoredOverload + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + @available(*, deprecated, message: "Renamed publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods).") + public func publishDecodable(type: T.Type = T.self, + queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyResponseMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher { + publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyResponseMethods), + on: queue) + } + + /// Creates a `DownloadResponsePublisher` for this instance and uses a `DecodableResponseSerializer` to serialize + /// the response. + /// + /// - Parameters: + /// - type: `Decodable` type to which to decode response `Data`. Inferred from the context by default. + /// - queue: `DispatchQueue` on which the `DataResponse` will be published. `.main` by default. + /// - preprocessor: `DataPreprocessor` which filters the `Data` before serialization. + /// `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` instance used to decode response `Data`. `JSONDecoder()` by default. + /// - emptyResponseCodes: `Set` of HTTP status codes for which empty responses are allowed. `[204, 205]` by + /// default. + /// - emptyRequestMethods: `Set` of `HTTPMethod`s for which empty responses are allowed, regardless + /// of status code. `[.head]` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishDecodable(type: T.Type = T.self, + queue: DispatchQueue = .main, + preprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DownloadResponsePublisher { + publishResponse(using: DecodableResponseSerializer(dataPreprocessor: preprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + on: queue) + } +} + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +extension DownloadResponsePublisher where Value == URL? { + /// Creates an instance which publishes a `DownloadResponse` value without serialization. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public init(_ request: DownloadRequest, queue: DispatchQueue) { + self.request = request + responseHandler = { request.response(queue: queue, completionHandler: $0) } + } +} + +extension DownloadRequest { + /// Creates a `DownloadResponsePublisher` for this instance which does not serialize the response before publishing. + /// + /// - Parameter queue: `DispatchQueue` on which the `DownloadResponse` will be published. `.main` by default. + /// + /// - Returns: The `DownloadResponsePublisher`. + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + public func publishUnserialized(on queue: DispatchQueue = .main) -> DownloadResponsePublisher { + DownloadResponsePublisher(self, queue: queue) + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/Concurrency.swift b/Carthage/Checkouts/Alamofire/Source/Concurrency.swift new file mode 100644 index 00000000..21e7e1ec --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Concurrency.swift @@ -0,0 +1,832 @@ +// +// Concurrency.swift +// +// Copyright (c) 2021 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if compiler(>=5.6.0) && canImport(_Concurrency) + +import Foundation + +// MARK: - Request Event Streams + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension Request { + /// Creates a `StreamOf` for the instance's upload progress. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func uploadProgress(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + uploadProgress(queue: underlyingQueue) { progress in + continuation.yield(progress) + } + } + } + + /// Creates a `StreamOf` for the instance's download progress. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func downloadProgress(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + downloadProgress(queue: underlyingQueue) { progress in + continuation.yield(progress) + } + } + } + + /// Creates a `StreamOf` for the `URLRequest`s produced for the instance. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func urlRequests(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + onURLRequestCreation(on: underlyingQueue) { request in + continuation.yield(request) + } + } + } + + /// Creates a `StreamOf` for the `URLSessionTask`s produced for the instance. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func urlSessionTasks(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + onURLSessionTaskCreation(on: underlyingQueue) { task in + continuation.yield(task) + } + } + } + + /// Creates a `StreamOf` for the cURL descriptions produced for the instance. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func cURLDescriptions(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + cURLDescription(on: underlyingQueue) { description in + continuation.yield(description) + } + } + } + + fileprivate func stream(of type: T.Type = T.self, + bufferingPolicy: StreamOf.BufferingPolicy = .unbounded, + yielder: @escaping (StreamOf.Continuation) -> Void) -> StreamOf { + StreamOf(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + yielder(continuation) + // Must come after serializers run in order to catch retry progress. + onFinish { + continuation.finish() + } + } + } +} + +// MARK: - DataTask + +/// Value used to `await` a `DataResponse` and associated values. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct DataTask { + /// `DataResponse` produced by the `DataRequest` and its response handler. + public var response: DataResponse { + get async { + if shouldAutomaticallyCancel { + return await withTaskCancellationHandler { + await task.value + } onCancel: { + cancel() + } + } else { + return await task.value + } + } + } + + /// `Result` of any response serialization performed for the `response`. + public var result: Result { + get async { await response.result } + } + + /// `Value` returned by the `response`. + public var value: Value { + get async throws { + try await result.get() + } + } + + private let request: DataRequest + private let task: Task, Never> + private let shouldAutomaticallyCancel: Bool + + fileprivate init(request: DataRequest, task: Task, Never>, shouldAutomaticallyCancel: Bool) { + self.request = request + self.task = task + self.shouldAutomaticallyCancel = shouldAutomaticallyCancel + } + + /// Cancel the underlying `DataRequest` and `Task`. + public func cancel() { + task.cancel() + } + + /// Resume the underlying `DataRequest`. + public func resume() { + request.resume() + } + + /// Suspend the underlying `DataRequest`. + public func suspend() { + request.suspend() + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension DataRequest { + /// Creates a `StreamOf` for the instance's responses. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func httpResponses(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + onHTTPResponse(on: underlyingQueue) { response in + continuation.yield(response) + } + } + } + + #if swift(>=5.7) + /// Sets an async closure returning a `Request.ResponseDisposition`, called whenever the `DataRequest` produces an + /// `HTTPURLResponse`. + /// + /// - Note: Most requests will only produce a single response for each outgoing attempt (initial + retries). + /// However, some types of response may trigger multiple `HTTPURLResponse`s, such as multipart streams, + /// where responses after the first will contain the part headers. + /// + /// - Parameters: + /// - handler: Async closure executed when a new `HTTPURLResponse` is received and returning a + /// `ResponseDisposition` value. This value determines whether to continue the request or cancel it as + /// if `cancel()` had been called on the instance. Note, this closure is called on an arbitrary thread, + /// so any synchronous calls in it will execute in that context. + /// + /// - Returns: The instance. + @_disfavoredOverload + @discardableResult + public func onHTTPResponse( + perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> ResponseDisposition + ) -> Self { + onHTTPResponse(on: underlyingQueue) { response, completionHandler in + Task { + let disposition = await handler(response) + completionHandler(disposition) + } + } + + return self + } + + /// Sets an async closure called whenever the `DataRequest` produces an `HTTPURLResponse`. + /// + /// - Note: Most requests will only produce a single response for each outgoing attempt (initial + retries). + /// However, some types of response may trigger multiple `HTTPURLResponse`s, such as multipart streams, + /// where responses after the first will contain the part headers. + /// + /// - Parameters: + /// - handler: Async closure executed when a new `HTTPURLResponse` is received. Note, this closure is called on an + /// arbitrary thread, so any synchronous calls in it will execute in that context. + /// + /// - Returns: The instance. + @discardableResult + public func onHTTPResponse(perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> Void) -> Self { + onHTTPResponse { response in + await handler(response) + return .allow + } + + return self + } + #endif + + /// Creates a `DataTask` to `await` a `Data` value. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DataTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before completion. + /// - emptyResponseCodes: HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DataTask`. + public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) -> DataTask { + serializingResponse(using: DataResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DataTask` to `await` serialization of a `Decodable` value. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DataTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer. + /// `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DataTask`. + public func serializingDecodable(_ type: Value.Type = Value.self, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DataTask { + serializingResponse(using: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DataTask` to `await` serialization of a `String` value. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DataTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer. + /// `PassthroughPreprocessor()` by default. + /// - encoding: `String.Encoding` to use during serialization. Defaults to `nil`, in which case + /// the encoding will be determined from the server response, falling back to the + /// default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DataTask`. + public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) -> DataTask { + serializingResponse(using: StringResponseSerializer(dataPreprocessor: dataPreprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DataTask` to `await` serialization using the provided `ResponseSerializer` instance. + /// + /// - Parameters: + /// - serializer: `ResponseSerializer` responsible for serializing the request, response, and data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DataTask`'s async + /// properties. `true` by default. + /// + /// - Returns: The `DataTask`. + public func serializingResponse(using serializer: Serializer, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true) + -> DataTask { + dataTask(automaticallyCancelling: shouldAutomaticallyCancel) { [self] in + response(queue: underlyingQueue, + responseSerializer: serializer, + completionHandler: $0) + } + } + + /// Creates a `DataTask` to `await` serialization using the provided `DataResponseSerializerProtocol` instance. + /// + /// - Parameters: + /// - serializer: `DataResponseSerializerProtocol` responsible for serializing the request, + /// response, and data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DataTask`'s async + /// properties. `true` by default. + /// + /// - Returns: The `DataTask`. + public func serializingResponse(using serializer: Serializer, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true) + -> DataTask { + dataTask(automaticallyCancelling: shouldAutomaticallyCancel) { [self] in + response(queue: underlyingQueue, + responseSerializer: serializer, + completionHandler: $0) + } + } + + private func dataTask(automaticallyCancelling shouldAutomaticallyCancel: Bool, + forResponse onResponse: @escaping (@escaping (DataResponse) -> Void) -> Void) + -> DataTask { + let task = Task { + await withTaskCancellationHandler { + await withCheckedContinuation { continuation in + onResponse { + continuation.resume(returning: $0) + } + } + } onCancel: { + self.cancel() + } + } + + return DataTask(request: self, task: task, shouldAutomaticallyCancel: shouldAutomaticallyCancel) + } +} + +// MARK: - DownloadTask + +/// Value used to `await` a `DownloadResponse` and associated values. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct DownloadTask { + /// `DownloadResponse` produced by the `DownloadRequest` and its response handler. + public var response: DownloadResponse { + get async { + if shouldAutomaticallyCancel { + return await withTaskCancellationHandler { + await task.value + } onCancel: { + cancel() + } + } else { + return await task.value + } + } + } + + /// `Result` of any response serialization performed for the `response`. + public var result: Result { + get async { await response.result } + } + + /// `Value` returned by the `response`. + public var value: Value { + get async throws { + try await result.get() + } + } + + private let task: Task, Never> + private let request: DownloadRequest + private let shouldAutomaticallyCancel: Bool + + fileprivate init(request: DownloadRequest, task: Task, Never>, shouldAutomaticallyCancel: Bool) { + self.request = request + self.task = task + self.shouldAutomaticallyCancel = shouldAutomaticallyCancel + } + + /// Cancel the underlying `DownloadRequest` and `Task`. + public func cancel() { + task.cancel() + } + + /// Resume the underlying `DownloadRequest`. + public func resume() { + request.resume() + } + + /// Suspend the underlying `DownloadRequest`. + public func suspend() { + request.suspend() + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension DownloadRequest { + /// Creates a `DownloadTask` to `await` a `Data` value. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before completion. + /// - emptyResponseCodes: HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask { + serializingDownload(using: DataResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DownloadTask` to `await` serialization of a `Decodable` value. + /// + /// - Note: This serializer reads the entire response into memory before parsing. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the serializer. + /// `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingDecodable(_ type: Value.Type = Value.self, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask { + serializingDownload(using: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DownloadTask` to `await` serialization of the downloaded file's `URL` on disk. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingDownloadedFileURL(automaticallyCancelling shouldAutomaticallyCancel: Bool = true) -> DownloadTask { + serializingDownload(using: URLResponseSerializer(), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DownloadTask` to `await` serialization of a `String` value. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// serializer. `PassthroughPreprocessor()` by default. + /// - encoding: `String.Encoding` to use during serialization. Defaults to `nil`, in which case + /// the encoding will be determined from the server response, falling back to the + /// default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask { + serializingDownload(using: StringResponseSerializer(dataPreprocessor: dataPreprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + automaticallyCancelling: shouldAutomaticallyCancel) + } + + /// Creates a `DownloadTask` to `await` serialization using the provided `ResponseSerializer` instance. + /// + /// - Parameters: + /// - serializer: `ResponseSerializer` responsible for serializing the request, response, and data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingDownload(using serializer: Serializer, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true) + -> DownloadTask { + downloadTask(automaticallyCancelling: shouldAutomaticallyCancel) { [self] in + response(queue: underlyingQueue, + responseSerializer: serializer, + completionHandler: $0) + } + } + + /// Creates a `DownloadTask` to `await` serialization using the provided `DownloadResponseSerializerProtocol` + /// instance. + /// + /// - Parameters: + /// - serializer: `DownloadResponseSerializerProtocol` responsible for serializing the request, + /// response, and data. + /// - shouldAutomaticallyCancel: `Bool` determining whether or not the request should be cancelled when the + /// enclosing async context is cancelled. Only applies to `DownloadTask`'s async + /// properties. `true` by default. + /// + /// - Returns: The `DownloadTask`. + public func serializingDownload(using serializer: Serializer, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true) + -> DownloadTask { + downloadTask(automaticallyCancelling: shouldAutomaticallyCancel) { [self] in + response(queue: underlyingQueue, + responseSerializer: serializer, + completionHandler: $0) + } + } + + private func downloadTask(automaticallyCancelling shouldAutomaticallyCancel: Bool, + forResponse onResponse: @escaping (@escaping (DownloadResponse) -> Void) -> Void) + -> DownloadTask { + let task = Task { + await withTaskCancellationHandler { + await withCheckedContinuation { continuation in + onResponse { + continuation.resume(returning: $0) + } + } + } onCancel: { + self.cancel() + } + } + + return DownloadTask(request: self, task: task, shouldAutomaticallyCancel: shouldAutomaticallyCancel) + } +} + +// MARK: - DataStreamTask + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct DataStreamTask { + // Type of created streams. + public typealias Stream = StreamOf> + + private let request: DataStreamRequest + + fileprivate init(request: DataStreamRequest) { + self.request = request + } + + /// Creates a `Stream` of `Data` values from the underlying `DataStreamRequest`. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled + /// which observation of the stream stops. `true` by default. + /// - bufferingPolicy: ` BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `Stream`. + public func streamingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream.BufferingPolicy = .unbounded) -> Stream { + createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in + request.responseStream(on: .streamCompletionQueue(forRequestID: request.id), stream: onStream) + } + } + + /// Creates a `Stream` of `UTF-8` `String`s from the underlying `DataStreamRequest`. + /// + /// - Parameters: + /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled + /// which observation of the stream stops. `true` by default. + /// - bufferingPolicy: ` BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// - Returns: + public func streamingStrings(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream.BufferingPolicy = .unbounded) -> Stream { + createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in + request.responseStreamString(on: .streamCompletionQueue(forRequestID: request.id), stream: onStream) + } + } + + /// Creates a `Stream` of `Decodable` values from the underlying `DataStreamRequest`. + /// + /// - Parameters: + /// - type: `Decodable` type to be serialized from stream payloads. + /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled + /// which observation of the stream stops. `true` by default. + /// - bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `Stream`. + public func streamingDecodables(_ type: T.Type = T.self, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + bufferingPolicy: Stream.BufferingPolicy = .unbounded) + -> Stream where T: Decodable { + streamingResponses(serializedUsing: DecodableStreamSerializer(), + automaticallyCancelling: shouldAutomaticallyCancel, + bufferingPolicy: bufferingPolicy) + } + + /// Creates a `Stream` of values using the provided `DataStreamSerializer` from the underlying `DataStreamRequest`. + /// + /// - Parameters: + /// - serializer: `DataStreamSerializer` to use to serialize incoming `Data`. + /// - shouldAutomaticallyCancel: `Bool` indicating whether the underlying `DataStreamRequest` should be canceled + /// which observation of the stream stops. `true` by default. + /// - bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `Stream`. + public func streamingResponses(serializedUsing serializer: Serializer, + automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + bufferingPolicy: Stream.BufferingPolicy = .unbounded) + -> Stream { + createStream(automaticallyCancelling: shouldAutomaticallyCancel, bufferingPolicy: bufferingPolicy) { onStream in + request.responseStream(using: serializer, + on: .streamCompletionQueue(forRequestID: request.id), + stream: onStream) + } + } + + private func createStream(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, + bufferingPolicy: Stream.BufferingPolicy = .unbounded, + forResponse onResponse: @escaping (@escaping (DataStreamRequest.Stream) -> Void) -> Void) + -> Stream { + StreamOf(bufferingPolicy: bufferingPolicy) { + guard shouldAutomaticallyCancel, + request.isInitialized || request.isResumed || request.isSuspended else { return } + + cancel() + } builder: { continuation in + onResponse { stream in + continuation.yield(stream) + if case .complete = stream.event { + continuation.finish() + } + } + } + } + + /// Cancel the underlying `DataStreamRequest`. + public func cancel() { + request.cancel() + } + + /// Resume the underlying `DataStreamRequest`. + public func resume() { + request.resume() + } + + /// Suspend the underlying `DataStreamRequest`. + public func suspend() { + request.suspend() + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension DataStreamRequest { + /// Creates a `StreamOf` for the instance's responses. + /// + /// - Parameter bufferingPolicy: `BufferingPolicy` that determines the stream's buffering behavior.`.unbounded` by default. + /// + /// - Returns: The `StreamOf`. + public func httpResponses(bufferingPolicy: StreamOf.BufferingPolicy = .unbounded) -> StreamOf { + stream(bufferingPolicy: bufferingPolicy) { [unowned self] continuation in + onHTTPResponse(on: underlyingQueue) { response in + continuation.yield(response) + } + } + } + + #if swift(>=5.7) + /// Sets an async closure returning a `Request.ResponseDisposition`, called whenever the `DataStreamRequest` + /// produces an `HTTPURLResponse`. + /// + /// - Note: Most requests will only produce a single response for each outgoing attempt (initial + retries). + /// However, some types of response may trigger multiple `HTTPURLResponse`s, such as multipart streams, + /// where responses after the first will contain the part headers. + /// + /// - Parameters: + /// - handler: Async closure executed when a new `HTTPURLResponse` is received and returning a + /// `ResponseDisposition` value. This value determines whether to continue the request or cancel it as + /// if `cancel()` had been called on the instance. Note, this closure is called on an arbitrary thread, + /// so any synchronous calls in it will execute in that context. + /// + /// - Returns: The instance. + @_disfavoredOverload + @discardableResult + public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> ResponseDisposition) -> Self { + onHTTPResponse(on: underlyingQueue) { response, completionHandler in + Task { + let disposition = await handler(response) + completionHandler(disposition) + } + } + + return self + } + + /// Sets an async closure called whenever the `DataStreamRequest` produces an `HTTPURLResponse`. + /// + /// - Note: Most requests will only produce a single response for each outgoing attempt (initial + retries). + /// However, some types of response may trigger multiple `HTTPURLResponse`s, such as multipart streams, + /// where responses after the first will contain the part headers. + /// + /// - Parameters: + /// - handler: Async closure executed when a new `HTTPURLResponse` is received. Note, this closure is called on an + /// arbitrary thread, so any synchronous calls in it will execute in that context. + /// + /// - Returns: The instance. + @discardableResult + public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> Void) -> Self { + onHTTPResponse { response in + await handler(response) + return .allow + } + + return self + } + #endif + + /// Creates a `DataStreamTask` used to `await` streams of serialized values. + /// + /// - Returns: The `DataStreamTask`. + public func streamTask() -> DataStreamTask { + DataStreamTask(request: self) + } +} + +extension DispatchQueue { + fileprivate static let singleEventQueue = DispatchQueue(label: "org.alamofire.concurrencySingleEventQueue", + attributes: .concurrent) + + fileprivate static func streamCompletionQueue(forRequestID id: UUID) -> DispatchQueue { + DispatchQueue(label: "org.alamofire.concurrencyStreamCompletionQueue-\(id)", target: .singleEventQueue) + } +} + +/// An asynchronous sequence generated from an underlying `AsyncStream`. Only produced by Alamofire. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct StreamOf: AsyncSequence { + public typealias AsyncIterator = Iterator + public typealias BufferingPolicy = AsyncStream.Continuation.BufferingPolicy + fileprivate typealias Continuation = AsyncStream.Continuation + + private let bufferingPolicy: BufferingPolicy + private let onTermination: (() -> Void)? + private let builder: (Continuation) -> Void + + fileprivate init(bufferingPolicy: BufferingPolicy = .unbounded, + onTermination: (() -> Void)? = nil, + builder: @escaping (Continuation) -> Void) { + self.bufferingPolicy = bufferingPolicy + self.onTermination = onTermination + self.builder = builder + } + + public func makeAsyncIterator() -> Iterator { + var continuation: AsyncStream.Continuation? + let stream = AsyncStream(bufferingPolicy: bufferingPolicy) { innerContinuation in + continuation = innerContinuation + builder(innerContinuation) + } + + return Iterator(iterator: stream.makeAsyncIterator()) { + continuation?.finish() + onTermination?() + } + } + + public struct Iterator: AsyncIteratorProtocol { + private final class Token { + private let onDeinit: () -> Void + + init(onDeinit: @escaping () -> Void) { + self.onDeinit = onDeinit + } + + deinit { + onDeinit() + } + } + + private var iterator: AsyncStream.AsyncIterator + private let token: Token + + init(iterator: AsyncStream.AsyncIterator, onCancellation: @escaping () -> Void) { + self.iterator = iterator + token = Token(onDeinit: onCancellation) + } + + public mutating func next() async -> Element? { + await iterator.next() + } + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/DispatchQueue+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/DispatchQueue+Alamofire.swift new file mode 100644 index 00000000..10cd273e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/DispatchQueue+Alamofire.swift @@ -0,0 +1,37 @@ +// +// DispatchQueue+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Dispatch +import Foundation + +extension DispatchQueue { + /// Execute the provided closure after a `TimeInterval`. + /// + /// - Parameters: + /// - delay: `TimeInterval` to delay execution. + /// - closure: Closure to execute. + func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) { + asyncAfter(deadline: .now() + delay, execute: closure) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/EventMonitor.swift b/Carthage/Checkouts/Alamofire/Source/EventMonitor.swift new file mode 100644 index 00000000..75b60f21 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/EventMonitor.swift @@ -0,0 +1,907 @@ +// +// EventMonitor.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +/// `URLSession` delegate protocols as well as various events from the lifetime of `Request` and its subclasses. +public protocol EventMonitor { + /// The `DispatchQueue` onto which Alamofire's root `CompositeEventMonitor` will dispatch events. `.main` by default. + var queue: DispatchQueue { get } + + // MARK: - URLSession Events + + // MARK: URLSessionDelegate Events + + /// Event called during `URLSessionDelegate`'s `urlSession(_:didBecomeInvalidWithError:)` method. + func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) + + // MARK: URLSessionTaskDelegate Events + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didReceive:completionHandler:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` method. + func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:needNewBodyStream:)` method. + func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` method. + func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didFinishCollecting:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:task:didCompleteWithError:)` method. + func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) + + /// Event called during `URLSessionTaskDelegate`'s `urlSession(_:taskIsWaitingForConnectivity:)` method. + func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) + + // MARK: URLSessionDataDelegate Events + + /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:didReceive:completionHandler:)` method. + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse) + + /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:didReceive:)` method. + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) + + /// Event called during `URLSessionDataDelegate`'s `urlSession(_:dataTask:willCacheResponse:completionHandler:)` method. + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) + + // MARK: URLSessionDownloadDelegate Events + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` method. + func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` method. + func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) + + /// Event called during `URLSessionDownloadDelegate`'s `urlSession(_:downloadTask:didFinishDownloadingTo:)` method. + func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) + + // MARK: - Request Events + + /// Event called when a `URLRequest` is first created for a `Request`. If a `RequestAdapter` is active, the + /// `URLRequest` will be adapted before being issued. + func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) + + /// Event called when the attempt to create a `URLRequest` from a `Request`'s original `URLRequestConvertible` value fails. + func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) + + /// Event called when a `RequestAdapter` adapts the `Request`'s initial `URLRequest`. + func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) + + /// Event called when a `RequestAdapter` fails to adapt the `Request`'s initial `URLRequest`. + func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) + + /// Event called when a final `URLRequest` is created for a `Request`. + func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) + + /// Event called when a `URLSessionTask` subclass instance is created for a `Request`. + func request(_ request: Request, didCreateTask task: URLSessionTask) + + /// Event called when a `Request` receives a `URLSessionTaskMetrics` value. + func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) + + /// Event called when a `Request` fails due to an error created by Alamofire. e.g. When certificate pinning fails. + func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) + + /// Event called when a `Request`'s task completes, possibly with an error. A `Request` may receive this event + /// multiple times if it is retried. + func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) + + /// Event called when a `Request` is about to be retried. + func requestIsRetrying(_ request: Request) + + /// Event called when a `Request` finishes and response serializers are being called. + func requestDidFinish(_ request: Request) + + /// Event called when a `Request` receives a `resume` call. + func requestDidResume(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is resumed. + func request(_ request: Request, didResumeTask task: URLSessionTask) + + /// Event called when a `Request` receives a `suspend` call. + func requestDidSuspend(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is suspended. + func request(_ request: Request, didSuspendTask task: URLSessionTask) + + /// Event called when a `Request` receives a `cancel` call. + func requestDidCancel(_ request: Request) + + /// Event called when a `Request`'s associated `URLSessionTask` is cancelled. + func request(_ request: Request, didCancelTask task: URLSessionTask) + + // MARK: DataRequest Events + + /// Event called when a `DataRequest` calls a `Validation`. + func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) + + /// Event called when a `DataRequest` creates a `DataResponse` value without calling a `ResponseSerializer`. + func request(_ request: DataRequest, didParseResponse response: DataResponse) + + /// Event called when a `DataRequest` calls a `ResponseSerializer` and creates a generic `DataResponse`. + func request(_ request: DataRequest, didParseResponse response: DataResponse) + + // MARK: DataStreamRequest Events + + /// Event called when a `DataStreamRequest` calls a `Validation` closure. + /// + /// - Parameters: + /// - request: `DataStreamRequest` which is calling the `Validation`. + /// - urlRequest: `URLRequest` of the request being validated. + /// - response: `HTTPURLResponse` of the request being validated. + /// - result: Produced `ValidationResult`. + func request(_ request: DataStreamRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + withResult result: Request.ValidationResult) + + /// Event called when a `DataStreamSerializer` produces a value from streamed `Data`. + /// + /// - Parameters: + /// - request: `DataStreamRequest` for which the value was serialized. + /// - result: `Result` of the serialization attempt. + func request(_ request: DataStreamRequest, didParseStream result: Result) + + // MARK: UploadRequest Events + + /// Event called when an `UploadRequest` creates its `Uploadable` value, indicating the type of upload it represents. + func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) + + /// Event called when an `UploadRequest` failed to create its `Uploadable` value due to an error. + func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) + + /// Event called when an `UploadRequest` provides the `InputStream` from its `Uploadable` value. This only occurs if + /// the `InputStream` does not wrap a `Data` value or file `URL`. + func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) + + // MARK: DownloadRequest Events + + /// Event called when a `DownloadRequest`'s `URLSessionDownloadTask` finishes and the temporary file has been moved. + func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) + + /// Event called when a `DownloadRequest`'s `Destination` closure is called and creates the destination URL the + /// downloaded file will be moved to. + func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) + + /// Event called when a `DownloadRequest` calls a `Validation`. + func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) + + /// Event called when a `DownloadRequest` creates a `DownloadResponse` without calling a `ResponseSerializer`. + func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) + + /// Event called when a `DownloadRequest` calls a `DownloadResponseSerializer` and creates a generic `DownloadResponse` + func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) +} + +extension EventMonitor { + /// The default queue on which `CompositeEventMonitor`s will call the `EventMonitor` methods. `.main` by default. + public var queue: DispatchQueue { .main } + + // MARK: Default Implementations + + public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) {} + public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) {} + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didFinishCollecting metrics: URLSessionTaskMetrics) {} + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {} + public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {} + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse) {} + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {} + public func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) {} + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) {} + public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) {} + public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) {} + public func request(_ request: Request, + didAdaptInitialRequest initialRequest: URLRequest, + to adaptedRequest: URLRequest) {} + public func request(_ request: Request, + didFailToAdaptURLRequest initialRequest: URLRequest, + withError error: AFError) {} + public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) {} + public func request(_ request: Request, didCreateTask task: URLSessionTask) {} + public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) {} + public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) {} + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {} + public func requestIsRetrying(_ request: Request) {} + public func requestDidFinish(_ request: Request) {} + public func requestDidResume(_ request: Request) {} + public func request(_ request: Request, didResumeTask task: URLSessionTask) {} + public func requestDidSuspend(_ request: Request) {} + public func request(_ request: Request, didSuspendTask task: URLSessionTask) {} + public func requestDidCancel(_ request: Request) {} + public func request(_ request: Request, didCancelTask task: URLSessionTask) {} + public func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) {} + public func request(_ request: DataRequest, didParseResponse response: DataResponse) {} + public func request(_ request: DataRequest, didParseResponse response: DataResponse) {} + public func request(_ request: DataStreamRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + withResult result: Request.ValidationResult) {} + public func request(_ request: DataStreamRequest, didParseStream result: Result) {} + public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) {} + public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) {} + public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) {} + public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) {} + public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) {} + public func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) {} + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) {} + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) {} +} + +/// An `EventMonitor` which can contain multiple `EventMonitor`s and calls their methods on their queues. +public final class CompositeEventMonitor: EventMonitor { + public let queue = DispatchQueue(label: "org.alamofire.compositeEventMonitor", qos: .utility) + + let monitors: [EventMonitor] + + init(monitors: [EventMonitor]) { + self.monitors = monitors + } + + func performEvent(_ event: @escaping (EventMonitor) -> Void) { + queue.async { + for monitor in self.monitors { + monitor.queue.async { event(monitor) } + } + } + } + + public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + performEvent { $0.urlSession(session, didBecomeInvalidWithError: error) } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge) { + performEvent { $0.urlSession(session, task: task, didReceive: challenge) } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + performEvent { + $0.urlSession(session, + task: task, + didSendBodyData: bytesSent, + totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + } + } + + public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) { + performEvent { + $0.urlSession(session, taskNeedsNewBodyStream: task) + } + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) { + performEvent { + $0.urlSession(session, + task: task, + willPerformHTTPRedirection: response, + newRequest: request) + } + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + performEvent { $0.urlSession(session, task: task, didFinishCollecting: metrics) } + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + performEvent { $0.urlSession(session, task: task, didCompleteWithError: error) } + } + + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + performEvent { $0.urlSession(session, taskIsWaitingForConnectivity: task) } + } + + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse) { + performEvent { $0.urlSession(session, dataTask: dataTask, didReceive: response) } + } + + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + performEvent { $0.urlSession(session, dataTask: dataTask, didReceive: data) } + } + + public func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse) { + performEvent { $0.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + performEvent { + $0.urlSession(session, + downloadTask: downloadTask, + didResumeAtOffset: fileOffset, + expectedTotalBytes: expectedTotalBytes) + } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + performEvent { + $0.urlSession(session, + downloadTask: downloadTask, + didWriteData: bytesWritten, + totalBytesWritten: totalBytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + } + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) { + performEvent { $0.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) } + } + + public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) { + performEvent { $0.request(request, didCreateInitialURLRequest: urlRequest) } + } + + public func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) { + performEvent { $0.request(request, didFailToCreateURLRequestWithError: error) } + } + + public func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) { + performEvent { $0.request(request, didAdaptInitialRequest: initialRequest, to: adaptedRequest) } + } + + public func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) { + performEvent { $0.request(request, didFailToAdaptURLRequest: initialRequest, withError: error) } + } + + public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) { + performEvent { $0.request(request, didCreateURLRequest: urlRequest) } + } + + public func request(_ request: Request, didCreateTask task: URLSessionTask) { + performEvent { $0.request(request, didCreateTask: task) } + } + + public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) { + performEvent { $0.request(request, didGatherMetrics: metrics) } + } + + public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) { + performEvent { $0.request(request, didFailTask: task, earlyWithError: error) } + } + + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + performEvent { $0.request(request, didCompleteTask: task, with: error) } + } + + public func requestIsRetrying(_ request: Request) { + performEvent { $0.requestIsRetrying(request) } + } + + public func requestDidFinish(_ request: Request) { + performEvent { $0.requestDidFinish(request) } + } + + public func requestDidResume(_ request: Request) { + performEvent { $0.requestDidResume(request) } + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + performEvent { $0.request(request, didResumeTask: task) } + } + + public func requestDidSuspend(_ request: Request) { + performEvent { $0.requestDidSuspend(request) } + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + performEvent { $0.request(request, didSuspendTask: task) } + } + + public func requestDidCancel(_ request: Request) { + performEvent { $0.requestDidCancel(request) } + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + performEvent { $0.request(request, didCancelTask: task) } + } + + public func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) { + performEvent { $0.request(request, + didValidateRequest: urlRequest, + response: response, + data: data, + withResult: result) + } + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: DataStreamRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + withResult result: Request.ValidationResult) { + performEvent { $0.request(request, + didValidateRequest: urlRequest, + response: response, + withResult: result) + } + } + + public func request(_ request: DataStreamRequest, didParseStream result: Result) { + performEvent { $0.request(request, didParseStream: result) } + } + + public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) { + performEvent { $0.request(request, didCreateUploadable: uploadable) } + } + + public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) { + performEvent { $0.request(request, didFailToCreateUploadableWithError: error) } + } + + public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) { + performEvent { $0.request(request, didProvideInputStream: stream) } + } + + public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) { + performEvent { $0.request(request, didFinishDownloadingUsing: task, with: result) } + } + + public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) { + performEvent { $0.request(request, didCreateDestinationURL: url) } + } + + public func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) { + performEvent { $0.request(request, + didValidateRequest: urlRequest, + response: response, + fileURL: fileURL, + withResult: result) } + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + performEvent { $0.request(request, didParseResponse: response) } + } +} + +/// `EventMonitor` that allows optional closures to be set to receive events. +open class ClosureEventMonitor: EventMonitor { + /// Closure called on the `urlSession(_:didBecomeInvalidWithError:)` event. + open var sessionDidBecomeInvalidWithError: ((URLSession, Error?) -> Void)? + + /// Closure called on the `urlSession(_:task:didReceive:completionHandler:)`. + open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> Void)? + + /// Closure that receives `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)` event. + open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)? + + /// Closure called on the `urlSession(_:task:needNewBodyStream:)` event. + open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> Void)? + + /// Closure called on the `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` event. + open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> Void)? + + /// Closure called on the `urlSession(_:task:didFinishCollecting:)` event. + open var taskDidFinishCollectingMetrics: ((URLSession, URLSessionTask, URLSessionTaskMetrics) -> Void)? + + /// Closure called on the `urlSession(_:task:didCompleteWithError:)` event. + open var taskDidComplete: ((URLSession, URLSessionTask, Error?) -> Void)? + + /// Closure called on the `urlSession(_:taskIsWaitingForConnectivity:)` event. + open var taskIsWaitingForConnectivity: ((URLSession, URLSessionTask) -> Void)? + + /// Closure called on the `urlSession(_:dataTask:didReceive:completionHandler:)` event. + open var dataTaskDidReceiveResponse: ((URLSession, URLSessionDataTask, URLResponse) -> Void)? + + /// Closure that receives the `urlSession(_:dataTask:didReceive:)` event. + open var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)? + + /// Closure called on the `urlSession(_:dataTask:willCacheResponse:completionHandler:)` event. + open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didFinishDownloadingTo:)` event. + open var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)` + /// event. + open var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)? + + /// Closure called on the `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)` event. + open var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)? + + // MARK: - Request Events + + /// Closure called on the `request(_:didCreateInitialURLRequest:)` event. + open var requestDidCreateInitialURLRequest: ((Request, URLRequest) -> Void)? + + /// Closure called on the `request(_:didFailToCreateURLRequestWithError:)` event. + open var requestDidFailToCreateURLRequestWithError: ((Request, AFError) -> Void)? + + /// Closure called on the `request(_:didAdaptInitialRequest:to:)` event. + open var requestDidAdaptInitialRequestToAdaptedRequest: ((Request, URLRequest, URLRequest) -> Void)? + + /// Closure called on the `request(_:didFailToAdaptURLRequest:withError:)` event. + open var requestDidFailToAdaptURLRequestWithError: ((Request, URLRequest, AFError) -> Void)? + + /// Closure called on the `request(_:didCreateURLRequest:)` event. + open var requestDidCreateURLRequest: ((Request, URLRequest) -> Void)? + + /// Closure called on the `request(_:didCreateTask:)` event. + open var requestDidCreateTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `request(_:didGatherMetrics:)` event. + open var requestDidGatherMetrics: ((Request, URLSessionTaskMetrics) -> Void)? + + /// Closure called on the `request(_:didFailTask:earlyWithError:)` event. + open var requestDidFailTaskEarlyWithError: ((Request, URLSessionTask, AFError) -> Void)? + + /// Closure called on the `request(_:didCompleteTask:with:)` event. + open var requestDidCompleteTaskWithError: ((Request, URLSessionTask, AFError?) -> Void)? + + /// Closure called on the `requestIsRetrying(_:)` event. + open var requestIsRetrying: ((Request) -> Void)? + + /// Closure called on the `requestDidFinish(_:)` event. + open var requestDidFinish: ((Request) -> Void)? + + /// Closure called on the `requestDidResume(_:)` event. + open var requestDidResume: ((Request) -> Void)? + + /// Closure called on the `request(_:didResumeTask:)` event. + open var requestDidResumeTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `requestDidSuspend(_:)` event. + open var requestDidSuspend: ((Request) -> Void)? + + /// Closure called on the `request(_:didSuspendTask:)` event. + open var requestDidSuspendTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `requestDidCancel(_:)` event. + open var requestDidCancel: ((Request) -> Void)? + + /// Closure called on the `request(_:didCancelTask:)` event. + open var requestDidCancelTask: ((Request, URLSessionTask) -> Void)? + + /// Closure called on the `request(_:didValidateRequest:response:data:withResult:)` event. + open var requestDidValidateRequestResponseDataWithResult: ((DataRequest, URLRequest?, HTTPURLResponse, Data?, Request.ValidationResult) -> Void)? + + /// Closure called on the `request(_:didParseResponse:)` event. + open var requestDidParseResponse: ((DataRequest, DataResponse) -> Void)? + + /// Closure called on the `request(_:didValidateRequest:response:withResult:)` event. + open var requestDidValidateRequestResponseWithResult: ((DataStreamRequest, URLRequest?, HTTPURLResponse, Request.ValidationResult) -> Void)? + + /// Closure called on the `request(_:didCreateUploadable:)` event. + open var requestDidCreateUploadable: ((UploadRequest, UploadRequest.Uploadable) -> Void)? + + /// Closure called on the `request(_:didFailToCreateUploadableWithError:)` event. + open var requestDidFailToCreateUploadableWithError: ((UploadRequest, AFError) -> Void)? + + /// Closure called on the `request(_:didProvideInputStream:)` event. + open var requestDidProvideInputStream: ((UploadRequest, InputStream) -> Void)? + + /// Closure called on the `request(_:didFinishDownloadingUsing:with:)` event. + open var requestDidFinishDownloadingUsingTaskWithResult: ((DownloadRequest, URLSessionTask, Result) -> Void)? + + /// Closure called on the `request(_:didCreateDestinationURL:)` event. + open var requestDidCreateDestinationURL: ((DownloadRequest, URL) -> Void)? + + /// Closure called on the `request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:)` event. + open var requestDidValidateRequestResponseFileURLWithResult: ((DownloadRequest, URLRequest?, HTTPURLResponse, URL?, Request.ValidationResult) -> Void)? + + /// Closure called on the `request(_:didParseResponse:)` event. + open var requestDidParseDownloadResponse: ((DownloadRequest, DownloadResponse) -> Void)? + + public let queue: DispatchQueue + + /// Creates an instance using the provided queue. + /// + /// - Parameter queue: `DispatchQueue` on which events will fired. `.main` by default. + public init(queue: DispatchQueue = .main) { + self.queue = queue + } + + open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + sessionDidBecomeInvalidWithError?(session, error) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) { + taskDidReceiveChallenge?(session, task, challenge) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + taskDidSendBodyData?(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend) + } + + open func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) { + taskNeedNewBodyStream?(session, task) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) { + taskWillPerformHTTPRedirection?(session, task, response, request) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + taskDidFinishCollectingMetrics?(session, task, metrics) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + taskDidComplete?(session, task, error) + } + + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + taskIsWaitingForConnectivity?(session, task) + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse) { + dataTaskDidReceiveResponse?(session, dataTask, response) + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + dataTaskDidReceiveData?(session, dataTask, data) + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse) { + dataTaskWillCacheResponse?(session, dataTask, proposedResponse) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + downloadTaskDidResumeAtOffset?(session, downloadTask, fileOffset, expectedTotalBytes) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + downloadTaskDidWriteData?(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) + } + + open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { + downloadTaskDidFinishDownloadingToURL?(session, downloadTask, location) + } + + // MARK: Request Events + + open func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) { + requestDidCreateInitialURLRequest?(request, urlRequest) + } + + open func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError) { + requestDidFailToCreateURLRequestWithError?(request, error) + } + + open func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) { + requestDidAdaptInitialRequestToAdaptedRequest?(request, initialRequest, adaptedRequest) + } + + open func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError) { + requestDidFailToAdaptURLRequestWithError?(request, initialRequest, error) + } + + open func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) { + requestDidCreateURLRequest?(request, urlRequest) + } + + open func request(_ request: Request, didCreateTask task: URLSessionTask) { + requestDidCreateTask?(request, task) + } + + open func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) { + requestDidGatherMetrics?(request, metrics) + } + + open func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError) { + requestDidFailTaskEarlyWithError?(request, task, error) + } + + open func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + requestDidCompleteTaskWithError?(request, task, error) + } + + open func requestIsRetrying(_ request: Request) { + requestIsRetrying?(request) + } + + open func requestDidFinish(_ request: Request) { + requestDidFinish?(request) + } + + open func requestDidResume(_ request: Request) { + requestDidResume?(request) + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + requestDidResumeTask?(request, task) + } + + open func requestDidSuspend(_ request: Request) { + requestDidSuspend?(request) + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + requestDidSuspendTask?(request, task) + } + + open func requestDidCancel(_ request: Request) { + requestDidCancel?(request) + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + requestDidCancelTask?(request, task) + } + + open func request(_ request: DataRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + data: Data?, + withResult result: Request.ValidationResult) { + requestDidValidateRequestResponseDataWithResult?(request, urlRequest, response, data, result) + } + + open func request(_ request: DataRequest, didParseResponse response: DataResponse) { + requestDidParseResponse?(request, response) + } + + public func request(_ request: DataStreamRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, withResult result: Request.ValidationResult) { + requestDidValidateRequestResponseWithResult?(request, urlRequest, response, result) + } + + open func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) { + requestDidCreateUploadable?(request, uploadable) + } + + open func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError) { + requestDidFailToCreateUploadableWithError?(request, error) + } + + open func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) { + requestDidProvideInputStream?(request, stream) + } + + open func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) { + requestDidFinishDownloadingUsingTaskWithResult?(request, task, result) + } + + open func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) { + requestDidCreateDestinationURL?(request, url) + } + + open func request(_ request: DownloadRequest, + didValidateRequest urlRequest: URLRequest?, + response: HTTPURLResponse, + fileURL: URL?, + withResult result: Request.ValidationResult) { + requestDidValidateRequestResponseFileURLWithResult?(request, + urlRequest, + response, + fileURL, + result) + } + + open func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + requestDidParseDownloadResponse?(request, response) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/HTTPHeaders.swift b/Carthage/Checkouts/Alamofire/Source/HTTPHeaders.swift new file mode 100644 index 00000000..08d47993 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/HTTPHeaders.swift @@ -0,0 +1,452 @@ +// +// HTTPHeaders.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// An order-preserving and case-insensitive representation of HTTP headers. +public struct HTTPHeaders { + private var headers: [HTTPHeader] = [] + + /// Creates an empty instance. + public init() {} + + /// Creates an instance from an array of `HTTPHeader`s. Duplicate case-insensitive names are collapsed into the last + /// name and value encountered. + public init(_ headers: [HTTPHeader]) { + headers.forEach { update($0) } + } + + /// Creates an instance from a `[String: String]`. Duplicate case-insensitive names are collapsed into the last name + /// and value encountered. + public init(_ dictionary: [String: String]) { + dictionary.forEach { update(HTTPHeader(name: $0.key, value: $0.value)) } + } + + /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`. + /// + /// - Parameters: + /// - name: The `HTTPHeader` name. + /// - value: The `HTTPHeader value. + public mutating func add(name: String, value: String) { + update(HTTPHeader(name: name, value: value)) + } + + /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance. + /// + /// - Parameter header: The `HTTPHeader` to update or append. + public mutating func add(_ header: HTTPHeader) { + update(header) + } + + /// Case-insensitively updates or appends an `HTTPHeader` into the instance using the provided `name` and `value`. + /// + /// - Parameters: + /// - name: The `HTTPHeader` name. + /// - value: The `HTTPHeader value. + public mutating func update(name: String, value: String) { + update(HTTPHeader(name: name, value: value)) + } + + /// Case-insensitively updates or appends the provided `HTTPHeader` into the instance. + /// + /// - Parameter header: The `HTTPHeader` to update or append. + public mutating func update(_ header: HTTPHeader) { + guard let index = headers.index(of: header.name) else { + headers.append(header) + return + } + + headers.replaceSubrange(index...index, with: [header]) + } + + /// Case-insensitively removes an `HTTPHeader`, if it exists, from the instance. + /// + /// - Parameter name: The name of the `HTTPHeader` to remove. + public mutating func remove(name: String) { + guard let index = headers.index(of: name) else { return } + + headers.remove(at: index) + } + + /// Sort the current instance by header name, case insensitively. + public mutating func sort() { + headers.sort { $0.name.lowercased() < $1.name.lowercased() } + } + + /// Returns an instance sorted by header name. + /// + /// - Returns: A copy of the current instance sorted by name. + public func sorted() -> HTTPHeaders { + var headers = self + headers.sort() + + return headers + } + + /// Case-insensitively find a header's value by name. + /// + /// - Parameter name: The name of the header to search for, case-insensitively. + /// + /// - Returns: The value of header, if it exists. + public func value(for name: String) -> String? { + guard let index = headers.index(of: name) else { return nil } + + return headers[index].value + } + + /// Case-insensitively access the header with the given name. + /// + /// - Parameter name: The name of the header. + public subscript(_ name: String) -> String? { + get { value(for: name) } + set { + if let value = newValue { + update(name: name, value: value) + } else { + remove(name: name) + } + } + } + + /// The dictionary representation of all headers. + /// + /// This representation does not preserve the current order of the instance. + public var dictionary: [String: String] { + let namesAndValues = headers.map { ($0.name, $0.value) } + + return Dictionary(namesAndValues, uniquingKeysWith: { _, last in last }) + } +} + +extension HTTPHeaders: ExpressibleByDictionaryLiteral { + public init(dictionaryLiteral elements: (String, String)...) { + elements.forEach { update(name: $0.0, value: $0.1) } + } +} + +extension HTTPHeaders: ExpressibleByArrayLiteral { + public init(arrayLiteral elements: HTTPHeader...) { + self.init(elements) + } +} + +extension HTTPHeaders: Sequence { + public func makeIterator() -> IndexingIterator<[HTTPHeader]> { + headers.makeIterator() + } +} + +extension HTTPHeaders: Collection { + public var startIndex: Int { + headers.startIndex + } + + public var endIndex: Int { + headers.endIndex + } + + public subscript(position: Int) -> HTTPHeader { + headers[position] + } + + public func index(after i: Int) -> Int { + headers.index(after: i) + } +} + +extension HTTPHeaders: CustomStringConvertible { + public var description: String { + headers.map(\.description) + .joined(separator: "\n") + } +} + +// MARK: - HTTPHeader + +/// A representation of a single HTTP header's name / value pair. +public struct HTTPHeader: Hashable { + /// Name of the header. + public let name: String + + /// Value of the header. + public let value: String + + /// Creates an instance from the given `name` and `value`. + /// + /// - Parameters: + /// - name: The name of the header. + /// - value: The value of the header. + public init(name: String, value: String) { + self.name = name + self.value = value + } +} + +extension HTTPHeader: CustomStringConvertible { + public var description: String { + "\(name): \(value)" + } +} + +extension HTTPHeader { + /// Returns an `Accept` header. + /// + /// - Parameter value: The `Accept` value. + /// - Returns: The header. + public static func accept(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Accept", value: value) + } + + /// Returns an `Accept-Charset` header. + /// + /// - Parameter value: The `Accept-Charset` value. + /// - Returns: The header. + public static func acceptCharset(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Accept-Charset", value: value) + } + + /// Returns an `Accept-Language` header. + /// + /// Alamofire offers a default Accept-Language header that accumulates and encodes the system's preferred languages. + /// Use `HTTPHeader.defaultAcceptLanguage`. + /// + /// - Parameter value: The `Accept-Language` value. + /// + /// - Returns: The header. + public static func acceptLanguage(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Accept-Language", value: value) + } + + /// Returns an `Accept-Encoding` header. + /// + /// Alamofire offers a default accept encoding value that provides the most common values. Use + /// `HTTPHeader.defaultAcceptEncoding`. + /// + /// - Parameter value: The `Accept-Encoding` value. + /// + /// - Returns: The header + public static func acceptEncoding(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Accept-Encoding", value: value) + } + + /// Returns a `Basic` `Authorization` header using the `username` and `password` provided. + /// + /// - Parameters: + /// - username: The username of the header. + /// - password: The password of the header. + /// + /// - Returns: The header. + public static func authorization(username: String, password: String) -> HTTPHeader { + let credential = Data("\(username):\(password)".utf8).base64EncodedString() + + return authorization("Basic \(credential)") + } + + /// Returns a `Bearer` `Authorization` header using the `bearerToken` provided + /// + /// - Parameter bearerToken: The bearer token. + /// + /// - Returns: The header. + public static func authorization(bearerToken: String) -> HTTPHeader { + authorization("Bearer \(bearerToken)") + } + + /// Returns an `Authorization` header. + /// + /// Alamofire provides built-in methods to produce `Authorization` headers. For a Basic `Authorization` header use + /// `HTTPHeader.authorization(username:password:)`. For a Bearer `Authorization` header, use + /// `HTTPHeader.authorization(bearerToken:)`. + /// + /// - Parameter value: The `Authorization` value. + /// + /// - Returns: The header. + public static func authorization(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Authorization", value: value) + } + + /// Returns a `Content-Disposition` header. + /// + /// - Parameter value: The `Content-Disposition` value. + /// + /// - Returns: The header. + public static func contentDisposition(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Content-Disposition", value: value) + } + + /// Returns a `Content-Encoding` header. + /// + /// - Parameter value: The `Content-Encoding`. + /// + /// - Returns: The header. + public static func contentEncoding(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Content-Encoding", value: value) + } + + /// Returns a `Content-Type` header. + /// + /// All Alamofire `ParameterEncoding`s and `ParameterEncoder`s set the `Content-Type` of the request, so it may not + /// be necessary to manually set this value. + /// + /// - Parameter value: The `Content-Type` value. + /// + /// - Returns: The header. + public static func contentType(_ value: String) -> HTTPHeader { + HTTPHeader(name: "Content-Type", value: value) + } + + /// Returns a `User-Agent` header. + /// + /// - Parameter value: The `User-Agent` value. + /// + /// - Returns: The header. + public static func userAgent(_ value: String) -> HTTPHeader { + HTTPHeader(name: "User-Agent", value: value) + } +} + +extension Array where Element == HTTPHeader { + /// Case-insensitively finds the index of an `HTTPHeader` with the provided name, if it exists. + func index(of name: String) -> Int? { + let lowercasedName = name.lowercased() + return firstIndex { $0.name.lowercased() == lowercasedName } + } +} + +// MARK: - Defaults + +extension HTTPHeaders { + /// The default set of `HTTPHeaders` used by Alamofire. Includes `Accept-Encoding`, `Accept-Language`, and + /// `User-Agent`. + public static let `default`: HTTPHeaders = [.defaultAcceptEncoding, + .defaultAcceptLanguage, + .defaultUserAgent] +} + +extension HTTPHeader { + /// Returns Alamofire's default `Accept-Encoding` header, appropriate for the encodings supported by particular OS + /// versions. + /// + /// See the [Accept-Encoding HTTP header documentation](https://tools.ietf.org/html/rfc7230#section-4.2.3) . + public static let defaultAcceptEncoding: HTTPHeader = { + let encodings: [String] + if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) { + encodings = ["br", "gzip", "deflate"] + } else { + encodings = ["gzip", "deflate"] + } + + return .acceptEncoding(encodings.qualityEncoded()) + }() + + /// Returns Alamofire's default `Accept-Language` header, generated by querying `Locale` for the user's + /// `preferredLanguages`. + /// + /// See the [Accept-Language HTTP header documentation](https://tools.ietf.org/html/rfc7231#section-5.3.5). + public static let defaultAcceptLanguage: HTTPHeader = .acceptLanguage(Locale.preferredLanguages.prefix(6).qualityEncoded()) + + /// Returns Alamofire's default `User-Agent` header. + /// + /// See the [User-Agent header documentation](https://tools.ietf.org/html/rfc7231#section-5.5.3). + /// + /// Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0` + public static let defaultUserAgent: HTTPHeader = { + let info = Bundle.main.infoDictionary + let executable = (info?["CFBundleExecutable"] as? String) ?? + (ProcessInfo.processInfo.arguments.first?.split(separator: "/").last.map(String.init)) ?? + "Unknown" + let bundle = info?["CFBundleIdentifier"] as? String ?? "Unknown" + let appVersion = info?["CFBundleShortVersionString"] as? String ?? "Unknown" + let appBuild = info?["CFBundleVersion"] as? String ?? "Unknown" + + let osNameVersion: String = { + let version = ProcessInfo.processInfo.operatingSystemVersion + let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" + let osName: String = { + #if os(iOS) + #if targetEnvironment(macCatalyst) + return "macOS(Catalyst)" + #else + return "iOS" + #endif + #elseif os(watchOS) + return "watchOS" + #elseif os(tvOS) + return "tvOS" + #elseif os(macOS) + return "macOS" + #elseif os(Linux) + return "Linux" + #elseif os(Windows) + return "Windows" + #elseif os(Android) + return "Android" + #else + return "Unknown" + #endif + }() + + return "\(osName) \(versionString)" + }() + + let alamofireVersion = "Alamofire/\(version)" + + let userAgent = "\(executable)/\(appVersion) (\(bundle); build:\(appBuild); \(osNameVersion)) \(alamofireVersion)" + + return .userAgent(userAgent) + }() +} + +extension Collection where Element == String { + func qualityEncoded() -> String { + enumerated().map { index, encoding in + let quality = 1.0 - (Double(index) * 0.1) + return "\(encoding);q=\(quality)" + }.joined(separator: ", ") + } +} + +// MARK: - System Type Extensions + +extension URLRequest { + /// Returns `allHTTPHeaderFields` as `HTTPHeaders`. + public var headers: HTTPHeaders { + get { allHTTPHeaderFields.map(HTTPHeaders.init) ?? HTTPHeaders() } + set { allHTTPHeaderFields = newValue.dictionary } + } +} + +extension HTTPURLResponse { + /// Returns `allHeaderFields` as `HTTPHeaders`. + public var headers: HTTPHeaders { + (allHeaderFields as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() + } +} + +extension URLSessionConfiguration { + /// Returns `httpAdditionalHeaders` as `HTTPHeaders`. + public var headers: HTTPHeaders { + get { (httpAdditionalHeaders as? [String: String]).map(HTTPHeaders.init) ?? HTTPHeaders() } + set { httpAdditionalHeaders = newValue.dictionary } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/HTTPMethod.swift b/Carthage/Checkouts/Alamofire/Source/HTTPMethod.swift new file mode 100644 index 00000000..539d2146 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/HTTPMethod.swift @@ -0,0 +1,56 @@ +// +// HTTPMethod.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +/// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so +/// `HTTPMethod.get != HTTPMethod(rawValue: "get")`. +/// +/// See https://tools.ietf.org/html/rfc7231#section-4.3 +public struct HTTPMethod: RawRepresentable, Equatable, Hashable { + /// `CONNECT` method. + public static let connect = HTTPMethod(rawValue: "CONNECT") + /// `DELETE` method. + public static let delete = HTTPMethod(rawValue: "DELETE") + /// `GET` method. + public static let get = HTTPMethod(rawValue: "GET") + /// `HEAD` method. + public static let head = HTTPMethod(rawValue: "HEAD") + /// `OPTIONS` method. + public static let options = HTTPMethod(rawValue: "OPTIONS") + /// `PATCH` method. + public static let patch = HTTPMethod(rawValue: "PATCH") + /// `POST` method. + public static let post = HTTPMethod(rawValue: "POST") + /// `PUT` method. + public static let put = HTTPMethod(rawValue: "PUT") + /// `QUERY` method. + public static let query = HTTPMethod(rawValue: "QUERY") + /// `TRACE` method. + public static let trace = HTTPMethod(rawValue: "TRACE") + + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Info.plist b/Carthage/Checkouts/Alamofire/Source/Info.plist new file mode 100644 index 00000000..225e7121 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + diff --git a/Carthage/Checkouts/Alamofire/Source/MultipartFormData.swift b/Carthage/Checkouts/Alamofire/Source/MultipartFormData.swift new file mode 100644 index 00000000..3fb6e2bf --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/MultipartFormData.swift @@ -0,0 +1,601 @@ +// +// MultipartFormData.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +#if canImport(MobileCoreServices) +import MobileCoreServices +#elseif canImport(CoreServices) +import CoreServices +#endif + +/// Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode +/// multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +/// to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +/// data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +/// larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset. +/// +/// For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well +/// and the w3 form documentation. +/// +/// - https://www.ietf.org/rfc/rfc2388.txt +/// - https://www.ietf.org/rfc/rfc2045.txt +/// - https://www.w3.org/TR/html401/interact/forms.html#h-17.13 +open class MultipartFormData { + // MARK: - Helper Types + + enum EncodingCharacters { + static let crlf = "\r\n" + } + + enum BoundaryGenerator { + enum BoundaryType { + case initial, encapsulated, final + } + + static func randomBoundary() -> String { + let first = UInt32.random(in: UInt32.min...UInt32.max) + let second = UInt32.random(in: UInt32.min...UInt32.max) + + return String(format: "alamofire.boundary.%08x%08x", first, second) + } + + static func boundaryData(forBoundaryType boundaryType: BoundaryType, boundary: String) -> Data { + let boundaryText: String + + switch boundaryType { + case .initial: + boundaryText = "--\(boundary)\(EncodingCharacters.crlf)" + case .encapsulated: + boundaryText = "\(EncodingCharacters.crlf)--\(boundary)\(EncodingCharacters.crlf)" + case .final: + boundaryText = "\(EncodingCharacters.crlf)--\(boundary)--\(EncodingCharacters.crlf)" + } + + return Data(boundaryText.utf8) + } + } + + class BodyPart { + let headers: HTTPHeaders + let bodyStream: InputStream + let bodyContentLength: UInt64 + var hasInitialBoundary = false + var hasFinalBoundary = false + + init(headers: HTTPHeaders, bodyStream: InputStream, bodyContentLength: UInt64) { + self.headers = headers + self.bodyStream = bodyStream + self.bodyContentLength = bodyContentLength + } + } + + // MARK: - Properties + + /// Default memory threshold used when encoding `MultipartFormData`, in bytes. + public static let encodingMemoryThreshold: UInt64 = 10_000_000 + + /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`. + open lazy var contentType: String = "multipart/form-data; boundary=\(self.boundary)" + + /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries. + public var contentLength: UInt64 { bodyParts.reduce(0) { $0 + $1.bodyContentLength } } + + /// The boundary used to separate the body parts in the encoded form data. + public let boundary: String + + let fileManager: FileManager + + private var bodyParts: [BodyPart] + private var bodyPartError: AFError? + private let streamBufferSize: Int + + // MARK: - Lifecycle + + /// Creates an instance. + /// + /// - Parameters: + /// - fileManager: `FileManager` to use for file operations, if needed. + /// - boundary: Boundary `String` used to separate body parts. + public init(fileManager: FileManager = .default, boundary: String? = nil) { + self.fileManager = fileManager + self.boundary = boundary ?? BoundaryGenerator.randomBoundary() + bodyParts = [] + + // + // The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more + // information, please refer to the following article: + // - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html + // + streamBufferSize = 1024 + } + + // MARK: - Body Parts + + /// Creates a body part from the data and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + /// - `Content-Type: #{mimeType}` (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// - Parameters: + /// - data: `Data` to encoding into the instance. + /// - name: Name to associate with the `Data` in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the `Data` in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the data in the `Content-Type` HTTP header. + public func append(_ data: Data, withName name: String, fileName: String? = nil, mimeType: String? = nil) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + let stream = InputStream(data: data) + let length = UInt64(data.count) + + append(stream, withLength: length, headers: headers) + } + + /// Creates a body part from the file and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header) + /// - `Content-Type: #{generated mimeType}` (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// The filename in the `Content-Disposition` HTTP header is generated from the last path component of the + /// `fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the + /// system associated MIME type. + /// + /// - Parameters: + /// - fileURL: `URL` of the file whose content will be encoded into the instance. + /// - name: Name to associate with the file content in the `Content-Disposition` HTTP header. + public func append(_ fileURL: URL, withName name: String) { + let fileName = fileURL.lastPathComponent + let pathExtension = fileURL.pathExtension + + if !fileName.isEmpty && !pathExtension.isEmpty { + let mime = mimeType(forPathExtension: pathExtension) + append(fileURL, withName: name, fileName: fileName, mimeType: mime) + } else { + setBodyPartError(withReason: .bodyPartFilenameInvalid(in: fileURL)) + } + } + + /// Creates a body part from the file and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header) + /// - Content-Type: #{mimeType} (HTTP Header) + /// - Encoded file data + /// - Multipart form boundary + /// + /// - Parameters: + /// - fileURL: `URL` of the file whose content will be encoded into the instance. + /// - name: Name to associate with the file content in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the file content in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the file content in the `Content-Type` HTTP header. + public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + + //============================================================ + // Check 1 - is file URL? + //============================================================ + + guard fileURL.isFileURL else { + setBodyPartError(withReason: .bodyPartURLInvalid(url: fileURL)) + return + } + + //============================================================ + // Check 2 - is file URL reachable? + //============================================================ + + #if !(os(Linux) || os(Windows) || os(Android)) + do { + let isReachable = try fileURL.checkPromisedItemIsReachable() + guard isReachable else { + setBodyPartError(withReason: .bodyPartFileNotReachable(at: fileURL)) + return + } + } catch { + setBodyPartError(withReason: .bodyPartFileNotReachableWithError(atURL: fileURL, error: error)) + return + } + #endif + + //============================================================ + // Check 3 - is file URL a directory? + //============================================================ + + var isDirectory: ObjCBool = false + let path = fileURL.path + + guard fileManager.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else { + setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL)) + return + } + + //============================================================ + // Check 4 - can the file size be extracted? + //============================================================ + + let bodyContentLength: UInt64 + + do { + guard let fileSize = try fileManager.attributesOfItem(atPath: path)[.size] as? NSNumber else { + setBodyPartError(withReason: .bodyPartFileSizeNotAvailable(at: fileURL)) + return + } + + bodyContentLength = fileSize.uint64Value + } catch { + setBodyPartError(withReason: .bodyPartFileSizeQueryFailedWithError(forURL: fileURL, error: error)) + return + } + + //============================================================ + // Check 5 - can a stream be created from file URL? + //============================================================ + + guard let stream = InputStream(url: fileURL) else { + setBodyPartError(withReason: .bodyPartInputStreamCreationFailed(for: fileURL)) + return + } + + append(stream, withLength: bodyContentLength, headers: headers) + } + + /// Creates a body part from the stream and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header) + /// - `Content-Type: #{mimeType}` (HTTP Header) + /// - Encoded stream data + /// - Multipart form boundary + /// + /// - Parameters: + /// - stream: `InputStream` to encode into the instance. + /// - length: Length, in bytes, of the stream. + /// - name: Name to associate with the stream content in the `Content-Disposition` HTTP header. + /// - fileName: Filename to associate with the stream content in the `Content-Disposition` HTTP header. + /// - mimeType: MIME type to associate with the stream content in the `Content-Type` HTTP header. + public func append(_ stream: InputStream, + withLength length: UInt64, + name: String, + fileName: String, + mimeType: String) { + let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType) + append(stream, withLength: length, headers: headers) + } + + /// Creates a body part with the stream, length, and headers and appends it to the instance. + /// + /// The body part data will be encoded using the following format: + /// + /// - HTTP headers + /// - Encoded stream data + /// - Multipart form boundary + /// + /// - Parameters: + /// - stream: `InputStream` to encode into the instance. + /// - length: Length, in bytes, of the stream. + /// - headers: `HTTPHeaders` for the body part. + public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders) { + let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length) + bodyParts.append(bodyPart) + } + + // MARK: - Data Encoding + + /// Encodes all appended body parts into a single `Data` value. + /// + /// - Note: This method will load all the appended body parts into memory all at the same time. This method should + /// only be used when the encoded data will have a small memory footprint. For large data cases, please use + /// the `writeEncodedData(to:))` method. + /// + /// - Returns: The encoded `Data`, if encoding is successful. + /// - Throws: An `AFError` if encoding encounters an error. + public func encode() throws -> Data { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + var encoded = Data() + + bodyParts.first?.hasInitialBoundary = true + bodyParts.last?.hasFinalBoundary = true + + for bodyPart in bodyParts { + let encodedData = try encode(bodyPart) + encoded.append(encodedData) + } + + return encoded + } + + /// Writes all appended body parts to the given file `URL`. + /// + /// This process is facilitated by reading and writing with input and output streams, respectively. Thus, + /// this approach is very memory efficient and should be used for large body part data. + /// + /// - Parameter fileURL: File `URL` to which to write the form data. + /// - Throws: An `AFError` if encoding encounters an error. + public func writeEncodedData(to fileURL: URL) throws { + if let bodyPartError = bodyPartError { + throw bodyPartError + } + + if fileManager.fileExists(atPath: fileURL.path) { + throw AFError.multipartEncodingFailed(reason: .outputStreamFileAlreadyExists(at: fileURL)) + } else if !fileURL.isFileURL { + throw AFError.multipartEncodingFailed(reason: .outputStreamURLInvalid(url: fileURL)) + } + + guard let outputStream = OutputStream(url: fileURL, append: false) else { + throw AFError.multipartEncodingFailed(reason: .outputStreamCreationFailed(for: fileURL)) + } + + outputStream.open() + defer { outputStream.close() } + + bodyParts.first?.hasInitialBoundary = true + bodyParts.last?.hasFinalBoundary = true + + for bodyPart in bodyParts { + try write(bodyPart, to: outputStream) + } + } + + // MARK: - Private - Body Part Encoding + + private func encode(_ bodyPart: BodyPart) throws -> Data { + var encoded = Data() + + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + encoded.append(initialData) + + let headerData = encodeHeaders(for: bodyPart) + encoded.append(headerData) + + let bodyStreamData = try encodeBodyStream(for: bodyPart) + encoded.append(bodyStreamData) + + if bodyPart.hasFinalBoundary { + encoded.append(finalBoundaryData()) + } + + return encoded + } + + private func encodeHeaders(for bodyPart: BodyPart) -> Data { + let headerText = bodyPart.headers.map { "\($0.name): \($0.value)\(EncodingCharacters.crlf)" } + .joined() + + EncodingCharacters.crlf + + return Data(headerText.utf8) + } + + private func encodeBodyStream(for bodyPart: BodyPart) throws -> Data { + let inputStream = bodyPart.bodyStream + inputStream.open() + defer { inputStream.close() } + + var encoded = Data() + + while inputStream.hasBytesAvailable { + var buffer = [UInt8](repeating: 0, count: streamBufferSize) + let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize) + + if let error = inputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error)) + } + + if bytesRead > 0 { + encoded.append(buffer, count: bytesRead) + } else { + break + } + } + + guard UInt64(encoded.count) == bodyPart.bodyContentLength else { + let error = AFError.UnexpectedInputStreamLength(bytesExpected: bodyPart.bodyContentLength, + bytesRead: UInt64(encoded.count)) + throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error)) + } + + return encoded + } + + // MARK: - Private - Writing Body Part to Output Stream + + private func write(_ bodyPart: BodyPart, to outputStream: OutputStream) throws { + try writeInitialBoundaryData(for: bodyPart, to: outputStream) + try writeHeaderData(for: bodyPart, to: outputStream) + try writeBodyStream(for: bodyPart, to: outputStream) + try writeFinalBoundaryData(for: bodyPart, to: outputStream) + } + + private func writeInitialBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData() + return try write(initialData, to: outputStream) + } + + private func writeHeaderData(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let headerData = encodeHeaders(for: bodyPart) + return try write(headerData, to: outputStream) + } + + private func writeBodyStream(for bodyPart: BodyPart, to outputStream: OutputStream) throws { + let inputStream = bodyPart.bodyStream + + inputStream.open() + defer { inputStream.close() } + + var bytesLeftToRead = bodyPart.bodyContentLength + while inputStream.hasBytesAvailable && bytesLeftToRead > 0 { + let bufferSize = min(streamBufferSize, Int(bytesLeftToRead)) + var buffer = [UInt8](repeating: 0, count: bufferSize) + let bytesRead = inputStream.read(&buffer, maxLength: bufferSize) + + if let streamError = inputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: streamError)) + } + + if bytesRead > 0 { + if buffer.count != bytesRead { + buffer = Array(buffer[0.. 0, outputStream.hasSpaceAvailable { + let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite) + + if let error = outputStream.streamError { + throw AFError.multipartEncodingFailed(reason: .outputStreamWriteFailed(error: error)) + } + + bytesToWrite -= bytesWritten + + if bytesToWrite > 0 { + buffer = Array(buffer[bytesWritten.. HTTPHeaders { + var disposition = "form-data; name=\"\(name)\"" + if let fileName = fileName { disposition += "; filename=\"\(fileName)\"" } + + var headers: HTTPHeaders = [.contentDisposition(disposition)] + if let mimeType = mimeType { headers.add(.contentType(mimeType)) } + + return headers + } + + // MARK: - Private - Boundary Encoding + + private func initialBoundaryData() -> Data { + BoundaryGenerator.boundaryData(forBoundaryType: .initial, boundary: boundary) + } + + private func encapsulatedBoundaryData() -> Data { + BoundaryGenerator.boundaryData(forBoundaryType: .encapsulated, boundary: boundary) + } + + private func finalBoundaryData() -> Data { + BoundaryGenerator.boundaryData(forBoundaryType: .final, boundary: boundary) + } + + // MARK: - Private - Errors + + private func setBodyPartError(withReason reason: AFError.MultipartEncodingFailureReason) { + guard bodyPartError == nil else { return } + bodyPartError = AFError.multipartEncodingFailed(reason: reason) + } +} + +#if canImport(UniformTypeIdentifiers) +import UniformTypeIdentifiers + +extension MultipartFormData { + // MARK: - Private - Mime Type + + private func mimeType(forPathExtension pathExtension: String) -> String { + #if swift(>=5.9) + if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, visionOS 1, *) { + return UTType(filenameExtension: pathExtension)?.preferredMIMEType ?? "application/octet-stream" + } else { + if + let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(), + let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() { + return contentType as String + } + + return "application/octet-stream" + } + #else + if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, *) { + return UTType(filenameExtension: pathExtension)?.preferredMIMEType ?? "application/octet-stream" + } else { + if + let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(), + let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() { + return contentType as String + } + + return "application/octet-stream" + } + #endif + } +} + +#else + +extension MultipartFormData { + // MARK: - Private - Mime Type + + private func mimeType(forPathExtension pathExtension: String) -> String { + #if canImport(CoreServices) || canImport(MobileCoreServices) + if + let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(), + let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue() { + return contentType as String + } + #endif + + return "application/octet-stream" + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/MultipartUpload.swift b/Carthage/Checkouts/Alamofire/Source/MultipartUpload.swift new file mode 100644 index 00000000..ae905bda --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/MultipartUpload.swift @@ -0,0 +1,89 @@ +// +// MultipartUpload.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Internal type which encapsulates a `MultipartFormData` upload. +final class MultipartUpload { + lazy var result = Result { try build() } + + private let multipartFormData: Protected + + let encodingMemoryThreshold: UInt64 + let request: URLRequestConvertible + let fileManager: FileManager + + init(encodingMemoryThreshold: UInt64, + request: URLRequestConvertible, + multipartFormData: MultipartFormData) { + self.encodingMemoryThreshold = encodingMemoryThreshold + self.request = request + fileManager = multipartFormData.fileManager + self.multipartFormData = Protected(multipartFormData) + } + + func build() throws -> UploadRequest.Uploadable { + let uploadable: UploadRequest.Uploadable + if multipartFormData.contentLength < encodingMemoryThreshold { + let data = try multipartFormData.read { try $0.encode() } + + uploadable = .data(data) + } else { + let tempDirectoryURL = fileManager.temporaryDirectory + let directoryURL = tempDirectoryURL.appendingPathComponent("org.alamofire.manager/multipart.form.data") + let fileName = UUID().uuidString + let fileURL = directoryURL.appendingPathComponent(fileName) + + try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil) + + do { + try multipartFormData.read { try $0.writeEncodedData(to: fileURL) } + } catch { + // Cleanup after attempted write if it fails. + try? fileManager.removeItem(at: fileURL) + throw error + } + + uploadable = .file(fileURL, shouldRemove: true) + } + + return uploadable + } +} + +extension MultipartUpload: UploadConvertible { + func asURLRequest() throws -> URLRequest { + var urlRequest = try request.asURLRequest() + + multipartFormData.read { multipartFormData in + urlRequest.headers.add(.contentType(multipartFormData.contentType)) + } + + return urlRequest + } + + func createUploadable() throws -> UploadRequest.Uploadable { + try result.get() + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/NetworkReachabilityManager.swift b/Carthage/Checkouts/Alamofire/Source/NetworkReachabilityManager.swift new file mode 100644 index 00000000..650fdf91 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/NetworkReachabilityManager.swift @@ -0,0 +1,292 @@ +// +// NetworkReachabilityManager.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if canImport(SystemConfiguration) + +import Foundation +import SystemConfiguration + +/// The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both cellular and +/// WiFi network interfaces. +/// +/// Reachability can be used to determine background information about why a network operation failed, or to retry +/// network requests when a connection is established. It should not be used to prevent a user from initiating a network +/// request, as it's possible that an initial request may be required to establish reachability. +open class NetworkReachabilityManager { + /// Defines the various states of network reachability. + public enum NetworkReachabilityStatus { + /// It is unknown whether the network is reachable. + case unknown + /// The network is not reachable. + case notReachable + /// The network is reachable on the associated `ConnectionType`. + case reachable(ConnectionType) + + init(_ flags: SCNetworkReachabilityFlags) { + guard flags.isActuallyReachable else { self = .notReachable; return } + + var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi) + + if flags.isCellular { networkStatus = .reachable(.cellular) } + + self = networkStatus + } + + /// Defines the various connection types detected by reachability flags. + public enum ConnectionType { + /// The connection type is either over Ethernet or WiFi. + case ethernetOrWiFi + /// The connection type is a cellular connection. + case cellular + } + } + + /// A closure executed when the network reachability status changes. The closure takes a single argument: the + /// network reachability status. + public typealias Listener = (NetworkReachabilityStatus) -> Void + + /// Default `NetworkReachabilityManager` for the zero address and a `listenerQueue` of `.main`. + public static let `default` = NetworkReachabilityManager() + + // MARK: - Properties + + /// Whether the network is currently reachable. + open var isReachable: Bool { isReachableOnCellular || isReachableOnEthernetOrWiFi } + + /// Whether the network is currently reachable over the cellular interface. + /// + /// - Note: Using this property to decide whether to make a high or low bandwidth request is not recommended. + /// Instead, set the `allowsCellularAccess` on any `URLRequest`s being issued. + /// + open var isReachableOnCellular: Bool { status == .reachable(.cellular) } + + /// Whether the network is currently reachable over Ethernet or WiFi interface. + open var isReachableOnEthernetOrWiFi: Bool { status == .reachable(.ethernetOrWiFi) } + + /// `DispatchQueue` on which reachability will update. + public let reachabilityQueue = DispatchQueue(label: "org.alamofire.reachabilityQueue") + + /// Flags of the current reachability type, if any. + open var flags: SCNetworkReachabilityFlags? { + var flags = SCNetworkReachabilityFlags() + + return SCNetworkReachabilityGetFlags(reachability, &flags) ? flags : nil + } + + /// The current network reachability status. + open var status: NetworkReachabilityStatus { + flags.map(NetworkReachabilityStatus.init) ?? .unknown + } + + /// Mutable state storage. + struct MutableState { + /// A closure executed when the network reachability status changes. + var listener: Listener? + /// `DispatchQueue` on which listeners will be called. + var listenerQueue: DispatchQueue? + /// Previously calculated status. + var previousStatus: NetworkReachabilityStatus? + } + + /// `SCNetworkReachability` instance providing notifications. + private let reachability: SCNetworkReachability + + /// Protected storage for mutable state. + private let mutableState = Protected(MutableState()) + + // MARK: - Initialization + + /// Creates an instance with the specified host. + /// + /// - Note: The `host` value must *not* contain a scheme, just the hostname. + /// + /// - Parameters: + /// - host: Host used to evaluate network reachability. Must *not* include the scheme (e.g. `https`). + public convenience init?(host: String) { + guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil } + + self.init(reachability: reachability) + } + + /// Creates an instance that monitors the address 0.0.0.0. + /// + /// Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing + /// status of the device, both IPv4 and IPv6. + public convenience init?() { + var zero = sockaddr() + zero.sa_len = UInt8(MemoryLayout.size) + zero.sa_family = sa_family_t(AF_INET) + + guard let reachability = SCNetworkReachabilityCreateWithAddress(nil, &zero) else { return nil } + + self.init(reachability: reachability) + } + + private init(reachability: SCNetworkReachability) { + self.reachability = reachability + } + + deinit { + stopListening() + } + + // MARK: - Listening + + /// Starts listening for changes in network reachability status. + /// + /// - Note: Stops and removes any existing listener. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which to call the `listener` closure. `.main` by default. + /// - listener: `Listener` closure called when reachability changes. + /// + /// - Returns: `true` if listening was started successfully, `false` otherwise. + @discardableResult + open func startListening(onQueue queue: DispatchQueue = .main, + onUpdatePerforming listener: @escaping Listener) -> Bool { + stopListening() + + mutableState.write { state in + state.listenerQueue = queue + state.listener = listener + } + + let weakManager = WeakManager(manager: self) + + var context = SCNetworkReachabilityContext( + version: 0, + info: Unmanaged.passUnretained(weakManager).toOpaque(), + retain: { info in + let unmanaged = Unmanaged.fromOpaque(info) + _ = unmanaged.retain() + + return UnsafeRawPointer(unmanaged.toOpaque()) + }, + release: { info in + let unmanaged = Unmanaged.fromOpaque(info) + unmanaged.release() + }, + copyDescription: { info in + let unmanaged = Unmanaged.fromOpaque(info) + let weakManager = unmanaged.takeUnretainedValue() + let description = weakManager.manager?.flags?.readableDescription ?? "nil" + + return Unmanaged.passRetained(description as CFString) + } + ) + let callback: SCNetworkReachabilityCallBack = { _, flags, info in + guard let info = info else { return } + + let weakManager = Unmanaged.fromOpaque(info).takeUnretainedValue() + weakManager.manager?.notifyListener(flags) + } + + let queueAdded = SCNetworkReachabilitySetDispatchQueue(reachability, reachabilityQueue) + let callbackAdded = SCNetworkReachabilitySetCallback(reachability, callback, &context) + + // Manually call listener to give initial state, since the framework may not. + if let currentFlags = flags { + reachabilityQueue.async { + self.notifyListener(currentFlags) + } + } + + return callbackAdded && queueAdded + } + + /// Stops listening for changes in network reachability status. + open func stopListening() { + SCNetworkReachabilitySetCallback(reachability, nil, nil) + SCNetworkReachabilitySetDispatchQueue(reachability, nil) + mutableState.write { state in + state.listener = nil + state.listenerQueue = nil + state.previousStatus = nil + } + } + + // MARK: - Internal - Listener Notification + + /// Calls the `listener` closure of the `listenerQueue` if the computed status hasn't changed. + /// + /// - Note: Should only be called from the `reachabilityQueue`. + /// + /// - Parameter flags: `SCNetworkReachabilityFlags` to use to calculate the status. + func notifyListener(_ flags: SCNetworkReachabilityFlags) { + let newStatus = NetworkReachabilityStatus(flags) + + mutableState.write { state in + guard state.previousStatus != newStatus else { return } + + state.previousStatus = newStatus + + let listener = state.listener + state.listenerQueue?.async { listener?(newStatus) } + } + } + + private final class WeakManager { + weak var manager: NetworkReachabilityManager? + + init(manager: NetworkReachabilityManager?) { + self.manager = manager + } + } +} + +// MARK: - + +extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {} + +extension SCNetworkReachabilityFlags { + var isReachable: Bool { contains(.reachable) } + var isConnectionRequired: Bool { contains(.connectionRequired) } + var canConnectAutomatically: Bool { contains(.connectionOnDemand) || contains(.connectionOnTraffic) } + var canConnectWithoutUserInteraction: Bool { canConnectAutomatically && !contains(.interventionRequired) } + var isActuallyReachable: Bool { isReachable && (!isConnectionRequired || canConnectWithoutUserInteraction) } + var isCellular: Bool { + #if os(iOS) || os(tvOS) || (swift(>=5.9) && os(visionOS)) + return contains(.isWWAN) + #else + return false + #endif + } + + /// Human readable `String` for all states, to help with debugging. + var readableDescription: String { + let W = isCellular ? "W" : "-" + let R = isReachable ? "R" : "-" + let c = isConnectionRequired ? "c" : "-" + let t = contains(.transientConnection) ? "t" : "-" + let i = contains(.interventionRequired) ? "i" : "-" + let C = contains(.connectionOnTraffic) ? "C" : "-" + let D = contains(.connectionOnDemand) ? "D" : "-" + let l = contains(.isLocalAddress) ? "l" : "-" + let d = contains(.isDirect) ? "d" : "-" + let a = contains(.connectionAutomatic) ? "a" : "-" + + return "\(W)\(R) \(c)\(t)\(i)\(C)\(D)\(l)\(d)\(a)" + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/Notifications.swift b/Carthage/Checkouts/Alamofire/Source/Notifications.swift new file mode 100644 index 00000000..66434b6e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Notifications.swift @@ -0,0 +1,115 @@ +// +// Notifications.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Request { + /// Posted when a `Request` is resumed. The `Notification` contains the resumed `Request`. + public static let didResumeNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResume") + /// Posted when a `Request` is suspended. The `Notification` contains the suspended `Request`. + public static let didSuspendNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspend") + /// Posted when a `Request` is cancelled. The `Notification` contains the cancelled `Request`. + public static let didCancelNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancel") + /// Posted when a `Request` is finished. The `Notification` contains the completed `Request`. + public static let didFinishNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didFinish") + + /// Posted when a `URLSessionTask` is resumed. The `Notification` contains the `Request` associated with the `URLSessionTask`. + public static let didResumeTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResumeTask") + /// Posted when a `URLSessionTask` is suspended. The `Notification` contains the `Request` associated with the `URLSessionTask`. + public static let didSuspendTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspendTask") + /// Posted when a `URLSessionTask` is cancelled. The `Notification` contains the `Request` associated with the `URLSessionTask`. + public static let didCancelTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancelTask") + /// Posted when a `URLSessionTask` is completed. The `Notification` contains the `Request` associated with the `URLSessionTask`. + public static let didCompleteTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCompleteTask") +} + +// MARK: - + +extension Notification { + /// The `Request` contained by the instance's `userInfo`, `nil` otherwise. + public var request: Request? { + userInfo?[String.requestKey] as? Request + } + + /// Convenience initializer for a `Notification` containing a `Request` payload. + /// + /// - Parameters: + /// - name: The name of the notification. + /// - request: The `Request` payload. + init(name: Notification.Name, request: Request) { + self.init(name: name, object: nil, userInfo: [String.requestKey: request]) + } +} + +extension NotificationCenter { + /// Convenience function for posting notifications with `Request` payloads. + /// + /// - Parameters: + /// - name: The name of the notification. + /// - request: The `Request` payload. + func postNotification(named name: Notification.Name, with request: Request) { + let notification = Notification(name: name, request: request) + post(notification) + } +} + +extension String { + /// User info dictionary key representing the `Request` associated with the notification. + fileprivate static let requestKey = "org.alamofire.notification.key.request" +} + +/// `EventMonitor` that provides Alamofire's notifications. +public final class AlamofireNotifications: EventMonitor { + public func requestDidResume(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didResumeNotification, with: request) + } + + public func requestDidSuspend(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didSuspendNotification, with: request) + } + + public func requestDidCancel(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didCancelNotification, with: request) + } + + public func requestDidFinish(_ request: Request) { + NotificationCenter.default.postNotification(named: Request.didFinishNotification, with: request) + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didResumeTaskNotification, with: request) + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didSuspendTaskNotification, with: request) + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + NotificationCenter.default.postNotification(named: Request.didCancelTaskNotification, with: request) + } + + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) { + NotificationCenter.default.postNotification(named: Request.didCompleteTaskNotification, with: request) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/OperationQueue+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/OperationQueue+Alamofire.swift new file mode 100644 index 00000000..b06a0ccc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/OperationQueue+Alamofire.swift @@ -0,0 +1,49 @@ +// +// OperationQueue+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension OperationQueue { + /// Creates an instance using the provided parameters. + /// + /// - Parameters: + /// - qualityOfService: `QualityOfService` to be applied to the queue. `.default` by default. + /// - maxConcurrentOperationCount: Maximum concurrent operations. + /// `OperationQueue.defaultMaxConcurrentOperationCount` by default. + /// - underlyingQueue: Underlying `DispatchQueue`. `nil` by default. + /// - name: Name for the queue. `nil` by default. + /// - startSuspended: Whether the queue starts suspended. `false` by default. + convenience init(qualityOfService: QualityOfService = .default, + maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount, + underlyingQueue: DispatchQueue? = nil, + name: String? = nil, + startSuspended: Bool = false) { + self.init() + self.qualityOfService = qualityOfService + self.maxConcurrentOperationCount = maxConcurrentOperationCount + self.underlyingQueue = underlyingQueue + self.name = name + isSuspended = startSuspended + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/ParameterEncoder.swift b/Carthage/Checkouts/Alamofire/Source/ParameterEncoder.swift new file mode 100644 index 00000000..89169785 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/ParameterEncoder.swift @@ -0,0 +1,213 @@ +// +// ParameterEncoder.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A type that can encode any `Encodable` type into a `URLRequest`. +public protocol ParameterEncoder { + /// Encode the provided `Encodable` parameters into `request`. + /// + /// - Parameters: + /// - parameters: The `Encodable` parameter value. + /// - request: The `URLRequest` into which to encode the parameters. + /// + /// - Returns: A `URLRequest` with the result of the encoding. + /// - Throws: An `Error` when encoding fails. For Alamofire provided encoders, this will be an instance of + /// `AFError.parameterEncoderFailed` with an associated `ParameterEncoderFailureReason`. + func encode(_ parameters: Parameters?, into request: URLRequest) throws -> URLRequest +} + +/// A `ParameterEncoder` that encodes types as JSON body data. +/// +/// If no `Content-Type` header is already set on the provided `URLRequest`s, it's set to `application/json`. +open class JSONParameterEncoder: ParameterEncoder { + /// Returns an encoder with default parameters. + public static var `default`: JSONParameterEncoder { JSONParameterEncoder() } + + /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.prettyPrinted`. + public static var prettyPrinted: JSONParameterEncoder { + let encoder = JSONEncoder() + encoder.outputFormatting = .prettyPrinted + + return JSONParameterEncoder(encoder: encoder) + } + + /// Returns an encoder with `JSONEncoder.outputFormatting` set to `.sortedKeys`. + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + public static var sortedKeys: JSONParameterEncoder { + let encoder = JSONEncoder() + encoder.outputFormatting = .sortedKeys + + return JSONParameterEncoder(encoder: encoder) + } + + /// `JSONEncoder` used to encode parameters. + public let encoder: JSONEncoder + + /// Creates an instance with the provided `JSONEncoder`. + /// + /// - Parameter encoder: The `JSONEncoder`. `JSONEncoder()` by default. + public init(encoder: JSONEncoder = JSONEncoder()) { + self.encoder = encoder + } + + open func encode(_ parameters: Parameters?, + into request: URLRequest) throws -> URLRequest { + guard let parameters = parameters else { return request } + + var request = request + + do { + let data = try encoder.encode(parameters) + request.httpBody = data + if request.headers["Content-Type"] == nil { + request.headers.update(.contentType("application/json")) + } + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return request + } +} + +extension ParameterEncoder where Self == JSONParameterEncoder { + /// Provides a default `JSONParameterEncoder` instance. + public static var json: JSONParameterEncoder { JSONParameterEncoder() } + + /// Creates a `JSONParameterEncoder` using the provided `JSONEncoder`. + /// + /// - Parameter encoder: `JSONEncoder` used to encode parameters. `JSONEncoder()` by default. + /// - Returns: The `JSONParameterEncoder`. + public static func json(encoder: JSONEncoder = JSONEncoder()) -> JSONParameterEncoder { + JSONParameterEncoder(encoder: encoder) + } +} + +/// A `ParameterEncoder` that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +/// on the `Destination` set. +/// +/// If no `Content-Type` header is already set on the provided `URLRequest`s, it will be set to +/// `application/x-www-form-urlencoded; charset=utf-8`. +/// +/// Encoding behavior can be customized by passing an instance of `URLEncodedFormEncoder` to the initializer. +open class URLEncodedFormParameterEncoder: ParameterEncoder { + /// Defines where the URL-encoded string should be set for each `URLRequest`. + public enum Destination { + /// Applies the encoded query string to any existing query string for `.get`, `.head`, and `.delete` request. + /// Sets it to the `httpBody` for all other methods. + case methodDependent + /// Applies the encoded query string to any existing query string from the `URLRequest`. + case queryString + /// Applies the encoded query string to the `httpBody` of the `URLRequest`. + case httpBody + + /// Determines whether the URL-encoded string should be applied to the `URLRequest`'s `url`. + /// + /// - Parameter method: The `HTTPMethod`. + /// + /// - Returns: Whether the URL-encoded string should be applied to a `URL`. + func encodesParametersInURL(for method: HTTPMethod) -> Bool { + switch self { + case .methodDependent: return [.get, .head, .delete].contains(method) + case .queryString: return true + case .httpBody: return false + } + } + } + + /// Returns an encoder with default parameters. + public static var `default`: URLEncodedFormParameterEncoder { URLEncodedFormParameterEncoder() } + + /// The `URLEncodedFormEncoder` to use. + public let encoder: URLEncodedFormEncoder + + /// The `Destination` for the URL-encoded string. + public let destination: Destination + + /// Creates an instance with the provided `URLEncodedFormEncoder` instance and `Destination` value. + /// + /// - Parameters: + /// - encoder: The `URLEncodedFormEncoder`. `URLEncodedFormEncoder()` by default. + /// - destination: The `Destination`. `.methodDependent` by default. + public init(encoder: URLEncodedFormEncoder = URLEncodedFormEncoder(), destination: Destination = .methodDependent) { + self.encoder = encoder + self.destination = destination + } + + open func encode(_ parameters: Parameters?, + into request: URLRequest) throws -> URLRequest { + guard let parameters = parameters else { return request } + + var request = request + + guard let url = request.url else { + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url)) + } + + guard let method = request.method else { + let rawValue = request.method?.rawValue ?? "nil" + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.httpMethod(rawValue: rawValue))) + } + + if destination.encodesParametersInURL(for: method), + var components = URLComponents(url: url, resolvingAgainstBaseURL: false) { + let query: String = try Result { try encoder.encode(parameters) } + .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get() + let newQueryString = [components.percentEncodedQuery, query].compactMap { $0 }.joinedWithAmpersands() + components.percentEncodedQuery = newQueryString.isEmpty ? nil : newQueryString + + guard let newURL = components.url else { + throw AFError.parameterEncoderFailed(reason: .missingRequiredComponent(.url)) + } + + request.url = newURL + } else { + if request.headers["Content-Type"] == nil { + request.headers.update(.contentType("application/x-www-form-urlencoded; charset=utf-8")) + } + + request.httpBody = try Result { try encoder.encode(parameters) } + .mapError { AFError.parameterEncoderFailed(reason: .encoderFailed(error: $0)) }.get() + } + + return request + } +} + +extension ParameterEncoder where Self == URLEncodedFormParameterEncoder { + /// Provides a default `URLEncodedFormParameterEncoder` instance. + public static var urlEncodedForm: URLEncodedFormParameterEncoder { URLEncodedFormParameterEncoder() } + + /// Creates a `URLEncodedFormParameterEncoder` with the provided encoder and destination. + /// + /// - Parameters: + /// - encoder: `URLEncodedFormEncoder` used to encode the parameters. `URLEncodedFormEncoder()` by default. + /// - destination: `Destination` to which to encode the parameters. `.methodDependent` by default. + /// - Returns: The `URLEncodedFormParameterEncoder`. + public static func urlEncodedForm(encoder: URLEncodedFormEncoder = URLEncodedFormEncoder(), + destination: URLEncodedFormParameterEncoder.Destination = .methodDependent) -> URLEncodedFormParameterEncoder { + URLEncodedFormParameterEncoder(encoder: encoder, destination: destination) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/ParameterEncoding.swift b/Carthage/Checkouts/Alamofire/Source/ParameterEncoding.swift new file mode 100644 index 00000000..ea612565 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/ParameterEncoding.swift @@ -0,0 +1,346 @@ +// +// ParameterEncoding.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A dictionary of parameters to apply to a `URLRequest`. +public typealias Parameters = [String: Any] + +/// A type used to define how a set of parameters are applied to a `URLRequest`. +public protocol ParameterEncoding { + /// Creates a `URLRequest` by encoding parameters and applying them on the passed request. + /// + /// - Parameters: + /// - urlRequest: `URLRequestConvertible` value onto which parameters will be encoded. + /// - parameters: `Parameters` to encode onto the request. + /// + /// - Returns: The encoded `URLRequest`. + /// - Throws: Any `Error` produced during parameter encoding. + func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest +} + +// MARK: - + +/// Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +/// body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +/// the HTTP body depends on the destination of the encoding. +/// +/// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to +/// `application/x-www-form-urlencoded; charset=utf-8`. +/// +/// There is no published specification for how to encode collection types. By default the convention of appending +/// `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for +/// nested dictionary values (`foo[bar]=baz`) is used. Optionally, `ArrayEncoding` can be used to omit the +/// square brackets appended to array keys. +/// +/// `BoolEncoding` can be used to configure how boolean values are encoded. The default behavior is to encode +/// `true` as 1 and `false` as 0. +public struct URLEncoding: ParameterEncoding { + // MARK: Helper Types + + /// Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the + /// resulting URL request. + public enum Destination { + /// Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and + /// sets as the HTTP body for requests with any other HTTP method. + case methodDependent + /// Sets or appends encoded query string result to existing query string. + case queryString + /// Sets encoded query string result as the HTTP body of the URL request. + case httpBody + + func encodesParametersInURL(for method: HTTPMethod) -> Bool { + switch self { + case .methodDependent: return [.get, .head, .delete].contains(method) + case .queryString: return true + case .httpBody: return false + } + } + } + + /// Configures how `Array` parameters are encoded. + public enum ArrayEncoding { + /// An empty set of square brackets is appended to the key for every value. This is the default behavior. + case brackets + /// No brackets are appended. The key is encoded as is. + case noBrackets + /// Brackets containing the item index are appended. This matches the jQuery and Node.js behavior. + case indexInBrackets + /// Provide a custom array key encoding with the given closure. + case custom((_ key: String, _ index: Int) -> String) + + func encode(key: String, atIndex index: Int) -> String { + switch self { + case .brackets: + return "\(key)[]" + case .noBrackets: + return key + case .indexInBrackets: + return "\(key)[\(index)]" + case let .custom(encoding): + return encoding(key, index) + } + } + } + + /// Configures how `Bool` parameters are encoded. + public enum BoolEncoding { + /// Encode `true` as `1` and `false` as `0`. This is the default behavior. + case numeric + /// Encode `true` and `false` as string literals. + case literal + + func encode(value: Bool) -> String { + switch self { + case .numeric: + return value ? "1" : "0" + case .literal: + return value ? "true" : "false" + } + } + } + + // MARK: Properties + + /// Returns a default `URLEncoding` instance with a `.methodDependent` destination. + public static var `default`: URLEncoding { URLEncoding() } + + /// Returns a `URLEncoding` instance with a `.queryString` destination. + public static var queryString: URLEncoding { URLEncoding(destination: .queryString) } + + /// Returns a `URLEncoding` instance with an `.httpBody` destination. + public static var httpBody: URLEncoding { URLEncoding(destination: .httpBody) } + + /// The destination defining where the encoded query string is to be applied to the URL request. + public let destination: Destination + + /// The encoding to use for `Array` parameters. + public let arrayEncoding: ArrayEncoding + + /// The encoding to use for `Bool` parameters. + public let boolEncoding: BoolEncoding + + // MARK: Initialization + + /// Creates an instance using the specified parameters. + /// + /// - Parameters: + /// - destination: `Destination` defining where the encoded query string will be applied. `.methodDependent` by + /// default. + /// - arrayEncoding: `ArrayEncoding` to use. `.brackets` by default. + /// - boolEncoding: `BoolEncoding` to use. `.numeric` by default. + public init(destination: Destination = .methodDependent, + arrayEncoding: ArrayEncoding = .brackets, + boolEncoding: BoolEncoding = .numeric) { + self.destination = destination + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding + } + + // MARK: Encoding + + public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let parameters = parameters else { return urlRequest } + + if let method = urlRequest.method, destination.encodesParametersInURL(for: method) { + guard let url = urlRequest.url else { + throw AFError.parameterEncodingFailed(reason: .missingURL) + } + + if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty { + let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + "&" } ?? "") + query(parameters) + urlComponents.percentEncodedQuery = percentEncodedQuery + urlRequest.url = urlComponents.url + } + } else { + if urlRequest.headers["Content-Type"] == nil { + urlRequest.headers.update(.contentType("application/x-www-form-urlencoded; charset=utf-8")) + } + + urlRequest.httpBody = Data(query(parameters).utf8) + } + + return urlRequest + } + + /// Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively. + /// + /// - Parameters: + /// - key: Key of the query component. + /// - value: Value of the query component. + /// + /// - Returns: The percent-escaped, URL encoded query string components. + public func queryComponents(fromKey key: String, value: Any) -> [(String, String)] { + var components: [(String, String)] = [] + switch value { + case let dictionary as [String: Any]: + for (nestedKey, value) in dictionary { + components += queryComponents(fromKey: "\(key)[\(nestedKey)]", value: value) + } + case let array as [Any]: + for (index, value) in array.enumerated() { + components += queryComponents(fromKey: arrayEncoding.encode(key: key, atIndex: index), value: value) + } + case let number as NSNumber: + if number.isBool { + components.append((escape(key), escape(boolEncoding.encode(value: number.boolValue)))) + } else { + components.append((escape(key), escape("\(number)"))) + } + case let bool as Bool: + components.append((escape(key), escape(boolEncoding.encode(value: bool)))) + default: + components.append((escape(key), escape("\(value)"))) + } + return components + } + + /// Creates a percent-escaped string following RFC 3986 for a query string key or value. + /// + /// - Parameter string: `String` to be percent-escaped. + /// + /// - Returns: The percent-escaped `String`. + public func escape(_ string: String) -> String { + string.addingPercentEncoding(withAllowedCharacters: .afURLQueryAllowed) ?? string + } + + private func query(_ parameters: [String: Any]) -> String { + var components: [(String, String)] = [] + + for key in parameters.keys.sorted(by: <) { + let value = parameters[key]! + components += queryComponents(fromKey: key, value: value) + } + return components.map { "\($0)=\($1)" }.joined(separator: "&") + } +} + +// MARK: - + +/// Uses `JSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the +/// request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`. +public struct JSONEncoding: ParameterEncoding { + public enum Error: Swift.Error { + case invalidJSONObject + } + + // MARK: Properties + + /// Returns a `JSONEncoding` instance with default writing options. + public static var `default`: JSONEncoding { JSONEncoding() } + + /// Returns a `JSONEncoding` instance with `.prettyPrinted` writing options. + public static var prettyPrinted: JSONEncoding { JSONEncoding(options: .prettyPrinted) } + + /// The options for writing the parameters as JSON data. + public let options: JSONSerialization.WritingOptions + + // MARK: Initialization + + /// Creates an instance using the specified `WritingOptions`. + /// + /// - Parameter options: `JSONSerialization.WritingOptions` to use. + public init(options: JSONSerialization.WritingOptions = []) { + self.options = options + } + + // MARK: Encoding + + public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let parameters = parameters else { return urlRequest } + + guard JSONSerialization.isValidJSONObject(parameters) else { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: Error.invalidJSONObject)) + } + + do { + let data = try JSONSerialization.data(withJSONObject: parameters, options: options) + + if urlRequest.headers["Content-Type"] == nil { + urlRequest.headers.update(.contentType("application/json")) + } + + urlRequest.httpBody = data + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return urlRequest + } + + /// Encodes any JSON compatible object into a `URLRequest`. + /// + /// - Parameters: + /// - urlRequest: `URLRequestConvertible` value into which the object will be encoded. + /// - jsonObject: `Any` value (must be JSON compatible` to be encoded into the `URLRequest`. `nil` by default. + /// + /// - Returns: The encoded `URLRequest`. + /// - Throws: Any `Error` produced during encoding. + public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest { + var urlRequest = try urlRequest.asURLRequest() + + guard let jsonObject = jsonObject else { return urlRequest } + + guard JSONSerialization.isValidJSONObject(jsonObject) else { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: Error.invalidJSONObject)) + } + + do { + let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options) + + if urlRequest.headers["Content-Type"] == nil { + urlRequest.headers.update(.contentType("application/json")) + } + + urlRequest.httpBody = data + } catch { + throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error)) + } + + return urlRequest + } +} + +extension JSONEncoding.Error { + public var localizedDescription: String { + """ + Invalid JSON object provided for parameter or object encoding. \ + This is most likely due to a value which can't be represented in Objective-C. + """ + } +} + +// MARK: - + +extension NSNumber { + fileprivate var isBool: Bool { + // Use Obj-C type encoding to check whether the underlying type is a `Bool`, as it's guaranteed as part of + // swift-corelibs-foundation, per [this discussion on the Swift forums](https://forums.swift.org/t/alamofire-on-linux-possible-but-not-release-ready/34553/22). + String(cString: objCType) == "c" + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Protected.swift b/Carthage/Checkouts/Alamofire/Source/Protected.swift new file mode 100644 index 00000000..67560454 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Protected.swift @@ -0,0 +1,168 @@ +// +// Protected.swift +// +// Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +private protocol Lock { + func lock() + func unlock() +} + +extension Lock { + /// Executes a closure returning a value while acquiring the lock. + /// + /// - Parameter closure: The closure to run. + /// + /// - Returns: The value the closure generated. + func around(_ closure: () throws -> T) rethrows -> T { + lock(); defer { unlock() } + return try closure() + } + + /// Execute a closure while acquiring the lock. + /// + /// - Parameter closure: The closure to run. + func around(_ closure: () throws -> Void) rethrows { + lock(); defer { unlock() } + try closure() + } +} + +#if canImport(Darwin) +/// An `os_unfair_lock` wrapper. +final class UnfairLock: Lock { + private let unfairLock: os_unfair_lock_t + + init() { + unfairLock = .allocate(capacity: 1) + unfairLock.initialize(to: os_unfair_lock()) + } + + deinit { + unfairLock.deinitialize(count: 1) + unfairLock.deallocate() + } + + fileprivate func lock() { + os_unfair_lock_lock(unfairLock) + } + + fileprivate func unlock() { + os_unfair_lock_unlock(unfairLock) + } +} + +#elseif canImport(Foundation) +extension NSLock: Lock {} +#else +#error("This platform needs a Lock-conforming type without Foundation.") +#endif + +/// A thread-safe wrapper around a value. +@dynamicMemberLookup +final class Protected { + #if canImport(Darwin) + private let lock = UnfairLock() + #elseif canImport(Foundation) + private let lock = NSLock() + #else + #error("This platform needs a Lock-conforming type without Foundation.") + #endif + private var value: Value + + init(_ value: Value) { + self.value = value + } + + /// Synchronously read or transform the contained value. + /// + /// - Parameter closure: The closure to execute. + /// + /// - Returns: The return value of the closure passed. + func read(_ closure: (Value) throws -> U) rethrows -> U { + try lock.around { try closure(self.value) } + } + + /// Synchronously modify the protected value. + /// + /// - Parameter closure: The closure to execute. + /// + /// - Returns: The modified value. + @discardableResult + func write(_ closure: (inout Value) throws -> U) rethrows -> U { + try lock.around { try closure(&self.value) } + } + + /// Synchronously update the protected value. + /// + /// - Parameter value: The `Value`. + func write(_ value: Value) { + write { $0 = value } + } + + subscript(dynamicMember keyPath: WritableKeyPath) -> Property { + get { lock.around { value[keyPath: keyPath] } } + set { lock.around { value[keyPath: keyPath] = newValue } } + } + + subscript(dynamicMember keyPath: KeyPath) -> Property { + lock.around { value[keyPath: keyPath] } + } +} + +extension Protected where Value == Request.MutableState { + /// Attempts to transition to the passed `State`. + /// + /// - Parameter state: The `State` to attempt transition to. + /// + /// - Returns: Whether the transition occurred. + func attemptToTransitionTo(_ state: Request.State) -> Bool { + lock.around { + guard value.state.canTransitionTo(state) else { return false } + + value.state = state + + return true + } + } + + /// Perform a closure while locked with the provided `Request.State`. + /// + /// - Parameter perform: The closure to perform while locked. + func withState(perform: (Request.State) -> Void) { + lock.around { perform(value.state) } + } +} + +extension Protected: Equatable where Value: Equatable { + static func ==(lhs: Protected, rhs: Protected) -> Bool { + lhs.read { left in rhs.read { right in left == right }} + } +} + +extension Protected: Hashable where Value: Hashable { + func hash(into hasher: inout Hasher) { + read { hasher.combine($0) } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/RedirectHandler.swift b/Carthage/Checkouts/Alamofire/Source/RedirectHandler.swift new file mode 100644 index 00000000..cf88abf5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/RedirectHandler.swift @@ -0,0 +1,111 @@ +// +// RedirectHandler.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A type that handles how an HTTP redirect response from a remote server should be redirected to the new request. +public protocol RedirectHandler { + /// Determines how the HTTP redirect response should be redirected to the new request. + /// + /// The `completion` closure should be passed one of three possible options: + /// + /// 1. The new request specified by the redirect (this is the most common use case). + /// 2. A modified version of the new request (you may want to route it somewhere else). + /// 3. A `nil` value to deny the redirect request and return the body of the redirect response. + /// + /// - Parameters: + /// - task: The `URLSessionTask` whose request resulted in a redirect. + /// - request: The `URLRequest` to the new location specified by the redirect response. + /// - response: The `HTTPURLResponse` containing the server's response to the original request. + /// - completion: The closure to execute containing the new `URLRequest`, a modified `URLRequest`, or `nil`. + func task(_ task: URLSessionTask, + willBeRedirectedTo request: URLRequest, + for response: HTTPURLResponse, + completion: @escaping (URLRequest?) -> Void) +} + +// MARK: - + +/// `Redirector` is a convenience `RedirectHandler` making it easy to follow, not follow, or modify a redirect. +public struct Redirector { + /// Defines the behavior of the `Redirector` type. + public enum Behavior { + /// Follow the redirect as defined in the response. + case follow + /// Do not follow the redirect defined in the response. + case doNotFollow + /// Modify the redirect request defined in the response. + case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) + } + + /// Returns a `Redirector` with a `.follow` `Behavior`. + public static let follow = Redirector(behavior: .follow) + /// Returns a `Redirector` with a `.doNotFollow` `Behavior`. + public static let doNotFollow = Redirector(behavior: .doNotFollow) + + /// The `Behavior` of the `Redirector`. + public let behavior: Behavior + + /// Creates a `Redirector` instance from the `Behavior`. + /// + /// - Parameter behavior: The `Behavior`. + public init(behavior: Behavior) { + self.behavior = behavior + } +} + +// MARK: - + +extension Redirector: RedirectHandler { + public func task(_ task: URLSessionTask, + willBeRedirectedTo request: URLRequest, + for response: HTTPURLResponse, + completion: @escaping (URLRequest?) -> Void) { + switch behavior { + case .follow: + completion(request) + case .doNotFollow: + completion(nil) + case let .modify(closure): + let request = closure(task, request, response) + completion(request) + } + } +} + +extension RedirectHandler where Self == Redirector { + /// Provides a `Redirector` which follows redirects. Equivalent to `Redirector.follow`. + public static var follow: Redirector { .follow } + + /// Provides a `Redirector` which does not follow redirects. Equivalent to `Redirector.doNotFollow`. + public static var doNotFollow: Redirector { .doNotFollow } + + /// Creates a `Redirector` which modifies the redirected `URLRequest` using the provided closure. + /// + /// - Parameter closure: Closure used to modify the redirect. + /// - Returns: The `Redirector`. + public static func modify(using closure: @escaping (URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) -> Redirector { + Redirector(behavior: .modify(closure)) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Request.swift b/Carthage/Checkouts/Alamofire/Source/Request.swift new file mode 100644 index 00000000..55f2a67c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Request.swift @@ -0,0 +1,2066 @@ +// +// Request.swift +// +// Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// `Request` is the common superclass of all Alamofire request types and provides common state, delegate, and callback +/// handling. +public class Request { + /// State of the `Request`, with managed transitions between states set when calling `resume()`, `suspend()`, or + /// `cancel()` on the `Request`. + public enum State { + /// Initial state of the `Request`. + case initialized + /// `State` set when `resume()` is called. Any tasks created for the `Request` will have `resume()` called on + /// them in this state. + case resumed + /// `State` set when `suspend()` is called. Any tasks created for the `Request` will have `suspend()` called on + /// them in this state. + case suspended + /// `State` set when `cancel()` is called. Any tasks created for the `Request` will have `cancel()` called on + /// them. Unlike `resumed` or `suspended`, once in the `cancelled` state, the `Request` can no longer transition + /// to any other state. + case cancelled + /// `State` set when all response serialization completion closures have been cleared on the `Request` and + /// enqueued on their respective queues. + case finished + + /// Determines whether `self` can be transitioned to the provided `State`. + func canTransitionTo(_ state: State) -> Bool { + switch (self, state) { + case (.initialized, _): + return true + case (_, .initialized), (.cancelled, _), (.finished, _): + return false + case (.resumed, .cancelled), (.suspended, .cancelled), (.resumed, .suspended), (.suspended, .resumed): + return true + case (.suspended, .suspended), (.resumed, .resumed): + return false + case (_, .finished): + return true + } + } + } + + // MARK: - Initial State + + /// `UUID` providing a unique identifier for the `Request`, used in the `Hashable` and `Equatable` conformances. + public let id: UUID + /// The serial queue for all internal async actions. + public let underlyingQueue: DispatchQueue + /// The queue used for all serialization actions. By default it's a serial queue that targets `underlyingQueue`. + public let serializationQueue: DispatchQueue + /// `EventMonitor` used for event callbacks. + public let eventMonitor: EventMonitor? + /// The `Request`'s interceptor. + public let interceptor: RequestInterceptor? + /// The `Request`'s delegate. + public private(set) weak var delegate: RequestDelegate? + + // MARK: - Mutable State + + /// Type encapsulating all mutable state that may need to be accessed from anything other than the `underlyingQueue`. + struct MutableState { + /// State of the `Request`. + var state: State = .initialized + /// `ProgressHandler` and `DispatchQueue` provided for upload progress callbacks. + var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? + /// `ProgressHandler` and `DispatchQueue` provided for download progress callbacks. + var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? + /// `RedirectHandler` provided for to handle request redirection. + var redirectHandler: RedirectHandler? + /// `CachedResponseHandler` provided to handle response caching. + var cachedResponseHandler: CachedResponseHandler? + /// Queue and closure called when the `Request` is able to create a cURL description of itself. + var cURLHandler: (queue: DispatchQueue, handler: (String) -> Void)? + /// Queue and closure called when the `Request` creates a `URLRequest`. + var urlRequestHandler: (queue: DispatchQueue, handler: (URLRequest) -> Void)? + /// Queue and closure called when the `Request` creates a `URLSessionTask`. + var urlSessionTaskHandler: (queue: DispatchQueue, handler: (URLSessionTask) -> Void)? + /// Response serialization closures that handle response parsing. + var responseSerializers: [() -> Void] = [] + /// Response serialization completion closures executed once all response serializers are complete. + var responseSerializerCompletions: [() -> Void] = [] + /// Whether response serializer processing is finished. + var responseSerializerProcessingFinished = false + /// `URLCredential` used for authentication challenges. + var credential: URLCredential? + /// All `URLRequest`s created by Alamofire on behalf of the `Request`. + var requests: [URLRequest] = [] + /// All `URLSessionTask`s created by Alamofire on behalf of the `Request`. + var tasks: [URLSessionTask] = [] + /// All `URLSessionTaskMetrics` values gathered by Alamofire on behalf of the `Request`. Should correspond + /// exactly the the `tasks` created. + var metrics: [URLSessionTaskMetrics] = [] + /// Number of times any retriers provided retried the `Request`. + var retryCount = 0 + /// Final `AFError` for the `Request`, whether from various internal Alamofire calls or as a result of a `task`. + var error: AFError? + /// Whether the instance has had `finish()` called and is running the serializers. Should be replaced with a + /// representation in the state machine in the future. + var isFinishing = false + /// Actions to run when requests are finished. Use for concurrency support. + var finishHandlers: [() -> Void] = [] + } + + /// Protected `MutableState` value that provides thread-safe access to state values. + fileprivate let mutableState = Protected(MutableState()) + + /// `State` of the `Request`. + public var state: State { mutableState.state } + /// Returns whether `state` is `.initialized`. + public var isInitialized: Bool { state == .initialized } + /// Returns whether `state is `.resumed`. + public var isResumed: Bool { state == .resumed } + /// Returns whether `state` is `.suspended`. + public var isSuspended: Bool { state == .suspended } + /// Returns whether `state` is `.cancelled`. + public var isCancelled: Bool { state == .cancelled } + /// Returns whether `state` is `.finished`. + public var isFinished: Bool { state == .finished } + + // MARK: Progress + + /// Closure type executed when monitoring the upload or download progress of a request. + public typealias ProgressHandler = (Progress) -> Void + + /// `Progress` of the upload of the body of the executed `URLRequest`. Reset to `0` if the `Request` is retried. + public let uploadProgress = Progress(totalUnitCount: 0) + /// `Progress` of the download of any response data. Reset to `0` if the `Request` is retried. + public let downloadProgress = Progress(totalUnitCount: 0) + /// `ProgressHandler` called when `uploadProgress` is updated, on the provided `DispatchQueue`. + private var uploadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? { + get { mutableState.uploadProgressHandler } + set { mutableState.uploadProgressHandler = newValue } + } + + /// `ProgressHandler` called when `downloadProgress` is updated, on the provided `DispatchQueue`. + fileprivate var downloadProgressHandler: (handler: ProgressHandler, queue: DispatchQueue)? { + get { mutableState.downloadProgressHandler } + set { mutableState.downloadProgressHandler = newValue } + } + + // MARK: Redirect Handling + + /// `RedirectHandler` set on the instance. + public private(set) var redirectHandler: RedirectHandler? { + get { mutableState.redirectHandler } + set { mutableState.redirectHandler = newValue } + } + + // MARK: Cached Response Handling + + /// `CachedResponseHandler` set on the instance. + public private(set) var cachedResponseHandler: CachedResponseHandler? { + get { mutableState.cachedResponseHandler } + set { mutableState.cachedResponseHandler = newValue } + } + + // MARK: URLCredential + + /// `URLCredential` used for authentication challenges. Created by calling one of the `authenticate` methods. + public private(set) var credential: URLCredential? { + get { mutableState.credential } + set { mutableState.credential = newValue } + } + + // MARK: Validators + + /// `Validator` callback closures that store the validation calls enqueued. + fileprivate let validators = Protected<[() -> Void]>([]) + + // MARK: URLRequests + + /// All `URLRequests` created on behalf of the `Request`, including original and adapted requests. + public var requests: [URLRequest] { mutableState.requests } + /// First `URLRequest` created on behalf of the `Request`. May not be the first one actually executed. + public var firstRequest: URLRequest? { requests.first } + /// Last `URLRequest` created on behalf of the `Request`. + public var lastRequest: URLRequest? { requests.last } + /// Current `URLRequest` created on behalf of the `Request`. + public var request: URLRequest? { lastRequest } + + /// `URLRequest`s from all of the `URLSessionTask`s executed on behalf of the `Request`. May be different from + /// `requests` due to `URLSession` manipulation. + public var performedRequests: [URLRequest] { mutableState.read { $0.tasks.compactMap(\.currentRequest) } } + + // MARK: HTTPURLResponse + + /// `HTTPURLResponse` received from the server, if any. If the `Request` was retried, this is the response of the + /// last `URLSessionTask`. + public var response: HTTPURLResponse? { lastTask?.response as? HTTPURLResponse } + + // MARK: Tasks + + /// All `URLSessionTask`s created on behalf of the `Request`. + public var tasks: [URLSessionTask] { mutableState.tasks } + /// First `URLSessionTask` created on behalf of the `Request`. + public var firstTask: URLSessionTask? { tasks.first } + /// Last `URLSessionTask` created on behalf of the `Request`. + public var lastTask: URLSessionTask? { tasks.last } + /// Current `URLSessionTask` created on behalf of the `Request`. + public var task: URLSessionTask? { lastTask } + + // MARK: Metrics + + /// All `URLSessionTaskMetrics` gathered on behalf of the `Request`. Should correspond to the `tasks` created. + public var allMetrics: [URLSessionTaskMetrics] { mutableState.metrics } + /// First `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var firstMetrics: URLSessionTaskMetrics? { allMetrics.first } + /// Last `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var lastMetrics: URLSessionTaskMetrics? { allMetrics.last } + /// Current `URLSessionTaskMetrics` gathered on behalf of the `Request`. + public var metrics: URLSessionTaskMetrics? { lastMetrics } + + // MARK: Retry Count + + /// Number of times the `Request` has been retried. + public var retryCount: Int { mutableState.retryCount } + + // MARK: Error + + /// `Error` returned from Alamofire internally, from the network request directly, or any validators executed. + public fileprivate(set) var error: AFError? { + get { mutableState.error } + set { mutableState.error = newValue } + } + + /// Default initializer for the `Request` superclass. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate) { + self.id = id + self.underlyingQueue = underlyingQueue + self.serializationQueue = serializationQueue + self.eventMonitor = eventMonitor + self.interceptor = interceptor + self.delegate = delegate + } + + // MARK: - Internal Event API + + // All API must be called from underlyingQueue. + + /// Called when an initial `URLRequest` has been created on behalf of the instance. If a `RequestAdapter` is active, + /// the `URLRequest` will be adapted before being issued. + /// + /// - Parameter request: The `URLRequest` created. + func didCreateInitialURLRequest(_ request: URLRequest) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { $0.requests.append(request) } + + eventMonitor?.request(self, didCreateInitialURLRequest: request) + } + + /// Called when initial `URLRequest` creation has failed, typically through a `URLRequestConvertible`. + /// + /// - Note: Triggers retry. + /// + /// - Parameter error: `AFError` thrown from the failed creation. + func didFailToCreateURLRequest(with error: AFError) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + self.error = error + + eventMonitor?.request(self, didFailToCreateURLRequestWithError: error) + + callCURLHandlerIfNecessary() + + retryOrFinish(error: error) + } + + /// Called when a `RequestAdapter` has successfully adapted a `URLRequest`. + /// + /// - Parameters: + /// - initialRequest: The `URLRequest` that was adapted. + /// - adaptedRequest: The `URLRequest` returned by the `RequestAdapter`. + func didAdaptInitialRequest(_ initialRequest: URLRequest, to adaptedRequest: URLRequest) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { $0.requests.append(adaptedRequest) } + + eventMonitor?.request(self, didAdaptInitialRequest: initialRequest, to: adaptedRequest) + } + + /// Called when a `RequestAdapter` fails to adapt a `URLRequest`. + /// + /// - Note: Triggers retry. + /// + /// - Parameters: + /// - request: The `URLRequest` the adapter was called with. + /// - error: The `AFError` returned by the `RequestAdapter`. + func didFailToAdaptURLRequest(_ request: URLRequest, withError error: AFError) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + self.error = error + + eventMonitor?.request(self, didFailToAdaptURLRequest: request, withError: error) + + callCURLHandlerIfNecessary() + + retryOrFinish(error: error) + } + + /// Final `URLRequest` has been created for the instance. + /// + /// - Parameter request: The `URLRequest` created. + func didCreateURLRequest(_ request: URLRequest) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.read { state in + state.urlRequestHandler?.queue.async { state.urlRequestHandler?.handler(request) } + } + + eventMonitor?.request(self, didCreateURLRequest: request) + + callCURLHandlerIfNecessary() + } + + /// Asynchronously calls any stored `cURLHandler` and then removes it from `mutableState`. + private func callCURLHandlerIfNecessary() { + mutableState.write { mutableState in + guard let cURLHandler = mutableState.cURLHandler else { return } + + cURLHandler.queue.async { cURLHandler.handler(self.cURLDescription()) } + + mutableState.cURLHandler = nil + } + } + + /// Called when a `URLSessionTask` is created on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` created. + func didCreateTask(_ task: URLSessionTask) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { state in + state.tasks.append(task) + + guard let urlSessionTaskHandler = state.urlSessionTaskHandler else { return } + + urlSessionTaskHandler.queue.async { urlSessionTaskHandler.handler(task) } + } + + eventMonitor?.request(self, didCreateTask: task) + } + + /// Called when resumption is completed. + func didResume() { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + eventMonitor?.requestDidResume(self) + } + + /// Called when a `URLSessionTask` is resumed on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` resumed. + func didResumeTask(_ task: URLSessionTask) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + eventMonitor?.request(self, didResumeTask: task) + } + + /// Called when suspension is completed. + func didSuspend() { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + eventMonitor?.requestDidSuspend(self) + } + + /// Called when a `URLSessionTask` is suspended on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` suspended. + func didSuspendTask(_ task: URLSessionTask) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + eventMonitor?.request(self, didSuspendTask: task) + } + + /// Called when cancellation is completed, sets `error` to `AFError.explicitlyCancelled`. + func didCancel() { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { mutableState in + mutableState.error = mutableState.error ?? AFError.explicitlyCancelled + } + + eventMonitor?.requestDidCancel(self) + } + + /// Called when a `URLSessionTask` is cancelled on behalf of the instance. + /// + /// - Parameter task: The `URLSessionTask` cancelled. + func didCancelTask(_ task: URLSessionTask) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + eventMonitor?.request(self, didCancelTask: task) + } + + /// Called when a `URLSessionTaskMetrics` value is gathered on behalf of the instance. + /// + /// - Parameter metrics: The `URLSessionTaskMetrics` gathered. + func didGatherMetrics(_ metrics: URLSessionTaskMetrics) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { $0.metrics.append(metrics) } + + eventMonitor?.request(self, didGatherMetrics: metrics) + } + + /// Called when a `URLSessionTask` fails before it is finished, typically during certificate pinning. + /// + /// - Parameters: + /// - task: The `URLSessionTask` which failed. + /// - error: The early failure `AFError`. + func didFailTask(_ task: URLSessionTask, earlyWithError error: AFError) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + self.error = error + + // Task will still complete, so didCompleteTask(_:with:) will handle retry. + eventMonitor?.request(self, didFailTask: task, earlyWithError: error) + } + + /// Called when a `URLSessionTask` completes. All tasks will eventually call this method. + /// + /// - Note: Response validation is synchronously triggered in this step. + /// + /// - Parameters: + /// - task: The `URLSessionTask` which completed. + /// - error: The `AFError` `task` may have completed with. If `error` has already been set on the instance, this + /// value is ignored. + func didCompleteTask(_ task: URLSessionTask, with error: AFError?) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + self.error = self.error ?? error + + let validators = validators.read { $0 } + validators.forEach { $0() } + + eventMonitor?.request(self, didCompleteTask: task, with: error) + + retryOrFinish(error: self.error) + } + + /// Called when the `RequestDelegate` is going to retry this `Request`. Calls `reset()`. + func prepareForRetry() { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + mutableState.write { $0.retryCount += 1 } + + reset() + + eventMonitor?.requestIsRetrying(self) + } + + /// Called to determine whether retry will be triggered for the particular error, or whether the instance should + /// call `finish()`. + /// + /// - Parameter error: The possible `AFError` which may trigger retry. + func retryOrFinish(error: AFError?) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + guard !isCancelled, let error = error, let delegate = delegate else { finish(); return } + + delegate.retryResult(for: self, dueTo: error) { retryResult in + switch retryResult { + case .doNotRetry: + self.finish() + case let .doNotRetryWithError(retryError): + self.finish(error: retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + + /// Finishes this `Request` and starts the response serializers. + /// + /// - Parameter error: The possible `Error` with which the instance will finish. + func finish(error: AFError? = nil) { + dispatchPrecondition(condition: .onQueue(underlyingQueue)) + + guard !mutableState.isFinishing else { return } + + mutableState.isFinishing = true + + if let error = error { self.error = error } + + // Start response handlers + processNextResponseSerializer() + + eventMonitor?.requestDidFinish(self) + } + + /// Appends the response serialization closure to the instance. + /// + /// - Note: This method will also `resume` the instance if `delegate.startImmediately` returns `true`. + /// + /// - Parameter closure: The closure containing the response serialization call. + func appendResponseSerializer(_ closure: @escaping () -> Void) { + mutableState.write { mutableState in + mutableState.responseSerializers.append(closure) + + if mutableState.state == .finished { + mutableState.state = .resumed + } + + if mutableState.responseSerializerProcessingFinished { + underlyingQueue.async { self.processNextResponseSerializer() } + } + + if mutableState.state.canTransitionTo(.resumed) { + underlyingQueue.async { if self.delegate?.startImmediately == true { self.resume() } } + } + } + } + + /// Returns the next response serializer closure to execute if there's one left. + /// + /// - Returns: The next response serialization closure, if there is one. + func nextResponseSerializer() -> (() -> Void)? { + var responseSerializer: (() -> Void)? + + mutableState.write { mutableState in + let responseSerializerIndex = mutableState.responseSerializerCompletions.count + + if responseSerializerIndex < mutableState.responseSerializers.count { + responseSerializer = mutableState.responseSerializers[responseSerializerIndex] + } + } + + return responseSerializer + } + + /// Processes the next response serializer and calls all completions if response serialization is complete. + func processNextResponseSerializer() { + guard let responseSerializer = nextResponseSerializer() else { + // Execute all response serializer completions and clear them + var completions: [() -> Void] = [] + + mutableState.write { mutableState in + completions = mutableState.responseSerializerCompletions + + // Clear out all response serializers and response serializer completions in mutable state since the + // request is complete. It's important to do this prior to calling the completion closures in case + // the completions call back into the request triggering a re-processing of the response serializers. + // An example of how this can happen is by calling cancel inside a response completion closure. + mutableState.responseSerializers.removeAll() + mutableState.responseSerializerCompletions.removeAll() + + if mutableState.state.canTransitionTo(.finished) { + mutableState.state = .finished + } + + mutableState.responseSerializerProcessingFinished = true + mutableState.isFinishing = false + } + + completions.forEach { $0() } + + // Cleanup the request + cleanup() + + return + } + + serializationQueue.async { responseSerializer() } + } + + /// Notifies the `Request` that the response serializer is complete. + /// + /// - Parameter completion: The completion handler provided with the response serializer, called when all serializers + /// are complete. + func responseSerializerDidComplete(completion: @escaping () -> Void) { + mutableState.write { $0.responseSerializerCompletions.append(completion) } + processNextResponseSerializer() + } + + /// Resets all task and response serializer related state for retry. + func reset() { + error = nil + + uploadProgress.totalUnitCount = 0 + uploadProgress.completedUnitCount = 0 + downloadProgress.totalUnitCount = 0 + downloadProgress.completedUnitCount = 0 + + mutableState.write { state in + state.isFinishing = false + state.responseSerializerCompletions = [] + } + } + + /// Called when updating the upload progress. + /// + /// - Parameters: + /// - totalBytesSent: Total bytes sent so far. + /// - totalBytesExpectedToSend: Total bytes expected to send. + func updateUploadProgress(totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { + uploadProgress.totalUnitCount = totalBytesExpectedToSend + uploadProgress.completedUnitCount = totalBytesSent + + uploadProgressHandler?.queue.async { self.uploadProgressHandler?.handler(self.uploadProgress) } + } + + /// Perform a closure on the current `state` while locked. + /// + /// - Parameter perform: The closure to perform. + func withState(perform: (State) -> Void) { + mutableState.withState(perform: perform) + } + + // MARK: Task Creation + + /// Called when creating a `URLSessionTask` for this `Request`. Subclasses must override. + /// + /// - Parameters: + /// - request: `URLRequest` to use to create the `URLSessionTask`. + /// - session: `URLSession` which creates the `URLSessionTask`. + /// + /// - Returns: The `URLSessionTask` created. + func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + fatalError("Subclasses must override.") + } + + // MARK: - Public API + + // These APIs are callable from any queue. + + // MARK: State + + /// Cancels the instance. Once cancelled, a `Request` can no longer be resumed or suspended. + /// + /// - Returns: The instance. + @discardableResult + public func cancel() -> Self { + mutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.cancelled) else { return } + + mutableState.state = .cancelled + + underlyingQueue.async { self.didCancel() } + + guard let task = mutableState.tasks.last, task.state != .completed else { + underlyingQueue.async { self.finish() } + return + } + + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + underlyingQueue.async { self.didCancelTask(task) } + } + + return self + } + + /// Suspends the instance. + /// + /// - Returns: The instance. + @discardableResult + public func suspend() -> Self { + mutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.suspended) else { return } + + mutableState.state = .suspended + + underlyingQueue.async { self.didSuspend() } + + guard let task = mutableState.tasks.last, task.state != .completed else { return } + + task.suspend() + underlyingQueue.async { self.didSuspendTask(task) } + } + + return self + } + + /// Resumes the instance. + /// + /// - Returns: The instance. + @discardableResult + public func resume() -> Self { + mutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.resumed) else { return } + + mutableState.state = .resumed + + underlyingQueue.async { self.didResume() } + + guard let task = mutableState.tasks.last, task.state != .completed else { return } + + task.resume() + underlyingQueue.async { self.didResumeTask(task) } + } + + return self + } + + // MARK: - Closure API + + /// Associates a credential using the provided values with the instance. + /// + /// - Parameters: + /// - username: The username. + /// - password: The password. + /// - persistence: The `URLCredential.Persistence` for the created `URLCredential`. `.forSession` by default. + /// + /// - Returns: The instance. + @discardableResult + public func authenticate(username: String, password: String, persistence: URLCredential.Persistence = .forSession) -> Self { + let credential = URLCredential(user: username, password: password, persistence: persistence) + + return authenticate(with: credential) + } + + /// Associates the provided credential with the instance. + /// + /// - Parameter credential: The `URLCredential`. + /// + /// - Returns: The instance. + @discardableResult + public func authenticate(with credential: URLCredential) -> Self { + mutableState.credential = credential + + return self + } + + /// Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server. + /// + /// - Note: Only the last closure provided is used. + /// + /// - Parameters: + /// - queue: The `DispatchQueue` to execute the closure on. `.main` by default. + /// - closure: The closure to be executed periodically as data is read from the server. + /// + /// - Returns: The instance. + @discardableResult + public func downloadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self { + mutableState.downloadProgressHandler = (handler: closure, queue: queue) + + return self + } + + /// Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server. + /// + /// - Note: Only the last closure provided is used. + /// + /// - Parameters: + /// - queue: The `DispatchQueue` to execute the closure on. `.main` by default. + /// - closure: The closure to be executed periodically as data is sent to the server. + /// + /// - Returns: The instance. + @discardableResult + public func uploadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self { + mutableState.uploadProgressHandler = (handler: closure, queue: queue) + + return self + } + + // MARK: Redirects + + /// Sets the redirect handler for the instance which will be used if a redirect response is encountered. + /// + /// - Note: Attempting to set the redirect handler more than once is a logic error and will crash. + /// + /// - Parameter handler: The `RedirectHandler`. + /// + /// - Returns: The instance. + @discardableResult + public func redirect(using handler: RedirectHandler) -> Self { + mutableState.write { mutableState in + precondition(mutableState.redirectHandler == nil, "Redirect handler has already been set.") + mutableState.redirectHandler = handler + } + + return self + } + + // MARK: Cached Responses + + /// Sets the cached response handler for the `Request` which will be used when attempting to cache a response. + /// + /// - Note: Attempting to set the cache handler more than once is a logic error and will crash. + /// + /// - Parameter handler: The `CachedResponseHandler`. + /// + /// - Returns: The instance. + @discardableResult + public func cacheResponse(using handler: CachedResponseHandler) -> Self { + mutableState.write { mutableState in + precondition(mutableState.cachedResponseHandler == nil, "Cached response handler has already been set.") + mutableState.cachedResponseHandler = handler + } + + return self + } + + // MARK: - Lifetime APIs + + /// Sets a handler to be called when the cURL description of the request is available. + /// + /// - Note: When waiting for a `Request`'s `URLRequest` to be created, only the last `handler` will be called. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which `handler` will be called. + /// - handler: Closure to be called when the cURL description is available. + /// + /// - Returns: The instance. + @discardableResult + public func cURLDescription(on queue: DispatchQueue, calling handler: @escaping (String) -> Void) -> Self { + mutableState.write { mutableState in + if mutableState.requests.last != nil { + queue.async { handler(self.cURLDescription()) } + } else { + mutableState.cURLHandler = (queue, handler) + } + } + + return self + } + + /// Sets a handler to be called when the cURL description of the request is available. + /// + /// - Note: When waiting for a `Request`'s `URLRequest` to be created, only the last `handler` will be called. + /// + /// - Parameter handler: Closure to be called when the cURL description is available. Called on the instance's + /// `underlyingQueue` by default. + /// + /// - Returns: The instance. + @discardableResult + public func cURLDescription(calling handler: @escaping (String) -> Void) -> Self { + cURLDescription(on: underlyingQueue, calling: handler) + + return self + } + + /// Sets a closure to called whenever Alamofire creates a `URLRequest` for this instance. + /// + /// - Note: This closure will be called multiple times if the instance adapts incoming `URLRequest`s or is retried. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which `handler` will be called. `.main` by default. + /// - handler: Closure to be called when a `URLRequest` is available. + /// + /// - Returns: The instance. + @discardableResult + public func onURLRequestCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLRequest) -> Void) -> Self { + mutableState.write { state in + if let request = state.requests.last { + queue.async { handler(request) } + } + + state.urlRequestHandler = (queue, handler) + } + + return self + } + + /// Sets a closure to be called whenever the instance creates a `URLSessionTask`. + /// + /// - Note: This API should only be used to provide `URLSessionTask`s to existing API, like `NSFileProvider`. It + /// **SHOULD NOT** be used to interact with tasks directly, as that may be break Alamofire features. + /// Additionally, this closure may be called multiple times if the instance is retried. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which `handler` will be called. `.main` by default. + /// - handler: Closure to be called when the `URLSessionTask` is available. + /// + /// - Returns: The instance. + @discardableResult + public func onURLSessionTaskCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLSessionTask) -> Void) -> Self { + mutableState.write { state in + if let task = state.tasks.last { + queue.async { handler(task) } + } + + state.urlSessionTaskHandler = (queue, handler) + } + + return self + } + + // MARK: Cleanup + + /// Adds a `finishHandler` closure to be called when the request completes. + /// + /// - Parameter closure: Closure to be called when the request finishes. + func onFinish(perform finishHandler: @escaping () -> Void) { + guard !isFinished else { finishHandler(); return } + + mutableState.write { state in + state.finishHandlers.append(finishHandler) + } + } + + /// Final cleanup step executed when the instance finishes response serialization. + func cleanup() { + let handlers = mutableState.finishHandlers + handlers.forEach { $0() } + mutableState.write { state in + state.finishHandlers.removeAll() + } + + delegate?.cleanup(after: self) + } +} + +extension Request { + /// Type indicating how a `DataRequest` or `DataStreamRequest` should proceed after receiving an `HTTPURLResponse`. + public enum ResponseDisposition { + /// Allow the request to continue normally. + case allow + /// Cancel the request, similar to calling `cancel()`. + case cancel + + var sessionDisposition: URLSession.ResponseDisposition { + switch self { + case .allow: return .allow + case .cancel: return .cancel + } + } + } +} + +// MARK: - Protocol Conformances + +extension Request: Equatable { + public static func ==(lhs: Request, rhs: Request) -> Bool { + lhs.id == rhs.id + } +} + +extension Request: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } +} + +extension Request: CustomStringConvertible { + /// A textual representation of this instance, including the `HTTPMethod` and `URL` if the `URLRequest` has been + /// created, as well as the response status code, if a response has been received. + public var description: String { + guard let request = performedRequests.last ?? lastRequest, + let url = request.url, + let method = request.httpMethod else { return "No request created yet." } + + let requestDescription = "\(method) \(url.absoluteString)" + + return response.map { "\(requestDescription) (\($0.statusCode))" } ?? requestDescription + } +} + +extension Request { + /// cURL representation of the instance. + /// + /// - Returns: The cURL equivalent of the instance. + public func cURLDescription() -> String { + guard + let request = lastRequest, + let url = request.url, + let host = url.host, + let method = request.httpMethod else { return "$ curl command could not be created" } + + var components = ["$ curl -v"] + + components.append("-X \(method)") + + if let credentialStorage = delegate?.sessionConfiguration.urlCredentialStorage { + let protectionSpace = URLProtectionSpace(host: host, + port: url.port ?? 0, + protocol: url.scheme, + realm: host, + authenticationMethod: NSURLAuthenticationMethodHTTPBasic) + + if let credentials = credentialStorage.credentials(for: protectionSpace)?.values { + for credential in credentials { + guard let user = credential.user, let password = credential.password else { continue } + components.append("-u \(user):\(password)") + } + } else { + if let credential = credential, let user = credential.user, let password = credential.password { + components.append("-u \(user):\(password)") + } + } + } + + if let configuration = delegate?.sessionConfiguration, configuration.httpShouldSetCookies { + if + let cookieStorage = configuration.httpCookieStorage, + let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty { + let allCookies = cookies.map { "\($0.name)=\($0.value)" }.joined(separator: ";") + + components.append("-b \"\(allCookies)\"") + } + } + + var headers = HTTPHeaders() + + if let sessionHeaders = delegate?.sessionConfiguration.headers { + for header in sessionHeaders where header.name != "Cookie" { + headers[header.name] = header.value + } + } + + for header in request.headers where header.name != "Cookie" { + headers[header.name] = header.value + } + + for header in headers { + let escapedValue = header.value.replacingOccurrences(of: "\"", with: "\\\"") + components.append("-H \"\(header.name): \(escapedValue)\"") + } + + if let httpBodyData = request.httpBody { + let httpBody = String(decoding: httpBodyData, as: UTF8.self) + var escapedBody = httpBody.replacingOccurrences(of: "\\\"", with: "\\\\\"") + escapedBody = escapedBody.replacingOccurrences(of: "\"", with: "\\\"") + + components.append("-d \"\(escapedBody)\"") + } + + components.append("\"\(url.absoluteString)\"") + + return components.joined(separator: " \\\n\t") + } +} + +/// Protocol abstraction for `Request`'s communication back to the `SessionDelegate`. +public protocol RequestDelegate: AnyObject { + /// `URLSessionConfiguration` used to create the underlying `URLSessionTask`s. + var sessionConfiguration: URLSessionConfiguration { get } + + /// Determines whether the `Request` should automatically call `resume()` when adding the first response handler. + var startImmediately: Bool { get } + + /// Notifies the delegate the `Request` has reached a point where it needs cleanup. + /// + /// - Parameter request: The `Request` to cleanup after. + func cleanup(after request: Request) + + /// Asynchronously ask the delegate whether a `Request` will be retried. + /// + /// - Parameters: + /// - request: `Request` which failed. + /// - error: `Error` which produced the failure. + /// - completion: Closure taking the `RetryResult` for evaluation. + func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void) + + /// Asynchronously retry the `Request`. + /// + /// - Parameters: + /// - request: `Request` which will be retried. + /// - timeDelay: `TimeInterval` after which the retry will be triggered. + func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?) +} + +// MARK: - Subclasses + +// MARK: - DataRequest + +/// `Request` subclass which handles in-memory `Data` download using `URLSessionDataTask`. +public class DataRequest: Request { + /// `URLRequestConvertible` value used to create `URLRequest`s for this instance. + public let convertible: URLRequestConvertible + /// `Data` read from the server so far. + public var data: Data? { dataMutableState.data } + + private struct DataMutableState { + var data: Data? + var httpResponseHandler: (queue: DispatchQueue, + handler: (_ response: HTTPURLResponse, + _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void)? + } + + private let dataMutableState = Protected(DataMutableState()) + + /// Creates a `DataRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - convertible: `URLRequestConvertible` value used to create `URLRequest`s for this instance. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + convertible: URLRequestConvertible, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate) { + self.convertible = convertible + + super.init(id: id, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + override func reset() { + super.reset() + + dataMutableState.write { mutableState in + mutableState.data = nil + } + } + + /// Called when `Data` is received by this instance. + /// + /// - Note: Also calls `updateDownloadProgress`. + /// + /// - Parameter data: The `Data` received. + func didReceive(data: Data) { + dataMutableState.write { mutableState in + if mutableState.data == nil { + mutableState.data = data + } else { + mutableState.data?.append(data) + } + } + + updateDownloadProgress() + } + + func didReceiveResponse(_ response: HTTPURLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { + dataMutableState.read { dataMutableState in + guard let httpResponseHandler = dataMutableState.httpResponseHandler else { + underlyingQueue.async { completionHandler(.allow) } + return + } + + httpResponseHandler.queue.async { + httpResponseHandler.handler(response) { disposition in + if disposition == .cancel { + self.mutableState.write { mutableState in + mutableState.state = .cancelled + mutableState.error = mutableState.error ?? AFError.explicitlyCancelled + } + } + + self.underlyingQueue.async { + completionHandler(disposition.sessionDisposition) + } + } + } + } + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + let copiedRequest = request + return session.dataTask(with: copiedRequest) + } + + /// Called to update the `downloadProgress` of the instance. + func updateDownloadProgress() { + let totalBytesReceived = Int64(data?.count ?? 0) + let totalBytesExpected = task?.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown + + downloadProgress.totalUnitCount = totalBytesExpected + downloadProgress.completedUnitCount = totalBytesReceived + + downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) } + } + + /// Validates the request, using the specified closure. + /// + /// - Note: If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter validation: `Validation` closure used to validate the response. + /// + /// - Returns: The instance. + @discardableResult + public func validate(_ validation: @escaping Validation) -> Self { + let validator: () -> Void = { [unowned self] in + guard error == nil, let response = response else { return } + + let result = validation(request, response, data) + + if case let .failure(error) = result { self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) } + + eventMonitor?.request(self, + didValidateRequest: request, + response: response, + data: data, + withResult: result) + } + + validators.write { $0.append(validator) } + + return self + } + + /// Sets a closure called whenever the `DataRequest` produces an `HTTPURLResponse` and providing a completion + /// handler to return a `ResponseDisposition` value. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the closure will be called. `.main` by default. + /// - handler: Closure called when the instance produces an `HTTPURLResponse`. The `completionHandler` provided + /// MUST be called, otherwise the request will never complete. + /// + /// - Returns: The instance. + @_disfavoredOverload + @discardableResult + public func onHTTPResponse( + on queue: DispatchQueue = .main, + perform handler: @escaping (_ response: HTTPURLResponse, + _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void + ) -> Self { + dataMutableState.write { mutableState in + mutableState.httpResponseHandler = (queue, handler) + } + + return self + } + + /// Sets a closure called whenever the `DataRequest` produces an `HTTPURLResponse`. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the closure will be called. `.main` by default. + /// - handler: Closure called when the instance produces an `HTTPURLResponse`. + /// + /// - Returns: The instance. + @discardableResult + public func onHTTPResponse(on queue: DispatchQueue = .main, + perform handler: @escaping (HTTPURLResponse) -> Void) -> Self { + onHTTPResponse(on: queue) { response, completionHandler in + handler(response) + completionHandler(.allow) + } + + return self + } +} + +// MARK: - DataStreamRequest + +/// `Request` subclass which streams HTTP response `Data` through a `Handler` closure. +public final class DataStreamRequest: Request { + /// Closure type handling `DataStreamRequest.Stream` values. + public typealias Handler = (Stream) throws -> Void + + /// Type encapsulating an `Event` as it flows through the stream, as well as a `CancellationToken` which can be used + /// to stop the stream at any time. + public struct Stream { + /// Latest `Event` from the stream. + public let event: Event + /// Token used to cancel the stream. + public let token: CancellationToken + + /// Cancel the ongoing stream by canceling the underlying `DataStreamRequest`. + public func cancel() { + token.cancel() + } + } + + /// Type representing an event flowing through the stream. Contains either the `Result` of processing streamed + /// `Data` or the completion of the stream. + public enum Event { + /// Output produced every time the instance receives additional `Data`. The associated value contains the + /// `Result` of processing the incoming `Data`. + case stream(Result) + /// Output produced when the instance has completed, whether due to stream end, cancellation, or an error. + /// Associated `Completion` value contains the final state. + case complete(Completion) + } + + /// Value containing the state of a `DataStreamRequest` when the stream was completed. + public struct Completion { + /// Last `URLRequest` issued by the instance. + public let request: URLRequest? + /// Last `HTTPURLResponse` received by the instance. + public let response: HTTPURLResponse? + /// Last `URLSessionTaskMetrics` produced for the instance. + public let metrics: URLSessionTaskMetrics? + /// `AFError` produced for the instance, if any. + public let error: AFError? + } + + /// Type used to cancel an ongoing stream. + public struct CancellationToken { + weak var request: DataStreamRequest? + + init(_ request: DataStreamRequest) { + self.request = request + } + + /// Cancel the ongoing stream by canceling the underlying `DataStreamRequest`. + public func cancel() { + request?.cancel() + } + } + + /// `URLRequestConvertible` value used to create `URLRequest`s for this instance. + public let convertible: URLRequestConvertible + /// Whether or not the instance will be cancelled if stream parsing encounters an error. + public let automaticallyCancelOnStreamError: Bool + + /// Internal mutable state specific to this type. + struct StreamMutableState { + /// `OutputStream` bound to the `InputStream` produced by `asInputStream`, if it has been called. + var outputStream: OutputStream? + /// Stream closures called as `Data` is received. + var streams: [(_ data: Data) -> Void] = [] + /// Number of currently executing streams. Used to ensure completions are only fired after all streams are + /// enqueued. + var numberOfExecutingStreams = 0 + /// Completion calls enqueued while streams are still executing. + var enqueuedCompletionEvents: [() -> Void] = [] + /// Handler for any `HTTPURLResponse`s received. + var httpResponseHandler: (queue: DispatchQueue, + handler: (_ response: HTTPURLResponse, + _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void)? + } + + let streamMutableState = Protected(StreamMutableState()) + + /// Creates a `DataStreamRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` + /// by default. + /// - convertible: `URLRequestConvertible` value used to create `URLRequest`s for this + /// instance. + /// - automaticallyCancelOnStreamError: `Bool` indicating whether the instance will be cancelled when an `Error` + /// is thrown while serializing stream `Data`. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default + /// targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by + /// the `Request`. + init(id: UUID = UUID(), + convertible: URLRequestConvertible, + automaticallyCancelOnStreamError: Bool, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate) { + self.convertible = convertible + self.automaticallyCancelOnStreamError = automaticallyCancelOnStreamError + + super.init(id: id, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + let copiedRequest = request + return session.dataTask(with: copiedRequest) + } + + override func finish(error: AFError? = nil) { + streamMutableState.write { state in + state.outputStream?.close() + } + + super.finish(error: error) + } + + func didReceive(data: Data) { + streamMutableState.write { state in + #if !canImport(FoundationNetworking) // If we not using swift-corelibs-foundation. + if let stream = state.outputStream { + underlyingQueue.async { + var bytes = Array(data) + stream.write(&bytes, maxLength: bytes.count) + } + } + #endif + state.numberOfExecutingStreams += state.streams.count + let localState = state + underlyingQueue.async { localState.streams.forEach { $0(data) } } + } + } + + func didReceiveResponse(_ response: HTTPURLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { + streamMutableState.read { dataMutableState in + guard let httpResponseHandler = dataMutableState.httpResponseHandler else { + underlyingQueue.async { completionHandler(.allow) } + return + } + + httpResponseHandler.queue.async { + httpResponseHandler.handler(response) { disposition in + if disposition == .cancel { + self.mutableState.write { mutableState in + mutableState.state = .cancelled + mutableState.error = mutableState.error ?? AFError.explicitlyCancelled + } + } + + self.underlyingQueue.async { + completionHandler(disposition.sessionDisposition) + } + } + } + } + } + + /// Validates the `URLRequest` and `HTTPURLResponse` received for the instance using the provided `Validation` closure. + /// + /// - Parameter validation: `Validation` closure used to validate the request and response. + /// + /// - Returns: The `DataStreamRequest`. + @discardableResult + public func validate(_ validation: @escaping Validation) -> Self { + let validator: () -> Void = { [unowned self] in + guard error == nil, let response = response else { return } + + let result = validation(request, response) + + if case let .failure(error) = result { + self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) + } + + eventMonitor?.request(self, + didValidateRequest: request, + response: response, + withResult: result) + } + + validators.write { $0.append(validator) } + + return self + } + + #if !canImport(FoundationNetworking) // If we not using swift-corelibs-foundation. + /// Produces an `InputStream` that receives the `Data` received by the instance. + /// + /// - Note: The `InputStream` produced by this method must have `open()` called before being able to read `Data`. + /// Additionally, this method will automatically call `resume()` on the instance, regardless of whether or + /// not the creating session has `startRequestsImmediately` set to `true`. + /// + /// - Parameter bufferSize: Size, in bytes, of the buffer between the `OutputStream` and `InputStream`. + /// + /// - Returns: The `InputStream` bound to the internal `OutboundStream`. + public func asInputStream(bufferSize: Int = 1024) -> InputStream? { + defer { resume() } + + var inputStream: InputStream? + streamMutableState.write { state in + Foundation.Stream.getBoundStreams(withBufferSize: bufferSize, + inputStream: &inputStream, + outputStream: &state.outputStream) + state.outputStream?.open() + } + + return inputStream + } + #endif + + /// Sets a closure called whenever the `DataRequest` produces an `HTTPURLResponse` and providing a completion + /// handler to return a `ResponseDisposition` value. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the closure will be called. `.main` by default. + /// - handler: Closure called when the instance produces an `HTTPURLResponse`. The `completionHandler` provided + /// MUST be called, otherwise the request will never complete. + /// + /// - Returns: The instance. + @_disfavoredOverload + @discardableResult + public func onHTTPResponse( + on queue: DispatchQueue = .main, + perform handler: @escaping (_ response: HTTPURLResponse, + _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void + ) -> Self { + streamMutableState.write { mutableState in + mutableState.httpResponseHandler = (queue, handler) + } + + return self + } + + /// Sets a closure called whenever the `DataRequest` produces an `HTTPURLResponse`. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the closure will be called. `.main` by default. + /// - handler: Closure called when the instance produces an `HTTPURLResponse`. + /// + /// - Returns: The instance. + @discardableResult + public func onHTTPResponse(on queue: DispatchQueue = .main, + perform handler: @escaping (HTTPURLResponse) -> Void) -> Self { + onHTTPResponse(on: queue) { response, completionHandler in + handler(response) + completionHandler(.allow) + } + + return self + } + + func capturingError(from closure: () throws -> Void) { + do { + try closure() + } catch { + self.error = error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error))) + cancel() + } + } + + func appendStreamCompletion(on queue: DispatchQueue, + stream: @escaping Handler) { + appendResponseSerializer { + self.underlyingQueue.async { + self.responseSerializerDidComplete { + self.streamMutableState.write { state in + guard state.numberOfExecutingStreams == 0 else { + state.enqueuedCompletionEvents.append { + self.enqueueCompletion(on: queue, stream: stream) + } + + return + } + + self.enqueueCompletion(on: queue, stream: stream) + } + } + } + } + } + + func enqueueCompletion(on queue: DispatchQueue, + stream: @escaping Handler) { + queue.async { + do { + let completion = Completion(request: self.request, + response: self.response, + metrics: self.metrics, + error: self.error) + try stream(.init(event: .complete(completion), token: .init(self))) + } catch { + // Ignore error, as errors on Completion can't be handled anyway. + } + } + } +} + +extension DataStreamRequest.Stream { + /// Incoming `Result` values from `Event.stream`. + public var result: Result? { + guard case let .stream(result) = event else { return nil } + + return result + } + + /// `Success` value of the instance, if any. + public var value: Success? { + guard case let .success(value) = result else { return nil } + + return value + } + + /// `Failure` value of the instance, if any. + public var error: Failure? { + guard case let .failure(error) = result else { return nil } + + return error + } + + /// `Completion` value of the instance, if any. + public var completion: DataStreamRequest.Completion? { + guard case let .complete(completion) = event else { return nil } + + return completion + } +} + +// MARK: - DownloadRequest + +/// `Request` subclass which downloads `Data` to a file on disk using `URLSessionDownloadTask`. +public class DownloadRequest: Request { + /// A set of options to be executed prior to moving a downloaded file from the temporary `URL` to the destination + /// `URL`. + public struct Options: OptionSet { + /// Specifies that intermediate directories for the destination URL should be created. + public static let createIntermediateDirectories = Options(rawValue: 1 << 0) + /// Specifies that any previous file at the destination `URL` should be removed. + public static let removePreviousFile = Options(rawValue: 1 << 1) + + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + } + + // MARK: Destination + + /// A closure executed once a `DownloadRequest` has successfully completed in order to determine where to move the + /// temporary file written to during the download process. The closure takes two arguments: the temporary file URL + /// and the `HTTPURLResponse`, and returns two values: the file URL where the temporary file should be moved and + /// the options defining how the file should be moved. + /// + /// - Note: Downloads from a local `file://` `URL`s do not use the `Destination` closure, as those downloads do not + /// return an `HTTPURLResponse`. Instead the file is merely moved within the temporary directory. + public typealias Destination = (_ temporaryURL: URL, + _ response: HTTPURLResponse) -> (destinationURL: URL, options: Options) + + /// Creates a download file destination closure which uses the default file manager to move the temporary file to a + /// file URL in the first available directory with the specified search path directory and search path domain mask. + /// + /// - Parameters: + /// - directory: The search path directory. `.documentDirectory` by default. + /// - domain: The search path domain mask. `.userDomainMask` by default. + /// - options: `DownloadRequest.Options` used when moving the downloaded file to its destination. None by + /// default. + /// - Returns: The `Destination` closure. + public class func suggestedDownloadDestination(for directory: FileManager.SearchPathDirectory = .documentDirectory, + in domain: FileManager.SearchPathDomainMask = .userDomainMask, + options: Options = []) -> Destination { + { temporaryURL, response in + let directoryURLs = FileManager.default.urls(for: directory, in: domain) + let url = directoryURLs.first?.appendingPathComponent(response.suggestedFilename!) ?? temporaryURL + + return (url, options) + } + } + + /// Default `Destination` used by Alamofire to ensure all downloads persist. This `Destination` prepends + /// `Alamofire_` to the automatically generated download name and moves it within the temporary directory. Files + /// with this destination must be additionally moved if they should survive the system reclamation of temporary + /// space. + static let defaultDestination: Destination = { url, _ in + (defaultDestinationURL(url), []) + } + + /// Default `URL` creation closure. Creates a `URL` in the temporary directory with `Alamofire_` prepended to the + /// provided file name. + static let defaultDestinationURL: (URL) -> URL = { url in + let filename = "Alamofire_\(url.lastPathComponent)" + let destination = url.deletingLastPathComponent().appendingPathComponent(filename) + + return destination + } + + // MARK: Downloadable + + /// Type describing the source used to create the underlying `URLSessionDownloadTask`. + public enum Downloadable { + /// Download should be started from the `URLRequest` produced by the associated `URLRequestConvertible` value. + case request(URLRequestConvertible) + /// Download should be started from the associated resume `Data` value. + case resumeData(Data) + } + + // MARK: Mutable State + + /// Type containing all mutable state for `DownloadRequest` instances. + private struct DownloadRequestMutableState { + /// Possible resume `Data` produced when cancelling the instance. + var resumeData: Data? + /// `URL` to which `Data` is being downloaded. + var fileURL: URL? + } + + /// Protected mutable state specific to `DownloadRequest`. + private let mutableDownloadState = Protected(DownloadRequestMutableState()) + + /// If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download + /// using the `download(resumingWith data:)` API. + /// + /// - Note: For more information about `resumeData`, see [Apple's documentation](https://developer.apple.com/documentation/foundation/urlsessiondownloadtask/1411634-cancel). + public var resumeData: Data? { + #if !canImport(FoundationNetworking) // If we not using swift-corelibs-foundation. + return mutableDownloadState.resumeData ?? error?.downloadResumeData + #else + return mutableDownloadState.resumeData + #endif + } + + /// If the download is successful, the `URL` where the file was downloaded. + public var fileURL: URL? { mutableDownloadState.fileURL } + + // MARK: Initial State + + /// `Downloadable` value used for this instance. + public let downloadable: Downloadable + /// The `Destination` to which the downloaded file is moved. + let destination: Destination + + /// Creates a `DownloadRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - downloadable: `Downloadable` value used to create `URLSessionDownloadTasks` for the instance. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request` + /// - destination: `Destination` closure used to move the downloaded file to its final location. + init(id: UUID = UUID(), + downloadable: Downloadable, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + delegate: RequestDelegate, + destination: @escaping Destination) { + self.downloadable = downloadable + self.destination = destination + + super.init(id: id, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + override func reset() { + super.reset() + + mutableDownloadState.write { + $0.resumeData = nil + $0.fileURL = nil + } + } + + /// Called when a download has finished. + /// + /// - Parameters: + /// - task: `URLSessionTask` that finished the download. + /// - result: `Result` of the automatic move to `destination`. + func didFinishDownloading(using task: URLSessionTask, with result: Result) { + eventMonitor?.request(self, didFinishDownloadingUsing: task, with: result) + + switch result { + case let .success(url): mutableDownloadState.fileURL = url + case let .failure(error): self.error = error + } + } + + /// Updates the `downloadProgress` using the provided values. + /// + /// - Parameters: + /// - bytesWritten: Total bytes written so far. + /// - totalBytesExpectedToWrite: Total bytes expected to write. + func updateDownloadProgress(bytesWritten: Int64, totalBytesExpectedToWrite: Int64) { + downloadProgress.totalUnitCount = totalBytesExpectedToWrite + downloadProgress.completedUnitCount += bytesWritten + + downloadProgressHandler?.queue.async { self.downloadProgressHandler?.handler(self.downloadProgress) } + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + session.downloadTask(with: request) + } + + /// Creates a `URLSessionTask` from the provided resume data. + /// + /// - Parameters: + /// - data: `Data` used to resume the download. + /// - session: `URLSession` used to create the `URLSessionTask`. + /// + /// - Returns: The `URLSessionTask` created. + public func task(forResumeData data: Data, using session: URLSession) -> URLSessionTask { + session.downloadTask(withResumeData: data) + } + + /// Cancels the instance. Once cancelled, a `DownloadRequest` can no longer be resumed or suspended. + /// + /// - Note: This method will NOT produce resume data. If you wish to cancel and produce resume data, use + /// `cancel(producingResumeData:)` or `cancel(byProducingResumeData:)`. + /// + /// - Returns: The instance. + @discardableResult + override public func cancel() -> Self { + cancel(producingResumeData: false) + } + + /// Cancels the instance, optionally producing resume data. Once cancelled, a `DownloadRequest` can no longer be + /// resumed or suspended. + /// + /// - Note: If `producingResumeData` is `true`, the `resumeData` property will be populated with any resume data, if + /// available. + /// + /// - Returns: The instance. + @discardableResult + public func cancel(producingResumeData shouldProduceResumeData: Bool) -> Self { + cancel(optionallyProducingResumeData: shouldProduceResumeData ? { _ in } : nil) + } + + /// Cancels the instance while producing resume data. Once cancelled, a `DownloadRequest` can no longer be resumed + /// or suspended. + /// + /// - Note: The resume data passed to the completion handler will also be available on the instance's `resumeData` + /// property. + /// + /// - Parameter completionHandler: The completion handler that is called when the download has been successfully + /// cancelled. It is not guaranteed to be called on a particular queue, so you may + /// want use an appropriate queue to perform your work. + /// + /// - Returns: The instance. + @discardableResult + public func cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void) -> Self { + cancel(optionallyProducingResumeData: completionHandler) + } + + /// Internal implementation of cancellation that optionally takes a resume data handler. If no handler is passed, + /// cancellation is performed without producing resume data. + /// + /// - Parameter completionHandler: Optional resume data handler. + /// + /// - Returns: The instance. + private func cancel(optionallyProducingResumeData completionHandler: ((_ resumeData: Data?) -> Void)?) -> Self { + mutableState.write { mutableState in + guard mutableState.state.canTransitionTo(.cancelled) else { return } + + mutableState.state = .cancelled + + underlyingQueue.async { self.didCancel() } + + guard let task = mutableState.tasks.last as? URLSessionDownloadTask, task.state != .completed else { + underlyingQueue.async { self.finish() } + return + } + + if let completionHandler = completionHandler { + // Resume to ensure metrics are gathered. + task.resume() + task.cancel { resumeData in + self.mutableDownloadState.resumeData = resumeData + self.underlyingQueue.async { self.didCancelTask(task) } + completionHandler(resumeData) + } + } else { + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + self.underlyingQueue.async { self.didCancelTask(task) } + } + } + + return self + } + + /// Validates the request, using the specified closure. + /// + /// - Note: If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter validation: `Validation` closure to validate the response. + /// + /// - Returns: The instance. + @discardableResult + public func validate(_ validation: @escaping Validation) -> Self { + let validator: () -> Void = { [unowned self] in + guard error == nil, let response = response else { return } + + let result = validation(request, response, fileURL) + + if case let .failure(error) = result { + self.error = error.asAFError(or: .responseValidationFailed(reason: .customValidationFailed(error: error))) + } + + eventMonitor?.request(self, + didValidateRequest: request, + response: response, + fileURL: fileURL, + withResult: result) + } + + validators.write { $0.append(validator) } + + return self + } +} + +// MARK: - UploadRequest + +/// `DataRequest` subclass which handles `Data` upload from memory, file, or stream using `URLSessionUploadTask`. +public class UploadRequest: DataRequest { + /// Type describing the origin of the upload, whether `Data`, file, or stream. + public enum Uploadable { + /// Upload from the provided `Data` value. + case data(Data) + /// Upload from the provided file `URL`, as well as a `Bool` determining whether the source file should be + /// automatically removed once uploaded. + case file(URL, shouldRemove: Bool) + /// Upload from the provided `InputStream`. + case stream(InputStream) + } + + // MARK: Initial State + + /// The `UploadableConvertible` value used to produce the `Uploadable` value for this instance. + public let upload: UploadableConvertible + + /// `FileManager` used to perform cleanup tasks, including the removal of multipart form encoded payloads written + /// to disk. + public let fileManager: FileManager + + // MARK: Mutable State + + /// `Uploadable` value used by the instance. + public var uploadable: Uploadable? + + /// Creates an `UploadRequest` using the provided parameters. + /// + /// - Parameters: + /// - id: `UUID` used for the `Hashable` and `Equatable` implementations. `UUID()` by default. + /// - convertible: `UploadConvertible` value used to determine the type of upload to be performed. + /// - underlyingQueue: `DispatchQueue` on which all internal `Request` work is performed. + /// - serializationQueue: `DispatchQueue` on which all serialization work is performed. By default targets + /// `underlyingQueue`, but can be passed another queue from a `Session`. + /// - eventMonitor: `EventMonitor` called for event callbacks from internal `Request` actions. + /// - interceptor: `RequestInterceptor` used throughout the request lifecycle. + /// - fileManager: `FileManager` used to perform cleanup tasks, including the removal of multipart form + /// encoded payloads written to disk. + /// - delegate: `RequestDelegate` that provides an interface to actions not performed by the `Request`. + init(id: UUID = UUID(), + convertible: UploadConvertible, + underlyingQueue: DispatchQueue, + serializationQueue: DispatchQueue, + eventMonitor: EventMonitor?, + interceptor: RequestInterceptor?, + fileManager: FileManager, + delegate: RequestDelegate) { + upload = convertible + self.fileManager = fileManager + + super.init(id: id, + convertible: convertible, + underlyingQueue: underlyingQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: delegate) + } + + /// Called when the `Uploadable` value has been created from the `UploadConvertible`. + /// + /// - Parameter uploadable: The `Uploadable` that was created. + func didCreateUploadable(_ uploadable: Uploadable) { + self.uploadable = uploadable + + eventMonitor?.request(self, didCreateUploadable: uploadable) + } + + /// Called when the `Uploadable` value could not be created. + /// + /// - Parameter error: `AFError` produced by the failure. + func didFailToCreateUploadable(with error: AFError) { + self.error = error + + eventMonitor?.request(self, didFailToCreateUploadableWithError: error) + + retryOrFinish(error: error) + } + + override func task(for request: URLRequest, using session: URLSession) -> URLSessionTask { + guard let uploadable = uploadable else { + fatalError("Attempting to create a URLSessionUploadTask when Uploadable value doesn't exist.") + } + + switch uploadable { + case let .data(data): return session.uploadTask(with: request, from: data) + case let .file(url, _): return session.uploadTask(with: request, fromFile: url) + case .stream: return session.uploadTask(withStreamedRequest: request) + } + } + + override func reset() { + // Uploadable must be recreated on every retry. + uploadable = nil + + super.reset() + } + + /// Produces the `InputStream` from `uploadable`, if it can. + /// + /// - Note: Calling this method with a non-`.stream` `Uploadable` is a logic error and will crash. + /// + /// - Returns: The `InputStream`. + func inputStream() -> InputStream { + guard let uploadable = uploadable else { + fatalError("Attempting to access the input stream but the uploadable doesn't exist.") + } + + guard case let .stream(stream) = uploadable else { + fatalError("Attempted to access the stream of an UploadRequest that wasn't created with one.") + } + + eventMonitor?.request(self, didProvideInputStream: stream) + + return stream + } + + override public func cleanup() { + defer { super.cleanup() } + + guard + let uploadable = uploadable, + case let .file(url, shouldRemove) = uploadable, + shouldRemove + else { return } + + try? fileManager.removeItem(at: url) + } +} + +/// A type that can produce an `UploadRequest.Uploadable` value. +public protocol UploadableConvertible { + /// Produces an `UploadRequest.Uploadable` value from the instance. + /// + /// - Returns: The `UploadRequest.Uploadable`. + /// - Throws: Any `Error` produced during creation. + func createUploadable() throws -> UploadRequest.Uploadable +} + +extension UploadRequest.Uploadable: UploadableConvertible { + public func createUploadable() throws -> UploadRequest.Uploadable { + self + } +} + +/// A type that can be converted to an upload, whether from an `UploadRequest.Uploadable` or `URLRequestConvertible`. +public protocol UploadConvertible: UploadableConvertible & URLRequestConvertible {} diff --git a/Carthage/Checkouts/Alamofire/Source/RequestCompression.swift b/Carthage/Checkouts/Alamofire/Source/RequestCompression.swift new file mode 100644 index 00000000..c543e06e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/RequestCompression.swift @@ -0,0 +1,153 @@ +// +// RequestCompression.swift +// +// Copyright (c) 2023 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if canImport(zlib) +import Foundation +import zlib + +/// `RequestAdapter` which compresses outgoing `URLRequest` bodies using the `deflate` `Content-Encoding` and adds the +/// appropriate header. +/// +/// - Note: Most requests to most APIs are small and so would only be slowed down by applying this adapter. Measure the +/// size of your request bodies and the performance impact of using this adapter before use. Using this adapter +/// with already compressed data, such as images, will, at best, have no effect. Additionally, body compression +/// is a synchronous operation, so measuring the performance impact may be important to determine whether you +/// want to use a dedicated `requestQueue` in your `Session` instance. Finally, not all servers support request +/// compression, so test with all of your server configurations before deploying. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +public struct DeflateRequestCompressor: RequestInterceptor { + /// Type that determines the action taken when the `URLRequest` already has a `Content-Encoding` header. + public enum DuplicateHeaderBehavior { + /// Throws a `DuplicateHeaderError`. The default. + case error + /// Replaces the existing header value with `deflate`. + case replace + /// Silently skips compression when the header exists. + case skip + } + + /// `Error` produced when the outgoing `URLRequest` already has a `Content-Encoding` header, when the instance has + /// been configured to produce an error. + public struct DuplicateHeaderError: Error {} + + /// Behavior to use when the outgoing `URLRequest` already has a `Content-Encoding` header. + public let duplicateHeaderBehavior: DuplicateHeaderBehavior + /// Closure which determines whether the outgoing body data should be compressed. + public let shouldCompressBodyData: (_ bodyData: Data) -> Bool + + /// Creates an instance with the provided parameters. + /// + /// - Parameters: + /// - duplicateHeaderBehavior: `DuplicateHeaderBehavior` to use. `.error` by default. + /// - shouldCompressBodyData: Closure which determines whether the outgoing body data should be compressed. `true` by default. + public init(duplicateHeaderBehavior: DuplicateHeaderBehavior = .error, + shouldCompressBodyData: @escaping (_ bodyData: Data) -> Bool = { _ in true }) { + self.duplicateHeaderBehavior = duplicateHeaderBehavior + self.shouldCompressBodyData = shouldCompressBodyData + } + + public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + // No need to compress unless we have body data. No support for compressing streams. + guard let bodyData = urlRequest.httpBody else { + completion(.success(urlRequest)) + return + } + + guard shouldCompressBodyData(bodyData) else { + completion(.success(urlRequest)) + return + } + + if urlRequest.headers.value(for: "Content-Encoding") != nil { + switch duplicateHeaderBehavior { + case .error: + completion(.failure(DuplicateHeaderError())) + return + case .replace: + // Header will be replaced once the body data is compressed. + break + case .skip: + completion(.success(urlRequest)) + return + } + } + + var compressedRequest = urlRequest + + do { + compressedRequest.httpBody = try deflate(bodyData) + compressedRequest.headers.update(.contentEncoding("deflate")) + completion(.success(compressedRequest)) + } catch { + completion(.failure(error)) + } + } + + func deflate(_ data: Data) throws -> Data { + var output = Data([0x78, 0x5E]) // Header + try output.append((data as NSData).compressed(using: .zlib) as Data) + var checksum = adler32Checksum(of: data).bigEndian + output.append(Data(bytes: &checksum, count: MemoryLayout.size)) + + return output + } + + func adler32Checksum(of data: Data) -> UInt32 { + #if swift(>=5.6) + data.withUnsafeBytes { buffer in + UInt32(adler32(1, buffer.baseAddress, UInt32(buffer.count))) + } + #else + data.withUnsafeBytes { buffer in + let buffer = buffer.bindMemory(to: UInt8.self) + return UInt32(adler32(1, buffer.baseAddress, UInt32(buffer.count))) + } + #endif + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension RequestInterceptor where Self == DeflateRequestCompressor { + /// Create a `DeflateRequestCompressor` with default `duplicateHeaderBehavior` and `shouldCompressBodyData` values. + public static var deflateCompressor: DeflateRequestCompressor { + DeflateRequestCompressor() + } + + /// Creates a `DeflateRequestCompressor` with the provided `DuplicateHeaderBehavior` and `shouldCompressBodyData` + /// closure. + /// + /// - Parameters: + /// - duplicateHeaderBehavior: `DuplicateHeaderBehavior` to use. + /// - shouldCompressBodyData: Closure which determines whether the outgoing body data should be compressed. `true` by default. + /// + /// - Returns: The `DeflateRequestCompressor`. + public static func deflateCompressor( + duplicateHeaderBehavior: DeflateRequestCompressor.DuplicateHeaderBehavior = .error, + shouldCompressBodyData: @escaping (_ bodyData: Data) -> Bool = { _ in true } + ) -> DeflateRequestCompressor { + DeflateRequestCompressor(duplicateHeaderBehavior: duplicateHeaderBehavior, + shouldCompressBodyData: shouldCompressBodyData) + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/RequestInterceptor.swift b/Carthage/Checkouts/Alamofire/Source/RequestInterceptor.swift new file mode 100644 index 00000000..9acd9860 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/RequestInterceptor.swift @@ -0,0 +1,351 @@ +// +// RequestInterceptor.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Stores all state associated with a `URLRequest` being adapted. +public struct RequestAdapterState { + /// The `UUID` of the `Request` associated with the `URLRequest` to adapt. + public let requestID: UUID + + /// The `Session` associated with the `URLRequest` to adapt. + public let session: Session +} + +// MARK: - + +/// A type that can inspect and optionally adapt a `URLRequest` in some manner if necessary. +public protocol RequestAdapter { + /// Inspects and adapts the specified `URLRequest` in some manner and calls the completion handler with the Result. + /// + /// - Parameters: + /// - urlRequest: The `URLRequest` to adapt. + /// - session: The `Session` that will execute the `URLRequest`. + /// - completion: The completion handler that must be called when adaptation is complete. + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) + + /// Inspects and adapts the specified `URLRequest` in some manner and calls the completion handler with the Result. + /// + /// - Parameters: + /// - urlRequest: The `URLRequest` to adapt. + /// - state: The `RequestAdapterState` associated with the `URLRequest`. + /// - completion: The completion handler that must be called when adaptation is complete. + func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) +} + +extension RequestAdapter { + public func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) { + adapt(urlRequest, for: state.session, completion: completion) + } +} + +// MARK: - + +/// Outcome of determination whether retry is necessary. +public enum RetryResult { + /// Retry should be attempted immediately. + case retry + /// Retry should be attempted after the associated `TimeInterval`. + case retryWithDelay(TimeInterval) + /// Do not retry. + case doNotRetry + /// Do not retry due to the associated `Error`. + case doNotRetryWithError(Error) +} + +extension RetryResult { + var retryRequired: Bool { + switch self { + case .retry, .retryWithDelay: return true + default: return false + } + } + + var delay: TimeInterval? { + switch self { + case let .retryWithDelay(delay): return delay + default: return nil + } + } + + var error: Error? { + guard case let .doNotRetryWithError(error) = self else { return nil } + return error + } +} + +/// A type that determines whether a request should be retried after being executed by the specified session manager +/// and encountering an error. +public protocol RequestRetrier { + /// Determines whether the `Request` should be retried by calling the `completion` closure. + /// + /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs + /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly + /// cleaned up after. + /// + /// - Parameters: + /// - request: `Request` that failed due to the provided `Error`. + /// - session: `Session` that produced the `Request`. + /// - error: `Error` encountered while executing the `Request`. + /// - completion: Completion closure to be executed when a retry decision has been determined. + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) +} + +// MARK: - + +/// Type that provides both `RequestAdapter` and `RequestRetrier` functionality. +public protocol RequestInterceptor: RequestAdapter, RequestRetrier {} + +extension RequestInterceptor { + public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + completion(.success(urlRequest)) + } + + public func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + completion(.doNotRetry) + } +} + +/// `RequestAdapter` closure definition. +public typealias AdaptHandler = (URLRequest, Session, _ completion: @escaping (Result) -> Void) -> Void +/// `RequestRetrier` closure definition. +public typealias RetryHandler = (Request, Session, Error, _ completion: @escaping (RetryResult) -> Void) -> Void + +// MARK: - + +/// Closure-based `RequestAdapter`. +open class Adapter: RequestInterceptor { + private let adaptHandler: AdaptHandler + + /// Creates an instance using the provided closure. + /// + /// - Parameter adaptHandler: `AdaptHandler` closure to be executed when handling request adaptation. + public init(_ adaptHandler: @escaping AdaptHandler) { + self.adaptHandler = adaptHandler + } + + open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + adaptHandler(urlRequest, session, completion) + } + + open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) { + adaptHandler(urlRequest, state.session, completion) + } +} + +extension RequestAdapter where Self == Adapter { + /// Creates an `Adapter` using the provided `AdaptHandler` closure. + /// + /// - Parameter closure: `AdaptHandler` to use to adapt the request. + /// - Returns: The `Adapter`. + public static func adapter(using closure: @escaping AdaptHandler) -> Adapter { + Adapter(closure) + } +} + +// MARK: - + +/// Closure-based `RequestRetrier`. +open class Retrier: RequestInterceptor { + private let retryHandler: RetryHandler + + /// Creates an instance using the provided closure. + /// + /// - Parameter retryHandler: `RetryHandler` closure to be executed when handling request retry. + public init(_ retryHandler: @escaping RetryHandler) { + self.retryHandler = retryHandler + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retryHandler(request, session, error, completion) + } +} + +extension RequestRetrier where Self == Retrier { + /// Creates a `Retrier` using the provided `RetryHandler` closure. + /// + /// - Parameter closure: `RetryHandler` to use to retry the request. + /// - Returns: The `Retrier`. + public static func retrier(using closure: @escaping RetryHandler) -> Retrier { + Retrier(closure) + } +} + +// MARK: - + +/// `RequestInterceptor` which can use multiple `RequestAdapter` and `RequestRetrier` values. +open class Interceptor: RequestInterceptor { + /// All `RequestAdapter`s associated with the instance. These adapters will be run until one fails. + public let adapters: [RequestAdapter] + /// All `RequestRetrier`s associated with the instance. These retriers will be run one at a time until one triggers retry. + public let retriers: [RequestRetrier] + + /// Creates an instance from `AdaptHandler` and `RetryHandler` closures. + /// + /// - Parameters: + /// - adaptHandler: `AdaptHandler` closure to be used. + /// - retryHandler: `RetryHandler` closure to be used. + public init(adaptHandler: @escaping AdaptHandler, retryHandler: @escaping RetryHandler) { + adapters = [Adapter(adaptHandler)] + retriers = [Retrier(retryHandler)] + } + + /// Creates an instance from `RequestAdapter` and `RequestRetrier` values. + /// + /// - Parameters: + /// - adapter: `RequestAdapter` value to be used. + /// - retrier: `RequestRetrier` value to be used. + public init(adapter: RequestAdapter, retrier: RequestRetrier) { + adapters = [adapter] + retriers = [retrier] + } + + /// Creates an instance from the arrays of `RequestAdapter` and `RequestRetrier` values. + /// + /// - Parameters: + /// - adapters: `RequestAdapter` values to be used. + /// - retriers: `RequestRetrier` values to be used. + /// - interceptors: `RequestInterceptor`s to be used. + public init(adapters: [RequestAdapter] = [], retriers: [RequestRetrier] = [], interceptors: [RequestInterceptor] = []) { + self.adapters = adapters + interceptors + self.retriers = retriers + interceptors + } + + open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + adapt(urlRequest, for: session, using: adapters, completion: completion) + } + + private func adapt(_ urlRequest: URLRequest, + for session: Session, + using adapters: [RequestAdapter], + completion: @escaping (Result) -> Void) { + var pendingAdapters = adapters + + guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return } + + let adapter = pendingAdapters.removeFirst() + + adapter.adapt(urlRequest, for: session) { result in + switch result { + case let .success(urlRequest): + self.adapt(urlRequest, for: session, using: pendingAdapters, completion: completion) + case .failure: + completion(result) + } + } + } + + open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) { + adapt(urlRequest, using: state, adapters: adapters, completion: completion) + } + + private func adapt(_ urlRequest: URLRequest, + using state: RequestAdapterState, + adapters: [RequestAdapter], + completion: @escaping (Result) -> Void) { + var pendingAdapters = adapters + + guard !pendingAdapters.isEmpty else { completion(.success(urlRequest)); return } + + let adapter = pendingAdapters.removeFirst() + + adapter.adapt(urlRequest, using: state) { result in + switch result { + case let .success(urlRequest): + self.adapt(urlRequest, using: state, adapters: pendingAdapters, completion: completion) + case .failure: + completion(result) + } + } + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retry(request, for: session, dueTo: error, using: retriers, completion: completion) + } + + private func retry(_ request: Request, + for session: Session, + dueTo error: Error, + using retriers: [RequestRetrier], + completion: @escaping (RetryResult) -> Void) { + var pendingRetriers = retriers + + guard !pendingRetriers.isEmpty else { completion(.doNotRetry); return } + + let retrier = pendingRetriers.removeFirst() + + retrier.retry(request, for: session, dueTo: error) { result in + switch result { + case .retry, .retryWithDelay, .doNotRetryWithError: + completion(result) + case .doNotRetry: + // Only continue to the next retrier if retry was not triggered and no error was encountered + self.retry(request, for: session, dueTo: error, using: pendingRetriers, completion: completion) + } + } + } +} + +extension RequestInterceptor where Self == Interceptor { + /// Creates an `Interceptor` using the provided `AdaptHandler` and `RetryHandler` closures. + /// + /// - Parameters: + /// - adapter: `AdapterHandler`to use to adapt the request. + /// - retrier: `RetryHandler` to use to retry the request. + /// - Returns: The `Interceptor`. + public static func interceptor(adapter: @escaping AdaptHandler, retrier: @escaping RetryHandler) -> Interceptor { + Interceptor(adaptHandler: adapter, retryHandler: retrier) + } + + /// Creates an `Interceptor` using the provided `RequestAdapter` and `RequestRetrier` instances. + /// - Parameters: + /// - adapter: `RequestAdapter` to use to adapt the request + /// - retrier: `RequestRetrier` to use to retry the request. + /// - Returns: The `Interceptor`. + public static func interceptor(adapter: RequestAdapter, retrier: RequestRetrier) -> Interceptor { + Interceptor(adapter: adapter, retrier: retrier) + } + + /// Creates an `Interceptor` using the provided `RequestAdapter`s, `RequestRetrier`s, and `RequestInterceptor`s. + /// - Parameters: + /// - adapters: `RequestAdapter`s to use to adapt the request. These adapters will be run until one fails. + /// - retriers: `RequestRetrier`s to use to retry the request. These retriers will be run one at a time until + /// a retry is triggered. + /// - interceptors: `RequestInterceptor`s to use to intercept the request. + /// - Returns: The `Interceptor`. + public static func interceptor(adapters: [RequestAdapter] = [], + retriers: [RequestRetrier] = [], + interceptors: [RequestInterceptor] = []) -> Interceptor { + Interceptor(adapters: adapters, retriers: retriers, interceptors: interceptors) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/RequestTaskMap.swift b/Carthage/Checkouts/Alamofire/Source/RequestTaskMap.swift new file mode 100644 index 00000000..99558759 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/RequestTaskMap.swift @@ -0,0 +1,149 @@ +// +// RequestTaskMap.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A type that maintains a two way, one to one map of `URLSessionTask`s to `Request`s. +struct RequestTaskMap { + private typealias Events = (completed: Bool, metricsGathered: Bool) + + private var tasksToRequests: [URLSessionTask: Request] + private var requestsToTasks: [Request: URLSessionTask] + private var taskEvents: [URLSessionTask: Events] + + var requests: [Request] { + Array(tasksToRequests.values) + } + + init(tasksToRequests: [URLSessionTask: Request] = [:], + requestsToTasks: [Request: URLSessionTask] = [:], + taskEvents: [URLSessionTask: (completed: Bool, metricsGathered: Bool)] = [:]) { + self.tasksToRequests = tasksToRequests + self.requestsToTasks = requestsToTasks + self.taskEvents = taskEvents + } + + subscript(_ request: Request) -> URLSessionTask? { + get { requestsToTasks[request] } + set { + guard let newValue = newValue else { + guard let task = requestsToTasks[request] else { + fatalError("RequestTaskMap consistency error: no task corresponding to request found.") + } + + requestsToTasks.removeValue(forKey: request) + tasksToRequests.removeValue(forKey: task) + taskEvents.removeValue(forKey: task) + + return + } + + requestsToTasks[request] = newValue + tasksToRequests[newValue] = request + taskEvents[newValue] = (completed: false, metricsGathered: false) + } + } + + subscript(_ task: URLSessionTask) -> Request? { + get { tasksToRequests[task] } + set { + guard let newValue = newValue else { + guard let request = tasksToRequests[task] else { + fatalError("RequestTaskMap consistency error: no request corresponding to task found.") + } + + tasksToRequests.removeValue(forKey: task) + requestsToTasks.removeValue(forKey: request) + taskEvents.removeValue(forKey: task) + + return + } + + tasksToRequests[task] = newValue + requestsToTasks[newValue] = task + taskEvents[task] = (completed: false, metricsGathered: false) + } + } + + var count: Int { + precondition(tasksToRequests.count == requestsToTasks.count, + "RequestTaskMap.count invalid, requests.count: \(tasksToRequests.count) != tasks.count: \(requestsToTasks.count)") + + return tasksToRequests.count + } + + var eventCount: Int { + precondition(taskEvents.count == count, "RequestTaskMap.eventCount invalid, count: \(count) != taskEvents.count: \(taskEvents.count)") + + return taskEvents.count + } + + var isEmpty: Bool { + precondition(tasksToRequests.isEmpty == requestsToTasks.isEmpty, + "RequestTaskMap.isEmpty invalid, requests.isEmpty: \(tasksToRequests.isEmpty) != tasks.isEmpty: \(requestsToTasks.isEmpty)") + + return tasksToRequests.isEmpty + } + + var isEventsEmpty: Bool { + precondition(taskEvents.isEmpty == isEmpty, "RequestTaskMap.isEventsEmpty invalid, isEmpty: \(isEmpty) != taskEvents.isEmpty: \(taskEvents.isEmpty)") + + return taskEvents.isEmpty + } + + mutating func disassociateIfNecessaryAfterGatheringMetricsForTask(_ task: URLSessionTask) -> Bool { + guard let events = taskEvents[task] else { + fatalError("RequestTaskMap consistency error: no events corresponding to task found.") + } + + switch (events.completed, events.metricsGathered) { + case (_, true): fatalError("RequestTaskMap consistency error: duplicate metricsGatheredForTask call.") + case (false, false): taskEvents[task] = (completed: false, metricsGathered: true); return false + case (true, false): self[task] = nil; return true + } + } + + mutating func disassociateIfNecessaryAfterCompletingTask(_ task: URLSessionTask) -> Bool { + guard let events = taskEvents[task] else { + fatalError("RequestTaskMap consistency error: no events corresponding to task found.") + } + + switch (events.completed, events.metricsGathered) { + case (true, _): fatalError("RequestTaskMap consistency error: duplicate completionReceivedForTask call.") + #if os(Linux) || os(Android) // Linux doesn't gather metrics, so unconditionally remove the reference and return true. + default: self[task] = nil; return true + #else + case (false, false): + if #available(macOS 10.12, iOS 10, watchOS 7, tvOS 10, *) { + taskEvents[task] = (completed: true, metricsGathered: false); return false + } else { + // watchOS < 7 doesn't gather metrics, so unconditionally remove the reference and return true. + self[task] = nil; return true + } + case (false, true): + self[task] = nil; return true + #endif + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Response.swift b/Carthage/Checkouts/Alamofire/Source/Response.swift new file mode 100644 index 00000000..d9ae9d85 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Response.swift @@ -0,0 +1,453 @@ +// +// Response.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Default type of `DataResponse` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFDataResponse = DataResponse +/// Default type of `DownloadResponse` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFDownloadResponse = DownloadResponse + +/// Type used to store all values associated with a serialized response of a `DataRequest` or `UploadRequest`. +public struct DataResponse { + /// The URL request sent to the server. + public let request: URLRequest? + + /// The server's response to the URL request. + public let response: HTTPURLResponse? + + /// The data returned by the server. + public let data: Data? + + /// The final metrics of the response. + /// + /// - Note: Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS is currently disabled.` + /// + public let metrics: URLSessionTaskMetrics? + + /// The time taken to serialize the response. + public let serializationDuration: TimeInterval + + /// The result of response serialization. + public let result: Result + + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Success? { result.success } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Failure? { result.failure } + + /// Creates a `DataResponse` instance with the specified parameters derived from the response serialization. + /// + /// - Parameters: + /// - request: The `URLRequest` sent to the server. + /// - response: The `HTTPURLResponse` from the server. + /// - data: The `Data` returned by the server. + /// - metrics: The `URLSessionTaskMetrics` of the `DataRequest` or `UploadRequest`. + /// - serializationDuration: The duration taken by serialization. + /// - result: The `Result` of response serialization. + public init(request: URLRequest?, + response: HTTPURLResponse?, + data: Data?, + metrics: URLSessionTaskMetrics?, + serializationDuration: TimeInterval, + result: Result) { + self.request = request + self.response = response + self.data = data + self.metrics = metrics + self.serializationDuration = serializationDuration + self.result = result + } +} + +// MARK: - + +extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible { + /// The textual representation used when written to an output stream, which includes whether the result was a + /// success or failure. + public var description: String { + "\(result)" + } + + /// The debug textual representation used when written to an output stream, which includes (if available) a summary + /// of the `URLRequest`, the request's headers and body (if decodable as a `String` below 100KB); the + /// `HTTPURLResponse`'s status code, headers, and body; the duration of the network and serialization actions; and + /// the `Result` of serialization. + public var debugDescription: String { + guard let urlRequest = request else { return "[Request]: None\n[Result]: \(result)" } + + let requestDescription = DebugDescription.description(of: urlRequest) + + let responseDescription = response.map { response in + let responseBodyDescription = DebugDescription.description(for: data, headers: response.headers) + + return """ + \(DebugDescription.description(of: response)) + \(responseBodyDescription.indentingNewlines()) + """ + } ?? "[Response]: None" + + let networkDuration = metrics.map { "\($0.taskInterval.duration)s" } ?? "None" + + return """ + \(requestDescription) + \(responseDescription) + [Network Duration]: \(networkDuration) + [Serialization Duration]: \(serializationDuration)s + [Result]: \(result) + """ + } +} + +// MARK: - + +extension DataResponse { + /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Success) -> NewSuccess) -> DataResponse { + DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.map(transform)) + } + + /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result + /// value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's + /// result is a failure, returns the same failure. + public func tryMap(_ transform: (Success) throws -> NewSuccess) -> DataResponse { + DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMap(transform)) + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DataResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func mapError(_ transform: (Failure) -> NewFailure) -> DataResponse { + DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.mapError(transform)) + } + + /// Evaluates the specified closure when the `DataResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DataResponse = ... + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DataResponse` instance containing the result of the transform. + public func tryMapError(_ transform: (Failure) throws -> NewFailure) -> DataResponse { + DataResponse(request: request, + response: response, + data: data, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMapError(transform)) + } +} + +// MARK: - + +/// Used to store all data associated with a serialized response of a download request. +public struct DownloadResponse { + /// The URL request sent to the server. + public let request: URLRequest? + + /// The server's response to the URL request. + public let response: HTTPURLResponse? + + /// The final destination URL of the data returned from the server after it is moved. + public let fileURL: URL? + + /// The resume data generated if the request was cancelled. + public let resumeData: Data? + + /// The final metrics of the response. + /// + /// - Note: Due to `FB7624529`, collection of `URLSessionTaskMetrics` on watchOS is currently disabled.` + /// + public let metrics: URLSessionTaskMetrics? + + /// The time taken to serialize the response. + public let serializationDuration: TimeInterval + + /// The result of response serialization. + public let result: Result + + /// Returns the associated value of the result if it is a success, `nil` otherwise. + public var value: Success? { result.success } + + /// Returns the associated error value if the result if it is a failure, `nil` otherwise. + public var error: Failure? { result.failure } + + /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization. + /// + /// - Parameters: + /// - request: The `URLRequest` sent to the server. + /// - response: The `HTTPURLResponse` from the server. + /// - fileURL: The final destination URL of the data returned from the server after it is moved. + /// - resumeData: The resume `Data` generated if the request was cancelled. + /// - metrics: The `URLSessionTaskMetrics` of the `DownloadRequest`. + /// - serializationDuration: The duration taken by serialization. + /// - result: The `Result` of response serialization. + public init(request: URLRequest?, + response: HTTPURLResponse?, + fileURL: URL?, + resumeData: Data?, + metrics: URLSessionTaskMetrics?, + serializationDuration: TimeInterval, + result: Result) { + self.request = request + self.response = response + self.fileURL = fileURL + self.resumeData = resumeData + self.metrics = metrics + self.serializationDuration = serializationDuration + self.result = result + } +} + +// MARK: - + +extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible { + /// The textual representation used when written to an output stream, which includes whether the result was a + /// success or failure. + public var description: String { + "\(result)" + } + + /// The debug textual representation used when written to an output stream, which includes the URL request, the URL + /// response, the temporary and destination URLs, the resume data, the durations of the network and serialization + /// actions, and the response serialization result. + public var debugDescription: String { + guard let urlRequest = request else { return "[Request]: None\n[Result]: \(result)" } + + let requestDescription = DebugDescription.description(of: urlRequest) + let responseDescription = response.map(DebugDescription.description(of:)) ?? "[Response]: None" + let networkDuration = metrics.map { "\($0.taskInterval.duration)s" } ?? "None" + let resumeDataDescription = resumeData.map { "\($0)" } ?? "None" + + return """ + \(requestDescription) + \(responseDescription) + [File URL]: \(fileURL?.path ?? "None") + [Resume Data]: \(resumeDataDescription) + [Network Duration]: \(networkDuration) + [Serialization Duration]: \(serializationDuration)s + [Result]: \(result) + """ + } +} + +// MARK: - + +extension DownloadResponse { + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `map` method with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleInt = possibleData.map { $0.count } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's + /// result is a failure, returns a response wrapping the same failure. + public func map(_ transform: (Success) -> NewSuccess) -> DownloadResponse { + DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.map(transform)) + } + + /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped + /// result value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance's result. + /// + /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this + /// instance's result is a failure, returns the same failure. + public func tryMap(_ transform: (Success) throws -> NewSuccess) -> DownloadResponse { + DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMap(transform)) + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `mapError` function with a closure that does not throw. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let withMyError = possibleData.mapError { MyError.error($0) } + /// + /// - Parameter transform: A closure that takes the error of the instance. + /// + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func mapError(_ transform: (Failure) -> NewFailure) -> DownloadResponse { + DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.mapError(transform)) + } + + /// Evaluates the specified closure when the `DownloadResponse` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: DownloadResponse = ... + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `DownloadResponse` instance containing the result of the transform. + public func tryMapError(_ transform: (Failure) throws -> NewFailure) -> DownloadResponse { + DownloadResponse(request: request, + response: response, + fileURL: fileURL, + resumeData: resumeData, + metrics: metrics, + serializationDuration: serializationDuration, + result: result.tryMapError(transform)) + } +} + +private enum DebugDescription { + static func description(of request: URLRequest) -> String { + let requestSummary = "\(request.httpMethod!) \(request)" + let requestHeadersDescription = DebugDescription.description(for: request.headers) + let requestBodyDescription = DebugDescription.description(for: request.httpBody, headers: request.headers) + + return """ + [Request]: \(requestSummary) + \(requestHeadersDescription.indentingNewlines()) + \(requestBodyDescription.indentingNewlines()) + """ + } + + static func description(of response: HTTPURLResponse) -> String { + """ + [Response]: + [Status Code]: \(response.statusCode) + \(DebugDescription.description(for: response.headers).indentingNewlines()) + """ + } + + static func description(for headers: HTTPHeaders) -> String { + guard !headers.isEmpty else { return "[Headers]: None" } + + let headerDescription = "\(headers.sorted())".indentingNewlines() + return """ + [Headers]: + \(headerDescription) + """ + } + + static func description(for data: Data?, + headers: HTTPHeaders, + allowingPrintableTypes printableTypes: [String] = ["json", "xml", "text"], + maximumLength: Int = 100_000) -> String { + guard let data = data, !data.isEmpty else { return "[Body]: None" } + + guard + data.count <= maximumLength, + printableTypes.compactMap({ headers["Content-Type"]?.contains($0) }).contains(true) + else { return "[Body]: \(data.count) bytes" } + + return """ + [Body]: + \(String(decoding: data, as: UTF8.self) + .trimmingCharacters(in: .whitespacesAndNewlines) + .indentingNewlines()) + """ + } +} + +extension String { + fileprivate func indentingNewlines(by spaceCount: Int = 4) -> String { + let spaces = String(repeating: " ", count: spaceCount) + return replacingOccurrences(of: "\n", with: "\n\(spaces)") + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/ResponseSerialization.swift b/Carthage/Checkouts/Alamofire/Source/ResponseSerialization.swift new file mode 100644 index 00000000..2022ac08 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/ResponseSerialization.swift @@ -0,0 +1,1270 @@ +// +// ResponseSerialization.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +// MARK: Protocols + +/// The type to which all data response serializers must conform in order to serialize a response. +public protocol DataResponseSerializerProtocol { + /// The type of serialized object to be created. + associatedtype SerializedObject + + /// Serialize the response `Data` into the provided type.. + /// + /// - Parameters: + /// - request: `URLRequest` which was used to perform the request, if any. + /// - response: `HTTPURLResponse` received from the server, if any. + /// - data: `Data` returned from the server, if any. + /// - error: `Error` produced by Alamofire or the underlying `URLSession` during the request. + /// + /// - Returns: The `SerializedObject`. + /// - Throws: Any `Error` produced during serialization. + func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject +} + +/// The type to which all download response serializers must conform in order to serialize a response. +public protocol DownloadResponseSerializerProtocol { + /// The type of serialized object to be created. + associatedtype SerializedObject + + /// Serialize the downloaded response `Data` from disk into the provided type.. + /// + /// - Parameters: + /// - request: `URLRequest` which was used to perform the request, if any. + /// - response: `HTTPURLResponse` received from the server, if any. + /// - fileURL: File `URL` to which the response data was downloaded. + /// - error: `Error` produced by Alamofire or the underlying `URLSession` during the request. + /// + /// - Returns: The `SerializedObject`. + /// - Throws: Any `Error` produced during serialization. + func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> SerializedObject +} + +/// A serializer that can handle both data and download responses. +public protocol ResponseSerializer: DataResponseSerializerProtocol & DownloadResponseSerializerProtocol { + /// `DataPreprocessor` used to prepare incoming `Data` for serialization. + var dataPreprocessor: DataPreprocessor { get } + /// `HTTPMethod`s for which empty response bodies are considered appropriate. + var emptyRequestMethods: Set { get } + /// HTTP response codes for which empty response bodies are considered appropriate. + var emptyResponseCodes: Set { get } +} + +/// Type used to preprocess `Data` before it handled by a serializer. +public protocol DataPreprocessor { + /// Process `Data` before it's handled by a serializer. + /// - Parameter data: The raw `Data` to process. + func preprocess(_ data: Data) throws -> Data +} + +/// `DataPreprocessor` that returns passed `Data` without any transform. +public struct PassthroughPreprocessor: DataPreprocessor { + public init() {} + + public func preprocess(_ data: Data) throws -> Data { data } +} + +/// `DataPreprocessor` that trims Google's typical `)]}',\n` XSSI JSON header. +public struct GoogleXSSIPreprocessor: DataPreprocessor { + public init() {} + + public func preprocess(_ data: Data) throws -> Data { + (data.prefix(6) == Data(")]}',\n".utf8)) ? data.dropFirst(6) : data + } +} + +extension DataPreprocessor where Self == PassthroughPreprocessor { + /// Provides a `PassthroughPreprocessor` instance. + public static var passthrough: PassthroughPreprocessor { PassthroughPreprocessor() } +} + +extension DataPreprocessor where Self == GoogleXSSIPreprocessor { + /// Provides a `GoogleXSSIPreprocessor` instance. + public static var googleXSSI: GoogleXSSIPreprocessor { GoogleXSSIPreprocessor() } +} + +extension ResponseSerializer { + /// Default `DataPreprocessor`. `PassthroughPreprocessor` by default. + public static var defaultDataPreprocessor: DataPreprocessor { PassthroughPreprocessor() } + /// Default `HTTPMethod`s for which empty response bodies are considered appropriate. `[.head]` by default. + public static var defaultEmptyRequestMethods: Set { [.head] } + /// HTTP response codes for which empty response bodies are considered appropriate. `[204, 205]` by default. + public static var defaultEmptyResponseCodes: Set { [204, 205] } + + public var dataPreprocessor: DataPreprocessor { Self.defaultDataPreprocessor } + public var emptyRequestMethods: Set { Self.defaultEmptyRequestMethods } + public var emptyResponseCodes: Set { Self.defaultEmptyResponseCodes } + + /// Determines whether the `request` allows empty response bodies, if `request` exists. + /// + /// - Parameter request: `URLRequest` to evaluate. + /// + /// - Returns: `Bool` representing the outcome of the evaluation, or `nil` if `request` was `nil`. + public func requestAllowsEmptyResponseData(_ request: URLRequest?) -> Bool? { + request.flatMap(\.httpMethod) + .flatMap(HTTPMethod.init) + .map { emptyRequestMethods.contains($0) } + } + + /// Determines whether the `response` allows empty response bodies, if `response` exists`. + /// + /// - Parameter response: `HTTPURLResponse` to evaluate. + /// + /// - Returns: `Bool` representing the outcome of the evaluation, or `nil` if `response` was `nil`. + public func responseAllowsEmptyResponseData(_ response: HTTPURLResponse?) -> Bool? { + response.map(\.statusCode) + .map { emptyResponseCodes.contains($0) } + } + + /// Determines whether `request` and `response` allow empty response bodies. + /// + /// - Parameters: + /// - request: `URLRequest` to evaluate. + /// - response: `HTTPURLResponse` to evaluate. + /// + /// - Returns: `true` if `request` or `response` allow empty bodies, `false` otherwise. + public func emptyResponseAllowed(forRequest request: URLRequest?, response: HTTPURLResponse?) -> Bool { + (requestAllowsEmptyResponseData(request) == true) || (responseAllowsEmptyResponseData(response) == true) + } +} + +/// By default, any serializer declared to conform to both types will get file serialization for free, as it just feeds +/// the data read from disk into the data response serializer. +extension DownloadResponseSerializerProtocol where Self: DataResponseSerializerProtocol { + public func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> Self.SerializedObject { + guard error == nil else { throw error! } + + guard let fileURL = fileURL else { + throw AFError.responseSerializationFailed(reason: .inputFileNil) + } + + let data: Data + do { + data = try Data(contentsOf: fileURL) + } catch { + throw AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)) + } + + do { + return try serialize(request: request, response: response, data: data, error: error) + } catch { + throw error + } + } +} + +// MARK: - Default + +extension DataRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let result = AFResult(value: self.data, error: self.error) + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: 0, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + } + } + + return self + } + + private func _response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let start = ProcessInfo.processInfo.systemUptime + let result: AFResult = Result { + try responseSerializer.serialize(request: self.request, + response: self.response, + data: self.data, + error: self.error) + }.mapError { error in + error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error))) + } + + let end = ProcessInfo.processInfo.systemUptime + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + guard !self.isCancelled, let serializerError = result.failure, let delegate = self.delegate else { + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + return + } + + delegate.retryResult(for: self, dueTo: serializerError) { retryResult in + var didComplete: (() -> Void)? + + defer { + if let didComplete = didComplete { + self.responseSerializerDidComplete { queue.async { didComplete() } } + } + } + + switch retryResult { + case .doNotRetry: + didComplete = { completionHandler(response) } + + case let .doNotRetryWithError(retryError): + let result: AFResult = .failure(retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + + let response = DataResponse(request: self.request, + response: self.response, + data: self.data, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + didComplete = { completionHandler(response) } + + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + } + + return self + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) + -> Self { + _response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDataResponse) -> Void) + -> Self { + _response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let result = AFResult(value: self.fileURL, error: self.error) + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: 0, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + } + } + + return self + } + + private func _response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + appendResponseSerializer { + // Start work that should be on the serialization queue. + let start = ProcessInfo.processInfo.systemUptime + let result: AFResult = Result { + try responseSerializer.serializeDownload(request: self.request, + response: self.response, + fileURL: self.fileURL, + error: self.error) + }.mapError { error in + error.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: error))) + } + let end = ProcessInfo.processInfo.systemUptime + // End work that should be on the serialization queue. + + self.underlyingQueue.async { + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + self.eventMonitor?.request(self, didParseResponse: response) + + guard let serializerError = result.failure, let delegate = self.delegate else { + self.responseSerializerDidComplete { queue.async { completionHandler(response) } } + return + } + + delegate.retryResult(for: self, dueTo: serializerError) { retryResult in + var didComplete: (() -> Void)? + + defer { + if let didComplete = didComplete { + self.responseSerializerDidComplete { queue.async { didComplete() } } + } + } + + switch retryResult { + case .doNotRetry: + didComplete = { completionHandler(response) } + + case let .doNotRetryWithError(retryError): + let result: AFResult = .failure(retryError.asAFError(orFailWith: "Received retryError was not already AFError")) + + let response = DownloadResponse(request: self.request, + response: self.response, + fileURL: self.fileURL, + resumeData: self.resumeData, + metrics: self.metrics, + serializationDuration: end - start, + result: result) + + didComplete = { completionHandler(response) } + + case .retry, .retryWithDelay: + delegate.retryRequest(self, withDelay: retryResult.delay) + } + } + } + } + + return self + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data + /// contained in the destination `URL`. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + _response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) + } + + /// Adds a handler to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - responseSerializer: The response serializer responsible for serializing the request, response, and data + /// contained in the destination `URL`. + /// - completionHandler: The code to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func response(queue: DispatchQueue = .main, + responseSerializer: Serializer, + completionHandler: @escaping (AFDownloadResponse) -> Void) + -> Self { + _response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler) + } +} + +// MARK: - URL + +/// A `DownloadResponseSerializerProtocol` that performs only `Error` checking and ensures that a downloaded `fileURL` +/// is present. +public struct URLResponseSerializer: DownloadResponseSerializerProtocol { + /// Creates an instance. + public init() {} + + public func serializeDownload(request: URLRequest?, + response: HTTPURLResponse?, + fileURL: URL?, + error: Error?) throws -> URL { + guard error == nil else { throw error! } + + guard let url = fileURL else { + throw AFError.responseSerializationFailed(reason: .inputFileNil) + } + + return url + } +} + +extension DownloadResponseSerializerProtocol where Self == URLResponseSerializer { + /// Provides a `URLResponseSerializer` instance. + public static var url: URLResponseSerializer { URLResponseSerializer() } +} + +extension DownloadRequest { + /// Adds a handler using a `URLResponseSerializer` to be called once the request is finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is called. `.main` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseURL(queue: DispatchQueue = .main, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + response(queue: queue, responseSerializer: URLResponseSerializer(), completionHandler: completionHandler) + } +} + +// MARK: - Data + +/// A `ResponseSerializer` that performs minimal response checking and returns any response `Data` as-is. By default, a +/// request returning `nil` or no data is considered an error. However, if the request has an `HTTPMethod` or the +/// response has an HTTP status code valid for empty responses, then an empty `Data` value is returned. +public final class DataResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates a `DataResponseSerializer` using the provided parameters. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return Data() + } + + data = try dataPreprocessor.preprocess(data) + + return data + } +} + +extension ResponseSerializer where Self == DataResponseSerializer { + /// Provides a default `DataResponseSerializer` instance. + public static var data: DataResponseSerializer { DataResponseSerializer() } + + /// Creates a `DataResponseSerializer` using the provided parameters. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + /// + /// - Returns: The `DataResponseSerializer`. + public static func data(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods) -> DataResponseSerializer { + DataResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods) + } +} + +extension DataRequest { + /// Adds a handler using a `DataResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is called. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseData(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: DataResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler using a `DataResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is called. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseData(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = DataResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DataResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: DataResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +// MARK: - String + +/// A `ResponseSerializer` that decodes the response data as a `String`. By default, a request returning `nil` or no +/// data is considered an error. However, if the request has an `HTTPMethod` or the response has an HTTP status code +/// valid for empty responses, then an empty `String` is returned. +public final class StringResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + /// Optional string encoding used to validate the response. + public let encoding: String.Encoding? + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates an instance with the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - encoding: A string encoding. Defaults to `nil`, in which case the encoding will be determined + /// from the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.encoding = encoding + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> String { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return "" + } + + data = try dataPreprocessor.preprocess(data) + + var convertedEncoding = encoding + + if let encodingName = response?.textEncodingName, convertedEncoding == nil { + convertedEncoding = String.Encoding(ianaCharsetName: encodingName) + } + + let actualEncoding = convertedEncoding ?? .isoLatin1 + + guard let string = String(data: data, encoding: actualEncoding) else { + throw AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding)) + } + + return string + } +} + +extension ResponseSerializer where Self == StringResponseSerializer { + /// Provides a default `StringResponseSerializer` instance. + public static var string: StringResponseSerializer { StringResponseSerializer() } + + /// Creates a `StringResponseSerializer` with the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - encoding: A string encoding. Defaults to `nil`, in which case the encoding will be determined + /// from the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + /// + /// - Returns: The `StringResponseSerializer`. + public static func string(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods) -> StringResponseSerializer { + StringResponseSerializer(dataPreprocessor: dataPreprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods) + } +} + +extension DataRequest { + /// Adds a handler using a `StringResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - encoding: The string encoding. Defaults to `nil`, in which case the encoding will be determined + /// from the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseString(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: StringResponseSerializer(dataPreprocessor: dataPreprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler using a `StringResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - encoding: The string encoding. Defaults to `nil`, in which case the encoding will be determined + /// from the server response, falling back to the default HTTP character set, `ISO-8859-1`. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseString(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor, + encoding: String.Encoding? = nil, + emptyResponseCodes: Set = StringResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = StringResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: StringResponseSerializer(dataPreprocessor: dataPreprocessor, + encoding: encoding, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +// MARK: - JSON + +/// A `ResponseSerializer` that decodes the response data using `JSONSerialization`. By default, a request returning +/// `nil` or no data is considered an error. However, if the request has an `HTTPMethod` or the response has an +/// HTTP status code valid for empty responses, then an `NSNull` value is returned. +@available(*, deprecated, message: "JSONResponseSerializer deprecated and will be removed in Alamofire 6. Use DecodableResponseSerializer instead.") +public final class JSONResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + /// `JSONSerialization.ReadingOptions` used when serializing a response. + public let options: JSONSerialization.ReadingOptions + + /// Creates an instance with the provided values. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + /// - options: The options to use. `.allowFragments` by default. + public init(dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = JSONResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = JSONResponseSerializer.defaultEmptyRequestMethods, + options: JSONSerialization.ReadingOptions = .allowFragments) { + self.dataPreprocessor = dataPreprocessor + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + self.options = options + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + return NSNull() + } + + data = try dataPreprocessor.preprocess(data) + + do { + return try JSONSerialization.jsonObject(with: data, options: options) + } catch { + throw AFError.responseSerializationFailed(reason: .jsonSerializationFailed(error: error)) + } + } +} + +extension DataRequest { + /// Adds a handler using a `JSONResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - options: `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments` + /// by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.") + @discardableResult + public func responseJSON(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = JSONResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = JSONResponseSerializer.defaultEmptyRequestMethods, + options: JSONSerialization.ReadingOptions = .allowFragments, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: JSONResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods, + options: options), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler using a `JSONResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - options: `JSONSerialization.ReadingOptions` used when parsing the response. `.allowFragments` + /// by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.") + @discardableResult + public func responseJSON(queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor, + emptyResponseCodes: Set = JSONResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = JSONResponseSerializer.defaultEmptyRequestMethods, + options: JSONSerialization.ReadingOptions = .allowFragments, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: JSONResponseSerializer(dataPreprocessor: dataPreprocessor, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods, + options: options), + completionHandler: completionHandler) + } +} + +// MARK: - Empty + +/// Protocol representing an empty response. Use `T.emptyValue()` to get an instance. +public protocol EmptyResponse { + /// Empty value for the conforming type. + /// + /// - Returns: Value of `Self` to use for empty values. + static func emptyValue() -> Self +} + +/// Type representing an empty value. Use `Empty.value` to get the static instance. +public struct Empty: Codable { + /// Static `Empty` instance used for all `Empty` responses. + public static let value = Empty() +} + +extension Empty: EmptyResponse { + public static func emptyValue() -> Empty { + value + } +} + +// MARK: - DataDecoder Protocol + +/// Any type which can decode `Data` into a `Decodable` type. +public protocol DataDecoder { + /// Decode `Data` into the provided type. + /// + /// - Parameters: + /// - type: The `Type` to be decoded. + /// - data: The `Data` to be decoded. + /// + /// - Returns: The decoded value of type `D`. + /// - Throws: Any error that occurs during decode. + func decode(_ type: D.Type, from data: Data) throws -> D +} + +/// `JSONDecoder` automatically conforms to `DataDecoder`. +extension JSONDecoder: DataDecoder {} +/// `PropertyListDecoder` automatically conforms to `DataDecoder`. +extension PropertyListDecoder: DataDecoder {} + +// MARK: - Decodable + +/// A `ResponseSerializer` that decodes the response data as a generic value using any type that conforms to +/// `DataDecoder`. By default, this is an instance of `JSONDecoder`. Additionally, a request returning `nil` or no data +/// is considered an error. However, if the request has an `HTTPMethod` or the response has an HTTP status code valid +/// for empty responses then an empty value will be returned. If the decoded type conforms to `EmptyResponse`, the +/// type's `emptyValue()` will be returned. If the decoded type is `Empty`, the `.value` instance is returned. If the +/// decoded type *does not* conform to `EmptyResponse` and isn't `Empty`, an error will be produced. +public final class DecodableResponseSerializer: ResponseSerializer { + public let dataPreprocessor: DataPreprocessor + /// The `DataDecoder` instance used to decode responses. + public let decoder: DataDecoder + public let emptyResponseCodes: Set + public let emptyRequestMethods: Set + + /// Creates an instance using the values provided. + /// + /// - Parameters: + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - decoder: The `DataDecoder`. `JSONDecoder()` by default. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + public init(dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) { + self.dataPreprocessor = dataPreprocessor + self.decoder = decoder + self.emptyResponseCodes = emptyResponseCodes + self.emptyRequestMethods = emptyRequestMethods + } + + public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> T { + guard error == nil else { throw error! } + + guard var data = data, !data.isEmpty else { + guard emptyResponseAllowed(forRequest: request, response: response) else { + throw AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + } + + guard let emptyResponseType = T.self as? EmptyResponse.Type, let emptyValue = emptyResponseType.emptyValue() as? T else { + throw AFError.responseSerializationFailed(reason: .invalidEmptyResponse(type: "\(T.self)")) + } + + return emptyValue + } + + data = try dataPreprocessor.preprocess(data) + + do { + return try decoder.decode(T.self, from: data) + } catch { + throw AFError.responseSerializationFailed(reason: .decodingFailed(error: error)) + } + } +} + +extension ResponseSerializer { + /// Creates a `DecodableResponseSerializer` using the values provided. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - dataPreprocessor: `DataPreprocessor` used to prepare the received `Data` for serialization. + /// - decoder: The `DataDecoder`. `JSONDecoder()` by default. + /// - emptyResponseCodes: The HTTP response codes for which empty responses are allowed. `[204, 205]` by default. + /// - emptyRequestMethods: The HTTP request methods for which empty responses are allowed. `[.head]` by default. + /// + /// - Returns: The `DecodableResponseSerializer`. + public static func decodable(of type: T.Type, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods) -> DecodableResponseSerializer where Self == DecodableResponseSerializer { + DecodableResponseSerializer(dataPreprocessor: dataPreprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods) + } +} + +extension DataRequest { + /// Adds a handler using a `DecodableResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseDecodable(of type: T.Type = T.self, + queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDataResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +extension DownloadRequest { + /// Adds a handler using a `DecodableResponseSerializer` to be called once the request has finished. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from response data. + /// - queue: The queue on which the completion handler is dispatched. `.main` by default. + /// - dataPreprocessor: `DataPreprocessor` which processes the received `Data` before calling the + /// `completionHandler`. `PassthroughPreprocessor()` by default. + /// - decoder: `DataDecoder` to use to decode the response. `JSONDecoder()` by default. + /// - emptyResponseCodes: HTTP status codes for which empty responses are always valid. `[204, 205]` by default. + /// - emptyRequestMethods: `HTTPMethod`s for which empty responses are always valid. `[.head]` by default. + /// - completionHandler: A closure to be executed once the request has finished. + /// + /// - Returns: The request. + @discardableResult + public func responseDecodable(of type: T.Type = T.self, + queue: DispatchQueue = .main, + dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor, + decoder: DataDecoder = JSONDecoder(), + emptyResponseCodes: Set = DecodableResponseSerializer.defaultEmptyResponseCodes, + emptyRequestMethods: Set = DecodableResponseSerializer.defaultEmptyRequestMethods, + completionHandler: @escaping (AFDownloadResponse) -> Void) -> Self { + response(queue: queue, + responseSerializer: DecodableResponseSerializer(dataPreprocessor: dataPreprocessor, + decoder: decoder, + emptyResponseCodes: emptyResponseCodes, + emptyRequestMethods: emptyRequestMethods), + completionHandler: completionHandler) + } +} + +// MARK: - DataStreamRequest + +/// A type which can serialize incoming `Data`. +public protocol DataStreamSerializer { + /// Type produced from the serialized `Data`. + associatedtype SerializedObject + + /// Serializes incoming `Data` into a `SerializedObject` value. + /// + /// - Parameter data: `Data` to be serialized. + /// + /// - Throws: Any error produced during serialization. + func serialize(_ data: Data) throws -> SerializedObject +} + +/// `DataStreamSerializer` which uses the provided `DataPreprocessor` and `DataDecoder` to serialize the incoming `Data`. +public struct DecodableStreamSerializer: DataStreamSerializer { + /// `DataDecoder` used to decode incoming `Data`. + public let decoder: DataDecoder + /// `DataPreprocessor` incoming `Data` is passed through before being passed to the `DataDecoder`. + public let dataPreprocessor: DataPreprocessor + + /// Creates an instance with the provided `DataDecoder` and `DataPreprocessor`. + /// - Parameters: + /// - decoder: ` DataDecoder` used to decode incoming `Data`. `JSONDecoder()` by default. + /// - dataPreprocessor: `DataPreprocessor` used to process incoming `Data` before it's passed through the + /// `decoder`. `PassthroughPreprocessor()` by default. + public init(decoder: DataDecoder = JSONDecoder(), dataPreprocessor: DataPreprocessor = PassthroughPreprocessor()) { + self.decoder = decoder + self.dataPreprocessor = dataPreprocessor + } + + public func serialize(_ data: Data) throws -> T { + let processedData = try dataPreprocessor.preprocess(data) + do { + return try decoder.decode(T.self, from: processedData) + } catch { + throw AFError.responseSerializationFailed(reason: .decodingFailed(error: error)) + } + } +} + +/// `DataStreamSerializer` which performs no serialization on incoming `Data`. +public struct PassthroughStreamSerializer: DataStreamSerializer { + /// Creates an instance. + public init() {} + + public func serialize(_ data: Data) throws -> Data { data } +} + +/// `DataStreamSerializer` which serializes incoming stream `Data` into `UTF8`-decoded `String` values. +public struct StringStreamSerializer: DataStreamSerializer { + /// Creates an instance. + public init() {} + + public func serialize(_ data: Data) throws -> String { + String(decoding: data, as: UTF8.self) + } +} + +extension DataStreamSerializer { + /// Creates a `DecodableStreamSerializer` instance with the provided `DataDecoder` and `DataPreprocessor`. + /// + /// - Parameters: + /// - type: `Decodable` type to decode from stream data. + /// - decoder: ` DataDecoder` used to decode incoming `Data`. `JSONDecoder()` by default. + /// - dataPreprocessor: `DataPreprocessor` used to process incoming `Data` before it's passed through the + /// `decoder`. `PassthroughPreprocessor()` by default. + public static func decodable(of type: T.Type, + decoder: DataDecoder = JSONDecoder(), + dataPreprocessor: DataPreprocessor = PassthroughPreprocessor()) -> Self where Self == DecodableStreamSerializer { + DecodableStreamSerializer(decoder: decoder, dataPreprocessor: dataPreprocessor) + } +} + +extension DataStreamSerializer where Self == PassthroughStreamSerializer { + /// Provides a `PassthroughStreamSerializer` instance. + public static var passthrough: PassthroughStreamSerializer { PassthroughStreamSerializer() } +} + +extension DataStreamSerializer where Self == StringStreamSerializer { + /// Provides a `StringStreamSerializer` instance. + public static var string: StringStreamSerializer { StringStreamSerializer() } +} + +extension DataStreamRequest { + /// Adds a `StreamHandler` which performs no parsing on incoming `Data`. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which to perform `StreamHandler` closure. + /// - stream: `StreamHandler` closure called as `Data` is received. May be called multiple times. + /// + /// - Returns: The `DataStreamRequest`. + @discardableResult + public func responseStream(on queue: DispatchQueue = .main, stream: @escaping Handler) -> Self { + let parser = { [unowned self] (data: Data) in + queue.async { + self.capturingError { + try stream(.init(event: .stream(.success(data)), token: .init(self))) + } + + self.updateAndCompleteIfPossible() + } + } + + streamMutableState.write { $0.streams.append(parser) } + appendStreamCompletion(on: queue, stream: stream) + + return self + } + + /// Adds a `StreamHandler` which uses the provided `DataStreamSerializer` to process incoming `Data`. + /// + /// - Parameters: + /// - serializer: `DataStreamSerializer` used to process incoming `Data`. Its work is done on the `serializationQueue`. + /// - queue: `DispatchQueue` on which to perform `StreamHandler` closure. + /// - stream: `StreamHandler` closure called as `Data` is received. May be called multiple times. + /// + /// - Returns: The `DataStreamRequest`. + @discardableResult + public func responseStream(using serializer: Serializer, + on queue: DispatchQueue = .main, + stream: @escaping Handler) -> Self { + let parser = { [unowned self] (data: Data) in + serializationQueue.async { + // Start work on serialization queue. + let result = Result { try serializer.serialize(data) } + .mapError { $0.asAFError(or: .responseSerializationFailed(reason: .customSerializationFailed(error: $0))) } + // End work on serialization queue. + self.underlyingQueue.async { + self.eventMonitor?.request(self, didParseStream: result) + + if result.isFailure, self.automaticallyCancelOnStreamError { + self.cancel() + } + + queue.async { + self.capturingError { + try stream(.init(event: .stream(result), token: .init(self))) + } + + self.updateAndCompleteIfPossible() + } + } + } + } + + streamMutableState.write { $0.streams.append(parser) } + appendStreamCompletion(on: queue, stream: stream) + + return self + } + + /// Adds a `StreamHandler` which parses incoming `Data` as a UTF8 `String`. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which to perform `StreamHandler` closure. + /// - stream: `StreamHandler` closure called as `Data` is received. May be called multiple times. + /// + /// - Returns: The `DataStreamRequest`. + @discardableResult + public func responseStreamString(on queue: DispatchQueue = .main, + stream: @escaping Handler) -> Self { + let parser = { [unowned self] (data: Data) in + serializationQueue.async { + // Start work on serialization queue. + let string = String(decoding: data, as: UTF8.self) + // End work on serialization queue. + self.underlyingQueue.async { + self.eventMonitor?.request(self, didParseStream: .success(string)) + + queue.async { + self.capturingError { + try stream(.init(event: .stream(.success(string)), token: .init(self))) + } + + self.updateAndCompleteIfPossible() + } + } + } + } + + streamMutableState.write { $0.streams.append(parser) } + appendStreamCompletion(on: queue, stream: stream) + + return self + } + + private func updateAndCompleteIfPossible() { + streamMutableState.write { state in + state.numberOfExecutingStreams -= 1 + + guard state.numberOfExecutingStreams == 0, !state.enqueuedCompletionEvents.isEmpty else { return } + + let completionEvents = state.enqueuedCompletionEvents + self.underlyingQueue.async { completionEvents.forEach { $0() } } + state.enqueuedCompletionEvents.removeAll() + } + } + + /// Adds a `StreamHandler` which parses incoming `Data` using the provided `DataDecoder`. + /// + /// - Parameters: + /// - type: `Decodable` type to parse incoming `Data` into. + /// - queue: `DispatchQueue` on which to perform `StreamHandler` closure. + /// - decoder: `DataDecoder` used to decode the incoming `Data`. + /// - preprocessor: `DataPreprocessor` used to process the incoming `Data` before it's passed to the `decoder`. + /// - stream: `StreamHandler` closure called as `Data` is received. May be called multiple times. + /// + /// - Returns: The `DataStreamRequest`. + @discardableResult + public func responseStreamDecodable(of type: T.Type = T.self, + on queue: DispatchQueue = .main, + using decoder: DataDecoder = JSONDecoder(), + preprocessor: DataPreprocessor = PassthroughPreprocessor(), + stream: @escaping Handler) -> Self { + responseStream(using: DecodableStreamSerializer(decoder: decoder, dataPreprocessor: preprocessor), + stream: stream) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Result+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/Result+Alamofire.swift new file mode 100644 index 00000000..39ac2860 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Result+Alamofire.swift @@ -0,0 +1,120 @@ +// +// Result+Alamofire.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Default type of `Result` returned by Alamofire, with an `AFError` `Failure` type. +public typealias AFResult = Result + +// MARK: - Internal APIs + +extension Result { + /// Returns whether the instance is `.success`. + var isSuccess: Bool { + guard case .success = self else { return false } + return true + } + + /// Returns whether the instance is `.failure`. + var isFailure: Bool { + !isSuccess + } + + /// Returns the associated value if the result is a success, `nil` otherwise. + var success: Success? { + guard case let .success(value) = self else { return nil } + return value + } + + /// Returns the associated error value if the result is a failure, `nil` otherwise. + var failure: Failure? { + guard case let .failure(error) = self else { return nil } + return error + } + + /// Initializes a `Result` from value or error. Returns `.failure` if the error is non-nil, `.success` otherwise. + /// + /// - Parameters: + /// - value: A value. + /// - error: An `Error`. + init(value: Success, error: Failure?) { + if let error = error { + self = .failure(error) + } else { + self = .success(value) + } + } + + /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter. + /// + /// Use the `tryMap` method with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.tryMap { + /// try JSONSerialization.jsonObject(with: $0) + /// } + /// + /// - parameter transform: A closure that takes the success value of the instance. + /// + /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the + /// same failure. + func tryMap(_ transform: (Success) throws -> NewSuccess) -> Result { + switch self { + case let .success(value): + do { + return try .success(transform(value)) + } catch { + return .failure(error) + } + case let .failure(error): + return .failure(error) + } + } + + /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter. + /// + /// Use the `tryMapError` function with a closure that may throw an error. For example: + /// + /// let possibleData: Result = .success(Data(...)) + /// let possibleObject = possibleData.tryMapError { + /// try someFailableFunction(taking: $0) + /// } + /// + /// - Parameter transform: A throwing closure that takes the error of the instance. + /// + /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns + /// the same success. + func tryMapError(_ transform: (Failure) throws -> NewFailure) -> Result { + switch self { + case let .failure(error): + do { + return try .failure(transform(error)) + } catch { + return .failure(error) + } + case let .success(value): + return .success(value) + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/RetryPolicy.swift b/Carthage/Checkouts/Alamofire/Source/RetryPolicy.swift new file mode 100644 index 00000000..bb52c6c0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/RetryPolicy.swift @@ -0,0 +1,430 @@ +// +// RetryPolicy.swift +// +// Copyright (c) 2019-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +/// as well as certain types of networking errors. +open class RetryPolicy: RequestInterceptor { + /// The default retry limit for retry policies. + public static let defaultRetryLimit: UInt = 2 + + /// The default exponential backoff base for retry policies (must be a minimum of 2). + public static let defaultExponentialBackoffBase: UInt = 2 + + /// The default exponential backoff scale for retry policies. + public static let defaultExponentialBackoffScale: Double = 0.5 + + /// The default HTTP methods to retry. + /// See [RFC 2616 - Section 9.1.2](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) for more information. + public static let defaultRetryableHTTPMethods: Set = [.delete, // [Delete](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.7) - not always idempotent + .get, // [GET](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3) - generally idempotent + .head, // [HEAD](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4) - generally idempotent + .options, // [OPTIONS](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.2) - inherently idempotent + .put, // [PUT](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6) - not always idempotent + .trace // [TRACE](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.8) - inherently idempotent + ] + + /// The default HTTP status codes to retry. + /// See [RFC 2616 - Section 10](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10) for more information. + public static let defaultRetryableHTTPStatusCodes: Set = [408, // [Request Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.9) + 500, // [Internal Server Error](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1) + 502, // [Bad Gateway](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.3) + 503, // [Service Unavailable](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.4) + 504 // [Gateway Timeout](https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.5) + ] + + /// The default URL error codes to retry. + public static let defaultRetryableURLErrorCodes: Set = [ // [Security] App Transport Security disallowed a connection because there is no secure network connection. + // - [Disabled] ATS settings do not change at runtime. + // .appTransportSecurityRequiresSecureConnection, + + // [System] An app or app extension attempted to connect to a background session that is already connected to a + // process. + // - [Enabled] The other process could release the background session. + .backgroundSessionInUseByAnotherProcess, + + // [System] The shared container identifier of the URL session configuration is needed but has not been set. + // - [Disabled] Cannot change at runtime. + // .backgroundSessionRequiresSharedContainer, + + // [System] The app is suspended or exits while a background data task is processing. + // - [Enabled] App can be foregrounded or launched to recover. + .backgroundSessionWasDisconnected, + + // [Network] The URL Loading system received bad data from the server. + // - [Enabled] Server could return valid data when retrying. + .badServerResponse, + + // [Resource] A malformed URL prevented a URL request from being initiated. + // - [Disabled] URL was most likely constructed incorrectly. + // .badURL, + + // [System] A connection was attempted while a phone call is active on a network that does not support + // simultaneous phone and data communication (EDGE or GPRS). + // - [Enabled] Phone call could be ended to allow request to recover. + .callIsActive, + + // [Client] An asynchronous load has been canceled. + // - [Disabled] Request was cancelled by the client. + // .cancelled, + + // [File System] A download task couldn’t close the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotCloseFile, + + // [Network] An attempt to connect to a host failed. + // - [Enabled] Server or DNS lookup could recover during retry. + .cannotConnectToHost, + + // [File System] A download task couldn’t create the downloaded file on disk because of an I/O failure. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotCreateFile, + + // [Data] Content data received during a connection request had an unknown content encoding. + // - [Disabled] Server is unlikely to modify the content encoding during a retry. + // .cannotDecodeContentData, + + // [Data] Content data received during a connection request could not be decoded for a known content encoding. + // - [Disabled] Server is unlikely to modify the content encoding during a retry. + // .cannotDecodeRawData, + + // [Network] The host name for a URL could not be resolved. + // - [Enabled] Server or DNS lookup could recover during retry. + .cannotFindHost, + + // [Network] A request to load an item only from the cache could not be satisfied. + // - [Enabled] Cache could be populated during a retry. + .cannotLoadFromNetwork, + + // [File System] A download task was unable to move a downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotMoveFile, + + // [File System] A download task was unable to open the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotOpenFile, + + // [Data] A task could not parse a response. + // - [Disabled] Invalid response is unlikely to recover with retry. + // .cannotParseResponse, + + // [File System] A download task was unable to remove a downloaded file from disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotRemoveFile, + + // [File System] A download task was unable to write to the downloaded file on disk. + // - [Disabled] File system error is unlikely to recover with retry. + // .cannotWriteToFile, + + // [Security] A client certificate was rejected. + // - [Disabled] Client certificate is unlikely to change with retry. + // .clientCertificateRejected, + + // [Security] A client certificate was required to authenticate an SSL connection during a request. + // - [Disabled] Client certificate is unlikely to be provided with retry. + // .clientCertificateRequired, + + // [Data] The length of the resource data exceeds the maximum allowed. + // - [Disabled] Resource will likely still exceed the length maximum on retry. + // .dataLengthExceedsMaximum, + + // [System] The cellular network disallowed a connection. + // - [Enabled] WiFi connection could be established during retry. + .dataNotAllowed, + + // [Network] The host address could not be found via DNS lookup. + // - [Enabled] DNS lookup could succeed during retry. + .dnsLookupFailed, + + // [Data] A download task failed to decode an encoded file during the download. + // - [Enabled] Server could correct the decoding issue with retry. + .downloadDecodingFailedMidStream, + + // [Data] A download task failed to decode an encoded file after downloading. + // - [Enabled] Server could correct the decoding issue with retry. + .downloadDecodingFailedToComplete, + + // [File System] A file does not exist. + // - [Disabled] File system error is unlikely to recover with retry. + // .fileDoesNotExist, + + // [File System] A request for an FTP file resulted in the server responding that the file is not a plain file, + // but a directory. + // - [Disabled] FTP directory is not likely to change to a file during a retry. + // .fileIsDirectory, + + // [Network] A redirect loop has been detected or the threshold for number of allowable redirects has been + // exceeded (currently 16). + // - [Disabled] The redirect loop is unlikely to be resolved within the retry window. + // .httpTooManyRedirects, + + // [System] The attempted connection required activating a data context while roaming, but international roaming + // is disabled. + // - [Enabled] WiFi connection could be established during retry. + .internationalRoamingOff, + + // [Connectivity] A client or server connection was severed in the middle of an in-progress load. + // - [Enabled] A network connection could be established during retry. + .networkConnectionLost, + + // [File System] A resource couldn’t be read because of insufficient permissions. + // - [Disabled] Permissions are unlikely to be granted during retry. + // .noPermissionsToReadFile, + + // [Connectivity] A network resource was requested, but an internet connection has not been established and + // cannot be established automatically. + // - [Enabled] A network connection could be established during retry. + .notConnectedToInternet, + + // [Resource] A redirect was specified by way of server response code, but the server did not accompany this + // code with a redirect URL. + // - [Disabled] The redirect URL is unlikely to be supplied during a retry. + // .redirectToNonExistentLocation, + + // [Client] A body stream is needed but the client did not provide one. + // - [Disabled] The client will be unlikely to supply a body stream during retry. + // .requestBodyStreamExhausted, + + // [Resource] A requested resource couldn’t be retrieved. + // - [Disabled] The resource is unlikely to become available during the retry window. + // .resourceUnavailable, + + // [Security] An attempt to establish a secure connection failed for reasons that can’t be expressed more + // specifically. + // - [Enabled] The secure connection could be established during a retry given the lack of specificity + // provided by the error. + .secureConnectionFailed, + + // [Security] A server certificate had a date which indicates it has expired, or is not yet valid. + // - [Enabled] The server certificate could become valid within the retry window. + .serverCertificateHasBadDate, + + // [Security] A server certificate was not signed by any root server. + // - [Disabled] The server certificate is unlikely to change during the retry window. + // .serverCertificateHasUnknownRoot, + + // [Security] A server certificate is not yet valid. + // - [Enabled] The server certificate could become valid within the retry window. + .serverCertificateNotYetValid, + + // [Security] A server certificate was signed by a root server that isn’t trusted. + // - [Disabled] The server certificate is unlikely to become trusted within the retry window. + // .serverCertificateUntrusted, + + // [Network] An asynchronous operation timed out. + // - [Enabled] The request timed out for an unknown reason and should be retried. + .timedOut + + // [System] The URL Loading System encountered an error that it can’t interpret. + // - [Disabled] The error could not be interpreted and is unlikely to be recovered from during a retry. + // .unknown, + + // [Resource] A properly formed URL couldn’t be handled by the framework. + // - [Disabled] The URL is unlikely to change during a retry. + // .unsupportedURL, + + // [Client] Authentication is required to access a resource. + // - [Disabled] The user authentication is unlikely to be provided by retrying. + // .userAuthenticationRequired, + + // [Client] An asynchronous request for authentication has been canceled by the user. + // - [Disabled] The user cancelled authentication and explicitly took action to not retry. + // .userCancelledAuthentication, + + // [Resource] A server reported that a URL has a non-zero content length, but terminated the network connection + // gracefully without sending any data. + // - [Disabled] The server is unlikely to provide data during the retry window. + // .zeroByteResource, + ] + + /// The total number of times the request is allowed to be retried. + public let retryLimit: UInt + + /// The base of the exponential backoff policy (should always be greater than or equal to 2). + public let exponentialBackoffBase: UInt + + /// The scale of the exponential backoff. + public let exponentialBackoffScale: Double + + /// The HTTP methods that are allowed to be retried. + public let retryableHTTPMethods: Set + + /// The HTTP status codes that are automatically retried by the policy. + public let retryableHTTPStatusCodes: Set + + /// The URL error codes that are automatically retried by the policy. + public let retryableURLErrorCodes: Set + + /// Creates a `RetryPolicy` from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. `2` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. `2` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. `0.5` by default. + /// - retryableHTTPMethods: The HTTP methods that are allowed to be retried. + /// `RetryPolicy.defaultRetryableHTTPMethods` by default. + /// - retryableHTTPStatusCodes: The HTTP status codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableHTTPStatusCodes` by default. + /// - retryableURLErrorCodes: The URL error codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableURLErrorCodes` by default. + public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods, + retryableHTTPStatusCodes: Set = RetryPolicy.defaultRetryableHTTPStatusCodes, + retryableURLErrorCodes: Set = RetryPolicy.defaultRetryableURLErrorCodes) { + precondition(exponentialBackoffBase >= 2, "The `exponentialBackoffBase` must be a minimum of 2.") + + self.retryLimit = retryLimit + self.exponentialBackoffBase = exponentialBackoffBase + self.exponentialBackoffScale = exponentialBackoffScale + self.retryableHTTPMethods = retryableHTTPMethods + self.retryableHTTPStatusCodes = retryableHTTPStatusCodes + self.retryableURLErrorCodes = retryableURLErrorCodes + } + + open func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + if request.retryCount < retryLimit, shouldRetry(request: request, dueTo: error) { + completion(.retryWithDelay(pow(Double(exponentialBackoffBase), Double(request.retryCount)) * exponentialBackoffScale)) + } else { + completion(.doNotRetry) + } + } + + /// Determines whether or not to retry the provided `Request`. + /// + /// - Parameters: + /// - request: `Request` that failed due to the provided `Error`. + /// - error: `Error` encountered while executing the `Request`. + /// + /// - Returns: `Bool` determining whether or not to retry the `Request`. + open func shouldRetry(request: Request, dueTo error: Error) -> Bool { + guard let httpMethod = request.request?.method, retryableHTTPMethods.contains(httpMethod) else { return false } + + if let statusCode = request.response?.statusCode, retryableHTTPStatusCodes.contains(statusCode) { + return true + } else { + let errorCode = (error as? URLError)?.code + let afErrorCode = (error.asAFError?.underlyingError as? URLError)?.code + + guard let code = errorCode ?? afErrorCode else { return false } + + return retryableURLErrorCodes.contains(code) + } + } +} + +extension RequestInterceptor where Self == RetryPolicy { + /// Provides a default `RetryPolicy` instance. + public static var retryPolicy: RetryPolicy { RetryPolicy() } + + /// Creates an `RetryPolicy` from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. `2` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. `2` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. `0.5` by default. + /// - retryableHTTPMethods: The HTTP methods that are allowed to be retried. + /// `RetryPolicy.defaultRetryableHTTPMethods` by default. + /// - retryableHTTPStatusCodes: The HTTP status codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableHTTPStatusCodes` by default. + /// - retryableURLErrorCodes: The URL error codes that are automatically retried by the policy. + /// `RetryPolicy.defaultRetryableURLErrorCodes` by default. + /// + /// - Returns: The `RetryPolicy` + public static func retryPolicy(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods, + retryableHTTPStatusCodes: Set = RetryPolicy.defaultRetryableHTTPStatusCodes, + retryableURLErrorCodes: Set = RetryPolicy.defaultRetryableURLErrorCodes) -> RetryPolicy { + RetryPolicy(retryLimit: retryLimit, + exponentialBackoffBase: exponentialBackoffBase, + exponentialBackoffScale: exponentialBackoffScale, + retryableHTTPMethods: retryableHTTPMethods, + retryableHTTPStatusCodes: retryableHTTPStatusCodes, + retryableURLErrorCodes: retryableURLErrorCodes) + } +} + +// MARK: - + +/// A retry policy that automatically retries idempotent requests for network connection lost errors. For more +/// information about retrying network connection lost errors, please refer to Apple's +/// [technical document](https://developer.apple.com/library/content/qa/qa1941/_index.html). +open class ConnectionLostRetryPolicy: RetryPolicy { + /// Creates a `ConnectionLostRetryPolicy` instance from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. + /// `RetryPolicy.defaultRetryLimit` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. + /// `RetryPolicy.defaultExponentialBackoffBase` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. + /// `RetryPolicy.defaultExponentialBackoffScale` by default. + /// - retryableHTTPMethods: The idempotent http methods to retry. + /// `RetryPolicy.defaultRetryableHTTPMethods` by default. + public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods) { + super.init(retryLimit: retryLimit, + exponentialBackoffBase: exponentialBackoffBase, + exponentialBackoffScale: exponentialBackoffScale, + retryableHTTPMethods: retryableHTTPMethods, + retryableHTTPStatusCodes: [], + retryableURLErrorCodes: [.networkConnectionLost]) + } +} + +extension RequestInterceptor where Self == ConnectionLostRetryPolicy { + /// Provides a default `ConnectionLostRetryPolicy` instance. + public static var connectionLostRetryPolicy: ConnectionLostRetryPolicy { ConnectionLostRetryPolicy() } + + /// Creates a `ConnectionLostRetryPolicy` instance from the specified parameters. + /// + /// - Parameters: + /// - retryLimit: The total number of times the request is allowed to be retried. + /// `RetryPolicy.defaultRetryLimit` by default. + /// - exponentialBackoffBase: The base of the exponential backoff policy. + /// `RetryPolicy.defaultExponentialBackoffBase` by default. + /// - exponentialBackoffScale: The scale of the exponential backoff. + /// `RetryPolicy.defaultExponentialBackoffScale` by default. + /// - retryableHTTPMethods: The idempotent http methods to retry. + /// + /// - Returns: The `ConnectionLostRetryPolicy`. + public static func connectionLostRetryPolicy(retryLimit: UInt = RetryPolicy.defaultRetryLimit, + exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase, + exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale, + retryableHTTPMethods: Set = RetryPolicy.defaultRetryableHTTPMethods) -> ConnectionLostRetryPolicy { + ConnectionLostRetryPolicy(retryLimit: retryLimit, + exponentialBackoffBase: exponentialBackoffBase, + exponentialBackoffScale: exponentialBackoffScale, + retryableHTTPMethods: retryableHTTPMethods) + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/ServerTrustEvaluation.swift b/Carthage/Checkouts/Alamofire/Source/ServerTrustEvaluation.swift new file mode 100644 index 00000000..e490ab4d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/ServerTrustEvaluation.swift @@ -0,0 +1,772 @@ +// +// ServerTrustEvaluation.swift +// +// Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Responsible for managing the mapping of `ServerTrustEvaluating` values to given hosts. +open class ServerTrustManager { + /// Determines whether all hosts for this `ServerTrustManager` must be evaluated. `true` by default. + public let allHostsMustBeEvaluated: Bool + + /// The dictionary of policies mapped to a particular host. + public let evaluators: [String: ServerTrustEvaluating] + + /// Initializes the `ServerTrustManager` instance with the given evaluators. + /// + /// Since different servers and web services can have different leaf certificates, intermediate and even root + /// certificates, it is important to have the flexibility to specify evaluation policies on a per host basis. This + /// allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key + /// pinning for host3 and disabling evaluation for host4. + /// + /// - Parameters: + /// - allHostsMustBeEvaluated: The value determining whether all hosts for this instance must be evaluated. `true` + /// by default. + /// - evaluators: A dictionary of evaluators mapped to hosts. + public init(allHostsMustBeEvaluated: Bool = true, evaluators: [String: ServerTrustEvaluating]) { + self.allHostsMustBeEvaluated = allHostsMustBeEvaluated + self.evaluators = evaluators + } + + #if canImport(Security) + /// Returns the `ServerTrustEvaluating` value for the given host, if one is set. + /// + /// By default, this method will return the policy that perfectly matches the given host. Subclasses could override + /// this method and implement more complex mapping implementations such as wildcards. + /// + /// - Parameter host: The host to use when searching for a matching policy. + /// + /// - Returns: The `ServerTrustEvaluating` value for the given host if found, `nil` otherwise. + /// - Throws: `AFError.serverTrustEvaluationFailed` if `allHostsMustBeEvaluated` is `true` and no matching + /// evaluators are found. + open func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating? { + guard let evaluator = evaluators[host] else { + if allHostsMustBeEvaluated { + throw AFError.serverTrustEvaluationFailed(reason: .noRequiredEvaluator(host: host)) + } + + return nil + } + + return evaluator + } + #endif +} + +/// A protocol describing the API used to evaluate server trusts. +public protocol ServerTrustEvaluating { + #if !canImport(Security) + // Implement this once other platforms have API for evaluating server trusts. + #else + /// Evaluates the given `SecTrust` value for the given `host`. + /// + /// - Parameters: + /// - trust: The `SecTrust` value to evaluate. + /// - host: The host for which to evaluate the `SecTrust` value. + /// + /// - Returns: A `Bool` indicating whether the evaluator considers the `SecTrust` value valid for `host`. + func evaluate(_ trust: SecTrust, forHost host: String) throws + #endif +} + +// MARK: - Server Trust Evaluators + +#if canImport(Security) +/// An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +/// host provided by the challenge. Applications are encouraged to always validate the host in production environments +/// to guarantee the validity of the server's certificate chain. +public final class DefaultTrustEvaluator: ServerTrustEvaluating { + private let validateHost: Bool + + /// Creates a `DefaultTrustEvaluator`. + /// + /// - Parameter validateHost: Determines whether or not the evaluator should validate the host. `true` by default. + public init(validateHost: Bool = true) { + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + if validateHost { + try trust.af.performValidation(forHost: host) + } + + try trust.af.performDefaultValidation(forHost: host) + } +} + +/// An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +/// the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +/// Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +/// 10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +/// environments to guarantee the validity of the server's certificate chain. +public final class RevocationTrustEvaluator: ServerTrustEvaluating { + /// Represents the options to be use when evaluating the status of a certificate. + /// Only Revocation Policy Constants are valid, and can be found in [Apple's documentation](https://developer.apple.com/documentation/security/certificate_key_and_trust_services/policies/1563600-revocation_policy_constants). + public struct Options: OptionSet { + /// Perform revocation checking using the CRL (Certification Revocation List) method. + public static let crl = Options(rawValue: kSecRevocationCRLMethod) + /// Consult only locally cached replies; do not use network access. + public static let networkAccessDisabled = Options(rawValue: kSecRevocationNetworkAccessDisabled) + /// Perform revocation checking using OCSP (Online Certificate Status Protocol). + public static let ocsp = Options(rawValue: kSecRevocationOCSPMethod) + /// Prefer CRL revocation checking over OCSP; by default, OCSP is preferred. + public static let preferCRL = Options(rawValue: kSecRevocationPreferCRL) + /// Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a + /// "best attempt" basis, where failure to reach the server is not considered fatal. + public static let requirePositiveResponse = Options(rawValue: kSecRevocationRequirePositiveResponse) + /// Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the + /// certificate and the value of `preferCRL`. + public static let any = Options(rawValue: kSecRevocationUseAnyAvailableMethod) + + /// The raw value of the option. + public let rawValue: CFOptionFlags + + /// Creates an `Options` value with the given `CFOptionFlags`. + /// + /// - Parameter rawValue: The `CFOptionFlags` value to initialize with. + public init(rawValue: CFOptionFlags) { + self.rawValue = rawValue + } + } + + private let performDefaultValidation: Bool + private let validateHost: Bool + private let options: Options + + /// Creates a `RevocationTrustEvaluator` using the provided parameters. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition to + /// performing the default evaluation, even if `performDefaultValidation` is `false`. + /// `true` by default. + /// - options: The `Options` to use to check the revocation status of the certificate. `.any` by + /// default. + public init(performDefaultValidation: Bool = true, validateHost: Bool = true, options: Options = .any) { + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + self.options = options + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + #if swift(>=5.9) + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, visionOS 1, *) { + try trust.af.evaluate(afterApplying: SecPolicy.af.revocation(options: options)) + } else { + try trust.af.validate(policy: SecPolicy.af.revocation(options: options)) { status, result in + AFError.serverTrustEvaluationFailed(reason: .revocationCheckFailed(output: .init(host, trust, status, result), options: options)) + } + } + #else + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + try trust.af.evaluate(afterApplying: SecPolicy.af.revocation(options: options)) + } else { + try trust.af.validate(policy: SecPolicy.af.revocation(options: options)) { status, result in + AFError.serverTrustEvaluationFailed(reason: .revocationCheckFailed(output: .init(host, trust, status, result), options: options)) + } + } + #endif + } +} + +extension ServerTrustEvaluating where Self == RevocationTrustEvaluator { + /// Provides a default `RevocationTrustEvaluator` instance. + public static var revocationChecking: RevocationTrustEvaluator { RevocationTrustEvaluator() } + + /// Creates a `RevocationTrustEvaluator` using the provided parameters. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition + /// to performing the default evaluation, even if `performDefaultValidation` is + /// `false`. `true` by default. + /// - options: The `Options` to use to check the revocation status of the certificate. `.any` + /// by default. + /// - Returns: The `RevocationTrustEvaluator`. + public static func revocationChecking(performDefaultValidation: Bool = true, + validateHost: Bool = true, + options: RevocationTrustEvaluator.Options = .any) -> RevocationTrustEvaluator { + RevocationTrustEvaluator(performDefaultValidation: performDefaultValidation, + validateHost: validateHost, + options: options) + } +} + +/// Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +/// certificates match one of the server certificates. By validating both the certificate chain and host, certificate +/// pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +/// Applications are encouraged to always validate the host and require a valid certificate chain in production +/// environments. +public final class PinnedCertificatesTrustEvaluator: ServerTrustEvaluating { + private let certificates: [SecCertificate] + private let acceptSelfSignedCertificates: Bool + private let performDefaultValidation: Bool + private let validateHost: Bool + + /// Creates a `PinnedCertificatesTrustEvaluator` from the provided parameters. + /// + /// - Parameters: + /// - certificates: The certificates to use to evaluate the trust. All `cer`, `crt`, and `der` + /// certificates in `Bundle.main` by default. + /// - acceptSelfSignedCertificates: Adds the provided certificates as anchors for the trust evaluation, allowing + /// self-signed certificates to pass. `false` by default. THIS SETTING SHOULD BE + /// FALSE IN PRODUCTION! + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition + /// to performing the default evaluation, even if `performDefaultValidation` is + /// `false`. `true` by default. + public init(certificates: [SecCertificate] = Bundle.main.af.certificates, + acceptSelfSignedCertificates: Bool = false, + performDefaultValidation: Bool = true, + validateHost: Bool = true) { + self.certificates = certificates + self.acceptSelfSignedCertificates = acceptSelfSignedCertificates + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + guard !certificates.isEmpty else { + throw AFError.serverTrustEvaluationFailed(reason: .noCertificatesFound) + } + + if acceptSelfSignedCertificates { + try trust.af.setAnchorCertificates(certificates) + } + + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + let serverCertificatesData = Set(trust.af.certificateData) + let pinnedCertificatesData = Set(certificates.af.data) + let pinnedCertificatesInServerData = !serverCertificatesData.isDisjoint(with: pinnedCertificatesData) + if !pinnedCertificatesInServerData { + throw AFError.serverTrustEvaluationFailed(reason: .certificatePinningFailed(host: host, + trust: trust, + pinnedCertificates: certificates, + serverCertificates: trust.af.certificates)) + } + } +} + +extension ServerTrustEvaluating where Self == PinnedCertificatesTrustEvaluator { + /// Provides a default `PinnedCertificatesTrustEvaluator` instance. + public static var pinnedCertificates: PinnedCertificatesTrustEvaluator { PinnedCertificatesTrustEvaluator() } + + /// Creates a `PinnedCertificatesTrustEvaluator` using the provided parameters. + /// + /// - Parameters: + /// - certificates: The certificates to use to evaluate the trust. All `cer`, `crt`, and `der` + /// certificates in `Bundle.main` by default. + /// - acceptSelfSignedCertificates: Adds the provided certificates as anchors for the trust evaluation, allowing + /// self-signed certificates to pass. `false` by default. THIS SETTING SHOULD BE + /// FALSE IN PRODUCTION! + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition + /// to performing the default evaluation, even if `performDefaultValidation` is + /// `false`. `true` by default. + public static func pinnedCertificates(certificates: [SecCertificate] = Bundle.main.af.certificates, + acceptSelfSignedCertificates: Bool = false, + performDefaultValidation: Bool = true, + validateHost: Bool = true) -> PinnedCertificatesTrustEvaluator { + PinnedCertificatesTrustEvaluator(certificates: certificates, + acceptSelfSignedCertificates: acceptSelfSignedCertificates, + performDefaultValidation: performDefaultValidation, + validateHost: validateHost) + } +} + +/// Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +/// public keys match one of the server certificate public keys. By validating both the certificate chain and host, +/// public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +/// Applications are encouraged to always validate the host and require a valid certificate chain in production +/// environments. +public final class PublicKeysTrustEvaluator: ServerTrustEvaluating { + private let keys: [SecKey] + private let performDefaultValidation: Bool + private let validateHost: Bool + + /// Creates a `PublicKeysTrustEvaluator` from the provided parameters. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - keys: The `SecKey`s to use to validate public keys. Defaults to the public keys of all + /// certificates included in the main bundle. + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition to + /// performing the default evaluation, even if `performDefaultValidation` is `false`. + /// `true` by default. + public init(keys: [SecKey] = Bundle.main.af.publicKeys, + performDefaultValidation: Bool = true, + validateHost: Bool = true) { + self.keys = keys + self.performDefaultValidation = performDefaultValidation + self.validateHost = validateHost + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + guard !keys.isEmpty else { + throw AFError.serverTrustEvaluationFailed(reason: .noPublicKeysFound) + } + + if performDefaultValidation { + try trust.af.performDefaultValidation(forHost: host) + } + + if validateHost { + try trust.af.performValidation(forHost: host) + } + + let pinnedKeysInServerKeys: Bool = { + for serverPublicKey in trust.af.publicKeys { + if keys.contains(serverPublicKey) { + return true + } + } + return false + }() + + if !pinnedKeysInServerKeys { + throw AFError.serverTrustEvaluationFailed(reason: .publicKeyPinningFailed(host: host, + trust: trust, + pinnedKeys: keys, + serverKeys: trust.af.publicKeys)) + } + } +} + +extension ServerTrustEvaluating where Self == PublicKeysTrustEvaluator { + /// Provides a default `PublicKeysTrustEvaluator` instance. + public static var publicKeys: PublicKeysTrustEvaluator { PublicKeysTrustEvaluator() } + + /// Creates a `PublicKeysTrustEvaluator` from the provided parameters. + /// + /// - Note: Default and host validation will fail when using this evaluator with self-signed certificates. Use + /// `PinnedCertificatesTrustEvaluator` if you need to use self-signed certificates. + /// + /// - Parameters: + /// - keys: The `SecKey`s to use to validate public keys. Defaults to the public keys of all + /// certificates included in the main bundle. + /// - performDefaultValidation: Determines whether default validation should be performed in addition to + /// evaluating the pinned certificates. `true` by default. + /// - validateHost: Determines whether or not the evaluator should validate the host, in addition to + /// performing the default evaluation, even if `performDefaultValidation` is `false`. + /// `true` by default. + public static func publicKeys(keys: [SecKey] = Bundle.main.af.publicKeys, + performDefaultValidation: Bool = true, + validateHost: Bool = true) -> PublicKeysTrustEvaluator { + PublicKeysTrustEvaluator(keys: keys, performDefaultValidation: performDefaultValidation, validateHost: validateHost) + } +} + +/// Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +/// evaluators consider it valid. +public final class CompositeTrustEvaluator: ServerTrustEvaluating { + private let evaluators: [ServerTrustEvaluating] + + /// Creates a `CompositeTrustEvaluator` from the provided evaluators. + /// + /// - Parameter evaluators: The `ServerTrustEvaluating` values used to evaluate the server trust. + public init(evaluators: [ServerTrustEvaluating]) { + self.evaluators = evaluators + } + + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + try evaluators.evaluate(trust, forHost: host) + } +} + +extension ServerTrustEvaluating where Self == CompositeTrustEvaluator { + /// Creates a `CompositeTrustEvaluator` from the provided evaluators. + /// + /// - Parameter evaluators: The `ServerTrustEvaluating` values used to evaluate the server trust. + public static func composite(evaluators: [ServerTrustEvaluating]) -> CompositeTrustEvaluator { + CompositeTrustEvaluator(evaluators: evaluators) + } +} + +/// Disables all evaluation which in turn will always consider any server trust as valid. +/// +/// - Note: Instead of disabling server trust evaluation, it's a better idea to configure systems to properly trust test +/// certificates, as outlined in [this Apple tech note](https://developer.apple.com/library/archive/qa/qa1948/_index.html). +/// +/// **THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!** +@available(*, deprecated, renamed: "DisabledTrustEvaluator", message: "DisabledEvaluator has been renamed DisabledTrustEvaluator.") +public typealias DisabledEvaluator = DisabledTrustEvaluator + +/// Disables all evaluation which in turn will always consider any server trust as valid. +/// +/// +/// - Note: Instead of disabling server trust evaluation, it's a better idea to configure systems to properly trust test +/// certificates, as outlined in [this Apple tech note](https://developer.apple.com/library/archive/qa/qa1948/_index.html). +/// +/// **THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!** +public final class DisabledTrustEvaluator: ServerTrustEvaluating { + /// Creates an instance. + public init() {} + + public func evaluate(_ trust: SecTrust, forHost host: String) throws {} +} + +// MARK: - Extensions + +extension Array where Element == ServerTrustEvaluating { + #if os(Linux) || os(Windows) || os(Android) + // Add this same convenience method for Linux/Windows. + #else + /// Evaluates the given `SecTrust` value for the given `host`. + /// + /// - Parameters: + /// - trust: The `SecTrust` value to evaluate. + /// - host: The host for which to evaluate the `SecTrust` value. + /// + /// - Returns: Whether or not the evaluator considers the `SecTrust` value valid for `host`. + public func evaluate(_ trust: SecTrust, forHost host: String) throws { + for evaluator in self { + try evaluator.evaluate(trust, forHost: host) + } + } + #endif +} + +extension Bundle: AlamofireExtended {} +extension AlamofireExtension where ExtendedType: Bundle { + /// Returns all valid `cer`, `crt`, and `der` certificates in the bundle. + public var certificates: [SecCertificate] { + paths(forResourcesOfTypes: [".cer", ".CER", ".crt", ".CRT", ".der", ".DER"]).compactMap { path in + guard + let certificateData = try? Data(contentsOf: URL(fileURLWithPath: path)) as CFData, + let certificate = SecCertificateCreateWithData(nil, certificateData) else { return nil } + + return certificate + } + } + + /// Returns all public keys for the valid certificates in the bundle. + public var publicKeys: [SecKey] { + certificates.af.publicKeys + } + + /// Returns all pathnames for the resources identified by the provided file extensions. + /// + /// - Parameter types: The filename extensions locate. + /// + /// - Returns: All pathnames for the given filename extensions. + public func paths(forResourcesOfTypes types: [String]) -> [String] { + Array(Set(types.flatMap { type.paths(forResourcesOfType: $0, inDirectory: nil) })) + } +} + +extension SecTrust: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == SecTrust { + /// Evaluates `self` after applying the `SecPolicy` value provided. + /// + /// - Parameter policy: The `SecPolicy` to apply to `self` before evaluation. + /// + /// - Throws: Any `Error` from applying the `SecPolicy` or from evaluation. + @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) + public func evaluate(afterApplying policy: SecPolicy) throws { + try apply(policy: policy).af.evaluate() + } + + /// Attempts to validate `self` using the `SecPolicy` provided and transforming any error produced using the closure passed. + /// + /// - Parameters: + /// - policy: The `SecPolicy` used to evaluate `self`. + /// - errorProducer: The closure used transform the failed `OSStatus` and `SecTrustResultType`. + /// - Throws: Any `Error` from applying the `policy`, or the result of `errorProducer` if validation fails. + @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:)") + @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(afterApplying:)") + @available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:)") + @available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(afterApplying:)") + public func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws { + try apply(policy: policy).af.validate(errorProducer: errorProducer) + } + + /// Applies a `SecPolicy` to `self`, throwing if it fails. + /// + /// - Parameter policy: The `SecPolicy`. + /// + /// - Returns: `self`, with the policy applied. + /// - Throws: An `AFError.serverTrustEvaluationFailed` instance with a `.policyApplicationFailed` reason. + public func apply(policy: SecPolicy) throws -> SecTrust { + let status = SecTrustSetPolicies(type, policy) + + guard status.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .policyApplicationFailed(trust: type, + policy: policy, + status: status)) + } + + return type + } + + /// Evaluate `self`, throwing an `Error` if evaluation fails. + /// + /// - Throws: `AFError.serverTrustEvaluationFailed` with reason `.trustValidationFailed` and associated error from + /// the underlying evaluation. + @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) + public func evaluate() throws { + var error: CFError? + let evaluationSucceeded = SecTrustEvaluateWithError(type, &error) + + if !evaluationSucceeded { + throw AFError.serverTrustEvaluationFailed(reason: .trustEvaluationFailed(error: error)) + } + } + + /// Validate `self`, passing any failure values through `errorProducer`. + /// + /// - Parameter errorProducer: The closure used to transform the failed `OSStatus` and `SecTrustResultType` into an + /// `Error`. + /// - Throws: The `Error` produced by the `errorProducer` closure. + @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate()") + @available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate()") + @available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate()") + @available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate()") + public func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws { + var result = SecTrustResultType.invalid + let status = SecTrustEvaluate(type, &result) + + guard status.af.isSuccess && result.af.isSuccess else { + throw errorProducer(status, result) + } + } + + /// Sets a custom certificate chain on `self`, allowing full validation of a self-signed certificate and its chain. + /// + /// - Parameter certificates: The `SecCertificate`s to add to the chain. + /// - Throws: Any error produced when applying the new certificate chain. + public func setAnchorCertificates(_ certificates: [SecCertificate]) throws { + // Add additional anchor certificates. + let status = SecTrustSetAnchorCertificates(type, certificates as CFArray) + guard status.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: status, + certificates: certificates)) + } + + // Trust only the set anchor certs. + let onlyStatus = SecTrustSetAnchorCertificatesOnly(type, true) + guard onlyStatus.af.isSuccess else { + throw AFError.serverTrustEvaluationFailed(reason: .settingAnchorCertificatesFailed(status: onlyStatus, + certificates: certificates)) + } + } + + /// The public keys contained in `self`. + public var publicKeys: [SecKey] { + certificates.af.publicKeys + } + + /// The `SecCertificate`s contained in `self`. + public var certificates: [SecCertificate] { + #if swift(>=5.9) + if #available(iOS 15, macOS 12, tvOS 15, watchOS 8, visionOS 1, *) { + return (SecTrustCopyCertificateChain(type) as? [SecCertificate]) ?? [] + } else { + return (0..=5.5.1) // Xcode 13.1 / 2021 SDKs. + if #available(iOS 15, macOS 12, tvOS 15, watchOS 8, *) { + return (SecTrustCopyCertificateChain(type) as? [SecCertificate]) ?? [] + } else { + return (0..=5.9) + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, visionOS 1, *) { + try evaluate(afterApplying: SecPolicy.af.default) + } else { + try validate(policy: SecPolicy.af.default) { status, result in + AFError.serverTrustEvaluationFailed(reason: .defaultEvaluationFailed(output: .init(host, type, status, result))) + } + } + #else + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + try evaluate(afterApplying: SecPolicy.af.default) + } else { + try validate(policy: SecPolicy.af.default) { status, result in + AFError.serverTrustEvaluationFailed(reason: .defaultEvaluationFailed(output: .init(host, type, status, result))) + } + } + #endif + } + + /// Validates `self` after applying `SecPolicy.af.hostname(host)`, which performs the default validation as well as + /// hostname validation. + /// + /// - Parameter host: The hostname to use in the validation. + /// - Throws: An `AFError.serverTrustEvaluationFailed` instance with a `.defaultEvaluationFailed` reason. + public func performValidation(forHost host: String) throws { + #if swift(>=5.9) + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, visionOS 1, *) { + try evaluate(afterApplying: SecPolicy.af.hostname(host)) + } else { + try validate(policy: SecPolicy.af.hostname(host)) { status, result in + AFError.serverTrustEvaluationFailed(reason: .hostValidationFailed(output: .init(host, type, status, result))) + } + } + #else + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + try evaluate(afterApplying: SecPolicy.af.hostname(host)) + } else { + try validate(policy: SecPolicy.af.hostname(host)) { status, result in + AFError.serverTrustEvaluationFailed(reason: .hostValidationFailed(output: .init(host, type, status, result))) + } + } + #endif + } +} + +extension SecPolicy: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == SecPolicy { + /// Creates a `SecPolicy` instance which will validate server certificates but not require a host name match. + public static let `default` = SecPolicyCreateSSL(true, nil) + + /// Creates a `SecPolicy` instance which will validate server certificates and much match the provided hostname. + /// + /// - Parameter hostname: The hostname to validate against. + /// + /// - Returns: The `SecPolicy`. + public static func hostname(_ hostname: String) -> SecPolicy { + SecPolicyCreateSSL(true, hostname as CFString) + } + + /// Creates a `SecPolicy` which checks the revocation of certificates. + /// + /// - Parameter options: The `RevocationTrustEvaluator.Options` for evaluation. + /// + /// - Returns: The `SecPolicy`. + /// - Throws: An `AFError.serverTrustEvaluationFailed` error with reason `.revocationPolicyCreationFailed` + /// if the policy cannot be created. + public static func revocation(options: RevocationTrustEvaluator.Options) throws -> SecPolicy { + guard let policy = SecPolicyCreateRevocation(options.rawValue) else { + throw AFError.serverTrustEvaluationFailed(reason: .revocationPolicyCreationFailed) + } + + return policy + } +} + +extension Array: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == [SecCertificate] { + /// All `Data` values for the contained `SecCertificate`s. + public var data: [Data] { + type.map { SecCertificateCopyData($0) as Data } + } + + /// All public `SecKey` values for the contained `SecCertificate`s. + public var publicKeys: [SecKey] { + type.compactMap(\.af.publicKey) + } +} + +extension SecCertificate: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == SecCertificate { + /// The public key for `self`, if it can be extracted. + /// + /// - Note: On 2020 OSes and newer, only RSA and ECDSA keys are supported. + /// + public var publicKey: SecKey? { + let policy = SecPolicyCreateBasicX509() + var trust: SecTrust? + let trustCreationStatus = SecTrustCreateWithCertificates(type, policy, &trust) + + guard let createdTrust = trust, trustCreationStatus == errSecSuccess else { return nil } + + #if swift(>=5.9) + if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, visionOS 1, *) { + return SecTrustCopyKey(createdTrust) + } else { + return SecTrustCopyPublicKey(createdTrust) + } + #else + if #available(iOS 14, macOS 11, tvOS 14, watchOS 7, *) { + return SecTrustCopyKey(createdTrust) + } else { + return SecTrustCopyPublicKey(createdTrust) + } + #endif + } +} + +extension OSStatus: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == OSStatus { + /// Returns whether `self` is `errSecSuccess`. + public var isSuccess: Bool { type == errSecSuccess } +} + +extension SecTrustResultType: AlamofireExtended {} +extension AlamofireExtension where ExtendedType == SecTrustResultType { + /// Returns whether `self is `.unspecified` or `.proceed`. + public var isSuccess: Bool { + type == .unspecified || type == .proceed + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Source/Session.swift b/Carthage/Checkouts/Alamofire/Source/Session.swift new file mode 100644 index 00000000..4232f859 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Session.swift @@ -0,0 +1,1264 @@ +// +// Session.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// `Session` creates and manages Alamofire's `Request` types during their lifetimes. It also provides common +/// functionality for all `Request`s, including queuing, interception, trust management, redirect handling, and response +/// cache handling. +open class Session { + /// Shared singleton instance used by all `AF.request` APIs. Cannot be modified. + public static let `default` = Session() + + /// Underlying `URLSession` used to create `URLSessionTasks` for this instance, and for which this instance's + /// `delegate` handles `URLSessionDelegate` callbacks. + /// + /// - Note: This instance should **NOT** be used to interact with the underlying `URLSessionTask`s. Doing so will + /// break internal Alamofire logic that tracks those tasks. + /// + public let session: URLSession + /// Instance's `SessionDelegate`, which handles the `URLSessionDelegate` methods and `Request` interaction. + public let delegate: SessionDelegate + /// Root `DispatchQueue` for all internal callbacks and state update. **MUST** be a serial queue. + public let rootQueue: DispatchQueue + /// Value determining whether this instance automatically calls `resume()` on all created `Request`s. + public let startRequestsImmediately: Bool + /// `DispatchQueue` on which `URLRequest`s are created asynchronously. By default this queue uses `rootQueue` as its + /// `target`, but a separate queue can be used if request creation is determined to be a bottleneck. Always profile + /// and test before introducing an additional queue. + public let requestQueue: DispatchQueue + /// `DispatchQueue` passed to all `Request`s on which they perform their response serialization. By default this + /// queue uses `rootQueue` as its `target` but a separate queue can be used if response serialization is determined + /// to be a bottleneck. Always profile and test before introducing an additional queue. + public let serializationQueue: DispatchQueue + /// `RequestInterceptor` used for all `Request` created by the instance. `RequestInterceptor`s can also be set on a + /// per-`Request` basis, in which case the `Request`'s interceptor takes precedence over this value. + public let interceptor: RequestInterceptor? + /// `ServerTrustManager` instance used to evaluate all trust challenges and provide certificate and key pinning. + public let serverTrustManager: ServerTrustManager? + /// `RedirectHandler` instance used to provide customization for request redirection. + public let redirectHandler: RedirectHandler? + /// `CachedResponseHandler` instance used to provide customization of cached response handling. + public let cachedResponseHandler: CachedResponseHandler? + /// `CompositeEventMonitor` used to compose Alamofire's `defaultEventMonitors` and any passed `EventMonitor`s. + public let eventMonitor: CompositeEventMonitor + /// `EventMonitor`s included in all instances. `[AlamofireNotifications()]` by default. + public let defaultEventMonitors: [EventMonitor] = [AlamofireNotifications()] + + /// Internal map between `Request`s and any `URLSessionTasks` that may be in flight for them. + var requestTaskMap = RequestTaskMap() + /// `Set` of currently active `Request`s. + var activeRequests: Set = [] + /// Completion events awaiting `URLSessionTaskMetrics`. + var waitingCompletions: [URLSessionTask: () -> Void] = [:] + + /// Creates a `Session` from a `URLSession` and other parameters. + /// + /// - Note: When passing a `URLSession`, you must create the `URLSession` with a specific `delegateQueue` value and + /// pass the `delegateQueue`'s `underlyingQueue` as the `rootQueue` parameter of this initializer. + /// + /// - Parameters: + /// - session: Underlying `URLSession` for this instance. + /// - delegate: `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request` + /// interaction. + /// - rootQueue: Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a + /// serial queue. + /// - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true` + /// by default. If set to `false`, all `Request`s created must have `.resume()` called. + /// on them for them to start. + /// - requestQueue: `DispatchQueue` on which to perform `URLRequest` creation. By default this queue + /// will use the `rootQueue` as its `target`. A separate queue can be used if it's + /// determined request creation is a bottleneck, but that should only be done after + /// careful testing and profiling. `nil` by default. + /// - serializationQueue: `DispatchQueue` on which to perform all response serialization. By default this + /// queue will use the `rootQueue` as its `target`. A separate queue can be used if + /// it's determined response serialization is a bottleneck, but that should only be + /// done after careful testing and profiling. `nil` by default. + /// - interceptor: `RequestInterceptor` to be used for all `Request`s created by this instance. `nil` + /// by default. + /// - serverTrustManager: `ServerTrustManager` to be used for all trust evaluations by this instance. `nil` + /// by default. + /// - redirectHandler: `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by + /// default. + /// - cachedResponseHandler: `CachedResponseHandler` to be used by all `Request`s created by this instance. + /// `nil` by default. + /// - eventMonitors: Additional `EventMonitor`s used by the instance. Alamofire always adds a + /// `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default. + public init(session: URLSession, + delegate: SessionDelegate, + rootQueue: DispatchQueue, + startRequestsImmediately: Bool = true, + requestQueue: DispatchQueue? = nil, + serializationQueue: DispatchQueue? = nil, + interceptor: RequestInterceptor? = nil, + serverTrustManager: ServerTrustManager? = nil, + redirectHandler: RedirectHandler? = nil, + cachedResponseHandler: CachedResponseHandler? = nil, + eventMonitors: [EventMonitor] = []) { + precondition(session.configuration.identifier == nil, + "Alamofire does not support background URLSessionConfigurations.") + precondition(session.delegateQueue.underlyingQueue === rootQueue, + "Session(session:) initializer must be passed the DispatchQueue used as the delegateQueue's underlyingQueue as rootQueue.") + + self.session = session + self.delegate = delegate + self.rootQueue = rootQueue + self.startRequestsImmediately = startRequestsImmediately + self.requestQueue = requestQueue ?? DispatchQueue(label: "\(rootQueue.label).requestQueue", target: rootQueue) + self.serializationQueue = serializationQueue ?? DispatchQueue(label: "\(rootQueue.label).serializationQueue", target: rootQueue) + self.interceptor = interceptor + self.serverTrustManager = serverTrustManager + self.redirectHandler = redirectHandler + self.cachedResponseHandler = cachedResponseHandler + eventMonitor = CompositeEventMonitor(monitors: defaultEventMonitors + eventMonitors) + delegate.eventMonitor = eventMonitor + delegate.stateProvider = self + } + + /// Creates a `Session` from a `URLSessionConfiguration`. + /// + /// - Note: This initializer lets Alamofire handle the creation of the underlying `URLSession` and its + /// `delegateQueue`, and is the recommended initializer for most uses. + /// + /// - Parameters: + /// - configuration: `URLSessionConfiguration` to be used to create the underlying `URLSession`. Changes + /// to this value after being passed to this initializer will have no effect. + /// `URLSessionConfiguration.af.default` by default. + /// - delegate: `SessionDelegate` that handles `session`'s delegate callbacks as well as `Request` + /// interaction. `SessionDelegate()` by default. + /// - rootQueue: Root `DispatchQueue` for all internal callbacks and state updates. **MUST** be a + /// serial queue. `DispatchQueue(label: "org.alamofire.session.rootQueue")` by default. + /// - startRequestsImmediately: Determines whether this instance will automatically start all `Request`s. `true` + /// by default. If set to `false`, all `Request`s created must have `.resume()` called. + /// on them for them to start. + /// - requestQueue: `DispatchQueue` on which to perform `URLRequest` creation. By default this queue + /// will use the `rootQueue` as its `target`. A separate queue can be used if it's + /// determined request creation is a bottleneck, but that should only be done after + /// careful testing and profiling. `nil` by default. + /// - serializationQueue: `DispatchQueue` on which to perform all response serialization. By default this + /// queue will use the `rootQueue` as its `target`. A separate queue can be used if + /// it's determined response serialization is a bottleneck, but that should only be + /// done after careful testing and profiling. `nil` by default. + /// - interceptor: `RequestInterceptor` to be used for all `Request`s created by this instance. `nil` + /// by default. + /// - serverTrustManager: `ServerTrustManager` to be used for all trust evaluations by this instance. `nil` + /// by default. + /// - redirectHandler: `RedirectHandler` to be used by all `Request`s created by this instance. `nil` by + /// default. + /// - cachedResponseHandler: `CachedResponseHandler` to be used by all `Request`s created by this instance. + /// `nil` by default. + /// - eventMonitors: Additional `EventMonitor`s used by the instance. Alamofire always adds a + /// `AlamofireNotifications` `EventMonitor` to the array passed here. `[]` by default. + public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default, + delegate: SessionDelegate = SessionDelegate(), + rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"), + startRequestsImmediately: Bool = true, + requestQueue: DispatchQueue? = nil, + serializationQueue: DispatchQueue? = nil, + interceptor: RequestInterceptor? = nil, + serverTrustManager: ServerTrustManager? = nil, + redirectHandler: RedirectHandler? = nil, + cachedResponseHandler: CachedResponseHandler? = nil, + eventMonitors: [EventMonitor] = []) { + precondition(configuration.identifier == nil, "Alamofire does not support background URLSessionConfigurations.") + + // Retarget the incoming rootQueue for safety, unless it's the main queue, which we know is safe. + let serialRootQueue = (rootQueue === DispatchQueue.main) ? rootQueue : DispatchQueue(label: rootQueue.label, + target: rootQueue) + let delegateQueue = OperationQueue(maxConcurrentOperationCount: 1, underlyingQueue: serialRootQueue, name: "\(serialRootQueue.label).sessionDelegate") + let session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: delegateQueue) + + self.init(session: session, + delegate: delegate, + rootQueue: serialRootQueue, + startRequestsImmediately: startRequestsImmediately, + requestQueue: requestQueue, + serializationQueue: serializationQueue, + interceptor: interceptor, + serverTrustManager: serverTrustManager, + redirectHandler: redirectHandler, + cachedResponseHandler: cachedResponseHandler, + eventMonitors: eventMonitors) + } + + deinit { + finishRequestsForDeinit() + session.invalidateAndCancel() + } + + // MARK: - All Requests API + + /// Perform an action on all active `Request`s. + /// + /// - Note: The provided `action` closure is performed asynchronously, meaning that some `Request`s may complete and + /// be unavailable by time it runs. Additionally, this action is performed on the instances's `rootQueue`, + /// so care should be taken that actions are fast. Once the work on the `Request`s is complete, any + /// additional work should be performed on another queue. + /// + /// - Parameters: + /// - action: Closure to perform with all `Request`s. + public func withAllRequests(perform action: @escaping (Set) -> Void) { + rootQueue.async { + action(self.activeRequests) + } + } + + /// Cancel all active `Request`s, optionally calling a completion handler when complete. + /// + /// - Note: This is an asynchronous operation and does not block the creation of future `Request`s. Cancelled + /// `Request`s may not cancel immediately due internal work, and may not cancel at all if they are close to + /// completion when cancelled. + /// + /// - Parameters: + /// - queue: `DispatchQueue` on which the completion handler is run. `.main` by default. + /// - completion: Closure to be called when all `Request`s have been cancelled. + public func cancelAllRequests(completingOnQueue queue: DispatchQueue = .main, completion: (() -> Void)? = nil) { + withAllRequests { requests in + requests.forEach { $0.cancel() } + queue.async { + completion?() + } + } + } + + // MARK: - DataRequest + + /// Closure which provides a `URLRequest` for mutation. + public typealias RequestModifier = (inout URLRequest) throws -> Void + + struct RequestConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let parameters: Parameters? + let encoding: ParameterEncoding + let headers: HTTPHeaders? + let requestModifier: RequestModifier? + + func asURLRequest() throws -> URLRequest { + var request = try URLRequest(url: url, method: method, headers: headers) + try requestModifier?(&request) + + return try encoding.encode(request, with: parameters) + } + } + + /// Creates a `DataRequest` from a `URLRequest` created using the passed components and a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by + /// default. + /// - encoding: `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`. + /// `URLEncoding.default` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataRequest { + let convertible = RequestConvertible(url: convertible, + method: method, + parameters: parameters, + encoding: encoding, + headers: headers, + requestModifier: requestModifier) + + return request(convertible, interceptor: interceptor) + } + + struct RequestEncodableConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let parameters: Parameters? + let encoder: ParameterEncoder + let headers: HTTPHeaders? + let requestModifier: RequestModifier? + + func asURLRequest() throws -> URLRequest { + var request = try URLRequest(url: url, method: method, headers: headers) + try requestModifier?(&request) + + return try parameters.map { try encoder.encode($0, into: request) } ?? request + } + } + + /// Creates a `DataRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and a + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Encodable` value to be encoded into the `URLRequest`. `nil` by default. + /// - encoder: `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`. + /// `URLEncodedFormParameterEncoder.default` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from + /// the provided parameters. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: parameters, + encoder: encoder, + headers: headers, + requestModifier: requestModifier) + + return request(convertible, interceptor: interceptor) + } + + /// Creates a `DataRequest` from a `URLRequestConvertible` value and a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// + /// - Returns: The created `DataRequest`. + open func request(_ convertible: URLRequestConvertible, interceptor: RequestInterceptor? = nil) -> DataRequest { + let request = DataRequest(convertible: convertible, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self) + + perform(request) + + return request + } + + // MARK: - DataStreamRequest + + /// Creates a `DataStreamRequest` from the passed components, `Encodable` parameters, and `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Encodable` value to be encoded into the `URLRequest`. `nil` by default. + /// - encoder: `ParameterEncoder` to be used to encode the `parameters` value into the + /// `URLRequest`. + /// `URLEncodedFormParameterEncoder.default` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error` + /// is thrown while serializing stream `Data`. `false` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` + /// by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from + /// the provided parameters. `nil` by default. + /// + /// - Returns: The created `DataStream` request. + open func streamRequest(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + automaticallyCancelOnStreamError: Bool = false, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataStreamRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: parameters, + encoder: encoder, + headers: headers, + requestModifier: requestModifier) + + return streamRequest(convertible, + automaticallyCancelOnStreamError: automaticallyCancelOnStreamError, + interceptor: interceptor) + } + + /// Creates a `DataStreamRequest` from the passed components and `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error` + /// is thrown while serializing stream `Data`. `false` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` + /// by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from + /// the provided parameters. `nil` by default. + /// + /// - Returns: The created `DataStream` request. + open func streamRequest(_ convertible: URLConvertible, + method: HTTPMethod = .get, + headers: HTTPHeaders? = nil, + automaticallyCancelOnStreamError: Bool = false, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataStreamRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: Empty?.none, + encoder: URLEncodedFormParameterEncoder.default, + headers: headers, + requestModifier: requestModifier) + + return streamRequest(convertible, + automaticallyCancelOnStreamError: automaticallyCancelOnStreamError, + interceptor: interceptor) + } + + /// Creates a `DataStreamRequest` from the passed `URLRequestConvertible` value and `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - automaticallyCancelOnStreamError: `Bool` indicating whether the instance should be canceled when an `Error` + /// is thrown while serializing stream `Data`. `false` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` + /// by default. + /// + /// - Returns: The created `DataStreamRequest`. + open func streamRequest(_ convertible: URLRequestConvertible, + automaticallyCancelOnStreamError: Bool = false, + interceptor: RequestInterceptor? = nil) -> DataStreamRequest { + let request = DataStreamRequest(convertible: convertible, + automaticallyCancelOnStreamError: automaticallyCancelOnStreamError, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self) + + perform(request) + + return request + } + + // MARK: - DownloadRequest + + /// Creates a `DownloadRequest` using a `URLRequest` created using the passed components, `RequestInterceptor`, and + /// `Destination`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: `Parameters` (a.k.a. `[String: Any]`) value to be encoded into the `URLRequest`. `nil` by + /// default. + /// - encoding: `ParameterEncoding` to be used to encode the `parameters` value into the `URLRequest`. + /// Defaults to `URLEncoding.default`. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let convertible = RequestConvertible(url: convertible, + method: method, + parameters: parameters, + encoding: encoding, + headers: headers, + requestModifier: requestModifier) + + return download(convertible, interceptor: interceptor, to: destination) + } + + /// Creates a `DownloadRequest` from a `URLRequest` created using the passed components, `Encodable` parameters, and + /// a `RequestInterceptor`. + /// + /// - Parameters: + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.get` by default. + /// - parameters: Value conforming to `Encodable` to be encoded into the `URLRequest`. `nil` by default. + /// - encoder: `ParameterEncoder` to be used to encode the `parameters` value into the `URLRequest`. + /// Defaults to `URLEncodedFormParameterEncoder.default`. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLConvertible, + method: HTTPMethod = .get, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let convertible = RequestEncodableConvertible(url: convertible, + method: method, + parameters: parameters, + encoder: encoder, + headers: headers, + requestModifier: requestModifier) + + return download(convertible, interceptor: interceptor, to: destination) + } + + /// Creates a `DownloadRequest` from a `URLRequestConvertible` value, a `RequestInterceptor`, and a `Destination`. + /// + /// - Parameters: + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(_ convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let request = DownloadRequest(downloadable: .request(convertible), + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self, + destination: destination ?? DownloadRequest.defaultDestination) + + perform(request) + + return request + } + + /// Creates a `DownloadRequest` from the `resumeData` produced from a previously cancelled `DownloadRequest`, as + /// well as a `RequestInterceptor`, and a `Destination`. + /// + /// - Note: If `destination` is not specified, the download will be moved to a temporary location determined by + /// Alamofire. The file will not be deleted until the system purges the temporary files. + /// + /// - Note: On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1), + /// `resumeData` is broken on background URL session configurations. There's an underlying bug in the `resumeData` + /// generation logic where the data is written incorrectly and will always fail to resume the download. For more + /// information about the bug and possible workarounds, please refer to the [this Stack Overflow post](http://stackoverflow.com/a/39347461/1342462). + /// + /// - Parameters: + /// - data: The resume data from a previously cancelled `DownloadRequest` or `URLSessionDownloadTask`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - destination: `DownloadRequest.Destination` closure used to determine how and where the downloaded file + /// should be moved. `nil` by default. + /// + /// - Returns: The created `DownloadRequest`. + open func download(resumingWith data: Data, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + let request = DownloadRequest(downloadable: .resumeData(data), + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self, + destination: destination ?? DownloadRequest.defaultDestination) + + perform(request) + + return request + } + + // MARK: - UploadRequest + + struct ParameterlessRequestConvertible: URLRequestConvertible { + let url: URLConvertible + let method: HTTPMethod + let headers: HTTPHeaders? + let requestModifier: RequestModifier? + + func asURLRequest() throws -> URLRequest { + var request = try URLRequest(url: url, method: method, headers: headers) + try requestModifier?(&request) + + return request + } + } + + struct Upload: UploadConvertible { + let request: URLRequestConvertible + let uploadable: UploadableConvertible + + func createUploadable() throws -> UploadRequest.Uploadable { + try uploadable.createUploadable() + } + + func asURLRequest() throws -> URLRequest { + try request.asURLRequest() + } + } + + // MARK: Data + + /// Creates an `UploadRequest` for the given `Data`, `URLRequest` components, and `RequestInterceptor`. + /// + /// - Parameters: + /// - data: The `Data` to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ data: Data, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, + method: method, + headers: headers, + requestModifier: requestModifier) + + return upload(data, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the given `Data` using the `URLRequestConvertible` value and `RequestInterceptor`. + /// + /// - Parameters: + /// - data: The `Data` to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ data: Data, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + upload(.data(data), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: File + + /// Creates an `UploadRequest` for the file at the given file `URL`, using a `URLRequest` from the provided + /// components and `RequestInterceptor`. + /// + /// - Parameters: + /// - fileURL: The `URL` of the file to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `UploadRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ fileURL: URL, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, + method: method, + headers: headers, + requestModifier: requestModifier) + + return upload(fileURL, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the file at the given file `URL` using the `URLRequestConvertible` value and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - fileURL: The `URL` of the file to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ fileURL: URL, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + upload(.file(fileURL, shouldRemove: false), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: InputStream + + /// Creates an `UploadRequest` from the `InputStream` provided using a `URLRequest` from the provided components and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - stream: The `InputStream` that provides the data to upload. + /// - convertible: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the provided + /// parameters. `nil` by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ stream: InputStream, + to convertible: URLConvertible, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: convertible, + method: method, + headers: headers, + requestModifier: requestModifier) + + return upload(stream, with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` from the provided `InputStream` using the `URLRequestConvertible` value and + /// `RequestInterceptor`. + /// + /// - Parameters: + /// - stream: The `InputStream` that provides the data to upload. + /// - convertible: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(_ stream: InputStream, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + upload(.stream(stream), with: convertible, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: MultipartFormData + + /// Creates an `UploadRequest` for the multipart form data built using a closure and sent using the provided + /// `URLRequest` components and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` building closure. + /// - url: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the + /// provided parameters. `nil` by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: @escaping (MultipartFormData) -> Void, + to url: URLConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: url, + method: method, + headers: headers, + requestModifier: requestModifier) + + let formData = MultipartFormData(fileManager: fileManager) + multipartFormData(formData) + + return upload(multipartFormData: formData, + with: convertible, + usingThreshold: encodingMemoryThreshold, + interceptor: interceptor, + fileManager: fileManager) + } + + /// Creates an `UploadRequest` using a `MultipartFormData` building closure, the provided `URLRequestConvertible` + /// value, and a `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` building closure. + /// - request: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: @escaping (MultipartFormData) -> Void, + with request: URLRequestConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let formData = MultipartFormData(fileManager: fileManager) + multipartFormData(formData) + + return upload(multipartFormData: formData, + with: request, + usingThreshold: encodingMemoryThreshold, + interceptor: interceptor, + fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the provided `URLRequest` components + /// and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` instance to upload. + /// - url: `URLConvertible` value to be used as the `URLRequest`'s `URL`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - method: `HTTPMethod` for the `URLRequest`. `.post` by default. + /// - headers: `HTTPHeaders` value to be added to the `URLRequest`. `nil` by default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` to be used if the form data exceeds the memory threshold and is + /// written to disk before being uploaded. `.default` instance by default. + /// - requestModifier: `RequestModifier` which will be applied to the `URLRequest` created from the + /// provided parameters. `nil` by default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: MultipartFormData, + to url: URLConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + method: HTTPMethod = .post, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + let convertible = ParameterlessRequestConvertible(url: url, + method: method, + headers: headers, + requestModifier: requestModifier) + + let multipartUpload = MultipartUpload(encodingMemoryThreshold: encodingMemoryThreshold, + request: convertible, + multipartFormData: multipartFormData) + + return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager) + } + + /// Creates an `UploadRequest` for the prebuilt `MultipartFormData` value using the providing `URLRequestConvertible` + /// value and `RequestInterceptor`. + /// + /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cumulative + /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most + /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to + /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory + /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be + /// used for larger payloads such as video content. + /// + /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory + /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`, + /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk + /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding + /// technique was used. + /// + /// - Parameters: + /// - multipartFormData: `MultipartFormData` instance to upload. + /// - request: `URLRequestConvertible` value to be used to create the `URLRequest`. + /// - encodingMemoryThreshold: Byte threshold used to determine whether the form data is encoded into memory or + /// onto disk before being uploaded. `MultipartFormData.encodingMemoryThreshold` by + /// default. + /// - interceptor: `RequestInterceptor` value to be used by the returned `DataRequest`. `nil` by default. + /// - fileManager: `FileManager` instance to be used by the returned `UploadRequest`. `.default` instance by + /// default. + /// + /// - Returns: The created `UploadRequest`. + open func upload(multipartFormData: MultipartFormData, + with request: URLRequestConvertible, + usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default) -> UploadRequest { + let multipartUpload = MultipartUpload(encodingMemoryThreshold: encodingMemoryThreshold, + request: request, + multipartFormData: multipartFormData) + + return upload(multipartUpload, interceptor: interceptor, fileManager: fileManager) + } + + // MARK: - Internal API + + // MARK: Uploadable + + func upload(_ uploadable: UploadRequest.Uploadable, + with convertible: URLRequestConvertible, + interceptor: RequestInterceptor?, + fileManager: FileManager) -> UploadRequest { + let uploadable = Upload(request: convertible, uploadable: uploadable) + + return upload(uploadable, interceptor: interceptor, fileManager: fileManager) + } + + func upload(_ upload: UploadConvertible, interceptor: RequestInterceptor?, fileManager: FileManager) -> UploadRequest { + let request = UploadRequest(convertible: upload, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + fileManager: fileManager, + delegate: self) + + perform(request) + + return request + } + + // MARK: Perform + + /// Starts performing the provided `Request`. + /// + /// - Parameter request: The `Request` to perform. + func perform(_ request: Request) { + rootQueue.async { + guard !request.isCancelled else { return } + + self.activeRequests.insert(request) + + self.requestQueue.async { + // Leaf types must come first, otherwise they will cast as their superclass. + switch request { + case let r as UploadRequest: self.performUploadRequest(r) // UploadRequest must come before DataRequest due to subtype relationship. + case let r as DataRequest: self.performDataRequest(r) + case let r as DownloadRequest: self.performDownloadRequest(r) + case let r as DataStreamRequest: self.performDataStreamRequest(r) + default: fatalError("Attempted to perform unsupported Request subclass: \(type(of: request))") + } + } + } + } + + func performDataRequest(_ request: DataRequest) { + dispatchPrecondition(condition: .onQueue(requestQueue)) + + performSetupOperations(for: request, convertible: request.convertible) + } + + func performDataStreamRequest(_ request: DataStreamRequest) { + dispatchPrecondition(condition: .onQueue(requestQueue)) + + performSetupOperations(for: request, convertible: request.convertible) + } + + func performUploadRequest(_ request: UploadRequest) { + dispatchPrecondition(condition: .onQueue(requestQueue)) + + performSetupOperations(for: request, convertible: request.convertible) { + do { + let uploadable = try request.upload.createUploadable() + self.rootQueue.async { request.didCreateUploadable(uploadable) } + return true + } catch { + self.rootQueue.async { request.didFailToCreateUploadable(with: error.asAFError(or: .createUploadableFailed(error: error))) } + return false + } + } + } + + func performDownloadRequest(_ request: DownloadRequest) { + dispatchPrecondition(condition: .onQueue(requestQueue)) + + switch request.downloadable { + case let .request(convertible): + performSetupOperations(for: request, convertible: convertible) + case let .resumeData(resumeData): + rootQueue.async { self.didReceiveResumeData(resumeData, for: request) } + } + } + + func performSetupOperations(for request: Request, + convertible: URLRequestConvertible, + shouldCreateTask: @escaping () -> Bool = { true }) { + dispatchPrecondition(condition: .onQueue(requestQueue)) + + let initialRequest: URLRequest + + do { + initialRequest = try convertible.asURLRequest() + try initialRequest.validate() + } catch { + rootQueue.async { request.didFailToCreateURLRequest(with: error.asAFError(or: .createURLRequestFailed(error: error))) } + return + } + + rootQueue.async { request.didCreateInitialURLRequest(initialRequest) } + + guard !request.isCancelled else { return } + + guard let adapter = adapter(for: request) else { + guard shouldCreateTask() else { return } + rootQueue.async { self.didCreateURLRequest(initialRequest, for: request) } + return + } + + let adapterState = RequestAdapterState(requestID: request.id, session: self) + + adapter.adapt(initialRequest, using: adapterState) { result in + do { + let adaptedRequest = try result.get() + try adaptedRequest.validate() + + self.rootQueue.async { request.didAdaptInitialRequest(initialRequest, to: adaptedRequest) } + + guard shouldCreateTask() else { return } + + self.rootQueue.async { self.didCreateURLRequest(adaptedRequest, for: request) } + } catch { + self.rootQueue.async { request.didFailToAdaptURLRequest(initialRequest, withError: .requestAdaptationFailed(error: error)) } + } + } + } + + // MARK: - Task Handling + + func didCreateURLRequest(_ urlRequest: URLRequest, for request: Request) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + request.didCreateURLRequest(urlRequest) + + guard !request.isCancelled else { return } + + let task = request.task(for: urlRequest, using: session) + requestTaskMap[request] = task + request.didCreateTask(task) + + updateStatesForTask(task, request: request) + } + + func didReceiveResumeData(_ data: Data, for request: DownloadRequest) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + guard !request.isCancelled else { return } + + let task = request.task(forResumeData: data, using: session) + requestTaskMap[request] = task + request.didCreateTask(task) + + updateStatesForTask(task, request: request) + } + + func updateStatesForTask(_ task: URLSessionTask, request: Request) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + request.withState { state in + switch state { + case .initialized, .finished: + // Do nothing. + break + case .resumed: + task.resume() + rootQueue.async { request.didResumeTask(task) } + case .suspended: + task.suspend() + rootQueue.async { request.didSuspendTask(task) } + case .cancelled: + // Resume to ensure metrics are gathered. + task.resume() + task.cancel() + rootQueue.async { request.didCancelTask(task) } + } + } + } + + // MARK: - Adapters and Retriers + + func adapter(for request: Request) -> RequestAdapter? { + if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor { + return Interceptor(adapters: [requestInterceptor, sessionInterceptor]) + } else { + return request.interceptor ?? interceptor + } + } + + func retrier(for request: Request) -> RequestRetrier? { + if let requestInterceptor = request.interceptor, let sessionInterceptor = interceptor { + return Interceptor(retriers: [requestInterceptor, sessionInterceptor]) + } else { + return request.interceptor ?? interceptor + } + } + + // MARK: - Invalidation + + func finishRequestsForDeinit() { + requestTaskMap.requests.forEach { request in + rootQueue.async { + request.finish(error: AFError.sessionDeinitialized) + } + } + } +} + +// MARK: - RequestDelegate + +extension Session: RequestDelegate { + public var sessionConfiguration: URLSessionConfiguration { + session.configuration + } + + public var startImmediately: Bool { startRequestsImmediately } + + public func cleanup(after request: Request) { + activeRequests.remove(request) + } + + public func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void) { + guard let retrier = retrier(for: request) else { + rootQueue.async { completion(.doNotRetry) } + return + } + + retrier.retry(request, for: self, dueTo: error) { retryResult in + self.rootQueue.async { + guard let retryResultError = retryResult.error else { completion(retryResult); return } + + let retryError = AFError.requestRetryFailed(retryError: retryResultError, originalError: error) + completion(.doNotRetryWithError(retryError)) + } + } + } + + public func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?) { + rootQueue.async { + let retry: () -> Void = { + guard !request.isCancelled else { return } + + request.prepareForRetry() + self.perform(request) + } + + if let retryDelay = timeDelay { + self.rootQueue.after(retryDelay) { retry() } + } else { + retry() + } + } + } +} + +// MARK: - SessionStateProvider + +extension Session: SessionStateProvider { + func request(for task: URLSessionTask) -> Request? { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + return requestTaskMap[task] + } + + func didGatherMetricsForTask(_ task: URLSessionTask) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + let didDisassociate = requestTaskMap.disassociateIfNecessaryAfterGatheringMetricsForTask(task) + + if didDisassociate { + waitingCompletions[task]?() + waitingCompletions[task] = nil + } + } + + func didCompleteTask(_ task: URLSessionTask, completion: @escaping () -> Void) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + let didDisassociate = requestTaskMap.disassociateIfNecessaryAfterCompletingTask(task) + + if didDisassociate { + completion() + } else { + waitingCompletions[task] = completion + } + } + + func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential? { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + return requestTaskMap[task]?.credential ?? + session.configuration.urlCredentialStorage?.defaultCredential(for: protectionSpace) + } + + func cancelRequestsForSessionInvalidation(with error: Error?) { + dispatchPrecondition(condition: .onQueue(rootQueue)) + + requestTaskMap.requests.forEach { $0.finish(error: AFError.sessionInvalidated(error: error)) } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/SessionDelegate.swift b/Carthage/Checkouts/Alamofire/Source/SessionDelegate.swift new file mode 100644 index 00000000..af45b27c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/SessionDelegate.swift @@ -0,0 +1,355 @@ +// +// SessionDelegate.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Class which implements the various `URLSessionDelegate` methods to connect various Alamofire features. +open class SessionDelegate: NSObject { + private let fileManager: FileManager + + weak var stateProvider: SessionStateProvider? + var eventMonitor: EventMonitor? + + /// Creates an instance from the given `FileManager`. + /// + /// - Parameter fileManager: `FileManager` to use for underlying file management, such as moving downloaded files. + /// `.default` by default. + public init(fileManager: FileManager = .default) { + self.fileManager = fileManager + } + + /// Internal method to find and cast requests while maintaining some integrity checking. + /// + /// - Parameters: + /// - task: The `URLSessionTask` for which to find the associated `Request`. + /// - type: The `Request` subclass type to cast any `Request` associate with `task`. + func request(for task: URLSessionTask, as type: R.Type) -> R? { + guard let provider = stateProvider else { + assertionFailure("StateProvider is nil.") + return nil + } + + return provider.request(for: task) as? R + } +} + +/// Type which provides various `Session` state values. +protocol SessionStateProvider: AnyObject { + var serverTrustManager: ServerTrustManager? { get } + var redirectHandler: RedirectHandler? { get } + var cachedResponseHandler: CachedResponseHandler? { get } + + func request(for task: URLSessionTask) -> Request? + func didGatherMetricsForTask(_ task: URLSessionTask) + func didCompleteTask(_ task: URLSessionTask, completion: @escaping () -> Void) + func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential? + func cancelRequestsForSessionInvalidation(with error: Error?) +} + +// MARK: URLSessionDelegate + +extension SessionDelegate: URLSessionDelegate { + open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + eventMonitor?.urlSession(session, didBecomeInvalidWithError: error) + + stateProvider?.cancelRequestsForSessionInvalidation(with: error) + } +} + +// MARK: URLSessionTaskDelegate + +extension SessionDelegate: URLSessionTaskDelegate { + /// Result of a `URLAuthenticationChallenge` evaluation. + typealias ChallengeEvaluation = (disposition: URLSession.AuthChallengeDisposition, credential: URLCredential?, error: AFError?) + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didReceive challenge: URLAuthenticationChallenge, + completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { + eventMonitor?.urlSession(session, task: task, didReceive: challenge) + + let evaluation: ChallengeEvaluation + switch challenge.protectionSpace.authenticationMethod { + case NSURLAuthenticationMethodHTTPBasic, NSURLAuthenticationMethodHTTPDigest, NSURLAuthenticationMethodNTLM, + NSURLAuthenticationMethodNegotiate: + evaluation = attemptCredentialAuthentication(for: challenge, belongingTo: task) + #if canImport(Security) + case NSURLAuthenticationMethodServerTrust: + evaluation = attemptServerTrustAuthentication(with: challenge) + case NSURLAuthenticationMethodClientCertificate: + evaluation = attemptCredentialAuthentication(for: challenge, belongingTo: task) + #endif + default: + evaluation = (.performDefaultHandling, nil, nil) + } + + if let error = evaluation.error { + stateProvider?.request(for: task)?.didFailTask(task, earlyWithError: error) + } + + completionHandler(evaluation.disposition, evaluation.credential) + } + + #if canImport(Security) + /// Evaluates the server trust `URLAuthenticationChallenge` received. + /// + /// - Parameter challenge: The `URLAuthenticationChallenge`. + /// + /// - Returns: The `ChallengeEvaluation`. + func attemptServerTrustAuthentication(with challenge: URLAuthenticationChallenge) -> ChallengeEvaluation { + let host = challenge.protectionSpace.host + + guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust, + let trust = challenge.protectionSpace.serverTrust + else { + return (.performDefaultHandling, nil, nil) + } + + do { + guard let evaluator = try stateProvider?.serverTrustManager?.serverTrustEvaluator(forHost: host) else { + return (.performDefaultHandling, nil, nil) + } + + try evaluator.evaluate(trust, forHost: host) + + return (.useCredential, URLCredential(trust: trust), nil) + } catch { + return (.cancelAuthenticationChallenge, nil, error.asAFError(or: .serverTrustEvaluationFailed(reason: .customEvaluationFailed(error: error)))) + } + } + #endif + + /// Evaluates the credential-based authentication `URLAuthenticationChallenge` received for `task`. + /// + /// - Parameters: + /// - challenge: The `URLAuthenticationChallenge`. + /// - task: The `URLSessionTask` which received the challenge. + /// + /// - Returns: The `ChallengeEvaluation`. + func attemptCredentialAuthentication(for challenge: URLAuthenticationChallenge, + belongingTo task: URLSessionTask) -> ChallengeEvaluation { + guard challenge.previousFailureCount == 0 else { + return (.rejectProtectionSpace, nil, nil) + } + + guard let credential = stateProvider?.credential(for: task, in: challenge.protectionSpace) else { + return (.performDefaultHandling, nil, nil) + } + + return (.useCredential, credential, nil) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + eventMonitor?.urlSession(session, + task: task, + didSendBodyData: bytesSent, + totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + + stateProvider?.request(for: task)?.updateUploadProgress(totalBytesSent: totalBytesSent, + totalBytesExpectedToSend: totalBytesExpectedToSend) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + needNewBodyStream completionHandler: @escaping (InputStream?) -> Void) { + eventMonitor?.urlSession(session, taskNeedsNewBodyStream: task) + + guard let request = request(for: task, as: UploadRequest.self) else { + assertionFailure("needNewBodyStream did not find UploadRequest.") + completionHandler(nil) + return + } + + completionHandler(request.inputStream()) + } + + open func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest, + completionHandler: @escaping (URLRequest?) -> Void) { + eventMonitor?.urlSession(session, task: task, willPerformHTTPRedirection: response, newRequest: request) + + if let redirectHandler = stateProvider?.request(for: task)?.redirectHandler ?? stateProvider?.redirectHandler { + redirectHandler.task(task, willBeRedirectedTo: request, for: response, completion: completionHandler) + } else { + completionHandler(request) + } + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + eventMonitor?.urlSession(session, task: task, didFinishCollecting: metrics) + + stateProvider?.request(for: task)?.didGatherMetrics(metrics) + + stateProvider?.didGatherMetricsForTask(task) + } + + open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + eventMonitor?.urlSession(session, task: task, didCompleteWithError: error) + + let request = stateProvider?.request(for: task) + + stateProvider?.didCompleteTask(task) { + request?.didCompleteTask(task, with: error.map { $0.asAFError(or: .sessionTaskFailed(error: $0)) }) + } + } + + @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) + open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + eventMonitor?.urlSession(session, taskIsWaitingForConnectivity: task) + } +} + +// MARK: URLSessionDataDelegate + +extension SessionDelegate: URLSessionDataDelegate { + open func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + didReceive response: URLResponse, + completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) { + eventMonitor?.urlSession(session, dataTask: dataTask, didReceive: response) + + guard let response = response as? HTTPURLResponse else { completionHandler(.allow); return } + + if let request = request(for: dataTask, as: DataRequest.self) { + request.didReceiveResponse(response, completionHandler: completionHandler) + } else if let request = request(for: dataTask, as: DataStreamRequest.self) { + request.didReceiveResponse(response, completionHandler: completionHandler) + } else { + assertionFailure("dataTask did not find DataRequest or DataStreamRequest in didReceive response") + completionHandler(.allow) + return + } + } + + open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + eventMonitor?.urlSession(session, dataTask: dataTask, didReceive: data) + + if let request = request(for: dataTask, as: DataRequest.self) { + request.didReceive(data: data) + } else if let request = request(for: dataTask, as: DataStreamRequest.self) { + request.didReceive(data: data) + } else { + assertionFailure("dataTask did not find DataRequest or DataStreamRequest in didReceive data") + return + } + } + + open func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse, + completionHandler: @escaping (CachedURLResponse?) -> Void) { + eventMonitor?.urlSession(session, dataTask: dataTask, willCacheResponse: proposedResponse) + + if let handler = stateProvider?.request(for: dataTask)?.cachedResponseHandler ?? stateProvider?.cachedResponseHandler { + handler.dataTask(dataTask, willCacheResponse: proposedResponse, completion: completionHandler) + } else { + completionHandler(proposedResponse) + } + } +} + +// MARK: URLSessionDownloadDelegate + +extension SessionDelegate: URLSessionDownloadDelegate { + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + eventMonitor?.urlSession(session, + downloadTask: downloadTask, + didResumeAtOffset: fileOffset, + expectedTotalBytes: expectedTotalBytes) + guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + downloadRequest.updateDownloadProgress(bytesWritten: fileOffset, + totalBytesExpectedToWrite: expectedTotalBytes) + } + + open func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + eventMonitor?.urlSession(session, + downloadTask: downloadTask, + didWriteData: bytesWritten, + totalBytesWritten: totalBytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + guard let downloadRequest = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + downloadRequest.updateDownloadProgress(bytesWritten: bytesWritten, + totalBytesExpectedToWrite: totalBytesExpectedToWrite) + } + + open func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { + eventMonitor?.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location) + + guard let request = request(for: downloadTask, as: DownloadRequest.self) else { + assertionFailure("downloadTask did not find DownloadRequest.") + return + } + + let (destination, options): (URL, DownloadRequest.Options) + if let response = request.response { + (destination, options) = request.destination(location, response) + } else { + // If there's no response this is likely a local file download, so generate the temporary URL directly. + (destination, options) = (DownloadRequest.defaultDestinationURL(location), []) + } + + eventMonitor?.request(request, didCreateDestinationURL: destination) + + do { + if options.contains(.removePreviousFile), fileManager.fileExists(atPath: destination.path) { + try fileManager.removeItem(at: destination) + } + + if options.contains(.createIntermediateDirectories) { + let directory = destination.deletingLastPathComponent() + try fileManager.createDirectory(at: directory, withIntermediateDirectories: true) + } + + try fileManager.moveItem(at: location, to: destination) + + request.didFinishDownloading(using: downloadTask, with: .success(destination)) + } catch { + request.didFinishDownloading(using: downloadTask, with: .failure(.downloadedFileMoveFailed(error: error, + source: location, + destination: destination))) + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/StringEncoding+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/StringEncoding+Alamofire.swift new file mode 100644 index 00000000..8fa61333 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/StringEncoding+Alamofire.swift @@ -0,0 +1,55 @@ +// +// StringEncoding+Alamofire.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension String.Encoding { + /// Creates an encoding from the IANA charset name. + /// + /// - Notes: These mappings match those [provided by CoreFoundation](https://opensource.apple.com/source/CF/CF-476.18/CFStringUtilities.c.auto.html) + /// + /// - Parameter name: IANA charset name. + init?(ianaCharsetName name: String) { + switch name.lowercased() { + case "utf-8": + self = .utf8 + case "iso-8859-1": + self = .isoLatin1 + case "unicode-1-1", "iso-10646-ucs-2", "utf-16": + self = .utf16 + case "utf-16be": + self = .utf16BigEndian + case "utf-16le": + self = .utf16LittleEndian + case "utf-32": + self = .utf32 + case "utf-32be": + self = .utf32BigEndian + case "utf-32le": + self = .utf32LittleEndian + default: + return nil + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/URLConvertible+URLRequestConvertible.swift b/Carthage/Checkouts/Alamofire/Source/URLConvertible+URLRequestConvertible.swift new file mode 100644 index 00000000..455c4bcb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/URLConvertible+URLRequestConvertible.swift @@ -0,0 +1,105 @@ +// +// URLConvertible+URLRequestConvertible.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// Types adopting the `URLConvertible` protocol can be used to construct `URL`s, which can then be used to construct +/// `URLRequests`. +public protocol URLConvertible { + /// Returns a `URL` from the conforming instance or throws. + /// + /// - Returns: The `URL` created from the instance. + /// - Throws: Any error thrown while creating the `URL`. + func asURL() throws -> URL +} + +extension String: URLConvertible { + /// Returns a `URL` if `self` can be used to initialize a `URL` instance, otherwise throws. + /// + /// - Returns: The `URL` initialized with `self`. + /// - Throws: An `AFError.invalidURL` instance. + public func asURL() throws -> URL { + guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) } + + return url + } +} + +extension URL: URLConvertible { + /// Returns `self`. + public func asURL() throws -> URL { self } +} + +extension URLComponents: URLConvertible { + /// Returns a `URL` if the `self`'s `url` is not nil, otherwise throws. + /// + /// - Returns: The `URL` from the `url` property. + /// - Throws: An `AFError.invalidURL` instance. + public func asURL() throws -> URL { + guard let url = url else { throw AFError.invalidURL(url: self) } + + return url + } +} + +// MARK: - + +/// Types adopting the `URLRequestConvertible` protocol can be used to safely construct `URLRequest`s. +public protocol URLRequestConvertible { + /// Returns a `URLRequest` or throws if an `Error` was encountered. + /// + /// - Returns: A `URLRequest`. + /// - Throws: Any error thrown while constructing the `URLRequest`. + func asURLRequest() throws -> URLRequest +} + +extension URLRequestConvertible { + /// The `URLRequest` returned by discarding any `Error` encountered. + public var urlRequest: URLRequest? { try? asURLRequest() } +} + +extension URLRequest: URLRequestConvertible { + /// Returns `self`. + public func asURLRequest() throws -> URLRequest { self } +} + +// MARK: - + +extension URLRequest { + /// Creates an instance with the specified `url`, `method`, and `headers`. + /// + /// - Parameters: + /// - url: The `URLConvertible` value. + /// - method: The `HTTPMethod`. + /// - headers: The `HTTPHeaders`, `nil` by default. + /// - Throws: Any error thrown while converting the `URLConvertible` to a `URL`. + public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws { + let url = try url.asURL() + + self.init(url: url) + + httpMethod = method.rawValue + allHTTPHeaderFields = headers?.dictionary + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/URLEncodedFormEncoder.swift b/Carthage/Checkouts/Alamofire/Source/URLEncodedFormEncoder.swift new file mode 100644 index 00000000..cfbd7e4d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/URLEncodedFormEncoder.swift @@ -0,0 +1,1151 @@ +// +// URLEncodedFormEncoder.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +/// An object that encodes instances into URL-encoded query strings. +/// +/// `ArrayEncoding` can be used to configure how `Array` values are encoded. By default, the `.brackets` encoding is +/// used, encoding array values with brackets for each value. e.g `array[]=1&array[]=2`. +/// +/// `BoolEncoding` can be used to configure how `Bool` values are encoded. By default, the `.numeric` encoding is used, +/// encoding `true` as `1` and `false` as `0`. +/// +/// `DataEncoding` can be used to configure how `Data` values are encoded. By default, the `.deferredToData` encoding is +/// used, which encodes `Data` values using their default `Encodable` implementation. +/// +/// `DateEncoding` can be used to configure how `Date` values are encoded. By default, the `.deferredToDate` +/// encoding is used, which encodes `Date`s using their default `Encodable` implementation. +/// +/// `KeyEncoding` can be used to configure how keys are encoded. By default, the `.useDefaultKeys` encoding is used, +/// which encodes the keys directly from the `Encodable` implementation. +/// +/// `KeyPathEncoding` can be used to configure how paths within nested objects are encoded. By default, the `.brackets` +/// encoding is used, which encodes each sub-key in brackets. e.g. `parent[child][grandchild]=value`. +/// +/// `NilEncoding` can be used to configure how `nil` `Optional` values are encoded. By default, the `.dropKey` encoding +/// is used, which drops `nil` key / value pairs from the output entirely. +/// +/// `SpaceEncoding` can be used to configure how spaces are encoded. By default, the `.percentEscaped` encoding is used, +/// replacing spaces with `%20`. +/// +/// This type is largely based on Vapor's [`url-encoded-form`](https://github.com/vapor/url-encoded-form) project. +public final class URLEncodedFormEncoder { + /// Encoding to use for `Array` values. + public enum ArrayEncoding { + /// An empty set of square brackets ("[]") are appended to the key for every value. This is the default encoding. + case brackets + /// No brackets are appended to the key and the key is encoded as is. + case noBrackets + /// Brackets containing the item index are appended. This matches the jQuery and Node.js behavior. + case indexInBrackets + /// Provide a custom array key encoding with the given closure. + case custom((_ key: String, _ index: Int) -> String) + + /// Encodes the key according to the encoding. + /// + /// - Parameters: + /// - key: The `key` to encode. + /// - index: When this enum instance is `.indexInBrackets`, the `index` to encode. + /// + /// - Returns: The encoded key. + func encode(_ key: String, atIndex index: Int) -> String { + switch self { + case .brackets: return "\(key)[]" + case .noBrackets: return key + case .indexInBrackets: return "\(key)[\(index)]" + case let .custom(encoding): return encoding(key, index) + } + } + } + + /// Encoding to use for `Bool` values. + public enum BoolEncoding { + /// Encodes `true` as `1`, `false` as `0`. + case numeric + /// Encodes `true` as "true", `false` as "false". This is the default encoding. + case literal + + /// Encodes the given `Bool` as a `String`. + /// + /// - Parameter value: The `Bool` to encode. + /// + /// - Returns: The encoded `String`. + func encode(_ value: Bool) -> String { + switch self { + case .numeric: return value ? "1" : "0" + case .literal: return value ? "true" : "false" + } + } + } + + /// Encoding to use for `Data` values. + public enum DataEncoding { + /// Defers encoding to the `Data` type. + case deferredToData + /// Encodes `Data` as a Base64-encoded string. This is the default encoding. + case base64 + /// Encode the `Data` as a custom value encoded by the given closure. + case custom((Data) throws -> String) + + /// Encodes `Data` according to the encoding. + /// + /// - Parameter data: The `Data` to encode. + /// + /// - Returns: The encoded `String`, or `nil` if the `Data` should be encoded according to its + /// `Encodable` implementation. + func encode(_ data: Data) throws -> String? { + switch self { + case .deferredToData: return nil + case .base64: return data.base64EncodedString() + case let .custom(encoding): return try encoding(data) + } + } + } + + /// Encoding to use for `Date` values. + public enum DateEncoding { + /// ISO8601 and RFC3339 formatter. + private static let iso8601Formatter: ISO8601DateFormatter = { + let formatter = ISO8601DateFormatter() + formatter.formatOptions = .withInternetDateTime + return formatter + }() + + /// Defers encoding to the `Date` type. This is the default encoding. + case deferredToDate + /// Encodes `Date`s as seconds since midnight UTC on January 1, 1970. + case secondsSince1970 + /// Encodes `Date`s as milliseconds since midnight UTC on January 1, 1970. + case millisecondsSince1970 + /// Encodes `Date`s according to the ISO8601 and RFC3339 standards. + case iso8601 + /// Encodes `Date`s using the given `DateFormatter`. + case formatted(DateFormatter) + /// Encodes `Date`s using the given closure. + case custom((Date) throws -> String) + + /// Encodes the date according to the encoding. + /// + /// - Parameter date: The `Date` to encode. + /// + /// - Returns: The encoded `String`, or `nil` if the `Date` should be encoded according to its + /// `Encodable` implementation. + func encode(_ date: Date) throws -> String? { + switch self { + case .deferredToDate: + return nil + case .secondsSince1970: + return String(date.timeIntervalSince1970) + case .millisecondsSince1970: + return String(date.timeIntervalSince1970 * 1000.0) + case .iso8601: + return DateEncoding.iso8601Formatter.string(from: date) + case let .formatted(formatter): + return formatter.string(from: date) + case let .custom(closure): + return try closure(date) + } + } + } + + /// Encoding to use for keys. + /// + /// This type is derived from [`JSONEncoder`'s `KeyEncodingStrategy`](https://github.com/apple/swift/blob/6aa313b8dd5f05135f7f878eccc1db6f9fbe34ff/stdlib/public/Darwin/Foundation/JSONEncoder.swift#L128) + /// and [`XMLEncoder`s `KeyEncodingStrategy`](https://github.com/MaxDesiatov/XMLCoder/blob/master/Sources/XMLCoder/Encoder/XMLEncoder.swift#L102). + public enum KeyEncoding { + /// Use the keys specified by each type. This is the default encoding. + case useDefaultKeys + /// Convert from "camelCaseKeys" to "snake_case_keys" before writing a key. + /// + /// Capital characters are determined by testing membership in + /// `CharacterSet.uppercaseLetters` and `CharacterSet.lowercaseLetters` + /// (Unicode General Categories Lu and Lt). + /// The conversion to lower case uses `Locale.system`, also known as + /// the ICU "root" locale. This means the result is consistent + /// regardless of the current user's locale and language preferences. + /// + /// Converting from camel case to snake case: + /// 1. Splits words at the boundary of lower-case to upper-case + /// 2. Inserts `_` between words + /// 3. Lowercases the entire string + /// 4. Preserves starting and ending `_`. + /// + /// For example, `oneTwoThree` becomes `one_two_three`. `_oneTwoThree_` becomes `_one_two_three_`. + /// + /// - Note: Using a key encoding strategy has a nominal performance cost, as each string key has to be converted. + case convertToSnakeCase + /// Same as convertToSnakeCase, but using `-` instead of `_`. + /// For example `oneTwoThree` becomes `one-two-three`. + case convertToKebabCase + /// Capitalize the first letter only. + /// For example `oneTwoThree` becomes `OneTwoThree`. + case capitalized + /// Uppercase all letters. + /// For example `oneTwoThree` becomes `ONETWOTHREE`. + case uppercased + /// Lowercase all letters. + /// For example `oneTwoThree` becomes `onetwothree`. + case lowercased + /// A custom encoding using the provided closure. + case custom((String) -> String) + + func encode(_ key: String) -> String { + switch self { + case .useDefaultKeys: return key + case .convertToSnakeCase: return convertToSnakeCase(key) + case .convertToKebabCase: return convertToKebabCase(key) + case .capitalized: return String(key.prefix(1).uppercased() + key.dropFirst()) + case .uppercased: return key.uppercased() + case .lowercased: return key.lowercased() + case let .custom(encoding): return encoding(key) + } + } + + private func convertToSnakeCase(_ key: String) -> String { + convert(key, usingSeparator: "_") + } + + private func convertToKebabCase(_ key: String) -> String { + convert(key, usingSeparator: "-") + } + + private func convert(_ key: String, usingSeparator separator: String) -> String { + guard !key.isEmpty else { return key } + + var words: [Range] = [] + // The general idea of this algorithm is to split words on + // transition from lower to upper case, then on transition of >1 + // upper case characters to lowercase + // + // myProperty -> my_property + // myURLProperty -> my_url_property + // + // It is assumed, per Swift naming conventions, that the first character of the key is lowercase. + var wordStart = key.startIndex + var searchRange = key.index(after: wordStart)..1 capital letters. Turn those into a word, stopping at the capital before + // the lower case character. + let beforeLowerIndex = key.index(before: lowerCaseRange.lowerBound) + words.append(upperCaseRange.lowerBound.. String + + /// Creates an instance with the encoding closure called for each sub-key in a key path. + /// + /// - Parameter encoding: Closure used to perform the encoding. + public init(encoding: @escaping (_ subkey: String) -> String) { + self.encoding = encoding + } + + func encodeKeyPath(_ keyPath: String) -> String { + encoding(keyPath) + } + } + + /// Encoding to use for `nil` values. + public struct NilEncoding { + /// Encodes `nil` by dropping the entire key / value pair. + public static let dropKey = NilEncoding { nil } + /// Encodes `nil` by dropping only the value. e.g. `value1=one&nilValue=&value2=two`. + public static let dropValue = NilEncoding { "" } + /// Encodes `nil` as `null`. + public static let null = NilEncoding { "null" } + + private let encoding: () -> String? + + /// Creates an instance with the encoding closure called for `nil` values. + /// + /// - Parameter encoding: Closure used to perform the encoding. + public init(encoding: @escaping () -> String?) { + self.encoding = encoding + } + + func encodeNil() -> String? { + encoding() + } + } + + /// Encoding to use for spaces. + public enum SpaceEncoding { + /// Encodes spaces using percent escaping (`%20`). + case percentEscaped + /// Encodes spaces as `+`. + case plusReplaced + + /// Encodes the string according to the encoding. + /// + /// - Parameter string: The `String` to encode. + /// + /// - Returns: The encoded `String`. + func encode(_ string: String) -> String { + switch self { + case .percentEscaped: return string.replacingOccurrences(of: " ", with: "%20") + case .plusReplaced: return string.replacingOccurrences(of: " ", with: "+") + } + } + } + + /// `URLEncodedFormEncoder` error. + public enum Error: Swift.Error { + /// An invalid root object was created by the encoder. Only keyed values are valid. + case invalidRootObject(String) + + var localizedDescription: String { + switch self { + case let .invalidRootObject(object): + return "URLEncodedFormEncoder requires keyed root object. Received \(object) instead." + } + } + } + + /// Whether or not to sort the encoded key value pairs. + /// + /// - Note: This setting ensures a consistent ordering for all encodings of the same parameters. When set to `false`, + /// encoded `Dictionary` values may have a different encoded order each time they're encoded due to + /// ` Dictionary`'s random storage order, but `Encodable` types will maintain their encoded order. + public let alphabetizeKeyValuePairs: Bool + /// The `ArrayEncoding` to use. + public let arrayEncoding: ArrayEncoding + /// The `BoolEncoding` to use. + public let boolEncoding: BoolEncoding + /// THe `DataEncoding` to use. + public let dataEncoding: DataEncoding + /// The `DateEncoding` to use. + public let dateEncoding: DateEncoding + /// The `KeyEncoding` to use. + public let keyEncoding: KeyEncoding + /// The `KeyPathEncoding` to use. + public let keyPathEncoding: KeyPathEncoding + /// The `NilEncoding` to use. + public let nilEncoding: NilEncoding + /// The `SpaceEncoding` to use. + public let spaceEncoding: SpaceEncoding + /// The `CharacterSet` of allowed (non-escaped) characters. + public var allowedCharacters: CharacterSet + + /// Creates an instance from the supplied parameters. + /// + /// - Parameters: + /// - alphabetizeKeyValuePairs: Whether or not to sort the encoded key value pairs. `true` by default. + /// - arrayEncoding: The `ArrayEncoding` to use. `.brackets` by default. + /// - boolEncoding: The `BoolEncoding` to use. `.numeric` by default. + /// - dataEncoding: The `DataEncoding` to use. `.base64` by default. + /// - dateEncoding: The `DateEncoding` to use. `.deferredToDate` by default. + /// - keyEncoding: The `KeyEncoding` to use. `.useDefaultKeys` by default. + /// - nilEncoding: The `NilEncoding` to use. `.drop` by default. + /// - spaceEncoding: The `SpaceEncoding` to use. `.percentEscaped` by default. + /// - allowedCharacters: The `CharacterSet` of allowed (non-escaped) characters. `.afURLQueryAllowed` by + /// default. + public init(alphabetizeKeyValuePairs: Bool = true, + arrayEncoding: ArrayEncoding = .brackets, + boolEncoding: BoolEncoding = .numeric, + dataEncoding: DataEncoding = .base64, + dateEncoding: DateEncoding = .deferredToDate, + keyEncoding: KeyEncoding = .useDefaultKeys, + keyPathEncoding: KeyPathEncoding = .brackets, + nilEncoding: NilEncoding = .dropKey, + spaceEncoding: SpaceEncoding = .percentEscaped, + allowedCharacters: CharacterSet = .afURLQueryAllowed) { + self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs + self.arrayEncoding = arrayEncoding + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.keyEncoding = keyEncoding + self.keyPathEncoding = keyPathEncoding + self.nilEncoding = nilEncoding + self.spaceEncoding = spaceEncoding + self.allowedCharacters = allowedCharacters + } + + func encode(_ value: Encodable) throws -> URLEncodedFormComponent { + let context = URLEncodedFormContext(.object([])) + let encoder = _URLEncodedFormEncoder(context: context, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + try value.encode(to: encoder) + + return context.component + } + + /// Encodes the `value` as a URL form encoded `String`. + /// + /// - Parameter value: The `Encodable` value.` + /// + /// - Returns: The encoded `String`. + /// - Throws: An `Error` or `EncodingError` instance if encoding fails. + public func encode(_ value: Encodable) throws -> String { + let component: URLEncodedFormComponent = try encode(value) + + guard case let .object(object) = component else { + throw Error.invalidRootObject("\(component)") + } + + let serializer = URLEncodedFormSerializer(alphabetizeKeyValuePairs: alphabetizeKeyValuePairs, + arrayEncoding: arrayEncoding, + keyEncoding: keyEncoding, + keyPathEncoding: keyPathEncoding, + spaceEncoding: spaceEncoding, + allowedCharacters: allowedCharacters) + let query = serializer.serialize(object) + + return query + } + + /// Encodes the value as `Data`. This is performed by first creating an encoded `String` and then returning the + /// `.utf8` data. + /// + /// - Parameter value: The `Encodable` value. + /// + /// - Returns: The encoded `Data`. + /// + /// - Throws: An `Error` or `EncodingError` instance if encoding fails. + public func encode(_ value: Encodable) throws -> Data { + let string: String = try encode(value) + + return Data(string.utf8) + } +} + +final class _URLEncodedFormEncoder { + var codingPath: [CodingKey] + // Returns an empty dictionary, as this encoder doesn't support userInfo. + var userInfo: [CodingUserInfoKey: Any] { [:] } + + let context: URLEncodedFormContext + + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + private let nilEncoding: URLEncodedFormEncoder.NilEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey] = [], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding, + nilEncoding: URLEncodedFormEncoder.NilEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.nilEncoding = nilEncoding + } +} + +extension _URLEncodedFormEncoder: Encoder { + func container(keyedBy type: Key.Type) -> KeyedEncodingContainer where Key: CodingKey { + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + return KeyedEncodingContainer(container) + } + + func unkeyedContainer() -> UnkeyedEncodingContainer { + _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } + + func singleValueContainer() -> SingleValueEncodingContainer { + _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } +} + +final class URLEncodedFormContext { + var component: URLEncodedFormComponent + + init(_ component: URLEncodedFormComponent) { + self.component = component + } +} + +enum URLEncodedFormComponent { + typealias Object = [(key: String, value: URLEncodedFormComponent)] + + case string(String) + case array([URLEncodedFormComponent]) + case object(Object) + + /// Converts self to an `[URLEncodedFormData]` or returns `nil` if not convertible. + var array: [URLEncodedFormComponent]? { + switch self { + case let .array(array): return array + default: return nil + } + } + + /// Converts self to an `Object` or returns `nil` if not convertible. + var object: Object? { + switch self { + case let .object(object): return object + default: return nil + } + } + + /// Sets self to the supplied value at a given path. + /// + /// data.set(to: "hello", at: ["path", "to", "value"]) + /// + /// - parameters: + /// - value: Value of `Self` to set at the supplied path. + /// - path: `CodingKey` path to update with the supplied value. + public mutating func set(to value: URLEncodedFormComponent, at path: [CodingKey]) { + set(&self, to: value, at: path) + } + + /// Recursive backing method to `set(to:at:)`. + private func set(_ context: inout URLEncodedFormComponent, to value: URLEncodedFormComponent, at path: [CodingKey]) { + guard !path.isEmpty else { + context = value + return + } + + let end = path[0] + var child: URLEncodedFormComponent + switch path.count { + case 1: + child = value + case 2...: + if let index = end.intValue { + let array = context.array ?? [] + if array.count > index { + child = array[index] + } else { + child = .array([]) + } + set(&child, to: value, at: Array(path[1...])) + } else { + child = context.object?.first { $0.key == end.stringValue }?.value ?? .object(.init()) + set(&child, to: value, at: Array(path[1...])) + } + default: fatalError("Unreachable") + } + + if let index = end.intValue { + if var array = context.array { + if array.count > index { + array[index] = child + } else { + array.append(child) + } + context = .array(array) + } else { + context = .array([child]) + } + } else { + if var object = context.object { + if let index = object.firstIndex(where: { $0.key == end.stringValue }) { + object[index] = (key: end.stringValue, value: child) + } else { + object.append((key: end.stringValue, value: child)) + } + context = .object(object) + } else { + context = .object([(key: end.stringValue, value: child)]) + } + } + } +} + +struct AnyCodingKey: CodingKey, Hashable { + let stringValue: String + let intValue: Int? + + init?(stringValue: String) { + self.stringValue = stringValue + intValue = nil + } + + init?(intValue: Int) { + stringValue = "\(intValue)" + self.intValue = intValue + } + + init(_ base: Key) where Key: CodingKey { + if let intValue = base.intValue { + self.init(intValue: intValue)! + } else { + self.init(stringValue: base.stringValue)! + } + } +} + +extension _URLEncodedFormEncoder { + final class KeyedContainer where Key: CodingKey { + var codingPath: [CodingKey] + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + private let nilEncoding: URLEncodedFormEncoder.NilEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding, + nilEncoding: URLEncodedFormEncoder.NilEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.nilEncoding = nilEncoding + } + + private func nestedCodingPath(for key: CodingKey) -> [CodingKey] { + codingPath + [key] + } + } +} + +extension _URLEncodedFormEncoder.KeyedContainer: KeyedEncodingContainerProtocol { + func encodeNil(forKey key: Key) throws { + guard let nilValue = nilEncoding.encodeNil() else { return } + + try encode(nilValue, forKey: key) + } + + func encodeIfPresent(_ value: Bool?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: String?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Double?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Float?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Int?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Int8?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Int16?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Int32?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Int64?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: UInt?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: UInt8?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: UInt16?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: UInt32?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: UInt64?, forKey key: Key) throws { + try _encodeIfPresent(value, forKey: key) + } + + func encodeIfPresent(_ value: Value?, forKey key: Key) throws where Value: Encodable { + try _encodeIfPresent(value, forKey: key) + } + + func _encodeIfPresent(_ value: Value?, forKey key: Key) throws where Value: Encodable { + if let value = value { + try encode(value, forKey: key) + } else { + try encodeNil(forKey: key) + } + } + + func encode(_ value: T, forKey key: Key) throws where T: Encodable { + var container = nestedSingleValueEncoder(for: key) + try container.encode(value) + } + + func nestedSingleValueEncoder(for key: Key) -> SingleValueEncodingContainer { + let container = _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + + return container + } + + func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { + let container = _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + + return container + } + + func nestedContainer(keyedBy keyType: NestedKey.Type, forKey key: Key) -> KeyedEncodingContainer where NestedKey: CodingKey { + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + + return KeyedEncodingContainer(container) + } + + func superEncoder() -> Encoder { + _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } + + func superEncoder(forKey key: Key) -> Encoder { + _URLEncodedFormEncoder(context: context, + codingPath: nestedCodingPath(for: key), + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } +} + +extension _URLEncodedFormEncoder { + final class SingleValueContainer { + var codingPath: [CodingKey] + + private var canEncodeNewValue = true + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + private let nilEncoding: URLEncodedFormEncoder.NilEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding, + nilEncoding: URLEncodedFormEncoder.NilEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.nilEncoding = nilEncoding + } + + private func checkCanEncode(value: Any?) throws { + guard canEncodeNewValue else { + let context = EncodingError.Context(codingPath: codingPath, + debugDescription: "Attempt to encode value through single value container when previously value already encoded.") + throw EncodingError.invalidValue(value as Any, context) + } + } + } +} + +extension _URLEncodedFormEncoder.SingleValueContainer: SingleValueEncodingContainer { + func encodeNil() throws { + guard let nilValue = nilEncoding.encodeNil() else { return } + + try encode(nilValue) + } + + func encode(_ value: Bool) throws { + try encode(value, as: String(boolEncoding.encode(value))) + } + + func encode(_ value: String) throws { + try encode(value, as: value) + } + + func encode(_ value: Double) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Float) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int8) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int16) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int32) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: Int64) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt8) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt16) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt32) throws { + try encode(value, as: String(value)) + } + + func encode(_ value: UInt64) throws { + try encode(value, as: String(value)) + } + + private func encode(_ value: T, as string: String) throws where T: Encodable { + try checkCanEncode(value: value) + defer { canEncodeNewValue = false } + + context.component.set(to: .string(string), at: codingPath) + } + + func encode(_ value: T) throws where T: Encodable { + switch value { + case let date as Date: + guard let string = try dateEncoding.encode(date) else { + try attemptToEncode(value) + return + } + + try encode(value, as: string) + case let data as Data: + guard let string = try dataEncoding.encode(data) else { + try attemptToEncode(value) + return + } + + try encode(value, as: string) + case let decimal as Decimal: + // Decimal's `Encodable` implementation returns an object, not a single value, so override it. + try encode(value, as: String(describing: decimal)) + default: + try attemptToEncode(value) + } + } + + private func attemptToEncode(_ value: T) throws where T: Encodable { + try checkCanEncode(value: value) + defer { canEncodeNewValue = false } + + let encoder = _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + try value.encode(to: encoder) + } +} + +extension _URLEncodedFormEncoder { + final class UnkeyedContainer { + var codingPath: [CodingKey] + + var count = 0 + var nestedCodingPath: [CodingKey] { + codingPath + [AnyCodingKey(intValue: count)!] + } + + private let context: URLEncodedFormContext + private let boolEncoding: URLEncodedFormEncoder.BoolEncoding + private let dataEncoding: URLEncodedFormEncoder.DataEncoding + private let dateEncoding: URLEncodedFormEncoder.DateEncoding + private let nilEncoding: URLEncodedFormEncoder.NilEncoding + + init(context: URLEncodedFormContext, + codingPath: [CodingKey], + boolEncoding: URLEncodedFormEncoder.BoolEncoding, + dataEncoding: URLEncodedFormEncoder.DataEncoding, + dateEncoding: URLEncodedFormEncoder.DateEncoding, + nilEncoding: URLEncodedFormEncoder.NilEncoding) { + self.context = context + self.codingPath = codingPath + self.boolEncoding = boolEncoding + self.dataEncoding = dataEncoding + self.dateEncoding = dateEncoding + self.nilEncoding = nilEncoding + } + } +} + +extension _URLEncodedFormEncoder.UnkeyedContainer: UnkeyedEncodingContainer { + func encodeNil() throws { + guard let nilValue = nilEncoding.encodeNil() else { return } + + try encode(nilValue) + } + + func encode(_ value: T) throws where T: Encodable { + var container = nestedSingleValueContainer() + try container.encode(value) + } + + func nestedSingleValueContainer() -> SingleValueEncodingContainer { + defer { count += 1 } + + return _URLEncodedFormEncoder.SingleValueContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } + + func nestedContainer(keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer where NestedKey: CodingKey { + defer { count += 1 } + let container = _URLEncodedFormEncoder.KeyedContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + + return KeyedEncodingContainer(container) + } + + func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { + defer { count += 1 } + + return _URLEncodedFormEncoder.UnkeyedContainer(context: context, + codingPath: nestedCodingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } + + func superEncoder() -> Encoder { + defer { count += 1 } + + return _URLEncodedFormEncoder(context: context, + codingPath: codingPath, + boolEncoding: boolEncoding, + dataEncoding: dataEncoding, + dateEncoding: dateEncoding, + nilEncoding: nilEncoding) + } +} + +final class URLEncodedFormSerializer { + private let alphabetizeKeyValuePairs: Bool + private let arrayEncoding: URLEncodedFormEncoder.ArrayEncoding + private let keyEncoding: URLEncodedFormEncoder.KeyEncoding + private let keyPathEncoding: URLEncodedFormEncoder.KeyPathEncoding + private let spaceEncoding: URLEncodedFormEncoder.SpaceEncoding + private let allowedCharacters: CharacterSet + + init(alphabetizeKeyValuePairs: Bool, + arrayEncoding: URLEncodedFormEncoder.ArrayEncoding, + keyEncoding: URLEncodedFormEncoder.KeyEncoding, + keyPathEncoding: URLEncodedFormEncoder.KeyPathEncoding, + spaceEncoding: URLEncodedFormEncoder.SpaceEncoding, + allowedCharacters: CharacterSet) { + self.alphabetizeKeyValuePairs = alphabetizeKeyValuePairs + self.arrayEncoding = arrayEncoding + self.keyEncoding = keyEncoding + self.keyPathEncoding = keyPathEncoding + self.spaceEncoding = spaceEncoding + self.allowedCharacters = allowedCharacters + } + + func serialize(_ object: URLEncodedFormComponent.Object) -> String { + var output: [String] = [] + for (key, component) in object { + let value = serialize(component, forKey: key) + output.append(value) + } + output = alphabetizeKeyValuePairs ? output.sorted() : output + + return output.joinedWithAmpersands() + } + + func serialize(_ component: URLEncodedFormComponent, forKey key: String) -> String { + switch component { + case let .string(string): return "\(escape(keyEncoding.encode(key)))=\(escape(string))" + case let .array(array): return serialize(array, forKey: key) + case let .object(object): return serialize(object, forKey: key) + } + } + + func serialize(_ object: URLEncodedFormComponent.Object, forKey key: String) -> String { + var segments: [String] = object.map { subKey, value in + let keyPath = keyPathEncoding.encodeKeyPath(subKey) + return serialize(value, forKey: key + keyPath) + } + segments = alphabetizeKeyValuePairs ? segments.sorted() : segments + + return segments.joinedWithAmpersands() + } + + func serialize(_ array: [URLEncodedFormComponent], forKey key: String) -> String { + var segments: [String] = array.enumerated().map { index, component in + let keyPath = arrayEncoding.encode(key, atIndex: index) + return serialize(component, forKey: keyPath) + } + segments = alphabetizeKeyValuePairs ? segments.sorted() : segments + + return segments.joinedWithAmpersands() + } + + func escape(_ query: String) -> String { + var allowedCharactersWithSpace = allowedCharacters + allowedCharactersWithSpace.insert(charactersIn: " ") + let escapedQuery = query.addingPercentEncoding(withAllowedCharacters: allowedCharactersWithSpace) ?? query + let spaceEncodedQuery = spaceEncoding.encode(escapedQuery) + + return spaceEncodedQuery + } +} + +extension Array where Element == String { + func joinedWithAmpersands() -> String { + joined(separator: "&") + } +} + +extension CharacterSet { + /// Creates a CharacterSet from RFC 3986 allowed characters. + /// + /// RFC 3986 states that the following characters are "reserved" characters. + /// + /// - General Delimiters: ":", "#", "[", "]", "@", "?", "/" + /// - Sub-Delimiters: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "=" + /// + /// In RFC 3986 - Section 3.4, it states that the "?" and "/" characters should not be escaped to allow + /// query strings to include a URL. Therefore, all "reserved" characters with the exception of "?" and "/" + /// should be percent-escaped in the query string. + public static let afURLQueryAllowed: CharacterSet = { + let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4 + let subDelimitersToEncode = "!$&'()*+,;=" + let encodableDelimiters = CharacterSet(charactersIn: "\(generalDelimitersToEncode)\(subDelimitersToEncode)") + + return CharacterSet.urlQueryAllowed.subtracting(encodableDelimiters) + }() +} diff --git a/Carthage/Checkouts/Alamofire/Source/URLRequest+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/URLRequest+Alamofire.swift new file mode 100644 index 00000000..ab72fb53 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/URLRequest+Alamofire.swift @@ -0,0 +1,39 @@ +// +// URLRequest+Alamofire.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension URLRequest { + /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type. + public var method: HTTPMethod? { + get { httpMethod.map(HTTPMethod.init) } + set { httpMethod = newValue?.rawValue } + } + + public func validate() throws { + if method == .get, let bodyData = httpBody { + throw AFError.urlRequestValidationFailed(reason: .bodyDataInGETRequest(bodyData)) + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/URLSessionConfiguration+Alamofire.swift b/Carthage/Checkouts/Alamofire/Source/URLSessionConfiguration+Alamofire.swift new file mode 100644 index 00000000..292a8fe7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/URLSessionConfiguration+Alamofire.swift @@ -0,0 +1,46 @@ +// +// URLSessionConfiguration+Alamofire.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension URLSessionConfiguration: AlamofireExtended {} +extension AlamofireExtension where ExtendedType: URLSessionConfiguration { + /// Alamofire's default configuration. Same as `URLSessionConfiguration.default` but adds Alamofire default + /// `Accept-Language`, `Accept-Encoding`, and `User-Agent` headers. + public static var `default`: URLSessionConfiguration { + let configuration = URLSessionConfiguration.default + configuration.headers = .default + + return configuration + } + + /// `.ephemeral` configuration with Alamofire's default `Accept-Language`, `Accept-Encoding`, and `User-Agent` + /// headers. + public static var ephemeral: URLSessionConfiguration { + let configuration = URLSessionConfiguration.ephemeral + configuration.headers = .default + + return configuration + } +} diff --git a/Carthage/Checkouts/Alamofire/Source/Validation.swift b/Carthage/Checkouts/Alamofire/Source/Validation.swift new file mode 100644 index 00000000..2cf23fba --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Source/Validation.swift @@ -0,0 +1,302 @@ +// +// Validation.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Request { + // MARK: Helper Types + + fileprivate typealias ErrorReason = AFError.ResponseValidationFailureReason + + /// Used to represent whether a validation succeeded or failed. + public typealias ValidationResult = Result + + fileprivate struct MIMEType { + let type: String + let subtype: String + + var isWildcard: Bool { type == "*" && subtype == "*" } + + init?(_ string: String) { + let components: [String] = { + let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines) + let split = stripped[..<(stripped.range(of: ";")?.lowerBound ?? stripped.endIndex)] + + return split.components(separatedBy: "/") + }() + + if let type = components.first, let subtype = components.last { + self.type = type + self.subtype = subtype + } else { + return nil + } + } + + func matches(_ mime: MIMEType) -> Bool { + switch (type, subtype) { + case (mime.type, mime.subtype), (mime.type, "*"), ("*", mime.subtype), ("*", "*"): + return true + default: + return false + } + } + } + + // MARK: Properties + + fileprivate var acceptableStatusCodes: Range { 200..<300 } + + fileprivate var acceptableContentTypes: [String] { + if let accept = request?.value(forHTTPHeaderField: "Accept") { + return accept.components(separatedBy: ",") + } + + return ["*/*"] + } + + // MARK: Status Code + + fileprivate func validate(statusCode acceptableStatusCodes: S, + response: HTTPURLResponse) + -> ValidationResult + where S.Iterator.Element == Int { + if acceptableStatusCodes.contains(response.statusCode) { + return .success(()) + } else { + let reason: ErrorReason = .unacceptableStatusCode(code: response.statusCode) + return .failure(AFError.responseValidationFailed(reason: reason)) + } + } + + // MARK: Content Type + + fileprivate func validate(contentType acceptableContentTypes: S, + response: HTTPURLResponse, + data: Data?) + -> ValidationResult + where S.Iterator.Element == String { + guard let data = data, !data.isEmpty else { return .success(()) } + + return validate(contentType: acceptableContentTypes, response: response) + } + + fileprivate func validate(contentType acceptableContentTypes: S, + response: HTTPURLResponse) + -> ValidationResult + where S.Iterator.Element == String { + guard + let responseContentType = response.mimeType, + let responseMIMEType = MIMEType(responseContentType) + else { + for contentType in acceptableContentTypes { + if let mimeType = MIMEType(contentType), mimeType.isWildcard { + return .success(()) + } + } + + let error: AFError = { + let reason: ErrorReason = .missingContentType(acceptableContentTypes: acceptableContentTypes.sorted()) + return AFError.responseValidationFailed(reason: reason) + }() + + return .failure(error) + } + + for contentType in acceptableContentTypes { + if let acceptableMIMEType = MIMEType(contentType), acceptableMIMEType.matches(responseMIMEType) { + return .success(()) + } + } + + let error: AFError = { + let reason: ErrorReason = .unacceptableContentType(acceptableContentTypes: acceptableContentTypes.sorted(), + responseContentType: responseContentType) + + return AFError.responseValidationFailed(reason: reason) + }() + + return .failure(error) + } +} + +// MARK: - + +extension DataRequest { + /// A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the + /// request was valid. + public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult + + /// Validates that the response has a status code in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes. + /// + /// - Returns: The instance. + @discardableResult + public func validate(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int { + validate { [unowned self] _, response, _ in + self.validate(statusCode: acceptableStatusCodes, response: response) + } + } + + /// Validates that the response has a content type in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + /// + /// - returns: The request. + @discardableResult + public func validate(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String { + validate { [unowned self] _, response, data in + self.validate(contentType: acceptableContentTypes(), response: response, data: data) + } + } + + /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content + /// type matches any specified in the Accept HTTP header field. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - returns: The request. + @discardableResult + public func validate() -> Self { + let contentTypes: () -> [String] = { [unowned self] in + acceptableContentTypes + } + return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes()) + } +} + +extension DataStreamRequest { + /// A closure used to validate a request that takes a `URLRequest` and `HTTPURLResponse` and returns whether the + /// request was valid. + public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult + + /// Validates that the response has a status code in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes. + /// + /// - Returns: The instance. + @discardableResult + public func validate(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int { + validate { [unowned self] _, response in + self.validate(statusCode: acceptableStatusCodes, response: response) + } + } + + /// Validates that the response has a content type in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + /// + /// - returns: The request. + @discardableResult + public func validate(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String { + validate { [unowned self] _, response in + self.validate(contentType: acceptableContentTypes(), response: response) + } + } + + /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content + /// type matches any specified in the Accept HTTP header field. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Returns: The instance. + @discardableResult + public func validate() -> Self { + let contentTypes: () -> [String] = { [unowned self] in + acceptableContentTypes + } + return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes()) + } +} + +// MARK: - + +extension DownloadRequest { + /// A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a + /// destination URL, and returns whether the request was valid. + public typealias Validation = (_ request: URLRequest?, + _ response: HTTPURLResponse, + _ fileURL: URL?) + -> ValidationResult + + /// Validates that the response has a status code in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - Parameter acceptableStatusCodes: `Sequence` of acceptable response status codes. + /// + /// - Returns: The instance. + @discardableResult + public func validate(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int { + validate { [unowned self] _, response, _ in + self.validate(statusCode: acceptableStatusCodes, response: response) + } + } + + /// Validates that the response has a content type in the specified sequence. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes. + /// + /// - returns: The request. + @discardableResult + public func validate(contentType acceptableContentTypes: @escaping @autoclosure () -> S) -> Self where S.Iterator.Element == String { + validate { [unowned self] _, response, fileURL in + guard let validFileURL = fileURL else { + return .failure(AFError.responseValidationFailed(reason: .dataFileNil)) + } + + do { + let data = try Data(contentsOf: validFileURL) + return self.validate(contentType: acceptableContentTypes(), response: response, data: data) + } catch { + return .failure(AFError.responseValidationFailed(reason: .dataFileReadFailed(at: validFileURL))) + } + } + } + + /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content + /// type matches any specified in the Accept HTTP header field. + /// + /// If validation fails, subsequent calls to response handlers will have an associated error. + /// + /// - returns: The request. + @discardableResult + public func validate() -> Self { + let contentTypes = { [unowned self] in + acceptableContentTypes + } + return validate(statusCode: acceptableStatusCodes).validate(contentType: contentTypes()) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/AFError+AlamofireTests.swift b/Carthage/Checkouts/Alamofire/Tests/AFError+AlamofireTests.swift new file mode 100644 index 00000000..ad2b86f4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/AFError+AlamofireTests.swift @@ -0,0 +1,402 @@ +// +// AFError+AlamofireTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +extension AFError { + // ParameterEncodingFailureReason + + var isMissingURLFailed: Bool { + if case let .parameterEncodingFailed(reason) = self, reason.isMissingURL { return true } + return false + } + + var isJSONEncodingFailed: Bool { + if case let .parameterEncodingFailed(reason) = self, reason.isJSONEncodingFailed { return true } + return false + } + + // MultipartEncodingFailureReason + + var isBodyPartURLInvalid: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartURLInvalid { return true } + return false + } + + var isBodyPartFilenameInvalid: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFilenameInvalid { return true } + return false + } + + var isBodyPartFileNotReachable: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFileNotReachable { return true } + return false + } + + var isBodyPartFileNotReachableWithError: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFileNotReachableWithError { return true } + return false + } + + var isBodyPartFileIsDirectory: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFileIsDirectory { return true } + return false + } + + var isBodyPartFileSizeNotAvailable: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFileSizeNotAvailable { return true } + return false + } + + var isBodyPartFileSizeQueryFailedWithError: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartFileSizeQueryFailedWithError { return true } + return false + } + + var isBodyPartInputStreamCreationFailed: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isBodyPartInputStreamCreationFailed { return true } + return false + } + + var isOutputStreamCreationFailed: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isOutputStreamCreationFailed { return true } + return false + } + + var isOutputStreamFileAlreadyExists: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isOutputStreamFileAlreadyExists { return true } + return false + } + + var isOutputStreamURLInvalid: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isOutputStreamURLInvalid { return true } + return false + } + + var isOutputStreamWriteFailed: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isOutputStreamWriteFailed { return true } + return false + } + + var isInputStreamReadFailed: Bool { + if case let .multipartEncodingFailed(reason) = self, reason.isInputStreamReadFailed { return true } + return false + } + + // ResponseSerializationFailureReason + + var isInputDataNilOrZeroLength: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isInputDataNilOrZeroLength { return true } + return false + } + + var isInputFileNil: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isInputFileNil { return true } + return false + } + + var isInputFileReadFailed: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isInputFileReadFailed { return true } + return false + } + + var isStringSerializationFailed: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isStringSerializationFailed { return true } + return false + } + + var isJSONSerializationFailed: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isJSONSerializationFailed { return true } + return false + } + + var isJSONDecodingFailed: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isDecodingFailed { return true } + return false + } + + var isInvalidEmptyResponse: Bool { + if case let .responseSerializationFailed(reason) = self, reason.isInvalidEmptyResponse { return true } + return false + } + + // ResponseValidationFailureReason + + var isDataFileNil: Bool { + if case let .responseValidationFailed(reason) = self, reason.isDataFileNil { return true } + return false + } + + var isDataFileReadFailed: Bool { + if case let .responseValidationFailed(reason) = self, reason.isDataFileReadFailed { return true } + return false + } + + var isMissingContentType: Bool { + if case let .responseValidationFailed(reason) = self, reason.isMissingContentType { return true } + return false + } + + var isUnacceptableContentType: Bool { + if case let .responseValidationFailed(reason) = self, reason.isUnacceptableContentType { return true } + return false + } + + var isUnacceptableStatusCode: Bool { + if case let .responseValidationFailed(reason) = self, reason.isUnacceptableStatusCode { return true } + return false + } + + // URLRequestValidationFailure + + var isBodyDataInGETRequest: Bool { + if case let .urlRequestValidationFailed(reason) = self, reason.isBodyDataInGETRequest { return true } + return false + } + + var isHostURLError: Bool { + guard let errorCode = (underlyingError as? URLError)?.code else { return false } + return [.cannotConnectToHost, .cannotFindHost].contains(errorCode) + } +} + +// MARK: - + +extension AFError.ParameterEncodingFailureReason { + var isMissingURL: Bool { + if case .missingURL = self { return true } + return false + } + + var isJSONEncodingFailed: Bool { + if case .jsonEncodingFailed = self { return true } + return false + } +} + +// MARK: - + +extension AFError.MultipartEncodingFailureReason { + var isBodyPartURLInvalid: Bool { + if case .bodyPartURLInvalid = self { return true } + return false + } + + var isBodyPartFilenameInvalid: Bool { + if case .bodyPartFilenameInvalid = self { return true } + return false + } + + var isBodyPartFileNotReachable: Bool { + if case .bodyPartFileNotReachable = self { return true } + return false + } + + var isBodyPartFileNotReachableWithError: Bool { + if case .bodyPartFileNotReachableWithError = self { return true } + return false + } + + var isBodyPartFileIsDirectory: Bool { + if case .bodyPartFileIsDirectory = self { return true } + return false + } + + var isBodyPartFileSizeNotAvailable: Bool { + if case .bodyPartFileSizeNotAvailable = self { return true } + return false + } + + var isBodyPartFileSizeQueryFailedWithError: Bool { + if case .bodyPartFileSizeQueryFailedWithError = self { return true } + return false + } + + var isBodyPartInputStreamCreationFailed: Bool { + if case .bodyPartInputStreamCreationFailed = self { return true } + return false + } + + var isOutputStreamCreationFailed: Bool { + if case .outputStreamCreationFailed = self { return true } + return false + } + + var isOutputStreamFileAlreadyExists: Bool { + if case .outputStreamFileAlreadyExists = self { return true } + return false + } + + var isOutputStreamURLInvalid: Bool { + if case .outputStreamURLInvalid = self { return true } + return false + } + + var isOutputStreamWriteFailed: Bool { + if case .outputStreamWriteFailed = self { return true } + return false + } + + var isInputStreamReadFailed: Bool { + if case .inputStreamReadFailed = self { return true } + return false + } +} + +// MARK: - + +extension AFError.ResponseSerializationFailureReason { + var isInputDataNilOrZeroLength: Bool { + if case .inputDataNilOrZeroLength = self { return true } + return false + } + + var isInputFileNil: Bool { + if case .inputFileNil = self { return true } + return false + } + + var isInputFileReadFailed: Bool { + if case .inputFileReadFailed = self { return true } + return false + } + + var isStringSerializationFailed: Bool { + if case .stringSerializationFailed = self { return true } + return false + } + + var isJSONSerializationFailed: Bool { + if case .jsonSerializationFailed = self { return true } + return false + } + + var isDecodingFailed: Bool { + if case .decodingFailed = self { return true } + return false + } + + var isInvalidEmptyResponse: Bool { + if case .invalidEmptyResponse = self { return true } + return false + } +} + +// MARK: - + +extension AFError.ResponseValidationFailureReason { + var isDataFileNil: Bool { + if case .dataFileNil = self { return true } + return false + } + + var isDataFileReadFailed: Bool { + if case .dataFileReadFailed = self { return true } + return false + } + + var isMissingContentType: Bool { + if case .missingContentType = self { return true } + return false + } + + var isUnacceptableContentType: Bool { + if case .unacceptableContentType = self { return true } + return false + } + + var isUnacceptableStatusCode: Bool { + if case .unacceptableStatusCode = self { return true } + return false + } +} + +// MARK: - + +#if canImport(Security) +extension AFError.ServerTrustFailureReason { + var isNoRequiredEvaluator: Bool { + if case .noRequiredEvaluator = self { return true } + return false + } + + var isNoCertificatesFound: Bool { + if case .noCertificatesFound = self { return true } + return false + } + + var isNoPublicKeysFound: Bool { + if case .noPublicKeysFound = self { return true } + return false + } + + var isPolicyApplicationFailed: Bool { + if case .policyApplicationFailed = self { return true } + return false + } + + var isRevocationPolicyCreationFailed: Bool { + if case .revocationPolicyCreationFailed = self { return true } + return false + } + + var isTrustEvaluationFailed: Bool { + if case .trustEvaluationFailed = self { return true } + return false + } + + var isDefaultEvaluationFailed: Bool { + if case .defaultEvaluationFailed = self { return true } + return false + } + + var isHostValidationFailed: Bool { + if case .hostValidationFailed = self { return true } + return false + } + + var isRevocationCheckFailed: Bool { + if case .revocationCheckFailed = self { return true } + return false + } + + var isCertificatePinningFailed: Bool { + if case .certificatePinningFailed = self { return true } + return false + } + + var isPublicKeyPinningFailed: Bool { + if case .publicKeyPinningFailed = self { return true } + return false + } +} +#endif + +extension AFError.URLRequestValidationFailureReason { + var isBodyDataInGETRequest: Bool { + if case .bodyDataInGETRequest = self { return true } + return false + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/AuthenticationInterceptorTests.swift b/Carthage/Checkouts/Alamofire/Tests/AuthenticationInterceptorTests.swift new file mode 100644 index 00000000..2f44b92f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/AuthenticationInterceptorTests.swift @@ -0,0 +1,695 @@ +// +// AuthenticationInterceptorTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +final class AuthenticationInterceptorTestCase: BaseTestCase { + // MARK: - Helper Types + + struct TestCredential: AuthenticationCredential { + let accessToken: String + let refreshToken: String + let userID: String + let expiration: Date + + let requiresRefresh: Bool + + init(accessToken: String = "a0", + refreshToken: String = "r0", + userID: String = "u0", + expiration: Date = Date(), + requiresRefresh: Bool = false) { + self.accessToken = accessToken + self.refreshToken = refreshToken + self.userID = userID + self.expiration = expiration + self.requiresRefresh = requiresRefresh + } + } + + enum TestAuthError: Error { + case refreshNetworkFailure + } + + final class TestAuthenticator: Authenticator { + private(set) var applyCount = 0 + private(set) var refreshCount = 0 + private(set) var didRequestFailDueToAuthErrorCount = 0 + private(set) var isRequestAuthenticatedWithCredentialCount = 0 + + let shouldRefreshAsynchronously: Bool + let refreshResult: Result? + let lock = NSLock() + + init(shouldRefreshAsynchronously: Bool = true, refreshResult: Result? = nil) { + self.shouldRefreshAsynchronously = shouldRefreshAsynchronously + self.refreshResult = refreshResult + } + + func apply(_ credential: TestCredential, to urlRequest: inout URLRequest) { + lock.lock(); defer { lock.unlock() } + + applyCount += 1 + + urlRequest.headers.add(.authorization(credential.accessToken)) + } + + func refresh(_ credential: TestCredential, + for session: Session, + completion: @escaping (Result) -> Void) { + lock.lock() + + refreshCount += 1 + + let result = refreshResult ?? .success( + TestCredential(accessToken: "a\(refreshCount)", + refreshToken: "a\(refreshCount)", + userID: "u1", + expiration: Date()) + ) + + if shouldRefreshAsynchronously { + // The 10 ms delay here is important to allow multiple requests to queue up while refreshing. + DispatchQueue.global(qos: .utility).asyncAfter(deadline: .now() + 0.01) { completion(result) } + lock.unlock() + } else { + lock.unlock() + completion(result) + } + } + + func didRequest(_ urlRequest: URLRequest, + with response: HTTPURLResponse, + failDueToAuthenticationError error: Error) + -> Bool { + lock.lock(); defer { lock.unlock() } + + didRequestFailDueToAuthErrorCount += 1 + + return response.statusCode == 401 + } + + func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: TestCredential) -> Bool { + lock.lock(); defer { lock.unlock() } + + isRequestAuthenticatedWithCredentialCount += 1 + + return urlRequest.headers["Authorization"] == credential.accessToken + } + } + + final class PathAdapter: RequestAdapter { + var paths: [String] + + init(paths: [String]) { + self.paths = paths + } + + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + var request = urlRequest + + var urlComponents = URLComponents(url: request.url!, resolvingAgainstBaseURL: false)! + urlComponents.path = paths.removeFirst() + + request.url = urlComponents.url + + completion(.success(request)) + } + } + + // MARK: - Tests - Adapt + + func testThatInterceptorCanAdaptURLRequest() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a0") + XCTAssertEqual(response?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorQueuesAdaptOperationWhenRefreshing() { + // Given + let credential = TestCredential(requiresRefresh: true) + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = Session() + + let expect = expectation(description: "both requests should complete") + expect.expectedFulfillmentCount = 2 + + var response1: AFDataResponse? + var response2: AFDataResponse? + + // When + let request1 = session.request(.status(200), interceptor: interceptor).validate().response { + response1 = $0 + expect.fulfill() + } + + let request2 = session.request(.status(202), interceptor: interceptor).validate().response { + response2 = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response1?.request?.headers["Authorization"], "a1") + XCTAssertEqual(response2?.request?.headers["Authorization"], "a1") + XCTAssertEqual(response1?.result.isSuccess, true) + XCTAssertEqual(response2?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 2) + XCTAssertEqual(authenticator.refreshCount, 1) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request1.retryCount, 0) + XCTAssertEqual(request2.retryCount, 0) + } + + func testThatInterceptorThrowsMissingCredentialErrorWhenCredentialIsNil() { + // Given + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers.count, 0) + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isRequestAdaptationError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.underlyingError as? AuthenticationError, .missingCredential) + + XCTAssertEqual(authenticator.applyCount, 0) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorRethrowsRefreshErrorFromAdapt() { + // Given + let credential = TestCredential(requiresRefresh: true) + let authenticator = TestAuthenticator(refreshResult: .failure(TestAuthError.refreshNetworkFailure)) + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers.count, 0) + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isRequestAdaptationError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.underlyingError as? TestAuthError, .refreshNetworkFailure) + + if case let .requestRetryFailed(_, originalError) = response?.result.failure { + XCTAssertEqual(originalError.asAFError?.isResponseValidationError, true) + XCTAssertEqual(originalError.asAFError?.responseCode, 401) + } + + XCTAssertEqual(authenticator.applyCount, 0) + XCTAssertEqual(authenticator.refreshCount, 1) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + // MARK: - Tests - Retry + + // If we not using swift-corelibs-foundation where URLRequest to /invalid/path is a fatal error. + #if !canImport(FoundationNetworking) + func testThatInterceptorDoesNotRetryWithoutResponse() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let urlRequest = URLRequest(url: URL(string: "/invalid/path")!) + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(urlRequest, interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a0") + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isSessionTaskError, true) + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + #endif + + func testThatInterceptorDoesNotRetryWhenRequestDoesNotFailDueToAuthError() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.status(500), interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a0") + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isResponseValidationError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.responseCode, 500) + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 1) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorThrowsMissingCredentialErrorWhenCredentialIsNilAndRequestShouldBeRetried() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = stored(Session()) + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.status(401), interceptor: interceptor) + .validate { + interceptor.credential = nil + } + .response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a0") + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isRequestRetryError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.underlyingError as? AuthenticationError, .missingCredential) + + if case let .requestRetryFailed(_, originalError) = response?.result.failure { + XCTAssertEqual(originalError.asAFError?.isResponseValidationError, true) + XCTAssertEqual(originalError.asAFError?.responseCode, 401) + } + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 1) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorRetriesRequestThatFailedWithOutdatedCredential() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = stored(Session()) + + let pathAdapter = PathAdapter(paths: ["/status/401", "/status/200"]) + let compositeInterceptor = Interceptor(adapters: [pathAdapter, interceptor], retriers: [interceptor]) + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: compositeInterceptor) + .validate { + interceptor.credential = TestCredential(accessToken: "a1", + refreshToken: "r1", + userID: "u0", + expiration: Date(), + requiresRefresh: false) + } + .response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a1") + XCTAssertEqual(response?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 2) + XCTAssertEqual(authenticator.refreshCount, 0) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 1) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 1) + + XCTAssertEqual(request.retryCount, 1) + } + + // Produces double lock reported in https://github.com/Alamofire/Alamofire/issues/3294#issuecomment-703241558 + func testThatInterceptorDoesNotDeadlockWhenAuthenticatorCallsRefreshCompletionSynchronouslyOnCallingQueue() { + // Given + let credential = TestCredential(requiresRefresh: true) + let authenticator = TestAuthenticator(shouldRefreshAsynchronously: false) + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let eventMonitor = ClosureEventMonitor() + + eventMonitor.requestDidCreateTask = { _, _ in + interceptor.credential = TestCredential(accessToken: "a1", + refreshToken: "r1", + userID: "u0", + expiration: Date(), + requiresRefresh: false) + } + + let session = Session(eventMonitors: [eventMonitor]) + + let pathAdapter = PathAdapter(paths: ["/status/200"]) + let compositeInterceptor = Interceptor(adapters: [pathAdapter, interceptor], retriers: [interceptor]) + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: compositeInterceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a1") + XCTAssertEqual(response?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 1) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 0) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 0) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorRetriesRequestAfterRefresh() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let pathAdapter = PathAdapter(paths: ["/status/401", "/status/200"]) + + let compositeInterceptor = Interceptor(adapters: [pathAdapter, interceptor], retriers: [interceptor]) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.default, interceptor: compositeInterceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a1") + XCTAssertEqual(response?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 2) + XCTAssertEqual(authenticator.refreshCount, 1) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 1) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 1) + + XCTAssertEqual(request.retryCount, 1) + } + + func testThatInterceptorRethrowsRefreshErrorFromRetry() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator(refreshResult: .failure(TestAuthError.refreshNetworkFailure)) + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.status(401), interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a0") + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isRequestRetryError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.underlyingError as? TestAuthError, .refreshNetworkFailure) + + if case let .requestRetryFailed(_, originalError) = response?.result.failure { + XCTAssertEqual(originalError.asAFError?.isResponseValidationError, true) + XCTAssertEqual(originalError.asAFError?.responseCode, 401) + } + + XCTAssertEqual(authenticator.applyCount, 1) + XCTAssertEqual(authenticator.refreshCount, 1) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 1) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 1) + + XCTAssertEqual(request.retryCount, 0) + } + + func testThatInterceptorTriggersRefreshWithMultipleParallelRequestsReturning401Responses() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, credential: credential) + + let requestCount = 6 + let session = stored(Session()) + + let expect = expectation(description: "both requests should complete") + expect.expectedFulfillmentCount = requestCount + + var requests: [Int: Request] = [:] + var responses: [Int: AFDataResponse] = [:] + + for index in 0..? + + // When + let request = session.request(.default, interceptor: compositeInterceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a5") + XCTAssertEqual(response?.result.isSuccess, true) + + XCTAssertEqual(authenticator.applyCount, 6) + XCTAssertEqual(authenticator.refreshCount, 5) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 5) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 5) + + XCTAssertEqual(request.retryCount, 5) + } + + func testThatInterceptorThrowsExcessiveRefreshErrorWhenExcessiveRefreshOccurs() { + // Given + let credential = TestCredential() + let authenticator = TestAuthenticator() + let interceptor = AuthenticationInterceptor(authenticator: authenticator, + credential: credential, + refreshWindow: .init(interval: 30, maximumAttempts: 2)) + + let session = Session() + + let expect = expectation(description: "request should complete") + var response: AFDataResponse? + + // When + let request = session.request(.status(401), interceptor: interceptor).validate().response { + response = $0 + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.request?.headers["Authorization"], "a2") + + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.result.failure?.asAFError?.isRequestRetryError, true) + XCTAssertEqual(response?.result.failure?.asAFError?.underlyingError as? AuthenticationError, .excessiveRefresh) + + if case let .requestRetryFailed(_, originalError) = response?.result.failure { + XCTAssertEqual(originalError.asAFError?.isResponseValidationError, true) + XCTAssertEqual(originalError.asAFError?.responseCode, 401) + } + + XCTAssertEqual(authenticator.applyCount, 3) + XCTAssertEqual(authenticator.refreshCount, 2) + XCTAssertEqual(authenticator.didRequestFailDueToAuthErrorCount, 3) + XCTAssertEqual(authenticator.isRequestAuthenticatedWithCredentialCount, 3) + + XCTAssertEqual(request.retryCount, 2) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/AuthenticationTests.swift b/Carthage/Checkouts/Alamofire/Tests/AuthenticationTests.swift new file mode 100644 index 00000000..45116a34 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/AuthenticationTests.swift @@ -0,0 +1,198 @@ +// +// AuthenticationTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class BasicAuthenticationTestCase: BaseTestCase { + func testHTTPBasicAuthenticationFailsWithInvalidCredentials() { + // Given + let session = Session() + let endpoint = Endpoint.basicAuth() + let expectation = expectation(description: "\(endpoint.url) 401") + + var response: DataResponse? + + // When + session.request(endpoint) + .authenticate(username: "invalid", password: "credentials") + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 401) + XCTAssertNil(response?.data) + XCTAssertNil(response?.error) + } + + func testHTTPBasicAuthenticationWithValidCredentials() { + // Given + let session = Session() + let user = "user1", password = "password" + let endpoint = Endpoint.basicAuth(forUser: user, password: password) + let expectation = expectation(description: "\(endpoint.url) 200") + + var response: DataResponse? + + // When + session.request(endpoint) + .authenticate(username: user, password: password) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 200) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testHTTPBasicAuthenticationWithStoredCredentials() { + // Given + let session = Session() + let user = "user2", password = "password" + let endpoint = Endpoint.basicAuth(forUser: user, password: password) + let expectation = expectation(description: "\(endpoint.url) 200") + + var response: DataResponse? + + // When + let credential = URLCredential(user: user, password: password, persistence: .forSession) + URLCredentialStorage.shared.setDefaultCredential(credential, + for: .init(host: endpoint.host.rawValue, + port: endpoint.port, + protocol: endpoint.scheme.rawValue, + realm: endpoint.host.rawValue, + authenticationMethod: NSURLAuthenticationMethodHTTPBasic)) + session.request(endpoint) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 200) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testHiddenHTTPBasicAuthentication() { + // Given + let session = Session() + let endpoint = Endpoint.hiddenBasicAuth() + let expectation = expectation(description: "\(endpoint.url) 200") + + var response: DataResponse? + + // When + session.request(endpoint) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 200) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } +} + +// MARK: - + +// Disabled due to HTTPBin flakiness. +final class HTTPDigestAuthenticationTestCase: BaseTestCase { + func _testHTTPDigestAuthenticationWithInvalidCredentials() { + // Given + let session = Session() + let endpoint = Endpoint.digestAuth() + let expectation = expectation(description: "\(endpoint.url) 401") + + var response: DataResponse? + + // When + session.request(endpoint) + .authenticate(username: "invalid", password: "credentials") + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 401) + XCTAssertNil(response?.data) + XCTAssertNil(response?.error) + } + + func _testHTTPDigestAuthenticationWithValidCredentials() { + // Given + let session = Session() + let user = "user", password = "password" + let endpoint = Endpoint.digestAuth(forUser: user, password: password) + let expectation = expectation(description: "\(endpoint.url) 200") + + var response: DataResponse? + + // When + session.request(endpoint) + .authenticate(username: user, password: password) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertEqual(response?.response?.statusCode, 200) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/BaseTestCase.swift b/Carthage/Checkouts/Alamofire/Tests/BaseTestCase.swift new file mode 100644 index 00000000..59f30b8b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/BaseTestCase.swift @@ -0,0 +1,94 @@ +// +// BaseTestCase.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +class BaseTestCase: XCTestCase { + let timeout: TimeInterval = 10 + + var testDirectoryURL: URL { + FileManager.temporaryDirectoryURL.appendingPathComponent("org.alamofire.tests") + } + + var temporaryFileURL: URL { + testDirectoryURL.appendingPathComponent(UUID().uuidString) + } + + private var session: Session? + + override func setUp() { + FileManager.createDirectory(at: testDirectoryURL) + + super.setUp() + } + + override func tearDown() { + session = nil + FileManager.removeAllItemsInsideDirectory(at: testDirectoryURL) + clearCredentials() + clearCookies() + + super.tearDown() + } + + func clearCookies(for storage: HTTPCookieStorage = .shared) { + storage.cookies?.forEach { storage.deleteCookie($0) } + } + + func clearCredentials(for storage: URLCredentialStorage = .shared) { + for (protectionSpace, credentials) in storage.allCredentials { + for (_, credential) in credentials { + storage.remove(credential, for: protectionSpace) + } + } + } + + func url(forResource fileName: String, withExtension ext: String) -> URL { + Bundle.test.url(forResource: fileName, withExtension: ext)! + } + + func stored(_ session: Session) -> Session { + self.session = session + + return session + } + + /// Runs assertions on a particular `DispatchQueue`. + /// + /// - Parameters: + /// - queue: The `DispatchQueue` on which to run the assertions. + /// - assertions: Closure containing assertions to run + func assert(on queue: DispatchQueue, assertions: @escaping () -> Void) { + let expect = expectation(description: "all assertions are complete") + + queue.async { + assertions() + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Bundle+AlamofireTests.swift b/Carthage/Checkouts/Alamofire/Tests/Bundle+AlamofireTests.swift new file mode 100644 index 00000000..f9a11d15 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Bundle+AlamofireTests.swift @@ -0,0 +1,38 @@ +// +// Bundle+AlamofireTests.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Bundle { + static var test: Bundle { + let bundle: Bundle + #if SWIFT_PACKAGE + bundle = Bundle.module + #else + bundle = Bundle(for: BaseTestCase.self) + #endif + + return bundle + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/CacheTests.swift b/Carthage/Checkouts/Alamofire/Tests/CacheTests.swift new file mode 100644 index 00000000..aa5ab0a6 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/CacheTests.swift @@ -0,0 +1,281 @@ +// +// CacheTests.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +/// This test case tests all implemented cache policies against various `Cache-Control` header values. These tests +/// are meant to cover the main cases of `Cache-Control` header usage, but are by no means exhaustive. +/// +/// These tests work as follows: +/// +/// - Set up an `URLCache` +/// - Set up an `Alamofire.Session` +/// - Execute requests for all `Cache-Control` header values to prime the `URLCache` with cached responses +/// - Start up a new test +/// - Execute another round of the same requests with a given `URLRequestCachePolicy` +/// - Verify whether the response came from the cache or from the network +/// - This is determined by whether the cached response timestamp matches the new response timestamp +/// +/// For information about `Cache-Control` HTTP headers, please refer to RFC 2616 - Section 14.9. +final class CacheTestCase: BaseTestCase { + // MARK: - + + enum CacheControl: String, CaseIterable { + case publicControl = "public" + case privateControl = "private" + case maxAgeNonExpired = "max-age=3600" + case maxAgeExpired = "max-age=0" + case noCache = "no-cache" + case noStore = "no-store" + } + + // MARK: - Properties + + var urlCache: URLCache! + var manager: Session! + + var requests: [CacheControl: URLRequest] = [:] + var timestamps: [CacheControl: String] = [:] + + // MARK: - Setup and Teardown + + override func setUp() { + super.setUp() + + urlCache = { + let capacity = 50 * 1024 * 1024 // MBs + #if targetEnvironment(macCatalyst) + let directory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + return URLCache(memoryCapacity: capacity, diskCapacity: capacity, directory: directory) + #else + let directory = (NSTemporaryDirectory() as NSString).appendingPathComponent(UUID().uuidString) + return URLCache(memoryCapacity: capacity, diskCapacity: capacity, diskPath: directory) + #endif + }() + + manager = { + let configuration: URLSessionConfiguration = { + let configuration = URLSessionConfiguration.default + configuration.headers = HTTPHeaders.default + configuration.requestCachePolicy = .useProtocolCachePolicy + configuration.urlCache = urlCache + + return configuration + }() + + let manager = Session(configuration: configuration) + + return manager + }() + + primeCachedResponses() + } + + override func tearDown() { + super.tearDown() + + requests.removeAll() + timestamps.removeAll() + + urlCache.removeAllCachedResponses() + } + + // MARK: - Cache Priming Methods + + /// Executes a request for all `Cache-Control` header values to load the response into the `URLCache`. + /// + /// - Note: This implementation leverages dispatch groups to execute all the requests. This ensures the cache + /// contains responses for all requests, properly aged from Firewalk. This allows the tests to distinguish + /// whether the subsequent responses come from the cache or the network based on the timestamp of the + /// response. + private func primeCachedResponses() { + let dispatchGroup = DispatchGroup() + let serialQueue = DispatchQueue(label: "org.alamofire.cache-tests") + + for cacheControl in CacheControl.allCases { + dispatchGroup.enter() + + let request = startRequest(cacheControl: cacheControl, + queue: serialQueue, + completion: { _, response in + let timestamp = response!.headers["Date"] + self.timestamps[cacheControl] = timestamp + + dispatchGroup.leave() + }) + + requests[cacheControl] = request + } + + // Wait for all requests to complete + _ = dispatchGroup.wait(timeout: .now() + timeout) + } + + // MARK: - Request Helper Methods + + @discardableResult + private func startRequest(cacheControl: CacheControl, + cachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy, + queue: DispatchQueue = .main, + completion: @escaping (URLRequest?, HTTPURLResponse?) -> Void) + -> URLRequest { + let urlRequest = Endpoint(path: .cache, + timeout: 30, + queryItems: [.init(name: "Cache-Control", value: cacheControl.rawValue)], + cachePolicy: cachePolicy).urlRequest + let request = manager.request(urlRequest) + + request.response(queue: queue) { response in + completion(response.request, response.response) + } + + return urlRequest + } + + // MARK: - Test Execution and Verification + + private func executeTest(cachePolicy: URLRequest.CachePolicy, + cacheControl: CacheControl, + shouldReturnCachedResponse: Bool) { + // Given + let requestDidFinish = expectation(description: "cache test request did finish") + var response: HTTPURLResponse? + + // When + startRequest(cacheControl: cacheControl, cachePolicy: cachePolicy) { _, responseResponse in + response = responseResponse + requestDidFinish.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + verifyResponse(response, forCacheControl: cacheControl, isCachedResponse: shouldReturnCachedResponse) + } + + private func verifyResponse(_ response: HTTPURLResponse?, forCacheControl cacheControl: CacheControl, isCachedResponse: Bool) { + guard let cachedResponseTimestamp = timestamps[cacheControl] else { + XCTFail("cached response timestamp should not be nil") + return + } + + if let response = response, let timestamp = response.headers["Date"] { + if isCachedResponse { + XCTAssertEqual(timestamp, cachedResponseTimestamp, "timestamps should be equal") + } else { + XCTAssertNotEqual(timestamp, cachedResponseTimestamp, "timestamps should not be equal") + } + } else { + XCTFail("response should not be nil") + } + } + + // MARK: - Tests + + func testURLCacheContainsCachedResponsesForAllRequests() { + // Given + let publicRequest = requests[.publicControl]! + let privateRequest = requests[.privateControl]! + let maxAgeNonExpiredRequest = requests[.maxAgeNonExpired]! + let maxAgeExpiredRequest = requests[.maxAgeExpired]! + let noCacheRequest = requests[.noCache]! + let noStoreRequest = requests[.noStore]! + + // When + let publicResponse = urlCache.cachedResponse(for: publicRequest) + let privateResponse = urlCache.cachedResponse(for: privateRequest) + let maxAgeNonExpiredResponse = urlCache.cachedResponse(for: maxAgeNonExpiredRequest) + let maxAgeExpiredResponse = urlCache.cachedResponse(for: maxAgeExpiredRequest) + let noCacheResponse = urlCache.cachedResponse(for: noCacheRequest) + let noStoreResponse = urlCache.cachedResponse(for: noStoreRequest) + + // Then + XCTAssertNotNil(publicResponse, "\(CacheControl.publicControl) response should not be nil") + XCTAssertNotNil(privateResponse, "\(CacheControl.privateControl) response should not be nil") + XCTAssertNotNil(maxAgeNonExpiredResponse, "\(CacheControl.maxAgeNonExpired) response should not be nil") + XCTAssertNotNil(maxAgeExpiredResponse, "\(CacheControl.maxAgeExpired) response should not be nil") + XCTAssertNotNil(noCacheResponse, "\(CacheControl.noCache) response should not be nil") + XCTAssertNil(noStoreResponse, "\(CacheControl.noStore) response should be nil") + } + + func testDefaultCachePolicy() { + let cachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy + + executeTest(cachePolicy: cachePolicy, cacheControl: .publicControl, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .privateControl, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeNonExpired, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeExpired, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .noCache, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .noStore, shouldReturnCachedResponse: false) + } + + func testIgnoreLocalCacheDataPolicy() { + let cachePolicy: URLRequest.CachePolicy = .reloadIgnoringLocalCacheData + + executeTest(cachePolicy: cachePolicy, cacheControl: .publicControl, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .privateControl, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeNonExpired, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeExpired, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .noCache, shouldReturnCachedResponse: false) + executeTest(cachePolicy: cachePolicy, cacheControl: .noStore, shouldReturnCachedResponse: false) + } + + func testUseLocalCacheDataIfExistsOtherwiseLoadFromNetworkPolicy() { + let cachePolicy: URLRequest.CachePolicy = .returnCacheDataElseLoad + + executeTest(cachePolicy: cachePolicy, cacheControl: .publicControl, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .privateControl, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeNonExpired, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeExpired, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .noCache, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .noStore, shouldReturnCachedResponse: false) + } + + func testUseLocalCacheDataAndDontLoadFromNetworkPolicy() { + let cachePolicy: URLRequest.CachePolicy = .returnCacheDataDontLoad + + executeTest(cachePolicy: cachePolicy, cacheControl: .publicControl, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .privateControl, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeNonExpired, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .maxAgeExpired, shouldReturnCachedResponse: true) + executeTest(cachePolicy: cachePolicy, cacheControl: .noCache, shouldReturnCachedResponse: true) + + // Given + let requestDidFinish = expectation(description: "don't load from network request finished") + var response: HTTPURLResponse? + + // When + startRequest(cacheControl: .noStore, cachePolicy: cachePolicy) { _, responseResponse in + response = responseResponse + requestDidFinish.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response, "response should be nil") + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/CachedResponseHandlerTests.swift b/Carthage/Checkouts/Alamofire/Tests/CachedResponseHandlerTests.swift new file mode 100644 index 00000000..e86efb6b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/CachedResponseHandlerTests.swift @@ -0,0 +1,243 @@ +// +// CachedResponseHandlerTests.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class CachedResponseHandlerTestCase: BaseTestCase { + // MARK: Tests - Per Request + + func testThatRequestCachedResponseHandlerCanCacheResponse() { + // Given + let session = session() + + var response: DataResponse? + let expectation = expectation(description: "Request should cache response") + + // When + let request = session.request(.default).cacheResponse(using: ResponseCacher.cache).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertTrue(session.cachedResponseExists(for: request)) + } + + func testThatRequestCachedResponseHandlerCanNotCacheResponse() { + // Given + let session = session() + + var response: DataResponse? + let expectation = expectation(description: "Request should not cache response") + + // When + let request = session.request(.default).cacheResponse(using: ResponseCacher.doNotCache).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertFalse(session.cachedResponseExists(for: request)) + } + + func testThatRequestCachedResponseHandlerCanModifyCacheResponse() { + // Given + let session = session() + + var response: DataResponse? + let expectation = expectation(description: "Request should cache response") + + // When + let cacher = ResponseCacher(behavior: .modify { _, response in + CachedURLResponse(response: response.response, + data: response.data, + userInfo: ["key": "value"], + storagePolicy: .allowed) + }) + + let request = session.request(.default).cacheResponse(using: cacher).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertTrue(session.cachedResponseExists(for: request)) + XCTAssertEqual(session.cachedResponse(for: request)?.userInfo?["key"] as? String, "value") + } + + // MARK: Tests - Per Session + + func testThatSessionCachedResponseHandlerCanCacheResponse() { + // Given + let session = session(using: ResponseCacher.cache) + + var response: DataResponse? + let expectation = expectation(description: "Request should cache response") + + // When + let request = session.request(.default).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertTrue(session.cachedResponseExists(for: request)) + } + + func testThatSessionCachedResponseHandlerCanNotCacheResponse() { + // Given + let session = session(using: ResponseCacher.doNotCache) + + var response: DataResponse? + let expectation = expectation(description: "Request should not cache response") + + // When + let request = session.request(.default).cacheResponse(using: ResponseCacher.doNotCache).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertFalse(session.cachedResponseExists(for: request)) + } + + func testThatSessionCachedResponseHandlerCanModifyCacheResponse() { + // Given + let cacher = ResponseCacher(behavior: .modify { _, response in + CachedURLResponse(response: response.response, + data: response.data, + userInfo: ["key": "value"], + storagePolicy: .allowed) + }) + + let session = session(using: cacher) + + var response: DataResponse? + let expectation = expectation(description: "Request should cache response") + + // When + let request = session.request(.default).cacheResponse(using: cacher).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertTrue(session.cachedResponseExists(for: request)) + XCTAssertEqual(session.cachedResponse(for: request)?.userInfo?["key"] as? String, "value") + } + + // MARK: Tests - Per Request Prioritization + + func testThatRequestCachedResponseHandlerIsPrioritizedOverSessionCachedResponseHandler() { + // Given + let session = session(using: ResponseCacher.cache) + + var response: DataResponse? + let expectation = expectation(description: "Request should cache response") + + // When + let request = session.request(.default).cacheResponse(using: ResponseCacher.doNotCache).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertFalse(session.cachedResponseExists(for: request)) + } + + // MARK: Private - Test Helpers + + private func session(using handler: CachedResponseHandler? = nil) -> Session { + let configuration = URLSessionConfiguration.af.default + let capacity = 100_000_000 + let cache: URLCache + #if targetEnvironment(macCatalyst) + let directory = FileManager.default.temporaryDirectory.appendingPathComponent(UUID().uuidString) + cache = URLCache(memoryCapacity: capacity, diskCapacity: capacity, directory: directory) + #else + let directory = (NSTemporaryDirectory() as NSString).appendingPathComponent(UUID().uuidString) + cache = URLCache(memoryCapacity: capacity, diskCapacity: capacity, diskPath: directory) + #endif + configuration.urlCache = cache + + return Session(configuration: configuration, cachedResponseHandler: handler) + } +} + +final class StaticCachedResponseHandlerTests: BaseTestCase { + func takeCachedResponseHandler(_ handler: CachedResponseHandler) { + _ = handler + } + + func testThatCacheResponseCacherCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeCachedResponseHandler(.cache) + } + + func testThatDoNotCacheResponseCacherCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeCachedResponseHandler(.doNotCache) + } + + func testThatModifyResponseCacherCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeCachedResponseHandler(.modify { _, _ in nil }) + } +} + +// MARK: - + +extension Session { + fileprivate func cachedResponse(for request: Request) -> CachedURLResponse? { + guard let urlRequest = request.request else { return nil } + return session.configuration.urlCache?.cachedResponse(for: urlRequest) + } + + fileprivate func cachedResponseExists(for request: Request) -> Bool { + cachedResponse(for: request) != nil + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/CombineTests.swift b/Carthage/Checkouts/Alamofire/Tests/CombineTests.swift new file mode 100644 index 00000000..5ef0e424 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/CombineTests.swift @@ -0,0 +1,1439 @@ +// +// CombineTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if !((os(iOS) && (arch(i386) || arch(arm))) || os(Windows) || os(Linux) || os(Android)) + +import Alamofire +import Combine +import XCTest + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +final class DataRequestCombineTests: CombineTestCase { + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DataResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatNonAutomaticDataRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let session = Session(startRequestsImmediately: false) + var response: DataResponse? + + // When + store { + session.request(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanPublishData() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let session = Session(startRequestsImmediately: false) + var response: DataResponse? + + // When + store { + session.request(.default) + .publishData() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanPublishString() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let session = Session(startRequestsImmediately: false) + var response: DataResponse? + + // When + store { + session.request(.default) + .publishString() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanBePublishedUnserialized() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DataResponse? + + // When + store { + AF.request(.default) + .publishUnserialized() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanBePublishedWithMultipleHandlers() { + // Given + let handlerResponseReceived = expectation(description: "handler response should be received") + let publishedResponseReceived = expectation(description: "published response should be received") + let completionReceived = expectation(description: "stream should complete") + var handlerResponse: DataResponse? + var publishedResponse: DataResponse? + + // When + store { + AF.request(.default) + .responseDecodable(of: TestResponse.self) { handlerResponse = $0; handlerResponseReceived.fulfill() } + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { publishedResponse = $0; publishedResponseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(handlerResponse?.result.isSuccess == true) + XCTAssertTrue(publishedResponse?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanPublishResult() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self) + .result() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { result = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(result?.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanPublishValue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var value: TestResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self) + .value() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { value = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(value) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanPublishValueWithFailure() { + // Given + let completionReceived = expectation(description: "stream should complete") + var error: AFError? + + // When + store { + AF.request(Endpoint(path: .delay(interval: 1), timeout: 0.01)) + .publishDecodable(type: TestResponse.self) + .value() + .sink(receiveCompletion: { completion in + switch completion { + case let .failure(err): + error = err + case .finished: + error = nil + } + completionReceived.fulfill() + }, receiveValue: { _ in }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + XCTAssertEqual((error?.underlyingError as? URLError)?.code, .timedOut) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataRequestIsNotResumedUnlessSubscribed() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DataResponse? + + // When + let request = AF.request(.default) + let publisher = request.publishDecodable(type: TestResponse.self) + + let stateAfterPublisher = request.state + + store { + publisher.sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + let stateAfterSubscription = request.state + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertEqual(stateAfterPublisher, .initialized) + XCTAssertEqual(stateAfterSubscription, .resumed) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestCanSubscribedFromNonMainQueueButPublishedOnMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var response: DataResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self) + .subscribe(on: queue) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { + receivedOnMain = Thread.isMainThread + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestPublishedOnSeparateQueueIsReceivedOnThatQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var response: DataResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .sink(receiveCompletion: { _ in + dispatchPrecondition(condition: .onQueue(queue)) + completionReceived.fulfill() + }, + receiveValue: { + dispatchPrecondition(condition: .onQueue(queue)) + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataRequestPublishedOnSeparateQueueCanBeReceivedOntoMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var response: DataResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { + receivedOnMain = Thread.isMainThread + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataRequestCanBeCancelledAutomatically() throws { + if #available(macOS 11, iOS 14, watchOS 7, tvOS 14, *) { + throw XCTSkip("Skip on 2020 OS versions, as Combine cancellation no longer emits a value.") + } + + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DataResponse? + + // When + let request = AF.request(.default) + var token: AnyCancellable? = request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + token = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isFailure == true) + XCTAssertTrue(response?.error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(response?.error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + XCTAssertNil(token) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataRequestCanBeCancelledManually() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DataResponse? + + // When + let request = AF.request(.default) + store { + request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + request.cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isFailure == true) + XCTAssertTrue(response?.error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(response?.error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDataRequestPublishersCanBeCombined() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + var firstResponse: DataResponse? + var secondResponse: DataResponse? + + // When + let first = AF.request(.default) + .publishDecodable(type: TestResponse.self) + let second = AF.request(.default) + .publishDecodable(type: TestResponse.self) + + store { + Publishers.CombineLatest(first, second) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }) { first, second in + firstResponse = first + secondResponse = second + responseReceived.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(firstResponse?.result.isSuccess == true) + XCTAssertTrue(secondResponse?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDataRequestPublishersCanBeChained() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + let customValue = "CustomValue" + var firstResponse: DataResponse? + var secondResponse: DataResponse? + + // When + store { + AF.request(.default) + .publishDecodable(type: TestResponse.self) + .flatMap { response -> DataResponsePublisher in + firstResponse = response + let request = Endpoint(headers: ["X-Custom": customValue]) + return AF.request(request) + .publishDecodable(type: TestResponse.self) + } + .sink(receiveCompletion: { _ in completionReceived.fulfill() }) { response in + secondResponse = response + responseReceived.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(firstResponse?.result.isSuccess == true) + XCTAssertTrue(secondResponse?.result.isSuccess == true) + XCTAssertEqual(secondResponse?.value?.headers["X-Custom"], customValue) + } +} + +// MARK: - DataStreamRequest + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +final class DataStreamRequestCombineTests: CombineTestCase { + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatNonAutomaticDataStreamRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let session = Session(startRequestsImmediately: false) + var result: Result? + + // When + store { + session.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishData() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishData() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishString() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishString() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanBePublishedWithMultipleHandlers() { + // Given + let handlerResponseReceived = expectation(description: "handler response should be received") + let publishedResponseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var handlerResult: Result? + var publishedResult: Result? + + // When + store { + AF.streamRequest(.default) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(value): + handlerResult = value + case .complete: + handlerResponseReceived.fulfill() + } + } + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + publishedResult = value + case .complete: + publishedResponseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(handlerResult?.success) + XCTAssertNotNil(publishedResult?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishResult() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .result() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { received in + result = received + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishResultWithResponseFailure() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + store { + AF.streamRequest(Endpoint.delay(1).modifying(\.timeout, to: 0.1)) + .publishDecodable(type: TestResponse.self) + .result() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { received in + result = received + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(result?.success) + XCTAssertEqual((result?.failure?.underlyingError as? URLError)?.code, .timedOut) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishValue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: TestResponse? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .value() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { received in + response = received + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanPublishValueWithFailure() { + // Given + let completionReceived = expectation(description: "stream should complete") + var error: AFError? + + // When + store { + AF.streamRequest(Endpoint.delay(1).modifying(\.timeout, to: 0.1)) + .publishDecodable(type: TestResponse.self) + .value() + .sink(receiveCompletion: { completion in + switch completion { + case let .failure(err): + error = err + case .finished: + error = nil + } + completionReceived.fulfill() + }, receiveValue: { _ in }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + XCTAssertEqual((error?.underlyingError as? URLError)?.code, .timedOut) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataStreamRequestIsNotResumedUnlessSubscribed() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var result: Result? + + // When + let request = AF.streamRequest(.default) + let publisher = request.publishDecodable(type: TestResponse.self) + + let stateAfterPublisher = request.state + + store { + publisher.sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + let stateAfterSubscription = request.state + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(result?.isSuccess == true) + XCTAssertEqual(stateAfterPublisher, .initialized) + XCTAssertEqual(stateAfterSubscription, .resumed) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestCanSubscribedFromNonMainQueueButPublishedOnMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .subscribe(on: queue) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + receivedOnMain = Thread.isMainThread + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestPublishedOnSeparateQueueIsReceivedOnThatQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .sink(receiveCompletion: { _ in + dispatchPrecondition(condition: .onQueue(queue)) + completionReceived.fulfill() + }, + receiveValue: { stream in + dispatchPrecondition(condition: .onQueue(queue)) + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDataStreamRequestPublishedOnSeparateQueueCanBeReceivedOntoMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var result: Result? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { stream in + receivedOnMain = Thread.isMainThread + switch stream.event { + case let .stream(value): + result = value + case .complete: + responseReceived.fulfill() + } + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(result?.success) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataStreamRequestCanBeCancelledAutomatically() throws { + if #available(macOS 11, iOS 14, watchOS 7, tvOS 14, *) { + throw XCTSkip("Skip on 2020 OS versions, as Combine cancellation no longer emits a value.") + } + + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var error: AFError? + + // When + let request = AF.streamRequest(.default) + var token: AnyCancellable? = request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { error = $0.completion?.error; responseReceived.fulfill() }) + token = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + XCTAssertTrue(error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + XCTAssertNil(token) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDataStreamRequestCanBeCancelledManually() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var error: AFError? + + // When + let request = AF.streamRequest(.default) + store { + request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { error = $0.completion?.error; responseReceived.fulfill() }) + } + request.cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + XCTAssertTrue(error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDataStreamPublishersCanBeCombined() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + var firstCompletion: DataStreamRequest.Completion? + var secondCompletion: DataStreamRequest.Completion? + + // When + let first = AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + let second = AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + + store { + Publishers.CombineLatest(first.compactMap(\.completion), second.compactMap(\.completion)) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { first, second in + firstCompletion = first + secondCompletion = second + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(firstCompletion) + XCTAssertNotNil(secondCompletion) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDataStreamRequestPublishersCanBeChained() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + var firstCompletion: DataStreamRequest.Completion? + var secondCompletion: DataStreamRequest.Completion? + + // When + store { + AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + .compactMap(\.completion) + .flatMap { completion -> DataStreamPublisher in + firstCompletion = completion + return AF.streamRequest(.default) + .publishDecodable(type: TestResponse.self) + } + .compactMap(\.completion) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { secondCompletion = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(firstCompletion) + XCTAssertNotNil(secondCompletion) + } +} + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +final class DownloadRequestCombineTests: CombineTestCase { + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatNonAutomaticDownloadRequestCanBePublished() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + let session = Session(startRequestsImmediately: false) + var response: DownloadResponse? + + // When + store { + session.download(.default) + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishData() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishData() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishString() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishString() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishUnserialized() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishUnserialized() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishURL() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishURL() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishWithMultipleHandlers() { + // Given + let handlerResponseReceived = expectation(description: "handler response should be received") + let publishedResponseReceived = expectation(description: "published response should be received") + let completionReceived = expectation(description: "stream should complete") + var handlerResponse: DownloadResponse? + var publishedResponse: DownloadResponse? + + // When + store { + AF.download(.default) + .responseDecodable(of: TestResponse.self) { handlerResponse = $0; handlerResponseReceived.fulfill() } + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { publishedResponse = $0; publishedResponseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(handlerResponse?.result.isSuccess == true) + XCTAssertTrue(publishedResponse?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishResult() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "publisher should complete") + var result: Result? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self) + .result() + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { result = $0; responseReceived.fulfill() }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(result?.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanPublishValueWithFailure() { + // Given + let completionReceived = expectation(description: "stream should complete") + var error: AFError? + + // When + store { + AF.download(Endpoint.delay(1).modifying(\.timeout, to: 0.1)) + .publishDecodable(type: TestResponse.self) + .value() + .sink(receiveCompletion: { completion in + switch completion { + case let .failure(err): + error = err + case .finished: + error = nil + } + completionReceived.fulfill() + }, receiveValue: { _ in }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + XCTAssertEqual((error?.underlyingError as? URLError)?.code, .timedOut) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDownloadRequestIsNotResumedUnlessSubscribed() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DownloadResponse? + + // When + let request = AF.download(.default) + let publisher = request.publishDecodable(type: TestResponse.self) + + let stateAfterPublisher = request.state + + store { + publisher.sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + + let stateAfterSubscription = request.state + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertEqual(stateAfterPublisher, .initialized) + XCTAssertEqual(stateAfterSubscription, .resumed) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestCanSubscribedFromNonMainQueueButPublishedOnMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self) + .subscribe(on: queue) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { + receivedOnMain = Thread.isMainThread + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestPublishedOnSeparateQueueIsReceivedOnThatQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .sink(receiveCompletion: { _ in + dispatchPrecondition(condition: .onQueue(queue)) + completionReceived.fulfill() + }, + receiveValue: { + dispatchPrecondition(condition: .onQueue(queue)) + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatDownloadRequestPublishedOnSeparateQueueCanBeReceivedOntoMainQueue() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + let queue = DispatchQueue(label: "org.alamofire.tests.combineEventQueue") + var receivedOnMain = false + var response: DownloadResponse? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self, queue: queue) + .receive(on: DispatchQueue.main) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { + receivedOnMain = Thread.isMainThread + response = $0 + responseReceived.fulfill() + }) + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertTrue(receivedOnMain) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDownloadRequestCanBeCancelledAutomatically() throws { + if #available(macOS 11, iOS 14, watchOS 7, tvOS 14, *) { + throw XCTSkip("Skip on 2020 OS versions, as Combine cancellation no longer emits a value.") + } + + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DownloadResponse? + + // When + let request = AF.download(.default) + var token: AnyCancellable? = request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + token = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isFailure == true) + XCTAssertTrue(response?.error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(response?.error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + XCTAssertNil(token) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatPublishedDownloadRequestCanBeCancelledManually() { + // Given + let responseReceived = expectation(description: "response should be received") + let completionReceived = expectation(description: "stream should complete") + var response: DownloadResponse? + + // When + let request = AF.download(.default) + store { + request + .publishDecodable(type: TestResponse.self) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }, + receiveValue: { response = $0; responseReceived.fulfill() }) + } + request.cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(response?.result.isFailure == true) + XCTAssertTrue(response?.error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(response?.error?.localizedDescription ?? "None")") + XCTAssertTrue(request.isCancelled) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDownloadRequestPublishersCanBeCombined() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + var firstResponse: DownloadResponse? + var secondResponse: DownloadResponse? + + // When + let first = AF.download(.default) + .publishDecodable(type: TestResponse.self) + let second = AF.download(.default) + .publishDecodable(type: TestResponse.self) + + store { + Publishers.CombineLatest(first, second) + .sink(receiveCompletion: { _ in completionReceived.fulfill() }) { first, second in + firstResponse = first + secondResponse = second + responseReceived.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(firstResponse?.result.isSuccess == true) + XCTAssertTrue(secondResponse?.result.isSuccess == true) + } + + @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) + func testThatMultipleDownloadRequestPublishersCanBeChained() { + // Given + let responseReceived = expectation(description: "combined response should be received") + let completionReceived = expectation(description: "combined stream should complete") + let customValue = "CustomValue" + var firstResponse: DownloadResponse? + var secondResponse: DownloadResponse? + + // When + store { + AF.download(.default) + .publishDecodable(type: TestResponse.self) + .flatMap { response -> DownloadResponsePublisher in + firstResponse = response + let request = Endpoint(headers: ["X-Custom": customValue]) + return AF.download(request) + .publishDecodable(type: TestResponse.self) + } + .sink(receiveCompletion: { _ in completionReceived.fulfill() }) { response in + secondResponse = response + responseReceived.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(firstResponse?.result.isSuccess == true) + XCTAssertTrue(secondResponse?.result.isSuccess == true) + XCTAssertEqual(secondResponse?.value?.headers["X-Custom"], customValue) + } +} + +@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) +class CombineTestCase: BaseTestCase { + private lazy var storage: Set = { Set() }() + + override func tearDown() { + storage.removeAll() + + super.tearDown() + } + + func store(_ toStore: () -> AnyCancellable) { + storage.insert(toStore()) + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/ConcurrencyTests.swift b/Carthage/Checkouts/Alamofire/Tests/ConcurrencyTests.swift new file mode 100644 index 00000000..95717c18 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ConcurrencyTests.swift @@ -0,0 +1,802 @@ +// +// ConcurrencyTests.swift +// +// Copyright (c) 2021 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if compiler(>=5.6.0) && canImport(_Concurrency) + +import Alamofire +import XCTest + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +final class DataRequestConcurrencyTests: BaseTestCase { + func testThatDataTaskSerializesResponseUsingSerializer() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.request(.get) + .serializingResponse(using: .data) + .value + + // Then + XCTAssertNotNil(value) + } + + func testThatDataTaskSerializesDecodable() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.request(.get).serializingDecodable(TestResponse.self).value + + // Then + XCTAssertNotNil(value) + } + + func testThatDataTaskSerializesString() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.request(.get).serializingString().value + + // Then + XCTAssertNotNil(value) + } + + func testThatDataTaskSerializesData() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.request(.get).serializingData().value + + // Then + XCTAssertNotNil(value) + } + + func testThatDataTaskProducesResult() async { + // Given + let session = stored(Session()) + + // When + let result = await session.request(.get).serializingDecodable(TestResponse.self).result + + // Then + XCTAssertNotNil(result.success) + } + + func testThatDataTaskProducesValue() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.request(.get).serializingDecodable(TestResponse.self).value + + // Then + XCTAssertNotNil(value) + } + + func testThatDataTaskProperlySupportsConcurrentRequests() async { + // Given + let session = stored(Session()) + + // When + async let first = session.request(.get).serializingDecodable(TestResponse.self).response + async let second = session.request(.get).serializingDecodable(TestResponse.self).response + async let third = session.request(.get).serializingDecodable(TestResponse.self).response + + // Then + let responses = await [first, second, third] + XCTAssertEqual(responses.count, 3) + XCTAssertTrue(responses.allSatisfy(\.result.isSuccess)) + } + + func testThatDataTaskCancellationCancelsRequest() async { + // Given + let session = stored(Session()) + let request = session.request(.get) + let task = request.serializingDecodable(TestResponse.self) + + // When + task.cancel() + let response = await task.response + + // Then + XCTAssertTrue(response.error?.isExplicitlyCancelledError == true) + XCTAssertTrue(request.isCancelled, "Underlying DataRequest should be cancelled.") + } + + func testThatDataTaskIsAutomaticallyCancelledInTask() async { + // Given + let session = stored(Session()) + let request = session.request(.get) + + // When + let task = Task { + await request.serializingDecodable(TestResponse.self).result + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(result.failure?.isExplicitlyCancelledError == true) + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertTrue(request.isCancelled, "Underlying DataRequest should be cancelled.") + } + + func testThatDataTaskIsNotAutomaticallyCancelledInTaskWhenDisabled() async { + // Given + let session = stored(Session()) + let request = session.request(.get) + + // When + let task = Task { + await request.serializingDecodable(TestResponse.self, automaticallyCancelling: false).result + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertFalse(request.isCancelled, "Underlying DataRequest should not be cancelled.") + XCTAssertTrue(result.isSuccess, "DataRequest should succeed.") + } + + func testThatDataTaskIsAutomaticallyCancelledInTaskGroup() async { + // Given + let session = stored(Session()) + let request = session.request(.get) + + // When + let task = Task { + await withTaskGroup(of: Result.self) { group -> Result in + group.addTask { + await request.serializingDecodable(TestResponse.self).result + } + + return await group.first(where: { _ in true })! + } + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(result.failure?.isExplicitlyCancelledError == true) + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertTrue(request.isCancelled, "Underlying DataRequest should be cancelled.") + } + + func testThatDataTaskIsNotAutomaticallyCancelledInTaskGroupWhenDisabled() async { + // Given + let session = stored(Session()) + let request = session.request(.get) + + // When + let task = Task { + await withTaskGroup(of: Result.self) { group -> Result in + group.addTask { + await request.serializingDecodable(TestResponse.self, automaticallyCancelling: false).result + } + + return await group.first(where: { _ in true })! + } + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertFalse(request.isCancelled, "Underlying DataRequest should not be cancelled.") + XCTAssertTrue(result.isSuccess, "DataRequest should succeed.") + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +final class DownloadConcurrencyTests: BaseTestCase { + func testThatDownloadTaskSerializesResponseFromSerializer() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get) + .serializingDownload(using: .data) + .value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskSerializesDecodable() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get).serializingDecodable(TestResponse.self).value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskSerializesString() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get).serializingString().value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskSerializesData() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get).serializingData().value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskSerializesURL() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get).serializingDownloadedFileURL().value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskProducesResult() async { + // Given + let session = stored(Session()) + + // When + let result = await session.download(.get).serializingDecodable(TestResponse.self).result + + // Then + XCTAssertNotNil(result.success) + } + + func testThatDownloadTaskProducesValue() async throws { + // Given + let session = stored(Session()) + + // When + let value = try await session.download(.get).serializingDecodable(TestResponse.self).value + + // Then + XCTAssertNotNil(value) + } + + func testThatDownloadTaskProperlySupportsConcurrentRequests() async { + // Given + let session = stored(Session()) + + // When + async let first = session.download(.get).serializingDecodable(TestResponse.self).response + async let second = session.download(.get).serializingDecodable(TestResponse.self).response + async let third = session.download(.get).serializingDecodable(TestResponse.self).response + + // Then + let responses = await [first, second, third] + XCTAssertEqual(responses.count, 3) + XCTAssertTrue(responses.allSatisfy(\.result.isSuccess)) + } + + func testThatDownloadTaskCancelsRequest() async { + // Given + let session = stored(Session()) + let request = session.download(.get) + let task = request.serializingDecodable(TestResponse.self) + + // When + task.cancel() + let response = await task.response + + // Then + XCTAssertTrue(response.error?.isExplicitlyCancelledError == true) + } + + func testThatDownloadTaskIsAutomaticallyCancelledInTask() async { + // Given + let session = stored(Session()) + let request = session.download(.get) + + // When + let task = Task { + await request.serializingDecodable(TestResponse.self).result + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(result.failure?.isExplicitlyCancelledError == true) + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertTrue(request.isCancelled, "Underlying DownloadRequest should be cancelled.") + } + + func testThatDownloadTaskIsNotAutomaticallyCancelledInTaskWhenDisabled() async { + // Given + let session = stored(Session()) + let request = session.download(.get) + + // When + let task = Task { + await request.serializingDecodable(TestResponse.self, automaticallyCancelling: false).result + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertFalse(request.isCancelled, "Underlying DownloadRequest should not be cancelled.") + XCTAssertTrue(result.isSuccess, "DownloadRequest should succeed.") + } + + func testThatDownloadTaskIsAutomaticallyCancelledInTaskGroup() async { + // Given + let session = stored(Session()) + let request = session.download(.get) + + // When + let task = Task { + await withTaskGroup(of: Result.self) { group -> Result in + group.addTask { + await request.serializingDecodable(TestResponse.self).result + } + + return await group.first(where: { _ in true })! + } + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(result.failure?.isExplicitlyCancelledError == true) + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertTrue(request.isCancelled, "Underlying DownloadRequest should be cancelled.") + } + + func testThatDownloadTaskIsNotAutomaticallyCancelledInTaskGroupWhenDisabled() async { + // Given + let session = stored(Session()) + let request = session.download(.get) + + // When + let task = Task { + await withTaskGroup(of: Result.self) { group -> Result in + group.addTask { + await request.serializingDecodable(TestResponse.self, automaticallyCancelling: false).result + } + + return await group.first(where: { _ in true })! + } + } + + task.cancel() + let result = await task.value + + // Then + XCTAssertTrue(task.isCancelled, "Task should be cancelled.") + XCTAssertFalse(request.isCancelled, "Underlying DownloadRequest should not be cancelled.") + XCTAssertTrue(result.isSuccess, "DownloadRequest should succeed.") + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +final class DataStreamConcurrencyTests: BaseTestCase { + func testThatDataStreamTaskCanStreamData() async { + // Given + let session = stored(Session()) + + // When + let task = session.streamRequest(.payloads(2)).streamTask() + var datas: [Data] = [] + + for await data in task.streamingData().compactMap(\.value) { + datas.append(data) + } + + // Then + XCTAssertEqual(datas.count, 2) + } + + #if swift(>=5.8) && canImport(Darwin) + func testThatDataStreamHasAsyncOnHTTPResponse() async { + // Given + let session = stored(Session()) + let functionCalled = expectation(description: "doNothing called") + @Sendable @MainActor func fulfill() async { + functionCalled.fulfill() + } + + // When + let task = session.streamRequest(.payloads(2)) + .onHTTPResponse { _ in + await fulfill() + } + .streamTask() + var datas: [Data] = [] + + for await data in task.streamingData().compactMap(\.value) { + datas.append(data) + } + + await fulfillment(of: [functionCalled], timeout: timeout) + + // Then + XCTAssertEqual(datas.count, 2) + } + + func testThatDataOnHTTPResponseCanAllow() async { + // Given + let session = stored(Session()) + let functionCalled = expectation(description: "doNothing called") + @Sendable @MainActor func fulfill() async { + functionCalled.fulfill() + } + + // When + let task = session.streamRequest(.payloads(2)) + .onHTTPResponse { _ in + await fulfill() + return .allow + } + .streamTask() + var datas: [Data] = [] + + for await data in task.streamingData().compactMap(\.value) { + datas.append(data) + } + + await fulfillment(of: [functionCalled], timeout: timeout) + + // Then + XCTAssertEqual(datas.count, 2) + } + + func testThatDataOnHTTPResponseCanCancel() async { + // Given + let session = stored(Session()) + var receivedCompletion: DataStreamRequest.Completion? + let functionCalled = expectation(description: "doNothing called") + @Sendable @MainActor func fulfill() async { + functionCalled.fulfill() + } + + // When + let request = session.streamRequest(.payloads(2)) + .onHTTPResponse { _ in + await fulfill() + return .cancel + } + let task = request.streamTask() + + for await stream in task.streamingResponses(serializedUsing: .passthrough) { + switch stream.event { + case .stream: + XCTFail("cancelled stream should receive no data") + case let .complete(completion): + receivedCompletion = completion + } + } + + await fulfillment(of: [functionCalled], timeout: timeout) + + // Then + XCTAssertEqual(receivedCompletion?.response?.statusCode, 200) + XCTAssertTrue(request.isCancelled, "onHTTPResponse cancelled request isCancelled should be true") + XCTAssertTrue(request.error?.isExplicitlyCancelledError == true, "onHTTPResponse cancelled request error should be explicitly cancelled") + } + #endif + + func testThatDataStreamTaskCanStreamStrings() async { + // Given + let session = stored(Session()) + + // When + let task = session.streamRequest(.payloads(2)).streamTask() + var strings: [String] = [] + + for await string in task.streamingStrings().compactMap(\.value) { + strings.append(string) + } + + // Then + XCTAssertEqual(strings.count, 2) + } + + func testThatDataStreamTaskCanStreamDecodable() async { + // Given + let session = stored(Session()) + + // When + let task = session.streamRequest(.payloads(2)).streamTask() + let stream = task.streamingResponses(serializedUsing: DecodableStreamSerializer()) + var responses: [TestResponse] = [] + + for await response in stream.compactMap(\.value) { + responses.append(response) + } + + // Then + XCTAssertEqual(responses.count, 2) + } + + func testThatDataStreamTaskCanBeDirectlyCancelled() async { + // Given + let session = stored(Session()) + + // When + let expectedPayloads = 10 + let request = session.streamRequest(.payloads(expectedPayloads)) + let task = request.streamTask() + var datas: [Data] = [] + + for await data in task.streamingData().compactMap(\.value) { + datas.append(data) + if datas.count == 1 { + task.cancel() + } + } + + // Then + XCTAssertTrue(request.isCancelled) + XCTAssertTrue(datas.count == 1) + } + + func testThatDataStreamTaskIsCancelledByCancellingIteration() async { + // Given + let session = stored(Session()) + + // When + let expectedPayloads = 10 + let request = session.streamRequest(.payloads(expectedPayloads)) + let task = request.streamTask() + var datas: [Data] = [] + + for await data in task.streamingData().compactMap(\.value) { + datas.append(data) + if datas.count == 1 { + break + } + } + + // Then + XCTAssertTrue(request.isCancelled) + XCTAssertTrue(datas.count == 1) + } + + func testThatDataStreamTaskCanBeImplicitlyCancelled() async { + // Given + let session = stored(Session()) + + // When + let expectedPayloads = 10 + let request = session.streamRequest(.payloads(expectedPayloads)) + let task = Task<[Data], Never> { + var datas: [Data] = [] + + for await data in request.streamTask().streamingData().compactMap(\.value) { + datas.append(data) + } + + return datas + } + task.cancel() + let datas: [Data] = await task.value + + // Then + XCTAssertTrue(request.isCancelled) + XCTAssertTrue(datas.isEmpty) + } + + func testThatDataStreamTaskCanBeCancelledAfterStreamTurnsOffAutomaticCancellation() async { + // Given + let session = stored(Session()) + + // When + let expectedPayloads = 10 + let request = session.streamRequest(.payloads(expectedPayloads)) + let task = Task<[Data], Never> { + var datas: [Data] = [] + let streamTask = request.streamTask() + + for await data in streamTask.streamingData(automaticallyCancelling: false).compactMap(\.value) { + datas.append(data) + break + } + + for await data in streamTask.streamingData().compactMap(\.value) { + datas.append(data) + break + } + + return datas + } + let datas: [Data] = await task.value + + // Then + XCTAssertTrue(request.isCancelled) + XCTAssertTrue(datas.count == 2) + } +} + +// Avoid when using swift-corelibs-foundation. +// Only Xcode 14.3+ has async fulfillment. +#if !canImport(FoundationNetworking) && swift(>=5.8) +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +final class UploadConcurrencyTests: BaseTestCase { + func testThatDelayedUploadStreamResultsInMultipleProgressValues() async throws { + // Given + let count = 75 + let baseString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " + let baseData = Data(baseString.utf8) + var request = Endpoint.upload.urlRequest + request.headers.add(name: "Content-Length", value: "\(baseData.count * count)") + let expectation = expectation(description: "Bytes upload progress should be reported: \(request.url!)") + + var uploadProgressValues: [Double] = [] + var downloadProgressValues: [Double] = [] + + var response: DataResponse? + + var inputStream: InputStream! + var outputStream: OutputStream! + Stream.getBoundStreams(withBufferSize: baseData.count, inputStream: &inputStream, outputStream: &outputStream) + CFWriteStreamSetDispatchQueue(outputStream, .main) + outputStream.open() + + // When + AF.upload(inputStream, with: request) + .uploadProgress { progress in + uploadProgressValues.append(progress.fractionCompleted) + } + .downloadProgress { progress in + downloadProgressValues.append(progress.fractionCompleted) + } + .responseDecodable(of: UploadResponse.self) { resp in + response = resp + expectation.fulfill() + inputStream.close() + } + + func sendData() { + baseData.withUnsafeBytes { (pointer: UnsafeRawBufferPointer) in + let bytesStreamed = outputStream.write(pointer.baseAddress!, maxLength: baseData.count) + switch bytesStreamed { + case baseData.count: + // Successfully sent. + break + case 0: + XCTFail("outputStream somehow reached end") + case -1: + if let streamError = outputStream.streamError { + XCTFail("outputStream.write failed with error: \(streamError)") + } else { + XCTFail("outputStream.write failed with unknown error") + } + default: + XCTFail("outputStream failed to send \(baseData.count) bytes, sent \(bytesStreamed) instead.") + } + } + } + + for _ in 0..) + #if swift(>=5.10) + values = try! await (httpResponses, uploadProgress, downloadProgress, requests, tasks, descriptions, response) + #else + values = await (httpResponses, uploadProgress, downloadProgress, requests, tasks, descriptions, response) + #endif + + // Then + XCTAssertTrue(values.httpResponses.count == 1, "httpResponses should have one response") + XCTAssertTrue(values.uploadProgresses.isEmpty, "uploadProgresses should be empty") + XCTAssertNotNil(values.downloadProgresses.last, "downloadProgresses should not be empty") + XCTAssertTrue(values.downloadProgresses.last?.isFinished == true, "last download progression should be finished") + XCTAssertNotNil(values.requests.last, "requests should not be empty") + XCTAssertNotNil(values.tasks.last, "tasks should not be empty") + XCTAssertNotNil(values.descriptions.last, "descriptions should not be empty") + XCTAssertTrue(values.response.result.isSuccess, "request should succeed") + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +extension AsyncSequence { + func collect() async rethrows -> [Element] { + var elements: [Element] = [] + for try await element in self { + elements.append(element) + } + + return elements + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/DataStreamTests.swift b/Carthage/Checkouts/Alamofire/Tests/DataStreamTests.swift new file mode 100644 index 00000000..30d8c6bd --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/DataStreamTests.swift @@ -0,0 +1,1181 @@ +// +// DataStreamTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import XCTest + +final class DataStreamTests: BaseTestCase { + func testThatDataCanBeStreamedOnMainQueue() { + // Given + let expectedSize = 5 + var accumulatedData = Data() + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + let didReceiveResponse = expectation(description: "stream should receive response once") + let didReceive = expectation(description: "stream should receive once") + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.bytes(expectedSize)) + .onHTTPResponse { response in + initialResponse = response + didReceiveResponse.fulfill() + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(data): + accumulatedData.append(data) + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(initialResponse, response) + XCTAssertEqual(accumulatedData.count, expectedSize) + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + } + + func testThatDataCanBeStreamedByByte() throws { + guard #available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) else { + throw XCTSkip("Older OSes don't return individual bytes.") + } + + // Given + let expectedSize = 5 + var accumulatedData = Data() + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + var streamCalled = 0 + let didReceiveResponse = expectation(description: "stream should receive response once") + let didReceive = expectation(description: "stream should receive once") + didReceive.expectedFulfillmentCount = expectedSize + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.chunked(expectedSize)) + .onHTTPResponse { response in + initialResponse = response + didReceiveResponse.fulfill() + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(data): + accumulatedData.append(data) + } + streamCalled += 1 + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(streamCalled, expectedSize) + XCTAssertEqual(initialResponse, response) + XCTAssertEqual(accumulatedData.count, expectedSize) + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + } + + func testThatDataCanBeStreamedAsMultipleJSONPayloads() throws { + guard #available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) else { + throw XCTSkip("Older OSes do not separate chunked payloads in callbacks.") + } + + // Given + let expectedSize = 5 + var responses: [TestResponse] = [] + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + var streamCalled = 0 + let didReceiveResponse = expectation(description: "stream should receive response once") + let didReceive = expectation(description: "stream should receive once") + didReceive.expectedFulfillmentCount = expectedSize + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.payloads(expectedSize)) + .onHTTPResponse { response in + initialResponse = response + didReceiveResponse.fulfill() + } + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(value): + responses.append(value) + case let .failure(error): + XCTFail("JSON stream failed due to error: \(error.localizedDescription)") + } + streamCalled += 1 + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(streamCalled, expectedSize) + XCTAssertEqual(responses.count, expectedSize) + XCTAssertEqual(initialResponse, response) + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + } + + func testThatDataCanBeStreamedFromURL() { + // Given + let expectedSize = 1 + var accumulatedData = Data() + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + let didReceiveResponse = expectation(description: "stream should receive response once") + let didReceive = expectation(description: "stream should receive") + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.bytes(expectedSize)) + .onHTTPResponse { response in + initialResponse = response + didReceiveResponse.fulfill() + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(data): + accumulatedData.append(data) + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(accumulatedData.count, expectedSize) + XCTAssertEqual(initialResponse, response) + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + } + + func testThatDataCanBeStreamedManyTimes() { + // Given + let expectedSize = 1 + var initialResponse: HTTPURLResponse? + let onHTTPResponse = expectation(description: "onHTTPResponse should be called") + var firstAccumulatedData = Data() + var firstResponse: HTTPURLResponse? + var firstStreamOnMain = false + var firstCompleteOnMain = false + let firstReceive = expectation(description: "first stream should receive") + let firstCompletion = expectation(description: "first stream should complete") + var secondAccumulatedData = Data() + var secondResponse: HTTPURLResponse? + var secondStreamOnMain = false + var secondCompleteOnMain = false + let secondReceive = expectation(description: "second stream should receive") + let secondCompletion = expectation(description: "second stream should complete") + + // When + AF.streamRequest(.bytes(expectedSize)) + .onHTTPResponse { response in + initialResponse = response + onHTTPResponse.fulfill() + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + firstStreamOnMain = Thread.isMainThread + switch result { + case let .success(data): + firstAccumulatedData.append(data) + } + firstReceive.fulfill() + case let .complete(completion): + firstCompleteOnMain = Thread.isMainThread + firstResponse = completion.response + firstCompletion.fulfill() + } + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + secondStreamOnMain = Thread.isMainThread + switch result { + case let .success(data): + secondAccumulatedData.append(data) + } + secondReceive.fulfill() + case let .complete(completion): + secondCompleteOnMain = Thread.isMainThread + secondResponse = completion.response + secondCompletion.fulfill() + } + } + + wait(for: [onHTTPResponse, firstReceive, firstCompletion], timeout: timeout, enforceOrder: true) + wait(for: [secondReceive, secondCompletion], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(initialResponse, firstResponse) + XCTAssertEqual(initialResponse, secondResponse) + XCTAssertTrue(firstStreamOnMain) + XCTAssertTrue(firstCompleteOnMain) + XCTAssertEqual(firstResponse?.statusCode, 200) + XCTAssertEqual(firstAccumulatedData.count, expectedSize) + XCTAssertTrue(secondStreamOnMain) + XCTAssertTrue(secondCompleteOnMain) + XCTAssertEqual(secondResponse?.statusCode, 200) + XCTAssertEqual(secondAccumulatedData.count, expectedSize) + } + + func testThatDataCanBeStreamedAndDecodedAtTheSameTime() { + // Given + var initialResponse: HTTPURLResponse? + let onHTTPResponse = expectation(description: "onHTTPResponse should be called") + var firstAccumulatedData = Data() + var firstResponse: HTTPURLResponse? + var firstStreamOnMain = false + var firstCompleteOnMain = false + let firstReceive = expectation(description: "first stream should receive") + let firstCompletion = expectation(description: "first stream should complete") + var decodedResponse: TestResponse? + var decodingError: AFError? + var secondResponse: HTTPURLResponse? + var secondStreamOnMain = false + var secondCompleteOnMain = false + let secondReceive = expectation(description: "second stream should receive") + let secondCompletion = expectation(description: "second stream should complete") + + // When + AF.streamRequest(.stream(1)) + .onHTTPResponse { response in + initialResponse = response + onHTTPResponse.fulfill() + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + firstStreamOnMain = Thread.isMainThread + switch result { + case let .success(data): + firstAccumulatedData.append(data) + } + firstReceive.fulfill() + case let .complete(completion): + firstCompleteOnMain = Thread.isMainThread + firstResponse = completion.response + firstCompletion.fulfill() + } + } + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + secondStreamOnMain = Thread.isMainThread + switch result { + case let .success(value): + decodedResponse = value + case let .failure(error): + decodingError = error + } + secondReceive.fulfill() + case let .complete(completion): + secondCompleteOnMain = Thread.isMainThread + secondResponse = completion.response + secondCompletion.fulfill() + } + } + + wait(for: [onHTTPResponse, firstReceive, firstCompletion], timeout: timeout, enforceOrder: true) + wait(for: [secondReceive, secondCompletion], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(initialResponse, firstResponse) + XCTAssertEqual(initialResponse, secondResponse) + XCTAssertTrue(firstStreamOnMain) + XCTAssertTrue(firstCompleteOnMain) + XCTAssertEqual(firstResponse?.statusCode, 200) + XCTAssertTrue(!firstAccumulatedData.isEmpty) + XCTAssertTrue(secondStreamOnMain) + XCTAssertTrue(secondCompleteOnMain) + XCTAssertEqual(secondResponse?.statusCode, 200) + XCTAssertNotNil(decodedResponse) + XCTAssertNil(decodingError) + } + + #if !canImport(FoundationNetworking) // If we not using swift-corelibs-foundation. + func testThatDataStreamRequestProducesWorkingInputStream() { + // Given + let expect = expectation(description: "stream complete") + + // When + let stream = AF.streamRequest(.xml) + .responseStream { stream in + switch stream.event { + case .complete: + expect.fulfill() + default: break + } + } + .asInputStream() + + waitForExpectations(timeout: timeout) + + // Then + let parser = XMLParser(stream: stream!) + let parsed = parser.parse() + XCTAssertTrue(parsed) + XCTAssertNil(parser.parserError) + } + #endif + + func testThatDataStreamCanBeManuallyResumed() { + // Given + let session = Session(startRequestsImmediately: false) + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + let didReceive = expectation(description: "stream did receive") + let didComplete = expectation(description: "stream complete") + + // When + session.streamRequest(.stream(1)) + .responseStream { stream in + switch stream.event { + case .stream: + streamOnMain = Thread.isMainThread + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + }.resume() + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertEqual(response?.statusCode, 200) + } + + func testThatDataStreamIsAutomaticallyCanceledOnStreamErrorWhenEnabled() { + var response: HTTPURLResponse? + var complete: DataStreamRequest.Completion? + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.bytes(50), automaticallyCancelOnStreamError: true) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .complete(completion): + complete = completion + response = completion.response + didComplete.fulfill() + default: break + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertTrue(complete?.error?.isExplicitlyCancelledError == true, + "error is not explicitly cancelled but \(complete?.error?.localizedDescription ?? "None")") + } + + func testThatDataStreamIsAutomaticallyCanceledOnStreamClosureError() { + // Given + enum LocalError: Error { case failed } + + var response: HTTPURLResponse? + var complete: DataStreamRequest.Completion? + let didReceive = expectation(description: "stream did receieve") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.bytes(50)) + .responseStream { stream in + switch stream.event { + case .stream: + didReceive.fulfill() + throw LocalError.failed + case let .complete(completion): + complete = completion + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertTrue(complete?.error?.isExplicitlyCancelledError == false) + } + + func testThatDataStreamCanBeCancelledInClosure() { + // Given + // Use .main so that completion can't beat cancellation. + let session = Session(rootQueue: .main) + var completion: DataStreamRequest.Completion? + let didReceive = expectation(description: "stream should receive") + let didComplete = expectation(description: "stream should complete") + + // When + session.streamRequest(.bytes(1)).responseStream { stream in + switch stream.event { + case .stream: + didReceive.fulfill() + stream.cancel() + case .complete: + completion = stream.completion + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(completion?.error?.isExplicitlyCancelledError == true, + """ + error is not explicitly cancelled, instead: \(completion?.error?.localizedDescription ?? "none"). + response is: \(completion?.response?.description ?? "none"). + """) + } + + func testThatDataStreamCanBeCancelledByToken() { + // Given + // Use .main so that completion can't beat cancellation. + let session = Session(rootQueue: .main) + var completion: DataStreamRequest.Completion? + let didReceive = expectation(description: "stream should receive") + let didComplete = expectation(description: "stream should complete") + + // When + session.streamRequest(.bytes(1)).responseStream { stream in + switch stream.event { + case .stream: + didReceive.fulfill() + stream.token.cancel() + case .complete: + completion = stream.completion + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(completion?.error?.isExplicitlyCancelledError == true, + """ + error is not explicitly cancelled, instead: \(completion?.error?.localizedDescription ?? "none"). + response is: \(completion?.response?.description ?? "none"). + """) + } + + func testThatOnHTTPResponseCanContinueStream() { + // Given + let expectedSize = 5 + var accumulatedData = Data() + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + let didReceiveResponse = expectation(description: "stream should receive response once") + let didReceive = expectation(description: "stream should receive once") + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.bytes(expectedSize)) + .onHTTPResponse { response, completionHandler in + initialResponse = response + didReceiveResponse.fulfill() + completionHandler(.allow) + } + .responseStream { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(data): + accumulatedData.append(data) + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(initialResponse, response) + XCTAssertEqual(accumulatedData.count, expectedSize) + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + } + + func testThatOnHTTPResponseCanCancelStream() { + // Given + let expectedSize = 5 + var initialResponse: HTTPURLResponse? + var response: HTTPURLResponse? + var completion: DataStreamRequest.Completion? + var didCompleteOnMain = false + let didReceiveResponse = expectation(description: "stream should receive response once") + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.bytes(expectedSize)) + .onHTTPResponse { response, completionHandler in + initialResponse = response + didReceiveResponse.fulfill() + completionHandler(.cancel) + } + .responseStream { stream in + switch stream.event { + case .stream: + XCTFail("should never receive stream in a cancelled request") + case let .complete(comp): + didCompleteOnMain = Thread.isMainThread + completion = comp + response = comp.response + didComplete.fulfill() + } + } + + wait(for: [didReceiveResponse, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(response?.statusCode, 200) + XCTAssertEqual(initialResponse, response) + XCTAssertTrue(didCompleteOnMain) + XCTAssertTrue(completion?.error?.isExplicitlyCancelledError == true, "onHTTPResponse cancelled stream should be explicitly cancelled") + } +} + +// MARK: - Serialization Tests + +final class DataStreamSerializationTests: BaseTestCase { + func testThatDataStreamsCanBeAString() { + // Given + var responseString: String? + var streamOnMain = false + var completeOnMain = false + var response: HTTPURLResponse? + let didStream = expectation(description: "did stream") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.stream(1)) + .responseStreamString { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(string): + responseString = string + } + didStream.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didStream, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertNotNil(responseString) + XCTAssertEqual(response?.statusCode, 200) + } + + func testThatDataStreamsCanBeDecoded() { + // Given + var response: TestResponse? + var httpResponse: HTTPURLResponse? + var decodingError: AFError? + var streamOnMain = false + var completeOnMain = false + let didReceive = expectation(description: "stream did receive") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.stream(1)) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(value): + response = value + case let .failure(error): + decodingError = error + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + httpResponse = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertNotNil(response) + XCTAssertEqual(httpResponse?.statusCode, 200) + XCTAssertNil(decodingError) + } + + func testThatDataStreamSerializerCanBeUsedDirectly() { + // Given + var response: HTTPURLResponse? + var decodedResponse: TestResponse? + var decodingError: AFError? + var streamOnMain = false + var completeOnMain = false + let serializer = DecodableStreamSerializer() + let didReceive = expectation(description: "stream did receive") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.stream(1)) + .responseStream(using: serializer) { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(value): + decodedResponse = value + case let .failure(error): + decodingError = error + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertNotNil(decodedResponse) + XCTAssertEqual(response?.statusCode, 200) + XCTAssertNil(decodingError) + } +} + +// MARK: - Integration Tests + +final class DataStreamIntegrationTests: BaseTestCase { + func testThatDataStreamCanFailValidation() { + // Given + var dataSeen = false + var error: AFError? + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.status(401)) + .validate() + .responseStream { stream in + switch stream.event { + case .stream: + dataSeen = true + case let .complete(completion): + error = completion.error + didComplete.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertTrue(error?.isResponseValidationError == true, "error should be response validation error") + XCTAssertFalse(dataSeen, "no data should be seen") + } + + func testThatDataStreamsCanBeRetried() { + // Given + final class GoodRetry: RequestInterceptor { + var hasRetried = false + + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + if hasRetried { + completion(.success(Endpoint.bytes(1000).urlRequest)) + } else { + completion(.success(urlRequest)) + } + } + + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + hasRetried = true + completion(.retry) + } + } + + let session = Session(interceptor: GoodRetry()) + var accumulatedData = Data() + var streamOnMain = false + var completeOnMain = false + var response: HTTPURLResponse? + let didReceive = expectation(description: "stream should receive") + let didComplete = expectation(description: "stream should complete") + + // When + session.streamRequest(.status(401)) + .validate() + .responseStream { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(data): + accumulatedData.append(data) + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertEqual(accumulatedData.count, 1000) + XCTAssertEqual(response?.statusCode, 200) + } + + func testThatDataStreamCanBeRedirected() { + // Given + var response: HTTPURLResponse? + var decodedResponse: TestResponse? + var decodingError: AFError? + var streamOnMain = false + var completeOnMain = false + let didRedirect = expectation(description: "stream redirected") + let redirector = Redirector(behavior: .modify { _, _, _ in + didRedirect.fulfill() + return Endpoint.stream(1).urlRequest + }) + let didReceive = expectation(description: "stream should receive") + let didComplete = expectation(description: "stream should complete") + + // When + AF.streamRequest(.status(301)) + .redirect(using: redirector) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(value): + decodedResponse = value + case let .failure(error): + decodingError = error + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didRedirect, didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertNotNil(decodedResponse) + XCTAssertEqual(response?.statusCode, 200) + XCTAssertNil(decodingError) + } + + func testThatDataStreamCallsCachedResponseHandler() { + // Given + var response: HTTPURLResponse? + var decodedResponse: TestResponse? + var decodingError: AFError? + var streamOnMain = false + var completeOnMain = false + let cached = expectation(description: "stream called cacher") + let cacher = ResponseCacher(behavior: .modify { _, _ in + cached.fulfill() + return nil + }) + let didReceive = expectation(description: "stream did receive") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.stream(1)) + .cacheResponse(using: cacher) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + streamOnMain = Thread.isMainThread + switch result { + case let .success(value): + decodedResponse = value + case let .failure(error): + decodingError = error + } + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + // willCacheResponse called after receiving all Data, so may be called before or after the asynchronous stream + // handlers. + wait(for: [cached], timeout: timeout) + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertNotNil(decodedResponse) + XCTAssertEqual(response?.statusCode, 200) + XCTAssertNil(decodingError) + } + + func testThatDataStreamWorksCorrectlyWithMultipleSerialQueues() { + // Given + let requestQueue = DispatchQueue(label: "org.alamofire.testRequestQueue") + let serializationQueue = DispatchQueue(label: "org.alamofire.testSerializationQueue") + let session = Session(requestQueue: requestQueue, serializationQueue: serializationQueue) + var firstResponse: HTTPURLResponse? + var firstDecodedResponse: TestResponse? + var firstDecodingError: AFError? + var firstStreamOnMain = false + var firstCompleteOnMain = false + let firstStream = expectation(description: "first stream") + let firstDidReceive = expectation(description: "first stream did receive") + let firstDidComplete = expectation(description: "first stream complete") + var secondResponse: HTTPURLResponse? + var secondDecodedResponse: TestResponse? + var secondDecodingError: AFError? + var secondStreamOnMain = false + var secondCompleteOnMain = false + let secondStream = expectation(description: "second stream") + let secondDidReceive = expectation(description: "second stream did receive") + let secondDidComplete = expectation(description: "second stream complete") + + // When + session.streamRequest(.stream(1)) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + firstStreamOnMain = Thread.isMainThread + switch result { + case let .success(value): + firstDecodedResponse = value + case let .failure(error): + firstDecodingError = error + } + firstStream.fulfill() + firstDidReceive.fulfill() + case let .complete(completion): + firstCompleteOnMain = Thread.isMainThread + firstResponse = completion.response + firstDidComplete.fulfill() + } + } + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + secondStreamOnMain = Thread.isMainThread + switch result { + case let .success(value): + secondDecodedResponse = value + case let .failure(error): + secondDecodingError = error + } + secondStream.fulfill() + secondDidReceive.fulfill() + case let .complete(completion): + secondCompleteOnMain = Thread.isMainThread + secondResponse = completion.response + secondDidComplete.fulfill() + } + } + + wait(for: [firstStream, secondStream], timeout: timeout, enforceOrder: true) + // Cannot test order of completion events, as one may have been enqueued while the other executed directly. + wait(for: [firstDidReceive, firstDidComplete], timeout: timeout, enforceOrder: true) + wait(for: [secondDidReceive, secondDidComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(firstStreamOnMain) + XCTAssertTrue(firstCompleteOnMain) + XCTAssertNotNil(firstDecodedResponse) + XCTAssertEqual(firstResponse?.statusCode, 200) + XCTAssertNil(firstDecodingError) + XCTAssertTrue(secondStreamOnMain) + XCTAssertTrue(secondCompleteOnMain) + XCTAssertNotNil(secondDecodedResponse) + XCTAssertEqual(secondResponse?.statusCode, 200) + XCTAssertNil(secondDecodingError) + } + + func testThatDataStreamWorksCorrectlyWithMultipleConcurrentQueues() { + // Given + let requestQueue = DispatchQueue(label: "org.alamofire.testRequestQueue", attributes: .concurrent) + let serializationQueue = DispatchQueue(label: "org.alamofire.testSerializationQueue", attributes: .concurrent) + let session = Session(requestQueue: requestQueue, serializationQueue: serializationQueue) + var firstResponse: HTTPURLResponse? + var firstDecodedResponse: TestResponse? + var firstDecodingError: AFError? + var firstStreamOnMain = false + var firstCompleteOnMain = false + let firstDidReceive = expectation(description: "first stream did receive") + let firstDidComplete = expectation(description: "first stream complete") + var secondResponse: HTTPURLResponse? + var secondDecodedResponse: TestResponse? + var secondDecodingError: AFError? + var secondStreamOnMain = false + var secondCompleteOnMain = false + let secondDidReceive = expectation(description: "second stream did receive") + let secondDidComplete = expectation(description: "second stream complete") + + // When + session.streamRequest(.stream(1)) + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + firstStreamOnMain = Thread.isMainThread + switch result { + case let .success(value): + firstDecodedResponse = value + case let .failure(error): + firstDecodingError = error + } + firstDidReceive.fulfill() + case let .complete(completion): + firstCompleteOnMain = Thread.isMainThread + firstResponse = completion.response + firstDidComplete.fulfill() + } + } + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case let .stream(result): + secondStreamOnMain = Thread.isMainThread + switch result { + case let .success(value): + secondDecodedResponse = value + case let .failure(error): + secondDecodingError = error + } + secondDidReceive.fulfill() + case let .complete(completion): + secondCompleteOnMain = Thread.isMainThread + secondResponse = completion.response + secondDidComplete.fulfill() + } + } + + wait(for: [firstDidReceive, firstDidComplete], timeout: timeout, enforceOrder: true) + wait(for: [secondDidReceive, secondDidComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(firstStreamOnMain) + XCTAssertTrue(firstCompleteOnMain) + XCTAssertNotNil(firstDecodedResponse) + XCTAssertEqual(firstResponse?.statusCode, 200) + XCTAssertNil(firstDecodingError) + XCTAssertTrue(secondStreamOnMain) + XCTAssertTrue(secondCompleteOnMain) + XCTAssertNotNil(secondDecodedResponse) + XCTAssertEqual(secondResponse?.statusCode, 200) + XCTAssertNil(secondDecodingError) + } + + func testThatDataStreamCanAuthenticate() { + // Given + let user = "userstream", password = "password" + var response: HTTPURLResponse? + var streamOnMain = false + var completeOnMain = false + let didReceive = expectation(description: "stream did receive") + let didComplete = expectation(description: "stream complete") + + // When + AF.streamRequest(.basicAuth(forUser: user, password: password)) + .authenticate(username: user, password: password) + .responseStream { stream in + switch stream.event { + case .stream: + streamOnMain = Thread.isMainThread + didReceive.fulfill() + case let .complete(completion): + completeOnMain = Thread.isMainThread + response = completion.response + didComplete.fulfill() + } + } + + wait(for: [didReceive, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertTrue(streamOnMain) + XCTAssertTrue(completeOnMain) + XCTAssertEqual(response?.statusCode, 200) + } +} + +final class DataStreamLifetimeEvents: BaseTestCase { + func testThatDataStreamRequestHasAppropriateLifetimeEvents() { + // Given + final class Monitor: EventMonitor { + var called: (() -> Void)? + + func request(_ request: DataStreamRequest, didParseStream result: Result) { + called?() + } + } + let eventMonitor = ClosureEventMonitor() + let parseMonitor = Monitor() + let session = Session(eventMonitors: [eventMonitor, parseMonitor]) + + // Disable event test until Firewalk supports HTTPS. + // let didReceiveChallenge = expectation(description: "didReceiveChallenge should fire") + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didReceiveData = expectation(description: "didReceiveData should fire") + let willCacheResponse = expectation(description: "willCacheResponse should fire") + let didCreateURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didValidate = expectation(description: "didValidateRequest should fire") + didValidate.expectedFulfillmentCount = 2 + let didParse = expectation(description: "streamDidParse should fire") + let didReceive = expectation(description: "stream should receive") + let didCompleteStream = expectation(description: "stream should complete") + + var dataReceived = false + + // Disable event test until Firewalk supports HTTPS. + // eventMonitor.taskDidReceiveChallenge = { _, _, _ in didReceiveChallenge.fulfill() } + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.dataTaskDidReceiveData = { _, _, _ in + guard !dataReceived else { return } + // Data may be received many times, fulfill only once. + dataReceived = true + didReceiveData.fulfill() + } + eventMonitor.dataTaskWillCacheResponse = { _, _, _ in willCacheResponse.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in didResumeTask.fulfill() } + eventMonitor.requestDidValidateRequestResponseWithResult = { _, _, _, _ in didValidate.fulfill() } + parseMonitor.called = { didParse.fulfill() } + + // When + let request = session.streamRequest(.stream(1)) + .validate() + .responseStreamDecodable(of: TestResponse.self) { stream in + switch stream.event { + case .stream: + didReceive.fulfill() + case .complete: + didCompleteStream.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/DownloadTests.swift b/Carthage/Checkouts/Alamofire/Tests/DownloadTests.swift new file mode 100644 index 00000000..a2b7c637 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/DownloadTests.swift @@ -0,0 +1,1025 @@ +// +// DownloadTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class DownloadInitializationTests: BaseTestCase { + func testDownloadClassMethodWithMethodURLAndDestination() { + // Given + let endpoint = Endpoint.get + let expectation = expectation(description: "download should complete") + + // When + let request = AF.download(endpoint).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request) + XCTAssertEqual(request.request?.httpMethod, "GET") + XCTAssertEqual(request.request?.url, endpoint.url) + XCTAssertNotNil(request.response) + } + + func testDownloadClassMethodWithMethodURLHeadersAndDestination() { + // Given + let endpoint = Endpoint.get + let headers: HTTPHeaders = ["Authorization": "123456"] + let expectation = expectation(description: "download should complete") + + // When + let request = AF.download(endpoint, headers: headers).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request) + XCTAssertEqual(request.request?.httpMethod, "GET") + XCTAssertEqual(request.request?.url, endpoint.url) + XCTAssertEqual(request.request?.headers["Authorization"], "123456") + XCTAssertNotNil(request.response) + } +} + +// MARK: - + +final class DownloadResponseTests: BaseTestCase { + private var randomCachesFileURL: URL { + testDirectoryURL.appendingPathComponent("\(UUID().uuidString).json") + } + + func testDownloadRequest() { + // Given + let fileURL = randomCachesFileURL + let numberOfLines = 10 + let endpoint = Endpoint.stream(numberOfLines) + let destination: DownloadRequest.Destination = { _, _ in (fileURL, []) } + + let expectation = expectation(description: "Download request should download data to file: \(endpoint.url.absoluteString)") + var response: DownloadResponse? + + // When + AF.download(endpoint, to: destination) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + + if let destinationURL = response?.fileURL { + XCTAssertTrue(FileManager.default.fileExists(atPath: destinationURL.path)) + + if let data = try? Data(contentsOf: destinationURL) { + XCTAssertGreaterThan(data.count, 0) + } else { + XCTFail("data should exist for contents of destinationURL") + } + } + } + + func testDownloadRequestResponseURLProducesURL() throws { + // Given + let expectation = expectation(description: "Download request should download data") + var response: DownloadResponse? + + // When + AF.download(.get) + .responseURL { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + + let url = try XCTUnwrap(response?.value) + XCTAssertTrue(FileManager.default.fileExists(atPath: url.path)) + } + + func testCancelledDownloadRequest() { + // Given + let fileURL = randomCachesFileURL + let numberOfLines = 10 + let destination: DownloadRequest.Destination = { _, _ in (fileURL, []) } + + let expectation = expectation(description: "Cancelled download request should not download data to file") + var response: DownloadResponse? + + // When + AF.download(.stream(numberOfLines), to: destination) + .response { resp in + response = resp + expectation.fulfill() + } + .cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isExplicitlyCancelledError, true) + } + + func testDownloadRequestWithProgress() { + // Given + let randomBytes = 1 * 25 * 1024 + let endpoint = Endpoint.bytes(randomBytes) + + let expectation = expectation(description: "Bytes download progress should be reported: \(endpoint.url)") + + var progressValues: [Double] = [] + var response: DownloadResponse? + + // When + AF.download(endpoint) + .downloadProgress { progress in + progressValues.append(progress.fractionCompleted) + } + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + + var previousProgress: Double = progressValues.first ?? 0.0 + + for progress in progressValues { + XCTAssertGreaterThanOrEqual(progress, previousProgress) + previousProgress = progress + } + + if let lastProgressValue = progressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in progressValues should not be nil") + } + } + + func testDownloadRequestWithParameters() { + // Given + let fileURL = randomCachesFileURL + let parameters = ["foo": "bar"] + let destination: DownloadRequest.Destination = { _, _ in (fileURL, []) } + + let expectation = expectation(description: "Download request should download data to file") + var response: DownloadResponse? + + // When + AF.download(Endpoint.get, parameters: parameters, to: destination) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + + if + let data = try? Data(contentsOf: fileURL), + let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), + let json = jsonObject as? [String: Any], + let args = json["args"] as? [String: String] { + XCTAssertEqual(args["foo"], "bar") + } else { + XCTFail("args parameter in JSON should not be nil") + } + } + + func testDownloadRequestWithHeaders() { + // Given + let fileURL = randomCachesFileURL + let endpoint = Endpoint.get + let headers: HTTPHeaders = ["Authorization": "123456"] + let destination: DownloadRequest.Destination = { _, _ in (fileURL, []) } + + let expectation = expectation(description: "Download request should download data to file: \(endpoint.url)") + var response: DownloadResponse? + + // When + AF.download(endpoint, headers: headers, to: destination) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + + if + let data = try? Data(contentsOf: fileURL), + let jsonObject = try? JSONSerialization.jsonObject(with: data, options: []), + let json = jsonObject as? [String: Any], + let headers = json["headers"] as? [String: String] { + XCTAssertEqual(headers["Authorization"], "123456") + } else { + XCTFail("headers parameter in JSON should not be nil") + } + } + + func testThatDownloadingFileAndMovingToDirectoryThatDoesNotExistThrowsError() { + // Given + let fileURL = testDirectoryURL.appendingPathComponent("some/random/folder/test_output.json") + + let expectation = expectation(description: "Download request should download data but fail to move file") + var response: DownloadResponse? + + // When + AF.download(.get, to: { _, _ in (fileURL, []) }) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual((response?.error?.underlyingError as? CocoaError)?.code, .fileNoSuchFile) + } + + func testThatDownloadOptionsCanCreateIntermediateDirectoriesPriorToMovingFile() { + // Given + let fileURL = testDirectoryURL.appendingPathComponent("some/random/folder/test_output.json") + + let expectation = expectation(description: "Download request should download data to file: \(fileURL)") + var response: DownloadResponse? + + // When + AF.download(.get, to: { _, _ in (fileURL, [.createIntermediateDirectories]) }) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + } + + func testThatDownloadingFileAndMovingToDestinationThatIsOccupiedThrowsError() throws { + // Given + let directoryURL = testDirectoryURL.appendingPathComponent("some/random/folder") + let directoryCreated = FileManager.createDirectory(at: directoryURL) + + let fileURL = directoryURL.appendingPathComponent("test_output.json") + try "random_data".write(to: fileURL, atomically: true, encoding: .utf8) + + let expectation = expectation(description: "Download should complete but fail to move file") + var response: DownloadResponse? + + // When + AF.download(.get, to: { _, _ in (fileURL, []) }) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(directoryCreated) + + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual((response?.error?.underlyingError as? CocoaError)?.code, .fileWriteFileExists) + } + + func testThatDownloadOptionsCanRemovePreviousFilePriorToMovingFile() { + // Given + let directoryURL = testDirectoryURL.appendingPathComponent("some/random/folder") + let directoryCreated = FileManager.createDirectory(at: directoryURL) + + let fileURL = directoryURL.appendingPathComponent("test_output.json") + + let expectation = expectation(description: "Download should complete and move file to URL: \(fileURL)") + var response: DownloadResponse? + + // When + AF.download(.get, + to: { _, _ in (fileURL, [.removePreviousFile, .createIntermediateDirectories]) }) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(directoryCreated) + + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + } +} + +// MARK: - + +final class DownloadRequestEventsTestCase: BaseTestCase { + func testThatDownloadRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didCreateInitialURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateURLRequest = expectation(description: "didCreateURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didWriteData = expectation(description: "didWriteData should fire") + let didFinishDownloading = expectation(description: "didFinishDownloading should fire") + let didFinishWithResult = expectation(description: "didFinishWithResult should fire") + let didCreate = expectation(description: "didCreate should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + var wroteData = false + + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateInitialURLRequest.fulfill() } + eventMonitor.requestDidCreateURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.downloadTaskDidWriteData = { _, _, _, _, _ in + guard !wroteData else { return } + + wroteData = true + didWriteData.fulfill() + } + eventMonitor.downloadTaskDidFinishDownloadingToURL = { _, _, _ in didFinishDownloading.fulfill() } + eventMonitor.requestDidFinishDownloadingUsingTaskWithResult = { _, _, _ in didFinishWithResult.fulfill() } + eventMonitor.requestDidCreateDestinationURL = { _, _ in didCreate.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in didResumeTask.fulfill() } + eventMonitor.requestDidParseDownloadResponse = { _, _ in didParseResponse.fulfill() } + + // When + let request = session.download(.get).response { _ in + responseHandler.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatCancelledDownloadRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didCreateInitialURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateURLRequest = expectation(description: "didCreateURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let didCancel = expectation(description: "didCancel should fire") + let didCancelTask = expectation(description: "didCancelTask should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateInitialURLRequest.fulfill() } + eventMonitor.requestDidCreateURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidParseDownloadResponse = { _, _ in didParseResponse.fulfill() } + eventMonitor.requestDidCancel = { _ in didCancel.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in didCancelTask.fulfill() } + + // When + let request = session.download(.delay(5)).response { _ in + responseHandler.fulfill() + } + + eventMonitor.requestDidResumeTask = { [unowned request] _, _ in + request.cancel() + didResumeTask.fulfill() + } + + request.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } +} + +// MARK: - + +final class DownloadResumeDataTestCase: BaseTestCase { + func testThatCancelledDownloadRequestDoesNotProduceResumeData() { + // Given + let expectation = expectation(description: "Download should be cancelled") + var cancelled = false + + var response: DownloadResponse? + + // When + let download = AF.download(.download()) + download.downloadProgress { [unowned download] progress in + guard !cancelled else { return } + + if progress.fractionCompleted > 0.1 { + download.cancel() + cancelled = true + } + } + download.response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNotNil(response?.error) + + XCTAssertNil(response?.resumeData) + XCTAssertNil(download.resumeData) + } + + func testThatDownloadRequestProducesResumeDataOnError() { + // Given + let expectation = expectation(description: "download complete") + + var response: DownloadResponse? + + // When + let download = AF.download(.download(produceError: true)) + download.response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNotNil(response?.error) + + XCTAssertNotNil(response?.resumeData) + XCTAssertNotNil(download.resumeData) + #if !canImport(FoundationNetworking) // If we not using swift-corelibs-foundation. + XCTAssertNotNil(download.error?.downloadResumeData) + XCTAssertEqual(download.error?.downloadResumeData, response?.resumeData) + #endif + XCTAssertEqual(response?.resumeData, download.resumeData) + } + + func testThatCancelledDownloadResponseDataMatchesResumeData() { + // Given + let expectation = expectation(description: "Download should be cancelled") + var cancelled = false + + var response: DownloadResponse? + + // When + let download = AF.download(.download()) + download.downloadProgress { [unowned download] progress in + guard !cancelled else { return } + + if progress.fractionCompleted > 0.1 { + download.cancel(producingResumeData: true) + cancelled = true + } + } + download.response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNotNil(response?.error) + + XCTAssertNotNil(response?.resumeData) + XCTAssertNotNil(download.resumeData) + + XCTAssertEqual(response?.resumeData, download.resumeData) + } + + func testThatCancelledDownloadResumeDataIsAvailableWithDecodableResponseSerializer() { + // Given + let expectation = expectation(description: "Download should be cancelled") + var cancelled = false + + var response: DownloadResponse? + + // When + let download = AF.download(.download()) + download.downloadProgress { [unowned download] progress in + guard !cancelled else { return } + + if progress.fractionCompleted > 0.1 { + download.cancel(producingResumeData: true) + cancelled = true + } + } + download.responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertNotNil(response?.result.failure) + + XCTAssertNotNil(response?.resumeData) + XCTAssertNotNil(download.resumeData) + + XCTAssertEqual(response?.resumeData, download.resumeData) + } + + func testThatCancelledDownloadCanBeResumedWithResumeData() { + // Given + let expectation1 = expectation(description: "Download should be cancelled") + var cancelled = false + + var response1: DownloadResponse? + + // When + let download = AF.download(.download()) + download.downloadProgress { [unowned download] progress in + guard !cancelled else { return } + + if progress.fractionCompleted > 0.1 { + download.cancel(producingResumeData: true) + cancelled = true + } + } + download.responseData { resp in + response1 = resp + expectation1.fulfill() + } + + waitForExpectations(timeout: timeout) + + guard let resumeData = download.resumeData else { + XCTFail("resumeData should not be nil") + return + } + + let expectation2 = expectation(description: "Download should complete") + + var progressValues: [Double] = [] + var response2: DownloadResponse? + + AF.download(resumingWith: resumeData) + .downloadProgress { progress in + progressValues.append(progress.fractionCompleted) + } + .responseData { resp in + response2 = resp + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response1?.request) + XCTAssertNotNil(response1?.response) + XCTAssertNil(response1?.fileURL) + XCTAssertEqual(response1?.result.isFailure, true) + XCTAssertNotNil(response1?.result.failure) + + XCTAssertNotNil(response2?.response) + XCTAssertNotNil(response2?.fileURL) + XCTAssertEqual(response2?.result.isSuccess, true) + XCTAssertNil(response2?.result.failure) + + progressValues.forEach { XCTAssertGreaterThanOrEqual($0, 0.1) } + } + + func testThatCancelledDownloadProducesMatchingResumeData() { + // Given + let expectation = expectation(description: "Download should be cancelled") + var cancelled = false + var receivedResumeData: Data? + var response: DownloadResponse? + + // When + let download = AF.download(.download()) + download.downloadProgress { [unowned download] progress in + guard !cancelled else { return } + + if progress.fractionCompleted > 0.1 { + download.cancel { receivedResumeData = $0 } + cancelled = true + } + } + download.response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNotNil(response?.error) + + XCTAssertNotNil(response?.resumeData) + XCTAssertNotNil(download.resumeData) + + XCTAssertEqual(response?.resumeData, download.resumeData) + XCTAssertEqual(response?.resumeData, receivedResumeData) + XCTAssertEqual(download.resumeData, receivedResumeData) + } +} + +// MARK: - + +final class DownloadResponseMapTestCase: BaseTestCase { + func testThatMapTransformsSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DownloadResponse? + + // When + AF.download(.get, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.map { response in + response.args?["foo"] ?? "invalid" + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + XCTAssertEqual(response?.result.success, "bar") + XCTAssertNotNil(response?.metrics) + } + + func testThatMapPreservesFailureError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL") + + var response: DownloadResponse? + + // When + AF.download(urlString, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.map { _ in "ignored" } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class DownloadResponseTryMapTestCase: BaseTestCase { + func testThatTryMapTransformsSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DownloadResponse? + + // When + AF.download(.get, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.tryMap { response in + response.args?["foo"] ?? "invalid" + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + XCTAssertEqual(response?.result.success, "bar") + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapCatchesTransformationError() { + // Given + struct TransformError: Error {} + + let expectation = expectation(description: "request should succeed") + + var response: DownloadResponse? + + // When + AF.download(.get, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.tryMap { _ in + throw TransformError() + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + if let error = response?.result.failure { + XCTAssertTrue(error is TransformError) + } else { + XCTFail("flatMap should catch the transformation error") + } + + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapPreservesFailureError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with 404") + + var response: DownloadResponse? + + // When + AF.download(urlString, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.tryMap { _ in "ignored" } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertNotNil(response?.metrics) + } +} + +final class DownloadResponseMapErrorTestCase: BaseTestCase { + func testThatMapErrorTransformsFailureValue() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should not succeed") + + var response: DownloadResponse? + + // When + AF.download(urlString).responseDecodable(of: TestResponse.self) { resp in + response = resp.mapError { error in + TestError.error(error: error) + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.result.isFailure, true) + + guard let error = response?.error, case .error = error else { XCTFail(); return } + + XCTAssertNotNil(response?.metrics) + } + + func testThatMapErrorPreservesSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DownloadResponse? + + // When + AF.download(.get).responseData { resp in + response = resp.mapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class DownloadResponseTryMapErrorTestCase: BaseTestCase { + func testThatTryMapErrorPreservesSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DownloadResponse? + + // When + AF.download(.get).responseData { resp in + response = resp.tryMapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNil(response?.error) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapErrorCatchesTransformationError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DownloadResponse? + + // When + AF.download(urlString).responseData { resp in + response = resp.tryMapError { _ in try TransformationError.error.alwaysFails() } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.result.isFailure, true) + + if let error = response?.result.failure { + XCTAssertTrue(error is TransformationError) + } else { + XCTFail("flatMapError should catch the transformation error") + } + + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapErrorTransformsError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DownloadResponse? + + // When + AF.download(urlString).responseData { resp in + response = resp.tryMapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.result.isFailure, true) + guard let error = response?.error, case TestError.error = error else { XCTFail(); return } + + XCTAssertNotNil(response?.metrics) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/FileManager+AlamofireTests.swift b/Carthage/Checkouts/Alamofire/Tests/FileManager+AlamofireTests.swift new file mode 100644 index 00000000..04fa1a6d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/FileManager+AlamofireTests.swift @@ -0,0 +1,87 @@ +// +// FileManager+AlamofireTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension FileManager { + // MARK: - Common Directories + + static var temporaryDirectoryPath: String { + NSTemporaryDirectory() + } + + static var temporaryDirectoryURL: URL { + URL(fileURLWithPath: FileManager.temporaryDirectoryPath, isDirectory: true) + } + + // MARK: - File System Modification + + @discardableResult + static func createDirectory(atPath path: String) -> Bool { + do { + try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil) + return true + } catch { + return false + } + } + + @discardableResult + static func createDirectory(at url: URL) -> Bool { + createDirectory(atPath: url.path) + } + + @discardableResult + static func removeItem(atPath path: String) -> Bool { + do { + try FileManager.default.removeItem(atPath: path) + return true + } catch { + return false + } + } + + @discardableResult + static func removeItem(at url: URL) -> Bool { + removeItem(atPath: url.path) + } + + @discardableResult + static func removeAllItemsInsideDirectory(atPath path: String) -> Bool { + let enumerator = FileManager.default.enumerator(atPath: path) + var result = true + + while let fileName = enumerator?.nextObject() as? String { + let success = removeItem(atPath: path + "/\(fileName)") + if !success { result = false } + } + + return result + } + + @discardableResult + static func removeAllItemsInsideDirectory(at url: URL) -> Bool { + removeAllItemsInsideDirectory(atPath: url.path) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/HTTPHeadersTests.swift b/Carthage/Checkouts/Alamofire/Tests/HTTPHeadersTests.swift new file mode 100644 index 00000000..3016680e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/HTTPHeadersTests.swift @@ -0,0 +1,133 @@ +// +// HTTPHeadersTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import XCTest + +class HTTPHeadersTests: BaseTestCase { + func testHeadersAreStoreUniquelyByCaseInsensitiveName() { + // Given + let headersFromDictionaryLiteral: HTTPHeaders = ["key": "", "Key": "", "KEY": ""] + let headersFromDictionary = HTTPHeaders(["key": "", "Key": "", "KEY": ""]) + let headersFromArrayLiteral: HTTPHeaders = [HTTPHeader(name: "key", value: ""), + HTTPHeader(name: "Key", value: ""), + HTTPHeader(name: "KEY", value: "")] + let headersFromArray = HTTPHeaders([HTTPHeader(name: "key", value: ""), + HTTPHeader(name: "Key", value: ""), + HTTPHeader(name: "KEY", value: "")]) + var headersCreatedManually = HTTPHeaders() + headersCreatedManually.update(HTTPHeader(name: "key", value: "")) + headersCreatedManually.update(name: "Key", value: "") + headersCreatedManually.update(name: "KEY", value: "") + + // When, Then + XCTAssertEqual(headersFromDictionaryLiteral.count, 1) + XCTAssertEqual(headersFromDictionary.count, 1) + XCTAssertEqual(headersFromArrayLiteral.count, 1) + XCTAssertEqual(headersFromArray.count, 1) + XCTAssertEqual(headersCreatedManually.count, 1) + } + + func testHeadersPreserveOrderOfInsertion() { + // Given + let headersFromDictionaryLiteral: HTTPHeaders = ["c": "", "a": "", "b": ""] + // Dictionary initializer can't preserve order. + let headersFromArrayLiteral: HTTPHeaders = [HTTPHeader(name: "b", value: ""), + HTTPHeader(name: "a", value: ""), + HTTPHeader(name: "c", value: "")] + let headersFromArray = HTTPHeaders([HTTPHeader(name: "b", value: ""), + HTTPHeader(name: "a", value: ""), + HTTPHeader(name: "c", value: "")]) + var headersCreatedManually = HTTPHeaders() + headersCreatedManually.update(HTTPHeader(name: "c", value: "")) + headersCreatedManually.update(name: "b", value: "") + headersCreatedManually.update(name: "a", value: "") + + // When + let dictionaryLiteralNames = headersFromDictionaryLiteral.map(\.name) + let arrayLiteralNames = headersFromArrayLiteral.map(\.name) + let arrayNames = headersFromArray.map(\.name) + let manualNames = headersCreatedManually.map(\.name) + + // Then + XCTAssertEqual(dictionaryLiteralNames, ["c", "a", "b"]) + XCTAssertEqual(arrayLiteralNames, ["b", "a", "c"]) + XCTAssertEqual(arrayNames, ["b", "a", "c"]) + XCTAssertEqual(manualNames, ["c", "b", "a"]) + } + + func testHeadersCanBeProperlySortedByName() { + // Given + let headers: HTTPHeaders = ["c": "", "a": "", "b": ""] + + // When + let sortedHeaders = headers.sorted() + + // Then + XCTAssertEqual(headers.map(\.name), ["c", "a", "b"]) + XCTAssertEqual(sortedHeaders.map(\.name), ["a", "b", "c"]) + } + + func testHeadersCanInsensitivelyGetAndSetThroughSubscript() { + // Given + var headers: HTTPHeaders = ["c": "", "a": "", "b": ""] + + // When + headers["C"] = "c" + headers["a"] = "a" + headers["b"] = "b" + + // Then + XCTAssertEqual(headers["c"], "c") + XCTAssertEqual(headers.map(\.value), ["c", "a", "b"]) + XCTAssertEqual(headers.count, 3) + } + + func testHeadersPreserveLastFormAndValueOfAName() { + // Given + var headers: HTTPHeaders = ["c": "a"] + + // When + headers["C"] = "c" + + // Then + XCTAssertEqual(headers.description, "C: c") + } + + func testHeadersHaveUnsortedDescription() { + // Given + let headers: HTTPHeaders = ["c": "c", "a": "a", "b": "b"] + + // When + let description = headers.description + let expectedDescription = """ + c: c + a: a + b: b + """ + + // Then + XCTAssertEqual(description, expectedDescription) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Info.plist b/Carthage/Checkouts/Alamofire/Tests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/Alamofire/Tests/InternalRequestTests.swift b/Carthage/Checkouts/Alamofire/Tests/InternalRequestTests.swift new file mode 100644 index 00000000..55ca0dd9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/InternalRequestTests.swift @@ -0,0 +1,77 @@ +// +// InternalRequestTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import XCTest + +final class InternalRequestTests: BaseTestCase { + func testThatMultipleFinishInvocationsDoNotCallSerializersMoreThanOnce() { + // Given + let session = Session(rootQueue: .main, startRequestsImmediately: false) + let expect = expectation(description: "request complete") + var response: DataResponse? + + // When + let request = session.request(.get).response { resp in + response = resp + expect.fulfill() + } + + for _ in 0..<100 { + request.finish() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response) + } + + #if canImport(zlib) + @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) + func testThatRequestCompressorProperlyCalculatesAdler32() { + // Given + let compressor = DeflateRequestCompressor() + + // When + let checksum = compressor.adler32Checksum(of: Data("Wikipedia".utf8)) + + // Then + // From https://en.wikipedia.org/wiki/Adler-32 + XCTAssertEqual(checksum, 300_286_872) + } + + @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) + func testThatRequestCompressorDeflatesDataCorrectly() throws { + // Given + let compressor = DeflateRequestCompressor() + + // When + let compressedData = try compressor.deflate(Data([0])) + + // Then + XCTAssertEqual(compressedData, Data([0x78, 0x5E, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01])) + } + #endif +} diff --git a/Carthage/Checkouts/Alamofire/Tests/LeaksTests.swift b/Carthage/Checkouts/Alamofire/Tests/LeaksTests.swift new file mode 100644 index 00000000..f0b9ebf4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/LeaksTests.swift @@ -0,0 +1,69 @@ +// +// LeaksTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import XCTest + +// Only build when built through SPM, as tests run through Xcode don't like this. +// Add LEAKS flag once we figure out a way to automate this. +// Can run by invoking swift test -c debug -Xswiftc -DLEAKS in the Alamofire directory. +// Sample code from the Swift forums: https://forums.swift.org/t/test-for-memory-leaks-in-ci/36526/19 +#if SWIFT_PACKAGE && LEAKS && os(macOS) +final class LeaksTests: XCTestCase { + func testForLeaks() { + // Sets up an atexit handler that invokes the leaks tool. + atexit { + @discardableResult + func leaksTo(_ file: String) -> Process { + let out = FileHandle(forWritingAtPath: file)! + defer { + if #available(macOS 10.15, *) { + try! out.close() + } else { + // Fallback on earlier versions + } + } + let process = Process() + process.launchPath = "/usr/bin/leaks" + process.arguments = ["\(getpid())"] + process.standardOutput = out + process.standardError = out + process.launch() + process.waitUntilExit() + return process + } + let process = leaksTo("/dev/null") + guard process.terminationReason == .exit && [0, 1].contains(process.terminationStatus) else { + print("Process terminated: \(process.terminationReason): \(process.terminationStatus)") + exit(255) + } + if process.terminationStatus == 1 { + print("================") + print("Leaks Detected!!!") + leaksTo("/dev/tty") + } + exit(process.terminationStatus) + } + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/MultipartFormDataTests.swift b/Carthage/Checkouts/Alamofire/Tests/MultipartFormDataTests.swift new file mode 100644 index 00000000..cb950aba --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/MultipartFormDataTests.swift @@ -0,0 +1,989 @@ +// +// MultipartFormDataTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +struct EncodingCharacters { + static let crlf = "\r\n" +} + +enum BoundaryGenerator { + enum BoundaryType { + case initial, encapsulated, final + } + + static func boundary(forBoundaryType boundaryType: BoundaryType, boundaryKey: String) -> String { + let boundary: String + + switch boundaryType { + case .initial: + boundary = "--\(boundaryKey)\(EncodingCharacters.crlf)" + case .encapsulated: + boundary = "\(EncodingCharacters.crlf)--\(boundaryKey)\(EncodingCharacters.crlf)" + case .final: + boundary = "\(EncodingCharacters.crlf)--\(boundaryKey)--\(EncodingCharacters.crlf)" + } + + return boundary + } + + static func boundaryData(boundaryType: BoundaryType, boundaryKey: String) -> Data { + Data(BoundaryGenerator.boundary(forBoundaryType: boundaryType, + boundaryKey: boundaryKey).utf8) + } +} + +// MARK: - + +class MultipartFormDataPropertiesTestCase: BaseTestCase { + func testThatContentTypeContainsBoundary() { + // Given + let multipartFormData = MultipartFormData() + + // When + let boundary = multipartFormData.boundary + + // Then + let expectedContentType = "multipart/form-data; boundary=\(boundary)" + XCTAssertEqual(multipartFormData.contentType, expectedContentType, "contentType should match expected value") + } + + func testThatContentLengthMatchesTotalBodyPartSize() { + // Given + let multipartFormData = MultipartFormData() + let data1 = Data("Lorem ipsum dolor sit amet.".utf8) + let data2 = Data("Vim at integre alterum.".utf8) + + // When + multipartFormData.append(data1, withName: "data1") + multipartFormData.append(data2, withName: "data2") + + // Then + let expectedContentLength = UInt64(data1.count + data2.count) + XCTAssertEqual(multipartFormData.contentLength, expectedContentLength, "content length should match expected value") + } +} + +// MARK: - + +class MultipartFormDataEncodingTestCase: BaseTestCase { + let crlf = EncodingCharacters.crlf + + func testEncodingDataBodyPart() { + // Given + let multipartFormData = MultipartFormData() + + let data = Data("Lorem ipsum dolor sit amet.".utf8) + multipartFormData.append(data, withName: "data") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + let expectedString = ( + BoundaryGenerator.boundary(forBoundaryType: .initial, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"data\"\(crlf)\(crlf)" + + "Lorem ipsum dolor sit amet." + + BoundaryGenerator.boundary(forBoundaryType: .final, boundaryKey: boundary) + ) + let expectedData = Data(expectedString.utf8) + + XCTAssertEqual(encodedData, expectedData, "encoded data should match expected data") + } + } + + func testEncodingMultipleDataBodyParts() { + // Given + let multipartFormData = MultipartFormData() + + let frenchData = Data("français".utf8) + let japaneseData = Data("日本語".utf8) + let emojiData = Data("😃👍🏻🍻🎉".utf8) + + multipartFormData.append(frenchData, withName: "french") + multipartFormData.append(japaneseData, withName: "japanese", mimeType: "text/plain") + multipartFormData.append(emojiData, withName: "emoji", mimeType: "text/plain") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + let expectedString = ( + BoundaryGenerator.boundary(forBoundaryType: .initial, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"french\"\(crlf)\(crlf)" + + "français" + + BoundaryGenerator.boundary(forBoundaryType: .encapsulated, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"japanese\"\(crlf)" + + "Content-Type: text/plain\(crlf)\(crlf)" + + "日本語" + + BoundaryGenerator.boundary(forBoundaryType: .encapsulated, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"emoji\"\(crlf)" + + "Content-Type: text/plain\(crlf)\(crlf)" + + "😃👍🏻🍻🎉" + + BoundaryGenerator.boundary(forBoundaryType: .final, boundaryKey: boundary) + ) + let expectedData = Data(expectedString.utf8) + + XCTAssertEqual(encodedData, expectedData, "encoded data should match expected data") + } + } + + func testEncodingFileBodyPart() { + // Given + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + multipartFormData.append(unicornImageURL, withName: "unicorn") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + var expectedData = Data() + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: unicornImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(encodedData, expectedData, "data should match expected data") + } + } + + func testEncodingMultipleFileBodyParts() { + // Given + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + + multipartFormData.append(unicornImageURL, withName: "unicorn") + multipartFormData.append(rainbowImageURL, withName: "rainbow") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + var expectedData = Data() + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: unicornImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: rainbowImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(encodedData, expectedData, "data should match expected data") + } + } + + func testEncodingStreamBodyPart() { + // Given + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let unicornDataLength = UInt64((try! Data(contentsOf: unicornImageURL)).count) + let unicornStream = InputStream(url: unicornImageURL)! + + multipartFormData.append(unicornStream, + withLength: unicornDataLength, + name: "unicorn", + fileName: "unicorn.png", + mimeType: "image/png") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + var expectedData = Data() + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: unicornImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(encodedData, expectedData, "data should match expected data") + } + } + + func testEncodingMultipleStreamBodyParts() { + // Given + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let unicornDataLength = UInt64((try! Data(contentsOf: unicornImageURL)).count) + let unicornStream = InputStream(url: unicornImageURL)! + + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + let rainbowDataLength = UInt64((try! Data(contentsOf: rainbowImageURL)).count) + let rainbowStream = InputStream(url: rainbowImageURL)! + + multipartFormData.append(unicornStream, + withLength: unicornDataLength, + name: "unicorn", + fileName: "unicorn.png", + mimeType: "image/png") + multipartFormData.append(rainbowStream, + withLength: rainbowDataLength, + name: "rainbow", + fileName: "rainbow.jpg", + mimeType: "image/jpeg") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + var expectedData = Data() + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: unicornImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: rainbowImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(encodedData, expectedData, "data should match expected data") + } + } + + func testEncodingMultipleBodyPartsWithVaryingTypes() { + // Given + let multipartFormData = MultipartFormData() + + let loremData = Data("Lorem ipsum.".utf8) + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + let rainbowDataLength = UInt64((try! Data(contentsOf: rainbowImageURL)).count) + let rainbowStream = InputStream(url: rainbowImageURL)! + + multipartFormData.append(loremData, withName: "lorem") + multipartFormData.append(unicornImageURL, withName: "unicorn") + multipartFormData.append(rainbowStream, + withLength: rainbowDataLength, + name: "rainbow", + fileName: "rainbow.jpg", + mimeType: "image/jpeg") + + var encodedData: Data? + + // When + do { + encodedData = try multipartFormData.encode() + } catch { + // No-op + } + + // Then + XCTAssertNotNil(encodedData, "encoded data should not be nil") + + if let encodedData = encodedData { + let boundary = multipartFormData.boundary + + var expectedData = Data() + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedData.append(Data( + "Content-Disposition: form-data; name=\"lorem\"\(crlf)\(crlf)".utf8 + ) + ) + expectedData.append(loremData) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: unicornImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedData.append(try! Data(contentsOf: rainbowImageURL)) + expectedData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(encodedData, expectedData, "data should match expected data") + } + } +} + +// MARK: - + +final class MultipartFormDataWriteEncodedDataToDiskTestCase: BaseTestCase { + let crlf = EncodingCharacters.crlf + + func testWritingEncodedDataBodyPartToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let data = Data("Lorem ipsum dolor sit amet.".utf8) + multipartFormData.append(data, withName: "data") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + let expectedString = BoundaryGenerator.boundary(forBoundaryType: .initial, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"data\"\(crlf)\(crlf)" + + "Lorem ipsum dolor sit amet." + + BoundaryGenerator.boundary(forBoundaryType: .final, boundaryKey: boundary) + let expectedFileData = Data(expectedString.utf8) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingMultipleEncodedDataBodyPartsToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let frenchData = Data("français".utf8) + let japaneseData = Data("日本語".utf8) + let emojiData = Data("😃👍🏻🍻🎉".utf8) + + multipartFormData.append(frenchData, withName: "french") + multipartFormData.append(japaneseData, withName: "japanese") + multipartFormData.append(emojiData, withName: "emoji") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + let expectedString = ( + BoundaryGenerator.boundary(forBoundaryType: .initial, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"french\"\(crlf)\(crlf)" + + "français" + + BoundaryGenerator.boundary(forBoundaryType: .encapsulated, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"japanese\"\(crlf)\(crlf)" + + "日本語" + + BoundaryGenerator.boundary(forBoundaryType: .encapsulated, boundaryKey: boundary) + + "Content-Disposition: form-data; name=\"emoji\"\(crlf)\(crlf)" + + "😃👍🏻🍻🎉" + + BoundaryGenerator.boundary(forBoundaryType: .final, boundaryKey: boundary) + ) + let expectedFileData = Data(expectedString.utf8) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingEncodedFileBodyPartToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + multipartFormData.append(unicornImageURL, withName: "unicorn") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: unicornImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingMultipleEncodedFileBodyPartsToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + + multipartFormData.append(unicornImageURL, withName: "unicorn") + multipartFormData.append(rainbowImageURL, withName: "rainbow") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: unicornImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: rainbowImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingEncodedStreamBodyPartToDiskRespectingBodyLength() { + // Given + let destinationFileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let unicornImageData = try! Data(contentsOf: unicornImageURL) + let unicornDataLength = unicornImageData.count + + // Write only PART of the file + let expectedFileStreamUploadLength = UInt64(unicornDataLength / 2) + multipartFormData.append(InputStream(url: unicornImageURL)!, + withLength: expectedFileStreamUploadLength, + name: "unicorn", + fileName: "unicorn.png", + mimeType: "image/png") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: destinationFileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let destinationFileData = try? Data(contentsOf: destinationFileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + )) + expectedFileData.append(unicornImageData.prefix(Int(expectedFileStreamUploadLength))) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(destinationFileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingEncodedStreamBodyPartToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let unicornDataLength = UInt64((try! Data(contentsOf: unicornImageURL)).count) + let unicornStream = InputStream(url: unicornImageURL)! + + multipartFormData.append(unicornStream, + withLength: unicornDataLength, + name: "unicorn", + fileName: "unicorn.png", + mimeType: "image/png") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: unicornImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingMultipleEncodedStreamBodyPartsToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + let unicornDataLength = UInt64((try! Data(contentsOf: unicornImageURL)).count) + let unicornStream = InputStream(url: unicornImageURL)! + + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + let rainbowDataLength = UInt64((try! Data(contentsOf: rainbowImageURL)).count) + let rainbowStream = InputStream(url: rainbowImageURL)! + + multipartFormData.append(unicornStream, + withLength: unicornDataLength, + name: "unicorn", + fileName: "unicorn.png", + mimeType: "image/png") + multipartFormData.append(rainbowStream, + withLength: rainbowDataLength, + name: "rainbow", + fileName: "rainbow.jpg", + mimeType: "image/jpeg") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: unicornImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: rainbowImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } + + func testWritingMultipleEncodedBodyPartsWithVaryingTypesToDisk() { + // Given + let fileURL = temporaryFileURL + let multipartFormData = MultipartFormData() + + let loremData = Data("Lorem ipsum.".utf8) + + let unicornImageURL = url(forResource: "unicorn", withExtension: "png") + + let rainbowImageURL = url(forResource: "rainbow", withExtension: "jpg") + let rainbowDataLength = UInt64((try! Data(contentsOf: rainbowImageURL)).count) + let rainbowStream = InputStream(url: rainbowImageURL)! + + multipartFormData.append(loremData, withName: "lorem") + multipartFormData.append(unicornImageURL, withName: "unicorn") + multipartFormData.append(rainbowStream, + withLength: rainbowDataLength, + name: "rainbow", + fileName: "rainbow.jpg", + mimeType: "image/jpeg") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(encodingError, "encoding error should be nil") + + if let fileData = try? Data(contentsOf: fileURL) { + let boundary = multipartFormData.boundary + + var expectedFileData = Data() + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .initial, boundaryKey: boundary)) + expectedFileData.append(Data( + "Content-Disposition: form-data; name=\"lorem\"\(crlf)\(crlf)".utf8 + ) + ) + expectedFileData.append(loremData) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"unicorn\"; filename=\"unicorn.png\"\(crlf)" + + "Content-Type: image/png\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: unicornImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .encapsulated, boundaryKey: boundary)) + expectedFileData.append(Data(( + "Content-Disposition: form-data; name=\"rainbow\"; filename=\"rainbow.jpg\"\(crlf)" + + "Content-Type: image/jpeg\(crlf)\(crlf)").utf8 + ) + ) + expectedFileData.append(try! Data(contentsOf: rainbowImageURL)) + expectedFileData.append(BoundaryGenerator.boundaryData(boundaryType: .final, boundaryKey: boundary)) + + XCTAssertEqual(fileData, expectedFileData, "file data should match expected file data") + } else { + XCTFail("file data should not be nil") + } + } +} + +// MARK: - + +class MultipartFormDataFailureTestCase: BaseTestCase { + func testThatAppendingFileBodyPartWithInvalidLastPathComponentReturnsError() { + // Given + let fileURL = NSURL(string: "")! as URL + let multipartFormData = MultipartFormData() + multipartFormData.append(fileURL, withName: "empty_data") + + var encodingError: Error? + + // When + do { + _ = try multipartFormData.encode() + } catch { + encodingError = error + } + + // Then + XCTAssertNotNil(encodingError, "encoding error should not be nil") + + XCTAssertEqual(encodingError?.asAFError?.isBodyPartFilenameInvalid, true) + XCTAssertEqual(encodingError?.asAFError?.url, fileURL) + } + + func testThatAppendingFileBodyPartThatIsNotFileURLReturnsError() { + // Given + let fileURL = URL(string: "https://example.com/image.jpg")! + let multipartFormData = MultipartFormData() + multipartFormData.append(fileURL, withName: "empty_data") + + var encodingError: Error? + + // When + do { + _ = try multipartFormData.encode() + } catch { + encodingError = error + } + + // Then + XCTAssertNotNil(encodingError, "encoding error should not be nil") + XCTAssertEqual(encodingError?.asAFError?.isBodyPartURLInvalid, true) + XCTAssertEqual(encodingError?.asAFError?.url, fileURL) + } + + func testThatAppendingFileBodyPartThatIsNotReachableReturnsError() { + // Given + let filePath = (NSTemporaryDirectory() as NSString).appendingPathComponent("does_not_exist.jpg") + let fileURL = URL(fileURLWithPath: filePath) + let multipartFormData = MultipartFormData() + multipartFormData.append(fileURL, withName: "empty_data") + + var encodingError: Error? + + // When + do { + _ = try multipartFormData.encode() + } catch { + encodingError = error + } + + // Then + XCTAssertNotNil(encodingError, "encoding error should not be nil") + + XCTAssertEqual(encodingError?.asAFError?.isBodyPartFileNotReachableWithError, true) + XCTAssertEqual(encodingError?.asAFError?.url, fileURL) + } + + func testThatAppendingFileBodyPartThatIsDirectoryReturnsError() { + // Given + let directoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true) + let multipartFormData = MultipartFormData() + multipartFormData.append(directoryURL, withName: "empty_data", fileName: "empty", mimeType: "application/octet") + + var encodingError: Error? + + // When + do { + _ = try multipartFormData.encode() + } catch { + encodingError = error + } + + // Then + XCTAssertNotNil(encodingError, "encoding error should not be nil") + XCTAssertEqual(encodingError?.asAFError?.isBodyPartFileIsDirectory, true) + XCTAssertEqual(encodingError?.asAFError?.url, directoryURL) + } + + func testThatWritingEncodedDataToExistingFileURLFails() { + // Given + let fileURL = temporaryFileURL + + var writerError: Error? + + do { + try "dummy data".write(to: fileURL, atomically: true, encoding: .utf8) + } catch { + writerError = error + } + + let multipartFormData = MultipartFormData() + let data = Data("Lorem ipsum dolor sit amet.".utf8) + multipartFormData.append(data, withName: "data") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNil(writerError, "writer error should be nil") + XCTAssertNotNil(encodingError, "encoding error should not be nil") + XCTAssertEqual(encodingError?.asAFError?.isOutputStreamFileAlreadyExists, true) + } + + func testThatWritingEncodedDataToBadURLFails() { + // Given + let fileURL = URL(string: "/this/is/not/a/valid/url")! + + let multipartFormData = MultipartFormData() + let data = Data("Lorem ipsum dolor sit amet.".utf8) + multipartFormData.append(data, withName: "data") + + var encodingError: Error? + + // When + do { + try multipartFormData.writeEncodedData(to: fileURL) + } catch { + encodingError = error + } + + // Then + XCTAssertNotNil(encodingError, "encoding error should not be nil") + XCTAssertEqual(encodingError?.asAFError?.isOutputStreamURLInvalid, true) + } + + func testThatStreamBodyPartHasUnexpectedLength() { + // Given + let multipartFormData = MultipartFormData() + let data = Data("Lorem ipsum dolor sit amet.".utf8) + multipartFormData.append(data, withName: "data") + var firstError: Error? + var secondError: Error? + + // When + do { + _ = try multipartFormData.encode() + } catch { + firstError = error + } + + do { + _ = try multipartFormData.encode() + } catch { + secondError = error + } + + XCTAssertNil(firstError, "firstError should be nil") + XCTAssertNotNil(secondError, "secondError should not be nil") + XCTAssertEqual(secondError?.asAFError?.isInputStreamReadFailed, true) + XCTAssert(secondError?.asAFError?.underlyingError is AFError.UnexpectedInputStreamLength) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/NSLoggingEventMonitor.swift b/Carthage/Checkouts/Alamofire/Tests/NSLoggingEventMonitor.swift new file mode 100644 index 00000000..680a4893 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/NSLoggingEventMonitor.swift @@ -0,0 +1,222 @@ +// +// NSLoggingEventMonitor.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +public final class NSLoggingEventMonitor: EventMonitor { + public let queue = DispatchQueue(label: "org.alamofire.nsLoggingEventMonitorQueue", qos: .utility) + + public init() {} + + public func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) { + NSLog("%@", "URLSession: \(session), didBecomeInvalidWithError: \(error?.localizedDescription ?? "None")") + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge) { + NSLog("%@", "URLSession: \(session), task: \(task), didReceiveChallenge: \(challenge)") + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + didSendBodyData bytesSent: Int64, + totalBytesSent: Int64, + totalBytesExpectedToSend: Int64) { + NSLog("%@", "URLSession: \(session), task: \(task), didSendBodyData: \(bytesSent), totalBytesSent: \(totalBytesSent), totalBytesExpectedToSent: \(totalBytesExpectedToSend)") + } + + public func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask) { + NSLog("%@", "URLSession: \(session), taskNeedsNewBodyStream: \(task)") + } + + public func urlSession(_ session: URLSession, + task: URLSessionTask, + willPerformHTTPRedirection response: HTTPURLResponse, + newRequest request: URLRequest) { + NSLog("%@", "URLSession: \(session), task: \(task), willPerformHTTPRedirection: \(response), newRequest: \(request)") + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) { + NSLog("%@", "URLSession: \(session), task: \(task), didFinishCollecting: \(metrics)") + } + + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + NSLog("%@", "URLSession: \(session), task: \(task), didCompleteWithError: \(error?.localizedDescription ?? "None")") + } + + public func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) { + NSLog("%@", "URLSession: \(session), taskIsWaitingForConnectivity: \(task)") + } + + public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + NSLog("%@", "URLSession: \(session), dataTask: \(dataTask), didReceiveDataOfLength: \(data.count)") + } + + public func urlSession(_ session: URLSession, + dataTask: URLSessionDataTask, + willCacheResponse proposedResponse: CachedURLResponse) { + NSLog("%@", "URLSession: \(session), dataTask: \(dataTask), willCacheResponse: \(proposedResponse)") + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didResumeAtOffset fileOffset: Int64, + expectedTotalBytes: Int64) { + NSLog("%@", "URLSession: \(session), downloadTask: \(downloadTask), didResumeAtOffset: \(fileOffset), expectedTotalBytes: \(expectedTotalBytes)") + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didWriteData bytesWritten: Int64, + totalBytesWritten: Int64, + totalBytesExpectedToWrite: Int64) { + NSLog("%@", "URLSession: \(session), downloadTask: \(downloadTask), didWriteData bytesWritten: \(bytesWritten), totalBytesWritten: \(totalBytesWritten), totalBytesExpectedToWrite: \(totalBytesExpectedToWrite)") + } + + public func urlSession(_ session: URLSession, + downloadTask: URLSessionDownloadTask, + didFinishDownloadingTo location: URL) { + NSLog("%@", "URLSession: \(session), downloadTask: \(downloadTask), didFinishDownloadingTo: \(location)") + } + + public func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest) { + NSLog("%@", "Request: \(request) didCreateInitialURLRequest: \(urlRequest)") + } + + public func request(_ request: Request, didFailToCreateURLRequestWithError error: Error) { + NSLog("%@", "Request: \(request) didFailToCreateURLRequestWithError: \(error)") + } + + public func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest) { + NSLog("%@", "Request: \(request) didAdaptInitialRequest \(initialRequest) to \(adaptedRequest)") + } + + public func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: Error) { + NSLog("%@", "Request: \(request) didFailToAdaptURLRequest \(initialRequest) withError \(error)") + } + + public func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest) { + NSLog("%@", "Request: \(request) didCreateURLRequest: \(urlRequest)") + } + + public func request(_ request: Request, didCreateTask task: URLSessionTask) { + NSLog("%@", "Request: \(request) didCreateTask \(task)") + } + + public func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics) { + NSLog("%@", "Request: \(request) didGatherMetrics \(metrics)") + } + + public func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: Error) { + NSLog("%@", "Request: \(request) didFailTask \(task) earlyWithError \(error)") + } + + public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: Error?) { + NSLog("%@", "Request: \(request) didCompleteTask \(task) withError: \(error?.localizedDescription ?? "None")") + } + + public func requestDidFinish(_ request: Request) { + NSLog("%@", "Request: \(request) didFinish") + } + + public func requestDidResume(_ request: Request) { + NSLog("%@", "Request: \(request) didResume") + } + + public func request(_ request: Request, didResumeTask task: URLSessionTask) { + NSLog("%@", "Request: \(request) didResumeTask: \(task)") + } + + public func requestDidSuspend(_ request: Request) { + NSLog("%@", "Request: \(request) didSuspend") + } + + public func request(_ request: Request, didSuspendTask task: URLSessionTask) { + NSLog("%@", "Request: \(request) didSuspendTask: \(task)") + } + + public func requestDidCancel(_ request: Request) { + NSLog("%@", "Request: \(request) didCancel") + } + + public func request(_ request: Request, didCancelTask task: URLSessionTask) { + NSLog("%@", "Request: \(request) didCancelTask: \(task)") + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + NSLog("%@", "Request: \(request), didParseResponse: \(response)") + } + + public func request(_ request: DataRequest, didParseResponse response: DataResponse) { + NSLog("%@", "Request: \(request), didParseResponse: \(response)") + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + NSLog("%@", "Request: \(request), didParseResponse: \(response)") + } + + public func request(_ request: DownloadRequest, didParseResponse response: DownloadResponse) { + NSLog("%@", "Request: \(request), didParseResponse: \(response)") + } + + public func requestIsRetrying(_ request: Request) { + NSLog("%@", "Request: \(request), isRetrying") + } + + public func request(_ request: DataRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, data: Data?, withResult result: Request.ValidationResult) { + NSLog("%@", "Request: \(request), didValidateRequestWithResult: \(result)") + } + + public func request(_ request: DataStreamRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, withResult result: Request.ValidationResult) { + NSLog("%@", "Request: \(request), didValidateRequestWithResult: \(result)") + } + + public func request(_ request: DataStreamRequest, didParseStream result: Result) { + NSLog("%@", "Request: \(request), didParseStreamWithResult: \(result)") + } + + public func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable) { + NSLog("%@", "Request: \(request), didCreateUploadable: \(uploadable)") + } + + public func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: Error) { + NSLog("%@", "Request: \(request), didFailToCreateUploadableWithError: \(error)") + } + + public func request(_ request: UploadRequest, didProvideInputStream stream: InputStream) { + NSLog("%@", "Request: \(request), didProvideInputStream: \(stream)") + } + + public func request(_ request: DownloadRequest, didFinishDownloadingUsing task: URLSessionTask, with result: Result) { + NSLog("%@", "Request: \(request), didFinishDownloadingUsing: \(task), withResult: \(result)") + } + + public func request(_ request: DownloadRequest, didCreateDestinationURL url: URL) { + NSLog("%@", "Request: \(request), didCreateDestinationURL: \(url)") + } + + public func request(_ request: DownloadRequest, didValidateRequest urlRequest: URLRequest?, response: HTTPURLResponse, temporaryURL: URL?, destinationURL: URL?, withResult result: Request.ValidationResult) { + NSLog("%@", "Request: \(request), didValidateRequestWithResult: \(result)") + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/NetworkReachabilityManagerTests.swift b/Carthage/Checkouts/Alamofire/Tests/NetworkReachabilityManagerTests.swift new file mode 100644 index 00000000..4b3f8aa8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/NetworkReachabilityManagerTests.swift @@ -0,0 +1,303 @@ +// +// NetworkReachabilityManagerTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if canImport(SystemConfiguration) + +@testable import Alamofire +import Foundation +import SystemConfiguration +import XCTest + +final class NetworkReachabilityManagerTestCase: BaseTestCase { + // MARK: - Tests - Initialization + + func testThatManagerCanBeInitializedFromHost() { + // Given, When + let manager = NetworkReachabilityManager(host: "localhost") + + // Then + XCTAssertNotNil(manager) + } + + func testThatManagerCanBeInitializedFromAddress() { + // Given, When + let manager = NetworkReachabilityManager() + + // Then + XCTAssertNotNil(manager) + } + + func testThatHostManagerIsReachableOnWiFi() { + // Given, When + let manager = NetworkReachabilityManager(host: "localhost") + + // Then + XCTAssertEqual(manager?.status, .reachable(.ethernetOrWiFi)) + XCTAssertEqual(manager?.isReachable, true) + XCTAssertEqual(manager?.isReachableOnCellular, false) + XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true) + } + + func testThatHostManagerStartsWithReachableStatus() { + // Given, When + let manager = NetworkReachabilityManager(host: "localhost") + + // Then + XCTAssertEqual(manager?.status, .reachable(.ethernetOrWiFi)) + XCTAssertEqual(manager?.isReachable, true) + XCTAssertEqual(manager?.isReachableOnCellular, false) + XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true) + } + + func testThatAddressManagerStartsWithReachableStatus() { + // Given, When + let manager = NetworkReachabilityManager() + + // Then + XCTAssertEqual(manager?.status, .reachable(.ethernetOrWiFi)) + XCTAssertEqual(manager?.isReachable, true) + XCTAssertEqual(manager?.isReachableOnCellular, false) + XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true) + } + + func testThatZeroManagerCanBeProperlyRestarted() { + // Given + let manager = NetworkReachabilityManager() + let first = expectation(description: "first listener notified") + let second = expectation(description: "second listener notified") + + // When + manager?.startListening { _ in + first.fulfill() + } + wait(for: [first], timeout: timeout) + + manager?.stopListening() + + manager?.startListening { _ in + second.fulfill() + } + wait(for: [second], timeout: timeout) + + // Then + XCTAssertEqual(manager?.status, .reachable(.ethernetOrWiFi)) + } + + func testThatHostManagerCanBeProperlyRestarted() { + // Given + let manager = NetworkReachabilityManager(host: "localhost") + let first = expectation(description: "first listener notified") + let second = expectation(description: "second listener notified") + + // When + manager?.startListening { _ in + first.fulfill() + } + wait(for: [first], timeout: timeout) + + manager?.stopListening() + + manager?.startListening { _ in + second.fulfill() + } + wait(for: [second], timeout: timeout) + + // Then + XCTAssertEqual(manager?.status, .reachable(.ethernetOrWiFi)) + } + + func testThatHostManagerCanBeDeinitialized() { + // Given + let expect = expectation(description: "reachability queue should clear") + var manager: NetworkReachabilityManager? = NetworkReachabilityManager(host: "localhost") + weak var weakManager = manager + + // When + manager?.startListening(onUpdatePerforming: { _ in }) + manager?.stopListening() + manager?.reachabilityQueue.async { expect.fulfill() } + manager = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(manager, "strong reference should be nil") + XCTAssertNil(weakManager, "weak reference should be nil") + } + + func testThatAddressManagerCanBeDeinitialized() { + // Given + let expect = expectation(description: "reachability queue should clear") + var manager: NetworkReachabilityManager? = NetworkReachabilityManager() + weak var weakManager = manager + + // When + manager?.startListening(onUpdatePerforming: { _ in }) + manager?.stopListening() + manager?.reachabilityQueue.async { expect.fulfill() } + manager = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(manager, "strong reference should be nil") + XCTAssertNil(weakManager, "weak reference should be nil") + } + + // MARK: - Listener + + func testThatHostManagerIsNotifiedWhenStartListeningIsCalled() { + // Given + guard let manager = NetworkReachabilityManager(host: "store.apple.com") else { + XCTFail("manager should NOT be nil") + return + } + + let expectation = expectation(description: "listener closure should be executed") + var networkReachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus? + + // When + manager.startListening { status in + guard networkReachabilityStatus == nil else { return } + networkReachabilityStatus = status + expectation.fulfill() + } + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi)) + } + + func testThatAddressManagerIsNotifiedWhenStartListeningIsCalled() { + // Given + let manager = NetworkReachabilityManager() + let expectation = expectation(description: "listener closure should be executed") + + var networkReachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus? + + // When + manager?.startListening { status in + networkReachabilityStatus = status + expectation.fulfill() + } + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi)) + } + + // MARK: - NetworkReachabilityStatus + + func testThatStatusIsNotReachableStatusWhenReachableFlagIsAbsent() { + // Given + let flags: SCNetworkReachabilityFlags = [.connectionOnDemand] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .notReachable) + } + + func testThatStatusIsNotReachableStatusWhenConnectionIsRequired() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .notReachable) + } + + func testThatStatusIsNotReachableStatusWhenInterventionIsRequired() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .interventionRequired] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .notReachable) + } + + func testThatStatusIsReachableOnWiFiStatusWhenConnectionIsNotRequired() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .reachable(.ethernetOrWiFi)) + } + + func testThatStatusIsReachableOnWiFiStatusWhenConnectionIsOnDemand() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnDemand] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .reachable(.ethernetOrWiFi)) + } + + func testThatStatusIsReachableOnWiFiStatusWhenConnectionIsOnTraffic() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnTraffic] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .reachable(.ethernetOrWiFi)) + } + + #if os(iOS) || os(tvOS) + func testThatStatusIsReachableOnCellularStatusWhenIsWWAN() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .reachable(.cellular)) + } + + func testThatStatusIsNotReachableOnCellularStatusWhenIsWWANAndConnectionIsRequired() { + // Given + let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN, .connectionRequired] + + // When + let status = NetworkReachabilityManager.NetworkReachabilityStatus(flags) + + // Then + XCTAssertEqual(status, .notReachable) + } + #endif +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/ParameterEncoderTests.swift b/Carthage/Checkouts/Alamofire/Tests/ParameterEncoderTests.swift new file mode 100644 index 00000000..3cc9be6c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ParameterEncoderTests.swift @@ -0,0 +1,1247 @@ +// +// ParameterEncoderTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import XCTest + +final class JSONParameterEncoderTests: BaseTestCase { + func testThatDataIsProperlyEncodedAndProperContentTypeIsSet() throws { + // Given + let encoder = JSONParameterEncoder() + let request = Endpoint().urlRequest + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + XCTAssertEqual(newRequest.headers["Content-Type"], "application/json") + XCTAssertEqual(newRequest.httpBody?.asString, "{\"property\":\"property\"}") + } + + func testThatDataIsProperlyEncodedButContentTypeIsNotSetIfRequestAlreadyHasAContentType() throws { + // Given + let encoder = JSONParameterEncoder() + var request = Endpoint().urlRequest + request.headers.update(.contentType("type")) + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + XCTAssertEqual(newRequest.headers["Content-Type"], "type") + XCTAssertEqual(newRequest.httpBody?.asString, "{\"property\":\"property\"}") + } + + func testThatJSONEncoderCanBeCustomized() throws { + // Given + let jsonEncoder = JSONEncoder() + jsonEncoder.outputFormatting = .prettyPrinted + let encoder = JSONParameterEncoder(encoder: jsonEncoder) + let request = Endpoint().urlRequest + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + let expected = """ + { + "property" : "property" + } + """ + XCTAssertEqual(newRequest.httpBody?.asString, expected) + } + + func testThatJSONEncoderDefaultWorks() throws { + // Given + let encoder = JSONParameterEncoder.default + let request = Endpoint().urlRequest + + // When + let encoded = try encoder.encode(TestParameters.default, into: request) + + // Then + let expected = """ + {"property":"property"} + """ + XCTAssertEqual(encoded.httpBody?.asString, expected) + } + + func testThatJSONEncoderPrettyPrintedPrintsPretty() throws { + // Given + let encoder = JSONParameterEncoder.prettyPrinted + let request = Endpoint().urlRequest + + // When + let encoded = try encoder.encode(TestParameters.default, into: request) + + // Then + let expected = """ + { + "property" : "property" + } + """ + XCTAssertEqual(encoded.httpBody?.asString, expected) + } +} + +final class SortedKeysJSONParameterEncoderTests: BaseTestCase { + func testTestJSONEncoderSortedKeysHasSortedKeys() throws { + guard #available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *) else { return } + // Given + let encoder = JSONParameterEncoder.sortedKeys + let request = Endpoint().urlRequest + + // When + let encoded = try encoder.encode(["z": "z", "a": "a", "p": "p"], into: request) + + // Then + let expected = """ + {"a":"a","p":"p","z":"z"} + """ + XCTAssertEqual(encoded.httpBody?.asString, expected) + } +} + +final class URLEncodedFormParameterEncoderTests: BaseTestCase { + func testThatQueryIsBodyEncodedAndProperContentTypeIsSetForPOSTRequest() throws { + // Given + let encoder = URLEncodedFormParameterEncoder() + let request = Endpoint(method: .post).urlRequest + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + XCTAssertEqual(newRequest.headers["Content-Type"], "application/x-www-form-urlencoded; charset=utf-8") + XCTAssertEqual(newRequest.httpBody?.asString, "property=property") + } + + func testThatQueryIsBodyEncodedButContentTypeIsNotSetWhenRequestAlreadyHasContentType() throws { + // Given + let encoder = URLEncodedFormParameterEncoder() + var request = Endpoint(method: .post).urlRequest + request.headers.update(.contentType("type")) + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + XCTAssertEqual(newRequest.headers["Content-Type"], "type") + XCTAssertEqual(newRequest.httpBody?.asString, "property=property") + } + + func testThatEncoderCanBeCustomized() throws { + // Given + let urlEncoder = URLEncodedFormEncoder(boolEncoding: .literal) + let encoder = URLEncodedFormParameterEncoder(encoder: urlEncoder) + let request = Endpoint().urlRequest + + // When + let newRequest = try encoder.encode(["bool": true], into: request) + + // Then + let components = URLComponents(url: newRequest.url!, resolvingAgainstBaseURL: false) + XCTAssertEqual(components?.percentEncodedQuery, "bool=true") + } + + func testThatQueryIsInURLWhenDestinationIsURLAndMethodIsPOST() throws { + // Given + let encoder = URLEncodedFormParameterEncoder(destination: .queryString) + let request = Endpoint(method: .post).urlRequest + + // When + let newRequest = try encoder.encode(TestParameters.default, into: request) + + // Then + let components = URLComponents(url: newRequest.url!, resolvingAgainstBaseURL: false) + XCTAssertEqual(components?.percentEncodedQuery, "property=property") + } + + func testThatQueryIsNilWhenEncodableResultsInAnEmptyString() throws { + // Given + let encoder = URLEncodedFormParameterEncoder(destination: .queryString) + let request = Endpoint().urlRequest + + // When + let newRequest = try encoder.encode([String: String](), into: request) + + // Then + let components = URLComponents(url: newRequest.url!, resolvingAgainstBaseURL: false) + XCTAssertNil(components?.percentEncodedQuery) + } +} + +final class URLEncodedFormEncoderTests: BaseTestCase { + func testEncoderCanEncodeDictionary() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["a": "a"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=a") + } + + func testEncoderCanEncodeDecimal() { + // Given + let encoder = URLEncodedFormEncoder() + let decimal: Decimal = 1.0 + let parameters = ["a": decimal] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeDecimalWithHighPrecision() { + // Given + let encoder = URLEncodedFormEncoder() + let decimal: Decimal = 1.123456 + let parameters = ["a": decimal] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1.123456") + } + + func testEncoderCanEncodeDouble() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["a": 1.0] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1.0") + } + + func testEncoderCanEncodeFloat() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: Float] = ["a": 1.0] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1.0") + } + + func testEncoderCanEncodeInt8() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: Int8] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeInt16() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: Int16] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeInt32() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: Int32] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeInt64() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: Int64] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeUInt() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: UInt] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeUInt8() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: UInt8] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeUInt16() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: UInt16] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeUInt32() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: UInt32] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testEncoderCanEncodeUInt64() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: UInt64] = ["a": 1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=1") + } + + func testThatNestedDictionariesCanHaveBracketKeyPathsByDefault() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["a": ["b": "b"]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a%5Bb%5D=b") + } + + func testThatNestedDictionariesCanHaveExplicitBracketKeyPaths() { + // Given + let encoder = URLEncodedFormEncoder(keyPathEncoding: .brackets) + let parameters = ["a": ["b": "b"]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a%5Bb%5D=b") + } + + func testThatNestedDictionariesCanHaveDottedKeyPaths() { + // Given + let encoder = URLEncodedFormEncoder(keyPathEncoding: .dots) + let parameters = ["a": ["b": "b"]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a.b=b") + } + + func testThatNestedDictionariesCanHaveCustomKeyPaths() { + // Given + let encoder = URLEncodedFormEncoder(keyPathEncoding: .init { "-\($0)" }) + let parameters = ["a": ["b": "b"]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a-b=b") + } + + func testThatEncodableStructCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = EncodableStruct() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&four%5B%5D=1&four%5B%5D=2&four%5B%5D=3&one=one&seven%5Ba%5D=a&six%5Ba%5D%5Bb%5D=b&three=1&two=2" + XCTAssertEqual(result.success, expected) + } + + func testThatManuallyEncodableStructCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ManuallyEncodableStruct() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "root%5B%5D%5B%5D%5B%5D=1&root%5B%5D%5B%5D%5B%5D=2&root%5B%5D%5B%5D%5B%5D=3&root%5B%5D%5B%5D=1&root%5B%5D%5B%5D=2&root%5B%5D%5B%5D=3&root%5B%5D%5Ba%5D%5Bstring%5D=string" + XCTAssertEqual(result.success, expected) + } + + func testThatEncodableClassWithNoInheritanceCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = EncodableSuperclass() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "one=one&three=1&two=2") + } + + func testThatEncodableSubclassCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = EncodableSubclass() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&five%5Bb%5D=b&four%5B%5D=1&four%5B%5D=2&four%5B%5D=3&one=one&three=1&two=2" + XCTAssertEqual(result.success, expected) + } + + func testThatEncodableSubclassCanBeEncodedInImplementationOrderWhenAlphabetizeKeysIsFalse() { + // Given + let encoder = URLEncodedFormEncoder(alphabetizeKeyValuePairs: false) + let parameters = EncodableStruct() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "one=one&two=2&three=1&four%5B%5D=1&four%5B%5D=2&four%5B%5D=3&five%5Ba%5D=a&six%5Ba%5D%5Bb%5D=b&seven%5Ba%5D=a" + XCTAssertEqual(result.success, expected) + } + + func testThatManuallyEncodableSubclassCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ManuallyEncodableSubclass() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&five%5Bb%5D=b&four%5Bfive%5D=2&four%5Bfour%5D=one" + XCTAssertEqual(result.success, expected) + } + + func testThatARootArrayCannotBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = [1] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertFalse(result.isSuccess) + } + + func testThatARootValueCannotBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = "string" + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertFalse(result.isSuccess) + } + + func testThatEncodableSuperclassCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ["foo": [EncodableSuperclass()]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo%5B0%5D%5Bone%5D=one&foo%5B0%5D%5Bthree%5D=1&foo%5B0%5D%5Btwo%5D=2") + } + + func testThatEncodableSubclassCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = EncodableSubclass() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&five%5Bb%5D=b&four%5B0%5D=1&four%5B1%5D=2&four%5B2%5D=3&one=one&three=1&two=2" + XCTAssertEqual(result.success, expected) + } + + func testThatManuallyEncodableSubclassCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ManuallyEncodableSubclass() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&five%5Bb%5D=b&four%5Bfive%5D=2&four%5Bfour%5D=one" + XCTAssertEqual(result.success, expected) + } + + func testThatEncodableStructCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = EncodableStruct() + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "five%5Ba%5D=a&four%5B0%5D=1&four%5B1%5D=2&four%5B2%5D=3&one=one&seven%5Ba%5D=a&six%5Ba%5D%5Bb%5D=b&three=1&two=2" + XCTAssertEqual(result.success, expected) + } + + func testThatManuallyEncodableStructCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ManuallyEncodableStruct() + + // When + let result = Result { try encoder.encode(parameters) } + + // then + let expected = "root%5B0%5D%5B0%5D=1&root%5B0%5D%5B1%5D=2&root%5B0%5D%5B2%5D=3&root%5B1%5D%5Ba%5D%5Bstring%5D=string&root%5B2%5D%5B0%5D%5B0%5D=1&root%5B2%5D%5B0%5D%5B1%5D=2&root%5B2%5D%5B0%5D%5B2%5D=3" + XCTAssertEqual(result.success, expected) + } + + func testThatArrayNestedDictionaryIntValueCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ["foo": [["bar": 2], ["qux": 3], ["quy": 4]]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo%5B0%5D%5Bbar%5D=2&foo%5B1%5D%5Bqux%5D=3&foo%5B2%5D%5Bquy%5D=4") + } + + func testThatArrayNestedDictionaryStringValueCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ["foo": [["bar": "2"], ["qux": "3"], ["quy": "4"]]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo%5B0%5D%5Bbar%5D=2&foo%5B1%5D%5Bqux%5D=3&foo%5B2%5D%5Bquy%5D=4") + } + + func testThatArrayNestedDictionaryBoolValueCanBeEncodedWithIndexInBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .indexInBrackets) + let parameters = ["foo": [["bar": true], ["qux": false], ["quy": true]]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo%5B0%5D%5Bbar%5D=1&foo%5B1%5D%5Bqux%5D=0&foo%5B2%5D%5Bquy%5D=1") + } + + func testThatArraysCanBeEncodedWithoutBrackets() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .noBrackets) + let parameters = ["array": [1, 2]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "array=1&array=2") + } + + func testThatArraysCanBeEncodedWithCustomClosure() { + // Given + let encoder = URLEncodedFormEncoder(arrayEncoding: .custom { key, index in + "\(key).\(index + 1)" + }) + let parameters = ["array": [1, 2]] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "array.1=1&array.2=2") + } + + func testThatBoolsCanBeLiteralEncoded() { + // Given + let encoder = URLEncodedFormEncoder(boolEncoding: .literal) + let parameters = ["bool": true] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "bool=true") + } + + func testThatDataCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["data": Data("data".utf8)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "data=ZGF0YQ%3D%3D") + } + + func testThatCustomDataEncodingFailsWhenErrorIsThrown() { + // Given + struct DataEncodingError: Error {} + + let encoder = URLEncodedFormEncoder(dataEncoding: .custom { _ in throw DataEncodingError() }) + let parameters = ["data": Data("data".utf8)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is DataEncodingError) + } + + func testThatDatesCanBeEncoded() { + // Given + let encoder = URLEncodedFormEncoder(dateEncoding: .deferredToDate) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=123.456") + } + + func testThatDatesCanBeEncodedAsSecondsSince1970() { + // Given + let encoder = URLEncodedFormEncoder(dateEncoding: .secondsSince1970) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=978307323.456") + } + + func testThatDatesCanBeEncodedAsMillisecondsSince1970() { + // Given + let encoder = URLEncodedFormEncoder(dateEncoding: .millisecondsSince1970) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=978307323456.0") + } + + func testThatDatesCanBeEncodedAsISO8601Formatted() { + // Given + let encoder = URLEncodedFormEncoder(dateEncoding: .iso8601) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=2001-01-01T00%3A02%3A03Z") + } + + func testThatDatesCanBeEncodedAsFormatted() { + // Given + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss.SSSS" + dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) + + let encoder = URLEncodedFormEncoder(dateEncoding: .formatted(dateFormatter)) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=2001-01-01%2000%3A02%3A03.4560") + } + + func testThatDatesCanBeEncodedAsCustomFormatted() { + // Given + let encoder = URLEncodedFormEncoder(dateEncoding: .custom { "\($0.timeIntervalSinceReferenceDate)" }) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "date=123.456") + } + + func testEncoderThrowsErrorWhenCustomDateEncodingFails() { + // Given + struct DateEncodingError: Error {} + + let encoder = URLEncodedFormEncoder(dateEncoding: .custom { _ in throw DateEncodingError() }) + let parameters = ["date": Date(timeIntervalSinceReferenceDate: 123.456)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is DateEncodingError) + } + + func testThatKeysCanBeEncodedIntoSnakeCase() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .convertToSnakeCase) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "one_two_three=oneTwoThree") + } + + func testThatKeysCanBeEncodedIntoKebabCase() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .convertToKebabCase) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "one-two-three=oneTwoThree") + } + + func testThatKeysCanBeEncodedIntoACapitalizedString() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .capitalized) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "OneTwoThree=oneTwoThree") + } + + func testThatKeysCanBeEncodedIntoALowercasedString() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .lowercased) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "onetwothree=oneTwoThree") + } + + func testThatKeysCanBeEncodedIntoAnUppercasedString() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .uppercased) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "ONETWOTHREE=oneTwoThree") + } + + func testThatKeysCanBeCustomEncoded() { + // Given + let encoder = URLEncodedFormEncoder(keyEncoding: .custom { _ in "A" }) + let parameters = ["oneTwoThree": "oneTwoThree"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "A=oneTwoThree") + } + + func testThatNilCanBeEncodedByDroppingTheKeyByDefault() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters: [String: String?] = ["a": nil] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "") + } + + func testThatNilCanBeEncodedInSynthesizedEncodableByDroppingTheKeyByDefault() { + // Given + let encoder = URLEncodedFormEncoder() + + // When + let result = Result { try encoder.encode(OptionalEncodableStruct()) } + + // Then + XCTAssertEqual(result.success, "one=one") + } + + func testThatNilCanBeEncodedAsNull() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .null) + let parameters: [String: String?] = ["a": nil] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=null") + } + + func testThatNilCanBeEncodedInSynthesizedEncodableAsNull() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .null) + + // When + let result = Result { try encoder.encode(OptionalEncodableStruct()) } + + // Then + XCTAssertEqual(result.success, "one=one&two=null") + } + + func testThatNilCanBeEncodedByDroppingTheKey() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .dropKey) + let parameters: [String: String?] = ["a": nil] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "") + } + + func testThatNilCanBeEncodedInSynthesizedEncodableByDroppingTheKey() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .dropKey) + + // When + let result = Result { try encoder.encode(OptionalEncodableStruct()) } + + // Then + XCTAssertEqual(result.success, "one=one") + } + + func testThatNilCanBeEncodedByDroppingTheValue() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .dropValue) + let parameters: [String: String?] = ["a": nil] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "a=") + } + + func testThatNilCanBeEncodedInSynthesizedEncodableByDroppingTheValue() { + // Given + let encoder = URLEncodedFormEncoder(nilEncoding: .dropValue) + + // When + let result = Result { try encoder.encode(OptionalEncodableStruct()) } + + // Then + XCTAssertEqual(result.success, "one=one&two=") + } + + func testThatSpacesCanBeEncodedAsPluses() { + // Given + let encoder = URLEncodedFormEncoder(spaceEncoding: .plusReplaced) + let parameters = ["spaces": "replace with spaces"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "spaces=replace+with+spaces") + } + + func testThatEscapedCharactersCanBeCustomized() { + // Given + var allowed = CharacterSet.afURLQueryAllowed + allowed.remove(charactersIn: "?/") + let encoder = URLEncodedFormEncoder(allowedCharacters: allowed) + let parameters = ["allowed": "?/"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "allowed=%3F%2F") + } + + func testThatUnreservedCharactersAreNotPercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["lowercase": "abcdefghijklmnopqrstuvwxyz", + "numbers": "0123456789", + "uppercase": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expected = "lowercase=abcdefghijklmnopqrstuvwxyz&numbers=0123456789&uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ" + XCTAssertEqual(result.success, expected) + } + + func testThatReservedCharactersArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let generalDelimiters = ":#[]@" + let subDelimiters = "!$&'()*+,;=" + let parameters = ["reserved": "\(generalDelimiters)\(subDelimiters)"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "reserved=%3A%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D") + } + + func testThatIllegalASCIICharactersArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["illegal": " \"#%<>[]\\^`{}|"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "illegal=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7C") + } + + func testThatAmpersandsInKeysAndValuesArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["foo&bar": "baz&qux", "foobar": "bazqux"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo%26bar=baz%26qux&foobar=bazqux") + } + + func testThatQuestionMarksInKeysAndValuesAreNotPercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["?foo?": "?bar?"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "?foo?=?bar?") + } + + func testThatSlashesInKeysAndValuesAreNotPercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["foo": "/bar/baz/qux"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "foo=/bar/baz/qux") + } + + func testThatSpacesInKeysAndValuesArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = [" foo ": " bar "] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "%20foo%20=%20bar%20") + } + + func testThatPlusesInKeysAndValuesArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["+foo+": "+bar+"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "%2Bfoo%2B=%2Bbar%2B") + } + + func testThatPercentsInKeysAndValuesArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["percent%": "%25"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + XCTAssertEqual(result.success, "percent%25=%2525") + } + + func testThatNonLatinCharactersArePercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let parameters = ["french": "français", + "japanese": "日本語", + "arabic": "العربية", + "emoji": "😃"] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let expectedParameterValues = ["arabic=%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9", + "emoji=%F0%9F%98%83", + "french=fran%C3%A7ais", + "japanese=%E6%97%A5%E6%9C%AC%E8%AA%9E"].joined(separator: "&") + XCTAssertEqual(result.success, expectedParameterValues) + } + + func testStringWithThousandsOfChineseCharactersIsPercentEscaped() { + // Given + let encoder = URLEncodedFormEncoder() + let repeatedCount = 2000 + let parameters = ["chinese": String(repeating: "一二三四五六七八九十", count: repeatedCount)] + + // When + let result = Result { try encoder.encode(parameters) } + + // Then + let escaped = String(repeating: "%E4%B8%80%E4%BA%8C%E4%B8%89%E5%9B%9B%E4%BA%94%E5%85%AD%E4%B8%83%E5%85%AB%E4%B9%9D%E5%8D%81", + count: repeatedCount) + let expected = "chinese=\(escaped)" + XCTAssertEqual(result.success, expected) + } +} + +final class StaticParameterEncoderInstanceTests: BaseTestCase { + func takeParameterEncoder(_ parameterEncoder: ParameterEncoder) { + _ = parameterEncoder + } + + func testThatJSONParameterEncoderCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeParameterEncoder(.json()) + } + + func testThatURLEncodedFormParameterEncoderCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeParameterEncoder(.urlEncodedForm()) + } +} + +private struct EncodableStruct: Encodable { + let one = "one" + let two = 2 + let three = true + let four = [1, 2, 3] + let five = ["a": "a"] + let six = ["a": ["b": "b"]] + let seven = NestedEncodableStruct() +} + +private struct NestedEncodableStruct: Encodable { + let a = "a" +} + +private struct OptionalEncodableStruct: Encodable { + let one = "one" + let two: String? = nil +} + +private class EncodableSuperclass: Encodable { + let one = "one" + let two = 2 + let three = true +} + +private final class EncodableSubclass: EncodableSuperclass { + let four = [1, 2, 3] + let five = ["a": "a", "b": "b"] + + private enum CodingKeys: String, CodingKey { + case four, five + } + + override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) + + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(four, forKey: .four) + try container.encode(five, forKey: .five) + } +} + +private final class ManuallyEncodableSubclass: EncodableSuperclass { + let four = [1, 2, 3] + let five = ["a": "a", "b": "b"] + + private enum CodingKeys: String, CodingKey { + case four, five + } + + override func encode(to encoder: Encoder) throws { + var keyedContainer = encoder.container(keyedBy: CodingKeys.self) + + try keyedContainer.encode(four, forKey: .four) + try keyedContainer.encode(five, forKey: .five) + + let superEncoder = keyedContainer.superEncoder() + var superContainer = superEncoder.container(keyedBy: CodingKeys.self) + try superContainer.encode(one, forKey: .four) + + let keyedSuperEncoder = keyedContainer.superEncoder(forKey: .four) + var superKeyedContainer = keyedSuperEncoder.container(keyedBy: CodingKeys.self) + try superKeyedContainer.encode(two, forKey: .five) + + var unkeyedContainer = keyedContainer.nestedUnkeyedContainer(forKey: .four) + let unkeyedSuperEncoder = unkeyedContainer.superEncoder() + var keyedUnkeyedSuperContainer = unkeyedSuperEncoder.container(keyedBy: CodingKeys.self) + try keyedUnkeyedSuperContainer.encode(one, forKey: .four) + } +} + +private struct ManuallyEncodableStruct: Encodable { + let a = ["string": "string"] + let b = [1, 2, 3] + + private enum RootKey: String, CodingKey { + case root + } + + private enum TypeKeys: String, CodingKey { + case a, b + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: RootKey.self) + + var nestedKeyedContainer = container.nestedContainer(keyedBy: TypeKeys.self, forKey: .root) + try nestedKeyedContainer.encode(a, forKey: .a) + + var nestedUnkeyedContainer = container.nestedUnkeyedContainer(forKey: .root) + try nestedUnkeyedContainer.encode(b) + + var nestedUnkeyedKeyedContainer = nestedUnkeyedContainer.nestedContainer(keyedBy: TypeKeys.self) + try nestedUnkeyedKeyedContainer.encode(a, forKey: .a) + + var nestedUnkeyedUnkeyedContainer = nestedUnkeyedContainer.nestedUnkeyedContainer() + try nestedUnkeyedUnkeyedContainer.encode(b) + } +} + +private struct FailingOptionalStruct: Encodable { + enum TestedContainer { + case keyed, unkeyed + } + + enum CodingKeys: String, CodingKey { case a } + + let testedContainer: TestedContainer + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + switch testedContainer { + case .keyed: + var nested = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .a) + try nested.encodeNil(forKey: .a) + case .unkeyed: + var nested = container.nestedUnkeyedContainer(forKey: .a) + try nested.encodeNil() + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/ParameterEncodingTests.swift b/Carthage/Checkouts/Alamofire/Tests/ParameterEncodingTests.swift new file mode 100644 index 00000000..56231a02 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ParameterEncodingTests.swift @@ -0,0 +1,625 @@ +// +// ParameterEncodingTests.swift +// +// Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +class ParameterEncodingTestCase: BaseTestCase { + let urlRequest = Endpoint().urlRequest +} + +// MARK: - + +final class URLParameterEncodingTestCase: ParameterEncodingTestCase { + // MARK: Properties + + let encoding = URLEncoding.default + + // MARK: Tests - Parameter Types + + func testURLParameterEncodeNilParameters() throws { + // Given, When + let urlRequest = try encoding.encode(urlRequest, with: nil) + + // Then + XCTAssertNil(urlRequest.url?.query) + } + + func testURLParameterEncodeEmptyDictionaryParameter() throws { + // Given + let parameters: [String: Any] = [:] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertNil(urlRequest.url?.query) + } + + func testURLParameterEncodeOneStringKeyStringValueParameter() throws { + // Given + let parameters = ["foo": "bar"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=bar") + } + + func testURLParameterEncodeOneStringKeyStringValueParameterAppendedToQuery() throws { + // Given + var mutableURLRequest = urlRequest + var urlComponents = URLComponents(url: mutableURLRequest.url!, resolvingAgainstBaseURL: false)! + urlComponents.query = "baz=qux" + mutableURLRequest.url = urlComponents.url + + let parameters = ["foo": "bar"] + + // When + let urlRequest = try encoding.encode(mutableURLRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "baz=qux&foo=bar") + } + + func testURLParameterEncodeTwoStringKeyStringValueParameters() throws { + // Given + let parameters = ["foo": "bar", "baz": "qux"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "baz=qux&foo=bar") + } + + func testURLParameterEncodeStringKeyNSNumberIntegerValueParameter() throws { + // Given + let parameters = ["foo": NSNumber(value: 25)] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=25") + } + + func testURLParameterEncodeStringKeyNSNumberBoolValueParameter() throws { + // Given + let parameters = ["foo": NSNumber(value: false)] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=0") + } + + func testURLParameterEncodeStringKeyIntegerValueParameter() throws { + // Given + let parameters = ["foo": 1] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=1") + } + + func testURLParameterEncodeStringKeyDoubleValueParameter() throws { + // Given + let parameters = ["foo": 1.1] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=1.1") + } + + func testURLParameterEncodeStringKeyBoolValueParameter() throws { + // Given + let parameters = ["foo": true] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=1") + } + + func testURLParameterEncodeStringKeyArrayValueParameter() throws { + // Given + let parameters = ["foo": ["a", 1, true]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo%5B%5D=a&foo%5B%5D=1&foo%5B%5D=1") + } + + func testURLParameterEncodeArrayNestedDictionaryValueParameterWithIndex() throws { + // Given + let encoding = URLEncoding(arrayEncoding: .indexInBrackets) + let parameters = ["foo": ["a", 1, true, ["bar": 2], ["qux": 3], ["quy": ["quz": 3]]]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo%5B0%5D=a&foo%5B1%5D=1&foo%5B2%5D=1&foo%5B3%5D%5Bbar%5D=2&foo%5B4%5D%5Bqux%5D=3&foo%5B5%5D%5Bquy%5D%5Bquz%5D=3") + } + + func testURLParameterEncodeStringKeyArrayValueParameterWithoutBrackets() throws { + // Given + let encoding = URLEncoding(arrayEncoding: .noBrackets) + let parameters = ["foo": ["a", 1, true]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=a&foo=1&foo=1") + } + + func testURLParameterEncodeStringKeyArrayValueParameterWithCustomClosure() throws { + // Given + let encoding = URLEncoding(arrayEncoding: .custom { key, index in + "\(key).\(index + 1)" + }) + let parameters = ["foo": ["a", 1, true]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo.1=a&foo.2=1&foo.3=1") + } + + func testURLParameterEncodeStringKeyDictionaryValueParameter() throws { + // Given + let parameters = ["foo": ["bar": 1]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D=1") + } + + func testURLParameterEncodeStringKeyNestedDictionaryValueParameter() throws { + // Given + let parameters = ["foo": ["bar": ["baz": 1]]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo%5Bbar%5D%5Bbaz%5D=1") + } + + func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameter() throws { + // Given + let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + let expectedQuery = "foo%5Bbar%5D%5Bbaz%5D%5B%5D=a&foo%5Bbar%5D%5Bbaz%5D%5B%5D=1&foo%5Bbar%5D%5Bbaz%5D%5B%5D=1" + XCTAssertEqual(urlRequest.url?.query, expectedQuery) + } + + func testURLParameterEncodeStringKeyNestedDictionaryArrayValueParameterWithoutBrackets() throws { + // Given + let encoding = URLEncoding(arrayEncoding: .noBrackets) + let parameters = ["foo": ["bar": ["baz": ["a", 1, true]]]] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + let expectedQuery = "foo%5Bbar%5D%5Bbaz%5D=a&foo%5Bbar%5D%5Bbaz%5D=1&foo%5Bbar%5D%5Bbaz%5D=1" + XCTAssertEqual(urlRequest.url?.query, expectedQuery) + } + + func testURLParameterLiteralBoolEncodingWorksAndDoesNotAffectNumbers() throws { + // Given + let encoding = URLEncoding(boolEncoding: .literal) + let parameters: [String: Any] = [ // Must still encode to numbers + "a": 1, + "b": 0, + "c": 1.0, + "d": 0.0, + "e": NSNumber(value: 1), + "f": NSNumber(value: 0), + "g": NSNumber(value: 1.0), + "h": NSNumber(value: 0.0), + + // Must encode to literals + "i": true, + "j": false, + "k": NSNumber(value: true), + "l": NSNumber(value: false) + ] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "a=1&b=0&c=1&d=0&e=1&f=0&g=1&h=0&i=true&j=false&k=true&l=false") + } + + // MARK: Tests - All Reserved / Unreserved / Illegal Characters According to RFC 3986 + + func testThatReservedCharactersArePercentEscapedMinusQuestionMarkAndForwardSlash() throws { + // Given + let generalDelimiters = ":#[]@" + let subDelimiters = "!$&'()*+,;=" + let parameters = ["reserved": "\(generalDelimiters)\(subDelimiters)"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + let expectedQuery = "reserved=%3A%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D" + XCTAssertEqual(urlRequest.url?.query, expectedQuery) + } + + func testThatReservedCharactersQuestionMarkAndForwardSlashAreNotPercentEscaped() throws { + // Given + let parameters = ["reserved": "?/"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "reserved=?/") + } + + func testThatUnreservedNumericCharactersAreNotPercentEscaped() throws { + // Given + let parameters = ["numbers": "0123456789"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "numbers=0123456789") + } + + func testThatUnreservedLowercaseCharactersAreNotPercentEscaped() throws { + // Given + let parameters = ["lowercase": "abcdefghijklmnopqrstuvwxyz"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "lowercase=abcdefghijklmnopqrstuvwxyz") + } + + func testThatUnreservedUppercaseCharactersAreNotPercentEscaped() throws { + // Given + let parameters = ["uppercase": "ABCDEFGHIJKLMNOPQRSTUVWXYZ"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "uppercase=ABCDEFGHIJKLMNOPQRSTUVWXYZ") + } + + func testThatIllegalASCIICharactersArePercentEscaped() throws { + // Given + let parameters = ["illegal": " \"#%<>[]\\^`{}|"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + let expectedQuery = "illegal=%20%22%23%25%3C%3E%5B%5D%5C%5E%60%7B%7D%7C" + XCTAssertEqual(urlRequest.url?.query, expectedQuery) + } + + // MARK: Tests - Special Character Queries + + func testURLParameterEncodeStringWithAmpersandKeyStringWithAmpersandValueParameter() throws { + // Given + let parameters = ["foo&bar": "baz&qux", "foobar": "bazqux"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo%26bar=baz%26qux&foobar=bazqux") + } + + func testURLParameterEncodeStringWithQuestionMarkKeyStringWithQuestionMarkValueParameter() throws { + // Given + let parameters = ["?foo?": "?bar?"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "?foo?=?bar?") + } + + func testURLParameterEncodeStringWithSlashKeyStringWithQuestionMarkValueParameter() throws { + // Given + let parameters = ["foo": "/bar/baz/qux"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "foo=/bar/baz/qux") + } + + func testURLParameterEncodeStringWithSpaceKeyStringWithSpaceValueParameter() throws { + // Given + let parameters = [" foo ": " bar "] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "%20foo%20=%20bar%20") + } + + func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameter() throws { + // Given + let parameters = ["+foo+": "+bar+"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "%2Bfoo%2B=%2Bbar%2B") + } + + func testURLParameterEncodeStringKeyPercentEncodedStringValueParameter() throws { + // Given + let parameters = ["percent": "%25"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "percent=%2525") + } + + func testURLParameterEncodeStringKeyNonLatinStringValueParameter() throws { + // Given + let parameters = ["french": "français", + "japanese": "日本語", + "arabic": "العربية", + "emoji": "😃"] + + // When + let urlRequest = try encoding.encode(urlRequest, with: parameters) + + // Then + let expectedParameterValues = ["arabic=%D8%A7%D9%84%D8%B9%D8%B1%D8%A8%D9%8A%D8%A9", + "emoji=%F0%9F%98%83", + "french=fran%C3%A7ais", + "japanese=%E6%97%A5%E6%9C%AC%E8%AA%9E"] + + let expectedQuery = expectedParameterValues.joined(separator: "&") + XCTAssertEqual(urlRequest.url?.query, expectedQuery) + } + + func testURLParameterEncodeStringForRequestWithPrecomposedQuery() throws { + // Given + let url = URL(string: "https://example.com/movies?hd=[1]")! + let parameters = ["page": "0"] + + // When + let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&page=0") + } + + func testURLParameterEncodeStringWithPlusKeyStringWithPlusValueParameterForRequestWithPrecomposedQuery() throws { + // Given + let url = URL(string: "https://example.com/movie?hd=[1]")! + let parameters = ["+foo+": "+bar+"] + + // When + let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters) + + // Then + XCTAssertEqual(urlRequest.url?.query, "hd=%5B1%5D&%2Bfoo%2B=%2Bbar%2B") + } + + func testURLParameterEncodeStringWithThousandsOfChineseCharacters() throws { + // Given + let repeatedCount = 2000 + let url = URL(string: "https://example.com/movies")! + let parameters = ["chinese": String(repeating: "一二三四五六七八九十", count: repeatedCount)] + + // When + let urlRequest = try encoding.encode(URLRequest(url: url), with: parameters) + + // Then + var expected = "chinese=" + + for _ in 0..(initialValue) + + // When + DispatchQueue.concurrentPerform(iterations: 10_000) { i in + _ = protected.read { $0 } + protected.write("\(i)") + } + + // Then + XCTAssertNotEqual(protected.read { $0 }, initialValue) + } + + func testThatProtectedAPIIsSafe() { + // Given + let initialValue = "value" + let protected = Protected(initialValue) + + // When + DispatchQueue.concurrentPerform(iterations: 10_000) { i in + _ = protected.read { $0 } + protected.write("\(i)") + } + + // Then + XCTAssertNotEqual(protected.read { $0 }, initialValue) + } +} + +final class ProtectedWrapperTests: BaseTestCase { + let value = Protected("value") + + override func setUp() { + super.setUp() + + value.write("value") + } + + func testThatWrappedValuesAreAccessedSafely() { + // Given + let initialValue = value.read { $0 } + + // When + DispatchQueue.concurrentPerform(iterations: 10_000) { i in + _ = value.read { $0 } + value.write("\(i)") + } + + // Then + XCTAssertNotEqual(value.read { $0 }, initialValue) + } + + func testThatDynamicMembersAreSetSafely() { + // Given + struct Mutable { var value = "value" } + let mutable = Protected(.init()) + + // When + DispatchQueue.concurrentPerform(iterations: 10_000) { i in + mutable.value = "\(i)" + } + + // Then + XCTAssertNotEqual(mutable.value, "value") + } +} + +final class ProtectedHighContentionTests: BaseTestCase { + final class StringContainer { + var totalStrings: Int = 10 + var stringArray = ["this", "is", "a", "simple", "set", "of", "test", "strings", "to", "use"] + } + + struct StringContainerWriteState { + var results: [Int] = [] + var completedWrites = 0 + + var queue1Complete = false + var queue2Complete = false + } + + struct StringContainerReadState { + var results1: [Int] = [] + var results2: [Int] = [] + + var queue1Complete = false + var queue2Complete = false + } + + // MARK: - Properties + + let stringContainer = Protected(StringContainer()) + let stringContainerWrite = Protected(StringContainerWriteState()) + let stringContainerRead = Protected(StringContainerReadState()) + + func testConcurrentReadWriteBlocks() { + // Given + let totalWrites = 4000 + let totalReads = 10_000 + + let writeExpectation = expectation(description: "all parallel writes should complete before timeout") + let readExpectation = expectation(description: "all parallel reads should complete before timeout") + + var writerQueueResults: [Int] = [] + var completedWritesCount = 0 + + var readerQueueResults1: [Int] = [] + var readerQueueResults2: [Int] = [] + + // When + executeWriteOperationsInParallel(totalOperationsToExecute: totalWrites) { results, completedOperationCount in + writerQueueResults = results + completedWritesCount = completedOperationCount + writeExpectation.fulfill() + } + + executeReadOperationsInParallel(totalOperationsToExecute: totalReads) { results1, results2 in + readerQueueResults1 = results1 + readerQueueResults2 = results2 + readExpectation.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + + // Then + XCTAssertEqual(readerQueueResults1.count, totalReads) + XCTAssertEqual(readerQueueResults2.count, totalReads) + XCTAssertEqual(writerQueueResults.count, totalWrites) + XCTAssertEqual(completedWritesCount, totalWrites) + + readerQueueResults1.forEach { XCTAssertEqual($0, 10) } + readerQueueResults2.forEach { XCTAssertEqual($0, 10) } + writerQueueResults.forEach { XCTAssertEqual($0, 10) } + } + + private func executeWriteOperationsInParallel(totalOperationsToExecute totalOperations: Int, + completion: @escaping ([Int], Int) -> Void) { + let queue1 = DispatchQueue(label: "com.alamofire.testWriterQueue1") + let queue2 = DispatchQueue(label: "com.alamofire.testWriterQueue2") + + for _ in 1...totalOperations { + queue1.async { + // Moves the last string element to the beginning of the string array + let result: Int = self.stringContainer.write { stringContainer in + let lastElement = stringContainer.stringArray.removeLast() + stringContainer.totalStrings = stringContainer.stringArray.count + + stringContainer.stringArray.insert(lastElement, at: 0) + stringContainer.totalStrings = stringContainer.stringArray.count + + return stringContainer.totalStrings + } + + self.stringContainerWrite.write { mutableState in + mutableState.results.append(result) + + if mutableState.results.count == totalOperations { + mutableState.queue1Complete = true + + if mutableState.queue2Complete { + completion(mutableState.results, mutableState.completedWrites) + } + } + } + } + + queue2.async { + // Moves the first string element to the end of the string array + self.stringContainer.write { stringContainer in + let firstElement = stringContainer.stringArray.remove(at: 0) + stringContainer.totalStrings = stringContainer.stringArray.count + + stringContainer.stringArray.append(firstElement) + stringContainer.totalStrings = stringContainer.stringArray.count + } + + self.stringContainerWrite.write { mutableState in + mutableState.completedWrites += 1 + + if mutableState.completedWrites == totalOperations { + mutableState.queue2Complete = true + + if mutableState.queue1Complete { + completion(mutableState.results, mutableState.completedWrites) + } + } + } + } + } + } + + private func executeReadOperationsInParallel(totalOperationsToExecute totalOperations: Int, + completion: @escaping ([Int], [Int]) -> Void) { + let queue1 = DispatchQueue(label: "com.alamofire.testReaderQueue1") + let queue2 = DispatchQueue(label: "com.alamofire.testReaderQueue1") + + for _ in 1...totalOperations { + queue1.async { + // Reads the total string count in the string array + // Using the wrapped value (no $) instead of the wrapper itself triggers the thread sanitizer. + let result = self.stringContainer.totalStrings + + self.stringContainerRead.write { + $0.results1.append(result) + + if $0.results1.count == totalOperations { + $0.queue1Complete = true + + if $0.queue2Complete { + completion($0.results1, $0.results2) + } + } + } + } + + queue2.async { + // Reads the total string count in the string array + let result = self.stringContainer.read { $0.totalStrings } + + self.stringContainerRead.write { + $0.results2.append(result) + + if $0.results2.count == totalOperations { + $0.queue2Complete = true + + if $0.queue1Complete { + completion($0.results1, $0.results2) + } + } + } + } + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/RedirectHandlerTests.swift b/Carthage/Checkouts/Alamofire/Tests/RedirectHandlerTests.swift new file mode 100644 index 00000000..ffdb8f6b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/RedirectHandlerTests.swift @@ -0,0 +1,242 @@ +// +// RedirectHandlerTests.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class RedirectHandlerTestCase: BaseTestCase { + // MARK: - Properties + + private var redirectEndpoint: Endpoint { .get } + private var endpoint: Endpoint { .redirectTo(redirectEndpoint) } + + // MARK: - Tests - Per Request + + func testThatRequestRedirectHandlerCanFollowRedirects() { + // Given + let session = Session() + + var response: DataResponse? + let expectation = expectation(description: "Request should redirect to /get") + + // When + session.request(endpoint).redirect(using: Redirector.follow).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, redirectEndpoint.url) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + func testThatRequestRedirectHandlerCanNotFollowRedirects() { + // Given + let session = Session() + + var response: DataResponse? + let expectation = expectation(description: "Request should NOT redirect to /get") + + // When + session.request(endpoint).redirect(using: Redirector.doNotFollow).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, endpoint.url) + XCTAssertEqual(response?.response?.statusCode, 302) + } + + func testThatRequestRedirectHandlerCanModifyRedirects() { + // Given + let session = Session() + let customRedirectEndpoint = Endpoint.method(.patch) + + var response: DataResponse? + let expectation = expectation(description: "Request should redirect to /patch") + + // When + let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest }) + + session.request(endpoint).redirect(using: redirector).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + // MARK: - Tests - Per Session + + func testThatSessionRedirectHandlerCanFollowRedirects() { + // Given + let session = Session(redirectHandler: Redirector.follow) + + var response: DataResponse? + let expectation = expectation(description: "Request should redirect to /get") + + // When + session.request(endpoint).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, redirectEndpoint.url) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + func testThatSessionRedirectHandlerCanNotFollowRedirects() { + // Given + let session = Session(redirectHandler: Redirector.doNotFollow) + + var response: DataResponse? + let expectation = expectation(description: "Request should NOT redirect to /get") + + // When + session.request(endpoint).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, endpoint.url) + XCTAssertEqual(response?.response?.statusCode, 302) + } + + func testThatSessionRedirectHandlerCanModifyRedirects() { + // Given + let customRedirectEndpoint = Endpoint.method(.patch) + + let redirector = Redirector(behavior: .modify { _, _, _ in customRedirectEndpoint.urlRequest }) + let session = Session(redirectHandler: redirector) + + var response: DataResponse? + let expectation = expectation(description: "Request should redirect to /patch") + + // When + session.request(endpoint).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, customRedirectEndpoint.url) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + // MARK: - Tests - Per Request Prioritization + + func testThatRequestRedirectHandlerIsPrioritizedOverSessionRedirectHandler() { + // Given + let session = Session(redirectHandler: Redirector.doNotFollow) + + var response: DataResponse? + let expectation = expectation(description: "Request should redirect to /get") + + // When + session.request(endpoint).redirect(using: Redirector.follow).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url, redirectEndpoint.url) + XCTAssertEqual(response?.response?.statusCode, 200) + } +} + +final class StaticRedirectHandlerTests: BaseTestCase { + func takeRedirectHandler(_ handler: RedirectHandler) { + _ = handler + } + + func testThatFollowRedirectorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeRedirectHandler(.follow) + } + + func testThatDoNotFollowRedirectorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeRedirectHandler(.doNotFollow) + } + + func testThatModifyRedirectorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + takeRedirectHandler(.modify { _, _, _ in nil }) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Request+AlamofireTests.swift b/Carthage/Checkouts/Alamofire/Tests/Request+AlamofireTests.swift new file mode 100644 index 00000000..6366a88e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Request+AlamofireTests.swift @@ -0,0 +1,40 @@ +// +// Request+AlamofireTests.swift +// +// Copyright (c) 2022 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire + +extension DataRequest { + /// Adds a validator which executes a closure before calling `validate()`. + /// + /// - Parameter closure: Closure to perform before validation. + /// - Returns: The `DataRequest`. + func validate(performing closure: @escaping () -> Void) -> Self { + validate { _, _, _ in + closure() + + return .success(()) + } + .validate() + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/RequestInterceptorTests.swift b/Carthage/Checkouts/Alamofire/Tests/RequestInterceptorTests.swift new file mode 100644 index 00000000..3c37a0a2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/RequestInterceptorTests.swift @@ -0,0 +1,704 @@ +// +// RequestInterceptorTests.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +private struct MockError: Error {} +private struct RetryError: Error {} + +// MARK: - + +final class RetryResultTestCase: BaseTestCase { + func testRetryRequiredProperty() { + // Given, When + let retry = RetryResult.retry + let retryWithDelay = RetryResult.retryWithDelay(1.0) + let doNotRetry = RetryResult.doNotRetry + let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError()) + + // Then + XCTAssertTrue(retry.retryRequired) + XCTAssertTrue(retryWithDelay.retryRequired) + XCTAssertFalse(doNotRetry.retryRequired) + XCTAssertFalse(doNotRetryWithError.retryRequired) + } + + func testDelayProperty() { + // Given, When + let retry = RetryResult.retry + let retryWithDelay = RetryResult.retryWithDelay(1.0) + let doNotRetry = RetryResult.doNotRetry + let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError()) + + // Then + XCTAssertEqual(retry.delay, nil) + XCTAssertEqual(retryWithDelay.delay, 1.0) + XCTAssertEqual(doNotRetry.delay, nil) + XCTAssertEqual(doNotRetryWithError.delay, nil) + } + + func testErrorProperty() { + // Given, When + let retry = RetryResult.retry + let retryWithDelay = RetryResult.retryWithDelay(1.0) + let doNotRetry = RetryResult.doNotRetry + let doNotRetryWithError = RetryResult.doNotRetryWithError(MockError()) + + // Then + XCTAssertNil(retry.error) + XCTAssertNil(retryWithDelay.error) + XCTAssertNil(doNotRetry.error) + XCTAssertTrue(doNotRetryWithError.error is MockError) + } +} + +// MARK: - + +final class AdapterTestCase: BaseTestCase { + func testThatAdapterCallsAdaptHandler() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + var adapted = false + + let adapter = Adapter { request, _, completion in + adapted = true + completion(.success(request)) + } + + var result: Result! + + // When + adapter.adapt(urlRequest, for: session) { result = $0 } + + // Then + XCTAssertTrue(adapted) + XCTAssertTrue(result.isSuccess) + } + + func testThatAdapterCallsAdaptHandlerWithStateAPI() { + // Given + class StateCaptureAdapter: Adapter { + private(set) var urlRequest: URLRequest? + private(set) var state: RequestAdapterState? + + override func adapt(_ urlRequest: URLRequest, + using state: RequestAdapterState, + completion: @escaping (Result) -> Void) { + self.urlRequest = urlRequest + self.state = state + + super.adapt(urlRequest, using: state, completion: completion) + } + } + + let urlRequest = Endpoint().urlRequest + let session = Session() + let requestID = UUID() + + var adapted = false + + let adapter = StateCaptureAdapter { urlRequest, _, completion in + adapted = true + completion(.success(urlRequest)) + } + + let state = RequestAdapterState(requestID: requestID, session: session) + + var result: Result! + + // When + adapter.adapt(urlRequest, using: state) { result = $0 } + + // Then + XCTAssertTrue(adapted) + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(adapter.urlRequest, urlRequest) + XCTAssertEqual(adapter.state?.requestID, requestID) + XCTAssertEqual(adapter.state?.session.session, session.session) + } + + func testThatAdapterCallsRequestRetrierDefaultImplementationInProtocolExtension() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + let adapter = Adapter { request, _, completion in + completion(.success(request)) + } + + var result: RetryResult! + + // When + adapter.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .doNotRetry) + } + + func testThatAdapterCanBeImplementedAsynchronously() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + var adapted = false + + let adapter = Adapter { request, _, completion in + adapted = true + DispatchQueue.main.async { + completion(.success(request)) + } + } + + var result: Result! + + let completesExpectation = expectation(description: "adapter completes") + + // When + adapter.adapt(urlRequest, for: session) { + result = $0 + completesExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(adapted) + XCTAssertTrue(result.isSuccess) + } +} + +// MARK: - + +final class RetrierTestCase: BaseTestCase { + func testThatRetrierCallsRetryHandler() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + var retried = false + + let retrier = Retrier { _, _, _, completion in + retried = true + completion(.retry) + } + + var result: RetryResult! + + // When + retrier.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertTrue(retried) + XCTAssertEqual(result, .retry) + } + + func testThatRetrierCallsRequestAdapterDefaultImplementationInProtocolExtension() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + + let retrier = Retrier { _, _, _, completion in + completion(.retry) + } + + var result: Result! + + // When + retrier.adapt(urlRequest, for: session) { result = $0 } + + // Then + XCTAssertTrue(result.isSuccess) + } + + func testThatRetrierCanBeImplementedAsynchronously() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + var retried = false + + let retrier = Retrier { _, _, _, completion in + retried = true + DispatchQueue.main.async { + completion(.retry) + } + } + + var result: RetryResult! + + let completesExpectation = expectation(description: "retrier completes") + + // When + retrier.retry(request, for: session, dueTo: MockError()) { + result = $0 + completesExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(retried) + XCTAssertEqual(result, .retry) + } +} + +// MARK: - + +final class InterceptorTests: BaseTestCase { + func testAdaptHandlerAndRetryHandlerDefaultInitializer() { + // Given + let adaptHandler: AdaptHandler = { urlRequest, _, completion in completion(.success(urlRequest)) } + let retryHandler: RetryHandler = { _, _, _, completion in completion(.doNotRetry) } + + // When + let interceptor = Interceptor(adaptHandler: adaptHandler, retryHandler: retryHandler) + + // Then + XCTAssertEqual(interceptor.adapters.count, 1) + XCTAssertEqual(interceptor.retriers.count, 1) + } + + func testAdapterAndRetrierDefaultInitializer() { + // Given + let adapter = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) } + let retrier = Retrier { _, _, _, completion in completion(.doNotRetry) } + + // When + let interceptor = Interceptor(adapter: adapter, retrier: retrier) + + // Then + XCTAssertEqual(interceptor.adapters.count, 1) + XCTAssertEqual(interceptor.retriers.count, 1) + } + + func testAdaptersAndRetriersDefaultInitializer() { + // Given + let adapter = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) } + let retrier = Retrier { _, _, _, completion in completion(.doNotRetry) } + + // When + let interceptor = Interceptor(adapters: [adapter, adapter], retriers: [retrier, retrier]) + + // Then + XCTAssertEqual(interceptor.adapters.count, 2) + XCTAssertEqual(interceptor.retriers.count, 2) + } + + func testThatInterceptorCanBeComposedOfMultipleRequestInterceptors() { + // Given + let adapter = Adapter { request, _, completion in completion(.success(request)) } + let retrier = Retrier { _, _, _, completion in completion(.doNotRetry) } + let inner = Interceptor(adapter: adapter, retrier: retrier) + + // When + let interceptor = Interceptor(interceptors: [inner]) + + // Then + XCTAssertEqual(interceptor.adapters.count, 1) + XCTAssertEqual(interceptor.retriers.count, 1) + } + + func testThatInterceptorCanAdaptRequestWithNoAdapters() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + let interceptor = Interceptor() + + var result: Result! + + // When + interceptor.adapt(urlRequest, for: session) { result = $0 } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(result.success, urlRequest) + } + + func testThatInterceptorCanAdaptRequestWithOneAdapter() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + + let adapter = Adapter { _, _, completion in completion(.failure(MockError())) } + let interceptor = Interceptor(adapters: [adapter]) + + var result: Result! + + // When + interceptor.adapt(urlRequest, for: session) { result = $0 } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is MockError) + } + + func testThatInterceptorCanAdaptRequestWithMultipleAdapters() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + + let adapter1 = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) } + let adapter2 = Adapter { _, _, completion in completion(.failure(MockError())) } + let interceptor = Interceptor(adapters: [adapter1, adapter2]) + + var result: Result! + + // When + interceptor.adapt(urlRequest, for: session) { result = $0 } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is MockError) + } + + func testThatInterceptorCanAdaptRequestWithMultipleAdaptersUsingStateAPI() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + + let adapter1 = Adapter { urlRequest, _, completion in completion(.success(urlRequest)) } + let adapter2 = Adapter { _, _, completion in completion(.failure(MockError())) } + let interceptor = Interceptor(adapters: [adapter1, adapter2]) + let state = RequestAdapterState(requestID: UUID(), session: session) + + var result: Result! + + // When + interceptor.adapt(urlRequest, using: state) { result = $0 } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is MockError) + } + + func testThatInterceptorCanAdaptRequestAsynchronously() { + // Given + let urlRequest = Endpoint().urlRequest + let session = Session() + + let adapter = Adapter { _, _, completion in + DispatchQueue.main.async { + completion(.failure(MockError())) + } + } + let interceptor = Interceptor(adapters: [adapter]) + + var result: Result! + + let completesExpectation = expectation(description: "interceptor completes") + + // When + interceptor.adapt(urlRequest, for: session) { + result = $0 + completesExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertTrue(result.failure is MockError) + } + + func testThatInterceptorCanRetryRequestWithNoRetriers() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + let interceptor = Interceptor() + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .doNotRetry) + } + + func testThatInterceptorCanRetryRequestWithOneRetrier() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + let retrier = Retrier { _, _, _, completion in completion(.retry) } + let interceptor = Interceptor(retriers: [retrier]) + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .retry) + } + + func testThatInterceptorCanRetryRequestWithMultipleRetriers() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + let retrier1 = Retrier { _, _, _, completion in completion(.doNotRetry) } + let retrier2 = Retrier { _, _, _, completion in completion(.retry) } + let interceptor = Interceptor(retriers: [retrier1, retrier2]) + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .retry) + } + + func testThatInterceptorCanRetryRequestAsynchronously() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + let retrier = Retrier { _, _, _, completion in + DispatchQueue.main.async { + completion(.retry) + } + } + let interceptor = Interceptor(retriers: [retrier]) + + var result: RetryResult! + + let completesExpectation = expectation(description: "interceptor completes") + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { + result = $0 + completesExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(result, .retry) + } + + func testThatInterceptorStopsIteratingThroughPendingRetriersWithRetryResult() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + var retrier2Called = false + + let retrier1 = Retrier { _, _, _, completion in completion(.retry) } + let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) } + let interceptor = Interceptor(retriers: [retrier1, retrier2]) + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .retry) + XCTAssertFalse(retrier2Called) + } + + func testThatInterceptorStopsIteratingThroughPendingRetriersWithRetryWithDelayResult() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + var retrier2Called = false + + let retrier1 = Retrier { _, _, _, completion in completion(.retryWithDelay(1.0)) } + let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) } + let interceptor = Interceptor(retriers: [retrier1, retrier2]) + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, .retryWithDelay(1.0)) + XCTAssertEqual(result.delay, 1.0) + XCTAssertFalse(retrier2Called) + } + + func testThatInterceptorStopsIteratingThroughPendingRetriersWithDoNotRetryResult() { + // Given + let session = Session(startRequestsImmediately: false) + let request = session.request(.default) + + var retrier2Called = false + + let retrier1 = Retrier { _, _, _, completion in completion(.doNotRetryWithError(RetryError())) } + let retrier2 = Retrier { _, _, _, completion in retrier2Called = true; completion(.doNotRetry) } + let interceptor = Interceptor(retriers: [retrier1, retrier2]) + + var result: RetryResult! + + // When + interceptor.retry(request, for: session, dueTo: MockError()) { result = $0 } + + // Then + XCTAssertEqual(result, RetryResult.doNotRetryWithError(RetryError())) + XCTAssertTrue(result.error is RetryError) + XCTAssertFalse(retrier2Called) + } +} + +// MARK: - Functional Tests + +final class InterceptorRequestTests: BaseTestCase { + func testThatRetryPolicyRetriesRequestTimeout() { + // Given + let interceptor = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0.1)) + let urlRequest = Endpoint.delay(1).modifying(\.timeout, to: 0.01) + let expect = expectation(description: "request completed") + + // When + let request = AF.request(urlRequest, interceptor: interceptor).response { _ in + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.tasks.count, 2, "There should be two tasks, one original, one retry.") + XCTAssertEqual(interceptor.retryCalledCount, 2, "retry() should be called twice.") + XCTAssertEqual(interceptor.retries, [.retryWithDelay(0.1), .doNotRetry], "RetryResults should retryWithDelay, doNotRetry") + } +} + +// MARK: - Static Accessors + +final class StaticAccessorTests: BaseTestCase { + func consumeRequestAdapter(_ requestAdapter: RequestAdapter) { + _ = requestAdapter + } + + func consumeRequestRetrier(_ requestRetrier: RequestRetrier) { + _ = requestRetrier + } + + func consumeRequestInterceptor(_ requestInterceptor: RequestInterceptor) { + _ = requestInterceptor + } + + func testThatAdapterCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeRequestAdapter(.adapter { request, _, completion in completion(.success(request)) }) + } + + func testThatRetrierCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeRequestRetrier(.retrier { _, _, _, completion in completion(.doNotRetry) }) + } + + func testThatInterceptorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeRequestInterceptor(.interceptor()) + } + + func testThatRetryPolicyCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeRequestInterceptor(.retryPolicy()) + } + + func testThatConnectionLostRetryPolicyCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeRequestInterceptor(.connectionLostRetryPolicy()) + } +} + +// MARK: - Helpers + +/// Class which captures the output of any underlying `RequestInterceptor`. +final class InspectorInterceptor: RequestInterceptor { + var onAdaptation: ((Result) -> Void)? + var onRetry: ((RetryResult) -> Void)? + + private(set) var adaptations: [Result] = [] + private(set) var retries: [RetryResult] = [] + + /// Number of times `retry` was called. + var retryCalledCount: Int { retries.count } + + let interceptor: Interceptor + + init(_ interceptor: Interceptor) { + self.interceptor = interceptor + } + + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + interceptor.adapt(urlRequest, for: session) { result in + self.adaptations.append(result) + completion(result) + self.onAdaptation?(result) + } + } + + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + interceptor.retry(request, for: session, dueTo: error) { result in + self.retries.append(result) + completion(result) + self.onRetry?(result) + } + } +} + +/// Retry a request once, allowing the second to succeed using the method path. +final class SingleRetrier: RequestInterceptor { + private var hasRetried = false + + func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result) -> Void) { + if hasRetried { + let method = urlRequest.method ?? .get + let endpoint = Endpoint(path: .method(method), + method: method, + headers: urlRequest.headers) + completion(.success(endpoint.urlRequest)) + } else { + completion(.success(urlRequest)) + } + } + + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + completion(hasRetried ? .doNotRetry : .retry) + hasRetried = true + } +} + +extension RetryResult: Equatable { + public static func ==(lhs: RetryResult, rhs: RetryResult) -> Bool { + switch (lhs, rhs) { + case (.retry, .retry), + (.doNotRetry, .doNotRetry), + (.doNotRetryWithError, .doNotRetryWithError): + return true + case let (.retryWithDelay(leftDelay), .retryWithDelay(rightDelay)): + return leftDelay == rightDelay + default: + return false + } + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/RequestModifierTests.swift b/Carthage/Checkouts/Alamofire/Tests/RequestModifierTests.swift new file mode 100644 index 00000000..4d6e8fc1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/RequestModifierTests.swift @@ -0,0 +1,196 @@ +// +// RequestModifierTests.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import XCTest + +final class RequestModifierTests: BaseTestCase { + // MARK: - DataRequest + + func testThatDataRequestsCanHaveCustomTimeoutValueSet() { + // Given + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified") + var response: AFDataResponse? + + // When + AF.request(.delay(1)) { $0.timeoutInterval = 0.01; modified.fulfill() } + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + } + + func testThatDataRequestsCallRequestModifiersOnRetry() { + // Given + let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0)) + let session = Session(interceptor: inspector) + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified twice") + modified.expectedFulfillmentCount = 2 + var response: AFDataResponse? + + // When + session.request(.delay(1)) { $0.timeoutInterval = 0.01; modified.fulfill() } + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + XCTAssertEqual(inspector.retryCalledCount, 2) + } + + // MARK: - UploadRequest + + func testThatUploadRequestsCanHaveCustomTimeoutValueSet() { + // Given + let endpoint = Endpoint.delay(1).modifying(\.method, to: .post) + let data = Data("data".utf8) + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified") + var response: AFDataResponse? + + // When + AF.upload(data, to: endpoint) { $0.timeoutInterval = 0.01; modified.fulfill() } + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + } + + func testThatUploadRequestsCallRequestModifiersOnRetry() { + // Given + let endpoint = Endpoint.delay(1).modifying(\.method, to: .post) + let data = Data("data".utf8) + let policy = RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0, retryableHTTPMethods: [.post]) + let inspector = InspectorInterceptor(policy) + let session = Session(interceptor: inspector) + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified twice") + modified.expectedFulfillmentCount = 2 + var response: AFDataResponse? + + // When + session.upload(data, to: endpoint) { $0.timeoutInterval = 0.01; modified.fulfill() } + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + XCTAssertEqual(inspector.retryCalledCount, 2) + } + + // MARK: - DownloadRequest + + func testThatDownloadRequestsCanHaveCustomTimeoutValueSet() { + // Given + let url = Endpoint.delay(1).url + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified") + var response: AFDownloadResponse? + + // When + AF.download(url, requestModifier: { $0.timeoutInterval = 0.01; modified.fulfill() }) + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + } + + func testThatDownloadRequestsCallRequestModifiersOnRetry() { + // Given + let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0)) + let session = Session(interceptor: inspector) + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified twice") + modified.expectedFulfillmentCount = 2 + var response: AFDownloadResponse? + + // When + session.download(.delay(1), requestModifier: { $0.timeoutInterval = 0.01; modified.fulfill() }) + .response { response = $0; completed.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + XCTAssertEqual(inspector.retryCalledCount, 2) + } + + // MARK: - DataStreamRequest + + func testThatDataStreamRequestsCanHaveCustomTimeoutValueSet() { + // Given + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified") + var response: DataStreamRequest.Completion? + + // When + AF.streamRequest(.delay(1)) { $0.timeoutInterval = 0.01; modified.fulfill() } + .responseStream { stream in + guard case let .complete(completion) = stream.event else { return } + + response = completion + completed.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + } + + func testThatDataStreamRequestsCallRequestModifiersOnRetry() { + // Given + let inspector = InspectorInterceptor(RetryPolicy(retryLimit: 1, exponentialBackoffScale: 0)) + let session = Session(interceptor: inspector) + let completed = expectation(description: "request completed") + let modified = expectation(description: "request should be modified twice") + modified.expectedFulfillmentCount = 2 + var response: DataStreamRequest.Completion? + + // When + session.streamRequest(.delay(1)) { $0.timeoutInterval = 0.01; modified.fulfill() } + .responseStream { stream in + guard case let .complete(completion) = stream.event else { return } + + response = completion + completed.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual((response?.error?.underlyingError as? URLError)?.code, .timedOut) + XCTAssertEqual(inspector.retryCalledCount, 2) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/RequestTests.swift b/Carthage/Checkouts/Alamofire/Tests/RequestTests.swift new file mode 100644 index 00000000..2ed6702a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/RequestTests.swift @@ -0,0 +1,1451 @@ +// +// RequestTests.swift +// +// Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class RequestResponseTestCase: BaseTestCase { + func testRequestResponse() { + // Given + let url = Endpoint.get.url + let expectation = expectation(description: "GET request should succeed: \(url)") + var response: DataResponse? + + // When + AF.request(url, parameters: ["foo": "bar"]) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testThatDataRequestReceivesInitialResponse() { + // Given + let url = Endpoint.get.url + var initialResponse: HTTPURLResponse? + let didReceiveResponse = expectation(description: "didReceiveResponse") + let didComplete = expectation(description: "GET request should succeed: \(url)") + var response: DataResponse? + + // When + AF.request(url, parameters: ["foo": "bar"]) + .onHTTPResponse { response in + initialResponse = response + didReceiveResponse.fulfill() + } + .response { resp in + response = resp + didComplete.fulfill() + } + + wait(for: [didReceiveResponse, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(initialResponse, response?.response) + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testThatDataRequestOnHTTPResponseCanAllow() { + // Given + let url = Endpoint.get.url + var initialResponse: HTTPURLResponse? + let didReceiveResponse = expectation(description: "didReceiveResponse") + let didComplete = expectation(description: "GET request should succeed: \(url)") + var response: DataResponse? + + // When + AF.request(url, parameters: ["foo": "bar"]) + .onHTTPResponse { response, completionHandler in + initialResponse = response + didReceiveResponse.fulfill() + completionHandler(.allow) + } + .response { resp in + response = resp + didComplete.fulfill() + } + + wait(for: [didReceiveResponse, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(initialResponse, response?.response) + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testThatDataRequestOnHTTPResponseCanCancel() { + // Given + let url = Endpoint.get.url + var initialResponse: HTTPURLResponse? + let didReceiveResponse = expectation(description: "didReceiveResponse") + let didComplete = expectation(description: "GET request should succeed: \(url)") + var response: DataResponse? + + // When + let request = AF.request(url, parameters: ["foo": "bar"]) + .onHTTPResponse { response, completionHandler in + initialResponse = response + didReceiveResponse.fulfill() + completionHandler(.cancel) + } + .response { resp in + response = resp + didComplete.fulfill() + } + + wait(for: [didReceiveResponse, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertEqual(initialResponse, response?.response) + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertTrue(request.isCancelled, "onHTTPResponse cancelled request should have isCancelled == true") + XCTAssertTrue(response?.error?.isExplicitlyCancelledError == true, "onHTTPResponse cancelled request should be explicitly cancelled") + } + + func testRequestResponseWithProgress() { + // Given + let byteCount = 50 * 1024 + let url = Endpoint.bytes(byteCount).url + + let expectation = expectation(description: "Bytes download progress should be reported: \(url)") + + var progressValues: [Double] = [] + var response: DataResponse? + + // When + AF.request(url) + .downloadProgress { progress in + progressValues.append(progress.fractionCompleted) + } + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + var previousProgress: Double = progressValues.first ?? 0.0 + + for progress in progressValues { + XCTAssertGreaterThanOrEqual(progress, previousProgress) + previousProgress = progress + } + + if let lastProgressValue = progressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in progressValues should not be nil") + } + } + + func testPOSTRequestWithUnicodeParameters() { + // Given + let parameters = ["french": "français", + "japanese": "日本語", + "arabic": "العربية", + "emoji": "😃"] + + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.method(.post), parameters: parameters) + .responseDecodable(of: TestResponse.self) { closureResponse in + response = closureResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + + if let form = response?.result.success?.form { + XCTAssertEqual(form["french"], parameters["french"]) + XCTAssertEqual(form["japanese"], parameters["japanese"]) + XCTAssertEqual(form["arabic"], parameters["arabic"]) + XCTAssertEqual(form["emoji"], parameters["emoji"]) + } else { + XCTFail("form parameter in JSON should not be nil") + } + } + + func testPOSTRequestWithBase64EncodedImages() { + // Given + let pngBase64EncodedString: String = { + let fileURL = url(forResource: "unicorn", withExtension: "png") + let data = try! Data(contentsOf: fileURL) + + return data.base64EncodedString(options: .lineLength64Characters) + }() + + let jpegBase64EncodedString: String = { + let fileURL = url(forResource: "rainbow", withExtension: "jpg") + let data = try! Data(contentsOf: fileURL) + + return data.base64EncodedString(options: .lineLength64Characters) + }() + + let parameters = ["email": "user@alamofire.org", + "png_image": pngBase64EncodedString, + "jpeg_image": jpegBase64EncodedString] + + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(Endpoint.method(.post), method: .post, parameters: parameters) + .responseDecodable(of: TestResponse.self) { closureResponse in + response = closureResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + + if let form = response?.result.success?.form { + XCTAssertEqual(form["email"], parameters["email"]) + XCTAssertEqual(form["png_image"], parameters["png_image"]) + XCTAssertEqual(form["jpeg_image"], parameters["jpeg_image"]) + } else { + XCTFail("form parameter in JSON should not be nil") + } + } + + // MARK: Queues + + func testThatResponseSerializationWorksWithSerializationQueue() { + // Given + let queue = DispatchQueue(label: "org.alamofire.testSerializationQueue") + let manager = Session(serializationQueue: queue) + let expectation = expectation(description: "request should complete") + var response: DataResponse? + + // When + manager.request(.get).responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + } + + func testThatRequestsWorksWithRequestAndSerializationQueues() { + // Given + let requestQueue = DispatchQueue(label: "org.alamofire.testRequestQueue") + let serializationQueue = DispatchQueue(label: "org.alamofire.testSerializationQueue") + let manager = Session(requestQueue: requestQueue, serializationQueue: serializationQueue) + let expectation = expectation(description: "request should complete") + var response: DataResponse? + + // When + manager.request(.get).responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + } + + func testThatRequestsWorksWithConcurrentRequestAndSerializationQueues() { + // Given + let requestQueue = DispatchQueue(label: "org.alamofire.testRequestQueue", attributes: .concurrent) + let serializationQueue = DispatchQueue(label: "org.alamofire.testSerializationQueue", attributes: .concurrent) + let session = Session(requestQueue: requestQueue, serializationQueue: serializationQueue) + let count = 10 + let expectation = expectation(description: "request should complete") + expectation.expectedFulfillmentCount = count + var responses: [DataResponse] = [] + + // When + DispatchQueue.concurrentPerform(iterations: count) { _ in + session.request(.default).responseDecodable(of: TestResponse.self) { resp in + responses.append(resp) + expectation.fulfill() + } + } + + waitForExpectations(timeout: timeout, handler: nil) + + // Then + XCTAssertEqual(responses.count, count) + XCTAssertTrue(responses.allSatisfy(\.result.isSuccess)) + } + + // MARK: Encodable Parameters + + func testThatRequestsCanPassEncodableParametersAsJSONBodyData() { + // Given + let parameters = TestParameters(property: "one") + let expect = expectation(description: "request should complete") + var receivedResponse: DataResponse? + + // When + AF.request(.method(.post), parameters: parameters, encoder: JSONParameterEncoder.default) + .responseDecodable(of: TestResponse.self) { response in + receivedResponse = response + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(receivedResponse?.result.success?.data, "{\"property\":\"one\"}") + } + + func testThatRequestsCanPassEncodableParametersAsAURLQuery() { + // Given + let parameters = TestParameters(property: "one") + let expect = expectation(description: "request should complete") + var receivedResponse: DataResponse? + + // When + AF.request(.method(.get), parameters: parameters) + .responseDecodable(of: TestResponse.self) { response in + receivedResponse = response + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(receivedResponse?.result.success?.args, ["property": "one"]) + } + + func testThatRequestsCanPassEncodableParametersAsURLEncodedBodyData() { + // Given + let parameters = TestParameters(property: "one") + let expect = expectation(description: "request should complete") + var receivedResponse: DataResponse? + + // When + AF.request(.method(.post), parameters: parameters) + .responseDecodable(of: TestResponse.self) { response in + receivedResponse = response + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(receivedResponse?.result.success?.form, ["property": "one"]) + } + + // MARK: Lifetime Events + + func testThatAutomaticallyResumedRequestReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 4 + + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidFinish = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default).response { _ in expect.fulfill() } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatAutomaticallyAndManuallyResumedRequestReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 4 + + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidFinish = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default).response { _ in expect.fulfill() } + for _ in 0..<100 { + request.resume() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatManuallyResumedRequestReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 3 + + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidFinish = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default) + for _ in 0..<100 { + request.resume() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatRequestManuallyResumedManyTimesOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 4 + + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidFinish = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default).response { _ in expect.fulfill() } + for _ in 0..<100 { + request.resume() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatRequestManuallySuspendedManyTimesAfterAutomaticResumeOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 2 + + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default) + for _ in 0..<100 { + request.suspend() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .suspended) + } + + func testThatRequestManuallySuspendedManyTimesOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 2 + + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default) + for _ in 0..<100 { + request.suspend() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .suspended) + } + + func testThatRequestManuallyCancelledManyTimesAfterAutomaticResumeOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 2 + + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default) + // Cancellation stops task creation, so don't cancel the request until the task has been created. + eventMonitor.requestDidCreateTask = { [unowned request] _, _ in + for _ in 0..<100 { + request.cancel() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } + + func testThatRequestManuallyCancelledManyTimesOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 2 + + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.default) + // Cancellation stops task creation, so don't cancel the request until the task has been created. + eventMonitor.requestDidCreateTask = { [unowned request] _, _ in + for _ in 0..<100 { + request.cancel() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } + + func testThatRequestManuallyCancelledManyTimesOnManyQueuesOnlyReceivesAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let expect = expectation(description: "request should receive appropriate lifetime events") + expect.expectedFulfillmentCount = 6 + + eventMonitor.requestDidCancelTask = { _, _ in expect.fulfill() } + eventMonitor.requestDidCancel = { _ in expect.fulfill() } + eventMonitor.requestDidResume = { _ in expect.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in expect.fulfill() } + // Fulfill other events that would exceed the expected count. Inverted expectations require the full timeout. + eventMonitor.requestDidSuspend = { _ in expect.fulfill() } + eventMonitor.requestDidSuspendTask = { _, _ in expect.fulfill() } + + // When + let request = session.request(.delay(5)).response { _ in expect.fulfill() } + // Cancellation stops task creation, so don't cancel the request until the task has been created. + eventMonitor.requestDidCreateTask = { [unowned request] _, _ in + DispatchQueue.concurrentPerform(iterations: 100) { i in + request.cancel() + + if i == 99 { expect.fulfill() } + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } + + func testThatRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + // Disable event test until Firewalk support HTTPS. + // let didReceiveChallenge = expectation(description: "didReceiveChallenge should fire") + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didReceiveData = expectation(description: "didReceiveData should fire") + let willCacheResponse = expectation(description: "willCacheResponse should fire") + let didCreateURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + var dataReceived = false + + // Disable event test until Firewalk supports HTTPS. + // eventMonitor.taskDidReceiveChallenge = { _, _, _ in didReceiveChallenge.fulfill() } + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.dataTaskDidReceiveData = { _, _, _ in + guard !dataReceived else { return } + // Data may be received many times, fulfill only once. + dataReceived = true + didReceiveData.fulfill() + } + eventMonitor.dataTaskWillCacheResponse = { _, _, _ in willCacheResponse.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in didResumeTask.fulfill() } + eventMonitor.requestDidParseResponse = { _, _ in didParseResponse.fulfill() } + + // When + let request = session.request(.default).response { _ in + responseHandler.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatCancelledRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didCreateURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let didCancel = expectation(description: "didCancel should fire") + let didCancelTask = expectation(description: "didCancelTask should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidParseResponse = { _, _ in didParseResponse.fulfill() } + eventMonitor.requestDidCancel = { _ in didCancel.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in didCancelTask.fulfill() } + + // When + let request = session.request(.delay(5)).response { _ in + responseHandler.fulfill() + } + + eventMonitor.requestDidResumeTask = { [unowned request] _, _ in + request.cancel() + didResumeTask.fulfill() + } + + request.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } + + func testThatAppendingResponseSerializerToCancelledRequestCallsCompletion() { + // Given + let session = Session() + + var response1: DataResponse? + var response2: DataResponse? + + let expect = expectation(description: "both response serializer completions should be called") + expect.expectedFulfillmentCount = 2 + + // When + let request = session.request(.default) + + request.responseDecodable(of: TestResponse.self) { resp in + response1 = resp + expect.fulfill() + + request.responseDecodable(of: TestResponse.self) { resp in + response2 = resp + expect.fulfill() + } + } + + request.cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response1?.error?.isExplicitlyCancelledError, true) + XCTAssertEqual(response2?.error?.isExplicitlyCancelledError, true) + } + + func testThatAppendingResponseSerializerToCompletedRequestInsideCompletionResumesRequest() { + // Given + let session = Session() + + var response1: DataResponse? + var response2: DataResponse? + var response3: DataResponse? + + let expect = expectation(description: "all response serializer completions should be called") + expect.expectedFulfillmentCount = 3 + + // When + let request = session.request(.default) + + request.responseDecodable(of: TestResponse.self) { resp in + response1 = resp + expect.fulfill() + + request.responseDecodable(of: TestResponse.self) { resp in + response2 = resp + expect.fulfill() + + request.responseDecodable(of: TestResponse.self) { resp in + response3 = resp + expect.fulfill() + } + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response1?.value) + XCTAssertNotNil(response2?.value) + XCTAssertNotNil(response3?.value) + } + + func testThatAppendingResponseSerializerToCompletedRequestOutsideCompletionResumesRequest() { + // Given + let session = Session() + let request = session.request(.default) + + var response1: DataResponse? + var response2: DataResponse? + var response3: DataResponse? + + // When + let expect1 = expectation(description: "response serializer 1 completion should be called") + request.responseDecodable(of: TestResponse.self) { response1 = $0; expect1.fulfill() } + waitForExpectations(timeout: timeout) + + let expect2 = expectation(description: "response serializer 2 completion should be called") + request.responseDecodable(of: TestResponse.self) { response2 = $0; expect2.fulfill() } + waitForExpectations(timeout: timeout) + + let expect3 = expectation(description: "response serializer 3 completion should be called") + request.responseDecodable(of: TestResponse.self) { response3 = $0; expect3.fulfill() } + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response1?.value) + XCTAssertNotNil(response2?.value) + XCTAssertNotNil(response3?.value) + } +} + +// MARK: - + +final class RequestDescriptionTestCase: BaseTestCase { + func testRequestDescription() { + // Given + let url = Endpoint().url + let manager = Session(startRequestsImmediately: false) + let request = manager.request(url) + + let expectation = expectation(description: "Request description should update: \(url)") + + var response: HTTPURLResponse? + + // When + request.response { resp in + response = resp.response + + expectation.fulfill() + }.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.description, "GET \(url) (\(response?.statusCode ?? -1))") + } +} + +// MARK: - + +final class RequestCURLDescriptionTestCase: BaseTestCase { + // MARK: Properties + + let session: Session = { + let manager = Session() + + return manager + }() + + let sessionWithAcceptLanguageHeader: Session = { + var headers = HTTPHeaders.default + headers["Accept-Language"] = "en-US" + + let configuration = URLSessionConfiguration.af.default + configuration.headers = headers + + let manager = Session(configuration: configuration) + + return manager + }() + + let sessionWithContentTypeHeader: Session = { + var headers = HTTPHeaders.default + headers["Content-Type"] = "application/json" + + let configuration = URLSessionConfiguration.af.default + configuration.headers = headers + + let manager = Session(configuration: configuration) + + return manager + }() + + func sessionWithCookie(_ cookie: HTTPCookie) -> Session { + let configuration = URLSessionConfiguration.af.default + configuration.httpCookieStorage?.setCookie(cookie) + + return Session(configuration: configuration) + } + + let sessionDisallowingCookies: Session = { + let configuration = URLSessionConfiguration.af.default + configuration.httpShouldSetCookies = false + + let manager = Session(configuration: configuration) + + return manager + }() + + // MARK: Tests + + func testGETRequestCURLDescription() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var components: [String]? + + // When + session.request(url).cURLDescription { + components = self.cURLCommandComponents(from: $0) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + } + + func testGETRequestCURLDescriptionOnMainQueue() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var isMainThread = false + var components: [String]? + + // When + session.request(url).cURLDescription(on: .main) { + components = self.cURLCommandComponents(from: $0) + isMainThread = Thread.isMainThread + expectation.fulfill() + } + + waitForExpectations(timeout: timeout, handler: nil) + + // Then + XCTAssertTrue(isMainThread) + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + } + + func testGETRequestCURLDescriptionSynchronous() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var components: [String]? + var syncComponents: [String]? + + // When + let request = session.request(url) + request.cURLDescription { + components = self.cURLCommandComponents(from: $0) + syncComponents = self.cURLCommandComponents(from: request.cURLDescription()) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + XCTAssertEqual(components?.sorted(), syncComponents?.sorted()) + } + + func testGETRequestCURLDescriptionCanBeRequestedManyTimes() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var components: [String]? + var secondComponents: [String]? + + // When + let request = session.request(url) + request.cURLDescription { + components = self.cURLCommandComponents(from: $0) + request.cURLDescription { + secondComponents = self.cURLCommandComponents(from: $0) + expectation.fulfill() + } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + XCTAssertEqual(components?.sorted(), secondComponents?.sorted()) + } + + func testGETRequestWithCustomHeaderCURLDescription() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var cURLDescription: String? + + // When + let headers: HTTPHeaders = ["X-Custom-Header": "{\"key\": \"value\"}"] + session.request(url, headers: headers).cURLDescription { + cURLDescription = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(cURLDescription?.range(of: "-H \"X-Custom-Header: {\\\"key\\\": \\\"value\\\"}\"")) + } + + func testGETRequestWithDuplicateHeadersDebugDescription() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should complete") + var cURLDescription: String? + var components: [String]? + + // When + let headers: HTTPHeaders = ["Accept-Language": "en-GB"] + sessionWithAcceptLanguageHeader.request(url, headers: headers).cURLDescription { + components = self.cURLCommandComponents(from: $0) + cURLDescription = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + + let acceptLanguageCount = components?.filter { $0.contains("Accept-Language") }.count + XCTAssertEqual(acceptLanguageCount, 1, "command should contain a single Accept-Language header") + + XCTAssertNotNil(cURLDescription?.range(of: "-H \"Accept-Language: en-GB\"")) + } + + func testPOSTRequestCURLDescription() { + // Given + let url = Endpoint.method(.post).url + let expectation = expectation(description: "request should complete") + var components: [String]? + + // When + session.request(url, method: .post).cURLDescription { + components = self.cURLCommandComponents(from: $0) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertEqual(components?[3..<5], ["-X", "POST"]) + XCTAssertEqual(components?.last, "\"\(url)\"") + } + + func testPOSTRequestWithJSONParametersCURLDescription() { + // Given + let url = Endpoint.method(.post).url + let expectation = expectation(description: "request should complete") + var cURLDescription: String? + var components: [String]? + + let parameters = ["foo": "bar", + "fo\"o": "b\"ar", + "f'oo": "ba'r"] + + // When + session.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).cURLDescription { + components = self.cURLCommandComponents(from: $0) + cURLDescription = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertEqual(components?[3..<5], ["-X", "POST"]) + + XCTAssertNotNil(cURLDescription?.range(of: "-H \"Content-Type: application/json\"")) + XCTAssertNotNil(cURLDescription?.range(of: "-d \"{")) + XCTAssertNotNil(cURLDescription?.range(of: "\\\"f'oo\\\":\\\"ba'r\\\"")) + XCTAssertNotNil(cURLDescription?.range(of: "\\\"fo\\\\\\\"o\\\":\\\"b\\\\\\\"ar\\\"")) + XCTAssertNotNil(cURLDescription?.range(of: "\\\"foo\\\":\\\"bar\\")) + + XCTAssertEqual(components?.last, "\"\(url)\"") + } + + func testPOSTRequestWithCookieCURLDescription() { + // Given + let url = Endpoint.method(.post).url + + let cookie = HTTPCookie(properties: [.domain: url.host as Any, + .path: url.path, + .name: "foo", + .value: "bar"])! + let cookieManager = sessionWithCookie(cookie) + let expectation = expectation(description: "request should complete") + var components: [String]? + + // When + cookieManager.request(url, method: .post).cURLDescription { + components = self.cURLCommandComponents(from: $0) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertEqual(components?[3..<5], ["-X", "POST"]) + XCTAssertEqual(components?.last, "\"\(url)\"") + XCTAssertEqual(components?[5..<6], ["-b"]) + } + + func testPOSTRequestWithCookiesDisabledCURLDescriptionHasNoCookies() { + // Given + let url = Endpoint.method(.post).url + + let cookie = HTTPCookie(properties: [.domain: url.host as Any, + .path: url.path, + .name: "foo", + .value: "bar"])! + sessionDisallowingCookies.session.configuration.httpCookieStorage?.setCookie(cookie) + let expectation = expectation(description: "request should complete") + var components: [String]? + + // When + sessionDisallowingCookies.request(url, method: .post).cURLDescription { + components = self.cURLCommandComponents(from: $0) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + let cookieComponents = components?.filter { $0 == "-b" } + XCTAssertTrue(cookieComponents?.isEmpty == true) + } + + func testMultipartFormDataRequestWithDuplicateHeadersCURLDescriptionHasOneContentTypeHeader() { + // Given + let url = Endpoint.method(.post).url + let japaneseData = Data("日本語".utf8) + let expectation = expectation(description: "multipart form data encoding should succeed") + var cURLDescription: String? + var components: [String]? + + // When + sessionWithContentTypeHeader.upload(multipartFormData: { data in + data.append(japaneseData, withName: "japanese") + }, to: url).cURLDescription { + components = self.cURLCommandComponents(from: $0) + cURLDescription = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(components?[0..<3], ["$", "curl", "-v"]) + XCTAssertTrue(components?.contains("-X") == true) + XCTAssertEqual(components?.last, "\"\(url)\"") + + let contentTypeCount = components?.filter { $0.contains("Content-Type") }.count + XCTAssertEqual(contentTypeCount, 1, "command should contain a single Content-Type header") + + XCTAssertNotNil(cURLDescription?.range(of: "-H \"Content-Type: multipart/form-data;")) + } + + func testThatRequestWithInvalidURLDebugDescription() { + // Given + let urlString = "invalid_url" + let expectation = expectation(description: "request should complete") + var cURLDescription: String? + + // When + session.request(urlString).cURLDescription { + cURLDescription = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(cURLDescription, "debugDescription should not crash") + } + + // MARK: Test Helper Methods + + private func cURLCommandComponents(from cURLString: String) -> [String] { + cURLString.components(separatedBy: .whitespacesAndNewlines) + .filter { $0 != "" && $0 != "\\" } + } +} + +final class RequestLifetimeTests: BaseTestCase { + func testThatRequestProvidesURLRequestWhenCreated() { + // Given + let didReceiveRequest = expectation(description: "did receive task") + let didComplete = expectation(description: "request did complete") + var request: URLRequest? + + // When + AF.request(.default) + .onURLRequestCreation { request = $0; didReceiveRequest.fulfill() } + .responseDecodable(of: TestResponse.self) { _ in didComplete.fulfill() } + + wait(for: [didReceiveRequest, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertNotNil(request) + } + + func testThatRequestProvidesTaskWhenCreated() { + // Given + let didReceiveTask = expectation(description: "did receive task") + let didComplete = expectation(description: "request did complete") + var task: URLSessionTask? + + // When + AF.request(.default) + .onURLSessionTaskCreation { task = $0; didReceiveTask.fulfill() } + .responseDecodable(of: TestResponse.self) { _ in didComplete.fulfill() } + + wait(for: [didReceiveTask, didComplete], timeout: timeout, enforceOrder: true) + + // Then + XCTAssertNotNil(task) + } +} + +// MARK: - + +final class RequestInvalidURLTestCase: BaseTestCase { + func testThatDataRequestWithFileURLThrowsError() { + // Given + let fileURL = url(forResource: "valid_data", withExtension: "json") + let expectation = expectation(description: "Request should succeed.") + var response: DataResponse? + + // When + AF.request(fileURL) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + } + + func testThatDownloadRequestWithFileURLThrowsError() { + // Given + let fileURL = url(forResource: "valid_data", withExtension: "json") + let expectation = expectation(description: "Request should succeed.") + var response: DownloadResponse? + + // When + AF.download(fileURL) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isSuccess, true) + } + + func testThatDataStreamRequestWithFileURLThrowsError() { + // Given + let fileURL = url(forResource: "valid_data", withExtension: "json") + let expectation = expectation(description: "Request should succeed.") + var response: DataStreamRequest.Completion? + + // When + AF.streamRequest(fileURL) + .responseStream { stream in + guard case let .complete(completion) = stream.event else { return } + + response = completion + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.response) + } +} + +#if canImport(zlib) && swift(>=5.6) // Same condition as `DeflateRequestCompressor`. +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +final class RequestCompressionTests: BaseTestCase { + func testThatRequestsCanBeCompressed() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + interceptor: .deflateCompressor) + .serializingDecodable(TestResponse.self) + .result + + // Then + XCTAssertTrue(result.isSuccess) + } + + func testThatDeflateCompressorThrowsErrorByDefaultWhenRequestAlreadyHasHeader() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + headers: [.contentEncoding("value")], + interceptor: .deflateCompressor) + .serializingDecodable(TestResponse.self) + .result + + // Then + XCTAssertFalse(result.isSuccess) + XCTAssertNotNil(result.failure?.underlyingError as? DeflateRequestCompressor.DuplicateHeaderError) + } + + func testThatDeflateCompressorThrowsErrorWhenConfigured() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + headers: [.contentEncoding("value")], + interceptor: .deflateCompressor(duplicateHeaderBehavior: .error)) + .serializingDecodable(TestResponse.self) + .result + + // Then + XCTAssertFalse(result.isSuccess) + XCTAssertNotNil(result.failure?.underlyingError as? DeflateRequestCompressor.DuplicateHeaderError) + } + + func testThatDeflateCompressorReplacesHeaderWhenConfigured() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + headers: [.contentEncoding("value")], + interceptor: .deflateCompressor(duplicateHeaderBehavior: .replace)) + .serializingDecodable(TestResponse.self) + .result + + // Then + XCTAssertTrue(result.isSuccess) + } + + func testThatDeflateCompressorSkipsCompressionWhenConfigured() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + headers: [.contentEncoding("gzip")], + interceptor: .deflateCompressor(duplicateHeaderBehavior: .skip)) + .serializingDecodable(TestResponse.self) + .result + + // Then + // Request fails as the server expects gzip compression. + XCTAssertFalse(result.isSuccess) + } + + func testThatDeflateCompressorDoesNotCompressDataWhenClosureReturnsFalse() async { + // Given + let url = Endpoint.method(.post).url + let parameters = TestParameters(property: "compressed") + + // When + let result = await AF.request(url, + method: .post, + parameters: parameters, + encoder: .json, + interceptor: .deflateCompressor { _ in false }) + .serializingDecodable(TestResponse.self) + .result + + // Then + XCTAssertTrue(result.isSuccess) + // With no compression, request headers reflected from server should have no Content-Encoding. + XCTAssertNil(result.success?.headers["Content-Encoding"]) + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-root-ca.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-root-ca.cer new file mode 100644 index 0000000000000000000000000000000000000000..b5ae743956bc597fc29a8662f5ec08503ed5c5f5 GIT binary patch literal 988 zcmXqLV!mO}#B^W*GZP~d6CrG zy*T|~-Q)wykIUuQsn7d3T_Yf`;PA|c@3|EIrb}htXz6jwnDMMHMzwE2@03*naV}L7 zO#xT48a6M@t_;k(BCmG5ri}fo4!eBt#)u1+heH{E&y{=luswY;!&~(=O0$y`=lUfq z&@nHPGYR{18`a?o;vgO-t@D`@^Ip67-Vh9dha^&geLj%R6|vuKsb-4AOl=UrZ#o7K#4k*nem z|NHg{TF$#7{VpC3K5N7-u;}i&YNeh{hqiyc8ndX{Wy+tF7bo`H`bGUx{mC>p=y;Cf z*PrY$SAT~-w#Zn<)%!i{Xvwz=zn5I8yOy~$wCCi~g=~8-dUn>ozxVE7)SM8zUmI6O zhomD!BhUX5K3Qsw>tClTTdvXxYE= z=0vV@8IuDaZNHw~x5n-Ww@aFM{*p9ZgsjCV&@uU&KV(Sm1Rk3YBiDG&kxu0m-9 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca1.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca1.cer new file mode 100644 index 0000000000000000000000000000000000000000..38596c5924ab478f3de0a4779a86685fe8ee5c60 GIT binary patch literal 1025 zcmXqLV*YE;#PoClGZP~d5E*c@acZ@Bw0-AgWaKtzoNOp%Ai>5Q%EHVe=$Mn3o1d0h zl&TPvpI@Tj>}V)tAOMo%;^BnL8S(;60E%(*u!N)*ml*OJ@PfD;JZ%0&spnC%u5G3e4t$3#Ha)e z4|o7GvNA9?G4eAQG%<29H8Cap!Wxs`dl93XNN~FXem` zx@-UU?9V<)tJYsDaJI-#$ebsqvniqEU)Q;foo_BIagO3TcViL1gM6Z6qW@WqFPC4$ zu^c_&H0kB_1ux27`gZd@Tdx8qr z`WG<|uYKmlPo)6W8PBdbzq(`<_3t`>l6$>x}%AWFI|CjYFldAI~jB+E*J0&AeCeN%& zn;_D^XV#xi35g|oD_`o&6K*=VS#;La6Sg-T@BLf*SL8roZON%kPhW{uT~64#d)>sn zI|KMKGQ8DZwJmx-vsd=z39%C%?aEJa?DyPH>2O+vf1T}9jl`L-HLThTg5o#_JhAY QXD*#^SykQA?i*wc06eg6RR910 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca2.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/alamofire-signing-ca2.cer new file mode 100644 index 0000000000000000000000000000000000000000..edd135c7a9e6a1e1248fdbe53912c86937eca237 GIT binary patch literal 1025 zcmXqLV*YE;#PoClGZP~d6C<+$Hyfu`n@8JsUPeZ4gT~2*QU(%i%%LpIJc5oniMjb{ znMJ7zLHYS53eJv(LIwgLIW8VfxSSy`&;+0uHxEllYH^7nzX30Z%fZ9uUzD1jpJ&Kz zzzGsy6J`nxHWW1A2XWYWI0EvEN^%nOQVbOh#@%H>Ur zO2F`d2QVWm19KB2KZ8LNBNtN>BO}9^6${rcs{6ffee7?GDI0#c|7Ps@an#_|Qw5>5 zpQPEd)0|!&{@phD^86r?IairH&bD9v^2RxNTVKcgANEtW@HCqq_~F57;oJL_Q6?vB zKf7e=BPsEZ`q^`sTjy)l^?!`qT`);XzF~@h!@G+Xi)W-SUnsKfpzno>h_w4*NndV6 z+>+=Gwc5JymgBFm!0x!eo)Y!##nlPig|8iyCZ%fbpLum-C;wEtnHzRknhJOR{d_w$ zY)V4H)GyA03A0E}7*($Su)~CNs*0hA#Z7b7j$6#x#}mApO=}Nlw%K;noO}?r zG~24;YEHnZnLXm}&CT=FqC5) zW*`L-;0FsZGqeA1Ffal}u&gRbK*Kh3we z)?GKL?r}Mk`hEKW$$66U1>9auW%F-JUEw~n?b;Ss$==?hTsmUhm#1B^a#Y@2Qle*Rlr>s^a2{=CkeE@t3ZAd3lw8`ZSqb?_vhqo70u51m3A; zwzDqVnHj(Gp6n6^or~APuWRmD9+}U1*FN`6^TJ1}_iF#OwFYcmwy8ug!0PbliTNyB RFDICuk`!U#t9f!@KLAIsYnuQ7 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/expired.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/expired.cer new file mode 100644 index 0000000000000000000000000000000000000000..af5e484327ddac5c36004f3c945bf668814c8645 GIT binary patch literal 1052 zcmXqLVv#UtVrE#t%*4pV#K>*H&Bm$K=F#?@ml4QmoNg#*Aj8HS%EHVe>X?(5o1d0h zl&TP%nVy%Km#*OKXk;j4AOMo*;^BnL8}b580g7?+u!N)*ml*OJ@PfD;JZ%0&sp-F-B(hcOq zc@0es%ngkUj7$s-jH94jV<^|4vC~k%fDdFaGY`9KMFG&+DFfx!CPpP-2*87tk(GhD ziIJbdpox)-sfm%1Vdu9SGv)MbGVW~+cejb3?)cxMrltFQ|8)J{XX3B(+clP?WhW?4 zKkQ?*xP9loiumhx*NlCHo-X)wa_wjJ56-s#>T`GUN4@N=*GyY?Pr0fuS>%l6r{*vJ z|FMScV+_75tC>FK*QeLD&-C^;mYrkR#2LBsz=6|Q3+)eoKRqpLYx=CD0-@RkWy_EI z#%IrFT8+>W-ITk_KbD7r;;WoQ1q8^?ToMkF$;KAU6!2F&%7cU?b*V! z*MFhfj?J=1>rV1NHW1*vIOEWYmkN#HpR;e?t-AB_*KNBW<*&|tej%h*V$|SP_G{X@ z1W|i=w^w_8KBhXnEEdz}J1 z8yrE54E{IDMgK}>P1(26Mun=*)S0{w zzovZ>ZvWQ#o2z@98NX#C$EpSWX?{~o{EyFm{QZ=$tP{^lHP44TgU`>OckhLokwl*T&nu@tS-8z~8&s|1Ye5 zv+6hdkq`yJKzn=Z0FGNi7d(ynVi4 zkA-xPQGZx0j12~S?+9?9-b0j_9Xwg8Gi?xlg*+vf6uPDseE-UAJ=xhpv*0n Tf48xj{1J&y>gX_zk=X_SmUegD literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/missing-dns-name-and-uri.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/missing-dns-name-and-uri.cer new file mode 100644 index 0000000000000000000000000000000000000000..9e4ef3cde3cd05fb909ce62827200b32a5c1f554 GIT binary patch literal 1015 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 Zz_9Dp|69*IZBHC#jlZ9<{JL}B4FD>YcA@|P literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/signed-by-ca2.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/signed-by-ca2.cer new file mode 100644 index 0000000000000000000000000000000000000000..709889db19b2b174e41d56d6e56ed9b79e14bf19 GIT binary patch literal 1058 zcmXqLVv#dwVrE;w%*4pV#K>X5&Bm$K=F#?@mywa%pmDmPoPi7*b0`ZlkEml#Vs3s~ zW>Km_aAta5W?s62v!jurkbwY5o{NVQE^o*SGzBQe&BGFsT3lktZ@>%Ua`3SE7p11> z=NWPvaDoKbgqcEv4FwJOK^%4-j)454lAOf66hlP=dAKV$8O4N3fTlPk!mQWJFG@F% z6X!KFH83|cGB7eUH?@co=QRRy4J@HtgT{VCF#{2h!OT3oAor%GC?r)5q>Gyvm4M*@ z4_ro82IeM4eg=akMlPl%Mn;BxD;3Y(X4IQmXQdXJ)6QmJWRNqTEmpMIO8w@n*(MGN ziXmGc_X^9u4RQE%WYzAOE9Qn|eb~95Gt}d{K+)}WMX#<_*o6hASC*+V?lZf8p)`-F z_0V7K?BjuXO+mMIrylQMDOjH~U!}5Ddq>_|N&l#4_a{9`pIdyA@sW{su-w%!%g0Bz z&OI1#$_Y@AzZ8~Z%(&jOK2iB%7}nJ)LOSyHEP z+qFJoZZGpJL8d+bbpxmMzBWj{bf##B$p1oCCT2zk#>KS;)!_6X%g@O8pM{l~nf-Tz zfe|nsWmQ1}8U|`?9NKJ*tgP(JOmG$>8#_phiJ1k)U^OrS=@A6!(K66z11BLplqA%I zMGQHDxWN&`$lxgJQoiKt1*-AMzT`mUA`%xyZbc3bk)OL}s%a`W;nt%FjhBw#h81H#mafbG9 z*Nccc?K)_KJJmT4OE6wS8Y%$BScK4ToPx>##M`t(2BvX-aZxBHdFe!ug}FTuCv zHivgie|LTQswp!od{Q244hvkmP$z-uKEuPvCdP*L*{c^XI~;g&(;nFybLA#0$NtQ0 ZV_i4>{92YXIf)5E8;;F8&;7)w0svYfaTEXm literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/test.alamofire.org.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/test.alamofire.org.cer new file mode 100644 index 0000000000000000000000000000000000000000..01c404b34506facde5b7e4bc537e650549a3f36a GIT binary patch literal 1063 zcmXqLVo^3|V&-1J%*4pV#K>vD&Bm$K=F#?@mywa%pmDmPoPi7*b0`ZlkEml#Vs3s~ zW>Km_aAta5W?s62v!kJ*kbwY5o{NVQE^o*SGzBQe&BGFsT3lktZ@>%Ua`3SE7p11> z=NWPvaDoKbgqcEv4FwJOK^%4-j)454lAOf66hlP=dAKV$8O4N3fTlPk!mQWJFG@F% z6X!KFH83|cGB7fOYq^G{m(9!8vcE6Goh&< zzV)SX)ZO`Bac^$rDLb^+wD!3ji$8dZ@1=su{TXwtxElX6WquAheSFQzj8jjvdh!hu zBULV>&(jI}W1GE=b(J{B|NpNzqE8r^&R%5u{NKvTuSX=*+LpXha4S9V_tvs+&bq3} z+>c*Znp*7WYkFy(AtNNAzqF5I-5aCQJMSkczCV`pn>Ev=IBa740w$g5xgJNIrkwhj zH+%Vl2O69a)zKZ*>A6QfoiV#u)5l@+)gUkL?i{Y-f5mzGRxuxR=nyC`Sz|#>mRb&dda7F|x6P#F&^_U<_6R6ObN3kRB}qjW#Ulpb3i@as+XM zBZ!e<`#OFHnQr6Mz_Yo#J(Xiidkc4;+PqL^S=avLE)#{#J!;(&lYVHV?z`+RXZ=ic=an-owfVJZj~nw}@71>P zhQC^`M?4mr9i0@VmExSnvQ&f1wqaw|`V9gV&lU$9n7aD#y=i5t|C{dSZ5KcL(Q~J5 zLT6K#0?$$FRkxqrxS`B8mn*Gr_fpPdj4ORMUp<|mbmZVyj!l2>D;+-99#O}f#N7O} z%%W6<;LP;A%)E33XGbGLAp-%BJQoiqT;7luXbMn_n};PNwYbEP-+&jy<=|oSFG@|% z&oksU-~Ug(c=>rYN}h1uOU^=B5sm zlbaZofB^vyT}D<0<|amd27@L>E~X|%Muu~B7e2(DFP2UJcj>iZ-{i_0zt=X}O}}uL zi_I= z4G@^LV%e(6iz5m`&g_(km|Hv1b-~1y%^bOFS6S<%t2JHutZ$<8N3~GQWRL37f|QV5 zf7e}D>Ti^`?Z>kN)t>7MPjiT#J{fIz*JbBQ=kRlBUpx+fw^U)h&0OWJefjjJ&E`dG zHnN|s4;D!0Hg2_iGvVo;J~gISYt^MEyRAG{D*B<~sHIar6EhKK*%`rv-0j#1ubNzPw@S*@oZeS1xgV#&5ht+tXqu`;KHEYxP$SC`rU-oTy8~$p`S_io#YgUhl=c4XLc#p%{**7&-}NDJ(EkM f@b9xZr!4nfd%ZjPY1|&O@cWB>M6#Dy-B<_!xbJV+ literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/valid-uri.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/valid-uri.cer new file mode 100644 index 0000000000000000000000000000000000000000..80838d4d7c0caa339d31118862c0c87e0f1cc6d6 GIT binary patch literal 1034 zcmXqLVqr6AVtTiLnTe5!iILTSn~hVe&7-99#O}f#N7O} z%%W6<;LP;A%)E33XGbGLAp-%BJQoiqT;7luXbMn_n};PNwYbEP-+&jy<=|oSFG@|% z&oksU-~W-*SW(%JPs~=3)`|)J{ zZ@a*MUw#)nFPmymIy-v7rIHrAGkdf86(7e%FG~HVEa})aCDV1a|6|2{2?;ZU*D%p6|-%b2B8C$zVEEPhy0=$HBG zZp5Nh6PV1NiYGO&geko|wr`DB!Wy9|aw#5B`@}UlpF|7Vr2G6*In{1Zc~|j{PGgL~ z3G2YiNsFf6d-F~rdA-rXeV#jumh5|!KD*k=pNW}~fpKxBK{_}s$nrBX{%2ujW@i80 zU|C75W3U=1fb6N_2YUx&2=zFS)W^ z;_Qn!``$-ePR=g3We=>F)l?ytyX-)~;iv~p&E0PDf|;is&|t#Mxw(noN~;Qm zoGckGu!{<|O1TP4c>P_yQF}Xk#P+hX6Qz0mIxcE&8Rq9?*lFI{9T*(+$NTW|2aV6z zvNla|JE`=kPq6OMl-=>g>cz%wb=n{HH}C$>5LUzVEUW+b(P=90TUNeYbVGcX(y{9) ViJ}EcpL>p^?$Mta5~Lz?4ggBDYXblP literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/wildcard.alamofire.org.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/alamofire-org/wildcard.alamofire.org.cer new file mode 100644 index 0000000000000000000000000000000000000000..959a5d82d677e0a185d805604dc3fb5465f14e05 GIT binary patch literal 1054 zcmXqLVv#avVrE*v%*4pV#K>j9&Bm$K=F#?@mywa%pmDmPoPi7*b0`ZlkEml#Vs3s~ zW>Km_aAta5W?s62v!kJ*kbwY5o{NVQE^o*SGzBQe&BGFsT3lktZ@>%Ua`3SE7p11> z=NWPvaDoKbgqcEv4FwJOK^%4-j)454lAOf66hlP=dAKV$8O4N3fTlPk!mQWJFG@F% z6X!KFH83|cGB7eSFtLmh=QRRy4J@HtgT{%55(Z)*gPD2wwe(Ol50smm7?pq_0S{hA zRtDxKMt%l^CPpr%CPqevOl@{=DX#^g`;Wd2DS_>G_HY2csE!8`Vp;?5aL1Ul$_(DKY%b ztNkBNzL@>M_>%0J7iO`~j&3=i5%ya0W$0_i*9<>eJB~KXz6dM2A@l9mo=EQ^ft^bq z&Dpm$$$IMNqW+f4g~yd6PxO3cynm_gOEWVQGb01z;&OvhaEg%SXJq`(!ph9d{=31z z2pE&HsvrRk12r}dZ8k<$R(574IE#^u9VEuY%mQPu8t8%a2!iye7$~)&CxRw)0pzIR z21gAegVDxw58qxtX?$1a#Ga0}C&$|oAJp7l8agGz$2!9`=X}CL^{=0IsOuhbk+EBP z(0TsTV}Z68?3Wv??{j-M`{#qdw|_s?vEJ1rboLM{hyLo)>4y@OXP3Gv?QRyFXD@Z} zs@5|VPOX^3aTg1HeCs+`pJ|#u_RRY3Ykl%W8B7Ou{7SkW_Gvf-d~XO`8P zjC~XPy5CsNU%w+m<@4TJ`Od8(kEi7x_nI;5`9uaZ-7H literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-1.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-1.cer new file mode 100644 index 0000000000000000000000000000000000000000..ad75f0fc5419119a8f36aba983d42c13c6b18c82 GIT binary patch literal 1400 zcmXqLVl6RfVu@M6%*4pVB%q%5F6_1E=f2g~3l{xpxu;~n%f_kI=F#?@mywZ&mBAq2 zklTQhjX9KsO_(Xz)lkGh2*lwM=5|a;2`MTqE>UoFGE_5A0f}-8%fdxnD@sy}@)C0t zLP7!*{8CHG^NX?#l?)U>>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8Xr?e)pb%`8bxG1NBDgg8$LDi;*&sNkGhRFavNnVeXXnV+ZNSXz>i zUzAx=Y0$)k5>||?49rbT{0u;GE~X|XMuv$mLMC0}3fs7bSLN=}^DgNnGqueZ*D4n< z6z&PWf8>{zP``J*K-k{-1x4Ev>rZ;~i!Zl*yn!Y0-G9O9$G^1Mas9H3`8oNSN!3k} z?B{bfw=QU^DqCMT;rg4uyuaq;{JOuP>5E9+&wWRh>HF8utl#=4-MMHl55u+2*V#Ik z-}cXt5m{aL^l{#w8!MhnQn}@vowOtL@2i7*a<+AU=IfpHWOh#G%pVmV2Ci4vKIFA= zP55IpEl_<=`r%W0+p=G|9Y3zHV55BMJr9muOZ--TYIZYkdHv!{qla_4Uy;`An7uyI z8eK6;)mv82xcTluVDn*4H@{rFnZKrr->NYVceLpZe9OHpX1z|b)cx=i_IqB&9+|z~ zb>^eRQ7T(@tqik0pTFwAXT-h_EB=4kvG%3;?_E2-a9jO+;p`;Wd86gD@W-3GA9g0} z=+OvUBO*J8>v`ep^L%%0S58~#vDfDN`mMZ5J_iIF--KCzyS(U8^!80GNaN+QxRXU2R+|OyuVRJ3p-z1^F zk&nQT$}{_BWZ$b06!4^&QvNEyh26!5W#v54$m zU&mzoYuQJemcF&`EM~m9X=HQ-oQP%l85#exumE#yn*l#axiE;&YQPMn3#pvFxko}c zOOHQR=ZkHrGQ%Gu64I;-<~_|vo9`t L|Is>Mz#<<2E=x9y literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-2.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-intermediate-ca-2.cer new file mode 100644 index 0000000000000000000000000000000000000000..7d7e8f271e43b37257755ed76258f83533d2fc98 GIT binary patch literal 1548 zcmXqLV&gDqV*apznTe5!NkCgK@72vxvmBAGyxWUwde{wk**LY@JlekVGBWb8G8iCn^}^YVyJDP36f(LR)Wd}1v@G@rxulDre!84 zmSpDVDL9svWaJlRmQ)(ZiSrto7#JBE8Gu2QIIoct%l>tM=+0mehQ3*LT8Ce;an;7{SfZ|+C zO^l2TeTSGNA1;Vo^4h|*SLZL|h0C4?QjT*cvAT*`typk?hpArn%tZKZm_Od`*m7q{&aV)n$~Wm>Ajm<9!v|rP#}>ot^b`a`{cO`cb&R;w)*7}tyvn1 z6Mge1`KvDdRAqWs?T*{h3u_`xd;a@PbPlkOoGh0UsQ4~IWc9z&fC@XG4Ki)Qzp`iS zd0;(7t~KZm^JEo?ywmD|uFneYsX8y=edx9H?Y6oTXLH}_$*LE}-f=Z(SoL_5Blr5f zF73B=K9!zZzwT*k(^4j8Mh3>kO^m6)5J@zU2Zph%GK++PScAy!^>s|Pzm|QpY3W=0 z&SJ)!n?^=g3}itH_*lePL?*1yvYHabePhBap|Iln&ReWBZaoL5JXwB5#{VoVz?9u) zAOun_4B~SbumLG1Mh1uxsw`p#B5WMmY>cd|?97aC7L$QANQ(lCh=Gs+8ygFd$zZ_2 z#+Kg5!^p&F-~*DBXK^)fHgH^EzreQ5I-{hdz)D{~xhO|3IX^c)B|kY4#L$PN5@2FR zNz3r0tOwL!PzbY@k&z|UAlbkg#y4PU(}x>eg2Q0Pl$4O7(&7?lN1$OP1}bpPjBOH7 z&H2g21t_|alOix&>YDMx+oW3Enqy18ignT4uqBKyHLAs>l?!)62EY2D)#s1!8 zy%OuLo^b8Ag>_ERqA5R|r0&1XXX|l2#Ky4d$%{KTw>~Vcc=Jv9&c(YqeNz2PUxn06 z+kW_8XkV{q+@F-)=k4}Rd!2c9{{xSYNlgMzdECN38Q;2aBKhqx`6;Z^yrd>x{QmlU zf6zK!j+=HX76iUL*j{q={z9+*dKSQ|d&3)hX>v9@we zoI;w^(w)n;S|0p5!}FgsLtM84&_yXI1PlgS;nsZ2K} z{M3DAepM>rLb}5B8&2G=>zgv}-Az+5pP)HK(oIrzN5l2gSK2hPTnf~blUB}e%iq6i qLcyi5^45y?uT)oxp9?7JVX#{D_;#|%{2y$EjE|ZWuKdg2yAc4zK1JmK literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-leaf.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/expired-badssl-com/expired.badssl.com-leaf.cer new file mode 100644 index 0000000000000000000000000000000000000000..a82e960ee80f5becb02851dfd6c45c0ac7515d60 GIT binary patch literal 1359 zcmXqLV)Zs?VliI8%*4pVB;fUYs^_m+`|Jhy#g|k(%;YrSW#iOp^Jx3d%gD&h%3#nq z!I0a4lZ`o)g-w{r-N{heKoZ2^5EgPTN=+q3M+KkE+{}{H6hkuu6ObIUur5?CDA-ZKB|kSYGfyEb zF()%6u_QA;Pa!xpxwI%1NEMXy+8$9Pm!?@p-jr%K`p|Z5w_Toor+J8RHl$tX*Gt#Cy-n zDS83s%hF{Md%ih39d)}b)~-Ik8dr6F=(!*Ilr6)gItHh?Mw{e%J43GM}#lO41I}|ajnZ$9k zC%h%Nk@fVmf7u~39MoHn3+yf~c%LcZ$nF|i^E1WXR_E}_n%9%1eA+IaYGq<(WMEv} z#CR1LA{W7tAgjzGVIbBZGGTp|)s!gi8xvj$g%#g--eRS3>$!m}FpOpSSj1RF=Ds^v z-N?eSD`-A>&r)go-{8a~%g@O8pM`~)iFJVi4@kK%h|gre0MV?s*EpwGlQN_`;h5l~N zeDNZRJ*85w%^t`v5fFWI%UHF>dMnp)Mhjc@zY#ajywc6Itl2mHJ@+;4i03`^`#1Z@ ze%?NzVVPNtNc00${@hhO7FJTQ#N^XPhk4o&iz4}DJ>I_-v^(fEZ%=Ay?y<%1uU?sU_TxJB z?@Pi(Y^FG}R&_5lcfbC%_RgsC%f_kI=F#?@mywZ`mBAq2klTQhjX9KsO_(Xz)lkGh z2*lwM=5|a;2`MTqE>UoFGE_5A0f}-8%fdxnD@sy}@)C0tLP7!*{8CHG^NX?#l?)U> z>X?NkG1WOcDg@={ml(*2^BNc!m>L@x8kkrZTSSTT8XjN?rvBY=YQMRKuAJRO$F&7v$3OVnzc89ta_Yo{keA2e z`77qma!f!mNNh*Jt^yXWhK4aLSy*%>fBq$A#xwu(vU-c)21|O=7}o zpAG)XtF8Q7ZrndN|6ykS?(0t1vt6DXU;8fCF}^6Oki&d)W$Kd11yjtwGwAaknpAY_ zf<@77krl2-Vzp|wZ@G5l-I}w)F56FP-*skC{gt>gGb=(_aQkxO{;<->uV*!{yKU#v zPTh9dDPMHcj_TjoB)8i0+;|888*y*(5iaqn(`z5X>60`I?kALv!$}}rd+fLyRuno|Argo zyVp48xF<9RZun_r`~1&0HR0n8VoUc&{b@g6QQ4_D>yZyTSDWdcPxk_kT$;B1PMzPo zg1<7BuX&gPMRfc2iaj`Z->vky%Gx(yoVK)1E)YoHHJ8oQOX9M2)tNx2g;mKHpY2|F zRQr(GK4IQxdz0%btCw@~I;_sR+uwEg+qWJmC)U6#u3zUbPg2YfRdBYM`MhSY%8iv1 z#fv-a!=w!@B(@at&pLa8Z(g6C^uwMR&8OuJKf3rFV=4A5OW;5LW3PBaw%*G#K73KL eD)|+-^sdfJR+9^zH04HT!7vVoFq5;Rp`ZajNQPaQ!zr~WJ2fY@(ooAl10=*HtQeA7T#}iWuHc+nRFavN znVeXXTC9+nr{I{An49mGS(IuZC(dhVYG`C=XkcVuX6C)$ToV}tZ70wnBr+U}l*8bzo>F8YBBg8;!~smUdzShal3{mKiw zW$rKDX!iR~*MVgBSeBpF5kHs}KB``FXH#BSZK`X>v05R%w@i5cWJynb=A#}z-`5q@ zABho9nHnM>sl0AYRm_4HTfg@tZ{SE?hF}&z|Qx(p7TKreV6-h6@E{wyyk}m%XF&(C&tHVOMloFUMGT$*cQ* zDBEH*cY&gNpH)h^k&wDZ%aRW?UenW4f{@X{^sd2 z;Jdax-rZ%j^#p%Z4Ue6+t^;7P8ORpo4nB9n_N4y~0qnk-XZlNEX=WRA?vOvS*SqE9CAmmHJ- V-|XpppX}Djx#&}O&ZT(4O#m_vZx#Rm literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.crt b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.crt new file mode 100644 index 0000000000000000000000000000000000000000..a9a2bdb609daa7e839322e15a54b17a9b1fd2fe8 GIT binary patch literal 1016 zcmXqLV*X;##B^r?GZP~d6DLDgW5|QR=&l|EUN%mxHjlRNyo`+8tPBQ`hTI06Y|No7 zY{E>T!7vVoFq5;Rp`ZajNQPaQ!zr~WJ2fY@(ooAl10=*HtQeA7T#}iWuHc+nRFavN znVeXXTC9+nr{I{An49mGS(IuZC(dhVYG`C=XkcVuX6C)$ToV}tZ70wnBr+U}l*8bzo>F8YBBg8;!~smUdzShal3{mKiw zW$rKDX!iR~*MVgBSeBpF5kHs}KB``FXH#BSZK`X>v05R%w@i5cWJynb=A#}z-`5q@ zABho9nHnM>sl0AYRm_4HTfg@tZ{SE?hF}&z|Qx(p7TKreV6-h6@E{wyyk}m%XF&(C&tHVOMloFUMGT$*cQ* zDBEH*cY&gNpH)h^k&wDZ%aRW?UenW4f{@X{^sd2 z;Jdax-rZ%j^#p%Z4Ue6+t^;7P8ORpo4nB9n_N4y~0qnk-XZlNEX=WRA?vOvS*SqE9CAmmHJ- V-|XpppX}Djx#&}O&ZT(4O#m_vZx#Rm literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.der b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certDER.der new file mode 100644 index 0000000000000000000000000000000000000000..a9a2bdb609daa7e839322e15a54b17a9b1fd2fe8 GIT binary patch literal 1016 zcmXqLV*X;##B^r?GZP~d6DLDgW5|QR=&l|EUN%mxHjlRNyo`+8tPBQ`hTI06Y|No7 zY{E>T!7vVoFq5;Rp`ZajNQPaQ!zr~WJ2fY@(ooAl10=*HtQeA7T#}iWuHc+nRFavN znVeXXTC9+nr{I{An49mGS(IuZC(dhVYG`C=XkcVuX6C)$ToV}tZ70wnBr+U}l*8bzo>F8YBBg8;!~smUdzShal3{mKiw zW$rKDX!iR~*MVgBSeBpF5kHs}KB``FXH#BSZK`X>v05R%w@i5cWJynb=A#}z-`5q@ zABho9nHnM>sl0AYRm_4HTfg@tZ{SE?hF}&z|Qx(p7TKreV6-h6@E{wyyk}m%XF&(C&tHVOMloFUMGT$*cQ* zDBEH*cY&gNpH)h^k&wDZ%aRW?UenW4f{@X{^sd2 z;Jdax-rZ%j^#p%Z4Ue6+t^;7P8ORpo4nB9n_N4y~0qnk-XZlNEX=WRA?vOvS*SqE9CAmmHJ- V-|XpppX}Djx#&}O&ZT(4O#m_vZx#Rm literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.cer b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.cer new file mode 100644 index 00000000..d22b9abf --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.cer @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID9DCCAtygAwIBAgIJAIqBVOBRW4qMMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEBxMIQmVya2VsZXkxKjAoBgNVBAoT +IVRlc3RpbmcgQ2VydGlmaWNhdGVzIGluIEFsYW1vRmlyZTAeFw0xNTEyMTEwMjA5 +MDlaFw0xNjEyMTAwMjA5MDlaMFkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTER +MA8GA1UEBxMIQmVya2VsZXkxKjAoBgNVBAoTIVRlc3RpbmcgQ2VydGlmaWNhdGVz +IGluIEFsYW1vRmlyZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJy9 +FTR4QzhYyo2v2yv8SwlBQ32MHQF8Ez1J+YBsyZjcTVOGJtyPxrbJxGuRhyDzKUqz +X/zTsT+JPvZQXXBmyq0l0DhCcK84cHyVLcdEAzukam85EpJRWzSg8kDKzuTx2oLk +X8Zdcj7EEtYWV/5+/YahM4tXYhg+Lqm6koJEVHMld6zfedC7HN+jsTb73IrAY0dd +BPl7WPgDIPEl0kcGI6F7NS0+CKsgX412E5+TGUkvA8VI+e9+cn/EXBdklVQQGSOu +rHpcoOi1VqnQI0hGXlFi4MpamwMG2yArIUU0TXZ7G+/AbUYiGdB6ogvg5UTCfyZy +UXVljSJyzYmLs7hXQK8CAwEAAaOBvjCBuzAdBgNVHQ4EFgQU9EaWHrJGYvpCEW5f +CUEMRk9DlN8wgYsGA1UdIwSBgzCBgIAU9EaWHrJGYvpCEW5fCUEMRk9DlN+hXaRb +MFkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEBxMIQmVya2VsZXkx +KjAoBgNVBAoTIVRlc3RpbmcgQ2VydGlmaWNhdGVzIGluIEFsYW1vRmlyZYIJAIqB +VOBRW4qMMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEeHeXNZGHJW +VImbOHrYmSsZ5jFnzjGw8ynkOrcoJzaxg3OHoo/pNCQ7KcrIa5YPNFiNoaSa/Lzn +LBt6HkM1Vi1rMaERHLWp/W5ruInCu4CuVtQshdNcOEofJ03wdrQylOBZq8MZkTVn +NcqUFg/sBANM/9WhafVi7XaUjWl+V7ZnzdbKP/ywvsiJ+wyKMA7Wt19HMrV2dTBz +CD4vxpwOBev0oTp2NvAHdgNkeK52skHoz+MY8uivVJQr4hqLYJPXUyAcVZCaqeK/ +hxDkbRo6eZsYcjTRqMKtGMVjHHd8alXcVJwcuWkhUYxy8jRf0kFj/9mMie9jRokJ +ovKLbNJfEbI= +-----END CERTIFICATE----- diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.crt b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.crt new file mode 100644 index 00000000..d22b9abf --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/certPEM.crt @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIID9DCCAtygAwIBAgIJAIqBVOBRW4qMMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNV +BAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEBxMIQmVya2VsZXkxKjAoBgNVBAoT +IVRlc3RpbmcgQ2VydGlmaWNhdGVzIGluIEFsYW1vRmlyZTAeFw0xNTEyMTEwMjA5 +MDlaFw0xNjEyMTAwMjA5MDlaMFkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTER +MA8GA1UEBxMIQmVya2VsZXkxKjAoBgNVBAoTIVRlc3RpbmcgQ2VydGlmaWNhdGVz +IGluIEFsYW1vRmlyZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJy9 +FTR4QzhYyo2v2yv8SwlBQ32MHQF8Ez1J+YBsyZjcTVOGJtyPxrbJxGuRhyDzKUqz +X/zTsT+JPvZQXXBmyq0l0DhCcK84cHyVLcdEAzukam85EpJRWzSg8kDKzuTx2oLk +X8Zdcj7EEtYWV/5+/YahM4tXYhg+Lqm6koJEVHMld6zfedC7HN+jsTb73IrAY0dd +BPl7WPgDIPEl0kcGI6F7NS0+CKsgX412E5+TGUkvA8VI+e9+cn/EXBdklVQQGSOu +rHpcoOi1VqnQI0hGXlFi4MpamwMG2yArIUU0TXZ7G+/AbUYiGdB6ogvg5UTCfyZy +UXVljSJyzYmLs7hXQK8CAwEAAaOBvjCBuzAdBgNVHQ4EFgQU9EaWHrJGYvpCEW5f +CUEMRk9DlN8wgYsGA1UdIwSBgzCBgIAU9EaWHrJGYvpCEW5fCUEMRk9DlN+hXaRb +MFkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEBxMIQmVya2VsZXkx +KjAoBgNVBAoTIVRlc3RpbmcgQ2VydGlmaWNhdGVzIGluIEFsYW1vRmlyZYIJAIqB +VOBRW4qMMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEeHeXNZGHJW +VImbOHrYmSsZ5jFnzjGw8ynkOrcoJzaxg3OHoo/pNCQ7KcrIa5YPNFiNoaSa/Lzn +LBt6HkM1Vi1rMaERHLWp/W5ruInCu4CuVtQshdNcOEofJ03wdrQylOBZq8MZkTVn +NcqUFg/sBANM/9WhafVi7XaUjWl+V7ZnzdbKP/ywvsiJ+wyKMA7Wt19HMrV2dTBz +CD4vxpwOBev0oTp2NvAHdgNkeK52skHoz+MY8uivVJQr4hqLYJPXUyAcVZCaqeK/ +hxDkbRo6eZsYcjTRqMKtGMVjHHd8alXcVJwcuWkhUYxy8jRf0kFj/9mMie9jRokJ +ovKLbNJfEbI= +-----END CERTIFICATE----- diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/keyDER.der b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/keyDER.der new file mode 100644 index 0000000000000000000000000000000000000000..969657d561fdd4901b57f95c9d509335fef9149f GIT binary patch literal 1192 zcmV;Z1Xueof&`=j0RRGm0RaGi@<7VYT?F}iSoi}V@g>qn1|y++H7z~}s~}&Eb`zhI8A&e##Yp+@esX`rTo+`O zR1g^>uB>`opy;($sn8=xMqW{3;L2K?0|wh5DrZI@!}QWtvT>*jO;WNqeIi7x>S4OT$bZ`x zvNczIX|&u-A<40-pbpjC{m9oGOf23mX+4o5fYExP{d; zGJ(G9d|848aah}t%27%APx8K1)U2oYrX_Z>jjTukso5s26+Pby^s0LzpBxGU^t1@V@@MK+P>Zx0#`hoHhJJ9Pv+ zu2}wruS#Cc4A4*WjNN9!C*8+io z0L2+&mvfMI=onw{L{9C4>sJWrVJIh3v+rvNSVFze6wZtVqjAB!!H;OYyO0?AV)SRK zQ`Yw4rZ$F~6ai2LhmMk837ev$1(@3@Y-H8Ur;F{0o?T4SVd;0ZxhJadm+bz=WTga} zBrBY>`{2w-j_>e#yyTr>(@Vc7RO5kQ=>ma)0GktpG{fp*3ld zf-zEO^BdvLEP}yz$&6L$MtK5b(KCLR>oB$Fw<_MSU8Tg@Vh^R4AvT9nsl~r$=Ydv>0~^pc?XR>{*L-SKCzAt>#v%t8!Bw2Rj zq|5ViZV=0+HLCdJIFbQsL75)%ea}Lj?lat$27Apl#QwyL!zk%aK>|SwuSC;2T-`Q(3 ziwjdtF8ze4+OU|dXCGxL#O4jp-)^E{lI!uJEGkvIp%UqYtgdW zGSO57>g8>oa2-!Yb!JB>P8gb6L+e(-#>>2PJqfIZUrNROa^4UT9MjdPbtD`>)P+#H Gr7sXSPD%s- literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/randomGibberish.crt b/Carthage/Checkouts/Alamofire/Tests/Resources/Certificates/selfSignedAndMalformedCerts/randomGibberish.crt new file mode 100644 index 0000000000000000000000000000000000000000..23d1360db50cee1c187393d79d496a0e65c00b5a GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Images/rainbow.jpg b/Carthage/Checkouts/Alamofire/Tests/Resources/Images/rainbow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..91224688e903ce6a71dde6055be8c85c40e55c01 GIT binary patch literal 16104 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

>!eq|SSG5b%m{<7>p*+qr53kMe$j7xB3 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/Tests/Resources/Images/unicorn.png b/Carthage/Checkouts/Alamofire/Tests/Resources/Images/unicorn.png new file mode 100644 index 0000000000000000000000000000000000000000..bc504e55c52c14246f7f86adc729316535b24cef GIT binary patch literal 41646 zcmV)4K+3;~P)2haD^XMO(dh*+Q4D|Q7@5fG4G0wIM2NN=0Ey_ehDl>a&3 z%-!7-5LB9E!pALp@7$ShPWk=LIo}!eCal8A?RBv=(wIx*P8!z9>3C%}`Q#M5Znn45 zSbS1BPAbUB?f7j0jsHiZ`{Y!dRFIR~(c63)f1=^1apdH5oK%ok>byg*6IgW*jmb3P zG`dcT>`4WArM63Ge1?Yf8a%c|H2z3r;}!!}t@9pxk3%O#_N0Qm5}QfmFpV$JxSvMT zYv7nTO7(Ucchh)^4)EVBSaQX57ZgqC@E#gNCq?#^-PAYmxo@PgfyQ|>9-{F92hO|_ zo8)kc*)+~{JjOyA6LeUly%qu?6{lVwfkdBt@P7vBLP__Z6xWjq@=9!q<1yGGKTP9P z8WU;!j>bo5{QRH%dm4>O8V&qA1e==aaS80mRG7Sk#&KK2(VDVG4Gm{|G5@+CO6Iw6 z*Ll6XkABC~o!m|;$SY#K|C5G`##S16elFRh{ih_X!}NH^Kd}EWjX5-C(Y_WDhiD{^ zP%S}fB+XQ0`gw_-$ciLX)e})sLVqcn7LUcx>(fwzLjx%Ay7q!3|(N~((} zUO5SSXrhWxgNCx{8iI8S0yPSJl``C6QWsf*;+7zLBwI~&+C!Qch)2ejA108=nB;;a zAMN{VG^$}I3N432?V_=l#%_mKy%NU7I;kN4`rFeq4$zn)A{B&h2F_40w3L|gPxUBC zzz^x|l`n!6{~L|>Fiay)5nu^bi8NHrc45jTK2$AqqilwTz$BIbV9SVbuSdOIHL+Yo;?ez398h@s-|7B8^chcx_VChK(`4`_9 zRy|%+5Q!wt6$6f3M{sAWh3F<@2IHw-1 zxuB4D5DdF0__-HpcsZ^}pWSdn42eO5$vN%c693$af?$OLS(9MWezU_Sdzf-knpLDo zs|c}uh7@M2WJkg_IYyxEADke6&i1TBSNf6G`!Aa=HEc){uGUCinzhkLn25p zr|oKjLwijqaqDUl>0i>Ho;l`wZ=>;T8Wk+KE@Bl6t_oouk?QirE?b@Q^vw(n>m{NQ zJ`k^hZQqJv#~mr*Gu$Bs(^q>j;S3MKGzETA5XDiD%pfTUDapwG0{XV((Yv+a9XVK7 zrkmC>@@ULm4$|1;K(UPu96Rj5Oyh3^78uT5MB@q?r#at!_Km0@kJ6~3(Lv+44nE)e z1~~Uaj*uuUh-#81BPSs_OUA&dGOF)0y!6Kp)8DTg_nm8L{D{O};&5#BEH_r(7(v5D zUR$`+*58lN`TIT@2mh4Bn$HY@2n-fn9mb-Mh7g=Uhv;@vR;KeC^!XCGnB%m>Z|kI# z13L>i@@NL_YjX5F-xwR#8%aqnq+!vgv-IJl<5dnj&pAVX1a^>uladi9$WRA66kXhI z=eWTeE~0Z2Ruzg+t3b0(m!U_2^?Q2xef(=@ZkrwBK$MvTYo&^P-*7|DTJY~SG2_2; zkWB%M7C0pMTpE9&*B-XcbKV}n8DA@byH2%9wKY!A@e-*l2cC(PAG$q-d#>t-L4N#A zKZ|18RRP=97p$X!9zVBC8;(ixctT=x9ln}$9(`N$=vbS>;RiD4emaL-%7Wp*HOao# z&f$(7wAeMh){Z_xHYBs&AcphkOLHD3zt4aap1e4NsmtPswHtwSURy?(_DaddpX{D9 z|Dxy5@S&0gCDR~d=o}3S+1Nr9C& z&BT0Eb`26QFYS@TxWGY9u8WVN0uM6KB z!m95^aU`WU8;qYG>I)CSd~1X&Hr*l>Le>%SU8I#4XVe^)c)98GoDhQV` zln{wq(R+~GcH5(vaQ+HJ7XJsPT|Nok!anqFACfYO5n)3`b@eUJYy| zqP#wXgAZkpJY=B$G!N8L5;uZh@JZ<3oW}!K4`9=8;_wF*od2CDPW=k;86SCrjySBo z7_80#SlxrLdTET%d#SXIvQ*Vp0FhH6xD_XEog|NwBs84hj3*s#NrVE1jnL*H^Eo0iAN|9?Z{rx*95M%XV5D0PTBh_S$*y1G@ZsxyeZmz& zK}dE7u69E&B?Tdwnnel{Ae97nByr!n`_b8w!yLzJ)SpIzyDtH=Wdv4# zirg8wkb-V2lxf;Zm?yrGFW7+4=W)CXNvuYYOJyhGrq8=d>DxGA4 zo_8lc&eWQ!Mz z&2&-_uNns_;_?5MVcliH9bEGx1*-NF%)I>1kONH!`ZZL~HgRB`B;YiO11F^(l);=pZ%R4&C8;#hY0di6QnRC5#`ZH;3tvAKU^yd<*1qC#_V?o1fSST7J72f zg-Uw)Y=0IFG&fO?H1_Kj!Ie6tm;vW95wva0;?6hsp?a|!J8wt&ep{s5FD zF}%$rXC{54jAV|8GQ%;+ume>fPbK+P0hKJytB|r-L;9G@66tmF1bM@@?>c)ACqTf# zXq`Trp!f1l`rbvqLxf!N(iJ3SII`KohF<`!doZdPd1o@6DAzR09;0!BQ6y)FiaEdX zR~q*@0gZpw#^L6#()iM=P11`SmnwXX3At&ic=+4(*nC?WntMBj+FZz3K1566Xg)WG zfkSSzYz~#s#s4}@*7@|kPvF%_BJs8S57-&;|9y$y^)R#)AbX}NR7Dn%APKc3JW-c| zJShmjsyGKc+f3v)`Oqg9h$=96QDLs4koMgjf%={q#)n%%hQ zwsMrrCHK=$5a|$!Wd#Xrm0LuutR6#zXf5_0hAq^Vl(luiaza&(q7=i!lFRm7BE*}g zs@bQ+npA6+-C{Q%x)q;L#T~plq6n$(LV=k|ncHII^@U}@tqTd8*v4tPf*N^K zUk(p;N~9caXzH=yTnQ1I8w}aNH)*l8KRyE!&;AY`|J)9A z9E_BzP}uvN4ZHisE8$JT4hGIU6U^?IEm+5k{Qexae)%#P8M5ZGF;=Qt=274wNF!A$ zqw>llnb$BSXpzja_`X@?s{7vF1ooE z6VK%MYfgxP)$T|jlW3PIyovz6dC87avDe_MRZ7Pda=;LA469$aL&8FlY+>eddd{y% znt}`|>u{SvP)f(XM+zA1FyINun6yMi^EoOeuaMymIg-G2W26)oDVUYF#!zd~b8%@6 ziGhpeAkx6cYGEeljmWUXh?gBEu+>iL(04$R5+j&HpO{03a+#A$Njukzy-E+pRE%Su z2_z_4<^MSS0vW8#Y&m;jJuV-0wIFZx$8Cuz3>iLnE#QDZ8XnfZo z+3w5ftg;;RhiA%Soc_&W4DGuW`#1R*7SpA`|G_R7|Fq*;UyiNcamNkg-h018*mu8B zjt8-F1QMC-=lL^+9bvQVW0A?2@Mk&aQ%-Qae1=8P zocW4{p;n8ORYDJe;Y7bh@6o&@9eq?dEM!Bwx_KsQt4uudQw@o@nESP_b~@pO%H5xH z@&tFNFe@`D7asg-30C&sg{kK~30LhBSlNE`Zf?Q8hY2V?{3T%L@FhrjFN96*o%aOv0^Gq1P~$ z{fUbH9*G5${H$1#fY+*m@U|ZIqM+N^lVp+_9{x@}*8VI#A82722Ju?@{lm;=Q^Px(;l@MxdOZ) zKURJED%|nk-z2gd!$^Mt4}Q8Emw>-l+s^`rU$uNVOz{{iG;)2MR?=fCG~KUP`i| zPceh;KqDI}S>vGnI1a&%AV-SPQ9$8v7G{z>6&V4UgA-9N+*QOPtB8yF6mcHx3D`@B zXd0(n{B%wMdS2mpI>|Xqd=zP4a5S*f6?|4u` ztX0CMH4?V%7|p|QA?cRax`Obw*6}2_lI@r%lCUWc+(bT0>I$f<$YSE645nW7UicS& zKzw2Ljpw6c{!LhO!xpse4$=v0=hAmMLh*UnRl@&_&12^=h%`5n?>fta(9KB(8&kP_ z#3AhCHx5UC*S@?&DzEXwASF>U)=>c!Hwh;PkXi|LxJT^D*I>PB*G?7wRyjLa$36q8 zv?;1#MT){;Au~oRJ_=-cD`rf>^7mhkhrj$YkxcB|pT?SR_2B$()I!RVG?wP=4<}r< zFnUZoYu;w(NQ7c27_YI8*Er^N@zh8ljb0u31LQFV3MA7CEDaZqf*y z_LU(89Hf0qZsB#(X;E-2CZ|A(L}(0*%5wDaA!3ky-9+enEhJO6-mBx|A+Iw9fkS*R zrSW4D^mFnV8Ebx83e{y|)@7Zr26vGAy@1a85mJyaP2PMcP4CCbuV+y;<(IhkhH|nr zBEQVuXc>*q(YW~^RFEnm0MlGBt2G#<3e;|1%EWP?qm+ZamYaD;dYK#X_Xlir;y|U* zEU`#ENZ21Uk!85mZHh|Yk*NK-ZNqtlR1YF<>3C1VA0grC-aLK^pc^zZij z`XLjAHX__*Zm9Ld56Wc$&+^apkw6#7mX$*Cy6u%9%r)W$j2_}A#HFkhjf`RMOL1}` z#dA>=5ri9eHIvhIPRd67w3IMSk{<1j(Z82wJxo>%r11)3kOmdTH0=|>-r5yWk; z1$gyR6{Hy5`gevZbP30gi>ZoI z3btW}D8H~s1VjPcg|I6{TmFt?XD{J4-3s)XF5%I}v65nB>%FjlhYK~3UF=5e3#7c9 zBXAhFEnkvTMkOIa9%N^ntR`Jd?T8_iZlp>Up~oS*$lU}ZBJLA6q%>(h`nTul{4`8F zcOl|!y<`f>suqqfNjFGRqK$P}bk%A+@%>xD#VLJ9(%5s~Fy_qmlVq#5f{f=9(y^Z7 z1n*&tlj!XPt%fDIrW2IpY&|(8b0mlCx*joK?iJMpuQZ_qIzceKjkw9Mi2Fh&;;hu_ zP{PDFeOa52Fu{+LAsP&jS5XMArJOQ(QY=-*p6xoGS)0cQdENpnM**ax)^kZtB;^G* z;}u8|yle^rr{0FiZXeC@M;K;4{)2MFdtI1%YAebo-zf4VIej9!x5lyWK@VEihRC>@ zsHsn)VX2NC_jr)Z`az(G!?cSX0{`omcpO&?{?Y70VU`Q(LBiI>#t4cqh*#79zh6|2 z+(J^08zQhGvJI^qL@YT1X4z#==q66mP0HgLAgkMBh$xp)V^`vuL^5M}>%`4($n#`L zxJC|AE!vQP8~zTrNN_>Nx@(5bLHMP4H(xQ0Ro zL7U=&Qc@6H!WfWA(Y)kMXn%wntgK@Hjv(qZmmJ!r-+AKR40dj}^FMAnfQk|sD)Ba* z<|`SuP^34uKeB}4C?~$I#bw{GTLmd%M6QwPp((qb2$y%`A0pU#X9$|lUc_T$#=FQ%i1p_Ar5?n;NXii=(wTeyU>K`R3we)%M}mjol{!dJ z>uR@c1G)2wq#|cX&zoHt-mk;R5qBYM?kNet9rlZbt3*X zojc>`e7t~$vx6*o$9oCu1WIyL#@mTk6GGD_S)*%7%yOEJckEnij-p~ zDF+dEkOy!z1fWiK32u_x0XwAY6a!1eauc-}sE~w%W94}4&J4EiCiv-+F^S;rj0GCX z*y}PmC$`Uligc3ZhpXzlB=mQghz-+-TgM6^%hhAAc5?8ap&;XHw>sz&{FrE7sF0VC z&y(e#nG2K?TnW>KUL3=e*54XkiESOlX^YRf zd|f+W2tmlL@Hk4vW$h}G1)O+Q1kL2Yt^!?I0~M31#9O}VQa&1?2-fpx2}iZ2u3Chx zw>^r!gNLD$mpbtH5E{;miX4PxorsJd<2g>?S!BO8I$O+n^4o@CCJlmHQ7DyuL9`3| z(lCcO_d*7yHUy={hr+I5=zUpR$yftqr*y>{H~r4JaD;2!gK6y8ox}8IHx{jQqiTX` zpDQVaVQCo5H6v}%JOp%U|q;ba~i87n+wgPr;%HfQ& z1DMZ?!nlGyZ_hlKsHJ%|5LAS*aaCrP&ZM^Y|_z?0bRucAD8c zU=3{)fv8#kxd6-GnJ8X{;>OwVM_}K>skz?!qBRyx6uo#nW8qhIH>Jnrut znkN1t9E#1mW1YNzD8h8k0-u=AF2I)cxvPOh{#wBtfIvEW` zu~0un#hb45;hf98h!A(N8|7hwV|>qky?c=Hp*a@ln`z3=+VVgUxs;5vKRf_$)PPyw zAb1>Bu9w8T4pMR-VG4*5lH=yTno zh>_tLZ(&l9uf7kCY)Ufsh~Sn{1{keIc0vw$gd((U`D(f||Y(;!jW@BO?sWc#jPDG`x1NeRXllL28W2xX?8`#9~{*1#Oqx_ieX@G@bGgN ztV?#S4G?saaqcJj5vfgzDp3STAd}=pdLKi&XAnF7qGIFkO9`4}F>QVUQ&wiN`4%q* z2Ll`qW*c^$<8Jx31RoZ?o2I!@xI8F4hvk!@ZQ{}w`$FoAyvSb{A?WNhN{}R{57fAD ztY(KEeYcK?kZ=0BFyx{j5J}he7m#^-&@SjBOBd2?pX?v5?Lh zd*tJ)Y4nKS645rhi|VFF;VIjMd?tjR?Rj);E5%64jc`cEng2B(i$8iX)anrG&-f+vvd2b+(i_p>FLRT(u@J0w6K~Pzvu=cHx!08kUV80| zYVbr|kUX4uH(>P@9M3?<74|^#YS0fR>?LigGFr^Yo#nMAGCVOaj2>+?1Ai1TAK$Y< zDi(J-+(dT%W--9j$U(=1Hg~6Hl5$LeTT7zezZntbFbV|?xk3O1*+-vCAb?#++?4wbzl+8LuXhD0hU@qq9Nh%BuFs|w9C+G~ z{ZIR0_b2B+`%zM+W5oqSn0Y}0WtS4|D7E2c>198~MNL1z(>LCQXKvHzLU_kKfM#<7 znSD!u2>R9(lomU7%U;EtMX)Plje3rw)T5XtAw`h;#*%m5?~cHjO~Tix!fe!pN8mP| z^Q&b%GiV{K+1NU)QYfL zeG+1Q{m=_0^5g+52Y3z-(&It%7>aHKQt}T7g?)(B`w*=0AUY+0vU(4AHE@s=hpC3f z@QQ@i7|PqqQN)`xnd&6=EP3di@+h%)!hJ`15X(BolSpGBK#^-QLeLEjA$KnZQj^e? zm<6vViAFMt+)MaK{7fYC<;a_U`{*qhUU>)=+EzrBgXqo8Mm$%E-qbLnfli#V`VexN z9vnK5=OUSM$-c=EBZ}K!?+Q}fxEo&=*I>z_Wv7JcXQVOj(l`{Cg_7C=+##+7s)g0t zLa^)ekm}w_S9LnHnV-U`KR*ZIrtjmC>s#$0AYT)LGVTxcK)<>Kh4+*YIVX6PCyrC* zf^l(BG=Fq%qI+|F{lZ**H3fghZgX{ z6|f=AXk83F&kn^&Ide#k#4r#WfVGn#=R+=d$nLs4D#Dd6OqfYtc@;=;eB@l|d*o?Z z0XdNmlIBYtuSc7GAK9c#*yy8L7i%7!#BYt749W!{6SS&4f5UD>> zfG*poub4X24H*$C)=%-kOq!TQ95qhYQR65aL5EF)Ih$}E=!g$V0ltBzt=){at3l{5Sp6BK(Y?$G#M^d48?(` zqa03xV%cjilU6-BI765P&B~L4$Kf?cAZs$FowXPRtrwloY~eys@_*_L^j&T}^}kMV z=yk0ia9rXLo&2w3eQMpEpQ<9xF^HL$#L4}WfNPC3XJlP;!mbs>$1P5|u0h9bkK@tn z2|#GISoGE~JkoA#x-EiSUK0l{ZBIK9DjM^>_F9Ilf#Z6dN#lglOOWKTG*mN>gYy>< zx|K2Y&gTdY(fe!C&=-0TbV-;~YT@2?31uE~ftdnQg%|FbCP~MGFOE!wYb!C>*@4cj z`{{gFiY2&zYeyzo<3MF8W?pq3w2fF$H^^jN1T9VHI>{o4F}i}7%kDW8oy!vhD+t5JN?&kQVMLjL zn2~{pWFZ_F#FR4@z*kv|uFX#)-q*#(?mW6;9K89ilRJB%q#{pJ>b0yOa7qZyQDOZ# zo0exh@|`F~x>PhQ$)Idf8(jXKG@&jGKC%|w+jD4H6Ty+~QPiEe6z6~XU6{D44(R(0 zDw=+V$G_*nKyQfXV6poY*`Oy5eE?jT|d4Uky}wqM5L9+Qgq@4?4LIqzEuXM zJx-R1e4Mf=BNp&Xs*n&P1lF38aAuW-JuwrLgNhTqc@gaeopN|rz(-1PDjxpf&#~{p zjc7i9sUYkkX?Pq+lLSv;zQVl2TONTL^!|NT&*w(aSAk%C1*X2`G~|Yp=vcc0t&co| zmfx>Ie4ro0u?&XSXRv#H4Alg^rY;DfX>kxfE?y)hVF)%xKaS=eEaaJdh`d7s8Y*_u zTvcK?TZ_qMThKl-N90LFV1WN|(uo&JSp}#xxp@Tb2paRM!)=HiX+<_3Cj(Uw9+VYC z^?Bg(`p9FJz!ND&ELsmYdAsuFDJY#(kAZ#UA@}Y@qO-fiG>y;GzOE%d_8{zgzVM>F zn4=VYTRd(C@%`6>g7C)e^H&pb|An5H&)RTH37-2?7%ra)BfA57j*zTXPB244FskFs zYlkrJni!OYyo@bO-sJ6Zs)A- zc<({@M|n5_^+1O3vJZzEn=y0Z0az1=WQ^#LyL1s=;C|H43`+2b0z(7sq$n5G37>_* zoQ@2^tUA9o8d?^XyhMSQR5p`~Av+MaNjeF^tV>VBp{KTD|I?eX?N5(m;k(WgUSvE} z8jED<7}(z-;&!2lRkmUmj!`C6KDtlui`d)*%^ELWCdRVQz6%HMS&v=6cmUlScay_S zq3wWy&I2ht_s}3_tcYORDPfdUbHvOPjUbL%58!x~?nE5Ln_e6<8*!&xB9OkA)gFS(`rmv z7RRCcTM)NPRBT})h#+rBK|Vn4db$@Z&?W}#;J3>X7R5n8C8IT>Bgv|#6hPr~E#qjJV%XkL5mcu`RpZY2ALvGK=uh`hwo zt1d!GNd$$?5g2_5d-Nw@4y9nyeyx!-aiy$S(;=EIaFR~_+l3LD--C+zQ!(p37ockK zbYTz@E!`-XDY_0O+V|7kY)v4OFc7Kq5ERqIjYioJiN#c8a5y7Alx;vwcppu90R7n} zR0j8BAUz2=BPcjY*w_n0@et1=?xe&}>S_gnYMNpNZEM$~eaj{hYUdc7EQG3$!?OB-Dk+r%!Y#SyH5C41^(xEJOtHO?DOOPv#z-wj4Koff|mxV*59Nfus zG9AnIVGVOih&;+RcJ|PI;&~M##A_?OMWZK)N?u+N#94p?cRq!MAAJktAPL9-H{F|n zOK$oI*8S*qJo$s$u=jxtSa{|6sF^zjzOsmbT(YL1-jAHibrSL@vlx7VvQ*pfxeqRzER}#IMX>hps~(%~GG zFZV(w$4-rA6Uk+dhI|yHjv`Rg~9z zxui>kZ3C`;c+~_3^G)!(hDfnB;v&^VHxyJz&(fnC3As^3uQbg-qCn6~qtCQ;qI<_S z5#9SoHp#h1mNR-`ch>B8ct^3b4Y$O7uMNGd3(1(iiQwC68duP`ng%Bx&!aufa+IXw zwWJ`$ja$3$Jxb0T>~Xoewh}>e*==mhf(AW4j9lj~#CAM~!?)juH8&o>x?kq$Liw=b z!>41_k3WIZGcUrFx%;4|529UwD~A+ngDmeD+>R(@;6Xb zg3`uXJCbUcFGX5TtVD*bFcuMV0nK_zX-HWlr#wbFCd1F9e#&Jl(Qy6}u~uZHg*cs& zK`KsO^|=@ZyK*S4bU}(vLP+TlWIbh8!>EllT@TPnd6 zCjYKL2rhpBE{|8E>r$&5*`+iaZ>PbXpW8s7 z-0nlg(VbW?kz^)c55wI7r@o5B zq1_e=g(fTEi(uXA3pgu>I(HY`tpu?;bQl2_N@lwdASe|ixKrx3L=6^Eb%Jkcu9qLp zE{EMZW>pyI*dt>td5(Cm0oBQD*Up-To}Gu#xorm?{lNEd?pLmb63>v=FzgU!+Fqp1 zNkJZhhdB8LBd?3`PunE>_HItZfMBZ*iRUgJ zS&v+R%{To4NABMwmJaWIb_iW9am=_Nf+c5>$h+Kd8)>-ZB(i2$)Q0($A(AQ&Iq+%$ zeIXW%Ih75px0=l__-=_b3#n!t!I&9&OqiF$)YGy!AD>LNsiKr$MWNTXK;u0Qm z*AZ4Y1tq7ggqGTagKLI?(J-*R8rntPWBsc0u<_ChiO@?}8rg_xd$+^_YD#8e?y3!(+`AVG9ze2BUV@Uc7Ki_XpEi~=6Lx)(<_<%F4I&oT3YQ?dGM|0Vc9 z*K;lCBCMTi8%8~mVVB2cH;)@vTJn-_6a9~2lA}FLffP28wLME;0#?CZI3-|MF^@C3 z8qHUng|g`lNFEtPqPrV8f?Zv^dN9zMLbNVGMBXJzY6jC2?P!&|ouoWUoTHLpai z1AGYCStjDq)Fqs-2N{c?0l9 zqlnbiqhi)f)Gu9(`cs#pV$MwBe^U{eG?Bb>1wy1OeynjLL)9x zAU{Fm7>q(8LPsiY*h*vgwc=m~HDD>rV=;;#rSm#mhQ6&K$3{~Nww_hQkhbrgLKrlh+$cyy{ za*2XLFA-cbPn<)?lRX;Y<^s;C?Zei=QfwM1M~Rll#9$IN(JY?%@-PlPlBO#t*_FsE zPr+IL@10QH8cw<95(J_VZ20+Ic<%OlFtoE3XMExvsGdDpl(w5M1wOr8TM>q_p5_WL zS_g?QjX*B-K`9GDF1PE+ICwDaZD(TgMN6^mNB82{Z~qa)U7cvzp<|#Ui{)>QqhZNJ z0iU>Og`s$n(L*BgC5_7o3BfiA6;zcY+BBJXPZi>Aol5tXt?wo4PXlda{f8Zc#_I(p z7HjD&r^jp2J7^w1g4KjFXkUKv4xW;TcvQ(d@B%Htw}_J&&MhO9oE=JTAtkt@ZUVND zLd^K{omlYbqsV3xw0GGFDXYbB0N)OqJAz*ETJa!+dGL0T@Vht)*JmdHJ2KEaa@fC? zaBN;i<&-=WpWVLG_6J1ZOXkp2((&iFA>aB8I_|w6k9=w)TGkE1qZXSU*pYQskUQV^ z9voP{M6~Cra&_Wt*OO5H&=2zQOtR2^ZXWok$FFR+!JDdQKye^2G>7qUhh>j)RXsCu*i5g!478 z=auyyFUGSJl_i-Ya-S5QMJNbI!4#W6)U23^X;+*9xgZgdZ^KADje^Fhfz6i7Qz$iMIT|hs$p4Dt7Jv3A_Ep-Vbz!~ z_GPLh6nLvNfft`a?ML6uz`$KC4agV zTtsgjUlYLz#m_lrgZnK!@p3B&t0or-@jd3A?>54`wDJi-%2Wy7Uo=6U@3$v4L-zSg zZ7AG5K=xnU&Q+`lXXOxCcZ24@y7WV^`ud0On$!h3vy4a)~Z>rDGqlxuBF5yXhs)c#A zgxepC;EEL@ku z4)roo=OVZ-zT6OtrTXVia%S5Lz^nHa-LLENa>$i#5s&AEKg#J5TeY^tMO2E5<9JeL zoR>uNnQ2U2md1ih;#m3qAq2t(9{OfE2HIW3^s-0=!no&MSK%-Jbq(^ol9BshN;1Mq z9G8|n0(oN`<^v-(Kdd4Cu{t6ug;TnWgKL6?e|c#QT2kczKImp0m7L3j#r^HOs(!Y7^JyKo-e^cw|I zuFo|!V;y;n@9*7#HPLc>ws{6}jDa2|ly*SZh04Tu59&(qyZ`mZ#1k%yqikW; zChuh3yEl7r*QcwH7*XLz8XfhGxb5Q~!jT2^^VtGid9wPF3%XT`x$eCP$rn2pdvx#8@T8a9_#ktxj`2u1$ESxl5*ZRh#fn);I4qC6-%)AJ#QjUR`}PrA@++= z6wZ8bP9;H*v@Z^ILKG4~u=2T+aoIgz#)dEa2AglX4Xv9uBGoq_AXlWJj^@Y)57M~x zBX(;oYuxSS#)=`Wabar78XvnldOeEh;mtW=Ma7Mir{JNQYJ6|oHf#+?@TuuDMCYQK zcmiGJrI>&JlbE`1JMv?}Fjfriad4mWnj>Yr$d6kN72D%(c)2|Y$FsS8Pr&gM8;>a* zQ=E+FXfIvYnGqKF7 z7b!;;J+%|?i|apyP9k-jQ4d+Im?}MlL20%CWUGCTV}jNVgNUI1$3c6tdAaQwVMx4W zm7hD-DNEj@tDs_khm4-jkdh6Ob&OWvf-heuvg2F}^oH6TMd9qc(VrAnUS@CN)-ds$ zg(zvPN9UUD80tBU;XSQ(fni6nHbZeaTAMZs@=w;-w*GGNF>CC8+QhjIAB>ZVo z1Fkx97)xR!_|UA`$jS;xa+f3M3#f1qhr^85B*>P8Mhy|e)NOroyp8^_kA7J%`=gT_hZMeZ%5nX8z3_W6H9$(=A~Ut!9(;P_CPvJ@FAdz%2-kD z!+1MR`1^PLBAYzpyi+l4^>X4JIlSRF$u5wzQUp48cSGOTBW^)mbxJed{J_^RY2{L6 z^bzd2>#sO)&!d8m08l`$zi?DaKq^^whBP*$vFEHT{NSSRu!S9Tx$);{CHm-5rO$au zIUcL4#_y(2#e!@KH}2bq-__RQh}VZ7Kld!^3pspm_DqtnJWjvs9&WxgK5F#?obc|F zqgy-dH6-bmQ$gxr-z`^E+8+481&}^8gV&O_CFz4-;h!v6t9(@dZZ@(XUArHl^jIe7(*=6^$dHEx~Lj0U5C>-X$M3n|8iNCdy#wgrZ!;$!pY zA{`21$-NJtdHa^}+=K6#`C@MuZoZrfQffyA2=&V*w%0B}&xg)H8ABuzZ1NQ=Nl_l4 zzfT|UyUo0T>~FdS4-nSdl13|Zi?y3b7*J>X5%@_nTnodZ(1X{k_tn>-vv~?6an}|F z)k+7VY8G8qlUUVOsSaYY+9jHqRVc%#a>wyVd?i%B1kcCo;r-2YxUQ)Z9*n()%a*xn$ZgH`DKtJZkS!<_C^Yv@*C$ZBz(9_22g+bAKnMELlk0<8o((-AV89g0PEyF-NxSv{Z{hxUlD#gS=6!^F1(TPaIW&aH z@uZ;ELm@vl&YXhw%2J$jpcRV`wc{@(W%vat#}$M9crsFoZ#6U^9}Hr`bKCIFuiS*P zfu8YUU0%`3rSLDBJieS^-iBhxPPPn`j`ZVc62>jD8CV{A2J-tSzk?tB7*vn7;2An;Tew~_f2iac2b7Z zV#BzlrWQL(2()B#SoD|saOn?kMtEdUWX#8HU&2dVoBnbt$Y>>$LJC{j)(Mv;;nCz7 z1bqfDNpD52)D7R|l?Yr^0yDw)6tP=MYv{#T&^Z?tOvuEpKsZUI;9tN>HxSfU6m{W%9#FDO8d#T7)VPq;4+^U zgg<@_lBE&k2zDWxM>vy1T{?rP!FJz5XTXo7s-Vm5L93}^yW5AojkV}^xrBf* zz+PWdLt>vn({o#~^42>rXYEt=GTft;gM&l2zSL7tUuHWp7Sd`tgm5g5j26aUvlrkB z-yNtl$la#G7_=Ioc=Pc3N8lq!Bp^(lK$4Y4KuVIOAFz8dgFAn#c@#GiRz&19s+18L!$e=`B8CTTr&I1=YJ+(79{@`cqZ-L;4Dw?|m3k z)C0&_Nwn(=F=CZt#0(&2kd?^^|XJ^K-DZ9`yqn66(=M5@L` ztBM=14*U-s-`RxkP{uvAzVm7+NdH)VLxDS=z@&$tK>yNt1ceHSS*7?>=B-$$K7$qR zby%SOMJ%+5VFD>eC6cBWY12fLHi&|ifnt$z5Hy>h^wDDye0Md5W2#Sr@00*i>lKu? zcfrjOCXRxT*dNj-32x#e#fT~ip*noKHA=eA>DnaQbw%~a~I}?IR`fv&wdH&Vk|1j=&+x6()xf?Z` zH(=4%e}wfnd>nhHO|{o_aK}gTCK^GfitT$a@yU&tPX@Mn_fEdk2wg9aeLV$KR!BWg z*kF%uz;p%dep$th*PmbG46eU==GBT~af+H-*1L*I5;=GTgNx=NQ(uX2?pe_$|Ddq| zyY-nwri1VjX%0&5sFwGjo&xNr_+zK| zjeQrNBii?fMV;K|RRj|if>#5W<7yG^x0DoOs@5fVN53=|ZRT|BEzHDTa|$}l5>$Wn z34{+Hz?{p^!_>1E2}KYWm@XLi-5oyMjl)lEgSRvUPso2VC-M>@mzgDYpb#%yIU7gT zY)3ktM){$G2o5FSojU^+q!b>Sa~CNJ-_R#nU4enQ)6sg)Y3N=s4}OAcfq_1u9CmhG zdOifhw{hduihQpbuCMws?9wM*!mByZ>js<6zVaS~f4tQ>IB_ysK8ZQs`z6+W?*G=?O zqTy&5i_Qj`?tciukr)yc<)Sc7ahfl457{DxFGJILr;M&$V8t-VlWe;A9<)8Z3yZJ55W&jQ6PK<#xSPMreV|0i zwmH^vlW%G%7Wc@Kv;Q|y#86Ue64}AKE1Yy&dddHoZtZB&o+nZ1^I0APz zhm<8@nBHrTgmJJkimp{FFtlJ6Cg1%qCJ-X2*s)VIkC2>u=Z@nZ{Dkj!`E8o`knG%V zkBz0l_rtcY#Tpv9SIdKNUn1_EI&TbWsR;ITz&j8}--?xpyJtf+6@&>gahGquoIn^o z$eAj7jB<1sRXC#8qeY*B{e{Wcqfe*jO*lx{KPv@zhuVoA>U%MtU#0cp?l*V?7C|$HvRk_ zJpIdi@XW98!|uO6g}z-!#Jvf_HRUh4Q{umhCozbWmp9f!CXU(m%x)p(+5LyHZ_ae= zI&BG#L;@HH5wal3Ns@sY@q2~g%LjbuUo;!tXDmn8ic^pcmyj1H_~!A#ln7jFZhr1B zxV@!@%j3=kh{sk`puedJdoDg-!0bp@2LV0#3v?tcuT~U`H?EGnYPsq zU~U-(=g&sl87nYx-DVsjn5E_OPLxU%yCABsN3Ye0UnH+WrP?og^Rhk3l9KcpQKbAX zEV}(pM0f7v&bXLy;R?IcdS1uQyPm+K-}oh>4fVL>J0C)*s*EgN=4g+>-3OVg^v5BO zWYJCvwe_(LIJBpQh+{_lR4JTJoV4sxP>wqnfX_&!oZdT z*s*aFy!kAezxG3HnOKWHf>mZVk9g3F#(`lpbaulccsAs6p|z|8T@@u5SvVU*OXiC8 zBksXrc)JH6=>^B9KvWUuy&fbh%P>+GMJ++&dAEw&uye`Dldoo&mp8r<=RVl03Y|HT z#I3m+{(KiaL&MnjvFnhUP%D&#Z#mXuO(V}R6<#BSh&+gLxdTBKXe)&Z3}M9ZB1;w^ zBa>oSQ;?FlNH_?WWnlMzybZH|_*;~8_mNcziCYod{V)6kb)r~`KOiqxkhfTXm{mev z#BRCZclDwCU=GWF_j_@3pX!;-n6Pw~AmW>UaWB^V^mnLVI2RZH-v{CM5yZ>pj#dta zP#rN?J#k1m9b2D#1{)t(gLEM!{CwH}XYV@zqb|??Kez9)_abBv_6%D<5O9EkTCKa* zYOB`P+GT6^-mUs?`>VEUt+jQuR#6-%2!((nV>6(RzPEX(xR&=sLa$(R%&JRT@%exmppmrz~?I$v^E<(3?u zIPKZsX;5jXYrML3gPU5@1K z`vBp>I40*IV9;?n3C)ZkTtGRDW`7og=xX0gl=~N=E-(j;m<_XHB0P#j@vF3qG3aMp zi3#l2YaLEF#->B%qw;7!BK)OrC~{y@(ys;hyfBP4bbI0TQ7r&3V$mkHSRnV8FM3}F9LHKr*ca?VR7H%?JthQ3!V z&O}45F}-*3C!LE@V7=K-K8LIwTZM3NDEL=63*O$LU^O9zZDPBdaJrCaptYEhv~3R( z_8j3u^To%)9~;eV8YT#yG`p_>~E$2+T#jU-++>g4V!9v_{NA%JxRgf9g45QT)i5I04JPc_+#? z6yn1_JdeoOB;5GsFOWJR3-0RH?kP;{x%uHOZ9$;b${@b{XbHBj+sGsa8X~wqfscZzFX|E;Bfiun;ZLiMMw#yNX(?88P0LpGMrJBtmQV zqq^jj*ef-n%FBVcIJoA`6qnx1g^Dx>mWv!^6wc?a2z$`$?-T?PF4m;yUctl{U*W{C z*c~Fb{yNU0CTl1Jgl@$yNUemMV&DkK12bu=D}BrxC45k28r7r-T+_hub9*3)6G~2PEOZ?< zEcwxI5ow~LHZ`t%>>mCd?|%Ew@Cr?P-3#AG?zQvbDHZ-NF@Z{*Miyb3y(l8&O@bC@aI(u z>5)o{xa(T30uB=rx;Nr%GS_Xul;8hFj&gAu1@(ixe^&X;A>zfNY~~U1+=@Q=RuwXz zB3YCU#FQ2z;iG*>7Jhunrk#i_DnV4G@J&0+&~;j%6_3u;iHPP_L>QYT5{$@*5Op^f zjL2PR^w4j1A{M5=82)!;B6J~aD&+s^9~irHyZE{Sla?*SynC<1#veY1hT2kG{>}R^ z=h0iZgxgzZ>KV8S1*ygia?+btI;hm(s@hCT>9GB=l+B7k3TKtNYg= zO=JGpHP9e^4Ww$xt$lorA_mkT^^b7SewwM}coq$(@k47e2|;K>Oz|;!(3*#ua7eZQgpqMXYOnee%-+c{R zIDe-dfeyRa5jTU&fX5G8n;FLHdbBsT!0vJ)W8Ng>F3X3OX*mZLv{Qmp7aN5+w_lCT ze|QnuOQs`p@eGa}5lOd;f#3=jPBTVP-=ya&HKK=t@UsWR)#ewkzsr1X!QV^OZ8F=)GK4cf0?37_!!J&}>{Mo04I zXo+u17KV^u$mi~p)oE~uvR9`=bX6^8Jn=UnEN&K>rH|asiNE*0{TCQCF?Jdhl${P|aXph75O1HW%K>9WElLj@NA0N! zcHJ^&O+^0fS0Pgfh$ceM`IbS6k~rO%uwo95y}Sv#o_+(j=1&yvRRXGa9fP^Ph36=a zC@VsJ?#U4tCj@y`WgYfy+aY#PizpJ7C9~nYVm<;khpbHHa~9{|7w&g}-0hYQ7~b58 zglArb##kp~j*uH`l(Xp=E&(Ao>TXDLKfc>->fIgU?N}sQM}<6WTp2d*FL8i4E-MwCt*tQEH6tM>ePjs;_u_~Poe_)ts}`fSv=YrtjnD{e7xVk)fb22w zW@oUqWp9C66U?1Z7S%wz?-&dpZioKlN!e;>(W?xFGV9I5As|W_TR3GQxlX+Fw}eZQ zNwEtS_MrpWZ@tJ<#E4y3Q2o*iWjTK^wpQ+@<(oAcJtEr z3lX1|g?Zn)wfnqW;`O?G-62u>opz5z%PHKb=2{~3vLFdpXYrv^JT}Vj}5q zxLQIf#pw|_J{9v?#h0qo{AsB%`m=Ytv4kdG?)t3D1J2axrP zr;xnvb>XzBG4J*@Sn}|v86cY~jc6{e!ptvSkLawF?srD+lw2VkvLH4W|8k$lgPP)U zNhm2(o{@ss#CUe6HoyEP%w`L+7U!dO_aQ8N@J3|KpUSQjGolQk-_J@}Sdr;V=i$Rw z*CQ$^PB9Qj&%kEE&Lhk%&m~yflMf(m=H6Il1?NGP3_7UV!_GK}Giz+%E zJD-;^Py*tWv*vF?B7&nr#X=zldlgpOxTwdUO4q%=4fbz80MGKd%)0IylhW-}(GB-Y z#Q~J$3CLt@p^F~mVpW7WV%_uXC6E?wRTSNV!!TVkRTd!SV!Yf2ts6B1Cnub8J`IXbK( zV-!O_VP6QPrWg~8xmPbiZCMqpW;5^gIf^nV?0fMsMTuw9`~$Tp#(BF8$mfXXVex#E zs1*W2TWN}m5p&;n5dE#kp+8y*wYYE;!=~7_T4-X*c&ce`2Qynp@ojZ5)~%H8r#cwt zmf0^te^*GIgc`Y{Q2M)qGsx;F17dd_MD_!Z3E}u35_896&2Jvz86I3B;*lE2J5P=S^ZZ&>)=(z^;&ey~}%=KpK1Ohwk-t&}`fW&$U;;eaBk(gjNd(4G)^7 z=ks^N^&Zwj5oQ^>S;7OoAb!xQ`1Lye1v;VKW1jynv~RqNIN?T3z2{EMxoZ_7lVafx zva!pf&)jwwCf>H}^t(kEBpiQ;kLe+|tgf_*EeGKbWk7|ZUHjn>m+$H)zKQ7%u7N{X zt+t~TFwkV9)OeU{n`E*y70!WJV_>wgM#azA2|0+`77M$>2DjBd@?5LluUiOqAUP5f z=1&*a`6TC>G#@{@kfNo(kv*DEv<9PCu|l>aGm~3qEm7%B0feUNE>1cLQIi9p`a23z)ea^K~+@;hnE!!#mFY# zCYq%<1GI_Jn19Vu7^`X-$MrEnn#ibWj0TnJ62+}!ApZHms^+D5^QR$oZ+!=+WzW@8 zH4T-yzrPXc_qQW3HUmDPCA?QHLLe^-{=_)=BO*AOL6e*qw8?>CwiGHE`3Nnj=&(T1 zBEZ}JA}HS}fL?53ywH}ps~2MO^~-o@4Y@Ua&hYR{?nmBdRzMwNIQ{G4Ay9e&!qQQB zh}C2k?iGz>P|6_8g~@BL#Ih$J3RTh82?24T3#mfzJY5c0jBN~%hh>oh5iX)m2x@Xx zIx4G55hbh|m*$N0hDe$MEUZXcUM42Zorz=n_6My9z49l-^BSb-xJI0zJ8&ck2hm8azRM9Vp1eT3MJTu{3{lq=43f+R*PIT#2u^q2TeAI;O)Hw zsaWwxax@{X?^uDdJ96c)L$&_^caDH(Na^L58k`>?ja}BOb&)4|98hlM}Bn_ZXY zeWhqBDM3==SR{=fi`KF_SZyZ6=cEr$#sz>y{KA_^ z$VkDo%kok9VF6=5NMkkbkfT)>q<{qd!*4+1MWt-!4Idv|(}h|7APlE!EEncHa5M6* zUVunpqhhnu*uN*-LY9T1GUr6mL%&wn_cn0#E{9_kAv{6=-6ueHM{`@)t5w3@(TN?u zdyb=G%bs`$74H`Fso7BB#H`_Kv*r055}8C?a)MAcZZsXQ zlyJyMU!+sC0*k~)AUZAvGq0G>0TOvlLvW1W1uh_vp>+Xx>@$`_%5ZMRndddgKj=Z` z(pelAcb7Mci|YU6VakA1k=y5&1RxJ(Dak#tI5|q@6K+ateNzaacZ;!-dsGfS@jA?n zMkHlqV#3O~sNPwGjG=2~AqVZ{o7lVL=uM?2Q?cN}RElTPQNW@3joR9+7+90xmrdxV`;j z%X4yJ6#cq9{%{LI|EBnuw6C?j6ZX!o?%|W6J1BMR)om+cd7pRRbq<3P zRCC4g110x#&?F_bRt;l$4SWGF3rK*+!?;)gCaqo0nfSK4N@UHPiK(AjhVm^3P;uZ8 zQqyvgd-;q(D{DV%01}W0@C=a>6QRAs!t**5$_s#chyj!u$|yZ2cPGu8j)cUNa98Vr zfey)yWYy6rTah#=!s%f@BGjQkDr|>}8tC;xdWvJY|2NBvBT>jNt;1jrL z@892HVamV#N<^n8@xcz84<87>YXNo%-8QGdNRA7Kz>Z!wxmn_94N(!8v2-qDQ+dsm z@$DrcAdrP)AsYtqU;4ty(jIwyJ(F9q8>G%lfog05d^IM(b^1l*xre;~DQixjpXcjQ z2O$4`ha28nQ@4N#;O`e!ORdwPrLGB$)pbzI06l%lG-O^e6F#RK1>gHCoGu#{KXeOs z?(Kc{ZB&;YL+*@xOcT~**o1@L2f2t|e@MSlaD&J$oSim)&RakNat3#(+{S?9W>H{; z!sR*BCn7N+g%y^(ZoQNQWU+W6Bn9Y0!qn`L`xAc93So9NQ_`Ut69;c)iv+G!iqkHM zy~Bp4;;^UIj+R;@P81&I>^PwhZFB?<|9KtWxcPfRI2y6|v$ta9 zk3Wyn4ZHFF&;P~~sjm9o=aDuek6T}dGx|gQ@N9XNQc%K94QrqD_({2t4oQe)>#doP z0%cr850`gP78QJw6`@K8f$7Ff%w`TUxr~+QrDhD&KcybQ!a+B5e2?>xFPS1r2bI-@ z){y5}?HG|zEn%OP&cbx88IZPJR?l~?oi3p)0At6g*ZE8c=roCAG>o4;7wos0O z*-M0FX|X_Ia=_(uVdwhI+~+}uLFJ0(wnlWUt4G?{JS_V1r!juT9PD}Ob!_|Vt4Peq zz{9h=nZ-}9h@N6$PulAi`{}mizmDLg{skd zq(YKv0mSWgJNCb{0po64%9g}i)h^Xd^>NU_WFomZjnx%6^ztSS$I{AKnvc2zCsFX* zm)K8d!6E)FVKEfK8Y$~79O>Eo^4qAZtYYCHc%C>m1M_cRgS9{Y8t(Ylj}e&^gLPkd z0$cz3GA1mZkDLDdC~}w192xV}eZm1TcUKqCr6Mdv7=-qL7$46&^sEfJp)PpKTi8wY zG_>Q?j>E7S6wpr_0|k}Z`}_k}6iKd~EFkndbviBL(~`rZSu+P}>xPOK>wE$F7ZD{eYNfVXT)g}V zwxjTww{Y~W0vMtqapkw~#k|j52SY;i@VZsuc9;gB5{DOsz=c&bx0rBr>ptNDd0~i- z#-wX6gCQ>JlaWURN%6eY_@>~JkUhV91=EgU@|1pF{6304D&)LQ zV`VK`8ykbw4Rw&p-Y;qwD*<6ljO6#X6qjSiW6uhgzzdhfj_LPb%YdCOb2qD7-x5Nd zfs4OR$QDDm-{*9`lVx*>wfmT=&tJwl`rwNef zv=d8v;+QeG_U8{FWl9cnOA*i2#H;6H$>dv@A%xrs0*}KMvFgKL_qSU@)|Im8P1W_{ z9(zJjyaCOD$U%VA+2b**z5^R?{}tx{>R#l3=?18hW8f)o;(!P~X>w9#jSF}JP;00% zAP(J~L+p9b-S%9}0um97V1>I`2mbg!jv(Du@B}newOiFHN3G7h;dE$`$#J;ucVEWD zkLKg}o7+&cuNaNT%9*2T@^y=G_4n>W@!LDlT2TwTz#dXtl!7z(hPY_tTs8xjJ@6^+ zFLzn(h|f+#^2D(WdRZtqQZ$lKoTSk?a6wsUDtGsKQG24C-y10v>XA2yXJAR|0`Q7| zC-cgD%s*9+Ee}5__S1|-Ke-3mnOQ0g6`7Dlpw^h#|> zwNBKvH}j4)$XuS!g5hiIJ8BgU(1YdWbb(dkl1yE*1d~@ULPu>g+RAFtR^A{0d@(l= zE&Ae3+{@llTE~^H1ZX3Z;<%0~F)vd(e0gReR}PQl`5u%6ZL-QFcM7foXsKxwIINys z5g$zvkB(sW#R0c?ej?~oV#?YjFqT%K;HQ6q+hoP^KRpc1^fB<1G{WCv4Nc=3;N`&p zA)X6LK~5v5Md0LqV?gw0_UNK4Bz9;sJ_ z1jjcBGvL|jO^L$%8&|?uQ;$7=eu;Z&u6XhxXeOn>OaE?N$LTq%^ST{9Ry}|Lk@%4u z#S%Nmb(`5{@o`52|+@l~~OC0H7o=6lHQ*x;PZ86uzuB zLeBz0AJgZ9UmH>EgCFaki(?g-!zWxBIDLG|1kSA{3(5{0;~x3|H$7_@OZhy5WCe*L zDN=*DymZW2xtLw#z5nlJ?En3L*>b4IB||9$2aCeS zg(;BygQ*nAip1z)NR7jsD;IN9na}ISmT&xtd-kc7Rx=?L3hK!@+gyx78r{a@B;=?W zwLph~nX*ekKxk2~$Z>M5Vv^D@^NVY{u}6Q0%9EvlBmde2T~Z8UGLiUHP2y``EDgwfjwkRYy;l`y%oSMxS z!Ed(rk39sAu#`36_=X*rc-8#jYfu_AYau7(R8o;)Kr%97*PD$MjUTJDpdS3b?fC_zX)mbCP|DUZMKkaeVQc~ zK-5xFk7FAPkveT0k|vB5_``dF3PsRTDEWfXq$+>43Eq=U@E)p%?^G-Nl;5BW-Yd*a zxgWJggQ9Kwv2*=K4m>Di*NQ^rbMIP>oW(QX8Ol-^65zy0W|kZ`bCO(}py0?>;ZOew z)5%&cLRBV3hWO9=+ZQTKWlC6b*2G;fR@5-2l3Sp64dlxn$pZ2faiGa+wGK1xUn41^ z=1!>>q|bLEw#V*8)#d{*Iogr8G+!E!d7-&iN{OkPGQ>Owv9uZ9BlRp8zRETPOm@k~ zAff1Elrsqig|GL1unjxk-Xvc_X;K%}krtpqQka&ax{bS5Phl5=)QUo@EWr##PNX#UjEti6TP(1JpWIe_% z%17qPd}%JAsjJ_OqYZLZw&3IrqSuK=?$TNCxZD?zV92#a!Ya`8TyMyIvPk|mSqi4P z@1t5-DY;V`y%x>Y_4we0H?U`8LCA8Db|vdE_qOY>{ISolTQV%JCkZvt_6RGIE38P6 zkwgtWO4k>lV*PH(io{0rA6W4UCz0kp(lAefuZVuBy`_btW8k?os2FGvJQCNVLc2s! zv}5w!D|uomxf7Hb?lWsHKBura(Ri>7#)ewtT|O5P)LeBTM6ZHfixhll=zzc7E)iy{ z6lW}<3A&Ud7^DbV>l;zBuLxy_j>F;T;>u&f8&qH!pPa@uWK*tR66&HHmPIvGv3e*Y z^~jw%0VfX}4fV$R{9f$&*}suN%w#(PJLMoTplMgTtceg z4P5L3LiP8zP>XH+*i1~iQ|iH|(&msB?ZbQrnye@j7sM(48^2;MN3Z%Ms~%}qgL*aU zOz_p4CHFB1#!r(YX{NeDcB|-OnVZ{DUtY~561Bw@aQj`dLq)TIoiG?;FyrbgFk1lf zr14|mA>Z9Uj1-Dw(IU0*M`(~dHVp~M$!Ke7;^-R9P%$1YM)C6>VAjJoFndW4W_>w& z~d7C(NYd0W2%}R*l7p{cM;bec?($;~-syft{R-?1s z1gpiu&|3=Ok|X6oR7^bbgp!zf^KvdFAz?ZvI@UoB$x-=9Okx7kb28D|(%9o`N1u5I z6Yp3KT}muGb!`aEir^j)kHDc;-Y43V>f&;kTHAu*-Gh+kV_wt(LKN%w6U9$tOcL^L zS}G|XfjxM#Y+s>Wa-&*oFqT!L#bU(trAv`0wB?A7UJ(!%hfTmcV0QGd7;GuXWu!h1 zq3v7hj8X+|RV|vT>e1P0?pCLv9vCS;l{PUK<1U|#@mJ18(!?xwX?Tk6ND5R0{1Q82 zgB4j*#^J=iBMjDqZ3T_TPM~_@eoVP>8Bo*Kjgq-C*&LV*m@ zFKPjyWXD7%VY_BN7bVj2b;v|K=+s1>%|32vJ`!@rFuOff z9S=x1<6uliAP-NkK|rrUdTu5Rk&&=>*+MLpO&I35ZgP z)HRgXprN8VSUN*!|Bb;ou8|}l)GPTJaFwYJQ}4M(^0$esjWXwozI|E>`BBAfgRmem z(FvR#9?`W|M1D=-TCyCnOGOq#rBb84sTC&+598F~Vpy%6JtB1U|0Ea&O%yVwO+fmL z@fbUAGSX*_hc;3g{39{jI|l4^vhaH4>GKN3z$%FtJ+x*W(#MU(sbj}OJjaw_uPZo$ z_R?A;L`T6(t~C`T8apNGR2qZe_c6PS!)@oXeK~q{>|z%XqH0-61aZm2^k!c(S2}b` zhV|7kD9`IqT3u+YF~a7yVCI#}VTh0ZWWCjc9Ok5ALhkUB-w$a+s+BrYxCh6!AAs3v zVmu)MZ5Q;)NJJ#XB4u)puoAP7IyDzjDe;I%jOAu7Dis-=-gn{lXjM?A#&GxF*>r85 zOXQBixs=Jz$Qz5&V?|-ds({DmK*|5MVd+-KDmbQ|y=XfBoTqC9Mz3U|0cL%a z`EfPkf;3dtV%J+A!dP1?4^WU;Q=$dX&JlQuEMn%|$((_f;RXxFfLV$&yj~{E6Z@&2 zm`%sE1rLEdwxUng5D&Qs-+;9OjK6tFx1#Cjr?f<_=v2CV=rUV{ z47riFV$L9T#(mPrO#r?+GZa)mBraUx+aF>7mhGXa4Jn2Ri|64}e|i*C*DhgqgRI7g z3C|LC5@+E#-T+l{G_+GQCky6}+=AFgxS|sa1OW(~2k~weX2QlhRXoKLTNIoCKz$p@o$NmDD(_T{yg@koQau2~()@$w4=uBVg;V z5l=i%U|M?_ba7GL(JLZ5Q}*5WLFLYVyNf%?$R#2Ani1C+6=VRc>wsD^0rxO~nixQZ2H_D&gi1y}oXeXqef4v+1m|kkLjZH}qzgpGnVk%*7 zZi8QdbNbq`9S6|ZP#Gb_+L?N^GbQ^T^h{!LiT5^;bysR~NN_P%X&}vL1=q zIY?hPCFEXl$C%;_RH6YhDZ4R9bJ0hdfY78{1^JaJv-1!=Hd#6Zinn`x{g*kAD<#}7A{-dEd=4}b zy5X%-?Z?UmC~75Ktb?0(ag>IvWOPa**8JvSWG$FFGML}b13S>HmH3=A?ETd%JaJZ? zn|$tAL@r~Y;YSp>h)Im?fkC7_R5HnSb?FqLFg8Er|4wpV|fwo*feBb z@-Xi872s(=LL=!Tk+XWfv|$2xGvV2pE)SV=;bN)NRn!z7V@5-bLC+UXp}0VVMegKF$W0fHaTki7epg^9 zpG4bpt^!Zru2%AUrx6r^J};;;TsTOAevBcc2p`Tw;isf`>_c+?c*Kn#6N+91C^@L^ zUv^0l5E}uz(vRA$htN^gD6zLE#UN+#Ebb;8HXdDSn>7i4Sy+%0`;KztC79H5I~*t# zV6%AZPDJVA5R;jVNvjs}oDoWLQVEIQdjYVph?`7wt`Ues^+yNLcC-?yb0>(thXv_py&#^#p?s^uB_KqTzFKl9-N?RbPPcJ5L%okuZZV}noHV|m zYR3^+O{VUj75^n>jlnfP`~os&Pmo4|4KeQEnxQ5eXZR^J8K(XC?^KdckK5%$OGP!B zpRU5;S2khBO;;fQ?$wBhjT-UTgp^T4LJXqg6VcvLi}H2bSwJX>$o=ByvV4-OsS}n| zUY?+B>GhrMGWHnSK;$s(@r~k%V*+J`78#4DhN4&gexg@INI+#IJO1=vy!Evwad7^fWdh+92MA4rTw{##Ic;lo-yApY`jeb_Mro z7L!QJTl)C!pNpsRQV)qnI#2n#W;Hy*FVn_qnbyIy)7ot-U+ zjZeq;6-zMhf!na;TlZt$7w4!ijfwGAbK=)E1#=B0A=>iGcQK^G7|5nt<}k1(*ZH&+_bus@pOlH1tQ0wV)w9fk*#QM0EdS^r zKK$hi=;$;eWlSDsJ$xf3-?aiU*=b=0xC@?&7PJUK+V-dapnBIa%)9qGHs3>%XCUm+ z(gl^ni}IopVclALC$>J;Khr=DpKz}VzVj6KkT3eqop2X7NWB;%DB?v$g9afSTD_h_ zv+jVfn6K}^*yZ_9B}Pe1k7whK66BznE#l8Ei!E60PCtAYQgqcg79U!_!yp$VjwAsgn|zNH2nq0Ih|EZo zqgPJOZ3LrNggL5rA49?8FT?4zV8*A`;JW|*04l8p<^SA_BTujABDTcbbhLHWp{np0 z$_n@M$mT^~z8P~qyNX5dFy zyegg*RE^|kDohu%=}rIqwZeMXLx_mnDqE`=JD&V6EVgE3OqhnN|M4g{8C5>B5iR>m zu;Q`1kvJg}6(1d9W|+>#R!e4xPs5r1Qo0_e1}~ec(DRY|SRrZajhJ6BRI3 zHnIBQo{q30C*Ix(W92F6l#y8U^Upya9}VlSGI-549^FhDebY~#$FX+`gq3!&|4w8N zH0GH`Gn0Vyr}YWEJ3DPC`q%p?dZPeNlT;W>+^evP)Bfs(D&?rmi{kl#EGVbldU{V)Tlb>+y?q#e z^W{)yCrZsqBLS!j?4T10Mj`Y5QZEQo3A(mTuNx2YDu%*=$thL%N z@5LRmYl=%jKprLGAQFPC#j~;a=l3Cf!DQ5JJ%WO-K83cuWk|eimQLD6qVWWfyELDvNDsgAA&#uy#0R63r$v+BPeO4fw~81Sn+1^H{OfP0+hiAFj{CdR?hX@#xDgx1nJ)b2fjifso`R8WAfmJVF|n=dh~PLIM!2Ip2N zeF3yJG{e$v4!R0tEw+BlzR>qPD4vhR^QRy->sGQ#9yogB|K4H&QDww2fr7ukHsm36 zu>w943I&3V@`ShQwjSjiiBjOfv$1l1n@fC~lB;!HPBs+O4!T>$ABRVRA{Yt*$spW8 zmLo%4_D{X@E1^7u0}&}e_4SLOba>HK(g3fV93!TS>YYU}Ga<1SIoB-^7(oY5O_Kzq z#s93$9XRmf2625fJwmCZ$#hW$e)=k2)I{h}QE&)5|NI&zUwav*f9eWErzf&i2u{GI zdFYXevB=1ui0L;jL;c}W?0)KXR1^zg{@qJh^Sdwe>tO4okQ%orIi}I5P;;`J2^VAw zLj4N$XSqjYX^4E_mEJsScoQM;3ndX57sKNRe10Dbv#q`r z)|zI-j!BXBhG$6j{NXkJ;@CygktKY5*2)T=Rg9Y5Mcgx?RqBy-l~lwSusV3N38YsP926$G?X)l| zGct#@g}ASa#`*CZwJ4hM?Mo^w>cP(WG$SE>!0`< zCeE3Ul3lx5z(V;InRFUm9@c zQf5zJ?p3uxkH)W)iY2b`Xg&5&_5%F_Wszl{U zA20jrohbP2ztCP@kEBUi@Dcx3hl4ZT=GJytZJj~)idgxx8D8DPgH? zfmaBtngo~TXQ)iW*FourR3g$#2#7elv%>iCKQELW<&22orT$b6toBZUBlR>o?dYW@ zAS=XHPA9DzlamI8xOkK9SdQ1PdJMX_NaYeGk?l{CI_&q-A6+l#0%a-Pg}de}6?gXHbbJ2-qEZ2j%O zVQVrWVO&P9_RIj|kLfophdwsCXB3Nm7u86Wi-Rj|LBpOC`0($qqdKRJqrK%Ce}Uj2h<-dg(fjZSg2VXA||Y&Pl-X%ocFN%(OA=R#Z2KtU<=o=>pSv@aEV5 z0ILuZssawWR!($b%;ZU!x^{7&b3thMCB&i7#MgIUcnu{-iuflrTzaly%@>oAiYtEp z5T@OAt-u`d?DwnqJM?I)sl)p}dIlx|@~Quw+%CU(UDQ6S%Syuj4cpMs(jLSg6pbqR zgnQ=*zc3^qPP4EeW@`_*A13(#D1XsUD4jflKz}3-+-d2A!s3Ek>|e>Aqd`SS%!mgr zH31>;V1VqjXk#Roin6V0@##>5l+zos7^IaAaZ$nwMDfLUnY&;*UL(0%;^(jYzemKk zs?bnXDgdE}*$7G4rY^f2*Zk}Y(8oph%y!d(wAr9&?ZUo|JFw&Jjc_@gvPoBjY!4*} zSO5FFSoov6aox+`#~p?LhnaV;<(cdBbxPQonvFQ{+}nuFOh)RoTn6e&p~-Uu;4eQ` z0*k35==Pn!z?5b0!ic;v!h+abeF_K#R_rZi@pSZUK?s~TSq1h3lTX)IRs~CPsKR1I zjsqJ^43Z?CL@5g6hqbPiKN&S9Ng^-EmN}KeEC^k0DlQ}fwT@OJ++3hhBSN4}}zpR5V&qwBsQ5f3%ZbfZo`}t90Y? zAKs6wm9s;ii=UW@m4A5zjeAd`^;9{}^QO{~vd#N3@AGSfwMpW^G!!0A8lQ={>@*ll zPjSi;QYLsH$|FcKPz9@YMBNxVGQuBc!Wq86>0b{DmZ=L4fgy3fpaa~c^J`#4IcG^kTER-u@6)6300lJLsq3=mpJQ;Jo zbQ4y7`!iT@-&$l}HVrDF=}#*GQ3@wbSdPZxO6=RTon0m=*4`~3^trgy3{3gVRj0l9 zqG#XZ@|MXrtmK+8`Z)>>x16jF^^bF#Z%Q1JCuD}_KlTsM{*gv$8&S7KCc+B{#XuF< zU7c2DHRQ_OIB(%sNH-B1_5-F zCgwn&5F?xFo{<=;XQB~e=~E`~&YEiLu=UZu_DKBs)e0sGAd5pnby{f&pI z6!B7om3a`GJdHb}jJNnYfrOm{w14h?Em1&HCPN;M{WGaDOj8*kGx_v*BSjg+|=-C`~Nky^b@ShjfS{n8qz`j4c3ZKw05ovK!7P^-L z;%>E=C@g>MZbZe!^XHEL=L39j&u`&ql^SuBLa?+l7gpJa`(QD)GG6HM#@g&C-+dI7 zWu-7^W3ck+uOV&zWPU9yh~n-=#3ewZGhp+>f5g6Dzk=OA_y_(q{R{Z$Xa5I9Km|i` z430hb9u$5>2(kEjjaML0N`wn41^@e0N!T<%8|UoTFQ5m*jcsn|WPaV9>o)P&W;u^lJd)k3!NwpxObLZ3DGySyWf#(?PUF&bPPFwg z2#=bM(x&BL_0Jx}hrfIt=GJB$d1XC}g~b>94?{;O17cfOW_)oez<>&PMWY=^U zLRe(2Epo0%Sdgwx8(CJn474MHQAIxuT#eF&YSjW2?JUrR?-rn`u|Amhp!MWP1?NL5 zAfzp94Q+_YNfp;D3MoVpL$mtqo_?!R2>{b{rCXo*9@kGb9xsQr!GwAtB#|kxNS&OE z1@~W%wCQqN9?fx!bbvFwM}oJlyo&Z~2h7Jo0Cl>y0b` znTuv(?$>X_#M`b2y^dv1Jj7tVy|Nk_g#mG6Q+kYeBa5exi(+;_u}F$m43K~%%8&fg z6(Q_%nvXw}0@CRSRbAU{T_g@coRr0(^GE~KL_|%lGw~2twL>jjvV+2{D&BV}ycK{( zHm}17UxO(i!CGiZKc_@_Z!aOZ8k`jV5-jQs+(Ns?(j{eGV0c zdytSa7K?uJIZXZR)zCy6dc20n^aQR4YpN_oLV5;Ata>zI1*2u%Wf!vtBgkP8*3Xa_ z+wH;(H3s1VLzi%|ywcPwfiuWuf<(u|0uo>nKpnR~6L$C4c0k?X#EHE}v2WA1-Xw6p z5s&#&77&a4uz;A2Mp)`wG2=lgxnB0ichFW`iMcd~E?7R^m(ub|WNK8ZP6dUM*7i$t zH2Shu;y_MrJ%EnRcIXt5nE9paLsh4iszy%!6~DF-$6tG&t;v|F({b~L-$-HS{#-;F z+YArJ3XspG^u4mk3gJdX#zw*E=%VAN1dnO}fTu6`J2=a)(}w0YG7bm?hPGgl06I

8@b35ipRfWkXFb=0C%Ou)MNglj0tkC}127lYpycpz4(Y~Z zrXfjKD|@RM#$Cl|IeZH7>0@#2U%!h*-})R3x>$5Io8Yqa-(Nw&g{C8?pcmML3Lz=q z(&P0~E3VlNyE!!Lo7DV3BgAk&{6D9pZKZnINQF=)*oSva|uL##sB+4q0`Y8p*=rUVivvrbyP+9gQ=`v{$ zrxOaVp%Y~Xj$_AL8)56Rh0hbDMTMCAMg>G#<-K7^XLBpNHq-CB4r%iyF=fvuK5P;W zaZw%BttiTy7e>aqdn#H+E4=@620Qu!~cFumstQXGm@#xj1A!noNUnVdG?1 zjeoTvS;8Lyfw}rBH6LvJ;ir+%ltEW3#rqDxVlu<+cYAfv6G&esv1FDzf!tepX9)ag~aAY>Gs2D6V`*= ztI2n+z^pIb5c-yciDTJS3C`j^^z7@Xe5Vkpb0@;q)PX3Ca1H9rI8nG>xPv|>M(eP& zgV0CrtXUX;l8GWz>C)UCOS#Ge8vyaw-Il0*}>ze6Rs60!CpN(R8sO448c^W3rRpI ztLzCzVx3wIt z2pyP$vmttz8yjJM*NF77*;x9iRY=Xv;LGl`*|C4)4w!_1=rxg;|M@l0L`S0GgFQU1 zfI&ZDkD3k^%vNJFya8{pnztPTL(e}U1ki=M7(YQS?xfH-3FAtp_B*_ zg=J`|rGSUBO1}6>e69i?R+p6VKKDVp`ZEk80o+Ig=|LB3%jr_7L+!4^*#F!AKshE3 znmmbm^t^y44VI)qH3v?hx!%ZKZIeHHH4=jwS1d=n1+^a@WRiyBh9yHL|4% zi|-Fah4z};`AKpBZ?dib@YndV6R`!e<)xR_`}@NPKt&a!>HUL6dNb+KykWx z`=59o#|5|s+k()I|D|{)gA+-TKq{n;a}@sKpNP&%!L-j^1DycAE@1^|Fb*^Feat1G zVn<5S5yPLmt{o@$9DzIFL}W}N^1pmTkMAvgWeaR=ZNcI=E>g@ALUH-mZo|f(Jcpg{ zY~sG?l(FfkEGk7s$w|KOd9!C@{ui!?LZim9bsN!XY(>W0N$|B;;45zx?zj@>Ruj7$ zvh|?%yLABejec3S^b7rnNKFX!(=Y|;P!Y$;-GlyiyQI8S3U;HYP1fu4QdVO}w=3B1 zqCSuNae=O(AZ?&(%^Bi(1Yum79NAJD+|XlIU2K?lg0{`!}lVz z));i?sBS`gm62VX#-rt^uc+o)uSuU?fs{EDLf=mvZioN;REq?-T zc=Bt=Suz_(3io2;Yj5CW$zd2Gqp;wXwOIY@hY+2fgeLL(cRlkzrV7&9gkxSHRoI{W>gH~fj9Vw6| z@d@gEnR|xcKy_*N;54R|Q47+0k)QeuB)ZK--O?!yk1zbgzfixe2#bDkFS4(m3sr8C z@LQ~KH+4#dZsJ;#K_SvN>KH8FasY>3*@UGJ-wLJMj^f>ih4pYDGAbUkzj{-Te|X<- z{)4u1YSPjXa5jqz7neFdN0mM^5AMz`7!qPI=gzAUl^n;ym^2|1Y176rDFd;rSdDGi z@|%AO(GosSP7Wu)C{ajQq+M8)LtA!-=Z9Y%Ab_3|#BF5B(&tP4Fg%>b7Z^GVLM7@Z zyVRB-Cjd>2t!S*Sqwww_*@d3p&rj2wkI#wcBrf1Jl-#^@ab61-kf6IojYf6*j=;F; zF^s!zAtv8_HL{lHBXUM&_dyA_#wdj7*h`ym?47Mx@R_w3lb(*+O$Sgb1c1sIoHiS_ zfBPAXSu!2ExF|FqJcSc4ZDNos7O}-r+({KXHdU(r^#}N3r_C6L^qJ$?za~Z#5?ZoU z#IEwe51&PKaWNLJxC$w83GfPls*5n7xz>p7Z@e$8M|-fo$b*6FYaofxa5tk$A8Ht5 zpd1Jcodpqs5fF+h=FXzDw`vnE@HN!z?*9_c7iCP+ zLrgT>p&P)d4LeY=VK)-T=P*8r$xY*WtIn!Mv=vpsY%yZ|>;;&A(@MB1Te!~0=IBIp zbRt*mQq^$PhP}*Z)mVIj6O{6WqQbubMOT`OD|kE`xoT8K!aXHqB79OA3zfAr6;#VX}KWW~{CvEumdLxi`;&m#dL<`r!pxRc!Jb+`!DPzwlY@$W;T+SK-i z3Q15%gOgj-Qhq8#jvQo!AD=%Ts~)`@I+MU2mGvk+e2lOE@;^O{Y4@#?PDos)cW?d~ zT8hiUwQVRs(Am<41OMEBC6C;~AzNy`Vn%m?DLlfZD|)>EyPkd>R#Q7C32kO8*8TBC z`2CVFdBuOyyultxu-DLCxc5od^dSC7${&Zw)OaSSBMgF}7%N9EoZAb(v6JsRSq|DK znpti#wNdhqGU3$mxU`o!bIQW;cU&ZEI0opD=AlZ?pY$I*QH1(00&+_Zjr^ik+w<-b^Lk;9`!5#DF`NQI_x-1kdMCbn=5G|* zOQpb+#d9$4#uZ3RN@UR9+1id>>$jl#R2lR{@FrZb6EAK;>){HNy|En~^|hP`3|oH@ z&(!b;8UgJi>o()~`W;MFYHRC+*W+SPOqM~_Yikt!Urv*JF-!xrKjS3~;)gym26;Cw zVPGCGcMVOvkQpkc6$5 z#q+D)W?v!ad#Os;+}I-971db}-jo-)RCi%uIc3SOk0e1QE-+$&A)w6Dw+0)3P@Pq~ z9llD5frf?%IUPDpSil>1uZ$Kva3~SpIe~akv->}M7isJC~{kd}roLAY#M)`FQBqIk|)%&E)@niDs z%lVUDiX_R2y1{X&B)5u%qqK=BO}T|wD39I3QdgChh41%2f%7u>VvzO~1h6%=d_+(}1B+!If-xSYH@&y@ax|(anGs_D% zl5@r(d(}KnNOE|0umC%YMCl=x3AlXniT_T$E=0!g(W~#Eva}?eg_0Bm z)l&r%p&#KASn3h@nkY6)A*rXubIlpPFPwFdN4h{FT6+W1?7!Y4yy#%R4v7|&${)tc z7St_Yek!P=R?y*^i%0Br%gBY)sUtDtp|$+3yv>%u3GI@*=JLT;)dqjFm6N2D|DnRm zt*>oBLv2lP5NU92krme^wbUc@by1hvS{VpZc?!ikWyS&y*HRvZO6gP4O;AU`k&<<` zGyGm+8K4mJ?_~=?Xx=DWiNG+Q!;cAC5vjza)r*lbE04+6sQ+U?u?OP~0^>FT#@jh6 zsMM;tjkff_G3dss(u*Ydpvb~}(owHuP0B~m zd!_1v1)O`)L}2zeJ}rTBqj}&`AB;7WQUb8v1Yd)h%T}nGz;3hS@Rr>;vSS|u^Ilzm zw1~fIH!i`Yz5re$X|1Cd@flD);X9Jlx-kBlB^bMMws3na2-uth<6g<*;wW6~t2Rki zL!;)>_1cmO6uwu0rusS#fT&K7=oQFT7o!3)x`t!@i0}|$4@z#%{^l*L>^-&ZpS)^U zDN&P=K==g+rzS5RMG>iorM(kJw(iA=J%`|OJA1oS!4*sZT1N$BbPdP4MLb`S{7EOK zeR>tLR_4Q3Ym%nGp0D)?x>HV%lodC2GF>S#=TloOwFeyda3?xUZF1OL)7NjI@e4Q0 zE-gj{WONPn$`Q}+B-e^&j>lu+k3Y+eV%~bwdG_ZkB&$JWd&Uk1`2o8J8of@~Ck4Ax zG?#;#%cQ|T{nB?4J|iGhbg3WGsDKR5B9;9o$bIJ|AhW;pX(Z1a2hRy(s6pwREr$3x zf3r=h!WC{6VGO@kgSyg69NTpO)yGbO=5k3%*M5(lhG{+^TM$mkl5MIl{ooTqsu zV`k03f*;)tzW~vM6V6&VlydJrS&ZgRDJ0U6Fkz1!4iM2sck z`Z_Ra?Mf{8{$22uw+Ktn)wgiSnQ!inu{e2ZF9`?D`Xi?G#=1ssW-32)g8SqB94`J? z!JtIx+v52(M(FtEQ31KMR*raHfmHv+Q?JsdPsY{He~XiMUSr4U!V$z5M4Vvhl7ynm z!)>>2mkZS=%29drBpNDeV0U$en!L`UaGwf7e>v(-jS9#}StJxxK$$OrayR1B#$e4W zKSrch4_8sGY#|Wp%izcE=4noW)-I@=0?J$MXcpF@wyY8rM^3_OHVZT0W1;9(RM_7l zlDEH#=f5~@GUVtQ6_DXsR7Ubvw{W;%h>gWH|Nb75a?;^CQX>gNkV(?(hoZ{~MTbMU zTn@N9Z0KlhLzMvA_2t!Qt8IcS;FQC(XVv{ke5e$*{kv>2oTEoFDj*|eQMK^vLE-QT z%VCI*!*&1u0df{hh3jao#4F6B%{)+8Tu{&`g~krF)it59s#ai&aLi-EQO|#rxZ5A{Z zR|+dpgO)lYvln)GY@sg7bLgO?a{m`)0A4(L45I=v5*H0&d{#Uel5n_?JTVVzU-&MP z)6?KTTnAS}JK9gwpslKbd2Ws6wXj*O%%~#K{Sftp{%rrf7THP=?dkitz~*m^3dp6k zsAcxIkSIA3Q282@nB}@%1=xpnN&1IF@RaAWu(Vb~g7vz3O zU67kct;MK-jPw;R3&w-NPmm?hM@2)g&|veUPqDS|v5k;gy3Zl{6kPO!#Avuv#x@5r zFhtp-Yg9l6b7nwStv$bs8IpA zU=}qK{aUslr>%2zn}UnT=%~z`T3m_2@DK)Oq}%8k6_6oY(;#tf-60+aB*KUDZU6Jh zK$~cEC}%-zEXOgL%o`Pu3v`hn5P$AANbD*^*F#-_hI9BGM7erQ7KRUHY|%BkwW9)Z zF)Xqc>mhM!{S*>asNrKQM5pX3(UjM{ka)OCN4IiRKrYrrG^x}syQq(^HKLn|@whA$ zgelCUZqulMT(_ responseSerializer: Serializer) { + _ = responseSerializer + } + + func consumeStreamSerializer(_ serializer: Serializer) { + _ = serializer + } + + func consumeResponseSerializer(_ responseSerializer: Serializer) { + _ = responseSerializer + } + + func testThatURLSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeDownloadResponseSerializer(.url) + } + + func testThatDataSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeResponseSerializer(.data()) + } + + func testThatStringSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeResponseSerializer(.string()) + } + + func testThatDecodableSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeResponseSerializer(.decodable(of: TestResponse.self)) + } + + func testThatPassthroughStreamSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeStreamSerializer(.passthrough) + } + + func testThatStringStreamSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeStreamSerializer(.string) + } + + func testThatDecodableStreamSerializerCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeStreamSerializer(.decodable(of: TestResponse.self)) + } +} + +// MARK: - + +final class URLResponseSerializerTests: BaseTestCase { + func testThatURLResponseSerializerProducesURLOnSuccess() { + // Given + let serializer = URLResponseSerializer() + let request = Endpoint().urlRequest + let response = HTTPURLResponse(statusCode: 200) + let url = URL(fileURLWithPath: "/") + + // When + let result = Result { try serializer.serializeDownload(request: request, + response: response, + fileURL: url, + error: nil) } + + // Then + XCTAssertEqual(result.success, url) + } + + func testThatURLResponseSerializerProducesErrorFromIncomingErrors() { + // Given + let serializer = URLResponseSerializer() + let request = Endpoint().urlRequest + let response = HTTPURLResponse(statusCode: 200) + let error = AFError.responseValidationFailed(reason: .unacceptableStatusCode(code: 404)) + + // When + let result = Result { try serializer.serializeDownload(request: request, + response: response, + fileURL: nil, + error: error) } + + // Then + XCTAssertEqual(result.failure?.localizedDescription, error.localizedDescription) + } + + func testThatURLResponseSerializerProducesInputFileNilErrorWhenNoURL() { + // Given + let serializer = URLResponseSerializer() + let request = Endpoint().urlRequest + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serializeDownload(request: request, + response: response, + fileURL: nil, + error: nil) } + + // Then + XCTAssertTrue(result.failure?.asAFError?.isInputFileNil == true) + } +} + +// MARK: - + +// used by testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode +extension Bool: EmptyResponse { + public static func emptyValue() -> Bool { + true + } +} + +final class DecodableResponseSerializerTests: BaseTestCase { + private let error = AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength) + + struct DecodableValue: Decodable, EmptyResponse { + static func emptyValue() -> DecodableValue { + DecodableValue(string: "") + } + + let string: String + } + + func testThatDecodableResponseSerializerFailsWhenDataIsNil() { + // Given + let serializer = DecodableResponseSerializer() + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatDecodableResponseSerializerFailsWhenDataIsEmpty() { + // Given + let serializer = DecodableResponseSerializer() + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: Data(), error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsValidJSON() { + // Given + let data = Data("{\"string\":\"string\"}".utf8) + let serializer = DecodableResponseSerializer() + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertEqual(result.success?.string, "string") + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerFailsWhenDataIsInvalidRepresentation() { + // Given + let serializer = DecodableResponseSerializer() + let data = Data("definitely not valid".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + } + + func testThatDecodableResponseSerializerFailsWhenErrorIsNotNil() { + // Given + let serializer = DecodableResponseSerializer() + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: nil, error: error) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatDecodableResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyTypeAndEmptyResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd204ResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let request = Endpoint().urlRequest + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithGETRequestAnd205ResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let request = Endpoint().urlRequest + let response = HTTPURLResponse(statusCode: 205) + + // When + let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithHEADRequestAnd200ResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let request = Endpoint(method: .head).urlRequest + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serialize(request: request, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseConformingTypeAndEmptyResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerFailsWhenDataIsNilWithEmptyResponseNonconformingTypeAndEmptyResponseStatusCode() { + // Given + let serializer = DecodableResponseSerializer() + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serialize(request: nil, response: response, data: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInvalidEmptyResponse, true) + } +} + +// MARK: - + +final class DownloadResponseSerializationTestCase: BaseTestCase { + // MARK: Properties + + private let error = AFError.responseSerializationFailed(reason: .inputFileNil) + + private var jsonEmptyDataFileURL: URL { url(forResource: "empty_data", withExtension: "json") } + private var jsonValidDataFileURL: URL { url(forResource: "valid_data", withExtension: "json") } + private var jsonInvalidDataFileURL: URL { url(forResource: "invalid_data", withExtension: "json") } + + private var stringEmptyDataFileURL: URL { url(forResource: "empty_string", withExtension: "txt") } + private var stringUTF8DataFileURL: URL { url(forResource: "utf8_string", withExtension: "txt") } + private var stringUTF32DataFileURL: URL { url(forResource: "utf32_string", withExtension: "txt") } + + private var invalidFileURL: URL { URL(fileURLWithPath: "/this/file/does/not/exist.txt") } + + // MARK: Tests - Data Response Serializer + + func testThatDataResponseSerializerSucceedsWhenFileDataIsNotNil() { + // Given + let serializer = DataResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatDataResponseSerializerFailsWhenFileDataIsEmpty() { + // Given + let serializer = DataResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatDataResponseSerializerFailsWhenFileURLIsNil() { + // Given + let serializer = DataResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatDataResponseSerializerFailsWhenFileURLIsInvalid() { + // Given + let serializer = DataResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true) + } + + func testThatDataResponseSerializerFailsWhenErrorIsNotNil() { + // Given + let serializer = DataResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatDataResponseSerializerFailsWhenFileURLIsNilWithNonEmptyResponseStatusCode() { + // Given + let serializer = DataResponseSerializer() + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatDataResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() { + // Given + let serializer = DataResponseSerializer() + let response = HTTPURLResponse(statusCode: 205) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + XCTAssertEqual(result.success?.count, 0) + } + + // MARK: Tests - String Response Serializer + + func testThatStringResponseSerializerFailsWhenFileURLIsNil() { + // Given + let serializer = StringResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatStringResponseSerializerFailsWhenFileURLIsInvalid() { + // Given + let serializer = StringResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) } + + // Then + XCTAssertEqual(result.isSuccess, false) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true) + } + + func testThatStringResponseSerializerFailsWhenFileDataIsEmpty() { + // Given + let serializer = StringResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + func testThatStringResponseSerializerSucceedsWithUTF8DataAndNoProvidedEncoding() { + // Given + let serializer = StringResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatStringResponseSerializerSucceedsWithUTF8DataAndUTF8ProvidedEncoding() { + // Given + let serializer = StringResponseSerializer(encoding: .utf8) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF8DataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatStringResponseSerializerSucceedsWithUTF8DataUsingResponseTextEncodingName() { + // Given + let serializer = StringResponseSerializer() + let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"]) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF8DataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ProvidedEncoding() { + // Given + let serializer = StringResponseSerializer(encoding: .utf8) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: stringUTF32DataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true) + XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8) + } + + func testThatStringResponseSerializerFailsWithUTF32DataAndUTF8ResponseEncoding() { + // Given + let serializer = StringResponseSerializer() + let response = HTTPURLResponse(statusCode: 200, headers: ["Content-Type": "image/jpeg; charset=utf-8"]) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringUTF32DataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isStringSerializationFailed, true) + XCTAssertEqual(result.failure?.asAFError?.failedStringEncoding, .utf8) + } + + func testThatStringResponseSerializerFailsWhenErrorIsNotNil() { + // Given + let serializer = StringResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatStringResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() { + // Given + let serializer = StringResponseSerializer() + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + func testThatStringResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() { + // Given + let serializer = StringResponseSerializer() + let response = HTTPURLResponse(statusCode: 204) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: stringEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + XCTAssertEqual(result.success, "") + } + + // MARK: Tests - JSON Response Serializer + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenFileURLIsNil() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenFileURLIsInvalid() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: invalidFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileReadFailed, true) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenFileDataIsEmpty() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputDataNilOrZeroLength, true) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerSucceedsWhenDataIsValidJSON() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonValidDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenDataIsInvalidJSON() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: jsonInvalidDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isJSONSerializationFailed, true) + XCTAssertEqual((result.failure?.asAFError?.underlyingError as? CocoaError)?.code, .propertyListReadCorrupt) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenErrorIsNotNil() { + // Given + let serializer = JSONResponseSerializer() + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: nil, fileURL: nil, error: error) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerFailsWhenDataIsNilWithNonEmptyResponseStatusCode() { + // Given + let serializer = JSONResponseSerializer() + let response = HTTPURLResponse(statusCode: 200) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: nil, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + XCTAssertEqual(result.failure?.asAFError?.isInputFileNil, true) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerSucceedsWhenDataIsNilWithEmptyResponseStatusCode() { + // Given + let serializer = JSONResponseSerializer() + let response = HTTPURLResponse(statusCode: 205) + + // When + let result = Result { try serializer.serializeDownload(request: nil, response: response, fileURL: jsonEmptyDataFileURL, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertNotNil(result.success) + XCTAssertNil(result.failure) + + XCTAssertEqual(result.success as? NSNull, NSNull()) + } +} + +final class CustomResponseSerializerTests: BaseTestCase { + func testThatCustomResponseSerializersCanBeWrittenWithoutCompilerIssues() { + // Given + final class UselessResponseSerializer: ResponseSerializer { + func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data? { + data + } + } + let serializer = UselessResponseSerializer() + let expectation = expectation(description: "request should finish") + var data: Data? + + // When + AF.request(.default).response(responseSerializer: serializer) { response in + data = response.data + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(data) + } +} + +final class DataPreprocessorSerializationTests: BaseTestCase { + struct DropFirst: DataPreprocessor { + func preprocess(_ data: Data) throws -> Data { + data.dropFirst() + } + } + + struct Throwing: DataPreprocessor { + struct Error: Swift.Error {} + + func preprocess(_ data: Data) throws -> Data { + throw Error() + } + } + + func testThatDataResponseSerializerProperlyCallsSuccessfulDataPreprocessor() { + // Given + let preprocessor = DropFirst() + let serializer = DataResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("abcd".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(result.success, Data("bcd".utf8)) + XCTAssertNil(result.failure) + } + + func testThatDataResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() { + // Given + let preprocessor = Throwing() + let serializer = DataResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("abcd".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + } + + func testThatStringResponseSerializerProperlyCallsSuccessfulDataPreprocessor() { + // Given + let preprocessor = DropFirst() + let serializer = StringResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("abcd".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(result.success, "bcd") + XCTAssertNil(result.failure) + } + + func testThatStringResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() { + // Given + let preprocessor = Throwing() + let serializer = StringResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("abcd".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerProperlyCallsSuccessfulDataPreprocessor() { + // Given + let preprocessor = DropFirst() + let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("1\"abcd\"".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(result.success as? String, "abcd") + XCTAssertNil(result.failure) + } + + @available(*, deprecated) + func testThatJSONResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() { + // Given + let preprocessor = Throwing() + let serializer = JSONResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("1\"abcd\"".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + } + + func testThatDecodableResponseSerializerProperlyCallsSuccessfulDataPreprocessor() { + // Given + let preprocessor = DropFirst() + let serializer = DecodableResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("1{\"string\":\"string\"}".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isSuccess) + XCTAssertEqual(result.success?.string, "string") + XCTAssertNil(result.failure) + } + + func testThatDecodableResponseSerializerProperlyReceivesErrorFromFailingDataPreprocessor() { + // Given + let preprocessor = Throwing() + let serializer = DecodableResponseSerializer(dataPreprocessor: preprocessor) + let data = Data("1{\"string\":\"string\"}".utf8) + + // When + let result = Result { try serializer.serialize(request: nil, response: nil, data: data, error: nil) } + + // Then + XCTAssertTrue(result.isFailure) + XCTAssertNil(result.success) + XCTAssertNotNil(result.failure) + } +} + +final class DataPreprocessorTests: BaseTestCase { + func testThatPassthroughPreprocessorPassesDataThrough() { + // Given + let preprocessor = PassthroughPreprocessor() + let data = Data("data".utf8) + + // When + let result = Result { try preprocessor.preprocess(data) } + + // Then + XCTAssertEqual(data, result.success, "Preprocessed data should equal original data.") + } + + func testThatGoogleXSSIPreprocessorProperlyPreprocessesData() { + // Given + let preprocessor = GoogleXSSIPreprocessor() + let data = Data(")]}',\nabcd".utf8) + + // When + let result = Result { try preprocessor.preprocess(data) } + + // Then + XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd") + } + + func testThatGoogleXSSIPreprocessorDoesNotChangeDataIfPrefixDoesNotMatch() { + // Given + let preprocessor = GoogleXSSIPreprocessor() + let data = Data("abcd".utf8) + + // When + let result = Result { try preprocessor.preprocess(data) } + + // Then + XCTAssertEqual(result.success.map { String(decoding: $0, as: UTF8.self) }, "abcd") + } +} + +final class StaticDataPreprocessorTests: BaseTestCase { + func consumeDataPreprocessor(_ dataPreprocessor: DataPreprocessor) { + _ = dataPreprocessor + } + + func testThatPassthroughCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeDataPreprocessor(.passthrough) + } + + func testThatGoogleXSSICanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeDataPreprocessor(.googleXSSI) + } +} + +extension HTTPURLResponse { + convenience init(statusCode: Int, headers: HTTPHeaders? = nil) { + let url = Endpoint().url + #if os(watchOS) || os(Linux) || os(Windows) || os(Android) + let httpVersion = "HTTP/1.1" + #else + let httpVersion = String(kCFHTTPVersion1_1) + #endif + self.init(url: url, statusCode: statusCode, httpVersion: httpVersion, headerFields: headers?.dictionary)! + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/ResponseTests.swift b/Carthage/Checkouts/Alamofire/Tests/ResponseTests.swift new file mode 100644 index 00000000..144bd7b5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ResponseTests.swift @@ -0,0 +1,652 @@ +// +// ResponseTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class ResponseTestCase: BaseTestCase { + func testThatResponseReturnsSuccessResultWithValidData() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseReturnsFailureResultWithOptionalDataAndError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL error") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class ResponseDataTestCase: BaseTestCase { + func testThatResponseDataReturnsSuccessResultWithValidData() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseData { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseDataReturnsFailureResultWithOptionalDataAndError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL error") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).responseData { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class ResponseStringTestCase: BaseTestCase { + func testThatResponseStringReturnsSuccessResultWithValidString() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseString { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL error") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).responseString { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +@available(*, deprecated) +final class ResponseJSONTestCase: BaseTestCase { + func testThatResponseJSONReturnsSuccessResultWithValidJSON() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseJSON { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).responseJSON { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseJSONReturnsSuccessResultForGETRequest() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseJSON { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + + if + let responseDictionary = response?.result.success as? [String: Any], + let args = responseDictionary["args"] as? [String: String] { + XCTAssertEqual(args, ["foo": "bar"], "args should match parameters") + } else { + XCTFail("args should not be nil") + } + } + + func testThatResponseJSONReturnsSuccessResultForPOSTRequest() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.method(.post), parameters: ["foo": "bar"]).responseJSON { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + + if + let responseDictionary = response?.result.success as? [String: Any], + let form = responseDictionary["form"] as? [String: String] { + XCTAssertEqual(form, ["foo": "bar"], "form should match parameters") + } else { + XCTFail("form should not be nil") + } + } +} + +final class ResponseJSONDecodableTestCase: BaseTestCase { + func testThatResponseDecodableReturnsSuccessResultWithValidJSON() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(url, parameters: [:]).responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(response?.result.success?.url, url.absoluteString) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseDecodableWithPassedTypeReturnsSuccessResultWithValidJSON() { + // Given + let url = Endpoint().url + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(url, parameters: [:]).responseDecodable(of: TestResponse.self) { + response = $0 + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(response?.result.success?.url, url.absoluteString) + XCTAssertNotNil(response?.metrics) + } + + func testThatResponseStringReturnsFailureResultWithOptionalDataAndError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: [:]).responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class ResponseMapTestCase: BaseTestCase { + func testThatMapTransformsSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.map { response in + response.args?["foo"] ?? "invalid" + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(response?.result.success, "bar") + XCTAssertNotNil(response?.metrics) + } + + func testThatMapPreservesFailureError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL error") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).responseData { resp in + response = resp.map { _ in "ignored" } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class ResponseTryMapTestCase: BaseTestCase { + func testThatTryMapTransformsSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseDecodable(of: TestResponse.self) { resp in + response = resp.tryMap { response in + response.args?["foo"] ?? "invalid" + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(response?.result.success, "bar") + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapCatchesTransformationError() { + // Given + struct TransformError: Error {} + + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default, parameters: ["foo": "bar"]).responseData { resp in + response = resp.tryMap { _ in + throw TransformError() + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + + if let error = response?.result.failure { + XCTAssertTrue(error is TransformError) + } else { + XCTFail("tryMap should catch the transformation error") + } + + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapPreservesFailureError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail with invalid URL error") + + var response: DataResponse? + + // When + AF.request(urlString, parameters: ["foo": "bar"]).responseData { resp in + response = resp.tryMap { _ in "ignored" } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.asAFError?.isSessionTaskError, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +enum TestError: Error { + case error(error: AFError) +} + +enum TransformationError: Error { + case error + + func alwaysFails() throws -> TestError { + throw TransformationError.error + } +} + +final class ResponseMapErrorTestCase: BaseTestCase { + func testThatMapErrorTransformsFailureValue() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should not succeed") + + var response: DataResponse? + + // When + AF.request(urlString).responseDecodable(of: TestResponse.self) { resp in + response = resp.mapError { error in + TestError.error(error: error) + } + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + guard let error = response?.error, case .error = error else { XCTFail(); return } + + XCTAssertNotNil(response?.metrics) + } + + func testThatMapErrorPreservesSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default).responseData { resp in + response = resp.mapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } +} + +// MARK: - + +final class ResponseTryMapErrorTestCase: BaseTestCase { + func testThatTryMapErrorPreservesSuccessValue() { + // Given + let expectation = expectation(description: "request should succeed") + + var response: DataResponse? + + // When + AF.request(.default).responseData { resp in + response = resp.tryMapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapErrorCatchesTransformationError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DataResponse? + + // When + AF.request(urlString).responseData { resp in + response = resp.tryMapError { _ in try TransformationError.error.alwaysFails() } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + + if let error = response?.result.failure { + XCTAssertTrue(error is TransformationError) + } else { + XCTFail("tryMapError should catch the transformation error") + } + + XCTAssertNotNil(response?.metrics) + } + + func testThatTryMapErrorTransformsError() { + // Given + let urlString = String.invalidURL + let expectation = expectation(description: "request should fail") + + var response: DataResponse? + + // When + AF.request(urlString).responseData { resp in + response = resp.tryMapError { TestError.error(error: $0) } + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertNotNil(response?.metrics) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Result+AlamofireTests.swift b/Carthage/Checkouts/Alamofire/Tests/Result+AlamofireTests.swift new file mode 100644 index 00000000..7e47f52e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Result+AlamofireTests.swift @@ -0,0 +1,46 @@ +// +// Result+AlamofireTests.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation + +extension Result { + var isSuccess: Bool { + guard case .success = self else { return false } + return true + } + + var isFailure: Bool { + !isSuccess + } + + var success: Success? { + guard case let .success(value) = self else { return nil } + return value + } + + var failure: Failure? { + guard case let .failure(error) = self else { return nil } + return error + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/RetryPolicyTests.swift b/Carthage/Checkouts/Alamofire/Tests/RetryPolicyTests.swift new file mode 100644 index 00000000..48dd4f00 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/RetryPolicyTests.swift @@ -0,0 +1,448 @@ +// +// RetryPolicyTests.swift +// +// Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +class BaseRetryPolicyTestCase: BaseTestCase { + // MARK: Helper Types + + final class StubRequest: DataRequest { + let urlRequest: URLRequest + override var request: URLRequest? { urlRequest } + + let mockedResponse: HTTPURLResponse? + override var response: HTTPURLResponse? { mockedResponse } + + init(_ url: URL, method: HTTPMethod, response: HTTPURLResponse?, session: Session) { + mockedResponse = response + + let request = Session.RequestConvertible(url: url, + method: method, + parameters: nil, + encoding: URLEncoding.default, + headers: nil, + requestModifier: nil) + + urlRequest = try! request.asURLRequest() + + super.init(convertible: request, + underlyingQueue: session.rootQueue, + serializationQueue: session.serializationQueue, + eventMonitor: session.eventMonitor, + interceptor: nil, + delegate: session) + } + } + + // MARK: Properties + + let idempotentMethods: Set = [.get, .head, .put, .delete, .options, .trace] + let nonIdempotentMethods: Set = [.post, .patch, .connect] + var methods: Set { idempotentMethods.union(nonIdempotentMethods) } + + let session = Session(rootQueue: .main, startRequestsImmediately: false) + + let url = Endpoint().url + + let connectionLost = URLError(.networkConnectionLost) + let resourceUnavailable = URLError(.resourceUnavailable) + let unknown = URLError(.unknown) + + lazy var connectionLostError = AFError.sessionTaskFailed(error: connectionLost) + lazy var resourceUnavailableError = AFError.sessionTaskFailed(error: resourceUnavailable) + lazy var unknownError = AFError.sessionTaskFailed(error: unknown) + + let retryableStatusCodes: Set = [408, 500, 502, 503, 504] + let statusCodes = Set(100...599) + + let retryableErrorCodes: Set = [.backgroundSessionInUseByAnotherProcess, + .backgroundSessionWasDisconnected, + .badServerResponse, + .callIsActive, + .cannotConnectToHost, + .cannotFindHost, + .cannotLoadFromNetwork, + .dataNotAllowed, + .dnsLookupFailed, + .downloadDecodingFailedMidStream, + .downloadDecodingFailedToComplete, + .internationalRoamingOff, + .networkConnectionLost, + .notConnectedToInternet, + .secureConnectionFailed, + .serverCertificateHasBadDate, + .serverCertificateNotYetValid, + .timedOut] + + let nonRetryableErrorCodes: Set = [.appTransportSecurityRequiresSecureConnection, + .backgroundSessionRequiresSharedContainer, + .badURL, + .cancelled, + .cannotCloseFile, + .cannotCreateFile, + .cannotDecodeContentData, + .cannotDecodeRawData, + .cannotMoveFile, + .cannotOpenFile, + .cannotParseResponse, + .cannotRemoveFile, + .cannotWriteToFile, + .clientCertificateRejected, + .clientCertificateRequired, + .dataLengthExceedsMaximum, + .fileDoesNotExist, + .fileIsDirectory, + .httpTooManyRedirects, + .noPermissionsToReadFile, + .redirectToNonExistentLocation, + .requestBodyStreamExhausted, + .resourceUnavailable, + .serverCertificateHasUnknownRoot, + .serverCertificateUntrusted, + .unknown, + .unsupportedURL, + .userAuthenticationRequired, + .userCancelledAuthentication, + .zeroByteResource] + + var errorCodes: Set { + retryableErrorCodes.union(nonRetryableErrorCodes) + } + + // MARK: Test Helpers + + func request(method: HTTPMethod = .get, statusCode: Int? = nil) -> Request { + var response: HTTPURLResponse? + + if let statusCode = statusCode { + response = HTTPURLResponse(url: url, statusCode: statusCode, httpVersion: nil, headerFields: nil) + } + + return StubRequest(url, method: method, response: response, session: session) + } + + func urlError(with code: URLError.Code) -> URLError { + NSError(domain: URLError.errorDomain, code: code.rawValue, userInfo: nil) as! URLError + } +} + +// MARK: - + +final class RetryPolicyTestCase: BaseRetryPolicyTestCase { + // MARK: Tests - Retry + + func testThatRetryIsNotPerformedOnCancelledRequests() { + // Given + let retrier = InspectorInterceptor(Retrier { _, _, _, completion in + completion(.retry) + }) + let session = Session(interceptor: retrier) + let didFinish = expectation(description: "didFinish request") + + // When + let request = session.request(.default).responseDecodable(of: TestResponse.self) { _ in + didFinish.fulfill() + } + request.cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertTrue(request.isCancelled) + XCTAssertEqual(retrier.retryCalledCount, 0) + } + + func testThatRetryPolicyRetriesRequestsBelowRetryLimit() { + // Given + let retryPolicy = RetryPolicy() + let request = request(method: .get) + + var results: [Int: RetryResult] = [:] + + // When + for index in 0...2 { + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: connectionLostError) { result in + results[index] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + request.prepareForRetry() + } + + // Then + XCTAssertEqual(results.count, 3) + + if results.count == 3 { + XCTAssertEqual(results[0]?.retryRequired, true) + XCTAssertEqual(results[0]?.delay, 0.5) + XCTAssertNil(results[0]?.error) + + XCTAssertEqual(results[1]?.retryRequired, true) + XCTAssertEqual(results[1]?.delay, 1.0) + XCTAssertNil(results[1]?.error) + + XCTAssertEqual(results[2]?.retryRequired, false) + XCTAssertNil(results[2]?.delay) + XCTAssertNil(results[2]?.error) + } + } + + func testThatRetryPolicyRetriesIdempotentRequests() { + // Given + let retryPolicy = RetryPolicy() + var results: [HTTPMethod: RetryResult] = [:] + + // When + for method in methods { + let request = request(method: method) + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: connectionLostError) { result in + results[method] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + } + + // Then + XCTAssertEqual(results.count, methods.count) + + for (method, result) in results { + XCTAssertEqual(result.retryRequired, idempotentMethods.contains(method)) + XCTAssertEqual(result.delay, result.retryRequired ? 0.5 : nil) + XCTAssertNil(result.error) + } + } + + func testThatRetryPolicyRetriesRequestsWithRetryableStatusCodes() { + // Given + let retryPolicy = RetryPolicy() + var results: [Int: RetryResult] = [:] + + // When + for statusCode in statusCodes { + let request = request(method: .get, statusCode: statusCode) + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: unknownError) { result in + results[statusCode] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + } + + // Then + XCTAssertEqual(results.count, statusCodes.count) + + for (statusCode, result) in results { + XCTAssertEqual(result.retryRequired, retryableStatusCodes.contains(statusCode)) + XCTAssertEqual(result.delay, result.retryRequired ? 0.5 : nil) + XCTAssertNil(result.error) + } + } + + func testThatRetryPolicyRetriesRequestsWithRetryableErrors() { + // Given + let retryPolicy = RetryPolicy() + var results: [URLError.Code: RetryResult] = [:] + + // When + for code in errorCodes { + let request = request(method: .get) + let error = URLError(code) + + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: error) { result in + results[code] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + } + + // Then + XCTAssertEqual(results.count, errorCodes.count) + + for (urlErrorCode, result) in results { + XCTAssertEqual(result.retryRequired, retryableErrorCodes.contains(urlErrorCode)) + XCTAssertEqual(result.delay, result.retryRequired ? 0.5 : nil) + XCTAssertNil(result.error) + } + } + + func testThatRetryPolicyRetriesRequestsWithRetryableAFErrors() { + // Given + let retryPolicy = RetryPolicy() + var results: [URLError.Code: RetryResult] = [:] + + // When + for code in errorCodes { + let request = request(method: .get) + let error = AFError.sessionTaskFailed(error: URLError(code)) + + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: error) { result in + results[code] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + } + + // Then + XCTAssertEqual(results.count, errorCodes.count) + + for (urlErrorCode, result) in results { + XCTAssertEqual(result.retryRequired, retryableErrorCodes.contains(urlErrorCode)) + XCTAssertEqual(result.delay, result.retryRequired ? 0.5 : nil) + XCTAssertNil(result.error) + } + } + + func testThatRetryPolicyDoesNotRetryErrorsThatAreNotRetryable() { + // Given + let retryPolicy = RetryPolicy() + let request = request(method: .get) + + let errors: [Error] = [resourceUnavailable, + unknown, + resourceUnavailableError, + unknownError] + + var results: [RetryResult] = [] + + // When + for error in errors { + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: error) { result in + results.append(result) + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + } + + // Then + XCTAssertEqual(results.count, errors.count) + + for result in results { + XCTAssertFalse(result.retryRequired) + XCTAssertNil(result.delay) + XCTAssertNil(result.error) + } + } + + // MARK: Tests - Exponential Backoff + + func testThatRetryPolicyTimeDelayBacksOffExponentially() { + // Given + let retryPolicy = RetryPolicy(retryLimit: 4) + let request = request(method: .get) + + var results: [Int: RetryResult] = [:] + + // When + for index in 0...4 { + let expectation = expectation(description: "retry policy should complete") + + retryPolicy.retry(request, for: session, dueTo: connectionLostError) { result in + results[index] = result + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + request.prepareForRetry() + } + + // Then + XCTAssertEqual(results.count, 5) + + if results.count == 5 { + XCTAssertEqual(results[0]?.retryRequired, true) + XCTAssertEqual(results[0]?.delay, 0.5) + XCTAssertNil(results[0]?.error) + + XCTAssertEqual(results[1]?.retryRequired, true) + XCTAssertEqual(results[1]?.delay, 1.0) + XCTAssertNil(results[1]?.error) + + XCTAssertEqual(results[2]?.retryRequired, true) + XCTAssertEqual(results[2]?.delay, 2.0) + XCTAssertNil(results[2]?.error) + + XCTAssertEqual(results[3]?.retryRequired, true) + XCTAssertEqual(results[3]?.delay, 4.0) + XCTAssertNil(results[3]?.error) + + XCTAssertEqual(results[4]?.retryRequired, false) + XCTAssertNil(results[4]?.delay) + XCTAssertNil(results[4]?.error) + } + } +} + +// MARK: - + +final class ConnectionLostRetryPolicyTestCase: BaseRetryPolicyTestCase { + func testThatConnectionLostRetryPolicyCanBeInitializedWithDefaultValues() { + // Given, When + let retryPolicy = ConnectionLostRetryPolicy() + + // Then + XCTAssertEqual(retryPolicy.retryLimit, 2) + XCTAssertEqual(retryPolicy.exponentialBackoffBase, 2) + XCTAssertEqual(retryPolicy.exponentialBackoffScale, 0.5) + XCTAssertEqual(retryPolicy.retryableHTTPMethods, idempotentMethods) + XCTAssertEqual(retryPolicy.retryableHTTPStatusCodes, []) + XCTAssertEqual(retryPolicy.retryableURLErrorCodes, [.networkConnectionLost]) + } + + func testThatConnectionLostRetryPolicyCanBeInitializedWithCustomValues() { + // Given, When + let retryPolicy = ConnectionLostRetryPolicy(retryLimit: 3, + exponentialBackoffBase: 4, + exponentialBackoffScale: 0.25, + retryableHTTPMethods: [.delete, .get]) + + // Then + XCTAssertEqual(retryPolicy.retryLimit, 3) + XCTAssertEqual(retryPolicy.exponentialBackoffBase, 4) + XCTAssertEqual(retryPolicy.exponentialBackoffScale, 0.25) + XCTAssertEqual(retryPolicy.retryableHTTPMethods, [.delete, .get]) + XCTAssertEqual(retryPolicy.retryableHTTPStatusCodes, []) + XCTAssertEqual(retryPolicy.retryableURLErrorCodes, [.networkConnectionLost]) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/ServerTrustEvaluatorTests.swift b/Carthage/Checkouts/Alamofire/Tests/ServerTrustEvaluatorTests.swift new file mode 100644 index 00000000..2e985798 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ServerTrustEvaluatorTests.swift @@ -0,0 +1,1448 @@ +// +// ServerTrustEvaluatorTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if canImport(Security) + +import Alamofire +import Foundation +import XCTest + +private enum TestCertificates { + // Root Certificates + static let rootCA = TestCertificates.certificate(filename: "alamofire-root-ca") + + // Intermediate Certificates + static let intermediateCA1 = TestCertificates.certificate(filename: "alamofire-signing-ca1") + static let intermediateCA2 = TestCertificates.certificate(filename: "alamofire-signing-ca2") + + // Leaf Certificates - Signed by CA1 + static let leafWildcard = TestCertificates.certificate(filename: "wildcard.alamofire.org") + static let leafMultipleDNSNames = TestCertificates.certificate(filename: "multiple-dns-names") + static let leafSignedByCA1 = TestCertificates.certificate(filename: "signed-by-ca1") + static let leafDNSNameAndURI = TestCertificates.certificate(filename: "test.alamofire.org") + + // Leaf Certificates - Signed by CA2 + static let leafExpired = TestCertificates.certificate(filename: "expired") + static let leafMissingDNSNameAndURI = TestCertificates.certificate(filename: "missing-dns-name-and-uri") + static let leafSignedByCA2 = TestCertificates.certificate(filename: "signed-by-ca2") + static let leafValidDNSName = TestCertificates.certificate(filename: "valid-dns-name") + static let leafValidURI = TestCertificates.certificate(filename: "valid-uri") + + static func certificate(filename: String) -> SecCertificate { + let filePath = Bundle.test.path(forResource: filename, ofType: "cer")! + let data = try! Data(contentsOf: URL(fileURLWithPath: filePath)) + let certificate = SecCertificateCreateWithData(nil, data as CFData)! + + return certificate + } +} + +// MARK: - + +private enum TestTrusts { + // Leaf Trusts - Signed by CA1 + case leafWildcard + case leafMultipleDNSNames + case leafSignedByCA1 + case leafDNSNameAndURI + + // Leaf Trusts - Signed by CA2 + case leafExpired + case leafMissingDNSNameAndURI + case leafSignedByCA2 + case leafValidDNSName + case leafValidURI + + // Invalid Trusts + case leafValidDNSNameMissingIntermediate + case leafValidDNSNameWithIncorrectIntermediate + + var trust: SecTrust { + let trust: SecTrust + + switch self { + case .leafWildcard: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafWildcard, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + case .leafMultipleDNSNames: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafMultipleDNSNames, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + case .leafSignedByCA1: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafSignedByCA1, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + case .leafDNSNameAndURI: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafDNSNameAndURI, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + case .leafExpired: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafExpired, + TestCertificates.intermediateCA2, + TestCertificates.rootCA]) + case .leafMissingDNSNameAndURI: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafMissingDNSNameAndURI, + TestCertificates.intermediateCA2, + TestCertificates.rootCA]) + case .leafSignedByCA2: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafSignedByCA2, + TestCertificates.intermediateCA2, + TestCertificates.rootCA]) + case .leafValidDNSName: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2, + TestCertificates.rootCA]) + case .leafValidURI: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafValidURI, + TestCertificates.intermediateCA2, + TestCertificates.rootCA]) + case .leafValidDNSNameMissingIntermediate: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.rootCA]) + case .leafValidDNSNameWithIncorrectIntermediate: + trust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + } + + return trust + } + + static func trustWithCertificates(_ certificates: [SecCertificate]) -> SecTrust { + let policy = SecPolicyCreateBasicX509() + var trust: SecTrust? + SecTrustCreateWithCertificates(certificates as CFTypeRef, policy, &trust) + + return trust! + } +} + +// MARK: - Basic X509 and SSL Exploration Tests - + +class ServerTrustPolicyTestCase: BaseTestCase { + func setRootCertificateAsLoneAnchorCertificateForTrust(_ trust: SecTrust) { + SecTrustSetAnchorCertificates(trust, [TestCertificates.rootCA] as CFArray) + SecTrustSetAnchorCertificatesOnly(trust, true) + } +} + +// MARK: - SecTrust Extension + +extension SecTrust { + enum TrustError: Error { case invalid } + + /// Evaluates `self` and returns `true` if the evaluation succeeds with a value of `.unspecified` or `.proceed`. + var isValid: Bool { + #if swift(>=5.9) + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, visionOS 1, *) { + return Result { try af.evaluate() }.isSuccess + } else { + return Result { try af.validate { _, _ in TrustError.invalid } }.isSuccess + } + #else + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + return Result { try af.evaluate() }.isSuccess + } else { + return Result { try af.validate { _, _ in TrustError.invalid } }.isSuccess + } + #endif + } +} + +// MARK: - + +class ServerTrustPolicyExplorationBasicX509PolicyValidationTestCase: ServerTrustPolicyTestCase { + func testThatAnchoredRootCertificatePassesBasicX509ValidationWithRootInTrust() { + // Given + let trust = TestTrusts.trustWithCertificates([TestCertificates.leafDNSNameAndURI, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateBasicX509()] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatAnchoredRootCertificatePassesBasicX509ValidationWithoutRootInTrust() { + // Given + let trust = TestTrusts.leafDNSNameAndURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateBasicX509()] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatCertificateMissingDNSNamePassesBasicX509Validation() { + // Given + let trust = TestTrusts.leafMissingDNSNameAndURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateBasicX509()] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatExpiredCertificateFailsBasicX509Validation() { + // Given + let trust = TestTrusts.leafExpired.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateBasicX509()] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertFalse(trust.isValid, "trust should not be valid") + } +} + +// MARK: - + +class ServerTrustPolicyExplorationSSLPolicyValidationTestCase: ServerTrustPolicyTestCase { + func testThatAnchoredRootCertificatePassesSSLValidationWithRootInTrust() { + // Given + let trust = TestTrusts.trustWithCertificates([TestCertificates.leafDNSNameAndURI, + TestCertificates.intermediateCA1, + TestCertificates.rootCA]) + + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatAnchoredRootCertificatePassesSSLValidationWithoutRootInTrust() { + // Given + let trust = TestTrusts.leafDNSNameAndURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatCertificateMissingDNSNameFailsSSLValidation() { + // Given + let trust = TestTrusts.leafMissingDNSNameAndURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertFalse(trust.isValid, "trust should not be valid") + } + + func testThatWildcardCertificatePassesSSLValidation() { + // Given + let trust = TestTrusts.leafWildcard.trust // *.alamofire.org + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatDNSNameCertificatePassesSSLValidation() { + // Given + let trust = TestTrusts.leafValidDNSName.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should be valid") + } + + func testThatURICertificateFailsSSLValidation() { + // Given + let trust = TestTrusts.leafValidURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertFalse(trust.isValid, "trust should not be valid") + } + + func testThatMultipleDNSNamesCertificatePassesSSLValidationForAllEntries() { + // Given + let trust = TestTrusts.leafMultipleDNSNames.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString), + SecPolicyCreateSSL(true, "blog.alamofire.org" as CFString), + SecPolicyCreateSSL(true, "www.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should not be valid") + } + + func testThatPassingNilForHostParameterAllowsCertificateMissingDNSNameToPassSSLValidation() { + // Given + let trust = TestTrusts.leafMissingDNSNameAndURI.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, nil)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertTrue(trust.isValid, "trust should not be valid") + } + + func testThatExpiredCertificateFailsSSLValidation() { + // Given + let trust = TestTrusts.leafExpired.trust + setRootCertificateAsLoneAnchorCertificateForTrust(trust) + + // When + let policies = [SecPolicyCreateSSL(true, "test.alamofire.org" as CFString)] + SecTrustSetPolicies(trust, policies as CFTypeRef) + + // Then + XCTAssertFalse(trust.isValid, "trust should not be valid") + } +} + +// MARK: - Server Trust Policy Tests - + +class ServerTrustPolicyPerformDefaultEvaluationTestCase: ServerTrustPolicyTestCase { + // MARK: Do NOT Validate Host + + func testThatValidCertificateChainPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatNonAnchoredRootCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2]) + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingDNSNameLeafCertificatePassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafMissingDNSNameAndURI.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatExpiredCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingIntermediateCertificateInChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + // MARK: Validate Host + + func testThatValidCertificateChainPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: true) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatNonAnchoredRootCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2]) + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: true) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingDNSNameLeafCertificateFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafMissingDNSNameAndURI.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: true) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatWildcardedLeafCertificateChainPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafWildcard.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: true) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatExpiredCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: true) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingIntermediateCertificateInChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let serverTrustPolicy = DefaultTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + XCTAssertEqual(result.failure?.asAFError?.isServerTrustEvaluationError, true) + } +} + +// MARK: - + +class ServerTrustPolicyPerformRevokedEvaluationTestCase: ServerTrustPolicyTestCase { + // MARK: Do NOT Validate Host + + func testThatValidCertificateChainPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let serverTrustPolicy = RevocationTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatNonAnchoredRootCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2]) + let serverTrustPolicy = RevocationTrustEvaluator(validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingDNSNameLeafCertificatePassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafMissingDNSNameAndURI.trust + let serverTrustPolicy = RevocationTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatExpiredCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let serverTrustPolicy = RevocationTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingIntermediateCertificateInChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let serverTrustPolicy = RevocationTrustEvaluator(validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + // MARK: Validate Host + + func testThatValidCertificateChainPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatNonAnchoredRootCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2]) + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingDNSNameLeafCertificateFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafMissingDNSNameAndURI.trust + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatWildcardedLeafCertificateChainPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafWildcard.trust + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatExpiredCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatMissingIntermediateCertificateInChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let serverTrustPolicy = RevocationTrustEvaluator() + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } +} + +// MARK: - + +class ServerTrustPolicyPinCertificatesTestCase: ServerTrustPolicyTestCase { + // MARK: Validate Certificate Chain Without Validating Host + + func testThatPinnedLeafCertificatePassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafValidDNSName] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedIntermediateCertificatePassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedRootCertificatePassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.rootCA] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningLeafCertificateNotInCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafSignedByCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: true, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningIntermediateCertificateNotInCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA1] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningExpiredLeafCertificateFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.leafExpired] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningIntermediateCertificateWithExpiredLeafCertificateFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + // MARK: Validate Certificate Chain and Host + + func testThatPinnedLeafCertificatePassesEvaluationWithSelfSignedSupportAndHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafValidDNSName] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, acceptSelfSignedCertificates: true) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedIntermediateCertificatePassesEvaluationWithSelfSignedSupportAndHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, acceptSelfSignedCertificates: true) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedRootCertificatePassesEvaluationWithSelfSignedSupportAndHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.rootCA] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, acceptSelfSignedCertificates: true) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningLeafCertificateNotInCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafSignedByCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: true, + validateHost: true) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningIntermediateCertificateNotInCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA1] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningExpiredLeafCertificateFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.leafExpired] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningIntermediateCertificateWithExpiredLeafCertificateFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + // MARK: Do NOT Validate Certificate Chain or Host + + func testThatPinnedLeafCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafValidDNSName] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedIntermediateCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinnedRootCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.rootCA] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningLeafCertificateNotInCertificateChainWithoutCertificateChainValidationFailsEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.leafSignedByCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningIntermediateCertificateNotInCertificateChainWithoutCertificateChainValidationFailsEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let certificates = [TestCertificates.intermediateCA1] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.leafExpired] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningIntermediateCertificateWithExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.intermediateCA2] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningRootCertificateWithExpiredLeafCertificateWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let certificates = [TestCertificates.rootCA] + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningMultipleCertificatesWithoutCertificateChainValidationPassesEvaluation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + + let certificates = [TestCertificates.leafMultipleDNSNames, // not in certificate chain + TestCertificates.leafSignedByCA1, // not in certificate chain + TestCertificates.leafExpired, // in certificate chain 👍🏼👍🏼 + TestCertificates.leafWildcard, // not in certificate chain + TestCertificates.leafDNSNameAndURI // not in certificate chain + ] + + let serverTrustPolicy = PinnedCertificatesTrustEvaluator(certificates: certificates, + performDefaultValidation: false, + validateHost: false) + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } +} + +// MARK: - + +class ServerTrustPolicyPinPublicKeysTestCase: ServerTrustPolicyTestCase { + // MARK: Validate Certificate Chain Without Validating Host + + func testThatPinningLeafKeyPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningIntermediateKeyPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.intermediateCA2].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningRootKeyPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.rootCA].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningKeyNotInCertificateChainFailsEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafSignedByCA2].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningBackupKeyPassesEvaluationWithoutHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafSignedByCA1, TestCertificates.intermediateCA1, TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + // MARK: Validate Certificate Chain and Host + + func testThatPinningLeafKeyPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningIntermediateKeyPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.intermediateCA2].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningRootKeyPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.rootCA].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningKeyNotInCertificateChainFailsEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafSignedByCA2].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningBackupKeyPassesEvaluationWithHostValidation() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let keys = [TestCertificates.leafSignedByCA1, TestCertificates.intermediateCA1, TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + // MARK: Do NOT perform default validation or validate host. + + func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithMissingIntermediateCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let keys = [TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningRootKeyWithoutCertificateChainValidationFailsEvaluationWithMissingIntermediateCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let keys = [TestCertificates.rootCA].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithIncorrectIntermediateCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameWithIncorrectIntermediate.trust + let keys = [TestCertificates.leafValidDNSName].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningLeafKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let keys = [TestCertificates.leafExpired].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningIntermediateKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let keys = [TestCertificates.intermediateCA2].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatPinningRootKeyWithoutCertificateChainValidationPassesEvaluationWithExpiredLeafCertificate() { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let keys = [TestCertificates.rootCA].af.publicKeys + let serverTrustPolicy = PublicKeysTrustEvaluator(keys: keys, + performDefaultValidation: false, + validateHost: false) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } +} + +// MARK: - + +class ServerTrustPolicyDisableEvaluationTestCase: ServerTrustPolicyTestCase { + func testThatCertificateChainMissingIntermediateCertificatePassesEvaluation() throws { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSNameMissingIntermediate.trust + let serverTrustPolicy = DisabledTrustEvaluator() + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatExpiredLeafCertificatePassesEvaluation() throws { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let serverTrustPolicy = DisabledTrustEvaluator() + + // When + let result = Result { try serverTrustPolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } +} + +// MARK: - + +class ServerTrustPolicyCompositeTestCase: ServerTrustPolicyTestCase { + func testThatValidCertificateChainPassesDefaultAndRevocationCompositeChecks() throws { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafValidDNSName.trust + let defaultPolicy = DefaultTrustEvaluator(validateHost: false) + let revocationPolicy = RevocationTrustEvaluator(validateHost: false) + let compositePolicy = CompositeTrustEvaluator(evaluators: [defaultPolicy, revocationPolicy]) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try compositePolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertTrue(result.isSuccess, "server trust should pass evaluation") + } + + func testThatNonAnchoredRootCertificateChainFailsEvaluationWithoutHostValidation() throws { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.trustWithCertificates([TestCertificates.leafValidDNSName, + TestCertificates.intermediateCA2]) + let defaultPolicy = DefaultTrustEvaluator(validateHost: false) + let revocationPolicy = RevocationTrustEvaluator(validateHost: false) + let compositePolicy = CompositeTrustEvaluator(evaluators: [defaultPolicy, revocationPolicy]) + + // When + let result = Result { try compositePolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } + + func testThatExpiredLeafCertificateFailsDefaultAndRevocationComposite() throws { + // Given + let host = "test.alamofire.org" + let serverTrust = TestTrusts.leafExpired.trust + let defaultPolicy = DefaultTrustEvaluator(validateHost: false) + let revocationPolicy = RevocationTrustEvaluator(validateHost: false) + let compositePolicy = CompositeTrustEvaluator(evaluators: [defaultPolicy, revocationPolicy]) + + // When + setRootCertificateAsLoneAnchorCertificateForTrust(serverTrust) + let result = Result { try compositePolicy.evaluate(serverTrust, forHost: host) } + + // Then + XCTAssertFalse(result.isSuccess, "server trust should not pass evaluation") + } +} + +// MARK: - + +final class ServerTrustPolicyCertificatesInBundleTestCase: ServerTrustPolicyTestCase { + func testOnlyValidCertificatesAreDetected() { + // Given + // Files present in bundle in the form of type+encoding+extension [key|cert][DER|PEM].[cer|crt|der|key|pem] + // certDER.cer: DER-encoded well-formed certificate + // certDER.crt: DER-encoded well-formed certificate + // certDER.der: DER-encoded well-formed certificate + // certPEM.*: PEM-encoded well-formed certificates, expected to fail: Apple API only handles DER encoding + // devURandomGibberish.crt: Random data, should fail + // keyDER.der: DER-encoded key, not a certificate, should fail + + // When + let certificates = Bundle.test.af.certificates + + // Then + // Expectation: 19 well-formed certificates in the test bundle plus 4 invalid certificates. + #if os(macOS) + // For some reason, macOS is allowing all certificates to be considered valid. Need to file a + // rdar demonstrating this behavior. + if #available(macOS 10.12, *) { + XCTAssertEqual(certificates.count, 19, "Expected 19 well-formed certificates") + } else { + XCTAssertEqual(certificates.count, 23, "Expected 23 well-formed certificates") + } + #else + XCTAssertEqual(certificates.count, 19, "Expected 19 well-formed certificates") + #endif + } +} + +final class StaticServerTrustAccessorTests: ServerTrustPolicyTestCase { + func consumeServerTrustEvaluator(_ evaluator: ServerTrustEvaluating) { + _ = evaluator + } + + func testThatRevocationEvaluatorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeServerTrustEvaluator(.revocationChecking()) + } + + func testThatPinnedCertificatesEvaluatorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeServerTrustEvaluator(.pinnedCertificates()) + } + + func testThatPublicKeysEvaluatorCanBeCreatedStaticallyFromProtocol() { + // Given, When, Then + consumeServerTrustEvaluator(.publicKeys()) + } +} + +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/SessionDelegateTests.swift b/Carthage/Checkouts/Alamofire/Tests/SessionDelegateTests.swift new file mode 100644 index 00000000..37bca369 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/SessionDelegateTests.swift @@ -0,0 +1,222 @@ +// +// SessionDelegateTests.swift +// +// Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +final class SessionDelegateTestCase: BaseTestCase { + // MARK: - Tests - Redirects + + func testThatRequestWillPerformHTTPRedirectionByDefault() { + // Given + let session = Session(configuration: .ephemeral) + let redirectURLString = Endpoint().url.absoluteString + + let expectation = expectation(description: "Request should redirect to \(redirectURLString)") + + var response: DataResponse? + + // When + session.request(.redirectTo(redirectURLString)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + func testThatRequestWillPerformRedirectionMultipleTimesByDefault() { + // Given + let session = Session(configuration: .ephemeral) + + let expectation = expectation(description: "Request should redirect") + + var response: DataResponse? + + // When + session.request(.redirect(5)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + func testThatRequestWillPerformRedirectionFor307Response() { + // Given + let session = Session(configuration: .ephemeral) + let redirectURLString = Endpoint().url.absoluteString + + let expectation = expectation(description: "Request should redirect to \(redirectURLString)") + + var response: DataResponse? + + // When + session.request(.redirectTo(redirectURLString, code: 307)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + XCTAssertEqual(response?.response?.url?.absoluteString, redirectURLString) + XCTAssertEqual(response?.response?.statusCode, 200) + } + + // MARK: - Tests - Notification + + func testThatAppropriateNotificationsAreCalledWithRequestForDataRequest() { + // Given + let session = Session(startRequestsImmediately: false) + let resumedRequest = Protected(nil) + let resumedTaskRequest = Protected(nil) + let completedTaskRequest = Protected(nil) + let completedRequest = Protected(nil) + var requestResponse: DataResponse? + let expect = expectation(description: "request should complete") + + // When + let request = session.request(.default).response { response in + requestResponse = response + expect.fulfill() + } + expectation(forNotification: Request.didResumeNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + resumedRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didResumeTaskNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + resumedTaskRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didCompleteTaskNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + completedTaskRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didFinishNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + completedRequest.write(notification.request) + return true + } + + request.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(resumedRequest) + XCTAssertNotNil(resumedTaskRequest) + XCTAssertNotNil(completedTaskRequest) + XCTAssertNotNil(completedRequest) + XCTAssertEqual(resumedRequest, completedRequest) + XCTAssertEqual(resumedTaskRequest, completedTaskRequest) + XCTAssertEqual(requestResponse?.response?.statusCode, 200) + } + + func testThatDidCompleteNotificationIsCalledWithRequestForDownloadRequests() { + // Given + let session = Session(startRequestsImmediately: false) + let resumedRequest = Protected(nil) + let resumedTaskRequest = Protected(nil) + let completedTaskRequest = Protected(nil) + let completedRequest = Protected(nil) + var requestResponse: DownloadResponse? + let expect = expectation(description: "request should complete") + + // When + let request = session.download(.default).response { response in + requestResponse = response + expect.fulfill() + } + expectation(forNotification: Request.didResumeNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + resumedRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didResumeTaskNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + resumedTaskRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didCompleteTaskNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + completedTaskRequest.write(notification.request) + return true + } + expectation(forNotification: Request.didFinishNotification, object: nil) { notification in + guard let receivedRequest = notification.request, receivedRequest == request else { return false } + + completedRequest.write(notification.request) + return true + } + + request.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(resumedRequest) + XCTAssertNotNil(resumedTaskRequest) + XCTAssertNotNil(completedTaskRequest) + XCTAssertNotNil(completedRequest) + XCTAssertEqual(resumedRequest, completedRequest) + XCTAssertEqual(resumedTaskRequest, completedTaskRequest) + XCTAssertEqual(requestResponse?.response?.statusCode, 200) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/SessionTests.swift b/Carthage/Checkouts/Alamofire/Tests/SessionTests.swift new file mode 100644 index 00000000..ccd362fa --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/SessionTests.swift @@ -0,0 +1,1795 @@ +// +// SessionTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +final class SessionTestCase: BaseTestCase { + // MARK: Helper Types + + private class HTTPMethodAdapter: RequestInterceptor { + let method: HTTPMethod + let throwsError: Bool + + var adaptedCount = 0 + + init(method: HTTPMethod, throwsError: Bool = false) { + self.method = method + self.throwsError = throwsError + } + + func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) { + adaptedCount += 1 + + let result: Result = Result { + guard !throwsError else { throw AFError.invalidURL(url: "") } + + var urlRequest = urlRequest + urlRequest.httpMethod = method.rawValue + + return urlRequest + } + + completion(result) + } + } + + private class HeaderAdapter: RequestInterceptor { + let headers: HTTPHeaders + let throwsError: Bool + + var adaptedCount = 0 + + init(headers: HTTPHeaders = ["field": "value"], throwsError: Bool = false) { + self.headers = headers + self.throwsError = throwsError + } + + func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result) -> Void) { + adaptedCount += 1 + + let result: Result = Result { + guard !throwsError else { throw AFError.invalidURL(url: "") } + + var urlRequest = urlRequest + + var finalHeaders = urlRequest.headers + headers.forEach { finalHeaders.add($0) } + + urlRequest.headers = finalHeaders + + return urlRequest + } + + completion(result) + } + } + + private class RequestHandler: RequestInterceptor { + var adaptCalledCount = 0 + var adaptedCount = 0 + var retryCount = 0 + var retryCalledCount = 0 + var retryErrors: [Error] = [] + + var shouldApplyAuthorizationHeader = false + var throwsErrorOnFirstAdapt = false + var throwsErrorOnSecondAdapt = false + var throwsErrorOnRetry = false + var shouldRetry = true + var retryDelay: TimeInterval? + + func adapt(_ urlRequest: URLRequest, + using state: RequestAdapterState, + completion: @escaping (Result) -> Void) { + adaptCalledCount += 1 + + let result: Result = Result { + if throwsErrorOnFirstAdapt { + throwsErrorOnFirstAdapt = false + throw AFError.invalidURL(url: "/adapt/error/1") + } + + if throwsErrorOnSecondAdapt && adaptedCount == 1 { + throwsErrorOnSecondAdapt = false + throw AFError.invalidURL(url: "/adapt/error/2") + } + + var urlRequest = urlRequest + + adaptedCount += 1 + + if shouldApplyAuthorizationHeader && adaptedCount > 1 { + urlRequest.headers.update(.authorization(username: "user", password: "password")) + } + + return urlRequest + } + + completion(result) + } + + func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retryCalledCount += 1 + + if throwsErrorOnRetry { + let error = AFError.invalidURL(url: "/invalid/url/\(retryCalledCount)") + completion(.doNotRetryWithError(error)) + return + } + + guard shouldRetry else { completion(.doNotRetry); return } + + retryCount += 1 + retryErrors.append(error) + + if retryCount < 2 { + if let retryDelay = retryDelay { + completion(.retryWithDelay(retryDelay)) + } else { + completion(.retry) + } + } else { + completion(.doNotRetry) + } + } + } + + private class UploadHandler: RequestInterceptor { + var adaptCalledCount = 0 + var adaptedCount = 0 + var retryCalledCount = 0 + var retryCount = 0 + var retryErrors: [Error] = [] + + func adapt(_ urlRequest: URLRequest, + using state: RequestAdapterState, + completion: @escaping (Result) -> Void) { + adaptCalledCount += 1 + + let result: Result = Result { + adaptedCount += 1 + + if adaptedCount == 1 { throw AFError.invalidURL(url: "") } + + return urlRequest + } + + completion(result) + } + + func retry(_ request: Request, + for session: Session, + dueTo error: Error, + completion: @escaping (RetryResult) -> Void) { + retryCalledCount += 1 + + retryCount += 1 + retryErrors.append(error) + + completion(.retry) + } + } + + // MARK: Tests - Initialization + + func testInitializerWithDefaultArguments() { + // Given, When + let session = Session() + + // Then + XCTAssertNotNil(session.session.delegate, "session delegate should not be nil") + XCTAssertTrue(session.delegate === session.session.delegate, "manager delegate should equal session delegate") + XCTAssertNil(session.serverTrustManager, "session server trust policy manager should be nil") + } + + func testInitializerWithSpecifiedArguments() { + // Given + let configuration = URLSessionConfiguration.default + let delegate = SessionDelegate() + let serverTrustManager = ServerTrustManager(evaluators: [:]) + + // When + let session = Session(configuration: configuration, + delegate: delegate, + serverTrustManager: serverTrustManager) + + // Then + XCTAssertNotNil(session.session.delegate, "session delegate should not be nil") + XCTAssertTrue(session.delegate === session.session.delegate, "manager delegate should equal session delegate") + XCTAssertNotNil(session.serverTrustManager, "session server trust policy manager should not be nil") + } + + func testThatSessionInitializerSucceedsWithDefaultArguments() { + // Given + let delegate = SessionDelegate() + let underlyingQueue = DispatchQueue(label: "underlyingQueue") + let urlSession: URLSession = { + let configuration = URLSessionConfiguration.default + let queue = OperationQueue(underlyingQueue: underlyingQueue, name: "delegateQueue") + return URLSession(configuration: configuration, delegate: delegate, delegateQueue: queue) + }() + + // When + let session = Session(session: urlSession, delegate: delegate, rootQueue: underlyingQueue) + + // Then + XCTAssertTrue(session.delegate === session.session.delegate, "manager delegate should equal session delegate") + XCTAssertNil(session.serverTrustManager, "session server trust policy manager should be nil") + } + + func testThatSessionInitializerSucceedsWithSpecifiedArguments() { + // Given + let delegate = SessionDelegate() + let underlyingQueue = DispatchQueue(label: "underlyingQueue") + let urlSession: URLSession = { + let configuration = URLSessionConfiguration.default + let queue = OperationQueue(underlyingQueue: underlyingQueue, name: "delegateQueue") + return URLSession(configuration: configuration, delegate: delegate, delegateQueue: queue) + }() + + let serverTrustManager = ServerTrustManager(evaluators: [:]) + + // When + let session = Session(session: urlSession, + delegate: delegate, + rootQueue: underlyingQueue, + serverTrustManager: serverTrustManager) + + // Then + XCTAssertTrue(session.delegate === session.session.delegate, "manager delegate should equal session delegate") + XCTAssertNotNil(session.serverTrustManager, "session server trust policy manager should not be nil") + } + + // MARK: Tests - Parallel Root Queue + + func testThatSessionWorksCorrectlyWhenPassedAConcurrentRootQueue() { + // Given + let queue = DispatchQueue(label: "ohNoAParallelQueue", attributes: .concurrent) + let session = Session(rootQueue: queue) + let didFinish = expectation(description: "request did finish") + var receivedResponse: TestResponse? + + // When + session.request(.get).responseDecodable(of: TestResponse.self) { response in + receivedResponse = response.value + didFinish.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(receivedResponse, "Should receive TestResponse.") + } + + // MARK: Tests - Default HTTP Headers + + func testDefaultUserAgentHeader() { + // Given, When + let userAgent = HTTPHeaders.default["User-Agent"] + + // Then + let osNameVersion: String = { + let version = ProcessInfo.processInfo.operatingSystemVersion + let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)" + + let osName: String = { + #if os(iOS) + #if targetEnvironment(macCatalyst) + return "macOS(Catalyst)" + #else + return "iOS" + #endif + #elseif os(watchOS) + return "watchOS" + #elseif os(tvOS) + return "tvOS" + #elseif os(macOS) + return "macOS" + #elseif os(Linux) + return "Linux" + #elseif os(Android) + return "Android" + #else + return "Unknown" + #endif + }() + + return "\(osName) \(versionString)" + }() + + let alamofireVersion = "Alamofire/\(Alamofire.version)" + + XCTAssertTrue(userAgent?.contains(alamofireVersion) == true) + XCTAssertTrue(userAgent?.contains(osNameVersion) == true) + XCTAssertTrue(userAgent?.contains("xctest/") == true) + } + + // MARK: Tests - Supported Accept-Encodings + + // Disabled due to HTTPBin flakiness. + func _testDefaultAcceptEncodingSupportsAppropriateEncodingsOnAppropriateSystems() { + // Given + let brotliExpectation = expectation(description: "brotli request should complete") + let gzipExpectation = expectation(description: "gzip request should complete") + let deflateExpectation = expectation(description: "deflate request should complete") + var brotliResponse: DataResponse? + var gzipResponse: DataResponse? + var deflateResponse: DataResponse? + + // When + AF.request(.compression(.brotli)).responseDecodable(of: TestResponse.self) { response in + brotliResponse = response + brotliExpectation.fulfill() + } + + AF.request(.compression(.gzip)).responseDecodable(of: TestResponse.self) { response in + gzipResponse = response + gzipExpectation.fulfill() + } + + AF.request(.compression(.deflate)).responseDecodable(of: TestResponse.self) { response in + deflateResponse = response + deflateExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + if #available(iOS 11.0, macOS 10.13, tvOS 11.0, watchOS 4.0, *) { + XCTAssertTrue(brotliResponse?.result.isSuccess == true) + } else { + XCTAssertTrue(brotliResponse?.result.isFailure == true) + } + + XCTAssertTrue(gzipResponse?.result.isSuccess == true) + XCTAssertTrue(deflateResponse?.result.isSuccess == true) + } + + // MARK: Tests - Start Requests Immediately + + func testSetStartRequestsImmediatelyToFalseAndResumeRequest() { + // Given + let session = Session(startRequestsImmediately: false) + + let url = Endpoint().url + let urlRequest = URLRequest(url: url) + + let expectation = expectation(description: "\(url)") + + var response: HTTPURLResponse? + + // When + session.request(urlRequest) + .response { resp in + response = resp.response + expectation.fulfill() + } + .resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response, "response should not be nil") + XCTAssertTrue(response?.statusCode == 200, "response status code should be 200") + } + + func testSetStartRequestsImmediatelyToFalseAndCancelledCallsResponseHandlers() { + // Given + let session = Session(startRequestsImmediately: false) + + let url = Endpoint().url + let urlRequest = URLRequest(url: url) + + let expectation = expectation(description: "\(url)") + + var response: DataResponse? + + // When + let request = session.request(urlRequest) + .cancel() + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response, "response should not be nil") + XCTAssertTrue(request.isCancelled) + XCTAssertTrue((request.task == nil) || (request.task?.state == .canceling || request.task?.state == .completed)) + XCTAssertEqual(request.error?.isExplicitlyCancelledError, true) + } + + func testSetStartRequestsImmediatelyToFalseAndResumeThenCancelRequestHasCorrectOutput() { + // Given + let session = Session(startRequestsImmediately: false) + + let url = Endpoint().url + let urlRequest = URLRequest(url: url) + + let expectation = expectation(description: "\(url)") + + var response: DataResponse? + + // When + let request = session.request(urlRequest) + .response { resp in + response = resp + expectation.fulfill() + } + .resume() + .cancel() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response, "response should not be nil") + XCTAssertTrue(request.isCancelled) + XCTAssertTrue((request.task == nil) || (request.task?.state == .canceling || request.task?.state == .completed)) + XCTAssertEqual(request.error?.isExplicitlyCancelledError, true) + } + + func testSetStartRequestsImmediatelyToFalseAndCancelThenResumeRequestDoesntCreateTaskAndStaysCancelled() { + // Given + let session = Session(startRequestsImmediately: false) + + let url = Endpoint().url + let urlRequest = URLRequest(url: url) + + let expectation = expectation(description: "\(url)") + + var response: DataResponse? + + // When + let request = session.request(urlRequest) + .response { resp in + response = resp + expectation.fulfill() + } + .cancel() + .resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response, "response should not be nil") + XCTAssertTrue(request.isCancelled) + XCTAssertTrue((request.task == nil) || (request.task?.state == .canceling || request.task?.state == .completed)) + XCTAssertEqual(request.error?.isExplicitlyCancelledError, true) + } + + // MARK: Tests - Deinitialization + + func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() { + // Given + let monitor = ClosureEventMonitor() + let didCreateRequest = expectation(description: "Request created") + monitor.requestDidCreateTask = { _, _ in didCreateRequest.fulfill() } + var session: Session? = Session(startRequestsImmediately: false, eventMonitors: [monitor]) + weak var weakSession = session + + // When + let request = session?.request(.default) + session = nil + + waitForExpectations(timeout: timeout) + + // Then + if #available(macOS 13, iOS 16, tvOS 16, watchOS 9, *) { + // On 2022 OS versions and later, URLSessionTasks are completed even if not resumed before invalidating a session. + XCTAssertTrue([.canceling, .completed].contains(request?.task?.state)) + } else { + XCTAssertEqual(request?.task?.state, .suspended) + } + XCTAssertNil(session, "session should be nil") + XCTAssertNil(weakSession, "weak session should be nil") + } + + func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() { + // Given + var session: Session? = Session(startRequestsImmediately: false) + + // When + let request = session?.request(.default) + request?.cancel() + session = nil + + let state = request?.state + + // Then + XCTAssertTrue(state == .cancelled, "state should be .cancelled") + XCTAssertNil(session, "manager should be nil") + } + + // MARK: Tests - Bad Requests + + func testThatDataRequestWithInvalidURLStringThrowsResponseHandlerError() { + // Given + let session = Session() + let url = "" + let expectation = expectation(description: "Request should fail with error") + + var response: DataResponse? + + // When + session.request(url).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isInvalidURLError, true) + XCTAssertEqual(response?.error?.urlConvertible as? String, url) + } + + func testThatDownloadRequestWithInvalidURLStringThrowsResponseHandlerError() { + // Given + let session = Session() + let url = "" + let expectation = expectation(description: "Download should fail with error") + + var response: DownloadResponse? + + // When + session.download(url).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.fileURL) + XCTAssertNil(response?.resumeData) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isInvalidURLError, true) + XCTAssertEqual(response?.error?.urlConvertible as? String, url) + } + + func testThatUploadDataRequestWithInvalidURLStringThrowsResponseHandlerError() { + // Given + let session = Session() + let url = "" + let expectation = expectation(description: "Upload should fail with error") + + var response: DataResponse? + + // When + session.upload(Data(), to: url).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isInvalidURLError, true) + XCTAssertEqual(response?.error?.urlConvertible as? String, url) + } + + func testThatUploadFileRequestWithInvalidURLStringThrowsResponseHandlerError() { + // Given + let session = Session() + let url = "" + let expectation = expectation(description: "Upload should fail with error") + + var response: DataResponse? + + // When + session.upload(URL(fileURLWithPath: "/invalid"), to: url).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isInvalidURLError, true) + XCTAssertEqual(response?.error?.urlConvertible as? String, url) + } + + func testThatUploadStreamRequestWithInvalidURLStringThrowsResponseHandlerError() { + // Given + let session = Session() + let url = "" + let expectation = expectation(description: "Upload should fail with error") + + var response: DataResponse? + + // When + session.upload(InputStream(data: Data()), to: url).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(response?.request) + XCTAssertNil(response?.response) + XCTAssertNil(response?.data) + XCTAssertNotNil(response?.error) + XCTAssertEqual(response?.error?.isInvalidURLError, true) + XCTAssertEqual(response?.error?.urlConvertible as? String, url) + } + + // MARK: Tests - Request Adapter + + func testThatSessionCallsRequestAdaptersWhenCreatingDataRequest() { + // Given + let endpoint = Endpoint() + + let methodAdapter = HTTPMethodAdapter(method: .post) + let headerAdapter = HeaderAdapter() + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidCreateTask = { _, _ in expectation1.fulfill() } + + let request1 = session.request(endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidCreateTask = { _, _ in expectation2.fulfill() } + + let request2 = session.request(endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request1.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.allHTTPHeaderFields?.count, 1) + XCTAssertEqual(methodAdapter.adaptedCount, 2) + XCTAssertEqual(headerAdapter.adaptedCount, 1) + } + + func testThatSessionCallsRequestAdaptersWhenCreatingDownloadRequest() { + // Given + let endpoint = Endpoint() + + let methodAdapter = HTTPMethodAdapter(method: .post) + let headerAdapter = HeaderAdapter() + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidCreateTask = { _, _ in expectation1.fulfill() } + + let request1 = session.download(endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidCreateTask = { _, _ in expectation2.fulfill() } + + let request2 = session.download(endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request1.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.allHTTPHeaderFields?.count, 1) + XCTAssertEqual(methodAdapter.adaptedCount, 2) + XCTAssertEqual(headerAdapter.adaptedCount, 1) + } + + func testThatSessionCallsRequestAdaptersWhenCreatingUploadRequestWithData() { + // Given + let data = Data("data".utf8) + let endpoint = Endpoint.method(.post) + + let methodAdapter = HTTPMethodAdapter(method: .get) + let headerAdapter = HeaderAdapter() + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidCreateTask = { _, _ in expectation1.fulfill() } + + let request1 = session.upload(data, to: endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidCreateTask = { _, _ in expectation2.fulfill() } + + let request2 = session.upload(data, to: endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request1.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.allHTTPHeaderFields?.count, 1) + XCTAssertEqual(methodAdapter.adaptedCount, 2) + XCTAssertEqual(headerAdapter.adaptedCount, 1) + } + + func testThatSessionCallsRequestAdaptersWhenCreatingUploadRequestWithFile() { + // Given + let fileURL = URL(fileURLWithPath: "/path/to/some/file.txt") + let endpoint = Endpoint.method(.post) + + let methodAdapter = HTTPMethodAdapter(method: .get) + let headerAdapter = HeaderAdapter() + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidCreateTask = { _, _ in expectation1.fulfill() } + + let request1 = session.upload(fileURL, to: endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidCreateTask = { _, _ in expectation2.fulfill() } + + let request2 = session.upload(fileURL, to: endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request1.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.allHTTPHeaderFields?.count, 1) + XCTAssertEqual(methodAdapter.adaptedCount, 2) + XCTAssertEqual(headerAdapter.adaptedCount, 1) + } + + func testThatSessionCallsRequestAdaptersWhenCreatingUploadRequestWithInputStream() { + // Given + let inputStream = InputStream(data: Data("data".utf8)) + let endpoint = Endpoint.method(.post) + + let methodAdapter = HTTPMethodAdapter(method: .get) + let headerAdapter = HeaderAdapter() + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidCreateTask = { _, _ in expectation1.fulfill() } + + let request1 = session.upload(inputStream, to: endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidCreateTask = { _, _ in expectation2.fulfill() } + + let request2 = session.upload(inputStream, to: endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request1.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.httpMethod, methodAdapter.method.rawValue) + XCTAssertEqual(request2.task?.originalRequest?.allHTTPHeaderFields?.count, 1) + XCTAssertEqual(methodAdapter.adaptedCount, 2) + XCTAssertEqual(headerAdapter.adaptedCount, 1) + } + + func testThatSessionReturnsRequestAdaptationErrorWhenRequestAdapterThrowsError() { + // Given + let endpoint = Endpoint() + + let methodAdapter = HTTPMethodAdapter(method: .post, throwsError: true) + let headerAdapter = HeaderAdapter(throwsError: true) + let monitor = ClosureEventMonitor() + + let session = Session(startRequestsImmediately: false, interceptor: methodAdapter, eventMonitors: [monitor]) + + // When + let expectation1 = expectation(description: "Request 1 created") + monitor.requestDidFailToAdaptURLRequestWithError = { _, _, _ in expectation1.fulfill() } + + let request1 = session.request(endpoint) + waitForExpectations(timeout: timeout) + + let expectation2 = expectation(description: "Request 2 created") + monitor.requestDidFailToAdaptURLRequestWithError = { _, _, _ in expectation2.fulfill() } + + let request2 = session.request(endpoint, interceptor: headerAdapter) + waitForExpectations(timeout: timeout) + + let requests = [request1, request2] + + // Then + for request in requests { + XCTAssertEqual(request.error?.isRequestAdaptationError, true) + XCTAssertEqual(request.error?.underlyingError?.asAFError?.urlConvertible as? String, "") + } + } + + // MARK: Tests - Request Retrier + + func testThatSessionCallsRequestRetrierWhenRequestInitiallyEncountersAdaptError() { + // Given + let handler = RequestHandler() + handler.adaptedCount = 1 + handler.throwsErrorOnSecondAdapt = true + handler.shouldApplyAuthorizationHeader = true + + let session = Session() + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + session.request(.basicAuth(), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 1) + XCTAssertEqual(handler.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, true) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsRequestRetrierWhenDownloadInitiallyEncountersAdaptError() { + // Given + let handler = RequestHandler() + handler.adaptedCount = 1 + handler.throwsErrorOnSecondAdapt = true + handler.shouldApplyAuthorizationHeader = true + + let session = Session() + + let expectation = expectation(description: "request should eventually fail") + var response: DownloadResponse? + + let destination: DownloadRequest.Destination = { _, _ in + let fileURL = self.testDirectoryURL.appendingPathComponent("test-output.json") + return (fileURL, [.removePreviousFile]) + } + + // When + session.download(.basicAuth(), interceptor: handler, to: destination) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 1) + XCTAssertEqual(handler.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, true) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsRequestRetrierWhenUploadInitiallyEncountersAdaptError() { + // Given + let handler = UploadHandler() + let session = Session(interceptor: handler) + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + let uploadData = Data("upload data".utf8) + + // When + session.upload(uploadData, to: .method(.post)) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 1) + XCTAssertEqual(handler.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, true) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsRequestRetrierWhenRequestEncountersError() { + // Given + let handler = RequestHandler() + + let session = Session() + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.basicAuth(), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 3) + XCTAssertEqual(handler.retryCount, 3) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsRequestRetrierThenSessionRetrierWhenRequestEncountersError() { + // Given + let sessionHandler = RequestHandler() + let requestHandler = RequestHandler() + + let session = Session(interceptor: sessionHandler) + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.basicAuth(), interceptor: requestHandler) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(sessionHandler.adaptCalledCount, 3) + XCTAssertEqual(sessionHandler.adaptedCount, 3) + XCTAssertEqual(sessionHandler.retryCalledCount, 3) + XCTAssertEqual(sessionHandler.retryCount, 3) + XCTAssertEqual(requestHandler.adaptCalledCount, 3) + XCTAssertEqual(requestHandler.adaptedCount, 3) + XCTAssertEqual(requestHandler.retryCalledCount, 4) + XCTAssertEqual(requestHandler.retryCount, 4) + XCTAssertEqual(request.retryCount, 2) + XCTAssertEqual(response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsAdapterWhenRequestIsRetried() { + // Given + let handler = RequestHandler() + handler.shouldApplyAuthorizationHeader = true + + let session = Session(interceptor: handler) + + let expectation = expectation(description: "request should eventually succeed") + var response: DataResponse? + + // When + let request = session.request(.basicAuth()) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 1) + XCTAssertEqual(handler.retryCount, 1) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, true) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionReturnsRequestAdaptationErrorWhenRequestIsRetried() { + // Given + let handler = RequestHandler() + handler.throwsErrorOnSecondAdapt = true + + let session = Session(interceptor: handler) + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.basicAuth()) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 3) + XCTAssertEqual(handler.retryCount, 3) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, false) + XCTAssertEqual(request.error?.isRequestAdaptationError, true) + XCTAssertEqual(request.error?.underlyingError?.asAFError?.urlConvertible as? String, "/adapt/error/2") + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionRetriesRequestWithDelayWhenRetryResultContainsDelay() { + // Given + let handler = RequestHandler() + handler.retryDelay = 0.01 + handler.throwsErrorOnSecondAdapt = true + + let session = Session(interceptor: handler) + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.basicAuth()) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 3) + XCTAssertEqual(handler.retryCount, 3) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(response?.result.isSuccess, false) + XCTAssertEqual(request.error?.isRequestAdaptationError, true) + XCTAssertEqual(request.error?.underlyingError?.asAFError?.urlConvertible as? String, "/adapt/error/2") + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionReturnsRequestRetryErrorWhenRequestRetrierThrowsError() { + // Given + let handler = RequestHandler() + handler.throwsErrorOnRetry = true + + let session = Session(interceptor: handler) + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.basicAuth()) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 1) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 2) + XCTAssertEqual(handler.retryCount, 0) + XCTAssertEqual(request.retryCount, 0) + XCTAssertEqual(response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + + if let error = response?.result.failure { + XCTAssertTrue(error.isRequestRetryError) + XCTAssertEqual(error.underlyingError?.asAFError?.urlConvertible as? String, "/invalid/url/2") + } else { + XCTFail("error should not be nil") + } + } + + // MARK: Tests - Response Serializer Retry + + func testThatSessionCallsRequestRetrierWhenResponseSerializerThrowsError() { + // Given + let handler = RequestHandler() + handler.shouldRetry = false + + let session = Session() + + let expectation = expectation(description: "request should eventually fail") + var response: DataResponse? + + // When + let request = session.request(.image(.jpeg), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { jsonResponse in + response = jsonResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 1) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 1) + XCTAssertEqual(handler.retryCount, 0) + XCTAssertEqual(request.retryCount, 0) + XCTAssertEqual(response?.result.isSuccess, false) + XCTAssertEqual(response?.error?.isResponseSerializationError, true) + XCTAssertNotNil(response?.error?.underlyingError as? DecodingError) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + func testThatSessionCallsRequestRetrierForAllResponseSerializersThatThrowError() throws { + // Given + let handler = RequestHandler() + handler.throwsErrorOnRetry = true + + let session = Session() + + let json1Expectation = expectation(description: "request should eventually fail") + var json1Response: DataResponse? + + let json2Expectation = expectation(description: "request should eventually fail") + var json2Response: DataResponse? + + // When + let request = session.request(.image(.jpeg), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { response in + json1Response = response + json1Expectation.fulfill() + } + .responseDecodable(of: TestResponse.self) { response in + json2Response = response + json2Expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 1) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 2) + XCTAssertEqual(handler.retryCount, 0) + XCTAssertEqual(request.retryCount, 0) + XCTAssertEqual(json1Response?.result.isSuccess, false) + XCTAssertEqual(json2Response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + + let errors = [json1Response, json2Response].compactMap { $0?.error } + + XCTAssertEqual(errors.count, 2) + + for (index, error) in errors.enumerated() { + XCTAssertTrue(error.isRequestRetryError) + if case let .requestRetryFailed(retryError, originalError) = error { + XCTAssertEqual(retryError.asAFError?.urlConvertible as? String, "/invalid/url/\(index + 1)") + XCTAssertNotNil(originalError.asAFError?.underlyingError as? DecodingError) + } else { + XCTFail("Error failure reason should be response serialization failure") + } + } + } + + func testThatSessionRetriesRequestImmediatelyWhenResponseSerializerRequestsRetry() throws { + // Given + let handler = RequestHandler() + let session = Session() + + let json1Expectation = expectation(description: "request should eventually fail") + var json1Response: DataResponse? + + let json2Expectation = expectation(description: "request should eventually fail") + var json2Response: DataResponse? + + // When + let request = session.request(.image(.jpeg), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { response in + json1Response = response + json1Expectation.fulfill() + } + .responseDecodable(of: TestResponse.self) { response in + json2Response = response + json2Expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 2) + XCTAssertEqual(handler.retryCalledCount, 3) + XCTAssertEqual(handler.retryCount, 3) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(json1Response?.result.isSuccess, false) + XCTAssertEqual(json2Response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + + let errors = [json1Response, json2Response].compactMap { $0?.error } + XCTAssertEqual(errors.count, 2) + + for error in errors { + XCTAssertTrue(error.isResponseSerializationError) + XCTAssertNotNil(error.underlyingError as? DecodingError) + } + } + + func testThatSessionCallsResponseSerializerCompletionsWhenAdapterThrowsErrorDuringRetry() { + // Four retries should occur given this scenario: + // 1) Retrier is called from first response serializer failure (trips retry) + // 2) Retrier is called by Session for adapt error thrown + // 3) Retrier is called again from first response serializer failure + // 4) Retrier is called from second response serializer failure + + // Given + let handler = RequestHandler() + handler.throwsErrorOnSecondAdapt = true + + let session = Session() + + let json1Expectation = expectation(description: "request should eventually fail") + var json1Response: DataResponse? + + let json2Expectation = expectation(description: "request should eventually fail") + var json2Response: DataResponse? + + // When + let request = session.request(.image(.jpeg), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { response in + json1Response = response + json1Expectation.fulfill() + } + .responseDecodable(of: TestResponse.self) { response in + json2Response = response + json2Expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 4) + XCTAssertEqual(handler.retryCount, 4) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(json1Response?.result.isSuccess, false) + XCTAssertEqual(json2Response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + + let errors = [json1Response, json2Response].compactMap { $0?.error } + XCTAssertEqual(errors.count, 2) + + for error in errors { + XCTAssertTrue(error.isRequestAdaptationError) + XCTAssertEqual(error.underlyingError?.asAFError?.urlConvertible as? String, "/adapt/error/2") + } + } + + func testThatSessionCallsResponseSerializerCompletionsWhenAdapterThrowsErrorDuringRetryForDownloads() { + // Four retries should occur given this scenario: + // 1) Retrier is called from first response serializer failure (trips retry) + // 2) Retrier is called by Session for adapt error thrown + // 3) Retrier is called again from first response serializer failure + // 4) Retrier is called from second response serializer failure + + // Given + let handler = RequestHandler() + handler.throwsErrorOnSecondAdapt = true + + let session = Session() + + let json1Expectation = expectation(description: "request should eventually fail") + var json1Response: DownloadResponse? + + let json2Expectation = expectation(description: "request should eventually fail") + var json2Response: DownloadResponse? + + // When + let request = session.download(.image(.jpeg), interceptor: handler) + .validate() + .responseDecodable(of: TestResponse.self) { response in + json1Response = response + json1Expectation.fulfill() + } + .responseDecodable(of: TestResponse.self) { response in + json2Response = response + json2Expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 2) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 4) + XCTAssertEqual(handler.retryCount, 4) + XCTAssertEqual(request.retryCount, 1) + XCTAssertEqual(json1Response?.result.isSuccess, false) + XCTAssertEqual(json2Response?.result.isSuccess, false) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + + let errors = [json1Response, json2Response].compactMap { $0?.error } + XCTAssertEqual(errors.count, 2) + + for error in errors { + XCTAssertTrue(error.isRequestAdaptationError) + XCTAssertEqual(error.underlyingError?.asAFError?.urlConvertible as? String, "/adapt/error/2") + } + } + + // MARK: Tests - Session Invalidation + + func testThatSessionIsInvalidatedAndAllRequestsCompleteWhenSessionIsDeinitialized() { + // Given + let invalidationExpectation = expectation(description: "sessionDidBecomeInvalidWithError should be called") + let events = ClosureEventMonitor() + events.sessionDidBecomeInvalidWithError = { _, _ in + invalidationExpectation.fulfill() + } + var session: Session? = Session(startRequestsImmediately: false, eventMonitors: [events]) + var error: AFError? + let requestExpectation = expectation(description: "request should complete") + + // When + session?.request(.default).response { response in + error = response.error + requestExpectation.fulfill() + } + session = nil + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(error?.isSessionDeinitializedError, true) + } + + // MARK: Tests - Request Cancellation + + func testThatSessionOnlyCallsResponseSerializerCompletionWhenCancellingInsideCompletion() { + // Given + let handler = RequestHandler() + let session = Session() + + let expectation = expectation(description: "request should complete") + var response: DataResponse? + var completionCallCount = 0 + + // When + let request = session.request(.default, interceptor: handler) + request.validate() + + request.responseDecodable(of: TestResponse.self) { resp in + request.cancel() + + response = resp + completionCallCount += 1 + + DispatchQueue.main.after(0.01) { expectation.fulfill() } + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(handler.adaptCalledCount, 1) + XCTAssertEqual(handler.adaptedCount, 1) + XCTAssertEqual(handler.retryCalledCount, 0) + XCTAssertEqual(handler.retryCount, 0) + XCTAssertEqual(request.retryCount, 0) + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(completionCallCount, 1) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty) + XCTAssertTrue(session.activeRequests.isEmpty) + } + } + + // MARK: Tests - Request State + + func testThatSessionSetsRequestStateWhenStartRequestsImmediatelyIsTrue() { + // Given + let session = Session() + + let expectation = expectation(description: "request should complete") + var response: DataResponse? + + // When + let request = session.request(.default).responseDecodable(of: TestResponse.self) { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + XCTAssertEqual(response?.result.isSuccess, true) + } + + // MARK: Invalid Requests + + func testThatGETRequestsWithBodyDataAreConsideredInvalid() { + // Given + let session = Session() + var request = Endpoint().urlRequest + request.httpBody = Data("invalid".utf8) + let expect = expectation(description: "request should complete") + var response: DataResponse? + + // When + session.request(request).responseDecodable(of: TestResponse.self) { resp in + response = resp + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isBodyDataInGETRequest, true) + } + + func testThatAdaptedGETRequestsWithBodyDataAreConsideredInvalid() { + // Given + struct InvalidAdapter: RequestInterceptor { + func adapt(_ urlRequest: URLRequest, + for session: Session, + completion: @escaping (Result) -> Void) { + var request = urlRequest + request.httpBody = Data("invalid".utf8) + + completion(.success(request)) + } + } + let session = Session(interceptor: InvalidAdapter()) + let expect = expectation(description: "request should complete") + var response: DataResponse? + + // When + session.request(.default).responseDecodable(of: TestResponse.self) { resp in + response = resp + expect.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(response?.result.isFailure, true) + XCTAssertEqual(response?.error?.isRequestAdaptationError, true) + XCTAssertEqual(response?.error?.underlyingError?.asAFError?.isBodyDataInGETRequest, true) + } +} + +// MARK: - + +final class SessionMassActionTestCase: BaseTestCase { + func testThatRequestsCanHaveMassActionsPerformed() { + // Given + let count = 10 + let createdTasks = expectation(description: "all tasks created") + createdTasks.expectedFulfillmentCount = count + let massActions = expectation(description: "cancel all requests should be called") + let monitor = ClosureEventMonitor() + monitor.requestDidCreateTask = { _, _ in createdTasks.fulfill() } + let session = Session(eventMonitors: [monitor]) + let request = Endpoint.delay(1) + var requests: [DataRequest] = [] + + // When + requests = (0..] = [] + + // When + requests = (0..] = [] + + // When + for _ in 0..) -> Void) { + if hasRetried { + var request = urlRequest + request.url = Endpoint.delay(1).url + completion(.success(request)) + } else { + completion(.success(urlRequest)) + } + } + + func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) { + completion(hasRetried ? .doNotRetry : .retry) + hasRetried = true + } + } + + let queue = DispatchQueue(label: "com.alamofire.testQueue") + let monitor = ClosureEventMonitor(queue: queue) + let session = Session(rootQueue: queue, interceptor: OnceRetrier(), eventMonitors: [monitor]) + let request = Endpoint.status(401) + let completion = expectation(description: "all requests should finish") + let cancellation = expectation(description: "cancel all requests should be called") + let createTask = expectation(description: "should create task twice") + createTask.expectedFulfillmentCount = 2 + var tasksCreated = 0 + monitor.requestDidCreateTask = { [unowned session] _, _ in + tasksCreated += 1 + createTask.fulfill() + // Cancel after the second task is created to ensure proper lifetime events. + if tasksCreated == 2 { + session.cancelAllRequests { + cancellation.fulfill() + } + } + } + + var received: DataResponse? + + // When + session.request(request).validate().response { response in + received = response + completion.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(received?.error?.isExplicitlyCancelledError, true) + assert(on: session.rootQueue) { + XCTAssertTrue(session.requestTaskMap.isEmpty, "requestTaskMap should be empty but has \(session.requestTaskMap.count) items") + XCTAssertTrue(session.activeRequests.isEmpty, "activeRequests should be empty but has \(session.activeRequests.count) items") + } + } +} + +// MARK: - + +final class SessionConfigurationHeadersTestCase: BaseTestCase { + enum ConfigurationType { + case `default`, ephemeral + } + + func testThatDefaultConfigurationHeadersAreSentWithRequest() { + // Given, When, Then + executeAuthorizationHeaderTest(for: .default) + } + + func testThatEphemeralConfigurationHeadersAreSentWithRequest() { + // Given, When, Then + executeAuthorizationHeaderTest(for: .ephemeral) + } + + private func executeAuthorizationHeaderTest(for type: ConfigurationType) { + // Given + let session: Session = { + let configuration: URLSessionConfiguration = { + let configuration: URLSessionConfiguration + + switch type { + case .default: + configuration = .default + case .ephemeral: + configuration = .ephemeral + } + + var headers = HTTPHeaders.default + headers["Authorization"] = "Bearer 123456" + configuration.headers = headers + + return configuration + }() + + return Session(configuration: configuration) + }() + + let expectation = expectation(description: "request should complete successfully") + + var response: DataResponse? + + // When + session.request(.default) + .responseDecodable(of: TestResponse.self) { closureResponse in + response = closureResponse + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request, "request should not be nil") + XCTAssertNotNil(response?.response, "response should not be nil") + XCTAssertNotNil(response?.data, "data should not be nil") + XCTAssertEqual(response?.result.isSuccess, true) + XCTAssertEqual(response?.value?.headers["Authorization"], "Bearer 123456", "Authorization header should match") + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/TLSEvaluationTests.swift b/Carthage/Checkouts/Alamofire/Tests/TLSEvaluationTests.swift new file mode 100644 index 00000000..37533121 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/TLSEvaluationTests.swift @@ -0,0 +1,557 @@ +// +// TLSEvaluationTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +#if canImport(Security) + +import Alamofire +import Foundation +import XCTest + +private enum TestCertificates { + static let rootCA = TestCertificates.certificate(filename: "expired.badssl.com-root-ca") + static let intermediateCA1 = TestCertificates.certificate(filename: "expired.badssl.com-intermediate-ca-1") + static let intermediateCA2 = TestCertificates.certificate(filename: "expired.badssl.com-intermediate-ca-2") + static let leaf = TestCertificates.certificate(filename: "expired.badssl.com-leaf") + + static func certificate(filename: String) -> SecCertificate { + let filePath = Bundle.test.path(forResource: filename, ofType: "cer")! + let data = try! Data(contentsOf: URL(fileURLWithPath: filePath)) + let certificate = SecCertificateCreateWithData(nil, data as CFData)! + + return certificate + } +} + +// MARK: - + +final class TLSEvaluationExpiredLeafCertificateTestCase: BaseTestCase { + private let expiredURLString = "https://expired.badssl.com/" + private let expiredHost = "expired.badssl.com" + + private let revokedURLString = "https://revoked.badssl.com" + private let revokedHost = "revoked.badssl.com" + + private var configuration: URLSessionConfiguration! + + // MARK: Setup and Teardown + + override func setUp() { + super.setUp() + + configuration = URLSessionConfiguration.ephemeral + configuration.urlCache = nil + configuration.urlCredentialStorage = nil + } + + // MARK: Default Behavior Tests + + func testThatExpiredCertificateRequestFailsWithNoServerTrustPolicy() { + // Given + let expectation = expectation(description: "\(expiredURLString)") + let manager = Session(configuration: configuration) + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error) + + if let error = error?.underlyingError as? URLError { + XCTAssertEqual(error.code, .serverCertificateUntrusted) + } else { + XCTFail("error should be a URLError or NSError from CFNetwork") + } + } + + func disabled_testRevokedCertificateRequestBehaviorWithNoServerTrustPolicy() { + // Disabled due to the instability of due revocation testing of default evaluation from all platforms. This + // test is left for debugging purposes only. Should not be committed into the test suite while enabled. + + // Given + let expectation = expectation(description: "\(revokedURLString)") + let manager = Session(configuration: configuration) + + var error: Error? + + // When + manager.request(revokedURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + if #available(iOS 10.1, macOS 10.12, tvOS 10.1, *) { + // Apple appears to have started revocation tests as part of default evaluation in 10.1 + XCTAssertNotNil(error) + } else { + XCTAssertNil(error) + } + } + + // MARK: Server Trust Policy - Perform Default Tests + + func testThatExpiredCertificateRequestFailsWithDefaultServerTrustPolicy() { + // Given + let evaluators = [expiredHost: DefaultTrustEvaluator(validateHost: true)] + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + XCTAssertTrue(reason.isHostValidationFailed, "should be .hostValidationFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + + func disabled_testRevokedCertificateRequestBehaviorWithDefaultServerTrustPolicy() { + // Disabled due to the instability of due revocation testing of default evaluation from all platforms. This + // test is left for debugging purposes only. Should not be committed into the test suite while enabled. + + // Given + let defaultPolicy = DefaultTrustEvaluator() + let evaluators = [revokedHost: defaultPolicy] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(revokedURLString)") + var error: Error? + + // When + manager.request(revokedURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + if #available(iOS 10.1, macOS 10.12, tvOS 10.1, *) { + // Apple appears to have started revocation tests as part of default evaluation in 10.1 + XCTAssertNotNil(error) + } else { + XCTAssertNil(error) + } + } + + // MARK: Server Trust Policy - Perform Revoked Tests + + func testThatExpiredCertificateRequestFailsWithRevokedServerTrustPolicy() { + // Given + let policy = RevocationTrustEvaluator() + + let evaluators = [expiredHost: policy] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + XCTAssertTrue(reason.isDefaultEvaluationFailed, "should be .defaultEvaluationFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + + // watchOS doesn't perform revocation checking at all. + #if !os(watchOS) + func testThatRevokedCertificateRequestFailsWithRevokedServerTrustPolicy() { + // Given + let policy = RevocationTrustEvaluator() + + let evaluators = [revokedHost: policy] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(revokedURLString)") + var error: AFError? + + // When + manager.request(revokedURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + // Test seems flaky and can result in either of these failures, perhaps due to the OS actually checking? + XCTAssertTrue(reason.isDefaultEvaluationFailed || reason.isRevocationCheckFailed, + "should be .defaultEvaluationFailed or .revocationCheckFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + #endif + + // MARK: Server Trust Policy - Certificate Pinning Tests + + func testThatExpiredCertificateRequestFailsWhenPinningLeafCertificateWithCertificateChainValidation() { + // Given + let certificates = [TestCertificates.leaf] + let evaluators = [expiredHost: PinnedCertificatesTrustEvaluator(certificates: certificates)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + XCTAssertTrue(reason.isDefaultEvaluationFailed, "should be .defaultEvaluationFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + + func testThatExpiredCertificateRequestFailsWhenPinningAllCertificatesWithCertificateChainValidation() { + // Given + let certificates = [TestCertificates.leaf, + TestCertificates.intermediateCA1, + TestCertificates.intermediateCA2, + TestCertificates.rootCA] + + let evaluators = [expiredHost: PinnedCertificatesTrustEvaluator(certificates: certificates)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + XCTAssertTrue(reason.isDefaultEvaluationFailed, "should be .defaultEvaluationFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningLeafCertificateWithoutCertificateChainOrHostValidation() { + // Given + let certificates = [TestCertificates.leaf] + let evaluators = [expiredHost: PinnedCertificatesTrustEvaluator(certificates: certificates, performDefaultValidation: false, validateHost: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(error, "error should be nil") + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningIntermediateCACertificateWithoutCertificateChainOrHostValidation() { + // Given + let certificates = [TestCertificates.intermediateCA2] + let evaluators = [expiredHost: PinnedCertificatesTrustEvaluator(certificates: certificates, performDefaultValidation: false, validateHost: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(error, "error should be nil") + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningRootCACertificateWithoutCertificateChainValidation() { + // Given + let certificates = [TestCertificates.rootCA] + let evaluators = [expiredHost: PinnedCertificatesTrustEvaluator(certificates: certificates, performDefaultValidation: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + if #available(iOS 10.1, macOS 10.12.0, tvOS 10.1, *) { + XCTAssertNotNil(error, "error should not be nil") + } else { + XCTAssertNil(error, "error should be nil") + } + } + + // MARK: Server Trust Policy - Public Key Pinning Tests + + func testThatExpiredCertificateRequestFailsWhenPinningLeafPublicKeyWithCertificateChainValidation() { + // Given + let keys = [TestCertificates.leaf].af.publicKeys + let evaluators = [expiredHost: PublicKeysTrustEvaluator(keys: keys)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: AFError? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(error, "error should not be nil") + XCTAssertEqual(error?.isServerTrustEvaluationError, true) + + if case let .serverTrustEvaluationFailed(reason)? = error { + if #available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *) { + XCTAssertTrue(reason.isTrustEvaluationFailed, "should be .trustEvaluationFailed") + } else { + XCTAssertTrue(reason.isDefaultEvaluationFailed, "should be .defaultEvaluationFailed") + } + } else { + XCTFail("error should be .serverTrustEvaluationFailed") + } + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningLeafPublicKeyWithoutCertificateChainOrHostValidation() { + // Given + let keys = [TestCertificates.leaf].af.publicKeys + let evaluators = [expiredHost: PublicKeysTrustEvaluator(keys: keys, performDefaultValidation: false, validateHost: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(error, "error should be nil") + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningIntermediateCAPublicKeyWithoutCertificateChainOrHostValidation() { + // Given + let keys = [TestCertificates.intermediateCA2].af.publicKeys + let evaluators = [expiredHost: PublicKeysTrustEvaluator(keys: keys, performDefaultValidation: false, validateHost: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(error, "error should be nil") + } + + func testThatExpiredCertificateRequestSucceedsWhenPinningRootCAPublicKeyWithoutCertificateChainValidation() { + // Given + let keys = [TestCertificates.rootCA].af.publicKeys + let evaluators = [expiredHost: PublicKeysTrustEvaluator(keys: keys, performDefaultValidation: false, validateHost: false)] + + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + if #available(iOS 10.1, macOS 10.12.0, tvOS 10.1, *) { + XCTAssertNotNil(error, "error should not be nil") + } else { + XCTAssertNil(error, "error should be nil") + } + } + + // MARK: Server Trust Policy - Disabling Evaluation Tests + + func testThatExpiredCertificateRequestSucceedsWhenDisablingEvaluation() { + // Given + let evaluators = [expiredHost: DisabledTrustEvaluator()] + let manager = Session(configuration: configuration, + serverTrustManager: ServerTrustManager(evaluators: evaluators)) + + let expectation = expectation(description: "\(expiredURLString)") + var error: Error? + + // When + manager.request(expiredURLString) + .response { resp in + error = resp.error + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(error, "error should be nil") + } +} +#endif diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-NoTS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-NoTS.xctestplan new file mode 100644 index 00000000..db43380f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-NoTS.xctestplan @@ -0,0 +1,30 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "ClosureAPIConcurrencyTests", + "DataRequestConcurrencyTests", + "DataStreamConcurrencyTests", + "DownloadConcurrencyTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "F8111E3D19A95C8B0040E7D1", + "name" : "Alamofire iOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-Old.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-Old.xctestplan new file mode 100644 index 00000000..cb1f0372 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS-Old.xctestplan @@ -0,0 +1,30 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "CombineTestCase", + "DataRequestCombineTests", + "DataStreamRequestCombineTests", + "DownloadRequestCombineTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "F8111E3D19A95C8B0040E7D1", + "name" : "Alamofire iOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS.xctestplan new file mode 100644 index 00000000..acec94a9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/iOS.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + "threadSanitizerEnabled" : true + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "F8111E3D19A95C8B0040E7D1", + "name" : "Alamofire iOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS-NoTS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS-NoTS.xctestplan new file mode 100644 index 00000000..ee85026c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS-NoTS.xctestplan @@ -0,0 +1,30 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "ClosureAPIConcurrencyTests", + "DataRequestConcurrencyTests", + "DataStreamConcurrencyTests", + "DownloadConcurrencyTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "F829C6B11A7A94F100A2CD59", + "name" : "Alamofire macOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS.xctestplan new file mode 100644 index 00000000..e2c2c624 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/macOS.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + "threadSanitizerEnabled" : true + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "F829C6B11A7A94F100A2CD59", + "name" : "Alamofire macOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-NoTS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-NoTS.xctestplan new file mode 100644 index 00000000..aee72506 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-NoTS.xctestplan @@ -0,0 +1,30 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "ClosureAPIConcurrencyTests", + "DataRequestConcurrencyTests", + "DataStreamConcurrencyTests", + "DownloadConcurrencyTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "4CF626F71BA7CB3E0011A099", + "name" : "Alamofire tvOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-Old.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-Old.xctestplan new file mode 100644 index 00000000..e44f642c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS-Old.xctestplan @@ -0,0 +1,34 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "ClosureAPIConcurrencyTests", + "CombineTestCase", + "DataRequestCombineTests", + "DataRequestConcurrencyTests", + "DataStreamConcurrencyTests", + "DataStreamRequestCombineTests", + "DownloadConcurrencyTests", + "DownloadRequestCombineTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "4CF626F71BA7CB3E0011A099", + "name" : "Alamofire tvOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS.xctestplan new file mode 100644 index 00000000..499f3292 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/tvOS.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "06BDBD92-3173-4395-90BF-851B80FF1162", + "name" : "Default", + "options" : { + "threadSanitizerEnabled" : true + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "4CF626F71BA7CB3E0011A099", + "name" : "Alamofire tvOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/visionOS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/visionOS.xctestplan new file mode 100644 index 00000000..92008641 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/visionOS.xctestplan @@ -0,0 +1,24 @@ +{ + "configurations" : [ + { + "id" : "D2E9E261-0428-48C6-A483-07B3473E499C", + "name" : "Configuration 1", + "options" : { + + } + } + ], + "defaultOptions" : { + "threadSanitizerEnabled" : true + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "317338F32A43BE5F00D4EA0A", + "name" : "Alamofire visionOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS-NoTS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS-NoTS.xctestplan new file mode 100644 index 00000000..c6cd1546 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS-NoTS.xctestplan @@ -0,0 +1,30 @@ +{ + "configurations" : [ + { + "id" : "13FE6F19-6B66-4BD2-862D-9F091CA8B792", + "name" : "Default", + "options" : { + + } + } + ], + "defaultOptions" : { + "codeCoverage" : false + }, + "testTargets" : [ + { + "skippedTests" : [ + "ClosureAPIConcurrencyTests", + "DataRequestConcurrencyTests", + "DataStreamConcurrencyTests", + "DownloadConcurrencyTests" + ], + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "31293064263E17D600473CEA", + "name" : "Alamofire watchOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS.xctestplan b/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS.xctestplan new file mode 100644 index 00000000..544cb071 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/Test Plans/watchOS.xctestplan @@ -0,0 +1,25 @@ +{ + "configurations" : [ + { + "id" : "13FE6F19-6B66-4BD2-862D-9F091CA8B792", + "name" : "Default", + "options" : { + "threadSanitizerEnabled" : true + } + } + ], + "defaultOptions" : { + "codeCoverage" : false, + "nsZombieEnabled" : true + }, + "testTargets" : [ + { + "target" : { + "containerPath" : "container:Alamofire.xcodeproj", + "identifier" : "31293064263E17D600473CEA", + "name" : "Alamofire watchOS Tests" + } + } + ], + "version" : 1 +} diff --git a/Carthage/Checkouts/Alamofire/Tests/TestHelpers.swift b/Carthage/Checkouts/Alamofire/Tests/TestHelpers.swift new file mode 100644 index 00000000..eddca4db --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/TestHelpers.swift @@ -0,0 +1,417 @@ +// +// TestHelpers.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation + +extension String { + static let invalidURL = "invalid" + static let nonexistentDomain = "https://nonexistent-domain.org" +} + +extension URL { + static let nonexistentDomain = URL(string: .nonexistentDomain)! +} + +struct Endpoint { + enum Scheme: String { + case http, https + + var port: Int { + switch self { + case .http: return 80 + case .https: return 443 + } + } + } + + enum Host: String { + case localhost = "127.0.0.1" + case httpBin = "httpbin.org" + + func port(for scheme: Scheme) -> Int { + switch self { + case .localhost: return 8080 + case .httpBin: return scheme.port + } + } + } + + enum Path { + case basicAuth(username: String, password: String) + case bytes(count: Int) + case cache + case chunked(count: Int) + case compression(Compression) + case delay(interval: Int) + case digestAuth(qop: String = "auth", username: String, password: String) + case download(count: Int) + case hiddenBasicAuth(username: String, password: String) + case image(Image) + case ip + case method(HTTPMethod) + case payloads(count: Int) + case redirect(count: Int) + case redirectTo + case responseHeaders + case status(Int) + case stream(count: Int) + case upload + case xml + + var string: String { + switch self { + case let .basicAuth(username: username, password: password): + return "/basic-auth/\(username)/\(password)" + case let .bytes(count): + return "/bytes/\(count)" + case .cache: + return "/cache" + case let .chunked(count): + return "/chunked/\(count)" + case let .compression(compression): + return "/\(compression.rawValue)" + case let .delay(interval): + return "/delay/\(interval)" + case let .digestAuth(qop, username, password): + return "/digest-auth/\(qop)/\(username)/\(password)" + case let .download(count): + return "/download/\(count)" + case let .hiddenBasicAuth(username, password): + return "/hidden-basic-auth/\(username)/\(password)" + case let .image(type): + return "/image/\(type.rawValue)" + case .ip: + return "/ip" + case let .method(method): + return "/\(method.rawValue.lowercased())" + case let .payloads(count): + return "/payloads/\(count)" + case let .redirect(count): + return "/redirect/\(count)" + case .redirectTo: + return "/redirect-to" + case .responseHeaders: + return "/response-headers" + case let .status(code): + return "/status/\(code)" + case let .stream(count): + return "/stream/\(count)" + case .upload: + return "/upload" + case .xml: + return "/xml" + } + } + } + + enum Image: String { + case jpeg + } + + enum Compression: String { + case brotli, gzip, deflate + } + + static var get: Endpoint { method(.get) } + + static func basicAuth(forUser user: String = "user", password: String = "password") -> Endpoint { + Endpoint(path: .basicAuth(username: user, password: password)) + } + + static func bytes(_ count: Int) -> Endpoint { + Endpoint(path: .bytes(count: count)) + } + + static let cache: Endpoint = .init(path: .cache) + + static func chunked(_ count: Int) -> Endpoint { + Endpoint(path: .chunked(count: count)) + } + + static func compression(_ compression: Compression) -> Endpoint { + Endpoint(path: .compression(compression)) + } + + static var `default`: Endpoint { .get } + + static func delay(_ interval: Int) -> Endpoint { + Endpoint(path: .delay(interval: interval)) + } + + static func digestAuth(forUser user: String = "user", password: String = "password") -> Endpoint { + Endpoint(path: .digestAuth(username: user, password: password)) + } + + static func download(_ count: Int = 10_000, produceError: Bool = false) -> Endpoint { + Endpoint(path: .download(count: count), queryItems: [.init(name: "shouldProduceError", + value: "\(produceError)")]) + } + + static func hiddenBasicAuth(forUser user: String = "user", password: String = "password") -> Endpoint { + Endpoint(path: .hiddenBasicAuth(username: user, password: password), + headers: [.authorization(username: user, password: password)]) + } + + static func image(_ type: Image) -> Endpoint { + Endpoint(path: .image(type)) + } + + static var ip: Endpoint { + Endpoint(path: .ip) + } + + static func method(_ method: HTTPMethod) -> Endpoint { + Endpoint(path: .method(method), method: method) + } + + static func payloads(_ count: Int) -> Endpoint { + Endpoint(path: .payloads(count: count)) + } + + static func redirect(_ count: Int) -> Endpoint { + Endpoint(path: .redirect(count: count)) + } + + static func redirectTo(_ url: String, code: Int? = nil) -> Endpoint { + var items = [URLQueryItem(name: "url", value: url)] + items = code.map { items + [.init(name: "statusCode", value: "\($0)")] } ?? items + + return Endpoint(path: .redirectTo, queryItems: items) + } + + static func redirectTo(_ endpoint: Endpoint, code: Int? = nil) -> Endpoint { + var items = [URLQueryItem(name: "url", value: endpoint.url.absoluteString)] + items = code.map { items + [.init(name: "statusCode", value: "\($0)")] } ?? items + + return Endpoint(path: .redirectTo, queryItems: items) + } + + static var responseHeaders: Endpoint { + Endpoint(path: .responseHeaders) + } + + static func status(_ code: Int) -> Endpoint { + Endpoint(path: .status(code)) + } + + static func stream(_ count: Int) -> Endpoint { + Endpoint(path: .stream(count: count)) + } + + static let upload: Endpoint = .init(path: .upload, method: .post, headers: [.contentType("application/octet-stream")]) + + static var xml: Endpoint { + Endpoint(path: .xml, headers: [.contentType("application/xml")]) + } + + var scheme = Scheme.http + var port: Int { host.port(for: scheme) } + var host = Host.localhost + var path = Path.method(.get) + var method: HTTPMethod = .get + var headers: HTTPHeaders = .init() + var timeout: TimeInterval = 60 + var queryItems: [URLQueryItem] = [] + var cachePolicy: URLRequest.CachePolicy = .useProtocolCachePolicy + + func modifying(_ keyPath: WritableKeyPath, to value: T) -> Endpoint { + var copy = self + copy[keyPath: keyPath] = value + + return copy + } +} + +extension Endpoint: URLRequestConvertible { + var urlRequest: URLRequest { try! asURLRequest() } + + func asURLRequest() throws -> URLRequest { + var request = try URLRequest(url: asURL()) + request.method = method + request.headers = headers + request.timeoutInterval = timeout + request.cachePolicy = cachePolicy + + return request + } +} + +extension Endpoint: URLConvertible { + var url: URL { try! asURL() } + + func asURL() throws -> URL { + var components = URLComponents() + components.scheme = scheme.rawValue + components.port = port + components.host = host.rawValue + components.path = path.string + + if !queryItems.isEmpty { + components.queryItems = queryItems + } + + return try components.asURL() + } +} + +extension Session { + func request(_ endpoint: Endpoint, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataRequest { + request(endpoint as URLConvertible, + method: endpoint.method, + parameters: parameters, + encoding: encoding, + headers: headers, + interceptor: interceptor, + requestModifier: requestModifier) + } + + func request(_ endpoint: Endpoint, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataRequest { + request(endpoint as URLConvertible, + method: endpoint.method, + parameters: parameters, + encoder: encoder, + headers: headers, + interceptor: interceptor, + requestModifier: requestModifier) + } + + func request(_ endpoint: Endpoint, interceptor: RequestInterceptor? = nil) -> DataRequest { + request(endpoint as URLRequestConvertible, interceptor: interceptor) + } + + func streamRequest(_ endpoint: Endpoint, + headers: HTTPHeaders? = nil, + automaticallyCancelOnStreamError: Bool = false, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil) -> DataStreamRequest { + streamRequest(endpoint as URLConvertible, + method: endpoint.method, + headers: headers, + automaticallyCancelOnStreamError: automaticallyCancelOnStreamError, + interceptor: interceptor, + requestModifier: requestModifier) + } + + func streamRequest(_ endpoint: Endpoint, + automaticallyCancelOnStreamError: Bool = false, + interceptor: RequestInterceptor? = nil) -> DataStreamRequest { + streamRequest(endpoint as URLRequestConvertible, + automaticallyCancelOnStreamError: automaticallyCancelOnStreamError, + interceptor: interceptor) + } + + func download(_ endpoint: Endpoint, + parameters: Parameters? = nil, + encoder: ParameterEncoder = URLEncodedFormParameterEncoder.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + download(endpoint as URLConvertible, + method: endpoint.method, + parameters: parameters, + encoder: encoder, + headers: headers, + interceptor: interceptor, + requestModifier: requestModifier, + to: destination) + } + + func download(_ endpoint: Endpoint, + parameters: Parameters? = nil, + encoding: ParameterEncoding = URLEncoding.default, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + requestModifier: RequestModifier? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + download(endpoint as URLConvertible, + method: endpoint.method, + parameters: parameters, + encoding: encoding, + headers: headers, + interceptor: interceptor, + requestModifier: requestModifier, + to: destination) + } + + func download(_ endpoint: Endpoint, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination? = nil) -> DownloadRequest { + download(endpoint as URLRequestConvertible, interceptor: interceptor, to: destination) + } + + func upload(_ data: Data, + to endpoint: Endpoint, + headers: HTTPHeaders? = nil, + interceptor: RequestInterceptor? = nil, + fileManager: FileManager = .default, + requestModifier: RequestModifier? = nil) -> UploadRequest { + upload(data, to: endpoint as URLConvertible, + method: endpoint.method, + headers: headers, + interceptor: interceptor, + fileManager: fileManager, + requestModifier: requestModifier) + } +} + +extension Data { + var asString: String { + String(decoding: self, as: UTF8.self) + } + + func asJSONObject() throws -> Any { + try JSONSerialization.jsonObject(with: self, options: .allowFragments) + } +} + +struct TestResponse: Decodable { + let headers: [String: String] + let origin: String + let url: String? + let data: String? + let form: [String: String]? + let args: [String: String]? +} + +struct TestParameters: Encodable { + static let `default` = TestParameters(property: "property") + + let property: String +} + +struct UploadResponse: Decodable { + let bytes: Int +} diff --git a/Carthage/Checkouts/Alamofire/Tests/URLProtocolTests.swift b/Carthage/Checkouts/Alamofire/Tests/URLProtocolTests.swift new file mode 100644 index 00000000..e75e5e85 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/URLProtocolTests.swift @@ -0,0 +1,160 @@ +// +// URLProtocolTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +class ProxyURLProtocol: URLProtocol { + // MARK: Properties + + enum PropertyKeys { + static let handledByForwarderURLProtocol = "HandledByProxyURLProtocol" + } + + lazy var session: URLSession = { + let configuration: URLSessionConfiguration = { + let configuration = URLSessionConfiguration.ephemeral + configuration.headers = HTTPHeaders.default + + return configuration + }() + + let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil) + + return session + }() + + weak var activeTask: URLSessionTask? + + // MARK: Class Request Methods + + override class func canInit(with request: URLRequest) -> Bool { + if URLProtocol.property(forKey: PropertyKeys.handledByForwarderURLProtocol, in: request) != nil { + return false + } + + return true + } + + override class func canonicalRequest(for request: URLRequest) -> URLRequest { + if let headers = request.allHTTPHeaderFields { + do { + return try URLEncoding.default.encode(request, with: headers) + } catch { + return request + } + } + + return request + } + + override class func requestIsCacheEquivalent(_ a: URLRequest, to b: URLRequest) -> Bool { + false + } + + // MARK: Loading Methods + + override func startLoading() { + // rdar://26849668 - URLProtocol had some API's that didn't make the value type conversion + let urlRequest = (request.urlRequest! as NSURLRequest).mutableCopy() as! NSMutableURLRequest + URLProtocol.setProperty(true, forKey: PropertyKeys.handledByForwarderURLProtocol, in: urlRequest) + activeTask = session.dataTask(with: urlRequest as URLRequest) + activeTask?.resume() + } + + override func stopLoading() { + activeTask?.cancel() + } +} + +// MARK: - + +extension ProxyURLProtocol: URLSessionDataDelegate { + // MARK: NSURLSessionDelegate + + func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { + client?.urlProtocol(self, didLoad: data) + } + + func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + if let response = task.response { + client?.urlProtocol(self, didReceive: response, cacheStoragePolicy: .notAllowed) + } + + client?.urlProtocolDidFinishLoading(self) + } +} + +// MARK: - + +class URLProtocolTestCase: BaseTestCase { + var manager: Session! + + // MARK: Setup and Teardown + + override func setUp() { + super.setUp() + + manager = { + let configuration: URLSessionConfiguration = { + let configuration = URLSessionConfiguration.default + configuration.protocolClasses = [ProxyURLProtocol.self] + configuration.headers["Session-Configuration-Header"] = "foo" + + return configuration + }() + + return Session(configuration: configuration) + }() + } + + // MARK: Tests + + func testThatURLProtocolReceivesRequestHeadersAndSessionConfigurationHeaders() { + // Given + let endpoint = Endpoint.responseHeaders.modifying(\.headers, to: ["Request-Header": "foobar"]) + + let expectation = expectation(description: "GET request should succeed") + + var response: DataResponse? + + // When + manager.request(endpoint) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + XCTAssertEqual(response?.response?.headers["Request-Header"], "foobar") + XCTAssertEqual(response?.response?.headers["Session-Configuration-Header"], "foo") + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/UploadTests.swift b/Carthage/Checkouts/Alamofire/Tests/UploadTests.swift new file mode 100644 index 00000000..4ce7f0b9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/UploadTests.swift @@ -0,0 +1,872 @@ +// +// UploadTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Foundation +import XCTest + +final class UploadFileInitializationTestCase: BaseTestCase { + func testUploadClassMethodWithMethodURLAndFile() { + // Given + let requestURL = Endpoint.method(.post).url + let imageURL = url(forResource: "rainbow", withExtension: "jpg") + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(imageURL, to: requestURL).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod, "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, requestURL, "request URL should be equal") + XCTAssertNotNil(request.response, "response should not be nil") + } + + func testUploadClassMethodWithMethodURLHeadersAndFile() { + // Given + let requestURL = Endpoint.method(.post).url + let headers: HTTPHeaders = ["Authorization": "123456"] + let imageURL = url(forResource: "rainbow", withExtension: "jpg") + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(imageURL, to: requestURL, method: .post, headers: headers).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod, "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, requestURL, "request URL should be equal") + + let authorizationHeader = request.request?.value(forHTTPHeaderField: "Authorization") ?? "" + XCTAssertEqual(authorizationHeader, "123456", "Authorization header is incorrect") + + XCTAssertNotNil(request.response, "response should not be nil") + } +} + +// MARK: - + +final class UploadDataInitializationTestCase: BaseTestCase { + func testUploadClassMethodWithMethodURLAndData() { + // Given + let url = Endpoint.method(.post).url + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(Data(), to: url).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod ?? "", "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, url, "request URL should be equal") + XCTAssertNotNil(request.response, "response should not be nil") + } + + func testUploadClassMethodWithMethodURLHeadersAndData() { + // Given + let url = Endpoint.method(.post).url + let headers: HTTPHeaders = ["Authorization": "123456"] + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(Data(), to: url, headers: headers).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod, "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, url, "request URL should be equal") + + let authorizationHeader = request.request?.value(forHTTPHeaderField: "Authorization") ?? "" + XCTAssertEqual(authorizationHeader, "123456", "Authorization header is incorrect") + + XCTAssertNotNil(request.response, "response should not be nil") + } +} + +// MARK: - + +final class UploadStreamInitializationTestCase: BaseTestCase { + func testUploadClassMethodWithMethodURLAndStream() { + // Given + let requestURL = Endpoint.method(.post).url + let imageURL = url(forResource: "rainbow", withExtension: "jpg") + let imageStream = InputStream(url: imageURL)! + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(imageStream, to: requestURL).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod, "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, requestURL, "request URL should be equal") + XCTAssertNotNil(request.response, "response should not be nil") + } + + func testUploadClassMethodWithMethodURLHeadersAndStream() { + // Given + let requestURL = Endpoint.method(.post).url + let imageURL = url(forResource: "rainbow", withExtension: "jpg") + let headers: HTTPHeaders = ["Authorization": "123456"] + let imageStream = InputStream(url: imageURL)! + let expectation = expectation(description: "upload should complete") + + // When + let request = AF.upload(imageStream, to: requestURL, headers: headers).response { _ in + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request.request, "request should not be nil") + XCTAssertEqual(request.request?.httpMethod, "POST", "request HTTP method should be POST") + XCTAssertEqual(request.request?.url, requestURL, "request URL should be equal") + + let authorizationHeader = request.request?.value(forHTTPHeaderField: "Authorization") ?? "" + XCTAssertEqual(authorizationHeader, "123456", "Authorization header is incorrect") + + XCTAssertNotNil(request.response, "response should not be nil, tasks: \(request.tasks)") + } +} + +// MARK: - + +final class UploadDataTestCase: BaseTestCase { + func testUploadDataRequest() { + // Given + let url = Endpoint.method(.post).url + let data = Data("Lorem ipsum dolor sit amet".utf8) + + let expectation = expectation(description: "Upload request should succeed: \(url)") + var response: DataResponse? + + // When + AF.upload(data, to: url) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNil(response?.error) + } + + func testUploadDataRequestWithProgress() { + // Given + let url = Endpoint.method(.post).url + let string = String(repeating: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ", count: 1000) + let data = Data(string.utf8) + + let expectation = expectation(description: "Bytes upload progress should be reported: \(url)") + + var uploadProgressValues: [Double] = [] + var downloadProgressValues: [Double] = [] + + var response: DataResponse? + + // When + AF.upload(data, to: url) + .uploadProgress { progress in + uploadProgressValues.append(progress.fractionCompleted) + } + .downloadProgress { progress in + downloadProgressValues.append(progress.fractionCompleted) + } + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + var previousUploadProgress: Double = uploadProgressValues.first ?? 0.0 + + for progress in uploadProgressValues { + XCTAssertGreaterThanOrEqual(progress, previousUploadProgress) + previousUploadProgress = progress + } + + if let lastProgressValue = uploadProgressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in uploadProgressValues should not be nil") + } + + var previousDownloadProgress: Double = downloadProgressValues.first ?? 0.0 + + for progress in downloadProgressValues { + XCTAssertGreaterThanOrEqual(progress, previousDownloadProgress) + previousDownloadProgress = progress + } + + if let lastProgressValue = downloadProgressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in downloadProgressValues should not be nil") + } + } +} + +// MARK: - + +final class UploadMultipartFormDataTestCase: BaseTestCase { + func testThatUploadingMultipartFormDataSetsContentTypeHeader() { + // Given + let url = Endpoint.method(.post).url + let uploadData = Data("upload_data".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + + var formData: MultipartFormData? + var response: DataResponse? + + // When + AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(uploadData, withName: "upload_data") + formData = multipartFormData + }, + to: url) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + if + let request = response?.request, + let multipartFormData = formData, + let contentType = request.value(forHTTPHeaderField: "Content-Type") { + XCTAssertEqual(contentType, multipartFormData.contentType) + } else { + XCTFail("Content-Type header value should not be nil") + } + } + + func testThatAccessingMultipartFormDataURLIsThreadSafe() { + // Given + let url = Endpoint.method(.post).url + let uploadData = Data("upload_data".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + + var formData: MultipartFormData? + var generatedURL: URL? + var response: DataResponse? + + // When + let upload = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(uploadData, withName: "upload_data") + formData = multipartFormData + }, + to: url) + + // Access will produce a thread-sanitizer issue if it isn't safe. + generatedURL = upload.convertible.urlRequest?.url + + upload.response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + if + let request = response?.request, + let multipartFormData = formData, + let contentType = request.value(forHTTPHeaderField: "Content-Type") { + XCTAssertEqual(contentType, multipartFormData.contentType) + XCTAssertEqual(url, generatedURL) + } else { + XCTFail("Content-Type header value should not be nil") + } + } + + func testThatCustomBoundaryCanBeSetWhenUploadingMultipartFormData() throws { + // Given + let uploadData = Data("upload_data".utf8) + + let formData = MultipartFormData(fileManager: .default, boundary: "custom-test-boundary") + formData.append(uploadData, withName: "upload_data") + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + + // When + AF.upload(multipartFormData: formData, with: Endpoint.method(.post)).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + if let request = response?.request, let contentType = request.value(forHTTPHeaderField: "Content-Type") { + XCTAssertEqual(contentType, formData.contentType) + XCTAssertTrue(contentType.contains("boundary=custom-test-boundary")) + } else { + XCTFail("Content-Type header value should not be nil") + } + } + + func testThatUploadingMultipartFormDataSucceedsWithDefaultParameters() { + // Given + let frenchData = Data("français".utf8) + let japaneseData = Data("日本語".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + + // When + AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(frenchData, withName: "french") + multipartFormData.append(japaneseData, withName: "japanese") + }, + to: Endpoint.method(.post)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + } + + func testThatUploadingMultipartFormDataWhileStreamingFromMemoryMonitorsProgress() { + executeMultipartFormDataUploadRequestWithProgress(streamFromDisk: false) + } + + func testThatUploadingMultipartFormDataWhileStreamingFromDiskMonitorsProgress() { + executeMultipartFormDataUploadRequestWithProgress(streamFromDisk: true) + } + + func testThatUploadingMultipartFormDataBelowMemoryThresholdStreamsFromMemory() { + // Given + let frenchData = Data("français".utf8) + let japaneseData = Data("日本語".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + + // When + let request = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(frenchData, withName: "french") + multipartFormData.append(japaneseData, withName: "japanese") + }, + to: Endpoint.method(.post)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + guard let uploadable = request.uploadable, case .data = uploadable else { + XCTFail("Uploadable is not .data") + return + } + + XCTAssertTrue(response?.result.isSuccess == true) + } + + func testThatUploadingMultipartFormDataBelowMemoryThresholdSetsContentTypeHeader() { + // Given + let uploadData = Data("upload_data".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + + var formData: MultipartFormData? + var response: DataResponse? + + // When + let request = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(uploadData, withName: "upload_data") + formData = multipartFormData + }, + to: Endpoint.method(.post)) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + guard let uploadable = request.uploadable, case .data = uploadable else { + XCTFail("Uploadable is not .data") + return + } + + if + let request = response?.request, + let multipartFormData = formData, + let contentType = request.value(forHTTPHeaderField: "Content-Type") { + XCTAssertEqual(contentType, multipartFormData.contentType, "Content-Type header value should match") + } else { + XCTFail("Content-Type header value should not be nil") + } + } + + func testThatUploadingMultipartFormDataAboveMemoryThresholdStreamsFromDisk() { + // Given + let frenchData = Data("français".utf8) + let japaneseData = Data("日本語".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + + // When + let request = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(frenchData, withName: "french") + multipartFormData.append(japaneseData, withName: "japanese") + }, + to: Endpoint.method(.post), + usingThreshold: 0).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + guard let uploadable = request.uploadable, case let .file(url, _) = uploadable else { + XCTFail("Uploadable is not .file") + return + } + + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertFalse(FileManager.default.fileExists(atPath: url.path)) + } + + func testThatUploadingMultipartFormDataAboveMemoryThresholdSetsContentTypeHeader() { + // Given + let uploadData = Data("upload_data".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + var formData: MultipartFormData? + + // When + let request = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(uploadData, withName: "upload_data") + formData = multipartFormData + }, + to: Endpoint.method(.post), + usingThreshold: 0).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + guard let uploadable = request.uploadable, case .file = uploadable else { + XCTFail("Uploadable is not .file") + return + } + + XCTAssertTrue(response?.result.isSuccess == true) + + if + let request = response?.request, + let multipartFormData = formData, + let contentType = request.value(forHTTPHeaderField: "Content-Type") { + XCTAssertEqual(contentType, multipartFormData.contentType, "Content-Type header value should match") + } else { + XCTFail("Content-Type header value should not be nil") + } + } + + func testThatUploadingMultipartFormDataWithNonexistentFileThrowsAnError() { + // Given + let imageURL = URL(fileURLWithPath: "does_not_exist.jpg") + + let expectation = expectation(description: "multipart form data upload from nonexistent file should fail") + var response: DataResponse? + + // When + let request = AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(imageURL, withName: "upload_file") + }, + to: Endpoint.method(.post), + usingThreshold: 0).response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(request.uploadable) + XCTAssertTrue(response?.result.isSuccess == false) + } + + func testThatUploadingMultipartFormDataWorksWhenAppendingBodyPartsInURLRequestConvertible() { + // Given + struct MultipartFormDataRequest: URLRequestConvertible { + let multipartFormData = MultipartFormData() + + func asURLRequest() throws -> URLRequest { + appendBodyParts() + return try Endpoint.method(.post).asURLRequest() + } + + func appendBodyParts() { + let frenchData = Data("français".utf8) + multipartFormData.append(frenchData, withName: "french") + + let japaneseData = Data("日本語".utf8) + multipartFormData.append(japaneseData, withName: "japanese") + } + } + + let request = MultipartFormDataRequest() + + let expectation = expectation(description: "multipart form data upload should succeed") + var response: DataResponse? + + // When + let uploadRequest = AF.upload(multipartFormData: request.multipartFormData, with: request) + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + switch uploadRequest.uploadable { + case let .data(data): + XCTAssertEqual(data.count, 241) + + default: + XCTFail("Uploadable should be of type data and not be empty") + } + } + + #if os(macOS) + func disabled_testThatUploadingMultipartFormDataOnBackgroundSessionWritesDataToFileToAvoidCrash() { + // Given + let manager: Session = { + let identifier = "org.alamofire.uploadtests.\(UUID().uuidString)" + let configuration = URLSessionConfiguration.background(withIdentifier: identifier) + + return Session(configuration: configuration) + }() + + let french = Data("français".utf8) + let japanese = Data("日本語".utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + + var request: URLRequest? + var response: HTTPURLResponse? + var data: Data? + var error: AFError? + + // When + let upload = manager.upload(multipartFormData: { multipartFormData in + multipartFormData.append(french, withName: "french") + multipartFormData.append(japanese, withName: "japanese") + }, + to: Endpoint.method(.post)) + .response { defaultResponse in + request = defaultResponse.request + response = defaultResponse.response + data = defaultResponse.data + error = defaultResponse.error + + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(request, "request should not be nil") + XCTAssertNotNil(response, "response should not be nil") + XCTAssertNotNil(data, "data should not be nil") + XCTAssertNil(error, "error should be nil") + + guard let uploadable = upload.uploadable, case .file = uploadable else { + XCTFail("Uploadable is not .file") + return + } + } + #endif + + // MARK: Combined Test Execution + + private func executeMultipartFormDataUploadRequestWithProgress(streamFromDisk: Bool) { + // Given + let loremData1 = Data(String(repeating: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + count: 500).utf8) + let loremData2 = Data(String(repeating: "Lorem ipsum dolor sit amet, nam no graeco recusabo appellantur.", + count: 500).utf8) + + let expectation = expectation(description: "multipart form data upload should succeed") + + var uploadProgressValues: [Double] = [] + var downloadProgressValues: [Double] = [] + + var response: DataResponse? + + // When + AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(loremData1, withName: "lorem1") + multipartFormData.append(loremData2, withName: "lorem2") + }, + to: Endpoint.method(.post), + usingThreshold: streamFromDisk ? 0 : 100_000_000) + .uploadProgress { progress in + uploadProgressValues.append(progress.fractionCompleted) + } + .downloadProgress { progress in + downloadProgressValues.append(progress.fractionCompleted) + } + .response { resp in + response = resp + expectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(response?.request) + XCTAssertNotNil(response?.response) + XCTAssertNotNil(response?.data) + XCTAssertNil(response?.error) + + var previousUploadProgress: Double = uploadProgressValues.first ?? 0.0 + + for progress in uploadProgressValues { + XCTAssertGreaterThanOrEqual(progress, previousUploadProgress) + previousUploadProgress = progress + } + + if let lastProgressValue = uploadProgressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in uploadProgressValues should not be nil") + } + + var previousDownloadProgress: Double = downloadProgressValues.first ?? 0.0 + + for progress in downloadProgressValues { + XCTAssertGreaterThanOrEqual(progress, previousDownloadProgress) + previousDownloadProgress = progress + } + + if let lastProgressValue = downloadProgressValues.last { + XCTAssertEqual(lastProgressValue, 1.0) + } else { + XCTFail("last item in downloadProgressValues should not be nil") + } + } +} + +final class UploadRetryTests: BaseTestCase { + func testThatDataUploadRetriesCorrectly() { + // Given + let endpoint = Endpoint(path: .delay(interval: 1), + method: .post, + headers: [.contentType("text/plain")], + timeout: 0.1) + let retrier = InspectorInterceptor(SingleRetrier()) + let didRetry = expectation(description: "request did retry") + retrier.onRetry = { _ in didRetry.fulfill() } + let session = Session(interceptor: retrier) + let body = "body" + let data = Data(body.utf8) + var response: AFDataResponse? + let completion = expectation(description: "upload should complete") + + // When + session.upload(data, with: endpoint).responseDecodable(of: TestResponse.self) { + response = $0 + completion.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(retrier.retryCalledCount, 1) + XCTAssertTrue(response?.result.isSuccess == true) + XCTAssertEqual(response?.value?.data, body) + } +} + +final class UploadRequestEventsTestCase: BaseTestCase { + func testThatUploadRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(eventMonitors: [eventMonitor]) + + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didCreateInitialURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateURLRequest = expectation(description: "didCreateURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didCreateUploadable = expectation(description: "didCreateUploadable should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateInitialURLRequest.fulfill() } + eventMonitor.requestDidCreateURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidResumeTask = { _, _ in didResumeTask.fulfill() } + eventMonitor.requestDidCreateUploadable = { _, _ in didCreateUploadable.fulfill() } + eventMonitor.requestDidParseResponse = { _, _ in didParseResponse.fulfill() } + + // When + let request = session.upload(Data("PAYLOAD".utf8), + with: Endpoint.method(.post)).response { _ in + responseHandler.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .finished) + } + + func testThatCancelledUploadRequestTriggersAllAppropriateLifetimeEvents() { + // Given + let eventMonitor = ClosureEventMonitor() + let session = Session(startRequestsImmediately: false, eventMonitors: [eventMonitor]) + + let taskDidFinishCollecting = expectation(description: "taskDidFinishCollecting should fire") + let didCreateInitialURLRequest = expectation(description: "didCreateInitialURLRequest should fire") + let didCreateURLRequest = expectation(description: "didCreateURLRequest should fire") + let didCreateTask = expectation(description: "didCreateTask should fire") + let didGatherMetrics = expectation(description: "didGatherMetrics should fire") + let didComplete = expectation(description: "didComplete should fire") + let didFinish = expectation(description: "didFinish should fire") + let didResume = expectation(description: "didResume should fire") + let didResumeTask = expectation(description: "didResumeTask should fire") + let didCreateUploadable = expectation(description: "didCreateUploadable should fire") + let didParseResponse = expectation(description: "didParseResponse should fire") + let didCancel = expectation(description: "didCancel should fire") + let didCancelTask = expectation(description: "didCancelTask should fire") + let responseHandler = expectation(description: "responseHandler should fire") + + eventMonitor.taskDidFinishCollectingMetrics = { _, _, _ in taskDidFinishCollecting.fulfill() } + eventMonitor.requestDidCreateInitialURLRequest = { _, _ in didCreateInitialURLRequest.fulfill() } + eventMonitor.requestDidCreateURLRequest = { _, _ in didCreateURLRequest.fulfill() } + eventMonitor.requestDidCreateTask = { _, _ in didCreateTask.fulfill() } + eventMonitor.requestDidGatherMetrics = { _, _ in didGatherMetrics.fulfill() } + eventMonitor.requestDidCompleteTaskWithError = { _, _, _ in didComplete.fulfill() } + eventMonitor.requestDidFinish = { _ in didFinish.fulfill() } + eventMonitor.requestDidResume = { _ in didResume.fulfill() } + eventMonitor.requestDidCreateUploadable = { _, _ in didCreateUploadable.fulfill() } + eventMonitor.requestDidParseResponse = { _, _ in didParseResponse.fulfill() } + eventMonitor.requestDidCancel = { _ in didCancel.fulfill() } + eventMonitor.requestDidCancelTask = { _, _ in didCancelTask.fulfill() } + + // When + let request = session.upload(Data("PAYLOAD".utf8), + with: Endpoint.delay(5).modifying(\.method, to: .post)).response { _ in + responseHandler.fulfill() + } + + eventMonitor.requestDidResumeTask = { [unowned request] _, _ in + request.cancel() + didResumeTask.fulfill() + } + + request.resume() + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(request.state, .cancelled) + } +} diff --git a/Carthage/Checkouts/Alamofire/Tests/ValidationTests.swift b/Carthage/Checkouts/Alamofire/Tests/ValidationTests.swift new file mode 100644 index 00000000..25a7ed4f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/Tests/ValidationTests.swift @@ -0,0 +1,965 @@ +// +// ValidationTests.swift +// +// Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +@testable import Alamofire +import Foundation +import XCTest + +final class StatusCodeValidationTestCase: BaseTestCase { + func testThatValidationForRequestWithAcceptableStatusCodeResponseSucceeds() { + // Given + let endpoint = Endpoint.status(200) + + let expectation1 = expectation(description: "request should return 200 status code") + let expectation2 = expectation(description: "download should return 200 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(statusCode: 200..<300) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(statusCode: 200..<300) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithUnacceptableStatusCodeResponseFails() { + // Given + let endpoint = Endpoint.status(404) + + let expectation1 = expectation(description: "request should return 404 status code") + let expectation2 = expectation(description: "download should return 404 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(statusCode: [200]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(statusCode: [200]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableStatusCode, true) + XCTAssertEqual(error?.responseCode, 404) + } + } + + func testThatValidationForRequestWithNoAcceptableStatusCodesFails() { + // Given + let endpoint = Endpoint.status(201) + + let expectation1 = expectation(description: "request should return 201 status code") + let expectation2 = expectation(description: "download should return 201 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(statusCode: []) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(statusCode: []) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableStatusCode, true) + XCTAssertEqual(error?.responseCode, 201) + } + } +} + +// MARK: - + +final class ContentTypeValidationTestCase: BaseTestCase { + func testThatValidationForRequestWithAcceptableContentTypeResponseSucceeds() { + // Given + let endpoint = Endpoint.ip + + let expectation1 = expectation(description: "request should succeed and return ip") + let expectation2 = expectation(description: "download should succeed and return ip") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: ["application/json"]) + .validate(contentType: ["application/json; charset=utf-8"]) + .validate(contentType: ["application/json; q=0.8; charset=utf-8"]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: ["application/json"]) + .validate(contentType: ["application/json; charset=utf-8"]) + .validate(contentType: ["application/json; q=0.8; charset=utf-8"]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithAcceptableWildcardContentTypeResponseSucceeds() { + // Given + let endpoint = Endpoint.ip + + let expectation1 = expectation(description: "request should succeed and return ip") + let expectation2 = expectation(description: "download should succeed and return ip") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: ["*/*"]) + .validate(contentType: ["application/*"]) + .validate(contentType: ["*/json"]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: ["*/*"]) + .validate(contentType: ["application/*"]) + .validate(contentType: ["*/json"]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithUnacceptableContentTypeResponseFails() { + // Given + let endpoint = Endpoint.xml + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: ["application/octet-stream"]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: ["application/octet-stream"]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableContentType, true) + XCTAssertEqual(error?.responseContentType, "application/xml") + XCTAssertEqual(error?.acceptableContentTypes?.first, "application/octet-stream") + } + } + + func testThatContentTypeValidationFailureSortsPossibleContentTypes() { + // Given + let endpoint = Endpoint.xml + + let requestDidCompleteExpectation = expectation(description: "request should succeed and return xml") + let downloadDidCompleteExpectation = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + let acceptableContentTypes = [ // Sorted in a random order, not alphabetically + "application/octet-stream", + "image/gif", + "image/x-xbitmap", + "image/tiff", + "image/jpg", + "image/x-bmp", + "image/jpeg", + "image/x-icon", + "image/jp2", + "image/png", + "image/ico", + "image/bmp", + "image/x-ms-bmp", + "image/x-win-bitmap" + ] + + // When + AF.request(endpoint) + .validate(contentType: acceptableContentTypes) + .response { resp in + requestError = resp.error + requestDidCompleteExpectation.fulfill() + } + + AF.download(endpoint) + .validate(contentType: acceptableContentTypes) + .response { resp in + downloadError = resp.error + downloadDidCompleteExpectation.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + let expectedAcceptableContentTypes = [ // Sorted in a specific order, alphabetically + "application/octet-stream", + "image/bmp", + "image/gif", + "image/ico", + "image/jp2", + "image/jpeg", + "image/jpg", + "image/png", + "image/tiff", + "image/x-bmp", + "image/x-icon", + "image/x-ms-bmp", + "image/x-win-bitmap", + "image/x-xbitmap" + ] + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableContentType, true) + XCTAssertEqual(error?.responseContentType, "application/xml") + XCTAssertEqual(error?.acceptableContentTypes, expectedAcceptableContentTypes) + } + } + + func testThatValidationForRequestWithNoAcceptableContentTypeResponseFails() { + // Given + let endpoint = Endpoint.xml + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: []) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: []) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableContentType, true) + XCTAssertEqual(error?.responseContentType, "application/xml") + XCTAssertEqual(error?.acceptableContentTypes?.isEmpty, true) + } + } + + func testThatValidationForRequestWithNoAcceptableContentTypeResponseSucceedsWhenNoDataIsReturned() { + // Given + let endpoint = Endpoint.status(204) + + let expectation1 = expectation(description: "request should succeed and return no data") + let expectation2 = expectation(description: "download should succeed and return no data") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: []) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: []) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithAcceptableWildcardContentTypeResponseSucceedsWhenResponseIsNil() { + // Given + class MockManager: Session { + override func request(_ convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil) -> DataRequest { + let request = MockDataRequest(convertible: convertible, + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self) + + perform(request) + + return request + } + + override func download(_ convertible: URLRequestConvertible, + interceptor: RequestInterceptor? = nil, + to destination: DownloadRequest.Destination?) + -> DownloadRequest { + let request = MockDownloadRequest(downloadable: .request(convertible), + underlyingQueue: rootQueue, + serializationQueue: serializationQueue, + eventMonitor: eventMonitor, + interceptor: interceptor, + delegate: self, + destination: destination ?? MockDownloadRequest.defaultDestination) + + perform(request) + + return request + } + } + + class MockDataRequest: DataRequest { + override var response: HTTPURLResponse? { + MockHTTPURLResponse(url: request!.url!, + statusCode: 204, + httpVersion: "HTTP/1.1", + headerFields: nil) + } + } + + class MockDownloadRequest: DownloadRequest { + override var response: HTTPURLResponse? { + MockHTTPURLResponse(url: request!.url!, + statusCode: 204, + httpVersion: "HTTP/1.1", + headerFields: nil) + } + } + + class MockHTTPURLResponse: HTTPURLResponse { + override var mimeType: String? { nil } + } + + let manager: Session = { + let configuration: URLSessionConfiguration = { + let configuration = URLSessionConfiguration.ephemeral + configuration.headers = HTTPHeaders.default + + return configuration + }() + + return MockManager(configuration: configuration) + }() + + let endpoint = Endpoint.method(.delete) + + let expectation1 = expectation(description: "request should be stubbed and return 204 status code") + let expectation2 = expectation(description: "download should be stubbed and return 204 status code") + + var requestResponse: DataResponse? + var downloadResponse: DownloadResponse? + + // When + manager.request(endpoint) + .validate(contentType: ["*/*"]) + .response { resp in + requestResponse = resp + expectation1.fulfill() + } + + manager.download(endpoint) + .validate(contentType: ["*/*"]) + .response { resp in + downloadResponse = resp + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestResponse?.response) + XCTAssertNotNil(requestResponse?.data) + XCTAssertNil(requestResponse?.error) + + XCTAssertEqual(requestResponse?.response?.statusCode, 204) + XCTAssertNil(requestResponse?.response?.mimeType) + + XCTAssertNotNil(downloadResponse?.response) + XCTAssertNotNil(downloadResponse?.fileURL) + XCTAssertNil(downloadResponse?.error) + + XCTAssertEqual(downloadResponse?.response?.statusCode, 204) + XCTAssertNil(downloadResponse?.response?.mimeType) + } +} + +// MARK: - + +final class MultipleValidationTestCase: BaseTestCase { + func testThatValidationForRequestWithAcceptableStatusCodeAndContentTypeResponseSucceeds() { + // Given + let endpoint = Endpoint.ip + + let expectation1 = expectation(description: "request should succeed and return ip") + let expectation2 = expectation(description: "request should succeed and return ip") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(statusCode: 200..<300) + .validate(contentType: ["application/json"]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(statusCode: 200..<300) + .validate(contentType: ["application/json"]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithUnacceptableStatusCodeAndContentTypeResponseFailsWithStatusCodeError() { + // Given + let endpoint = Endpoint.xml + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(statusCode: 400..<600) + .validate(contentType: ["application/octet-stream"]) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(statusCode: 400..<600) + .validate(contentType: ["application/octet-stream"]) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableStatusCode, true) + XCTAssertEqual(error?.responseCode, 200) + } + } + + func testThatValidationForRequestWithUnacceptableStatusCodeAndContentTypeResponseFailsWithContentTypeError() { + // Given + let endpoint = Endpoint.xml + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(contentType: ["application/octet-stream"]) + .validate(statusCode: 400..<600) + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(contentType: ["application/octet-stream"]) + .validate(statusCode: 400..<600) + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableContentType, true) + XCTAssertEqual(error?.responseContentType, "application/xml") + XCTAssertEqual(error?.acceptableContentTypes?.first, "application/octet-stream") + } + } +} + +// MARK: - + +final class AutomaticValidationTestCase: BaseTestCase { + func testThatValidationForRequestWithAcceptableStatusCodeAndContentTypeResponseSucceeds() { + // Given + let urlRequest = Endpoint.ip.modifying(\.headers, to: [.accept("application/json")]) + + let expectation1 = expectation(description: "request should succeed and return ip") + let expectation2 = expectation(description: "download should succeed and return ip") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(urlRequest).validate().response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(urlRequest).validate().response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithUnacceptableStatusCodeResponseFails() { + // Given + let request = Endpoint.status(404) + + let expectation1 = expectation(description: "request should return 404 status code") + let expectation2 = expectation(description: "download should return 404 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(request) + .validate() + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(request) + .validate() + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableStatusCode, true) + XCTAssertEqual(error?.responseCode, 404) + } + } + + func testThatValidationForRequestWithAcceptableWildcardContentTypeResponseSucceeds() { + // Given + let urlRequest = Endpoint.ip.modifying(\.headers, to: [.accept("application/*")]) + + let expectation1 = expectation(description: "request should succeed and return ip") + let expectation2 = expectation(description: "download should succeed and return ip") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(urlRequest).validate().response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(urlRequest).validate().response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithAcceptableComplexContentTypeResponseSucceeds() { + // Given + var urlRequest = Endpoint.xml.urlRequest + + let headerValue = "text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8,*/*;q=0.5" + urlRequest.headers["Accept"] = headerValue + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "request should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(urlRequest).validate().response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(urlRequest).validate().response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationForRequestWithUnacceptableContentTypeResponseFails() { + // Given + let urlRequest = Endpoint.xml.modifying(\.headers, to: [.accept("application/json")]) + + let expectation1 = expectation(description: "request should succeed and return xml") + let expectation2 = expectation(description: "download should succeed and return xml") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(urlRequest).validate().response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(urlRequest).validate().response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNotNil(requestError) + XCTAssertNotNil(downloadError) + + for error in [requestError, downloadError] { + XCTAssertEqual(error?.isUnacceptableContentType, true) + XCTAssertEqual(error?.responseContentType, "application/xml") + XCTAssertEqual(error?.acceptableContentTypes?.first, "application/json") + } + } +} + +// MARK: - + +private enum ValidationError: Error { + case missingData, missingFile, fileReadFailed +} + +extension DataRequest { + func validateDataExists() -> Self { + validate { _, _, data in + guard data != nil else { return .failure(ValidationError.missingData) } + return .success(()) + } + } + + func validate(with error: Error) -> Self { + validate { _, _, _ in .failure(error) } + } +} + +extension DownloadRequest { + func validateDataExists() -> Self { + validate { [unowned self] _, _, _ in + guard let validFileURL = fileURL else { return .failure(ValidationError.missingFile) } + + do { + _ = try Data(contentsOf: validFileURL) + return .success(()) + } catch { + return .failure(ValidationError.fileReadFailed) + } + } + } + + func validate(with error: Error) -> Self { + validate { _, _, _ in .failure(error) } + } +} + +// MARK: - + +final class CustomValidationTestCase: BaseTestCase { + func testThatCustomValidationClosureHasAccessToServerResponseData() { + // Given + let endpoint = Endpoint() + + let expectation1 = expectation(description: "request should return 200 status code") + let expectation2 = expectation(description: "download should return 200 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate { _, _, data in + guard data != nil else { return .failure(ValidationError.missingData) } + return .success(()) + } + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate { _, _, fileURL in + guard let fileURL = fileURL else { return .failure(ValidationError.missingFile) } + + do { + _ = try Data(contentsOf: fileURL) + return .success(()) + } catch { + return .failure(ValidationError.fileReadFailed) + } + } + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatCustomValidationCanThrowCustomError() { + // Given + let endpoint = Endpoint() + + let expectation1 = expectation(description: "request should return 200 status code") + let expectation2 = expectation(description: "download should return 200 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate { _, _, _ in .failure(ValidationError.missingData) } + .validate { _, _, _ in .failure(ValidationError.missingFile) } // should be ignored + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate { _, _, _ in .failure(ValidationError.missingFile) } + .validate { _, _, _ in .failure(ValidationError.fileReadFailed) } // should be ignored + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(requestError?.asAFError?.underlyingError as? ValidationError, .missingData) + XCTAssertEqual(downloadError?.asAFError?.underlyingError as? ValidationError, .missingFile) + } + + func testThatValidationExtensionHasAccessToServerResponseData() { + // Given + let endpoint = Endpoint() + + let expectation1 = expectation(description: "request should return 200 status code") + let expectation2 = expectation(description: "download should return 200 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validateDataExists() + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validateDataExists() + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertNil(requestError) + XCTAssertNil(downloadError) + } + + func testThatValidationExtensionCanThrowCustomError() { + // Given + let endpoint = Endpoint() + + let expectation1 = expectation(description: "request should return 200 status code") + let expectation2 = expectation(description: "download should return 200 status code") + + var requestError: AFError? + var downloadError: AFError? + + // When + AF.request(endpoint) + .validate(with: ValidationError.missingData) + .validate(with: ValidationError.missingFile) // should be ignored + .response { resp in + requestError = resp.error + expectation1.fulfill() + } + + AF.download(endpoint) + .validate(with: ValidationError.missingFile) + .validate(with: ValidationError.fileReadFailed) // should be ignored + .response { resp in + downloadError = resp.error + expectation2.fulfill() + } + + waitForExpectations(timeout: timeout) + + // Then + XCTAssertEqual(requestError?.asAFError?.underlyingError as? ValidationError, .missingData) + XCTAssertEqual(downloadError?.asAFError?.underlyingError as? ValidationError, .missingFile) + } +} diff --git a/Carthage/Checkouts/Alamofire/docs/Classes.html b/Carthage/Checkouts/Alamofire/docs/Classes.html new file mode 100644 index 00000000..831a6ac3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes.html @@ -0,0 +1,1699 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +

+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Classes

+

The following classes are available globally.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests. +It relies on an Authenticator type to handle the actual URLRequest authentication and Credential refresh.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AuthenticationInterceptor<AuthenticatorType> : RequestInterceptor where AuthenticatorType : Authenticator
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest +

+
+
+
    +
  • +
    + + + + DataRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which handles in-memory Data download using URLSessionDataTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class DataRequest : Request
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + DataStreamRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which streams HTTP response Data through a Handler closure.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DataStreamRequest : Request
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadRequest +

+
+
+
    +
  • +
    + + + + DownloadRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class DownloadRequest : Request
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Request + +
    +
    +
    +
    +
    +
    +

    Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback +handling.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Request
    +
    extension Request: Equatable
    +
    extension Request: Hashable
    +
    extension Request: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CompositeEventMonitor + +
    +
    +
    +
    +
    +
    +

    An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class CompositeEventMonitor : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ClosureEventMonitor + +
    +
    +
    +
    +
    +
    +

    EventMonitor that allows optional closures to be set to receive events.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ClosureEventMonitor : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MultipartFormData + +
    +
    +
    +
    +
    +
    +

    Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode +multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.

    + +

    For more information on multipart/form-data in general, please refer to the RFC-2388 and RFC-2045 specs as well +and the w3 form documentation.

    + + + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class MultipartFormData
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and +WiFi network interfaces.

    + +

    Reachability can be used to determine background information about why a network operation failed, or to retry +network requests when a connection is established. It should not be used to prevent a user from initiating a network +request, as it’s possible that an initial request may be required to establish reachability.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class NetworkReachabilityManager
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    EventMonitor that provides Alamofire’s notifications.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class AlamofireNotifications : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + JSONParameterEncoder + +
    +
    +
    +
    +
    +
    +

    A ParameterEncoder that encodes types as JSON body data.

    + +

    If no Content-Type header is already set on the provided URLRequests, it’s set to application/json.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class JSONParameterEncoder : ParameterEncoder
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +on the Destination set.

    + +

    If no Content-Type header is already set on the provided URLRequests, it will be set to +application/x-www-form-urlencoded; charset=utf-8.

    + +

    Encoding behavior can be customized by passing an instance of URLEncodedFormEncoder to the initializer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class URLEncodedFormParameterEncoder : ParameterEncoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+
    +
  • +
    + + + + UploadRequest + +
    +
    +
    +
    +
    +
    +

    DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class UploadRequest : DataRequest
    + +
    +
    +
    +
    +
  • +
+
+
+ +
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a +request returning nil or no data is considered an error. However, if the request has an HTTPMethod or the +response has an HTTP status code valid for empty responses, then an empty Data value is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DataResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no +data is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code +valid for empty responses, then an empty String is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class StringResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning +nil or no data is considered an error. However, if the request has an HTTPMethod or the response has an +HTTP status code valid for empty responses, then an NSNull value is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "JSONResponseSerializer deprecated and will be removed in Alamofire 6. Use DecodableResponseSerializer instead.")
    +public final class JSONResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data as a generic value using any type that conforms to +DataDecoder. By default, this is an instance of JSONDecoder. Additionally, a request returning nil or no data +is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code valid +for empty responses then an empty value will be returned. If the decoded type conforms to EmptyResponse, the +type’s emptyValue() will be returned. If the decoded type is Empty, the .value instance is returned. If the +decoded type does not conform to EmptyResponse and isn’t Empty, an error will be produced.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DecodableResponseSerializer<T> : ResponseSerializer where T : Decodable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryPolicy + +
    +
    +
    +
    +
    +
    +

    A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +as well as certain types of networking errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class RetryPolicy : RequestInterceptor
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A retry policy that automatically retries idempotent requests for network connection lost errors. For more +information about retrying network connection lost errors, please refer to Apple’s +technical document.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ConnectionLostRetryPolicy : RetryPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ServerTrustManager + +
    +
    +
    +
    +
    +
    +

    Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ServerTrustManager
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Server Trust Evaluators +

+
+
+
    +
  • +
    + + + + DefaultTrustEvaluator + +
    +
    +
    +
    +
    +
    +

    An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +host provided by the challenge. Applications are encouraged to always validate the host in production environments +to guarantee the validity of the server’s certificate chain.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DefaultTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +environments to guarantee the validity of the server’s certificate chain.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class RevocationTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +certificates match one of the server certificates. By validating both the certificate chain and host, certificate +pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class PinnedCertificatesTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +public keys match one of the server certificate public keys. By validating both the certificate chain and host, +public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class PublicKeysTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +evaluators consider it valid.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class CompositeTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Disables all evaluation which in turn will always consider any server trust as valid.

    +
    +

    Note

    + Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
    + +

    THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DisabledTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Session + +
    +
    +
    +
    +
    +
    +

    Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common +functionality for all Requests, including queuing, interception, trust management, redirect handling, and response +cache handling.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class Session
    +
    extension Session: RequestDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SessionDelegate + +
    +
    +
    +
    +
    +
    +

    Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class SessionDelegate : NSObject
    +
    extension SessionDelegate: URLSessionDelegate
    +
    extension SessionDelegate: URLSessionTaskDelegate
    +
    extension SessionDelegate: URLSessionDataDelegate
    +
    extension SessionDelegate: URLSessionDownloadDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + URLEncodedFormEncoder + +
    +
    +
    +
    +
    +
    +

    An object that encodes instances into URL-encoded query strings.

    + +

    ArrayEncoding can be used to configure how Array values are encoded. By default, the .brackets encoding is +used, encoding array values with brackets for each value. e.g array[]=1&array[]=2.

    + +

    BoolEncoding can be used to configure how Bool values are encoded. By default, the .numeric encoding is used, +encoding true as 1 and false as 0.

    + +

    DataEncoding can be used to configure how Data values are encoded. By default, the .deferredToData encoding is +used, which encodes Data values using their default Encodable implementation.

    + +

    DateEncoding can be used to configure how Date values are encoded. By default, the .deferredToDate +encoding is used, which encodes Dates using their default Encodable implementation.

    + +

    KeyEncoding can be used to configure how keys are encoded. By default, the .useDefaultKeys encoding is used, +which encodes the keys directly from the Encodable implementation.

    + +

    KeyPathEncoding can be used to configure how paths within nested objects are encoded. By default, the .brackets +encoding is used, which encodes each sub-key in brackets. e.g. parent[child][grandchild]=value.

    + +

    NilEncoding can be used to configure how nil Optional values are encoded. By default, the .dropKey encoding +is used, which drops nil key / value pairs from the output entirely.

    + +

    SpaceEncoding can be used to configure how spaces are encoded. By default, the .percentEscaped encoding is used, +replacing spaces with %20.

    + +

    This type is largely based on Vapor’s url-encoded-form project.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class URLEncodedFormEncoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Adapter.html b/Carthage/Checkouts/Alamofire/docs/Classes/Adapter.html new file mode 100644 index 00000000..0f92ff22 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Adapter.html @@ -0,0 +1,677 @@ + + + + Adapter Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Adapter

+
+
+ +
open class Adapter : RequestInterceptor
+ +
+
+

Closure-based RequestAdapter.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ adaptHandler: @escaping AdaptHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + adaptHandler + + +
    +

    AdaptHandler closure to be executed when handling request adaptation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/AlamofireNotifications.html b/Carthage/Checkouts/Alamofire/docs/Classes/AlamofireNotifications.html new file mode 100644 index 00000000..54927424 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/AlamofireNotifications.html @@ -0,0 +1,787 @@ + + + + AlamofireNotifications Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireNotifications

+
+
+ +
public final class AlamofireNotifications : EventMonitor
+ +
+
+

EventMonitor that provides Alamofire’s notifications.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requestDidResume(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidResume(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidSuspend(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidSuspend(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidCancel(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidCancel(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidFinish(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidFinish(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didResumeTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didSuspendTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didCancelTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor.html b/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor.html new file mode 100644 index 00000000..a91b3c62 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor.html @@ -0,0 +1,866 @@ + + + + AuthenticationInterceptor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationInterceptor

+
+
+ +
public class AuthenticationInterceptor<AuthenticatorType> : RequestInterceptor where AuthenticatorType : Authenticator
+ +
+
+

The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests. +It relies on an Authenticator type to handle the actual URLRequest authentication and Credential refresh.

+ +
+
+ +
+
+
+
+ + +
+ +

Typealiases +

+
+
+
    +
  • +
    + + + + Credential + +
    +
    +
    +
    +
    +
    +

    Type of credential used to authenticate requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Credential = AuthenticatorType.Credential
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + RefreshWindow + +
    +
    +
    +
    +
    +
    +

    Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a +refresh, the AuthenticationInterceptor compares the timestamp history of previous refresh calls against the +RefreshWindow. If more refreshes have occurred within the refresh window than allowed, the refresh is +cancelled and an AuthorizationError.excessiveRefresh error is thrown.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct RefreshWindow
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + credential + +
    +
    +
    +
    +
    +
    +

    The Credential used to authenticate requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var credential: Credential? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an AuthenticationInterceptor instance from the specified parameters.

    + +

    A nil RefreshWindow will result in the AuthenticationInterceptor not checking for excessive refresh calls. +It is recommended to always use a RefreshWindow to avoid endless refresh cycles.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(authenticator: AuthenticatorType,
    +            credential: Credential? = nil,
    +            refreshWindow: RefreshWindow? = RefreshWindow())
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + authenticator + + +
    +

    The Authenticator type.

    +
    +
    + + credential + + +
    +

    The Credential if it exists. nil by default.

    +
    +
    + + refreshWindow + + +
    +

    The RefreshWindow used to identify excessive refresh calls. RefreshWindow() by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Adapt +

+
+
+
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Retry +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor/RefreshWindow.html b/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor/RefreshWindow.html new file mode 100644 index 00000000..fe70900c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/AuthenticationInterceptor/RefreshWindow.html @@ -0,0 +1,697 @@ + + + + RefreshWindow Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RefreshWindow

+
+
+ +
public struct RefreshWindow
+ +
+
+

Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a +refresh, the AuthenticationInterceptor compares the timestamp history of previous refresh calls against the +RefreshWindow. If more refreshes have occurred within the refresh window than allowed, the refresh is +cancelled and an AuthorizationError.excessiveRefresh error is thrown.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + interval + +
    +
    +
    +
    +
    +
    +

    TimeInterval defining the duration of the time window before the current time in which the number of +refresh attempts is compared against maximumAttempts. For example, if interval is 30 seconds, then the +RefreshWindow represents the past 30 seconds. If more attempts occurred in the past 30 seconds than +maximumAttempts, an .excessiveRefresh error will be thrown.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maximumAttempts + +
    +
    +
    +
    +
    +
    +

    Total refresh attempts allowed within interval before throwing an .excessiveRefresh error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let maximumAttempts: Int
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RefreshWindow instance from the specified interval and maximumAttempts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(interval: TimeInterval = 30.0, maximumAttempts: Int = 5)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + interval + + +
    +

    TimeInterval defining the duration of the time window before the current time.

    +
    +
    + + maximumAttempts + + +
    +

    The maximum attempts allowed within the TimeInterval.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/ClosureEventMonitor.html b/Carthage/Checkouts/Alamofire/docs/Classes/ClosureEventMonitor.html new file mode 100644 index 00000000..a797fbe6 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/ClosureEventMonitor.html @@ -0,0 +1,2860 @@ + + + + ClosureEventMonitor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ClosureEventMonitor

+
+
+ +
open class ClosureEventMonitor : EventMonitor
+ +
+
+

EventMonitor that allows optional closures to be set to receive events.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Request Events +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/CompositeEventMonitor.html b/Carthage/Checkouts/Alamofire/docs/Classes/CompositeEventMonitor.html new file mode 100644 index 00000000..394af3fe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/CompositeEventMonitor.html @@ -0,0 +1,1780 @@ + + + + CompositeEventMonitor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CompositeEventMonitor

+
+
+ +
public final class CompositeEventMonitor : EventMonitor
+ +
+
+

An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/CompositeTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/CompositeTrustEvaluator.html new file mode 100644 index 00000000..c7d1d75b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/CompositeTrustEvaluator.html @@ -0,0 +1,652 @@ + + + + CompositeTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CompositeTrustEvaluator

+
+
+ +
public final class CompositeTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +evaluators consider it valid.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(evaluators:) + +
    +
    +
    +
    +
    +
    +

    Creates a CompositeTrustEvaluator from the provided evaluators.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(evaluators: [ServerTrustEvaluating])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + evaluators + + +
    +

    The ServerTrustEvaluating values used to evaluate the server trust.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/ConnectionLostRetryPolicy.html b/Carthage/Checkouts/Alamofire/docs/Classes/ConnectionLostRetryPolicy.html new file mode 100644 index 00000000..1ad65600 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/ConnectionLostRetryPolicy.html @@ -0,0 +1,670 @@ + + + + ConnectionLostRetryPolicy Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionLostRetryPolicy

+
+
+ +
open class ConnectionLostRetryPolicy : RetryPolicy
+ +
+
+

A retry policy that automatically retries idempotent requests for network connection lost errors. For more +information about retrying network connection lost errors, please refer to Apple’s +technical document.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataRequest.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataRequest.html new file mode 100644 index 00000000..213a312f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataRequest.html @@ -0,0 +1,2857 @@ + + + + DataRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataRequest

+
+
+ +
public class DataRequest : Request
+ +
+
+

Request subclass which handles in-memory Data download using URLSessionDataTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + convertible + +
    +
    +
    +
    +
    +
    +

    URLRequestConvertible value used to create URLRequests for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let convertible: URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    Data read from the server so far.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var data: Data? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the request, using the specified closure.

    +
    +

    Note

    +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure used to validate the response.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion +handler to return a ResponseDisposition value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    on queue: DispatchQueue = .main,
    +    perform handler: @escaping (_ response: HTTPURLResponse,
    +                                _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse. The completionHandler provided + MUST be called, otherwise the request will never complete.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(on queue: DispatchQueue = .main,
    +                           perform handler: @escaping (HTTPURLResponse) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+ +
+
+
+ + +
+ +

DataTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func httpResponses(bufferingPolicy: StreamOf<HTTPURLResponse>.BufferingPolicy = .unbounded) -> StreamOf<HTTPURLResponse>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<HTTPURLResponse>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure returning a Request.ResponseDisposition, called whenever the DataRequest produces an +HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> ResponseDisposition
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received and returning a + ResponseDisposition value. This value determines whether to continue the request or cancel it as + if cancel() had been called on the instance. Note, this closure is called on an arbitrary thread, + so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure called whenever the DataRequest produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received. Note, this closure is called on an + arbitrary thread, so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await a Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                            dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DataTask<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before completion.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization of a Decodable value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
    +                                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                   dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
    +                                                   decoder: DataDecoder = JSONDecoder(),
    +                                                   emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
    +                                                   emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DataTask<Value>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization of a String value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                              dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                              encoding: String.Encoding? = nil,
    +                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DataTask<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    String.Encoding to use during serialization. Defaults to nil, in which case + the encoding will be determined from the server response, falling back to the + default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization using the provided ResponseSerializer instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingResponse<Serializer: ResponseSerializer>(using serializer: Serializer,
    +                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DataTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    ResponseSerializer responsible for serializing the request, response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization using the provided DataResponseSerializerProtocol instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingResponse<Serializer: DataResponseSerializerProtocol>(using serializer: Serializer,
    +                                                                            automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DataTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DataResponseSerializerProtocol responsible for serializing the request, + response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Default +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse<Data?>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: DataResponseSerializerProtocol>(queue: DispatchQueue = .main,
    +                                                                 responseSerializer: Serializer,
    +                                                                 completionHandler: @escaping (AFDataResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: ResponseSerializer>(queue: DispatchQueue = .main,
    +                                                     responseSerializer: Serializer,
    +                                                     completionHandler: @escaping (AFDataResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DataResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseData(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,
    +                         completionHandler: @escaping (AFDataResponse<Data>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a StringResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseString(queue: DispatchQueue = .main,
    +                           dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                           encoding: String.Encoding? = nil,
    +                           emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                           emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,
    +                           completionHandler: @escaping (AFDataResponse<String>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    The string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a JSONResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.")
    +@discardableResult
    +public func responseJSON(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +                         options: JSONSerialization.ReadingOptions = .allowFragments,
    +                         completionHandler: @escaping (AFDataResponse<Any>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + options + + +
    +

    JSONSerialization.ReadingOptions used when parsing the response. .allowFragments + by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                            queue: DispatchQueue = .main,
    +                                            dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
    +                                            decoder: DataDecoder = JSONDecoder(),
    +                                            emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
    +                                            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,
    +                                            completionHandler: @escaping (AFDataResponse<T>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the +request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataResponseSerializer.html new file mode 100644 index 00000000..b7e005b2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataResponseSerializer.html @@ -0,0 +1,757 @@ + + + + DataResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponseSerializer

+
+
+ +
public final class DataResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a +request returning nil or no data is considered an error. However, if the request has an HTTPMethod or the +response has an HTTP status code valid for empty responses, then an empty Data value is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataResponseSerializer using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest.html new file mode 100644 index 00000000..ac300a22 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest.html @@ -0,0 +1,1998 @@ + + + + DataStreamRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamRequest

+
+
+ +
public final class DataStreamRequest : Request
+ +
+
+

Request subclass which streams HTTP response Data through a Handler closure.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Handler + +
    +
    +
    +
    +
    +
    +

    Closure type handling DataStreamRequest.Stream values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Handler<Success, Failure> = (Stream<Success, Failure>) throws -> Void where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Stream + +
    +
    +
    +
    +
    +
    +

    Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used +to stop the stream at any time.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Stream<Success, Failure> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Event + +
    +
    +
    +
    +
    +
    +

    Type representing an event flowing through the stream. Contains either the Result of processing streamed +Data or the completion of the stream.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Event<Success, Failure> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Completion + +
    +
    +
    +
    +
    +
    +

    Value containing the state of a DataStreamRequest when the stream was completed.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Completion
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CancellationToken + +
    +
    +
    +
    +
    +
    +

    Type used to cancel an ongoing stream.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct CancellationToken
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertible + +
    +
    +
    +
    +
    +
    +

    URLRequestConvertible value used to create URLRequests for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let convertible: URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether or not the instance will be cancelled if stream parsing encounters an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let automaticallyCancelOnStreamError: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the URLRequest and HTTPURLResponse received for the instance using the provided Validation closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure used to validate the request and response.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Produces an InputStream that receives the Data received by the instance.

    +
    +

    Note

    +

    The InputStream produced by this method must have open() called before being able to read Data. + Additionally, this method will automatically call resume() on the instance, regardless of whether or + not the creating session has startRequestsImmediately set to true.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asInputStream(bufferSize: Int = 1024) -> InputStream?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferSize + + +
    +

    Size, in bytes, of the buffer between the OutputStream and InputStream.

    +
    +
    +
    +
    +

    Return Value

    +

    The InputStream bound to the internal OutboundStream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion +handler to return a ResponseDisposition value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    on queue: DispatchQueue = .main,
    +    perform handler: @escaping (_ response: HTTPURLResponse,
    +                                _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse. The completionHandler provided + MUST be called, otherwise the request will never complete.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(on queue: DispatchQueue = .main,
    +                           perform handler: @escaping (HTTPURLResponse) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance using the given DataStreamSerializer and DispatchQueue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishStream<Serializer: DataStreamSerializer>(using serializer: Serializer,
    +                                                            on queue: DispatchQueue = .main) -> DataStreamPublisher<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer used to serialize the streamed Data.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • +
    + + + + publishData(queue:) + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a PassthroughStreamSerializer to stream Data +unserialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishData(queue: DispatchQueue = .main) -> DataStreamPublisher<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • +
    + + + + publishString(queue:) + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a StringStreamSerializer to serialize stream +Data values into String values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishString(queue: DispatchQueue = .main) -> DataStreamPublisher<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a DecodableStreamSerializer with the provided +parameters to serialize stream Data values into the provided type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishDecodable<T: Decodable>(type: T.Type = T.self,
    +                                           queue: DispatchQueue = .main,
    +                                           decoder: DataDecoder = JSONDecoder(),
    +                                           preprocessor: DataPreprocessor = PassthroughPreprocessor()) -> DataStreamPublisher<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to which to decode stream Data. Inferred from the context by default.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder instance used to decode stream Data. JSONDecoder() by default.

    +
    +
    + + preprocessor + + +
    +

    DataPreprocessor which filters incoming stream Data before serialization. + PassthroughPreprocessor() by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func httpResponses(bufferingPolicy: StreamOf<HTTPURLResponse>.BufferingPolicy = .unbounded) -> StreamOf<HTTPURLResponse>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<HTTPURLResponse>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure returning a Request.ResponseDisposition, called whenever the DataStreamRequest +produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> ResponseDisposition) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received and returning a + ResponseDisposition value. This value determines whether to continue the request or cancel it as + if cancel() had been called on the instance. Note, this closure is called on an arbitrary thread, + so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure called whenever the DataStreamRequest produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received. Note, this closure is called on an + arbitrary thread, so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + streamTask() + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamTask used to await streams of serialized values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamTask() -> DataStreamTask
    + +
    +
    +
    +

    Return Value

    +

    The DataStreamTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which performs no parsing on incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStream(on queue: DispatchQueue = .main, stream: @escaping Handler<Data, Never>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which uses the provided DataStreamSerializer to process incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStream<Serializer: DataStreamSerializer>(using serializer: Serializer,
    +                                                             on queue: DispatchQueue = .main,
    +                                                             stream: @escaping Handler<Serializer.SerializedObject, AFError>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer used to process incoming Data. Its work is done on the serializationQueue.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which parses incoming Data as a UTF8 String.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStreamString(on queue: DispatchQueue = .main,
    +                                 stream: @escaping Handler<String, Never>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which parses incoming Data using the provided DataDecoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStreamDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                                  on queue: DispatchQueue = .main,
    +                                                  using decoder: DataDecoder = JSONDecoder(),
    +                                                  preprocessor: DataPreprocessor = PassthroughPreprocessor(),
    +                                                  stream: @escaping Handler<T, AFError>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to parse incoming Data into.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + decoder + + +
    +

    DataDecoder used to decode the incoming Data.

    +
    +
    + + preprocessor + + +
    +

    DataPreprocessor used to process the incoming Data before it’s passed to the decoder.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URLRequest and HTTPURLResponse and returns whether the +request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/CancellationToken.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/CancellationToken.html new file mode 100644 index 00000000..62d5def2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/CancellationToken.html @@ -0,0 +1,606 @@ + + + + CancellationToken Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CancellationToken

+
+
+ +
public struct CancellationToken
+ +
+
+

Type used to cancel an ongoing stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the ongoing stream by canceling the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Completion.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Completion.html new file mode 100644 index 00000000..c6086764 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Completion.html @@ -0,0 +1,687 @@ + + + + Completion Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Completion

+
+
+ +
public struct Completion
+ +
+
+

Value containing the state of a DataStreamRequest when the stream was completed.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    Last URLRequest issued by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    Last HTTPURLResponse received by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTaskMetrics produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    AFError produced for the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let error: AFError?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Event.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Event.html new file mode 100644 index 00000000..ae471c98 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Event.html @@ -0,0 +1,636 @@ + + + + Event Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Event

+
+
+ +
public enum Event<Success, Failure> where Failure : Error
+ +
+
+

Type representing an event flowing through the stream. Contains either the Result of processing streamed +Data or the completion of the stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + stream(_:) + +
    +
    +
    +
    +
    +
    +

    Output produced every time the instance receives additional Data. The associated value contains the +Result of processing the incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stream(Result<Success, Failure>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + complete(_:) + +
    +
    +
    +
    +
    +
    +

    Output produced when the instance has completed, whether due to stream end, cancellation, or an error. +Associated Completion value contains the final state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case complete(Completion)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Stream.html b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Stream.html new file mode 100644 index 00000000..70f33d5e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DataStreamRequest/Stream.html @@ -0,0 +1,782 @@ + + + + Stream Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Stream

+
+
+ +
public struct Stream<Success, Failure> where Failure : Error
+ +
+
+

Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used +to stop the stream at any time.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + event + +
    +
    +
    +
    +
    +
    +

    Latest Event from the stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let event: Event<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + token + +
    +
    +
    +
    +
    +
    +

    Token used to cancel the stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let token: CancellationToken
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the ongoing stream by canceling the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    Incoming Result values from Event.stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Success, Failure>? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Success value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Failure value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + completion + +
    +
    +
    +
    +
    +
    +

    Completion value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var completion: DataStreamRequest.Completion? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DecodableResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Classes/DecodableResponseSerializer.html new file mode 100644 index 00000000..ba675d72 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DecodableResponseSerializer.html @@ -0,0 +1,800 @@ + + + + DecodableResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DecodableResponseSerializer

+
+
+ +
public final class DecodableResponseSerializer<T> : ResponseSerializer where T : Decodable
+ +
+
+

A ResponseSerializer that decodes the response data as a generic value using any type that conforms to +DataDecoder. By default, this is an instance of JSONDecoder. Additionally, a request returning nil or no data +is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code valid +for empty responses then an empty value will be returned. If the decoded type conforms to EmptyResponse, the +type’s emptyValue() will be returned. If the decoded type is Empty, the .value instance is returned. If the +decoded type does not conform to EmptyResponse and isn’t Empty, an error will be produced.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + decoder + +
    +
    +
    +
    +
    +
    +

    The DataDecoder instance used to decode responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let decoder: DataDecoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the values provided.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor,
    +            decoder: DataDecoder = JSONDecoder(),
    +            emptyResponseCodes: Set<Int> = DecodableResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + decoder + + +
    +

    The DataDecoder. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> T
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DefaultTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/DefaultTrustEvaluator.html new file mode 100644 index 00000000..70d716e1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DefaultTrustEvaluator.html @@ -0,0 +1,653 @@ + + + + DefaultTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DefaultTrustEvaluator

+
+
+ +
public final class DefaultTrustEvaluator : ServerTrustEvaluating
+ +
+
+

An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +host provided by the challenge. Applications are encouraged to always validate the host in production environments +to guarantee the validity of the server’s certificate chain.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(validateHost:) + +
    +
    +
    +
    +
    +
    +

    Creates a DefaultTrustEvaluator.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DisabledEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/DisabledEvaluator.html new file mode 100644 index 00000000..749aa5dc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DisabledEvaluator.html @@ -0,0 +1,553 @@ + + + + DisabledEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (97% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DisabledEvaluator

+
+
+
public final class DisabledEvaluator : ServerTrustEvaluating
+ +
+
+

Disables all evaluation which in turn will always consider any server trust as valid.

+ +

THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DisabledTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/DisabledTrustEvaluator.html new file mode 100644 index 00000000..faa25bb1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DisabledTrustEvaluator.html @@ -0,0 +1,640 @@ + + + + DisabledTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DisabledTrustEvaluator

+
+
+ +
public final class DisabledTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Disables all evaluation which in turn will always consider any server trust as valid.

+
+

Note

+ Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
+ +

THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest.html b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest.html new file mode 100644 index 00000000..654da371 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest.html @@ -0,0 +1,3278 @@ + + + + DownloadRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadRequest

+
+
+ +
public class DownloadRequest : Request
+ +
+
+

Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination +URL.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSet
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Destination +

+
+
+
    +
  • +
    + + + + Destination + +
    +
    +
    +
    +
    +
    +

    A closure executed once a DownloadRequest has successfully completed in order to determine where to move the +temporary file written to during the download process. The closure takes two arguments: the temporary file URL +and the HTTPURLResponse, and returns two values: the file URL where the temporary file should be moved and +the options defining how the file should be moved.

    +
    +

    Note

    + Downloads from a local file:// URLs do not use the Destination closure, as those downloads do not + return an HTTPURLResponse. Instead the file is merely moved within the temporary directory. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Destination = (_ temporaryURL: URL,
    +                                _ response: HTTPURLResponse) -> (destinationURL: URL, options: Options)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a download file destination closure which uses the default file manager to move the temporary file to a +file URL in the first available directory with the specified search path directory and search path domain mask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func suggestedDownloadDestination(for directory: FileManager.SearchPathDirectory = .documentDirectory,
    +                                               in domain: FileManager.SearchPathDomainMask = .userDomainMask,
    +                                               options: Options = []) -> Destination
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + directory + + +
    +

    The search path directory. .documentDirectory by default.

    +
    +
    + + domain + + +
    +

    The search path domain mask. .userDomainMask by default.

    +
    +
    + + options + + +
    +

    DownloadRequest.Options used when moving the downloaded file to its destination. None by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Destination closure.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Downloadable +

+
+
+
    +
  • +
    + + + + Downloadable + +
    +
    +
    +
    +
    +
    +

    Type describing the source used to create the underlying URLSessionDownloadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Downloadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + resumeData + +
    +
    +
    +
    +
    +
    +

    If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download +using the download(resumingWith data:) API.

    +
    +

    Note

    + For more information about resumeData, see Apple’s documentation. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var resumeData: Data? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileURL + +
    +
    +
    +
    +
    +
    +

    If the download is successful, the URL where the file was downloaded.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var fileURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + downloadable + +
    +
    +
    +
    +
    +
    +

    Downloadable value used for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let downloadable: Downloadable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a URLSessionTask from the provided resume data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func task(forResumeData data: Data, using session: URLSession) -> URLSessionTask
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + data + + +
    +

    Data used to resume the download.

    +
    +
    + + session + + +
    +

    URLSession used to create the URLSessionTask.

    +
    +
    +
    +
    +

    Return Value

    +

    The URLSessionTask created.

    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancels the instance. Once cancelled, a DownloadRequest can no longer be resumed or suspended.

    +
    +

    Note

    +

    This method will NOT produce resume data. If you wish to cancel and produce resume data, use + cancel(producingResumeData:) or cancel(byProducingResumeData:).

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +override public func cancel() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancels the instance, optionally producing resume data. Once cancelled, a DownloadRequest can no longer be +resumed or suspended.

    +
    +

    Note

    +

    If producingResumeData is true, the resumeData property will be populated with any resume data, if + available.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel(producingResumeData shouldProduceResumeData: Bool) -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancels the instance while producing resume data. Once cancelled, a DownloadRequest can no longer be resumed +or suspended.

    +
    +

    Note

    +

    The resume data passed to the completion handler will also be available on the instance’s resumeData + property.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completionHandler + + +
    +

    The completion handler that is called when the download has been successfully + cancelled. It is not guaranteed to be called on a particular queue, so you may + want use an appropriate queue to perform your work.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the request, using the specified closure.

    +
    +

    Note

    +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure to validate the response.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+ +
+
+
+ + +
+ +

DownloadTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await a Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                            dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before completion.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of a Decodable value.

    +
    +

    Note

    +

    This serializer reads the entire response into memory before parsing.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
    +                                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                   dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
    +                                                   decoder: DataDecoder = JSONDecoder(),
    +                                                   emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
    +                                                   emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DownloadTask<Value>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of the downloaded file’s URL on disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownloadedFileURL(automaticallyCancelling shouldAutomaticallyCancel: Bool = true) -> DownloadTask<URL>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of a String value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                              dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                              encoding: String.Encoding? = nil,
    +                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + serializer. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    String.Encoding to use during serialization. Defaults to nil, in which case + the encoding will be determined from the server response, falling back to the + default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization using the provided ResponseSerializer instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownload<Serializer: ResponseSerializer>(using serializer: Serializer,
    +                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DownloadTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    ResponseSerializer responsible for serializing the request, response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization using the provided DownloadResponseSerializerProtocol +instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownload<Serializer: DownloadResponseSerializerProtocol>(using serializer: Serializer,
    +                                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DownloadTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DownloadResponseSerializerProtocol responsible for serializing the request, + response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Default +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response(queue: DispatchQueue = .main,
    +                     completionHandler: @escaping (AFDownloadResponse<URL?>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: DownloadResponseSerializerProtocol>(queue: DispatchQueue = .main,
    +                                                                     responseSerializer: Serializer,
    +                                                                     completionHandler: @escaping (AFDownloadResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data + contained in the destination URL.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: ResponseSerializer>(queue: DispatchQueue = .main,
    +                                                     responseSerializer: Serializer,
    +                                                     completionHandler: @escaping (AFDownloadResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data + contained in the destination URL.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URL +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a URLResponseSerializer to be called once the request is finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseURL(queue: DispatchQueue = .main,
    +                        completionHandler: @escaping (AFDownloadResponse<URL>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DataResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseData(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,
    +                         completionHandler: @escaping (AFDownloadResponse<Data>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a StringResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseString(queue: DispatchQueue = .main,
    +                           dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                           encoding: String.Encoding? = nil,
    +                           emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                           emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,
    +                           completionHandler: @escaping (AFDownloadResponse<String>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    The string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a JSONResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.")
    +@discardableResult
    +public func responseJSON(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +                         options: JSONSerialization.ReadingOptions = .allowFragments,
    +                         completionHandler: @escaping (AFDownloadResponse<Any>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + options + + +
    +

    JSONSerialization.ReadingOptions used when parsing the response. .allowFragments + by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                            queue: DispatchQueue = .main,
    +                                            dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
    +                                            decoder: DataDecoder = JSONDecoder(),
    +                                            emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
    +                                            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,
    +                                            completionHandler: @escaping (AFDownloadResponse<T>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a +destination URL, and returns whether the request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (_ request: URLRequest?,
    +                               _ response: HTTPURLResponse,
    +                               _ fileURL: URL?)
    +    -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Downloadable.html b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Downloadable.html new file mode 100644 index 00000000..1289a0bc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Downloadable.html @@ -0,0 +1,633 @@ + + + + Downloadable Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Downloadable

+
+
+ +
public enum Downloadable
+ +
+
+

Type describing the source used to create the underlying URLSessionDownloadTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request(_:) + +
    +
    +
    +
    +
    +
    +

    Download should be started from the URLRequest produced by the associated URLRequestConvertible value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case request(URLRequestConvertible)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumeData(_:) + +
    +
    +
    +
    +
    +
    +

    Download should be started from the associated resume Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case resumeData(Data)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Options.html b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Options.html new file mode 100644 index 00000000..34037e39 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/DownloadRequest/Options.html @@ -0,0 +1,686 @@ + + + + Options Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Options

+
+
+ +
public struct Options : OptionSet
+ +
+
+

A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination +URL.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Specifies that intermediate directories for the destination URL should be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let createIntermediateDirectories: DownloadRequest.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removePreviousFile + +
    +
    +
    +
    +
    +
    +

    Specifies that any previous file at the destination URL should be removed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let removePreviousFile: DownloadRequest.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: Int)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Interceptor.html b/Carthage/Checkouts/Alamofire/docs/Classes/Interceptor.html new file mode 100644 index 00000000..0baca0be --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Interceptor.html @@ -0,0 +1,900 @@ + + + + Interceptor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Interceptor

+
+
+ +
open class Interceptor : RequestInterceptor
+ +
+
+

RequestInterceptor which can use multiple RequestAdapter and RequestRetrier values.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/JSONParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/Classes/JSONParameterEncoder.html new file mode 100644 index 00000000..f4a00537 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/JSONParameterEncoder.html @@ -0,0 +1,763 @@ + + + + JSONParameterEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONParameterEncoder

+
+
+ +
open class JSONParameterEncoder : ParameterEncoder
+ +
+
+

A ParameterEncoder that encodes types as JSON body data.

+ +

If no Content-Type header is already set on the provided URLRequests, it’s set to application/json.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with default parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prettyPrinted + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with JSONEncoder.outputFormatting set to .prettyPrinted.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var prettyPrinted: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sortedKeys + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with JSONEncoder.outputFormatting set to .sortedKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
    +public static var sortedKeys: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoder + +
    +
    +
    +
    +
    +
    +

    JSONEncoder used to encode parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let encoder: JSONEncoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoder:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the provided JSONEncoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoder: JSONEncoder = JSONEncoder())
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoder + + +
    +

    The JSONEncoder. JSONEncoder() by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func encode<Parameters: Encodable>(_ parameters: Parameters?,
    +                                        into request: URLRequest) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/JSONResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Classes/JSONResponseSerializer.html new file mode 100644 index 00000000..03bfeee8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/JSONResponseSerializer.html @@ -0,0 +1,798 @@ + + + + JSONResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONResponseSerializer

+
+
+ +
@available(*, deprecated, message: "JSONResponseSerializer deprecated and will be removed in Alamofire 6. Use DecodableResponseSerializer instead.")
+public final class JSONResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning +nil or no data is considered an error. However, if the request has an HTTPMethod or the response has an +HTTP status code valid for empty responses, then an NSNull value is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    JSONSerialization.ReadingOptions used when serializing a response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let options: JSONSerialization.ReadingOptions
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +            emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +            options: JSONSerialization.ReadingOptions = .allowFragments)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    + + options + + +
    +

    The options to use. .allowFragments by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/MultipartFormData.html b/Carthage/Checkouts/Alamofire/docs/Classes/MultipartFormData.html new file mode 100644 index 00000000..033740fc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/MultipartFormData.html @@ -0,0 +1,1340 @@ + + + + MultipartFormData Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartFormData

+
+
+ +
open class MultipartFormData
+ +
+
+

Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode +multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.

+ +

For more information on multipart/form-data in general, please refer to the RFC-2388 and RFC-2045 specs as well +and the w3 form documentation.

+ + + +
+
+ +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Default memory threshold used when encoding MultipartFormData, in bytes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let encodingMemoryThreshold: UInt64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contentType + +
    +
    +
    +
    +
    +
    +

    The Content-Type header value containing the boundary used to generate the multipart/form-data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open lazy var contentType: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contentLength + +
    +
    +
    +
    +
    +
    +

    The content length of all body parts used to generate the multipart/form-data not including the boundaries.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var contentLength: UInt64 { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boundary + +
    +
    +
    +
    +
    +
    +

    The boundary used to separate the body parts in the encoded form data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boundary: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Lifecycle +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fileManager: FileManager = .default, boundary: String? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fileManager + + +
    +

    FileManager to use for file operations, if needed.

    +
    +
    + + boundary + + +
    +

    Boundary String used to separate body parts.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Body Parts +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the data and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ data: Data, withName name: String, fileName: String? = nil, mimeType: String? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + data + + +
    +

    Data to encoding into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the Data in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the Data in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the data in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + append(_:withName:) + +
    +
    +
    +
    +
    +
    +

    Creates a body part from the file and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{generated filename} (HTTP Header)
    • +
    • Content-Type: #{generated mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary
    • +
    + +

    The filename in the Content-Disposition HTTP header is generated from the last path component of the +fileURL. The Content-Type HTTP header MIME type is generated by mapping the fileURL extension to the +system associated MIME type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ fileURL: URL, withName name: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fileURL + + +
    +

    URL of the file whose content will be encoded into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the file and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + fileURL + + +
    +

    URL of the file whose content will be encoded into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the file content in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the stream and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded stream data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ stream: InputStream,
    +                   withLength length: UInt64,
    +                   name: String,
    +                   fileName: String,
    +                   mimeType: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + stream + + +
    +

    InputStream to encode into the instance.

    +
    +
    + + length + + +
    +

    Length, in bytes, of the stream.

    +
    +
    + + name + + +
    +

    Name to associate with the stream content in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the stream content in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the stream content in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part with the stream, length, and headers and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • HTTP headers
    • +
    • Encoded stream data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + stream + + +
    +

    InputStream to encode into the instance.

    +
    +
    + + length + + +
    +

    Length, in bytes, of the stream.

    +
    +
    + + headers + + +
    +

    HTTPHeaders for the body part.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data Encoding +

+
+
+
    +
  • +
    + + + + encode() + +
    +
    +
    +
    +
    +
    +

    Encodes all appended body parts into a single Data value.

    +
    +

    Note

    +

    This method will load all the appended body parts into memory all at the same time. This method should + only be used when the encoded data will have a small memory footprint. For large data cases, please use + the writeEncodedData(to:)) method.

    + +
    +

    Throws

    +

    An AFError if encoding encounters an error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode() throws -> Data
    + +
    +
    +
    +

    Return Value

    +

    The encoded Data, if encoding is successful.

    +
    +
    +
    +
  • +
  • +
    + + + + writeEncodedData(to:) + +
    +
    +
    +
    +
    +
    +

    Writes all appended body parts to the given file URL.

    + +

    This process is facilitated by reading and writing with input and output streams, respectively. Thus, +this approach is very memory efficient and should be used for large body part data.

    +
    +

    Throws

    + An AFError if encoding encounters an error. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func writeEncodedData(to fileURL: URL) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fileURL + + +
    +

    File URL to which to write the form data.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/MultipartUpload.html b/Carthage/Checkouts/Alamofire/docs/Classes/MultipartUpload.html new file mode 100644 index 00000000..3af213d3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/MultipartUpload.html @@ -0,0 +1,525 @@ + + + + MultipartUpload Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartUpload

+
+
+
open class MultipartUpload
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Default memory threshold used when encoding MultipartFormData, in bytes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let encodingMemoryThreshold: UInt64
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + createUploadable() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func createUploadable() throws -> UploadRequest.Uploadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager.html b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager.html new file mode 100644 index 00000000..42e2499f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager.html @@ -0,0 +1,1052 @@ + + + + NetworkReachabilityManager Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NetworkReachabilityManager

+
+
+ +
open class NetworkReachabilityManager
+ +
+
+

The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and +WiFi network interfaces.

+ +

Reachability can be used to determine background information about why a network operation failed, or to retry +network requests when a connection is established. It should not be used to prevent a user from initiating a network +request, as it’s possible that an initial request may be required to establish reachability.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Defines the various states of network reachability.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkReachabilityStatus
    +
    extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Listener + +
    +
    +
    +
    +
    +
    +

    A closure executed when the network reachability status changes. The closure takes a single argument: the +network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Listener = (NetworkReachabilityStatus) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Default NetworkReachabilityManager for the zero address and a listenerQueue of .main.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: NetworkReachabilityManager?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + isReachable + +
    +
    +
    +
    +
    +
    +

    Whether the network is currently reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isReachableOnCellular + +
    +
    +
    +
    +
    +
    +

    Whether the network is currently reachable over the cellular interface.

    +
    +

    Note

    + Using this property to decide whether to make a high or low bandwidth request is not recommended. + Instead, set the allowsCellularAccess on any URLRequests being issued. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachableOnCellular: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether the network is currently reachable over Ethernet or WiFi interface.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachableOnEthernetOrWiFi: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reachabilityQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue on which reachability will update.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let reachabilityQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flags + +
    +
    +
    +
    +
    +
    +

    Flags of the current reachability type, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var flags: SCNetworkReachabilityFlags? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The current network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var status: NetworkReachabilityStatus { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • +
    + + + + init(host:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the specified host.

    +
    +

    Note

    +

    The host value must not contain a scheme, just the hostname.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init?(host: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    Host used to evaluate network reachability. Must not include the scheme (e.g. https).

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance that monitors the address 0.0.0.0.

    + +

    Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing +status of the device, both IPv4 and IPv6.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init?()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Listening +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Starts listening for changes in network reachability status.

    +
    +

    Note

    +

    Stops and removes any existing listener.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +open func startListening(onQueue queue: DispatchQueue = .main,
    +                         onUpdatePerforming listener: @escaping Listener) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to call the listener closure. .main by default.

    +
    +
    + + listener + + +
    +

    Listener closure called when reachability changes.

    +
    +
    +
    +
    +

    Return Value

    +

    true if listening was started successfully, false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + stopListening() + +
    +
    +
    +
    +
    +
    +

    Stops listening for changes in network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func stopListening()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/ConnectionType.html b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/ConnectionType.html new file mode 100644 index 00000000..7c985da3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/ConnectionType.html @@ -0,0 +1,490 @@ + + + + ConnectionType Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionType

+
+
+
public enum ConnectionType
+ +
+
+

Defines the various connection types detected by reachability flags.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ethernetOrWiFi + +
    +
    +
    +
    +
    +
    +

    The connection type is either over Ethernet or WiFi.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case ethernetOrWiFi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wwan + +
    +
    +
    +
    +
    +
    +

    The connection type is a WWAN connection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case wwan
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html new file mode 100644 index 00000000..2847084f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html @@ -0,0 +1,689 @@ + + + + NetworkReachabilityStatus Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NetworkReachabilityStatus

+
+
+ +
public enum NetworkReachabilityStatus
+
extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable
+ +
+
+

Defines the various states of network reachability.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    It is unknown whether the network is reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notReachable + +
    +
    +
    +
    +
    +
    +

    The network is not reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case notReachable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reachable(_:) + +
    +
    +
    +
    +
    +
    +

    The network is reachable on the associated ConnectionType.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case reachable(ConnectionType)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConnectionType + +
    +
    +
    +
    +
    +
    +

    Defines the various connection types detected by reachability flags.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConnectionType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html new file mode 100644 index 00000000..4c53dd59 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html @@ -0,0 +1,633 @@ + + + + ConnectionType Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionType

+
+
+ +
public enum ConnectionType
+ +
+
+

Defines the various connection types detected by reachability flags.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ethernetOrWiFi + +
    +
    +
    +
    +
    +
    +

    The connection type is either over Ethernet or WiFi.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case ethernetOrWiFi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cellular + +
    +
    +
    +
    +
    +
    +

    The connection type is a cellular connection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cellular
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/PinnedCertificatesTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/PinnedCertificatesTrustEvaluator.html new file mode 100644 index 00000000..a65efefc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/PinnedCertificatesTrustEvaluator.html @@ -0,0 +1,700 @@ + + + + PinnedCertificatesTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PinnedCertificatesTrustEvaluator

+
+
+ +
public final class PinnedCertificatesTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +certificates match one of the server certificates. By validating both the certificate chain and host, certificate +pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a PinnedCertificatesTrustEvaluator from the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(certificates: [SecCertificate] = Bundle.main.af.certificates,
    +            acceptSelfSignedCertificates: Bool = false,
    +            performDefaultValidation: Bool = true,
    +            validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + certificates + + +
    +

    The certificates to use to evaluate the trust. All cer, crt, and der + certificates in Bundle.main by default.

    +
    +
    + + acceptSelfSignedCertificates + + +
    +

    Adds the provided certificates as anchors for the trust evaluation, allowing + self-signed certificates to pass. false by default. THIS SETTING SHOULD BE + FALSE IN PRODUCTION!

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/PublicKeysTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/PublicKeysTrustEvaluator.html new file mode 100644 index 00000000..e7d81e03 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/PublicKeysTrustEvaluator.html @@ -0,0 +1,691 @@ + + + + PublicKeysTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PublicKeysTrustEvaluator

+
+
+ +
public final class PublicKeysTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +public keys match one of the server certificate public keys. By validating both the certificate chain and host, +public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a PublicKeysTrustEvaluator from the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(keys: [SecKey] = Bundle.main.af.publicKeys,
    +            performDefaultValidation: Bool = true,
    +            validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    The SecKeys to use to validate public keys. Defaults to the public keys of all + certificates included in the main bundle.

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Request.html b/Carthage/Checkouts/Alamofire/docs/Classes/Request.html new file mode 100644 index 00000000..6a2bf40f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Request.html @@ -0,0 +1,3157 @@ + + + + Request Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Request

+
+
+ +
public class Request
+
extension Request: Equatable
+
extension Request: Hashable
+
extension Request: CustomStringConvertible
+ +
+
+

Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback +handling.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    UUID providing a unique identifier for the Request, used in the Hashable and Equatable conformances.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let id: UUID
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + underlyingQueue + +
    +
    +
    +
    +
    +
    +

    The serial queue for all internal async actions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let underlyingQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationQueue + +
    +
    +
    +
    +
    +
    +

    The queue used for all serialization actions. By default it’s a serial queue that targets underlyingQueue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventMonitor + +
    +
    +
    +
    +
    +
    +

    EventMonitor used for event callbacks.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let eventMonitor: EventMonitor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + interceptor + +
    +
    +
    +
    +
    +
    +

    The Request‘s interceptor.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interceptor: RequestInterceptor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    The Request‘s delegate.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) weak var delegate: RequestDelegate? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    State of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var state: State { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .initialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isResumed + +
    +
    +
    +
    +
    +
    +

    Returns whether state is.resumed`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResumed: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSuspended + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .suspended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuspended: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isCancelled + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .cancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCancelled: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isFinished + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isFinished: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Progress +

+
+
+
    +
  • +
    + + + + ProgressHandler + +
    +
    +
    +
    +
    +
    +

    Closure type executed when monitoring the upload or download progress of a request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ProgressHandler = (Progress) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + uploadProgress + +
    +
    +
    +
    +
    +
    +

    Progress of the upload of the body of the executed URLRequest. Reset to 0 if the Request is retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let uploadProgress: Progress
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + downloadProgress + +
    +
    +
    +
    +
    +
    +

    Progress of the download of any response data. Reset to 0 if the Request is retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let downloadProgress: Progress
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Redirect Handling +

+
+
+ +
+
+
+ + +
+ +

Cached Response Handling +

+
+
+ +
+
+
+ + +
+ +

URLCredential +

+
+
+
    +
  • +
    + + + + credential + +
    +
    +
    +
    +
    +
    +

    URLCredential used for authentication challenges. Created by calling one of the authenticate methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var credential: URLCredential? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLRequests +

+
+
+
    +
  • +
    + + + + requests + +
    +
    +
    +
    +
    +
    +

    All URLRequests created on behalf of the Request, including original and adapted requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var requests: [URLRequest] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstRequest + +
    +
    +
    +
    +
    +
    +

    First URLRequest created on behalf of the Request. May not be the first one actually executed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastRequest + +
    +
    +
    +
    +
    +
    +

    Last URLRequest created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    Current URLRequest created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var request: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + performedRequests + +
    +
    +
    +
    +
    +
    +

    URLRequests from all of the URLSessionTasks executed on behalf of the Request. May be different from +requests due to URLSession manipulation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var performedRequests: [URLRequest] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPURLResponse +

+
+
+
    +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    HTTPURLResponse received from the server, if any. If the Request was retried, this is the response of the +last URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: HTTPURLResponse? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tasks +

+
+
+
    +
  • +
    + + + + tasks + +
    +
    +
    +
    +
    +
    +

    All URLSessionTasks created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var tasks: [URLSessionTask] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstTask + +
    +
    +
    +
    +
    +
    +

    First URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstTask: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastTask + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastTask: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + task + +
    +
    +
    +
    +
    +
    +

    Current URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var task: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Metrics +

+
+
+
    +
  • +
    + + + + allMetrics + +
    +
    +
    +
    +
    +
    +

    All URLSessionTaskMetrics gathered on behalf of the Request. Should correspond to the tasks created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allMetrics: [URLSessionTaskMetrics] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstMetrics + +
    +
    +
    +
    +
    +
    +

    First URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstMetrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastMetrics + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastMetrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    Current URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var metrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Retry Count +

+
+
+
    +
  • +
    + + + + retryCount + +
    +
    +
    +
    +
    +
    +

    Number of times the Request has been retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var retryCount: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Error +

+
+
+
    +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Error returned from Alamofire internally, from the network request directly, or any validators executed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public fileprivate(set) var error: AFError? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

State +

+
+
+
    +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancels the instance. Once cancelled, a Request can no longer be resumed or suspended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspends the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func suspend() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resumes the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func resume() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Closure API +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Associates a credential using the provided values with the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func authenticate(username: String, password: String, persistence: URLCredential.Persistence = .forSession) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + username + + +
    +

    The username.

    +
    +
    + + password + + +
    +

    The password.

    +
    +
    + + persistence + + +
    +

    The URLCredential.Persistence for the created URLCredential. .forSession by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + authenticate(with:) + +
    +
    +
    +
    +
    +
    +

    Associates the provided credential with the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func authenticate(with credential: URLCredential) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + credential + + +
    +

    The URLCredential.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server.

    +
    +

    Note

    +

    Only the last closure provided is used.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func downloadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The DispatchQueue to execute the closure on. .main by default.

    +
    +
    + + closure + + +
    +

    The closure to be executed periodically as data is read from the server.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server.

    +
    +

    Note

    +

    Only the last closure provided is used.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func uploadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The DispatchQueue to execute the closure on. .main by default.

    +
    +
    + + closure + + +
    +

    The closure to be executed periodically as data is sent to the server.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Redirects +

+
+
+
    +
  • +
    + + + + redirect(using:) + +
    +
    +
    +
    +
    +
    +

    Sets the redirect handler for the instance which will be used if a redirect response is encountered.

    +
    +

    Note

    +

    Attempting to set the redirect handler more than once is a logic error and will crash.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func redirect(using handler: RedirectHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    The RedirectHandler.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Cached Responses +

+
+
+
    +
  • +
    + + + + cacheResponse(using:) + +
    +
    +
    +
    +
    +
    +

    Sets the cached response handler for the Request which will be used when attempting to cache a response.

    +
    +

    Note

    +

    Attempting to set the cache handler more than once is a logic error and will crash.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cacheResponse(using handler: CachedResponseHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Lifetime APIs +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler to be called when the cURL description of the request is available.

    +
    +

    Note

    +

    When waiting for a Request‘s URLRequest to be created, only the last handler will be called.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cURLDescription(on queue: DispatchQueue, calling handler: @escaping (String) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called.

    +
    +
    + + handler + + +
    +

    Closure to be called when the cURL description is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler to be called when the cURL description of the request is available.

    +
    +

    Note

    +

    When waiting for a Request‘s URLRequest to be created, only the last handler will be called.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cURLDescription(calling handler: @escaping (String) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Closure to be called when the cURL description is available. Called on the instance’s + underlyingQueue by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to called whenever Alamofire creates a URLRequest for this instance.

    +
    +

    Note

    +

    This closure will be called multiple times if the instance adapts incoming URLRequests or is retried.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onURLRequestCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLRequest) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure to be called when a URLRequest is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called whenever the instance creates a URLSessionTask.

    +
    +

    Note

    +

    This API should only be used to provide URLSessionTasks to existing API, like NSFileProvider. It + SHOULD NOT be used to interact with tasks directly, as that may be break Alamofire features. + Additionally, this closure may be called multiple times if the instance is retried.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onURLSessionTaskCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLSessionTask) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure to be called when the URLSessionTask is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Request Event Streams +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<Progress> for the instance’s upload progress.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func uploadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<Progress>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<Progress> for the instance’s download progress.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func downloadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<Progress>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<URLRequest> for the URLRequests produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func urlRequests(bufferingPolicy: StreamOf<URLRequest>.BufferingPolicy = .unbounded) -> StreamOf<URLRequest>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<URLRequest>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<URLSessionTask> for the URLSessionTasks produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func urlSessionTasks(bufferingPolicy: StreamOf<URLSessionTask>.BufferingPolicy = .unbounded) -> StreamOf<URLSessionTask>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<URLSessionTask>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<String> for the cURL descriptions produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cURLDescriptions(bufferingPolicy: StreamOf<String>.BufferingPolicy = .unbounded) -> StreamOf<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<String>.

    +
    +
    +
    +
  • +
  • +
    + + + + didResumeNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is resumed. The Notification contains the resumed Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didResumeNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a Request is suspended. The Notification contains the suspended Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didSuspendNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didCancelNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is cancelled. The Notification contains the cancelled Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCancelNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didFinishNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is finished. The Notification contains the completed Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didFinishNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is resumed. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didResumeTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is suspended. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didSuspendTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is cancelled. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCancelTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is completed. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCompleteTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ResponseDisposition + +
    +
    +
    +
    +
    +
    +

    Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ResponseDisposition
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocol Conformances +

+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Request, rhs: Request) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    A textual representation of this instance, including the HTTPMethod and URL if the URLRequest has been +created, as well as the response status code, if a response has been received.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cURLDescription() + +
    +
    +
    +
    +
    +
    +

    cURL representation of the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cURLDescription() -> String
    + +
    +
    +
    +

    Return Value

    +

    The cURL equivalent of the instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + ValidationResult + +
    +
    +
    +
    +
    +
    +

    Used to represent whether a validation succeeded or failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ValidationResult = Result<Void, Error>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Request/ResponseDisposition.html b/Carthage/Checkouts/Alamofire/docs/Classes/Request/ResponseDisposition.html new file mode 100644 index 00000000..cdd77377 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Request/ResponseDisposition.html @@ -0,0 +1,633 @@ + + + + ResponseDisposition Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseDisposition

+
+
+ +
public enum ResponseDisposition
+ +
+
+

Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + allow + +
    +
    +
    +
    +
    +
    +

    Allow the request to continue normally.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case allow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel + +
    +
    +
    +
    +
    +
    +

    Cancel the request, similar to calling cancel().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancel
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Request/State.html b/Carthage/Checkouts/Alamofire/docs/Classes/Request/State.html new file mode 100644 index 00000000..77f3187e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Request/State.html @@ -0,0 +1,720 @@ + + + + State Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

State

+
+
+ +
public enum State
+ +
+
+

State of the Request, with managed transitions between states set when calling resume(), suspend(), or +cancel() on the Request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + initialized + +
    +
    +
    +
    +
    +
    +

    Initial state of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case initialized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumed + +
    +
    +
    +
    +
    +
    +

    State set when resume() is called. Any tasks created for the Request will have resume() called on +them in this state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case resumed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspended + +
    +
    +
    +
    +
    +
    +

    State set when suspend() is called. Any tasks created for the Request will have suspend() called on +them in this state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case suspended
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancelled + +
    +
    +
    +
    +
    +
    +

    State set when cancel() is called. Any tasks created for the Request will have cancel() called on +them. Unlike resumed or suspended, once in the cancelled state, the Request can no longer transition +to any other state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancelled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + finished + +
    +
    +
    +
    +
    +
    +

    State set when all response serialization completion closures have been cleared on the Request and +enqueued on their respective queues.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case finished
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Retrier.html b/Carthage/Checkouts/Alamofire/docs/Classes/Retrier.html new file mode 100644 index 00000000..0ef91088 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Retrier.html @@ -0,0 +1,654 @@ + + + + Retrier Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Retrier

+
+
+ +
open class Retrier : RequestInterceptor
+ +
+
+

Closure-based RequestRetrier.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ retryHandler: @escaping RetryHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + retryHandler + + +
    +

    RetryHandler closure to be executed when handling request retry.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func retry(_ request: Request,
    +                for session: Session,
    +                dueTo error: Error,
    +                completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/RetryPolicy.html b/Carthage/Checkouts/Alamofire/docs/Classes/RetryPolicy.html new file mode 100644 index 00000000..cd9bb55c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/RetryPolicy.html @@ -0,0 +1,1111 @@ + + + + RetryPolicy Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RetryPolicy

+
+
+ +
open class RetryPolicy : RequestInterceptor
+ +
+
+

A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +as well as certain types of networking errors.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + defaultRetryLimit + +
    +
    +
    +
    +
    +
    +

    The default retry limit for retry policies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryLimit: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default exponential backoff base for retry policies (must be a minimum of 2).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultExponentialBackoffBase: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default exponential backoff scale for retry policies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultExponentialBackoffScale: Double
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default HTTP methods to retry. +See RFC 2616 - Section 9.1.2 for more information.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableHTTPMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default HTTP status codes to retry. +See RFC 2616 - Section 10 for more information.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableHTTPStatusCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default URL error codes to retry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableURLErrorCodes: Set<URLError.Code>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryLimit + +
    +
    +
    +
    +
    +
    +

    The total number of times the request is allowed to be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryLimit: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The base of the exponential backoff policy (should always be greater than or equal to 2).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let exponentialBackoffBase: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The scale of the exponential backoff.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let exponentialBackoffScale: Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryableHTTPMethods + +
    +
    +
    +
    +
    +
    +

    The HTTP methods that are allowed to be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableHTTPMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The HTTP status codes that are automatically retried by the policy.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableHTTPStatusCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The URL error codes that are automatically retried by the policy.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableURLErrorCodes: Set<URLError.Code>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RetryPolicy from the specified parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit,
    +            exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase,
    +            exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale,
    +            retryableHTTPMethods: Set<HTTPMethod> = RetryPolicy.defaultRetryableHTTPMethods,
    +            retryableHTTPStatusCodes: Set<Int> = RetryPolicy.defaultRetryableHTTPStatusCodes,
    +            retryableURLErrorCodes: Set<URLError.Code> = RetryPolicy.defaultRetryableURLErrorCodes)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + retryLimit + + +
    +

    The total number of times the request is allowed to be retried. 2 by default.

    +
    +
    + + exponentialBackoffBase + + +
    +

    The base of the exponential backoff policy. 2 by default.

    +
    +
    + + exponentialBackoffScale + + +
    +

    The scale of the exponential backoff. 0.5 by default.

    +
    +
    + + retryableHTTPMethods + + +
    +

    The HTTP methods that are allowed to be retried. + RetryPolicy.defaultRetryableHTTPMethods by default.

    +
    +
    + + retryableHTTPStatusCodes + + +
    +

    The HTTP status codes that are automatically retried by the policy. + RetryPolicy.defaultRetryableHTTPStatusCodes by default.

    +
    +
    + + retryableURLErrorCodes + + +
    +

    The URL error codes that are automatically retried by the policy. + RetryPolicy.defaultRetryableURLErrorCodes by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func retry(_ request: Request,
    +                for session: Session,
    +                dueTo error: Error,
    +                completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether or not to retry the provided Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func shouldRetry(request: Request, dueTo error: Error) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    Request that failed due to the provided Error.

    +
    +
    + + error + + +
    +

    Error encountered while executing the Request.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool determining whether or not to retry the Request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator.html new file mode 100644 index 00000000..deaaa2bc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator.html @@ -0,0 +1,718 @@ + + + + RevocationTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RevocationTrustEvaluator

+
+
+ +
public final class RevocationTrustEvaluator : ServerTrustEvaluating
+ +
+
+

An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +environments to guarantee the validity of the server’s certificate chain.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    Represents the options to be use when evaluating the status of a certificate. +Only Revocation Policy Constants are valid, and can be found in Apple’s documentation.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSet
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RevocationTrustEvaluator using the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(performDefaultValidation: Bool = true, validateHost: Bool = true, options: Options = .any)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    + + options + + +
    +

    The Options to use to check the revocation status of the certificate. .any by + default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator/Options.html b/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator/Options.html new file mode 100644 index 00000000..2cd3e241 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/RevocationTrustEvaluator/Options.html @@ -0,0 +1,817 @@ + + + + Options Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Options

+
+
+ +
public struct Options : OptionSet
+ +
+
+

Represents the options to be use when evaluating the status of a certificate. +Only Revocation Policy Constants are valid, and can be found in Apple’s documentation.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + crl + +
    +
    +
    +
    +
    +
    +

    Perform revocation checking using the CRL (Certification Revocation List) method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let crl: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + networkAccessDisabled + +
    +
    +
    +
    +
    +
    +

    Consult only locally cached replies; do not use network access.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let networkAccessDisabled: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ocsp + +
    +
    +
    +
    +
    +
    +

    Perform revocation checking using OCSP (Online Certificate Status Protocol).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ocsp: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preferCRL + +
    +
    +
    +
    +
    +
    +

    Prefer CRL revocation checking over OCSP; by default, OCSP is preferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let preferCRL: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a +“best attempt” basis, where failure to reach the server is not considered fatal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let requirePositiveResponse: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + any + +
    +
    +
    +
    +
    +
    +

    Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the +certificate and the value of preferCRL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let any: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    +

    The raw value of the option.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: CFOptionFlags
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    +

    Creates an Options value with the given CFOptionFlags.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: CFOptionFlags)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + rawValue + + +
    +

    The CFOptionFlags value to initialize with.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/ServerTrustManager.html b/Carthage/Checkouts/Alamofire/docs/Classes/ServerTrustManager.html new file mode 100644 index 00000000..72a97fdc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/ServerTrustManager.html @@ -0,0 +1,756 @@ + + + + ServerTrustManager Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustManager

+
+
+ +
open class ServerTrustManager
+ +
+
+

Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether all hosts for this ServerTrustManager must be evaluated. true by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let allHostsMustBeEvaluated: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluators + +
    +
    +
    +
    +
    +
    +

    The dictionary of policies mapped to a particular host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let evaluators: [String : ServerTrustEvaluating]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes the ServerTrustManager instance with the given evaluators.

    + +

    Since different servers and web services can have different leaf certificates, intermediate and even root +certificates, it is important to have the flexibility to specify evaluation policies on a per host basis. This +allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key +pinning for host3 and disabling evaluation for host4.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(allHostsMustBeEvaluated: Bool = true, evaluators: [String : ServerTrustEvaluating])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + allHostsMustBeEvaluated + + +
    +

    The value determining whether all hosts for this instance must be evaluated. true + by default.

    +
    +
    + + evaluators + + +
    +

    A dictionary of evaluators mapped to hosts.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the ServerTrustEvaluating value for the given host, if one is set.

    + +

    By default, this method will return the policy that perfectly matches the given host. Subclasses could override +this method and implement more complex mapping implementations such as wildcards.

    +
    +

    Throws

    +

    AFError.serverTrustEvaluationFailed if allHostsMustBeEvaluated is true and no matching + evaluators are found.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The host to use when searching for a matching policy.

    +
    +
    +
    +
    +

    Return Value

    +

    The ServerTrustEvaluating value for the given host if found, nil otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/Session.html b/Carthage/Checkouts/Alamofire/docs/Classes/Session.html new file mode 100644 index 00000000..7c8a262e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/Session.html @@ -0,0 +1,4079 @@ + + + + Session Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Session

+
+
+ +
open class Session
+
extension Session: RequestDelegate
+ +
+
+

Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common +functionality for all Requests, including queuing, interception, trust management, redirect handling, and response +cache handling.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Shared singleton instance used by all AF.request APIs. Cannot be modified.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: Session
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + session + +
    +
    +
    +
    +
    +
    +

    Underlying URLSession used to create URLSessionTasks for this instance, and for which this instance’s +delegate handles URLSessionDelegate callbacks.

    +
    +

    Note

    + This instance should NOT be used to interact with the underlying URLSessionTasks. Doing so will + break internal Alamofire logic that tracks those tasks. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let session: URLSession
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    Instance’s SessionDelegate, which handles the URLSessionDelegate methods and Request interaction.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let delegate: SessionDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rootQueue + +
    +
    +
    +
    +
    +
    +

    Root DispatchQueue for all internal callbacks and state update. MUST be a serial queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rootQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Value determining whether this instance automatically calls resume() on all created Requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let startRequestsImmediately: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue on which URLRequests are created asynchronously. By default this queue uses rootQueue as its +target, but a separate queue can be used if request creation is determined to be a bottleneck. Always profile +and test before introducing an additional queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let requestQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue passed to all Requests on which they perform their response serialization. By default this +queue uses rootQueue as its target but a separate queue can be used if response serialization is determined +to be a bottleneck. Always profile and test before introducing an additional queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + interceptor + +
    +
    +
    +
    +
    +
    +

    RequestInterceptor used for all Request created by the instance. RequestInterceptors can also be set on a +per-Request basis, in which case the Request‘s interceptor takes precedence over this value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interceptor: RequestInterceptor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serverTrustManager + +
    +
    +
    +
    +
    +
    +

    ServerTrustManager instance used to evaluate all trust challenges and provide certificate and key pinning.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serverTrustManager: ServerTrustManager?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + redirectHandler + +
    +
    +
    +
    +
    +
    +

    RedirectHandler instance used to provide customization for request redirection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let redirectHandler: RedirectHandler?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    CachedResponseHandler instance used to provide customization of cached response handling.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let cachedResponseHandler: CachedResponseHandler?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventMonitor + +
    +
    +
    +
    +
    +
    +

    CompositeEventMonitor used to compose Alamofire’s defaultEventMonitors and any passed EventMonitors.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let eventMonitor: CompositeEventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEventMonitors + +
    +
    +
    +
    +
    +
    +

    EventMonitors included in all instances. [AlamofireNotifications()] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let defaultEventMonitors: [EventMonitor]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Session from a URLSession and other parameters.

    +
    +

    Note

    +

    When passing a URLSession, you must create the URLSession with a specific delegateQueue value and + pass the delegateQueue‘s underlyingQueue as the rootQueue parameter of this initializer.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(session: URLSession,
    +            delegate: SessionDelegate,
    +            rootQueue: DispatchQueue,
    +            startRequestsImmediately: Bool = true,
    +            requestQueue: DispatchQueue? = nil,
    +            serializationQueue: DispatchQueue? = nil,
    +            interceptor: RequestInterceptor? = nil,
    +            serverTrustManager: ServerTrustManager? = nil,
    +            redirectHandler: RedirectHandler? = nil,
    +            cachedResponseHandler: CachedResponseHandler? = nil,
    +            eventMonitors: [EventMonitor] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + session + + +
    +

    Underlying URLSession for this instance.

    +
    +
    + + delegate + + +
    +

    SessionDelegate that handles session‘s delegate callbacks as well as Request + interaction.

    +
    +
    + + rootQueue + + +
    +

    Root DispatchQueue for all internal callbacks and state updates. MUST be a + serial queue.

    +
    +
    + + startRequestsImmediately + + +
    +

    Determines whether this instance will automatically start all Requests. true + by default. If set to false, all Requests created must have .resume() called. + on them for them to start.

    +
    +
    + + requestQueue + + +
    +

    DispatchQueue on which to perform URLRequest creation. By default this queue + will use the rootQueue as its target. A separate queue can be used if it’s + determined request creation is a bottleneck, but that should only be done after + careful testing and profiling. nil by default.

    +
    +
    + + serializationQueue + + +
    +

    DispatchQueue on which to perform all response serialization. By default this + queue will use the rootQueue as its target. A separate queue can be used if + it’s determined response serialization is a bottleneck, but that should only be + done after careful testing and profiling. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor to be used for all Requests created by this instance. nil + by default.

    +
    +
    + + serverTrustManager + + +
    +

    ServerTrustManager to be used for all trust evaluations by this instance. nil + by default.

    +
    +
    + + redirectHandler + + +
    +

    RedirectHandler to be used by all Requests created by this instance. nil by + default.

    +
    +
    + + cachedResponseHandler + + +
    +

    CachedResponseHandler to be used by all Requests created by this instance. + nil by default.

    +
    +
    + + eventMonitors + + +
    +

    Additional EventMonitors used by the instance. Alamofire always adds a + AlamofireNotifications EventMonitor to the array passed here. [] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Session from a URLSessionConfiguration.

    +
    +

    Note

    +

    This initializer lets Alamofire handle the creation of the underlying URLSession and its + delegateQueue, and is the recommended initializer for most uses.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,
    +                        delegate: SessionDelegate = SessionDelegate(),
    +                        rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"),
    +                        startRequestsImmediately: Bool = true,
    +                        requestQueue: DispatchQueue? = nil,
    +                        serializationQueue: DispatchQueue? = nil,
    +                        interceptor: RequestInterceptor? = nil,
    +                        serverTrustManager: ServerTrustManager? = nil,
    +                        redirectHandler: RedirectHandler? = nil,
    +                        cachedResponseHandler: CachedResponseHandler? = nil,
    +                        eventMonitors: [EventMonitor] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    URLSessionConfiguration to be used to create the underlying URLSession. Changes + to this value after being passed to this initializer will have no effect. + URLSessionConfiguration.af.default by default.

    +
    +
    + + delegate + + +
    +

    SessionDelegate that handles session‘s delegate callbacks as well as Request + interaction. SessionDelegate() by default.

    +
    +
    + + rootQueue + + +
    +

    Root DispatchQueue for all internal callbacks and state updates. MUST be a + serial queue. DispatchQueue(label: "org.alamofire.session.rootQueue") by default.

    +
    +
    + + startRequestsImmediately + + +
    +

    Determines whether this instance will automatically start all Requests. true + by default. If set to false, all Requests created must have .resume() called. + on them for them to start.

    +
    +
    + + requestQueue + + +
    +

    DispatchQueue on which to perform URLRequest creation. By default this queue + will use the rootQueue as its target. A separate queue can be used if it’s + determined request creation is a bottleneck, but that should only be done after + careful testing and profiling. nil by default.

    +
    +
    + + serializationQueue + + +
    +

    DispatchQueue on which to perform all response serialization. By default this + queue will use the rootQueue as its target. A separate queue can be used if + it’s determined response serialization is a bottleneck, but that should only be + done after careful testing and profiling. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor to be used for all Requests created by this instance. nil + by default.

    +
    +
    + + serverTrustManager + + +
    +

    ServerTrustManager to be used for all trust evaluations by this instance. nil + by default.

    +
    +
    + + redirectHandler + + +
    +

    RedirectHandler to be used by all Requests created by this instance. nil by + default.

    +
    +
    + + cachedResponseHandler + + +
    +

    CachedResponseHandler to be used by all Requests created by this instance. + nil by default.

    +
    +
    + + eventMonitors + + +
    +

    Additional EventMonitors used by the instance. Alamofire always adds a + AlamofireNotifications EventMonitor to the array passed here. [] by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

All Requests API +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Perform an action on all active Requests.

    +
    +

    Note

    +

    The provided action closure is performed asynchronously, meaning that some Requests may complete and + be unavailable by time it runs. Additionally, this action is performed on the instances’s rootQueue, + so care should be taken that actions are fast. Once the work on the Requests is complete, any + additional work should be performed on another queue.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAllRequests(perform action: @escaping (Set<Request>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + action + + +
    +

    Closure to perform with all Requests.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancel all active Requests, optionally calling a completion handler when complete.

    +
    +

    Note

    +

    This is an asynchronous operation and does not block the creation of future Requests. Cancelled + Requests may not cancel immediately due internal work, and may not cancel at all if they are close to + completion when cancelled.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancelAllRequests(completingOnQueue queue: DispatchQueue = .main, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the completion handler is run. .main by default.

    +
    +
    + + completion + + +
    +

    Closure to be called when all Requests have been cancelled.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest +

+
+
+ +
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ + +
+ +

DownloadRequest +

+
+
+ +
+
+
+ + +
+ +

Data +

+
+
+ +
+
+
+ + +
+ +

File +

+
+
+ +
+
+
+ + +
+ +

InputStream +

+
+
+ +
+
+
+ + +
+ +

MultipartFormData +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the multipart form data built using a closure and sent using the provided +URLRequest components and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                 to url: URLConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 method: HTTPMethod = .post,
    +                 headers: HTTPHeaders? = nil,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default,
    +                 requestModifier: RequestModifier? = nil) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    + + requestModifier + + +
    +

    RequestModifier which will be applied to the URLRequest created from the + provided parameters. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible +value, and a RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                 with request: URLRequestConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components +and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: MultipartFormData,
    +                 to url: URLConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 method: HTTPMethod = .post,
    +                 headers: HTTPHeaders? = nil,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default,
    +                 requestModifier: RequestModifier? = nil) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    + + requestModifier + + +
    +

    RequestModifier which will be applied to the URLRequest created from the + provided parameters. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible +value and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: MultipartFormData,
    +                 with request: URLRequestConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager instance to be used by the returned UploadRequest. .default instance by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

RequestDelegate +

+
+
+
    +
  • +
    + + + + sessionConfiguration + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sessionConfiguration: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startImmediately + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startImmediately: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup(after:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cleanup(after request: Request)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/SessionDelegate.html b/Carthage/Checkouts/Alamofire/docs/Classes/SessionDelegate.html new file mode 100644 index 00000000..1e963094 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/SessionDelegate.html @@ -0,0 +1,1086 @@ + + + + SessionDelegate Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SessionDelegate

+
+
+ +
open class SessionDelegate : NSObject
+
extension SessionDelegate: URLSessionDelegate
+
extension SessionDelegate: URLSessionTaskDelegate
+
extension SessionDelegate: URLSessionDataDelegate
+
extension SessionDelegate: URLSessionDownloadDelegate
+ +
+
+

Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(fileManager:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from the given FileManager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fileManager: FileManager = .default)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fileManager + + +
    +

    FileManager to use for underlying file management, such as moving downloaded files. + .default by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionTaskDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     didReceive challenge: URLAuthenticationChallenge,
    +                     completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     didSendBodyData bytesSent: Int64,
    +                     totalBytesSent: Int64,
    +                     totalBytesExpectedToSend: Int64)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     needNewBodyStream completionHandler: @escaping (InputStream?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     willPerformHTTPRedirection response: HTTPURLResponse,
    +                     newRequest request: URLRequest,
    +                     completionHandler: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDataDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     dataTask: URLSessionDataTask,
    +                     didReceive response: URLResponse,
    +                     completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     dataTask: URLSessionDataTask,
    +                     willCacheResponse proposedResponse: CachedURLResponse,
    +                     completionHandler: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDownloadDelegate +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/StringResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Classes/StringResponseSerializer.html new file mode 100644 index 00000000..90b8aa7e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/StringResponseSerializer.html @@ -0,0 +1,798 @@ + + + + StringResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StringResponseSerializer

+
+
+ +
public final class StringResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no +data is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code +valid for empty responses, then an empty String is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoding + +
    +
    +
    +
    +
    +
    +

    Optional string encoding used to validate the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let encoding: String.Encoding?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +            encoding: String.Encoding? = nil,
    +            emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + encoding + + +
    +

    A string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder.html new file mode 100644 index 00000000..f499d01d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder.html @@ -0,0 +1,1405 @@ + + + + URLEncodedFormEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncodedFormEncoder

+
+
+ +
public final class URLEncodedFormEncoder
+ +
+
+

An object that encodes instances into URL-encoded query strings.

+ +

ArrayEncoding can be used to configure how Array values are encoded. By default, the .brackets encoding is +used, encoding array values with brackets for each value. e.g array[]=1&array[]=2.

+ +

BoolEncoding can be used to configure how Bool values are encoded. By default, the .numeric encoding is used, +encoding true as 1 and false as 0.

+ +

DataEncoding can be used to configure how Data values are encoded. By default, the .deferredToData encoding is +used, which encodes Data values using their default Encodable implementation.

+ +

DateEncoding can be used to configure how Date values are encoded. By default, the .deferredToDate +encoding is used, which encodes Dates using their default Encodable implementation.

+ +

KeyEncoding can be used to configure how keys are encoded. By default, the .useDefaultKeys encoding is used, +which encodes the keys directly from the Encodable implementation.

+ +

KeyPathEncoding can be used to configure how paths within nested objects are encoded. By default, the .brackets +encoding is used, which encodes each sub-key in brackets. e.g. parent[child][grandchild]=value.

+ +

NilEncoding can be used to configure how nil Optional values are encoded. By default, the .dropKey encoding +is used, which drops nil key / value pairs from the output entirely.

+ +

SpaceEncoding can be used to configure how spaces are encoded. By default, the .percentEscaped encoding is used, +replacing spaces with %20.

+ +

This type is largely based on Vapor’s url-encoded-form project.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ArrayEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Array values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BoolEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Bool values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum BoolEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Data values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DataEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DateEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Date values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DateEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + KeyEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for keys.

    + +

    This type is derived from JSONEncoder‘s KeyEncodingStrategy +and XMLEncoders KeyEncodingStrategy.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum KeyEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + KeyPathEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for nested object and Encodable value key paths.

    +
    ["parent" : ["child" : ["grandchild": "value"]]]
    +
    + +

    This encoding affects how the parent, child, grandchild path is encoded. Brackets are used by default. +e.g. parent[child][grandchild]=value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NilEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for nil values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SpaceEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for spaces.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum SpaceEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Error + +
    +
    +
    +
    +
    + +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Error : Swift.Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether or not to sort the encoded key value pairs.

    +
    +

    Note

    + This setting ensures a consistent ordering for all encodings of the same parameters. When set to false, + encoded Dictionary values may have a different encoded order each time they’re encoded due to + Dictionary‘s random storage order, but Encodable types will maintain their encoded order. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let alphabetizeKeyValuePairs: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + arrayEncoding + +
    +
    +
    +
    +
    +
    +

    The ArrayEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let arrayEncoding: ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolEncoding + +
    +
    +
    +
    +
    +
    +

    The BoolEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boolEncoding: BoolEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dataEncoding + +
    +
    +
    +
    +
    +
    +

    THe DataEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataEncoding: DataEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dateEncoding + +
    +
    +
    +
    +
    +
    +

    The DateEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dateEncoding: DateEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + keyEncoding + +
    +
    +
    +
    +
    +
    +

    The KeyEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let keyEncoding: KeyEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + keyPathEncoding + +
    +
    +
    +
    +
    +
    +

    The KeyPathEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let keyPathEncoding: KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nilEncoding + +
    +
    +
    +
    +
    +
    +

    The NilEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nilEncoding: NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + spaceEncoding + +
    +
    +
    +
    +
    +
    +

    The SpaceEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let spaceEncoding: SpaceEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allowedCharacters + +
    +
    +
    +
    +
    +
    +

    The CharacterSet of allowed (non-escaped) characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allowedCharacters: CharacterSet
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance from the supplied parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(alphabetizeKeyValuePairs: Bool = true,
    +            arrayEncoding: ArrayEncoding = .brackets,
    +            boolEncoding: BoolEncoding = .numeric,
    +            dataEncoding: DataEncoding = .base64,
    +            dateEncoding: DateEncoding = .deferredToDate,
    +            keyEncoding: KeyEncoding = .useDefaultKeys,
    +            keyPathEncoding: KeyPathEncoding = .brackets,
    +            nilEncoding: NilEncoding = .dropKey,
    +            spaceEncoding: SpaceEncoding = .percentEscaped,
    +            allowedCharacters: CharacterSet = .afURLQueryAllowed)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + alphabetizeKeyValuePairs + + +
    +

    Whether or not to sort the encoded key value pairs. true by default.

    +
    +
    + + arrayEncoding + + +
    +

    The ArrayEncoding to use. .brackets by default.

    +
    +
    + + boolEncoding + + +
    +

    The BoolEncoding to use. .numeric by default.

    +
    +
    + + dataEncoding + + +
    +

    The DataEncoding to use. .base64 by default.

    +
    +
    + + dateEncoding + + +
    +

    The DateEncoding to use. .deferredToDate by default.

    +
    +
    + + keyEncoding + + +
    +

    The KeyEncoding to use. .useDefaultKeys by default.

    +
    +
    + + nilEncoding + + +
    +

    The NilEncoding to use. .drop by default.

    +
    +
    + + spaceEncoding + + +
    +

    The SpaceEncoding to use. .percentEscaped by default.

    +
    +
    + + allowedCharacters + + +
    +

    The CharacterSet of allowed (non-escaped) characters. .afURLQueryAllowed by + default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes the value as a URL form encoded String.

    +
    +

    Throws

    +

    An Error or EncodingError instance if encoding fails.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ value: Encodable) throws -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Encodable value.`

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded String.

    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes the value as Data. This is performed by first creating an encoded String and then returning the +.utf8 data.

    +
    +

    Throws

    +

    An Error or EncodingError instance if encoding fails.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ value: Encodable) throws -> Data
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Encodable value.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded Data.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/ArrayEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/ArrayEncoding.html new file mode 100644 index 00000000..306cc23b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/ArrayEncoding.html @@ -0,0 +1,687 @@ + + + + ArrayEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ArrayEncoding

+
+
+ +
public enum ArrayEncoding
+ +
+
+

Encoding to use for Array values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    An empty set of square brackets (“[]”) are appended to the key for every value. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case brackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noBrackets + +
    +
    +
    +
    +
    +
    +

    No brackets are appended to the key and the key is encoded as is.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + indexInBrackets + +
    +
    +
    +
    +
    +
    +

    Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case indexInBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Provide a custom array key encoding with the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((_ key: String, _ index: Int) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/BoolEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/BoolEncoding.html new file mode 100644 index 00000000..dc28f471 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/BoolEncoding.html @@ -0,0 +1,633 @@ + + + + BoolEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BoolEncoding

+
+
+ +
public enum BoolEncoding
+ +
+
+

Encoding to use for Bool values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + numeric + +
    +
    +
    +
    +
    +
    +

    Encodes true as 1, false as 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case numeric
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + literal + +
    +
    +
    +
    +
    +
    +

    Encodes true as “true”, false as “false”. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case literal
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DataEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DataEncoding.html new file mode 100644 index 00000000..edb18872 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DataEncoding.html @@ -0,0 +1,660 @@ + + + + DataEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataEncoding

+
+
+ +
public enum DataEncoding
+ +
+
+

Encoding to use for Data values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + deferredToData + +
    +
    +
    +
    +
    +
    +

    Defers encoding to the Data type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferredToData
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + base64 + +
    +
    +
    +
    +
    +
    +

    Encodes Data as a Base64-encoded string. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case base64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Encode the Data as a custom value encoded by the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((Data) throws -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DateEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DateEncoding.html new file mode 100644 index 00000000..9b572424 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/DateEncoding.html @@ -0,0 +1,741 @@ + + + + DateEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DateEncoding

+
+
+ +
public enum DateEncoding
+ +
+
+

Encoding to use for Date values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + deferredToDate + +
    +
    +
    +
    +
    +
    +

    Defers encoding to the Date type. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferredToDate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + secondsSince1970 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates as seconds since midnight UTC on January 1, 1970.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case secondsSince1970
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + millisecondsSince1970 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates as milliseconds since midnight UTC on January 1, 1970.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case millisecondsSince1970
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iso8601 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates according to the ISO8601 and RFC3339 standards.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case iso8601
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + formatted(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes Dates using the given DateFormatter.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case formatted(DateFormatter)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes Dates using the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((Date) throws -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/Error.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/Error.html new file mode 100644 index 00000000..2302429a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/Error.html @@ -0,0 +1,606 @@ + + + + Error Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
public enum Error : Swift.Error
+ +
+
+

URLEncodedFormEncoder error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + invalidRootObject(_:) + +
    +
    +
    +
    +
    +
    +

    An invalid root object was created by the encoder. Only keyed values are valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidRootObject(String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyEncoding.html new file mode 100644 index 00000000..e278f01c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyEncoding.html @@ -0,0 +1,798 @@ + + + + KeyEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

KeyEncoding

+
+
+ +
public enum KeyEncoding
+ +
+
+

Encoding to use for keys.

+ +

This type is derived from JSONEncoder‘s KeyEncodingStrategy +and XMLEncoders KeyEncodingStrategy.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + useDefaultKeys + +
    +
    +
    +
    +
    +
    +

    Use the keys specified by each type. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case useDefaultKeys
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertToSnakeCase + +
    +
    +
    +
    +
    +
    +

    Convert from “camelCaseKeys” to “snake_case_keys” before writing a key.

    + +

    Capital characters are determined by testing membership in +CharacterSet.uppercaseLetters and CharacterSet.lowercaseLetters +(Unicode General Categories Lu and Lt). +The conversion to lower case uses Locale.system, also known as +the ICU “root” locale. This means the result is consistent +regardless of the current user’s locale and language preferences.

    + +

    Converting from camel case to snake case:

    + +
      +
    1. Splits words at the boundary of lower-case to upper-case
    2. +
    3. Inserts _ between words
    4. +
    5. Lowercases the entire string
    6. +
    7. Preserves starting and ending _.
    8. +
    + +

    For example, oneTwoThree becomes one_two_three. _oneTwoThree_ becomes _one_two_three_.

    +
    +

    Note

    + Using a key encoding strategy has a nominal performance cost, as each string key has to be converted. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case convertToSnakeCase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertToKebabCase + +
    +
    +
    +
    +
    +
    +

    Same as convertToSnakeCase, but using - instead of _. +For example oneTwoThree becomes one-two-three.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case convertToKebabCase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + capitalized + +
    +
    +
    +
    +
    +
    +

    Capitalize the first letter only. +For example oneTwoThree becomes OneTwoThree.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case capitalized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + uppercased + +
    +
    +
    +
    +
    +
    +

    Uppercase all letters. +For example oneTwoThree becomes ONETWOTHREE.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case uppercased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lowercased + +
    +
    +
    +
    +
    +
    +

    Lowercase all letters. +For example oneTwoThree becomes onetwothree.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case lowercased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    A custom encoding using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((String) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyPathEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyPathEncoding.html new file mode 100644 index 00000000..fc305bbf --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/KeyPathEncoding.html @@ -0,0 +1,684 @@ + + + + KeyPathEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

KeyPathEncoding

+
+
+ +
public struct KeyPathEncoding
+ +
+
+

Encoding to use for nested object and Encodable value key paths.

+
["parent" : ["child" : ["grandchild": "value"]]]
+
+ +

This encoding affects how the parent, child, grandchild path is encoded. Brackets are used by default. +e.g. parent[child][grandchild]=value.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    Encodes key paths by wrapping each component in brackets. e.g. parent[child][grandchild].

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let brackets: URLEncodedFormEncoder.KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dots + +
    +
    +
    +
    +
    +
    +

    Encodes key paths by separating each component with dots. e.g. parent.child.grandchild.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dots: URLEncodedFormEncoder.KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoding:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the encoding closure called for each sub-key in a key path.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoding: @escaping (_ subkey: String) -> String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoding + + +
    +

    Closure used to perform the encoding.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/NilEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/NilEncoding.html new file mode 100644 index 00000000..35f5fcb4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/NilEncoding.html @@ -0,0 +1,706 @@ + + + + NilEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NilEncoding

+
+
+ +
public struct NilEncoding
+ +
+
+

Encoding to use for nil values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dropKey + +
    +
    +
    +
    +
    +
    +

    Encodes nil by dropping the entire key / value pair.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dropKey: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dropValue + +
    +
    +
    +
    +
    +
    +

    Encodes nil by dropping only the value. e.g. value1=one&nilValue=&value2=two.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dropValue: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    Encodes nil as null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let null: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoding:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the encoding closure called for nil values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoding: @escaping () -> String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoding + + +
    +

    Closure used to perform the encoding.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/SpaceEncoding.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/SpaceEncoding.html new file mode 100644 index 00000000..04822005 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormEncoder/SpaceEncoding.html @@ -0,0 +1,633 @@ + + + + SpaceEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SpaceEncoding

+
+
+ +
public enum SpaceEncoding
+ +
+
+

Encoding to use for spaces.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + percentEscaped + +
    +
    +
    +
    +
    +
    +

    Encodes spaces using percent escaping (%20).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case percentEscaped
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + plusReplaced + +
    +
    +
    +
    +
    +
    +

    Encodes spaces as +.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case plusReplaced
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder.html new file mode 100644 index 00000000..fec11b4d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder.html @@ -0,0 +1,779 @@ + + + + URLEncodedFormParameterEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncodedFormParameterEncoder

+
+
+ +
open class URLEncodedFormParameterEncoder : ParameterEncoder
+ +
+
+

A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +on the Destination set.

+ +

If no Content-Type header is already set on the provided URLRequests, it will be set to +application/x-www-form-urlencoded; charset=utf-8.

+ +

Encoding behavior can be customized by passing an instance of URLEncodedFormEncoder to the initializer.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder/Destination.html b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder/Destination.html new file mode 100644 index 00000000..03d01c68 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/URLEncodedFormParameterEncoder/Destination.html @@ -0,0 +1,661 @@ + + + + Destination Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Destination

+
+
+ +
public enum Destination
+ +
+
+

Defines where the URL-encoded string should be set for each URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + methodDependent + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to any existing query string for .get, .head, and .delete request. +Sets it to the httpBody for all other methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case methodDependent
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to any existing query string from the URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case queryString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to the httpBody of the URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpBody
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest.html b/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest.html new file mode 100644 index 00000000..4a144d61 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest.html @@ -0,0 +1,742 @@ + + + + UploadRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

UploadRequest

+
+
+ +
public class UploadRequest : DataRequest
+ +
+
+

DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + upload + +
    +
    +
    +
    +
    +
    +

    The UploadableConvertible value used to produce the Uploadable value for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let upload: UploadableConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileManager + +
    +
    +
    +
    +
    +
    +

    FileManager used to perform cleanup tasks, including the removal of multipart form encoded payloads written +to disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let fileManager: FileManager
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + uploadable + +
    +
    +
    +
    +
    +
    +

    Uploadable value used by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var uploadable: Uploadable?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public func cleanup()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest/Uploadable.html b/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest/Uploadable.html new file mode 100644 index 00000000..9540aee1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Classes/UploadRequest/Uploadable.html @@ -0,0 +1,701 @@ + + + + Uploadable Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Uploadable

+
+
+ +
public enum Uploadable
+
extension UploadRequest.Uploadable: UploadableConvertible
+ +
+
+

Type describing the origin of the upload, whether Data, file, or stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + data(_:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case data(Data)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + file(_:shouldRemove:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided file URL, as well as a Bool determining whether the source file should be +automatically removed once uploaded.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case file(URL, shouldRemove: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stream(_:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided InputStream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stream(InputStream)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+
    +
  • +
    + + + + createUploadable() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func createUploadable() throws -> UploadRequest.Uploadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums.html b/Carthage/Checkouts/Alamofire/docs/Enums.html new file mode 100644 index 00000000..826c5492 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums.html @@ -0,0 +1,660 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AFError + +
    +
    +
    +
    +
    +
    +

    AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with +their own associated reasons.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum AFError : Error
    +
    extension AFError: LocalizedError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AuthenticationError + +
    +
    +
    +
    +
    +
    +

    Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are +still vended from Alamofire as AFError types. The AuthenticationError instances will be embedded within +AFError .requestAdaptationFailed or .requestRetryFailed cases.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum AuthenticationError : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryResult + +
    +
    +
    +
    +
    +
    +

    Outcome of determination whether retry is necessary.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum RetryResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AF.html b/Carthage/Checkouts/Alamofire/docs/Enums/AF.html new file mode 100644 index 00000000..019be1bb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AF.html @@ -0,0 +1,2419 @@ + + + + AF Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AF

+
+
+
public enum AF
+ +
+
+

Global namespace containing API for the default Session instance.

+ +
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadRequest using the Session.default from the resumeData produced from a previous +DownloadRequest cancellation to retrieve the contents of the original request and save them to the destination.

    +
    +

    Note

    +

    If destination is not specified, the download will be moved to a temporary location determined by + Alamofire.

    + +
    +
    +

    Note

    +

    On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1), +resumeData is broken on background URL session configurations. There’s an underlying bug in the resumeData +generation logic where the data is written incorrectly and will always fail to resume the download. For more +information about the bug and possible workarounds, please refer to the this Stack Overflow post.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func download(resumingWith resumeData: Data,
    +                            interceptor: RequestInterceptor? = nil,
    +                            to destination: DownloadRequest.Destination? = nil) -> DownloadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + resumeData + + +
    +

    The resume Data. This is an opaque blob produced by URLSessionDownloadTask when a task is + cancelled. See Apple’s documentation + for more information.

    +
    +
    + + interceptor + + +
    +

    The RequestInterceptor, nil by default.

    +
    +
    + + destination + + +
    +

    The DownloadRequest.Destination closure used to determine the destination of the downloaded + file. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created DownloadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ + + +

Data

+
+
+ +
+
+
+ + + +

File

+
+
+ +
+
+ + +
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the multipart form data built using a closure and sent using the provided +URLRequest components and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                          to url: URLConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          method: HTTPMethod = .post,
    +                          headers: HTTPHeaders? = nil,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + convertible + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible +value, and a RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                          with request: URLRequestConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components +and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: MultipartFormData,
    +                          to url: URLConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          method: HTTPMethod = .post,
    +                          headers: HTTPHeaders? = nil,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible +value and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: MultipartFormData,
    +                          with request: URLRequestConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager instance to be used by the returned UploadRequest. .default instance by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError.html new file mode 100644 index 00000000..297818b0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError.html @@ -0,0 +1,2046 @@ + + + + AFError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AFError

+
+
+ +
public enum AFError : Error
+
extension AFError: LocalizedError
+ +
+
+

AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with +their own associated reasons.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Error Booleans +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .sessionDeinitialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionDeinitializedError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .sessionInvalidated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionInvalidatedError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .explicitlyCancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isExplicitlyCancelledError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInvalidURLError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is .invalidURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInvalidURLError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .parameterEncodingFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isParameterEncodingError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .parameterEncoderFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isParameterEncoderError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .multipartEncodingFailed. When true, the url and underlyingError +properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isMultipartEncodingError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .requestAdaptationFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isRequestAdaptationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .responseValidationFailed. When true, the acceptableContentTypes, +responseContentType, responseCode, and underlyingError properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResponseValidationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .responseSerializationFailed. When true, the failedStringEncoding and +underlyingError properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResponseSerializationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .serverTrustEvaluationFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isServerTrustEvaluationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isRequestRetryError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is requestRetryFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isRequestRetryError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is createUploadableFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCreateUploadableError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCreateURLRequestError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is downloadedFileMoveFailed. When true, the destination and underlyingError properties will +contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isDownloadedFileMoveError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSessionTaskError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionTaskError: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Convenience Properties +

+
+
+
    +
  • +
    + + + + urlConvertible + +
    +
    +
    +
    +
    +
    +

    The URLConvertible associated with the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var urlConvertible: URLConvertible? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL associated with the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + underlyingError + +
    +
    +
    +
    +
    +
    +

    The underlying Error responsible for generating the failure associated with .sessionInvalidated, +.parameterEncodingFailed, .parameterEncoderFailed, .multipartEncodingFailed, .requestAdaptationFailed, +.responseSerializationFailed, .requestRetryFailed errors.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var underlyingError: Error? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The acceptable Content-Types of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var acceptableContentTypes: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + responseContentType + +
    +
    +
    +
    +
    +
    +

    The response Content-Type of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var responseContentType: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + responseCode + +
    +
    +
    +
    +
    +
    +

    The response code of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var responseCode: Int? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failedStringEncoding + +
    +
    +
    +
    +
    +
    +

    The String.Encoding associated with a failed .stringResponse() call.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var failedStringEncoding: String.Encoding? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sourceURL + +
    +
    +
    +
    +
    +
    +

    The source URL of a .downloadedFileMoveFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sourceURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + destinationURL + +
    +
    +
    +
    +
    +
    +

    The destination URL of a .downloadedFileMoveFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var destinationURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + downloadResumeData + +
    +
    +
    +
    +
    +
    +

    The download resume data of any underlying network error. Only produced by DownloadRequests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var downloadResumeData: Data? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Error Descriptions +

+
+
+
    +
  • +
    + + + + errorDescription + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var errorDescription: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/MultipartEncodingFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/MultipartEncodingFailureReason.html new file mode 100644 index 00000000..5f3779c7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/MultipartEncodingFailureReason.html @@ -0,0 +1,930 @@ + + + + MultipartEncodingFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartEncodingFailureReason

+
+
+ +
public enum MultipartEncodingFailureReason
+ +
+
+

The underlying reason the .multipartEncodingFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The fileURL provided for reading an encodable body part isn’t a file URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartURLInvalid(url: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The filename of the fileURL provided has either an empty lastPathComponent or `pathExtension.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFilenameInvalid(in: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file at the fileURL provided was not reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileNotReachable(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Attempting to check the reachability of the fileURL provided threw an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileNotReachableWithError(atURL: URL, error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file at the fileURL provided is actually a directory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileIsDirectory(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The size of the file at the fileURL provided was not returned by the system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileSizeNotAvailable(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to find the size of the file at the fileURL provided threw an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An InputStream could not be created for the provided fileURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartInputStreamCreationFailed(for: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An OutputStream could not be created when attempting to write the encoded data to disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamCreationFailed(for: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The encoded body data could not be written to disk because a file already exists at the provided fileURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamFileAlreadyExists(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The fileURL provided for writing the encoded body data to disk is not a file URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamURLInvalid(url: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to write the encoded body data to disk failed with an underlying error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamWriteFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to read an encoded body part InputStream failed with underlying system error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputStreamReadFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason.html new file mode 100644 index 00000000..66620a82 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason.html @@ -0,0 +1,661 @@ + + + + ParameterEncoderFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoderFailureReason

+
+
+ +
public enum ParameterEncoderFailureReason
+ +
+
+

The underlying reason the .parameterEncoderFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + RequiredComponent + +
    +
    +
    +
    +
    +
    +

    Possible missing components.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum RequiredComponent
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A RequiredComponent was missing during encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingRequiredComponent(RequiredComponent)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoderFailed(error:) + +
    +
    +
    +
    +
    +
    +

    The underlying encoder failed with the associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case encoderFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html new file mode 100644 index 00000000..319050a9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html @@ -0,0 +1,633 @@ + + + + RequiredComponent Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequiredComponent

+
+
+ +
public enum RequiredComponent
+ +
+
+

Possible missing components.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL was missing or unable to be extracted from the passed URLRequest or during encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case url
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpMethod(rawValue:) + +
    +
    +
    +
    +
    +
    +

    The HTTPMethod could not be extracted from the passed URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpMethod(rawValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncodingFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncodingFailureReason.html new file mode 100644 index 00000000..8a6a80a8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ParameterEncodingFailureReason.html @@ -0,0 +1,660 @@ + + + + ParameterEncodingFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncodingFailureReason

+
+
+ +
public enum ParameterEncodingFailureReason
+ +
+
+

The underlying reason the .parameterEncodingFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + missingURL + +
    +
    +
    +
    +
    +
    +

    The URLRequest did not have a URL to encode.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingURL
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    JSON serialization failed with an underlying system error during the encoding process.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case jsonEncodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom parameter encoding failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customEncodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseSerializationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseSerializationFailureReason.html new file mode 100644 index 00000000..f5373b16 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseSerializationFailureReason.html @@ -0,0 +1,795 @@ + + + + ResponseSerializationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseSerializationFailureReason

+
+
+ +
public enum ResponseSerializationFailureReason
+ +
+
+

The underlying reason the response serialization error occurred.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The server response contained no data or the data was zero length.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputDataNilOrZeroLength
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + inputFileNil + +
    +
    +
    +
    +
    +
    +

    The file containing the server response did not exist.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputFileNil
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file containing the server response could not be read from the associated URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputFileReadFailed(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    String serialization failed using the provided String.Encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stringSerializationFailed(encoding: String.Encoding)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    JSON serialization failed with an underlying system error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case jsonSerializationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A DataDecoder failed to decode the response due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case decodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A custom response serializer failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customSerializationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Generic serialization failed for an empty response that wasn’t type Empty but instead the associated type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidEmptyResponse(type: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseValidationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseValidationFailureReason.html new file mode 100644 index 00000000..541e3591 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ResponseValidationFailureReason.html @@ -0,0 +1,742 @@ + + + + ResponseValidationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseValidationFailureReason

+
+
+ +
public enum ResponseValidationFailureReason
+ +
+
+

The underlying reason the .responseValidationFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataFileNil + +
    +
    +
    +
    +
    +
    +

    The data file containing the server response did not exist.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case dataFileNil
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The data file containing the server response at the associated URL could not be read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case dataFileReadFailed(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response did not contain a Content-Type and the acceptableContentTypes provided did not contain a +wildcard type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingContentType(acceptableContentTypes: [String])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response Content-Type did not match any type in the provided acceptableContentTypes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response status code was not acceptable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unacceptableStatusCode(code: Int)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom response validation failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customValidationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason.html new file mode 100644 index 00000000..375a5ccd --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason.html @@ -0,0 +1,958 @@ + + + + ServerTrustFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustFailureReason

+
+
+ +
public enum ServerTrustFailureReason
+ +
+
+

Underlying reason a server trust evaluation error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    +

    The output of a server trust evaluation.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Output
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    No ServerTrustEvaluator was found for the associated host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noRequiredEvaluator(host: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noCertificatesFound + +
    +
    +
    +
    +
    +
    +

    No certificates were found with which to perform the trust evaluation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noCertificatesFound
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noPublicKeysFound + +
    +
    +
    +
    +
    +
    +

    No public keys were found with which to perform the trust evaluation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noPublicKeysFound
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, application of the associated SecPolicy failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case policyApplicationFailed(trust: SecTrust, policy: SecPolicy, status: OSStatus)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, setting the associated anchor certificates failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case settingAnchorCertificatesFailed(status: OSStatus, certificates: [SecCertificate])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, creation of the revocation policy failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case revocationPolicyCreationFailed
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    SecTrust evaluation failed with the associated Error, if one was produced.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trustEvaluationFailed(error: Error?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Default evaluation failed with the associated Output.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case defaultEvaluationFailed(output: Output)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Host validation failed with the associated Output.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case hostValidationFailed(output: Output)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Revocation check failed with the associated Output and options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case revocationCheckFailed(output: Output, options: RevocationTrustEvaluator.Options)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Certificate pinning failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case certificatePinningFailed(host: String, trust: SecTrust, pinnedCertificates: [SecCertificate], serverCertificates: [SecCertificate])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Public key pinning failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom server trust evaluation failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customEvaluationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason/Output.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason/Output.html new file mode 100644 index 00000000..beca0ac2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/ServerTrustFailureReason/Output.html @@ -0,0 +1,687 @@ + + + + Output Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Output

+
+
+ +
public struct Output
+ +
+
+

The output of a server trust evaluation.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + host + +
    +
    +
    +
    +
    +
    +

    The host for which the evaluation was performed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let host: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trust + +
    +
    +
    +
    +
    +
    +

    The SecTrust value which was evaluated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let trust: SecTrust
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The OSStatus of evaluation operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let status: OSStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of the evaluation operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: SecTrustResultType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/URLRequestValidationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/URLRequestValidationFailureReason.html new file mode 100644 index 00000000..f247436b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/URLRequestValidationFailureReason.html @@ -0,0 +1,606 @@ + + + + URLRequestValidationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequestValidationFailureReason

+
+
+ +
public enum URLRequestValidationFailureReason
+ +
+
+

The underlying reason the .urlRequestValidationFailed

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    URLRequest with GET method had body data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyDataInGETRequest(Data)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AFError/UnexpectedInputStreamLength.html b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/UnexpectedInputStreamLength.html new file mode 100644 index 00000000..2c4efd90 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AFError/UnexpectedInputStreamLength.html @@ -0,0 +1,634 @@ + + + + UnexpectedInputStreamLength Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

UnexpectedInputStreamLength

+
+
+ +
public struct UnexpectedInputStreamLength : Error
+ +
+
+

Represents unexpected input stream length that occur when encoding the MultipartFormData. Instances will be +embedded within an AFError.multipartEncodingFailed .inputStreamReadFailed case.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + bytesExpected + +
    +
    +
    +
    +
    +
    +

    The expected byte count to read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bytesExpected: UInt64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bytesRead + +
    +
    +
    +
    +
    +
    +

    The actual byte count read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bytesRead: UInt64
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/AuthenticationError.html b/Carthage/Checkouts/Alamofire/docs/Enums/AuthenticationError.html new file mode 100644 index 00000000..1f8bdc0e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/AuthenticationError.html @@ -0,0 +1,635 @@ + + + + AuthenticationError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationError

+
+
+ +
public enum AuthenticationError : Error
+ +
+
+

Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are +still vended from Alamofire as AFError types. The AuthenticationError instances will be embedded within +AFError .requestAdaptationFailed or .requestRetryFailed cases.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + missingCredential + +
    +
    +
    +
    +
    +
    +

    The credential was missing so the request could not be authenticated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + excessiveRefresh + +
    +
    +
    +
    +
    +
    +

    The credential was refreshed too many times within the RefreshWindow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case excessiveRefresh
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/HTTPMethod.html b/Carthage/Checkouts/Alamofire/docs/Enums/HTTPMethod.html new file mode 100644 index 00000000..dbdfd33c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/HTTPMethod.html @@ -0,0 +1,681 @@ + + + + HTTPMethod Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPMethod

+
+
+
public enum HTTPMethod : String
+ +
+
+

HTTP method definitions.

+ +

See https://tools.ietf.org/html/rfc7231#section-4.3

+ +
+
+ +
+
+
+
    +
  • +
    + + + + connect + +
    +
    +
    +
    +
    +
    +

    CONNECT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case connect = "CONNECT"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delete + +
    +
    +
    +
    +
    +
    +

    DELETE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case delete = "DELETE"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get + +
    +
    +
    +
    +
    +
    +

    GET method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case get = "GET"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + head + +
    +
    +
    +
    +
    +
    +

    HEAD method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case head = "HEAD"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    OPTIONS method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case options = "OPTIONS"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + patch + +
    +
    +
    +
    +
    +
    +

    PATCH method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case patch = "PATCH"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + post + +
    +
    +
    +
    +
    +
    +

    POST method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case post = "POST"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + put + +
    +
    +
    +
    +
    +
    +

    PUT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case put = "PUT"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trace + +
    +
    +
    +
    +
    +
    +

    TRACE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trace = "TRACE"
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/Result.html b/Carthage/Checkouts/Alamofire/docs/Enums/Result.html new file mode 100644 index 00000000..3c425f6e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/Result.html @@ -0,0 +1,1242 @@ + + + + Result Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Result

+
+
+
public enum Result<Value>
+ +
+
+

Used to represent whether a request was successful or encountered an error.

+ +
    +
  • success: The request and all post processing operations were successful resulting in the serialization of the + provided associated value.

  • +
  • failure: The request encountered an error resulting in a failure. The associated values are the original data + provided by the server as well as the error that caused the failure.

  • +
+ +
+
+ +
+
+
+
    +
  • +
    + + + + success(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case success(Value)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failure(Error)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns true if the result is a success, false otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isFailure + +
    +
    +
    +
    +
    +
    +

    Returns true if the result is a failure, false otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isFailure: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value if the result is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Error? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes whether the result was a +success or failure in addition to the value or error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + init(value:) + +
    +
    +
    +
    +
    +
    +

    Creates a Result instance from the result of a closure.

    + +

    A failure result is created when the closure throws, and a success result is created when the closure +succeeds without throwing an error.

    +
    func someString() throws -> String { ... }
    +
    +let result = Result(value: {
    +    return try someString()
    +})
    +
    +// The type of result is Result<String>
    +
    + +

    The trailing closure syntax is also supported:

    +
    let result = Result { try someString() }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(value: () throws -> Value)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The closure to execute and create the result for.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + unwrap() + +
    +
    +
    +
    +
    +
    +

    Returns the success value, or throws the failure error.

    +
    let possibleString: Result<String> = .success("success")
    +try print(possibleString.unwrap())
    +// Prints "success"
    +
    +let noString: Result<String> = .failure(error)
    +try print(noString.unwrap())
    +// Throws error
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func unwrap() throws -> Value
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: Result<Data> = .success(Data())
    +let possibleInt = possibleData.map { $0.count }
    +try print(possibleInt.unwrap())
    +// Prints "0"
    +
    +let noData: Result<Data> = .failure(error)
    +let noInt = noData.map { $0.count }
    +try print(noInt.unwrap())
    +// Throws error
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<T>(_ transform: (Value) -> T) -> Result<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the Result instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + flatMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the flatMap method with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data> = .success(Data(...))
    +let possibleObject = possibleData.flatMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: Result<Data> = .failure(someError)
    +let withMyError: Result<Data> = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<T>(_ transform: (Error) -> T) -> Result where T : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same instance.

    +
    +
    +
    +
  • +
  • +
    + + + + flatMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the flatMapError function with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data> = .success(Data(...))
    +let possibleObject = possibleData.flatMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flatMapError<T>(_ transform: (Error) throws -> T) -> Result where T : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same instance.

    +
    +
    +
    +
  • +
  • +
    + + + + withValue(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the withValue function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func withValue(_ closure: (Value) throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A closure that takes the success value of this instance.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + withError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the withError function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func withError(_ closure: (Error) throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A closure that takes the success value of this instance.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + ifSuccess(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success.

    + +

    Use the ifSuccess function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func ifSuccess(_ closure: () throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A Void closure.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + ifFailure(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure.

    + +

    Use the ifFailure function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func ifFailure(_ closure: () throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A Void closure.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Enums/RetryResult.html b/Carthage/Checkouts/Alamofire/docs/Enums/RetryResult.html new file mode 100644 index 00000000..a9aa6ab4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Enums/RetryResult.html @@ -0,0 +1,687 @@ + + + + RetryResult Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RetryResult

+
+
+ +
public enum RetryResult
+ +
+
+

Outcome of determination whether retry is necessary.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + retry + +
    +
    +
    +
    +
    +
    +

    Retry should be attempted immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case retry
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryWithDelay(_:) + +
    +
    +
    +
    +
    +
    +

    Retry should be attempted after the associated TimeInterval.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case retryWithDelay(TimeInterval)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotRetry + +
    +
    +
    +
    +
    +
    +

    Do not retry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotRetry
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Do not retry due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotRetryWithError(Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions.html b/Carthage/Checkouts/Alamofire/docs/Extensions.html new file mode 100644 index 00000000..690dcaad --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions.html @@ -0,0 +1,1098 @@ + + + + Extensions Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Error + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

System Type Extensions +

+
+
+ +
+
+
    +
  • +
    + + + + Notification + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Notification
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataDecoder Protocol +

+
+
+ +
+
+
+ + +
+ +

Extensions +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Array.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Array.html new file mode 100644 index 00000000..023fe177 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Array.html @@ -0,0 +1,650 @@ + + + + Array Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Array

+
+
+ +
extension Array: AlamofireExtended
+
extension Array where Element == ServerTrustEvaluating
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where Element == ServerTrustEvaluating +

+
+
+
    +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given SecTrust value for the given host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + trust + + +
    +

    The SecTrust value to evaluate.

    +
    +
    + + host + + +
    +

    The host for which to evaluate the SecTrust value.

    +
    +
    +
    +
    +

    Return Value

    +

    Whether or not the evaluator considers the SecTrust value valid for host.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Bundle.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Bundle.html new file mode 100644 index 00000000..210c154b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Bundle.html @@ -0,0 +1,494 @@ + + + + Bundle Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Bundle

+
+
+
class Bundle : NSObject
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Returns all valid cer, crt, and der certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    Returns all public keys for the valid certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/CharacterSet.html b/Carthage/Checkouts/Alamofire/docs/Extensions/CharacterSet.html new file mode 100644 index 00000000..7a04dc6d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/CharacterSet.html @@ -0,0 +1,616 @@ + + + + CharacterSet Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CharacterSet

+
+
+ +
extension CharacterSet
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + afURLQueryAllowed + +
    +
    +
    +
    +
    +
    +

    Creates a CharacterSet from RFC 3986 allowed characters.

    + +

    RFC 3986 states that the following characters are “reserved” characters.

    + +
      +
    • General Delimiters: “:”, “#”, “[”, “]”, “@”, “?”, “/”
    • +
    • Sub-Delimiters: “!”, “$”, “&”, “‘”, “(”, “)”, “*”, “+”, “,”, “;”, “=”
    • +
    + +

    In RFC 3986 - Section 3.4, it states that the “?” and “/” characters should not be escaped to allow +query strings to include a URL. Therefore, all “reserved” characters with the exception of “?” and “/” +should be percent-escaped in the query string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let afURLQueryAllowed: CharacterSet
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Collection.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Collection.html new file mode 100644 index 00000000..ca43a4d3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Collection.html @@ -0,0 +1,530 @@ + + + + Collection Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Collection

+
+
+
extension Collection where Element == String
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where Element == String

+

+
+
+
    +
  • +
    + + + + qualityEncoded() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func qualityEncoded() -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/DispatchQueue.html b/Carthage/Checkouts/Alamofire/docs/Extensions/DispatchQueue.html new file mode 100644 index 00000000..d2ee5f38 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/DispatchQueue.html @@ -0,0 +1,552 @@ + + + + DispatchQueue Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DispatchQueue

+
+
+
extension DispatchQueue
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + after(_:execute:) + +
    +
    +
    +
    +
    +
    +

    Execute the provided closure after a TimeInterval.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func after(_ delay: TimeInterval, execute closure: @escaping () -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + delay + + +
    +

    TimeInterval to delay execution.

    +
    +
    + + closure + + +
    +

    Closure to execute.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Error.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Error.html new file mode 100644 index 00000000..1d503fb3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Error.html @@ -0,0 +1,632 @@ + + + + Error Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
extension Error
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asAFError + +
    +
    +
    +
    +
    +
    +

    Returns the instance cast as an AFError.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var asAFError: AFError? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the instance cast as an AFError. If casting fails, a fatalError with the specified message is thrown.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asAFError(orFailWith message: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> AFError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/HTTPURLResponse.html b/Carthage/Checkouts/Alamofire/docs/Extensions/HTTPURLResponse.html new file mode 100644 index 00000000..3376d1ac --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/HTTPURLResponse.html @@ -0,0 +1,605 @@ + + + + HTTPURLResponse Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPURLResponse

+
+
+ +
extension HTTPURLResponse
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns allHeaderFields as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Notification.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Notification.html new file mode 100644 index 00000000..12e5f6dc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Notification.html @@ -0,0 +1,605 @@ + + + + Notification Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Notification

+
+
+ +
extension Notification
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The Request contained by the instance’s userInfo, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var request: Request? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/NotificationCenter.html b/Carthage/Checkouts/Alamofire/docs/Extensions/NotificationCenter.html new file mode 100644 index 00000000..6adf7a04 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/NotificationCenter.html @@ -0,0 +1,552 @@ + + + + NotificationCenter Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NotificationCenter

+
+
+
extension NotificationCenter
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Convenience function for posting notifications with Request payloads.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func postNotification(named name: Notification.Name, with request: Request)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The name of the notification.

    +
    +
    + + request + + +
    +

    The Request payload.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/OperationQueue.html b/Carthage/Checkouts/Alamofire/docs/Extensions/OperationQueue.html new file mode 100644 index 00000000..e231ef7a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/OperationQueue.html @@ -0,0 +1,593 @@ + + + + OperationQueue Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

OperationQueue

+
+
+
extension OperationQueue
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    convenience init(qualityOfService: QualityOfService = .default,
    +                 maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount,
    +                 underlyingQueue: DispatchQueue? = nil,
    +                 name: String? = nil,
    +                 startSuspended: Bool = false)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + qualityOfService + + +
    +

    QualityOfService to be applied to the queue. .default by default.

    +
    +
    + + maxConcurrentOperationCount + + +
    +

    Maximum concurrent operations. + OperationQueue.defaultMaxConcurrentOperationCount by default.

    +
    +
    + + underlyingQueue + + +
    +

    Underlying DispatchQueue. nil by default.

    +
    +
    + + name + + +
    +

    Name for the queue. nil by default.

    +
    +
    + + startSuspended + + +
    +

    Whether the queue starts suspended. false by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/Result.html b/Carthage/Checkouts/Alamofire/docs/Extensions/Result.html new file mode 100644 index 00000000..72b38941 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/Result.html @@ -0,0 +1,722 @@ + + + + Result Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Result

+
+
+
extension Result
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Returns the associated value if the result is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var success: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var failure: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(value:error:) + +
    +
    +
    +
    +
    +
    +

    Initializes a Result from value or error. Returns .failure if the error is non-nil, .success otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    init(value: Success, error: Failure?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + value + + +
    +

    A value.

    +
    +
    + + error + + +
    +

    An Error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data, Error> = .success(Data(...))
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> Result<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data, Error> = .success(Data(...))
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> Result<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same success.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/SCNetworkReachabilityFlags.html b/Carthage/Checkouts/Alamofire/docs/Extensions/SCNetworkReachabilityFlags.html new file mode 100644 index 00000000..4140eac8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/SCNetworkReachabilityFlags.html @@ -0,0 +1,683 @@ + + + + SCNetworkReachabilityFlags Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SCNetworkReachabilityFlags

+
+
+
extension SCNetworkReachabilityFlags
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + isReachable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isConnectionRequired + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isConnectionRequired: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var canConnectAutomatically: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var canConnectWithoutUserInteraction: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isActuallyReachable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isActuallyReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isCellular + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isCellular: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + readableDescription + +
    +
    +
    +
    +
    +
    +

    Human readable String for all states, to help with debugging.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var readableDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/SecTrust.html b/Carthage/Checkouts/Alamofire/docs/Extensions/SecTrust.html new file mode 100644 index 00000000..0ecff22b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/SecTrust.html @@ -0,0 +1,683 @@ + + + + SecTrust Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SecTrust

+
+
+
class SecTrust : _CFObject
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(policy:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func apply(policy: SecPolicy) throws -> SecTrust
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func setAnchorCertificates(_ certificates: [SecCertificate]) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    The public keys contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificateData + +
    +
    +
    +
    +
    +
    +

    The Data values for all certificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var certificateData: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func performDefaultEvaluation(forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validateHost(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validateHost(_ host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/String.html b/Carthage/Checkouts/Alamofire/docs/Extensions/String.html new file mode 100644 index 00000000..397f663d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/String.html @@ -0,0 +1,614 @@ + + + + String Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

String

+
+
+ +
extension String: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL if self can be used to initialize a URL instance, otherwise throws.

    +
    +

    Throws

    + An AFError.invalidURL instance. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL initialized with self.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/URL.html b/Carthage/Checkouts/Alamofire/docs/Extensions/URL.html new file mode 100644 index 00000000..75892991 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/URL.html @@ -0,0 +1,605 @@ + + + + URL Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URL

+
+
+ +
extension URL: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/URLComponents.html b/Carthage/Checkouts/Alamofire/docs/Extensions/URLComponents.html new file mode 100644 index 00000000..20e8ca5d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/URLComponents.html @@ -0,0 +1,614 @@ + + + + URLComponents Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLComponents

+
+
+ +
extension URLComponents: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL if the self‘s url is not nil, otherwise throws.

    +
    +

    Throws

    + An AFError.invalidURL instance. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL from the url property.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/URLRequest.html b/Carthage/Checkouts/Alamofire/docs/Extensions/URLRequest.html new file mode 100644 index 00000000..43f8d612 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/URLRequest.html @@ -0,0 +1,762 @@ + + + + URLRequest Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequest

+
+
+ +
extension URLRequest
+
extension URLRequest: URLRequestConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns allHTTPHeaderFields as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    +

    Returns self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the specified url, method, and headers.

    +
    +

    Throws

    + Any error thrown while converting the URLConvertible to a URL. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + url + + +
    +

    The URLConvertible value.

    +
    +
    + + method + + +
    +

    The HTTPMethod.

    +
    +
    + + headers + + +
    +

    The HTTPHeaders, nil by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + method + +
    +
    +
    +
    +
    +
    +

    Returns the httpMethod as Alamofire’s HTTPMethod type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var method: HTTPMethod? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func validate() throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Extensions/URLSessionConfiguration.html b/Carthage/Checkouts/Alamofire/docs/Extensions/URLSessionConfiguration.html new file mode 100644 index 00000000..9666bb70 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Extensions/URLSessionConfiguration.html @@ -0,0 +1,606 @@ + + + + URLSessionConfiguration Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLSessionConfiguration

+
+
+ +
extension URLSessionConfiguration
+
extension URLSessionConfiguration: AlamofireExtended
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns httpAdditionalHeaders as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Functions.html b/Carthage/Checkouts/Alamofire/docs/Functions.html new file mode 100644 index 00000000..9debbb7c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Functions.html @@ -0,0 +1,494 @@ + + + + Functions Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (77% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Functions

+

The following functions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Returns whether the two network reachability status values are equal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==(
    +    lhs: NetworkReachabilityManager.NetworkReachabilityStatus,
    +    rhs: NetworkReachabilityManager.NetworkReachabilityStatus)
    +    -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + lhs + + +
    +

    The left-hand side value to compare.

    +
    +
    + + rhs + + +
    +

    The right-hand side value to compare.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the two values are equal, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Global Variables.html b/Carthage/Checkouts/Alamofire/docs/Global Variables.html new file mode 100644 index 00000000..9a003540 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Global Variables.html @@ -0,0 +1,599 @@ + + + + Global Variables Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Global Variables

+

The following global variables are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AF + +
    +
    +
    +
    +
    +
    +

    Reference to Session.default for quick bootstrapping and examples.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let AF: Session
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols.html b/Carthage/Checkouts/Alamofire/docs/Protocols.html new file mode 100644 index 00000000..55731f67 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols.html @@ -0,0 +1,1337 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AlamofireExtended + +
    +
    +
    +
    +
    +
    +

    Protocol describing the af extension points for Alamofire extended types.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AlamofireExtended
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

    + +

    One common example of an AuthenticationCredential is an OAuth2 credential containing an access token used to +authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes +which will then require a refresh of the credential using the refresh token to generate a new access token.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AuthenticationCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Authenticator + +
    +
    +
    +
    +
    +
    +

    Types adopting the Authenticator protocol can be used to authenticate URLRequests with an +AuthenticationCredential as well as refresh the AuthenticationCredential when required.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Authenticator : AnyObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    A type that handles whether the data task should store the HTTP response in the cache.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CachedResponseHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EventMonitor + +
    +
    +
    +
    +
    +
    +

    Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +URLSession delegate protocols as well as various events from the lifetime of Request and its subclasses.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParameterEncoder + +
    +
    +
    +
    +
    +
    +

    A type that can encode any Encodable type into a URLRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ParameterEncoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParameterEncoding + +
    +
    +
    +
    +
    +
    +

    A type used to define how a set of parameters are applied to a URLRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RedirectHandler + +
    +
    +
    +
    +
    +
    +

    A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RedirectHandler
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocol Conformances +

+
+
+
    +
  • +
    + + + + RequestDelegate + +
    +
    +
    +
    +
    +
    +

    Protocol abstraction for Request‘s communication back to the SessionDelegate.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestDelegate : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+ +
+
+
    +
  • +
    + + + + RequestInterceptor + +
    +
    +
    +
    +
    +
    +

    Type that provides both RequestAdapter and RequestRetrier functionality.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestInterceptor : RequestAdapter, RequestRetrier
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestAdapter + +
    +
    +
    +
    +
    +
    +

    A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestAdapter
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestRetrier + +
    +
    +
    +
    +
    +
    +

    A type that determines whether a request should be retried after being executed by the specified session manager +and encountering an error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestRetrier
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The type to which all data response serializers must conform in order to serialize a response.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The type to which all download response serializers must conform in order to serialize a response.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DownloadResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ResponseSerializer + +
    +
    +
    +
    +
    +
    +

    A serializer that can handle both data and download responses.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ResponseSerializer : DataResponseSerializerProtocol, DownloadResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataPreprocessor + +
    +
    +
    +
    +
    +
    +

    Type used to preprocess Data before it handled by a serializer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataPreprocessor
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + EmptyResponse + +
    +
    +
    +
    +
    +
    +

    Protocol representing an empty response. Use T.emptyValue() to get an instance.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EmptyResponse
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataDecoder Protocol +

+
+
+
    +
  • +
    + + + + DataDecoder + +
    +
    +
    +
    +
    +
    +

    Any type which can decode Data into a Decodable type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataDecoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + DataStreamSerializer + +
    +
    +
    +
    +
    +
    +

    A type which can serialize incoming Data.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataStreamSerializer
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ServerTrustEvaluating + +
    +
    +
    +
    +
    +
    +

    A protocol describing the API used to evaluate server trusts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + URLConvertible + +
    +
    +
    +
    +
    +
    +

    Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct +URLRequests.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol URLConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + URLRequestConvertible + +
    +
    +
    +
    +
    +
    +

    Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/AlamofireExtended.html b/Carthage/Checkouts/Alamofire/docs/Protocols/AlamofireExtended.html new file mode 100644 index 00000000..cf5c7de5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/AlamofireExtended.html @@ -0,0 +1,676 @@ + + + + AlamofireExtended Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireExtended

+
+
+ +
public protocol AlamofireExtended
+ +
+
+

Protocol describing the af extension points for Alamofire extended types.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ExtendedType + +
    +
    +
    +
    +
    +
    +

    Type being extended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype ExtendedType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + af + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Static Alamofire extension point.

    + +
    +

    Default Implementation

    +
    +

    Static Alamofire extension point.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var af: AlamofireExtension<ExtendedType>.Type { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + af + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Instance Alamofire extension point.

    + +
    +

    Default Implementation

    +
    +

    Instance Alamofire extension point.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var af: AlamofireExtension<ExtendedType> { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/AuthenticationCredential.html b/Carthage/Checkouts/Alamofire/docs/Protocols/AuthenticationCredential.html new file mode 100644 index 00000000..848fcc73 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/AuthenticationCredential.html @@ -0,0 +1,616 @@ + + + + AuthenticationCredential Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationCredential

+
+
+ +
public protocol AuthenticationCredential
+ +
+
+

Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

+ +

One common example of an AuthenticationCredential is an OAuth2 credential containing an access token used to +authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes +which will then require a refresh of the credential using the refresh token to generate a new access token.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requiresRefresh + +
    +
    +
    +
    +
    +
    +

    Whether the credential requires a refresh. This property should always return true when the credential is +expired. It is also wise to consider returning true when the credential will expire in several seconds or +minutes depending on the expiration window of the credential.

    + +

    For example, if the credential is valid for 60 minutes, then it would be wise to return true when the +credential is only valid for 5 minutes or less. That ensures the credential will not expire as it is passed +around backend services.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var requiresRefresh: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/Authenticator.html b/Carthage/Checkouts/Alamofire/docs/Protocols/Authenticator.html new file mode 100644 index 00000000..1d731433 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/Authenticator.html @@ -0,0 +1,929 @@ + + + + Authenticator Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Authenticator

+
+
+ +
public protocol Authenticator : AnyObject
+ +
+
+

Types adopting the Authenticator protocol can be used to authenticate URLRequests with an +AuthenticationCredential as well as refresh the AuthenticationCredential when required.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Credential + +
    +
    +
    +
    +
    +
    +

    The type of credential associated with the Authenticator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype Credential : AuthenticationCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(_:to:) + +
    +
    +
    +
    +
    +
    +

    Applies the Credential to the URLRequest.

    + +

    In the case of OAuth2, the access token of the Credential would be added to the URLRequest as a Bearer +token to the Authorization header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func apply(_ credential: Credential, to urlRequest: inout URLRequest)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + credential + + +
    +

    The Credential.

    +
    +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Refreshes the Credential and executes the completion closure with the Result once complete.

    + +

    Refresh can be called in one of two ways. It can be called before the Request is actually executed due to +a requiresRefresh returning true during the adapt portion of the Request creation process. It can also +be triggered by a failed Request where the authentication server denied access due to an expired or +invalidated access token.

    + +

    In the case of OAuth2, this method would use the refresh token of the Credential to generate a new +Credential using the authentication service. Once complete, the completion closure should be called with +the new Credential, or the error that occurred.

    + +

    In general, if the refresh call fails with certain status codes from the authentication server (commonly a 401), +the refresh token in the Credential can no longer be used to generate a valid Credential. In these cases, +you will need to reauthenticate the user with their username / password.

    + +

    Please note, these are just general examples of common use cases. They are not meant to solve your specific +authentication server challenges. Please work with your authentication server team to ensure your +Authenticator logic matches their expectations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func refresh(_ credential: Credential, for session: Session, completion: @escaping (Result<Credential, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + credential + + +
    +

    The Credential to refresh.

    +
    +
    + + session + + +
    +

    The Session requiring the refresh.

    +
    +
    + + completion + + +
    +

    The closure to be executed once the refresh is complete.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether the URLRequest failed due to an authentication error based on the HTTPURLResponse.

    + +

    If the authentication server CANNOT invalidate credentials after they are issued, then simply return false +for this method. If the authentication server CAN invalidate credentials due to security breaches, then you +will need to work with your authentication server team to understand how to identify when this occurs.

    + +

    In the case of OAuth2, where an authentication server can invalidate credentials, you will need to inspect the +HTTPURLResponse or possibly the Error for when this occurs. This is commonly handled by the authentication +server returning a 401 status code and some additional header to indicate an OAuth2 failure occurred.

    + +

    It is very important to understand how your authentication server works to be able to implement this correctly. +For example, if your authentication server returns a 401 when an OAuth2 error occurs, and your downstream +service also returns a 401 when you are not authorized to perform that operation, how do you know which layer +of the backend returned you a 401? You do not want to trigger a refresh unless you know your authentication +server is actually the layer rejecting the request. Again, work with your authentication server team to understand +how to identify an OAuth2 401 error vs. a downstream 401 error to avoid endless refresh loops.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse.

    +
    +
    + + error + + +
    +

    The Error.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the URLRequest failed due to an authentication error, false otherwise.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether the URLRequest is authenticated with the Credential.

    + +

    If the authentication server CANNOT invalidate credentials after they are issued, then simply return true +for this method. If the authentication server CAN invalidate credentials due to security breaches, then +read on.

    + +

    When an authentication server can invalidate credentials, it means that you may have a non-expired credential +that appears to be valid, but will be rejected by the authentication server when used. Generally when this +happens, a number of requests are all sent when the application is foregrounded, and all of them will be +rejected by the authentication server in the order they are received. The first failed request will trigger a +refresh internally, which will update the credential, and then retry all the queued requests with the new +credential. However, it is possible that some of the original requests will not return from the authentication +server until the refresh has completed. This is where this method comes in.

    + +

    When the authentication server rejects a credential, we need to check to make sure we haven’t refreshed the +credential while the request was in flight. If it has already refreshed, then we don’t need to trigger an +additional refresh. If it hasn’t refreshed, then we need to refresh.

    + +

    Now that it is understood how the result of this method is used in the refresh lifecyle, let’s walk through how +to implement it. You should return true in this method if the URLRequest is authenticated in a way that +matches the values in the Credential. In the case of OAuth2, this would mean that the Bearer token in the +Authorization header of the URLRequest matches the access token in the Credential. If it matches, then we +know the Credential was used to authenticate the URLRequest and should return true. If the Bearer token +did not match the access token, then you should return false.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: Credential) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    + + credential + + +
    +

    The Credential.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the URLRequest is authenticated with the Credential, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/CachedResponseHandler.html b/Carthage/Checkouts/Alamofire/docs/Protocols/CachedResponseHandler.html new file mode 100644 index 00000000..b1d1b943 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/CachedResponseHandler.html @@ -0,0 +1,785 @@ + + + + CachedResponseHandler Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CachedResponseHandler

+
+
+ +
public protocol CachedResponseHandler
+ +
+
+

A type that handles whether the data task should store the HTTP response in the cache.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether the HTTP response should be stored in the cache.

    + +

    The completion closure should be passed one of three possible options:

    + +
      +
    1. The cached response provided by the server (this is the most common use case).
    2. +
    3. A modified version of the cached response (you may want to modify it in some way before caching).
    4. +
    5. A nil value to prevent the cached response from being stored in the cache.
    6. +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func dataTask(_ task: URLSessionDataTask,
    +              willCacheResponse response: CachedURLResponse,
    +              completion: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + task + + +
    +

    The data task whose request resulted in the cached response.

    +
    +
    + + response + + +
    +

    The cached response to potentially store in the cache.

    +
    +
    + + completion + + +
    +

    The closure to execute containing cached response, a modified response, or nil.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == ResponseCacher +

+
+
+
    +
  • +
    + + + + cache + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a ResponseCacher which caches the response, if allowed. Equivalent to ResponseCacher.cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var cache: ResponseCacher { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a ResponseCacher which does not cache the response. Equivalent to ResponseCacher.doNotCache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var doNotCache: ResponseCacher { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a ResponseCacher which modifies the proposed CachedURLResponse using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func modify(using closure: @escaping ((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)) -> ResponseCacher
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    Closure used to modify the CachedURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The ResponseCacher.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/DataDecoder.html b/Carthage/Checkouts/Alamofire/docs/Protocols/DataDecoder.html new file mode 100644 index 00000000..4dc9c1c5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/DataDecoder.html @@ -0,0 +1,646 @@ + + + + DataDecoder Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataDecoder

+
+
+ +
public protocol DataDecoder
+ +
+
+

Any type which can decode Data into a Decodable type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + decode(_:from:) + +
    +
    +
    +
    +
    +
    +

    Decode Data into the provided type.

    +
    +

    Throws

    +

    Any error that occurs during decode.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func decode<D>(_ type: D.Type, from data: Data) throws -> D where D : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    The Type to be decoded.

    +
    +
    + + data + + +
    +

    The Data to be decoded.

    +
    +
    +
    +
    +

    Return Value

    +

    The decoded value of type D.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/DataPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/Protocols/DataPreprocessor.html new file mode 100644 index 00000000..3f4df571 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/DataPreprocessor.html @@ -0,0 +1,711 @@ + + + + DataPreprocessor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataPreprocessor

+
+
+ +
public protocol DataPreprocessor
+ +
+
+

Type used to preprocess Data before it handled by a serializer.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    +

    Process Data before it’s handled by a serializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + data + + +
    +

    The raw Data to process.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PassthroughPreprocessor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == GoogleXSSIPreprocessor +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/DataResponseSerializerProtocol.html b/Carthage/Checkouts/Alamofire/docs/Protocols/DataResponseSerializerProtocol.html new file mode 100644 index 00000000..fcb983b8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/DataResponseSerializerProtocol.html @@ -0,0 +1,697 @@ + + + + DataResponseSerializerProtocol Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponseSerializerProtocol

+
+
+ +
public protocol DataResponseSerializerProtocol
+ +
+
+

The type to which all data response serializers must conform in order to serialize a response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    The type of serialized object to be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Serialize the response Data into the provided type..

    +
    +

    Throws

    +

    Any Error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest which was used to perform the request, if any.

    +
    +
    + + response + + +
    +

    HTTPURLResponse received from the server, if any.

    +
    +
    + + data + + +
    +

    Data returned from the server, if any.

    +
    +
    + + error + + +
    +

    Error produced by Alamofire or the underlying URLSession during the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The SerializedObject.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/DataStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/Protocols/DataStreamSerializer.html new file mode 100644 index 00000000..a25aa9b8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/DataStreamSerializer.html @@ -0,0 +1,832 @@ + + + + DataStreamSerializer Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamSerializer

+
+
+ +
public protocol DataStreamSerializer
+ +
+
+

A type which can serialize incoming Data.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    Type produced from the serialized Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    +

    Serializes incoming Data into a SerializedObject value.

    +
    +

    Throws

    +

    Any error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serialize(_ data: Data) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + data + + +
    +

    Data to be serialized.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ + +
+ +

Available where Self == PassthroughStreamSerializer +

+
+
+ +
+
+
+ + +
+ +

Available where Self == StringStreamSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/DownloadResponseSerializerProtocol.html b/Carthage/Checkouts/Alamofire/docs/Protocols/DownloadResponseSerializerProtocol.html new file mode 100644 index 00000000..c5682038 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/DownloadResponseSerializerProtocol.html @@ -0,0 +1,740 @@ + + + + DownloadResponseSerializerProtocol Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponseSerializerProtocol

+
+
+ +
public protocol DownloadResponseSerializerProtocol
+ +
+
+

The type to which all download response serializers must conform in order to serialize a response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    The type of serialized object to be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Serialize the downloaded response Data from disk into the provided type..

    +
    +

    Throws

    +

    Any Error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest which was used to perform the request, if any.

    +
    +
    + + response + + +
    +

    HTTPURLResponse received from the server, if any.

    +
    +
    + + fileURL + + +
    +

    File URL to which the response data was downloaded.

    +
    +
    + + error + + +
    +

    Error produced by Alamofire or the underlying URLSession during the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The SerializedObject.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == URLResponseSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/EmptyResponse.html b/Carthage/Checkouts/Alamofire/docs/Protocols/EmptyResponse.html new file mode 100644 index 00000000..ba91d543 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/EmptyResponse.html @@ -0,0 +1,610 @@ + + + + EmptyResponse Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

EmptyResponse

+
+
+ +
public protocol EmptyResponse
+ +
+
+

Protocol representing an empty response. Use T.emptyValue() to get an instance.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + emptyValue() + +
    +
    +
    +
    +
    +
    +

    Empty value for the conforming type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func emptyValue() -> Self
    + +
    +
    +
    +

    Return Value

    +

    Value of Self to use for empty values.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/EventMonitor.html b/Carthage/Checkouts/Alamofire/docs/Protocols/EventMonitor.html new file mode 100644 index 00000000..b687d19d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/EventMonitor.html @@ -0,0 +1,2317 @@ + + + + EventMonitor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

EventMonitor

+
+
+ +
public protocol EventMonitor
+ +
+
+

Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +URLSession delegate protocols as well as various events from the lifetime of Request and its subclasses.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + queue + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    The DispatchQueue onto which Alamofire’s root CompositeEventMonitor will dispatch events. .main by default.

    + +
    +

    Default Implementation

    +
    +

    The default queue on which CompositeEventMonitors will call the EventMonitor methods. .main by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var queue: DispatchQueue { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:didBecomeInvalidWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDelegate‘s urlSession(_:didBecomeInvalidWithError:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionTaskDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:task:didReceive:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didReceive:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                task: URLSessionTask,
    +                didSendBodyData bytesSent: Int64,
    +                totalBytesSent: Int64,
    +                totalBytesExpectedToSend: Int64)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:taskNeedsNewBodyStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:needNewBodyStream:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:willPerformHTTPRedirection:newRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                task: URLSessionTask,
    +                willPerformHTTPRedirection response: HTTPURLResponse,
    +                newRequest request: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:didFinishCollecting:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didFinishCollecting:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:didCompleteWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didCompleteWithError:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:taskIsWaitingForConnectivity:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:taskIsWaitingForConnectivity:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDataDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:dataTask:didReceive:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:) method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:dataTask:willCacheResponse:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:willCacheResponse:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDownloadDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                downloadTask: URLSessionDownloadTask,
    +                didResumeAtOffset fileOffset: Int64,
    +                expectedTotalBytes: Int64)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                downloadTask: URLSessionDownloadTask,
    +                didWriteData bytesWritten: Int64,
    +                totalBytesWritten: Int64,
    +                totalBytesExpectedToWrite: Int64)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:downloadTask:didFinishDownloadingTo:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didFinishDownloadingTo:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Request Events +

+
+
+
    +
  • +
    + + + + request(_:didCreateInitialURLRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a URLRequest is first created for a Request. If a RequestAdapter is active, the +URLRequest will be adapted before being issued.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToCreateURLRequestWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when the attempt to create a URLRequest from a Request‘s original URLRequestConvertible value fails.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didAdaptInitialRequest:to:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a RequestAdapter adapts the Request‘s initial URLRequest.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToAdaptURLRequest:withError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a RequestAdapter fails to adapt the Request‘s initial URLRequest.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCreateURLRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a final URLRequest is created for a Request.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCreateTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a URLSessionTask subclass instance is created for a Request.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didGatherMetrics:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a URLSessionTaskMetrics value.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailTask:earlyWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request fails due to an error created by Alamofire. e.g. When certificate pinning fails.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCompleteTask:with:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s task completes, possibly with an error. A Request may receive this event +multiple times if it is retried.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestIsRetrying(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request is about to be retried.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestIsRetrying(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidFinish(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request finishes and response serializers are being called.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidFinish(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidResume(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a resume call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidResume(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didResumeTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is resumed.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didResumeTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidSuspend(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a suspend call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidSuspend(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didSuspendTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is suspended.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didSuspendTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidCancel(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a cancel call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidCancel(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCancelTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is cancelled.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCancelTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest Events +

+
+
+ +
+
+
+ + +
+ +

DataStreamRequest Events +

+
+
+
    +
  • +
    + + + + request(_:didValidateRequest:response:withResult:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a DataStreamRequest calls a Validation closure.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: DataStreamRequest,
    +             didValidateRequest urlRequest: URLRequest?,
    +             response: HTTPURLResponse,
    +             withResult result: Request.ValidationResult)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest which is calling the Validation.

    +
    +
    + + urlRequest + + +
    +

    URLRequest of the request being validated.

    +
    +
    + + response + + +
    +

    HTTPURLResponse of the request being validated.

    +
    +
    + + result + + +
    +

    Produced ValidationResult.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didParseStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a DataStreamSerializer produces a value from streamed Data.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest for which the value was serialized.

    +
    +
    + + result + + +
    +

    Result of the serialization attempt.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest Events +

+
+
+
    +
  • +
    + + + + request(_:didCreateUploadable:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest creates its Uploadable value, indicating the type of upload it represents.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToCreateUploadableWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest failed to create its Uploadable value due to an error.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didProvideInputStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest provides the InputStream from its Uploadable value. This only occurs if +the InputStream does not wrap a Data value or file URL.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didProvideInputStream stream: InputStream)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadRequest Events +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoder.html new file mode 100644 index 00000000..d529a06c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoder.html @@ -0,0 +1,852 @@ + + + + ParameterEncoder Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoder

+
+
+ +
public protocol ParameterEncoder
+ +
+
+

A type that can encode any Encodable type into a URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + encode(_:into:) + +
    +
    +
    +
    +
    +
    +

    Encode the provided Encodable parameters into request.

    +
    +

    Throws

    +

    An Error when encoding fails. For Alamofire provided encoders, this will be an instance of + AFError.parameterEncoderFailed with an associated ParameterEncoderFailureReason.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func encode<Parameters>(_ parameters: Parameters?, into request: URLRequest) throws -> URLRequest where Parameters : Encodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + parameters + + +
    +

    The Encodable parameter value.

    +
    +
    + + request + + +
    +

    The URLRequest into which to encode the parameters.

    +
    +
    +
    +
    +

    Return Value

    +

    A URLRequest with the result of the encoding.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == JSONParameterEncoder +

+
+
+
    +
  • +
    + + + + json + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default JSONParameterEncoder instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var json: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + json(encoder:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a JSONParameterEncoder using the provided JSONEncoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func json(encoder: JSONEncoder = JSONEncoder()) -> JSONParameterEncoder
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoder + + +
    +

    JSONEncoder used to encode parameters. JSONEncoder() by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The JSONParameterEncoder.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == URLEncodedFormParameterEncoder +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoding.html b/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoding.html new file mode 100644 index 00000000..72bde21d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/ParameterEncoding.html @@ -0,0 +1,646 @@ + + + + ParameterEncoding Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoding

+
+
+ +
public protocol ParameterEncoding
+ +
+
+

A type used to define how a set of parameters are applied to a URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    +

    Creates a URLRequest by encoding parameters and applying them on the passed request.

    +
    +

    Throws

    +

    Any Error produced during parameter encoding.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    URLRequestConvertible value onto which parameters will be encoded.

    +
    +
    + + parameters + + +
    +

    Parameters to encode onto the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded URLRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/RedirectHandler.html b/Carthage/Checkouts/Alamofire/docs/Protocols/RedirectHandler.html new file mode 100644 index 00000000..23edc8a4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/RedirectHandler.html @@ -0,0 +1,798 @@ + + + + RedirectHandler Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RedirectHandler

+
+
+ +
public protocol RedirectHandler
+ +
+
+

A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines how the HTTP redirect response should be redirected to the new request.

    + +

    The completion closure should be passed one of three possible options:

    + +
      +
    1. The new request specified by the redirect (this is the most common use case).
    2. +
    3. A modified version of the new request (you may want to route it somewhere else).
    4. +
    5. A nil value to deny the redirect request and return the body of the redirect response.
    6. +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func task(_ task: URLSessionTask,
    +          willBeRedirectedTo request: URLRequest,
    +          for response: HTTPURLResponse,
    +          completion: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + task + + +
    +

    The URLSessionTask whose request resulted in a redirect.

    +
    +
    + + request + + +
    +

    The URLRequest to the new location specified by the redirect response.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse containing the server’s response to the original request.

    +
    +
    + + completion + + +
    +

    The closure to execute containing the new URLRequest, a modified URLRequest, or nil.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Redirector +

+
+
+
    +
  • +
    + + + + follow + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a Redirector which follows redirects. Equivalent to Redirector.follow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var follow: Redirector { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a Redirector which does not follow redirects. Equivalent to Redirector.doNotFollow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var doNotFollow: Redirector { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a Redirector which modifies the redirected URLRequest using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func modify(using closure: @escaping (URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) -> Redirector
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    Closure used to modify the redirect.

    +
    +
    +
    +
    +

    Return Value

    +

    The Redirector.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/RequestAdapter.html b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestAdapter.html new file mode 100644 index 00000000..773a0fbb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestAdapter.html @@ -0,0 +1,792 @@ + + + + RequestAdapter Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestAdapter

+
+
+ +
public protocol RequestAdapter
+ +
+
+

A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest to adapt.

    +
    +
    + + session + + +
    +

    The Session that will execute the URLRequest.

    +
    +
    + + completion + + +
    +

    The completion handler that must be called when adaptation is complete.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + adapt(_:using:completion:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest to adapt.

    +
    +
    + + state + + +
    +

    The RequestAdapterState associated with the URLRequest.

    +
    +
    + + completion + + +
    +

    The completion handler that must be called when adaptation is complete.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Adapter +

+
+
+
    +
  • +
    + + + + adapter(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates an Adapter using the provided AdaptHandler closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func adapter(using closure: @escaping AdaptHandler) -> Adapter
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    AdaptHandler to use to adapt the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The Adapter.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/RequestDelegate.html b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestDelegate.html new file mode 100644 index 00000000..ee59d785 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestDelegate.html @@ -0,0 +1,807 @@ + + + + RequestDelegate Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestDelegate

+
+
+ +
public protocol RequestDelegate : AnyObject
+ +
+
+

Protocol abstraction for Request‘s communication back to the SessionDelegate.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + sessionConfiguration + +
    +
    +
    +
    +
    +
    +

    URLSessionConfiguration used to create the underlying URLSessionTasks.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var sessionConfiguration: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startImmediately + +
    +
    +
    +
    +
    +
    +

    Determines whether the Request should automatically call resume() when adding the first response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var startImmediately: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup(after:) + +
    +
    +
    +
    +
    +
    +

    Notifies the delegate the Request has reached a point where it needs cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cleanup(after request: Request)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + request + + +
    +

    The Request to cleanup after.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Asynchronously ask the delegate whether a Request will be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    Request which failed.

    +
    +
    + + error + + +
    +

    Error which produced the failure.

    +
    +
    + + completion + + +
    +

    Closure taking the RetryResult for evaluation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Asynchronously retry the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    Request which will be retried.

    +
    +
    + + timeDelay + + +
    +

    TimeInterval after which the retry will be triggered.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/RequestInterceptor.html b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestInterceptor.html new file mode 100644 index 00000000..b94a25c6 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestInterceptor.html @@ -0,0 +1,1277 @@ + + + + RequestInterceptor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestInterceptor

+
+
+ +
public protocol RequestInterceptor : RequestAdapter, RequestRetrier
+ +
+
+

Type that provides both RequestAdapter and RequestRetrier functionality.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + adapt(_:for:completion:) + + + Extension method + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retry(_:for:dueTo:completion:) + + + Extension method + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retry(_ request: Request,
    +                  for session: Session,
    +                  dueTo error: Error,
    +                  completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == DeflateRequestCompressor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == Interceptor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == RetryPolicy +

+
+
+ +
+
+
+ + +
+ +

Available where Self == ConnectionLostRetryPolicy +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/RequestRetrier.html b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestRetrier.html new file mode 100644 index 00000000..194fd5fe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/RequestRetrier.html @@ -0,0 +1,732 @@ + + + + RequestRetrier Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestRetrier

+
+
+ +
public protocol RequestRetrier
+ +
+
+

A type that determines whether a request should be retried after being executed by the specified session manager +and encountering an error.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether the Request should be retried by calling the completion closure.

    + +

    This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs +to be retried. The one requirement is that the completion closure is called to ensure the request is properly +cleaned up after.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    Request that failed due to the provided Error.

    +
    +
    + + session + + +
    +

    Session that produced the Request.

    +
    +
    + + error + + +
    +

    Error encountered while executing the Request.

    +
    +
    + + completion + + +
    +

    Completion closure to be executed when a retry decision has been determined.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Retrier +

+
+
+
    +
  • +
    + + + + retrier(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a Retrier using the provided RetryHandler closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func retrier(using closure: @escaping RetryHandler) -> Retrier
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    RetryHandler to use to retry the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The Retrier.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/ResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Protocols/ResponseSerializer.html new file mode 100644 index 00000000..410e83b2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/ResponseSerializer.html @@ -0,0 +1,1331 @@ + + + + ResponseSerializer Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseSerializer

+
+
+ +
public protocol ResponseSerializer : DataResponseSerializerProtocol, DownloadResponseSerializerProtocol
+ +
+
+

A serializer that can handle both data and download responses.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    DataPreprocessor used to prepare incoming Data for serialization.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var dataPreprocessor: DataPreprocessor { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    HTTPMethods for which empty response bodies are considered appropriate.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var emptyRequestMethods: Set<HTTPMethod> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    HTTP response codes for which empty response bodies are considered appropriate.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var emptyResponseCodes: Set<Int> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+
    +
  • +
    + + + + defaultDataPreprocessor + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Default DataPreprocessor. PassthroughPreprocessor by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultDataPreprocessor: DataPreprocessor { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEmptyRequestMethods + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Default HTTPMethods for which empty response bodies are considered appropriate. [.head] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultEmptyRequestMethods: Set<HTTPMethod> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEmptyResponseCodes + + + Extension method + +
    +
    +
    +
    +
    +
    +

    HTTP response codes for which empty response bodies are considered appropriate. [204, 205] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultEmptyResponseCodes: Set<Int> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestAllowsEmptyResponseData(_:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether the request allows empty response bodies, if request exists.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestAllowsEmptyResponseData(_ request: URLRequest?) -> Bool?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + request + + +
    +

    URLRequest to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool representing the outcome of the evaluation, or nil if request was nil.

    +
    +
    +
    +
  • +
  • +
    + + + + responseAllowsEmptyResponseData(_:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether the response allows empty response bodies, if response exists`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func responseAllowsEmptyResponseData(_ response: HTTPURLResponse?) -> Bool?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + response + + +
    +

    HTTPURLResponse to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool representing the outcome of the evaluation, or nil if response was nil.

    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseAllowed(forRequest:response:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether request and response allow empty response bodies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func emptyResponseAllowed(forRequest request: URLRequest?, response: HTTPURLResponse?) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest to evaluate.

    +
    +
    + + response + + +
    +

    HTTPURLResponse to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    true if request or response allow empty bodies, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+ +
+
+
+ + +
+ +

Available where Self == DataResponseSerializer +

+
+
+ +
+
+
+ + +
+ +

Available where Self == StringResponseSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/ServerTrustEvaluating.html b/Carthage/Checkouts/Alamofire/docs/Protocols/ServerTrustEvaluating.html new file mode 100644 index 00000000..942d0277 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/ServerTrustEvaluating.html @@ -0,0 +1,1100 @@ + + + + ServerTrustEvaluating Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustEvaluating

+
+
+ +
public protocol ServerTrustEvaluating
+ +
+
+

A protocol describing the API used to evaluate server trusts.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given SecTrust value for the given host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + trust + + +
    +

    The SecTrust value to evaluate.

    +
    +
    + + host + + +
    +

    The host for which to evaluate the SecTrust value.

    +
    +
    +
    +
    +

    Return Value

    +

    A Bool indicating whether the evaluator considers the SecTrust value valid for host.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == RevocationTrustEvaluator +

+
+
+
    +
  • +
    + + + + revocationChecking + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default RevocationTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var revocationChecking: RevocationTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RevocationTrustEvaluator using the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func revocationChecking(performDefaultValidation: Bool = true,
    +                                      validateHost: Bool = true,
    +                                      options: RevocationTrustEvaluator.Options = .any) -> RevocationTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    + + options + + +
    +

    The Options to use to check the revocation status of the certificate. .any + by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The RevocationTrustEvaluator.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PinnedCertificatesTrustEvaluator +

+
+
+
    +
  • +
    + + + + pinnedCertificates + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default PinnedCertificatesTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var pinnedCertificates: PinnedCertificatesTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a PinnedCertificatesTrustEvaluator using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func pinnedCertificates(certificates: [SecCertificate] = Bundle.main.af.certificates,
    +                                      acceptSelfSignedCertificates: Bool = false,
    +                                      performDefaultValidation: Bool = true,
    +                                      validateHost: Bool = true) -> PinnedCertificatesTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + certificates + + +
    +

    The certificates to use to evaluate the trust. All cer, crt, and der + certificates in Bundle.main by default.

    +
    +
    + + acceptSelfSignedCertificates + + +
    +

    Adds the provided certificates as anchors for the trust evaluation, allowing + self-signed certificates to pass. false by default. THIS SETTING SHOULD BE + FALSE IN PRODUCTION!

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PublicKeysTrustEvaluator +

+
+
+
    +
  • +
    + + + + publicKeys + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default PublicKeysTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var publicKeys: PublicKeysTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys(keys:performDefaultValidation:validateHost:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a PublicKeysTrustEvaluator from the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func publicKeys(keys: [SecKey] = Bundle.main.af.publicKeys,
    +                              performDefaultValidation: Bool = true,
    +                              validateHost: Bool = true) -> PublicKeysTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    The SecKeys to use to validate public keys. Defaults to the public keys of all + certificates included in the main bundle.

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == CompositeTrustEvaluator +

+
+
+
    +
  • +
    + + + + composite(evaluators:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a CompositeTrustEvaluator from the provided evaluators.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func composite(evaluators: [ServerTrustEvaluating]) -> CompositeTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + evaluators + + +
    +

    The ServerTrustEvaluating values used to evaluate the server trust.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/SessionStateProvider.html b/Carthage/Checkouts/Alamofire/docs/Protocols/SessionStateProvider.html new file mode 100644 index 00000000..695f1817 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/SessionStateProvider.html @@ -0,0 +1,630 @@ + + + + SessionStateProvider Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SessionStateProvider

+
+
+
public protocol SessionStateProvider : AnyObject
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + serverTrustManager + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var serverTrustManager: ServerTrustManager? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + redirectHandler + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var redirectHandler: RedirectHandler? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var cachedResponseHandler: CachedResponseHandler? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(for:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(for task: URLSessionTask) -> Request?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didCompleteTask(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didCompleteTask(_ task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + credential(for:in:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cancelRequestsForSessionInvalidation(with error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/URLConvertible.html b/Carthage/Checkouts/Alamofire/docs/Protocols/URLConvertible.html new file mode 100644 index 00000000..13d224ea --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/URLConvertible.html @@ -0,0 +1,616 @@ + + + + URLConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLConvertible

+
+
+ +
public protocol URLConvertible
+ +
+
+

Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct +URLRequests.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL from the conforming instance or throws.

    +
    +

    Throws

    + Any error thrown while creating the URL. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL created from the instance.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/URLRequestConvertible.html b/Carthage/Checkouts/Alamofire/docs/Protocols/URLRequestConvertible.html new file mode 100644 index 00000000..67119b80 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/URLRequestConvertible.html @@ -0,0 +1,645 @@ + + + + URLRequestConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequestConvertible

+
+
+ +
public protocol URLRequestConvertible
+ +
+
+

Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    +

    Returns a URLRequest or throws if an Error was encountered.

    +
    +

    Throws

    + Any error thrown while constructing the URLRequest. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +

    Return Value

    +

    A URLRequest.

    +
    +
    +
    +
  • +
  • +
    + + + + urlRequest + + + Extension method + +
    +
    +
    +
    +
    +
    +

    The URLRequest returned by discarding any Error encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var urlRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Protocols/UploadableConvertible.html b/Carthage/Checkouts/Alamofire/docs/Protocols/UploadableConvertible.html new file mode 100644 index 00000000..6c14c45c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Protocols/UploadableConvertible.html @@ -0,0 +1,615 @@ + + + + UploadableConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ + +
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs.html b/Carthage/Checkouts/Alamofire/docs/Structs.html new file mode 100644 index 00000000..878246fb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs.html @@ -0,0 +1,1468 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+
    +
  • +
    + + + + DataResponsePublisher + +
    +
    +
    +
    +
    +
    +

    A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public struct DataResponsePublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataStreamPublisher + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataStreamPublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public struct DownloadResponsePublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataTask +

+
+
+
    +
  • +
    + + + + DataTask + +
    +
    +
    +
    +
    +
    +

    Value used to await a DataResponse and associated values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DataTask<Value>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadTask +

+
+
+
    +
  • +
    + + + + DownloadTask + +
    +
    +
    +
    +
    +
    +

    Value used to await a DownloadResponse and associated values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DownloadTask<Value>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamTask +

+
+
+
    +
  • +
    + + + + DataStreamTask + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataStreamTask
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + StreamOf + +
    +
    +
    +
    +
    +
    +

    An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct StreamOf<Element> : AsyncSequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + HTTPHeaders + +
    +
    +
    +
    +
    +
    +

    An order-preserving and case-insensitive representation of HTTP headers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPHeaders
    +
    extension HTTPHeaders: ExpressibleByDictionaryLiteral
    +
    extension HTTPHeaders: ExpressibleByArrayLiteral
    +
    extension HTTPHeaders: Sequence
    +
    extension HTTPHeaders: Collection
    +
    extension HTTPHeaders: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPHeader +

+
+
+
    +
  • +
    + + + + HTTPHeader + +
    +
    +
    +
    +
    +
    +

    A representation of a single HTTP header’s name / value pair.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPHeader : Hashable
    +
    extension HTTPHeader: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + HTTPMethod + +
    +
    +
    +
    +
    +
    +

    Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so +HTTPMethod.get != HTTPMethod(rawValue: "get").

    + +

    See https://tools.ietf.org/html/rfc7231#section-4.3

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPMethod : RawRepresentable, Equatable, Hashable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + URLEncoding + +
    +
    +
    +
    +
    +
    +

    Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +the HTTP body depends on the destination of the encoding.

    + +

    The Content-Type HTTP header field of an encoded request with HTTP body is set to +application/x-www-form-urlencoded; charset=utf-8.

    + +

    There is no published specification for how to encode collection types. By default the convention of appending +[] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for +nested dictionary values (foo[bar]=baz) is used. Optionally, ArrayEncoding can be used to omit the +square brackets appended to array keys.

    + +

    BoolEncoding can be used to configure how boolean values are encoded. The default behavior is to encode +true as 1 and false as 0.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct URLEncoding : ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + JSONEncoding + +
    +
    +
    +
    +
    +
    +

    Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the +request. The Content-Type HTTP header field of an encoded request is set to application/json.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct JSONEncoding : ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Redirector + +
    +
    +
    +
    +
    +
    +

    Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Redirector
    +
    extension Redirector: RedirectHandler
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the +appropriate header.

    +
    +

    Note

    + Most requests to most APIs are small and so would only be slowed down by applying this adapter. Measure the + size of your request bodies and the performance impact of using this adapter before use. Using this adapter + with already compressed data, such as images, will, at best, have no effect. Additionally, body compression + is a synchronous operation, so measuring the performance impact may be important to determine whether you + want to use a dedicated requestQueue in your Session instance. Finally, not all servers support request + compression, so test with all of your server configurations before deploying. + +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DeflateRequestCompressor : RequestInterceptor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestAdapterState + +
    +
    +
    +
    +
    +
    +

    Stores all state associated with a URLRequest being adapted.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct RequestAdapterState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataResponse + +
    +
    +
    +
    +
    +
    +

    Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataResponse<Success, Failure> where Failure : Error
    +
    extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DownloadResponse + +
    +
    +
    +
    +
    +
    +

    Used to store all data associated with a serialized response of a download request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DownloadResponse<Success, Failure> where Failure : Error
    +
    extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+ +
+
+
+ + +
+ +

URL +

+
+
+ +
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + Empty + +
    +
    +
    +
    +
    +
    +

    Type representing an empty value. Use Empty.value to get the static instance.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Empty : Codable
    +
    extension Empty: EmptyResponse
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/AlamofireExtension.html b/Carthage/Checkouts/Alamofire/docs/Structs/AlamofireExtension.html new file mode 100644 index 00000000..8c8becf2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/AlamofireExtension.html @@ -0,0 +1,1688 @@ + + + + AlamofireExtension Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireExtension

+
+
+ +
public struct AlamofireExtension<ExtendedType>
+ +
+
+

Type that acts as a generic extension point for all AlamofireExtended types.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + type + +
    +
    +
    +
    +
    +
    +

    Stores the type or meta-type of any extended type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var type: ExtendedType { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Create an instance from the provided value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ type: ExtendedType)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + type + + +
    +

    Instance being extended.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType: Bundle +

+
+
+
    +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Returns all valid cer, crt, and der certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    Returns all public keys for the valid certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns all pathnames for the resources identified by the provided file extensions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func paths(forResourcesOfTypes types: [String]) -> [String]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + types + + +
    +

    The filename extensions locate.

    +
    +
    +
    +
    +

    Return Value

    +

    All pathnames for the given filename extensions.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecTrust +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Evaluates self after applying the SecPolicy value provided.

    +
    +

    Throws

    +

    Any Error from applying the SecPolicy or from evaluation.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)
    +public func evaluate(afterApplying policy: SecPolicy) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + policy + + +
    +

    The SecPolicy to apply to self before evaluation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Attempts to validate self using the SecPolicy provided and transforming any error produced using the closure passed.

    +
    +

    Throws

    + Any Error from applying the policy, or the result of errorProducer if validation fails. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:﹚")
    +@available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(afterApplying:﹚")
    +@available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:﹚")
    +@available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(afterApplying:﹚")
    +public func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + policy + + +
    +

    The SecPolicy used to evaluate self.

    +
    +
    + + errorProducer + + +
    +

    The closure used transform the failed OSStatus and SecTrustResultType.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(policy:) + +
    +
    +
    +
    +
    +
    +

    Applies a SecPolicy to self, throwing if it fails.

    +
    +

    Throws

    +

    An AFError.serverTrustEvaluationFailed instance with a .policyApplicationFailed reason.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func apply(policy: SecPolicy) throws -> SecTrust
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + policy + + +
    +

    The SecPolicy.

    +
    +
    +
    +
    +

    Return Value

    +

    self, with the policy applied.

    +
    +
    +
    +
  • +
  • +
    + + + + evaluate() + +
    +
    +
    +
    +
    +
    +

    Evaluate self, throwing an Error if evaluation fails.

    +
    +

    Throws

    + AFError.serverTrustEvaluationFailed with reason .trustValidationFailed and associated error from + the underlying evaluation. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)
    +public func evaluate() throws
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validate self, passing any failure values through errorProducer.

    +
    +

    Throws

    + The Error produced by the errorProducer closure. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(﹚")
    +@available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(﹚")
    +@available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(﹚")
    +@available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(﹚")
    +public func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + errorProducer + + +
    +

    The closure used to transform the failed OSStatus and SecTrustResultType into an + Error.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a custom certificate chain on self, allowing full validation of a self-signed certificate and its chain.

    +
    +

    Throws

    + Any error produced when applying the new certificate chain. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func setAnchorCertificates(_ certificates: [SecCertificate]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + certificates + + +
    +

    The SecCertificates to add to the chain.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    The public keys contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    The SecCertificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificateData + +
    +
    +
    +
    +
    +
    +

    The Data values for all certificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificateData: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates self after applying SecPolicy.af.default. This evaluation does not validate the hostname.

    +
    +

    Throws

    + An AFError.serverTrustEvaluationFailed instance with a .defaultEvaluationFailed reason. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func performDefaultValidation(forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The hostname, used only in the error output if validation fails.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates self after applying SecPolicy.af.hostname(host), which performs the default validation as well as +hostname validation.

    +
    +

    Throws

    + An AFError.serverTrustEvaluationFailed instance with a .defaultEvaluationFailed reason. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func performValidation(forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The hostname to use in the validation.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecPolicy +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy instance which will validate server certificates but not require a host name match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: SecPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hostname(_:) + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy instance which will validate server certificates and much match the provided hostname.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hostname(_ hostname: String) -> SecPolicy
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + hostname + + +
    +

    The hostname to validate against.

    +
    +
    +
    +
    +

    Return Value

    +

    The SecPolicy.

    +
    +
    +
    +
  • +
  • +
    + + + + revocation(options:) + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy which checks the revocation of certificates.

    +
    +

    Throws

    +

    An AFError.serverTrustEvaluationFailed error with reason .revocationPolicyCreationFailed + if the policy cannot be created.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func revocation(options: RevocationTrustEvaluator.Options) throws -> SecPolicy
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + options + + +
    +

    The RevocationTrustEvaluator.Options for evaluation.

    +
    +
    +
    +
    +

    Return Value

    +

    The SecPolicy.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == [SecCertificate] +

+
+
+
    +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    All Data values for the contained SecCertificates.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var data: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    All public SecKey values for the contained SecCertificates.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecCertificate +

+
+
+
    +
  • +
    + + + + publicKey + +
    +
    +
    +
    +
    +
    +

    The public key for self, if it can be extracted.

    +
    +

    Note

    + On 2020 OSes and newer, only RSA and ECDSA keys are supported. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKey: SecKey? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == OSStatus +

+
+
+
    +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns whether self is errSecSuccess.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecTrustResultType +

+
+
+
    +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns whether self is.unspecifiedor.proceed`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType: URLSessionConfiguration +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Alamofire’s default configuration. Same as URLSessionConfiguration.default but adds Alamofire default +Accept-Language, Accept-Encoding, and User-Agent headers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ephemeral + +
    +
    +
    +
    +
    +
    +

    .ephemeral configuration with Alamofire’s default Accept-Language, Accept-Encoding, and User-Agent +headers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var ephemeral: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DataResponse.html b/Carthage/Checkouts/Alamofire/docs/Structs/DataResponse.html new file mode 100644 index 00000000..3cd0fefe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DataResponse.html @@ -0,0 +1,1198 @@ + + + + DataResponse Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponse

+
+
+ +
public struct DataResponse<Success, Failure> where Failure : Error
+
extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible
+ +
+
+

Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The URL request sent to the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    The server’s response to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    The data returned by the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let data: Data?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    The final metrics of the response.

    +
    +

    Note

    + Due to FB7624529, collection of URLSessionTaskMetrics on watchOS is currently disabled.` + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationDuration + +
    +
    +
    +
    +
    +
    +

    The time taken to serialize the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationDuration: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: Result<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value of the result if it is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result if it is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataResponse instance with the specified parameters derived from the response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(request: URLRequest?,
    +            response: HTTPURLResponse?,
    +            data: Data?,
    +            metrics: URLSessionTaskMetrics?,
    +            serializationDuration: TimeInterval,
    +            result: Result<Success, Failure>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    The URLRequest sent to the server.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse from the server.

    +
    +
    + + data + + +
    +

    The Data returned by the server.

    +
    +
    + + metrics + + +
    +

    The URLSessionTaskMetrics of the DataRequest or UploadRequest.

    +
    +
    + + serializationDuration + + +
    +

    The duration taken by serialization.

    +
    +
    + + result + + +
    +

    The Result of response serialization.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes (if available) a summary +of the URLRequest, the request’s headers and body (if decodable as a String below 100KB); the +HTTPURLResponse‘s status code, headers, and body; the duration of the network and serialization actions; and +the Result of serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the result of this DataResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleInt = possibleData.map { $0.count }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DataResponse<NewSuccess, Failure>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse whose result wraps the value returned by the given closure. If this instance’s + result is a failure, returns a response wrapping the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DataResponse is a success, passing the unwrapped result +value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DataResponse<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A success or failure DataResponse depending on the result of the given closure. If this instance’s + result is a failure, returns the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let withMyError = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<NewFailure>(_ transform: (Failure) -> NewFailure) -> DataResponse<Success, NewFailure> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> DataResponse<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DataResponsePublisher.html b/Carthage/Checkouts/Alamofire/docs/Structs/DataResponsePublisher.html new file mode 100644 index 00000000..74ec3e39 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DataResponsePublisher.html @@ -0,0 +1,905 @@ + + + + DataResponsePublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponsePublisher

+
+
+ +
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
+public struct DataResponsePublisher<Value> : Publisher
+ +
+
+

A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DataResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided ResponseSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: ResponseSerializer>(_ request: DataRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    ResponseSerializer used to produce the published DataResponse.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DataResponseSerializerProtocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: DataResponseSerializerProtocol>(_ request: DataRequest,
    +                                                        queue: DispatchQueue,
    +                                                        serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    DataResponseSerializerProtocol used to produce the published DataResponse.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DataResponse value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the Result of the DataResponse as a single Value or fail with the AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DataResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Value == Data? +

+
+
+
    +
  • +
    + + + + init(_:queue:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance which publishes a DataResponse<Data?, AFError> value without serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init(_ request: DataRequest, queue: DispatchQueue)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamPublisher.html b/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamPublisher.html new file mode 100644 index 00000000..ae9fb2ae --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamPublisher.html @@ -0,0 +1,792 @@ + + + + DataStreamPublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamPublisher

+
+
+ +
public struct DataStreamPublisher<Value> : Publisher
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DataStreamRequest.Stream<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DataStreamSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: DataStreamSerializer>(_ request: DataStreamRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the Stream<Value, AFError> values will be published. .main by + default.

    +
    +
    + + serializer + + +
    +

    DataStreamSerializer used to produce the published Stream<Value, AFError> values.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DataStreamRequest.Stream‘s Events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the streamed values of the DataStreamRequest.Stream as a sequence of Value or fail with the +AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DataStreamRequest.Stream<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamTask.html b/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamTask.html new file mode 100644 index 00000000..a8cf8239 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DataStreamTask.html @@ -0,0 +1,969 @@ + + + + DataStreamTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamTask

+
+
+ +
public struct DataStreamTask
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Stream + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stream<Success, Failure> = StreamOf<DataStreamRequest.Stream<Success, Failure>> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of Data values from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<Data, Never>.BufferingPolicy = .unbounded) -> Stream<Data, Never>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of UTF-8 Strings from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingStrings(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<String, Never>.BufferingPolicy = .unbounded) -> Stream<String, Never>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of Decodable values from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingDecodables<T>(_ type: T.Type = T.self,
    +                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                   bufferingPolicy: Stream<T, AFError>.BufferingPolicy = .unbounded)
    +    -> Stream<T, AFError> where T: Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to be serialized from stream payloads.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of values using the provided DataStreamSerializer from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingResponses<Serializer: DataStreamSerializer>(serializedUsing serializer: Serializer,
    +                                                                 automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                                 bufferingPolicy: Stream<Serializer.SerializedObject, AFError>.BufferingPolicy = .unbounded)
    +    -> Stream<Serializer.SerializedObject, AFError>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer to use to serialize incoming Data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DataTask.html b/Carthage/Checkouts/Alamofire/docs/Structs/DataTask.html new file mode 100644 index 00000000..fd60301e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DataTask.html @@ -0,0 +1,751 @@ + + + + DataTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataTask

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DataTask<Value>
+ +
+
+

Value used to await a DataResponse and associated values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + response + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    DataResponse produced by the DataRequest and its response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: DataResponse<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Result of any response serialization performed for the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Value returned by the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value { get async throws }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DataRequest and Task.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DataRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DataRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DecodableStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/Structs/DecodableStreamSerializer.html new file mode 100644 index 00000000..7f4b7007 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DecodableStreamSerializer.html @@ -0,0 +1,718 @@ + + + + DecodableStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DecodableStreamSerializer

+
+
+ +
public struct DecodableStreamSerializer<T> : DataStreamSerializer where T : Decodable
+ +
+
+

DataStreamSerializer which uses the provided DataPreprocessor and DataDecoder to serialize the incoming Data.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor.html b/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor.html new file mode 100644 index 00000000..9872b07b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor.html @@ -0,0 +1,786 @@ + + + + DeflateRequestCompressor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DeflateRequestCompressor

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DeflateRequestCompressor : RequestInterceptor
+ +
+
+

RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the +appropriate header.

+
+

Note

+ Most requests to most APIs are small and so would only be slowed down by applying this adapter. Measure the + size of your request bodies and the performance impact of using this adapter before use. Using this adapter + with already compressed data, such as images, will, at best, have no effect. Additionally, body compression + is a synchronous operation, so measuring the performance impact may be important to determine whether you + want to use a dedicated requestQueue in your Session instance. Finally, not all servers support request + compression, so test with all of your server configurations before deploying. + +
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Type that determines the action taken when the URLRequest already has a Content-Encoding header.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DuplicateHeaderBehavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DuplicateHeaderError + +
    +
    +
    +
    +
    +
    +

    Error produced when the outgoing URLRequest already has a Content-Encoding header, when the instance has +been configured to produce an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DuplicateHeaderError : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Behavior to use when the outgoing URLRequest already has a Content-Encoding header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let duplicateHeaderBehavior: DuplicateHeaderBehavior
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Closure which determines whether the outgoing body data should be compressed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let shouldCompressBodyData: (_ bodyData: Data) -> Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(duplicateHeaderBehavior: DuplicateHeaderBehavior = .error,
    +            shouldCompressBodyData: @escaping (_ bodyData: Data) -> Bool = { _ in true })
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + duplicateHeaderBehavior + + +
    +

    DuplicateHeaderBehavior to use. .error by default.

    +
    +
    + + shouldCompressBodyData + + +
    +

    Closure which determines whether the outgoing body data should be compressed. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html b/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html new file mode 100644 index 00000000..560387dd --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html @@ -0,0 +1,660 @@ + + + + DuplicateHeaderBehavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DuplicateHeaderBehavior

+
+
+ +
public enum DuplicateHeaderBehavior
+ +
+
+

Type that determines the action taken when the URLRequest already has a Content-Encoding header.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Throws a DuplicateHeaderError. The default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + replace + +
    +
    +
    +
    +
    +
    +

    Replaces the existing header value with deflate.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case replace
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skip + +
    +
    +
    +
    +
    +
    +

    Silently skips compression when the header exists.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case skip
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponse.html b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponse.html new file mode 100644 index 00000000..efbbfefe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponse.html @@ -0,0 +1,1237 @@ + + + + DownloadResponse Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponse

+
+
+ +
public struct DownloadResponse<Success, Failure> where Failure : Error
+
extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible
+ +
+
+

Used to store all data associated with a serialized response of a download request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The URL request sent to the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    The server’s response to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileURL + +
    +
    +
    +
    +
    +
    +

    The final destination URL of the data returned from the server after it is moved.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let fileURL: URL?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumeData + +
    +
    +
    +
    +
    +
    +

    The resume data generated if the request was cancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let resumeData: Data?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    The final metrics of the response.

    +
    +

    Note

    + Due to FB7624529, collection of URLSessionTaskMetrics on watchOS is currently disabled.` + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationDuration + +
    +
    +
    +
    +
    +
    +

    The time taken to serialize the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationDuration: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: Result<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value of the result if it is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result if it is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadResponse instance with the specified parameters derived from response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(request: URLRequest?,
    +            response: HTTPURLResponse?,
    +            fileURL: URL?,
    +            resumeData: Data?,
    +            metrics: URLSessionTaskMetrics?,
    +            serializationDuration: TimeInterval,
    +            result: Result<Success, Failure>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    The URLRequest sent to the server.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse from the server.

    +
    +
    + + fileURL + + +
    +

    The final destination URL of the data returned from the server after it is moved.

    +
    +
    + + resumeData + + +
    +

    The resume Data generated if the request was cancelled.

    +
    +
    + + metrics + + +
    +

    The URLSessionTaskMetrics of the DownloadRequest.

    +
    +
    + + serializationDuration + + +
    +

    The duration taken by serialization.

    +
    +
    + + result + + +
    +

    The Result of response serialization.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes the URL request, the URL +response, the temporary and destination URLs, the resume data, the durations of the network and serialization +actions, and the response serialization result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleInt = possibleData.map { $0.count }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DownloadResponse<NewSuccess, Failure>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse whose result wraps the value returned by the given closure. If this instance’s + result is a failure, returns a response wrapping the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DownloadResponse<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A success or failure DownloadResponse depending on the result of the given closure. If this +instance’s result is a failure, returns the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let withMyError = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<NewFailure>(_ transform: (Failure) -> NewFailure) -> DownloadResponse<Success, NewFailure> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> DownloadResponse<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponsePublisher.html b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponsePublisher.html new file mode 100644 index 00000000..79984fb9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadResponsePublisher.html @@ -0,0 +1,906 @@ + + + + DownloadResponsePublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponsePublisher

+
+
+ +
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
+public struct DownloadResponsePublisher<Value> : Publisher
+ +
+
+

A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DownloadResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided ResponseSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: ResponseSerializer>(_ request: DownloadRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DownloadRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DownloadResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    ResponseSerializer used to produce the published DownloadResponse.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DownloadResponseSerializerProtocol value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init<Serializer: DownloadResponseSerializerProtocol>(_ request: DownloadRequest,
    +                                                            queue: DispatchQueue,
    +                                                            serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DownloadRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    DownloadResponseSerializerProtocol used to produce the published DownloadResponse.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DownloadResponse value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the Result of the DownloadResponse as a single Value or fail with the AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DownloadResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Value == URL? +

+
+
+
    +
  • +
    + + + + init(_:queue:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance which publishes a DownloadResponse<URL?, AFError> value without serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init(_ request: DownloadRequest, queue: DispatchQueue)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/DownloadTask.html b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadTask.html new file mode 100644 index 00000000..d80c7ae0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/DownloadTask.html @@ -0,0 +1,751 @@ + + + + DownloadTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadTask

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DownloadTask<Value>
+ +
+
+

Value used to await a DownloadResponse and associated values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + response + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    DownloadResponse produced by the DownloadRequest and its response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: DownloadResponse<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Result of any response serialization performed for the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Value returned by the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value { get async throws }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DownloadRequest and Task.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DownloadRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DownloadRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/Empty.html b/Carthage/Checkouts/Alamofire/docs/Structs/Empty.html new file mode 100644 index 00000000..f72a6cca --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/Empty.html @@ -0,0 +1,646 @@ + + + + Empty Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Empty

+
+
+ +
public struct Empty : Codable
+
extension Empty: EmptyResponse
+ +
+
+

Type representing an empty value. Use Empty.value to get the static instance.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Static Empty instance used for all Empty responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let value: Empty
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + emptyValue() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func emptyValue() -> Empty
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/GoogleXSSIPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/Structs/GoogleXSSIPreprocessor.html new file mode 100644 index 00000000..5a2c5d63 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/GoogleXSSIPreprocessor.html @@ -0,0 +1,632 @@ + + + + GoogleXSSIPreprocessor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

GoogleXSSIPreprocessor

+
+
+ +
public struct GoogleXSSIPreprocessor : DataPreprocessor
+ +
+
+

DataPreprocessor that trims Google’s typical )]}',\n XSSI JSON header.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeader.html b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeader.html new file mode 100644 index 00000000..d3a4f39e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeader.html @@ -0,0 +1,1410 @@ + + + + HTTPHeader Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPHeader

+
+
+ +
public struct HTTPHeader : Hashable
+
extension HTTPHeader: CustomStringConvertible
+ +
+
+

A representation of a single HTTP header’s name / value pair.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    Name of the header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let name: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Value of the header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(name:value:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from the given name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The name of the header.

    +
    +
    + + value + + +
    +

    The value of the header.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPHeader +

+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + accept(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func accept(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptCharset(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Charset header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptCharset(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Charset value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptLanguage(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Language header.

    + +

    Alamofire offers a default Accept-Language header that accumulates and encodes the system’s preferred languages. +Use HTTPHeader.defaultAcceptLanguage.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptLanguage(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Language value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptEncoding(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Encoding header.

    + +

    Alamofire offers a default accept encoding value that provides the most common values. Use +HTTPHeader.defaultAcceptEncoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptEncoding(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Encoding value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Basic Authorization header using the username and password provided.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(username: String, password: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + username + + +
    +

    The username of the header.

    +
    +
    + + password + + +
    +

    The password of the header.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Bearer Authorization header using the bearerToken provided

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(bearerToken: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bearerToken + + +
    +

    The bearer token.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + authorization(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Authorization header.

    + +

    Alamofire provides built-in methods to produce Authorization headers. For a Basic Authorization header use +HTTPHeader.authorization(username:password:). For a Bearer Authorization header, use +HTTPHeader.authorization(bearerToken:).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Authorization value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Content-Disposition header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentDisposition(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Disposition value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + contentEncoding(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a Content-Encoding header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentEncoding(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Encoding.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + contentType(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a Content-Type header.

    + +

    All Alamofire ParameterEncodings and ParameterEncoders set the Content-Type of the request, so it may not +be necessary to manually set this value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentType(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Type value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + userAgent(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a User-Agent header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func userAgent(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The User-Agent value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Defaults +

+
+
+
    +
  • +
    + + + + defaultAcceptEncoding + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default Accept-Encoding header, appropriate for the encodings supported by particular OS +versions.

    + +

    See the Accept-Encoding HTTP header documentation .

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultAcceptEncoding: HTTPHeader
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultAcceptLanguage + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default Accept-Language header, generated by querying Locale for the user’s +preferredLanguages.

    + +

    See the Accept-Language HTTP header documentation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultAcceptLanguage: HTTPHeader
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultUserAgent + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default User-Agent header.

    + +

    See the User-Agent header documentation.

    + +

    Example: iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultUserAgent: HTTPHeader
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeaders.html b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeaders.html new file mode 100644 index 00000000..bb66d67b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPHeaders.html @@ -0,0 +1,1353 @@ + + + + HTTPHeaders Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPHeaders

+
+
+ +
public struct HTTPHeaders
+
extension HTTPHeaders: ExpressibleByDictionaryLiteral
+
extension HTTPHeaders: ExpressibleByArrayLiteral
+
extension HTTPHeaders: Sequence
+
extension HTTPHeaders: Collection
+
extension HTTPHeaders: CustomStringConvertible
+ +
+
+

An order-preserving and case-insensitive representation of HTTP headers.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an empty instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from an array of HTTPHeaders. Duplicate case-insensitive names are collapsed into the last +name and value encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ headers: [HTTPHeader])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from a [String: String]. Duplicate case-insensitive names are collapsed into the last name +and value encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ dictionary: [String : String])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + add(name:value:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func add(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The HTTPHeader name.

    +
    +
    + + value + + +
    +

    The `HTTPHeader value.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + add(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends the provided HTTPHeader into the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func add(_ header: HTTPHeader)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + header + + +
    +

    The HTTPHeader to update or append.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(name:value:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func update(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The HTTPHeader name.

    +
    +
    + + value + + +
    +

    The `HTTPHeader value.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends the provided HTTPHeader into the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func update(_ header: HTTPHeader)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + header + + +
    +

    The HTTPHeader to update or append.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + remove(name:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively removes an HTTPHeader, if it exists, from the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func remove(name: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the HTTPHeader to remove.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + sort() + +
    +
    +
    +
    +
    +
    +

    Sort the current instance by header name, case insensitively.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func sort()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sorted() + +
    +
    +
    +
    +
    +
    +

    Returns an instance sorted by header name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func sorted() -> HTTPHeaders
    + +
    +
    +
    +

    Return Value

    +

    A copy of the current instance sorted by name.

    +
    +
    +
    +
  • +
  • +
    + + + + value(for:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively find a header’s value by name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value(for name: String) -> String?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the header to search for, case-insensitively.

    +
    +
    +
    +
    +

    Return Value

    +

    The value of header, if it exists.

    +
    +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively access the header with the given name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(name: String) -> String? { get set }
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the header.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + dictionary + +
    +
    +
    +
    +
    +
    +

    The dictionary representation of all headers.

    + +

    This representation does not preserve the current order of the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var dictionary: [String : String] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dictionaryLiteral elements: (String, String)...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(arrayLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(arrayLiteral elements: HTTPHeader...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + makeIterator() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeIterator() -> IndexingIterator<[HTTPHeader]>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(position: Int) -> HTTPHeader { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + index(after:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func index(after i: Int) -> Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Defaults +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    The default set of HTTPHeaders used by Alamofire. Includes Accept-Encoding, Accept-Language, and +User-Agent.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: HTTPHeaders
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/HTTPMethod.html b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPMethod.html new file mode 100644 index 00000000..ee41c182 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/HTTPMethod.html @@ -0,0 +1,904 @@ + + + + HTTPMethod Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPMethod

+
+
+ +
public struct HTTPMethod : RawRepresentable, Equatable, Hashable
+ +
+
+

Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so +HTTPMethod.get != HTTPMethod(rawValue: "get").

+ +

See https://tools.ietf.org/html/rfc7231#section-4.3

+ +
+
+ +
+
+
+
    +
  • +
    + + + + connect + +
    +
    +
    +
    +
    +
    +

    CONNECT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let connect: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delete + +
    +
    +
    +
    +
    +
    +

    DELETE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let delete: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get + +
    +
    +
    +
    +
    +
    +

    GET method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let get: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + head + +
    +
    +
    +
    +
    +
    +

    HEAD method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let head: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    OPTIONS method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let options: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + patch + +
    +
    +
    +
    +
    +
    +

    PATCH method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let patch: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + post + +
    +
    +
    +
    +
    +
    +

    POST method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let post: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + put + +
    +
    +
    +
    +
    +
    +

    PUT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let put: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + query + +
    +
    +
    +
    +
    +
    +

    QUERY method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let query: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trace + +
    +
    +
    +
    +
    +
    +

    TRACE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let trace: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding.html b/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding.html new file mode 100644 index 00000000..3b805ba2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding.html @@ -0,0 +1,867 @@ + + + + JSONEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONEncoding

+
+
+ +
public struct JSONEncoding : ParameterEncoding
+ +
+
+

Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the +request. The Content-Type HTTP header field of an encoded request is set to application/json.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Error + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Error : Swift.Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns a JSONEncoding instance with default writing options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: JSONEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prettyPrinted + +
    +
    +
    +
    +
    +
    +

    Returns a JSONEncoding instance with .prettyPrinted writing options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var prettyPrinted: JSONEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    The options for writing the parameters as JSON data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let options: JSONSerialization.WritingOptions
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • +
    + + + + init(options:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the specified WritingOptions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(options: JSONSerialization.WritingOptions = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + options + + +
    +

    JSONSerialization.WritingOptions to use.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Encoding +

+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Encodes any JSON compatible object into a URLRequest.

    +
    +

    Throws

    +

    Any Error produced during encoding.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    URLRequestConvertible value into which the object will be encoded.

    +
    +
    + + jsonObject + + +
    +

    Any value (must be JSON compatibleto be encoded into theURLRequest.nil` by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded URLRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding/Error.html b/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding/Error.html new file mode 100644 index 00000000..291569d5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/JSONEncoding/Error.html @@ -0,0 +1,633 @@ + + + + Error Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
public enum Error : Swift.Error
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + invalidJSONObject + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidJSONObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughPreprocessor.html new file mode 100644 index 00000000..e50015cc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughPreprocessor.html @@ -0,0 +1,632 @@ + + + + PassthroughPreprocessor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PassthroughPreprocessor

+
+
+ +
public struct PassthroughPreprocessor : DataPreprocessor
+ +
+
+

DataPreprocessor that returns passed Data without any transform.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughStreamSerializer.html new file mode 100644 index 00000000..e7e4f7d4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/PassthroughStreamSerializer.html @@ -0,0 +1,632 @@ + + + + PassthroughStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PassthroughStreamSerializer

+
+
+ +
public struct PassthroughStreamSerializer : DataStreamSerializer
+ +
+
+

DataStreamSerializer which performs no serialization on incoming Data.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/Redirector.html b/Carthage/Checkouts/Alamofire/docs/Structs/Redirector.html new file mode 100644 index 00000000..68eaa984 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/Redirector.html @@ -0,0 +1,764 @@ + + + + Redirector Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Redirector

+
+
+ +
public struct Redirector
+
extension Redirector: RedirectHandler
+ +
+
+

Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Behavior + +
    +
    +
    +
    +
    +
    +

    Defines the behavior of the Redirector type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + follow + +
    +
    +
    +
    +
    +
    +

    Returns a Redirector with a .follow Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let follow: Redirector
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + +
    +
    +
    +
    +
    +
    +

    Returns a Redirector with a .doNotFollow Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doNotFollow: Redirector
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + behavior + +
    +
    +
    +
    +
    +
    +

    The Behavior of the Redirector.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let behavior: Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(behavior:) + +
    +
    +
    +
    +
    +
    +

    Creates a Redirector instance from the Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(behavior: Behavior)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + behavior + + +
    +

    The Behavior.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func task(_ task: URLSessionTask,
    +                 willBeRedirectedTo request: URLRequest,
    +                 for response: HTTPURLResponse,
    +                 completion: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/Redirector/Behavior.html b/Carthage/Checkouts/Alamofire/docs/Structs/Redirector/Behavior.html new file mode 100644 index 00000000..1a324e60 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/Redirector/Behavior.html @@ -0,0 +1,660 @@ + + + + Behavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Behavior

+
+
+ +
public enum Behavior
+ +
+
+

Defines the behavior of the Redirector type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + follow + +
    +
    +
    +
    +
    +
    +

    Follow the redirect as defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case follow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + +
    +
    +
    +
    +
    +
    +

    Do not follow the redirect defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotFollow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(_:) + +
    +
    +
    +
    +
    +
    +

    Modify the redirect request defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/RequestAdapterState.html b/Carthage/Checkouts/Alamofire/docs/Structs/RequestAdapterState.html new file mode 100644 index 00000000..cea0e29f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/RequestAdapterState.html @@ -0,0 +1,633 @@ + + + + RequestAdapterState Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestAdapterState

+
+
+ +
public struct RequestAdapterState
+ +
+
+

Stores all state associated with a URLRequest being adapted.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requestID + +
    +
    +
    +
    +
    +
    +

    The UUID of the Request associated with the URLRequest to adapt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let requestID: UUID
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + session + +
    +
    +
    +
    +
    +
    +

    The Session associated with the URLRequest to adapt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let session: Session
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher.html b/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher.html new file mode 100644 index 00000000..fc6d7d77 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher.html @@ -0,0 +1,764 @@ + + + + ResponseCacher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseCacher

+
+
+ +
public struct ResponseCacher
+
extension ResponseCacher: CachedResponseHandler
+ +
+
+

ResponseCacher is a convenience CachedResponseHandler making it easy to cache, not cache, or modify a cached +response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Behavior + +
    +
    +
    +
    +
    +
    +

    Defines the behavior of the ResponseCacher type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cache + +
    +
    +
    +
    +
    +
    +

    Returns a ResponseCacher with a .cache Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let cache: ResponseCacher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + +
    +
    +
    +
    +
    +
    +

    Returns a ResponseCacher with a .doNotCache Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doNotCache: ResponseCacher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + behavior + +
    +
    +
    +
    +
    +
    +

    The Behavior of the ResponseCacher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let behavior: Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(behavior:) + +
    +
    +
    +
    +
    +
    +

    Creates a ResponseCacher instance from the Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(behavior: Behavior)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + behavior + + +
    +

    The Behavior.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataTask(_ task: URLSessionDataTask,
    +                     willCacheResponse response: CachedURLResponse,
    +                     completion: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher/Behavior.html b/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher/Behavior.html new file mode 100644 index 00000000..526251c7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/ResponseCacher/Behavior.html @@ -0,0 +1,660 @@ + + + + Behavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Behavior

+
+
+ +
public enum Behavior
+ +
+
+

Defines the behavior of the ResponseCacher type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + cache + +
    +
    +
    +
    +
    +
    +

    Stores the cached response in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cache
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + +
    +
    +
    +
    +
    +
    +

    Prevents the cached response from being stored in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotCache
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(_:) + +
    +
    +
    +
    +
    +
    +

    Modifies the cached response before storing it in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf.html b/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf.html new file mode 100644 index 00000000..184c4f96 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf.html @@ -0,0 +1,687 @@ + + + + StreamOf Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StreamOf

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct StreamOf<Element> : AsyncSequence
+ +
+
+

An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AsyncIterator + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AsyncIterator = Iterator
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BufferingPolicy + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias BufferingPolicy = AsyncStream<Element>.Continuation.BufferingPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + makeAsyncIterator() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeAsyncIterator() -> Iterator
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Iterator + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Iterator : AsyncIteratorProtocol
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf/Iterator.html b/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf/Iterator.html new file mode 100644 index 00000000..5241ba2c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/StreamOf/Iterator.html @@ -0,0 +1,608 @@ + + + + Iterator Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Iterator

+
+
+ +
public struct Iterator : AsyncIteratorProtocol
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + next() + + + Asynchronous + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func next() async -> Element?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/StringStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/Structs/StringStreamSerializer.html new file mode 100644 index 00000000..042d3b26 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/StringStreamSerializer.html @@ -0,0 +1,632 @@ + + + + StringStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StringStreamSerializer

+
+
+ +
public struct StringStreamSerializer : DataStreamSerializer
+ +
+
+

DataStreamSerializer which serializes incoming stream Data into UTF8-decoded String values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(_ data: Data) throws -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding.html b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding.html new file mode 100644 index 00000000..1034ea4a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding.html @@ -0,0 +1,1098 @@ + + + + URLEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncoding

+
+
+ +
public struct URLEncoding : ParameterEncoding
+ +
+
+

Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +the HTTP body depends on the destination of the encoding.

+ +

The Content-Type HTTP header field of an encoded request with HTTP body is set to +application/x-www-form-urlencoded; charset=utf-8.

+ +

There is no published specification for how to encode collection types. By default the convention of appending +[] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for +nested dictionary values (foo[bar]=baz) is used. Optionally, ArrayEncoding can be used to omit the +square brackets appended to array keys.

+ +

BoolEncoding can be used to configure how boolean values are encoded. The default behavior is to encode +true as 1 and false as 0.

+ +
+
+ +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + Destination + +
    +
    +
    +
    +
    +
    +

    Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the +resulting URL request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Destination
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ArrayEncoding + +
    +
    +
    +
    +
    +
    +

    Configures how Array parameters are encoded.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BoolEncoding + +
    +
    +
    +
    +
    +
    +

    Configures how Bool parameters are encoded.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum BoolEncoding
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns a default URLEncoding instance with a .methodDependent destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Returns a URLEncoding instance with a .queryString destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var queryString: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Returns a URLEncoding instance with an .httpBody destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var httpBody: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + destination + +
    +
    +
    +
    +
    +
    +

    The destination defining where the encoded query string is to be applied to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let destination: Destination
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + arrayEncoding + +
    +
    +
    +
    +
    +
    +

    The encoding to use for Array parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let arrayEncoding: ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolEncoding + +
    +
    +
    +
    +
    +
    +

    The encoding to use for Bool parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boolEncoding: BoolEncoding
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the specified parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(destination: Destination = .methodDependent,
    +            arrayEncoding: ArrayEncoding = .brackets,
    +            boolEncoding: BoolEncoding = .numeric)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + destination + + +
    +

    Destination defining where the encoded query string will be applied. .methodDependent by + default.

    +
    +
    + + arrayEncoding + + +
    +

    ArrayEncoding to use. .brackets by default.

    +
    +
    + + boolEncoding + + +
    +

    BoolEncoding to use. .numeric by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Encoding +

+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func queryComponents(fromKey key: String, value: Any) -> [(String, String)]
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    Key of the query component.

    +
    +
    + + value + + +
    +

    Value of the query component.

    +
    +
    +
    +
    +

    Return Value

    +

    The percent-escaped, URL encoded query string components.

    +
    +
    +
    +
  • +
  • +
    + + + + escape(_:) + +
    +
    +
    +
    +
    +
    +

    Creates a percent-escaped string following RFC 3986 for a query string key or value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func escape(_ string: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + string + + +
    +

    String to be percent-escaped.

    +
    +
    +
    +
    +

    Return Value

    +

    The percent-escaped String.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/ArrayEncoding.html b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/ArrayEncoding.html new file mode 100644 index 00000000..4acc30db --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/ArrayEncoding.html @@ -0,0 +1,687 @@ + + + + ArrayEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ArrayEncoding

+
+
+ +
public enum ArrayEncoding
+ +
+
+

Configures how Array parameters are encoded.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    An empty set of square brackets is appended to the key for every value. This is the default behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case brackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noBrackets + +
    +
    +
    +
    +
    +
    +

    No brackets are appended. The key is encoded as is.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + indexInBrackets + +
    +
    +
    +
    +
    +
    +

    Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case indexInBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Provide a custom array key encoding with the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((_ key: String, _ index: Int) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/BoolEncoding.html b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/BoolEncoding.html new file mode 100644 index 00000000..c48baa9d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/BoolEncoding.html @@ -0,0 +1,633 @@ + + + + BoolEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BoolEncoding

+
+
+ +
public enum BoolEncoding
+ +
+
+

Configures how Bool parameters are encoded.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + numeric + +
    +
    +
    +
    +
    +
    +

    Encode true as 1 and false as 0. This is the default behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case numeric
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + literal + +
    +
    +
    +
    +
    +
    +

    Encode true and false as string literals.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case literal
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/Destination.html b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/Destination.html new file mode 100644 index 00000000..6c50095f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/URLEncoding/Destination.html @@ -0,0 +1,662 @@ + + + + Destination Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Destination

+
+
+ +
public enum Destination
+ +
+
+

Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the +resulting URL request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + methodDependent + +
    +
    +
    +
    +
    +
    +

    Applies encoded query string result to existing query string for GET, HEAD and DELETE requests and +sets as the HTTP body for requests with any other HTTP method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case methodDependent
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Sets or appends encoded query string result to existing query string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case queryString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Sets encoded query string result as the HTTP body of the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpBody
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Structs/URLResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/Structs/URLResponseSerializer.html new file mode 100644 index 00000000..abf485eb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Structs/URLResponseSerializer.html @@ -0,0 +1,636 @@ + + + + URLResponseSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLResponseSerializer

+
+
+ +
public struct URLResponseSerializer : DownloadResponseSerializerProtocol
+ +
+
+

A DownloadResponseSerializerProtocol that performs only Error checking and ensures that a downloaded fileURL +is present.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializeDownload(request: URLRequest?,
    +                              response: HTTPURLResponse?,
    +                              fileURL: URL?,
    +                              error: Error?) throws -> URL
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/Typealiases.html b/Carthage/Checkouts/Alamofire/docs/Typealiases.html new file mode 100644 index 00000000..1d48baa7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/Typealiases.html @@ -0,0 +1,783 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Parameters + +
    +
    +
    +
    +
    +
    +

    A dictionary of parameters to apply to a URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Parameters = [String : Any]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AdaptHandler + +
    +
    +
    +
    +
    +
    +

    RequestAdapter closure definition.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AdaptHandler = (URLRequest, Session, _ completion: @escaping (Result<URLRequest, Error>) -> Void) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryHandler + +
    +
    +
    +
    +
    +
    +

    RequestRetrier closure definition.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias RetryHandler = (Request, Session, Error, _ completion: @escaping (RetryResult) -> Void) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFDataResponse + +
    +
    +
    +
    +
    +
    +

    Default type of DataResponse returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFDataResponse<Success> = DataResponse<Success, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFDownloadResponse + +
    +
    +
    +
    +
    +
    +

    Default type of DownloadResponse returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFDownloadResponse<Success> = DownloadResponse<Success, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFResult + +
    +
    +
    +
    +
    +
    +

    Default type of Result returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFResult<Success> = Result<Success, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Server Trust Evaluators +

+
+
+
    +
  • +
    + + + + DisabledEvaluator + +
    +
    +
    +
    +
    +
    +

    Disables all evaluation which in turn will always consider any server trust as valid.

    +
    +

    Note

    + Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
    + +

    THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, renamed: "DisabledTrustEvaluator", message: "DisabledEvaluator has been renamed DisabledTrustEvaluator.")
    +public typealias DisabledEvaluator = DisabledTrustEvaluator
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/badge.svg b/Carthage/Checkouts/Alamofire/docs/badge.svg new file mode 100644 index 00000000..5f56a7ec --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 97% + + + 97% + + + diff --git a/Carthage/Checkouts/Alamofire/docs/css/highlight.css b/Carthage/Checkouts/Alamofire/docs/css/highlight.css new file mode 100644 index 00000000..c170357c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/Carthage/Checkouts/Alamofire/docs/css/jazzy.css b/Carthage/Checkouts/Alamofire/docs/css/jazzy.css new file mode 100644 index 00000000..c7bb9fe2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Info.plist b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Info.plist new file mode 100644 index 00000000..dfd720b8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleIdentifier + com.jazzy.alamofire + CFBundleName + Alamofire + DocSetPlatformFamily + alamofire + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + DashDocSetFallbackURL + https://alamofire.github.io/Alamofire/ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 00000000..831a6ac3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,1699 @@ + + + + Classes Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Classes

+

The following classes are available globally.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests. +It relies on an Authenticator type to handle the actual URLRequest authentication and Credential refresh.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class AuthenticationInterceptor<AuthenticatorType> : RequestInterceptor where AuthenticatorType : Authenticator
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest +

+
+
+
    +
  • +
    + + + + DataRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which handles in-memory Data download using URLSessionDataTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class DataRequest : Request
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + DataStreamRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which streams HTTP response Data through a Handler closure.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DataStreamRequest : Request
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadRequest +

+
+
+
    +
  • +
    + + + + DownloadRequest + +
    +
    +
    +
    +
    +
    +

    Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class DownloadRequest : Request
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Request + +
    +
    +
    +
    +
    +
    +

    Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback +handling.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Request
    +
    extension Request: Equatable
    +
    extension Request: Hashable
    +
    extension Request: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CompositeEventMonitor + +
    +
    +
    +
    +
    +
    +

    An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class CompositeEventMonitor : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ClosureEventMonitor + +
    +
    +
    +
    +
    +
    +

    EventMonitor that allows optional closures to be set to receive events.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ClosureEventMonitor : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MultipartFormData + +
    +
    +
    +
    +
    +
    +

    Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode +multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.

    + +

    For more information on multipart/form-data in general, please refer to the RFC-2388 and RFC-2045 specs as well +and the w3 form documentation.

    + + + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class MultipartFormData
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and +WiFi network interfaces.

    + +

    Reachability can be used to determine background information about why a network operation failed, or to retry +network requests when a connection is established. It should not be used to prevent a user from initiating a network +request, as it’s possible that an initial request may be required to establish reachability.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class NetworkReachabilityManager
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    EventMonitor that provides Alamofire’s notifications.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class AlamofireNotifications : EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + JSONParameterEncoder + +
    +
    +
    +
    +
    +
    +

    A ParameterEncoder that encodes types as JSON body data.

    + +

    If no Content-Type header is already set on the provided URLRequests, it’s set to application/json.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class JSONParameterEncoder : ParameterEncoder
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +on the Destination set.

    + +

    If no Content-Type header is already set on the provided URLRequests, it will be set to +application/x-www-form-urlencoded; charset=utf-8.

    + +

    Encoding behavior can be customized by passing an instance of URLEncodedFormEncoder to the initializer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class URLEncodedFormParameterEncoder : ParameterEncoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+
    +
  • +
    + + + + UploadRequest + +
    +
    +
    +
    +
    +
    +

    DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class UploadRequest : DataRequest
    + +
    +
    +
    +
    +
  • +
+
+
+ +
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a +request returning nil or no data is considered an error. However, if the request has an HTTPMethod or the +response has an HTTP status code valid for empty responses, then an empty Data value is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DataResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no +data is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code +valid for empty responses, then an empty String is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class StringResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning +nil or no data is considered an error. However, if the request has an HTTPMethod or the response has an +HTTP status code valid for empty responses, then an NSNull value is returned.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "JSONResponseSerializer deprecated and will be removed in Alamofire 6. Use DecodableResponseSerializer instead.")
    +public final class JSONResponseSerializer : ResponseSerializer
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A ResponseSerializer that decodes the response data as a generic value using any type that conforms to +DataDecoder. By default, this is an instance of JSONDecoder. Additionally, a request returning nil or no data +is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code valid +for empty responses then an empty value will be returned. If the decoded type conforms to EmptyResponse, the +type’s emptyValue() will be returned. If the decoded type is Empty, the .value instance is returned. If the +decoded type does not conform to EmptyResponse and isn’t Empty, an error will be produced.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DecodableResponseSerializer<T> : ResponseSerializer where T : Decodable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryPolicy + +
    +
    +
    +
    +
    +
    +

    A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +as well as certain types of networking errors.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class RetryPolicy : RequestInterceptor
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    A retry policy that automatically retries idempotent requests for network connection lost errors. For more +information about retrying network connection lost errors, please refer to Apple’s +technical document.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ConnectionLostRetryPolicy : RetryPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ServerTrustManager + +
    +
    +
    +
    +
    +
    +

    Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class ServerTrustManager
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Server Trust Evaluators +

+
+
+
    +
  • +
    + + + + DefaultTrustEvaluator + +
    +
    +
    +
    +
    +
    +

    An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +host provided by the challenge. Applications are encouraged to always validate the host in production environments +to guarantee the validity of the server’s certificate chain.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DefaultTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +environments to guarantee the validity of the server’s certificate chain.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class RevocationTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +certificates match one of the server certificates. By validating both the certificate chain and host, certificate +pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class PinnedCertificatesTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +public keys match one of the server certificate public keys. By validating both the certificate chain and host, +public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class PublicKeysTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +evaluators consider it valid.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class CompositeTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Disables all evaluation which in turn will always consider any server trust as valid.

    +
    +

    Note

    + Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
    + +

    THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class DisabledTrustEvaluator : ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Session + +
    +
    +
    +
    +
    +
    +

    Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common +functionality for all Requests, including queuing, interception, trust management, redirect handling, and response +cache handling.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class Session
    +
    extension Session: RequestDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SessionDelegate + +
    +
    +
    +
    +
    +
    +

    Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open class SessionDelegate : NSObject
    +
    extension SessionDelegate: URLSessionDelegate
    +
    extension SessionDelegate: URLSessionTaskDelegate
    +
    extension SessionDelegate: URLSessionDataDelegate
    +
    extension SessionDelegate: URLSessionDownloadDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + URLEncodedFormEncoder + +
    +
    +
    +
    +
    +
    +

    An object that encodes instances into URL-encoded query strings.

    + +

    ArrayEncoding can be used to configure how Array values are encoded. By default, the .brackets encoding is +used, encoding array values with brackets for each value. e.g array[]=1&array[]=2.

    + +

    BoolEncoding can be used to configure how Bool values are encoded. By default, the .numeric encoding is used, +encoding true as 1 and false as 0.

    + +

    DataEncoding can be used to configure how Data values are encoded. By default, the .deferredToData encoding is +used, which encodes Data values using their default Encodable implementation.

    + +

    DateEncoding can be used to configure how Date values are encoded. By default, the .deferredToDate +encoding is used, which encodes Dates using their default Encodable implementation.

    + +

    KeyEncoding can be used to configure how keys are encoded. By default, the .useDefaultKeys encoding is used, +which encodes the keys directly from the Encodable implementation.

    + +

    KeyPathEncoding can be used to configure how paths within nested objects are encoded. By default, the .brackets +encoding is used, which encodes each sub-key in brackets. e.g. parent[child][grandchild]=value.

    + +

    NilEncoding can be used to configure how nil Optional values are encoded. By default, the .dropKey encoding +is used, which drops nil key / value pairs from the output entirely.

    + +

    SpaceEncoding can be used to configure how spaces are encoded. By default, the .percentEscaped encoding is used, +replacing spaces with %20.

    + +

    This type is largely based on Vapor’s url-encoded-form project.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public final class URLEncodedFormEncoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Adapter.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Adapter.html new file mode 100644 index 00000000..0f92ff22 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Adapter.html @@ -0,0 +1,677 @@ + + + + Adapter Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Adapter

+
+
+ +
open class Adapter : RequestInterceptor
+ +
+
+

Closure-based RequestAdapter.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ adaptHandler: @escaping AdaptHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + adaptHandler + + +
    +

    AdaptHandler closure to be executed when handling request adaptation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AlamofireNotifications.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AlamofireNotifications.html new file mode 100644 index 00000000..54927424 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AlamofireNotifications.html @@ -0,0 +1,787 @@ + + + + AlamofireNotifications Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireNotifications

+
+
+ +
public final class AlamofireNotifications : EventMonitor
+ +
+
+

EventMonitor that provides Alamofire’s notifications.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requestDidResume(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidResume(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidSuspend(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidSuspend(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidCancel(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidCancel(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidFinish(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestDidFinish(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didResumeTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didSuspendTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didCancelTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor.html new file mode 100644 index 00000000..a91b3c62 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor.html @@ -0,0 +1,866 @@ + + + + AuthenticationInterceptor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationInterceptor

+
+
+ +
public class AuthenticationInterceptor<AuthenticatorType> : RequestInterceptor where AuthenticatorType : Authenticator
+ +
+
+

The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests. +It relies on an Authenticator type to handle the actual URLRequest authentication and Credential refresh.

+ +
+
+ +
+
+
+
+ + +
+ +

Typealiases +

+
+
+
    +
  • +
    + + + + Credential + +
    +
    +
    +
    +
    +
    +

    Type of credential used to authenticate requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Credential = AuthenticatorType.Credential
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + RefreshWindow + +
    +
    +
    +
    +
    +
    +

    Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a +refresh, the AuthenticationInterceptor compares the timestamp history of previous refresh calls against the +RefreshWindow. If more refreshes have occurred within the refresh window than allowed, the refresh is +cancelled and an AuthorizationError.excessiveRefresh error is thrown.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct RefreshWindow
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + credential + +
    +
    +
    +
    +
    +
    +

    The Credential used to authenticate requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var credential: Credential? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an AuthenticationInterceptor instance from the specified parameters.

    + +

    A nil RefreshWindow will result in the AuthenticationInterceptor not checking for excessive refresh calls. +It is recommended to always use a RefreshWindow to avoid endless refresh cycles.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(authenticator: AuthenticatorType,
    +            credential: Credential? = nil,
    +            refreshWindow: RefreshWindow? = RefreshWindow())
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + authenticator + + +
    +

    The Authenticator type.

    +
    +
    + + credential + + +
    +

    The Credential if it exists. nil by default.

    +
    +
    + + refreshWindow + + +
    +

    The RefreshWindow used to identify excessive refresh calls. RefreshWindow() by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Adapt +

+
+
+
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Retry +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor/RefreshWindow.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor/RefreshWindow.html new file mode 100644 index 00000000..fe70900c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/AuthenticationInterceptor/RefreshWindow.html @@ -0,0 +1,697 @@ + + + + RefreshWindow Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RefreshWindow

+
+
+ +
public struct RefreshWindow
+ +
+
+

Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a +refresh, the AuthenticationInterceptor compares the timestamp history of previous refresh calls against the +RefreshWindow. If more refreshes have occurred within the refresh window than allowed, the refresh is +cancelled and an AuthorizationError.excessiveRefresh error is thrown.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + interval + +
    +
    +
    +
    +
    +
    +

    TimeInterval defining the duration of the time window before the current time in which the number of +refresh attempts is compared against maximumAttempts. For example, if interval is 30 seconds, then the +RefreshWindow represents the past 30 seconds. If more attempts occurred in the past 30 seconds than +maximumAttempts, an .excessiveRefresh error will be thrown.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interval: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + maximumAttempts + +
    +
    +
    +
    +
    +
    +

    Total refresh attempts allowed within interval before throwing an .excessiveRefresh error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let maximumAttempts: Int
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RefreshWindow instance from the specified interval and maximumAttempts.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(interval: TimeInterval = 30.0, maximumAttempts: Int = 5)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + interval + + +
    +

    TimeInterval defining the duration of the time window before the current time.

    +
    +
    + + maximumAttempts + + +
    +

    The maximum attempts allowed within the TimeInterval.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ClosureEventMonitor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ClosureEventMonitor.html new file mode 100644 index 00000000..a797fbe6 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ClosureEventMonitor.html @@ -0,0 +1,2860 @@ + + + + ClosureEventMonitor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ClosureEventMonitor

+
+
+ +
open class ClosureEventMonitor : EventMonitor
+ +
+
+

EventMonitor that allows optional closures to be set to receive events.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Request Events +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeEventMonitor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeEventMonitor.html new file mode 100644 index 00000000..394af3fe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeEventMonitor.html @@ -0,0 +1,1780 @@ + + + + CompositeEventMonitor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CompositeEventMonitor

+
+
+ +
public final class CompositeEventMonitor : EventMonitor
+ +
+
+

An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeTrustEvaluator.html new file mode 100644 index 00000000..c7d1d75b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/CompositeTrustEvaluator.html @@ -0,0 +1,652 @@ + + + + CompositeTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CompositeTrustEvaluator

+
+
+ +
public final class CompositeTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the +evaluators consider it valid.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(evaluators:) + +
    +
    +
    +
    +
    +
    +

    Creates a CompositeTrustEvaluator from the provided evaluators.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(evaluators: [ServerTrustEvaluating])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + evaluators + + +
    +

    The ServerTrustEvaluating values used to evaluate the server trust.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ConnectionLostRetryPolicy.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ConnectionLostRetryPolicy.html new file mode 100644 index 00000000..1ad65600 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ConnectionLostRetryPolicy.html @@ -0,0 +1,670 @@ + + + + ConnectionLostRetryPolicy Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionLostRetryPolicy

+
+
+ +
open class ConnectionLostRetryPolicy : RetryPolicy
+ +
+
+

A retry policy that automatically retries idempotent requests for network connection lost errors. For more +information about retrying network connection lost errors, please refer to Apple’s +technical document.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataRequest.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataRequest.html new file mode 100644 index 00000000..213a312f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataRequest.html @@ -0,0 +1,2857 @@ + + + + DataRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataRequest

+
+
+ +
public class DataRequest : Request
+ +
+
+

Request subclass which handles in-memory Data download using URLSessionDataTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + convertible + +
    +
    +
    +
    +
    +
    +

    URLRequestConvertible value used to create URLRequests for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let convertible: URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    Data read from the server so far.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var data: Data? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the request, using the specified closure.

    +
    +

    Note

    +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure used to validate the response.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion +handler to return a ResponseDisposition value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    on queue: DispatchQueue = .main,
    +    perform handler: @escaping (_ response: HTTPURLResponse,
    +                                _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse. The completionHandler provided + MUST be called, otherwise the request will never complete.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(on queue: DispatchQueue = .main,
    +                           perform handler: @escaping (HTTPURLResponse) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+ +
+
+
+ + +
+ +

DataTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func httpResponses(bufferingPolicy: StreamOf<HTTPURLResponse>.BufferingPolicy = .unbounded) -> StreamOf<HTTPURLResponse>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<HTTPURLResponse>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure returning a Request.ResponseDisposition, called whenever the DataRequest produces an +HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> ResponseDisposition
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received and returning a + ResponseDisposition value. This value determines whether to continue the request or cancel it as + if cancel() had been called on the instance. Note, this closure is called on an arbitrary thread, + so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure called whenever the DataRequest produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(perform handler: @escaping @Sendable (_ response: HTTPURLResponse) async -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received. Note, this closure is called on an + arbitrary thread, so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await a Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                            dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DataTask<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before completion.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization of a Decodable value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
    +                                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                   dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
    +                                                   decoder: DataDecoder = JSONDecoder(),
    +                                                   emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
    +                                                   emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DataTask<Value>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization of a String value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                              dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                              encoding: String.Encoding? = nil,
    +                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DataTask<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    String.Encoding to use during serialization. Defaults to nil, in which case + the encoding will be determined from the server response, falling back to the + default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization using the provided ResponseSerializer instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingResponse<Serializer: ResponseSerializer>(using serializer: Serializer,
    +                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DataTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    ResponseSerializer responsible for serializing the request, response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataTask to await serialization using the provided DataResponseSerializerProtocol instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingResponse<Serializer: DataResponseSerializerProtocol>(using serializer: Serializer,
    +                                                                            automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DataTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DataResponseSerializerProtocol responsible for serializing the request, + response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DataTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Default +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response(queue: DispatchQueue = .main, completionHandler: @escaping (AFDataResponse<Data?>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: DataResponseSerializerProtocol>(queue: DispatchQueue = .main,
    +                                                                 responseSerializer: Serializer,
    +                                                                 completionHandler: @escaping (AFDataResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: ResponseSerializer>(queue: DispatchQueue = .main,
    +                                                     responseSerializer: Serializer,
    +                                                     completionHandler: @escaping (AFDataResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DataResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseData(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,
    +                         completionHandler: @escaping (AFDataResponse<Data>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a StringResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseString(queue: DispatchQueue = .main,
    +                           dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                           encoding: String.Encoding? = nil,
    +                           emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                           emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,
    +                           completionHandler: @escaping (AFDataResponse<String>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    The string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a JSONResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.")
    +@discardableResult
    +public func responseJSON(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +                         options: JSONSerialization.ReadingOptions = .allowFragments,
    +                         completionHandler: @escaping (AFDataResponse<Any>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + options + + +
    +

    JSONSerialization.ReadingOptions used when parsing the response. .allowFragments + by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                            queue: DispatchQueue = .main,
    +                                            dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
    +                                            decoder: DataDecoder = JSONDecoder(),
    +                                            emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
    +                                            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,
    +                                            completionHandler: @escaping (AFDataResponse<T>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the +request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataResponseSerializer.html new file mode 100644 index 00000000..b7e005b2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataResponseSerializer.html @@ -0,0 +1,757 @@ + + + + DataResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponseSerializer

+
+
+ +
public final class DataResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a +request returning nil or no data is considered an error. However, if the request has an HTTPMethod or the +response has an HTTP status code valid for empty responses, then an empty Data value is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataResponseSerializer using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest.html new file mode 100644 index 00000000..ac300a22 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest.html @@ -0,0 +1,1998 @@ + + + + DataStreamRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamRequest

+
+
+ +
public final class DataStreamRequest : Request
+ +
+
+

Request subclass which streams HTTP response Data through a Handler closure.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Handler + +
    +
    +
    +
    +
    +
    +

    Closure type handling DataStreamRequest.Stream values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Handler<Success, Failure> = (Stream<Success, Failure>) throws -> Void where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Stream + +
    +
    +
    +
    +
    +
    +

    Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used +to stop the stream at any time.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Stream<Success, Failure> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Event + +
    +
    +
    +
    +
    +
    +

    Type representing an event flowing through the stream. Contains either the Result of processing streamed +Data or the completion of the stream.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Event<Success, Failure> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Completion + +
    +
    +
    +
    +
    +
    +

    Value containing the state of a DataStreamRequest when the stream was completed.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Completion
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CancellationToken + +
    +
    +
    +
    +
    +
    +

    Type used to cancel an ongoing stream.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct CancellationToken
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertible + +
    +
    +
    +
    +
    +
    +

    URLRequestConvertible value used to create URLRequests for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let convertible: URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether or not the instance will be cancelled if stream parsing encounters an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let automaticallyCancelOnStreamError: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the URLRequest and HTTPURLResponse received for the instance using the provided Validation closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure used to validate the request and response.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Produces an InputStream that receives the Data received by the instance.

    +
    +

    Note

    +

    The InputStream produced by this method must have open() called before being able to read Data. + Additionally, this method will automatically call resume() on the instance, regardless of whether or + not the creating session has startRequestsImmediately set to true.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asInputStream(bufferSize: Int = 1024) -> InputStream?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferSize + + +
    +

    Size, in bytes, of the buffer between the OutputStream and InputStream.

    +
    +
    +
    +
    +

    Return Value

    +

    The InputStream bound to the internal OutboundStream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion +handler to return a ResponseDisposition value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(
    +    on queue: DispatchQueue = .main,
    +    perform handler: @escaping (_ response: HTTPURLResponse,
    +                                _ completionHandler: @escaping (ResponseDisposition) -> Void) -> Void
    +) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse. The completionHandler provided + MUST be called, otherwise the request will never complete.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(on queue: DispatchQueue = .main,
    +                           perform handler: @escaping (HTTPURLResponse) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the closure will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure called when the instance produces an HTTPURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance using the given DataStreamSerializer and DispatchQueue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishStream<Serializer: DataStreamSerializer>(using serializer: Serializer,
    +                                                            on queue: DispatchQueue = .main) -> DataStreamPublisher<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer used to serialize the streamed Data.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • +
    + + + + publishData(queue:) + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a PassthroughStreamSerializer to stream Data +unserialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishData(queue: DispatchQueue = .main) -> DataStreamPublisher<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • +
    + + + + publishString(queue:) + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a StringStreamSerializer to serialize stream +Data values into String values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishString(queue: DispatchQueue = .main) -> DataStreamPublisher<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataStreamPublisher for this instance which uses a DecodableStreamSerializer with the provided +parameters to serialize stream Data values into the provided type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public func publishDecodable<T: Decodable>(type: T.Type = T.self,
    +                                           queue: DispatchQueue = .main,
    +                                           decoder: DataDecoder = JSONDecoder(),
    +                                           preprocessor: DataPreprocessor = PassthroughPreprocessor()) -> DataStreamPublisher<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to which to decode stream Data. Inferred from the context by default.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataRequest.Stream values will be published. .main by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder instance used to decode stream Data. JSONDecoder() by default.

    +
    +
    + + preprocessor + + +
    +

    DataPreprocessor which filters incoming stream Data before serialization. + PassthroughPreprocessor() by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamPublisher.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func httpResponses(bufferingPolicy: StreamOf<HTTPURLResponse>.BufferingPolicy = .unbounded) -> StreamOf<HTTPURLResponse>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<HTTPURLResponse>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure returning a Request.ResponseDisposition, called whenever the DataStreamRequest +produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +@_disfavoredOverload
    +public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> ResponseDisposition) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received and returning a + ResponseDisposition value. This value determines whether to continue the request or cancel it as + if cancel() had been called on the instance. Note, this closure is called on an arbitrary thread, + so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets an async closure called whenever the DataStreamRequest produces an HTTPURLResponse.

    +
    +

    Note

    +

    Most requests will only produce a single response for each outgoing attempt (initial + retries). + However, some types of response may trigger multiple HTTPURLResponses, such as multipart streams, + where responses after the first will contain the part headers.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onHTTPResponse(perform handler: @escaping @Sendable (HTTPURLResponse) async -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Async closure executed when a new HTTPURLResponse is received. Note, this closure is called on an + arbitrary thread, so any synchronous calls in it will execute in that context.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + streamTask() + +
    +
    +
    +
    +
    +
    +

    Creates a DataStreamTask used to await streams of serialized values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamTask() -> DataStreamTask
    + +
    +
    +
    +

    Return Value

    +

    The DataStreamTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which performs no parsing on incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStream(on queue: DispatchQueue = .main, stream: @escaping Handler<Data, Never>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which uses the provided DataStreamSerializer to process incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStream<Serializer: DataStreamSerializer>(using serializer: Serializer,
    +                                                             on queue: DispatchQueue = .main,
    +                                                             stream: @escaping Handler<Serializer.SerializedObject, AFError>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer used to process incoming Data. Its work is done on the serializationQueue.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which parses incoming Data as a UTF8 String.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStreamString(on queue: DispatchQueue = .main,
    +                                 stream: @escaping Handler<String, Never>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a StreamHandler which parses incoming Data using the provided DataDecoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseStreamDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                                  on queue: DispatchQueue = .main,
    +                                                  using decoder: DataDecoder = JSONDecoder(),
    +                                                  preprocessor: DataPreprocessor = PassthroughPreprocessor(),
    +                                                  stream: @escaping Handler<T, AFError>) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to parse incoming Data into.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which to perform StreamHandler closure.

    +
    +
    + + decoder + + +
    +

    DataDecoder used to decode the incoming Data.

    +
    +
    + + preprocessor + + +
    +

    DataPreprocessor used to process the incoming Data before it’s passed to the decoder.

    +
    +
    + + stream + + +
    +

    StreamHandler closure called as Data is received. May be called multiple times.

    +
    +
    +
    +
    +

    Return Value

    +

    The DataStreamRequest.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URLRequest and HTTPURLResponse and returns whether the +request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (_ request: URLRequest?, _ response: HTTPURLResponse) -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/CancellationToken.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/CancellationToken.html new file mode 100644 index 00000000..62d5def2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/CancellationToken.html @@ -0,0 +1,606 @@ + + + + CancellationToken Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CancellationToken

+
+
+ +
public struct CancellationToken
+ +
+
+

Type used to cancel an ongoing stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the ongoing stream by canceling the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Completion.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Completion.html new file mode 100644 index 00000000..c6086764 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Completion.html @@ -0,0 +1,687 @@ + + + + Completion Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Completion

+
+
+ +
public struct Completion
+ +
+
+

Value containing the state of a DataStreamRequest when the stream was completed.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    Last URLRequest issued by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    Last HTTPURLResponse received by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTaskMetrics produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    AFError produced for the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let error: AFError?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Event.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Event.html new file mode 100644 index 00000000..ae471c98 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Event.html @@ -0,0 +1,636 @@ + + + + Event Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Event

+
+
+ +
public enum Event<Success, Failure> where Failure : Error
+ +
+
+

Type representing an event flowing through the stream. Contains either the Result of processing streamed +Data or the completion of the stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + stream(_:) + +
    +
    +
    +
    +
    +
    +

    Output produced every time the instance receives additional Data. The associated value contains the +Result of processing the incoming Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stream(Result<Success, Failure>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + complete(_:) + +
    +
    +
    +
    +
    +
    +

    Output produced when the instance has completed, whether due to stream end, cancellation, or an error. +Associated Completion value contains the final state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case complete(Completion)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Stream.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Stream.html new file mode 100644 index 00000000..70f33d5e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DataStreamRequest/Stream.html @@ -0,0 +1,782 @@ + + + + Stream Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Stream

+
+
+ +
public struct Stream<Success, Failure> where Failure : Error
+ +
+
+

Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used +to stop the stream at any time.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + event + +
    +
    +
    +
    +
    +
    +

    Latest Event from the stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let event: Event<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + token + +
    +
    +
    +
    +
    +
    +

    Token used to cancel the stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let token: CancellationToken
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the ongoing stream by canceling the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    Incoming Result values from Event.stream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Success, Failure>? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Success value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Failure value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + completion + +
    +
    +
    +
    +
    +
    +

    Completion value of the instance, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var completion: DataStreamRequest.Completion? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DecodableResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DecodableResponseSerializer.html new file mode 100644 index 00000000..ba675d72 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DecodableResponseSerializer.html @@ -0,0 +1,800 @@ + + + + DecodableResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DecodableResponseSerializer

+
+
+ +
public final class DecodableResponseSerializer<T> : ResponseSerializer where T : Decodable
+ +
+
+

A ResponseSerializer that decodes the response data as a generic value using any type that conforms to +DataDecoder. By default, this is an instance of JSONDecoder. Additionally, a request returning nil or no data +is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code valid +for empty responses then an empty value will be returned. If the decoded type conforms to EmptyResponse, the +type’s emptyValue() will be returned. If the decoded type is Empty, the .value instance is returned. If the +decoded type does not conform to EmptyResponse and isn’t Empty, an error will be produced.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + decoder + +
    +
    +
    +
    +
    +
    +

    The DataDecoder instance used to decode responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let decoder: DataDecoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the values provided.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = DecodableResponseSerializer.defaultDataPreprocessor,
    +            decoder: DataDecoder = JSONDecoder(),
    +            emptyResponseCodes: Set<Int> = DecodableResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + decoder + + +
    +

    The DataDecoder. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> T
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DefaultTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DefaultTrustEvaluator.html new file mode 100644 index 00000000..70d716e1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DefaultTrustEvaluator.html @@ -0,0 +1,653 @@ + + + + DefaultTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DefaultTrustEvaluator

+
+
+ +
public final class DefaultTrustEvaluator : ServerTrustEvaluating
+ +
+
+

An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the +host provided by the challenge. Applications are encouraged to always validate the host in production environments +to guarantee the validity of the server’s certificate chain.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(validateHost:) + +
    +
    +
    +
    +
    +
    +

    Creates a DefaultTrustEvaluator.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledEvaluator.html new file mode 100644 index 00000000..749aa5dc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledEvaluator.html @@ -0,0 +1,553 @@ + + + + DisabledEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (97% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DisabledEvaluator

+
+
+
public final class DisabledEvaluator : ServerTrustEvaluating
+ +
+
+

Disables all evaluation which in turn will always consider any server trust as valid.

+ +

THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledTrustEvaluator.html new file mode 100644 index 00000000..faa25bb1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DisabledTrustEvaluator.html @@ -0,0 +1,640 @@ + + + + DisabledTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DisabledTrustEvaluator

+
+
+ +
public final class DisabledTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Disables all evaluation which in turn will always consider any server trust as valid.

+
+

Note

+ Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
+ +

THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest.html new file mode 100644 index 00000000..654da371 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest.html @@ -0,0 +1,3278 @@ + + + + DownloadRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadRequest

+
+
+ +
public class DownloadRequest : Request
+ +
+
+

Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination +URL.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSet
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Destination +

+
+
+
    +
  • +
    + + + + Destination + +
    +
    +
    +
    +
    +
    +

    A closure executed once a DownloadRequest has successfully completed in order to determine where to move the +temporary file written to during the download process. The closure takes two arguments: the temporary file URL +and the HTTPURLResponse, and returns two values: the file URL where the temporary file should be moved and +the options defining how the file should be moved.

    +
    +

    Note

    + Downloads from a local file:// URLs do not use the Destination closure, as those downloads do not + return an HTTPURLResponse. Instead the file is merely moved within the temporary directory. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Destination = (_ temporaryURL: URL,
    +                                _ response: HTTPURLResponse) -> (destinationURL: URL, options: Options)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a download file destination closure which uses the default file manager to move the temporary file to a +file URL in the first available directory with the specified search path directory and search path domain mask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func suggestedDownloadDestination(for directory: FileManager.SearchPathDirectory = .documentDirectory,
    +                                               in domain: FileManager.SearchPathDomainMask = .userDomainMask,
    +                                               options: Options = []) -> Destination
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + directory + + +
    +

    The search path directory. .documentDirectory by default.

    +
    +
    + + domain + + +
    +

    The search path domain mask. .userDomainMask by default.

    +
    +
    + + options + + +
    +

    DownloadRequest.Options used when moving the downloaded file to its destination. None by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Destination closure.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Downloadable +

+
+
+
    +
  • +
    + + + + Downloadable + +
    +
    +
    +
    +
    +
    +

    Type describing the source used to create the underlying URLSessionDownloadTask.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Downloadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + resumeData + +
    +
    +
    +
    +
    +
    +

    If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download +using the download(resumingWith data:) API.

    +
    +

    Note

    + For more information about resumeData, see Apple’s documentation. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var resumeData: Data? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileURL + +
    +
    +
    +
    +
    +
    +

    If the download is successful, the URL where the file was downloaded.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var fileURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + downloadable + +
    +
    +
    +
    +
    +
    +

    Downloadable value used for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let downloadable: Downloadable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a URLSessionTask from the provided resume data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func task(forResumeData data: Data, using session: URLSession) -> URLSessionTask
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + data + + +
    +

    Data used to resume the download.

    +
    +
    + + session + + +
    +

    URLSession used to create the URLSessionTask.

    +
    +
    +
    +
    +

    Return Value

    +

    The URLSessionTask created.

    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancels the instance. Once cancelled, a DownloadRequest can no longer be resumed or suspended.

    +
    +

    Note

    +

    This method will NOT produce resume data. If you wish to cancel and produce resume data, use + cancel(producingResumeData:) or cancel(byProducingResumeData:).

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +override public func cancel() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancels the instance, optionally producing resume data. Once cancelled, a DownloadRequest can no longer be +resumed or suspended.

    +
    +

    Note

    +

    If producingResumeData is true, the resumeData property will be populated with any resume data, if + available.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel(producingResumeData shouldProduceResumeData: Bool) -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancels the instance while producing resume data. Once cancelled, a DownloadRequest can no longer be resumed +or suspended.

    +
    +

    Note

    +

    The resume data passed to the completion handler will also be available on the instance’s resumeData + property.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel(byProducingResumeData completionHandler: @escaping (_ data: Data?) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + completionHandler + + +
    +

    The completion handler that is called when the download has been successfully + cancelled. It is not guaranteed to be called on a particular queue, so you may + want use an appropriate queue to perform your work.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + validate(_:) + +
    +
    +
    +
    +
    +
    +

    Validates the request, using the specified closure.

    +
    +

    Note

    +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate(_ validation: @escaping Validation) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + validation + + +
    +

    Validation closure to validate the response.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+ +
+
+
+ + +
+ +

DownloadTask +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await a Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                            dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                            emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                            emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<Data>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before completion.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of a Decodable value.

    +
    +

    Note

    +

    This serializer reads the entire response into memory before parsing.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDecodable<Value: Decodable>(_ type: Value.Type = Value.self,
    +                                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                   dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<Value>.defaultDataPreprocessor,
    +                                                   decoder: DataDecoder = JSONDecoder(),
    +                                                   emptyResponseCodes: Set<Int> = DecodableResponseSerializer<Value>.defaultEmptyResponseCodes,
    +                                                   emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<Value>.defaultEmptyRequestMethods) -> DownloadTask<Value>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the serializer. + PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of the downloaded file’s URL on disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownloadedFileURL(automaticallyCancelling shouldAutomaticallyCancel: Bool = true) -> DownloadTask<URL>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization of a String value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingString(automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                              dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                              encoding: String.Encoding? = nil,
    +                              emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                              emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods) -> DownloadTask<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + serializer. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    String.Encoding to use during serialization. Defaults to nil, in which case + the encoding will be determined from the server response, falling back to the + default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization using the provided ResponseSerializer instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownload<Serializer: ResponseSerializer>(using serializer: Serializer,
    +                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DownloadTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    ResponseSerializer responsible for serializing the request, response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadTask to await serialization using the provided DownloadResponseSerializerProtocol +instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializingDownload<Serializer: DownloadResponseSerializerProtocol>(using serializer: Serializer,
    +                                                                                automaticallyCancelling shouldAutomaticallyCancel: Bool = true)
    +    -> DownloadTask<Serializer.SerializedObject>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + serializer + + +
    +

    DownloadResponseSerializerProtocol responsible for serializing the request, + response, and data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool determining whether or not the request should be cancelled when the + enclosing async context is cancelled. Only applies to DownloadTask‘s async + properties. true by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The DownloadTask.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Default +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response(queue: DispatchQueue = .main,
    +                     completionHandler: @escaping (AFDownloadResponse<URL?>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: DownloadResponseSerializerProtocol>(queue: DispatchQueue = .main,
    +                                                                     responseSerializer: Serializer,
    +                                                                     completionHandler: @escaping (AFDownloadResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data + contained in the destination URL.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Adds a handler to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func response<Serializer: ResponseSerializer>(queue: DispatchQueue = .main,
    +                                                     responseSerializer: Serializer,
    +                                                     completionHandler: @escaping (AFDownloadResponse<Serializer.SerializedObject>) -> Void)
    +    -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + responseSerializer + + +
    +

    The response serializer responsible for serializing the request, response, and data + contained in the destination URL.

    +
    +
    + + completionHandler + + +
    +

    The code to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URL +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a URLResponseSerializer to be called once the request is finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseURL(queue: DispatchQueue = .main,
    +                        completionHandler: @escaping (AFDownloadResponse<URL>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DataResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseData(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = DataResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = DataResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = DataResponseSerializer.defaultEmptyRequestMethods,
    +                         completionHandler: @escaping (AFDownloadResponse<Data>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is called. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

String +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a StringResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseString(queue: DispatchQueue = .main,
    +                           dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +                           encoding: String.Encoding? = nil,
    +                           emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +                           emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods,
    +                           completionHandler: @escaping (AFDownloadResponse<String>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + encoding + + +
    +

    The string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

JSON +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a JSONResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, message: "responseJSON deprecated and will be removed in Alamofire 6. Use responseDecodable instead.")
    +@discardableResult
    +public func responseJSON(queue: DispatchQueue = .main,
    +                         dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +                         emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +                         emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +                         options: JSONSerialization.ReadingOptions = .allowFragments,
    +                         completionHandler: @escaping (AFDownloadResponse<Any>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + options + + +
    +

    JSONSerialization.ReadingOptions used when parsing the response. .allowFragments + by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func responseDecodable<T: Decodable>(of type: T.Type = T.self,
    +                                            queue: DispatchQueue = .main,
    +                                            dataPreprocessor: DataPreprocessor = DecodableResponseSerializer<T>.defaultDataPreprocessor,
    +                                            decoder: DataDecoder = JSONDecoder(),
    +                                            emptyResponseCodes: Set<Int> = DecodableResponseSerializer<T>.defaultEmptyResponseCodes,
    +                                            emptyRequestMethods: Set<HTTPMethod> = DecodableResponseSerializer<T>.defaultEmptyRequestMethods,
    +                                            completionHandler: @escaping (AFDownloadResponse<T>) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to decode from response data.

    +
    +
    + + queue + + +
    +

    The queue on which the completion handler is dispatched. .main by default.

    +
    +
    + + dataPreprocessor + + +
    +

    DataPreprocessor which processes the received Data before calling the + completionHandler. PassthroughPreprocessor() by default.

    +
    +
    + + decoder + + +
    +

    DataDecoder to use to decode the response. JSONDecoder() by default.

    +
    +
    + + emptyResponseCodes + + +
    +

    HTTP status codes for which empty responses are always valid. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    HTTPMethods for which empty responses are always valid. [.head] by default.

    +
    +
    + + completionHandler + + +
    +

    A closure to be executed once the request has finished.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Validation + +
    +
    +
    +
    +
    +
    +

    A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a +destination URL, and returns whether the request was valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Validation = (_ request: URLRequest?,
    +                               _ response: HTTPURLResponse,
    +                               _ fileURL: URL?)
    +    -> ValidationResult
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate(statusCode:) + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(statusCode acceptableStatusCodes: S) -> Self where S : Sequence, S.Element == Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + acceptableStatusCodes + + +
    +

    Sequence of acceptable response status codes.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates that the response has a content type in the specified sequence.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate<S>(contentType acceptableContentTypes: @autoclosure @escaping () -> S) -> Self where S : Sequence, S.Element == String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + contentType + + +
    +

    The acceptable content types, which may specify wildcard types and/or subtypes.

    +
    +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Validates that the response has a status code in the default acceptable range of 200…299, and that the content +type matches any specified in the Accept HTTP header field.

    + +

    If validation fails, subsequent calls to response handlers will have an associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func validate() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Downloadable.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Downloadable.html new file mode 100644 index 00000000..1289a0bc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Downloadable.html @@ -0,0 +1,633 @@ + + + + Downloadable Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Downloadable

+
+
+ +
public enum Downloadable
+ +
+
+

Type describing the source used to create the underlying URLSessionDownloadTask.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request(_:) + +
    +
    +
    +
    +
    +
    +

    Download should be started from the URLRequest produced by the associated URLRequestConvertible value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case request(URLRequestConvertible)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumeData(_:) + +
    +
    +
    +
    +
    +
    +

    Download should be started from the associated resume Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case resumeData(Data)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Options.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Options.html new file mode 100644 index 00000000..34037e39 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/DownloadRequest/Options.html @@ -0,0 +1,686 @@ + + + + Options Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Options

+
+
+ +
public struct Options : OptionSet
+ +
+
+

A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination +URL.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Specifies that intermediate directories for the destination URL should be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let createIntermediateDirectories: DownloadRequest.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removePreviousFile + +
    +
    +
    +
    +
    +
    +

    Specifies that any previous file at the destination URL should be removed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let removePreviousFile: DownloadRequest.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: Int)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Interceptor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Interceptor.html new file mode 100644 index 00000000..0baca0be --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Interceptor.html @@ -0,0 +1,900 @@ + + + + Interceptor Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Interceptor

+
+
+ +
open class Interceptor : RequestInterceptor
+ +
+
+

RequestInterceptor which can use multiple RequestAdapter and RequestRetrier values.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONParameterEncoder.html new file mode 100644 index 00000000..f4a00537 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONParameterEncoder.html @@ -0,0 +1,763 @@ + + + + JSONParameterEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONParameterEncoder

+
+
+ +
open class JSONParameterEncoder : ParameterEncoder
+ +
+
+

A ParameterEncoder that encodes types as JSON body data.

+ +

If no Content-Type header is already set on the provided URLRequests, it’s set to application/json.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with default parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prettyPrinted + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with JSONEncoder.outputFormatting set to .prettyPrinted.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var prettyPrinted: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sortedKeys + +
    +
    +
    +
    +
    +
    +

    Returns an encoder with JSONEncoder.outputFormatting set to .sortedKeys.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.13, iOS 11.0, tvOS 11.0, watchOS 4.0, *)
    +public static var sortedKeys: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoder + +
    +
    +
    +
    +
    +
    +

    JSONEncoder used to encode parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let encoder: JSONEncoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoder:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the provided JSONEncoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoder: JSONEncoder = JSONEncoder())
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoder + + +
    +

    The JSONEncoder. JSONEncoder() by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func encode<Parameters: Encodable>(_ parameters: Parameters?,
    +                                        into request: URLRequest) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONResponseSerializer.html new file mode 100644 index 00000000..03bfeee8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/JSONResponseSerializer.html @@ -0,0 +1,798 @@ + + + + JSONResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONResponseSerializer

+
+
+ +
@available(*, deprecated, message: "JSONResponseSerializer deprecated and will be removed in Alamofire 6. Use DecodableResponseSerializer instead.")
+public final class JSONResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning +nil or no data is considered an error. However, if the request has an HTTPMethod or the response has an +HTTP status code valid for empty responses, then an NSNull value is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    JSONSerialization.ReadingOptions used when serializing a response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let options: JSONSerialization.ReadingOptions
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = JSONResponseSerializer.defaultDataPreprocessor,
    +            emptyResponseCodes: Set<Int> = JSONResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = JSONResponseSerializer.defaultEmptyRequestMethods,
    +            options: JSONSerialization.ReadingOptions = .allowFragments)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    + + options + + +
    +

    The options to use. .allowFragments by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> Any
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartFormData.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartFormData.html new file mode 100644 index 00000000..033740fc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartFormData.html @@ -0,0 +1,1340 @@ + + + + MultipartFormData Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartFormData

+
+
+ +
open class MultipartFormData
+ +
+
+

Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode +multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead +to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the +data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for +larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.

+ +

For more information on multipart/form-data in general, please refer to the RFC-2388 and RFC-2045 specs as well +and the w3 form documentation.

+ + + +
+
+ +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Default memory threshold used when encoding MultipartFormData, in bytes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let encodingMemoryThreshold: UInt64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contentType + +
    +
    +
    +
    +
    +
    +

    The Content-Type header value containing the boundary used to generate the multipart/form-data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open lazy var contentType: String { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + contentLength + +
    +
    +
    +
    +
    +
    +

    The content length of all body parts used to generate the multipart/form-data not including the boundaries.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var contentLength: UInt64 { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boundary + +
    +
    +
    +
    +
    +
    +

    The boundary used to separate the body parts in the encoded form data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boundary: String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Lifecycle +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fileManager: FileManager = .default, boundary: String? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fileManager + + +
    +

    FileManager to use for file operations, if needed.

    +
    +
    + + boundary + + +
    +

    Boundary String used to separate body parts.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Body Parts +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the data and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ data: Data, withName name: String, fileName: String? = nil, mimeType: String? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + data + + +
    +

    Data to encoding into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the Data in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the Data in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the data in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + append(_:withName:) + +
    +
    +
    +
    +
    +
    +

    Creates a body part from the file and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{generated filename} (HTTP Header)
    • +
    • Content-Type: #{generated mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary
    • +
    + +

    The filename in the Content-Disposition HTTP header is generated from the last path component of the +fileURL. The Content-Type HTTP header MIME type is generated by mapping the fileURL extension to the +system associated MIME type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ fileURL: URL, withName name: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + fileURL + + +
    +

    URL of the file whose content will be encoded into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the file and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded file data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + fileURL + + +
    +

    URL of the file whose content will be encoded into the instance.

    +
    +
    + + name + + +
    +

    Name to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the file content in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the file content in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part from the stream and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)
    • +
    • Content-Type: #{mimeType} (HTTP Header)
    • +
    • Encoded stream data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ stream: InputStream,
    +                   withLength length: UInt64,
    +                   name: String,
    +                   fileName: String,
    +                   mimeType: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + stream + + +
    +

    InputStream to encode into the instance.

    +
    +
    + + length + + +
    +

    Length, in bytes, of the stream.

    +
    +
    + + name + + +
    +

    Name to associate with the stream content in the Content-Disposition HTTP header.

    +
    +
    + + fileName + + +
    +

    Filename to associate with the stream content in the Content-Disposition HTTP header.

    +
    +
    + + mimeType + + +
    +

    MIME type to associate with the stream content in the Content-Type HTTP header.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a body part with the stream, length, and headers and appends it to the instance.

    + +

    The body part data will be encoded using the following format:

    + +
      +
    • HTTP headers
    • +
    • Encoded stream data
    • +
    • Multipart form boundary

    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + stream + + +
    +

    InputStream to encode into the instance.

    +
    +
    + + length + + +
    +

    Length, in bytes, of the stream.

    +
    +
    + + headers + + +
    +

    HTTPHeaders for the body part.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Data Encoding +

+
+
+
    +
  • +
    + + + + encode() + +
    +
    +
    +
    +
    +
    +

    Encodes all appended body parts into a single Data value.

    +
    +

    Note

    +

    This method will load all the appended body parts into memory all at the same time. This method should + only be used when the encoded data will have a small memory footprint. For large data cases, please use + the writeEncodedData(to:)) method.

    + +
    +

    Throws

    +

    An AFError if encoding encounters an error.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode() throws -> Data
    + +
    +
    +
    +

    Return Value

    +

    The encoded Data, if encoding is successful.

    +
    +
    +
    +
  • +
  • +
    + + + + writeEncodedData(to:) + +
    +
    +
    +
    +
    +
    +

    Writes all appended body parts to the given file URL.

    + +

    This process is facilitated by reading and writing with input and output streams, respectively. Thus, +this approach is very memory efficient and should be used for large body part data.

    +
    +

    Throws

    + An AFError if encoding encounters an error. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func writeEncodedData(to fileURL: URL) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fileURL + + +
    +

    File URL to which to write the form data.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartUpload.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartUpload.html new file mode 100644 index 00000000..3af213d3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/MultipartUpload.html @@ -0,0 +1,525 @@ + + + + MultipartUpload Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartUpload

+
+
+
open class MultipartUpload
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Default memory threshold used when encoding MultipartFormData, in bytes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let encodingMemoryThreshold: UInt64
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + createUploadable() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func createUploadable() throws -> UploadRequest.Uploadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager.html new file mode 100644 index 00000000..42e2499f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager.html @@ -0,0 +1,1052 @@ + + + + NetworkReachabilityManager Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NetworkReachabilityManager

+
+
+ +
open class NetworkReachabilityManager
+ +
+
+

The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and +WiFi network interfaces.

+ +

Reachability can be used to determine background information about why a network operation failed, or to retry +network requests when a connection is established. It should not be used to prevent a user from initiating a network +request, as it’s possible that an initial request may be required to establish reachability.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Defines the various states of network reachability.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum NetworkReachabilityStatus
    +
    extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Listener + +
    +
    +
    +
    +
    +
    +

    A closure executed when the network reachability status changes. The closure takes a single argument: the +network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Listener = (NetworkReachabilityStatus) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Default NetworkReachabilityManager for the zero address and a listenerQueue of .main.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: NetworkReachabilityManager?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + isReachable + +
    +
    +
    +
    +
    +
    +

    Whether the network is currently reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isReachableOnCellular + +
    +
    +
    +
    +
    +
    +

    Whether the network is currently reachable over the cellular interface.

    +
    +

    Note

    + Using this property to decide whether to make a high or low bandwidth request is not recommended. + Instead, set the allowsCellularAccess on any URLRequests being issued. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachableOnCellular: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether the network is currently reachable over Ethernet or WiFi interface.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var isReachableOnEthernetOrWiFi: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reachabilityQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue on which reachability will update.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let reachabilityQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + flags + +
    +
    +
    +
    +
    +
    +

    Flags of the current reachability type, if any.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var flags: SCNetworkReachabilityFlags? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The current network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open var status: NetworkReachabilityStatus { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • +
    + + + + init(host:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the specified host.

    +
    +

    Note

    +

    The host value must not contain a scheme, just the hostname.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init?(host: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    Host used to evaluate network reachability. Must not include the scheme (e.g. https).

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance that monitors the address 0.0.0.0.

    + +

    Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing +status of the device, both IPv4 and IPv6.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init?()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Listening +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Starts listening for changes in network reachability status.

    +
    +

    Note

    +

    Stops and removes any existing listener.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +open func startListening(onQueue queue: DispatchQueue = .main,
    +                         onUpdatePerforming listener: @escaping Listener) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which to call the listener closure. .main by default.

    +
    +
    + + listener + + +
    +

    Listener closure called when reachability changes.

    +
    +
    +
    +
    +

    Return Value

    +

    true if listening was started successfully, false otherwise.

    +
    +
    +
    +
  • +
  • +
    + + + + stopListening() + +
    +
    +
    +
    +
    +
    +

    Stops listening for changes in network reachability status.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func stopListening()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/ConnectionType.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/ConnectionType.html new file mode 100644 index 00000000..7c985da3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/ConnectionType.html @@ -0,0 +1,490 @@ + + + + ConnectionType Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionType

+
+
+
public enum ConnectionType
+ +
+
+

Defines the various connection types detected by reachability flags.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ethernetOrWiFi + +
    +
    +
    +
    +
    +
    +

    The connection type is either over Ethernet or WiFi.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case ethernetOrWiFi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + wwan + +
    +
    +
    +
    +
    +
    +

    The connection type is a WWAN connection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case wwan
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html new file mode 100644 index 00000000..2847084f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html @@ -0,0 +1,689 @@ + + + + NetworkReachabilityStatus Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NetworkReachabilityStatus

+
+
+ +
public enum NetworkReachabilityStatus
+
extension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable
+ +
+
+

Defines the various states of network reachability.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + unknown + +
    +
    +
    +
    +
    +
    +

    It is unknown whether the network is reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unknown
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + notReachable + +
    +
    +
    +
    +
    +
    +

    The network is not reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case notReachable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + reachable(_:) + +
    +
    +
    +
    +
    +
    +

    The network is reachable on the associated ConnectionType.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case reachable(ConnectionType)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ConnectionType + +
    +
    +
    +
    +
    +
    +

    Defines the various connection types detected by reachability flags.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ConnectionType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html new file mode 100644 index 00000000..4c53dd59 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html @@ -0,0 +1,633 @@ + + + + ConnectionType Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ConnectionType

+
+
+ +
public enum ConnectionType
+ +
+
+

Defines the various connection types detected by reachability flags.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ethernetOrWiFi + +
    +
    +
    +
    +
    +
    +

    The connection type is either over Ethernet or WiFi.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case ethernetOrWiFi
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cellular + +
    +
    +
    +
    +
    +
    +

    The connection type is a cellular connection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cellular
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PinnedCertificatesTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PinnedCertificatesTrustEvaluator.html new file mode 100644 index 00000000..a65efefc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PinnedCertificatesTrustEvaluator.html @@ -0,0 +1,700 @@ + + + + PinnedCertificatesTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PinnedCertificatesTrustEvaluator

+
+
+ +
public final class PinnedCertificatesTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned +certificates match one of the server certificates. By validating both the certificate chain and host, certificate +pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a PinnedCertificatesTrustEvaluator from the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(certificates: [SecCertificate] = Bundle.main.af.certificates,
    +            acceptSelfSignedCertificates: Bool = false,
    +            performDefaultValidation: Bool = true,
    +            validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + certificates + + +
    +

    The certificates to use to evaluate the trust. All cer, crt, and der + certificates in Bundle.main by default.

    +
    +
    + + acceptSelfSignedCertificates + + +
    +

    Adds the provided certificates as anchors for the trust evaluation, allowing + self-signed certificates to pass. false by default. THIS SETTING SHOULD BE + FALSE IN PRODUCTION!

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PublicKeysTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PublicKeysTrustEvaluator.html new file mode 100644 index 00000000..e7d81e03 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/PublicKeysTrustEvaluator.html @@ -0,0 +1,691 @@ + + + + PublicKeysTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PublicKeysTrustEvaluator

+
+
+ +
public final class PublicKeysTrustEvaluator : ServerTrustEvaluating
+ +
+
+

Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned +public keys match one of the server certificate public keys. By validating both the certificate chain and host, +public key pinning provides a very secure form of server trust validation mitigating most, if not all, MITM attacks. +Applications are encouraged to always validate the host and require a valid certificate chain in production +environments.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a PublicKeysTrustEvaluator from the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(keys: [SecKey] = Bundle.main.af.publicKeys,
    +            performDefaultValidation: Bool = true,
    +            validateHost: Bool = true)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    The SecKeys to use to validate public keys. Defaults to the public keys of all + certificates included in the main bundle.

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request.html new file mode 100644 index 00000000..6a2bf40f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request.html @@ -0,0 +1,3157 @@ + + + + Request Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Request

+
+
+ +
public class Request
+
extension Request: Equatable
+
extension Request: Hashable
+
extension Request: CustomStringConvertible
+ +
+
+

Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback +handling.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + id + +
    +
    +
    +
    +
    +
    +

    UUID providing a unique identifier for the Request, used in the Hashable and Equatable conformances.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let id: UUID
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + underlyingQueue + +
    +
    +
    +
    +
    +
    +

    The serial queue for all internal async actions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let underlyingQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationQueue + +
    +
    +
    +
    +
    +
    +

    The queue used for all serialization actions. By default it’s a serial queue that targets underlyingQueue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventMonitor + +
    +
    +
    +
    +
    +
    +

    EventMonitor used for event callbacks.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let eventMonitor: EventMonitor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + interceptor + +
    +
    +
    +
    +
    +
    +

    The Request‘s interceptor.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interceptor: RequestInterceptor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    The Request‘s delegate.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) weak var delegate: RequestDelegate? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + state + +
    +
    +
    +
    +
    +
    +

    State of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var state: State { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInitialized + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .initialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInitialized: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isResumed + +
    +
    +
    +
    +
    +
    +

    Returns whether state is.resumed`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResumed: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSuspended + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .suspended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuspended: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isCancelled + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .cancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCancelled: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isFinished + +
    +
    +
    +
    +
    +
    +

    Returns whether state is .finished.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isFinished: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Progress +

+
+
+
    +
  • +
    + + + + ProgressHandler + +
    +
    +
    +
    +
    +
    +

    Closure type executed when monitoring the upload or download progress of a request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ProgressHandler = (Progress) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + uploadProgress + +
    +
    +
    +
    +
    +
    +

    Progress of the upload of the body of the executed URLRequest. Reset to 0 if the Request is retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let uploadProgress: Progress
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + downloadProgress + +
    +
    +
    +
    +
    +
    +

    Progress of the download of any response data. Reset to 0 if the Request is retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let downloadProgress: Progress
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Redirect Handling +

+
+
+ +
+
+
+ + +
+ +

Cached Response Handling +

+
+
+ +
+
+
+ + +
+ +

URLCredential +

+
+
+
    +
  • +
    + + + + credential + +
    +
    +
    +
    +
    +
    +

    URLCredential used for authentication challenges. Created by calling one of the authenticate methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var credential: URLCredential? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLRequests +

+
+
+
    +
  • +
    + + + + requests + +
    +
    +
    +
    +
    +
    +

    All URLRequests created on behalf of the Request, including original and adapted requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var requests: [URLRequest] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstRequest + +
    +
    +
    +
    +
    +
    +

    First URLRequest created on behalf of the Request. May not be the first one actually executed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastRequest + +
    +
    +
    +
    +
    +
    +

    Last URLRequest created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    Current URLRequest created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var request: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + performedRequests + +
    +
    +
    +
    +
    +
    +

    URLRequests from all of the URLSessionTasks executed on behalf of the Request. May be different from +requests due to URLSession manipulation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var performedRequests: [URLRequest] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPURLResponse +

+
+
+
    +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    HTTPURLResponse received from the server, if any. If the Request was retried, this is the response of the +last URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: HTTPURLResponse? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Tasks +

+
+
+
    +
  • +
    + + + + tasks + +
    +
    +
    +
    +
    +
    +

    All URLSessionTasks created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var tasks: [URLSessionTask] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstTask + +
    +
    +
    +
    +
    +
    +

    First URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstTask: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastTask + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastTask: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + task + +
    +
    +
    +
    +
    +
    +

    Current URLSessionTask created on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var task: URLSessionTask? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Metrics +

+
+
+
    +
  • +
    + + + + allMetrics + +
    +
    +
    +
    +
    +
    +

    All URLSessionTaskMetrics gathered on behalf of the Request. Should correspond to the tasks created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allMetrics: [URLSessionTaskMetrics] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + firstMetrics + +
    +
    +
    +
    +
    +
    +

    First URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var firstMetrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lastMetrics + +
    +
    +
    +
    +
    +
    +

    Last URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var lastMetrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    Current URLSessionTaskMetrics gathered on behalf of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var metrics: URLSessionTaskMetrics? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Retry Count +

+
+
+
    +
  • +
    + + + + retryCount + +
    +
    +
    +
    +
    +
    +

    Number of times the Request has been retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var retryCount: Int { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Error +

+
+
+
    +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Error returned from Alamofire internally, from the network request directly, or any validators executed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public fileprivate(set) var error: AFError? { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

State +

+
+
+
    +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancels the instance. Once cancelled, a Request can no longer be resumed or suspended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cancel() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspends the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func suspend() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resumes the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func resume() -> Self
    + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Closure API +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Associates a credential using the provided values with the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func authenticate(username: String, password: String, persistence: URLCredential.Persistence = .forSession) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + username + + +
    +

    The username.

    +
    +
    + + password + + +
    +

    The password.

    +
    +
    + + persistence + + +
    +

    The URLCredential.Persistence for the created URLCredential. .forSession by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • +
    + + + + authenticate(with:) + +
    +
    +
    +
    +
    +
    +

    Associates the provided credential with the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func authenticate(with credential: URLCredential) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + credential + + +
    +

    The URLCredential.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server.

    +
    +

    Note

    +

    Only the last closure provided is used.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func downloadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The DispatchQueue to execute the closure on. .main by default.

    +
    +
    + + closure + + +
    +

    The closure to be executed periodically as data is read from the server.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server.

    +
    +

    Note

    +

    Only the last closure provided is used.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func uploadProgress(queue: DispatchQueue = .main, closure: @escaping ProgressHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    The DispatchQueue to execute the closure on. .main by default.

    +
    +
    + + closure + + +
    +

    The closure to be executed periodically as data is sent to the server.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Redirects +

+
+
+
    +
  • +
    + + + + redirect(using:) + +
    +
    +
    +
    +
    +
    +

    Sets the redirect handler for the instance which will be used if a redirect response is encountered.

    +
    +

    Note

    +

    Attempting to set the redirect handler more than once is a logic error and will crash.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func redirect(using handler: RedirectHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    The RedirectHandler.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Cached Responses +

+
+
+
    +
  • +
    + + + + cacheResponse(using:) + +
    +
    +
    +
    +
    +
    +

    Sets the cached response handler for the Request which will be used when attempting to cache a response.

    +
    +

    Note

    +

    Attempting to set the cache handler more than once is a logic error and will crash.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cacheResponse(using handler: CachedResponseHandler) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + + +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Lifetime APIs +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Sets a handler to be called when the cURL description of the request is available.

    +
    +

    Note

    +

    When waiting for a Request‘s URLRequest to be created, only the last handler will be called.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cURLDescription(on queue: DispatchQueue, calling handler: @escaping (String) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called.

    +
    +
    + + handler + + +
    +

    Closure to be called when the cURL description is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a handler to be called when the cURL description of the request is available.

    +
    +

    Note

    +

    When waiting for a Request‘s URLRequest to be created, only the last handler will be called.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func cURLDescription(calling handler: @escaping (String) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + handler + + +
    +

    Closure to be called when the cURL description is available. Called on the instance’s + underlyingQueue by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to called whenever Alamofire creates a URLRequest for this instance.

    +
    +

    Note

    +

    This closure will be called multiple times if the instance adapts incoming URLRequests or is retried.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onURLRequestCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLRequest) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure to be called when a URLRequest is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a closure to be called whenever the instance creates a URLSessionTask.

    +
    +

    Note

    +

    This API should only be used to provide URLSessionTasks to existing API, like NSFileProvider. It + SHOULD NOT be used to interact with tasks directly, as that may be break Alamofire features. + Additionally, this closure may be called multiple times if the instance is retried.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func onURLSessionTaskCreation(on queue: DispatchQueue = .main, perform handler: @escaping (URLSessionTask) -> Void) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which handler will be called. .main by default.

    +
    +
    + + handler + + +
    +

    Closure to be called when the URLSessionTask is available.

    +
    +
    +
    +
    +

    Return Value

    +

    The instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Request Event Streams +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<Progress> for the instance’s upload progress.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func uploadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<Progress>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<Progress> for the instance’s download progress.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func downloadProgress(bufferingPolicy: StreamOf<Progress>.BufferingPolicy = .unbounded) -> StreamOf<Progress>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<Progress>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<URLRequest> for the URLRequests produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func urlRequests(bufferingPolicy: StreamOf<URLRequest>.BufferingPolicy = .unbounded) -> StreamOf<URLRequest>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<URLRequest>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<URLSessionTask> for the URLSessionTasks produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func urlSessionTasks(bufferingPolicy: StreamOf<URLSessionTask>.BufferingPolicy = .unbounded) -> StreamOf<URLSessionTask>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<URLSessionTask>.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a StreamOf<String> for the cURL descriptions produced for the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cURLDescriptions(bufferingPolicy: StreamOf<String>.BufferingPolicy = .unbounded) -> StreamOf<String>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The StreamOf<String>.

    +
    +
    +
    +
  • +
  • +
    + + + + didResumeNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is resumed. The Notification contains the resumed Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didResumeNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a Request is suspended. The Notification contains the suspended Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didSuspendNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didCancelNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is cancelled. The Notification contains the cancelled Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCancelNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didFinishNotification + +
    +
    +
    +
    +
    +
    +

    Posted when a Request is finished. The Notification contains the completed Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didFinishNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is resumed. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didResumeTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is suspended. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didSuspendTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is cancelled. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCancelTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Posted when a URLSessionTask is completed. The Notification contains the Request associated with the URLSessionTask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let didCompleteTaskNotification: Notification.Name
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ResponseDisposition + +
    +
    +
    +
    +
    +
    +

    Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ResponseDisposition
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocol Conformances +

+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (lhs: Request, rhs: Request) -> Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    A textual representation of this instance, including the HTTPMethod and URL if the URLRequest has been +created, as well as the response status code, if a response has been received.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cURLDescription() + +
    +
    +
    +
    +
    +
    +

    cURL representation of the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cURLDescription() -> String
    + +
    +
    +
    +

    Return Value

    +

    The cURL equivalent of the instance.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + ValidationResult + +
    +
    +
    +
    +
    +
    +

    Used to represent whether a validation succeeded or failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias ValidationResult = Result<Void, Error>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/ResponseDisposition.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/ResponseDisposition.html new file mode 100644 index 00000000..cdd77377 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/ResponseDisposition.html @@ -0,0 +1,633 @@ + + + + ResponseDisposition Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseDisposition

+
+
+ +
public enum ResponseDisposition
+ +
+
+

Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + allow + +
    +
    +
    +
    +
    +
    +

    Allow the request to continue normally.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case allow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel + +
    +
    +
    +
    +
    +
    +

    Cancel the request, similar to calling cancel().

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancel
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/State.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/State.html new file mode 100644 index 00000000..77f3187e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Request/State.html @@ -0,0 +1,720 @@ + + + + State Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

State

+
+
+ +
public enum State
+ +
+
+

State of the Request, with managed transitions between states set when calling resume(), suspend(), or +cancel() on the Request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + initialized + +
    +
    +
    +
    +
    +
    +

    Initial state of the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case initialized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumed + +
    +
    +
    +
    +
    +
    +

    State set when resume() is called. Any tasks created for the Request will have resume() called on +them in this state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case resumed
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspended + +
    +
    +
    +
    +
    +
    +

    State set when suspend() is called. Any tasks created for the Request will have suspend() called on +them in this state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case suspended
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancelled + +
    +
    +
    +
    +
    +
    +

    State set when cancel() is called. Any tasks created for the Request will have cancel() called on +them. Unlike resumed or suspended, once in the cancelled state, the Request can no longer transition +to any other state.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cancelled
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + finished + +
    +
    +
    +
    +
    +
    +

    State set when all response serialization completion closures have been cleared on the Request and +enqueued on their respective queues.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case finished
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Retrier.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Retrier.html new file mode 100644 index 00000000..0ef91088 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Retrier.html @@ -0,0 +1,654 @@ + + + + Retrier Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Retrier

+
+
+ +
open class Retrier : RequestInterceptor
+ +
+
+

Closure-based RequestRetrier.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ retryHandler: @escaping RetryHandler)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + retryHandler + + +
    +

    RetryHandler closure to be executed when handling request retry.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func retry(_ request: Request,
    +                for session: Session,
    +                dueTo error: Error,
    +                completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RetryPolicy.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RetryPolicy.html new file mode 100644 index 00000000..cd9bb55c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RetryPolicy.html @@ -0,0 +1,1111 @@ + + + + RetryPolicy Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RetryPolicy

+
+
+ +
open class RetryPolicy : RequestInterceptor
+ +
+
+

A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes +as well as certain types of networking errors.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + defaultRetryLimit + +
    +
    +
    +
    +
    +
    +

    The default retry limit for retry policies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryLimit: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default exponential backoff base for retry policies (must be a minimum of 2).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultExponentialBackoffBase: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default exponential backoff scale for retry policies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultExponentialBackoffScale: Double
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default HTTP methods to retry. +See RFC 2616 - Section 9.1.2 for more information.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableHTTPMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default HTTP status codes to retry. +See RFC 2616 - Section 10 for more information.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableHTTPStatusCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The default URL error codes to retry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultRetryableURLErrorCodes: Set<URLError.Code>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryLimit + +
    +
    +
    +
    +
    +
    +

    The total number of times the request is allowed to be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryLimit: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The base of the exponential backoff policy (should always be greater than or equal to 2).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let exponentialBackoffBase: UInt
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The scale of the exponential backoff.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let exponentialBackoffScale: Double
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryableHTTPMethods + +
    +
    +
    +
    +
    +
    +

    The HTTP methods that are allowed to be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableHTTPMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The HTTP status codes that are automatically retried by the policy.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableHTTPStatusCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The URL error codes that are automatically retried by the policy.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let retryableURLErrorCodes: Set<URLError.Code>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RetryPolicy from the specified parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(retryLimit: UInt = RetryPolicy.defaultRetryLimit,
    +            exponentialBackoffBase: UInt = RetryPolicy.defaultExponentialBackoffBase,
    +            exponentialBackoffScale: Double = RetryPolicy.defaultExponentialBackoffScale,
    +            retryableHTTPMethods: Set<HTTPMethod> = RetryPolicy.defaultRetryableHTTPMethods,
    +            retryableHTTPStatusCodes: Set<Int> = RetryPolicy.defaultRetryableHTTPStatusCodes,
    +            retryableURLErrorCodes: Set<URLError.Code> = RetryPolicy.defaultRetryableURLErrorCodes)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + retryLimit + + +
    +

    The total number of times the request is allowed to be retried. 2 by default.

    +
    +
    + + exponentialBackoffBase + + +
    +

    The base of the exponential backoff policy. 2 by default.

    +
    +
    + + exponentialBackoffScale + + +
    +

    The scale of the exponential backoff. 0.5 by default.

    +
    +
    + + retryableHTTPMethods + + +
    +

    The HTTP methods that are allowed to be retried. + RetryPolicy.defaultRetryableHTTPMethods by default.

    +
    +
    + + retryableHTTPStatusCodes + + +
    +

    The HTTP status codes that are automatically retried by the policy. + RetryPolicy.defaultRetryableHTTPStatusCodes by default.

    +
    +
    + + retryableURLErrorCodes + + +
    +

    The URL error codes that are automatically retried by the policy. + RetryPolicy.defaultRetryableURLErrorCodes by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func retry(_ request: Request,
    +                for session: Session,
    +                dueTo error: Error,
    +                completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether or not to retry the provided Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func shouldRetry(request: Request, dueTo error: Error) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    Request that failed due to the provided Error.

    +
    +
    + + error + + +
    +

    Error encountered while executing the Request.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool determining whether or not to retry the Request.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator.html new file mode 100644 index 00000000..deaaa2bc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator.html @@ -0,0 +1,718 @@ + + + + RevocationTrustEvaluator Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RevocationTrustEvaluator

+
+
+ +
public final class RevocationTrustEvaluator : ServerTrustEvaluating
+ +
+
+

An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate +the host provided by the challenge as well as specify the revocation flags for testing for revoked certificates. +Apple platforms did not start testing for revoked certificates automatically until iOS 10.1, macOS 10.12 and tvOS +10.1 which is demonstrated in our TLS tests. Applications are encouraged to always validate the host in production +environments to guarantee the validity of the server’s certificate chain.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    Represents the options to be use when evaluating the status of a certificate. +Only Revocation Policy Constants are valid, and can be found in Apple’s documentation.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSet
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RevocationTrustEvaluator using the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(performDefaultValidation: Bool = true, validateHost: Bool = true, options: Options = .any)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    + + options + + +
    +

    The Options to use to check the revocation status of the certificate. .any by + default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator/Options.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator/Options.html new file mode 100644 index 00000000..2cd3e241 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/RevocationTrustEvaluator/Options.html @@ -0,0 +1,817 @@ + + + + Options Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Options

+
+
+ +
public struct Options : OptionSet
+ +
+
+

Represents the options to be use when evaluating the status of a certificate. +Only Revocation Policy Constants are valid, and can be found in Apple’s documentation.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + crl + +
    +
    +
    +
    +
    +
    +

    Perform revocation checking using the CRL (Certification Revocation List) method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let crl: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + networkAccessDisabled + +
    +
    +
    +
    +
    +
    +

    Consult only locally cached replies; do not use network access.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let networkAccessDisabled: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ocsp + +
    +
    +
    +
    +
    +
    +

    Perform revocation checking using OCSP (Online Certificate Status Protocol).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let ocsp: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preferCRL + +
    +
    +
    +
    +
    +
    +

    Prefer CRL revocation checking over OCSP; by default, OCSP is preferred.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let preferCRL: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a +“best attempt” basis, where failure to reach the server is not considered fatal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let requirePositiveResponse: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + any + +
    +
    +
    +
    +
    +
    +

    Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the +certificate and the value of preferCRL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let any: RevocationTrustEvaluator.Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    +

    The raw value of the option.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: CFOptionFlags
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    +

    Creates an Options value with the given CFOptionFlags.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: CFOptionFlags)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + rawValue + + +
    +

    The CFOptionFlags value to initialize with.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ServerTrustManager.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ServerTrustManager.html new file mode 100644 index 00000000..72a97fdc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/ServerTrustManager.html @@ -0,0 +1,756 @@ + + + + ServerTrustManager Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustManager

+
+
+ +
open class ServerTrustManager
+ +
+
+

Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether all hosts for this ServerTrustManager must be evaluated. true by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let allHostsMustBeEvaluated: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + evaluators + +
    +
    +
    +
    +
    +
    +

    The dictionary of policies mapped to a particular host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let evaluators: [String : ServerTrustEvaluating]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initializes the ServerTrustManager instance with the given evaluators.

    + +

    Since different servers and web services can have different leaf certificates, intermediate and even root +certificates, it is important to have the flexibility to specify evaluation policies on a per host basis. This +allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key +pinning for host3 and disabling evaluation for host4.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(allHostsMustBeEvaluated: Bool = true, evaluators: [String : ServerTrustEvaluating])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + allHostsMustBeEvaluated + + +
    +

    The value determining whether all hosts for this instance must be evaluated. true + by default.

    +
    +
    + + evaluators + + +
    +

    A dictionary of evaluators mapped to hosts.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the ServerTrustEvaluating value for the given host, if one is set.

    + +

    By default, this method will return the policy that perfectly matches the given host. Subclasses could override +this method and implement more complex mapping implementations such as wildcards.

    +
    +

    Throws

    +

    AFError.serverTrustEvaluationFailed if allHostsMustBeEvaluated is true and no matching + evaluators are found.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func serverTrustEvaluator(forHost host: String) throws -> ServerTrustEvaluating?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The host to use when searching for a matching policy.

    +
    +
    +
    +
    +

    Return Value

    +

    The ServerTrustEvaluating value for the given host if found, nil otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Session.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Session.html new file mode 100644 index 00000000..7c8a262e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/Session.html @@ -0,0 +1,4079 @@ + + + + Session Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Session

+
+
+ +
open class Session
+
extension Session: RequestDelegate
+ +
+
+

Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common +functionality for all Requests, including queuing, interception, trust management, redirect handling, and response +cache handling.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Shared singleton instance used by all AF.request APIs. Cannot be modified.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: Session
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + session + +
    +
    +
    +
    +
    +
    +

    Underlying URLSession used to create URLSessionTasks for this instance, and for which this instance’s +delegate handles URLSessionDelegate callbacks.

    +
    +

    Note

    + This instance should NOT be used to interact with the underlying URLSessionTasks. Doing so will + break internal Alamofire logic that tracks those tasks. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let session: URLSession
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delegate + +
    +
    +
    +
    +
    +
    +

    Instance’s SessionDelegate, which handles the URLSessionDelegate methods and Request interaction.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let delegate: SessionDelegate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rootQueue + +
    +
    +
    +
    +
    +
    +

    Root DispatchQueue for all internal callbacks and state update. MUST be a serial queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rootQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Value determining whether this instance automatically calls resume() on all created Requests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let startRequestsImmediately: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue on which URLRequests are created asynchronously. By default this queue uses rootQueue as its +target, but a separate queue can be used if request creation is determined to be a bottleneck. Always profile +and test before introducing an additional queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let requestQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationQueue + +
    +
    +
    +
    +
    +
    +

    DispatchQueue passed to all Requests on which they perform their response serialization. By default this +queue uses rootQueue as its target but a separate queue can be used if response serialization is determined +to be a bottleneck. Always profile and test before introducing an additional queue.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationQueue: DispatchQueue
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + interceptor + +
    +
    +
    +
    +
    +
    +

    RequestInterceptor used for all Request created by the instance. RequestInterceptors can also be set on a +per-Request basis, in which case the Request‘s interceptor takes precedence over this value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let interceptor: RequestInterceptor?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serverTrustManager + +
    +
    +
    +
    +
    +
    +

    ServerTrustManager instance used to evaluate all trust challenges and provide certificate and key pinning.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serverTrustManager: ServerTrustManager?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + redirectHandler + +
    +
    +
    +
    +
    +
    +

    RedirectHandler instance used to provide customization for request redirection.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let redirectHandler: RedirectHandler?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    CachedResponseHandler instance used to provide customization of cached response handling.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let cachedResponseHandler: CachedResponseHandler?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + eventMonitor + +
    +
    +
    +
    +
    +
    +

    CompositeEventMonitor used to compose Alamofire’s defaultEventMonitors and any passed EventMonitors.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let eventMonitor: CompositeEventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEventMonitors + +
    +
    +
    +
    +
    +
    +

    EventMonitors included in all instances. [AlamofireNotifications()] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let defaultEventMonitors: [EventMonitor]
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Session from a URLSession and other parameters.

    +
    +

    Note

    +

    When passing a URLSession, you must create the URLSession with a specific delegateQueue value and + pass the delegateQueue‘s underlyingQueue as the rootQueue parameter of this initializer.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(session: URLSession,
    +            delegate: SessionDelegate,
    +            rootQueue: DispatchQueue,
    +            startRequestsImmediately: Bool = true,
    +            requestQueue: DispatchQueue? = nil,
    +            serializationQueue: DispatchQueue? = nil,
    +            interceptor: RequestInterceptor? = nil,
    +            serverTrustManager: ServerTrustManager? = nil,
    +            redirectHandler: RedirectHandler? = nil,
    +            cachedResponseHandler: CachedResponseHandler? = nil,
    +            eventMonitors: [EventMonitor] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + session + + +
    +

    Underlying URLSession for this instance.

    +
    +
    + + delegate + + +
    +

    SessionDelegate that handles session‘s delegate callbacks as well as Request + interaction.

    +
    +
    + + rootQueue + + +
    +

    Root DispatchQueue for all internal callbacks and state updates. MUST be a + serial queue.

    +
    +
    + + startRequestsImmediately + + +
    +

    Determines whether this instance will automatically start all Requests. true + by default. If set to false, all Requests created must have .resume() called. + on them for them to start.

    +
    +
    + + requestQueue + + +
    +

    DispatchQueue on which to perform URLRequest creation. By default this queue + will use the rootQueue as its target. A separate queue can be used if it’s + determined request creation is a bottleneck, but that should only be done after + careful testing and profiling. nil by default.

    +
    +
    + + serializationQueue + + +
    +

    DispatchQueue on which to perform all response serialization. By default this + queue will use the rootQueue as its target. A separate queue can be used if + it’s determined response serialization is a bottleneck, but that should only be + done after careful testing and profiling. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor to be used for all Requests created by this instance. nil + by default.

    +
    +
    + + serverTrustManager + + +
    +

    ServerTrustManager to be used for all trust evaluations by this instance. nil + by default.

    +
    +
    + + redirectHandler + + +
    +

    RedirectHandler to be used by all Requests created by this instance. nil by + default.

    +
    +
    + + cachedResponseHandler + + +
    +

    CachedResponseHandler to be used by all Requests created by this instance. + nil by default.

    +
    +
    + + eventMonitors + + +
    +

    Additional EventMonitors used by the instance. Alamofire always adds a + AlamofireNotifications EventMonitor to the array passed here. [] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Session from a URLSessionConfiguration.

    +
    +

    Note

    +

    This initializer lets Alamofire handle the creation of the underlying URLSession and its + delegateQueue, and is the recommended initializer for most uses.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(configuration: URLSessionConfiguration = URLSessionConfiguration.af.default,
    +                        delegate: SessionDelegate = SessionDelegate(),
    +                        rootQueue: DispatchQueue = DispatchQueue(label: "org.alamofire.session.rootQueue"),
    +                        startRequestsImmediately: Bool = true,
    +                        requestQueue: DispatchQueue? = nil,
    +                        serializationQueue: DispatchQueue? = nil,
    +                        interceptor: RequestInterceptor? = nil,
    +                        serverTrustManager: ServerTrustManager? = nil,
    +                        redirectHandler: RedirectHandler? = nil,
    +                        cachedResponseHandler: CachedResponseHandler? = nil,
    +                        eventMonitors: [EventMonitor] = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + configuration + + +
    +

    URLSessionConfiguration to be used to create the underlying URLSession. Changes + to this value after being passed to this initializer will have no effect. + URLSessionConfiguration.af.default by default.

    +
    +
    + + delegate + + +
    +

    SessionDelegate that handles session‘s delegate callbacks as well as Request + interaction. SessionDelegate() by default.

    +
    +
    + + rootQueue + + +
    +

    Root DispatchQueue for all internal callbacks and state updates. MUST be a + serial queue. DispatchQueue(label: "org.alamofire.session.rootQueue") by default.

    +
    +
    + + startRequestsImmediately + + +
    +

    Determines whether this instance will automatically start all Requests. true + by default. If set to false, all Requests created must have .resume() called. + on them for them to start.

    +
    +
    + + requestQueue + + +
    +

    DispatchQueue on which to perform URLRequest creation. By default this queue + will use the rootQueue as its target. A separate queue can be used if it’s + determined request creation is a bottleneck, but that should only be done after + careful testing and profiling. nil by default.

    +
    +
    + + serializationQueue + + +
    +

    DispatchQueue on which to perform all response serialization. By default this + queue will use the rootQueue as its target. A separate queue can be used if + it’s determined response serialization is a bottleneck, but that should only be + done after careful testing and profiling. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor to be used for all Requests created by this instance. nil + by default.

    +
    +
    + + serverTrustManager + + +
    +

    ServerTrustManager to be used for all trust evaluations by this instance. nil + by default.

    +
    +
    + + redirectHandler + + +
    +

    RedirectHandler to be used by all Requests created by this instance. nil by + default.

    +
    +
    + + cachedResponseHandler + + +
    +

    CachedResponseHandler to be used by all Requests created by this instance. + nil by default.

    +
    +
    + + eventMonitors + + +
    +

    Additional EventMonitors used by the instance. Alamofire always adds a + AlamofireNotifications EventMonitor to the array passed here. [] by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

All Requests API +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Perform an action on all active Requests.

    +
    +

    Note

    +

    The provided action closure is performed asynchronously, meaning that some Requests may complete and + be unavailable by time it runs. Additionally, this action is performed on the instances’s rootQueue, + so care should be taken that actions are fast. Once the work on the Requests is complete, any + additional work should be performed on another queue.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func withAllRequests(perform action: @escaping (Set<Request>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + action + + +
    +

    Closure to perform with all Requests.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Cancel all active Requests, optionally calling a completion handler when complete.

    +
    +

    Note

    +

    This is an asynchronous operation and does not block the creation of future Requests. Cancelled + Requests may not cancel immediately due internal work, and may not cancel at all if they are close to + completion when cancelled.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancelAllRequests(completingOnQueue queue: DispatchQueue = .main, completion: (() -> Void)? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    DispatchQueue on which the completion handler is run. .main by default.

    +
    +
    + + completion + + +
    +

    Closure to be called when all Requests have been cancelled.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest +

+
+
+ +
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ + +
+ +

DownloadRequest +

+
+
+ +
+
+
+ + +
+ +

Data +

+
+
+ +
+
+
+ + +
+ +

File +

+
+
+ +
+
+
+ + +
+ +

InputStream +

+
+
+ +
+
+
+ + +
+ +

MultipartFormData +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the multipart form data built using a closure and sent using the provided +URLRequest components and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                 to url: URLConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 method: HTTPMethod = .post,
    +                 headers: HTTPHeaders? = nil,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default,
    +                 requestModifier: RequestModifier? = nil) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    + + requestModifier + + +
    +

    RequestModifier which will be applied to the URLRequest created from the + provided parameters. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible +value, and a RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                 with request: URLRequestConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components +and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: MultipartFormData,
    +                 to url: URLConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 method: HTTPMethod = .post,
    +                 headers: HTTPHeaders? = nil,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default,
    +                 requestModifier: RequestModifier? = nil) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    + + requestModifier + + +
    +

    RequestModifier which will be applied to the URLRequest created from the + provided parameters. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible +value and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func upload(multipartFormData: MultipartFormData,
    +                 with request: URLRequestConvertible,
    +                 usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                 interceptor: RequestInterceptor? = nil,
    +                 fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager instance to be used by the returned UploadRequest. .default instance by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

RequestDelegate +

+
+
+
    +
  • +
    + + + + sessionConfiguration + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sessionConfiguration: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startImmediately + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startImmediately: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup(after:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cleanup(after request: Request)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/SessionDelegate.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/SessionDelegate.html new file mode 100644 index 00000000..1e963094 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/SessionDelegate.html @@ -0,0 +1,1086 @@ + + + + SessionDelegate Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SessionDelegate

+
+
+ +
open class SessionDelegate : NSObject
+
extension SessionDelegate: URLSessionDelegate
+
extension SessionDelegate: URLSessionTaskDelegate
+
extension SessionDelegate: URLSessionDataDelegate
+
extension SessionDelegate: URLSessionDownloadDelegate
+ +
+
+

Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(fileManager:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from the given FileManager.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(fileManager: FileManager = .default)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + fileManager + + +
    +

    FileManager to use for underlying file management, such as moving downloaded files. + .default by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionTaskDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     didReceive challenge: URLAuthenticationChallenge,
    +                     completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     didSendBodyData bytesSent: Int64,
    +                     totalBytesSent: Int64,
    +                     totalBytesExpectedToSend: Int64)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     needNewBodyStream completionHandler: @escaping (InputStream?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     task: URLSessionTask,
    +                     willPerformHTTPRedirection response: HTTPURLResponse,
    +                     newRequest request: URLRequest,
    +                     completionHandler: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDataDelegate +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     dataTask: URLSessionDataTask,
    +                     didReceive response: URLResponse,
    +                     completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    open func urlSession(_ session: URLSession,
    +                     dataTask: URLSessionDataTask,
    +                     willCacheResponse proposedResponse: CachedURLResponse,
    +                     completionHandler: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDownloadDelegate +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/StringResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/StringResponseSerializer.html new file mode 100644 index 00000000..90b8aa7e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/StringResponseSerializer.html @@ -0,0 +1,798 @@ + + + + StringResponseSerializer Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StringResponseSerializer

+
+
+ +
public final class StringResponseSerializer : ResponseSerializer
+ +
+
+

A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no +data is considered an error. However, if the request has an HTTPMethod or the response has an HTTP status code +valid for empty responses, then an empty String is returned.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataPreprocessor: DataPreprocessor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoding + +
    +
    +
    +
    +
    +
    +

    Optional string encoding used to validate the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let encoding: String.Encoding?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyResponseCodes: Set<Int>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let emptyRequestMethods: Set<HTTPMethod>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dataPreprocessor: DataPreprocessor = StringResponseSerializer.defaultDataPreprocessor,
    +            encoding: String.Encoding? = nil,
    +            emptyResponseCodes: Set<Int> = StringResponseSerializer.defaultEmptyResponseCodes,
    +            emptyRequestMethods: Set<HTTPMethod> = StringResponseSerializer.defaultEmptyRequestMethods)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + dataPreprocessor + + +
    +

    DataPreprocessor used to prepare the received Data for serialization.

    +
    +
    + + encoding + + +
    +

    A string encoding. Defaults to nil, in which case the encoding will be determined + from the server response, falling back to the default HTTP character set, ISO-8859-1.

    +
    +
    + + emptyResponseCodes + + +
    +

    The HTTP response codes for which empty responses are allowed. [204, 205] by default.

    +
    +
    + + emptyRequestMethods + + +
    +

    The HTTP request methods for which empty responses are allowed. [.head] by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder.html new file mode 100644 index 00000000..f499d01d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder.html @@ -0,0 +1,1405 @@ + + + + URLEncodedFormEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncodedFormEncoder

+
+
+ +
public final class URLEncodedFormEncoder
+ +
+
+

An object that encodes instances into URL-encoded query strings.

+ +

ArrayEncoding can be used to configure how Array values are encoded. By default, the .brackets encoding is +used, encoding array values with brackets for each value. e.g array[]=1&array[]=2.

+ +

BoolEncoding can be used to configure how Bool values are encoded. By default, the .numeric encoding is used, +encoding true as 1 and false as 0.

+ +

DataEncoding can be used to configure how Data values are encoded. By default, the .deferredToData encoding is +used, which encodes Data values using their default Encodable implementation.

+ +

DateEncoding can be used to configure how Date values are encoded. By default, the .deferredToDate +encoding is used, which encodes Dates using their default Encodable implementation.

+ +

KeyEncoding can be used to configure how keys are encoded. By default, the .useDefaultKeys encoding is used, +which encodes the keys directly from the Encodable implementation.

+ +

KeyPathEncoding can be used to configure how paths within nested objects are encoded. By default, the .brackets +encoding is used, which encodes each sub-key in brackets. e.g. parent[child][grandchild]=value.

+ +

NilEncoding can be used to configure how nil Optional values are encoded. By default, the .dropKey encoding +is used, which drops nil key / value pairs from the output entirely.

+ +

SpaceEncoding can be used to configure how spaces are encoded. By default, the .percentEscaped encoding is used, +replacing spaces with %20.

+ +

This type is largely based on Vapor’s url-encoded-form project.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ArrayEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Array values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BoolEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Bool values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum BoolEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Data values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DataEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DateEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for Date values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DateEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + KeyEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for keys.

    + +

    This type is derived from JSONEncoder‘s KeyEncodingStrategy +and XMLEncoders KeyEncodingStrategy.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum KeyEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + KeyPathEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for nested object and Encodable value key paths.

    +
    ["parent" : ["child" : ["grandchild": "value"]]]
    +
    + +

    This encoding affects how the parent, child, grandchild path is encoded. Brackets are used by default. +e.g. parent[child][grandchild]=value.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NilEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for nil values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SpaceEncoding + +
    +
    +
    +
    +
    +
    +

    Encoding to use for spaces.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum SpaceEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Error + +
    +
    +
    +
    +
    + +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Error : Swift.Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Whether or not to sort the encoded key value pairs.

    +
    +

    Note

    + This setting ensures a consistent ordering for all encodings of the same parameters. When set to false, + encoded Dictionary values may have a different encoded order each time they’re encoded due to + Dictionary‘s random storage order, but Encodable types will maintain their encoded order. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let alphabetizeKeyValuePairs: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + arrayEncoding + +
    +
    +
    +
    +
    +
    +

    The ArrayEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let arrayEncoding: ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolEncoding + +
    +
    +
    +
    +
    +
    +

    The BoolEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boolEncoding: BoolEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dataEncoding + +
    +
    +
    +
    +
    +
    +

    THe DataEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dataEncoding: DataEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dateEncoding + +
    +
    +
    +
    +
    +
    +

    The DateEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let dateEncoding: DateEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + keyEncoding + +
    +
    +
    +
    +
    +
    +

    The KeyEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let keyEncoding: KeyEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + keyPathEncoding + +
    +
    +
    +
    +
    +
    +

    The KeyPathEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let keyPathEncoding: KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + nilEncoding + +
    +
    +
    +
    +
    +
    +

    The NilEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let nilEncoding: NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + spaceEncoding + +
    +
    +
    +
    +
    +
    +

    The SpaceEncoding to use.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let spaceEncoding: SpaceEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allowedCharacters + +
    +
    +
    +
    +
    +
    +

    The CharacterSet of allowed (non-escaped) characters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var allowedCharacters: CharacterSet
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance from the supplied parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(alphabetizeKeyValuePairs: Bool = true,
    +            arrayEncoding: ArrayEncoding = .brackets,
    +            boolEncoding: BoolEncoding = .numeric,
    +            dataEncoding: DataEncoding = .base64,
    +            dateEncoding: DateEncoding = .deferredToDate,
    +            keyEncoding: KeyEncoding = .useDefaultKeys,
    +            keyPathEncoding: KeyPathEncoding = .brackets,
    +            nilEncoding: NilEncoding = .dropKey,
    +            spaceEncoding: SpaceEncoding = .percentEscaped,
    +            allowedCharacters: CharacterSet = .afURLQueryAllowed)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + alphabetizeKeyValuePairs + + +
    +

    Whether or not to sort the encoded key value pairs. true by default.

    +
    +
    + + arrayEncoding + + +
    +

    The ArrayEncoding to use. .brackets by default.

    +
    +
    + + boolEncoding + + +
    +

    The BoolEncoding to use. .numeric by default.

    +
    +
    + + dataEncoding + + +
    +

    The DataEncoding to use. .base64 by default.

    +
    +
    + + dateEncoding + + +
    +

    The DateEncoding to use. .deferredToDate by default.

    +
    +
    + + keyEncoding + + +
    +

    The KeyEncoding to use. .useDefaultKeys by default.

    +
    +
    + + nilEncoding + + +
    +

    The NilEncoding to use. .drop by default.

    +
    +
    + + spaceEncoding + + +
    +

    The SpaceEncoding to use. .percentEscaped by default.

    +
    +
    + + allowedCharacters + + +
    +

    The CharacterSet of allowed (non-escaped) characters. .afURLQueryAllowed by + default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes the value as a URL form encoded String.

    +
    +

    Throws

    +

    An Error or EncodingError instance if encoding fails.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ value: Encodable) throws -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Encodable value.`

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded String.

    +
    +
    +
    +
  • +
  • +
    + + + + encode(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes the value as Data. This is performed by first creating an encoded String and then returning the +.utf8 data.

    +
    +

    Throws

    +

    An Error or EncodingError instance if encoding fails.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ value: Encodable) throws -> Data
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Encodable value.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded Data.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/ArrayEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/ArrayEncoding.html new file mode 100644 index 00000000..306cc23b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/ArrayEncoding.html @@ -0,0 +1,687 @@ + + + + ArrayEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ArrayEncoding

+
+
+ +
public enum ArrayEncoding
+ +
+
+

Encoding to use for Array values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    An empty set of square brackets (“[]”) are appended to the key for every value. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case brackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noBrackets + +
    +
    +
    +
    +
    +
    +

    No brackets are appended to the key and the key is encoded as is.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + indexInBrackets + +
    +
    +
    +
    +
    +
    +

    Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case indexInBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Provide a custom array key encoding with the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((_ key: String, _ index: Int) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/BoolEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/BoolEncoding.html new file mode 100644 index 00000000..dc28f471 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/BoolEncoding.html @@ -0,0 +1,633 @@ + + + + BoolEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BoolEncoding

+
+
+ +
public enum BoolEncoding
+ +
+
+

Encoding to use for Bool values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + numeric + +
    +
    +
    +
    +
    +
    +

    Encodes true as 1, false as 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case numeric
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + literal + +
    +
    +
    +
    +
    +
    +

    Encodes true as “true”, false as “false”. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case literal
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DataEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DataEncoding.html new file mode 100644 index 00000000..edb18872 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DataEncoding.html @@ -0,0 +1,660 @@ + + + + DataEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataEncoding

+
+
+ +
public enum DataEncoding
+ +
+
+

Encoding to use for Data values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + deferredToData + +
    +
    +
    +
    +
    +
    +

    Defers encoding to the Data type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferredToData
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + base64 + +
    +
    +
    +
    +
    +
    +

    Encodes Data as a Base64-encoded string. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case base64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Encode the Data as a custom value encoded by the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((Data) throws -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DateEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DateEncoding.html new file mode 100644 index 00000000..9b572424 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/DateEncoding.html @@ -0,0 +1,741 @@ + + + + DateEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DateEncoding

+
+
+ +
public enum DateEncoding
+ +
+
+

Encoding to use for Date values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + deferredToDate + +
    +
    +
    +
    +
    +
    +

    Defers encoding to the Date type. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case deferredToDate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + secondsSince1970 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates as seconds since midnight UTC on January 1, 1970.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case secondsSince1970
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + millisecondsSince1970 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates as milliseconds since midnight UTC on January 1, 1970.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case millisecondsSince1970
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + iso8601 + +
    +
    +
    +
    +
    +
    +

    Encodes Dates according to the ISO8601 and RFC3339 standards.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case iso8601
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + formatted(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes Dates using the given DateFormatter.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case formatted(DateFormatter)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Encodes Dates using the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((Date) throws -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/Error.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/Error.html new file mode 100644 index 00000000..2302429a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/Error.html @@ -0,0 +1,606 @@ + + + + Error Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
public enum Error : Swift.Error
+ +
+
+

URLEncodedFormEncoder error.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + invalidRootObject(_:) + +
    +
    +
    +
    +
    +
    +

    An invalid root object was created by the encoder. Only keyed values are valid.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidRootObject(String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyEncoding.html new file mode 100644 index 00000000..e278f01c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyEncoding.html @@ -0,0 +1,798 @@ + + + + KeyEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

KeyEncoding

+
+
+ +
public enum KeyEncoding
+ +
+
+

Encoding to use for keys.

+ +

This type is derived from JSONEncoder‘s KeyEncodingStrategy +and XMLEncoders KeyEncodingStrategy.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + useDefaultKeys + +
    +
    +
    +
    +
    +
    +

    Use the keys specified by each type. This is the default encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case useDefaultKeys
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertToSnakeCase + +
    +
    +
    +
    +
    +
    +

    Convert from “camelCaseKeys” to “snake_case_keys” before writing a key.

    + +

    Capital characters are determined by testing membership in +CharacterSet.uppercaseLetters and CharacterSet.lowercaseLetters +(Unicode General Categories Lu and Lt). +The conversion to lower case uses Locale.system, also known as +the ICU “root” locale. This means the result is consistent +regardless of the current user’s locale and language preferences.

    + +

    Converting from camel case to snake case:

    + +
      +
    1. Splits words at the boundary of lower-case to upper-case
    2. +
    3. Inserts _ between words
    4. +
    5. Lowercases the entire string
    6. +
    7. Preserves starting and ending _.
    8. +
    + +

    For example, oneTwoThree becomes one_two_three. _oneTwoThree_ becomes _one_two_three_.

    +
    +

    Note

    + Using a key encoding strategy has a nominal performance cost, as each string key has to be converted. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case convertToSnakeCase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + convertToKebabCase + +
    +
    +
    +
    +
    +
    +

    Same as convertToSnakeCase, but using - instead of _. +For example oneTwoThree becomes one-two-three.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case convertToKebabCase
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + capitalized + +
    +
    +
    +
    +
    +
    +

    Capitalize the first letter only. +For example oneTwoThree becomes OneTwoThree.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case capitalized
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + uppercased + +
    +
    +
    +
    +
    +
    +

    Uppercase all letters. +For example oneTwoThree becomes ONETWOTHREE.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case uppercased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + lowercased + +
    +
    +
    +
    +
    +
    +

    Lowercase all letters. +For example oneTwoThree becomes onetwothree.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case lowercased
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    A custom encoding using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((String) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyPathEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyPathEncoding.html new file mode 100644 index 00000000..fc305bbf --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/KeyPathEncoding.html @@ -0,0 +1,684 @@ + + + + KeyPathEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

KeyPathEncoding

+
+
+ +
public struct KeyPathEncoding
+ +
+
+

Encoding to use for nested object and Encodable value key paths.

+
["parent" : ["child" : ["grandchild": "value"]]]
+
+ +

This encoding affects how the parent, child, grandchild path is encoded. Brackets are used by default. +e.g. parent[child][grandchild]=value.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    Encodes key paths by wrapping each component in brackets. e.g. parent[child][grandchild].

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let brackets: URLEncodedFormEncoder.KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dots + +
    +
    +
    +
    +
    +
    +

    Encodes key paths by separating each component with dots. e.g. parent.child.grandchild.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dots: URLEncodedFormEncoder.KeyPathEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoding:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the encoding closure called for each sub-key in a key path.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoding: @escaping (_ subkey: String) -> String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoding + + +
    +

    Closure used to perform the encoding.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/NilEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/NilEncoding.html new file mode 100644 index 00000000..35f5fcb4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/NilEncoding.html @@ -0,0 +1,706 @@ + + + + NilEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NilEncoding

+
+
+ +
public struct NilEncoding
+ +
+
+

Encoding to use for nil values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dropKey + +
    +
    +
    +
    +
    +
    +

    Encodes nil by dropping the entire key / value pair.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dropKey: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + dropValue + +
    +
    +
    +
    +
    +
    +

    Encodes nil by dropping only the value. e.g. value1=one&nilValue=&value2=two.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let dropValue: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + null + +
    +
    +
    +
    +
    +
    +

    Encodes nil as null.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let null: URLEncodedFormEncoder.NilEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(encoding:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance with the encoding closure called for nil values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(encoding: @escaping () -> String?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoding + + +
    +

    Closure used to perform the encoding.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/SpaceEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/SpaceEncoding.html new file mode 100644 index 00000000..04822005 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormEncoder/SpaceEncoding.html @@ -0,0 +1,633 @@ + + + + SpaceEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SpaceEncoding

+
+
+ +
public enum SpaceEncoding
+ +
+
+

Encoding to use for spaces.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + percentEscaped + +
    +
    +
    +
    +
    +
    +

    Encodes spaces using percent escaping (%20).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case percentEscaped
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + plusReplaced + +
    +
    +
    +
    +
    +
    +

    Encodes spaces as +.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case plusReplaced
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder.html new file mode 100644 index 00000000..fec11b4d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder.html @@ -0,0 +1,779 @@ + + + + URLEncodedFormParameterEncoder Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncodedFormParameterEncoder

+
+
+ +
open class URLEncodedFormParameterEncoder : ParameterEncoder
+ +
+
+

A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending +on the Destination set.

+ +

If no Content-Type header is already set on the provided URLRequests, it will be set to +application/x-www-form-urlencoded; charset=utf-8.

+ +

Encoding behavior can be customized by passing an instance of URLEncodedFormEncoder to the initializer.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder/Destination.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder/Destination.html new file mode 100644 index 00000000..03d01c68 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/URLEncodedFormParameterEncoder/Destination.html @@ -0,0 +1,661 @@ + + + + Destination Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Destination

+
+
+ +
public enum Destination
+ +
+
+

Defines where the URL-encoded string should be set for each URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + methodDependent + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to any existing query string for .get, .head, and .delete request. +Sets it to the httpBody for all other methods.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case methodDependent
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to any existing query string from the URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case queryString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Applies the encoded query string to the httpBody of the URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpBody
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest.html new file mode 100644 index 00000000..4a144d61 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest.html @@ -0,0 +1,742 @@ + + + + UploadRequest Class Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

UploadRequest

+
+
+ +
public class UploadRequest : DataRequest
+ +
+
+

DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Initial State +

+
+
+
    +
  • +
    + + + + upload + +
    +
    +
    +
    +
    +
    +

    The UploadableConvertible value used to produce the Uploadable value for this instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let upload: UploadableConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileManager + +
    +
    +
    +
    +
    +
    +

    FileManager used to perform cleanup tasks, including the removal of multipart form encoded payloads written +to disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let fileManager: FileManager
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Mutable State +

+
+
+
    +
  • +
    + + + + uploadable + +
    +
    +
    +
    +
    +
    +

    Uploadable value used by the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var uploadable: Uploadable?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    override public func cleanup()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest/Uploadable.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest/Uploadable.html new file mode 100644 index 00000000..9540aee1 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Classes/UploadRequest/Uploadable.html @@ -0,0 +1,701 @@ + + + + Uploadable Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Uploadable

+
+
+ +
public enum Uploadable
+
extension UploadRequest.Uploadable: UploadableConvertible
+ +
+
+

Type describing the origin of the upload, whether Data, file, or stream.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + data(_:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided Data value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case data(Data)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + file(_:shouldRemove:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided file URL, as well as a Bool determining whether the source file should be +automatically removed once uploaded.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case file(URL, shouldRemove: Bool)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + stream(_:) + +
    +
    +
    +
    +
    +
    +

    Upload from the provided InputStream.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stream(InputStream)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+
    +
  • +
    + + + + createUploadable() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func createUploadable() throws -> UploadRequest.Uploadable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 00000000..826c5492 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,660 @@ + + + + Enumerations Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AFError + +
    +
    +
    +
    +
    +
    +

    AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with +their own associated reasons.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum AFError : Error
    +
    extension AFError: LocalizedError
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AuthenticationError + +
    +
    +
    +
    +
    +
    +

    Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are +still vended from Alamofire as AFError types. The AuthenticationError instances will be embedded within +AFError .requestAdaptationFailed or .requestRetryFailed cases.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum AuthenticationError : Error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryResult + +
    +
    +
    +
    +
    +
    +

    Outcome of determination whether retry is necessary.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum RetryResult
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AF.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AF.html new file mode 100644 index 00000000..019be1bb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AF.html @@ -0,0 +1,2419 @@ + + + + AF Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AF

+
+
+
public enum AF
+ +
+
+

Global namespace containing API for the default Session instance.

+ +
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadRequest using the Session.default from the resumeData produced from a previous +DownloadRequest cancellation to retrieve the contents of the original request and save them to the destination.

    +
    +

    Note

    +

    If destination is not specified, the download will be moved to a temporary location determined by + Alamofire.

    + +
    +
    +

    Note

    +

    On some versions of all Apple platforms (iOS 10 - 10.2, macOS 10.12 - 10.12.2, tvOS 10 - 10.1, watchOS 3 - 3.1.1), +resumeData is broken on background URL session configurations. There’s an underlying bug in the resumeData +generation logic where the data is written incorrectly and will always fail to resume the download. For more +information about the bug and possible workarounds, please refer to the this Stack Overflow post.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func download(resumingWith resumeData: Data,
    +                            interceptor: RequestInterceptor? = nil,
    +                            to destination: DownloadRequest.Destination? = nil) -> DownloadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + resumeData + + +
    +

    The resume Data. This is an opaque blob produced by URLSessionDownloadTask when a task is + cancelled. See Apple’s documentation + for more information.

    +
    +
    + + interceptor + + +
    +

    The RequestInterceptor, nil by default.

    +
    +
    + + destination + + +
    +

    The DownloadRequest.Destination closure used to determine the destination of the downloaded + file. nil by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created DownloadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ + + +

Data

+
+
+ +
+
+
+ + + +

File

+
+
+ +
+
+ + +
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the multipart form data built using a closure and sent using the provided +URLRequest components and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                          to url: URLConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          method: HTTPMethod = .post,
    +                          headers: HTTPHeaders? = nil,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + convertible + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible +value, and a RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: @escaping (MultipartFormData) -> Void,
    +                          with request: URLRequestConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData building closure.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components +and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: MultipartFormData,
    +                          to url: URLConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          method: HTTPMethod = .post,
    +                          headers: HTTPHeaders? = nil,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + url + + +
    +

    URLConvertible value to be used as the URLRequest‘s URL.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + method + + +
    +

    HTTPMethod for the URLRequest. .post by default.

    +
    +
    + + headers + + +
    +

    HTTPHeaders value to be added to the URLRequest. nil by default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager to be used if the form data exceeds the memory threshold and is + written to disk before being uploaded. .default instance by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible +value and RequestInterceptor.

    + +

    It is important to understand the memory implications of uploading MultipartFormData. If the cumulative +payload is small, encoding the data in-memory and directly uploading to a server is the by far the most +efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to +be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory +footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be +used for larger payloads such as video content.

    + +

    The encodingMemoryThreshold parameter allows Alamofire to automatically determine whether to encode in-memory +or stream from disk. If the content length of the MultipartFormData is below the encodingMemoryThreshold, +encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk +during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding +technique was used.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func upload(multipartFormData: MultipartFormData,
    +                          with request: URLRequestConvertible,
    +                          usingThreshold encodingMemoryThreshold: UInt64 = MultipartFormData.encodingMemoryThreshold,
    +                          interceptor: RequestInterceptor? = nil,
    +                          fileManager: FileManager = .default) -> UploadRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + multipartFormData + + +
    +

    MultipartFormData instance to upload.

    +
    +
    + + request + + +
    +

    URLRequestConvertible value to be used to create the URLRequest.

    +
    +
    + + encodingMemoryThreshold + + +
    +

    Byte threshold used to determine whether the form data is encoded into memory or + onto disk before being uploaded. MultipartFormData.encodingMemoryThreshold by + default.

    +
    +
    + + interceptor + + +
    +

    RequestInterceptor value to be used by the returned DataRequest. nil by default.

    +
    +
    + + fileManager + + +
    +

    FileManager instance to be used by the returned UploadRequest. .default instance by + default.

    +
    +
    +
    +
    +

    Return Value

    +

    The created UploadRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError.html new file mode 100644 index 00000000..297818b0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError.html @@ -0,0 +1,2046 @@ + + + + AFError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AFError

+
+
+ +
public enum AFError : Error
+
extension AFError: LocalizedError
+ +
+
+

AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with +their own associated reasons.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

Error Booleans +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .sessionDeinitialized.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionDeinitializedError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .sessionInvalidated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionInvalidatedError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .explicitlyCancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isExplicitlyCancelledError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isInvalidURLError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is .invalidURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isInvalidURLError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .parameterEncodingFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isParameterEncodingError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .parameterEncoderFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isParameterEncoderError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .multipartEncodingFailed. When true, the url and underlyingError +properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isMultipartEncodingError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .requestAdaptationFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isRequestAdaptationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .responseValidationFailed. When true, the acceptableContentTypes, +responseContentType, responseCode, and underlyingError properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResponseValidationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .responseSerializationFailed. When true, the failedStringEncoding and +underlyingError properties will contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isResponseSerializationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is .serverTrustEvaluationFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isServerTrustEvaluationError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isRequestRetryError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is requestRetryFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isRequestRetryError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is createUploadableFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCreateUploadableError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isCreateURLRequestError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns whether the instance is downloadedFileMoveFailed. When true, the destination and underlyingError properties will +contain the associated values.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isDownloadedFileMoveError: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSessionTaskError + +
    +
    +
    +
    +
    +
    +

    Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will +contain the associated value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSessionTaskError: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Convenience Properties +

+
+
+
    +
  • +
    + + + + urlConvertible + +
    +
    +
    +
    +
    +
    +

    The URLConvertible associated with the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var urlConvertible: URLConvertible? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL associated with the error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var url: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + underlyingError + +
    +
    +
    +
    +
    +
    +

    The underlying Error responsible for generating the failure associated with .sessionInvalidated, +.parameterEncodingFailed, .parameterEncoderFailed, .multipartEncodingFailed, .requestAdaptationFailed, +.responseSerializationFailed, .requestRetryFailed errors.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var underlyingError: Error? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The acceptable Content-Types of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var acceptableContentTypes: [String]? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + responseContentType + +
    +
    +
    +
    +
    +
    +

    The response Content-Type of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var responseContentType: String? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + responseCode + +
    +
    +
    +
    +
    +
    +

    The response code of a .responseValidationFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var responseCode: Int? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failedStringEncoding + +
    +
    +
    +
    +
    +
    +

    The String.Encoding associated with a failed .stringResponse() call.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var failedStringEncoding: String.Encoding? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sourceURL + +
    +
    +
    +
    +
    +
    +

    The source URL of a .downloadedFileMoveFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sourceURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + destinationURL + +
    +
    +
    +
    +
    +
    +

    The destination URL of a .downloadedFileMoveFailed error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var destinationURL: URL? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + downloadResumeData + +
    +
    +
    +
    +
    +
    +

    The download resume data of any underlying network error. Only produced by DownloadRequests.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var downloadResumeData: Data? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Error Descriptions +

+
+
+
    +
  • +
    + + + + errorDescription + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var errorDescription: String? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/MultipartEncodingFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/MultipartEncodingFailureReason.html new file mode 100644 index 00000000..5f3779c7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/MultipartEncodingFailureReason.html @@ -0,0 +1,930 @@ + + + + MultipartEncodingFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

MultipartEncodingFailureReason

+
+
+ +
public enum MultipartEncodingFailureReason
+ +
+
+

The underlying reason the .multipartEncodingFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The fileURL provided for reading an encodable body part isn’t a file URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartURLInvalid(url: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The filename of the fileURL provided has either an empty lastPathComponent or `pathExtension.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFilenameInvalid(in: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file at the fileURL provided was not reachable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileNotReachable(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Attempting to check the reachability of the fileURL provided threw an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileNotReachableWithError(atURL: URL, error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file at the fileURL provided is actually a directory.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileIsDirectory(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The size of the file at the fileURL provided was not returned by the system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileSizeNotAvailable(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to find the size of the file at the fileURL provided threw an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An InputStream could not be created for the provided fileURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyPartInputStreamCreationFailed(for: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    An OutputStream could not be created when attempting to write the encoded data to disk.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamCreationFailed(for: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The encoded body data could not be written to disk because a file already exists at the provided fileURL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamFileAlreadyExists(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The fileURL provided for writing the encoded body data to disk is not a file URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamURLInvalid(url: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to write the encoded body data to disk failed with an underlying error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case outputStreamWriteFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The attempt to read an encoded body part InputStream failed with underlying system error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputStreamReadFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason.html new file mode 100644 index 00000000..66620a82 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason.html @@ -0,0 +1,661 @@ + + + + ParameterEncoderFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoderFailureReason

+
+
+ +
public enum ParameterEncoderFailureReason
+ +
+
+

The underlying reason the .parameterEncoderFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + RequiredComponent + +
    +
    +
    +
    +
    +
    +

    Possible missing components.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum RequiredComponent
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A RequiredComponent was missing during encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingRequiredComponent(RequiredComponent)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + encoderFailed(error:) + +
    +
    +
    +
    +
    +
    +

    The underlying encoder failed with the associated error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case encoderFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html new file mode 100644 index 00000000..319050a9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html @@ -0,0 +1,633 @@ + + + + RequiredComponent Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequiredComponent

+
+
+ +
public enum RequiredComponent
+ +
+
+

Possible missing components.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + url + +
    +
    +
    +
    +
    +
    +

    The URL was missing or unable to be extracted from the passed URLRequest or during encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case url
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpMethod(rawValue:) + +
    +
    +
    +
    +
    +
    +

    The HTTPMethod could not be extracted from the passed URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpMethod(rawValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncodingFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncodingFailureReason.html new file mode 100644 index 00000000..8a6a80a8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ParameterEncodingFailureReason.html @@ -0,0 +1,660 @@ + + + + ParameterEncodingFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncodingFailureReason

+
+
+ +
public enum ParameterEncodingFailureReason
+ +
+
+

The underlying reason the .parameterEncodingFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + missingURL + +
    +
    +
    +
    +
    +
    +

    The URLRequest did not have a URL to encode.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingURL
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    JSON serialization failed with an underlying system error during the encoding process.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case jsonEncodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom parameter encoding failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customEncodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseSerializationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseSerializationFailureReason.html new file mode 100644 index 00000000..f5373b16 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseSerializationFailureReason.html @@ -0,0 +1,795 @@ + + + + ResponseSerializationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseSerializationFailureReason

+
+
+ +
public enum ResponseSerializationFailureReason
+ +
+
+

The underlying reason the response serialization error occurred.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The server response contained no data or the data was zero length.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputDataNilOrZeroLength
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + inputFileNil + +
    +
    +
    +
    +
    +
    +

    The file containing the server response did not exist.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputFileNil
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The file containing the server response could not be read from the associated URL.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case inputFileReadFailed(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    String serialization failed using the provided String.Encoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case stringSerializationFailed(encoding: String.Encoding)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    JSON serialization failed with an underlying system error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case jsonSerializationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A DataDecoder failed to decode the response due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case decodingFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A custom response serializer failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customSerializationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Generic serialization failed for an empty response that wasn’t type Empty but instead the associated type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidEmptyResponse(type: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseValidationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseValidationFailureReason.html new file mode 100644 index 00000000..541e3591 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ResponseValidationFailureReason.html @@ -0,0 +1,742 @@ + + + + ResponseValidationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseValidationFailureReason

+
+
+ +
public enum ResponseValidationFailureReason
+ +
+
+

The underlying reason the .responseValidationFailed error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataFileNil + +
    +
    +
    +
    +
    +
    +

    The data file containing the server response did not exist.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case dataFileNil
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The data file containing the server response at the associated URL could not be read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case dataFileReadFailed(at: URL)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response did not contain a Content-Type and the acceptableContentTypes provided did not contain a +wildcard type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingContentType(acceptableContentTypes: [String])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response Content-Type did not match any type in the provided acceptableContentTypes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The response status code was not acceptable.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case unacceptableStatusCode(code: Int)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom response validation failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customValidationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason.html new file mode 100644 index 00000000..375a5ccd --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason.html @@ -0,0 +1,958 @@ + + + + ServerTrustFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustFailureReason

+
+
+ +
public enum ServerTrustFailureReason
+ +
+
+

Underlying reason a server trust evaluation error occurred.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    +

    The output of a server trust evaluation.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Output
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    No ServerTrustEvaluator was found for the associated host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noRequiredEvaluator(host: String)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noCertificatesFound + +
    +
    +
    +
    +
    +
    +

    No certificates were found with which to perform the trust evaluation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noCertificatesFound
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noPublicKeysFound + +
    +
    +
    +
    +
    +
    +

    No public keys were found with which to perform the trust evaluation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noPublicKeysFound
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, application of the associated SecPolicy failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case policyApplicationFailed(trust: SecTrust, policy: SecPolicy, status: OSStatus)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, setting the associated anchor certificates failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case settingAnchorCertificatesFailed(status: OSStatus, certificates: [SecCertificate])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    During evaluation, creation of the revocation policy failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case revocationPolicyCreationFailed
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    SecTrust evaluation failed with the associated Error, if one was produced.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trustEvaluationFailed(error: Error?)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Default evaluation failed with the associated Output.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case defaultEvaluationFailed(output: Output)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Host validation failed with the associated Output.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case hostValidationFailed(output: Output)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Revocation check failed with the associated Output and options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case revocationCheckFailed(output: Output, options: RevocationTrustEvaluator.Options)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Certificate pinning failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case certificatePinningFailed(host: String, trust: SecTrust, pinnedCertificates: [SecCertificate], serverCertificates: [SecCertificate])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Public key pinning failed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case publicKeyPinningFailed(host: String, trust: SecTrust, pinnedKeys: [SecKey], serverKeys: [SecKey])
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Custom server trust evaluation failed due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case customEvaluationFailed(error: Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason/Output.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason/Output.html new file mode 100644 index 00000000..beca0ac2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/ServerTrustFailureReason/Output.html @@ -0,0 +1,687 @@ + + + + Output Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Output

+
+
+ +
public struct Output
+ +
+
+

The output of a server trust evaluation.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + host + +
    +
    +
    +
    +
    +
    +

    The host for which the evaluation was performed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let host: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trust + +
    +
    +
    +
    +
    +
    +

    The SecTrust value which was evaluated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let trust: SecTrust
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The OSStatus of evaluation operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let status: OSStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of the evaluation operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: SecTrustResultType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/URLRequestValidationFailureReason.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/URLRequestValidationFailureReason.html new file mode 100644 index 00000000..f247436b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/URLRequestValidationFailureReason.html @@ -0,0 +1,606 @@ + + + + URLRequestValidationFailureReason Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequestValidationFailureReason

+
+
+ +
public enum URLRequestValidationFailureReason
+ +
+
+

The underlying reason the .urlRequestValidationFailed

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    URLRequest with GET method had body data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case bodyDataInGETRequest(Data)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/UnexpectedInputStreamLength.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/UnexpectedInputStreamLength.html new file mode 100644 index 00000000..2c4efd90 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AFError/UnexpectedInputStreamLength.html @@ -0,0 +1,634 @@ + + + + UnexpectedInputStreamLength Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

UnexpectedInputStreamLength

+
+
+ +
public struct UnexpectedInputStreamLength : Error
+ +
+
+

Represents unexpected input stream length that occur when encoding the MultipartFormData. Instances will be +embedded within an AFError.multipartEncodingFailed .inputStreamReadFailed case.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + bytesExpected + +
    +
    +
    +
    +
    +
    +

    The expected byte count to read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bytesExpected: UInt64
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + bytesRead + +
    +
    +
    +
    +
    +
    +

    The actual byte count read.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bytesRead: UInt64
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AuthenticationError.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AuthenticationError.html new file mode 100644 index 00000000..1f8bdc0e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/AuthenticationError.html @@ -0,0 +1,635 @@ + + + + AuthenticationError Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationError

+
+
+ +
public enum AuthenticationError : Error
+ +
+
+

Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are +still vended from Alamofire as AFError types. The AuthenticationError instances will be embedded within +AFError .requestAdaptationFailed or .requestRetryFailed cases.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + missingCredential + +
    +
    +
    +
    +
    +
    +

    The credential was missing so the request could not be authenticated.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case missingCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + excessiveRefresh + +
    +
    +
    +
    +
    +
    +

    The credential was refreshed too many times within the RefreshWindow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case excessiveRefresh
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/HTTPMethod.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/HTTPMethod.html new file mode 100644 index 00000000..dbdfd33c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/HTTPMethod.html @@ -0,0 +1,681 @@ + + + + HTTPMethod Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (98% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPMethod

+
+
+
public enum HTTPMethod : String
+ +
+
+

HTTP method definitions.

+ +

See https://tools.ietf.org/html/rfc7231#section-4.3

+ +
+
+ +
+
+
+
    +
  • +
    + + + + connect + +
    +
    +
    +
    +
    +
    +

    CONNECT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case connect = "CONNECT"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delete + +
    +
    +
    +
    +
    +
    +

    DELETE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case delete = "DELETE"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get + +
    +
    +
    +
    +
    +
    +

    GET method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case get = "GET"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + head + +
    +
    +
    +
    +
    +
    +

    HEAD method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case head = "HEAD"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    OPTIONS method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case options = "OPTIONS"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + patch + +
    +
    +
    +
    +
    +
    +

    PATCH method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case patch = "PATCH"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + post + +
    +
    +
    +
    +
    +
    +

    POST method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case post = "POST"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + put + +
    +
    +
    +
    +
    +
    +

    PUT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case put = "PUT"
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trace + +
    +
    +
    +
    +
    +
    +

    TRACE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case trace = "TRACE"
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/Result.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/Result.html new file mode 100644 index 00000000..3c425f6e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/Result.html @@ -0,0 +1,1242 @@ + + + + Result Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Result

+
+
+
public enum Result<Value>
+ +
+
+

Used to represent whether a request was successful or encountered an error.

+ +
    +
  • success: The request and all post processing operations were successful resulting in the serialization of the + provided associated value.

  • +
  • failure: The request encountered an error resulting in a failure. The associated values are the original data + provided by the server as well as the error that caused the failure.

  • +
+ +
+
+ +
+
+
+
    +
  • +
    + + + + success(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case success(Value)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case failure(Error)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns true if the result is a success, false otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isFailure + +
    +
    +
    +
    +
    +
    +

    Returns true if the result is a failure, false otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isFailure: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value if the result is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Error? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes whether the result was a +success or failure in addition to the value or error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + init(value:) + +
    +
    +
    +
    +
    +
    +

    Creates a Result instance from the result of a closure.

    + +

    A failure result is created when the closure throws, and a success result is created when the closure +succeeds without throwing an error.

    +
    func someString() throws -> String { ... }
    +
    +let result = Result(value: {
    +    return try someString()
    +})
    +
    +// The type of result is Result<String>
    +
    + +

    The trailing closure syntax is also supported:

    +
    let result = Result { try someString() }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(value: () throws -> Value)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The closure to execute and create the result for.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + unwrap() + +
    +
    +
    +
    +
    +
    +

    Returns the success value, or throws the failure error.

    +
    let possibleString: Result<String> = .success("success")
    +try print(possibleString.unwrap())
    +// Prints "success"
    +
    +let noString: Result<String> = .failure(error)
    +try print(noString.unwrap())
    +// Throws error
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func unwrap() throws -> Value
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: Result<Data> = .success(Data())
    +let possibleInt = possibleData.map { $0.count }
    +try print(possibleInt.unwrap())
    +// Prints "0"
    +
    +let noData: Result<Data> = .failure(error)
    +let noInt = noData.map { $0.count }
    +try print(noInt.unwrap())
    +// Throws error
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<T>(_ transform: (Value) -> T) -> Result<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the Result instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + flatMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the flatMap method with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data> = .success(Data(...))
    +let possibleObject = possibleData.flatMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: Result<Data> = .failure(someError)
    +let withMyError: Result<Data> = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<T>(_ transform: (Error) -> T) -> Result where T : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same instance.

    +
    +
    +
    +
  • +
  • +
    + + + + flatMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the flatMapError function with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data> = .success(Data(...))
    +let possibleObject = possibleData.flatMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func flatMapError<T>(_ transform: (Error) throws -> T) -> Result where T : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same instance.

    +
    +
    +
    +
  • +
  • +
    + + + + withValue(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the withValue function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func withValue(_ closure: (Value) throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A closure that takes the success value of this instance.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + withError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the withError function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func withError(_ closure: (Error) throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A closure that takes the success value of this instance.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + ifSuccess(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success.

    + +

    Use the ifSuccess function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func ifSuccess(_ closure: () throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A Void closure.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
  • +
    + + + + ifFailure(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure.

    + +

    Use the ifFailure function to evaluate the passed closure without modifying the Result instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func ifFailure(_ closure: () throws -> Void) rethrows -> Result
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    A Void closure.

    +
    +
    +
    +
    +

    Return Value

    +

    This Result instance, unmodified.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/RetryResult.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/RetryResult.html new file mode 100644 index 00000000..a9aa6ab4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Enums/RetryResult.html @@ -0,0 +1,687 @@ + + + + RetryResult Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RetryResult

+
+
+ +
public enum RetryResult
+ +
+
+

Outcome of determination whether retry is necessary.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + retry + +
    +
    +
    +
    +
    +
    +

    Retry should be attempted immediately.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case retry
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retryWithDelay(_:) + +
    +
    +
    +
    +
    +
    +

    Retry should be attempted after the associated TimeInterval.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case retryWithDelay(TimeInterval)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotRetry + +
    +
    +
    +
    +
    +
    +

    Do not retry.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotRetry
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Do not retry due to the associated Error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotRetryWithError(Error)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 00000000..690dcaad --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,1098 @@ + + + + Extensions Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Error + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

System Type Extensions +

+
+
+ +
+
+
    +
  • +
    + + + + Notification + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Notification
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataDecoder Protocol +

+
+
+ +
+
+
+ + +
+ +

Extensions +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Array.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Array.html new file mode 100644 index 00000000..023fe177 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Array.html @@ -0,0 +1,650 @@ + + + + Array Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Array

+
+
+ +
extension Array: AlamofireExtended
+
extension Array where Element == ServerTrustEvaluating
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where Element == ServerTrustEvaluating +

+
+
+
    +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given SecTrust value for the given host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + trust + + +
    +

    The SecTrust value to evaluate.

    +
    +
    + + host + + +
    +

    The host for which to evaluate the SecTrust value.

    +
    +
    +
    +
    +

    Return Value

    +

    Whether or not the evaluator considers the SecTrust value valid for host.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Bundle.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Bundle.html new file mode 100644 index 00000000..210c154b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Bundle.html @@ -0,0 +1,494 @@ + + + + Bundle Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Bundle

+
+
+
class Bundle : NSObject
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Returns all valid cer, crt, and der certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    Returns all public keys for the valid certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/CharacterSet.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/CharacterSet.html new file mode 100644 index 00000000..7a04dc6d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/CharacterSet.html @@ -0,0 +1,616 @@ + + + + CharacterSet Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CharacterSet

+
+
+ +
extension CharacterSet
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + afURLQueryAllowed + +
    +
    +
    +
    +
    +
    +

    Creates a CharacterSet from RFC 3986 allowed characters.

    + +

    RFC 3986 states that the following characters are “reserved” characters.

    + +
      +
    • General Delimiters: “:”, “#”, “[”, “]”, “@”, “?”, “/”
    • +
    • Sub-Delimiters: “!”, “$”, “&”, “‘”, “(”, “)”, “*”, “+”, “,”, “;”, “=”
    • +
    + +

    In RFC 3986 - Section 3.4, it states that the “?” and “/” characters should not be escaped to allow +query strings to include a URL. Therefore, all “reserved” characters with the exception of “?” and “/” +should be percent-escaped in the query string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let afURLQueryAllowed: CharacterSet
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Collection.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Collection.html new file mode 100644 index 00000000..ca43a4d3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Collection.html @@ -0,0 +1,530 @@ + + + + Collection Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Collection

+
+
+
extension Collection where Element == String
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where Element == String

+

+
+
+
    +
  • +
    + + + + qualityEncoded() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func qualityEncoded() -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html new file mode 100644 index 00000000..d2ee5f38 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/DispatchQueue.html @@ -0,0 +1,552 @@ + + + + DispatchQueue Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DispatchQueue

+
+
+
extension DispatchQueue
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + after(_:execute:) + +
    +
    +
    +
    +
    +
    +

    Execute the provided closure after a TimeInterval.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func after(_ delay: TimeInterval, execute closure: @escaping () -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + delay + + +
    +

    TimeInterval to delay execution.

    +
    +
    + + closure + + +
    +

    Closure to execute.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Error.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Error.html new file mode 100644 index 00000000..1d503fb3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Error.html @@ -0,0 +1,632 @@ + + + + Error Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
extension Error
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asAFError + +
    +
    +
    +
    +
    +
    +

    Returns the instance cast as an AFError.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var asAFError: AFError? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the instance cast as an AFError. If casting fails, a fatalError with the specified message is thrown.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asAFError(orFailWith message: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> AFError
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/HTTPURLResponse.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/HTTPURLResponse.html new file mode 100644 index 00000000..3376d1ac --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/HTTPURLResponse.html @@ -0,0 +1,605 @@ + + + + HTTPURLResponse Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPURLResponse

+
+
+ +
extension HTTPURLResponse
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns allHeaderFields as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Notification.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Notification.html new file mode 100644 index 00000000..12e5f6dc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Notification.html @@ -0,0 +1,605 @@ + + + + Notification Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Notification

+
+
+ +
extension Notification
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The Request contained by the instance’s userInfo, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var request: Request? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/NotificationCenter.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/NotificationCenter.html new file mode 100644 index 00000000..6adf7a04 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/NotificationCenter.html @@ -0,0 +1,552 @@ + + + + NotificationCenter Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

NotificationCenter

+
+
+
extension NotificationCenter
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Convenience function for posting notifications with Request payloads.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func postNotification(named name: Notification.Name, with request: Request)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The name of the notification.

    +
    +
    + + request + + +
    +

    The Request payload.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/OperationQueue.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/OperationQueue.html new file mode 100644 index 00000000..e231ef7a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/OperationQueue.html @@ -0,0 +1,593 @@ + + + + OperationQueue Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

OperationQueue

+
+
+
extension OperationQueue
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    convenience init(qualityOfService: QualityOfService = .default,
    +                 maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount,
    +                 underlyingQueue: DispatchQueue? = nil,
    +                 name: String? = nil,
    +                 startSuspended: Bool = false)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + qualityOfService + + +
    +

    QualityOfService to be applied to the queue. .default by default.

    +
    +
    + + maxConcurrentOperationCount + + +
    +

    Maximum concurrent operations. + OperationQueue.defaultMaxConcurrentOperationCount by default.

    +
    +
    + + underlyingQueue + + +
    +

    Underlying DispatchQueue. nil by default.

    +
    +
    + + name + + +
    +

    Name for the queue. nil by default.

    +
    +
    + + startSuspended + + +
    +

    Whether the queue starts suspended. false by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Result.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Result.html new file mode 100644 index 00000000..72b38941 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/Result.html @@ -0,0 +1,722 @@ + + + + Result Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Result

+
+
+
extension Result
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + success + +
    +
    +
    +
    +
    +
    +

    Returns the associated value if the result is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var success: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + failure + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var failure: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(value:error:) + +
    +
    +
    +
    +
    +
    +

    Initializes a Result from value or error. Returns .failure if the error is non-nil, .success otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    init(value: Success, error: Failure?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + value + + +
    +

    A value.

    +
    +
    + + error + + +
    +

    An Error.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a success, passing the unwrapped value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data, Error> = .success(Data(...))
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> Result<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result containing the result of the given closure. If this instance is a failure, returns the + same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the Result is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: Result<Data, Error> = .success(Data(...))
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> Result<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A Result instance containing the result of the transform. If this instance is a success, returns + the same success.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SCNetworkReachabilityFlags.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SCNetworkReachabilityFlags.html new file mode 100644 index 00000000..4140eac8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SCNetworkReachabilityFlags.html @@ -0,0 +1,683 @@ + + + + SCNetworkReachabilityFlags Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (94% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SCNetworkReachabilityFlags

+
+
+
extension SCNetworkReachabilityFlags
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + isReachable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isConnectionRequired + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isConnectionRequired: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var canConnectAutomatically: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var canConnectWithoutUserInteraction: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isActuallyReachable + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isActuallyReachable: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + isCellular + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var isCellular: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + readableDescription + +
    +
    +
    +
    +
    +
    +

    Human readable String for all states, to help with debugging.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var readableDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SecTrust.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SecTrust.html new file mode 100644 index 00000000..0ecff22b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/SecTrust.html @@ -0,0 +1,683 @@ + + + + SecTrust Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SecTrust

+
+
+
class SecTrust : _CFObject
+ +
+
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(policy:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func apply(policy: SecPolicy) throws -> SecTrust
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func setAnchorCertificates(_ certificates: [SecCertificate]) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    The public keys contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificateData + +
    +
    +
    +
    +
    +
    +

    The Data values for all certificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var certificateData: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func performDefaultEvaluation(forHost host: String) throws
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validateHost(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func validateHost(_ host: String) throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/String.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/String.html new file mode 100644 index 00000000..397f663d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/String.html @@ -0,0 +1,614 @@ + + + + String Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

String

+
+
+ +
extension String: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL if self can be used to initialize a URL instance, otherwise throws.

    +
    +

    Throws

    + An AFError.invalidURL instance. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL initialized with self.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URL.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URL.html new file mode 100644 index 00000000..75892991 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URL.html @@ -0,0 +1,605 @@ + + + + URL Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URL

+
+
+ +
extension URL: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLComponents.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLComponents.html new file mode 100644 index 00000000..20e8ca5d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLComponents.html @@ -0,0 +1,614 @@ + + + + URLComponents Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLComponents

+
+
+ +
extension URLComponents: URLConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL if the self‘s url is not nil, otherwise throws.

    +
    +

    Throws

    + An AFError.invalidURL instance. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL from the url property.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLRequest.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLRequest.html new file mode 100644 index 00000000..43f8d612 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLRequest.html @@ -0,0 +1,762 @@ + + + + URLRequest Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequest

+
+
+ +
extension URLRequest
+
extension URLRequest: URLRequestConvertible
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns allHTTPHeaderFields as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    +

    Returns self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the specified url, method, and headers.

    +
    +

    Throws

    + Any error thrown while converting the URLConvertible to a URL. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + url + + +
    +

    The URLConvertible value.

    +
    +
    + + method + + +
    +

    The HTTPMethod.

    +
    +
    + + headers + + +
    +

    The HTTPHeaders, nil by default.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + method + +
    +
    +
    +
    +
    +
    +

    Returns the httpMethod as Alamofire’s HTTPMethod type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var method: HTTPMethod? { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + validate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func validate() throws
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLSessionConfiguration.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLSessionConfiguration.html new file mode 100644 index 00000000..9666bb70 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Extensions/URLSessionConfiguration.html @@ -0,0 +1,606 @@ + + + + URLSessionConfiguration Extension Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLSessionConfiguration

+
+
+ +
extension URLSessionConfiguration
+
extension URLSessionConfiguration: AlamofireExtended
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + headers + +
    +
    +
    +
    +
    +
    +

    Returns httpAdditionalHeaders as HTTPHeaders.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var headers: HTTPHeaders { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Functions.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Functions.html new file mode 100644 index 00000000..9debbb7c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Functions.html @@ -0,0 +1,494 @@ + + + + Functions Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (77% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Functions

+

The following functions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Returns whether the two network reachability status values are equal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func ==(
    +    lhs: NetworkReachabilityManager.NetworkReachabilityStatus,
    +    rhs: NetworkReachabilityManager.NetworkReachabilityStatus)
    +    -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + lhs + + +
    +

    The left-hand side value to compare.

    +
    +
    + + rhs + + +
    +

    The right-hand side value to compare.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the two values are equal, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Global Variables.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Global Variables.html new file mode 100644 index 00000000..9a003540 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Global Variables.html @@ -0,0 +1,599 @@ + + + + Global Variables Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Global Variables

+

The following global variables are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AF + +
    +
    +
    +
    +
    +
    +

    Reference to Session.default for quick bootstrapping and examples.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let AF: Session
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 00000000..55731f67 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,1337 @@ + + + + Protocols Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AlamofireExtended + +
    +
    +
    +
    +
    +
    +

    Protocol describing the af extension points for Alamofire extended types.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AlamofireExtended
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

    + +

    One common example of an AuthenticationCredential is an OAuth2 credential containing an access token used to +authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes +which will then require a refresh of the credential using the refresh token to generate a new access token.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol AuthenticationCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Authenticator + +
    +
    +
    +
    +
    +
    +

    Types adopting the Authenticator protocol can be used to authenticate URLRequests with an +AuthenticationCredential as well as refresh the AuthenticationCredential when required.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Authenticator : AnyObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    A type that handles whether the data task should store the HTTP response in the cache.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CachedResponseHandler
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EventMonitor + +
    +
    +
    +
    +
    +
    +

    Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +URLSession delegate protocols as well as various events from the lifetime of Request and its subclasses.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EventMonitor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParameterEncoder + +
    +
    +
    +
    +
    +
    +

    A type that can encode any Encodable type into a URLRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ParameterEncoder
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParameterEncoding + +
    +
    +
    +
    +
    +
    +

    A type used to define how a set of parameters are applied to a URLRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RedirectHandler + +
    +
    +
    +
    +
    +
    +

    A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RedirectHandler
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocol Conformances +

+
+
+
    +
  • +
    + + + + RequestDelegate + +
    +
    +
    +
    +
    +
    +

    Protocol abstraction for Request‘s communication back to the SessionDelegate.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestDelegate : AnyObject
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest +

+
+
+ +
+
+
    +
  • +
    + + + + RequestInterceptor + +
    +
    +
    +
    +
    +
    +

    Type that provides both RequestAdapter and RequestRetrier functionality.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestInterceptor : RequestAdapter, RequestRetrier
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestAdapter + +
    +
    +
    +
    +
    +
    +

    A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestAdapter
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestRetrier + +
    +
    +
    +
    +
    +
    +

    A type that determines whether a request should be retried after being executed by the specified session manager +and encountering an error.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol RequestRetrier
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    The type to which all data response serializers must conform in order to serialize a response.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    The type to which all download response serializers must conform in order to serialize a response.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DownloadResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ResponseSerializer + +
    +
    +
    +
    +
    +
    +

    A serializer that can handle both data and download responses.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ResponseSerializer : DataResponseSerializerProtocol, DownloadResponseSerializerProtocol
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataPreprocessor + +
    +
    +
    +
    +
    +
    +

    Type used to preprocess Data before it handled by a serializer.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataPreprocessor
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + EmptyResponse + +
    +
    +
    +
    +
    +
    +

    Protocol representing an empty response. Use T.emptyValue() to get an instance.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EmptyResponse
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataDecoder Protocol +

+
+
+
    +
  • +
    + + + + DataDecoder + +
    +
    +
    +
    +
    +
    +

    Any type which can decode Data into a Decodable type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataDecoder
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+
    +
  • +
    + + + + DataStreamSerializer + +
    +
    +
    +
    +
    +
    +

    A type which can serialize incoming Data.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol DataStreamSerializer
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ServerTrustEvaluating + +
    +
    +
    +
    +
    +
    +

    A protocol describing the API used to evaluate server trusts.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol ServerTrustEvaluating
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + URLConvertible + +
    +
    +
    +
    +
    +
    +

    Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct +URLRequests.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol URLConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + URLRequestConvertible + +
    +
    +
    +
    +
    +
    +

    Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol URLRequestConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AlamofireExtended.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AlamofireExtended.html new file mode 100644 index 00000000..cf5c7de5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AlamofireExtended.html @@ -0,0 +1,676 @@ + + + + AlamofireExtended Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireExtended

+
+
+ +
public protocol AlamofireExtended
+ +
+
+

Protocol describing the af extension points for Alamofire extended types.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + ExtendedType + +
    +
    +
    +
    +
    +
    +

    Type being extended.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype ExtendedType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + af + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Static Alamofire extension point.

    + +
    +

    Default Implementation

    +
    +

    Static Alamofire extension point.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static var af: AlamofireExtension<ExtendedType>.Type { get set }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + af + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Instance Alamofire extension point.

    + +
    +

    Default Implementation

    +
    +

    Instance Alamofire extension point.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var af: AlamofireExtension<ExtendedType> { get set }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AuthenticationCredential.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AuthenticationCredential.html new file mode 100644 index 00000000..848fcc73 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/AuthenticationCredential.html @@ -0,0 +1,616 @@ + + + + AuthenticationCredential Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AuthenticationCredential

+
+
+ +
public protocol AuthenticationCredential
+ +
+
+

Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

+ +

One common example of an AuthenticationCredential is an OAuth2 credential containing an access token used to +authenticate all requests on behalf of a user. The access token generally has an expiration window of 60 minutes +which will then require a refresh of the credential using the refresh token to generate a new access token.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requiresRefresh + +
    +
    +
    +
    +
    +
    +

    Whether the credential requires a refresh. This property should always return true when the credential is +expired. It is also wise to consider returning true when the credential will expire in several seconds or +minutes depending on the expiration window of the credential.

    + +

    For example, if the credential is valid for 60 minutes, then it would be wise to return true when the +credential is only valid for 5 minutes or less. That ensures the credential will not expire as it is passed +around backend services.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var requiresRefresh: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/Authenticator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/Authenticator.html new file mode 100644 index 00000000..1d731433 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/Authenticator.html @@ -0,0 +1,929 @@ + + + + Authenticator Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Authenticator

+
+
+ +
public protocol Authenticator : AnyObject
+ +
+
+

Types adopting the Authenticator protocol can be used to authenticate URLRequests with an +AuthenticationCredential as well as refresh the AuthenticationCredential when required.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Credential + +
    +
    +
    +
    +
    +
    +

    The type of credential associated with the Authenticator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype Credential : AuthenticationCredential
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(_:to:) + +
    +
    +
    +
    +
    +
    +

    Applies the Credential to the URLRequest.

    + +

    In the case of OAuth2, the access token of the Credential would be added to the URLRequest as a Bearer +token to the Authorization header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func apply(_ credential: Credential, to urlRequest: inout URLRequest)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + credential + + +
    +

    The Credential.

    +
    +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Refreshes the Credential and executes the completion closure with the Result once complete.

    + +

    Refresh can be called in one of two ways. It can be called before the Request is actually executed due to +a requiresRefresh returning true during the adapt portion of the Request creation process. It can also +be triggered by a failed Request where the authentication server denied access due to an expired or +invalidated access token.

    + +

    In the case of OAuth2, this method would use the refresh token of the Credential to generate a new +Credential using the authentication service. Once complete, the completion closure should be called with +the new Credential, or the error that occurred.

    + +

    In general, if the refresh call fails with certain status codes from the authentication server (commonly a 401), +the refresh token in the Credential can no longer be used to generate a valid Credential. In these cases, +you will need to reauthenticate the user with their username / password.

    + +

    Please note, these are just general examples of common use cases. They are not meant to solve your specific +authentication server challenges. Please work with your authentication server team to ensure your +Authenticator logic matches their expectations.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func refresh(_ credential: Credential, for session: Session, completion: @escaping (Result<Credential, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + credential + + +
    +

    The Credential to refresh.

    +
    +
    + + session + + +
    +

    The Session requiring the refresh.

    +
    +
    + + completion + + +
    +

    The closure to be executed once the refresh is complete.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether the URLRequest failed due to an authentication error based on the HTTPURLResponse.

    + +

    If the authentication server CANNOT invalidate credentials after they are issued, then simply return false +for this method. If the authentication server CAN invalidate credentials due to security breaches, then you +will need to work with your authentication server team to understand how to identify when this occurs.

    + +

    In the case of OAuth2, where an authentication server can invalidate credentials, you will need to inspect the +HTTPURLResponse or possibly the Error for when this occurs. This is commonly handled by the authentication +server returning a 401 status code and some additional header to indicate an OAuth2 failure occurred.

    + +

    It is very important to understand how your authentication server works to be able to implement this correctly. +For example, if your authentication server returns a 401 when an OAuth2 error occurs, and your downstream +service also returns a 401 when you are not authorized to perform that operation, how do you know which layer +of the backend returned you a 401? You do not want to trigger a refresh unless you know your authentication +server is actually the layer rejecting the request. Again, work with your authentication server team to understand +how to identify an OAuth2 401 error vs. a downstream 401 error to avoid endless refresh loops.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didRequest(_ urlRequest: URLRequest, with response: HTTPURLResponse, failDueToAuthenticationError error: Error) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse.

    +
    +
    + + error + + +
    +

    The Error.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the URLRequest failed due to an authentication error, false otherwise.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines whether the URLRequest is authenticated with the Credential.

    + +

    If the authentication server CANNOT invalidate credentials after they are issued, then simply return true +for this method. If the authentication server CAN invalidate credentials due to security breaches, then +read on.

    + +

    When an authentication server can invalidate credentials, it means that you may have a non-expired credential +that appears to be valid, but will be rejected by the authentication server when used. Generally when this +happens, a number of requests are all sent when the application is foregrounded, and all of them will be +rejected by the authentication server in the order they are received. The first failed request will trigger a +refresh internally, which will update the credential, and then retry all the queued requests with the new +credential. However, it is possible that some of the original requests will not return from the authentication +server until the refresh has completed. This is where this method comes in.

    + +

    When the authentication server rejects a credential, we need to check to make sure we haven’t refreshed the +credential while the request was in flight. If it has already refreshed, then we don’t need to trigger an +additional refresh. If it hasn’t refreshed, then we need to refresh.

    + +

    Now that it is understood how the result of this method is used in the refresh lifecyle, let’s walk through how +to implement it. You should return true in this method if the URLRequest is authenticated in a way that +matches the values in the Credential. In the case of OAuth2, this would mean that the Bearer token in the +Authorization header of the URLRequest matches the access token in the Credential. If it matches, then we +know the Credential was used to authenticate the URLRequest and should return true. If the Bearer token +did not match the access token, then you should return false.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func isRequest(_ urlRequest: URLRequest, authenticatedWith credential: Credential) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest.

    +
    +
    + + credential + + +
    +

    The Credential.

    +
    +
    +
    +
    +

    Return Value

    +

    true if the URLRequest is authenticated with the Credential, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/CachedResponseHandler.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/CachedResponseHandler.html new file mode 100644 index 00000000..b1d1b943 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/CachedResponseHandler.html @@ -0,0 +1,785 @@ + + + + CachedResponseHandler Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

CachedResponseHandler

+
+
+ +
public protocol CachedResponseHandler
+ +
+
+

A type that handles whether the data task should store the HTTP response in the cache.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether the HTTP response should be stored in the cache.

    + +

    The completion closure should be passed one of three possible options:

    + +
      +
    1. The cached response provided by the server (this is the most common use case).
    2. +
    3. A modified version of the cached response (you may want to modify it in some way before caching).
    4. +
    5. A nil value to prevent the cached response from being stored in the cache.
    6. +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func dataTask(_ task: URLSessionDataTask,
    +              willCacheResponse response: CachedURLResponse,
    +              completion: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + task + + +
    +

    The data task whose request resulted in the cached response.

    +
    +
    + + response + + +
    +

    The cached response to potentially store in the cache.

    +
    +
    + + completion + + +
    +

    The closure to execute containing cached response, a modified response, or nil.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == ResponseCacher +

+
+
+
    +
  • +
    + + + + cache + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a ResponseCacher which caches the response, if allowed. Equivalent to ResponseCacher.cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var cache: ResponseCacher { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a ResponseCacher which does not cache the response. Equivalent to ResponseCacher.doNotCache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var doNotCache: ResponseCacher { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a ResponseCacher which modifies the proposed CachedURLResponse using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func modify(using closure: @escaping ((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)) -> ResponseCacher
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    Closure used to modify the CachedURLResponse.

    +
    +
    +
    +
    +

    Return Value

    +

    The ResponseCacher.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataDecoder.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataDecoder.html new file mode 100644 index 00000000..4dc9c1c5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataDecoder.html @@ -0,0 +1,646 @@ + + + + DataDecoder Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataDecoder

+
+
+ +
public protocol DataDecoder
+ +
+
+

Any type which can decode Data into a Decodable type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + decode(_:from:) + +
    +
    +
    +
    +
    +
    +

    Decode Data into the provided type.

    +
    +

    Throws

    +

    Any error that occurs during decode.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func decode<D>(_ type: D.Type, from data: Data) throws -> D where D : Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    The Type to be decoded.

    +
    +
    + + data + + +
    +

    The Data to be decoded.

    +
    +
    +
    +
    +

    Return Value

    +

    The decoded value of type D.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataPreprocessor.html new file mode 100644 index 00000000..3f4df571 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataPreprocessor.html @@ -0,0 +1,711 @@ + + + + DataPreprocessor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataPreprocessor

+
+
+ +
public protocol DataPreprocessor
+ +
+
+

Type used to preprocess Data before it handled by a serializer.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    +

    Process Data before it’s handled by a serializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + data + + +
    +

    The raw Data to process.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PassthroughPreprocessor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == GoogleXSSIPreprocessor +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataResponseSerializerProtocol.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataResponseSerializerProtocol.html new file mode 100644 index 00000000..fcb983b8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataResponseSerializerProtocol.html @@ -0,0 +1,697 @@ + + + + DataResponseSerializerProtocol Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponseSerializerProtocol

+
+
+ +
public protocol DataResponseSerializerProtocol
+ +
+
+

The type to which all data response serializers must conform in order to serialize a response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    The type of serialized object to be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Serialize the response Data into the provided type..

    +
    +

    Throws

    +

    Any Error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serialize(request: URLRequest?, response: HTTPURLResponse?, data: Data?, error: Error?) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest which was used to perform the request, if any.

    +
    +
    + + response + + +
    +

    HTTPURLResponse received from the server, if any.

    +
    +
    + + data + + +
    +

    Data returned from the server, if any.

    +
    +
    + + error + + +
    +

    Error produced by Alamofire or the underlying URLSession during the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The SerializedObject.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataStreamSerializer.html new file mode 100644 index 00000000..a25aa9b8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DataStreamSerializer.html @@ -0,0 +1,832 @@ + + + + DataStreamSerializer Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamSerializer

+
+
+ +
public protocol DataStreamSerializer
+ +
+
+

A type which can serialize incoming Data.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    Type produced from the serialized Data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    +

    Serializes incoming Data into a SerializedObject value.

    +
    +

    Throws

    +

    Any error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serialize(_ data: Data) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + data + + +
    +

    Data to be serialized.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ + +
+ +

Available where Self == PassthroughStreamSerializer +

+
+
+ +
+
+
+ + +
+ +

Available where Self == StringStreamSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DownloadResponseSerializerProtocol.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DownloadResponseSerializerProtocol.html new file mode 100644 index 00000000..c5682038 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/DownloadResponseSerializerProtocol.html @@ -0,0 +1,740 @@ + + + + DownloadResponseSerializerProtocol Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponseSerializerProtocol

+
+
+ +
public protocol DownloadResponseSerializerProtocol
+ +
+
+

The type to which all download response serializers must conform in order to serialize a response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + SerializedObject + +
    +
    +
    +
    +
    +
    +

    The type of serialized object to be created.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    associatedtype SerializedObject
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Serialize the downloaded response Data from disk into the provided type..

    +
    +

    Throws

    +

    Any Error produced during serialization.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func serializeDownload(request: URLRequest?, response: HTTPURLResponse?, fileURL: URL?, error: Error?) throws -> SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest which was used to perform the request, if any.

    +
    +
    + + response + + +
    +

    HTTPURLResponse received from the server, if any.

    +
    +
    + + fileURL + + +
    +

    File URL to which the response data was downloaded.

    +
    +
    + + error + + +
    +

    Error produced by Alamofire or the underlying URLSession during the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The SerializedObject.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == URLResponseSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EmptyResponse.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EmptyResponse.html new file mode 100644 index 00000000..ba91d543 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EmptyResponse.html @@ -0,0 +1,610 @@ + + + + EmptyResponse Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

EmptyResponse

+
+
+ +
public protocol EmptyResponse
+ +
+
+

Protocol representing an empty response. Use T.emptyValue() to get an instance.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + emptyValue() + +
    +
    +
    +
    +
    +
    +

    Empty value for the conforming type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    static func emptyValue() -> Self
    + +
    +
    +
    +

    Return Value

    +

    Value of Self to use for empty values.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EventMonitor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EventMonitor.html new file mode 100644 index 00000000..b687d19d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/EventMonitor.html @@ -0,0 +1,2317 @@ + + + + EventMonitor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

EventMonitor

+
+
+ +
public protocol EventMonitor
+ +
+
+

Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various +URLSession delegate protocols as well as various events from the lifetime of Request and its subclasses.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + queue + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    The DispatchQueue onto which Alamofire’s root CompositeEventMonitor will dispatch events. .main by default.

    + +
    +

    Default Implementation

    +
    +

    The default queue on which CompositeEventMonitors will call the EventMonitor methods. .main by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var queue: DispatchQueue { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:didBecomeInvalidWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDelegate‘s urlSession(_:didBecomeInvalidWithError:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionTaskDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:task:didReceive:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didReceive:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                task: URLSessionTask,
    +                didSendBodyData bytesSent: Int64,
    +                totalBytesSent: Int64,
    +                totalBytesExpectedToSend: Int64)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:taskNeedsNewBodyStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:needNewBodyStream:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, taskNeedsNewBodyStream task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:willPerformHTTPRedirection:newRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                task: URLSessionTask,
    +                willPerformHTTPRedirection response: HTTPURLResponse,
    +                newRequest request: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:didFinishCollecting:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didFinishCollecting:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:task:didCompleteWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:task:didCompleteWithError:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:taskIsWaitingForConnectivity:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionTaskDelegate‘s urlSession(_:taskIsWaitingForConnectivity:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDataDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:dataTask:didReceive:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:) method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:dataTask:willCacheResponse:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:willCacheResponse:completionHandler:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

URLSessionDownloadDelegate Events +

+
+
+
    +
  • +
    + + + + urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                downloadTask: URLSessionDownloadTask,
    +                didResumeAtOffset fileOffset: Int64,
    +                expectedTotalBytes: Int64)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession,
    +                downloadTask: URLSessionDownloadTask,
    +                didWriteData bytesWritten: Int64,
    +                totalBytesWritten: Int64,
    +                totalBytesExpectedToWrite: Int64)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + urlSession(_:downloadTask:didFinishDownloadingTo:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didFinishDownloadingTo:) method.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Request Events +

+
+
+
    +
  • +
    + + + + request(_:didCreateInitialURLRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a URLRequest is first created for a Request. If a RequestAdapter is active, the +URLRequest will be adapted before being issued.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateInitialURLRequest urlRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToCreateURLRequestWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when the attempt to create a URLRequest from a Request‘s original URLRequestConvertible value fails.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailToCreateURLRequestWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didAdaptInitialRequest:to:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a RequestAdapter adapts the Request‘s initial URLRequest.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didAdaptInitialRequest initialRequest: URLRequest, to adaptedRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToAdaptURLRequest:withError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a RequestAdapter fails to adapt the Request‘s initial URLRequest.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailToAdaptURLRequest initialRequest: URLRequest, withError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCreateURLRequest:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a final URLRequest is created for a Request.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateURLRequest urlRequest: URLRequest)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCreateTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a URLSessionTask subclass instance is created for a Request.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCreateTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didGatherMetrics:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a URLSessionTaskMetrics value.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didGatherMetrics metrics: URLSessionTaskMetrics)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailTask:earlyWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request fails due to an error created by Alamofire. e.g. When certificate pinning fails.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didFailTask task: URLSessionTask, earlyWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCompleteTask:with:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s task completes, possibly with an error. A Request may receive this event +multiple times if it is retried.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestIsRetrying(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request is about to be retried.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestIsRetrying(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidFinish(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request finishes and response serializers are being called.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidFinish(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidResume(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a resume call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidResume(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didResumeTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is resumed.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didResumeTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidSuspend(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a suspend call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidSuspend(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didSuspendTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is suspended.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didSuspendTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestDidCancel(_:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request receives a cancel call.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func requestDidCancel(_ request: Request)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didCancelTask:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a Request‘s associated URLSessionTask is cancelled.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: Request, didCancelTask task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataRequest Events +

+
+
+ +
+
+
+ + +
+ +

DataStreamRequest Events +

+
+
+
    +
  • +
    + + + + request(_:didValidateRequest:response:withResult:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a DataStreamRequest calls a Validation closure.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: DataStreamRequest,
    +             didValidateRequest urlRequest: URLRequest?,
    +             response: HTTPURLResponse,
    +             withResult result: Request.ValidationResult)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest which is calling the Validation.

    +
    +
    + + urlRequest + + +
    +

    URLRequest of the request being validated.

    +
    +
    + + response + + +
    +

    HTTPURLResponse of the request being validated.

    +
    +
    + + result + + +
    +

    Produced ValidationResult.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didParseStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when a DataStreamSerializer produces a value from streamed Data.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request<Value>(_ request: DataStreamRequest, didParseStream result: Result<Value, AFError>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest for which the value was serialized.

    +
    +
    + + result + + +
    +

    Result of the serialization attempt.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

UploadRequest Events +

+
+
+
    +
  • +
    + + + + request(_:didCreateUploadable:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest creates its Uploadable value, indicating the type of upload it represents.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didCreateUploadable uploadable: UploadRequest.Uploadable)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didFailToCreateUploadableWithError:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest failed to create its Uploadable value due to an error.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didFailToCreateUploadableWithError error: AFError)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(_:didProvideInputStream:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Event called when an UploadRequest provides the InputStream from its Uploadable value. This only occurs if +the InputStream does not wrap a Data value or file URL.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(_ request: UploadRequest, didProvideInputStream stream: InputStream)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadRequest Events +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoder.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoder.html new file mode 100644 index 00000000..d529a06c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoder.html @@ -0,0 +1,852 @@ + + + + ParameterEncoder Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoder

+
+
+ +
public protocol ParameterEncoder
+ +
+
+

A type that can encode any Encodable type into a URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + encode(_:into:) + +
    +
    +
    +
    +
    +
    +

    Encode the provided Encodable parameters into request.

    +
    +

    Throws

    +

    An Error when encoding fails. For Alamofire provided encoders, this will be an instance of + AFError.parameterEncoderFailed with an associated ParameterEncoderFailureReason.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func encode<Parameters>(_ parameters: Parameters?, into request: URLRequest) throws -> URLRequest where Parameters : Encodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + parameters + + +
    +

    The Encodable parameter value.

    +
    +
    + + request + + +
    +

    The URLRequest into which to encode the parameters.

    +
    +
    +
    +
    +

    Return Value

    +

    A URLRequest with the result of the encoding.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == JSONParameterEncoder +

+
+
+
    +
  • +
    + + + + json + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default JSONParameterEncoder instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var json: JSONParameterEncoder { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + json(encoder:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a JSONParameterEncoder using the provided JSONEncoder.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func json(encoder: JSONEncoder = JSONEncoder()) -> JSONParameterEncoder
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + encoder + + +
    +

    JSONEncoder used to encode parameters. JSONEncoder() by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The JSONParameterEncoder.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == URLEncodedFormParameterEncoder +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoding.html new file mode 100644 index 00000000..72bde21d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ParameterEncoding.html @@ -0,0 +1,646 @@ + + + + ParameterEncoding Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ParameterEncoding

+
+
+ +
public protocol ParameterEncoding
+ +
+
+

A type used to define how a set of parameters are applied to a URLRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    +

    Creates a URLRequest by encoding parameters and applying them on the passed request.

    +
    +

    Throws

    +

    Any Error produced during parameter encoding.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    URLRequestConvertible value onto which parameters will be encoded.

    +
    +
    + + parameters + + +
    +

    Parameters to encode onto the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded URLRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RedirectHandler.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RedirectHandler.html new file mode 100644 index 00000000..23edc8a4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RedirectHandler.html @@ -0,0 +1,798 @@ + + + + RedirectHandler Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RedirectHandler

+
+
+ +
public protocol RedirectHandler
+ +
+
+

A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines how the HTTP redirect response should be redirected to the new request.

    + +

    The completion closure should be passed one of three possible options:

    + +
      +
    1. The new request specified by the redirect (this is the most common use case).
    2. +
    3. A modified version of the new request (you may want to route it somewhere else).
    4. +
    5. A nil value to deny the redirect request and return the body of the redirect response.
    6. +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func task(_ task: URLSessionTask,
    +          willBeRedirectedTo request: URLRequest,
    +          for response: HTTPURLResponse,
    +          completion: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + task + + +
    +

    The URLSessionTask whose request resulted in a redirect.

    +
    +
    + + request + + +
    +

    The URLRequest to the new location specified by the redirect response.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse containing the server’s response to the original request.

    +
    +
    + + completion + + +
    +

    The closure to execute containing the new URLRequest, a modified URLRequest, or nil.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Redirector +

+
+
+
    +
  • +
    + + + + follow + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a Redirector which follows redirects. Equivalent to Redirector.follow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var follow: Redirector { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a Redirector which does not follow redirects. Equivalent to Redirector.doNotFollow.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var doNotFollow: Redirector { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a Redirector which modifies the redirected URLRequest using the provided closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func modify(using closure: @escaping (URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) -> Redirector
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    Closure used to modify the redirect.

    +
    +
    +
    +
    +

    Return Value

    +

    The Redirector.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestAdapter.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestAdapter.html new file mode 100644 index 00000000..773a0fbb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestAdapter.html @@ -0,0 +1,792 @@ + + + + RequestAdapter Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestAdapter

+
+
+ +
public protocol RequestAdapter
+ +
+
+

A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest to adapt.

    +
    +
    + + session + + +
    +

    The Session that will execute the URLRequest.

    +
    +
    + + completion + + +
    +

    The completion handler that must be called when adaptation is complete.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + adapt(_:using:completion:) + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func adapt(_ urlRequest: URLRequest, using state: RequestAdapterState, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + urlRequest + + +
    +

    The URLRequest to adapt.

    +
    +
    + + state + + +
    +

    The RequestAdapterState associated with the URLRequest.

    +
    +
    + + completion + + +
    +

    The completion handler that must be called when adaptation is complete.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Adapter +

+
+
+
    +
  • +
    + + + + adapter(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates an Adapter using the provided AdaptHandler closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func adapter(using closure: @escaping AdaptHandler) -> Adapter
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    AdaptHandler to use to adapt the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The Adapter.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestDelegate.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestDelegate.html new file mode 100644 index 00000000..ee59d785 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestDelegate.html @@ -0,0 +1,807 @@ + + + + RequestDelegate Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestDelegate

+
+
+ +
public protocol RequestDelegate : AnyObject
+ +
+
+

Protocol abstraction for Request‘s communication back to the SessionDelegate.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + sessionConfiguration + +
    +
    +
    +
    +
    +
    +

    URLSessionConfiguration used to create the underlying URLSessionTasks.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var sessionConfiguration: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startImmediately + +
    +
    +
    +
    +
    +
    +

    Determines whether the Request should automatically call resume() when adding the first response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var startImmediately: Bool { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cleanup(after:) + +
    +
    +
    +
    +
    +
    +

    Notifies the delegate the Request has reached a point where it needs cleanup.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cleanup(after request: Request)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + request + + +
    +

    The Request to cleanup after.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Asynchronously ask the delegate whether a Request will be retried.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retryResult(for request: Request, dueTo error: AFError, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    Request which failed.

    +
    +
    + + error + + +
    +

    Error which produced the failure.

    +
    +
    + + completion + + +
    +

    Closure taking the RetryResult for evaluation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Asynchronously retry the Request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retryRequest(_ request: Request, withDelay timeDelay: TimeInterval?)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    Request which will be retried.

    +
    +
    + + timeDelay + + +
    +

    TimeInterval after which the retry will be triggered.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestInterceptor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestInterceptor.html new file mode 100644 index 00000000..b94a25c6 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestInterceptor.html @@ -0,0 +1,1277 @@ + + + + RequestInterceptor Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestInterceptor

+
+
+ +
public protocol RequestInterceptor : RequestAdapter, RequestRetrier
+ +
+
+

Type that provides both RequestAdapter and RequestRetrier functionality.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + adapt(_:for:completion:) + + + Extension method + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + retry(_:for:dueTo:completion:) + + + Extension method + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func retry(_ request: Request,
    +                  for session: Session,
    +                  dueTo error: Error,
    +                  completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == DeflateRequestCompressor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == Interceptor +

+
+
+ +
+
+
+ + +
+ +

Available where Self == RetryPolicy +

+
+
+ +
+
+
+ + +
+ +

Available where Self == ConnectionLostRetryPolicy +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestRetrier.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestRetrier.html new file mode 100644 index 00000000..194fd5fe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/RequestRetrier.html @@ -0,0 +1,732 @@ + + + + RequestRetrier Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestRetrier

+
+
+ +
public protocol RequestRetrier
+ +
+
+

A type that determines whether a request should be retried after being executed by the specified session manager +and encountering an error.

+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Determines whether the Request should be retried by calling the completion closure.

    + +

    This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs +to be retried. The one requirement is that the completion closure is called to ensure the request is properly +cleaned up after.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    Request that failed due to the provided Error.

    +
    +
    + + session + + +
    +

    Session that produced the Request.

    +
    +
    + + error + + +
    +

    Error encountered while executing the Request.

    +
    +
    + + completion + + +
    +

    Completion closure to be executed when a retry decision has been determined.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == Retrier +

+
+
+
    +
  • +
    + + + + retrier(using:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a Retrier using the provided RetryHandler closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func retrier(using closure: @escaping RetryHandler) -> Retrier
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + closure + + +
    +

    RetryHandler to use to retry the request.

    +
    +
    +
    +
    +

    Return Value

    +

    The Retrier.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ResponseSerializer.html new file mode 100644 index 00000000..410e83b2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ResponseSerializer.html @@ -0,0 +1,1331 @@ + + + + ResponseSerializer Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseSerializer

+
+
+ +
public protocol ResponseSerializer : DataResponseSerializerProtocol, DownloadResponseSerializerProtocol
+ +
+
+

A serializer that can handle both data and download responses.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + dataPreprocessor + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    DataPreprocessor used to prepare incoming Data for serialization.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var dataPreprocessor: DataPreprocessor { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyRequestMethods + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    HTTPMethods for which empty response bodies are considered appropriate.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var emptyRequestMethods: Set<HTTPMethod> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseCodes + + + Default implementation + +
    +
    +
    +
    +
    +
    +

    HTTP response codes for which empty response bodies are considered appropriate.

    + +
    +

    Default Implementation

    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var emptyResponseCodes: Set<Int> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+
    +
  • +
    + + + + defaultDataPreprocessor + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Default DataPreprocessor. PassthroughPreprocessor by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultDataPreprocessor: DataPreprocessor { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEmptyRequestMethods + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Default HTTPMethods for which empty response bodies are considered appropriate. [.head] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultEmptyRequestMethods: Set<HTTPMethod> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultEmptyResponseCodes + + + Extension method + +
    +
    +
    +
    +
    +
    +

    HTTP response codes for which empty response bodies are considered appropriate. [204, 205] by default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var defaultEmptyResponseCodes: Set<Int> { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + requestAllowsEmptyResponseData(_:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether the request allows empty response bodies, if request exists.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func requestAllowsEmptyResponseData(_ request: URLRequest?) -> Bool?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + request + + +
    +

    URLRequest to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool representing the outcome of the evaluation, or nil if request was nil.

    +
    +
    +
    +
  • +
  • +
    + + + + responseAllowsEmptyResponseData(_:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether the response allows empty response bodies, if response exists`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func responseAllowsEmptyResponseData(_ response: HTTPURLResponse?) -> Bool?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + response + + +
    +

    HTTPURLResponse to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    Bool representing the outcome of the evaluation, or nil if response was nil.

    +
    +
    +
    +
  • +
  • +
    + + + + emptyResponseAllowed(forRequest:response:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Determines whether request and response allow empty response bodies.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func emptyResponseAllowed(forRequest request: URLRequest?, response: HTTPURLResponse?) -> Bool
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + request + + +
    +

    URLRequest to evaluate.

    +
    +
    + + response + + +
    +

    HTTPURLResponse to evaluate.

    +
    +
    +
    +
    +

    Return Value

    +

    true if request or response allow empty bodies, false otherwise.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Decodable +

+
+
+ +
+
+
+ + +
+ +

Available where Self == DataResponseSerializer +

+
+
+ +
+
+
+ + +
+ +

Available where Self == StringResponseSerializer +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ServerTrustEvaluating.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ServerTrustEvaluating.html new file mode 100644 index 00000000..942d0277 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/ServerTrustEvaluating.html @@ -0,0 +1,1100 @@ + + + + ServerTrustEvaluating Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ServerTrustEvaluating

+
+
+ +
public protocol ServerTrustEvaluating
+ +
+
+

A protocol describing the API used to evaluate server trusts.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + evaluate(_:forHost:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given SecTrust value for the given host.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func evaluate(_ trust: SecTrust, forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + trust + + +
    +

    The SecTrust value to evaluate.

    +
    +
    + + host + + +
    +

    The host for which to evaluate the SecTrust value.

    +
    +
    +
    +
    +

    Return Value

    +

    A Bool indicating whether the evaluator considers the SecTrust value valid for host.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == RevocationTrustEvaluator +

+
+
+
    +
  • +
    + + + + revocationChecking + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default RevocationTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var revocationChecking: RevocationTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a RevocationTrustEvaluator using the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func revocationChecking(performDefaultValidation: Bool = true,
    +                                      validateHost: Bool = true,
    +                                      options: RevocationTrustEvaluator.Options = .any) -> RevocationTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    + + options + + +
    +

    The Options to use to check the revocation status of the certificate. .any + by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The RevocationTrustEvaluator.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PinnedCertificatesTrustEvaluator +

+
+
+
    +
  • +
    + + + + pinnedCertificates + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default PinnedCertificatesTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var pinnedCertificates: PinnedCertificatesTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a PinnedCertificatesTrustEvaluator using the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func pinnedCertificates(certificates: [SecCertificate] = Bundle.main.af.certificates,
    +                                      acceptSelfSignedCertificates: Bool = false,
    +                                      performDefaultValidation: Bool = true,
    +                                      validateHost: Bool = true) -> PinnedCertificatesTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + certificates + + +
    +

    The certificates to use to evaluate the trust. All cer, crt, and der + certificates in Bundle.main by default.

    +
    +
    + + acceptSelfSignedCertificates + + +
    +

    Adds the provided certificates as anchors for the trust evaluation, allowing + self-signed certificates to pass. false by default. THIS SETTING SHOULD BE + FALSE IN PRODUCTION!

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition + to performing the default evaluation, even if performDefaultValidation is + false. true by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == PublicKeysTrustEvaluator +

+
+
+
    +
  • +
    + + + + publicKeys + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Provides a default PublicKeysTrustEvaluator instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var publicKeys: PublicKeysTrustEvaluator { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys(keys:performDefaultValidation:validateHost:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a PublicKeysTrustEvaluator from the provided parameters.

    +
    +

    Note

    +

    Default and host validation will fail when using this evaluator with self-signed certificates. Use + PinnedCertificatesTrustEvaluator if you need to use self-signed certificates.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func publicKeys(keys: [SecKey] = Bundle.main.af.publicKeys,
    +                              performDefaultValidation: Bool = true,
    +                              validateHost: Bool = true) -> PublicKeysTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + keys + + +
    +

    The SecKeys to use to validate public keys. Defaults to the public keys of all + certificates included in the main bundle.

    +
    +
    + + performDefaultValidation + + +
    +

    Determines whether default validation should be performed in addition to + evaluating the pinned certificates. true by default.

    +
    +
    + + validateHost + + +
    +

    Determines whether or not the evaluator should validate the host, in addition to + performing the default evaluation, even if performDefaultValidation is false. + true by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Self == CompositeTrustEvaluator +

+
+
+
    +
  • +
    + + + + composite(evaluators:) + + + Extension method + +
    +
    +
    +
    +
    +
    +

    Creates a CompositeTrustEvaluator from the provided evaluators.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func composite(evaluators: [ServerTrustEvaluating]) -> CompositeTrustEvaluator
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + evaluators + + +
    +

    The ServerTrustEvaluating values used to evaluate the server trust.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/SessionStateProvider.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/SessionStateProvider.html new file mode 100644 index 00000000..695f1817 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/SessionStateProvider.html @@ -0,0 +1,630 @@ + + + + SessionStateProvider Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire Docs + + (75% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

SessionStateProvider

+
+
+
public protocol SessionStateProvider : AnyObject
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + serverTrustManager + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var serverTrustManager: ServerTrustManager? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + redirectHandler + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var redirectHandler: RedirectHandler? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cachedResponseHandler + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var cachedResponseHandler: CachedResponseHandler? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + request(for:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func request(for task: URLSessionTask) -> Request?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didCompleteTask(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didCompleteTask(_ task: URLSessionTask)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + credential(for:in:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func credential(for task: URLSessionTask, in protectionSpace: URLProtectionSpace) -> URLCredential?
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func cancelRequestsForSessionInvalidation(with error: Error?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLConvertible.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLConvertible.html new file mode 100644 index 00000000..13d224ea --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLConvertible.html @@ -0,0 +1,616 @@ + + + + URLConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLConvertible

+
+
+ +
public protocol URLConvertible
+ +
+
+

Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct +URLRequests.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURL() + +
    +
    +
    +
    +
    +
    +

    Returns a URL from the conforming instance or throws.

    +
    +

    Throws

    + Any error thrown while creating the URL. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func asURL() throws -> URL
    + +
    +
    +
    +

    Return Value

    +

    The URL created from the instance.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLRequestConvertible.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLRequestConvertible.html new file mode 100644 index 00000000..67119b80 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/URLRequestConvertible.html @@ -0,0 +1,645 @@ + + + + URLRequestConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLRequestConvertible

+
+
+ +
public protocol URLRequestConvertible
+ +
+
+

Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + asURLRequest() + +
    +
    +
    +
    +
    +
    +

    Returns a URLRequest or throws if an Error was encountered.

    +
    +

    Throws

    + Any error thrown while constructing the URLRequest. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func asURLRequest() throws -> URLRequest
    + +
    +
    +
    +

    Return Value

    +

    A URLRequest.

    +
    +
    +
    +
  • +
  • +
    + + + + urlRequest + + + Extension method + +
    +
    +
    +
    +
    +
    +

    The URLRequest returned by discarding any Error encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var urlRequest: URLRequest? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/UploadableConvertible.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/UploadableConvertible.html new file mode 100644 index 00000000..6c14c45c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Protocols/UploadableConvertible.html @@ -0,0 +1,615 @@ + + + + UploadableConvertible Protocol Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ + +
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 00000000..878246fb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,1468 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+ +
+
+
+ + +
+ +

DataRequest / UploadRequest +

+
+
+
    +
  • +
    + + + + DataResponsePublisher + +
    +
    +
    +
    +
    +
    +

    A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public struct DataResponsePublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataStreamPublisher + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataStreamPublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public struct DownloadResponsePublisher<Value> : Publisher
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataTask +

+
+
+
    +
  • +
    + + + + DataTask + +
    +
    +
    +
    +
    +
    +

    Value used to await a DataResponse and associated values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DataTask<Value>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DownloadTask +

+
+
+
    +
  • +
    + + + + DownloadTask + +
    +
    +
    +
    +
    +
    +

    Value used to await a DownloadResponse and associated values.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DownloadTask<Value>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamTask +

+
+
+
    +
  • +
    + + + + DataStreamTask + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataStreamTask
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + StreamOf + +
    +
    +
    +
    +
    +
    +

    An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct StreamOf<Element> : AsyncSequence
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + HTTPHeaders + +
    +
    +
    +
    +
    +
    +

    An order-preserving and case-insensitive representation of HTTP headers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPHeaders
    +
    extension HTTPHeaders: ExpressibleByDictionaryLiteral
    +
    extension HTTPHeaders: ExpressibleByArrayLiteral
    +
    extension HTTPHeaders: Sequence
    +
    extension HTTPHeaders: Collection
    +
    extension HTTPHeaders: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPHeader +

+
+
+
    +
  • +
    + + + + HTTPHeader + +
    +
    +
    +
    +
    +
    +

    A representation of a single HTTP header’s name / value pair.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPHeader : Hashable
    +
    extension HTTPHeader: CustomStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + HTTPMethod + +
    +
    +
    +
    +
    +
    +

    Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so +HTTPMethod.get != HTTPMethod(rawValue: "get").

    + +

    See https://tools.ietf.org/html/rfc7231#section-4.3

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct HTTPMethod : RawRepresentable, Equatable, Hashable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + URLEncoding + +
    +
    +
    +
    +
    +
    +

    Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +the HTTP body depends on the destination of the encoding.

    + +

    The Content-Type HTTP header field of an encoded request with HTTP body is set to +application/x-www-form-urlencoded; charset=utf-8.

    + +

    There is no published specification for how to encode collection types. By default the convention of appending +[] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for +nested dictionary values (foo[bar]=baz) is used. Optionally, ArrayEncoding can be used to omit the +square brackets appended to array keys.

    + +

    BoolEncoding can be used to configure how boolean values are encoded. The default behavior is to encode +true as 1 and false as 0.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct URLEncoding : ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + JSONEncoding + +
    +
    +
    +
    +
    +
    +

    Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the +request. The Content-Type HTTP header field of an encoded request is set to application/json.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct JSONEncoding : ParameterEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Redirector + +
    +
    +
    +
    +
    +
    +

    Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Redirector
    +
    extension Redirector: RedirectHandler
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the +appropriate header.

    +
    +

    Note

    + Most requests to most APIs are small and so would only be slowed down by applying this adapter. Measure the + size of your request bodies and the performance impact of using this adapter before use. Using this adapter + with already compressed data, such as images, will, at best, have no effect. Additionally, body compression + is a synchronous operation, so measuring the performance impact may be important to determine whether you + want to use a dedicated requestQueue in your Session instance. Finally, not all servers support request + compression, so test with all of your server configurations before deploying. + +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
    +public struct DeflateRequestCompressor : RequestInterceptor
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RequestAdapterState + +
    +
    +
    +
    +
    +
    +

    Stores all state associated with a URLRequest being adapted.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct RequestAdapterState
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DataResponse + +
    +
    +
    +
    +
    +
    +

    Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DataResponse<Success, Failure> where Failure : Error
    +
    extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DownloadResponse + +
    +
    +
    +
    +
    +
    +

    Used to store all data associated with a serialized response of a download request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DownloadResponse<Success, Failure> where Failure : Error
    +
    extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Protocols +

+
+
+ +
+
+
+ + +
+ +

URL +

+
+
+ +
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + Empty + +
    +
    +
    +
    +
    +
    +

    Type representing an empty value. Use Empty.value to get the static instance.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Empty : Codable
    +
    extension Empty: EmptyResponse
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

DataStreamRequest +

+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/AlamofireExtension.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/AlamofireExtension.html new file mode 100644 index 00000000..8c8becf2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/AlamofireExtension.html @@ -0,0 +1,1688 @@ + + + + AlamofireExtension Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

AlamofireExtension

+
+
+ +
public struct AlamofireExtension<ExtendedType>
+ +
+
+

Type that acts as a generic extension point for all AlamofireExtended types.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + type + +
    +
    +
    +
    +
    +
    +

    Stores the type or meta-type of any extended type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public private(set) var type: ExtendedType { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Create an instance from the provided value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ type: ExtendedType)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + type + + +
    +

    Instance being extended.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType: Bundle +

+
+
+
    +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    Returns all valid cer, crt, and der certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    Returns all public keys for the valid certificates in the bundle.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns all pathnames for the resources identified by the provided file extensions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func paths(forResourcesOfTypes types: [String]) -> [String]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + types + + +
    +

    The filename extensions locate.

    +
    +
    +
    +
    +

    Return Value

    +

    All pathnames for the given filename extensions.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecTrust +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Evaluates self after applying the SecPolicy value provided.

    +
    +

    Throws

    +

    Any Error from applying the SecPolicy or from evaluation.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)
    +public func evaluate(afterApplying policy: SecPolicy) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + policy + + +
    +

    The SecPolicy to apply to self before evaluation.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Attempts to validate self using the SecPolicy provided and transforming any error produced using the closure passed.

    +
    +

    Throws

    + Any Error from applying the policy, or the result of errorProducer if validation fails. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:﹚")
    +@available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(afterApplying:﹚")
    +@available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(afterApplying:﹚")
    +@available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(afterApplying:﹚")
    +public func validate(policy: SecPolicy, errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + policy + + +
    +

    The SecPolicy used to evaluate self.

    +
    +
    + + errorProducer + + +
    +

    The closure used transform the failed OSStatus and SecTrustResultType.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + apply(policy:) + +
    +
    +
    +
    +
    +
    +

    Applies a SecPolicy to self, throwing if it fails.

    +
    +

    Throws

    +

    An AFError.serverTrustEvaluationFailed instance with a .policyApplicationFailed reason.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func apply(policy: SecPolicy) throws -> SecTrust
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + policy + + +
    +

    The SecPolicy.

    +
    +
    +
    +
    +

    Return Value

    +

    self, with the policy applied.

    +
    +
    +
    +
  • +
  • +
    + + + + evaluate() + +
    +
    +
    +
    +
    +
    +

    Evaluate self, throwing an Error if evaluation fails.

    +
    +

    Throws

    + AFError.serverTrustEvaluationFailed with reason .trustValidationFailed and associated error from + the underlying evaluation. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS 12, macOS 10.14, tvOS 12, watchOS 5, *)
    +public func evaluate() throws
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validate self, passing any failure values through errorProducer.

    +
    +

    Throws

    + The Error produced by the errorProducer closure. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(iOS, introduced: 10, deprecated: 12, renamed: "evaluate(﹚")
    +@available(macOS, introduced: 10.12, deprecated: 10.14, renamed: "evaluate(﹚")
    +@available(tvOS, introduced: 10, deprecated: 12, renamed: "evaluate(﹚")
    +@available(watchOS, introduced: 3, deprecated: 5, renamed: "evaluate(﹚")
    +public func validate(errorProducer: (_ status: OSStatus, _ result: SecTrustResultType) -> Error) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + errorProducer + + +
    +

    The closure used to transform the failed OSStatus and SecTrustResultType into an + Error.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Sets a custom certificate chain on self, allowing full validation of a self-signed certificate and its chain.

    +
    +

    Throws

    + Any error produced when applying the new certificate chain. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func setAnchorCertificates(_ certificates: [SecCertificate]) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + certificates + + +
    +

    The SecCertificates to add to the chain.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    The public keys contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificates + +
    +
    +
    +
    +
    +
    +

    The SecCertificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificates: [SecCertificate] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + certificateData + +
    +
    +
    +
    +
    +
    +

    The Data values for all certificates contained in self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var certificateData: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates self after applying SecPolicy.af.default. This evaluation does not validate the hostname.

    +
    +

    Throws

    + An AFError.serverTrustEvaluationFailed instance with a .defaultEvaluationFailed reason. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func performDefaultValidation(forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The hostname, used only in the error output if validation fails.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Validates self after applying SecPolicy.af.hostname(host), which performs the default validation as well as +hostname validation.

    +
    +

    Throws

    + An AFError.serverTrustEvaluationFailed instance with a .defaultEvaluationFailed reason. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func performValidation(forHost host: String) throws
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + host + + +
    +

    The hostname to use in the validation.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecPolicy +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy instance which will validate server certificates but not require a host name match.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: SecPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + hostname(_:) + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy instance which will validate server certificates and much match the provided hostname.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func hostname(_ hostname: String) -> SecPolicy
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + hostname + + +
    +

    The hostname to validate against.

    +
    +
    +
    +
    +

    Return Value

    +

    The SecPolicy.

    +
    +
    +
    +
  • +
  • +
    + + + + revocation(options:) + +
    +
    +
    +
    +
    +
    +

    Creates a SecPolicy which checks the revocation of certificates.

    +
    +

    Throws

    +

    An AFError.serverTrustEvaluationFailed error with reason .revocationPolicyCreationFailed + if the policy cannot be created.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func revocation(options: RevocationTrustEvaluator.Options) throws -> SecPolicy
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + options + + +
    +

    The RevocationTrustEvaluator.Options for evaluation.

    +
    +
    +
    +
    +

    Return Value

    +

    The SecPolicy.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == [SecCertificate] +

+
+
+
    +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    All Data values for the contained SecCertificates.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var data: [Data] { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + publicKeys + +
    +
    +
    +
    +
    +
    +

    All public SecKey values for the contained SecCertificates.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKeys: [SecKey] { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecCertificate +

+
+
+
    +
  • +
    + + + + publicKey + +
    +
    +
    +
    +
    +
    +

    The public key for self, if it can be extracted.

    +
    +

    Note

    + On 2020 OSes and newer, only RSA and ECDSA keys are supported. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var publicKey: SecKey? { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == OSStatus +

+
+
+
    +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns whether self is errSecSuccess.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType == SecTrustResultType +

+
+
+
    +
  • +
    + + + + isSuccess + +
    +
    +
    +
    +
    +
    +

    Returns whether self is.unspecifiedor.proceed`.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isSuccess: Bool { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where ExtendedType: URLSessionConfiguration +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Alamofire’s default configuration. Same as URLSessionConfiguration.default but adds Alamofire default +Accept-Language, Accept-Encoding, and User-Agent headers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ephemeral + +
    +
    +
    +
    +
    +
    +

    .ephemeral configuration with Alamofire’s default Accept-Language, Accept-Encoding, and User-Agent +headers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var ephemeral: URLSessionConfiguration { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponse.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponse.html new file mode 100644 index 00000000..3cd0fefe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponse.html @@ -0,0 +1,1198 @@ + + + + DataResponse Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponse

+
+
+ +
public struct DataResponse<Success, Failure> where Failure : Error
+
extension DataResponse: CustomStringConvertible, CustomDebugStringConvertible
+ +
+
+

Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The URL request sent to the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    The server’s response to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + data + +
    +
    +
    +
    +
    +
    +

    The data returned by the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let data: Data?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    The final metrics of the response.

    +
    +

    Note

    + Due to FB7624529, collection of URLSessionTaskMetrics on watchOS is currently disabled.` + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationDuration + +
    +
    +
    +
    +
    +
    +

    The time taken to serialize the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationDuration: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: Result<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value of the result if it is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result if it is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DataResponse instance with the specified parameters derived from the response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(request: URLRequest?,
    +            response: HTTPURLResponse?,
    +            data: Data?,
    +            metrics: URLSessionTaskMetrics?,
    +            serializationDuration: TimeInterval,
    +            result: Result<Success, Failure>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    The URLRequest sent to the server.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse from the server.

    +
    +
    + + data + + +
    +

    The Data returned by the server.

    +
    +
    + + metrics + + +
    +

    The URLSessionTaskMetrics of the DataRequest or UploadRequest.

    +
    +
    + + serializationDuration + + +
    +

    The duration taken by serialization.

    +
    +
    + + result + + +
    +

    The Result of response serialization.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes (if available) a summary +of the URLRequest, the request’s headers and body (if decodable as a String below 100KB); the +HTTPURLResponse‘s status code, headers, and body; the duration of the network and serialization actions; and +the Result of serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the result of this DataResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleInt = possibleData.map { $0.count }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DataResponse<NewSuccess, Failure>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse whose result wraps the value returned by the given closure. If this instance’s + result is a failure, returns a response wrapping the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DataResponse is a success, passing the unwrapped result +value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DataResponse<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A success or failure DataResponse depending on the result of the given closure. If this instance’s + result is a failure, returns the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let withMyError = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<NewFailure>(_ transform: (Failure) -> NewFailure) -> DataResponse<Success, NewFailure> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: DataResponse<Data> = ...
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> DataResponse<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DataResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponsePublisher.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponsePublisher.html new file mode 100644 index 00000000..74ec3e39 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataResponsePublisher.html @@ -0,0 +1,905 @@ + + + + DataResponsePublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataResponsePublisher

+
+
+ +
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
+public struct DataResponsePublisher<Value> : Publisher
+ +
+
+

A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DataResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided ResponseSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: ResponseSerializer>(_ request: DataRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    ResponseSerializer used to produce the published DataResponse.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DataResponseSerializerProtocol.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: DataResponseSerializerProtocol>(_ request: DataRequest,
    +                                                        queue: DispatchQueue,
    +                                                        serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    DataResponseSerializerProtocol used to produce the published DataResponse.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DataResponse value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the Result of the DataResponse as a single Value or fail with the AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DataResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Value == Data? +

+
+
+
    +
  • +
    + + + + init(_:queue:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance which publishes a DataResponse<Data?, AFError> value without serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init(_ request: DataRequest, queue: DispatchQueue)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamPublisher.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamPublisher.html new file mode 100644 index 00000000..ae9fb2ae --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamPublisher.html @@ -0,0 +1,792 @@ + + + + DataStreamPublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamPublisher

+
+
+ +
public struct DataStreamPublisher<Value> : Publisher
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DataStreamRequest.Stream<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DataStreamSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: DataStreamSerializer>(_ request: DataStreamRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DataStreamRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the Stream<Value, AFError> values will be published. .main by + default.

    +
    +
    + + serializer + + +
    +

    DataStreamSerializer used to produce the published Stream<Value, AFError> values.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DataStreamRequest.Stream‘s Events.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the streamed values of the DataStreamRequest.Stream as a sequence of Value or fail with the +AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DataStreamRequest.Stream<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamTask.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamTask.html new file mode 100644 index 00000000..a8cf8239 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataStreamTask.html @@ -0,0 +1,969 @@ + + + + DataStreamTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataStreamTask

+
+
+ +
public struct DataStreamTask
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Stream + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stream<Success, Failure> = StreamOf<DataStreamRequest.Stream<Success, Failure>> where Failure : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of Data values from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingData(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<Data, Never>.BufferingPolicy = .unbounded) -> Stream<Data, Never>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of UTF-8 Strings from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingStrings(automaticallyCancelling shouldAutomaticallyCancel: Bool = true, bufferingPolicy: Stream<String, Never>.BufferingPolicy = .unbounded) -> Stream<String, Never>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of Decodable values from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingDecodables<T>(_ type: T.Type = T.self,
    +                                   automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                   bufferingPolicy: Stream<T, AFError>.BufferingPolicy = .unbounded)
    +    -> Stream<T, AFError> where T: Decodable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + type + + +
    +

    Decodable type to be serialized from stream payloads.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a Stream of values using the provided DataStreamSerializer from the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func streamingResponses<Serializer: DataStreamSerializer>(serializedUsing serializer: Serializer,
    +                                                                 automaticallyCancelling shouldAutomaticallyCancel: Bool = true,
    +                                                                 bufferingPolicy: Stream<Serializer.SerializedObject, AFError>.BufferingPolicy = .unbounded)
    +    -> Stream<Serializer.SerializedObject, AFError>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + serializer + + +
    +

    DataStreamSerializer to use to serialize incoming Data.

    +
    +
    + + shouldAutomaticallyCancel + + +
    +

    Bool indicating whether the underlying DataStreamRequest should be canceled + which observation of the stream stops. true by default.

    +
    +
    + + bufferingPolicy + + +
    +

    BufferingPolicy that determines the stream’s buffering behavior..unbounded by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The Stream.

    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DataStreamRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataTask.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataTask.html new file mode 100644 index 00000000..fd60301e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DataTask.html @@ -0,0 +1,751 @@ + + + + DataTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DataTask

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DataTask<Value>
+ +
+
+

Value used to await a DataResponse and associated values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + response + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    DataResponse produced by the DataRequest and its response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: DataResponse<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Result of any response serialization performed for the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Value returned by the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value { get async throws }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DataRequest and Task.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DataRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DataRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DecodableStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DecodableStreamSerializer.html new file mode 100644 index 00000000..7f4b7007 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DecodableStreamSerializer.html @@ -0,0 +1,718 @@ + + + + DecodableStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DecodableStreamSerializer

+
+
+ +
public struct DecodableStreamSerializer<T> : DataStreamSerializer where T : Decodable
+ +
+
+

DataStreamSerializer which uses the provided DataPreprocessor and DataDecoder to serialize the incoming Data.

+ +
+
+ +
+
+
+ +
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor.html new file mode 100644 index 00000000..9872b07b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor.html @@ -0,0 +1,786 @@ + + + + DeflateRequestCompressor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DeflateRequestCompressor

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DeflateRequestCompressor : RequestInterceptor
+ +
+
+

RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the +appropriate header.

+
+

Note

+ Most requests to most APIs are small and so would only be slowed down by applying this adapter. Measure the + size of your request bodies and the performance impact of using this adapter before use. Using this adapter + with already compressed data, such as images, will, at best, have no effect. Additionally, body compression + is a synchronous operation, so measuring the performance impact may be important to determine whether you + want to use a dedicated requestQueue in your Session instance. Finally, not all servers support request + compression, so test with all of your server configurations before deploying. + +
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Type that determines the action taken when the URLRequest already has a Content-Encoding header.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum DuplicateHeaderBehavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DuplicateHeaderError + +
    +
    +
    +
    +
    +
    +

    Error produced when the outgoing URLRequest already has a Content-Encoding header, when the instance has +been configured to produce an error.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct DuplicateHeaderError : Error
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Behavior to use when the outgoing URLRequest already has a Content-Encoding header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let duplicateHeaderBehavior: DuplicateHeaderBehavior
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Closure which determines whether the outgoing body data should be compressed.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let shouldCompressBodyData: (_ bodyData: Data) -> Bool
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance with the provided parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(duplicateHeaderBehavior: DuplicateHeaderBehavior = .error,
    +            shouldCompressBodyData: @escaping (_ bodyData: Data) -> Bool = { _ in true })
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + duplicateHeaderBehavior + + +
    +

    DuplicateHeaderBehavior to use. .error by default.

    +
    +
    + + shouldCompressBodyData + + +
    +

    Closure which determines whether the outgoing body data should be compressed. true by default.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html new file mode 100644 index 00000000..560387dd --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html @@ -0,0 +1,660 @@ + + + + DuplicateHeaderBehavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DuplicateHeaderBehavior

+
+
+ +
public enum DuplicateHeaderBehavior
+ +
+
+

Type that determines the action taken when the URLRequest already has a Content-Encoding header.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Throws a DuplicateHeaderError. The default.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case error
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + replace + +
    +
    +
    +
    +
    +
    +

    Replaces the existing header value with deflate.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case replace
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + skip + +
    +
    +
    +
    +
    +
    +

    Silently skips compression when the header exists.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case skip
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponse.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponse.html new file mode 100644 index 00000000..efbbfefe --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponse.html @@ -0,0 +1,1237 @@ + + + + DownloadResponse Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponse

+
+
+ +
public struct DownloadResponse<Success, Failure> where Failure : Error
+
extension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible
+ +
+
+

Used to store all data associated with a serialized response of a download request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + request + +
    +
    +
    +
    +
    +
    +

    The URL request sent to the server.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let request: URLRequest?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + response + +
    +
    +
    +
    +
    +
    +

    The server’s response to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let response: HTTPURLResponse?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fileURL + +
    +
    +
    +
    +
    +
    +

    The final destination URL of the data returned from the server after it is moved.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let fileURL: URL?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resumeData + +
    +
    +
    +
    +
    +
    +

    The resume data generated if the request was cancelled.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let resumeData: Data?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + metrics + +
    +
    +
    +
    +
    +
    +

    The final metrics of the response.

    +
    +

    Note

    + Due to FB7624529, collection of URLSessionTaskMetrics on watchOS is currently disabled.` + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let metrics: URLSessionTaskMetrics?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serializationDuration + +
    +
    +
    +
    +
    +
    +

    The time taken to serialize the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let serializationDuration: TimeInterval
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + +
    +
    +
    +
    +
    +
    +

    The result of response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let result: Result<Success, Failure>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Returns the associated value of the result if it is a success, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Success? { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + error + +
    +
    +
    +
    +
    +
    +

    Returns the associated error value if the result if it is a failure, nil otherwise.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var error: Failure? { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a DownloadResponse instance with the specified parameters derived from response serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(request: URLRequest?,
    +            response: HTTPURLResponse?,
    +            fileURL: URL?,
    +            resumeData: Data?,
    +            metrics: URLSessionTaskMetrics?,
    +            serializationDuration: TimeInterval,
    +            result: Result<Success, Failure>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + request + + +
    +

    The URLRequest sent to the server.

    +
    +
    + + response + + +
    +

    The HTTPURLResponse from the server.

    +
    +
    + + fileURL + + +
    +

    The final destination URL of the data returned from the server after it is moved.

    +
    +
    + + resumeData + + +
    +

    The resume Data generated if the request was cancelled.

    +
    +
    + + metrics + + +
    +

    The URLSessionTaskMetrics of the DownloadRequest.

    +
    +
    + + serializationDuration + + +
    +

    The duration taken by serialization.

    +
    +
    + + result + + +
    +

    The Result of response serialization.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    The textual representation used when written to an output stream, which includes whether the result was a +success or failure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + debugDescription + +
    +
    +
    +
    +
    +
    +

    The debug textual representation used when written to an output stream, which includes the URL request, the URL +response, the temporary and destination URLs, the resume data, the durations of the network and serialization +actions, and the response serialization result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var debugDescription: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + map(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the map method with a closure that does not throw. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleInt = possibleData.map { $0.count }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func map<NewSuccess>(_ transform: (Success) -> NewSuccess) -> DownloadResponse<NewSuccess, Failure>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse whose result wraps the value returned by the given closure. If this instance’s + result is a failure, returns a response wrapping the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMap(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped +result value as a parameter.

    + +

    Use the tryMap method with a closure that may throw an error. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleObject = possibleData.tryMap {
    +    try JSONSerialization.jsonObject(with: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMap<NewSuccess>(_ transform: (Success) throws -> NewSuccess) -> DownloadResponse<NewSuccess, Error>
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the success value of the instance’s result.

    +
    +
    +
    +
    +

    Return Value

    +

    A success or failure DownloadResponse depending on the result of the given closure. If this +instance’s result is a failure, returns the same failure.

    +
    +
    +
    +
  • +
  • +
    + + + + mapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the mapError function with a closure that does not throw. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let withMyError = possibleData.mapError { MyError.error($0) }
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func mapError<NewFailure>(_ transform: (Failure) -> NewFailure) -> DownloadResponse<Success, NewFailure> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
  • +
    + + + + tryMapError(_:) + +
    +
    +
    +
    +
    +
    +

    Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

    + +

    Use the tryMapError function with a closure that may throw an error. For example:

    +
    let possibleData: DownloadResponse<Data> = ...
    +let possibleObject = possibleData.tryMapError {
    +    try someFailableFunction(taking: $0)
    +}
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func tryMapError<NewFailure>(_ transform: (Failure) throws -> NewFailure) -> DownloadResponse<Success, Error> where NewFailure : Error
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + transform + + +
    +

    A throwing closure that takes the error of the instance.

    +
    +
    +
    +
    +

    Return Value

    +

    A DownloadResponse instance containing the result of the transform.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponsePublisher.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponsePublisher.html new file mode 100644 index 00000000..79984fb9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadResponsePublisher.html @@ -0,0 +1,906 @@ + + + + DownloadResponsePublisher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadResponsePublisher

+
+
+ +
@available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
+public struct DownloadResponsePublisher<Value> : Publisher
+ +
+
+

A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Output + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Output = DownloadResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Failure + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Failure = Never
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided ResponseSerializer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Serializer: ResponseSerializer>(_ request: DownloadRequest, queue: DispatchQueue, serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DownloadRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DownloadResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    ResponseSerializer used to produce the published DownloadResponse.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates an instance which will serialize responses using the provided DownloadResponseSerializerProtocol value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init<Serializer: DownloadResponseSerializerProtocol>(_ request: DownloadRequest,
    +                                                            queue: DispatchQueue,
    +                                                            serializer: Serializer)
    +    where Value == Serializer.SerializedObject
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + request + + +
    +

    DownloadRequest for which to publish the response.

    +
    +
    + + queue + + +
    +

    DispatchQueue on which the DataResponse value will be published. .main by default.

    +
    +
    + + serializer + + +
    +

    DownloadResponseSerializerProtocol used to produce the published DownloadResponse.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + result() + +
    +
    +
    +
    +
    +
    +

    Publishes only the Result of the DownloadResponse value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func result() -> AnyPublisher<Result<Value, AFError>, Never>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher publishing the Result<Value, AFError> value.

    +
    +
    +
    +
  • +
  • +
    + + + + value() + +
    +
    +
    +
    +
    +
    +

    Publishes the Result of the DownloadResponse as a single Value or fail with the AFError instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value() -> AnyPublisher<Value, AFError>
    + +
    +
    +
    +

    Return Value

    +

    The AnyPublisher<Value, AFError> publishing the stream.

    +
    +
    +
    +
  • +
  • +
    + + + + receive(subscriber:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func receive<S>(subscriber: S) where S : Subscriber, S.Failure == Never, S.Input == DownloadResponse<Value, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Available where Value == URL? +

+
+
+
    +
  • +
    + + + + init(_:queue:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance which publishes a DownloadResponse<URL?, AFError> value without serialization.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *)
    +public init(_ request: DownloadRequest, queue: DispatchQueue)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadTask.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadTask.html new file mode 100644 index 00000000..d80c7ae0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/DownloadTask.html @@ -0,0 +1,751 @@ + + + + DownloadTask Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

DownloadTask

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct DownloadTask<Value>
+ +
+
+

Value used to await a DownloadResponse and associated values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + response + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    DownloadResponse produced by the DownloadRequest and its response handler.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var response: DownloadResponse<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + result + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Result of any response serialization performed for the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var result: Result<Value, AFError> { get async }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + + + Asynchronous + +
    +
    +
    +
    +
    +
    +

    Value returned by the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var value: Value { get async throws }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cancel() + +
    +
    +
    +
    +
    +
    +

    Cancel the underlying DownloadRequest and Task.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func cancel()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + resume() + +
    +
    +
    +
    +
    +
    +

    Resume the underlying DownloadRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func resume()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + suspend() + +
    +
    +
    +
    +
    +
    +

    Suspend the underlying DownloadRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func suspend()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Empty.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Empty.html new file mode 100644 index 00000000..f72a6cca --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Empty.html @@ -0,0 +1,646 @@ + + + + Empty Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Empty

+
+
+ +
public struct Empty : Codable
+
extension Empty: EmptyResponse
+ +
+
+

Type representing an empty value. Use Empty.value to get the static instance.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Static Empty instance used for all Empty responses.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let value: Empty
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Empty +

+
+
+
    +
  • +
    + + + + emptyValue() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func emptyValue() -> Empty
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/GoogleXSSIPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/GoogleXSSIPreprocessor.html new file mode 100644 index 00000000..5a2c5d63 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/GoogleXSSIPreprocessor.html @@ -0,0 +1,632 @@ + + + + GoogleXSSIPreprocessor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

GoogleXSSIPreprocessor

+
+
+ +
public struct GoogleXSSIPreprocessor : DataPreprocessor
+ +
+
+

DataPreprocessor that trims Google’s typical )]}',\n XSSI JSON header.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeader.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeader.html new file mode 100644 index 00000000..d3a4f39e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeader.html @@ -0,0 +1,1410 @@ + + + + HTTPHeader Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPHeader

+
+
+ +
public struct HTTPHeader : Hashable
+
extension HTTPHeader: CustomStringConvertible
+ +
+
+

A representation of a single HTTP header’s name / value pair.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + name + +
    +
    +
    +
    +
    +
    +

    Name of the header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let name: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    +

    Value of the header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(name:value:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from the given name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The name of the header.

    +
    +
    + + value + + +
    +

    The value of the header.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

HTTPHeader +

+
+
+
    +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + accept(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func accept(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptCharset(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Charset header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptCharset(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Charset value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptLanguage(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Language header.

    + +

    Alamofire offers a default Accept-Language header that accumulates and encodes the system’s preferred languages. +Use HTTPHeader.defaultAcceptLanguage.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptLanguage(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Language value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + acceptEncoding(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Accept-Encoding header.

    + +

    Alamofire offers a default accept encoding value that provides the most common values. Use +HTTPHeader.defaultAcceptEncoding.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func acceptEncoding(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Accept-Encoding value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Basic Authorization header using the username and password provided.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(username: String, password: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + username + + +
    +

    The username of the header.

    +
    +
    + + password + + +
    +

    The password of the header.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Bearer Authorization header using the bearerToken provided

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(bearerToken: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bearerToken + + +
    +

    The bearer token.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + authorization(_:) + +
    +
    +
    +
    +
    +
    +

    Returns an Authorization header.

    + +

    Alamofire provides built-in methods to produce Authorization headers. For a Basic Authorization header use +HTTPHeader.authorization(username:password:). For a Bearer Authorization header, use +HTTPHeader.authorization(bearerToken:).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func authorization(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Authorization value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns a Content-Disposition header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentDisposition(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Disposition value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + contentEncoding(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a Content-Encoding header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentEncoding(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Encoding.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + contentType(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a Content-Type header.

    + +

    All Alamofire ParameterEncodings and ParameterEncoders set the Content-Type of the request, so it may not +be necessary to manually set this value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func contentType(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The Content-Type value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
  • +
    + + + + userAgent(_:) + +
    +
    +
    +
    +
    +
    +

    Returns a User-Agent header.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func userAgent(_ value: String) -> HTTPHeader
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + value + + +
    +

    The User-Agent value.

    +
    +
    +
    +
    +

    Return Value

    +

    The header.

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Defaults +

+
+
+
    +
  • +
    + + + + defaultAcceptEncoding + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default Accept-Encoding header, appropriate for the encodings supported by particular OS +versions.

    + +

    See the Accept-Encoding HTTP header documentation .

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultAcceptEncoding: HTTPHeader
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultAcceptLanguage + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default Accept-Language header, generated by querying Locale for the user’s +preferredLanguages.

    + +

    See the Accept-Language HTTP header documentation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultAcceptLanguage: HTTPHeader
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + defaultUserAgent + +
    +
    +
    +
    +
    +
    +

    Returns Alamofire’s default User-Agent header.

    + +

    See the User-Agent header documentation.

    + +

    Example: iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 13.0.0) Alamofire/5.0.0

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let defaultUserAgent: HTTPHeader
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeaders.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeaders.html new file mode 100644 index 00000000..bb66d67b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPHeaders.html @@ -0,0 +1,1353 @@ + + + + HTTPHeaders Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPHeaders

+
+
+ +
public struct HTTPHeaders
+
extension HTTPHeaders: ExpressibleByDictionaryLiteral
+
extension HTTPHeaders: ExpressibleByArrayLiteral
+
extension HTTPHeaders: Sequence
+
extension HTTPHeaders: Collection
+
extension HTTPHeaders: CustomStringConvertible
+ +
+
+

An order-preserving and case-insensitive representation of HTTP headers.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an empty instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from an array of HTTPHeaders. Duplicate case-insensitive names are collapsed into the last +name and value encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ headers: [HTTPHeader])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance from a [String: String]. Duplicate case-insensitive names are collapsed into the last name +and value encountered.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ dictionary: [String : String])
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + add(name:value:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func add(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The HTTPHeader name.

    +
    +
    + + value + + +
    +

    The `HTTPHeader value.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + add(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends the provided HTTPHeader into the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func add(_ header: HTTPHeader)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + header + + +
    +

    The HTTPHeader to update or append.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(name:value:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func update(name: String, value: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + name + + +
    +

    The HTTPHeader name.

    +
    +
    + + value + + +
    +

    The `HTTPHeader value.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively updates or appends the provided HTTPHeader into the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func update(_ header: HTTPHeader)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + header + + +
    +

    The HTTPHeader to update or append.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + remove(name:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively removes an HTTPHeader, if it exists, from the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func remove(name: String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the HTTPHeader to remove.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + sort() + +
    +
    +
    +
    +
    +
    +

    Sort the current instance by header name, case insensitively.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func sort()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + sorted() + +
    +
    +
    +
    +
    +
    +

    Returns an instance sorted by header name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func sorted() -> HTTPHeaders
    + +
    +
    +
    +

    Return Value

    +

    A copy of the current instance sorted by name.

    +
    +
    +
    +
  • +
  • +
    + + + + value(for:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively find a header’s value by name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func value(for name: String) -> String?
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the header to search for, case-insensitively.

    +
    +
    +
    +
    +

    Return Value

    +

    The value of header, if it exists.

    +
    +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    +

    Case-insensitively access the header with the given name.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(name: String) -> String? { get set }
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + name + + +
    +

    The name of the header.

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + dictionary + +
    +
    +
    +
    +
    +
    +

    The dictionary representation of all headers.

    + +

    This representation does not preserve the current order of the instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var dictionary: [String : String] { get }
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(dictionaryLiteral elements: (String, String)...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(arrayLiteral:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(arrayLiteral elements: HTTPHeader...)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + makeIterator() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeIterator() -> IndexingIterator<[HTTPHeader]>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(position: Int) -> HTTPHeader { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + index(after:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func index(after i: Int) -> Int
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Defaults +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    The default set of HTTPHeaders used by Alamofire. Includes Accept-Encoding, Accept-Language, and +User-Agent.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let `default`: HTTPHeaders
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPMethod.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPMethod.html new file mode 100644 index 00000000..ee41c182 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/HTTPMethod.html @@ -0,0 +1,904 @@ + + + + HTTPMethod Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

HTTPMethod

+
+
+ +
public struct HTTPMethod : RawRepresentable, Equatable, Hashable
+ +
+
+

Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so +HTTPMethod.get != HTTPMethod(rawValue: "get").

+ +

See https://tools.ietf.org/html/rfc7231#section-4.3

+ +
+
+ +
+
+
+
    +
  • +
    + + + + connect + +
    +
    +
    +
    +
    +
    +

    CONNECT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let connect: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + delete + +
    +
    +
    +
    +
    +
    +

    DELETE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let delete: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + get + +
    +
    +
    +
    +
    +
    +

    GET method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let get: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + head + +
    +
    +
    +
    +
    +
    +

    HEAD method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let head: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    OPTIONS method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let options: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + patch + +
    +
    +
    +
    +
    +
    +

    PATCH method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let patch: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + post + +
    +
    +
    +
    +
    +
    +

    POST method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let post: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + put + +
    +
    +
    +
    +
    +
    +

    PUT method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let put: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + query + +
    +
    +
    +
    +
    +
    +

    QUERY method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let query: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + trace + +
    +
    +
    +
    +
    +
    +

    TRACE method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let trace: HTTPMethod
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let rawValue: String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding.html new file mode 100644 index 00000000..3b805ba2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding.html @@ -0,0 +1,867 @@ + + + + JSONEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

JSONEncoding

+
+
+ +
public struct JSONEncoding : ParameterEncoding
+ +
+
+

Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the +request. The Content-Type HTTP header field of an encoded request is set to application/json.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Error + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Error : Swift.Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns a JSONEncoding instance with default writing options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: JSONEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + prettyPrinted + +
    +
    +
    +
    +
    +
    +

    Returns a JSONEncoding instance with .prettyPrinted writing options.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var prettyPrinted: JSONEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + options + +
    +
    +
    +
    +
    +
    +

    The options for writing the parameters as JSON data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let options: JSONSerialization.WritingOptions
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • +
    + + + + init(options:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance using the specified WritingOptions.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(options: JSONSerialization.WritingOptions = [])
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + options + + +
    +

    JSONSerialization.WritingOptions to use.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Encoding +

+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Encodes any JSON compatible object into a URLRequest.

    +
    +

    Throws

    +

    Any Error produced during encoding.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + urlRequest + + +
    +

    URLRequestConvertible value into which the object will be encoded.

    +
    +
    + + jsonObject + + +
    +

    Any value (must be JSON compatibleto be encoded into theURLRequest.nil` by default.

    +
    +
    +
    +
    +

    Return Value

    +

    The encoded URLRequest.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding/Error.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding/Error.html new file mode 100644 index 00000000..291569d5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/JSONEncoding/Error.html @@ -0,0 +1,633 @@ + + + + Error Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Error

+
+
+ +
public enum Error : Swift.Error
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + invalidJSONObject + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case invalidJSONObject
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + localizedDescription + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var localizedDescription: String { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughPreprocessor.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughPreprocessor.html new file mode 100644 index 00000000..e50015cc --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughPreprocessor.html @@ -0,0 +1,632 @@ + + + + PassthroughPreprocessor Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PassthroughPreprocessor

+
+
+ +
public struct PassthroughPreprocessor : DataPreprocessor
+ +
+
+

DataPreprocessor that returns passed Data without any transform.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + preprocess(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func preprocess(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughStreamSerializer.html new file mode 100644 index 00000000..e7e4f7d4 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/PassthroughStreamSerializer.html @@ -0,0 +1,632 @@ + + + + PassthroughStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

PassthroughStreamSerializer

+
+
+ +
public struct PassthroughStreamSerializer : DataStreamSerializer
+ +
+
+

DataStreamSerializer which performs no serialization on incoming Data.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(_ data: Data) throws -> Data
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector.html new file mode 100644 index 00000000..68eaa984 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector.html @@ -0,0 +1,764 @@ + + + + Redirector Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Redirector

+
+
+ +
public struct Redirector
+
extension Redirector: RedirectHandler
+ +
+
+

Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Behavior + +
    +
    +
    +
    +
    +
    +

    Defines the behavior of the Redirector type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + follow + +
    +
    +
    +
    +
    +
    +

    Returns a Redirector with a .follow Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let follow: Redirector
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + +
    +
    +
    +
    +
    +
    +

    Returns a Redirector with a .doNotFollow Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doNotFollow: Redirector
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + behavior + +
    +
    +
    +
    +
    +
    +

    The Behavior of the Redirector.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let behavior: Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(behavior:) + +
    +
    +
    +
    +
    +
    +

    Creates a Redirector instance from the Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(behavior: Behavior)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + behavior + + +
    +

    The Behavior.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func task(_ task: URLSessionTask,
    +                 willBeRedirectedTo request: URLRequest,
    +                 for response: HTTPURLResponse,
    +                 completion: @escaping (URLRequest?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector/Behavior.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector/Behavior.html new file mode 100644 index 00000000..1a324e60 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/Redirector/Behavior.html @@ -0,0 +1,660 @@ + + + + Behavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Behavior

+
+
+ +
public enum Behavior
+ +
+
+

Defines the behavior of the Redirector type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + follow + +
    +
    +
    +
    +
    +
    +

    Follow the redirect as defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case follow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotFollow + +
    +
    +
    +
    +
    +
    +

    Do not follow the redirect defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotFollow
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(_:) + +
    +
    +
    +
    +
    +
    +

    Modify the redirect request defined in the response.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/RequestAdapterState.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/RequestAdapterState.html new file mode 100644 index 00000000..cea0e29f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/RequestAdapterState.html @@ -0,0 +1,633 @@ + + + + RequestAdapterState Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

RequestAdapterState

+
+
+ +
public struct RequestAdapterState
+ +
+
+

Stores all state associated with a URLRequest being adapted.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + requestID + +
    +
    +
    +
    +
    +
    +

    The UUID of the Request associated with the URLRequest to adapt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let requestID: UUID
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + session + +
    +
    +
    +
    +
    +
    +

    The Session associated with the URLRequest to adapt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let session: Session
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher.html new file mode 100644 index 00000000..fc6d7d77 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher.html @@ -0,0 +1,764 @@ + + + + ResponseCacher Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ResponseCacher

+
+
+ +
public struct ResponseCacher
+
extension ResponseCacher: CachedResponseHandler
+ +
+
+

ResponseCacher is a convenience CachedResponseHandler making it easy to cache, not cache, or modify a cached +response.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Behavior + +
    +
    +
    +
    +
    +
    +

    Defines the behavior of the ResponseCacher type.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + cache + +
    +
    +
    +
    +
    +
    +

    Returns a ResponseCacher with a .cache Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let cache: ResponseCacher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + +
    +
    +
    +
    +
    +
    +

    Returns a ResponseCacher with a .doNotCache Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static let doNotCache: ResponseCacher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + behavior + +
    +
    +
    +
    +
    +
    +

    The Behavior of the ResponseCacher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let behavior: Behavior
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(behavior:) + +
    +
    +
    +
    +
    +
    +

    Creates a ResponseCacher instance from the Behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(behavior: Behavior)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + behavior + + +
    +

    The Behavior.

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataTask(_ task: URLSessionDataTask,
    +                     willCacheResponse response: CachedURLResponse,
    +                     completion: @escaping (CachedURLResponse?) -> Void)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher/Behavior.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher/Behavior.html new file mode 100644 index 00000000..526251c7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/ResponseCacher/Behavior.html @@ -0,0 +1,660 @@ + + + + Behavior Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Behavior

+
+
+ +
public enum Behavior
+ +
+
+

Defines the behavior of the ResponseCacher type.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + cache + +
    +
    +
    +
    +
    +
    +

    Stores the cached response in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case cache
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + doNotCache + +
    +
    +
    +
    +
    +
    +

    Prevents the cached response from being stored in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case doNotCache
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + modify(_:) + +
    +
    +
    +
    +
    +
    +

    Modifies the cached response before storing it in the cache.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf.html new file mode 100644 index 00000000..184c4f96 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf.html @@ -0,0 +1,687 @@ + + + + StreamOf Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StreamOf

+
+
+ +
@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *)
+public struct StreamOf<Element> : AsyncSequence
+ +
+
+

An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + AsyncIterator + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AsyncIterator = Iterator
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BufferingPolicy + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias BufferingPolicy = AsyncStream<Element>.Continuation.BufferingPolicy
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + makeAsyncIterator() + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeAsyncIterator() -> Iterator
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Iterator + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Iterator : AsyncIteratorProtocol
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf/Iterator.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf/Iterator.html new file mode 100644 index 00000000..5241ba2c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StreamOf/Iterator.html @@ -0,0 +1,608 @@ + + + + Iterator Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Iterator

+
+
+ +
public struct Iterator : AsyncIteratorProtocol
+ +
+
+

Undocumented

+ +
+
+ +
+
+
+
    +
  • +
    + + + + next() + + + Asynchronous + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func next() async -> Element?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StringStreamSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StringStreamSerializer.html new file mode 100644 index 00000000..042d3b26 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/StringStreamSerializer.html @@ -0,0 +1,632 @@ + + + + StringStreamSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

StringStreamSerializer

+
+
+ +
public struct StringStreamSerializer : DataStreamSerializer
+ +
+
+

DataStreamSerializer which serializes incoming stream Data into UTF8-decoded String values.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + serialize(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize(_ data: Data) throws -> String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding.html new file mode 100644 index 00000000..1034ea4a --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding.html @@ -0,0 +1,1098 @@ + + + + URLEncoding Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLEncoding

+
+
+ +
public struct URLEncoding : ParameterEncoding
+ +
+
+

Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP +body of the URL request. Whether the query string is set or appended to any existing URL query string or set as +the HTTP body depends on the destination of the encoding.

+ +

The Content-Type HTTP header field of an encoded request with HTTP body is set to +application/x-www-form-urlencoded; charset=utf-8.

+ +

There is no published specification for how to encode collection types. By default the convention of appending +[] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for +nested dictionary values (foo[bar]=baz) is used. Optionally, ArrayEncoding can be used to omit the +square brackets appended to array keys.

+ +

BoolEncoding can be used to configure how boolean values are encoded. The default behavior is to encode +true as 1 and false as 0.

+ +
+
+ +
+
+
+
+ + +
+ +

Helper Types +

+
+
+
    +
  • +
    + + + + Destination + +
    +
    +
    +
    +
    +
    +

    Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the +resulting URL request.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Destination
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ArrayEncoding + +
    +
    +
    +
    +
    +
    +

    Configures how Array parameters are encoded.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BoolEncoding + +
    +
    +
    +
    +
    +
    +

    Configures how Bool parameters are encoded.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum BoolEncoding
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Properties +

+
+
+
    +
  • +
    + + + + default + +
    +
    +
    +
    +
    +
    +

    Returns a default URLEncoding instance with a .methodDependent destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var `default`: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Returns a URLEncoding instance with a .queryString destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var queryString: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Returns a URLEncoding instance with an .httpBody destination.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var httpBody: URLEncoding { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + destination + +
    +
    +
    +
    +
    +
    +

    The destination defining where the encoded query string is to be applied to the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let destination: Destination
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + arrayEncoding + +
    +
    +
    +
    +
    +
    +

    The encoding to use for Array parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let arrayEncoding: ArrayEncoding
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolEncoding + +
    +
    +
    +
    +
    +
    +

    The encoding to use for Bool parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let boolEncoding: BoolEncoding
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Initialization +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Creates an instance using the specified parameters.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(destination: Destination = .methodDependent,
    +            arrayEncoding: ArrayEncoding = .brackets,
    +            boolEncoding: BoolEncoding = .numeric)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + destination + + +
    +

    Destination defining where the encoded query string will be applied. .methodDependent by + default.

    +
    +
    + + arrayEncoding + + +
    +

    ArrayEncoding to use. .brackets by default.

    +
    +
    + + boolEncoding + + +
    +

    BoolEncoding to use. .numeric by default.

    +
    +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Encoding +

+
+
+
    +
  • +
    + + + + encode(_:with:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func queryComponents(fromKey key: String, value: Any) -> [(String, String)]
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + key + + +
    +

    Key of the query component.

    +
    +
    + + value + + +
    +

    Value of the query component.

    +
    +
    +
    +
    +

    Return Value

    +

    The percent-escaped, URL encoded query string components.

    +
    +
    +
    +
  • +
  • +
    + + + + escape(_:) + +
    +
    +
    +
    +
    +
    +

    Creates a percent-escaped string following RFC 3986 for a query string key or value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func escape(_ string: String) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + string + + +
    +

    String to be percent-escaped.

    +
    +
    +
    +
    +

    Return Value

    +

    The percent-escaped String.

    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/ArrayEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/ArrayEncoding.html new file mode 100644 index 00000000..4acc30db --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/ArrayEncoding.html @@ -0,0 +1,687 @@ + + + + ArrayEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

ArrayEncoding

+
+
+ +
public enum ArrayEncoding
+ +
+
+

Configures how Array parameters are encoded.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + brackets + +
    +
    +
    +
    +
    +
    +

    An empty set of square brackets is appended to the key for every value. This is the default behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case brackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + noBrackets + +
    +
    +
    +
    +
    +
    +

    No brackets are appended. The key is encoded as is.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case noBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + indexInBrackets + +
    +
    +
    +
    +
    +
    +

    Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case indexInBrackets
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + custom(_:) + +
    +
    +
    +
    +
    +
    +

    Provide a custom array key encoding with the given closure.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case custom((_ key: String, _ index: Int) -> String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/BoolEncoding.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/BoolEncoding.html new file mode 100644 index 00000000..c48baa9d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/BoolEncoding.html @@ -0,0 +1,633 @@ + + + + BoolEncoding Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BoolEncoding

+
+
+ +
public enum BoolEncoding
+ +
+
+

Configures how Bool parameters are encoded.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + numeric + +
    +
    +
    +
    +
    +
    +

    Encode true as 1 and false as 0. This is the default behavior.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case numeric
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + literal + +
    +
    +
    +
    +
    +
    +

    Encode true and false as string literals.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case literal
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/Destination.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/Destination.html new file mode 100644 index 00000000..6c50095f --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLEncoding/Destination.html @@ -0,0 +1,662 @@ + + + + Destination Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Destination

+
+
+ +
public enum Destination
+ +
+
+

Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the +resulting URL request.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + methodDependent + +
    +
    +
    +
    +
    +
    +

    Applies encoded query string result to existing query string for GET, HEAD and DELETE requests and +sets as the HTTP body for requests with any other HTTP method.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case methodDependent
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + queryString + +
    +
    +
    +
    +
    +
    +

    Sets or appends encoded query string result to existing query string.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case queryString
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + httpBody + +
    +
    +
    +
    +
    +
    +

    Sets encoded query string result as the HTTP body of the URL request.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case httpBody
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLResponseSerializer.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLResponseSerializer.html new file mode 100644 index 00000000..abf485eb --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Structs/URLResponseSerializer.html @@ -0,0 +1,636 @@ + + + + URLResponseSerializer Structure Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

URLResponseSerializer

+
+
+ +
public struct URLResponseSerializer : DownloadResponseSerializerProtocol
+ +
+
+

A DownloadResponseSerializerProtocol that performs only Error checking and ensures that a downloaded fileURL +is present.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Creates an instance.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serializeDownload(request: URLRequest?,
    +                              response: HTTPURLResponse?,
    +                              fileURL: URL?,
    +                              error: Error?) throws -> URL
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Typealiases.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Typealiases.html new file mode 100644 index 00000000..1d48baa7 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/Typealiases.html @@ -0,0 +1,783 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + Parameters + +
    +
    +
    +
    +
    +
    +

    A dictionary of parameters to apply to a URLRequest.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Parameters = [String : Any]
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AdaptHandler + +
    +
    +
    +
    +
    +
    +

    RequestAdapter closure definition.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AdaptHandler = (URLRequest, Session, _ completion: @escaping (Result<URLRequest, Error>) -> Void) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RetryHandler + +
    +
    +
    +
    +
    +
    +

    RequestRetrier closure definition.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias RetryHandler = (Request, Session, Error, _ completion: @escaping (RetryResult) -> Void) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFDataResponse + +
    +
    +
    +
    +
    +
    +

    Default type of DataResponse returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFDataResponse<Success> = DataResponse<Success, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFDownloadResponse + +
    +
    +
    +
    +
    +
    +

    Default type of DownloadResponse returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFDownloadResponse<Success> = DownloadResponse<Success, AFError>
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AFResult + +
    +
    +
    +
    +
    +
    +

    Default type of Result returned by Alamofire, with an AFError Failure type.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias AFResult<Success> = Result<Success, AFError>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Server Trust Evaluators +

+
+
+
    +
  • +
    + + + + DisabledEvaluator + +
    +
    +
    +
    +
    +
    +

    Disables all evaluation which in turn will always consider any server trust as valid.

    +
    +

    Note

    + Instead of disabling server trust evaluation, it’s a better idea to configure systems to properly trust test + certificates, as outlined in this Apple tech note. + +
    + +

    THIS EVALUATOR SHOULD NEVER BE USED IN PRODUCTION!

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @available(*, deprecated, renamed: "DisabledTrustEvaluator", message: "DisabledEvaluator has been renamed DisabledTrustEvaluator.")
    +public typealias DisabledEvaluator = DisabledTrustEvaluator
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/badge.svg b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/badge.svg new file mode 100644 index 00000000..5f56a7ec --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 97% + + + 97% + + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/highlight.css b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 00000000..c170357c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/jazzy.css b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 00000000..c7bb9fe2 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,404 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +hr { + height: 1px; + border: none; + background-color: #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 2px; + vertical-align: -3px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/carat.png b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/dash.png b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/index.html b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/index.html new file mode 100644 index 00000000..cf0d549e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,863 @@ + + + + Alamofire Reference + + + + + + + + + + + + + + + +
+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+ +

Alamofire: Elegant Networking in Swift

+ +

Swift +Platforms +CocoaPods Compatible +Carthage Compatible +Swift Package Manager +Swift Forums

+ +

Alamofire is an HTTP networking library written in Swift.

+ + +

Features

+ +
    +
  • [x] Chainable Request / Response Methods
  • +
  • [x] Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6.
  • +
  • [x] Combine Support
  • +
  • [x] URL / JSON Parameter Encoding
  • +
  • [x] Upload File / Data / Stream / MultipartFormData
  • +
  • [x] Download File using Request or Resume Data
  • +
  • [x] Authentication with URLCredential
  • +
  • [x] HTTP Response Validation
  • +
  • [x] Upload and Download Progress Closures with Progress
  • +
  • [x] cURL Command Output
  • +
  • [x] Dynamically Adapt and Retry Requests
  • +
  • [x] TLS Certificate and Public Key Pinning
  • +
  • [x] Network Reachability
  • +
  • [x] Comprehensive Unit and Integration Test Coverage
  • +
  • [x] Complete Documentation
  • +
+

Write Requests Fast!

+ +

Alamofire’s compact syntax and extensive feature set allow requests with powerful features like automatic retry to be written in just a few lines of code.

+
// Automatic String to URL conversion, Swift concurrency support, and automatic retry.
+let response = await AF.request("https://httpbin.org/get", interceptor: .retryPolicy)
+                       // Automatic HTTP Basic Auth.
+                       .authenticate(username: "user", password: "pass")
+                       // Caching customization.
+                       .cacheResponse(using: .cache)
+                       // Redirect customization.
+                       .redirect(using: .follow)
+                       // Validate response code and Content-Type.
+                       .validate()
+                       // Produce a cURL command for the request.
+                       .cURLDescription { description in
+                         print(description)
+                       }
+                       // Automatic Decodable support with background parsing.
+                       .serializingDecodable(DecodableType.self)
+                       // Await the full response with metrics and a parsed body.
+                       .response
+// Detailed response description for easy debugging.
+debugPrint(response)
+
+

Component Libraries

+ +

In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the Alamofire Software Foundation to bring additional functionality to the Alamofire ecosystem.

+ +
    +
  • AlamofireImage - An image library including image response serializers, UIImage and UIImageView extensions, custom image filters, an auto-purging in-memory cache, and a priority-based image downloading system.
  • +
  • AlamofireNetworkActivityIndicator - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support URLSession instances not managed by Alamofire.
  • +
+

Requirements

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformMinimum Swift VersionInstallationStatus
iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+5.6CocoaPods, Carthage, Swift Package Manager, ManualFully Tested
LinuxLatest OnlySwift Package ManagerBuilding But Unsupported
WindowsLatest OnlySwift Package ManagerBuilding But Unsupported
AndroidLatest OnlySwift Package ManagerBuilding But Unsupported
+

Known Issues on Linux and Windows

+ +

Alamofire builds on Linux, Windows, and Android but there are missing features and many issues in the underlying swift-corelibs-foundation that prevent full functionality and may cause crashes. These include:

+ +
    +
  • ServerTrustManager and associated certificate functionality is unavailable, so there is no certificate pinning and no client certificate support.
  • +
  • Various methods of HTTP authentication may crash, including HTTP Basic and HTTP Digest. Crashes may occur if responses contain server challenges.
  • +
  • Cache control through CachedResponseHandler and associated APIs is unavailable, as the underlying delegate methods aren’t called.
  • +
  • URLSessionTaskMetrics are never gathered.
  • +
+ +

Due to these issues, Alamofire is unsupported on Linux, Windows, and Android. Please report any crashes to the Swift bug reporter.

+

Migration Guides

+ + +

Communication

+ + +

Installation

+

CocoaPods

+ +

CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your Podfile:

+
pod 'Alamofire'
+
+

Carthage

+ +

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your Cartfile:

+
github "Alamofire/Alamofire"
+
+

Swift Package Manager

+ +

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.

+ +

Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the dependencies value of your Package.swift.

+
dependencies: [
+    .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.8.1"))
+]
+
+

Manually

+ +

If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.

+

Embedded Framework

+ +
    +
  • Open up Terminal, cd into your top-level project directory, and run the following command “if” your project is not initialized as a git repository:
  • +
+
  $ git init
+
+ +
    +
  • Add Alamofire as a git submodule by running the following command:
  • +
+
  $ git submodule add https://github.com/Alamofire/Alamofire.git
+
+ +
    +
  • Open the new Alamofire folder, and drag the Alamofire.xcodeproj into the Project Navigator of your application’s Xcode project.
  • +
+ +
+

It should appear nested underneath your application’s blue project icon. Whether it is above or below all the other Xcode groups does not matter.

+
+ +
    +
  • Select the Alamofire.xcodeproj in the Project Navigator and verify the deployment target matches that of your application target.
  • +
  • Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the “Targets” heading in the sidebar.
  • +
  • In the tab bar at the top of that window, open the “General” panel.
  • +
  • Click on the + button under the “Embedded Binaries” section.
  • +
  • You will see two different Alamofire.xcodeproj folders each with two different versions of the Alamofire.framework nested inside a Products folder.
  • +
+ +
+

It does not matter which Products folder you choose from, but it does matter whether you choose the top or bottom Alamofire.framework.

+
+ +
    +
  • Select the top Alamofire.framework for iOS and the bottom one for macOS.
  • +
+ +
+

You can verify which one you selected by inspecting the build log for your project. The build target for Alamofire will be listed as Alamofire iOS, Alamofire macOS, Alamofire tvOS, or Alamofire watchOS.

+
+ +
    +
  • And that’s it!
  • +
+ +
+

The Alamofire.framework is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.

+
+

Contributing

+ +

Before contributing to Alamofire, please read the instructions detailed in our contribution guide.

+

Open Radars

+ +

The following radars have some effect on the current implementation of Alamofire.

+ +
    +
  • rdar://21349340 - Compiler throwing warning due to toll-free bridging issue in the test case
  • +
  • rdar://26870455 - Background URL Session Configurations do not work in the simulator
  • +
  • rdar://26849668 - Some URLProtocol APIs do not properly handle URLRequest
  • +
+

Resolved Radars

+ +

The following radars have been resolved over time after being filed against the Alamofire project.

+ +
    +
  • rdar://26761490 - Swift string interpolation causing memory leak with common usage. + +
      +
    • (Resolved): 9/1/17 in Xcode 9 beta 6.
    • +
  • +
  • rdar://36082113 - URLSessionTaskMetrics failing to link on watchOS 3.0+ + +
      +
    • (Resolved): Just add CFNetwork to your linked frameworks.
    • +
  • +
  • FB7624529 - urlSession(_:task:didFinishCollecting:) never called on watchOS + +
      +
    • (Resolved): Metrics now collected on watchOS 7+.
    • +
  • +
+

FAQ

+

What’s the origin of the name Alamofire?

+ +

Alamofire is named after the Alamo Fire flower, a hybrid variant of the Bluebonnet, the official state flower of Texas.

+

Credits

+ +

Alamofire is owned and maintained by the Alamofire Software Foundation. You can follow them on Twitter at @AlamofireSF for project updates and releases.

+

Security Disclosure

+ +

If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.

+

Sponsorship

+ +

The ASF is looking to raise money to officially stay registered as a federal non-profit organization. +Registering will allow Foundation members to gain some legal protections and also allow us to put donations to use, tax-free. +Sponsoring the ASF will enable us to:

+ +
    +
  • Pay our yearly legal fees to keep the non-profit in good status
  • +
  • Pay for our mail servers to help us stay on top of all questions and security issues
  • +
  • Potentially fund test servers to make it easier for us to test the edge cases
  • +
  • Potentially fund developers to work on one of our projects full-time
  • +
+ +

The community adoption of the ASF libraries has been amazing. +We are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward. +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. +If you use any of our libraries for work, see if your employers would be interested in donating. +Any amount you can donate, whether once or monthly, to help us reach our goal would be greatly appreciated.

+ +

Sponsor Alamofire

+

Supporters

+ +

MacStadium provides Alamofire with a free, hosted Mac mini.

+ +

Powered by MacStadium

+

License

+ +

Alamofire is released under the MIT license. See LICENSE for details.

+ +
+
+ + +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.js b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 00000000..19844166 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.search.js b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 00000000..359cdbb8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jquery.min.js b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100755 index 00000000..7f37b5d9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/search.json b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/search.json new file mode 100644 index 00000000..bbc49739 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:9Alamofire10Parametersa":{"name":"Parameters","abstract":"

A dictionary of parameters to apply to a URLRequest.

"},"Typealiases.html#/s:9Alamofire12AdaptHandlera":{"name":"AdaptHandler","abstract":"

RequestAdapter closure definition.

"},"Typealiases.html#/s:9Alamofire12RetryHandlera":{"name":"RetryHandler","abstract":"

RequestRetrier closure definition.

"},"Typealiases.html#/s:9Alamofire14AFDataResponsea":{"name":"AFDataResponse","abstract":"

Default type of DataResponse returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire18AFDownloadResponsea":{"name":"AFDownloadResponse","abstract":"

Default type of DownloadResponse returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire8AFResulta":{"name":"AFResult","abstract":"

Default type of Result returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire17DisabledEvaluatora":{"name":"DisabledEvaluator","abstract":"

Disables all evaluation which in turn will always consider any server trust as valid.

"},"Structs/StringStreamSerializer.html#/s:9Alamofire22StringStreamSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"StringStreamSerializer"},"Structs/StringStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"StringStreamSerializer"},"Structs/PassthroughStreamSerializer.html#/s:9Alamofire27PassthroughStreamSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"PassthroughStreamSerializer"},"Structs/PassthroughStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"PassthroughStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV7decoderAA11DataDecoder_pvp":{"name":"decoder","abstract":"

DataDecoder used to decode incoming Data.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV16dataPreprocessorAA04DataF0_pvp":{"name":"dataPreprocessor","abstract":"

DataPreprocessor incoming Data is passed through before being passed to the DataDecoder.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV7decoder16dataPreprocessorACyxGAA11DataDecoder_p_AA0hG0_ptcfc":{"name":"init(decoder:dataPreprocessor:)","abstract":"

Creates an instance with the provided DataDecoder and DataPreprocessor.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"DecodableStreamSerializer"},"Structs/Empty.html#/s:9Alamofire5EmptyV5valueACvpZ":{"name":"value","abstract":"

Static Empty instance used for all Empty responses.

","parent_name":"Empty"},"Structs/Empty.html#/s:9Alamofire13EmptyResponseP10emptyValuexyFZ":{"name":"emptyValue()","parent_name":"Empty"},"Structs/URLResponseSerializer.html#/s:9Alamofire21URLResponseSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"URLResponseSerializer"},"Structs/URLResponseSerializer.html#/s:9Alamofire34DownloadResponseSerializerProtocolP09serializeB07request8response7fileURL5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0J0VSgs5Error_pSgtKF":{"name":"serializeDownload(request:response:fileURL:error:)","parent_name":"URLResponseSerializer"},"Structs/GoogleXSSIPreprocessor.html#/s:9Alamofire22GoogleXSSIPreprocessorVACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"GoogleXSSIPreprocessor"},"Structs/GoogleXSSIPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","parent_name":"GoogleXSSIPreprocessor"},"Structs/PassthroughPreprocessor.html#/s:9Alamofire23PassthroughPreprocessorVACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"PassthroughPreprocessor"},"Structs/PassthroughPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","parent_name":"PassthroughPreprocessor"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

The URL request sent to the server.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

The server’s response to the URL request.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7fileURL10Foundation0E0VSgvp":{"name":"fileURL","abstract":"

The final destination URL of the data returned from the server after it is moved.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV10resumeData10Foundation0E0VSgvp":{"name":"resumeData","abstract":"

The resume data generated if the request was cancelled.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

The final metrics of the response.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV21serializationDurationSdvp":{"name":"serializationDuration","abstract":"

The time taken to serialize the response.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV6results6ResultOyxq_Gvp":{"name":"result","abstract":"

The result of response serialization.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV5valuexSgvp":{"name":"value","abstract":"

Returns the associated value of the result if it is a success, nil otherwise.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV5errorq_Sgvp":{"name":"error","abstract":"

Returns the associated error value if the result if it is a failure, nil otherwise.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7request8response7fileURL10resumeData7metrics21serializationDuration6resultACyxq_G10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAL0G0VSgAL0I0VSgSo23NSURLSessionTaskMetricsCSgSds6ResultOyxq_Gtcfc":{"name":"init(request:response:fileURL:resumeData:metrics:serializationDuration:result:)","abstract":"

Creates a DownloadResponse instance with the specified parameters derived from response serialization.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV11descriptionSSvp":{"name":"description","abstract":"

The textual representation used when written to an output stream, which includes whether the result was a","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV16debugDescriptionSSvp":{"name":"debugDescription","abstract":"

The debug textual representation used when written to an output stream, which includes the URL request, the URL","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV3mapyACyqd__q_Gqd__xXElF":{"name":"map(_:)","abstract":"

Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV6tryMapyACyqd__s5Error_pGqd__xKXElF":{"name":"tryMap(_:)","abstract":"

Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV8mapErroryACyxqd__Gqd__q_XEs0E0Rd__lF":{"name":"mapError(_:)","abstract":"

Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV11tryMapErroryACyxs0F0_pGqd__q_KXEsAERd__lF":{"name":"tryMapError(_:)","abstract":"

Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DownloadResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

The URL request sent to the server.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

The server’s response to the URL request.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV4data10Foundation0B0VSgvp":{"name":"data","abstract":"

The data returned by the server.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

The final metrics of the response.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV21serializationDurationSdvp":{"name":"serializationDuration","abstract":"

The time taken to serialize the response.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV6results6ResultOyxq_Gvp":{"name":"result","abstract":"

The result of response serialization.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV5valuexSgvp":{"name":"value","abstract":"

Returns the associated value of the result if it is a success, nil otherwise.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV5errorq_Sgvp":{"name":"error","abstract":"

Returns the associated error value if the result if it is a failure, nil otherwise.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7request8response4data7metrics21serializationDuration6resultACyxq_G10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgSo23NSURLSessionTaskMetricsCSgSds6ResultOyxq_Gtcfc":{"name":"init(request:response:data:metrics:serializationDuration:result:)","abstract":"

Creates a DataResponse instance with the specified parameters derived from the response serialization.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV11descriptionSSvp":{"name":"description","abstract":"

The textual representation used when written to an output stream, which includes whether the result was a","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV16debugDescriptionSSvp":{"name":"debugDescription","abstract":"

The debug textual representation used when written to an output stream, which includes (if available) a summary","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV3mapyACyqd__q_Gqd__xXElF":{"name":"map(_:)","abstract":"

Evaluates the specified closure when the result of this DataResponse is a success, passing the unwrapped","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV6tryMapyACyqd__s5Error_pGqd__xKXElF":{"name":"tryMap(_:)","abstract":"

Evaluates the given closure when the result of this DataResponse is a success, passing the unwrapped result","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV8mapErroryACyxqd__Gqd__q_XEs0E0Rd__lF":{"name":"mapError(_:)","abstract":"

Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV11tryMapErroryACyxs0F0_pGqd__q_KXEsAERd__lF":{"name":"tryMapError(_:)","abstract":"

Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DataResponse"},"Structs/RequestAdapterState.html#/s:9Alamofire19RequestAdapterStateV9requestID10Foundation4UUIDVvp":{"name":"requestID","abstract":"

The UUID of the Request associated with the URLRequest to adapt.

","parent_name":"RequestAdapterState"},"Structs/RequestAdapterState.html#/s:9Alamofire19RequestAdapterStateV7sessionAA7SessionCvp":{"name":"session","abstract":"

The Session associated with the URLRequest to adapt.

","parent_name":"RequestAdapterState"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO5erroryA2EmF":{"name":"error","abstract":"

Throws a DuplicateHeaderError. The default.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO7replaceyA2EmF":{"name":"replace","abstract":"

Replaces the existing header value with deflate.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO4skipyA2EmF":{"name":"skip","abstract":"

Silently skips compression when the header exists.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html":{"name":"DuplicateHeaderBehavior","abstract":"

Type that determines the action taken when the URLRequest already has a Content-Encoding header.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV20DuplicateHeaderErrorV":{"name":"DuplicateHeaderError","abstract":"

Error produced when the outgoing URLRequest already has a Content-Encoding header, when the instance has","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV23duplicateHeaderBehaviorAC09DuplicatefG0Ovp":{"name":"duplicateHeaderBehavior","abstract":"

Behavior to use when the outgoing URLRequest already has a Content-Encoding header.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV22shouldCompressBodyDataySb10Foundation0H0Vcvp":{"name":"shouldCompressBodyData","abstract":"

Closure which determines whether the outgoing body data should be compressed.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV23duplicateHeaderBehavior22shouldCompressBodyDataA2C09DuplicatefG0O_Sb10Foundation0K0Vctcfc":{"name":"init(duplicateHeaderBehavior:shouldCompressBodyData:)","abstract":"

Creates an instance with the provided parameters.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"DeflateRequestCompressor"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO6followyA2EmF":{"name":"follow","abstract":"

Follow the redirect as defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO11doNotFollowyA2EmF":{"name":"doNotFollow","abstract":"

Do not follow the redirect defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO6modifyyAE10Foundation10URLRequestVSgSo16NSURLSessionTaskC_AISo17NSHTTPURLResponseCtccAEmF":{"name":"modify(_:)","abstract":"

Modify the redirect request defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html":{"name":"Behavior","abstract":"

Defines the behavior of the Redirector type.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV6followACvpZ":{"name":"follow","abstract":"

Returns a Redirector with a .follow Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV11doNotFollowACvpZ":{"name":"doNotFollow","abstract":"

Returns a Redirector with a .doNotFollow Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV8behaviorAC8BehaviorOvp":{"name":"behavior","abstract":"

The Behavior of the Redirector.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV8behaviorA2C8BehaviorO_tcfc":{"name":"init(behavior:)","abstract":"

Creates a Redirector instance from the Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire15RedirectHandlerP4task_18willBeRedirectedTo3for10completionySo16NSURLSessionTaskC_10Foundation10URLRequestVSo17NSHTTPURLResponseCyALSgctF":{"name":"task(_:willBeRedirectedTo:for:completion:)","parent_name":"Redirector"},"Structs/JSONEncoding/Error.html#/s:9Alamofire12JSONEncodingV5ErrorO17invalidJSONObjectyA2EmF":{"name":"invalidJSONObject","abstract":"

Undocumented

","parent_name":"Error"},"Structs/JSONEncoding/Error.html#/s:9Alamofire12JSONEncodingV5ErrorO20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"Error"},"Structs/JSONEncoding/Error.html":{"name":"Error","abstract":"

Undocumented

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7defaultACvpZ":{"name":"default","abstract":"

Returns a JSONEncoding instance with default writing options.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV13prettyPrintedACvpZ":{"name":"prettyPrinted","abstract":"

Returns a JSONEncoding instance with .prettyPrinted writing options.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7optionsSo20NSJSONWritingOptionsVvp":{"name":"options","abstract":"

The options for writing the parameters as JSON data.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7optionsACSo20NSJSONWritingOptionsV_tcfc":{"name":"init(options:)","abstract":"

Creates an instance using the specified WritingOptions.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV6encode_14withJSONObject10Foundation10URLRequestVAA0G11Convertible_p_ypSgtKF":{"name":"encode(_:withJSONObject:)","abstract":"

Encodes any JSON compatible object into a URLRequest.

","parent_name":"JSONEncoding"},"Structs/URLEncoding/BoolEncoding.html#/s:9Alamofire11URLEncodingV12BoolEncodingO7numericyA2EmF":{"name":"numeric","abstract":"

Encode true as 1 and false as 0. This is the default behavior.

","parent_name":"BoolEncoding"},"Structs/URLEncoding/BoolEncoding.html#/s:9Alamofire11URLEncodingV12BoolEncodingO7literalyA2EmF":{"name":"literal","abstract":"

Encode true and false as string literals.

","parent_name":"BoolEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO8bracketsyA2EmF":{"name":"brackets","abstract":"

An empty set of square brackets is appended to the key for every value. This is the default behavior.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO10noBracketsyA2EmF":{"name":"noBrackets","abstract":"

No brackets are appended. The key is encoded as is.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO15indexInBracketsyA2EmF":{"name":"indexInBrackets","abstract":"

Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO6customyAES2S_SitccAEmF":{"name":"custom(_:)","abstract":"

Provide a custom array key encoding with the given closure.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO15methodDependentyA2EmF":{"name":"methodDependent","abstract":"

Applies encoded query string result to existing query string for GET, HEAD and DELETE requests and","parent_name":"Destination"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO11queryStringyA2EmF":{"name":"queryString","abstract":"

Sets or appends encoded query string result to existing query string.

","parent_name":"Destination"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO8httpBodyyA2EmF":{"name":"httpBody","abstract":"

Sets encoded query string result as the HTTP body of the URL request.

","parent_name":"Destination"},"Structs/URLEncoding/Destination.html":{"name":"Destination","abstract":"

Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the","parent_name":"URLEncoding"},"Structs/URLEncoding/ArrayEncoding.html":{"name":"ArrayEncoding","abstract":"

Configures how Array parameters are encoded.

","parent_name":"URLEncoding"},"Structs/URLEncoding/BoolEncoding.html":{"name":"BoolEncoding","abstract":"

Configures how Bool parameters are encoded.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV7defaultACvpZ":{"name":"default","abstract":"

Returns a default URLEncoding instance with a .methodDependent destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11queryStringACvpZ":{"name":"queryString","abstract":"

Returns a URLEncoding instance with a .queryString destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV8httpBodyACvpZ":{"name":"httpBody","abstract":"

Returns a URLEncoding instance with an .httpBody destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11destinationAC11DestinationOvp":{"name":"destination","abstract":"

The destination defining where the encoded query string is to be applied to the URL request.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV13arrayEncodingAC05ArrayD0Ovp":{"name":"arrayEncoding","abstract":"

The encoding to use for Array parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV12boolEncodingAC04BoolD0Ovp":{"name":"boolEncoding","abstract":"

The encoding to use for Bool parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11destination13arrayEncoding04boolE0A2C11DestinationO_AC05ArrayE0OAC04BoolE0Otcfc":{"name":"init(destination:arrayEncoding:boolEncoding:)","abstract":"

Creates an instance using the specified parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV15queryComponents7fromKey5valueSaySS_SStGSS_yptF":{"name":"queryComponents(fromKey:value:)","abstract":"

Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV6escapeyS2SF":{"name":"escape(_:)","abstract":"

Creates a percent-escaped string following RFC 3986 for a query string key or value.

","parent_name":"URLEncoding"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV7connectACvpZ":{"name":"connect","abstract":"

CONNECT method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV6deleteACvpZ":{"name":"delete","abstract":"

DELETE method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV3getACvpZ":{"name":"get","abstract":"

GET method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV4headACvpZ":{"name":"head","abstract":"

HEAD method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV7optionsACvpZ":{"name":"options","abstract":"

OPTIONS method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5patchACvpZ":{"name":"patch","abstract":"

PATCH method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV4postACvpZ":{"name":"post","abstract":"

POST method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV3putACvpZ":{"name":"put","abstract":"

PUT method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5queryACvpZ":{"name":"query","abstract":"

QUERY method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5traceACvpZ":{"name":"trace","abstract":"

TRACE method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:SY8rawValue03RawB0Qzvp":{"name":"rawValue","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:SY8rawValuexSg03RawB0Qz_tcfc":{"name":"init(rawValue:)","parent_name":"HTTPMethod"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV4nameSSvp":{"name":"name","abstract":"

Name of the header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV5valueSSvp":{"name":"value","abstract":"

Value of the header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV4name5valueACSS_SStcfc":{"name":"init(name:value:)","abstract":"

Creates an instance from the given name and value.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV6acceptyACSSFZ":{"name":"accept(_:)","abstract":"

Returns an Accept header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13acceptCharsetyACSSFZ":{"name":"acceptCharset(_:)","abstract":"

Returns an Accept-Charset header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV14acceptLanguageyACSSFZ":{"name":"acceptLanguage(_:)","abstract":"

Returns an Accept-Language header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV14acceptEncodingyACSSFZ":{"name":"acceptEncoding(_:)","abstract":"

Returns an Accept-Encoding header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorization8username8passwordACSS_SStFZ":{"name":"authorization(username:password:)","abstract":"

Returns a Basic Authorization header using the username and password provided.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorization11bearerTokenACSS_tFZ":{"name":"authorization(bearerToken:)","abstract":"

Returns a Bearer Authorization header using the bearerToken provided

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorizationyACSSFZ":{"name":"authorization(_:)","abstract":"

Returns an Authorization header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV18contentDispositionyACSSFZ":{"name":"contentDisposition(_:)","abstract":"

Returns a Content-Disposition header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV15contentEncodingyACSSFZ":{"name":"contentEncoding(_:)","abstract":"

Returns a Content-Encoding header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV11contentTypeyACSSFZ":{"name":"contentType(_:)","abstract":"

Returns a Content-Type header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV9userAgentyACSSFZ":{"name":"userAgent(_:)","abstract":"

Returns a User-Agent header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV21defaultAcceptEncodingACvpZ":{"name":"defaultAcceptEncoding","abstract":"

Returns Alamofire’s default Accept-Encoding header, appropriate for the encodings supported by particular OS","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV21defaultAcceptLanguageACvpZ":{"name":"defaultAcceptLanguage","abstract":"

Returns Alamofire’s default Accept-Language header, generated by querying Locale for the user’s","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV16defaultUserAgentACvpZ":{"name":"defaultUserAgent","abstract":"

Returns Alamofire’s default User-Agent header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVACycfc":{"name":"init()","abstract":"

Creates an empty instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVyACSayAA10HTTPHeaderVGcfc":{"name":"init(_:)","abstract":"

Creates an instance from an array of HTTPHeaders. Duplicate case-insensitive names are collapsed into the last","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVyACSDyS2SGcfc":{"name":"init(_:)","abstract":"

Creates an instance from a [String: String]. Duplicate case-insensitive names are collapsed into the last name","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV3add4name5valueySS_SStF":{"name":"add(name:value:)","abstract":"

Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV3addyyAA10HTTPHeaderVF":{"name":"add(_:)","abstract":"

Case-insensitively updates or appends the provided HTTPHeader into the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6update4name5valueySS_SStF":{"name":"update(name:value:)","abstract":"

Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6updateyyAA10HTTPHeaderVF":{"name":"update(_:)","abstract":"

Case-insensitively updates or appends the provided HTTPHeader into the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6remove4nameySS_tF":{"name":"remove(name:)","abstract":"

Case-insensitively removes an HTTPHeader, if it exists, from the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV4sortyyF":{"name":"sort()","abstract":"

Sort the current instance by header name, case insensitively.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6sortedACyF":{"name":"sorted()","abstract":"

Returns an instance sorted by header name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV5value3forSSSgSS_tF":{"name":"value(for:)","abstract":"

Case-insensitively find a header’s value by name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVySSSgSScip":{"name":"subscript(_:)","abstract":"

Case-insensitively access the header with the given name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV10dictionarySDyS2SGvp":{"name":"dictionary","abstract":"

The dictionary representation of all headers.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s30ExpressibleByDictionaryLiteralP010dictionaryD0x3KeyQz_5ValueQztd_tcfc":{"name":"init(dictionaryLiteral:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s25ExpressibleByArrayLiteralP05arrayD0x0cD7ElementQzd_tcfc":{"name":"init(arrayLiteral:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:ST12makeIterator0B0QzyF":{"name":"makeIterator()","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl5index5after5IndexQzAD_tF":{"name":"index(after:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV7defaultACvpZ":{"name":"default","abstract":"

The default set of HTTPHeaders used by Alamofire. Includes Accept-Encoding, Accept-Language, and","parent_name":"HTTPHeaders"},"Structs/StreamOf/Iterator.html#/s:ScI4next7ElementQzSgyYaKF":{"name":"next()","parent_name":"Iterator"},"Structs/StreamOf.html#/s:Sci13AsyncIteratorQa":{"name":"AsyncIterator","parent_name":"StreamOf"},"Structs/StreamOf.html#/s:9Alamofire8StreamOfV15BufferingPolicya":{"name":"BufferingPolicy","abstract":"

Undocumented

","parent_name":"StreamOf"},"Structs/StreamOf.html#/s:Sci17makeAsyncIterator0bC0QzyF":{"name":"makeAsyncIterator()","parent_name":"StreamOf"},"Structs/StreamOf/Iterator.html":{"name":"Iterator","abstract":"

Undocumented

","parent_name":"StreamOf"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV0C0a":{"name":"Stream","abstract":"

Undocumented

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV09streamingB023automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_10Foundation0B0Vs5NeverOGGSb_ScS12ContinuationV09BufferingI0OyAR__GtF":{"name":"streamingData(automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of Data values from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV16streamingStrings23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_SSs5NeverOGGSb_ScS12ContinuationV09BufferingJ0OyAO__GtF":{"name":"streamingStrings(automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of UTF-8 Strings from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV19streamingDecodables_23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_xAA7AFErrorOGGxm_SbScS12ContinuationV09BufferingJ0OyAO__GtSeRzlF":{"name":"streamingDecodables(_:automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of Decodable values from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV18streamingResponses15serializedUsing23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_16SerializedObjectQzAA7AFErrorOGGx_SbScS12ContinuationV09BufferingL0OyAR__GtAA0bC10SerializerRzlF":{"name":"streamingResponses(serializedUsing:automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of values using the provided DataStreamSerializer from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV8responseAA0B8ResponseVyxAA7AFErrorOGvp":{"name":"response","abstract":"

DownloadResponse produced by the DownloadRequest and its response handler.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6results6ResultOyxAA7AFErrorOGvp":{"name":"result","abstract":"

Result of any response serialization performed for the response.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV5valuexvp":{"name":"value","abstract":"

Value returned by the response.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DownloadRequest and Task.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DownloadRequest.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DownloadRequest.

","parent_name":"DownloadTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV8responseAA0B8ResponseVyxAA7AFErrorOGvp":{"name":"response","abstract":"

DataResponse produced by the DataRequest and its response handler.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6results6ResultOyxAA7AFErrorOGvp":{"name":"result","abstract":"

Result of any response serialization performed for the response.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV5valuexvp":{"name":"value","abstract":"

Value returned by the response.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DataRequest and Task.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DataRequest.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DataRequest.

","parent_name":"DataTask"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0C10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided ResponseSerializer.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC18SerializerProtocolRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DownloadResponseSerializerProtocol value.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DownloadResponse value.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the Result of the DownloadResponse as a single Value or fail with the AFError instance.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherVAA10Foundation3URLVSgRszlE_5queueACyAGGAA0B7RequestC_So012OS_dispatch_G0Ctcfc":{"name":"init(_:queue:)","abstract":"

Creates an instance which publishes a DownloadResponse<URL?, AFError> value without serialization.

","parent_name":"DownloadResponsePublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV_5queue10serializerACyxGAA0bC7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DataStreamSerializer.

","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DataStreamRequest.Stream‘s Events.

","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the streamed values of the DataStreamRequest.Stream as a sequence of Value or fail with the","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DataStreamPublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0C10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided ResponseSerializer.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC18SerializerProtocolRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DataResponseSerializerProtocol.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DataResponse value.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the Result of the DataResponse as a single Value or fail with the AFError instance.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherVAA10Foundation0B0VSgRszlE_5queueACyAGGAA0B7RequestC_So012OS_dispatch_F0Ctcfc":{"name":"init(_:queue:)","abstract":"

Creates an instance which publishes a DataResponse<Data?, AFError> value without serialization.

","parent_name":"DataResponsePublisher"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO5cacheyA2EmF":{"name":"cache","abstract":"

Stores the cached response in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO10doNotCacheyA2EmF":{"name":"doNotCache","abstract":"

Prevents the cached response from being stored in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO6modifyyAESo19NSCachedURLResponseCSgSo20NSURLSessionDataTaskC_AHtccAEmF":{"name":"modify(_:)","abstract":"

Modifies the cached response before storing it in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html":{"name":"Behavior","abstract":"

Defines the behavior of the ResponseCacher type.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV5cacheACvpZ":{"name":"cache","abstract":"

Returns a ResponseCacher with a .cache Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV10doNotCacheACvpZ":{"name":"doNotCache","abstract":"

Returns a ResponseCacher with a .doNotCache Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV8behaviorAC8BehaviorOvp":{"name":"behavior","abstract":"

The Behavior of the ResponseCacher.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV8behaviorA2C8BehaviorO_tcfc":{"name":"init(behavior:)","abstract":"

Creates a ResponseCacher instance from the Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire21CachedResponseHandlerP8dataTask_09willCacheC010completionySo016NSURLSessionDataF0C_So19NSCachedURLResponseCyAJSgctF":{"name":"dataTask(_:willCacheResponse:completion:)","parent_name":"ResponseCacher"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionV4typexvp":{"name":"type","abstract":"

Stores the type or meta-type of any extended type.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVyACyxGxcfc":{"name":"init(_:)","abstract":"

Create an instance from the provided value.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE12certificatesSaySo17SecCertificateRefaGvp":{"name":"certificates","abstract":"

Returns all valid cer, crt, and der certificates in the bundle.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE10publicKeysSaySo9SecKeyRefaGvp":{"name":"publicKeys","abstract":"

Returns all public keys for the valid certificates in the bundle.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE5paths19forResourcesOfTypesSaySSGAH_tF":{"name":"paths(forResourcesOfTypes:)","abstract":"

Returns all pathnames for the resources identified by the provided file extensions.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8evaluate13afterApplyingySo0c6PolicyE0a_tKF":{"name":"evaluate(afterApplying:)","abstract":"

Evaluates self after applying the SecPolicy value provided.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8validate6policy13errorProducerySo0c6PolicyE0a_s5Error_ps5Int32V_So0cD10ResultTypeVtXEtKF":{"name":"validate(policy:errorProducer:)","abstract":"

Attempts to validate self using the SecPolicy provided and transforming any error produced using the closure passed.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE5apply6policyAESo0c6PolicyE0a_tKF":{"name":"apply(policy:)","abstract":"

Applies a SecPolicy to self, throwing if it fails.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8evaluateyyKF":{"name":"evaluate()","abstract":"

Evaluate self, throwing an Error if evaluation fails.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8validate13errorProducerys5Error_ps5Int32V_So0cD10ResultTypeVtXE_tKF":{"name":"validate(errorProducer:)","abstract":"

Validate self, passing any failure values through errorProducer.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE21setAnchorCertificatesyySaySo0c11CertificateE0aGKF":{"name":"setAnchorCertificates(_:)","abstract":"

Sets a custom certificate chain on self, allowing full validation of a self-signed certificate and its chain.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE10publicKeysSaySo0c3KeyE0aGvp":{"name":"publicKeys","abstract":"

The public keys contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE12certificatesSaySo0c11CertificateE0aGvp":{"name":"certificates","abstract":"

The SecCertificates contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE15certificateDataSay10Foundation0G0VGvp":{"name":"certificateData","abstract":"

The Data values for all certificates contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE24performDefaultValidation7forHostySS_tKF":{"name":"performDefaultValidation(forHost:)","abstract":"

Validates self after applying SecPolicy.af.default. This evaluation does not validate the hostname.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE17performValidation7forHostySS_tKF":{"name":"performValidation(forHost:)","abstract":"

Validates self after applying SecPolicy.af.hostname(host), which performs the default validation as well as","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE7defaultAEvpZ":{"name":"default","abstract":"

Creates a SecPolicy instance which will validate server certificates but not require a host name match.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE8hostnameyAESSFZ":{"name":"hostname(_:)","abstract":"

Creates a SecPolicy instance which will validate server certificates and much match the provided hostname.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE10revocation7optionsAeA24RevocationTrustEvaluatorC7OptionsV_tKFZ":{"name":"revocation(options:)","abstract":"

Creates a SecPolicy which checks the revocation of certificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASaySo17SecCertificateRefaGRszlE4dataSay10Foundation4DataVGvp":{"name":"data","abstract":"

All Data values for the contained SecCertificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASaySo17SecCertificateRefaGRszlE10publicKeysSaySo0c3KeyE0aGvp":{"name":"publicKeys","abstract":"

All public SecKey values for the contained SecCertificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo17SecCertificateRefaRszlE9publicKeySo0cgE0aSgvp":{"name":"publicKey","abstract":"

The public key for self, if it can be extracted.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAAs5Int32VRszlE9isSuccessSbvp":{"name":"isSuccess","abstract":"

Returns whether self is errSecSuccess.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo18SecTrustResultTypeVRszlE9isSuccessSbvp":{"name":"isSuccess","abstract":"

Returns whether self is.unspecifiedor.proceed`.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo25NSURLSessionConfigurationCRbzlE7defaultAEvpZ":{"name":"default","abstract":"

Alamofire’s default configuration. Same as URLSessionConfiguration.default but adds Alamofire default","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo25NSURLSessionConfigurationCRbzlE9ephemeralAEvpZ":{"name":"ephemeral","abstract":"

.ephemeral configuration with Alamofire’s default Accept-Language, Accept-Encoding, and User-Agent","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html":{"name":"AlamofireExtension","abstract":"

Type that acts as a generic extension point for all AlamofireExtended types.

"},"Structs/ResponseCacher.html":{"name":"ResponseCacher","abstract":"

ResponseCacher is a convenience CachedResponseHandler making it easy to cache, not cache, or modify a cached"},"Structs/DataResponsePublisher.html":{"name":"DataResponsePublisher","abstract":"

A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

"},"Structs/DataStreamPublisher.html":{"name":"DataStreamPublisher","abstract":"

Undocumented

"},"Structs/DownloadResponsePublisher.html":{"name":"DownloadResponsePublisher","abstract":"

A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

"},"Structs/DataTask.html":{"name":"DataTask","abstract":"

Value used to await a DataResponse and associated values.

"},"Structs/DownloadTask.html":{"name":"DownloadTask","abstract":"

Value used to await a DownloadResponse and associated values.

"},"Structs/DataStreamTask.html":{"name":"DataStreamTask","abstract":"

Undocumented

"},"Structs/StreamOf.html":{"name":"StreamOf","abstract":"

An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

"},"Structs/HTTPHeaders.html":{"name":"HTTPHeaders","abstract":"

An order-preserving and case-insensitive representation of HTTP headers.

"},"Structs/HTTPHeader.html":{"name":"HTTPHeader","abstract":"

A representation of a single HTTP header’s name / value pair.

"},"Structs/HTTPMethod.html":{"name":"HTTPMethod","abstract":"

Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so"},"Structs/URLEncoding.html":{"name":"URLEncoding","abstract":"

Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP"},"Structs/JSONEncoding.html":{"name":"JSONEncoding","abstract":"

Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the"},"Structs/Redirector.html":{"name":"Redirector","abstract":"

Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

"},"Structs/DeflateRequestCompressor.html":{"name":"DeflateRequestCompressor","abstract":"

RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the"},"Structs/RequestAdapterState.html":{"name":"RequestAdapterState","abstract":"

Stores all state associated with a URLRequest being adapted.

"},"Structs/DataResponse.html":{"name":"DataResponse","abstract":"

Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

"},"Structs/DownloadResponse.html":{"name":"DownloadResponse","abstract":"

Used to store all data associated with a serialized response of a download request.

"},"Structs/PassthroughPreprocessor.html":{"name":"PassthroughPreprocessor","abstract":"

DataPreprocessor that returns passed Data without any transform.

"},"Structs/GoogleXSSIPreprocessor.html":{"name":"GoogleXSSIPreprocessor","abstract":"

DataPreprocessor that trims Google’s typical )]}',\\n XSSI JSON header.

"},"Structs/URLResponseSerializer.html":{"name":"URLResponseSerializer","abstract":"

A DownloadResponseSerializerProtocol that performs only Error checking and ensures that a downloaded fileURL"},"Structs/Empty.html":{"name":"Empty","abstract":"

Type representing an empty value. Use Empty.value to get the static instance.

"},"Structs/DecodableStreamSerializer.html":{"name":"DecodableStreamSerializer","abstract":"

DataStreamSerializer which uses the provided DataPreprocessor and DataDecoder to serialize the incoming Data.

"},"Structs/PassthroughStreamSerializer.html":{"name":"PassthroughStreamSerializer","abstract":"

DataStreamSerializer which performs no serialization on incoming Data.

"},"Structs/StringStreamSerializer.html":{"name":"StringStreamSerializer","abstract":"

DataStreamSerializer which serializes incoming stream Data into UTF8-decoded String values.

"},"Protocols/URLRequestConvertible.html#/s:9Alamofire21URLRequestConvertibleP02asB010Foundation0B0VyKF":{"name":"asURLRequest()","abstract":"

Returns a URLRequest or throws if an Error was encountered.

","parent_name":"URLRequestConvertible"},"Protocols/URLRequestConvertible.html#/s:9Alamofire21URLRequestConvertiblePAAE10urlRequest10Foundation0B0VSgvp":{"name":"urlRequest","abstract":"

The URLRequest returned by discarding any Error encountered.

","parent_name":"URLRequestConvertible"},"Protocols/URLConvertible.html#/s:9Alamofire14URLConvertibleP5asURL10Foundation0D0VyKF":{"name":"asURL()","abstract":"

Returns a URL from the conforming instance or throws.

","parent_name":"URLConvertible"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","abstract":"

Evaluates the given SecTrust value for the given host.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010RevocationC9EvaluatorCRszrlE18revocationCheckingAEvpZ":{"name":"revocationChecking","abstract":"

Provides a default RevocationTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010RevocationC9EvaluatorCRszrlE18revocationChecking24performDefaultValidation12validateHost7optionsAESb_SbAE7OptionsVtFZ":{"name":"revocationChecking(performDefaultValidation:validateHost:options:)","abstract":"

Creates a RevocationTrustEvaluator using the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A018PinnedCertificatesC9EvaluatorCRszrlE06pinnedF0AEvpZ":{"name":"pinnedCertificates","abstract":"

Provides a default PinnedCertificatesTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A018PinnedCertificatesC9EvaluatorCRszrlE06pinnedF012certificates016acceptSelfSignedF024performDefaultValidation12validateHostAESaySo17SecCertificateRefaG_S3btFZ":{"name":"pinnedCertificates(certificates:acceptSelfSignedCertificates:performDefaultValidation:validateHost:)","abstract":"

Creates a PinnedCertificatesTrustEvaluator using the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010PublicKeysC9EvaluatorCRszrlE06publicF0AEvpZ":{"name":"publicKeys","abstract":"

Provides a default PublicKeysTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010PublicKeysC9EvaluatorCRszrlE06publicF04keys24performDefaultValidation12validateHostAESaySo9SecKeyRefaG_S2btFZ":{"name":"publicKeys(keys:performDefaultValidation:validateHost:)","abstract":"

Creates a PublicKeysTrustEvaluator from the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A09CompositeC9EvaluatorCRszrlE9composite10evaluatorsAESayAaB_pG_tFZ":{"name":"composite(evaluators:)","abstract":"

Creates a CompositeTrustEvaluator from the provided evaluators.

","parent_name":"ServerTrustEvaluating"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

Type produced from the serialized Data.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","abstract":"

Serializes incoming Data into a SerializedObject value.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPAAE9decodable2of7decoder16dataPreprocessorAA09DecodablecD0Vyqd__Gqd__m_AA0B7Decoder_pAA0bI0_ptAJRszSeRd__lFZ":{"name":"decodable(of:decoder:dataPreprocessor:)","abstract":"

Creates a DecodableStreamSerializer instance with the provided DataDecoder and DataPreprocessor.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPA2A011PassthroughcD0VRszrlE11passthroughAEvpZ":{"name":"passthrough","abstract":"

Provides a PassthroughStreamSerializer instance.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPA2A06StringcD0VRszrlE6stringAEvpZ":{"name":"string","abstract":"

Provides a StringStreamSerializer instance.

","parent_name":"DataStreamSerializer"},"Protocols/DataDecoder.html#/s:9Alamofire11DataDecoderP6decode_4fromqd__qd__m_10Foundation0B0VtKSeRd__lF":{"name":"decode(_:from:)","abstract":"

Decode Data into the provided type.

","parent_name":"DataDecoder"},"Protocols/EmptyResponse.html#/s:9Alamofire13EmptyResponseP10emptyValuexyFZ":{"name":"emptyValue()","abstract":"

Empty value for the conforming type.

","parent_name":"EmptyResponse"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","abstract":"

Process Data before it’s handled by a serializer.

","parent_name":"DataPreprocessor"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorPA2A011PassthroughC0VRszrlE11passthroughAEvpZ":{"name":"passthrough","abstract":"

Provides a PassthroughPreprocessor instance.

","parent_name":"DataPreprocessor"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorPA2A22GoogleXSSIPreprocessorVRszrlE10googleXSSIAEvpZ":{"name":"googleXSSI","abstract":"

Provides a GoogleXSSIPreprocessor instance.

","parent_name":"DataPreprocessor"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","abstract":"

DataPreprocessor used to prepare incoming Data for serialization.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","abstract":"

HTTPMethods for which empty response bodies are considered appropriate.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","abstract":"

HTTP response codes for which empty response bodies are considered appropriate.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE23defaultDataPreprocessorAA0eF0_pvpZ":{"name":"defaultDataPreprocessor","abstract":"

Default DataPreprocessor. PassthroughPreprocessor by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE26defaultEmptyRequestMethodsShyAA10HTTPMethodVGvpZ":{"name":"defaultEmptyRequestMethods","abstract":"

Default HTTPMethods for which empty response bodies are considered appropriate. [.head] by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE012defaultEmptyB5CodesShySiGvpZ":{"name":"defaultEmptyResponseCodes","abstract":"

HTTP response codes for which empty response bodies are considered appropriate. [204, 205] by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE018requestAllowsEmptyB4DataySbSg10Foundation10URLRequestVSgF":{"name":"requestAllowsEmptyResponseData(_:)","abstract":"

Determines whether the request allows empty response bodies, if request exists.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE019responseAllowsEmptyB4DataySbSgSo17NSHTTPURLResponseCSgF":{"name":"responseAllowsEmptyResponseData(_:)","abstract":"

Determines whether the response allows empty response bodies, if response exists`.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE05emptyB7Allowed10forRequest8responseSb10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgtF":{"name":"emptyResponseAllowed(forRequest:response:)","abstract":"

Determines whether request and response allow empty response bodies.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE9decodable2of16dataPreprocessor7decoder05emptyB5Codes0I14RequestMethodsAA09DecodablebC0Cyqd__Gqd__m_AA04DataG0_pAA0N7Decoder_pShySiGShyAA10HTTPMethodVGtALRszSeRd__lFZ":{"name":"decodable(of:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DecodableResponseSerializer using the values provided.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A04DatabC0CRszrlE4dataAEvpZ":{"name":"data","abstract":"

Provides a default DataResponseSerializer instance.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A04DatabC0CRszrlE4data0E12Preprocessor05emptyB5Codes0G14RequestMethodsAeA0dF0_p_ShySiGShyAA10HTTPMethodVGtFZ":{"name":"data(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponseSerializer using the provided parameters.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A06StringbC0CRszrlE6stringAEvpZ":{"name":"string","abstract":"

Provides a default StringResponseSerializer instance.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A06StringbC0CRszrlE6string16dataPreprocessor8encoding05emptyB5Codes0I14RequestMethodsAeA04DataG0_p_SS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtFZ":{"name":"string(dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a StringResponseSerializer with the provided values.

","parent_name":"ResponseSerializer"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

The type of serialized object to be created.

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolP09serializeB07request8response7fileURL5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0J0VSgs5Error_pSgtKF":{"name":"serializeDownload(request:response:fileURL:error:)","abstract":"

Serialize the downloaded response Data from disk into the provided type..

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolPA2A011URLResponseD0VRszrlE3urlAEvpZ":{"name":"url","abstract":"

Provides a URLResponseSerializer instance.

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DataResponseSerializerProtocol.html#/s:9Alamofire30DataResponseSerializerProtocolP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

The type of serialized object to be created.

","parent_name":"DataResponseSerializerProtocol"},"Protocols/DataResponseSerializerProtocol.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","abstract":"

Serialize the response Data into the provided type..

","parent_name":"DataResponseSerializerProtocol"},"Protocols/RequestRetrier.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","abstract":"

Determines whether the Request should be retried by calling the completion closure.

","parent_name":"RequestRetrier"},"Protocols/RequestRetrier.html#/s:9Alamofire14RequestRetrierPA2A0C0CRszrlE7retrier5usingAEyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctc_tFZ":{"name":"retrier(using:)","abstract":"

Creates a Retrier using the provided RetryHandler closure.

","parent_name":"RequestRetrier"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","abstract":"

Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

","parent_name":"RequestAdapter"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","abstract":"

Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

","parent_name":"RequestAdapter"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterPA2A0C0CRszrlE7adapter5usingAEy10Foundation10URLRequestV_AA7SessionCys6ResultOyAJs5Error_pGctc_tFZ":{"name":"adapter(using:)","abstract":"

Creates an Adapter using the provided AdaptHandler closure.

","parent_name":"RequestAdapter"},"Protocols/RequestInterceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A07DeflateB10CompressorVRszrlE07deflateE0AEvpZ":{"name":"deflateCompressor","abstract":"

Create a DeflateRequestCompressor with default duplicateHeaderBehavior and shouldCompressBodyData values.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A07DeflateB10CompressorVRszrlE07deflateE023duplicateHeaderBehavior22shouldCompressBodyDataA2E09DuplicatehI0O_Sb10Foundation0M0VctFZ":{"name":"deflateCompressor(duplicateHeaderBehavior:shouldCompressBodyData:)","abstract":"

Creates a DeflateRequestCompressor with the provided DuplicateHeaderBehavior and shouldCompressBodyData","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor7adapter7retrierAEy10Foundation10URLRequestV_AA7SessionCys6ResultOyAKs5Error_pGctc_yAA0B0C_AMsAP_pyAA05RetryJ0OctctFZ":{"name":"interceptor(adapter:retrier:)","abstract":"

Creates an Interceptor using the provided AdaptHandler and RetryHandler closures.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor7adapter7retrierAeA0B7Adapter_p_AA0B7Retrier_ptFZ":{"name":"interceptor(adapter:retrier:)","abstract":"

Creates an Interceptor using the provided RequestAdapter and RequestRetrier instances.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor8adapters8retriers12interceptorsAESayAA0B7Adapter_pG_SayAA0B7Retrier_pGSayAaB_pGtFZ":{"name":"interceptor(adapters:retriers:interceptors:)","abstract":"

Creates an Interceptor using the provided RequestAdapters, RequestRetriers, and RequestInterceptors.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A11RetryPolicyCRszrlE05retryE0AEvpZ":{"name":"retryPolicy","abstract":"

Provides a default RetryPolicy instance.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A11RetryPolicyCRszrlE05retryE00F5Limit22exponentialBackoffBase0hI5Scale20retryableHTTPMethods0L15HTTPStatusCodes0l8URLErrorO0AESu_SuSdShyAA10HTTPMethodVGShySiGShy10Foundation0P0V4CodeVGtFZ":{"name":"retryPolicy(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:retryableHTTPStatusCodes:retryableURLErrorCodes:)","abstract":"

Creates an RetryPolicy from the specified parameters.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A25ConnectionLostRetryPolicyCRszrlE010connectionefG0AEvpZ":{"name":"connectionLostRetryPolicy","abstract":"

Provides a default ConnectionLostRetryPolicy instance.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A25ConnectionLostRetryPolicyCRszrlE010connectionefG010retryLimit22exponentialBackoffBase0kL5Scale20retryableHTTPMethodsAESu_SuSdShyAA10HTTPMethodVGtFZ":{"name":"connectionLostRetryPolicy(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:)","abstract":"

Creates a ConnectionLostRetryPolicy instance from the specified parameters.

","parent_name":"RequestInterceptor"},"Protocols/UploadableConvertible.html#/s:9Alamofire21UploadableConvertibleP06createB0AA13UploadRequestC0B0OyKF":{"name":"createUploadable()","abstract":"

Produces an UploadRequest.Uploadable value from the instance.

","parent_name":"UploadableConvertible"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP20sessionConfigurationSo012NSURLSessionE0Cvp":{"name":"sessionConfiguration","abstract":"

URLSessionConfiguration used to create the underlying URLSessionTasks.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP16startImmediatelySbvp":{"name":"startImmediately","abstract":"

Determines whether the Request should automatically call resume() when adding the first response handler.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP7cleanup5afteryAA0B0C_tF":{"name":"cleanup(after:)","abstract":"

Notifies the delegate the Request has reached a point where it needs cleanup.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP11retryResult3for5dueTo10completionyAA0B0C_AA7AFErrorOyAA05RetryE0OctF":{"name":"retryResult(for:dueTo:completion:)","abstract":"

Asynchronously ask the delegate whether a Request will be retried.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP05retryB0_9withDelayyAA0B0C_SdSgtF":{"name":"retryRequest(_:withDelay:)","abstract":"

Asynchronously retry the Request.

","parent_name":"RequestDelegate"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerP4task_18willBeRedirectedTo3for10completionySo16NSURLSessionTaskC_10Foundation10URLRequestVSo17NSHTTPURLResponseCyALSgctF":{"name":"task(_:willBeRedirectedTo:for:completion:)","abstract":"

Determines how the HTTP redirect response should be redirected to the new request.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE6followAEvpZ":{"name":"follow","abstract":"

Provides a Redirector which follows redirects. Equivalent to Redirector.follow.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE11doNotFollowAEvpZ":{"name":"doNotFollow","abstract":"

Provides a Redirector which does not follow redirects. Equivalent to Redirector.doNotFollow.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE6modify5usingAE10Foundation10URLRequestVSgSo16NSURLSessionTaskC_AJSo17NSHTTPURLResponseCtc_tFZ":{"name":"modify(using:)","abstract":"

Creates a Redirector which modifies the redirected URLRequest using the provided closure.

","parent_name":"RedirectHandler"},"Protocols/ParameterEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","abstract":"

Creates a URLRequest by encoding parameters and applying them on the passed request.

","parent_name":"ParameterEncoding"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","abstract":"

Encode the provided Encodable parameters into request.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A013JSONParameterC0CRszrlE4jsonAEvpZ":{"name":"json","abstract":"

Provides a default JSONParameterEncoder instance.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A013JSONParameterC0CRszrlE4json7encoderAE10Foundation11JSONEncoderC_tFZ":{"name":"json(encoder:)","abstract":"

Creates a JSONParameterEncoder using the provided JSONEncoder.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A014URLEncodedFormbC0CRszrlE010urlEncodedE0AEvpZ":{"name":"urlEncodedForm","abstract":"

Provides a default URLEncodedFormParameterEncoder instance.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A014URLEncodedFormbC0CRszrlE010urlEncodedE07encoder11destinationAeA0deC0C_AE11DestinationOtFZ":{"name":"urlEncodedForm(encoder:destination:)","abstract":"

Creates a URLEncodedFormParameterEncoder with the provided encoder and destination.

","parent_name":"ParameterEncoder"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","abstract":"

The DispatchQueue onto which Alamofire’s root CompositeEventMonitor will dispatch events. .main by default.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","abstract":"

Event called during URLSessionDelegate‘s urlSession(_:didBecomeInvalidWithError:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didReceive:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:needNewBodyStream:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didFinishCollecting:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didCompleteWithError:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:taskIsWaitingForConnectivity:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:willCacheResponse:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didFinishDownloadingTo:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","abstract":"

Event called when a URLRequest is first created for a Request. If a RequestAdapter is active, the","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","abstract":"

Event called when the attempt to create a URLRequest from a Request‘s original URLRequestConvertible value fails.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","abstract":"

Event called when a RequestAdapter adapts the Request‘s initial URLRequest.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","abstract":"

Event called when a RequestAdapter fails to adapt the Request‘s initial URLRequest.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","abstract":"

Event called when a final URLRequest is created for a Request.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","abstract":"

Event called when a URLSessionTask subclass instance is created for a Request.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","abstract":"

Event called when a Request receives a URLSessionTaskMetrics value.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","abstract":"

Event called when a Request fails due to an error created by Alamofire. e.g. When certificate pinning fails.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","abstract":"

Event called when a Request‘s task completes, possibly with an error. A Request may receive this event","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","abstract":"

Event called when a Request is about to be retried.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","abstract":"

Event called when a Request finishes and response serializers are being called.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","abstract":"

Event called when a Request receives a resume call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is resumed.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","abstract":"

Event called when a Request receives a suspend call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is suspended.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","abstract":"

Event called when a Request receives a cancel call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is cancelled.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","abstract":"

Event called when a DataRequest calls a Validation.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DataRequest creates a DataResponse<Data?> value without calling a ResponseSerializer.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DataRequest calls a ResponseSerializer and creates a generic DataResponse<Value, AFError>.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","abstract":"

Event called when a DataStreamRequest calls a Validation closure.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didParseStreamyAA04DataG7RequestC_s6ResultOyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseStream:)","abstract":"

Event called when a DataStreamSerializer produces a value from streamed Data.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","abstract":"

Event called when an UploadRequest creates its Uploadable value, indicating the type of upload it represents.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","abstract":"

Event called when an UploadRequest failed to create its Uploadable value due to an error.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","abstract":"

Event called when an UploadRequest provides the InputStream from its Uploadable value. This only occurs if","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","abstract":"

Event called when a DownloadRequest‘s URLSessionDownloadTask finishes and the temporary file has been moved.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","abstract":"

Event called when a DownloadRequest‘s Destination closure is called and creates the destination URL the","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","abstract":"

Event called when a DownloadRequest calls a Validation.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DownloadRequest creates a DownloadResponse<URL?, AFError> without calling a ResponseSerializer.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DownloadRequest calls a DownloadResponseSerializer and creates a generic DownloadResponse<Value, AFError>

","parent_name":"EventMonitor"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerP8dataTask_09willCacheC010completionySo016NSURLSessionDataF0C_So19NSCachedURLResponseCyAJSgctF":{"name":"dataTask(_:willCacheResponse:completion:)","abstract":"

Determines whether the HTTP response should be stored in the cache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE5cacheAEvpZ":{"name":"cache","abstract":"

Provides a ResponseCacher which caches the response, if allowed. Equivalent to ResponseCacher.cache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE10doNotCacheAEvpZ":{"name":"doNotCache","abstract":"

Provides a ResponseCacher which does not cache the response. Equivalent to ResponseCacher.doNotCache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE6modify5usingAESo19NSCachedURLResponseCSgSo20NSURLSessionDataTaskC_AItc_tFZ":{"name":"modify(using:)","abstract":"

Creates a ResponseCacher which modifies the proposed CachedURLResponse using the provided closure.

","parent_name":"CachedResponseHandler"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP10CredentialQa":{"name":"Credential","abstract":"

The type of credential associated with the Authenticator instance.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP5apply_2toy10CredentialQz_10Foundation10URLRequestVztF":{"name":"apply(_:to:)","abstract":"

Applies the Credential to the URLRequest.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP7refresh_3for10completiony10CredentialQz_AA7SessionCys6ResultOyAHs5Error_pGctF":{"name":"refresh(_:for:completion:)","abstract":"

Refreshes the Credential and executes the completion closure with the Result once complete.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP10didRequest_4with28failDueToAuthenticationErrorSb10Foundation10URLRequestV_So17NSHTTPURLResponseCs0J0_ptF":{"name":"didRequest(_:with:failDueToAuthenticationError:)","abstract":"

Determines whether the URLRequest failed due to an authentication error based on the HTTPURLResponse.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP9isRequest_17authenticatedWithSb10Foundation10URLRequestV_10CredentialQztF":{"name":"isRequest(_:authenticatedWith:)","abstract":"

Determines whether the URLRequest is authenticated with the Credential.

","parent_name":"Authenticator"},"Protocols/AuthenticationCredential.html#/s:9Alamofire24AuthenticationCredentialP15requiresRefreshSbvp":{"name":"requiresRefresh","abstract":"

Whether the credential requires a refresh. This property should always return true when the credential is","parent_name":"AuthenticationCredential"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP0B4TypeQa":{"name":"ExtendedType","abstract":"

Type being extended.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP2afAA0A9ExtensionVy0B4TypeQzGmvpZ":{"name":"af","abstract":"

Static Alamofire extension point.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP2afAA0A9ExtensionVy0B4TypeQzGvp":{"name":"af","abstract":"

Instance Alamofire extension point.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html":{"name":"AlamofireExtended","abstract":"

Protocol describing the af extension points for Alamofire extended types.

"},"Protocols/AuthenticationCredential.html":{"name":"AuthenticationCredential","abstract":"

Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

"},"Protocols/Authenticator.html":{"name":"Authenticator","abstract":"

Types adopting the Authenticator protocol can be used to authenticate URLRequests with an"},"Protocols/CachedResponseHandler.html":{"name":"CachedResponseHandler","abstract":"

A type that handles whether the data task should store the HTTP response in the cache.

"},"Protocols/EventMonitor.html":{"name":"EventMonitor","abstract":"

Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various"},"Protocols/ParameterEncoder.html":{"name":"ParameterEncoder","abstract":"

A type that can encode any Encodable type into a URLRequest.

"},"Protocols/ParameterEncoding.html":{"name":"ParameterEncoding","abstract":"

A type used to define how a set of parameters are applied to a URLRequest.

"},"Protocols/RedirectHandler.html":{"name":"RedirectHandler","abstract":"

A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

"},"Protocols/RequestDelegate.html":{"name":"RequestDelegate","abstract":"

Protocol abstraction for Request‘s communication back to the SessionDelegate.

"},"Protocols/UploadableConvertible.html":{"name":"UploadableConvertible","abstract":"

A type that can produce an UploadRequest.Uploadable value.

"},"Protocols.html#/s:9Alamofire17UploadConvertibleP":{"name":"UploadConvertible","abstract":"

A type that can be converted to an upload, whether from an UploadRequest.Uploadable or URLRequestConvertible.

"},"Protocols/RequestInterceptor.html":{"name":"RequestInterceptor","abstract":"

Type that provides both RequestAdapter and RequestRetrier functionality.

"},"Protocols/RequestAdapter.html":{"name":"RequestAdapter","abstract":"

A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

"},"Protocols/RequestRetrier.html":{"name":"RequestRetrier","abstract":"

A type that determines whether a request should be retried after being executed by the specified session manager"},"Protocols/DataResponseSerializerProtocol.html":{"name":"DataResponseSerializerProtocol","abstract":"

The type to which all data response serializers must conform in order to serialize a response.

"},"Protocols/DownloadResponseSerializerProtocol.html":{"name":"DownloadResponseSerializerProtocol","abstract":"

The type to which all download response serializers must conform in order to serialize a response.

"},"Protocols/ResponseSerializer.html":{"name":"ResponseSerializer","abstract":"

A serializer that can handle both data and download responses.

"},"Protocols/DataPreprocessor.html":{"name":"DataPreprocessor","abstract":"

Type used to preprocess Data before it handled by a serializer.

"},"Protocols/EmptyResponse.html":{"name":"EmptyResponse","abstract":"

Protocol representing an empty response. Use T.emptyValue() to get an instance.

"},"Protocols/DataDecoder.html":{"name":"DataDecoder","abstract":"

Any type which can decode Data into a Decodable type.

"},"Protocols/DataStreamSerializer.html":{"name":"DataStreamSerializer","abstract":"

A type which can serialize incoming Data.

"},"Protocols/ServerTrustEvaluating.html":{"name":"ServerTrustEvaluating","abstract":"

A protocol describing the API used to evaluate server trusts.

"},"Protocols/URLConvertible.html":{"name":"URLConvertible","abstract":"

Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct"},"Protocols/URLRequestConvertible.html":{"name":"URLRequestConvertible","abstract":"

Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

"},"Extensions/CharacterSet.html#/s:10Foundation12CharacterSetV9AlamofireE17afURLQueryAllowedACvpZ":{"name":"afURLQueryAllowed","abstract":"

Creates a CharacterSet from RFC 3986 allowed characters.

","parent_name":"CharacterSet"},"Extensions/URLComponents.html#/s:10Foundation13URLComponentsV9AlamofireE5asURLAA0E0VyKF":{"name":"asURL()","abstract":"

Returns a URL if the self‘s url is not nil, otherwise throws.

","parent_name":"URLComponents"},"Extensions/URL.html#/s:10Foundation3URLV9AlamofireE02asB0ACyKF":{"name":"asURL()","abstract":"

Returns self.

","parent_name":"URL"},"Extensions/String.html#/s:SS9AlamofireE5asURL10Foundation0C0VyKF":{"name":"asURL()","abstract":"

Returns a URL if self can be used to initialize a URL instance, otherwise throws.

","parent_name":"String"},"Extensions/Array.html#/s:Sa9AlamofireAA21ServerTrustEvaluating_pRszlE8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","abstract":"

Evaluates the given SecTrust value for the given host.

","parent_name":"Array"},"Extensions/Notification.html#/s:10Foundation12NotificationV9AlamofireE7requestAD7RequestCSgvp":{"name":"request","abstract":"

The Request contained by the instance’s userInfo, nil otherwise.

","parent_name":"Notification"},"Extensions/URLSessionConfiguration.html#/s:So25NSURLSessionConfigurationC9AlamofireE7headersAC11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns httpAdditionalHeaders as HTTPHeaders.

","parent_name":"URLSessionConfiguration"},"Extensions/HTTPURLResponse.html#/s:So17NSHTTPURLResponseC9AlamofireE7headersAC11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns allHeaderFields as HTTPHeaders.

","parent_name":"HTTPURLResponse"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE7headersAD11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns allHTTPHeaderFields as HTTPHeaders.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE02asB0ACyKF":{"name":"asURLRequest()","abstract":"

Returns self.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE3url6method7headersAcD14URLConvertible_p_AD10HTTPMethodVAD11HTTPHeadersVSgtKcfc":{"name":"init(url:method:headers:)","abstract":"

Creates an instance with the specified url, method, and headers.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE6methodAD10HTTPMethodVSgvp":{"name":"method","abstract":"

Returns the httpMethod as Alamofire’s HTTPMethod type.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE8validateyyKF":{"name":"validate()","abstract":"

Undocumented

","parent_name":"URLRequest"},"Extensions/Error.html#/s:s5ErrorP9AlamofireE9asAFErrorAC0D0OSgvp":{"name":"asAFError","abstract":"

Returns the instance cast as an AFError.

","parent_name":"Error"},"Extensions/Error.html#/s:s5ErrorP9AlamofireE9asAFError10orFailWith4file4lineAC0D0OSSyXK_s12StaticStringVSutF":{"name":"asAFError(orFailWith:file:line:)","abstract":"

Returns the instance cast as an AFError. If casting fails, a fatalError with the specified message is thrown.

","parent_name":"Error"},"Extensions/Error.html":{"name":"Error"},"Extensions/URLRequest.html":{"name":"URLRequest"},"Extensions/HTTPURLResponse.html":{"name":"HTTPURLResponse"},"Extensions/URLSessionConfiguration.html":{"name":"URLSessionConfiguration"},"Extensions/Notification.html":{"name":"Notification"},"Extensions.html#/s:10Foundation11JSONDecoderC":{"name":"JSONDecoder","abstract":"

JSONDecoder automatically conforms to DataDecoder.

"},"Extensions.html#/s:10Foundation19PropertyListDecoderC":{"name":"PropertyListDecoder","abstract":"

PropertyListDecoder automatically conforms to DataDecoder.

"},"Extensions/Array.html":{"name":"Array"},"Extensions.html#/c:objc(cs)NSBundle":{"name":"Bundle"},"Extensions.html#/c:@T@SecTrustRef":{"name":"SecTrust"},"Extensions.html#/c:@T@SecPolicyRef":{"name":"SecPolicy"},"Extensions.html#/c:@T@SecCertificateRef":{"name":"SecCertificate"},"Extensions.html#/c:@T@OSStatus":{"name":"OSStatus"},"Extensions.html#/c:@E@SecTrustResultType":{"name":"SecTrustResultType"},"Extensions/String.html":{"name":"String"},"Extensions/URL.html":{"name":"URL"},"Extensions/URLComponents.html":{"name":"URLComponents"},"Extensions/CharacterSet.html":{"name":"CharacterSet"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO5retryyA2CmF":{"name":"retry","abstract":"

Retry should be attempted immediately.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO14retryWithDelayyACSdcACmF":{"name":"retryWithDelay(_:)","abstract":"

Retry should be attempted after the associated TimeInterval.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO05doNotB0yA2CmF":{"name":"doNotRetry","abstract":"

Do not retry.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO05doNotB9WithErroryACs0G0_pcACmF":{"name":"doNotRetryWithError(_:)","abstract":"

Do not retry due to the associated Error.

","parent_name":"RetryResult"},"Enums/AuthenticationError.html#/s:9Alamofire19AuthenticationErrorO17missingCredentialyA2CmF":{"name":"missingCredential","abstract":"

The credential was missing so the request could not be authenticated.

","parent_name":"AuthenticationError"},"Enums/AuthenticationError.html#/s:9Alamofire19AuthenticationErrorO16excessiveRefreshyA2CmF":{"name":"excessiveRefresh","abstract":"

The credential was refreshed too many times within the RefreshWindow.

","parent_name":"AuthenticationError"},"Enums/AFError/URLRequestValidationFailureReason.html#/s:9Alamofire7AFErrorO33URLRequestValidationFailureReasonO20bodyDataInGETRequestyAE10Foundation0H0VcAEmF":{"name":"bodyDataInGETRequest(_:)","abstract":"

URLRequest with GET method had body data.

","parent_name":"URLRequestValidationFailureReason"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV4hostSSvp":{"name":"host","abstract":"

The host for which the evaluation was performed.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV5trustSo03SecD3Refavp":{"name":"trust","abstract":"

The SecTrust value which was evaluated.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV6statuss5Int32Vvp":{"name":"status","abstract":"

The OSStatus of evaluation operation.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV6resultSo03SecD10ResultTypeVvp":{"name":"result","abstract":"

The result of the evaluation operation.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html":{"name":"Output","abstract":"

The output of a server trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO19noRequiredEvaluatoryAESS_tcAEmF":{"name":"noRequiredEvaluator(host:)","abstract":"

No ServerTrustEvaluator was found for the associated host.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO19noCertificatesFoundyA2EmF":{"name":"noCertificatesFound","abstract":"

No certificates were found with which to perform the trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO17noPublicKeysFoundyA2EmF":{"name":"noPublicKeysFound","abstract":"

No public keys were found with which to perform the trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO23policyApplicationFailedyAESo03SecD3Refa_So0j6PolicyK0as5Int32VtcAEmF":{"name":"policyApplicationFailed(trust:policy:status:)","abstract":"

During evaluation, application of the associated SecPolicy failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO31settingAnchorCertificatesFailedyAEs5Int32V_SaySo17SecCertificateRefaGtcAEmF":{"name":"settingAnchorCertificatesFailed(status:certificates:)","abstract":"

During evaluation, setting the associated anchor certificates failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO30revocationPolicyCreationFailedyA2EmF":{"name":"revocationPolicyCreationFailed","abstract":"

During evaluation, creation of the revocation policy failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO21trustEvaluationFailedyAEs5Error_pSg_tcAEmF":{"name":"trustEvaluationFailed(error:)","abstract":"

SecTrust evaluation failed with the associated Error, if one was produced.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO23defaultEvaluationFailedyA2E6OutputV_tcAEmF":{"name":"defaultEvaluationFailed(output:)","abstract":"

Default evaluation failed with the associated Output.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO20hostValidationFailedyA2E6OutputV_tcAEmF":{"name":"hostValidationFailed(output:)","abstract":"

Host validation failed with the associated Output.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO21revocationCheckFailedyA2E6OutputV_AA010RevocationD9EvaluatorC7OptionsVtcAEmF":{"name":"revocationCheckFailed(output:options:)","abstract":"

Revocation check failed with the associated Output and options.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO24certificatePinningFailedyAESS_So03SecD3RefaSaySo0j11CertificateK0aGAKtcAEmF":{"name":"certificatePinningFailed(host:trust:pinnedCertificates:serverCertificates:)","abstract":"

Certificate pinning failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO22publicKeyPinningFailedyAESS_So03SecD3RefaSaySo0khL0aGAKtcAEmF":{"name":"publicKeyPinningFailed(host:trust:pinnedKeys:serverKeys:)","abstract":"

Public key pinning failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO22customEvaluationFailedyAEs5Error_p_tcAEmF":{"name":"customEvaluationFailed(error:)","abstract":"

Custom server trust evaluation failed due to the associated Error.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO24inputDataNilOrZeroLengthyA2EmF":{"name":"inputDataNilOrZeroLength","abstract":"

The server response contained no data or the data was zero length.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO12inputFileNilyA2EmF":{"name":"inputFileNil","abstract":"

The file containing the server response did not exist.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO19inputFileReadFailedyAE10Foundation3URLV_tcAEmF":{"name":"inputFileReadFailed(at:)","abstract":"

The file containing the server response could not be read from the associated URL.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO06stringD6FailedyAESS10FoundationE8EncodingV_tcAEmF":{"name":"stringSerializationFailed(encoding:)","abstract":"

String serialization failed using the provided String.Encoding.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO04jsonD6FailedyAEs5Error_p_tcAEmF":{"name":"jsonSerializationFailed(error:)","abstract":"

JSON serialization failed with an underlying system error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO14decodingFailedyAEs5Error_p_tcAEmF":{"name":"decodingFailed(error:)","abstract":"

A DataDecoder failed to decode the response due to the associated Error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customSerializationFailed(error:)","abstract":"

A custom response serializer failed due to the associated Error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO012invalidEmptyC0yAESS_tcAEmF":{"name":"invalidEmptyResponse(type:)","abstract":"

Generic serialization failed for an empty response that wasn’t type Empty but instead the associated type.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO11dataFileNilyA2EmF":{"name":"dataFileNil","abstract":"

The data file containing the server response did not exist.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO18dataFileReadFailedyAE10Foundation3URLV_tcAEmF":{"name":"dataFileReadFailed(at:)","abstract":"

The data file containing the server response at the associated URL could not be read.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO18missingContentTypeyAESaySSG_tcAEmF":{"name":"missingContentType(acceptableContentTypes:)","abstract":"

The response did not contain a Content-Type and the acceptableContentTypes provided did not contain a","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO23unacceptableContentTypeyAESaySSG_SStcAEmF":{"name":"unacceptableContentType(acceptableContentTypes:responseContentType:)","abstract":"

The response Content-Type did not match any type in the provided acceptableContentTypes.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO22unacceptableStatusCodeyAESi_tcAEmF":{"name":"unacceptableStatusCode(code:)","abstract":"

The response status code was not acceptable.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customValidationFailed(error:)","abstract":"

Custom response validation failed due to the associated Error.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO17RequiredComponentO3urlyA2GmF":{"name":"url","abstract":"

The URL was missing or unable to be extracted from the passed URLRequest or during encoding.

","parent_name":"RequiredComponent"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO17RequiredComponentO10httpMethodyAGSS_tcAGmF":{"name":"httpMethod(rawValue:)","abstract":"

The HTTPMethod could not be extracted from the passed URLRequest.

","parent_name":"RequiredComponent"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html":{"name":"RequiredComponent","abstract":"

Possible missing components.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncoderFailureReason.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO24missingRequiredComponentyA2E0hI0OcAEmF":{"name":"missingRequiredComponent(_:)","abstract":"

A RequiredComponent was missing during encoding.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncoderFailureReason.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO13encoderFailedyAEs5Error_p_tcAEmF":{"name":"encoderFailed(error:)","abstract":"

The underlying encoder failed with the associated error.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO10missingURLyA2EmF":{"name":"missingURL","abstract":"

The URLRequest did not have a URL to encode.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO04jsonD6FailedyAEs5Error_p_tcAEmF":{"name":"jsonEncodingFailed(error:)","abstract":"

JSON serialization failed with an underlying system error during the encoding process.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customEncodingFailed(error:)","abstract":"

Custom parameter encoding failed due to the associated Error.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/UnexpectedInputStreamLength.html#/s:9Alamofire7AFErrorO27UnexpectedInputStreamLengthV13bytesExpecteds6UInt64Vvp":{"name":"bytesExpected","abstract":"

The expected byte count to read.

","parent_name":"UnexpectedInputStreamLength"},"Enums/AFError/UnexpectedInputStreamLength.html#/s:9Alamofire7AFErrorO27UnexpectedInputStreamLengthV9bytesReads6UInt64Vvp":{"name":"bytesRead","abstract":"

The actual byte count read.

","parent_name":"UnexpectedInputStreamLength"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO18bodyPartURLInvalidyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartURLInvalid(url:)","abstract":"

The fileURL provided for reading an encodable body part isn’t a file URL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23bodyPartFilenameInvalidyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFilenameInvalid(in:)","abstract":"

The filename of the fileURL provided has either an empty lastPathComponent or `pathExtension.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO24bodyPartFileNotReachableyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileNotReachable(at:)","abstract":"

The file at the fileURL provided was not reachable.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO33bodyPartFileNotReachableWithErroryAE10Foundation3URLV_s0M0_ptcAEmF":{"name":"bodyPartFileNotReachableWithError(atURL:error:)","abstract":"

Attempting to check the reachability of the fileURL provided threw an error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23bodyPartFileIsDirectoryyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileIsDirectory(at:)","abstract":"

The file at the fileURL provided is actually a directory.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO28bodyPartFileSizeNotAvailableyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileSizeNotAvailable(at:)","abstract":"

The size of the file at the fileURL provided was not returned by the system.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO36bodyPartFileSizeQueryFailedWithErroryAE10Foundation3URLV_s0N0_ptcAEmF":{"name":"bodyPartFileSizeQueryFailedWithError(forURL:error:)","abstract":"

The attempt to find the size of the file at the fileURL provided threw an error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO33bodyPartInputStreamCreationFailedyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartInputStreamCreationFailed(for:)","abstract":"

An InputStream could not be created for the provided fileURL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO26outputStreamCreationFailedyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamCreationFailed(for:)","abstract":"

An OutputStream could not be created when attempting to write the encoded data to disk.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO29outputStreamFileAlreadyExistsyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamFileAlreadyExists(at:)","abstract":"

The encoded body data could not be written to disk because a file already exists at the provided fileURL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO22outputStreamURLInvalidyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamURLInvalid(url:)","abstract":"

The fileURL provided for writing the encoded body data to disk is not a file URL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23outputStreamWriteFailedyAEs5Error_p_tcAEmF":{"name":"outputStreamWriteFailed(error:)","abstract":"

The attempt to write the encoded body data to disk failed with an underlying error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO21inputStreamReadFailedyAEs5Error_p_tcAEmF":{"name":"inputStreamReadFailed(error:)","abstract":"

The attempt to read an encoded body part InputStream failed with underlying system error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html":{"name":"MultipartEncodingFailureReason","abstract":"

The underlying reason the .multipartEncodingFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/UnexpectedInputStreamLength.html":{"name":"UnexpectedInputStreamLength","abstract":"

Represents unexpected input stream length that occur when encoding the MultipartFormData. Instances will be","parent_name":"AFError"},"Enums/AFError/ParameterEncodingFailureReason.html":{"name":"ParameterEncodingFailureReason","abstract":"

The underlying reason the .parameterEncodingFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ParameterEncoderFailureReason.html":{"name":"ParameterEncoderFailureReason","abstract":"

The underlying reason the .parameterEncoderFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ResponseValidationFailureReason.html":{"name":"ResponseValidationFailureReason","abstract":"

The underlying reason the .responseValidationFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ResponseSerializationFailureReason.html":{"name":"ResponseSerializationFailureReason","abstract":"

The underlying reason the response serialization error occurred.

","parent_name":"AFError"},"Enums/AFError/ServerTrustFailureReason.html":{"name":"ServerTrustFailureReason","abstract":"

Underlying reason a server trust evaluation error occurred.

","parent_name":"AFError"},"Enums/AFError/URLRequestValidationFailureReason.html":{"name":"URLRequestValidationFailureReason","abstract":"

The underlying reason the .urlRequestValidationFailed

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22createUploadableFailedyACs5Error_p_tcACmF":{"name":"createUploadableFailed(error:)","abstract":"

UploadableConvertible threw an error in createUploadable().

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22createURLRequestFailedyACs5Error_p_tcACmF":{"name":"createURLRequestFailed(error:)","abstract":"

URLRequestConvertible threw an error in asURLRequest().

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24downloadedFileMoveFailedyACs5Error_p_10Foundation3URLVAHtcACmF":{"name":"downloadedFileMoveFailed(error:source:destination:)","abstract":"

SessionDelegate threw an error while attempting to move downloaded file to destination URL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19explicitlyCancelledyA2CmF":{"name":"explicitlyCancelled","abstract":"

Request was explicitly cancelled.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO10invalidURLyAcA14URLConvertible_p_tcACmF":{"name":"invalidURL(url:)","abstract":"

URLConvertible type failed to create a valid URL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23multipartEncodingFailedyA2C09MultipartD13FailureReasonO_tcACmF":{"name":"multipartEncodingFailed(reason:)","abstract":"

Multipart form encoding failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23parameterEncodingFailedyA2C09ParameterD13FailureReasonO_tcACmF":{"name":"parameterEncodingFailed(reason:)","abstract":"

ParameterEncoding threw an error during the encoding process.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22parameterEncoderFailedyA2C09ParameterD13FailureReasonO_tcACmF":{"name":"parameterEncoderFailed(reason:)","abstract":"

ParameterEncoder threw an error while running the encoder.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23requestAdaptationFailedyACs5Error_p_tcACmF":{"name":"requestAdaptationFailed(error:)","abstract":"

RequestAdapter threw an error during adaptation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18requestRetryFailedyACs5Error_p_sAE_ptcACmF":{"name":"requestRetryFailed(retryError:originalError:)","abstract":"

RequestRetrier threw an error during the request retry process.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24responseValidationFailedyA2C08ResponseD13FailureReasonO_tcACmF":{"name":"responseValidationFailed(reason:)","abstract":"

Response validation failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27responseSerializationFailedyA2C08ResponseD13FailureReasonO_tcACmF":{"name":"responseSerializationFailed(reason:)","abstract":"

Response serialization failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27serverTrustEvaluationFailedyA2C06ServerD13FailureReasonO_tcACmF":{"name":"serverTrustEvaluationFailed(reason:)","abstract":"

ServerTrustEvaluating instance threw an error during trust evaluation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO20sessionDeinitializedyA2CmF":{"name":"sessionDeinitialized","abstract":"

Session which issued the Request was deinitialized, most likely because its reference went out of scope.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18sessionInvalidatedyACs5Error_pSg_tcACmF":{"name":"sessionInvalidated(error:)","abstract":"

Session was explicitly invalidated, possibly with the Error produced by the underlying URLSession.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO17sessionTaskFailedyACs5Error_p_tcACmF":{"name":"sessionTaskFailed(error:)","abstract":"

URLSessionTask completed with error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO26urlRequestValidationFailedyA2C010URLRequestE13FailureReasonO_tcACmF":{"name":"urlRequestValidationFailed(reason:)","abstract":"

URLRequest failed validation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27isSessionDeinitializedErrorSbvp":{"name":"isSessionDeinitializedError","abstract":"

Returns whether the instance is .sessionDeinitialized.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isSessionInvalidatedErrorSbvp":{"name":"isSessionInvalidatedError","abstract":"

Returns whether the instance is .sessionInvalidated.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO26isExplicitlyCancelledErrorSbvp":{"name":"isExplicitlyCancelledError","abstract":"

Returns whether the instance is .explicitlyCancelled.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO17isInvalidURLErrorSbvp":{"name":"isInvalidURLError","abstract":"

Returns whether the instance is .invalidURL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isParameterEncodingErrorSbvp":{"name":"isParameterEncodingError","abstract":"

Returns whether the instance is .parameterEncodingFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isParameterEncoderErrorSbvp":{"name":"isParameterEncoderError","abstract":"

Returns whether the instance is .parameterEncoderFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isMultipartEncodingErrorSbvp":{"name":"isMultipartEncodingError","abstract":"

Returns whether the instance is .multipartEncodingFailed. When true, the url and underlyingError","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isRequestAdaptationErrorSbvp":{"name":"isRequestAdaptationError","abstract":"

Returns whether the instance is .requestAdaptationFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isResponseValidationErrorSbvp":{"name":"isResponseValidationError","abstract":"

Returns whether the instance is .responseValidationFailed. When true, the acceptableContentTypes,","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO28isResponseSerializationErrorSbvp":{"name":"isResponseSerializationError","abstract":"

Returns whether the instance is .responseSerializationFailed. When true, the failedStringEncoding and","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO28isServerTrustEvaluationErrorSbvp":{"name":"isServerTrustEvaluationError","abstract":"

Returns whether the instance is .serverTrustEvaluationFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19isRequestRetryErrorSbvp":{"name":"isRequestRetryError","abstract":"

Returns whether the instance is requestRetryFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isCreateUploadableErrorSbvp":{"name":"isCreateUploadableError","abstract":"

Returns whether the instance is createUploadableFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isCreateURLRequestErrorSbvp":{"name":"isCreateURLRequestError","abstract":"

Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isDownloadedFileMoveErrorSbvp":{"name":"isDownloadedFileMoveError","abstract":"

Returns whether the instance is downloadedFileMoveFailed. When true, the destination and underlyingError properties will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18isSessionTaskErrorSbvp":{"name":"isSessionTaskError","abstract":"

Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO14urlConvertibleAA14URLConvertible_pSgvp":{"name":"urlConvertible","abstract":"

The URLConvertible associated with the error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO3url10Foundation3URLVSgvp":{"name":"url","abstract":"

The URL associated with the error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO15underlyingErrors0D0_pSgvp":{"name":"underlyingError","abstract":"

The underlying Error responsible for generating the failure associated with .sessionInvalidated,","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22acceptableContentTypesSaySSGSgvp":{"name":"acceptableContentTypes","abstract":"

The acceptable Content-Types of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19responseContentTypeSSSgvp":{"name":"responseContentType","abstract":"

The response Content-Type of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO12responseCodeSiSgvp":{"name":"responseCode","abstract":"

The response code of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO20failedStringEncodingSS10FoundationE0E0VSgvp":{"name":"failedStringEncoding","abstract":"

The String.Encoding associated with a failed .stringResponse() call.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO9sourceURL10Foundation0D0VSgvp":{"name":"sourceURL","abstract":"

The source URL of a .downloadedFileMoveFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO14destinationURL10Foundation0D0VSgvp":{"name":"destinationURL","abstract":"

The destination URL of a .downloadedFileMoveFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18downloadResumeData10Foundation0E0VSgvp":{"name":"downloadResumeData","abstract":"

The download resume data of any underlying network error. Only produced by DownloadRequests.

","parent_name":"AFError"},"Enums/AFError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"AFError"},"Enums/AFError.html":{"name":"AFError","abstract":"

AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with"},"Enums/AuthenticationError.html":{"name":"AuthenticationError","abstract":"

Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are"},"Enums/RetryResult.html":{"name":"RetryResult","abstract":"

Outcome of determination whether retry is necessary.

"},"Global%20Variables.html#/s:9Alamofire2AFAA7SessionCvp":{"name":"AF","abstract":"

Reference to Session.default for quick bootstrapping and examples.

"},"Classes/URLEncodedFormEncoder/Error.html#/s:9Alamofire21URLEncodedFormEncoderC5ErrorO17invalidRootObjectyAESScAEmF":{"name":"invalidRootObject(_:)","abstract":"

An invalid root object was created by the encoder. Only keyed values are valid.

","parent_name":"Error"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13SpaceEncodingO14percentEscapedyA2EmF":{"name":"percentEscaped","abstract":"

Encodes spaces using percent escaping (%20).

","parent_name":"SpaceEncoding"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13SpaceEncodingO12plusReplacedyA2EmF":{"name":"plusReplaced","abstract":"

Encodes spaces as +.

","parent_name":"SpaceEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV7dropKeyAEvpZ":{"name":"dropKey","abstract":"

Encodes nil by dropping the entire key / value pair.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV9dropValueAEvpZ":{"name":"dropValue","abstract":"

Encodes nil by dropping only the value. e.g. value1=one&nilValue=&value2=two.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV4nullAEvpZ":{"name":"null","abstract":"

Encodes nil as null.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV8encodingAESSSgyc_tcfc":{"name":"init(encoding:)","abstract":"

Creates an instance with the encoding closure called for nil values.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV8bracketsAEvpZ":{"name":"brackets","abstract":"

Encodes key paths by wrapping each component in brackets. e.g. parent[child][grandchild].

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV4dotsAEvpZ":{"name":"dots","abstract":"

Encodes key paths by separating each component with dots. e.g. parent.child.grandchild.

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV8encodingAES2Sc_tcfc":{"name":"init(encoding:)","abstract":"

Creates an instance with the encoding closure called for each sub-key in a key path.

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO14useDefaultKeysyA2EmF":{"name":"useDefaultKeys","abstract":"

Use the keys specified by each type. This is the default encoding.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO18convertToSnakeCaseyA2EmF":{"name":"convertToSnakeCase","abstract":"

Convert from “camelCaseKeys” to “snake_case_keys” before writing a key.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO18convertToKebabCaseyA2EmF":{"name":"convertToKebabCase","abstract":"

Same as convertToSnakeCase, but using - instead of _.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO11capitalizedyA2EmF":{"name":"capitalized","abstract":"

Capitalize the first letter only.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO10uppercasedyA2EmF":{"name":"uppercased","abstract":"

Uppercase all letters.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO10lowercasedyA2EmF":{"name":"lowercased","abstract":"

Lowercase all letters.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO6customyAES2SccAEmF":{"name":"custom(_:)","abstract":"

A custom encoding using the provided closure.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO010deferredToE0yA2EmF":{"name":"deferredToDate","abstract":"

Defers encoding to the Date type. This is the default encoding.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO16secondsSince1970yA2EmF":{"name":"secondsSince1970","abstract":"

Encodes Dates as seconds since midnight UTC on January 1, 1970.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO21millisecondsSince1970yA2EmF":{"name":"millisecondsSince1970","abstract":"

Encodes Dates as milliseconds since midnight UTC on January 1, 1970.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO7iso8601yA2EmF":{"name":"iso8601","abstract":"

Encodes Dates according to the ISO8601 and RFC3339 standards.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO9formattedyAESo15NSDateFormatterCcAEmF":{"name":"formatted(_:)","abstract":"

Encodes Dates using the given DateFormatter.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO6customyAESS10Foundation0E0VKccAEmF":{"name":"custom(_:)","abstract":"

Encodes Dates using the given closure.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO010deferredToE0yA2EmF":{"name":"deferredToData","abstract":"

Defers encoding to the Data type.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO6base64yA2EmF":{"name":"base64","abstract":"

Encodes Data as a Base64-encoded string. This is the default encoding.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO6customyAESS10Foundation0E0VKccAEmF":{"name":"custom(_:)","abstract":"

Encode the Data as a custom value encoded by the given closure.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/BoolEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12BoolEncodingO7numericyA2EmF":{"name":"numeric","abstract":"

Encodes true as 1, false as 0.

","parent_name":"BoolEncoding"},"Classes/URLEncodedFormEncoder/BoolEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12BoolEncodingO7literalyA2EmF":{"name":"literal","abstract":"

Encodes true as “true”, false as “false”. This is the default encoding.

","parent_name":"BoolEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO8bracketsyA2EmF":{"name":"brackets","abstract":"

An empty set of square brackets (“[]”) are appended to the key for every value. This is the default encoding.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO10noBracketsyA2EmF":{"name":"noBrackets","abstract":"

No brackets are appended to the key and the key is encoded as is.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO15indexInBracketsyA2EmF":{"name":"indexInBrackets","abstract":"

Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO6customyAES2S_SitccAEmF":{"name":"custom(_:)","abstract":"

Provide a custom array key encoding with the given closure.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html":{"name":"ArrayEncoding","abstract":"

Encoding to use for Array values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/BoolEncoding.html":{"name":"BoolEncoding","abstract":"

Encoding to use for Bool values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/DataEncoding.html":{"name":"DataEncoding","abstract":"

Encoding to use for Data values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/DateEncoding.html":{"name":"DateEncoding","abstract":"

Encoding to use for Date values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/KeyEncoding.html":{"name":"KeyEncoding","abstract":"

Encoding to use for keys.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html":{"name":"KeyPathEncoding","abstract":"

Encoding to use for nested object and Encodable value key paths.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/NilEncoding.html":{"name":"NilEncoding","abstract":"

Encoding to use for nil values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html":{"name":"SpaceEncoding","abstract":"

Encoding to use for spaces.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/Error.html":{"name":"Error","abstract":"

URLEncodedFormEncoder error.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC24alphabetizeKeyValuePairsSbvp":{"name":"alphabetizeKeyValuePairs","abstract":"

Whether or not to sort the encoded key value pairs.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC13arrayEncodingAC05ArrayF0Ovp":{"name":"arrayEncoding","abstract":"

The ArrayEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12boolEncodingAC04BoolF0Ovp":{"name":"boolEncoding","abstract":"

The BoolEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12dataEncodingAC04DataF0Ovp":{"name":"dataEncoding","abstract":"

THe DataEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12dateEncodingAC04DateF0Ovp":{"name":"dateEncoding","abstract":"

The DateEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC11keyEncodingAC03KeyF0Ovp":{"name":"keyEncoding","abstract":"

The KeyEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC15keyPathEncodingAC03KeyfG0Vvp":{"name":"keyPathEncoding","abstract":"

The KeyPathEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC11nilEncodingAC03NilF0Vvp":{"name":"nilEncoding","abstract":"

The NilEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC13spaceEncodingAC05SpaceF0Ovp":{"name":"spaceEncoding","abstract":"

The SpaceEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC17allowedCharacters10Foundation12CharacterSetVvp":{"name":"allowedCharacters","abstract":"

The CharacterSet of allowed (non-escaped) characters.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC24alphabetizeKeyValuePairs13arrayEncoding04boolJ004dataJ004dateJ003keyJ00n4PathJ003nilJ005spaceJ017allowedCharactersACSb_AC05ArrayJ0OAC04BoolJ0OAC04DataJ0OAC04DateJ0OAC0fJ0OAC0foJ0VAC03NilJ0VAC05SpaceJ0O10Foundation12CharacterSetVtcfc":{"name":"init(alphabetizeKeyValuePairs:arrayEncoding:boolEncoding:dataEncoding:dateEncoding:keyEncoding:keyPathEncoding:nilEncoding:spaceEncoding:allowedCharacters:)","abstract":"

Creates an instance from the supplied parameters.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC6encodeySSSE_pKF":{"name":"encode(_:)","abstract":"

Encodes the value as a URL form encoded String.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC6encodey10Foundation4DataVSE_pKF":{"name":"encode(_:)","abstract":"

Encodes the value as Data. This is performed by first creating an encoded String and then returning the","parent_name":"URLEncodedFormEncoder"},"Classes/SessionDelegate.html#/s:9Alamofire15SessionDelegateC11fileManagerACSo06NSFileE0C_tcfc":{"name":"init(fileManager:)","abstract":"

Creates an instance from the given FileManager.

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:didBecomeInvalidWithError:":{"name":"urlSession(_:didBecomeInvalidWithError:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didReceiveChallenge:completionHandler:":{"name":"urlSession(_:task:didReceive:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:needNewBodyStream:":{"name":"urlSession(_:task:needNewBodyStream:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didFinishCollectingMetrics:":{"name":"urlSession(_:task:didFinishCollecting:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didCompleteWithError:":{"name":"urlSession(_:task:didCompleteWithError:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:taskIsWaitingForConnectivity:":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:didReceiveResponse:completionHandler:":{"name":"urlSession(_:dataTask:didReceive:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:didReceiveData:":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:willCacheResponse:completionHandler:":{"name":"urlSession(_:dataTask:willCacheResponse:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didFinishDownloadingToURL:":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/Session.html#/s:9Alamofire7SessionC7defaultACvpZ":{"name":"default","abstract":"

Shared singleton instance used by all AF.request APIs. Cannot be modified.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7sessionSo12NSURLSessionCvp":{"name":"session","abstract":"

Underlying URLSession used to create URLSessionTasks for this instance, and for which this instance’s","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8delegateAA0B8DelegateCvp":{"name":"delegate","abstract":"

Instance’s SessionDelegate, which handles the URLSessionDelegate methods and Request interaction.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC9rootQueueSo17OS_dispatch_queueCvp":{"name":"rootQueue","abstract":"

Root DispatchQueue for all internal callbacks and state update. MUST be a serial queue.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC24startRequestsImmediatelySbvp":{"name":"startRequestsImmediately","abstract":"

Value determining whether this instance automatically calls resume() on all created Requests.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC12requestQueueSo17OS_dispatch_queueCvp":{"name":"requestQueue","abstract":"

DispatchQueue on which URLRequests are created asynchronously. By default this queue uses rootQueue as its","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC18serializationQueueSo17OS_dispatch_queueCvp":{"name":"serializationQueue","abstract":"

DispatchQueue passed to all Requests on which they perform their response serialization. By default this","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC11interceptorAA18RequestInterceptor_pSgvp":{"name":"interceptor","abstract":"

RequestInterceptor used for all Request created by the instance. RequestInterceptors can also be set on a","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC18serverTrustManagerAA06ServerdE0CSgvp":{"name":"serverTrustManager","abstract":"

ServerTrustManager instance used to evaluate all trust challenges and provide certificate and key pinning.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15redirectHandlerAA08RedirectD0_pSgvp":{"name":"redirectHandler","abstract":"

RedirectHandler instance used to provide customization for request redirection.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC21cachedResponseHandlerAA06CacheddE0_pSgvp":{"name":"cachedResponseHandler","abstract":"

CachedResponseHandler instance used to provide customization of cached response handling.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC12eventMonitorAA014CompositeEventD0Cvp":{"name":"eventMonitor","abstract":"

CompositeEventMonitor used to compose Alamofire’s defaultEventMonitors and any passed EventMonitors.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC20defaultEventMonitorsSayAA0D7Monitor_pGvp":{"name":"defaultEventMonitors","abstract":"

EventMonitors included in all instances. [AlamofireNotifications()] by default.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7session8delegate9rootQueue24startRequestsImmediately07requestF0013serializationF011interceptor18serverTrustManager15redirectHandler014cachedResponseQ013eventMonitorsACSo12NSURLSessionC_AA0B8DelegateCSo17OS_dispatch_queueCSbATSgAuA18RequestInterceptor_pSgAA06ServernO0CSgAA08RedirectQ0_pSgAA06CachedsQ0_pSgSayAA12EventMonitor_pGtcfc":{"name":"init(session:delegate:rootQueue:startRequestsImmediately:requestQueue:serializationQueue:interceptor:serverTrustManager:redirectHandler:cachedResponseHandler:eventMonitors:)","abstract":"

Creates a Session from a URLSession and other parameters.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13configuration8delegate9rootQueue24startRequestsImmediately07requestF0013serializationF011interceptor18serverTrustManager15redirectHandler014cachedResponseQ013eventMonitorsACSo25NSURLSessionConfigurationC_AA0B8DelegateCSo17OS_dispatch_queueCSbATSgAuA18RequestInterceptor_pSgAA06ServernO0CSgAA08RedirectQ0_pSgAA06CachedsQ0_pSgSayAA12EventMonitor_pGtcfc":{"name":"init(configuration:delegate:rootQueue:startRequestsImmediately:requestQueue:serializationQueue:interceptor:serverTrustManager:redirectHandler:cachedResponseHandler:eventMonitors:)","abstract":"

Creates a Session from a URLSessionConfiguration.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15withAllRequests7performyyShyAA7RequestCGc_tF":{"name":"withAllRequests(perform:)","abstract":"

Perform an action on all active Requests.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC17cancelAllRequests17completingOnQueue10completionySo17OS_dispatch_queueC_yycSgtF":{"name":"cancelAllRequests(completingOnQueue:completion:)","abstract":"

Cancel all active Requests, optionally calling a completion handler when complete.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15RequestModifiera":{"name":"RequestModifier","abstract":"

Closure which provides a URLRequest for mutation.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_6method10parameters8encoding7headers11interceptor0C8ModifierAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodVSDySSypGSgAA17ParameterEncoding_pAA11HTTPHeadersVSgAA0K11Interceptor_pSgy10Foundation10URLRequestVzKcSgtF":{"name":"request(_:method:parameters:encoding:headers:interceptor:requestModifier:)","abstract":"

Creates a DataRequest from a URLRequest created using the passed components and a RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_6method10parameters7encoder7headers11interceptor0C8ModifierAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgAA0K11Interceptor_pSgy10Foundation10URLRequestVzKcSgtSERzlF":{"name":"request(_:method:parameters:encoder:headers:interceptor:requestModifier:)","abstract":"

Creates a DataRequest from a URLRequest created using the passed components, Encodable parameters, and a","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_11interceptorAA11DataRequestCAA21URLRequestConvertible_p_AA0F11Interceptor_pSgtF":{"name":"request(_:interceptor:)","abstract":"

Creates a DataRequest from a URLRequestConvertible value and a RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_6method10parameters7encoder7headers32automaticallyCancelOnStreamError11interceptor15requestModifierAA04DatalD0CAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgSbAA0D11Interceptor_pSgy10Foundation10URLRequestVzKcSgtSERzlF":{"name":"streamRequest(_:method:parameters:encoder:headers:automaticallyCancelOnStreamError:interceptor:requestModifier:)","abstract":"

Creates a DataStreamRequest from the passed components, Encodable parameters, and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_6method7headers32automaticallyCancelOnStreamError11interceptor15requestModifierAA04DatajD0CAA14URLConvertible_p_AA10HTTPMethodVAA11HTTPHeadersVSgSbAA0D11Interceptor_pSgy10Foundation10URLRequestVzKcSgtF":{"name":"streamRequest(_:method:headers:automaticallyCancelOnStreamError:interceptor:requestModifier:)","abstract":"

Creates a DataStreamRequest from the passed components and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_32automaticallyCancelOnStreamError11interceptorAA04DatahD0CAA21URLRequestConvertible_p_SbAA0D11Interceptor_pSgtF":{"name":"streamRequest(_:automaticallyCancelOnStreamError:interceptor:)","abstract":"

Creates a DataStreamRequest from the passed URLRequestConvertible value and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_6method10parameters8encoding7headers11interceptor15requestModifier2toAA15DownloadRequestCAA14URLConvertible_p_AA10HTTPMethodVSDySSypGSgAA17ParameterEncoding_pAA11HTTPHeadersVSgAA0M11Interceptor_pSgy10Foundation10URLRequestVzKcSgAY3URLV011destinationV0_AM7OptionsV7optionstA2__So17NSHTTPURLResponseCtcSgtF":{"name":"download(_:method:parameters:encoding:headers:interceptor:requestModifier:to:)","abstract":"

Creates a DownloadRequest using a URLRequest created using the passed components, RequestInterceptor, and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_6method10parameters7encoder7headers11interceptor15requestModifier2toAA15DownloadRequestCAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgAA0M11Interceptor_pSgy10Foundation10URLRequestVzKcSgAX3URLV011destinationV0_AM7OptionsV7optionstA1__So17NSHTTPURLResponseCtcSgtSERzlF":{"name":"download(_:method:parameters:encoder:headers:interceptor:requestModifier:to:)","abstract":"

Creates a DownloadRequest from a URLRequest created using the passed components, Encodable parameters, and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_11interceptor2toAA15DownloadRequestCAA21URLRequestConvertible_p_AA0G11Interceptor_pSg10Foundation3URLV011destinationL0_AH7OptionsV7optionstAN_So17NSHTTPURLResponseCtcSgtF":{"name":"download(_:interceptor:to:)","abstract":"

Creates a DownloadRequest from a URLRequestConvertible value, a RequestInterceptor, and a Destination.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download12resumingWith11interceptor2toAA15DownloadRequestC10Foundation4DataV_AA0I11Interceptor_pSgAJ3URLV011destinationM0_AI7OptionsV7optionstAP_So17NSHTTPURLResponseCtcSgtF":{"name":"download(resumingWith:interceptor:to:)","abstract":"

Creates a DownloadRequest from the resumeData produced from a previously cancelled DownloadRequest, as","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestC10Foundation4DataV_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0CyAM10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the given Data, URLRequest components, and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestC10Foundation4DataV_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the given Data using the URLRequestConvertible value and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestC10Foundation3URLV_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0CyAM10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the file at the given file URL, using a URLRequest from the provided","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestC10Foundation3URLV_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the file at the given file URL using the URLRequestConvertible value and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCSo13NSInputStreamC_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest from the InputStream provided using a URLRequest from the provided components and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestCSo13NSInputStreamC_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest from the provided InputStream using the URLRequestConvertible value and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData2to14usingThreshold6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCyAA09MultiparteF0Cc_AA14URLConvertible_ps6UInt64VAA10HTTPMethodVAA11HTTPHeadersVSgAA0R11Interceptor_pSgSo06NSFileN0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(multipartFormData:to:usingThreshold:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the multipart form data built using a closure and sent using the provided","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData4with14usingThreshold11interceptor11fileManagerAA13UploadRequestCyAA09MultiparteF0Cc_AA21URLRequestConvertible_ps6UInt64VAA0N11Interceptor_pSgSo06NSFileL0CtF":{"name":"upload(multipartFormData:with:usingThreshold:interceptor:fileManager:)","abstract":"

Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData2to14usingThreshold6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCAA09MultiparteF0C_AA14URLConvertible_ps6UInt64VAA10HTTPMethodVAA11HTTPHeadersVSgAA0R11Interceptor_pSgSo06NSFileN0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(multipartFormData:to:usingThreshold:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData4with14usingThreshold11interceptor11fileManagerAA13UploadRequestCAA09MultiparteF0C_AA21URLRequestConvertible_ps6UInt64VAA0N11Interceptor_pSgSo06NSFileL0CtF":{"name":"upload(multipartFormData:with:usingThreshold:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP20sessionConfigurationSo012NSURLSessionE0Cvp":{"name":"sessionConfiguration","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP16startImmediatelySbvp":{"name":"startImmediately","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP7cleanup5afteryAA0B0C_tF":{"name":"cleanup(after:)","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP11retryResult3for5dueTo10completionyAA0B0C_AA7AFErrorOyAA05RetryE0OctF":{"name":"retryResult(for:dueTo:completion:)","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP05retryB0_9withDelayyAA0B0C_SdSgtF":{"name":"retryRequest(_:withDelay:)","parent_name":"Session"},"Classes/DisabledTrustEvaluator.html#/s:9Alamofire22DisabledTrustEvaluatorCACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"DisabledTrustEvaluator"},"Classes/DisabledTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"DisabledTrustEvaluator"},"Classes/CompositeTrustEvaluator.html#/s:9Alamofire23CompositeTrustEvaluatorC10evaluatorsACSayAA06ServerC10Evaluating_pG_tcfc":{"name":"init(evaluators:)","abstract":"

Creates a CompositeTrustEvaluator from the provided evaluators.

","parent_name":"CompositeTrustEvaluator"},"Classes/CompositeTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"CompositeTrustEvaluator"},"Classes/PublicKeysTrustEvaluator.html#/s:9Alamofire24PublicKeysTrustEvaluatorC4keys24performDefaultValidation12validateHostACSaySo9SecKeyRefaG_S2btcfc":{"name":"init(keys:performDefaultValidation:validateHost:)","abstract":"

Creates a PublicKeysTrustEvaluator from the provided parameters.

","parent_name":"PublicKeysTrustEvaluator"},"Classes/PublicKeysTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"PublicKeysTrustEvaluator"},"Classes/PinnedCertificatesTrustEvaluator.html#/s:9Alamofire32PinnedCertificatesTrustEvaluatorC12certificates016acceptSelfSignedC024performDefaultValidation12validateHostACSaySo17SecCertificateRefaG_S3btcfc":{"name":"init(certificates:acceptSelfSignedCertificates:performDefaultValidation:validateHost:)","abstract":"

Creates a PinnedCertificatesTrustEvaluator from the provided parameters.

","parent_name":"PinnedCertificatesTrustEvaluator"},"Classes/PinnedCertificatesTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"PinnedCertificatesTrustEvaluator"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV3crlAEvpZ":{"name":"crl","abstract":"

Perform revocation checking using the CRL (Certification Revocation List) method.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV21networkAccessDisabledAEvpZ":{"name":"networkAccessDisabled","abstract":"

Consult only locally cached replies; do not use network access.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV4ocspAEvpZ":{"name":"ocsp","abstract":"

Perform revocation checking using OCSP (Online Certificate Status Protocol).

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV9preferCRLAEvpZ":{"name":"preferCRL","abstract":"

Prefer CRL revocation checking over OCSP; by default, OCSP is preferred.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV23requirePositiveResponseAEvpZ":{"name":"requirePositiveResponse","abstract":"

Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV3anyAEvpZ":{"name":"any","abstract":"

Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV8rawValueSuvp":{"name":"rawValue","abstract":"

The raw value of the option.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV8rawValueAESu_tcfc":{"name":"init(rawValue:)","abstract":"

Creates an Options value with the given CFOptionFlags.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html":{"name":"Options","abstract":"

Represents the options to be use when evaluating the status of a certificate.","parent_name":"RevocationTrustEvaluator"},"Classes/RevocationTrustEvaluator.html#/s:9Alamofire24RevocationTrustEvaluatorC24performDefaultValidation12validateHost7optionsACSb_SbAC7OptionsVtcfc":{"name":"init(performDefaultValidation:validateHost:options:)","abstract":"

Creates a RevocationTrustEvaluator using the provided parameters.

","parent_name":"RevocationTrustEvaluator"},"Classes/RevocationTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"RevocationTrustEvaluator"},"Classes/DefaultTrustEvaluator.html#/s:9Alamofire21DefaultTrustEvaluatorC12validateHostACSb_tcfc":{"name":"init(validateHost:)","abstract":"

Creates a DefaultTrustEvaluator.

","parent_name":"DefaultTrustEvaluator"},"Classes/DefaultTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"DefaultTrustEvaluator"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC23allHostsMustBeEvaluatedSbvp":{"name":"allHostsMustBeEvaluated","abstract":"

Determines whether all hosts for this ServerTrustManager must be evaluated. true by default.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC10evaluatorsSDySSAA0bC10Evaluating_pGvp":{"name":"evaluators","abstract":"

The dictionary of policies mapped to a particular host.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC23allHostsMustBeEvaluated10evaluatorsACSb_SDySSAA0bC10Evaluating_pGtcfc":{"name":"init(allHostsMustBeEvaluated:evaluators:)","abstract":"

Initializes the ServerTrustManager instance with the given evaluators.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC06serverC9Evaluator7forHostAA0bC10Evaluating_pSgSS_tKF":{"name":"serverTrustEvaluator(forHost:)","abstract":"

Returns the ServerTrustEvaluating value for the given host, if one is set.

","parent_name":"ServerTrustManager"},"Classes/ConnectionLostRetryPolicy.html#/s:9Alamofire25ConnectionLostRetryPolicyC10retryLimit22exponentialBackoffBase0hI5Scale20retryableHTTPMethodsACSu_SuSdShyAA10HTTPMethodVGtcfc":{"name":"init(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:)","abstract":"

Creates a ConnectionLostRetryPolicy instance from the specified parameters.

","parent_name":"ConnectionLostRetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC07defaultB5LimitSuvpZ":{"name":"defaultRetryLimit","abstract":"

The default retry limit for retry policies.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC29defaultExponentialBackoffBaseSuvpZ":{"name":"defaultExponentialBackoffBase","abstract":"

The default exponential backoff base for retry policies (must be a minimum of 2).

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC30defaultExponentialBackoffScaleSdvpZ":{"name":"defaultExponentialBackoffScale","abstract":"

The default exponential backoff scale for retry policies.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC27defaultRetryableHTTPMethodsShyAA10HTTPMethodVGvpZ":{"name":"defaultRetryableHTTPMethods","abstract":"

The default HTTP methods to retry.","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC31defaultRetryableHTTPStatusCodesShySiGvpZ":{"name":"defaultRetryableHTTPStatusCodes","abstract":"

The default HTTP status codes to retry.","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC29defaultRetryableURLErrorCodesShy10Foundation0F0V4CodeVGvpZ":{"name":"defaultRetryableURLErrorCodes","abstract":"

The default URL error codes to retry.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC10retryLimitSuvp":{"name":"retryLimit","abstract":"

The total number of times the request is allowed to be retried.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC22exponentialBackoffBaseSuvp":{"name":"exponentialBackoffBase","abstract":"

The base of the exponential backoff policy (should always be greater than or equal to 2).

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC23exponentialBackoffScaleSdvp":{"name":"exponentialBackoffScale","abstract":"

The scale of the exponential backoff.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC20retryableHTTPMethodsShyAA10HTTPMethodVGvp":{"name":"retryableHTTPMethods","abstract":"

The HTTP methods that are allowed to be retried.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC24retryableHTTPStatusCodesShySiGvp":{"name":"retryableHTTPStatusCodes","abstract":"

The HTTP status codes that are automatically retried by the policy.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC22retryableURLErrorCodesShy10Foundation0E0V4CodeVGvp":{"name":"retryableURLErrorCodes","abstract":"

The URL error codes that are automatically retried by the policy.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC10retryLimit22exponentialBackoffBase0fG5Scale20retryableHTTPMethods0J15HTTPStatusCodes0j8URLErrorM0ACSu_SuSdShyAA10HTTPMethodVGShySiGShy10Foundation0N0V4CodeVGtcfc":{"name":"init(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:retryableHTTPStatusCodes:retryableURLErrorCodes:)","abstract":"

Creates a RetryPolicy from the specified parameters.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC06shouldB07request5dueToSbAA7RequestC_s5Error_ptF":{"name":"shouldRetry(request:dueTo:)","abstract":"

Determines whether or not to retry the provided Request.

","parent_name":"RetryPolicy"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire27DecodableResponseSerializerC7decoderAA11DataDecoder_pvp":{"name":"decoder","abstract":"

The DataDecoder instance used to decode responses.

","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire27DecodableResponseSerializerC16dataPreprocessor7decoder05emptyC5Codes0H14RequestMethodsACyxGAA04DataF0_p_AA0L7Decoder_pShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates an instance using the values provided.

","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"DecodableResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire22JSONResponseSerializerC7optionsSo20NSJSONReadingOptionsVvp":{"name":"options","abstract":"

JSONSerialization.ReadingOptions used when serializing a response.

","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire22JSONResponseSerializerC16dataPreprocessor18emptyResponseCodes0F14RequestMethods7optionsAcA04DataE0_p_ShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVtcfc":{"name":"init(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:)","abstract":"

Creates an instance with the provided values.

","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"JSONResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire24StringResponseSerializerC8encodingSS10FoundationE8EncodingVSgvp":{"name":"encoding","abstract":"

Optional string encoding used to validate the response.

","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire24StringResponseSerializerC16dataPreprocessor8encoding05emptyC5Codes0H14RequestMethodsAcA04DataF0_p_SS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates an instance with the provided values.

","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"StringResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire22DataResponseSerializerC16dataPreprocessor05emptyC5Codes0G14RequestMethodsAcA0bF0_p_ShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponseSerializer using the provided parameters.

","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"DataResponseSerializer"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8adaptersSayAA14RequestAdapter_pGvp":{"name":"adapters","abstract":"

All RequestAdapters associated with the instance. These adapters will be run until one fails.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8retriersSayAA14RequestRetrier_pGvp":{"name":"retriers","abstract":"

All RequestRetriers associated with the instance. These retriers will be run one at a time until one triggers retry.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC12adaptHandler05retryD0ACy10Foundation10URLRequestV_AA7SessionCys6ResultOyAHs5Error_pGctc_yAA7RequestC_AJsAM_pyAA05RetryI0Octctcfc":{"name":"init(adaptHandler:retryHandler:)","abstract":"

Creates an instance from AdaptHandler and RetryHandler closures.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC7adapter7retrierAcA14RequestAdapter_p_AA0E7Retrier_ptcfc":{"name":"init(adapter:retrier:)","abstract":"

Creates an instance from RequestAdapter and RequestRetrier values.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8adapters8retriers12interceptorsACSayAA14RequestAdapter_pG_SayAA0F7Retrier_pGSayAA0fB0_pGtcfc":{"name":"init(adapters:retriers:interceptors:)","abstract":"

Creates an instance from the arrays of RequestAdapter and RequestRetrier values.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"Interceptor"},"Classes/Retrier.html#/s:9Alamofire7RetrierCyACyAA7RequestC_AA7SessionCs5Error_pyAA11RetryResultOctccfc":{"name":"init(_:)","abstract":"

Creates an instance using the provided closure.

","parent_name":"Retrier"},"Classes/Retrier.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"Retrier"},"Classes/Adapter.html#/s:9Alamofire7AdapterCyACy10Foundation10URLRequestV_AA7SessionCys6ResultOyAFs5Error_pGctccfc":{"name":"init(_:)","abstract":"

Creates an instance using the provided closure.

","parent_name":"Adapter"},"Classes/Adapter.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"Adapter"},"Classes/Adapter.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","parent_name":"Adapter"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO4datayAE10Foundation4DataVcAEmF":{"name":"data(_:)","abstract":"

Upload from the provided Data value.

","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO4fileyAE10Foundation3URLV_SbtcAEmF":{"name":"file(_:shouldRemove:)","abstract":"

Upload from the provided file URL, as well as a Bool determining whether the source file should be","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO6streamyAESo13NSInputStreamCcAEmF":{"name":"stream(_:)","abstract":"

Upload from the provided InputStream.

","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire21UploadableConvertibleP06createB0AA13UploadRequestC0B0OyKF":{"name":"createUploadable()","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html":{"name":"Uploadable","abstract":"

Type describing the origin of the upload, whether Data, file, or stream.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC6uploadAA21UploadableConvertible_pvp":{"name":"upload","abstract":"

The UploadableConvertible value used to produce the Uploadable value for this instance.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC11fileManagerSo06NSFileE0Cvp":{"name":"fileManager","abstract":"

FileManager used to perform cleanup tasks, including the removal of multipart form encoded payloads written","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC10uploadableAC10UploadableOSgvp":{"name":"uploadable","abstract":"

Uploadable value used by the instance.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC7cleanupyyF":{"name":"cleanup()","parent_name":"UploadRequest"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO15methodDependentyA2EmF":{"name":"methodDependent","abstract":"

Applies the encoded query string to any existing query string for .get, .head, and .delete request.","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO11queryStringyA2EmF":{"name":"queryString","abstract":"

Applies the encoded query string to any existing query string from the URLRequest.

","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO8httpBodyyA2EmF":{"name":"httpBody","abstract":"

Applies the encoded query string to the httpBody of the URLRequest.

","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html":{"name":"Destination","abstract":"

Defines where the URL-encoded string should be set for each URLRequest.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7defaultACvpZ":{"name":"default","abstract":"

Returns an encoder with default parameters.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7encoderAA0bcE0Cvp":{"name":"encoder","abstract":"

The URLEncodedFormEncoder to use.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11destinationAC11DestinationOvp":{"name":"destination","abstract":"

The Destination for the URL-encoded string.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7encoder11destinationAcA0bcE0C_AC11DestinationOtcfc":{"name":"init(encoder:destination:)","abstract":"

Creates an instance with the provided URLEncodedFormEncoder instance and Destination value.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","parent_name":"URLEncodedFormParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7defaultACvpZ":{"name":"default","abstract":"

Returns an encoder with default parameters.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC13prettyPrintedACvpZ":{"name":"prettyPrinted","abstract":"

Returns an encoder with JSONEncoder.outputFormatting set to .prettyPrinted.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC10sortedKeysACvpZ":{"name":"sortedKeys","abstract":"

Returns an encoder with JSONEncoder.outputFormatting set to .sortedKeys.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7encoder10Foundation11JSONEncoderCvp":{"name":"encoder","abstract":"

JSONEncoder used to encode parameters.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7encoderAC10Foundation11JSONEncoderC_tcfc":{"name":"init(encoder:)","abstract":"

Creates an instance with the provided JSONEncoder.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","parent_name":"JSONParameterEncoder"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"AlamofireNotifications"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO14ConnectionTypeO14ethernetOrWiFiyA2GmF":{"name":"ethernetOrWiFi","abstract":"

The connection type is either over Ethernet or WiFi.

","parent_name":"ConnectionType"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO14ConnectionTypeO8cellularyA2GmF":{"name":"cellular","abstract":"

The connection type is a cellular connection.

","parent_name":"ConnectionType"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO7unknownyA2EmF":{"name":"unknown","abstract":"

It is unknown whether the network is reachable.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO12notReachableyA2EmF":{"name":"notReachable","abstract":"

The network is not reachable.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO9reachableyA2E14ConnectionTypeOcAEmF":{"name":"reachable(_:)","abstract":"

The network is reachable on the associated ConnectionType.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html":{"name":"ConnectionType","abstract":"

Defines the various connection types detected by reachability flags.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html":{"name":"NetworkReachabilityStatus","abstract":"

Defines the various states of network reachability.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC8Listenera":{"name":"Listener","abstract":"

A closure executed when the network reachability status changes. The closure takes a single argument: the","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC7defaultACSgvpZ":{"name":"default","abstract":"

Default NetworkReachabilityManager for the zero address and a listenerQueue of .main.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC11isReachableSbvp":{"name":"isReachable","abstract":"

Whether the network is currently reachable.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC21isReachableOnCellularSbvp":{"name":"isReachableOnCellular","abstract":"

Whether the network is currently reachable over the cellular interface.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC27isReachableOnEthernetOrWiFiSbvp":{"name":"isReachableOnEthernetOrWiFi","abstract":"

Whether the network is currently reachable over Ethernet or WiFi interface.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC17reachabilityQueueSo17OS_dispatch_queueCvp":{"name":"reachabilityQueue","abstract":"

DispatchQueue on which reachability will update.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC5flagsSo09SCNetworkC5FlagsVSgvp":{"name":"flags","abstract":"

Flags of the current reachability type, if any.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC6statusAC0bC6StatusOvp":{"name":"status","abstract":"

The current network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC4hostACSgSS_tcfc":{"name":"init(host:)","abstract":"

Creates an instance with the specified host.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerCACSgycfc":{"name":"init()","abstract":"

Creates an instance that monitors the address 0.0.0.0.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC14startListening7onQueue0G16UpdatePerformingSbSo17OS_dispatch_queueC_yAC0bC6StatusOctF":{"name":"startListening(onQueue:onUpdatePerforming:)","abstract":"

Starts listening for changes in network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC13stopListeningyyF":{"name":"stopListening()","abstract":"

Stops listening for changes in network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC23encodingMemoryThresholds6UInt64VvpZ":{"name":"encodingMemoryThreshold","abstract":"

Default memory threshold used when encoding MultipartFormData, in bytes.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC11contentTypeSSvp":{"name":"contentType","abstract":"

The Content-Type header value containing the boundary used to generate the multipart/form-data.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC13contentLengths6UInt64Vvp":{"name":"contentLength","abstract":"

The content length of all body parts used to generate the multipart/form-data not including the boundaries.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC8boundarySSvp":{"name":"boundary","abstract":"

The boundary used to separate the body parts in the encoded form data.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC11fileManager8boundaryACSo06NSFileF0C_SSSgtcfc":{"name":"init(fileManager:boundary:)","abstract":"

Creates an instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withName04fileG08mimeTypey10Foundation0D0V_S2SSgAKtF":{"name":"append(_:withName:fileName:mimeType:)","abstract":"

Creates a body part from the data and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withNamey10Foundation3URLV_SStF":{"name":"append(_:withName:)","abstract":"

Creates a body part from the file and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withName04fileG08mimeTypey10Foundation3URLV_S3StF":{"name":"append(_:withName:fileName:mimeType:)","abstract":"

Creates a body part from the file and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_10withLength4name8fileName8mimeTypeySo13NSInputStreamC_s6UInt64VS3StF":{"name":"append(_:withLength:name:fileName:mimeType:)","abstract":"

Creates a body part from the stream and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_10withLength7headersySo13NSInputStreamC_s6UInt64VAA11HTTPHeadersVtF":{"name":"append(_:withLength:headers:)","abstract":"

Creates a body part with the stream, length, and headers and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6encode10Foundation0D0VyKF":{"name":"encode()","abstract":"

Encodes all appended body parts into a single Data value.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC012writeEncodedD02toy10Foundation3URLV_tKF":{"name":"writeEncodedData(to:)","abstract":"

Writes all appended body parts to the given file URL.

","parent_name":"MultipartFormData"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC32sessionDidBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtcSgvp":{"name":"sessionDidBecomeInvalidWithError","abstract":"

Closure called on the urlSession(_:didBecomeInvalidWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23taskDidReceiveChallengeySo12NSURLSessionC_So0I4TaskCSo019NSURLAuthenticationH0CtcSgvp":{"name":"taskDidReceiveChallenge","abstract":"

Closure called on the urlSession(_:task:didReceive:completionHandler:).

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC19taskDidSendBodyDataySo12NSURLSessionC_So0J4TaskCs5Int64VA2JtcSgvp":{"name":"taskDidSendBodyData","abstract":"

Closure that receives urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC21taskNeedNewBodyStreamySo12NSURLSessionC_So0J4TaskCtcSgvp":{"name":"taskNeedNewBodyStream","abstract":"

Closure called on the urlSession(_:task:needNewBodyStream:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30taskWillPerformHTTPRedirectionySo12NSURLSessionC_So0I4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtcSgvp":{"name":"taskWillPerformHTTPRedirection","abstract":"

Closure called on the urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30taskDidFinishCollectingMetricsySo12NSURLSessionC_So0J4TaskCSo0jkI0CtcSgvp":{"name":"taskDidFinishCollectingMetrics","abstract":"

Closure called on the urlSession(_:task:didFinishCollecting:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC15taskDidCompleteySo12NSURLSessionC_So0H4TaskCs5Error_pSgtcSgvp":{"name":"taskDidComplete","abstract":"

Closure called on the urlSession(_:task:didCompleteWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC28taskIsWaitingForConnectivityySo12NSURLSessionC_So0J4TaskCtcSgvp":{"name":"taskIsWaitingForConnectivity","abstract":"

Closure called on the urlSession(_:taskIsWaitingForConnectivity:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26dataTaskDidReceiveResponseySo12NSURLSessionC_So0j4DataF0CSo13NSURLResponseCtcSgvp":{"name":"dataTaskDidReceiveResponse","abstract":"

Closure called on the urlSession(_:dataTask:didReceive:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC22dataTaskDidReceiveDataySo12NSURLSessionC_So0jiF0C10Foundation0I0VtcSgvp":{"name":"dataTaskDidReceiveData","abstract":"

Closure that receives the urlSession(_:dataTask:didReceive:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC25dataTaskWillCacheResponseySo12NSURLSessionC_So0j4DataF0CSo19NSCachedURLResponseCtcSgvp":{"name":"dataTaskWillCacheResponse","abstract":"

Closure called on the urlSession(_:dataTask:willCacheResponse:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC37downloadTaskDidFinishDownloadingToURLySo12NSURLSessionC_So0l8DownloadF0C10Foundation0K0VtcSgvp":{"name":"downloadTaskDidFinishDownloadingToURL","abstract":"

Closure called on the urlSession(_:downloadTask:didFinishDownloadingTo:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC24downloadTaskDidWriteDataySo12NSURLSessionC_So0j8DownloadF0Cs5Int64VA2JtcSgvp":{"name":"downloadTaskDidWriteData","abstract":"

Closure called on the urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC29downloadTaskDidResumeAtOffsetySo12NSURLSessionC_So0k8DownloadF0Cs5Int64VAJtcSgvp":{"name":"downloadTaskDidResumeAtOffset","abstract":"

Closure called on the urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC33requestDidCreateInitialURLRequestyAA7RequestC_10Foundation0I0VtcSgvp":{"name":"requestDidCreateInitialURLRequest","abstract":"

Closure called on the request(_:didCreateInitialURLRequest:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC41requestDidFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtcSgvp":{"name":"requestDidFailToCreateURLRequestWithError","abstract":"

Closure called on the request(_:didFailToCreateURLRequestWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC038requestDidAdaptInitialRequestToAdaptedI0yAA0I0C_10Foundation10URLRequestVAItcSgvp":{"name":"requestDidAdaptInitialRequestToAdaptedRequest","abstract":"

Closure called on the request(_:didAdaptInitialRequest:to:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC40requestDidFailToAdaptURLRequestWithErroryAA7RequestC_10Foundation0J0VAA7AFErrorOtcSgvp":{"name":"requestDidFailToAdaptURLRequestWithError","abstract":"

Closure called on the request(_:didFailToAdaptURLRequest:withError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26requestDidCreateURLRequestyAA7RequestC_10Foundation0H0VtcSgvp":{"name":"requestDidCreateURLRequest","abstract":"

Closure called on the request(_:didCreateURLRequest:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidCreateTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidCreateTask","abstract":"

Closure called on the request(_:didCreateTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23requestDidGatherMetricsyAA7RequestC_So016NSURLSessionTaskH0CtcSgvp":{"name":"requestDidGatherMetrics","abstract":"

Closure called on the request(_:didGatherMetrics:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC32requestDidFailTaskEarlyWithErroryAA7RequestC_So012NSURLSessionH0CAA7AFErrorOtcSgvp":{"name":"requestDidFailTaskEarlyWithError","abstract":"

Closure called on the request(_:didFailTask:earlyWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC31requestDidCompleteTaskWithErroryAA7RequestC_So012NSURLSessionH0CAA7AFErrorOSgtcSgvp":{"name":"requestDidCompleteTaskWithError","abstract":"

Closure called on the request(_:didCompleteTask:with:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC17requestIsRetryingyAA7RequestCcSgvp":{"name":"requestIsRetrying","abstract":"

Closure called on the requestIsRetrying(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidFinishyAA7RequestCcSgvp":{"name":"requestDidFinish","abstract":"

Closure called on the requestDidFinish(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidResumeyAA7RequestCcSgvp":{"name":"requestDidResume","abstract":"

Closure called on the requestDidResume(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidResumeTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidResumeTask","abstract":"

Closure called on the request(_:didResumeTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC17requestDidSuspendyAA7RequestCcSgvp":{"name":"requestDidSuspend","abstract":"

Closure called on the requestDidSuspend(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC21requestDidSuspendTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidSuspendTask","abstract":"

Closure called on the request(_:didSuspendTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidCancelyAA7RequestCcSgvp":{"name":"requestDidCancel","abstract":"

Closure called on the requestDidCancel(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidCancelTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidCancelTask","abstract":"

Closure called on the request(_:didCancelTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC47requestDidValidateRequestResponseDataWithResultyAA0jH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAG0J0VSgs0L0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseDataWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:data:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23requestDidParseResponseyAA11DataRequestC_AA0iH0Vy10Foundation0I0VSgAA7AFErrorOGtcSgvp":{"name":"requestDidParseResponse","abstract":"

Closure called on the request(_:didParseResponse:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC43requestDidValidateRequestResponseWithResultyAA010DataStreamH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0K0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26requestDidCreateUploadableyAA13UploadRequestC_AF0H0OtcSgvp":{"name":"requestDidCreateUploadable","abstract":"

Closure called on the request(_:didCreateUploadable:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC41requestDidFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtcSgvp":{"name":"requestDidFailToCreateUploadableWithError","abstract":"

Closure called on the request(_:didFailToCreateUploadableWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC28requestDidProvideInputStreamyAA13UploadRequestC_So07NSInputI0CtcSgvp":{"name":"requestDidProvideInputStream","abstract":"

Closure called on the request(_:didProvideInputStream:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC46requestDidFinishDownloadingUsingTaskWithResultyAA15DownloadRequestC_So012NSURLSessionJ0Cs0L0Oy10Foundation3URLVAA7AFErrorOGtcSgvp":{"name":"requestDidFinishDownloadingUsingTaskWithResult","abstract":"

Closure called on the request(_:didFinishDownloadingUsing:with:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30requestDidCreateDestinationURLyAA15DownloadRequestC_10Foundation0I0VtcSgvp":{"name":"requestDidCreateDestinationURL","abstract":"

Closure called on the request(_:didCreateDestinationURL:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC50requestDidValidateRequestResponseFileURLWithResultyAA08DownloadH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAG3URLVSgs0L0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseFileURLWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC31requestDidParseDownloadResponseyAA0H7RequestC_AA0hI0Vy10Foundation3URLVSgAA7AFErrorOGtcSgvp":{"name":"requestDidParseDownloadResponse","abstract":"

Closure called on the request(_:didParseResponse:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC5queueACSo012OS_dispatch_E0C_tcfc":{"name":"init(queue:)","abstract":"

Creates an instance using the provided queue.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"ClosureEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didParseStreamyAA04DataG7RequestC_s6ResultOyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/Request/ResponseDisposition.html#/s:9Alamofire7RequestC19ResponseDispositionO5allowyA2EmF":{"name":"allow","abstract":"

Allow the request to continue normally.

","parent_name":"ResponseDisposition"},"Classes/Request/ResponseDisposition.html#/s:9Alamofire7RequestC19ResponseDispositionO6cancelyA2EmF":{"name":"cancel","abstract":"

Cancel the request, similar to calling cancel().

","parent_name":"ResponseDisposition"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO11initializedyA2EmF":{"name":"initialized","abstract":"

Initial state of the Request.

","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO7resumedyA2EmF":{"name":"resumed","abstract":"

State set when resume() is called. Any tasks created for the Request will have resume() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO9suspendedyA2EmF":{"name":"suspended","abstract":"

State set when suspend() is called. Any tasks created for the Request will have suspend() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO9cancelledyA2EmF":{"name":"cancelled","abstract":"

State set when cancel() is called. Any tasks created for the Request will have cancel() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO8finishedyA2EmF":{"name":"finished","abstract":"

State set when all response serialization completion closures have been cleared on the Request and","parent_name":"State"},"Classes/Request/State.html":{"name":"State","abstract":"

State of the Request, with managed transitions between states set when calling resume(), suspend(), or","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC2id10Foundation4UUIDVvp":{"name":"id","abstract":"

UUID providing a unique identifier for the Request, used in the Hashable and Equatable conformances.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15underlyingQueueSo17OS_dispatch_queueCvp":{"name":"underlyingQueue","abstract":"

The serial queue for all internal async actions.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC18serializationQueueSo17OS_dispatch_queueCvp":{"name":"serializationQueue","abstract":"

The queue used for all serialization actions. By default it’s a serial queue that targets underlyingQueue.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12eventMonitorAA05EventD0_pSgvp":{"name":"eventMonitor","abstract":"

EventMonitor used for event callbacks.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11interceptorAA0B11Interceptor_pSgvp":{"name":"interceptor","abstract":"

The Request‘s interceptor.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8delegateAA0B8Delegate_pSgvp":{"name":"delegate","abstract":"

The Request‘s delegate.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5stateAC5StateOvp":{"name":"state","abstract":"

State of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC13isInitializedSbvp":{"name":"isInitialized","abstract":"

Returns whether state is .initialized.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC9isResumedSbvp":{"name":"isResumed","abstract":"

Returns whether state is.resumed`.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11isSuspendedSbvp":{"name":"isSuspended","abstract":"

Returns whether state is .suspended.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11isCancelledSbvp":{"name":"isCancelled","abstract":"

Returns whether state is .cancelled.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10isFinishedSbvp":{"name":"isFinished","abstract":"

Returns whether state is .finished.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15ProgressHandlera":{"name":"ProgressHandler","abstract":"

Closure type executed when monitoring the upload or download progress of a request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgressSo10NSProgressCvp":{"name":"uploadProgress","abstract":"

Progress of the upload of the body of the executed URLRequest. Reset to 0 if the Request is retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgressSo10NSProgressCvp":{"name":"downloadProgress","abstract":"

Progress of the download of any response data. Reset to 0 if the Request is retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15redirectHandlerAA08RedirectD0_pSgvp":{"name":"redirectHandler","abstract":"

RedirectHandler set on the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21cachedResponseHandlerAA06CacheddE0_pSgvp":{"name":"cachedResponseHandler","abstract":"

CachedResponseHandler set on the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10credentialSo15NSURLCredentialCSgvp":{"name":"credential","abstract":"

URLCredential used for authentication challenges. Created by calling one of the authenticate methods.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8requestsSay10Foundation10URLRequestVGvp":{"name":"requests","abstract":"

All URLRequests created on behalf of the Request, including original and adapted requests.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC05firstB010Foundation10URLRequestVSgvp":{"name":"firstRequest","abstract":"

First URLRequest created on behalf of the Request. May not be the first one actually executed.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC04lastB010Foundation10URLRequestVSgvp":{"name":"lastRequest","abstract":"

Last URLRequest created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

Current URLRequest created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC17performedRequestsSay10Foundation10URLRequestVGvp":{"name":"performedRequests","abstract":"

URLRequests from all of the URLSessionTasks executed on behalf of the Request. May be different from","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

HTTPURLResponse received from the server, if any. If the Request was retried, this is the response of the","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5tasksSaySo16NSURLSessionTaskCGvp":{"name":"tasks","abstract":"

All URLSessionTasks created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC9firstTaskSo012NSURLSessionD0CSgvp":{"name":"firstTask","abstract":"

First URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8lastTaskSo012NSURLSessionD0CSgvp":{"name":"lastTask","abstract":"

Last URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC4taskSo16NSURLSessionTaskCSgvp":{"name":"task","abstract":"

Current URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10allMetricsSaySo016NSURLSessionTaskD0CGvp":{"name":"allMetrics","abstract":"

All URLSessionTaskMetrics gathered on behalf of the Request. Should correspond to the tasks created.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12firstMetricsSo016NSURLSessionTaskD0CSgvp":{"name":"firstMetrics","abstract":"

First URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11lastMetricsSo016NSURLSessionTaskD0CSgvp":{"name":"lastMetrics","abstract":"

Last URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

Current URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10retryCountSivp":{"name":"retryCount","abstract":"

Number of times the Request has been retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5errorAA7AFErrorOSgvp":{"name":"error","abstract":"

Error returned from Alamofire internally, from the network request directly, or any validators executed.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC6cancelACXDyF":{"name":"cancel()","abstract":"

Cancels the instance. Once cancelled, a Request can no longer be resumed or suspended.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7suspendACXDyF":{"name":"suspend()","abstract":"

Suspends the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC6resumeACXDyF":{"name":"resume()","abstract":"

Resumes the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12authenticate8username8password11persistenceACXDSS_SSSo26NSURLCredentialPersistenceVtF":{"name":"authenticate(username:password:persistence:)","abstract":"

Associates a credential using the provided values with the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12authenticate4withACXDSo15NSURLCredentialC_tF":{"name":"authenticate(with:)","abstract":"

Associates the provided credential with the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgress5queue7closureACXDSo012OS_dispatch_E0C_ySo10NSProgressCctF":{"name":"downloadProgress(queue:closure:)","abstract":"

Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgress5queue7closureACXDSo012OS_dispatch_E0C_ySo10NSProgressCctF":{"name":"uploadProgress(queue:closure:)","abstract":"

Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8redirect5usingACXDAA15RedirectHandler_p_tF":{"name":"redirect(using:)","abstract":"

Sets the redirect handler for the instance which will be used if a redirect response is encountered.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC13cacheResponse5usingACXDAA06CachedD7Handler_p_tF":{"name":"cacheResponse(using:)","abstract":"

Sets the cached response handler for the Request which will be used when attempting to cache a response.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescription2on7callingACXDSo17OS_dispatch_queueC_ySSctF":{"name":"cURLDescription(on:calling:)","abstract":"

Sets a handler to be called when the cURL description of the request is available.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescription7callingACXDySSc_tF":{"name":"cURLDescription(calling:)","abstract":"

Sets a handler to be called when the cURL description of the request is available.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC20onURLRequestCreation0C07performACXDSo17OS_dispatch_queueC_y10Foundation0D0VctF":{"name":"onURLRequestCreation(on:perform:)","abstract":"

Sets a closure to called whenever Alamofire creates a URLRequest for this instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC24onURLSessionTaskCreation0C07performACXDSo17OS_dispatch_queueC_ySo012NSURLSessionE0CctF":{"name":"onURLSessionTaskCreation(on:perform:)","abstract":"

Sets a closure to be called whenever the instance creates a URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgress15bufferingPolicyAA8StreamOfVySo10NSProgressCGScS12ContinuationV09BufferingF0OyAI__G_tF":{"name":"uploadProgress(bufferingPolicy:)","abstract":"

Creates a StreamOf<Progress> for the instance’s upload progress.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgress15bufferingPolicyAA8StreamOfVySo10NSProgressCGScS12ContinuationV09BufferingF0OyAI__G_tF":{"name":"downloadProgress(bufferingPolicy:)","abstract":"

Creates a StreamOf<Progress> for the instance’s download progress.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11urlRequests15bufferingPolicyAA8StreamOfVy10Foundation10URLRequestVGScS12ContinuationV09BufferingF0OyAJ__G_tF":{"name":"urlRequests(bufferingPolicy:)","abstract":"

Creates a StreamOf<URLRequest> for the URLRequests produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15urlSessionTasks15bufferingPolicyAA8StreamOfVySo16NSURLSessionTaskCGScS12ContinuationV09BufferingG0OyAI__G_tF":{"name":"urlSessionTasks(bufferingPolicy:)","abstract":"

Creates a StreamOf<URLSessionTask> for the URLSessionTasks produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16cURLDescriptions15bufferingPolicyAA8StreamOfVySSGScS12ContinuationV09BufferingE0OySS__G_tF":{"name":"cURLDescriptions(bufferingPolicy:)","abstract":"

Creates a StreamOf<String> for the cURL descriptions produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didResumeNotificationSo18NSNotificationNameavpZ":{"name":"didResumeNotification","abstract":"

Posted when a Request is resumed. The Notification contains the resumed Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC22didSuspendNotificationSo18NSNotificationNameavpZ":{"name":"didSuspendNotification","abstract":"

Posted when a Request is suspended. The Notification contains the suspended Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didCancelNotificationSo18NSNotificationNameavpZ":{"name":"didCancelNotification","abstract":"

Posted when a Request is cancelled. The Notification contains the cancelled Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didFinishNotificationSo18NSNotificationNameavpZ":{"name":"didFinishNotification","abstract":"

Posted when a Request is finished. The Notification contains the completed Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC25didResumeTaskNotificationSo18NSNotificationNameavpZ":{"name":"didResumeTaskNotification","abstract":"

Posted when a URLSessionTask is resumed. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC26didSuspendTaskNotificationSo18NSNotificationNameavpZ":{"name":"didSuspendTaskNotification","abstract":"

Posted when a URLSessionTask is suspended. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC25didCancelTaskNotificationSo18NSNotificationNameavpZ":{"name":"didCancelTaskNotification","abstract":"

Posted when a URLSessionTask is cancelled. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC27didCompleteTaskNotificationSo18NSNotificationNameavpZ":{"name":"didCompleteTaskNotification","abstract":"

Posted when a URLSessionTask is completed. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request/ResponseDisposition.html":{"name":"ResponseDisposition","abstract":"

Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

","parent_name":"Request"},"Classes/Request.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Request"},"Classes/Request.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11descriptionSSvp":{"name":"description","abstract":"

A textual representation of this instance, including the HTTPMethod and URL if the URLRequest has been","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescriptionSSyF":{"name":"cURLDescription()","abstract":"

cURL representation of the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16ValidationResulta":{"name":"ValidationResult","abstract":"

Used to represent whether a validation succeeded or failed.

","parent_name":"Request"},"Classes/DownloadRequest/Downloadable.html#/s:9Alamofire15DownloadRequestC12DownloadableO7requestyAeA21URLRequestConvertible_pcAEmF":{"name":"request(_:)","abstract":"

Download should be started from the URLRequest produced by the associated URLRequestConvertible value.

","parent_name":"Downloadable"},"Classes/DownloadRequest/Downloadable.html#/s:9Alamofire15DownloadRequestC12DownloadableO10resumeDatayAE10Foundation0F0VcAEmF":{"name":"resumeData(_:)","abstract":"

Download should be started from the associated resume Data value.

","parent_name":"Downloadable"},"Classes/DownloadRequest/Options.html#/s:9Alamofire15DownloadRequestC7OptionsV29createIntermediateDirectoriesAEvpZ":{"name":"createIntermediateDirectories","abstract":"

Specifies that intermediate directories for the destination URL should be created.

","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:9Alamofire15DownloadRequestC7OptionsV18removePreviousFileAEvpZ":{"name":"removePreviousFile","abstract":"

Specifies that any previous file at the destination URL should be removed.

","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:SY8rawValue03RawB0Qzvp":{"name":"rawValue","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:s9OptionSetP8rawValuex03RawD0Qz_tcfc":{"name":"init(rawValue:)","parent_name":"Options"},"Classes/DownloadRequest/Options.html":{"name":"Options","abstract":"

A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11Destinationa":{"name":"Destination","abstract":"

A closure executed once a DownloadRequest has successfully completed in order to determine where to move the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC09suggestedB11Destination3for2in7options10Foundation3URLV011destinationJ0_AC7OptionsVAGtAJ_So17NSHTTPURLResponseCtcSo21NSSearchPathDirectoryV_So0nO10DomainMaskVAMtFZ":{"name":"suggestedDownloadDestination(for:in:options:)","abstract":"

Creates a download file destination closure which uses the default file manager to move the temporary file to a","parent_name":"DownloadRequest"},"Classes/DownloadRequest/Downloadable.html":{"name":"Downloadable","abstract":"

Type describing the source used to create the underlying URLSessionDownloadTask.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10resumeData10Foundation0E0VSgvp":{"name":"resumeData","abstract":"

If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC7fileURL10Foundation0E0VSgvp":{"name":"fileURL","abstract":"

If the download is successful, the URL where the file was downloaded.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12downloadableAC12DownloadableOvp":{"name":"downloadable","abstract":"

Downloadable value used for this instance.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC4task13forResumeData5usingSo16NSURLSessionTaskC10Foundation0G0V_So0I0CtF":{"name":"task(forResumeData:using:)","abstract":"

Creates a URLSessionTask from the provided resume data.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancelACXDyF":{"name":"cancel()","abstract":"

Cancels the instance. Once cancelled, a DownloadRequest can no longer be resumed or suspended.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancel19producingResumeDataACXDSb_tF":{"name":"cancel(producingResumeData:)","abstract":"

Cancels the instance, optionally producing resume data. Once cancelled, a DownloadRequest can no longer be","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancel21byProducingResumeDataACXDy10Foundation0H0VSgc_tF":{"name":"cancel(byProducingResumeData:)","abstract":"

Cancels the instance while producing resume data. Once cancelled, a DownloadRequest can no longer be resumed","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCAI3URLVSgtcF":{"name":"validate(_:)","abstract":"

Validates the request, using the specified closure.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0E10SerializerRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DownloadResponsePublisher for this instance using the given ResponseSerializer and DispatchQueue.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0bE18SerializerProtocolRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DownloadResponsePublisher for this instance using the given DownloadResponseSerializerProtocol and","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10publishURL5queueAA0B17ResponsePublisherVy10Foundation0E0VGSo012OS_dispatch_F0C_tF":{"name":"publishURL(queue:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a URLResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11publishData5queue12preprocessor18emptyResponseCodes0hC7MethodsAA0bI9PublisherVy10Foundation0E0VGSo012OS_dispatch_F0C_AA0E12Preprocessor_pShySiGShyAA10HTTPMethodVGtF":{"name":"publishData(queue:preprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a DataResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC13publishString5queue12preprocessor8encoding18emptyResponseCodes0iC7MethodsAA0bJ9PublisherVySSGSo012OS_dispatch_F0C_AA16DataPreprocessor_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"publishString(queue:preprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a StringResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jK7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA16DataPreprocessor_pAA0Q7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)","abstract":"

Undocumented

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jC7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA16DataPreprocessor_pAA0Q7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a DecodableResponseSerializer to serialize","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC19publishUnserialized2onAA0B17ResponsePublisherVy10Foundation3URLVSgGSo17OS_dispatch_queueC_tF":{"name":"publishUnserialized(on:)","abstract":"

Creates a DownloadResponsePublisher for this instance which does not serialize the response before publishing.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15serializingData23automaticallyCancelling16dataPreprocessor18emptyResponseCodes0jC7MethodsAA0B4TaskVy10Foundation0E0VGSb_AA0eI0_pShySiGShyAA10HTTPMethodVGtF":{"name":"serializingData(automaticallyCancelling:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await a Data value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC20serializingDecodable_23automaticallyCancelling16dataPreprocessor7decoder18emptyResponseCodes0kC7MethodsAA0B4TaskVyxGxm_SbAA04DataI0_pAA0P7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"serializingDecodable(_:automaticallyCancelling:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await serialization of a Decodable value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC28serializingDownloadedFileURL23automaticallyCancellingAA0B4TaskVy10Foundation0G0VGSb_tF":{"name":"serializingDownloadedFileURL(automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization of the downloaded file’s URL on disk.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC17serializingString23automaticallyCancelling16dataPreprocessor8encoding18emptyResponseCodes0kC7MethodsAA0B4TaskVySSGSb_AA04DataI0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"serializingString(automaticallyCancelling:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await serialization of a String value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC011serializingB05using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA18ResponseSerializerRzlF":{"name":"serializingDownload(using:automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization using the provided ResponseSerializer instance.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC011serializingB05using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0B26ResponseSerializerProtocolRzlF":{"name":"serializingDownload(using:automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization using the provided DownloadResponseSerializerProtocol","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue17completionHandlerACXDSo012OS_dispatch_E0C_yAA0B8ResponseVy10Foundation3URLVSgAA7AFErrorOGctF":{"name":"response(queue:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0bkF8ProtocolRzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0kF0RzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11responseURL5queue17completionHandlerACXDSo012OS_dispatch_F0C_yAA0B8ResponseVy10Foundation0E0VAA7AFErrorOGctF":{"name":"responseURL(queue:completionHandler:)","abstract":"

Adds a handler using a URLResponseSerializer to be called once the request is finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12responseData5queue16dataPreprocessor18emptyResponseCodes0iC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA0eH0_pShySiGShyAA10HTTPMethodVGyAA0bJ0Vy10Foundation0E0VAA7AFErrorOGctF":{"name":"responseData(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DataResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC14responseString5queue16dataPreprocessor8encoding18emptyResponseCodes0jC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA04DataH0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGyAA0bK0VySSAA7AFErrorOGctF":{"name":"responseString(queue:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a StringResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12responseJSON5queue16dataPreprocessor18emptyResponseCodes0iC7Methods7options17completionHandlerACXDSo012OS_dispatch_F0C_AA04DataH0_pShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVyAA0bJ0VyypAA7AFErrorOGctF":{"name":"responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)","abstract":"

Adds a handler using a JSONResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC17responseDecodable2of5queue16dataPreprocessor7decoder18emptyResponseCodes0kC7Methods17completionHandlerACXDxm_So012OS_dispatch_G0CAA04DataI0_pAA0S7Decoder_pShySiGShyAA10HTTPMethodVGyAA0bL0VyxAA7AFErrorOGctSeRzlF":{"name":"responseDecodable(of:queue:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DownloadRequest"},"Classes/DataStreamRequest/CancellationToken.html#/s:9Alamofire17DataStreamRequestC17CancellationTokenV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the ongoing stream by canceling the underlying DataStreamRequest.

","parent_name":"CancellationToken"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

Last URLRequest issued by the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

Last HTTPURLResponse received by the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

Last URLSessionTaskMetrics produced for the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV5errorAA7AFErrorOSgvp":{"name":"error","abstract":"

AFError produced for the instance, if any.

","parent_name":"Completion"},"Classes/DataStreamRequest/Event.html#/s:9Alamofire17DataStreamRequestC5EventO6streamyAEy_xq_Gs6ResultOyxq_GcAGms5ErrorR_r0_lF":{"name":"stream(_:)","abstract":"

Output produced every time the instance receives additional Data. The associated value contains the","parent_name":"Event"},"Classes/DataStreamRequest/Event.html#/s:9Alamofire17DataStreamRequestC5EventO8completeyAEy_xq_GAC10CompletionVcAGms5ErrorR_r0_lF":{"name":"complete(_:)","abstract":"

Output produced when the instance has completed, whether due to stream end, cancellation, or an error.","parent_name":"Event"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5eventAC5EventOy_xq_Gvp":{"name":"event","abstract":"

Latest Event from the stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5tokenAC17CancellationTokenVvp":{"name":"token","abstract":"

Token used to cancel the stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V6cancelyyF":{"name":"cancel()","abstract":"

Cancel the ongoing stream by canceling the underlying DataStreamRequest.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V6results6ResultOyxq_GSgvp":{"name":"result","abstract":"

Incoming Result values from Event.stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5valuexSgvp":{"name":"value","abstract":"

Success value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5errorq_Sgvp":{"name":"error","abstract":"

Failure value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V10completionAC10CompletionVSgvp":{"name":"completion","abstract":"

Completion value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC7Handlera":{"name":"Handler","abstract":"

Closure type handling DataStreamRequest.Stream values.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Stream.html":{"name":"Stream","abstract":"

Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Event.html":{"name":"Event","abstract":"

Type representing an event flowing through the stream. Contains either the Result of processing streamed","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Completion.html":{"name":"Completion","abstract":"

Value containing the state of a DataStreamRequest when the stream was completed.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/CancellationToken.html":{"name":"CancellationToken","abstract":"

Type used to cancel an ongoing stream.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC11convertibleAA21URLRequestConvertible_pvp":{"name":"convertible","abstract":"

URLRequestConvertible value used to create URLRequests for this instance.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC021automaticallyCancelOnC5ErrorSbvp":{"name":"automaticallyCancelOnStreamError","abstract":"

Whether or not the instance will be cancelled if stream parsing encounters an error.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCtcF":{"name":"validate(_:)","abstract":"

Validates the URLRequest and HTTPURLResponse received for the instance using the provided Validation closure.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07asInputC010bufferSizeSo07NSInputC0CSgSi_tF":{"name":"asInputStream(bufferSize:)","abstract":"

Produces an InputStream that receives the Data received by the instance.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse0E07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseC_yAA0D0C19ResponseDispositionOctctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse0E07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseCctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07publishC05using2onAA0bC9PublisherVy16SerializedObjectQzGx_So17OS_dispatch_queueCtAA0bC10SerializerRzlF":{"name":"publishStream(using:on:)","abstract":"

Creates a DataStreamPublisher for this instance using the given DataStreamSerializer and DispatchQueue.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07publishB05queueAA0bC9PublisherVy10Foundation0B0VGSo012OS_dispatch_F0C_tF":{"name":"publishData(queue:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a PassthroughStreamSerializer to stream Data","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC13publishString5queueAA0bC9PublisherVySSGSo012OS_dispatch_G0C_tF":{"name":"publishString(queue:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a StringStreamSerializer to serialize stream","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC16publishDecodable4type5queue7decoder12preprocessorAA0bC9PublisherVyxGxm_So012OS_dispatch_H0CAA0B7Decoder_pAA0B12Preprocessor_ptSeRzlF":{"name":"publishDecodable(type:queue:decoder:preprocessor:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a DecodableStreamSerializer with the provided","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC13httpResponses15bufferingPolicyAA0C2OfVySo17NSHTTPURLResponseCGScS12ContinuationV09BufferingH0OyAI__G_tF":{"name":"httpResponses(bufferingPolicy:)","abstract":"

Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse7performACXDAA0D0C19ResponseDispositionOSo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure returning a Request.ResponseDisposition, called whenever the DataStreamRequest","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse7performACXDySo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure called whenever the DataStreamRequest produces an HTTPURLResponse.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC10streamTaskAA0bcF0VyF":{"name":"streamTask()","abstract":"

Creates a DataStreamTask used to await streams of serialized values.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC02on6streamACXDSo17OS_dispatch_queueC_yAC0C0Vy_10Foundation0B0Vs5NeverOGKctF":{"name":"responseStream(on:stream:)","abstract":"

Adds a StreamHandler which performs no parsing on incoming Data.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC05using2on6streamACXDx_So17OS_dispatch_queueCyAC0C0Vy_16SerializedObjectQzAA7AFErrorOGKctAA0bC10SerializerRzlF":{"name":"responseStream(using:on:stream:)","abstract":"

Adds a StreamHandler which uses the provided DataStreamSerializer to process incoming Data.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC6String2on6streamACXDSo17OS_dispatch_queueC_yAC0C0Vy_SSs5NeverOGKctF":{"name":"responseStreamString(on:stream:)","abstract":"

Adds a StreamHandler which parses incoming Data as a UTF8 String.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC9Decodable2of2on5using12preprocessor6streamACXDxm_So17OS_dispatch_queueCAA0B7Decoder_pAA0B12Preprocessor_pyAC0C0Vy_xAA7AFErrorOGKctSeRzlF":{"name":"responseStreamDecodable(of:on:using:preprocessor:stream:)","abstract":"

Adds a StreamHandler which parses incoming Data using the provided DataDecoder.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URLRequest and HTTPURLResponse and returns whether the","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DataStreamRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC11convertibleAA21URLRequestConvertible_pvp":{"name":"convertible","abstract":"

URLRequestConvertible value used to create URLRequests for this instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC4data10Foundation0B0VSgvp":{"name":"data","abstract":"

Data read from the server so far.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCAI0B0VSgtcF":{"name":"validate(_:)","abstract":"

Validates the request, using the specified closure.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse0D07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseC_yAA0C0C19ResponseDispositionOctctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse0D07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseCctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0E10SerializerRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DataResponsePublisher for this instance using the given ResponseSerializer and DispatchQueue.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC07publishB05queue12preprocessor18emptyResponseCodes0gC7MethodsAA0bH9PublisherVy10Foundation0B0VGSo012OS_dispatch_E0C_AA0B12Preprocessor_pShySiGShyAA10HTTPMethodVGtF":{"name":"publishData(queue:preprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a DataResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC13publishString5queue12preprocessor8encoding18emptyResponseCodes0iC7MethodsAA0bJ9PublisherVySSGSo012OS_dispatch_F0C_AA0B12Preprocessor_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"publishString(queue:preprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a StringResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jK7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA0B12Preprocessor_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)","abstract":"

Undocumented

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jC7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA0B12Preprocessor_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a DecodableResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19publishUnserialized5queueAA0B17ResponsePublisherVy10Foundation0B0VSgGSo012OS_dispatch_F0C_tF":{"name":"publishUnserialized(queue:)","abstract":"

Creates a DataResponsePublisher for this instance which does not serialize the response before publishing.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC13httpResponses15bufferingPolicyAA8StreamOfVySo17NSHTTPURLResponseCGScS12ContinuationV09BufferingG0OyAI__G_tF":{"name":"httpResponses(bufferingPolicy:)","abstract":"

Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse7performACXDAA0C0C19ResponseDispositionOSo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure returning a Request.ResponseDisposition, called whenever the DataRequest produces an","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse7performACXDySo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC011serializingB023automaticallyCancelling16dataPreprocessor18emptyResponseCodes0iC7MethodsAA0B4TaskVy10Foundation0B0VGSb_AA0bH0_pShySiGShyAA10HTTPMethodVGtF":{"name":"serializingData(automaticallyCancelling:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await a Data value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC20serializingDecodable_23automaticallyCancelling16dataPreprocessor7decoder18emptyResponseCodes0kC7MethodsAA0B4TaskVyxGxm_SbAA0bI0_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"serializingDecodable(_:automaticallyCancelling:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await serialization of a Decodable value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC17serializingString23automaticallyCancelling16dataPreprocessor8encoding18emptyResponseCodes0kC7MethodsAA0B4TaskVySSGSb_AA0bI0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"serializingString(automaticallyCancelling:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await serialization of a String value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19serializingResponse5using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0E10SerializerRzlF":{"name":"serializingResponse(using:automaticallyCancelling:)","abstract":"

Creates a DataTask to await serialization using the provided ResponseSerializer instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19serializingResponse5using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0bE18SerializerProtocolRzlF":{"name":"serializingResponse(using:automaticallyCancelling:)","abstract":"

Creates a DataTask to await serialization using the provided DataResponseSerializerProtocol instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue17completionHandlerACXDSo012OS_dispatch_E0C_yAA0B8ResponseVy10Foundation0B0VSgAA7AFErrorOGctF":{"name":"response(queue:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0bkF8ProtocolRzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0kF0RzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC08responseB05queue16dataPreprocessor18emptyResponseCodes0hC7Methods17completionHandlerACXDSo012OS_dispatch_E0C_AA0bG0_pShySiGShyAA10HTTPMethodVGyAA0bI0Vy10Foundation0B0VAA7AFErrorOGctF":{"name":"responseData(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DataResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14responseString5queue16dataPreprocessor8encoding18emptyResponseCodes0jC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA0bH0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGyAA0bK0VySSAA7AFErrorOGctF":{"name":"responseString(queue:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a StringResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC12responseJSON5queue16dataPreprocessor18emptyResponseCodes0iC7Methods7options17completionHandlerACXDSo012OS_dispatch_F0C_AA0bH0_pShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVyAA0bJ0VyypAA7AFErrorOGctF":{"name":"responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)","abstract":"

Adds a handler using a JSONResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC17responseDecodable2of5queue16dataPreprocessor7decoder18emptyResponseCodes0kC7Methods17completionHandlerACXDxm_So012OS_dispatch_G0CAA0bI0_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGyAA0bL0VyxAA7AFErrorOGctSeRzlF":{"name":"responseDecodable(of:queue:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DataRequest"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV8intervalSdvp":{"name":"interval","abstract":"

TimeInterval defining the duration of the time window before the current time in which the number of","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV15maximumAttemptsSivp":{"name":"maximumAttempts","abstract":"

Total refresh attempts allowed within interval before throwing an .excessiveRefresh error.

","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV8interval15maximumAttemptsAEyx_GSd_Sitcfc":{"name":"init(interval:maximumAttempts:)","abstract":"

Creates a RefreshWindow instance from the specified interval and maximumAttempts.

","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC10Credentiala":{"name":"Credential","abstract":"

Type of credential used to authenticate requests.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor/RefreshWindow.html":{"name":"RefreshWindow","abstract":"

Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC10credential10CredentialQzSgvp":{"name":"credential","abstract":"

The Credential used to authenticate requests.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC13authenticator10credential13refreshWindowACyxGx_10CredentialQzSgAC07RefreshG0Vyx_GSgtcfc":{"name":"init(authenticator:credential:refreshWindow:)","abstract":"

Creates an AuthenticationInterceptor instance from the specified parameters.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html":{"name":"AuthenticationInterceptor","abstract":"

The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests."},"Classes/DataRequest.html":{"name":"DataRequest","abstract":"

Request subclass which handles in-memory Data download using URLSessionDataTask.

"},"Classes/DataStreamRequest.html":{"name":"DataStreamRequest","abstract":"

Request subclass which streams HTTP response Data through a Handler closure.

"},"Classes/DownloadRequest.html":{"name":"DownloadRequest","abstract":"

Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

"},"Classes/Request.html":{"name":"Request","abstract":"

Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback"},"Classes/CompositeEventMonitor.html":{"name":"CompositeEventMonitor","abstract":"

An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

"},"Classes/ClosureEventMonitor.html":{"name":"ClosureEventMonitor","abstract":"

EventMonitor that allows optional closures to be set to receive events.

"},"Classes/MultipartFormData.html":{"name":"MultipartFormData","abstract":"

Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode"},"Classes/NetworkReachabilityManager.html":{"name":"NetworkReachabilityManager","abstract":"

The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and"},"Classes/AlamofireNotifications.html":{"name":"AlamofireNotifications","abstract":"

EventMonitor that provides Alamofire’s notifications.

"},"Classes/JSONParameterEncoder.html":{"name":"JSONParameterEncoder","abstract":"

A ParameterEncoder that encodes types as JSON body data.

"},"Classes/URLEncodedFormParameterEncoder.html":{"name":"URLEncodedFormParameterEncoder","abstract":"

A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending"},"Classes/UploadRequest.html":{"name":"UploadRequest","abstract":"

DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

"},"Classes/Adapter.html":{"name":"Adapter","abstract":"

Closure-based RequestAdapter.

"},"Classes/Retrier.html":{"name":"Retrier","abstract":"

Closure-based RequestRetrier.

"},"Classes/Interceptor.html":{"name":"Interceptor","abstract":"

RequestInterceptor which can use multiple RequestAdapter and RequestRetrier values.

"},"Classes/DataResponseSerializer.html":{"name":"DataResponseSerializer","abstract":"

A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a"},"Classes/StringResponseSerializer.html":{"name":"StringResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no"},"Classes/JSONResponseSerializer.html":{"name":"JSONResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning"},"Classes/DecodableResponseSerializer.html":{"name":"DecodableResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data as a generic value using any type that conforms to"},"Classes/RetryPolicy.html":{"name":"RetryPolicy","abstract":"

A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes"},"Classes/ConnectionLostRetryPolicy.html":{"name":"ConnectionLostRetryPolicy","abstract":"

A retry policy that automatically retries idempotent requests for network connection lost errors. For more"},"Classes/ServerTrustManager.html":{"name":"ServerTrustManager","abstract":"

Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

"},"Classes/DefaultTrustEvaluator.html":{"name":"DefaultTrustEvaluator","abstract":"

An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the"},"Classes/RevocationTrustEvaluator.html":{"name":"RevocationTrustEvaluator","abstract":"

An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate"},"Classes/PinnedCertificatesTrustEvaluator.html":{"name":"PinnedCertificatesTrustEvaluator","abstract":"

Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned"},"Classes/PublicKeysTrustEvaluator.html":{"name":"PublicKeysTrustEvaluator","abstract":"

Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned"},"Classes/CompositeTrustEvaluator.html":{"name":"CompositeTrustEvaluator","abstract":"

Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the"},"Classes/DisabledTrustEvaluator.html":{"name":"DisabledTrustEvaluator","abstract":"

Disables all evaluation which in turn will always consider any server trust as valid.

"},"Classes/Session.html":{"name":"Session","abstract":"

Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common"},"Classes/SessionDelegate.html":{"name":"SessionDelegate","abstract":"

Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

"},"Classes/URLEncodedFormEncoder.html":{"name":"URLEncodedFormEncoder","abstract":"

An object that encodes instances into URL-encoded query strings.

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/undocumented.json b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/undocumented.json new file mode 100644 index 00000000..6724a379 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/Documents/undocumented.json @@ -0,0 +1,264 @@ +{ + "warnings": [ + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 202, + "symbol": "DataRequest.publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 258, + "symbol": "DataStreamPublisher", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 587, + "symbol": "DownloadRequest.publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 581, + "symbol": "DataStreamTask", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 583, + "symbol": "DataStreamTask.Stream", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 777, + "symbol": "StreamOf.BufferingPolicy", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 805, + "symbol": "StreamOf.Iterator", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 250, + "symbol": "EventMonitor.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 251, + "symbol": "EventMonitor.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 293, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 294, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 310, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 311, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 246, + "symbol": "JSONEncoding.Error", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 247, + "symbol": "JSONEncoding.Error.invalidJSONObject", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 329, + "symbol": "JSONEncoding.Error", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 330, + "symbol": "JSONEncoding.Error.localizedDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ResponseSerialization.swift", + "line": 84, + "symbol": "PassthroughPreprocessor.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ResponseSerialization.swift", + "line": 91, + "symbol": "GoogleXSSIPreprocessor.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 73, + "symbol": "SessionDelegate.urlSession(_:didBecomeInvalidWithError:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 86, + "symbol": "SessionDelegate.urlSession(_:task:didReceive:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 163, + "symbol": "SessionDelegate.urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 178, + "symbol": "SessionDelegate.urlSession(_:task:needNewBodyStream:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 192, + "symbol": "SessionDelegate.urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 206, + "symbol": "SessionDelegate.urlSession(_:task:didFinishCollecting:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 214, + "symbol": "SessionDelegate.urlSession(_:task:didCompleteWithError:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 225, + "symbol": "SessionDelegate.urlSession(_:taskIsWaitingForConnectivity:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 233, + "symbol": "SessionDelegate.urlSession(_:dataTask:didReceive:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 252, + "symbol": "SessionDelegate.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 265, + "symbol": "SessionDelegate.urlSession(_:dataTask:willCacheResponse:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 282, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 299, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 318, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didFinishDownloadingTo:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 691, + "symbol": "_URLEncodedFormEncoder.KeyedContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 859, + "symbol": "_URLEncodedFormEncoder.SingleValueContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 998, + "symbol": "_URLEncodedFormEncoder.UnkeyedContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLRequest+Alamofire.swift", + "line": 34, + "symbol": "URLRequest.validate()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + } + ], + "source_directory": "/Users/jshier/Desktop/Code/Alamofire" +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/docSet.dsidx b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..3ae9f258cc2a5078dfdcdd9be0df537ffbe92017 GIT binary patch literal 417792 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.tgz b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.tgz new file mode 100644 index 0000000000000000000000000000000000000000..888c0de409115b5583abd390afc54099c2fdbb02 GIT binary patch literal 834016 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 z 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πH~gk~{%Ux;Cd zY}zQmGvCO|=0KJ~JSu~5GKZwt57!*$1)&idGDH72gogh=AT+5I$xbk+WamfzCv~fF z`_Y2Q5CHbRjL+lQ$!2{2;+pH;&j&)Feq;E;A(dV8S=;0X{MiX1eI>#TwIj)V&luN1 zSmo*2F1)eV>&%(;I3EWy=OzsmlEjgWmFE;1Dd5T?4>FRpWIJ3fysPcRn#!rQtefKXhvk$3oFK zE$mrfT@i;mU7oZt0N^un&IEhm5pJdM{tuKkQmE+TLw3~Lwr~xQwR?H20u>NNQ>iLl?u6c;C%i?}%_C1m}_k7ApJI6@8@c*~4`I z!Nr;skr6ll3!ibTni2-rX8euMoGSzHncM&^9PC=~9Qn;|@~*+UK-XXR%ua>e8~~pY zg_=9-TF~TYln~F5$y13S*Y`74_gTFuX34phsF$XNESE>D-SV0=A_fsYbd?kkuTi^H z(E3qw!vKFP=mCE@xH2B}o1dA?1GAn;9pU`U*}a^o=XmV2RC5HQd<`NK+e{u=ff6674I_ecCftPB4RkIz;H=SC6a-Q>^#57SMFRNyh z2xQYTg)@Ay(+|@sOo0O5IEbh|hH7XOMiz-%eK2++`3wMPwr+VX0RWAb@{aj$fM#Y& zdqg`=cb0`c125Wf;x{dR79i;!(=54#=nXAlvu|{KZc~9GR$IMa%>b zac=2+C3I085Tm%YKb%-qp^{9!tdH6DRsSGmSP!zGZYtM-edDYR_U4;?BqDrTdrv79 zdqzvhyf)OEdg&smv&iT#Q3j>4U0(O#%JJ%_gILhn>g++$^%_r@dFx77HEqE5AX>^a zk?}nW%~pEyPS^%4w#B&}RH?z+g~t2=nI^#={89)=Y37(~!z=_-8f6#n(5U(g14xVUrY9G0~UUm$xO^6wdu)WvX5j8F0)&?FVy$-r&F--o*V{i z(E$dtDF8FwR?Wyz-$N^YPbhE3fK&G4py(^G4k){T0TD@ZVNex3!@(k=T3#a1$y?*3 zbrifoU|o7}c!GxY>_s4g;8XYu4N9AnZ~82DC>gW-WE+6vMvDfe;mON!qidDIUmB=g zzQDR2e^AdZdyyaVLeD(s9EpL^PE?Y^&v`83z~=GS{4Zc8>_zSGQ{ zZiw$6K3TTbPJ9j`%*6KlmGp}+QC~00t#?$qhtOg-bPT|Um$l?fN7ip?J(DBkAR)U$Av03RNf)ig4!kvOc zg2*HSPwe9sq6CqelEWx}?j1JPitZ1*1bf=4u&j-E%wNkN);ow;UuVt5+(9Gdb0BmG zGSs}np1p99zi1Di+@OY*ggrSS3uB+pXJaSxEcHNFoERMt-3Z)p*bI~neD52t*9rL` z3Mp&Mh@qpisb-=Gyli(hG9yCbZ1bU!69lMU&FIPItWtZGAYmwv04gPR{rr_QJ!+jX z6mSDO`aLYOEm_^lOKPa)daHo*VApt|W3tRblH~KojTgPaiz=-hkGRi zq+Uq^2Foph5VDw~L+tGQ`+*ZvIxdPnn7{BC=`8n^MWmytq@_|7TJbPeTE2cRvg5Cz zClDd;iYM?h7-O|IDU1=U%)&=3uQvix6`2L1n5%T&d)X%tE7Ju- zXo`<>&Wn~}p=b(BSFrtHWG+f{YEeT#vi>n+-420g{0IlsgM%#@I3Y>x`Qlf0GIo*6 zkt)-t1`Ey2@h%UyR~l5r9u*Z7M-7Wf2@T`9}+s9=8^a;M*!AXf$qnq%w2QIUn+@lygs*DN-zs6r{&sy z3IIR)hrlq(?F7AwxE+LyYV|IqjG!mL5;+3it#!_m{R}D5;+#XPfxrU`&CD=qnhoFZ z4RFg++u-jTE5*0v`OLG|Qi$`)IofAw0s;n}mZHF9DtKxDL1CWEq8o!@i~&X1c#!MX!o%*SoG`5o_m#{qmdVExIphXGGS0rqn3H5`EMmHE^Hz75;2pu>q zx1oT(Z%KsummVhuxc&*a{0dE3M#TLVX|Erw zEM%rm>NcOIzF`Vzkp88D&oK_F;77+pMKD>*f-WLN2VF$C2(8N?)4w6XT|du!^Hs?? z8Mg+}IC0IVAi{=-sHW~*a_ipVh`JEGY1RF}!9_;H#cs(%qBd7#jo0I_-AR#gT6(2o z#d==G;rpoQcWVC8Xm43HLCpk|DR(J>A5Uh{xSl|BhJ&XZm2yTRY7z36Hcj;YQgW`% zEcVXeDEYt>AQ7woq?=P4y@>a9cJwWv%o; zJSN$C6xS@tUC!)?8+WkE&42uS*?Gqw-s9mP-s3Wrx#o4`&#%kTRvkGhm&1IfkG*2T zb-l-4&of`g+H0gvM?o(;Un#Aioi7!!y=_n%U+ZR#HVJ%D5q^*DGHcjR_*K2OMaEa_Fu^X5P%mHhF;hjj7C;0#_~TNK zP9?AO5Lld?6!Q($3=eL2U;SlwtNajyWXSOcR;^u14KH26s=8ueAC}rz?e9`Wc0+Apq{6V)qh?@NEKKTy2^L<+i_R7vKTKCrDqt5&~;=?2C4=GR2 zM>iDc_TXq@;;S!k9$b^);TWhN{w6S`aS@M#b0nu~^Xks@C(+N7`{nHqzxY3*S2ep! zgKnqe?^MYMB@SkLa=5Q6An%OXuZ7i)S4~*|Sv6v7h)S9s%o1OtO;wamrfLx7@8UvF zZA3gBIXpG9?Er4%N2ERbqYPF?tJiDcm0B{_cy|uK%TDRdl7hCOOBm?9pCk9jd0(75 z@w0ontKh~!1bn$0zL^c7U0%T5sYMeDXvFw+TlAHbbjSN(v7cB?lnCMGd(GHvE`t0h z_(^8bmq)6`z&pI)_k9=&`9=p?N3s+XZoLs}Sy-5k`S66Gtu4X7Zf&K_<_s^-GAO-l zZRzU8rNqxT{NCF7o|p=iU+VL+wWYY{`>0$rT<>dCs)N9x7tTgMmfQrId`AV{OGowC z3A&d~uEB>vsMSUyL98u*uIQ}c ztdv7c<5mxMFT*|04AU|-#@E6*w(XFKf;R*!dB5XQt!!PRJAcNda-ZW;8!W??$RfOd z9QK{cL5F?6lfNGJFWCQa*l%b^_!|j9qZd+5PyEuBcZv`&$mlEla{L87@xx17ex@Ml zkV@?+bJ+5yrPb%&tm#+iKiVW27-k36^7KMmS7WYf-V>m1G_>EC_@-2i?@cK-bO~)2 z+nCwgprv~H&sT-I%P$Qf%X>rHe~+a&N)4_QNpDG<=$)8>#813w;-K{feNZk8oH0gLIjAjfu0h1SFy0oIp-nw8 z9k1mEYRixNr0h(;LxmJ{qMF>^x1a=)dbGu@B-s0~MfZ8267C9bI<6}T2n#XzAS7LI z{MhM%UUm0@Ph_r#(t4X*f<}LgCbuNheQ_N7Lx-qc7d8OS!ExcM_!C1GkQrV^QFs3E zTNxxonx|c}10S6)SQ2p<%sQu>h-hHO$x;wqMLCj-2Mf}M3pP^vltdJ`hu?N{$%fAj ztLgJ+H&zb9AqyEC*{Ei96v$ITRbA6QCNt^?(@pBPTb33DX}4THZ+%L`DE%k6!y1v1 z4&NG;QAO3OBIG+wf<}emSY~_=K%>HFo5exkYdV)A<=3)IDg$p)v>UF)3OL2P>Z{|W zY`Ch~oIa}~LU-WvV+hYk6Qx>cLzv0)is9nd-tq3YR}yf#eZ#27@tW3|IKoy0OVS1k zc|#+lV&}}$LPI1Fhup}HcRVvhz}Xx46OjYjx8{wT_Ks}e8__geJ+FBaAv^StUI{w( zNHu~B;%pOrt5@FGc#bbo30L~c_ogjyc!B~=8^P{)%|Tz3P*T8rHXBxa1QNUUBpZFv zzJb31V7q^m>!OB)Q$dWVa4Dw^Ab{O5iH+>uIo12l-y6#WLp#Hzjy`DUW9veEtlqZN zHKc#0xr5v`DC3M!MB-mygX=4muus+7VTQl=KUNQJv;S2+ED!yydO&IVLp^kF)Z*y= z><3CukERIvdA%Wx$-cNNBX*-(_9Gp&zvjdl_dtf~bY2dSxR~Nnu0UJ1B4mwE2_`~( zF%S8U?^WpjP!GZanIAbH&{o5TAMJwH8Kh@Q=g=P!q0OInf=NL?B4;tYCTHfpZbmg| zpfd)PwBZaWhjUaWh>FnFw|grlrn6SQ{dV!Aj!aJaaeJvqL%Ji^0a%%3~-d{JX zjdsDK@I@{FZ*Vb-NWV&jaC#|;dM~25^lU?RZdu<+5l_z$@-deKq&I_WC3;X;?3dMO zZe(scZrRG48l?HSXFeShJ{T$CP(`Y4YWP??UX`m0TCo1eO!~vIsPNbV^+~a3JP4Vz z{sA+rLn9EP0eX;vL zTk>2QvtXO8$MDN@3|NY(dE!B=`wnq|iF?oA`|k$qwUqdh5JWxLML>7iEcO96=02W+ zvPv-~*l+PsXgXBOqG*|`%2yzMR#w%JVa1wPNRBug#QTD4NArNco(b?fa0u|-ec19Z zy#i|UV0Ds5rZwYe=i7H4E-t0htoVr3r%#tF>+2sCnjT?yk}ga6T#0fk3fTUdc=Z$8 z*v2lAqgtU_?=g1(CW(T@jQNAi4_LhZDX#IVC3DK!dp`&_e*6u>_W*xwCTD{X+BXL?g+wN~YQZZ(8C*a$&4gWbjv znwG67G8vr@IPmU3E9hN29I{B)L4`5p^_nKF+l$nZ&~QVO72-K0SO^uK`?&U}cq~dXioOhk_1m@op^J-BJZ(tqx2H?aJyhG!mAl0GlF?(UGPjXIB-#Qz8 zl+MBLT(r^z{|Vo3xoCq2o+Yn1CazDg;0qJ>gkUD$ID6o!dbXp-OQx_7-ECn8eKtUz z?Gv$rUjl#>HjJzw&3^r{WmwVaY^kQ)WY#CUuyEFAl8LKx?|P|+5r&S*jo3wGfIniI zQ{ifUDt2($V)j0N^0h~WupSdJwyM@zMsPw#*ynZjqel!d5?6=MZ<=nRSh|G}_!hHD zDP@G);0kYI`+xF;p4lZuXTgens ze=c_c7aJmX2;93eaFd-0Vz4RYhPF6*r4t-w*JEY=tEtquW!r^ofY?KFVi{5#Df+jR zP|#U<>i6*5g^Fow)qNoSBx&+hMIt&*T+)xM;>&&`mDZq<&MtLJM~3V8tMl2NCn@6# zE)=N8ME>wlqXO^fTeYLeOKdw!uMT%9Zdy8wtIkKaeri(**J3KJpTKtui`OTI7pP0{ zYX-y|rlDz;Nd2VdtK$}WN-t}_aAewBCYH|_FakXMcwhXIc9L)hrJbm9N5zg?ufs;v zkEjtscfM;TD)W@jY54>E`ZH{kA;W%Ee$13}YbBDuckne2yL?k+@{^i6Vv#EH{b}+g zOv)wxkqT9Fb~FnM{@dm(Y&2|SXizzG+uwauFh@U?Pq5iRkY?a6N~NY`%whP)MH2Tq zR2tyx{jWt&Om3d2LvJq^tw#C?mVWS`Cov|jHe=1Tg&N_eOfs4S9#VGE>%nb^93s??PS-a zN2g78$i%Td{cv+0{V2)^#Rz%-AS2#jb_%{vshq&kl`1OUp0F#BA@93<7WC6yK?&WP z9%l5D{*H0wFv-~zjq_+y0M4W^O@7uG=P)Dh`>;h&VSxHgo#S) zl%mR+IgAPK3WT>>1`UJdvl|_JPbK>R45lkE8QrQ(zUV{YXpeCoDx#0F?bIbu@Rs6o z{_*P~bA3=5JJ*^bHY<&>U+Duzu1SK$#gb#Ghy@Y z;)ut1OHSwy2P-IcHZt1G4X3|$edN+@I6138q+;HU%_+N@_5cbo29eAOqs;NR%+`bo zTJX&7=yy*)n8>l6Gg~IK?~fYtFDTdHs34c8r1nJ@qiLO=4GuT7#~_fm7LG-Flv)S` z-o`vA4$aFp12YkH2#eL58Jn@`Wg{^2Xb|P>it^vnr;wL8U4KVTO%+#})|~2WPn`R_1zLHt`N( z{e{Exk?t^uephA2*aoFcp9`*Q+8e6`xB`D6S}QhYutTc+IPChecxHDwGb5V!nW=pX z4x{3b>dd5W>xT0j7dnN^1#Fu zb&uzkGGa`O7YBOnI6x{bf2%?6a6ZPJ-(E$Y+-VD(rKy}rEqM>~YsPYNv2>7y?l|uH zojoz(>s_w_mRp3ZugT%`L?|AR1B!vSRY2onj8y+naWIUK?lU^hIH2 zbJs^zEzEmjGUD94NM!vkJ+@lXXi@T=&uXK;o`#*eh;G1pPF` zieo)rKOC7zv}_1pS;$Fg1~Ys@7&j(v_!2Y<9)30S3$PwRLci`hTre-UF&vAGX1VKe=gCt z#i?sG6G+M@Kn&~mXtC1soRfZ`!zd-kl!8~INBSg|bLqU5?mPLU@R%dTG>?KOh~3!m zT5@sJ$|$kIYfFO$YV!-|iYd}WvZ7eS@6NPhbuPMr;@gRACJ;km!Wa}Gl=ID-F7$|^ zRlw2@<{J@Cq+kWhRP=tdUt$~)Sk#hwf-aO%AA;f)e9R^9Hx>?y=1B*?o7h5ZdaNWe zq7vpWI(}F@kFmdIkODQ4*R1?<=-<8p~zxYTZYKIDpu@=;MvS%DX zl?wEm%RDh*6LAZ(PP`LUl2S8{Wcx~ei-2&-{wZSEiFQj`(f)zx(|oorZ1^ZVHOt`- zh#=M}grEY39`VH5CIyP-rS>_}EQmP&Ial-qp80%yRZ7oNet2s0J)_M{kl-K-l#P6k zO4IHG>l_OyYt4ue$J0qTkwyC9c1euyNWW?moL=*H^vWuhnhU(c2L|54SSADU1{pTD zamtFlRJ+{d+^8%7(S>UJb?a@LNV}EKB_7E;0FM{6yF0nj)vgWutBr{r&lOQ@$NaM>$Jl;=FaT^u2sDfI>~TwB_x6GeYnRVA#{?1VtDW!^$P_)$hbk++s68(;+|(! zj5mQ7``5qqnynFjknyOl?U7?%nXKV9a!(7-WRFM#L)iPRIb3z|oJaOSnq#kkd;%SX zeK6R*3r|}#0FoU79gUkQD9(CPv_BZ)%NueLf*qN`AY?&?p821 zXPd#~W$Y_o^PIJkzaP1)+PGXwpy&dVnSXVE4a!=%5=y?2n#T?IgeHVGq(a*0{Sk5P zF-{VRo&{cK1efFvnHk(f!sC+LO=b**2X@~psH4b+XVpMdgX+sOak!b@-}jl9QL7a3 zp(OwjrKMNcMg<}WZVjOWU3V&2c>p}4u5&8DL_4Sv@6JaL0tIVu)HO#Bc@o-8G5`+C z`K&iq^6ofX?60s#zA>gp-hT;us=$kZmHPi~L(lDa|@5kwSa57qZa z9qsi^w3R_{|08u(1apuCCqcuE(fI~Qy)nqB-ND?)G*=2p1y64eLfL?2nHy|D#sr(e zQ1v9MLVD2}APh<>opPEvb8dH5<@$^ZSNIvF6Sge?!h7c}hcqh~V9p#CowY+DsoW7o zZ=`K*s<;c}HAMV3nH2m}_nRp!kmkPFvqgG3va6P-IAi{xY+^r}?A<;!DSCUSRT9eJ|RpWSD;4#Oy7xqb_Zzn?&erh$mqgUB!1yQ;%y|yD3kHg~1#$d^#TXIZY zY}ENlr5&Oo1&=6kO&#E)V;f=tkW?Y}xYDJtppqjP8Tq)B6$ux+f*3-v_pN@6RKprb zr|c%h-}+(r zwic?PP<~2WHM2r$#R#%bpS0CmyKjy@(tPdBOCT-qQosrkY>-Y4i=VaMlLw0vZ+ zX!rtJ`|vibE5kt4%1TM=?r+8Vc$91L?#M=4J4-9cD|2uIJm=IAf0cUL-Npo>dgfHK z!7xUA*OT^PoNp`>N8l#npv_e|lzabbji((}>bncGGiI(+$pX-3d?@w9ioA{8Rf_{e zZ~q0Iag*g>%AXjsN2~&C z1vM}5^XnEQAqc}2r_()3<7o*a>jGaNMP8M894~B5No4mW#JwiwcHa^)VT>EzQ*kHn zLXkK*Gks`@H>Llf%LWQJ+4t2U89L{ARg1l`1L(5ShUXGi;W!dBQM!D_{`Djo(@n4< z37Dk&{4i-F^UMGk;swhml(y>P>oG&d50~zNPek9o=YC@2as51GT)Vg;T=@?K(3LIV zTIK>CDYKg8KxlK?!r={<>COWwnS#UBN^LU40*9!7uGj9Y59VXS4xqNXc_+DK@xgO9ZHusA!kJS=4LBY*t5hY;HygDSSD7(e+{cymR2w(8g<2SF`h^7t~D^5 z?1jnqf7EHQUfxvWm)Dmilh8USye9nwhayzw`>KrYu*3vYV8XFvs4Jkb{D8Y;L4DD4 zoW9>l1yL)!IA~6OY->O@q|8mz$Ygm<8aifmdQY-_wl1UlQTk)iPHDc*paOJ7q-v>7 z(n?rD`ZBd-@|;n$RV}q2p^T>5pc%|stvTXSil(R);;LpL@h4w_w-rskoTHtRjTKNr zaWd0W1SR!@T0vbtTZ!S7JXT`}+V&qdxIM}693GYZi_845i^sH3pP=$Q&GlO`@FoR1 zL<}4w0ld?2irWr@ofPhPA7-lv!c2g?#w2XnMb1qZ`j461Er6mJ^I4rnS?Yp{M5Wb< zbHWc)VON4AjBL}`)+9wTUk=VqF~BkC!yY-66mzDf&_m}pd*I}ee>p*Y$)QWv&c$&r zP^YSKAcDe`nLnh7tJ7B-2s8S343NzG69cM17;wb!FBl;64-81r(*IiwPz*m&{1XG< zj$XfDKzD;)zI8o8zP=}4QGpNL_hFG=yZsy_kW5Y~@*+l4%CxU-Ne?lcmtfw@-h?0B zpI&%5u60``YS_M+W%B=IS^o`6dj||{?eP}_H%&yGV~4+=C-ekYmqa28tOgjmT37HM zhqRz#F_BF<85P<__MPrIGorGf{heE)Y9HI~gNvpO-etD_^(&$vwCxsyMtT68C&dPs zuRH|vQYr-$!xp$d!zdlyrl{|lbqz=4N0@L5jJI2KyP$|udf(k$@+)Wz@zC4sWO!Ka zOX;Y2`w$eYiX+1D*Be<-MfSyd+X|d9pomkb^0ZPf=mG%0z;Z*mck^1rHZ{A0xzQIs zaGMe^Kst1HcxrN0H4OH5?7Rr>!uqXiDTXVepvUcib(FRXE+)+u{c1`Qc%&=Es(4|H z*SW32Y#+zCwMz!?O=H*v&Y(8>{1@zfC=pwmh!oGbhergn0y&t%RYqtA)UGI{d^4Zk z_rp@9{N9Cu2}~CZJ)F{WlRc~s3F)AKga1vLeX+9jX4Yac9-2Xs+4#Q^zy>!DhyWhR zF8)FQqwy~UV6O?LWbhve;3()%0@yluCII*@qGtkFRme}QjR5s7_ECaqd!xRBQcb`jZk#vu8DaUA0|6Id*2&^dxAJ8q3rkmZfERemrlwBHP0eM&Rq zY!EhocshG=GmciJ|GkTltWfohot8OFv8yzE0~4G~o>iK8m$(V6+6~5gP`0TGmBZ@o z=Xw4MWne()u5H}M%p2&@%-`p&`O${BAWG@0h$EFZglKMxw%v<)UsarC-0PvFAG5d*RN#VrA`;n%|K zxqd4*&e$_npy~xHm#@8mtz1%YZp2Y)z)6>X9eQXRuLOQK1fSm*>?e8 z=DzPh&2EGpl%9iQe9Mp|=a(xga`g44CWUlGoKwy#d*%3Kdz1}9obf|N;=Pe-h6=ir zpWpQNyH=DFUQOe-!l6pvahc;|)R}ksqLvC{(mVC6&=h@#M66mvhSQIxkV<0P)iPfE z$Jv?aSrbq+zrQm0Ip4%P1Ww6`3olH#fo!e_Z1p_J{_MiMa0Z4`wj(Agp>V<>gOv{U zUf4f?y$0|dlhoi!-6PUet+bxrJ0ih8d)&BNEBj!fuL6AB$Pa2_Q>O=eXO|*;GO2OW z-bXC%y91)yU_uGv{vJ3Xsn?`Ox8qj^h%9#an9P#S$nev#DRF-4&d^U0R&V zeHL3~;IE)iC;!>@_%s_m7&>K%l2U(!@?zlY2m;Bt3Aw29dUB8GJ*a+h*DZxJ2si>I zociOxM4%!HR_gL#AOW4nV%~!iPF9TuGtSN*tD7{clt@jx!QQTX)vVlqn#2Pq5atWA zPvJUq4|$AH;i7#dDhZMzU)u(tIsB_l=^&mf7{N{ixE~IijLR9n9bqtXf5U*Re*=$4 z?nZYf=`2GcO9bmS1tEu-Xo0_GxB=+_&#g$xwjAogAlk4~<5XXEQ~>p!bM8L8I| zk+gOMbZX7Eypq-jZk@~J==RCubvEz##AG4q(?bbvkit!K>;44s}5K+fDyND`JhV8O1ZsZ%7H=0po*)lWe-V%{|T!@jEE=Hk! zzjHIKfE2RAyquKFw7akU(gB!PryTW$)TyffiyU!9Binv-UZmaMs2{ar_)GvQV-T_9 z{k&i=a?jw4?brW-$mP`ZT1sp-RfcQwy`Nkf@f*OYUeIB{SL|;W?NT&R22_M4J+DbV z*p-+`QNTbIi1+Pg=!o0}W4~dcrj?n3Z=BI~CN=s6m4`lkan$v7wRA$fCUg=#@r_`7 z@Czb${cYW6t!4uUc70c^L83J^6gaQw zu>qg31O+p^e_Av~na6F&POXXasjuL`jlztHAU`m#co;E6BqH;2(9l_$Z_lerpuFos)^s@C@N+=tL3S&$A@`GpPg=+r&ygfV|!28jRR+5aarE z&ZU){hIhNC)pL(iR;7YG$D3dhhPRCfQkb-I1@_s$Sq`S}Tvl$(?>opWX5 zP&x`luvYT8l+ar(y(0gH+-j2Tbg0BLc36GL0V+*h=&-RYtuh#Hc<_;Xujv?KeUcjL z3Cfpi(!-LtOI@qZGT#ZHlyUq8q}YYNh^T&e<%EaImT{sU@zrbznVH#^H2kf+ z&VuN}IFxp0v|UNd6g!f2QH;jDSdcP%$v8jDmY-&@F_<(Bw5|sI)T;FpR$4k{|Bddg z;H+zWVklzHFf(-WsA+6-2XO_35x8sIJdjn^qB;_a6DK>U{{0^$rP>~op%zW_PN#*s zuF3JD7xJ|Nf6=Ik@}d{50${<{#rE<4SEz)|SZpNDxSXy}|JrX{RPCc)9+Zi${Y-l3 zYF<~y`o>YumV?@c=BLW}2V>ThpI&-opI{#zzpcwh>6)=F%73z>$~C_HxcF0tF`Dp8 z?7`U0Ud@YA0V8fz{U0b5l}M0MsTQ_>Z!$L~O;n8CD5Okh6#uw`kOVG~BBEw&fQXca zP)6DsS_D7$Xk(@%{Sa-psR{3!BNID6y4r;5A9Y=8t%%IJ^ zvAw-LstkynkX^LokoDcRRD1)jv6kTfb0pG25Jqp0HDzreFJJZTittPnfsH>C#be*K z=e*o&9=n)6gSYh@YG06k7SHC$VUiE5RVjS8>$-PKkG~{}UZwL99AK<*<~An?F}Dz8 zujILahdVZZhs@#&hT69q8LSX@0ZNh8=F(<#&R6!x_9UZHW^a9C4!|>$%k;BPgg`+X z1XQ(@^N3E66EiP(9XE2HG2^M58Qezq5~`kWH+H3d)tn28o?<7j`_=jS4u z69`OYlt0&AZP#8~!-v2*7I353i7z=|KpZ2TMWN}sfhG%ew!vgbE;`N{*4vW#+J)V$)4-e@RGFh!*F`V@=KEQf?=G z4;5k>j~Z1T<$>(icd9!_g;p_Ob8u0ml*;fS=_CWPuNo&*{WG4)r);n{(er8;OVC;p zJN23wP%y98Z^^E1!0?A)26i(y9D5y9sm*^Z>TzOZ$4MV}~g#Gz=_e?N&kXkt^=-n95gvULUhly5;QsQ*3)ViAo+h-AM*dXQk zK@VuL-a%@XdcP*w1CH{hV}L=GOrwM`Jq^~{=S<=Veng-V&Sz>T#~Xo_YdwZb4)Z(< z?DbEUit<5Fx!ph@NCZKdUup=r(f{$3-+P&2M2}25N7}I{OjBQ9$`NAti|Bx#qIfD` z(TQ9Rmy7@}>-?qP4#iCQ(jYOm_ji|$K!L7G@)qF7ku0+BywI8pES~ojiR3PnD(dX) zR~YNZ?~LFlBP8(Ib@={Mz?IP_m|;-WGOfn$xrZ~ErJHk`CDe@p!851BUh zMk0&il{pY~(~qSt01nn1ik#G559#${PGAHow6|KJXU-|wDs%aSUs3=lZ03<;a_DUI z0X33~e{WZN`>jQYTxX)(PIP7xwqW{*cmSy69vpZ9X`gl;7)=k9nH$shi=_F4PlDs6 z*XjtsBRxo^`0^7Da?ZA==-}Ifp+lv9uJGvZ;F;dn`&&OSD^xLR(et zfCw;1((~zX`jrcS8z~vF`L+Gq?X9;&NoBLpA9cH-VRa3&8fd`9pzNU6Ll_UlinqZO zwDm2zSs8lXA$bWifx{vgn}V`uLErq?C`6$UzA#jsdRGz9w@k`uZcKR+IofimMiRp# zDf4^F)RiWKDlJJ^%oy?D5rGqoc4Srdh~$H2A|X`h)@Qyc+!Ip_GGwTK+W86aC(?cbtwsX~A8kKNCa6STBJ-?4h0TZqM>UTq zf{co!sKbKiLdi7vollZtXY@)jj0}uVFTn|^X#ed&joNsZRm!|JF9)872d_Ev)2@Z$ zCI1INWY+_(t*DbiR8R>=oNdk*sH8E0)b*8iq*?e(x`|!SXysQu@|>!{UqesVRKG?A zl@WUpVJCXpLT{3&vv*|`0c6Nml&vNWB7R^3CFMsdp@qyUMKK4dB&9UNJY&DF(K#7W zvRF>xtx#BqlBgM4&scNx%D+a(NlnC;scp<-0fiy_?WhM`m`J0NjdSI!$ls+@Qot&# zVLg449hr&?>HDQ@Zm8E+FxQr|h#-?(YS3adkz+1Gv0%CB7?clm5eeK`QH!9ZY3|A? zNw%-{&CxtX&m#SphXzPe|KVI;X`Z_!JM~k#)pR8l4hi))pZzqliBCkHfdKKD8igO~ zj^no^?AoWcKC(dIuKYsJBK^EJis>VPvyCf6%1)L1v=;pi6`_hPd z8D+Y}lI1=puW-4WPvy3@bW=fd0>!_CS*q+}e#5&!__ENpH{+mH=3XS3o3FVYQk(`% zmMgEhfeim7C7|F%+7|0pHw>b-nMvw9s-LiR^$4<4^gE%G1K#``TD>l}?$Usua^vXL85h=^d)a}HlUm<7M>$jRf( z`KZfvn8}p0rr2T`-r^h4{?&%cq`!!fP+GjcbAr6R(?B1>O8a6e{);%u1c@U=y(W(L zdYq$urSUpc^CL8*-u1wlBj!1m3>eve#hpgX|B5@5K#luUIT`{rGrc|`zfKKtmi&0X z3ObzoJI({qoe53KeCO{fHc}QTO{67ADn3KjR4GSCo2l41`dseFG`aCO%hLKr=$3B% zbF}%xk`y*%|9yUp+A{b*(+;~5OD>^(qw9+|dc3Xsc|XRX#xl%F4&Q#@LF^*LqOG1n z)ymLF5Z{ouy1Kx}nj-&6uoCzM^2f(3JF0;SwiN4vMy~bBKVfIN9RxdjwTq0DPE@p6 zCfihD*`rG?$XXYUO`7#fdpxSi5nI0muX` znh9IRKCtH+{^S^l7+5))MO#x&Xc%mxZPCcV2Ah zN#jWFtWyiCnNm0s`KeFntqIAa89J*rLWNMWs~YDIZ-+0^we@%M;5+m=E*wvi7$QUY8>jBv;42$X^C94Z|*!cPa9ziF1nO65|j^ z{XC62UPek*>JxrPrd=s4zGM?g1o9@>WfC^yMVn^St74GL31OusO8EngPVyC@;)Uek zmi+t#3!QM=6$I*H)kw;L$0}4<2~j!3*1sU7xZK%eV||WP;rnK0SxX3cy|>53W7hV2 zO!k`m#&AHe!@uT1A?){AVO&{G8Vd&lh^f@Gw{CJ=roAt{vH#OQfsad`tmBoT40h0@@zE*a5198aP zfoOfz?#=i+V}safn?L0dzt+wU_RaSP2JW0lkUYXn1<9jdqtEha0vw%ZAb77{N)WG} z$foQ?9^plvEAqa`qafA3%Uh5zj56@ZYR61@%|f zA(H-sbsoZhvrcwNY%g5Sq|zWH#PW3~?lumqFW9X@O2CzCG6II>L)MUjgLI=a4fCeQ zd<=aLKR(Ra9Tw6`UU+~b5Q_V+L9%wnA-VrqkPO4)UxH-Ln*V?upUHoR9b>p>*vSI^ z1$K^mUSJ2z9xUd|f6_=0MgItr&HN6M)xHGDRzv@U9fW^@9Wb_M*s(15-@#4_?O$L= zk@qjK)42HpJG%}48Ftbke`};4{ARImMv6i(=W|zwnU^a8nzvY%EzEsZF1MEMo@Q{G zRks_FK$Vh$MtXLCRlYo^W!wP3RQ;Pe{hS(qTF+2AflJL0etOBeN;+pWrOV-M;e+r=bJRTAWG;63DkyYNg&6K*1I z%pd8Iv}jn-ZSX|F8qfwfS{TNIO7iRidKxml=*HMF^M>vic)On7Q63G7B8{>`aYhMS3#5^T+x`6b#z=B6(!;nhu+qH;)?Li!yU3j&WFtI4 z6J8N@e%Tfy%rU$4r_<7FA1XQEiaK|)>UG6U#$7C6)P~k*6<#L1+@6~>(%H(}^J210 z8{nUJd@$0&q3}`9VA!b#SKDtU#(D9q-M|plFUYcU3U5*Y5N~~$vP47)v|?}Jfy^Fs z?UJ=6v)VX9{jyDpW~^>yjuAE4o@3o#V7Q~tt0geTG=ND?tdjp^9dUAUtAB$XaVKwH z0;bcAH7>Apw4`I2B3P}c^4z+Drb$RvLreoY%{ z3T9TB4S6RL!BJz|0|izOHLC|l56L$n9Fy6NKfPOW^@@XEmx*Zh&2!nN5b_M1Dcgsn zSp_*32`rRjNhBcR`?N`Ey8k?DWxcZ{^VOB}g#O*gbk?5xsWgHAHPedMUdAhAH7lxB z@lWuKDW2@@&7Sxrn1UKvBe%r)+(9YUMJSmVtL?=ZM98Rp$!H0Qp7t-S(*t6iA;2^1 zIQ+>vFhX{fqH+JmI;8)?I!}XDGj$WvsqIve+4cz}UJ@cTp5P9>udY$5N#7L{ULyD_ ztbOYcW%=Qq4HQ2Qk${ndP9X_Y*vH7ptSCUYLDi92N-(bsBZTlB%i<{#Aqh&eEpwl& z5s9WU2|O_nSFB|Wo=ZyJH6uc~-laGDNIbrG_ub3hN78m`I6QF0*l2i+Waa1Lc|<=i z`GMW^Y3|N_1m)Lj%On8qMf^-dA)}us%_k#mb^q?0%V4j`K9$jb7l&RawO+Mhv}DSLB4 zL_=w(^?K=C3>3%K@!UOLSNe)61yKo@ySwKMOe&f5U%D(^nxmzbiF1D~8J>4^H{@y3 zn6U*1#A7JU8-^z67;=fo|K>^}w%lSn9R@kpw(}^yhsx|yY-Q{sFGO@W^>GGYBMBXS zWyI<5BBDsH*s<2xJc1DWm%eUErv06cH4yuJDMVY4;I@06)aL!>=Kks za$_3KcAEY>kCI(P1eyX)nu^H(VimL^LR^uY$P)g=a2S_w=1OvkGPj1i1^m{Me}rUp z!sRq`CvzQ5<)xT1n(!9xU@mvEW|)1_pm{c{F5gsB>~3SMUm!X)7TIstdoerFF>@~4gkybwiI$hr>DN*LN*|OG5jIPvR7m@d5uW62dtJ`xV zO@dcmpO^ZNNE#IKOC&AzIg(aC{Sryz;*Mt+>xHaPyUAb+KVO*vCivZ_(h|1Ww`uPqnQ5IC|v!2Xq1~nYkwxv$37R2559st zb_VUkNA(4VNnJwq+Roi{OB1NycYooeqx8%0tZ#Oaj$sh9)%(n;;>rv4hJKk8r|MUm)XJb!Nutl+XAPlr&yWu z(&ovO9J(awS61FgTIUHd#n!G)YEB{I)l(wHuCuyK~V5$|KA9 zTU>MD+1@znP@na5>4A&8?`8)kC3Z4Uf&NVV%kK~#+ar((`JKa45flGE=H4nO4nWtajHOurH!P)(@?T>qF+cui zEM>5D?q6Xk*F=A?lpl<5lgadq6xQiH5f_x{VCgl(}gLNk$_9&{C`tRb5F{2 z?~HW#m$kH6>;G0un;rUFOVj-H&sv)G-2bMQruENSnzN|hu;~AVTH3|GuBF-jt)<1R zNwb|gkgw& z;Y|o3w8l?AJwFDRqIba({|<$wUyH@O&a(D--{=q_hceChAxvJE9Bc>v(HWyv=cyN_ zQ>G%p3eD+(LfDC>Ul!wpPYF>(QFJe?i~ASX#~lC7ppt)3v~}cuRAl{E4@~Hb=8Ev{ zbuiuh7q|>lHib%R=$Xl&u}9FB=vJPu;1A~Y{b74_GGN&z9K@$_%6ztrDIa!Ci_}?; zD4(Tl&6aXQhu22r(l48#v^pNB`@W1Cia0&)?w?EFotiSmbYlOIXbx6>57ZN_MGBLQ zE$gDM|47)gC;)jB&$6b1o=b_+N&nqhcCl#5JS6!s#;>=o6C4&uBlWrXK zvrK$hmolrQGqAT5v2`s?*;=%ERaPi=;dxgT8->rf z_}B7@)}Lb8BOJI`#{7?B8R6im%CB-Ix!C=EnTU@PA`drL!`6JFdop;Rzl6LSZaw1I z&!@H~7FtQMp1FoXX#r;eb`KurBJ&XPh9kas)Z%*Uhu_4OBonGQih8;9}310+V3ep z^@rEz#EcM7!@|w*sdQbD1@g%>Yq~C%#OWRKGp{;;7d6c=*0FUBI}9W5(-c|?e;l1t zIh9ISj-r?7D@kE7{Af#YkU8qN;fs`PJg#?=-MQA}-8wt}_+?O1qzz7js9K~&^}|U< zEY&T1rY^ZyT+%{XX~zAI&Z2`e3da-{7dWn9f3FfVIB_U@ufku#ToTm9Sh0ob>9)j# zT`6y$tjSnd{gf~SzOnSUx?UV!@bm}8T*`RFkCy*=6i$C`&Iise>zy>d5A~Ge9kvn+t zX(n|;ol;hk7{yQP<0Dvp7M6B6E|)K{WS#yfe<$Xy%;#)rca$@^Jq(8E!7P0ibCQJ7 zO)+nbZg7sXD~p$wBugT&0@ohStw~?K|1&U*M(0#+245m6VtD%ywrn~L)>=Xf)B}1N zqxpLW8EQXDA=XM|{c{KD_;Uv-U^72r{_#vxtEO=cK8K77>SPLo?rQq~i@cGH*;nr_0l|xf_`Dwr1gVOkNqx{il zLd%5+2y(v!8B5Rr)xR=31rGK@Os9bm; z;B&tnsMoL|RIpa7Hh(KWA$GM}-~+LCJk?Y>a<#5I7T1`I$lgbpd_Q%c=OB`5bCG@M z2%nRlH+I?$vN_3b%RQJE774x;=Y2QN)|+;TXtV879N{2^o6t2^cQDy5%mjK0Pto#VEZm(< zoN^5O&{}aA749>DLrsWYQza@P*A9`M57c}0g|$~S%FgCE+j_@K{Aq%)AAo?1FI^Yn zurm$=?eqpTGfMj&^DO^1WKWr@0vja1)B*I%_9I-}9@?Kt?s8;^8%0KWxI^7Z+y_c+ zHmW5YUyk<1zc6_2X_(*K+!Q})n->@b2L(+hYjP(^ZKF$ge3)Rtj+OREeF#7>Ornq6 zUsN2dS7%mVZVrNsPtweQFpUdt#e*hl{=ml!H80IWsTYFXFUge8$_TJ?1z6rBmH(AANmu%g>n? zXCu<1wTa{}g+C1tv z*Vh{!P@@f4-cJOg;Rc=8`yRDy;W)1`C0yC%djQn?XB<7(L^`68u+;F_Lkb6>D9bnX zq#?4@35yhO_OcE61p;E9I=a^LxZ}l#knxK4CE<;pUrG=jfMG@3hzb}O?d?mR>{sZwv4}dKc5lnJo3S_*)>+%f);O726PtY>Y=jTwNWb-*KdZMPB_*>J3+#i8YRw5&nATz3};;CG$laPe{rycWkN=F53| ztQcKPWVj0)t{iAAe;W;pT)#Cst0ela z1q!-K>NwxifW08_IpWdoFxsl$xhQGB=(?V*&ekfucca}`5|11J zG;MofYq2!#O;o%tu9j;Nuc$vy=V$udXP$YD_4{bL4fx!ay)JDJ`ha?L_?QASP-yfU}R=!LLoVB>kX@TbMYH9Wy9tcLYTi9#&KyN-Zt=3vo zPVF}_^ez|87r9?k-zI7>WV~J*rDF%zBvlaL0K5_*23~IXTzH^)U;1YPXA6Pbr8<21Nm|b*QbprpSVr0o$6?&14DW3Qb7!sbY!CeR6Z;ux6&ercqElUx0apK#)@^M7AWz!}K zp!OdeVYTM&=gyNxV}G*>7M*`OKUmvwA5M6b5o zbShnJ+>QzO^k?%>`dp8dXSN^qOgulNX4K!s68mg!@c&$|J<_RQs~9J2KBoY^TwL&Z zJ`B{<)}JWnYROojH6TZKT+X?u=+vJ{y8y~T^fv4Jkg7eFpyA6f57BZW*9G(i@3Z&bmX!8o-*xCYnr7WGJ>zoyN%I8gwH9!Bg~ZTC zp8oc;ffjIAAs*#@e;Lfs>~U989hb?|_WU|luCg9OU8&V7#+Q}PQSP<0EX~JPDOI7h zP>*)hSfp6^?52bp-w%2Ji6B+R&RG2dnInq6JK%iQJA7>lqhoTEA4C zua9`LS{M+f>-MQdL*pX)^4t=S6QZ(|WFd4nj3-%8uf-==Sz0dJ6XwpZ2B zz+KVg*2#kxVsFERt<*{{+p*)!J%PK>(0*~9_O}{(ofjRDxptdb&vR0RR&A@rT=(-` zs?JjV$?zOU<$9gj-jjukcC((<{n*f5ocV@i`@ldAgE9->#dFu&g`3cpmWt1%w9jkr zMu+vlh4(hdQtfTOl}cy1d;?g4rtPhidEG+QaIeK=_mDf$%yzSL0Ft<{Iwm%X#csP- zd+_3YTBVN`xOhX;c}<+F1Z|(~XS@b#ED&e|oL-Er=9ZNXG67v}dX#oI&j}9|nvHvr zE9_~i&A?Y6+p^UD$c>7t>3sOqY11>k%Ih^obcN^HTk?ao;)dJYM%#TVTDj}h=GFAn zs{n_<TPYW3$ra`kkE>{P6&C9?&nS)91un^eTBp~xu@$NocG=8Er@NG@)uv4O9LpVgl?Q=3RuF{Ufb!yUvjFz5dy{S|4 zPXyYJEGg6RC5>x)p8U2fLCtr>L(5~my{gWiSy{ies#9w z-Po``>u-0dIcq1Jw+?%gHMugbVdP;_9mEO>Ld1>u#GyEN9~o)F@&xSOl%o`wvfcte z`@8$ajCPaTTKM`chn5!I#_&gL{`-5I)yGkb27Y$X&<@KTAK>}Cdj~sm6>$GXtlqls z|J3@C|2b7d;3<~M=N9-t&jt$V7m1H-7`j)S7)l~WIi9DdF4;IKfvw< z`@HSB=)7EAtUrvKU^4(~W!GJH4DcC%M{LelQv&U;p-v9~*S8J6FHboZ3~z<|D1eS# z0PtnA$0h|R1Tp}<1->!@Ul)47@=>5a;Bi$e`m9z5q?+m7Bfik)xUZz+J|NPrBhYd3 zT&m1_A7|2jiPmukcj5NbW7Fhy7`!xKQOOHJs(joJ1i64FMKd2aA7oEgTP^w?jK@8e z;xh3bC*45ccct>Rz}?`+`wb^=Cg&y^-|W4w|O(?eU!s;B0-x=Qa(^26QfZ zQpvc!|9T6nz~%nh-=6uq#o;R?fz)vMSWrc^t^5`hi~n3e?qiwYz_Rr zG3LU5mFD6Jcoc^_xlpxR>tXabWDK%?{`&S5{kDZ2wQ<|;@^*Q^f&JjQxqA?=Vbfvn z^*mg^@$%%s;l0P=B`~hlw%yL-eY0>ex!zj%ayTMz7cs!-xzhe_hv(w0aO3IO0d)KJ zV(oUuvH-X_^Lf4x%-8@;Z=Je&n%1c2lH0I&NI!2KN+fbV+Fr|CJ=#Ookf z=gs_S2*1O_^=jy((3 zM)7gDJQ%x(KY!UpTi{ppIHGC0?(n$5H5bu|GmMcLhw}py>+I1?*K_qY``+%l#pHFn!9CF`B*O8l}lUmo+wIux{SOvyy=o@g5ci{ zof4BXmOL1!>bBEHEBmO{+jRSq@j17*3O->MP&nS`Y_ubP416bYe_^o`40h~ z4f&ZD@WVcCU&dVj#F7Qd2P~2Y=lhIrsiWgx59YC2DrNjz-f8#jhTRMzvBVmQ{3llI z^#}9>OQYtlYV~|s*1Lxy$^#{w$2~nKGl%uSHW$YSIq%l(Cb=E$eJetrYtAH^*AeaAjahkCN*W(@=t7vz`$A*J~OP>yfqx)6zQruS&7N)}YwgroS6cKSq zF|h5u$JeWVIap$aK`k0;pFJ@%za-`Qc2OaSQ5p*ip5;^h z5=lye@B@^@)~)4uQ|}6O5}=^&ZN0-}9UeFy;6=J?W5Obm;q}^svp{d3%!lYb)+!Y` zr^H)|C4&|ulr4rMOUek2hQUb6Tg0sP{ghau^#uds_)Rt6yuh4GA!zQ?P6`sI7@Y4N zg#A9sNk490;)%J$44a7^U|G?^n|=hzSBz0VCS;9XdrM*j;=NT$6NyT{ggiI5i*SQ2 z%!MNIPjc3RwLe`)zW@{nH`i~$Eb$&aq{L|%bq9N>62zNGROVXe$mP5hmyW3OFxIeR zxR%LZ7ZnUGI|qd{k~QsDE`MX2_zGG$;IgjKaW;_-Rgx*fbDCv97PHY9KntF~%Mi!X z=L|w|Awi=xzMKNCmW=WKgPZ*7-^O3P7HWNmurHfhJ)a}U- z2Gsnx%j2yuuH^N$dL?o=w$f`?Tyf;+kWaXjspUZ`H@l4|+mIFWG~<7i80+VA%+3Sv zOLUzU@S*=IF?Q>I5l*|DA^nV@Dr;XE1jAW!ZeTdej&!f{+m7@%w4Ehtq@UDrg(4ER z=xz$96bN8AON_yK>KkQb89WZIX{VyOm7}!{;Rr*kqN80B#r<}Yhb+n50xogk8#ML0 z?iofW%3PNkZj1X)HCCPe2s`vFlf7+TmS=vEM{2v&JOQ?G#YPKzJVK!f`XXoq|#rb zu)87fs$&zmuxa7SI2mlGlc(oWOh|^1eBb-p?^ z%OeaEM0>qsuG*YAeR$(`_{SD|@ zMo(UC#i6M)%c-ehuAk&EY>-^^yVKp(fyI(ITXlioN2qr?j4zqom~qPNeCWY)4Ao>6 z_#gtHUXn}=*oh~cF%)$4S!^C%m=%Y5$HdH!ARC2Aa#aL^D`2n+w!t6*73vJRWRs-) zG(bEG9t&RHJUfsKA|Ujat=OtBnc}x^JB4@K$lqLZgK1q!->0E3n9Iq`L26rb%=1-t zj=75RzArlJt>F^?7zrg?#qP2=qYu zn*F=2f+-rC1u~1$W6ZzG5`spkwb?q2SZi&aN3}#V%#hnnu`blMvgsaGH~ZGFYrTGHjH-uI%Ia% zhy$kTqhO{o`c|NKh;qP_BVjt(AJP@iNMtl6bwVmNgQRmWgkw(sGn~q`Aw1A>ls6{M5W&d*f z7t|56ESC}!cOsG^lRtt9kw1coZ*NF*_H{K;yd-!f^WR&lQ!%VnP1MJY`Pa3%9+(wL zJRePxF8CzvkXe@G2!q36&cF;*|LUhNG_;Hlhlt$*Wu}X!KO|yTv-9V3@HXg8)jMXr z?_mPP?qwsQey!C_eOOWS3biRC7yD7=E~1(%*%W~BaG2L8HhpSm_9|H+;~(w+WdL9s z(Ihn7ccFLZ_1vL)%VI}ic2hvl#~=SLH)B5w)(gk_M|Gvl2yA;qJeCi+&{z|JdcJ;Q zW=$6n1Ktu4y6;j27wvh?umMz%DEayoO?gNdpe)wx7u3RJ%{oFq(hX(@xUK6_WGGY3 z*sc_Hbb5`4RViiHhJ~SK zEJ*t!i;m0yRwgShkMv3fZR^uD{ht+4vmdC_0d!HmxKlnz{xX@SJ)P^Bziv`-LgZ*pqurV-BGOMgmUf74UDXei_w>&(5lH zBXkull+~c_L^|=Jp}k)tb$4L+f_J79`x2Zla>lj|7l4EpI+e~WCV4Aqxuc{?ZHbUY z$iSyP^5w&dX@o+ebEVG&`nz}yGO6OA0v(hWS+x*_qU?}$-aYkDf>Vt3w{C?p4qgaW zwzs1Zv3_5LkApXra1;`*pLmRt2dBr2$tp`)=t}_^`MC2Pf>!k&RC62JV>fXl4eIM8 z_~#kOY*JdEagomE+Ipsc4N3iCR(^rX`0H2O2P>zf-gDAx89*| z6P+-no4GEb0eW+3&GNFUh)o?O|8%4fC&SlS5{Rtq5i^q|g=;=hUm^Ep)m^{8XK5{` z;;!$?oJ4<($!X{Mu+zIjIv{N8Vj`lVwv~jSlbKqnCoG!nfZx3h2RQ%Z<@OXD&E`G; zFIN{-iaZ zDZ}V)^OEd-VlO=Fl(%3z&d7Y?2Pj9vLN8E4f zMTUMWSybNGwt3-_b={}mJd%P^G+>*B?RBsJuqI`~nY0nYC1Kd|R^Tl?&Dh~%7_R&; z-ncT{@om|JZS;EkGYj&ul@?xGWA+?de|ihf9{! zP+BOWX^bAse?4pdD@FK06xe5>W;<}~OTQltv(zDen8WSDD;f{PLDQ1m6K4Geu5YSmlj0M%vKxPD&-k*D0Q%R=yl z$LNxj_bG~46c}Hz(0=XxQ3hcq^rVFeIE7u(0xQAOk5gX_Pie4^XmW2^dc)5RxSEd` z3-*_4cULOBEjDNU!6T&}cvcKN7-t$vheV0Ayo*OKpZ9hXJO#=GdM;(` z1s+wx_N{F?ZWNZi%EQW~KM*~|{J9aEV$bn!)vP3>C5Ur@wV_cp&JK>Q*eDdx%$703S!B*xbK+}DK zhJ0*lyB`pbtjmpL=?(C0*_*YabNbLn2L0{nSM?5!4A#WO$%5XS?r8AO5(h^J^oWz7 zwVGd_NW*=hAsG=)jV+?ySBJnM)H2oP1t3AW)DF!X+~a;;73K6Rj7Nju;nDaoj7Tik zxfus@_MXKri-CI))x7tF{cCUt+gOD#mj?nQxpGPOBZ2uY9=UuDz!8(H3;VsEKIM98 z%XsWQ`h*#gdpw*F6neog%jH3(pf(uzSI5lnoInJ(_e>V-#S>vTb-xfG>wRb$^D=uB zT{(pgN}}|^+V3L>H)e?0t7OcwW{gk~5`-FReMq6tN}c-Pl;us!8_N)n9LTVVLkOWP z#O-J6?CJ(Nc_{ihk3nnOT?~8b_sOI~A~m%EbVGy49IGLTDF1fTfN6v;LLEe;>Jl zn(lOunO%1`i{6mI(89GXibXK1zWH0sITnFt4Ab}rT9~xk!L(WQ#A?V-58b5Mh+o`$ z;!yua7{8+BTmdbT;zVekWLku(8^giH7#tp`Xu_3Us6zrQ=IcM6@2MMtDs+O$uWJdp zKSi}!=W2?Ef)914Zn!Lt7$%ty%CT}2%C_qnVYCq^t7*JGj6Ul7gutSZVN+$6&icYL zqwoDkt1?n8VmdYOkL)|!txUod19T^z0oo@3@utsBBe|o0ghRlQDjd^MYTgZvm19j3{^~{TrGL_ZeZ77 zA3fi2UJMo_naJkzMsvH<=hj#Gz_xsmT!XaQQ`4g$*zk{IHg;*kuZJww#DOfC24q82 zzAQ06XF44FrY+$9#vj*n*IZVObA}Z@xG)2HbOP=#!@!?{$wZZ<F=OaSWE_5XoDPEOK*xE_w`;ga-Uq@c7^pn( zKhpjhDORoi7%9HJCnNSTT_&9ZOE10fB(9Fxpdhhg-`8b?7md2Xk7dy=?d(dt|G+W< zi*{P`!u8Eg-eCTpK?YqaEYA$S6PERT)mr)aWIsEyu4@Ql;!>Ajj>%FAc?MD@!9uQ| zAFdkX1A;DudwBJ~aasYAO`oX9w^lnG9rYI`3&@1JVXRbk~`n>=t@@;~4#Yu0GIuj0t zB~>%*y*OvqB~f?2z8t~__+fZ{>cKYEuQh$JxWq8`B{D7)Yag2Q)U)qs5b&9Ggl^atP__Z?glq#@NAz<_7UFq{e{*%{XXCZ?49S<+w9yNfrMi?lkeQ>p5IEXgfc+ z$f++8qeE=StEd7*Nx9<(OMOjOZ3^9gM(B_V&wDA=_?L=74wDlwnW61f=U9_K&0bRj z&VfRR44y?hh)tLJXl%RSNy^Umf~Q*8j>B>c5>;!-xp2G-<59- z;iie9Ee&~*OF`iO637-TPyXmfG!Zf7j#31r{~{3V73q-3Lvs%KKv6ozq$dhp|I+>i zUygXV^NzN{u*iSO0N%eD(nt2}H?44$mw6HfdFnBO09)A!LR;HA2h@CVtuRF`#oI;s zP*EI;v#<{p`KopPcpA=5W|;8g38lN&KZKHv&qP&)gU*f%+%`DXg&3{0x(uiSfP+?~ z+$u6+pIVVkoNXw8T(MC#npi(ctx-6OO;1!OTZpmLiV!z1;^x0hSxkR-B>2rGc{2$= zAz$51>~wSzMZCHor59D^^g8Q7S3cHQkJeXg`xe)HxJej_);7(3@DgcJswFBUvtH*$ zSJ_IkY!E70vx$~lUaY+1rfsFCs%=8SXCMEaVoUV+BaOM{3Arg6jQ6DTL0|S}(`T8C zhZkMSr=NW;_KSos6l_2(x0<@`@z1ZTtr>75_Qvtt)1LED_1=EW4i}i0LqRbDX=FMt`Xj!}crOi}j8^jRJ*#fnX1!@r1UU!(yfxSzK+Z7aQR)k>)4SdtcQ zD!iQL-QvWnPycOd;@P_0J37X$2C8w)hR_Gmp^*9s25$_dCC0+jcwpwx0yq-vDJGd& zbQyBE1N3N(lE8Xg4y!L{KejeIdC}~k&gsbEfDg}frz$Mf8Sf}_cz@!%Ry8@{bNi_6 z0Wb0nLwts1Rc%7XSQxX}6?hpW!Ia5v^HEyc8Emp!! zR$5%v;2>v;n4x?<`LkUKGjRONuS@Z>#Rf^GxuFuKTwHukhS`0JcO>5_U7!p`u1cp8 z@F*s@bFz-3nwBa${0b}Gb&~H(YPltpA@wvOpu8Q>HOI)B_(Xy-B#`hqaSn=#}6Qyrk8MjHMXy$h^V4vFf&+GO-G0SjtIMG)xRG z9l5=Erqt3dh?{F6_$=GO4?V)X6mL{cW@bo+G$nJiF_zrE9+qsu(s8D!`cf>|5pgfx zxZGalBssmLYn0!hk+rHx&N>iu(cvFPGPZM3ZEb1Q=r>SzWdzu1$$HM+@Gx3577~i0 zaJ8ZO-oHot`nBTiELa|j`{D&mUv@prqT+$586~b4fx6IwdnX4P3vv- zM2F)e%yERF>Z6Jq2PTCvit}+ zm^Cd&-G!c$e2nhuh^Cm*3wGgJ1DUZB+}aHAUXOXzI}dr`0yQ zRC22~{R^9Vv8cVD$+-CeI4L_Mj z%|Lf$cU!UZ0x4WnSG6BkrcfClz=IL~IWTmObutl=Ki;0m zQxk`~eYN-DPqE_Gx*@3e&M4;ti1iWoaRuJrzUfTpz~s;pRSQ6#q?@8(^KE=cZ74DS za^Z)3Um`dcx=ENEn?`Q1j1c0vO*G%|HI8Oj>3bL#iBWiTQ<1o+#t#=w%*`U$c66(@ zo|#r1Am-dfvTTk&>hgIp;ya6(5&LCtQf%{ZJ0hdH)X{-g5@H(k|Q(YJze@n$N}f6s*nMv&`z{@3u0=&n20C%9tfTG1_aP4rFcg!EJ~Mk zao_L_;AlAt?7GHq@yaGkTYvS2@~93F)1*v zoAI=MR%p8n!m5eE4FmHR-J`^fB0gS=QjW#iaZLKvoaS+g9-9uByC*z|jT= zQR#L$X^M;83pL3apFgxmRBl5UR0Cen3s1fqH63+~L-8MOt#zZ4GOqh%U{0bfwl^^{ zqP*ZaF8Z|sN}Vlm_VQI&m1&6&6UIX6j3%2wrEvslZ)<(1rwjK@md96#M3hEa$woit%(;CfDX*+}mfAkTl)g4b5xd^2u#~s4G zl7PjTdp3Fc%jxR`cy>z#HirG1cvhEL+Q*SJ&JY0tbYxfDQq2zuGQAAAl%q_J-h}lu zqJBIQy~sT$idD2_Fpvep=P_iR4EipDEdsxO!e&yzMree<)Q3PRF=~(zlFieiV>9)W zLQ*JOckAYTbB;u(snz*XouhvAHSPD(Q2^(D`@Kg46kPTSGcw-b;E{LS)`TCFz{bzL zQ&1W+^6%0^PU}e-64+VV<2b#{F-1?#RvQ*hRlTz+NudxW?O^u_=IC9x*biA1(RsF! z>8iShXi1q;0Wj4I5Uqjmav&_Jy*R-M$99$0;~d`cDwXbT83c4+jZhbdc>~*Ib)! zejpRHc0O`#vFB@>wrlJ=G;f@0u=1SdR@jJ?ZTe02F&OimbKHjgLT}=GuqiIU;`xB^ zDLza>&4lhD^aGjr840wpTrHpiNiK^Xf<(_L5H6|jqh-E+=TL5!2cKRh4x~LUZQA$W zGZv`aY0PE6r{GL!z(Ta6@=oHW0r zv}aTK754Fo8fl<{)+R4kG&+)TG;*FLypbQnonG#yo*Jv>*$@yDghG~O02f$-@q;~D_}M`pL&n_J3LfEgw;R_T$5;)hrP4Cy($We%o5ja97}xWmS~OUV5|v1 z;(V#MVMqRevz5wZ(p^P`$1)0*ww?CVOJ^-pSQ3|;cz1V|%Lz-))PXF*Q(BCj1ZCwS zgJbn7D22S%9`!6j02@zw)Z26{NiFk3F+cf+3?Uscp4Dz$e;{X?1U8GnZFdl!X{O#3+NkR zeu7M_q~HPRkpjT8Uw$6?-Xlq8{d1Rq^MLHkNc4{Q&h}O6l&qB4`W*L1pC4Ie#L3pU zRAzR*0rXx6RvJC}Q=Skjlp$Bp@;?Nf2GY)J>BT)asD@yCO zQepvJy+zxI>$ggur~$~T~RJuL3hOLmOZx#Nh)o9El%(n*g zUcpZ9ve^2^3b~T2N|~HdOY3p)ofmjJWyBHi_RKglF#58!uQ*0x5~YHm*j6Isn|(F| z_Rk50F}B=fYIq41EE0u(GvT7lKRdJ2=y({b7z^hHt6tk?a5ji?GL_b^ad+MQ=1=APj--D93MtV)i&13$9&rJZpHmI z@Vz%+W_igfUtd^VfL9$`x7#8!&M)+vt-JF`?lM*7)zAE?V|c{haCSp-S?jT~h|uFD zQQTYeMmTaj4N-S!edBz-x0=?1UxSD&c^%`MrGo4w^S28oSz>R^lXq6!sJU22-7suV zOBfdQ=wnQ`K8=5=5DEH~sl>29UiCvV2&NWCv*o=8x}xjGj3!&r=MM;yNW>ovnLozZ z)O1ma`+4ErC=HdsX&W|w5!m}cCbsU?F{wU`RlBwJTT_Z-M_Zne?PT zSEy4UMyBO$v#{jW$37G*4pt0F1_Vp})aHa@~Bf?iArD#bPJ zC%lK1;*3u_Ng=$1f`j2 z2bBrty~o14bmn*|bjwEeKx}g$Q6hR;2)QK^2D`e2kcF!~Y~hrMvpw+;dME6zEVZ0P zfoRqMi$R?>bcydGa6(UKCv8tA%%jt5$eiW7>XhJ_x6LT*Y%sHJdl((=vF<%ix2|>P zh5}DP*n7*&# zQY1wq4zpS?cGr}}bQ6!g%&RG;=vuV0@jTCeJ&4LJ@^wH$5l^k zcOkq}k=Af@Zqa&ZoXUXMx%GUZJGWuqWn=`5Kt6qttw0JkeRW*LVhxX?%(VF%M78Y* z8?oiY<>U!QxzfaQxT!m=y5K(kDo!J{Ty+h!Q;ix{{Zxc4zI7EVl`)Psv$LBqp6-zx zL(wxY-dfs$LPrA4SWhMz7bgLU{CyE2x}4RTr;5rvWxSqW2>7 zUl<;V>7HWJFBfGVea-?v6EctEGDYos$;AX05lg{d35ST2sA5WUYbVG6q@0@j`tls4 zA{X5xqB6KXUakJPPZA@Wu`qc!!MNo*Mzkf%&@#)?8(jtFh=~LgJFZ+LbtyFpxm_<@ z+4mGq*0_F* z%9?Os*yD@n5S7UV$t%I{7;ZROn<)wTch&d)l}A){;dOUj;3?ZAi(Vy|nE)((`C0-yKE{xkWFIjO$L%8{JAf5!>*Ld99*Sl zpDL0MH+5}sZi8Rm{JV6&S(r}Z6P#b1d12h1=RzdTZtr6b59kxctY$_Vr^+nwic@10 z0d$4{xdOaC9?!ta14gJHH_?lkzD{X%U`fZ5sZ6)ToT=-9YZ;(Dd>2?mXCKO=D)RBH zmRjWt&3-_99b_dlw8PkHZXM9vwpMtwhzn7v3y zr9Az~DxmRyWR>%4$B#dzpT1>&(W9LnmovQG=(~EczFfm%jC*ad(SP^8W@4uJmo~nU zP`4-V!>ah0-rZ4jfEVV(HCm056~um*KwF~h&fK1wg;zQAdGbxVvO6a@tN2(V9{y%S zy`6C88Oas>UFoY*^pZ}S$!3M~C#$G4Lh=WmClrT%_O*cwK8x-k=0~PXK%j^l7+xC` z^s>#hZZsoKnATp0kqU+m|0JuH96GUpD6DNwQ2Ly6Unk$2bNG{e2C;^dAkGbMW`WNl z^3e;i*mfBDm@~jiX)FuWD@WiFzqC!(#JX}xLO>Mq4E3DEC;pM%c%CKq%glH7ceEGd z`{|#P>s$8Au|G5;ni6{ACI~PxqUbOOP}mW-)b`J0pda@-wYCuuou~5>q)mb1rJigr zh2xRmKIALf=TMmBxG;{+VrP~kwj0@fVXA=gNSM@)ZOL|QdrUK4Qq}M7kjqtIvrw{5 znw?9HxY^s5uVgvio|2cvm^(vvlthG3v>WY@FRGgXuzIw}He+h<9&e`XMwD3NH)cjx3E3ND;zWsXu6W3{=UPW2f>y2>jQ zCO2Y-Y zRd&6cWBhXnUTy(;W;5g)*;Taxf5xC9!w2+U?b?%%q=Mz9p*T+XCkwQl^^P#A8^5k; z$3VcSfE_ni+`b>p%xbZ3xN^BJp_)oF-A$NQ5Jh!-@Xi5|Mz z!5P7}=Wj+h&yfKCq16h2c}T*%9MScvnGL?>pmc8+TGrFsD1yfJVepS~ACXab-paF| z*Q#eY(#}x|Ul>@;IoGa^E?>4CZB(Z(YC`Z6Z#8JzDt}U}alg$%iR;@!coJc$sYV@u zEF=$#t`)_%txV}ID6a9;DA=QUxB2|xdF zTvrcWRU{>rX?8RoDV|eqampm-Mp6ADxB|5F#$C%l345+{bR!1Ta0g!f3}pw0h190S z3uBzhJ`IuLtl|-G4OBG?3DtIJRBrtm@hz8B%H0co9nLenf*w6i+GpIDQu|%rdglxW zqBf0G(0ejL@XrKBZ&imt5M;7ayo_lbvLRSN*43S3rP8LE0`McmzS!Vep1iCK8E37O z=Si+-=Qt!6Q7|4GaZr87@}8oh0XMEzk5Udi)x~PZ_)-`RHN{7xO-9tmj`{p%MvCLi z$Y{;Mt28C7NjM)N_->!b+-U6(!dRHZW0wO5`?^kSeyDqq$b^DcP?%(KsJpJW0a!}n ztA$W!)#l;yAsgpmHg3iA%CZS}c~XLQR<4XqDU0K4`Eq?dcl{L7@B-PUej7ne;Tq0^ zcs@4EU6{kS+GVYB8^TR3h!5R|es0Gh+2~%_7U*fzoyO}8k8h+@@0_xD%<=eLHX0NU zdT)|M4~-00?=Rkmi*+nnoxBeE$Oe65HME-K_u%F@l-CG)|E4I37xivXc631pLdfo{mqA?J+&kDWA7&O!LBW;-r!zgUHv%->2U(f3O&`^1>1&*jlqz8 zArx9!R&e)@Ua|B(2|81D3fdXl$e%yZc$&qKxW3p$F<|4VkR2D^8R9o>Aw8DBPls$! z&9xepbKNot$uZ)Mu@YQv9T${%X==gYe0eNDxZkYU=6{SdLj2)hchtxAxXom(h)S+l zcj4R(t(IYbxw~&^xQ870PbVM~dA$>^p0nen{upw+jmwZ`j-WW2&9`fia|0s0a=o9m5crb`mJlW}s8kX7 zmkLrXu0Rh_Y}=3=EvInYo4Ez&kH8oBH~a~X3awKOER2D(U|PUg{%qjve46DI=YryLHG;`oMOQ;QL ztJ``uZx4Z=@XO%P5jfkOC!ZU(d$T`*6$Uozo#)jjBVgT}Ec=~j6_g}n8Oxm~JM=WL zD{Mb-NB(l-g!#ahl213VA88D{x1u)i&k&TS^}eORDYU0!1Z`m71KcX!5a2EjG0lN> z4ljV)cbQ0AhMt4$1-3#g0hUw+lmnNbrURE0teOE!@$G=60ofXYbHHkUf+4j7;1nJa zaLUp%=jn|<0mtXVz>PZi)h$B?k1{Xl9~C%issvIISQRId@Y87wgR z^cG^w6!9gdItYcmaoFqzqRzpbYI^{8|i)6o#eCLGij);Mjlt1zn>axrYAqHUOGiwRRzsx zYYtVNfN0u;)*Xe{l!Usl553JoIc@2LI_4Ve!zA)Iw)V6}jE93ju{aOPhk4jX>Z+v&hx~Pq{jx>3ua6azI0vkE zMVH5iop(hDr>1RpwPDxiUpcgz_$nvw2O?xVcsF;KRpN^}Nf+LA-{i)>Nmw;qb39@`tg5%uMg`?vkf=gSQ%e!nbvU6Yb^HSCk z#*h17sD1K+$&%Z9r7_nAv?nRUm~PQfO*boL+COuqC)(n|m9kVCLkm^uW3m`s6&(`T zcG&Ji?Z5gcFwdZ~$T{H;b6e?{fkVCr{BmZ{ImCBs^9|1QF^eufe1Y+i+{{b%yjd2Kf7r4+ zQwrv_#C4CW3sSvbL-4r)o>k1Tr)M?!0C-mGMzNvnUL~dI$Tji)SYE{Oxk-9?!b!3k zE~QzbvGuX$k@c;?I_?aX2OUc+i~11)#vSlyw|eRM&#pJSgCtIau12YCIfCuI2D){d zx(Bu2r82`Ld(bYsZ!VNM!s?9%t8G2R#=*D8d#6MLQu=pAB%=Fd)LtZL5ib!SFEv)p zD61{U{aIhlO?r>XSuG+q`+MKI2asq{LsoHG@cr!Z)$l8^RW0b4Dz4iA4Mp}~Bi(ce zC??`;^5AU`4>)Zvp>6f5Au?D59{cEf;IVJt10H)KgC^jyXS@X-`@m`7u@~-l2Oj%9 zH3UW%;r;`fOJL~%%1K#o#~c=$L{F$Tx{oBrM@etkLzmb*sPAONg2u~j-cp^!C(>+J zYm~*Zx{Xw7=gnVf*f+9xKDKw)4MwT;PbzzCSX<(yk0;^=ez!5#CAeYIf_MJm?~2ju zr+BSlDJKu~qSX?O>3qdaMHeW56T1~O2YL;^?Sk40DKIA)B_WCgN@YklLB0p zpphEv^DMN~rb1apQEwtAEy+M0iGYE9GCPf9t%8jRB@%HcRP^S_a_am4rQfeN`Og;)%uHmZ}4B*QM_hZ^td~K=+HFY))ndsNEY3 zClVZ$!XZ5{3$!aFnooB`yH2>8X2OzM5;1Z?f5$NWoJSR%nIt9*D#L#0^rm)gp-pN$uC9^TPDSq8NePZP z|2qGE<$_iXyTsh*2>&pzGH(cHq5R@{18-ShzV!5Dp^N#}`p#V@H&(o9_9ARLFBLI; zC1S}2E%Hnag@jhRbM2RTnv#v*NF)A06_Yvcwy50m_EjH6#@WFg6_vOcFzOlEGVk6w zE$<*2X*#u`|1ItHlUhMrL8p06`{l{_uc`rz|6r+-O2GJU)E{*8^{7(&%lQAna3LoZ zH?L?ZYyFdI)%C`MBS{AGaeY)zRAQ0$u|dNlL&C}2{QYRCon^(jn@rKq6Hi=r%RLI? zVOS4wJ+NzYTW0Ce5yE@E2m5$~JOXb)%VOw$wol+#!Y7I|!j!eEEJ=1B1hF=lMPEEF zhqFP%#@PO39we4+G#4lrFSK^^`yU0FzC zc-BE??*R^b#4N|jZI-;i{t*yE&;*5kY$r26cT>$~(TJoCk>n2`<=AkwR{M2Hb zkK02PJMv_MX3~ShUy?=Ko1xjX$Js~nt$8s}8so)8#sAr5t-%9aR$E9TYIKWElr-(4 z_f&@m`^DUJnWt%m-BcF3wG5gD+8U-RId$z+OzV? zZbQxV>y7>#$0m;DS#*E~Xj1d5Aunm%t)zYXA7Wn_v_PxgUAigrnWDdzAYZdxM*wRQ zb%FY2ukIUw*5h)tx}4oFw`nU(D>FIe<0iq6A-Pay5sf}DW#9+EILB^02^XMWkY-?o z77A?ocW`FQ5K!O>Vc*MBcduAUZ5T^wUFNf{T)xi#c!nZJL2j1!1=@|%Uue+!b(i$! z)ETFGt@#xxqKCK}+VtZdqM`~4uj9W4 zsza8Wz~(G(_!n!Jx=_BDD4tOiy6>}y!su;lhzRguzDc^U&lCEh5S!cU|A2n)0jkKI zRDj*6pTmfmJeN2sSvRIx!pLeDkw&V$65K(akIX8q9P!T2;jPAS4~G^V-FbK<9SQ9@ zi`Kk>;A94ffO(ghfcZ{OglFpe9$K0y@QkD@$XI9A*~!M<9CN=+8W?5#8|K()ThPLF zF58TQ%1P8bqEh%$qQYWYl3we2r!&V(!w@t&HJIfy9i2%z;Xu#|l;TYH7t_>TK?#U1 znV zwW8PX_HpYw;I3X+V!Cc|K_c)C@)1@c!D)WbcueyRYy+1w@efr=p2=3%OVaas&OB3nL%X_r#Wza6P7q1cI_QRCR zOYrb_V^cg{7Ww(fO!xaFdJ2}5sAnx-cq^;@$ADFy<2iL=(!d6&sVC_h z;N?z4{S6AA5o~Q?Uzo$nZh2agv9?uEgZ}vKu9O=)-||aNwE<7SL}l(=F7&|>Qs2-+ zF5FIfQb)-36AI>@)sX=BRN>fryJvO8d*oRiLD79yM?Py8QS3dbBYNsph)6ik>d24= zppMAT|KB*Mv<8tl1%~LBZsce0lS8Icl)85!?nSZLf(S|3DU}ienPxirI2zzr1AG?V zh$pChQ3z@EC6w!#vd?$&{2-_#J0K&2NY;YOE$wXMf5L1PVu6Jo@jzZdI}G?`l*YHj0g* zgZsHGmd}lCO$7Kr?d)lZ*B%Be&R#iUNo8#aBM8_L$#mLXu?8246xG>%(fow4UD8(;cth+n0J2^Q!S-l#rcDyq<8x4oF zGQs=WL@8%4yGaD6Cv<`mR`H5_83g9T&A{x%P1+{ytsE0_AR?e1(tkX*&7kqnc2ogEx`e+tj`jSI|@pVg| zlSrp_zz{c+zG*xI49UlmGC}Y8Yd&atnS*|b=sPg1UJMYj({xqJHwY?ODV`d%b~tde z9G=5;60&7!UhRXWWHg;$p|VDYn#(u(l)8Upd2U~FA?W$ggdiwWH}1H|BHl7;=9J+!vB7QR##N`V&zlY4%Yg66>4#ut10mKO{INtgqed(@PO)&3wVv zxq9Q^^rdsrNhg6QB!_%j28>$o(ArNB>9k}K+a+o$OOV`R=%IKeg&X14TXXIT*|RBs z7F^Q|vS0|MvyvP}khCHqycQSo43$M}{VW6#t(mz^L+$|>{hXOc^Fk2W(*tzFoh>T# zVVOuspy=u(RJ zX4`~8Bj7Z!`vZ&NgANZ>00gAwGRko<#D#CMxJbZDCp6^X+kGY3&|^uF?%E;=d#iCu zff!$K^8FMZm9eK^cKGX)^Zep1en@uepctBaDgNrw*3g(>fepLfGFZK2FqI$TTH#nd zkR)MbL|#_*p?H~XWW$a=tr zqJwv-QLh4vJl`nUzKPucd`B3oTC?Ljyd8rJybc5V(qRss;+q$hvimmPdWyWuS^jps zUQt!r11V?Ol3}@Dzudm3DtVEXuEE$^0dia=?WduE4GH#kovOxFNiI{(1?5L5UtO*7 zLJ>h`x^ZRe2j)>rX{JN*o0lVwsTi5Oq=&5Ml{%^p;mN;@(#%sF57FCMz$hI!-O)Ns zvU~T-D9uwVpaP82ZNMl+a#+jy{%n-OPOofJ?h`a(sU@u|Rdr$nct4bIaPD8W-0eVq zbzU&s@dR3Y=#>Fr=@6z6_V>>_oWHcK}M0Ho~ zwqpOuCdGmNWs}DI%_gPTX!vHh;WNFjpZH2y8h%yv)s>pa%3FCfBV-BA`_jpz<)Xxq zVY5U;(pi&=g&(<3DO+56TLo}l^$4dA;Q3#rzgwe7i^rWZRfUM_r9%VC@})=vu0AG-=xT zXPi1T;y21Hs43fAJ2@8k)knU_GTYubZV;}$#e{w<;R0$g#)5Q2negKs(R~Wie%ZIh zl+_ggwauSV`@8*rKyB1ts7+C=UNGGJv1A~}rxuxXe>ShR47%z5rfAXq-r*=`avOWo_Ny z9xOZYdha9}okQtP8MB68&K>&g;@+YkZk;s1HrHG5TS&@~txB)k=wDGrYK5mLW0qiQN58WHi$QIVfx!CwbbSOF^ZQW7 z3TXPYlg)MgJX5|+V&Zq81+hXV9CbuA(R=u?-mIAyk#h89v+I5*R)=fLOF<7=ZVS1g zsgaqvr72Bs7B!p41`PB3E!9lmp(v|1&qnAf-ofnC#ktZ`Jb!x@`l^zJSFSQw~Saa0mKxgH8X`HiLnL z*zPI6Vq2&t7HF6t7Z`%fYPsr0J4$m4QHy8P8))j(kDB=o zu`BLX$g_=z^x4WdG_s3+T~-P{#|3ay3)CI5&kipXR#5x()7 z4^ph&1@Ze2c}1TW-wZr7Fp>p6csARNqv5NojJ=~q1DA2no!o`FZGREUtu|T!-s}%g zZEzM~HksDtHfPUk&!%Lf9nce9g3501jn94FgEu5dWw5rX!|9L~@Uk4c{uoK`>&4kN8rJ=KyC%9D)A1n*rU5;B)#9(P;)^^4SY?XTAk||g8Tz)XFO--n@l5fTR0zi+$|53!-@fb`@JWnMxr2{4{NP`i{wu3!T58hWL+4PEus>rT zCv|Lcp>^TK7khP%HN172MC&g`^C^}s_qT#YlpzB36fn4C3)VDaA~if=H* zRw6V1V?>dqs&C__lJW4Mg31059oJP*Sme7m5K#FQt;LQky^L0>0 zKJ?xtU6X5qCr`s2hdT=$eiPPxxt?J3`>qvw*vR=&r*5IJP*)K>TEDj(0iT-tXc1xH=m) zWiiV2qlrPVobTb1DST`D%!ZdfVPi*6xYkGrfXm5rX7;ee z(%Me>Ij2)XlaixR9wxLuS&YdkL`o;0O;?cjx^u3v5ioVIx|_xCzn17Y`~)Xl z{<=YmPK93CV|5UjBJh(fP3eGuBc;YAU`S*u8NM`PSi8W|Fyf@b&|aUM#rcYo4UZT% zy1?k{;bbuy#g8vOeDJ@`BuYHc{mLWyv1rH~&`EI=B+RQ&k*A-xrP+a!*I#gAMF&D; z8CLP+x}9Ltt6~>~Bzrm`M*-x|Hy`TyQSr00PfSc8WY)(7`{sf^hGhGbw!j1zknNf| z&p>$IDaS2J+bH<;NC`An%|Y>zJpB;M&6FSu%Yisg-FJ2^h^C)YFQI%mx~dVeTCuHb zCI6mC42a#B7Z>p!X$^pk33{^@XLi&hubtHCs$9C`g`sBAFYDAE80L^fUlv`I2P=aD zO;AJu{V_v*b}FE;AHydxgJ{vuW?9L75=SX=W5V@^VJsZcNNm_;4~kBJ|0_}=fo=-u zWf3AUDf-b*=n+jpqD8ohS5IxUSQQwv^OrE$LrzA?$V<1f3In4so)j;UlXc@3^J|o& zec_2}Z4+LuasK=;U|cypH(biApkB?(w;7B3;;66Yd@RvSOuiOdYI2!}_yqlDj0fho zULrxSs+DcM{}&U9Y$_6XwK9A&Nn-QDMhojZwCa z`!Ne9J*fyQA8n^5ISgweR`9K~N@w6vRaoTe7IDfz&r{&li&iB3xuSXf8KQBHF2_Q0 zh#_XP>^TKXa}tjf+iDY=`#vyi$~li^h>ySNaHjpP>MK7|h`IdU^JJF1rI0Qd%q!jI zyE-2gKjd_;CuVt^#iVD^y>Q6r?c5{a}`o2uu>M%m`<9@ddRem_RkY9?Y zTNj};A9mGDUBH~RSZy=K3bwXJ`xR4HY>N0Rr}mcE=?9 zCD$E|G*KmEYFH#81g8qJWI^v4tVif<6}Wkxz?wU+Lg|fy2V9_wghW)KHM8)~5G=!>NIANsCD6u(at^VTU*}n4fv=0E( zla@^n+*f0}X8{RBqf2#!bN?K@b72CacN#5|GQsfY9|5Q?+fLf>LB|~qG7Wcvcdg_E zT0$~)q*pC)gI;^m|Ay2D=Qm1I1W@A=jwQV<^}DW@=giu|+%#NX+J8>R~AEUs1b;m}^olk&JyCK)5!w{Uu!g zu#Oi~%fW2sS0H^<4R;+^6M4Hy;@0V#)7=TellDj#vgqJ*Sm+qDHtB{+?HTG8E8}-I zLkahCW3^_JPq25u115qvas4t$**sgyXVK?}?27WbTAx;2(49AlW?k7H>?e&(&zpSf zWRJ>OHGJAuS4j2O=BatE6Q98J!lCDj4w^5xWx4J>vAe)Nbq+as{8Fs3WC6wcW)pr4 zYF2VGG)GO=xXb7dkhWMk1wi_PM~Ir6yo(WL31wXJ&vI`X#4f$W&NI6+)T7&1D$B!A znE*$F!_un$=IDU$h3nY185@<85i$Tr|4;%rS`?VL z_A@Q3j^8%ds;3rOxDd_0adggOsc(@?TcGhzE$^f4F_%F5nI`}0G?-i?NKTzxwC zkimlLA4kMuH_Ac=H>o)7D;|8#@Wog>W%!88pEG=73e}x5dsdMYiBW&GfT)=$L>;?o zTVbte@jxfo)9WQpo0>?L9q~0qt(6L;EQ~#%#-6SL3Zz z-YuraVXy2&f=BCY#^^I=#9QXL%bYR^X4emuA*7PD$39Z513?rcn6e`hIgF^;xvh`M zk9$TZw9~H;Y4eI4!b_sFQuinL9Biu7Q|X5irjt*9kCd->u$ePfUsdELZY@#Ttd5+^ z-*v$TV|KdGysC$((BM&@U@Hw%D+wi-&qJbnGbl)s$*JQa>FfH#Bx%fdTO-4}njs^F z)qrESm~*VK9pRJxv67RNVNn@Vbzf^znU^-rOCsB zr`~3TmN=&en$)^g<-^<)WZYtX7%UO8Yh^>!F8?|*x@SaqTxJIIbrDQ>wugmt3?6(WtpH0o$Q1Ft6(<$STdt4PH7j-m1je@ODjb+I9sDcvOOlUj(=UI_FeNCfL z39~tR$+;^P|4Y>;#mAx(h&EOACQg5k8QNM-GyD{2rCmuJbKCb^@Uh}zH|=c^ zZ}Td}R|kD71sObCwhJ-Lhf1Kro0^@GCO}=2)W0ww@y7d=0uQHC62o%2z5R!r=+FtI zZxfKwM>Csx+Qcv86X#E|FM3StwT;WUyumgE)tO#pSHTy31I_wK^BbXUzWyUZzahym zB;6io>Z&@G8_|e4C109S)+la!pPHT0@~hZWELyuCPSipJ6-C$n0|IT~G9~i``^&K8 z@*^EVa$S^bavWEiS5sMxTHo`Xm)`uqIaS1G{J1v1*+;Xno9nGQ*RsCTW0(ad5Lr?}fiAWtHQPJ}7%ZVrn_Ohw zwy{xR+O&rMAL-R`@C|nT3f`z;zUDd~!R>C3*5GB*0`}JU!pS@lx|8IRC#1d#d^7Ac zYJgG#ExAu>YwYCgOL%qZc^f`%5M7+=HFLiZjgXC`zvPVej%loAkI}bf&a)}YUJ8w9 zim##%CS3a5Hwk;<971!!n=@b}jqXh@9hHGWPCIc>xP8ZqNwD&t=Mq*3{y(z_=Iht(FkC%$aj}z|IGgbv+D^orYkQZ2HC0QoO3_ zh=$K2whf;WIk7G z&(_&_gwNNTol`{#uxT_hNL~8J}7*qGVjW@2tyIpm1T=MPX$%CH-UNmiAiHH$ zo1+vRqKx6463t2y+KyNlRFj`p&IdmD53FF7K;=nv0aRX>5QK_U&5iVX+=I&gZgoCix$qxQUhjtGxOjvA7OiJSwkbz5zX&`v2NGkECE~?n%fvd@!Kg;+%cF<0B~L% zQKb9G3$rh~oc~&zNlW`xo57%d3ZIOykj&MZF09FO(H05a2s+V2MSOf4*hV}&S zK0N;n?|hhlhxZcq&9O4A7qGYg4DZ|qJ(G^;``1|l6X3SO3*1KH5%%j*q1c|$?(6W zPo|MW|3MPB9RHgnE>@tVj1=NK{c`Z+TauFb(KPI1s03f^WP)LV=@|PesBNRX*f+;1 zv@HQ?P`rtDuZL+1L#Of=r)WoFc4G4DWd;eUdP02f${?FzhUT|^sp2m0L83rHfLP|U zDt_?;P{rwqz|TAIy8%_)_O0=y*&i?;x&mJ19eODUsNx$JbAT#d;;l0NUsQ3^b3x;8 z1eMBfd_$0gQ#RWpqta~6ZgA=5*<4=+oF+H=J?P8&{n_vT>G!vOKl?w>JdE(~e!n(A z^8>1Xr};YnKWQGWDfu60eyaHUO{DxwhU3nUs4AahbD<}WuETH4BdiUl}=e4SAybz_X=f&iNeQ9 z`mvrQ35X`_nyvEz1d+|FhparZSF{WE$_Ng*zp%E|r|%1k=~Ib+P|oo;%q!N}ZB0GH zy!PP}%wPRq!F);P-(Wr;=`Wa1segufd8Ypc<{O=#Vg3@wy;l_iIx@-2)}_xX_KdxU zH*U&aIuyZaX`QaJOk>s}B0=-#Lm%Iem~;~#3AWoqWauCkR+Qe!7jtopzWbuLOw^l0 z16Q^w!|9#WYqw0h%*5jXYqL4J>%wWl@e|eBo7pwj$J=E@6kNe;B0p6mu9?$@;iPzP zfT=ZtX+9ef)9QxFVKCfbz6dcU+Grg|MiAaArR3m=l z%aBwOdG2|?upU(uk(d=l(DkjeW0gHE=?Be`;;!o58?RCqE+jP$)bMYC`56o_(Be}g z4hxm6H0Tg`A|?x!KKTwfS1LBb{X{a%Nc#V_yq~mbEP7%C#87A= z{~yLsUWoq37zz|Tyg%h%Ih2J^PFgKFv`Fxm5$=(fGAr1#Rw4msEIG6kB1{|qjU=AE z(T+v+P}!6F50d!nf0M+Gc%LQl7gv8s;!s2Xy(B)s@LLie)0Syu_}@$7JG3xZ3`|aO-m6 z>{TUSWpH4&b9UNwBTsbCXfTmRcPx$gO@$}7-tvu&orn^@j6~<7>DHqmUexoE4FS7l z*~kl5Myl_&(RJ@75e=%pb&ct8)lfzr;pXt<WIxAi^Le z4jMzRg=`fINQ#KBDUblP}Z>?m|Nvl9F_opzl!sgYZxD2BKH4}L71*&!rh$Xz+~)ego=`w?a4f zMaxBwhD@kgF2&tgaUsRg33@+gB);8i1v_~ZQAsj%oyc-((Q0(U+sf;-JjpZx!oM~2 zU)spLWB+;k&<3kyK;6jdcQ;{n1T^$@94MToOw7q$>mSYFS)7;AX7KO{n?b`&t&sbY%EQ^Y1fQ&cvCe~q>6 z6juA@i*}VGmjv{!rD!6Rb*}m7S7E^~YVq+Gx7wA!z&B5uDe_xsRw^y0n{wh=n!El6 zVBlM;K{@wG`@?Z1ORUT0NZzG`TgPsG{)u8vr1tjxXnYS2;RNKU{p=_JQ7I@!Og%!#x8b1^*`su|_Hk)65=t^pxdo97|Wnk-5 zxQ3lHeavzb`*=c>R6>YhA-{|=+;x9xpAboPRDotH{dHVp4A9KyRr(-50h+mOdImMF zP#DZw)qXFFw4@Kn{ne~>Y=Qd=sD>8&;*lXF1KP*e`^c}(ZDR*(3zFe&Z@dyK_|!+( z1erHU-6uXSNXhIAho+a;Evd+kQhpmTc0wB=;Fn4e^OrKJ(_w(B=-MNLU)) zEvEF*7iA9bQA8}BKdgYh{U(T-3R|yNq~qk>H;#=!^YSSE<{YlYsi}dA$K`0Y=tVZM_~I<|YfXM0**6` zr8v{a(f9@L%{Xfxrf;8%5T9b-#-$KlE}%%vU$r^wODvtmiYB=+5y3AmkF=8>_YvAz zQ4uZ>Z~w@noJm4Aw6wGoKLUA_My|=nDw-{^6gfWh)4;U{SC-jNwHus5F#`AZ5)XLy z%h$7`mma(xD1q3Y+8-eD)6&osKc$N0r)5(S9QNl5yrmmC0kYpjHf5cJJC5>&9~Jsx zUK^7nubS+@j+i`4=vJfD!<4@z^n|RZwz{!!LV!~X_Ht=_Wm0*14(?MR1^piaDHcKh zK;N=|ud4%rl%#v{DNG=cf+;xe-^+5<_2T4heJ+pbwP{3{RyFm^Yr}WR^vsZBry=0? zW%C0kMkpK9OEt!E8tY}59>iP+_v)O?$@~+%*sNb6x1yGpR)?1#fXsJ{G@zi@?!b?M zv+vl)&0I!agpyAg$I^TA=&zIUeV~5f#NJ$zOK*(ynFJjHt^B)6XvcDN|7djMftqRi zp`y6oD(;XByII~2q#Kg|%2ZlEIzdauv_I1FR>L^PP}APATY0qFU{I$N^E5yg6DupxN5zAwwiY;f zrZcffg`Uqp;y>dzFeqxdR#Kh)=;&y!hTT&ZauMBWee?F{xvMTVj_YkUkvm716UTzJ z+1HVwNk7t&mXS!FJ4?0|^a><lXp6o&64AZD=nC4=~l`@CrnzX6ijE;}ogK1olnC zIy?c7pmOA@A6cg^1Ocd?>l&)3=@Sq&fbF7_h=$B$K(~zdht$ytcvXThCgf7{ROfqs zRiT24zY|E9v;!ts5jwm?|6q6skEPPzJ@}=dE9Bm6!TAh<^AhO5b=LqLIN^bPpaTat zriDXYu6{lrqI+vmqHU0E;TXzzO8B^N)rOU4{ z=!Cp#QlJ}z#|Es*5O|G*k#?vqivq1q^Okkmx?fFLSUt|wG4_DG21+lcj-_TM@=IT&w;t{&f zo>mn_b7U!8TkJC8M`099P=$2itjm+mH@v!8_Nw3uuzF)VA)G>BXCA^zdAsyoT{ zYdPor;cP>L{ozrfvF(l-=i(xh+CY@m+7Z(2x)NtopNCfeqi(#6+G9w?9sj+%Wf6b* zl?UQ&fD6LopxfOo@dLs2J`Pl}KWKLk2q|^<1g^lYiBcO_I{soY2rG>M0^E>WDM$gc z6jG$b%DXo3HE72+{b5*@Ht_*&O8egwkGBVhDi0@!QQ2-pi}8CYT;3~Vri zbpvd8FwDjyP^Xx(3~IAx^n5X`9B>7&8Sl>M^TiHD!foJVM<8B?z{*`6;3PZfG;lw! zOn^Ogt$>wwgushc;6M?*R_k5rGN_58=fMj*;H;%H3$VGs(`up#;LR>Vfh`=o%YlV< z@xX;{$riv;WW(qE&4;pp*D-v7*AW<=-lb&{xDK6bEu9s3sldk^Sc*u0p|J@Z72ehQ zL%)Drd353taGq^@*9(!3R*i^(th~~;t=0zV>j#&;7_}HCPXOZYOOe!WuVWK>?9*`1 z+ghoYu(_?rN&eKiZUwjAxGcwTr@XihDL_&yd8B%M357wR>YsGOTXG)8`uO#Pp1v2D zLmNaQw8yzGA@>a;I}0i^>zid5+eZw@GQm3k&nxILln;?x;*|(F?NN5fqxvhEk>Z)P zOfE+F_%$P(iy~-ZOW5kD$_}3z4+akFAuvR#>*%`tJ|N8WIBC680@W6WOZlCXJ17$fFYLSh7C0{C zY*rCdI^h@KF1IWV5Ufw)JaWhp+O88YPcCggGQ>$rlLtx4C=GhIkLDWT@SQHfnYjt8 z7Jex#nY>Lt)c?_h1)XWp=?*?(F2MQs|})V*&)eN0}y{LZi$u`-M} zI@76HTqxyqa_ZKl>aya-LsHb^XB&1zlVSwFC+z^cgLNF+qx;=?!8nsxTyTx0flecr zq}yT{X>iNJI_Yib`?1%nov7vMOiTi?xFcgpqp9k_qU@S1=MAg!=OHe!x{I2VKRt0) z7cd=oI^9NJ)fMq++5P}N4t_yXuh4H&HL^g+iOoefm&aizsqbEIZcg6CL2_1PdiB7x zV64D5IGu4Q*z3U=o+ZDbs`6|)S~ql$L&_9S3Yal_TuofTv=W`$4RJF2(=j%atQfsq z-i=$PY#ga2dGZloRmhRcLG#D7qKQk!_HO!h{w!=SLzZr`VF6N9dE#h4=jWt~Zo``^ zQa$-g{R^PD*OwRiFl0O0Ph;;L!GUO_VhHDK+XChz&DD}NsUr{77c}11qZpDmKWlo4 zNZ>OeVBJItLn2BHv_dPO90kJ$Q*9dS_ku>>uv6&NZ@I%iUJs6oA~+T#w}kqT}tPJ2wmuNp^ccP(TGQX+f2O8 zmM&<#2`jExQF}-U$VF&nx(dKO5v`U!+~@fl0G6VY(`dqlkUTWYeV(w3%pn)*R%gESW_v6WGU3xsnIyvBej& zx#5DAUsL4X6lqW==#Fk$ZC5TwaHwOP)1J|D_lo=mWA^D+zrk1(jwzFE`I(8$?0#;l zKQXehqBzh}@`a3;7Zxnu7z2hm!P?i=%l$FTshs~knnL7=k}}&_)z&gx^vt!{_z|sS za0|%#MZD%r#syW12Kl+s?;<1(BCGJPBIJG7a}m-mkmOG-+Ct)4iw>Oltwn3roeLO~ zxqCrrLJAvet&ceif&cKOLb}KLxkpq@y%m9VxLuj10Prytv9g^XEv7PLo@pn|qFb?z zpQH+}IF<6$`3Ukyfd-n*@*gUJJHvg?;SwtY3FvVkTrvuTOWLEK#y@0Pzo)TX(GIo} zXIRqTQ+}hwg;J*%&Cpi8Yd4npJnX5Aut*Ul+=EPJ;Po0lFz<27pq|M8V_w9m<}L3BJKrI5EGPs_UaVEPqd0gE z#8+3>iQtBhn~^%rxM=x26u*Yfei3W_rAyCOVd3T%+pA^}wo?@e|J-U>HTBVh$lfJ+ zt*%Sa$+JY{ZTmTt@B&-A3K?|gF};(ux3!)}H?GO(_t4p$P22CErWfF|hwDU$x6q0S z7IqKdm@h>qM^JXF7`E1EXY4kfY_UbsXS4w{yb*L)GPLld`{>%#ceQ)873$_+fzF- zocUNkUeo`$P4JL7eSqf8YcU-m+d{!$plA|5*_y3rCs|DW z$JxOSn@7{|{$9><<_C2n7RK8Y)_*TbuH@6P^8d%8WHP?VI=lHl1WzE)kkwZl-&w=y zoP8U!R@)}cf%rrhzN=>`8Gkmn9>p$s^lkol^zU8CV~whi4y{*|by=sOkOzdcc;tL(#usa?Hj_#xz~Q8qjY2yu_2!47FS4vAYVg1)5` z$TfIay(J(+!qZD{1Am@0%aQ%}NwWqb-41&1kzRgA`YUmg74#kQb(UO;E2x}A>>KuT zVz8-kg{qR`U~tU+)H4=tZ1Fpq53L`ojI6j25Tr~S)ya}UDJgVE^{{{b;M^19RRC1# z8JzFi9KrhLa+6d3B(TwZ!aw=DeWmtRN16Vo8M6_eaS`rtOH-1#YIei_ON`qwF@i?6 zYb-VcnOy2$BPc{ac;YES%ux{gclO3Je+9bf(bZ~7GjW4ha4C0N&_dglhA?^SWRUln zk9EdLzP#sxEkEq`<>Fc$+1t-oA{DP$w18S;L}mP+!YE2ikX!$d>o!ytOR(Byg3reL z&~+2=aT8y_nU0;1SQv>7pR0F{Oqer6DB)~fRl4Z&bF^E>Z!}i+k0#}3bi@_hRW7|3 z*J|q@58!b!^u!sywq(GSkO}%-^8Qrz>HXhEQ}|CktN6p5u3j^Re0Q`VROzhVZM(vXE4FRhs@UpX&-0?c z{@y;P&*;l@m;KKeJIO`Ho@>tEnu`s-$s-(8`8WcrU8g!r$SdFyt{Vjka=LcHZgHJT zS}+80qeT|#ChO3IMtAK081q(h6ZRtZ|3*lIJd-c13nskh!@YoF{DzEF_q!qiSDO`D zo@~cY!jmEv%^BdZr-(f}KO!jF?+D?lbqAw+mJy461A&hajCr`^EWu$-$rM4`B6=k`n9|k&d+Xu91 zjuhWc6^l*_c8gLZX?iIv)S~QZ`G-5;=6L?g)f3G#Knsdq&QWofHEVN;|5nD#M*JNq z?1eDBnCI{eb#b-C57~-2nOJO&^o2{^A*`uaG+c1x%PM-qx@~P%c=y#mHbjQVod|b) z6LG%lP5-MVN=C6o7oCf2&$toVkNZj(1C|q6JJw4BrZ#TJ_;P|3M59rM{<=UIV!$?!Az4{6f!w5bvxX{QQHbb6#&>8G%vylaLo&WOV zArd%$pkY>zv{zA=jftWe|Je<7>{iMg#7ZFwc-ZjpZl>B>C$xPGi6|ZGrgZE<@W z6$5mC{ls5Kc$?><8*uF^NiC<2x*fb+udy0gybxiQ>jIT_-rRIwGs<-xRei1ojF|lQ zjZ2HCGAcga_aTAvjg4*l8*atJQ7>DmCr9@SZSB(J70#UMIbPo2DJFH4W2?Gz!=hj7 z4rlZ->piPF0LMXkFOt+>Yxz6RpWd@78}m)DhRN1e^d*aswc5SvO91CV5LyH2=`kfT{HCFwDVCt$q)0cMu;i$pyfu(qT*My1X56-rGsw zO$*A+CZIFN&&2^dkEnNLqi06szWcK5wzK4y{Gk;b9j{&yX&J|qxC?QPw7&a8hZ4zLs8md;;HzWDQ>TOKc(ERM3fX0&XM zN#q97e5x5pziBGsg%~7D4^+f`k2zGvr!N0Od&d3$9P?oNmF5&6RwJ~!nu0kYPA13M z?b5Y`cg_cnA4PSQ&=GO~MW<%PLQw`?UzSBr&%Ng~Ga-RN--_So`{CI5|0Qh@(UFV( z(=lU{-bBJhz~^%{q4qAPk}^qxiyl-fb}K>OIY#n_(r*UbIB{ED-4@*Z&zR38*gr9S zP4v45kN2J)c7aP?Xg|$rhSL9}ymM(bjU)LI3m- zstL+I{=01^8fAi9;V5@C#yt&vobK<2T+K^BL#~s0dhD|h?|il==8qz-p!?762 zz2<>6{tMur(j@lD?WHn}0XfA5bmgApCHBi7C(9imo#15hhDtTV<@WEGm)Yg}u26IQ zi{PL8o8V8tq#aIM4NFyczP+hiV9j+zim&ifl_6w(8$$dl?ScT-lc55LBK8(9ZUo)` z5k<_|8movaNGhqUOm7t&(d%0t)vNS1)3AbnNm_ICut;642y!W&|BOoT3uphD`ICR1 zMny&!ZIkr=nrzRj<<~rRvJ07 z=2lU$82_U*H)p`vW{1huZsP&39&pv;g1(~qrwwfdfZ?}iX^Ryqv>%~@>|;Q8dH;JC z7WT~FqW#YN%H?Z4Y+fKhlDeRTfaK7-WGglzr4TZ+BUH9($Jru@fZEHu^s zyclcGfi`LT{jXd^CaWthS?o(J;L=9D)X-e=*-moI5TU4ATXe6%UgBc+5LsRPp% z2qpBn>H3)tM0?1u@eu;;Iljx`Qf28;F0B^1C=5;YX>6XcaieeNZ1*T$^e4=u-CFOFfgE{&iOGD$*He( zHK{rhI(c#$YZ*ZhNjTB1r zGz%2o1`HR-%CW7B#}R%OLP*p<-8)%RHoPlHtSrL0RUHAW5w5vCeeo{R5VVg}GadfH zk_9s%r5q4B5gNO1`XEy##5(QHZ&BUfJzXvr=pPGaueG?}+}U3k^JTwjk-yPH0+w*o zMc&1B?1SnxsK|PND68+XYc4>(!r2qM?R@Rsg#1B}cbM7aQ)AyTeW{d4Z2B19r)2Aw z#On_Ps2|5NIph{ZhKze=`rPS5xD;DoFL6$I4*;!YdD_wm^6~3)yI#yk8myPd6Azw; zT%4Lu);Az@3MU_@O^*XbVr;e^?*6?#DG-?mRgXD79}iEFWCkKhC86-R3bsrH2YP;2 zrp2`!0vz?TOmG4oTyZ2=O3LK|7~E7sFNfR@IE~WC+iq7nQQkN|Lpu%|nX`dsPxcLS z)nz{ge$ACd4YXml^O>dJ=*75Y)W$g;4z5iS;pd!=pnn3G$e2+@(RbXs>=Y^lP)p0G zgb3eWxQPvzASOW($WaF-j7k;9CYr8?Nn2G&X>KRNH8c$dhSUOVz{guHLD<7j#3|C` zz$EZ5CJQYfh`G>UqR|Ub1l%aNi-uwf5)l4ukr335ZHiQgMTX02CN%2e98xJ8#meI1 z6{%tsm~mGrmm^`}{PvcW2LdZ2Ta2dTlM2kvfvz$t;lcjtS&(36Tw=-g74C@g)O&Ca zW8Z*JL`?l4VLSBQ%8ngX@WhiPu{4{e#S=a{V~3b;1tXU?@|1fi8?8EbntSO zpVZD>BDYw<5m;E0@TS#^e_2G3iUgQ{I4Q8801>EUsguw7noqQl9U85Z3kAs1a%EuY zm;UJh3V(hi)s>681KsXktt6Nm4=@my<(ukkRfI%0VnEwcx_>)?iG|mIF_%)MwG182 zI#zmp2`JE8y6px%^_sw)EpSN%A|9|rWZj|OomlZOuz#wQ@OWHaCE{WDwme8Kh}ZY7 zTvTYL2S@;eBqL2R^7 zXf*|v>`o9%Qr5`kZ-#d5X%3BbLt+krV$x9jr7CczrA)N>c*2`N3<$7LfRaZl10#kY zW~96YG7Dt;F{NK)KjlEa@lC(Z*b>&L*dWiv4tvh;g~Cxg_cgfz+Ux;wU7v0H^5Cmd zJZYNTg`&VLi`;V6j$uw%tQEnL;qULM1QYnPakCo4hbeoFb7A&XJU1-m!fCSj#qdah zqs7k}DijZa59<*FW%DOe^*+xp5E7K^YGv+GBe6emB4t$)1`}l}Ez%9HeIttY2*zIt z5q2Zg{bm-S5GZ_bz*ILOx?;4*e{rOgXpoE3A*uat`l+axpXYod_{x^9+sv*%(m6<+ zhwm!!8bnBY7(x`$LiAlOQwvVT=LkwEhg49asdZVfLJ}l+db{6kl8P9mmFYx%#V~%Z zZd9Tm)?unNkc%2YNvk!gg!B?mmSs-_+JORAMdTV?r> z++DsM>w;;Al+lW@Q-wpWQ!rT($6fCEX{$UZVg1f9Iz>rEy-Uzo4QQv(1oD7uL$0PR z2)oyhCZA`xGpdLaZ!eqsBp!w8xFB8Oz3KW%qtusW`h976o<0kYpbd$P>niN`l&38* z3t8mWXKbXKHw^cfSJdbIjjO?MhJw|p%rLS1R3Onw4C04R8(p$s%^*=3W(#2xqV;+v zcb-Cj2sWzD`F0uT_l|z_ba(OM&A$wgL5)53PO-9rKD5{ULDV*R)Mp{L!dqntR3pz&2Zp?50Oggx{q_Yl%U7 zzm{x%e;mc9hcr4?jK4L$%+&gzCi1zZ*k%c#NPbzS49E>)gDD*#?iSlEHtU&DoMQ)E z@!07BF7S3;o*7#zqeg0Q~4kbS_lRm zJu*Msme-3x&6Ku0HHbdRf4ltl?E03fb}7gAcDoCE?d~M~NiZrma<||9k~XL(S4yy# zPVRNC(lZg;)(%Q9lM0%9qR?*tou!Y1Ov?YfE8Izn%y%h<$iPT8=V|u*=iToMs}c7G z?KzwwBXWm4v!G>@r{2}PmEyE{g z`r}Op6ngD@sfI5!TrAnBC!-X^*1-?bw|Im!CqMBWCHu~1?L2N);u65$o5(A|Ws*~A z->nlyr_xMhYESayK*SQ6hbMbQ1^|aVAhTQ0=s}`95x*HGnf#o zYp-%GTT(WtYLMU7WXpM`dtM(~4C_cGKDgl|s$8->nv+W6r-(q2F-pMzRT;wq7wqY~ zMWXOYc1E4_(k!2=wHT`-<-cj0(;&Ypsj7ZE6@%C!V1m%&zLpzFCW+QCl(R0paN21g zPYV;+pgRi{d+ieobiC1{OZtYDb)7@Vhm*Sx8=2)eIYZ2Oe=cPqNWY?k8dcu6Io&~o zw2y<(K_r6Z88wF{X#F7Rxkyb!6Meyuu7`FcDe{Qgl0m9jDdmrO0Mt*m>f}ku9z$BY znBVU1QP+^l9`=dMR`6r8(i;W&hGLd{YIH0vce0@!O%=Cp4r+Br z54wU{4`cIPW(P-&?MztAUBO*aG95@hx78;pNPUNeKmH3a{eq*YY^8AJXkd^A=9FwA z3`q0QwauYc?$&ThAGqZ$u>R4}ha%1e5g0754!@fT8R$G&%KHOjs@xNEyPxcbVz&8wV3&3kg^liuoGU&I9t8|JhEl`_+?i!@jaF8y> zeKKes*t?(f77Iq~3fr!M?;oQ6?D50wv5Ue)TRJGxBn~3s&bf7&;`;<4J;FqK*yRxD z;p_dEY}akBGejs|*t*zws&BR^NS=v0)oLd&OY{64WyMdlY!$GK< z%s!L1NnF3tl=S#n5JhewS$0A(#}BYW-6U;SId&enq{Z#D@mmOn*dbOxVRrHskr_XU#%09qSPlJoh}Q^sC@?RH zen)2f3ktLP)D?xvO9=8(hC~D9%t@zArgE-rm$_EfF7~Q31c}vvLq=UHO~-N<+ZLYw zPO2d@%Ff&nZ1KK591XG&j7)X=P$5&@vl#iO(S=E*KDEFD8;SzGRREN2^V+t{3?Y8_ zqaenwLWc6R3b8=W0&f=`d_mU`#) z7zIzt9y&hdJH?nj#L(qzBaAkXsHuQN#%H2@C28d$waesR9x>+a@F!vLP!8C1Y|hFOaD< z7nzW-p#6nvw~nWknBhbb!*WtdJ;Y{=2qzofX;6X=JJY6 zEpzxl>&}(Z`@RmPd-{;4XR3WZ&4rj;6lW;tGbTJ>kzU+A03VJfP;@sjf4@po?j=$w z$i#e5PmzR7ZCnO^uH2K+IO*Rb)MUPB7LfwS9FrSRy?NFnqM4r@;;8VRBqMD7zKdDs zz<)g+F|)2oV9Def80M7-{dwese>ISinEn>9;0yCDxMBua-k;`5;uiA9j(@Uh(%60? z595+uw%6I^q>F}27^h$`h)J|dSS z;(j!Fx^kOq=8l)|eL79wf=9nq4&17&)j@r`E??siWym_gO}WeTkBN%?K?hQGV;T!L z#~1H(7m!>q$e>TQj@jyxvBEOq};)8*-$8hh)oX1)ZOq5cS>@n{PDr^nP3!hq_^ zZ6vg~aIw;&ndzBb(+7h68GX!*$HS*J&l_jSkgu{Ehn(7UIkr2Id~K$pDRoWdhmY-n zm4x8C?$1LG%nzT=4;lbx`@H7m?D+Z&sQ#wT784F_zmRg0Ghw*5Ru(jNf)ouUK-Uxr z?N;ST)?^(8rR&5Z4d8P9CK;qnC|@BnOr9;97>CbWk`V+8xwb4XBdDoAlo53EO>$r? zI`w+^YuZ-1v`AlpmwPPdwfD6o31*<34WGJKEO>{2+;U@Ns)X5hoc3dvD(mLW>pqKS zk*^{g1J`4VrPM^PalM2tdQHaz1Jm`w2+HRBa=X}(Zxp>H)89P*(s{};;m6C0&8~a! z9&d{ghDo4CmZ_fsJC=_RYk}|Ny&OpEHML?!8gaA-3kBeA!f|pVx{NKS%OCC7hGW^T zd|F+fo#xiS)WIKbdwRYf*LF@DXLpa>-q3H9joel51h0}q*VugDC17T`6cAsWh7_bl zEqriYpEG2|QfMmOWKAd754YamQ|aR-mz#-kT;-kz)J>tz$qDmiHq<(^$2C@OzDxAm z0d`UQ0>21<;^Fcd`Fei&SUqiXct+Lwj{7E8#&oHLV znybQf{RX_CnQbtPfs!)AW`p*~Mettqb?Urc41plpEF|HNcmm0AGl1;|A!3`$m!EhnU)T|^doijpeQ?yYbNhk=Dttn_Oc&iq{m`` z%$v;np?is02Jw!Q#s1>5-(D3nrlnla!3s}*vO84>_uCB#)riLr;_cmqA{IMo9KE}U z7;n_#lHFGHPASiP6R9>0|9S@S+c<%0!`W0uMx%`+DxE3pHZ6-R>Fr29NhzF^*hy`C z>`A9-{viP?6;(NR6TI!K)|8ehX_Gvmq;m5(A*BqQ56nT@5QyXUMokMa9GR%(lqgYv zPL--l6opY0_W8S|z9fqLQvu$M=!wuC1$1AyYX@H~9_?U#)b7!e4fSJvw4kiw;Y7om z{Qb&ryg1)xl>vfi^P9YgB4qXd-Cs!9fiD1?2bak7kuWWrmrTI#A>7Yp1Ji-c4L zHEBZG#-xx7ak;4mrh@>*f}INOD^#BUR=jBvdPESqGcI+gF*UcvF^@BN`D+Pt^7oZ? z(dNkf-SSC1ibX-wq`^tVAxq-|q2!_YI8cOr%8oG< zs=OOmL_f!ukG@d+&DdWXqGu$pU?7H%-f_PhL|RG6dx10)5?pY8dpvu#Rb`B26JQZc z<B|31v(1NITlK)-YDHMNztFc1Ucgzm|r$1sNNV{TQWGP!9%Mi z0~pHgSur>b60~%%0V_$t*-dQ%W`d47TqzlV_TzDYq8gJjzUEe5CJJeS%eld7MscgZ9$Us5pMKsQaxzc74B84Mhe%xy{F9&cm3{D&P z*W;}&MKGKi$dGwig$x7V-RF8ydh$Uxi&wz%4M$)oe_r`_Ru%QaydzgZ-?mmy+IrFp zBJ9&H)k4eVvw*?5BRAkmVA@!adou8#i+D$FRsj>evJ?2q`la;y#^6onKNMwYVi># z+Bt&7*o;$?{bFki1>Bti)kM|mD|=gCE`JVj(SkOV%<*%m-lu8@Z-lPd`=l&L3Id~D z#))6s+=1o$!f8gM^iNh3R1%Th9JXex)8k2E4Lsg_lFSEdFl7zx9yp7Jqt&wR-qSU0 zJl>{bT6l*ZRe{rB@l< zu0o^>%2KajVs0mOpt70cNhei>Gg)CBn=@3*5YU=<(9fjt5y1%$&g@_5^;8djWIkbG zKSPMHu;@J^4Dly^V&`GkRfrmSB}E4U%-+=bm+l^jp79Af z{AwYmCrP5OISIdvY|1bW_Wq|4>H*S-TBZF*91{q06^7#SWw~fkGzl_6(`)5c4>yno z3!QgbE1Zo?*Y{V{{!<&jwJ2h(2nf|#3UPrE-#7?g?)_H}^k3R|pX`^OQ7qR=zmZd8 z889BwzLFqRLPgBQ6s6Gjqm8M>%Px8>t!~MDzR#y6fG3Kr^T_r7E}IMD8&Mg8P*>xG z({+uK+CWf+0+#=o4y!_LSH#j4)28;}_Ps7Oh9;llI%_<`4sW~5Ytt$03U}w1=O~== z$~^@il+9P3tjL4-)mw+X|Kx{u1iruHo#OMH;lqPN7=sjSZeMA1eZrmEkOnxmHPx$Gw~;1zyZ)(wuEXPd47)Hz4f{Iu%|}qSw6xGq8JU zl`|szMbl}Oqt&<~0XBT@yF~?m>teGe2N_2k6fUOv-muv)lAMOzW~SB&4yp*jOqH8- zf@j*EodRap_DM6vp)|I5dv;y<&#!$oo&t|4nQlAfdIh-pGw~-y;%cIp2Gk8^8IO*qJ@T^-#hzp_?1Ors+ey5_tC zhZ?;Z2??^&g?B{wdsxA6TW6ei1hPzDzNJ=Q9EEYD7fpoTffm|7?9sKl;(ywsMZ`LS zD7t@~QI!hnrQ4Yv_AqIg9BPS(lx4=AuUr9ir2vhrQMG20ee(~EObt5Nkcg98bm%SQ z;|Px*{v(^d7_-y3Mgc>xtAi-^K-Y5*DMdn9c1Vb&t#*xLfY6vi=f?d=XC^xKk3`;` zHJcFwNaW|QR;v0+0EyhlwjnTjVJsmi6e((XvZ%XB^&zFceR7cdAR}H@D&EaQO)uob zHFuMu<_xFW3EcMEv$eEA-bakxJHX`|d+>^Oj-)W5R8u`Orz&%+xK2F*}=Rh0}4YaGk%cZ;C` zCQ%jb?SDGD!z59Z?9$f0=~N==?YBl6S#ic(`rwa+7dbxQfuzkN1V1*2$}v8c^6TcS zHFv{7`&2p<=sp*2;2W}>9tHgNjYn7MLW(E^0?A;YwJAUqe*(t7<=oeuth!!Qds18=)!>fFsT4DrNcEIeki40S zI=3t-e;@NPAoJB=p(YO_!g+%t<4BnSf(DWnBCYwZo!}C%3~QialN9*SWc0NPB3sBU zoeMTYaZEkYYzu9Ra{G8!nh0&g<%2xJwwSL(y9vnxKj-;UpH`0~H4dnjOumT1YYKkt ztr~u7%>V|mArW>L&)wdp3f8A87VI9WX4qriWXsQ9D@q=dhT+NkvI} z68u+hgZr!;kQp<3b5_mv7r|{UV6JN6&7i#U^VHcq160FxsBBG=fGDEt)%zNn$C#eEq|ADtKZ}|_r#g(|+AKs!ix9JaWVe&8D!t*cQ;_i`7>_6ZZ{@I%U!YwwexBnY% zQ8yM=f?Cp=1Px-@X>s-lO%L`z^vp{YeJ5<=B1^Yz=2Rok7$s-5!g+XcXWwSq>EPq&#wS|D4BnW$; z^P+9VdN?=VM$AEf0N0X@z=(%VFL!d*mE(U8Ufj&rnQ_F*We+|~xM-I1AeQ}Ll%)EA zVrOxsM;wKu7sLtblqpN6??p}Q(XYy=H+gP!b*UHBU+szINn(!~`@>)m^`HICU}Q}M zx+y4fid!(qt7cOJUH_2RpI6TYs$-rppmjk_c0x3#zfObXa-sPf#E`a4#l0C0kF!sq zX_NX97pF=etIABUL%WrTgyO$FuRa!7mq>pFEmnAfhAMzi@Mm=Rf!%IZE=dDBzAsF{ zF~?aRq%{%fr)j{o$hVu~2{Icw4upi^(Q_p~b5za~M}Dyr@2h`OIe&3DzkJG-fI!MK z(JUpl(=)+OIc*oJbcbzsM9CLQ88-d>4K<1FI>&|Fw7#{!^|%#j2C^S^F_RJBG};Hp zakA!cr93Ycc9+$czR8@ry-oNw%smLSYEnKXNh0 zp%+>65D%0v4~#DE_x4uBb6QCPb?2Tez606|g)hJAw?gkA#Whe^eTeufN8lj3wFvja zLXAQjF-|d#q`)eS>rUeOEl$8PSkkfN2-=2?PRP`tR zS2X#Z;NOnzIe|clIoz_p}6X+lQa9573V^uCp6o$fQaJ8C0>rEgzd0;mTr}hVEPR zBr5Dp5qjWEzkKN0GNNe&JkQgik;vQzZD7$IhClrRcc44ObA_6HBZR}sW;L|s)a8zb zTtX%?rAI;6g{4Y8G*ii6Mp$*Ej-e(zi#2;cZz6wIu|1qMSW1n_s}|SfBzpPf91yu@ zE+c>2pfDChs3r=nM)KRjv0|tDlE?VqJF;Zm^F)b9GCI2TTKILAifD0*!yglRs3ssT2WIq+Ax{@1-rz-NG1}G-j~HLdp^M`2syv>ag0k!5Jub{Q z{fW0mX)ZN239>LE!G=LR@=157;cDuBf66b)0AjAC1WM7~Vv)XY7fSQ^^51HV9E%r*6p(YbVlc0i zssqq?=y=})d|trb?;^?9b`YCwej&eKPpG){W_0`1y8P6WgPm$Y;DP8!|LHNzPzZ%N ze@t07yGo{N-Esm$1H2K3WQJG(v^Lq_v)6EpBZg!E4Y->D0{4zR^^>K+Cq=Z5JiK)B zj%-5uqLwQA&bqd|@r?=pNaYu4&ud_Ef9FIW@R|DZ9{DIvm-Fn03zl!qL4Ud&7->=I zYKeSCBhwQ4j{^7$DI5B?#=}gHyriOP*t=Br98J|S2=&`4t(ZyL{i0XG-lSxzh*WI$ z-J%8UfnFG>gE1cS-PZ!2Ap4+yTK_$r1W;ia#Tqye^kFm!;XwbKZivJ?|8O2bv43+O z&R_G*T83{&nv%Z{Ydi51`yy|t?~Cnx3yV?vD*#B!_yc-uo?yC8?=>gUk^)nP4bfx# z1*r3Q5=~3Y`YqitH^8=P&NmPc$)q7?BxyTa`)l_HE}_A@+)(2}o@NnLRoMm4KfAQZ2o)U?U zK(i_N&uxuQdj<}ITkQJ>&-cPUJ9#^7+&IJ&dJ=hFF=mL+7l)!{V?`wdJJ`|B%|zcJ zU-$cuyFNbpNkl#Np*w^ECLE0zZC;)n1FI}LPO{Q$aiiE934gk4(9pEu*&!X>xGrHz zV7={sLLjL6NO2Q7(u-aI2t>eFE{8+p^lu1cK&YjJGX^R-L&HFrQXW}ubxI2}_oom! z!K|@)y(BLRNf#-Hw$owE(zEm_#vGaA=IDRGKm`A13?#qw^<6FBRa5_}|h3G;B_9{7+Jeh)H7u8i% zmqL(%I-Wf}Dvqeo|Lt|}5*{!AyQI|hlLTEOXm6!_p=~o%#clXcg23#j9h_j^3pU;` zT4TnT;h%?ln!MrmWfjf_2mg%&!4?tTM*yS%YznZ2|0M+=Nc@umcvbF>mlkv3W;W4i zA(C`)XFG$~t)7n7_&8m`5jg_p`OhS638EjQ5B+SbvP*KF0pT>u7j-^v4SZfK9ORz| z2`7a;n3tG0eb*9`KZiMwta%fZraF_z?h-acddj%Y;TC=%S}a~qQ!5tL4sj$C7Ln^L zx_9Xyg@3mW9eFEf5T$G_9bTZBG1P&sq=X<~ntZ~0CW-Uxp%VO1pS>E8B4FTj|P z^U!D~D99|rbfDpmc{7)uqQXq|1$TwbY~!miV8pTgmc%Q-j3a5_Y+^>-_Q;g5H%gX! zY|KtICH;2_psL7$qxffj>CpH$2Lhw^HwQxdsFmyK7%v2G^@jst3oOV~AOvtA(HB3s zP(V)44}bmB{(oUt{oDRGIqQa{C#dMbv9dj*`pf;7ov!T|Q?EZ#gydrcc>d*Im@#t3 z0G>Zr*u&c?^Ro-K%27Fx_ekaDm_3>A^k{&nLjTYR4wEL1xK5dudi4ck|P~1MKxpIyV zyXkhFA2XH>jQ7Fa%^(fU@$FCoDi+km0(}%5DCk^`;-Dv`dyQv$8ovt#E(=9KsREeR zpsrw($c4Dwmw@P7d~tISLd7)9c|3ew+~6HB(r~>GrxV`>^A8z(mIzzVF5X=ma7dMd zUD)^h6}vqREEds0=W--@2y{G8VL)sU;8U$+f8eAo8e`AK8nchmD;}@T$s=n=*3mvF zM$e*y&(R536j?=AL#DBze%H@9(lT1fZjPXIZIL5a*k}t#Ev>q>;B;d(Sab*BP}Nya zG+51y(wf_9!+ExRvim%(e_xKtX~%v~lSdb?Lis=k9sPYWUXa@IouhY!1})Lg?@lLG ztK-1bUIPTyZ=phy_8A%hHmyLr&GAQ*pU6fzOea2=*_j{}WZ5%Wa~4^(9gXihKAqI;3Fs zp>6yXjPO8)34}u%<8Y}@2&PSU28<^aB*6ldqlijiX~Ch)Mqqy>K|@*GHvvK{ zI6ae;fc`NUjDSdP#SOo0&YZYO@b7RQQbHb-9-4xTcA>AokCmBSIHYcl_j*IbYsCWm zt~Q19*}u;&1+Vr?bW!u7kiS1bURpsqp!BW<^@pq!ld;_#UI}&yw~Z_hlTF&|Ol5NP z$!qEF!U903@Hs6iU~XBv5gt$KYY%pmtmb)Slp@z=0S_^s&*S&wIS$-pxvm)lPBai~ z-g+`)Ngu9Wy`S0rZj4yInl$HaqLxL@ydQT&RZh|Qn3vNz&=l{FGGPPBLNqzox+d3f zfzw?sgKkl?Y0hEJ-gubTfy_ha+SjWNGFQ6S3ky&V-V}XM+=zOVQ9I-|Bpr+{CpJxJ zLMJ1E9gmuY4K|-FlTT(PbdpnNM1UVIM%`Nipi_{Ih+dOOTd6G8t|;LU3a#$do#)#%R1Q^PbeNGdg; z7Po{(~R?9L3i!%8Dvkdm%W?7NG4$I$W z**4Ta%`&D9T4V#mrm+3BXl{pB1(n~? zMwW)S8i9P)B+E?LAOIT(c+|;Ik3bvrK#%uSevwQ@s=C(Y)S#3cexmikvl z8F^hgmumXndj|EaV_PPFgpr7EzzLmQP6CISsXoV4vHOWCF(i=o$d6ZnR?AUP#nSZt z9aY`^%on#=7UU4*<(Jf)oIEME=ZJPTCXB5v>a)Pve(;0Hbt4PI+xJvIzLho^6#MTb zov70X-#hPZ$ReWd{VKkcMPycs^T5wO>~AllI1r&uG4#?v5=Em#2;z|E4;2QX1Cx!g zK^qWlOniyt$`SmUv5n2*LPn!Zgdl}Q=-X=*kwbK9fxE$RZ5=y*85CwODXe>M6Bg2Br5e&^ z#%ZlTui?I}8xM9u4lJVp8QTx z%mJ`9RIAIammLE9DI3eOq5d*9*mC|hHfH{9Y|OX#H+hH(^CB9?yBXoM!pu&cFqx7B zO|4C8vwppkL@#B}ntp1^4kE-;OYuGNT-4FFKG+y6Yi%veHKYK1s zy=e0I$mn9^&MU#xkmzkdu!N=`OS(nBA!t+GkNTcDa6mRuG{%lFUg7E7Cf#oFgRbw^ z;k?mExxN~@r0&j>D%{mI$;V!K&*oz9VwguQYo60{jU?I5a>jD=ppKFG&RgZhC;W#2 zLWhFvu-D>2SZGeHdMR=0Jy-s->Npfi z?cjGEr{Kq{H|W?QQ0!zzTp}$Gab){U4299^EJHRVWR{e%W#c_}tFH^ktTR`o8&{=a zNL;j`<;5&#YaUqDC2@CW8@8J!pNe|7rjPW|Rhlbn=4>7zT~*$n$Yq0u7q6)%I5Suu zK=z-r4a#uEM;dUish5`DkZWS6Q>iwO;Y(^|Dm)A(MJMH-;gsBYQL)KxBrn%P1_Mj4 zlbtQad8RB84`1PAS1$$kvCB8hH~=a})m1JxI*;()iu^v`fnibhJQZ43fA|}}!`3fN zxE{by0R7D4^c&zZ@9cbtPIy1ibgjU^TQSGl?c&|dRq#d)C$6$Hu= zN|>t0n&*IMrQmZVyldrRFK_>0H3FRk&WKWcY8+m|2%J#7YFS&mSh*fn|+9)$?@6 z<{Fa~IeYa_e}}^*ryeY5&Omco%{)#?JltF}QfYOSQSYgu8(Yw+^)!4EN@*nV9mf1^ z`Yd$9taX4e#!~yWWCvmG0HOJMZ?hl2vdnGa3jBE?`YL2rk*PiZ@SA@7j((O0d(WOD zlMCPL64i`mRF)JP1AZu9RiMFfXZGywu$&-v7Y2GvHru$!?{!Q#IKy#L8?;wiwh8+j zTKgQO7p{^S4Rz3IMV@>`OSqbr^mqf2d8;9wuoZ6({D~3!LPPL8C|beUU;$B<(@F#3 zGc)1V;AT(NJLTwfuSk@DWWK>(w3??Mwa3_YHe1ZvY*Xb&b?=u~=%>WFm9Ybq9XqE? zIZVHpzo;m;Nq}pt!Hc9Am}(iAI6xote!7Hs&2~t(?(>T$sghN0?4_5&47pu z?YadIR3i+|pcOQ2+t^8NpyCYeIr6@)JWeiUX;kqF*DN|d_p+#Xb?M1Hzs~HkZM|Z= z;-k|Vs^P0o{_}&8?NOaU@_e?|rr+kz^v3#hFZpQz6&*ZAGD!zZ|3Aq4$LC7lg=-h? zj@7Z*v2EMx*tTukwr#uPjytw(+uk$3wbothexCQO{RiwXsZ^4hnW;LjnQP23#xeL# z4?)#ge^t;2|ElL~L$Og^57B4b9?Fql2>o{_Ywp$vzy#Ar={db??ijx^Z;{FbUI zCmrXi_-uAnPuj)Gh1Da{cfCls%v(CmY7m7xm7wjN>?4#@(_Z-H+%{sgOVCxii5u#Od!Hzz2jrA(9N97(bsmr*I^G5drk z(~i=dAvdDUdI?PeyN%z*t-m4jr*Oxx4cKxE`^kpu#LZ!mW<$>La3k%bfaLMYSoZ#? zMy(9pGU4eq%JEs$Y^K%Ldd$x2SaY@+zQ+@31iY-K4$5(O<5eCl{z$t~?y5xzt~2a& z+=6LXf^Q%zWjMc$OkMrRl)@F@VjDIw(EZE2g5FAV@On|!gumdX9DsZ93y&t`c++H71?>mdBk48qS=k>G@nITdBSYr`WRb>8(F=*A|4@sIetwq)q_ z2Rhd=J65}Wrh(BN$4E$C8(BeKND8ES`N)|k^%aGy?<{>{_oP@ePE1F%p_VfSID4jpLJ2E$Xbq$L%l#huwRA!`ke*#`*fWtFIAeZ*2E zB$Y&l6H!YOWf&PI`6ElUi=z{c-&u`z2ru7ZcZFMuAI8;5nOG`{ed90}%==ME^U(4# zFrrPE(63<7ih*Pb*}&pcp$%|aIAG3>WPqa>`-4a4+ znK&h!Jt=2B1u5#{Z_^ZPZ;@?pnwWB9d3l8~(OcW4>oI##7&nUDZ}~n6)u)$?c&~k5 z%FmvKS41`K%`SGx+-9fgLW_d~7VH>h!>O3WABBnNAQ#x(riELmu^5c9j-=eEgDZGr zBA7{5<<`IxWRX!Y%w%c0Xjy9OWBogJTfk*c;JKVd>L{BIzuv2~UsnSUOjQJ86lc=GSWF|-s)x6Yv3{6PUq+7{%Q<4UjDQl^oD`kE>3MnXW~9Po4yp> zJU#brL>l1NSCHwC=E;Y~ZT>N^vD*A3wK!`n zEM-So)oDhKU?bMW(>>vlHdZTY%~c|+Wx_NT06(MERQM`Nw48XELG3p^ zge_A;YLSA)OzJX8h_&P6jjXfX`ex{+7?HQxaH{L}BbiFqUvoTzge7kSb#GwYP3qTCKH!6DGv;PI_prQ>K5vi+b} zME`KG_$W}D3kF~3#8rGE(P4#)x7a|0lV=u9Fms)%cKyWz8w`$t>!^aOsQvX*NVs=n zVcO5ExG4BnPnq!kIq#>;7lBMpHY?Hf&0m*6MDs+%U{aiF8denKyj@2k%;gQ3`f_|; zvKodY*vE-;Ym)OembVk{lhUW#1!ih6g+|G>zvi)Vz`_ZpoHQ%f@L9~*M=3+%WALux zVuK!YMJ*;7LXC{qC8h@~N#f3Qu1lPxdrOQb@my%&OY#9{Mx<|(zJ;6u5tWn1Y}%8O zQ2z-YQQl~qAJhBDK%d^HZ!J1LalyR{qTybQrDCXB8^1j};Z&tu?sIM;`(MjYuT__V zYObHc9sM(|d#?uq`nuc6WypSMTlzvFRuQoKN)7o-wnNXkZ!12Y1NMI}*hHgti`whM zrEfxvedL0nnY!vI(8#dYu+(8Al53>?EdRn}fC+|KJTbWt3Eg*RrD&`vHDn-ayN=oy zcbx7%W|C@8n?1e5rAO%j+;L1JCpaUPi%TfXaBqJfr!?#&chx&MDd>s%m@QhvJ}f%% z`gJgH;^n+Qm0t5J#iDZM!ePT$X8x%{!^qmGzK)=v!eg|yEekz}YTMvQ23uC^T_j52 zVvl9Gwr7wv*(5-iwM2pG{G7!Fbs(N#Pd2uxu!g#!3PF3FWPg!56$Sm<@RN@c?XST< z+)1Y8ub(g$OT#p!6VIzzuKxKO;~O(t>k(Ocz)?0-lVJ5c3yk0UfG@to{h~=iarxF1 zxH0vdHRV=RGtP|gbZt!jDsL_DgWAS(7qv0dIR}6BG2AjnrDV~jV+r1ZuissmH`XP8 zr<~SG(XIg(FC}=5wX5z#jq!3%W_t9*!36r6epr@b$s$d1cu2PX(Q?%32O;08F~|vM z1Izafn=D7im#pAP4DEVo?HjE<(mZJ!-caP`M|0{i!WxeR?1C~-x8`kVtZnEHAI5r_ z7qu05Ce0@%ETHXqD?p+`30<(rL%Qb`yf^A-e9G<_IHS|3R?1+HA-LKmu$uB>8EeOz zH`K$;3mwX*oBZw8GB3``kzuH&aw#5S*Iki&KF0Dv{;fW$Jed*MXB?ULRKI+g)GP8Y zylUi(2lO-m$9x@y_mMv1bhqJvcE|I=R(FlAMUAX7D?^Tm?WD7B@b`>;HbbmPaoaqd z{%o(tI>~};VL3dr;Gn1`&55sdZi4I*V1=MWpG`rUj$YX2Wz7c{wk02+Wps>n2~f(- z3O|@*;hhmX$2~v5ZM?8Bj}I9v0HeJNirfZ8t41KGw$3y`Vz*dIv9Cj5o+2{AkZux? z*2owbYXiFOYj8V>??6zzpMU)6;l0NcnBDHG@ZgagWi+f^J!p% z)rODHu=>sMZ~lNGvUW3%R$Q43RLGLoa<7iqefB=VBq>PRbfRZLu*e5dSKZ$j|9E-( zC4Rw0Vf?Iagms!JKB@mHrk&BOK!g3W%rcn`K^efb#oT?6e1X4QEhGckW&! z@oLi@`Trq$rP~D3E=5kNPLEf0dl~XYrXhN@E=J18qZz3k@mDuW!raLHJhDbL;vC5MO+;)O z4u_#rPZFm{Go-RUB<24*fa~|a0=RkN;P0slxY{Y&EG4&o@L-)p*-C$m|BfbGLx~rW zgJGl2(0U;*rDyUBY5tcTZP?)NS+XxgA@ef$#U&^=L{xR?S%V;s1VN>ic#i4z_yBMT zB)+%=)i@9VH6rWQNb;9R#^nF;qp5k6zx?PwwFiAF@s=?-v|{>te*c#tolifz)^y8G z9FC7X5LQet3FBXG^aD6gckdYjxm$wZv5qk(`NYw3rQUKQ;qAh40kXrag0lPND{ed1 zvncbXU{4%on7o9vYRaj_at=vS4;VXt*`EHmn%>HMOOZ5=0W;|^`3pBh%HBtCn8|qk zf3(u(&?w>#{sSgJLK4uMG0J*eMTtutbWRB>)#mA;wDHL=L4DFWAzX7X>*VVQjtPF0Y(Xk_#!jkmgZ zpGje7{IF2Wj+FJv@rI(iIWOXEQS2W|4`^^@V0_jB@7_!5{5yDgI0qZtak61g@N z=G#4%`;K6z$KI`y*mvJcUeU`aUJNHTGf{8m~q+^SFna&Nn7^r3JF)9U&su6^3u=&fD<(4xSP?QVpF*(TUg{ zW$1y)wS-ImJ8WxW87HG0hgWX`|FknTOfL2U0+P~^70~3@-oMDBl0c>sPJ=~fKP7(< zirXFnQ#*EBj`4Gf!KR5_=m7+Lk@9TEj6YhU4Bl44<%n{o@GE1hL$hfg=P3m$s%EQl zz(25t6P(xdx4IUZiC+RdB3lGS!51x|N55qC2dFbW27`0uV04cGseKhtTPzgnGg+;r zQj6rV?lf8+A-j2&%g1{DzngEuk4kn<@|ra}T1)G!_@xw9MNFpXvnBCRjbfTmHp_R- zn)>S{XJbMPL6qo7zMQ5hQtTR}eYZH#-pnu5pp6zlBzY8ynfg=_|M1ERg>}AoWi*O@ zJc|Enw{a1OJ2*(}|7kpsKZaMB&kl~?QdbPykYD^4l8lM;KS;9vj(;MuZWXD)2^%8L z26BhP3c4dOI{IhA{tLBY-$+^Z{{A*6++Fwz#&-ESaWoti31COtvV71oqC>-zUHfBZrJeuc*929E$in z%$FItCXQZYlUbb|qB0o(@UQY76R^^FVyko@ux;VcfT@;Y^;_XoeE3(=O38R_nN%Np`0mE3-^P8P69ooUAP=ETEq1YIJVm>p6r zc`1Jx%M6V>|MHb<8^@>5yubZ4YR9w-0sb~?v6<8MgjX<)HNc~t1^JCxY3{RM(+VQp zBl{bamZD#akr%_V4&-{`4NupR9A0_Zu)&^tOu_S7R;C_&Aef5Fk@b z%0!Cj(G1joBA+zlkunj)w1t0q!B>EkgV0_EU{DU6w1$=*v;%`ZS~Q0!I%KDjnfAn| zoQVL8t*o=2D^28kYV&d^p$8kjkIZk>VV~ICncVzd&|<*9QP2W9{rMMV+C2UskCvgX zNo1v-Ym;yIwx!@P3nklL)JlHuEXzrA)0v*!*~R>um+G-bEOr|*hv%{o+Pd$0K8L3( zX)DqdsohzjJy1XQLpbmc1s5koLq{E^Oc8`7W zqB3{Lk~WCYITSP_2Ejx(eYNu={Ruxj=*Ve|TM;!(1}{y_gO%N5K2L^$8%u=%k(t9? z=QVQKGZ1~`6ZeOE8OO^*ot`N-Sp{*XJ_`;&x z#FOARWy2*~NaANG z&qVA$Ll2nW82?U!C;~*rKghj)roy zuavvVFy9F*?jjneX#-ihUF-c^ogY2Xtv6F%tQqs{l%soGF!fJ9$zm$Y^%bLN7#M?- zgc6BqhOQ-gFc>3d3KG3wWorUHCtCGMP09y`^znkurrt3bFEZ?_Lq*^UC*^#tOm?>H zpvWM#Fi6Q8hZ+vbf|I$qq({O1*C>p(JaaNhkl5+R(~Z(iKeB$_)!>--m?X4TTWG2{$(vtyu$mC092cf7w7HL+LE9lk*CfP?67CxL&-8$u7 zlw!uKp>`@QorbMKU-|D9GiH&&wvKGgjA=av}C zqJ`SN%-D03InTK?&>k>$q?FzrRM6d*w4DcIz$~M)2gvEsfakpv`aVKojpxGMq@HHL3#$>!mMq zJ!w6j6Naak_b)GsWy9{awDh_yDX@#k80JeI@06?*2wzVXAprlCIX(>)DVl{uSd zwqHIUJ!I66W>te+N(SBl7pm>~VII$)c9s6X(sLfSFO4_%M`r4xJ6_wWo7-T>BC?I% zY01eb?4*ht;61CuR7O_^Fq?@j=Atb#=y42Bxxbk`8DC$kp&^|>)vHLQAh;3P$T0wM z$kirqECap|rVe>v^9p(o?7&#NobQ%b24?a6li7C~k>=p)0BbX`JnD~HcB~#>f*7OZ@RXoxuWRhLLPbiI0k505V zqm{u^O=F*WLSDt?e%-cE7ZzgdJAcy|Fvrio;5&Mk#@6CkV`coxW0v0I2QK2N#*JT1K(XZ&OIm7{NFW$2qF~3DjvY0Jlc?tCp0t!a0n+hhBxNUf>`+M73A*8Xh{0 z688o1AY8OH)~pq+{8v+67(0m`byY13D#Z3{RZ=8val=%RINg ziy~z5y(<^0jv_ozhJ40}rQ32bCLX?ksP`?BhSyOd=cZ*wkh9KfxeVORX(x7kw==B^ zZi>%hAYiNJI$6GIK(wl1gcIGf@}R-qDj4^(lJQP8gmA`K5FrYBTr2I)GYQzUM2=yB zYcSnJYk^D3@pl6=+=OQYmC>T0mRP0n0^tuzW^w*Cx`Er>v3OyFhMVZbziKB7Q2|RT zqhJEZAYD}u1~5Sj)?|t{q=uT^8;lL4>yeBLzeXP->EqQ~MoNNV6g;x-CFl*`P! zO;BvSN_ZMmo2V$Ag1p|Bi^$t}OpLYF z9}m0<2eA=26+ak{ZxlpQ50i1W~WUF$Edj* zr0kRf!!oj!Mks($PG%g@1w1pOTFn)*0M>GtE+UUNc5kMmX?Wz8Metj5_=-IisBOeZ zCCA?0l5W@{TOU3Y#y|n-&x`&BqsEkch8th!InnY)PX#%3*iVJL^0(GUvnP?f@{Xlo z4pqzJ1?IlTqJorD>H^#@yp!$U$_(li;jV};4%;4&AUabd6Jw7a&w7IqTg2{`a0}KzVa?wTDAH=5 z*}8YP#ghx479U$j+oj8gM>sI>kbnhoF2X2`>HH%v^7ix7CBzk>6)}$;Xv#ds9d73IT9erAP1@bWCR*#k#oDpriaAm|}Nt{9g zpFa_($b@-Fs$Ae8Rh;a*%}1(1u{0jzb5w~`?{vJ-)fl-#wwX+t#IUVw+J*CP$5Vx( zdAJ1JH}V-hM7n}U{<9Kmtt1-FS1$>(FZ4=y-*#>Hr{t9Dgxvjwy8T64A>3lzCZ{JW z2kEBIENADbIHJwPuIwEIk<&`~%@jqWv%#UnWBsYktj|HA84{_qc2=Kn?nq)G)A3x0 zWqN5Ky;F6a%DNH{b#r79G?1YK+7m8!G=kTkY6Uu06$p4XFUFE@7VUg=8(sEppzmeW zD>c=p-hIYeB^w@aWrjjet+OlcTNaL3W)rf>=ji;(YOMwnl$RUp+_s&(^UT?rROG~| z3eeidukJ12_S$j?B~zK}H;paA@587xFI+F}dOKTwES)NaIK>xDJL`C8emJ zh8PcQ)s;-S-!7eBYA67sf+6iYxuRMeRB z9(n`MtEbGkUK@!u0amw-NFuB>%V-CCH#|9-3);CFC8S6WFJ>~lm*>Za((9nPQJFs0 zv)vi&U>eN^WAv%)V2ne$Y8VbM3s-;-#WahqFwQD!3RBauIi5Z`6+Ry)hskpESSSv1 zKpSsN6vhSm$+uDAZu809jac%Ikn118$R4jOtc6b|N?N7u_`;iXtcA)m`iwd@2mW)g zG-6g=hvV<1;2tA(+dFVP)>4JTsxvhnxFuDvT3dB)0bj1PW>LKYkdg`vHc z%Os8sP&m{{&=}Gvn@Rl15IN9KYE?}_r7zhSv7eIZv~fT;J1}iZWq)QN-AwXyxal+> z9osKIQ=D9@@}G)0Fjv}5!QIF^RIX7c&yPyGoz`bby_NfYSa49E#7@QtZgh}4hMkx+ zk{VFo7|2dmfy|&%b8)`LAYtloUkk@VzaZ7|{Oy6Y zwqL^90YMTd??h$Yi)vfgfx1HOJI~GQ>!pZ5PFA{ynnqhn(|$E8S_AF|hOl!?_#&ws zk2XQOZqrK=6_L&`gDC95U%h+65VEXDN($Gau#V~ka0kZGwJ`?PhB3bcc3TE;8D^vA zYQIs}y?5mHh_~OiPhxz&&e@2 zD@X>M9Ci1vle4P9o1k_KqKy94E0>>N-P|r$cFM@mgyJjDURXaY@AzO|J2}A{A05Z- z_x|)Hr{j&yjxz4z?CRSu7_eP>rMXo1+~90VYKh73(}8&8<$C%(##|VInf2P`HfIK~e0TEt`2vSJl z+DN&;Txs6%jiYf#A|w@nebyE$Y)>syYrp?pO7E) zBV#Je;A~nsGV5s3k%e7RX%O>_l>U9#$qyOx1!b2H{ZD7u)MS5m80J@91dmSpt~F$?iy=*z|`bu%K$xmbpr@I+I5C zHXu(SGw9<>eI8WvKb4X`##as!>6^!6a~+{l5T7Ih?5BE!S^XcGxF&H@Z3+iC(rtDk zM|5r>$a?p?`k4<9s&xa6>;r~-Y;h5tW?ZA1VpT2&v*b=e;u?W%r<~iz+Vq!|I*@tL znxm-cg#j_$OXxArn4t|EIZzI)5+44ie@$i2q7vvbHlIa@G3)G*ou)!88Lr6%DB(*G zD-s=R*eV9u{@_*wT}5W32^tG4Uus95ryat-1X=&3bfidQ)VYJ7@I3x8egdVsPZ#C; z@*NQAk9EtZ%6o0TaI_dmYMbb5j_E2m?YiGMlNMO#C%eMx1Zg7@vCt?jN}y~`w}DsY zGT)dRD{p1$Q1=*@Hg`x^New`EfH#1>K}iiD1E~zLC24NfLRFfr^%5=5`|jjyWGSi` zG}d%lIn|k|qpo-FJ=uhZR+q~&OdXCqLULlorGmsMSMH8UNTB(g<~I&y48)M*j#{P>i0r3Hy&szR*Usu<%x`r z2ihhuDC&1D_cMuZFgHnH5dE$qJ4YvgzLc(eM&VeX19|d6e!4zZ?pVAIsjOR@N3R-% z)gn@mUq;vf$vq;O8$<;ZYM0Ubw9C-j*~NqLoY}MItn#sXu>9;C%nEpU{v%!-6Wf9B zh_F7}nz`63SNhd(^9oCWl~;+~O!d>Kg_|Ud#|T?zp2UFPlnNpWG_UR_6KY^&9y+vu z0sqsy2K<718zf_xnU-^4`>nk}C6tS?lIhqm6OO^ya3p&gJ*h%6{ehtq@mAKKz4%_i z4AQ|Lald*~1Tf(U@=B1X*}?aGcBAFmg@i1 zedAi^4;awadzE?YqUkeky<(RnRTZY6pplq zC3UBa&R!#)28%6#e;lP+n^}Ow!q}h4+oE-Los}b3^hL?R4Qs&%XLE%nr#2miX{@Na zZ2ASpLH9w`N%T_;18!Tur<-x~TZ|vkk^9MYYcqS8qtphiMpP}B;TSQZgS&Ft{i@c? z$&ASwgZ2?<^vMV#_Ja)hWq`v6I0r_7WZ2a_)5;tQHqC**dGBUYMbDJ$DVLUIJ(#Yv<>NXl(2W^YZ$A{{0^#`z?VC!Bq*wQFAKLA zs(SZSg)$%{g*l7w-DBJI+WD|`6-Flm@@R3k9V-o7-+TXu(BJcR{raM7@qttT36|fnSbrYF4;HGeZ+&X`OV4DuNo$9W$+LXF(DZO zP2(QEfJLU6@v2s9IyOBA-O#*ols%nu;T4sO;vhg$oir@r~@@K z+x`D>O`9#FV*lluk{^quz(@RJn9iS!+9;YZf*~%~4_n(IKYJ z1}%2-LPrX1d$$wq1o@jwunEsfid1eD=@n{S1L-JFDzJQ(RnkAC_MGd9^74cUQ;H2d z+$f)E^?FK_`OY(9W7Xnv-ITS1-yDmLpwo8yQEpaer)2%bvW0@YT($G1!`$5(sh#Q= z_@!L@%yNolQLr>os+}!`yG4>51c~|7743RUfy5)s`J6)xD1WZ{Spr>=2KCh1U;Y-? zTvqfv9GW0v+@P8SKtO@a&5Bi;5?4I`E)DaT3Mk$9kQVlKi)-8*em-}LNq|rJE8qqk zoTW4E0u0u0Z@O%1yTEfqQVh>R!igniHzy9U1s+e}%7d#;jZSVBD;CRFlF75&U z*>DB<4y1z&j~OY-=18^p%xyw`BK5Ph6~(p5rpPf=wf#-}=OEWVH7=0SvwtCvq{@81 zwTK0VrQtsPrrBM=J7Q)-aA$`Tfc`6EEj8(IMMG0I! z0_3kM={paA;@229v>Q}j+IsGWbZhI6W~-@0pY})0X%m4~(SF11q_9BNup>a^vcmW# z-ER9=*~U|X+9~YNyF?+1#Skt#GbcD`8TXI{pPE*9F*kf4keV+1AvuYf5A$HA5oT>k7KII@L9Zr050oCj^`CthXxq}A`HZa zKrTASoVLuB+wH=BV-NSyWYK+9!?PN5el*-Z9TUb{T&?k}0}ogdW{hal8QO+0X;75% z|1Ph2%&D^qN`>hijvzfT6PT;`PrJFeYLgP1;qG;A4^T1Kxk|+PStR?D&t)J&B<(pm z76iz!YwTa0X4V!nK&Sa9Kh=*97qmRQEjsNEr~KckAmNH)QM&J3z0JB`D^z!p3R3=| zsTwSXx-Qm-xdX$2%P=G!--2(X_{53J;3B@E=|(WY*UlDLAM0X)(e>s-F>?Yir8F6$ zSzV#i=?!0;(ii)lC^C58G=_zLfl5)!he2EMhrQs92a}c=8_&hIspuEO8@}gh^GYt3 zGypKADBr6ZZFqiMr}C&(+iPeU3iegc0G~Og{L1BOI>W#!;cQpKr#s&g#T~&K+NVNKy=_;Ke&1Au z7xI`m;O`(S!!Be(C##r1@qJPxqcg9R`L>*PREx?PF2MoOn35VYo6xF7jshW1(lQF` zwkPyID^)2@sIZ_m&)JdxAWYS96SF)42vbbynp_BX_%DR1)Os!ii+nf((D%cWIyvVk zb&MH*jf=0&Gq4b#^V}!+Pv^N@F*G)NsntD-7f^a0?L#&Z&mqukFE>83O*S+gkj~WC z0f)hFufQHpv@W>e`kDHCARqKQ5g6(cT)rGAi3EsWtrr|r?I1#|#Byps;17@8a+%?X z-yuKQaS7A1Z=8z`F;_h2M;QB`cZA7G3(+>^eDd$VaW{b zehq7A&zP9aX?}}S4(*`9gLjULg%bY;&#<3cN(SP4+;l0c^%gUI6eSQ;GXdh8uI_xz zOq1$<4f5+KAF4wuJ2T?Rd+>S;5Bka#=$qr*Q&ph`pq7sh;!?v1?8ZMb$S805|G}ZE zr~e+Rf?+NX%=o{Ds^I4VLseZb+N|QVtm>sc{|r^d0fwrAGroqZto}VzER;jt+;kX5jTeBFb_@b-$X7e~Ai3 z3GZZJ+nNQ2WC;w#O{W7rU_*bseKtHck6K|3Z<_MFQW&T0QnyohHfdwiRv`%|W2<0m z5L0|y@|4K5^682ReE&}MO~P0vtK0$ZP{CU7vD%(^vO{;n7b7;Fysk-7g@T|B{7(%y zBR4lA_c~(@U)UurgQFl+uCRt5o=#e=bTebPg+;t`904=&Ek9 zd!WlHF+25+P~1z8s&jr!%|J@PR^W0<8WXWNK0YQFU)A}r!8xoz&bg)UUvC+DD;pzQ zdwX;5+69`auUVhxT_g@gvxc@6vq$tl-JLH&DjNLW+;p0+R-z80CBCOG9{GK}t70Rb z5K963j(b?KV6jTMG56$o3u}{!#sm>?do2a6khD8mF3c(vk%SU`6IixXpFqf~CiFc# z!M_|^T46VLVKU04GNQ$8D#>N+q4YACOkCuqGr0FOdahi+@O)p-ca#w`L?;irJp}iLFgE=JJ>w)Q& zJh$78g$kJzUL}N=Dx$_6>0#qaM3Cto*N70u6g8SUP*e&$j6lVNI}6T zM9Yn<0zoO#cGqq9Zc;1I%;N}3|IQY5;1OUJXHoq?MDRko!l!bCN_Z#3%F249m zGgsIoQgFlFF?*X=v^G51njgDw$k!yig+A~&O#pBr;f`%^XYLubrQu8;DFL-7BS8Sz zgzZ_vb`aVg>$J?+tFbl}A;;Ek{(!PY=)Fjr#p0xc6-KhAozaZm-Nkwi0l3huxPvA< zDC2E?CPj=ey;-*n`+f)mWM? z!Vzrk=NYD;u6NK*5``@yX$G{nCeg2<6ja?Gv8N&*m0-8ojo?~>zsKFLi53*KTa;NS zcAGIAN)*AEJ7S`BlNG)(&u`=rkA`mQ^)`{_BxGNs?$x^L@e zMTL|O((UqO@v^;qo{&L{CzZZrT>B5ZYz+_nYYnngbS-tE5@;$e@}W@Xv{r^yd$2 zhnsg2RL9_-spo1=1dQ2ol(R8j6j`Q8A-*t6Gp-U83)#TzhoTXY~s4u!qSrJu%n;$bmLrZBRMfK;;BrRb5ilA+FREI2J;X zEs%D3aXeDO1%VV20%;ksP5I{MvormBz4>}_B*3@z&b=w1nE^jHd1Ecun*|`B{3o<^ z1}Lg2#VMQ^zRlgIAy>8{abKNr008BHBj5eme!%Tq9bx zL0h^t*)!B8z!5jlP9C%$Z2;lA?j z76}4@V|}xC5DQ^UtT;~MkexJ9S>+bi86a(BtXp65moy#MEVJX+W!+t{=G3i<9@T{L zZ+dg^t3m1_vpCSMQYfOYi|I+SUkr(4DPcl=<%gv#bJLfQowG*`PXhkKS>MUVrgt#j>o`QwDzHI z(w3mlUHGCVLU9snAUPMgfo_5?9%kHN{Cfu?`s>r#)6*}aADuF0Pv2v6{IZY`@}iSy ziGHi=AWZ8?u21t7IfM42yAA@oYwFUn-f21T)7`vb?$VM!Kx20lSRZ+|e{x5c3`i|9 zUdZbbmF;^vc%>cq^X>O6yYDED_{E7(S$N*$)5U&QwY;e$gOnkt`_+*A>!Me8ZzdU6 zYvy;jZyf*ri~9P8a`JkY;(aZoGM)`Oq0v2;xg>8c#4Jxd`%X|C5#*K>QPM)uK;QWX+q2_s3h`(Gcj5kwuOjAO764>@hA(LSPd@D)llMfd08W*0@}S zLY4lNCph0s zB!=+9dX@tbAbu)6-!3N`hz8W^Jn?2=dh!ueOJf6d@40%r4)7iQNF8GoNcn}vxUoQ% zs$SXI>=+D`{}`eH2u|i?WyHdLyA-wIU_j2T^H!FYecwca$(qJs!4Nq|QD<{$pfdCQ z{M6KFQvd*`0ewqE+1_J<*^po0XnTSEQa{E;NWFhpapc$YWtfEkQ`M)tN9BI$72q!K^SQ|)6dpl1N6=WSdviCvvIii!#|mUKpR@uH&!AIL=|Y+*FqlMBE*!Bu}FD)#R^y5ji0 zXR^~{6N*!bI(uFfi@v9SwqF$;hpUggQ*BcY#cI2$*) zZ+j@(Ru+w1{`pk_ORhhEHS7mJrPB~ofHNil26>l7s%%fWAWEyAdw(Bh2j6M3{R9%M zVaHWJSsMgyEtD?~R-^=srX1+`H|G<`tEQiltkhL-7(`SF<<67ZCA;C!1)f#f^E3oU z#eXTCy_w+Oz2Ac#;}gsIi-dlXQ9kAVM5+tbjQBwV801X|J(ox(yvii$9lh5TRt8+0 z>#Pw>`mg1@b$?ot-_D{DeS_*->n>ZNd@%1Q5E*C_WtF#E&T|QfYbs6HlUu(LRFS)( z0c4I=oH>Brvb>Yq^$X(L>?%>3$kS!PH0LN{*H`TK{%prf)8T#xAaiaoJFG4;PoKPd z2B;vJTrP5-x3$oPEC4+k0Nijs*a}(k?6{oal3g zt|;lYq3$BYHknqxonDtxeSu$v`>`R*p?fpGz^^2KI3I_?)PEYJe1Tt4?zYP1{QN1BlSK3&0%j=1%6ma=FJJ z%i$S}LCRS^t4&s8&=Wy~-`ayocZzf#5PEbfTbJT7Woxr*CC#mT_2pT$3Vr2SM=4mp z4mn(wh{g7W(`?lt=pTE3YZ(Vxm@PLiil0=ICQ&}`$d!uCJgiZMt9LzbSK4H!k}N9e zEl#9%Io~)yA1@4#1uV#o^zv!krYW#Qqd9Oklwu?4kWRNUqqPRHNyYHcK=Gy-Buf3_ z!}{o8!k8Y1K{Ip?W_YnjJ|G)(bQ&B@ZVG&$Oi1!^DkyCRsUkY%uVkDT^)NyY1kG*; zi4)PVP_3*y`P*38L=Ll_w!M5<+h7Q*UV!%46!T)2qjYoQYRkY&IXlF{Tb@0^(#r&H zp2Gb%YjojSQ7(yzJ?fXxW_47G)^9w(oqbeOQn-8aJM`?t{L^uHOQE=!7u3B+W{rA{ zQMIeW?(H~dhn@CR-`&JegUs*==6-`A0;p*u!hG;;;z2vyp#yfHwqJoeD-&)#O|CID z`DN<)w6wEaeCfv5Eq%E%ab0CL7mRI&k-9Zbl<8=)nX*>PhCE73v}a6uC8`qEXmLk$ zbP@!nMO)rFId$uU7YnrEXn95V(8-xkul@s=D6Sk7X~7@fjYxt7S+9rZ`CE@gbLsrK zEf|}@<>}k31rPYDL+QV-@bseaZkjs^?`VlX9vLzX4g|cVW$_tiWa#sMP!5VW0Yjja zr4T$UGGb+^*B+?UZ@hYzID=aJXj)x`i-!}xHn2ewA@rCV2vCg%_~`4LT5bGVFC_eS z@>j#FGI;q>SmEvs>t)mvZ9yw9+0jH}qCx0tZkJY<4sG8v04S2@CvbXf6-gt}<_7#r zrOP~BKe@Q2^T8Q@a}&C94OR;}_4GHZs=?w6+_Y9zEr*u14tta&GN>+~NoceE3U0f2 zqL&-?V>F-p1jlDqz<#f`DW=S(YbuKHOZbs;-VTR23t+%^+eksP!`cfs0Za_agw1`u zSLg4p0WE}KMdZz=By;}u9m z-qB|9uFdp+GKb@Z4;m^*KJ+I{xi+i^dR+H80du}R8@TyCaBvUHn;X75kM8dqy4^0m zFCMS&0X@1gjS6#EfPpt1&j5G0pP#G|nM~wB`xH4rYz`@e10)H-hje=GVjo^apTRzE zx7T|&c!wpSEuZ-B0Y|A~Z76s)A&h6BMvHp8*$2O(8_!^mfMjih4RRv2IPD zVKFP*?gWaP2%j)f00He$SH!l<`c@mIdjGQ3rV!zZvhc(eT{paft zP1ze0W+@CYk16CpkMN(k{pus93*{t6Ys>~F)QQ|OHI4kshVTWP0w*TzS;pIIqsi%= zC15%Angez}BZ1$F?owx9pqZJFexzA|1@m0GKD>{XkdZNy!DdTl5YA%;;5fBQgOvxu z+>dfPu+wxR#G2WFK=HtPCt-2LnH_kKLyd&>m z39W3c);^ihv%pBm)`W$`W;y2o7AqvHSB>ufAI{z}IPym8;*IT0Y}>YGf{AV0P9`=c zww+9piEZ1qZQHp$^PKbI)LXZ1-Ot@0{?%38y?%SIwf5Cr|MhG)*0bzNqAX-lo5@f# zBTM!bb0K}kjrbGKT zVrZt{{yKJTHou%g)ev_NPEwu95SCQaW{H`5AQ6|)$~!*>p1ZZ^WlaIx_5CW*F;qpC zk`V;B>l>+*5fX$}9SI3t%Qo2@01M)Zd;5Iz8Yp(cJUh(u3{>UlW5*X*Ckh-eX#9yq50vM3NaQDG}z>>Y2~+?tj!G}B`7&);Jq`LE;j<0ci5ifLfIci-@I(${kk zkB>2&5P3CPpKAkKYRhG9K->){oI-ZyE~FODYB~Y_`{a|^4IoY@oDl*hm-9<*q}*ia zFE2padJjm3fFZC0?G-yAe62D1q8ykzkqPmXO8k05GXM@a~3MOUjG3E*8%__K#>9fA>)4m zLPb3Q5cFcB6($>%TZJIQ@ijO_c{B#&6dZ}J6nqgv$i9i6(o90YV~f(Q2C4iGgJO>P zatn$E(D-6toVLIhmF}M851W$>Pxs*H+Chn`a&q&v*_m$obwgL+4-WaW92j8Kh!YE_ zMG6QJtPb^_^NZ&6P@?!uG_PL^jox?zBy-Tnx+O>tQZ1qP>ET4_t@r!LB1?xBjD4{X zG7V=Dcur`N8$*j9w@5n2yy=5|B!D=cO23|45eY{$-#xN-w)s0V-yRK1W<*v!eQ-lV zh_CA`x76q9P3x3>)0uy15DfxWeth`iF@z0xtwYYDEUgDfl)orVAi%Hhjm^-VQf5+{ z%1lpBg}f&Y2tuzp*DkIv-mYcnj(=y%9~XUmF1?(@4c=N#Nu7PXE(#d^Kt8ggzaej` zCINz(xhC~;<iqOwNvP{Fu~OUpLuD(GNDh?0aVOg3=X za0&Oj7=kj|lo3(=KLkfF>B~m&OQ(f$(3XRxthI7Mgi0vTYD}>G18aAjmC>74Iy6=gLP}tesqr+FPb(OJ@0x&R~%JWTba#love$x%>9LNlVxh0 zE9*qOPktV43iVRw^>C_=i5C+Vt{l>j*KarLgNXT=HMMIk^2QYDSJwC1 z&p|HKvNbBDZSQk5Z_DIg@I9uyN_kM}TbF*fM3%PP?vBQ1yM#?RoQk4pFMHaS9xN>` zQ*jMz7%rrdKZ~mD9ywlkEtCZO>U4#%xrMpdHESd`ZFR1FiDcW*EakYdc3F|GSy-|V z$4HmA34h(Rn97OE<{58r8-F;Jsb02OFEh|w`&RkhqG%abKQNZi@Epk*UIn@SIyUD! zO7C)Fy?b(gv-4zhNNLdOoDWlB)zPSIe|E~tOs48Q2+&$H^Qlfw7a9L(E%P|ipezJl zzL(PMg3-=gp~}zpLgzac=sERQv}qgRb4Jy3bm}&%u<*t5NyC{Y@ohMySHDuts-fscED6-RWjU8ZyKSbl4h$hIGLS(978<^~O; zj?jzzd+lDBXGv7jFC9zW-V09XBr(|$1|FlV8^BE0t?tw4^a$){_O5^7Og{hP*^*Js zkY|#|obDLbcmzz_#UGKi{lRbGgZQ+$p%?v0_nG^#;r*${xP)^D5z2^&__CSv{`y7h zO>?in9Eno(nYJ&r6_<)Vm6f+BLFA9Py103-_wBcA511S5-pJa0MSN+0$9PS=?DVE|eRovf+#`P>IoN+)v=$kKn>dxtfVn38O_VcR|71XoR?(mcYyh| z^_O8^CcxAe0V3RB#(NnBv@Sb{iYbvfn{O|S@c9tLbaa9@f=6`^3mA~LXKKrNr4Qb8 z4mhnaLpE*nLM;c1_Rf&`dAC66cxL=DX1`fQ!~Yh8=>Db-KTA7<|9yWe%jjoFmC8-a z{9Hl=j|pvCP}=hp&A2BsmXSLu(S7Z@Os(C8vE=xPO0WoEbNj;bM}zUUl%@KPq!DW{ zElLS_1wWqIeNw@EFaH^EIKwSfFRCX7=rFJ(AzDa6i#i{#m;IZQo#;nAi*HeYq7KWRSPIfa^-jh$FdxV7B3){D_wkcFJu9>adU8;b zRQ|w!i!i0o!headdC)&1>}0631i#f7CM#`>42*c2!6u*HIuEb&-? z2=ms(SGV3Y`pR>HP5oemb;FXOqKavSj5M|dnT{}RCk#7$1-Fk@Hv~skR)N*x_{zjX zMn8RV7y98=FOLm4OCy^{s%x}_(y`d%=bJ3LFxlG^wlokBxSV#k+zsxRo*76+ckk6> zn4i{MpXmv-!}`=Znc!CT4D zZ}EE<8#iegZ<8Y$RS`(nGcX2+#KS81!&@o`LVlIn$4>u-QUio5pkUv+Onw^;R-1`u zvrdN$`ke;%7sss%K->O!JuTqF z#MMgtB7sH?mO+bOJnQ6I4NQo!U1TpI zzj0hOInKY(mfWbR7?A9n1;K!pT*Oc{$g%;71xU_nV`VDrZzKt~mOu)t)1W~y%`Gj+ zz~D#^F0p1soZK7ig+M`TYYK><^?;IK-zg+`p^L($F1rBv48t8O%QxuM4ql!4Kw2 zBkoDdDhGG;jz}=4{R688t}4a9KQSC}*?Ds$VK4*l>A1UXomSC<^oHbzUoMi2jfIeI zs#velSZ4o>It5BW_CmvYj+R6~>MZwqN+Kq)@xU}<`_|_M(5R6L#`;)fmr?ZeC70z0X$c-S9l{$L=Ki^Nt~6&4i^#GDCTrAklHB^CMd zdfTAqV-~%z>!)kMZi+e|h}P57@!3W-C%-YJ68xjMpwqNfziFl-!YzH5Z!X(UL{4ky z9H|F!maV`$$ZCjbl7`h+=40WYQl5O-htO!Az;l6CaFd5%`IvUX30jW@fbv zvi^f>1fwJR)>F7nIgUu`%awnHOI$j%=ooJDkG(b`Yx4p~yx5Rrj&|W>7TRo4Y__~y zaPtR3?45QasJ@w6Ez0fYwC9F|W5l0>6yK@F4N(2 z(hUP&RuCYLk~i}5t9!e>_6zW5is`1N6?pE{0=@~GBK~n`UG>SA3W-*X%EOh_Fd%J` zG7cfr^#INIwLx>0QT%SCRx>(tukbLM#(eleNsp_?PCD+Ag=25>m|RK!dGA#vXdJ|h z(1qH*2!$Z>JMHSZwX%U*m|hV|r!bi}!2tjnhd1~@%BR%+>ui?Y$&-In>OFgqSyQ3NIFtPoT3dj&1ub)FWw?2*+g`Peo6G~UYF zcj?okmC-Yc`;{YX6};z><{pvc+;S<0#m`-T=KhDayuGYX*P=*p%S3j1St#4DILVVO zy4F@eNy$9cZFJUJ*or*Xa56aAY-!Cr))BtuyIu`j@5Zd}7RqDzPSF-ig6`w0VJOa6t}*>~9jfdpVm zR~$I_gX3Zwhk6%Xy1y=h@8JA0lLS8B z?;N*f-&*01d1*a4B6@eQJWkrVxp{m~Z8sx#ac~D^hZwb{YPF3uQN`ZAGsJT;v@H#q z#gRFB$;pt1de4)p)>_?E8FI0g2DxOn=dgkwp^mf;UD7rWckV(S_DvjPb2umhLH4OZ zNsN*8hVy+(F(Xm%4(_6aG2xO*R#Z=W1$R-@MKPu z5XE}d!AuM>Ma@+6&C2>L=sdn46p3o{Z@8}3%~S6}U)mH}VXcxoc;{L*`yqZ7sLW5E zJD)#limlW0n5j=W-W7=aE}XQCz%SmnolhH#55po+Sz?~KHp4(_r_n`;ybC&a`sOCw zqMAmIbu3ePvA~9(V_ar?W__U8?9s20v}5yOSM&_}F6zYSgXC-{@PgUp*G8TmYcFv+ zy(_}XUg!^zfXXbzV#_7d!P;18kO4MYh*BrDpyi7Wt%7D==NoD8gFX%FxxS@oR)JNr zT(l_*DUv{vW-zh2E(RsAQ_n|U&xF)IK)kVsyk}1Rd8@Fn0H!=HD8cNlBye+$SsZv} zse!Y7Vc6&>ruCe$tpQ7BQry>j;my$@4PV5{)S+!?!wNO%f`jQqsnCdPWz%% zNZVn&aI`bsI&@eAD+Ddo zx!6sgN0jmoh<1mYskqHl3~fBq)=Yv_HGzyU?hsXh7H?z41&&yfLNsJq{;y^Y@qKxU z7I0aZ1Xvi0?$1SBOWABi=^g?;)5ys3snSRg{6{)*s1;7Cw|*&jnSO~ z#%wd*$Bw%-+SaL)U9MRsY@j%^`JQx{V`RS!a4e#j;Pa%OqRi#B+B~^CH5xOH)Gc=|qFZl&R83$kTQBlGxnwQ`6FerZ zS95hzwQW`z8+XDTt{<7)Z`PzX%J^()k`~WNM)LW4gJ{+#&AK!FR<5wTv%uEbRr72{ za2NY+BuvYAMA=`f=`9$?Z~5hB*f@67qLZ72D}VRBNpU0j*}VI$y#J!g^d zOr`8YQMGI&x^19jeogZRoMzvsMY9>C(P2NW!nusFnC?YcQk!5FzcMgY@@9MuieCis!W~hASIDZ9ZlqE zr(R)uls5=#a)tEEFjB@c>aSxti~DL5skL<_4~}_uSZlqK@yL$#FRK&lV_!67l5q}K zYRa1rmK`R`GE89!t+)jbmrp%AKKFjQ_{ddAFPi)=GD>>6Ei7Dpk-Tsl@xu98QsokV z`8hY-`0;Bo&G(YM!xd+<9G3lTw-EftnLC&?-mBmhVc^$5;dXC*>i@9&#hT6vXqHqWMG*-61vuGCSA@`}k zSwg#}li4E4bB|B9C36WLsP&kw`1l?IZ)D%JV!Yg(u@i-gMt1X8KCL0vWISO8EqLgB zNRW%kXZiRCfj{G8J8e#Wq&_nL@*14}%uISuFx*Q`xz$*PkKN&%tOVxTgO^dlTNp=L zxDXG{Ter2{vI#*ect=O;ZYWi^T5mrn~3_0@HChvboQ zwNb?CZ}YUieg>w@0nDi!O(bLjw-ZJisbe)%Ky0Z5p5UIQ%$HIJ12`_^jv~34!)+|7 z(%~!_5kGEe=qC0THAin^AFb(Ht8jn-TVqO*W+fN;T~+Uv%Pz-{n3HTiI{d+ zN7Etf{*QP#b$S-t?)_m`zWd`5)3XTW+Peugv@+#^6D(cR)q-jb{+o|TWgZvMt_d}8 z<1*}ScB_GtR8Ia57M0J{$oX2HZzxMxr96htre!C_E(0aCfcIHZ0I>9BZ^iYu5Zqft=(_d4^wa}jQUGQtP-VW*68MzxP04c(ApxN!Zy z=WNVnaXna3I*nHtH&0998e%hDU-OL=)_&{_s@H@DI1D{RaUXGp$%%#xWwaRWo~3!h z-JP{3W0=Lp`E&m0x2yMHSZVJ)TyZ6C+B7h@nPxU?vjWOO-BUCer~QwW=6_7vCLS~S z!d`g{T-iFK+Y3<1X*TVIU}sG8SS62u`R36h57^FbDpbAIWlfu|c;-=^ciH2p4RI1GmSg2l0Zuo9BtQAN)6Kz-S#_HKxO&R+clhx^)@+v!$*}< z|LHb7%DyoKX1_jbXIK|n%hMLU0QlL}D+=_)XySTc_Bm)uG;6K#gKI|Li*{tlxFVk^ z;9nc1+*vOB)^4+2Lxzo*TWnv54!CE`ew7x{ko{Hs-KuexHp63Cfn{tyMKNhM1Yajt zA9ssEiUS*>9Xsrihk?iI>ld2}b<~%ziP}rV?7SSMA02yggxnZ`1zlq#=v%|5ZXan4q@pzkfY5Zu#dvA!9g?v4y(lZXU* z&7JLSn?hN=J<`a+Svgh{G{%z2R+OGq1v*R_OymToAUU+5|=ELYjh&U;3EMlDat zR3hq%jg9+*bhx0Dlb_-bPRAZZTDyioYlGQ22rjv-q-BV4j(w>0HQ%hj9cDa{nByoE`EGI2a&y$ zv`L*msyPy!&*_1*fp9F9e)J13`cE)37VsbrvodjZt2d(rIiBV;mtZ34r_gLo{y0YJ z=?(_oz`YfUytmL1?Pz17BU!8>gejLU<85#;oN%PoqPz;HO`xuB^9LQ*(g0~par(2? z-LX7>q-VFfnxZ>Fc9tH+G;tKHWXS=VaQuZZLL)b|u>~cY7*;OlCrDO8mBmeGih%?1 zq|2~zDp&c4d`(mBk#W_3@QvTC z?}kjU|1Odxh7{DP)KQNEaR4!DGAbHzGm#2wg(N`^i)EL z3Q~fwn*C-tT-f_!mTV?04k-u)mfvz1ut=6*wdR^7iz$U7WeTO!Tu~{-*%+xI1Y^-^ zkMygZ@B>P*PQQwOd=U-f3`d*`eo@%sTznw<0-T3M)_pxMKTUXaNyhZYt}>#*g2b3b3?<)v|oxGox?24CMO?CrQQHn_NnCx z3(=T*yk~_;OkXPMQXUkC)uLWtDeDMzug^!zLl+T8f`J#EJqc)iT-owsnqid&r!a=p?5Bb1m9fqS(^ih^26b;vT~PSG&b zOpK%95PGh<_cR=$!yNrQoU|i6KoW3sI-o?PU;QEHtN58RqcS(~%fAX=I_3~drZ%vU zS=_0B8w+KvWioS%1796Ii124mqiUIHMJX*~)&6shvaY_d5G8Tu#H@k3dJChOp6`O8 zOcyj;t{yk8zFu=j(^iR_cq9V&6*xjD-yX(+np$oT@Tim*OJJ-77)1R}hE6UBsHOm$ zrYTT>79U6f>b9VB)4Pb{lWI(T`|^!hWJ7_$t`P7<65Wnvi}>%hEh%EcVq=eb;)+{9 zBKN8B9W7$n3xn2f^$&hfCOlnGj| z^=@#;b^RRn1YaV5wQkuG$rrg3we4dKT4}YyU(NkFkasn9If4fbsJ9ly^qh{wUvsWj zK`t){C@iKUwR=Doy;P?hTSeJmP%sOO-W<$S|2zlshF~fbHaPCrqiuAn7y_YCavZBG zzf{(#2|5WH#FGa|XC4YDzC`bz3R6rJz-wT?K`PGj&hfI3!|(AUO@K@*^}(N#!7Po} zgJFRzpi9)Dh(QIWx?(nWB90rVy}IBgXCwz{X5IYkR@8ytR77J>j6&Q&gYm-Q*!!R z=N-b({+EgLu5WK&y4G8fc}qX}sVSlM@nQ6ov_<=k}RuZ1m&^@!$VsW19z#WuWDJT$ad8GI2=j~dBF z#);?!#^sqNX6EcF-f9Hb73TiV1dltiArjdaZ*#;lS_v2GeRj zKYAW1*82lCOeIeXmAY~N-k*pXs5>B{_UbR?aMt2no3H<8KwMV#)UvSfOxW-+HOMpW zZkU}=dCkLKXZmYx5kO1M!t+g=wX#Bx9q=@oFGJ^48X;^J>gF0EsEtg z3y`YiZ9hLTisw(tmK<)sTV@`C@QWP;)!ocbuuGtL`AepK=)RL`f55}L2VkUq%&0<| ze2eWM9#NpIl8KXUrBnK``~{;@GkdV$IrhJZD#aWCnZ|s#$C20f$NiVQs-6GoU+}4{6(f5>aHH86(^-U$zu$Bgy39coGf&cr ztz3#Vz>&6H!lUTEIf9->H$rf~+e=^XToG6X;}P09Od;Plj#p|3%AjS=CM&zca1_;K zz%_2Xi2|HiXzGk!+64V*=% z1c#wNS+qsZ&jHRx4U(q!M*>{jvyRVzx7D@B#^4_&mxTBBRgH&FAMYF6IS=o;xDSXO zLhT{NzMnUj0&k<~(G zobBo-Z;ob*zytGl9QHH!Jj3n!V*-sPNb$om@43G7ay05e`K^-T4V-w-2Ne9W;g1;l zDwUX;ygvu0{w4llG>H)%fL1^Cv!8dkRKX?%FgX7eWQ&F_F6%2f00ixg{F^S!o0tH$ zQoIeZ)872-YDM7=*tLIbrQfZ}Y7*g^r~3&Gb>wm)je;QTD;YyWYRT_goRc5Sc+CfJ zTjqJQbDk`^rxwR@@ zvRf~Q?Z%%)hU~U`x)8cfv3>K*PmGFLNrzL!ADu5amsONe_Zy{@KTNs}jbMNoBQ9Iy zy~JiS@YZ}kHCNVnwgri5=C8ehY#s}F{^qZ_ z2&LpkNi)lJ*E?xj@q{Nw+7fLWa96{lAmH?5o=r3Ab9g7n6N|$k;rb~WLevL{wS7HQ z>&Z~(6eOJWZ3V>IgjRoa>1p1E@-)fi0Ag)HUfEYo@+LDb6a)~S7r14EB7gXYyKVej zinA+-N2NX(o?EVIU!9O|8-+wLX!I`4J1$X21Y9yvBakM<;tMjZ)k!nvH!HQyf(dx; z7iz>%Bw~~Z&3|#vG%0k$^z;ZQNbB7|<8A}9A5b!d3|zalf{^gJx70lq!g&%IIJuU+ z_AqBzygpE+YX-@wXIKiQj{?w!nhJwjiBL}6 z7pG|d%%B&D!9Q!u7kl_Xsec3%?v)8F-5edrb1Bv2{|CkZ^%kuF^Qb_i!}3804J61GddEB?jD#Ys2Km42j31;;`%&FC{{p-6Ev{ii^m9hLu!#MKqDi9Aw&0Eh#S?$j5DhM zU3w|#mIsT&q-NMX32v;Rh3bY=wKd!-b0h>ZStaLXF71eQ2v;j#t;+rSUBp~m0^}>p zcmLhe{5+wlO-&mR6F%?NdtI_!n$Og1fltO4d!hW4hNvf9O2JkNmgr#mo@JSKSX<8u-EeAT+7||eqm5GNJJ~YCj&7uyuF?lpoiZzy!Hh=%tQi6OGnQz$8 zFfz;6K22}iyP-V5^-+BcdXzNfTOP=17hd9yUEvFQxghZY^AAw3X{R&bSyS!GnP6X7 zAFGjm5dF~N%w^tHB{ask^3Adk{5}2+G>WDz3PI zX1snwt$k18p^Bmmb!HfsG{&jV#ib5rb2HE&nH-B+X?jGm|zsXY+L1 z^48G82%+@HYEBM-fVRfbjJ%_%pa&A8jJ9k4zadGL_^4%65E?aZmHUIX<#!!DIhu)M zG-}4Gd&OF32*#m#5e|e3t3vQ>*yZ`+93n>SYpsi4$E)Xk6J+j z@a||tskUPjrEfrMCIwfC;LL+9SW;DN`>7=tzpI)r) zrpuI7fZ<9Jz(=)c`C*m;1h1zf(zFlniMPYhltShg9D}L{RN(EN7^ImAhDh26S`Ko^ zMWr()K72ejvxuiAqY|=K+o6W>TYsueB>G({ihUeI%+>7Ob0qa*}e=f(V(fK;hw@=_XQaN@pO)u4vnx+L$vjpo%ilx)8q!17kJM zDoQ~3_F-!i3Cq4X?Pncq)$i9QDZ>Y6W~so7cCPuREjIVk1Jf|Hl|j8j!EznwU^b3^ z^(kkDB&12cy_3w-ax}BhD8|`8CRxinIn7$m@Bd&4D^Y4)(wkI&&0- zP04@CFAo1l`9+1_?RCxLEksH7{4O646zCTU@HDqYOt+GhEezbFE`9B_EFRgZtQ6t;##0qoA!OiY3>_73p>qVza^{7 zQ!`KK{OT4Q>>`CR%S}_33?R$V4g7Kbj|1OmUBKMRGkg7+>s{+Ib zc@!?005*}wkq112z08-QL5GO7S|?5|Y0~QMDJ|vMvvtvZmZs?4XT@&uc3qE9O_v7~ z_vw$7ApHG*lyE3{ z1-bk!;g}2(J^zmq4!Zv?;b;#Xi;n-ol1ReFgiRK|Ge9DsRK-+6$MbiOgkva^6*n8; zE(FQvak&q!Q2=~CQ;FH-(z%F#2JmciA#c%n!Jj_t8vg@5w8Q;PyA-!J!R=-n?Kj?^ zUdRa>ugkEx>=3qdZ8Jn9D!jM5=pn8d5GWQ3GAdSTz& zkmq#>!wu3UlCXO(X}ikk%vX8YbP&8Ny}${r2?b5*5)VxJ^|1 zST>gp8BDtsxk$zK^DZ{IT0v}?0?`F@(hqJ+#Y# zlx7}V!P%ftF5aGtC@J!%$3Na|m1js>qGqX2KG)rhO%>IcXNG<`mNCs_&5ApT2z7A7K^LGK zD6e=fmL=*CDu{Hb&{y(sUoSwE!>F6Ar$|w&U8gTiE@FtvMwl4#8EK$DrILbDRzZ9o zkNl}s!k>u zA|)9({Y3f}w}uIA&dLo(B$G!LJ8Eh{0>ENSV#M*;97u}688@dNP;)rUnj&tZ8 zSh|h{lxc%69_InKfI6!oYfTR&QJ`!1M%M4`7vMVAn&pAlHh5i^a{SK@W}IS$%}u3W zCV(1cVj=!7*_`5@u&9>e0icF$2DG8fN4*X9=N0|&rfa2vV zl6$MLD2s@B^-;a2JT@AP2G{E8qmp2hclL`glbCWwrrl)m4Ghdhg?GevPBe2;N>1a! ze^qpV%>gPpd~?g{{Qs+>;~>Za9-W$zOU*jEs~TIY!HsEU1f)pw93xk)=)n|On14lu4X8UObEB(Z z#f>od#qpD3+bQV>yMDhfS_;&DQ{CJo(huuVXV-yp&zPeWc83EDjZf)S}77C0iD$ z|M$jaXQ;@`(9chM81di(h6Yv``RBf7C9O6lE2H2k6UA0wnj9lu6l0Z^u9n?AZ-HnC zh+2UG`(O_Y8iE?%ZVeke3u7_b;T;Sb=F-dWWo}T+y%S`@Oen~b-gAPq-cJ9r^YJ7x z%Q`YN97Gtq1}kLU*>B(X!A((sh3HmG(d;uJ!J629QMfYCb!EZ2O8fvZvx!SeYrM{> zm`G611gu$_HH-+~Nxy+uI6?z*rz)majm=P9FJM#56oHU&cuNze3ptu`kdW-z=_`V& zoKu9lasF&|2~dz`;KYP>#KG~F(>?tmAU-J7eA5o0Sw*SUTl;#w5Sw1L;v@~#uc+Zd zZzNf6i@Ek%1M(mZTI@b=e5%{B0XpBr4{&aWsRe)V`bQ(wj)+ z5bc3s0{za`G2T|8=mv$p7A);@lL^CMQE=d{y>o`dz;z1oTag0^hB5#b_)UK-^4l<| z$g-MMKQ-w9Jpg}dw8sx5bya4pG`D4I>?e|6k1cFlt4~JpHx3tQSgl8Gp~-XXc}j7; zn7HfFT4ofX zRfipF0Zda(c*CEnjs*|aG~kT(V6-h=l(Ix;9D1N)vSJgWP`EciP!aENmcrGNJ75-G zNd~-1sYCD{b5rmukytrF(Th8!IAFqRQPt3?cz*5XBCa3SZso?x0s2Kn$^p|1961Nh zfWv=XBjL=AEir}{LH4aucZ)M9qpFJK$;qObN6jFT9Y4NM$JOyY!tn8VxXqSzQVU&G zNscJd2zsdgB^oCH(U4RBA)2Xw5e*xOBM?ba%pambi26%3<^K>(^8X~7@P(5wy+`=g zw{dNMnb)r;nxlI~k$w8^PF%fa$dH`jNqsQFSd*~oNYoe=@#?_Sw^$L;jM@vrfZo6w zI7qxij+qw~y872bY?XR8b24=?Bd;18QOaRwdv?|F#=xE`MKQs&jqvoWyow zZP`WNe`S(^$G7==)B3k=rJm8vQy*eG2&8eNe$hg+!~sQk=;;wtA-eWDH4D&L-Q9Wp zUEcyOub1&D-=wQyke=7O8WVsGow`u@dvj1-^Qgo& z99Z33V}bKN-b}M(Wv>%9&i&JDeWuiks24CyIo#JqkK|bfAUn`K5l? z=Sbg4jG7~CotlXR_`NIMk~62x#Ed+k)S*Gq0#+cXUifq1KO9g+{Vt8cXqwGA;&R8M zjqWczPGiTe{cM?9kOw}ETm7QkiIrmR?LQxF_TtMb@tz?V(5vq?sWSzztqp*j+6LIH zpxz6S8~KoRq@ZY{$tXJ1q@4^4manE1O5X;pRRI#7WIq$^MKOsk;|) zrQ1#iTZ+tip(95=Cr$SHKwEsK;hh1ymTeU&hx3g)=PVuch_o5Xvd;!vQtYo z@5?UTy>HAuj)WZ6H(oBchfX9g*#aFWTh|e8E>@bmm1LgzK!B5q_K`k4Cz@36mg=`= zJtg?yun}Q>9g52MfveIgbLHuHNN4NY4WJ+g*~dvFJ?6dI(N+mxa|n+W zdw=#~-h2`$>uhm%HJvXKEpIs3cMuG$^(C)~6Jf+&-|kwbN;65*T{MfYYN+US8u_Co zM#+L$aNBLR8TPKLF_6P)0p%&&3IzH8Do=R^kqcTD8k7%YUcq%-Sv^*9`uAGQT#)Df zzndC^W&SiZ_HuvxSSA#b`I-{kZ}tDJsqqLwd^dgh6cFtFXr({GyW4hJKKxHa%=?Ro zfMb5L>}fJFPh9jZ`+2}T^eME=1hb5Af67x_M@k-~D;If|Rz>bEx4ZdYS8=XRbt(lo zmjur8{}t^eDM!55Im5%n2lVM9$^(CGcE|E_NSqYTX#U%$-|Lvd$Vd9gALrBC+4lUy z;W_$Nu}||p=0nISlr%F4v9lNJ!M{eNO1}zSrut($Hfie1KU=PNqNvTu>~F0Mmx*rG z5qA8&O=i{3Y6jMEQ7iYiYfjA+U= zhJL(rfxbHCyG_G{Dn5a8lP)~tJaPP@^Op^SIIYenI=)iz+V59A{;RGrYXDH!SXrRqSR&*6#e#W^tWWOGiYr1221TR#trlP(6cqv1WDhQJ^%0Ms zvcRhfni;yiru{jDquVHY#t)s0^D<^!L5K7Iu=iF`b@uzRCLSDuySux)dw}2$!Civ8 zySqbhcMWdA-QC^YIWzgbwb$Bb?R~oYjBzfyN8itjcZ_-StE#8!Ut%4oKyVF85igyn zcBf#uUGd0(CN1U#59sfz5&qrZO`lJchy^@CF1bTlG9FT#(xiViW3YOh7XAEZPle(D zi>yI-i?;#sYm>+|;G(PqSJk<8pb1Fq8lBH&u@H_Rt9w#FbH)=_uR zGW#s6;^eIkcnH$`=(j-3)KH$wZ$7Uqf39K!k%Da<<;(1w&o@$%)gnFCMqNXum!-m2%KZ^FH2op@UB_1#6*ki!$Bs{+arri*nP6F4RyDwa0= zk$5Z#bz_dqmLlMT-QspkIG5=Gc#%Ssg|O}hK>uk26k=!z>whT3xb2?b3Xx26?KRK5X z4#htRzas_MqrVWpW+ZvZ&)q%uAqBX9a;~3+f9G7#&Hs^efwladb4BzS{IW6v0jA4? z!~A!)Z~1G>S2aV(?K>!CvmCAefh{-Y}tZrF|J`#A9fMRxq_P*sE#4cF6j+CFE;E<_8u7 ztQc%eN9(I8)7rHFrF+$I?~abm=5mPEkR&mKGkF3_;p0H7uj>j9twFkG9S99Z#ofDK zpP>zqqoQ3FIP%0x8Kr8jKKlGY0y|?MJ_wxau-W4^G?$J{wvUVO`1}x$eGyGL3&maC zzb75(e8zog`hq9t-C3y&FY{(^tj0C~^dFGkF%7rguVFoh++PHcx4R^YVf7sadXqps zvvC;~%4H$)4sLD#9j#Zjo5jn=&BsS$LPpNAIDCcqTQAOsko@?g7Z-XrCd0sUX2yCY z?V|-FV($DU|H{6ms~F$o3_82IxsUZG+TquCTr@_%kL}QbOJX>Lm_PFUj=}=!?np`# z{7ELmW?qx#%uTXjT!bn(8cc`(Gq9&-&SI=tVeLXa;)ghDd&dSb&h-gIuhFWf&i)9S zvT1Op0S^0E+IL55C0HIT#5e)$m#Vm^e@8x`Tfr4#lMZ+A{^clvS;` zYgey<7qIEr`g_ySMwuKKe9V&uOa~GVU9Nca5mjOdoF}IUOWxdJ3ZoLb>W849&Uphi z_laJ0EU-+)uCP$Q+*v}5l32}j`d@Q2jPu=rT=9h8lw%(yNzww_ zAUL997iR_S@6|zYlqO~{n;%U@WJ+Tc(^P%e(V>l!pea}^pU{r^fvcm1?x7qtILL!tpRB)mGJxr(1)OB95DYf2!}hOQwdJQtNF04~r7yOm`vGRK~l zsy+YZX0YZW?m%cVc_j;mHId{JpDxq8~iUFV=T6#zTfDQF!` zt;(H75K05;hmxL&2=U9o3V7?dvKJ|&h6-~bDJ|_`(5a?dG)|-kOh_sefh)vC5WB+# zF5r?YSq+ws^a3@h$6d`&h1`>;@+~@^(EduCkG)W!USqQElcn{}>=yDfFMka(E>(J6 zeps@k-*ju@*PHV|6H8IL8TfAX)K+n#`qPEWsz{u@T%25=B$2$K9Xi|^PN-BF=C_co znaMo#`d(zY#qBwyo<0fSxJpSAe3{-0=?TfwM*CUMyYjpH#&6M z9a%X|~Z zsc{ESF1sl(eRvz^{aUCXuCiUd8g8NMiIP|(Na6B|6v5-(i z-(R_A90d2?ibeFp&h7~hNO&;Q+z4*SiFkNG9Oax?L7g$P+D$xMD}w&F#N?$4ieO?( zT8>_a!#|!MgU27&v0D)Y8;N!t$rb72E89q_KV+|(Inpi~t6GT^ifaf}Fue$SovH_v zy3XG-tPMwV5t@#Tp5Y;T$IP$NMHeHfvGG-l-CI1BTA;!)iG~GMdPkBukG^{3S+j@b zj71Yg?R%dv2H?Xq?*Z8Zf2y)$sN0+g2E*e(yA6kt8tmWoB^H1D0Xk7mog zUG5D=NPYDagDwiBz7AZrOddb*LYk8_l@fcW86?LO<4-7c%x43!K`(e)9MjyF=&rG& z7gl23_y}%tHFBusNZ;67S9=e8sN2s^gP9riPQ`*~qhQDRYOqPL&fO#Y!5q5)uXqis z>4n7OX#&>!*PGoc1+L503Nd=RCTSY6pRE}dAN4NLkY{skbWPGoFtv?)Zl#N-ex$g9 z-(5z0r0soZk$6)hzH!`BN`FH{VU)zAheiRIBJ4}l#PFWi))9gaHAOlXhE2FS&`FlY z-`okKZCpz5x@%V3u1&#?AYTRGe+QVQ;eY_M$V}qk?eDcIn@gdYnP-K3bp^nS$rOYr zj{ms_H*GEX&%G&83b{BGW+O6Gp1%XkS$LMS9^CIZq7-?Nj73;}TvK4UfA`=Z>XADQ zfL7jg+^avdEcS(7s-yV+p7qpc)QsTvV!AM14Bua)zIfP3J_+v$%j5reT*&r*#nyh{ zdTSrYOWfq%t#Dy>*Cv;l_g(;R_vgzvf7bb*h)o4%5oSEzCx`+5r@7y}X7gdzr7#DL zhzKCMlo7Uh3g^sQW7}Z#7XNo?y1~7=;qCj6QBM|pK*P=8L+|oW!wvCeW#s?5;YRbj z;YN&OcII)5Gd`%N-Dt`dHg^q#fsbeQbTS2=wF&!+50m?`;+3)fzI4AgL_&n~w=~7|{!5zj{+6bU9RH;>_2GOd(JB|1v3s zrbH~GUg@R7@q1E=C6*Ob2(J6D@G^{jVHC=f>h`bj67_d@2?N;nRB#;6laKeMBozJ` znl1ypPa$oZc^$nbgooV;X1N4b8qArxP&j|4K@rJ=KM@zwcI9Z%cOGxsqCYMd-C#5` zdqxH=;sstE5!{(na=drNO`TO|S8d#2GAUlYDOH9&N!F`xL4=u$4%s#|N6gYE&*c0V8~zT0@1+Q-gV%21nG0X_tl698Z4 zxJ@6mExY}JFX;x{hH?JDmm_I0CAX*EAy|^u^*|~RxIu{I3USDp-z4>ow}5>d-X@v$txP0wY)vHir~0pqE2#`VA3_P%DQ@a^Nrnzw@<}Nc-!W|YH@C@# zync3N@!t&Sqo9rGwk@U)w>qKw(D_7)I*`zOr#++r6>hzWkwNxHPJ>FQ5ZPMgGOeV7 z5WzrWy!|&UvqbPWmI)>JA6O>i0VmpTD)Wa85N5}JM`eaij{&!j`+#sPATcGY=H#?@ zf6k&p)yxI)9oCY~OsWfq18tKq^#e60N&kvUjlgjFD@LMF9q5wMC~a$oGYPyy4gwy3 zWozdbP14$`be_XH4KD;<8(nSRkxdf?G$$6ZZE(5FnXI^G~O0n3i<6 z7+}6x9&%E#^GztQSOO_~%0`YlpL6#u|Jy9n8czxrCmR35Ti5X+8F z(bZb0+C> zj-@~9G)4{kNhBJ20pVIx9f=bHPKpXlfO!YaKdI;Ob;IAV1+OAnIKI82}c(f70&N{-5#0Y~{f3cfOEoPaZ#x|I(YuF$FTM&@>`3ATEUaz@ zzL9Mr8CGZT#5W2vhee~LXJ5UHr?2av4ZuuVn@Zz-{Py|KK`aw%rQ zLRqgJ$X#Mb(}WAfh-|G;&oeJ5qhTywdn}b!Ro4=r#6~a_x}~UNz@TGIx{X3{R_FokyIsASAgE9vQ-6d9ku>cy0a z`+O(DDTZ(IHiiFyu5D!3#H*M}Qu-aWF4c;9$f8pwqGw2gfi+lGsq{JGA#S35G`}SBBohOJBo*AiX}(Gy8V~eNFrV z{ywU!ND&ujbdg-S^wUY6ZRV zd|;fliN5lM*C`PYRv$a4EjXLa6GU(0ArcI8NKp_tpTijc$$_MACNV_emw+kw=nq)C6NqVA%coU)*hDRL~a^BW~6ZNl? z$cIdLS3{h6vrWKUdnBf{Jrjq@S{Y-_lOgg)*;NI1W;K}xqN`#bR05+7#1T1OpiLq0 z23BQB)r;>00HN9~q-LXet#7{82R@VIJ@oov4fJu4)_y3!=uT5k_xOhcZrC==Idu!w zV6P884SG$V!D5&MX~{rL5kFyZTt9GpbNdPy2S%NkmHs8y>lzEFsDZpj!BXT{pV!wB zfQp=BX$uL7KYj0S+~0KUZA>x(4a&|MhlqH0fwR<^IBNnfcasnfm*y&LJh3VCeK*(8 zx--bXx@BA-b1Uy+(N!@b6>R2gK<4FgeV)$$$-!XT2}c^XYoUw9^!OQ77(Pu3@cL0I zFC8@7)kMrJ0`VLj)qPbz=+wN^3(>0wozq)&Blfjs%UJFiVfs^@nbGPC>6mR|^~1p6 zZBU zdGo_|B&dgq2(lxMz=>v9R|8~SjTm;Nd*hPFIDnH_;nO>E+h=gr<@RY%H`NY+ou@}= z;hVhFIFR6fI#0F&+rZ9AR`;^7Ty0mS_EIKOmBHs~DYRQUMW~Rptg|mjYEo8U$^I-| ziu@|d+^w!px{9Yt99EmyHWBwI|uO=M^9VM{}JSgM()xpXmpo>%mcTL0Wfw; zVEBE|IhJyJx7+C2EWHo4#Q}RfD$u3c9Cdg5=~uJ&JS5K{z+D7PMNnCz!+G&a>c-TL>GX?@Xqzi`-5~mSix}aSz{od$PYgWTBT8oXFa!7G~*oHnAI=jW%yKo zzKKgpFE(8PL0FOqU;5E;4LJrY@zMLjGu3;W&ao;vXnO0ns~7M0$G6UT*P^*Kvoiv4 z*%6&%I^ zzD^W9&@xKAJpK|A{Pay1a_T)`srS2wgMQ=B`W;%@O5eMPNHwq@kh=*k+Dd`(3Zpd~ zsqQpc3`t!i8NoSjWDIA^aySRh>jZ+AfoK!v-b$iU9sAUvxX6qBeNhI6;B|)ePoA<& zmgM%rh`(ZqPh7!Waxj0mS{y%DsLGEan)Tno(f_;@m6Mp`hS9k-_PPb$=)JG5A=jkb zMexOD=C&t8tpdrG{v@T#z^AYlCmUYyt;9{6@Z=!RT>hm?A+^l1r~Qc;950(CHDdyZ zcCD^9J3U>0SMJQTvLrb5RB|NoAzoWPX(PYPNVZ`x;HF~!p`sF8hGQND&a+?fV{5!= zp229^a#6ljycn)GZsl>r0D?_K|*$U6a5k>%eQ6f zxhC9}NG_NCf@dL}MVrvtYkups>~n~7tW;oeRxZ?cl+-olUuAY_k1+gIezX$5D6cks zFWM2xtn{xpLxu{g{}r!t7@f<>tH*$_wp+BMUXfXK+%iH(gONwXUSzZEwi1w?OKUrC z6@@|JcE)CtY}546x#kA+F)}+|pScR8sC?69ldIV0W_}{8pP}2ng%~>j{b93a(Kgxx zaVDp>wIgszT2ro?X7k(8t?HRGg!$HFsPRnQs3WaKAx)DTmC222yf?JJT%G^PBvJ#9 zGBG>x9q7~QLYV!P^bW+4*el@KK^hGcmyU|zt}o77TI%UI@7En(*K!U2OxYYBYL1b5xx7!@)p46d=ow4?$!7fmhHTqI__V zJ)Byd2%6HlU^UzIzMS#!wss&Tt355>f7s5{>A7{$W(lCu9aua|?mN_d;6hao&hn^m zC?%4{1zPzRp1Eq3AtUM{j$*%Kc(|un(teo6p;>wfKsLJDC`0Z9v+6v?dBBM^!oIapHH8PoV zUIH`Hmy3o)%LYAW)E|P_%lr5-u#YODWHh>53heHu~pG_J(HV-g$ zEyRcRnixNxO8X#~w*j{&N#VSHKtViFMz35%t=`B70%#U!@$XS}%jW9PT0Frt@*55dh`4L;`gaCPY``S&?@QZ-d z5b)2Wl!U`55*?vuw?n1IS8oyDR-x;BicaO1BjY+Kp%V>FQ7oS?eOK3tp_2@}IZ8xH ztPIK%j;W8N;aW~^Qc+FFmq=iF)C#RU?n#iC8BJ9NQ%21d8JHVSC|tExS4Rri(`p9< za~Z$2p*>8@qDKG3)FJuqpneq!1^OZnES*3iD=M^{!E+60!d_B0mW}Mu*m#B-* z`y$E3`NuEOR+cLtrNK>K^bB?yNNBhW?E8)-4Q-DdvU@BiV)PRz&UD;pof49yz$-M) z9J!aQP}k_5h3v$Y(QqLrif==q&l>?)C>N@kq>^oE=tuHSCk`GIdCqd>t0=6IKFTW~ zLGVVKt)BNYL^zAQdErInmj^ZC5uSW-j~1|KFg+3%MqsZ!;uRQ{_k-sB6G z{A|l5pmuDNBnIx_PBPnPt6;wu7e6J8MveqvO%Oyekby{Jvo#>=#8>dNAABXS@{}8yVq5BAn8=7RvDKb#jO9yiM^nk(} zi~>;sQR5HFaM)9!^6Fz9H4VTU%slsQ-QQ!Si9zc<4!|HuRijr}cV604i^? zfXW*g>Q_9}%~i{-?7Uc}8@~~9B)_yMRpM=Xyw95hmsveS@}MtDt+f+ycI7lXF%(tA_BwDW~z zlYuzqG10ktP_$&zz#2XhkQr^gCBvo)|4W5~_P?ue;#P1RUx?w<5d8H{YrJuAd6_Ix zQkczv#2=U$PguQKVg=yzw1ixGu^+kmvelWOg0O^Q1waX&k5FNo+>m%OGWbt8n4c~V(rY?)!R$ZC`td4&shPL9L~gV#=GHmeFx zZPFl7f)wzh^?m2ZF%n~cmw?fFQSdu(au}nCA0z;OQts9sOJ(sHIe}wB6_h6Y6#MK5 zLpG?}g(^$7xJwUULshLMv2Kd3y>nJL3F_-ErBe*f!b$wn2}HXBwd*tAKDE}Y53Il* zp0d&afAH$jE?R*B=gY{4hXP^s`9eg!@{XshE9KeP^)ug1*UZ@JkYqR|0d*3CLKmlV zpV15g#r_maj+s>8)2^xDbXlveFk152Dk`c2&g0hsOvZ?o9^0)iz+#LPB+Wx zOha>Q#|Y-}9Bl~2qh=UOR#ulpw3a&)iPp~QU^${gKv}gBE-^qh)y4j;ae9AioWVaD zhy8Dj!$yTx-48nRTjL0L(l!6lIO#1j6!$8W0FhI|$y}mcK>3*d*7)dzeQCCqaMwiW z)lOK0e~$Mhh4m(w=6XK|N)nEpo%q|hnR$?fKYIkfCkR_W2(1=Bd9*k&#$W(KqVu$(y`=aog72{Rom{^;mDy zP)Pvq3E=|2sNmq`;ZC?RGn;E7^X+BkliB8WzuK^1GH;Nb^GYH8obEl=+*T4bAIZ;8 z#8{H!k7EZG{?J^{=q6Lvd05UrONk?qW#FOv88Ga_19!?Fr7)TgXG%K1K9!Wo=8@`Z zsCmD`z0k;Ab_5I`bMg;8j{|P}P{6>M?30ckYfUhk6Ik@lDphTy7O!f5eacN4I~n(3 zD}l5h$CA4IW9c>#u||XZDf|){0*lTHZ%=5x0i4X5&={}KujFNCTV-9J|9h;Wn{XOZ&4FRP8_@K+dkO$bp8d+|OsFP&Lh zubG?fphCKYWOp;oFL?li2NE3S2)WGMQ@=EA?5mOoqBjAw0l)X_yY5Nb%<*}>Q;c7s z5&aX>ht>#O<$Hz6BZLZo61#+Ut0@S4o)6N=4)0v6^40Yj=y2z_q`I!CXLeqfk z_9{AX`ZHNdOxqh&UGNdfHj-^q>CTw%!Hd;ZQZX=jYf5L%oa-M+02VCDau~xlT@Tf~mZx1R&`-jf1EWzHlKo{}!ZTM>=rYPmO?u!U{`qmv zO7#4O4IT_|<`?V`4vsR-;c|r|JMm;|H<&rq?ke{V4$Kj&CAed({fzMjW-Ya`gMp5Z z>9dBFl$5C{opa9}a}7Q-18KuQ=yi_ySD)sw3NupRu%*JG8gjpC6&Mx^K7!})?b=2A znVO3NvlSg~rx`h5QtFpQ(N}J2x9O;)Te4E$S_aF4AasOe`d?5s3xywq`^&NtIIh9^ z8miC~gcy+~IfjL{k>Y-vv{7<4>rr`XS2$YaOW`#e8)(e0d=~bl=Vu> zoLhb>&H8!T>Dd( z2(Q+iZN-&(*W`_+7clIIPik^jbcJ8Q9#Fp;p1pRPB9Z?f0?zvB zUgROt`bQBcMCujrJ#pK{Y!W$7)hEgMhk(+D_#R+XmNV=k`bH!d^;;W&Sq&3ItY9G5 z5+y@_-#}+e{N>vWN`UWE$CM4>v2_?5u9saP@29rKX*iw_s^x;5q{)#ihhlxaP@ungnJALU!dw1XgSHY<3F$CIpf2%bf~y>@kv(1jdrf zR)r)N)=fy49B9;m74L}C*33Xuc z7t|mg-I(kiM`5!)p)Lg@*>e^YL;bzY$&s0X-QbOgvYHE*$_f-Ayit~;%pMP>DUk&( zsc4utp+`2ig>*p(XX&vOlmhl>1GTUOQelp%I$oc#JKl{i1pG*AL{eKwyKi~h~ z%l_y4f3@K6`=6#2OEl0v0Wz*JHjMcZ!oqPc6ZJME4kDX+N?AJv$qWWTqcA)uj3{AH z&F#s5{47Z~S;(h4qs&>(HpzhkXn%!lJBiklc#rpdtrZHF3ZEDkg)&hziN3#(&*^YcXd#fT2Q)`Va2?3ps;Bjx!w-G6pqStu~E3~(=VLsFRR`6aYnuxY0N zl}HU3GWG_nrgcD|IMTK8F!iPvCLs9jQxVbWx|v$PVlPp7X!`E^uQOf z4EfS%qLps41h$oa3dP>uIOuZ?M0A{X<-z0r4RCB9;>RC{Ew?BkEq}wyCye;Yn2NMo zJCQl6>td*m_CrKUIYmhr4RbNj{iDoX-%OB-x3CL1tT5AEVabl2Fj8bt9Omn?#DQ8JH zFhC_ND2aVfp? zvULd$S9SmLELdxdFx)jG3Qcam2$uj1B9w2uGlw!JZRvGM7rv{<7Z%j18HQoZHmX`P zf18c;K)j8`w@_U^%aB?v1wS@zGVj;S(w>PXE^wk2n^6biH?UP>lq+yh^}w|VvPGnu zs^KDV-GfREB)FK>eL$tktji4p>|6BP&f#IKeqI;Ai{NO@4ppyu$_oWE2iigE!TvqG z_deQNW%mCE8~-WTAWr_5U}N##fZ*oegN?`E!GRaQ3yA0IF^dS!-dBHa{u{N}5D+s>o^5wS(nrVef=c0--brI4@F?bR zA~s7SLBdG<$sa#-7m6w2Q7cHYjXZi19Rp-CZIRjb61$7(B6)P!(ofaqIe4Cf24o#v zs#5BdCJj8(HY6{qI98WSj<0%Gg6l{!NGE1Edc&#dMMcnB4K-&KaDiKXs4O*OI7!r2 z+3@*+T;)B7pOr$eM42vOnj0`>B*MHj{kiX%{<`nsHvZ+l=kgmqegfmmVxZm}GY8K* z9@0#!2n;(#XeK7ZRTe5xwdzsNW8a7KhpM>rq98IR;1FTZmdCT-jCV^_9u6p<=R~D_fuwGvMo{1`o}!Q~it$z1Op@#=y%I z<-PYHgM}{1w))nMFc|{d&)n|Z;r(%VXtez&Xvy%WsfT;@|r{Gfoglf2WGbd%`)FZg2Dieu0tO;N^6~abeP)QM4^L8N7S(7m>u z0+&`j%dsjC;Ku;#cp3hQ*YzcrV>3oado-w-34v=xe6*$MEh6$X`SSL-v03TD2A8|z zZtzQEQTCTd95=4~?9=hK`T9aoU4Q3*qwSK(E zT<~h&8sB}|xfNP{c-3=?KObJd2@N=LVmF4;i6h)qvWBAw3`Rkuk3M};m~8*r>apPE zg3IIt72`%_`u(Oma%kDYx{*3=+{iNOJ#qF8N0I$3>qm2gtMlHOI<b)9R+tR^a)*kj(^A=nmWGCyyk0Q zI+CL*iHBWDV#sqn(XgbZW+impdUZf!XPnG)*@F44Cfl`Yo2sE_GkA6SA^WqLQ^g~i z_mhzeO9xsq$&T~!D%9itsoRC<8xgchS)heU|L|^-hCx8TtOEhMrK;r!#+c(#1>~#q zjJ>$ZCiD3mideVpez}^{^YI-WS;Wk)XELJ9_cixQ0zjZ;VN+0ARvx{`fK?mIdjm`3 zaMJO8v=hxv;VQG$R<5%cOtJ+YS(#_@7t%bg!;cJvfmbN7gd<{hy39(sXQD^ymhWfwN93l~Ct3{; zQWVN69|cgPGa?$2`43~S8%YvtqfxF5`r{U$y6YPk-?=B0YTWsYXZSxk!wbuVRrRlp zhlnt}3wRttoY^g`$isy0Dat9fA-OKlUDxu};#j_=$GRq+Aym{St6opEdOewBeESdv zsa`%Kz*WW%e+F{ESP!AZX7a{S)!sH6uk^#4mET}~VZ)&l=|Fm-I_VXCkJ?YTp1t#2 zz&D}W5vO<1*;x&*xG7zk!;yQR2e>02XIvy+sEBsWe2#U&uxzuu-fr9b(V)T5UEy2 z-UPfOB5>ap_qss&lwB&kNZoDYc9-^L1@oX=>J+_?PwxICp+tToIP7Tx(uj0kd0srk z@zb>55s~hU#Zoex_kJO+)kg4hAWAvO*2U%q!C+-IVM6&`lh(S8D*F?hzy|4ch~DxR(0<4K_0yH-gZ ztiY$5wd;_$vFZ%v-CZGw(V@jhv1b>ti`ScYM-cpC?8fs_Y8_D`;$X17E`Qo94Q3}b zT)3(P^fCr%JZ9iGmOp>PCVQj7+0H+=^GRPD-=D7tVw?2!34X-nyPDXCp$PE}s7aSG zHlZa?X(Tpw|9|9WM3IB)2+}vAEVbk=*kptEKAkUgnZ{8@UDyu#4Ms=w~&&o{YXTff1C+U@5apk>~o>- zzPK1!fpQ((6`6|586T$V>s*wVPoL6KY~9@h4KaiSuh?E1mv}?STI@OKGCIey<(pZz z2hC@OCB_FjPm-1Rwz>*S>})RXAbT=KVy01vqcM0Fd@6e!kV7ezT54Bz=UHX}d=bgo zAgP-@=iPi$!7Ag*jLnunhHBnh+>AIP?+*ko5ID56?@TWS%vO4M4zN2oY4ytl}#%XU&p^8(cPOl3cL$YBZArrk6cg66}#CwJStckXI-#v$tn7vFeWn zVirj>sr3QxLDD?wx3)iRhG@45&Ul&eav(4?;d^0RVKYbw!kH2zcuFQVS;%8h9cf*L z+M<;6(oucR1HT>csUPKGl;RTgiDfgKpu1Wwtbn~PNeIe7bk@v)40n?V$+IQU;Yehw zu|IwwUlc^SIRo&*!4tFc?`Sm0Lr^&5AKBT>R*n?W)m7l zK^|i?E!;qZr21C{{dN-MP(4{Qnr+$gLiK@RjBIY|p_>cj*vqjR5n(lYdF zveNXcw4w|~p1do8w96{{^KR>h; z;Du+0qXekU^{wZ^c#dNs1lvF(Tf1C(-ZMARaB_hR;Bbv}HEPf0#MShNa z(rrk)+p#4EpR!(6l3e2yse*Nv=q|Z(AWtN=qq{NMU(Yil{p3OXVwT z!{*XsQH9A9fqq|7YSQ4lOiCgZR2!e;Cg&L8L;i4{@_c8h1=pT8%p z1q(Az03k2WvlrOBz{Uf4a(XR1yY;J6m0JtN{u1St@g&@qCHz_dQt!!7a|MBhhReul za7V(#ao6%iztLpSi;K@|IJE@Pg>pcM3bo$6Vd2aW-R8G-(vPdG{+)m)Z4ud)JNnAlm6aiQSRRrHSyv&k_?H{9*XM7#VNLf}t2X)vd|x4SLGVMx_fa zjZ}YG6XQbZqNOCXH(Vu>rt?(-?$8sC;#lj~O^lIC9ShaqO#A)nI2WcRK^K!WAF0yo zY*sY;k>O)4iIo1wfqFw0wc7hQ%r{Q zNDN%K$)M5m7(5o7t@V{BVhthRQkI=nmJxD*O)dHA?J^Oln;thZTY^PMwxt$lssBhJ z4^`I`KiS;xb|gvtFP_1o&oFsiz-Z`)5_g7Dwj+GbOx|0uM(QC*lm_noF8i%1q7aQ- zx{c-NNoe^(({E-eqcDZxT3DDld)(xQTCB0%<+cI2d(VpC?3%#|(-Jy`V#39JZbi7{saM}iIA2Wwj~S@DesVQdWZY8# z9v?${=ft99rf>EjA}l^~VI`tF_zY})X>+pvSuO}`v1nR54i7jjJwJC()>Wy3IcH%4 z$EX(hOI=8Qwjp$b-tX585}B=?nkBlPK_;uo@;}AlFGi6MNH;0r;Vv3jnS*E#=0ZGS zKqpNa5aH&4hXiyDac7i9pea8oZASBSkf((mnqln0>YxJHho*}$p=cYxa|Tre@3FF{ z4(!fag+IWoT4mlJxs?O6Z5*LR>^D*l#Gav=$0)X8AZnq1V#-#N?&~Igf$136ZXm%T zXc<#z;-B`pV}KmMd-*jrMcgX}piLlbzw;y4>D-7TL(KvWkOr`~`Bn+Prjo|%6%(RB zu>k$Z*6Fq_BcB451nlheJ)wk=BU5l@VeGq!(s3T5LLd7fu}H+Az2=xs7flafW;F`V zJ}%C;0lg9>pH9M7K%L?-g8Y%Fs{t-GB`4`(9E$V>IARgVsz?A#Rw?0Lu9e z38H2wMKG;J(Um3d9PAUTwlSY^onEBN4bXYNH8DhiVX%f2$Q(f&)6Kz+oroh@)@L+T zp0D({+;9h?fTbO%OKzqdpVpR{aX(nZ7K`stP`GmP5N)eoNyP_Oz_$TqcIah6BtXc_&eviCF4eC z6~4n-P{sj0vdPE$tsqvb3uBypmr=C-?wZrn*E{vyJFK~>-w`YKr(P_{dqBi$?h8%z zcf{)WvlKa!Sr#6$pAF+WBJkT^5$pWl5o_+hSTMtYh!yqQ=WpI%uYTFZC^*Cseh$uq zLGzFppMnNNJ3x72o=P-*12YZvi!`lItHiIW>Nc$nme5oZ=2PcX4LCV*R13^%UjNXh zF96y!_YZ9vC^v6f8u-mLM;5Q3t>&_fxk^P5t7Ydz9NTxBtTWtH)ZGA)4vxJHV_tCe}}_X`p?%2OcFWKX!nM z>UlV>^zQB1=}j{L=A@>)mdqcduri~@FbgwFR7zc}>DQt_x6AcgM?J#6Tm!TDp(1{; z_md#_y%VvjSVgCbI`#ULsG(>~ zdNLNY4n;Ij=E`Vokua3dJ*;}yq*WCUZzKs>jn;K>l%&8*ST!BNXt~8n2#)FItfUi7`LlE6DgW*)&F^m-fJzZ3fZROuC9{ zxD~}M6P%=~Q~TDX+SIe<+LXs*5n`;$z%c~%>m0dLNV7GEmAvD8T%I=3)P?4xay+fyP)UC=7cYK>Ja4RhD8~zAUdlJ0( zrbTk$?viiq^%03peq|C%Q&5GpNb?+GtS+@I)#ZUymyrPddP$BB$2sJ;O$?kHHw+_T zf2uyZTOzM{8`tl`E_t(NF6ad1zci?1fh?6}%PE@PYX;={~`~6oiW{lURNT(v?+X)1ybou73a50jf=Bb{A7kg0zu54% zvtUSuXIStzNBs@JQDcO;{*$A27IVkhG;XSEaV*P?bRgIy^a{Gj${ItLM+AlXruVt7 zE(uv?g~7bt>?QGS#pb3gz9(E007+!?dwobZmU#z!;D(Giy9T7_p>e_zUvSn@e))MZQE11l zY`%PaZB;p4O;I#;dC1F96m+b}=EcbNAyzcg(q8v%YlFMV=BhK3_Glmy zc*XfyMFnn(vWm$IfVI9!oO{B7V+hv=0s41qLAT#X_*^VaP%LV9MP*Oet+j1_Tm(gj2`~JzykG#>v`sLe+qPbWHAI5waEx8j4F?j}Q-q?kOq7G*)Oqw1Jr-pJB z&|KAF_g^lvd)E}&NkQdB!!gr*dmDUlI?TK^Bq-l?&&hHci3&5n(Z?R3i)D&aaC_&}ZFZ zK#BALL~OYRls7B~##vbvd(h0M4j@FYaj_jTX5f#}7zR4K-++nvnc{Ogp@Tfpeb`X#gE{>UXvr57wBMYu@2Cnf<4$H)6X-+z3U zPyv;KqC*2S8DoV3Udd8=_r)#vc^6aq`siMDOgX>7bH5^qrwzUk#=otG-qnNIk?DV| z2AcQF98gAH$gYeBKcWx>i~Wqc3{1O>+hZc$XuYQLU1zkqBM0cbCog?Gcietx#GnV3 zYc132Yt{XPJU$`FeWFmsaSa&8L^NdbiL}C6$v&^TEQb?E7H3WnFXt&HZUS8k;ie#$ojcd zQAjuJvN^boRB_057_p4KqZg%evwwhWhFVg zXB2e_X_MI0W3fcnWw4UtJHQbN?dTCv#7^procGtY{XT|wFq~BNBimEd;PZ)oR{W5H zgw5FjruG!1?2ulu8Gg4FKLzQCVB&|BJ(;|SgXnBZ^Uc!T2PZ-GW!UWf%dKvoyMf@} zp*BE%B5={)j9~>b4A~75&XQXkUoyr-F)wP06$PL_C-GL#H&%TA%-6w+VVxsZzCxDn zHs+n#Pn#>zIG&UeT9&RjNphLK82)W6vFU^`Mc)W!P;hr9FPPLckjEf7p!9A(Aljtw z1>Y;HV*V*2nIV)Vmb50N-RBsAHAd+mElxY^mb135AyS0X*nTa2fR@%VY+jKUB6>x& z4aQ=L1{Iz_@9p4s?oKv)UsekoOR59ybaSm**I#mT=kee8h6R&e(%J8S@Qw5?AGGT` z({BKQ;QVS!9D^D1NFU(x1-wJIBkD7&GyN_V_Q-dc8-EY!$rrG6geXt@8>3o!eE>X6 z{vl#&GjLpdS&j?gBlTs^DE}`1RH6TPM6w3Fv$2KHyc`DdnJSDb@ux@vOD*@%S>gOZ z3t4$`B8fx_3$Aup<7sby>6}!dGK(@AkqER|XW3_yCm0>AWYC|?9Cw-GWQS0_!whBy zL_UktHCE!F`s@cXeeX(ulM%F#GHsBon%2Sa-z|1t^xLWz>9rGZ)0)gS6!vV~k6(8o zuB>6tl2Dfaz}uZH|G?Y#r{amZr|Z7M?^Az296jF?nbnC96jOtg1bi2mHE2puC$iaeGE(s7xF)S2sKQFlepfs z_fU>>*#%~{ULI|pFgoj<3nC(vn~zeVu_R;YWZu|*ciq15)s-7=BdmRzD5Ph{2Hxf- zS!n#wW~&BYOa><%o=HLz^Zvi+m7i38m{R5<2=8%R*}`o|)x)G6U?AejU^3eyH+k9S zbiSw^=PW!|nM63~h_hq&I0QV{hwCt(ga(41^*nnZyko`Uej{}JdcyJgJhfTSIHO5J zvTStR3#|Y}e4_K?`UI-vRdX$>aufWcxzHf_ZJ;e!$69wL#(v`=zO?S^{y#KAk=S)f zhTKj%P7Fur)$ErLZ#@-E<31n93NSp*R z@EQurWn_}jQ^J-NUf(Y8f6kV867w{If4vG&@pK&Q^&Y^vmqwIi+zTm~QBTq%aks|i zEwY8o{S-`h8cY<0;$ruCJ~I0p*Lt`OYn(1NT!L!L6oqW>fv)ioeHOHE&5<~giDxmB z$qIgCKR{-?|Er*PNWq-znl7x=$*I@~P95XyS)FOOwaP+fjqmfX z+Un%3?0fyuf7DiesU%{_Cmd__O3JVAs$~3RF6-{rm%&&v-B3TkBQ%4EqG>kc<-Q*# z>NjcM^zD1KQYx}r#`8b^w-4bQ$dLf&d>@D6$>)%c0u9DENE*w2C7N6CZy&-B721d) zUsAt^s**geU;Lh=Ch!$?Q;bZ`m78(=Gh8eDn7VNVoOD=@=n2|?cMv!)d6KXR-hz^Y zhow6uZ!6Sfm?%)gOnrSI-)tH^OsLKqIY5BH_uGgV-iz74{>O;0;#f*$3j3iJYmKJ0 zlqn9;-f>H$__Gl;oTA%TlR~PrJF=omYPdTPwu)svsXcFyyH}I;m=}@og2o-aSnZ8C z>@Zjo*+Kuz+Vsn>i&Sq99+sfqm{ds)?oXCw&TpPRhaTkXFMn5#fLP5kF|Ljs5{W5bnO| zZi_ghs>kp1v+|7Yg=HiVso5)g`LQTpaN-{f3V=L=Uz*(hwt(iC>Xi16UyaIK9r%mR zg5L1%-BBm)|Aly`i5-!CL$OtC+cRxMXR>Hb&iV$t>t5LXjIWkziWuI{hGQd>;>J5% zQLI4dGf_+INa39|N&5~VvIX^Yv1Rbqy~Q0&n59KM{bMGIm}A&nT{dQ&EFtXe9Fhac zi>8-Z_x{m+RRridrVh)Uil=9N7wY>HPtEu;1ci157(UIobE}4!*Ddf1N|5!{rHX$z zMf~H}Pcvi%vEM62W~(ji_ApaAOAaaepxbQuP<5d}F+MmRT&Q@Rnr^!GC1KB|y7hAg zpmm1i)Om7dhftCcl)PaQzUt}D)ue9->rH;cSZ}v4Vl^z|=uqQm6i}pUKz9)IK5eTj z7fcd_ujYOqkN|+7CsdRZHw^o=QTau1G`kzt2Ux?`lY|Cjfd|!$UN)dBP2jZ){u%k% zvE&?MD^UhCsa(@l;#zva$yUA!@px5&vPbo<B+%5R8uD zVQ}{mA}acixl)h@P%-7Hr_T;B7Wyn^H^;KQ1$hm;Rx$7E&P)Nv0Ix?Fp63y#Wo+EwIqk?-AAYdrel@nE?jGYXdsL;lCx)je*xjG~PNW7Gatlb?D$ldeZVtDrvy#7&B&_ z+%JR8TnNQ@;jW7wRCs~Gv?PPwMR^7ZI;-cnjm7|ncH;|=Y_uJQ$h>6CsdzX|m5(|+ z@9v~kE$I+RPm4h2wb;0?~qVmz@DYP1J`(A^jR=^tDE)5p~a&6a8Iw?X3&(( zW%)>4+vG^L?iz8910icD3$cAOPZCLll=9lvs@H_on$y~8LsF*S>Sa*;!(*IQmO@lkF|A!Dl z26p+k5R!8XkzvWmHvWWDmo#pLEpcK?`6kTujuW|BCfR1jnOX9g{VUSemcoT@Bs0EF zHYdJ2r?@Id_W#j2ZA466=ef!Hb;cIX&Hu!E7PXCoozE>w$lLo1Yp~4`JeCT_;V4%i&*O~p z(^?UqXMZqt0OPc(+mFFu^86mf{%GAUj7DeQ5uf^b*EB3KZY?*>BO6L9Mst7@cz~PJaTtfPd_}?u zT0kk%s)J~gge%I;F}6gf-Q;*sigP(B#XUObNUxlG!*%X>$vy)))4klaXL*} z0;u~o+{Jbab3R{M!fRZQYgU-69wiIV)oK45 zT&i@0@oSKKb+|iLk{*5TnpDfDE)_&86N_Rx;Y9K8IBG3@AjtGPJeXP8{ms9!R0y7s zUwGeHs?nlC*xtXgR5bgOe)C*6*g`CapeDQT7&S1New&O|SWIoRWw>ZYs66O%8vBO-2F#|uWpO8*H_QyCmxo?6LOwiw3~O6_s1ObK^?|I1E_CLB|}{90uyvss5LE`M#ZAPR~RYj#NO>UZVd3 zrKOP!1K{9&$dsZzLh2c3H|@WOe|4VlSZ8+=bWe^1FG-|L;!|2scn%y;j)r^px-%r& zO5bYC()pj{d2rn~dH$pKAM*U2DfKvXWTt{#-oM-dl=zMpH00^hjGf-H`Npg)5U9e~ zpgBRCdiEke0sX1cc*f6mMIr}^-{vf&zpx@9SqQ4!0NjV;b8IKhR=WIRRQKK&J-821 zwt&z`p2_FjU>?9h16Ou0wgd3)$DJrS#lqRiuFe+1Xuf`ojSYMDR?0sZtp^(;5Hskk z(HFjet5KRHG&K+WTaxk7TID5i&DUX^0p9P6XY_yonK~PZ`|s*0 zkyf0fD|8~_-$~L8*Wy;7QG==@P%}W2w3Sw`eIL3N&C$!`!Vm%>9PX4K&e-MWmI*90bux_k+YZ7rg2k35m*G zWB2@_Nm4|hEnlb*6xeNz#Hc+ThTZm*h$dC&iyQ?~jT`4W3TX=Cdn+JWSw%RDLjG*) z>WUSGG<#~bWbz|A-8d#>i@^W}UcmjyF_`984{hCz#2O}3Z=v*$4iUd_Cvws%bbiO7 zuR5M%^QYV$>#>Urp?t<-Z(&NLQiO2tXDSP;?oz_bo#0k(P{~=os!u2nW$+LoHAdBzS;1h?<>3Az2 zeg3YUhWf`1xfm&8{e~~d1g|2_;QoB>qcnB=Vw^SV5Y23AfalubX;>yc63 zInvAm$yzr&YORAd`*lb03X9$hBZ#ZsL7FF*BpVHqbzt$`XSP=?wq7I&IM+vtmBG*Wes!apY9Q-}|H7dIw9LA@mZ4&va8 z0W4^GzIgu9s`-Jz&s%9koB%QPBf}$n@=Pvm>do2M(Xu)b)X&vgDRqP;>wQ;Fc}m;m zFKC`YvtYGTN`@Qa{;8b4{Zl#pTY-O0VTTtZuJEs6of{lW zb2CvLx~O8hv7(q(lNmw2;+J|VYUtjHvMdq}mf`y%ad!B%b(_8^;w+6MK?vS_gJCg6 z@yH)M4MV~sWS>~^ulj}9e8R?mT&1>GtqDG8UEb`>sCRV{E!&B@-#WGi@3kuu@f_4` zCW9qN2e{j}&~wZ{;i^U&x)k}%F~}bKHuj(!K#=R0G1dQ|Ibe`d^AnIp6v;^B#+m4I zMKuA_&3G-b1BG{1e@m2L*_?WW*fQ9EOO)Iq{(mG2#u)b7w?r9X332h`kOYrhG(FF{ zH~5w)S>-rF2sRPc-d)VlyZgsbSG!E(2fL~g`eg^u>uf5Dc*$+w{P`&6jktZ0O?3e3 zyYk15vvL4-NW(cUD=d~wPtb?mAmS?>O?2nW{&~Jc6)UwY5e^I5XsZU*<(sMJxjB9`(3S3{{5uu(yOGWda&=rr z8Qit*fF~%?ZkYV-*&_=VKnrY_S z=vCT1;q3W6dWxwizv){j$J3vjy10*-$|O~{zK$mU>cU;$&ht*Rf)6ASY7sMMA7G!x z*oFGUC*lTax2y1#;u>!mlZ@!Mr-MJ`qN?vIMqVu4op^V!R=b)p??xVHFQRuE@*D8X znxOJ_3p_maTPm54eH;L1`1tL{+TRPPnz&epMdsDLXgMEXo+=1$PezUEA=Q{w!>_I) zICj*{^FZxc=h68wM{W6+8Ha6>6p`iQ@AaapG|z%+wPq^&t>6K@;a7*cADN!2(GQ49 zwhwP(T_gxv>!l1G9rL*GZ~|7Ep#mB&yKuPReqBdEcl!TB@34DKnfx=Y^Q+9r_J2+5 z;Ql|Rb%4i7Ckapu8~<}!Ct27C@b5?nQZ-T$CGGHEjafT`iC&^=_Ww?V;5GkAgdoP$ zOz*%^`}um8rOE!42>E@iZ8m<4eqJ=cEQs$6RDGvGQv}^#OPp7YZCq7&g}LS{l3nAx zOZEX3K4(~6eo318s2%<~R+RM)f;C&eVT13!yR!fiMNDzss?QJlPsN5(R=CVm(hJbK zxPCmW0QLRr<@-si(K(%-um7Sll|7qm967VNnyuB}uK+jA4NX5ko&Q(^^i5ojRGuCe z7ZIdHVP~B$9lPo|bCMlz5Y;;VzaZ1McGk0nFZ~paqqQoos%j_mg{)vFsPo+#QEbsB zD<3oP+$AA&D)TrGHc5Yq;N6o@zDs!G^cTj4E=!+Iw)B_Gw0U)A^Ny+sLaciVjQi5| zrfoP5Spb6=U$uW53w$thOjV7lQR8w3LukA!{nxMUfMmppPO#q%i{|(BHEf%01+N+^ zg?^Wp7|By~{qh0sv_)J7-IIDC{eP|KwS1tA>3nng59)%3aK88HvK_o;v1oqx9k%I@^D zc?)R1O27PTL+ZDzX+DX`Eq(rc-J5cjWx|kJR~g6y1qQ}1Q*gpqdEhA*te7CKZnFn< zZ92yst5`0sJ_hLo`#?XeRAaW%^4%rK#Ocy|VV=^&`5R%y;M+socA$Nyw{6mw&wtQ7)NX zpii99wBN4Osb=)%y>MtUwEXh{;`E`XPU+%*I|CZrs^pfX?m_BtQYRU#q!M(U?W!GP z9=JT7&jJD4IgRkL9>f>-+9)r*@&;Tr4o=}ZKrqE{jWRl_lAt;^Eb4>Iep1eK&po~k z{rlPp-;LS8ALactIzLTi6uHJnU&?X6@_SW8Nu1TDnAg{bB_OG!v`U-&v=H6O^H^b7 z1s$MGM$RDcG|dFmK+UA>6qG^Vnl}BIa$D)C>Q{o8&NE-e{D8vtLTPjBvaK9(wyf=T z{dcahEgIt+IUg(Xo|#A_eLOjgJQhZX4EG zI*WkVbol3eJ%#`YD@L2$iHX6D7T)#Ish;tGSz@kpqe&ykT zBvK}*9)RsV3~A$)^V3hoZm%T!;x)gDe-#MAg%G5-h4CwbxU>#3esYlNJG{4I)%|O8 zo|XByJ~pP{6}$J;!dABk*nIC6**OvdCHYiGI&JEfSzp z-m}1_cm8EXo}dyqGUr|ZtU&+Wc3)Vdzib+s(5RYmG*o*I`wHK(w>Kpd)Q7_ zCrAO(B`@bDP47zN%yseC<3Rqf47)8^ew5J5XVIu22YpxSBhk&vGmTefw_L5QVU^>U z{?TIa7xt9`a1H@-AbL{aySWe&%D0|0%|*!X`Yw4de0gF8tc*YJwF&b9MQRlB6sYB~ixCmk zwCGpefz5Cp=(XGplhabJil8F{4KpoDUUh2}>~soWZO=QfYYDs$s3^^%qU?Nb|5TsZ z)or&2F_-r5CvUO2!t}KAz*eTU-H)tB3S!sjXk;FOgH1~nq-XVn{8f8<_vX?A0hE$E zcnx=1ano+~h*sz7Gi$dIX_T^x|zU#`Z5L5-MK;}9vK@tl@R268&`v0&o4Kf ze;LJK^6>mjPz`fWbhCNt0OA>5|Xi6q%j34s3a$dd69OoCxg;Km6>fn zSih>*5HAG=qF9d;P%uVWe4%}{LR+-<%`JWjg9Az$N00fkrZ4R2Zbo9|f7} z!PHj!o`P=A%R$#dX?h~7z*&%i8<5d@5e=|c|Fp!KTGy{xi!>#w?(x6}8@tg`x9>JpYLMUSd)@}UZ6(5e%(buEqfVyu}l@@M#!jg_WWo?p_b z^=dsGb2dvY&mqF8;N!f!bnhqw8J0LBA{UL$8Va*Go=*6;Xm*%^6M1T31^$f4yn=O9 zrU9!X5g0aqIO%mr=yinXb)M;UB4sQm9Mot6xRHU*ntT@625UQ3TPl~H+`rnmUzT8> zT~>V|-)Ag5m&9P-%N8r6^hb`b7dS722S9%!@_lAh-OZPxMc^RuUvJSxvgy{bNlj2~ zjCuQSAMebeRwT^bm?O16Pdq$aUObFyxuUTMZK@RTw|n2_H@xghyWH=Iz@m7r7Cb)F6HlAbuiL{0#YW z8T{hf`TD+KU~oPWXz6R2C4ypfXC~)BHtseNoWe*B>b-ok?m~B={v$Hi#o!b6dWya^ zkM4SRj0mUh*giFzsV%dmkLZqm1M_*J2-0HmAW@Y3ahcQ_Ma%yg7ov;3TT0sSnii5N zxQUGBXbu_H(A&%=`jMR=v+H}=t{bJmWS?d?YQr(^5m)m$gPAlb#kr&dY>Y1VI_-$CYgM`IXG27?jUhaIKb#jNaf z#;goS785tQi(_3cyTYA1K3{D(DFd1Apk_Qgot1za@=w5Jf}3*OAM??iSSMo9hQ`)4ZTz4UhjMz+=WnaYk-m zVSg5}_0Hm^0fDpSzSYs8VY5B{^2XEjva!9TC)}2$9Ceu>4`2gvVEpYe%0P#VXlws=Yn4pm zx5XE+UL$9HYY@sy5TV)ytb=feeq7Vt@;w(WTLOJ8a96_r2KKi(BcwI2F_LlKX>wYu z<_u6uY*V*DDz*yb)pls{vyhy)8M4o|1EQo(&Yg-tH$MEpdy4k_) zY;h5>`MYDb_}J#-cJ}zF0$GL2dj{cmWTx%P_H5Zn^K+4NJ)NfYJLhE|^iW zc4Z4;qf~V)&;cF-6wW_=Xt36|%FjMd=&rd&aZUk<`dKL>yFe*`F_M1ZFWzlTF3W*J zVXKVzvrBZA?3xC@l7kQhI}$A{I!T^Lx_VIy`t%Qr=3C>ZY;EjHm%JP=)KJ z%ewb$WJW{rk|Up<-2-pQ3Fwol$4Y#~6X2`sQL)?I%Oqf#rc5BXwGepm-55A~!_ zYv+2W^dux6un6`Gl$)44LyyRapCk<b}M)i)9kTo0Xh47udnpE!^RE8e$>6d(FBN? zz!roI7iV?H*;Y7(hY0+=R|5g@{;Hy|F5XjMumL}u!Gyp9+Ss4Tdt)Uj>W&fF*m3Y_ z0wEq;YaXQmKQ9;D-_Ka9Wvt(I@f`U130$jG{mz#BVpunK0_j+HO9v)ie@y*$EbYsX zotT3j$CJC*jM5@#^Y}!U_7+{1HCQX=BOT{#RSUdSwm9Xe&Ea+OOA1#{ofz*f;iRgT zCB0HglMDFMD63l7A&Ap%%J9lJau%>|~%j1xet`HVDf^Q>R6S&Pp#_%EddD@-O*j zv;{<_JRGBprGTj1vV(oNNVcu9mx zJwM(0BvwQS%k^72IJ*bK892pEE}E{6NDYkh^QMeaGtb}o&^jT!q)c6NY~%S(tf*J7+~BceaP<$@pAuCs%$#6)4S9sP?<2Wdzy!0+ z_3EGl`G2ByxF(z1YC+N!&Q>(zd%E{>LXe^AmyRq=W%98?Sr*vs^hr1O75M0@U+;G$ROTBbUSPd> zFpzqXm+5J`WcnMrIQm7CNOD_+morxWVZ^4JF6-9`LTtZCryUo5CopY{q|g3_>; z1FrQO7XV3s!K0vZ+0aU|clJ$>#9=NQWwssoJrv?atSsT`GxGRr)5na(oYpcSGT|~U z0oaY6QkH$aPLg*59_?xir!6_6Gyfff3RVAo7YY8$?UBfNdDIH-mrP&=T7bsZAK$W% z)<1TQ@^1~c#~*h&w4|6{G(I0`IhZFA#vYHOWYxLUqmV=?T(c}t4+40^b{HETjBd>k z`Ss(~GW(JxtRwXNH5eLs))i}KH^{b>k$9z!=~NCOU-(ds#ixW*@7W*lKIVH|eUeo+ z8aQT-rLIjWtHSU$Ch8My{C84ljUxI*zJg#%9{Mx~1Pkpfl;}q;9jum5xkhDo%DR4> z9ZkXR>A>AIg;0N4l_h}ggjE#jAAk239>W=>zQyD?yx!$t#DMFRJ#$QtH=40}`3VZ9 zcxu@A8iC^W^~lYXt;7bOq@VsUqfj5vM|W^ipOj{aVCQlPB2lYYFI?7=EU!=O_bW1X z!E?24^KV;19FR*Aw3zlnXPf^smBDxeZBcez z8k_y9l?z(x!_gU!bQqD}VU)bGMzW98(%E;T6tZR}u*u|b+YjdpK2x*>XDUUtYyH)_ z@KqkHVkoTquc&T9H8veEI}J-v&dM-*eBED2dg^Q!wtlY#lMfp0ccFmhbm3x`iaAuz zFY|GezTBtW5mT)z9p*EDV~cgg zh=%83p1Wz8ite|oa)DfO!CBDip{LE;D#E$?y~2o!n@e+<5}W#j3&riRYu!{>a<2F8 z=IK4PwXy?n`I_yI7SiPBYi#WEYe;rW)&{^no|#r%Un7#JbsLMNHxn{}FOB+~vmyOJ zvJ8ytX(sV$)?AMW-q$&i&bu3qgcD9@)zvBM`aQA}z~Sg*NA5T4^@ir|23Lvi=bM5b z{wF^~&f7LuYnn+qkL9zI+9u!Hu()^4fF>V2=B>D);-~es^@(0*RwcMRWKYbCM);=cTFb^XZczYaGgb;M z;O--N7WT~bQb{g7k-<^AfY9kNST-VS>Q;0HfNh-8MVqwG)_?jn`e?S(eS(i~J*}US zhs)sk3t3w0an*ujga=V zOmcRo{$#X{?DxY}BUDF3H6Kp;0!l1@1LbL=64dl+_D{bdwg4W0@+>u)yL zOrvF?GEVboVaqJUUwc3rA*-p@lQ)Gy16a2aE$2)^>1GJ?d8$vcB-Obr zJK%ls&F!FMOx8CUHUh%XS@7i2{Ql&Ymhdaz=s^H>J>It=C}u1fvr%SayA|&+Pa`17 z?|5nkihk(s-FKk>VgB-3&8(@3!M5oGra&?ibAsF)L1t*?{Nyh=8yvYteImjcE`|tr zJ3B+R{;``w>*(=kX^95_``G_m85Ll~X9DyEI+{CZtB1(R&~0!}P;rMh#2s{YhJ!&fQ7vspG&Erk2Gw4rcHN(=Oo(Dln>|pyDzdm2wCe2n3jL8i?@r z8kKz^HZ>E{nr9t1(yq(bAK#k`3y#zEuL;s0@~cfOArJkB7+ulPsclG=)TeGFnH zoK#jBl%#(cChVUK1C9|5T8AUj8D`U+4_&Ct>ix)mGo33E?F0A`-tBPQ4D9g-ke49R z?RX@XVhNqnx#M`NTMb)b z-U9nVRf$P<^llK~KP0gR-pW7*z-M8UtpCoOvIVC@F0er5_)>@9g!Cm zQQvKfbr6}a&jz^THe<=d!*%N5FZMHumyZmtvoIl@l2Nc2(EGaz4M=AT+9Rq+=x7(=B~c}1$K+3w zy5BT*VdPI(pfIhUneGN~`Vcc0_IPj9( zZpc(UaA1vC6t70NYwn1v+ASiD+~LJ)r5j)Q~z zmq`UgN(NqC4HT{s_}%gjV1&2W)^C`Ys@a*`YfrV^-9Lw{}XU}lEbl3RQ7TWkJ~zWK-FnKd*!Q> zRc(Up0!Z8`H5-o=GCzrH^D|@fUI$Z!nnrfm2{qmOTXhHO1IkqeAJnbYtF5ydWs<3} zm+O9?)%!D0u1{&fx4|$MH$g9IFru3WL$oaY-IljTX~~6q8k{^8_B%s-<(ka4HT*bSkA6fTNQs!#5+%PJH zKYxqC>oRy6cxf+g%H@aDG$$AAbrl3Dt2rcdf_#0=cX}l3i#XFee{IUj!$-OMQ7Z8U zuXk!V2B0wuPTD_{nLe+c?t&G=Y{1K~PJ_v9FrSx)CN;)akXc>#gP^!1+>6ixCql4klFh)?uy&(mfPDD3+$Gb5eRbC zI)O}zO?{Yg_IHur(R36oA!r|^q7)mYn--YsVwGv1U>c*xoJ~LLTZo3-%!zxRcG_5n zV8?`YOoII?)!1rE0o+;;Vit_X;v8U5 zfoz_>2GjFv*9kw-F!54a*muDMZT3UV!GVlsa0&{?)qqFt5?Dyaie>c-+nHkJUmx%$Q9IUrH#c&Aa!`)zzW5{I$fPoJ#vzbg^Gx z#Bt^9-4eHoU^loBP2#rKksMen)J)6ezmFVn+v=ZJS~#f5`5Tp#gL;Ey)6$d_7Hxu5 z0uZrPN5!Xdg4&Qyanj)pm7~%j(%K|(&S$F(!PH9FgeQ!`S?1buJ7uU<$Y^FDnsPwE zAbVl%U^2+%oCn{KlZA6+fpdP>vrcekf}nSrmr^^@8%0JDg_+(I`o!6wscBazccSSU z829usn;oty6h))EkDQgIjjXh5$(na2V*_%XH8sl?A(TFGJ~KWeWgL1MiCo3#-b$0y za6}rq;A9uNFu@wxnjD^O)sS;kf8-1ua26f5DJ>0TAozwXJhCnM*O*bWG?IH;Iju>wAfG+>+Ugdb^-FCkQM_pe zHQ#&Ud{i;x2n3!BHpd@sv^-spn3i_aGUAzHhQaf+q1{=~)aYQp-aa?qI6`IEasIYI zSn;?5R3e~<{8TJbyu(F|gmErD{+g1f#jGWm%@3?jH82}`A75ID;G_IrKpBTsrg%C!XA6R-Fe`W;Z zNd~SWlo1^?#7N?NWm{JG2NrtfvY}KNL9cEEZCxDF(rH3;UbaK3mnb-_$(nr)Ig%kmog0?eHR=x{q*_$ z=Wld&`=|EQl;BF#$`j*yVthWQbDRnp12NRN`WPe{;z0U{&<)zFT=26fD^ajVQ3Yk% zdwzabn~g>%^zJspH&`ltA-b1N!o*>zQS0oOly zp)?`1K9YCemRg2%_YVC*DQHB@TzB8{nC?=i*;p3X2#Og^dIl$FjXeq*9MaL}1=`|_ zQB&--aq^##H<;^PAC0knVD|8w6HYm$W-1aIy`eHWNmq->&*hLbv%!lC^D7;dZ>0K{ zT=VHp@{Hm3l)Nq?Xy>>uO?A}l^eba;14P=SAeZ>ofoRL@k5UH{SU}4R_cZx%&9eFV zZ7|DKtIZ`>N$k_5Jd9GU<%P!k?}(N-*txyU&RvWaI3hBS&o50wK1r~=II=vQ8$BAI zB>MS&JjlBx65z?&K%hK*nz_7(^F||3UVKthyI!*0W`=a#_RJ3v=F*u*)-+;lTUw6w z2nVz-afVjjiESMrjHOrDaLQ!7G;L{AT5Y0^M*zd3BigYsAhJotr&A=ISY|>R(2v4u z81*ShC4dtSTlr4|{faWg-l|t7;S_RAL9j&5D$y|KD`TSz24zo>H` zcL<%UznN$10tLTvtgO>LSBuxrulQ^L>x6p{@)VWEb)v;>0)(alk4uhEjPvs%+Clj@6ABPBZ>wC*$@aqqi1EL<1sZ2G+D?N4WE@nrtGd*K}Dd zxma0Mpllam(}Tai9LvH^vtU^jD%O_mh1{j~QQEjiBo|E)C6EoN0ZW+DN!!%=$UdO+ z*=8?I{!ru?PwjJoSYi;6b+;({mBjRja6r+(PI`ER)@nU1cf2DRa@fzAJv z2gQcvYXv(?!8v)X4g`CI2V8{9e6El?$QjD{%d^QXgeqmVB)ugUSh|jL#I*F52G6h) zWOsHjsvqwnQyFFp>hqV)Uog60zYV@1|)_S_IA(UX>W*- z2x~}Gnnd!bnQlw5nc7Woosz>5CAzELxRj zj0nPIc;1+r!FA6cep5)M3ynV;+1By0tc0;q~?Q(`! zCe@+s_^A&;uT`^|E8PK$jz#KFwX-Bv{b*0TTzj%dmzGNxR;xO_UP@%f;O z+RDMsN?YGv?!cPx;?Ws1A3QR)>oQO(r>u=8SR=_ZTqJ4YEPZOL(FYkEkfq6#%{Oe_ zW^hgHrpt%MAWyRm!ffq_295B6mxCW9;IBCab|+rJ`!GfR+!Z%Tp;HtW$e z@-d~kX=SwqJPa_`p+^g5sJQxPByaT188*7VT2l6LiF8Y@_ioK9r7ucEhJIQZ@KeH5 zV?_F@CG!>G6#QBrbS&6kxHFjI$=fDFi?FVEl_v~MZ9iJ#uG}t#@?)}3Z`}=*QYwIx zhf8<5Zqbm@Gl2l?*TmkiX(nsvEPf2|xQQfy?G2QX z4>E~}u2eeAViAeG1Qy*n3)vwSvHAKn5UK-JDnf1CJHN21A4 zo+G1~Q|y)?2lmB@;LCt>?Kn&I{MUbdn5(R`Y+l-hvSeu9aSW||KGgMvAIl{;4_8ov zL?4`GL(;hWR@Ycw1G2ad!WSxTB=ZGtg0V6Wd=486ohAGLnEFiQZHLC15nMbI=m1Eq zNzO+;8&YyYVH@`J#kGvoL1LZ(mkuFnHdNZYVnl$N;qUMd93tl)E@kb^?u;!-bmh^| zsbKliJ=zxN8H-=kqoy=%ArmRNgn|p`OLD6{K)l@1HSs$0moSPR9v;*Vx5XxOP40Ph zAh_2G>{)B4vIc$uc4dc8kB^M!iaxzZ*p%p@yfo9aufOs5F$k>f|scTgAo@O17?kjMa`|^eK~T` zD$cdJp^xK0E|n{pn?v`rFVr5LzcD{uDa)_05fEigv-LOfnp^iwQ(tu8#Iux z$0+dmp@^}4^#%4QV^gzWQRmP}TQ{l4PMtZ2O~J%V^mRGs%Xxojdr)DY=}LE={H{)U zGYh$UdB0~6|FV%W#Xp3x6#*6?;am@z#>KeGxx5m6z*jztGUjwIKt#;LAyP;U5`dh8 zXl%s=@s=Y!HhB)<9Rl~%t4$@CF)WF8${!2@d1liGzvzmp1n+g`bQi0;3iry1wx=)d zk{6q-*;^R!(^!H}sU(-J$ z-UH+1^J`nzP2wQCIgFm0edjc^$u#oJK#rYf>FzMAeIt^JzftJlI~j`j>BBBUH=z|x zO9e``*C@^1=V!RyZ&i*+MdO}{q1K&>=xR95BQrLFCPKD36p=C9rwycD#pU6<>5s9! zzcb!IumO%!v}7rlLx&7v<7-9=GWw`lO0N<>-ur}0g)e7!fg z-td#j#-Xf^Qw0*+atUwDhpUlG(Rs|ykiK6Fj%eye)!IOLi(X5Q$))Hzo(iZkAOMgcP+kZwa;5LB@%-R6BFMMd_yH)=dyG?L>0B)lr9n>e~gQaGZ{kRTz14i-1X@|rSSHy`4 zn7W$ZPRs)Q9{@x^yT8=+&Sg^4)=JM_H@*?@i|C}$k@QSq15+3~-qHD|s*;lwF5Mt5 zjD0anMWX$hPU>JjxOB&+%<71&VAU+Onr6yF1hQAI`^)Oc^XU>o2(n3U~IXee1 zDAvPWNq}JWU<1%^>g;I0q0{2sPE3?}@nBXKi^bR-bzLUyfOmT^1vd?2H>Dm!Sx;~G z*tCJ=($?-hmdh|efG*bXJ26D?EX%K;U4le`PN#2khQtz1DkvX0(*y0o>x4Jr4=yCk zl0f?}Sj6uerl-_^rPTUGT!&q~p_*+ATgILvwppkYU&h!P;0_h6e-qkZZJ zWf@p!#0o78ixx!7v4BHB2vYzPd-t=^SvA@X@5j3%Fm`j%STH2+7f`>mm+jc=-WhY1Nnun9h-1u!|hv$M?R z!{M5Lmo;yupS{mgC#F^+jAqNb|C2^)Idyi<�eE)a;%s!9RIes=^5T=eX*?18PKDqd&1Coy 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

+

+ + Alamofire 5.8.1 Docs + + (97% documented) +

+ +
+
+ +
+
+ +

+ + GitHub + View on GitHub + +

+ +

+ + Dash + Install in Dash + +

+
+ + + +
+ +
+ +
+
+ +

Alamofire: Elegant Networking in Swift

+ +

Swift +Platforms +CocoaPods Compatible +Carthage Compatible +Swift Package Manager +Swift Forums

+ +

Alamofire is an HTTP networking library written in Swift.

+ + +

Features

+ +
    +
  • [x] Chainable Request / Response Methods
  • +
  • [x] Swift Concurrency Support Back to iOS 13, macOS 10.15, tvOS 13, and watchOS 6.
  • +
  • [x] Combine Support
  • +
  • [x] URL / JSON Parameter Encoding
  • +
  • [x] Upload File / Data / Stream / MultipartFormData
  • +
  • [x] Download File using Request or Resume Data
  • +
  • [x] Authentication with URLCredential
  • +
  • [x] HTTP Response Validation
  • +
  • [x] Upload and Download Progress Closures with Progress
  • +
  • [x] cURL Command Output
  • +
  • [x] Dynamically Adapt and Retry Requests
  • +
  • [x] TLS Certificate and Public Key Pinning
  • +
  • [x] Network Reachability
  • +
  • [x] Comprehensive Unit and Integration Test Coverage
  • +
  • [x] Complete Documentation
  • +
+

Write Requests Fast!

+ +

Alamofire’s compact syntax and extensive feature set allow requests with powerful features like automatic retry to be written in just a few lines of code.

+
// Automatic String to URL conversion, Swift concurrency support, and automatic retry.
+let response = await AF.request("https://httpbin.org/get", interceptor: .retryPolicy)
+                       // Automatic HTTP Basic Auth.
+                       .authenticate(username: "user", password: "pass")
+                       // Caching customization.
+                       .cacheResponse(using: .cache)
+                       // Redirect customization.
+                       .redirect(using: .follow)
+                       // Validate response code and Content-Type.
+                       .validate()
+                       // Produce a cURL command for the request.
+                       .cURLDescription { description in
+                         print(description)
+                       }
+                       // Automatic Decodable support with background parsing.
+                       .serializingDecodable(DecodableType.self)
+                       // Await the full response with metrics and a parsed body.
+                       .response
+// Detailed response description for easy debugging.
+debugPrint(response)
+
+

Component Libraries

+ +

In order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the Alamofire Software Foundation to bring additional functionality to the Alamofire ecosystem.

+ +
    +
  • AlamofireImage - An image library including image response serializers, UIImage and UIImageView extensions, custom image filters, an auto-purging in-memory cache, and a priority-based image downloading system.
  • +
  • AlamofireNetworkActivityIndicator - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support URLSession instances not managed by Alamofire.
  • +
+

Requirements

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformMinimum Swift VersionInstallationStatus
iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+5.6CocoaPods, Carthage, Swift Package Manager, ManualFully Tested
LinuxLatest OnlySwift Package ManagerBuilding But Unsupported
WindowsLatest OnlySwift Package ManagerBuilding But Unsupported
AndroidLatest OnlySwift Package ManagerBuilding But Unsupported
+

Known Issues on Linux and Windows

+ +

Alamofire builds on Linux, Windows, and Android but there are missing features and many issues in the underlying swift-corelibs-foundation that prevent full functionality and may cause crashes. These include:

+ +
    +
  • ServerTrustManager and associated certificate functionality is unavailable, so there is no certificate pinning and no client certificate support.
  • +
  • Various methods of HTTP authentication may crash, including HTTP Basic and HTTP Digest. Crashes may occur if responses contain server challenges.
  • +
  • Cache control through CachedResponseHandler and associated APIs is unavailable, as the underlying delegate methods aren’t called.
  • +
  • URLSessionTaskMetrics are never gathered.
  • +
+ +

Due to these issues, Alamofire is unsupported on Linux, Windows, and Android. Please report any crashes to the Swift bug reporter.

+

Migration Guides

+ + +

Communication

+ + +

Installation

+

CocoaPods

+ +

CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate Alamofire into your Xcode project using CocoaPods, specify it in your Podfile:

+
pod 'Alamofire'
+
+

Carthage

+ +

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate Alamofire into your Xcode project using Carthage, specify it in your Cartfile:

+
github "Alamofire/Alamofire"
+
+

Swift Package Manager

+ +

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler.

+ +

Once you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the dependencies value of your Package.swift.

+
dependencies: [
+    .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "5.8.1"))
+]
+
+

Manually

+ +

If you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.

+

Embedded Framework

+ +
    +
  • Open up Terminal, cd into your top-level project directory, and run the following command “if” your project is not initialized as a git repository:
  • +
+
  $ git init
+
+ +
    +
  • Add Alamofire as a git submodule by running the following command:
  • +
+
  $ git submodule add https://github.com/Alamofire/Alamofire.git
+
+ +
    +
  • Open the new Alamofire folder, and drag the Alamofire.xcodeproj into the Project Navigator of your application’s Xcode project.
  • +
+ +
+

It should appear nested underneath your application’s blue project icon. Whether it is above or below all the other Xcode groups does not matter.

+
+ +
    +
  • Select the Alamofire.xcodeproj in the Project Navigator and verify the deployment target matches that of your application target.
  • +
  • Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the “Targets” heading in the sidebar.
  • +
  • In the tab bar at the top of that window, open the “General” panel.
  • +
  • Click on the + button under the “Embedded Binaries” section.
  • +
  • You will see two different Alamofire.xcodeproj folders each with two different versions of the Alamofire.framework nested inside a Products folder.
  • +
+ +
+

It does not matter which Products folder you choose from, but it does matter whether you choose the top or bottom Alamofire.framework.

+
+ +
    +
  • Select the top Alamofire.framework for iOS and the bottom one for macOS.
  • +
+ +
+

You can verify which one you selected by inspecting the build log for your project. The build target for Alamofire will be listed as Alamofire iOS, Alamofire macOS, Alamofire tvOS, or Alamofire watchOS.

+
+ +
    +
  • And that’s it!
  • +
+ +
+

The Alamofire.framework is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.

+
+

Contributing

+ +

Before contributing to Alamofire, please read the instructions detailed in our contribution guide.

+

Open Radars

+ +

The following radars have some effect on the current implementation of Alamofire.

+ +
    +
  • rdar://21349340 - Compiler throwing warning due to toll-free bridging issue in the test case
  • +
  • rdar://26870455 - Background URL Session Configurations do not work in the simulator
  • +
  • rdar://26849668 - Some URLProtocol APIs do not properly handle URLRequest
  • +
+

Resolved Radars

+ +

The following radars have been resolved over time after being filed against the Alamofire project.

+ +
    +
  • rdar://26761490 - Swift string interpolation causing memory leak with common usage. + +
      +
    • (Resolved): 9/1/17 in Xcode 9 beta 6.
    • +
  • +
  • rdar://36082113 - URLSessionTaskMetrics failing to link on watchOS 3.0+ + +
      +
    • (Resolved): Just add CFNetwork to your linked frameworks.
    • +
  • +
  • FB7624529 - urlSession(_:task:didFinishCollecting:) never called on watchOS + +
      +
    • (Resolved): Metrics now collected on watchOS 7+.
    • +
  • +
+

FAQ

+

What’s the origin of the name Alamofire?

+ +

Alamofire is named after the Alamo Fire flower, a hybrid variant of the Bluebonnet, the official state flower of Texas.

+

Credits

+ +

Alamofire is owned and maintained by the Alamofire Software Foundation. You can follow them on Twitter at @AlamofireSF for project updates and releases.

+

Security Disclosure

+ +

If you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.

+

Sponsorship

+ +

The ASF is looking to raise money to officially stay registered as a federal non-profit organization. +Registering will allow Foundation members to gain some legal protections and also allow us to put donations to use, tax-free. +Sponsoring the ASF will enable us to:

+ +
    +
  • Pay our yearly legal fees to keep the non-profit in good status
  • +
  • Pay for our mail servers to help us stay on top of all questions and security issues
  • +
  • Potentially fund test servers to make it easier for us to test the edge cases
  • +
  • Potentially fund developers to work on one of our projects full-time
  • +
+ +

The community adoption of the ASF libraries has been amazing. +We are greatly humbled by your enthusiasm around the projects and want to continue to do everything we can to move the needle forward. +With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. +If you use any of our libraries for work, see if your employers would be interested in donating. +Any amount you can donate, whether once or monthly, to help us reach our goal would be greatly appreciated.

+ +

Sponsor Alamofire

+

Supporters

+ +

MacStadium provides Alamofire with a free, hosted Mac mini.

+ +

Powered by MacStadium

+

License

+ +

Alamofire is released under the MIT license. See LICENSE for details.

+ +
+
+ + +
+
+ + + diff --git a/Carthage/Checkouts/Alamofire/docs/js/jazzy.js b/Carthage/Checkouts/Alamofire/docs/js/jazzy.js new file mode 100755 index 00000000..19844166 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/Carthage/Checkouts/Alamofire/docs/js/jazzy.search.js b/Carthage/Checkouts/Alamofire/docs/js/jazzy.search.js new file mode 100644 index 00000000..359cdbb8 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/Carthage/Checkouts/Alamofire/docs/js/jquery.min.js b/Carthage/Checkouts/Alamofire/docs/js/jquery.min.js new file mode 100755 index 00000000..7f37b5d9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/Carthage/Checkouts/Alamofire/docs/js/typeahead.jquery.js b/Carthage/Checkouts/Alamofire/docs/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/docs/search.json b/Carthage/Checkouts/Alamofire/docs/search.json new file mode 100644 index 00000000..bbc49739 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:9Alamofire10Parametersa":{"name":"Parameters","abstract":"

A dictionary of parameters to apply to a URLRequest.

"},"Typealiases.html#/s:9Alamofire12AdaptHandlera":{"name":"AdaptHandler","abstract":"

RequestAdapter closure definition.

"},"Typealiases.html#/s:9Alamofire12RetryHandlera":{"name":"RetryHandler","abstract":"

RequestRetrier closure definition.

"},"Typealiases.html#/s:9Alamofire14AFDataResponsea":{"name":"AFDataResponse","abstract":"

Default type of DataResponse returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire18AFDownloadResponsea":{"name":"AFDownloadResponse","abstract":"

Default type of DownloadResponse returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire8AFResulta":{"name":"AFResult","abstract":"

Default type of Result returned by Alamofire, with an AFError Failure type.

"},"Typealiases.html#/s:9Alamofire17DisabledEvaluatora":{"name":"DisabledEvaluator","abstract":"

Disables all evaluation which in turn will always consider any server trust as valid.

"},"Structs/StringStreamSerializer.html#/s:9Alamofire22StringStreamSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"StringStreamSerializer"},"Structs/StringStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"StringStreamSerializer"},"Structs/PassthroughStreamSerializer.html#/s:9Alamofire27PassthroughStreamSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"PassthroughStreamSerializer"},"Structs/PassthroughStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"PassthroughStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV7decoderAA11DataDecoder_pvp":{"name":"decoder","abstract":"

DataDecoder used to decode incoming Data.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV16dataPreprocessorAA04DataF0_pvp":{"name":"dataPreprocessor","abstract":"

DataPreprocessor incoming Data is passed through before being passed to the DataDecoder.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire25DecodableStreamSerializerV7decoder16dataPreprocessorACyxGAA11DataDecoder_p_AA0hG0_ptcfc":{"name":"init(decoder:dataPreprocessor:)","abstract":"

Creates an instance with the provided DataDecoder and DataPreprocessor.

","parent_name":"DecodableStreamSerializer"},"Structs/DecodableStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","parent_name":"DecodableStreamSerializer"},"Structs/Empty.html#/s:9Alamofire5EmptyV5valueACvpZ":{"name":"value","abstract":"

Static Empty instance used for all Empty responses.

","parent_name":"Empty"},"Structs/Empty.html#/s:9Alamofire13EmptyResponseP10emptyValuexyFZ":{"name":"emptyValue()","parent_name":"Empty"},"Structs/URLResponseSerializer.html#/s:9Alamofire21URLResponseSerializerVACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"URLResponseSerializer"},"Structs/URLResponseSerializer.html#/s:9Alamofire34DownloadResponseSerializerProtocolP09serializeB07request8response7fileURL5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0J0VSgs5Error_pSgtKF":{"name":"serializeDownload(request:response:fileURL:error:)","parent_name":"URLResponseSerializer"},"Structs/GoogleXSSIPreprocessor.html#/s:9Alamofire22GoogleXSSIPreprocessorVACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"GoogleXSSIPreprocessor"},"Structs/GoogleXSSIPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","parent_name":"GoogleXSSIPreprocessor"},"Structs/PassthroughPreprocessor.html#/s:9Alamofire23PassthroughPreprocessorVACycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"PassthroughPreprocessor"},"Structs/PassthroughPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","parent_name":"PassthroughPreprocessor"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

The URL request sent to the server.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

The server’s response to the URL request.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7fileURL10Foundation0E0VSgvp":{"name":"fileURL","abstract":"

The final destination URL of the data returned from the server after it is moved.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV10resumeData10Foundation0E0VSgvp":{"name":"resumeData","abstract":"

The resume data generated if the request was cancelled.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

The final metrics of the response.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV21serializationDurationSdvp":{"name":"serializationDuration","abstract":"

The time taken to serialize the response.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV6results6ResultOyxq_Gvp":{"name":"result","abstract":"

The result of response serialization.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV5valuexSgvp":{"name":"value","abstract":"

Returns the associated value of the result if it is a success, nil otherwise.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV5errorq_Sgvp":{"name":"error","abstract":"

Returns the associated error value if the result if it is a failure, nil otherwise.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV7request8response7fileURL10resumeData7metrics21serializationDuration6resultACyxq_G10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAL0G0VSgAL0I0VSgSo23NSURLSessionTaskMetricsCSgSds6ResultOyxq_Gtcfc":{"name":"init(request:response:fileURL:resumeData:metrics:serializationDuration:result:)","abstract":"

Creates a DownloadResponse instance with the specified parameters derived from response serialization.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV11descriptionSSvp":{"name":"description","abstract":"

The textual representation used when written to an output stream, which includes whether the result was a","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV16debugDescriptionSSvp":{"name":"debugDescription","abstract":"

The debug textual representation used when written to an output stream, which includes the URL request, the URL","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV3mapyACyqd__q_Gqd__xXElF":{"name":"map(_:)","abstract":"

Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV6tryMapyACyqd__s5Error_pGqd__xKXElF":{"name":"tryMap(_:)","abstract":"

Evaluates the given closure when the result of this DownloadResponse is a success, passing the unwrapped","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV8mapErroryACyxqd__Gqd__q_XEs0E0Rd__lF":{"name":"mapError(_:)","abstract":"

Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DownloadResponse"},"Structs/DownloadResponse.html#/s:9Alamofire16DownloadResponseV11tryMapErroryACyxs0F0_pGqd__q_KXEsAERd__lF":{"name":"tryMapError(_:)","abstract":"

Evaluates the specified closure when the DownloadResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DownloadResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

The URL request sent to the server.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

The server’s response to the URL request.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV4data10Foundation0B0VSgvp":{"name":"data","abstract":"

The data returned by the server.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

The final metrics of the response.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV21serializationDurationSdvp":{"name":"serializationDuration","abstract":"

The time taken to serialize the response.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV6results6ResultOyxq_Gvp":{"name":"result","abstract":"

The result of response serialization.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV5valuexSgvp":{"name":"value","abstract":"

Returns the associated value of the result if it is a success, nil otherwise.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV5errorq_Sgvp":{"name":"error","abstract":"

Returns the associated error value if the result if it is a failure, nil otherwise.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV7request8response4data7metrics21serializationDuration6resultACyxq_G10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgSo23NSURLSessionTaskMetricsCSgSds6ResultOyxq_Gtcfc":{"name":"init(request:response:data:metrics:serializationDuration:result:)","abstract":"

Creates a DataResponse instance with the specified parameters derived from the response serialization.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV11descriptionSSvp":{"name":"description","abstract":"

The textual representation used when written to an output stream, which includes whether the result was a","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV16debugDescriptionSSvp":{"name":"debugDescription","abstract":"

The debug textual representation used when written to an output stream, which includes (if available) a summary","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV3mapyACyqd__q_Gqd__xXElF":{"name":"map(_:)","abstract":"

Evaluates the specified closure when the result of this DataResponse is a success, passing the unwrapped","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV6tryMapyACyqd__s5Error_pGqd__xKXElF":{"name":"tryMap(_:)","abstract":"

Evaluates the given closure when the result of this DataResponse is a success, passing the unwrapped result","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV8mapErroryACyxqd__Gqd__q_XEs0E0Rd__lF":{"name":"mapError(_:)","abstract":"

Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DataResponse"},"Structs/DataResponse.html#/s:9Alamofire12DataResponseV11tryMapErroryACyxs0F0_pGqd__q_KXEsAERd__lF":{"name":"tryMapError(_:)","abstract":"

Evaluates the specified closure when the DataResponse is a failure, passing the unwrapped error as a parameter.

","parent_name":"DataResponse"},"Structs/RequestAdapterState.html#/s:9Alamofire19RequestAdapterStateV9requestID10Foundation4UUIDVvp":{"name":"requestID","abstract":"

The UUID of the Request associated with the URLRequest to adapt.

","parent_name":"RequestAdapterState"},"Structs/RequestAdapterState.html#/s:9Alamofire19RequestAdapterStateV7sessionAA7SessionCvp":{"name":"session","abstract":"

The Session associated with the URLRequest to adapt.

","parent_name":"RequestAdapterState"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO5erroryA2EmF":{"name":"error","abstract":"

Throws a DuplicateHeaderError. The default.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO7replaceyA2EmF":{"name":"replace","abstract":"

Replaces the existing header value with deflate.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html#/s:9Alamofire24DeflateRequestCompressorV23DuplicateHeaderBehaviorO4skipyA2EmF":{"name":"skip","abstract":"

Silently skips compression when the header exists.

","parent_name":"DuplicateHeaderBehavior"},"Structs/DeflateRequestCompressor/DuplicateHeaderBehavior.html":{"name":"DuplicateHeaderBehavior","abstract":"

Type that determines the action taken when the URLRequest already has a Content-Encoding header.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV20DuplicateHeaderErrorV":{"name":"DuplicateHeaderError","abstract":"

Error produced when the outgoing URLRequest already has a Content-Encoding header, when the instance has","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV23duplicateHeaderBehaviorAC09DuplicatefG0Ovp":{"name":"duplicateHeaderBehavior","abstract":"

Behavior to use when the outgoing URLRequest already has a Content-Encoding header.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV22shouldCompressBodyDataySb10Foundation0H0Vcvp":{"name":"shouldCompressBodyData","abstract":"

Closure which determines whether the outgoing body data should be compressed.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire24DeflateRequestCompressorV23duplicateHeaderBehavior22shouldCompressBodyDataA2C09DuplicatefG0O_Sb10Foundation0K0Vctcfc":{"name":"init(duplicateHeaderBehavior:shouldCompressBodyData:)","abstract":"

Creates an instance with the provided parameters.

","parent_name":"DeflateRequestCompressor"},"Structs/DeflateRequestCompressor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"DeflateRequestCompressor"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO6followyA2EmF":{"name":"follow","abstract":"

Follow the redirect as defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO11doNotFollowyA2EmF":{"name":"doNotFollow","abstract":"

Do not follow the redirect defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html#/s:9Alamofire10RedirectorV8BehaviorO6modifyyAE10Foundation10URLRequestVSgSo16NSURLSessionTaskC_AISo17NSHTTPURLResponseCtccAEmF":{"name":"modify(_:)","abstract":"

Modify the redirect request defined in the response.

","parent_name":"Behavior"},"Structs/Redirector/Behavior.html":{"name":"Behavior","abstract":"

Defines the behavior of the Redirector type.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV6followACvpZ":{"name":"follow","abstract":"

Returns a Redirector with a .follow Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV11doNotFollowACvpZ":{"name":"doNotFollow","abstract":"

Returns a Redirector with a .doNotFollow Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV8behaviorAC8BehaviorOvp":{"name":"behavior","abstract":"

The Behavior of the Redirector.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire10RedirectorV8behaviorA2C8BehaviorO_tcfc":{"name":"init(behavior:)","abstract":"

Creates a Redirector instance from the Behavior.

","parent_name":"Redirector"},"Structs/Redirector.html#/s:9Alamofire15RedirectHandlerP4task_18willBeRedirectedTo3for10completionySo16NSURLSessionTaskC_10Foundation10URLRequestVSo17NSHTTPURLResponseCyALSgctF":{"name":"task(_:willBeRedirectedTo:for:completion:)","parent_name":"Redirector"},"Structs/JSONEncoding/Error.html#/s:9Alamofire12JSONEncodingV5ErrorO17invalidJSONObjectyA2EmF":{"name":"invalidJSONObject","abstract":"

Undocumented

","parent_name":"Error"},"Structs/JSONEncoding/Error.html#/s:9Alamofire12JSONEncodingV5ErrorO20localizedDescriptionSSvp":{"name":"localizedDescription","abstract":"

Undocumented

","parent_name":"Error"},"Structs/JSONEncoding/Error.html":{"name":"Error","abstract":"

Undocumented

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7defaultACvpZ":{"name":"default","abstract":"

Returns a JSONEncoding instance with default writing options.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV13prettyPrintedACvpZ":{"name":"prettyPrinted","abstract":"

Returns a JSONEncoding instance with .prettyPrinted writing options.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7optionsSo20NSJSONWritingOptionsVvp":{"name":"options","abstract":"

The options for writing the parameters as JSON data.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV7optionsACSo20NSJSONWritingOptionsV_tcfc":{"name":"init(options:)","abstract":"

Creates an instance using the specified WritingOptions.

","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","parent_name":"JSONEncoding"},"Structs/JSONEncoding.html#/s:9Alamofire12JSONEncodingV6encode_14withJSONObject10Foundation10URLRequestVAA0G11Convertible_p_ypSgtKF":{"name":"encode(_:withJSONObject:)","abstract":"

Encodes any JSON compatible object into a URLRequest.

","parent_name":"JSONEncoding"},"Structs/URLEncoding/BoolEncoding.html#/s:9Alamofire11URLEncodingV12BoolEncodingO7numericyA2EmF":{"name":"numeric","abstract":"

Encode true as 1 and false as 0. This is the default behavior.

","parent_name":"BoolEncoding"},"Structs/URLEncoding/BoolEncoding.html#/s:9Alamofire11URLEncodingV12BoolEncodingO7literalyA2EmF":{"name":"literal","abstract":"

Encode true and false as string literals.

","parent_name":"BoolEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO8bracketsyA2EmF":{"name":"brackets","abstract":"

An empty set of square brackets is appended to the key for every value. This is the default behavior.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO10noBracketsyA2EmF":{"name":"noBrackets","abstract":"

No brackets are appended. The key is encoded as is.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO15indexInBracketsyA2EmF":{"name":"indexInBrackets","abstract":"

Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/ArrayEncoding.html#/s:9Alamofire11URLEncodingV13ArrayEncodingO6customyAES2S_SitccAEmF":{"name":"custom(_:)","abstract":"

Provide a custom array key encoding with the given closure.

","parent_name":"ArrayEncoding"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO15methodDependentyA2EmF":{"name":"methodDependent","abstract":"

Applies encoded query string result to existing query string for GET, HEAD and DELETE requests and","parent_name":"Destination"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO11queryStringyA2EmF":{"name":"queryString","abstract":"

Sets or appends encoded query string result to existing query string.

","parent_name":"Destination"},"Structs/URLEncoding/Destination.html#/s:9Alamofire11URLEncodingV11DestinationO8httpBodyyA2EmF":{"name":"httpBody","abstract":"

Sets encoded query string result as the HTTP body of the URL request.

","parent_name":"Destination"},"Structs/URLEncoding/Destination.html":{"name":"Destination","abstract":"

Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the","parent_name":"URLEncoding"},"Structs/URLEncoding/ArrayEncoding.html":{"name":"ArrayEncoding","abstract":"

Configures how Array parameters are encoded.

","parent_name":"URLEncoding"},"Structs/URLEncoding/BoolEncoding.html":{"name":"BoolEncoding","abstract":"

Configures how Bool parameters are encoded.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV7defaultACvpZ":{"name":"default","abstract":"

Returns a default URLEncoding instance with a .methodDependent destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11queryStringACvpZ":{"name":"queryString","abstract":"

Returns a URLEncoding instance with a .queryString destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV8httpBodyACvpZ":{"name":"httpBody","abstract":"

Returns a URLEncoding instance with an .httpBody destination.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11destinationAC11DestinationOvp":{"name":"destination","abstract":"

The destination defining where the encoded query string is to be applied to the URL request.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV13arrayEncodingAC05ArrayD0Ovp":{"name":"arrayEncoding","abstract":"

The encoding to use for Array parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV12boolEncodingAC04BoolD0Ovp":{"name":"boolEncoding","abstract":"

The encoding to use for Bool parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV11destination13arrayEncoding04boolE0A2C11DestinationO_AC05ArrayE0OAC04BoolE0Otcfc":{"name":"init(destination:arrayEncoding:boolEncoding:)","abstract":"

Creates an instance using the specified parameters.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV15queryComponents7fromKey5valueSaySS_SStGSS_yptF":{"name":"queryComponents(fromKey:value:)","abstract":"

Creates a percent-escaped, URL encoded query string components from the given key-value pair recursively.

","parent_name":"URLEncoding"},"Structs/URLEncoding.html#/s:9Alamofire11URLEncodingV6escapeyS2SF":{"name":"escape(_:)","abstract":"

Creates a percent-escaped string following RFC 3986 for a query string key or value.

","parent_name":"URLEncoding"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV7connectACvpZ":{"name":"connect","abstract":"

CONNECT method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV6deleteACvpZ":{"name":"delete","abstract":"

DELETE method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV3getACvpZ":{"name":"get","abstract":"

GET method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV4headACvpZ":{"name":"head","abstract":"

HEAD method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV7optionsACvpZ":{"name":"options","abstract":"

OPTIONS method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5patchACvpZ":{"name":"patch","abstract":"

PATCH method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV4postACvpZ":{"name":"post","abstract":"

POST method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV3putACvpZ":{"name":"put","abstract":"

PUT method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5queryACvpZ":{"name":"query","abstract":"

QUERY method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:9Alamofire10HTTPMethodV5traceACvpZ":{"name":"trace","abstract":"

TRACE method.

","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:SY8rawValue03RawB0Qzvp":{"name":"rawValue","parent_name":"HTTPMethod"},"Structs/HTTPMethod.html#/s:SY8rawValuexSg03RawB0Qz_tcfc":{"name":"init(rawValue:)","parent_name":"HTTPMethod"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV4nameSSvp":{"name":"name","abstract":"

Name of the header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV5valueSSvp":{"name":"value","abstract":"

Value of the header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV4name5valueACSS_SStcfc":{"name":"init(name:value:)","abstract":"

Creates an instance from the given name and value.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV6acceptyACSSFZ":{"name":"accept(_:)","abstract":"

Returns an Accept header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13acceptCharsetyACSSFZ":{"name":"acceptCharset(_:)","abstract":"

Returns an Accept-Charset header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV14acceptLanguageyACSSFZ":{"name":"acceptLanguage(_:)","abstract":"

Returns an Accept-Language header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV14acceptEncodingyACSSFZ":{"name":"acceptEncoding(_:)","abstract":"

Returns an Accept-Encoding header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorization8username8passwordACSS_SStFZ":{"name":"authorization(username:password:)","abstract":"

Returns a Basic Authorization header using the username and password provided.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorization11bearerTokenACSS_tFZ":{"name":"authorization(bearerToken:)","abstract":"

Returns a Bearer Authorization header using the bearerToken provided

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV13authorizationyACSSFZ":{"name":"authorization(_:)","abstract":"

Returns an Authorization header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV18contentDispositionyACSSFZ":{"name":"contentDisposition(_:)","abstract":"

Returns a Content-Disposition header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV15contentEncodingyACSSFZ":{"name":"contentEncoding(_:)","abstract":"

Returns a Content-Encoding header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV11contentTypeyACSSFZ":{"name":"contentType(_:)","abstract":"

Returns a Content-Type header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV9userAgentyACSSFZ":{"name":"userAgent(_:)","abstract":"

Returns a User-Agent header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV21defaultAcceptEncodingACvpZ":{"name":"defaultAcceptEncoding","abstract":"

Returns Alamofire’s default Accept-Encoding header, appropriate for the encodings supported by particular OS","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV21defaultAcceptLanguageACvpZ":{"name":"defaultAcceptLanguage","abstract":"

Returns Alamofire’s default Accept-Language header, generated by querying Locale for the user’s","parent_name":"HTTPHeader"},"Structs/HTTPHeader.html#/s:9Alamofire10HTTPHeaderV16defaultUserAgentACvpZ":{"name":"defaultUserAgent","abstract":"

Returns Alamofire’s default User-Agent header.

","parent_name":"HTTPHeader"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVACycfc":{"name":"init()","abstract":"

Creates an empty instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVyACSayAA10HTTPHeaderVGcfc":{"name":"init(_:)","abstract":"

Creates an instance from an array of HTTPHeaders. Duplicate case-insensitive names are collapsed into the last","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVyACSDyS2SGcfc":{"name":"init(_:)","abstract":"

Creates an instance from a [String: String]. Duplicate case-insensitive names are collapsed into the last name","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV3add4name5valueySS_SStF":{"name":"add(name:value:)","abstract":"

Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV3addyyAA10HTTPHeaderVF":{"name":"add(_:)","abstract":"

Case-insensitively updates or appends the provided HTTPHeader into the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6update4name5valueySS_SStF":{"name":"update(name:value:)","abstract":"

Case-insensitively updates or appends an HTTPHeader into the instance using the provided name and value.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6updateyyAA10HTTPHeaderVF":{"name":"update(_:)","abstract":"

Case-insensitively updates or appends the provided HTTPHeader into the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6remove4nameySS_tF":{"name":"remove(name:)","abstract":"

Case-insensitively removes an HTTPHeader, if it exists, from the instance.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV4sortyyF":{"name":"sort()","abstract":"

Sort the current instance by header name, case insensitively.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV6sortedACyF":{"name":"sorted()","abstract":"

Returns an instance sorted by header name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV5value3forSSSgSS_tF":{"name":"value(for:)","abstract":"

Case-insensitively find a header’s value by name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersVySSSgSScip":{"name":"subscript(_:)","abstract":"

Case-insensitively access the header with the given name.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV10dictionarySDyS2SGvp":{"name":"dictionary","abstract":"

The dictionary representation of all headers.

","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s30ExpressibleByDictionaryLiteralP010dictionaryD0x3KeyQz_5ValueQztd_tcfc":{"name":"init(dictionaryLiteral:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s25ExpressibleByArrayLiteralP05arrayD0x0cD7ElementQzd_tcfc":{"name":"init(arrayLiteral:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:ST12makeIterator0B0QzyF":{"name":"makeIterator()","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:Sl5index5after5IndexQzAD_tF":{"name":"index(after:)","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"HTTPHeaders"},"Structs/HTTPHeaders.html#/s:9Alamofire11HTTPHeadersV7defaultACvpZ":{"name":"default","abstract":"

The default set of HTTPHeaders used by Alamofire. Includes Accept-Encoding, Accept-Language, and","parent_name":"HTTPHeaders"},"Structs/StreamOf/Iterator.html#/s:ScI4next7ElementQzSgyYaKF":{"name":"next()","parent_name":"Iterator"},"Structs/StreamOf.html#/s:Sci13AsyncIteratorQa":{"name":"AsyncIterator","parent_name":"StreamOf"},"Structs/StreamOf.html#/s:9Alamofire8StreamOfV15BufferingPolicya":{"name":"BufferingPolicy","abstract":"

Undocumented

","parent_name":"StreamOf"},"Structs/StreamOf.html#/s:Sci17makeAsyncIterator0bC0QzyF":{"name":"makeAsyncIterator()","parent_name":"StreamOf"},"Structs/StreamOf/Iterator.html":{"name":"Iterator","abstract":"

Undocumented

","parent_name":"StreamOf"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV0C0a":{"name":"Stream","abstract":"

Undocumented

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV09streamingB023automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_10Foundation0B0Vs5NeverOGGSb_ScS12ContinuationV09BufferingI0OyAR__GtF":{"name":"streamingData(automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of Data values from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV16streamingStrings23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_SSs5NeverOGGSb_ScS12ContinuationV09BufferingJ0OyAO__GtF":{"name":"streamingStrings(automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of UTF-8 Strings from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV19streamingDecodables_23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_xAA7AFErrorOGGxm_SbScS12ContinuationV09BufferingJ0OyAO__GtSeRzlF":{"name":"streamingDecodables(_:automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of Decodable values from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV18streamingResponses15serializedUsing23automaticallyCancelling15bufferingPolicyAA0C2OfVyAA0bC7RequestC0C0Vy_16SerializedObjectQzAA7AFErrorOGGx_SbScS12ContinuationV09BufferingL0OyAR__GtAA0bC10SerializerRzlF":{"name":"streamingResponses(serializedUsing:automaticallyCancelling:bufferingPolicy:)","abstract":"

Creates a Stream of values using the provided DataStreamSerializer from the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DataStreamTask.html#/s:9Alamofire14DataStreamTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DataStreamRequest.

","parent_name":"DataStreamTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV8responseAA0B8ResponseVyxAA7AFErrorOGvp":{"name":"response","abstract":"

DownloadResponse produced by the DownloadRequest and its response handler.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6results6ResultOyxAA7AFErrorOGvp":{"name":"result","abstract":"

Result of any response serialization performed for the response.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV5valuexvp":{"name":"value","abstract":"

Value returned by the response.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DownloadRequest and Task.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DownloadRequest.

","parent_name":"DownloadTask"},"Structs/DownloadTask.html#/s:9Alamofire12DownloadTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DownloadRequest.

","parent_name":"DownloadTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV8responseAA0B8ResponseVyxAA7AFErrorOGvp":{"name":"response","abstract":"

DataResponse produced by the DataRequest and its response handler.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6results6ResultOyxAA7AFErrorOGvp":{"name":"result","abstract":"

Result of any response serialization performed for the response.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV5valuexvp":{"name":"value","abstract":"

Value returned by the response.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the underlying DataRequest and Task.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV6resumeyyF":{"name":"resume()","abstract":"

Resume the underlying DataRequest.

","parent_name":"DataTask"},"Structs/DataTask.html#/s:9Alamofire8DataTaskV7suspendyyF":{"name":"suspend()","abstract":"

Suspend the underlying DataRequest.

","parent_name":"DataTask"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0C10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided ResponseSerializer.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC18SerializerProtocolRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DownloadResponseSerializerProtocol value.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DownloadResponse value.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the Result of the DownloadResponse as a single Value or fail with the AFError instance.

","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DownloadResponsePublisher"},"Structs/DownloadResponsePublisher.html#/s:9Alamofire25DownloadResponsePublisherVAA10Foundation3URLVSgRszlE_5queueACyAGGAA0B7RequestC_So012OS_dispatch_G0Ctcfc":{"name":"init(_:queue:)","abstract":"

Creates an instance which publishes a DownloadResponse<URL?, AFError> value without serialization.

","parent_name":"DownloadResponsePublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV_5queue10serializerACyxGAA0bC7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DataStreamSerializer.

","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DataStreamRequest.Stream‘s Events.

","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:9Alamofire19DataStreamPublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the streamed values of the DataStreamRequest.Stream as a sequence of Value or fail with the","parent_name":"DataStreamPublisher"},"Structs/DataStreamPublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DataStreamPublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP6OutputQa":{"name":"Output","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP7FailureQa":{"name":"Failure","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0C10SerializerRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided ResponseSerializer.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV_5queue10serializerACyxGAA0B7RequestC_So012OS_dispatch_E0Cqd__tc16SerializedObjectQyd__RszAA0bC18SerializerProtocolRd__lufc":{"name":"init(_:queue:serializer:)","abstract":"

Creates an instance which will serialize responses using the provided DataResponseSerializerProtocol.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV6result7Combine03AnyD0Vys6ResultOyxAA7AFErrorOGs5NeverOGyF":{"name":"result()","abstract":"

Publishes only the Result of the DataResponse value.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherV5value7Combine03AnyD0VyxAA7AFErrorOGyF":{"name":"value()","abstract":"

Publishes the Result of the DataResponse as a single Value or fail with the AFError instance.

","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:7Combine9PublisherP7receive10subscriberyqd___tAA10SubscriberRd__7FailureQyd__AGRtz5InputQyd__6OutputRtzlF":{"name":"receive(subscriber:)","parent_name":"DataResponsePublisher"},"Structs/DataResponsePublisher.html#/s:9Alamofire21DataResponsePublisherVAA10Foundation0B0VSgRszlE_5queueACyAGGAA0B7RequestC_So012OS_dispatch_F0Ctcfc":{"name":"init(_:queue:)","abstract":"

Creates an instance which publishes a DataResponse<Data?, AFError> value without serialization.

","parent_name":"DataResponsePublisher"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO5cacheyA2EmF":{"name":"cache","abstract":"

Stores the cached response in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO10doNotCacheyA2EmF":{"name":"doNotCache","abstract":"

Prevents the cached response from being stored in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html#/s:9Alamofire14ResponseCacherV8BehaviorO6modifyyAESo19NSCachedURLResponseCSgSo20NSURLSessionDataTaskC_AHtccAEmF":{"name":"modify(_:)","abstract":"

Modifies the cached response before storing it in the cache.

","parent_name":"Behavior"},"Structs/ResponseCacher/Behavior.html":{"name":"Behavior","abstract":"

Defines the behavior of the ResponseCacher type.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV5cacheACvpZ":{"name":"cache","abstract":"

Returns a ResponseCacher with a .cache Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV10doNotCacheACvpZ":{"name":"doNotCache","abstract":"

Returns a ResponseCacher with a .doNotCache Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV8behaviorAC8BehaviorOvp":{"name":"behavior","abstract":"

The Behavior of the ResponseCacher.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire14ResponseCacherV8behaviorA2C8BehaviorO_tcfc":{"name":"init(behavior:)","abstract":"

Creates a ResponseCacher instance from the Behavior.

","parent_name":"ResponseCacher"},"Structs/ResponseCacher.html#/s:9Alamofire21CachedResponseHandlerP8dataTask_09willCacheC010completionySo016NSURLSessionDataF0C_So19NSCachedURLResponseCyAJSgctF":{"name":"dataTask(_:willCacheResponse:completion:)","parent_name":"ResponseCacher"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionV4typexvp":{"name":"type","abstract":"

Stores the type or meta-type of any extended type.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVyACyxGxcfc":{"name":"init(_:)","abstract":"

Create an instance from the provided value.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE12certificatesSaySo17SecCertificateRefaGvp":{"name":"certificates","abstract":"

Returns all valid cer, crt, and der certificates in the bundle.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE10publicKeysSaySo9SecKeyRefaGvp":{"name":"publicKeys","abstract":"

Returns all public keys for the valid certificates in the bundle.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo8NSBundleCRbzlE5paths19forResourcesOfTypesSaySSGAH_tF":{"name":"paths(forResourcesOfTypes:)","abstract":"

Returns all pathnames for the resources identified by the provided file extensions.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8evaluate13afterApplyingySo0c6PolicyE0a_tKF":{"name":"evaluate(afterApplying:)","abstract":"

Evaluates self after applying the SecPolicy value provided.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8validate6policy13errorProducerySo0c6PolicyE0a_s5Error_ps5Int32V_So0cD10ResultTypeVtXEtKF":{"name":"validate(policy:errorProducer:)","abstract":"

Attempts to validate self using the SecPolicy provided and transforming any error produced using the closure passed.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE5apply6policyAESo0c6PolicyE0a_tKF":{"name":"apply(policy:)","abstract":"

Applies a SecPolicy to self, throwing if it fails.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8evaluateyyKF":{"name":"evaluate()","abstract":"

Evaluate self, throwing an Error if evaluation fails.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE8validate13errorProducerys5Error_ps5Int32V_So0cD10ResultTypeVtXE_tKF":{"name":"validate(errorProducer:)","abstract":"

Validate self, passing any failure values through errorProducer.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE21setAnchorCertificatesyySaySo0c11CertificateE0aGKF":{"name":"setAnchorCertificates(_:)","abstract":"

Sets a custom certificate chain on self, allowing full validation of a self-signed certificate and its chain.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE10publicKeysSaySo0c3KeyE0aGvp":{"name":"publicKeys","abstract":"

The public keys contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE12certificatesSaySo0c11CertificateE0aGvp":{"name":"certificates","abstract":"

The SecCertificates contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE15certificateDataSay10Foundation0G0VGvp":{"name":"certificateData","abstract":"

The Data values for all certificates contained in self.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE24performDefaultValidation7forHostySS_tKF":{"name":"performDefaultValidation(forHost:)","abstract":"

Validates self after applying SecPolicy.af.default. This evaluation does not validate the hostname.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo11SecTrustRefaRszlE17performValidation7forHostySS_tKF":{"name":"performValidation(forHost:)","abstract":"

Validates self after applying SecPolicy.af.hostname(host), which performs the default validation as well as","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE7defaultAEvpZ":{"name":"default","abstract":"

Creates a SecPolicy instance which will validate server certificates but not require a host name match.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE8hostnameyAESSFZ":{"name":"hostname(_:)","abstract":"

Creates a SecPolicy instance which will validate server certificates and much match the provided hostname.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo12SecPolicyRefaRszlE10revocation7optionsAeA24RevocationTrustEvaluatorC7OptionsV_tKFZ":{"name":"revocation(options:)","abstract":"

Creates a SecPolicy which checks the revocation of certificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASaySo17SecCertificateRefaGRszlE4dataSay10Foundation4DataVGvp":{"name":"data","abstract":"

All Data values for the contained SecCertificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASaySo17SecCertificateRefaGRszlE10publicKeysSaySo0c3KeyE0aGvp":{"name":"publicKeys","abstract":"

All public SecKey values for the contained SecCertificates.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo17SecCertificateRefaRszlE9publicKeySo0cgE0aSgvp":{"name":"publicKey","abstract":"

The public key for self, if it can be extracted.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAAs5Int32VRszlE9isSuccessSbvp":{"name":"isSuccess","abstract":"

Returns whether self is errSecSuccess.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo18SecTrustResultTypeVRszlE9isSuccessSbvp":{"name":"isSuccess","abstract":"

Returns whether self is.unspecifiedor.proceed`.

","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo25NSURLSessionConfigurationCRbzlE7defaultAEvpZ":{"name":"default","abstract":"

Alamofire’s default configuration. Same as URLSessionConfiguration.default but adds Alamofire default","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html#/s:9Alamofire0A9ExtensionVAASo25NSURLSessionConfigurationCRbzlE9ephemeralAEvpZ":{"name":"ephemeral","abstract":"

.ephemeral configuration with Alamofire’s default Accept-Language, Accept-Encoding, and User-Agent","parent_name":"AlamofireExtension"},"Structs/AlamofireExtension.html":{"name":"AlamofireExtension","abstract":"

Type that acts as a generic extension point for all AlamofireExtended types.

"},"Structs/ResponseCacher.html":{"name":"ResponseCacher","abstract":"

ResponseCacher is a convenience CachedResponseHandler making it easy to cache, not cache, or modify a cached"},"Structs/DataResponsePublisher.html":{"name":"DataResponsePublisher","abstract":"

A Combine Publisher that publishes the DataResponse<Value, AFError> of the provided DataRequest.

"},"Structs/DataStreamPublisher.html":{"name":"DataStreamPublisher","abstract":"

Undocumented

"},"Structs/DownloadResponsePublisher.html":{"name":"DownloadResponsePublisher","abstract":"

A Combine Publisher that publishes the DownloadResponse<Value, AFError> of the provided DownloadRequest.

"},"Structs/DataTask.html":{"name":"DataTask","abstract":"

Value used to await a DataResponse and associated values.

"},"Structs/DownloadTask.html":{"name":"DownloadTask","abstract":"

Value used to await a DownloadResponse and associated values.

"},"Structs/DataStreamTask.html":{"name":"DataStreamTask","abstract":"

Undocumented

"},"Structs/StreamOf.html":{"name":"StreamOf","abstract":"

An asynchronous sequence generated from an underlying AsyncStream. Only produced by Alamofire.

"},"Structs/HTTPHeaders.html":{"name":"HTTPHeaders","abstract":"

An order-preserving and case-insensitive representation of HTTP headers.

"},"Structs/HTTPHeader.html":{"name":"HTTPHeader","abstract":"

A representation of a single HTTP header’s name / value pair.

"},"Structs/HTTPMethod.html":{"name":"HTTPMethod","abstract":"

Type representing HTTP methods. Raw String value is stored and compared case-sensitively, so"},"Structs/URLEncoding.html":{"name":"URLEncoding","abstract":"

Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP"},"Structs/JSONEncoding.html":{"name":"JSONEncoding","abstract":"

Uses JSONSerialization to create a JSON representation of the parameters object, which is set as the body of the"},"Structs/Redirector.html":{"name":"Redirector","abstract":"

Redirector is a convenience RedirectHandler making it easy to follow, not follow, or modify a redirect.

"},"Structs/DeflateRequestCompressor.html":{"name":"DeflateRequestCompressor","abstract":"

RequestAdapter which compresses outgoing URLRequest bodies using the deflate Content-Encoding and adds the"},"Structs/RequestAdapterState.html":{"name":"RequestAdapterState","abstract":"

Stores all state associated with a URLRequest being adapted.

"},"Structs/DataResponse.html":{"name":"DataResponse","abstract":"

Type used to store all values associated with a serialized response of a DataRequest or UploadRequest.

"},"Structs/DownloadResponse.html":{"name":"DownloadResponse","abstract":"

Used to store all data associated with a serialized response of a download request.

"},"Structs/PassthroughPreprocessor.html":{"name":"PassthroughPreprocessor","abstract":"

DataPreprocessor that returns passed Data without any transform.

"},"Structs/GoogleXSSIPreprocessor.html":{"name":"GoogleXSSIPreprocessor","abstract":"

DataPreprocessor that trims Google’s typical )]}',\\n XSSI JSON header.

"},"Structs/URLResponseSerializer.html":{"name":"URLResponseSerializer","abstract":"

A DownloadResponseSerializerProtocol that performs only Error checking and ensures that a downloaded fileURL"},"Structs/Empty.html":{"name":"Empty","abstract":"

Type representing an empty value. Use Empty.value to get the static instance.

"},"Structs/DecodableStreamSerializer.html":{"name":"DecodableStreamSerializer","abstract":"

DataStreamSerializer which uses the provided DataPreprocessor and DataDecoder to serialize the incoming Data.

"},"Structs/PassthroughStreamSerializer.html":{"name":"PassthroughStreamSerializer","abstract":"

DataStreamSerializer which performs no serialization on incoming Data.

"},"Structs/StringStreamSerializer.html":{"name":"StringStreamSerializer","abstract":"

DataStreamSerializer which serializes incoming stream Data into UTF8-decoded String values.

"},"Protocols/URLRequestConvertible.html#/s:9Alamofire21URLRequestConvertibleP02asB010Foundation0B0VyKF":{"name":"asURLRequest()","abstract":"

Returns a URLRequest or throws if an Error was encountered.

","parent_name":"URLRequestConvertible"},"Protocols/URLRequestConvertible.html#/s:9Alamofire21URLRequestConvertiblePAAE10urlRequest10Foundation0B0VSgvp":{"name":"urlRequest","abstract":"

The URLRequest returned by discarding any Error encountered.

","parent_name":"URLRequestConvertible"},"Protocols/URLConvertible.html#/s:9Alamofire14URLConvertibleP5asURL10Foundation0D0VyKF":{"name":"asURL()","abstract":"

Returns a URL from the conforming instance or throws.

","parent_name":"URLConvertible"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","abstract":"

Evaluates the given SecTrust value for the given host.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010RevocationC9EvaluatorCRszrlE18revocationCheckingAEvpZ":{"name":"revocationChecking","abstract":"

Provides a default RevocationTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010RevocationC9EvaluatorCRszrlE18revocationChecking24performDefaultValidation12validateHost7optionsAESb_SbAE7OptionsVtFZ":{"name":"revocationChecking(performDefaultValidation:validateHost:options:)","abstract":"

Creates a RevocationTrustEvaluator using the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A018PinnedCertificatesC9EvaluatorCRszrlE06pinnedF0AEvpZ":{"name":"pinnedCertificates","abstract":"

Provides a default PinnedCertificatesTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A018PinnedCertificatesC9EvaluatorCRszrlE06pinnedF012certificates016acceptSelfSignedF024performDefaultValidation12validateHostAESaySo17SecCertificateRefaG_S3btFZ":{"name":"pinnedCertificates(certificates:acceptSelfSignedCertificates:performDefaultValidation:validateHost:)","abstract":"

Creates a PinnedCertificatesTrustEvaluator using the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010PublicKeysC9EvaluatorCRszrlE06publicF0AEvpZ":{"name":"publicKeys","abstract":"

Provides a default PublicKeysTrustEvaluator instance.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A010PublicKeysC9EvaluatorCRszrlE06publicF04keys24performDefaultValidation12validateHostAESaySo9SecKeyRefaG_S2btFZ":{"name":"publicKeys(keys:performDefaultValidation:validateHost:)","abstract":"

Creates a PublicKeysTrustEvaluator from the provided parameters.

","parent_name":"ServerTrustEvaluating"},"Protocols/ServerTrustEvaluating.html#/s:9Alamofire21ServerTrustEvaluatingPA2A09CompositeC9EvaluatorCRszrlE9composite10evaluatorsAESayAaB_pG_tFZ":{"name":"composite(evaluators:)","abstract":"

Creates a CompositeTrustEvaluator from the provided evaluators.

","parent_name":"ServerTrustEvaluating"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

Type produced from the serialized Data.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerP9serializey16SerializedObjectQz10Foundation0B0VKF":{"name":"serialize(_:)","abstract":"

Serializes incoming Data into a SerializedObject value.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPAAE9decodable2of7decoder16dataPreprocessorAA09DecodablecD0Vyqd__Gqd__m_AA0B7Decoder_pAA0bI0_ptAJRszSeRd__lFZ":{"name":"decodable(of:decoder:dataPreprocessor:)","abstract":"

Creates a DecodableStreamSerializer instance with the provided DataDecoder and DataPreprocessor.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPA2A011PassthroughcD0VRszrlE11passthroughAEvpZ":{"name":"passthrough","abstract":"

Provides a PassthroughStreamSerializer instance.

","parent_name":"DataStreamSerializer"},"Protocols/DataStreamSerializer.html#/s:9Alamofire20DataStreamSerializerPA2A06StringcD0VRszrlE6stringAEvpZ":{"name":"string","abstract":"

Provides a StringStreamSerializer instance.

","parent_name":"DataStreamSerializer"},"Protocols/DataDecoder.html#/s:9Alamofire11DataDecoderP6decode_4fromqd__qd__m_10Foundation0B0VtKSeRd__lF":{"name":"decode(_:from:)","abstract":"

Decode Data into the provided type.

","parent_name":"DataDecoder"},"Protocols/EmptyResponse.html#/s:9Alamofire13EmptyResponseP10emptyValuexyFZ":{"name":"emptyValue()","abstract":"

Empty value for the conforming type.

","parent_name":"EmptyResponse"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorP10preprocessy10Foundation0B0VAGKF":{"name":"preprocess(_:)","abstract":"

Process Data before it’s handled by a serializer.

","parent_name":"DataPreprocessor"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorPA2A011PassthroughC0VRszrlE11passthroughAEvpZ":{"name":"passthrough","abstract":"

Provides a PassthroughPreprocessor instance.

","parent_name":"DataPreprocessor"},"Protocols/DataPreprocessor.html#/s:9Alamofire16DataPreprocessorPA2A22GoogleXSSIPreprocessorVRszrlE10googleXSSIAEvpZ":{"name":"googleXSSI","abstract":"

Provides a GoogleXSSIPreprocessor instance.

","parent_name":"DataPreprocessor"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","abstract":"

DataPreprocessor used to prepare incoming Data for serialization.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","abstract":"

HTTPMethods for which empty response bodies are considered appropriate.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","abstract":"

HTTP response codes for which empty response bodies are considered appropriate.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE23defaultDataPreprocessorAA0eF0_pvpZ":{"name":"defaultDataPreprocessor","abstract":"

Default DataPreprocessor. PassthroughPreprocessor by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE26defaultEmptyRequestMethodsShyAA10HTTPMethodVGvpZ":{"name":"defaultEmptyRequestMethods","abstract":"

Default HTTPMethods for which empty response bodies are considered appropriate. [.head] by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE012defaultEmptyB5CodesShySiGvpZ":{"name":"defaultEmptyResponseCodes","abstract":"

HTTP response codes for which empty response bodies are considered appropriate. [204, 205] by default.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE018requestAllowsEmptyB4DataySbSg10Foundation10URLRequestVSgF":{"name":"requestAllowsEmptyResponseData(_:)","abstract":"

Determines whether the request allows empty response bodies, if request exists.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE019responseAllowsEmptyB4DataySbSgSo17NSHTTPURLResponseCSgF":{"name":"responseAllowsEmptyResponseData(_:)","abstract":"

Determines whether the response allows empty response bodies, if response exists`.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE05emptyB7Allowed10forRequest8responseSb10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgtF":{"name":"emptyResponseAllowed(forRequest:response:)","abstract":"

Determines whether request and response allow empty response bodies.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPAAE9decodable2of16dataPreprocessor7decoder05emptyB5Codes0I14RequestMethodsAA09DecodablebC0Cyqd__Gqd__m_AA04DataG0_pAA0N7Decoder_pShySiGShyAA10HTTPMethodVGtALRszSeRd__lFZ":{"name":"decodable(of:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DecodableResponseSerializer using the values provided.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A04DatabC0CRszrlE4dataAEvpZ":{"name":"data","abstract":"

Provides a default DataResponseSerializer instance.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A04DatabC0CRszrlE4data0E12Preprocessor05emptyB5Codes0G14RequestMethodsAeA0dF0_p_ShySiGShyAA10HTTPMethodVGtFZ":{"name":"data(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponseSerializer using the provided parameters.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A06StringbC0CRszrlE6stringAEvpZ":{"name":"string","abstract":"

Provides a default StringResponseSerializer instance.

","parent_name":"ResponseSerializer"},"Protocols/ResponseSerializer.html#/s:9Alamofire18ResponseSerializerPA2A06StringbC0CRszrlE6string16dataPreprocessor8encoding05emptyB5Codes0I14RequestMethodsAeA04DataG0_p_SS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtFZ":{"name":"string(dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a StringResponseSerializer with the provided values.

","parent_name":"ResponseSerializer"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

The type of serialized object to be created.

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolP09serializeB07request8response7fileURL5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0J0VSgs5Error_pSgtKF":{"name":"serializeDownload(request:response:fileURL:error:)","abstract":"

Serialize the downloaded response Data from disk into the provided type..

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DownloadResponseSerializerProtocol.html#/s:9Alamofire34DownloadResponseSerializerProtocolPA2A011URLResponseD0VRszrlE3urlAEvpZ":{"name":"url","abstract":"

Provides a URLResponseSerializer instance.

","parent_name":"DownloadResponseSerializerProtocol"},"Protocols/DataResponseSerializerProtocol.html#/s:9Alamofire30DataResponseSerializerProtocolP16SerializedObjectQa":{"name":"SerializedObject","abstract":"

The type of serialized object to be created.

","parent_name":"DataResponseSerializerProtocol"},"Protocols/DataResponseSerializerProtocol.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","abstract":"

Serialize the response Data into the provided type..

","parent_name":"DataResponseSerializerProtocol"},"Protocols/RequestRetrier.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","abstract":"

Determines whether the Request should be retried by calling the completion closure.

","parent_name":"RequestRetrier"},"Protocols/RequestRetrier.html#/s:9Alamofire14RequestRetrierPA2A0C0CRszrlE7retrier5usingAEyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctc_tFZ":{"name":"retrier(using:)","abstract":"

Creates a Retrier using the provided RetryHandler closure.

","parent_name":"RequestRetrier"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","abstract":"

Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

","parent_name":"RequestAdapter"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","abstract":"

Inspects and adapts the specified URLRequest in some manner and calls the completion handler with the Result.

","parent_name":"RequestAdapter"},"Protocols/RequestAdapter.html#/s:9Alamofire14RequestAdapterPA2A0C0CRszrlE7adapter5usingAEy10Foundation10URLRequestV_AA7SessionCys6ResultOyAJs5Error_pGctc_tFZ":{"name":"adapter(using:)","abstract":"

Creates an Adapter using the provided AdaptHandler closure.

","parent_name":"RequestAdapter"},"Protocols/RequestInterceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A07DeflateB10CompressorVRszrlE07deflateE0AEvpZ":{"name":"deflateCompressor","abstract":"

Create a DeflateRequestCompressor with default duplicateHeaderBehavior and shouldCompressBodyData values.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A07DeflateB10CompressorVRszrlE07deflateE023duplicateHeaderBehavior22shouldCompressBodyDataA2E09DuplicatehI0O_Sb10Foundation0M0VctFZ":{"name":"deflateCompressor(duplicateHeaderBehavior:shouldCompressBodyData:)","abstract":"

Creates a DeflateRequestCompressor with the provided DuplicateHeaderBehavior and shouldCompressBodyData","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor7adapter7retrierAEy10Foundation10URLRequestV_AA7SessionCys6ResultOyAKs5Error_pGctc_yAA0B0C_AMsAP_pyAA05RetryJ0OctctFZ":{"name":"interceptor(adapter:retrier:)","abstract":"

Creates an Interceptor using the provided AdaptHandler and RetryHandler closures.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor7adapter7retrierAeA0B7Adapter_p_AA0B7Retrier_ptFZ":{"name":"interceptor(adapter:retrier:)","abstract":"

Creates an Interceptor using the provided RequestAdapter and RequestRetrier instances.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A0C0CRszrlE11interceptor8adapters8retriers12interceptorsAESayAA0B7Adapter_pG_SayAA0B7Retrier_pGSayAaB_pGtFZ":{"name":"interceptor(adapters:retriers:interceptors:)","abstract":"

Creates an Interceptor using the provided RequestAdapters, RequestRetriers, and RequestInterceptors.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A11RetryPolicyCRszrlE05retryE0AEvpZ":{"name":"retryPolicy","abstract":"

Provides a default RetryPolicy instance.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A11RetryPolicyCRszrlE05retryE00F5Limit22exponentialBackoffBase0hI5Scale20retryableHTTPMethods0L15HTTPStatusCodes0l8URLErrorO0AESu_SuSdShyAA10HTTPMethodVGShySiGShy10Foundation0P0V4CodeVGtFZ":{"name":"retryPolicy(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:retryableHTTPStatusCodes:retryableURLErrorCodes:)","abstract":"

Creates an RetryPolicy from the specified parameters.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A25ConnectionLostRetryPolicyCRszrlE010connectionefG0AEvpZ":{"name":"connectionLostRetryPolicy","abstract":"

Provides a default ConnectionLostRetryPolicy instance.

","parent_name":"RequestInterceptor"},"Protocols/RequestInterceptor.html#/s:9Alamofire18RequestInterceptorPA2A25ConnectionLostRetryPolicyCRszrlE010connectionefG010retryLimit22exponentialBackoffBase0kL5Scale20retryableHTTPMethodsAESu_SuSdShyAA10HTTPMethodVGtFZ":{"name":"connectionLostRetryPolicy(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:)","abstract":"

Creates a ConnectionLostRetryPolicy instance from the specified parameters.

","parent_name":"RequestInterceptor"},"Protocols/UploadableConvertible.html#/s:9Alamofire21UploadableConvertibleP06createB0AA13UploadRequestC0B0OyKF":{"name":"createUploadable()","abstract":"

Produces an UploadRequest.Uploadable value from the instance.

","parent_name":"UploadableConvertible"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP20sessionConfigurationSo012NSURLSessionE0Cvp":{"name":"sessionConfiguration","abstract":"

URLSessionConfiguration used to create the underlying URLSessionTasks.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP16startImmediatelySbvp":{"name":"startImmediately","abstract":"

Determines whether the Request should automatically call resume() when adding the first response handler.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP7cleanup5afteryAA0B0C_tF":{"name":"cleanup(after:)","abstract":"

Notifies the delegate the Request has reached a point where it needs cleanup.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP11retryResult3for5dueTo10completionyAA0B0C_AA7AFErrorOyAA05RetryE0OctF":{"name":"retryResult(for:dueTo:completion:)","abstract":"

Asynchronously ask the delegate whether a Request will be retried.

","parent_name":"RequestDelegate"},"Protocols/RequestDelegate.html#/s:9Alamofire15RequestDelegateP05retryB0_9withDelayyAA0B0C_SdSgtF":{"name":"retryRequest(_:withDelay:)","abstract":"

Asynchronously retry the Request.

","parent_name":"RequestDelegate"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerP4task_18willBeRedirectedTo3for10completionySo16NSURLSessionTaskC_10Foundation10URLRequestVSo17NSHTTPURLResponseCyALSgctF":{"name":"task(_:willBeRedirectedTo:for:completion:)","abstract":"

Determines how the HTTP redirect response should be redirected to the new request.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE6followAEvpZ":{"name":"follow","abstract":"

Provides a Redirector which follows redirects. Equivalent to Redirector.follow.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE11doNotFollowAEvpZ":{"name":"doNotFollow","abstract":"

Provides a Redirector which does not follow redirects. Equivalent to Redirector.doNotFollow.

","parent_name":"RedirectHandler"},"Protocols/RedirectHandler.html#/s:9Alamofire15RedirectHandlerPA2A10RedirectorVRszrlE6modify5usingAE10Foundation10URLRequestVSgSo16NSURLSessionTaskC_AJSo17NSHTTPURLResponseCtc_tFZ":{"name":"modify(using:)","abstract":"

Creates a Redirector which modifies the redirected URLRequest using the provided closure.

","parent_name":"RedirectHandler"},"Protocols/ParameterEncoding.html#/s:9Alamofire17ParameterEncodingP6encode_4with10Foundation10URLRequestVAA0G11Convertible_p_SDySSypGSgtKF":{"name":"encode(_:with:)","abstract":"

Creates a URLRequest by encoding parameters and applying them on the passed request.

","parent_name":"ParameterEncoding"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","abstract":"

Encode the provided Encodable parameters into request.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A013JSONParameterC0CRszrlE4jsonAEvpZ":{"name":"json","abstract":"

Provides a default JSONParameterEncoder instance.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A013JSONParameterC0CRszrlE4json7encoderAE10Foundation11JSONEncoderC_tFZ":{"name":"json(encoder:)","abstract":"

Creates a JSONParameterEncoder using the provided JSONEncoder.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A014URLEncodedFormbC0CRszrlE010urlEncodedE0AEvpZ":{"name":"urlEncodedForm","abstract":"

Provides a default URLEncodedFormParameterEncoder instance.

","parent_name":"ParameterEncoder"},"Protocols/ParameterEncoder.html#/s:9Alamofire16ParameterEncoderPA2A014URLEncodedFormbC0CRszrlE010urlEncodedE07encoder11destinationAeA0deC0C_AE11DestinationOtFZ":{"name":"urlEncodedForm(encoder:destination:)","abstract":"

Creates a URLEncodedFormParameterEncoder with the provided encoder and destination.

","parent_name":"ParameterEncoder"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","abstract":"

The DispatchQueue onto which Alamofire’s root CompositeEventMonitor will dispatch events. .main by default.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","abstract":"

Event called during URLSessionDelegate‘s urlSession(_:didBecomeInvalidWithError:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didReceive:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:needNewBodyStream:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didFinishCollecting:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:task:didCompleteWithError:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","abstract":"

Event called during URLSessionTaskDelegate‘s urlSession(_:taskIsWaitingForConnectivity:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:didReceive:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","abstract":"

Event called during URLSessionDataDelegate‘s urlSession(_:dataTask:willCacheResponse:completionHandler:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","abstract":"

Event called during URLSessionDownloadDelegate‘s urlSession(_:downloadTask:didFinishDownloadingTo:) method.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","abstract":"

Event called when a URLRequest is first created for a Request. If a RequestAdapter is active, the","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","abstract":"

Event called when the attempt to create a URLRequest from a Request‘s original URLRequestConvertible value fails.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","abstract":"

Event called when a RequestAdapter adapts the Request‘s initial URLRequest.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","abstract":"

Event called when a RequestAdapter fails to adapt the Request‘s initial URLRequest.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","abstract":"

Event called when a final URLRequest is created for a Request.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","abstract":"

Event called when a URLSessionTask subclass instance is created for a Request.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","abstract":"

Event called when a Request receives a URLSessionTaskMetrics value.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","abstract":"

Event called when a Request fails due to an error created by Alamofire. e.g. When certificate pinning fails.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","abstract":"

Event called when a Request‘s task completes, possibly with an error. A Request may receive this event","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","abstract":"

Event called when a Request is about to be retried.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","abstract":"

Event called when a Request finishes and response serializers are being called.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","abstract":"

Event called when a Request receives a resume call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is resumed.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","abstract":"

Event called when a Request receives a suspend call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is suspended.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","abstract":"

Event called when a Request receives a cancel call.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","abstract":"

Event called when a Request‘s associated URLSessionTask is cancelled.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","abstract":"

Event called when a DataRequest calls a Validation.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DataRequest creates a DataResponse<Data?> value without calling a ResponseSerializer.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DataRequest calls a ResponseSerializer and creates a generic DataResponse<Value, AFError>.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","abstract":"

Event called when a DataStreamRequest calls a Validation closure.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didParseStreamyAA04DataG7RequestC_s6ResultOyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseStream:)","abstract":"

Event called when a DataStreamSerializer produces a value from streamed Data.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","abstract":"

Event called when an UploadRequest creates its Uploadable value, indicating the type of upload it represents.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","abstract":"

Event called when an UploadRequest failed to create its Uploadable value due to an error.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","abstract":"

Event called when an UploadRequest provides the InputStream from its Uploadable value. This only occurs if","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","abstract":"

Event called when a DownloadRequest‘s URLSessionDownloadTask finishes and the temporary file has been moved.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","abstract":"

Event called when a DownloadRequest‘s Destination closure is called and creates the destination URL the","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","abstract":"

Event called when a DownloadRequest calls a Validation.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DownloadRequest creates a DownloadResponse<URL?, AFError> without calling a ResponseSerializer.

","parent_name":"EventMonitor"},"Protocols/EventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","abstract":"

Event called when a DownloadRequest calls a DownloadResponseSerializer and creates a generic DownloadResponse<Value, AFError>

","parent_name":"EventMonitor"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerP8dataTask_09willCacheC010completionySo016NSURLSessionDataF0C_So19NSCachedURLResponseCyAJSgctF":{"name":"dataTask(_:willCacheResponse:completion:)","abstract":"

Determines whether the HTTP response should be stored in the cache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE5cacheAEvpZ":{"name":"cache","abstract":"

Provides a ResponseCacher which caches the response, if allowed. Equivalent to ResponseCacher.cache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE10doNotCacheAEvpZ":{"name":"doNotCache","abstract":"

Provides a ResponseCacher which does not cache the response. Equivalent to ResponseCacher.doNotCache.

","parent_name":"CachedResponseHandler"},"Protocols/CachedResponseHandler.html#/s:9Alamofire21CachedResponseHandlerPA2A0C6CacherVRszrlE6modify5usingAESo19NSCachedURLResponseCSgSo20NSURLSessionDataTaskC_AItc_tFZ":{"name":"modify(using:)","abstract":"

Creates a ResponseCacher which modifies the proposed CachedURLResponse using the provided closure.

","parent_name":"CachedResponseHandler"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP10CredentialQa":{"name":"Credential","abstract":"

The type of credential associated with the Authenticator instance.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP5apply_2toy10CredentialQz_10Foundation10URLRequestVztF":{"name":"apply(_:to:)","abstract":"

Applies the Credential to the URLRequest.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP7refresh_3for10completiony10CredentialQz_AA7SessionCys6ResultOyAHs5Error_pGctF":{"name":"refresh(_:for:completion:)","abstract":"

Refreshes the Credential and executes the completion closure with the Result once complete.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP10didRequest_4with28failDueToAuthenticationErrorSb10Foundation10URLRequestV_So17NSHTTPURLResponseCs0J0_ptF":{"name":"didRequest(_:with:failDueToAuthenticationError:)","abstract":"

Determines whether the URLRequest failed due to an authentication error based on the HTTPURLResponse.

","parent_name":"Authenticator"},"Protocols/Authenticator.html#/s:9Alamofire13AuthenticatorP9isRequest_17authenticatedWithSb10Foundation10URLRequestV_10CredentialQztF":{"name":"isRequest(_:authenticatedWith:)","abstract":"

Determines whether the URLRequest is authenticated with the Credential.

","parent_name":"Authenticator"},"Protocols/AuthenticationCredential.html#/s:9Alamofire24AuthenticationCredentialP15requiresRefreshSbvp":{"name":"requiresRefresh","abstract":"

Whether the credential requires a refresh. This property should always return true when the credential is","parent_name":"AuthenticationCredential"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP0B4TypeQa":{"name":"ExtendedType","abstract":"

Type being extended.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP2afAA0A9ExtensionVy0B4TypeQzGmvpZ":{"name":"af","abstract":"

Static Alamofire extension point.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html#/s:9Alamofire0A8ExtendedP2afAA0A9ExtensionVy0B4TypeQzGvp":{"name":"af","abstract":"

Instance Alamofire extension point.

","parent_name":"AlamofireExtended"},"Protocols/AlamofireExtended.html":{"name":"AlamofireExtended","abstract":"

Protocol describing the af extension points for Alamofire extended types.

"},"Protocols/AuthenticationCredential.html":{"name":"AuthenticationCredential","abstract":"

Types adopting the AuthenticationCredential protocol can be used to authenticate URLRequests.

"},"Protocols/Authenticator.html":{"name":"Authenticator","abstract":"

Types adopting the Authenticator protocol can be used to authenticate URLRequests with an"},"Protocols/CachedResponseHandler.html":{"name":"CachedResponseHandler","abstract":"

A type that handles whether the data task should store the HTTP response in the cache.

"},"Protocols/EventMonitor.html":{"name":"EventMonitor","abstract":"

Protocol outlining the lifetime events inside Alamofire. It includes both events received from the various"},"Protocols/ParameterEncoder.html":{"name":"ParameterEncoder","abstract":"

A type that can encode any Encodable type into a URLRequest.

"},"Protocols/ParameterEncoding.html":{"name":"ParameterEncoding","abstract":"

A type used to define how a set of parameters are applied to a URLRequest.

"},"Protocols/RedirectHandler.html":{"name":"RedirectHandler","abstract":"

A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.

"},"Protocols/RequestDelegate.html":{"name":"RequestDelegate","abstract":"

Protocol abstraction for Request‘s communication back to the SessionDelegate.

"},"Protocols/UploadableConvertible.html":{"name":"UploadableConvertible","abstract":"

A type that can produce an UploadRequest.Uploadable value.

"},"Protocols.html#/s:9Alamofire17UploadConvertibleP":{"name":"UploadConvertible","abstract":"

A type that can be converted to an upload, whether from an UploadRequest.Uploadable or URLRequestConvertible.

"},"Protocols/RequestInterceptor.html":{"name":"RequestInterceptor","abstract":"

Type that provides both RequestAdapter and RequestRetrier functionality.

"},"Protocols/RequestAdapter.html":{"name":"RequestAdapter","abstract":"

A type that can inspect and optionally adapt a URLRequest in some manner if necessary.

"},"Protocols/RequestRetrier.html":{"name":"RequestRetrier","abstract":"

A type that determines whether a request should be retried after being executed by the specified session manager"},"Protocols/DataResponseSerializerProtocol.html":{"name":"DataResponseSerializerProtocol","abstract":"

The type to which all data response serializers must conform in order to serialize a response.

"},"Protocols/DownloadResponseSerializerProtocol.html":{"name":"DownloadResponseSerializerProtocol","abstract":"

The type to which all download response serializers must conform in order to serialize a response.

"},"Protocols/ResponseSerializer.html":{"name":"ResponseSerializer","abstract":"

A serializer that can handle both data and download responses.

"},"Protocols/DataPreprocessor.html":{"name":"DataPreprocessor","abstract":"

Type used to preprocess Data before it handled by a serializer.

"},"Protocols/EmptyResponse.html":{"name":"EmptyResponse","abstract":"

Protocol representing an empty response. Use T.emptyValue() to get an instance.

"},"Protocols/DataDecoder.html":{"name":"DataDecoder","abstract":"

Any type which can decode Data into a Decodable type.

"},"Protocols/DataStreamSerializer.html":{"name":"DataStreamSerializer","abstract":"

A type which can serialize incoming Data.

"},"Protocols/ServerTrustEvaluating.html":{"name":"ServerTrustEvaluating","abstract":"

A protocol describing the API used to evaluate server trusts.

"},"Protocols/URLConvertible.html":{"name":"URLConvertible","abstract":"

Types adopting the URLConvertible protocol can be used to construct URLs, which can then be used to construct"},"Protocols/URLRequestConvertible.html":{"name":"URLRequestConvertible","abstract":"

Types adopting the URLRequestConvertible protocol can be used to safely construct URLRequests.

"},"Extensions/CharacterSet.html#/s:10Foundation12CharacterSetV9AlamofireE17afURLQueryAllowedACvpZ":{"name":"afURLQueryAllowed","abstract":"

Creates a CharacterSet from RFC 3986 allowed characters.

","parent_name":"CharacterSet"},"Extensions/URLComponents.html#/s:10Foundation13URLComponentsV9AlamofireE5asURLAA0E0VyKF":{"name":"asURL()","abstract":"

Returns a URL if the self‘s url is not nil, otherwise throws.

","parent_name":"URLComponents"},"Extensions/URL.html#/s:10Foundation3URLV9AlamofireE02asB0ACyKF":{"name":"asURL()","abstract":"

Returns self.

","parent_name":"URL"},"Extensions/String.html#/s:SS9AlamofireE5asURL10Foundation0C0VyKF":{"name":"asURL()","abstract":"

Returns a URL if self can be used to initialize a URL instance, otherwise throws.

","parent_name":"String"},"Extensions/Array.html#/s:Sa9AlamofireAA21ServerTrustEvaluating_pRszlE8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","abstract":"

Evaluates the given SecTrust value for the given host.

","parent_name":"Array"},"Extensions/Notification.html#/s:10Foundation12NotificationV9AlamofireE7requestAD7RequestCSgvp":{"name":"request","abstract":"

The Request contained by the instance’s userInfo, nil otherwise.

","parent_name":"Notification"},"Extensions/URLSessionConfiguration.html#/s:So25NSURLSessionConfigurationC9AlamofireE7headersAC11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns httpAdditionalHeaders as HTTPHeaders.

","parent_name":"URLSessionConfiguration"},"Extensions/HTTPURLResponse.html#/s:So17NSHTTPURLResponseC9AlamofireE7headersAC11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns allHeaderFields as HTTPHeaders.

","parent_name":"HTTPURLResponse"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE7headersAD11HTTPHeadersVvp":{"name":"headers","abstract":"

Returns allHTTPHeaderFields as HTTPHeaders.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE02asB0ACyKF":{"name":"asURLRequest()","abstract":"

Returns self.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE3url6method7headersAcD14URLConvertible_p_AD10HTTPMethodVAD11HTTPHeadersVSgtKcfc":{"name":"init(url:method:headers:)","abstract":"

Creates an instance with the specified url, method, and headers.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE6methodAD10HTTPMethodVSgvp":{"name":"method","abstract":"

Returns the httpMethod as Alamofire’s HTTPMethod type.

","parent_name":"URLRequest"},"Extensions/URLRequest.html#/s:10Foundation10URLRequestV9AlamofireE8validateyyKF":{"name":"validate()","abstract":"

Undocumented

","parent_name":"URLRequest"},"Extensions/Error.html#/s:s5ErrorP9AlamofireE9asAFErrorAC0D0OSgvp":{"name":"asAFError","abstract":"

Returns the instance cast as an AFError.

","parent_name":"Error"},"Extensions/Error.html#/s:s5ErrorP9AlamofireE9asAFError10orFailWith4file4lineAC0D0OSSyXK_s12StaticStringVSutF":{"name":"asAFError(orFailWith:file:line:)","abstract":"

Returns the instance cast as an AFError. If casting fails, a fatalError with the specified message is thrown.

","parent_name":"Error"},"Extensions/Error.html":{"name":"Error"},"Extensions/URLRequest.html":{"name":"URLRequest"},"Extensions/HTTPURLResponse.html":{"name":"HTTPURLResponse"},"Extensions/URLSessionConfiguration.html":{"name":"URLSessionConfiguration"},"Extensions/Notification.html":{"name":"Notification"},"Extensions.html#/s:10Foundation11JSONDecoderC":{"name":"JSONDecoder","abstract":"

JSONDecoder automatically conforms to DataDecoder.

"},"Extensions.html#/s:10Foundation19PropertyListDecoderC":{"name":"PropertyListDecoder","abstract":"

PropertyListDecoder automatically conforms to DataDecoder.

"},"Extensions/Array.html":{"name":"Array"},"Extensions.html#/c:objc(cs)NSBundle":{"name":"Bundle"},"Extensions.html#/c:@T@SecTrustRef":{"name":"SecTrust"},"Extensions.html#/c:@T@SecPolicyRef":{"name":"SecPolicy"},"Extensions.html#/c:@T@SecCertificateRef":{"name":"SecCertificate"},"Extensions.html#/c:@T@OSStatus":{"name":"OSStatus"},"Extensions.html#/c:@E@SecTrustResultType":{"name":"SecTrustResultType"},"Extensions/String.html":{"name":"String"},"Extensions/URL.html":{"name":"URL"},"Extensions/URLComponents.html":{"name":"URLComponents"},"Extensions/CharacterSet.html":{"name":"CharacterSet"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO5retryyA2CmF":{"name":"retry","abstract":"

Retry should be attempted immediately.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO14retryWithDelayyACSdcACmF":{"name":"retryWithDelay(_:)","abstract":"

Retry should be attempted after the associated TimeInterval.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO05doNotB0yA2CmF":{"name":"doNotRetry","abstract":"

Do not retry.

","parent_name":"RetryResult"},"Enums/RetryResult.html#/s:9Alamofire11RetryResultO05doNotB9WithErroryACs0G0_pcACmF":{"name":"doNotRetryWithError(_:)","abstract":"

Do not retry due to the associated Error.

","parent_name":"RetryResult"},"Enums/AuthenticationError.html#/s:9Alamofire19AuthenticationErrorO17missingCredentialyA2CmF":{"name":"missingCredential","abstract":"

The credential was missing so the request could not be authenticated.

","parent_name":"AuthenticationError"},"Enums/AuthenticationError.html#/s:9Alamofire19AuthenticationErrorO16excessiveRefreshyA2CmF":{"name":"excessiveRefresh","abstract":"

The credential was refreshed too many times within the RefreshWindow.

","parent_name":"AuthenticationError"},"Enums/AFError/URLRequestValidationFailureReason.html#/s:9Alamofire7AFErrorO33URLRequestValidationFailureReasonO20bodyDataInGETRequestyAE10Foundation0H0VcAEmF":{"name":"bodyDataInGETRequest(_:)","abstract":"

URLRequest with GET method had body data.

","parent_name":"URLRequestValidationFailureReason"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV4hostSSvp":{"name":"host","abstract":"

The host for which the evaluation was performed.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV5trustSo03SecD3Refavp":{"name":"trust","abstract":"

The SecTrust value which was evaluated.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV6statuss5Int32Vvp":{"name":"status","abstract":"

The OSStatus of evaluation operation.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO6OutputV6resultSo03SecD10ResultTypeVvp":{"name":"result","abstract":"

The result of the evaluation operation.

","parent_name":"Output"},"Enums/AFError/ServerTrustFailureReason/Output.html":{"name":"Output","abstract":"

The output of a server trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO19noRequiredEvaluatoryAESS_tcAEmF":{"name":"noRequiredEvaluator(host:)","abstract":"

No ServerTrustEvaluator was found for the associated host.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO19noCertificatesFoundyA2EmF":{"name":"noCertificatesFound","abstract":"

No certificates were found with which to perform the trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO17noPublicKeysFoundyA2EmF":{"name":"noPublicKeysFound","abstract":"

No public keys were found with which to perform the trust evaluation.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO23policyApplicationFailedyAESo03SecD3Refa_So0j6PolicyK0as5Int32VtcAEmF":{"name":"policyApplicationFailed(trust:policy:status:)","abstract":"

During evaluation, application of the associated SecPolicy failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO31settingAnchorCertificatesFailedyAEs5Int32V_SaySo17SecCertificateRefaGtcAEmF":{"name":"settingAnchorCertificatesFailed(status:certificates:)","abstract":"

During evaluation, setting the associated anchor certificates failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO30revocationPolicyCreationFailedyA2EmF":{"name":"revocationPolicyCreationFailed","abstract":"

During evaluation, creation of the revocation policy failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO21trustEvaluationFailedyAEs5Error_pSg_tcAEmF":{"name":"trustEvaluationFailed(error:)","abstract":"

SecTrust evaluation failed with the associated Error, if one was produced.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO23defaultEvaluationFailedyA2E6OutputV_tcAEmF":{"name":"defaultEvaluationFailed(output:)","abstract":"

Default evaluation failed with the associated Output.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO20hostValidationFailedyA2E6OutputV_tcAEmF":{"name":"hostValidationFailed(output:)","abstract":"

Host validation failed with the associated Output.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO21revocationCheckFailedyA2E6OutputV_AA010RevocationD9EvaluatorC7OptionsVtcAEmF":{"name":"revocationCheckFailed(output:options:)","abstract":"

Revocation check failed with the associated Output and options.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO24certificatePinningFailedyAESS_So03SecD3RefaSaySo0j11CertificateK0aGAKtcAEmF":{"name":"certificatePinningFailed(host:trust:pinnedCertificates:serverCertificates:)","abstract":"

Certificate pinning failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO22publicKeyPinningFailedyAESS_So03SecD3RefaSaySo0khL0aGAKtcAEmF":{"name":"publicKeyPinningFailed(host:trust:pinnedKeys:serverKeys:)","abstract":"

Public key pinning failed.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ServerTrustFailureReason.html#/s:9Alamofire7AFErrorO24ServerTrustFailureReasonO22customEvaluationFailedyAEs5Error_p_tcAEmF":{"name":"customEvaluationFailed(error:)","abstract":"

Custom server trust evaluation failed due to the associated Error.

","parent_name":"ServerTrustFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO24inputDataNilOrZeroLengthyA2EmF":{"name":"inputDataNilOrZeroLength","abstract":"

The server response contained no data or the data was zero length.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO12inputFileNilyA2EmF":{"name":"inputFileNil","abstract":"

The file containing the server response did not exist.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO19inputFileReadFailedyAE10Foundation3URLV_tcAEmF":{"name":"inputFileReadFailed(at:)","abstract":"

The file containing the server response could not be read from the associated URL.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO06stringD6FailedyAESS10FoundationE8EncodingV_tcAEmF":{"name":"stringSerializationFailed(encoding:)","abstract":"

String serialization failed using the provided String.Encoding.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO04jsonD6FailedyAEs5Error_p_tcAEmF":{"name":"jsonSerializationFailed(error:)","abstract":"

JSON serialization failed with an underlying system error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO14decodingFailedyAEs5Error_p_tcAEmF":{"name":"decodingFailed(error:)","abstract":"

A DataDecoder failed to decode the response due to the associated Error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customSerializationFailed(error:)","abstract":"

A custom response serializer failed due to the associated Error.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseSerializationFailureReason.html#/s:9Alamofire7AFErrorO34ResponseSerializationFailureReasonO012invalidEmptyC0yAESS_tcAEmF":{"name":"invalidEmptyResponse(type:)","abstract":"

Generic serialization failed for an empty response that wasn’t type Empty but instead the associated type.

","parent_name":"ResponseSerializationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO11dataFileNilyA2EmF":{"name":"dataFileNil","abstract":"

The data file containing the server response did not exist.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO18dataFileReadFailedyAE10Foundation3URLV_tcAEmF":{"name":"dataFileReadFailed(at:)","abstract":"

The data file containing the server response at the associated URL could not be read.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO18missingContentTypeyAESaySSG_tcAEmF":{"name":"missingContentType(acceptableContentTypes:)","abstract":"

The response did not contain a Content-Type and the acceptableContentTypes provided did not contain a","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO23unacceptableContentTypeyAESaySSG_SStcAEmF":{"name":"unacceptableContentType(acceptableContentTypes:responseContentType:)","abstract":"

The response Content-Type did not match any type in the provided acceptableContentTypes.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO22unacceptableStatusCodeyAESi_tcAEmF":{"name":"unacceptableStatusCode(code:)","abstract":"

The response status code was not acceptable.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ResponseValidationFailureReason.html#/s:9Alamofire7AFErrorO31ResponseValidationFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customValidationFailed(error:)","abstract":"

Custom response validation failed due to the associated Error.

","parent_name":"ResponseValidationFailureReason"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO17RequiredComponentO3urlyA2GmF":{"name":"url","abstract":"

The URL was missing or unable to be extracted from the passed URLRequest or during encoding.

","parent_name":"RequiredComponent"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO17RequiredComponentO10httpMethodyAGSS_tcAGmF":{"name":"httpMethod(rawValue:)","abstract":"

The HTTPMethod could not be extracted from the passed URLRequest.

","parent_name":"RequiredComponent"},"Enums/AFError/ParameterEncoderFailureReason/RequiredComponent.html":{"name":"RequiredComponent","abstract":"

Possible missing components.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncoderFailureReason.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO24missingRequiredComponentyA2E0hI0OcAEmF":{"name":"missingRequiredComponent(_:)","abstract":"

A RequiredComponent was missing during encoding.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncoderFailureReason.html#/s:9Alamofire7AFErrorO29ParameterEncoderFailureReasonO13encoderFailedyAEs5Error_p_tcAEmF":{"name":"encoderFailed(error:)","abstract":"

The underlying encoder failed with the associated error.

","parent_name":"ParameterEncoderFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO10missingURLyA2EmF":{"name":"missingURL","abstract":"

The URLRequest did not have a URL to encode.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO04jsonD6FailedyAEs5Error_p_tcAEmF":{"name":"jsonEncodingFailed(error:)","abstract":"

JSON serialization failed with an underlying system error during the encoding process.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/ParameterEncodingFailureReason.html#/s:9Alamofire7AFErrorO30ParameterEncodingFailureReasonO06customD6FailedyAEs5Error_p_tcAEmF":{"name":"customEncodingFailed(error:)","abstract":"

Custom parameter encoding failed due to the associated Error.

","parent_name":"ParameterEncodingFailureReason"},"Enums/AFError/UnexpectedInputStreamLength.html#/s:9Alamofire7AFErrorO27UnexpectedInputStreamLengthV13bytesExpecteds6UInt64Vvp":{"name":"bytesExpected","abstract":"

The expected byte count to read.

","parent_name":"UnexpectedInputStreamLength"},"Enums/AFError/UnexpectedInputStreamLength.html#/s:9Alamofire7AFErrorO27UnexpectedInputStreamLengthV9bytesReads6UInt64Vvp":{"name":"bytesRead","abstract":"

The actual byte count read.

","parent_name":"UnexpectedInputStreamLength"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO18bodyPartURLInvalidyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartURLInvalid(url:)","abstract":"

The fileURL provided for reading an encodable body part isn’t a file URL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23bodyPartFilenameInvalidyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFilenameInvalid(in:)","abstract":"

The filename of the fileURL provided has either an empty lastPathComponent or `pathExtension.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO24bodyPartFileNotReachableyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileNotReachable(at:)","abstract":"

The file at the fileURL provided was not reachable.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO33bodyPartFileNotReachableWithErroryAE10Foundation3URLV_s0M0_ptcAEmF":{"name":"bodyPartFileNotReachableWithError(atURL:error:)","abstract":"

Attempting to check the reachability of the fileURL provided threw an error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23bodyPartFileIsDirectoryyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileIsDirectory(at:)","abstract":"

The file at the fileURL provided is actually a directory.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO28bodyPartFileSizeNotAvailableyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartFileSizeNotAvailable(at:)","abstract":"

The size of the file at the fileURL provided was not returned by the system.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO36bodyPartFileSizeQueryFailedWithErroryAE10Foundation3URLV_s0N0_ptcAEmF":{"name":"bodyPartFileSizeQueryFailedWithError(forURL:error:)","abstract":"

The attempt to find the size of the file at the fileURL provided threw an error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO33bodyPartInputStreamCreationFailedyAE10Foundation3URLV_tcAEmF":{"name":"bodyPartInputStreamCreationFailed(for:)","abstract":"

An InputStream could not be created for the provided fileURL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO26outputStreamCreationFailedyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamCreationFailed(for:)","abstract":"

An OutputStream could not be created when attempting to write the encoded data to disk.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO29outputStreamFileAlreadyExistsyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamFileAlreadyExists(at:)","abstract":"

The encoded body data could not be written to disk because a file already exists at the provided fileURL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO22outputStreamURLInvalidyAE10Foundation3URLV_tcAEmF":{"name":"outputStreamURLInvalid(url:)","abstract":"

The fileURL provided for writing the encoded body data to disk is not a file URL.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO23outputStreamWriteFailedyAEs5Error_p_tcAEmF":{"name":"outputStreamWriteFailed(error:)","abstract":"

The attempt to write the encoded body data to disk failed with an underlying error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html#/s:9Alamofire7AFErrorO30MultipartEncodingFailureReasonO21inputStreamReadFailedyAEs5Error_p_tcAEmF":{"name":"inputStreamReadFailed(error:)","abstract":"

The attempt to read an encoded body part InputStream failed with underlying system error.

","parent_name":"MultipartEncodingFailureReason"},"Enums/AFError/MultipartEncodingFailureReason.html":{"name":"MultipartEncodingFailureReason","abstract":"

The underlying reason the .multipartEncodingFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/UnexpectedInputStreamLength.html":{"name":"UnexpectedInputStreamLength","abstract":"

Represents unexpected input stream length that occur when encoding the MultipartFormData. Instances will be","parent_name":"AFError"},"Enums/AFError/ParameterEncodingFailureReason.html":{"name":"ParameterEncodingFailureReason","abstract":"

The underlying reason the .parameterEncodingFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ParameterEncoderFailureReason.html":{"name":"ParameterEncoderFailureReason","abstract":"

The underlying reason the .parameterEncoderFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ResponseValidationFailureReason.html":{"name":"ResponseValidationFailureReason","abstract":"

The underlying reason the .responseValidationFailed error occurred.

","parent_name":"AFError"},"Enums/AFError/ResponseSerializationFailureReason.html":{"name":"ResponseSerializationFailureReason","abstract":"

The underlying reason the response serialization error occurred.

","parent_name":"AFError"},"Enums/AFError/ServerTrustFailureReason.html":{"name":"ServerTrustFailureReason","abstract":"

Underlying reason a server trust evaluation error occurred.

","parent_name":"AFError"},"Enums/AFError/URLRequestValidationFailureReason.html":{"name":"URLRequestValidationFailureReason","abstract":"

The underlying reason the .urlRequestValidationFailed

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22createUploadableFailedyACs5Error_p_tcACmF":{"name":"createUploadableFailed(error:)","abstract":"

UploadableConvertible threw an error in createUploadable().

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22createURLRequestFailedyACs5Error_p_tcACmF":{"name":"createURLRequestFailed(error:)","abstract":"

URLRequestConvertible threw an error in asURLRequest().

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24downloadedFileMoveFailedyACs5Error_p_10Foundation3URLVAHtcACmF":{"name":"downloadedFileMoveFailed(error:source:destination:)","abstract":"

SessionDelegate threw an error while attempting to move downloaded file to destination URL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19explicitlyCancelledyA2CmF":{"name":"explicitlyCancelled","abstract":"

Request was explicitly cancelled.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO10invalidURLyAcA14URLConvertible_p_tcACmF":{"name":"invalidURL(url:)","abstract":"

URLConvertible type failed to create a valid URL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23multipartEncodingFailedyA2C09MultipartD13FailureReasonO_tcACmF":{"name":"multipartEncodingFailed(reason:)","abstract":"

Multipart form encoding failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23parameterEncodingFailedyA2C09ParameterD13FailureReasonO_tcACmF":{"name":"parameterEncodingFailed(reason:)","abstract":"

ParameterEncoding threw an error during the encoding process.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22parameterEncoderFailedyA2C09ParameterD13FailureReasonO_tcACmF":{"name":"parameterEncoderFailed(reason:)","abstract":"

ParameterEncoder threw an error while running the encoder.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23requestAdaptationFailedyACs5Error_p_tcACmF":{"name":"requestAdaptationFailed(error:)","abstract":"

RequestAdapter threw an error during adaptation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18requestRetryFailedyACs5Error_p_sAE_ptcACmF":{"name":"requestRetryFailed(retryError:originalError:)","abstract":"

RequestRetrier threw an error during the request retry process.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24responseValidationFailedyA2C08ResponseD13FailureReasonO_tcACmF":{"name":"responseValidationFailed(reason:)","abstract":"

Response validation failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27responseSerializationFailedyA2C08ResponseD13FailureReasonO_tcACmF":{"name":"responseSerializationFailed(reason:)","abstract":"

Response serialization failed.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27serverTrustEvaluationFailedyA2C06ServerD13FailureReasonO_tcACmF":{"name":"serverTrustEvaluationFailed(reason:)","abstract":"

ServerTrustEvaluating instance threw an error during trust evaluation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO20sessionDeinitializedyA2CmF":{"name":"sessionDeinitialized","abstract":"

Session which issued the Request was deinitialized, most likely because its reference went out of scope.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18sessionInvalidatedyACs5Error_pSg_tcACmF":{"name":"sessionInvalidated(error:)","abstract":"

Session was explicitly invalidated, possibly with the Error produced by the underlying URLSession.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO17sessionTaskFailedyACs5Error_p_tcACmF":{"name":"sessionTaskFailed(error:)","abstract":"

URLSessionTask completed with error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO26urlRequestValidationFailedyA2C010URLRequestE13FailureReasonO_tcACmF":{"name":"urlRequestValidationFailed(reason:)","abstract":"

URLRequest failed validation.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO27isSessionDeinitializedErrorSbvp":{"name":"isSessionDeinitializedError","abstract":"

Returns whether the instance is .sessionDeinitialized.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isSessionInvalidatedErrorSbvp":{"name":"isSessionInvalidatedError","abstract":"

Returns whether the instance is .sessionInvalidated.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO26isExplicitlyCancelledErrorSbvp":{"name":"isExplicitlyCancelledError","abstract":"

Returns whether the instance is .explicitlyCancelled.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO17isInvalidURLErrorSbvp":{"name":"isInvalidURLError","abstract":"

Returns whether the instance is .invalidURL.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isParameterEncodingErrorSbvp":{"name":"isParameterEncodingError","abstract":"

Returns whether the instance is .parameterEncodingFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isParameterEncoderErrorSbvp":{"name":"isParameterEncoderError","abstract":"

Returns whether the instance is .parameterEncoderFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isMultipartEncodingErrorSbvp":{"name":"isMultipartEncodingError","abstract":"

Returns whether the instance is .multipartEncodingFailed. When true, the url and underlyingError","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO24isRequestAdaptationErrorSbvp":{"name":"isRequestAdaptationError","abstract":"

Returns whether the instance is .requestAdaptationFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isResponseValidationErrorSbvp":{"name":"isResponseValidationError","abstract":"

Returns whether the instance is .responseValidationFailed. When true, the acceptableContentTypes,","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO28isResponseSerializationErrorSbvp":{"name":"isResponseSerializationError","abstract":"

Returns whether the instance is .responseSerializationFailed. When true, the failedStringEncoding and","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO28isServerTrustEvaluationErrorSbvp":{"name":"isServerTrustEvaluationError","abstract":"

Returns whether the instance is .serverTrustEvaluationFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19isRequestRetryErrorSbvp":{"name":"isRequestRetryError","abstract":"

Returns whether the instance is requestRetryFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isCreateUploadableErrorSbvp":{"name":"isCreateUploadableError","abstract":"

Returns whether the instance is createUploadableFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO23isCreateURLRequestErrorSbvp":{"name":"isCreateURLRequestError","abstract":"

Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO25isDownloadedFileMoveErrorSbvp":{"name":"isDownloadedFileMoveError","abstract":"

Returns whether the instance is downloadedFileMoveFailed. When true, the destination and underlyingError properties will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18isSessionTaskErrorSbvp":{"name":"isSessionTaskError","abstract":"

Returns whether the instance is createURLRequestFailed. When true, the underlyingError property will","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO14urlConvertibleAA14URLConvertible_pSgvp":{"name":"urlConvertible","abstract":"

The URLConvertible associated with the error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO3url10Foundation3URLVSgvp":{"name":"url","abstract":"

The URL associated with the error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO15underlyingErrors0D0_pSgvp":{"name":"underlyingError","abstract":"

The underlying Error responsible for generating the failure associated with .sessionInvalidated,","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO22acceptableContentTypesSaySSGSgvp":{"name":"acceptableContentTypes","abstract":"

The acceptable Content-Types of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO19responseContentTypeSSSgvp":{"name":"responseContentType","abstract":"

The response Content-Type of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO12responseCodeSiSgvp":{"name":"responseCode","abstract":"

The response code of a .responseValidationFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO20failedStringEncodingSS10FoundationE0E0VSgvp":{"name":"failedStringEncoding","abstract":"

The String.Encoding associated with a failed .stringResponse() call.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO9sourceURL10Foundation0D0VSgvp":{"name":"sourceURL","abstract":"

The source URL of a .downloadedFileMoveFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO14destinationURL10Foundation0D0VSgvp":{"name":"destinationURL","abstract":"

The destination URL of a .downloadedFileMoveFailed error.

","parent_name":"AFError"},"Enums/AFError.html#/s:9Alamofire7AFErrorO18downloadResumeData10Foundation0E0VSgvp":{"name":"downloadResumeData","abstract":"

The download resume data of any underlying network error. Only produced by DownloadRequests.

","parent_name":"AFError"},"Enums/AFError.html#/s:10Foundation14LocalizedErrorP16errorDescriptionSSSgvp":{"name":"errorDescription","parent_name":"AFError"},"Enums/AFError.html":{"name":"AFError","abstract":"

AFError is the error type returned by Alamofire. It encompasses a few different types of errors, each with"},"Enums/AuthenticationError.html":{"name":"AuthenticationError","abstract":"

Represents various authentication failures that occur when using the AuthenticationInterceptor. All errors are"},"Enums/RetryResult.html":{"name":"RetryResult","abstract":"

Outcome of determination whether retry is necessary.

"},"Global%20Variables.html#/s:9Alamofire2AFAA7SessionCvp":{"name":"AF","abstract":"

Reference to Session.default for quick bootstrapping and examples.

"},"Classes/URLEncodedFormEncoder/Error.html#/s:9Alamofire21URLEncodedFormEncoderC5ErrorO17invalidRootObjectyAESScAEmF":{"name":"invalidRootObject(_:)","abstract":"

An invalid root object was created by the encoder. Only keyed values are valid.

","parent_name":"Error"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13SpaceEncodingO14percentEscapedyA2EmF":{"name":"percentEscaped","abstract":"

Encodes spaces using percent escaping (%20).

","parent_name":"SpaceEncoding"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13SpaceEncodingO12plusReplacedyA2EmF":{"name":"plusReplaced","abstract":"

Encodes spaces as +.

","parent_name":"SpaceEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV7dropKeyAEvpZ":{"name":"dropKey","abstract":"

Encodes nil by dropping the entire key / value pair.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV9dropValueAEvpZ":{"name":"dropValue","abstract":"

Encodes nil by dropping only the value. e.g. value1=one&nilValue=&value2=two.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV4nullAEvpZ":{"name":"null","abstract":"

Encodes nil as null.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/NilEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11NilEncodingV8encodingAESSSgyc_tcfc":{"name":"init(encoding:)","abstract":"

Creates an instance with the encoding closure called for nil values.

","parent_name":"NilEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV8bracketsAEvpZ":{"name":"brackets","abstract":"

Encodes key paths by wrapping each component in brackets. e.g. parent[child][grandchild].

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV4dotsAEvpZ":{"name":"dots","abstract":"

Encodes key paths by separating each component with dots. e.g. parent.child.grandchild.

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC15KeyPathEncodingV8encodingAES2Sc_tcfc":{"name":"init(encoding:)","abstract":"

Creates an instance with the encoding closure called for each sub-key in a key path.

","parent_name":"KeyPathEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO14useDefaultKeysyA2EmF":{"name":"useDefaultKeys","abstract":"

Use the keys specified by each type. This is the default encoding.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO18convertToSnakeCaseyA2EmF":{"name":"convertToSnakeCase","abstract":"

Convert from “camelCaseKeys” to “snake_case_keys” before writing a key.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO18convertToKebabCaseyA2EmF":{"name":"convertToKebabCase","abstract":"

Same as convertToSnakeCase, but using - instead of _.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO11capitalizedyA2EmF":{"name":"capitalized","abstract":"

Capitalize the first letter only.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO10uppercasedyA2EmF":{"name":"uppercased","abstract":"

Uppercase all letters.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO10lowercasedyA2EmF":{"name":"lowercased","abstract":"

Lowercase all letters.","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/KeyEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC11KeyEncodingO6customyAES2SccAEmF":{"name":"custom(_:)","abstract":"

A custom encoding using the provided closure.

","parent_name":"KeyEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO010deferredToE0yA2EmF":{"name":"deferredToDate","abstract":"

Defers encoding to the Date type. This is the default encoding.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO16secondsSince1970yA2EmF":{"name":"secondsSince1970","abstract":"

Encodes Dates as seconds since midnight UTC on January 1, 1970.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO21millisecondsSince1970yA2EmF":{"name":"millisecondsSince1970","abstract":"

Encodes Dates as milliseconds since midnight UTC on January 1, 1970.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO7iso8601yA2EmF":{"name":"iso8601","abstract":"

Encodes Dates according to the ISO8601 and RFC3339 standards.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO9formattedyAESo15NSDateFormatterCcAEmF":{"name":"formatted(_:)","abstract":"

Encodes Dates using the given DateFormatter.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DateEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DateEncodingO6customyAESS10Foundation0E0VKccAEmF":{"name":"custom(_:)","abstract":"

Encodes Dates using the given closure.

","parent_name":"DateEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO010deferredToE0yA2EmF":{"name":"deferredToData","abstract":"

Defers encoding to the Data type.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO6base64yA2EmF":{"name":"base64","abstract":"

Encodes Data as a Base64-encoded string. This is the default encoding.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/DataEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12DataEncodingO6customyAESS10Foundation0E0VKccAEmF":{"name":"custom(_:)","abstract":"

Encode the Data as a custom value encoded by the given closure.

","parent_name":"DataEncoding"},"Classes/URLEncodedFormEncoder/BoolEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12BoolEncodingO7numericyA2EmF":{"name":"numeric","abstract":"

Encodes true as 1, false as 0.

","parent_name":"BoolEncoding"},"Classes/URLEncodedFormEncoder/BoolEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC12BoolEncodingO7literalyA2EmF":{"name":"literal","abstract":"

Encodes true as “true”, false as “false”. This is the default encoding.

","parent_name":"BoolEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO8bracketsyA2EmF":{"name":"brackets","abstract":"

An empty set of square brackets (“[]”) are appended to the key for every value. This is the default encoding.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO10noBracketsyA2EmF":{"name":"noBrackets","abstract":"

No brackets are appended to the key and the key is encoded as is.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO15indexInBracketsyA2EmF":{"name":"indexInBrackets","abstract":"

Brackets containing the item index are appended. This matches the jQuery and Node.js behavior.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html#/s:9Alamofire21URLEncodedFormEncoderC13ArrayEncodingO6customyAES2S_SitccAEmF":{"name":"custom(_:)","abstract":"

Provide a custom array key encoding with the given closure.

","parent_name":"ArrayEncoding"},"Classes/URLEncodedFormEncoder/ArrayEncoding.html":{"name":"ArrayEncoding","abstract":"

Encoding to use for Array values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/BoolEncoding.html":{"name":"BoolEncoding","abstract":"

Encoding to use for Bool values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/DataEncoding.html":{"name":"DataEncoding","abstract":"

Encoding to use for Data values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/DateEncoding.html":{"name":"DateEncoding","abstract":"

Encoding to use for Date values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/KeyEncoding.html":{"name":"KeyEncoding","abstract":"

Encoding to use for keys.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/KeyPathEncoding.html":{"name":"KeyPathEncoding","abstract":"

Encoding to use for nested object and Encodable value key paths.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/NilEncoding.html":{"name":"NilEncoding","abstract":"

Encoding to use for nil values.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/SpaceEncoding.html":{"name":"SpaceEncoding","abstract":"

Encoding to use for spaces.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder/Error.html":{"name":"Error","abstract":"

URLEncodedFormEncoder error.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC24alphabetizeKeyValuePairsSbvp":{"name":"alphabetizeKeyValuePairs","abstract":"

Whether or not to sort the encoded key value pairs.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC13arrayEncodingAC05ArrayF0Ovp":{"name":"arrayEncoding","abstract":"

The ArrayEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12boolEncodingAC04BoolF0Ovp":{"name":"boolEncoding","abstract":"

The BoolEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12dataEncodingAC04DataF0Ovp":{"name":"dataEncoding","abstract":"

THe DataEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC12dateEncodingAC04DateF0Ovp":{"name":"dateEncoding","abstract":"

The DateEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC11keyEncodingAC03KeyF0Ovp":{"name":"keyEncoding","abstract":"

The KeyEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC15keyPathEncodingAC03KeyfG0Vvp":{"name":"keyPathEncoding","abstract":"

The KeyPathEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC11nilEncodingAC03NilF0Vvp":{"name":"nilEncoding","abstract":"

The NilEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC13spaceEncodingAC05SpaceF0Ovp":{"name":"spaceEncoding","abstract":"

The SpaceEncoding to use.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC17allowedCharacters10Foundation12CharacterSetVvp":{"name":"allowedCharacters","abstract":"

The CharacterSet of allowed (non-escaped) characters.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC24alphabetizeKeyValuePairs13arrayEncoding04boolJ004dataJ004dateJ003keyJ00n4PathJ003nilJ005spaceJ017allowedCharactersACSb_AC05ArrayJ0OAC04BoolJ0OAC04DataJ0OAC04DateJ0OAC0fJ0OAC0foJ0VAC03NilJ0VAC05SpaceJ0O10Foundation12CharacterSetVtcfc":{"name":"init(alphabetizeKeyValuePairs:arrayEncoding:boolEncoding:dataEncoding:dateEncoding:keyEncoding:keyPathEncoding:nilEncoding:spaceEncoding:allowedCharacters:)","abstract":"

Creates an instance from the supplied parameters.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC6encodeySSSE_pKF":{"name":"encode(_:)","abstract":"

Encodes the value as a URL form encoded String.

","parent_name":"URLEncodedFormEncoder"},"Classes/URLEncodedFormEncoder.html#/s:9Alamofire21URLEncodedFormEncoderC6encodey10Foundation4DataVSE_pKF":{"name":"encode(_:)","abstract":"

Encodes the value as Data. This is performed by first creating an encoded String and then returning the","parent_name":"URLEncodedFormEncoder"},"Classes/SessionDelegate.html#/s:9Alamofire15SessionDelegateC11fileManagerACSo06NSFileE0C_tcfc":{"name":"init(fileManager:)","abstract":"

Creates an instance from the given FileManager.

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:didBecomeInvalidWithError:":{"name":"urlSession(_:didBecomeInvalidWithError:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didReceiveChallenge:completionHandler:":{"name":"urlSession(_:task:didReceive:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:needNewBodyStream:":{"name":"urlSession(_:task:needNewBodyStream:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didFinishCollectingMetrics:":{"name":"urlSession(_:task:didFinishCollecting:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:task:didCompleteWithError:":{"name":"urlSession(_:task:didCompleteWithError:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:taskIsWaitingForConnectivity:":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:didReceiveResponse:completionHandler:":{"name":"urlSession(_:dataTask:didReceive:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:didReceiveData:":{"name":"urlSession(_:dataTask:didReceive:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:dataTask:willCacheResponse:completionHandler:":{"name":"urlSession(_:dataTask:willCacheResponse:completionHandler:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/SessionDelegate.html#/c:@CM@Alamofire@objc(cs)SessionDelegate(im)URLSession:downloadTask:didFinishDownloadingToURL:":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","abstract":"

Undocumented

","parent_name":"SessionDelegate"},"Classes/Session.html#/s:9Alamofire7SessionC7defaultACvpZ":{"name":"default","abstract":"

Shared singleton instance used by all AF.request APIs. Cannot be modified.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7sessionSo12NSURLSessionCvp":{"name":"session","abstract":"

Underlying URLSession used to create URLSessionTasks for this instance, and for which this instance’s","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8delegateAA0B8DelegateCvp":{"name":"delegate","abstract":"

Instance’s SessionDelegate, which handles the URLSessionDelegate methods and Request interaction.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC9rootQueueSo17OS_dispatch_queueCvp":{"name":"rootQueue","abstract":"

Root DispatchQueue for all internal callbacks and state update. MUST be a serial queue.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC24startRequestsImmediatelySbvp":{"name":"startRequestsImmediately","abstract":"

Value determining whether this instance automatically calls resume() on all created Requests.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC12requestQueueSo17OS_dispatch_queueCvp":{"name":"requestQueue","abstract":"

DispatchQueue on which URLRequests are created asynchronously. By default this queue uses rootQueue as its","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC18serializationQueueSo17OS_dispatch_queueCvp":{"name":"serializationQueue","abstract":"

DispatchQueue passed to all Requests on which they perform their response serialization. By default this","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC11interceptorAA18RequestInterceptor_pSgvp":{"name":"interceptor","abstract":"

RequestInterceptor used for all Request created by the instance. RequestInterceptors can also be set on a","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC18serverTrustManagerAA06ServerdE0CSgvp":{"name":"serverTrustManager","abstract":"

ServerTrustManager instance used to evaluate all trust challenges and provide certificate and key pinning.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15redirectHandlerAA08RedirectD0_pSgvp":{"name":"redirectHandler","abstract":"

RedirectHandler instance used to provide customization for request redirection.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC21cachedResponseHandlerAA06CacheddE0_pSgvp":{"name":"cachedResponseHandler","abstract":"

CachedResponseHandler instance used to provide customization of cached response handling.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC12eventMonitorAA014CompositeEventD0Cvp":{"name":"eventMonitor","abstract":"

CompositeEventMonitor used to compose Alamofire’s defaultEventMonitors and any passed EventMonitors.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC20defaultEventMonitorsSayAA0D7Monitor_pGvp":{"name":"defaultEventMonitors","abstract":"

EventMonitors included in all instances. [AlamofireNotifications()] by default.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7session8delegate9rootQueue24startRequestsImmediately07requestF0013serializationF011interceptor18serverTrustManager15redirectHandler014cachedResponseQ013eventMonitorsACSo12NSURLSessionC_AA0B8DelegateCSo17OS_dispatch_queueCSbATSgAuA18RequestInterceptor_pSgAA06ServernO0CSgAA08RedirectQ0_pSgAA06CachedsQ0_pSgSayAA12EventMonitor_pGtcfc":{"name":"init(session:delegate:rootQueue:startRequestsImmediately:requestQueue:serializationQueue:interceptor:serverTrustManager:redirectHandler:cachedResponseHandler:eventMonitors:)","abstract":"

Creates a Session from a URLSession and other parameters.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13configuration8delegate9rootQueue24startRequestsImmediately07requestF0013serializationF011interceptor18serverTrustManager15redirectHandler014cachedResponseQ013eventMonitorsACSo25NSURLSessionConfigurationC_AA0B8DelegateCSo17OS_dispatch_queueCSbATSgAuA18RequestInterceptor_pSgAA06ServernO0CSgAA08RedirectQ0_pSgAA06CachedsQ0_pSgSayAA12EventMonitor_pGtcfc":{"name":"init(configuration:delegate:rootQueue:startRequestsImmediately:requestQueue:serializationQueue:interceptor:serverTrustManager:redirectHandler:cachedResponseHandler:eventMonitors:)","abstract":"

Creates a Session from a URLSessionConfiguration.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15withAllRequests7performyyShyAA7RequestCGc_tF":{"name":"withAllRequests(perform:)","abstract":"

Perform an action on all active Requests.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC17cancelAllRequests17completingOnQueue10completionySo17OS_dispatch_queueC_yycSgtF":{"name":"cancelAllRequests(completingOnQueue:completion:)","abstract":"

Cancel all active Requests, optionally calling a completion handler when complete.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC15RequestModifiera":{"name":"RequestModifier","abstract":"

Closure which provides a URLRequest for mutation.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_6method10parameters8encoding7headers11interceptor0C8ModifierAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodVSDySSypGSgAA17ParameterEncoding_pAA11HTTPHeadersVSgAA0K11Interceptor_pSgy10Foundation10URLRequestVzKcSgtF":{"name":"request(_:method:parameters:encoding:headers:interceptor:requestModifier:)","abstract":"

Creates a DataRequest from a URLRequest created using the passed components and a RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_6method10parameters7encoder7headers11interceptor0C8ModifierAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgAA0K11Interceptor_pSgy10Foundation10URLRequestVzKcSgtSERzlF":{"name":"request(_:method:parameters:encoder:headers:interceptor:requestModifier:)","abstract":"

Creates a DataRequest from a URLRequest created using the passed components, Encodable parameters, and a","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC7request_11interceptorAA11DataRequestCAA21URLRequestConvertible_p_AA0F11Interceptor_pSgtF":{"name":"request(_:interceptor:)","abstract":"

Creates a DataRequest from a URLRequestConvertible value and a RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_6method10parameters7encoder7headers32automaticallyCancelOnStreamError11interceptor15requestModifierAA04DatalD0CAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgSbAA0D11Interceptor_pSgy10Foundation10URLRequestVzKcSgtSERzlF":{"name":"streamRequest(_:method:parameters:encoder:headers:automaticallyCancelOnStreamError:interceptor:requestModifier:)","abstract":"

Creates a DataStreamRequest from the passed components, Encodable parameters, and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_6method7headers32automaticallyCancelOnStreamError11interceptor15requestModifierAA04DatajD0CAA14URLConvertible_p_AA10HTTPMethodVAA11HTTPHeadersVSgSbAA0D11Interceptor_pSgy10Foundation10URLRequestVzKcSgtF":{"name":"streamRequest(_:method:headers:automaticallyCancelOnStreamError:interceptor:requestModifier:)","abstract":"

Creates a DataStreamRequest from the passed components and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC13streamRequest_32automaticallyCancelOnStreamError11interceptorAA04DatahD0CAA21URLRequestConvertible_p_SbAA0D11Interceptor_pSgtF":{"name":"streamRequest(_:automaticallyCancelOnStreamError:interceptor:)","abstract":"

Creates a DataStreamRequest from the passed URLRequestConvertible value and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_6method10parameters8encoding7headers11interceptor15requestModifier2toAA15DownloadRequestCAA14URLConvertible_p_AA10HTTPMethodVSDySSypGSgAA17ParameterEncoding_pAA11HTTPHeadersVSgAA0M11Interceptor_pSgy10Foundation10URLRequestVzKcSgAY3URLV011destinationV0_AM7OptionsV7optionstA2__So17NSHTTPURLResponseCtcSgtF":{"name":"download(_:method:parameters:encoding:headers:interceptor:requestModifier:to:)","abstract":"

Creates a DownloadRequest using a URLRequest created using the passed components, RequestInterceptor, and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_6method10parameters7encoder7headers11interceptor15requestModifier2toAA15DownloadRequestCAA14URLConvertible_p_AA10HTTPMethodVxSgAA16ParameterEncoder_pAA11HTTPHeadersVSgAA0M11Interceptor_pSgy10Foundation10URLRequestVzKcSgAX3URLV011destinationV0_AM7OptionsV7optionstA1__So17NSHTTPURLResponseCtcSgtSERzlF":{"name":"download(_:method:parameters:encoder:headers:interceptor:requestModifier:to:)","abstract":"

Creates a DownloadRequest from a URLRequest created using the passed components, Encodable parameters, and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download_11interceptor2toAA15DownloadRequestCAA21URLRequestConvertible_p_AA0G11Interceptor_pSg10Foundation3URLV011destinationL0_AH7OptionsV7optionstAN_So17NSHTTPURLResponseCtcSgtF":{"name":"download(_:interceptor:to:)","abstract":"

Creates a DownloadRequest from a URLRequestConvertible value, a RequestInterceptor, and a Destination.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC8download12resumingWith11interceptor2toAA15DownloadRequestC10Foundation4DataV_AA0I11Interceptor_pSgAJ3URLV011destinationM0_AI7OptionsV7optionstAP_So17NSHTTPURLResponseCtcSgtF":{"name":"download(resumingWith:interceptor:to:)","abstract":"

Creates a DownloadRequest from the resumeData produced from a previously cancelled DownloadRequest, as","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestC10Foundation4DataV_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0CyAM10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the given Data, URLRequest components, and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestC10Foundation4DataV_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the given Data using the URLRequestConvertible value and RequestInterceptor.

","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestC10Foundation3URLV_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0CyAM10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the file at the given file URL, using a URLRequest from the provided","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestC10Foundation3URLV_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the file at the given file URL using the URLRequestConvertible value and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_2to6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCSo13NSInputStreamC_AA14URLConvertible_pAA10HTTPMethodVAA11HTTPHeadersVSgAA0M11Interceptor_pSgSo06NSFileI0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(_:to:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest from the InputStream provided using a URLRequest from the provided components and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload_4with11interceptor11fileManagerAA13UploadRequestCSo13NSInputStreamC_AA21URLRequestConvertible_pAA0I11Interceptor_pSgSo06NSFileG0CtF":{"name":"upload(_:with:interceptor:fileManager:)","abstract":"

Creates an UploadRequest from the provided InputStream using the URLRequestConvertible value and","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData2to14usingThreshold6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCyAA09MultiparteF0Cc_AA14URLConvertible_ps6UInt64VAA10HTTPMethodVAA11HTTPHeadersVSgAA0R11Interceptor_pSgSo06NSFileN0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(multipartFormData:to:usingThreshold:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the multipart form data built using a closure and sent using the provided","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData4with14usingThreshold11interceptor11fileManagerAA13UploadRequestCyAA09MultiparteF0Cc_AA21URLRequestConvertible_ps6UInt64VAA0N11Interceptor_pSgSo06NSFileL0CtF":{"name":"upload(multipartFormData:with:usingThreshold:interceptor:fileManager:)","abstract":"

Creates an UploadRequest using a MultipartFormData building closure, the provided URLRequestConvertible","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData2to14usingThreshold6method7headers11interceptor11fileManager15requestModifierAA13UploadRequestCAA09MultiparteF0C_AA14URLConvertible_ps6UInt64VAA10HTTPMethodVAA11HTTPHeadersVSgAA0R11Interceptor_pSgSo06NSFileN0Cy10Foundation10URLRequestVzKcSgtF":{"name":"upload(multipartFormData:to:usingThreshold:method:headers:interceptor:fileManager:requestModifier:)","abstract":"

Creates an UploadRequest for the prebuilt MultipartFormData value using the provided URLRequest components","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire7SessionC6upload17multipartFormData4with14usingThreshold11interceptor11fileManagerAA13UploadRequestCAA09MultiparteF0C_AA21URLRequestConvertible_ps6UInt64VAA0N11Interceptor_pSgSo06NSFileL0CtF":{"name":"upload(multipartFormData:with:usingThreshold:interceptor:fileManager:)","abstract":"

Creates an UploadRequest for the prebuilt MultipartFormData value using the providing URLRequestConvertible","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP20sessionConfigurationSo012NSURLSessionE0Cvp":{"name":"sessionConfiguration","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP16startImmediatelySbvp":{"name":"startImmediately","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP7cleanup5afteryAA0B0C_tF":{"name":"cleanup(after:)","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP11retryResult3for5dueTo10completionyAA0B0C_AA7AFErrorOyAA05RetryE0OctF":{"name":"retryResult(for:dueTo:completion:)","parent_name":"Session"},"Classes/Session.html#/s:9Alamofire15RequestDelegateP05retryB0_9withDelayyAA0B0C_SdSgtF":{"name":"retryRequest(_:withDelay:)","parent_name":"Session"},"Classes/DisabledTrustEvaluator.html#/s:9Alamofire22DisabledTrustEvaluatorCACycfc":{"name":"init()","abstract":"

Creates an instance.

","parent_name":"DisabledTrustEvaluator"},"Classes/DisabledTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"DisabledTrustEvaluator"},"Classes/CompositeTrustEvaluator.html#/s:9Alamofire23CompositeTrustEvaluatorC10evaluatorsACSayAA06ServerC10Evaluating_pG_tcfc":{"name":"init(evaluators:)","abstract":"

Creates a CompositeTrustEvaluator from the provided evaluators.

","parent_name":"CompositeTrustEvaluator"},"Classes/CompositeTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"CompositeTrustEvaluator"},"Classes/PublicKeysTrustEvaluator.html#/s:9Alamofire24PublicKeysTrustEvaluatorC4keys24performDefaultValidation12validateHostACSaySo9SecKeyRefaG_S2btcfc":{"name":"init(keys:performDefaultValidation:validateHost:)","abstract":"

Creates a PublicKeysTrustEvaluator from the provided parameters.

","parent_name":"PublicKeysTrustEvaluator"},"Classes/PublicKeysTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"PublicKeysTrustEvaluator"},"Classes/PinnedCertificatesTrustEvaluator.html#/s:9Alamofire32PinnedCertificatesTrustEvaluatorC12certificates016acceptSelfSignedC024performDefaultValidation12validateHostACSaySo17SecCertificateRefaG_S3btcfc":{"name":"init(certificates:acceptSelfSignedCertificates:performDefaultValidation:validateHost:)","abstract":"

Creates a PinnedCertificatesTrustEvaluator from the provided parameters.

","parent_name":"PinnedCertificatesTrustEvaluator"},"Classes/PinnedCertificatesTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"PinnedCertificatesTrustEvaluator"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV3crlAEvpZ":{"name":"crl","abstract":"

Perform revocation checking using the CRL (Certification Revocation List) method.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV21networkAccessDisabledAEvpZ":{"name":"networkAccessDisabled","abstract":"

Consult only locally cached replies; do not use network access.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV4ocspAEvpZ":{"name":"ocsp","abstract":"

Perform revocation checking using OCSP (Online Certificate Status Protocol).

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV9preferCRLAEvpZ":{"name":"preferCRL","abstract":"

Prefer CRL revocation checking over OCSP; by default, OCSP is preferred.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV23requirePositiveResponseAEvpZ":{"name":"requirePositiveResponse","abstract":"

Require a positive response to pass the policy. If the flag is not set, revocation checking is done on a","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV3anyAEvpZ":{"name":"any","abstract":"

Perform either OCSP or CRL checking. The checking is performed according to the method(s) specified in the","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV8rawValueSuvp":{"name":"rawValue","abstract":"

The raw value of the option.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html#/s:9Alamofire24RevocationTrustEvaluatorC7OptionsV8rawValueAESu_tcfc":{"name":"init(rawValue:)","abstract":"

Creates an Options value with the given CFOptionFlags.

","parent_name":"Options"},"Classes/RevocationTrustEvaluator/Options.html":{"name":"Options","abstract":"

Represents the options to be use when evaluating the status of a certificate.","parent_name":"RevocationTrustEvaluator"},"Classes/RevocationTrustEvaluator.html#/s:9Alamofire24RevocationTrustEvaluatorC24performDefaultValidation12validateHost7optionsACSb_SbAC7OptionsVtcfc":{"name":"init(performDefaultValidation:validateHost:options:)","abstract":"

Creates a RevocationTrustEvaluator using the provided parameters.

","parent_name":"RevocationTrustEvaluator"},"Classes/RevocationTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"RevocationTrustEvaluator"},"Classes/DefaultTrustEvaluator.html#/s:9Alamofire21DefaultTrustEvaluatorC12validateHostACSb_tcfc":{"name":"init(validateHost:)","abstract":"

Creates a DefaultTrustEvaluator.

","parent_name":"DefaultTrustEvaluator"},"Classes/DefaultTrustEvaluator.html#/s:9Alamofire21ServerTrustEvaluatingP8evaluate_7forHostySo03SecC3Refa_SStKF":{"name":"evaluate(_:forHost:)","parent_name":"DefaultTrustEvaluator"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC23allHostsMustBeEvaluatedSbvp":{"name":"allHostsMustBeEvaluated","abstract":"

Determines whether all hosts for this ServerTrustManager must be evaluated. true by default.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC10evaluatorsSDySSAA0bC10Evaluating_pGvp":{"name":"evaluators","abstract":"

The dictionary of policies mapped to a particular host.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC23allHostsMustBeEvaluated10evaluatorsACSb_SDySSAA0bC10Evaluating_pGtcfc":{"name":"init(allHostsMustBeEvaluated:evaluators:)","abstract":"

Initializes the ServerTrustManager instance with the given evaluators.

","parent_name":"ServerTrustManager"},"Classes/ServerTrustManager.html#/s:9Alamofire18ServerTrustManagerC06serverC9Evaluator7forHostAA0bC10Evaluating_pSgSS_tKF":{"name":"serverTrustEvaluator(forHost:)","abstract":"

Returns the ServerTrustEvaluating value for the given host, if one is set.

","parent_name":"ServerTrustManager"},"Classes/ConnectionLostRetryPolicy.html#/s:9Alamofire25ConnectionLostRetryPolicyC10retryLimit22exponentialBackoffBase0hI5Scale20retryableHTTPMethodsACSu_SuSdShyAA10HTTPMethodVGtcfc":{"name":"init(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:)","abstract":"

Creates a ConnectionLostRetryPolicy instance from the specified parameters.

","parent_name":"ConnectionLostRetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC07defaultB5LimitSuvpZ":{"name":"defaultRetryLimit","abstract":"

The default retry limit for retry policies.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC29defaultExponentialBackoffBaseSuvpZ":{"name":"defaultExponentialBackoffBase","abstract":"

The default exponential backoff base for retry policies (must be a minimum of 2).

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC30defaultExponentialBackoffScaleSdvpZ":{"name":"defaultExponentialBackoffScale","abstract":"

The default exponential backoff scale for retry policies.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC27defaultRetryableHTTPMethodsShyAA10HTTPMethodVGvpZ":{"name":"defaultRetryableHTTPMethods","abstract":"

The default HTTP methods to retry.","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC31defaultRetryableHTTPStatusCodesShySiGvpZ":{"name":"defaultRetryableHTTPStatusCodes","abstract":"

The default HTTP status codes to retry.","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC29defaultRetryableURLErrorCodesShy10Foundation0F0V4CodeVGvpZ":{"name":"defaultRetryableURLErrorCodes","abstract":"

The default URL error codes to retry.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC10retryLimitSuvp":{"name":"retryLimit","abstract":"

The total number of times the request is allowed to be retried.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC22exponentialBackoffBaseSuvp":{"name":"exponentialBackoffBase","abstract":"

The base of the exponential backoff policy (should always be greater than or equal to 2).

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC23exponentialBackoffScaleSdvp":{"name":"exponentialBackoffScale","abstract":"

The scale of the exponential backoff.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC20retryableHTTPMethodsShyAA10HTTPMethodVGvp":{"name":"retryableHTTPMethods","abstract":"

The HTTP methods that are allowed to be retried.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC24retryableHTTPStatusCodesShySiGvp":{"name":"retryableHTTPStatusCodes","abstract":"

The HTTP status codes that are automatically retried by the policy.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC22retryableURLErrorCodesShy10Foundation0E0V4CodeVGvp":{"name":"retryableURLErrorCodes","abstract":"

The URL error codes that are automatically retried by the policy.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC10retryLimit22exponentialBackoffBase0fG5Scale20retryableHTTPMethods0J15HTTPStatusCodes0j8URLErrorM0ACSu_SuSdShyAA10HTTPMethodVGShySiGShy10Foundation0N0V4CodeVGtcfc":{"name":"init(retryLimit:exponentialBackoffBase:exponentialBackoffScale:retryableHTTPMethods:retryableHTTPStatusCodes:retryableURLErrorCodes:)","abstract":"

Creates a RetryPolicy from the specified parameters.

","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"RetryPolicy"},"Classes/RetryPolicy.html#/s:9Alamofire11RetryPolicyC06shouldB07request5dueToSbAA7RequestC_s5Error_ptF":{"name":"shouldRetry(request:dueTo:)","abstract":"

Determines whether or not to retry the provided Request.

","parent_name":"RetryPolicy"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire27DecodableResponseSerializerC7decoderAA11DataDecoder_pvp":{"name":"decoder","abstract":"

The DataDecoder instance used to decode responses.

","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire27DecodableResponseSerializerC16dataPreprocessor7decoder05emptyC5Codes0H14RequestMethodsACyxGAA04DataF0_p_AA0L7Decoder_pShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates an instance using the values provided.

","parent_name":"DecodableResponseSerializer"},"Classes/DecodableResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"DecodableResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire22JSONResponseSerializerC7optionsSo20NSJSONReadingOptionsVvp":{"name":"options","abstract":"

JSONSerialization.ReadingOptions used when serializing a response.

","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire22JSONResponseSerializerC16dataPreprocessor18emptyResponseCodes0F14RequestMethods7optionsAcA04DataE0_p_ShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVtcfc":{"name":"init(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:)","abstract":"

Creates an instance with the provided values.

","parent_name":"JSONResponseSerializer"},"Classes/JSONResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"JSONResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire24StringResponseSerializerC8encodingSS10FoundationE8EncodingVSgvp":{"name":"encoding","abstract":"

Optional string encoding used to validate the response.

","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire24StringResponseSerializerC16dataPreprocessor8encoding05emptyC5Codes0H14RequestMethodsAcA04DataF0_p_SS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates an instance with the provided values.

","parent_name":"StringResponseSerializer"},"Classes/StringResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"StringResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP16dataPreprocessorAA04DataE0_pvp":{"name":"dataPreprocessor","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP05emptyB5CodesShySiGvp":{"name":"emptyResponseCodes","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire18ResponseSerializerP19emptyRequestMethodsShyAA10HTTPMethodVGvp":{"name":"emptyRequestMethods","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire22DataResponseSerializerC16dataPreprocessor05emptyC5Codes0G14RequestMethodsAcA0bF0_p_ShySiGShyAA10HTTPMethodVGtcfc":{"name":"init(dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponseSerializer using the provided parameters.

","parent_name":"DataResponseSerializer"},"Classes/DataResponseSerializer.html#/s:9Alamofire30DataResponseSerializerProtocolP9serialize7request8response4data5error16SerializedObjectQz10Foundation10URLRequestVSg_So17NSHTTPURLResponseCSgAK0B0VSgs5Error_pSgtKF":{"name":"serialize(request:response:data:error:)","parent_name":"DataResponseSerializer"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8adaptersSayAA14RequestAdapter_pGvp":{"name":"adapters","abstract":"

All RequestAdapters associated with the instance. These adapters will be run until one fails.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8retriersSayAA14RequestRetrier_pGvp":{"name":"retriers","abstract":"

All RequestRetriers associated with the instance. These retriers will be run one at a time until one triggers retry.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC12adaptHandler05retryD0ACy10Foundation10URLRequestV_AA7SessionCys6ResultOyAHs5Error_pGctc_yAA7RequestC_AJsAM_pyAA05RetryI0Octctcfc":{"name":"init(adaptHandler:retryHandler:)","abstract":"

Creates an instance from AdaptHandler and RetryHandler closures.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC7adapter7retrierAcA14RequestAdapter_p_AA0E7Retrier_ptcfc":{"name":"init(adapter:retrier:)","abstract":"

Creates an instance from RequestAdapter and RequestRetrier values.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire11InterceptorC8adapters8retriers12interceptorsACSayAA14RequestAdapter_pG_SayAA0F7Retrier_pGSayAA0fB0_pGtcfc":{"name":"init(adapters:retriers:interceptors:)","abstract":"

Creates an instance from the arrays of RequestAdapter and RequestRetrier values.

","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","parent_name":"Interceptor"},"Classes/Interceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"Interceptor"},"Classes/Retrier.html#/s:9Alamofire7RetrierCyACyAA7RequestC_AA7SessionCs5Error_pyAA11RetryResultOctccfc":{"name":"init(_:)","abstract":"

Creates an instance using the provided closure.

","parent_name":"Retrier"},"Classes/Retrier.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"Retrier"},"Classes/Adapter.html#/s:9Alamofire7AdapterCyACy10Foundation10URLRequestV_AA7SessionCys6ResultOyAFs5Error_pGctccfc":{"name":"init(_:)","abstract":"

Creates an instance using the provided closure.

","parent_name":"Adapter"},"Classes/Adapter.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"Adapter"},"Classes/Adapter.html#/s:9Alamofire14RequestAdapterP5adapt_5using10completiony10Foundation10URLRequestV_AA0bC5StateVys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:using:completion:)","parent_name":"Adapter"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO4datayAE10Foundation4DataVcAEmF":{"name":"data(_:)","abstract":"

Upload from the provided Data value.

","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO4fileyAE10Foundation3URLV_SbtcAEmF":{"name":"file(_:shouldRemove:)","abstract":"

Upload from the provided file URL, as well as a Bool determining whether the source file should be","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire13UploadRequestC10UploadableO6streamyAESo13NSInputStreamCcAEmF":{"name":"stream(_:)","abstract":"

Upload from the provided InputStream.

","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html#/s:9Alamofire21UploadableConvertibleP06createB0AA13UploadRequestC0B0OyKF":{"name":"createUploadable()","parent_name":"Uploadable"},"Classes/UploadRequest/Uploadable.html":{"name":"Uploadable","abstract":"

Type describing the origin of the upload, whether Data, file, or stream.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC6uploadAA21UploadableConvertible_pvp":{"name":"upload","abstract":"

The UploadableConvertible value used to produce the Uploadable value for this instance.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC11fileManagerSo06NSFileE0Cvp":{"name":"fileManager","abstract":"

FileManager used to perform cleanup tasks, including the removal of multipart form encoded payloads written","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC10uploadableAC10UploadableOSgvp":{"name":"uploadable","abstract":"

Uploadable value used by the instance.

","parent_name":"UploadRequest"},"Classes/UploadRequest.html#/s:9Alamofire13UploadRequestC7cleanupyyF":{"name":"cleanup()","parent_name":"UploadRequest"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO15methodDependentyA2EmF":{"name":"methodDependent","abstract":"

Applies the encoded query string to any existing query string for .get, .head, and .delete request.","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO11queryStringyA2EmF":{"name":"queryString","abstract":"

Applies the encoded query string to any existing query string from the URLRequest.

","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11DestinationO8httpBodyyA2EmF":{"name":"httpBody","abstract":"

Applies the encoded query string to the httpBody of the URLRequest.

","parent_name":"Destination"},"Classes/URLEncodedFormParameterEncoder/Destination.html":{"name":"Destination","abstract":"

Defines where the URL-encoded string should be set for each URLRequest.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7defaultACvpZ":{"name":"default","abstract":"

Returns an encoder with default parameters.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7encoderAA0bcE0Cvp":{"name":"encoder","abstract":"

The URLEncodedFormEncoder to use.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC11destinationAC11DestinationOvp":{"name":"destination","abstract":"

The Destination for the URL-encoded string.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire30URLEncodedFormParameterEncoderC7encoder11destinationAcA0bcE0C_AC11DestinationOtcfc":{"name":"init(encoder:destination:)","abstract":"

Creates an instance with the provided URLEncodedFormEncoder instance and Destination value.

","parent_name":"URLEncodedFormParameterEncoder"},"Classes/URLEncodedFormParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","parent_name":"URLEncodedFormParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7defaultACvpZ":{"name":"default","abstract":"

Returns an encoder with default parameters.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC13prettyPrintedACvpZ":{"name":"prettyPrinted","abstract":"

Returns an encoder with JSONEncoder.outputFormatting set to .prettyPrinted.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC10sortedKeysACvpZ":{"name":"sortedKeys","abstract":"

Returns an encoder with JSONEncoder.outputFormatting set to .sortedKeys.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7encoder10Foundation11JSONEncoderCvp":{"name":"encoder","abstract":"

JSONEncoder used to encode parameters.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire20JSONParameterEncoderC7encoderAC10Foundation11JSONEncoderC_tcfc":{"name":"init(encoder:)","abstract":"

Creates an instance with the provided JSONEncoder.

","parent_name":"JSONParameterEncoder"},"Classes/JSONParameterEncoder.html#/s:9Alamofire16ParameterEncoderP6encode_4into10Foundation10URLRequestVqd__Sg_AHtKSERd__lF":{"name":"encode(_:into:)","parent_name":"JSONParameterEncoder"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"AlamofireNotifications"},"Classes/AlamofireNotifications.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"AlamofireNotifications"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO14ConnectionTypeO14ethernetOrWiFiyA2GmF":{"name":"ethernetOrWiFi","abstract":"

The connection type is either over Ethernet or WiFi.

","parent_name":"ConnectionType"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO14ConnectionTypeO8cellularyA2GmF":{"name":"cellular","abstract":"

The connection type is a cellular connection.

","parent_name":"ConnectionType"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO7unknownyA2EmF":{"name":"unknown","abstract":"

It is unknown whether the network is reachable.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO12notReachableyA2EmF":{"name":"notReachable","abstract":"

The network is not reachable.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html#/s:9Alamofire26NetworkReachabilityManagerC0bC6StatusO9reachableyA2E14ConnectionTypeOcAEmF":{"name":"reachable(_:)","abstract":"

The network is reachable on the associated ConnectionType.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus/ConnectionType.html":{"name":"ConnectionType","abstract":"

Defines the various connection types detected by reachability flags.

","parent_name":"NetworkReachabilityStatus"},"Classes/NetworkReachabilityManager/NetworkReachabilityStatus.html":{"name":"NetworkReachabilityStatus","abstract":"

Defines the various states of network reachability.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC8Listenera":{"name":"Listener","abstract":"

A closure executed when the network reachability status changes. The closure takes a single argument: the","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC7defaultACSgvpZ":{"name":"default","abstract":"

Default NetworkReachabilityManager for the zero address and a listenerQueue of .main.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC11isReachableSbvp":{"name":"isReachable","abstract":"

Whether the network is currently reachable.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC21isReachableOnCellularSbvp":{"name":"isReachableOnCellular","abstract":"

Whether the network is currently reachable over the cellular interface.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC27isReachableOnEthernetOrWiFiSbvp":{"name":"isReachableOnEthernetOrWiFi","abstract":"

Whether the network is currently reachable over Ethernet or WiFi interface.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC17reachabilityQueueSo17OS_dispatch_queueCvp":{"name":"reachabilityQueue","abstract":"

DispatchQueue on which reachability will update.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC5flagsSo09SCNetworkC5FlagsVSgvp":{"name":"flags","abstract":"

Flags of the current reachability type, if any.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC6statusAC0bC6StatusOvp":{"name":"status","abstract":"

The current network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC4hostACSgSS_tcfc":{"name":"init(host:)","abstract":"

Creates an instance with the specified host.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerCACSgycfc":{"name":"init()","abstract":"

Creates an instance that monitors the address 0.0.0.0.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC14startListening7onQueue0G16UpdatePerformingSbSo17OS_dispatch_queueC_yAC0bC6StatusOctF":{"name":"startListening(onQueue:onUpdatePerforming:)","abstract":"

Starts listening for changes in network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/NetworkReachabilityManager.html#/s:9Alamofire26NetworkReachabilityManagerC13stopListeningyyF":{"name":"stopListening()","abstract":"

Stops listening for changes in network reachability status.

","parent_name":"NetworkReachabilityManager"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC23encodingMemoryThresholds6UInt64VvpZ":{"name":"encodingMemoryThreshold","abstract":"

Default memory threshold used when encoding MultipartFormData, in bytes.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC11contentTypeSSvp":{"name":"contentType","abstract":"

The Content-Type header value containing the boundary used to generate the multipart/form-data.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC13contentLengths6UInt64Vvp":{"name":"contentLength","abstract":"

The content length of all body parts used to generate the multipart/form-data not including the boundaries.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC8boundarySSvp":{"name":"boundary","abstract":"

The boundary used to separate the body parts in the encoded form data.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC11fileManager8boundaryACSo06NSFileF0C_SSSgtcfc":{"name":"init(fileManager:boundary:)","abstract":"

Creates an instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withName04fileG08mimeTypey10Foundation0D0V_S2SSgAKtF":{"name":"append(_:withName:fileName:mimeType:)","abstract":"

Creates a body part from the data and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withNamey10Foundation3URLV_SStF":{"name":"append(_:withName:)","abstract":"

Creates a body part from the file and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_8withName04fileG08mimeTypey10Foundation3URLV_S3StF":{"name":"append(_:withName:fileName:mimeType:)","abstract":"

Creates a body part from the file and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_10withLength4name8fileName8mimeTypeySo13NSInputStreamC_s6UInt64VS3StF":{"name":"append(_:withLength:name:fileName:mimeType:)","abstract":"

Creates a body part from the stream and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6append_10withLength7headersySo13NSInputStreamC_s6UInt64VAA11HTTPHeadersVtF":{"name":"append(_:withLength:headers:)","abstract":"

Creates a body part with the stream, length, and headers and appends it to the instance.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC6encode10Foundation0D0VyKF":{"name":"encode()","abstract":"

Encodes all appended body parts into a single Data value.

","parent_name":"MultipartFormData"},"Classes/MultipartFormData.html#/s:9Alamofire17MultipartFormDataC012writeEncodedD02toy10Foundation3URLV_tKF":{"name":"writeEncodedData(to:)","abstract":"

Writes all appended body parts to the given file URL.

","parent_name":"MultipartFormData"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC32sessionDidBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtcSgvp":{"name":"sessionDidBecomeInvalidWithError","abstract":"

Closure called on the urlSession(_:didBecomeInvalidWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23taskDidReceiveChallengeySo12NSURLSessionC_So0I4TaskCSo019NSURLAuthenticationH0CtcSgvp":{"name":"taskDidReceiveChallenge","abstract":"

Closure called on the urlSession(_:task:didReceive:completionHandler:).

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC19taskDidSendBodyDataySo12NSURLSessionC_So0J4TaskCs5Int64VA2JtcSgvp":{"name":"taskDidSendBodyData","abstract":"

Closure that receives urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC21taskNeedNewBodyStreamySo12NSURLSessionC_So0J4TaskCtcSgvp":{"name":"taskNeedNewBodyStream","abstract":"

Closure called on the urlSession(_:task:needNewBodyStream:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30taskWillPerformHTTPRedirectionySo12NSURLSessionC_So0I4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtcSgvp":{"name":"taskWillPerformHTTPRedirection","abstract":"

Closure called on the urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30taskDidFinishCollectingMetricsySo12NSURLSessionC_So0J4TaskCSo0jkI0CtcSgvp":{"name":"taskDidFinishCollectingMetrics","abstract":"

Closure called on the urlSession(_:task:didFinishCollecting:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC15taskDidCompleteySo12NSURLSessionC_So0H4TaskCs5Error_pSgtcSgvp":{"name":"taskDidComplete","abstract":"

Closure called on the urlSession(_:task:didCompleteWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC28taskIsWaitingForConnectivityySo12NSURLSessionC_So0J4TaskCtcSgvp":{"name":"taskIsWaitingForConnectivity","abstract":"

Closure called on the urlSession(_:taskIsWaitingForConnectivity:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26dataTaskDidReceiveResponseySo12NSURLSessionC_So0j4DataF0CSo13NSURLResponseCtcSgvp":{"name":"dataTaskDidReceiveResponse","abstract":"

Closure called on the urlSession(_:dataTask:didReceive:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC22dataTaskDidReceiveDataySo12NSURLSessionC_So0jiF0C10Foundation0I0VtcSgvp":{"name":"dataTaskDidReceiveData","abstract":"

Closure that receives the urlSession(_:dataTask:didReceive:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC25dataTaskWillCacheResponseySo12NSURLSessionC_So0j4DataF0CSo19NSCachedURLResponseCtcSgvp":{"name":"dataTaskWillCacheResponse","abstract":"

Closure called on the urlSession(_:dataTask:willCacheResponse:completionHandler:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC37downloadTaskDidFinishDownloadingToURLySo12NSURLSessionC_So0l8DownloadF0C10Foundation0K0VtcSgvp":{"name":"downloadTaskDidFinishDownloadingToURL","abstract":"

Closure called on the urlSession(_:downloadTask:didFinishDownloadingTo:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC24downloadTaskDidWriteDataySo12NSURLSessionC_So0j8DownloadF0Cs5Int64VA2JtcSgvp":{"name":"downloadTaskDidWriteData","abstract":"

Closure called on the urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC29downloadTaskDidResumeAtOffsetySo12NSURLSessionC_So0k8DownloadF0Cs5Int64VAJtcSgvp":{"name":"downloadTaskDidResumeAtOffset","abstract":"

Closure called on the urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC33requestDidCreateInitialURLRequestyAA7RequestC_10Foundation0I0VtcSgvp":{"name":"requestDidCreateInitialURLRequest","abstract":"

Closure called on the request(_:didCreateInitialURLRequest:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC41requestDidFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtcSgvp":{"name":"requestDidFailToCreateURLRequestWithError","abstract":"

Closure called on the request(_:didFailToCreateURLRequestWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC038requestDidAdaptInitialRequestToAdaptedI0yAA0I0C_10Foundation10URLRequestVAItcSgvp":{"name":"requestDidAdaptInitialRequestToAdaptedRequest","abstract":"

Closure called on the request(_:didAdaptInitialRequest:to:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC40requestDidFailToAdaptURLRequestWithErroryAA7RequestC_10Foundation0J0VAA7AFErrorOtcSgvp":{"name":"requestDidFailToAdaptURLRequestWithError","abstract":"

Closure called on the request(_:didFailToAdaptURLRequest:withError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26requestDidCreateURLRequestyAA7RequestC_10Foundation0H0VtcSgvp":{"name":"requestDidCreateURLRequest","abstract":"

Closure called on the request(_:didCreateURLRequest:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidCreateTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidCreateTask","abstract":"

Closure called on the request(_:didCreateTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23requestDidGatherMetricsyAA7RequestC_So016NSURLSessionTaskH0CtcSgvp":{"name":"requestDidGatherMetrics","abstract":"

Closure called on the request(_:didGatherMetrics:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC32requestDidFailTaskEarlyWithErroryAA7RequestC_So012NSURLSessionH0CAA7AFErrorOtcSgvp":{"name":"requestDidFailTaskEarlyWithError","abstract":"

Closure called on the request(_:didFailTask:earlyWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC31requestDidCompleteTaskWithErroryAA7RequestC_So012NSURLSessionH0CAA7AFErrorOSgtcSgvp":{"name":"requestDidCompleteTaskWithError","abstract":"

Closure called on the request(_:didCompleteTask:with:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC17requestIsRetryingyAA7RequestCcSgvp":{"name":"requestIsRetrying","abstract":"

Closure called on the requestIsRetrying(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidFinishyAA7RequestCcSgvp":{"name":"requestDidFinish","abstract":"

Closure called on the requestDidFinish(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidResumeyAA7RequestCcSgvp":{"name":"requestDidResume","abstract":"

Closure called on the requestDidResume(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidResumeTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidResumeTask","abstract":"

Closure called on the request(_:didResumeTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC17requestDidSuspendyAA7RequestCcSgvp":{"name":"requestDidSuspend","abstract":"

Closure called on the requestDidSuspend(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC21requestDidSuspendTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidSuspendTask","abstract":"

Closure called on the request(_:didSuspendTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC16requestDidCancelyAA7RequestCcSgvp":{"name":"requestDidCancel","abstract":"

Closure called on the requestDidCancel(_:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC20requestDidCancelTaskyAA7RequestC_So012NSURLSessionH0CtcSgvp":{"name":"requestDidCancelTask","abstract":"

Closure called on the request(_:didCancelTask:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC47requestDidValidateRequestResponseDataWithResultyAA0jH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAG0J0VSgs0L0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseDataWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:data:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC23requestDidParseResponseyAA11DataRequestC_AA0iH0Vy10Foundation0I0VSgAA7AFErrorOGtcSgvp":{"name":"requestDidParseResponse","abstract":"

Closure called on the request(_:didParseResponse:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC43requestDidValidateRequestResponseWithResultyAA010DataStreamH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0K0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC26requestDidCreateUploadableyAA13UploadRequestC_AF0H0OtcSgvp":{"name":"requestDidCreateUploadable","abstract":"

Closure called on the request(_:didCreateUploadable:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC41requestDidFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtcSgvp":{"name":"requestDidFailToCreateUploadableWithError","abstract":"

Closure called on the request(_:didFailToCreateUploadableWithError:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC28requestDidProvideInputStreamyAA13UploadRequestC_So07NSInputI0CtcSgvp":{"name":"requestDidProvideInputStream","abstract":"

Closure called on the request(_:didProvideInputStream:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC46requestDidFinishDownloadingUsingTaskWithResultyAA15DownloadRequestC_So012NSURLSessionJ0Cs0L0Oy10Foundation3URLVAA7AFErrorOGtcSgvp":{"name":"requestDidFinishDownloadingUsingTaskWithResult","abstract":"

Closure called on the request(_:didFinishDownloadingUsing:with:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC30requestDidCreateDestinationURLyAA15DownloadRequestC_10Foundation0I0VtcSgvp":{"name":"requestDidCreateDestinationURL","abstract":"

Closure called on the request(_:didCreateDestinationURL:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC50requestDidValidateRequestResponseFileURLWithResultyAA08DownloadH0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAG3URLVSgs0L0Oyyts5Error_pGtcSgvp":{"name":"requestDidValidateRequestResponseFileURLWithResult","abstract":"

Closure called on the request(_:didValidateRequest:response:temporaryURL:destinationURL:withResult:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC31requestDidParseDownloadResponseyAA0H7RequestC_AA0hI0Vy10Foundation3URLVSgAA7AFErrorOGtcSgvp":{"name":"requestDidParseDownloadResponse","abstract":"

Closure called on the request(_:didParseResponse:) event.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire19ClosureEventMonitorC5queueACSo012OS_dispatch_E0C_tcfc":{"name":"init(queue:)","abstract":"

Creates an instance using the provided queue.

","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","parent_name":"ClosureEventMonitor"},"Classes/ClosureEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"ClosureEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP5queueSo012OS_dispatch_D0Cvp":{"name":"queue","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_25didBecomeInvalidWithErrorySo12NSURLSessionC_s0J0_pSgtF":{"name":"urlSession(_:didBecomeInvalidWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task10didReceiveySo12NSURLSessionC_So0I4TaskCSo28NSURLAuthenticationChallengeCtF":{"name":"urlSession(_:task:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task15didSendBodyData14totalBytesSent0kl10ExpectedToH0ySo12NSURLSessionC_So0P4TaskCs5Int64VA2NtF":{"name":"urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_22taskNeedsNewBodyStreamySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskNeedsNewBodyStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task26willPerformHTTPRedirection10newRequestySo12NSURLSessionC_So0L4TaskCSo17NSHTTPURLResponseC10Foundation10URLRequestVtF":{"name":"urlSession(_:task:willPerformHTTPRedirection:newRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task19didFinishCollectingySo12NSURLSessionC_So0J4TaskCSo0jK7MetricsCtF":{"name":"urlSession(_:task:didFinishCollecting:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_4task20didCompleteWithErrorySo12NSURLSessionC_So0K4TaskCs0J0_pSgtF":{"name":"urlSession(_:task:didCompleteWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_28taskIsWaitingForConnectivityySo12NSURLSessionC_So0K4TaskCtF":{"name":"urlSession(_:taskIsWaitingForConnectivity:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0CSo13NSURLResponseCtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask10didReceiveySo12NSURLSessionC_So0j4DataG0C10Foundation0K0VtF":{"name":"urlSession(_:dataTask:didReceive:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_8dataTask17willCacheResponseySo12NSURLSessionC_So0k4DataG0CSo19NSCachedURLResponseCtF":{"name":"urlSession(_:dataTask:willCacheResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask17didResumeAtOffset18expectedTotalBytesySo12NSURLSessionC_So0o8DownloadG0Cs5Int64VAMtF":{"name":"urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask12didWriteData17totalBytesWritten0kl10ExpectedToI0ySo12NSURLSessionC_So0p8DownloadG0Cs5Int64VA2NtF":{"name":"urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP10urlSession_12downloadTask22didFinishDownloadingToySo12NSURLSessionC_So0l8DownloadG0C10Foundation3URLVtF":{"name":"urlSession(_:downloadTask:didFinishDownloadingTo:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_26didCreateInitialURLRequestyAA7RequestC_10Foundation0H0VtF":{"name":"request(_:didCreateInitialURLRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateURLRequestWithErroryAA7RequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateURLRequestWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_22didAdaptInitialRequest2toyAA0H0C_10Foundation10URLRequestVAKtF":{"name":"request(_:didAdaptInitialRequest:to:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_24didFailToAdaptURLRequest9withErroryAA7RequestC_10Foundation0I0VAA7AFErrorOtF":{"name":"request(_:didFailToAdaptURLRequest:withError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateURLRequestyAA7RequestC_10Foundation0G0VtF":{"name":"request(_:didCreateURLRequest:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCreateTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCreateTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didGatherMetricsyAA7RequestC_So016NSURLSessionTaskG0CtF":{"name":"request(_:didGatherMetrics:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_11didFailTask14earlyWithErroryAA7RequestC_So012NSURLSessionG0CAA7AFErrorOtF":{"name":"request(_:didFailTask:earlyWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_15didCompleteTask4withyAA7RequestC_So012NSURLSessionG0CAA7AFErrorOSgtF":{"name":"request(_:didCompleteTask:with:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP17requestIsRetryingyyAA7RequestCF":{"name":"requestIsRetrying(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidFinishyyAA7RequestCF":{"name":"requestDidFinish(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidResumeyyAA7RequestCF":{"name":"requestDidResume(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didResumeTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didResumeTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP17requestDidSuspendyyAA7RequestCF":{"name":"requestDidSuspend(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didSuspendTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didSuspendTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP16requestDidCancelyyAA7RequestCF":{"name":"requestDidCancel(_:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_13didCancelTaskyAA7RequestC_So012NSURLSessionG0CtF":{"name":"request(_:didCancelTask:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response4data10withResultyAA04DataG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0L0VSgs0K0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:data:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vy10Foundation0H0VSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA11DataRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response10withResultyAA010DataStreamG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCs0J0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_14didParseStreamyAA04DataG7RequestC_s6ResultOyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_19didCreateUploadableyAA13UploadRequestC_AG0G0OtF":{"name":"request(_:didCreateUploadable:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_34didFailToCreateUploadableWithErroryAA13UploadRequestC_AA7AFErrorOtF":{"name":"request(_:didFailToCreateUploadableWithError:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_21didProvideInputStreamyAA13UploadRequestC_So07NSInputH0CtF":{"name":"request(_:didProvideInputStream:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_25didFinishDownloadingUsing4withyAA15DownloadRequestC_So16NSURLSessionTaskCs6ResultOy10Foundation3URLVAA7AFErrorOGtF":{"name":"request(_:didFinishDownloadingUsing:with:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_23didCreateDestinationURLyAA15DownloadRequestC_10Foundation0H0VtF":{"name":"request(_:didCreateDestinationURL:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_18didValidateRequest8response7fileURL10withResultyAA08DownloadG0C_10Foundation10URLRequestVSgSo17NSHTTPURLResponseCAK0J0VSgs0L0Oyyts5Error_pGtF":{"name":"request(_:didValidateRequest:response:fileURL:withResult:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vy10Foundation3URLVSgAA7AFErrorOGtF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/CompositeEventMonitor.html#/s:9Alamofire12EventMonitorP7request_16didParseResponseyAA15DownloadRequestC_AA0hG0Vyqd__AA7AFErrorOGtlF":{"name":"request(_:didParseResponse:)","parent_name":"CompositeEventMonitor"},"Classes/Request/ResponseDisposition.html#/s:9Alamofire7RequestC19ResponseDispositionO5allowyA2EmF":{"name":"allow","abstract":"

Allow the request to continue normally.

","parent_name":"ResponseDisposition"},"Classes/Request/ResponseDisposition.html#/s:9Alamofire7RequestC19ResponseDispositionO6cancelyA2EmF":{"name":"cancel","abstract":"

Cancel the request, similar to calling cancel().

","parent_name":"ResponseDisposition"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO11initializedyA2EmF":{"name":"initialized","abstract":"

Initial state of the Request.

","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO7resumedyA2EmF":{"name":"resumed","abstract":"

State set when resume() is called. Any tasks created for the Request will have resume() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO9suspendedyA2EmF":{"name":"suspended","abstract":"

State set when suspend() is called. Any tasks created for the Request will have suspend() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO9cancelledyA2EmF":{"name":"cancelled","abstract":"

State set when cancel() is called. Any tasks created for the Request will have cancel() called on","parent_name":"State"},"Classes/Request/State.html#/s:9Alamofire7RequestC5StateO8finishedyA2EmF":{"name":"finished","abstract":"

State set when all response serialization completion closures have been cleared on the Request and","parent_name":"State"},"Classes/Request/State.html":{"name":"State","abstract":"

State of the Request, with managed transitions between states set when calling resume(), suspend(), or","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC2id10Foundation4UUIDVvp":{"name":"id","abstract":"

UUID providing a unique identifier for the Request, used in the Hashable and Equatable conformances.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15underlyingQueueSo17OS_dispatch_queueCvp":{"name":"underlyingQueue","abstract":"

The serial queue for all internal async actions.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC18serializationQueueSo17OS_dispatch_queueCvp":{"name":"serializationQueue","abstract":"

The queue used for all serialization actions. By default it’s a serial queue that targets underlyingQueue.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12eventMonitorAA05EventD0_pSgvp":{"name":"eventMonitor","abstract":"

EventMonitor used for event callbacks.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11interceptorAA0B11Interceptor_pSgvp":{"name":"interceptor","abstract":"

The Request‘s interceptor.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8delegateAA0B8Delegate_pSgvp":{"name":"delegate","abstract":"

The Request‘s delegate.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5stateAC5StateOvp":{"name":"state","abstract":"

State of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC13isInitializedSbvp":{"name":"isInitialized","abstract":"

Returns whether state is .initialized.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC9isResumedSbvp":{"name":"isResumed","abstract":"

Returns whether state is.resumed`.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11isSuspendedSbvp":{"name":"isSuspended","abstract":"

Returns whether state is .suspended.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11isCancelledSbvp":{"name":"isCancelled","abstract":"

Returns whether state is .cancelled.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10isFinishedSbvp":{"name":"isFinished","abstract":"

Returns whether state is .finished.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15ProgressHandlera":{"name":"ProgressHandler","abstract":"

Closure type executed when monitoring the upload or download progress of a request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgressSo10NSProgressCvp":{"name":"uploadProgress","abstract":"

Progress of the upload of the body of the executed URLRequest. Reset to 0 if the Request is retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgressSo10NSProgressCvp":{"name":"downloadProgress","abstract":"

Progress of the download of any response data. Reset to 0 if the Request is retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15redirectHandlerAA08RedirectD0_pSgvp":{"name":"redirectHandler","abstract":"

RedirectHandler set on the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21cachedResponseHandlerAA06CacheddE0_pSgvp":{"name":"cachedResponseHandler","abstract":"

CachedResponseHandler set on the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10credentialSo15NSURLCredentialCSgvp":{"name":"credential","abstract":"

URLCredential used for authentication challenges. Created by calling one of the authenticate methods.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8requestsSay10Foundation10URLRequestVGvp":{"name":"requests","abstract":"

All URLRequests created on behalf of the Request, including original and adapted requests.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC05firstB010Foundation10URLRequestVSgvp":{"name":"firstRequest","abstract":"

First URLRequest created on behalf of the Request. May not be the first one actually executed.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC04lastB010Foundation10URLRequestVSgvp":{"name":"lastRequest","abstract":"

Last URLRequest created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

Current URLRequest created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC17performedRequestsSay10Foundation10URLRequestVGvp":{"name":"performedRequests","abstract":"

URLRequests from all of the URLSessionTasks executed on behalf of the Request. May be different from","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

HTTPURLResponse received from the server, if any. If the Request was retried, this is the response of the","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5tasksSaySo16NSURLSessionTaskCGvp":{"name":"tasks","abstract":"

All URLSessionTasks created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC9firstTaskSo012NSURLSessionD0CSgvp":{"name":"firstTask","abstract":"

First URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8lastTaskSo012NSURLSessionD0CSgvp":{"name":"lastTask","abstract":"

Last URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC4taskSo16NSURLSessionTaskCSgvp":{"name":"task","abstract":"

Current URLSessionTask created on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10allMetricsSaySo016NSURLSessionTaskD0CGvp":{"name":"allMetrics","abstract":"

All URLSessionTaskMetrics gathered on behalf of the Request. Should correspond to the tasks created.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12firstMetricsSo016NSURLSessionTaskD0CSgvp":{"name":"firstMetrics","abstract":"

First URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11lastMetricsSo016NSURLSessionTaskD0CSgvp":{"name":"lastMetrics","abstract":"

Last URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

Current URLSessionTaskMetrics gathered on behalf of the Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC10retryCountSivp":{"name":"retryCount","abstract":"

Number of times the Request has been retried.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC5errorAA7AFErrorOSgvp":{"name":"error","abstract":"

Error returned from Alamofire internally, from the network request directly, or any validators executed.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC6cancelACXDyF":{"name":"cancel()","abstract":"

Cancels the instance. Once cancelled, a Request can no longer be resumed or suspended.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC7suspendACXDyF":{"name":"suspend()","abstract":"

Suspends the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC6resumeACXDyF":{"name":"resume()","abstract":"

Resumes the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12authenticate8username8password11persistenceACXDSS_SSSo26NSURLCredentialPersistenceVtF":{"name":"authenticate(username:password:persistence:)","abstract":"

Associates a credential using the provided values with the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC12authenticate4withACXDSo15NSURLCredentialC_tF":{"name":"authenticate(with:)","abstract":"

Associates the provided credential with the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgress5queue7closureACXDSo012OS_dispatch_E0C_ySo10NSProgressCctF":{"name":"downloadProgress(queue:closure:)","abstract":"

Sets a closure to be called periodically during the lifecycle of the instance as data is read from the server.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgress5queue7closureACXDSo012OS_dispatch_E0C_ySo10NSProgressCctF":{"name":"uploadProgress(queue:closure:)","abstract":"

Sets a closure to be called periodically during the lifecycle of the instance as data is sent to the server.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC8redirect5usingACXDAA15RedirectHandler_p_tF":{"name":"redirect(using:)","abstract":"

Sets the redirect handler for the instance which will be used if a redirect response is encountered.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC13cacheResponse5usingACXDAA06CachedD7Handler_p_tF":{"name":"cacheResponse(using:)","abstract":"

Sets the cached response handler for the Request which will be used when attempting to cache a response.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescription2on7callingACXDSo17OS_dispatch_queueC_ySSctF":{"name":"cURLDescription(on:calling:)","abstract":"

Sets a handler to be called when the cURL description of the request is available.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescription7callingACXDySSc_tF":{"name":"cURLDescription(calling:)","abstract":"

Sets a handler to be called when the cURL description of the request is available.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC20onURLRequestCreation0C07performACXDSo17OS_dispatch_queueC_y10Foundation0D0VctF":{"name":"onURLRequestCreation(on:perform:)","abstract":"

Sets a closure to called whenever Alamofire creates a URLRequest for this instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC24onURLSessionTaskCreation0C07performACXDSo17OS_dispatch_queueC_ySo012NSURLSessionE0CctF":{"name":"onURLSessionTaskCreation(on:perform:)","abstract":"

Sets a closure to be called whenever the instance creates a URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC14uploadProgress15bufferingPolicyAA8StreamOfVySo10NSProgressCGScS12ContinuationV09BufferingF0OyAI__G_tF":{"name":"uploadProgress(bufferingPolicy:)","abstract":"

Creates a StreamOf<Progress> for the instance’s upload progress.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16downloadProgress15bufferingPolicyAA8StreamOfVySo10NSProgressCGScS12ContinuationV09BufferingF0OyAI__G_tF":{"name":"downloadProgress(bufferingPolicy:)","abstract":"

Creates a StreamOf<Progress> for the instance’s download progress.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11urlRequests15bufferingPolicyAA8StreamOfVy10Foundation10URLRequestVGScS12ContinuationV09BufferingF0OyAJ__G_tF":{"name":"urlRequests(bufferingPolicy:)","abstract":"

Creates a StreamOf<URLRequest> for the URLRequests produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15urlSessionTasks15bufferingPolicyAA8StreamOfVySo16NSURLSessionTaskCGScS12ContinuationV09BufferingG0OyAI__G_tF":{"name":"urlSessionTasks(bufferingPolicy:)","abstract":"

Creates a StreamOf<URLSessionTask> for the URLSessionTasks produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16cURLDescriptions15bufferingPolicyAA8StreamOfVySSGScS12ContinuationV09BufferingE0OySS__G_tF":{"name":"cURLDescriptions(bufferingPolicy:)","abstract":"

Creates a StreamOf<String> for the cURL descriptions produced for the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didResumeNotificationSo18NSNotificationNameavpZ":{"name":"didResumeNotification","abstract":"

Posted when a Request is resumed. The Notification contains the resumed Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC22didSuspendNotificationSo18NSNotificationNameavpZ":{"name":"didSuspendNotification","abstract":"

Posted when a Request is suspended. The Notification contains the suspended Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didCancelNotificationSo18NSNotificationNameavpZ":{"name":"didCancelNotification","abstract":"

Posted when a Request is cancelled. The Notification contains the cancelled Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC21didFinishNotificationSo18NSNotificationNameavpZ":{"name":"didFinishNotification","abstract":"

Posted when a Request is finished. The Notification contains the completed Request.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC25didResumeTaskNotificationSo18NSNotificationNameavpZ":{"name":"didResumeTaskNotification","abstract":"

Posted when a URLSessionTask is resumed. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC26didSuspendTaskNotificationSo18NSNotificationNameavpZ":{"name":"didSuspendTaskNotification","abstract":"

Posted when a URLSessionTask is suspended. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC25didCancelTaskNotificationSo18NSNotificationNameavpZ":{"name":"didCancelTaskNotification","abstract":"

Posted when a URLSessionTask is cancelled. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC27didCompleteTaskNotificationSo18NSNotificationNameavpZ":{"name":"didCompleteTaskNotification","abstract":"

Posted when a URLSessionTask is completed. The Notification contains the Request associated with the URLSessionTask.

","parent_name":"Request"},"Classes/Request/ResponseDisposition.html":{"name":"ResponseDisposition","abstract":"

Type indicating how a DataRequest or DataStreamRequest should proceed after receiving an HTTPURLResponse.

","parent_name":"Request"},"Classes/Request.html#/s:SQ2eeoiySbx_xtFZ":{"name":"==(_:_:)","parent_name":"Request"},"Classes/Request.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC11descriptionSSvp":{"name":"description","abstract":"

A textual representation of this instance, including the HTTPMethod and URL if the URLRequest has been","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC15cURLDescriptionSSyF":{"name":"cURLDescription()","abstract":"

cURL representation of the instance.

","parent_name":"Request"},"Classes/Request.html#/s:9Alamofire7RequestC16ValidationResulta":{"name":"ValidationResult","abstract":"

Used to represent whether a validation succeeded or failed.

","parent_name":"Request"},"Classes/DownloadRequest/Downloadable.html#/s:9Alamofire15DownloadRequestC12DownloadableO7requestyAeA21URLRequestConvertible_pcAEmF":{"name":"request(_:)","abstract":"

Download should be started from the URLRequest produced by the associated URLRequestConvertible value.

","parent_name":"Downloadable"},"Classes/DownloadRequest/Downloadable.html#/s:9Alamofire15DownloadRequestC12DownloadableO10resumeDatayAE10Foundation0F0VcAEmF":{"name":"resumeData(_:)","abstract":"

Download should be started from the associated resume Data value.

","parent_name":"Downloadable"},"Classes/DownloadRequest/Options.html#/s:9Alamofire15DownloadRequestC7OptionsV29createIntermediateDirectoriesAEvpZ":{"name":"createIntermediateDirectories","abstract":"

Specifies that intermediate directories for the destination URL should be created.

","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:9Alamofire15DownloadRequestC7OptionsV18removePreviousFileAEvpZ":{"name":"removePreviousFile","abstract":"

Specifies that any previous file at the destination URL should be removed.

","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:SY8rawValue03RawB0Qzvp":{"name":"rawValue","parent_name":"Options"},"Classes/DownloadRequest/Options.html#/s:s9OptionSetP8rawValuex03RawD0Qz_tcfc":{"name":"init(rawValue:)","parent_name":"Options"},"Classes/DownloadRequest/Options.html":{"name":"Options","abstract":"

A set of options to be executed prior to moving a downloaded file from the temporary URL to the destination","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11Destinationa":{"name":"Destination","abstract":"

A closure executed once a DownloadRequest has successfully completed in order to determine where to move the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC09suggestedB11Destination3for2in7options10Foundation3URLV011destinationJ0_AC7OptionsVAGtAJ_So17NSHTTPURLResponseCtcSo21NSSearchPathDirectoryV_So0nO10DomainMaskVAMtFZ":{"name":"suggestedDownloadDestination(for:in:options:)","abstract":"

Creates a download file destination closure which uses the default file manager to move the temporary file to a","parent_name":"DownloadRequest"},"Classes/DownloadRequest/Downloadable.html":{"name":"Downloadable","abstract":"

Type describing the source used to create the underlying URLSessionDownloadTask.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10resumeData10Foundation0E0VSgvp":{"name":"resumeData","abstract":"

If the download is resumable and is eventually cancelled or fails, this value may be used to resume the download","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC7fileURL10Foundation0E0VSgvp":{"name":"fileURL","abstract":"

If the download is successful, the URL where the file was downloaded.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12downloadableAC12DownloadableOvp":{"name":"downloadable","abstract":"

Downloadable value used for this instance.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC4task13forResumeData5usingSo16NSURLSessionTaskC10Foundation0G0V_So0I0CtF":{"name":"task(forResumeData:using:)","abstract":"

Creates a URLSessionTask from the provided resume data.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancelACXDyF":{"name":"cancel()","abstract":"

Cancels the instance. Once cancelled, a DownloadRequest can no longer be resumed or suspended.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancel19producingResumeDataACXDSb_tF":{"name":"cancel(producingResumeData:)","abstract":"

Cancels the instance, optionally producing resume data. Once cancelled, a DownloadRequest can no longer be","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC6cancel21byProducingResumeDataACXDy10Foundation0H0VSgc_tF":{"name":"cancel(byProducingResumeData:)","abstract":"

Cancels the instance while producing resume data. Once cancelled, a DownloadRequest can no longer be resumed","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCAI3URLVSgtcF":{"name":"validate(_:)","abstract":"

Validates the request, using the specified closure.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0E10SerializerRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DownloadResponsePublisher for this instance using the given ResponseSerializer and DispatchQueue.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0bE18SerializerProtocolRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DownloadResponsePublisher for this instance using the given DownloadResponseSerializerProtocol and","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10publishURL5queueAA0B17ResponsePublisherVy10Foundation0E0VGSo012OS_dispatch_F0C_tF":{"name":"publishURL(queue:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a URLResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11publishData5queue12preprocessor18emptyResponseCodes0hC7MethodsAA0bI9PublisherVy10Foundation0E0VGSo012OS_dispatch_F0C_AA0E12Preprocessor_pShySiGShyAA10HTTPMethodVGtF":{"name":"publishData(queue:preprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a DataResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC13publishString5queue12preprocessor8encoding18emptyResponseCodes0iC7MethodsAA0bJ9PublisherVySSGSo012OS_dispatch_F0C_AA16DataPreprocessor_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"publishString(queue:preprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a StringResponseSerializer to serialize the","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jK7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA16DataPreprocessor_pAA0Q7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)","abstract":"

Undocumented

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jC7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA16DataPreprocessor_pAA0Q7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadResponsePublisher for this instance and uses a DecodableResponseSerializer to serialize","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC19publishUnserialized2onAA0B17ResponsePublisherVy10Foundation3URLVSgGSo17OS_dispatch_queueC_tF":{"name":"publishUnserialized(on:)","abstract":"

Creates a DownloadResponsePublisher for this instance which does not serialize the response before publishing.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC15serializingData23automaticallyCancelling16dataPreprocessor18emptyResponseCodes0jC7MethodsAA0B4TaskVy10Foundation0E0VGSb_AA0eI0_pShySiGShyAA10HTTPMethodVGtF":{"name":"serializingData(automaticallyCancelling:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await a Data value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC20serializingDecodable_23automaticallyCancelling16dataPreprocessor7decoder18emptyResponseCodes0kC7MethodsAA0B4TaskVyxGxm_SbAA04DataI0_pAA0P7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"serializingDecodable(_:automaticallyCancelling:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await serialization of a Decodable value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC28serializingDownloadedFileURL23automaticallyCancellingAA0B4TaskVy10Foundation0G0VGSb_tF":{"name":"serializingDownloadedFileURL(automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization of the downloaded file’s URL on disk.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC17serializingString23automaticallyCancelling16dataPreprocessor8encoding18emptyResponseCodes0kC7MethodsAA0B4TaskVySSGSb_AA04DataI0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"serializingString(automaticallyCancelling:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DownloadTask to await serialization of a String value.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC011serializingB05using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA18ResponseSerializerRzlF":{"name":"serializingDownload(using:automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization using the provided ResponseSerializer instance.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC011serializingB05using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0B26ResponseSerializerProtocolRzlF":{"name":"serializingDownload(using:automaticallyCancelling:)","abstract":"

Creates a DownloadTask to await serialization using the provided DownloadResponseSerializerProtocol","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue17completionHandlerACXDSo012OS_dispatch_E0C_yAA0B8ResponseVy10Foundation3URLVSgAA7AFErrorOGctF":{"name":"response(queue:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0bkF8ProtocolRzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0kF0RzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC11responseURL5queue17completionHandlerACXDSo012OS_dispatch_F0C_yAA0B8ResponseVy10Foundation0E0VAA7AFErrorOGctF":{"name":"responseURL(queue:completionHandler:)","abstract":"

Adds a handler using a URLResponseSerializer to be called once the request is finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12responseData5queue16dataPreprocessor18emptyResponseCodes0iC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA0eH0_pShySiGShyAA10HTTPMethodVGyAA0bJ0Vy10Foundation0E0VAA7AFErrorOGctF":{"name":"responseData(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DataResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC14responseString5queue16dataPreprocessor8encoding18emptyResponseCodes0jC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA04DataH0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGyAA0bK0VySSAA7AFErrorOGctF":{"name":"responseString(queue:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a StringResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC12responseJSON5queue16dataPreprocessor18emptyResponseCodes0iC7Methods7options17completionHandlerACXDSo012OS_dispatch_F0C_AA04DataH0_pShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVyAA0bJ0VyypAA7AFErrorOGctF":{"name":"responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)","abstract":"

Adds a handler using a JSONResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC17responseDecodable2of5queue16dataPreprocessor7decoder18emptyResponseCodes0kC7Methods17completionHandlerACXDxm_So012OS_dispatch_G0CAA04DataI0_pAA0S7Decoder_pShySiGShyAA10HTTPMethodVGyAA0bL0VyxAA7AFErrorOGctSeRzlF":{"name":"responseDecodable(of:queue:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DownloadRequest"},"Classes/DownloadRequest.html#/s:9Alamofire15DownloadRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DownloadRequest"},"Classes/DataStreamRequest/CancellationToken.html#/s:9Alamofire17DataStreamRequestC17CancellationTokenV6cancelyyF":{"name":"cancel()","abstract":"

Cancel the ongoing stream by canceling the underlying DataStreamRequest.

","parent_name":"CancellationToken"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV7request10Foundation10URLRequestVSgvp":{"name":"request","abstract":"

Last URLRequest issued by the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV8responseSo17NSHTTPURLResponseCSgvp":{"name":"response","abstract":"

Last HTTPURLResponse received by the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV7metricsSo23NSURLSessionTaskMetricsCSgvp":{"name":"metrics","abstract":"

Last URLSessionTaskMetrics produced for the instance.

","parent_name":"Completion"},"Classes/DataStreamRequest/Completion.html#/s:9Alamofire17DataStreamRequestC10CompletionV5errorAA7AFErrorOSgvp":{"name":"error","abstract":"

AFError produced for the instance, if any.

","parent_name":"Completion"},"Classes/DataStreamRequest/Event.html#/s:9Alamofire17DataStreamRequestC5EventO6streamyAEy_xq_Gs6ResultOyxq_GcAGms5ErrorR_r0_lF":{"name":"stream(_:)","abstract":"

Output produced every time the instance receives additional Data. The associated value contains the","parent_name":"Event"},"Classes/DataStreamRequest/Event.html#/s:9Alamofire17DataStreamRequestC5EventO8completeyAEy_xq_GAC10CompletionVcAGms5ErrorR_r0_lF":{"name":"complete(_:)","abstract":"

Output produced when the instance has completed, whether due to stream end, cancellation, or an error.","parent_name":"Event"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5eventAC5EventOy_xq_Gvp":{"name":"event","abstract":"

Latest Event from the stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5tokenAC17CancellationTokenVvp":{"name":"token","abstract":"

Token used to cancel the stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V6cancelyyF":{"name":"cancel()","abstract":"

Cancel the ongoing stream by canceling the underlying DataStreamRequest.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V6results6ResultOyxq_GSgvp":{"name":"result","abstract":"

Incoming Result values from Event.stream.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5valuexSgvp":{"name":"value","abstract":"

Success value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V5errorq_Sgvp":{"name":"error","abstract":"

Failure value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest/Stream.html#/s:9Alamofire17DataStreamRequestC0C0V10completionAC10CompletionVSgvp":{"name":"completion","abstract":"

Completion value of the instance, if any.

","parent_name":"Stream"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC7Handlera":{"name":"Handler","abstract":"

Closure type handling DataStreamRequest.Stream values.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Stream.html":{"name":"Stream","abstract":"

Type encapsulating an Event as it flows through the stream, as well as a CancellationToken which can be used","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Event.html":{"name":"Event","abstract":"

Type representing an event flowing through the stream. Contains either the Result of processing streamed","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/Completion.html":{"name":"Completion","abstract":"

Value containing the state of a DataStreamRequest when the stream was completed.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest/CancellationToken.html":{"name":"CancellationToken","abstract":"

Type used to cancel an ongoing stream.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC11convertibleAA21URLRequestConvertible_pvp":{"name":"convertible","abstract":"

URLRequestConvertible value used to create URLRequests for this instance.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC021automaticallyCancelOnC5ErrorSbvp":{"name":"automaticallyCancelOnStreamError","abstract":"

Whether or not the instance will be cancelled if stream parsing encounters an error.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCtcF":{"name":"validate(_:)","abstract":"

Validates the URLRequest and HTTPURLResponse received for the instance using the provided Validation closure.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07asInputC010bufferSizeSo07NSInputC0CSgSi_tF":{"name":"asInputStream(bufferSize:)","abstract":"

Produces an InputStream that receives the Data received by the instance.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse0E07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseC_yAA0D0C19ResponseDispositionOctctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse0E07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseCctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07publishC05using2onAA0bC9PublisherVy16SerializedObjectQzGx_So17OS_dispatch_queueCtAA0bC10SerializerRzlF":{"name":"publishStream(using:on:)","abstract":"

Creates a DataStreamPublisher for this instance using the given DataStreamSerializer and DispatchQueue.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC07publishB05queueAA0bC9PublisherVy10Foundation0B0VGSo012OS_dispatch_F0C_tF":{"name":"publishData(queue:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a PassthroughStreamSerializer to stream Data","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC13publishString5queueAA0bC9PublisherVySSGSo012OS_dispatch_G0C_tF":{"name":"publishString(queue:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a StringStreamSerializer to serialize stream","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC16publishDecodable4type5queue7decoder12preprocessorAA0bC9PublisherVyxGxm_So012OS_dispatch_H0CAA0B7Decoder_pAA0B12Preprocessor_ptSeRzlF":{"name":"publishDecodable(type:queue:decoder:preprocessor:)","abstract":"

Creates a DataStreamPublisher for this instance which uses a DecodableStreamSerializer with the provided","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC13httpResponses15bufferingPolicyAA0C2OfVySo17NSHTTPURLResponseCGScS12ContinuationV09BufferingH0OyAI__G_tF":{"name":"httpResponses(bufferingPolicy:)","abstract":"

Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse7performACXDAA0D0C19ResponseDispositionOSo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure returning a Request.ResponseDisposition, called whenever the DataStreamRequest","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC14onHTTPResponse7performACXDySo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure called whenever the DataStreamRequest produces an HTTPURLResponse.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC10streamTaskAA0bcF0VyF":{"name":"streamTask()","abstract":"

Creates a DataStreamTask used to await streams of serialized values.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC02on6streamACXDSo17OS_dispatch_queueC_yAC0C0Vy_10Foundation0B0Vs5NeverOGKctF":{"name":"responseStream(on:stream:)","abstract":"

Adds a StreamHandler which performs no parsing on incoming Data.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC05using2on6streamACXDx_So17OS_dispatch_queueCyAC0C0Vy_16SerializedObjectQzAA7AFErrorOGKctAA0bC10SerializerRzlF":{"name":"responseStream(using:on:stream:)","abstract":"

Adds a StreamHandler which uses the provided DataStreamSerializer to process incoming Data.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC6String2on6streamACXDSo17OS_dispatch_queueC_yAC0C0Vy_SSs5NeverOGKctF":{"name":"responseStreamString(on:stream:)","abstract":"

Adds a StreamHandler which parses incoming Data as a UTF8 String.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC08responseC9Decodable2of2on5using12preprocessor6streamACXDxm_So17OS_dispatch_queueCAA0B7Decoder_pAA0B12Preprocessor_pyAC0C0Vy_xAA7AFErrorOGKctSeRzlF":{"name":"responseStreamDecodable(of:on:using:preprocessor:stream:)","abstract":"

Adds a StreamHandler which parses incoming Data using the provided DataDecoder.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URLRequest and HTTPURLResponse and returns whether the","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DataStreamRequest"},"Classes/DataStreamRequest.html#/s:9Alamofire17DataStreamRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DataStreamRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC11convertibleAA21URLRequestConvertible_pvp":{"name":"convertible","abstract":"

URLRequestConvertible value used to create URLRequests for this instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC4data10Foundation0B0VSgvp":{"name":"data","abstract":"

Data read from the server so far.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validateyACXDs6ResultOyyts5Error_pG10Foundation10URLRequestVSg_So17NSHTTPURLResponseCAI0B0VSgtcF":{"name":"validate(_:)","abstract":"

Validates the request, using the specified closure.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse0D07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseC_yAA0C0C19ResponseDispositionOctctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse and providing a completion","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse0D07performACXDSo17OS_dispatch_queueC_ySo17NSHTTPURLResponseCctF":{"name":"onHTTPResponse(on:perform:)","abstract":"

Sets a closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC15publishResponse5using2onAA0bE9PublisherVyq_Gx_So17OS_dispatch_queueCtAA0E10SerializerRz16SerializedObjectQzRs_r0_lF":{"name":"publishResponse(using:on:)","abstract":"

Creates a DataResponsePublisher for this instance using the given ResponseSerializer and DispatchQueue.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC07publishB05queue12preprocessor18emptyResponseCodes0gC7MethodsAA0bH9PublisherVy10Foundation0B0VGSo012OS_dispatch_E0C_AA0B12Preprocessor_pShySiGShyAA10HTTPMethodVGtF":{"name":"publishData(queue:preprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a DataResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC13publishString5queue12preprocessor8encoding18emptyResponseCodes0iC7MethodsAA0bJ9PublisherVySSGSo012OS_dispatch_F0C_AA0B12Preprocessor_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"publishString(queue:preprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a StringResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jK7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA0B12Preprocessor_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)","abstract":"

Undocumented

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC16publishDecodable4type5queue12preprocessor7decoder18emptyResponseCodes0jC7MethodsAA0bK9PublisherVyxGxm_So012OS_dispatch_G0CAA0B12Preprocessor_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataResponsePublisher for this instance and uses a DecodableResponseSerializer to serialize the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19publishUnserialized5queueAA0B17ResponsePublisherVy10Foundation0B0VSgGSo012OS_dispatch_F0C_tF":{"name":"publishUnserialized(queue:)","abstract":"

Creates a DataResponsePublisher for this instance which does not serialize the response before publishing.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC13httpResponses15bufferingPolicyAA8StreamOfVySo17NSHTTPURLResponseCGScS12ContinuationV09BufferingG0OyAI__G_tF":{"name":"httpResponses(bufferingPolicy:)","abstract":"

Creates a StreamOf<HTTPURLResponse> for the instance’s responses.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse7performACXDAA0C0C19ResponseDispositionOSo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure returning a Request.ResponseDisposition, called whenever the DataRequest produces an","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14onHTTPResponse7performACXDySo17NSHTTPURLResponseCYaYbc_tF":{"name":"onHTTPResponse(perform:)","abstract":"

Sets an async closure called whenever the DataRequest produces an HTTPURLResponse.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC011serializingB023automaticallyCancelling16dataPreprocessor18emptyResponseCodes0iC7MethodsAA0B4TaskVy10Foundation0B0VGSb_AA0bH0_pShySiGShyAA10HTTPMethodVGtF":{"name":"serializingData(automaticallyCancelling:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await a Data value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC20serializingDecodable_23automaticallyCancelling16dataPreprocessor7decoder18emptyResponseCodes0kC7MethodsAA0B4TaskVyxGxm_SbAA0bI0_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGtSeRzlF":{"name":"serializingDecodable(_:automaticallyCancelling:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await serialization of a Decodable value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC17serializingString23automaticallyCancelling16dataPreprocessor8encoding18emptyResponseCodes0kC7MethodsAA0B4TaskVySSGSb_AA0bI0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGtF":{"name":"serializingString(automaticallyCancelling:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:)","abstract":"

Creates a DataTask to await serialization of a String value.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19serializingResponse5using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0E10SerializerRzlF":{"name":"serializingResponse(using:automaticallyCancelling:)","abstract":"

Creates a DataTask to await serialization using the provided ResponseSerializer instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC19serializingResponse5using23automaticallyCancellingAA0B4TaskVy16SerializedObjectQzGx_SbtAA0bE18SerializerProtocolRzlF":{"name":"serializingResponse(using:automaticallyCancelling:)","abstract":"

Creates a DataTask to await serialization using the provided DataResponseSerializerProtocol instance.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue17completionHandlerACXDSo012OS_dispatch_E0C_yAA0B8ResponseVy10Foundation0B0VSgAA7AFErrorOGctF":{"name":"response(queue:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0bkF8ProtocolRzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8response5queue0D10Serializer17completionHandlerACXDSo012OS_dispatch_E0C_xyAA0B8ResponseVy16SerializedObjectQzAA7AFErrorOGctAA0kF0RzlF":{"name":"response(queue:responseSerializer:completionHandler:)","abstract":"

Adds a handler to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC08responseB05queue16dataPreprocessor18emptyResponseCodes0hC7Methods17completionHandlerACXDSo012OS_dispatch_E0C_AA0bG0_pShySiGShyAA10HTTPMethodVGyAA0bI0Vy10Foundation0B0VAA7AFErrorOGctF":{"name":"responseData(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DataResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC14responseString5queue16dataPreprocessor8encoding18emptyResponseCodes0jC7Methods17completionHandlerACXDSo012OS_dispatch_F0C_AA0bH0_pSS10FoundationE8EncodingVSgShySiGShyAA10HTTPMethodVGyAA0bK0VySSAA7AFErrorOGctF":{"name":"responseString(queue:dataPreprocessor:encoding:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a StringResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC12responseJSON5queue16dataPreprocessor18emptyResponseCodes0iC7Methods7options17completionHandlerACXDSo012OS_dispatch_F0C_AA0bH0_pShySiGShyAA10HTTPMethodVGSo20NSJSONReadingOptionsVyAA0bJ0VyypAA7AFErrorOGctF":{"name":"responseJSON(queue:dataPreprocessor:emptyResponseCodes:emptyRequestMethods:options:completionHandler:)","abstract":"

Adds a handler using a JSONResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC17responseDecodable2of5queue16dataPreprocessor7decoder18emptyResponseCodes0kC7Methods17completionHandlerACXDxm_So012OS_dispatch_G0CAA0bI0_pAA0B7Decoder_pShySiGShyAA10HTTPMethodVGyAA0bL0VyxAA7AFErrorOGctSeRzlF":{"name":"responseDecodable(of:queue:dataPreprocessor:decoder:emptyResponseCodes:emptyRequestMethods:completionHandler:)","abstract":"

Adds a handler using a DecodableResponseSerializer to be called once the request has finished.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC10Validationa":{"name":"Validation","abstract":"

A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validate10statusCodeACXDx_tSTRzSi7ElementRtzlF":{"name":"validate(statusCode:)","abstract":"

Validates that the response has a status code in the specified sequence.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validate11contentTypeACXDxyXA_tSTRzSS7ElementRtzlF":{"name":"validate(contentType:)","abstract":"

Validates that the response has a content type in the specified sequence.

","parent_name":"DataRequest"},"Classes/DataRequest.html#/s:9Alamofire11DataRequestC8validateACXDyF":{"name":"validate()","abstract":"

Validates that the response has a status code in the default acceptable range of 200…299, and that the content","parent_name":"DataRequest"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV8intervalSdvp":{"name":"interval","abstract":"

TimeInterval defining the duration of the time window before the current time in which the number of","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV15maximumAttemptsSivp":{"name":"maximumAttempts","abstract":"

Total refresh attempts allowed within interval before throwing an .excessiveRefresh error.

","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor/RefreshWindow.html#/s:9Alamofire25AuthenticationInterceptorC13RefreshWindowV8interval15maximumAttemptsAEyx_GSd_Sitcfc":{"name":"init(interval:maximumAttempts:)","abstract":"

Creates a RefreshWindow instance from the specified interval and maximumAttempts.

","parent_name":"RefreshWindow"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC10Credentiala":{"name":"Credential","abstract":"

Type of credential used to authenticate requests.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor/RefreshWindow.html":{"name":"RefreshWindow","abstract":"

Type that defines a time window used to identify excessive refresh calls. When enabled, prior to executing a","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC10credential10CredentialQzSgvp":{"name":"credential","abstract":"

The Credential used to authenticate requests.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire25AuthenticationInterceptorC13authenticator10credential13refreshWindowACyxGx_10CredentialQzSgAC07RefreshG0Vyx_GSgtcfc":{"name":"init(authenticator:credential:refreshWindow:)","abstract":"

Creates an AuthenticationInterceptor instance from the specified parameters.

","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire14RequestAdapterP5adapt_3for10completiony10Foundation10URLRequestV_AA7SessionCys6ResultOyAIs5Error_pGctF":{"name":"adapt(_:for:completion:)","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html#/s:9Alamofire14RequestRetrierP5retry_3for5dueTo10completionyAA0B0C_AA7SessionCs5Error_pyAA11RetryResultOctF":{"name":"retry(_:for:dueTo:completion:)","parent_name":"AuthenticationInterceptor"},"Classes/AuthenticationInterceptor.html":{"name":"AuthenticationInterceptor","abstract":"

The AuthenticationInterceptor class manages the queuing and threading complexity of authenticating requests."},"Classes/DataRequest.html":{"name":"DataRequest","abstract":"

Request subclass which handles in-memory Data download using URLSessionDataTask.

"},"Classes/DataStreamRequest.html":{"name":"DataStreamRequest","abstract":"

Request subclass which streams HTTP response Data through a Handler closure.

"},"Classes/DownloadRequest.html":{"name":"DownloadRequest","abstract":"

Request subclass which downloads Data to a file on disk using URLSessionDownloadTask.

"},"Classes/Request.html":{"name":"Request","abstract":"

Request is the common superclass of all Alamofire request types and provides common state, delegate, and callback"},"Classes/CompositeEventMonitor.html":{"name":"CompositeEventMonitor","abstract":"

An EventMonitor which can contain multiple EventMonitors and calls their methods on their queues.

"},"Classes/ClosureEventMonitor.html":{"name":"ClosureEventMonitor","abstract":"

EventMonitor that allows optional closures to be set to receive events.

"},"Classes/MultipartFormData.html":{"name":"MultipartFormData","abstract":"

Constructs multipart/form-data for uploads within an HTTP or HTTPS body. There are currently two ways to encode"},"Classes/NetworkReachabilityManager.html":{"name":"NetworkReachabilityManager","abstract":"

The NetworkReachabilityManager class listens for reachability changes of hosts and addresses for both cellular and"},"Classes/AlamofireNotifications.html":{"name":"AlamofireNotifications","abstract":"

EventMonitor that provides Alamofire’s notifications.

"},"Classes/JSONParameterEncoder.html":{"name":"JSONParameterEncoder","abstract":"

A ParameterEncoder that encodes types as JSON body data.

"},"Classes/URLEncodedFormParameterEncoder.html":{"name":"URLEncodedFormParameterEncoder","abstract":"

A ParameterEncoder that encodes types as URL-encoded query strings to be set on the URL or as body data, depending"},"Classes/UploadRequest.html":{"name":"UploadRequest","abstract":"

DataRequest subclass which handles Data upload from memory, file, or stream using URLSessionUploadTask.

"},"Classes/Adapter.html":{"name":"Adapter","abstract":"

Closure-based RequestAdapter.

"},"Classes/Retrier.html":{"name":"Retrier","abstract":"

Closure-based RequestRetrier.

"},"Classes/Interceptor.html":{"name":"Interceptor","abstract":"

RequestInterceptor which can use multiple RequestAdapter and RequestRetrier values.

"},"Classes/DataResponseSerializer.html":{"name":"DataResponseSerializer","abstract":"

A ResponseSerializer that performs minimal response checking and returns any response Data as-is. By default, a"},"Classes/StringResponseSerializer.html":{"name":"StringResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data as a String. By default, a request returning nil or no"},"Classes/JSONResponseSerializer.html":{"name":"JSONResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data using JSONSerialization. By default, a request returning"},"Classes/DecodableResponseSerializer.html":{"name":"DecodableResponseSerializer","abstract":"

A ResponseSerializer that decodes the response data as a generic value using any type that conforms to"},"Classes/RetryPolicy.html":{"name":"RetryPolicy","abstract":"

A retry policy that retries requests using an exponential backoff for allowed HTTP methods and HTTP status codes"},"Classes/ConnectionLostRetryPolicy.html":{"name":"ConnectionLostRetryPolicy","abstract":"

A retry policy that automatically retries idempotent requests for network connection lost errors. For more"},"Classes/ServerTrustManager.html":{"name":"ServerTrustManager","abstract":"

Responsible for managing the mapping of ServerTrustEvaluating values to given hosts.

"},"Classes/DefaultTrustEvaluator.html":{"name":"DefaultTrustEvaluator","abstract":"

An evaluator which uses the default server trust evaluation while allowing you to control whether to validate the"},"Classes/RevocationTrustEvaluator.html":{"name":"RevocationTrustEvaluator","abstract":"

An evaluator which Uses the default and revoked server trust evaluations allowing you to control whether to validate"},"Classes/PinnedCertificatesTrustEvaluator.html":{"name":"PinnedCertificatesTrustEvaluator","abstract":"

Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned"},"Classes/PublicKeysTrustEvaluator.html":{"name":"PublicKeysTrustEvaluator","abstract":"

Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned"},"Classes/CompositeTrustEvaluator.html":{"name":"CompositeTrustEvaluator","abstract":"

Uses the provided evaluators to validate the server trust. The trust is only considered valid if all of the"},"Classes/DisabledTrustEvaluator.html":{"name":"DisabledTrustEvaluator","abstract":"

Disables all evaluation which in turn will always consider any server trust as valid.

"},"Classes/Session.html":{"name":"Session","abstract":"

Session creates and manages Alamofire’s Request types during their lifetimes. It also provides common"},"Classes/SessionDelegate.html":{"name":"SessionDelegate","abstract":"

Class which implements the various URLSessionDelegate methods to connect various Alamofire features.

"},"Classes/URLEncodedFormEncoder.html":{"name":"URLEncodedFormEncoder","abstract":"

An object that encodes instances into URL-encoded query strings.

"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

"},"Global%20Variables.html":{"name":"Global Variables","abstract":"

The following global variables are available globally.

"},"Enums.html":{"name":"Enumerations","abstract":"

The following enumerations are available globally.

"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Protocols.html":{"name":"Protocols","abstract":"

The following protocols are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"},"Typealiases.html":{"name":"Type Aliases","abstract":"

The following type aliases are available globally.

"}} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/docs/undocumented.json b/Carthage/Checkouts/Alamofire/docs/undocumented.json new file mode 100644 index 00000000..6724a379 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/undocumented.json @@ -0,0 +1,264 @@ +{ + "warnings": [ + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 202, + "symbol": "DataRequest.publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 258, + "symbol": "DataStreamPublisher", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Combine.swift", + "line": 587, + "symbol": "DownloadRequest.publishDecodable(type:queue:preprocessor:decoder:emptyResponseCodes:emptyResponseMethods:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 581, + "symbol": "DataStreamTask", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 583, + "symbol": "DataStreamTask.Stream", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 777, + "symbol": "StreamOf.BufferingPolicy", + "symbol_kind": "source.lang.swift.decl.typealias", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/Concurrency.swift", + "line": 805, + "symbol": "StreamOf.Iterator", + "symbol_kind": "source.lang.swift.decl.struct", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 250, + "symbol": "EventMonitor.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 251, + "symbol": "EventMonitor.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 293, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 294, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 310, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/EventMonitor.swift", + "line": 311, + "symbol": "EventMonitor.request(_:didParseResponse:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 246, + "symbol": "JSONEncoding.Error", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 247, + "symbol": "JSONEncoding.Error.invalidJSONObject", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 329, + "symbol": "JSONEncoding.Error", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ParameterEncoding.swift", + "line": 330, + "symbol": "JSONEncoding.Error.localizedDescription", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ResponseSerialization.swift", + "line": 84, + "symbol": "PassthroughPreprocessor.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/ResponseSerialization.swift", + "line": 91, + "symbol": "GoogleXSSIPreprocessor.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 73, + "symbol": "SessionDelegate.urlSession(_:didBecomeInvalidWithError:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 86, + "symbol": "SessionDelegate.urlSession(_:task:didReceive:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 163, + "symbol": "SessionDelegate.urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 178, + "symbol": "SessionDelegate.urlSession(_:task:needNewBodyStream:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 192, + "symbol": "SessionDelegate.urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 206, + "symbol": "SessionDelegate.urlSession(_:task:didFinishCollecting:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 214, + "symbol": "SessionDelegate.urlSession(_:task:didCompleteWithError:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 225, + "symbol": "SessionDelegate.urlSession(_:taskIsWaitingForConnectivity:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 233, + "symbol": "SessionDelegate.urlSession(_:dataTask:didReceive:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 252, + "symbol": "SessionDelegate.urlSession(_:dataTask:didReceive:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 265, + "symbol": "SessionDelegate.urlSession(_:dataTask:willCacheResponse:completionHandler:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 282, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 299, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/SessionDelegate.swift", + "line": 318, + "symbol": "SessionDelegate.urlSession(_:downloadTask:didFinishDownloadingTo:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 691, + "symbol": "_URLEncodedFormEncoder.KeyedContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 859, + "symbol": "_URLEncodedFormEncoder.SingleValueContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLEncodedFormEncoder.swift", + "line": 998, + "symbol": "_URLEncodedFormEncoder.UnkeyedContainer", + "symbol_kind": "source.lang.swift.decl.extension", + "warning": "undocumented" + }, + { + "file": "/Users/jshier/Desktop/Code/Alamofire/Source/URLRequest+Alamofire.swift", + "line": 34, + "symbol": "URLRequest.validate()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + } + ], + "source_directory": "/Users/jshier/Desktop/Code/Alamofire" +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..6c0f2b42 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,81 @@ +{ + "images" : [ + { + "size" : "24x24", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "40mm" + }, + { + "size" : "50x50", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "44mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + }, + { + "size" : "108x108", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "44mm" + }, + { + "idiom" : "watch-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Base.lproj/Interface.storyboard b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Base.lproj/Interface.storyboard new file mode 100644 index 00000000..1fa6c002 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Base.lproj/Interface.storyboard @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Info.plist b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Info.plist new file mode 100644 index 00000000..6640fa4c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit App/Info.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + watchOS Example WatchKit App + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKWatchKitApp + + + diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json new file mode 100644 index 00000000..1571c7e5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json @@ -0,0 +1,48 @@ +{ + "assets" : [ + { + "idiom" : "watch", + "filename" : "Circular.imageset", + "role" : "circular" + }, + { + "idiom" : "watch", + "filename" : "Extra Large.imageset", + "role" : "extra-large" + }, + { + "idiom" : "watch", + "filename" : "Graphic Bezel.imageset", + "role" : "graphic-bezel" + }, + { + "idiom" : "watch", + "filename" : "Graphic Circular.imageset", + "role" : "graphic-circular" + }, + { + "idiom" : "watch", + "filename" : "Graphic Corner.imageset", + "role" : "graphic-corner" + }, + { + "idiom" : "watch", + "filename" : "Graphic Large Rectangular.imageset", + "role" : "graphic-large-rectangular" + }, + { + "idiom" : "watch", + "filename" : "Modular.imageset", + "role" : "modular" + }, + { + "idiom" : "watch", + "filename" : "Utilitarian.imageset", + "role" : "utilitarian" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json new file mode 100644 index 00000000..aefef291 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json @@ -0,0 +1,28 @@ +{ + "images" : [ + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : "<=145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">161" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">145" + }, + { + "idiom" : "watch", + "scale" : "2x", + "screen-width" : ">183" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ContentView.swift b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ContentView.swift new file mode 100644 index 00000000..c181f2a3 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ContentView.swift @@ -0,0 +1,46 @@ +// +// ContentView.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import SwiftUI + +struct ContentView: View { + @ObservedObject var networking: Networking + + var body: some View { + VStack { + Button(action: { networking.performRequest() }, + label: { Text("Perform Request") }) + Text(networking.message) + } + } +} + +struct ContentViewPreviews: PreviewProvider { + static let networking = Networking() + + static var previews: some View { + ContentView(networking: networking) + } +} diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ExtensionDelegate.swift b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ExtensionDelegate.swift new file mode 100644 index 00000000..1c135e3b --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/ExtensionDelegate.swift @@ -0,0 +1,57 @@ +// +// ExtensionDelegate.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import WatchKit + +class ExtensionDelegate: NSObject, WKExtensionDelegate { + func handle(_ backgroundTasks: Set) { + // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. + for task in backgroundTasks { + // Use a switch statement to check the task type + switch task { + case let backgroundTask as WKApplicationRefreshBackgroundTask: + // Be sure to complete the background task once you’re done. + backgroundTask.setTaskCompletedWithSnapshot(false) + case let snapshotTask as WKSnapshotRefreshBackgroundTask: + // Snapshot tasks have a unique completion call, make sure to set your expiration date + snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil) + case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask: + // Be sure to complete the connectivity task once you’re done. + connectivityTask.setTaskCompletedWithSnapshot(false) + case let urlSessionTask as WKURLSessionRefreshBackgroundTask: + // Be sure to complete the URL session task once you’re done. + urlSessionTask.setTaskCompletedWithSnapshot(false) + case let relevantShortcutTask as WKRelevantShortcutRefreshBackgroundTask: + // Be sure to complete the relevant-shortcut task once you're done. + relevantShortcutTask.setTaskCompletedWithSnapshot(false) + case let intentDidRunTask as WKIntentDidRunRefreshBackgroundTask: + // Be sure to complete the intent-did-run task once you're done. + intentDidRunTask.setTaskCompletedWithSnapshot(false) + default: + // make sure to complete unhandled task types + task.setTaskCompletedWithSnapshot(false) + } + } + } +} diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/HostingController.swift b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/HostingController.swift new file mode 100644 index 00000000..d65499f0 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/HostingController.swift @@ -0,0 +1,35 @@ +// +// HostingController.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Foundation +import SwiftUI +import WatchKit + +class HostingController: WKHostingController { + let networking = Networking() + + override var body: ContentView { + ContentView(networking: networking) + } +} diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Info.plist b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Info.plist new file mode 100644 index 00000000..5cef9ea9 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + watchOS Example WatchKit Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + org.alamofire.watchOS-Example.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + WKExtensionDelegateClassName + $(PRODUCT_MODULE_NAME).ExtensionDelegate + WKWatchOnly + + + diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Networking.swift b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Networking.swift new file mode 100644 index 00000000..ec5e14a5 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Networking.swift @@ -0,0 +1,57 @@ +// +// Networking.swift +// +// Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// + +import Alamofire +import Combine + +final class Networking: ObservableObject { + @Published var result: Result? + @Published var message = "No response." + + private var storage: Set = [] + + init() { + $result + .compactMap { $0 } + .map { + if case .success = $0 { + return "Successful!" + } else { + return "Failed!" + } + } + .assign(to: \.message, on: self) + .store(in: &storage) + } + + func performRequest() { + AF.request("https://httpbin.org/get").responseDecodable(of: HTTPBinResponse.self) { response in + self.result = response.result + } + } +} + +struct HTTPBinResponse: Decodable { + let url: String +} diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 00000000..da4a164c --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example WatchKit Extension/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/project.pbxproj b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/project.pbxproj new file mode 100644 index 00000000..fd850b78 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/project.pbxproj @@ -0,0 +1,597 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 31338A13241D9B410096C205 /* Networking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31338A12241D9B410096C205 /* Networking.swift */; }; + 318E330F2419AD1C00BDE48F /* watchOS Example WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 318E330E2419AD1C00BDE48F /* watchOS Example WatchKit App.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 318E33152419AD1C00BDE48F /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 318E33132419AD1C00BDE48F /* Interface.storyboard */; }; + 318E33172419AD1C00BDE48F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 318E33162419AD1C00BDE48F /* Assets.xcassets */; }; + 318E331E2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 318E331D2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 318E33232419AD1D00BDE48F /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318E33222419AD1D00BDE48F /* ContentView.swift */; }; + 318E33252419AD1D00BDE48F /* HostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318E33242419AD1D00BDE48F /* HostingController.swift */; }; + 318E33272419AD1D00BDE48F /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318E33262419AD1D00BDE48F /* ExtensionDelegate.swift */; }; + 318E33292419AD1D00BDE48F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 318E33282419AD1D00BDE48F /* Assets.xcassets */; }; + 318E332C2419AD1D00BDE48F /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 318E332B2419AD1D00BDE48F /* Preview Assets.xcassets */; }; + 318E333D2419AD9500BDE48F /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 318E333C2419AD9500BDE48F /* Alamofire.framework */; }; + 318E333E2419AD9500BDE48F /* Alamofire.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 318E333C2419AD9500BDE48F /* Alamofire.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 318E33102419AD1C00BDE48F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 318E33042419AD1B00BDE48F /* Project object */; + proxyType = 1; + remoteGlobalIDString = 318E330D2419AD1C00BDE48F; + remoteInfo = "watchOS Example WatchKit App"; + }; + 318E331F2419AD1D00BDE48F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 318E33042419AD1B00BDE48F /* Project object */; + proxyType = 1; + remoteGlobalIDString = 318E331C2419AD1D00BDE48F; + remoteInfo = "watchOS Example WatchKit Extension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 318E33332419AD1D00BDE48F /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 318E331E2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 318E33372419AD1D00BDE48F /* Embed Watch Content */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "$(CONTENTS_FOLDER_PATH)/Watch"; + dstSubfolderSpec = 16; + files = ( + 318E330F2419AD1C00BDE48F /* watchOS Example WatchKit App.app in Embed Watch Content */, + ); + name = "Embed Watch Content"; + runOnlyForDeploymentPostprocessing = 0; + }; + 318E333F2419AD9500BDE48F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 318E333E2419AD9500BDE48F /* Alamofire.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 31338A12241D9B410096C205 /* Networking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Networking.swift; sourceTree = ""; }; + 318E330A2419AD1B00BDE48F /* watchOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 318E330E2419AD1C00BDE48F /* watchOS Example WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchOS Example WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 318E33142419AD1C00BDE48F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + 318E33162419AD1C00BDE48F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 318E33182419AD1C00BDE48F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 318E331D2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "watchOS Example WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 318E33222419AD1D00BDE48F /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 318E33242419AD1D00BDE48F /* HostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostingController.swift; sourceTree = ""; }; + 318E33262419AD1D00BDE48F /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = ""; }; + 318E33282419AD1D00BDE48F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 318E332B2419AD1D00BDE48F /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 318E332D2419AD1D00BDE48F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 318E333C2419AD9500BDE48F /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 318E331A2419AD1D00BDE48F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 318E333D2419AD9500BDE48F /* Alamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 318E33032419AD1B00BDE48F = { + isa = PBXGroup; + children = ( + 318E33122419AD1C00BDE48F /* watchOS Example WatchKit App */, + 318E33212419AD1D00BDE48F /* watchOS Example WatchKit Extension */, + 318E330B2419AD1B00BDE48F /* Products */, + 318E333B2419AD9500BDE48F /* Frameworks */, + ); + sourceTree = ""; + }; + 318E330B2419AD1B00BDE48F /* Products */ = { + isa = PBXGroup; + children = ( + 318E330A2419AD1B00BDE48F /* watchOS Example.app */, + 318E330E2419AD1C00BDE48F /* watchOS Example WatchKit App.app */, + 318E331D2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex */, + ); + name = Products; + sourceTree = ""; + }; + 318E33122419AD1C00BDE48F /* watchOS Example WatchKit App */ = { + isa = PBXGroup; + children = ( + 318E33132419AD1C00BDE48F /* Interface.storyboard */, + 318E33162419AD1C00BDE48F /* Assets.xcassets */, + 318E33182419AD1C00BDE48F /* Info.plist */, + ); + path = "watchOS Example WatchKit App"; + sourceTree = ""; + }; + 318E33212419AD1D00BDE48F /* watchOS Example WatchKit Extension */ = { + isa = PBXGroup; + children = ( + 318E33282419AD1D00BDE48F /* Assets.xcassets */, + 318E33222419AD1D00BDE48F /* ContentView.swift */, + 318E33262419AD1D00BDE48F /* ExtensionDelegate.swift */, + 318E33242419AD1D00BDE48F /* HostingController.swift */, + 318E332D2419AD1D00BDE48F /* Info.plist */, + 31338A12241D9B410096C205 /* Networking.swift */, + 318E332A2419AD1D00BDE48F /* Preview Content */, + ); + path = "watchOS Example WatchKit Extension"; + sourceTree = ""; + }; + 318E332A2419AD1D00BDE48F /* Preview Content */ = { + isa = PBXGroup; + children = ( + 318E332B2419AD1D00BDE48F /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 318E333B2419AD9500BDE48F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 318E333C2419AD9500BDE48F /* Alamofire.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 318E33092419AD1B00BDE48F /* watchOS Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 318E33382419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example" */; + buildPhases = ( + 318E33082419AD1B00BDE48F /* Resources */, + 318E33372419AD1D00BDE48F /* Embed Watch Content */, + ); + buildRules = ( + ); + dependencies = ( + 318E33112419AD1C00BDE48F /* PBXTargetDependency */, + ); + name = "watchOS Example"; + productName = "watchOS Example"; + productReference = 318E330A2419AD1B00BDE48F /* watchOS Example.app */; + productType = "com.apple.product-type.application.watchapp2-container"; + }; + 318E330D2419AD1C00BDE48F /* watchOS Example WatchKit App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 318E33342419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example WatchKit App" */; + buildPhases = ( + 318E330C2419AD1C00BDE48F /* Resources */, + 318E33332419AD1D00BDE48F /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 318E33202419AD1D00BDE48F /* PBXTargetDependency */, + ); + name = "watchOS Example WatchKit App"; + productName = "watchOS Example WatchKit App"; + productReference = 318E330E2419AD1C00BDE48F /* watchOS Example WatchKit App.app */; + productType = "com.apple.product-type.application.watchapp2"; + }; + 318E331C2419AD1D00BDE48F /* watchOS Example WatchKit Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 318E33302419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example WatchKit Extension" */; + buildPhases = ( + 318E33192419AD1D00BDE48F /* Sources */, + 318E331A2419AD1D00BDE48F /* Frameworks */, + 318E331B2419AD1D00BDE48F /* Resources */, + 318E333F2419AD9500BDE48F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "watchOS Example WatchKit Extension"; + productName = "watchOS Example WatchKit Extension"; + productReference = 318E331D2419AD1D00BDE48F /* watchOS Example WatchKit Extension.appex */; + productType = "com.apple.product-type.watchkit2-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 318E33042419AD1B00BDE48F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = Alamofire; + TargetAttributes = { + 318E33092419AD1B00BDE48F = { + CreatedOnToolsVersion = 11.3.1; + }; + 318E330D2419AD1C00BDE48F = { + CreatedOnToolsVersion = 11.3.1; + }; + 318E331C2419AD1D00BDE48F = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 318E33072419AD1B00BDE48F /* Build configuration list for PBXProject "watchOS Example" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 318E33032419AD1B00BDE48F; + productRefGroup = 318E330B2419AD1B00BDE48F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 318E33092419AD1B00BDE48F /* watchOS Example */, + 318E330D2419AD1C00BDE48F /* watchOS Example WatchKit App */, + 318E331C2419AD1D00BDE48F /* watchOS Example WatchKit Extension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 318E33082419AD1B00BDE48F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 318E330C2419AD1C00BDE48F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 318E33172419AD1C00BDE48F /* Assets.xcassets in Resources */, + 318E33152419AD1C00BDE48F /* Interface.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 318E331B2419AD1D00BDE48F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 318E332C2419AD1D00BDE48F /* Preview Assets.xcassets in Resources */, + 318E33292419AD1D00BDE48F /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 318E33192419AD1D00BDE48F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 318E33252419AD1D00BDE48F /* HostingController.swift in Sources */, + 318E33232419AD1D00BDE48F /* ContentView.swift in Sources */, + 318E33272419AD1D00BDE48F /* ExtensionDelegate.swift in Sources */, + 31338A13241D9B410096C205 /* Networking.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 318E33112419AD1C00BDE48F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 318E330D2419AD1C00BDE48F /* watchOS Example WatchKit App */; + targetProxy = 318E33102419AD1C00BDE48F /* PBXContainerItemProxy */; + }; + 318E33202419AD1D00BDE48F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 318E331C2419AD1D00BDE48F /* watchOS Example WatchKit Extension */; + targetProxy = 318E331F2419AD1D00BDE48F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 318E33132419AD1C00BDE48F /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 318E33142419AD1C00BDE48F /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 318E332E2419AD1D00BDE48F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 318E332F2419AD1D00BDE48F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 318E33312419AD1D00BDE48F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"watchOS Example WatchKit Extension/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "watchOS Example WatchKit Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example.watchkitapp.watchkitextension"; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 6.0; + }; + name = Debug; + }; + 318E33322419AD1D00BDE48F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"watchOS Example WatchKit Extension/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "watchOS Example WatchKit Extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example.watchkitapp.watchkitextension"; + PRODUCT_NAME = "${TARGET_NAME}"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 6.0; + }; + name = Release; + }; + 318E33352419AD1D00BDE48F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + IBSC_MODULE = watchOS_Example_WatchKit_Extension; + INFOPLIST_FILE = "watchOS Example WatchKit App/Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 6.0; + }; + name = Debug; + }; + 318E33362419AD1D00BDE48F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + IBSC_MODULE = watchOS_Example_WatchKit_Extension; + INFOPLIST_FILE = "watchOS Example WatchKit App/Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example.watchkitapp"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 4; + WATCHOS_DEPLOYMENT_TARGET = 6.0; + }; + name = Release; + }; + 318E33392419AD1D00BDE48F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 318E333A2419AD1D00BDE48F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "org.alamofire.watchOS-Example"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 318E33072419AD1B00BDE48F /* Build configuration list for PBXProject "watchOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 318E332E2419AD1D00BDE48F /* Debug */, + 318E332F2419AD1D00BDE48F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 318E33302419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example WatchKit Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 318E33312419AD1D00BDE48F /* Debug */, + 318E33322419AD1D00BDE48F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 318E33342419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example WatchKit App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 318E33352419AD1D00BDE48F /* Debug */, + 318E33362419AD1D00BDE48F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 318E33382419AD1D00BDE48F /* Build configuration list for PBXNativeTarget "watchOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 318E33392419AD1D00BDE48F /* Debug */, + 318E333A2419AD1D00BDE48F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 318E33042419AD1B00BDE48F /* Project object */; +} diff --git a/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/xcshareddata/xcschemes/watchOS Example WatchKit App.xcscheme b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/xcshareddata/xcschemes/watchOS Example WatchKit App.xcscheme new file mode 100644 index 00000000..fd88b019 --- /dev/null +++ b/Carthage/Checkouts/Alamofire/watchOS Example/watchOS Example.xcodeproj/xcshareddata/xcschemes/watchOS Example WatchKit App.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/.codecov.yml b/Carthage/Checkouts/BigInt/.codecov.yml new file mode 100644 index 00000000..e3be2303 --- /dev/null +++ b/Carthage/Checkouts/BigInt/.codecov.yml @@ -0,0 +1,14 @@ +ignore: +- "/Tests/*" +comment: + layout: "header, diff" + behavior: default + require_changes: no +coverage: + status: + project: + default: + target: auto + threshold: null + base: auto + paths: "Sources/*" diff --git a/Carthage/Checkouts/BigInt/.github/workflows/jazzy.yml b/Carthage/Checkouts/BigInt/.github/workflows/jazzy.yml new file mode 100644 index 00000000..4ae6fb70 --- /dev/null +++ b/Carthage/Checkouts/BigInt/.github/workflows/jazzy.yml @@ -0,0 +1,29 @@ +name: Swift + +on: + push: + tags: + - '*' + +jobs: + macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - name: Install jazzy + run: gem install jazzy + - name: Generate documentation + run: | + jazzy \ + --clean \ + --github-file-prefix "https://github.com/attaswift/$module/tree/${GITHUB_REF}" \ + --module-version "${{ github.event.release.tag_name }}" \ + --copyright "© $(date '+%Y') [Károly Lőrentey](https://twitter.com/lorentey). (Last updated: $(date '+%Y-%m-%d'))" \ + --config .jazzy.yml + - name: Commit docs + run: | + git config --local user.email "bot@github.com" + git config --local user.name "GitHub Actions" + git add ./docs + git commit -m "Update docs" + git push origin HEAD:master diff --git a/Carthage/Checkouts/BigInt/.github/workflows/swift.yml b/Carthage/Checkouts/BigInt/.github/workflows/swift.yml new file mode 100644 index 00000000..3b977ac3 --- /dev/null +++ b/Carthage/Checkouts/BigInt/.github/workflows/swift.yml @@ -0,0 +1,47 @@ +name: Swift + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - name: Build + run: swift build --build-tests + - name: Run tests + run: swift test + xcode: + runs-on: macos-latest + strategy: + matrix: + scheme: [BigInt-macOS, BigInt-iOS, BigInt-watchOS, BigInt-tvOS] + steps: + - uses: actions/checkout@v2 + - name: Build + run: xcrun xcodebuild -workspace BigInt.xcworkspace -scheme ${{ matrix.scheme }} + linux: + container: + image: swift:${{ matrix.linux }} + runs-on: ubuntu-latest + strategy: + matrix: + linux: [bionic, xenial, focal] + steps: + - uses: actions/checkout@v2 + - name: Build + run: swift build --build-tests --enable-test-discovery + - name: Test + run: swift test --enable-test-discovery + codecov: + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - name: Test and generate code coverage report + run: xcrun xcodebuild -workspace BigInt.xcworkspace -scheme BigInt-macOS test + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 diff --git a/Carthage/Checkouts/BigInt/.gitignore b/Carthage/Checkouts/BigInt/.gitignore new file mode 100644 index 00000000..59f40b16 --- /dev/null +++ b/Carthage/Checkouts/BigInt/.gitignore @@ -0,0 +1,6 @@ +/Carthage/Build +/.build +/Packages +xcuserdata +/Package.pins +/Package.resolved diff --git a/Carthage/Checkouts/BigInt/.jazzy.yml b/Carthage/Checkouts/BigInt/.jazzy.yml new file mode 100644 index 00000000..3698439d --- /dev/null +++ b/Carthage/Checkouts/BigInt/.jazzy.yml @@ -0,0 +1,8 @@ +module: BigInt +author: Károly Lőrentey +theme: fullwidth +output: ./docs +author_url: "https://twitter.com/lorentey" +github_url: "https://github.com/attaswift/BigInt" +root_url: "https://attaswift.github.io/BigInt/reference/" +xcodebuild_arguments: ["-workspace", "BigInt.xcworkspace", "-scheme", "BigInt-macOS"] \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/.swift-version b/Carthage/Checkouts/BigInt/.swift-version new file mode 100644 index 00000000..819e07a2 --- /dev/null +++ b/Carthage/Checkouts/BigInt/.swift-version @@ -0,0 +1 @@ +5.0 diff --git a/Carthage/Checkouts/BigInt/BigInt.podspec b/Carthage/Checkouts/BigInt/BigInt.podspec new file mode 100644 index 00000000..cdb493eb --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.podspec @@ -0,0 +1,17 @@ + +Pod::Spec.new do |spec| + spec.name = 'BigInt' + spec.version = '5.3.0' + spec.ios.deployment_target = "8.0" + spec.osx.deployment_target = "10.9" + spec.tvos.deployment_target = "9.0" + spec.watchos.deployment_target = "2.0" + spec.license = { :type => 'MIT', :file => 'LICENSE.md' } + spec.summary = 'Arbitrary-precision arithmetic in pure Swift' + spec.homepage = 'https://github.com/attaswift/BigInt' + spec.author = 'Károly Lőrentey' + spec.source = { :git => 'https://github.com/attaswift/BigInt.git', :tag => 'v' + String(spec.version) } + spec.source_files = 'Sources/*.swift' + spec.social_media_url = 'https://twitter.com/lorentey' + spec.documentation_url = 'http://attaswift.github.io/BigInt/' +end diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.pbxproj b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.pbxproj new file mode 100644 index 00000000..2402d2b9 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.pbxproj @@ -0,0 +1,1301 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + BB241C441DDB70600067F917 /* Addition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C301DDB70600067F917 /* Addition.swift */; }; + BB241C451DDB70600067F917 /* Bitwise Ops.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C311DDB70600067F917 /* Bitwise Ops.swift */; }; + BB241C461DDB70600067F917 /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C321DDB70600067F917 /* Comparable.swift */; }; + BB241C471DDB70600067F917 /* Data Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C331DDB70600067F917 /* Data Conversion.swift */; }; + BB241C481DDB70600067F917 /* Division.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C341DDB70600067F917 /* Division.swift */; }; + BB241C491DDB70600067F917 /* Exponentiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C351DDB70600067F917 /* Exponentiation.swift */; }; + BB241C4A1DDB70600067F917 /* GCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C361DDB70600067F917 /* GCD.swift */; }; + BB241C4B1DDB70600067F917 /* Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C371DDB70600067F917 /* Hashable.swift */; }; + BB241C4C1DDB70600067F917 /* Multiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C381DDB70600067F917 /* Multiplication.swift */; }; + BB241C4D1DDB70600067F917 /* Prime Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C391DDB70600067F917 /* Prime Test.swift */; }; + BB241C4E1DDB70600067F917 /* String Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3A1DDB70600067F917 /* String Conversion.swift */; }; + BB241C4F1DDB70600067F917 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3B1DDB70600067F917 /* Random.swift */; }; + BB241C501DDB70600067F917 /* Shifts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3C1DDB70600067F917 /* Shifts.swift */; }; + BB241C511DDB70600067F917 /* Square Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3D1DDB70600067F917 /* Square Root.swift */; }; + BB241C521DDB70600067F917 /* Subtraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3E1DDB70600067F917 /* Subtraction.swift */; }; + BB241C531DDB70600067F917 /* BigUInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3F1DDB70600067F917 /* BigUInt.swift */; }; + BB241C651DDB70B00067F917 /* BigInt.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBB55AD41C8F88F20050DDA9 /* BigInt.framework */; }; + BB241C6F1DDB71910067F917 /* BigUInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3F1DDB70600067F917 /* BigUInt.swift */; }; + BB241C701DDB71910067F917 /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C321DDB70600067F917 /* Comparable.swift */; }; + BB241C711DDB71910067F917 /* Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C371DDB70600067F917 /* Hashable.swift */; }; + BB241C721DDB71910067F917 /* Data Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C331DDB70600067F917 /* Data Conversion.swift */; }; + BB241C731DDB71910067F917 /* Addition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C301DDB70600067F917 /* Addition.swift */; }; + BB241C741DDB71910067F917 /* Subtraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3E1DDB70600067F917 /* Subtraction.swift */; }; + BB241C751DDB71910067F917 /* Multiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C381DDB70600067F917 /* Multiplication.swift */; }; + BB241C761DDB71910067F917 /* Division.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C341DDB70600067F917 /* Division.swift */; }; + BB241C771DDB71910067F917 /* Exponentiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C351DDB70600067F917 /* Exponentiation.swift */; }; + BB241C781DDB71910067F917 /* Bitwise Ops.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C311DDB70600067F917 /* Bitwise Ops.swift */; }; + BB241C791DDB71910067F917 /* Shifts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3C1DDB70600067F917 /* Shifts.swift */; }; + BB241C7A1DDB71910067F917 /* Square Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3D1DDB70600067F917 /* Square Root.swift */; }; + BB241C7B1DDB71910067F917 /* GCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C361DDB70600067F917 /* GCD.swift */; }; + BB241C7C1DDB71910067F917 /* Prime Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C391DDB70600067F917 /* Prime Test.swift */; }; + BB241C7D1DDB71910067F917 /* String Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3A1DDB70600067F917 /* String Conversion.swift */; }; + BB241C7E1DDB71910067F917 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3B1DDB70600067F917 /* Random.swift */; }; + BB241C831DDB71920067F917 /* BigUInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3F1DDB70600067F917 /* BigUInt.swift */; }; + BB241C841DDB71920067F917 /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C321DDB70600067F917 /* Comparable.swift */; }; + BB241C851DDB71920067F917 /* Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C371DDB70600067F917 /* Hashable.swift */; }; + BB241C861DDB71920067F917 /* Data Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C331DDB70600067F917 /* Data Conversion.swift */; }; + BB241C871DDB71920067F917 /* Addition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C301DDB70600067F917 /* Addition.swift */; }; + BB241C881DDB71920067F917 /* Subtraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3E1DDB70600067F917 /* Subtraction.swift */; }; + BB241C891DDB71920067F917 /* Multiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C381DDB70600067F917 /* Multiplication.swift */; }; + BB241C8A1DDB71920067F917 /* Division.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C341DDB70600067F917 /* Division.swift */; }; + BB241C8B1DDB71920067F917 /* Exponentiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C351DDB70600067F917 /* Exponentiation.swift */; }; + BB241C8C1DDB71920067F917 /* Bitwise Ops.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C311DDB70600067F917 /* Bitwise Ops.swift */; }; + BB241C8D1DDB71920067F917 /* Shifts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3C1DDB70600067F917 /* Shifts.swift */; }; + BB241C8E1DDB71920067F917 /* Square Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3D1DDB70600067F917 /* Square Root.swift */; }; + BB241C8F1DDB71920067F917 /* GCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C361DDB70600067F917 /* GCD.swift */; }; + BB241C901DDB71920067F917 /* Prime Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C391DDB70600067F917 /* Prime Test.swift */; }; + BB241C911DDB71920067F917 /* String Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3A1DDB70600067F917 /* String Conversion.swift */; }; + BB241C921DDB71920067F917 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3B1DDB70600067F917 /* Random.swift */; }; + BB241C971DDB71920067F917 /* BigUInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3F1DDB70600067F917 /* BigUInt.swift */; }; + BB241C981DDB71920067F917 /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C321DDB70600067F917 /* Comparable.swift */; }; + BB241C991DDB71920067F917 /* Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C371DDB70600067F917 /* Hashable.swift */; }; + BB241C9A1DDB71920067F917 /* Data Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C331DDB70600067F917 /* Data Conversion.swift */; }; + BB241C9B1DDB71920067F917 /* Addition.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C301DDB70600067F917 /* Addition.swift */; }; + BB241C9C1DDB71920067F917 /* Subtraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3E1DDB70600067F917 /* Subtraction.swift */; }; + BB241C9D1DDB71920067F917 /* Multiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C381DDB70600067F917 /* Multiplication.swift */; }; + BB241C9E1DDB71920067F917 /* Division.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C341DDB70600067F917 /* Division.swift */; }; + BB241C9F1DDB71920067F917 /* Exponentiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C351DDB70600067F917 /* Exponentiation.swift */; }; + BB241CA01DDB71920067F917 /* Bitwise Ops.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C311DDB70600067F917 /* Bitwise Ops.swift */; }; + BB241CA11DDB71920067F917 /* Shifts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3C1DDB70600067F917 /* Shifts.swift */; }; + BB241CA21DDB71920067F917 /* Square Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3D1DDB70600067F917 /* Square Root.swift */; }; + BB241CA31DDB71920067F917 /* GCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C361DDB70600067F917 /* GCD.swift */; }; + BB241CA41DDB71920067F917 /* Prime Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C391DDB70600067F917 /* Prime Test.swift */; }; + BB241CA51DDB71920067F917 /* String Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3A1DDB70600067F917 /* String Conversion.swift */; }; + BB241CA61DDB71920067F917 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C3B1DDB70600067F917 /* Random.swift */; }; + BB241CBB1DDB71A50067F917 /* ProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C5A1DDB70690067F917 /* ProfileTests.swift */; }; + BB241CC51DDB71A60067F917 /* ProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C5A1DDB70690067F917 /* ProfileTests.swift */; }; + BB241CDC1DDB79E20067F917 /* BigUIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C571DDB70690067F917 /* BigUIntTests.swift */; }; + BB241CE41DDB79E30067F917 /* BigUIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C571DDB70690067F917 /* BigUIntTests.swift */; }; + BB4273F61F24AFCC00065766 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4273F41F24AFC800065766 /* Tools.swift */; }; + BB4273F71F24AFCD00065766 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4273F41F24AFC800065766 /* Tools.swift */; }; + BB4273F81F24AFCD00065766 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4273F41F24AFC800065766 /* Tools.swift */; }; + BB4273F91F24AFCE00065766 /* Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB4273F41F24AFC800065766 /* Tools.swift */; }; + BB64CD611F1D65D000C1B077 /* BigInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C2F1DDB70600067F917 /* BigInt.swift */; }; + BB9889A51F3E5C3100014740 /* Strideable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A41F3E5C3100014740 /* Strideable.swift */; }; + BB9889A61F3E5C3100014740 /* Strideable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A41F3E5C3100014740 /* Strideable.swift */; }; + BB9889A71F3E5C3100014740 /* Strideable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A41F3E5C3100014740 /* Strideable.swift */; }; + BB9889A81F3E5C3100014740 /* Strideable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A41F3E5C3100014740 /* Strideable.swift */; }; + BB9889AA1F3E5CC600014740 /* Integer Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A91F3E5CC600014740 /* Integer Conversion.swift */; }; + BB9889AB1F3E5CC600014740 /* Integer Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A91F3E5CC600014740 /* Integer Conversion.swift */; }; + BB9889AC1F3E5CC600014740 /* Integer Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A91F3E5CC600014740 /* Integer Conversion.swift */; }; + BB9889AD1F3E5CC600014740 /* Integer Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9889A91F3E5CC600014740 /* Integer Conversion.swift */; }; + BB99168F1F32610700CCFDDC /* BigIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C561DDB70690067F917 /* BigIntTests.swift */; }; + BB9916901F32610A00CCFDDC /* BigUIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C571DDB70690067F917 /* BigUIntTests.swift */; }; + BB9916911F33C32000CCFDDC /* WordTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEAE4DC1F28C37800F4E329 /* WordTests.swift */; }; + BBABCDD21F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */; }; + BBABCDD31F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */; }; + BBABCDD41F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */; }; + BBABCDD51F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */; }; + BBABCDD71F3E2038009CA8BC /* Words and Bits.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */; }; + BBABCDD81F3E2038009CA8BC /* Words and Bits.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */; }; + BBABCDD91F3E2038009CA8BC /* Words and Bits.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */; }; + BBABCDDA1F3E2038009CA8BC /* Words and Bits.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */; }; + BBB55ABD1C8F80020050DDA9 /* BigInt.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBB55AB21C8F80020050DDA9 /* BigInt.framework */; }; + BBB55ADE1C8F88F20050DDA9 /* BigInt.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBB55AD41C8F88F20050DDA9 /* BigInt.framework */; }; + BBB55B081C8F8CBC0050DDA9 /* BigInt.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BBB55AFE1C8F8CBB0050DDA9 /* BigInt.framework */; }; + BBC944371F24C25A00ED6C30 /* BigInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C2F1DDB70600067F917 /* BigInt.swift */; }; + BBC944381F24C25B00ED6C30 /* BigInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C2F1DDB70600067F917 /* BigInt.swift */; }; + BBC944391F24C25C00ED6C30 /* BigInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C2F1DDB70600067F917 /* BigInt.swift */; }; + BBC9443A1F24C27E00ED6C30 /* BigIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C561DDB70690067F917 /* BigIntTests.swift */; }; + BBC9443C1F24C27F00ED6C30 /* BigIntTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C561DDB70690067F917 /* BigIntTests.swift */; }; + BBE4CA4E1F3DA5AB0062A281 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */; }; + BBE4CA4F1F3DAD380062A281 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */; }; + BBE4CA501F3DAD390062A281 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */; }; + BBE4CA511F3DAD390062A281 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */; }; + BBEAE4DD1F28C37800F4E329 /* WordTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEAE4DC1F28C37800F4E329 /* WordTests.swift */; }; + BBEAE4DF1F28C37800F4E329 /* WordTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBEAE4DC1F28C37800F4E329 /* WordTests.swift */; }; + BBF16BD51F2BA51B00402089 /* ProfileTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB241C5A1DDB70690067F917 /* ProfileTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + BB241C621DDB70B00067F917 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BBB55AA91C8F80020050DDA9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BBB55AD31C8F88F20050DDA9; + remoteInfo = BigInt; + }; + BBB55ABE1C8F80020050DDA9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BBB55AA91C8F80020050DDA9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BBB55AB11C8F80020050DDA9; + remoteInfo = BigInt; + }; + BBB55ADF1C8F88F20050DDA9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BBB55AA91C8F80020050DDA9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BBB55AD31C8F88F20050DDA9; + remoteInfo = BigInt; + }; + BBB55B091C8F8CBC0050DDA9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BBB55AA91C8F80020050DDA9 /* Project object */; + proxyType = 1; + remoteGlobalIDString = BBB55AFD1C8F8CBB0050DDA9; + remoteInfo = BigInt; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + BB241BC51DD9F6490067F917 /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + BB241BC71DD9F7D60067F917 /* BigInt.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; path = BigInt.podspec; sourceTree = ""; }; + BB241C2F1DDB70600067F917 /* BigInt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigInt.swift; sourceTree = ""; }; + BB241C301DDB70600067F917 /* Addition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Addition.swift; sourceTree = ""; }; + BB241C311DDB70600067F917 /* Bitwise Ops.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bitwise Ops.swift"; sourceTree = ""; }; + BB241C321DDB70600067F917 /* Comparable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comparable.swift; sourceTree = ""; }; + BB241C331DDB70600067F917 /* Data Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data Conversion.swift"; sourceTree = ""; }; + BB241C341DDB70600067F917 /* Division.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Division.swift; sourceTree = ""; }; + BB241C351DDB70600067F917 /* Exponentiation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Exponentiation.swift; sourceTree = ""; }; + BB241C361DDB70600067F917 /* GCD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GCD.swift; sourceTree = ""; }; + BB241C371DDB70600067F917 /* Hashable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hashable.swift; sourceTree = ""; }; + BB241C381DDB70600067F917 /* Multiplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Multiplication.swift; sourceTree = ""; }; + BB241C391DDB70600067F917 /* Prime Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Prime Test.swift"; sourceTree = ""; }; + BB241C3A1DDB70600067F917 /* String Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String Conversion.swift"; sourceTree = ""; }; + BB241C3B1DDB70600067F917 /* Random.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; + BB241C3C1DDB70600067F917 /* Shifts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Shifts.swift; sourceTree = ""; }; + BB241C3D1DDB70600067F917 /* Square Root.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Square Root.swift"; sourceTree = ""; }; + BB241C3E1DDB70600067F917 /* Subtraction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Subtraction.swift; sourceTree = ""; }; + BB241C3F1DDB70600067F917 /* BigUInt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigUInt.swift; sourceTree = ""; }; + BB241C561DDB70690067F917 /* BigIntTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigIntTests.swift; sourceTree = ""; }; + BB241C571DDB70690067F917 /* BigUIntTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigUIntTests.swift; sourceTree = ""; }; + BB241C5A1DDB70690067F917 /* ProfileTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileTests.swift; sourceTree = ""; }; + BB241C6A1DDB70B00067F917 /* BigInt Benchmark.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BigInt Benchmark.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + BB241CE81DDB7B620067F917 /* CHANGELOG.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; + BB241CE91DDB7B620067F917 /* Demo.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Demo.playground; sourceTree = ""; }; + BB241CF01DDB84210067F917 /* .codecov.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .codecov.yml; sourceTree = ""; }; + BB4273F41F24AFC800065766 /* Tools.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tools.swift; sourceTree = ""; }; + BB9889A41F3E5C3100014740 /* Strideable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strideable.swift; sourceTree = ""; }; + BB9889A91F3E5CC600014740 /* Integer Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Integer Conversion.swift"; sourceTree = ""; }; + BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Floating Point Conversion.swift"; sourceTree = ""; }; + BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Words and Bits.swift"; sourceTree = ""; }; + BBB55AB21C8F80020050DDA9 /* BigInt.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BigInt.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55AB71C8F80020050DDA9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BBB55ABC1C8F80020050DDA9 /* BigInt-Test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BigInt-Test.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55AC31C8F80020050DDA9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + BBB55ACC1C8F80660050DDA9 /* version.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = version.xcconfig; sourceTree = ""; }; + BBB55AD41C8F88F20050DDA9 /* BigInt.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BigInt.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55ADD1C8F88F20050DDA9 /* BigInt-Test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BigInt-Test.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55AF11C8F8BE00050DDA9 /* BigInt.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BigInt.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55AFE1C8F8CBB0050DDA9 /* BigInt.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BigInt.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55B071C8F8CBB0050DDA9 /* BigInt-Test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "BigInt-Test.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB55B1D1C8F9E850050DDA9 /* LICENSE.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = LICENSE.md; sourceTree = ""; }; + BBB55B1E1C8F9E920050DDA9 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; + BBEAE4DC1F28C37800F4E329 /* WordTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + BB241C641DDB70B00067F917 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BB241C651DDB70B00067F917 /* BigInt.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AAE1C8F80020050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AB91C8F80020050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BBB55ABD1C8F80020050DDA9 /* BigInt.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AD01C8F88F20050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55ADA1C8F88F20050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BBB55ADE1C8F88F20050DDA9 /* BigInt.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AED1C8F8BE00050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AFA1C8F8CBB0050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55B041C8F8CBB0050DDA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + BBB55B081C8F8CBC0050DDA9 /* BigInt.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + BB241CCB1DDB71DB0067F917 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + BBB55AA81C8F80020050DDA9 = { + isa = PBXGroup; + children = ( + BBB55B1E1C8F9E920050DDA9 /* README.md */, + BBB55B1D1C8F9E850050DDA9 /* LICENSE.md */, + BB241CE81DDB7B620067F917 /* CHANGELOG.md */, + BB241BC51DD9F6490067F917 /* Package.swift */, + BB241BC71DD9F7D60067F917 /* BigInt.podspec */, + BB241CF01DDB84210067F917 /* .codecov.yml */, + BBB55ACC1C8F80660050DDA9 /* version.xcconfig */, + BB241CE91DDB7B620067F917 /* Demo.playground */, + BBB55AB41C8F80020050DDA9 /* Sources */, + BBB55AC01C8F80020050DDA9 /* Tests */, + BBB55AB31C8F80020050DDA9 /* Products */, + BB241CCB1DDB71DB0067F917 /* Frameworks */, + ); + sourceTree = ""; + }; + BBB55AB31C8F80020050DDA9 /* Products */ = { + isa = PBXGroup; + children = ( + BBB55AB21C8F80020050DDA9 /* BigInt.framework */, + BBB55ABC1C8F80020050DDA9 /* BigInt-Test.xctest */, + BBB55AD41C8F88F20050DDA9 /* BigInt.framework */, + BBB55ADD1C8F88F20050DDA9 /* BigInt-Test.xctest */, + BBB55AF11C8F8BE00050DDA9 /* BigInt.framework */, + BBB55AFE1C8F8CBB0050DDA9 /* BigInt.framework */, + BBB55B071C8F8CBB0050DDA9 /* BigInt-Test.xctest */, + BB241C6A1DDB70B00067F917 /* BigInt Benchmark.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBB55AB41C8F80020050DDA9 /* Sources */ = { + isa = PBXGroup; + children = ( + BB241C3F1DDB70600067F917 /* BigUInt.swift */, + BB241C2F1DDB70600067F917 /* BigInt.swift */, + BBABCDD61F3E2038009CA8BC /* Words and Bits.swift */, + BB9889A91F3E5CC600014740 /* Integer Conversion.swift */, + BBABCDD11F3E17A8009CA8BC /* Floating Point Conversion.swift */, + BB241C3A1DDB70600067F917 /* String Conversion.swift */, + BB241C331DDB70600067F917 /* Data Conversion.swift */, + BB241C321DDB70600067F917 /* Comparable.swift */, + BB241C371DDB70600067F917 /* Hashable.swift */, + BBE4CA4D1F3DA5AB0062A281 /* Codable.swift */, + BB241C301DDB70600067F917 /* Addition.swift */, + BB241C3E1DDB70600067F917 /* Subtraction.swift */, + BB9889A41F3E5C3100014740 /* Strideable.swift */, + BB241C381DDB70600067F917 /* Multiplication.swift */, + BB241C341DDB70600067F917 /* Division.swift */, + BB241C351DDB70600067F917 /* Exponentiation.swift */, + BB241C311DDB70600067F917 /* Bitwise Ops.swift */, + BB241C3C1DDB70600067F917 /* Shifts.swift */, + BB241C3D1DDB70600067F917 /* Square Root.swift */, + BB241C361DDB70600067F917 /* GCD.swift */, + BB241C391DDB70600067F917 /* Prime Test.swift */, + BB241C3B1DDB70600067F917 /* Random.swift */, + BBB55AB71C8F80020050DDA9 /* Info.plist */, + ); + path = Sources; + sourceTree = ""; + }; + BBB55AC01C8F80020050DDA9 /* Tests */ = { + isa = PBXGroup; + children = ( + BB241C561DDB70690067F917 /* BigIntTests.swift */, + BB241C571DDB70690067F917 /* BigUIntTests.swift */, + BBEAE4DC1F28C37800F4E329 /* WordTests.swift */, + BB241C5A1DDB70690067F917 /* ProfileTests.swift */, + BB4273F41F24AFC800065766 /* Tools.swift */, + BBB55AC31C8F80020050DDA9 /* Info.plist */, + ); + name = Tests; + path = Tests/BigIntTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + BBB55AAF1C8F80020050DDA9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AD11C8F88F20050DDA9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AEE1C8F8BE00050DDA9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AFB1C8F8CBB0050DDA9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + BB241C601DDB70B00067F917 /* BigInt Benchmark */ = { + isa = PBXNativeTarget; + buildConfigurationList = BB241C671DDB70B00067F917 /* Build configuration list for PBXNativeTarget "BigInt Benchmark" */; + buildPhases = ( + BB241C631DDB70B00067F917 /* Sources */, + BB241C641DDB70B00067F917 /* Frameworks */, + BB241C661DDB70B00067F917 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BB241C611DDB70B00067F917 /* PBXTargetDependency */, + ); + name = "BigInt Benchmark"; + productName = BigIntTests; + productReference = BB241C6A1DDB70B00067F917 /* BigInt Benchmark.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + BBB55AB11C8F80020050DDA9 /* BigInt-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55AC61C8F80020050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-iOS" */; + buildPhases = ( + BBB55AAD1C8F80020050DDA9 /* Sources */, + BBB55AAE1C8F80020050DDA9 /* Frameworks */, + BBB55AAF1C8F80020050DDA9 /* Headers */, + BBB55AB01C8F80020050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BigInt-iOS"; + productName = BigInt; + productReference = BBB55AB21C8F80020050DDA9 /* BigInt.framework */; + productType = "com.apple.product-type.framework"; + }; + BBB55ABB1C8F80020050DDA9 /* BigInt iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55AC91C8F80020050DDA9 /* Build configuration list for PBXNativeTarget "BigInt iOS Tests" */; + buildPhases = ( + BBB55AB81C8F80020050DDA9 /* Sources */, + BBB55AB91C8F80020050DDA9 /* Frameworks */, + BBB55ABA1C8F80020050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BBB55ABF1C8F80020050DDA9 /* PBXTargetDependency */, + ); + name = "BigInt iOS Tests"; + productName = BigIntTests; + productReference = BBB55ABC1C8F80020050DDA9 /* BigInt-Test.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + BBB55AD31C8F88F20050DDA9 /* BigInt-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55AE51C8F88F20050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-macOS" */; + buildPhases = ( + BBB55ACF1C8F88F20050DDA9 /* Sources */, + BBB55AD01C8F88F20050DDA9 /* Frameworks */, + BBB55AD11C8F88F20050DDA9 /* Headers */, + BBB55AD21C8F88F20050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BigInt-macOS"; + productName = BigInt; + productReference = BBB55AD41C8F88F20050DDA9 /* BigInt.framework */; + productType = "com.apple.product-type.framework"; + }; + BBB55ADC1C8F88F20050DDA9 /* BigInt macOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55AE81C8F88F20050DDA9 /* Build configuration list for PBXNativeTarget "BigInt macOS Tests" */; + buildPhases = ( + BBB55AD91C8F88F20050DDA9 /* Sources */, + BBB55ADA1C8F88F20050DDA9 /* Frameworks */, + BBB55ADB1C8F88F20050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BBB55AE01C8F88F20050DDA9 /* PBXTargetDependency */, + ); + name = "BigInt macOS Tests"; + productName = BigIntTests; + productReference = BBB55ADD1C8F88F20050DDA9 /* BigInt-Test.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + BBB55AF01C8F8BE00050DDA9 /* BigInt-watchOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55AF61C8F8BE00050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-watchOS" */; + buildPhases = ( + BBB55AEC1C8F8BE00050DDA9 /* Sources */, + BBB55AED1C8F8BE00050DDA9 /* Frameworks */, + BBB55AEE1C8F8BE00050DDA9 /* Headers */, + BBB55AEF1C8F8BE00050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BigInt-watchOS"; + productName = BigInt; + productReference = BBB55AF11C8F8BE00050DDA9 /* BigInt.framework */; + productType = "com.apple.product-type.framework"; + }; + BBB55AFD1C8F8CBB0050DDA9 /* BigInt-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55B0F1C8F8CBC0050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-tvOS" */; + buildPhases = ( + BBB55AF91C8F8CBB0050DDA9 /* Sources */, + BBB55AFA1C8F8CBB0050DDA9 /* Frameworks */, + BBB55AFB1C8F8CBB0050DDA9 /* Headers */, + BBB55AFC1C8F8CBB0050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BigInt-tvOS"; + productName = BigInt; + productReference = BBB55AFE1C8F8CBB0050DDA9 /* BigInt.framework */; + productType = "com.apple.product-type.framework"; + }; + BBB55B061C8F8CBB0050DDA9 /* BigInt tvOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = BBB55B121C8F8CBC0050DDA9 /* Build configuration list for PBXNativeTarget "BigInt tvOS Tests" */; + buildPhases = ( + BBB55B031C8F8CBB0050DDA9 /* Sources */, + BBB55B041C8F8CBB0050DDA9 /* Frameworks */, + BBB55B051C8F8CBB0050DDA9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + BBB55B0A1C8F8CBC0050DDA9 /* PBXTargetDependency */, + ); + name = "BigInt tvOS Tests"; + productName = BigIntTests; + productReference = BBB55B071C8F8CBB0050DDA9 /* BigInt-Test.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BBB55AA91C8F80020050DDA9 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0730; + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = "Károly Lőrentey"; + TargetAttributes = { + BBB55AB11C8F80020050DDA9 = { + CreatedOnToolsVersion = 7.3; + LastSwiftMigration = 1020; + }; + BBB55ABB1C8F80020050DDA9 = { + CreatedOnToolsVersion = 7.3; + LastSwiftMigration = 1020; + }; + BBB55AD31C8F88F20050DDA9 = { + CreatedOnToolsVersion = 7.3; + LastSwiftMigration = 1020; + }; + BBB55ADC1C8F88F20050DDA9 = { + CreatedOnToolsVersion = 7.3; + LastSwiftMigration = 1020; + }; + BBB55AF01C8F8BE00050DDA9 = { + CreatedOnToolsVersion = 7.3; + LastSwiftMigration = 1020; + }; + BBB55AFD1C8F8CBB0050DDA9 = { + CreatedOnToolsVersion = 7.3; + }; + BBB55B061C8F8CBB0050DDA9 = { + CreatedOnToolsVersion = 7.3; + }; + }; + }; + buildConfigurationList = BBB55AAC1C8F80020050DDA9 /* Build configuration list for PBXProject "BigInt" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = BBB55AA81C8F80020050DDA9; + productRefGroup = BBB55AB31C8F80020050DDA9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + BBB55AB11C8F80020050DDA9 /* BigInt-iOS */, + BBB55AD31C8F88F20050DDA9 /* BigInt-macOS */, + BBB55AF01C8F8BE00050DDA9 /* BigInt-watchOS */, + BBB55AFD1C8F8CBB0050DDA9 /* BigInt-tvOS */, + BBB55ABB1C8F80020050DDA9 /* BigInt iOS Tests */, + BBB55ADC1C8F88F20050DDA9 /* BigInt macOS Tests */, + BBB55B061C8F8CBB0050DDA9 /* BigInt tvOS Tests */, + BB241C601DDB70B00067F917 /* BigInt Benchmark */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + BB241C661DDB70B00067F917 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AB01C8F80020050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55ABA1C8F80020050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AD21C8F88F20050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55ADB1C8F88F20050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AEF1C8F8BE00050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AFC1C8F8CBB0050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55B051C8F8CBB0050DDA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + BB241C631DDB70B00067F917 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB4273F91F24AFCE00065766 /* Tools.swift in Sources */, + BBF16BD51F2BA51B00402089 /* ProfileTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AAD1C8F80020050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB241C441DDB70600067F917 /* Addition.swift in Sources */, + BB241C531DDB70600067F917 /* BigUInt.swift in Sources */, + BB241C4F1DDB70600067F917 /* Random.swift in Sources */, + BBABCDD71F3E2038009CA8BC /* Words and Bits.swift in Sources */, + BBC944391F24C25C00ED6C30 /* BigInt.swift in Sources */, + BB241C4D1DDB70600067F917 /* Prime Test.swift in Sources */, + BBABCDD21F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */, + BB241C4B1DDB70600067F917 /* Hashable.swift in Sources */, + BB241C4A1DDB70600067F917 /* GCD.swift in Sources */, + BB9889AA1F3E5CC600014740 /* Integer Conversion.swift in Sources */, + BB241C4E1DDB70600067F917 /* String Conversion.swift in Sources */, + BB241C481DDB70600067F917 /* Division.swift in Sources */, + BB241C501DDB70600067F917 /* Shifts.swift in Sources */, + BB241C521DDB70600067F917 /* Subtraction.swift in Sources */, + BB241C4C1DDB70600067F917 /* Multiplication.swift in Sources */, + BB9889A51F3E5C3100014740 /* Strideable.swift in Sources */, + BB241C511DDB70600067F917 /* Square Root.swift in Sources */, + BB241C471DDB70600067F917 /* Data Conversion.swift in Sources */, + BB241C461DDB70600067F917 /* Comparable.swift in Sources */, + BBE4CA4E1F3DA5AB0062A281 /* Codable.swift in Sources */, + BB241C491DDB70600067F917 /* Exponentiation.swift in Sources */, + BB241C451DDB70600067F917 /* Bitwise Ops.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AB81C8F80020050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BBC9443A1F24C27E00ED6C30 /* BigIntTests.swift in Sources */, + BB241CBB1DDB71A50067F917 /* ProfileTests.swift in Sources */, + BB4273F61F24AFCC00065766 /* Tools.swift in Sources */, + BBEAE4DD1F28C37800F4E329 /* WordTests.swift in Sources */, + BB241CE41DDB79E30067F917 /* BigUIntTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55ACF1C8F88F20050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB241C8C1DDB71920067F917 /* Bitwise Ops.swift in Sources */, + BB241C921DDB71920067F917 /* Random.swift in Sources */, + BB241C901DDB71920067F917 /* Prime Test.swift in Sources */, + BBABCDD81F3E2038009CA8BC /* Words and Bits.swift in Sources */, + BB64CD611F1D65D000C1B077 /* BigInt.swift in Sources */, + BB241C851DDB71920067F917 /* Hashable.swift in Sources */, + BBABCDD31F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */, + BB241C881DDB71920067F917 /* Subtraction.swift in Sources */, + BB241C8A1DDB71920067F917 /* Division.swift in Sources */, + BB9889AB1F3E5CC600014740 /* Integer Conversion.swift in Sources */, + BB241C831DDB71920067F917 /* BigUInt.swift in Sources */, + BB241C841DDB71920067F917 /* Comparable.swift in Sources */, + BB241C911DDB71920067F917 /* String Conversion.swift in Sources */, + BB241C861DDB71920067F917 /* Data Conversion.swift in Sources */, + BB241C891DDB71920067F917 /* Multiplication.swift in Sources */, + BB9889A61F3E5C3100014740 /* Strideable.swift in Sources */, + BB241C8D1DDB71920067F917 /* Shifts.swift in Sources */, + BB241C8F1DDB71920067F917 /* GCD.swift in Sources */, + BB241C8E1DDB71920067F917 /* Square Root.swift in Sources */, + BBE4CA4F1F3DAD380062A281 /* Codable.swift in Sources */, + BB241C8B1DDB71920067F917 /* Exponentiation.swift in Sources */, + BB241C871DDB71920067F917 /* Addition.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AD91C8F88F20050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB4273F71F24AFCD00065766 /* Tools.swift in Sources */, + BB9916911F33C32000CCFDDC /* WordTests.swift in Sources */, + BB9916901F32610A00CCFDDC /* BigUIntTests.swift in Sources */, + BB99168F1F32610700CCFDDC /* BigIntTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AEC1C8F8BE00050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB241C781DDB71910067F917 /* Bitwise Ops.swift in Sources */, + BB241C7E1DDB71910067F917 /* Random.swift in Sources */, + BB241C7C1DDB71910067F917 /* Prime Test.swift in Sources */, + BBABCDD91F3E2038009CA8BC /* Words and Bits.swift in Sources */, + BBC944371F24C25A00ED6C30 /* BigInt.swift in Sources */, + BB241C711DDB71910067F917 /* Hashable.swift in Sources */, + BBABCDD41F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */, + BB241C741DDB71910067F917 /* Subtraction.swift in Sources */, + BB241C761DDB71910067F917 /* Division.swift in Sources */, + BB9889AC1F3E5CC600014740 /* Integer Conversion.swift in Sources */, + BB241C6F1DDB71910067F917 /* BigUInt.swift in Sources */, + BB241C701DDB71910067F917 /* Comparable.swift in Sources */, + BB241C7D1DDB71910067F917 /* String Conversion.swift in Sources */, + BB241C721DDB71910067F917 /* Data Conversion.swift in Sources */, + BB241C751DDB71910067F917 /* Multiplication.swift in Sources */, + BB9889A71F3E5C3100014740 /* Strideable.swift in Sources */, + BB241C791DDB71910067F917 /* Shifts.swift in Sources */, + BB241C7B1DDB71910067F917 /* GCD.swift in Sources */, + BB241C7A1DDB71910067F917 /* Square Root.swift in Sources */, + BBE4CA501F3DAD390062A281 /* Codable.swift in Sources */, + BB241C771DDB71910067F917 /* Exponentiation.swift in Sources */, + BB241C731DDB71910067F917 /* Addition.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55AF91C8F8CBB0050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB241CA01DDB71920067F917 /* Bitwise Ops.swift in Sources */, + BB241CA61DDB71920067F917 /* Random.swift in Sources */, + BB241CA41DDB71920067F917 /* Prime Test.swift in Sources */, + BBABCDDA1F3E2038009CA8BC /* Words and Bits.swift in Sources */, + BBC944381F24C25B00ED6C30 /* BigInt.swift in Sources */, + BB241C991DDB71920067F917 /* Hashable.swift in Sources */, + BBABCDD51F3E17A8009CA8BC /* Floating Point Conversion.swift in Sources */, + BB241C9C1DDB71920067F917 /* Subtraction.swift in Sources */, + BB241C9E1DDB71920067F917 /* Division.swift in Sources */, + BB9889AD1F3E5CC600014740 /* Integer Conversion.swift in Sources */, + BB241C971DDB71920067F917 /* BigUInt.swift in Sources */, + BB241C981DDB71920067F917 /* Comparable.swift in Sources */, + BB241CA51DDB71920067F917 /* String Conversion.swift in Sources */, + BB241C9A1DDB71920067F917 /* Data Conversion.swift in Sources */, + BB241C9D1DDB71920067F917 /* Multiplication.swift in Sources */, + BB9889A81F3E5C3100014740 /* Strideable.swift in Sources */, + BB241CA11DDB71920067F917 /* Shifts.swift in Sources */, + BB241CA31DDB71920067F917 /* GCD.swift in Sources */, + BB241CA21DDB71920067F917 /* Square Root.swift in Sources */, + BBE4CA511F3DAD390062A281 /* Codable.swift in Sources */, + BB241C9F1DDB71920067F917 /* Exponentiation.swift in Sources */, + BB241C9B1DDB71920067F917 /* Addition.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BBB55B031C8F8CBB0050DDA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BBC9443C1F24C27F00ED6C30 /* BigIntTests.swift in Sources */, + BB241CC51DDB71A60067F917 /* ProfileTests.swift in Sources */, + BB4273F81F24AFCD00065766 /* Tools.swift in Sources */, + BBEAE4DF1F28C37800F4E329 /* WordTests.swift in Sources */, + BB241CDC1DDB79E20067F917 /* BigUIntTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + BB241C611DDB70B00067F917 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BBB55AD31C8F88F20050DDA9 /* BigInt-macOS */; + targetProxy = BB241C621DDB70B00067F917 /* PBXContainerItemProxy */; + }; + BBB55ABF1C8F80020050DDA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BBB55AB11C8F80020050DDA9 /* BigInt-iOS */; + targetProxy = BBB55ABE1C8F80020050DDA9 /* PBXContainerItemProxy */; + }; + BBB55AE01C8F88F20050DDA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BBB55AD31C8F88F20050DDA9 /* BigInt-macOS */; + targetProxy = BBB55ADF1C8F88F20050DDA9 /* PBXContainerItemProxy */; + }; + BBB55B0A1C8F8CBC0050DDA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = BBB55AFD1C8F8CBB0050DDA9 /* BigInt-tvOS */; + targetProxy = BBB55B091C8F8CBC0050DDA9 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + BB241C681DDB70B00067F917 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + BB241C691DDB70B00067F917 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; + BBB55AC41C8F80020050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBB55ACC1C8F80660050DDA9 /* version.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)"; + DEBUG_INFORMATION_FORMAT = dwarf; + DYLIB_COMPATIBILITY_VERSION = "$(BUILD_NUMBER)"; + DYLIB_CURRENT_VERSION = "$(BUILD_NUMBER)"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "-DDebug"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 5.0; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BBB55AC51C8F80020050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBB55ACC1C8F80660050DDA9 /* version.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(BUILD_NUMBER)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_COMPATIBILITY_VERSION = "$(BUILD_NUMBER)"; + DYLIB_CURRENT_VERSION = "$(BUILD_NUMBER)"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_SWIFT_FLAGS = "-DProfile"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_SWIFT3_OBJC_INFERENCE = Off; + SWIFT_VERSION = 5.0; + VALIDATE_PRODUCT = YES; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BBB55AC71C8F80020050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + BBB55AC81C8F80020050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + BBB55ACA1C8F80020050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + BBB55ACB1C8F80020050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = iphoneos; + }; + name = Release; + }; + BBB55AE61C8F88F20050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + BBB55AE71C8F88F20050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + COMBINE_HIDPI_IMAGES = YES; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + }; + name = Release; + }; + BBB55AE91C8F88F20050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = macosx; + }; + name = Debug; + }; + BBB55AEA1C8F88F20050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = macosx; + }; + name = Release; + }; + BBB55AF71C8F8BE00050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 4; + }; + name = Debug; + }; + BBB55AF81C8F8BE00050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = watchos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + }; + name = Release; + }; + BBB55B101C8F8CBC0050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Debug; + }; + BBB55B111C8F8CBC0050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = Sources/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).$(PLATFORM_DISPLAY_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(PROJECT_NAME)"; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + }; + name = Release; + }; + BBB55B131C8F8CBC0050DDA9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = appletvos; + }; + name = Debug; + }; + BBB55B141C8F8CBC0050DDA9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + APPLICATION_EXTENSION_API_ONLY = NO; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Tests/BigIntTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "$(BUNDLE_IDENTIFIER_BASE).Tests"; + PRODUCT_NAME = "$(PROJECT_NAME)-Test"; + SDKROOT = appletvos; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + BB241C671DDB70B00067F917 /* Build configuration list for PBXNativeTarget "BigInt Benchmark" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BB241C681DDB70B00067F917 /* Debug */, + BB241C691DDB70B00067F917 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AAC1C8F80020050DDA9 /* Build configuration list for PBXProject "BigInt" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55AC41C8F80020050DDA9 /* Debug */, + BBB55AC51C8F80020050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AC61C8F80020050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55AC71C8F80020050DDA9 /* Debug */, + BBB55AC81C8F80020050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AC91C8F80020050DDA9 /* Build configuration list for PBXNativeTarget "BigInt iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55ACA1C8F80020050DDA9 /* Debug */, + BBB55ACB1C8F80020050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AE51C8F88F20050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55AE61C8F88F20050DDA9 /* Debug */, + BBB55AE71C8F88F20050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AE81C8F88F20050DDA9 /* Build configuration list for PBXNativeTarget "BigInt macOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55AE91C8F88F20050DDA9 /* Debug */, + BBB55AEA1C8F88F20050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55AF61C8F8BE00050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-watchOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55AF71C8F8BE00050DDA9 /* Debug */, + BBB55AF81C8F8BE00050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55B0F1C8F8CBC0050DDA9 /* Build configuration list for PBXNativeTarget "BigInt-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55B101C8F8CBC0050DDA9 /* Debug */, + BBB55B111C8F8CBC0050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + BBB55B121C8F8CBC0050DDA9 /* Build configuration list for PBXNativeTarget "BigInt tvOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + BBB55B131C8F8CBC0050DDA9 /* Debug */, + BBB55B141C8F8CBC0050DDA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BBB55AA91C8F80020050DDA9 /* Project object */; +} diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..0713bb13 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/BigInt.xcscmblueprint b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/BigInt.xcscmblueprint new file mode 100644 index 00000000..64941483 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/BigInt.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "1C1636C82AA6D30C94DEAD00016AA8F48145AB62", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" : 9223372036854775807, + "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" : 9223372036854775807 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "B0F36144-0F1B-441F-9251-72EB0BE50122", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" : "BigInt\/", + "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" : "BigInt\/Carthage\/Checkouts\/SipHash\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "BigInt", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "BigInt.xcodeproj", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:lorentey\/BigInt.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/lorentey\/SipHash.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" + } + ] +} \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3714311D-5102-4569-B213-8DC87DC6C2F3.plist b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3714311D-5102-4569-B213-8DC87DC6C2F3.plist new file mode 100644 index 00000000..096fe76f --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3714311D-5102-4569-B213-8DC87DC6C2F3.plist @@ -0,0 +1,92 @@ + + + + + classNames + + ProfileTests + + testBalancedMultiplication() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.41604 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testDivision() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.70161 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testFibonacciAddition() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 2.3569 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testGCD() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 1.801 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testMersennePrimes() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 4.184 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testModularExponentiation() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 2.1938 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testMultiplicationByDigit() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.91891 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + testSquareRoot() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.48118 + baselineIntegrationDisplayName + 2016-11-15 18:19:04 + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3B06D4DF-FC61-43AE-8115-CA5059B5AB1B.plist b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3B06D4DF-FC61-43AE-8115-CA5059B5AB1B.plist new file mode 100644 index 00000000..d1b34746 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/3B06D4DF-FC61-43AE-8115-CA5059B5AB1B.plist @@ -0,0 +1,92 @@ + + + + + classNames + + ProfileTests + + testBalancedMultiplication() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.31603 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testDivision() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.60765 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testFibonacciAddition() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 2.0927 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testGCD() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 1.3631 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testMersennePrimes() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 3.4959 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testModularExponentiation() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 1.7139 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testMultiplicationByDigit() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.60397 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + testSquareRoot() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.40256 + baselineIntegrationDisplayName + Jun 21, 2017, 5:03:36 PM + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/E75E9014-DB8C-4424-B05B-83660CCFB7ED.plist b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/E75E9014-DB8C-4424-B05B-83660CCFB7ED.plist new file mode 100644 index 00000000..bf59955f --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/E75E9014-DB8C-4424-B05B-83660CCFB7ED.plist @@ -0,0 +1,122 @@ + + + + + classNames + + ProfileTests + + testBalancedFactorial() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.33337 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testDivision() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.59507 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testDivisionOfFactorial() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 3.6987 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testFactorial() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.66551 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testFibonacciAddition() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 2.0881 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testGCD() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 1.3696 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testMersennePrimes() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 3.71 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testModularExponentiation() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 1.8318 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testPrintingFactorial() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.95106 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testReadingFactorial() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.48879 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + testSquareRoot() + + com.apple.XCTPerformanceMetric_WallClockTime + + baselineAverage + 0.45393 + baselineIntegrationDisplayName + Jul 23, 2017, 12:47:59 + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/Info.plist b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/Info.plist new file mode 100644 index 00000000..3d624f11 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcbaselines/BB241C601DDB70B00067F917.xcbaseline/Info.plist @@ -0,0 +1,57 @@ + + + + + runDestinationsByUUID + + 3714311D-5102-4569-B213-8DC87DC6C2F3 + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2600 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro10,1 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + + E75E9014-DB8C-4424-B05B-83660CCFB7ED + + localComputer + + busSpeedInMHz + 100 + cpuCount + 1 + cpuKind + Intel Core i7 + cpuSpeedInMHz + 2900 + logicalCPUCoresPerPackage + 8 + modelCode + MacBookPro14,3 + physicalCPUCoresPerPackage + 4 + platformIdentifier + com.apple.platform.macosx + + targetArchitecture + x86_64 + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt Benchmark.xcscheme b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt Benchmark.xcscheme new file mode 100644 index 00000000..5b99a933 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt Benchmark.xcscheme @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-iOS.xcscheme b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-iOS.xcscheme new file mode 100644 index 00000000..0fc086a8 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-iOS.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-macOS.xcscheme b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-macOS.xcscheme new file mode 100644 index 00000000..50d05aa7 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-macOS.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-tvOS.xcscheme b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-tvOS.xcscheme new file mode 100644 index 00000000..16589b0d --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-tvOS.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-watchOS.xcscheme b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-watchOS.xcscheme new file mode 100644 index 00000000..784c3d88 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcodeproj/xcshareddata/xcschemes/BigInt-watchOS.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..8fad3510 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/BigInt.xcscmblueprint b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/BigInt.xcscmblueprint new file mode 100644 index 00000000..bc1d4617 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/BigInt.xcscmblueprint @@ -0,0 +1,30 @@ +{ + "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "1C1636C82AA6D30C94DEAD00016AA8F48145AB62", + "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { + + }, + "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { + "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" : 9223372036854775807, + "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" : 9223372036854775807 + }, + "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "4FCBFF65-32E4-4BDC-A85B-DE06364A0673", + "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { + "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" : "BigInt\/", + "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" : "BigInt\/Carthage\/Checkouts\/SipHash\/" + }, + "DVTSourceControlWorkspaceBlueprintNameKey" : "BigInt", + "DVTSourceControlWorkspaceBlueprintVersion" : 204, + "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "BigInt.xcworkspace", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:lorentey\/BigInt.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "1C1636C82AA6D30C94DEAD00016AA8F48145AB62" + }, + { + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/lorentey\/SipHash.git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", + "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "FB48966E443D25259D3CA0BE6E56D2D7343B7F97" + } + ] +} \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/BigInt/BigInt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/BigInt/CHANGELOG.md b/Carthage/Checkouts/BigInt/CHANGELOG.md new file mode 100644 index 00000000..c77eae6e --- /dev/null +++ b/Carthage/Checkouts/BigInt/CHANGELOG.md @@ -0,0 +1,232 @@ +# 5.3.0 (2021-09-06) + +This release contains the following changes: + +- Make access level for isZero the same for signed and unsigned types (#93) + +- NFC: Add protocol conformance to Comparable for BigInt for consistency (#88) + +# 5.2.1 (2020-11-15) + +This release contains the following changes: + +- Added a temporary fix for [SR-13491](https://bugs.swift.org/browse/SR-13491) + +# 5.2.0 (2020-08-24) + +This release contains the following changes: + +- Added support for the use of RandomNumberGenerator + +# 5.1.0 (2020-03-17) + +This release contains the following changes: + +- Added support to serialize/deserialize BigInt in a manner similar to BigUInt + +# 5.0.0 (2019-08-24) + +This release contains the following changes: + +- Swift 5 compatibility + +There were no functional changes. + +# 4.0.1 (2019-05-09) + +This release contains the following changes: + +- Cleaned warnings on Swift 5 + +There were no functional changes. + +# 4.0.0 (2019-04-03) + +This release contains the following changes: + +- Swift 5.0 compatibility for Linux and macOS +- Removed SipHash dependency + +There were no functional changes. + +# 3.1.0 (2018-06-08) + +This release contains the following changes: + +- Swift 4.1 compatibility for Linux and macOS +- Fix warnings for Swift 4.1 + +There were no functional changes. + +# 3.0.2 (2017-12-25) + +This release contains the following packaging fix: + +- Fixed product definitions in Package.swift not to create a duplicate library. (Issue #37) + +There were no functional changes. + +# 3.0.1 (2017-10-10) + +This release contains the following bug fixes: + +- Issue #27 — changing scope of `BigUInt` methods `kind` and `storage` to be `fileprivate` +- Making `subscript` method of `BigUInt` public + +# 3.0.0 (2017-09-07) + +This is a major release upgrading BigInt to the new integer protocols introduced in Swift 4 as part of [SE-0104, Protocol-oriented integers][se-0104]. + +[se-0104]: https://github.com/apple/swift-evolution/blob/master/proposals/0104-improved-integers.md + +- Adopting the new protocols involved major, breaking changes throughout the API. These aren't individually listed here. +- The `BigUInt` struct now provides inline storage for big integers that fit inside two words. This optimization speeds up conversions from built-in fixed-width integer types, amongst other frequent operations. +- `BigInt` and `BigUInt` implements the new `Codable` protocol. In both cases, values are encoded in an unkeyed container starting with a string indicating the sign (`"+"` or `"-"`), followed by a sequence of 64-bit unsigned integers representing component words, from least to most significant. +- New method: `BigInt.modulo`, contributed by @FabioTacke. +- `BigUInt` does not implement `Collection` in this release. The collection of words is available in the standard read-only `words` property. Direct public access to collection methods have been removed; if you have been manipulating big integers using collection methods, you need to rewrite your code. If you have a usecase that isn't covered by the public API, please submit a PR adding the missing functionality. (Public read-write access to the underlying storage inside `BigUInt` will not be restored, though.) + +BigInt is now part of the Attaswift project. The bundle identifiers in the supplied Xcode project have been updated accordingly. + +Note that the URL for the package's Git repository has changed; please update your references. + +# 2.2.0 (2017-06-20) + +This release contains the following changes: + +- `BigUInt.randomIntegerLessThan(_:)` was renamed to `BigUInt.randomInteger(lessThan:)` to match Swift 3 naming conventions. (The old name is still available for compatibility.) +- The `ShiftOperations` protocol was merged into `BigDigit` and removed. It was previously public by accident. (Issue #9) +- `BigInt.modulus(_:,_:)` is a new static method that returns the nonnegative modulus value of its two arguments. (PR #19 by @FabioTacke) + + +# 2.1.2 (2017-02-03) + +This release contains the following bugfix: + +- Issue #12: The iOS target in the supplied Xcode project file no longer copies extraneous files + as resources into the framework bundle. The set of such files included generate-docs.sh, which + led to App Store rejections for apps that build BigInt using the project file. + (Thanks to @arrrnas and @wuftymerguftyguff) + +No source-level changes were made. + +# 2.1.1 (2016-11-23) + +This release restores support for iOS 8.0 and macOS 10.9. + +# 2.1.0 (2016-11-15) + +This release contains the following changes: + +- BigInt now uses the SipHash hashing algorithm instead of implementing its own hashing. +- The `SipHash` package has been added as a required dependency. I suggest you use a dependency manager. +- Minimum deployment targets have been bumped to iOS 9.0 and macOS 10.0 to match those of `SipHash`. +- BigInt now requires Swift 3.0.1, included in Xcode 8.1. +- The Xcode project file has been regenerated from scratch, with new names for targets and schemes. +- The bundle identifiers of frameworks generated from the Xcode project file have been changed to `hu.lorentey.BigInt.`. + +# 2.0.1 (2016-11-08) + +This release contains the following bugfixes: + +- The Swift version number is now correctly set in all targets (PR #7 by @mAu888). +- BigInt now builds on Linux (PR #5 by @ratranqu). +- Building BigInt with the Swift Package Manager bundled with Swift 3.0.1 works correctly. + +Additionally, Foundation imports that weren't actually needed were removed from sources. + +# 2.0.0 (2016-09-20) + +This release updates the project for Swift 3.0, including adapting the API to the new naming conventions. + +Further changes: + +- The behavior of `BigUInt.gcd` when one of the arguments is zero has been fixed; the result in this case is now equal to the other argument. +- `BigInt` now conforms to `Strideable`, `IntegerArithmetic`, `SignedNumber` and `AbsoluteValuable`. +- `BigUInt` now conforms to `Strideable`, `IntegerArithmetic` and `BitwiseOperations`. + +# 1.3.0 (2016-03-23) + +This release updates the project to require Swift 2.2 and Xcode 7.3. There have been no other changes. + +# 1.2.3 (2016-01-12) + +This release adds experimental support for the Swift Package Manager and Swift 2.2. +There were no source-level changes. + +# 1.2.2 (2016-01-08) + +This release fixes version numbers embedded in build products. + +# 1.2.1 (2016-01-07) + +This release simply removes the stray LICENSE.md file from iOS builds. + + +# 1.2.0 (2016-01-06) + +With this release, BigInt supports watchOS and tvOS in addition to OS X and iOS. Deployment targets are as follows: + +- OS X 10.9 +- iOS 8 +- watchOS 2 +- tvOS 9 + +BigInt 1.2.0 also features support for both Carthage and CocoaPods deployments. + + +# 1.1.0 (2016-01-06) + +`BigInt` now contains enough functionality to pretend it's a respectable big integer lib. Some of the new additions since 1.0.0: + +- Conversion to/from `NSData` +- Vanilla exponentiation +- Algorithm to find the multiplicative inverse of an integer in modulo arithmetic +- An implementation of the Miller-Rabin primality test +- Support for generating random big integers +- Better support for playgrounds in Xcode +- Documentation for all public API +- Fun new calculation samples + + +# 1.0.0 (2016-01-04) + +This is the first release of the BigInt module, providing arbitrary precision integer arithmetic operations +in pure Swift. + +Two big integer types are included: `BigUInt` and `BigInt`, the latter being the signed variant. +Both of these are Swift structs with copy-on-write value semantics, and they can be used much +like any other integer type. + +The library provides implementations for some of the most frequently useful functions on +big integers, including + +- All functionality from `Comparable` and `Hashable` +- The full set of arithmetic operators: `+`, `-`, `*`, `/`, `%`, `+=`, `-=`, `*=`, `/=`, `%=` +- Addition and subtraction have variants that allow for shifting the digits of the second +operand on the fly. +- Unsigned subtraction will trap when the result would be negative. (There are variants +that return an overflow flag.) +- Multiplication uses brute force for numbers up to 1024 digits, then switches to Karatsuba's recursive method. +(This limit is configurable, see `BigUInt.directMultiplicationLimit`.) +A fused multiply-add method is also available. +- Division uses Knuth's Algorithm D, with its 3/2 digits wide quotient approximation. +It will trap when the divisor is zero. `BigUInt.divmod` returns the quotient and +remainder at once; this is faster than calculating them separately. +- Bitwise operators: `~`, `|`, `&`, `^`, `|=`, `&=`, `^=`, plus the following read-only properties: +- `width`: the minimum number of bits required to store the integer, +- `trailingZeroBitCount`: the number of trailing zero bits in the binary representation, +- `leadingZeroBitCount`: the number of leading zero bits (when the last digit isn't full), +- Shift operators: `>>`, `<<`, `>>=`, `<<=` +- Left shifts need to allocate memory to extend the digit array, so it's probably not a good idea +to left shift a `BigUInt` by 2^50 bits. +- Radix conversion between `String`s and big integers up to base 36 (using repeated divisions). +- Big integers use this to implement `StringLiteralConvertible` (in base 10). +- `sqrt(n)`: The square root of an integer (using Newton's method) +- `BigUInt.gcd(n, m)`: The greatest common divisor of two integers (Stein's algorithm) +- `BigUInt.powmod(base, exponent, modulus)`: Modular exponentiation (right-to-left binary method): + +The implementations are intended to be reasonably efficient, but they are unlikely to be +competitive with GMP at all, even when I happened to implement an algorithm with same asymptotic +behavior as GMP. (I haven't performed a comparison benchmark, though.) + +The library has 100% unit test coverage. diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Contents.o b/Carthage/Checkouts/BigInt/Demo.playground/Contents.o new file mode 100644 index 0000000000000000000000000000000000000000..b8daafd61e5d72eb58e2b34f569d28ead82f0532 GIT binary patch literal 12432 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 ap=dc$;5)*yYm`YSd|q_c&QC}5PX52Cs=a*x literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/Contents.swift b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..092120fe --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/Contents.swift @@ -0,0 +1,28 @@ +//: [Previous](@previous) +import BigInt +//: ## Let's calculate the first thousand digits of π +//: +//: A fun application of BigInts is generating the digits of π. +//: Let's implement [Jeremy Gibbon's spigot algorithm][spigot] as an infinite `GeneratorType`. +//: This is a quite slow algorithm, but it makes up for it with its grooviness factor. +//: +//: [spigot]: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf +func digitsOfPi() -> AnyIterator { + var q: BigUInt = 1 + var r: BigUInt = 180 + var t: BigUInt = 60 + var i: UInt = 2 // Works until digit #826_566_842 + return AnyIterator { + let u: UInt = 3 * (3 * i + 1) * (3 * i + 2) + let y = (q.multiplied(byWord: 27 * i - 12) + 5 * r) / (5 * t) + (q, r, t) = ( + 10 * q.multiplied(byWord: i * (2 * i - 1)), + 10 * (q.multiplied(byWord: 5 * i - 2) + r - y * t).multiplied(byWord: u), + t.multiplied(byWord: u)) + i += 1 + return Int(y.words[0]) + } +} +//: Well, that was surprisingly easy. Does it work? You bet: +let digits = digitsOfPi().prefix(999).reduce("") { $0 + String($1) } +//: [Next](@next) diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/timeline.xctimeline b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 00000000..c2408fc4 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Digits of Pi.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/Contents.swift b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..24e7992b --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/Contents.swift @@ -0,0 +1,30 @@ +//: [Previous](@previous) +import Foundation +import BigInt +//: The canonical way to demo big integers is with the factorial function. Here is a fancy definition for it: +func fact(_ n: Int) -> BigInt { + return (1 ... n).map { BigInt($0) }.reduce(BigInt(1), *) +} + +let f1 = fact(1) +let f2 = fact(2) +let f3 = fact(3) +let f4 = fact(4) +let f10 = fact(10) +let f100 = fact(100) +let f1000 = fact(1000) +//: That last value seems quite large. Just how many decimal digits is it? Let's convert it to a `String` to find out. +let decimal = String(f1000) +let digitCount = decimal.characters.count +//: Wow. 2500 digits is peanuts for `BigInt`, but Xcode's playground tech isn't designed to perform well with much more loop iterations, so let's stay at this level for now. +let ff2 = f1000 * f1000 +String(ff2).characters.count + +let ff4 = ff2 * ff2 +String(ff4).characters.count + +let ff8 = ff4 * ff4 +String(ff8).characters.count +//: That last operation multiplied two 10000-digit numbers; you may have noticed it took a couple of seconds to compute that value. Converting such huge values to decimal isn't particularly cheap, either. +//: +//: [Next](@next) diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/timeline.xctimeline b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 00000000..d106c0ac --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Factorials.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/Contents.swift b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..bc08ca52 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/Contents.swift @@ -0,0 +1,25 @@ +//: [Previous](@previous) +import Foundation +import BigInt +//: # Generating Large Prime Numbers +//: +//: `BigUInt` has an `isPrime()` method that does a [Miller-Rabin Primality Test][mrpt]. Let's use +//: this to create a function that finds the next prime number after any integer: +//: +//: [mrpt]: https://en.wikipedia.org/wiki/Miller%2dRabin_primality_test +func findNextPrime(after integer: BigUInt) -> BigUInt { + var candidate = integer + repeat { + candidate.increment() + } while !candidate.isPrime() + return candidate +} + +findNextPrime(after: 100) +findNextPrime(after: 1000) +findNextPrime(after: 10000) +findNextPrime(after: 100000000000) +findNextPrime(after: BigUInt(1) << 64) +findNextPrime(after: BigUInt(1) << 128) +findNextPrime(after: BigUInt(1) << 256) +//: [Next](@next) diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/timeline.xctimeline b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 00000000..986e0e19 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Generating Large Primes.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/Contents.swift b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..375a3058 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/Contents.swift @@ -0,0 +1,31 @@ +//: # Introduction +//: +//: The `BigInt` module provides a `BigInt` type that implements an [https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic](integer type of arbitrary width). +//: These work much like `Int`s, but they don't have a preset maximum value---so they will never overflow. +//: The only practical limit to their capacity is the amount of memory & address space that your computer has, and the +//: amount of time you're willing to spend waiting for results---when their operands are truly huge, +//: big integer operations can take a long time to execute. +//: (`BigInt` represents integers in base 2^64, storing digits in an `Array`, so the theoretical +//: maximum value it can store is (2^64)^`Int.max` - 1.) +import Foundation +import BigInt +//: `BigInt` has several interesting initializers, but for now, the simplest way to create big integers is to use integer +//: or string literals. The latter is useful when you want to create a number that's larger than `UIntMax.max`: +let a: BigInt = 123 +let b: BigInt = 12345678 +let c: BigInt = 1234567890123456 +let d: BigInt = "12345678901234567890123456789012345678901234567890123456789012345678" +//: To work with `BigInt`s, you use the same arithmetic operators as you do with everyday `Int` values: +a + b +b - a +-b +a * b +a * b * c +a * b * c * d + +d / c +d % c +d / (c * c) +d / (c * c * c) +d / (c * c * c * c) +//: [Next](@next) diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/timeline.xctimeline b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 00000000..6d244a66 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/Introduction.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/Contents.swift b/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/Contents.swift new file mode 100644 index 00000000..43e75941 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/Contents.swift @@ -0,0 +1,57 @@ +//: [Previous](@previous) +import Foundation +import BigInt +//: # RSA cryptography +//: +//: Another useful thing to have is a function that finds a random n-bit prime number: +func generatePrime(ofWidth width: Int) -> BigUInt { + while true { + var random = BigUInt.randomInteger(withExactWidth: width) + random |= BigUInt(1) + if random.isPrime() { + return random + } + } +} +//: For instance, here are two random 1024-bit prime numbers: +let p = generatePrime(ofWidth: 1024) +let q = generatePrime(ofWidth: 1024) +//: We know their product isn't prime, and `BigInt`'s primality test agrees: +let n = p * q +n.isPrime() +//: But we'd be in serious trouble if we had to get `p` and `q` back by factoring `n`---and this observation is +//: what makes RSA work. +//: +//: So let's derive a public/private RSA keypair out of these two primes: +//: +//: (Note though that in a real RSA cryptosystem, primes are chosen much more carefully.) +let phi = (p - 1) * (q - 1) +let e: BigUInt = 65537 +let d = e.inverse(phi)! + +d * e % phi + +typealias Key = (modulus: BigUInt, exponent: BigUInt) + +let publicKey: Key = (n, e) +let privateKey: Key = (n, d) +//: Given a key and a message, encryption is simply a modular exponentiation: +//: (Again, this is an oversimplification. In the real RSA system, the message is first transformed by a +//: [complex padding scheme][oaep].) +//: +//: [oaep]: https://en.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding +func encrypt(_ message: BigUInt, key: Key) -> BigUInt { + return message.power(key.exponent, modulus: key.modulus) +} +//: Let's try encrypting some message with the public key. +let secret: BigUInt = BigUInt("Arbitrary precision arithmetic is fun!".data(using: .utf8)!) + +let cyphertext = encrypt(secret, key: publicKey) +//: Well that was easy. In theory, we can decrypt the cyphertext by simply encrypting it with the private key. +//: But does it really work? Yep: +let plaintext = encrypt(cyphertext, key: privateKey) + +let message = String(data: plaintext.serialize(), encoding: .utf8) +//: Isn't that awesome? +//: +//: [Next](@next) diff --git a/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/timeline.xctimeline b/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 00000000..24b864d1 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/Pages/The RSA algorithm.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/BigInt/Demo.playground/contents.xcplayground b/Carthage/Checkouts/BigInt/Demo.playground/contents.xcplayground new file mode 100644 index 00000000..5a1e6af0 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Demo.playground/contents.xcplayground @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/LICENSE.md b/Carthage/Checkouts/BigInt/LICENSE.md new file mode 100644 index 00000000..18cefd11 --- /dev/null +++ b/Carthage/Checkouts/BigInt/LICENSE.md @@ -0,0 +1,20 @@ + +Copyright (c) 2016-2017 Károly Lőrentey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Carthage/Checkouts/BigInt/Package.swift b/Carthage/Checkouts/BigInt/Package.swift new file mode 100644 index 00000000..7bc0b977 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Package.swift @@ -0,0 +1,21 @@ +// swift-tools-version:5.0 +// +// Package.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-12. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import PackageDescription + +let package = Package( + name: "BigInt", + products: [ + .library(name: "BigInt", targets: ["BigInt"]) + ], + targets: [ + .target(name: "BigInt", path: "Sources"), + .testTarget(name: "BigIntTests", dependencies: ["BigInt"], path: "Tests") + ] +) diff --git a/Carthage/Checkouts/BigInt/README.md b/Carthage/Checkouts/BigInt/README.md new file mode 100644 index 00000000..66061769 --- /dev/null +++ b/Carthage/Checkouts/BigInt/README.md @@ -0,0 +1,431 @@ +[![BigInt](https://github.com/attaswift/BigInt/raw/master/images/banner.png)](https://github.com/attaswift/BigInt) + +* [Overview](#overview) +* [API Documentation](#api) +* [License](#license) +* [Requirements and Integration](#integration) +* [Implementation Notes](#notes) + * [Full-width multiplication and division primitives](#fullwidth) + * [Why is there no generic `BigInt` type?](#generics) +* [Calculation Samples](#samples) + * [Obligatory factorial demo](#factorial) + * [RSA Cryptography](#rsa) + * [Calculating the Digits of π](#pi) + +[![Swift 5](https://img.shields.io/badge/Swift-5-blue.svg)](https://developer.apple.com/swift/) +[![License](https://img.shields.io/badge/licence-MIT-blue.svg)](http://cocoapods.org/pods/BigInt) +[![Platform](https://img.shields.io/cocoapods/p/BigInt.svg)](http://cocoapods.org/pods/BigInt) + +![Build Status](https://github.com/attaswift/BigInt/workflows/Swift/badge.svg?branch=master) +[![Code Coverage](https://codecov.io/github/attaswift/BigInt/coverage.svg?branch=master)](https://codecov.io/github/attaswift/BigInt?branch=master) +[![jazzy](https://raw.githubusercontent.com/attaswift/BigInt/master/docs/badge.svg)](https://attaswift.github.io/BigInt/) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg)](https://github.com/Carthage/Carthage) +[![Version](https://img.shields.io/cocoapods/v/BigInt.svg)](http://cocoapods.org/pods/BigInt) + +## Overview + +This repository provides [integer types of arbitrary width][wiki] implemented +in 100% pure Swift. The underlying representation is in base 2^64, using `Array`. + +[wiki]: https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic + +This module is handy when you need an integer type that's wider than `UIntMax`, but +you don't want to add [The GNU Multiple Precision Arithmetic Library][GMP] +as a dependency. + +[GMP]: https://gmplib.org + +Two big integer types are included: [`BigUInt`][BigUInt] and [`BigInt`][BigInt], +the latter being the signed variant. +Both of these are Swift structs with copy-on-write value semantics, and they can be used much +like any other integer type. + +The library provides implementations for some of the most frequently useful functions on +big integers, including + +- All functionality from [`Comparable`][comparison] and [`Hashable`][hashing] + +- [The full set of arithmetic operators][addition]: `+`, `-`, `*`, `/`, `%`, `+=`, `-=`, `*=`, `/=`, `%=` + - [Addition][addition] and [subtraction][subtraction] have variants that allow for + shifting the digits of the second operand on the fly. + - Unsigned subtraction will trap when the result would be negative. + ([There are variants][subtraction] that return an overflow flag.) + - [Multiplication][mul] uses brute force for numbers up to 1024 digits, then switches to Karatsuba's recursive method. + (This limit is configurable, see `BigUInt.directMultiplicationLimit`.) + - A [fused multiply-add][fused] method is also available, along with other [special-case variants][multiplication]. + - [Division][division] uses Knuth's Algorithm D, with its 3/2 digits wide quotient approximation. + It will trap when the divisor is zero. + - [`BigUInt.divide`][divide] returns the quotient and + remainder at once; this is faster than calculating them separately. + +- [Bitwise operators][bitwise]: `~`, `|`, `&`, `^`, `|=`, `&=`, `^=`, plus the following read-only properties: + - [`width`][width]: the minimum number of bits required to store the integer, + - [`trailingZeroBitCount`][trailingZeroBitCount]: the number of trailing zero bits in the binary representation, + - [`leadingZeroBitCount`][leadingZeroBitCount]: the number of leading zero bits (when the last digit isn't full), + +- [Shift operators][shift]: `>>`, `<<`, `>>=`, `<<=` + +- Methods to [convert `NSData` to big integers][data] and vice versa. + +- Support for [generating random integers][random] of specified maximum width or magnitude. + +- Radix conversion to/from [`String`s][radix1] and [big integers][radix2] up to base 36 (using repeated divisions). + - Big integers use this to implement `StringLiteralConvertible` (in base 10). + +- [`sqrt(n)`][sqrt]: The square root of an integer (using Newton's method). + +- [`BigUInt.gcd(n, m)`][GCD]: The greatest common divisor of two integers (Stein's algorithm). + +- [`base.power(exponent, modulus)`][powmod]: Modular exponentiation (right-to-left binary method). + [Vanilla exponentiation][power] is also available. +- [`n.inverse(modulus)`][inverse]: Multiplicative inverse in modulo arithmetic (extended Euclidean algorithm). +- [`n.isPrime()`][prime]: Miller–Rabin primality test. + +The implementations are intended to be reasonably efficient, but they are unlikely to be +competitive with GMP at all, even when I happened to implement an algorithm with same asymptotic +behavior as GMP. (I haven't performed a comparison benchmark, though.) + +The library has 100% unit test coverage. Sadly this does not imply that there are no bugs +in it. + +## API Documentation + +Generated API docs are available at https://attaswift.github.io/BigInt/. + +## License + +BigInt can be used, distributed and modified under [the MIT license][license]. + +## Requirements and Integration + +BigInt 4.0.0 requires Swift 4.2 (The last version with support for Swift 3.x was BigInt 2.1.0. +The last version with support for Swift 2 was BigInt 1.3.0.) + +| Swift Version | last BigInt Version| +| ------------- |:-------------------| +| 3.x | 2.1.0 | +| 4.0 | 3.1.0 | +| 4.2 | 4.0.0 | +| 5.x | 5.3.0 | + +BigInt deploys to macOS 10.10, iOS 9, watchOS 2 and tvOS 9. +It has been tested on the latest OS releases only---however, as the module uses very few platform-provided APIs, +there should be very few issues with earlier versions. + +BigInt uses no APIs specific to Apple platforms, so +it should be easy to port it to other operating systems. + +Setup instructions: + +- **Swift Package Manager:** + Although the Package Manager is still in its infancy, BigInt provides experimental support for it. + Add this to the dependency section of your `Package.swift` manifest: + + ```Swift + .package(url: "https://github.com/attaswift/BigInt.git", from: "5.3.0") + ``` + +- **CocoaPods:** Put this in your `Podfile`: + + ```Ruby + pod 'BigInt', '~> 5.3' + ``` + +- **Carthage:** Put this in your `Cartfile`: + + ``` + github "attaswift/BigInt" ~> 5.3 + ``` + +## Implementation notes + +[`BigUInt`][BigUInt] is a `MutableCollectionType` of its 64-bit digits, with the least significant +digit at index 0. As a convenience, [`BigUInt`][BigUInt] allows you to subscript it with indexes at +or above its `count`. [The subscript operator][subscript] returns 0 for out-of-bound `get`s and +automatically extends the array on out-of-bound `set`s. This makes memory management simpler. + +[`BigInt`][BigInt] is just a tiny wrapper around a `BigUInt` [absolute value][magnitude] and a +[sign bit][negative], both of which are accessible as public read-write properties. + +### Why is there no generic `BigInt` type? + +The types provided by `BigInt` are not parametric—this is very much intentional, as +Swift generics cost us dearly at runtime in this use case. In every approach I tried, +making arbitrary-precision arithmetic operations work with a generic `Digit` type parameter +resulted in code that was literally *ten times slower*. If you can make the algorithms generic +without such a huge performance hit, [please enlighten me][twitter]! + +This is an area that I plan to investigate more, as it would be useful to have generic +implementations for arbitrary-width arithmetic operations. (Polynomial division and decimal bases +are two examples.) The library already implements double-digit multiplication and division as +extension methods on a protocol with an associated type requirement; this has not measurably affected +performance. Unfortunately, the same is not true for `BigUInt`'s methods. + +Of course, as a last resort, we could just duplicate the code to create a separate +generic variant that was slower but more flexible. + +[license]: https://github.com/attaswift/BigInt/blob/master/LICENSE.md +[twitter]: https://twitter.com/lorentey +[BigUInt]: http://attaswift.github.io/BigInt/Structs/BigUInt.html +[BigInt]: http://attaswift.github.io/BigInt/Structs/BigInt.html +[comparison]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Comparison +[hashing]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Hashing +[addition]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Addition +[subtraction]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Subtraction +[mul]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:ZFV6BigInt7BigUIntoi1mFTS0_S0__S0_ +[fused]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUInt14multiplyAndAddFTS0_Vs6UInt6410atPositionSi_T_ +[multiplication]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Multiplication +[division]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Division +[divide]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUInt7dividedFT2byS0__T8quotientS0_9remainderS0__ +[bitwise]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Bitwise%20Operations +[width]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:vV6BigInt7BigUInt5widthSi +[leadingZeroBitCount]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:vV6BigInt7BigUInt13leadingZeroBitCountSi +[trailingZeroBitCount]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:vV6BigInt7BigUInt14trailingZeroBitCountSi +[shift]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Shift%20Operators +[data]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/NSData%20Conversion +[random]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Random%20Integers +[radix1]: http://attaswift.github.io/BigInt/Extensions/String.html#/s:FE6BigIntSScFTVS_7BigUInt5radixSi9uppercaseSb_SS +[radix2]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUIntcFTSS5radixSi_GSqS0__ +[sqrt]: http://attaswift.github.io/BigInt/Functions.html#/s:F6BigInt4sqrtFVS_7BigUIntS0_ +[GCD]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:ZFV6BigInt7BigUInt3gcdFTS0_S0__S0_ +[powmod]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUInt5powerFTS0_7modulusS0__S0_ +[power]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUInt5powerFSiS0_ +[inverse]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/s:FV6BigInt7BigUInt7inverseFS0_GSqS0__ +[prime]: http://attaswift.github.io/BigInt/Structs/BigUInt.html#/Primality%20Testing +[abs]: http://attaswift.github.io/BigInt/Structs/BigInt.html#/s:vV6BigInt6BigInt3absVS_7BigUInt +[negative]: http://attaswift.github.io/BigInt/Structs/BigInt.html#/s:vV6BigInt6BigInt8negativeSb +[subscript]: https://github.com/attaswift/BigInt/blob/v2.0.0/Sources/BigUInt.swift#L216-L239 +[fullmuldiv]: https://github.com/attaswift/BigInt/blob/v2.0.0/Sources/BigDigit.swift#L96-L167 + + +## Calculation Samples + +### Obligatory Factorial Demo + +It is easy to use `BigInt` to calculate the factorial function for any integer: + +```Swift +import BigInt + +func factorial(_ n: Int) -> BigInt { + return (1 ... n).map { BigInt($0) }.reduce(BigInt(1), *) +} + +print(factorial(10)) +==> 362880 + +print(factorial(100)) +==> 93326215443944152681699238856266700490715968264381621468592963895217599993229915 + 6089414639761565182862536979208272237582511852109168640000000000000000000000 + +print(factorial(1000)) +==> 40238726007709377354370243392300398571937486421071463254379991042993851239862902 + 05920442084869694048004799886101971960586316668729948085589013238296699445909974 + 24504087073759918823627727188732519779505950995276120874975462497043601418278094 + 64649629105639388743788648733711918104582578364784997701247663288983595573543251 + 31853239584630755574091142624174743493475534286465766116677973966688202912073791 + 43853719588249808126867838374559731746136085379534524221586593201928090878297308 + 43139284440328123155861103697680135730421616874760967587134831202547858932076716 + 91324484262361314125087802080002616831510273418279777047846358681701643650241536 + 91398281264810213092761244896359928705114964975419909342221566832572080821333186 + 11681155361583654698404670897560290095053761647584772842188967964624494516076535 + 34081989013854424879849599533191017233555566021394503997362807501378376153071277 + 61926849034352625200015888535147331611702103968175921510907788019393178114194545 + 25722386554146106289218796022383897147608850627686296714667469756291123408243920 + 81601537808898939645182632436716167621791689097799119037540312746222899880051954 + 44414282012187361745992642956581746628302955570299024324153181617210465832036786 + 90611726015878352075151628422554026517048330422614397428693306169089796848259012 + 54583271682264580665267699586526822728070757813918581788896522081643483448259932 + 66043367660176999612831860788386150279465955131156552036093988180612138558600301 + 43569452722420634463179746059468257310379008402443243846565724501440282188525247 + 09351906209290231364932734975655139587205596542287497740114133469627154228458623 + 77387538230483865688976461927383814900140767310446640259899490222221765904339901 + 88601856652648506179970235619389701786004081188972991831102117122984590164192106 + 88843871218556461249607987229085192968193723886426148396573822911231250241866493 + 53143970137428531926649875337218940694281434118520158014123344828015051399694290 + 15348307764456909907315243327828826986460278986432113908350621709500259738986355 + 42771967428222487575867657523442202075736305694988250879689281627538488633969099 + 59826280956121450994871701244516461260379029309120889086942028510640182154399457 + 15680594187274899809425474217358240106367740459574178516082923013535808184009699 + 63725242305608559037006242712434169090041536901059339838357779394109700277534720 + 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 00000 +``` + +Well, I guess that's all right, but it's not very interesting. Let's try something more useful. + +### RSA Cryptography + +The `BigInt` module provides all necessary parts to implement an (overly) +simple [RSA cryptography system][RSA]. + +[RSA]: https://en.wikipedia.org/wiki/RSA_(cryptosystem) + +Let's start with a simple function that generates a random n-bit prime. The module +includes a function to generate random integers of a specific size, and also an +`isPrime` method that performs the Miller–Rabin primality test. These are all we need: + +```Swift +func generatePrime(_ width: Int) -> BigUInt { + while true { + var random = BigUInt.randomInteger(withExactWidth: width) + random |= BigUInt(1) + if random.isPrime() { + return random + } + } +} + +let p = generatePrime(1024) +==> 13308187650642192396256419911012544845370493728424936791561478318443071617242872 + 81980956747087187419914435169914161116601678883358611076800743580556055714173922 + 08406194264346635072293912609713085260354070700055888678514690878149253177960273 + 775659537560220378850112471985434373425534121373466492101182463962031 + +let q = generatePrime(1024) +==> 17072954422657145489547308812333368925007949054501204983863958355897172093173783 + 10108226596943999553784252564650624766276133157586733504784616138305701168410157 + 80784336308507083874651158029602582993233111593356512531869546706885170044355115 + 669728424124141763799008880327106952436883614887277350838425336156327 +``` + +Cool! Now that we have two large primes, we can produce an RSA public/private keypair +out of them. + +```Swift +typealias Key = (modulus: BigUInt, exponent: BigUInt) + +let n = p * q +==> 22721008120758282530010953362926306641542233757318103044313144976976529789946696 + 15454966720907712515917481418981591379647635391260569349099666410127279690367978 + 81184375533755888994370640857883754985364288413796100527262763202679037134021810 + 57933883525572232242690805678883227791774442041516929419640051653934584376704034 + 63953169772816907280591934423237977258358097846511079947337857778137177570668391 + 57455417707100275487770399281417352829897118140972240757708561027087217205975220 + 02207275447810167397968435583004676293892340103729490987263776871467057582629588 + 916498579594964478080508868267360515953225283461208420137 + +let e: BigUInt = 65537 +let phi = (p - 1) * (q - 1) +let d = e.inverse(phi)! // d * e % phi == 1 +==> 13964664343869014759736350480776837992604500903989703383202366291905558996277719 + 77822086142456362972689566985925179681282432115598451765899180050962461295573831 + 37069237934291884106584820998146965085531433195106686745474222222620986858696591 + 69836532468835154412554521152103642453158895363417640676611704542784576974374954 + 45789456921660619938185093118762690200980720312508614337759620606992462563490422 + 76669559556568917533268479190948959560397579572761529852891246283539604545691244 + 89999692877158676643042118662613875863504016129837099223040687512684532694527109 + 80742873307409704484365002175294665608486688146261327793 + +let publicKey: Key = (n, e) +let privateKey: Key = (n, d) +``` + +In RSA, modular exponentiation is used to encrypt (and decrypt) messages. + +```Swift +func encrypt(_ message: BigUInt, key: Key) -> BigUInt { + return message.power(key.exponent, modulus: key.modulus) +} +``` + +Let's try out our new keypair by converting a string into UTF-8, interpreting +the resulting binary representation as a big integer, and encrypting it with the +public key. `BigUInt` has an initializer that takes an `NSData`, so this is pretty +easy to do: + +```Swift +let secret: BigUInt = BigUInt("Arbitrary precision arithmetic is fun!".dataUsingEncoding(NSUTF8StringEncoding)!) +==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457 + 68818568737 + +let cyphertext = encrypt(secret, key: publicKey) +==> 95186982543485985200666516508066093880038842892337880561554910904277290917831453 + 54854954722744805432145474047391353716305176389470779020645959135298322520888633 + 61674945129099575943384767330342554525120384485469428048962027149169876127890306 + 77028183904699491962050888974524603226290836984166164759586952419343589385279641 + 47999991283152843977988979846238236160274201261075188190509539751990119132013021 + 74866638595734222867005089157198503204192264814750832072844208520394603054901706 + 06024394731371973402595826456435944968439153664617188570808940022471990638468783 + 49208193955207336172861151720299024935127021719852700882 +``` + +Well, it looks encrypted all right, but can we get the original message back? +In theory, encrypting the cyphertext with the private key returns the original message. +Let's see: + +```Swift +let plaintext = encrypt(cyphertext, key: privateKey) +==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457 + 68818568737 + +let received = String(data: plaintext.serialize(), encoding: NSUTF8StringEncoding) +==> "Arbitrary precision arithmetic is fun!" +``` + +Yay! This is truly terrific, but please don't use this example code in an actual +cryptography system. RSA has lots of subtle (and some not so subtle) complications +that we ignored to keep this example short. + +### Calculating the Digits of π + +Another fun activity to try with `BigInt`s is to generate the digits of π. +Let's try implementing [Jeremy Gibbon's spigot algorithm][spigot]. +This is a rather slow algorithm as π-generators go, but it makes up for it with its grooviness +factor: it's remarkably short, it only uses (big) integer arithmetic, and every iteration +produces a single new digit in the base-10 representation of π. This naturally leads to an +implementation as an infinite `GeneratorType`: + +[spigot]: http://www.cs.ox.ac.uk/jeremy.gibbons/publications/spigot.pdf + +```Swift +func digitsOfPi() -> AnyGenerator { + var q: BigUInt = 1 + var r: BigUInt = 180 + var t: BigUInt = 60 + var i: UInt64 = 2 // Does not overflow until digit #826_566_842 + return AnyIterator { + let u: UInt64 = 3 * (3 * i + 1) * (3 * i + 2) + let y = (q.multiplied(byDigit: 27 * i - 12) + 5 * r) / (5 * t) + (q, r, t) = ( + 10 * q.multiplied(byDigit: i * (2 * i - 1)), + 10 * (q.multiplied(byDigit: 5 * i - 2) + r - y * t).multiplied(byDigit: u), + t.multiplied(byDigit: u)) + i += 1 + return Int(y[0]) + } +} +``` + +Well, that was surprisingly easy. But does it work? Of course it does! + +```Swift +var digits = "π ≈ " +var count = 0 +for digit in digitsOfPi() { + assert(digit < 10) + digits += String(digit) + count += 1 + if count == 1 { digits += "." } + if count == 1000 { break } +} + +digits +==> π ≈ 3.14159265358979323846264338327950288419716939937510582097494459230781640628 + 62089986280348253421170679821480865132823066470938446095505822317253594081284811 + 17450284102701938521105559644622948954930381964428810975665933446128475648233786 + 78316527120190914564856692346034861045432664821339360726024914127372458700660631 + 55881748815209209628292540917153643678925903600113305305488204665213841469519415 + 11609433057270365759591953092186117381932611793105118548074462379962749567351885 + 75272489122793818301194912983367336244065664308602139494639522473719070217986094 + 37027705392171762931767523846748184676694051320005681271452635608277857713427577 + 89609173637178721468440901224953430146549585371050792279689258923542019956112129 + 02196086403441815981362977477130996051870721134999999837297804995105973173281609 + 63185950244594553469083026425223082533446850352619311881710100031378387528865875 + 33208381420617177669147303598253490428755468731159562863882353787593751957781857 + 780532171226806613001927876611195909216420198 +``` + +Now go and have some fun with big integers on your own! diff --git a/Carthage/Checkouts/BigInt/Sources/Addition.swift b/Carthage/Checkouts/BigInt/Sources/Addition.swift new file mode 100644 index 00000000..34f4d44e --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Addition.swift @@ -0,0 +1,126 @@ +// +// Addition.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + //MARK: Addition + + /// Add `word` to this integer in place. + /// `word` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, shift)) + internal mutating func addWord(_ word: Word, shiftedBy shift: Int = 0) { + precondition(shift >= 0) + var carry = word + var i = shift + while carry > 0 { + let (d, c) = self[i].addingReportingOverflow(carry) + self[i] = d + carry = (c ? 1 : 0) + i += 1 + } + } + + /// Add the digit `d` to this integer and return the result. + /// `d` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, shift)) + internal func addingWord(_ word: Word, shiftedBy shift: Int = 0) -> BigUInt { + var r = self + r.addWord(word, shiftedBy: shift) + return r + } + + /// Add `b` to this integer in place. + /// `b` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, b.count + shift)) + internal mutating func add(_ b: BigUInt, shiftedBy shift: Int = 0) { + precondition(shift >= 0) + var carry = false + var bi = 0 + let bc = b.count + while bi < bc || carry { + let ai = shift + bi + let (d, c) = self[ai].addingReportingOverflow(b[bi]) + if carry { + let (d2, c2) = d.addingReportingOverflow(1) + self[ai] = d2 + carry = c || c2 + } + else { + self[ai] = d + carry = c + } + bi += 1 + } + } + + /// Add `b` to this integer and return the result. + /// `b` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, b.count + shift)) + internal func adding(_ b: BigUInt, shiftedBy shift: Int = 0) -> BigUInt { + var r = self + r.add(b, shiftedBy: shift) + return r + } + + /// Increment this integer by one. If `shift` is non-zero, it selects + /// the word that is to be incremented. + /// + /// - Complexity: O(count + shift) + internal mutating func increment(shiftedBy shift: Int = 0) { + self.addWord(1, shiftedBy: shift) + } + + /// Add `a` and `b` together and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func +(a: BigUInt, b: BigUInt) -> BigUInt { + return a.adding(b) + } + + /// Add `a` and `b` together, and store the sum in `a`. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func +=(a: inout BigUInt, b: BigUInt) { + a.add(b, shiftedBy: 0) + } +} + +extension BigInt { + /// Add `a` to `b` and return the result. + public static func +(a: BigInt, b: BigInt) -> BigInt { + switch (a.sign, b.sign) { + case (.plus, .plus): + return BigInt(sign: .plus, magnitude: a.magnitude + b.magnitude) + case (.minus, .minus): + return BigInt(sign: .minus, magnitude: a.magnitude + b.magnitude) + case (.plus, .minus): + if a.magnitude >= b.magnitude { + return BigInt(sign: .plus, magnitude: a.magnitude - b.magnitude) + } + else { + return BigInt(sign: .minus, magnitude: b.magnitude - a.magnitude) + } + case (.minus, .plus): + if b.magnitude >= a.magnitude { + return BigInt(sign: .plus, magnitude: b.magnitude - a.magnitude) + } + else { + return BigInt(sign: .minus, magnitude: a.magnitude - b.magnitude) + } + } + } + + /// Add `b` to `a` in place. + public static func +=(a: inout BigInt, b: BigInt) { + a = a + b + } +} + diff --git a/Carthage/Checkouts/BigInt/Sources/BigInt.swift b/Carthage/Checkouts/BigInt/Sources/BigInt.swift new file mode 100644 index 00000000..8119bad5 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/BigInt.swift @@ -0,0 +1,74 @@ +// +// BigInt.swift +// BigInt +// +// Created by Károly Lőrentey on 2015-12-27. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: BigInt + +/// An arbitary precision signed integer type, also known as a "big integer". +/// +/// Operations on big integers never overflow, but they might take a long time to execute. +/// The amount of memory (and address space) available is the only constraint to the magnitude of these numbers. +/// +/// This particular big integer type uses base-2^64 digits to represent integers. +/// +/// `BigInt` is essentially a tiny wrapper that extends `BigUInt` with a sign bit and provides signed integer +/// operations. Both the underlying absolute value and the negative/positive flag are available as read-write +/// properties. +/// +/// Not all algorithms of `BigUInt` are available for `BigInt` values; for example, there is no square root or +/// primality test for signed integers. When you need to call one of these, just extract the absolute value: +/// +/// ```Swift +/// BigInt(255).magnitude.isPrime() // Returns false +/// ``` +/// +public struct BigInt: SignedInteger { + public enum Sign { + case plus + case minus + } + + public typealias Magnitude = BigUInt + + /// The type representing a digit in `BigInt`'s underlying number system. + public typealias Word = BigUInt.Word + + public static var isSigned: Bool { + return true + } + + /// The absolute value of this integer. + public var magnitude: BigUInt + + /// True iff the value of this integer is negative. + public var sign: Sign + + /// Initializes a new big integer with the provided absolute number and sign flag. + public init(sign: Sign, magnitude: BigUInt) { + self.sign = (magnitude.isZero ? .plus : sign) + self.magnitude = magnitude + } + + /// Return true iff this integer is zero. + /// + /// - Complexity: O(1) + public var isZero: Bool { + return magnitude.isZero + } + + /// Returns `-1` if this value is negative and `1` if it’s positive; otherwise, `0`. + /// + /// - Returns: The sign of this number, expressed as an integer of the same type. + public func signum() -> BigInt { + switch sign { + case .plus: + return isZero ? 0 : 1 + case .minus: + return -1 + } + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/BigUInt.swift b/Carthage/Checkouts/BigInt/Sources/BigUInt.swift new file mode 100644 index 00000000..759f2aa7 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/BigUInt.swift @@ -0,0 +1,386 @@ +// +// BigUInt.swift +// BigInt +// +// Created by Károly Lőrentey on 2015-12-26. +// Copyright © 2016-2017 Károly Lőrentey. +// + +/// An arbitary precision unsigned integer type, also known as a "big integer". +/// +/// Operations on big integers never overflow, but they may take a long time to execute. +/// The amount of memory (and address space) available is the only constraint to the magnitude of these numbers. +/// +/// This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper +/// around `Array`. (In fact, `BigUInt` only uses an array if there are more than two digits.) +public struct BigUInt: UnsignedInteger { + /// The type representing a digit in `BigUInt`'s underlying number system. + public typealias Word = UInt + + /// The storage variants of a `BigUInt`. + enum Kind { + /// Value consists of the two specified words (low and high). Either or both words may be zero. + case inline(Word, Word) + /// Words are stored in a slice of the storage array. + case slice(from: Int, to: Int) + /// Words are stored in the storage array. + case array + } + + internal fileprivate (set) var kind: Kind // Internal for testing only + internal fileprivate (set) var storage: [Word] // Internal for testing only; stored separately to prevent COW copies + + /// Initializes a new BigUInt with value 0. + public init() { + self.kind = .inline(0, 0) + self.storage = [] + } + + internal init(word: Word) { + self.kind = .inline(word, 0) + self.storage = [] + } + + internal init(low: Word, high: Word) { + self.kind = .inline(low, high) + self.storage = [] + } + + /// Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant. + public init(words: [Word]) { + self.kind = .array + self.storage = words + normalize() + } + + internal init(words: [Word], from startIndex: Int, to endIndex: Int) { + self.kind = .slice(from: startIndex, to: endIndex) + self.storage = words + normalize() + } +} + +extension BigUInt { + public static var isSigned: Bool { + return false + } + + /// Return true iff this integer is zero. + /// + /// - Complexity: O(1) + public var isZero: Bool { + switch kind { + case .inline(0, 0): return true + case .array: return storage.isEmpty + default: + return false + } + } + + /// Returns `1` if this value is, positive; otherwise, `0`. + /// + /// - Returns: The sign of this number, expressed as an integer of the same type. + public func signum() -> BigUInt { + return isZero ? 0 : 1 + } +} + +extension BigUInt { + mutating func ensureArray() { + switch kind { + case let .inline(w0, w1): + kind = .array + storage = w1 != 0 ? [w0, w1] + : w0 != 0 ? [w0] + : [] + case let .slice(from: start, to: end): + kind = .array + storage = Array(storage[start ..< end]) + case .array: + break + } + } + + var capacity: Int { + guard case .array = kind else { return 0 } + return storage.capacity + } + + mutating func reserveCapacity(_ minimumCapacity: Int) { + switch kind { + case let .inline(w0, w1): + kind = .array + storage.reserveCapacity(minimumCapacity) + if w1 != 0 { + storage.append(w0) + storage.append(w1) + } + else if w0 != 0 { + storage.append(w0) + } + case let .slice(from: start, to: end): + kind = .array + var words: [Word] = [] + words.reserveCapacity(Swift.max(end - start, minimumCapacity)) + words.append(contentsOf: storage[start ..< end]) + storage = words + case .array: + storage.reserveCapacity(minimumCapacity) + } + } + + /// Gets rid of leading zero digits in the digit array and converts slices into inline digits when possible. + internal mutating func normalize() { + switch kind { + case .slice(from: let start, to: var end): + assert(start >= 0 && end <= storage.count && start <= end) + while start < end, storage[end - 1] == 0 { + end -= 1 + } + switch end - start { + case 0: + kind = .inline(0, 0) + storage = [] + case 1: + kind = .inline(storage[start], 0) + storage = [] + case 2: + kind = .inline(storage[start], storage[start + 1]) + storage = [] + case storage.count: + assert(start == 0) + kind = .array + default: + kind = .slice(from: start, to: end) + } + case .array where storage.last == 0: + while storage.last == 0 { + storage.removeLast() + } + default: + break + } + } + + /// Set this integer to 0 without releasing allocated storage capacity (if any). + mutating func clear() { + self.load(0) + } + + /// Set this integer to `value` by copying its digits without releasing allocated storage capacity (if any). + mutating func load(_ value: BigUInt) { + switch kind { + case .inline, .slice: + self = value + case .array: + self.storage.removeAll(keepingCapacity: true) + self.storage.append(contentsOf: value.words) + } + } +} + +extension BigUInt { + //MARK: Collection-like members + + /// The number of digits in this integer, excluding leading zero digits. + var count: Int { + switch kind { + case let .inline(w0, w1): + return w1 != 0 ? 2 + : w0 != 0 ? 1 + : 0 + case let .slice(from: start, to: end): + return end - start + case .array: + return storage.count + } + } + + /// Get or set a digit at a given index. + /// + /// - Note: Unlike a normal collection, it is OK for the index to be greater than or equal to `endIndex`. + /// The subscripting getter returns zero for indexes beyond the most significant digit. + /// Setting these extended digits automatically appends new elements to the underlying digit array. + /// - Requires: index >= 0 + /// - Complexity: The getter is O(1). The setter is O(1) if the conditions below are true; otherwise it's O(count). + /// - The integer's storage is not shared with another integer + /// - The integer wasn't created as a slice of another integer + /// - `index < count` + subscript(_ index: Int) -> Word { + get { + precondition(index >= 0) + switch (kind, index) { + case (.inline(let w0, _), 0): return w0 + case (.inline(_, let w1), 1): return w1 + case (.slice(from: let start, to: let end), _) where index < end - start: + return storage[start + index] + case (.array, _) where index < storage.count: + return storage[index] + default: + return 0 + } + } + set(word) { + precondition(index >= 0) + switch (kind, index) { + case let (.inline(_, w1), 0): + kind = .inline(word, w1) + case let (.inline(w0, _), 1): + kind = .inline(w0, word) + case let (.slice(from: start, to: end), _) where index < end - start: + replace(at: index, with: word) + case (.array, _) where index < storage.count: + replace(at: index, with: word) + default: + extend(at: index, with: word) + } + } + } + + private mutating func replace(at index: Int, with word: Word) { + ensureArray() + precondition(index < storage.count) + storage[index] = word + if word == 0, index == storage.count - 1 { + normalize() + } + } + + private mutating func extend(at index: Int, with word: Word) { + guard word != 0 else { return } + reserveCapacity(index + 1) + precondition(index >= storage.count) + storage.append(contentsOf: repeatElement(0, count: index - storage.count)) + storage.append(word) + } + + /// Returns an integer built from the digits of this integer in the given range. + internal func extract(_ bounds: Range) -> BigUInt { + switch kind { + case let .inline(w0, w1): + let bounds = bounds.clamped(to: 0 ..< 2) + if bounds == 0 ..< 2 { + return BigUInt(low: w0, high: w1) + } + else if bounds == 0 ..< 1 { + return BigUInt(word: w0) + } + else if bounds == 1 ..< 2 { + return BigUInt(word: w1) + } + else { + return BigUInt() + } + case let .slice(from: start, to: end): + let s = Swift.min(end, start + Swift.max(bounds.lowerBound, 0)) + let e = Swift.max(s, (bounds.upperBound > end - start ? end : start + bounds.upperBound)) + return BigUInt(words: storage, from: s, to: e) + case .array: + let b = bounds.clamped(to: storage.startIndex ..< storage.endIndex) + return BigUInt(words: storage, from: b.lowerBound, to: b.upperBound) + } + } + + internal func extract(_ bounds: Bounds) -> BigUInt where Bounds.Bound == Int { + return self.extract(bounds.relative(to: 0 ..< Int.max)) + } +} + +extension BigUInt { + internal mutating func shiftRight(byWords amount: Int) { + assert(amount >= 0) + guard amount > 0 else { return } + switch kind { + case let .inline(_, w1) where amount == 1: + kind = .inline(w1, 0) + case .inline(_, _): + kind = .inline(0, 0) + case let .slice(from: start, to: end): + let s = start + amount + if s >= end { + kind = .inline(0, 0) + } + else { + kind = .slice(from: s, to: end) + normalize() + } + case .array: + if amount >= storage.count { + storage.removeAll(keepingCapacity: true) + } + else { + storage.removeFirst(amount) + } + } + } + + internal mutating func shiftLeft(byWords amount: Int) { + assert(amount >= 0) + guard amount > 0 else { return } + guard !isZero else { return } + switch kind { + case let .inline(w0, 0) where amount == 1: + kind = .inline(0, w0) + case let .inline(w0, w1): + let c = (w1 == 0 ? 1 : 2) + storage.reserveCapacity(amount + c) + storage.append(contentsOf: repeatElement(0, count: amount)) + storage.append(w0) + if w1 != 0 { + storage.append(w1) + } + kind = .array + case let .slice(from: start, to: end): + var words: [Word] = [] + words.reserveCapacity(amount + count) + words.append(contentsOf: repeatElement(0, count: amount)) + words.append(contentsOf: storage[start ..< end]) + storage = words + kind = .array + case .array: + storage.insert(contentsOf: repeatElement(0, count: amount), at: 0) + } + } +} + +extension BigUInt { + //MARK: Low and High + + /// Split this integer into a high-order and a low-order part. + /// + /// - Requires: count > 1 + /// - Returns: `(low, high)` such that + /// - `self == low.add(high, shiftedBy: middleIndex)` + /// - `high.width <= floor(width / 2)` + /// - `low.width <= ceil(width / 2)` + /// - Complexity: Typically O(1), but O(count) in the worst case, because high-order zero digits need to be removed after the split. + internal var split: (high: BigUInt, low: BigUInt) { + precondition(count > 1) + let mid = middleIndex + return (self.extract(mid...), self.extract(.. 1 + internal var low: BigUInt { + return self.extract(0 ..< middleIndex) + } + + /// The high-order half of this BigUInt. + /// + /// - Returns: `self[middleIndex ..< count]` + /// - Requires: count > 1 + internal var high: BigUInt { + return self.extract(middleIndex ..< count) + } +} + diff --git a/Carthage/Checkouts/BigInt/Sources/Bitwise Ops.swift b/Carthage/Checkouts/BigInt/Sources/Bitwise Ops.swift new file mode 100644 index 00000000..0d00148b --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Bitwise Ops.swift @@ -0,0 +1,121 @@ +// +// Bitwise Ops.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Bitwise Operations + +extension BigUInt { + /// Return the ones' complement of `a`. + /// + /// - Complexity: O(a.count) + public static prefix func ~(a: BigUInt) -> BigUInt { + return BigUInt(words: a.words.map { ~$0 }) + } + + /// Calculate the bitwise OR of `a` and `b`, and store the result in `a`. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func |= (a: inout BigUInt, b: BigUInt) { + a.reserveCapacity(b.count) + for i in 0 ..< b.count { + a[i] |= b[i] + } + } + + /// Calculate the bitwise AND of `a` and `b` and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func &= (a: inout BigUInt, b: BigUInt) { + for i in 0 ..< Swift.max(a.count, b.count) { + a[i] &= b[i] + } + } + + /// Calculate the bitwise XOR of `a` and `b` and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func ^= (a: inout BigUInt, b: BigUInt) { + a.reserveCapacity(b.count) + for i in 0 ..< b.count { + a[i] ^= b[i] + } + } +} + +extension BigInt { + public static prefix func ~(x: BigInt) -> BigInt { + switch x.sign { + case .plus: + return BigInt(sign: .minus, magnitude: x.magnitude + 1) + case .minus: + return BigInt(sign: .plus, magnitude: x.magnitude - 1) + } + } + + public static func &(lhs: inout BigInt, rhs: BigInt) -> BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] & right[i]) + } + if lhs.sign == .minus && rhs.sign == .minus { + words.twosComplement() + return BigInt(sign: .minus, magnitude: BigUInt(words: words)) + } + return BigInt(sign: .plus, magnitude: BigUInt(words: words)) + } + + public static func |(lhs: inout BigInt, rhs: BigInt) -> BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] | right[i]) + } + if lhs.sign == .minus || rhs.sign == .minus { + words.twosComplement() + return BigInt(sign: .minus, magnitude: BigUInt(words: words)) + } + return BigInt(sign: .plus, magnitude: BigUInt(words: words)) + } + + public static func ^(lhs: inout BigInt, rhs: BigInt) -> BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] ^ right[i]) + } + if (lhs.sign == .minus) != (rhs.sign == .minus) { + words.twosComplement() + return BigInt(sign: .minus, magnitude: BigUInt(words: words)) + } + return BigInt(sign: .plus, magnitude: BigUInt(words: words)) + } + + public static func &=(lhs: inout BigInt, rhs: BigInt) { + lhs = lhs & rhs + } + + public static func |=(lhs: inout BigInt, rhs: BigInt) { + lhs = lhs | rhs + } + + public static func ^=(lhs: inout BigInt, rhs: BigInt) { + lhs = lhs ^ rhs + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Codable.swift b/Carthage/Checkouts/BigInt/Sources/Codable.swift new file mode 100644 index 00000000..b53b30be --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Codable.swift @@ -0,0 +1,155 @@ +// +// Codable.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-8-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + + +// Little-endian to big-endian +struct Units: RandomAccessCollection +where Words.Element: FixedWidthInteger, Words.Index == Int { + typealias Word = Words.Element + let words: Words + init(of type: Unit.Type, _ words: Words) { + precondition(Word.bitWidth % Unit.bitWidth == 0 || Unit.bitWidth % Word.bitWidth == 0) + self.words = words + } + var count: Int { return (words.count * Word.bitWidth + Unit.bitWidth - 1) / Unit.bitWidth } + var startIndex: Int { return 0 } + var endIndex: Int { return count } + subscript(_ index: Int) -> Unit { + let index = count - 1 - index + if Unit.bitWidth == Word.bitWidth { + return Unit(words[index]) + } + else if Unit.bitWidth > Word.bitWidth { + let c = Unit.bitWidth / Word.bitWidth + var unit: Unit = 0 + var j = 0 + for i in (c * index) ..< Swift.min(c * (index + 1), words.endIndex) { + unit |= Unit(words[i]) << j + j += Word.bitWidth + } + return unit + } + // Unit.bitWidth < Word.bitWidth + let c = Word.bitWidth / Unit.bitWidth + let i = index / c + let j = index % c + return Unit(truncatingIfNeeded: words[i] >> (j * Unit.bitWidth)) + } +} + +extension Array where Element: FixedWidthInteger { + // Big-endian to little-endian + init(count: Int?, generator: () throws -> Unit?) rethrows { + typealias Word = Element + precondition(Word.bitWidth % Unit.bitWidth == 0 || Unit.bitWidth % Word.bitWidth == 0) + self = [] + if Unit.bitWidth == Word.bitWidth { + if let count = count { + self.reserveCapacity(count) + } + while let unit = try generator() { + self.append(Word(unit)) + } + } + else if Unit.bitWidth > Word.bitWidth { + let wordsPerUnit = Unit.bitWidth / Word.bitWidth + if let count = count { + self.reserveCapacity(count * wordsPerUnit) + } + while let unit = try generator() { + var shift = Unit.bitWidth - Word.bitWidth + while shift >= 0 { + self.append(Word(truncatingIfNeeded: unit >> shift)) + shift -= Word.bitWidth + } + } + } + else { + let unitsPerWord = Word.bitWidth / Unit.bitWidth + if let count = count { + self.reserveCapacity((count + unitsPerWord - 1) / unitsPerWord) + } + var word: Word = 0 + var c = 0 + while let unit = try generator() { + word <<= Unit.bitWidth + word |= Word(unit) + c += Unit.bitWidth + if c == Word.bitWidth { + self.append(word) + word = 0 + c = 0 + } + } + if c > 0 { + self.append(word << c) + var shifted: Word = 0 + for i in self.indices { + let word = self[i] + self[i] = shifted | (word >> c) + shifted = word << (Word.bitWidth - c) + } + } + } + self.reverse() + } +} + +extension BigInt: Codable { + public init(from decoder: Decoder) throws { + var container = try decoder.unkeyedContainer() + + // Decode sign + let sign: BigInt.Sign + switch try container.decode(String.self) { + case "+": + sign = .plus + case "-": + sign = .minus + default: + throw DecodingError.dataCorrupted(.init(codingPath: container.codingPath, + debugDescription: "Invalid big integer sign")) + } + + // Decode magnitude + let words = try [UInt](count: container.count?.advanced(by: -1)) { () -> UInt64? in + guard !container.isAtEnd else { return nil } + return try container.decode(UInt64.self) + } + let magnitude = BigUInt(words: words) + + self.init(sign: sign, magnitude: magnitude) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + try container.encode(sign == .plus ? "+" : "-") + let units = Units(of: UInt64.self, self.magnitude.words) + if units.isEmpty { + try container.encode(0 as UInt64) + } + else { + try container.encode(contentsOf: units) + } + } +} + +extension BigUInt: Codable { + public init(from decoder: Decoder) throws { + let value = try BigInt(from: decoder) + guard value.sign == .plus else { + throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath, + debugDescription: "BigUInt cannot hold a negative value")) + } + self = value.magnitude + } + + public func encode(to encoder: Encoder) throws { + try BigInt(sign: .plus, magnitude: self).encode(to: encoder) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Comparable.swift b/Carthage/Checkouts/BigInt/Sources/Comparable.swift new file mode 100644 index 00000000..a5c98ffe --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Comparable.swift @@ -0,0 +1,63 @@ +// +// Comparable.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import Foundation + +extension BigUInt: Comparable { + //MARK: Comparison + + /// Compare `a` to `b` and return an `NSComparisonResult` indicating their order. + /// + /// - Complexity: O(count) + public static func compare(_ a: BigUInt, _ b: BigUInt) -> ComparisonResult { + if a.count != b.count { return a.count > b.count ? .orderedDescending : .orderedAscending } + for i in (0 ..< a.count).reversed() { + let ad = a[i] + let bd = b[i] + if ad != bd { return ad > bd ? .orderedDescending : .orderedAscending } + } + return .orderedSame + } + + /// Return true iff `a` is equal to `b`. + /// + /// - Complexity: O(count) + public static func ==(a: BigUInt, b: BigUInt) -> Bool { + return BigUInt.compare(a, b) == .orderedSame + } + + /// Return true iff `a` is less than `b`. + /// + /// - Complexity: O(count) + public static func <(a: BigUInt, b: BigUInt) -> Bool { + return BigUInt.compare(a, b) == .orderedAscending + } +} + +extension BigInt: Comparable { + /// Return true iff `a` is equal to `b`. + public static func ==(a: BigInt, b: BigInt) -> Bool { + return a.sign == b.sign && a.magnitude == b.magnitude + } + + /// Return true iff `a` is less than `b`. + public static func <(a: BigInt, b: BigInt) -> Bool { + switch (a.sign, b.sign) { + case (.plus, .plus): + return a.magnitude < b.magnitude + case (.plus, .minus): + return false + case (.minus, .plus): + return true + case (.minus, .minus): + return a.magnitude > b.magnitude + } + } +} + + diff --git a/Carthage/Checkouts/BigInt/Sources/Data Conversion.swift b/Carthage/Checkouts/BigInt/Sources/Data Conversion.swift new file mode 100644 index 00000000..25c65521 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Data Conversion.swift @@ -0,0 +1,179 @@ +// +// Data Conversion.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import Foundation + +extension BigUInt { + //MARK: NSData Conversion + + /// Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer + public init(_ buffer: UnsafeRawBufferPointer) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = buffer.count + guard length > 0 else { return } + let bytesPerDigit = Word.bitWidth / 8 + var index = length / bytesPerDigit + var c = bytesPerDigit - length % bytesPerDigit + if c == bytesPerDigit { + c = 0 + index -= 1 + } + + var word: Word = 0 + for byte in buffer { + word <<= 8 + word += Word(byte) + c += 1 + if c == bytesPerDigit { + self[index] = word + index -= 1 + c = 0 + word = 0 + } + } + assert(c == 0 && word == 0 && index == -1) + } + + + /// Initializes an integer from the bits stored inside a piece of `Data`. + /// The data is assumed to be in network (big-endian) byte order. + public init(_ data: Data) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = data.count + guard length > 0 else { return } + let bytesPerDigit = Word.bitWidth / 8 + var index = length / bytesPerDigit + var c = bytesPerDigit - length % bytesPerDigit + if c == bytesPerDigit { + c = 0 + index -= 1 + } + let word: Word = data.withUnsafeBytes { buffPtr in + var word: Word = 0 + let p = buffPtr.bindMemory(to: UInt8.self) + for byte in p { + word <<= 8 + word += Word(byte) + c += 1 + if c == bytesPerDigit { + self[index] = word + index -= 1 + c = 0 + word = 0 + } + } + return word + } + assert(c == 0 && word == 0 && index == -1) + } + + /// Return a `Data` value that contains the base-256 representation of this integer, in network (big-endian) byte order. + public func serialize() -> Data { + // This assumes Digit is binary. + precondition(Word.bitWidth % 8 == 0) + + let byteCount = (self.bitWidth + 7) / 8 + + guard byteCount > 0 else { return Data() } + + var data = Data(count: byteCount) + data.withUnsafeMutableBytes { buffPtr in + let p = buffPtr.bindMemory(to: UInt8.self) + var i = byteCount - 1 + for var word in self.words { + for _ in 0 ..< Word.bitWidth / 8 { + p[i] = UInt8(word & 0xFF) + word >>= 8 + if i == 0 { + assert(word == 0) + break + } + i -= 1 + } + } + } + return data + } +} + +extension BigInt { + + /// Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer, + /// where the first byte indicates sign (0 for positive, 1 for negative) + public init(_ buffer: UnsafeRawBufferPointer) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = buffer.count + + // Serialized data for a BigInt should contain at least 2 bytes: one representing + // the sign, and another for the non-zero magnitude. Zero is represented by an + // empty Data struct, and negative zero is not supported. + guard length > 1, let firstByte = buffer.first else { return } + + // The first byte gives the sign + // This byte is compared to a bitmask to allow additional functionality to be added + // to this byte in the future. + self.sign = firstByte & 0b1 == 0 ? .plus : .minus + + self.magnitude = BigUInt(UnsafeRawBufferPointer(rebasing: buffer.dropFirst(1))) + } + + /// Initializes an integer from the bits stored inside a piece of `Data`. + /// The data is assumed to be in network (big-endian) byte order with a first + /// byte to represent the sign (0 for positive, 1 for negative) + public init(_ data: Data) { + // This assumes Word is binary. + // This is the same assumption made when initializing BigUInt from Data + precondition(Word.bitWidth % 8 == 0) + + self.init() + + // Serialized data for a BigInt should contain at least 2 bytes: one representing + // the sign, and another for the non-zero magnitude. Zero is represented by an + // empty Data struct, and negative zero is not supported. + guard data.count > 1, let firstByte = data.first else { return } + + // The first byte gives the sign + // This byte is compared to a bitmask to allow additional functionality to be added + // to this byte in the future. + self.sign = firstByte & 0b1 == 0 ? .plus : .minus + + // The remaining bytes are read and stored as the magnitude + self.magnitude = BigUInt(data.dropFirst(1)) + } + + /// Return a `Data` value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative) + public func serialize() -> Data { + // Create a data object for the magnitude portion of the BigInt + let magnitudeData = self.magnitude.serialize() + + // Similar to BigUInt, a value of 0 should return an initialized, empty Data struct + guard magnitudeData.count > 0 else { return magnitudeData } + + // Create a new Data struct for the signed BigInt value + var data = Data(capacity: magnitudeData.count + 1) + + // The first byte should be 0 for a positive value, or 1 for a negative value + // i.e., the sign bit is the LSB + data.append(self.sign == .plus ? 0 : 1) + + data.append(magnitudeData) + return data + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Division.swift b/Carthage/Checkouts/BigInt/Sources/Division.swift new file mode 100644 index 00000000..4b30dbb5 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Division.swift @@ -0,0 +1,375 @@ +// +// Division.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Full-width multiplication and division + +// TODO: Return to `where Magnitude == Self` when SR-13491 is resolved +extension FixedWidthInteger { + private var halfShift: Self { + return Self(Self.bitWidth / 2) + + } + private var high: Self { + return self &>> halfShift + } + + private var low: Self { + let mask: Self = 1 &<< halfShift - 1 + return self & mask + } + + private var upshifted: Self { + return self &<< halfShift + } + + private var split: (high: Self, low: Self) { + return (self.high, self.low) + } + + private init(_ value: (high: Self, low: Self)) { + self = value.high.upshifted + value.low + } + + /// Divide the double-width integer `dividend` by `self` and return the quotient and remainder. + /// + /// - Requires: `dividend.high < self`, so that the result will fit in a single digit. + /// - Complexity: O(1) with 2 divisions, 6 multiplications and ~12 or so additions/subtractions. + internal func fastDividingFullWidth(_ dividend: (high: Self, low: Self.Magnitude)) -> (quotient: Self, remainder: Self) { + // Division is complicated; doing it with single-digit operations is maddeningly complicated. + // This is a Swift adaptation for "divlu2" in Hacker's Delight, + // which is in turn a C adaptation of Knuth's Algorithm D (TAOCP vol 2, 4.3.1). + precondition(dividend.high < self) + + // This replaces the implementation in stdlib, which is much slower. + // FIXME: Speed up stdlib. It should use full-width idiv on Intel processors, and + // fall back to a reasonably fast algorithm elsewhere. + + // The trick here is that we're actually implementing a 4/2 long division using half-words, + // with the long division loop unrolled into two 3/2 half-word divisions. + // Luckily, 3/2 half-word division can be approximated by a single full-word division operation + // that, when the divisor is normalized, differs from the correct result by at most 2. + + /// Find the half-word quotient in `u / vn`, which must be normalized. + /// `u` contains three half-words in the two halves of `u.high` and the lower half of + /// `u.low`. (The weird distribution makes for a slightly better fit with the input.) + /// `vn` contains the normalized divisor, consisting of two half-words. + /// + /// - Requires: u.high < vn && u.low.high == 0 && vn.leadingZeroBitCount == 0 + func quotient(dividing u: (high: Self, low: Self), by vn: Self) -> Self { + let (vn1, vn0) = vn.split + // Get approximate quotient. + let (q, r) = u.high.quotientAndRemainder(dividingBy: vn1) + let p = q * vn0 + // q is often already correct, but sometimes the approximation overshoots by at most 2. + // The code that follows checks for this while being careful to only perform single-digit operations. + if q.high == 0 && p <= r.upshifted + u.low { return q } + let r2 = r + vn1 + if r2.high != 0 { return q - 1 } + if (q - 1).high == 0 && p - vn0 <= r2.upshifted + u.low { return q - 1 } + //assert((r + 2 * vn1).high != 0 || p - 2 * vn0 <= (r + 2 * vn1).upshifted + u.low) + return q - 2 + } + /// Divide 3 half-digits by 2 half-digits to get a half-digit quotient and a full-digit remainder. + /// + /// - Requires: u.high < v && u.low.high == 0 && vn.width = width(Digit) + func quotientAndRemainder(dividing u: (high: Self, low: Self), by v: Self) -> (quotient: Self, remainder: Self) { + let q = quotient(dividing: u, by: v) + // Note that `uh.low` masks off a couple of bits, and `q * v` and the + // subtraction are likely to overflow. Despite this, the end result (remainder) will + // still be correct and it will fit inside a single (full) Digit. + let r = Self(u) &- q &* v + assert(r < v) + return (q, r) + } + + // Normalize the dividend and the divisor (self) such that the divisor has no leading zeroes. + let z = Self(self.leadingZeroBitCount) + let w = Self(Self.bitWidth) - z + let vn = self << z + + let un32 = (z == 0 ? dividend.high : (dividend.high &<< z) | ((dividend.low as! Self) &>> w)) // No bits are lost + let un10 = dividend.low &<< z + let (un1, un0) = un10.split + + // Divide `(un32,un10)` by `vn`, splitting the full 4/2 division into two 3/2 ones. + let (q1, un21) = quotientAndRemainder(dividing: (un32, (un1 as! Self)), by: vn) + let (q0, rn) = quotientAndRemainder(dividing: (un21, (un0 as! Self)), by: vn) + + // Undo normalization of the remainder and combine the two halves of the quotient. + let mod = rn >> z + let div = Self((q1, q0)) + return (div, mod) + } + + /// Return the quotient of the 3/2-word division `x/y` as a single word. + /// + /// - Requires: (x.0, x.1) <= y && y.0.high != 0 + /// - Returns: The exact value when it fits in a single word, otherwise `Self`. + static func approximateQuotient(dividing x: (Self, Self, Self), by y: (Self, Self)) -> Self { + // Start with q = (x.0, x.1) / y.0, (or Word.max on overflow) + var q: Self + var r: Self + if x.0 == y.0 { + q = Self.max + let (s, o) = x.0.addingReportingOverflow(x.1) + if o { return q } + r = s + } + else { + (q, r) = y.0.fastDividingFullWidth((x.0, (x.1 as! Magnitude))) + } + // Now refine q by considering x.2 and y.1. + // Note that since y is normalized, q * y - x is between 0 and 2. + let (ph, pl) = q.multipliedFullWidth(by: y.1) + if ph < r || (ph == r && pl <= x.2) { return q } + + let (r1, ro) = r.addingReportingOverflow(y.0) + if ro { return q - 1 } + + let (pl1, so) = pl.subtractingReportingOverflow((y.1 as! Magnitude)) + let ph1 = (so ? ph - 1 : ph) + + if ph1 < r1 || (ph1 == r1 && pl1 <= x.2) { return q - 1 } + return q - 2 + } +} + +extension BigUInt { + //MARK: Division + + /// Divide this integer by the word `y`, leaving the quotient in its place and returning the remainder. + /// + /// - Requires: y > 0 + /// - Complexity: O(count) + internal mutating func divide(byWord y: Word) -> Word { + precondition(y > 0) + if y == 1 { return 0 } + + var remainder: Word = 0 + for i in (0 ..< count).reversed() { + let u = self[i] + (self[i], remainder) = y.fastDividingFullWidth((remainder, u)) + } + return remainder + } + + /// Divide this integer by the word `y` and return the resulting quotient and remainder. + /// + /// - Requires: y > 0 + /// - Returns: (quotient, remainder) where quotient = floor(x/y), remainder = x - quotient * y + /// - Complexity: O(x.count) + internal func quotientAndRemainder(dividingByWord y: Word) -> (quotient: BigUInt, remainder: Word) { + var div = self + let mod = div.divide(byWord: y) + return (div, mod) + } + + /// Divide `x` by `y`, putting the quotient in `x` and the remainder in `y`. + /// Reusing integers like this reduces the number of allocations during the calculation. + static func divide(_ x: inout BigUInt, by y: inout BigUInt) { + // This is a Swift adaptation of "divmnu" from Hacker's Delight, which is in + // turn a C adaptation of Knuth's Algorithm D (TAOCP vol 2, 4.3.1). + + precondition(!y.isZero) + + // First, let's take care of the easy cases. + if x < y { + (x, y) = (0, x) + return + } + if y.count == 1 { + // The single-word case reduces to a simpler loop. + y = BigUInt(x.divide(byWord: y[0])) + return + } + + // In the hard cases, we will perform the long division algorithm we learned in school. + // It works by successively calculating the single-word quotient of the top y.count + 1 + // words of x divided by y, replacing the top of x with the remainder, and repeating + // the process one word lower. + // + // The tricky part is that the algorithm needs to be able to do n+1/n word divisions, + // but we only have a primitive for dividing two words by a single + // word. (Remember that this step is also tricky when we do it on paper!) + // + // The solution is that the long division can be approximated by a single full division + // using just the most significant words. We can then use multiplications and + // subtractions to refine the approximation until we get the correct quotient word. + // + // We could do this by doing a simple 2/1 full division, but Knuth goes one step further, + // and implements a 3/2 division. This results in an exact approximation in the + // vast majority of cases, eliminating an extra subtraction over big integers. + // + // The function `approximateQuotient` above implements Knuth's 3/2 division algorithm. + // It requires that the divisor's most significant word is larger than + // Word.max / 2. This ensures that the approximation has tiny error bounds, + // which is what makes this entire approach viable. + // To satisfy this requirement, we will normalize the division by multiplying + // both the divisor and the dividend by the same (small) factor. + let z = y.leadingZeroBitCount + y <<= z + x <<= z // We'll calculate the remainder in the normalized dividend. + var quotient = BigUInt() + assert(y.leadingZeroBitCount == 0) + + // We're ready to start the long division! + let dc = y.count + let d1 = y[dc - 1] + let d0 = y[dc - 2] + var product: BigUInt = 0 + for j in (dc ... x.count).reversed() { + // Approximate dividing the top dc+1 words of `remainder` using the topmost 3/2 words. + let r2 = x[j] + let r1 = x[j - 1] + let r0 = x[j - 2] + let q = Word.approximateQuotient(dividing: (r2, r1, r0), by: (d1, d0)) + + // Multiply the entire divisor with `q` and subtract the result from remainder. + // Normalization ensures the 3/2 quotient will either be exact for the full division, or + // it may overshoot by at most 1, in which case the product will be greater + // than the remainder. + product.load(y) + product.multiply(byWord: q) + if product <= x.extract(j - dc ..< j + 1) { + x.subtract(product, shiftedBy: j - dc) + quotient[j - dc] = q + } + else { + // This case is extremely rare -- it has a probability of 1/2^(Word.bitWidth - 1). + x.add(y, shiftedBy: j - dc) + x.subtract(product, shiftedBy: j - dc) + quotient[j - dc] = q - 1 + } + } + // The remainder's normalization needs to be undone, but otherwise we're done. + x >>= z + y = x + x = quotient + } + + /// Divide `x` by `y`, putting the remainder in `x`. + mutating func formRemainder(dividingBy y: BigUInt, normalizedBy shift: Int) { + precondition(!y.isZero) + assert(y.leadingZeroBitCount == 0) + if y.count == 1 { + let remainder = self.divide(byWord: y[0] >> shift) + self.load(BigUInt(remainder)) + return + } + self <<= shift + if self >= y { + let dc = y.count + let d1 = y[dc - 1] + let d0 = y[dc - 2] + var product: BigUInt = 0 + for j in (dc ... self.count).reversed() { + let r2 = self[j] + let r1 = self[j - 1] + let r0 = self[j - 2] + let q = Word.approximateQuotient(dividing: (r2, r1, r0), by: (d1, d0)) + product.load(y) + product.multiply(byWord: q) + if product <= self.extract(j - dc ..< j + 1) { + self.subtract(product, shiftedBy: j - dc) + } + else { + self.add(y, shiftedBy: j - dc) + self.subtract(product, shiftedBy: j - dc) + } + } + } + self >>= shift + } + + + /// Divide this integer by `y` and return the resulting quotient and remainder. + /// + /// - Requires: `y > 0` + /// - Returns: `(quotient, remainder)` where `quotient = floor(self/y)`, `remainder = self - quotient * y` + /// - Complexity: O(count^2) + public func quotientAndRemainder(dividingBy y: BigUInt) -> (quotient: BigUInt, remainder: BigUInt) { + var x = self + var y = y + BigUInt.divide(&x, by: &y) + return (x, y) + } + + /// Divide `x` by `y` and return the quotient. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func /(x: BigUInt, y: BigUInt) -> BigUInt { + return x.quotientAndRemainder(dividingBy: y).quotient + } + + /// Divide `x` by `y` and return the remainder. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func %(x: BigUInt, y: BigUInt) -> BigUInt { + var x = x + let shift = y.leadingZeroBitCount + x.formRemainder(dividingBy: y << shift, normalizedBy: shift) + return x + } + + /// Divide `x` by `y` and store the quotient in `x`. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func /=(x: inout BigUInt, y: BigUInt) { + var y = y + BigUInt.divide(&x, by: &y) + } + + /// Divide `x` by `y` and store the remainder in `x`. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func %=(x: inout BigUInt, y: BigUInt) { + let shift = y.leadingZeroBitCount + x.formRemainder(dividingBy: y << shift, normalizedBy: shift) + } +} + +extension BigInt { + /// Divide this integer by `y` and return the resulting quotient and remainder. + /// + /// - Requires: `y > 0` + /// - Returns: `(quotient, remainder)` where `quotient = floor(self/y)`, `remainder = self - quotient * y` + /// - Complexity: O(count^2) + public func quotientAndRemainder(dividingBy y: BigInt) -> (quotient: BigInt, remainder: BigInt) { + var a = self.magnitude + var b = y.magnitude + BigUInt.divide(&a, by: &b) + return (BigInt(sign: self.sign == y.sign ? .plus : .minus, magnitude: a), + BigInt(sign: self.sign, magnitude: b)) + } + + /// Divide `a` by `b` and return the quotient. Traps if `b` is zero. + public static func /(a: BigInt, b: BigInt) -> BigInt { + return BigInt(sign: a.sign == b.sign ? .plus : .minus, magnitude: a.magnitude / b.magnitude) + } + + /// Divide `a` by `b` and return the remainder. The result has the same sign as `a`. + public static func %(a: BigInt, b: BigInt) -> BigInt { + return BigInt(sign: a.sign, magnitude: a.magnitude % b.magnitude) + } + + /// Return the result of `a` mod `b`. The result is always a nonnegative integer that is less than the absolute value of `b`. + public func modulus(_ mod: BigInt) -> BigInt { + let remainder = self.magnitude % mod.magnitude + return BigInt( + self.sign == .minus && !remainder.isZero + ? mod.magnitude - remainder + : remainder) + } +} + +extension BigInt { + /// Divide `a` by `b` storing the quotient in `a`. + public static func /=(a: inout BigInt, b: BigInt) { a = a / b } + /// Divide `a` by `b` storing the remainder in `a`. + public static func %=(a: inout BigInt, b: BigInt) { a = a % b } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Exponentiation.swift b/Carthage/Checkouts/BigInt/Sources/Exponentiation.swift new file mode 100644 index 00000000..9d7ee85d --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Exponentiation.swift @@ -0,0 +1,119 @@ +// +// Exponentiation.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + //MARK: Exponentiation + + /// Returns this integer raised to the power `exponent`. + /// + /// This function calculates the result by [successively squaring the base while halving the exponent][expsqr]. + /// + /// [expsqr]: https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// - Note: This function can be unreasonably expensive for large exponents, which is why `exponent` is + /// a simple integer value. If you want to calculate big exponents, you'll probably need to use + /// the modulo arithmetic variant. + /// - Returns: 1 if `exponent == 0`, otherwise `self` raised to `exponent`. (This implies that `0.power(0) == 1`.) + /// - SeeAlso: `BigUInt.power(_:, modulus:)` + /// - Complexity: O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + public func power(_ exponent: Int) -> BigUInt { + if exponent == 0 { return 1 } + if exponent == 1 { return self } + if exponent < 0 { + precondition(!self.isZero) + return self == 1 ? 1 : 0 + } + if self <= 1 { return self } + var result = BigUInt(1) + var b = self + var e = exponent + while e > 0 { + if e & 1 == 1 { + result *= b + } + e >>= 1 + b *= b + } + return result + } + + /// Returns the remainder of this integer raised to the power `exponent` in modulo arithmetic under `modulus`. + /// + /// Uses the [right-to-left binary method][rtlb]. + /// + /// [rtlb]: https://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method + /// + /// - Complexity: O(exponent.count * modulus.count^log2(3)) or somesuch + public func power(_ exponent: BigUInt, modulus: BigUInt) -> BigUInt { + precondition(!modulus.isZero) + if modulus == (1 as BigUInt) { return 0 } + let shift = modulus.leadingZeroBitCount + let normalizedModulus = modulus << shift + var result = BigUInt(1) + var b = self + b.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + for var e in exponent.words { + for _ in 0 ..< Word.bitWidth { + if e & 1 == 1 { + result *= b + result.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + } + e >>= 1 + b *= b + b.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + } + } + return result + } +} + +extension BigInt { + /// Returns this integer raised to the power `exponent`. + /// + /// This function calculates the result by [successively squaring the base while halving the exponent][expsqr]. + /// + /// [expsqr]: https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// - Note: This function can be unreasonably expensive for large exponents, which is why `exponent` is + /// a simple integer value. If you want to calculate big exponents, you'll probably need to use + /// the modulo arithmetic variant. + /// - Returns: 1 if `exponent == 0`, otherwise `self` raised to `exponent`. (This implies that `0.power(0) == 1`.) + /// - SeeAlso: `BigUInt.power(_:, modulus:)` + /// - Complexity: O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + public func power(_ exponent: Int) -> BigInt { + return BigInt(sign: self.sign == .minus && exponent & 1 != 0 ? .minus : .plus, + magnitude: self.magnitude.power(exponent)) + } + + /// Returns the remainder of this integer raised to the power `exponent` in modulo arithmetic under `modulus`. + /// + /// Uses the [right-to-left binary method][rtlb]. + /// + /// [rtlb]: https://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method + /// + /// - Complexity: O(exponent.count * modulus.count^log2(3)) or somesuch + public func power(_ exponent: BigInt, modulus: BigInt) -> BigInt { + precondition(!modulus.isZero) + if modulus.magnitude == 1 { return 0 } + if exponent.isZero { return 1 } + if exponent == 1 { return self.modulus(modulus) } + if exponent < 0 { + precondition(!self.isZero) + guard magnitude == 1 else { return 0 } + guard sign == .minus else { return 1 } + guard exponent.magnitude[0] & 1 != 0 else { return 1 } + return BigInt(modulus.magnitude - 1) + } + let power = self.magnitude.power(exponent.magnitude, + modulus: modulus.magnitude) + if self.sign == .plus || exponent.magnitude[0] & 1 == 0 || power.isZero { + return BigInt(power) + } + return BigInt(modulus.magnitude - power) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Floating Point Conversion.swift b/Carthage/Checkouts/BigInt/Sources/Floating Point Conversion.swift new file mode 100644 index 00000000..6c2395a3 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Floating Point Conversion.swift @@ -0,0 +1,73 @@ +// +// Floating Point Conversion.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + public init?(exactly source: T) { + guard source.isFinite else { return nil } + guard !source.isZero else { self = 0; return } + guard source.sign == .plus else { return nil } + let value = source.rounded(.towardZero) + guard value == source else { return nil } + assert(value.floatingPointClass == .positiveNormal) + assert(value.exponent >= 0) + let significand = value.significandBitPattern + self = (BigUInt(1) << value.exponent) + BigUInt(significand) >> (T.significandBitCount - Int(value.exponent)) + } + + public init(_ source: T) { + self.init(exactly: source.rounded(.towardZero))! + } +} + +extension BigInt { + public init?(exactly source: T) { + switch source.sign{ + case .plus: + guard let magnitude = BigUInt(exactly: source) else { return nil } + self = BigInt(sign: .plus, magnitude: magnitude) + case .minus: + guard let magnitude = BigUInt(exactly: -source) else { return nil } + self = BigInt(sign: .minus, magnitude: magnitude) + } + } + + public init(_ source: T) { + self.init(exactly: source.rounded(.towardZero))! + } +} + +extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger { + public init(_ value: BigInt) { + guard !value.isZero else { self = 0; return } + let v = value.magnitude + let bitWidth = v.bitWidth + var exponent = bitWidth - 1 + let shift = bitWidth - Self.significandBitCount - 1 + var significand = value.magnitude >> (shift - 1) + if significand[0] & 3 == 3 { // Handle rounding + significand >>= 1 + significand += 1 + if significand.trailingZeroBitCount >= Self.significandBitCount { + exponent += 1 + } + } + else { + significand >>= 1 + } + let bias = 1 << (Self.exponentBitCount - 1) - 1 + guard exponent <= bias else { self = Self.infinity; return } + significand &= 1 << Self.significandBitCount - 1 + self = Self.init(sign: value.sign == .plus ? .plus : .minus, + exponentBitPattern: RawExponent(bias + exponent), + significandBitPattern: RawSignificand(significand)) + } + + public init(_ value: BigUInt) { + self.init(BigInt(sign: .plus, magnitude: value)) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/GCD.swift b/Carthage/Checkouts/BigInt/Sources/GCD.swift new file mode 100644 index 00000000..d55605dc --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/GCD.swift @@ -0,0 +1,80 @@ +// +// GCD.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + //MARK: Greatest Common Divisor + + /// Returns the greatest common divisor of `self` and `b`. + /// + /// - Complexity: O(count^2) where count = max(self.count, b.count) + public func greatestCommonDivisor(with b: BigUInt) -> BigUInt { + // This is Stein's algorithm: https://en.wikipedia.org/wiki/Binary_GCD_algorithm + if self.isZero { return b } + if b.isZero { return self } + + let az = self.trailingZeroBitCount + let bz = b.trailingZeroBitCount + let twos = Swift.min(az, bz) + + var (x, y) = (self >> az, b >> bz) + if x < y { swap(&x, &y) } + + while !x.isZero { + x >>= x.trailingZeroBitCount + if x < y { swap(&x, &y) } + x -= y + } + return y << twos + } + + /// Returns the [multiplicative inverse of this integer in modulo `modulus` arithmetic][inverse], + /// or `nil` if there is no such number. + /// + /// [inverse]: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers + /// + /// - Returns: If `gcd(self, modulus) == 1`, the value returned is an integer `a < modulus` such that `(a * self) % modulus == 1`. If `self` and `modulus` aren't coprime, the return value is `nil`. + /// - Requires: modulus > 1 + /// - Complexity: O(count^3) + public func inverse(_ modulus: BigUInt) -> BigUInt? { + precondition(modulus > 1) + var t1 = BigInt(0) + var t2 = BigInt(1) + var r1 = modulus + var r2 = self + while !r2.isZero { + let quotient = r1 / r2 + (t1, t2) = (t2, t1 - BigInt(quotient) * t2) + (r1, r2) = (r2, r1 - quotient * r2) + } + if r1 > 1 { return nil } + if t1.sign == .minus { return modulus - t1.magnitude } + return t1.magnitude + } +} + +extension BigInt { + /// Returns the greatest common divisor of `a` and `b`. + /// + /// - Complexity: O(count^2) where count = max(a.count, b.count) + public func greatestCommonDivisor(with b: BigInt) -> BigInt { + return BigInt(self.magnitude.greatestCommonDivisor(with: b.magnitude)) + } + + /// Returns the [multiplicative inverse of this integer in modulo `modulus` arithmetic][inverse], + /// or `nil` if there is no such number. + /// + /// [inverse]: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers + /// + /// - Returns: If `gcd(self, modulus) == 1`, the value returned is an integer `a < modulus` such that `(a * self) % modulus == 1`. If `self` and `modulus` aren't coprime, the return value is `nil`. + /// - Requires: modulus.magnitude > 1 + /// - Complexity: O(count^3) + public func inverse(_ modulus: BigInt) -> BigInt? { + guard let inv = self.magnitude.inverse(modulus.magnitude) else { return nil } + return BigInt(self.sign == .plus || inv.isZero ? inv : modulus.magnitude - inv) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Hashable.swift b/Carthage/Checkouts/BigInt/Sources/Hashable.swift new file mode 100644 index 00000000..c5dc0e64 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Hashable.swift @@ -0,0 +1,26 @@ +// +// Hashable.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt: Hashable { + //MARK: Hashing + + /// Append this `BigUInt` to the specified hasher. + public func hash(into hasher: inout Hasher) { + for word in self.words { + hasher.combine(word) + } + } +} + +extension BigInt: Hashable { + /// Append this `BigInt` to the specified hasher. + public func hash(into hasher: inout Hasher) { + hasher.combine(sign) + hasher.combine(magnitude) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Info.plist b/Carthage/Checkouts/BigInt/Sources/Info.plist new file mode 100644 index 00000000..63135fb1 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + $(VERSION_STRING) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + NSHumanReadableCopyright + Copyright © 2016 Károly Lőrentey. + + diff --git a/Carthage/Checkouts/BigInt/Sources/Integer Conversion.swift b/Carthage/Checkouts/BigInt/Sources/Integer Conversion.swift new file mode 100644 index 00000000..9a210e4a --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Integer Conversion.swift @@ -0,0 +1,89 @@ +// +// Integer Conversion.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + public init?(exactly source: T) { + guard source >= (0 as T) else { return nil } + if source.bitWidth <= 2 * Word.bitWidth { + var it = source.words.makeIterator() + self.init(low: it.next() ?? 0, high: it.next() ?? 0) + precondition(it.next() == nil, "Length of BinaryInteger.words is greater than its bitWidth") + } + else { + self.init(words: source.words) + } + } + + public init(_ source: T) { + precondition(source >= (0 as T), "BigUInt cannot represent negative values") + self.init(exactly: source)! + } + + public init(truncatingIfNeeded source: T) { + self.init(words: source.words) + } + + public init(clamping source: T) { + if source <= (0 as T) { + self.init() + } + else { + self.init(words: source.words) + } + } +} + +extension BigInt { + public init() { + self.init(sign: .plus, magnitude: 0) + } + + /// Initializes a new signed big integer with the same value as the specified unsigned big integer. + public init(_ integer: BigUInt) { + self.magnitude = integer + self.sign = .plus + } + + public init(_ source: T) where T : BinaryInteger { + if source >= (0 as T) { + self.init(sign: .plus, magnitude: BigUInt(source)) + } + else { + var words = Array(source.words) + words.twosComplement() + self.init(sign: .minus, magnitude: BigUInt(words: words)) + } + } + + public init?(exactly source: T) where T : BinaryInteger { + self.init(source) + } + + public init(clamping source: T) where T : BinaryInteger { + self.init(source) + } + + public init(truncatingIfNeeded source: T) where T : BinaryInteger { + self.init(source) + } +} + +extension BigUInt: ExpressibleByIntegerLiteral { + /// Initialize a new big integer from an integer literal. + public init(integerLiteral value: UInt64) { + self.init(value) + } +} + +extension BigInt: ExpressibleByIntegerLiteral { + /// Initialize a new big integer from an integer literal. + public init(integerLiteral value: Int64) { + self.init(value) + } +} + diff --git a/Carthage/Checkouts/BigInt/Sources/Multiplication.swift b/Carthage/Checkouts/BigInt/Sources/Multiplication.swift new file mode 100644 index 00000000..635c36a5 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Multiplication.swift @@ -0,0 +1,165 @@ +// +// Multiplication.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + + //MARK: Multiplication + + /// Multiply this big integer by a single word, and store the result in place of the original big integer. + /// + /// - Complexity: O(count) + public mutating func multiply(byWord y: Word) { + guard y != 0 else { self = 0; return } + guard y != 1 else { return } + var carry: Word = 0 + let c = self.count + for i in 0 ..< c { + let (h, l) = self[i].multipliedFullWidth(by: y) + let (low, o) = l.addingReportingOverflow(carry) + self[i] = low + carry = (o ? h + 1 : h) + } + self[c] = carry + } + + /// Multiply this big integer by a single Word, and return the result. + /// + /// - Complexity: O(count) + public func multiplied(byWord y: Word) -> BigUInt { + var r = self + r.multiply(byWord: y) + return r + } + + /// Multiply `x` by `y`, and add the result to this integer, optionally shifted `shift` words to the left. + /// + /// - Note: This is the fused multiply/shift/add operation; it is more efficient than doing the components + /// individually. (The fused operation doesn't need to allocate space for temporary big integers.) + /// - Returns: `self` is set to `self + (x * y) << (shift * 2^Word.bitWidth)` + /// - Complexity: O(count) + public mutating func multiplyAndAdd(_ x: BigUInt, _ y: Word, shiftedBy shift: Int = 0) { + precondition(shift >= 0) + guard y != 0 && x.count > 0 else { return } + guard y != 1 else { self.add(x, shiftedBy: shift); return } + var mulCarry: Word = 0 + var addCarry = false + let xc = x.count + var xi = 0 + while xi < xc || addCarry || mulCarry > 0 { + let (h, l) = x[xi].multipliedFullWidth(by: y) + let (low, o) = l.addingReportingOverflow(mulCarry) + mulCarry = (o ? h + 1 : h) + + let ai = shift + xi + let (sum1, so1) = self[ai].addingReportingOverflow(low) + if addCarry { + let (sum2, so2) = sum1.addingReportingOverflow(1) + self[ai] = sum2 + addCarry = so1 || so2 + } + else { + self[ai] = sum1 + addCarry = so1 + } + xi += 1 + } + } + + /// Multiply this integer by `y` and return the result. + /// + /// - Note: This uses the naive O(n^2) multiplication algorithm unless both arguments have more than + /// `BigUInt.directMultiplicationLimit` words. + /// - Complexity: O(n^log2(3)) + public func multiplied(by y: BigUInt) -> BigUInt { + // This method is mostly defined for symmetry with the rest of the arithmetic operations. + return self * y + } + + /// Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit. + public static var directMultiplicationLimit: Int = 1024 + + /// Multiply `a` by `b` and return the result. + /// + /// - Note: This uses the naive O(n^2) multiplication algorithm unless both arguments have more than + /// `BigUInt.directMultiplicationLimit` words. + /// - Complexity: O(n^log2(3)) + public static func *(x: BigUInt, y: BigUInt) -> BigUInt { + let xc = x.count + let yc = y.count + if xc == 0 { return BigUInt() } + if yc == 0 { return BigUInt() } + if yc == 1 { return x.multiplied(byWord: y[0]) } + if xc == 1 { return y.multiplied(byWord: x[0]) } + + if Swift.min(xc, yc) <= BigUInt.directMultiplicationLimit { + // Long multiplication. + let left = (xc < yc ? y : x) + let right = (xc < yc ? x : y) + var result = BigUInt() + for i in (0 ..< right.count).reversed() { + result.multiplyAndAdd(left, right[i], shiftedBy: i) + } + return result + } + + if yc < xc { + let (xh, xl) = x.split + var r = xl * y + r.add(xh * y, shiftedBy: x.middleIndex) + return r + } + else if xc < yc { + let (yh, yl) = y.split + var r = yl * x + r.add(yh * x, shiftedBy: y.middleIndex) + return r + } + + let shift = x.middleIndex + + // Karatsuba multiplication: + // x * y = * = (ignoring carry) + let (a, b) = x.split + let (c, d) = y.split + + let high = a * c + let low = b * d + let xp = a >= b + let yp = c >= d + let xm = (xp ? a - b : b - a) + let ym = (yp ? c - d : d - c) + let m = xm * ym + + var r = low + r.add(high, shiftedBy: 2 * shift) + r.add(low, shiftedBy: shift) + r.add(high, shiftedBy: shift) + if xp == yp { + r.subtract(m, shiftedBy: shift) + } + else { + r.add(m, shiftedBy: shift) + } + return r + } + + /// Multiply `a` by `b` and store the result in `a`. + public static func *=(a: inout BigUInt, b: BigUInt) { + a = a * b + } +} + +extension BigInt { + /// Multiply `a` with `b` and return the result. + public static func *(a: BigInt, b: BigInt) -> BigInt { + return BigInt(sign: a.sign == b.sign ? .plus : .minus, magnitude: a.magnitude * b.magnitude) + } + + /// Multiply `a` with `b` in place. + public static func *=(a: inout BigInt, b: BigInt) { a = a * b } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Prime Test.swift b/Carthage/Checkouts/BigInt/Sources/Prime Test.swift new file mode 100644 index 00000000..7f187110 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Prime Test.swift @@ -0,0 +1,153 @@ +// +// Prime Test.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +/// The first several [prime numbers][primes]. +/// +/// [primes]: https://oeis.org/A000040 +let primes: [BigUInt.Word] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41] + +/// The ith element in this sequence is the smallest composite number that passes the strong probable prime test +/// for all of the first (i+1) primes. +/// +/// This is sequence [A014233](http://oeis.org/A014233) on the [Online Encyclopaedia of Integer Sequences](http://oeis.org). +let pseudoPrimes: [BigUInt] = [ + /* 2 */ 2_047, + /* 3 */ 1_373_653, + /* 5 */ 25_326_001, + /* 7 */ 3_215_031_751, + /* 11 */ 2_152_302_898_747, + /* 13 */ 3_474_749_660_383, + /* 17 */ 341_550_071_728_321, + /* 19 */ 341_550_071_728_321, + /* 23 */ 3_825_123_056_546_413_051, + /* 29 */ 3_825_123_056_546_413_051, + /* 31 */ 3_825_123_056_546_413_051, + /* 37 */ "318665857834031151167461", + /* 41 */ "3317044064679887385961981", +] + +extension BigUInt { + //MARK: Primality Testing + + /// Returns true iff this integer passes the [strong probable prime test][sppt] for the specified base. + /// + /// [sppt]: https://en.wikipedia.org/wiki/Probable_prime + public func isStrongProbablePrime(_ base: BigUInt) -> Bool { + precondition(base > (1 as BigUInt)) + precondition(self > (0 as BigUInt)) + let dec = self - 1 + + let r = dec.trailingZeroBitCount + let d = dec >> r + + var test = base.power(d, modulus: self) + if test == 1 || test == dec { return true } + + if r > 0 { + let shift = self.leadingZeroBitCount + let normalized = self << shift + for _ in 1 ..< r { + test *= test + test.formRemainder(dividingBy: normalized, normalizedBy: shift) + if test == 1 { + return false + } + if test == dec { return true } + } + } + return false + } + + /// Returns true if this integer is probably prime. Returns false if this integer is definitely not prime. + /// + /// This function performs a probabilistic [Miller-Rabin Primality Test][mrpt], consisting of `rounds` iterations, + /// each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, + /// but you may specify your own choice. + /// + /// To speed things up, the function checks if `self` is divisible by the first few prime numbers before + /// diving into (slower) Miller-Rabin testing. + /// + /// Also, when `self` is less than 82 bits wide, `isPrime` does a deterministic test that is guaranteed to + /// return a correct result. + /// + /// [mrpt]: https://en.wikipedia.org/wiki/Miller–Rabin_primality_test + public func isPrime(rounds: Int = 10) -> Bool { + if count <= 1 && self[0] < 2 { return false } + if count == 1 && self[0] < 4 { return true } + + // Even numbers above 2 aren't prime. + if self[0] & 1 == 0 { return false } + + // Quickly check for small primes. + for i in 1 ..< primes.count { + let p = primes[i] + if self.count == 1 && self[0] == p { + return true + } + if self.quotientAndRemainder(dividingByWord: p).remainder == 0 { + return false + } + } + + /// Give an exact answer when we can. + if self < pseudoPrimes.last! { + for i in 0 ..< pseudoPrimes.count { + guard isStrongProbablePrime(BigUInt(primes[i])) else { + break + } + if self < pseudoPrimes[i] { + // `self` is below the lowest pseudoprime corresponding to the prime bases we tested. It's a prime! + return true + } + } + return false + } + + /// Otherwise do as many rounds of random SPPT as required. + for _ in 0 ..< rounds { + let random = BigUInt.randomInteger(lessThan: self - 2) + 2 + guard isStrongProbablePrime(random) else { + return false + } + } + + // Well, it smells primey to me. + return true + } +} + +extension BigInt { + //MARK: Primality Testing + + /// Returns true iff this integer passes the [strong probable prime test][sppt] for the specified base. + /// + /// [sppt]: https://en.wikipedia.org/wiki/Probable_prime + public func isStrongProbablePrime(_ base: BigInt) -> Bool { + precondition(base.sign == .plus) + if self.sign == .minus { return false } + return self.magnitude.isStrongProbablePrime(base.magnitude) + } + + /// Returns true if this integer is probably prime. Returns false if this integer is definitely not prime. + /// + /// This function performs a probabilistic [Miller-Rabin Primality Test][mrpt], consisting of `rounds` iterations, + /// each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, + /// but you may specify your own choice. + /// + /// To speed things up, the function checks if `self` is divisible by the first few prime numbers before + /// diving into (slower) Miller-Rabin testing. + /// + /// Also, when `self` is less than 82 bits wide, `isPrime` does a deterministic test that is guaranteed to + /// return a correct result. + /// + /// [mrpt]: https://en.wikipedia.org/wiki/Miller–Rabin_primality_test + public func isPrime(rounds: Int = 10) -> Bool { + if self.sign == .minus { return false } + return self.magnitude.isPrime(rounds: rounds) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Random.swift b/Carthage/Checkouts/BigInt/Sources/Random.swift new file mode 100644 index 00000000..bea98caf --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Random.swift @@ -0,0 +1,101 @@ +// +// Random.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + /// Create a big unsigned integer consisting of `width` uniformly distributed random bits. + /// + /// - Parameter width: The maximum number of one bits in the result. + /// - Parameter generator: The source of randomness. + /// - Returns: A big unsigned integer less than `1 << width`. + public static func randomInteger(withMaximumWidth width: Int, using generator: inout RNG) -> BigUInt { + var result = BigUInt.zero + var bitsLeft = width + var i = 0 + let wordsNeeded = (width + Word.bitWidth - 1) / Word.bitWidth + if wordsNeeded > 2 { + result.reserveCapacity(wordsNeeded) + } + while bitsLeft >= Word.bitWidth { + result[i] = generator.next() + i += 1 + bitsLeft -= Word.bitWidth + } + if bitsLeft > 0 { + let mask: Word = (1 << bitsLeft) - 1 + result[i] = (generator.next() as Word) & mask + } + return result + } + + /// Create a big unsigned integer consisting of `width` uniformly distributed random bits. + /// + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Parameter width: The maximum number of one bits in the result. + /// - Returns: A big unsigned integer less than `1 << width`. + public static func randomInteger(withMaximumWidth width: Int) -> BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(withMaximumWidth: width, using: &rng) + } + + /// Create a big unsigned integer consisting of `width-1` uniformly distributed random bits followed by a one bit. + /// + /// - Note: If `width` is zero, the result is zero. + /// + /// - Parameter width: The number of bits required to represent the answer. + /// - Parameter generator: The source of randomness. + /// - Returns: A random big unsigned integer whose width is `width`. + public static func randomInteger(withExactWidth width: Int, using generator: inout RNG) -> BigUInt { + // width == 0 -> return 0 because there is no room for a one bit. + // width == 1 -> return 1 because there is no room for any random bits. + guard width > 1 else { return BigUInt(width) } + var result = randomInteger(withMaximumWidth: width - 1, using: &generator) + result[(width - 1) / Word.bitWidth] |= 1 << Word((width - 1) % Word.bitWidth) + return result + } + + /// Create a big unsigned integer consisting of `width-1` uniformly distributed random bits followed by a one bit. + /// + /// - Note: If `width` is zero, the result is zero. + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Returns: A random big unsigned integer whose width is `width`. + public static func randomInteger(withExactWidth width: Int) -> BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(withExactWidth: width, using: &rng) + } + + /// Create a uniformly distributed random unsigned integer that's less than the specified limit. + /// + /// - Precondition: `limit > 0`. + /// + /// - Parameter limit: The upper bound on the result. + /// - Parameter generator: The source of randomness. + /// - Returns: A random big unsigned integer that is less than `limit`. + public static func randomInteger(lessThan limit: BigUInt, using generator: inout RNG) -> BigUInt { + precondition(limit > 0, "\(#function): 0 is not a valid limit") + let width = limit.bitWidth + var random = randomInteger(withMaximumWidth: width, using: &generator) + while random >= limit { + random = randomInteger(withMaximumWidth: width, using: &generator) + } + return random + } + + /// Create a uniformly distributed random unsigned integer that's less than the specified limit. + /// + /// - Precondition: `limit > 0`. + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Parameter limit: The upper bound on the result. + /// - Returns: A random big unsigned integer that is less than `limit`. + public static func randomInteger(lessThan limit: BigUInt) -> BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(lessThan: limit, using: &rng) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Shifts.swift b/Carthage/Checkouts/BigInt/Sources/Shifts.swift new file mode 100644 index 00000000..e676e414 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Shifts.swift @@ -0,0 +1,211 @@ +// +// Shifts.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + + //MARK: Shift Operators + + internal func shiftedLeft(by amount: Word) -> BigUInt { + guard amount > 0 else { return self } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let up = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let down = Word(Word.bitWidth) - up + + var result = BigUInt() + if up > 0 { + var i = 0 + var lowbits: Word = 0 + while i < self.count || lowbits > 0 { + let word = self[i] + result[i + ext] = word << up | lowbits + lowbits = word >> down + i += 1 + } + } + else { + for i in 0 ..< self.count { + result[i + ext] = self[i] + } + } + return result + } + + internal mutating func shiftLeft(by amount: Word) { + guard amount > 0 else { return } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let up = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let down = Word(Word.bitWidth) - up + + if up > 0 { + var i = 0 + var lowbits: Word = 0 + while i < self.count || lowbits > 0 { + let word = self[i] + self[i] = word << up | lowbits + lowbits = word >> down + i += 1 + } + } + if ext > 0 && self.count > 0 { + self.shiftLeft(byWords: ext) + } + } + + internal func shiftedRight(by amount: Word) -> BigUInt { + guard amount > 0 else { return self } + guard amount < self.bitWidth else { return 0 } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let down = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let up = Word(Word.bitWidth) - down + + var result = BigUInt() + if down > 0 { + var highbits: Word = 0 + for i in (ext ..< self.count).reversed() { + let word = self[i] + result[i - ext] = highbits | word >> down + highbits = word << up + } + } + else { + for i in (ext ..< self.count).reversed() { + result[i - ext] = self[i] + } + } + return result + } + + internal mutating func shiftRight(by amount: Word) { + guard amount > 0 else { return } + guard amount < self.bitWidth else { self.clear(); return } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let down = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let up = Word(Word.bitWidth) - down + + if ext > 0 { + self.shiftRight(byWords: ext) + } + if down > 0 { + var i = self.count - 1 + var highbits: Word = 0 + while i >= 0 { + let word = self[i] + self[i] = highbits | word >> down + highbits = word << up + i -= 1 + } + } + } + + public static func >>=(lhs: inout BigUInt, rhs: Other) { + if rhs < (0 as Other) { + lhs <<= (0 - rhs) + } + else if rhs >= lhs.bitWidth { + lhs.clear() + } + else { + lhs.shiftRight(by: UInt(rhs)) + } + } + + public static func <<=(lhs: inout BigUInt, rhs: Other) { + if rhs < (0 as Other) { + lhs >>= (0 - rhs) + return + } + lhs.shiftLeft(by: Word(exactly: rhs)!) + } + + public static func >>(lhs: BigUInt, rhs: Other) -> BigUInt { + if rhs < (0 as Other) { + return lhs << (0 - rhs) + } + if rhs > Word.max { + return 0 + } + return lhs.shiftedRight(by: UInt(rhs)) + } + + public static func <<(lhs: BigUInt, rhs: Other) -> BigUInt { + if rhs < (0 as Other) { + return lhs >> (0 - rhs) + } + return lhs.shiftedLeft(by: Word(exactly: rhs)!) + } +} + +extension BigInt { + func shiftedLeft(by amount: Word) -> BigInt { + return BigInt(sign: self.sign, magnitude: self.magnitude.shiftedLeft(by: amount)) + } + + mutating func shiftLeft(by amount: Word) { + self.magnitude.shiftLeft(by: amount) + } + + func shiftedRight(by amount: Word) -> BigInt { + let m = self.magnitude.shiftedRight(by: amount) + return BigInt(sign: self.sign, magnitude: self.sign == .minus && m.isZero ? 1 : m) + } + + mutating func shiftRight(by amount: Word) { + magnitude.shiftRight(by: amount) + if sign == .minus, magnitude.isZero { + magnitude.load(1) + } + } + + public static func &<<(left: BigInt, right: BigInt) -> BigInt { + return left.shiftedLeft(by: right.words[0]) + } + + public static func &<<=(left: inout BigInt, right: BigInt) { + left.shiftLeft(by: right.words[0]) + } + + public static func &>>(left: BigInt, right: BigInt) -> BigInt { + return left.shiftedRight(by: right.words[0]) + } + + public static func &>>=(left: inout BigInt, right: BigInt) { + left.shiftRight(by: right.words[0]) + } + + public static func <<(lhs: BigInt, rhs: Other) -> BigInt { + guard rhs >= (0 as Other) else { return lhs >> (0 - rhs) } + return lhs.shiftedLeft(by: Word(rhs)) + } + + public static func <<=(lhs: inout BigInt, rhs: Other) { + if rhs < (0 as Other) { + lhs >>= (0 - rhs) + } + else { + lhs.shiftLeft(by: Word(rhs)) + } + } + + public static func >>(lhs: BigInt, rhs: Other) -> BigInt { + guard rhs >= (0 as Other) else { return lhs << (0 - rhs) } + return lhs.shiftedRight(by: Word(rhs)) + } + + public static func >>=(lhs: inout BigInt, rhs: Other) { + if rhs < (0 as Other) { + lhs <<= (0 - rhs) + } + else { + lhs.shiftRight(by: Word(rhs)) + } + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Square Root.swift b/Carthage/Checkouts/BigInt/Sources/Square Root.swift new file mode 100644 index 00000000..68db0691 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Square Root.swift @@ -0,0 +1,41 @@ +// +// Square Root.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Square Root + +extension BigUInt { + /// Returns the integer square root of a big integer; i.e., the largest integer whose square isn't greater than `value`. + /// + /// - Returns: floor(sqrt(self)) + public func squareRoot() -> BigUInt { + // This implementation uses Newton's method. + guard !self.isZero else { return BigUInt() } + var x = BigUInt(1) << ((self.bitWidth + 1) / 2) + var y: BigUInt = 0 + while true { + y.load(self) + y /= x + y += x + y >>= 1 + if x == y || x == y - 1 { break } + x = y + } + return x + } +} + +extension BigInt { + /// Returns the integer square root of a big integer; i.e., the largest integer whose square isn't greater than `value`. + /// + /// - Requires: self >= 0 + /// - Returns: floor(sqrt(self)) + public func squareRoot() -> BigInt { + precondition(self.sign == .plus) + return BigInt(sign: .plus, magnitude: self.magnitude.squareRoot()) + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Strideable.swift b/Carthage/Checkouts/BigInt/Sources/Strideable.swift new file mode 100644 index 00000000..2b79babd --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Strideable.swift @@ -0,0 +1,38 @@ +// +// Strideable.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt: Strideable { + /// A type that can represent the distance between two values ofa `BigUInt`. + public typealias Stride = BigInt + + /// Adds `n` to `self` and returns the result. Traps if the result would be less than zero. + public func advanced(by n: BigInt) -> BigUInt { + return n.sign == .minus ? self - n.magnitude : self + n.magnitude + } + + /// Returns the (potentially negative) difference between `self` and `other` as a `BigInt`. Never traps. + public func distance(to other: BigUInt) -> BigInt { + return BigInt(other) - BigInt(self) + } +} + +extension BigInt: Strideable { + public typealias Stride = BigInt + + /// Returns `self + n`. + public func advanced(by n: Stride) -> BigInt { + return self + n + } + + /// Returns `other - self`. + public func distance(to other: BigInt) -> Stride { + return other - self + } +} + + diff --git a/Carthage/Checkouts/BigInt/Sources/String Conversion.swift b/Carthage/Checkouts/BigInt/Sources/String Conversion.swift new file mode 100644 index 00000000..d6f340c9 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/String Conversion.swift @@ -0,0 +1,236 @@ +// +// String Conversion.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + + //MARK: String Conversion + + /// Calculates the number of numerals in a given radix that fit inside a single `Word`. + /// + /// - Returns: (chars, power) where `chars` is highest that satisfy `radix^chars <= 2^Word.bitWidth`. `power` is zero + /// if radix is a power of two; otherwise `power == radix^chars`. + fileprivate static func charsPerWord(forRadix radix: Int) -> (chars: Int, power: Word) { + var power: Word = 1 + var overflow = false + var count = 0 + while !overflow { + let (p, o) = power.multipliedReportingOverflow(by: Word(radix)) + overflow = o + if !o || p == 0 { + count += 1 + power = p + } + } + return (count, power) + } + + /// Initialize a big integer from an ASCII representation in a given radix. Numerals above `9` are represented by + /// letters from the English alphabet. + /// + /// - Requires: `radix > 1 && radix < 36` + /// - Parameter `text`: A string consisting of characters corresponding to numerals in the given radix. (0-9, a-z, A-Z) + /// - Parameter `radix`: The base of the number system to use, or 10 if unspecified. + /// - Returns: The integer represented by `text`, or nil if `text` contains a character that does not represent a numeral in `radix`. + public init?(_ text: S, radix: Int = 10) { + precondition(radix > 1) + let (charsPerWord, power) = BigUInt.charsPerWord(forRadix: radix) + + var words: [Word] = [] + var end = text.endIndex + var start = end + var count = 0 + while start != text.startIndex { + start = text.index(before: start) + count += 1 + if count == charsPerWord { + guard let d = Word.init(text[start ..< end], radix: radix) else { return nil } + words.append(d) + end = start + count = 0 + } + } + if start != end { + guard let d = Word.init(text[start ..< end], radix: radix) else { return nil } + words.append(d) + } + + if power == 0 { + self.init(words: words) + } + else { + self.init() + for d in words.reversed() { + self.multiply(byWord: power) + self.addWord(d) + } + } + } +} + +extension BigInt { + /// Initialize a big integer from an ASCII representation in a given radix. Numerals above `9` are represented by + /// letters from the English alphabet. + /// + /// - Requires: `radix > 1 && radix < 36` + /// - Parameter `text`: A string optionally starting with "-" or "+" followed by characters corresponding to numerals in the given radix. (0-9, a-z, A-Z) + /// - Parameter `radix`: The base of the number system to use, or 10 if unspecified. + /// - Returns: The integer represented by `text`, or nil if `text` contains a character that does not represent a numeral in `radix`. + public init?(_ text: S, radix: Int = 10) { + var magnitude: BigUInt? + var sign: Sign = .plus + if text.first == "-" { + sign = .minus + let text = text.dropFirst() + magnitude = BigUInt(text, radix: radix) + } + else if text.first == "+" { + let text = text.dropFirst() + magnitude = BigUInt(text, radix: radix) + } + else { + magnitude = BigUInt(text, radix: radix) + } + guard let m = magnitude else { return nil } + self.magnitude = m + self.sign = sign + } +} + +extension String { + /// Initialize a new string with the base-10 representation of an unsigned big integer. + /// + /// - Complexity: O(v.count^2) + public init(_ v: BigUInt) { self.init(v, radix: 10, uppercase: false) } + + /// Initialize a new string representing an unsigned big integer in the given radix (base). + /// + /// Numerals greater than 9 are represented as letters from the English alphabet, + /// starting with `a` if `uppercase` is false or `A` otherwise. + /// + /// - Requires: radix > 1 && radix <= 36 + /// - Complexity: O(count) when radix is a power of two; otherwise O(count^2). + public init(_ v: BigUInt, radix: Int, uppercase: Bool = false) { + precondition(radix > 1) + let (charsPerWord, power) = BigUInt.charsPerWord(forRadix: radix) + + guard !v.isZero else { self = "0"; return } + + var parts: [String] + if power == 0 { + parts = v.words.map { String($0, radix: radix, uppercase: uppercase) } + } + else { + parts = [] + var rest = v + while !rest.isZero { + let mod = rest.divide(byWord: power) + parts.append(String(mod, radix: radix, uppercase: uppercase)) + } + } + assert(!parts.isEmpty) + + self = "" + var first = true + for part in parts.reversed() { + let zeroes = charsPerWord - part.count + assert(zeroes >= 0) + if !first && zeroes > 0 { + // Insert leading zeroes for mid-Words + self += String(repeating: "0", count: zeroes) + } + first = false + self += part + } + } + + /// Initialize a new string representing a signed big integer in the given radix (base). + /// + /// Numerals greater than 9 are represented as letters from the English alphabet, + /// starting with `a` if `uppercase` is false or `A` otherwise. + /// + /// - Requires: radix > 1 && radix <= 36 + /// - Complexity: O(count) when radix is a power of two; otherwise O(count^2). + public init(_ value: BigInt, radix: Int = 10, uppercase: Bool = false) { + self = String(value.magnitude, radix: radix, uppercase: uppercase) + if value.sign == .minus { + self = "-" + self + } + } +} + +extension BigUInt: ExpressibleByStringLiteral { + /// Initialize a new big integer from a Unicode scalar. + /// The scalar must represent a decimal digit. + public init(unicodeScalarLiteral value: UnicodeScalar) { + self = BigUInt(String(value), radix: 10)! + } + + /// Initialize a new big integer from an extended grapheme cluster. + /// The cluster must consist of a decimal digit. + public init(extendedGraphemeClusterLiteral value: String) { + self = BigUInt(value, radix: 10)! + } + + /// Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. + /// The string must contain only decimal digits. + public init(stringLiteral value: StringLiteralType) { + self = BigUInt(value, radix: 10)! + } +} + +extension BigInt: ExpressibleByStringLiteral { + /// Initialize a new big integer from a Unicode scalar. + /// The scalar must represent a decimal digit. + public init(unicodeScalarLiteral value: UnicodeScalar) { + self = BigInt(String(value), radix: 10)! + } + + /// Initialize a new big integer from an extended grapheme cluster. + /// The cluster must consist of a decimal digit. + public init(extendedGraphemeClusterLiteral value: String) { + self = BigInt(value, radix: 10)! + } + + /// Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. + /// The string must contain only decimal digits. + public init(stringLiteral value: StringLiteralType) { + self = BigInt(value, radix: 10)! + } +} + +extension BigUInt: CustomStringConvertible { + /// Return the decimal representation of this integer. + public var description: String { + return String(self, radix: 10) + } +} + +extension BigInt: CustomStringConvertible { + /// Return the decimal representation of this integer. + public var description: String { + return String(self, radix: 10) + } +} + +extension BigUInt: CustomPlaygroundDisplayConvertible { + + /// Return the playground quick look representation of this integer. + public var playgroundDescription: Any { + let text = String(self) + return text + " (\(self.bitWidth) bits)" + } +} + +extension BigInt: CustomPlaygroundDisplayConvertible { + + /// Return the playground quick look representation of this integer. + public var playgroundDescription: Any { + let text = String(self) + return text + " (\(self.magnitude.bitWidth) bits)" + } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Subtraction.swift b/Carthage/Checkouts/BigInt/Sources/Subtraction.swift new file mode 100644 index 00000000..5ac872e6 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Subtraction.swift @@ -0,0 +1,169 @@ +// +// Subtraction.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension BigUInt { + //MARK: Subtraction + + /// Subtract `word` from this integer in place, returning a flag indicating if the operation + /// caused an arithmetic overflow. `word` is shifted `shift` words to the left before being subtracted. + /// + /// - Note: If the result indicates an overflow, then `self` becomes the two's complement of the absolute difference. + /// - Complexity: O(count) + internal mutating func subtractWordReportingOverflow(_ word: Word, shiftedBy shift: Int = 0) -> Bool { + precondition(shift >= 0) + var carry: Word = word + var i = shift + let count = self.count + while carry > 0 && i < count { + let (d, c) = self[i].subtractingReportingOverflow(carry) + self[i] = d + carry = (c ? 1 : 0) + i += 1 + } + return carry > 0 + } + + /// Subtract `word` from this integer, returning the difference and a flag that is true if the operation + /// caused an arithmetic overflow. `word` is shifted `shift` words to the left before being subtracted. + /// + /// - Note: If `overflow` is true, then the returned value is the two's complement of the absolute difference. + /// - Complexity: O(count) + internal func subtractingWordReportingOverflow(_ word: Word, shiftedBy shift: Int = 0) -> (partialValue: BigUInt, overflow: Bool) { + var result = self + let overflow = result.subtractWordReportingOverflow(word, shiftedBy: shift) + return (result, overflow) + } + + /// Subtract a digit `d` from this integer in place. + /// `d` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= d * 2^shift + /// - Complexity: O(count) + internal mutating func subtractWord(_ word: Word, shiftedBy shift: Int = 0) { + let overflow = subtractWordReportingOverflow(word, shiftedBy: shift) + precondition(!overflow) + } + + /// Subtract a digit `d` from this integer and return the result. + /// `d` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= d * 2^shift + /// - Complexity: O(count) + internal func subtractingWord(_ word: Word, shiftedBy shift: Int = 0) -> BigUInt { + var result = self + result.subtractWord(word, shiftedBy: shift) + return result + } + + /// Subtract `other` from this integer in place, and return a flag indicating if the operation caused an + /// arithmetic overflow. `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Note: If the result indicates an overflow, then `self` becomes the twos' complement of the absolute difference. + /// - Complexity: O(count) + public mutating func subtractReportingOverflow(_ b: BigUInt, shiftedBy shift: Int = 0) -> Bool { + precondition(shift >= 0) + var carry = false + var bi = 0 + let bc = b.count + let count = self.count + while bi < bc || (shift + bi < count && carry) { + let ai = shift + bi + let (d, c) = self[ai].subtractingReportingOverflow(b[bi]) + if carry { + let (d2, c2) = d.subtractingReportingOverflow(1) + self[ai] = d2 + carry = c || c2 + } + else { + self[ai] = d + carry = c + } + bi += 1 + } + return carry + } + + /// Subtract `other` from this integer, returning the difference and a flag indicating arithmetic overflow. + /// `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Note: If `overflow` is true, then the result value is the twos' complement of the absolute value of the difference. + /// - Complexity: O(count) + public func subtractingReportingOverflow(_ other: BigUInt, shiftedBy shift: Int) -> (partialValue: BigUInt, overflow: Bool) { + var result = self + let overflow = result.subtractReportingOverflow(other, shiftedBy: shift) + return (result, overflow) + } + + /// Subtracts `other` from `self`, returning the result and a flag indicating arithmetic overflow. + /// + /// - Note: When the operation overflows, then `partialValue` is the twos' complement of the absolute value of the difference. + /// - Complexity: O(count) + public func subtractingReportingOverflow(_ other: BigUInt) -> (partialValue: BigUInt, overflow: Bool) { + return self.subtractingReportingOverflow(other, shiftedBy: 0) + } + + /// Subtract `other` from this integer in place. + /// `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= other * 2^shift + /// - Complexity: O(count) + public mutating func subtract(_ other: BigUInt, shiftedBy shift: Int = 0) { + let overflow = subtractReportingOverflow(other, shiftedBy: shift) + precondition(!overflow) + } + + /// Subtract `b` from this integer, and return the difference. + /// `b` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= b * 2^shift + /// - Complexity: O(count) + public func subtracting(_ other: BigUInt, shiftedBy shift: Int = 0) -> BigUInt { + var result = self + result.subtract(other, shiftedBy: shift) + return result + } + + /// Decrement this integer by one. + /// + /// - Requires: !isZero + /// - Complexity: O(count) + public mutating func decrement(shiftedBy shift: Int = 0) { + self.subtract(1, shiftedBy: shift) + } + + /// Subtract `b` from `a` and return the result. + /// + /// - Requires: a >= b + /// - Complexity: O(a.count) + public static func -(a: BigUInt, b: BigUInt) -> BigUInt { + return a.subtracting(b) + } + + /// Subtract `b` from `a` and store the result in `a`. + /// + /// - Requires: a >= b + /// - Complexity: O(a.count) + public static func -=(a: inout BigUInt, b: BigUInt) { + a.subtract(b) + } +} + +extension BigInt { + public mutating func negate() { + guard !magnitude.isZero else { return } + self.sign = self.sign == .plus ? .minus : .plus + } + + /// Subtract `b` from `a` and return the result. + public static func -(a: BigInt, b: BigInt) -> BigInt { + return a + -b + } + + /// Subtract `b` from `a` in place. + public static func -=(a: inout BigInt, b: BigInt) { a = a - b } +} diff --git a/Carthage/Checkouts/BigInt/Sources/Words and Bits.swift b/Carthage/Checkouts/BigInt/Sources/Words and Bits.swift new file mode 100644 index 00000000..4543c1bc --- /dev/null +++ b/Carthage/Checkouts/BigInt/Sources/Words and Bits.swift @@ -0,0 +1,202 @@ +// +// Words and Bits.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension Array where Element == UInt { + mutating func twosComplement() { + var increment = true + for i in 0 ..< self.count { + if increment { + (self[i], increment) = (~self[i]).addingReportingOverflow(1) + } + else { + self[i] = ~self[i] + } + } + } +} + +extension BigUInt { + public subscript(bitAt index: Int) -> Bool { + get { + precondition(index >= 0) + let (i, j) = index.quotientAndRemainder(dividingBy: Word.bitWidth) + return self[i] & (1 << j) != 0 + } + set { + precondition(index >= 0) + let (i, j) = index.quotientAndRemainder(dividingBy: Word.bitWidth) + if newValue { + self[i] |= 1 << j + } + else { + self[i] &= ~(1 << j) + } + } + } +} + +extension BigUInt { + /// The minimum number of bits required to represent this integer in binary. + /// + /// - Returns: floor(log2(2 * self + 1)) + /// - Complexity: O(1) + public var bitWidth: Int { + guard count > 0 else { return 0 } + return count * Word.bitWidth - self[count - 1].leadingZeroBitCount + } + + /// The number of leading zero bits in the binary representation of this integer in base `2^(Word.bitWidth)`. + /// This is useful when you need to normalize a `BigUInt` such that the top bit of its most significant word is 1. + /// + /// - Note: 0 is considered to have zero leading zero bits. + /// - Returns: A value in `0...(Word.bitWidth - 1)`. + /// - SeeAlso: width + /// - Complexity: O(1) + public var leadingZeroBitCount: Int { + guard count > 0 else { return 0 } + return self[count - 1].leadingZeroBitCount + } + + /// The number of trailing zero bits in the binary representation of this integer. + /// + /// - Note: 0 is considered to have zero trailing zero bits. + /// - Returns: A value in `0...width`. + /// - Complexity: O(count) + public var trailingZeroBitCount: Int { + guard count > 0 else { return 0 } + let i = self.words.firstIndex { $0 != 0 }! + return i * Word.bitWidth + self[i].trailingZeroBitCount + } +} + +extension BigInt { + public var bitWidth: Int { + guard !magnitude.isZero else { return 0 } + return magnitude.bitWidth + 1 + } + + public var trailingZeroBitCount: Int { + // Amazingly, this works fine for negative numbers + return magnitude.trailingZeroBitCount + } +} + +extension BigUInt { + public struct Words: RandomAccessCollection { + private let value: BigUInt + + fileprivate init(_ value: BigUInt) { self.value = value } + + public var startIndex: Int { return 0 } + public var endIndex: Int { return value.count } + + public subscript(_ index: Int) -> Word { + return value[index] + } + } + + public var words: Words { return Words(self) } + + public init(words: Words) where Words.Element == Word { + let uc = words.underestimatedCount + if uc > 2 { + self.init(words: Array(words)) + } + else { + var it = words.makeIterator() + guard let w0 = it.next() else { + self.init() + return + } + guard let w1 = it.next() else { + self.init(word: w0) + return + } + if let w2 = it.next() { + var words: [UInt] = [] + words.reserveCapacity(Swift.max(3, uc)) + words.append(w0) + words.append(w1) + words.append(w2) + while let word = it.next() { + words.append(word) + } + self.init(words: words) + } + else { + self.init(low: w0, high: w1) + } + } + } +} + +extension BigInt { + public struct Words: RandomAccessCollection { + public typealias Indices = CountableRange + + private let value: BigInt + private let decrementLimit: Int + + fileprivate init(_ value: BigInt) { + self.value = value + switch value.sign { + case .plus: + self.decrementLimit = 0 + case .minus: + assert(!value.magnitude.isZero) + self.decrementLimit = value.magnitude.words.firstIndex(where: { $0 != 0 })! + } + } + + public var count: Int { + switch value.sign { + case .plus: + if let high = value.magnitude.words.last, high >> (Word.bitWidth - 1) != 0 { + return value.magnitude.count + 1 + } + return value.magnitude.count + case .minus: + let high = value.magnitude.words.last! + if high >> (Word.bitWidth - 1) != 0 { + return value.magnitude.count + 1 + } + return value.magnitude.count + } + } + + public var indices: Indices { return 0 ..< count } + public var startIndex: Int { return 0 } + public var endIndex: Int { return count } + + public subscript(_ index: Int) -> UInt { + // Note that indices above `endIndex` are accepted. + if value.sign == .plus { + return value.magnitude[index] + } + if index <= decrementLimit { + return ~(value.magnitude[index] &- 1) + } + return ~value.magnitude[index] + } + } + + public var words: Words { + return Words(self) + } + + public init(words: S) where S.Element == Word { + var words = Array(words) + if (words.last ?? 0) >> (Word.bitWidth - 1) == 0 { + self.init(sign: .plus, magnitude: BigUInt(words: words)) + } + else { + words.twosComplement() + self.init(sign: .minus, magnitude: BigUInt(words: words)) + } + } +} diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigIntTests.swift b/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigIntTests.swift new file mode 100644 index 00000000..51e46e3a --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigIntTests.swift @@ -0,0 +1,638 @@ +// +// BigIntTests.swift +// BigIntTests +// +// Created by Károly Lőrentey on 2015-12-26. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import XCTest +@testable import BigInt + +class BigIntTests: XCTestCase { + typealias Word = BigInt.Word + + func testSigns() { + XCTAssertTrue(BigInt.isSigned) + + XCTAssertEqual(BigInt().signum(), 0) + XCTAssertEqual(BigInt(-2).signum(), -1) + XCTAssertEqual(BigInt(-1).signum(), -1) + XCTAssertEqual(BigInt(0).signum(), 0) + XCTAssertEqual(BigInt(1).signum(), 1) + XCTAssertEqual(BigInt(2).signum(), 1) + + XCTAssertEqual(BigInt(words: [0, Word.max]).signum(), -1) + XCTAssertEqual(BigInt(words: [0, 1]).signum(), 1) + } + + func testInit() { + XCTAssertEqual(BigInt().sign, .plus) + XCTAssertEqual(BigInt().magnitude, 0) + + XCTAssertEqual(BigInt(Int64.min).sign, .minus) + XCTAssertEqual(BigInt(Int64.min).magnitude - 1, BigInt(Int64.max).magnitude) + + let zero = BigInt(0) + XCTAssertTrue(zero.magnitude.isZero) + XCTAssertEqual(zero.sign, .plus) + + let minusOne = BigInt(-1) + XCTAssertEqual(minusOne.magnitude, 1) + XCTAssertEqual(minusOne.sign, .minus) + + let b: BigInt = 42 + XCTAssertEqual(b.magnitude, 42) + XCTAssertEqual(b.sign, .plus) + + XCTAssertEqual(BigInt(UInt64.max).magnitude, BigUInt(UInt64.max)) + + let b2: BigInt = "+300" + XCTAssertEqual(b2.magnitude, 300) + XCTAssertEqual(b2.sign, .plus) + + let b3: BigInt = "-300" + XCTAssertEqual(b3.magnitude, 300) + XCTAssertEqual(b3.sign, .minus) + + // We have to call BigInt.init here because we don't want Literal initialization via coercion (SE-0213) + XCTAssertNil(BigInt.init("Not a number")) + XCTAssertEqual(BigInt(unicodeScalarLiteral: UnicodeScalar(52)), BigInt(4)) + XCTAssertEqual(BigInt(extendedGraphemeClusterLiteral: "4"), BigInt(4)) + + XCTAssertEqual(BigInt(words: []), 0) + XCTAssertEqual(BigInt(words: [1, 1]), BigInt(1) << Word.bitWidth + 1) + XCTAssertEqual(BigInt(words: [1, 2]), BigInt(2) << Word.bitWidth + 1) + XCTAssertEqual(BigInt(words: [0, Word.max]), -(BigInt(1) << Word.bitWidth)) + XCTAssertEqual(BigInt(words: [1, Word.max]), -BigInt(Word.max)) + XCTAssertEqual(BigInt(words: [1, Word.max, Word.max]), -BigInt(Word.max)) + + XCTAssertEqual(BigInt(exactly: 1), BigInt(1)) + XCTAssertEqual(BigInt(exactly: -1), BigInt(-1)) + } + + func testInit_FloatingPoint() { + XCTAssertEqual(BigInt(42.0), 42) + XCTAssertEqual(BigInt(-42.0), -42) + XCTAssertEqual(BigInt(42.5), 42) + XCTAssertEqual(BigInt(-42.5), -42) + XCTAssertEqual(BigInt(exactly: 42.0), 42) + XCTAssertEqual(BigInt(exactly: -42.0), -42) + XCTAssertNil(BigInt(exactly: 42.5)) + XCTAssertNil(BigInt(exactly: -42.5)) + XCTAssertNil(BigInt(exactly: Double.leastNormalMagnitude)) + XCTAssertNil(BigInt(exactly: Double.leastNonzeroMagnitude)) + XCTAssertNil(BigInt(exactly: Double.infinity)) + XCTAssertNil(BigInt(exactly: Double.nan)) + XCTAssertNil(BigInt(exactly: Double.signalingNaN)) + XCTAssertEqual(BigInt(clamping: -42), -42) + XCTAssertEqual(BigInt(clamping: 42), 42) + XCTAssertEqual(BigInt(truncatingIfNeeded: -42), -42) + XCTAssertEqual(BigInt(truncatingIfNeeded: 42), 42) + } + + func testInit_Buffer() { + func test(_ b: BigInt, _ d: Array, file: StaticString = #file, line: UInt = #line) { + d.withUnsafeBytes { buffer in + let initialized = BigInt(buffer) + XCTAssertEqual(initialized, b, file: file, line: line) + } + } + + // Positive integers + test(BigInt(), []) + test(BigInt(1), [0x00, 0x01]) + test(BigInt(2), [0x00, 0x02]) + test(BigInt(0x0102030405060708), [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test(BigInt(0x01) << 64 + BigInt(0x0203040506070809), [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]) + + // Negative integers + test(BigInt(), []) + test(BigInt(-1), [0x01, 0x01]) + test(BigInt(-2), [0x01, 0x02]) + test(BigInt(0x0102030405060708) * BigInt(-1), [0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test((BigInt(0x01) << 64 + BigInt(0x0203040506070809)) * BigInt(-1), [0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]) + } + + func testConversionToFloatingPoint() { + func test(_ a: BigInt, _ b: F, file: StaticString = #file, line: UInt = #line) + where F.RawExponent: FixedWidthInteger, F.RawSignificand: FixedWidthInteger { + let f = F(a) + XCTAssertEqual(f, b, file: file, line: line) + } + + for i in -100 ..< 100 { + test(BigInt(i), Double(i)) + } + test(BigInt(0x5A5A5A), 0x5A5A5A as Double) + test(BigInt(1) << 64, 0x1p64 as Double) + test(BigInt(0x5A5A5A) << 64, 0x5A5A5Ap64 as Double) + test(BigInt(1) << 1023, 0x1p1023 as Double) + test(BigInt(10) << 1020, 0xAp1020 as Double) + test(BigInt(1) << 1024, Double.infinity) + test(BigInt(words: convertWords([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFFFFFFFFFFF800, 0])), + Double.greatestFiniteMagnitude) + + for i in -100 ..< 100 { + test(BigInt(i), Float(i)) + } + test(BigInt(0x5A5A5A), 0x5A5A5A as Float) + test(BigInt(1) << 64, 0x1p64 as Float) + test(BigInt(0x5A5A5A) << 64, 0x5A5A5Ap64 as Float) + test(BigInt(1) << 1023, 0x1p1023 as Float) + test(BigInt(10) << 1020, 0xAp1020 as Float) + test(BigInt(1) << 1024, Float.infinity) + test(BigInt(words: convertWords([0, 0xFFFFFF0000000000, 0])), + Float.greatestFiniteMagnitude) + } + + func testTwosComplement() { + func check(_ a: [Word], _ b: [Word], file: StaticString = #file, line: UInt = #line) { + var a2 = a + a2.twosComplement() + XCTAssertEqual(a2, b, file: file, line: line) + var b2 = b + b2.twosComplement() + XCTAssertEqual(b2, a, file: file, line: line) + } + check([1], [Word.max]) + check([Word.max], [1]) + check([1, 1], [Word.max, Word.max - 1]) + check([(1 as Word) << (Word.bitWidth - 1)], [(1 as Word) << (Word.bitWidth - 1)]) + check([0], [0]) + check([0, 0, 1], [0, 0, Word.max]) + check([0, 0, 1, 0, 1], [0, 0, Word.max, Word.max, Word.max - 1]) + check([0, 0, 1, 1], [0, 0, Word.max, Word.max - 1]) + check([0, 0, 1, 0, 0, 0], [0, 0, Word.max, Word.max, Word.max, Word.max]) + } + + func testSign() { + XCTAssertEqual(BigInt(-1).sign, .minus) + XCTAssertEqual(BigInt(0).sign, .plus) + XCTAssertEqual(BigInt(1).sign, .plus) + } + + func testBitWidth() { + XCTAssertEqual(BigInt(0).bitWidth, 0) + XCTAssertEqual(BigInt(1).bitWidth, 2) + XCTAssertEqual(BigInt(-1).bitWidth, 2) + XCTAssertEqual((BigInt(1) << 64).bitWidth, Word.bitWidth + 2) + XCTAssertEqual(BigInt(Word.max).bitWidth, Word.bitWidth + 1) + XCTAssertEqual(BigInt(Word.max >> 1).bitWidth, Word.bitWidth) + } + + func testTrailingZeroBitCount() { + XCTAssertEqual(BigInt(0).trailingZeroBitCount, 0) + XCTAssertEqual(BigInt(1).trailingZeroBitCount, 0) + XCTAssertEqual(BigInt(-1).trailingZeroBitCount, 0) + XCTAssertEqual(BigInt(2).trailingZeroBitCount, 1) + XCTAssertEqual(BigInt(Word.max).trailingZeroBitCount, 0) + XCTAssertEqual(BigInt(-2).trailingZeroBitCount, 1) + XCTAssertEqual(-BigInt(Word.max).trailingZeroBitCount, 0) + XCTAssertEqual((BigInt(1) << 100).trailingZeroBitCount, 100) + XCTAssertEqual(((-BigInt(1)) << 100).trailingZeroBitCount, 100) + } + + func testWords() { + XCTAssertEqual(Array(BigInt(0).words), []) + XCTAssertEqual(Array(BigInt(1).words), [1]) + XCTAssertEqual(Array(BigInt(-1).words), [Word.max]) + + let highBit = (1 as Word) << (Word.bitWidth - 1) + XCTAssertEqual(Array(BigInt(highBit).words), [highBit, 0]) + XCTAssertEqual(Array((-BigInt(highBit)).words), [highBit, Word.max]) + + XCTAssertEqual(Array(BigInt(sign: .plus, magnitude: BigUInt(words: [Word.max])).words), [Word.max, 0]) + XCTAssertEqual(Array(BigInt(sign: .minus, magnitude: BigUInt(words: [Word.max])).words), [1, Word.max]) + + XCTAssertEqual(Array((BigInt(1) << Word.bitWidth).words), [0, 1]) + XCTAssertEqual(Array((-(BigInt(1) << Word.bitWidth)).words), [0, Word.max]) + + XCTAssertEqual(Array((BigInt(42) << Word.bitWidth).words), [0, 42]) + XCTAssertEqual(Array((-(BigInt(42) << Word.bitWidth)).words), [0, Word.max - 41]) + + let huge = BigUInt(words: [0, 1, 2, 3, 4]) + XCTAssertEqual(Array(BigInt(sign: .plus, magnitude: huge).words), [0, 1, 2, 3, 4]) + XCTAssertEqual(Array(BigInt(sign: .minus, magnitude: huge).words), + [0, Word.max, ~2, ~3, ~4] as [Word]) + + + XCTAssertEqual(BigInt(1).words[100], 0) + XCTAssertEqual(BigInt(-1).words[100], Word.max) + + XCTAssertEqual(BigInt(words: [0, 1, 2, 3, 4]).words.indices, 0 ..< 5) + } + + func testComplement() { + XCTAssertEqual(~BigInt(-3), BigInt(2)) + XCTAssertEqual(~BigInt(-2), BigInt(1)) + XCTAssertEqual(~BigInt(-1), BigInt(0)) + XCTAssertEqual(~BigInt(0), BigInt(-1)) + XCTAssertEqual(~BigInt(1), BigInt(-2)) + XCTAssertEqual(~BigInt(2), BigInt(-3)) + + XCTAssertEqual(~BigInt(words: [1, 2, 3, 4]), + BigInt(words: [Word.max - 1, Word.max - 2, Word.max - 3, Word.max - 4])) + XCTAssertEqual(~BigInt(words: [Word.max - 1, Word.max - 2, Word.max - 3, Word.max - 4]), + BigInt(words: [1, 2, 3, 4])) + } + + func testBinaryAnd() { + XCTAssertEqual(BigInt(1) & BigInt(2), 0) + XCTAssertEqual(BigInt(-1) & BigInt(2), 2) + XCTAssertEqual(BigInt(-1) & BigInt(words: [1, 2, 3, 4]), BigInt(words: [1, 2, 3, 4])) + XCTAssertEqual(BigInt(-1) & -BigInt(words: [1, 2, 3, 4]), -BigInt(words: [1, 2, 3, 4])) + XCTAssertEqual(BigInt(Word.max) & BigInt(words: [1, 2, 3, 4]), BigInt(1)) + XCTAssertEqual(BigInt(Word.max) & BigInt(words: [Word.max, 1, 2]), BigInt(Word.max)) + XCTAssertEqual(BigInt(Word.max) & BigInt(words: [Word.max, Word.max - 1]), BigInt(Word.max)) + } + + func testBinaryOr() { + XCTAssertEqual(BigInt(1) | BigInt(2), 3) + XCTAssertEqual(BigInt(-1) | BigInt(2), -1) + XCTAssertEqual(BigInt(-1) | BigInt(words: [1, 2, 3, 4]), -1) + XCTAssertEqual(BigInt(-1) | -BigInt(words: [1, 2, 3, 4]), -1) + XCTAssertEqual(BigInt(Word.max) | BigInt(words: [1, 2, 3, 4]), + BigInt(words: [Word.max, 2, 3, 4])) + XCTAssertEqual(BigInt(Word.max) | BigInt(words: [1, 2, 3, Word.max]), + BigInt(words: [Word.max, 2, 3, Word.max])) + XCTAssertEqual(BigInt(Word.max) | BigInt(words: [Word.max - 1, Word.max - 1]), + BigInt(words: [Word.max, Word.max - 1])) + } + + func testBinaryXor() { + XCTAssertEqual(BigInt(1) ^ BigInt(2), 3) + XCTAssertEqual(BigInt(-1) ^ BigInt(2), -3) + XCTAssertEqual(BigInt(1) ^ BigInt(-2), -1) + XCTAssertEqual(BigInt(-1) ^ BigInt(-2), 1) + XCTAssertEqual(BigInt(-1) ^ BigInt(words: [1, 2, 3, 4]), + BigInt(words: [~1, ~2, ~3, ~4] as [Word])) + XCTAssertEqual(BigInt(-1) ^ -BigInt(words: [1, 2, 3, 4]), + BigInt(words: [0, 2, 3, 4])) + XCTAssertEqual(BigInt(Word.max) ^ BigInt(words: [1, 2, 3, 4]), + BigInt(words: [~1, 2, 3, 4] as [Word])) + XCTAssertEqual(BigInt(Word.max) ^ BigInt(words: [1, 2, 3, Word.max]), + BigInt(words: [~1, 2, 3, Word.max] as [Word])) + XCTAssertEqual(BigInt(Word.max) ^ BigInt(words: [Word.max - 1, Word.max - 1]), + BigInt(words: [1, Word.max - 1])) + } + + func testConversionToString() { + let b = BigInt(-256) + XCTAssertEqual(b.description, "-256") + XCTAssertEqual(String(b, radix: 16, uppercase: true), "-100") + let pql = b.playgroundDescription as? String + if pql == "-256 (9 bits)" {} + else { + XCTFail("Unexpected Playground Quick Look: \(pql ?? "nil")") + } + } + + func testComparable() { + XCTAssertTrue(BigInt(1) == BigInt(1)) + XCTAssertFalse(BigInt(1) == BigInt(-1)) + + XCTAssertTrue(BigInt(1) < BigInt(42)) + XCTAssertFalse(BigInt(1) < -BigInt(42)) + XCTAssertTrue(BigInt(-1) < BigInt(42)) + XCTAssertTrue(BigInt(-42) < BigInt(-1)) + } + + func testHashable() { + XCTAssertEqual(BigInt(1).hashValue, BigInt(1).hashValue) + XCTAssertNotEqual(BigInt(1).hashValue, BigInt(2).hashValue) + XCTAssertNotEqual(BigInt(42).hashValue, BigInt(-42).hashValue) + XCTAssertNotEqual(BigInt(1).hashValue, BigInt(-1).hashValue) + } + + func testStrideable() { + XCTAssertEqual(BigInt(1).advanced(by: 100), 101) + XCTAssertEqual(BigInt(Word.max).advanced(by: 1 as BigInt.Stride), BigInt(1) << Word.bitWidth) + + XCTAssertEqual(BigInt(Word.max).distance(to: BigInt(words: [0, 1])), BigInt(1)) + XCTAssertEqual(BigInt(words: [0, 1]).distance(to: BigInt(Word.max)), BigInt(-1)) + XCTAssertEqual(BigInt(0).distance(to: BigInt(words: [0, 1])), BigInt(words: [0, 1])) + } + + func compare(_ a: Int, _ b: Int, r: Int, file: StaticString = #file, line: UInt = #line, op: (BigInt, BigInt) -> BigInt) { + XCTAssertEqual(op(BigInt(a), BigInt(b)), BigInt(r), file: file, line: line) + } + + func testAddition() { + compare(0, 0, r: 0, op: +) + compare(1, 2, r: 3, op: +) + compare(1, -2, r: -1, op: +) + compare(-1, 2, r: 1, op: +) + compare(-1, -2, r: -3, op: +) + compare(2, -1, r: 1, op: +) + } + + func testNegation() { + XCTAssertEqual(-BigInt(0), BigInt(0)) + XCTAssertEqual(-BigInt(1), BigInt(-1)) + XCTAssertEqual(-BigInt(-1), BigInt(1)) + } + + func testSubtraction() { + compare(0, 0, r: 0, op: -) + compare(2, 1, r: 1, op: -) + compare(2, -1, r: 3, op: -) + compare(-2, 1, r: -3, op: -) + compare(-2, -1, r: -1, op: -) + } + + func testMultiplication() { + compare(0, 0, r: 0, op: *) + compare(0, 1, r: 0, op: *) + compare(1, 0, r: 0, op: *) + compare(0, -1, r: 0, op: *) + compare(-1, 0, r: 0, op: *) + compare(2, 3, r: 6, op: *) + compare(2, -3, r: -6, op: *) + compare(-2, 3, r: -6, op: *) + compare(-2, -3, r: 6, op: *) + } + + func testQuotientAndRemainder() { + func compare(_ a: BigInt, _ b: BigInt, r: (BigInt, BigInt), file: StaticString = #file, line: UInt = #line) { + let actual = a.quotientAndRemainder(dividingBy: b) + XCTAssertEqual(actual.quotient, r.0, "quotient", file: file, line: line) + XCTAssertEqual(actual.remainder, r.1, "remainder", file: file, line: line) + } + + compare(0, 1, r: (0, 0)) + compare(0, -1, r: (0, 0)) + compare(7, 4, r: (1, 3)) + compare(7, -4, r: (-1, 3)) + compare(-7, 4, r: (-1, -3)) + compare(-7, -4, r: (1, -3)) + } + + func testDivision() { + compare(0, 1, r: 0, op: /) + compare(0, -1, r: 0, op: /) + compare(7, 4, r: 1, op: /) + compare(7, -4, r: -1, op: /) + compare(-7, 4, r: -1, op: /) + compare(-7, -4, r: 1, op: /) + } + + func testRemainder() { + compare(0, 1, r: 0, op: %) + compare(0, -1, r: 0, op: %) + compare(7, 4, r: 3, op: %) + compare(7, -4, r: 3, op: %) + compare(-7, 4, r: -3, op: %) + compare(-7, -4, r:-3, op: %) + } + + func testModulo() { + XCTAssertEqual(BigInt(22).modulus(5), 2) + XCTAssertEqual(BigInt(-22).modulus(5), 3) + XCTAssertEqual(BigInt(22).modulus(-5), 2) + XCTAssertEqual(BigInt(-22).modulus(-5), 3) + } + + func testStrideableRequirements() { + XCTAssertEqual(5, BigInt(3).advanced(by: 2)) + XCTAssertEqual(2, BigInt(3).distance(to: 5)) + } + + func testAbsoluteValuableRequirements() { + XCTAssertEqual(BigInt(5), abs(5 as BigInt)) + XCTAssertEqual(BigInt(0), abs(0 as BigInt)) + XCTAssertEqual(BigInt(5), abs(-5 as BigInt)) + } + + func testIntegerArithmeticRequirements() { + XCTAssertEqual(3 as Int64, Int64(3 as BigInt)) + XCTAssertEqual(-3 as Int64, Int64(-3 as BigInt)) + } + + func testAssignmentOperators() { + var a = BigInt(1) + a += 13 + XCTAssertEqual(a, 14) + + a -= 7 + XCTAssertEqual(a, 7) + + a *= 3 + XCTAssertEqual(a, 21) + + a /= 2 + XCTAssertEqual(a, 10) + + a %= 7 + XCTAssertEqual(a, 3) + } + + func testExponentiation() { + XCTAssertEqual(BigInt(0).power(0), 1) + XCTAssertEqual(BigInt(0).power(1), 0) + XCTAssertEqual(BigInt(0).power(2), 0) + + XCTAssertEqual(BigInt(1).power(-2), 1) + XCTAssertEqual(BigInt(1).power(-1), 1) + XCTAssertEqual(BigInt(1).power(0), 1) + XCTAssertEqual(BigInt(1).power(1), 1) + XCTAssertEqual(BigInt(1).power(2), 1) + + XCTAssertEqual(BigInt(2).power(-4), 0) + XCTAssertEqual(BigInt(2).power(-3), 0) + XCTAssertEqual(BigInt(2).power(-2), 0) + XCTAssertEqual(BigInt(2).power(-1), 0) + XCTAssertEqual(BigInt(2).power(0), 1) + XCTAssertEqual(BigInt(2).power(1), 2) + XCTAssertEqual(BigInt(2).power(2), 4) + XCTAssertEqual(BigInt(2).power(3), 8) + XCTAssertEqual(BigInt(2).power(4), 16) + + XCTAssertEqual(BigInt(-1).power(-4), 1) + XCTAssertEqual(BigInt(-1).power(-3), -1) + XCTAssertEqual(BigInt(-1).power(-2), 1) + XCTAssertEqual(BigInt(-1).power(-1), -1) + XCTAssertEqual(BigInt(-1).power(0), 1) + XCTAssertEqual(BigInt(-1).power(1), -1) + XCTAssertEqual(BigInt(-1).power(2), 1) + XCTAssertEqual(BigInt(-1).power(3), -1) + XCTAssertEqual(BigInt(-1).power(4), 1) + + XCTAssertEqual(BigInt(-2).power(-4), 0) + XCTAssertEqual(BigInt(-2).power(-3), 0) + XCTAssertEqual(BigInt(-2).power(-2), 0) + XCTAssertEqual(BigInt(-2).power(-1), 0) + XCTAssertEqual(BigInt(-2).power(0), 1) + XCTAssertEqual(BigInt(-2).power(1), -2) + XCTAssertEqual(BigInt(-2).power(2), 4) + XCTAssertEqual(BigInt(-2).power(3), -8) + XCTAssertEqual(BigInt(-2).power(4), 16) + } + + func testModularExponentiation() { + for i in -5 ... 5 { + for j in -5 ... 5 { + for m in [-7, -5, -3, -2, -1, 1, 2, 3, 5, 7] { + guard i != 0 || j >= 0 else { continue } + XCTAssertEqual(BigInt(i).power(BigInt(j), modulus: BigInt(m)), + BigInt(i).power(j).modulus(BigInt(m)), + "\(i), \(j), \(m)") + } + } + } + } + + func testSquareRoot() { + XCTAssertEqual(BigInt(0).squareRoot(), 0) + XCTAssertEqual(BigInt(1).squareRoot(), 1) + XCTAssertEqual(BigInt(2).squareRoot(), 1) + XCTAssertEqual(BigInt(3).squareRoot(), 1) + XCTAssertEqual(BigInt(4).squareRoot(), 2) + XCTAssertEqual(BigInt(5).squareRoot(), 2) + XCTAssertEqual(BigInt(9).squareRoot(), 3) + } + + func testGCD() { + XCTAssertEqual(BigInt(12).greatestCommonDivisor(with: 15), 3) + XCTAssertEqual(BigInt(-12).greatestCommonDivisor(with: 15), 3) + XCTAssertEqual(BigInt(12).greatestCommonDivisor(with: -15), 3) + XCTAssertEqual(BigInt(-12).greatestCommonDivisor(with: -15), 3) + } + + func testInverse() { + for base in -100 ... 100 { + for modulus in [2, 3, 4, 5] { + let base = BigInt(base) + let modulus = BigInt(modulus) + if let inverse = base.inverse(modulus) { + XCTAssertEqual((base * inverse).modulus(modulus), 1, "\(base), \(modulus), \(inverse)") + } + else { + XCTAssertGreaterThan(BigInt(base).greatestCommonDivisor(with: modulus), 1, "\(base), \(modulus)") + } + } + } + } + + func testPrimes() { + XCTAssertFalse(BigInt(-7).isPrime()) + XCTAssertTrue(BigInt(103).isPrime()) + + XCTAssertFalse(BigInt(-3_215_031_751).isStrongProbablePrime(7)) + XCTAssertTrue(BigInt(3_215_031_751).isStrongProbablePrime(7)) + XCTAssertFalse(BigInt(3_215_031_751).isPrime()) + } + + func testShifts() { + XCTAssertEqual(BigInt(1) << Word.bitWidth, BigInt(words: [0, 1])) + XCTAssertEqual(BigInt(-1) << Word.bitWidth, BigInt(words: [0, Word.max])) + XCTAssertEqual(BigInt(words: [0, 1]) << -Word.bitWidth, BigInt(1)) + + XCTAssertEqual(BigInt(words: [0, 1]) >> Word.bitWidth, BigInt(1)) + XCTAssertEqual(BigInt(-1) >> Word.bitWidth, BigInt(-1)) + XCTAssertEqual(BigInt(1) >> Word.bitWidth, BigInt(0)) + XCTAssertEqual(BigInt(words: [0, Word.max]) >> Word.bitWidth, BigInt(-1)) + XCTAssertEqual(BigInt(1) >> -Word.bitWidth, BigInt(words: [0, 1])) + + XCTAssertEqual(BigInt(1) &<< BigInt(Word.bitWidth), BigInt(words: [0, 1])) + XCTAssertEqual(BigInt(words: [0, 1]) &>> BigInt(Word.bitWidth), BigInt(1)) + } + + func testShiftAssignments() { + + var a: BigInt = 1 + a <<= Word.bitWidth + XCTAssertEqual(a, BigInt(words: [0, 1])) + + a = -1 + a <<= Word.bitWidth + XCTAssertEqual(a, BigInt(words: [0, Word.max])) + + a = BigInt(words: [0, 1]) + a <<= -Word.bitWidth + XCTAssertEqual(a, 1) + + a = BigInt(words: [0, 1]) + a >>= Word.bitWidth + XCTAssertEqual(a, 1) + + a = -1 + a >>= Word.bitWidth + XCTAssertEqual(a, -1) + + a = 1 + a >>= Word.bitWidth + XCTAssertEqual(a, 0) + + a = BigInt(words: [0, Word.max]) + a >>= Word.bitWidth + XCTAssertEqual(a, BigInt(-1)) + + a = 1 + a >>= -Word.bitWidth + XCTAssertEqual(a, BigInt(words: [0, 1])) + + a = 1 + a &<<= BigInt(Word.bitWidth) + XCTAssertEqual(a, BigInt(words: [0, 1])) + + a = BigInt(words: [0, 1]) + a &>>= BigInt(Word.bitWidth) + XCTAssertEqual(a, BigInt(1)) + + } + + func testCodable() { + func test(_ a: BigInt, file: StaticString = #file, line: UInt = #line) { + do { + let json = try JSONEncoder().encode(a) + print(String(data: json, encoding: .utf8)!) + let b = try JSONDecoder().decode(BigInt.self, from: json) + XCTAssertEqual(a, b, file: file, line: line) + } + catch let error { + XCTFail("Error thrown: \(error.localizedDescription)", file: file, line: line) + } + } + test(0) + test(1) + test(-1) + test(0x0102030405060708) + test(-0x0102030405060708) + test(BigInt(1) << 64) + test(-BigInt(1) << 64) + test(BigInt(words: [1, 2, 3, 4, 5, 6, 7])) + test(-BigInt(words: [1, 2, 3, 4, 5, 6, 7])) + + XCTAssertThrowsError(try JSONDecoder().decode(BigUInt.self, from: "[\"*\", 1]".data(using: .utf8)!)) { error in + guard let error = error as? DecodingError else { XCTFail("Expected a decoding error"); return } + guard case .dataCorrupted(let context) = error else { XCTFail("Expected a dataCorrupted error"); return } + XCTAssertEqual(context.debugDescription, "Invalid big integer sign") + } + } + + func testConversionToData() { + func test(_ b: BigInt, _ d: Array, file: StaticString = #file, line: UInt = #line) { + let expected = Data(d) + let actual = b.serialize() + XCTAssertEqual(actual, expected, file: file, line: line) + XCTAssertEqual(BigInt(actual), b, file: file, line: line) + } + + // Positive integers + test(BigInt(), []) + test(BigInt(1), [0x00, 0x01]) + test(BigInt(2), [0x00, 0x02]) + test(BigInt(0x0102030405060708), [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test(BigInt(0x01) << 64 + BigInt(0x0203040506070809), [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 09]) + + // Negative integers + test(BigInt(), []) + test(BigInt(-1), [0x01, 0x01]) + test(BigInt(-2), [0x01, 0x02]) + test(BigInt(0x0102030405060708) * BigInt(-1), [0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test((BigInt(0x01) << 64 + BigInt(0x0203040506070809)) * BigInt(-1), [0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 09]) + + } + +} diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigUIntTests.swift b/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigUIntTests.swift new file mode 100644 index 00000000..d11e3807 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/BigUIntTests.swift @@ -0,0 +1,1481 @@ +// +// BigUIntTests.swift +// BigInt +// +// Created by Károly Lőrentey on 2015-12-27. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import XCTest +import Foundation +@testable import BigInt + +extension BigUInt.Kind: Equatable { + public static func ==(left: BigUInt.Kind, right: BigUInt.Kind) -> Bool { + switch (left, right) { + case let (.inline(l0, l1), .inline(r0, r1)): return l0 == r0 && l1 == r1 + case let (.slice(from: ls, to: le), .slice(from: rs, to: re)): return ls == rs && le == re + case (.array, .array): return true + default: return false + } + } +} + +class BigUIntTests: XCTestCase { + typealias Word = BigUInt.Word + + func check(_ value: BigUInt, _ kind: BigUInt.Kind?, _ words: [Word], file: StaticString = #file, line: UInt = #line) { + if let kind = kind { + XCTAssertEqual( + value.kind, kind, + "Mismatching kind: \(value.kind) vs. \(kind)", + file: file, line: line) + } + XCTAssertEqual( + Array(value.words), words, + "Mismatching words: \(value.words) vs. \(words)", + file: file, line: line) + XCTAssertEqual( + value.isZero, words.isEmpty, + "Mismatching isZero: \(value.isZero) vs. \(words.isEmpty)", + file: file, line: line) + XCTAssertEqual( + value.count, words.count, + "Mismatching count: \(value.count) vs. \(words.count)", + file: file, line: line) + for i in 0 ..< words.count { + XCTAssertEqual( + value[i], words[i], + "Mismatching word at index \(i): \(value[i]) vs. \(words[i])", + file: file, line: line) + } + for i in words.count ..< words.count + 10 { + XCTAssertEqual( + value[i], 0, + "Expected 0 word at index \(i), got \(value[i])", + file: file, line: line) + } + } + + func check(_ value: BigUInt?, _ kind: BigUInt.Kind?, _ words: [Word], file: StaticString = #file, line: UInt = #line) { + guard let value = value else { + XCTFail("Expected non-nil BigUInt", file: file, line: line) + return + } + check(value, kind, words, file: file, line: line) + } + + func testInit_WordBased() { + check(BigUInt(), .inline(0, 0), []) + + check(BigUInt(word: 0), .inline(0, 0), []) + check(BigUInt(word: 1), .inline(1, 0), [1]) + check(BigUInt(word: Word.max), .inline(Word.max, 0), [Word.max]) + + check(BigUInt(low: 0, high: 0), .inline(0, 0), []) + check(BigUInt(low: 0, high: 1), .inline(0, 1), [0, 1]) + check(BigUInt(low: 1, high: 0), .inline(1, 0), [1]) + check(BigUInt(low: 1, high: 2), .inline(1, 2), [1, 2]) + + check(BigUInt(words: []), .array, []) + check(BigUInt(words: [0, 0, 0, 0]), .array, []) + check(BigUInt(words: [1]), .array, [1]) + check(BigUInt(words: [1, 2, 3, 0, 0]), .array, [1, 2, 3]) + check(BigUInt(words: [0, 1, 2, 3, 4]), .array, [0, 1, 2, 3, 4]) + + check(BigUInt(words: [], from: 0, to: 0), .inline(0, 0), []) + check(BigUInt(words: [1, 2, 3, 4], from: 0, to: 4), .array, [1, 2, 3, 4]) + check(BigUInt(words: [1, 2, 3, 4], from: 0, to: 3), .slice(from: 0, to: 3), [1, 2, 3]) + check(BigUInt(words: [1, 2, 3, 4], from: 1, to: 4), .slice(from: 1, to: 4), [2, 3, 4]) + check(BigUInt(words: [1, 2, 3, 4], from: 0, to: 2), .inline(1, 2), [1, 2]) + check(BigUInt(words: [1, 2, 3, 4], from: 0, to: 1), .inline(1, 0), [1]) + check(BigUInt(words: [1, 2, 3, 4], from: 1, to: 1), .inline(0, 0), []) + check(BigUInt(words: [0, 0, 0, 1, 0, 0, 0, 2], from: 0, to: 4), .slice(from: 0, to: 4), [0, 0, 0, 1]) + check(BigUInt(words: [0, 0, 0, 1, 0, 0, 0, 2], from: 0, to: 3), .inline(0, 0), []) + check(BigUInt(words: [0, 0, 0, 1, 0, 0, 0, 2], from: 2, to: 6), .inline(0, 1), [0, 1]) + + check(BigUInt(words: [].lazy), .inline(0, 0), []) + check(BigUInt(words: [1].lazy), .inline(1, 0), [1]) + check(BigUInt(words: [1, 2].lazy), .inline(1, 2), [1, 2]) + check(BigUInt(words: [1, 2, 3].lazy), .array, [1, 2, 3]) + check(BigUInt(words: [1, 2, 3, 0, 0, 0, 0].lazy), .array, [1, 2, 3]) + + check(BigUInt(words: IteratorSequence([].makeIterator())), .inline(0, 0), []) + check(BigUInt(words: IteratorSequence([1].makeIterator())), .inline(1, 0), [1]) + check(BigUInt(words: IteratorSequence([1, 2].makeIterator())), .inline(1, 2), [1, 2]) + check(BigUInt(words: IteratorSequence([1, 2, 3].makeIterator())), .array, [1, 2, 3]) + check(BigUInt(words: IteratorSequence([1, 2, 3, 0, 0, 0, 0].makeIterator())), .array, [1, 2, 3]) + } + + func testInit_BinaryInteger() { + XCTAssertNil(BigUInt(exactly: -42)) + check(BigUInt(exactly: 0 as Int), .inline(0, 0), []) + check(BigUInt(exactly: 42 as Int), .inline(42, 0), [42]) + check(BigUInt(exactly: 43 as UInt), .inline(43, 0), [43]) + check(BigUInt(exactly: 44 as UInt8), .inline(44, 0), [44]) + check(BigUInt(exactly: BigUInt(words: [])), .inline(0, 0), []) + check(BigUInt(exactly: BigUInt(words: [1])), .inline(1, 0), [1]) + check(BigUInt(exactly: BigUInt(words: [1, 2])), .inline(1, 2), [1, 2]) + check(BigUInt(exactly: BigUInt(words: [1, 2, 3, 4])), .array, [1, 2, 3, 4]) + } + + func testInit_FloatingPoint() { + check(BigUInt(exactly: -0.0 as Float), nil, []) + check(BigUInt(exactly: -0.0 as Double), nil, []) + + XCTAssertNil(BigUInt(exactly: -42.0 as Float)) + XCTAssertNil(BigUInt(exactly: -42.0 as Double)) + + XCTAssertNil(BigUInt(exactly: 42.5 as Float)) + XCTAssertNil(BigUInt(exactly: 42.5 as Double)) + + check(BigUInt(exactly: 100 as Float), nil, [100]) + check(BigUInt(exactly: 100 as Double), nil, [100]) + + check(BigUInt(exactly: Float.greatestFiniteMagnitude), nil, + convertWords([0, 0xFFFFFF0000000000])) + + check(BigUInt(exactly: Double.greatestFiniteMagnitude), nil, + convertWords([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFFFFFFFFFFF800])) + + XCTAssertNil(BigUInt(exactly: Float.leastNormalMagnitude)) + XCTAssertNil(BigUInt(exactly: Double.leastNormalMagnitude)) + + XCTAssertNil(BigUInt(exactly: Float.infinity)) + XCTAssertNil(BigUInt(exactly: Double.infinity)) + + XCTAssertNil(BigUInt(exactly: Float.nan)) + XCTAssertNil(BigUInt(exactly: Double.nan)) + + check(BigUInt(0 as Float), nil, []) + check(BigUInt(Float.leastNonzeroMagnitude), nil, []) + check(BigUInt(Float.leastNormalMagnitude), nil, []) + check(BigUInt(0.5 as Float), nil, []) + check(BigUInt(1.5 as Float), nil, [1]) + check(BigUInt(42 as Float), nil, [42]) + check(BigUInt(Double(sign: .plus, exponent: 2 * Word.bitWidth, significand: 1.0)), + nil, [0, 0, 1]) + } + + func testInit_Buffer() { + func test(_ b: BigUInt, _ d: Array, file: StaticString = #file, line: UInt = #line) { + d.withUnsafeBytes { buffer in + let initialized = BigUInt(buffer) + XCTAssertEqual(initialized, b, file: file, line: line) + } + } + + // Positive integers + test(BigUInt(), []) + test(BigUInt(1), [0x01]) + test(BigUInt(2), [0x02]) + test(BigUInt(0x0102030405060708), [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test(BigUInt(0x01) << 64 + BigUInt(0x0203040506070809), [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 09]) + } + + func testConversionToFloatingPoint() { + func test(_ a: BigUInt, _ b: F, file: StaticString = #file, line: UInt = #line) + where F.RawExponent: FixedWidthInteger, F.RawSignificand: FixedWidthInteger { + let f = F(a) + XCTAssertEqual(f, b, file: file, line: line) + } + + for i in 0 ..< 100 { + test(BigUInt(i), Double(i)) + } + test(BigUInt(0x5A5A5A), 0x5A5A5A as Double) + test(BigUInt(1) << 64, 0x1p64 as Double) + test(BigUInt(0x5A5A5A) << 64, 0x5A5A5Ap64 as Double) + test(BigUInt(1) << 1023, 0x1p1023 as Double) + test(BigUInt(10) << 1020, 0xAp1020 as Double) + test(BigUInt(1) << 1024, Double.infinity) + test(BigUInt(words: convertWords([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFFFFFFFFFFFFF800])), + Double.greatestFiniteMagnitude) + test(BigUInt(UInt64.max), 0x1p64 as Double) + + for i in 0 ..< 100 { + test(BigUInt(i), Float(i)) + } + test(BigUInt(0x5A5A5A), 0x5A5A5A as Float) + test(BigUInt(1) << 64, 0x1p64 as Float) + test(BigUInt(0x5A5A5A) << 64, 0x5A5A5Ap64 as Float) + test(BigUInt(1) << 1023, 0x1p1023 as Float) + test(BigUInt(10) << 1020, 0xAp1020 as Float) + test(BigUInt(1) << 1024, Float.infinity) + test(BigUInt(words: convertWords([0, 0xFFFFFF0000000000])), + Float.greatestFiniteMagnitude) + + // Test rounding + test(BigUInt(0xFFFFFF0000000000 as UInt64), 0xFFFFFFp40 as Float) + test(BigUInt(0xFFFFFF7FFFFFFFFF as UInt64), 0xFFFFFFp40 as Float) + test(BigUInt(0xFFFFFF8000000000 as UInt64), 0x1p64 as Float) + test(BigUInt(0xFFFFFFFFFFFFFFFF as UInt64), 0x1p64 as Float) + + test(BigUInt(0xFFFFFE0000000000 as UInt64), 0xFFFFFEp40 as Float) + test(BigUInt(0xFFFFFE7FFFFFFFFF as UInt64), 0xFFFFFEp40 as Float) + test(BigUInt(0xFFFFFE8000000000 as UInt64), 0xFFFFFEp40 as Float) + test(BigUInt(0xFFFFFEFFFFFFFFFF as UInt64), 0xFFFFFEp40 as Float) + + test(BigUInt(0x8000010000000000 as UInt64), 0x800001p40 as Float) + test(BigUInt(0x8000017FFFFFFFFF as UInt64), 0x800001p40 as Float) + test(BigUInt(0x8000018000000000 as UInt64), 0x800002p40 as Float) + test(BigUInt(0x800001FFFFFFFFFF as UInt64), 0x800002p40 as Float) + + test(BigUInt(0x8000020000000000 as UInt64), 0x800002p40 as Float) + test(BigUInt(0x8000027FFFFFFFFF as UInt64), 0x800002p40 as Float) + test(BigUInt(0x8000028000000000 as UInt64), 0x800002p40 as Float) + test(BigUInt(0x800002FFFFFFFFFF as UInt64), 0x800002p40 as Float) + } + + func testInit_Misc() { + check(BigUInt(0), .inline(0, 0), []) + check(BigUInt(42), .inline(42, 0), [42]) + check(BigUInt(BigUInt(words: [1, 2, 3])), .array, [1, 2, 3]) + + check(BigUInt(truncatingIfNeeded: 0 as Int8), .inline(0, 0), []) + check(BigUInt(truncatingIfNeeded: 1 as Int8), .inline(1, 0), [1]) + check(BigUInt(truncatingIfNeeded: -1 as Int8), .inline(Word.max, 0), [Word.max]) + check(BigUInt(truncatingIfNeeded: BigUInt(words: [1, 2, 3])), .array, [1, 2, 3]) + + check(BigUInt(clamping: 0), .inline(0, 0), []) + check(BigUInt(clamping: -100), .inline(0, 0), []) + check(BigUInt(clamping: Word.max), .inline(Word.max, 0), [Word.max]) + } + + func testEnsureArray() { + var a = BigUInt() + a.ensureArray() + check(a, .array, []) + + a = BigUInt(word: 1) + a.ensureArray() + check(a, .array, [1]) + + a = BigUInt(low: 1, high: 2) + a.ensureArray() + check(a, .array, [1, 2]) + + a = BigUInt(words: [1, 2, 3, 4]) + a.ensureArray() + check(a, .array, [1, 2, 3, 4]) + + a = BigUInt(words: [1, 2, 3, 4, 5, 6], from: 1, to: 5) + a.ensureArray() + check(a, .array, [2, 3, 4, 5]) + } + + func testCapacity() { + XCTAssertEqual(BigUInt(low: 1, high: 2).capacity, 0) + XCTAssertEqual(BigUInt(words: 1 ..< 10).extract(2 ..< 5).capacity, 0) + var words: [Word] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + words.reserveCapacity(100) + XCTAssertGreaterThanOrEqual(BigUInt(words: words).capacity, 100) + } + + func testReserveCapacity() { + var a = BigUInt() + a.reserveCapacity(100) + check(a, .array, []) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a = BigUInt(word: 1) + a.reserveCapacity(100) + check(a, .array, [1]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a = BigUInt(low: 1, high: 2) + a.reserveCapacity(100) + check(a, .array, [1, 2]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a = BigUInt(words: [1, 2, 3, 4]) + a.reserveCapacity(100) + check(a, .array, [1, 2, 3, 4]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a = BigUInt(words: [1, 2, 3, 4, 5, 6], from: 1, to: 5) + a.reserveCapacity(100) + check(a, .array, [2, 3, 4, 5]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + } + + func testLoad() { + var a: BigUInt = 0 + a.reserveCapacity(100) + + a.load(BigUInt(low: 1, high: 2)) + check(a, .array, [1, 2]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a.load(BigUInt(words: [1, 2, 3, 4, 5, 6])) + check(a, .array, [1, 2, 3, 4, 5, 6]) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + + a.clear() + check(a, .array, []) + XCTAssertGreaterThanOrEqual(a.capacity, 100) + } + + func testInitFromLiterals() { + check(0, .inline(0, 0), []) + check(42, .inline(42, 0), [42]) + check("42", .inline(42, 0), [42]) + + check("1512366075204170947332355369683137040", + .inline(0xFEDCBA9876543210, 0x0123456789ABCDEF), + [0xFEDCBA9876543210, 0x0123456789ABCDEF]) + + // I have no idea how to exercise these in the wild + check(BigUInt(unicodeScalarLiteral: UnicodeScalar(52)), .inline(4, 0), [4]) + check(BigUInt(extendedGraphemeClusterLiteral: "4"), .inline(4, 0), [4]) + } + + func testSubscriptingGetter() { + let a = BigUInt(words: [1, 2]) + XCTAssertEqual(a[0], 1) + XCTAssertEqual(a[1], 2) + XCTAssertEqual(a[2], 0) + XCTAssertEqual(a[3], 0) + XCTAssertEqual(a[10000], 0) + + let b = BigUInt(low: 1, high: 2) + XCTAssertEqual(b[0], 1) + XCTAssertEqual(b[1], 2) + XCTAssertEqual(b[2], 0) + XCTAssertEqual(b[3], 0) + XCTAssertEqual(b[10000], 0) + } + + func testSubscriptingSetter() { + var a = BigUInt() + + check(a, .inline(0, 0), []) + a[10] = 0 + check(a, .inline(0, 0), []) + a[0] = 42 + check(a, .inline(42, 0), [42]) + a[10] = 23 + check(a, .array, [42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23]) + a[0] = 0 + check(a, .array, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23]) + a[10] = 0 + check(a, .array, []) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 5) + a[2] = 42 + check(a, .array, [1, 2, 42, 4]) + } + + func testSlice() { + let a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + check(a.extract(3 ..< 6), .slice(from: 3, to: 6), [3, 4, 5]) + check(a.extract(3 ..< 5), .inline(3, 4), [3, 4]) + check(a.extract(3 ..< 4), .inline(3, 0), [3]) + check(a.extract(3 ..< 3), .inline(0, 0), []) + check(a.extract(0 ..< 100), .array, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + check(a.extract(100 ..< 200), .inline(0, 0), []) + + let b = BigUInt(low: 1, high: 2) + check(b.extract(0 ..< 2), .inline(1, 2), [1, 2]) + check(b.extract(0 ..< 1), .inline(1, 0), [1]) + check(b.extract(1 ..< 2), .inline(2, 0), [2]) + check(b.extract(1 ..< 1), .inline(0, 0), []) + check(b.extract(0 ..< 100), .inline(1, 2), [1, 2]) + check(b.extract(100 ..< 200), .inline(0, 0), []) + + let c = BigUInt(words: [1, 0, 0, 0, 2, 0, 0, 0, 3, 4, 5, 0, 0, 6, 0, 0, 0, 7]) + check(c.extract(0 ..< 4), .inline(1, 0), [1]) + check(c.extract(1 ..< 5), .slice(from: 1, to: 5), [0, 0, 0, 2]) + check(c.extract(1 ..< 8), .slice(from: 1, to: 5), [0, 0, 0, 2]) + check(c.extract(6 ..< 12), .slice(from: 6, to: 11), [0, 0, 3, 4, 5]) + check(c.extract(4 ..< 7), .inline(2, 0), [2]) + + let d = c.extract(3 ..< 14) + // 0 1 2 3 4 5 6 7 8 9 10 + check(d, .slice(from: 3, to: 14), [0, 2, 0, 0, 0, 3, 4, 5, 0, 0, 6]) + check(d.extract(1 ..< 5), .inline(2, 0), [2]) + check(d.extract(0 ..< 3), .inline(0, 2), [0, 2]) + check(d.extract(1 ..< 6), .slice(from: 4, to: 9), [2, 0, 0, 0, 3]) + check(d.extract(7 ..< 1000), .slice(from: 10, to: 14), [5, 0, 0, 6]) + check(d.extract(10 ..< 1000), .inline(6, 0), [6]) + check(d.extract(11 ..< 1000), .inline(0, 0), []) + } + + func testSigns() { + XCTAssertFalse(BigUInt.isSigned) + + XCTAssertEqual(BigUInt().signum(), 0) + XCTAssertEqual(BigUInt(words: []).signum(), 0) + XCTAssertEqual(BigUInt(words: [0, 1, 2]).signum(), 1) + XCTAssertEqual(BigUInt(word: 42).signum(), 1) + } + + func testBits() { + let indices: Set = [0, 13, 59, 64, 79, 130] + var value: BigUInt = 0 + for i in indices { + value[bitAt: i] = true + } + for i in 0 ..< 300 { + XCTAssertEqual(value[bitAt: i], indices.contains(i)) + } + check(value, nil, convertWords([0x0800000000002001, 0x8001, 0x04])) + for i in indices { + value[bitAt: i] = false + } + check(value, nil, []) + } + + func testStrideableRequirements() { + XCTAssertEqual(BigUInt(10), BigUInt(4).advanced(by: BigInt(6))) + XCTAssertEqual(BigUInt(4), BigUInt(10).advanced(by: BigInt(-6))) + XCTAssertEqual(BigInt(6), BigUInt(4).distance(to: 10)) + XCTAssertEqual(BigInt(-6), BigUInt(10).distance(to: 4)) + } + + func testRightShift_ByWord() { + var a = BigUInt() + a.shiftRight(byWords: 1) + check(a, .inline(0, 0), []) + + a = BigUInt(low: 1, high: 2) + a.shiftRight(byWords: 0) + check(a, .inline(1, 2), [1, 2]) + + a = BigUInt(low: 1, high: 2) + a.shiftRight(byWords: 1) + check(a, .inline(2, 0), [2]) + + a = BigUInt(low: 1, high: 2) + a.shiftRight(byWords: 2) + check(a, .inline(0, 0), []) + + a = BigUInt(low: 1, high: 2) + a.shiftRight(byWords: 10) + check(a, .inline(0, 0), []) + + + a = BigUInt(words: [0, 1, 2, 3, 4]) + a.shiftRight(byWords: 1) + check(a, .array, [1, 2, 3, 4]) + + a = BigUInt(words: [0, 1, 2, 3, 4]) + a.shiftRight(byWords: 2) + check(a, .array, [2, 3, 4]) + + a = BigUInt(words: [0, 1, 2, 3, 4]) + a.shiftRight(byWords: 5) + check(a, .array, []) + + a = BigUInt(words: [0, 1, 2, 3, 4]) + a.shiftRight(byWords: 100) + check(a, .array, []) + + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + check(a, .slice(from: 1, to: 6), [1, 2, 3, 4, 5]) + a.shiftRight(byWords: 1) + check(a, .slice(from: 2, to: 6), [2, 3, 4, 5]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + a.shiftRight(byWords: 2) + check(a, .slice(from: 3, to: 6), [3, 4, 5]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + a.shiftRight(byWords: 3) + check(a, .inline(4, 5), [4, 5]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + a.shiftRight(byWords: 4) + check(a, .inline(5, 0), [5]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + a.shiftRight(byWords: 5) + check(a, .inline(0, 0), []) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 1, to: 6) + a.shiftRight(byWords: 10) + check(a, .inline(0, 0), []) + } + + func testLeftShift_ByWord() { + var a = BigUInt() + a.shiftLeft(byWords: 1) + check(a, .inline(0, 0), []) + + a = BigUInt(word: 1) + a.shiftLeft(byWords: 0) + check(a, .inline(1, 0), [1]) + + a = BigUInt(word: 1) + a.shiftLeft(byWords: 1) + check(a, .inline(0, 1), [0, 1]) + + a = BigUInt(word: 1) + a.shiftLeft(byWords: 2) + check(a, .array, [0, 0, 1]) + + a = BigUInt(low: 1, high: 2) + a.shiftLeft(byWords: 1) + check(a, .array, [0, 1, 2]) + + a = BigUInt(low: 1, high: 2) + a.shiftLeft(byWords: 2) + check(a, .array, [0, 0, 1, 2]) + + a = BigUInt(words: [1, 2, 3, 4, 5, 6]) + a.shiftLeft(byWords: 1) + check(a, .array, [0, 1, 2, 3, 4, 5, 6]) + + a = BigUInt(words: [1, 2, 3, 4, 5, 6]) + a.shiftLeft(byWords: 10) + check(a, .array, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 2, to: 6) + a.shiftLeft(byWords: 1) + check(a, .array, [0, 2, 3, 4, 5]) + + a = BigUInt(words: [0, 1, 2, 3, 4, 5, 6], from: 2, to: 6) + a.shiftLeft(byWords: 3) + check(a, .array, [0, 0, 0, 2, 3, 4, 5]) + } + + func testSplit() { + let a = BigUInt(words: [0, 1, 2, 3]) + XCTAssertEqual(a.split.low, BigUInt(words: [0, 1])) + XCTAssertEqual(a.split.high, BigUInt(words: [2, 3])) + } + + func testLowHigh() { + let a = BigUInt(words: [0, 1, 2, 3]) + check(a.low, .inline(0, 1), [0, 1]) + check(a.high, .inline(2, 3), [2, 3]) + check(a.low.low, .inline(0, 0), []) + check(a.low.high, .inline(1, 0), [1]) + check(a.high.low, .inline(2, 0), [2]) + check(a.high.high, .inline(3, 0), [3]) + + let b = BigUInt(words: [0, 1, 2, 3, 4, 5]) + + let bl = b.low + check(bl, .slice(from: 0, to: 3), [0, 1, 2]) + let bh = b.high + check(bh, .slice(from: 3, to: 6), [3, 4, 5]) + + let bll = bl.low + check(bll, .inline(0, 1), [0, 1]) + let blh = bl.high + check(blh, .inline(2, 0), [2]) + let bhl = bh.low + check(bhl, .inline(3, 4), [3, 4]) + let bhh = bh.high + check(bhh, .inline(5, 0), [5]) + + let blhl = bll.low + check(blhl, .inline(0, 0), []) + let blhh = bll.high + check(blhh, .inline(1, 0), [1]) + let bhhl = bhl.low + check(bhhl, .inline(3, 0), [3]) + let bhhh = bhl.high + check(bhhh, .inline(4, 0), [4]) + } + + func testComparison() { + XCTAssertEqual(BigUInt(words: [1, 2, 3]), BigUInt(words: [1, 2, 3])) + XCTAssertNotEqual(BigUInt(words: [1, 2]), BigUInt(words: [1, 2, 3])) + XCTAssertNotEqual(BigUInt(words: [1, 2, 3]), BigUInt(words: [1, 3, 3])) + XCTAssertEqual(BigUInt(words: [1, 2, 3, 4, 5, 6]).low.high, BigUInt(words: [3])) + + XCTAssertTrue(BigUInt(words: [1, 2]) < BigUInt(words: [1, 2, 3])) + XCTAssertTrue(BigUInt(words: [1, 2, 2]) < BigUInt(words: [1, 2, 3])) + XCTAssertFalse(BigUInt(words: [1, 2, 3]) < BigUInt(words: [1, 2, 3])) + XCTAssertTrue(BigUInt(words: [3, 3]) < BigUInt(words: [1, 2, 3, 4, 5, 6]).extract(2 ..< 4)) + XCTAssertTrue(BigUInt(words: [1, 2, 3, 4, 5, 6]).low.high < BigUInt(words: [3, 5])) + } + + func testHashing() { + var hashes: [Int] = [] + hashes.append(BigUInt(words: []).hashValue) + hashes.append(BigUInt(words: [1]).hashValue) + hashes.append(BigUInt(words: [2]).hashValue) + hashes.append(BigUInt(words: [0, 1]).hashValue) + hashes.append(BigUInt(words: [1, 1]).hashValue) + hashes.append(BigUInt(words: [1, 2]).hashValue) + hashes.append(BigUInt(words: [2, 1]).hashValue) + hashes.append(BigUInt(words: [2, 2]).hashValue) + hashes.append(BigUInt(words: [1, 2, 3, 4, 5]).hashValue) + hashes.append(BigUInt(words: [5, 4, 3, 2, 1]).hashValue) + hashes.append(BigUInt(words: [Word.max]).hashValue) + hashes.append(BigUInt(words: [Word.max, Word.max]).hashValue) + hashes.append(BigUInt(words: [Word.max, Word.max, Word.max]).hashValue) + hashes.append(BigUInt(words: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).hashValue) + XCTAssertEqual(hashes.count, Set(hashes).count) + } + + func checkData(_ bytes: [UInt8], _ value: BigUInt, file: StaticString = #file, line: UInt = #line) { + XCTAssertEqual(BigUInt(Data(bytes)), value, file: file, line: line) + XCTAssertEqual(bytes.withUnsafeBytes { buffer in BigUInt(buffer) }, value, file: file, line: line) + } + + func testConversionFromBytes() { + checkData([], 0) + checkData([0], 0) + checkData([0, 0, 0, 0, 0, 0, 0, 0], 0) + checkData([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 0) + checkData([1], 1) + checkData([2], 2) + checkData([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 1) + checkData([0x01, 0x02, 0x03, 0x04, 0x05], 0x0102030405) + checkData([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08], 0x0102030405060708) + checkData([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A], + BigUInt(0x0102) << 64 + BigUInt(0x030405060708090A)) + checkData([0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + BigUInt(1) << 80) + checkData([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10], + BigUInt(0x0102030405060708) << 64 + BigUInt(0x090A0B0C0D0E0F10)) + checkData([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11], + ((BigUInt(1) << 128) as BigUInt) + BigUInt(0x0203040506070809) << 64 + BigUInt(0x0A0B0C0D0E0F1011)) + } + + func testConversionToData() { + func test(_ b: BigUInt, _ d: Array, file: StaticString = #file, line: UInt = #line) { + let expected = Data(d) + let actual = b.serialize() + XCTAssertEqual(actual, expected, file: file, line: line) + XCTAssertEqual(BigUInt(actual), b, file: file, line: line) + } + + test(BigUInt(), []) + test(BigUInt(1), [0x01]) + test(BigUInt(2), [0x02]) + test(BigUInt(0x0102030405060708), [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]) + test(BigUInt(0x01) << 64 + BigUInt(0x0203040506070809), [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]) + } + + func testCodable() { + func test(_ a: BigUInt, file: StaticString = #file, line: UInt = #line) { + do { + let json = try JSONEncoder().encode(a) + print(String(data: json, encoding: .utf8)!) + let b = try JSONDecoder().decode(BigUInt.self, from: json) + XCTAssertEqual(a, b, file: file, line: line) + } + catch let error { + XCTFail("Error thrown: \(error.localizedDescription)", file: file, line: line) + } + } + test(0) + test(1) + test(0x0102030405060708) + test(BigUInt(1) << 64) + test(BigUInt(words: [1, 2, 3, 4, 5, 6, 7])) + + XCTAssertThrowsError(try JSONDecoder().decode(BigUInt.self, from: "[\"*\", 1]".data(using: .utf8)!)) { error in + guard let error = error as? DecodingError else { XCTFail("Expected a decoding error"); return } + guard case .dataCorrupted(let context) = error else { XCTFail("Expected a dataCorrupted error"); return } + XCTAssertEqual(context.debugDescription, "Invalid big integer sign") + } + XCTAssertThrowsError(try JSONDecoder().decode(BigUInt.self, from: "[\"-\", 1]".data(using: .utf8)!)) { error in + guard let error = error as? DecodingError else { XCTFail("Expected a decoding error"); return } + guard case .dataCorrupted(let context) = error else { XCTFail("Expected a dataCorrupted error"); return } + XCTAssertEqual(context.debugDescription, "BigUInt cannot hold a negative value") + } + } + + func testAddition() { + XCTAssertEqual(BigUInt(0) + BigUInt(0), BigUInt(0)) + XCTAssertEqual(BigUInt(0) + BigUInt(Word.max), BigUInt(Word.max)) + XCTAssertEqual(BigUInt(Word.max) + BigUInt(1), BigUInt(words: [0, 1])) + + check(BigUInt(3) + BigUInt(42), .inline(45, 0), [45]) + check(BigUInt(3) + BigUInt(42), .inline(45, 0), [45]) + + check(0 + BigUInt(Word.max), .inline(Word.max, 0), [Word.max]) + check(1 + BigUInt(Word.max), .inline(0, 1), [0, 1]) + check(BigUInt(low: 0, high: 1) + BigUInt(low: 3, high: 4), .inline(3, 5), [3, 5]) + check(BigUInt(low: 3, high: 5) + BigUInt(low: 0, high: Word.max), .array, [3, 4, 1]) + check(BigUInt(words: [3, 4, 1]) + BigUInt(low: 0, high: Word.max), .array, [3, 3, 2]) + check(BigUInt(words: [3, 3, 2]) + 2, .array, [5, 3, 2]) + check(BigUInt(words: [Word.max - 5, Word.max, 4, Word.max]).addingWord(6), .array, [0, 0, 5, Word.max]) + + var b = BigUInt(words: [Word.max, 2, Word.max]) + b.increment() + check(b, .array, [0, 3, Word.max]) + } + + func testShiftedAddition() { + var b = BigUInt() + b.add(1, shiftedBy: 1) + check(b, .inline(0, 1), [0, 1]) + + b.add(2, shiftedBy: 3) + check(b, .array, [0, 1, 0, 2]) + + b.add(BigUInt(Word.max), shiftedBy: 1) + check(b, .array, [0, 0, 1, 2]) + } + + func testSubtraction() { + var a1 = BigUInt(words: [1, 2, 3, 4]) + XCTAssertEqual(false, a1.subtractWordReportingOverflow(3, shiftedBy: 1)) + check(a1, .array, [1, Word.max, 2, 4]) + + let (diff, overflow) = BigUInt(words: [1, 2, 3, 4]).subtractingWordReportingOverflow(2) + XCTAssertEqual(false, overflow) + check(diff, .array, [Word.max, 1, 3, 4]) + + var a2 = BigUInt(words: [1, 2, 3, 4]) + XCTAssertEqual(true, a2.subtractWordReportingOverflow(5, shiftedBy: 3)) + check(a2, .array, [1, 2, 3, Word.max]) + + var a3 = BigUInt(words: [1, 2, 3, 4]) + a3.subtractWord(4, shiftedBy: 3) + check(a3, .array, [1, 2, 3]) + + var a4 = BigUInt(words: [1, 2, 3, 4]) + a4.decrement() + check(a4, .array, [0, 2, 3, 4]) + a4.decrement() + check(a4, .array, [Word.max, 1, 3, 4]) + + check(BigUInt(words: [1, 2, 3, 4]).subtractingWord(5), + .array, [Word.max - 3, 1, 3, 4]) + + check(BigUInt(0) - BigUInt(0), .inline(0, 0), []) + + var b = BigUInt(words: [1, 2, 3, 4]) + XCTAssertEqual(false, b.subtractReportingOverflow(BigUInt(words: [0, 1, 1, 1]))) + check(b, .array, [1, 1, 2, 3]) + + let b1 = BigUInt(words: [1, 1, 2, 3]).subtractingReportingOverflow(BigUInt(words: [1, 1, 3, 3])) + XCTAssertEqual(true, b1.overflow) + check(b1.partialValue, .array, [0, 0, Word.max, Word.max]) + + let b2 = BigUInt(words: [0, 0, 1]) - BigUInt(words: [1]) + check(b2, .array, [Word.max, Word.max]) + + var b3 = BigUInt(words: [1, 0, 0, 1]) + b3 -= 2 + check(b3, .array, [Word.max, Word.max, Word.max]) + + check(BigUInt(42) - BigUInt(23), .inline(19, 0), [19]) + } + + func testMultiplyByWord() { + check(BigUInt(words: [1, 2, 3, 4]).multiplied(byWord: 0), .inline(0, 0), []) + check(BigUInt(words: [1, 2, 3, 4]).multiplied(byWord: 2), .array, [2, 4, 6, 8]) + + let full = Word.max + + check(BigUInt(words: [full, 0, full, 0, full]).multiplied(byWord: 2), + .array, [full - 1, 1, full - 1, 1, full - 1, 1]) + + check(BigUInt(words: [full, full, full]).multiplied(byWord: 2), + .array, [full - 1, full, full, 1]) + + check(BigUInt(words: [full, full, full]).multiplied(byWord: full), + .array, [1, full, full, full - 1]) + + check(BigUInt("11111111111111111111111111111111", radix: 16)!.multiplied(byWord: 15), + .array, convertWords([UInt64.max, UInt64.max])) + + check(BigUInt("11111111111111111111111111111112", radix: 16)!.multiplied(byWord: 15), + .array, convertWords([0xE, 0, 0x1])) + + check(BigUInt(low: 1, high: 2).multiplied(byWord: 3), .inline(3, 6), [3, 6]) + } + + func testMultiplication() { + func test() { + check(BigUInt(low: 1, high: 1) * BigUInt(word: 3), .inline(3, 3), [3, 3]) + check(BigUInt(word: 4) * BigUInt(low: 1, high: 2), .inline(4, 8), [4, 8]) + + XCTAssertEqual( + BigUInt(words: [1, 2, 3, 4]) * BigUInt(), + BigUInt()) + XCTAssertEqual( + BigUInt() * BigUInt(words: [1, 2, 3, 4]), + BigUInt()) + XCTAssertEqual( + BigUInt(words: [1, 2, 3, 4]) * BigUInt(words: [2]), + BigUInt(words: [2, 4, 6, 8])) + XCTAssertEqual( + BigUInt(words: [1, 2, 3, 4]).multiplied(by: BigUInt(words: [2])), + BigUInt(words: [2, 4, 6, 8])) + XCTAssertEqual( + BigUInt(words: [2]) * BigUInt(words: [1, 2, 3, 4]), + BigUInt(words: [2, 4, 6, 8])) + XCTAssertEqual( + BigUInt(words: [1, 2, 3, 4]) * BigUInt(words: [0, 1]), + BigUInt(words: [0, 1, 2, 3, 4])) + XCTAssertEqual( + BigUInt(words: [0, 1]) * BigUInt(words: [1, 2, 3, 4]), + BigUInt(words: [0, 1, 2, 3, 4])) + XCTAssertEqual( + BigUInt(words: [4, 3, 2, 1]) * BigUInt(words: [1, 2, 3, 4]), + BigUInt(words: [4, 11, 20, 30, 20, 11, 4])) + // 999 * 99 = 98901 + XCTAssertEqual( + BigUInt(words: [Word.max, Word.max, Word.max]) * BigUInt(words: [Word.max, Word.max]), + BigUInt(words: [1, 0, Word.max, Word.max - 1, Word.max])) + XCTAssertEqual( + BigUInt(words: [1, 2]) * BigUInt(words: [2, 1]), + BigUInt(words: [2, 5, 2])) + + var b = BigUInt("2637AB28", radix: 16)! + b *= BigUInt("164B", radix: 16)! + XCTAssertEqual(b, BigUInt("353FB0494B8", radix: 16)) + + XCTAssertEqual(BigUInt("16B60", radix: 16)! * BigUInt("33E28", radix: 16)!, BigUInt("49A5A0700", radix: 16)!) + } + + test() + // Disable brute force multiplication. + let limit = BigUInt.directMultiplicationLimit + BigUInt.directMultiplicationLimit = 0 + defer { BigUInt.directMultiplicationLimit = limit } + + test() + } + + func testDivision() { + func test(_ a: [Word], _ b: [Word], file: StaticString = #file, line: UInt = #line) { + let x = BigUInt(words: a) + let y = BigUInt(words: b) + let (div, mod) = x.quotientAndRemainder(dividingBy: y) + if mod >= y { + XCTFail("x:\(x) = div:\(div) * y:\(y) + mod:\(mod)", file: file, line: line) + } + if div * y + mod != x { + XCTFail("x:\(x) = div:\(div) * y:\(y) + mod:\(mod)", file: file, line: line) + } + + let shift = y.leadingZeroBitCount + let norm = y << shift + var rem = x + rem.formRemainder(dividingBy: norm, normalizedBy: shift) + XCTAssertEqual(rem, mod, file: file, line: line) + } + + // These cases exercise all code paths in the division when Word is UInt8 or UInt64. + test([], [1]) + test([1], [1]) + test([1], [2]) + test([2], [1]) + test([], [0, 1]) + test([1], [0, 1]) + test([0, 1], [0, 1]) + test([0, 0, 1], [0, 1]) + test([0, 0, 1], [1, 1]) + test([0, 0, 1], [3, 1]) + test([0, 0, 1], [75, 1]) + test([0, 0, 0, 1], [0, 1]) + test([2, 4, 6, 8], [1, 2]) + test([2, 3, 4, 5], [4, 5]) + test([Word.max, Word.max - 1, Word.max], [Word.max, Word.max]) + test([0, Word.max, Word.max - 1], [Word.max, Word.max]) + test([0, 0, 0, 0, 0, Word.max / 2 + 1, Word.max / 2], [1, 0, 0, Word.max / 2 + 1]) + test([0, Word.max - 1, Word.max / 2 + 1], [Word.max, Word.max / 2 + 1]) + test([0, 0, 0x41 << Word(Word.bitWidth - 8)], [Word.max, 1 << Word(Word.bitWidth - 1)]) + + XCTAssertEqual(BigUInt(328) / BigUInt(21), BigUInt(15)) + XCTAssertEqual(BigUInt(328) % BigUInt(21), BigUInt(13)) + + var a = BigUInt(328) + a /= 21 + XCTAssertEqual(a, 15) + a %= 7 + XCTAssertEqual(a, 1) + + #if false + for x0 in (0 ... Int(Word.max)) { + for x1 in (0 ... Int(Word.max)).reverse() { + for y0 in (0 ... Int(Word.max)).reverse() { + for y1 in (1 ... Int(Word.max)).reverse() { + for x2 in (1 ... y1).reverse() { + test( + [Word(x0), Word(x1), Word(x2)], + [Word(y0), Word(y1)]) + } + } + } + } + } + #endif + } + + func testFactorial() { + let power = 10 + var forward = BigUInt(1) + for i in 1 ..< (1 << power) { + forward *= BigUInt(i) + } + print("\(1 << power - 1)! = \(forward) [\(forward.count)]") + var backward = BigUInt(1) + for i in (1 ..< (1 << power)).reversed() { + backward *= BigUInt(i) + } + + func balancedFactorial(level: Int, offset: Int) -> BigUInt { + if level == 0 { + return BigUInt(offset == 0 ? 1 : offset) + } + let a = balancedFactorial(level: level - 1, offset: 2 * offset) + let b = balancedFactorial(level: level - 1, offset: 2 * offset + 1) + return a * b + } + let balanced = balancedFactorial(level: power, offset: 0) + + XCTAssertEqual(backward, forward) + XCTAssertEqual(balanced, forward) + + var remaining = balanced + for i in 1 ..< (1 << power) { + let (div, mod) = remaining.quotientAndRemainder(dividingBy: BigUInt(i)) + XCTAssertEqual(mod, 0) + remaining = div + } + XCTAssertEqual(remaining, 1) + } + + func testExponentiation() { + XCTAssertEqual(BigUInt(0).power(0), BigUInt(1)) + XCTAssertEqual(BigUInt(0).power(1), BigUInt(0)) + + XCTAssertEqual(BigUInt(1).power(0), BigUInt(1)) + XCTAssertEqual(BigUInt(1).power(1), BigUInt(1)) + XCTAssertEqual(BigUInt(1).power(-1), BigUInt(1)) + XCTAssertEqual(BigUInt(1).power(-2), BigUInt(1)) + XCTAssertEqual(BigUInt(1).power(-3), BigUInt(1)) + XCTAssertEqual(BigUInt(1).power(-4), BigUInt(1)) + + XCTAssertEqual(BigUInt(2).power(0), BigUInt(1)) + XCTAssertEqual(BigUInt(2).power(1), BigUInt(2)) + XCTAssertEqual(BigUInt(2).power(2), BigUInt(4)) + XCTAssertEqual(BigUInt(2).power(3), BigUInt(8)) + XCTAssertEqual(BigUInt(2).power(-1), BigUInt(0)) + XCTAssertEqual(BigUInt(2).power(-2), BigUInt(0)) + XCTAssertEqual(BigUInt(2).power(-3), BigUInt(0)) + + XCTAssertEqual(BigUInt(3).power(0), BigUInt(1)) + XCTAssertEqual(BigUInt(3).power(1), BigUInt(3)) + XCTAssertEqual(BigUInt(3).power(2), BigUInt(9)) + XCTAssertEqual(BigUInt(3).power(3), BigUInt(27)) + XCTAssertEqual(BigUInt(3).power(-1), BigUInt(0)) + XCTAssertEqual(BigUInt(3).power(-2), BigUInt(0)) + + XCTAssertEqual((BigUInt(1) << 256).power(0), BigUInt(1)) + XCTAssertEqual((BigUInt(1) << 256).power(1), BigUInt(1) << 256) + XCTAssertEqual((BigUInt(1) << 256).power(2), BigUInt(1) << 512) + + XCTAssertEqual(BigUInt(0).power(577), BigUInt(0)) + XCTAssertEqual(BigUInt(1).power(577), BigUInt(1)) + XCTAssertEqual(BigUInt(2).power(577), BigUInt(1) << 577) + } + + func testModularExponentiation() { + XCTAssertEqual(BigUInt(2).power(11, modulus: 1), 0) + XCTAssertEqual(BigUInt(2).power(11, modulus: 1000), 48) + + func test(a: BigUInt, p: BigUInt, file: StaticString = #file, line: UInt = #line) { + // For all primes p and integers a, a % p == a^p % p. (Fermat's Little Theorem) + let x = a % p + let y = x.power(p, modulus: p) + XCTAssertEqual(x, y, file: file, line: line) + } + + // Here are some primes + + let m61 = (BigUInt(1) << 61) - BigUInt(1) + let m127 = (BigUInt(1) << 127) - BigUInt(1) + let m521 = (BigUInt(1) << 521) - BigUInt(1) + + test(a: 2, p: m127) + test(a: BigUInt(1) << 42, p: m127) + test(a: BigUInt(1) << 42 + BigUInt(1), p: m127) + test(a: m61, p: m127) + test(a: m61 + 1, p: m127) + test(a: m61, p: m521) + test(a: m61 + 1, p: m521) + test(a: m127, p: m521) + } + + func testBitWidth() { + XCTAssertEqual(BigUInt(0).bitWidth, 0) + XCTAssertEqual(BigUInt(1).bitWidth, 1) + XCTAssertEqual(BigUInt(Word.max).bitWidth, Word.bitWidth) + XCTAssertEqual(BigUInt(words: [Word.max, 1]).bitWidth, Word.bitWidth + 1) + XCTAssertEqual(BigUInt(words: [2, 12]).bitWidth, Word.bitWidth + 4) + XCTAssertEqual(BigUInt(words: [1, Word.max]).bitWidth, 2 * Word.bitWidth) + + XCTAssertEqual(BigUInt(0).leadingZeroBitCount, 0) + XCTAssertEqual(BigUInt(1).leadingZeroBitCount, Word.bitWidth - 1) + XCTAssertEqual(BigUInt(Word.max).leadingZeroBitCount, 0) + XCTAssertEqual(BigUInt(words: [Word.max, 1]).leadingZeroBitCount, Word.bitWidth - 1) + XCTAssertEqual(BigUInt(words: [14, Word.max]).leadingZeroBitCount, 0) + + XCTAssertEqual(BigUInt(0).trailingZeroBitCount, 0) + XCTAssertEqual(BigUInt((1 as Word) << (Word.bitWidth - 1)).trailingZeroBitCount, Word.bitWidth - 1) + XCTAssertEqual(BigUInt(Word.max).trailingZeroBitCount, 0) + XCTAssertEqual(BigUInt(words: [0, 1]).trailingZeroBitCount, Word.bitWidth) + XCTAssertEqual(BigUInt(words: [0, 1 << Word(Word.bitWidth - 1)]).trailingZeroBitCount, 2 * Word.bitWidth - 1) + } + + func testBitwise() { + let a = BigUInt("1234567890ABCDEF13579BDF2468ACE", radix: 16)! + let b = BigUInt("ECA8642FDB97531FEDCBA0987654321", radix: 16)! + + // a = 01234567890ABCDEF13579BDF2468ACE + // b = 0ECA8642FDB97531FEDCBA0987654321 + XCTAssertEqual(String(~a, radix: 16), "fedcba9876f543210eca86420db97531") + XCTAssertEqual(String(a | b, radix: 16), "febc767fdbbfdfffffdfbbdf767cbef") + XCTAssertEqual(String(a & b, radix: 16), "2044289083410f014380982440200") + XCTAssertEqual(String(a ^ b, radix: 16), "fe9c32574b3c9ef0fe9c3b47523c9ef") + + let ffff = BigUInt(words: Array(repeating: Word.max, count: 30)) + let not = ~ffff + let zero = BigUInt() + XCTAssertEqual(not, zero) + XCTAssertEqual(Array((~ffff).words), []) + XCTAssertEqual(a | ffff, ffff) + XCTAssertEqual(a | 0, a) + XCTAssertEqual(a & a, a) + XCTAssertEqual(a & 0, 0) + XCTAssertEqual(a & ffff, a) + XCTAssertEqual(~(a | b), (~a & ~b)) + XCTAssertEqual(~(a & b), (~a | ~b).extract(..<(a&b).count)) + XCTAssertEqual(a ^ a, 0) + XCTAssertEqual((a ^ b) ^ b, a) + XCTAssertEqual((a ^ b) ^ a, b) + + var z = a * b + z |= a + z &= b + z ^= ffff + XCTAssertEqual(z, (((a * b) | a) & b) ^ ffff) + } + + func testLeftShifts() { + let sample = BigUInt("123456789ABCDEF01234567891631832727633", radix: 16)! + + var a = sample + + a <<= 0 + XCTAssertEqual(a, sample) + + a = sample + a <<= 1 + XCTAssertEqual(a, 2 * sample) + + a = sample + a <<= Word.bitWidth + XCTAssertEqual(a.count, sample.count + 1) + XCTAssertEqual(a[0], 0) + XCTAssertEqual(a.extract(1 ... sample.count + 1), sample) + + a = sample + a <<= 100 * Word.bitWidth + XCTAssertEqual(a.count, sample.count + 100) + XCTAssertEqual(a.extract(0 ..< 100), 0) + XCTAssertEqual(a.extract(100 ... sample.count + 100), sample) + + a = sample + a <<= 100 * Word.bitWidth + 2 + XCTAssertEqual(a.count, sample.count + 100) + XCTAssertEqual(a.extract(0 ..< 100), 0) + XCTAssertEqual(a.extract(100 ... sample.count + 100), sample << 2) + + a = sample + a <<= Word.bitWidth - 1 + XCTAssertEqual(a.count, sample.count + 1) + XCTAssertEqual(a, BigUInt(words: [0] + sample.words) / 2) + + + a = sample + a <<= -4 + XCTAssertEqual(a, sample / 16) + + XCTAssertEqual(sample << 0, sample) + XCTAssertEqual(sample << 1, 2 * sample) + XCTAssertEqual(sample << 2, 4 * sample) + XCTAssertEqual(sample << 4, 16 * sample) + XCTAssertEqual(sample << Word.bitWidth, BigUInt(words: [0 as Word] + sample.words)) + XCTAssertEqual(sample << (Word.bitWidth - 1), BigUInt(words: [0] + sample.words) / 2) + XCTAssertEqual(sample << (Word.bitWidth + 1), BigUInt(words: [0] + sample.words) * 2) + XCTAssertEqual(sample << (Word.bitWidth + 2), BigUInt(words: [0] + sample.words) * 4) + XCTAssertEqual(sample << (2 * Word.bitWidth), BigUInt(words: [0, 0] + sample.words)) + XCTAssertEqual(sample << (2 * Word.bitWidth + 2), BigUInt(words: [0, 0] + (4 * sample).words)) + + XCTAssertEqual(sample << -1, sample / 2) + XCTAssertEqual(sample << -4, sample / 16) + } + + func testRightShifts() { + let sample = BigUInt("123456789ABCDEF1234567891631832727633", radix: 16)! + + var a = sample + + a >>= BigUInt(0) + XCTAssertEqual(a, sample) + + a >>= 0 + XCTAssertEqual(a, sample) + + a = sample + a >>= 1 + XCTAssertEqual(a, sample / 2) + + a = sample + a >>= Word.bitWidth + XCTAssertEqual(a, sample.extract(1...)) + + a = sample + a >>= Word.bitWidth + 2 + XCTAssertEqual(a, sample.extract(1...) / 4) + + a = sample + a >>= sample.count * Word.bitWidth + XCTAssertEqual(a, 0) + + a = sample + a >>= 1000 + XCTAssertEqual(a, 0) + + a = sample + a >>= 100 * Word.bitWidth + XCTAssertEqual(a, 0) + + a = sample + a >>= 100 * BigUInt(Word.max) + XCTAssertEqual(a, 0) + + a = sample + a >>= -1 + XCTAssertEqual(a, sample * 2) + + a = sample + a >>= -4 + XCTAssertEqual(a, sample * 16) + + XCTAssertEqual(sample >> BigUInt(0), sample) + XCTAssertEqual(sample >> 0, sample) + XCTAssertEqual(sample >> 1, sample / 2) + XCTAssertEqual(sample >> 3, sample / 8) + XCTAssertEqual(sample >> Word.bitWidth, sample.extract(1 ..< sample.count)) + XCTAssertEqual(sample >> (Word.bitWidth + 2), sample.extract(1...) / 4) + XCTAssertEqual(sample >> (Word.bitWidth + 3), sample.extract(1...) / 8) + XCTAssertEqual(sample >> (sample.count * Word.bitWidth), 0) + XCTAssertEqual(sample >> (100 * Word.bitWidth), 0) + XCTAssertEqual(sample >> (100 * BigUInt(Word.max)), 0) + + XCTAssertEqual(sample >> -1, sample * 2) + XCTAssertEqual(sample >> -4, sample * 16) + } + + func testSquareRoot() { + let sample = BigUInt("123456789ABCDEF1234567891631832727633", radix: 16)! + + XCTAssertEqual(BigUInt(0).squareRoot(), 0) + XCTAssertEqual(BigUInt(256).squareRoot(), 16) + + func checkSqrt(_ value: BigUInt, file: StaticString = #file, line: UInt = #line) { + let root = value.squareRoot() + XCTAssertLessThanOrEqual(root * root, value, "\(value)", file: file, line: line) + XCTAssertGreaterThan((root + 1) * (root + 1), value, "\(value)", file: file, line: line) + } + for i in 0 ... 100 { + checkSqrt(BigUInt(i)) + checkSqrt(BigUInt(i) << 100) + } + checkSqrt(sample) + checkSqrt(sample * sample) + checkSqrt(sample * sample - 1) + checkSqrt(sample * sample + 1) + } + + func testGCD() { + XCTAssertEqual(BigUInt(0).greatestCommonDivisor(with: 2982891), 2982891) + XCTAssertEqual(BigUInt(2982891).greatestCommonDivisor(with: 0), 2982891) + XCTAssertEqual(BigUInt(0).greatestCommonDivisor(with: 0), 0) + + XCTAssertEqual(BigUInt(4).greatestCommonDivisor(with: 6), 2) + XCTAssertEqual(BigUInt(15).greatestCommonDivisor(with: 10), 5) + XCTAssertEqual(BigUInt(8 * 3 * 25 * 7).greatestCommonDivisor(with: 2 * 9 * 5 * 49), 2 * 3 * 5 * 7) + + var fibo: [BigUInt] = [0, 1] + for i in 0...10000 { + fibo.append(fibo[i] + fibo[i + 1]) + } + + XCTAssertEqual(BigUInt(fibo[100]).greatestCommonDivisor(with: fibo[101]), 1) + XCTAssertEqual(BigUInt(fibo[1000]).greatestCommonDivisor(with: fibo[1001]), 1) + XCTAssertEqual(BigUInt(fibo[10000]).greatestCommonDivisor(with: fibo[10001]), 1) + + XCTAssertEqual(BigUInt(3 * 5 * 7 * 9).greatestCommonDivisor(with: 5 * 7 * 7), 5 * 7) + XCTAssertEqual(BigUInt(fibo[4]).greatestCommonDivisor(with: fibo[2]), fibo[2]) + XCTAssertEqual(BigUInt(fibo[3 * 5 * 7 * 9]).greatestCommonDivisor(with: fibo[5 * 7 * 7 * 9]), fibo[5 * 7 * 9]) + XCTAssertEqual(BigUInt(fibo[7 * 17 * 83]).greatestCommonDivisor(with: fibo[6 * 17 * 83]), fibo[17 * 83]) + } + + func testInverse() { + XCTAssertNil(BigUInt(4).inverse(2)) + XCTAssertNil(BigUInt(4).inverse(8)) + XCTAssertNil(BigUInt(12).inverse(15)) + XCTAssertEqual(BigUInt(13).inverse(15), 7) + + XCTAssertEqual(BigUInt(251).inverse(1023), 269) + XCTAssertNil(BigUInt(252).inverse(1023)) + XCTAssertEqual(BigUInt(2).inverse(1023), 512) + } + + + func testStrongProbablePrimeTest() { + let primes: [BigUInt.Word] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 79, 83, 89, 97] + let pseudoPrimes: [BigUInt] = [ + /* 2 */ 2_047, + /* 3 */ 1_373_653, + /* 5 */ 25_326_001, + /* 7 */ 3_215_031_751, + /* 11 */ 2_152_302_898_747, + /* 13 */ 3_474_749_660_383, + /* 17 */ 341_550_071_728_321, + /* 19 */ 341_550_071_728_321, + /* 23 */ 3_825_123_056_546_413_051, + /* 29 */ 3_825_123_056_546_413_051, + /* 31 */ 3_825_123_056_546_413_051, + /* 37 */ "318665857834031151167461", + /* 41 */ "3317044064679887385961981", + ] + for i in 0.. = [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521] + for exponent in 2..<200 { + let m = BigUInt(1) << exponent - 1 + XCTAssertEqual(m.isPrime(), mp.contains(exponent), "\(exponent)") + } + } + + func testConversionToString() { + let sample = BigUInt("123456789ABCDEFEDCBA98765432123456789ABCDEF", radix: 16)! + // Radix = 10 + XCTAssertEqual(String(BigUInt()), "0") + XCTAssertEqual(String(BigUInt(1)), "1") + XCTAssertEqual(String(BigUInt(100)), "100") + XCTAssertEqual(String(BigUInt(12345)), "12345") + XCTAssertEqual(String(BigUInt(123456789)), "123456789") + XCTAssertEqual(String(sample), "425693205796080237694414176550132631862392541400559") + + // Radix = 16 + XCTAssertEqual(String(BigUInt(0x1001), radix: 16), "1001") + XCTAssertEqual(String(BigUInt(0x0102030405060708), radix: 16), "102030405060708") + XCTAssertEqual(String(sample, radix: 16), "123456789abcdefedcba98765432123456789abcdef") + XCTAssertEqual(String(sample, radix: 16, uppercase: true), "123456789ABCDEFEDCBA98765432123456789ABCDEF") + + // Radix = 2 + XCTAssertEqual(String(BigUInt(12), radix: 2), "1100") + XCTAssertEqual(String(BigUInt(123), radix: 2), "1111011") + XCTAssertEqual(String(BigUInt(1234), radix: 2), "10011010010") + XCTAssertEqual(String(sample, radix: 2), "1001000110100010101100111100010011010101111001101111011111110110111001011101010011000011101100101010000110010000100100011010001010110011110001001101010111100110111101111") + + // Radix = 31 + XCTAssertEqual(String(BigUInt(30), radix: 31), "u") + XCTAssertEqual(String(BigUInt(31), radix: 31), "10") + XCTAssertEqual(String(BigUInt("10000000000000000", radix: 16)!, radix: 31), "nd075ib45k86g") + XCTAssertEqual(String(BigUInt("2908B5129F59DB6A41", radix: 16)!, radix: 31), "100000000000000") + XCTAssertEqual(String(sample, radix: 31), "ptf96helfaqi7ogc3jbonmccrhmnc2b61s") + + let quickLook = BigUInt(513).playgroundDescription as? String + if quickLook == "513 (10 bits)" { + } else { + XCTFail("Unexpected playground QuickLook representation: \(quickLook ?? "nil")") + } + } + + func testConversionFromString() { + let sample = "123456789ABCDEFEDCBA98765432123456789ABCDEF" + + XCTAssertEqual(BigUInt("1"), 1) + XCTAssertEqual(BigUInt("123456789ABCDEF", radix: 16)!, 0x123456789ABCDEF) + XCTAssertEqual(BigUInt("1000000000000000000000"), BigUInt("3635C9ADC5DEA00000", radix: 16)) + XCTAssertEqual(BigUInt("10000000000000000", radix: 16), BigUInt("18446744073709551616")) + XCTAssertEqual(BigUInt(sample, radix: 16)!, BigUInt("425693205796080237694414176550132631862392541400559")) + + // We have to call BigUInt.init here because we don't want Literal initialization via coercion (SE-0213) + XCTAssertNil(BigUInt.init("Not a number")) + XCTAssertNil(BigUInt.init("X")) + XCTAssertNil(BigUInt.init("12349A")) + XCTAssertNil(BigUInt.init("000000000000000000000000A000")) + XCTAssertNil(BigUInt.init("00A0000000000000000000000000")) + XCTAssertNil(BigUInt.init("00 0000000000000000000000000")) + XCTAssertNil(BigUInt.init("\u{4e00}\u{4e03}")) // Chinese numerals "1", "7" + + XCTAssertEqual(BigUInt("u", radix: 31)!, 30) + XCTAssertEqual(BigUInt("10", radix: 31)!, 31) + XCTAssertEqual(BigUInt("100000000000000", radix: 31)!, BigUInt("2908B5129F59DB6A41", radix: 16)!) + XCTAssertEqual(BigUInt("nd075ib45k86g", radix: 31)!, BigUInt("10000000000000000", radix: 16)!) + XCTAssertEqual(BigUInt("ptf96helfaqi7ogc3jbonmccrhmnc2b61s", radix: 31)!, BigUInt(sample, radix: 16)!) + + XCTAssertNotNil(BigUInt(sample.repeated(100), radix: 16)) + } + + func testRandomIntegerWithMaximumWidth() { + XCTAssertEqual(BigUInt.randomInteger(withMaximumWidth: 0), 0) + + let randomByte = BigUInt.randomInteger(withMaximumWidth: 8) + XCTAssertLessThan(randomByte, 256) + + for _ in 0 ..< 100 { + XCTAssertLessThanOrEqual(BigUInt.randomInteger(withMaximumWidth: 1024).bitWidth, 1024) + } + + // Verify that all widths <= maximum are produced (with a tiny maximum) + var widths: Set = [0, 1, 2, 3] + var i = 0 + while !widths.isEmpty { + let random = BigUInt.randomInteger(withMaximumWidth: 3) + XCTAssertLessThanOrEqual(random.bitWidth, 3) + widths.remove(random.bitWidth) + i += 1 + if i > 4096 { + XCTFail("randomIntegerWithMaximumWidth doesn't seem random") + break + } + } + + // Verify that all bits are sometimes zero, sometimes one. + var oneBits = Set(0..<1024) + var zeroBits = Set(0..<1024) + while !oneBits.isEmpty || !zeroBits.isEmpty { + var random = BigUInt.randomInteger(withMaximumWidth: 1024) + for i in 0..<1024 { + if random[0] & 1 == 1 { oneBits.remove(i) } + else { zeroBits.remove(i) } + random >>= 1 + } + } + } + + func testRandomIntegerWithExactWidth() { + XCTAssertEqual(BigUInt.randomInteger(withExactWidth: 0), 0) + XCTAssertEqual(BigUInt.randomInteger(withExactWidth: 1), 1) + + for _ in 0 ..< 1024 { + let randomByte = BigUInt.randomInteger(withExactWidth: 8) + XCTAssertEqual(randomByte.bitWidth, 8) + XCTAssertLessThan(randomByte, 256) + XCTAssertGreaterThanOrEqual(randomByte, 128) + } + + for _ in 0 ..< 100 { + XCTAssertEqual(BigUInt.randomInteger(withExactWidth: 1024).bitWidth, 1024) + } + + // Verify that all bits except the top are sometimes zero, sometimes one. + var oneBits = Set(0..<1023) + var zeroBits = Set(0..<1023) + while !oneBits.isEmpty || !zeroBits.isEmpty { + var random = BigUInt.randomInteger(withExactWidth: 1024) + for i in 0..<1023 { + if random[0] & 1 == 1 { oneBits.remove(i) } + else { zeroBits.remove(i) } + random >>= 1 + } + } + } + + func testRandomIntegerLessThan() { + // Verify that all bits in random integers generated by `randomIntegerLessThan` are sometimes zero, sometimes one. + // + // The limit starts with "11" so that generated random integers may easily begin with all combos. + // Also, 25% of the time the initial random int will be rejected as higher than the + // limit -- this helps stabilize code coverage. + let limit = BigUInt(3) << 1024 + var oneBits = Set(0..(0..>= 1 + } + } + XCTAssertEqual(oneBits, []) + XCTAssertEqual(zeroBits, []) + } + + func testRandomFunctionsUseProvidedGenerator() { + // Here I verify that each of the randomInteger functions uses the provided RNG, and not SystemRandomNumberGenerator. + // This is important because all but BigUInt.randomInteger(withMaximumWidth:using:) are built on that base function, and it is easy to forget to pass along the provided generator and get a default SystemRandomNumberGenerator instead. + + // Since SystemRandomNumberGenerator is seeded randomly, repeated uses should give varying results. + // So here I pass the same deterministic RNG repeatedly and verify that I get the same result each time. + + struct CountingRNG: RandomNumberGenerator { + var i: UInt64 = 12345 + mutating func next() -> UInt64 { + i += 1 + return i + } + } + + func gen(_ body: (inout CountingRNG) -> BigUInt) -> BigUInt { + var rng = CountingRNG() + return body(&rng) + } + + func check(_ body: (inout CountingRNG) -> BigUInt) { + let expected = gen(body) + for _ in 0 ..< 100 { + let actual = gen(body) + XCTAssertEqual(expected, actual) + } + } + + check { BigUInt.randomInteger(withMaximumWidth: 200, using: &$0) } + check { BigUInt.randomInteger(withExactWidth: 200, using: &$0) } + let limit = BigUInt(UInt64.max) * BigUInt(UInt64.max) * BigUInt(UInt64.max) + check { BigUInt.randomInteger(lessThan: limit, using: &$0) } + } + +} diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/Info.plist b/Carthage/Checkouts/BigInt/Tests/BigIntTests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/ProfileTests.swift b/Carthage/Checkouts/BigInt/Tests/BigIntTests/ProfileTests.swift new file mode 100644 index 00000000..12aa0aa6 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/ProfileTests.swift @@ -0,0 +1,228 @@ +// +// ProfileTests.swift +// BigInt +// +// Created by Károly Lőrentey on 2015-12-31. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import XCTest +import BigInt + +#if Profile + +func factorial(_ n: Int) -> BigUInt { + var fact = BigUInt(1) + for i in BigUInt.Word(1) ... BigUInt.Word(n) { + fact.multiply(byWord: i) + } + return fact +} + +class ProfileTests: XCTestCase { + typealias Word = BigUInt.Word + + func measure_(autostart: Bool = true, block: @escaping ()->Void) { + var round = 0 + self.measureMetrics(type(of: self).defaultPerformanceMetrics, automaticallyStartMeasuring: autostart) { + print("Round \(round) started") + block() + round += 1 + } + } + + func testFibonacciAddition() { + var n1 = BigUInt(1) + var n2 = BigUInt(1) + self.measure { + n1 = BigUInt(1) + n2 = BigUInt(1) + for i in 0..<200000 { + if i & 1 == 0 { + n1 += n2 + } + else { + n2 += n1 + } + } + } + noop(n1) + noop(n2) + } + + func checkFactorial(fact: BigUInt, n: Int, file: StaticString = #file, line: UInt = #line) { + var remaining = fact + for i in 1...n { + let (div, mod) = remaining.quotientAndRemainder(dividingBy: BigUInt(i)) + XCTAssertEqual(mod, 0, "for divisor = \(i)", file: file, line: line) + remaining = div + } + XCTAssertEqual(remaining, 1, file: file, line: line) + } + + func testDivisionOfFactorial() { + let n = 32767 + let fact = factorial(n) + self.measure { + checkFactorial(fact: fact, n: n) + } + } + + func testPrintingFactorial() { + let n = 32767 + let fact = factorial(n) + var string: String = "" + self.measure { + string = String(fact, radix: 10) + } + XCTAssertEqual(BigUInt(string, radix: 10), fact) + } + + func testReadingFactorial() { + let n = 32767 + let fact = factorial(n) + let string = String(fact, radix: 10) + print(string) + self.measure { + XCTAssertEqual(BigUInt(string, radix: 10), fact) + } + } + + func testFactorial() { + var fact = BigUInt() + let n = 32767 + self.measure { + fact = factorial(n) + } + checkFactorial(fact: fact, n: n) + } + + func testBalancedFactorial() { + func balancedFactorial(level: Int, offset: Int = 0) -> BigUInt { + if level == 0 { + return BigUInt(offset == 0 ? 1 : offset) + } + let a = balancedFactorial(level: level - 1, offset: 2 * offset) + let b = balancedFactorial(level: level - 1, offset: 2 * offset + 1) + return a * b + } + + let power = 15 + + var fact = BigUInt() + self.measure { + fact = balancedFactorial(level: power) + } + checkFactorial(fact: fact, n: ((1 as Int) << power) - 1) + } + + func testDivision() { + var divisors: [BigUInt] = [] + func balancedFactorial(level: Int, offset: Int = 0) -> BigUInt { + if level == 0 { + return BigUInt(offset == 0 ? 1 : offset) + } + let a = balancedFactorial(level: level - 1, offset: 2 * offset) + let b = balancedFactorial(level: level - 1, offset: 2 * offset + 1) + let p = a * b + if level >= 10 { divisors.append(p) } + return p + } + + let power = 14 + + let fact = balancedFactorial(level: power) + print("Performing \(divisors.count) divisions with digit counts (\(fact.words.count) / (\(divisors[0].words.count)...\(divisors[divisors.count - 1].words.count))") + var divs: [BigUInt] = [] + var mods: [BigUInt] = [] + divs.reserveCapacity(divisors.count) + mods.reserveCapacity(divisors.count) + self.measure_(autostart: false) { + divs.removeAll() + mods.removeAll() + self.startMeasuring() + for divisor in divisors { + let (div, mod) = fact.quotientAndRemainder(dividingBy: divisor) + divs.append(div) + mods.append(mod) + } + self.stopMeasuring() + } + for i in 0.. [BigUInt] { + var rnd = PseudoRandomNumbers(seed: seed) + return (0 ..< count).map { _ in BigUInt(words: (0 ..< words).map { _ in rnd.next()! }) } + } + + func testSquareRoot() { + let numbers = randomBigUInts(1000, seed: 42, withMaxWords: 60) + var roots: [BigUInt] = [] + self.measure { + roots.removeAll() + for number in numbers { + let root = number.squareRoot() + roots.append(root) + } + } + + for i in 0.. = [2, 3, 5, 7, 13, 17, 19, 31, 61, 89, 107, 127, 521, 607, 1279, 2203, 2281] + for exp in 1...1000 { + let mersenne = BigUInt(1) << exp - 1 + XCTAssertEqual(mersenne.isPrime(), exponents.contains(exp), "\(exp) smells fishy") + } + // Seems legit. You win this round, evil magmaticians + } + } +} +#endif diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/Tools.swift b/Carthage/Checkouts/BigInt/Tests/BigIntTests/Tools.swift new file mode 100644 index 00000000..3c248418 --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/Tools.swift @@ -0,0 +1,48 @@ +// +// Tools.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-7-23. +// Copyright © 2017 Károly Lőrentey. All rights reserved. +// + +import BigInt + +@inline(never) +func noop(_ value: T) { + _ = value +} + +// A basic low-quality random number generator. +struct PseudoRandomNumbers: Sequence, IteratorProtocol { + typealias Element = BigUInt.Word + var last: Element + + init(seed: Element) { + self.last = seed + } + + mutating func next() -> Element? { + // Constants are from Knuth's MMIX and Numerical Recipes, respectively + let a: Element = (Element.bitWidth == 8 ? 6364136223846793005 : 1664525) + let c: Element = (Element.bitWidth == 8 ? 1442695040888963407 : 1013904223) + last = a &* last &+ c + return last + } +} + +func convertWords(_ wideWords: S) -> [UInt] where S.Element == UInt64 { + return wideWords.flatMap { $0.words } +} + +extension String { + func repeated(_ count: Int) -> String { + var result = "" + for _ in 0 ..< count { + result += self + } + return result + } +} + + diff --git a/Carthage/Checkouts/BigInt/Tests/BigIntTests/WordTests.swift b/Carthage/Checkouts/BigInt/Tests/BigIntTests/WordTests.swift new file mode 100644 index 00000000..1fc3576d --- /dev/null +++ b/Carthage/Checkouts/BigInt/Tests/BigIntTests/WordTests.swift @@ -0,0 +1,138 @@ +// +// WordTests.swift +// BigInt +// +// Created by Károly Lőrentey on 2017-7-26. +// Copyright © 2017 Károly Lőrentey. All rights reserved. +// + +import XCTest +@testable import BigInt + +// TODO: Return to `where Word.Magnitude == Word` when SR-13491 is resolved +struct TestDivision { + static func testDivision(_ u: (high: Word, low: Word.Magnitude), _ v: Word) { + let (div, mod) = v.fastDividingFullWidth(u) + var (ph, pl) = div.multipliedFullWidth(by: v) + let (s, o) = pl.addingReportingOverflow((mod as! Word.Magnitude)) + pl = s + if o { ph += Word(1) } + + if mod >= v { + XCTFail("For u = \(u), v = \(v): u mod v = \(mod), which is greater than v") + } + + func message() -> String { + let uhs = String(u.high, radix: 16) + let uls = String(u.low, radix: 16) + let vs = String(v, radix: 16) + let divs = String(div, radix: 16) + let mods = String(mod, radix: 16) + let phs = String(ph, radix: 16) + let pls = String(pl, radix: 16) + return "(\(uhs),\(uls)) / \(vs) = (\(divs), \(mods)), but div * v + mod = (\(phs),\(pls))" + } + XCTAssertEqual(ph, u.high, message()) + XCTAssertEqual(pl, u.low, message()) + } + + static func test() { + testDivision((0, 0), 2) + testDivision((0, 1), 2) + testDivision((1, 0), 2) + testDivision((8, 0), 136) + testDivision((128, 0), 136) + testDivision((2, 0), 35) + testDivision((7, 12), 19) + } +} + +class WordTests: XCTestCase { + func testFullDivide() { + TestDivision.test() + TestDivision.test() + TestDivision.test() + TestDivision.test() + TestDivision.test() + + #if false + typealias Word = UInt8 + for v in 1 ... Word.max { + for u1 in 0 ..< v { + for u0 in 0 ..< Word.max { + TestDivision.testDivision((u1, u0), v) + } + } + } + #endif + } + + func testConversion() { + enum Direction { + case unitsToWords + case wordsToUnits + case both + } + func test + (direction: Direction = .both, + words: [Word], of wtype: Word.Type = Word.self, + units: [Unit], of utype: Unit.Type = Unit.self, + file: StaticString = #file, line: UInt = #line) { + switch direction { + case .wordsToUnits, .both: + let actualUnits = [Unit](Units(of: Unit.self, words)) + XCTAssertEqual(actualUnits, units, "words -> units", file: file, line: line) + default: + break + } + switch direction { + case .unitsToWords, .both: + var it = units.makeIterator() + let actualWords = [Word](count: units.count, generator: { () -> Unit? in it.next() }) + XCTAssertEqual(actualWords, words, "units -> words", file: file, line: line) + default: + break + } + } + + + test(words: [], of: UInt8.self, + units: [], of: UInt8.self) + test(words: [0x01], of: UInt8.self, + units: [0x01], of: UInt8.self) + test(words: [0x01, 0x02], of: UInt8.self, + units: [0x02, 0x01], of: UInt8.self) + + test(words: [], of: UInt8.self, + units: [], of: UInt16.self) + test(direction: .unitsToWords, + words: [0x01, 0x00], of: UInt8.self, + units: [0x0001], of: UInt16.self) + test(direction: .wordsToUnits, + words: [0x01], of: UInt8.self, + units: [0x0001], of: UInt16.self) + test(words: [0x01, 0x02], of: UInt8.self, + units: [0x0201], of: UInt16.self) + test(direction: .wordsToUnits, + words: [0x01, 0x02, 0x03], of: UInt8.self, + units: [0x0003, 0x0201], of: UInt16.self) + test(direction: .unitsToWords, + words: [0x01, 0x02, 0x03, 0x00], of: UInt8.self, + units: [0x0003, 0x0201], of: UInt16.self) + + test(words: [], of: UInt16.self, + units: [], of: UInt8.self) + test(words: [0x1234], of: UInt16.self, + units: [0x12, 0x34], of: UInt8.self) + test(words: [0x5678, 0x1234], of: UInt16.self, + units: [0x12, 0x34, 0x56, 0x78], of: UInt8.self) + test(direction: .unitsToWords, + words: [0x789A, 0x3456, 0x12], of: UInt16.self, + units: [0x12, 0x34, 0x56, 0x78, 0x9A], of: UInt8.self) + test(direction: .wordsToUnits, + words: [0x789A, 0x3456, 0x12], of: UInt16.self, + units: [0x00, 0x12, 0x34, 0x56, 0x78, 0x9A], of: UInt8.self) + } +} + + diff --git a/Carthage/Checkouts/BigInt/docs/Extensions.html b/Carthage/Checkouts/BigInt/docs/Extensions.html new file mode 100644 index 00000000..7479e358 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Extensions.html @@ -0,0 +1,173 @@ + + + + Extensions Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + BinaryFloatingPoint + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + String + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Extensions/BinaryFloatingPoint.html b/Carthage/Checkouts/BigInt/docs/Extensions/BinaryFloatingPoint.html new file mode 100644 index 00000000..86bf1c39 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Extensions/BinaryFloatingPoint.html @@ -0,0 +1,194 @@ + + + + BinaryFloatingPoint Extension Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BinaryFloatingPoint

+
+
+ +
extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger

+

+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Extensions/String.html b/Carthage/Checkouts/BigInt/docs/Extensions/String.html new file mode 100644 index 00000000..8e347fd3 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Extensions/String.html @@ -0,0 +1,244 @@ + + + + String Extension Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

String

+
+
+ +
extension String
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new string with the base-10 representation of an unsigned big integer.

    +
    +

    Complexity

    + O(v.count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ v: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new string representing an unsigned big integer in the given radix (base).

    + +

    Numerals greater than 9 are represented as letters from the English alphabet, +starting with a if uppercase is false or A otherwise.

    +
    +

    Requires

    + radix > 1 && radix <= 36 + +
    +

    Complexity

    + O(count) when radix is a power of two; otherwise O(count^2). + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ v: BigUInt, radix: Int, uppercase: Bool = false)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new string representing a signed big integer in the given radix (base).

    + +

    Numerals greater than 9 are represented as letters from the English alphabet, +starting with a if uppercase is false or A otherwise.

    +
    +

    Requires

    + radix > 1 && radix <= 36 + +
    +

    Complexity

    + O(count) when radix is a power of two; otherwise O(count^2). + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigInt, radix: Int = 10, uppercase: Bool = false)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs.html b/Carthage/Checkouts/BigInt/docs/Structs.html new file mode 100644 index 00000000..9ae78600 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs.html @@ -0,0 +1,229 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + BigUInt + +
    +
    +
    +
    +
    +
    +

    An arbitary precision unsigned integer type, also known as a “big integer”.

    + +

    Operations on big integers never overflow, but they may take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

    + +

    This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper +around Array<UInt64>. (In fact, BigUInt only uses an array if there are more than two digits.)

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct BigUInt : UnsignedInteger
    +
    extension BigUInt: Codable
    +
    extension BigUInt: Comparable
    +
    extension BigUInt: Hashable
    +
    extension BigUInt: ExpressibleByIntegerLiteral
    +
    extension BigUInt: Strideable
    +
    extension BigUInt: ExpressibleByStringLiteral
    +
    extension BigUInt: CustomStringConvertible
    +
    extension BigUInt: CustomPlaygroundDisplayConvertible
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

BigInt

+

+
+
+
    +
  • +
    + + + + BigInt + +
    +
    +
    +
    +
    +
    +

    An arbitary precision signed integer type, also known as a “big integer”.

    + +

    Operations on big integers never overflow, but they might take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

    + +

    This particular big integer type uses base-2^64 digits to represent integers.

    + +

    BigInt is essentially a tiny wrapper that extends BigUInt with a sign bit and provides signed integer +operations. Both the underlying absolute value and the negative/positive flag are available as read-write +properties.

    + +

    Not all algorithms of BigUInt are available for BigInt values; for example, there is no square root or +primality test for signed integers. When you need to call one of these, just extract the absolute value:

    +
    BigInt(255).abs.isPrime()   // Returns false
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct BigInt : SignedInteger
    +
    extension BigInt: Codable
    +
    extension BigInt: Hashable
    +
    extension BigInt: ExpressibleByIntegerLiteral
    +
    extension BigInt: Strideable
    +
    extension BigInt: ExpressibleByStringLiteral
    +
    extension BigInt: CustomStringConvertible
    +
    extension BigInt: CustomPlaygroundDisplayConvertible
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs/BigInt.html b/Carthage/Checkouts/BigInt/docs/Structs/BigInt.html new file mode 100644 index 00000000..ef27d99f --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs/BigInt.html @@ -0,0 +1,2546 @@ + + + + BigInt Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BigInt

+
+
+ +
public struct BigInt : SignedInteger
+
extension BigInt: Codable
+
extension BigInt: Hashable
+
extension BigInt: ExpressibleByIntegerLiteral
+
extension BigInt: Strideable
+
extension BigInt: ExpressibleByStringLiteral
+
extension BigInt: CustomStringConvertible
+
extension BigInt: CustomPlaygroundDisplayConvertible
+ +
+
+

An arbitary precision signed integer type, also known as a “big integer”.

+ +

Operations on big integers never overflow, but they might take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

+ +

This particular big integer type uses base-2^64 digits to represent integers.

+ +

BigInt is essentially a tiny wrapper that extends BigUInt with a sign bit and provides signed integer +operations. Both the underlying absolute value and the negative/positive flag are available as read-write +properties.

+ +

Not all algorithms of BigUInt are available for BigInt values; for example, there is no square root or +primality test for signed integers. When you need to call one of these, just extract the absolute value:

+
BigInt(255).abs.isPrime()   // Returns false
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Sign + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Sign
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Magnitude + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Magnitude = BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Word + +
    +
    +
    +
    +
    +
    +

    The type representing a digit in BigInt‘s underlying number system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Word = BigUInt.Word
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isSigned + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var isSigned: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + magnitude + +
    +
    +
    +
    +
    +
    +

    The absolute value of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var magnitude: BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + sign + +
    +
    +
    +
    +
    +
    +

    True iff the value of this integer is negative.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sign: Sign
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(sign:magnitude:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new big integer with the provided absolute number and sign flag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(sign: Sign, magnitude: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isZero + +
    +
    +
    +
    +
    +
    +

    Return true iff this integer is zero.

    +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isZero: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + signum() + +
    +
    +
    +
    +
    +
    +

    Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func signum() -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    The sign of this number, expressed as an integer of the same type.

    +
    + +
    +
    +
  • +
  • +
    + + + + +(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a to b and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func + (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + +=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add b to a in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func += (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Bitwise Operations

+

+
+
+
    +
  • +
    + + + + ~(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public prefix static func ~ (x: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func & (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func | (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^ (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func |= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is equal to b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (a: BigInt, b: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is less than b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (a: BigInt, b: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer, +where the first byte indicates sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ buffer: UnsafeRawBufferPointer)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes an integer from the bits stored inside a piece of Data. +The data is assumed to be in network (big-endian) byte order with a first +byte to represent the sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ data: Data)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + serialize() + +
    +
    +
    +
    +
    +
    +

    Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize() -> Data
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Full-width multiplication and division

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Divide this integer by y and return the resulting quotient and remainder.

    +
    +

    Requires

    + y > 0 + +
    +

    Complexity

    + O(count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func quotientAndRemainder(dividingBy y: BigInt) -> (quotient: BigInt, remainder: BigInt)
    + +
    +
    +
    +

    Return Value

    +

    (quotient, remainder) where quotient = floor(self/y), remainder = self - quotient * y

    +
    + +
    +
    +
  • +
  • +
    + + + + /(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b and return the quotient. Traps if b is zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func / (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b and return the remainder. The result has the same sign as a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func % (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + modulus(_:) + +
    +
    +
    +
    +
    +
    +

    Return the result of a mod b. The result is always a nonnegative integer that is less than the absolute value of b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func modulus(_ mod: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + /=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b storing the quotient in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func /= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b storing the remainder in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func %= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:) + +
    +
    +
    +
    +
    +
    +

    Returns this integer raised to the power exponent.

    + +

    This function calculates the result by successively squaring the base while halving the exponent.

    +
    +

    Note

    + This function can be unreasonably expensive for large exponents, which is why exponent is + a simple integer value. If you want to calculate big exponents, you’ll probably need to use + the modulo arithmetic variant. + +
    +

    See also

    + BigUInt.power(_:, modulus:) + +
    +

    Complexity

    + O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: Int) -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    1 if exponent == 0, otherwise self raised to exponent. (This implies that 0.power(0) == 1.)

    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:modulus:) + +
    +
    +
    +
    +
    +
    +

    Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

    + +

    Uses the right-to-left binary method.

    +
    +

    Complexity

    + O(exponent.count * modulus.count^log2(3)) or somesuch + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: BigInt, modulus: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the greatest common divisor of a and b.

    +
    +

    Complexity

    + O(count^2) where count = max(a.count, b.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func greatestCommonDivisor(with b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + inverse(_:) + +
    +
    +
    +
    +
    +
    +

    Returns the multiplicative inverse of this integer in modulo modulus arithmetic, +or nil if there is no such number.

    +
    +

    Requires

    + modulus.magnitude > 1 + +
    +

    Complexity

    + O(count^3) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func inverse(_ modulus: BigInt) -> BigInt?
    + +
    +
    +
    +

    Return Value

    +

    If gcd(self, modulus) == 1, the value returned is an integer a < modulus such that (a * self) % modulus == 1. If self and modulus aren’t coprime, the return value is nil.

    +
    + +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    +

    Append this BigInt to the specified hasher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new signed big integer with the same value as the specified unsigned big integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ integer: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(clamping:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(clamping source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(truncatingIfNeeded source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from an integer literal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral value: Int64)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a with b and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func * (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a with b in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func *= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Primality Testing

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns true iff this integer passes the strong probable prime test for the specified base.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isStrongProbablePrime(_ base: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isPrime(rounds:) + +
    +
    +
    +
    +
    +
    +

    Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

    + +

    This function performs a probabilistic Miller-Rabin Primality Test, consisting of rounds iterations, +each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, +but you may specify your own choice.

    + +

    To speed things up, the function checks if self is divisible by the first few prime numbers before +diving into (slower) Miller-Rabin testing.

    + +

    Also, when self is less than 82 bits wide, isPrime does a deterministic test that is guaranteed to +return a correct result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isPrime(rounds: Int = 10) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &<<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &<< (left: BigInt, right: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &<<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &<<= (left: inout BigInt, right: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &>>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &>> (left: BigInt, right: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &>>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &>>= (left: inout BigInt, right: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func << <Other>(lhs: BigInt, rhs: Other) -> BigInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func <<= <Other>(lhs: inout BigInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >> <Other>(lhs: BigInt, rhs: Other) -> BigInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >>= <Other>(lhs: inout BigInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Square Root

+

+
+
+
    +
  • +
    + + + + squareRoot() + +
    +
    +
    +
    +
    +
    +

    Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

    +
    +

    Requires

    + self >= 0 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func squareRoot() -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    floor(sqrt(self))

    +
    + +
    +
    +
  • +
  • +
    + + + + Stride + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stride = BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + advanced(by:) + +
    +
    +
    +
    +
    +
    +

    Returns self + n.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func advanced(by n: Stride) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + distance(to:) + +
    +
    +
    +
    +
    +
    +

    Returns other - self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func distance(to other: BigInt) -> Stride
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:radix:) + +
    +
    +
    +
    +
    +
    +

    Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by +letters from the English alphabet.

    +
    +

    Requires

    + radix > 1 && radix < 36 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<S>(_ text: S, radix: Int = 10) where S : StringProtocol
    + +
    +
    +
    +

    Return Value

    +

    The integer represented by text, or nil if text contains a character that does not represent a numeral in radix.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from a Unicode scalar. +The scalar must represent a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(unicodeScalarLiteral value: UnicodeScalar)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from an extended grapheme cluster. +The cluster must consist of a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(extendedGraphemeClusterLiteral value: String)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. +The string must contain only decimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral value: StringLiteralType)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Return the decimal representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + playgroundDescription + +
    +
    +
    +
    +
    +
    +

    Return the playground quick look representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var playgroundDescription: Any { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + negate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func negate()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func - (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func -= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + bitWidth + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bitWidth: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + trailingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var trailingZeroBitCount: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Words + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Words : RandomAccessCollection
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + words + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var words: Words { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<S>(words: S) where S : Sequence, S.Element == BigInt.Word
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Sign.html b/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Sign.html new file mode 100644 index 00000000..93984a5b --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Sign.html @@ -0,0 +1,189 @@ + + + + Sign Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Sign

+
+
+ +
public enum Sign
+ +
+
+

Undocumented

+ + +
+
+ +
+
+
+
    +
  • +
    + + + + plus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case plus
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + minus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case minus
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Words.html b/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Words.html new file mode 100644 index 00000000..d070e505 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs/BigInt/Words.html @@ -0,0 +1,302 @@ + + + + Words Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Words

+
+
+ +
public struct Words : RandomAccessCollection
+ +
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Indices + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Indices = CountableRange<Int>
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + count + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var count: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + indices + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var indices: Indices { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(index: Int) -> UInt { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs/BigUInt.html b/Carthage/Checkouts/BigInt/docs/Structs/BigUInt.html new file mode 100644 index 00000000..5d164ca9 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs/BigUInt.html @@ -0,0 +1,3220 @@ + + + + BigUInt Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BigUInt

+
+
+ +
public struct BigUInt : UnsignedInteger
+
extension BigUInt: Codable
+
extension BigUInt: Comparable
+
extension BigUInt: Hashable
+
extension BigUInt: ExpressibleByIntegerLiteral
+
extension BigUInt: Strideable
+
extension BigUInt: ExpressibleByStringLiteral
+
extension BigUInt: CustomStringConvertible
+
extension BigUInt: CustomPlaygroundDisplayConvertible
+ +
+
+

An arbitary precision unsigned integer type, also known as a “big integer”.

+ +

Operations on big integers never overflow, but they may take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

+ +

This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper +around Array<UInt64>. (In fact, BigUInt only uses an array if there are more than two digits.)

+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Word + +
    +
    +
    +
    +
    +
    +

    The type representing a digit in BigUInt‘s underlying number system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Word = UInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Initializes a new BigUInt with value 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(words: [Word])
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Addition

+

+
+
+
    +
  • +
    + + + + +(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a and b together and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func + (a: BigUInt, b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + +=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a and b together, and store the sum in a.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func += (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isSigned + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var isSigned: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + signum() + +
    +
    +
    +
    +
    +
    +

    Returns 1 if this value is, positive; otherwise, 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func signum() -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    The sign of this number, expressed as an integer of the same type.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Bitwise Operations

+

+
+
+
    +
  • +
    + + + + ~(_:) + +
    +
    +
    +
    +
    +
    +

    Return the ones’ complement of a.

    +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public prefix static func ~ (a: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise OR of a and b, and store the result in a.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func |= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise AND of a and b and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise XOR of a and b and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Comparison

+

+
+
+
    +
  • +
    + + + + compare(_:_:) + +
    +
    +
    +
    +
    +
    +

    Compare a to b and return an NSComparisonResult indicating their order.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func compare(_ a: BigUInt, _ b: BigUInt) -> ComparisonResult
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is equal to b.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (a: BigUInt, b: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is less than b.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (a: BigUInt, b: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

NSData Conversion

+

+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ buffer: UnsafeRawBufferPointer)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes an integer from the bits stored inside a piece of Data. +The data is assumed to be in network (big-endian) byte order.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ data: Data)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + serialize() + +
    +
    +
    +
    +
    +
    +

    Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize() -> Data
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Division

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Divide this integer by y and return the resulting quotient and remainder.

    +
    +

    Requires

    + y > 0 + +
    +

    Complexity

    + O(count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func quotientAndRemainder(dividingBy y: BigUInt) -> (quotient: BigUInt, remainder: BigUInt)
    + +
    +
    +
    +

    Return Value

    +

    (quotient, remainder) where quotient = floor(self/y), remainder = self - quotient * y

    +
    + +
    +
    +
  • +
  • +
    + + + + /(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and return the quotient.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func / (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and return the remainder.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func % (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + /=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and store the quotient in x.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func /= (x: inout BigUInt, y: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and store the remainder in x.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func %= (x: inout BigUInt, y: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Exponentiation

+

+
+
+
    +
  • +
    + + + + power(_:) + +
    +
    +
    +
    +
    +
    +

    Returns this integer raised to the power exponent.

    + +

    This function calculates the result by successively squaring the base while halving the exponent.

    +
    +

    Note

    + This function can be unreasonably expensive for large exponents, which is why exponent is + a simple integer value. If you want to calculate big exponents, you’ll probably need to use + the modulo arithmetic variant. + +
    +

    See also

    + BigUInt.power(_:, modulus:) + +
    +

    Complexity

    + O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: Int) -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    1 if exponent == 0, otherwise self raised to exponent. (This implies that 0.power(0) == 1.)

    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:modulus:) + +
    +
    +
    +
    +
    +
    +

    Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

    + +

    Uses the right-to-left binary method.

    +
    +

    Complexity

    + O(exponent.count * modulus.count^log2(3)) or somesuch + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: BigUInt, modulus: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Greatest Common Divisor

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the greatest common divisor of self and b.

    +
    +

    Complexity

    + O(count^2) where count = max(self.count, b.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func greatestCommonDivisor(with b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + inverse(_:) + +
    +
    +
    +
    +
    +
    +

    Returns the multiplicative inverse of this integer in modulo modulus arithmetic, +or nil if there is no such number.

    +
    +

    Requires

    + modulus > 1 + +
    +

    Complexity

    + O(count^3) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func inverse(_ modulus: BigUInt) -> BigUInt?
    + +
    +
    +
    +

    Return Value

    +

    If gcd(self, modulus) == 1, the value returned is an integer a < modulus such that (a * self) % modulus == 1. If self and modulus aren’t coprime, the return value is nil.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Hashing

+

+
+
+
    +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    +

    Append this BigUInt to the specified hasher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(truncatingIfNeeded source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(clamping:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(clamping source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from an integer literal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral value: UInt64)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Multiplication

+

+
+
+
    +
  • +
    + + + + multiply(byWord:) + +
    +
    +
    +
    +
    +
    +

    Multiply this big integer by a single word, and store the result in place of the original big integer.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func multiply(byWord y: Word)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + multiplied(byWord:) + +
    +
    +
    +
    +
    +
    +

    Multiply this big integer by a single Word, and return the result.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func multiplied(byWord y: Word) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Multiply x by y, and add the result to this integer, optionally shifted shift words to the left.

    +
    +

    Note

    + This is the fused multiply/shift/add operation; it is more efficient than doing the components +individually. (The fused operation doesn’t need to allocate space for temporary big integers.) + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func multiplyAndAdd(_ x: BigUInt, _ y: Word, shiftedBy shift: Int = 0)
    + +
    +
    +
    +

    Return Value

    +

    self is set to self + (x * y) << (shift * 2^Word.bitWidth)

    +
    + +
    +
    +
  • +
  • +
    + + + + multiplied(by:) + +
    +
    +
    +
    +
    +
    +

    Multiply this integer by y and return the result.

    +
    +

    Note

    + This uses the naive O(n^2) multiplication algorithm unless both arguments have more than +BigUInt.directMultiplicationLimit words. + +
    +

    Complexity

    + O(n^log2(3)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func multiplied(by y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var directMultiplicationLimit: Int
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a by b and return the result.

    +
    +

    Note

    + This uses the naive O(n^2) multiplication algorithm unless both arguments have more than +BigUInt.directMultiplicationLimit words. + +
    +

    Complexity

    + O(n^log2(3)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func * (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a by b and store the result in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func *= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Primality Testing

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns true iff this integer passes the strong probable prime test for the specified base.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isStrongProbablePrime(_ base: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isPrime(rounds:) + +
    +
    +
    +
    +
    +
    +

    Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

    + +

    This function performs a probabilistic Miller-Rabin Primality Test, consisting of rounds iterations, +each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, +but you may specify your own choice.

    + +

    To speed things up, the function checks if self is divisible by the first few prime numbers before +diving into (slower) Miller-Rabin testing.

    + +

    Also, when self is less than 82 bits wide, isPrime does a deterministic test that is guaranteed to +return a correct result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isPrime(rounds: Int = 10) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width uniformly distributed random bits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(withMaximumWidth width: Int, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + width + + +
    +

    The maximum number of one bits in the result.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A big unsigned integer less than 1 << width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width uniformly distributed random bits.

    +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(withMaximumWidth width: Int) -> BigUInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + width + + +
    +

    The maximum number of one bits in the result.

    +
    +
    +
    +
    +

    Return Value

    +

    A big unsigned integer less than 1 << width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

    +
    +

    Note

    +

    If width is zero, the result is zero.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(withExactWidth width: Int, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + width + + +
    +

    The number of bits required to represent the answer.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer whose width is width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

    +
    +

    Note

    + If width is zero, the result is zero. + +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(withExactWidth width: Int) -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer whose width is width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a uniformly distributed random unsigned integer that’s less than the specified limit.

    +
    +

    Precondition

    +

    limit > 0.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(lessThan limit: BigUInt, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + limit + + +
    +

    The upper bound on the result.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer that is less than limit.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a uniformly distributed random unsigned integer that’s less than the specified limit.

    +
    +

    Precondition

    + limit > 0. + +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(lessThan limit: BigUInt) -> BigUInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + limit + + +
    +

    The upper bound on the result.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer that is less than limit.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Shift Operators

+

+
+
+
    +
  • +
    + + + + >>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >>= <Other>(lhs: inout BigUInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func <<= <Other>(lhs: inout BigUInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >> <Other>(lhs: BigUInt, rhs: Other) -> BigUInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func << <Other>(lhs: BigUInt, rhs: Other) -> BigUInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Square Root

+

+
+
+
    +
  • +
    + + + + squareRoot() + +
    +
    +
    +
    +
    +
    +

    Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func squareRoot() -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    floor(sqrt(self))

    +
    + +
    +
    +
  • +
  • +
    + + + + Stride + +
    +
    +
    +
    +
    +
    +

    A type that can represent the distance between two values ofa BigUInt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stride = BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + advanced(by:) + +
    +
    +
    +
    +
    +
    +

    Adds n to self and returns the result. Traps if the result would be less than zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func advanced(by n: BigInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + distance(to:) + +
    +
    +
    +
    +
    +
    +

    Returns the (potentially negative) difference between self and other as a BigInt. Never traps.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func distance(to other: BigUInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

String Conversion

+

+
+
+
    +
  • +
    + + + + init(_:radix:) + +
    +
    +
    +
    +
    +
    +

    Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by +letters from the English alphabet.

    +
    +

    Requires

    + radix > 1 && radix < 36 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<S>(_ text: S, radix: Int = 10) where S : StringProtocol
    + +
    +
    +
    +

    Return Value

    +

    The integer represented by text, or nil if text contains a character that does not represent a numeral in radix.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from a Unicode scalar. +The scalar must represent a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(unicodeScalarLiteral value: UnicodeScalar)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from an extended grapheme cluster. +The cluster must consist of a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(extendedGraphemeClusterLiteral value: String)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. +The string must contain only decimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral value: StringLiteralType)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Return the decimal representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + playgroundDescription + +
    +
    +
    +
    +
    +
    +

    Return the playground quick look representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var playgroundDescription: Any { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Subtraction

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer in place, and return a flag indicating if the operation caused an +arithmetic overflow. other is shifted shift digits to the left before being subtracted.

    +
    +

    Note

    + If the result indicates an overflow, then self becomes the twos’ complement of the absolute difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func subtractReportingOverflow(_ b: BigUInt, shiftedBy shift: Int = 0) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer, returning the difference and a flag indicating arithmetic overflow. +other is shifted shift digits to the left before being subtracted.

    +
    +

    Note

    + If overflow is true, then the result value is the twos’ complement of the absolute value of the difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtractingReportingOverflow(_ other: BigUInt, shiftedBy shift: Int) -> (partialValue: BigUInt, overflow: Bool)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtracts other from self, returning the result and a flag indicating arithmetic overflow.

    +
    +

    Note

    + When the operation overflows, then partialValue is the twos’ complement of the absolute value of the difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtractingReportingOverflow(_ other: BigUInt) -> (partialValue: BigUInt, overflow: Bool)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer in place. +other is shifted shift digits to the left before being subtracted.

    +
    +

    Requires

    + self >= other * 2^shift + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func subtract(_ other: BigUInt, shiftedBy shift: Int = 0)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract b from this integer, and return the difference. +b is shifted shift digits to the left before being subtracted.

    +
    +

    Requires

    + self >= b * 2^shift + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtracting(_ other: BigUInt, shiftedBy shift: Int = 0) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + decrement(shiftedBy:) + +
    +
    +
    +
    +
    +
    +

    Decrement this integer by one.

    +
    +

    Requires

    + !isZero + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func decrement(shiftedBy shift: Int = 0)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and return the result.

    +
    +

    Requires

    + a >= b + +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func - (a: BigUInt, b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and store the result in a.

    +
    +

    Requires

    + a >= b + +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func -= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(bitAt:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(bitAt index: Int) -> Bool { get set }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + bitWidth + +
    +
    +
    +
    +
    +
    +

    The minimum number of bits required to represent this integer in binary.

    +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bitWidth: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    floor(log2(2 * self + 1))

    +
    + +
    +
    +
  • +
  • +
    + + + + leadingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    The number of leading zero bits in the binary representation of this integer in base 2^(Word.bitWidth). +This is useful when you need to normalize a BigUInt such that the top bit of its most significant word is 1.

    +
    +

    Note

    + 0 is considered to have zero leading zero bits. + +
    +

    See also

    + width + +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var leadingZeroBitCount: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    A value in 0...(Word.bitWidth - 1).

    +
    + +
    +
    +
  • +
  • +
    + + + + trailingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    The number of trailing zero bits in the binary representation of this integer.

    +
    +

    Note

    + 0 is considered to have zero trailing zero bits. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var trailingZeroBitCount: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    A value in 0...width.

    +
    + +
    +
    +
  • +
  • +
    + + + + Words + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Words : RandomAccessCollection
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + words + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var words: Words { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Words>(words: Words) where Words : Sequence, Words.Element == BigUInt.Word
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +

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≪McfkMSIci+UYmc-@3A<&+;1`6T>?@a{(; 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%0D+_I@-Q>rQb@vccsgY zemtC_LN)3iQ@bKid9G%%>tYpBN%8^>hy=&~F;U_9+v2d%bym$TO@aY6Yr$(+6@4I1 zFKhtYUFJZucf76bk4pp<&o*!@JponOcEty16RAkqq+C!86t$o5m^@KS4yN#PA}`P8 zb$7j~nJqp~J^!ZPJ+x{X7*?YKWUCJ?k3Eb$%R+`_==O zV@@+t5QP3v@86dlC2&{Fly$zVw#e-h7(waIK=L`veCJDd1@%igFfvi}FjAW6yq}Op$0K#QXuYjZ zi*W|Nnum(ZWc2(<0s%!F*LX{160Y%IQjp|irAPehyrwTec$iQ`=B*}>XBuH<@sk`?MiD)_u_zh7n>}1|j zy#mk{Nq0-e_;>ydOzH6>in#z{8T!U;;5W^XWb0C{C;o&b4l-7S0G%;^LD2ebt!k8V zQ|w0+qTkc$T3;Ui!y36uj)9;m6Bt}`!-Nt6B+qKleAFITutCA}n6N>Pipe2{ogdAA zUwkImyJsf?W%&QH474ig0NPTFL86^^^%ciYb2+boAvkJ`{XZc%(Rm`iZ!pg*XF zeN-V+SG~tZ;vY+|Is@R-SNG-&K=`JgkzlgJxe=*p&tiiQzc@sk3Gc-#kJ)Rp>+NK* z?SR6BM^Njj|8Yjno_GiO9>ZTw{?yBV2ho@?VF4P_@A?uhF6*FFRC;+g$7_u~{0i{y}%arB0rZPZY?W@?R z@L#-|-9LD>IXRX#^Ve@bG@b91Bqpa~9ZUC4@J?51a5fLcbQRIax=4g#Kx9ORVwhwp z2%&cF=-qW}I?px7zJ7b^b=@Ny7x<_n`ymMryZ>Erauj84uSFCJ6%wVu1OqAlwcy;t z2D5U&6E5DIIfh~-hB^;Os^MC1Q9q?4z;NY!&7?Z30m(ao0Y6A=oD2y*hn64`+?#&x z|3N5#pw=k89slMBUN!T;Q1MqO`#HHe)8D1+yn>NP#Eua`MiGiqej&-C>~@trQ4SMZ zc|)IqB?x`8J!rGYQfEd#2}3N9z=NMy6=`a`vua^KyGDV&$kky$d5$Eko#?wS(%Ury z1d_<5FQ{_@SK3hiy^Y$ zpk?HM6HPV%>P}|u*fVrnOp`FdK0|3<%AIl2n|A(6J8w&!e|31z%AJyZF(ps(kAKg~ z*+CGQ(x73n$y54l0kd*&VSlo6Z1z<-+j-TswE18{Uv8Wq1PQo+h3pDOE`JKy_x>tm z_hdEz7P6GIi5OzXR-Pf8lFkiA1v@-JfTC~<=nqluEJ zZ3`5bm4oyBD=X(%q(|;~v~$LG%NnsMN?^h%`HH5$3>2RP=LY1WM{ove1H~t+@8Xkw z!0x;FWczRN3H-l_Bf~RA^BmX@{t`zjGsgkNk%`ZWsaC%RG;IrFWapLFC%0{NbE`b} zC6>Ril7pb;!y29+!g?RoOQKCt#mj!#a>37vRn)mOHDA#JiBU;zr6)vkj){Sl06|jN z&pMz2_cjjI#Wmyk z-nLx-YGVh8e1I83(En!}d%ylBQErq^bRE57^;cyJ!3-d?miV{#B-M78p{FDI-5crf z?u{h;I3ZK9?#RbWeniUBLmm>NUi0*|&Ho2Clh!p?F5JIiYOj>iy;Kk3J zkPZm1&IC*e3&Qs^^!Q{~eK4zRTH&Y{U*S)*M)=J2^B(;Fw6V*)x3RaK02%?#>UeZX z+6!aD#!(9XAxT5V53Mw`@VRZ@(+j#@>=z}sBVTPu(^M(6?t{X9M>TrTrWcbneSH_8 zg*dAv1O zdV9JanBK!|r~XJ^md@O1VtMx107 z0>~D7lbN#wGrnUDR;X+MK%`Gvm5oZOKL1u2)coBN_0(E=t%Zx#d!B~>TangFFZCres8BknlpW+oh;Q1jj9o~Y@GQa74 zmB3w~q>naLh!LpG&~wSr$A^O0DQPgcP(t1MbBA_`+*YIu?(P6$G5Id8DSkby#NDYZ zmKm#B{a3!EL^YpcK9ozubdD;kZLu-Q*uA$BgO#{SBLB-9zphlsp0zel!5)0$V<-91 zK%F5iIXeiY0g!B3{%!fP@ntdp?4NGRee@!9B?Ttd7{JHWProA*7l-oqy0yY%mk3aY zL<>cp22GZ@gFhMikRjI$oBOE~s&rMWC{pP=+=JU@Kn$d=2Q`YEe(QX=F+{*5>i!nk zL}umaD_|vue{wo=l!Q(@chRa|%T~&Q~h#J2Z6)RGa^@_?1cWr@BZw z%~*dWd;eajOVCZ=cZHfuy=)yalcD|TP5O81}SiE6}n!#Clr zE~ZOewh2`&PrWA4oh10$^9I^f4;fF@w00 zNA9W(AwHhk^*Qm=^4aae`bp;OA-*F*%PPT{aY@_y;n`h#4MHNRah-Sa<|0$jB{{Y` z)m&0{Z%}ut8#DK1N7T-`#moAi!}Xy(-0+rL8Uht?ldfQCV+eKg@$6GCUj$c|luxcuabVJEc+>xAObE7!+9NgqHiOv-uaJF9^y1wG4qqZ^t2h;tWdM|x$Er&7kCgO*ZA-d+mGVD^bC2MK zp@~fMjbL7<@j5#dt>UQKPSKM_%i*O})u6rw!}J_|X7Ni^q2h)b#T<iug?EeWq+ExISFPoIBRVozj+s$ScoAP8I5OqJ>EJW#kwr6LDx3$zI#_ zlz*nF*mRAPFOnH2uDv+)z0%D6$^r{$B=#Jkq;I`my{?~(J$~59c88-~_@p|uWL>47 zL&pl9qUQcNV0Kp}jD2YOrKWJz;aNAk)ih!!kdw_8_xZ=*n~0RP7hS|}2+fFJNK2>i zUO?}pu@3~z++*7>l0}Cf5nqW%Qmd&mIo9arO0|J95u32enw*GGpiG2ruav0S9)zS0 z;X-l1af-}$!fybAb0IE`|5h^jXffw%%`@D!WMBx4hr!<)C=&@2MUSNv+b-iVVVs73 z5OO<#(fCQEs=2!z=XxT0>mT)h4}RwkHrXGPX{k+#tgFY$aCGsmXr`SQ zZj|JY{Qn+?%PldR0Tk?Qg5r+z=gvFKv}c7G@E6SF;S$x8xvTVzQ((SR%k3f8zgDwDJsh!H z$C2GdJO?%$&>1qkpM3rZ;((lV^3iYiwF%%t?C?)#2u?Lp6y5N#1tfIsce~$?x8P8! zhbkcoG~j8hKUMxpZ0w755hYQzRZnJ*_=jRY6Z762=o9uUM*Y7Z&4QijOL5Bj!c=vk zdC{}RcZVfHipRXD;c)<)OZeIHVIt9#OWOCFWv2qC^#Y4(DZNxp=zYwkyx1B&sgU2y zc}^D}78j8_L>}o$3V~<#K@FXbU78usfGUa*>;5vCuk~YNqG#!Rr*_<5eugT8(tjAY ze%JQnEPn6#3tXB9@r-x}mtw(lYIa}msIc-4W5y38eY5lIp?;SCACp)Q0(JL^*#8v8 z2--U9f7rIRSzJ{l7nPKps!FYKsC5+bPv@qk|N7}G!s*-%sh5L6IoU4EhEg6L_Lb4) zS3$4y>iu1e=k{H^;0E0^Q<=->?v0yxys0HlV{f4>tDAmyt^kPM4?SW<$v|^I=d=rd z1Dx7U7s;lQ(f5qY4@X#`VHdU-><9Fs~@oCc)Lc*(RU@3B_1dOZf$B$po;uHkzJ1v5&vf%!^9Z@ zl`7sAB3>kpq(2|?e+*=N``-c?J7RH{8(&^Oj^a^|$t6@|yC8S0R>!t?SCM2Toa}jp zYh4;WeW__42ny2Pg<2>|kju(TTG@5kHM(=Ola&0=VJv&=%OC0FzfEDmdn5wN7#~OS zmy54Y1saH;-3}5~|JMnOu47&GulPl;rALCx)Bl>jc=dIWIKg9c;sAH)Nl*h%9s~kP zCWcBde>5SNuj2pR%w?nsfk`0o{Ac94q>V7{_+EJml=XMZcTI)@(z?olvi`GoS-)ZK z<-4r^Ymu}sn?$=$ z!tXqq2@*vPA}Hp!{-s@+2?k5p?unagfL1F}%ZnZV|BsOi<+Xo{To7Dcj;<}{&JbHVs^GfDB6eBKPG-llkm2v$WWasr_yxy<|7Cw2{fg5c5S=#auwZ@ z=)pB};=T5y#a}LZ&t7Dz5%YD-Q5=C-7lR{G9Al`%kaQ1)#`w4L7-jP`Xa8*6mV>Er z`|;x6@9ZiF%vq3T@n#p-qCH0Z$ytoI4LxTW!+D7e(TH7s&k3u>Tgp2seb&+bj@_p8 zap={HV=yxLW@Y}JLt$t{3I#L-fbx7v#>{MP}>QfDL(A|J^XE4n^H6b3C?B{^&*~o@VTKR*R zZ!&*E7(ZnGErdbz0T{xdGj22EN-iWy(#rY~8KZ2h;;CRh>KSZYM2FFMR9je;d2_da z=G!u~!D*X@kpMjPD=pi(ZyI2rzAE|6UxbWdJ>fQ(+QD=d0|Kvu5_YU3y(!xJb<)uF zjw0i|eR?%w8gvutfxN9*b)LE%x6q|tg8<4UOiG_Z8#8vBb9<3x7FXmKrlF|fKBC5I z7Q&!F2CXg}ZlSw3Zoc>Y+ynKsmUP1STUD}5%$@3KW9cSyAd&7pUqU&eNVD_Z_i`Vx zDKHwDYBxI&m%df-;z;h`P`M4N`{&G6!;O zF>Zh8=2DKx^kYIk2Qp>_ksL32Cq7$Z_j9 z-18)PdJfQd>ZT>TXKr=J72-FpYhPN{%{xXBIND*>>t;Xf7xUWjD}7X?ukEeCA0|X4 z2$PMy>~o%NYjzr>cktP&_OV{`R^%x0NyJT_wv2>7g)}YI%h*(t<|QUO&R~)_K=EgfAGwDUE7A zBIfohja}F~NAiFCvM+a+KkdETrT=CbXYSUxtm(Zf)H3TmDc+wh(eG|usMqP5>0}ro zyEq`XIeR)Z(fn|&7EtthGlUL0?9DG=w=nSa-u^jaKf~QODg23ePZNRb^a#_wHaTua zL;HRnSVlhIqF2&cWenO@09jNqB)%qwPtm(F$FOSgHil0sKxq6qtHMbp>6kUrbhSj& zh1at1Y8&(U^7tkI8yi6+$OWO=chNM_kD})QUl%)9-^mirn%>jhJ!}v$zxld3rY}kt z$7R`OGTTXL_?zBy8vIA?duGg@grjh>IpFV6LThBTpTSMKvL^bY%AB)qbhb;%vx&RN z4Nt#>J`xh_d8=c6dcOMVd_#lq({I4fl3(ImVszhCvGG$FRbchCr2z=XI;-V)bF$n0 zB=HfBfh5|9t0&R>B=(sM!auS5lL%nmcx>b9COuPsRD_j_t{q)i$u8OC$X_et9JYkr z=&cckSyM1i$$WEipDMSR@`-iom47Jtv@#cKWJHdpzF3AJ_TrVwK!5>dkSF(4-Ino- zhAs3|qW^}?znO#-k)yrIY#QSbZmlNWnONsosSqyzNQrAhn7AfFy4ckzNdadAAv=NG z5uOgf`Wbl?%Hv}!qmWzi^%msvFyaU2)7w6)McALGFvk&W;q^MC?JgE$Ye`StYISnE z`36TGxFj`QY~jzfg2Ur4q^gZMG*OM)`@HU*2NXT4MHtwxa608yM=!1PVJ^sa%W!II z-wf%LI$~;~+$QU%(cPPtof2MnZIQGG{LKh4pOx5t1R~;>bQq490k5PI9LA5EN+s|^ zlkVLTrchr94W@(JFS(ZuSpG#{??Sh%S1HX8v#iEbbsQ`YELd`0a8XY2NtUk4Pw~*9 zv}1bEAo3mR>Dl(JL~|x8c&tl4on6@ys`8idI)x=Bq4`k)h^cf|Q-p~sgKfp27)|YV zNr%nwl=|8~!ModAPJ^fC69#vK=Uc4ZwXPri6VJfl*00=z z)rMJnTTr6)%~Wii_q3k+vlJ^yBVY+p&HZ<3X=z4ae#_BNMH6@ktnYQ~H~fveFa}6l1w}n(e$A>4g)sDt zzVrF;#Q?M0n3Hl@U(?e1{I0Y>RWkpZn``dgES?6wHwvTA6$hPL;>aS$%OfZC@B!BimU@}H6K1vBS(+Cfvu5dwHDfwinbkKF zCsSEAC){iVk)I8Bx@g^3z(YmWX|kG&uc%WZJ394Dl3f&eR_x+X#hKdW>h1HJi}ky0 zDM1>cDx{Z$WdnuCxuNuD1;p5N=N4ka#U5Jk{QzxQ6uZ`DDM!0rt zxcjjA>a>&=PIYpRv&W=`2-FE!FD=dcE@f18R5@$Z>f}Q4>hNVTzDTw`U3$G%HpK@= zETPL4-`%e@f)N!%T@~DORA6IKc5&o#J0cDb%ZHV7+88)_K@DFb+JL+q0~Q1{^ko@3 z)IB)0%v3i(HsjXi4#L-Y@G)+H4?)PW)uVyifl@tdOT0G(i#P|P@`e0M~jXK7x{4*<11Q$vsI z99n#_F*p9;vZ~2*YkJfxmvC6W8MqCbb$YtEB)&XSGA+K>Pn*JHGg*>OpkYv|HDD;( zBrFxK*Caz)=TvcKWvs@ONtk=jUeYCLXKe7uRdUu>z%s=p&j89+~aIt^7I|VaOB)bE`6CLI{GUgjTKt24Z zxmA1NQ6HaAj=7Y$2-E};#2W(dC|XJ z+C*k*X4uUR0~-0*H&wX3Y&!L`c)jSo=b;5wOIlF9`hKyzzm@_X<$#1}+4}P)=g{i4 z4uAw2B#fJ3A^YNrL}H?+J-6eNB1Dt25#yJo^JPNQ z8dk0>TrvSMU=pzpZnCOvS&gXfcdT4E;P*E+KTMnaINcs~hC92QRr7U8!*a35SA+bo zcPs>Ujw>%(1TMyWxd8{sq}&uCk#K?lxXHF=I65OClPU>_Ko3b3g@E|cG^RJimzI3& z%IgN0+ue>wyg@IKlO|n=Ecw`9%q`$od2iQHiI*1W%DZ zK5)fC4IdsWjd26g>SAk&!>BQ7BVZ?z9B!SYL!j+WaJ}XFu-7nMjb!5mlnWR*VfQ5JNK_IYK>;PwIwdn@w#llHt<<|9qmt2Gtx&$Qz3&!CGod< z-lP5~S$$f_dL$7t+PfwU<`RleH~S_07w|?aPVi%It)~aG z8@~sszwf|?&hC*f$EK$sqz`7em-O$q3(Jwq-LWxHhMaZjJH?jqTg?#3>?h8*X-I!s z%+3zJFnr-|dZA^w30t?#_?C#BVr; z_o{UQ3{iJ{2S`zOX0)|*izvNhjHq7E>iMuK=#``(OY}~|#1!PjR&bv;AmY(C^>g<| zc26;JVbr31t*~clwE_9Atu&+UEtmJ-g8PHHD}~C3s3@9MT`*VVGJZv=ATz}- zg3+ZQf^+4;%<idhA z4Azh*13Bevh(u?NP@l~6L0Qn96m9xs^2=Mgb<~6y|gJ_vml<1!jEY=Z4+QDBfIMPOo;p!V8aBa4pKahKoaoZnk-If=T73o-T)3xY&5S zHd|?l9wfFn5{$|djoO!pK>f1xS;)`qU2G>x=BTAfP^ykAs?8ts;gDRmz!6`#La&3c zJ@K#do4#G^k;1bG@&?Cp`BRg(9B{(tE@Z3*=^l$Iy5Tn0H2^`_mEo z$%%}|ltQDk{^KA`dEnoCqloqR_VeSUKU_5ELz05`m%GI}-~{USaJE-A0~3_IXToJQiGUI=L9a{ z;gk));N>>j`v9ykH3!#IjCC*bHE86VeAaJgE=#r@fMlMRZi5odqaVXAQZ`bsgb(Sk3hYbx6(q|1Hf&+9f9Bw>Z1<#CHc*!VYEWf?Ba!KObkOC0B_n>7{zAX}Uen ziaCn8G!mjgYC+3@C2tx2P?~>TnrE^-2g_5NxZc`^_3Ae}x@=be#d7{!k)v5Mqi*Y{ zd-&OG#OvTGU`Q_yBTwL~(9-MW74jUZ!MFr_b+m3!P4109TkS}ivL9?VK$)>vco!m< z#^VX@(O4!ckVAiE*B9EmsH_)yme*1=7z76LI2iTQrGgUXgcheQ2lC$Nt~taYFr^(_ zH-x9IK|TeoNGb*V;q)I*;ih3}8HM)Lne8?gJ%u1gjDbBI$m9pS;ZMMMmiv94ofXx? z4>@Ik5Ga+NQBagjk4XWTsOT^QR=m;%ZhU+oi9X1ly@ug7c1cc$2rnWig@_rgYWov_;LgdV&qlkOfEeEcP zLyRA}7(n0XTWm~<>)Z#UJ>>7-j+e(8ISq8EDZDUGN|Oj7ui;&`+07tU5XcWTG%Ygp z%1~@}N@6M!FvC4w!UpDH1t$E$w-{kjYnOVF!L0)Iu^%KI=BT}Sv^iQ%{Jvup^OH}* za7zjx1jBscVUTO5O+AlO3H!m=ae)+;_N*7KJ4X`t)STrwFAIFa23acj%&WOq*3ES4)1|?KZ zY*1kZybRP36ni;dOgz%{WgQG^iS-VCB4ZL2IH31VXblyjve1xRN(stZb}^I!mEiSfaC6s` zbQq6DRpzzo%Lfk{0whO-!WIzmd9X zczAe*ylw>~t8C8+@DP(dGgr^@A70t>PTX*EvMAQq%ZLXDBuN=)8F(>V)xGKGF1ze! z9qN^Sj8($`I8xbUt_&M5Pj!X|m`8VJr+jZh9vwPHV)XNwe_&cY@#VxXWO$=ipMBD3 z<{bIFb9{fd$R+*SD6_~8)um#*@_9LrW^Yg4v?m?e1$eO={mIYvqzvfzO7O)<6t38l zWnxwO445^l3vo2U#YbuqYi>f8f4`5Piq_Q`z?pLIaUn4#0{778uqJb!8V#K&a=PrB z^85mpviVOET1^7>*a`8jBRBv`S8PBiOlf|nBD!YoW?{$o&*y4&FkUDNHsO<>&_j0U zJ~D9kga&!JRpPQS!E*(yk~5tOEhHKO7?u$Eeu@y+nBg6&#sd+dxeon>Hn)vK|GCngIPt#%;2j|{n6|-rjT3c45&syTzWUP`iJ-|=;1pLxP zD9PIk?A8yO(r}V{q$aCpn#fa7U7}$|TGs z+O9?s$o&93Rb9p{tVB+XeR{GODNblkAuIYZx@rt=s1Uf!;T@d(ixD^gi~L5ZXg!9L zVN7iVsoNfEzOYGNc1%zLCP518C&+6KVoZ3B@fwV+y00{9R{`|bhYL-+w>eKq*fVE?xN2tMNjzVp6i_b93)pQB`&lk z2S>oU&HS2L;6ZUGaTfa;Fg#&DSf4By_TcKRO)8Y|Tf9nX5M+p@2bK{&ms~xn#sJ7dUt6^E@vmd<^ zUDZbYuj60+>*Dz7opsueT5lWgw9%;@9~<=tJnd4&ql6Hyy&gPNgGe}ydRo*@RtM#& zMBMO#{j$Cf~BZt6Ci%cGUj$G*r z5saUCUY}7zaboO@Z$vsPIlUydPI*p^)vOfuG--hy;N9sXyLX_ zFnP)6%A%jY=*q8x?3ym7sP;B8g%i~7L|6l9lXA~v#bM7(K8*S&(WjiYxvRoq-PJ{D zC%CCH=oBhNy;{gzHsD9I&G+CiRC5IrVbL${3kgmSAAypuT@s$0LK!8M0Y+haK4JTg zM(0*uy`Ev%;%dV8h z>!#3d9^MZO{${DnnUPV)A0XN+7<4odW#^cEGVSc@#Bir_TC1>^fXQM4is=>7JatblnH@S>I3_t}R|YjdNs6yP$l zIf+t0n&GFvF;`^Lx7b+jkT>Hf`&s#E_Eg`7gt=N-b!A}gru2Cz?nlMbP*F*0(vW%? zIouMyC@p>4(Y(lhK()R?VwWx0B2AH?W88}e_BOoNE!fbD-Cc37IoGw@3tTgE=&1!3 zqAlDiiS2iqToNqw>`Om+WW5sT;uI}R{Q6KYy*%8}#V^UXlM`3SHdprI7jXPqDyyR} zsLP`-UYJbF*wRFX4K9-#v=H`J09N@`fE8}lOGr<>MUXNC*H7s4rfB`sym7T{94FkG zq%||wgi^MX{0f|t;+O52!?*cGxwk9;Q_Io5=ipB<;Qu2xa4|l=>K1+|`twQ#@`}b` zFHq_3Qfah7MEv4);UCn0}Lmyb{Pv!kNyLY>9t@horx5q@|?Z*2vbL;$0L1H{@~d=3sr9mL9CCk zqu6v(3%SYI)^HIed>cb=qhb2qy1Y)-mbczwj$NW~pBg4p}%3Y7e9P2ze654&2w=3tT zuf6v-%sL#1?%uo_YP|2$XV(B9o_n9(cGlNCPS&6MXEnpV&ZA!TlQeUhEJ=+EV3RJ7 zVzJCN$lk2lP9hs<=Msm?Z|LQRwRNsh`1ud|lchiW3C{U4g;j#486Z#E$L7hK$=rX3 zsics$Ez^-KKObh3mJ1DBO8!}@rYAkUxfTYgN}IM2R_ThwQya^G1!LlPQOb4Uw}+_} zEGbU5giH5-x|Yf<{>`;ic|RJ|2@}^3w1L0*MF!x=WV`76PCc9eVpblt66dImjp8)Wm}R$6`Dp*#~s%p;Hz5+ zUnIG6Eq?}dnNhnl!49aI!dA^u`x69R^Z+TV$WnJ8Wu;6Dq^vGtCA_y{4y^TM*#1+v zo_V17thU~u}D~10avWo95i2WO~$_T(#{tL1yF8WW%3S9jUWMxC2B9lsnq=D4L zN$MUOH|Pb!vZnvI2+Yo5mk&(-BRiLSW^@Gi;GWBw2Kde!3j5}+V-Qt&XYaCnWMCYb zY#yebYa)y8T@E`>023ljlOaehsGzjTqU1{^%0{GVT8^Jjv(0iO3EL)SR3lm9BK7=s( z16Xwl{RLRD?;aG9{v(x_@mQqrN_|D7cZ)KWQT|sfPZaY+f78k{T*NSNr27*Dk;_Mtvo8fMh`qHO=SM9%X0;e2?M+j`drp_W zW?ZMn0gNybOz>OQTl=#lKG05b9)GGAWUPlqw379l8fo^OW}8?qO>Y8`lm}FBc5VnhJ1ff1{?64 z5UqLM`Z1rqiS@0}DG%TxXmmhoK-Mn#tL(o!i532j zVZO%Js1|o;FK6fY6zrFlkP|NOMR-SdqkmylH(bk{F0B91DeWYNnTMChq>KMu7!5x$ z|6Uj!INh_Js}~TQQG8p6;j;`HY7LFp$l0{?+d_yMgDSER?RVK%Ej!;|@6XEhhMoinmoWTOi!L6qPre4l8fpOhk|VJ?LZakDHzoLMEU`I1&>HJkWeCm6i5}5pn-wV6TRw@P>RelC^G$leNeQl%{dhUt7G}n7MV0ZdL z5Xr>p#7n#*IsUrP!jJ!^H9#854{lc{<4;EH*P{k&y!YJT=IDY?YhO(Se-OE6`{$A` zPxby^mwcO2x%Nu7tRg0~GD`5u0JepEKC(y-K%|obK@HWU8W=1wn>_Z-`Bp(pH+sbpRN_CkG7(9>t<^6!=7L#FCDbBlgJzvoDNepP72t6Y1|Z z6=4@1AMGx(BMz;P})Vm$uGRUh2bO~vv5 z_o`3w_t#aQ)Va+DOPfU76$aW4p3Sq~*NC(&;5o8#2`TYss*INGKel63A| z+Rs{aKnJ`6P;|brN5tAEOW3~U(170k!ZjU#L<(%RJz7yDXn2(|N6jw=j>_{IEspwr zVLaIdY3%1d^W}OS(1Xd?4<9}LwVpcP4XI#2E%B`GbNjGz6JHIEV9KQNy%4nTr;CoB zBy+G{Gtk2h+4jgP4;Czv6|dLhwYO2x6Ooiozuc1j-gR_!nro9KYDwA^#=}2By27nF z6XUkj4P8P4?93a#?=aQi8xieU|87%4C?w!mXC(wc?TV1sGeZwT3ZE3`#C%iWagFsj z10R#3q5^m&Q;=;HN99MxyZ}T98EpMhMd3V<9tDp;%JptAXwuC(@M2`kF3Jo2yy+B z`b~NN0HgG{z3{sZm!vq*&S%Vef2J6u9x4N$YH4ao1|J`MQxgQ#?W_*Z>^3gslT-o4 zAqP5VKu^RndXorRrBG#Yy_VPAt1l7LF2?9bs~%@vM7({-T29mz7NgEJK6uw+?=*Xo z!FNRSls3%mjt!vMl!uK`qb>{P`we1xE!If&B5?Os^v&K3+1|LBrGsdhPdkQQvSw4v z!JObpK`&B_mlB5lHrM1^T!3=SYL`Bsi8`cGaZRrIP~Hg$Mb=P$BMD=}!l=}bN+ncf zGAHw2s^&k7kU?payb8vZ~oN|c=#5f54-Q#-mMX1mPRcIA&-gl4bG4~QmW z#x4LkPvM1}W3<{Uw>s6HeOsjwUWvWb3SifmiKBOvBhXiFM%eA$;IA^&OUH8nm;tSh zj5RC1OE>d)YeInJsjVpM2U|9m8)&Y;*+Z$Ty-*iMh0dV`Zc(&Hq}mz<*0ew9s~8XJ zsiY@fY_SIA=ZlQrQw(dSfaQtxqa3t9*5bFWygla7^5~uMdi`BY%*|qJlIWis(^UzW z3o(9A(HsfBR(qqv&lw*K6J)5j$xjarIxJMeYbwIC??O^6Db;f%C(6{o=Gm(k@JhaN zVkl`1jZtNyPcrOw!;b0e?y%J%>|;=&Brn@oR)bAQGWKHyOzk#DWEf}3H;Q3ys5s^k&s=s!s= zp52%#c}IMkiun;z;WqVHVX`0VF&p?;a+rAJ3Oax1QB@x(Z$mZ^;g7IvkN=x;_>W9Y4%)u)D_c zaY-xIXE|e6wZIyNBMAKrO~(^ETP9jlO52d=a(z=N!A1CK06k+g5%wd_?73_x_I~)m z5wVgJ-CZgpr!Lj8d$PwohI3;|Bw%Q&sp7lB32FBqN|k}SpDf~HA>mz(5KrUnY{Z)i z9VlGwMTfnFWEUY{B=cRg_>`22S-X$@C~!#z`_u3Y)o`jr+&mj^oV>=lDD-DTEiv(0 zY5LDpozq)rGJc)dr4jGLBl=_n0JC#yo^>#|7Foh81YCmO1pG|O4u|=+RmifzDvvZ~ zlSWSH6xwc`I2n17ZF3qN=>2&frbA#GyJIHk0}p3RZ))5uvuo2C3kly1cVB?=gW0P@ zD#~L+cTz@Okv@~P)yAs6B5y!yA$|+(ugH7ODLL@1AGu#DPR|1)V_q;k zK+edJlYc@s&aRCi!r6K5_AuRKd`$=N>=p|usTc>2rOQ)f2go2Eb4a4F9D&oY5!KM_ z)Kv*E!(;20BGzK*v5P2@<0UD(Y=G5{8S~2L{E&DIy{Y^IpHlVmtFTiF64As16&u2` zGPau-T+@vlX7vb{CCNv-VP>>lyr4m0 z1E2Zg#{469vrd%84LoV@g$;5+lNORw-Rbw*0ZU?%7_esFpWke9_;jCIq>G&#abH}de|ufnbl zE`|rf96xc`3z;!*wvZ5lzWobx8g_)5@9@SVHD>P2%r)lS(|K*m}ppoSdo&>JTh_euo8ny z5X-mDxUk&6ufVVPqpy0(T_M)S{N5Co(X@IyaKFfS2U!Dd0b@<$oNq=YU+cuu5|o6D z{b{yjx`?Q5>rl3soN(G(eYEN4!wS@fL}C|%d@v?&i5|Ecz~l_{ z_V0kHYMPleiN&I*pI!TJWq);md*#ghXaDK|NALXA0Unk;v-#5jjP_wk(U7?h zgpesGJSF?%aQ+RL!e0}A7d;JoAHu5}5X~8=;QqYd^7=USDsOYFn=^ZW0OgKGVm9lN z;9k1x9q4k9-29#pcdOjFtwrhI$#5s7CV|$=0azATB;85>nfRU*HC>3s1}UcQ;m8it zfzOmas6t`Z0g2=K%PE%P#8|#O64ZHh#>ZVWKhBT9^WEeb>)i3RdZ})BE3XgurD?-( z>fEttiR;+0Lh3TxZu$J-N~US`b>pFD#!1QT%km^5C;eZ$!K6PeC_Z0BJ~H0c(xTqe zKAT<5YRK&QK2!wkcT-0CZ${8pQWk9a2KGuCU#Zx5%FP%AeyWcc(o`ow+UeMF{SAnM zZS{aV4Nr!xPbd6#q4QPv75y6zbwatsz*{1ToXLVOVUh~>sAX;JzT2n?@%ey|02W>9P|ldp|qr)sE@1ih93Y3nBwTgj{aTt z4S4=4`-**)eXmv~Jlr0C9ySv2L!Y(7e4Ip#GBx~m{mLy59k%c?OhQ%DjHIV4BPJJA zZ6~Ze9~B?!`__!@G~7u&A>^%+VKeeMr2e#i%_95)wcPx}anktt&9kDs`pOB~(JZr) z{t(}d%P_4*1`4~Xt(X2o>oMvXcFl0!mKtLHEpq))H+ELMtcq{T&WP1kk_+I>s@gLp z!zt}A=KJ4}CwqEJYPmlPhwvf_@BazniEKxki$H_NTm7pQEYXd_P3;X$CzM1{`Cc3PZDIqmeopD-iI-n zX|0uq@QvQvTTcPWLJA5quOYSN)sfbxIr3aVLeQwChe&)q!rTZLCo4-oX#Ik{@R|(+ zBL<_&ch|O88hP`i5f1E6Wo~b~`nfZZtC*0Xe2p7=#w#H$8UpitoZh<`Ni_?cBt*a& z;wp?+)Uh-g-vKr?bR*?|LE1;8_&}Y1Vo*Bjk&{)2jYQY{U~~k*WnUaYnGR4G9?=1Vx!OmC79ZtHf?vl59pSkarGO<$M{eA z?%#_4&tNC5RRfp5J;=Mz#yY#`jjOL44(GABEz(7hn)BwbDa6J9GTO=dzlwHBD*3-d zJ5gy)>ln9$h-1ImGY7xSEFpu2REx+EddtVy8jQz{3;{lOjAbUNU%e*UVQ+fcWU`Lj z!uu`FbrS_~R{u}H`}%(fc>lwAN(7`V_zUrr;b?;^P{hv{`D>jd^pz5T%nb;zmB^A| zcZZ!15hD7T;q&@%C<++Wa*pMo>pL%{!-u#h1`+Fi0Xj&if{4JhBkp(MV1!m7{@Ot@ zVqSr90xXv0j3L%vHgblEefjX+GMy+gh?2jJP;-FHW59qM8|SI0%=-WW1r>ITz=1<9 z455ctXh53@U}45%yEvo)fTP*<`*e;Y3TsID7+b!>B2q@oPD6TdVcr=3IuwB`U*?x& z?-#Umd1a8^+EMv7E#_#)Ekx~7>rtSpX~5rCc>{blFGec!U|}4tVF}w_7jlwxxvqHN z!z1Y{OLs55oYUeKAS2|Al1Bn0@P`R=!=Q^ z@Sts0XueuV0g#Csre+!nkfBKgfYOxnX&Otg`-a!{DCs?f2$21w$BJmHG#La2zu6-L zdmn{5Ez+ju-^LK_{~ANI+j3QL{4<6KBq5%|0W^zhIMwBhn?L{#qE+~9hR3&-Kbgpv zAJQG7dgR?kg=P5o$9IE@v3PTh1k7lX9`6vM_`tBzuh#RS`ZM%3O@4PT_=^T0iq^3( zYzb{2myQTexh9&zp^rxF_nB4nOwIKzez|h`L=X$z-0;Tw>;-mqw2fn?l@@pdNFBHv zH1uC1bG_4j*XRrK-jF&wpU4l0uar)+>zbwFMm@BSjM2!es4dUPR$;(>RNgEJL2-MG7 z`-LvoaxIiu%7z8H^~^Q$*QIA?1vW(&7u4zM#2!0sn`oVlnlbgGjA!3Ck=5M3vH!6e z%`R!mHb-&)jj8<`O21KDOmm2|s*il@#j{*6RQRp$NAG+Cv(#nHc`&L8VMsN2p7yUK zK&t`N(+^Z!f?gQ1!qnYD*RS@my(_&CDwa57hx9E5=%PPvWSUBIb%44<=)FAjEySC| zMHZnnT!-vYS<+;=^{*Aa1{QiF%@~F(jl%s}eR$=7A_mKBa{=yr3v?-4Ws1zR#pGIQ zsCmcPl5^uM1Si=VX7dnxF*pixO95R$eMbtdy5=FdmDXO1i_=|g!$P9?{PE12_fkDI zYN2~QIikZ_6e*Fd;VLfFeL+X?nojeB)O|pH8pYV#@tcL=1Xq*^TC`?Th=L@6pHJ^V z3g1Git4d3HmX}Io1ex%&bbi)UW$X8Zkgi~Ag%aO$Djb95m$#B3Zw=cX^C%e~Y>-hY zOOCR%1y-7wppcVkyQh3L5MS~g%{=Ic39}X0 ze@c&`?E2bS{TEZ=Im+d9eRbQj=Na_$JgB=^XrS;WJJL`)5J(3IB~USR zYpAzWsLUyu!=%8=$~)etQe-DEEfm8q{Bi+JDiSF18X6m1Lf+w?zlCNwuH|3jeXm#L zL@fjLpVtbmZShslKdqu}d8`_M&g8BjZcp)2>Ew4^18V0RzE4jptAoe-*_nziJ>+QG z@++83gmO)+1G4tQME!_vBTvJfTih@`Jel!?!OAgmqK@`aXTM}^L2r%5NK z!%yVw0OqvELj1(obz5Y;tjc zoyVcUoh!A3Ztu&ug)EGKSpej#52;65B=v-sc|#m6Zb(%(na12ObJ?I^pB{G$-Xxj_ zyg|4XGa+KifUOD%x>-D{zY8K0B zQxqNh!PoKG!~N}mPCOgGG2=#v1%#k@};#Mfm`-LDrYOjLu5tX^-G&ur^9GaUk}WQwFvb{3`dIt9${7WtCCCX8Y}_`4^Vmx zl^I)`Z9y(RCLuR0P=rw43{LGfT0P+8?79iBz-J6Zg$-}3$`wnI26RN#o1%|c$&r@_ z({(_S3Bx_QYbtW8g*A!}SRMQM<6y&<0kMA)zoEMhg>b_%b4NgB35HdD4WzU)>5+3D z=*OOd{Uh;D2~G_-58l%QCi#OUlWxg^o(P7C3SYPCIy?5TOzQhsd0wfL$(anjvi@^| zkpYfJ<+wZfrgd_X6Z-{4;M4sLl*gKmEu8ENnH@4Q!BgQN=6m;BFy@Qw|OS_ z8jZy?R~u(lDYArRSUehAxH9?^M_YWK(K*4{V-@Ulm`&d;u&|3>ofU7!%3^`ZmdT=fC$AZMt!s zxD06gZqCBY)3Im$;H8a!t(W6_px7OrHv}1kt`QnHyvx-%8JD-K>K|m_oECc28jbZ^ z?B6g#wx%SMIlc9?P_&Qly^OChQW3w{v`E!SnvFRmwl@)i*Jsd% zrfnKu*xhsen%es44(*K+Dyd61K z*l@}*6lUd?B{at<-M;45m6$p*b?DWZN@hutW8`R4t2FWTgGowK6mz3*{jgb&Oc#3W zM>Y!rZ5?ds-fWyp&Ey(xKI4^8pe!>!~Iw-(>J1sF&JLH4TOZG_R-ZT2LGLr3UU;m|!IlykR)MFin+QHbf( zx8Ax^0Xi+)hH~NhXLe?-Qm5>JeLH*a9`K*ITwL2;L2kRQEZFDg=Qwa3Gao(2*PEMM zcXU=yznra~jz1&_dE{|w9 zX56B#qJl87VW4twa0AAx90wzt6CKT8-*7LnHbK*B(un}sF@sxoxv*pP@=*@R2je=* z&uo~%RQkKOu|NcK0=E4q@G)Q7-LIadOYZq^MZK~61&@zFLwyZd*F0w9fY^ugVCF|S zw&9;4M0hGjmEQ&9@3?#E3x^4$irRBusUx=>{7x&KQ}&lUkfM})@k+GuJD5g&pIs2x zE`WQK9K3(vpY+$Qi)(EnmDBZhOeRe2XB?_p#o-#QW8Ac3nu-Q1uTq*J>TIC7{XV*| zOcaL3JEt&>e8g&E@D&gmiT5Z)rjnGGu{-De6!qHoIi_Uj;ME4;e!95oWUdgPNV}LX z6)3!qJ`_{t4a6V~U|k1+HGS(HlQ-wR7Ij0PgC!=9Z21_S_+=^^OC@fBecw*`0E}Ar zv;9KVYW%XSM(IeJhw94dw6e%dI5^kRwE(IF^OP$nqKPr9KUa5ti|^eOEGP{1c91>~ zz$FeC9}c}GAz##6OVlG2no$Bx}t<7LGQ%^ zOsMv%N>wk$h1S7$EeF-aCkLD-jEOWOY;_h(dc;S`A?T|5-cr^w3RB(Qg5Rcvs9T;= z*O*CX0amkgsfv+Gf^}h-0#LDbjCE)J`q`SgmUMW zIWpa8)V1}&VibB<5r{^doUT|6qC`IIqW&?v4&+QeN=GKxpksHoON23*i)m<>>+%-DegsC}#v`Uy zFRg(!f;RJIw|R_)9K&FoU=g2M$~qiA>SjrGD(SM9dDTOZWtLJrV4lqrXZu*4(@w%r zu!9sKdCPAw-Mlj^Bq@l!TRUQN8ysyd0q)DwfCUiPL8~)F0Pd&0Yvhejjny$|Z!4$( zS|%WMzXT>In|zFc-ug{v3D_u9dLF9E7*MoPL_J@MQs`Q2x6hgS@E$qu#d z3u+f32gTwtXjMdfMu5aaJ;z%|M&5Cl+b5P6n&J+0VR=_CZ{wstR1gc=rX_*FUZ-!o zU*jib=~I~?C**mNl!MbDg+JDlHq4~aAXhs)l!CY1+Ab@F+95)kcMcS?N7O&fR_?r! zFl_hJ87^#)^cw3_pdua!T6JyNDqglvMUzqDsPqbKHjBOa8R)V;$%gHE@71mEk&Co0 zuGvum38ad;@UZ3(U^Dp9(Y7#SWk7>~#F&s9n7cr!f#budr7y%{tb$r|H-_69b$^4JL2nMtE$2}2jFZ=7dLSoj){2Zenh3g3;R|P4!n(NJ_(L20h zi;az46%}nBl`vK&`i|!EjggM$CeE%eGexmP0ga;BP{So6jC8sq@$Ud$R<~nmR8L2| zR}2~MFt{KClWEsc;^Uk%?5JL%+1TlUTwt!c&&eZNrD!t%B~f=3Q5K-5MNXHKEz`*I zYM|A!VnC)Hzv%T`BBu|6Up;Ey6j;71DiiX+-}wp6dI(bx0M_Cja<{+koU1gi-9;YI zh#_F%eX^&-+&L)3mm;Z%k^Ssha~TJk;6L`Au#S?a$qiOTU%Z(1cWIhH8dgt4#_eUr=1J~DjFT`HeViV*sc@+5YsnL z9nXEHTPl(PPuTa(my-OEL2~)zLWaZj!#O77>H1KQZXO-zH7~*v{j@RP(i}Lc})A0=H8uc6msjx@Wm zIWht+;3zZjPJ`_`B7YStuG;Fl&<_(iKq3!}`9nsVhVc^@TqPE)2juf*#kA@HErOZf zVJu^v^V_-^TT9O!(KcqkCWBOdGQG@V~{wx+_GFs0dK&`-MpXy;2^w z#V)|K58L)}9ehU;;&SdB*Xyi$L5lKt{Q>G8c0pR@c z3ejNm;cp@+ksJ!OtHu_)$~~kI2u9~zZvZxXPqSsEdjdU(k&M&$?^8LJ7<>&bzc5zd z$f?%hGV1cc0N-XCGnpdJ3DuN+FjV4&`BrmHo|pDyRY?i2pdy0V5gA~6bEC1vb~Slm zE}G~KzwagaN5g6*I9o6L;!za5ujwCB!p`RPlm~!*BFTtGm>TH`ejM|O4FAeakZVD=?fjD#vh?y-O&Hkq@_M>rJzhakM}O$ z7Dbb5lw!`@X(!25==bkJ>wSoQIDg`$Rp>$(&;5yb`^MB{J;#%&wA;idV=}hUn^xA} z`IWfREUWBXh$(|<&kH{j>gb=@K2OH2ER8oa3pO%jKSadmK2#^8(hB67jM$ryaSew^ zv=)@KBg46eDEPbX(7*P$pk{h+p)=p6`^;-NB#VdBJ>a!Izqs8dpgE%q9TafkAw`NN z8b6#x!dj^p1kLgq=sUcwlg;25Du~f!G?W?=$O@bUiPW!xd?bEFsB0;Yh?bk-=m;mm z$;&$TEsHvgYU`g`{=%Xt3X+e(Jlwydd)-nj-Mk2Dynz^NR`&ZXdvVqi2|ngHAiyJc z{P|4Zt*m^Z466}ggp+auJii;BLwWjEIH6w4z^5(sj(b$bbXse+Isfc_3+E*lkKW(? z>`Wc3L#}xU8Gf4|i`(Lal8~d^(2%t7o7XHFQ+gFy@o`*X>)S-!1K-U&iFl8#SG`o_Na7S~P)ob5U{m$8=Aie+ug!_k_$Kg8~&_XIX@Wim+{L|ghQ3$&_*NSkx1-gvXx`yxf? z#!MX>mvVd$m-E`K!4WQXOgwgn`UcPkIv(bmQTdgk*fnmT=KBQMS3McH~8{BMP&lw1+{Anq;fx4!@mvuJtwNei7%jqC=l!)YZ_5Ga#z9 z%ws`v^JR$EivcHxin;2(!=H;_Jy(#Z!c)F{YF6RV1dQ|Y9}-xi)Xgu*FoiRqMBQ=0 zGj$4_v+C}al_Kk&OM(ZL?;w3(%JmG1gX>zKMpPDar|dWNMZ}z{%RwJJ@ z*#YS`l(U$R&C`D(fpd}mC4q}wT3JcG16a#zlj1z1sllqjqR{-JKB~GZnT!LJA3Zl_2A3TttD?eoZveF`|tUOC7ZC=L67^wd79{LppN;(w%pIWc<@m{+;c zIXBnVf<7)`@gi{XB0H}Gn`QvUfLh6Uo>lz6jcwd#ubMAjV^5AxmwkTle&D>HJg?0; zd2xH~gxEOvdvPed>NGm5DD) zM#0xNjKah4CV~wP&?CY(5Sj8~LL6lEq2cy{+P1TOV} z?>sK34D`m~-K z;SY7W#Sf>We~N@B$v)57&SE7`x!~1Ma8wf(2fCh~!p3dz@oyimX8fF{00-VAeZyC5LTe2CG$HbK!@Hxff;}`RrLl!(1F2L8^Ff1;dFu;I%1snY~y} zS?M-ahPD#keD75ewFN1G?R@z`IPn||%H_UKFwqz-49JBBTOjQ8L6e&C6e7Uz06st( zBQ(m~+0bR7JbzW`oM|BoIniw?L|rMDjLeV-vi;n^OLk2ht2v;Nn{C*G%U0fYG46g{dA&y^?6+T1m{_`ox?Pnc9$9)v^!-l*Z zplK9R$D?nwjN$XZ_nG%tI+ul9nfo<_yGngU(}%$o3(`-H#=+;PoZq|Q79!DgPJTRo z&_cMpS}N?cRCe2+y=_lch8-M^4sic4UdotUd5i+ZOS8PP5zC;(amkdzw#B3*y#twS0QkVOtrVR_~8wy8mc zWxQPX%E9P@UF!=14>kYbKh*fU(SYh8^?M$3N0t18;$76HTk;ehKP3| z494&U#XkE=C{d$!7mOk#?#?decwO)VatVa?*5uToRAA>H)T1LSBO|&EvJLTGF6RjPC}{F;-^W-&Yc=|OCr5>A4-Z`JPfj+pnu);}gNFW*@Z!5KB* z%1cBef0z`n1d}-#(z%-y3ZpSsk{dWr=USAXTbZ3&W>NI1uO{QH#aHAVU||waWONSL zL~uAXRpNP&tIGXK11a@R4^{Yqlqj(RfAz@J)xP5Eg$p7*H!`%%D|6P4@!8x@XxX8E zodh!4V{)utkDeHna#rB_4L15kWb0*FsoK-^@j_#)RSnQQKGs`}W_9%&dCL~bm~;TJ zoP!|H9S`>}!VRZ-0>tm9x*vUQc$<*{ZIYKNAGshk*VkQfx~1B}f+cJ|1@VYT?HNOq z(;WWP%P@~D_XMHA0mgnHZ4TVvBvO^*V##m5=%Z+uV)Oa5PjNtHqaxjvjja(87MR^S zp>jr!bkR?$jUaoSq}HY3Fynz88evg_AlVFqg(H-yGQv9L$ z5-E{y{OP$74{lvF;$)z)Q(ipc?8D9slMmwNAuC2lG=x-869*Z$OMvnkW<_N7FGmEd z2oO_COA+ds_+sqwaXxaEGA`4AwL)1Qi?9h#QjSN4{G(aG7*?7;CQQ*dDAJR$ zY^JJ^GDE4U+v?tx>Y`smm83Pjuvm(7!8)j6;#j+20mz$9 zGG(AB&>`98+j+hcg9Nr1SQ_?-%f>&q63UIX1rxCz$iP!*Z+dPGQExpKvYg-6@Kler zg$8R7g<*RoR@RpvH50ZjVX?4nY2qK14x7%ih(4uL1qh0QU4rdRHl*Tfzq7uZJNli!^s*JE$%@A1({xW zW=crlqag^4UT=|tyutphS6XwxQ6Fv&o`7l@G`S+{2jFRiY8UYr+djauaC8GLdMh+CG0qgKIf7&fCu^6``9B%Hl8XUmvDVtC$$6M`MxfcYB+!{!Q|702^$V;mQDze=nHuq()bBm1od23b8a- z>&bkpqnsqmUyvEGSlVp}BMQ=DstRr&qu8P*Zq$p-uC5Jh*p}be z(&e~P`@*qa)z{e!&PjYn*3o@e(ZZGf_^Ga)?oQllG-Cz2Stl7YL-|Nlkh7~hf3Lli zqh^5SWiyImTs~|?h?d5M+8pSrN#hW5zRXfASEZ9|qJywwC<_w>*Z!FxwKiRn^OxJ8 zh4ZHL2}+y6Ge1qLqDsF!zkiI%^44^ADKD)`dFH9EMb-9@0%y6)C1M_zGkx)tby{|3 zo^vp~2#bMKH3O_INve;)51|j5p%F4Bz+#Z%=S-jcXS2+jwC#U@cHsZ}Jvy(sO7p&%pnZ#X(B{lEsJr zki{cC&(5bHLs?({`K?DQFOk-G9!v(3$?cEq3&D0 zx|Ji{CC(5!eIK6~wZ(>tM4~o}p!Oc&ywRN923tl)c3u(%VAr(=li}-P!Nq2$cm|tC zFL~LNb9s=g^Rt}1+er$cq z2M5RYX%Zg1l+6w^obulBLDHD{`x%kfmBq;fwc~2=1>r+RXZgle(6^SvNO#R0b?#0w zm#&DhOU>R##oczZ%8OQ{jwM=6cV!O=%QZwHa%5E!lDr%`^^UHeHsxK1i)ZLd+cR>v zUneY(Cg*|N$BtdQj5mn&EN z4>^4w-|N-GXsP^EuUzB8slGsJ=OFx6EKNl7)lisZxS%__j#Ft{_eB+HU;oLW*f&32Kw zWNo40T@4P8Y{6-CW{Bd$oOaG@*<8PN2GsIDFeL?<=D}bptt5+U3O~(r{7O_`qc&=! zQrFr%E?W@nK^>zD*S7g(7COpkq4;R7pl57;N9>f5Ms`5n7LuBvRuiW*{v5xt@3|y* z&TnwtddgwG-9yi!yY|z*T2Lv8ZR!0%8@-~vy?LVxdcN><{zbh2-#U-Xr`XqAswai> zI+J>VYX!OlYA7qVjuvboWYh1Xndi>|dnfDAoAX?7{H$YM_c}g@h5v{`Hj7&|eyE&N zS?Kdh)B5q2h~`^m=9uO={6==q1$<}82}7Q3`j};a?#XZlr{VdLF>kW0yC9f3Tv;6j zwGa5{hsRlImC>2u?%(*N-G%ua8mQ*ld;QkOf`ikE!E9@h5qU)7h4I1S4>bS?A99V4 zH8s|i?hzBvJouU2`>C+&75bEA`=&hr^agIS<_K)VZn+`$7RsDJ`*!otN`Jp;;o4~V zUBBUAs5UWVEnofd`E=F6E`{tkRSBPSBzmLpX&NrEOFnbG<4|0^1*YotkW70^>$YNQ zgV~`yGz39p$$cp-vhBlc$W#3i9T-q^1^(dcb<->Yt+0^!&^Kphj*3>Z)N&h!7U*D+ zAtyJvPph?0EPOGMk)i8?oi)Gbq@;MjHK8x^jAWu5J0p|WvHg8k^z1%;E5@BwccXgQ z2LghiFsb@hKE&0tH*>@$Iu~vusx95}S9V^UQ~Lakq@>dcXzT*J04mdd@6>c!3$Oiw z_dwI=IET|?6!0Q4u+0seJ+&POOl#My8m_d_5)Mj77dK(Yb{2ki;JdMBJG%Rw*SkXl zD@A+j<5zC}_TJ>>lGOL{tE(#tdpl&{g86poKF|KvNplV1TdWRA`AE6QTp- zFw7Q^^CYd!>$B(cch6#0A#cxUPYKJw$kc7&7>5qJGQA45^9q@xiV-35(~2}t0s^th z(0^neoJZi|a6JgUg69pnxxLbwcI@QseC%v8Z(cEB0;pWsdEeAP{77s&;YE4FeTRr-g3QW%1+t9uD@Z}y%{pB7|Lh`VG zV;s;V-S%H6A5|O=jjlliStIu=(1Of0M?elh^#`o<&pyAs={e#qSmc@@p;9@q+cWj? zbx@sj%(~mZL)(`H8#Tqf3UUV_%sxIS`ydc|!P~)*H~7|c>MZ!EiQRPywxoGYH&XRV zYz~0OE!)NCY7q~5d;8sf9ehsU{yD0@9Y6CxtK>FQCkEkyvBjO>l5WcN)Gf(IdpNJO zbbwgP41nW-^7ZXI3BzSArDZ4XAJ8iE5K498Q;qSKVW;&X-4e~-`07XHNNLPWv; zGd}kN{wqGe0w~7wi+9FI;HDz!@Oe&u{ML5EqmHV;5Bhi?IAWQDZ>@1YiGJMa2WS=l z8YOjcnbG4VhE#<~CYDogiSwxH0V-pQCm;$De#9(I za`-!f#6olxmKBic4a0C!SV$;y;i`x%PM>mws>N<8;PE=xFN2@Y`+}Hxp(FP|XIc}P zPX!ToOFmgM?IyUj0ebX#)f@KZ&0<*bkO~7R4G3SC+l+Ig7Tj4H z5#kR$%qAEUrDvUjb$);H^9Y0fa}YZzHp8>({gi`j^ruc03?wx&ifoX}P50s00MGP-BCr-C zC{+?lG9b8wlj+%GAWXjkdFCh?OU z>|k%v04BIHL|>JIhAPB?8vzf;wxSU-D?|pG9!b9=M8^`_ zS}g%OSXg|Q8U{xZL2h(2veY^=C)KwYkzq{xOMfYhOyAh?ES$q}dW34aL2h(->Yc7W zZ;8x+)fs6euuMq|^_k@sSUrh(bR@SZ5q>>#QFq|9QXmt0_F2UYwYITli!?8=rqwig zQW1YdqL60Kes}2cG4Rqu#t5)LBLLD@8BP9H#SXv&nt2RI%3R&jA=1v;wov@?w`o}43{Qb0=svddq3|`GG1@o{jLVW{3=FrI(%+TBqsaXuE$TK@~Di8-f3sk3S@JzD;ouSw&F@$gyF; z!rXig08Boft}f1}f2x)UeM`_s-q1jY>Fhuaf{6g2;3t!$(Tsb_seG}Ym@ThdkZRIo z!cFR`t-yd^RmJX`pG1m8%{2K}dOkCad3rdPE_po~RWW8NSQxlr1it*6oHvK#-Y;76 zz;v4gFUj+MMDveww-+jz=RWs8d_d`)8g1hNDq~l(I!e)04S~Va8|!o3Z5GY-Y2k8f zsC-{iBJ7EZNfucZxTC`)UF$&!?pKgO$I&A3f0NMo|J6sZ!NJ0Tn&N~#X|d-a4AipY zsIPB{5Sq=GJMdOO6>U~KyyJj3tQ4EG%*AOlMQU6YCsgzJW~{pOjemHG94&{@TtV`O zuPPM5E6cims*s!6w^^B-a)_}WmZK@BNs^xMK_SXvwK9!_8 z{;2o`Ewl16$nnC!7!t!~grGOH)8BGZ^z8Z{zE{+MU)fR!E@Qj_?s`t|ZtGM!alR)M=;%1Tz8fEwFn~tXN%-`Pf)~ZZ4 z9MrR>tzgnxlnB{9=12i`-C0HA!XWPCVA2SlqfkvCKKx>keo_4{H*KN0i4;S*+k@9C z+VJ>X7L@D4fR|NOT#TaGS4gGEc;S7mOLdER2y0?---pnfuyFo1d;G%38ix>w%45`3 zuYQlF%T86LRRX3K2Dj$iGm>a>fh+kl1LG6QGmeY}NB#aayrDA()=RRTC-lq9LZ!2c z2&D0MEl#!r2-IT1ReQyHz6xi@h!>hm5Xl^p#REbV*ezzqyrg*21ISO>G{P#FiF5Ma zz=tZ2OOe~%@`x*H_A;r@vnj)i%e%Ixk=T7)+8njA4*uhn&SW~`lt%UKRMRgYLTF^KJs10QG|}u%Cz_0 z7mYMMCNbG@uC{ciBN7UNSaPO8Mej0)Q@wFsSNDS^5I)h?kmt;4v?c8>C~&S4uY(Az z@Wiv|Vkc^sZf|<0z%HhcR6@f-PxNd&00}&u2W>xwdX2fx>5SE%MDzaGL2ku1OPW%N z$>F{D0+l2;3?5>Da;odB-QhKHUPwM^g(PR|=0|)kCE)@6J|%?cXbnuk71`Yni;Q^OLKeiKagfBwoaB0b~_vk#Sr6xqc@?4i3t(1JHc4+1rxaSJQqq zoTu<((6-qEpbztab+9vZbp$1+doBlAUxH=Ntn#7x=&AE9AKCG^PKvu0QvL>8=qv&< zY-TNXd6Kk~FK&UB%Yyq`M|&nwrucGdr%U2;Ow7`)-ZvpX|KTGR~D4dd! z@wo@kFcy@{iR+vlS@|O6PkiaMrk6l^D)ieWmOTv;zq3Q^2nLRj$@D0k3r*y@1fsNC z;0tH!@D|5!*c#Ki+h7+TatRH}1q;qLip*uv639+)WX($LIg%xqY}9s&ti(wwC2)OW zzUGH%*Y-EiF}We4i9~Wc#Vlz);qeeJ|HfJZ{&DzBTE(%44xFR?Ebbkea}iSYzl=QG&PD=vG1`@@fZr6&x9;mo_T=J>tVLzlOw)8MDQGhg+H^kQ`l+_cDF zMWEQD69B3C!YR-`+3fwSB1emCV1r1F4I8U;d|Fo_jrkQ!%&4~9256+7PTFJf=Z8WU zjM!+~rh_6cyNeS@CHtlPhQL?`xcO&ig{oX`sMA zVTl~TvT1M>n(I_l>l&$?&vqRh6ctT2#d)EbI*%YX#Zq;=%yaDLX!A>@7#o0?r5hgO zTkIACx2mpizeCgp-1afFuABKG-CgnY2HRVXJJU#+E_8SEJm7-bP_rh6Lgj;A5?8^B zlgnY>n10KL=jDsD-uM8N61APcHu@(O^tqWY{WT+|N&_QWNWGQ}iWM@H6donS%>g<< z>St{*rZNetHn53YLDbt?sVEPGR9gn)8Rw7$hN!+X){3nqr=js5Ru~&_#N*GWMc>-P z4u!cquvy-}6CFyRv`lOgwu+71xXyQuZYK)%WxgJSUlRxBN>}Lmeuvi3a$Y1Lk-+g9e6HQ5bA@`esq|Eto zMkubx+_vKzUbXAY2l?5*beU~pTCuma_Vtv^vpja zwf%mJ)pD~AMO96@3cvZrL8yDV)d%y~=PfYxIfD`yCC?wH0AQtd5udm;pgAAfUz)zB zAZaW=0!{#4UKZP1hO|9uR#$~!vAi?(+&_7!bBQo{%)MLjg1fC^e+Ji-zLxzd&_jE^ z2lx4*54@hg9>C6}=e;dS1I_PZi%$o<3!FM=Rs<{5&gcqn4=dT`+I5*RI9FD0&ra7j zfnOXNh|2=HCyY+dU&hgou|u#4#TK!P!!`)?j=s~$@(2y|-0@|MTQAp=w);r*8H$Edp9|WS zboN7*he&CbtxmZZJDBns(glJeZ|AK)@V^vodRlhIGzB{72mbHNB&lQ)?fASzzw`qq zDjA9Rn~S=hEw8&-s0@fPE*D;hi5-H8XJ>jtPsu}mXoEnTuKgho7;SW4v!{=l0OSG6 z>VsIRb_Zid(zfM8;*ZzwupsH~26K%0J%fPiX^`wDuGKSq)15hW|mo z@IUa=FZ}-;Fx{khN#JhW-OPGk;}W}Ro+vG>V}~c7YY29>IhFYKZ3lNUM>L$JZr7P+bzq zwg*xX%#7iDz**`G%_+o=@{{@}3V)-1Im*9Le>Ud^fco>7+B4o~iXcsX3wa6oN&R~m zIlrhsJEQqG>c{T=jrt?akA6`vLciPoxxWL`4U?m*R z4l#do=e5@V!JRL{)T{YT8%WQ3gi>W;wv2$lVam5gE@eD@|!up+@m}GLz3?f)@zKQ z3~yIHvD8_#F1ASlcA9U!&|zDwJ7WB0$#0xL>W@+Z?!3P!YsN!$e@Uv4M1>Mzbn_eC z)oFfZ5Z%!)7(#WRq)SP-lRL~NwjLPh-CJH3DM??P~p-n7@0=8NmH1s##8P8GlR}>G zg!mN07xX<4L~1De$>d>9#AqEKQ?bK8-njr5-QfFMfBJ8uZan0nTX7)Hroil)+ozof zr~HW0iwQwBBUFxqqgouwP5;-q5d5vgydnvX|8Rl_3(elDB*UwH)Pe|QAN)iN%n zM^iJo6FAN?jX_k{+p)%V&1a$y`rp}lk4A-nDL8Ia_+O?ZC~MU$k)3DR+z(pL`;#o6 zlSY+hrizdDg@D)8AIFROlrGX#A;aksfxb8ZrMi4iM04j8YJpVI+$OJSYfI&L4t_MQ zwlQJ2&)C^)F7+f)CnQ_&=7R2(E-t@p5~ z$AG~!iNxVFicD4L(WNbHQ%_An0$bX-!*xN8;h}*l+NxhZwb))ox>@Ck;okDT>~H$`?R4FMs2m5)pe`BQ~-vLWokh^sb0_6H(UAVX@Fq& zAEyDmh?blh!oexp-#p+5RDBDTqCK64fD}|TQ0b_LriP3lbqL^ja|wY%^38%uTy_dh z!EYz_xo3U%joPy>@}@#{TFvu;n3uMd^IZCLF>vjwl;=w4($nbDGCNqK2|i7nsA!e@o7$xnJcNq+B0ae zb^lbVVZSu%*4EH|K`denZc@XfjrI7=TOWe=f=n+EMaM2Cy)j{jeI={QvO%z-KkmC{ z_w@(_11lTccrzQ0TnFbfDzNAj2vgfw-C48U^_Ln8llEP(r%g9UdeO@Xnt~~O4b6O~ z+(UXp&768G;SA`vdHIl&iW8gW)bX^9 z_SrnK&u%aH(8wVdm7&}DkngdS10!03+fS_5TAco2*fpp}-B_dS-ACznDvXQh^4{v$ zFv?M&XN(NTm>vMtyV?9{iCT7cV&SMfWl^)xctPVbP5n6UW^pBd!nWD@u|3tKzF(Tgx{LwNgnnO@;Y8DUw#2aQ;xh8p-b&$JvLA{2} zm@A|>4v=37mP3Fhmk8>XTI|DNob%@CkbiWa6SV;Gt^298{gYXQLGfv8>-q}5S=p?^ zV0YDUns*uw@!_AuZ`VJG-<|;R`|}EVe)Yv*0JaHeAMMPo#K!!PG!gPy43I9O*yD=N zoV&F15HwlUzAUVz1O3u6+x$chCCwRvrjK3AK#`9RkWzw>enZNYwivASPG4}R(CeJ0 zVsdp?u?s-@9$WQzjCWu;3cq=L?C<0o)4VizX>yM-e<_1%0mcq{r2Zj(cV|vqhkaKmuLpUj<}E2e)wwoxo;LgZ=>t#6{thX2pvykWWnfGh=HBb zzvOSikTiMF;5dZdAsiCOk$AAOZ$>A-@J(TS7!cn=;Im&{0tuZ~r5tnae?~E$&HK1o1D&M+R;KkV;V_d@Yg6L0oC zuKjTKh%`UOg+tSEuvN^J+q_s?{i#&vm$4eoNwqIz{WNAdH0MbfhQ@7Y7l_GHuG49| zmkWNnW$iXo+QeP-V&8=ioRp8iD8zIfm#bG2Ruy%TM48}rtUc;aT$@CENDlH8AA*Z2 zPi*ELRWCnNnD9JPPM7DsO4lSXrJ=s-PsYIG#vbl=j~mX!)r~-+&c4Xs&S9cSzvR?W z#3C{9HZgK(TcKH?qz8d5T}B0FFr`@wwSJu#cy9f4CrRoik1s$PGiwIi?uRV3m-{Rk ziq)oFj0;`5oYt*hJ)@E70%;U1y@BgwRt@nPWTO!6!fsQX8$TKJhyOi#SQLslL+d(| zFq2n~<~eHSISU>wsgXlll&~c1zg*0M*k04A(Kvhz=s#=QY5(4T&O=N#ZQq~qm@PtzlxhT31?o{DK|Iqz_QoSC{c1)pl0XTi0rOk=*?8TKEX%Ttzbocf^_lrF zH$Pxpq<_sO1-0fwUZ`VFgNutqx<#WYLSm`g;! zbz~nB6;f zMQ-R=St-BAZid9ND}4FcuM`7=xgR7VS(Y`mP>r%YraR_G_nB4oPu*vx%girq?}NgI z=s_pwUezjw4FP+7)YcM@{fkIaD%ONp5Io(FpUZMz}OjJ=R$92(;|*7Wxj6d z0AqJ;ODuk6W(GMR+e_pavY+K_IDF%;;jL`%AK|UWIZm? z!~1r;0eIg7(8IM+awrk9ktTXwfHR=CFDpCoOsZ#NK5NFT_aE88gHo9`vEx5pS2|F< zL~*k)!?;1$bzRU#x5`mxy_Lb|0=6J{3EMP zAphsAb~iTix2%@1qwrT&I~=wAZ?oF10qesQ7x^`h#>uJ);S52;7?I~G2_th&T>AGa zGSN)I16pRy)t{Yz3v0uCI~WmQhC@r@Pi{0-BSE;Rk(C=w5->vkv#i!O+tyFcl99a` zJvS!8JgF!O^1s);NBAiJ!uA$HD%MaYST{+Wx@3=`y%ui{v_C2mpVy&|G`bc@(N`CO z#^owj^PR1bW(Wm0sBEagHJ1`zcLS?ck*bUU9|Ywj>(`^ei?8eyAog-YzEmGD0oBlJ z)K0gKfWXIQ*EFDAReTNvYk!XPd(qd!Ah(*v8IBnVbz7Cce_pBR#J%Npve0*5ge7Cx zg>i}N9u|N%7VU4|^Q}1amLtdWj6esou3J1J@@zo@UJeP+d)YZ{o zvWR1g_b#M05)GQ6+NUpt6`B0-70tmi=oe;JX!OtUEp~FMXTGsli+Zf2G<@R{osf>3 zJC-K4zjmCQSUHarhF=+OPCNG;AFVn1G`^ri9Q$gUN9j-##?ks{P2{CLr=n%1-!$fXJdeH;cXDvAUyJ4qb>7=TADb8L{%P4Kv`V zZ1x0XUE{Dd?~A(}bNaAR3Gb%&WuTGc)C8T9&T3|F*BJNw8{vR?mpV?v24mw#?`qf1 z7F+K6=$_lofb6E{Wj$=RC_N6AwpF=LpCuj?g5_!DPg?+CGDHbKrD|8Aj^3HF{pyhcQ$u}cBo$bVWZ*mqSO(C?@cglkAqEN)62%TgiY0BF%7~I z?87!544=8|9Fk)Se+c+mC&gx=GwH;6jcgj6Ib+rI8K|^E z3$nX5yaS)iQuxX}Au<_th$(VS)@6$-xo9HZZo)hve=j+mNH$Z_ZeS$Z#?;Z=W(D{N zRea;@;NT58&&Q>kVDvE4d%F-9uPWtSQuK5meK1rF7f?;#7uJTB-!1gfU~}S~>muBy z)qQ+5^`zGpI+m-WO6vwWDUW7vCTKJ{AHrd(fo*ltL~4}HW}Kh?#;m7aeOnyzG~0`o z#~R_BJSQKu46Q*46K73(8L?322k|==ktFD`$wEs8bKu@?_Es`;AAYJAHjbXaqEUBU{p?rS0(GhTq!l`38@%*?25G^Qss;s{V(HeN&DrZG zE1hAC?p|K;cW5O(gJH>k!!aLQTF+R`f9un-e?!vSO};;TkZ!tfraFUlWlk#M>{672 zO!>iMywO1S%2XM|ZkG$M2XHe#bXpp8dM0YC@<;%VvAda6Z24Cy2-c0P&|<*C!NIb> z+*aPPEiIyW6nm@~y=q-KT3BGWH83r)&0}M_Z(_P~swTezukZc|z{ofc+C3sX(r=&H zY-s9M-X5PjdaRy53uOysKS$m_|0wQaxNgE&WWRmsZhxIfPiyCJyS=?cNsAy5y6fXJ zg93>e-wNa1Q50>*FOz1m`QqH-;h51@4cMq6VajT2KoQ7^aLqXED*;C(=bbCkB8%YC9UN&17k$C-XNzun@tjEzHP>@l#N!!=pm)e((PBu7N`tJ z+2mWq4oOFlioBtdcp#f%A<*Qm{;24Z!~d-4vPrz(kst4s{hMQ(cHR5bhE}X}>XcD- z-)x66U8}&KSyyk0BtN5c%krhA^qv5Dr2GZ>K+y)6@;@l)!r5BzFd#Z>S|l7HqX7xc zorHK1aeO=zY<%6@dRakz%D;Ljip)Y3Ijr+q<;5hqntaI@gj=ncf%l&^A6u_lFeyh! z(A4IE|8q+>=EOLH8s)=w=pULbLh(<{wu|OB%~rf;zBTFdxhVSSOx-C!v&~Y7H~d|* z^{#9@OiXiTI+j#24y5Z(YslIWB#~GCbTxjX3p>-GCppb$jxu6y0#BO32&7Qw1JAM_ zQ`s$J6z7w7zluW&$k`Hu{>a%tJgR@>Z2euo=WME%QEUYSmc)THIIR)_dX%4@o1+2y zRA;NRe4M6)dS@)7Z|4K~rGlfmkLwr)Np(skboU!G9N&H}QS;r;_d8D_kcrWxHBI>< z<3~^Xn8DIVn_j!RE?5KG`Z>G9D;7k=`N6ry5`P1?Zts*hOZy{SW*I$He z%fdz_C?B|&H9k+MuxVRD3$Yub2ZHP5zo`RM&&s0jb-HX)AjvyQt$~zQD=x@JJQ}s! z;UA(&!Uku?+&9J!73>vpLRSP4_Iv5?*MG0(%2H~^o1xS@w3MN}lW4lhbQyIM0qP$i zO&yghi&G@K3HkwN8zR5MnW)}~b&2$6EhgO*3$}*Fe?e#Wrpdq6a^K~a{jBAN7y)Xz z1F7bzNfp6jZyKRdy8lk4ed`QRX<=ukLNVh-kdK^c^^b-2t~_-&7hht)uHgm;$l23>!e#)Q5yPK2SFfvUhd<cQHwH2(Agnyf) z;wvQoSCdpH!M{&Z9Rkt)lTs^`_q$T-H_jwGEtxp%y72EI4dU#8omCzd?yn$iGL-Sp zkVfF~6Vk*KeuFgjREO>@t(Xb!1=uoff;{i8y)#zaEyInjA_c@!YXl?x6V2b}r|xQZ zo^ySx*B6#aa(!#u9BafgeCwSg1gQzUr`9PY2PI#iWCP7G|HbCiP8?#I3)-a3zNavB z>yD$5u?>1?&gWba{1S>N%i14s4U`KVA9C<%k;17joU(IH0;&97xecW?&Zm+3J8Q&%ljNV4?%M#800 z3*5-wd-Kvom<-@+@pacV#$SjhnjnWeve*$O zk;RAFvBC#=alQWE#BkNQ?IA9E;L{s`@SrHo5jN5rHm>RbRv3C-u9lPT&#N8PxD}* zt2nt!T8LgBhmmDYgYE~P<>dnStmY@5HUGwE;xfce*N#Aw06yynvCs=nzX|&^>c^4D z9$}bK*CRm&*q+inHOCo(Q9ivZy!N$ilOXjj>K4v?l*ZMJvK zpAAMhp@zeq1cF|>zpcxBb&SW;c)Ka@sB*hR{vNQoI!AJz)dkpC<(G}?_PI;dpue2- zb=ntm>En3D9Ov?pDwpM;lQM+06LUN5iv@Wnz9BwIw^hG??E?=Q1GYI2HI?OB&>D{4 z@mR&)3XvC3y)WV>|d%CHt@b+uxoIYlCrz$_8%!r8wyHjIg9blYuVNNKp`|Pd zqoPbc3q$$ARbbtxN216EEBP_Dtka_@yw%czOPA#)mW(GX=z#WnwB{A@T>^2wt_Ooe zJNhTr>34GO_u4H?q&~`0xy&cM(}Ud^2l>c<6xCbEk^yB}@E$-=}r4TL54coj=3>E|D5USEB)G(R}1`dJTtRr^^FMvwfv zdT>J5y(6c5$`16Dpr;%H@E`||brsXllpp*f?|j#m47ne#28UVEpuPqJw@!L>mH_K*kv*e zH=%~`6W%JKz0gO@Sf&{$d5>!MTiT$`hwf(cR%s5pL-q9G6}zIjN2@xonDZ=%geboh(&X2W3t_&XLZw^rWj_`j;S+!5UyI zZ08M5d~ux}q)zlwE7Z)LTBLzu4DOy-=0ClP5b~63x4eAXHCo z3z>p&OcWL1bW%>VpKl&0`{$M{TA_3(B^fOc*X*4A0X<-A`VG@2ApSSLuF_Q_gN)0? z*hKM5nZ5GMtDGLPr3H!V9t$umnm<2zV72Ox}zD%kfINTAv*Wb!H_{LXWQ z;K90WoR_i6veIi(9b(QwTPt{u3Sifkb4@ecn_9GJkwa$ zZb0;1tmumAGmTBHbZFDm-L~_XEHV1@0jj-$z zfU}y~YP{-l_MKY9A~6$<@sH~2_q%t$s;gvde@LtUL3Nd#KiK6TQ5$WS>z`5E<~IDI z-I@L>-&m@`+LFxPs4?HMX&Bgl_rRNQm9&mXUHvs|-SQ4V$ldJ$;c$1W>uC*GVHwcW ze=Dn&w5+de3UxnQw5-n=z9w5}`JeyESLJ&d`=_<5b>|;zSH|3s;CA~YdhWGttQ#i5 z!#almUDZou*g6g*g9f~+AV^0@_``U*u7Yn!ERMMXs?iG}cmiPUDrpx<4dQ%mciU&o zL!=ZxQBtL1Qb_Y_3%6B0g<-SgR+#pC07{d||3c|kr7G8%06&{oe0JR+iY#)N^1Zg; zO^4;RCUOm;d%IO%n6*uZeMRB&&?+r=EZ?w4Zb!w{Ct+cmbBf!p&|45vL0gBytmf+XwP)BxY{1xa5K7Vt+mG~^owkg<&3a2WUk#} zhXrjtinH;nY<7Ufya_m;Y5lI{!k1b_2(h>fUZG!W&p9w(Gk&f;zh$sP+ZyWO$0U|A z%P9z3FYYa26qtEqYYwb-mF#+f7b@M8!)LNw?1a!>v###c`XlXRvOACcvGzQG`7RXq z3!8>^T1mtHB{slU^}!1U_^O;aXeRzaOYR~4fVk7qIVdJ;f&6FO>3MEHE=-(CXRp*d ztObMp!UXPrH7M+!AN#keYNzwhs_F;+->a$$l5AkHASVRxk>lnHzxp;Id^Y`6Q{8Au zP0QjV$MqSrGM|zl@K#A#GOsU{mUwS!=d3ZdJOK4`>pA?y`?s;HO@b!C*wq5q2us*~ z$uq2jiQS$!+B;ai8ov5|%Q+mcbT&<;T`uxapq&H$V$7OY;kR~fGK&#o2BaJ*KJ|%h zN}X0pvGCu>%H5Ej5`|XBgCH`@%X5rMQ)va%@4DL($cS zk%Ik1fSMDd4HgHCY}N8;zsB9~daLJkk(gp`Q_*Q}pOBW3gphI*(w>!(MH1+%!j7g8}*nUHON(I{dbL2D}M#i{WuvvAUeO}2Sh{J|6d_m z$u~<5mlWdXoUL5jeY?%*z&|b z1GHDj?*J{k`mZ*f9qq%>QpoUutF@`iq59v%^v=^K3S8=!NoK;54ZQoD$|uaKIB04z z^gi~epf2bVj!vIW)~VPv*iC@Xv?N*5hOvj7tB$G|DG|*+8B?pc7{o7%n4;_wOMzu> zOJqn8-wQ2On(SJVEwj)1rr& z0K!v?lHPWawl&S5QN|ZAMH~cK9&KC4RQQWeR@(C9K?*DoH7H*ogCwMqs@1b&z-7wn zlixZG^NKK|r!9xdhzKtR2rYt$I41AvUGd^EW3F7}JZ-hp>>tib+t~0~2j=l_YZ)NR zbShsw9^IsUrsku8NmJjkfc%S{vc^WAd9@-e-kO--#iDeuX6yNZW%sC_omKh`etj_0c+yRD*L0L$G=@&aOILqiy$waP zY_u*O-%td|J_Q<4ggz+W$c(mJA_w>_dWO`sjR}v-isYt(Elj=z(KY(QKA-uBGtueh2d|Alkg%9SJeCvXt0( zx07NYtqYx^oe5Zc9(}D9uWdKVE)us}onsMjApLMcJ+(m23K|>rioR+%RZ&k819h&O z5_Yo^Qmb3_apKH|za}J?hGcd--hus&6|V`(bv;Ciy1hHKqphst#gtCpsf9OG)Rtvt zM~2L1Ks_%O`FoN73$9;Du!t6_paA8qADw@XqBf#0k#ten?GkHtT6V{TVVW4Z-_w@f z-R6hF)Jv>S403jFBTcxl`N#pGqS*nA(85wTSU zZX8%&HQwh9IYMG)4^Qd2KkXc|MR08}je1mV-{%KN?yCzBGU7@trHkJkg8Ma{a!6Lf zlAHo~-UcM0{u$+5czkJwwJUha39)0!O=)n~4>sIe%eG z=7ZB*%BO2-S0*z^ncJELT!A*D$(Zoxr0N}igfsI=HJ3hv=$+!;ry1?bdFFWWYfLPK z%bb*4srmBcLgb}Kv4nuO4sbvhGsXNAS*@OOe}?-R2x`ahs;PN_C!)zP;Pir?@^vnX z617AOb~TJk4Bx1M4xB3^^#U|6@Znz5CT-p~xM^@X#LDMW@4Fh4nddY`GYy6+6{bx6 z5{03|8L;>Rqk^}&T*(_+W${peo1I?`Pmkjldn;Sk?-v!lX5<_QEfyZCKIC(lOBSax zr>5FQ)h;D27@7_V$VPng#bY4Q7iz7QALC&67@<5`nNb@E28Ji#213+71P0uRjT-z$ z_~i{21_nk-cw396rIeUBLBR!vDp45Y$Tz=%Y628$DZlN(lAXAH^v^B;O6X&v05cSTMPJ_RECNb`-{2QUZAtz&dZ9myqP9;(8bf<^frJ3RJc++ zfl@0DSoG&z@!{7U89T?)Y)&K|z=l&v$FcCT`{MGmLyNU)Y|K9+!wJU6RbLjFjIQkG z3Hg}DHu@=+L>JE;hs+OJUm;mvL3Sp;(T9u|8?Yu#{ruq`Jwbf1G1XB**r$JSo#JL! z{OS@TcQ^HmS;i{D^bLa?ue=bNsKvCS14b1m;S;+bP1$=1x}M1qicB_NQX1P79Xp8d z4PuxT_*{a1R%p#g+n{paBMNWxPv%{|mWOYeHIoZ=S6MDUhWPlWh2Ls5M|I$v(=1GD z%}?;JYwdKgimYrygJM;qRwW~@&xV@I5HRZAlKL?oDvfCL=%f|cl^JiNl-lX57U^!+ z*~cyplQH?l22`DbsTl1X5-z}xyw7Cm+9EC-AYp3cpA4WXjdJlXi4v|9nN=f@e~yVC zZ0!*xtP;)L7tIaQU3gbLZh#48&^NSMeB+#|xLr^@H}$gDS)6+oS4$Or-MlH^8@s(a zNELRgib3AWanSn^d$fUdavfntWwCQrlYWSj9AwCeXd@O+cQ9-PJfz4gAMK(?hryl! z%;Xy^yBaD-Z;4rfHUy1wayfkZJYB_`07qigrlZ7B2?fEf7Sg3!7V|EgqnW!(m8p?i zTfx3Z z{V*um;y4Ic6SjcLHFAkl+?EjUk$m{6hF0A(Q8$B)sNIT2B$ZG$TwrVGGm`PW;(W6+ zPlh#kOp`WB==D*NNV*fDpoM5utU3!;jdjb{Ein?`zP1hANsW5NDlYOC?b2ew))RiH z>h?1WeZ`QOlL?cZjfpbk1r_djZsv6nw)ysRKI#{<(zo>OcGZ0{ein^c$NXkZl|!9; zaX#jK^0{6hoypq)1m3qIvmo21vnDb1{9`ec$9R>Q0vj5iMdH|h#402w|JU^sE`r9AYd)BWCc#?dVA-sxGuXlMEc$ZU8B9s9730k zk`A^)XG+zM{N5 zrL2z;!}NZ8znY@zDOZ}t5VfrG$##EMyv&v^T*<5HDD6`Rm2Qbir@2ue=~KrU(Dq!3 z-KQF$6}|X+KL>VK>KYIx$!scbE7b_+%&JnUVKev_e0*OxZRZHy2P`g^m-Iv!Zi7w3 zInbK@S{{yxI3;}H9uJbuMq?(S+J4c%HLhc{uHu7t)`&ReZ9T(ebc6{b2$tIP%UnL%%cEdrUPSggbvKWl(e1!*=z> zcR6R@S^eJfZt-hhi6<3bYMJm?JyMaSOqX`~xZG)Opli^lfT)m%fXeDe{H~6n= zm`N9-(!e!0bDn4=AOYVgJYtS)>m9fh=ijYHY=jJo=|8wSAsW=_s3=b9*vpL@RML%{ zR(hmsov@DFbL__3&JB+l2uCh5j!+oz6%I~QwX*QrSYd$!4vUfQ3XoRq@1E!BX(v6xl+>nl|AlSIkU_8tR)+2l5y_HzEDJx)Y zlc|s~E*%7B2`;Iy9GRF{MdTzWuwNVFPh&qEAnvPijOpuX46B&0X0rl+)vF(d-wVZh>z9 z2)OnWfoaGW$1u2Icc#cB8IqsyF$e-+{z*L6p(4G7#XA`UKs zB{Wx-YDg|hK6x0Cj<`EQV)D)m-R2(_OtJ2WW*^$PvyXX7f{R`d0d9|*VM%v4t{9LYG*r;QI*w1jfd!Uglaw*`d&05Y zPgpP}Fm1MXIhcl!fLH-HE}#@o8Klt3CL+lNg-VU9_FHGI`w&tb=nREt<@7m@S8SOJ z*FKl5Cii1n@VovTUd^O9a%k{)JPUN+x5}&jTc4Ba8(>i@5+!|{D%aF~==)I|{c_Z^ zlih18r+LYozR4=*Zn?>PKvPI=ioBdY)sxk&&#y8UjS{zXB0B^+n@JjH)rb_gVapT^ zJ&-io|FTItycG)yqpOXph{#G2ryCFmS&9%!6&IAwzFicSg@yih_0d&Kw2k6S0xcM< zq>GaF0G+bBhcsn`gHgnl`wN^GWNygC;Z9~wpnbabKwMPm&h*VW!l{oA?3b?*46QXf zC1t3%b6u#9<{vDn;RxHv(rG1Xtoy&SCpUEKq_P1Ei>ZG0B-2rROwLW1j@@Wc5hvDm z=DkfJv8IDNpbe{vUFWJfv4CnHFff2EEN5iEf$4DOnOl>7RJ4O#rupccjrvKCakVh_ zk(ZSnxifix{X#08eE*T%c#K@M82!9A3S#s@Z<}G3Sajy8jZ=Bjb&c!-=}|`=$<;3+ zJX#5UJVE~hl4TV>?ST$IBSEnE9ydO0;?CYs&5QhF3Fc)wo-KM5DMAG|FbkCwfp`~l zCaPD7P_*r#2}cr|pB=%e(cD7B08@Olx8FM4`DcZ}E;(&QsA#E`g=+!_W;wY0wxj zN53T(o*R8a_wwKIy8SqVX%kqS7qRRRUi_jE-XmXD6)!nwW#`DfKZV|M4+3WF zH6HDBS<6u??V{l$y`Qp(O!E^CzaujNMf1Z~xvBQNPhSjFxw6N+>Uj5NbH|$ygQ)zf z{A1uGPhfO+CB6?kW0&188g;+mgdG=FaV`I9CpN_~R*_=oceFV%X%5kFrW6lD9{ z|MOLqzTRs## z(J{iua9v<*5~Xw@)Oz4$pIb$!DVA;0Z9`@A4Xw-jaZ;Z(aK(E0pw%9sLh{>^?hN|Y zYfxoDJ5Uz3s*7$%LH>7mMR|yPXsqWc@HU8`Kb|BXjl5Ie$W@4iqf1~-3((_2vE*dm zT16Rh1HWgtG{+pvuZzZ+cHH97@XkVg&niX5@fL?nC0~~s*KoJiNnve9ud%(H&OP0p z61I>knY`n(_N5I>&K0{W-g&IcztmLfS51IrLfv-kh(45)0M2*;^aO zv=M_5!{mLaV0Yye`*L`eu+sFsW+2Cz8S3hO8S=@E6pre`;6{2zvfWHiOdGY?+53(d zqj@x@0yOox4goG9?zVCgjP^^4+bOX}k#2;BE>J-_mkbv+`<` zziDfm)A8H<{bdF8lzgZfOO=ty5YBOfA@j)i?|2qg*)~VsB%4sf>4=r@QY}})hqbb& zb_BF(6h%qrE*lrIIV`E=x-LpUwh4r)b|@zggz_YAm2je4!tDcUAEXGcK9v|r)`oYH zuChwmNXDJBym}WV^MM#t^AM4j6Zd}>a|rEv3G(a~tII{E@`3OB%8s#om-$$Wc%jEE zszvJ_?fB^m9$dsxNhq-8SroZy@@`r(ms%fy5FO&R+)NF)`7=XPvTN%jQA<&XsE4lY?U%jn=RGne}@fy6`LsmB)z&Tn5oZ1%LOI7(5lZy2Y(&rf|} zz;NUXKdL^-f84uIi>^d?DY?daiSt4cDQVM=eek!n)20)0)^=XS7Nt(~Zz4ywy0s40$@etZbrMzXCIN zQatR0czziFp{VwxCVv6+90|7Hrd7+9y?4|TQCPcYakreA;o3Phtin7k`VjwOe+-wx zEXI+4qbW@zy6c8oQ87Ki{>kR`x@9$8a+R0+bkwSj+%3B8!Wk0I@20)N!6PrS{dIC5 z5y*dx?Ks#H8G4W4v<48!K0Rt;m32!B?JitHpr=K<+DhE*rQ~Ge`=y6(-PdUxzsTNw zy^qfb0N?*V?447PC{4Gf+jjSE+qQPwz1y~J+qP}nwr$(Cjoq03{`pVLIfL7YxtOcU zjEah?C}ghZt(EUO$?XZU>F+OifETQJU6Bhhr1K{85U6|BJumMn;d4FvQivaLz&g=C zby89Vtl!ESnuLIM;51#`4grKiLiG~~I?9`lS8nBhLALIvP!*%-9;K#U3sPXc{^hocUs2|19Jolcto00B{Ko1xKwz@J$J!Abiol&6A?CL`6-c7{0KgVZH6LtGPZvr zFdizRDQV=MF3O5hy3#VcC_avU&U?>>KBhL?z0_J5-+Zb0JrA)ROh^2W;7cd;O#gq)y6G40HzMC#RYEU!+UW_wHAu?$zyF0Bv z8TKxZ*zK)H)RQ&Qvfpp)Bq!T%SC8L+JQlc|__moQ@)nGLYKC7u7!-VwJU<$(&0)Z} zDn}fpR+3P!PY&B@B8=2E%83c?39+XM^B>=S#TH;l@4oK09WQ!b)}dW)RcvUrM5xg^iwzav~Ep0N%0R=gJnIl zV1}JR@rY}x+f3HJGfi6Zs>OKyonFU#vO`o?!ZGMFi1^NAI-eSHX=fOVpL}xzscZ!1 z6|t8(a_LnX-8FP^YU|V=JU^TO;gIc9w+jCpBRa5h?A{Y(W^)8+!gJzsJD_vvKMH%h2JoiX=M5ry_UceSy+#_ zOqhcXO8rE;#tX#Yy2rX^J)qo25ckU+i^q1JeEB|5gE@4=A*q3xU{>gEfTy>^dJnCI z$MtEuk%c?AQ4&J`kKP;kDG1)NiHVX|`*BD9ITbzPg+&Yh(~*eRmHarR^JSRFrkTjl z`xXt0=JMZZfE&)KmO38S_Bb`-ds=Qo-jKW=PnnQtybIK%q^Bn_Y=bJx#>$($a2b%4 z)eL&}XUExWI8-b(UZHJMG8u>}y!vhF`(w-JIvWNbOKs*wHkY3i+KyC9`~?Y!KCAKG8wPLUW^R ztlNU>F_Fbm?Fp0PkXKgN6imHiRz=W4?1}?7g>=?W1nD@U{^a5E!Mx^G^%=BFG!odGJR63Zgmpq))$-v zsh&26Gw5I;b!b(DhDrPcFbHD0Z}Rkxe#74T+Q0owP*Gr!KI^zKG7r60Wr%gOeorA4 z{2+E$@0XE~Is-c|p9FG;aldIfiJwnba6fthWD&hRZ9cMGlcBeX*m(W1{XNLGl(1mZExr$&hD1wsyM-LmSqbIb_l z#5|de@n=ZOIWM&v#Kh-@u*+W6Y)v7AS7l>`yfA8DPdtre2~nwbR{VZF1%Ue_ zvmB@NLPyn>z!esYl!w|ROf%y|V-Jm9+HzT=0$CggZCt>s?n@(e6UQtw$6j~cb zev_u>WO9V!msZ%GK1G9>w9+J;T+oIH?I`b$*FC**27Pc;!_DWVtIt5Og}WfMALCN0 zsQF~fHlc#3%n%PZhTv2?u>KX>MYLjagd2&1URmRa1Z?2&YpDq8zHnL~oB5mCO9K~0 zz-)WK{o$3+1zaKvp4Tn8dWF1&5~a$|rYx(T2KwjI`laft4wXOEI(K5w_||$dyoDVxL$U~PpM6xTy2Kp{6h=9OWF(Q&m>V@=FTqiuhAqLC%7blC8cte_8RduQ)%xDrdP- zCTFE&#iEC1?JUgL9V(&o^+1<6c-d0;htX`eFOX8NegsMDAn-eFeOTD=JK z7kc~FmpyVV!HQU9s)`lqKv|wnjWhKev91_%Sy8aMu^3anfy}5}&w*FX%QG)-X@uA8 zz42WV_$f^}rL3~CeNvz2vi9qoT12_ z=UO;}oUazZ8dLQ}TMA}3cv9#zIYU*eE&w&F_s)!v>R^X69or3m%k2k|9af#eI!Kls!Qp&{PPZ-UP%z=~A( zw-xUBP-N<$i-7{X#EM5RK}taY<3j^R?df5O$kK^;9nTu;bS4}(xFt2q;0@-&6YK<-&2pMN4N+SE3 z8SQg2X~68bOBEd2#YdP&+73Y^z>B#3P^!e@k>P+mjkJy++y78Za7Iw-f8BptA?Sg7 zlK}6Vh2Cs0IQo^LUUu8YE**a+R`H9>uoA*gM3A@BqJ6LMs1eSGor{CVea*}XE~Z_S zt|O|!P?BRIr1;ce9d%pGq+3Yi8ATslnm`DVuO_WHvAa*215CLG}rdExCIXQVsO-N)`9;obmaIOVu=x*Je-1|6cMcd}2Qzwnf`*dK--^3H2& ziy8`38Yr5UuSxYV$y9KVTYx98Rmf~bTCwq4RxYr=ShZXq<=|2@LX$O^$gO!Tdp>4+ z@O`(NW=^_vChY9+T+auG57$_*X^ZY`lnA1N2q=Qsv@g;Y4?a!TMkP)Z^kMeT=?C`7 z=0Gc(;=Gx(I|#_p`F^@_~}^IJCf1v*W+{CS&l?H`A^ zWh=SS7HH|j`!|@TQle=o0^1nkkj4m2E$alOM7*O9~W2}YUYo9(S zN*9RbR@b+>oReQRZ7V2>AA}K?A{D_Xa@!mi_2!`c!>V2xg-XT7NUu(vFciguzXpY| zRvW}>skc6e$wt1Rb`bopfv2eI(I8jG%qIu44&3giY|0B!qmkp;RQSo_Y6x0CJQWbk ziI-RxX1z~xK4QHeyA{54U0lI@Id0EK@Aql-sXJxX-3r(I%J8Owd&x2Qi_OMK z1!H9^Rr_5y_zPBD7QH^XkwXY)SBdplbzeIDWg}!jEV)y%2%Tcq_#hFXf8$98;9 z%PfAnG+}1fY(h(sjr@g{d6&f1 z+8SI|mfF91@R-n3^4!!~r!E@c9xSvG3kdK$3Efw9L>AA5(KuB#Wlt7QqT{h zqwneJItz_qEK#z}OjFGJJY>tsA`?@UZi5H(F~0x0rC-I%JBpTuQl8GMgC>8$aN+Ia z503$sw-#gL8n=s=-}N50OFWik1y(jO#VrS9``>fcnH(2pX0PgMxlxt3buVeRaG^I0 z^e&>*E%jnF#iN{`Mu*%Bl$q;CXk^Y?hlI?V%g<@b%cbr_ywD^~#CQn=Ioo;^%3l$P zJQdJhplIyne&OnIE8$%}t-^DL;Jx>!X4gzz$#H?#N>{|(KB#>wdH55xX4IdEU8Xnf zihxddR1>Z_Ea8r>0;k2hbD;_cyrkJ=zCgO%EwDDd zu0n0znDA(JMTP6<1^VOQ78UDc(sW&^Ph>&VIKV2f(E_Bl4yj;9uKTGbg&}@1`+hn_ zz=#D_HNN~_uf7mgV$GqarG8b`epYh+oV$vPQn8NJA=d&v6fW}9P6;?l#To5C@-lJ+cuBbaQ)bi!M1b z8glCmf&D$642Fbla%9K67PBnxf9as{l^G9jy*HrVqxm*nVuz5lzGqwrM1ov=*_P(! z9p84)?u|Y}=q?$kk4@a)r)bQV$I`YcYp%v9bc1v_G)i<65jvV78>IwbnAw|QrgBFd zc|1G#qRA1a4{L5Z#T2UHAv^)wh)h%TgRJiSmia+EC#E?eds@F9nxMBworwSP#0$IB>fm}f>9n(v=Y zp_@H1L?3U-Kh&g)M{#t3f6F>XC6KWB=)kl;Sc*vDnd2G<_Ne`GB$uFOXH_Cg`oTA` zg7p}qMuh~uU0dK;_@kFe6hNG<92--6{1bSnc|A!o;d!v#=;#|r^(kfDVWr5cb$l*# z;>fP%KJg||duFR#kE8eQ=z#@5I)frzq+{BWli<&4P`rm-n7&=Ag+&AL`#aE$Ca^!} zfAS;{_U*(-$O%{Z67;ZU52bSb{Vi#da zy%4jtxFP;}{NDPl16h#q9!=#a29D?Bz<^u(JNDM(8oCjygs4w3mLAC?KyC1h(}N<7 zh!&9|{WKgInF!I<_mB8vo}sI7Ip!_}+^NE7dLPWftHTS@Wi)WiEuEvNHK2U`$i69f z^iW@qR>MHK8;Tg;XQ07K8WN*y^K6%f3v274kmixx(aG!r?2dRo{v_d6UR~N8JSHfl z`UV5df<}FVC4AkX*+=_nDPeEF{by4jDXPmRSVpZeLx&lvL4ee%F7k44=`74g@5IHW z0s9}VwQa;i8ArCH^Q=gY;!UU_*}K=exzMOTa;9}|?epRn9a0v&GsyfHiD@|$iYBpr zL<;U6cIAJt@CjXmH8rqB&Rc>3Rdly??-3-w02cPg^C=hLSTquY5~uCTmfT)sABO4$ zNzK9Ky*r-;p*3BquZzQ)2{+W5tzJ>Fx`kItc`(*)X;?ia)(6$$s5aCl_Wm_Z<@g`f z^68vmc+hHxlO>gzrcIREUSAEJx1h~Tq@c2?Sc_SPrL#65YBuBc32#+RHf@X8Qz)wo zy5_C+{-K2uR7Q<0)E#e^^hIhaD`yo5)2&~zoOe$xYd<>IBiKTuRdpT85&B)ZV zJzmNWl3~o!kwXHUl{M=c)uJaqMv5(p9$L6X-wFfy$He^d(YZtoy@MNTczQio6$`~8 zK;KHX5_TN9mS3%aBn%eE#EOem_dri@q^k6U)iIOhvM%qy@|4{IG^x2xS@v8+qro4E z$z{zlX%sA`q36?ec8H37TNKfa+{`U>sYx(R5UcX}o`^L7ll zRUr9_|iSxIQz4+I(4GDB@19Ib*XD{oHXEpR2v>u1cUge!zP=)gS z#GArQ>F0FKY6%&W(orvO3N1J#AM`N6+or?PobP%a3!k%Of9n!8y3LSj-FOqw2wNn_ zf^E0uyG&t8so}2*%B!0GswQoPaCd6F-&%8Y+;KlaZmkTjRTV7z1_WzKjZb867$OTj zWy*_`e9r^o>vOvs$V>5%d*kWs72l;VSmBkm{R`jNyAGyAtMh7Kt6lE|^`^W@ zx#hcKyQ+yZqh5VAjIB>U;=Q+KG;1;Va(S-J?Za&(IUCa%BM4}3%A<2I3~A;lnMvR; z;RYa?hF?dP^h~$Qz}bgP>BcoK)TCCUIXc7scq2)0QA9@Yw*VRig4 z;B(Pme@OIz0Mb@I`1I2?4>IXl zOAY|6Ok}9r+y$P~ZdY1Kt9iecTTJs32d0`+e#v%v!ouGjW=LjHl_Al*W?pvQ-(K21 zRE@viPk6sha=u@695<|;qtiua1H2BYU75VJ7N9SBE|9K$Ljuq)(C&XZ{3Qr`l-8Im z4zE>abeMVm(*5R6^I2OohZA5M7Q4uNlLKap8Bja)_p>~mCT)y#c;ANcyhvbH_1BHx zknbwkvc~Ii^*h~3xwPr<82l>!mOVKYJ~3+X5IQC|$8+YO)A<1GS{($K+(n4sdqaxh z#y;DKGak?za+vov^l>@d;qKw>xe!cs6~tukL-E^Bd(0A0cZjzJKsu0m3SS7E6(fN5RKis0>(ZpCHcZFP#33SrZj> z={4y%Lg=Q{qucpkdu#9`J9+%$x_7&7q|q{C>8EZ-KU zs&Of5q4BNui&wk3jvt91M3<_G0Q@McHNfD6>E)5KRy9Aj)MWI~Bppt- zOgaE+R4m{2&ICq_o5z~Z7`%Ffa2wM{N;pL&BM5yOU}Y6dU-vTEV2$B-Kr$D-$0sDt z>(#b9Pr9@cJxBT3cQBCx6{RO+va~Q5nT=uJYOniIWgA;KK$x;?h>>w4J2@s~cY&$X zFaMKtT+?z`zUrnpCSVol&|eZARG3`D=$@IJ$ZJuQnujzSONo4qi4B`S>POXazwVY5SIC-E-+wLIDG}2pVMS;^A{3YK zZHlgvH)7IgI}sgt%(+XkM#Xx|Zj(V3kvir{L+B>Z7ps6SxoN9H+ss*1t?Dl=o7sHc z4&U`$H1l!_rIL`p(MBreR<1Hfu)x}`>9lWjoIcgx?jRV{y67F6$&!g8_ zxh$*l+$5_CsUVgoN#dRQDelp>gIB*~Q#nQx4WMe7W1F}?5 z&DKsj{74}4(UiK4+PvjmLu_GY=0v?>iF4I&D{?$0x`Tv0*iXQ(t(zH|NMMjIDGh%6 zQ;k6zw~x1ZGvW3);_qZsj?d{g7c>~cZqO$SkkN(bC0`*9_7g*ieBCHa?7rmA`{uOX zr@hlt7^75kVG#gykqF-ut5udWZfD^FU;>f(OIU$}v2UU_24Fi02d3QvPTnX)>>Bg; z*?CEfm$CH%`$3PSzv}BN@9ibX4L5}2a2TJQxjfk^`%4{_D#XuhkZBh#OiE~+42yla ze1+Y}UPeEmHxE4^+l?sePwd2!vyW}5Z47exSgOIX$_k9GmT%9}!4O+YrvY%MZEx$A z#y}7KZcorrPXM447G&Re-Y5uW{ilAha%wg16-R_+qAH%-SD?P;~P8p%SFjaBp1veQSk$ri@Ajk zVH|>2*cCH~cF#BuLV=nU%wjDwYDMM!@?K>4F#yMnoI5%~$yj&Vvj#QlyFXau$NAnc zeG-}yylfIC@n{z+cu;Ya!Msu$rk-g|Z^{Lw$ew6cdmj+daZ^b93aTg=zsSA=J64pI z8PcS$z9Z3O4ZG0jWX?WF%r(NBQ9qA>on`r6WNqxkHK<^25mb0Kp!7VFPihIakERsK z0hp<67A2D+igGXcLXxkF9_Ip^X@VQ@jLh2C6y3e=R+izooP$V-Qs_@kTbg^6))e6b zHM~M5s8{%|vr_dcVUlg*KB;tF4HFE(lT!4^c&(gT7D4LTv3yXgtO3e4)qFX~FDO`k zwO$h_M%;)$C6=>GSbkoo3kqY7pxKf{V!TCVtmtkRPnPEk4ofcz|m>nW<-QfC-c2{Q^4aB9a3&26|O?9d~ zL^yzed9pIb?@efxz+lFTNoCwzyiC1`nbwdW1o+x!%}q_Y5rw{mEh$03g-J{^p6#!3`ekWCreFoC|Z}NNeXm~kRwlf;CEJN3YG4O{*_q-{uJ$e z;bkW>@(48Ce55Tb0g)GjsE0cRY-p+?ZPiJPfEYV>DtlP!3U`;;<{T*wk#C5po{@m~y#VT}m*02H@R%A`U@LHlsAdeOQ z8wRBkeAw)|kqIWwcdpY_je;}{#FGIvl1^VBWz(6_r>nfZDVpdOP+P)dyq&%7HFMTf9^iP^V{=284hT=Q>Ls8wOI+CI)*QH_ zldUt86oP#kB7yaEd6NufJB={ib$uze3%r!LDRpj($4@3)*xBrW;=mhYRO$`i6WeP_ zwK3{BhedS_dNtyYj!X0HwvLE92qdsB1_QZqW)l~p8hBz|lg*V~F3wYO)N-p~f{ntD zFS~1NxfGHT0K1iWUs*kBkKLY7%N@w8#VvB(-XGi}lv$6H8kHDa?v)Cjy(r@xE-F9R zOZ>m6v-fptQMI#qJOn2_?Mf6!sX1FNI~@mT>mL#eX?SaN-b`QH@JH$ulPvU3F6T1P zrk1qick4Sh@9*bfJ4Pokgf*14d+r(P@1f~#_wUqIe|tP0tF^WN+=1kzpItx8OVoZB zm`;pesPLdFPd_29WDNkWH2VSjjeb=B{TDLN5V>|)<&aVB-3Nw=*KC1Q_{gR>Y$m=< z>|VL+t^~}(a<<@dg&XPWM3ocFsM0(V*Hp%EnxLw@Z(O}6D$%s?;J`9I?G2-m?{#Hp z484Lbr9Y{UQCaJ=TT zUDwolnpE8CmWKt00e4(5j0t%aL2Zv7oFA}u_IT;RmO1?$*nV}LSL+^D?RG$%mL2<) zK&LZBkJ*GtZkLZJ?QN;KgU~I2DZ2Vy=hqWA0v;XXPoJqj-rHaV|1_Xye-ex5_RjJe zE4BFGg#y?RI;Nlx5zb|rZ*r5x&fh>`779*=vddrMHS2Y!sVi6rY_rEQ3$`^$<&Ka* z8wt@jZJln-PB77ZAfv96x#N?wasy=*{q+{}{q{qYXj{!0Sp~<4kGgojp|>S3@LoYQ4uYm>E0|>!8qSI`hDEFx3{d z4SoNjtpSqefJ!o1=8G_rbXQGAt?(M>%K7in9HM{E2%XMs&lPP4DKE#?z_i5TZ}&O3 zwJY4Xvf%ZQtLuqrJXsH9VETx$N_^SwK?8Wvcjv-2Th%-4^)%M;uj|pC1s}K1yN~l7 z-Y$MisGNR0ka^5K7)c~990QZsX>ZE7tRx=Z{6Ih2I|R|x%b=g(grEa573qNGKUi_n zl!wHlAh0$k8EeF!jSHivFuOoN_Rew#hK?+AOc}M{cuo>071POaab3+VEWl{QX>tfdU;Is-UjxYbBY87Yl|Gm zO#)m5K{oubrbyY`X7fBF@71Rsr%ozsEsX#Mx7%~CV*iRo1V$fcX^!?h*KgP9^b5%V zBV%t02UdhfQrp(E9+t3CmYXT=r5^r~tcXTS68Gl{BkW+LkwigLIa-w8n4w78lMjZY zm^UG)9(|URfE1e$D{g!uH6Yu_B3S#5`4(3dawQYWNEnAb?Q6puZh)ZLuO&B^?1fG% zFrbqoR9;F8RFjNR5}{ea^y7p`bw2hQWh|Lei~kGLR=f>xNzIc}+KMV3*;f+wP+H9l z!V>YQj;m3&DO73JsO5*z07O(Lk4h>M5Mn_TS1ih5f4JT`D>=E?-(OPk{43KsVm88w z^wHNubiM(`3!3N_9;ZG|uG(ju1DU=Ak$x#RDTy?9ny^FsLyeXN-sIvyakH|QOHu-6 zaJ(jqON}^cnFi%QP!D8GhWV{sNhuhAnNioN2(WZ1#3JgxECNuKclYoon_gRg1c#F? z`-bE}C#x63sG!nDm)TwE7cut##CdAA|C#fu8vhgL4KM<$NK94@IIC<-l`0I5v@ykP zmG%p7*O8k?_0pcy?l|AOBmN&SPxlm6uJ_(utC}9jikcWlre?D53G=UOV#B;Z86>;e zFj*CGWd$q1ZyE4FaQw&d3^=2#veYPGOGU}0RlSPBURu@PtMInjzg)JSO+p|VKuC6i>Yx&TWf<2L1JeGzb@o8(+O}(- zV(-cFw@8o6@pGTMqn0~li)I$F)WCfL-S*Zt&I9kTWZzv+d^!g=W#=_AL8@D$k@Pt6{^kR3`Xvo6t24lg{p2K%%RTjkQ}4W&5)QhNVt3g z2meT0j8>n(DH8l%qyjY~B141au5OF%a$Y4g(6iP(q@S;Pg{ z9)GhKt`u8|GU~R$vwY$MbCI{pJlxaFhx;n8v*n1o0;ojSY$~5D73-;-0XDZwjLKzm zUZcamTJNHPH+!d@RF_XfEb2zahx_=496y5!VCg%1tu(quH;y^H5) zZI7mU*Al@Ojo8(V!%U{#Eal(ntj>mhb*4!sxbYw1C#Ct-V{7)srb7J|iCPNdcP8bi ze2dOkv<6w1;KKKh&KRxG%3DMzRJ2Y3z8?)D-J@1@{t+q!)SYo@R8j+5PRWQ+G5r+` zXlxR*Jfl_EF{QL*LAXQzxjMxygiU`+1~&QxXsN!j2mI3A|0l?9_x}pnaRvN;vimP& z$F=^S$S%y4q00GxCA)CWAF`7hLMJO4qJ@^h`-kj~3x3Ehv;H5lYy3Ca4HHTnhMUI! zLv|B2v_-af%+vUOO&mR(Wre&=YdgQVYZAt_(yX-PTseX+B^VNj5CVAjY6{Dk;K3e? z8o}a#mq0|Jk3lw#;>zO||MQDkKr(?3R~%pRmN@d1Q%vK2hbH1*lefgYqXGK6kkT zP_qh5x>n9YHf^nDUC7_&F6y}G>KwFK4~|9{c#hE-S%Pm>5?hpfdC()-$rA|PL+qdD z%i;S#1dWBzR9XfT8NT{V?cjc*@xQ7X&u2O79p}q98$%A5ry9D=C>|Vh{LpgZs^o_X z7m7wG!So0$B5C*=v9dHIUBsP>X6u$}%-?5R^12`2ktP-7o@OD|p6L$v zs^XlX6x62Nv)ePoK@fz#-=ry~#9lppC$eT763?*tc0oAZCpfYFS3MEUPRP--advE! zNcOGT-E{kFMbOn{^c|wAEA$$lqW5k1T0Grd(~ZJa zdDQM%mNcbNuXpE82z~L(-VT?qxP6kNIFTN;!rx}ed~Ag1z=5i4=#3bPD;?rufy#nYM9Hq40TLO4x*)1CH6!-+-Qej59v`VtR41l`@}4etEe?SRlWhA^r;?cjnVTUjb@n3R53uJ>!Iy6<(9 zZ&9^C{#Xv2Q>K@X7)XP4Z4OAq1Ri40X}>YY_*1Qzm` z9EXhSMf`m;KyH7`w%2lw5$Efuy#%x_v;>zCT>O_u&yL`xXr`!eYHvWr{KJs5Et8_$#a?T<;!^3 zaSOWa;5zUCC;xh)0p7Z?`;l*d-tSK`%D^I$j}xDVr#B3zGhKdzY-rLG5``4x$C2;- z$L7;(Hq9S(6OVIn5|?W#>Q`Da7g|6uhoHmR!m8Dqm({P32EHB>lf=%&>MlFysx2^h z5b)x4jop>^3}&orkzu^1KmMKe!Wnj-$2koq0c_vyx1P>eFx%#|^{iMs)%6%%8yZT> zT77&x4h{joQXr7ZSv>a~@am%d8D_S=PJ3g^WQ?&xs=+xR&O_2Pw7QbFkQ3s|YVeKk zoE2~NjC+#B?~QC)D2@n|qG_5&rIaOT+A`}l7Vj@Qbarw1OSnh(} z_DQhd+`q3A*LCjCDdNU zq50WtXA((RNKlK4=)6(3<;=5*D$qi=n9i%(0p6kJ9-mPprNLvluG(h}*1+n_M9x~D z!EeYGAWzhRq1aek3~pbLl!mJ+Ajej(3_hU{-o)eT8D1of1>q}Pz~S$qV>g^yq4KVG zax3_)MW01NjkodUgoOGvr9JE@Q zBF!PItn-BOq;z>eS0#*yegw1>WqzudPE8T7k5SU&&lm9$(yDBvUbRxA(xVLRuhe$e z93y-*O!jSk6RH|Q5>5Q~S+_!sikS#6lWB45>)CQ?bRqN7!HJ5<>Teoe8xTv9R+Vw( z;%K=nO_?f5dHt3?i8+pXo%!NOl?b=-4pX%v?2l^^oTq28W*Bb`e^`3|YWecxwt-v~ z(~(v~`CL?~2=t{DuasQ9j8oxR%W8DD;%-izk}PFUsgi897{6IMYyC&Fr9SmrJGG5t z!`gYn;0=u*{{r(&6jNT{k$bZ_hZl53F%@&YdAmOHPoufPy#3txaKo6|yQRm0QhL*7 zOK%e(KUktIDUvW6XH_->i4>DHVaI91X8zRtB?bi+USQ3@+{S+egSuUNXExt;PJSla zeAKl084Z|l=KG#r3d-ZWA&NqZ(!DQF^>Y~N2}_ap z!?fJGx$zHO$QFyf$0fexYq4g-=hx3#k_zOdpU^d37RYcMf!7fXg|O08Jr$V?vf%fH zc>f@wd*q%JeW2r54o1vC8gH%*G_Vg`J8HVlo^|BWV?Y~+@#UsIdI%&Jx7Qp!OoEw^ z_LfkfZ`_Sg0keAA#UOrW9EPxWZ^K!K{nm??(5g^*vfrF%av<4E&I5xHd0Tj>x6Rfn z=>d6XM1|-}cr)Ti3tDb{;2mkI)K8J%eJPY6IZBN}m3+-T*ayCxTLUmdu?BuU_kz&% z@<`SSMt#Ey1q^N#-bTCRLXiAYSS%CpotSvuB`B6IucToTX=6EG9$*D^J}}9LaWeO? zx+{r5X;o1!2QBQ8fixYGKfFl++0G?YceT!JkiYD}3j3+HvnlxZXC0T9)eV4^Y5)YQ9Rv zcyY~k%H3GcDAq>jRtz50d-&OGgE zV&je&#!I4L7y|`)vMbV+0eD{+ANdk;s^23}K(e7H=VdGE`&!-|MoZv| z;rl@^2>@6OZLJbXVtDsDip{JPIX*z=SSJ;!tqB;Jb;L;I9WS-o6LtI7FLs)i# z#)Wtu-fY=&d?TMXcZB#4l2Kxfh%s^#_>-c&rT;{+EV4irmiGn+@4?hSg?53TcvuK& zEKt~ZpnB{>it^(^!i)b-zKX}M43kU;iyFgX}T2{)|HDaFQBG0AcMu-pJl@v@bHK~wTu4mW? zZuH~TpN75K{ojpDR*9cmaXuyA_wNU9OFcgB0jn?^LA(&e8jK8Si=I#=1!so^^A~CF z4@BZPKiZ3((4f0yGTM6j7G$K~)C+ssUv^xBOy*KV`ZaxI)LHw3);JrI(O(9#QtI37 z-wKRlYTih3V-O3NKbkp=**}{39jxr-k7f?B{@*q8x4)5>z3IqwrrrcI=zM5>iXs0S z(LC+Hi00Y~NbE)*$=nh(A$f_pdr0owFg}zd8F*MvrIPJzQPtTLoV((xH%H;XY>#qZ z54*aUZpdWm&;l;q)kRl>M^P|2XfU@ejs;Ys)NkeA`ETWG{DFSM{vbr<&e@-~A2^tW zFsSg^CIVB6x$*gMWFeBv{jus=;kjk(m_hWxmkq43f+>>WzyHn$N!?K_$Q?SA`4x8` z?Ax6ttbDGXF8pPzv{aEQ+Wtwf68a4*YbcllZR8dqoFll@0-7U4aACMZ_^q_6l;xfv zx0jX;?RAh4xY#0caEub&gOg($(V~4naalYUpYyOb;1c>Lqf!}3564co7z-UDRRdg5 z(r`pM0&d(Tr0b>~?XX8PUJ85+TFi`<^^gr2M8B@_t%`4tMHE&S;@~-56IJvIXEhxW zaTOXtkq(=6I07PIoyxSrn(yscq+v`dQ^u`Cvm&kgE%O&@EsXD~1{#X6J+E2Z>|AHU zQ|hYrvhcG+>Qx!?WSA6Vi;nXA%_ zUu}AnIK{x}+DXi7l$zkWTSzI5IO4vuidJv=mgRtJ=dhV({!BC^9rC4HNgK;f`}>Zs z1d^S3C-XCyXkm)w%z#hS7|4`Th+V)z)e$9P)u78u8If6*e!+$kJYQ6M$a`Ar2|iyt z-ywze!0xu!A$QdMHr8Tn-mt)QcrL_r;1vUGONYb-Wtq@??^nf- zNcFAisQfS-Y`}p3QQ`Ui8+Y#%WLXz)`KFzfwzJZ% z>3h0w-;TI1{m?IauULCOtcMw~<`{GQ#=l@mgb?)ez;GJ~X#KAZzn#1L=CsfW^b;1r zqh>M?H^zD$;D^>dmEcw{#JiyBA?fIYthyICr8FPTCa7MU#`cs$i94Gn zUeT@z=%K!b0ltb4EHXX-Y6L8w_NI7hgDcR3h{;a3lqj2=aw0)!1B{xsIlyULran}& zk`2Hj99s)?URCn4{m>+A%Fu+bGmvRQRBfl<%(1faN58lUVc%RM{U6J0uG$5xj6Jdi zoE^0mDjEwD0omfjHQj5iIbi7qz~KYpjf?`WEuC06nv2Se{=lG^y}fmH2ow_XLx~0v zJy}B9J)e_Af@UM*81>U^NiQshf^vtXvrrDuzRYhNKKFK&^5X47ai}3@UkOmXQ}d;IhoxK?;VkPesvX zgzhElYWKOU*xaDIpLQZS3uZT^SQuLoiup@SN;IOT zu82NJtH>(=#|+#Yc_qcQuSR4%$g_p~VXzZ}PfI5wG#W!MO;QB>+%Z8*`+FNt^HSXH zZovC+aEkZdHwzRvw5#_M)34T<#|1wWA^J5%u|&-XOw7K}*4yT&8b6ZWIL%5N$sg<3M?!Blio98jLMS3stiviMLXYcEp z9IA*-;_#}2ZRGz~`U-Sp*`eA!6`^`A&*nsL4Mxu>Y;@s#kT18>3b5aEr02kRu$$_5 ztPaQ!z`@uG9j0T33Ncwux*`?}u@;j!2kSKhv(|F1@h3+0dPtg23?MG@Mv?mqs<|*9 zI`rI%(H)gDV<{4uC`~J4 ziB#)`xyA&uxRn;uA#79+!l@M?MJa7|k>5D_;1zTa+{$6F5*IN1Q>|%~L!p^Pb~*?v zB;<0Y;S)f;3i0=9LY+pzv^x-%LwL9orBt^^nBwjg(<}mFn{=iMdAL=L+0%Uo4UZP% z*Cm*!VJ;I!BR|BJo*kRCj|mzCUdqqk8)21dv(WC9%!SM4( z`Q_!!01BJ**=}#PUO!x+P&)r+p4?YGdgdcg(1U1bde#m{T0(yx3?pyX00B??-DvVR zQJ`W3PqTH&{J2FjhgQEf$*VCiv9y@zt%zl()Ik50eYV(_Te}fDGtpCz+?&Tgn_K>Z zwkJ<+5!pRPL}(!i;9(A5yVwSTty%!MFKp6HM41pAQA!ER zH=+G zCfhW}sdlJ^6FAosEIW|euXhwcjp=&2`$MzHQcpgP?(r}3bK-ZZCWduw3dzDjI+-*u zi?>F4XgR#Q?gw=(aZ)%FTLJWO(C0OG8K)uwVlh?}`(zK;BPT+g%3qlg4Mo)cOl@L{ zns+i%*tBe7jJ?c(fsX@HOD6?P_y!6s^;x`7#5?zTyF>;q=l6y7qFBh8N+@sC?FPR_ zeix@C$SfenO-yFU+aDNwAqyAHkzvJ9wNU1UiDH>j8NQiwIoI|)bC_j(?5}fV!6EIh zd^P0-XxmF^e+N0ajXI1%c-cOlyz_PnkPjr?p(eirBG@<@BYCABEGGO7 zZjMJ9Q`~U#UJpt(^(diN#N_3y5hbx8NT~n1s`09*oqi0wPMIc)WlFkw6yyG2_f~v= zQbheYp<$E(nl?!qLYUc}d+p@0D0p(D3(N6JmGI4x!UJmc?*nymS;{zO=c-HfPv3XY zwJOL(-DCXiAf7!H2uBu6#-$eqdr2S9{k7gTbP30m-NhU!2VcwTMo)Oh^a#e5%M?nd z%$2L#%jp%7=e-ZBsC8aqNE)nikW*X&ii$6`VLY`FFi2Kd*#Lo=s~M`~7o5)?oELQ- z?1py<=Rk$`if7`pD5zFM=M)_Ugv)dXk}~?6%E(6-WslN7NK0 z-67&#zV+Pz)GCGhdWnDc943d-X(`oPEfpVy)Db5wIOy-l?@k^e!_3C2B6v!vnqZVI zh0&Ywjs(qtkTWDM%gt_4>|3TA<`y!vtuoC45AM(;n?H%`A-?riD81Dn%Cr18N#@6X z2$gQXAC(`5y?W9qvT3(=*83ravZr};TBzoV=Dmd*oMJZUd4M>PHseCEMNy*8!jV^C z)lc=nQ_cXTIXBtPfSpZGf}NXaX#JHcPNNv{cD=|-{WVcA>YVTV${r9mH6K(?t(+)I z{`ikNg6Y2TEP(aERId5(C--IRW(4d{<4wJ7u7TfaP2%ekRV~`o-YuDh@@A)S*&8Nc!!FKgf9n-*8HFKO ziQ6>SmM&HUn><>8kdNYpelp=WG2<>m2Y|fGYcEe_5mrf7d zy+-?EdQ`PbZ@4hr#M`rwg7vf;00nIx@5(e)&QhBMIX{#Q+_9C*G#E(4<)}5C&!2z(nmL)wn9;a(xn& zd9Jb10aWs@3XK15C==7PK!V?uqE3^P+5kv{MWiX&pyivm<*GG_?d)8I=Nm`?5Z++s}}}0UpT7gn~~voqy)7@vMq&JVt!& z*E`0qP-^7LLy`Utwn&*c4t%f_uQiVz5wJEdT#lR;A>p{-$;{XG3ksp)dtYOX=uMbm z`u30Om@}TO}N$;7}C$7wj27lrQ?^I|a~FD4yaoL*Kv7M;<0Cmx^$G7Z9w% z(=*22F7jTL^~}0DxNZ^aYDoNQK2HaC`q{Ftse5Ky>V{%sAD`s4lpfyp`L5-yxd)RA zzG2QR0j`0A+g^hDa0CJ1!W3vU4{Mn#hc}iiUAQ2P6C?Psr_a6+HKnJ=|IA zNk)~Pdvw7jUPx;6ad>9J7%5T#CXrzl_z!y)_!jd&uxBtuDYY-_H??>_;yIUd_alCm z%l$`MP!f>04&5Lt{$i}|>Bq|5cp>ojh|?SZIF5^e%ZMYOIzk*b=&GEoY@y19CwvlZ zboUWAmpP|CamwERJ$wdihgR6ZZ(bWZ=~K8z5Q{^m+gK9q=~H*>Mw^0?&$LQHBJlz%2&r zb^m4rzbCS$Z3o)T*B}jaQ=5)lZz~5>ncM73hdpDo+!N?RAQH9;-yQZtr|Awef=vsv z0p-I!xXQn`VmZ0K)ZuG9O49-S@X9d>cQQ|)cOi5wZ~1-wd4HB&JMfEJvg@fZLCysJ zRhq>YzaRw<3))<=)mloh>@Z!l8Bqwn#s3`MJK>9qEk$IrKkTq~kwn*G&LxPAK!>h- zYc>y)KXMclp_kH-KLe3|=?UFE z0X?MCsIch=jUmp&i=0_(ScO_~{sLt2;HYCEq*V)2GhRASl8Rt_=ef|~2rZ8Fp^ra| zH#CPcA8UPTbp1()quA~3&=9i7YfHLER%5a^i;KtPK{ey|$}2c9wJ45mkW0=->+$Wh z&=Zk{ta%N!f+LW=&slGR%|ADr#Znc%({fXPd$ZJHxfJ9LfpmtYa6Q8iYf2}H#tmK@ z7%W;AA=df3=Yg*TlTvLz{~zWn6K6P-d@l&m@YW=Zgu)B-sFm>EAQO^%S`?k?@Q5MamhLCQ z!D~@DBVe7viMh)D0*oapt=jJBKXyaONE6)~kHtq;Q`BG13rYbKSci-S!1;St62?k4 zJC7aew2_~xGKRm}n2Yl#wx;L@rGCl3O&Q%lDL^!dSic^CWxlJ2&WK&sYaI7pbQr!C zAT#7yM*n5L%!!o!e9hL-ryFE(SGHj%37Qxd)VI}I{AvF&A0TJ`XY)bn03&@l%c9La z&B052ACf-%AH#t;Ts=Jgui@~J?@)OBkKvH80*+Pi*Klb6Yd9DZ;COi$|ET;1y7Mw{ zP$Z*b-I%-Pm0*1N2M zUe8#_>LvJ!!QeY1UUoL+pEUR&2Bq0htoS-OcrPi3dE$|0X&{9Mg7*}3-&lRI=qa4o zMnzj$e5p;ScsaOq^4B2X*H1%3ZÐPEiS|TKr$*SpiJ7QH+mE5D69E&DrwMcJo6S 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%0A^Pq|8B%c=lDM*1^0)rG?{k5*Z?qqfK2PG8R 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.xml b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.xml new file mode 100644 index 00000000..5b0dc16d --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/docsets/Alamofire.xml @@ -0,0 +1 @@ +5.8.1https://alamofire.github.io/Alamofire/docsets/Alamofire.tgz diff --git a/Carthage/Checkouts/Alamofire/docs/img/carat.png b/Carthage/Checkouts/Alamofire/docs/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/img/dash.png b/Carthage/Checkouts/Alamofire/docs/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/Alamofire/docs/index.html b/Carthage/Checkouts/Alamofire/docs/index.html new file mode 100644 index 00000000..cf0d549e --- /dev/null +++ b/Carthage/Checkouts/Alamofire/docs/index.html @@ -0,0 +1,863 @@ + + + + Alamofire Reference + + + + + + + + + + + + + + + +

+ diff --git a/Carthage/Checkouts/BigInt/docs/Structs/BigUInt/Words.html b/Carthage/Checkouts/BigInt/docs/Structs/BigUInt/Words.html new file mode 100644 index 00000000..0c13a2f7 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/Structs/BigUInt/Words.html @@ -0,0 +1,215 @@ + + + + Words Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Words

+
+
+ +
public struct Words : RandomAccessCollection
+ +
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(index: Int) -> Word { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/badge.svg b/Carthage/Checkouts/BigInt/docs/badge.svg new file mode 100644 index 00000000..09c23006 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 85% + + + 85% + + + diff --git a/Carthage/Checkouts/BigInt/docs/css/highlight.css b/Carthage/Checkouts/BigInt/docs/css/highlight.css new file mode 100644 index 00000000..d0db0e13 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/Carthage/Checkouts/BigInt/docs/css/jazzy.css b/Carthage/Checkouts/BigInt/docs/css/jazzy.css new file mode 100644 index 00000000..ff59f5f8 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/css/jazzy.css @@ -0,0 +1,395 @@ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Info.plist b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Info.plist new file mode 100644 index 00000000..220c951b --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleIdentifier + com.jazzy.bigint + CFBundleName + BigInt + DocSetPlatformFamily + bigint + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + DashDocSetFallbackURL + https://attaswift.github.io/BigInt/reference/ + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 00000000..7479e358 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,173 @@ + + + + Extensions Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + BinaryFloatingPoint + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + String + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension String
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/BinaryFloatingPoint.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/BinaryFloatingPoint.html new file mode 100644 index 00000000..86bf1c39 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/BinaryFloatingPoint.html @@ -0,0 +1,194 @@ + + + + BinaryFloatingPoint Extension Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BinaryFloatingPoint

+
+
+ +
extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger
+ +
+
+ +
+
+ +
+
+
+
+ + +
+ +

Available where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger

+

+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/String.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/String.html new file mode 100644 index 00000000..8e347fd3 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Extensions/String.html @@ -0,0 +1,244 @@ + + + + String Extension Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

String

+
+
+ +
extension String
+ +
+
+ +
+
+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new string with the base-10 representation of an unsigned big integer.

    +
    +

    Complexity

    + O(v.count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ v: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new string representing an unsigned big integer in the given radix (base).

    + +

    Numerals greater than 9 are represented as letters from the English alphabet, +starting with a if uppercase is false or A otherwise.

    +
    +

    Requires

    + radix > 1 && radix <= 36 + +
    +

    Complexity

    + O(count) when radix is a power of two; otherwise O(count^2). + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ v: BigUInt, radix: Int, uppercase: Bool = false)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new string representing a signed big integer in the given radix (base).

    + +

    Numerals greater than 9 are represented as letters from the English alphabet, +starting with a if uppercase is false or A otherwise.

    +
    +

    Requires

    + radix > 1 && radix <= 36 + +
    +

    Complexity

    + O(count) when radix is a power of two; otherwise O(count^2). + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ value: BigInt, radix: Int = 10, uppercase: Bool = false)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 00000000..9ae78600 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,229 @@ + + + + Structures Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Structures

+

The following structures are available globally.

+ +
+
+ +
+
+
+
    +
  • +
    + + + + BigUInt + +
    +
    +
    +
    +
    +
    +

    An arbitary precision unsigned integer type, also known as a “big integer”.

    + +

    Operations on big integers never overflow, but they may take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

    + +

    This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper +around Array<UInt64>. (In fact, BigUInt only uses an array if there are more than two digits.)

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct BigUInt : UnsignedInteger
    +
    extension BigUInt: Codable
    +
    extension BigUInt: Comparable
    +
    extension BigUInt: Hashable
    +
    extension BigUInt: ExpressibleByIntegerLiteral
    +
    extension BigUInt: Strideable
    +
    extension BigUInt: ExpressibleByStringLiteral
    +
    extension BigUInt: CustomStringConvertible
    +
    extension BigUInt: CustomPlaygroundDisplayConvertible
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

BigInt

+

+
+
+
    +
  • +
    + + + + BigInt + +
    +
    +
    +
    +
    +
    +

    An arbitary precision signed integer type, also known as a “big integer”.

    + +

    Operations on big integers never overflow, but they might take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

    + +

    This particular big integer type uses base-2^64 digits to represent integers.

    + +

    BigInt is essentially a tiny wrapper that extends BigUInt with a sign bit and provides signed integer +operations. Both the underlying absolute value and the negative/positive flag are available as read-write +properties.

    + +

    Not all algorithms of BigUInt are available for BigInt values; for example, there is no square root or +primality test for signed integers. When you need to call one of these, just extract the absolute value:

    +
    BigInt(255).abs.isPrime()   // Returns false
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct BigInt : SignedInteger
    +
    extension BigInt: Codable
    +
    extension BigInt: Hashable
    +
    extension BigInt: ExpressibleByIntegerLiteral
    +
    extension BigInt: Strideable
    +
    extension BigInt: ExpressibleByStringLiteral
    +
    extension BigInt: CustomStringConvertible
    +
    extension BigInt: CustomPlaygroundDisplayConvertible
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt.html new file mode 100644 index 00000000..ef27d99f --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt.html @@ -0,0 +1,2546 @@ + + + + BigInt Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BigInt

+
+
+ +
public struct BigInt : SignedInteger
+
extension BigInt: Codable
+
extension BigInt: Hashable
+
extension BigInt: ExpressibleByIntegerLiteral
+
extension BigInt: Strideable
+
extension BigInt: ExpressibleByStringLiteral
+
extension BigInt: CustomStringConvertible
+
extension BigInt: CustomPlaygroundDisplayConvertible
+ +
+
+

An arbitary precision signed integer type, also known as a “big integer”.

+ +

Operations on big integers never overflow, but they might take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

+ +

This particular big integer type uses base-2^64 digits to represent integers.

+ +

BigInt is essentially a tiny wrapper that extends BigUInt with a sign bit and provides signed integer +operations. Both the underlying absolute value and the negative/positive flag are available as read-write +properties.

+ +

Not all algorithms of BigUInt are available for BigInt values; for example, there is no square root or +primality test for signed integers. When you need to call one of these, just extract the absolute value:

+
BigInt(255).abs.isPrime()   // Returns false
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Sign + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Sign
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Magnitude + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Magnitude = BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Word + +
    +
    +
    +
    +
    +
    +

    The type representing a digit in BigInt‘s underlying number system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Word = BigUInt.Word
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isSigned + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var isSigned: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + magnitude + +
    +
    +
    +
    +
    +
    +

    The absolute value of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var magnitude: BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + sign + +
    +
    +
    +
    +
    +
    +

    True iff the value of this integer is negative.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var sign: Sign
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(sign:magnitude:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new big integer with the provided absolute number and sign flag.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(sign: Sign, magnitude: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isZero + +
    +
    +
    +
    +
    +
    +

    Return true iff this integer is zero.

    +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var isZero: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + signum() + +
    +
    +
    +
    +
    +
    +

    Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func signum() -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    The sign of this number, expressed as an integer of the same type.

    +
    + +
    +
    +
  • +
  • +
    + + + + +(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a to b and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func + (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + +=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add b to a in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func += (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Bitwise Operations

+

+
+
+
    +
  • +
    + + + + ~(_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public prefix static func ~ (x: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func & (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func | (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^ (lhs: inout BigInt, rhs: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func |= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^= (lhs: inout BigInt, rhs: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is equal to b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (a: BigInt, b: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is less than b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (a: BigInt, b: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer, +where the first byte indicates sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ buffer: UnsafeRawBufferPointer)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes an integer from the bits stored inside a piece of Data. +The data is assumed to be in network (big-endian) byte order with a first +byte to represent the sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ data: Data)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + serialize() + +
    +
    +
    +
    +
    +
    +

    Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize() -> Data
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Full-width multiplication and division

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Divide this integer by y and return the resulting quotient and remainder.

    +
    +

    Requires

    + y > 0 + +
    +

    Complexity

    + O(count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func quotientAndRemainder(dividingBy y: BigInt) -> (quotient: BigInt, remainder: BigInt)
    + +
    +
    +
    +

    Return Value

    +

    (quotient, remainder) where quotient = floor(self/y), remainder = self - quotient * y

    +
    + +
    +
    +
  • +
  • +
    + + + + /(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b and return the quotient. Traps if b is zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func / (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b and return the remainder. The result has the same sign as a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func % (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + modulus(_:) + +
    +
    +
    +
    +
    +
    +

    Return the result of a mod b. The result is always a nonnegative integer that is less than the absolute value of b.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func modulus(_ mod: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + /=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b storing the quotient in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func /= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide a by b storing the remainder in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func %= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:) + +
    +
    +
    +
    +
    +
    +

    Returns this integer raised to the power exponent.

    + +

    This function calculates the result by successively squaring the base while halving the exponent.

    +
    +

    Note

    + This function can be unreasonably expensive for large exponents, which is why exponent is + a simple integer value. If you want to calculate big exponents, you’ll probably need to use + the modulo arithmetic variant. + +
    +

    See also

    + BigUInt.power(_:, modulus:) + +
    +

    Complexity

    + O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: Int) -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    1 if exponent == 0, otherwise self raised to exponent. (This implies that 0.power(0) == 1.)

    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:modulus:) + +
    +
    +
    +
    +
    +
    +

    Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

    + +

    Uses the right-to-left binary method.

    +
    +

    Complexity

    + O(exponent.count * modulus.count^log2(3)) or somesuch + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: BigInt, modulus: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Returns the greatest common divisor of a and b.

    +
    +

    Complexity

    + O(count^2) where count = max(a.count, b.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func greatestCommonDivisor(with b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + inverse(_:) + +
    +
    +
    +
    +
    +
    +

    Returns the multiplicative inverse of this integer in modulo modulus arithmetic, +or nil if there is no such number.

    +
    +

    Requires

    + modulus.magnitude > 1 + +
    +

    Complexity

    + O(count^3) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func inverse(_ modulus: BigInt) -> BigInt?
    + +
    +
    +
    +

    Return Value

    +

    If gcd(self, modulus) == 1, the value returned is an integer a < modulus such that (a * self) % modulus == 1. If self and modulus aren’t coprime, the return value is nil.

    +
    + +
    +
    +
  • +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    +

    Append this BigInt to the specified hasher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new signed big integer with the same value as the specified unsigned big integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ integer: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(clamping:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(clamping source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(truncatingIfNeeded source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from an integer literal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral value: Int64)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a with b and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func * (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a with b in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func *= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Primality Testing

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns true iff this integer passes the strong probable prime test for the specified base.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isStrongProbablePrime(_ base: BigInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isPrime(rounds:) + +
    +
    +
    +
    +
    +
    +

    Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

    + +

    This function performs a probabilistic Miller-Rabin Primality Test, consisting of rounds iterations, +each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, +but you may specify your own choice.

    + +

    To speed things up, the function checks if self is divisible by the first few prime numbers before +diving into (slower) Miller-Rabin testing.

    + +

    Also, when self is less than 82 bits wide, isPrime does a deterministic test that is guaranteed to +return a correct result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isPrime(rounds: Int = 10) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &<<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &<< (left: BigInt, right: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &<<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &<<= (left: inout BigInt, right: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &>>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &>> (left: BigInt, right: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &>>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &>>= (left: inout BigInt, right: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func << <Other>(lhs: BigInt, rhs: Other) -> BigInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func <<= <Other>(lhs: inout BigInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >> <Other>(lhs: BigInt, rhs: Other) -> BigInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >>= <Other>(lhs: inout BigInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Square Root

+

+
+
+
    +
  • +
    + + + + squareRoot() + +
    +
    +
    +
    +
    +
    +

    Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

    +
    +

    Requires

    + self >= 0 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func squareRoot() -> BigInt
    + +
    +
    +
    +

    Return Value

    +

    floor(sqrt(self))

    +
    + +
    +
    +
  • +
  • +
    + + + + Stride + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stride = BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + advanced(by:) + +
    +
    +
    +
    +
    +
    +

    Returns self + n.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func advanced(by n: Stride) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + distance(to:) + +
    +
    +
    +
    +
    +
    +

    Returns other - self.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func distance(to other: BigInt) -> Stride
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:radix:) + +
    +
    +
    +
    +
    +
    +

    Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by +letters from the English alphabet.

    +
    +

    Requires

    + radix > 1 && radix < 36 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<S>(_ text: S, radix: Int = 10) where S : StringProtocol
    + +
    +
    +
    +

    Return Value

    +

    The integer represented by text, or nil if text contains a character that does not represent a numeral in radix.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from a Unicode scalar. +The scalar must represent a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(unicodeScalarLiteral value: UnicodeScalar)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from an extended grapheme cluster. +The cluster must consist of a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(extendedGraphemeClusterLiteral value: String)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. +The string must contain only decimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral value: StringLiteralType)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Return the decimal representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + playgroundDescription + +
    +
    +
    +
    +
    +
    +

    Return the playground quick look representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var playgroundDescription: Any { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + negate() + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func negate()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and return the result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func - (a: BigInt, b: BigInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a in place.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func -= (a: inout BigInt, b: BigInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + bitWidth + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bitWidth: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + trailingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var trailingZeroBitCount: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + Words + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Words : RandomAccessCollection
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + words + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var words: Words { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<S>(words: S) where S : Sequence, S.Element == BigInt.Word
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Sign.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Sign.html new file mode 100644 index 00000000..93984a5b --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Sign.html @@ -0,0 +1,189 @@ + + + + Sign Enumeration Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Sign

+
+
+ +
public enum Sign
+ +
+
+

Undocumented

+ + +
+
+ +
+
+
+
    +
  • +
    + + + + plus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case plus
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + minus + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case minus
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Words.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Words.html new file mode 100644 index 00000000..d070e505 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigInt/Words.html @@ -0,0 +1,302 @@ + + + + Words Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Words

+
+
+ +
public struct Words : RandomAccessCollection
+ +
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Indices + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Indices = CountableRange<Int>
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + count + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var count: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + indices + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var indices: Indices { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(index: Int) -> UInt { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt.html new file mode 100644 index 00000000..5d164ca9 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt.html @@ -0,0 +1,3220 @@ + + + + BigUInt Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

BigUInt

+
+
+ +
public struct BigUInt : UnsignedInteger
+
extension BigUInt: Codable
+
extension BigUInt: Comparable
+
extension BigUInt: Hashable
+
extension BigUInt: ExpressibleByIntegerLiteral
+
extension BigUInt: Strideable
+
extension BigUInt: ExpressibleByStringLiteral
+
extension BigUInt: CustomStringConvertible
+
extension BigUInt: CustomPlaygroundDisplayConvertible
+ +
+
+

An arbitary precision unsigned integer type, also known as a “big integer”.

+ +

Operations on big integers never overflow, but they may take a long time to execute. +The amount of memory (and address space) available is the only constraint to the magnitude of these numbers.

+ +

This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper +around Array<UInt64>. (In fact, BigUInt only uses an array if there are more than two digits.)

+ + +
+
+ +
+
+
+
    +
  • +
    + + + + Word + +
    +
    +
    +
    +
    +
    +

    The type representing a digit in BigUInt‘s underlying number system.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Word = UInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init() + +
    +
    +
    +
    +
    +
    +

    Initializes a new BigUInt with value 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init()
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(words: [Word])
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Addition

+

+
+
+
    +
  • +
    + + + + +(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a and b together and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func + (a: BigUInt, b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + +=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Add a and b together, and store the sum in a.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func += (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isSigned + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var isSigned: Bool { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + signum() + +
    +
    +
    +
    +
    +
    +

    Returns 1 if this value is, positive; otherwise, 0.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func signum() -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    The sign of this number, expressed as an integer of the same type.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Bitwise Operations

+

+
+
+
    +
  • +
    + + + + ~(_:) + +
    +
    +
    +
    +
    +
    +

    Return the ones’ complement of a.

    +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public prefix static func ~ (a: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + |=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise OR of a and b, and store the result in a.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func |= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + &=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise AND of a and b and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func &= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ^=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Calculate the bitwise XOR of a and b and return the result.

    +
    +

    Complexity

    + O(max(a.count, b.count)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func ^= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(from:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(from decoder: Decoder) throws
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + encode(to:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func encode(to encoder: Encoder) throws
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Comparison

+

+
+
+
    +
  • +
    + + + + compare(_:_:) + +
    +
    +
    +
    +
    +
    +

    Compare a to b and return an NSComparisonResult indicating their order.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func compare(_ a: BigUInt, _ b: BigUInt) -> ComparisonResult
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + ==(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is equal to b.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func == (a: BigUInt, b: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <(_:_:) + +
    +
    +
    +
    +
    +
    +

    Return true iff a is less than b.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func < (a: BigUInt, b: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

NSData Conversion

+

+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ buffer: UnsafeRawBufferPointer)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initializes an integer from the bits stored inside a piece of Data. +The data is assumed to be in network (big-endian) byte order.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ data: Data)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + serialize() + +
    +
    +
    +
    +
    +
    +

    Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func serialize() -> Data
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Division

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Divide this integer by y and return the resulting quotient and remainder.

    +
    +

    Requires

    + y > 0 + +
    +

    Complexity

    + O(count^2) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func quotientAndRemainder(dividingBy y: BigUInt) -> (quotient: BigUInt, remainder: BigUInt)
    + +
    +
    +
    +

    Return Value

    +

    (quotient, remainder) where quotient = floor(self/y), remainder = self - quotient * y

    +
    + +
    +
    +
  • +
  • +
    + + + + /(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and return the quotient.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func / (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and return the remainder.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func % (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + /=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and store the quotient in x.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func /= (x: inout BigUInt, y: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + %=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Divide x by y and store the remainder in x.

    +
    +

    Note

    + Use divided(by:) if you also need the remainder. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func %= (x: inout BigUInt, y: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Exponentiation

+

+
+
+
    +
  • +
    + + + + power(_:) + +
    +
    +
    +
    +
    +
    +

    Returns this integer raised to the power exponent.

    + +

    This function calculates the result by successively squaring the base while halving the exponent.

    +
    +

    Note

    + This function can be unreasonably expensive for large exponents, which is why exponent is + a simple integer value. If you want to calculate big exponents, you’ll probably need to use + the modulo arithmetic variant. + +
    +

    See also

    + BigUInt.power(_:, modulus:) + +
    +

    Complexity

    + O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: Int) -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    1 if exponent == 0, otherwise self raised to exponent. (This implies that 0.power(0) == 1.)

    +
    + +
    +
    +
  • +
  • +
    + + + + power(_:modulus:) + +
    +
    +
    +
    +
    +
    +

    Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

    + +

    Uses the right-to-left binary method.

    +
    +

    Complexity

    + O(exponent.count * modulus.count^log2(3)) or somesuch + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func power(_ exponent: BigUInt, modulus: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryFloatingPoint
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Greatest Common Divisor

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns the greatest common divisor of self and b.

    +
    +

    Complexity

    + O(count^2) where count = max(self.count, b.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func greatestCommonDivisor(with b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + inverse(_:) + +
    +
    +
    +
    +
    +
    +

    Returns the multiplicative inverse of this integer in modulo modulus arithmetic, +or nil if there is no such number.

    +
    +

    Requires

    + modulus > 1 + +
    +

    Complexity

    + O(count^3) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func inverse(_ modulus: BigUInt) -> BigUInt?
    + +
    +
    +
    +

    Return Value

    +

    If gcd(self, modulus) == 1, the value returned is an integer a < modulus such that (a * self) % modulus == 1. If self and modulus aren’t coprime, the return value is nil.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Hashing

+

+
+
+
    +
  • +
    + + + + hash(into:) + +
    +
    +
    +
    +
    +
    +

    Append this BigUInt to the specified hasher.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hash(into hasher: inout Hasher)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(exactly:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<T>(exactly source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(truncatingIfNeeded source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(clamping:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(clamping source: T) where T : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(integerLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from an integer literal.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(integerLiteral value: UInt64)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Multiplication

+

+
+
+
    +
  • +
    + + + + multiply(byWord:) + +
    +
    +
    +
    +
    +
    +

    Multiply this big integer by a single word, and store the result in place of the original big integer.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func multiply(byWord y: Word)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + multiplied(byWord:) + +
    +
    +
    +
    +
    +
    +

    Multiply this big integer by a single Word, and return the result.

    +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func multiplied(byWord y: Word) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Multiply x by y, and add the result to this integer, optionally shifted shift words to the left.

    +
    +

    Note

    + This is the fused multiply/shift/add operation; it is more efficient than doing the components +individually. (The fused operation doesn’t need to allocate space for temporary big integers.) + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func multiplyAndAdd(_ x: BigUInt, _ y: Word, shiftedBy shift: Int = 0)
    + +
    +
    +
    +

    Return Value

    +

    self is set to self + (x * y) << (shift * 2^Word.bitWidth)

    +
    + +
    +
    +
  • +
  • +
    + + + + multiplied(by:) + +
    +
    +
    +
    +
    +
    +

    Multiply this integer by y and return the result.

    +
    +

    Note

    + This uses the naive O(n^2) multiplication algorithm unless both arguments have more than +BigUInt.directMultiplicationLimit words. + +
    +

    Complexity

    + O(n^log2(3)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func multiplied(by y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var directMultiplicationLimit: Int
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a by b and return the result.

    +
    +

    Note

    + This uses the naive O(n^2) multiplication algorithm unless both arguments have more than +BigUInt.directMultiplicationLimit words. + +
    +

    Complexity

    + O(n^log2(3)) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func * (x: BigUInt, y: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + *=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Multiply a by b and store the result in a.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func *= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Primality Testing

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Returns true iff this integer passes the strong probable prime test for the specified base.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isStrongProbablePrime(_ base: BigUInt) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + isPrime(rounds:) + +
    +
    +
    +
    +
    +
    +

    Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

    + +

    This function performs a probabilistic Miller-Rabin Primality Test, consisting of rounds iterations, +each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, +but you may specify your own choice.

    + +

    To speed things up, the function checks if self is divisible by the first few prime numbers before +diving into (slower) Miller-Rabin testing.

    + +

    Also, when self is less than 82 bits wide, isPrime does a deterministic test that is guaranteed to +return a correct result.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func isPrime(rounds: Int = 10) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width uniformly distributed random bits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(withMaximumWidth width: Int, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + width + + +
    +

    The maximum number of one bits in the result.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A big unsigned integer less than 1 << width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width uniformly distributed random bits.

    +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(withMaximumWidth width: Int) -> BigUInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + width + + +
    +

    The maximum number of one bits in the result.

    +
    +
    +
    +
    +

    Return Value

    +

    A big unsigned integer less than 1 << width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

    +
    +

    Note

    +

    If width is zero, the result is zero.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(withExactWidth width: Int, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + width + + +
    +

    The number of bits required to represent the answer.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer whose width is width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

    +
    +

    Note

    + If width is zero, the result is zero. + +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(withExactWidth width: Int) -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer whose width is width.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a uniformly distributed random unsigned integer that’s less than the specified limit.

    +
    +

    Precondition

    +

    limit > 0.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger<RNG>(lessThan limit: BigUInt, using generator: inout RNG) -> BigUInt where RNG : RandomNumberGenerator
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + limit + + +
    +

    The upper bound on the result.

    +
    +
    + + generator + + +
    +

    The source of randomness.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer that is less than limit.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Create a uniformly distributed random unsigned integer that’s less than the specified limit.

    +
    +

    Precondition

    + limit > 0. + +
    +

    Note

    +

    I use a SystemRandomGeneratorGenerator as the source of randomness.

    + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func randomInteger(lessThan limit: BigUInt) -> BigUInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + limit + + +
    +

    The upper bound on the result.

    +
    +
    +
    +
    +

    Return Value

    +

    A random big unsigned integer that is less than limit.

    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Shift Operators

+

+
+
+
    +
  • +
    + + + + >>=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >>= <Other>(lhs: inout BigUInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func <<= <Other>(lhs: inout BigUInt, rhs: Other) where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + >>(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func >> <Other>(lhs: BigUInt, rhs: Other) -> BigUInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + <<(_:_:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func << <Other>(lhs: BigUInt, rhs: Other) -> BigUInt where Other : BinaryInteger
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Square Root

+

+
+
+
    +
  • +
    + + + + squareRoot() + +
    +
    +
    +
    +
    +
    +

    Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func squareRoot() -> BigUInt
    + +
    +
    +
    +

    Return Value

    +

    floor(sqrt(self))

    +
    + +
    +
    +
  • +
  • +
    + + + + Stride + +
    +
    +
    +
    +
    +
    +

    A type that can represent the distance between two values ofa BigUInt.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stride = BigInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + advanced(by:) + +
    +
    +
    +
    +
    +
    +

    Adds n to self and returns the result. Traps if the result would be less than zero.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func advanced(by n: BigInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + distance(to:) + +
    +
    +
    +
    +
    +
    +

    Returns the (potentially negative) difference between self and other as a BigInt. Never traps.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func distance(to other: BigUInt) -> BigInt
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

String Conversion

+

+
+
+
    +
  • +
    + + + + init(_:radix:) + +
    +
    +
    +
    +
    +
    +

    Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by +letters from the English alphabet.

    +
    +

    Requires

    + radix > 1 && radix < 36 + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init?<S>(_ text: S, radix: Int = 10) where S : StringProtocol
    + +
    +
    +
    +

    Return Value

    +

    The integer represented by text, or nil if text contains a character that does not represent a numeral in radix.

    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from a Unicode scalar. +The scalar must represent a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(unicodeScalarLiteral value: UnicodeScalar)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Initialize a new big integer from an extended grapheme cluster. +The cluster must consist of a decimal digit.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(extendedGraphemeClusterLiteral value: String)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(stringLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. +The string must contain only decimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(stringLiteral value: StringLiteralType)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Return the decimal representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description: String { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + playgroundDescription + +
    +
    +
    +
    +
    +
    +

    Return the playground quick look representation of this integer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var playgroundDescription: Any { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ + +
+ +

Subtraction

+

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer in place, and return a flag indicating if the operation caused an +arithmetic overflow. other is shifted shift digits to the left before being subtracted.

    +
    +

    Note

    + If the result indicates an overflow, then self becomes the twos’ complement of the absolute difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func subtractReportingOverflow(_ b: BigUInt, shiftedBy shift: Int = 0) -> Bool
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer, returning the difference and a flag indicating arithmetic overflow. +other is shifted shift digits to the left before being subtracted.

    +
    +

    Note

    + If overflow is true, then the result value is the twos’ complement of the absolute value of the difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtractingReportingOverflow(_ other: BigUInt, shiftedBy shift: Int) -> (partialValue: BigUInt, overflow: Bool)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtracts other from self, returning the result and a flag indicating arithmetic overflow.

    +
    +

    Note

    + When the operation overflows, then partialValue is the twos’ complement of the absolute value of the difference. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtractingReportingOverflow(_ other: BigUInt) -> (partialValue: BigUInt, overflow: Bool)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract other from this integer in place. +other is shifted shift digits to the left before being subtracted.

    +
    +

    Requires

    + self >= other * 2^shift + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func subtract(_ other: BigUInt, shiftedBy shift: Int = 0)
    + +
    +
    + +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Subtract b from this integer, and return the difference. +b is shifted shift digits to the left before being subtracted.

    +
    +

    Requires

    + self >= b * 2^shift + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func subtracting(_ other: BigUInt, shiftedBy shift: Int = 0) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + decrement(shiftedBy:) + +
    +
    +
    +
    +
    +
    +

    Decrement this integer by one.

    +
    +

    Requires

    + !isZero + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public mutating func decrement(shiftedBy shift: Int = 0)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and return the result.

    +
    +

    Requires

    + a >= b + +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func - (a: BigUInt, b: BigUInt) -> BigUInt
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + -=(_:_:) + +
    +
    +
    +
    +
    +
    +

    Subtract b from a and store the result in a.

    +
    +

    Requires

    + a >= b + +
    +

    Complexity

    + O(a.count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func -= (a: inout BigUInt, b: BigUInt)
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(bitAt:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(bitAt index: Int) -> Bool { get set }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + bitWidth + +
    +
    +
    +
    +
    +
    +

    The minimum number of bits required to represent this integer in binary.

    +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var bitWidth: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    floor(log2(2 * self + 1))

    +
    + +
    +
    +
  • +
  • +
    + + + + leadingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    The number of leading zero bits in the binary representation of this integer in base 2^(Word.bitWidth). +This is useful when you need to normalize a BigUInt such that the top bit of its most significant word is 1.

    +
    +

    Note

    + 0 is considered to have zero leading zero bits. + +
    +

    See also

    + width + +
    +

    Complexity

    + O(1) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var leadingZeroBitCount: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    A value in 0...(Word.bitWidth - 1).

    +
    + +
    +
    +
  • +
  • +
    + + + + trailingZeroBitCount + +
    +
    +
    +
    +
    +
    +

    The number of trailing zero bits in the binary representation of this integer.

    +
    +

    Note

    + 0 is considered to have zero trailing zero bits. + +
    +

    Complexity

    + O(count) + +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var trailingZeroBitCount: Int { get }
    + +
    +
    +
    +

    Return Value

    +

    A value in 0...width.

    +
    + +
    +
    +
  • +
  • +
    + + + + Words + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Words : RandomAccessCollection
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + words + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var words: Words { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + init(words:) + +
    +
    +
    +
    +
    +
    +

    Undocumented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<Words>(words: Words) where Words : Sequence, Words.Element == BigUInt.Word
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt/Words.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt/Words.html new file mode 100644 index 00000000..0c13a2f7 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/Structs/BigUInt/Words.html @@ -0,0 +1,215 @@ + + + + Words Structure Reference + + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+

Words

+
+
+ +
public struct Words : RandomAccessCollection
+ +
+
+ + +
+
+ +
+
+
+
    +
  • +
    + + + + startIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var startIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + endIndex + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var endIndex: Int { get }
    + +
    +
    + +
    +
    +
  • +
  • +
    + + + + subscript(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public subscript(index: Int) -> Word { get }
    + +
    +
    + +
    +
    +
  • +
+
+
+
+ +
+
+ + + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/highlight.css b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 00000000..d0db0e13 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,200 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/jazzy.css b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 00000000..ff59f5f8 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,395 @@ +*, *:before, *:after { + box-sizing: inherit; } + +body { + margin: 0; + background: #fff; + color: #333; + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + letter-spacing: .2px; + -webkit-font-smoothing: antialiased; + box-sizing: border-box; } + +h1 { + font-size: 2rem; + font-weight: 700; + margin: 1.275em 0 0.6em; } + +h2 { + font-size: 1.75rem; + font-weight: 700; + margin: 1.275em 0 0.3em; } + +h3 { + font-size: 1.5rem; + font-weight: 700; + margin: 1em 0 0.3em; } + +h4 { + font-size: 1.25rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h5 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; } + +h6 { + font-size: 1rem; + font-weight: 700; + margin: 1.275em 0 0.85em; + color: #777; } + +p { + margin: 0 0 1em; } + +ul, ol { + padding: 0 0 0 2em; + margin: 0 0 0.85em; } + +blockquote { + margin: 0 0 0.85em; + padding: 0 15px; + color: #858585; + border-left: 4px solid #e5e5e5; } + +img { + max-width: 100%; } + +a { + color: #4183c4; + text-decoration: none; } + a:hover, a:focus { + outline: 0; + text-decoration: underline; } + a.discouraged { + text-decoration: line-through; } + a.discouraged:hover, a.discouraged:focus { + text-decoration: underline line-through; } + +table { + background: #fff; + width: 100%; + border-collapse: collapse; + border-spacing: 0; + overflow: auto; + margin: 0 0 0.85em; } + +tr:nth-child(2n) { + background-color: #fbfbfb; } + +th, td { + padding: 6px 13px; + border: 1px solid #ddd; } + +pre { + margin: 0 0 1.275em; + padding: .85em 1em; + overflow: auto; + background: #f7f7f7; + font-size: .85em; + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +code { + font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; } + +.item-container p > code, .item-container li > code, .top-matter p > code, .top-matter li > code { + background: #f7f7f7; + padding: .2em; } + .item-container p > code:before, .item-container p > code:after, .item-container li > code:before, .item-container li > code:after, .top-matter p > code:before, .top-matter p > code:after, .top-matter li > code:before, .top-matter li > code:after { + letter-spacing: -.2em; + content: "\00a0"; } + +pre code { + padding: 0; + white-space: pre; } + +.content-wrapper { + display: flex; + flex-direction: column; } + @media (min-width: 768px) { + .content-wrapper { + flex-direction: row; } } +.header { + display: flex; + padding: 8px; + font-size: 0.875em; + background: #444; + color: #999; } + +.header-col { + margin: 0; + padding: 0 8px; } + +.header-col--primary { + flex: 1; } + +.header-link { + color: #fff; } + +.header-icon { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + +.breadcrumbs { + font-size: 0.875em; + padding: 8px 16px; + margin: 0; + background: #fbfbfb; + border-bottom: 1px solid #ddd; } + +.carat { + height: 10px; + margin: 0 5px; } + +.navigation { + order: 2; } + @media (min-width: 768px) { + .navigation { + order: 1; + width: 25%; + max-width: 300px; + padding-bottom: 64px; + overflow: hidden; + word-wrap: normal; + background: #fbfbfb; + border-right: 1px solid #ddd; } } +.nav-groups { + list-style-type: none; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #ddd; + padding: 8px 0 8px 16px; } + +.nav-group-name-link { + color: #333; } + +.nav-group-tasks { + margin: 8px 0; + padding: 0 0 0 8px; } + +.nav-group-task { + font-size: 1em; + list-style-type: none; + white-space: nowrap; } + +.nav-group-task-link { + color: #808080; } + +.main-content { + order: 1; } + @media (min-width: 768px) { + .main-content { + order: 2; + flex: 1; + padding-bottom: 60px; } } +.section { + padding: 0 32px; + border-bottom: 1px solid #ddd; } + +.section-content { + max-width: 834px; + margin: 0 auto; + padding: 16px 0; } + +.section-name { + color: #666; + display: block; } + .section-name p { + margin-bottom: inherit; } + +.declaration .highlight { + overflow-x: initial; + padding: 8px 0; + margin: 0; + background-color: transparent; + border: none; } + +.task-group-section { + border-top: 1px solid #ddd; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; } + +.section-name-container { + position: relative; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item-container { + padding: 0; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 20px; + font-size: 1rem; } + .item .declaration-note { + font-size: .85em; + color: #808080; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #ddd; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + left: 21px; + top: 7px; + display: block; + position: absolute; + width: 12px; + height: 12px; + border-left: 1px solid #ddd; + border-top: 1px solid #ddd; + background: #fff; + transform: rotate(45deg); } + +.height-container { + display: none; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #fff; + border: 1px solid #ddd; + border-top-width: 0; + padding-top: 10px; + padding-bottom: 5px; + padding: 8px 16px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4183c4; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #ddd; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +.footer { + padding: 8px 16px; + background: #444; + color: #ddd; + font-size: 0.8em; } + .footer p { + margin: 8px 0; } + .footer a { + color: #fff; } + +html.dash .header, html.dash .breadcrumbs, html.dash .navigation { + display: none; } + +html.dash .height-container { + display: block; } + +form[role=search] input { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 24px; + padding: 0 10px; + margin: 0; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + +form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fbfbfb; + color: #333; + border: 1px solid #ddd; } + +form[role=search] .tt-highlight { + font-weight: bold; } + +form[role=search] .tt-suggestion { + font: 16px/1.7 "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + +form[role=search] .tt-suggestion:hover, +form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + +form[role=search] .tt-suggestion:hover .doc-parent-name, +form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/carat.png b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/dash.png b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/index.html b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/index.html new file mode 100644 index 00000000..cb588bb2 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,493 @@ + + + + BigInt Reference + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+ +

BigInt

+ + + +

Swift 5 +License +Platform

+ +

Build Status +Code Coverage +jazzy +Carthage compatible +Version

+

Overview

+ +

This repository provides integer types of arbitrary width implemented +in 100% pure Swift. The underlying representation is in base 2^64, using Array<UInt64>.

+ +

This module is handy when you need an integer type that’s wider than UIntMax, but +you don’t want to add The GNU Multiple Precision Arithmetic Library +as a dependency.

+ +

Two big integer types are included: BigUInt and BigInt, +the latter being the signed variant. +Both of these are Swift structs with copy-on-write value semantics, and they can be used much +like any other integer type.

+ +

The library provides implementations for some of the most frequently useful functions on +big integers, including

+ + + +

The implementations are intended to be reasonably efficient, but they are unlikely to be +competitive with GMP at all, even when I happened to implement an algorithm with same asymptotic +behavior as GMP. (I haven’t performed a comparison benchmark, though.)

+ +

The library has 100% unit test coverage. Sadly this does not imply that there are no bugs +in it.

+

API Documentation

+ +

Generated API docs are available at https://attaswift.github.io/BigInt/.

+

License

+ +

BigInt can be used, distributed and modified under the MIT license.

+

Requirements and Integration

+ +

BigInt 4.0.0 requires Swift 4.2 (The last version with support for Swift 3.x was BigInt 2.1.0. +The last version with support for Swift 2 was BigInt 1.3.0.)

+ + + + + + + + + + + + + + + + + + + + + + + +
Swift Versionlast BigInt Version
3.x2.1.0
4.03.1.0
4.24.0.0
5.x5.2.1
+ +

BigInt deploys to macOS 10.10, iOS 9, watchOS 2 and tvOS 9. +It has been tested on the latest OS releases only—however, as the module uses very few platform-provided APIs, +there should be very few issues with earlier versions.

+ +

BigInt uses no APIs specific to Apple platforms, so +it should be easy to port it to other operating systems.

+ +

Setup instructions:

+ +
    +
  • Swift Package Manager: +Although the Package Manager is still in its infancy, BigInt provides experimental support for it. +Add this to the dependency section of your Package.swift manifest:

    +
    .package(url: "https://github.com/attaswift/BigInt.git", from: "5.2.1")
    +
  • +
  • CocoaPods: Put this in your Podfile:

    +
    pod 'BigInt', '~> 5.2'
    +
  • +
  • Carthage: Put this in your Cartfile:

    +
    github "attaswift/BigInt" ~> 5.2
    +
  • +
+

Implementation notes

+ +

BigUInt is a MutableCollectionType of its 64-bit digits, with the least significant +digit at index 0. As a convenience, BigUInt allows you to subscript it with indexes at +or above its count. The subscript operator returns 0 for out-of-bound gets and +automatically extends the array on out-of-bound sets. This makes memory management simpler.

+ +

BigInt is just a tiny wrapper around a BigUInt absolute value and a +sign bit, both of which are accessible as public read-write properties.

+

Why is there no generic BigInt<Digit> type?

+ +

The types provided by BigInt are not parametric—this is very much intentional, as +Swift generics cost us dearly at runtime in this use case. In every approach I tried, +making arbitrary-precision arithmetic operations work with a generic Digit type parameter +resulted in code that was literally ten times slower. If you can make the algorithms generic +without such a huge performance hit, please enlighten me!

+ +

This is an area that I plan to investigate more, as it would be useful to have generic +implementations for arbitrary-width arithmetic operations. (Polynomial division and decimal bases +are two examples.) The library already implements double-digit multiplication and division as +extension methods on a protocol with an associated type requirement; this has not measurably affected +performance. Unfortunately, the same is not true for BigUInt‘s methods.

+ +

Of course, as a last resort, we could just duplicate the code to create a separate +generic variant that was slower but more flexible.

+

Calculation Samples

+

Obligatory Factorial Demo

+ +

It is easy to use BigInt to calculate the factorial function for any integer:

+
import BigInt
+
+func factorial(_ n: Int) -> BigInt {
+    return (1 ... n).map { BigInt($0) }.reduce(BigInt(1), *)
+}
+
+print(factorial(10))
+==> 362880
+
+print(factorial(100))
+==> 93326215443944152681699238856266700490715968264381621468592963895217599993229915
+    6089414639761565182862536979208272237582511852109168640000000000000000000000
+
+print(factorial(1000))
+==> 40238726007709377354370243392300398571937486421071463254379991042993851239862902
+    05920442084869694048004799886101971960586316668729948085589013238296699445909974
+    24504087073759918823627727188732519779505950995276120874975462497043601418278094
+    64649629105639388743788648733711918104582578364784997701247663288983595573543251
+    31853239584630755574091142624174743493475534286465766116677973966688202912073791
+    43853719588249808126867838374559731746136085379534524221586593201928090878297308
+    43139284440328123155861103697680135730421616874760967587134831202547858932076716
+    91324484262361314125087802080002616831510273418279777047846358681701643650241536
+    91398281264810213092761244896359928705114964975419909342221566832572080821333186
+    11681155361583654698404670897560290095053761647584772842188967964624494516076535
+    34081989013854424879849599533191017233555566021394503997362807501378376153071277
+    61926849034352625200015888535147331611702103968175921510907788019393178114194545
+    25722386554146106289218796022383897147608850627686296714667469756291123408243920
+    81601537808898939645182632436716167621791689097799119037540312746222899880051954
+    44414282012187361745992642956581746628302955570299024324153181617210465832036786
+    90611726015878352075151628422554026517048330422614397428693306169089796848259012
+    54583271682264580665267699586526822728070757813918581788896522081643483448259932
+    66043367660176999612831860788386150279465955131156552036093988180612138558600301
+    43569452722420634463179746059468257310379008402443243846565724501440282188525247
+    09351906209290231364932734975655139587205596542287497740114133469627154228458623
+    77387538230483865688976461927383814900140767310446640259899490222221765904339901
+    88601856652648506179970235619389701786004081188972991831102117122984590164192106
+    88843871218556461249607987229085192968193723886426148396573822911231250241866493
+    53143970137428531926649875337218940694281434118520158014123344828015051399694290
+    15348307764456909907315243327828826986460278986432113908350621709500259738986355
+    42771967428222487575867657523442202075736305694988250879689281627538488633969099
+    59826280956121450994871701244516461260379029309120889086942028510640182154399457
+    15680594187274899809425474217358240106367740459574178516082923013535808184009699
+    63725242305608559037006242712434169090041536901059339838357779394109700277534720
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000
+
+ +

Well, I guess that’s all right, but it’s not very interesting. Let’s try something more useful.

+

RSA Cryptography

+ +

The BigInt module provides all necessary parts to implement an (overly) +simple RSA cryptography system.

+ +

Let’s start with a simple function that generates a random n-bit prime. The module +includes a function to generate random integers of a specific size, and also an +isPrime method that performs the Miller–Rabin primality test. These are all we need:

+
func generatePrime(_ width: Int) -> BigUInt {
+    while true {
+        var random = BigUInt.randomInteger(withExactWidth: width)
+        random |= BigUInt(1)
+        if random.isPrime() {
+            return random
+        }
+    }
+}
+
+let p = generatePrime(1024)
+==> 13308187650642192396256419911012544845370493728424936791561478318443071617242872
+    81980956747087187419914435169914161116601678883358611076800743580556055714173922
+    08406194264346635072293912609713085260354070700055888678514690878149253177960273
+    775659537560220378850112471985434373425534121373466492101182463962031
+
+let q = generatePrime(1024)
+==> 17072954422657145489547308812333368925007949054501204983863958355897172093173783
+    10108226596943999553784252564650624766276133157586733504784616138305701168410157
+    80784336308507083874651158029602582993233111593356512531869546706885170044355115
+    669728424124141763799008880327106952436883614887277350838425336156327
+
+ +

Cool! Now that we have two large primes, we can produce an RSA public/private keypair +out of them.

+
typealias Key = (modulus: BigUInt, exponent: BigUInt)
+
+let n = p * q
+==> 22721008120758282530010953362926306641542233757318103044313144976976529789946696
+    15454966720907712515917481418981591379647635391260569349099666410127279690367978
+    81184375533755888994370640857883754985364288413796100527262763202679037134021810
+    57933883525572232242690805678883227791774442041516929419640051653934584376704034
+    63953169772816907280591934423237977258358097846511079947337857778137177570668391
+    57455417707100275487770399281417352829897118140972240757708561027087217205975220
+    02207275447810167397968435583004676293892340103729490987263776871467057582629588
+    916498579594964478080508868267360515953225283461208420137
+
+let e: BigUInt = 65537
+let phi = (p - 1) * (q - 1)
+let d = e.inverse(phi)!     // d * e % phi == 1
+==> 13964664343869014759736350480776837992604500903989703383202366291905558996277719
+    77822086142456362972689566985925179681282432115598451765899180050962461295573831
+    37069237934291884106584820998146965085531433195106686745474222222620986858696591
+    69836532468835154412554521152103642453158895363417640676611704542784576974374954
+    45789456921660619938185093118762690200980720312508614337759620606992462563490422
+    76669559556568917533268479190948959560397579572761529852891246283539604545691244
+    89999692877158676643042118662613875863504016129837099223040687512684532694527109
+    80742873307409704484365002175294665608486688146261327793
+
+let publicKey: Key = (n, e)
+let privateKey: Key = (n, d)
+
+ +

In RSA, modular exponentiation is used to encrypt (and decrypt) messages.

+
func encrypt(_ message: BigUInt, key: Key) -> BigUInt {
+    return message.power(key.exponent, modulus: key.modulus)
+}
+
+ +

Let’s try out our new keypair by converting a string into UTF-8, interpreting +the resulting binary representation as a big integer, and encrypting it with the +public key. BigUInt has an initializer that takes an NSData, so this is pretty +easy to do:

+
let secret: BigUInt = BigUInt("Arbitrary precision arithmetic is fun!".dataUsingEncoding(NSUTF8StringEncoding)!)
+==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457
+    68818568737
+
+let cyphertext = encrypt(secret, key: publicKey)
+==> 95186982543485985200666516508066093880038842892337880561554910904277290917831453
+    54854954722744805432145474047391353716305176389470779020645959135298322520888633
+    61674945129099575943384767330342554525120384485469428048962027149169876127890306
+    77028183904699491962050888974524603226290836984166164759586952419343589385279641
+    47999991283152843977988979846238236160274201261075188190509539751990119132013021
+    74866638595734222867005089157198503204192264814750832072844208520394603054901706
+    06024394731371973402595826456435944968439153664617188570808940022471990638468783
+    49208193955207336172861151720299024935127021719852700882
+
+ +

Well, it looks encrypted all right, but can we get the original message back? +In theory, encrypting the cyphertext with the private key returns the original message. +Let’s see:

+
let plaintext = encrypt(cyphertext, key: privateKey)
+==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457
+    68818568737
+
+let received = String(data: plaintext.serialize(), encoding: NSUTF8StringEncoding)
+==> "Arbitrary precision arithmetic is fun!"
+
+ +

Yay! This is truly terrific, but please don’t use this example code in an actual +cryptography system. RSA has lots of subtle (and some not so subtle) complications +that we ignored to keep this example short.

+

Calculating the Digits of π

+ +

Another fun activity to try with BigInts is to generate the digits of π. +Let’s try implementing Jeremy Gibbon’s spigot algorithm. +This is a rather slow algorithm as π-generators go, but it makes up for it with its grooviness +factor: it’s remarkably short, it only uses (big) integer arithmetic, and every iteration +produces a single new digit in the base-10 representation of π. This naturally leads to an +implementation as an infinite GeneratorType:

+
func digitsOfPi() -> AnyGenerator<Int> {
+    var q: BigUInt = 1
+    var r: BigUInt = 180
+    var t: BigUInt = 60
+    var i: UInt64 = 2 // Does not overflow until digit #826_566_842
+    return AnyIterator {
+        let u: UInt64 = 3 * (3 * i + 1) * (3 * i + 2)
+        let y = (q.multiplied(byDigit: 27 * i - 12) + 5 * r) / (5 * t)
+        (q, r, t) = (
+            10 * q.multiplied(byDigit: i * (2 * i - 1)),
+            10 * (q.multiplied(byDigit: 5 * i - 2) + r - y * t).multiplied(byDigit: u),
+            t.multiplied(byDigit: u))
+        i += 1
+        return Int(y[0])
+    }
+}
+
+ +

Well, that was surprisingly easy. But does it work? Of course it does!

+
var digits = "π ≈ "
+var count = 0
+for digit in digitsOfPi() {
+    assert(digit < 10)
+    digits += String(digit)
+    count += 1
+    if count == 1 { digits += "." }
+    if count == 1000 { break }
+}
+
+digits
+==> π ≈ 3.14159265358979323846264338327950288419716939937510582097494459230781640628
+    62089986280348253421170679821480865132823066470938446095505822317253594081284811
+    17450284102701938521105559644622948954930381964428810975665933446128475648233786
+    78316527120190914564856692346034861045432664821339360726024914127372458700660631
+    55881748815209209628292540917153643678925903600113305305488204665213841469519415
+    11609433057270365759591953092186117381932611793105118548074462379962749567351885
+    75272489122793818301194912983367336244065664308602139494639522473719070217986094
+    37027705392171762931767523846748184676694051320005681271452635608277857713427577
+    89609173637178721468440901224953430146549585371050792279689258923542019956112129
+    02196086403441815981362977477130996051870721134999999837297804995105973173281609
+    63185950244594553469083026425223082533446850352619311881710100031378387528865875
+    33208381420617177669147303598253490428755468731159562863882353787593751957781857
+    780532171226806613001927876611195909216420198
+
+ +

Now go and have some fun with big integers on your own!

+ +
+
+ + +
+
+ + + + diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.js b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 00000000..1e55d6ef --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,70 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.search.js b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 00000000..e3d1ab90 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,70 @@ +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jquery.min.js b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 00000000..b0614034 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/search.json b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/search.json new file mode 100644 index 00000000..6f79c6be --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Structs/BigInt/Words.html#/s:Sl7IndicesQa":{"name":"Indices","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl5countSivp":{"name":"count","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sk7indices7IndicesQzvp":{"name":"indices","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"Words"},"Structs/BigInt/Sign.html#/s:6BigIntAAV4SignO4plusyA2DmF":{"name":"plus","abstract":"

Undocumented

","parent_name":"Sign"},"Structs/BigInt/Sign.html#/s:6BigIntAAV4SignO5minusyA2DmF":{"name":"minus","abstract":"

Undocumented

","parent_name":"Sign"},"Structs/BigInt/Sign.html":{"name":"Sign","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sj9MagnitudeQa":{"name":"Magnitude","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4Worda":{"name":"Word","abstract":"

The type representing a digit in BigInt‘s underlying number system.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz8isSignedSbvpZ":{"name":"isSigned","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV9magnitudeAA0A4UIntVvp":{"name":"magnitude","abstract":"

The absolute value of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4signAB4SignOvp":{"name":"sign","abstract":"

True iff the value of this integer is negative.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4sign9magnitudeA2B4SignO_AA0A4UIntVtcfc":{"name":"init(sign:magnitude:)","abstract":"

Initializes a new big integer with the provided absolute number and sign flag.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6isZeroSbvp":{"name":"isZero","abstract":"

Return true iff this integer is zero.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6signumAByF":{"name":"signum()","abstract":"

Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1poiyA2B_ABtFZ":{"name":"+(_:_:)","abstract":"

Add a to b and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2peoiyyABz_ABtFZ":{"name":"+=(_:_:)","abstract":"

Add b to a in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1topyA2BFZ":{"name":"~(_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1aoiyA2Bz_ABtFZ":{"name":"&(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1ooiyA2Bz_ABtFZ":{"name":"|(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1xoiyA2Bz_ABtFZ":{"name":"^(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2aeoiyyABz_ABtFZ":{"name":"&=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2oeoiyyABz_ABtFZ":{"name":"|=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2xeoiyyABz_ABtFZ":{"name":"^=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2eeoiySbAB_ABtFZ":{"name":"==(_:_:)","abstract":"

Return true iff a is equal to b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1loiySbAB_ABtFZ":{"name":"<(_:_:)","abstract":"

Return true iff a is less than b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyABSWcfc":{"name":"init(_:)","abstract":"

Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer,","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyAB10Foundation4DataVcfc":{"name":"init(_:)","abstract":"

Initializes an integer from the bits stored inside a piece of Data.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV9serialize10Foundation4DataVyF":{"name":"serialize()","abstract":"

Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative)

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20quotientAndRemainder10dividingByAB0C0_AB9remaindertAB_tF":{"name":"quotientAndRemainder(dividingBy:)","abstract":"

Divide this integer by y and return the resulting quotient and remainder.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1doiyA2B_ABtFZ":{"name":"/(_:_:)","abstract":"

Divide a by b and return the quotient. Traps if b is zero.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1roiyA2B_ABtFZ":{"name":"%(_:_:)","abstract":"

Divide a by b and return the remainder. The result has the same sign as a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7modulusyA2BF":{"name":"modulus(_:)","abstract":"

Return the result of a mod b. The result is always a nonnegative integer that is less than the absolute value of b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2deoiyyABz_ABtFZ":{"name":"/=(_:_:)","abstract":"

Divide a by b storing the quotient in a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2reoiyyABz_ABtFZ":{"name":"%=(_:_:)","abstract":"

Divide a by b storing the remainder in a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5poweryABSiF":{"name":"power(_:)","abstract":"

Returns this integer raised to the power exponent.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5power_7modulusA2B_ABtF":{"name":"power(_:modulus:)","abstract":"

Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz7exactlyxSgqd___tcSBRd__lufc":{"name":"init(exactly:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Szyxqd__cSBRd__lufc":{"name":"init(_:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21greatestCommonDivisor4withA2B_tF":{"name":"greatestCommonDivisor(with:)","abstract":"

Returns the greatest common divisor of a and b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7inverseyABSgABF":{"name":"inverse(_:)","abstract":"

Returns the multiplicative inverse of this integer in modulo modulus arithmetic,","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4hash4intoys6HasherVz_tF":{"name":"hash(into:)","abstract":"

Append this BigInt to the specified hasher.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVABycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyAbA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Initializes a new signed big integer with the same value as the specified unsigned big integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Szyxqd__cSzRd__lufc":{"name":"init(_:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sj7exactlyxSgqd___tcSzRd__lufc":{"name":"init(exactly:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz8clampingxqd___tcSzRd__lufc":{"name":"init(clamping:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz18truncatingIfNeededxqd___tcSzRd__lufc":{"name":"init(truncatingIfNeeded:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV14integerLiteralABs5Int64V_tcfc":{"name":"init(integerLiteral:)","abstract":"

Initialize a new big integer from an integer literal.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1moiyA2B_ABtFZ":{"name":"*(_:_:)","abstract":"

Multiply a with b and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2meoiyyABz_ABtFZ":{"name":"*=(_:_:)","abstract":"

Multiply a with b in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21isStrongProbablePrimeySbABF":{"name":"isStrongProbablePrime(_:)","abstract":"

Returns true iff this integer passes the strong probable prime test for the specified base.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7isPrime6roundsSbSi_tF":{"name":"isPrime(rounds:)","abstract":"

Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3alloiyA2B_ABtFZ":{"name":"&<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4alleoiyyABz_ABtFZ":{"name":"&<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3aggoiyA2B_ABtFZ":{"name":"&>>(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4aggeoiyyABz_ABtFZ":{"name":"&>>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2lloiyA2B_xtSzRzlFZ":{"name":"<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3lleoiyyABz_xtSzRzlFZ":{"name":"<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2ggoiyA2B_xtSzRzlFZ":{"name":">>(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3ggeoiyyABz_xtSzRzlFZ":{"name":">>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV10squareRootAByF":{"name":"squareRoot()","abstract":"

Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sx6StrideQa":{"name":"Stride","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8advanced2byA2B_tF":{"name":"advanced(by:)","abstract":"

Returns self + n.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8distance2toA2B_tF":{"name":"distance(to:)","abstract":"

Returns other - self.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV_5radixABSgx_SitcSyRzlufc":{"name":"init(_:radix:)","abstract":"

Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20unicodeScalarLiteralABs7UnicodeO0D0V_tcfc":{"name":"init(unicodeScalarLiteral:)","abstract":"

Initialize a new big integer from a Unicode scalar.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV30extendedGraphemeClusterLiteralABSS_tcfc":{"name":"init(extendedGraphemeClusterLiteral:)","abstract":"

Initialize a new big integer from an extended grapheme cluster.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV13stringLiteralABSS_tcfc":{"name":"init(stringLiteral:)","abstract":"

Initialize a new big integer from a decimal number represented by a string literal of arbitrary length.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV11descriptionSSvp":{"name":"description","abstract":"

Return the decimal representation of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21playgroundDescriptionypvp":{"name":"playgroundDescription","abstract":"

Return the playground quick look representation of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6negateyyF":{"name":"negate()","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1soiyA2B_ABtFZ":{"name":"-(_:_:)","abstract":"

Subtract b from a and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2seoiyyABz_ABtFZ":{"name":"-=(_:_:)","abstract":"

Subtract b from a in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8bitWidthSivp":{"name":"bitWidth","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20trailingZeroBitCountSivp":{"name":"trailingZeroBitCount","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt/Words.html":{"name":"Words","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5wordsAB5WordsVvp":{"name":"words","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5wordsABx_tcSTRzSu7ElementRtzlufc":{"name":"init(words:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigUInt/Words.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"Words"},"Structs/BigUInt/Words.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"Words"},"Structs/BigUInt/Words.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"Words"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV4Worda":{"name":"Word","abstract":"

The type representing a digit in BigUInt‘s underlying number system.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVACycfc":{"name":"init()","abstract":"

Initializes a new BigUInt with value 0.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5wordsACSaySuG_tcfc":{"name":"init(words:)","abstract":"

Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1poiyA2C_ACtFZ":{"name":"+(_:_:)","abstract":"

Add a and b together and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2peoiyyACz_ACtFZ":{"name":"+=(_:_:)","abstract":"

Add a and b together, and store the sum in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz8isSignedSbvpZ":{"name":"isSigned","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV6signumACyF":{"name":"signum()","abstract":"

Returns 1 if this value is, positive; otherwise, 0.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1topyA2CFZ":{"name":"~(_:)","abstract":"

Return the ones’ complement of a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2oeoiyyACz_ACtFZ":{"name":"|=(_:_:)","abstract":"

Calculate the bitwise OR of a and b, and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2aeoiyyACz_ACtFZ":{"name":"&=(_:_:)","abstract":"

Calculate the bitwise AND of a and b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2xeoiyyACz_ACtFZ":{"name":"^=(_:_:)","abstract":"

Calculate the bitwise XOR of a and b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7compareySo18NSComparisonResultVAC_ACtFZ":{"name":"compare(_:_:)","abstract":"

Compare a to b and return an NSComparisonResult indicating their order.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

Return true iff a is equal to b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1loiySbAC_ACtFZ":{"name":"<(_:_:)","abstract":"

Return true iff a is less than b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVyACSWcfc":{"name":"init(_:)","abstract":"

Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVyAC10Foundation4DataVcfc":{"name":"init(_:)","abstract":"

Initializes an integer from the bits stored inside a piece of Data.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV9serialize10Foundation4DataVyF":{"name":"serialize()","abstract":"

Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20quotientAndRemainder10dividingByAC0D0_AC9remaindertAC_tF":{"name":"quotientAndRemainder(dividingBy:)","abstract":"

Divide this integer by y and return the resulting quotient and remainder.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1doiyA2C_ACtFZ":{"name":"/(_:_:)","abstract":"

Divide x by y and return the quotient.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1roiyA2C_ACtFZ":{"name":"%(_:_:)","abstract":"

Divide x by y and return the remainder.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2deoiyyACz_ACtFZ":{"name":"/=(_:_:)","abstract":"

Divide x by y and store the quotient in x.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2reoiyyACz_ACtFZ":{"name":"%=(_:_:)","abstract":"

Divide x by y and store the remainder in x.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5poweryACSiF":{"name":"power(_:)","abstract":"

Returns this integer raised to the power exponent.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5power_7modulusA2C_ACtF":{"name":"power(_:modulus:)","abstract":"

Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz7exactlyxSgqd___tcSBRd__lufc":{"name":"init(exactly:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Szyxqd__cSBRd__lufc":{"name":"init(_:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21greatestCommonDivisor4withA2C_tF":{"name":"greatestCommonDivisor(with:)","abstract":"

Returns the greatest common divisor of self and b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7inverseyACSgACF":{"name":"inverse(_:)","abstract":"

Returns the multiplicative inverse of this integer in modulo modulus arithmetic,","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV4hash4intoys6HasherVz_tF":{"name":"hash(into:)","abstract":"

Append this BigUInt to the specified hasher.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sj7exactlyxSgqd___tcSzRd__lufc":{"name":"init(exactly:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Szyxqd__cSzRd__lufc":{"name":"init(_:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz18truncatingIfNeededxqd___tcSzRd__lufc":{"name":"init(truncatingIfNeeded:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz8clampingxqd___tcSzRd__lufc":{"name":"init(clamping:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV14integerLiteralACs6UInt64V_tcfc":{"name":"init(integerLiteral:)","abstract":"

Initialize a new big integer from an integer literal.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8multiply6byWordySu_tF":{"name":"multiply(byWord:)","abstract":"

Multiply this big integer by a single word, and store the result in place of the original big integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10multiplied6byWordACSu_tF":{"name":"multiplied(byWord:)","abstract":"

Multiply this big integer by a single Word, and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV14multiplyAndAdd__9shiftedByyAC_SuSitF":{"name":"multiplyAndAdd(_:_:shiftedBy:)","abstract":"

Multiply x by y, and add the result to this integer, optionally shifted shift words to the left.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10multiplied2byA2C_tF":{"name":"multiplied(by:)","abstract":"

Multiply this integer by y and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV25directMultiplicationLimitSivpZ":{"name":"directMultiplicationLimit","abstract":"

Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1moiyA2C_ACtFZ":{"name":"*(_:_:)","abstract":"

Multiply a by b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2meoiyyACz_ACtFZ":{"name":"*=(_:_:)","abstract":"

Multiply a by b and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21isStrongProbablePrimeySbACF":{"name":"isStrongProbablePrime(_:)","abstract":"

Returns true iff this integer passes the strong probable prime test for the specified base.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7isPrime6roundsSbSi_tF":{"name":"isPrime(rounds:)","abstract":"

Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger16withMaximumWidth5usingACSi_xztSGRzlFZ":{"name":"randomInteger(withMaximumWidth:using:)","abstract":"

Create a big unsigned integer consisting of width uniformly distributed random bits.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger16withMaximumWidthACSi_tFZ":{"name":"randomInteger(withMaximumWidth:)","abstract":"

Create a big unsigned integer consisting of width uniformly distributed random bits.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger14withExactWidth5usingACSi_xztSGRzlFZ":{"name":"randomInteger(withExactWidth:using:)","abstract":"

Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger14withExactWidthACSi_tFZ":{"name":"randomInteger(withExactWidth:)","abstract":"

Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger8lessThan5usingA2C_xztSGRzlFZ":{"name":"randomInteger(lessThan:using:)","abstract":"

Create a uniformly distributed random unsigned integer that’s less than the specified limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger8lessThanA2C_tFZ":{"name":"randomInteger(lessThan:)","abstract":"

Create a uniformly distributed random unsigned integer that’s less than the specified limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV3ggeoiyyACz_xtSzRzlFZ":{"name":">>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV3lleoiyyACz_xtSzRzlFZ":{"name":"<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2ggoiyA2C_xtSzRzlFZ":{"name":">>(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2lloiyA2C_xtSzRzlFZ":{"name":"<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10squareRootACyF":{"name":"squareRoot()","abstract":"

Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV6Stridea":{"name":"Stride","abstract":"

A type that can represent the distance between two values ofa BigUInt.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8advanced2byAc2AV_tF":{"name":"advanced(by:)","abstract":"

Adds n to self and returns the result. Traps if the result would be less than zero.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8distance2toA2AVAC_tF":{"name":"distance(to:)","abstract":"

Returns the (potentially negative) difference between self and other as a BigInt. Never traps.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV_5radixACSgx_SitcSyRzlufc":{"name":"init(_:radix:)","abstract":"

Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20unicodeScalarLiteralACs7UnicodeO0E0V_tcfc":{"name":"init(unicodeScalarLiteral:)","abstract":"

Initialize a new big integer from a Unicode scalar.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV30extendedGraphemeClusterLiteralACSS_tcfc":{"name":"init(extendedGraphemeClusterLiteral:)","abstract":"

Initialize a new big integer from an extended grapheme cluster.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13stringLiteralACSS_tcfc":{"name":"init(stringLiteral:)","abstract":"

Initialize a new big integer from a decimal number represented by a string literal of arbitrary length.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV11descriptionSSvp":{"name":"description","abstract":"

Return the decimal representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21playgroundDescriptionypvp":{"name":"playgroundDescription","abstract":"

Return the playground quick look representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV25subtractReportingOverflow_9shiftedBySbAC_SitF":{"name":"subtractReportingOverflow(_:shiftedBy:)","abstract":"

Subtract other from this integer in place, and return a flag indicating if the operation caused an","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV28subtractingReportingOverflow_9shiftedByAC12partialValue_Sb8overflowtAC_SitF":{"name":"subtractingReportingOverflow(_:shiftedBy:)","abstract":"

Subtract other from this integer, returning the difference and a flag indicating arithmetic overflow.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV28subtractingReportingOverflowyAC12partialValue_Sb8overflowtACF":{"name":"subtractingReportingOverflow(_:)","abstract":"

Subtracts other from self, returning the result and a flag indicating arithmetic overflow.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8subtract_9shiftedByyAC_SitF":{"name":"subtract(_:shiftedBy:)","abstract":"

Subtract other from this integer in place.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV11subtracting_9shiftedByA2C_SitF":{"name":"subtracting(_:shiftedBy:)","abstract":"

Subtract b from this integer, and return the difference.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV9decrement9shiftedByySi_tF":{"name":"decrement(shiftedBy:)","abstract":"

Decrement this integer by one.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1soiyA2C_ACtFZ":{"name":"-(_:_:)","abstract":"

Subtract b from a and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2seoiyyACz_ACtFZ":{"name":"-=(_:_:)","abstract":"

Subtract b from a and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5bitAtSbSi_tcip":{"name":"subscript(bitAt:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8bitWidthSivp":{"name":"bitWidth","abstract":"

The minimum number of bits required to represent this integer in binary.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV19leadingZeroBitCountSivp":{"name":"leadingZeroBitCount","abstract":"

The number of leading zero bits in the binary representation of this integer in base 2^(Word.bitWidth).","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20trailingZeroBitCountSivp":{"name":"trailingZeroBitCount","abstract":"

The number of trailing zero bits in the binary representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt/Words.html":{"name":"Words","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz5words5WordsQzvp":{"name":"words","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5wordsACx_tcSTRzSu7ElementRtzlufc":{"name":"init(words:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html":{"name":"BigUInt","abstract":"

An arbitary precision unsigned integer type, also known as a “big integer”.

"},"Structs/BigInt.html":{"name":"BigInt","abstract":"

An arbitary precision signed integer type, also known as a “big integer”.

"},"Extensions/String.html#/s:SS6BigIntEySSAA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Initialize a new string with the base-10 representation of an unsigned big integer.

","parent_name":"String"},"Extensions/String.html#/s:SS6BigIntE_5radix9uppercaseSSAA0A4UIntV_SiSbtcfc":{"name":"init(_:radix:uppercase:)","abstract":"

Initialize a new string representing an unsigned big integer in the given radix (base).

","parent_name":"String"},"Extensions/String.html#/s:SS6BigIntE_5radix9uppercaseSSA2AV_SiSbtcfc":{"name":"init(_:radix:uppercase:)","abstract":"

Initialize a new string representing a signed big integer in the given radix (base).

","parent_name":"String"},"Extensions/BinaryFloatingPoint.html#/s:SB6BigInts17FixedWidthInteger11RawExponentRpzsAB0F11SignificandRpzrlEyxA2AVcfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"BinaryFloatingPoint"},"Extensions/BinaryFloatingPoint.html#/s:SB6BigInts17FixedWidthInteger11RawExponentRpzsAB0F11SignificandRpzrlEyxAA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"BinaryFloatingPoint"},"Extensions/BinaryFloatingPoint.html":{"name":"BinaryFloatingPoint"},"Extensions/String.html":{"name":"String"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/docSet.dsidx b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..8378812bb71a646569450ea1d3aa972fb4cf57fa GIT binary patch literal 45056 zcmeHQd2k!odEW)Fi;EyE+X{`)uqextD9Mrt@TMh700>Z|BvK?q(xNOuAh04=#3f)M z5~L+%lemdpr)e%HO`6kn;#_qyX);sK^q4l2rpYu-n`tx2Or~kl^be4$;}@tSfxmXZZw<~Pl=CV0tM$|3K#Kz{4zxJX;y{Z7Ee^Ce z(BeRg11%1;IMCw2Z#)MU4dxEl9$IAhRGeFnreZ7UY>ta&V=EKr3u9n5=sO?mnwy%K znG1GJOpOH}?UJ7Anx5)XJ=xWriYB>-yM#gp{?0^&l>-88?$`s^M}_E8f>S-K`e=|l zIPdeH399kB`8afUJ~$qn?K(F*an?6`q3d+;!oyvto38W0N6$-r$sbXN_~QWvcy4t5 z6mj0>{H601>EmzwM6?KOaiGP476)1!XmOy$ffff^9B6T%#eo(FS{!I`pv3`w4p_x| z-~lraf3X7w=L}_R|2x#e?tIR9LHdaP+xls7pv8d}2U;9xaiGP476)1!XmOy$ffff^ z9B6T%W)8sZG6fIAKg%_@Y3f1CZFa&X_8PL$R6L!WND16Bm+c0BdhYy6G&PdX@u}sJ z17|s5B^?h7*?dgM9rg3ebMWMm6(O0}b2K+H0AIlWdwhN9>v>Oa3D}SV){nt_-aur1 zLkN%0ZX`mB)LVgii#!5moY~__(tL^+y02!_NkYHsZo^z3dTKp4IL5`&aV{IlM1<3^ ztFcbNGtIO6U82ztjo*NP0xsUYR3O0V4P!`Y>Rl@MVqV{TL#%>#{ucYF?SE~bvGKND*6&!KwoX_n%Zrwj z<)Hcd=J%RI>@V1lvsc)AnXfY&%n{RfOepilG=7>DK>eV7IQlD?WWMaL3nAWk=jN7$IUq0R) z8Hv=nOuXw{nlBW5fsKeSAcPj9LBL9DW07f6Q2c=62b9+bm`>OVmo*3?gLu|~5}#MW z=y;gvaQO@i>1;eF@lNKTvVo7{UrGG@ql57937Y&cbf2(0c%*VMX_4Zysn4zWrmLsUU4zJ5?W}<<8 z%+8(1=`g>X3a0W&75flJ(ASuG)?sE>#{zvex(p{*zLLHY^lQV#=Vqd|5vH>vVufHR zKE~w;RH@jGPTFu{P=0nM+6^nDANDvtizU)j1Qt&=>J$4Im#Y^&2y|3Dr_e?{A7*#C zM8+^W+Q=^GU0yD3gLNUiAsy~doo05q3bZz)(z{BEzy>XX!AdTI`OdL!mq-JB8hfHR zVilMolDx~ycx!;@DH8YeDcGoaAWj31Oq+t_-$FVmogT*<;hUF3Yzr^>0@CThNvDS< zmIhG@ieEZC-11x=JJtwIy@>>2E`L{=OKnIpX+<#gT%M5U^4KvA-s{d~B2h7yZ&Z%)=XZNPH-(GGDQl8JdY1ZE9+<@v*?W%ClSk~q_na$ zvB(4|D2hzkcMABkMjvfp-aK)6+Auk*egIn41R_%-L&)6Oa|TIm!{LUwlPl#8^`AKGL%l)bj}{V{9FK${^Jid!*$oQzzIugsUsO>AlwlnYffkTPNE!nplhX@8 zcu+Dy$E4-Fub~NxmQL6eX}&bE$P{^H6lGxd$tIr*Q)2VphS;1fWphemvnG}Xn`IP*Is2tkW3R@j^mGMJR=q6}(yq_~ zB2yzn$cykH8(dotQ?D55AoYs#8SwwV-2Qy~oa0B1_c>0s{jBYiZLzld?JwAm*?w$$ zmu=E^m-U<0faP7Mgyq|EFw&13 z!~fkZwha9LEVAsbC7Bd(F)-X488UmzTg2w-TU-u*bDVYg(m z(r-kdfjr8pz5C_fPn}~9fUb%s8Io&aLZYgPE4(o%Ke--Wz8;T6U>ITlEPP1hug0!7 z0C&Mfj&wGwJq|g^jM3b2sjGf_)A?49^g@eTb7p4I) zFAZ3Es>;Oc;`MI#MjkGn0^zXFr(BOCVLrTs7xbsDp_60h_MIFh9U>!Yv8zu%#vX8q zj?%8`voy=66YR(3bpVF7TmZuZtYqq)a|oQ4W?e(8D4-hYxz8~qu3h;@$`h!`BWTC z%IQ?!SX7A41L(>q5Ej+ORP&j@7f(aYi)=Xr@Em z5J{gE?PvwAy|yI5QG|&3%n2}#E=%)PWj~kgCtsid0FMqs`-@ub$qUctM=g(nR_o3| zOKkcj>pE=^HnjmmW4yLk!^r41*s9_;Da0)(i z+4&7{isa9MH}1ABEO~rdfJd@y&?WAom$O_{;BrDBolK@vWBd(1m(F&t@xn@-lzTly zs6GUR+>Amfmq1cP~4!kmWL%L5AXjCNOF6ye~2^sE=HgTWwfCwWvuu}Q$n>0+sQrU!NZ0&>eT zhB%)SkYBb2%F34OkkS+g^}#L%%Q^UE-yyjJmEVzJ)kMmu$Q`IO!hmQZgK74JTkNFc zd=~txXY&bx&m`bPLn7}CpX7!4XqHDw=QZ9Zy#1O;=t{JBdzRVbzG;YaxmcFZpk6fA z4)!(?Zde|Vs%D{I=6JvazaoX@}!*p`S9cTM@C;Qps=R?s^)eJ(!Eh(raRZz3G8Eilt6Z{6DAm1k9``U5sLB|xnyyOF zlmk7ed9tSFTSr`(sylR)p+IZFAeBmwdMsNIlF~ALgrPtw&{H+Y&9!ub@xurZB2#W~ zP#6R@ZmslyCWM<5d~i$i`9rG@vlJ5bM2$d8xggV8UD6*v)W{?j?<-RW>t0j3cAN81 zmE@@FW+uG`p<9uWWICP)^HG?t{)>2?ny~*e-+?sUHnr?)?v- z8A~?h${%y%Mciay$He_;5$E)@di4bBY2u+y1SLt5W`ZrpUXKT+89S$@XG@%v$GeTW zFv{avUMCHdwB&D6JVj&oVU#A_dj1YP-A%>b`Co@I9@kJs$;0uaOFVJ@ofxAjZ{8#K zGE|2vcB_u_&LgBV_^ewTy9cwgNvFT>ZZwS5W_%w@J_5ByYUHva7U6#v|r6~why%%F17=4(ietr zrXySSF{CH^+8Ju6JBc2ynNkexlksk3&N@JJyEltn)r_N}u4o&*kvY}|>~~+}bBJ6n zPPqN5*E2XYlqV7A7W?fmo{ozs`jZggNMO4Z@i}CJF?1{xgC+IahD(Af_gbODoyQTe zdQqDb7T6k{H{k@#=Yk1*u~psYVMJR2o~kQ1EDLGY`f)?pC}YXcxEXrv+{}R1)c{f- zY9|4mWf^L}Yb}>wl1u?w+qU8^To{x)p4osq7g(QWHe!5cj6oB(su-Ba%b)_Q+#oe! zVyNBj>tL|S3R;#e#ICJqVr)B3czU*)$hNI-+0~H++ z7)$+8x9I-gOTCkFzUZ8D((Ny{XW9=q{>AZ(W70vleX(t|ZP5Ob{e$*#+dtaotiQCr zV4bqITfT02!gA95uW;|rnD1r3%8IOqd71eW<_gnc`nu_9Q_y5Ee#v;v_<-S`3{M(% z(chwX^#(0B$`l(`s!oMac!h4M`+2n%lE+KD%%SX!AklTpk{O=YkIrEDE4Dxs1{F?j`JX)1HN zSY`2ElM#%isb1=0$x5a|m+vxCsnTSXN)Jd@tOB9M;3Y)PbtK}6`ivfmqSXWnq2rGM zjQf%zZ3%L@1gKmvPhP}K(NynB8kbL2S$ydDBHE2>T1uWClpK~RZ^qdREVUOr_joO? zq0|+Eex(Q3j~jurJ6Z_m$Fb#c^igE*TE>u-w^KbZ$;tP~0@7fXNg9k^V@Z#hnnxnN zpfA!9OojX;%kYh2<=YD;d*uf|2pO9%B1K=0;|6 z5+s}Z`nLGN9-UyQe%U0I!?}-jdq{dq+JTK!iX+@S#ZoAa5O1JYJB%IqUsHvCnl7Qk7AVkCZB%^yhLY3dc zF$iUJLr_{{_PRFuqf$kNQxNr&21UGC*X-d0iYaz!m6)hcBiAY}A;o(wQcnT{>v(Bm zm_?V3ZM|(=xQH-!=wp)CZ&htLyvc&7_DG?VBw1j;)?WI8u%mdoNf-3q zNe0Z;^mf>-EmI7*3Fz(e6F5#X;ADYwr%^Ad<(4wpyc7G&r#J);cQNvtI!&KmdR*9>?CsVq{&l%~593 z@$||4$Y7C(Do79F-@Q@X~VKG!+suh(J4uc z(kBUB=$#)G9R+d&=y@feaU;t1gV2zKammHL-j2%50>$*g_grAW;2;g9S_c};DuY%m z4inc9m)tTm*rD&7Kij#4^dYyzrnM$4x|%jZ>frQLr50Qht%#sN z0|b%TSOX~odsze~=O=XWF^1{d?{2Xb(Dm<@m5;%F*8TfwnXDm+jBm zW42$}K5g?^e`I}=)n@s;#b^Gx`BUam_6O`V^G(KQ`id!J{EqPnqsQ=l!`ls`^sngW z=(FJM7qsMgLA(c>Xg&3qX!Umk>Hg*;UHcZryRoI#f&13B)arGoCQoRB662A z`W9O~?9%KVIUVS{co)Vs>Kku$ah0a3>W?QxC$i$M!i9lg#nnSos?be|5ZtxbwYg=U zCD?TJfJ!X8-~yf!9XLLN*0k#Bp(zGXRavwtu}uQhH1O&IR@PaYfpkwWgo=!|1yc{P zXzm5~d$D%gjA)ZEwJqAZm`a5jH6}XeDP*TADPFo&3AOTE)a#;(nd+u!VJW!4l~zjK z>g-OJU0oN=xc>vCgGGsxK~zZs=lRyH#g>41a2nn zdU`tw&z4gl*PlgnY!#q=Tx3}4EYuOHq~>gNoloYI+rf(g#91|7ksD6Y#8MYrA`~uB z7vL>_ep~oaK?RW`7oe~TSolSARW(s>1CW(PUNm4!|IXU2E_$8l*!u&aNfE;QAg)W( z;IE5ZR^e-0q;PmRwg$4sc1`1`a@Wsb)%OwJ@GCvrV<+(uG?rB*cl#mJx|u zD_3^}Dq~I21hsY(A0hh{L(8jXg1YiJOCcLn$%q;-5vdJpr6#DwO%@WWM6)uq?KDBH zY~V=pPOMMy)l49|v(i`E9Q3ym`^0nsr9w)ni#n;0C0*!Nqv6)^=9N^znylny*tMl_ zj;^778QBRPEorPmd3d%4uPar!sK9E9%w4=@KP=cd!u{+0I2j(>3MX?t7SUdZ^Lv72o#+Blob`bF!s z^+C%IEpM`mq+=2_+jGX;%XKP?WlIMCw2Z!-rT6g?2R*0~pqW!kUt z*egOk3wWi;R&6u#8%++1sAR>iVPtu$`pS_p@d!h~`%nCpmCcI%6hCOc{zP<&hmk4l zjmA<YSxNOi3f34yYEa_#Z=c~ zamsNKN@_rqt0tSJg;w!0 zw{Vj3C93sZreSL*T|`Bwmw`OQ1m|v@op`hy#1rCfSTgRsPG*Om+FMfFcvgh!7f01e zLxAcNs@-DC_|cCWNg=k73_K~~A{d*RStEMnDK9!ulHkTgToYqWD|ti@OMXj%Y!6!! z-Pj=FEY=3Q1LegM;{Dik(Fti-u+reAS*c|RmTEXu%A>+jg-M~py z=c?pK=|Y#qEGgkoA}!vF^P~=AvCO?DCEro~{|8JzqnuB)ztXvB^r>l%7aGB<)LZ@^j2G-A literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.tgz b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cb79a7c0a27789b85367159429416846aa6c9a51 GIT binary patch literal 111706 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 PjGuo1ym4|=06Yr-bn?7u literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/docsets/BigInt.xml b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.xml new file mode 100644 index 00000000..21509e21 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/docsets/BigInt.xml @@ -0,0 +1 @@ +v5.2.1https://attaswift.github.io/BigInt/reference/docsets/BigInt.tgz diff --git a/Carthage/Checkouts/BigInt/docs/img/carat.png b/Carthage/Checkouts/BigInt/docs/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/img/dash.png b/Carthage/Checkouts/BigInt/docs/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/docs/index.html b/Carthage/Checkouts/BigInt/docs/index.html new file mode 100644 index 00000000..cb588bb2 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/index.html @@ -0,0 +1,493 @@ + + + + BigInt Reference + + + + + + + + + + + + + + + +
+

+ + BigInt v5.2.1 Docs + + (85% documented) +

+ +

+

+ +
+

+ +

+ + + View on GitHub + +

+ +

+ + + Install in Dash + +

+
+ + + +
+ +
+ +
+
+ +

BigInt

+ + + +

Swift 5 +License +Platform

+ +

Build Status +Code Coverage +jazzy +Carthage compatible +Version

+

Overview

+ +

This repository provides integer types of arbitrary width implemented +in 100% pure Swift. The underlying representation is in base 2^64, using Array<UInt64>.

+ +

This module is handy when you need an integer type that’s wider than UIntMax, but +you don’t want to add The GNU Multiple Precision Arithmetic Library +as a dependency.

+ +

Two big integer types are included: BigUInt and BigInt, +the latter being the signed variant. +Both of these are Swift structs with copy-on-write value semantics, and they can be used much +like any other integer type.

+ +

The library provides implementations for some of the most frequently useful functions on +big integers, including

+ + + +

The implementations are intended to be reasonably efficient, but they are unlikely to be +competitive with GMP at all, even when I happened to implement an algorithm with same asymptotic +behavior as GMP. (I haven’t performed a comparison benchmark, though.)

+ +

The library has 100% unit test coverage. Sadly this does not imply that there are no bugs +in it.

+

API Documentation

+ +

Generated API docs are available at https://attaswift.github.io/BigInt/.

+

License

+ +

BigInt can be used, distributed and modified under the MIT license.

+

Requirements and Integration

+ +

BigInt 4.0.0 requires Swift 4.2 (The last version with support for Swift 3.x was BigInt 2.1.0. +The last version with support for Swift 2 was BigInt 1.3.0.)

+ + + + + + + + + + + + + + + + + + + + + + + +
Swift Versionlast BigInt Version
3.x2.1.0
4.03.1.0
4.24.0.0
5.x5.2.1
+ +

BigInt deploys to macOS 10.10, iOS 9, watchOS 2 and tvOS 9. +It has been tested on the latest OS releases only—however, as the module uses very few platform-provided APIs, +there should be very few issues with earlier versions.

+ +

BigInt uses no APIs specific to Apple platforms, so +it should be easy to port it to other operating systems.

+ +

Setup instructions:

+ +
    +
  • Swift Package Manager: +Although the Package Manager is still in its infancy, BigInt provides experimental support for it. +Add this to the dependency section of your Package.swift manifest:

    +
    .package(url: "https://github.com/attaswift/BigInt.git", from: "5.2.1")
    +
  • +
  • CocoaPods: Put this in your Podfile:

    +
    pod 'BigInt', '~> 5.2'
    +
  • +
  • Carthage: Put this in your Cartfile:

    +
    github "attaswift/BigInt" ~> 5.2
    +
  • +
+

Implementation notes

+ +

BigUInt is a MutableCollectionType of its 64-bit digits, with the least significant +digit at index 0. As a convenience, BigUInt allows you to subscript it with indexes at +or above its count. The subscript operator returns 0 for out-of-bound gets and +automatically extends the array on out-of-bound sets. This makes memory management simpler.

+ +

BigInt is just a tiny wrapper around a BigUInt absolute value and a +sign bit, both of which are accessible as public read-write properties.

+

Why is there no generic BigInt<Digit> type?

+ +

The types provided by BigInt are not parametric—this is very much intentional, as +Swift generics cost us dearly at runtime in this use case. In every approach I tried, +making arbitrary-precision arithmetic operations work with a generic Digit type parameter +resulted in code that was literally ten times slower. If you can make the algorithms generic +without such a huge performance hit, please enlighten me!

+ +

This is an area that I plan to investigate more, as it would be useful to have generic +implementations for arbitrary-width arithmetic operations. (Polynomial division and decimal bases +are two examples.) The library already implements double-digit multiplication and division as +extension methods on a protocol with an associated type requirement; this has not measurably affected +performance. Unfortunately, the same is not true for BigUInt‘s methods.

+ +

Of course, as a last resort, we could just duplicate the code to create a separate +generic variant that was slower but more flexible.

+

Calculation Samples

+

Obligatory Factorial Demo

+ +

It is easy to use BigInt to calculate the factorial function for any integer:

+
import BigInt
+
+func factorial(_ n: Int) -> BigInt {
+    return (1 ... n).map { BigInt($0) }.reduce(BigInt(1), *)
+}
+
+print(factorial(10))
+==> 362880
+
+print(factorial(100))
+==> 93326215443944152681699238856266700490715968264381621468592963895217599993229915
+    6089414639761565182862536979208272237582511852109168640000000000000000000000
+
+print(factorial(1000))
+==> 40238726007709377354370243392300398571937486421071463254379991042993851239862902
+    05920442084869694048004799886101971960586316668729948085589013238296699445909974
+    24504087073759918823627727188732519779505950995276120874975462497043601418278094
+    64649629105639388743788648733711918104582578364784997701247663288983595573543251
+    31853239584630755574091142624174743493475534286465766116677973966688202912073791
+    43853719588249808126867838374559731746136085379534524221586593201928090878297308
+    43139284440328123155861103697680135730421616874760967587134831202547858932076716
+    91324484262361314125087802080002616831510273418279777047846358681701643650241536
+    91398281264810213092761244896359928705114964975419909342221566832572080821333186
+    11681155361583654698404670897560290095053761647584772842188967964624494516076535
+    34081989013854424879849599533191017233555566021394503997362807501378376153071277
+    61926849034352625200015888535147331611702103968175921510907788019393178114194545
+    25722386554146106289218796022383897147608850627686296714667469756291123408243920
+    81601537808898939645182632436716167621791689097799119037540312746222899880051954
+    44414282012187361745992642956581746628302955570299024324153181617210465832036786
+    90611726015878352075151628422554026517048330422614397428693306169089796848259012
+    54583271682264580665267699586526822728070757813918581788896522081643483448259932
+    66043367660176999612831860788386150279465955131156552036093988180612138558600301
+    43569452722420634463179746059468257310379008402443243846565724501440282188525247
+    09351906209290231364932734975655139587205596542287497740114133469627154228458623
+    77387538230483865688976461927383814900140767310446640259899490222221765904339901
+    88601856652648506179970235619389701786004081188972991831102117122984590164192106
+    88843871218556461249607987229085192968193723886426148396573822911231250241866493
+    53143970137428531926649875337218940694281434118520158014123344828015051399694290
+    15348307764456909907315243327828826986460278986432113908350621709500259738986355
+    42771967428222487575867657523442202075736305694988250879689281627538488633969099
+    59826280956121450994871701244516461260379029309120889086942028510640182154399457
+    15680594187274899809425474217358240106367740459574178516082923013535808184009699
+    63725242305608559037006242712434169090041536901059339838357779394109700277534720
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000000000000000000000000000000000000000000000000000000000000000000000000000000
+    00000
+
+ +

Well, I guess that’s all right, but it’s not very interesting. Let’s try something more useful.

+

RSA Cryptography

+ +

The BigInt module provides all necessary parts to implement an (overly) +simple RSA cryptography system.

+ +

Let’s start with a simple function that generates a random n-bit prime. The module +includes a function to generate random integers of a specific size, and also an +isPrime method that performs the Miller–Rabin primality test. These are all we need:

+
func generatePrime(_ width: Int) -> BigUInt {
+    while true {
+        var random = BigUInt.randomInteger(withExactWidth: width)
+        random |= BigUInt(1)
+        if random.isPrime() {
+            return random
+        }
+    }
+}
+
+let p = generatePrime(1024)
+==> 13308187650642192396256419911012544845370493728424936791561478318443071617242872
+    81980956747087187419914435169914161116601678883358611076800743580556055714173922
+    08406194264346635072293912609713085260354070700055888678514690878149253177960273
+    775659537560220378850112471985434373425534121373466492101182463962031
+
+let q = generatePrime(1024)
+==> 17072954422657145489547308812333368925007949054501204983863958355897172093173783
+    10108226596943999553784252564650624766276133157586733504784616138305701168410157
+    80784336308507083874651158029602582993233111593356512531869546706885170044355115
+    669728424124141763799008880327106952436883614887277350838425336156327
+
+ +

Cool! Now that we have two large primes, we can produce an RSA public/private keypair +out of them.

+
typealias Key = (modulus: BigUInt, exponent: BigUInt)
+
+let n = p * q
+==> 22721008120758282530010953362926306641542233757318103044313144976976529789946696
+    15454966720907712515917481418981591379647635391260569349099666410127279690367978
+    81184375533755888994370640857883754985364288413796100527262763202679037134021810
+    57933883525572232242690805678883227791774442041516929419640051653934584376704034
+    63953169772816907280591934423237977258358097846511079947337857778137177570668391
+    57455417707100275487770399281417352829897118140972240757708561027087217205975220
+    02207275447810167397968435583004676293892340103729490987263776871467057582629588
+    916498579594964478080508868267360515953225283461208420137
+
+let e: BigUInt = 65537
+let phi = (p - 1) * (q - 1)
+let d = e.inverse(phi)!     // d * e % phi == 1
+==> 13964664343869014759736350480776837992604500903989703383202366291905558996277719
+    77822086142456362972689566985925179681282432115598451765899180050962461295573831
+    37069237934291884106584820998146965085531433195106686745474222222620986858696591
+    69836532468835154412554521152103642453158895363417640676611704542784576974374954
+    45789456921660619938185093118762690200980720312508614337759620606992462563490422
+    76669559556568917533268479190948959560397579572761529852891246283539604545691244
+    89999692877158676643042118662613875863504016129837099223040687512684532694527109
+    80742873307409704484365002175294665608486688146261327793
+
+let publicKey: Key = (n, e)
+let privateKey: Key = (n, d)
+
+ +

In RSA, modular exponentiation is used to encrypt (and decrypt) messages.

+
func encrypt(_ message: BigUInt, key: Key) -> BigUInt {
+    return message.power(key.exponent, modulus: key.modulus)
+}
+
+ +

Let’s try out our new keypair by converting a string into UTF-8, interpreting +the resulting binary representation as a big integer, and encrypting it with the +public key. BigUInt has an initializer that takes an NSData, so this is pretty +easy to do:

+
let secret: BigUInt = BigUInt("Arbitrary precision arithmetic is fun!".dataUsingEncoding(NSUTF8StringEncoding)!)
+==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457
+    68818568737
+
+let cyphertext = encrypt(secret, key: publicKey)
+==> 95186982543485985200666516508066093880038842892337880561554910904277290917831453
+    54854954722744805432145474047391353716305176389470779020645959135298322520888633
+    61674945129099575943384767330342554525120384485469428048962027149169876127890306
+    77028183904699491962050888974524603226290836984166164759586952419343589385279641
+    47999991283152843977988979846238236160274201261075188190509539751990119132013021
+    74866638595734222867005089157198503204192264814750832072844208520394603054901706
+    06024394731371973402595826456435944968439153664617188570808940022471990638468783
+    49208193955207336172861151720299024935127021719852700882
+
+ +

Well, it looks encrypted all right, but can we get the original message back? +In theory, encrypting the cyphertext with the private key returns the original message. +Let’s see:

+
let plaintext = encrypt(cyphertext, key: privateKey)
+==> 83323446846105976078466731524728681905293067701804838925389198929123912971229457
+    68818568737
+
+let received = String(data: plaintext.serialize(), encoding: NSUTF8StringEncoding)
+==> "Arbitrary precision arithmetic is fun!"
+
+ +

Yay! This is truly terrific, but please don’t use this example code in an actual +cryptography system. RSA has lots of subtle (and some not so subtle) complications +that we ignored to keep this example short.

+

Calculating the Digits of π

+ +

Another fun activity to try with BigInts is to generate the digits of π. +Let’s try implementing Jeremy Gibbon’s spigot algorithm. +This is a rather slow algorithm as π-generators go, but it makes up for it with its grooviness +factor: it’s remarkably short, it only uses (big) integer arithmetic, and every iteration +produces a single new digit in the base-10 representation of π. This naturally leads to an +implementation as an infinite GeneratorType:

+
func digitsOfPi() -> AnyGenerator<Int> {
+    var q: BigUInt = 1
+    var r: BigUInt = 180
+    var t: BigUInt = 60
+    var i: UInt64 = 2 // Does not overflow until digit #826_566_842
+    return AnyIterator {
+        let u: UInt64 = 3 * (3 * i + 1) * (3 * i + 2)
+        let y = (q.multiplied(byDigit: 27 * i - 12) + 5 * r) / (5 * t)
+        (q, r, t) = (
+            10 * q.multiplied(byDigit: i * (2 * i - 1)),
+            10 * (q.multiplied(byDigit: 5 * i - 2) + r - y * t).multiplied(byDigit: u),
+            t.multiplied(byDigit: u))
+        i += 1
+        return Int(y[0])
+    }
+}
+
+ +

Well, that was surprisingly easy. But does it work? Of course it does!

+
var digits = "π ≈ "
+var count = 0
+for digit in digitsOfPi() {
+    assert(digit < 10)
+    digits += String(digit)
+    count += 1
+    if count == 1 { digits += "." }
+    if count == 1000 { break }
+}
+
+digits
+==> π ≈ 3.14159265358979323846264338327950288419716939937510582097494459230781640628
+    62089986280348253421170679821480865132823066470938446095505822317253594081284811
+    17450284102701938521105559644622948954930381964428810975665933446128475648233786
+    78316527120190914564856692346034861045432664821339360726024914127372458700660631
+    55881748815209209628292540917153643678925903600113305305488204665213841469519415
+    11609433057270365759591953092186117381932611793105118548074462379962749567351885
+    75272489122793818301194912983367336244065664308602139494639522473719070217986094
+    37027705392171762931767523846748184676694051320005681271452635608277857713427577
+    89609173637178721468440901224953430146549585371050792279689258923542019956112129
+    02196086403441815981362977477130996051870721134999999837297804995105973173281609
+    63185950244594553469083026425223082533446850352619311881710100031378387528865875
+    33208381420617177669147303598253490428755468731159562863882353787593751957781857
+    780532171226806613001927876611195909216420198
+
+ +

Now go and have some fun with big integers on your own!

+ +
+
+ + +
+
+ + +
+ diff --git a/Carthage/Checkouts/BigInt/docs/js/jazzy.js b/Carthage/Checkouts/BigInt/docs/js/jazzy.js new file mode 100755 index 00000000..1e55d6ef --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/js/jazzy.js @@ -0,0 +1,70 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/Carthage/Checkouts/BigInt/docs/js/jazzy.search.js b/Carthage/Checkouts/BigInt/docs/js/jazzy.search.js new file mode 100644 index 00000000..e3d1ab90 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/js/jazzy.search.js @@ -0,0 +1,70 @@ +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/Carthage/Checkouts/BigInt/docs/js/jquery.min.js b/Carthage/Checkouts/BigInt/docs/js/jquery.min.js new file mode 100644 index 00000000..b0614034 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/Carthage/Checkouts/BigInt/docs/js/typeahead.jquery.js b/Carthage/Checkouts/BigInt/docs/js/typeahead.jquery.js new file mode 100644 index 00000000..3a2d2ab0 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/docs/search.json b/Carthage/Checkouts/BigInt/docs/search.json new file mode 100644 index 00000000..6f79c6be --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/search.json @@ -0,0 +1 @@ +{"Structs/BigInt/Words.html#/s:Sl7IndicesQa":{"name":"Indices","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl5countSivp":{"name":"count","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sk7indices7IndicesQzvp":{"name":"indices","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"Words"},"Structs/BigInt/Words.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"Words"},"Structs/BigInt/Sign.html#/s:6BigIntAAV4SignO4plusyA2DmF":{"name":"plus","abstract":"

Undocumented

","parent_name":"Sign"},"Structs/BigInt/Sign.html#/s:6BigIntAAV4SignO5minusyA2DmF":{"name":"minus","abstract":"

Undocumented

","parent_name":"Sign"},"Structs/BigInt/Sign.html":{"name":"Sign","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sj9MagnitudeQa":{"name":"Magnitude","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4Worda":{"name":"Word","abstract":"

The type representing a digit in BigInt‘s underlying number system.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz8isSignedSbvpZ":{"name":"isSigned","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV9magnitudeAA0A4UIntVvp":{"name":"magnitude","abstract":"

The absolute value of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4signAB4SignOvp":{"name":"sign","abstract":"

True iff the value of this integer is negative.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4sign9magnitudeA2B4SignO_AA0A4UIntVtcfc":{"name":"init(sign:magnitude:)","abstract":"

Initializes a new big integer with the provided absolute number and sign flag.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6isZeroSbvp":{"name":"isZero","abstract":"

Return true iff this integer is zero.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6signumAByF":{"name":"signum()","abstract":"

Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1poiyA2B_ABtFZ":{"name":"+(_:_:)","abstract":"

Add a to b and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2peoiyyABz_ABtFZ":{"name":"+=(_:_:)","abstract":"

Add b to a in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1topyA2BFZ":{"name":"~(_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1aoiyA2Bz_ABtFZ":{"name":"&(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1ooiyA2Bz_ABtFZ":{"name":"|(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1xoiyA2Bz_ABtFZ":{"name":"^(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2aeoiyyABz_ABtFZ":{"name":"&=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2oeoiyyABz_ABtFZ":{"name":"|=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2xeoiyyABz_ABtFZ":{"name":"^=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2eeoiySbAB_ABtFZ":{"name":"==(_:_:)","abstract":"

Return true iff a is equal to b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1loiySbAB_ABtFZ":{"name":"<(_:_:)","abstract":"

Return true iff a is less than b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyABSWcfc":{"name":"init(_:)","abstract":"

Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer,","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyAB10Foundation4DataVcfc":{"name":"init(_:)","abstract":"

Initializes an integer from the bits stored inside a piece of Data.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV9serialize10Foundation4DataVyF":{"name":"serialize()","abstract":"

Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative)

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20quotientAndRemainder10dividingByAB0C0_AB9remaindertAB_tF":{"name":"quotientAndRemainder(dividingBy:)","abstract":"

Divide this integer by y and return the resulting quotient and remainder.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1doiyA2B_ABtFZ":{"name":"/(_:_:)","abstract":"

Divide a by b and return the quotient. Traps if b is zero.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1roiyA2B_ABtFZ":{"name":"%(_:_:)","abstract":"

Divide a by b and return the remainder. The result has the same sign as a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7modulusyA2BF":{"name":"modulus(_:)","abstract":"

Return the result of a mod b. The result is always a nonnegative integer that is less than the absolute value of b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2deoiyyABz_ABtFZ":{"name":"/=(_:_:)","abstract":"

Divide a by b storing the quotient in a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2reoiyyABz_ABtFZ":{"name":"%=(_:_:)","abstract":"

Divide a by b storing the remainder in a.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5poweryABSiF":{"name":"power(_:)","abstract":"

Returns this integer raised to the power exponent.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5power_7modulusA2B_ABtF":{"name":"power(_:modulus:)","abstract":"

Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz7exactlyxSgqd___tcSBRd__lufc":{"name":"init(exactly:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Szyxqd__cSBRd__lufc":{"name":"init(_:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21greatestCommonDivisor4withA2B_tF":{"name":"greatestCommonDivisor(with:)","abstract":"

Returns the greatest common divisor of a and b.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7inverseyABSgABF":{"name":"inverse(_:)","abstract":"

Returns the multiplicative inverse of this integer in modulo modulus arithmetic,","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4hash4intoys6HasherVz_tF":{"name":"hash(into:)","abstract":"

Append this BigInt to the specified hasher.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVABycfc":{"name":"init()","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAVyAbA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Initializes a new signed big integer with the same value as the specified unsigned big integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Szyxqd__cSzRd__lufc":{"name":"init(_:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sj7exactlyxSgqd___tcSzRd__lufc":{"name":"init(exactly:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz8clampingxqd___tcSzRd__lufc":{"name":"init(clamping:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sz18truncatingIfNeededxqd___tcSzRd__lufc":{"name":"init(truncatingIfNeeded:)","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV14integerLiteralABs5Int64V_tcfc":{"name":"init(integerLiteral:)","abstract":"

Initialize a new big integer from an integer literal.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1moiyA2B_ABtFZ":{"name":"*(_:_:)","abstract":"

Multiply a with b and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2meoiyyABz_ABtFZ":{"name":"*=(_:_:)","abstract":"

Multiply a with b in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21isStrongProbablePrimeySbABF":{"name":"isStrongProbablePrime(_:)","abstract":"

Returns true iff this integer passes the strong probable prime test for the specified base.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV7isPrime6roundsSbSi_tF":{"name":"isPrime(rounds:)","abstract":"

Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3alloiyA2B_ABtFZ":{"name":"&<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4alleoiyyABz_ABtFZ":{"name":"&<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3aggoiyA2B_ABtFZ":{"name":"&>>(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV4aggeoiyyABz_ABtFZ":{"name":"&>>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2lloiyA2B_xtSzRzlFZ":{"name":"<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3lleoiyyABz_xtSzRzlFZ":{"name":"<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2ggoiyA2B_xtSzRzlFZ":{"name":">>(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV3ggeoiyyABz_xtSzRzlFZ":{"name":">>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV10squareRootAByF":{"name":"squareRoot()","abstract":"

Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:Sx6StrideQa":{"name":"Stride","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8advanced2byA2B_tF":{"name":"advanced(by:)","abstract":"

Returns self + n.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8distance2toA2B_tF":{"name":"distance(to:)","abstract":"

Returns other - self.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV_5radixABSgx_SitcSyRzlufc":{"name":"init(_:radix:)","abstract":"

Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20unicodeScalarLiteralABs7UnicodeO0D0V_tcfc":{"name":"init(unicodeScalarLiteral:)","abstract":"

Initialize a new big integer from a Unicode scalar.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV30extendedGraphemeClusterLiteralABSS_tcfc":{"name":"init(extendedGraphemeClusterLiteral:)","abstract":"

Initialize a new big integer from an extended grapheme cluster.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV13stringLiteralABSS_tcfc":{"name":"init(stringLiteral:)","abstract":"

Initialize a new big integer from a decimal number represented by a string literal of arbitrary length.","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV11descriptionSSvp":{"name":"description","abstract":"

Return the decimal representation of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV21playgroundDescriptionypvp":{"name":"playgroundDescription","abstract":"

Return the playground quick look representation of this integer.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV6negateyyF":{"name":"negate()","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV1soiyA2B_ABtFZ":{"name":"-(_:_:)","abstract":"

Subtract b from a and return the result.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV2seoiyyABz_ABtFZ":{"name":"-=(_:_:)","abstract":"

Subtract b from a in place.

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV8bitWidthSivp":{"name":"bitWidth","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV20trailingZeroBitCountSivp":{"name":"trailingZeroBitCount","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt/Words.html":{"name":"Words","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5wordsAB5WordsVvp":{"name":"words","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigInt.html#/s:6BigIntAAV5wordsABx_tcSTRzSu7ElementRtzlufc":{"name":"init(words:)","abstract":"

Undocumented

","parent_name":"BigInt"},"Structs/BigUInt/Words.html#/s:Sl10startIndex0B0Qzvp":{"name":"startIndex","parent_name":"Words"},"Structs/BigUInt/Words.html#/s:Sl8endIndex0B0Qzvp":{"name":"endIndex","parent_name":"Words"},"Structs/BigUInt/Words.html#/s:Sly7ElementQz5IndexQzcip":{"name":"subscript(_:)","parent_name":"Words"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV4Worda":{"name":"Word","abstract":"

The type representing a digit in BigUInt‘s underlying number system.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVACycfc":{"name":"init()","abstract":"

Initializes a new BigUInt with value 0.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5wordsACSaySuG_tcfc":{"name":"init(words:)","abstract":"

Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1poiyA2C_ACtFZ":{"name":"+(_:_:)","abstract":"

Add a and b together and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2peoiyyACz_ACtFZ":{"name":"+=(_:_:)","abstract":"

Add a and b together, and store the sum in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz8isSignedSbvpZ":{"name":"isSigned","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV6signumACyF":{"name":"signum()","abstract":"

Returns 1 if this value is, positive; otherwise, 0.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1topyA2CFZ":{"name":"~(_:)","abstract":"

Return the ones’ complement of a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2oeoiyyACz_ACtFZ":{"name":"|=(_:_:)","abstract":"

Calculate the bitwise OR of a and b, and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2aeoiyyACz_ACtFZ":{"name":"&=(_:_:)","abstract":"

Calculate the bitwise AND of a and b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2xeoiyyACz_ACtFZ":{"name":"^=(_:_:)","abstract":"

Calculate the bitwise XOR of a and b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7compareySo18NSComparisonResultVAC_ACtFZ":{"name":"compare(_:_:)","abstract":"

Compare a to b and return an NSComparisonResult indicating their order.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

Return true iff a is equal to b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1loiySbAC_ACtFZ":{"name":"<(_:_:)","abstract":"

Return true iff a is less than b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVyACSWcfc":{"name":"init(_:)","abstract":"

Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntVyAC10Foundation4DataVcfc":{"name":"init(_:)","abstract":"

Initializes an integer from the bits stored inside a piece of Data.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV9serialize10Foundation4DataVyF":{"name":"serialize()","abstract":"

Return a Data value that contains the base-256 representation of this integer, in network (big-endian) byte order.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20quotientAndRemainder10dividingByAC0D0_AC9remaindertAC_tF":{"name":"quotientAndRemainder(dividingBy:)","abstract":"

Divide this integer by y and return the resulting quotient and remainder.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1doiyA2C_ACtFZ":{"name":"/(_:_:)","abstract":"

Divide x by y and return the quotient.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1roiyA2C_ACtFZ":{"name":"%(_:_:)","abstract":"

Divide x by y and return the remainder.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2deoiyyACz_ACtFZ":{"name":"/=(_:_:)","abstract":"

Divide x by y and store the quotient in x.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2reoiyyACz_ACtFZ":{"name":"%=(_:_:)","abstract":"

Divide x by y and store the remainder in x.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5poweryACSiF":{"name":"power(_:)","abstract":"

Returns this integer raised to the power exponent.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5power_7modulusA2C_ACtF":{"name":"power(_:modulus:)","abstract":"

Returns the remainder of this integer raised to the power exponent in modulo arithmetic under modulus.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz7exactlyxSgqd___tcSBRd__lufc":{"name":"init(exactly:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Szyxqd__cSBRd__lufc":{"name":"init(_:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21greatestCommonDivisor4withA2C_tF":{"name":"greatestCommonDivisor(with:)","abstract":"

Returns the greatest common divisor of self and b.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7inverseyACSgACF":{"name":"inverse(_:)","abstract":"

Returns the multiplicative inverse of this integer in modulo modulus arithmetic,","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV4hash4intoys6HasherVz_tF":{"name":"hash(into:)","abstract":"

Append this BigUInt to the specified hasher.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sj7exactlyxSgqd___tcSzRd__lufc":{"name":"init(exactly:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Szyxqd__cSzRd__lufc":{"name":"init(_:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz18truncatingIfNeededxqd___tcSzRd__lufc":{"name":"init(truncatingIfNeeded:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz8clampingxqd___tcSzRd__lufc":{"name":"init(clamping:)","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV14integerLiteralACs6UInt64V_tcfc":{"name":"init(integerLiteral:)","abstract":"

Initialize a new big integer from an integer literal.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8multiply6byWordySu_tF":{"name":"multiply(byWord:)","abstract":"

Multiply this big integer by a single word, and store the result in place of the original big integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10multiplied6byWordACSu_tF":{"name":"multiplied(byWord:)","abstract":"

Multiply this big integer by a single Word, and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV14multiplyAndAdd__9shiftedByyAC_SuSitF":{"name":"multiplyAndAdd(_:_:shiftedBy:)","abstract":"

Multiply x by y, and add the result to this integer, optionally shifted shift words to the left.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10multiplied2byA2C_tF":{"name":"multiplied(by:)","abstract":"

Multiply this integer by y and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV25directMultiplicationLimitSivpZ":{"name":"directMultiplicationLimit","abstract":"

Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1moiyA2C_ACtFZ":{"name":"*(_:_:)","abstract":"

Multiply a by b and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2meoiyyACz_ACtFZ":{"name":"*=(_:_:)","abstract":"

Multiply a by b and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21isStrongProbablePrimeySbACF":{"name":"isStrongProbablePrime(_:)","abstract":"

Returns true iff this integer passes the strong probable prime test for the specified base.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV7isPrime6roundsSbSi_tF":{"name":"isPrime(rounds:)","abstract":"

Returns true if this integer is probably prime. Returns false if this integer is definitely not prime.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger16withMaximumWidth5usingACSi_xztSGRzlFZ":{"name":"randomInteger(withMaximumWidth:using:)","abstract":"

Create a big unsigned integer consisting of width uniformly distributed random bits.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger16withMaximumWidthACSi_tFZ":{"name":"randomInteger(withMaximumWidth:)","abstract":"

Create a big unsigned integer consisting of width uniformly distributed random bits.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger14withExactWidth5usingACSi_xztSGRzlFZ":{"name":"randomInteger(withExactWidth:using:)","abstract":"

Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger14withExactWidthACSi_tFZ":{"name":"randomInteger(withExactWidth:)","abstract":"

Create a big unsigned integer consisting of width-1 uniformly distributed random bits followed by a one bit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger8lessThan5usingA2C_xztSGRzlFZ":{"name":"randomInteger(lessThan:using:)","abstract":"

Create a uniformly distributed random unsigned integer that’s less than the specified limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13randomInteger8lessThanA2C_tFZ":{"name":"randomInteger(lessThan:)","abstract":"

Create a uniformly distributed random unsigned integer that’s less than the specified limit.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV3ggeoiyyACz_xtSzRzlFZ":{"name":">>=(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV3lleoiyyACz_xtSzRzlFZ":{"name":"<<=(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2ggoiyA2C_xtSzRzlFZ":{"name":">>(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2lloiyA2C_xtSzRzlFZ":{"name":"<<(_:_:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV10squareRootACyF":{"name":"squareRoot()","abstract":"

Returns the integer square root of a big integer; i.e., the largest integer whose square isn’t greater than value.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV6Stridea":{"name":"Stride","abstract":"

A type that can represent the distance between two values ofa BigUInt.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8advanced2byAc2AV_tF":{"name":"advanced(by:)","abstract":"

Adds n to self and returns the result. Traps if the result would be less than zero.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8distance2toA2AVAC_tF":{"name":"distance(to:)","abstract":"

Returns the (potentially negative) difference between self and other as a BigInt. Never traps.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV_5radixACSgx_SitcSyRzlufc":{"name":"init(_:radix:)","abstract":"

Initialize a big integer from an ASCII representation in a given radix. Numerals above 9 are represented by","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20unicodeScalarLiteralACs7UnicodeO0E0V_tcfc":{"name":"init(unicodeScalarLiteral:)","abstract":"

Initialize a new big integer from a Unicode scalar.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV30extendedGraphemeClusterLiteralACSS_tcfc":{"name":"init(extendedGraphemeClusterLiteral:)","abstract":"

Initialize a new big integer from an extended grapheme cluster.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV13stringLiteralACSS_tcfc":{"name":"init(stringLiteral:)","abstract":"

Initialize a new big integer from a decimal number represented by a string literal of arbitrary length.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV11descriptionSSvp":{"name":"description","abstract":"

Return the decimal representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV21playgroundDescriptionypvp":{"name":"playgroundDescription","abstract":"

Return the playground quick look representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV25subtractReportingOverflow_9shiftedBySbAC_SitF":{"name":"subtractReportingOverflow(_:shiftedBy:)","abstract":"

Subtract other from this integer in place, and return a flag indicating if the operation caused an","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV28subtractingReportingOverflow_9shiftedByAC12partialValue_Sb8overflowtAC_SitF":{"name":"subtractingReportingOverflow(_:shiftedBy:)","abstract":"

Subtract other from this integer, returning the difference and a flag indicating arithmetic overflow.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV28subtractingReportingOverflowyAC12partialValue_Sb8overflowtACF":{"name":"subtractingReportingOverflow(_:)","abstract":"

Subtracts other from self, returning the result and a flag indicating arithmetic overflow.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8subtract_9shiftedByyAC_SitF":{"name":"subtract(_:shiftedBy:)","abstract":"

Subtract other from this integer in place.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV11subtracting_9shiftedByA2C_SitF":{"name":"subtracting(_:shiftedBy:)","abstract":"

Subtract b from this integer, and return the difference.","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV9decrement9shiftedByySi_tF":{"name":"decrement(shiftedBy:)","abstract":"

Decrement this integer by one.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV1soiyA2C_ACtFZ":{"name":"-(_:_:)","abstract":"

Subtract b from a and return the result.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV2seoiyyACz_ACtFZ":{"name":"-=(_:_:)","abstract":"

Subtract b from a and store the result in a.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5bitAtSbSi_tcip":{"name":"subscript(bitAt:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV8bitWidthSivp":{"name":"bitWidth","abstract":"

The minimum number of bits required to represent this integer in binary.

","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV19leadingZeroBitCountSivp":{"name":"leadingZeroBitCount","abstract":"

The number of leading zero bits in the binary representation of this integer in base 2^(Word.bitWidth).","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV20trailingZeroBitCountSivp":{"name":"trailingZeroBitCount","abstract":"

The number of trailing zero bits in the binary representation of this integer.

","parent_name":"BigUInt"},"Structs/BigUInt/Words.html":{"name":"Words","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:Sz5words5WordsQzvp":{"name":"words","parent_name":"BigUInt"},"Structs/BigUInt.html#/s:6BigInt0A4UIntV5wordsACx_tcSTRzSu7ElementRtzlufc":{"name":"init(words:)","abstract":"

Undocumented

","parent_name":"BigUInt"},"Structs/BigUInt.html":{"name":"BigUInt","abstract":"

An arbitary precision unsigned integer type, also known as a “big integer”.

"},"Structs/BigInt.html":{"name":"BigInt","abstract":"

An arbitary precision signed integer type, also known as a “big integer”.

"},"Extensions/String.html#/s:SS6BigIntEySSAA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Initialize a new string with the base-10 representation of an unsigned big integer.

","parent_name":"String"},"Extensions/String.html#/s:SS6BigIntE_5radix9uppercaseSSAA0A4UIntV_SiSbtcfc":{"name":"init(_:radix:uppercase:)","abstract":"

Initialize a new string representing an unsigned big integer in the given radix (base).

","parent_name":"String"},"Extensions/String.html#/s:SS6BigIntE_5radix9uppercaseSSA2AV_SiSbtcfc":{"name":"init(_:radix:uppercase:)","abstract":"

Initialize a new string representing a signed big integer in the given radix (base).

","parent_name":"String"},"Extensions/BinaryFloatingPoint.html#/s:SB6BigInts17FixedWidthInteger11RawExponentRpzsAB0F11SignificandRpzrlEyxA2AVcfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"BinaryFloatingPoint"},"Extensions/BinaryFloatingPoint.html#/s:SB6BigInts17FixedWidthInteger11RawExponentRpzsAB0F11SignificandRpzrlEyxAA0A4UIntVcfc":{"name":"init(_:)","abstract":"

Undocumented

","parent_name":"BinaryFloatingPoint"},"Extensions/BinaryFloatingPoint.html":{"name":"BinaryFloatingPoint"},"Extensions/String.html":{"name":"String"},"Extensions.html":{"name":"Extensions","abstract":"

The following extensions are available globally.

"},"Structs.html":{"name":"Structures","abstract":"

The following structures are available globally.

"}} \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/docs/undocumented.json b/Carthage/Checkouts/BigInt/docs/undocumented.json new file mode 100644 index 00000000..424f92a4 --- /dev/null +++ b/Carthage/Checkouts/BigInt/docs/undocumented.json @@ -0,0 +1,229 @@ +{ + "warnings": [ + { + "file": "/Users/tim/Developer/BigInt/Sources/BigInt.swift", + "line": 30, + "symbol": "BigInt.Sign", + "symbol_kind": "source.lang.swift.decl.enum", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/BigInt.swift", + "line": 31, + "symbol": "BigInt.Sign.plus", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/BigInt.swift", + "line": 32, + "symbol": "BigInt.Sign.minus", + "symbol_kind": "source.lang.swift.decl.enumelement", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 50, + "symbol": "BigInt.~(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 59, + "symbol": "BigInt.&(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 76, + "symbol": "BigInt.|(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 93, + "symbol": "BigInt.^(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 110, + "symbol": "BigInt.&=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 114, + "symbol": "BigInt.|=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Bitwise Ops.swift", + "line": 118, + "symbol": "BigInt.^=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Floating Point Conversion.swift", + "line": 45, + "symbol": "BinaryFloatingPoint.init(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Floating Point Conversion.swift", + "line": 70, + "symbol": "BinaryFloatingPoint.init(_:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Integer Conversion.swift", + "line": 42, + "symbol": "BigInt.init()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 109, + "symbol": "BigUInt.>>=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 121, + "symbol": "BigUInt.<<=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 129, + "symbol": "BigUInt.>>(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 139, + "symbol": "BigUInt.<<(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 168, + "symbol": "BigInt.&<<(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 172, + "symbol": "BigInt.&<<=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 176, + "symbol": "BigInt.&>>(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 180, + "symbol": "BigInt.&>>=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 184, + "symbol": "BigInt.<<(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 189, + "symbol": "BigInt.<<=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 198, + "symbol": "BigInt.>>(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Shifts.swift", + "line": 203, + "symbol": "BigInt.>>=(_:_:)", + "symbol_kind": "source.lang.swift.decl.function.method.static", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Subtraction.swift", + "line": 157, + "symbol": "BigInt.negate()", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 24, + "symbol": "BigUInt.subscript(bitAt:)", + "symbol_kind": "source.lang.swift.decl.function.subscript", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 78, + "symbol": "BigInt.bitWidth", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 83, + "symbol": "BigInt.trailingZeroBitCount", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 105, + "symbol": "BigUInt.init(words:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 188, + "symbol": "BigInt.words", + "symbol_kind": "source.lang.swift.decl.var.instance", + "warning": "undocumented" + }, + { + "file": "/Users/tim/Developer/BigInt/Sources/Words and Bits.swift", + "line": 192, + "symbol": "BigInt.init(words:)", + "symbol_kind": "source.lang.swift.decl.function.method.instance", + "warning": "undocumented" + } + ], + "source_directory": "/Users/tim/Developer/BigInt" +} \ No newline at end of file diff --git a/Carthage/Checkouts/BigInt/images/BigInt.sketch b/Carthage/Checkouts/BigInt/images/BigInt.sketch new file mode 100644 index 0000000000000000000000000000000000000000..a74eb9b7e5863fba53e9041519c0162a8a471f20 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/images/banner.png b/Carthage/Checkouts/BigInt/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..d0410a45f6d05a2f3b77fe3b2b9501d83042777d GIT binary patch literal 97499 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 b9QU94ipCGofBhfZF#v(5tDnm{r-UW|6>EAN literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/BigInt/version.xcconfig b/Carthage/Checkouts/BigInt/version.xcconfig new file mode 100644 index 00000000..934ed210 --- /dev/null +++ b/Carthage/Checkouts/BigInt/version.xcconfig @@ -0,0 +1,13 @@ +// Increment the build number whenever you modify the version string. +VERSION_STRING = 5.3.0 +BUILD_NUMBER = 18 + +PROJECT_NAME = BigInt +BUNDLE_IDENTIFIER_BASE = org.attaswift.$(PROJECT_NAME) + +IPHONEOS_DEPLOYMENT_TARGET = 8.0 +MACOSX_DEPLOYMENT_TARGET = 10.9 +WATCHOS_DEPLOYMENT_TARGET = 2.0 +TVOS_DEPLOYMENT_TARGET = 9.0 + +APPLICATION_EXTENSION_API_ONLY = YES diff --git a/Carthage/Checkouts/CryptoSwift/.github/CODEOWNERS b/Carthage/Checkouts/CryptoSwift/.github/CODEOWNERS new file mode 100644 index 00000000..2904e51a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/CODEOWNERS @@ -0,0 +1 @@ +* @krzyzanowskim diff --git a/Carthage/Checkouts/CryptoSwift/.github/FUNDING.yml b/Carthage/Checkouts/CryptoSwift/.github/FUNDING.yml new file mode 100644 index 00000000..a02f8355 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [krzyzanowskim, NathanFallet] diff --git a/Carthage/Checkouts/CryptoSwift/.github/ISSUE_TEMPLATE/bug_report.md b/Carthage/Checkouts/CryptoSwift/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..c5372208 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,12 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +**Describe the bug** + + +**Reproduce** +Steps to reproduce: +1. diff --git a/Carthage/Checkouts/CryptoSwift/.github/PULL_REQUEST_TEMPLATE.md b/Carthage/Checkouts/CryptoSwift/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..8d172fd9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,9 @@ +Fixes # + +Checklist: +- [ ] Correct file headers (see CONTRIBUTING.md). +- [ ] Formatted with [SwiftFormat](https://github.com/nicklockwood/SwiftFormat). +- [ ] Tests added. + +Changes proposed in this pull request: +- diff --git a/Carthage/Checkouts/CryptoSwift/.github/workflows/linux.yml b/Carthage/Checkouts/CryptoSwift/.github/workflows/linux.yml new file mode 100644 index 00000000..b9e83758 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/workflows/linux.yml @@ -0,0 +1,21 @@ +name: Linux + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-20.04 + + steps: + - uses: actions/checkout@v2 + + - name: Swift Package Build + run: swift build -v + + - name: Run tests + run: swift test -c release -Xswiftc -enable-testing -Xswiftc -DCI -Xswiftc -Xfrontend -Xswiftc -solver-memory-threshold -Xswiftc -Xfrontend -Xswiftc 999999999 diff --git a/Carthage/Checkouts/CryptoSwift/.github/workflows/macos.yml b/Carthage/Checkouts/CryptoSwift/.github/workflows/macos.yml new file mode 100644 index 00000000..13a13435 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.github/workflows/macos.yml @@ -0,0 +1,26 @@ +name: macOS + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: macos-latest + + steps: + - uses: actions/checkout@v2 + + - name: Select Xcode Version + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Swift Package Build + run: swift build -v + + - name: Run tests + run: swift test -c release -Xswiftc -enable-testing -Xswiftc -DCI -Xswiftc -Xfrontend -Xswiftc -solver-memory-threshold -Xswiftc -Xfrontend -Xswiftc 999999999 diff --git a/Carthage/Checkouts/CryptoSwift/.gitignore b/Carthage/Checkouts/CryptoSwift/.gitignore new file mode 100644 index 00000000..6130d3ac --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.gitignore @@ -0,0 +1,27 @@ +### Xcode ### +.build/ +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.xcuserstate +timeline.xctimeline +.swiftpm/xcode +Package.resolved +CryptoSwift.xcframework + +/Framework +.DS_Store +Carthage/Build + +.idea +.vscode diff --git a/Carthage/Checkouts/CryptoSwift/.mailmap b/Carthage/Checkouts/CryptoSwift/.mailmap new file mode 100644 index 00000000..91f2f96b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.mailmap @@ -0,0 +1,6 @@ +Marcin Krzyzanowski <758033+krzyzanowskim@users.noreply.github.com> +Marcin Krzyzanowski +Marcin Krzyzanowski +Marcin Krzyzanowski +Luis Reisewitz +Nathan Fallet \ No newline at end of file diff --git a/Carthage/Checkouts/CryptoSwift/.spi.yml b/Carthage/Checkouts/CryptoSwift/.spi.yml new file mode 100644 index 00000000..edfc6a21 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.spi.yml @@ -0,0 +1,4 @@ +version: 1 +builder: + configs: + - documentation_targets: [CryptoSwift] \ No newline at end of file diff --git a/Carthage/Checkouts/CryptoSwift/.swiftformat b/Carthage/Checkouts/CryptoSwift/.swiftformat new file mode 100644 index 00000000..19f0f78b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/.swiftformat @@ -0,0 +1,36 @@ + +--exclude .build, Carthage, DerivedData, .git, Tests/LinuxMain.swift, Tests/CryptoSwiftTests/XCTestManifests.swift, Tests/TestsPerformance/XCTestManifests.swift + +--swiftversion 5.0 +--allman false +--commas always +--comments indent +--elseposition same-line +--empty void +--exponentcase lowercase +--exponentgrouping disabled +--fractiongrouping disabled +--header ignore +--octalgrouping 4,8 +--decimalgrouping 3,6 +--binarygrouping 4,8 +--hexgrouping ignore +--hexliteralcase lowercase +--ifdef indent +--indent 2 +--indentcase true +--importgrouping testable-bottom +--linebreaks lf +--operatorfunc spaced +--patternlet inline +--ranges no-space +--self insert +--semicolons inline +--stripunusedargs closure-only +--trimwhitespace always +--wraparguments preserve +--wrapcollections before-first + +# rules + +--rules indent, braces, isEmpty, redundantBreak, blankLinesAroundMark, blankLinesAtEndOfScope, blankLinesBetweenScopes, consecutiveBlankLines, consecutiveSpaces, duplicateImports, elseOnSameLine, leadingDelimiters, redundantBreak, redundantExtensionACL, redundantFileprivate, redundantGet, redundantInit, redundantLet, redundantNilInit, redundantObjc, redundantParens, redundantPattern, redundantRawValues, redundantReturn, redundantSelf, redundantVoidReturnType, semicolons, sortedImports, spaceAroundBraces, spaceAroundBrackets, spaceAroundComments, spaceAroundGenerics, spaceAroundOperators, spaceAroundParens, spaceInsideBraces, spaceInsideBrackets, specifiers, strongOutlets, strongifiedSelf, todos, void, wrapArguments, yodaConditions, trailingSpace \ No newline at end of file diff --git a/Carthage/Checkouts/CryptoSwift/CHANGELOG b/Carthage/Checkouts/CryptoSwift/CHANGELOG new file mode 100644 index 00000000..6b9454dd --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CHANGELOG @@ -0,0 +1,348 @@ +1.6.0 +- Improve & extend RSA support with DER (see README for details) +- Fix Blowfish memory leaks +- Fix PCBC mode +- SwiftWasm compatibility + +1.5.1 +- Resolve type name clash by renaming BigInt -> BigInteger + +1.5.0 +- RSA (@NathanFallet) +- Workaround for Xcode 13.3.1 + +1.4.3 +- Fix PCBC mode. + +1.4.2 +- Update Xcode project to Xcode 13 +- Add SHA3 support for HMAC +- Update HMAC.Variant API (deprecate current cases) + +1.4.1 +- Introduce ISO 10126 padding +- fix various compiler warnings +- Revert Xcode project deployment target + +1.4.0 +- Customize CFB segment size (cfb8, cfb128). +- Adapt Swift @inlineable for better code optimization + +1.3.8 +- Revert xcframework revolution. Back to build from sources. (I'm sorry) + +1.3.7 +- Re-release to workaround Swift Package Manager release + +1.3.6 +- Fix macOS binary +- Windows support + +1.3.5 +- Re-release binary framework due to codesign issue + +1.3.4 +- Distribute optimized binary (xcframework) via SPM for apple platforms + +1.3.3 +- Adds OCB Authenticated-Encryption Algorithm (RFC7253) +- build-framework.sh output CryptoSwift.xcframework +- Xcode 12.2 maintenance updates +- Removed CryptoSwift.playground (couldn't make it work since Xcode 12 update) + +1.3.2 +- Swift 5.3 update (Xcode 12) +- Bump target platform (iOS 9, macOS 10.12) +- Allow CMAC with any Cipher +- Remove CMAC key limit + +1.3.1 +- Fix tests +- Swift 5.2 update +- Address possible timing issue + +1.3.0 +- Adds ISO-78164 padding +- Performance improvements +- Swift 5.1 update + +1.2.0 +- Performance improvements +- Workaround Xcode test builds with Xcode 11 + +1.1.3 +- Fix build crash: https://bugs.swift.org/browse/SR-11630 +- Fixes Xcode project tests build +- SwiftFormat all the things +- Increase/fix SHA2 data length for big input by use Int64 for calculation + +1.1.2 +- Fix Swift 5.0 build (for real this time) + +1.1.1 +- Fix Swift 5.0 build + +1.1.0 +- Replace RandomBytesSequence with Swift.RandomNumberGenerator +- Fix CBC-MAC +- Update SPM support +- Update for Xcode 11 and Swift 5.1 +- Xcode: BUILD_LIBRARY_FOR_DISTRIBUTION = YES + +1.0.0 +- Swift 5 +- Let's +- Celebrate +- This +- Event +- With +- 1.0.0 release +- After +- 4 years +- Thank you + +0.15.0 +- Adds The scrypt Password-Based Key Derivation Function (https://tools.ietf.org/html/rfc7914) +- Minor improvements + +0.14.0 +- Fixed decryption of AES-GCM ciphertexts with custom tag length + +0.13.1 +- Adds AES-GCM tag length configuration. +- Fixes count check for initializing UInt64 from Data. + +0.13.0 +- Adds CBC-MAC authenticator. +- Adds AES-CCM operation mode. + +0.12.0 +- Swift 4.2 maintenance update. + +0.11.0 +- API: Cryptor.seek() is throwable +- Adds proper stream support for CTR encryption with Updaptable interface. +- Refactor internals for the stream cipher modes. +- Set minimum deployment target to 8.0 (again). + +0.10.0 +- API: BlockMode is no longer an enum. Please migrate to eg. CBC() etc... +- Adds AES-GCM support. #97 - Feature sponsored by GesundheitsCloud (http://www.gesundheitscloud.de/) +- Adds CRC32c support. +- Improves AES variant validation. +- Fixes empty password in PBKDF2. + +0.9.0 +- Swift 4.1 compatibility +- Added CMAC message authenticator https://tools.ietf.org/html/rfc4493 +- Added AEADChaCha20Poly1305 (AEAD_CHACHA20_POLY1305) https://tools.ietf.org/html/rfc7539#section-2.8.1 + +0.8.3 +- Fixes SHA3 padding. +- Fixes Carthage builds. + +0.8.2 +- Fixes SHA3 partial updates calculations. +- Makes ChaCha20 processing faster again. + +0.8.1 +- Adds Data(hex:) helper. +- Adds HKDF (HMAC-based Extract-and-Expand Key Derivation Function) +- Prevent ChaCha overflow error + +0.8.0 +- Adds SHA3 Keccak variants +- Adds String.bytes helper to convert String to array of bytes +- Improves AES performance +- Speeds up compilation times with Swift 4 +- Fixes: Blowfish minimum key size is 5 +- Removes Ciphers "iv" parameter (value moved to BlockMode) +- BlockMode uses associated value for IV value where apply e.g. .CBC(iv: ivbytes) +- Refactors internal hacks no longer needed with Swift 4 + +0.7.2 +- Adds Padding enum (.pkcs5, .pkcs7, .noPadding, .zeroPadding) +- Removes Generics from the public API. +- Slightly improves SHA1, SHA2, SHA3 performance. +- Update SPM configuration for Swift 4 + +0.7.1 +- Swift 4.0 compatibility release + +0.7.0 +- Swift 3.2 compatibility release + +0.6.9 +- Fixed padding issue where padding was not properly added in CTR mode. +- Fixed thrown error on decrypting empty string, +- Fixed CI build script. +- Added String.encryptToBase64() + +0.6.8 +- Speed up MD5() +- Faster Array(hex:) +- Improve AES performance +- Fix tvOS bitcode +- Fix Blowfish CFB, OFB, CTR block modes. +- Fix Blowfish for 32-bit arch. +- Fix ChaCha20 preconditions + +0.6.7 +- Release for Xcode 8.2 +- Fix playground example + +0.6.6 +- Rework ChaCha20 +- Fix Poly1305 + +0.6.5 +- Significant performance improvement when processing lange amount of data. +- Degeneric functions and change Sequence -> Collection in generic constraints. + +0.6.4 +- More performance improvements +- Add convenient Digest.sha2(bytes:variant) +- New: Blowfish cipher + +0.6.3 +- Hotfix release +- Fixes bitPadding() that breaks Digests calculations, introduced in 0.6.2 + +0.6.2 +- SHA performance improvements by using less Swift in Swift +- Fix public access to all digests classes + +0.6.1 +- Update tests. +- New: RandomBytesSequence urandom values on Linux. +- Throw appropriate error for AES with invalid input where padding is needed. +- Improve performance, especially to SHA-1, SHA-2, PBKDF and related. +- Set deployment targets for all platform. Fixes Carthage builds. +- New: SHA-3 implementation (request #291) +- SHA-1 conforms to Updatable protocol and may be calculated incrementally. +- SHA-2 conforms to Updatable protocol and may be calculated incrementally. + +0.6.0 +- Remove bridge() workaround for Linux (not needed) +- make MD5() public +- Update README +- Convenience HMAC initializer for String input + +0.6.0-beta2 +- SHA-2 fix #319 +- HashProtocol -> Digest and refactor +- MD5 conforms to Updatable protocol and may be calculated incrementally +- Cipher protocol accepts Collection input now + +0.6.0-beta1 +- Swift 3 compatibility +- Multiplatform, Single-scheme Xcode Project +- Swift Package Manager fully supported (build and tests) +- Improved Linux support +- Travis configuration added +- Public interface tests added +- enum Authenticator -> protocol Authenticator +- CRC -> Checksum +- String.encrypt() returns hex string instead of Array +- removed String.decrypt() +- enum Hash -> struct Hash +- Convenience initializer of Array of bytes with Hex string. Array(hex: "0xb1b1b2b2") +- Fix reusability of ChaCha20 instance +- Replace optional initializers with throwable initializers +- Allow to set initial counter explicitly (AES block modes). RandomAccessCryptor.seek() + +0.5.2 +- Fix AES-CTR incremental updates. #287 +- Fixed PBKDF2 tests. #295 +- Fixed assertion check in PKCS7. #288 +- Updatable protocol accept SequenceType in place of Array + +0.5.1 +- Fixed PBKDF2 not taking key length parameter into account +- Switch to Array<> in code + +0.5 +- Added PBKDF1 https://tools.ietf.org/html/rfc2898#section-5.1 +- Added PBKDF2 https://tools.ietf.org/html/rfc2898#section-5.2 +- UpdatableCryptor protocol allows incremental encryption stream of data +- CryptoSwift.playground +- Docs update +- Added reflection control to CRC-32 (Luís Silva) +- Fix AES.init() (Pascal Pfiffner) + +0.4.1 +- fix NoPadding() + +0.4 +- Padding setup is now part of cipher constructor +- Added PBKDF2 http://tools.ietf.org/html/rfc2898#section-5.2 +- Add BlockCipher protocol +- Rename Cipher -> CipherProtocol +- Remove build-frameworks.sh script +- Keep sensitive data in memory with SecureBytes +- Allows direct use of HMAC and Poly1305 +- README update +- Fix missing Foundation import on Linux + +0.3.1 +- replace deprecated Bit with new enum. + +0.3 +- Swift 2.2 support +- use generators for cipher block modes should reduce memory overload. +- add OFB block mode +- add PCBC block mode +- String.decryptBase64ToString to decrypt Base64 encoded strings +- broke up complicated expressions which were taking ages to compile + +0.2.3 +- enable bitcode setting for Debug on an Apple TV +- faster compilation times +- improve padding functions + +0.2.2 +- Fix ChaCha20 cipher +- Replace for(;;) with for-in +- Workaround for "NSString are not yet implicitly convertible to String" on Linux + +0.2.1 +- Fix linux build +- re-add umbrella header + +0.2 +- Rabbit cipher (RFC4503) +- Linux Swift support +- Swift Package Manager support +- tvOS support +- Add optional seed to CRC +- Add umbrella header (CryptoSwift.h) +- Fix AES in CTR mode +- Fix no padding support for CTR and CFB block modes +- Fix access to AES.Error and ChaCha20.Error + +0.1.1 +- Fix Cococapods package (missing Foundation integration) + +0.1.0 +- Major performance improvements. +- Transition from Optionals to throw error. +- Replace enum Cipher with protocol for ciphers. +- Added CRC16 +- Fixed AES CFB decryption +- Drop internal "Foundation" dependency, nonetheless it is supported as usual. + +0.0.16 +- Critical fix for private "md5" selector issue (#135) + +0.0.15 +- Fix 32-bit CTR block mode +- Carthage support update +- Mark as App-Extension-Safe API + +0.0.14 +- hexString -> toHextString() #105 +- CTR (Counter mode) +- Hex string is lowercase now +- Carthage support +- Tests update +- Swift 2.0 support - overall update diff --git a/Carthage/Checkouts/CryptoSwift/CNAME b/Carthage/Checkouts/CryptoSwift/CNAME new file mode 100644 index 00000000..d7c8ffd4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CNAME @@ -0,0 +1 @@ +cryptoswift.io diff --git a/Carthage/Checkouts/CryptoSwift/CODE_OF_CONDUCT.md b/Carthage/Checkouts/CryptoSwift/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..ea968f5a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at marcin@krzyzanowskim.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/Carthage/Checkouts/CryptoSwift/CONTRIBUTING.md b/Carthage/Checkouts/CryptoSwift/CONTRIBUTING.md new file mode 100644 index 00000000..5ac92345 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CONTRIBUTING.md @@ -0,0 +1,27 @@ +By submitting a pull request, you represent that you have the right to license +your contribution to Marcin Krzyżanowski and the community, and agree by submitting the patch that your contributions are licensed under the CryptoSwift project license. + +--- + +Before submitting the pull request, please make sure you have tested your changes. + +--- + +For new files, please use the correct file header: + +``` +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +``` diff --git a/Carthage/Checkouts/CryptoSwift/CONTRIBUTORS.txt b/Carthage/Checkouts/CryptoSwift/CONTRIBUTORS.txt new file mode 100644 index 00000000..5decab5d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CONTRIBUTORS.txt @@ -0,0 +1,120 @@ +For the purpose of tracking copyright, this is the list of individuals and +organizations who have contributed source code to CryptoSwift. + +### Contributors + +- Adolfo Martinelli +- Aidan Woods +- Alejandro Isaza +- Alex Binary +- Alex Vlasov +- AlexDenisov <1101.debian@gmail.com> +- Alexey Komnin +- Alsey Coleman Miller +- Andrew Wagner <845683+drewag@users.noreply.github.com> +- André Berenguel +- Anton +- Ayaka Nonaka +- Bart Cone +- Bing Cheung <32565605+eungch@users.noreply.github.com> +- Bogdan Bystritskiy +- Brandon Toms +- Brice Cesarin +- Bruce Geerdes +- Bryan Chen +- Bryant Luk +- C.W. Betts +- Caio Mathielo +- Cheng-Yu Hsu +- Chris Amanse +- Christian Steffens +- Cihat Gündüz +- Cosmin Baies +- Dave Wood +- Dima Kalachov +- Dusan Klinec +- Elaine Lyons +- Eneko Alonso +- Eugene Berdnikov +- Evan Maloney +- Evin Ugur +- Frank Langel +- Frank Langel +- Franklin Schrans +- FreeThinker <59345560+Free-FreeThinker@users.noreply.github.com> +- Grzegorz Nowicki +- Hamilton Chapman +- Honza Dvorsky +- Howtin +- Ibrahim Kteish +- Igor Camilo +- Javier Soto +- Jeremy Greenwood +- Jimmie Johansson +- John Hammerlund +- Jonas Obrist +- K.K. POON +- Keith Smiley +- Koray Koska +- Kyle Fuller +- Lex Tang +- Logan Wright +- Ludo Galabru +- Luis Reisewitz +- Luís Silva +- Madhava Jay +- Marc Prud'hommeaux +- Marcelo Fabri +- Marcin Krzyzanowski +- Masayuki Ono +- Matias Cudich +- Matias Piipari +- Matthew Chung +- Michael Ledin +- Michael Redig +- Mikael LE GOFF +- Mo Ramezanpoor +- Nate West +- Nathan Fallet +- Nicholas Maccharoli +- Nobutaka Yuasa +- Oscar Choi +- Oscar De Moya +- Pantelis Zirinis +- Paolo Musolino +- Pascal Pfiffner +- Pedro Silva +- Pierpaolo Frasa +- Quinn McHenry +- R4v3nPr0 +- Rich Lowenberg +- Roman Podymov +- Ronald Mannak +- SLboat +- Sali0m +- Sam Soffes +- Samuel GRAU +- ScottieY +- Semen Zhydenko +- Simon Hartmann +- Stefan Hintz +- Thomas Bibby +- Thomas Haak +- TictoDev +- Tomas Kraina +- Tomasz Szulc +- Tomasz Wierzbik +- Valeriy Van +- Xavier Matos +- Yannick Loriot +- Yury Lapitsky +- akreutz <27BBsan08!> +- jose +- mrahmiao +- spatno +- sweepty +- venj + +**Updating this list** + +Please do not edit this file manually. It is generated using `./scripts/generate-contributors-list.sh`. If a name is misspelled or appearing multiple times: add an entry in `./.mailmap` diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/AppDelegate.swift b/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/AppDelegate.swift new file mode 100644 index 00000000..a9b3ede3 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/AppDelegate.swift @@ -0,0 +1,49 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } +} diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Default-568h@2x.png b/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0891b7aabfcf3422423b109c8beed2bab838c607 GIT binary patch literal 18594 zcmeI4X;f257Jx&9fS`ixvS;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Info.plist b/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Info.plist new file mode 100644 index 00000000..76398107 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift-TestHostApp/Info.plist @@ -0,0 +1,43 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.podspec b/Carthage/Checkouts/CryptoSwift/CryptoSwift.podspec new file mode 100644 index 00000000..5304c8a5 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.podspec @@ -0,0 +1,19 @@ +Pod::Spec.new do |s| + s.name = "CryptoSwift" + s.version = "1.6.0" + s.source = { :git => "https://github.com/krzyzanowskim/CryptoSwift.git", :tag => "#{s.version}" } + s.summary = "Cryptography in Swift. SHA, MD5, CRC, PBKDF, Poly1305, HMAC, CMAC, HDKF, Scrypt, ChaCha20, Rabbit, Blowfish, AES, RSA." + s.description = "Cryptography functions and helpers for Swift implemented in Swift. SHA-1, SHA-2, SHA-3, MD5, PBKDF1, PBKDF2, Scrypt, CRC, Poly1305, HMAC, ChaCha20, Rabbit, Blowfish, AES, RSA" + s.homepage = "https://github.com/krzyzanowskim/CryptoSwift" + s.license = {:type => "Attribution", :file => "LICENSE"} + s.authors = {'Marcin Krzyżanowski' => 'marcin@krzyzanowskim.com'} + s.social_media_url = "https://twitter.com/krzyzanowskim" + s.cocoapods_version = '>= 1.10.0' + s.swift_version = "5.3" + s.ios.deployment_target = "11.0" + s.osx.deployment_target = "10.12" + s.watchos.deployment_target = "2.0" + s.tvos.deployment_target = "9.0" + s.source_files = "Sources/CryptoSwift/**/*.swift" + s.requires_arc = true +end diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.pbxproj b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.pbxproj new file mode 100644 index 00000000..0a7e6507 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.pbxproj @@ -0,0 +1,1368 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + 0AF023D5230F2B0F008E4E68 /* ISO78164Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AF023D4230F2B0F008E4E68 /* ISO78164Padding.swift */; }; + 0EE73E71204D598100110E11 /* CMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE73E70204D598100110E11 /* CMAC.swift */; }; + 0EE73E74204D59C200110E11 /* CMACTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE73E72204D599C00110E11 /* CMACTests.swift */; }; + 14156CE52011422400DDCFBC /* ChaCha20Poly1305Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14156CE42011422400DDCFBC /* ChaCha20Poly1305Tests.swift */; }; + 1467460F2017BB3600DF04ED /* AEAD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1467460E2017BB3600DF04ED /* AEAD.swift */; }; + 35F3E51C23BF9A6700A024A1 /* OCB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F3E51B23BF9A6700A024A1 /* OCB.swift */; }; + 42012783267A6F1C00F82506 /* ISO10126Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42012782267A6F1C00F82506 /* ISO10126Padding.swift */; }; + 674A736F1BF5D85B00866C5B /* RabbitTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 674A736E1BF5D85B00866C5B /* RabbitTests.swift */; }; + 6A7CDEED26CD1E4C00FFB1AF /* RSATests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A7CDEEC26CD1E4C00FFB1AF /* RSATests.swift */; }; + 6AC893F626DB950F00F7E787 /* Addition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E026DB950C00F7E787 /* Addition.swift */; }; + 6AC893F726DB950F00F7E787 /* Square Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E126DB950C00F7E787 /* Square Root.swift */; }; + 6AC893F826DB950F00F7E787 /* GCD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E226DB950D00F7E787 /* GCD.swift */; }; + 6AC893F926DB950F00F7E787 /* Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E326DB950D00F7E787 /* Comparable.swift */; }; + 6AC893FA26DB950F00F7E787 /* Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E426DB950D00F7E787 /* Hashable.swift */; }; + 6AC893FB26DB950F00F7E787 /* Bitwise Ops.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E526DB950D00F7E787 /* Bitwise Ops.swift */; }; + 6AC893FC26DB950F00F7E787 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E626DB950D00F7E787 /* Codable.swift */; }; + 6AC893FD26DB950F00F7E787 /* Shifts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E726DB950D00F7E787 /* Shifts.swift */; }; + 6AC893FE26DB950F00F7E787 /* Prime Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E826DB950D00F7E787 /* Prime Test.swift */; }; + 6AC893FF26DB950F00F7E787 /* Words and Bits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893E926DB950D00F7E787 /* Words and Bits.swift */; }; + 6AC8940026DB950F00F7E787 /* Subtraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893EA26DB950D00F7E787 /* Subtraction.swift */; }; + 6AC8940126DB950F00F7E787 /* Data Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893EB26DB950D00F7E787 /* Data Conversion.swift */; }; + 6AC8940226DB950F00F7E787 /* Multiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893EC26DB950D00F7E787 /* Multiplication.swift */; }; + 6AC8940326DB950F00F7E787 /* Integer Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893ED26DB950E00F7E787 /* Integer Conversion.swift */; }; + 6AC8940426DB950F00F7E787 /* Floating Point Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893EE26DB950E00F7E787 /* Floating Point Conversion.swift */; }; + 6AC8940526DB950F00F7E787 /* Strideable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893EF26DB950E00F7E787 /* Strideable.swift */; }; + 6AC8940626DB950F00F7E787 /* BigInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F026DB950E00F7E787 /* BigInt.swift */; }; + 6AC8940726DB950F00F7E787 /* Exponentiation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F126DB950E00F7E787 /* Exponentiation.swift */; }; + 6AC8940826DB950F00F7E787 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F226DB950E00F7E787 /* Random.swift */; }; + 6AC8940926DB950F00F7E787 /* String Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F326DB950E00F7E787 /* String Conversion.swift */; }; + 6AC8940A26DB950F00F7E787 /* BigUInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F426DB950E00F7E787 /* BigUInt.swift */; }; + 6AC8940B26DB950F00F7E787 /* Division.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC893F526DB950E00F7E787 /* Division.swift */; }; + 750509991F6BEF2A00394A1B /* PKCS7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750509981F6BEF2A00394A1B /* PKCS7.swift */; }; + 7507705F28D61E78004A44DC /* RSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507705C28D61E78004A44DC /* RSA.swift */; }; + 7507706028D61E78004A44DC /* RSA+Signature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507705D28D61E78004A44DC /* RSA+Signature.swift */; }; + 7507706128D61E78004A44DC /* RSA+Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507705E28D61E78004A44DC /* RSA+Cipher.swift */; }; + 7507706428D61E8B004A44DC /* DER.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706328D61E8B004A44DC /* DER.swift */; }; + 7507706A28D61E97004A44DC /* ASN1Scanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706628D61E97004A44DC /* ASN1Scanner.swift */; }; + 7507706B28D61E97004A44DC /* ASN1Encoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706728D61E97004A44DC /* ASN1Encoder.swift */; }; + 7507706C28D61E97004A44DC /* ASN1Decoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706828D61E97004A44DC /* ASN1Decoder.swift */; }; + 7507706D28D61E97004A44DC /* ASN1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706928D61E97004A44DC /* ASN1.swift */; }; + 7507706F28D61EBA004A44DC /* PKCS1v15.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507706E28D61EBA004A44DC /* PKCS1v15.swift */; }; + 7507707128D61ED5004A44DC /* Signature.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7507707028D61ED5004A44DC /* Signature.swift */; }; + 750CC3EB1DC0CACE0096BE6E /* BlowfishTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750CC3EA1DC0CACE0096BE6E /* BlowfishTests.swift */; }; + 75100F8F19B0BC890005C5F5 /* Poly1305Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75100F8E19B0BC890005C5F5 /* Poly1305Tests.swift */; }; + 751AA0F3255F4EB600D4719E /* AESOCBTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35F3E51D23BF9AD300A024A1 /* AESOCBTests.swift */; }; + 751EE9781F93996100161FFC /* AES.Cryptors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 751EE9771F93996100161FFC /* AES.Cryptors.swift */; }; + 75211F95207249D8004E41F8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75211F94207249D8004E41F8 /* AppDelegate.swift */; }; + 7523742D2083C61D0016D662 /* GCM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7523742C2083C61C0016D662 /* GCM.swift */; }; + 7529366A20683DFC00195874 /* AEADChaCha20Poly1305.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7529366920683DFC00195874 /* AEADChaCha20Poly1305.swift */; }; + 752BED9D208C120D00FC4743 /* Blowfish+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52541EE8B6CA0048EB3B /* Blowfish+Foundation.swift */; }; + 752BED9E208C121000FC4743 /* Blowfish.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52491EE8B6CA0048EB3B /* Blowfish.swift */; }; + 752BED9F208C135700FC4743 /* AES+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52531EE8B6CA0048EB3B /* AES+Foundation.swift */; }; + 753674072175D012003E32A6 /* StreamDecryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753674062175D012003E32A6 /* StreamDecryptor.swift */; }; + 754310442050111A003FB1DF /* CompactMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754310432050111A003FB1DF /* CompactMap.swift */; }; + 75482EA41CB310B7001F66A5 /* PBKDF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75482EA31CB310B7001F66A5 /* PBKDF.swift */; }; + 754BE46819693E190098E6F3 /* DigestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 754BE46719693E190098E6F3 /* DigestTests.swift */; }; + 755BA296235387700039CAB5 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 7576F64C20725BD5006688F8 /* Default-568h@2x.png */; }; + 755FB1DA199E347D00475437 /* ExtensionsTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755FB1D9199E347D00475437 /* ExtensionsTest.swift */; }; + 7564F0522072EAEB00CA5A96 /* PBKDFPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F6207290F8006688F8 /* PBKDFPerf.swift */; platformFilter = ios; }; + 7564F0532072EAEB00CA5A96 /* ChaCha20TestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F020728EAB006688F8 /* ChaCha20TestsPerf.swift */; platformFilter = ios; }; + 7564F0542072EAEB00CA5A96 /* RabbitTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F220728F00006688F8 /* RabbitTestsPerf.swift */; platformFilter = ios; }; + 7564F0552072EAEB00CA5A96 /* ExtensionsTestPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F420729069006688F8 /* ExtensionsTestPerf.swift */; platformFilter = ios; }; + 7564F0562072EAEB00CA5A96 /* DigestTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6EB20726319006688F8 /* DigestTestsPerf.swift */; platformFilter = ios; }; + 7564F0572072EAEB00CA5A96 /* TestsPerformance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7595C14C2072E48C00EA1A5F /* TestsPerformance.swift */; platformFilter = ios; }; + 7564F0582072EAEB00CA5A96 /* AESTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6EE20726422006688F8 /* AESTestsPerf.swift */; platformFilter = ios; }; + 7564F05A2072EAEB00CA5A96 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; }; + 7564F0642072ED7000CA5A96 /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; }; + 7564F0652072ED7000CA5A96 /* CryptoSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 756A64C62111083B00BE8805 /* StreamEncryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756A64C52111083B00BE8805 /* StreamEncryptor.swift */; }; + 7571938E2816BFE3001C3AC0 /* CS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7571938D2816BFE3001C3AC0 /* CS.swift */; }; + 757DA2531A4ED0A4002BA3EF /* PaddingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2521A4ED0A4002BA3EF /* PaddingTests.swift */; }; + 757DA2551A4ED408002BA3EF /* AESTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2541A4ED408002BA3EF /* AESTests.swift */; }; + 757DA2591A4ED4D7002BA3EF /* ChaCha20Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 757DA2581A4ED4D7002BA3EF /* ChaCha20Tests.swift */; }; + 758A94291A65C67400E46135 /* HMACTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758A94271A65C59200E46135 /* HMACTests.swift */; }; + 758F95AB2072E8E20080D664 /* Bridging.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F95AA2072E8E10080D664 /* Bridging.h */; }; + 7594CCBC217A76DC0055C95D /* AESCCMTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 755E0303217A756F00065FC6 /* AESCCMTests.swift */; }; + 7595C14D2072E48C00EA1A5F /* TestsPerformance.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7595C14C2072E48C00EA1A5F /* TestsPerformance.swift */; }; + 7595C1582072E5B900EA1A5F /* DigestTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6EB20726319006688F8 /* DigestTestsPerf.swift */; }; + 7595C1592072E5B900EA1A5F /* AESTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6EE20726422006688F8 /* AESTestsPerf.swift */; }; + 7595C15A2072E5B900EA1A5F /* ChaCha20TestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F020728EAB006688F8 /* ChaCha20TestsPerf.swift */; }; + 7595C15B2072E5B900EA1A5F /* RabbitTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F220728F00006688F8 /* RabbitTestsPerf.swift */; }; + 7595C15C2072E5B900EA1A5F /* ExtensionsTestPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F420729069006688F8 /* ExtensionsTestPerf.swift */; }; + 7595C15D2072E5B900EA1A5F /* PBKDFPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7576F6F6207290F8006688F8 /* PBKDFPerf.swift */; }; + 7595C1602072E64900EA1A5F /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; }; + 75B3ED77210F9DF7005D4ADA /* BlockDecryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B3ED76210F9DF7005D4ADA /* BlockDecryptor.swift */; }; + 75B3ED79210FA016005D4ADA /* BlockEncryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75B3ED78210FA016005D4ADA /* BlockEncryptor.swift */; }; + 75B601EB197D6A6C0009B53D /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; }; + 75C2E76D1D55F097003D2BCA /* Access.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C2E76C1D55F097003D2BCA /* Access.swift */; }; + 75D7AF38208BFB1600D22BEB /* UInt128.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75D7AF37208BFB1600D22BEB /* UInt128.swift */; }; + 75EC527B1EE8B73A0048EB3B /* CryptoSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = 75EC527A1EE8B6CA0048EB3B /* CryptoSwift.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75EC527C1EE8B8130048EB3B /* AES.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52381EE8B6CA0048EB3B /* AES.swift */; }; + 75EC527D1EE8B8130048EB3B /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52391EE8B6CA0048EB3B /* Array+Extension.swift */; }; + 75EC527E1EE8B8130048EB3B /* Authenticator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC523A1EE8B6CA0048EB3B /* Authenticator.swift */; }; + 75EC527F1EE8B8130048EB3B /* BatchedCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC523B1EE8B6CA0048EB3B /* BatchedCollection.swift */; }; + 75EC52801EE8B8130048EB3B /* Bit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC523C1EE8B6CA0048EB3B /* Bit.swift */; }; + 75EC52811EE8B8130048EB3B /* BlockCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC523D1EE8B6CA0048EB3B /* BlockCipher.swift */; }; + 75EC52821EE8B8170048EB3B /* BlockMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC523F1EE8B6CA0048EB3B /* BlockMode.swift */; }; + 75EC52831EE8B8170048EB3B /* BlockModeOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52401EE8B6CA0048EB3B /* BlockModeOptions.swift */; }; + 75EC52841EE8B8170048EB3B /* CipherModeWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52411EE8B6CA0048EB3B /* CipherModeWorker.swift */; }; + 75EC52851EE8B8170048EB3B /* CBC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52421EE8B6CA0048EB3B /* CBC.swift */; }; + 75EC52861EE8B8170048EB3B /* CFB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52431EE8B6CA0048EB3B /* CFB.swift */; }; + 75EC52871EE8B8170048EB3B /* CTR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52441EE8B6CA0048EB3B /* CTR.swift */; }; + 75EC52881EE8B8170048EB3B /* ECB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52451EE8B6CA0048EB3B /* ECB.swift */; }; + 75EC52891EE8B8170048EB3B /* OFB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52461EE8B6CA0048EB3B /* OFB.swift */; }; + 75EC528A1EE8B8170048EB3B /* PCBC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52471EE8B6CA0048EB3B /* PCBC.swift */; }; + 75EC528D1EE8B81A0048EB3B /* ChaCha20.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC524A1EE8B6CA0048EB3B /* ChaCha20.swift */; }; + 75EC528E1EE8B81A0048EB3B /* Checksum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC524B1EE8B6CA0048EB3B /* Checksum.swift */; }; + 75EC528F1EE8B81A0048EB3B /* Cipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC524C1EE8B6CA0048EB3B /* Cipher.swift */; }; + 75EC52901EE8B81A0048EB3B /* Collection+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC524D1EE8B6CA0048EB3B /* Collection+Extension.swift */; }; + 75EC52911EE8B81A0048EB3B /* Cryptors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC524E1EE8B6CA0048EB3B /* Cryptors.swift */; }; + 75EC52931EE8B81A0048EB3B /* Digest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52501EE8B6CA0048EB3B /* Digest.swift */; }; + 75EC52941EE8B81A0048EB3B /* DigestType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52511EE8B6CA0048EB3B /* DigestType.swift */; }; + 75EC52971EE8B8200048EB3B /* ChaCha20+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52551EE8B6CA0048EB3B /* ChaCha20+Foundation.swift */; }; + 75EC52981EE8B8200048EB3B /* Array+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52561EE8B6CA0048EB3B /* Array+Foundation.swift */; }; + 75EC52991EE8B8200048EB3B /* Data+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52571EE8B6CA0048EB3B /* Data+Extension.swift */; }; + 75EC529A1EE8B8200048EB3B /* HMAC+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52581EE8B6CA0048EB3B /* HMAC+Foundation.swift */; }; + 75EC529B1EE8B8200048EB3B /* Rabbit+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52591EE8B6CA0048EB3B /* Rabbit+Foundation.swift */; }; + 75EC529C1EE8B8200048EB3B /* String+FoundationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC525A1EE8B6CA0048EB3B /* String+FoundationExtension.swift */; }; + 75EC529D1EE8B8200048EB3B /* Utils+Foundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC525B1EE8B6CA0048EB3B /* Utils+Foundation.swift */; }; + 75EC529E1EE8B8230048EB3B /* Generics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC525C1EE8B6CA0048EB3B /* Generics.swift */; }; + 75EC529F1EE8B8230048EB3B /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC525D1EE8B6CA0048EB3B /* HMAC.swift */; }; + 75EC52A01EE8B8290048EB3B /* Int+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC525F1EE8B6CA0048EB3B /* Int+Extension.swift */; }; + 75EC52A21EE8B8290048EB3B /* MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52611EE8B6CA0048EB3B /* MD5.swift */; }; + 75EC52A31EE8B8290048EB3B /* NoPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52621EE8B6CA0048EB3B /* NoPadding.swift */; }; + 75EC52A41EE8B8290048EB3B /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52631EE8B6CA0048EB3B /* Operators.swift */; }; + 75EC52A51EE8B8290048EB3B /* Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52641EE8B6CA0048EB3B /* Padding.swift */; }; + 75EC52A61EE8B8390048EB3B /* PBKDF1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52661EE8B6CA0048EB3B /* PBKDF1.swift */; }; + 75EC52A71EE8B8390048EB3B /* PBKDF2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52671EE8B6CA0048EB3B /* PBKDF2.swift */; }; + 75EC52A81EE8B8390048EB3B /* PKCS5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52681EE8B6CA0048EB3B /* PKCS5.swift */; }; + 75EC52A91EE8B83D0048EB3B /* PKCS7Padding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52691EE8B6CA0048EB3B /* PKCS7Padding.swift */; }; + 75EC52AA1EE8B83D0048EB3B /* Poly1305.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC526A1EE8B6CA0048EB3B /* Poly1305.swift */; }; + 75EC52AB1EE8B83D0048EB3B /* Rabbit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC526B1EE8B6CA0048EB3B /* Rabbit.swift */; }; + 75EC52AC1EE8B83D0048EB3B /* Cryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC526C1EE8B6CA0048EB3B /* Cryptor.swift */; }; + 75EC52AE1EE8B83D0048EB3B /* SecureBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC526E1EE8B6CA0048EB3B /* SecureBytes.swift */; }; + 75EC52AF1EE8B83D0048EB3B /* SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC526F1EE8B6CA0048EB3B /* SHA1.swift */; }; + 75EC52B01EE8B83D0048EB3B /* SHA2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52701EE8B6CA0048EB3B /* SHA2.swift */; }; + 75EC52B11EE8B83D0048EB3B /* SHA3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52711EE8B6CA0048EB3B /* SHA3.swift */; }; + 75EC52B21EE8B83D0048EB3B /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52721EE8B6CA0048EB3B /* String+Extension.swift */; }; + 75EC52B31EE8B83D0048EB3B /* UInt16+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52731EE8B6CA0048EB3B /* UInt16+Extension.swift */; }; + 75EC52B41EE8B83D0048EB3B /* UInt32+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52741EE8B6CA0048EB3B /* UInt32+Extension.swift */; }; + 75EC52B51EE8B83D0048EB3B /* UInt64+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52751EE8B6CA0048EB3B /* UInt64+Extension.swift */; }; + 75EC52B61EE8B83D0048EB3B /* UInt8+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52761EE8B6CA0048EB3B /* UInt8+Extension.swift */; }; + 75EC52B71EE8B83D0048EB3B /* Updatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52771EE8B6CA0048EB3B /* Updatable.swift */; }; + 75EC52B81EE8B83D0048EB3B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52781EE8B6CA0048EB3B /* Utils.swift */; }; + 75EC52B91EE8B83D0048EB3B /* ZeroPadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75EC52791EE8B6CA0048EB3B /* ZeroPadding.swift */; }; + 75F4E434216C93EF00F09710 /* CCM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F4E433216C93EF00F09710 /* CCM.swift */; }; + 75F4E436216C98DE00F09710 /* CBCMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F4E435216C98DE00F09710 /* CBCMAC.swift */; }; + 81F279DD2181F58300449EDA /* Scrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F279DC2181F58300449EDA /* Scrypt.swift */; }; + 81F279DF2181F5A000449EDA /* ScryptTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F279DE2181F5A000449EDA /* ScryptTests.swift */; }; + 81F279E12181F5C500449EDA /* ScryptTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F279E02181F5C500449EDA /* ScryptTestsPerf.swift */; }; + 81F279E22181F5C500449EDA /* ScryptTestsPerf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F279E02181F5C500449EDA /* ScryptTestsPerf.swift */; platformFilter = ios; }; + E3FD2D531D6B81CE00A9F35F /* Error+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3FD2D511D6B813C00A9F35F /* Error+Extension.swift */; }; + E6200E141FB9A7AE00258382 /* HKDF.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6200E131FB9A7AE00258382 /* HKDF.swift */; }; + E6200E171FB9B68C00258382 /* HKDFTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6200E151FB9B67C00258382 /* HKDFTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 7564F0502072EAEB00CA5A96 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 754BE45419693E190098E6F3; + remoteInfo = CryptoSwift; + }; + 7564F0612072EB5D00CA5A96 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75211F91207249D8004E41F8; + remoteInfo = "CryptoSwift-TestHostApp"; + }; + 7564F0662072ED7000CA5A96 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 754BE45419693E190098E6F3; + remoteInfo = CryptoSwift; + }; + 7595C15E2072E64000EA1A5F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 754BE45419693E190098E6F3; + remoteInfo = CryptoSwift; + }; + 75B601E3197D69EB0009B53D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 754BE45419693E190098E6F3; + remoteInfo = CryptoSwift; + }; + 75F9482120BDDF9900956311 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 754BE44C19693E190098E6F3 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 75211F91207249D8004E41F8; + remoteInfo = "CryptoSwift-TestHostApp"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 7564F0682072ED7000CA5A96 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 7564F0652072ED7000CA5A96 /* CryptoSwift.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 75B601E0197D69770009B53D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0AF023D4230F2B0F008E4E68 /* ISO78164Padding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ISO78164Padding.swift; sourceTree = ""; }; + 0EE73E70204D598100110E11 /* CMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMAC.swift; sourceTree = ""; }; + 0EE73E72204D599C00110E11 /* CMACTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CMACTests.swift; sourceTree = ""; }; + 14156CE42011422400DDCFBC /* ChaCha20Poly1305Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChaCha20Poly1305Tests.swift; sourceTree = ""; }; + 1467460E2017BB3600DF04ED /* AEAD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AEAD.swift; sourceTree = ""; }; + 35F3E51B23BF9A6700A024A1 /* OCB.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OCB.swift; sourceTree = ""; }; + 35F3E51D23BF9AD300A024A1 /* AESOCBTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AESOCBTests.swift; sourceTree = ""; }; + 42012782267A6F1C00F82506 /* ISO10126Padding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISO10126Padding.swift; sourceTree = ""; }; + 674A736E1BF5D85B00866C5B /* RabbitTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RabbitTests.swift; sourceTree = ""; }; + 6A7CDEEC26CD1E4C00FFB1AF /* RSATests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RSATests.swift; sourceTree = ""; }; + 6AC893E026DB950C00F7E787 /* Addition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Addition.swift; sourceTree = ""; }; + 6AC893E126DB950C00F7E787 /* Square Root.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Square Root.swift"; sourceTree = ""; }; + 6AC893E226DB950D00F7E787 /* GCD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GCD.swift; sourceTree = ""; }; + 6AC893E326DB950D00F7E787 /* Comparable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Comparable.swift; sourceTree = ""; }; + 6AC893E426DB950D00F7E787 /* Hashable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hashable.swift; sourceTree = ""; }; + 6AC893E526DB950D00F7E787 /* Bitwise Ops.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bitwise Ops.swift"; sourceTree = ""; }; + 6AC893E626DB950D00F7E787 /* Codable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Codable.swift; sourceTree = ""; }; + 6AC893E726DB950D00F7E787 /* Shifts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Shifts.swift; sourceTree = ""; }; + 6AC893E826DB950D00F7E787 /* Prime Test.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Prime Test.swift"; sourceTree = ""; }; + 6AC893E926DB950D00F7E787 /* Words and Bits.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Words and Bits.swift"; sourceTree = ""; }; + 6AC893EA26DB950D00F7E787 /* Subtraction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Subtraction.swift; sourceTree = ""; }; + 6AC893EB26DB950D00F7E787 /* Data Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data Conversion.swift"; sourceTree = ""; }; + 6AC893EC26DB950D00F7E787 /* Multiplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Multiplication.swift; sourceTree = ""; }; + 6AC893ED26DB950E00F7E787 /* Integer Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Integer Conversion.swift"; sourceTree = ""; }; + 6AC893EE26DB950E00F7E787 /* Floating Point Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Floating Point Conversion.swift"; sourceTree = ""; }; + 6AC893EF26DB950E00F7E787 /* Strideable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strideable.swift; sourceTree = ""; }; + 6AC893F026DB950E00F7E787 /* BigInt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigInt.swift; sourceTree = ""; }; + 6AC893F126DB950E00F7E787 /* Exponentiation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Exponentiation.swift; sourceTree = ""; }; + 6AC893F226DB950E00F7E787 /* Random.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; + 6AC893F326DB950E00F7E787 /* String Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String Conversion.swift"; sourceTree = ""; }; + 6AC893F426DB950E00F7E787 /* BigUInt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BigUInt.swift; sourceTree = ""; }; + 6AC893F526DB950E00F7E787 /* Division.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Division.swift; sourceTree = ""; }; + 750509981F6BEF2A00394A1B /* PKCS7.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PKCS7.swift; sourceTree = ""; }; + 7507705C28D61E78004A44DC /* RSA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RSA.swift; sourceTree = ""; }; + 7507705D28D61E78004A44DC /* RSA+Signature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RSA+Signature.swift"; sourceTree = ""; }; + 7507705E28D61E78004A44DC /* RSA+Cipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "RSA+Cipher.swift"; sourceTree = ""; }; + 7507706328D61E8B004A44DC /* DER.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DER.swift; sourceTree = ""; }; + 7507706628D61E97004A44DC /* ASN1Scanner.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASN1Scanner.swift; sourceTree = ""; }; + 7507706728D61E97004A44DC /* ASN1Encoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASN1Encoder.swift; sourceTree = ""; }; + 7507706828D61E97004A44DC /* ASN1Decoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASN1Decoder.swift; sourceTree = ""; }; + 7507706928D61E97004A44DC /* ASN1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASN1.swift; sourceTree = ""; }; + 7507706E28D61EBA004A44DC /* PKCS1v15.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PKCS1v15.swift; sourceTree = ""; }; + 7507707028D61ED5004A44DC /* Signature.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Signature.swift; sourceTree = ""; }; + 750CC3EA1DC0CACE0096BE6E /* BlowfishTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlowfishTests.swift; sourceTree = ""; }; + 75100F8E19B0BC890005C5F5 /* Poly1305Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Poly1305Tests.swift; sourceTree = ""; }; + 751EE9771F93996100161FFC /* AES.Cryptors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AES.Cryptors.swift; sourceTree = ""; }; + 75211F92207249D8004E41F8 /* CryptoSwift-TestHostApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "CryptoSwift-TestHostApp.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 75211F94207249D8004E41F8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75211FA0207249D8004E41F8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 75211FA520724A0F004E41F8 /* CryptoSwift-TestHostApp-Test.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-TestHostApp-Test.xcconfig"; sourceTree = ""; }; + 75211FA820724A0F004E41F8 /* CryptoSwift-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-Shared.xcconfig"; sourceTree = ""; }; + 75211FA920724A0F004E41F8 /* CryptoSwift-TestHostApp-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-TestHostApp-Shared.xcconfig"; sourceTree = ""; }; + 75211FAA20724A0F004E41F8 /* Project-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Project-Release.xcconfig"; sourceTree = ""; }; + 75211FAC20724A0F004E41F8 /* CryptoSwift-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-Release.xcconfig"; sourceTree = ""; }; + 75211FAE20724A10004E41F8 /* Tests-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Tests-Shared.xcconfig"; sourceTree = ""; }; + 75211FAF20724A10004E41F8 /* CryptoSwift-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-Debug.xcconfig"; sourceTree = ""; }; + 75211FB020724A10004E41F8 /* Project-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Project-Debug.xcconfig"; sourceTree = ""; }; + 75211FB120724A10004E41F8 /* Tests-Test.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Tests-Test.xcconfig"; sourceTree = ""; }; + 75211FB220724A10004E41F8 /* Project-Shared.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Project-Shared.xcconfig"; sourceTree = ""; }; + 75211FB420724A10004E41F8 /* CryptoSwift-Test.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "CryptoSwift-Test.xcconfig"; sourceTree = ""; }; + 7523742C2083C61C0016D662 /* GCM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GCM.swift; sourceTree = ""; }; + 7529366920683DFC00195874 /* AEADChaCha20Poly1305.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AEADChaCha20Poly1305.swift; sourceTree = ""; }; + 753674062175D012003E32A6 /* StreamDecryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StreamDecryptor.swift; sourceTree = ""; }; + 7536A93E207254A000F39140 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 754310432050111A003FB1DF /* CompactMap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompactMap.swift; sourceTree = ""; }; + 75482EA31CB310B7001F66A5 /* PBKDF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PBKDF.swift; sourceTree = ""; }; + 754BE45519693E190098E6F3 /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 754BE46019693E190098E6F3 /* CryptoSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CryptoSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 754BE46719693E190098E6F3 /* DigestTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DigestTests.swift; sourceTree = ""; }; + 755E0303217A756F00065FC6 /* AESCCMTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AESCCMTests.swift; sourceTree = ""; }; + 755FB1D9199E347D00475437 /* ExtensionsTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionsTest.swift; sourceTree = ""; }; + 7564F0602072EAEB00CA5A96 /* TestsPerformance-iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TestsPerformance-iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 756A64C52111083B00BE8805 /* StreamEncryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StreamEncryptor.swift; sourceTree = ""; }; + 756BFDCA1A82B87300B9D9A4 /* Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridging.h; sourceTree = ""; }; + 7571938D2816BFE3001C3AC0 /* CS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CS.swift; sourceTree = ""; }; + 7576F64C20725BD5006688F8 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + 7576F6EB20726319006688F8 /* DigestTestsPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DigestTestsPerf.swift; sourceTree = ""; }; + 7576F6EE20726422006688F8 /* AESTestsPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AESTestsPerf.swift; sourceTree = ""; }; + 7576F6F020728EAB006688F8 /* ChaCha20TestsPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChaCha20TestsPerf.swift; sourceTree = ""; }; + 7576F6F220728F00006688F8 /* RabbitTestsPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RabbitTestsPerf.swift; sourceTree = ""; }; + 7576F6F420729069006688F8 /* ExtensionsTestPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExtensionsTestPerf.swift; sourceTree = ""; }; + 7576F6F6207290F8006688F8 /* PBKDFPerf.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PBKDFPerf.swift; sourceTree = ""; }; + 757DA2521A4ED0A4002BA3EF /* PaddingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PaddingTests.swift; sourceTree = ""; }; + 757DA2541A4ED408002BA3EF /* AESTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AESTests.swift; sourceTree = ""; }; + 757DA2581A4ED4D7002BA3EF /* ChaCha20Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChaCha20Tests.swift; sourceTree = ""; }; + 758A94271A65C59200E46135 /* HMACTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMACTests.swift; sourceTree = ""; }; + 758F95AA2072E8E10080D664 /* Bridging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridging.h; sourceTree = ""; }; + 7595C14A2072E48C00EA1A5F /* TestsPerformance-Mac.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "TestsPerformance-Mac.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7595C14C2072E48C00EA1A5F /* TestsPerformance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestsPerformance.swift; sourceTree = ""; }; + 75B3ED76210F9DF7005D4ADA /* BlockDecryptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockDecryptor.swift; sourceTree = ""; }; + 75B3ED78210FA016005D4ADA /* BlockEncryptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockEncryptor.swift; sourceTree = ""; }; + 75C2E76C1D55F097003D2BCA /* Access.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Access.swift; sourceTree = ""; }; + 75D7AF37208BFB1600D22BEB /* UInt128.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UInt128.swift; sourceTree = ""; }; + 75EC52381EE8B6CA0048EB3B /* AES.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AES.swift; sourceTree = ""; }; + 75EC52391EE8B6CA0048EB3B /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; + 75EC523A1EE8B6CA0048EB3B /* Authenticator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Authenticator.swift; sourceTree = ""; }; + 75EC523B1EE8B6CA0048EB3B /* BatchedCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatchedCollection.swift; sourceTree = ""; }; + 75EC523C1EE8B6CA0048EB3B /* Bit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bit.swift; sourceTree = ""; }; + 75EC523D1EE8B6CA0048EB3B /* BlockCipher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockCipher.swift; sourceTree = ""; }; + 75EC523F1EE8B6CA0048EB3B /* BlockMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockMode.swift; sourceTree = ""; }; + 75EC52401EE8B6CA0048EB3B /* BlockModeOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockModeOptions.swift; sourceTree = ""; }; + 75EC52411EE8B6CA0048EB3B /* CipherModeWorker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CipherModeWorker.swift; sourceTree = ""; }; + 75EC52421EE8B6CA0048EB3B /* CBC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CBC.swift; sourceTree = ""; }; + 75EC52431EE8B6CA0048EB3B /* CFB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CFB.swift; sourceTree = ""; }; + 75EC52441EE8B6CA0048EB3B /* CTR.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CTR.swift; sourceTree = ""; }; + 75EC52451EE8B6CA0048EB3B /* ECB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ECB.swift; sourceTree = ""; }; + 75EC52461EE8B6CA0048EB3B /* OFB.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OFB.swift; sourceTree = ""; }; + 75EC52471EE8B6CA0048EB3B /* PCBC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PCBC.swift; sourceTree = ""; }; + 75EC52491EE8B6CA0048EB3B /* Blowfish.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Blowfish.swift; sourceTree = ""; }; + 75EC524A1EE8B6CA0048EB3B /* ChaCha20.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChaCha20.swift; sourceTree = ""; }; + 75EC524B1EE8B6CA0048EB3B /* Checksum.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Checksum.swift; sourceTree = ""; }; + 75EC524C1EE8B6CA0048EB3B /* Cipher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cipher.swift; sourceTree = ""; }; + 75EC524D1EE8B6CA0048EB3B /* Collection+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Collection+Extension.swift"; sourceTree = ""; }; + 75EC524E1EE8B6CA0048EB3B /* Cryptors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cryptors.swift; sourceTree = ""; }; + 75EC52501EE8B6CA0048EB3B /* Digest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Digest.swift; sourceTree = ""; }; + 75EC52511EE8B6CA0048EB3B /* DigestType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigestType.swift; sourceTree = ""; }; + 75EC52531EE8B6CA0048EB3B /* AES+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AES+Foundation.swift"; sourceTree = ""; }; + 75EC52541EE8B6CA0048EB3B /* Blowfish+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Blowfish+Foundation.swift"; sourceTree = ""; }; + 75EC52551EE8B6CA0048EB3B /* ChaCha20+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ChaCha20+Foundation.swift"; sourceTree = ""; }; + 75EC52561EE8B6CA0048EB3B /* Array+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Foundation.swift"; sourceTree = ""; }; + 75EC52571EE8B6CA0048EB3B /* Data+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Extension.swift"; sourceTree = ""; }; + 75EC52581EE8B6CA0048EB3B /* HMAC+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HMAC+Foundation.swift"; sourceTree = ""; }; + 75EC52591EE8B6CA0048EB3B /* Rabbit+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Rabbit+Foundation.swift"; sourceTree = ""; }; + 75EC525A1EE8B6CA0048EB3B /* String+FoundationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+FoundationExtension.swift"; sourceTree = ""; }; + 75EC525B1EE8B6CA0048EB3B /* Utils+Foundation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Utils+Foundation.swift"; sourceTree = ""; }; + 75EC525C1EE8B6CA0048EB3B /* Generics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Generics.swift; sourceTree = ""; }; + 75EC525D1EE8B6CA0048EB3B /* HMAC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = ""; }; + 75EC525F1EE8B6CA0048EB3B /* Int+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Int+Extension.swift"; sourceTree = ""; }; + 75EC52611EE8B6CA0048EB3B /* MD5.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MD5.swift; sourceTree = ""; }; + 75EC52621EE8B6CA0048EB3B /* NoPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoPadding.swift; sourceTree = ""; }; + 75EC52631EE8B6CA0048EB3B /* Operators.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Operators.swift; sourceTree = ""; }; + 75EC52641EE8B6CA0048EB3B /* Padding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Padding.swift; sourceTree = ""; }; + 75EC52661EE8B6CA0048EB3B /* PBKDF1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PBKDF1.swift; sourceTree = ""; }; + 75EC52671EE8B6CA0048EB3B /* PBKDF2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PBKDF2.swift; sourceTree = ""; }; + 75EC52681EE8B6CA0048EB3B /* PKCS5.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PKCS5.swift; sourceTree = ""; }; + 75EC52691EE8B6CA0048EB3B /* PKCS7Padding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PKCS7Padding.swift; sourceTree = ""; }; + 75EC526A1EE8B6CA0048EB3B /* Poly1305.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Poly1305.swift; sourceTree = ""; }; + 75EC526B1EE8B6CA0048EB3B /* Rabbit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rabbit.swift; sourceTree = ""; }; + 75EC526C1EE8B6CA0048EB3B /* Cryptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cryptor.swift; sourceTree = ""; }; + 75EC526E1EE8B6CA0048EB3B /* SecureBytes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBytes.swift; sourceTree = ""; }; + 75EC526F1EE8B6CA0048EB3B /* SHA1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SHA1.swift; sourceTree = ""; }; + 75EC52701EE8B6CA0048EB3B /* SHA2.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SHA2.swift; sourceTree = ""; }; + 75EC52711EE8B6CA0048EB3B /* SHA3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SHA3.swift; sourceTree = ""; }; + 75EC52721EE8B6CA0048EB3B /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; + 75EC52731EE8B6CA0048EB3B /* UInt16+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UInt16+Extension.swift"; sourceTree = ""; }; + 75EC52741EE8B6CA0048EB3B /* UInt32+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UInt32+Extension.swift"; sourceTree = ""; }; + 75EC52751EE8B6CA0048EB3B /* UInt64+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UInt64+Extension.swift"; sourceTree = ""; }; + 75EC52761EE8B6CA0048EB3B /* UInt8+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UInt8+Extension.swift"; sourceTree = ""; }; + 75EC52771EE8B6CA0048EB3B /* Updatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Updatable.swift; sourceTree = ""; }; + 75EC52781EE8B6CA0048EB3B /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; + 75EC52791EE8B6CA0048EB3B /* ZeroPadding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZeroPadding.swift; sourceTree = ""; }; + 75EC527A1EE8B6CA0048EB3B /* CryptoSwift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CryptoSwift.h; sourceTree = ""; }; + 75F4E433216C93EF00F09710 /* CCM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCM.swift; sourceTree = ""; }; + 75F4E435216C98DE00F09710 /* CBCMAC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CBCMAC.swift; sourceTree = ""; }; + 75F4E437216C9B5D00F09710 /* CHANGELOG */ = {isa = PBXFileReference; lastKnownFileType = text; path = CHANGELOG; sourceTree = SOURCE_ROOT; }; + 75F4E438216C9B6900F09710 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; + 81F279DC2181F58300449EDA /* Scrypt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Scrypt.swift; sourceTree = ""; }; + 81F279DE2181F5A000449EDA /* ScryptTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScryptTests.swift; sourceTree = ""; }; + 81F279E02181F5C500449EDA /* ScryptTestsPerf.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScryptTestsPerf.swift; sourceTree = ""; }; + E3FD2D511D6B813C00A9F35F /* Error+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Error+Extension.swift"; sourceTree = ""; }; + E6200E131FB9A7AE00258382 /* HKDF.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HKDF.swift; sourceTree = ""; }; + E6200E151FB9B67C00258382 /* HKDFTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HKDFTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 75211F8F207249D8004E41F8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7564F0642072ED7000CA5A96 /* CryptoSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45119693E190098E6F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45D19693E190098E6F3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 75B601EB197D6A6C0009B53D /* CryptoSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7564F0592072EAEB00CA5A96 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7564F05A2072EAEB00CA5A96 /* CryptoSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7595C1472072E48C00EA1A5F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7595C1602072E64900EA1A5F /* CryptoSwift.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 24B0BBA29D734E62809E53BC /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7536A93E207254A000F39140 /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6AC893DF26DB94F700F7E787 /* CS_BigInt */ = { + isa = PBXGroup; + children = ( + 6AC893E026DB950C00F7E787 /* Addition.swift */, + 6AC893F026DB950E00F7E787 /* BigInt.swift */, + 6AC893F426DB950E00F7E787 /* BigUInt.swift */, + 6AC893E526DB950D00F7E787 /* Bitwise Ops.swift */, + 6AC893E626DB950D00F7E787 /* Codable.swift */, + 6AC893E326DB950D00F7E787 /* Comparable.swift */, + 6AC893EB26DB950D00F7E787 /* Data Conversion.swift */, + 6AC893F526DB950E00F7E787 /* Division.swift */, + 6AC893F126DB950E00F7E787 /* Exponentiation.swift */, + 6AC893EE26DB950E00F7E787 /* Floating Point Conversion.swift */, + 6AC893E226DB950D00F7E787 /* GCD.swift */, + 6AC893E426DB950D00F7E787 /* Hashable.swift */, + 6AC893ED26DB950E00F7E787 /* Integer Conversion.swift */, + 6AC893EC26DB950D00F7E787 /* Multiplication.swift */, + 6AC893E826DB950D00F7E787 /* Prime Test.swift */, + 6AC893F226DB950E00F7E787 /* Random.swift */, + 6AC893E726DB950D00F7E787 /* Shifts.swift */, + 6AC893E126DB950C00F7E787 /* Square Root.swift */, + 6AC893EF26DB950E00F7E787 /* Strideable.swift */, + 6AC893F326DB950E00F7E787 /* String Conversion.swift */, + 6AC893EA26DB950D00F7E787 /* Subtraction.swift */, + 6AC893E926DB950D00F7E787 /* Words and Bits.swift */, + 7571938D2816BFE3001C3AC0 /* CS.swift */, + ); + path = CS_BigInt; + sourceTree = ""; + }; + 7507705B28D61E78004A44DC /* RSA */ = { + isa = PBXGroup; + children = ( + 7507705C28D61E78004A44DC /* RSA.swift */, + 7507705D28D61E78004A44DC /* RSA+Signature.swift */, + 7507705E28D61E78004A44DC /* RSA+Cipher.swift */, + ); + path = RSA; + sourceTree = ""; + }; + 7507706228D61E8B004A44DC /* PEM */ = { + isa = PBXGroup; + children = ( + 7507706328D61E8B004A44DC /* DER.swift */, + ); + path = PEM; + sourceTree = ""; + }; + 7507706528D61E97004A44DC /* ASN1 */ = { + isa = PBXGroup; + children = ( + 7507706628D61E97004A44DC /* ASN1Scanner.swift */, + 7507706728D61E97004A44DC /* ASN1Encoder.swift */, + 7507706828D61E97004A44DC /* ASN1Decoder.swift */, + 7507706928D61E97004A44DC /* ASN1.swift */, + ); + path = ASN1; + sourceTree = ""; + }; + 75211F93207249D8004E41F8 /* CryptoSwift-TestHostApp */ = { + isa = PBXGroup; + children = ( + 7576F64C20725BD5006688F8 /* Default-568h@2x.png */, + 75211F94207249D8004E41F8 /* AppDelegate.swift */, + 75211FA0207249D8004E41F8 /* Info.plist */, + ); + path = "CryptoSwift-TestHostApp"; + sourceTree = ""; + }; + 7529366820683DFC00195874 /* AEAD */ = { + isa = PBXGroup; + children = ( + 1467460E2017BB3600DF04ED /* AEAD.swift */, + 7529366920683DFC00195874 /* AEADChaCha20Poly1305.swift */, + ); + path = AEAD; + sourceTree = ""; + }; + 754BE44B19693E190098E6F3 = { + isa = PBXGroup; + children = ( + 75843E9A2072457A0050583A /* config */, + 75EC52361EE8B6CA0048EB3B /* Sources */, + 754BE46419693E190098E6F3 /* Tests */, + 7595C14B2072E48C00EA1A5F /* TestsPerformance */, + 75211F93207249D8004E41F8 /* CryptoSwift-TestHostApp */, + 754BE46519693E190098E6F3 /* Supporting Files */, + 754BE45619693E190098E6F3 /* Products */, + 24B0BBA29D734E62809E53BC /* Frameworks */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + 754BE45619693E190098E6F3 /* Products */ = { + isa = PBXGroup; + children = ( + 754BE45519693E190098E6F3 /* CryptoSwift.framework */, + 754BE46019693E190098E6F3 /* CryptoSwiftTests.xctest */, + 75211F92207249D8004E41F8 /* CryptoSwift-TestHostApp.app */, + 7595C14A2072E48C00EA1A5F /* TestsPerformance-Mac.xctest */, + 7564F0602072EAEB00CA5A96 /* TestsPerformance-iOS.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 754BE46419693E190098E6F3 /* Tests */ = { + isa = PBXGroup; + children = ( + 81F279DE2181F5A000449EDA /* ScryptTests.swift */, + 81F279E02181F5C500449EDA /* ScryptTestsPerf.swift */, + 14156CE42011422400DDCFBC /* ChaCha20Poly1305Tests.swift */, + E3FD2D511D6B813C00A9F35F /* Error+Extension.swift */, + 754BE46719693E190098E6F3 /* DigestTests.swift */, + 7576F6EB20726319006688F8 /* DigestTestsPerf.swift */, + 75100F8E19B0BC890005C5F5 /* Poly1305Tests.swift */, + 758A94271A65C59200E46135 /* HMACTests.swift */, + 0EE73E72204D599C00110E11 /* CMACTests.swift */, + E6200E151FB9B67C00258382 /* HKDFTests.swift */, + 757DA2541A4ED408002BA3EF /* AESTests.swift */, + 755E0303217A756F00065FC6 /* AESCCMTests.swift */, + 35F3E51D23BF9AD300A024A1 /* AESOCBTests.swift */, + 7576F6EE20726422006688F8 /* AESTestsPerf.swift */, + 750CC3EA1DC0CACE0096BE6E /* BlowfishTests.swift */, + 757DA2581A4ED4D7002BA3EF /* ChaCha20Tests.swift */, + 7576F6F020728EAB006688F8 /* ChaCha20TestsPerf.swift */, + 674A736E1BF5D85B00866C5B /* RabbitTests.swift */, + 7576F6F220728F00006688F8 /* RabbitTestsPerf.swift */, + 755FB1D9199E347D00475437 /* ExtensionsTest.swift */, + 7576F6F420729069006688F8 /* ExtensionsTestPerf.swift */, + 757DA2521A4ED0A4002BA3EF /* PaddingTests.swift */, + 75482EA31CB310B7001F66A5 /* PBKDF.swift */, + 7576F6F6207290F8006688F8 /* PBKDFPerf.swift */, + 6A7CDEEC26CD1E4C00FFB1AF /* RSATests.swift */, + 75C2E76C1D55F097003D2BCA /* Access.swift */, + 756BFDCA1A82B87300B9D9A4 /* Bridging.h */, + ); + name = Tests; + path = Tests/CryptoSwiftTests; + sourceTree = ""; + }; + 754BE46519693E190098E6F3 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 75F4E438216C9B6900F09710 /* README.md */, + 75F4E437216C9B5D00F09710 /* CHANGELOG */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 75843E9A2072457A0050583A /* config */ = { + isa = PBXGroup; + children = ( + 75211FAF20724A10004E41F8 /* CryptoSwift-Debug.xcconfig */, + 75211FAC20724A0F004E41F8 /* CryptoSwift-Release.xcconfig */, + 75211FA820724A0F004E41F8 /* CryptoSwift-Shared.xcconfig */, + 75211FB420724A10004E41F8 /* CryptoSwift-Test.xcconfig */, + 75211FA520724A0F004E41F8 /* CryptoSwift-TestHostApp-Test.xcconfig */, + 75211FA920724A0F004E41F8 /* CryptoSwift-TestHostApp-Shared.xcconfig */, + 75211FB020724A10004E41F8 /* Project-Debug.xcconfig */, + 75211FAA20724A0F004E41F8 /* Project-Release.xcconfig */, + 75211FB220724A10004E41F8 /* Project-Shared.xcconfig */, + 75211FAE20724A10004E41F8 /* Tests-Shared.xcconfig */, + 75211FB120724A10004E41F8 /* Tests-Test.xcconfig */, + ); + path = config; + sourceTree = ""; + }; + 7595C14B2072E48C00EA1A5F /* TestsPerformance */ = { + isa = PBXGroup; + children = ( + 758F95AA2072E8E10080D664 /* Bridging.h */, + 7595C14C2072E48C00EA1A5F /* TestsPerformance.swift */, + ); + name = TestsPerformance; + path = Tests/TestsPerformance; + sourceTree = ""; + }; + 75EC52361EE8B6CA0048EB3B /* Sources */ = { + isa = PBXGroup; + children = ( + 75EC52371EE8B6CA0048EB3B /* CryptoSwift */, + 75EC527A1EE8B6CA0048EB3B /* CryptoSwift.h */, + ); + path = Sources; + sourceTree = ""; + }; + 75EC52371EE8B6CA0048EB3B /* CryptoSwift */ = { + isa = PBXGroup; + children = ( + 7507706528D61E97004A44DC /* ASN1 */, + 7507706228D61E8B004A44DC /* PEM */, + 7507705B28D61E78004A44DC /* RSA */, + 0AF023D4230F2B0F008E4E68 /* ISO78164Padding.swift */, + 42012782267A6F1C00F82506 /* ISO10126Padding.swift */, + 7529366820683DFC00195874 /* AEAD */, + 75EC52381EE8B6CA0048EB3B /* AES.swift */, + 751EE9771F93996100161FFC /* AES.Cryptors.swift */, + 75EC52391EE8B6CA0048EB3B /* Array+Extension.swift */, + 75EC523A1EE8B6CA0048EB3B /* Authenticator.swift */, + 75EC523B1EE8B6CA0048EB3B /* BatchedCollection.swift */, + 6AC893DF26DB94F700F7E787 /* CS_BigInt */, + 75EC523C1EE8B6CA0048EB3B /* Bit.swift */, + 75EC523D1EE8B6CA0048EB3B /* BlockCipher.swift */, + 75EC523E1EE8B6CA0048EB3B /* BlockMode */, + 75EC52491EE8B6CA0048EB3B /* Blowfish.swift */, + 75EC524A1EE8B6CA0048EB3B /* ChaCha20.swift */, + 75EC524B1EE8B6CA0048EB3B /* Checksum.swift */, + 75EC524C1EE8B6CA0048EB3B /* Cipher.swift */, + 0EE73E70204D598100110E11 /* CMAC.swift */, + 75F4E435216C98DE00F09710 /* CBCMAC.swift */, + 75EC524D1EE8B6CA0048EB3B /* Collection+Extension.swift */, + 75EC524E1EE8B6CA0048EB3B /* Cryptors.swift */, + 75EC52501EE8B6CA0048EB3B /* Digest.swift */, + 75EC52511EE8B6CA0048EB3B /* DigestType.swift */, + 75EC52521EE8B6CA0048EB3B /* Foundation */, + 75EC525C1EE8B6CA0048EB3B /* Generics.swift */, + E6200E131FB9A7AE00258382 /* HKDF.swift */, + 75EC525D1EE8B6CA0048EB3B /* HMAC.swift */, + 75EC52611EE8B6CA0048EB3B /* MD5.swift */, + 75EC52621EE8B6CA0048EB3B /* NoPadding.swift */, + 75EC52631EE8B6CA0048EB3B /* Operators.swift */, + 75EC52641EE8B6CA0048EB3B /* Padding.swift */, + 75EC52651EE8B6CA0048EB3B /* PKCS */, + 75EC526A1EE8B6CA0048EB3B /* Poly1305.swift */, + 75EC526B1EE8B6CA0048EB3B /* Rabbit.swift */, + 75EC526C1EE8B6CA0048EB3B /* Cryptor.swift */, + 75EC526E1EE8B6CA0048EB3B /* SecureBytes.swift */, + 81F279DC2181F58300449EDA /* Scrypt.swift */, + 75EC526F1EE8B6CA0048EB3B /* SHA1.swift */, + 75EC52701EE8B6CA0048EB3B /* SHA2.swift */, + 75EC52711EE8B6CA0048EB3B /* SHA3.swift */, + 75EC52721EE8B6CA0048EB3B /* String+Extension.swift */, + 75EC525F1EE8B6CA0048EB3B /* Int+Extension.swift */, + 75EC52761EE8B6CA0048EB3B /* UInt8+Extension.swift */, + 75EC52731EE8B6CA0048EB3B /* UInt16+Extension.swift */, + 75EC52741EE8B6CA0048EB3B /* UInt32+Extension.swift */, + 75EC52751EE8B6CA0048EB3B /* UInt64+Extension.swift */, + 75D7AF37208BFB1600D22BEB /* UInt128.swift */, + 75EC52771EE8B6CA0048EB3B /* Updatable.swift */, + 75EC52781EE8B6CA0048EB3B /* Utils.swift */, + 75EC52791EE8B6CA0048EB3B /* ZeroPadding.swift */, + 754310432050111A003FB1DF /* CompactMap.swift */, + 75B3ED76210F9DF7005D4ADA /* BlockDecryptor.swift */, + 75B3ED78210FA016005D4ADA /* BlockEncryptor.swift */, + 753674062175D012003E32A6 /* StreamDecryptor.swift */, + 756A64C52111083B00BE8805 /* StreamEncryptor.swift */, + 7507707028D61ED5004A44DC /* Signature.swift */, + ); + path = CryptoSwift; + sourceTree = ""; + }; + 75EC523E1EE8B6CA0048EB3B /* BlockMode */ = { + isa = PBXGroup; + children = ( + 75EC523F1EE8B6CA0048EB3B /* BlockMode.swift */, + 75EC52401EE8B6CA0048EB3B /* BlockModeOptions.swift */, + 75EC52411EE8B6CA0048EB3B /* CipherModeWorker.swift */, + 75EC52421EE8B6CA0048EB3B /* CBC.swift */, + 75EC52431EE8B6CA0048EB3B /* CFB.swift */, + 75EC52441EE8B6CA0048EB3B /* CTR.swift */, + 7523742C2083C61C0016D662 /* GCM.swift */, + 75F4E433216C93EF00F09710 /* CCM.swift */, + 75EC52451EE8B6CA0048EB3B /* ECB.swift */, + 75EC52461EE8B6CA0048EB3B /* OFB.swift */, + 75EC52471EE8B6CA0048EB3B /* PCBC.swift */, + 35F3E51B23BF9A6700A024A1 /* OCB.swift */, + ); + path = BlockMode; + sourceTree = ""; + }; + 75EC52521EE8B6CA0048EB3B /* Foundation */ = { + isa = PBXGroup; + children = ( + 75EC52531EE8B6CA0048EB3B /* AES+Foundation.swift */, + 75EC52541EE8B6CA0048EB3B /* Blowfish+Foundation.swift */, + 75EC52551EE8B6CA0048EB3B /* ChaCha20+Foundation.swift */, + 75EC52561EE8B6CA0048EB3B /* Array+Foundation.swift */, + 75EC52571EE8B6CA0048EB3B /* Data+Extension.swift */, + 75EC52581EE8B6CA0048EB3B /* HMAC+Foundation.swift */, + 75EC52591EE8B6CA0048EB3B /* Rabbit+Foundation.swift */, + 75EC525A1EE8B6CA0048EB3B /* String+FoundationExtension.swift */, + 75EC525B1EE8B6CA0048EB3B /* Utils+Foundation.swift */, + ); + path = Foundation; + sourceTree = ""; + }; + 75EC52651EE8B6CA0048EB3B /* PKCS */ = { + isa = PBXGroup; + children = ( + 75EC52691EE8B6CA0048EB3B /* PKCS7Padding.swift */, + 75EC52661EE8B6CA0048EB3B /* PBKDF1.swift */, + 75EC52671EE8B6CA0048EB3B /* PBKDF2.swift */, + 7507706E28D61EBA004A44DC /* PKCS1v15.swift */, + 75EC52681EE8B6CA0048EB3B /* PKCS5.swift */, + 750509981F6BEF2A00394A1B /* PKCS7.swift */, + ); + path = PKCS; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 754BE45219693E190098E6F3 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 758F95AB2072E8E20080D664 /* Bridging.h in Headers */, + 75EC527B1EE8B73A0048EB3B /* CryptoSwift.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 75211F91207249D8004E41F8 /* CryptoSwift-TestHostApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 75211FA4207249D8004E41F8 /* Build configuration list for PBXNativeTarget "CryptoSwift-TestHostApp" */; + buildPhases = ( + 75211F8E207249D8004E41F8 /* Sources */, + 75211F8F207249D8004E41F8 /* Frameworks */, + 75211F90207249D8004E41F8 /* Resources */, + 7564F0682072ED7000CA5A96 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 7564F0672072ED7000CA5A96 /* PBXTargetDependency */, + ); + name = "CryptoSwift-TestHostApp"; + productName = "CryptoSwift-TestHostApp"; + productReference = 75211F92207249D8004E41F8 /* CryptoSwift-TestHostApp.app */; + productType = "com.apple.product-type.application"; + }; + 754BE45419693E190098E6F3 /* CryptoSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 754BE46B19693E190098E6F3 /* Build configuration list for PBXNativeTarget "CryptoSwift" */; + buildPhases = ( + 754BE45219693E190098E6F3 /* Headers */, + 754BE45019693E190098E6F3 /* Sources */, + 754BE45119693E190098E6F3 /* Frameworks */, + 754BE45319693E190098E6F3 /* Resources */, + 75B601E0197D69770009B53D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CryptoSwift; + packageProductDependencies = ( + ); + productName = CryptoSwift; + productReference = 754BE45519693E190098E6F3 /* CryptoSwift.framework */; + productType = "com.apple.product-type.framework"; + }; + 754BE45F19693E190098E6F3 /* CryptoSwiftTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 754BE46E19693E190098E6F3 /* Build configuration list for PBXNativeTarget "CryptoSwiftTests" */; + buildPhases = ( + 754BE45C19693E190098E6F3 /* Sources */, + 754BE45D19693E190098E6F3 /* Frameworks */, + 754BE45E19693E190098E6F3 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 75B601E4197D69EB0009B53D /* PBXTargetDependency */, + 75F9482220BDDF9900956311 /* PBXTargetDependency */, + ); + name = CryptoSwiftTests; + productName = Tests; + productReference = 754BE46019693E190098E6F3 /* CryptoSwiftTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 7564F04E2072EAEB00CA5A96 /* TestsPerformance-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7564F05C2072EAEB00CA5A96 /* Build configuration list for PBXNativeTarget "TestsPerformance-iOS" */; + buildPhases = ( + 7564F0512072EAEB00CA5A96 /* Sources */, + 7564F0592072EAEB00CA5A96 /* Frameworks */, + 7564F05B2072EAEB00CA5A96 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7564F04F2072EAEB00CA5A96 /* PBXTargetDependency */, + 7564F0622072EB5D00CA5A96 /* PBXTargetDependency */, + ); + name = "TestsPerformance-iOS"; + productName = TestsPerformance; + productReference = 7564F0602072EAEB00CA5A96 /* TestsPerformance-iOS.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 7595C1492072E48C00EA1A5F /* TestsPerformance-Mac */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7595C1522072E48C00EA1A5F /* Build configuration list for PBXNativeTarget "TestsPerformance-Mac" */; + buildPhases = ( + 7595C1462072E48C00EA1A5F /* Sources */, + 7595C1472072E48C00EA1A5F /* Frameworks */, + 7595C1482072E48C00EA1A5F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7595C15F2072E64000EA1A5F /* PBXTargetDependency */, + ); + name = "TestsPerformance-Mac"; + productName = TestsPerformance; + productReference = 7595C14A2072E48C00EA1A5F /* TestsPerformance-Mac.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 754BE44C19693E190098E6F3 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0930; + LastUpgradeCheck = 1400; + ORGANIZATIONNAME = "Marcin Krzyzanowski"; + TargetAttributes = { + 75211F91207249D8004E41F8 = { + CreatedOnToolsVersion = 9.3; + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + }; + 754BE45419693E190098E6F3 = { + CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + }; + 754BE45F19693E190098E6F3 = { + CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + }; + 7564F04E2072EAEB00CA5A96 = { + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + TestTargetID = 75211F91207249D8004E41F8; + }; + 7595C1492072E48C00EA1A5F = { + CreatedOnToolsVersion = 9.3; + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 754BE44F19693E190098E6F3 /* Build configuration list for PBXProject "CryptoSwift" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 754BE44B19693E190098E6F3; + packageReferences = ( + ); + productRefGroup = 754BE45619693E190098E6F3 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 754BE45419693E190098E6F3 /* CryptoSwift */, + 75211F91207249D8004E41F8 /* CryptoSwift-TestHostApp */, + 754BE45F19693E190098E6F3 /* CryptoSwiftTests */, + 7595C1492072E48C00EA1A5F /* TestsPerformance-Mac */, + 7564F04E2072EAEB00CA5A96 /* TestsPerformance-iOS */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 75211F90207249D8004E41F8 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 755BA296235387700039CAB5 /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45319693E190098E6F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45E19693E190098E6F3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7564F05B2072EAEB00CA5A96 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7595C1482072E48C00EA1A5F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 75211F8E207249D8004E41F8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 75211F95207249D8004E41F8 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45019693E190098E6F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7507705F28D61E78004A44DC /* RSA.swift in Sources */, + 42012783267A6F1C00F82506 /* ISO10126Padding.swift in Sources */, + 6AC8940926DB950F00F7E787 /* String Conversion.swift in Sources */, + 6AC8940226DB950F00F7E787 /* Multiplication.swift in Sources */, + 0AF023D5230F2B0F008E4E68 /* ISO78164Padding.swift in Sources */, + 75EC52861EE8B8170048EB3B /* CFB.swift in Sources */, + 6AC893FF26DB950F00F7E787 /* Words and Bits.swift in Sources */, + 75EC52901EE8B81A0048EB3B /* Collection+Extension.swift in Sources */, + 0EE73E71204D598100110E11 /* CMAC.swift in Sources */, + 7523742D2083C61D0016D662 /* GCM.swift in Sources */, + 75F4E436216C98DE00F09710 /* CBCMAC.swift in Sources */, + 752BED9F208C135700FC4743 /* AES+Foundation.swift in Sources */, + E6200E141FB9A7AE00258382 /* HKDF.swift in Sources */, + 75EC529F1EE8B8230048EB3B /* HMAC.swift in Sources */, + 75EC52B91EE8B83D0048EB3B /* ZeroPadding.swift in Sources */, + 7507706428D61E8B004A44DC /* DER.swift in Sources */, + 7529366A20683DFC00195874 /* AEADChaCha20Poly1305.swift in Sources */, + 6AC893FA26DB950F00F7E787 /* Hashable.swift in Sources */, + 75EC529E1EE8B8230048EB3B /* Generics.swift in Sources */, + 75EC52AA1EE8B83D0048EB3B /* Poly1305.swift in Sources */, + 75EC52AC1EE8B83D0048EB3B /* Cryptor.swift in Sources */, + 75EC52821EE8B8170048EB3B /* BlockMode.swift in Sources */, + 75EC52AE1EE8B83D0048EB3B /* SecureBytes.swift in Sources */, + 6AC893FC26DB950F00F7E787 /* Codable.swift in Sources */, + 6AC8940126DB950F00F7E787 /* Data Conversion.swift in Sources */, + 75EC528F1EE8B81A0048EB3B /* Cipher.swift in Sources */, + 75B3ED79210FA016005D4ADA /* BlockEncryptor.swift in Sources */, + 75EC52A01EE8B8290048EB3B /* Int+Extension.swift in Sources */, + 7507706028D61E78004A44DC /* RSA+Signature.swift in Sources */, + 75EC52B01EE8B83D0048EB3B /* SHA2.swift in Sources */, + 6AC893F626DB950F00F7E787 /* Addition.swift in Sources */, + 752BED9D208C120D00FC4743 /* Blowfish+Foundation.swift in Sources */, + 75EC52B71EE8B83D0048EB3B /* Updatable.swift in Sources */, + 75EC528E1EE8B81A0048EB3B /* Checksum.swift in Sources */, + 754310442050111A003FB1DF /* CompactMap.swift in Sources */, + 7507706B28D61E97004A44DC /* ASN1Encoder.swift in Sources */, + 75EC52811EE8B8130048EB3B /* BlockCipher.swift in Sources */, + 75EC52941EE8B81A0048EB3B /* DigestType.swift in Sources */, + 75EC529B1EE8B8200048EB3B /* Rabbit+Foundation.swift in Sources */, + 6AC893F926DB950F00F7E787 /* Comparable.swift in Sources */, + 756A64C62111083B00BE8805 /* StreamEncryptor.swift in Sources */, + 6AC8940726DB950F00F7E787 /* Exponentiation.swift in Sources */, + 6AC8940026DB950F00F7E787 /* Subtraction.swift in Sources */, + 75EC52A61EE8B8390048EB3B /* PBKDF1.swift in Sources */, + 6AC893FB26DB950F00F7E787 /* Bitwise Ops.swift in Sources */, + 75EC52B41EE8B83D0048EB3B /* UInt32+Extension.swift in Sources */, + 6AC8940526DB950F00F7E787 /* Strideable.swift in Sources */, + 75EC52911EE8B81A0048EB3B /* Cryptors.swift in Sources */, + 6AC893F726DB950F00F7E787 /* Square Root.swift in Sources */, + 75EC52881EE8B8170048EB3B /* ECB.swift in Sources */, + 75EC52841EE8B8170048EB3B /* CipherModeWorker.swift in Sources */, + 75EC52A41EE8B8290048EB3B /* Operators.swift in Sources */, + 75EC529A1EE8B8200048EB3B /* HMAC+Foundation.swift in Sources */, + 6AC8940826DB950F00F7E787 /* Random.swift in Sources */, + 75EC52B21EE8B83D0048EB3B /* String+Extension.swift in Sources */, + 750509991F6BEF2A00394A1B /* PKCS7.swift in Sources */, + 7507706C28D61E97004A44DC /* ASN1Decoder.swift in Sources */, + 75EC52B51EE8B83D0048EB3B /* UInt64+Extension.swift in Sources */, + 7507707128D61ED5004A44DC /* Signature.swift in Sources */, + 75EC52AF1EE8B83D0048EB3B /* SHA1.swift in Sources */, + 75EC52801EE8B8130048EB3B /* Bit.swift in Sources */, + 7507706D28D61E97004A44DC /* ASN1.swift in Sources */, + 6AC8940326DB950F00F7E787 /* Integer Conversion.swift in Sources */, + 75EC52971EE8B8200048EB3B /* ChaCha20+Foundation.swift in Sources */, + 75F4E434216C93EF00F09710 /* CCM.swift in Sources */, + 75EC52871EE8B8170048EB3B /* CTR.swift in Sources */, + 6AC893FD26DB950F00F7E787 /* Shifts.swift in Sources */, + 75EC52A21EE8B8290048EB3B /* MD5.swift in Sources */, + 75EC527C1EE8B8130048EB3B /* AES.swift in Sources */, + 752BED9E208C121000FC4743 /* Blowfish.swift in Sources */, + 75EC52A91EE8B83D0048EB3B /* PKCS7Padding.swift in Sources */, + 75EC52A51EE8B8290048EB3B /* Padding.swift in Sources */, + 7507706128D61E78004A44DC /* RSA+Cipher.swift in Sources */, + 6AC8940A26DB950F00F7E787 /* BigUInt.swift in Sources */, + 75EC527F1EE8B8130048EB3B /* BatchedCollection.swift in Sources */, + 75EC52991EE8B8200048EB3B /* Data+Extension.swift in Sources */, + 6AC8940426DB950F00F7E787 /* Floating Point Conversion.swift in Sources */, + 75EC52B61EE8B83D0048EB3B /* UInt8+Extension.swift in Sources */, + 75EC52891EE8B8170048EB3B /* OFB.swift in Sources */, + 75EC52831EE8B8170048EB3B /* BlockModeOptions.swift in Sources */, + 753674072175D012003E32A6 /* StreamDecryptor.swift in Sources */, + 6AC8940626DB950F00F7E787 /* BigInt.swift in Sources */, + 751EE9781F93996100161FFC /* AES.Cryptors.swift in Sources */, + 75EC527D1EE8B8130048EB3B /* Array+Extension.swift in Sources */, + 75D7AF38208BFB1600D22BEB /* UInt128.swift in Sources */, + 7571938E2816BFE3001C3AC0 /* CS.swift in Sources */, + 75EC52B31EE8B83D0048EB3B /* UInt16+Extension.swift in Sources */, + 75EC52A81EE8B8390048EB3B /* PKCS5.swift in Sources */, + 1467460F2017BB3600DF04ED /* AEAD.swift in Sources */, + 35F3E51C23BF9A6700A024A1 /* OCB.swift in Sources */, + 6AC8940B26DB950F00F7E787 /* Division.swift in Sources */, + 75EC528A1EE8B8170048EB3B /* PCBC.swift in Sources */, + 75EC528D1EE8B81A0048EB3B /* ChaCha20.swift in Sources */, + 75EC52851EE8B8170048EB3B /* CBC.swift in Sources */, + 75EC52A71EE8B8390048EB3B /* PBKDF2.swift in Sources */, + 75EC529D1EE8B8200048EB3B /* Utils+Foundation.swift in Sources */, + 6AC893FE26DB950F00F7E787 /* Prime Test.swift in Sources */, + 75EC527E1EE8B8130048EB3B /* Authenticator.swift in Sources */, + 7507706A28D61E97004A44DC /* ASN1Scanner.swift in Sources */, + 75EC52AB1EE8B83D0048EB3B /* Rabbit.swift in Sources */, + 75B3ED77210F9DF7005D4ADA /* BlockDecryptor.swift in Sources */, + 7507706F28D61EBA004A44DC /* PKCS1v15.swift in Sources */, + 75EC529C1EE8B8200048EB3B /* String+FoundationExtension.swift in Sources */, + 75EC52B81EE8B83D0048EB3B /* Utils.swift in Sources */, + 75EC52981EE8B8200048EB3B /* Array+Foundation.swift in Sources */, + 75EC52B11EE8B83D0048EB3B /* SHA3.swift in Sources */, + 75EC52A31EE8B8290048EB3B /* NoPadding.swift in Sources */, + 6AC893F826DB950F00F7E787 /* GCD.swift in Sources */, + 81F279DD2181F58300449EDA /* Scrypt.swift in Sources */, + 75EC52931EE8B81A0048EB3B /* Digest.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 754BE45C19693E190098E6F3 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 751AA0F3255F4EB600D4719E /* AESOCBTests.swift in Sources */, + 75C2E76D1D55F097003D2BCA /* Access.swift in Sources */, + 75482EA41CB310B7001F66A5 /* PBKDF.swift in Sources */, + 758A94291A65C67400E46135 /* HMACTests.swift in Sources */, + 75100F8F19B0BC890005C5F5 /* Poly1305Tests.swift in Sources */, + E6200E171FB9B68C00258382 /* HKDFTests.swift in Sources */, + 754BE46819693E190098E6F3 /* DigestTests.swift in Sources */, + E3FD2D531D6B81CE00A9F35F /* Error+Extension.swift in Sources */, + 757DA2591A4ED4D7002BA3EF /* ChaCha20Tests.swift in Sources */, + 755FB1DA199E347D00475437 /* ExtensionsTest.swift in Sources */, + 81F279DF2181F5A000449EDA /* ScryptTests.swift in Sources */, + 674A736F1BF5D85B00866C5B /* RabbitTests.swift in Sources */, + 0EE73E74204D59C200110E11 /* CMACTests.swift in Sources */, + 6A7CDEED26CD1E4C00FFB1AF /* RSATests.swift in Sources */, + 750CC3EB1DC0CACE0096BE6E /* BlowfishTests.swift in Sources */, + 757DA2531A4ED0A4002BA3EF /* PaddingTests.swift in Sources */, + 14156CE52011422400DDCFBC /* ChaCha20Poly1305Tests.swift in Sources */, + 757DA2551A4ED408002BA3EF /* AESTests.swift in Sources */, + 7594CCBC217A76DC0055C95D /* AESCCMTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7564F0512072EAEB00CA5A96 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7564F0522072EAEB00CA5A96 /* PBKDFPerf.swift in Sources */, + 7564F0532072EAEB00CA5A96 /* ChaCha20TestsPerf.swift in Sources */, + 7564F0542072EAEB00CA5A96 /* RabbitTestsPerf.swift in Sources */, + 7564F0552072EAEB00CA5A96 /* ExtensionsTestPerf.swift in Sources */, + 7564F0562072EAEB00CA5A96 /* DigestTestsPerf.swift in Sources */, + 81F279E22181F5C500449EDA /* ScryptTestsPerf.swift in Sources */, + 7564F0572072EAEB00CA5A96 /* TestsPerformance.swift in Sources */, + 7564F0582072EAEB00CA5A96 /* AESTestsPerf.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7595C1462072E48C00EA1A5F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7595C15D2072E5B900EA1A5F /* PBKDFPerf.swift in Sources */, + 7595C15A2072E5B900EA1A5F /* ChaCha20TestsPerf.swift in Sources */, + 7595C15B2072E5B900EA1A5F /* RabbitTestsPerf.swift in Sources */, + 7595C15C2072E5B900EA1A5F /* ExtensionsTestPerf.swift in Sources */, + 7595C1582072E5B900EA1A5F /* DigestTestsPerf.swift in Sources */, + 81F279E12181F5C500449EDA /* ScryptTestsPerf.swift in Sources */, + 7595C14D2072E48C00EA1A5F /* TestsPerformance.swift in Sources */, + 7595C1592072E5B900EA1A5F /* AESTestsPerf.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7564F04F2072EAEB00CA5A96 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 754BE45419693E190098E6F3 /* CryptoSwift */; + targetProxy = 7564F0502072EAEB00CA5A96 /* PBXContainerItemProxy */; + }; + 7564F0622072EB5D00CA5A96 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilter = ios; + target = 75211F91207249D8004E41F8 /* CryptoSwift-TestHostApp */; + targetProxy = 7564F0612072EB5D00CA5A96 /* PBXContainerItemProxy */; + }; + 7564F0672072ED7000CA5A96 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 754BE45419693E190098E6F3 /* CryptoSwift */; + targetProxy = 7564F0662072ED7000CA5A96 /* PBXContainerItemProxy */; + }; + 7595C15F2072E64000EA1A5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 754BE45419693E190098E6F3 /* CryptoSwift */; + targetProxy = 7595C15E2072E64000EA1A5F /* PBXContainerItemProxy */; + }; + 75B601E4197D69EB0009B53D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 754BE45419693E190098E6F3 /* CryptoSwift */; + targetProxy = 75B601E3197D69EB0009B53D /* PBXContainerItemProxy */; + }; + 75F9482220BDDF9900956311 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + platformFilter = ios; + target = 75211F91207249D8004E41F8 /* CryptoSwift-TestHostApp */; + targetProxy = 75F9482120BDDF9900956311 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 75211FA1207249D8004E41F8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 75211FA2207249D8004E41F8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 75211FA3207249D8004E41F8 /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FA520724A0F004E41F8 /* CryptoSwift-TestHostApp-Test.xcconfig */; + buildSettings = { + }; + name = Test; + }; + 754BE46919693E190098E6F3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB020724A10004E41F8 /* Project-Debug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 754BE46A19693E190098E6F3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FAA20724A0F004E41F8 /* Project-Release.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 754BE46C19693E190098E6F3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FAF20724A10004E41F8 /* CryptoSwift-Debug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 754BE46D19693E190098E6F3 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FAC20724A0F004E41F8 /* CryptoSwift-Release.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 754BE46F19693E190098E6F3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 754BE47019693E190098E6F3 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 7564F05D2072EAEB00CA5A96 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + SDKROOT = iphoneos; + }; + name = Debug; + }; + 7564F05E2072EAEB00CA5A96 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + SDKROOT = iphoneos; + }; + name = Release; + }; + 7564F05F2072EAEB00CA5A96 /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB120724A10004E41F8 /* Tests-Test.xcconfig */; + buildSettings = { + SDKROOT = iphoneos; + }; + name = Test; + }; + 756B66AA1F6AAFDB00DEC41C /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB220724A10004E41F8 /* Project-Shared.xcconfig */; + buildSettings = { + }; + name = Test; + }; + 756B66AB1F6AAFDB00DEC41C /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB420724A10004E41F8 /* CryptoSwift-Test.xcconfig */; + buildSettings = { + }; + name = Test; + }; + 756B66AC1F6AAFDB00DEC41C /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB120724A10004E41F8 /* Tests-Test.xcconfig */; + buildSettings = { + }; + name = Test; + }; + 7595C14F2072E48C00EA1A5F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Debug; + }; + 7595C1502072E48C00EA1A5F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + }; + name = Release; + }; + 7595C1512072E48C00EA1A5F /* Test */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75211FB120724A10004E41F8 /* Tests-Test.xcconfig */; + buildSettings = { + }; + name = Test; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 75211FA4207249D8004E41F8 /* Build configuration list for PBXNativeTarget "CryptoSwift-TestHostApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 75211FA1207249D8004E41F8 /* Debug */, + 75211FA2207249D8004E41F8 /* Release */, + 75211FA3207249D8004E41F8 /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 754BE44F19693E190098E6F3 /* Build configuration list for PBXProject "CryptoSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 754BE46919693E190098E6F3 /* Debug */, + 754BE46A19693E190098E6F3 /* Release */, + 756B66AA1F6AAFDB00DEC41C /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 754BE46B19693E190098E6F3 /* Build configuration list for PBXNativeTarget "CryptoSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 754BE46C19693E190098E6F3 /* Debug */, + 754BE46D19693E190098E6F3 /* Release */, + 756B66AB1F6AAFDB00DEC41C /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 754BE46E19693E190098E6F3 /* Build configuration list for PBXNativeTarget "CryptoSwiftTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 754BE46F19693E190098E6F3 /* Debug */, + 754BE47019693E190098E6F3 /* Release */, + 756B66AC1F6AAFDB00DEC41C /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7564F05C2072EAEB00CA5A96 /* Build configuration list for PBXNativeTarget "TestsPerformance-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7564F05D2072EAEB00CA5A96 /* Debug */, + 7564F05E2072EAEB00CA5A96 /* Release */, + 7564F05F2072EAEB00CA5A96 /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7595C1522072E48C00EA1A5F /* Build configuration list for PBXNativeTarget "TestsPerformance-Mac" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7595C14F2072E48C00EA1A5F /* Debug */, + 7595C1502072E48C00EA1A5F /* Release */, + 7595C1512072E48C00EA1A5F /* Test */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 754BE44C19693E190098E6F3 /* Project object */; +} diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..3f9cecc0 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/CryptoSwift.xcscmblueprint b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/CryptoSwift.xcscmblueprint new file mode 100644 index 00000000..e69de29b diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/IDETemplateMacros.plist b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/IDETemplateMacros.plist new file mode 120000 index 00000000..64dc763b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/IDETemplateMacros.plist @@ -0,0 +1 @@ +../../IDETemplateMacros.plist \ No newline at end of file diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift-TestHostApp.xcscheme b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift-TestHostApp.xcscheme new file mode 100644 index 00000000..44f2dc87 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift-TestHostApp.xcscheme @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift.xcscheme b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift.xcscheme new file mode 100644 index 00000000..af2b6115 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/CryptoSwift.xcscheme @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme new file mode 100644 index 00000000..9aa62cdd --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-Mac.xcscheme b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-Mac.xcscheme new file mode 100644 index 00000000..79425a11 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-Mac.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-iOS.xcscheme b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-iOS.xcscheme new file mode 100644 index 00000000..36cc6e95 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/CryptoSwift.xcodeproj/xcshareddata/xcschemes/TestsPerformance-iOS.xcscheme @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/CryptoSwift/IDETemplateMacros.plist b/Carthage/Checkouts/CryptoSwift/IDETemplateMacros.plist new file mode 100644 index 00000000..e42562a4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/IDETemplateMacros.plist @@ -0,0 +1,20 @@ + + + + + FILEHEADER + // CryptoSwift +// +// Copyright (C) 2014-__YEAR__ Marcin Krzyżanowski <marcin@krzyzanowskim.com> +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + + diff --git a/Carthage/Checkouts/CryptoSwift/Info.plist b/Carthage/Checkouts/CryptoSwift/Info.plist new file mode 100644 index 00000000..187703aa --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/CryptoSwift/LICENSE b/Carthage/Checkouts/CryptoSwift/LICENSE new file mode 100644 index 00000000..e52af7df --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/LICENSE @@ -0,0 +1,11 @@ +Copyright (C) 2014-2017 Marcin Krzyżanowski +This software is provided 'as-is', without any express or implied warranty. + +In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +- The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +- Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +- This notice may not be removed or altered from any source or binary distribution. +- Redistributions of any form whatsoever must retain the following acknowledgment: 'This product includes software developed by the "Marcin Krzyzanowski" (http://krzyzanowskim.com/).' diff --git a/Carthage/Checkouts/CryptoSwift/Makefile b/Carthage/Checkouts/CryptoSwift/Makefile new file mode 100644 index 00000000..8b259431 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Makefile @@ -0,0 +1,9 @@ +.PHONY: frameworks + +CWD := $(abspath $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))) + +frameworks: + $(CWD)/scripts/build-framework.sh + @echo "Framework built in $(CWD)/CryptoSwift.xcframework" + +all: frameworks diff --git a/Carthage/Checkouts/CryptoSwift/Package.swift b/Carthage/Checkouts/CryptoSwift/Package.swift new file mode 100644 index 00000000..2f0e7588 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version:5.3 + +import PackageDescription + +let package = Package( + name: "CryptoSwift", + platforms: [ + .macOS(.v10_12), .iOS(.v9), .tvOS(.v9), .watchOS(.v2) + ], + products: [ + .library( + name: "CryptoSwift", + targets: ["CryptoSwift"] + ) + ], + targets: [ + .target(name: "CryptoSwift"), + .testTarget(name: "CryptoSwiftTests", dependencies: ["CryptoSwift"]), + .testTarget(name: "TestsPerformance", dependencies: ["CryptoSwift"]) + ], + swiftLanguageVersions: [.v5] +) + +#if swift(>=5.6) + // Add the documentation compiler plugin if possible + package.dependencies.append( + .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0") + ) +#endif diff --git a/Carthage/Checkouts/CryptoSwift/README.md b/Carthage/Checkouts/CryptoSwift/README.md new file mode 100644 index 00000000..3e39e36d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/README.md @@ -0,0 +1,677 @@ +[![Platform](https://img.shields.io/badge/Platforms-iOS%20%7C%20Android%20%7CmacOS%20%7C%20watchOS%20%7C%20tvOS%20%7C%20Linux-4E4E4E.svg?colorA=28a745)](#installation) + +[![Swift support](https://img.shields.io/badge/Swift-3.1%20%7C%203.2%20%7C%204.0%20%7C%204.1%20%7C%204.2%20%7C%205.0-lightgrey.svg?colorA=28a745&colorB=4E4E4E)](#swift-versions-support) +[![Swift Package Manager compatible](https://img.shields.io/badge/SPM-compatible-brightgreen.svg?style=flat&colorA=28a745&&colorB=4E4E4E)](https://github.com/apple/swift-package-manager) +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/CryptoSwift.svg?style=flat&label=CocoaPods&colorA=28a745&&colorB=4E4E4E)](https://cocoapods.org/pods/CryptoSwift) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat&colorA=28a745&&colorB=4E4E4E)](https://github.com/Carthage/Carthage) + +# CryptoSwift + +Crypto related functions and helpers for [Swift](https://swift.org) implemented in Swift. ([#PureSwift](https://twitter.com/hashtag/pureswift)) + +**Note**: The `main` branch follows the latest currently released **version of Swift**. If you need an earlier version for an older version of Swift, you can specify its version in your `Podfile` or use the code on the branch for that version. Older branches are unsupported. Check [versions](#swift-versions-support) for details. + +--- + +[Requirements](#requirements) | [Features](#features) | [Contribution](#contribution) | [Installation](#installation) | [Swift versions](#swift-versions-support) | [How-to](#how-to) | [Author](#author) | [License](#license) | [Changelog](#changelog) + +## Sponsorship + +It takes some time to keep it all for your convenience, so maybe spare $1, so I can keep working on that. There are more than 8000 clones daily. If I'd get $1/month from each company that uses my work here, I'd say we're even. Hurry up, find the [Sponsorship](https://github.com/users/krzyzanowskim/sponsorship) button, and fulfill your duty. + +CryptoSwift isn't backed by any big company and is developer in my spare time that I also use to as a freelancer. + +[![Twitter](https://img.shields.io/badge/Twitter-@krzyzanowskim-blue.svg?style=flat)](http://twitter.com/krzyzanowskim) + +## Requirements +Good mood + +## Features + +- Easy to use +- Convenient extensions for String and Data +- Support for incremental updates (stream, ...) +- iOS, Android, macOS, AppleTV, watchOS, Linux support + +#### Hash (Digest) + [MD5](http://tools.ietf.org/html/rfc1321) +| [SHA1](http://tools.ietf.org/html/rfc3174) +| [SHA2-224](http://tools.ietf.org/html/rfc6234) +| [SHA2-256](http://tools.ietf.org/html/rfc6234) +| [SHA2-384](http://tools.ietf.org/html/rfc6234) +| [SHA2-512](http://tools.ietf.org/html/rfc6234) +| [SHA3](http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf) + +#### Cyclic Redundancy Check (CRC) + [CRC32](http://en.wikipedia.org/wiki/Cyclic_redundancy_check) +| [CRC32C](http://en.wikipedia.org/wiki/Cyclic_redundancy_check) +| [CRC16](http://en.wikipedia.org/wiki/Cyclic_redundancy_check) + +#### Cipher + [AES-128, AES-192, AES-256](http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf) +| [ChaCha20](http://cr.yp.to/chacha/chacha-20080128.pdf) +| [Rabbit](https://tools.ietf.org/html/rfc4503) +| [Blowfish](https://www.schneier.com/academic/blowfish/) + +#### RSA (public-key encryption algorithm) + [Encryption, Signature](https://github.com/krzyzanowskim/CryptoSwift#rsa) + +#### Message authenticators + [Poly1305](http://cr.yp.to/mac/poly1305-20050329.pdf) +| [HMAC (MD5, SHA1, SHA256)](https://www.ietf.org/rfc/rfc2104.txt) +| [CMAC](https://tools.ietf.org/html/rfc4493) +| [CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC) + +#### Cipher mode of operation +- Electronic codebook ([ECB](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_codebook_.28ECB.29)) +- Cipher-block chaining ([CBC](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher-block_chaining_.28CBC.29)) +- Propagating Cipher Block Chaining ([PCBC](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Propagating_Cipher_Block_Chaining_.28PCBC.29)) +- Cipher feedback ([CFB](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_feedback_.28CFB.29)) +- Output Feedback ([OFB](http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Output_Feedback_.28OFB.29)) +- Counter Mode ([CTR](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29)) +- Galois/Counter Mode ([GCM](https://csrc.nist.gov/publications/detail/sp/800-38d/final)) +- Counter with Cipher Block Chaining-Message Authentication Code ([CCM](https://csrc.nist.gov/publications/detail/sp/800-38c/final)) +- OCB Authenticated-Encryption Algorithm ([OCB](https://tools.ietf.org/html/rfc7253)) + +#### Password-Based Key Derivation Function +- [PBKDF1](http://tools.ietf.org/html/rfc2898#section-5.1) (Password-Based Key Derivation Function 1) +- [PBKDF2](http://tools.ietf.org/html/rfc2898#section-5.2) (Password-Based Key Derivation Function 2) +- [HKDF](https://tools.ietf.org/html/rfc5869) (HMAC-based Extract-and-Expand Key Derivation Function) +- [Scrypt](https://tools.ietf.org/html/rfc7914) (The scrypt Password-Based Key Derivation Function) + +#### Data padding +- [PKCS#5](https://www.rfc-editor.org/rfc/rfc2898.html) +- [EMSA-PKCS1-v1_5 (Encoding Method for Signature)](https://www.rfc-editor.org/rfc/rfc3447#section-9.2) +- [EME-PCKS1-v1_5 (Encoding Method for Encryption)](https://www.rfc-editor.org/rfc/rfc3447) +- [PKCS#7](http://tools.ietf.org/html/rfc5652#section-6.3) +- [Zero padding](https://en.wikipedia.org/wiki/Padding_(cryptography)#Zero_padding) +- [ISO78164](http://www.embedx.com/pdfs/ISO_STD_7816/info_isoiec7816-4%7Bed21.0%7Den.pdf) +- [ISO10126](https://en.wikipedia.org/wiki/Padding_(cryptography)#ISO_10126) +- No padding + +#### Authenticated Encryption with Associated Data (AEAD) +- [AEAD\_CHACHA20\_POLY1305](https://tools.ietf.org/html/rfc7539#section-2.8) + +## Why +[Why?](https://github.com/krzyzanowskim/CryptoSwift/discussions/982) [Because I can](https://github.com/krzyzanowskim/CryptoSwift/discussions/982#discussioncomment-3669415). + +## How do I get involved? + +You want to help, great! Go ahead and fork our repo, make your changes and send us a pull request. + +## Contribution + +Check out [CONTRIBUTING.md](CONTRIBUTING.md) for more information on how to help with CryptoSwift. + +- If you found a bug, [open a discussion](https://github.com/krzyzanowskim/CryptoSwift/discussions). +- If you have a feature request, [open a discussion](https://github.com/krzyzanowskim/CryptoSwift/discussions). + +## Installation + +### Hardened Runtime (macOS) and Xcode + +Binary CryptoSwift.xcframework (Used by Swift Package Manager package integration) won't load properly in your app if the app uses **Sign to Run Locally** Signing Certificate with Hardened Runtime enabled. It is possible to setup Xcode like this. To solve the problem you have two options: +- Use proper Signing Certificate, eg. *Development* <- this is the proper action +- Use `Disable Library Validation` aka `com.apple.security.cs.disable-library-validation` entitlement + +#### Xcode Project + +To install CryptoSwift, add it as a submodule to your project (on the top level project directory): + + git submodule add https://github.com/krzyzanowskim/CryptoSwift.git + +It is recommended to enable [Whole-Module Optimization](https://swift.org/blog/whole-module-optimizations/) to gain better performance. Non-optimized build results in significantly worse performance. + +#### Swift Package Manager + +You can use [Swift Package Manager](https://swift.org/package-manager/) and specify dependency in `Package.swift` by adding this: + +```swift +.package(url: "https://github.com/krzyzanowskim/CryptoSwift.git", .upToNextMajor(from: "1.6.0")) +``` + +See: [Package.swift - manual](http://blog.krzyzanowskim.com/2016/08/09/package-swift-manual/) + +Notice: Swift Package Manager uses debug configuration for debug Xcode build, that may result in significant (up to x10000) worse performance. Performance characteristic is different in Release build. To overcome this prolem, consider embed `CryptoSwift.xcframework` described below. + +#### CocoaPods + +You can use [CocoaPods](https://cocoapods.org/pods/CryptoSwift). + +```ruby +pod 'CryptoSwift', '~> 1.6.0' +``` + +Bear in mind that CocoaPods will build CryptoSwift without [Whole-Module Optimization](https://swift.org/blog/whole-module-optimizations/) that may impact performance. You can change it manually after installation, or use [cocoapods-wholemodule](https://github.com/jedlewison/cocoapods-wholemodule) plugin. + +#### Carthage + +You can use [Carthage](https://github.com/Carthage/Carthage). +Specify in Cartfile: + +```ruby +github "krzyzanowskim/CryptoSwift" +``` + +Run `carthage` to build the framework and drag the built CryptoSwift.framework into your Xcode project. Follow [build instructions](https://github.com/Carthage/Carthage#getting-started). [Common issues](https://github.com/krzyzanowskim/CryptoSwift/discussions/983#discussioncomment-3669433). + +#### XCFramework + +XCFrameworks require Xcode 11 or later and they can be integrated similarly to how we’re used to integrating the `.framework` format. +Please use script [scripts/build-framework.sh](scripts/build-framework.sh) to generate binary `CryptoSwift.xcframework` archive that you can use as a dependency in Xcode. + +CryptoSwift.xcframework is a Release (Optimized) binary that offer best available Swift code performance. + +Screen Shot 2020-10-27 at 00 06 32 + +#### Embedded Framework + +Embedded frameworks require a minimum deployment target of iOS 9 or macOS Sierra (10.12). Drag the `CryptoSwift.xcodeproj` file into your Xcode project, and add appropriate framework as a dependency to your target. Now select your App and choose the General tab for the app target. Find *Embedded Binaries* and press "+", then select `CryptoSwift.framework` (iOS, macOS, watchOS or tvOS) + +![](https://cloud.githubusercontent.com/assets/758033/10834511/25a26852-7e9a-11e5-8c01-6cc8f1838459.png) + +Sometimes "embedded framework" option is not available. In that case, you have to add new build phase for the target. + +![](https://cloud.githubusercontent.com/assets/758033/18415615/d5edabb0-77f8-11e6-8c94-f41d9fc2b8cb.png) + +##### iOS, macOS, watchOS, tvOS + +In the project, you'll find [single scheme](https://mxcl.dev/PromiseKit/news/2016/08/Multiplatform-Single-Scheme-Xcode-Projects/) for all platforms: +- CryptoSwift + +#### Swift versions support + +- Swift 1.2: branch [swift12](https://github.com/krzyzanowskim/CryptoSwift/tree/swift12) version <= 0.0.13 +- Swift 2.1: branch [swift21](https://github.com/krzyzanowskim/CryptoSwift/tree/swift21) version <= 0.2.3 +- Swift 2.2, 2.3: branch [swift2](https://github.com/krzyzanowskim/CryptoSwift/tree/swift2) version <= 0.5.2 +- Swift 3.1, branch [swift3](https://github.com/krzyzanowskim/CryptoSwift/tree/swift3) version <= 0.6.9 +- Swift 3.2, branch [swift32](https://github.com/krzyzanowskim/CryptoSwift/tree/swift32) version = 0.7.0 +- Swift 4.0, branch [swift4](https://github.com/krzyzanowskim/CryptoSwift/tree/swift4) version <= 0.12.0 +- Swift 4.2, branch [swift42](https://github.com/krzyzanowskim/CryptoSwift/tree/swift42) version <= 0.15.0 +- Swift 5.0, branch [swift5](https://github.com/krzyzanowskim/CryptoSwift/tree/swift5) version <= 1.2.0 +- Swift 5.1, branch [swift5](https://github.com/krzyzanowskim/CryptoSwift/tree/swift51) version <= 1.3.3 +- Swift 5.3 and newer, branch [main](https://github.com/krzyzanowskim/CryptoSwift/tree/main) + +## How-to + +* [Basics (data types, conversion, ...)](#basics) +* [Digest (MD5, SHA...)](#calculate-digest) +* [Message authenticators (HMAC, CMAC...)](#message-authenticators-1) +* [Password-Based Key Derivation Function (PBKDF2, ...)](#password-based-key-derivation-functions) +* [HMAC-based Key Derivation Function (HKDF)](#hmac-based-key-derivation-function) +* [Data Padding](#data-padding) +* [ChaCha20](#chacha20) +* [Rabbit](#rabbit) +* [Blowfish](#blowfish) +* [AES - Advanced Encryption Standard](#aes) +* [AES-GCM](#aes-gcm) +* [Authenticated Encryption with Associated Data (AEAD)](#aead) + +##### Basics + +```swift +import CryptoSwift +``` + +CryptoSwift uses array of bytes aka `Array` as a base type for all operations. Every data may be converted to a stream of bytes. You will find convenience functions that accept `String` or `Data`, and it will be internally converted to the array of bytes. + +##### Data types conversion + +For your convenience, **CryptoSwift** provides two functions to easily convert an array of bytes to `Data` or `Data` to an array of bytes: + +Data from bytes: + +```swift +let data = Data([0x01, 0x02, 0x03]) +``` + +`Data` to `Array` + +```swift +let bytes = data.bytes // [1,2,3] +``` + +[Hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) encoding: + +```swift +let bytes = Array(hex: "0x010203") // [1,2,3] +let hex = bytes.toHexString() // "010203" +``` + +Build bytes out of `String` +```swift +let bytes: Array = "cipherkey".bytes // Array("cipherkey".utf8) +``` + +Also... check out helpers that work with **Base64** encoded data: +```swift +"aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs=".decryptBase64ToString(cipher) +"aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs=".decryptBase64(cipher) +bytes.toBase64() +``` + +##### Calculate Digest + +Hashing a data or array of bytes (aka `Array`) +```swift +/* Hash struct usage */ +let bytes: Array = [0x01, 0x02, 0x03] +let digest = input.md5() +let digest = Digest.md5(bytes) +``` + +```swift +let data = Data([0x01, 0x02, 0x03]) + +let hash = data.md5() +let hash = data.sha1() +let hash = data.sha224() +let hash = data.sha256() +let hash = data.sha384() +let hash = data.sha512() +``` +```swift +do { + var digest = MD5() + let partial1 = try digest.update(withBytes: [0x31, 0x32]) + let partial2 = try digest.update(withBytes: [0x33]) + let result = try digest.finish() +} catch { } +``` + +Hashing a String and printing result + +```swift +let hash = "123".md5() // "123".bytes.md5() +``` + +##### Calculate CRC + +```swift +bytes.crc16() +data.crc16() + +bytes.crc32() +data.crc32() +``` + +##### Message authenticators + +```swift +// Calculate Message Authentication Code (MAC) for message +let key: Array = [1,2,3,4,5,6,7,8,9,10,...] + +try Poly1305(key: key).authenticate(bytes) +try HMAC(key: key, variant: .sha256).authenticate(bytes) +try CMAC(key: key).authenticate(bytes) +``` + +##### Password-Based Key Derivation Functions + +```swift +let password: Array = Array("s33krit".utf8) +let salt: Array = Array("nacllcan".utf8) + +let key = try PKCS5.PBKDF2(password: password, salt: salt, iterations: 4096, keyLength: 32, variant: .sha256).calculate() +``` + +```swift +let password: Array = Array("s33krit".utf8) +let salt: Array = Array("nacllcan".utf8) +// Scrypt implementation does not implement work parallelization, so `p` parameter will +// increase the work time even in multicore systems +let key = try Scrypt(password: password, salt: salt, dkLen: 64, N: 16384, r: 8, p: 1).calculate() +``` + +##### HMAC-based Key Derivation Function + +```swift +let password: Array = Array("s33krit".utf8) +let salt: Array = Array("nacllcan".utf8) + +let key = try HKDF(password: password, salt: salt, variant: .sha256).calculate() +``` + + +##### Data Padding + +Some content-encryption algorithms assume the input length is a multiple of `k` octets, where `k` is greater than one. For such algorithms, the input shall be padded. + +```swift +Padding.pkcs7.add(to: bytes, blockSize: AES.blockSize) +``` + +#### Working with Ciphers +##### ChaCha20 + +```swift +let encrypted = try ChaCha20(key: key, iv: iv).encrypt(message) +let decrypted = try ChaCha20(key: key, iv: iv).decrypt(encrypted) +``` + +##### Rabbit + +```swift +let encrypted = try Rabbit(key: key, iv: iv).encrypt(message) +let decrypted = try Rabbit(key: key, iv: iv).decrypt(encrypted) +``` +##### Blowfish + +```swift +let encrypted = try Blowfish(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).encrypt(message) +let decrypted = try Blowfish(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(encrypted) +``` + +##### AES + +Notice regarding padding: *Manual padding of data is optional, and CryptoSwift is using PKCS7 padding by default. If you need to manually disable/enable padding, you can do this by setting parameter for __AES__ class* + +Variant of AES encryption (AES-128, AES-192, AES-256) depends on given key length: + +- AES-128 = 16 bytes +- AES-192 = 24 bytes +- AES-256 = 32 bytes + +AES-256 example + +```swift +let encryptedBytes = try AES(key: [1,2,3,...,32], blockMode: CBC(iv: [1,2,3,...,16]), padding: .pkcs7) +``` + +Full example: + +```swift +let password: [UInt8] = Array("s33krit".utf8) +let salt: [UInt8] = Array("nacllcan".utf8) + +/* Generate a key from a `password`. Optional if you already have a key */ +let key = try PKCS5.PBKDF2( + password: password, + salt: salt, + iterations: 4096, + keyLength: 32, /* AES-256 */ + variant: .sha256 +).calculate() + +/* Generate random IV value. IV is public value. Either need to generate, or get it from elsewhere */ +let iv = AES.randomIV(AES.blockSize) + +/* AES cryptor instance */ +let aes = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + +/* Encrypt Data */ +let inputData = Data() +let encryptedBytes = try aes.encrypt(inputData.bytes) +let encryptedData = Data(encryptedBytes) + +/* Decrypt Data */ +let decryptedBytes = try aes.decrypt(encryptedData.bytes) +let decryptedData = Data(decryptedBytes) +``` + +###### All at once +```swift +do { + let aes = try AES(key: "keykeykeykeykeyk", iv: "drowssapdrowssap") // aes128 + let ciphertext = try aes.encrypt(Array("Nullam quis risus eget urna mollis ornare vel eu leo.".utf8)) +} catch { } +``` + +###### Incremental updates + +Incremental operations use instance of Cryptor and encrypt/decrypt one part at a time, this way you can save on memory for large files. + +```swift +do { + var encryptor = try AES(key: "keykeykeykeykeyk", iv: "drowssapdrowssap").makeEncryptor() + + var ciphertext = Array() + // aggregate partial results + ciphertext += try encryptor.update(withBytes: Array("Nullam quis risus ".utf8)) + ciphertext += try encryptor.update(withBytes: Array("eget urna mollis ".utf8)) + ciphertext += try encryptor.update(withBytes: Array("ornare vel eu leo.".utf8)) + // finish at the end + ciphertext += try encryptor.finish() + + print(ciphertext.toHexString()) +} catch { + print(error) +} +``` + +###### AES Advanced usage +```swift +let input: Array = [0,1,2,3,4,5,6,7,8,9] + +let key: Array = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00] +let iv: Array = // Random bytes of `AES.blockSize` length + +do { + let encrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).encrypt(input) + let decrypted = try AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7).decrypt(encrypted) +} catch { + print(error) +} +``` + +AES without data padding + +```swift +let input: Array = [0,1,2,3,4,5,6,7,8,9] +let encrypted: Array = try! AES(key: Array("secret0key000000".utf8), blockMode: CBC(iv: Array("0123456789012345".utf8)), padding: .noPadding).encrypt(input) +``` + +Using convenience extensions + +```swift +let plain = Data([0x01, 0x02, 0x03]) +let encrypted = try! plain.encrypt(ChaCha20(key: key, iv: iv)) +let decrypted = try! encrypted.decrypt(ChaCha20(key: key, iv: iv)) +``` + +##### AES-GCM + +The result of Galois/Counter Mode (GCM) encryption is ciphertext and **authentication tag**, that is later used to decryption. + +encryption + +```swift +do { + // In combined mode, the authentication tag is directly appended to the encrypted message. This is usually what you want. + let gcm = GCM(iv: iv, mode: .combined) + let aes = try AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try aes.encrypt(plaintext) + let tag = gcm.authenticationTag +} catch { + // failed +} +``` + +decryption + +```swift +do { + // In combined mode, the authentication tag is appended to the encrypted message. This is usually what you want. + let gcm = GCM(iv: iv, mode: .combined) + let aes = try AES(key: key, blockMode: gcm, padding: .noPadding) + return try aes.decrypt(encrypted) +} catch { + // failed +} +``` + +**Note**: GCM instance is not intended to be reused. So you can't use the same `GCM` instance from encoding to also perform decoding. + +##### AES-CCM + +The result of Counter with Cipher Block Chaining-Message Authentication Code encryption is ciphertext and **authentication tag**, that is later used to decryption. + +```swift +do { + // The authentication tag is appended to the encrypted message. + let tagLength = 8 + let ccm = CCM(iv: iv, tagLength: tagLength, messageLength: ciphertext.count - tagLength, additionalAuthenticatedData: data) + let aes = try AES(key: key, blockMode: ccm, padding: .noPadding) + return try aes.decrypt(encrypted) +} catch { + // failed +} +``` + +Check documentation or CCM specification for valid parameters for CCM. + +##### AEAD + +```swift +let encrypt = try AEADChaCha20Poly1305.encrypt(plaintext, key: key, iv: nonce, authenticationHeader: header) +let decrypt = try AEADChaCha20Poly1305.decrypt(ciphertext, key: key, iv: nonce, authenticationHeader: header, authenticationTag: tagArr: tag) +``` + +##### RSA + +RSA initialization from parameters + +```swift +let input: Array = [0,1,2,3,4,5,6,7,8,9] + +let n: Array = // RSA modulus +let e: Array = // RSA public exponent +let d: Array = // RSA private exponent + +let rsa = RSA(n: n, e: e, d: d) + +do { + let encrypted = try rsa.encrypt(input) + let decrypted = try rsa.decrypt(encrypted) +} catch { + print(error) +} +``` + +RSA key generation + +```swift +let rsa = try RSA(keySize: 2048) // This generates a modulus, public exponent and private exponent with the given size +``` + +RSA Encryption & Decryption Example +``` swift +// Alice Generates a Private Key +let alicesPrivateKey = try RSA(keySize: 1024) + +// Alice shares her **public** key with Bob +let alicesPublicKeyData = try alicesPrivateKey.publicKeyDER() + +// Bob receives the raw external representation of Alices public key and imports it +let bobsImportOfAlicesPublicKey = try RSA(rawRepresentation: Data(alicesPublicKeyData)) + +// Bob can now encrypt a message for Alice using her public key +let message = "Hi Alice! This is Bob!" +let privateMessage = try bobsImportOfAlicesPublicKey.encrypt(message.bytes) + +// This results in some encrypted output like this +// URcRwG6LfH63zOQf2w+HIllPri9Rb6hFlXbi/bh03zPl2MIIiSTjbAPqbVFmoF3RmDzFjIarIS7ZpT57a1F+OFOJjx50WYlng7dioKFS/rsuGHYnMn4csjCRF6TAqvRQcRnBueeINRRA8SLaLHX6sZuQkjIE5AoHJwgavmiv8PY= + +// Bob can now send this encrypted message to Alice without worrying about people being able to read the original contents + +// Alice receives the encrypted message and uses her private key to decrypt the data and recover the original message +let originalDecryptedMessage = try alicesPrivateKey.decrypt(privateMessage) + +print(String(data: Data(originalDecryptedMessage), encoding: .utf8)) +// "Hi Alice! This is Bob!" +``` + +RSA Signature & Verification Example +``` swift +// Alice Generates a Private Key +let alicesPrivateKey = try RSA(keySize: 1024) + +// Alice wants to sign a message that she agrees with +let messageAliceSupports = "Hi my name is Alice!" +let alicesSignature = try alicesPrivateKey.sign(messageAliceSupports.bytes) + +// Alice shares her Public key and the signature with Bob +let alicesPublicKeyData = try alicesPrivateKey.publicKeyDER() + +// Bob receives the raw external representation of Alices Public key and imports it! +let bobsImportOfAlicesPublicKey = try RSA(rawRepresentation: Data(alicesPublicKeyData)) + +// Bob can now verify that Alice signed the message using the Private key associated with her shared Public key. +let verifiedSignature = try bobsImportOfAlicesPublicKey.verify(signature: alicesSignature, for: "Hi my name is Alice!".bytes) + +if verifiedSignature == true { + // Bob knows that the signature Alice provided is valid for the message and was signed using the Private key associated with Alices shared Public key. +} else { + // The signature was invalid, so either + // - the message Alice signed was different then what we expected. + // - or Alice used a Private key that isn't associated with the shared Public key that Bob has. +} +``` + +CryptoSwift RSA Key -> Apple's Security Framework SecKey Example +``` swift +/// Starting with a CryptoSwift RSA Key +let rsaKey = try RSA(keySize: 1024) + +/// Define your Keys attributes +let attributes: [String:Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, // or kSecAttrKeyClassPublic + kSecAttrKeySizeInBits as String: 1024, // The appropriate bits + kSecAttrIsPermanent as String: false +] +var error:Unmanaged? = nil +guard let rsaSecKey = try SecKeyCreateWithData(rsaKey.externalRepresentation() as CFData, attributes as CFDictionary, &error) else { + /// Error constructing SecKey from raw key data + return +} + +/// You now have an RSA SecKey for use with Apple's Security framework +``` + +Apple's Security Framework SecKey -> CryptoSwift RSA Key Example +``` swift +/// Starting with a SecKey RSA Key +let rsaSecKey:SecKey + +/// Copy External Representation +var externalRepError:Unmanaged? +guard let cfdata = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) else { + /// Failed to copy external representation for RSA SecKey + return +} + +/// Instantiate the RSA Key from the raw external representation +let rsaKey = try RSA(rawRepresentation: cfdata as Data) + +/// You now have a CryptoSwift RSA Key +``` + + +## Author + +CryptoSwift is owned and maintained by [Marcin Krzyżanowski](http://www.krzyzanowskim.com) + +You can follow me on Twitter at [@krzyzanowskim](http://twitter.com/krzyzanowskim) for project updates and releases. + +# Cryptography Notice + +This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information. + +## License + +Copyright (C) 2014-2022 Marcin Krzyżanowski +This software is provided 'as-is', without any express or implied warranty. + +In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +- The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, **an acknowledgment in the product documentation is required**. +- Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +- This notice may not be removed or altered from any source or binary distribution. +- Redistributions of any form whatsoever must retain the following acknowledgment: 'This product includes software developed by the "Marcin Krzyzanowski" (http://krzyzanowskim.com/).' + +## Changelog + +See [CHANGELOG](./CHANGELOG) file. diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift.h b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift.h new file mode 100644 index 00000000..85fe6754 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift.h @@ -0,0 +1,15 @@ +// +// CryptoSwift.h +// CryptoSwift +// +// Created by Sam Soffes on 11/29/15. +// Copyright © 2015 Marcin Krzyzanowski. All rights reserved. +// + +@import Foundation; + +//! Project version number for CryptoSwift. +FOUNDATION_EXPORT double CryptoSwiftVersionNumber; + +//! Project version string for CryptoSwift. +FOUNDATION_EXPORT const unsigned char CryptoSwiftVersionString[]; diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEAD.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEAD.swift new file mode 100644 index 00000000..9211bdaa --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEAD.swift @@ -0,0 +1,40 @@ +// +// AEAD.swift +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// + +// https://www.iana.org/assignments/aead-parameters/aead-parameters.xhtml + +/// Authenticated Encryption with Associated Data (AEAD) +public protocol AEAD { + static var kLen: Int { get } // key length + static var ivRange: Range { get } // nonce length +} + +extension AEAD { + static func calculateAuthenticationTag(authenticator: Authenticator, cipherText: Array, authenticationHeader: Array) throws -> Array { + let headerPadding = ((16 - (authenticationHeader.count & 0xf)) & 0xf) + let cipherPadding = ((16 - (cipherText.count & 0xf)) & 0xf) + + var mac = authenticationHeader + mac += Array(repeating: 0, count: headerPadding) + mac += cipherText + mac += Array(repeating: 0, count: cipherPadding) + mac += UInt64(bigEndian: UInt64(authenticationHeader.count)).bytes() + mac += UInt64(bigEndian: UInt64(cipherText.count)).bytes() + + return try authenticator.authenticate(mac) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEADChaCha20Poly1305.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEADChaCha20Poly1305.swift new file mode 100644 index 00000000..3ba4c149 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AEAD/AEADChaCha20Poly1305.swift @@ -0,0 +1,59 @@ +// +// ChaCha20Poly1305.swift +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// +// https://tools.ietf.org/html/rfc7539#section-2.8.1 + +/// AEAD_CHACHA20_POLY1305 +public final class AEADChaCha20Poly1305: AEAD { + public static let kLen = 32 // key length + public static var ivRange = Range(12...12) + + /// Authenticated encryption + public static func encrypt(_ plainText: Array, key: Array, iv: Array, authenticationHeader: Array) throws -> (cipherText: Array, authenticationTag: Array) { + let cipher = try ChaCha20(key: key, iv: iv) + + var polykey = Array(repeating: 0, count: kLen) + var toEncrypt = polykey + polykey = try cipher.encrypt(polykey) + toEncrypt += polykey + toEncrypt += plainText + + let fullCipherText = try cipher.encrypt(toEncrypt) + let cipherText = Array(fullCipherText.dropFirst(64)) + + let tag = try calculateAuthenticationTag(authenticator: Poly1305(key: polykey), cipherText: cipherText, authenticationHeader: authenticationHeader) + return (cipherText, tag) + } + + /// Authenticated decryption + public static func decrypt(_ cipherText: Array, key: Array, iv: Array, authenticationHeader: Array, authenticationTag: Array) throws -> (plainText: Array, success: Bool) { + let chacha = try ChaCha20(key: key, iv: iv) + + let polykey = try chacha.encrypt(Array(repeating: 0, count: self.kLen)) + let mac = try calculateAuthenticationTag(authenticator: Poly1305(key: polykey), cipherText: cipherText, authenticationHeader: authenticationHeader) + guard mac == authenticationTag else { + return (cipherText, false) + } + + var toDecrypt = Array(reserveCapacity: cipherText.count + 64) + toDecrypt += polykey + toDecrypt += polykey + toDecrypt += cipherText + let fullPlainText = try chacha.decrypt(toDecrypt) + let plainText = Array(fullPlainText.dropFirst(64)) + return (plainText, true) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.Cryptors.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.Cryptors.swift new file mode 100644 index 00000000..e5ad2a5b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.Cryptors.swift @@ -0,0 +1,39 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// MARK: Cryptors + +extension AES: Cryptors { + @inlinable + public func makeEncryptor() throws -> Cryptor & Updatable { + let blockSize = blockMode.customBlockSize ?? AES.blockSize + let worker = try blockMode.worker(blockSize: blockSize, cipherOperation: encrypt, encryptionOperation: encrypt) + if worker is StreamModeWorker { + return try StreamEncryptor(blockSize: blockSize, padding: padding, worker) + } + return try BlockEncryptor(blockSize: blockSize, padding: padding, worker) + } + + @inlinable + public func makeDecryptor() throws -> Cryptor & Updatable { + let blockSize = blockMode.customBlockSize ?? AES.blockSize + let cipherOperation: CipherOperationOnBlock = blockMode.options.contains(.useEncryptToDecrypt) == true ? encrypt : decrypt + let worker = try blockMode.worker(blockSize: blockSize, cipherOperation: cipherOperation, encryptionOperation: encrypt) + if worker is StreamModeWorker { + return try StreamDecryptor(blockSize: blockSize, padding: padding, worker) + } + return try BlockDecryptor(blockSize: blockSize, padding: padding, worker) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.swift new file mode 100644 index 00000000..f1c5fe6d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/AES.swift @@ -0,0 +1,556 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Implementation of Gladman algorithm http://www.gladman.me.uk/AES +// + +/// The Advanced Encryption Standard (AES) +public final class AES: BlockCipher { + public enum Error: Swift.Error { + /// Invalid key + case invalidKeySize + /// Data padding is required + case dataPaddingRequired + /// Invalid Data + case invalidData + } + + public enum Variant: Int { + case aes128 = 1, aes192, aes256 + + var Nk: Int { // Nk words + [4, 6, 8][self.rawValue - 1] + } + + var Nb: Int { // Nb words + 4 + } + + var Nr: Int { // Nr + self.Nk + 6 + } + } + + @usableFromInline + internal let variantNr: Int + + @usableFromInline + internal let variantNb: Int + + @usableFromInline + internal let variantNk: Int + + public static let blockSize: Int = 16 // 128 /8 + public let keySize: Int + + /// AES Variant + public let variant: Variant + + // Parameters + let key: Key + + @usableFromInline + let blockMode: BlockMode + + @usableFromInline + let padding: Padding + + // + @usableFromInline + internal lazy var expandedKey: Array> = self.expandKey(self.key, variant: self.variant) + + @usableFromInline + internal lazy var expandedKeyInv: Array> = self.expandKeyInv(self.key, variant: self.variant) + + private lazy var sBoxes: (sBox: Array, invSBox: Array) = self.calculateSBox() + private lazy var sBox: Array = self.sBoxes.sBox + private lazy var sBoxInv: Array = self.sBoxes.invSBox + + // Parameters for Linear Congruence Generators + private static let Rcon: Array = [ + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, + 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, + 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, + 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, + 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, + 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, + 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, + 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, + 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, + 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, + 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, + 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, + 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, + 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, + 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, + 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d + ] + + @usableFromInline static let T0: Array = [0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6, 0xdf2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591, 0x50303060, 0x3010102, 0xa96767ce, 0x7d2b2b56, 0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec, 0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa, 0x15fafaef, 0xeb5959b2, 0xc947478e, 0xbf0f0fb, 0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45, 0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b, 0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c, 0x5a36366c, 0x413f3f7e, 0x2f7f7f5, 0x4fcccc83, 0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x8f1f1f9, 0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a, 0xc040408, 0x52c7c795, 0x65232346, 0x5ec3c39d, 0x28181830, 0xa1969637, 0xf05050a, 0xb59a9a2f, 0x907070e, 0x36121224, 0x9b80801b, 0x3de2e2df, 0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea, 0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34, 0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b, 0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d, 0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413, 0xf55353a6, 0x68d1d1b9, 0x0, 0x2cededc1, 0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6, 0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972, 0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85, 0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed, 0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511, 0xcf45458a, 0x10f9f9e9, 0x6020204, 0x817f7ffe, 0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b, 0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05, 0xad92923f, 0xbc9d9d21, 0x48383870, 0x4f5f5f1, 0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142, 0x30101020, 0x1affffe5, 0xef3f3fd, 0x6dd2d2bf, 0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3, 0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e, 0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a, 0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6, 0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3, 0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b, 0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428, 0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad, 0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14, 0xdb494992, 0xa06060c, 0x6c242448, 0xe45c5cb8, 0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4, 0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2, 0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda, 0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949, 0xb46c6cd8, 0xfa5656ac, 0x7f4f4f3, 0x25eaeacf, 0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810, 0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c, 0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697, 0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e, 0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f, 0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc, 0xd8484890, 0x5030306, 0x1f6f6f7, 0x120e0e1c, 0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969, 0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27, 0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122, 0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433, 0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9, 0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5, 0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a, 0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0, 0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e, 0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c] + @usableFromInline static let T0_INV: Array = [0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a, 0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b, 0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5, 0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5, 0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d, 0x2752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b, 0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295, 0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e, 0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927, 0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d, 0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362, 0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9, 0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52, 0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566, 0x728ebb2, 0x3c2b52f, 0x9a7bc586, 0xa50837d3, 0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed, 0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e, 0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4, 0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4, 0x39ec830b, 0xaaef6040, 0x69f715e, 0x51106ebd, 0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d, 0xb58d5491, 0x55dc471, 0x6fd40604, 0xff155060, 0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967, 0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879, 0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x0, 0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c, 0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36, 0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624, 0xb1670a0c, 0xfe75793, 0xd296eeb4, 0x9e919b1b, 0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c, 0xaba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12, 0xb0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14, 0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3, 0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b, 0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8, 0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684, 0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7, 0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177, 0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947, 0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322, 0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498, 0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f, 0xe49d3a2c, 0xd927850, 0x9bcc5f6a, 0x62467e54, 0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382, 0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf, 0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb, 0x97826cd, 0xf418596e, 0x1b79aec, 0xa89a4f83, 0x656e95e6, 0x7ee6ffaa, 0x8cfbc21, 0xe6e815ef, 0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029, 0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235, 0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733, 0x4a9804f1, 0xf7daec41, 0xe50cd7f, 0x2ff69117, 0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4, 0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546, 0x4ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb, 0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d, 0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb, 0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a, 0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773, 0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478, 0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2, 0x72c31d16, 0xc25e2bc, 0x8b493c28, 0x41950dff, 0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664, 0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0] + @usableFromInline static let T1: Array = [0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d, 0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154, 0x30306050, 0x1010203, 0x6767cea9, 0x2b2b567d, 0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a, 0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87, 0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b, 0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea, 0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b, 0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a, 0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f, 0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908, 0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f, 0x404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e, 0x18183028, 0x969637a1, 0x5050a0f, 0x9a9a2fb5, 0x7070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d, 0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f, 0x909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e, 0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb, 0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce, 0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397, 0x5353a6f5, 0xd1d1b968, 0x0, 0xededc12c, 0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed, 0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b, 0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a, 0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16, 0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194, 0x45458acf, 0xf9f9e910, 0x2020406, 0x7f7ffe81, 0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3, 0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a, 0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104, 0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263, 0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d, 0xcdcd814c, 0xc0c1814, 0x13132635, 0xececc32f, 0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39, 0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47, 0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695, 0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f, 0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83, 0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c, 0xdedea779, 0x5e5ebce2, 0xb0b161d, 0xdbdbad76, 0xe0e0db3b, 0x32326456, 0x3a3a744e, 0xa0a141e, 0x494992db, 0x6060c0a, 0x2424486c, 0x5c5cb8e4, 0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6, 0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b, 0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7, 0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0, 0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25, 0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x8081018, 0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72, 0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751, 0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21, 0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85, 0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa, 0x484890d8, 0x3030605, 0xf6f6f701, 0xe0e1c12, 0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0, 0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9, 0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233, 0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7, 0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920, 0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a, 0x8c8c038f, 0xa1a159f8, 0x89890980, 0xd0d1a17, 0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8, 0x414182c3, 0x999929b0, 0x2d2d5a77, 0xf0f1e11, 0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a] + @usableFromInline static let T1_INV: Array = [0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96, 0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x3e34b93, 0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525, 0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f, 0x5ab1de49, 0x1bba2567, 0xeea4598, 0xc0fe5de1, 0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6, 0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da, 0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44, 0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd, 0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4, 0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245, 0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994, 0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7, 0xd373ab23, 0x24b72e2, 0x8f1fe357, 0xab55662a, 0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x837d3a5, 0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c, 0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1, 0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a, 0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475, 0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51, 0x8a213ef9, 0x6dd963d, 0x53eddae, 0xbde64d46, 0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff, 0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777, 0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db, 0xa7ca147, 0xf427ce9, 0x1e84f8c9, 0x0, 0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e, 0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627, 0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a, 0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e, 0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16, 0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d, 0xd090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8, 0x19f15785, 0x775af4c, 0xdd99eebb, 0x607fa3fd, 0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34, 0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863, 0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420, 0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d, 0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0, 0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722, 0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef, 0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0xbd49836, 0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4, 0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462, 0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5, 0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3, 0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b, 0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8, 0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6, 0x9be7bad9, 0x366f4ace, 0x99fead4, 0x7cb029d6, 0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0, 0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315, 0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f, 0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x496e4df, 0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f, 0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e, 0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13, 0x61d79a8c, 0xca1377a, 0x14f8598e, 0x3c13eb89, 0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c, 0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf, 0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886, 0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f, 0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41, 0x1a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490, 0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042] + @usableFromInline static let T2: Array = [0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b, 0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5, 0x30605030, 0x1020301, 0x67cea967, 0x2b567d2b, 0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76, 0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d, 0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0, 0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf, 0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0, 0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26, 0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc, 0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1, 0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15, 0x4080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3, 0x18302818, 0x9637a196, 0x50a0f05, 0x9a2fb59a, 0x70e0907, 0x12243612, 0x801b9b80, 0xe2df3de2, 0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75, 0x9121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a, 0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0, 0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3, 0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784, 0x53a6f553, 0xd1b968d1, 0x0, 0xedc12ced, 0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b, 0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39, 0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf, 0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb, 0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485, 0x458acf45, 0xf9e910f9, 0x2040602, 0x7ffe817f, 0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8, 0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f, 0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5, 0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321, 0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2, 0xcd814ccd, 0xc18140c, 0x13263513, 0xecc32fec, 0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917, 0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d, 0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573, 0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc, 0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388, 0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14, 0xdea779de, 0x5ebce25e, 0xb161d0b, 0xdbad76db, 0xe0db3be0, 0x32645632, 0x3a744e3a, 0xa141e0a, 0x4992db49, 0x60c0a06, 0x24486c24, 0x5cb8e45c, 0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662, 0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79, 0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d, 0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9, 0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea, 0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x8101808, 0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e, 0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6, 0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f, 0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a, 0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66, 0x4890d848, 0x3060503, 0xf6f701f6, 0xe1c120e, 0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9, 0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e, 0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311, 0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794, 0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9, 0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf, 0x8c038f8c, 0xa159f8a1, 0x89098089, 0xd1a170d, 0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868, 0x4182c341, 0x9929b099, 0x2d5a772d, 0xf1e110f, 0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16] + @usableFromInline static let T2_INV: Array = [0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e, 0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303, 0x302055fa, 0x76adf66d, 0xcc889176, 0x2f5254c, 0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3, 0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0, 0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9, 0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59, 0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8, 0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71, 0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a, 0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f, 0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x8f9942b, 0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8, 0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab, 0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508, 0x2830f287, 0xbf23b2a5, 0x302ba6a, 0x16ed5c82, 0xcf8a2b1c, 0x79a792b4, 0x7f3f0f2, 0x694ea1e2, 0xda65cdf4, 0x506d5be, 0x34d11f62, 0xa6c48afe, 0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb, 0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110, 0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd, 0x5491b58d, 0xc471055d, 0x6046fd4, 0x5060ff15, 0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e, 0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee, 0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x0, 0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72, 0xefdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739, 0xf0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e, 0xa0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91, 0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a, 0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17, 0x90e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9, 0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60, 0x1f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e, 0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1, 0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011, 0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1, 0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3, 0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264, 0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90, 0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b, 0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf, 0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246, 0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af, 0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312, 0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb, 0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a, 0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8, 0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c, 0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066, 0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8, 0x4f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6, 0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04, 0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51, 0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0xbfb2e41, 0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347, 0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c, 0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1, 0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37, 0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db, 0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40, 0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0xdff4195, 0xa8397101, 0xc08deb3, 0xb4d89ce4, 0x566490c1, 0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257] + @usableFromInline static let T3: Array = [0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b, 0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5, 0x60503030, 0x2030101, 0xcea96767, 0x567d2b2b, 0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676, 0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d, 0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0, 0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf, 0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0, 0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626, 0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc, 0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1, 0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515, 0x80c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3, 0x30281818, 0x37a19696, 0xa0f0505, 0x2fb59a9a, 0xe090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2, 0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575, 0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a, 0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0, 0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3, 0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484, 0xa6f55353, 0xb968d1d1, 0x0, 0xc12ceded, 0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b, 0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939, 0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf, 0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb, 0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585, 0x8acf4545, 0xe910f9f9, 0x4060202, 0xfe817f7f, 0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8, 0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x58a8f8f, 0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5, 0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121, 0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2, 0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec, 0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717, 0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d, 0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373, 0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc, 0x44662222, 0x547e2a2a, 0x3bab9090, 0xb838888, 0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414, 0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb, 0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a, 0x92db4949, 0xc0a0606, 0x486c2424, 0xb8e45c5c, 0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262, 0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979, 0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d, 0x18c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9, 0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea, 0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808, 0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e, 0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6, 0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f, 0x96dd4b4b, 0x61dcbdbd, 0xd868b8b, 0xf858a8a, 0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666, 0x90d84848, 0x6050303, 0xf701f6f6, 0x1c120e0e, 0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9, 0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e, 0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111, 0xd2bb6969, 0xa970d9d9, 0x7898e8e, 0x33a79494, 0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9, 0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf, 0x38f8c8c, 0x59f8a1a1, 0x9808989, 0x1a170d0d, 0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868, 0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f, 0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616] + @usableFromInline static let T3_INV: Array = [0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27, 0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3, 0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02, 0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362, 0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe, 0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3, 0x3e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952, 0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9, 0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9, 0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace, 0x63184adf, 0xe582311a, 0x97603351, 0x62457f53, 0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08, 0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b, 0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55, 0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837, 0x30f28728, 0x23b2a5bf, 0x2ba6a03, 0xed5c8216, 0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269, 0x65cdf4da, 0x6d5be05, 0xd11f6234, 0xc48afea6, 0x349d532e, 0xa2a055f3, 0x532e18a, 0xa475ebf6, 0xb39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e, 0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6, 0x91b58d54, 0x71055dc4, 0x46fd406, 0x60ff1550, 0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9, 0xb0bd42e8, 0x7888b89, 0xe7385b19, 0x79dbeec8, 0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x0, 0x9838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a, 0xfdfbff0e, 0xf563885, 0x3d1ed5ae, 0x3627392d, 0xa64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36, 0xcb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b, 0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12, 0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b, 0xe0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e, 0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f, 0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb, 0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4, 0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6, 0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129, 0x1d4b2f9e, 0xdcf330b2, 0xdec5286, 0x77d0e3c1, 0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9, 0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033, 0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4, 0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad, 0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e, 0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3, 0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225, 0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b, 0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f, 0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815, 0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0, 0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2, 0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7, 0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691, 0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496, 0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165, 0x9d04ea5e, 0x15d358c, 0xfa737487, 0xfb2e410b, 0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6, 0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13, 0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147, 0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7, 0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44, 0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3, 0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d, 0x397101a8, 0x8deb30c, 0xd89ce4b4, 0x6490c156, 0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8] + @usableFromInline static let U1: Array = [0x0, 0xb0d090e, 0x161a121c, 0x1d171b12, 0x2c342438, 0x27392d36, 0x3a2e3624, 0x31233f2a, 0x58684870, 0x5365417e, 0x4e725a6c, 0x457f5362, 0x745c6c48, 0x7f516546, 0x62467e54, 0x694b775a, 0xb0d090e0, 0xbbdd99ee, 0xa6ca82fc, 0xadc78bf2, 0x9ce4b4d8, 0x97e9bdd6, 0x8afea6c4, 0x81f3afca, 0xe8b8d890, 0xe3b5d19e, 0xfea2ca8c, 0xf5afc382, 0xc48cfca8, 0xcf81f5a6, 0xd296eeb4, 0xd99be7ba, 0x7bbb3bdb, 0x70b632d5, 0x6da129c7, 0x66ac20c9, 0x578f1fe3, 0x5c8216ed, 0x41950dff, 0x4a9804f1, 0x23d373ab, 0x28de7aa5, 0x35c961b7, 0x3ec468b9, 0xfe75793, 0x4ea5e9d, 0x19fd458f, 0x12f04c81, 0xcb6bab3b, 0xc066a235, 0xdd71b927, 0xd67cb029, 0xe75f8f03, 0xec52860d, 0xf1459d1f, 0xfa489411, 0x9303e34b, 0x980eea45, 0x8519f157, 0x8e14f859, 0xbf37c773, 0xb43ace7d, 0xa92dd56f, 0xa220dc61, 0xf66d76ad, 0xfd607fa3, 0xe07764b1, 0xeb7a6dbf, 0xda595295, 0xd1545b9b, 0xcc434089, 0xc74e4987, 0xae053edd, 0xa50837d3, 0xb81f2cc1, 0xb31225cf, 0x82311ae5, 0x893c13eb, 0x942b08f9, 0x9f2601f7, 0x46bde64d, 0x4db0ef43, 0x50a7f451, 0x5baafd5f, 0x6a89c275, 0x6184cb7b, 0x7c93d069, 0x779ed967, 0x1ed5ae3d, 0x15d8a733, 0x8cfbc21, 0x3c2b52f, 0x32e18a05, 0x39ec830b, 0x24fb9819, 0x2ff69117, 0x8dd64d76, 0x86db4478, 0x9bcc5f6a, 0x90c15664, 0xa1e2694e, 0xaaef6040, 0xb7f87b52, 0xbcf5725c, 0xd5be0506, 0xdeb30c08, 0xc3a4171a, 0xc8a91e14, 0xf98a213e, 0xf2872830, 0xef903322, 0xe49d3a2c, 0x3d06dd96, 0x360bd498, 0x2b1ccf8a, 0x2011c684, 0x1132f9ae, 0x1a3ff0a0, 0x728ebb2, 0xc25e2bc, 0x656e95e6, 0x6e639ce8, 0x737487fa, 0x78798ef4, 0x495ab1de, 0x4257b8d0, 0x5f40a3c2, 0x544daacc, 0xf7daec41, 0xfcd7e54f, 0xe1c0fe5d, 0xeacdf753, 0xdbeec879, 0xd0e3c177, 0xcdf4da65, 0xc6f9d36b, 0xafb2a431, 0xa4bfad3f, 0xb9a8b62d, 0xb2a5bf23, 0x83868009, 0x888b8907, 0x959c9215, 0x9e919b1b, 0x470a7ca1, 0x4c0775af, 0x51106ebd, 0x5a1d67b3, 0x6b3e5899, 0x60335197, 0x7d244a85, 0x7629438b, 0x1f6234d1, 0x146f3ddf, 0x97826cd, 0x2752fc3, 0x335610e9, 0x385b19e7, 0x254c02f5, 0x2e410bfb, 0x8c61d79a, 0x876cde94, 0x9a7bc586, 0x9176cc88, 0xa055f3a2, 0xab58faac, 0xb64fe1be, 0xbd42e8b0, 0xd4099fea, 0xdf0496e4, 0xc2138df6, 0xc91e84f8, 0xf83dbbd2, 0xf330b2dc, 0xee27a9ce, 0xe52aa0c0, 0x3cb1477a, 0x37bc4e74, 0x2aab5566, 0x21a65c68, 0x10856342, 0x1b886a4c, 0x69f715e, 0xd927850, 0x64d90f0a, 0x6fd40604, 0x72c31d16, 0x79ce1418, 0x48ed2b32, 0x43e0223c, 0x5ef7392e, 0x55fa3020, 0x1b79aec, 0xaba93e2, 0x17ad88f0, 0x1ca081fe, 0x2d83bed4, 0x268eb7da, 0x3b99acc8, 0x3094a5c6, 0x59dfd29c, 0x52d2db92, 0x4fc5c080, 0x44c8c98e, 0x75ebf6a4, 0x7ee6ffaa, 0x63f1e4b8, 0x68fcedb6, 0xb1670a0c, 0xba6a0302, 0xa77d1810, 0xac70111e, 0x9d532e34, 0x965e273a, 0x8b493c28, 0x80443526, 0xe90f427c, 0xe2024b72, 0xff155060, 0xf418596e, 0xc53b6644, 0xce366f4a, 0xd3217458, 0xd82c7d56, 0x7a0ca137, 0x7101a839, 0x6c16b32b, 0x671bba25, 0x5638850f, 0x5d358c01, 0x40229713, 0x4b2f9e1d, 0x2264e947, 0x2969e049, 0x347efb5b, 0x3f73f255, 0xe50cd7f, 0x55dc471, 0x184adf63, 0x1347d66d, 0xcadc31d7, 0xc1d138d9, 0xdcc623cb, 0xd7cb2ac5, 0xe6e815ef, 0xede51ce1, 0xf0f207f3, 0xfbff0efd, 0x92b479a7, 0x99b970a9, 0x84ae6bbb, 0x8fa362b5, 0xbe805d9f, 0xb58d5491, 0xa89a4f83, 0xa397468d] + @usableFromInline static let U2: Array = [0x0, 0xd090e0b, 0x1a121c16, 0x171b121d, 0x3424382c, 0x392d3627, 0x2e36243a, 0x233f2a31, 0x68487058, 0x65417e53, 0x725a6c4e, 0x7f536245, 0x5c6c4874, 0x5165467f, 0x467e5462, 0x4b775a69, 0xd090e0b0, 0xdd99eebb, 0xca82fca6, 0xc78bf2ad, 0xe4b4d89c, 0xe9bdd697, 0xfea6c48a, 0xf3afca81, 0xb8d890e8, 0xb5d19ee3, 0xa2ca8cfe, 0xafc382f5, 0x8cfca8c4, 0x81f5a6cf, 0x96eeb4d2, 0x9be7bad9, 0xbb3bdb7b, 0xb632d570, 0xa129c76d, 0xac20c966, 0x8f1fe357, 0x8216ed5c, 0x950dff41, 0x9804f14a, 0xd373ab23, 0xde7aa528, 0xc961b735, 0xc468b93e, 0xe757930f, 0xea5e9d04, 0xfd458f19, 0xf04c8112, 0x6bab3bcb, 0x66a235c0, 0x71b927dd, 0x7cb029d6, 0x5f8f03e7, 0x52860dec, 0x459d1ff1, 0x489411fa, 0x3e34b93, 0xeea4598, 0x19f15785, 0x14f8598e, 0x37c773bf, 0x3ace7db4, 0x2dd56fa9, 0x20dc61a2, 0x6d76adf6, 0x607fa3fd, 0x7764b1e0, 0x7a6dbfeb, 0x595295da, 0x545b9bd1, 0x434089cc, 0x4e4987c7, 0x53eddae, 0x837d3a5, 0x1f2cc1b8, 0x1225cfb3, 0x311ae582, 0x3c13eb89, 0x2b08f994, 0x2601f79f, 0xbde64d46, 0xb0ef434d, 0xa7f45150, 0xaafd5f5b, 0x89c2756a, 0x84cb7b61, 0x93d0697c, 0x9ed96777, 0xd5ae3d1e, 0xd8a73315, 0xcfbc2108, 0xc2b52f03, 0xe18a0532, 0xec830b39, 0xfb981924, 0xf691172f, 0xd64d768d, 0xdb447886, 0xcc5f6a9b, 0xc1566490, 0xe2694ea1, 0xef6040aa, 0xf87b52b7, 0xf5725cbc, 0xbe0506d5, 0xb30c08de, 0xa4171ac3, 0xa91e14c8, 0x8a213ef9, 0x872830f2, 0x903322ef, 0x9d3a2ce4, 0x6dd963d, 0xbd49836, 0x1ccf8a2b, 0x11c68420, 0x32f9ae11, 0x3ff0a01a, 0x28ebb207, 0x25e2bc0c, 0x6e95e665, 0x639ce86e, 0x7487fa73, 0x798ef478, 0x5ab1de49, 0x57b8d042, 0x40a3c25f, 0x4daacc54, 0xdaec41f7, 0xd7e54ffc, 0xc0fe5de1, 0xcdf753ea, 0xeec879db, 0xe3c177d0, 0xf4da65cd, 0xf9d36bc6, 0xb2a431af, 0xbfad3fa4, 0xa8b62db9, 0xa5bf23b2, 0x86800983, 0x8b890788, 0x9c921595, 0x919b1b9e, 0xa7ca147, 0x775af4c, 0x106ebd51, 0x1d67b35a, 0x3e58996b, 0x33519760, 0x244a857d, 0x29438b76, 0x6234d11f, 0x6f3ddf14, 0x7826cd09, 0x752fc302, 0x5610e933, 0x5b19e738, 0x4c02f525, 0x410bfb2e, 0x61d79a8c, 0x6cde9487, 0x7bc5869a, 0x76cc8891, 0x55f3a2a0, 0x58faacab, 0x4fe1beb6, 0x42e8b0bd, 0x99fead4, 0x496e4df, 0x138df6c2, 0x1e84f8c9, 0x3dbbd2f8, 0x30b2dcf3, 0x27a9ceee, 0x2aa0c0e5, 0xb1477a3c, 0xbc4e7437, 0xab55662a, 0xa65c6821, 0x85634210, 0x886a4c1b, 0x9f715e06, 0x9278500d, 0xd90f0a64, 0xd406046f, 0xc31d1672, 0xce141879, 0xed2b3248, 0xe0223c43, 0xf7392e5e, 0xfa302055, 0xb79aec01, 0xba93e20a, 0xad88f017, 0xa081fe1c, 0x83bed42d, 0x8eb7da26, 0x99acc83b, 0x94a5c630, 0xdfd29c59, 0xd2db9252, 0xc5c0804f, 0xc8c98e44, 0xebf6a475, 0xe6ffaa7e, 0xf1e4b863, 0xfcedb668, 0x670a0cb1, 0x6a0302ba, 0x7d1810a7, 0x70111eac, 0x532e349d, 0x5e273a96, 0x493c288b, 0x44352680, 0xf427ce9, 0x24b72e2, 0x155060ff, 0x18596ef4, 0x3b6644c5, 0x366f4ace, 0x217458d3, 0x2c7d56d8, 0xca1377a, 0x1a83971, 0x16b32b6c, 0x1bba2567, 0x38850f56, 0x358c015d, 0x22971340, 0x2f9e1d4b, 0x64e94722, 0x69e04929, 0x7efb5b34, 0x73f2553f, 0x50cd7f0e, 0x5dc47105, 0x4adf6318, 0x47d66d13, 0xdc31d7ca, 0xd138d9c1, 0xc623cbdc, 0xcb2ac5d7, 0xe815efe6, 0xe51ce1ed, 0xf207f3f0, 0xff0efdfb, 0xb479a792, 0xb970a999, 0xae6bbb84, 0xa362b58f, 0x805d9fbe, 0x8d5491b5, 0x9a4f83a8, 0x97468da3] + @usableFromInline static let U3: Array = [0x0, 0x90e0b0d, 0x121c161a, 0x1b121d17, 0x24382c34, 0x2d362739, 0x36243a2e, 0x3f2a3123, 0x48705868, 0x417e5365, 0x5a6c4e72, 0x5362457f, 0x6c48745c, 0x65467f51, 0x7e546246, 0x775a694b, 0x90e0b0d0, 0x99eebbdd, 0x82fca6ca, 0x8bf2adc7, 0xb4d89ce4, 0xbdd697e9, 0xa6c48afe, 0xafca81f3, 0xd890e8b8, 0xd19ee3b5, 0xca8cfea2, 0xc382f5af, 0xfca8c48c, 0xf5a6cf81, 0xeeb4d296, 0xe7bad99b, 0x3bdb7bbb, 0x32d570b6, 0x29c76da1, 0x20c966ac, 0x1fe3578f, 0x16ed5c82, 0xdff4195, 0x4f14a98, 0x73ab23d3, 0x7aa528de, 0x61b735c9, 0x68b93ec4, 0x57930fe7, 0x5e9d04ea, 0x458f19fd, 0x4c8112f0, 0xab3bcb6b, 0xa235c066, 0xb927dd71, 0xb029d67c, 0x8f03e75f, 0x860dec52, 0x9d1ff145, 0x9411fa48, 0xe34b9303, 0xea45980e, 0xf1578519, 0xf8598e14, 0xc773bf37, 0xce7db43a, 0xd56fa92d, 0xdc61a220, 0x76adf66d, 0x7fa3fd60, 0x64b1e077, 0x6dbfeb7a, 0x5295da59, 0x5b9bd154, 0x4089cc43, 0x4987c74e, 0x3eddae05, 0x37d3a508, 0x2cc1b81f, 0x25cfb312, 0x1ae58231, 0x13eb893c, 0x8f9942b, 0x1f79f26, 0xe64d46bd, 0xef434db0, 0xf45150a7, 0xfd5f5baa, 0xc2756a89, 0xcb7b6184, 0xd0697c93, 0xd967779e, 0xae3d1ed5, 0xa73315d8, 0xbc2108cf, 0xb52f03c2, 0x8a0532e1, 0x830b39ec, 0x981924fb, 0x91172ff6, 0x4d768dd6, 0x447886db, 0x5f6a9bcc, 0x566490c1, 0x694ea1e2, 0x6040aaef, 0x7b52b7f8, 0x725cbcf5, 0x506d5be, 0xc08deb3, 0x171ac3a4, 0x1e14c8a9, 0x213ef98a, 0x2830f287, 0x3322ef90, 0x3a2ce49d, 0xdd963d06, 0xd498360b, 0xcf8a2b1c, 0xc6842011, 0xf9ae1132, 0xf0a01a3f, 0xebb20728, 0xe2bc0c25, 0x95e6656e, 0x9ce86e63, 0x87fa7374, 0x8ef47879, 0xb1de495a, 0xb8d04257, 0xa3c25f40, 0xaacc544d, 0xec41f7da, 0xe54ffcd7, 0xfe5de1c0, 0xf753eacd, 0xc879dbee, 0xc177d0e3, 0xda65cdf4, 0xd36bc6f9, 0xa431afb2, 0xad3fa4bf, 0xb62db9a8, 0xbf23b2a5, 0x80098386, 0x8907888b, 0x9215959c, 0x9b1b9e91, 0x7ca1470a, 0x75af4c07, 0x6ebd5110, 0x67b35a1d, 0x58996b3e, 0x51976033, 0x4a857d24, 0x438b7629, 0x34d11f62, 0x3ddf146f, 0x26cd0978, 0x2fc30275, 0x10e93356, 0x19e7385b, 0x2f5254c, 0xbfb2e41, 0xd79a8c61, 0xde94876c, 0xc5869a7b, 0xcc889176, 0xf3a2a055, 0xfaacab58, 0xe1beb64f, 0xe8b0bd42, 0x9fead409, 0x96e4df04, 0x8df6c213, 0x84f8c91e, 0xbbd2f83d, 0xb2dcf330, 0xa9ceee27, 0xa0c0e52a, 0x477a3cb1, 0x4e7437bc, 0x55662aab, 0x5c6821a6, 0x63421085, 0x6a4c1b88, 0x715e069f, 0x78500d92, 0xf0a64d9, 0x6046fd4, 0x1d1672c3, 0x141879ce, 0x2b3248ed, 0x223c43e0, 0x392e5ef7, 0x302055fa, 0x9aec01b7, 0x93e20aba, 0x88f017ad, 0x81fe1ca0, 0xbed42d83, 0xb7da268e, 0xacc83b99, 0xa5c63094, 0xd29c59df, 0xdb9252d2, 0xc0804fc5, 0xc98e44c8, 0xf6a475eb, 0xffaa7ee6, 0xe4b863f1, 0xedb668fc, 0xa0cb167, 0x302ba6a, 0x1810a77d, 0x111eac70, 0x2e349d53, 0x273a965e, 0x3c288b49, 0x35268044, 0x427ce90f, 0x4b72e202, 0x5060ff15, 0x596ef418, 0x6644c53b, 0x6f4ace36, 0x7458d321, 0x7d56d82c, 0xa1377a0c, 0xa8397101, 0xb32b6c16, 0xba25671b, 0x850f5638, 0x8c015d35, 0x97134022, 0x9e1d4b2f, 0xe9472264, 0xe0492969, 0xfb5b347e, 0xf2553f73, 0xcd7f0e50, 0xc471055d, 0xdf63184a, 0xd66d1347, 0x31d7cadc, 0x38d9c1d1, 0x23cbdcc6, 0x2ac5d7cb, 0x15efe6e8, 0x1ce1ede5, 0x7f3f0f2, 0xefdfbff, 0x79a792b4, 0x70a999b9, 0x6bbb84ae, 0x62b58fa3, 0x5d9fbe80, 0x5491b58d, 0x4f83a89a, 0x468da397] + @usableFromInline static let U4: Array = [0x0, 0xe0b0d09, 0x1c161a12, 0x121d171b, 0x382c3424, 0x3627392d, 0x243a2e36, 0x2a31233f, 0x70586848, 0x7e536541, 0x6c4e725a, 0x62457f53, 0x48745c6c, 0x467f5165, 0x5462467e, 0x5a694b77, 0xe0b0d090, 0xeebbdd99, 0xfca6ca82, 0xf2adc78b, 0xd89ce4b4, 0xd697e9bd, 0xc48afea6, 0xca81f3af, 0x90e8b8d8, 0x9ee3b5d1, 0x8cfea2ca, 0x82f5afc3, 0xa8c48cfc, 0xa6cf81f5, 0xb4d296ee, 0xbad99be7, 0xdb7bbb3b, 0xd570b632, 0xc76da129, 0xc966ac20, 0xe3578f1f, 0xed5c8216, 0xff41950d, 0xf14a9804, 0xab23d373, 0xa528de7a, 0xb735c961, 0xb93ec468, 0x930fe757, 0x9d04ea5e, 0x8f19fd45, 0x8112f04c, 0x3bcb6bab, 0x35c066a2, 0x27dd71b9, 0x29d67cb0, 0x3e75f8f, 0xdec5286, 0x1ff1459d, 0x11fa4894, 0x4b9303e3, 0x45980eea, 0x578519f1, 0x598e14f8, 0x73bf37c7, 0x7db43ace, 0x6fa92dd5, 0x61a220dc, 0xadf66d76, 0xa3fd607f, 0xb1e07764, 0xbfeb7a6d, 0x95da5952, 0x9bd1545b, 0x89cc4340, 0x87c74e49, 0xddae053e, 0xd3a50837, 0xc1b81f2c, 0xcfb31225, 0xe582311a, 0xeb893c13, 0xf9942b08, 0xf79f2601, 0x4d46bde6, 0x434db0ef, 0x5150a7f4, 0x5f5baafd, 0x756a89c2, 0x7b6184cb, 0x697c93d0, 0x67779ed9, 0x3d1ed5ae, 0x3315d8a7, 0x2108cfbc, 0x2f03c2b5, 0x532e18a, 0xb39ec83, 0x1924fb98, 0x172ff691, 0x768dd64d, 0x7886db44, 0x6a9bcc5f, 0x6490c156, 0x4ea1e269, 0x40aaef60, 0x52b7f87b, 0x5cbcf572, 0x6d5be05, 0x8deb30c, 0x1ac3a417, 0x14c8a91e, 0x3ef98a21, 0x30f28728, 0x22ef9033, 0x2ce49d3a, 0x963d06dd, 0x98360bd4, 0x8a2b1ccf, 0x842011c6, 0xae1132f9, 0xa01a3ff0, 0xb20728eb, 0xbc0c25e2, 0xe6656e95, 0xe86e639c, 0xfa737487, 0xf478798e, 0xde495ab1, 0xd04257b8, 0xc25f40a3, 0xcc544daa, 0x41f7daec, 0x4ffcd7e5, 0x5de1c0fe, 0x53eacdf7, 0x79dbeec8, 0x77d0e3c1, 0x65cdf4da, 0x6bc6f9d3, 0x31afb2a4, 0x3fa4bfad, 0x2db9a8b6, 0x23b2a5bf, 0x9838680, 0x7888b89, 0x15959c92, 0x1b9e919b, 0xa1470a7c, 0xaf4c0775, 0xbd51106e, 0xb35a1d67, 0x996b3e58, 0x97603351, 0x857d244a, 0x8b762943, 0xd11f6234, 0xdf146f3d, 0xcd097826, 0xc302752f, 0xe9335610, 0xe7385b19, 0xf5254c02, 0xfb2e410b, 0x9a8c61d7, 0x94876cde, 0x869a7bc5, 0x889176cc, 0xa2a055f3, 0xacab58fa, 0xbeb64fe1, 0xb0bd42e8, 0xead4099f, 0xe4df0496, 0xf6c2138d, 0xf8c91e84, 0xd2f83dbb, 0xdcf330b2, 0xceee27a9, 0xc0e52aa0, 0x7a3cb147, 0x7437bc4e, 0x662aab55, 0x6821a65c, 0x42108563, 0x4c1b886a, 0x5e069f71, 0x500d9278, 0xa64d90f, 0x46fd406, 0x1672c31d, 0x1879ce14, 0x3248ed2b, 0x3c43e022, 0x2e5ef739, 0x2055fa30, 0xec01b79a, 0xe20aba93, 0xf017ad88, 0xfe1ca081, 0xd42d83be, 0xda268eb7, 0xc83b99ac, 0xc63094a5, 0x9c59dfd2, 0x9252d2db, 0x804fc5c0, 0x8e44c8c9, 0xa475ebf6, 0xaa7ee6ff, 0xb863f1e4, 0xb668fced, 0xcb1670a, 0x2ba6a03, 0x10a77d18, 0x1eac7011, 0x349d532e, 0x3a965e27, 0x288b493c, 0x26804435, 0x7ce90f42, 0x72e2024b, 0x60ff1550, 0x6ef41859, 0x44c53b66, 0x4ace366f, 0x58d32174, 0x56d82c7d, 0x377a0ca1, 0x397101a8, 0x2b6c16b3, 0x25671bba, 0xf563885, 0x15d358c, 0x13402297, 0x1d4b2f9e, 0x472264e9, 0x492969e0, 0x5b347efb, 0x553f73f2, 0x7f0e50cd, 0x71055dc4, 0x63184adf, 0x6d1347d6, 0xd7cadc31, 0xd9c1d138, 0xcbdcc623, 0xc5d7cb2a, 0xefe6e815, 0xe1ede51c, 0xf3f0f207, 0xfdfbff0e, 0xa792b479, 0xa999b970, 0xbb84ae6b, 0xb58fa362, 0x9fbe805d, 0x91b58d54, 0x83a89a4f, 0x8da39746] + + /// Initialize AES with variant calculated out of key length: + /// - 16 bytes (AES-128) + /// - 24 bytes (AES-192) + /// - 32 bytes (AES-256) + /// + /// - parameter key: Key. Length of the key decides on AES variant. + /// - parameter iv: Initialization Vector (Optional for some blockMode values) + /// - parameter blockMode: Cipher mode of operation + /// - parameter padding: Padding method. .pkcs7, .noPadding, .zeroPadding, ... + /// + /// - throws: AES.Error + /// + /// - returns: Instance + public init(key: Array, blockMode: BlockMode, padding: Padding = .pkcs7) throws { + self.key = Key(bytes: key) + self.blockMode = blockMode + self.padding = padding + self.keySize = self.key.count + + // Validate key size + switch self.keySize * 8 { + case 128: + self.variant = .aes128 + case 192: + self.variant = .aes192 + case 256: + self.variant = .aes256 + default: + throw Error.invalidKeySize + } + + self.variantNb = self.variant.Nb + self.variantNk = self.variant.Nk + self.variantNr = self.variant.Nr + } + + @inlinable + internal func encrypt(block: ArraySlice) -> Array? { + if self.blockMode.options.contains(.paddingRequired) && block.count != AES.blockSize { + return Array(block) + } + + let rounds = self.variantNr + let rk = self.expandedKey + + let b00 = UInt32(block[block.startIndex.advanced(by: 0)]) + let b01 = UInt32(block[block.startIndex.advanced(by: 1)]) << 8 + let b02 = UInt32(block[block.startIndex.advanced(by: 2)]) << 16 + let b03 = UInt32(block[block.startIndex.advanced(by: 3)]) << 24 + var b0 = b00 | b01 | b02 | b03 + + let b10 = UInt32(block[block.startIndex.advanced(by: 4)]) + let b11 = UInt32(block[block.startIndex.advanced(by: 5)]) << 8 + let b12 = UInt32(block[block.startIndex.advanced(by: 6)]) << 16 + let b13 = UInt32(block[block.startIndex.advanced(by: 7)]) << 24 + var b1 = b10 | b11 | b12 | b13 + + let b20 = UInt32(block[block.startIndex.advanced(by: 8)]) + let b21 = UInt32(block[block.startIndex.advanced(by: 9)]) << 8 + let b22 = UInt32(block[block.startIndex.advanced(by: 10)]) << 16 + let b23 = UInt32(block[block.startIndex.advanced(by: 11)]) << 24 + var b2 = b20 | b21 | b22 | b23 + + let b30 = UInt32(block[block.startIndex.advanced(by: 12)]) + let b31 = UInt32(block[block.startIndex.advanced(by: 13)]) << 8 + let b32 = UInt32(block[block.startIndex.advanced(by: 14)]) << 16 + let b33 = UInt32(block[block.startIndex.advanced(by: 15)]) << 24 + var b3 = b30 | b31 | b32 | b33 + + let tLength = 4 + let t = UnsafeMutablePointer.allocate(capacity: tLength) + t.initialize(repeating: 0, count: tLength) + defer { + t.deinitialize(count: tLength) + t.deallocate() + } + + for r in 0..> 8) & 0xff)] + let lb02 = AES.T2[Int((t[2] >> 16) & 0xff)] + let lb03 = AES.T3[Int(t[3] >> 24)] + b0 = lb00 ^ lb01 ^ lb02 ^ lb03 + + let lb10 = AES.T0[Int(t[1] & 0xff)] + let lb11 = AES.T1[Int((t[2] >> 8) & 0xff)] + let lb12 = AES.T2[Int((t[3] >> 16) & 0xff)] + let lb13 = AES.T3[Int(t[0] >> 24)] + b1 = lb10 ^ lb11 ^ lb12 ^ lb13 + + let lb20 = AES.T0[Int(t[2] & 0xff)] + let lb21 = AES.T1[Int((t[3] >> 8) & 0xff)] + let lb22 = AES.T2[Int((t[0] >> 16) & 0xff)] + let lb23 = AES.T3[Int(t[1] >> 24)] + b2 = lb20 ^ lb21 ^ lb22 ^ lb23 + + let lb30 = AES.T0[Int(t[3] & 0xff)] + let lb31 = AES.T1[Int((t[0] >> 8) & 0xff)] + let lb32 = AES.T2[Int((t[1] >> 16) & 0xff)] + let lb33 = AES.T3[Int(t[2] >> 24)] + b3 = lb30 ^ lb31 ^ lb32 ^ lb33 + } + + // last round + let r = rounds - 1 + + t[0] = b0 ^ rk[r][0] + t[1] = b1 ^ rk[r][1] + t[2] = b2 ^ rk[r][2] + t[3] = b3 ^ rk[r][3] + + // rounds + b0 = F1(t[0], t[1], t[2], t[3]) ^ rk[rounds][0] + b1 = F1(t[1], t[2], t[3], t[0]) ^ rk[rounds][1] + b2 = F1(t[2], t[3], t[0], t[1]) ^ rk[rounds][2] + b3 = F1(t[3], t[0], t[1], t[2]) ^ rk[rounds][3] + + let encrypted: Array = [ + UInt8(b0 & 0xff), UInt8((b0 >> 8) & 0xff), UInt8((b0 >> 16) & 0xff), UInt8((b0 >> 24) & 0xff), + UInt8(b1 & 0xff), UInt8((b1 >> 8) & 0xff), UInt8((b1 >> 16) & 0xff), UInt8((b1 >> 24) & 0xff), + UInt8(b2 & 0xff), UInt8((b2 >> 8) & 0xff), UInt8((b2 >> 16) & 0xff), UInt8((b2 >> 24) & 0xff), + UInt8(b3 & 0xff), UInt8((b3 >> 8) & 0xff), UInt8((b3 >> 16) & 0xff), UInt8((b3 >> 24) & 0xff) + ] + return encrypted + } + + @usableFromInline + internal func decrypt(block: ArraySlice) -> Array? { + if self.blockMode.options.contains(.paddingRequired) && block.count != AES.blockSize { + return Array(block) + } + + let rounds = self.variantNr + let rk = self.expandedKeyInv + + // Save miliseconds by not using `block.toUInt32Array()` + let b00 = UInt32(block[block.startIndex.advanced(by: 0)]) + let b01 = UInt32(block[block.startIndex.advanced(by: 1)]) << 8 + let b02 = UInt32(block[block.startIndex.advanced(by: 2)]) << 16 + let b03 = UInt32(block[block.startIndex.advanced(by: 3)]) << 24 + var b0 = b00 | b01 | b02 | b03 + + let b10 = UInt32(block[block.startIndex.advanced(by: 4)]) + let b11 = UInt32(block[block.startIndex.advanced(by: 5)]) << 8 + let b12 = UInt32(block[block.startIndex.advanced(by: 6)]) << 16 + let b13 = UInt32(block[block.startIndex.advanced(by: 7)]) << 24 + var b1 = b10 | b11 | b12 | b13 + + let b20 = UInt32(block[block.startIndex.advanced(by: 8)]) + let b21 = UInt32(block[block.startIndex.advanced(by: 9)]) << 8 + let b22 = UInt32(block[block.startIndex.advanced(by: 10)]) << 16 + let b23 = UInt32(block[block.startIndex.advanced(by: 11)]) << 24 + var b2 = b20 | b21 | b22 | b23 + + let b30 = UInt32(block[block.startIndex.advanced(by: 12)]) + let b31 = UInt32(block[block.startIndex.advanced(by: 13)]) << 8 + let b32 = UInt32(block[block.startIndex.advanced(by: 14)]) << 16 + let b33 = UInt32(block[block.startIndex.advanced(by: 15)]) << 24 + var b3 = b30 | b31 | b32 | b33 + + let tLength = 4 + let t = UnsafeMutablePointer.allocate(capacity: tLength) + t.initialize(repeating: 0, count: tLength) + defer { + t.deinitialize(count: tLength) + t.deallocate() + } + + for r in (2...rounds).reversed() { + t[0] = b0 ^ rk[r][0] + t[1] = b1 ^ rk[r][1] + t[2] = b2 ^ rk[r][2] + t[3] = b3 ^ rk[r][3] + + let b00 = AES.T0_INV[Int(t[0] & 0xff)] + let b01 = AES.T1_INV[Int((t[3] >> 8) & 0xff)] + let b02 = AES.T2_INV[Int((t[2] >> 16) & 0xff)] + let b03 = AES.T3_INV[Int(t[1] >> 24)] + b0 = b00 ^ b01 ^ b02 ^ b03 + + let b10 = AES.T0_INV[Int(t[1] & 0xff)] + let b11 = AES.T1_INV[Int((t[0] >> 8) & 0xff)] + let b12 = AES.T2_INV[Int((t[3] >> 16) & 0xff)] + let b13 = AES.T3_INV[Int(t[2] >> 24)] + b1 = b10 ^ b11 ^ b12 ^ b13 + + let b20 = AES.T0_INV[Int(t[2] & 0xff)] + let b21 = AES.T1_INV[Int((t[1] >> 8) & 0xff)] + let b22 = AES.T2_INV[Int((t[0] >> 16) & 0xff)] + let b23 = AES.T3_INV[Int(t[3] >> 24)] + b2 = b20 ^ b21 ^ b22 ^ b23 + + let b30 = AES.T0_INV[Int(t[3] & 0xff)] + let b31 = AES.T1_INV[Int((t[2] >> 8) & 0xff)] + let b32 = AES.T2_INV[Int((t[1] >> 16) & 0xff)] + let b33 = AES.T3_INV[Int(t[0] >> 24)] + b3 = b30 ^ b31 ^ b32 ^ b33 + } + + // last round + t[0] = b0 ^ rk[1][0] + t[1] = b1 ^ rk[1][1] + t[2] = b2 ^ rk[1][2] + t[3] = b3 ^ rk[1][3] + + // rounds + + let lb00 = self.sBoxInv[Int(B0(t[0]))] + let lb01 = (sBoxInv[Int(B1(t[3]))] << 8) + let lb02 = (sBoxInv[Int(B2(t[2]))] << 16) + let lb03 = (sBoxInv[Int(B3(t[1]))] << 24) + b0 = lb00 | lb01 | lb02 | lb03 ^ rk[0][0] + + let lb10 = self.sBoxInv[Int(B0(t[1]))] + let lb11 = (sBoxInv[Int(B1(t[0]))] << 8) + let lb12 = (sBoxInv[Int(B2(t[3]))] << 16) + let lb13 = (sBoxInv[Int(B3(t[2]))] << 24) + b1 = lb10 | lb11 | lb12 | lb13 ^ rk[0][1] + + let lb20 = self.sBoxInv[Int(B0(t[2]))] + let lb21 = (sBoxInv[Int(B1(t[1]))] << 8) + let lb22 = (sBoxInv[Int(B2(t[0]))] << 16) + let lb23 = (sBoxInv[Int(B3(t[3]))] << 24) + b2 = lb20 | lb21 | lb22 | lb23 ^ rk[0][2] + + let lb30 = self.sBoxInv[Int(B0(t[3]))] + let lb31 = (sBoxInv[Int(B1(t[2]))] << 8) + let lb32 = (sBoxInv[Int(B2(t[1]))] << 16) + let lb33 = (sBoxInv[Int(B3(t[0]))] << 24) + b3 = lb30 | lb31 | lb32 | lb33 ^ rk[0][3] + + let result: Array = [ + UInt8(b0 & 0xff), UInt8((b0 >> 8) & 0xff), UInt8((b0 >> 16) & 0xff), UInt8((b0 >> 24) & 0xff), + UInt8(b1 & 0xff), UInt8((b1 >> 8) & 0xff), UInt8((b1 >> 16) & 0xff), UInt8((b1 >> 24) & 0xff), + UInt8(b2 & 0xff), UInt8((b2 >> 8) & 0xff), UInt8((b2 >> 16) & 0xff), UInt8((b2 >> 24) & 0xff), + UInt8(b3 & 0xff), UInt8((b3 >> 8) & 0xff), UInt8((b3 >> 16) & 0xff), UInt8((b3 >> 24) & 0xff) + ] + return result + } +} + +extension AES { + private func expandKeyInv(_ key: Key, variant: Variant) -> Array> { + let rounds = self.variantNr + var rk2: Array> = self.expandKey(key, variant: variant) + + for r in 1.. Array> { + func convertExpandedKey(_ expanded: Array) -> Array> { + expanded.batched(by: 4).map({ UInt32(bytes: $0.reversed()) }).batched(by: 4).map { Array($0) } + } + + /* + * Function used in the Key Expansion routine that takes a four-byte + * input word and applies an S-box to each of the four bytes to + * produce an output word. + */ + func subWord(_ word: Array) -> Array { + precondition(word.count == 4) + + var result = word + for i in 0..<4 { + result[i] = UInt8(self.sBox[Int(word[i])]) + } + return result + } + + @inline(__always) + func subWordInPlace(_ word: inout Array) { + precondition(word.count == 4) + word[0] = UInt8(self.sBox[Int(word[0])]) + word[1] = UInt8(self.sBox[Int(word[1])]) + word[2] = UInt8(self.sBox[Int(word[2])]) + word[3] = UInt8(self.sBox[Int(word[3])]) + } + + let wLength = self.variantNb * (self.variantNr + 1) * 4 + let w = UnsafeMutablePointer.allocate(capacity: wLength) + w.initialize(repeating: 0, count: wLength) + defer { + w.deinitialize(count: wLength) + w.deallocate() + } + + for i in 0.. + + for i in self.variantNk..(repeating: 0, count: 4) + + for wordIdx in 0..<4 { + tmp[wordIdx] = w[4 * (i - 1) + wordIdx] + } + if (i % self.variantNk) == 0 { + tmp = subWord(rotateLeft(UInt32(bytes: tmp), by: 8).bytes(totalBytes: 4)) + tmp[0] = tmp.first! ^ AES.Rcon[i / variantNk] + } else if self.variantNk > 6 && (i % self.variantNk) == 4 { + subWordInPlace(&tmp) + } + + // xor array of bytes + for wordIdx in 0..<4 { + w[4 * i + wordIdx] = w[4 * (i - variantNk) + wordIdx] ^ tmp[wordIdx] + } + } + return convertExpandedKey(Array(UnsafeBufferPointer(start: w, count: wLength))) + } + + @inline(__always) + private func B0(_ x: UInt32) -> UInt32 { + x & 0xff + } + + @inline(__always) + private func B1(_ x: UInt32) -> UInt32 { + (x >> 8) & 0xff + } + + @inline(__always) + private func B2(_ x: UInt32) -> UInt32 { + (x >> 16) & 0xff + } + + @inline(__always) + private func B3(_ x: UInt32) -> UInt32 { + (x >> 24) & 0xff + } + + @inline(__always) @usableFromInline + internal func F1(_ x0: UInt32, _ x1: UInt32, _ x2: UInt32, _ x3: UInt32) -> UInt32 { + var result: UInt32 = 0 + result |= UInt32(self.B1(AES.T0[Int(x0 & 255)])) + result |= UInt32(self.B1(AES.T0[Int((x1 >> 8) & 255)])) << 8 + result |= UInt32(self.B1(AES.T0[Int((x2 >> 16) & 255)])) << 16 + result |= UInt32(self.B1(AES.T0[Int(x3 >> 24)])) << 24 + return result + } + + private func calculateSBox() -> (sBox: Array, invSBox: Array) { + let sboxLength = 256 + let sbox = UnsafeMutablePointer.allocate(capacity: sboxLength) + let invsbox = UnsafeMutablePointer.allocate(capacity: sboxLength) + sbox.initialize(repeating: 0, count: sboxLength) + invsbox.initialize(repeating: 0, count: sboxLength) + defer { + sbox.deinitialize(count: sboxLength) + sbox.deallocate() + invsbox.deinitialize(count: sboxLength) + invsbox.deallocate() + } + + sbox[0] = 0x63 + + var p: UInt8 = 1, q: UInt8 = 1 + + repeat { + p = p ^ (UInt8(truncatingIfNeeded: Int(p) << 1) ^ ((p & 0x80) == 0x80 ? 0x1b : 0)) + q ^= q << 1 + q ^= q << 2 + q ^= q << 4 + q ^= (q & 0x80) == 0x80 ? 0x09 : 0 + + let s = 0x63 ^ q ^ rotateLeft(q, by: 1) ^ rotateLeft(q, by: 2) ^ rotateLeft(q, by: 3) ^ rotateLeft(q, by: 4) + + sbox[Int(p)] = UInt32(s) + invsbox[Int(s)] = UInt32(p) + } while p != 1 + + return (sBox: Array(UnsafeBufferPointer(start: sbox, count: sboxLength)), invSBox: Array(UnsafeBufferPointer(start: invsbox, count: sboxLength))) + } +} + +// MARK: Cipher + +extension AES: Cipher { + @inlinable + public func encrypt(_ bytes: ArraySlice) throws -> Array { + let blockSize = self.blockMode.customBlockSize ?? AES.blockSize + let chunks = bytes.batched(by: blockSize) + + var oneTimeCryptor = try makeEncryptor() + var out = Array(reserveCapacity: bytes.count) + for chunk in chunks { + out += try oneTimeCryptor.update(withBytes: chunk, isLast: false) + } + // Padding may be added at the very end + out += try oneTimeCryptor.finish() + + if self.blockMode.options.contains(.paddingRequired) && (out.count % AES.blockSize != 0) { + throw Error.dataPaddingRequired + } + + return out + } + + @inlinable + public func decrypt(_ bytes: ArraySlice) throws -> Array { + if self.blockMode.options.contains(.paddingRequired) && (bytes.count % AES.blockSize != 0) { + throw Error.dataPaddingRequired + } + + var oneTimeCryptor = try makeDecryptor() + let chunks = bytes.batched(by: AES.blockSize) + if chunks.isEmpty { + throw Error.invalidData + } + + var out = Array(reserveCapacity: bytes.count) + + var lastIdx = chunks.startIndex + chunks.indices.formIndex(&lastIdx, offsetBy: chunks.count - 1) + + // To properly remove padding, `isLast` has to be known when called with the last chunk of ciphertext + // Last chunk of ciphertext may contains padded data so next call to update(..) won't be able to remove it + for idx in chunks.indices { + out += try oneTimeCryptor.update(withBytes: chunks[idx], isLast: idx == lastIdx) + } + return out + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1.swift new file mode 100644 index 00000000..e1e289af --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1.swift @@ -0,0 +1,87 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// ASN1 Code inspired by Asn1Parser.swift from SwiftyRSA + +import Foundation + +/// A Partial ASN.1 (Abstract Syntax Notation 1) Encoder & Decoder Implementation. +/// +/// - Note: This implementation is limited to a few core types and is not an exhaustive / complete ASN1 implementation +/// - Warning: This implementation has been developed for encoding and decoding DER & PEM files specifically. If you're using this Encoder/Decoder on other ASN1 structures, make sure you test the expected behavior appropriately. +enum ASN1 { + internal enum IDENTIFIERS: UInt8, Equatable { + case SEQUENCE = 0x30 + case INTERGER = 0x02 + case OBJECTID = 0x06 + case NULL = 0x05 + case BITSTRING = 0x03 + case OCTETSTRING = 0x04 + + static func == (lhs: UInt8, rhs: IDENTIFIERS) -> Bool { + lhs == rhs.rawValue + } + + var bytes: [UInt8] { + switch self { + case .NULL: + return [self.rawValue, 0x00] + default: + return [self.rawValue] + } + } + } + + /// An ASN1 node + internal enum Node: CustomStringConvertible { + /// An array of more `ASN1.Node`s + case sequence(nodes: [Node]) + /// An integer + /// - Note: This ASN1 Encoder makes no assumptions about the sign and bit order of the integers passed in. The conversion from Integer to Data is your responsiblity. + case integer(data: Data) + /// An objectIdentifier + case objectIdentifier(data: Data) + /// A null object + case null + /// A bitString + case bitString(data: Data) + /// An octetString + case octetString(data: Data) + + var description: String { + ASN1.printNode(self, level: 0) + } + } + + internal static func printNode(_ node: ASN1.Node, level: Int) -> String { + var str: [String] = [] + let prefix = String(repeating: "\t", count: level) + switch node { + case .integer(let int): + str.append("\(prefix)Integer: \(int.toHexString())") + case .bitString(let bs): + str.append("\(prefix)BitString: \(bs.toHexString())") + case .null: + str.append("\(prefix)NULL") + case .objectIdentifier(let oid): + str.append("\(prefix)ObjectID: \(oid.toHexString())") + case .octetString(let os): + str.append("\(prefix)OctetString: \(os.toHexString())") + case .sequence(let nodes): + str.append("\(prefix)Sequence:") + nodes.forEach { str.append(printNode($0, level: level + 1)) } + } + return str.joined(separator: "\n") + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Decoder.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Decoder.swift new file mode 100644 index 00000000..dfcb2258 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Decoder.swift @@ -0,0 +1,107 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// ASN1 Code inspired by Asn1Parser.swift from SwiftyRSA + +import Foundation + +extension ASN1 { + /// A simple ASN1 parser that will recursively iterate over a root node and return a Node tree. + /// The root node can be any of the supported nodes described in `Node`. If the parser encounters a sequence + /// it will recursively parse its children. + enum Decoder { + + enum DecodingError: Error { + case noType + case invalidType(value: UInt8) + } + + /// Parses ASN1 data and returns its root node. + /// + /// - Parameter data: ASN1 data to parse + /// - Returns: Root ASN1 Node + /// - Throws: A DecodingError if anything goes wrong, or if an unknown node was encountered + static func decode(data: Data) throws -> Node { + let scanner = ASN1.Scanner(data: data) + let node = try decodeNode(scanner: scanner) + return node + } + + /// Parses an ASN1 given an existing scanner. + /// @warning: this will modify the state (ie: position) of the provided scanner. + /// + /// - Parameter scanner: Scanner to use to consume the data + /// - Returns: Parsed node + /// - Throws: A DecodingError if anything goes wrong, or if an unknown node was encountered + private static func decodeNode(scanner: ASN1.Scanner) throws -> Node { + + let firstByte = try scanner.consume(length: 1).firstByte + + switch firstByte { + case IDENTIFIERS.SEQUENCE.rawValue: + let length = try scanner.consumeLength() + let data = try scanner.consume(length: length) + let nodes = try decodeSequence(data: data) + return .sequence(nodes: nodes) + + case IDENTIFIERS.INTERGER.rawValue: + let length = try scanner.consumeLength() + let data = try scanner.consume(length: length) + return .integer(data: data) + + case IDENTIFIERS.OBJECTID.rawValue: + let length = try scanner.consumeLength() + let data = try scanner.consume(length: length) + return .objectIdentifier(data: data) + + case IDENTIFIERS.NULL.rawValue: + _ = try scanner.consume(length: 1) + return .null + + case IDENTIFIERS.BITSTRING.rawValue: + let length = try scanner.consumeLength() + + // There's an extra byte (0x00) after the bit string length in all the keys I've encountered. + // I couldn't find a specification that referenced this extra byte, but let's consume it and discard it. + _ = try scanner.consume(length: 1) + + let data = try scanner.consume(length: length - 1) + return .bitString(data: data) + + case IDENTIFIERS.OCTETSTRING.rawValue: + let length = try scanner.consumeLength() + let data = try scanner.consume(length: length) + return .octetString(data: data) + + default: + throw DecodingError.invalidType(value: firstByte) + } + } + + /// Parses an ASN1 sequence and returns its child nodes + /// + /// - Parameter data: ASN1 data + /// - Returns: A list of ASN1 nodes + /// - Throws: A DecodingError if anything goes wrong, or if an unknown node was encountered + private static func decodeSequence(data: Data) throws -> [Node] { + let scanner = ASN1.Scanner(data: data) + var nodes: [Node] = [] + while !scanner.isComplete { + let node = try decodeNode(scanner: scanner) + nodes.append(node) + } + return nodes + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Encoder.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Encoder.swift new file mode 100644 index 00000000..b6fb5a0d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Encoder.swift @@ -0,0 +1,69 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// ASN1 Code inspired by Asn1Parser.swift from SwiftyRSA + +import Foundation + +extension ASN1 { + enum Encoder { + /// Encodes an ASN1Node into it's byte representation + /// + /// - Parameter node: The Node to encode + /// - Returns: The encoded bytes as a UInt8 array + /// + /// - Warning: This ASN.1 encoder has only been tested to work on certain ASN.1 data structures such as DER and PEM files. Before using this encoder for another application, ensure you test it's behavior accordingly. + /// - Warning: This encoder makes no assumptions regarding Integer bit layout and signage. The proper serialization of Integers is left up to the user. + public static func encode(_ node: ASN1.Node) -> [UInt8] { + switch node { + case .integer(let integer): + return IDENTIFIERS.INTERGER.bytes + self.asn1LengthPrefixed(integer.bytes) + case .bitString(let bits): + return IDENTIFIERS.BITSTRING.bytes + self.asn1LengthPrefixed([0x00] + bits.bytes) + case .octetString(let octet): + return IDENTIFIERS.OCTETSTRING.bytes + self.asn1LengthPrefixed(octet.bytes) + case .null: + return IDENTIFIERS.NULL.bytes + case .objectIdentifier(let oid): + return IDENTIFIERS.OBJECTID.bytes + self.asn1LengthPrefixed(oid.bytes) + case .sequence(let nodes): + return IDENTIFIERS.SEQUENCE.bytes + self.asn1LengthPrefixed( nodes.reduce(into: Array(), { partialResult, node in + partialResult += encode(node) + })) + } + } + + /// Calculates and returns the ASN.1 length Prefix for a chunk of data + /// + /// - Parameter bytes: The bytes to be length prefixed + /// - Returns: The ASN.1 length Prefix for this chuck of data (excluding the passed in data) + private static func asn1LengthPrefix(_ bytes: [UInt8]) -> [UInt8] { + if bytes.count >= 0x80 { + var lengthAsBytes = withUnsafeBytes(of: bytes.count.bigEndian, Array.init) + while lengthAsBytes.first == 0 { lengthAsBytes.removeFirst() } + return [0x80 + UInt8(lengthAsBytes.count)] + lengthAsBytes + } else { + return [UInt8(bytes.count)] + } + } + + /// Prefixes the provided bytes with the appropriate ASN.1 length prefix + /// + /// - Parameter bytes: The bytes to be length prefixed + /// - Returns: The provided bytes with the appropriate ASN.1 length prefix prepended + private static func asn1LengthPrefixed(_ bytes: [UInt8]) -> [UInt8] { + self.asn1LengthPrefix(bytes) + bytes + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Scanner.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Scanner.swift new file mode 100644 index 00000000..886354a4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ASN1/ASN1Scanner.swift @@ -0,0 +1,123 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// ASN1 Scanner code is from Asn1Parser.swift from SwiftyRSA + +import Foundation + +extension ASN1 { + /// Simple data scanner that consumes bytes from a raw data and keeps an updated position. + internal class Scanner { + + enum ScannerError: Error { + case outOfBounds + } + + let data: Data + var index: Int = 0 + + /// Returns whether there is no more data to consume + var isComplete: Bool { + return self.index >= self.data.count + } + + /// Creates a scanner with provided data + /// + /// - Parameter data: Data to consume + init(data: Data) { + self.data = data + } + + /// Consumes data of provided length and returns it + /// + /// - Parameter length: length of the data to consume + /// - Returns: data consumed + /// - Throws: ScannerError.outOfBounds error if asked to consume too many bytes + func consume(length: Int) throws -> Data { + + guard length > 0 else { + return Data() + } + + guard self.index + length <= self.data.count else { + throw ScannerError.outOfBounds + } + + let subdata = self.data.subdata(in: self.index.. Int { + + let lengthByte = try consume(length: 1).firstByte + + // If the first byte's value is less than 0x80, it directly contains the length + // so we can return it + guard lengthByte >= 0x80 else { + return Int(lengthByte) + } + + // If the first byte's value is more than 0x80, it indicates how many following bytes + // will describe the length. For instance, 0x85 indicates that 0x85 - 0x80 = 0x05 = 5 + // bytes will describe the length, so we need to read the 5 next bytes and get their integer + // value to determine the length. + let nextByteCount = lengthByte - 0x80 + let length = try consume(length: Int(nextByteCount)) + + return length.integer + } + } +} + +internal extension Data { + + /// Returns the first byte of the current data + var firstByte: UInt8 { + var byte: UInt8 = 0 + copyBytes(to: &byte, count: MemoryLayout.size) + return byte + } + + /// Returns the integer value of the current data. + /// - Warning: This only supports data up to 4 bytes, as we can only extract 32-bit integers. + var integer: Int { + + guard count > 0 else { + return 0 + } + + var int: UInt32 = 0 + var offset: Int32 = Int32(count - 1) + forEach { byte in + let byte32 = UInt32(byte) + let shifted = byte32 << (UInt32(offset) * 8) + int = int | shifted + offset -= 1 + } + + return Int(int) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Array+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Array+Extension.swift new file mode 100644 index 00000000..348e76c5 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Array+Extension.swift @@ -0,0 +1,155 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +extension Array { + @inlinable + init(reserveCapacity: Int) { + self = Array() + self.reserveCapacity(reserveCapacity) + } + + @inlinable + var slice: ArraySlice { + self[self.startIndex ..< self.endIndex] + } + + @inlinable + subscript (safe index: Index) -> Element? { + return indices.contains(index) ? self[index] : nil + } +} + +extension Array where Element == UInt8 { + public init(hex: String) { + self.init(reserveCapacity: hex.unicodeScalars.lazy.underestimatedCount) + var buffer: UInt8? + var skip = hex.hasPrefix("0x") ? 2 : 0 + for char in hex.unicodeScalars.lazy { + guard skip == 0 else { + skip -= 1 + continue + } + guard char.value >= 48 && char.value <= 102 else { + removeAll() + return + } + let v: UInt8 + let c: UInt8 = UInt8(char.value) + switch c { + case let c where c <= 57: + v = c - 48 + case let c where c >= 65 && c <= 70: + v = c - 55 + case let c where c >= 97: + v = c - 87 + default: + removeAll() + return + } + if let b = buffer { + append(b << 4 | v) + buffer = nil + } else { + buffer = v + } + } + if let b = buffer { + append(b) + } + } + + public func toHexString() -> String { + `lazy`.reduce(into: "") { + var s = String($1, radix: 16) + if s.count == 1 { + s = "0" + s + } + $0 += s + } + } +} + +extension Array where Element == UInt8 { + /// split in chunks with given chunk size + @available(*, deprecated) + public func chunks(size chunksize: Int) -> Array> { + var words = Array>() + words.reserveCapacity(count / chunksize) + for idx in stride(from: chunksize, through: count, by: chunksize) { + words.append(Array(self[idx - chunksize ..< idx])) // slow for large table + } + let remainder = suffix(count % chunksize) + if !remainder.isEmpty { + words.append(Array(remainder)) + } + return words + } + + public func md5() -> [Element] { + Digest.md5(self) + } + + public func sha1() -> [Element] { + Digest.sha1(self) + } + + public func sha224() -> [Element] { + Digest.sha224(self) + } + + public func sha256() -> [Element] { + Digest.sha256(self) + } + + public func sha384() -> [Element] { + Digest.sha384(self) + } + + public func sha512() -> [Element] { + Digest.sha512(self) + } + + public func sha2(_ variant: SHA2.Variant) -> [Element] { + Digest.sha2(self, variant: variant) + } + + public func sha3(_ variant: SHA3.Variant) -> [Element] { + Digest.sha3(self, variant: variant) + } + + public func crc32(seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + Checksum.crc32(self, seed: seed, reflect: reflect) + } + + public func crc32c(seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + Checksum.crc32c(self, seed: seed, reflect: reflect) + } + + public func crc16(seed: UInt16? = nil) -> UInt16 { + Checksum.crc16(self, seed: seed) + } + + public func encrypt(cipher: Cipher) throws -> [Element] { + try cipher.encrypt(self.slice) + } + + public func decrypt(cipher: Cipher) throws -> [Element] { + try cipher.decrypt(self.slice) + } + + public func authenticate(with authenticator: A) throws -> [Element] { + try authenticator.authenticate(self) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Authenticator.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Authenticator.swift new file mode 100644 index 00000000..18f7f9ec --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Authenticator.swift @@ -0,0 +1,20 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// Message authentication code. +public protocol Authenticator { + /// Calculate Message Authentication Code (MAC) for message. + func authenticate(_ bytes: Array) throws -> Array +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BatchedCollection.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BatchedCollection.swift new file mode 100644 index 00000000..151c9c08 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BatchedCollection.swift @@ -0,0 +1,81 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@usableFromInline +struct BatchedCollectionIndex { + let range: Range +} + +extension BatchedCollectionIndex: Comparable { + @usableFromInline + static func == (lhs: BatchedCollectionIndex, rhs: BatchedCollectionIndex) -> Bool { + lhs.range.lowerBound == rhs.range.lowerBound + } + + @usableFromInline + static func < (lhs: BatchedCollectionIndex, rhs: BatchedCollectionIndex) -> Bool { + lhs.range.lowerBound < rhs.range.lowerBound + } +} + +protocol BatchedCollectionType: Collection { + associatedtype Base: Collection +} + +@usableFromInline +struct BatchedCollection: Collection { + let base: Base + let size: Int + + @usableFromInline + init(base: Base, size: Int) { + self.base = base + self.size = size + } + + @usableFromInline + typealias Index = BatchedCollectionIndex + + private func nextBreak(after idx: Base.Index) -> Base.Index { + self.base.index(idx, offsetBy: self.size, limitedBy: self.base.endIndex) ?? self.base.endIndex + } + + @usableFromInline + var startIndex: Index { + Index(range: self.base.startIndex.. Index { + Index(range: idx.range.upperBound.. Base.SubSequence { + self.base[idx.range] + } +} + +extension Collection { + @inlinable + func batched(by size: Int) -> BatchedCollection { + BatchedCollection(base: self, size: size) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Bit.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Bit.swift new file mode 100644 index 00000000..3520b0dd --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Bit.swift @@ -0,0 +1,26 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public enum Bit: Int { + case zero + case one +} + +extension Bit { + @inlinable + func inverted() -> Bit { + self == .zero ? .one : .zero + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockCipher.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockCipher.swift new file mode 100644 index 00000000..740b046f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockCipher.swift @@ -0,0 +1,18 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +protocol BlockCipher: Cipher { + static var blockSize: Int { get } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockDecryptor.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockDecryptor.swift new file mode 100644 index 00000000..02052ff4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockDecryptor.swift @@ -0,0 +1,98 @@ +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public class BlockDecryptor: Cryptor, Updatable { + @usableFromInline + let blockSize: Int + + @usableFromInline + let padding: Padding + + @usableFromInline + var worker: CipherModeWorker + + @usableFromInline + var accumulated = Array() + + @usableFromInline + init(blockSize: Int, padding: Padding, _ worker: CipherModeWorker) throws { + self.blockSize = blockSize + self.padding = padding + self.worker = worker + } + + @inlinable + public func update(withBytes bytes: ArraySlice, isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + // If a worker (eg GCM) can combine ciphertext + tag + // we need to remove tag from the ciphertext. + if !isLast && self.accumulated.count < self.blockSize + self.worker.additionalBufferSize { + return [] + } + + let accumulatedWithoutSuffix: Array + if self.worker.additionalBufferSize > 0 { + // FIXME: how slow is that? + accumulatedWithoutSuffix = Array(self.accumulated.prefix(self.accumulated.count - self.worker.additionalBufferSize)) + } else { + accumulatedWithoutSuffix = self.accumulated + } + + var processedBytesCount = 0 + var plaintext = Array(reserveCapacity: accumulatedWithoutSuffix.count) + // Processing in a block-size manner. It's good for block modes, but bad for stream modes. + for var chunk in accumulatedWithoutSuffix.batched(by: self.blockSize) { + if isLast || (accumulatedWithoutSuffix.count - processedBytesCount) >= blockSize { + let isLastChunk = processedBytesCount + chunk.count == accumulatedWithoutSuffix.count + + if isLast, isLastChunk, var finalizingWorker = worker as? FinalizingDecryptModeWorker { + chunk = try finalizingWorker.willDecryptLast(bytes: chunk + accumulated.suffix(worker.additionalBufferSize)) // tag size + } + + if !chunk.isEmpty { + plaintext += worker.decrypt(block: chunk) + } + + if isLast, isLastChunk, var finalizingWorker = worker as? FinalizingDecryptModeWorker { + plaintext = Array(try finalizingWorker.didDecryptLast(bytes: plaintext.slice)) + } + + processedBytesCount += chunk.count + } + } + accumulated.removeFirst(processedBytesCount) // super-slow + + if isLast { + if accumulatedWithoutSuffix.isEmpty, var finalizingWorker = worker as? FinalizingDecryptModeWorker { + try finalizingWorker.willDecryptLast(bytes: self.accumulated.suffix(self.worker.additionalBufferSize)) + plaintext = Array(try finalizingWorker.didDecryptLast(bytes: plaintext.slice)) + } + plaintext = self.padding.remove(from: plaintext, blockSize: self.blockSize) + } + + return plaintext + } + + public func seek(to position: Int) throws { + guard var worker = self.worker as? SeekableModeWorker else { + fatalError("Not supported") + } + + try worker.seek(to: position) + self.worker = worker + + accumulated = [] + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockEncryptor.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockEncryptor.swift new file mode 100644 index 00000000..12dba2c8 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockEncryptor.swift @@ -0,0 +1,62 @@ +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@usableFromInline +final class BlockEncryptor: Cryptor, Updatable { + private let blockSize: Int + private var worker: CipherModeWorker + private let padding: Padding + // Accumulated bytes. Not all processed bytes. + private var accumulated = Array(reserveCapacity: 16) + + private var lastBlockRemainder = 0 + + @usableFromInline + init(blockSize: Int, padding: Padding, _ worker: CipherModeWorker) throws { + self.blockSize = blockSize + self.padding = padding + self.worker = worker + } + + // MARK: Updatable + + public func update(withBytes bytes: ArraySlice, isLast: Bool) throws -> Array { + self.accumulated += bytes + + if isLast { + self.accumulated = self.padding.add(to: self.accumulated, blockSize: self.blockSize) + } + + var encrypted = Array(reserveCapacity: accumulated.count) + for chunk in self.accumulated.batched(by: self.blockSize) { + if isLast || chunk.count == self.blockSize { + encrypted += self.worker.encrypt(block: chunk) + } + } + + // Stream encrypts all, so it removes all elements + self.accumulated.removeFirst(encrypted.count) + + if var finalizingWorker = worker as? FinalizingEncryptModeWorker, isLast == true { + encrypted = Array(try finalizingWorker.finalize(encrypt: encrypted.slice)) + } + + return encrypted + } + + @usableFromInline + func seek(to: Int) throws { + fatalError("Not supported") + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockMode.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockMode.swift new file mode 100644 index 00000000..e06366dd --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockMode.swift @@ -0,0 +1,26 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public typealias CipherOperationOnBlock = (_ block: ArraySlice) -> Array? + +public protocol BlockMode { + var options: BlockModeOption { get } + //TODO: doesn't have to be public + @inlinable func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker + + var customBlockSize: Int? { get } +} + +typealias StreamMode = BlockMode diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockModeOptions.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockModeOptions.swift new file mode 100644 index 00000000..f713b54f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/BlockModeOptions.swift @@ -0,0 +1,34 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public struct BlockModeOption: OptionSet { + public let rawValue: Int + + public init(rawValue: Int) { + self.rawValue = rawValue + } + + @usableFromInline + static let none = BlockModeOption(rawValue: 1 << 0) + + @usableFromInline + static let initializationVectorRequired = BlockModeOption(rawValue: 1 << 1) + + @usableFromInline + static let paddingRequired = BlockModeOption(rawValue: 1 << 2) + + @usableFromInline + static let useEncryptToDecrypt = BlockModeOption(rawValue: 1 << 3) +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CBC.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CBC.swift new file mode 100644 index 00000000..3bba46cf --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CBC.swift @@ -0,0 +1,76 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Cipher-block chaining (CBC) +// + +public struct CBC: BlockMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + } + + public let options: BlockModeOption = [.initializationVectorRequired, .paddingRequired] + + private let iv: Array + + public let customBlockSize: Int? = nil + + public init(iv: Array) { + self.iv = iv + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.iv.count != blockSize { + throw Error.invalidInitializationVector + } + + return CBCModeWorker(blockSize: blockSize, iv: self.iv.slice, cipherOperation: cipherOperation) + } +} + +struct CBCModeWorker: BlockModeWorker { + let cipherOperation: CipherOperationOnBlock + var blockSize: Int + let additionalBufferSize: Int = 0 + private let iv: ArraySlice + private var prev: ArraySlice? + + @inlinable + init(blockSize: Int, iv: ArraySlice, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = blockSize + self.iv = iv + self.cipherOperation = cipherOperation + } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + guard let ciphertext = cipherOperation(xor(prev ?? iv, plaintext)) else { + return Array(plaintext) + } + self.prev = ciphertext.slice + return ciphertext + } + + @inlinable + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + guard let plaintext = cipherOperation(ciphertext) else { + return Array(ciphertext) + } + let result: Array = xor(prev ?? self.iv, plaintext) + self.prev = ciphertext + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CCM.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CCM.swift new file mode 100644 index 00000000..1accb564 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CCM.swift @@ -0,0 +1,367 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// CCM mode combines the well known CBC-MAC with the well known counter mode of encryption. +// https://tools.ietf.org/html/rfc3610 +// https://csrc.nist.gov/publications/detail/sp/800-38c/final + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#elseif canImport(WASILibc) +import WASILibc +#endif + +/// Counter with Cipher Block Chaining-Message Authentication Code +public struct CCM: StreamMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + case invalidParameter + case fail + } + + public let options: BlockModeOption = [.initializationVectorRequired, .useEncryptToDecrypt] + private let nonce: Array + private let additionalAuthenticatedData: Array? + private let tagLength: Int + private let messageLength: Int // total message length. need to know in advance + public let customBlockSize: Int? = nil + + // `authenticationTag` nil for encryption, known tag for decryption + /// For encryption, the value is set at the end of the encryption. + /// For decryption, this is a known Tag to validate against. + public var authenticationTag: Array? + + /// Initialize CCM + /// + /// - Parameters: + /// - iv: Initialization vector. Nonce. Valid length between 7 and 13 bytes. + /// - tagLength: Authentication tag length, in bytes. Value of {4, 6, 8, 10, 12, 14, 16}. + /// - messageLength: Plaintext message length (excluding tag if attached). Length have to be provided in advance. + /// - additionalAuthenticatedData: Additional authenticated data. + public init(iv: Array, tagLength: Int, messageLength: Int, additionalAuthenticatedData: Array? = nil) { + self.nonce = iv + self.tagLength = tagLength + self.additionalAuthenticatedData = additionalAuthenticatedData + self.messageLength = messageLength // - tagLength + } + + /// Initialize CCM + /// + /// - Parameters: + /// - iv: Initialization vector. Nonce. Valid length between 7 and 13 bytes. + /// - tagLength: Authentication tag length, in bytes. Value of {4, 6, 8, 10, 12, 14, 16}. + /// - messageLength: Plaintext message length (excluding tag if attached). Length have to be provided in advance. + /// - authenticationTag: Authentication Tag value if not concatenated to ciphertext. + /// - additionalAuthenticatedData: Additional authenticated data. + public init(iv: Array, tagLength: Int, messageLength: Int, authenticationTag: Array, additionalAuthenticatedData: Array? = nil) { + self.init(iv: iv, tagLength: tagLength, messageLength: messageLength, additionalAuthenticatedData: additionalAuthenticatedData) + self.authenticationTag = authenticationTag + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.nonce.isEmpty { + throw Error.invalidInitializationVector + } + + return CCMModeWorker(blockSize: blockSize, nonce: self.nonce.slice, messageLength: self.messageLength, additionalAuthenticatedData: self.additionalAuthenticatedData, tagLength: self.tagLength, cipherOperation: cipherOperation) + } +} + +class CCMModeWorker: StreamModeWorker, SeekableModeWorker, CounterModeWorker, FinalizingEncryptModeWorker, FinalizingDecryptModeWorker { + typealias Counter = Int + var counter = 0 + + let cipherOperation: CipherOperationOnBlock + let blockSize: Int + private let tagLength: Int + private let messageLength: Int // total message length. need to know in advance + private let q: UInt8 + + let additionalBufferSize: Int + private var keystreamPosIdx = 0 + private let nonce: Array + private var last_y: ArraySlice = [] + private var keystream: Array = [] + // Known Tag used to validate during decryption + private var expectedTag: Array? + + public enum Error: Swift.Error { + case invalidParameter + } + + init(blockSize: Int, nonce: ArraySlice, messageLength: Int, additionalAuthenticatedData: [UInt8]?, expectedTag: Array? = nil, tagLength: Int, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = 16 // CCM is defined for 128 block size + self.tagLength = tagLength + self.additionalBufferSize = tagLength + self.messageLength = messageLength + self.expectedTag = expectedTag + self.cipherOperation = cipherOperation + self.nonce = Array(nonce) + self.q = UInt8(15 - nonce.count) // n = 15-q + + let hasAssociatedData = additionalAuthenticatedData != nil && !additionalAuthenticatedData!.isEmpty + self.processControlInformation(nonce: self.nonce, tagLength: tagLength, hasAssociatedData: hasAssociatedData) + + if let aad = additionalAuthenticatedData, hasAssociatedData { + self.process(aad: aad) + } + } + + // For the very first time setup new IV (aka y0) from the block0 + private func processControlInformation(nonce: [UInt8], tagLength: Int, hasAssociatedData: Bool) { + let block0 = try! format(nonce: nonce, Q: UInt32(self.messageLength), q: self.q, t: UInt8(tagLength), hasAssociatedData: hasAssociatedData).slice + let y0 = self.cipherOperation(block0)!.slice + self.last_y = y0 + } + + private func process(aad: [UInt8]) { + let encodedAAD = format(aad: aad) + + for block_i in encodedAAD.batched(by: 16) { + let y_i = self.cipherOperation(xor(block_i, self.last_y))!.slice + self.last_y = y_i + } + } + + private func S(i: Int) throws -> [UInt8] { + let ctr = try format(counter: i, nonce: nonce, q: q) + return self.cipherOperation(ctr.slice)! + } + + @inlinable + func seek(to position: Int) throws { + self.counter = position + self.keystream = try self.S(i: position) + let offset = position % self.blockSize + self.keystreamPosIdx = offset + } + + func encrypt(block plaintext: ArraySlice) -> Array { + var result = Array(reserveCapacity: plaintext.count) + + var processed = 0 + while processed < plaintext.count { + // Need a full block here to update keystream and do CBC + if self.keystream.isEmpty || self.keystreamPosIdx == self.blockSize { + // y[i], where i is the counter. Can encrypt 1 block at a time + self.counter += 1 + guard let S = try? S(i: counter) else { return Array(plaintext) } + let plaintextP = addPadding(Array(plaintext), blockSize: blockSize) + guard let y = cipherOperation(xor(last_y, plaintextP)) else { return Array(plaintext) } + self.last_y = y.slice + + self.keystream = S + self.keystreamPosIdx = 0 + } + + let xored: Array = xor(plaintext[plaintext.startIndex.advanced(by: processed)...], keystream[keystreamPosIdx...]) + keystreamPosIdx += xored.count + processed += xored.count + result += xored + } + return result + } + + @inlinable + func finalize(encrypt ciphertext: ArraySlice) throws -> ArraySlice { + // concatenate T at the end + guard let S0 = try? S(i: 0) else { return ciphertext } + + let computedTag = xor(last_y.prefix(self.tagLength), S0) as ArraySlice + return ciphertext + computedTag + } + + // Decryption is stream + // CBC is block + private var accumulatedPlaintext: [UInt8] = [] + + func decrypt(block ciphertext: ArraySlice) -> Array { + var output = Array(reserveCapacity: ciphertext.count) + + do { + var currentCounter = self.counter + var processed = 0 + while processed < ciphertext.count { + // Need a full block here to update keystream and do CBC + // New keystream for a new block + if self.keystream.isEmpty || self.keystreamPosIdx == self.blockSize { + currentCounter += 1 + guard let S = try? S(i: currentCounter) else { return Array(ciphertext) } + self.keystream = S + self.keystreamPosIdx = 0 + } + + let xored: Array = xor(ciphertext[ciphertext.startIndex.advanced(by: processed)...], keystream[keystreamPosIdx...]) // plaintext + keystreamPosIdx += xored.count + processed += xored.count + output += xored + self.counter = currentCounter + } + } + + // Accumulate plaintext for the MAC calculations at the end. + // It would be good to process it together though, here. + self.accumulatedPlaintext += output + + // Shouldn't return plaintext until validate tag. + // With incremental update, can't validate tag until all block are processed. + return output + } + + @inlinable + func finalize(decrypt plaintext: ArraySlice) throws -> ArraySlice { + // concatenate T at the end + let computedTag = Array(last_y.prefix(self.tagLength)) + guard let expectedTag = self.expectedTag, expectedTag == computedTag else { + throw CCM.Error.fail + } + + return plaintext + } + + @discardableResult + func willDecryptLast(bytes ciphertext: ArraySlice) throws -> ArraySlice { + // get tag of additionalBufferSize size + // `ciphertext` contains at least additionalBufferSize bytes + // overwrite expectedTag property used later for verification + guard let S0 = try? S(i: 0) else { return ciphertext } + self.expectedTag = xor(ciphertext.suffix(self.tagLength), S0) as [UInt8] + return ciphertext[ciphertext.startIndex..) throws -> ArraySlice { + + // Calculate Tag, from the last CBC block, for accumulated plaintext. + var processed = 0 + for block in self.accumulatedPlaintext.batched(by: self.blockSize) { + let blockP = addPadding(Array(block), blockSize: blockSize) + guard let y = cipherOperation(xor(last_y, blockP)) else { return plaintext } + self.last_y = y.slice + processed += block.count + } + self.accumulatedPlaintext.removeFirst(processed) + return plaintext + } +} + +// Q - octet length of P +// q - octet length of Q. Maximum length (in octets) of payload. An element of {2,3,4,5,6,7,8} +// t - octet length of T (MAC length). An element of {4,6,8,10,12,14,16} +private func format(nonce N: [UInt8], Q: UInt32, q: UInt8, t: UInt8, hasAssociatedData: Bool) throws -> [UInt8] { + var flags0: UInt8 = 0 + + if hasAssociatedData { + // 7 bit + flags0 |= (1 << 6) + } + + // 6,5,4 bit is t in 3 bits + flags0 |= (((t - 2) / 2) & 0x07) << 3 + + // 3,2,1 bit is q in 3 bits + flags0 |= ((q - 1) & 0x07) << 0 + + var block0: [UInt8] = Array(repeating: 0, count: 16) + block0[0] = flags0 + + // N in 1...(15-q) octets, n = 15-q + // n is an element of {7,8,9,10,11,12,13} + let n = 15 - Int(q) + guard (n + Int(q)) == 15 else { + // n+q == 15 + throw CCMModeWorker.Error.invalidParameter + } + block0[1...n] = N[0...(n - 1)] + + // Q in (16-q)...15 octets + block0[(16 - Int(q))...15] = Q.bytes(totalBytes: Int(q)).slice + + return block0 +} + +/// Formatting of the Counter Blocks. Ctr[i] +/// The counter generation function. +/// Q - octet length of P +/// q - octet length of Q. Maximum length (in octets) of payload. An element of {2,3,4,5,6,7,8} +private func format(counter i: Int, nonce N: [UInt8], q: UInt8) throws -> [UInt8] { + var flags0: UInt8 = 0 + + // bit 8,7 is Reserved + // bit 4,5,6 shall be set to 0 + // 3,2,1 bit is q in 3 bits + flags0 |= ((q - 1) & 0x07) << 0 + + var block = Array(repeating: 0, count: 16) // block[0] + block[0] = flags0 + + // N in 1...(15-q) octets, n = 15-q + // n is an element of {7,8,9,10,11,12,13} + let n = 15 - Int(q) + guard (n + Int(q)) == 15 else { + // n+q == 15 + throw CCMModeWorker.Error.invalidParameter + } + block[1...n] = N[0...(n - 1)] + + // [i]8q in (16-q)...15 octets + block[(16 - Int(q))...15] = i.bytes(totalBytes: Int(q)).slice + + return block +} + +/// Resulting can be partitioned into 16-octet blocks +private func format(aad: [UInt8]) -> [UInt8] { + let a = aad.count + + switch Double(a) { + case 0..<65280: // 2^16-2^8 + // [a]16 + return addPadding(a.bytes(totalBytes: 2) + aad, blockSize: 16) + case 65280..<4_294_967_296: // 2^32 + // [a]32 + return addPadding([0xFF, 0xFE] + a.bytes(totalBytes: 4) + aad, blockSize: 16) + case 4_294_967_296.., blockSize: Int) -> Array { + if bytes.isEmpty { + return Array(repeating: 0, count: blockSize) + } + + let remainder = bytes.count % blockSize + if remainder == 0 { + return bytes + } + + let paddingCount = blockSize - remainder + if paddingCount > 0 { + return bytes + Array(repeating: 0, count: paddingCount) + } + return bytes +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CFB.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CFB.swift new file mode 100644 index 00000000..48ba5786 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CFB.swift @@ -0,0 +1,102 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Cipher feedback (CFB) +// + +public struct CFB: BlockMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + } + + public enum SegmentSize: Int { + case cfb8 = 1 // Encrypt byte per byte + case cfb128 = 16 // Encrypt 16 bytes per 16 bytes (default) + } + + public let options: BlockModeOption = [.initializationVectorRequired, .useEncryptToDecrypt] + private let iv: Array + private let segmentSize: SegmentSize + public let customBlockSize: Int? + + public init(iv: Array, segmentSize: SegmentSize = .cfb128) { + self.iv = iv + self.segmentSize = segmentSize + self.customBlockSize = segmentSize.rawValue + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if !(self.iv.count == blockSize || (segmentSize == .cfb8 && self.iv.count == AES.blockSize)) { + throw Error.invalidInitializationVector + } + + return CFBModeWorker(blockSize: blockSize, iv: self.iv.slice, segmentSize: segmentSize, cipherOperation: cipherOperation) + } +} + +struct CFBModeWorker: BlockModeWorker { + let cipherOperation: CipherOperationOnBlock + let blockSize: Int + let additionalBufferSize: Int = 0 + private let iv: ArraySlice + private let segmentSize: CFB.SegmentSize + private var prev: ArraySlice? + + init(blockSize: Int, iv: ArraySlice, segmentSize: CFB.SegmentSize, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = blockSize + self.iv = iv + self.segmentSize = segmentSize + self.cipherOperation = cipherOperation + } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + switch segmentSize { + case .cfb128: + guard let ciphertext = cipherOperation(prev ?? iv) else { + return Array(plaintext) + } + self.prev = xor(plaintext, ciphertext.slice) + return Array(self.prev ?? []) + case .cfb8: + guard let ciphertext = cipherOperation(prev ?? iv) else { + return Array(plaintext) + } + let result = [Array(plaintext)[0] ^ Array(ciphertext)[0]] + self.prev = Array((prev ?? iv).dropFirst()) + [result[0]] + return result + } + } + + @inlinable + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + switch segmentSize { + case .cfb128: + guard let plaintext = cipherOperation(prev ?? iv) else { + return Array(ciphertext) + } + let result: Array = xor(plaintext, ciphertext) + prev = ciphertext + return result + case .cfb8: + guard let plaintext = cipherOperation(prev ?? iv) else { + return Array(ciphertext) + } + self.prev = Array((prev ?? iv).dropFirst()) + [Array(ciphertext)[0]] + return [Array(ciphertext)[0] ^ Array(plaintext)[0]] + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CTR.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CTR.swift new file mode 100644 index 00000000..d163db21 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/CTR.swift @@ -0,0 +1,138 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Counter (CTR) + +public struct CTR: StreamMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + } + + public let options: BlockModeOption = [.initializationVectorRequired, .useEncryptToDecrypt] + private let iv: Array + private let counter: Int + public let customBlockSize: Int? = nil + + public init(iv: Array, counter: Int = 0) { + self.iv = iv + self.counter = counter + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.iv.count != blockSize { + throw Error.invalidInitializationVector + } + + return CTRModeWorker(blockSize: blockSize, iv: self.iv.slice, counter: self.counter, cipherOperation: cipherOperation) + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct CTRModeWorker: StreamModeWorker, SeekableModeWorker, CounterModeWorker { + typealias Counter = CTRCounter + + final class CTRCounter { + private let constPrefix: Array + private var value: UInt64 + //TODO: make it an updatable value, computing is too slow + var bytes: Array { + self.constPrefix + self.value.bytes() + } + + @inlinable + init(_ initialValue: Array) { + let halfIndex = initialValue.startIndex.advanced(by: initialValue.count / 2) + self.constPrefix = Array(initialValue[initialValue.startIndex.., startAt index: Int) { + self.init(buildCounterValue(nonce, counter: UInt64(index))) + } + + static func += (lhs: CTRCounter, rhs: Int) { + lhs.value += UInt64(rhs) + } + } + + let cipherOperation: CipherOperationOnBlock + let additionalBufferSize: Int = 0 + let iv: Array + var counter: CTRCounter + + private let blockSize: Int + + // The same keystream is used for the block length plaintext + // As new data is added, keystream suffix is used to xor operation. + private var keystream: Array + private var keystreamPosIdx = 0 + + init(blockSize: Int, iv: ArraySlice, counter: Int, cipherOperation: @escaping CipherOperationOnBlock) { + self.cipherOperation = cipherOperation + self.blockSize = blockSize + self.iv = Array(iv) + + // the first keystream is calculated from the nonce = initial value of counter + self.counter = CTRCounter(nonce: Array(iv), startAt: counter) + self.keystream = Array(cipherOperation(self.counter.bytes.slice)!) + } + + @inlinable + mutating func seek(to position: Int) throws { + let offset = position % self.blockSize + self.counter = CTRCounter(nonce: self.iv, startAt: position / self.blockSize) + self.keystream = Array(self.cipherOperation(self.counter.bytes.slice)!) + self.keystreamPosIdx = offset + } + + // plaintext is at most blockSize long + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + var result = Array(reserveCapacity: plaintext.count) + + var processed = 0 + while processed < plaintext.count { + // Update keystream + if self.keystreamPosIdx == self.blockSize { + self.counter += 1 + self.keystream = Array(self.cipherOperation(self.counter.bytes.slice)!) + self.keystreamPosIdx = 0 + } + + let xored: Array = xor(plaintext[plaintext.startIndex.advanced(by: processed)...], keystream[keystreamPosIdx...]) + keystreamPosIdx += xored.count + processed += xored.count + result += xored + } + + return result + } + + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + self.encrypt(block: ciphertext) + } +} + +private func buildCounterValue(_ iv: Array, counter: UInt64) -> Array { + let noncePartLen = iv.count / 2 + let noncePrefix = iv[iv.startIndex.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public protocol CipherModeWorker { + var cipherOperation: CipherOperationOnBlock { get } + + // Additional space needed when incrementally process data + // eg. for GCM combined mode + var additionalBufferSize: Int { get } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array + + @inlinable + mutating func decrypt(block ciphertext: ArraySlice) -> Array +} + +/// Block workers use `BlockEncryptor` +public protocol BlockModeWorker: CipherModeWorker { + var blockSize: Int { get } +} + +public protocol CounterModeWorker: CipherModeWorker { + associatedtype Counter + var counter: Counter { get set } +} + +public protocol SeekableModeWorker: CipherModeWorker { + mutating func seek(to position: Int) throws +} + +/// Stream workers use `StreamEncryptor` +public protocol StreamModeWorker: CipherModeWorker { +} + +public protocol FinalizingEncryptModeWorker: CipherModeWorker { + // Any final calculations, eg. calculate tag + // Called after the last block is encrypted + mutating func finalize(encrypt ciphertext: ArraySlice) throws -> ArraySlice +} + +public protocol FinalizingDecryptModeWorker: CipherModeWorker { + // Called before decryption, hence input is ciphertext. + // ciphertext is either a last block, or a tag (for stream workers) + @discardableResult + mutating func willDecryptLast(bytes ciphertext: ArraySlice) throws -> ArraySlice + // Called after decryption, hence input is ciphertext + mutating func didDecryptLast(bytes plaintext: ArraySlice) throws -> ArraySlice + // Any final calculations, eg. calculate tag + // Called after the last block is encrypted + mutating func finalize(decrypt plaintext: ArraySlice) throws -> ArraySlice +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/ECB.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/ECB.swift new file mode 100644 index 00000000..13e2cfd1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/ECB.swift @@ -0,0 +1,53 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Electronic codebook (ECB) +// + +public struct ECB: BlockMode { + public let options: BlockModeOption = .paddingRequired + public let customBlockSize: Int? = nil + + public init() { + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + ECBModeWorker(blockSize: blockSize, cipherOperation: cipherOperation) + } +} + +struct ECBModeWorker: BlockModeWorker { + typealias Element = Array + let cipherOperation: CipherOperationOnBlock + let blockSize: Int + let additionalBufferSize: Int = 0 + + init(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = blockSize + self.cipherOperation = cipherOperation + } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + guard let ciphertext = cipherOperation(plaintext) else { + return Array(plaintext) + } + return ciphertext + } + + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + self.encrypt(block: ciphertext) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/GCM.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/GCM.swift new file mode 100644 index 00000000..4e52ce85 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/GCM.swift @@ -0,0 +1,374 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Galois/Counter Mode (GCM) +// https://csrc.nist.gov/publications/detail/sp/800-38d/final +// ref: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.694.695&rep=rep1&type=pdf +// + +public final class GCM: BlockMode { + public enum Mode { + /// In combined mode, the authentication tag is directly appended to the encrypted message. This is usually what you want. + case combined + /// Some applications may need to store the authentication tag and the encrypted message at different locations. + case detached + } + + public let options: BlockModeOption = [.initializationVectorRequired, .useEncryptToDecrypt] + + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + /// Special symbol FAIL that indicates that the inputs are not authentic. + case fail + } + + private let iv: Array + private let additionalAuthenticatedData: Array? + private let mode: Mode + public let customBlockSize: Int? = nil + + /// Length of authentication tag, in bytes. + /// For encryption, the value is given as init parameter. + /// For decryption, the length of given authentication tag is used. + private let tagLength: Int + + // `authenticationTag` nil for encryption, known tag for decryption + /// For encryption, the value is set at the end of the encryption. + /// For decryption, this is a known Tag to validate against. + public var authenticationTag: Array? + + // encrypt + /// Possible tag lengths: 4,8,12,13,14,15,16 + public init(iv: Array, additionalAuthenticatedData: Array? = nil, tagLength: Int = 16, mode: Mode = .detached) { + self.iv = iv + self.additionalAuthenticatedData = additionalAuthenticatedData + self.mode = mode + self.tagLength = tagLength + } + + // decrypt + public convenience init(iv: Array, authenticationTag: Array, additionalAuthenticatedData: Array? = nil, mode: Mode = .detached) { + self.init(iv: iv, additionalAuthenticatedData: additionalAuthenticatedData, tagLength: authenticationTag.count, mode: mode) + self.authenticationTag = authenticationTag + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.iv.isEmpty { + throw Error.invalidInitializationVector + } + + let worker = GCMModeWorker(iv: iv.slice, aad: self.additionalAuthenticatedData?.slice, expectedTag: self.authenticationTag, tagLength: self.tagLength, mode: self.mode, cipherOperation: cipherOperation) + worker.didCalculateTag = { [weak self] tag in + self?.authenticationTag = tag + } + return worker + } +} + +// MARK: - Worker + +final class GCMModeWorker: BlockModeWorker, FinalizingEncryptModeWorker, FinalizingDecryptModeWorker { + let cipherOperation: CipherOperationOnBlock + + // Callback called when authenticationTag is ready + var didCalculateTag: ((Array) -> Void)? + + private let tagLength: Int + // GCM nonce is 96-bits by default. It's the most effective length for the IV + private static let nonceSize = 12 + + // GCM is designed for 128-bit ciphers like AES (but not really for Blowfish). 64-bit mode is not implemented. + let blockSize = 16 // 128 bit + let additionalBufferSize: Int + private let iv: ArraySlice + private let mode: GCM.Mode + private var counter: UInt128 + private let eky0: UInt128 // move to GF? + private let h: UInt128 + + // Additional authenticated data + private let aad: ArraySlice? + // Known Tag used to validate during decryption + private var expectedTag: Array? + + // Note: need new worker to reset instance + // Use empty aad if not specified. AAD is optional. + private lazy var gf: GF = { + if let aad = aad { + return GF(aad: Array(aad), h: h, blockSize: blockSize) + } + return GF(aad: [UInt8](), h: h, blockSize: blockSize) + }() + + init(iv: ArraySlice, aad: ArraySlice? = nil, expectedTag: Array? = nil, tagLength: Int, mode: GCM.Mode, cipherOperation: @escaping CipherOperationOnBlock) { + self.cipherOperation = cipherOperation + self.iv = iv + self.mode = mode + self.aad = aad + self.expectedTag = expectedTag + self.tagLength = tagLength + self.h = UInt128(cipherOperation(Array(repeating: 0, count: self.blockSize).slice)!) // empty block + + if mode == .combined { + self.additionalBufferSize = tagLength + } else { + self.additionalBufferSize = 0 + } + + // Assume nonce is 12 bytes long, otherwise initial counter would be calulated from GHASH + // counter = GF.ghash(aad: [UInt8](), ciphertext: nonce) + if iv.count == GCMModeWorker.nonceSize { + self.counter = makeCounter(nonce: Array(self.iv)) + } else { + self.counter = GF.ghash(h: self.h, aad: [UInt8](), ciphertext: Array(iv), blockSize: self.blockSize) + } + + // Set constants + self.eky0 = UInt128(cipherOperation(self.counter.bytes.slice)!) + } + + func encrypt(block plaintext: ArraySlice) -> Array { + self.counter = incrementCounter(self.counter) + + guard let ekyN = cipherOperation(counter.bytes.slice) else { + return Array(plaintext) + } + + // plaintext block ^ ek1 + let ciphertext = xor(plaintext, ekyN) as Array + + // update ghash incrementally + gf.ghashUpdate(block: ciphertext) + + return Array(ciphertext) + } + + @inlinable + func finalize(encrypt ciphertext: ArraySlice) throws -> ArraySlice { + // Calculate MAC tag. + let ghash = self.gf.ghashFinish() + let tag = Array((ghash ^ self.eky0).bytes.prefix(self.tagLength)) + + // Notify handler + self.didCalculateTag?(tag) + + switch self.mode { + case .combined: + return (ciphertext + tag).slice + case .detached: + return ciphertext + } + } + + @inlinable + func decrypt(block ciphertext: ArraySlice) -> Array { + self.counter = incrementCounter(self.counter) + + // update ghash incrementally + self.gf.ghashUpdate(block: Array(ciphertext)) + + guard let ekN = cipherOperation(counter.bytes.slice) else { + return Array(ciphertext) + } + + // ciphertext block ^ ek1 + let plaintext = xor(ciphertext, ekN) as Array + return plaintext + } + + // The authenticated decryption operation has five inputs: K, IV , C, A, and T. It has only a single + // output, either the plaintext value P or a special symbol FAIL that indicates that the inputs are not + // authentic. + @discardableResult + func willDecryptLast(bytes ciphertext: ArraySlice) throws -> ArraySlice { + // Validate tag + switch self.mode { + case .combined: + // overwrite expectedTag property used later for verification + self.expectedTag = Array(ciphertext.suffix(self.tagLength)) + return ciphertext[ciphertext.startIndex..) throws -> ArraySlice { + // Calculate MAC tag. + let ghash = self.gf.ghashFinish() + let computedTag = Array((ghash ^ self.eky0).bytes.prefix(self.tagLength)) + + // Validate tag + guard let expectedTag = self.expectedTag, computedTag == expectedTag else { + throw GCM.Error.fail + } + + return plaintext + } + + func finalize(decrypt plaintext: ArraySlice) throws -> ArraySlice { + // do nothing + plaintext + } +} + +// MARK: - Local utils + +private func makeCounter(nonce: Array) -> UInt128 { + UInt128(nonce + [0, 0, 0, 1]) +} + +// Successive counter values are generated using the function incr(), which treats the rightmost 32 +// bits of its argument as a nonnegative integer with the least significant bit on the right +private func incrementCounter(_ counter: UInt128) -> UInt128 { + let b = counter.i.b + 1 + let a = (b == 0 ? counter.i.a + 1 : counter.i.a) + return UInt128((a, b)) +} + +// If data is not a multiple of block size bytes long then the remainder is zero padded +// Note: It's similar to ZeroPadding, but it's not the same. +private func addPadding(_ bytes: Array, blockSize: Int) -> Array { + if bytes.isEmpty { + return Array(repeating: 0, count: blockSize) + } + + let remainder = bytes.count % blockSize + if remainder == 0 { + return bytes + } + + let paddingCount = blockSize - remainder + if paddingCount > 0 { + return bytes + Array(repeating: 0, count: paddingCount) + } + return bytes +} + +// MARK: - GF + +/// The Field GF(2^128) +private final class GF { + static let r = UInt128(a: 0xE100000000000000, b: 0) + + let blockSize: Int + let h: UInt128 + + // AAD won't change + let aadLength: Int + + // Updated for every consumed block + var ciphertextLength: Int + + // Start with 0 + var x: UInt128 + + init(aad: [UInt8], h: UInt128, blockSize: Int) { + self.blockSize = blockSize + self.aadLength = aad.count + self.ciphertextLength = 0 + self.h = h + self.x = 0 + + // Calculate for AAD at the begining + self.x = GF.calculateX(aad: aad, x: self.x, h: h, blockSize: blockSize) + } + + @discardableResult + func ghashUpdate(block ciphertextBlock: Array) -> UInt128 { + self.ciphertextLength += ciphertextBlock.count + self.x = GF.calculateX(block: addPadding(ciphertextBlock, blockSize: self.blockSize), x: self.x, h: self.h, blockSize: self.blockSize) + return self.x + } + + func ghashFinish() -> UInt128 { + // len(A) || len(C) + let len = UInt128(a: UInt64(aadLength * 8), b: UInt64(ciphertextLength * 8)) + x = GF.multiply(self.x ^ len, self.h) + return self.x + } + + // GHASH. One-time calculation + static func ghash(x startx: UInt128 = 0, h: UInt128, aad: Array, ciphertext: Array, blockSize: Int) -> UInt128 { + var x = self.calculateX(aad: aad, x: startx, h: h, blockSize: blockSize) + x = self.calculateX(ciphertext: ciphertext, x: x, h: h, blockSize: blockSize) + + // len(aad) || len(ciphertext) + let len = UInt128(a: UInt64(aad.count * 8), b: UInt64(ciphertext.count * 8)) + x = self.multiply(x ^ len, h) + + return x + } + + // Calculate Ciphertext part, for all blocks + // Not used with incremental calculation. + private static func calculateX(ciphertext: [UInt8], x startx: UInt128, h: UInt128, blockSize: Int) -> UInt128 { + let pciphertext = addPadding(ciphertext, blockSize: blockSize) + let blocksCount = pciphertext.count / blockSize + + var x = startx + for i in 0.., x: UInt128, h: UInt128, blockSize: Int) -> UInt128 { + let k = x ^ UInt128(ciphertextBlock) + return self.multiply(k, h) + } + + // Calculate AAD part, for all blocks + private static func calculateX(aad: [UInt8], x startx: UInt128, h: UInt128, blockSize: Int) -> UInt128 { + let paad = addPadding(aad, blockSize: blockSize) + let blocksCount = paad.count / blockSize + + var x = startx + for i in 0.. UInt128 { + var z: UInt128 = 0 + var v = x + var k = UInt128(a: 1 << 63, b: 0) + + for _ in 0..<128 { + if y & k == k { + z = z ^ v + } + + if v & 1 != 1 { + v = v >> 1 + } else { + v = (v >> 1) ^ self.r + } + + k = k >> 1 + } + + return z + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/OCB.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/OCB.swift new file mode 100644 index 00000000..4741793c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/OCB.swift @@ -0,0 +1,398 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// The OCB Authenticated-Encryption Algorithm +// https://tools.ietf.org/html/rfc7253 +// + +public final class OCB: BlockMode { + + public enum Mode { + /// In combined mode, the authentication tag is directly appended to the encrypted message. This is usually what you want. + case combined + /// Some applications may need to store the authentication tag and the encrypted message at different locations. + case detached + } + + public let options: BlockModeOption = [.initializationVectorRequired] + + public enum Error: Swift.Error { + case invalidNonce + case fail + } + + private let N: Array + private let additionalAuthenticatedData: Array? + private let mode: Mode + public let customBlockSize: Int? = nil + + /// Length of authentication tag, in bytes. + /// For encryption, the value is given as init parameter. + /// For decryption, the length of given authentication tag is used. + private let tagLength: Int + + // `authenticationTag` nil for encryption, known tag for decryption + /// For encryption, the value is set at the end of the encryption. + /// For decryption, this is a known Tag to validate against. + public var authenticationTag: Array? + + // encrypt + public init(nonce N: Array, additionalAuthenticatedData: Array? = nil, tagLength: Int = 16, mode: Mode = .detached) { + self.N = N + self.additionalAuthenticatedData = additionalAuthenticatedData + self.mode = mode + self.tagLength = tagLength + } + + // decrypt + @inlinable + public convenience init(nonce N: Array, authenticationTag: Array, additionalAuthenticatedData: Array? = nil, mode: Mode = .detached) { + self.init(nonce: N, additionalAuthenticatedData: additionalAuthenticatedData, tagLength: authenticationTag.count, mode: mode) + self.authenticationTag = authenticationTag + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.N.isEmpty || self.N.count > 15 { + throw Error.invalidNonce + } + + let worker = OCBModeWorker(N: N.slice, aad: self.additionalAuthenticatedData?.slice, expectedTag: self.authenticationTag, tagLength: self.tagLength, mode: self.mode, cipherOperation: cipherOperation, encryptionOperation: encryptionOperation) + worker.didCalculateTag = { [weak self] tag in + self?.authenticationTag = tag + } + return worker + } +} + +// MARK: - Worker + +final class OCBModeWorker: BlockModeWorker, FinalizingEncryptModeWorker, FinalizingDecryptModeWorker { + + let cipherOperation: CipherOperationOnBlock + var hashOperation: CipherOperationOnBlock! + + // Callback called when authenticationTag is ready + var didCalculateTag: ((Array) -> Void)? + + private let tagLength: Int + + let blockSize = 16 // 128 bit + var additionalBufferSize: Int + private let mode: OCB.Mode + + // Additional authenticated data + private let aad: ArraySlice? + // Known Tag used to validate during decryption + private var expectedTag: Array? + + /* + * KEY-DEPENDENT + */ + // NOTE: elements are lazily calculated + private var l = [Array]() + private var lAsterisk: Array + private var lDollar: Array + + /* + * PER-ENCRYPTION/DECRYPTION + */ + private var mainBlockCount: UInt64 + private var offsetMain: Array + private var checksum: Array + + init(N: ArraySlice, aad: ArraySlice? = nil, expectedTag: Array? = nil, tagLength: Int, mode: OCB.Mode, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) { + + self.cipherOperation = cipherOperation + self.hashOperation = encryptionOperation + self.mode = mode + self.aad = aad + self.expectedTag = expectedTag + self.tagLength = tagLength + + if mode == .combined { + self.additionalBufferSize = tagLength + } else { + self.additionalBufferSize = 0 + } + + /* + * KEY-DEPENDENT INITIALIZATION + */ + + let zeros = Array(repeating: 0, count: self.blockSize) + self.lAsterisk = self.hashOperation(zeros.slice)! /// L_* = ENCIPHER(K, zeros(128)) + self.lDollar = double(self.lAsterisk) /// L_$ = double(L_*) + self.l.append(double(self.lDollar)) /// L_0 = double(L_$) + + /* + * NONCE-DEPENDENT AND PER-ENCRYPTION/DECRYPTION INITIALIZATION + */ + + /// Nonce = num2str(TAGLEN mod 128,7) || zeros(120-bitlen(N)) || 1 || N + var nonce = Array(repeating: 0, count: blockSize) + nonce[(nonce.count - N.count)...] = N + nonce[0] = UInt8(tagLength) << 4 + nonce[blockSize - 1 - N.count] |= 1 + + /// bottom = str2num(Nonce[123..128]) + let bottom = nonce[15] & 0x3F + + /// Ktop = ENCIPHER(K, Nonce[1..122] || zeros(6)) + nonce[15] &= 0xC0 + let Ktop = self.hashOperation(nonce.slice)! + + /// Stretch = Ktop || (Ktop[1..64] xor Ktop[9..72]) + let Stretch = Ktop + xor(Ktop[0..<8], Ktop[1..<9]) + + /// Offset_0 = Stretch[1+bottom..128+bottom] + var offsetMAIN_0 = Array(repeating: 0, count: blockSize) + let bits = bottom % 8 + let bytes = Int(bottom / 8) + if bits == 0 { + offsetMAIN_0[0..> (8 - bits))) + } + } + + self.mainBlockCount = 0 + self.offsetMain = Array(offsetMAIN_0.slice) + self.checksum = Array(repeating: 0, count: self.blockSize) /// Checksum_0 = zeros(128) + } + + /// L_i = double(L_{i-1}) for every integer i > 0 + func getLSub(_ n: Int) -> Array { + while n >= self.l.count { + self.l.append(double(self.l.last!)) + } + return self.l[n] + } + + func computeTag() -> Array { + + let sum = self.hashAAD() + + /// Tag = ENCIPHER(K, Checksum_* xor Offset_* xor L_$) xor HASH(K,A) + return xor(self.hashOperation(xor(xor(self.checksum, self.offsetMain).slice, self.lDollar))!, sum) + } + + func hashAAD() -> Array { + var sum = Array(repeating: 0, count: blockSize) + + guard let aad = self.aad else { + return sum + } + + var offset = Array(repeating: 0, count: blockSize) + var blockCount: UInt64 = 1 + for aadBlock in aad.batched(by: self.blockSize) { + + if aadBlock.count == self.blockSize { + + /// Offset_i = Offset_{i-1} xor L_{ntz(i)} + offset = xor(offset, self.getLSub(ntz(blockCount))) + + /// Sum_i = Sum_{i-1} xor ENCIPHER(K, A_i xor Offset_i) + sum = xor(sum, self.hashOperation(xor(aadBlock, offset))!) + } else { + if !aadBlock.isEmpty { + + /// Offset_* = Offset_m xor L_* + offset = xor(offset, self.lAsterisk) + + /// CipherInput = (A_* || 1 || zeros(127-bitlen(A_*))) xor Offset_* + let cipherInput: Array = xor(extend(aadBlock, size: blockSize), offset) + + /// Sum = Sum_m xor ENCIPHER(K, CipherInput) + sum = xor(sum, self.hashOperation(cipherInput.slice)!) + } + } + blockCount += 1 + } + + return sum + } + + func encrypt(block plaintext: ArraySlice) -> Array { + + if plaintext.count == self.blockSize { + return self.processBlock(block: plaintext, forEncryption: true) + } else { + return self.processFinalBlock(block: plaintext, forEncryption: true) + } + } + + func finalize(encrypt ciphertext: ArraySlice) throws -> ArraySlice { + + let tag = self.computeTag() + + self.didCalculateTag?(tag) + + switch self.mode { + case .combined: + return ciphertext + tag + case .detached: + return ciphertext + } + } + + func decrypt(block ciphertext: ArraySlice) -> Array { + + if ciphertext.count == self.blockSize { + return self.processBlock(block: ciphertext, forEncryption: false) + } else { + return self.processFinalBlock(block: ciphertext, forEncryption: false) + } + } + + func finalize(decrypt plaintext: ArraySlice) throws -> ArraySlice { + // do nothing + plaintext + } + + private func processBlock(block: ArraySlice, forEncryption: Bool) -> Array { + + /* + * OCB-ENCRYPT/OCB-DECRYPT: Process any whole blocks + */ + + self.mainBlockCount += 1 + + /// Offset_i = Offset_{i-1} xor L_{ntz(i)} + self.offsetMain = xor(self.offsetMain, self.getLSub(ntz(self.mainBlockCount))) + + /// C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) + /// P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) + var mainBlock = Array(block) + mainBlock = xor(mainBlock, offsetMain) + mainBlock = self.cipherOperation(mainBlock.slice)! + mainBlock = xor(mainBlock, self.offsetMain) + + /// Checksum_i = Checksum_{i-1} xor P_i + if forEncryption { + self.checksum = xor(self.checksum, block) + } else { + self.checksum = xor(self.checksum, mainBlock) + } + + return mainBlock + } + + private func processFinalBlock(block: ArraySlice, forEncryption: Bool) -> Array { + + let out: Array + + if block.isEmpty { + /// C_* = + /// P_* = + out = [] + + } else { + + /// Offset_* = Offset_m xor L_* + self.offsetMain = xor(self.offsetMain, self.lAsterisk) + + /// Pad = ENCIPHER(K, Offset_*) + let Pad = self.hashOperation(self.offsetMain.slice)! + + /// C_* = P_* xor Pad[1..bitlen(P_*)] + /// P_* = C_* xor Pad[1..bitlen(C_*)] + out = xor(block, Pad[0..) throws -> ArraySlice { + // Validate tag + switch self.mode { + case .combined: + // overwrite expectedTag property used later for verification + self.expectedTag = Array(ciphertext.suffix(self.tagLength)) + return ciphertext[ciphertext.startIndex..) throws -> ArraySlice { + // Calculate MAC tag. + let computedTag = self.computeTag() + + // Validate tag + guard let expectedTag = self.expectedTag, computedTag == expectedTag else { + throw OCB.Error.fail + } + + return plaintext + } +} + +// MARK: - Local utils + +private func ntz(_ x: UInt64) -> Int { + if x == 0 { + return 64 + } + + var xv = x + var n = 0 + while (xv & 1) == 0 { + n += 1 + xv = xv >> 1 + } + return n +} + +private func double(_ block: Array) -> Array { + var ( carry, result) = shiftLeft(block) + + /* + * NOTE: This construction is an attempt at a constant-time implementation. + */ + result[15] ^= (0x87 >> ((1 - carry) << 3)) + + return result +} + +private func shiftLeft(_ block: Array) -> (UInt8, Array) { + var output = Array(repeating: 0, count: block.count) + + var bit: UInt8 = 0 + + for i in 0..> 7) & 1 + } + return (bit, output) +} + +private func extend(_ block: ArraySlice, size: Int) -> Array { + var output = Array(repeating: 0, count: size) + output[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Output Feedback (OFB) +// + +public struct OFB: BlockMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + } + + public let options: BlockModeOption = [.initializationVectorRequired, .useEncryptToDecrypt] + private let iv: Array + public let customBlockSize: Int? = nil + + public init(iv: Array) { + self.iv = iv + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.iv.count != blockSize { + throw Error.invalidInitializationVector + } + + return OFBModeWorker(blockSize: blockSize, iv: self.iv.slice, cipherOperation: cipherOperation) + } +} + +struct OFBModeWorker: BlockModeWorker { + let cipherOperation: CipherOperationOnBlock + let blockSize: Int + let additionalBufferSize: Int = 0 + private let iv: ArraySlice + private var prev: ArraySlice? + + init(blockSize: Int, iv: ArraySlice, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = blockSize + self.iv = iv + self.cipherOperation = cipherOperation + } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + guard let ciphertext = cipherOperation(prev ?? iv) else { + return Array(plaintext) + } + self.prev = ciphertext.slice + return xor(plaintext, ciphertext) + } + + @inlinable + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + guard let decrypted = cipherOperation(prev ?? iv) else { + return Array(ciphertext) + } + let plaintext: Array = xor(decrypted, ciphertext) + prev = decrypted.slice + return plaintext + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/PCBC.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/PCBC.swift new file mode 100644 index 00000000..83f767da --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/BlockMode/PCBC.swift @@ -0,0 +1,74 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Propagating Cipher Block Chaining (PCBC) +// + +public struct PCBC: BlockMode { + public enum Error: Swift.Error { + /// Invalid IV + case invalidInitializationVector + } + + public let options: BlockModeOption = [.initializationVectorRequired, .paddingRequired] + private let iv: Array + public let customBlockSize: Int? = nil + + public init(iv: Array) { + self.iv = iv + } + + public func worker(blockSize: Int, cipherOperation: @escaping CipherOperationOnBlock, encryptionOperation: @escaping CipherOperationOnBlock) throws -> CipherModeWorker { + if self.iv.count != blockSize { + throw Error.invalidInitializationVector + } + + return PCBCModeWorker(blockSize: blockSize, iv: self.iv.slice, cipherOperation: cipherOperation) + } +} + +struct PCBCModeWorker: BlockModeWorker { + let cipherOperation: CipherOperationOnBlock + var blockSize: Int + let additionalBufferSize: Int = 0 + private let iv: ArraySlice + private var prev: ArraySlice? + + @inlinable + init(blockSize: Int, iv: ArraySlice, cipherOperation: @escaping CipherOperationOnBlock) { + self.blockSize = blockSize + self.iv = iv + self.cipherOperation = cipherOperation + } + + @inlinable + mutating func encrypt(block plaintext: ArraySlice) -> Array { + guard let ciphertext = cipherOperation(xor(prev ?? iv, plaintext)) else { + return Array(plaintext) + } + self.prev = xor(plaintext, ciphertext.slice) + return ciphertext + } + + @inlinable + mutating func decrypt(block ciphertext: ArraySlice) -> Array { + guard let plaintext = cipherOperation(ciphertext) else { + return Array(ciphertext) + } + let result: Array = xor(prev ?? self.iv, plaintext) + self.prev = xor(result, ciphertext) + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Blowfish.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Blowfish.swift new file mode 100644 index 00000000..b9c7d108 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Blowfish.swift @@ -0,0 +1,545 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// https://en.wikipedia.org/wiki/Blowfish_(cipher) +// Based on Paul Kocher implementation +// + +public final class Blowfish { + public enum Error: Swift.Error { + /// Data padding is required + case dataPaddingRequired + /// Invalid key or IV + case invalidKeyOrInitializationVector + /// Invalid IV + case invalidInitializationVector + /// Invalid block mode + case invalidBlockMode + } + + public static let blockSize: Int = 8 // 64 bit + public let keySize: Int + + private let blockMode: BlockMode + private let padding: Padding + private var decryptWorker: CipherModeWorker! + private var encryptWorker: CipherModeWorker! + + private let N = 16 // rounds + private var P: Array + private var S: Array> + private let origP: Array = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, + 0x299f31d0, 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, + 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, + 0xb5470917, 0x9216d5d9, 0x8979fb1b + ] + + private let origS: Array> = [ + [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a + ], + [ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 + ], + [ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 + ], + [ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ] + ] + + public init(key: Array, blockMode: BlockMode = CBC(iv: Array(repeating: 0, count: Blowfish.blockSize)), padding: Padding) throws { + precondition(key.count >= 5 && key.count <= 56) + + self.blockMode = blockMode + self.padding = padding + self.keySize = key.count + + self.S = self.origS + self.P = self.origP + + self.expandKey(key: key) + try self.setupBlockModeWorkers() + } + + private func setupBlockModeWorkers() throws { + let decryptBlock = { [weak self] (block: ArraySlice) -> Array? in + self?.decrypt(block: block) + } + + let encryptBlock = { [weak self] (block: ArraySlice) -> Array? in + self?.encrypt(block: block) + } + + self.encryptWorker = try self.blockMode.worker(blockSize: Blowfish.blockSize, cipherOperation: encryptBlock, encryptionOperation: encryptBlock) + + if self.blockMode.options.contains(.useEncryptToDecrypt) { + self.decryptWorker = try self.blockMode.worker(blockSize: Blowfish.blockSize, cipherOperation: encryptBlock, encryptionOperation: encryptBlock) + } else { + self.decryptWorker = try self.blockMode.worker(blockSize: Blowfish.blockSize, cipherOperation: decryptBlock, encryptionOperation: encryptBlock) + } + } + + private func reset() { + self.S = self.origS + self.P = self.origP + // todo expand key + } + + private func expandKey(key: Array) { + var j = 0 + for i in 0..<(self.N + 2) { + var data: UInt32 = 0x0 + for _ in 0..<4 { + data = (data << 8) | UInt32(key[j]) + j += 1 + if j >= key.count { + j = 0 + } + } + self.P[i] ^= data + } + + var datal: UInt32 = 0 + var datar: UInt32 = 0 + + for i in stride(from: 0, to: self.N + 2, by: 2) { + self.encryptBlowfishBlock(l: &datal, r: &datar) + self.P[i] = datal + self.P[i + 1] = datar + } + + for i in 0..<4 { + for j in stride(from: 0, to: 256, by: 2) { + self.encryptBlowfishBlock(l: &datal, r: &datar) + self.S[i][j] = datal + self.S[i][j + 1] = datar + } + } + } + + private func encrypt(block: ArraySlice) -> Array? { + var result = Array() + + var l = UInt32(bytes: block[block.startIndex..> 24) & 0xff), + UInt8((l >> 16) & 0xff) + ] + result += [ + UInt8((l >> 8) & 0xff), + UInt8((l >> 0) & 0xff) + ] + result += [ + UInt8((r >> 24) & 0xff), + UInt8((r >> 16) & 0xff) + ] + result += [ + UInt8((r >> 8) & 0xff), + UInt8((r >> 0) & 0xff) + ] + + return result + } + + private func decrypt(block: ArraySlice) -> Array? { + var result = Array() + + var l = UInt32(bytes: block[block.startIndex..> 24) & 0xff), + UInt8((l >> 16) & 0xff) + ] + result += [ + UInt8((l >> 8) & 0xff), + UInt8((l >> 0) & 0xff) + ] + result += [ + UInt8((r >> 24) & 0xff), + UInt8((r >> 16) & 0xff) + ] + result += [ + UInt8((r >> 8) & 0xff), + UInt8((r >> 0) & 0xff) + ] + return result + } + + /// Encrypts the 8-byte padded buffer + /// + /// - Parameters: + /// - l: left half + /// - r: right half + private func encryptBlowfishBlock(l: inout UInt32, r: inout UInt32) { + var Xl = l + var Xr = r + + for i in 0.. UInt32 { + let f1 = self.S[0][Int(x >> 24) & 0xff] + let f2 = self.S[1][Int(x >> 16) & 0xff] + let f3 = self.S[2][Int(x >> 8) & 0xff] + let f4 = self.S[3][Int(x & 0xff)] + return ((f1 &+ f2) ^ f3) &+ f4 + } +} + +extension Blowfish: Cipher { + /// Encrypt the 8-byte padded buffer, block by block. Note that for amounts of data larger than a block, it is not safe to just call encrypt() on successive blocks. + /// + /// - Parameter bytes: Plaintext data + /// - Returns: Encrypted data + public func encrypt(_ bytes: C) throws -> Array where C.Element == UInt8, C.Index == Int { + let bytes = self.padding.add(to: Array(bytes), blockSize: Blowfish.blockSize) // FIXME: Array(bytes) copies + + var out = Array() + out.reserveCapacity(bytes.count) + + for chunk in bytes.batched(by: Blowfish.blockSize) { + out += self.encryptWorker.encrypt(block: chunk) + } + + if self.blockMode.options.contains(.paddingRequired) && (out.count % Blowfish.blockSize != 0) { + throw Error.dataPaddingRequired + } + + return out + } + + /// Decrypt the 8-byte padded buffer + /// + /// - Parameter bytes: Ciphertext data + /// - Returns: Plaintext data + public func decrypt(_ bytes: C) throws -> Array where C.Element == UInt8, C.Index == Int { + if self.blockMode.options.contains(.paddingRequired) && (bytes.count % Blowfish.blockSize != 0) { + throw Error.dataPaddingRequired + } + + var out = Array() + out.reserveCapacity(bytes.count) + + for chunk in Array(bytes).batched(by: Blowfish.blockSize) { + out += self.decryptWorker.decrypt(block: chunk) // FIXME: copying here is innefective + } + + out = self.padding.remove(from: out, blockSize: Blowfish.blockSize) + + return out + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CBCMAC.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CBCMAC.swift new file mode 100644 index 00000000..40b38485 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CBCMAC.swift @@ -0,0 +1,30 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public final class CBCMAC: CMAC { + public override func authenticate(_ bytes: Array) throws -> Array { + var inBytes = bytes + bitPadding(to: &inBytes, blockSize: CMAC.BlockSize) + let blocks = inBytes.batched(by: CMAC.BlockSize) + + var lastBlockEncryptionResult: [UInt8] = CBCMAC.Zero + try blocks.forEach { block in + let aes = try AES(key: Array(key), blockMode: CBC(iv: lastBlockEncryptionResult), padding: .noPadding) + lastBlockEncryptionResult = try aes.encrypt(block) + } + + return lastBlockEncryptionResult + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CMAC.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CMAC.swift new file mode 100644 index 00000000..8cdb9b32 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CMAC.swift @@ -0,0 +1,106 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public class CMAC: Authenticator { + public enum Error: Swift.Error { + case wrongKeyLength + } + + internal let key: SecureBytes + + internal static let BlockSize: Int = 16 + internal static let Zero: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + private static let Rb: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87] + + public init(key: Array) throws { + self.key = SecureBytes(bytes: key) + } + + // MARK: Authenticator + + // AES-CMAC + public func authenticate(_ bytes: Array) throws -> Array { + let cipher = try AES(key: Array(key), blockMode: CBC(iv: CMAC.Zero), padding: .noPadding) + return try self.authenticate(bytes, cipher: cipher) + } + + // CMAC using a Cipher + public func authenticate(_ bytes: Array, cipher: Cipher) throws -> Array { + let l = try cipher.encrypt(CMAC.Zero) + var subKey1 = self.leftShiftOneBit(l) + if (l[0] & 0x80) != 0 { + subKey1 = xor(CMAC.Rb, subKey1) + } + var subKey2 = self.leftShiftOneBit(subKey1) + if (subKey1[0] & 0x80) != 0 { + subKey2 = xor(CMAC.Rb, subKey2) + } + + let lastBlockComplete: Bool + let blockCount = (bytes.count + CMAC.BlockSize - 1) / CMAC.BlockSize + if blockCount == 0 { + lastBlockComplete = false + } else { + lastBlockComplete = bytes.count % CMAC.BlockSize == 0 + } + var paddedBytes = bytes + if !lastBlockComplete { + bitPadding(to: &paddedBytes, blockSize: CMAC.BlockSize) + } + + var blocks = Array(paddedBytes.batched(by: CMAC.BlockSize)) + var lastBlock = blocks.popLast()! + if lastBlockComplete { + lastBlock = xor(lastBlock, subKey1) + } else { + lastBlock = xor(lastBlock, subKey2) + } + + var x = Array(repeating: 0x00, count: CMAC.BlockSize) + var y = Array(repeating: 0x00, count: CMAC.BlockSize) + for block in blocks { + y = xor(block, x) + x = try cipher.encrypt(y) + } + // the difference between CMAC and CBC-MAC is that CMAC xors the final block with a secret value + y = self.process(lastBlock: lastBlock, with: x) + return try cipher.encrypt(y) + } + + func process(lastBlock: ArraySlice, with x: [UInt8]) -> [UInt8] { + xor(lastBlock, x) + } + + // MARK: Helper methods + + /** + Performs left shift by one bit to the bit string aquired after concatenating al bytes in the byte array + - parameters: + - bytes: byte array + - returns: bit shifted bit string split again in array of bytes + */ + private func leftShiftOneBit(_ bytes: Array) -> Array { + var shifted = Array(repeating: 0x00, count: bytes.count) + let last = bytes.count - 1 + for index in 0..= 0) + var carry = word + var i = shift + while carry > 0 { + let (d, c) = self[i].addingReportingOverflow(carry) + self[i] = d + carry = (c ? 1 : 0) + i += 1 + } + } + + /// Add the digit `d` to this integer and return the result. + /// `d` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, shift)) + internal func addingWord(_ word: Word, shiftedBy shift: Int = 0) -> CS.BigUInt { + var r = self + r.addWord(word, shiftedBy: shift) + return r + } + + /// Add `b` to this integer in place. + /// `b` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, b.count + shift)) + internal mutating func add(_ b: CS.BigUInt, shiftedBy shift: Int = 0) { + precondition(shift >= 0) + var carry = false + var bi = 0 + let bc = b.count + while bi < bc || carry { + let ai = shift + bi + let (d, c) = self[ai].addingReportingOverflow(b[bi]) + if carry { + let (d2, c2) = d.addingReportingOverflow(1) + self[ai] = d2 + carry = c || c2 + } + else { + self[ai] = d + carry = c + } + bi += 1 + } + } + + /// Add `b` to this integer and return the result. + /// `b` is shifted `shift` words to the left before being added. + /// + /// - Complexity: O(max(count, b.count + shift)) + internal func adding(_ b: CS.BigUInt, shiftedBy shift: Int = 0) -> CS.BigUInt { + var r = self + r.add(b, shiftedBy: shift) + return r + } + + /// Increment this integer by one. If `shift` is non-zero, it selects + /// the word that is to be incremented. + /// + /// - Complexity: O(count + shift) + internal mutating func increment(shiftedBy shift: Int = 0) { + self.addWord(1, shiftedBy: shift) + } + + /// Add `a` and `b` together and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func +(a: CS.BigUInt, b: CS.BigUInt) -> CS.BigUInt { + return a.adding(b) + } + + /// Add `a` and `b` together, and store the sum in `a`. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func +=(a: inout CS.BigUInt, b: CS.BigUInt) { + a.add(b, shiftedBy: 0) + } +} + +extension CS.BigInt { + /// Add `a` to `b` and return the result. + public static func +(a: CS.BigInt, b: CS.BigInt) -> CS.BigInt { + switch (a.sign, b.sign) { + case (.plus, .plus): + return CS.BigInt(sign: .plus, magnitude: a.magnitude + b.magnitude) + case (.minus, .minus): + return CS.BigInt(sign: .minus, magnitude: a.magnitude + b.magnitude) + case (.plus, .minus): + if a.magnitude >= b.magnitude { + return CS.BigInt(sign: .plus, magnitude: a.magnitude - b.magnitude) + } + else { + return CS.BigInt(sign: .minus, magnitude: b.magnitude - a.magnitude) + } + case (.minus, .plus): + if b.magnitude >= a.magnitude { + return CS.BigInt(sign: .plus, magnitude: b.magnitude - a.magnitude) + } + else { + return CS.BigInt(sign: .minus, magnitude: a.magnitude - b.magnitude) + } + } + } + + /// Add `b` to `a` in place. + public static func +=(a: inout CS.BigInt, b: CS.BigInt) { + a = a + b + } +} + diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigInt.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigInt.swift new file mode 100644 index 00000000..5c748db5 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigInt.swift @@ -0,0 +1,78 @@ +// +// CS.BigInt.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2015-12-27. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: CS.BigInt + +extension CS { + + /// An arbitary precision signed integer type, also known as a "big integer". + /// + /// Operations on big integers never overflow, but they might take a long time to execute. + /// The amount of memory (and address space) available is the only constraint to the magnitude of these numbers. + /// + /// This particular big integer type uses base-2^64 digits to represent integers. + /// + /// `BigInt` is essentially a tiny wrapper that extends `BigUInt` with a sign bit and provides signed integer + /// operations. Both the underlying absolute value and the negative/positive flag are available as read-write + /// properties. + /// + /// Not all algorithms of `BigUInt` are available for `BigInt` values; for example, there is no square root or + /// primality test for signed integers. When you need to call one of these, just extract the absolute value: + /// + /// ```Swift + /// CS.BigInt(255).abs.isPrime() // Returns false + /// ``` + /// + public struct BigInt: SignedInteger { + public enum Sign { + case plus + case minus + } + + public typealias Magnitude = BigUInt + + /// The type representing a digit in `BigInt`'s underlying number system. + public typealias Word = BigUInt.Word + + public static var isSigned: Bool { + return true + } + + /// The absolute value of this integer. + public var magnitude: BigUInt + + /// True iff the value of this integer is negative. + public var sign: Sign + + /// Initializes a new big integer with the provided absolute number and sign flag. + public init(sign: Sign, magnitude: BigUInt) { + self.sign = (magnitude.isZero ? .plus : sign) + self.magnitude = magnitude + } + + /// Return true iff this integer is zero. + /// + /// - Complexity: O(1) + public var isZero: Bool { + return magnitude.isZero + } + + /// Returns `-1` if this value is negative and `1` if it’s positive; otherwise, `0`. + /// + /// - Returns: The sign of this number, expressed as an integer of the same type. + public func signum() -> CS.BigInt { + switch sign { + case .plus: + return isZero ? 0 : 1 + case .minus: + return -1 + } + } + } + +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigUInt.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigUInt.swift new file mode 100644 index 00000000..3461bf9c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/BigUInt.swift @@ -0,0 +1,389 @@ +// +// BigUInt.swift +// BigInt +// +// Created by Károly Lőrentey on 2015-12-26. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS { + + /// An arbitary precision unsigned integer type, also known as a "big integer". + /// + /// Operations on big integers never overflow, but they may take a long time to execute. + /// The amount of memory (and address space) available is the only constraint to the magnitude of these numbers. + /// + /// This particular big integer type uses base-2^64 digits to represent integers; you can think of it as a wrapper + /// around `Array`. (In fact, `BigUInt` only uses an array if there are more than two digits.) + public struct BigUInt: UnsignedInteger { + /// The type representing a digit in `BigUInt`'s underlying number system. + public typealias Word = UInt + + /// The storage variants of a `BigUInt`. + enum Kind { + /// Value consists of the two specified words (low and high). Either or both words may be zero. + case inline(Word, Word) + /// Words are stored in a slice of the storage array. + case slice(from: Int, to: Int) + /// Words are stored in the storage array. + case array + } + + internal fileprivate (set) var kind: Kind // Internal for testing only + internal fileprivate (set) var storage: [Word] // Internal for testing only; stored separately to prevent COW copies + + /// Initializes a new BigUInt with value 0. + public init() { + self.kind = .inline(0, 0) + self.storage = [] + } + + internal init(word: Word) { + self.kind = .inline(word, 0) + self.storage = [] + } + + internal init(low: Word, high: Word) { + self.kind = .inline(low, high) + self.storage = [] + } + + /// Initializes a new BigUInt with the specified digits. The digits are ordered from least to most significant. + public init(words: [Word]) { + self.kind = .array + self.storage = words + normalize() + } + + internal init(words: [Word], from startIndex: Int, to endIndex: Int) { + self.kind = .slice(from: startIndex, to: endIndex) + self.storage = words + normalize() + } + } + +} + +extension CS.BigUInt { + public static var isSigned: Bool { + return false + } + + /// Return true iff this integer is zero. + /// + /// - Complexity: O(1) + var isZero: Bool { + switch kind { + case .inline(0, 0): return true + case .array: return storage.isEmpty + default: + return false + } + } + + /// Returns `1` if this value is, positive; otherwise, `0`. + /// + /// - Returns: The sign of this number, expressed as an integer of the same type. + public func signum() -> CS.BigUInt { + return isZero ? 0 : 1 + } +} + +extension CS.BigUInt { + mutating func ensureArray() { + switch kind { + case let .inline(w0, w1): + kind = .array + storage = w1 != 0 ? [w0, w1] + : w0 != 0 ? [w0] + : [] + case let .slice(from: start, to: end): + kind = .array + storage = Array(storage[start ..< end]) + case .array: + break + } + } + + var capacity: Int { + guard case .array = kind else { return 0 } + return storage.capacity + } + + mutating func reserveCapacity(_ minimumCapacity: Int) { + switch kind { + case let .inline(w0, w1): + kind = .array + storage.reserveCapacity(minimumCapacity) + if w1 != 0 { + storage.append(w0) + storage.append(w1) + } + else if w0 != 0 { + storage.append(w0) + } + case let .slice(from: start, to: end): + kind = .array + var words: [Word] = [] + words.reserveCapacity(Swift.max(end - start, minimumCapacity)) + words.append(contentsOf: storage[start ..< end]) + storage = words + case .array: + storage.reserveCapacity(minimumCapacity) + } + } + + /// Gets rid of leading zero digits in the digit array and converts slices into inline digits when possible. + internal mutating func normalize() { + switch kind { + case .slice(from: let start, to: var end): + assert(start >= 0 && end <= storage.count && start <= end) + while start < end, storage[end - 1] == 0 { + end -= 1 + } + switch end - start { + case 0: + kind = .inline(0, 0) + storage = [] + case 1: + kind = .inline(storage[start], 0) + storage = [] + case 2: + kind = .inline(storage[start], storage[start + 1]) + storage = [] + case storage.count: + assert(start == 0) + kind = .array + default: + kind = .slice(from: start, to: end) + } + case .array where storage.last == 0: + while storage.last == 0 { + storage.removeLast() + } + default: + break + } + } + + /// Set this integer to 0 without releasing allocated storage capacity (if any). + mutating func clear() { + self.load(0) + } + + /// Set this integer to `value` by copying its digits without releasing allocated storage capacity (if any). + mutating func load(_ value: CS.BigUInt) { + switch kind { + case .inline, .slice: + self = value + case .array: + self.storage.removeAll(keepingCapacity: true) + self.storage.append(contentsOf: value.words) + } + } +} + +extension CS.BigUInt { + //MARK: Collection-like members + + /// The number of digits in this integer, excluding leading zero digits. + var count: Int { + switch kind { + case let .inline(w0, w1): + return w1 != 0 ? 2 + : w0 != 0 ? 1 + : 0 + case let .slice(from: start, to: end): + return end - start + case .array: + return storage.count + } + } + + /// Get or set a digit at a given index. + /// + /// - Note: Unlike a normal collection, it is OK for the index to be greater than or equal to `endIndex`. + /// The subscripting getter returns zero for indexes beyond the most significant digit. + /// Setting these extended digits automatically appends new elements to the underlying digit array. + /// - Requires: index >= 0 + /// - Complexity: The getter is O(1). The setter is O(1) if the conditions below are true; otherwise it's O(count). + /// - The integer's storage is not shared with another integer + /// - The integer wasn't created as a slice of another integer + /// - `index < count` + subscript(_ index: Int) -> Word { + get { + precondition(index >= 0) + switch (kind, index) { + case (.inline(let w0, _), 0): return w0 + case (.inline(_, let w1), 1): return w1 + case (.slice(from: let start, to: let end), _) where index < end - start: + return storage[start + index] + case (.array, _) where index < storage.count: + return storage[index] + default: + return 0 + } + } + set(word) { + precondition(index >= 0) + switch (kind, index) { + case let (.inline(_, w1), 0): + kind = .inline(word, w1) + case let (.inline(w0, _), 1): + kind = .inline(w0, word) + case let (.slice(from: start, to: end), _) where index < end - start: + replace(at: index, with: word) + case (.array, _) where index < storage.count: + replace(at: index, with: word) + default: + extend(at: index, with: word) + } + } + } + + private mutating func replace(at index: Int, with word: Word) { + ensureArray() + precondition(index < storage.count) + storage[index] = word + if word == 0, index == storage.count - 1 { + normalize() + } + } + + private mutating func extend(at index: Int, with word: Word) { + guard word != 0 else { return } + reserveCapacity(index + 1) + precondition(index >= storage.count) + storage.append(contentsOf: repeatElement(0, count: index - storage.count)) + storage.append(word) + } + + /// Returns an integer built from the digits of this integer in the given range. + internal func extract(_ bounds: Range) -> CS.BigUInt { + switch kind { + case let .inline(w0, w1): + let bounds = bounds.clamped(to: 0 ..< 2) + if bounds == 0 ..< 2 { + return CS.BigUInt(low: w0, high: w1) + } + else if bounds == 0 ..< 1 { + return CS.BigUInt(word: w0) + } + else if bounds == 1 ..< 2 { + return CS.BigUInt(word: w1) + } + else { + return CS.BigUInt() + } + case let .slice(from: start, to: end): + let s = Swift.min(end, start + Swift.max(bounds.lowerBound, 0)) + let e = Swift.max(s, (bounds.upperBound > end - start ? end : start + bounds.upperBound)) + return CS.BigUInt(words: storage, from: s, to: e) + case .array: + let b = bounds.clamped(to: storage.startIndex ..< storage.endIndex) + return CS.BigUInt(words: storage, from: b.lowerBound, to: b.upperBound) + } + } + + internal func extract(_ bounds: Bounds) -> CS.BigUInt where Bounds.Bound == Int { + return self.extract(bounds.relative(to: 0 ..< Int.max)) + } +} + +extension CS.BigUInt { + internal mutating func shiftRight(byWords amount: Int) { + assert(amount >= 0) + guard amount > 0 else { return } + switch kind { + case let .inline(_, w1) where amount == 1: + kind = .inline(w1, 0) + case .inline(_, _): + kind = .inline(0, 0) + case let .slice(from: start, to: end): + let s = start + amount + if s >= end { + kind = .inline(0, 0) + } + else { + kind = .slice(from: s, to: end) + normalize() + } + case .array: + if amount >= storage.count { + storage.removeAll(keepingCapacity: true) + } + else { + storage.removeFirst(amount) + } + } + } + + internal mutating func shiftLeft(byWords amount: Int) { + assert(amount >= 0) + guard amount > 0 else { return } + guard !isZero else { return } + switch kind { + case let .inline(w0, 0) where amount == 1: + kind = .inline(0, w0) + case let .inline(w0, w1): + let c = (w1 == 0 ? 1 : 2) + storage.reserveCapacity(amount + c) + storage.append(contentsOf: repeatElement(0, count: amount)) + storage.append(w0) + if w1 != 0 { + storage.append(w1) + } + kind = .array + case let .slice(from: start, to: end): + var words: [Word] = [] + words.reserveCapacity(amount + count) + words.append(contentsOf: repeatElement(0, count: amount)) + words.append(contentsOf: storage[start ..< end]) + storage = words + kind = .array + case .array: + storage.insert(contentsOf: repeatElement(0, count: amount), at: 0) + } + } +} + +extension CS.BigUInt { + //MARK: Low and High + + /// Split this integer into a high-order and a low-order part. + /// + /// - Requires: count > 1 + /// - Returns: `(low, high)` such that + /// - `self == low.add(high, shiftedBy: middleIndex)` + /// - `high.width <= floor(width / 2)` + /// - `low.width <= ceil(width / 2)` + /// - Complexity: Typically O(1), but O(count) in the worst case, because high-order zero digits need to be removed after the split. + internal var split: (high: CS.BigUInt, low: CS.BigUInt) { + precondition(count > 1) + let mid = middleIndex + return (self.extract(mid...), self.extract(.. 1 + internal var low: CS.BigUInt { + return self.extract(0 ..< middleIndex) + } + + /// The high-order half of this CS.BigUInt. + /// + /// - Returns: `self[middleIndex ..< count]` + /// - Requires: count > 1 + internal var high: CS.BigUInt { + return self.extract(middleIndex ..< count) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Bitwise Ops.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Bitwise Ops.swift new file mode 100644 index 00000000..10099081 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Bitwise Ops.swift @@ -0,0 +1,121 @@ +// +// Bitwise Ops.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Bitwise Operations + +extension CS.BigUInt { + /// Return the ones' complement of `a`. + /// + /// - Complexity: O(a.count) + public static prefix func ~(a: CS.BigUInt) -> CS.BigUInt { + return CS.BigUInt(words: a.words.map { ~$0 }) + } + + /// Calculate the bitwise OR of `a` and `b`, and store the result in `a`. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func |= (a: inout CS.BigUInt, b: CS.BigUInt) { + a.reserveCapacity(b.count) + for i in 0 ..< b.count { + a[i] |= b[i] + } + } + + /// Calculate the bitwise AND of `a` and `b` and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func &= (a: inout CS.BigUInt, b: CS.BigUInt) { + for i in 0 ..< Swift.max(a.count, b.count) { + a[i] &= b[i] + } + } + + /// Calculate the bitwise XOR of `a` and `b` and return the result. + /// + /// - Complexity: O(max(a.count, b.count)) + public static func ^= (a: inout CS.BigUInt, b: CS.BigUInt) { + a.reserveCapacity(b.count) + for i in 0 ..< b.count { + a[i] ^= b[i] + } + } +} + +extension CS.BigInt { + public static prefix func ~(x: CS.BigInt) -> CS.BigInt { + switch x.sign { + case .plus: + return CS.BigInt(sign: .minus, magnitude: x.magnitude + 1) + case .minus: + return CS.BigInt(sign: .plus, magnitude: x.magnitude - 1) + } + } + + public static func &(lhs: inout CS.BigInt, rhs: CS.BigInt) -> CS.BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] & right[i]) + } + if lhs.sign == .minus && rhs.sign == .minus { + words.twosComplement() + return CS.BigInt(sign: .minus, magnitude: CS.BigUInt(words: words)) + } + return CS.BigInt(sign: .plus, magnitude: CS.BigUInt(words: words)) + } + + public static func |(lhs: inout CS.BigInt, rhs: CS.BigInt) -> CS.BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] | right[i]) + } + if lhs.sign == .minus || rhs.sign == .minus { + words.twosComplement() + return CS.BigInt(sign: .minus, magnitude: CS.BigUInt(words: words)) + } + return CS.BigInt(sign: .plus, magnitude: CS.BigUInt(words: words)) + } + + public static func ^(lhs: inout CS.BigInt, rhs: CS.BigInt) -> CS.BigInt { + let left = lhs.words + let right = rhs.words + // Note we aren't using left.count/right.count here; we account for the sign bit separately later. + let count = Swift.max(lhs.magnitude.count, rhs.magnitude.count) + var words: [UInt] = [] + words.reserveCapacity(count) + for i in 0 ..< count { + words.append(left[i] ^ right[i]) + } + if (lhs.sign == .minus) != (rhs.sign == .minus) { + words.twosComplement() + return CS.BigInt(sign: .minus, magnitude: CS.BigUInt(words: words)) + } + return CS.BigInt(sign: .plus, magnitude: CS.BigUInt(words: words)) + } + + public static func &=(lhs: inout CS.BigInt, rhs: CS.BigInt) { + lhs = lhs & rhs + } + + public static func |=(lhs: inout CS.BigInt, rhs: CS.BigInt) { + lhs = lhs | rhs + } + + public static func ^=(lhs: inout CS.BigInt, rhs: CS.BigInt) { + lhs = lhs ^ rhs + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/CS.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/CS.swift new file mode 100644 index 00000000..cec128e3 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/CS.swift @@ -0,0 +1,24 @@ +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// To avoid name conflict with BigInt library, I choose to rename +// BigInt -> BigInteger +// BigUInt -> BigUInteger + +public typealias BigInteger = CS.BigInt +public typealias BigUInteger = CS.BigUInt + +public enum CS { + // namespace +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Codable.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Codable.swift new file mode 100644 index 00000000..067c19e3 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Codable.swift @@ -0,0 +1,157 @@ +// +// Codable.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2017-8-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS { + + // Little-endian to big-endian + struct Units: RandomAccessCollection + where Words.Element: FixedWidthInteger, Words.Index == Int { + typealias Word = Words.Element + let words: Words + init(of type: Unit.Type, _ words: Words) { + precondition(Word.bitWidth % Unit.bitWidth == 0 || Unit.bitWidth % Word.bitWidth == 0) + self.words = words + } + var count: Int { return (words.count * Word.bitWidth + Unit.bitWidth - 1) / Unit.bitWidth } + var startIndex: Int { return 0 } + var endIndex: Int { return count } + subscript(_ index: Int) -> Unit { + let index = count - 1 - index + if Unit.bitWidth == Word.bitWidth { + return Unit(words[index]) + } + else if Unit.bitWidth > Word.bitWidth { + let c = Unit.bitWidth / Word.bitWidth + var unit: Unit = 0 + var j = 0 + for i in (c * index) ..< Swift.min(c * (index + 1), words.endIndex) { + unit |= Unit(words[i]) << j + j += Word.bitWidth + } + return unit + } + // Unit.bitWidth < Word.bitWidth + let c = Word.bitWidth / Unit.bitWidth + let i = index / c + let j = index % c + return Unit(truncatingIfNeeded: words[i] >> (j * Unit.bitWidth)) + } + } +} + +extension Array where Element: FixedWidthInteger { + // Big-endian to little-endian + init(count: Int?, generator: () throws -> Unit?) rethrows { + typealias Word = Element + precondition(Word.bitWidth % Unit.bitWidth == 0 || Unit.bitWidth % Word.bitWidth == 0) + self = [] + if Unit.bitWidth == Word.bitWidth { + if let count = count { + self.reserveCapacity(count) + } + while let unit = try generator() { + self.append(Word(unit)) + } + } + else if Unit.bitWidth > Word.bitWidth { + let wordsPerUnit = Unit.bitWidth / Word.bitWidth + if let count = count { + self.reserveCapacity(count * wordsPerUnit) + } + while let unit = try generator() { + var shift = Unit.bitWidth - Word.bitWidth + while shift >= 0 { + self.append(Word(truncatingIfNeeded: unit >> shift)) + shift -= Word.bitWidth + } + } + } + else { + let unitsPerWord = Word.bitWidth / Unit.bitWidth + if let count = count { + self.reserveCapacity((count + unitsPerWord - 1) / unitsPerWord) + } + var word: Word = 0 + var c = 0 + while let unit = try generator() { + word <<= Unit.bitWidth + word |= Word(unit) + c += Unit.bitWidth + if c == Word.bitWidth { + self.append(word) + word = 0 + c = 0 + } + } + if c > 0 { + self.append(word << c) + var shifted: Word = 0 + for i in self.indices { + let word = self[i] + self[i] = shifted | (word >> c) + shifted = word << (Word.bitWidth - c) + } + } + } + self.reverse() + } +} + +extension CS.BigInt: Codable { + public init(from decoder: Decoder) throws { + var container = try decoder.unkeyedContainer() + + // Decode sign + let sign: CS.BigInt.Sign + switch try container.decode(String.self) { + case "+": + sign = .plus + case "-": + sign = .minus + default: + throw DecodingError.dataCorrupted(.init(codingPath: container.codingPath, + debugDescription: "Invalid big integer sign")) + } + + // Decode magnitude + let words = try [UInt](count: container.count?.advanced(by: -1)) { () -> UInt64? in + guard !container.isAtEnd else { return nil } + return try container.decode(UInt64.self) + } + let magnitude = CS.BigUInt(words: words) + + self.init(sign: sign, magnitude: magnitude) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + try container.encode(sign == .plus ? "+" : "-") + let units = CS.Units(of: UInt64.self, self.magnitude.words) + if units.isEmpty { + try container.encode(0 as UInt64) + } + else { + try container.encode(contentsOf: units) + } + } +} + +extension CS.BigUInt: Codable { + public init(from decoder: Decoder) throws { + let value = try CS.BigInt(from: decoder) + guard value.sign == .plus else { + throw DecodingError.dataCorrupted(.init(codingPath: decoder.codingPath, + debugDescription: "BigUInt cannot hold a negative value")) + } + self = value.magnitude + } + + public func encode(to encoder: Encoder) throws { + try CS.BigInt(sign: .plus, magnitude: self).encode(to: encoder) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Comparable.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Comparable.swift new file mode 100644 index 00000000..86b79ea4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Comparable.swift @@ -0,0 +1,63 @@ +// +// Comparable.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import Foundation + +extension CS.BigUInt: Comparable { + //MARK: Comparison + + /// Compare `a` to `b` and return an `NSComparisonResult` indicating their order. + /// + /// - Complexity: O(count) + public static func compare(_ a: CS.BigUInt, _ b: CS.BigUInt) -> ComparisonResult { + if a.count != b.count { return a.count > b.count ? .orderedDescending : .orderedAscending } + for i in (0 ..< a.count).reversed() { + let ad = a[i] + let bd = b[i] + if ad != bd { return ad > bd ? .orderedDescending : .orderedAscending } + } + return .orderedSame + } + + /// Return true iff `a` is equal to `b`. + /// + /// - Complexity: O(count) + public static func ==(a: CS.BigUInt, b: CS.BigUInt) -> Bool { + return CS.BigUInt.compare(a, b) == .orderedSame + } + + /// Return true iff `a` is less than `b`. + /// + /// - Complexity: O(count) + public static func <(a: CS.BigUInt, b: CS.BigUInt) -> Bool { + return CS.BigUInt.compare(a, b) == .orderedAscending + } +} + +extension CS.BigInt { + /// Return true iff `a` is equal to `b`. + public static func ==(a: CS.BigInt, b: CS.BigInt) -> Bool { + return a.sign == b.sign && a.magnitude == b.magnitude + } + + /// Return true iff `a` is less than `b`. + public static func <(a: CS.BigInt, b: CS.BigInt) -> Bool { + switch (a.sign, b.sign) { + case (.plus, .plus): + return a.magnitude < b.magnitude + case (.plus, .minus): + return false + case (.minus, .plus): + return true + case (.minus, .minus): + return a.magnitude > b.magnitude + } + } +} + + diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Data Conversion.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Data Conversion.swift new file mode 100644 index 00000000..5ae34e32 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Data Conversion.swift @@ -0,0 +1,179 @@ +// +// Data Conversion.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +import Foundation + +extension CS.BigUInt { + //MARK: NSData Conversion + + /// Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer + public init(_ buffer: UnsafeRawBufferPointer) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = buffer.count + guard length > 0 else { return } + let bytesPerDigit = Word.bitWidth / 8 + var index = length / bytesPerDigit + var c = bytesPerDigit - length % bytesPerDigit + if c == bytesPerDigit { + c = 0 + index -= 1 + } + + var word: Word = 0 + for byte in buffer { + word <<= 8 + word += Word(byte) + c += 1 + if c == bytesPerDigit { + self[index] = word + index -= 1 + c = 0 + word = 0 + } + } + assert(c == 0 && word == 0 && index == -1) + } + + + /// Initializes an integer from the bits stored inside a piece of `Data`. + /// The data is assumed to be in network (big-endian) byte order. + public init(_ data: Data) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = data.count + guard length > 0 else { return } + let bytesPerDigit = Word.bitWidth / 8 + var index = length / bytesPerDigit + var c = bytesPerDigit - length % bytesPerDigit + if c == bytesPerDigit { + c = 0 + index -= 1 + } + let word: Word = data.withUnsafeBytes { buffPtr in + var word: Word = 0 + let p = buffPtr.bindMemory(to: UInt8.self) + for byte in p { + word <<= 8 + word += Word(byte) + c += 1 + if c == bytesPerDigit { + self[index] = word + index -= 1 + c = 0 + word = 0 + } + } + return word + } + assert(c == 0 && word == 0 && index == -1) + } + + /// Return a `Data` value that contains the base-256 representation of this integer, in network (big-endian) byte order. + public func serialize() -> Data { + // This assumes Digit is binary. + precondition(Word.bitWidth % 8 == 0) + + let byteCount = (self.bitWidth + 7) / 8 + + guard byteCount > 0 else { return Data() } + + var data = Data(count: byteCount) + data.withUnsafeMutableBytes { buffPtr in + let p = buffPtr.bindMemory(to: UInt8.self) + var i = byteCount - 1 + for var word in self.words { + for _ in 0 ..< Word.bitWidth / 8 { + p[i] = UInt8(word & 0xFF) + word >>= 8 + if i == 0 { + assert(word == 0) + break + } + i -= 1 + } + } + } + return data + } +} + +extension CS.BigInt { + + /// Initialize a BigInt from bytes accessed from an UnsafeRawBufferPointer, + /// where the first byte indicates sign (0 for positive, 1 for negative) + public init(_ buffer: UnsafeRawBufferPointer) { + // This assumes Word is binary. + precondition(Word.bitWidth % 8 == 0) + + self.init() + + let length = buffer.count + + // Serialized data for a BigInt should contain at least 2 bytes: one representing + // the sign, and another for the non-zero magnitude. Zero is represented by an + // empty Data struct, and negative zero is not supported. + guard length > 1, let firstByte = buffer.first else { return } + + // The first byte gives the sign + // This byte is compared to a bitmask to allow additional functionality to be added + // to this byte in the future. + self.sign = firstByte & 0b1 == 0 ? .plus : .minus + + self.magnitude = CS.BigUInt(UnsafeRawBufferPointer(rebasing: buffer.dropFirst(1))) + } + + /// Initializes an integer from the bits stored inside a piece of `Data`. + /// The data is assumed to be in network (big-endian) byte order with a first + /// byte to represent the sign (0 for positive, 1 for negative) + public init(_ data: Data) { + // This assumes Word is binary. + // This is the same assumption made when initializing CS.BigUInt from Data + precondition(Word.bitWidth % 8 == 0) + + self.init() + + // Serialized data for a BigInt should contain at least 2 bytes: one representing + // the sign, and another for the non-zero magnitude. Zero is represented by an + // empty Data struct, and negative zero is not supported. + guard data.count > 1, let firstByte = data.first else { return } + + // The first byte gives the sign + // This byte is compared to a bitmask to allow additional functionality to be added + // to this byte in the future. + self.sign = firstByte & 0b1 == 0 ? .plus : .minus + + // The remaining bytes are read and stored as the magnitude + self.magnitude = CS.BigUInt(data.dropFirst(1)) + } + + /// Return a `Data` value that contains the base-256 representation of this integer, in network (big-endian) byte order and a prepended byte to indicate the sign (0 for positive, 1 for negative) + public func serialize() -> Data { + // Create a data object for the magnitude portion of the BigInt + let magnitudeData = self.magnitude.serialize() + + // Similar to CS.BigUInt, a value of 0 should return an initialized, empty Data struct + guard magnitudeData.count > 0 else { return magnitudeData } + + // Create a new Data struct for the signed BigInt value + var data = Data(capacity: magnitudeData.count + 1) + + // The first byte should be 0 for a positive value, or 1 for a negative value + // i.e., the sign bit is the LSB + data.append(self.sign == .plus ? 0 : 1) + + data.append(magnitudeData) + return data + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Division.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Division.swift new file mode 100644 index 00000000..404e3312 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Division.swift @@ -0,0 +1,375 @@ +// +// Division.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Full-width multiplication and division + +// TODO: Return to `where Magnitude == Self` when SR-13491 is resolved +extension FixedWidthInteger { + private var halfShift: Self { + return Self(Self.bitWidth / 2) + + } + private var high: Self { + return self &>> halfShift + } + + private var low: Self { + let mask: Self = 1 &<< halfShift - 1 + return self & mask + } + + private var upshifted: Self { + return self &<< halfShift + } + + private var split: (high: Self, low: Self) { + return (self.high, self.low) + } + + private init(_ value: (high: Self, low: Self)) { + self = value.high.upshifted + value.low + } + + /// Divide the double-width integer `dividend` by `self` and return the quotient and remainder. + /// + /// - Requires: `dividend.high < self`, so that the result will fit in a single digit. + /// - Complexity: O(1) with 2 divisions, 6 multiplications and ~12 or so additions/subtractions. + internal func fastDividingFullWidth(_ dividend: (high: Self, low: Self.Magnitude)) -> (quotient: Self, remainder: Self) { + // Division is complicated; doing it with single-digit operations is maddeningly complicated. + // This is a Swift adaptation for "divlu2" in Hacker's Delight, + // which is in turn a C adaptation of Knuth's Algorithm D (TAOCP vol 2, 4.3.1). + precondition(dividend.high < self) + + // This replaces the implementation in stdlib, which is much slower. + // FIXME: Speed up stdlib. It should use full-width idiv on Intel processors, and + // fall back to a reasonably fast algorithm elsewhere. + + // The trick here is that we're actually implementing a 4/2 long division using half-words, + // with the long division loop unrolled into two 3/2 half-word divisions. + // Luckily, 3/2 half-word division can be approximated by a single full-word division operation + // that, when the divisor is normalized, differs from the correct result by at most 2. + + /// Find the half-word quotient in `u / vn`, which must be normalized. + /// `u` contains three half-words in the two halves of `u.high` and the lower half of + /// `u.low`. (The weird distribution makes for a slightly better fit with the input.) + /// `vn` contains the normalized divisor, consisting of two half-words. + /// + /// - Requires: u.high < vn && u.low.high == 0 && vn.leadingZeroBitCount == 0 + func quotient(dividing u: (high: Self, low: Self), by vn: Self) -> Self { + let (vn1, vn0) = vn.split + // Get approximate quotient. + let (q, r) = u.high.quotientAndRemainder(dividingBy: vn1) + let p = q * vn0 + // q is often already correct, but sometimes the approximation overshoots by at most 2. + // The code that follows checks for this while being careful to only perform single-digit operations. + if q.high == 0 && p <= r.upshifted + u.low { return q } + let r2 = r + vn1 + if r2.high != 0 { return q - 1 } + if (q - 1).high == 0 && p - vn0 <= r2.upshifted + u.low { return q - 1 } + //assert((r + 2 * vn1).high != 0 || p - 2 * vn0 <= (r + 2 * vn1).upshifted + u.low) + return q - 2 + } + /// Divide 3 half-digits by 2 half-digits to get a half-digit quotient and a full-digit remainder. + /// + /// - Requires: u.high < v && u.low.high == 0 && vn.width = width(Digit) + func quotientAndRemainder(dividing u: (high: Self, low: Self), by v: Self) -> (quotient: Self, remainder: Self) { + let q = quotient(dividing: u, by: v) + // Note that `uh.low` masks off a couple of bits, and `q * v` and the + // subtraction are likely to overflow. Despite this, the end result (remainder) will + // still be correct and it will fit inside a single (full) Digit. + let r = Self(u) &- q &* v + assert(r < v) + return (q, r) + } + + // Normalize the dividend and the divisor (self) such that the divisor has no leading zeroes. + let z = Self(self.leadingZeroBitCount) + let w = Self(Self.bitWidth) - z + let vn = self << z + + let un32 = (z == 0 ? dividend.high : (dividend.high &<< z) | ((dividend.low as! Self) &>> w)) // No bits are lost + let un10 = dividend.low &<< z + let (un1, un0) = un10.split + + // Divide `(un32,un10)` by `vn`, splitting the full 4/2 division into two 3/2 ones. + let (q1, un21) = quotientAndRemainder(dividing: (un32, (un1 as! Self)), by: vn) + let (q0, rn) = quotientAndRemainder(dividing: (un21, (un0 as! Self)), by: vn) + + // Undo normalization of the remainder and combine the two halves of the quotient. + let mod = rn >> z + let div = Self((q1, q0)) + return (div, mod) + } + + /// Return the quotient of the 3/2-word division `x/y` as a single word. + /// + /// - Requires: (x.0, x.1) <= y && y.0.high != 0 + /// - Returns: The exact value when it fits in a single word, otherwise `Self`. + static func approximateQuotient(dividing x: (Self, Self, Self), by y: (Self, Self)) -> Self { + // Start with q = (x.0, x.1) / y.0, (or Word.max on overflow) + var q: Self + var r: Self + if x.0 == y.0 { + q = Self.max + let (s, o) = x.0.addingReportingOverflow(x.1) + if o { return q } + r = s + } + else { + (q, r) = y.0.fastDividingFullWidth((x.0, (x.1 as! Magnitude))) + } + // Now refine q by considering x.2 and y.1. + // Note that since y is normalized, q * y - x is between 0 and 2. + let (ph, pl) = q.multipliedFullWidth(by: y.1) + if ph < r || (ph == r && pl <= x.2) { return q } + + let (r1, ro) = r.addingReportingOverflow(y.0) + if ro { return q - 1 } + + let (pl1, so) = pl.subtractingReportingOverflow((y.1 as! Magnitude)) + let ph1 = (so ? ph - 1 : ph) + + if ph1 < r1 || (ph1 == r1 && pl1 <= x.2) { return q - 1 } + return q - 2 + } +} + +extension CS.BigUInt { + //MARK: Division + + /// Divide this integer by the word `y`, leaving the quotient in its place and returning the remainder. + /// + /// - Requires: y > 0 + /// - Complexity: O(count) + internal mutating func divide(byWord y: Word) -> Word { + precondition(y > 0) + if y == 1 { return 0 } + + var remainder: Word = 0 + for i in (0 ..< count).reversed() { + let u = self[i] + (self[i], remainder) = y.fastDividingFullWidth((remainder, u)) + } + return remainder + } + + /// Divide this integer by the word `y` and return the resulting quotient and remainder. + /// + /// - Requires: y > 0 + /// - Returns: (quotient, remainder) where quotient = floor(x/y), remainder = x - quotient * y + /// - Complexity: O(x.count) + internal func quotientAndRemainder(dividingByWord y: Word) -> (quotient: CS.BigUInt, remainder: Word) { + var div = self + let mod = div.divide(byWord: y) + return (div, mod) + } + + /// Divide `x` by `y`, putting the quotient in `x` and the remainder in `y`. + /// Reusing integers like this reduces the number of allocations during the calculation. + static func divide(_ x: inout CS.BigUInt, by y: inout CS.BigUInt) { + // This is a Swift adaptation of "divmnu" from Hacker's Delight, which is in + // turn a C adaptation of Knuth's Algorithm D (TAOCP vol 2, 4.3.1). + + precondition(!y.isZero) + + // First, let's take care of the easy cases. + if x < y { + (x, y) = (0, x) + return + } + if y.count == 1 { + // The single-word case reduces to a simpler loop. + y = CS.BigUInt(x.divide(byWord: y[0])) + return + } + + // In the hard cases, we will perform the long division algorithm we learned in school. + // It works by successively calculating the single-word quotient of the top y.count + 1 + // words of x divided by y, replacing the top of x with the remainder, and repeating + // the process one word lower. + // + // The tricky part is that the algorithm needs to be able to do n+1/n word divisions, + // but we only have a primitive for dividing two words by a single + // word. (Remember that this step is also tricky when we do it on paper!) + // + // The solution is that the long division can be approximated by a single full division + // using just the most significant words. We can then use multiplications and + // subtractions to refine the approximation until we get the correct quotient word. + // + // We could do this by doing a simple 2/1 full division, but Knuth goes one step further, + // and implements a 3/2 division. This results in an exact approximation in the + // vast majority of cases, eliminating an extra subtraction over big integers. + // + // The function `approximateQuotient` above implements Knuth's 3/2 division algorithm. + // It requires that the divisor's most significant word is larger than + // Word.max / 2. This ensures that the approximation has tiny error bounds, + // which is what makes this entire approach viable. + // To satisfy this requirement, we will normalize the division by multiplying + // both the divisor and the dividend by the same (small) factor. + let z = y.leadingZeroBitCount + y <<= z + x <<= z // We'll calculate the remainder in the normalized dividend. + var quotient = CS.BigUInt() + assert(y.leadingZeroBitCount == 0) + + // We're ready to start the long division! + let dc = y.count + let d1 = y[dc - 1] + let d0 = y[dc - 2] + var product: CS.BigUInt = 0 + for j in (dc ... x.count).reversed() { + // Approximate dividing the top dc+1 words of `remainder` using the topmost 3/2 words. + let r2 = x[j] + let r1 = x[j - 1] + let r0 = x[j - 2] + let q = Word.approximateQuotient(dividing: (r2, r1, r0), by: (d1, d0)) + + // Multiply the entire divisor with `q` and subtract the result from remainder. + // Normalization ensures the 3/2 quotient will either be exact for the full division, or + // it may overshoot by at most 1, in which case the product will be greater + // than the remainder. + product.load(y) + product.multiply(byWord: q) + if product <= x.extract(j - dc ..< j + 1) { + x.subtract(product, shiftedBy: j - dc) + quotient[j - dc] = q + } + else { + // This case is extremely rare -- it has a probability of 1/2^(Word.bitWidth - 1). + x.add(y, shiftedBy: j - dc) + x.subtract(product, shiftedBy: j - dc) + quotient[j - dc] = q - 1 + } + } + // The remainder's normalization needs to be undone, but otherwise we're done. + x >>= z + y = x + x = quotient + } + + /// Divide `x` by `y`, putting the remainder in `x`. + mutating func formRemainder(dividingBy y: CS.BigUInt, normalizedBy shift: Int) { + precondition(!y.isZero) + assert(y.leadingZeroBitCount == 0) + if y.count == 1 { + let remainder = self.divide(byWord: y[0] >> shift) + self.load(CS.BigUInt(remainder)) + return + } + self <<= shift + if self >= y { + let dc = y.count + let d1 = y[dc - 1] + let d0 = y[dc - 2] + var product: CS.BigUInt = 0 + for j in (dc ... self.count).reversed() { + let r2 = self[j] + let r1 = self[j - 1] + let r0 = self[j - 2] + let q = Word.approximateQuotient(dividing: (r2, r1, r0), by: (d1, d0)) + product.load(y) + product.multiply(byWord: q) + if product <= self.extract(j - dc ..< j + 1) { + self.subtract(product, shiftedBy: j - dc) + } + else { + self.add(y, shiftedBy: j - dc) + self.subtract(product, shiftedBy: j - dc) + } + } + } + self >>= shift + } + + + /// Divide this integer by `y` and return the resulting quotient and remainder. + /// + /// - Requires: `y > 0` + /// - Returns: `(quotient, remainder)` where `quotient = floor(self/y)`, `remainder = self - quotient * y` + /// - Complexity: O(count^2) + public func quotientAndRemainder(dividingBy y: CS.BigUInt) -> (quotient: CS.BigUInt, remainder: CS.BigUInt) { + var x = self + var y = y + CS.BigUInt.divide(&x, by: &y) + return (x, y) + } + + /// Divide `x` by `y` and return the quotient. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func /(x: CS.BigUInt, y: CS.BigUInt) -> CS.BigUInt { + return x.quotientAndRemainder(dividingBy: y).quotient + } + + /// Divide `x` by `y` and return the remainder. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func %(x: CS.BigUInt, y: CS.BigUInt) -> CS.BigUInt { + var x = x + let shift = y.leadingZeroBitCount + x.formRemainder(dividingBy: y << shift, normalizedBy: shift) + return x + } + + /// Divide `x` by `y` and store the quotient in `x`. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func /=(x: inout CS.BigUInt, y: CS.BigUInt) { + var y = y + CS.BigUInt.divide(&x, by: &y) + } + + /// Divide `x` by `y` and store the remainder in `x`. + /// + /// - Note: Use `divided(by:)` if you also need the remainder. + public static func %=(x: inout CS.BigUInt, y: CS.BigUInt) { + let shift = y.leadingZeroBitCount + x.formRemainder(dividingBy: y << shift, normalizedBy: shift) + } +} + +extension CS.BigInt { + /// Divide this integer by `y` and return the resulting quotient and remainder. + /// + /// - Requires: `y > 0` + /// - Returns: `(quotient, remainder)` where `quotient = floor(self/y)`, `remainder = self - quotient * y` + /// - Complexity: O(count^2) + public func quotientAndRemainder(dividingBy y: CS.BigInt) -> (quotient: CS.BigInt, remainder: CS.BigInt) { + var a = self.magnitude + var b = y.magnitude + CS.BigUInt.divide(&a, by: &b) + return ( CS.BigInt(sign: self.sign == y.sign ? .plus : .minus, magnitude: a), + CS.BigInt(sign: self.sign, magnitude: b)) + } + + /// Divide `a` by `b` and return the quotient. Traps if `b` is zero. + public static func /(a: CS.BigInt, b: CS.BigInt) -> CS.BigInt { + return CS.BigInt(sign: a.sign == b.sign ? .plus : .minus, magnitude: a.magnitude / b.magnitude) + } + + /// Divide `a` by `b` and return the remainder. The result has the same sign as `a`. + public static func %(a: CS.BigInt, b: CS.BigInt) -> CS.BigInt { + return CS.BigInt(sign: a.sign, magnitude: a.magnitude % b.magnitude) + } + + /// Return the result of `a` mod `b`. The result is always a nonnegative integer that is less than the absolute value of `b`. + public func modulus(_ mod: CS.BigInt) -> CS.BigInt { + let remainder = self.magnitude % mod.magnitude + return CS.BigInt( + self.sign == .minus && !remainder.isZero + ? mod.magnitude - remainder + : remainder) + } +} + +extension CS.BigInt { + /// Divide `a` by `b` storing the quotient in `a`. + public static func /=(a: inout CS.BigInt, b: CS.BigInt) { a = a / b } + /// Divide `a` by `b` storing the remainder in `a`. + public static func %=(a: inout CS.BigInt, b: CS.BigInt) { a = a % b } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Exponentiation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Exponentiation.swift new file mode 100644 index 00000000..14aa714c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Exponentiation.swift @@ -0,0 +1,119 @@ +// +// Exponentiation.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + //MARK: Exponentiation + + /// Returns this integer raised to the power `exponent`. + /// + /// This function calculates the result by [successively squaring the base while halving the exponent][expsqr]. + /// + /// [expsqr]: https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// - Note: This function can be unreasonably expensive for large exponents, which is why `exponent` is + /// a simple integer value. If you want to calculate big exponents, you'll probably need to use + /// the modulo arithmetic variant. + /// - Returns: 1 if `exponent == 0`, otherwise `self` raised to `exponent`. (This implies that `0.power(0) == 1`.) + /// - SeeAlso: `BigUInt.power(_:, modulus:)` + /// - Complexity: O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + public func power(_ exponent: Int) -> CS.BigUInt { + if exponent == 0 { return 1 } + if exponent == 1 { return self } + if exponent < 0 { + precondition(!self.isZero) + return self == 1 ? 1 : 0 + } + if self <= 1 { return self } + var result = CS.BigUInt(1) + var b = self + var e = exponent + while e > 0 { + if e & 1 == 1 { + result *= b + } + e >>= 1 + b *= b + } + return result + } + + /// Returns the remainder of this integer raised to the power `exponent` in modulo arithmetic under `modulus`. + /// + /// Uses the [right-to-left binary method][rtlb]. + /// + /// [rtlb]: https://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method + /// + /// - Complexity: O(exponent.count * modulus.count^log2(3)) or somesuch + public func power(_ exponent: CS.BigUInt, modulus: CS.BigUInt) -> CS.BigUInt { + precondition(!modulus.isZero) + if modulus == (1 as CS.BigUInt) { return 0 } + let shift = modulus.leadingZeroBitCount + let normalizedModulus = modulus << shift + var result = CS.BigUInt(1) + var b = self + b.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + for var e in exponent.words { + for _ in 0 ..< Word.bitWidth { + if e & 1 == 1 { + result *= b + result.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + } + e >>= 1 + b *= b + b.formRemainder(dividingBy: normalizedModulus, normalizedBy: shift) + } + } + return result + } +} + +extension CS.BigInt { + /// Returns this integer raised to the power `exponent`. + /// + /// This function calculates the result by [successively squaring the base while halving the exponent][expsqr]. + /// + /// [expsqr]: https://en.wikipedia.org/wiki/Exponentiation_by_squaring + /// + /// - Note: This function can be unreasonably expensive for large exponents, which is why `exponent` is + /// a simple integer value. If you want to calculate big exponents, you'll probably need to use + /// the modulo arithmetic variant. + /// - Returns: 1 if `exponent == 0`, otherwise `self` raised to `exponent`. (This implies that `0.power(0) == 1`.) + /// - SeeAlso: `BigUInt.power(_:, modulus:)` + /// - Complexity: O((exponent * self.count)^log2(3)) or somesuch. The result may require a large amount of memory, too. + public func power(_ exponent: Int) -> CS.BigInt { + return CS.BigInt(sign: self.sign == .minus && exponent & 1 != 0 ? .minus : .plus, + magnitude: self.magnitude.power(exponent)) + } + + /// Returns the remainder of this integer raised to the power `exponent` in modulo arithmetic under `modulus`. + /// + /// Uses the [right-to-left binary method][rtlb]. + /// + /// [rtlb]: https://en.wikipedia.org/wiki/Modular_exponentiation#Right-to-left_binary_method + /// + /// - Complexity: O(exponent.count * modulus.count^log2(3)) or somesuch + public func power(_ exponent: CS.BigInt, modulus: CS.BigInt) -> CS.BigInt { + precondition(!modulus.isZero) + if modulus.magnitude == 1 { return 0 } + if exponent.isZero { return 1 } + if exponent == 1 { return self.modulus(modulus) } + if exponent < 0 { + precondition(!self.isZero) + guard magnitude == 1 else { return 0 } + guard sign == .minus else { return 1 } + guard exponent.magnitude[0] & 1 != 0 else { return 1 } + return CS.BigInt(modulus.magnitude - 1) + } + let power = self.magnitude.power(exponent.magnitude, + modulus: modulus.magnitude) + if self.sign == .plus || exponent.magnitude[0] & 1 == 0 || power.isZero { + return CS.BigInt(power) + } + return CS.BigInt(modulus.magnitude - power) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Floating Point Conversion.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Floating Point Conversion.swift new file mode 100644 index 00000000..524f9ef4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Floating Point Conversion.swift @@ -0,0 +1,73 @@ +// +// Floating Point Conversion.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + public init?(exactly source: T) { + guard source.isFinite else { return nil } + guard !source.isZero else { self = 0; return } + guard source.sign == .plus else { return nil } + let value = source.rounded(.towardZero) + guard value == source else { return nil } + assert(value.floatingPointClass == .positiveNormal) + assert(value.exponent >= 0) + let significand = value.significandBitPattern + self = (CS.BigUInt(1) << value.exponent) + CS.BigUInt(significand) >> (T.significandBitCount - Int(value.exponent)) + } + + public init(_ source: T) { + self.init(exactly: source.rounded(.towardZero))! + } +} + +extension CS.BigInt { + public init?(exactly source: T) { + switch source.sign{ + case .plus: + guard let magnitude = CS.BigUInt(exactly: source) else { return nil } + self = CS.BigInt(sign: .plus, magnitude: magnitude) + case .minus: + guard let magnitude = CS.BigUInt(exactly: -source) else { return nil } + self = CS.BigInt(sign: .minus, magnitude: magnitude) + } + } + + public init(_ source: T) { + self.init(exactly: source.rounded(.towardZero))! + } +} + +extension BinaryFloatingPoint where RawExponent: FixedWidthInteger, RawSignificand: FixedWidthInteger { + public init(_ value: CS.BigInt) { + guard !value.isZero else { self = 0; return } + let v = value.magnitude + let bitWidth = v.bitWidth + var exponent = bitWidth - 1 + let shift = bitWidth - Self.significandBitCount - 1 + var significand = value.magnitude >> (shift - 1) + if significand[0] & 3 == 3 { // Handle rounding + significand >>= 1 + significand += 1 + if significand.trailingZeroBitCount >= Self.significandBitCount { + exponent += 1 + } + } + else { + significand >>= 1 + } + let bias = 1 << (Self.exponentBitCount - 1) - 1 + guard exponent <= bias else { self = Self.infinity; return } + significand &= 1 << Self.significandBitCount - 1 + self = Self.init(sign: value.sign == .plus ? .plus : .minus, + exponentBitPattern: RawExponent(bias + exponent), + significandBitPattern: RawSignificand(significand)) + } + + public init(_ value: CS.BigUInt) { + self.init(CS.BigInt(sign: .plus, magnitude: value)) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/GCD.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/GCD.swift new file mode 100644 index 00000000..50f56f79 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/GCD.swift @@ -0,0 +1,80 @@ +// +// GCD.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + //MARK: Greatest Common Divisor + + /// Returns the greatest common divisor of `self` and `b`. + /// + /// - Complexity: O(count^2) where count = max(self.count, b.count) + public func greatestCommonDivisor(with b: CS.BigUInt) -> CS.BigUInt { + // This is Stein's algorithm: https://en.wikipedia.org/wiki/Binary_GCD_algorithm + if self.isZero { return b } + if b.isZero { return self } + + let az = self.trailingZeroBitCount + let bz = b.trailingZeroBitCount + let twos = Swift.min(az, bz) + + var (x, y) = (self >> az, b >> bz) + if x < y { swap(&x, &y) } + + while !x.isZero { + x >>= x.trailingZeroBitCount + if x < y { swap(&x, &y) } + x -= y + } + return y << twos + } + + /// Returns the [multiplicative inverse of this integer in modulo `modulus` arithmetic][inverse], + /// or `nil` if there is no such number. + /// + /// [inverse]: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers + /// + /// - Returns: If `gcd(self, modulus) == 1`, the value returned is an integer `a < modulus` such that `(a * self) % modulus == 1`. If `self` and `modulus` aren't coprime, the return value is `nil`. + /// - Requires: modulus > 1 + /// - Complexity: O(count^3) + public func inverse(_ modulus: CS.BigUInt) -> CS.BigUInt? { + precondition(modulus > 1) + var t1 = CS.BigInt(0) + var t2 = CS.BigInt(1) + var r1 = modulus + var r2 = self + while !r2.isZero { + let quotient = r1 / r2 + (t1, t2) = (t2, t1 - CS.BigInt(quotient) * t2) + (r1, r2) = (r2, r1 - quotient * r2) + } + if r1 > 1 { return nil } + if t1.sign == .minus { return modulus - t1.magnitude } + return t1.magnitude + } +} + +extension CS.BigInt { + /// Returns the greatest common divisor of `a` and `b`. + /// + /// - Complexity: O(count^2) where count = max(a.count, b.count) + public func greatestCommonDivisor(with b: CS.BigInt) -> CS.BigInt { + return CS.BigInt(self.magnitude.greatestCommonDivisor(with: b.magnitude)) + } + + /// Returns the [multiplicative inverse of this integer in modulo `modulus` arithmetic][inverse], + /// or `nil` if there is no such number. + /// + /// [inverse]: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm#Modular_integers + /// + /// - Returns: If `gcd(self, modulus) == 1`, the value returned is an integer `a < modulus` such that `(a * self) % modulus == 1`. If `self` and `modulus` aren't coprime, the return value is `nil`. + /// - Requires: modulus.magnitude > 1 + /// - Complexity: O(count^3) + public func inverse(_ modulus: CS.BigInt) -> CS.BigInt? { + guard let inv = self.magnitude.inverse(modulus.magnitude) else { return nil } + return CS.BigInt(self.sign == .plus || inv.isZero ? inv : modulus.magnitude - inv) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Hashable.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Hashable.swift new file mode 100644 index 00000000..5ae01bfe --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Hashable.swift @@ -0,0 +1,26 @@ +// +// Hashable.swift +// BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt: Hashable { + //MARK: Hashing + + /// Append this `BigUInt` to the specified hasher. + public func hash(into hasher: inout Hasher) { + for word in self.words { + hasher.combine(word) + } + } +} + +extension CS.BigInt: Hashable { + /// Append this `BigInt` to the specified hasher. + public func hash(into hasher: inout Hasher) { + hasher.combine(sign) + hasher.combine(magnitude) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Integer Conversion.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Integer Conversion.swift new file mode 100644 index 00000000..ab77f266 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Integer Conversion.swift @@ -0,0 +1,89 @@ +// +// Integer Conversion.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + public init?(exactly source: T) { + guard source >= (0 as T) else { return nil } + if source.bitWidth <= 2 * Word.bitWidth { + var it = source.words.makeIterator() + self.init(low: it.next() ?? 0, high: it.next() ?? 0) + precondition(it.next() == nil, "Length of BinaryInteger.words is greater than its bitWidth") + } + else { + self.init(words: source.words) + } + } + + public init(_ source: T) { + precondition(source >= (0 as T), "BigUInt cannot represent negative values") + self.init(exactly: source)! + } + + public init(truncatingIfNeeded source: T) { + self.init(words: source.words) + } + + public init(clamping source: T) { + if source <= (0 as T) { + self.init() + } + else { + self.init(words: source.words) + } + } +} + +extension CS.BigInt { + public init() { + self.init(sign: .plus, magnitude: 0) + } + + /// Initializes a new signed big integer with the same value as the specified unsigned big integer. + public init(_ integer: CS.BigUInt) { + self.magnitude = integer + self.sign = .plus + } + + public init(_ source: T) where T : BinaryInteger { + if source >= (0 as T) { + self.init(sign: .plus, magnitude: CS.BigUInt(source)) + } + else { + var words = Array(source.words) + words.twosComplement() + self.init(sign: .minus, magnitude: CS.BigUInt(words: words)) + } + } + + public init?(exactly source: T) where T : BinaryInteger { + self.init(source) + } + + public init(clamping source: T) where T : BinaryInteger { + self.init(source) + } + + public init(truncatingIfNeeded source: T) where T : BinaryInteger { + self.init(source) + } +} + +extension CS.BigUInt: ExpressibleByIntegerLiteral { + /// Initialize a new big integer from an integer literal. + public init(integerLiteral value: UInt64) { + self.init(value) + } +} + +extension CS.BigInt: ExpressibleByIntegerLiteral { + /// Initialize a new big integer from an integer literal. + public init(integerLiteral value: Int64) { + self.init(value) + } +} + diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Multiplication.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Multiplication.swift new file mode 100644 index 00000000..bb8bf7d5 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Multiplication.swift @@ -0,0 +1,165 @@ +// +// Multiplication.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + + //MARK: Multiplication + + /// Multiply this big integer by a single word, and store the result in place of the original big integer. + /// + /// - Complexity: O(count) + public mutating func multiply(byWord y: Word) { + guard y != 0 else { self = 0; return } + guard y != 1 else { return } + var carry: Word = 0 + let c = self.count + for i in 0 ..< c { + let (h, l) = self[i].multipliedFullWidth(by: y) + let (low, o) = l.addingReportingOverflow(carry) + self[i] = low + carry = (o ? h + 1 : h) + } + self[c] = carry + } + + /// Multiply this big integer by a single Word, and return the result. + /// + /// - Complexity: O(count) + public func multiplied(byWord y: Word) -> CS.BigUInt { + var r = self + r.multiply(byWord: y) + return r + } + + /// Multiply `x` by `y`, and add the result to this integer, optionally shifted `shift` words to the left. + /// + /// - Note: This is the fused multiply/shift/add operation; it is more efficient than doing the components + /// individually. (The fused operation doesn't need to allocate space for temporary big integers.) + /// - Returns: `self` is set to `self + (x * y) << (shift * 2^Word.bitWidth)` + /// - Complexity: O(count) + public mutating func multiplyAndAdd(_ x: CS.BigUInt, _ y: Word, shiftedBy shift: Int = 0) { + precondition(shift >= 0) + guard y != 0 && x.count > 0 else { return } + guard y != 1 else { self.add(x, shiftedBy: shift); return } + var mulCarry: Word = 0 + var addCarry = false + let xc = x.count + var xi = 0 + while xi < xc || addCarry || mulCarry > 0 { + let (h, l) = x[xi].multipliedFullWidth(by: y) + let (low, o) = l.addingReportingOverflow(mulCarry) + mulCarry = (o ? h + 1 : h) + + let ai = shift + xi + let (sum1, so1) = self[ai].addingReportingOverflow(low) + if addCarry { + let (sum2, so2) = sum1.addingReportingOverflow(1) + self[ai] = sum2 + addCarry = so1 || so2 + } + else { + self[ai] = sum1 + addCarry = so1 + } + xi += 1 + } + } + + /// Multiply this integer by `y` and return the result. + /// + /// - Note: This uses the naive O(n^2) multiplication algorithm unless both arguments have more than + /// `BigUInt.directMultiplicationLimit` words. + /// - Complexity: O(n^log2(3)) + public func multiplied(by y: CS.BigUInt) -> CS.BigUInt { + // This method is mostly defined for symmetry with the rest of the arithmetic operations. + return self * y + } + + /// Multiplication switches to an asymptotically better recursive algorithm when arguments have more words than this limit. + public static var directMultiplicationLimit: Int = 1024 + + /// Multiply `a` by `b` and return the result. + /// + /// - Note: This uses the naive O(n^2) multiplication algorithm unless both arguments have more than + /// `BigUInt.directMultiplicationLimit` words. + /// - Complexity: O(n^log2(3)) + public static func *(x: CS.BigUInt, y: CS.BigUInt) -> CS.BigUInt { + let xc = x.count + let yc = y.count + if xc == 0 { return CS.BigUInt() } + if yc == 0 { return CS.BigUInt() } + if yc == 1 { return x.multiplied(byWord: y[0]) } + if xc == 1 { return y.multiplied(byWord: x[0]) } + + if Swift.min(xc, yc) <= CS.BigUInt.directMultiplicationLimit { + // Long multiplication. + let left = (xc < yc ? y : x) + let right = (xc < yc ? x : y) + var result = CS.BigUInt() + for i in (0 ..< right.count).reversed() { + result.multiplyAndAdd(left, right[i], shiftedBy: i) + } + return result + } + + if yc < xc { + let (xh, xl) = x.split + var r = xl * y + r.add(xh * y, shiftedBy: x.middleIndex) + return r + } + else if xc < yc { + let (yh, yl) = y.split + var r = yl * x + r.add(yh * x, shiftedBy: y.middleIndex) + return r + } + + let shift = x.middleIndex + + // Karatsuba multiplication: + // x * y = * = (ignoring carry) + let (a, b) = x.split + let (c, d) = y.split + + let high = a * c + let low = b * d + let xp = a >= b + let yp = c >= d + let xm = (xp ? a - b : b - a) + let ym = (yp ? c - d : d - c) + let m = xm * ym + + var r = low + r.add(high, shiftedBy: 2 * shift) + r.add(low, shiftedBy: shift) + r.add(high, shiftedBy: shift) + if xp == yp { + r.subtract(m, shiftedBy: shift) + } + else { + r.add(m, shiftedBy: shift) + } + return r + } + + /// Multiply `a` by `b` and store the result in `a`. + public static func *=(a: inout CS.BigUInt, b: CS.BigUInt) { + a = a * b + } +} + +extension CS.BigInt { + /// Multiply `a` with `b` and return the result. + public static func *(a: CS.BigInt, b: CS.BigInt) -> CS.BigInt { + return CS.BigInt(sign: a.sign == b.sign ? .plus : .minus, magnitude: a.magnitude * b.magnitude) + } + + /// Multiply `a` with `b` in place. + public static func *=(a: inout CS.BigInt, b: CS.BigInt) { a = a * b } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Prime Test.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Prime Test.swift new file mode 100644 index 00000000..e9fdffa4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Prime Test.swift @@ -0,0 +1,153 @@ +// +// Prime Test.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +/// The first several [prime numbers][primes]. +/// +/// [primes]: https://oeis.org/A000040 +let primes: [CS.BigUInt.Word] = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41] + +/// The ith element in this sequence is the smallest composite number that passes the strong probable prime test +/// for all of the first (i+1) primes. +/// +/// This is sequence [A014233](http://oeis.org/A014233) on the [Online Encyclopaedia of Integer Sequences](http://oeis.org). +let pseudoPrimes: [CS.BigUInt] = [ + /* 2 */ 2_047, + /* 3 */ 1_373_653, + /* 5 */ 25_326_001, + /* 7 */ 3_215_031_751, + /* 11 */ 2_152_302_898_747, + /* 13 */ 3_474_749_660_383, + /* 17 */ 341_550_071_728_321, + /* 19 */ 341_550_071_728_321, + /* 23 */ 3_825_123_056_546_413_051, + /* 29 */ 3_825_123_056_546_413_051, + /* 31 */ 3_825_123_056_546_413_051, + /* 37 */ "318665857834031151167461", + /* 41 */ "3317044064679887385961981", +] + +extension CS.BigUInt { + //MARK: Primality Testing + + /// Returns true iff this integer passes the [strong probable prime test][sppt] for the specified base. + /// + /// [sppt]: https://en.wikipedia.org/wiki/Probable_prime + public func isStrongProbablePrime(_ base: CS.BigUInt) -> Bool { + precondition(base > (1 as CS.BigUInt)) + precondition(self > (0 as CS.BigUInt)) + let dec = self - 1 + + let r = dec.trailingZeroBitCount + let d = dec >> r + + var test = base.power(d, modulus: self) + if test == 1 || test == dec { return true } + + if r > 0 { + let shift = self.leadingZeroBitCount + let normalized = self << shift + for _ in 1 ..< r { + test *= test + test.formRemainder(dividingBy: normalized, normalizedBy: shift) + if test == 1 { + return false + } + if test == dec { return true } + } + } + return false + } + + /// Returns true if this integer is probably prime. Returns false if this integer is definitely not prime. + /// + /// This function performs a probabilistic [Miller-Rabin Primality Test][mrpt], consisting of `rounds` iterations, + /// each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, + /// but you may specify your own choice. + /// + /// To speed things up, the function checks if `self` is divisible by the first few prime numbers before + /// diving into (slower) Miller-Rabin testing. + /// + /// Also, when `self` is less than 82 bits wide, `isPrime` does a deterministic test that is guaranteed to + /// return a correct result. + /// + /// [mrpt]: https://en.wikipedia.org/wiki/Miller–Rabin_primality_test + public func isPrime(rounds: Int = 10) -> Bool { + if count <= 1 && self[0] < 2 { return false } + if count == 1 && self[0] < 4 { return true } + + // Even numbers above 2 aren't prime. + if self[0] & 1 == 0 { return false } + + // Quickly check for small primes. + for i in 1 ..< primes.count { + let p = primes[i] + if self.count == 1 && self[0] == p { + return true + } + if self.quotientAndRemainder(dividingByWord: p).remainder == 0 { + return false + } + } + + /// Give an exact answer when we can. + if self < pseudoPrimes.last! { + for i in 0 ..< pseudoPrimes.count { + guard isStrongProbablePrime(CS.BigUInt(primes[i])) else { + break + } + if self < pseudoPrimes[i] { + // `self` is below the lowest pseudoprime corresponding to the prime bases we tested. It's a prime! + return true + } + } + return false + } + + /// Otherwise do as many rounds of random SPPT as required. + for _ in 0 ..< rounds { + let random = CS.BigUInt.randomInteger(lessThan: self - 2) + 2 + guard isStrongProbablePrime(random) else { + return false + } + } + + // Well, it smells primey to me. + return true + } +} + +extension CS.BigInt { + //MARK: Primality Testing + + /// Returns true iff this integer passes the [strong probable prime test][sppt] for the specified base. + /// + /// [sppt]: https://en.wikipedia.org/wiki/Probable_prime + public func isStrongProbablePrime(_ base: CS.BigInt) -> Bool { + precondition(base.sign == .plus) + if self.sign == .minus { return false } + return self.magnitude.isStrongProbablePrime(base.magnitude) + } + + /// Returns true if this integer is probably prime. Returns false if this integer is definitely not prime. + /// + /// This function performs a probabilistic [Miller-Rabin Primality Test][mrpt], consisting of `rounds` iterations, + /// each calculating the strong probable prime test for a random base. The number of rounds is 10 by default, + /// but you may specify your own choice. + /// + /// To speed things up, the function checks if `self` is divisible by the first few prime numbers before + /// diving into (slower) Miller-Rabin testing. + /// + /// Also, when `self` is less than 82 bits wide, `isPrime` does a deterministic test that is guaranteed to + /// return a correct result. + /// + /// [mrpt]: https://en.wikipedia.org/wiki/Miller–Rabin_primality_test + public func isPrime(rounds: Int = 10) -> Bool { + if self.sign == .minus { return false } + return self.magnitude.isPrime(rounds: rounds) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Random.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Random.swift new file mode 100644 index 00000000..33e5802f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Random.swift @@ -0,0 +1,101 @@ +// +// Random.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-04. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + /// Create a big unsigned integer consisting of `width` uniformly distributed random bits. + /// + /// - Parameter width: The maximum number of one bits in the result. + /// - Parameter generator: The source of randomness. + /// - Returns: A big unsigned integer less than `1 << width`. + public static func randomInteger(withMaximumWidth width: Int, using generator: inout RNG) -> CS.BigUInt { + var result = CS.BigUInt.zero + var bitsLeft = width + var i = 0 + let wordsNeeded = (width + Word.bitWidth - 1) / Word.bitWidth + if wordsNeeded > 2 { + result.reserveCapacity(wordsNeeded) + } + while bitsLeft >= Word.bitWidth { + result[i] = generator.next() + i += 1 + bitsLeft -= Word.bitWidth + } + if bitsLeft > 0 { + let mask: Word = (1 << bitsLeft) - 1 + result[i] = (generator.next() as Word) & mask + } + return result + } + + /// Create a big unsigned integer consisting of `width` uniformly distributed random bits. + /// + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Parameter width: The maximum number of one bits in the result. + /// - Returns: A big unsigned integer less than `1 << width`. + public static func randomInteger(withMaximumWidth width: Int) -> CS.BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(withMaximumWidth: width, using: &rng) + } + + /// Create a big unsigned integer consisting of `width-1` uniformly distributed random bits followed by a one bit. + /// + /// - Note: If `width` is zero, the result is zero. + /// + /// - Parameter width: The number of bits required to represent the answer. + /// - Parameter generator: The source of randomness. + /// - Returns: A random big unsigned integer whose width is `width`. + public static func randomInteger(withExactWidth width: Int, using generator: inout RNG) -> CS.BigUInt { + // width == 0 -> return 0 because there is no room for a one bit. + // width == 1 -> return 1 because there is no room for any random bits. + guard width > 1 else { return CS.BigUInt(width) } + var result = randomInteger(withMaximumWidth: width - 1, using: &generator) + result[(width - 1) / Word.bitWidth] |= 1 << Word((width - 1) % Word.bitWidth) + return result + } + + /// Create a big unsigned integer consisting of `width-1` uniformly distributed random bits followed by a one bit. + /// + /// - Note: If `width` is zero, the result is zero. + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Returns: A random big unsigned integer whose width is `width`. + public static func randomInteger(withExactWidth width: Int) -> CS.BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(withExactWidth: width, using: &rng) + } + + /// Create a uniformly distributed random unsigned integer that's less than the specified limit. + /// + /// - Precondition: `limit > 0`. + /// + /// - Parameter limit: The upper bound on the result. + /// - Parameter generator: The source of randomness. + /// - Returns: A random big unsigned integer that is less than `limit`. + public static func randomInteger(lessThan limit: CS.BigUInt, using generator: inout RNG) -> CS.BigUInt { + precondition(limit > 0, "\(#function): 0 is not a valid limit") + let width = limit.bitWidth + var random = randomInteger(withMaximumWidth: width, using: &generator) + while random >= limit { + random = randomInteger(withMaximumWidth: width, using: &generator) + } + return random + } + + /// Create a uniformly distributed random unsigned integer that's less than the specified limit. + /// + /// - Precondition: `limit > 0`. + /// - Note: I use a `SystemRandomGeneratorGenerator` as the source of randomness. + /// + /// - Parameter limit: The upper bound on the result. + /// - Returns: A random big unsigned integer that is less than `limit`. + public static func randomInteger(lessThan limit: CS.BigUInt) -> CS.BigUInt { + var rng = SystemRandomNumberGenerator() + return randomInteger(lessThan: limit, using: &rng) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Shifts.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Shifts.swift new file mode 100644 index 00000000..9960bf6f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Shifts.swift @@ -0,0 +1,211 @@ +// +// Shifts.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + + //MARK: Shift Operators + + internal func shiftedLeft(by amount: Word) -> CS.BigUInt { + guard amount > 0 else { return self } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let up = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let down = Word(Word.bitWidth) - up + + var result = CS.BigUInt() + if up > 0 { + var i = 0 + var lowbits: Word = 0 + while i < self.count || lowbits > 0 { + let word = self[i] + result[i + ext] = word << up | lowbits + lowbits = word >> down + i += 1 + } + } + else { + for i in 0 ..< self.count { + result[i + ext] = self[i] + } + } + return result + } + + internal mutating func shiftLeft(by amount: Word) { + guard amount > 0 else { return } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let up = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let down = Word(Word.bitWidth) - up + + if up > 0 { + var i = 0 + var lowbits: Word = 0 + while i < self.count || lowbits > 0 { + let word = self[i] + self[i] = word << up | lowbits + lowbits = word >> down + i += 1 + } + } + if ext > 0 && self.count > 0 { + self.shiftLeft(byWords: ext) + } + } + + internal func shiftedRight(by amount: Word) -> CS.BigUInt { + guard amount > 0 else { return self } + guard amount < self.bitWidth else { return 0 } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let down = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let up = Word(Word.bitWidth) - down + + var result = CS.BigUInt() + if down > 0 { + var highbits: Word = 0 + for i in (ext ..< self.count).reversed() { + let word = self[i] + result[i - ext] = highbits | word >> down + highbits = word << up + } + } + else { + for i in (ext ..< self.count).reversed() { + result[i - ext] = self[i] + } + } + return result + } + + internal mutating func shiftRight(by amount: Word) { + guard amount > 0 else { return } + guard amount < self.bitWidth else { self.clear(); return } + + let ext = Int(amount / Word(Word.bitWidth)) // External shift amount (new words) + let down = Word(amount % Word(Word.bitWidth)) // Internal shift amount (subword shift) + let up = Word(Word.bitWidth) - down + + if ext > 0 { + self.shiftRight(byWords: ext) + } + if down > 0 { + var i = self.count - 1 + var highbits: Word = 0 + while i >= 0 { + let word = self[i] + self[i] = highbits | word >> down + highbits = word << up + i -= 1 + } + } + } + + public static func >>=(lhs: inout CS.BigUInt, rhs: Other) { + if rhs < (0 as Other) { + lhs <<= (0 - rhs) + } + else if rhs >= lhs.bitWidth { + lhs.clear() + } + else { + lhs.shiftRight(by: UInt(rhs)) + } + } + + public static func <<=(lhs: inout CS.BigUInt, rhs: Other) { + if rhs < (0 as Other) { + lhs >>= (0 - rhs) + return + } + lhs.shiftLeft(by: Word(exactly: rhs)!) + } + + public static func >>(lhs: CS.BigUInt, rhs: Other) -> CS.BigUInt { + if rhs < (0 as Other) { + return lhs << (0 - rhs) + } + if rhs > Word.max { + return 0 + } + return lhs.shiftedRight(by: UInt(rhs)) + } + + public static func <<(lhs: CS.BigUInt, rhs: Other) -> CS.BigUInt { + if rhs < (0 as Other) { + return lhs >> (0 - rhs) + } + return lhs.shiftedLeft(by: Word(exactly: rhs)!) + } +} + +extension CS.BigInt { + func shiftedLeft(by amount: Word) -> CS.BigInt { + return CS.BigInt(sign: self.sign, magnitude: self.magnitude.shiftedLeft(by: amount)) + } + + mutating func shiftLeft(by amount: Word) { + self.magnitude.shiftLeft(by: amount) + } + + func shiftedRight(by amount: Word) -> CS.BigInt { + let m = self.magnitude.shiftedRight(by: amount) + return CS.BigInt(sign: self.sign, magnitude: self.sign == .minus && m.isZero ? 1 : m) + } + + mutating func shiftRight(by amount: Word) { + magnitude.shiftRight(by: amount) + if sign == .minus, magnitude.isZero { + magnitude.load(1) + } + } + + public static func &<<(left: CS.BigInt, right: CS.BigInt) -> CS.BigInt { + return left.shiftedLeft(by: right.words[0]) + } + + public static func &<<=(left: inout CS.BigInt, right: CS.BigInt) { + left.shiftLeft(by: right.words[0]) + } + + public static func &>>(left: CS.BigInt, right: CS.BigInt) -> CS.BigInt { + return left.shiftedRight(by: right.words[0]) + } + + public static func &>>=(left: inout CS.BigInt, right: CS.BigInt) { + left.shiftRight(by: right.words[0]) + } + + public static func <<(lhs: CS.BigInt, rhs: Other) -> CS.BigInt { + guard rhs >= (0 as Other) else { return lhs >> (0 - rhs) } + return lhs.shiftedLeft(by: Word(rhs)) + } + + public static func <<=(lhs: inout CS.BigInt, rhs: Other) { + if rhs < (0 as Other) { + lhs >>= (0 - rhs) + } + else { + lhs.shiftLeft(by: Word(rhs)) + } + } + + public static func >>(lhs: CS.BigInt, rhs: Other) -> CS.BigInt { + guard rhs >= (0 as Other) else { return lhs << (0 - rhs) } + return lhs.shiftedRight(by: Word(rhs)) + } + + public static func >>=(lhs: inout CS.BigInt, rhs: Other) { + if rhs < (0 as Other) { + lhs <<= (0 - rhs) + } + else { + lhs.shiftRight(by: Word(rhs)) + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Square Root.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Square Root.swift new file mode 100644 index 00000000..ab6df657 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Square Root.swift @@ -0,0 +1,41 @@ +// +// Square Root.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +//MARK: Square Root + +extension CS.BigUInt { + /// Returns the integer square root of a big integer; i.e., the largest integer whose square isn't greater than `value`. + /// + /// - Returns: floor(sqrt(self)) + public func squareRoot() -> CS.BigUInt { + // This implementation uses Newton's method. + guard !self.isZero else { return CS.BigUInt() } + var x = CS.BigUInt(1) << ((self.bitWidth + 1) / 2) + var y: CS.BigUInt = 0 + while true { + y.load(self) + y /= x + y += x + y >>= 1 + if x == y || x == y - 1 { break } + x = y + } + return x + } +} + +extension CS.BigInt { + /// Returns the integer square root of a big integer; i.e., the largest integer whose square isn't greater than `value`. + /// + /// - Requires: self >= 0 + /// - Returns: floor(sqrt(self)) + public func squareRoot() -> CS.BigInt { + precondition(self.sign == .plus) + return CS.BigInt(sign: .plus, magnitude: self.magnitude.squareRoot()) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Strideable.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Strideable.swift new file mode 100644 index 00000000..ffba780e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Strideable.swift @@ -0,0 +1,38 @@ +// +// Strideable.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt: Strideable { + /// A type that can represent the distance between two values ofa `BigUInt`. + public typealias Stride = CS.BigInt + + /// Adds `n` to `self` and returns the result. Traps if the result would be less than zero. + public func advanced(by n: CS.BigInt) -> CS.BigUInt { + return n.sign == .minus ? self - n.magnitude : self + n.magnitude + } + + /// Returns the (potentially negative) difference between `self` and `other` as a `BigInt`. Never traps. + public func distance(to other: CS.BigUInt) -> CS.BigInt { + return CS.BigInt(other) - CS.BigInt(self) + } +} + +extension CS.BigInt: Strideable { + public typealias Stride = CS.BigInt + + /// Returns `self + n`. + public func advanced(by n: Stride) -> CS.BigInt { + return self + n + } + + /// Returns `other - self`. + public func distance(to other: CS.BigInt) -> Stride { + return other - self + } +} + + diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/String Conversion.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/String Conversion.swift new file mode 100644 index 00000000..a1822eb1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/String Conversion.swift @@ -0,0 +1,240 @@ +// +// String Conversion.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + + //MARK: String Conversion + + /// Calculates the number of numerals in a given radix that fit inside a single `Word`. + /// + /// - Returns: (chars, power) where `chars` is highest that satisfy `radix^chars <= 2^Word.bitWidth`. `power` is zero + /// if radix is a power of two; otherwise `power == radix^chars`. + fileprivate static func charsPerWord(forRadix radix: Int) -> (chars: Int, power: Word) { + var power: Word = 1 + var overflow = false + var count = 0 + while !overflow { + let (high,low) = power.multipliedFullWidth(by: Word(radix)) + if high > 0 { + overflow = true + } + + if !overflow || (high == 1 && low == 0) { + count += 1 + power = low + } + } + return (count, power) + } + + /// Initialize a big integer from an ASCII representation in a given radix. Numerals above `9` are represented by + /// letters from the English alphabet. + /// + /// - Requires: `radix > 1 && radix < 36` + /// - Parameter `text`: A string consisting of characters corresponding to numerals in the given radix. (0-9, a-z, A-Z) + /// - Parameter `radix`: The base of the number system to use, or 10 if unspecified. + /// - Returns: The integer represented by `text`, or nil if `text` contains a character that does not represent a numeral in `radix`. + public init?(_ text: S, radix: Int = 10) { + precondition(radix > 1 && radix < 36) + guard !text.isEmpty else { return nil } + let (charsPerWord, power) = CS.BigUInt.charsPerWord(forRadix: radix) + + var words: [Word] = [] + var end = text.endIndex + var start = end + var count = 0 + while start != text.startIndex { + start = text.index(before: start) + count += 1 + if count == charsPerWord { + guard let d = Word.init(text[start ..< end], radix: radix) else { return nil } + words.append(d) + end = start + count = 0 + } + } + if start != end { + guard let d = Word.init(text[start ..< end], radix: radix) else { return nil } + words.append(d) + } + + if power == 0 { + self.init(words: words) + } + else { + self.init() + for d in words.reversed() { + self.multiply(byWord: power) + self.addWord(d) + } + } + } +} + +extension CS.BigInt { + /// Initialize a big integer from an ASCII representation in a given radix. Numerals above `9` are represented by + /// letters from the English alphabet. + /// + /// - Requires: `radix > 1 && radix < 36` + /// - Parameter `text`: A string optionally starting with "-" or "+" followed by characters corresponding to numerals in the given radix. (0-9, a-z, A-Z) + /// - Parameter `radix`: The base of the number system to use, or 10 if unspecified. + /// - Returns: The integer represented by `text`, or nil if `text` contains a character that does not represent a numeral in `radix`. + public init?(_ text: S, radix: Int = 10) { + var magnitude: CS.BigUInt? + var sign: Sign = .plus + if text.first == "-" { + sign = .minus + let text = text.dropFirst() + magnitude = CS.BigUInt(text, radix: radix) + } + else if text.first == "+" { + let text = text.dropFirst() + magnitude = CS.BigUInt(text, radix: radix) + } + else { + magnitude = CS.BigUInt(text, radix: radix) + } + guard let m = magnitude else { return nil } + self.magnitude = m + self.sign = m.isZero ? .plus : sign + } +} + +extension String { + /// Initialize a new string with the base-10 representation of an unsigned big integer. + /// + /// - Complexity: O(v.count^2) + public init(_ v: CS.BigUInt) { self.init(v, radix: 10, uppercase: false) } + + /// Initialize a new string representing an unsigned big integer in the given radix (base). + /// + /// Numerals greater than 9 are represented as letters from the English alphabet, + /// starting with `a` if `uppercase` is false or `A` otherwise. + /// + /// - Requires: radix > 1 && radix <= 36 + /// - Complexity: O(count) when radix is a power of two; otherwise O(count^2). + public init(_ v: CS.BigUInt, radix: Int, uppercase: Bool = false) { + precondition(radix > 1) + let (charsPerWord, power) = CS.BigUInt.charsPerWord(forRadix: radix) + + guard !v.isZero else { self = "0"; return } + + var parts: [String] + if power == 0 { + parts = v.words.map { String($0, radix: radix, uppercase: uppercase) } + } + else { + parts = [] + var rest = v + while !rest.isZero { + let mod = rest.divide(byWord: power) + parts.append(String(mod, radix: radix, uppercase: uppercase)) + } + } + assert(!parts.isEmpty) + + self = "" + var first = true + for part in parts.reversed() { + let zeroes = charsPerWord - part.count + assert(zeroes >= 0) + if !first && zeroes > 0 { + // Insert leading zeroes for mid-Words + self += String(repeating: "0", count: zeroes) + } + first = false + self += part + } + } + + /// Initialize a new string representing a signed big integer in the given radix (base). + /// + /// Numerals greater than 9 are represented as letters from the English alphabet, + /// starting with `a` if `uppercase` is false or `A` otherwise. + /// + /// - Requires: radix > 1 && radix <= 36 + /// - Complexity: O(count) when radix is a power of two; otherwise O(count^2). + public init(_ value: CS.BigInt, radix: Int = 10, uppercase: Bool = false) { + self = String(value.magnitude, radix: radix, uppercase: uppercase) + if value.sign == .minus { + self = "-" + self + } + } +} + +extension CS.BigUInt: ExpressibleByStringLiteral { + /// Initialize a new big integer from a Unicode scalar. + /// The scalar must represent a decimal digit. + public init(unicodeScalarLiteral value: UnicodeScalar) { + self = CS.BigUInt(String(value), radix: 10)! + } + + /// Initialize a new big integer from an extended grapheme cluster. + /// The cluster must consist of a decimal digit. + public init(extendedGraphemeClusterLiteral value: String) { + self = CS.BigUInt(value, radix: 10)! + } + + /// Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. + /// The string must contain only decimal digits. + public init(stringLiteral value: StringLiteralType) { + self = CS.BigUInt(value, radix: 10)! + } +} + +extension CS.BigInt: ExpressibleByStringLiteral { + /// Initialize a new big integer from a Unicode scalar. + /// The scalar must represent a decimal digit. + public init(unicodeScalarLiteral value: UnicodeScalar) { + self = CS.BigInt(String(value), radix: 10)! + } + + /// Initialize a new big integer from an extended grapheme cluster. + /// The cluster must consist of a decimal digit. + public init(extendedGraphemeClusterLiteral value: String) { + self = CS.BigInt(value, radix: 10)! + } + + /// Initialize a new big integer from a decimal number represented by a string literal of arbitrary length. + /// The string must contain only decimal digits. + public init(stringLiteral value: StringLiteralType) { + self = CS.BigInt(value, radix: 10)! + } +} + +extension CS.BigUInt: CustomStringConvertible { + /// Return the decimal representation of this integer. + public var description: String { + return String(self, radix: 10) + } +} + +extension CS.BigInt: CustomStringConvertible { + /// Return the decimal representation of this integer. + public var description: String { + return String(self, radix: 10) + } +} + +extension CS.BigUInt: CustomPlaygroundDisplayConvertible { + + /// Return the playground quick look representation of this integer. + public var playgroundDescription: Any { + let text = String(self) + return text + " (\(self.bitWidth) bits)" + } +} + +extension CS.BigInt: CustomPlaygroundDisplayConvertible { + + /// Return the playground quick look representation of this integer. + public var playgroundDescription: Any { + let text = String(self) + return text + " (\(self.magnitude.bitWidth) bits)" + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Subtraction.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Subtraction.swift new file mode 100644 index 00000000..8baeed95 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Subtraction.swift @@ -0,0 +1,169 @@ +// +// Subtraction.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2016-01-03. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension CS.BigUInt { + //MARK: Subtraction + + /// Subtract `word` from this integer in place, returning a flag indicating if the operation + /// caused an arithmetic overflow. `word` is shifted `shift` words to the left before being subtracted. + /// + /// - Note: If the result indicates an overflow, then `self` becomes the two's complement of the absolute difference. + /// - Complexity: O(count) + internal mutating func subtractWordReportingOverflow(_ word: Word, shiftedBy shift: Int = 0) -> Bool { + precondition(shift >= 0) + var carry: Word = word + var i = shift + let count = self.count + while carry > 0 && i < count { + let (d, c) = self[i].subtractingReportingOverflow(carry) + self[i] = d + carry = (c ? 1 : 0) + i += 1 + } + return carry > 0 + } + + /// Subtract `word` from this integer, returning the difference and a flag that is true if the operation + /// caused an arithmetic overflow. `word` is shifted `shift` words to the left before being subtracted. + /// + /// - Note: If `overflow` is true, then the returned value is the two's complement of the absolute difference. + /// - Complexity: O(count) + internal func subtractingWordReportingOverflow(_ word: Word, shiftedBy shift: Int = 0) -> (partialValue: CS.BigUInt, overflow: Bool) { + var result = self + let overflow = result.subtractWordReportingOverflow(word, shiftedBy: shift) + return (result, overflow) + } + + /// Subtract a digit `d` from this integer in place. + /// `d` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= d * 2^shift + /// - Complexity: O(count) + internal mutating func subtractWord(_ word: Word, shiftedBy shift: Int = 0) { + let overflow = subtractWordReportingOverflow(word, shiftedBy: shift) + precondition(!overflow) + } + + /// Subtract a digit `d` from this integer and return the result. + /// `d` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= d * 2^shift + /// - Complexity: O(count) + internal func subtractingWord(_ word: Word, shiftedBy shift: Int = 0) -> CS.BigUInt { + var result = self + result.subtractWord(word, shiftedBy: shift) + return result + } + + /// Subtract `other` from this integer in place, and return a flag indicating if the operation caused an + /// arithmetic overflow. `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Note: If the result indicates an overflow, then `self` becomes the twos' complement of the absolute difference. + /// - Complexity: O(count) + public mutating func subtractReportingOverflow(_ b: CS.BigUInt, shiftedBy shift: Int = 0) -> Bool { + precondition(shift >= 0) + var carry = false + var bi = 0 + let bc = b.count + let count = self.count + while bi < bc || (shift + bi < count && carry) { + let ai = shift + bi + let (d, c) = self[ai].subtractingReportingOverflow(b[bi]) + if carry { + let (d2, c2) = d.subtractingReportingOverflow(1) + self[ai] = d2 + carry = c || c2 + } + else { + self[ai] = d + carry = c + } + bi += 1 + } + return carry + } + + /// Subtract `other` from this integer, returning the difference and a flag indicating arithmetic overflow. + /// `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Note: If `overflow` is true, then the result value is the twos' complement of the absolute value of the difference. + /// - Complexity: O(count) + public func subtractingReportingOverflow(_ other: CS.BigUInt, shiftedBy shift: Int) -> (partialValue: CS.BigUInt, overflow: Bool) { + var result = self + let overflow = result.subtractReportingOverflow(other, shiftedBy: shift) + return (result, overflow) + } + + /// Subtracts `other` from `self`, returning the result and a flag indicating arithmetic overflow. + /// + /// - Note: When the operation overflows, then `partialValue` is the twos' complement of the absolute value of the difference. + /// - Complexity: O(count) + public func subtractingReportingOverflow(_ other: CS.BigUInt) -> (partialValue: CS.BigUInt, overflow: Bool) { + return self.subtractingReportingOverflow(other, shiftedBy: 0) + } + + /// Subtract `other` from this integer in place. + /// `other` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= other * 2^shift + /// - Complexity: O(count) + public mutating func subtract(_ other: CS.BigUInt, shiftedBy shift: Int = 0) { + let overflow = subtractReportingOverflow(other, shiftedBy: shift) + precondition(!overflow) + } + + /// Subtract `b` from this integer, and return the difference. + /// `b` is shifted `shift` digits to the left before being subtracted. + /// + /// - Requires: self >= b * 2^shift + /// - Complexity: O(count) + public func subtracting(_ other: CS.BigUInt, shiftedBy shift: Int = 0) -> CS.BigUInt { + var result = self + result.subtract(other, shiftedBy: shift) + return result + } + + /// Decrement this integer by one. + /// + /// - Requires: !isZero + /// - Complexity: O(count) + public mutating func decrement(shiftedBy shift: Int = 0) { + self.subtract(1, shiftedBy: shift) + } + + /// Subtract `b` from `a` and return the result. + /// + /// - Requires: a >= b + /// - Complexity: O(a.count) + public static func -(a: CS.BigUInt, b: CS.BigUInt) -> CS.BigUInt { + return a.subtracting(b) + } + + /// Subtract `b` from `a` and store the result in `a`. + /// + /// - Requires: a >= b + /// - Complexity: O(a.count) + public static func -=(a: inout CS.BigUInt, b: CS.BigUInt) { + a.subtract(b) + } +} + +extension CS.BigInt { + public mutating func negate() { + guard !magnitude.isZero else { return } + self.sign = self.sign == .plus ? .minus : .plus + } + + /// Subtract `b` from `a` and return the result. + public static func -(a: CS.BigInt, b: CS.BigInt) -> CS.BigInt { + return a + -b + } + + /// Subtract `b` from `a` in place. + public static func -=(a: inout CS.BigInt, b: CS.BigInt) { a = a - b } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Words and Bits.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Words and Bits.swift new file mode 100644 index 00000000..95a99e15 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CS_BigInt/Words and Bits.swift @@ -0,0 +1,202 @@ +// +// Words and Bits.swift +// CS.BigInt +// +// Created by Károly Lőrentey on 2017-08-11. +// Copyright © 2016-2017 Károly Lőrentey. +// + +extension Array where Element == UInt { + mutating func twosComplement() { + var increment = true + for i in 0 ..< self.count { + if increment { + (self[i], increment) = (~self[i]).addingReportingOverflow(1) + } + else { + self[i] = ~self[i] + } + } + } +} + +extension CS.BigUInt { + public subscript(bitAt index: Int) -> Bool { + get { + precondition(index >= 0) + let (i, j) = index.quotientAndRemainder(dividingBy: Word.bitWidth) + return self[i] & (1 << j) != 0 + } + set { + precondition(index >= 0) + let (i, j) = index.quotientAndRemainder(dividingBy: Word.bitWidth) + if newValue { + self[i] |= 1 << j + } + else { + self[i] &= ~(1 << j) + } + } + } +} + +extension CS.BigUInt { + /// The minimum number of bits required to represent this integer in binary. + /// + /// - Returns: floor(log2(2 * self + 1)) + /// - Complexity: O(1) + public var bitWidth: Int { + guard count > 0 else { return 0 } + return count * Word.bitWidth - self[count - 1].leadingZeroBitCount + } + + /// The number of leading zero bits in the binary representation of this integer in base `2^(Word.bitWidth)`. + /// This is useful when you need to normalize a `BigUInt` such that the top bit of its most significant word is 1. + /// + /// - Note: 0 is considered to have zero leading zero bits. + /// - Returns: A value in `0...(Word.bitWidth - 1)`. + /// - SeeAlso: width + /// - Complexity: O(1) + public var leadingZeroBitCount: Int { + guard count > 0 else { return 0 } + return self[count - 1].leadingZeroBitCount + } + + /// The number of trailing zero bits in the binary representation of this integer. + /// + /// - Note: 0 is considered to have zero trailing zero bits. + /// - Returns: A value in `0...width`. + /// - Complexity: O(count) + public var trailingZeroBitCount: Int { + guard count > 0 else { return 0 } + let i = self.words.firstIndex { $0 != 0 }! + return i * Word.bitWidth + self[i].trailingZeroBitCount + } +} + +extension CS.BigInt { + public var bitWidth: Int { + guard !magnitude.isZero else { return 0 } + return magnitude.bitWidth + 1 + } + + public var trailingZeroBitCount: Int { + // Amazingly, this works fine for negative numbers + return magnitude.trailingZeroBitCount + } +} + +extension CS.BigUInt { + public struct Words: RandomAccessCollection { + private let value: CS.BigUInt + + fileprivate init(_ value: CS.BigUInt) { self.value = value } + + public var startIndex: Int { return 0 } + public var endIndex: Int { return value.count } + + public subscript(_ index: Int) -> Word { + return value[index] + } + } + + public var words: Words { return Words(self) } + + public init(words: Words) where Words.Element == Word { + let uc = words.underestimatedCount + if uc > 2 { + self.init(words: Array(words)) + } + else { + var it = words.makeIterator() + guard let w0 = it.next() else { + self.init() + return + } + guard let w1 = it.next() else { + self.init(word: w0) + return + } + if let w2 = it.next() { + var words: [UInt] = [] + words.reserveCapacity(Swift.max(3, uc)) + words.append(w0) + words.append(w1) + words.append(w2) + while let word = it.next() { + words.append(word) + } + self.init(words: words) + } + else { + self.init(low: w0, high: w1) + } + } + } +} + +extension CS.BigInt { + public struct Words: RandomAccessCollection { + public typealias Indices = CountableRange + + private let value: CS.BigInt + private let decrementLimit: Int + + fileprivate init(_ value: CS.BigInt) { + self.value = value + switch value.sign { + case .plus: + self.decrementLimit = 0 + case .minus: + assert(!value.magnitude.isZero) + self.decrementLimit = value.magnitude.words.firstIndex(where: { $0 != 0 })! + } + } + + public var count: Int { + switch value.sign { + case .plus: + if let high = value.magnitude.words.last, high >> (Word.bitWidth - 1) != 0 { + return value.magnitude.count + 1 + } + return value.magnitude.count + case .minus: + let high = value.magnitude.words.last! + if high >> (Word.bitWidth - 1) != 0 { + return value.magnitude.count + 1 + } + return value.magnitude.count + } + } + + public var indices: Indices { return 0 ..< count } + public var startIndex: Int { return 0 } + public var endIndex: Int { return count } + + public subscript(_ index: Int) -> UInt { + // Note that indices above `endIndex` are accepted. + if value.sign == .plus { + return value.magnitude[index] + } + if index <= decrementLimit { + return ~(value.magnitude[index] &- 1) + } + return ~value.magnitude[index] + } + } + + public var words: Words { + return Words(self) + } + + public init(words: S) where S.Element == Word { + var words = Array(words) + if (words.last ?? 0) >> (Word.bitWidth - 1) == 0 { + self.init(sign: .plus, magnitude: CS.BigUInt(words: words)) + } + else { + words.twosComplement() + self.init(sign: .minus, magnitude: CS.BigUInt(words: words)) + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ChaCha20.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ChaCha20.swift new file mode 100644 index 00000000..4243eaa4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ChaCha20.swift @@ -0,0 +1,347 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// https://tools.ietf.org/html/rfc7539 +// + +public final class ChaCha20: BlockCipher { + public enum Error: Swift.Error { + case invalidKeyOrInitializationVector + case notSupported + } + + public static let blockSize = 64 // 512 / 8 + public let keySize: Int + + fileprivate let key: Key + fileprivate var counter: Array + + public init(key: Array, iv nonce: Array) throws { + precondition(nonce.count == 12 || nonce.count == 8) + + if key.count != 32 { + throw Error.invalidKeyOrInitializationVector + } + + self.key = Key(bytes: key) + self.keySize = self.key.count + + if nonce.count == 8 { + self.counter = [0, 0, 0, 0, 0, 0, 0, 0] + nonce + } else { + self.counter = [0, 0, 0, 0] + nonce + } + + assert(self.counter.count == 16) + } + + /// https://tools.ietf.org/html/rfc7539#section-2.3. + fileprivate func core(block: inout Array, counter: Array, key: Array) { + precondition(block.count == ChaCha20.blockSize) + precondition(counter.count == 16) + precondition(key.count == 32) + + let j0: UInt32 = 0x61707865 + let j1: UInt32 = 0x3320646e // 0x3620646e sigma/tau + let j2: UInt32 = 0x79622d32 + let j3: UInt32 = 0x6b206574 + let j4: UInt32 = UInt32(bytes: key[0..<4]).bigEndian + let j5: UInt32 = UInt32(bytes: key[4..<8]).bigEndian + let j6: UInt32 = UInt32(bytes: key[8..<12]).bigEndian + let j7: UInt32 = UInt32(bytes: key[12..<16]).bigEndian + let j8: UInt32 = UInt32(bytes: key[16..<20]).bigEndian + let j9: UInt32 = UInt32(bytes: key[20..<24]).bigEndian + let j10: UInt32 = UInt32(bytes: key[24..<28]).bigEndian + let j11: UInt32 = UInt32(bytes: key[28..<32]).bigEndian + let j12: UInt32 = UInt32(bytes: counter[0..<4]).bigEndian + let j13: UInt32 = UInt32(bytes: counter[4..<8]).bigEndian + let j14: UInt32 = UInt32(bytes: counter[8..<12]).bigEndian + let j15: UInt32 = UInt32(bytes: counter[12..<16]).bigEndian + + var (x0, x1, x2, x3, x4, x5, x6, x7) = (j0, j1, j2, j3, j4, j5, j6, j7) + var (x8, x9, x10, x11, x12, x13, x14, x15) = (j8, j9, j10, j11, j12, j13, j14, j15) + + for _ in 0..<10 { // 20 rounds + x0 = x0 &+ x4 + x12 ^= x0 + x12 = (x12 << 16) | (x12 >> 16) + x8 = x8 &+ x12 + x4 ^= x8 + x4 = (x4 << 12) | (x4 >> 20) + x0 = x0 &+ x4 + x12 ^= x0 + x12 = (x12 << 8) | (x12 >> 24) + x8 = x8 &+ x12 + x4 ^= x8 + x4 = (x4 << 7) | (x4 >> 25) + x1 = x1 &+ x5 + x13 ^= x1 + x13 = (x13 << 16) | (x13 >> 16) + x9 = x9 &+ x13 + x5 ^= x9 + x5 = (x5 << 12) | (x5 >> 20) + x1 = x1 &+ x5 + x13 ^= x1 + x13 = (x13 << 8) | (x13 >> 24) + x9 = x9 &+ x13 + x5 ^= x9 + x5 = (x5 << 7) | (x5 >> 25) + x2 = x2 &+ x6 + x14 ^= x2 + x14 = (x14 << 16) | (x14 >> 16) + x10 = x10 &+ x14 + x6 ^= x10 + x6 = (x6 << 12) | (x6 >> 20) + x2 = x2 &+ x6 + x14 ^= x2 + x14 = (x14 << 8) | (x14 >> 24) + x10 = x10 &+ x14 + x6 ^= x10 + x6 = (x6 << 7) | (x6 >> 25) + x3 = x3 &+ x7 + x15 ^= x3 + x15 = (x15 << 16) | (x15 >> 16) + x11 = x11 &+ x15 + x7 ^= x11 + x7 = (x7 << 12) | (x7 >> 20) + x3 = x3 &+ x7 + x15 ^= x3 + x15 = (x15 << 8) | (x15 >> 24) + x11 = x11 &+ x15 + x7 ^= x11 + x7 = (x7 << 7) | (x7 >> 25) + x0 = x0 &+ x5 + x15 ^= x0 + x15 = (x15 << 16) | (x15 >> 16) + x10 = x10 &+ x15 + x5 ^= x10 + x5 = (x5 << 12) | (x5 >> 20) + x0 = x0 &+ x5 + x15 ^= x0 + x15 = (x15 << 8) | (x15 >> 24) + x10 = x10 &+ x15 + x5 ^= x10 + x5 = (x5 << 7) | (x5 >> 25) + x1 = x1 &+ x6 + x12 ^= x1 + x12 = (x12 << 16) | (x12 >> 16) + x11 = x11 &+ x12 + x6 ^= x11 + x6 = (x6 << 12) | (x6 >> 20) + x1 = x1 &+ x6 + x12 ^= x1 + x12 = (x12 << 8) | (x12 >> 24) + x11 = x11 &+ x12 + x6 ^= x11 + x6 = (x6 << 7) | (x6 >> 25) + x2 = x2 &+ x7 + x13 ^= x2 + x13 = (x13 << 16) | (x13 >> 16) + x8 = x8 &+ x13 + x7 ^= x8 + x7 = (x7 << 12) | (x7 >> 20) + x2 = x2 &+ x7 + x13 ^= x2 + x13 = (x13 << 8) | (x13 >> 24) + x8 = x8 &+ x13 + x7 ^= x8 + x7 = (x7 << 7) | (x7 >> 25) + x3 = x3 &+ x4 + x14 ^= x3 + x14 = (x14 << 16) | (x14 >> 16) + x9 = x9 &+ x14 + x4 ^= x9 + x4 = (x4 << 12) | (x4 >> 20) + x3 = x3 &+ x4 + x14 ^= x3 + x14 = (x14 << 8) | (x14 >> 24) + x9 = x9 &+ x14 + x4 ^= x9 + x4 = (x4 << 7) | (x4 >> 25) + } + + x0 = x0 &+ j0 + x1 = x1 &+ j1 + x2 = x2 &+ j2 + x3 = x3 &+ j3 + x4 = x4 &+ j4 + x5 = x5 &+ j5 + x6 = x6 &+ j6 + x7 = x7 &+ j7 + x8 = x8 &+ j8 + x9 = x9 &+ j9 + x10 = x10 &+ j10 + x11 = x11 &+ j11 + x12 = x12 &+ j12 + x13 = x13 &+ j13 + x14 = x14 &+ j14 + x15 = x15 &+ j15 + + block.replaceSubrange(0..<4, with: x0.bigEndian.bytes()) + block.replaceSubrange(4..<8, with: x1.bigEndian.bytes()) + block.replaceSubrange(8..<12, with: x2.bigEndian.bytes()) + block.replaceSubrange(12..<16, with: x3.bigEndian.bytes()) + block.replaceSubrange(16..<20, with: x4.bigEndian.bytes()) + block.replaceSubrange(20..<24, with: x5.bigEndian.bytes()) + block.replaceSubrange(24..<28, with: x6.bigEndian.bytes()) + block.replaceSubrange(28..<32, with: x7.bigEndian.bytes()) + block.replaceSubrange(32..<36, with: x8.bigEndian.bytes()) + block.replaceSubrange(36..<40, with: x9.bigEndian.bytes()) + block.replaceSubrange(40..<44, with: x10.bigEndian.bytes()) + block.replaceSubrange(44..<48, with: x11.bigEndian.bytes()) + block.replaceSubrange(48..<52, with: x12.bigEndian.bytes()) + block.replaceSubrange(52..<56, with: x13.bigEndian.bytes()) + block.replaceSubrange(56..<60, with: x14.bigEndian.bytes()) + block.replaceSubrange(60..<64, with: x15.bigEndian.bytes()) + } + + // XORKeyStream + func process(bytes: ArraySlice, counter: inout Array, key: Array) -> Array { + precondition(counter.count == 16) + precondition(key.count == 32) + + var block = Array(repeating: 0, count: ChaCha20.blockSize) + var bytesSlice = bytes + var out = Array(reserveCapacity: bytesSlice.count) + + while bytesSlice.count >= ChaCha20.blockSize { + self.core(block: &block, counter: counter, key: key) + for (i, x) in block.enumerated() { + out.append(bytesSlice[bytesSlice.startIndex + i] ^ x) + } + var u: UInt32 = 1 + for i in 0..<4 { + u += UInt32(counter[i]) + counter[i] = UInt8(u & 0xff) + u >>= 8 + } + bytesSlice = bytesSlice[bytesSlice.startIndex + ChaCha20.blockSize..) throws -> Array { + self.process(bytes: bytes, counter: &self.counter, key: Array(self.key)) + } + + public func decrypt(_ bytes: ArraySlice) throws -> Array { + try self.encrypt(bytes) + } +} + +// MARK: Encryptor + +extension ChaCha20 { + public struct ChaChaEncryptor: Cryptor, Updatable { + private var accumulated = Array() + private let chacha: ChaCha20 + + init(chacha: ChaCha20) { + self.chacha = chacha + } + + public mutating func update(withBytes bytes: ArraySlice, isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + var encrypted = Array() + encrypted.reserveCapacity(self.accumulated.count) + for chunk in self.accumulated.batched(by: ChaCha20.blockSize) { + if isLast || self.accumulated.count >= ChaCha20.blockSize { + encrypted += try self.chacha.encrypt(chunk) + self.accumulated.removeFirst(chunk.count) // TODO: improve performance + } + } + return encrypted + } + + public func seek(to: Int) throws { + throw Error.notSupported + } + } +} + +// MARK: Decryptor + +extension ChaCha20 { + public struct ChaChaDecryptor: Cryptor, Updatable { + private var accumulated = Array() + + private var offset: Int = 0 + private var offsetToRemove: Int = 0 + private let chacha: ChaCha20 + + init(chacha: ChaCha20) { + self.chacha = chacha + } + + public mutating func update(withBytes bytes: ArraySlice, isLast: Bool = true) throws -> Array { + // prepend "offset" number of bytes at the beginning + if self.offset > 0 { + self.accumulated += Array(repeating: 0, count: self.offset) + bytes + self.offsetToRemove = self.offset + self.offset = 0 + } else { + self.accumulated += bytes + } + + var plaintext = Array() + plaintext.reserveCapacity(self.accumulated.count) + for chunk in self.accumulated.batched(by: ChaCha20.blockSize) { + if isLast || self.accumulated.count >= ChaCha20.blockSize { + plaintext += try self.chacha.decrypt(chunk) + + // remove "offset" from the beginning of first chunk + if self.offsetToRemove > 0 { + plaintext.removeFirst(self.offsetToRemove) // TODO: improve performance + self.offsetToRemove = 0 + } + + self.accumulated.removeFirst(chunk.count) + } + } + + return plaintext + } + + public func seek(to: Int) throws { + throw Error.notSupported + } + } +} + +// MARK: Cryptors + +extension ChaCha20: Cryptors { + //TODO: Use BlockEncryptor/BlockDecryptor + + public func makeEncryptor() -> Cryptor & Updatable { + ChaCha20.ChaChaEncryptor(chacha: self) + } + + public func makeDecryptor() -> Cryptor & Updatable { + ChaCha20.ChaChaDecryptor(chacha: self) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Checksum.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Checksum.swift new file mode 100644 index 00000000..e066b75d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Checksum.swift @@ -0,0 +1,208 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// CRC - cyclic redundancy check code. +public final class Checksum { + + @usableFromInline + static let table32: Array = [ + 0x0000_0000, 0x7707_3096, 0xEE0E_612C, 0x9909_51BA, 0x076D_C419, 0x706A_F48F, 0xE963_A535, 0x9E64_95A3, + 0x0EDB_8832, 0x79DC_B8A4, 0xE0D5_E91E, 0x97D2_D988, 0x09B6_4C2B, 0x7EB1_7CBD, 0xE7B8_2D07, 0x90BF_1D91, + 0x1DB7_1064, 0x6AB0_20F2, 0xF3B9_7148, 0x84BE_41DE, 0x1ADA_D47D, 0x6DDD_E4EB, 0xF4D4_B551, 0x83D3_85C7, + 0x136C_9856, 0x646B_A8C0, 0xFD62_F97A, 0x8A65_C9EC, 0x1401_5C4F, 0x6306_6CD9, 0xFA0F_3D63, 0x8D08_0DF5, + 0x3B6E_20C8, 0x4C69_105E, 0xD560_41E4, 0xA267_7172, 0x3C03_E4D1, 0x4B04_D447, 0xD20D_85FD, 0xA50A_B56B, + 0x35B5_A8FA, 0x42B2_986C, 0xDBBB_C9D6, 0xACBC_F940, 0x32D8_6CE3, 0x45DF_5C75, 0xDCD6_0DCF, 0xABD1_3D59, + 0x26D9_30AC, 0x51DE_003A, 0xC8D7_5180, 0xBFD0_6116, 0x21B4_F4B5, 0x56B3_C423, 0xCFBA_9599, 0xB8BD_A50F, + 0x2802_B89E, 0x5F05_8808, 0xC60C_D9B2, 0xB10B_E924, 0x2F6F_7C87, 0x5868_4C11, 0xC161_1DAB, 0xB666_2D3D, + 0x76DC_4190, 0x01DB_7106, 0x98D2_20BC, 0xEFD5_102A, 0x71B1_8589, 0x06B6_B51F, 0x9FBF_E4A5, 0xE8B8_D433, + 0x7807_C9A2, 0x0F00_F934, 0x9609_A88E, 0xE10E_9818, 0x7F6A_0DBB, 0x086D_3D2D, 0x9164_6C97, 0xE663_5C01, + 0x6B6B_51F4, 0x1C6C_6162, 0x8565_30D8, 0xF262_004E, 0x6C06_95ED, 0x1B01_A57B, 0x8208_F4C1, 0xF50F_C457, + 0x65B0_D9C6, 0x12B7_E950, 0x8BBE_B8EA, 0xFCB9_887C, 0x62DD_1DDF, 0x15DA_2D49, 0x8CD3_7CF3, 0xFBD4_4C65, + 0x4DB2_6158, 0x3AB5_51CE, 0xA3BC_0074, 0xD4BB_30E2, 0x4ADF_A541, 0x3DD8_95D7, 0xA4D1_C46D, 0xD3D6_F4FB, + 0x4369_E96A, 0x346E_D9FC, 0xAD67_8846, 0xDA60_B8D0, 0x4404_2D73, 0x3303_1DE5, 0xAA0A_4C5F, 0xDD0D_7CC9, + 0x5005_713C, 0x2702_41AA, 0xBE0B_1010, 0xC90C_2086, 0x5768_B525, 0x206F_85B3, 0xB966_D409, 0xCE61_E49F, + 0x5EDE_F90E, 0x29D9_C998, 0xB0D0_9822, 0xC7D7_A8B4, 0x59B3_3D17, 0x2EB4_0D81, 0xB7BD_5C3B, 0xC0BA_6CAD, + 0xEDB8_8320, 0x9ABF_B3B6, 0x03B6_E20C, 0x74B1_D29A, 0xEAD5_4739, 0x9DD2_77AF, 0x04DB_2615, 0x73DC_1683, + 0xE363_0B12, 0x9464_3B84, 0x0D6D_6A3E, 0x7A6A_5AA8, 0xE40E_CF0B, 0x9309_FF9D, 0x0A00_AE27, 0x7D07_9EB1, + 0xF00F_9344, 0x8708_A3D2, 0x1E01_F268, 0x6906_C2FE, 0xF762_575D, 0x8065_67CB, 0x196C_3671, 0x6E6B_06E7, + 0xFED4_1B76, 0x89D3_2BE0, 0x10DA_7A5A, 0x67DD_4ACC, 0xF9B9_DF6F, 0x8EBE_EFF9, 0x17B7_BE43, 0x60B0_8ED5, + 0xD6D6_A3E8, 0xA1D1_937E, 0x38D8_C2C4, 0x4FDF_F252, 0xD1BB_67F1, 0xA6BC_5767, 0x3FB5_06DD, 0x48B2_364B, + 0xD80D_2BDA, 0xAF0A_1B4C, 0x3603_4AF6, 0x4104_7A60, 0xDF60_EFC3, 0xA867_DF55, 0x316E_8EEF, 0x4669_BE79, + 0xCB61_B38C, 0xBC66_831A, 0x256F_D2A0, 0x5268_E236, 0xCC0C_7795, 0xBB0B_4703, 0x2202_16B9, 0x5505_262F, + 0xC5BA_3BBE, 0xB2BD_0B28, 0x2BB4_5A92, 0x5CB3_6A04, 0xC2D7_FFA7, 0xB5D0_CF31, 0x2CD9_9E8B, 0x5BDE_AE1D, + 0x9B64_C2B0, 0xEC63_F226, 0x756A_A39C, 0x026D_930A, 0x9C09_06A9, 0xEB0E_363F, 0x7207_6785, 0x0500_5713, + 0x95BF_4A82, 0xE2B8_7A14, 0x7BB1_2BAE, 0x0CB6_1B38, 0x92D2_8E9B, 0xE5D5_BE0D, 0x7CDC_EFB7, 0x0BDB_DF21, + 0x86D3_D2D4, 0xF1D4_E242, 0x68DD_B3F8, 0x1FDA_836E, 0x81BE_16CD, 0xF6B9_265B, 0x6FB0_77E1, 0x18B7_4777, + 0x8808_5AE6, 0xFF0F_6A70, 0x6606_3BCA, 0x1101_0B5C, 0x8F65_9EFF, 0xF862_AE69, 0x616B_FFD3, 0x166C_CF45, + 0xA00A_E278, 0xD70D_D2EE, 0x4E04_8354, 0x3903_B3C2, 0xA767_2661, 0xD060_16F7, 0x4969_474D, 0x3E6E_77DB, + 0xAED1_6A4A, 0xD9D6_5ADC, 0x40DF_0B66, 0x37D8_3BF0, 0xA9BC_AE53, 0xDEBB_9EC5, 0x47B2_CF7F, 0x30B5_FFE9, + 0xBDBD_F21C, 0xCABA_C28A, 0x53B3_9330, 0x24B4_A3A6, 0xBAD0_3605, 0xCDD7_0693, 0x54DE_5729, 0x23D9_67BF, + 0xB366_7A2E, 0xC461_4AB8, 0x5D68_1B02, 0x2A6F_2B94, 0xB40B_BE37, 0xC30C_8EA1, 0x5A05_DF1B, 0x2D02_EF8D + ] + + @usableFromInline + static let table32c: Array = [ + 0x0000_0000, 0xF26B_8303, 0xE13B_70F7, 0x1350_F3F4, 0xC79A_971F, 0x35F1_141C, 0x26A1_E7E8, 0xD4CA_64EB, + 0x8AD9_58CF, 0x78B2_DBCC, 0x6BE2_2838, 0x9989_AB3B, 0x4D43_CFD0, 0xBF28_4CD3, 0xAC78_BF27, 0x5E13_3C24, + 0x105E_C76F, 0xE235_446C, 0xF165_B798, 0x030E_349B, 0xD7C4_5070, 0x25AF_D373, 0x36FF_2087, 0xC494_A384, + 0x9A87_9FA0, 0x68EC_1CA3, 0x7BBC_EF57, 0x89D7_6C54, 0x5D1D_08BF, 0xAF76_8BBC, 0xBC26_7848, 0x4E4D_FB4B, + 0x20BD_8EDE, 0xD2D6_0DDD, 0xC186_FE29, 0x33ED_7D2A, 0xE727_19C1, 0x154C_9AC2, 0x061C_6936, 0xF477_EA35, + 0xAA64_D611, 0x580F_5512, 0x4B5F_A6E6, 0xB934_25E5, 0x6DFE_410E, 0x9F95_C20D, 0x8CC5_31F9, 0x7EAE_B2FA, + 0x30E3_49B1, 0xC288_CAB2, 0xD1D8_3946, 0x23B3_BA45, 0xF779_DEAE, 0x0512_5DAD, 0x1642_AE59, 0xE429_2D5A, + 0xBA3A_117E, 0x4851_927D, 0x5B01_6189, 0xA96A_E28A, 0x7DA0_8661, 0x8FCB_0562, 0x9C9B_F696, 0x6EF0_7595, + 0x417B_1DBC, 0xB310_9EBF, 0xA040_6D4B, 0x522B_EE48, 0x86E1_8AA3, 0x748A_09A0, 0x67DA_FA54, 0x95B1_7957, + 0xCBA2_4573, 0x39C9_C670, 0x2A99_3584, 0xD8F2_B687, 0x0C38_D26C, 0xFE53_516F, 0xED03_A29B, 0x1F68_2198, + 0x5125_DAD3, 0xA34E_59D0, 0xB01E_AA24, 0x4275_2927, 0x96BF_4DCC, 0x64D4_CECF, 0x7784_3D3B, 0x85EF_BE38, + 0xDBFC_821C, 0x2997_011F, 0x3AC7_F2EB, 0xC8AC_71E8, 0x1C66_1503, 0xEE0D_9600, 0xFD5D_65F4, 0x0F36_E6F7, + 0x61C6_9362, 0x93AD_1061, 0x80FD_E395, 0x7296_6096, 0xA65C_047D, 0x5437_877E, 0x4767_748A, 0xB50C_F789, + 0xEB1F_CBAD, 0x1974_48AE, 0x0A24_BB5A, 0xF84F_3859, 0x2C85_5CB2, 0xDEEE_DFB1, 0xCDBE_2C45, 0x3FD5_AF46, + 0x7198_540D, 0x83F3_D70E, 0x90A3_24FA, 0x62C8_A7F9, 0xB602_C312, 0x4469_4011, 0x5739_B3E5, 0xA552_30E6, + 0xFB41_0CC2, 0x092A_8FC1, 0x1A7A_7C35, 0xE811_FF36, 0x3CDB_9BDD, 0xCEB0_18DE, 0xDDE0_EB2A, 0x2F8B_6829, + 0x82F6_3B78, 0x709D_B87B, 0x63CD_4B8F, 0x91A6_C88C, 0x456C_AC67, 0xB707_2F64, 0xA457_DC90, 0x563C_5F93, + 0x082F_63B7, 0xFA44_E0B4, 0xE914_1340, 0x1B7F_9043, 0xCFB5_F4A8, 0x3DDE_77AB, 0x2E8E_845F, 0xDCE5_075C, + 0x92A8_FC17, 0x60C3_7F14, 0x7393_8CE0, 0x81F8_0FE3, 0x5532_6B08, 0xA759_E80B, 0xB409_1BFF, 0x4662_98FC, + 0x1871_A4D8, 0xEA1A_27DB, 0xF94A_D42F, 0x0B21_572C, 0xDFEB_33C7, 0x2D80_B0C4, 0x3ED0_4330, 0xCCBB_C033, + 0xA24B_B5A6, 0x5020_36A5, 0x4370_C551, 0xB11B_4652, 0x65D1_22B9, 0x97BA_A1BA, 0x84EA_524E, 0x7681_D14D, + 0x2892_ED69, 0xDAF9_6E6A, 0xC9A9_9D9E, 0x3BC2_1E9D, 0xEF08_7A76, 0x1D63_F975, 0x0E33_0A81, 0xFC58_8982, + 0xB215_72C9, 0x407E_F1CA, 0x532E_023E, 0xA145_813D, 0x758F_E5D6, 0x87E4_66D5, 0x94B4_9521, 0x66DF_1622, + 0x38CC_2A06, 0xCAA7_A905, 0xD9F7_5AF1, 0x2B9C_D9F2, 0xFF56_BD19, 0x0D3D_3E1A, 0x1E6D_CDEE, 0xEC06_4EED, + 0xC38D_26C4, 0x31E6_A5C7, 0x22B6_5633, 0xD0DD_D530, 0x0417_B1DB, 0xF67C_32D8, 0xE52C_C12C, 0x1747_422F, + 0x4954_7E0B, 0xBB3F_FD08, 0xA86F_0EFC, 0x5A04_8DFF, 0x8ECE_E914, 0x7CA5_6A17, 0x6FF5_99E3, 0x9D9E_1AE0, + 0xD3D3_E1AB, 0x21B8_62A8, 0x32E8_915C, 0xC083_125F, 0x1449_76B4, 0xE622_F5B7, 0xF572_0643, 0x0719_8540, + 0x590A_B964, 0xAB61_3A67, 0xB831_C993, 0x4A5A_4A90, 0x9E90_2E7B, 0x6CFB_AD78, 0x7FAB_5E8C, 0x8DC0_DD8F, + 0xE330_A81A, 0x115B_2B19, 0x020B_D8ED, 0xF060_5BEE, 0x24AA_3F05, 0xD6C1_BC06, 0xC591_4FF2, 0x37FA_CCF1, + 0x69E9_F0D5, 0x9B82_73D6, 0x88D2_8022, 0x7AB9_0321, 0xAE73_67CA, 0x5C18_E4C9, 0x4F48_173D, 0xBD23_943E, + 0xF36E_6F75, 0x0105_EC76, 0x1255_1F82, 0xE03E_9C81, 0x34F4_F86A, 0xC69F_7B69, 0xD5CF_889D, 0x27A4_0B9E, + 0x79B7_37BA, 0x8BDC_B4B9, 0x988C_474D, 0x6AE7_C44E, 0xBE2D_A0A5, 0x4C46_23A6, 0x5F16_D052, 0xAD7D_5351 + ] + + @usableFromInline + static let table16: Array = [ + 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, + 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, + 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, + 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, + 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, + 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, + 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, + 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, + 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, + 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, + 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, + 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, + 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, + 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, + 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, + 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, + 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, + 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, + 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, + 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, + 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, + 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, + 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, + 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, + 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, + 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, + 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, + 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, + 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, + 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, + 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, + 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 + ] + + @usableFromInline + init() { + // + } + + /// Polynomial: 0xEDB88320 (Reversed) - IEEE + @inlinable + func crc32(_ message: Array, seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + var crc: UInt32 = seed != nil ? seed! : 0xFFFF_FFFF + for chunk in message.batched(by: 256) { + for b in chunk { + let idx = Int((crc ^ UInt32(reflect ? b : reversed(b))) & 0xFF) + crc = (crc >> 8) ^ Checksum.table32[idx] + } + } + return (reflect ? crc : reversed(crc)) ^ 0xFFFF_FFFF + } + + /// Polynomial: 0x82F63B78 (Reversed) - Castagnoli + @inlinable + func crc32c(_ message: Array, seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + var crc: UInt32 = seed != nil ? seed! : 0xFFFF_FFFF + for chunk in message.batched(by: 256) { + for b in chunk { + let idx = Int((crc ^ UInt32(reflect ? b : reversed(b))) & 0xFF) + crc = (crc >> 8) ^ Checksum.table32c[idx] + } + } + return (reflect ? crc : reversed(crc)) ^ 0xFFFF_FFFF + } + + /// Polynomial: 0xA001 (Reversed) - IBM + @inlinable + func crc16(_ message: Array, seed: UInt16? = nil) -> UInt16 { + var crc: UInt16 = seed != nil ? seed! : 0x0000 + for chunk in message.batched(by: 256) { + for b in chunk { + crc = (crc >> 8) ^ Checksum.table16[Int((crc ^ UInt16(b)) & 0xFF)] + } + } + return crc + } +} + +// MARK: Public interface + +public extension Checksum { + /// Calculate CRC32. + /// + /// - parameter message: Message + /// - parameter seed: Seed value (Optional) + /// - parameter reflect: is reflect (default true) + /// + /// - returns: Calculated code + @inlinable + static func crc32(_ message: Array, seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + Checksum().crc32(message, seed: seed, reflect: reflect) + } + + /// Calculate CRC32C + /// + /// - parameter message: Message + /// - parameter seed: Seed value (Optional) + /// - parameter reflect: is reflect (default true) + /// + /// - returns: Calculated code + @inlinable + static func crc32c(_ message: Array, seed: UInt32? = nil, reflect: Bool = true) -> UInt32 { + Checksum().crc32c(message, seed: seed, reflect: reflect) + } + + /// Calculate CRC16 + /// + /// - parameter message: Message + /// - parameter seed: Seed value (Optional) + /// + /// - returns: Calculated code + @inlinable + static func crc16(_ message: Array, seed: UInt16? = nil) -> UInt16 { + Checksum().crc16(message, seed: seed) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cipher.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cipher.swift new file mode 100644 index 00000000..bacf71b7 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cipher.swift @@ -0,0 +1,47 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public enum CipherError: Error { + case encrypt + case decrypt +} + +public protocol Cipher: AnyObject { + var keySize: Int { get } + + /// Encrypt given bytes at once + /// + /// - parameter bytes: Plaintext data + /// - returns: Encrypted data + func encrypt(_ bytes: ArraySlice) throws -> Array + func encrypt(_ bytes: Array) throws -> Array + + /// Decrypt given bytes at once + /// + /// - parameter bytes: Ciphertext data + /// - returns: Plaintext data + func decrypt(_ bytes: ArraySlice) throws -> Array + func decrypt(_ bytes: Array) throws -> Array +} + +extension Cipher { + public func encrypt(_ bytes: Array) throws -> Array { + try self.encrypt(bytes.slice) + } + + public func decrypt(_ bytes: Array) throws -> Array { + try self.decrypt(bytes.slice) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Collection+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Collection+Extension.swift new file mode 100644 index 00000000..3eb39fc9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Collection+Extension.swift @@ -0,0 +1,61 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +extension Collection where Self.Element == UInt8, Self.Index == Int { + // Big endian order + @inlinable + func toUInt32Array() -> Array { + guard !isEmpty else { + return [] + } + + let c = strideCount(from: startIndex, to: endIndex, by: 4) + return Array(unsafeUninitializedCapacity: c) { buf, count in + var counter = 0 + for idx in stride(from: startIndex, to: endIndex, by: 4) { + let val = UInt32(bytes: self, fromIndex: idx).bigEndian + buf[counter] = val + counter += 1 + } + count = counter + assert(counter == c) + } + } + + // Big endian order + @inlinable + func toUInt64Array() -> Array { + guard !isEmpty else { + return [] + } + + let c = strideCount(from: startIndex, to: endIndex, by: 8) + return Array(unsafeUninitializedCapacity: c) { buf, count in + var counter = 0 + for idx in stride(from: startIndex, to: endIndex, by: 8) { + let val = UInt64(bytes: self, fromIndex: idx).bigEndian + buf[counter] = val + counter += 1 + } + count = counter + assert(counter == c) + } + } +} + +@usableFromInline +func strideCount(from: Int, to: Int, by: Int) -> Int { + let count = to - from + return count / by + (count % by > 0 ? 1 : 0) +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CompactMap.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CompactMap.swift new file mode 100644 index 00000000..c8bac9a9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/CompactMap.swift @@ -0,0 +1,25 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if swift(>=4.1) +// TODO: remove this file when Xcode 9.2 is no longer used +#else + extension Sequence { + @inlinable + public func compactMap(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] { + try flatMap(transform) + } + } +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptor.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptor.swift new file mode 100644 index 00000000..157d0a92 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptor.swift @@ -0,0 +1,22 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// Cryptor (Encryptor or Decryptor) +public protocol Cryptor { + /// Seek to position in file, if block mode allows random access. + /// + /// - parameter to: new value of counter + mutating func seek(to: Int) throws +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptors.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptors.swift new file mode 100644 index 00000000..f5afa111 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Cryptors.swift @@ -0,0 +1,44 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#endif + +/// Worker cryptor/decryptor of `Updatable` types +public protocol Cryptors: AnyObject { + + /// Cryptor suitable for encryption + func makeEncryptor() throws -> Cryptor & Updatable + + /// Cryptor suitable for decryption + func makeDecryptor() throws -> Cryptor & Updatable + + /// Generate array of random bytes. Helper function. + static func randomIV(_ blockSize: Int) -> Array +} + +extension Cryptors { + /// Generate array of random values. + /// Convenience helper that uses `Swift.RandomNumberGenerator`. + /// - Parameter count: Length of array + public static func randomIV(_ count: Int) -> Array { + (0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@available(*, renamed: "Digest") +public typealias Hash = Digest + +/// Hash functions to calculate Digest. +public struct Digest { + /// Calculate MD5 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func md5(_ bytes: Array) -> Array { + MD5().calculate(for: bytes) + } + + /// Calculate SHA1 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func sha1(_ bytes: Array) -> Array { + SHA1().calculate(for: bytes) + } + + /// Calculate SHA2-224 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func sha224(_ bytes: Array) -> Array { + self.sha2(bytes, variant: .sha224) + } + + /// Calculate SHA2-256 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func sha256(_ bytes: Array) -> Array { + self.sha2(bytes, variant: .sha256) + } + + /// Calculate SHA2-384 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func sha384(_ bytes: Array) -> Array { + self.sha2(bytes, variant: .sha384) + } + + /// Calculate SHA2-512 Digest + /// - parameter bytes: input message + /// - returns: Digest bytes + public static func sha512(_ bytes: Array) -> Array { + self.sha2(bytes, variant: .sha512) + } + + /// Calculate SHA2 Digest + /// - parameter bytes: input message + /// - parameter variant: SHA-2 variant + /// - returns: Digest bytes + public static func sha2(_ bytes: Array, variant: SHA2.Variant) -> Array { + SHA2(variant: variant).calculate(for: bytes) + } + + /// Calculate SHA3 Digest + /// - parameter bytes: input message + /// - parameter variant: SHA-3 variant + /// - returns: Digest bytes + public static func sha3(_ bytes: Array, variant: SHA3.Variant) -> Array { + SHA3(variant: variant).calculate(for: bytes) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/DigestType.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/DigestType.swift new file mode 100644 index 00000000..9a46a01c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/DigestType.swift @@ -0,0 +1,18 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +internal protocol DigestType { + func calculate(for bytes: Array) -> Array +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/AES+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/AES+Foundation.swift new file mode 100644 index 00000000..5741a8d8 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/AES+Foundation.swift @@ -0,0 +1,32 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension AES { + /// Initialize with CBC block mode. + /// + /// - Parameters: + /// - key: Key as a String. + /// - iv: IV as a String. + /// - padding: Padding + /// - Throws: Error + /// + /// The input is a String, that is treat as sequence of bytes made directly out of String. + /// If input is Base64 encoded data (which is a String technically) it is not decoded automatically for you. + public convenience init(key: String, iv: String, padding: Padding = .pkcs7) throws { + try self.init(key: key.bytes, blockMode: CBC(iv: iv.bytes), padding: padding) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Array+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Array+Foundation.swift new file mode 100644 index 00000000..2c6837ed --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Array+Foundation.swift @@ -0,0 +1,32 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +public extension Array where Element == UInt8 { + func toBase64() -> String { + Data(self).base64EncodedString() + } + + init(base64: String) { + self.init() + + guard let decodedData = Data(base64Encoded: base64) else { + return + } + + append(contentsOf: decodedData.bytes) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Blowfish+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Blowfish+Foundation.swift new file mode 100644 index 00000000..1d40af20 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Blowfish+Foundation.swift @@ -0,0 +1,23 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension Blowfish { + /// Initialize with CBC block mode. + public convenience init(key: String, iv: String, padding: Padding = .pkcs7) throws { + try self.init(key: key.bytes, blockMode: CBC(iv: iv.bytes), padding: padding) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/ChaCha20+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/ChaCha20+Foundation.swift new file mode 100644 index 00000000..92601b63 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/ChaCha20+Foundation.swift @@ -0,0 +1,22 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension ChaCha20 { + public convenience init(key: String, iv: String) throws { + try self.init(key: key.bytes, iv: iv.bytes) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Data+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Data+Extension.swift new file mode 100644 index 00000000..6d46875e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Data+Extension.swift @@ -0,0 +1,92 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension Data { + /// Two octet checksum as defined in RFC-4880. Sum of all octets, mod 65536 + public func checksum() -> UInt16 { + let s = self.withUnsafeBytes { buf in + return buf.lazy.map(UInt32.init).reduce(UInt32(0), +) + } + return UInt16(s % 65535) + } + + public func md5() -> Data { + Data( Digest.md5(bytes)) + } + + public func sha1() -> Data { + Data( Digest.sha1(bytes)) + } + + public func sha224() -> Data { + Data( Digest.sha224(bytes)) + } + + public func sha256() -> Data { + Data( Digest.sha256(bytes)) + } + + public func sha384() -> Data { + Data( Digest.sha384(bytes)) + } + + public func sha512() -> Data { + Data( Digest.sha512(bytes)) + } + + public func sha3(_ variant: SHA3.Variant) -> Data { + Data( Digest.sha3(bytes, variant: variant)) + } + + public func crc32(seed: UInt32? = nil, reflect: Bool = true) -> Data { + Data( Checksum.crc32(bytes, seed: seed, reflect: reflect).bytes()) + } + + public func crc32c(seed: UInt32? = nil, reflect: Bool = true) -> Data { + Data( Checksum.crc32c(bytes, seed: seed, reflect: reflect).bytes()) + } + + public func crc16(seed: UInt16? = nil) -> Data { + Data( Checksum.crc16(bytes, seed: seed).bytes()) + } + + public func encrypt(cipher: Cipher) throws -> Data { + Data( try cipher.encrypt(bytes.slice)) + } + + public func decrypt(cipher: Cipher) throws -> Data { + Data( try cipher.decrypt(bytes.slice)) + } + + public func authenticate(with authenticator: Authenticator) throws -> Data { + Data( try authenticator.authenticate(bytes)) + } +} + +extension Data { + public init(hex: String) { + self.init(Array(hex: hex)) + } + + public var bytes: Array { + Array(self) + } + + public func toHexString() -> String { + self.bytes.toHexString() + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/HMAC+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/HMAC+Foundation.swift new file mode 100644 index 00000000..3f37dbd9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/HMAC+Foundation.swift @@ -0,0 +1,22 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension HMAC { + public convenience init(key: String, variant: HMAC.Variant = .md5) throws { + self.init(key: key.bytes, variant: variant) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Rabbit+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Rabbit+Foundation.swift new file mode 100644 index 00000000..2baec70f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Rabbit+Foundation.swift @@ -0,0 +1,26 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension Rabbit { + public convenience init(key: String) throws { + try self.init(key: key.bytes) + } + + public convenience init(key: String, iv: String) throws { + try self.init(key: key.bytes, iv: iv.bytes) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/String+FoundationExtension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/String+FoundationExtension.swift new file mode 100644 index 00000000..deb4ec8b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/String+FoundationExtension.swift @@ -0,0 +1,41 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +extension String { + /// Return Base64 back to String + public func decryptBase64ToString(cipher: Cipher) throws -> String { + guard let decodedData = Data(base64Encoded: self, options: []) else { + throw CipherError.decrypt + } + + let decrypted = try decodedData.decrypt(cipher: cipher) + + if let decryptedString = String(data: decrypted, encoding: String.Encoding.utf8) { + return decryptedString + } + + throw CipherError.decrypt + } + + public func decryptBase64(cipher: Cipher) throws -> Array { + guard let decodedData = Data(base64Encoded: self, options: []) else { + throw CipherError.decrypt + } + + return try decodedData.decrypt(cipher: cipher).bytes + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Utils+Foundation.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Utils+Foundation.swift new file mode 100644 index 00000000..b0ba0b48 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Foundation/Utils+Foundation.swift @@ -0,0 +1,27 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +func perf(_ text: String, closure: () -> Void) { + let measurementStart = Date() + + closure() + + let measurementStop = Date() + let executionTime = measurementStop.timeIntervalSince(measurementStart) + + print("\(text) \(executionTime)") +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Generics.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Generics.swift new file mode 100644 index 00000000..90e1722b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Generics.swift @@ -0,0 +1,43 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// Array of bytes. Caution: don't use directly because generic is slow. +/// +/// - parameter value: integer value +/// - parameter length: length of output array. By default size of value type +/// +/// - returns: Array of bytes +@_specialize(where T == Int) +@_specialize(where T == UInt) +@_specialize(where T == UInt8) +@_specialize(where T == UInt16) +@_specialize(where T == UInt32) +@_specialize(where T == UInt64) +@inlinable +func arrayOfBytes(value: T, length totalBytes: Int = MemoryLayout.size) -> Array { + let valuePointer = UnsafeMutablePointer.allocate(capacity: 1) + valuePointer.pointee = value + + let bytesPointer = UnsafeMutablePointer(OpaquePointer(valuePointer)) + var bytes = Array(repeating: 0, count: totalBytes) + for j in 0...size, totalBytes) { + bytes[totalBytes - 1 - j] = (bytesPointer + j).pointee + } + + valuePointer.deinitialize(count: 1) + valuePointer.deallocate() + + return bytes +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HKDF.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HKDF.swift new file mode 100644 index 00000000..3090d553 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HKDF.swift @@ -0,0 +1,88 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// https://www.ietf.org/rfc/rfc5869.txt +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#elseif canImport(WASILibc) +import WASILibc +#endif + +/// A key derivation function. +/// +/// HKDF - HMAC-based Extract-and-Expand Key Derivation Function. +public struct HKDF { + public enum Error: Swift.Error { + case invalidInput + case derivedKeyTooLong + } + + private let numBlocks: Int // l + private let dkLen: Int + private let info: Array + private let prk: Array + private let variant: HMAC.Variant + + /// - parameters: + /// - variant: hash variant + /// - salt: optional salt (if not provided, it is set to a sequence of variant.digestLength zeros) + /// - info: optional context and application specific information + /// - keyLength: intended length of derived key + public init(password: Array, salt: Array? = nil, info: Array? = nil, keyLength: Int? = nil /* dkLen */, variant: HMAC.Variant = .sha2(.sha256)) throws { + guard !password.isEmpty else { + throw Error.invalidInput + } + + let dkLen = keyLength ?? variant.digestLength + let keyLengthFinal = Double(dkLen) + let hLen = Double(variant.digestLength) + let numBlocks = Int(ceil(keyLengthFinal / hLen)) // l = ceil(keyLength / hLen) + guard numBlocks <= 255 else { + throw Error.derivedKeyTooLong + } + + /// HKDF-Extract(salt, password) -> PRK + /// - PRK - a pseudo-random key; it is used by calculate() + self.prk = try HMAC(key: salt ?? [], variant: variant).authenticate(password) + self.info = info ?? [] + self.variant = variant + self.dkLen = dkLen + self.numBlocks = numBlocks + } + + public func calculate() throws -> Array { + let hmac = HMAC(key: prk, variant: variant) + var ret = Array() + ret.reserveCapacity(self.numBlocks * self.variant.digestLength) + var value = Array() + for i in 1...self.numBlocks { + value.append(contentsOf: self.info) + value.append(UInt8(i)) + + let bytes = try hmac.authenticate(value) + ret.append(contentsOf: bytes) + + /// update value to use it as input for next iteration + value = bytes + } + return Array(ret.prefix(self.dkLen)) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HMAC.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HMAC.swift new file mode 100644 index 00000000..59e7f4fe --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/HMAC.swift @@ -0,0 +1,124 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public final class HMAC: Authenticator { + public enum Error: Swift.Error { + case authenticateError + case invalidInput + } + + public enum Variant { + case md5 + case sha1 + case sha2(SHA2.Variant) + case sha3(SHA3.Variant) + + @available(*, deprecated, message: "Use sha2(variant) instead.") + case sha256, sha384, sha512 + + var digestLength: Int { + switch self { + case .sha1: + return SHA1.digestLength + case .sha256: + return SHA2.Variant.sha256.digestLength + case .sha384: + return SHA2.Variant.sha384.digestLength + case .sha512: + return SHA2.Variant.sha512.digestLength + case .sha2(let variant): + return variant.digestLength + case .sha3(let variant): + return variant.digestLength + case .md5: + return MD5.digestLength + } + } + + func calculateHash(_ bytes: Array) -> Array { + switch self { + case .sha1: + return Digest.sha1(bytes) + case .sha256: + return Digest.sha256(bytes) + case .sha384: + return Digest.sha384(bytes) + case .sha512: + return Digest.sha512(bytes) + case .sha2(let variant): + return Digest.sha2(bytes, variant: variant) + case .sha3(let variant): + return Digest.sha3(bytes, variant: variant) + case .md5: + return Digest.md5(bytes) + } + } + + func blockSize() -> Int { + switch self { + case .md5: + return MD5.blockSize + case .sha1: + return SHA1.blockSize + case .sha256: + return SHA2.Variant.sha256.blockSize + case .sha384: + return SHA2.Variant.sha384.blockSize + case .sha512: + return SHA2.Variant.sha512.blockSize + case .sha2(let variant): + return variant.blockSize + case .sha3(let variant): + return variant.blockSize + } + } + } + + var key: Array + let variant: Variant + + public init(key: Array, variant: HMAC.Variant = .md5) { + self.variant = variant + self.key = key + + if key.count > variant.blockSize() { + let hash = variant.calculateHash(key) + self.key = hash + } + + if key.count < variant.blockSize() { + self.key = ZeroPadding().add(to: key, blockSize: variant.blockSize()) + } + } + + // MARK: Authenticator + + public func authenticate(_ bytes: Array) throws -> Array { + var opad = Array(repeating: 0x5c, count: variant.blockSize()) + for idx in self.key.indices { + opad[idx] = self.key[idx] ^ opad[idx] + } + var ipad = Array(repeating: 0x36, count: variant.blockSize()) + for idx in self.key.indices { + ipad[idx] = self.key[idx] ^ ipad[idx] + } + + let ipadAndMessageHash = self.variant.calculateHash(ipad + bytes) + let result = self.variant.calculateHash(opad + ipadAndMessageHash) + + // return Array(result[0..<10]) // 80 bits + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ISO10126Padding.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ISO10126Padding.swift new file mode 100644 index 00000000..8aebd114 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ISO10126Padding.swift @@ -0,0 +1,56 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +/// Padding with random bytes, ending with the number of added bytes. +/// Read the [Wikipedia](https://en.wikipedia.org/wiki/Padding_(cryptography)#ISO_10126) +/// and [Crypto-IT](http://www.crypto-it.net/eng/theory/padding.html) articles for more info. +struct ISO10126Padding: PaddingProtocol { + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + let padding = UInt8(blockSize - (bytes.count % blockSize)) + var withPadding = bytes + if padding > 0 { + withPadding += (0..<(padding - 1)).map { _ in UInt8.random(in: 0...255) } + [padding] + } + return withPadding + } + + @inlinable + func remove(from bytes: Array, blockSize: Int?) -> Array { + guard !bytes.isEmpty, let lastByte = bytes.last else { + return bytes + } + + assert(!bytes.isEmpty, "Need bytes to remove padding") + + let padding = Int(lastByte) // last byte + let finalLength = bytes.count - padding + + if finalLength < 0 { + return bytes + } + + if padding >= 1 { + return Array(bytes[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +// First byte is 0x80, rest is zero padding +// http://www.crypto-it.net/eng/theory/padding.html +// http://www.embedx.com/pdfs/ISO_STD_7816/info_isoiec7816-4%7Bed21.0%7Den.pdf +struct ISO78164Padding: PaddingProtocol { + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + var padded = Array(bytes) + padded.append(0x80) + + while (padded.count % blockSize) != 0 { + padded.append(0x00) + } + return padded + } + + @inlinable + func remove(from bytes: Array, blockSize _: Int?) -> Array { + if let idx = bytes.lastIndex(of: 0x80) { + return Array(bytes[.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#endif + +extension FixedWidthInteger { + @inlinable + func bytes(totalBytes: Int = MemoryLayout.size) -> Array { + arrayOfBytes(value: self.littleEndian, length: totalBytes) + // TODO: adjust bytes order + // var value = self.littleEndian + // return withUnsafeBytes(of: &value, Array.init).reversed() + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/MD5.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/MD5.swift new file mode 100644 index 00000000..40adc75c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/MD5.swift @@ -0,0 +1,161 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public final class MD5: DigestType { + static let blockSize: Int = 64 + static let digestLength: Int = 16 // 128 / 8 + fileprivate static let hashInitialValue: Array = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476] + + fileprivate var accumulated = Array() + fileprivate var processedBytesTotalCount: Int = 0 + fileprivate var accumulatedHash: Array = MD5.hashInitialValue + + /** specifies the per-round shift amounts */ + private let s: Array = [ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + ] + + /** binary integer part of the sines of integers (Radians) */ + private let k: Array = [ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + ] + + public init() { + } + + public func calculate(for bytes: Array) -> Array { + do { + return try update(withBytes: bytes.slice, isLast: true) + } catch { + fatalError() + } + } + + // mutating currentHash in place is way faster than returning new result + fileprivate func process(block chunk: ArraySlice, currentHash: inout Array) { + assert(chunk.count == 16 * 4) + + // Initialize hash value for this chunk: + var A: UInt32 = currentHash[0] + var B: UInt32 = currentHash[1] + var C: UInt32 = currentHash[2] + var D: UInt32 = currentHash[3] + + var dTemp: UInt32 = 0 + + // Main loop + for j in 0.., isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + if isLast { + let lengthInBits = (processedBytesTotalCount + self.accumulated.count) * 8 + let lengthBytes = lengthInBits.bytes(totalBytes: 64 / 8) // A 64-bit representation of b + + // Step 1. Append padding + bitPadding(to: &self.accumulated, blockSize: MD5.blockSize, allowance: 64 / 8) + + // Step 2. Append Length a 64-bit representation of lengthInBits + self.accumulated += lengthBytes.reversed() + } + + var processedBytes = 0 + for chunk in self.accumulated.batched(by: MD5.blockSize) { + if isLast || (self.accumulated.count - processedBytes) >= MD5.blockSize { + self.process(block: chunk, currentHash: &self.accumulatedHash) + processedBytes += chunk.count + } + } + self.accumulated.removeFirst(processedBytes) + self.processedBytesTotalCount += processedBytes + + // output current hash + var result = Array() + result.reserveCapacity(MD5.digestLength) + + for hElement in self.accumulatedHash { + let hLE = hElement.littleEndian + result += Array(arrayLiteral: UInt8(hLE & 0xff), UInt8((hLE >> 8) & 0xff), UInt8((hLE >> 16) & 0xff), UInt8((hLE >> 24) & 0xff)) + } + + // reset hash value for instance + if isLast { + self.accumulatedHash = MD5.hashInitialValue + } + + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/NoPadding.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/NoPadding.swift new file mode 100644 index 00000000..d231e5f9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/NoPadding.swift @@ -0,0 +1,27 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +struct NoPadding: PaddingProtocol { + init() { + } + + func add(to data: Array, blockSize _: Int) -> Array { + data + } + + func remove(from data: Array, blockSize _: Int?) -> Array { + data + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Operators.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Operators.swift new file mode 100644 index 00000000..4128b564 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Operators.swift @@ -0,0 +1,32 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/* + Bit shifting with overflow protection using overflow operator "&". + Approach is consistent with standard overflow operators &+, &-, &*, &/ + and introduce new overflow operators for shifting: &<<, &>> + + Note: Works with unsigned integers values only + + Usage + + var i = 1 // init + var j = i &<< 2 //shift left + j &<<= 2 //shift left and assign + + @see: https://medium.com/@krzyzanowskim/swiftly-shift-bits-and-protect-yourself-be33016ce071 + + This fuctonality is now implemented as part of Swift 3, SE-0104 https://github.com/apple/swift-evolution/blob/master/proposals/0104-improved-integers.md + */ diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PEM/DER.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PEM/DER.swift new file mode 100644 index 00000000..54545a35 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PEM/DER.swift @@ -0,0 +1,90 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +/// Conform to this protocol if your type can both be instantiated and expressed as an ASN1 DER representation. +internal protocol DERCodable: DERDecodable, DEREncodable { } + +/// Conform to this protocol if your type can be instantiated from a ASN1 DER representation +internal protocol DERDecodable { + /// Attempts to instantiate an instance of your Public Key when given a DER representation of your Public Key + /// + /// - Parameter publicDER: The ASN.1 DER representation of your Public Key + init(publicDER: Array) throws + + /// Attempts to instantiate an instance of your Private Key when given a DER representation of your Private Key + /// + /// - Parameter privateDER: The ASN.1 DER representation of your Private Key + init(privateDER: Array) throws + + /// Attempts to instantiate a Key when given the ASN1 DER encoded external representation of the Key + /// + /// - Parameter rawRepresentation: The ASN1 DER Encoded external representation (either public or private) + /// - Note: The external representation is identical to that of `SecKeyCopyExternalRepresentation` function from Apple's `Security` framework + init(rawRepresentation: Data) throws +} + +/// Conform to this protocol if your type can be described in an ASN1 DER representation +internal protocol DEREncodable { + /// Returns the DER encoded representation of the Public Key + func publicKeyDER() throws -> Array + + /// Returns the DER encoded representation of the Private Key + func privateKeyDER() throws -> Array + + /// A semantically similar function that mimics the `SecKeyCopyExternalRepresentation` function from Apple's `Security` framework + /// - Note: If called on a Private Key, this method will return the Private Keys DER Representation. Likewise, if called on a Public Key, this method will return the Public Keys DER Representation + /// - Note: If you'd like to export the Public Keys DER from a Private Key, use the `publicKeyExternalRepresentation()` function + func externalRepresentation() throws -> Data + + /// A semantically similar function that mimics the `SecKeyCopyExternalRepresentation` function from Apple's `Security` framework + /// - Note: This function only ever exports the Public Key's DER representation. If called on a Private Key, the corresponding Public Key will be extracted and exported. + func publicKeyExternalRepresentation() throws -> Data +} + +struct DER { + internal enum Error: Swift.Error { + /// We were provided invalid DER data + case invalidDERFormat + } + + /// Integer to Octet String Primitive + /// - Parameters: + /// - x: nonnegative integer to be converted + /// - size: intended length of the resulting octet string + /// - Returns: corresponding octet string of length xLen + /// - Note: https://datatracker.ietf.org/doc/html/rfc3447#section-4.1 + internal static func i2osp(x: [UInt8], size: Int) -> [UInt8] { + var modulus = x + while modulus.count < size { + modulus.insert(0x00, at: 0) + } + if modulus[0] >= 0x80 { + modulus.insert(0x00, at: 0) + } + return modulus + } + + /// Integer to Octet String Primitive + /// - Parameters: + /// - x: nonnegative integer to be converted + /// - size: intended length of the resulting octet string + /// - Returns: corresponding octet string of length xLen + /// - Note: https://datatracker.ietf.org/doc/html/rfc3447#section-4.1 + internal static func i2ospData(x: [UInt8], size: Int) -> Data { + return Data(DER.i2osp(x: x, size: size)) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PBKDF1.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PBKDF1.swift new file mode 100644 index 00000000..33127f76 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PBKDF1.swift @@ -0,0 +1,97 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public extension PKCS5 { + /// A key derivation function. + /// + /// PBKDF1 is recommended only for compatibility with existing + /// applications since the keys it produces may not be large enough for + /// some applications. + struct PBKDF1 { + public enum Error: Swift.Error { + case invalidInput + case derivedKeyTooLong + } + + public enum Variant { + case md5, sha1 + + @usableFromInline + var size: Int { + switch self { + case .md5: + return MD5.digestLength + case .sha1: + return SHA1.digestLength + } + } + + @usableFromInline + func calculateHash(_ bytes: Array) -> Array { + switch self { + case .sha1: + return Digest.sha1(bytes) + case .md5: + return Digest.md5(bytes) + } + } + } + + @usableFromInline + let iterations: Int // c + + @usableFromInline + let variant: Variant + + @usableFromInline + let keyLength: Int + + @usableFromInline + let t1: Array + + /// - parameters: + /// - salt: salt, an eight-bytes + /// - variant: hash variant + /// - iterations: iteration count, a positive integer + /// - keyLength: intended length of derived key + public init(password: Array, salt: Array, variant: Variant = .sha1, iterations: Int = 4096 /* c */, keyLength: Int? = nil /* dkLen */ ) throws { + precondition(iterations > 0) + precondition(salt.count == 8) + + let keyLength = keyLength ?? variant.size + + if keyLength > variant.size { + throw Error.derivedKeyTooLong + } + + let t1 = variant.calculateHash(password + salt) + + self.iterations = iterations + self.variant = variant + self.keyLength = keyLength + self.t1 = t1 + } + + /// Apply the underlying hash function Hash for c iterations + @inlinable + public func calculate() -> Array { + var t = self.t1 + for _ in 2...self.iterations { + t = self.variant.calculateHash(t) + } + return Array(t[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// https://www.ietf.org/rfc/rfc2898.txt +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#elseif canImport(WASILibc) +import WASILibc +#endif + +public extension PKCS5 { + /// A key derivation function. + /// + /// PBKDF2 - Password-Based Key Derivation Function 2. Key stretching technique. + /// DK = PBKDF2(PRF, Password, Salt, c, dkLen) + struct PBKDF2 { + public enum Error: Swift.Error { + case invalidInput + case derivedKeyTooLong + } + + private let salt: Array // S + fileprivate let iterations: Int // c + private let numBlocks: Int // l + private let dkLen: Int + fileprivate let prf: HMAC + + /// - parameters: + /// - salt: salt + /// - variant: hash variant + /// - iterations: iteration count, a positive integer + /// - keyLength: intended length of derived key + /// - variant: MAC variant. Defaults to SHA256 + public init(password: Array, salt: Array, iterations: Int = 4096 /* c */, keyLength: Int? = nil /* dkLen */, variant: HMAC.Variant = .sha2(.sha256)) throws { + precondition(iterations > 0) + + let prf = HMAC(key: password, variant: variant) + + guard iterations > 0 && !salt.isEmpty else { + throw Error.invalidInput + } + + self.dkLen = keyLength ?? variant.digestLength + let keyLengthFinal = Double(dkLen) + let hLen = Double(prf.variant.digestLength) + if keyLengthFinal > (pow(2, 32) - 1) * hLen { + throw Error.derivedKeyTooLong + } + + self.salt = salt + self.iterations = iterations + self.prf = prf + + self.numBlocks = Int(ceil(Double(keyLengthFinal) / hLen)) // l = ceil(keyLength / hLen) + } + + public func calculate() throws -> Array { + var ret = Array() + ret.reserveCapacity(self.numBlocks * self.prf.variant.digestLength) + for i in 1...self.numBlocks { + // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter + if let value = try calculateBlock(self.salt, blockNum: i) { + ret.append(contentsOf: value) + } + } + return Array(ret.prefix(self.dkLen)) + } + } +} + +private extension PKCS5.PBKDF2 { + func ARR(_ i: Int) -> Array { + var inti = Array(repeating: 0, count: 4) + inti[0] = UInt8((i >> 24) & 0xff) + inti[1] = UInt8((i >> 16) & 0xff) + inti[2] = UInt8((i >> 8) & 0xff) + inti[3] = UInt8(i & 0xff) + return inti + } + + // F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c + // U_1 = PRF (P, S || INT (i)) + func calculateBlock(_ salt: Array, blockNum: Int) throws -> Array? { + guard let u1 = try? prf.authenticate(salt + ARR(blockNum)) else { // blockNum.bytes() is slower + return nil + } + + var u = u1 + var ret = u + if iterations > 1 { + // U_2 = PRF (P, U_1) , + // U_c = PRF (P, U_{c-1}) . + for _ in 2...iterations { + u = try prf.authenticate(u) + for x in 0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// PKCS is a group of public-key cryptography standards devised +// and published by RSA Security Inc, starting in the early 1990s. +// + +/// EMSA PKCS1 v1.5 Padding Scheme +/// +/// The EMSA Version of the PKCS1 v1.5 padding scheme is **deterministic** (it pads the messages contents with 255 value bytes) +/// ``` +/// // The returned structure +/// // - PS is the applied padding +/// // - M is your original Message +/// EM = 0x00 || 0x01 || PS || 0x00 || M. +/// ``` +/// - Note: This Padding scheme is intended to be used for encoding RSA Signatures +/// +/// [EMSA-PKCS1v1_5 IETF Spec](https://datatracker.ietf.org/doc/html/rfc8017#section-9.2) +struct EMSAPKCS1v15Padding: PaddingProtocol { + + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + var r = blockSize - ((bytes.count + 3) % blockSize) + if r <= 0 { r = blockSize - 3 } + + return [0x00, 0x01] + Array(repeating: 0xFF, count: r) + [0x00] + bytes + } + + @inlinable + func remove(from bytes: Array, blockSize _: Int?) -> Array { + assert(!bytes.isEmpty, "Need bytes to remove padding") + + assert(bytes.prefix(2) == [0x00, 0x01], "Invalid padding prefix") + + guard let paddingLength = bytes.dropFirst(2).firstIndex(of: 0x00) else { return bytes } + + guard (paddingLength + 1) <= bytes.count else { return bytes } + + return Array(bytes[(paddingLength + 1)...]) + } +} + +/// EME PKCS1 v1.5 Padding Scheme +/// +/// The EME Version of the PKCS1 v1.5 padding scheme is **non deterministic** (it pads the messages contents with psuedo-random bytes) +/// ``` +/// // The returned structure +/// // - PS is the applied padding +/// // - M is your original Message +/// EM = 0x00 || 0x02 || PS || 0x00 || M. +/// ``` +/// - Note: This Padding scheme is intended to be used for encoding messages before RSA Encryption +/// +/// [EME-PKCS1v1_5 IETF Spec](https://datatracker.ietf.org/doc/html/rfc8017#section-7.2.1) +struct EMEPKCS1v15Padding: PaddingProtocol { + + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + var r = blockSize - ((bytes.count + 3) % blockSize) + if r <= 0 { r = blockSize - 3 } + + return [0x00, 0x02] + (0.., blockSize _: Int?) -> Array { + assert(!bytes.isEmpty, "Need bytes to remove padding") + + assert(bytes.prefix(2) == [0x00, 0x02], "Invalid padding prefix") + + guard let paddingLength = bytes.dropFirst(2).firstIndex(of: 0x00) else { return bytes } + + guard (paddingLength + 1) <= bytes.count else { return bytes } + + return Array(bytes[(paddingLength + 1)...]) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS5.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS5.swift new file mode 100644 index 00000000..80865952 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS5.swift @@ -0,0 +1,22 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// PKCS is a group of public-key cryptography standards devised +// and published by RSA Security Inc, starting in the early 1990s. +// + +public enum PKCS5 { + typealias Padding = PKCS7Padding +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7.swift new file mode 100644 index 00000000..b5fd83f6 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7.swift @@ -0,0 +1,18 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public enum PKCS7 { + typealias Padding = PKCS7Padding +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7Padding.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7Padding.swift new file mode 100644 index 00000000..85735852 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/PKCS/PKCS7Padding.swift @@ -0,0 +1,62 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// PKCS is a group of public-key cryptography standards devised +// and published by RSA Security Inc, starting in the early 1990s. +// + +struct PKCS7Padding: PaddingProtocol { + enum Error: Swift.Error { + case invalidPaddingValue + } + + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + let padding = UInt8(blockSize - (bytes.count % blockSize)) + var withPadding = bytes + if padding == 0 { + // If the original data is a multiple of N bytes, then an extra block of bytes with value N is added. + withPadding += Array(repeating: UInt8(blockSize), count: Int(blockSize)) + } else { + // The value of each added byte is the number of bytes that are added + withPadding += Array(repeating: padding, count: Int(padding)) + } + return withPadding + } + + @inlinable + func remove(from bytes: Array, blockSize _: Int?) -> Array { + guard !bytes.isEmpty, let lastByte = bytes.last else { + return bytes + } + + assert(!bytes.isEmpty, "Need bytes to remove padding") + + let padding = Int(lastByte) // last byte + let finalLength = bytes.count - padding + + if finalLength < 0 { + return bytes + } + + if padding >= 1 { + return Array(bytes[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public protocol PaddingProtocol { + func add(to: Array, blockSize: Int) -> Array + func remove(from: Array, blockSize: Int?) -> Array +} + +public enum Padding: PaddingProtocol { + case noPadding, zeroPadding, pkcs7, pkcs5, eme_pkcs1v15, emsa_pkcs1v15, iso78164, iso10126 + + public func add(to: Array, blockSize: Int) -> Array { + switch self { + case .noPadding: + return to // NoPadding().add(to: to, blockSize: blockSize) + case .zeroPadding: + return ZeroPadding().add(to: to, blockSize: blockSize) + case .pkcs7: + return PKCS7.Padding().add(to: to, blockSize: blockSize) + case .pkcs5: + return PKCS5.Padding().add(to: to, blockSize: blockSize) + case .eme_pkcs1v15: + return EMEPKCS1v15Padding().add(to: to, blockSize: blockSize) + case .emsa_pkcs1v15: + return EMSAPKCS1v15Padding().add(to: to, blockSize: blockSize) + case .iso78164: + return ISO78164Padding().add(to: to, blockSize: blockSize) + case .iso10126: + return ISO10126Padding().add(to: to, blockSize: blockSize) + } + } + + public func remove(from: Array, blockSize: Int?) -> Array { + switch self { + case .noPadding: + return from //NoPadding().remove(from: from, blockSize: blockSize) + case .zeroPadding: + return ZeroPadding().remove(from: from, blockSize: blockSize) + case .pkcs7: + return PKCS7.Padding().remove(from: from, blockSize: blockSize) + case .pkcs5: + return PKCS5.Padding().remove(from: from, blockSize: blockSize) + case .eme_pkcs1v15: + return EMEPKCS1v15Padding().remove(from: from, blockSize: blockSize) + case .emsa_pkcs1v15: + return EMSAPKCS1v15Padding().remove(from: from, blockSize: blockSize) + case .iso78164: + return ISO78164Padding().remove(from: from, blockSize: blockSize) + case .iso10126: + return ISO10126Padding().remove(from: from, blockSize: blockSize) + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Poly1305.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Poly1305.swift new file mode 100644 index 00000000..a1f35291 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Poly1305.swift @@ -0,0 +1,165 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04#section-4 +// nacl/crypto_onetimeauth/poly1305/ref/auth.c +// +/// Poly1305 takes a 32-byte, one-time key and a message and produces a 16-byte tag that authenticates the +/// message such that an attacker has a negligible chance of producing a valid tag for an inauthentic message. + +public final class Poly1305: Authenticator { + public enum Error: Swift.Error { + case authenticateError + } + + public static let blockSize: Int = 16 + + private let key: SecureBytes + + /// - parameter key: 32-byte key + public init(key: Array) { + self.key = SecureBytes(bytes: key) + } + + private func squeeze(h: inout Array) { + assert(h.count == 17) + var u: UInt32 = 0 + for j in 0..<16 { + u = u &+ h[j] + h[j] = u & 255 + u = u >> 8 + } + + u = u &+ h[16] + h[16] = u & 3 + u = 5 * (u >> 2) + + for j in 0..<16 { + u = u &+ h[j] + h[j] = u & 255 + u = u >> 8 + } + + u = u &+ h[16] + h[16] = u + } + + private func add(h: inout Array, c: Array) { + assert(h.count == 17 && c.count == 17) + + var u: UInt32 = 0 + for j in 0..<17 { + u = u &+ (h[j] &+ c[j]) + h[j] = u & 255 + u = u >> 8 + } + } + + private func mulmod(h: inout Array, r: Array) { + var hr = Array(repeating: 0, count: 17) + var u: UInt32 = 0 + for i in 0..<17 { + u = 0 + for j in 0...i { + u = u &+ (h[j] * r[i &- j]) + } + for j in (i + 1)..<17 { + u = u &+ (320 * h[j] * r[i &+ 17 &- j]) + } + hr[i] = u + } + h = hr + self.squeeze(h: &h) + } + + private func freeze(h: inout Array) { + let horig = h + self.add(h: &h, c: [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252]) + let negative = UInt32(bitPattern: -Int32(h[16] >> 7)) + for j in 0..<17 { + h[j] ^= negative & (horig[j] ^ h[j]) + } + } + + /// the key is partitioned into two parts, called "r" and "s" + fileprivate func onetimeauth(message input: Array, key k: Array) -> Array { + // clamp + var r = Array(repeating: 0, count: 17) + var h = Array(repeating: 0, count: 17) + var c = Array(repeating: 0, count: 17) + + r[0] = UInt32(k[0]) + r[1] = UInt32(k[1]) + r[2] = UInt32(k[2]) + r[3] = UInt32(k[3] & 15) + r[4] = UInt32(k[4] & 252) + r[5] = UInt32(k[5]) + r[6] = UInt32(k[6]) + r[7] = UInt32(k[7] & 15) + r[8] = UInt32(k[8] & 252) + r[9] = UInt32(k[9]) + r[10] = UInt32(k[10]) + r[11] = UInt32(k[11] & 15) + r[12] = UInt32(k[12] & 252) + r[13] = UInt32(k[13]) + r[14] = UInt32(k[14]) + r[15] = UInt32(k[15] & 15) + r[16] = 0 + + var inlen = input.count + var inpos = 0 + while inlen > 0 { + for j in 0..) throws -> Array { + self.onetimeauth(message: bytes, key: Array(self.key)) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA+Cipher.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA+Cipher.swift new file mode 100644 index 00000000..d6983d71 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA+Cipher.swift @@ -0,0 +1,136 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +// MARK: Cipher + +extension RSA: Cipher { + + @inlinable + public func encrypt(_ bytes: ArraySlice) throws -> Array { + return try self.encrypt(Array(bytes), variant: .pksc1v15) + } + + @inlinable + public func encrypt(_ bytes: Array, variant: RSAEncryptionVariant) throws -> Array { + // Prepare the data for the specified variant + let preparedData = try variant.prepare(bytes, blockSize: self.keySizeBytes) + + // Encrypt the prepared data + return try variant.formatEncryptedBytes(self.encryptPreparedBytes(preparedData), blockSize: self.keySizeBytes) + } + + @inlinable + internal func encryptPreparedBytes(_ bytes: Array) throws -> Array { + // Calculate encrypted data + return BigUInteger(Data(bytes)).power(self.e, modulus: self.n).serialize().bytes + } + + @inlinable + public func decrypt(_ bytes: ArraySlice) throws -> Array { + return try self.decrypt(Array(bytes), variant: .pksc1v15) + } + + @inlinable + public func decrypt(_ bytes: Array, variant: RSAEncryptionVariant) throws -> Array { + // Decrypt the data + let decrypted = try self.decryptPreparedBytes(bytes) + + // Remove padding / unstructure data and return the raw plaintext + return variant.removePadding(decrypted, blockSize: self.keySizeBytes) + } + + @inlinable + internal func decryptPreparedBytes(_ bytes: Array) throws -> Array { + // Check for Private Exponent presence + guard let d = d else { throw RSA.Error.noPrivateKey } + + // Calculate decrypted data + return BigUInteger(Data(bytes)).power(d, modulus: self.n).serialize().bytes + } +} + +extension RSA { + /// RSA Encryption Block Types + /// - [RFC2313 8.1 - Encryption block formatting](https://datatracker.ietf.org/doc/html/rfc2313#section-8.1) + public enum RSAEncryptionVariant { + /// The `unsafe` encryption variant, is fully deterministic and doesn't format the inbound data in any way. + /// + /// - Warning: This is considered an unsafe method of encryption. + case unsafe + /// The `raw` encryption variant formats the inbound data with a deterministic padding scheme. + /// + /// - Warning: This is also considered to be an unsafe method of encryption, but matches the `Security` frameworks functionality. + case raw + /// The `pkcs1v15` encryption variant formats the inbound data with a non deterministic pseudo random padding scheme. + /// + /// [EME PKCS1v1.5 Padding Scheme Spec](https://datatracker.ietf.org/doc/html/rfc2313#section-8.1) + case pksc1v15 + + @inlinable + internal func prepare(_ bytes: Array, blockSize: Int) throws -> Array { + switch self { + case .unsafe: + return bytes + case .raw: + // We need at least 11 bytes of padding in order to safely encrypt messages + // - block types 1 and 2 have this minimum padding requirement, block type 0 isn't specified, but we enforce the minimum padding length here to be safe. + guard blockSize >= bytes.count + 11 else { throw RSA.Error.invalidMessageLengthForEncryption } + return Array(repeating: 0x00, count: blockSize - bytes.count) + bytes + case .pksc1v15: + // The `Security` framework refuses to encrypt a zero byte message using the pkcs1v15 padding scheme, so we do the same + guard !bytes.isEmpty else { throw RSA.Error.invalidMessageLengthForEncryption } + // We need at least 11 bytes of random padding in order to safely encrypt messages (RFC2313 Section 8.1 - Note 6) + guard blockSize >= bytes.count + 11 else { throw RSA.Error.invalidMessageLengthForEncryption } + return Padding.eme_pkcs1v15.add(to: bytes, blockSize: blockSize) + @unknown default: + assertionFailure() + return [UInt8](repeating: UInt8.random(in: 0.., blockSize: Int) -> Array { + switch self { + case .unsafe: + return bytes + case .raw, .pksc1v15: + // Format the encrypted bytes before returning + return Array(repeating: 0x00, count: blockSize - bytes.count) + bytes + @unknown default: + assertionFailure() + return [UInt8](repeating: UInt8.random(in: 0.., blockSize: Int) -> Array { + switch self { + case .unsafe: + return bytes + case .raw: + return bytes + case .pksc1v15: + // Convert the Octet String into an Integer Primitive using the BigInteger `serialize` method + // (this effectively just prefixes the data with a 0x00 byte indicating that its a positive integer) + return Padding.eme_pkcs1v15.remove(from: [0x00] + bytes, blockSize: blockSize) + @unknown default: + assertionFailure() + return [UInt8](repeating: UInt8.random(in: 0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +// MARK: Signatures & Verification + +extension RSA: Signature { + public func sign(_ bytes: ArraySlice) throws -> Array { + try self.sign(Array(bytes), variant: .message_pkcs1v15_SHA256) + } + + /// Signs the data using the Private key and the specified signature variant + /// - Parameters: + /// - bytes: The data to be signed + /// - variant: The variant to use (`digest` variants expect a pre-hashed digest matching that of the specified hash function, `message` variants will hash the data using the specified hash function before signing it) + /// - Returns: The signature of the data + public func sign(_ bytes: Array, variant: SignatureVariant) throws -> Array { + // Check for Private Exponent presence + guard let d = d else { throw RSA.Error.noPrivateKey } + + // Hash & Encode Message + let hashedAndEncoded = try RSA.hashedAndEncoded(bytes, variant: variant, keySizeInBytes: self.keySizeBytes) + + /// Calculate the Signature + let signedData = BigUInteger(Data(hashedAndEncoded)).power(d, modulus: self.n).serialize().bytes + + return variant.formatSignedBytes(signedData, blockSize: self.keySizeBytes) + } + + public func verify(signature: ArraySlice, for expectedData: ArraySlice) throws -> Bool { + try self.verify(signature: Array(signature), for: Array(expectedData), variant: .message_pkcs1v15_SHA256) + } + + /// Verifies whether a Signature is valid for the provided data + /// - Parameters: + /// - signature: The signature to verify + /// - expectedData: The original data that you expected to have been signed + /// - variant: The variant used to sign the data + /// - Returns: `True` when the signature is valid for the expected data, `False` otherwise. + /// + /// [IETF Verification Spec](https://datatracker.ietf.org/doc/html/rfc8017#section-8.2.2) + public func verify(signature: Array, for bytes: Array, variant: SignatureVariant) throws -> Bool { + /// Step 1: Ensure the signature is the same length as the key's modulus + guard signature.count == self.keySizeBytes else { throw Error.invalidSignatureLength } + + /// Prepare the expected message for signature comparison + var expectedData = try RSA.hashedAndEncoded(bytes, variant: variant, keySizeInBytes: self.keySizeBytes) + if expectedData.count == self.keySizeBytes && expectedData.prefix(1) == [0x00] { expectedData = Array(expectedData.dropFirst()) } + + /// Step 2: 'Decrypt' the signature + let signatureResult = BigUInteger(Data(signature)).power(self.e, modulus: self.n).serialize().bytes + + /// Step 3: Compare the 'decrypted' signature with the prepared / encoded expected message.... + guard signatureResult == expectedData else { return false } + + return true + } + + /// Hashes and Encodes a message for signing and verifying + /// + /// - Note: [EMSA-PKCS1-v1_5](https://datatracker.ietf.org/doc/html/rfc8017#section-9.2) + fileprivate static func hashedAndEncoded(_ bytes: [UInt8], variant: SignatureVariant, keySizeInBytes: Int) throws -> Array { + /// 1. Apply the hash function to the message M to produce a hash + let hashedMessage = variant.calculateHash(bytes) + + guard variant.enforceLength(hashedMessage, keySizeInBytes: keySizeInBytes) else { throw RSA.Error.invalidMessageLengthForSigning } + + /// 2. Encode the algorithm ID for the hash function and the hash value into an ASN.1 value of type DigestInfo + /// PKCS#1_15 DER Structure (OID == sha256WithRSAEncryption) + let t = variant.encode(hashedMessage) + + if case .raw = variant { return t } + + /// 3. If emLen < tLen + 11, output "intended encoded message length too short" and stop + if keySizeInBytes < t.count + 11 { throw RSA.Error.invalidMessageLengthForSigning } + + /// 4. Generate an octet string PS consisting of emLen - tLen - 3 + /// octets with hexadecimal value 0xff. The length of PS will be + /// at least 8 octets. + /// 5. Concatenate PS, the DER encoding T, and other padding to form + /// the encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T. + let padded = variant.pad(bytes: t, to: keySizeInBytes) + + /// Ensure the signature is of the correct length + guard padded.count == keySizeInBytes else { throw RSA.Error.invalidMessageLengthForSigning } + + return padded + } +} + +extension RSA { + public enum SignatureVariant { + /// rsaSignatureRaw + case raw + /// Hashes the raw message using MD5 before signing the data + case message_pkcs1v15_MD5 + /// Hashes the raw message using SHA1 before signing the data + case message_pkcs1v15_SHA1 + /// Hashes the raw message using SHA224 before signing the data + case message_pkcs1v15_SHA224 + /// Hashes the raw message using SHA256 before signing the data + case message_pkcs1v15_SHA256 + /// Hashes the raw message using SHA384 before signing the data + case message_pkcs1v15_SHA384 + /// Hashes the raw message using SHA512 before signing the data + case message_pkcs1v15_SHA512 + /// Hashes the raw message using SHA512-224 before signing the data + case message_pkcs1v15_SHA512_224 + /// Hashes the raw message using SHA512-256 before signing the data + case message_pkcs1v15_SHA512_256 + /// This variant isn't supported yet + case digest_pkcs1v15_RAW + /// This variant expects that the data to be signed is a valid MD5 Hash Digest + case digest_pkcs1v15_MD5 + /// This variant expects that the data to be signed is a valid SHA1 Hash Digest + case digest_pkcs1v15_SHA1 + /// This variant expects that the data to be signed is a valid SHA224 Hash Digest + case digest_pkcs1v15_SHA224 + /// This variant expects that the data to be signed is a valid SHA256 Hash Digest + case digest_pkcs1v15_SHA256 + /// This variant expects that the data to be signed is a valid SHA384 Hash Digest + case digest_pkcs1v15_SHA384 + /// This variant expects that the data to be signed is a valid SHA512 Hash Digest + case digest_pkcs1v15_SHA512 + /// This variant expects that the data to be signed is a valid SHA512-224 Hash Digest + case digest_pkcs1v15_SHA512_224 + /// This variant expects that the data to be signed is a valid SHA512-256 Hash Digest + case digest_pkcs1v15_SHA512_256 + + internal var identifier: Array { + switch self { + case .raw, .digest_pkcs1v15_RAW: return [] + case .message_pkcs1v15_MD5, .digest_pkcs1v15_MD5: return Array(arrayLiteral: 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x05) + case .message_pkcs1v15_SHA1, .digest_pkcs1v15_SHA1: return Array(arrayLiteral: 0x2b, 0x0e, 0x03, 0x02, 0x1a) + case .message_pkcs1v15_SHA256, .digest_pkcs1v15_SHA256: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01) + case .message_pkcs1v15_SHA384, .digest_pkcs1v15_SHA384: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02) + case .message_pkcs1v15_SHA512, .digest_pkcs1v15_SHA512: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03) + case .message_pkcs1v15_SHA224, .digest_pkcs1v15_SHA224: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x04) + case .message_pkcs1v15_SHA512_224, .digest_pkcs1v15_SHA512_224: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x05) + case .message_pkcs1v15_SHA512_256, .digest_pkcs1v15_SHA512_256: return Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x06) + } + } + + internal func calculateHash(_ bytes: Array) -> Array { + switch self { + case .message_pkcs1v15_MD5: + return Digest.md5(bytes) + case .message_pkcs1v15_SHA1: + return Digest.sha1(bytes) + case .message_pkcs1v15_SHA224: + return Digest.sha224(bytes) + case .message_pkcs1v15_SHA256: + return Digest.sha256(bytes) + case .message_pkcs1v15_SHA384: + return Digest.sha384(bytes) + case .message_pkcs1v15_SHA512: + return Digest.sha512(bytes) + case .message_pkcs1v15_SHA512_224: + return Digest.sha2(bytes, variant: .sha224) + case .message_pkcs1v15_SHA512_256: + return Digest.sha2(bytes, variant: .sha256) + case .raw, + .digest_pkcs1v15_RAW, + .digest_pkcs1v15_MD5, + .digest_pkcs1v15_SHA1, + .digest_pkcs1v15_SHA224, + .digest_pkcs1v15_SHA256, + .digest_pkcs1v15_SHA384, + .digest_pkcs1v15_SHA512, + .digest_pkcs1v15_SHA512_224, + .digest_pkcs1v15_SHA512_256: + return bytes + } + } + + internal func enforceLength(_ bytes: Array, keySizeInBytes: Int) -> Bool { + switch self { + case .raw, .digest_pkcs1v15_RAW: + return bytes.count <= keySizeInBytes + case .digest_pkcs1v15_MD5: + return bytes.count <= 16 + case .digest_pkcs1v15_SHA1: + return bytes.count <= 20 + case .digest_pkcs1v15_SHA224: + return bytes.count <= 28 + case .digest_pkcs1v15_SHA256: + return bytes.count <= 32 + case .digest_pkcs1v15_SHA384: + return bytes.count <= 48 + case .digest_pkcs1v15_SHA512: + return bytes.count <= 64 + case .digest_pkcs1v15_SHA512_224: + return bytes.count <= 28 + case .digest_pkcs1v15_SHA512_256: + return bytes.count <= 32 + case .message_pkcs1v15_MD5, + .message_pkcs1v15_SHA1, + .message_pkcs1v15_SHA224, + .message_pkcs1v15_SHA256, + .message_pkcs1v15_SHA384, + .message_pkcs1v15_SHA512, + .message_pkcs1v15_SHA512_224, + .message_pkcs1v15_SHA512_256: + return true + } + } + + internal func encode(_ bytes: Array) -> Array { + switch self { + case .raw, .digest_pkcs1v15_RAW: + return bytes + + default: + let asn: ASN1.Node = .sequence(nodes: [ + .sequence(nodes: [ + .objectIdentifier(data: Data(self.identifier)), + .null + ]), + .octetString(data: Data(bytes)) + ]) + + return ASN1.Encoder.encode(asn) + } + } + + /// Right now the only Padding Scheme supported is [EMCS-PKCS1v15](https://www.rfc-editor.org/rfc/rfc8017#section-9.2) (others include [EMSA-PSS](https://www.rfc-editor.org/rfc/rfc8017#section-9.1)) + internal func pad(bytes: Array, to blockSize: Int) -> Array { + switch self { + case .raw: + return bytes + default: + return Padding.emsa_pkcs1v15.add(to: bytes, blockSize: blockSize) + } + } + + /// Zero pads a signature to the specified block size + /// - Parameters: + /// - bytes: The signed bytes + /// - blockSize: The block size to pad until + /// - Returns: A zero padded (prepended) bytes array of length blockSize + internal func formatSignedBytes(_ bytes: Array, blockSize: Int) -> Array { + switch self { + default: + // Format the encrypted bytes before returning + return Array(repeating: 0x00, count: blockSize - bytes.count) + bytes + } + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA.swift new file mode 100644 index 00000000..7c099e99 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/RSA/RSA.swift @@ -0,0 +1,423 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Foundation is required for `Data` to be found +import Foundation + +// Note: The `BigUInt` struct was copied from: +// https://github.com/attaswift/BigInt +// It allows fast calculation for RSA big numbers + +public final class RSA: DERCodable { + /// RSA Key Errors + public enum Error: Swift.Error { + /// No private key specified + case noPrivateKey + /// Failed to calculate the inverse e and phi + case invalidInverseNotCoprimes + /// We only support Version 0 RSA keys (we don't support Version 1 introduced in RFC 3447) + case unsupportedRSAVersion + /// Failed to verify primes during initialiization (the provided primes don't reproduce the provided private exponent) + case invalidPrimes + /// We attempted to export a private key without our underlying primes + case noPrimes + /// Unable to calculate the coefficient during a private key import / export + case unableToCalculateCoefficient + /// The signature to verify is of an invalid length + case invalidSignatureLength + /// The message to be signed is of an invalid length + case invalidMessageLengthForSigning + /// The message to be encrypted is of an invalid length + case invalidMessageLengthForEncryption + /// The error thrown when Decryption fails + case invalidDecryption + } + + /// RSA Modulus + public let n: BigUInteger + + /// RSA Public Exponent + public let e: BigUInteger + + /// RSA Private Exponent + public let d: BigUInteger? + + /// The size of the modulus, in bits + public let keySize: Int + + /// The size of the modulus, in bytes (rounded up to the nearest full byte) + public let keySizeBytes: Int + + /// The underlying primes used to generate the Private Exponent + private let primes: (p: BigUInteger, q: BigUInteger)? + + /// Initialize with RSA parameters + /// - Parameters: + /// - n: The RSA Modulus + /// - e: The RSA Public Exponent + /// - d: The RSA Private Exponent (or nil if unknown, e.g. if only public key is known) + public init(n: BigUInteger, e: BigUInteger, d: BigUInteger? = nil) { + self.n = n + self.e = e + self.d = d + self.primes = nil + + self.keySize = n.bitWidth + self.keySizeBytes = n.byteWidth + } + + /// Initialize with RSA parameters + /// - Parameters: + /// - n: The RSA Modulus + /// - e: The RSA Public Exponent + /// - d: The RSA Private Exponent (or nil if unknown, e.g. if only public key is known) + public convenience init(n: Array, e: Array, d: Array? = nil) { + if let d = d { + self.init(n: BigUInteger(Data(n)), e: BigUInteger(Data(e)), d: BigUInteger(Data(d))) + } else { + self.init(n: BigUInteger(Data(n)), e: BigUInteger(Data(e))) + } + } + + /// Initialize with a generated key pair + /// - Parameter keySize: The size of the modulus + public convenience init(keySize: Int) throws { + // Generate prime numbers + let p = BigUInteger.generatePrime(keySize / 2) + let q = BigUInteger.generatePrime(keySize / 2) + + // Calculate modulus + let n = p * q + + // Calculate public and private exponent + let e: BigUInteger = 65537 + let phi = (p - 1) * (q - 1) + guard let d = e.inverse(phi) else { + throw RSA.Error.invalidInverseNotCoprimes + } + + // Initialize + self.init(n: n, e: e, d: d, p: p, q: q) + } + + /// Initialize with RSA parameters + /// - Parameters: + /// - n: The RSA Modulus + /// - e: The RSA Public Exponent + /// - d: The RSA Private Exponent + /// - p: The 1st Prime used to generate the Private Exponent + /// - q: The 2nd Prime used to generate the Private Exponent + private init(n: BigUInteger, e: BigUInteger, d: BigUInteger, p: BigUInteger, q: BigUInteger) { + self.n = n + self.e = e + self.d = d + self.primes = (p, q) + + self.keySize = n.bitWidth + self.keySizeBytes = n.byteWidth + } +} + +// MARK: BigUInt Extension + +internal extension CS.BigUInt { + /// The minimum number of bytes required to represent this integer in binary. + var byteWidth: Int { + let bytes = self.bitWidth / 8 + return self.bitWidth % 8 == 0 ? bytes : bytes + 1 + } +} + +// MARK: DER Initializers (See #892) + +extension RSA { + /// Decodes the provided data into a Public RSA Key + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.1) + /// ``` + /// ========================= + /// RSA PublicKey Structure + /// ========================= + /// + /// RSAPublicKey ::= SEQUENCE { + /// modulus INTEGER, -- n + /// publicExponent INTEGER, -- e + /// } + /// ``` + internal convenience init(publicDER der: Array) throws { + let asn = try ASN1.Decoder.decode(data: Data(der)) + + // Enforce the above ASN Structure + guard case .sequence(let params) = asn else { throw DER.Error.invalidDERFormat } + guard params.count == 2 else { throw DER.Error.invalidDERFormat } + + guard case .integer(let modulus) = params[0] else { throw DER.Error.invalidDERFormat } + guard case .integer(let publicExponent) = params[1] else { throw DER.Error.invalidDERFormat } + + self.init(n: BigUInteger(modulus), e: BigUInteger(publicExponent)) + } + + /// Decodes the provided data into a Private RSA Key + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.2) + /// ``` + /// ========================== + /// RSA PrivateKey Structure + /// ========================== + /// + /// RSAPrivateKey ::= SEQUENCE { + /// version Version, + /// modulus INTEGER, -- n + /// publicExponent INTEGER, -- e + /// privateExponent INTEGER, -- d + /// prime1 INTEGER, -- p + /// prime2 INTEGER, -- q + /// exponent1 INTEGER, -- d mod (p-1) + /// exponent2 INTEGER, -- d mod (q-1) + /// coefficient INTEGER, -- (inverse of q) mod p + /// } + /// ``` + internal convenience init(privateDER der: Array) throws { + let asn = try ASN1.Decoder.decode(data: Data(der)) + + // Enforce the above ASN Structure (do we need to extract and verify the eponents and coefficients?) + guard case .sequence(let params) = asn else { throw DER.Error.invalidDERFormat } + guard params.count == 9 else { throw DER.Error.invalidDERFormat } + guard case .integer(let version) = params[0] else { throw DER.Error.invalidDERFormat } + guard case .integer(let modulus) = params[1] else { throw DER.Error.invalidDERFormat } + guard case .integer(let publicExponent) = params[2] else { throw DER.Error.invalidDERFormat } + guard case .integer(let privateExponent) = params[3] else { throw DER.Error.invalidDERFormat } + guard case .integer(let prime1) = params[4] else { throw DER.Error.invalidDERFormat } + guard case .integer(let prime2) = params[5] else { throw DER.Error.invalidDERFormat } + guard case .integer(let exponent1) = params[6] else { throw DER.Error.invalidDERFormat } + guard case .integer(let exponent2) = params[7] else { throw DER.Error.invalidDERFormat } + guard case .integer(let coefficient) = params[8] else { throw DER.Error.invalidDERFormat } + + // We only support version 0x00 == RFC2313 at the moment + // - TODO: Support multiple primes 0x01 version defined in [RFC3447](https://www.rfc-editor.org/rfc/rfc3447#appendix-A.1.2) + guard version == Data(hex: "0x00") else { throw Error.unsupportedRSAVersion } + + // Ensure the supplied parameters are correct... + // Calculate modulus + guard BigUInteger(modulus) == BigUInteger(prime1) * BigUInteger(prime2) else { throw Error.invalidPrimes } + + // Calculate public and private exponent + let phi = (BigUInteger(prime1) - 1) * (BigUInteger(prime2) - 1) + guard let d = BigUInteger(publicExponent).inverse(phi) else { throw Error.invalidPrimes } + guard BigUInteger(privateExponent) == d else { throw Error.invalidPrimes } + + // Ensure the provided coefficient is correct (derived from the primes) + guard let calculatedCoefficient = BigUInteger(prime2).inverse(BigUInteger(prime1)) else { throw RSA.Error.unableToCalculateCoefficient } + guard calculatedCoefficient == BigUInteger(coefficient) else { throw RSA.Error.invalidPrimes } + + // Ensure the provided exponents are correct as well + guard (d % (BigUInteger(prime1) - 1)) == BigUInteger(exponent1) else { throw RSA.Error.invalidPrimes } + guard (d % (BigUInteger(prime2) - 1)) == BigUInteger(exponent2) else { throw RSA.Error.invalidPrimes } + + // Proceed with regular initialization + self.init(n: BigUInteger(modulus), e: BigUInteger(publicExponent), d: BigUInteger(privateExponent), p: BigUInteger(prime1), q: BigUInteger(prime2)) + } + + /// Attempts to instantiate an RSA Key when given the ASN1 DER encoded external representation of the Key + /// + /// An example of importing a SecKey RSA key (from Apple's `Security` framework) for use within CryptoSwift + /// ``` + /// /// Starting with a SecKey RSA Key + /// let rsaSecKey:SecKey + /// + /// /// Copy the External Representation + /// var externalRepError:Unmanaged? + /// guard let externalRep = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) as? Data else { + /// /// Failed to copy external representation for RSA SecKey + /// return + /// } + /// + /// /// Instantiate the RSA Key from the raw external representation + /// let rsaKey = try RSA(rawRepresentation: externalRep) + /// + /// /// You now have a CryptoSwift RSA Key + /// // rsaKey.encrypt(...) + /// // rsaKey.decrypt(...) + /// // rsaKey.sign(...) + /// // rsaKey.verify(...) + /// ``` + public convenience init(rawRepresentation raw: Data) throws { + do { try self.init(privateDER: raw.bytes) } catch { + try self.init(publicDER: raw.bytes) + } + } +} + +// MARK: DER Exports (See #892) + +extension RSA { + /// The DER representation of this public key + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.1) + /// ``` + /// ========================= + /// RSA PublicKey Structure + /// ========================= + /// + /// RSAPublicKey ::= SEQUENCE { + /// modulus INTEGER, -- n + /// publicExponent INTEGER -- e + /// } + /// ``` + func publicKeyDER() throws -> Array { + let mod = self.n.serialize() + let pubKeyAsnNode: ASN1.Node = + .sequence(nodes: [ + .integer(data: DER.i2ospData(x: mod.bytes, size: self.keySizeBytes)), + .integer(data: DER.i2ospData(x: self.e.serialize().bytes, size: 3)) + ]) + return ASN1.Encoder.encode(pubKeyAsnNode) + } + + /// The DER representation of this private key + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.2) + /// ``` + /// ========================== + /// RSA PrivateKey Structure + /// ========================== + /// + /// RSAPrivateKey ::= SEQUENCE { + /// version Version, + /// modulus INTEGER, -- n + /// publicExponent INTEGER, -- e + /// privateExponent INTEGER, -- d + /// prime1 INTEGER, -- p + /// prime2 INTEGER, -- q + /// exponent1 INTEGER, -- d mod (p-1) + /// exponent2 INTEGER, -- d mod (q-1) + /// coefficient INTEGER, -- (inverse of q) mod p + /// } + /// ``` + func privateKeyDER() throws -> Array { + // Make sure we have a private key + guard let d = d else { throw RSA.Error.noPrivateKey } + // Make sure we have access to our primes + guard let primes = primes else { throw RSA.Error.noPrimes } + // Make sure we can calculate our coefficient (inverse of q mod p) + guard let coefficient = primes.q.inverse(primes.p) else { throw RSA.Error.unableToCalculateCoefficient } + + let paramWidth = self.keySizeBytes / 2 + // Structure the data (according to RFC2313, version 0x00 RSA Private Key Syntax) + let mod = self.n.serialize() + let privateKeyAsnNode: ASN1.Node = + .sequence(nodes: [ + .integer(data: Data(hex: "0x00")), + .integer(data: DER.i2ospData(x: mod.bytes, size: self.keySizeBytes)), + .integer(data: DER.i2ospData(x: self.e.serialize().bytes, size: 3)), + .integer(data: DER.i2ospData(x: d.serialize().bytes, size: self.keySizeBytes)), + .integer(data: DER.i2ospData(x: primes.p.serialize().bytes, size: paramWidth)), + .integer(data: DER.i2ospData(x: primes.q.serialize().bytes, size: paramWidth)), + .integer(data: DER.i2ospData(x: (d % (primes.p - 1)).serialize().bytes, size: paramWidth)), + .integer(data: DER.i2ospData(x: (d % (primes.q - 1)).serialize().bytes, size: paramWidth)), + .integer(data: DER.i2ospData(x: coefficient.serialize().bytes, size: paramWidth)) + ]) + + // Encode and return the data + return ASN1.Encoder.encode(privateKeyAsnNode) + } + + /// This method returns the DER encoding of the RSA Key. + /// + /// - Returns: The ASN1 DER Encoding of the Public or Private RSA Key + /// - Note: If the RSA Key is a private key, the private key representation is returned + /// - Note: If the RSA Key is a public key, the public key representation is returned + /// - Note: If you'd like to only export the public DER of an RSA Key call the `publicKeyExternalRepresentation()` method + /// - Note: This method returns the same data as Apple's `SecKeyCopyExternalRepresentation` method. + /// + /// An example of converting a CryptoSwift RSA key to a SecKey RSA key + /// ``` + /// /// Starting with a CryptoSwift RSA Key + /// let rsaKey = try RSA(keySize: 1024) + /// + /// /// Define your Keys attributes + /// let attributes: [String:Any] = [ + /// kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + /// kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, // or kSecAttrKeyClassPublic + /// kSecAttrKeySizeInBits as String: 1024, // The appropriate bits + /// kSecAttrIsPermanent as String: false + /// ] + /// var error:Unmanaged? = nil + /// guard let rsaSecKey = try SecKeyCreateWithData(rsaKey.externalRepresentation() as CFData, attributes as CFDictionary, &error) else { + /// /// Error constructing SecKey from raw key data + /// return + /// } + /// + /// /// You now have an RSA SecKey for use with Apple's Security framework + /// ``` + /// + /// An example of converting a SecKey RSA key to a CryptoSwift RSA key + /// ``` + /// /// Starting with a SecKey RSA Key + /// let rsaSecKey:SecKey + /// + /// /// Copy External Representation + /// var externalRepError:Unmanaged? + /// guard let cfdata = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) else { + /// /// Failed to copy external representation for RSA SecKey + /// return + /// } + /// + /// /// Instantiate the RSA Key from the raw external representation + /// let rsaKey = try RSA(rawRepresentation: cfdata as Data) + /// + /// /// You now have a CryptoSwift RSA Key + /// ``` + /// + public func externalRepresentation() throws -> Data { + if self.primes != nil { + return try Data(self.privateKeyDER()) + } else { + return try Data(self.publicKeyDER()) + } + } + + public func publicKeyExternalRepresentation() throws -> Data { + return try Data(self.publicKeyDER()) + } +} + +// MARK: CS.BigUInt extension + +extension BigUInteger { + + public static func generatePrime(_ width: Int) -> BigUInteger { + // Note: Need to find a better way to generate prime numbers + while true { + var random = BigUInteger.randomInteger(withExactWidth: width) + random |= BigUInteger(1) + if random.isPrime() { + return random + } + } + } +} + +// MARK: CustomStringConvertible Conformance + +extension RSA: CustomStringConvertible { + public var description: String { + if self.d != nil { + return "CryptoSwift.RSA.PrivateKey<\(self.keySize)>" + } else { + return "CryptoSwift.RSA.PublicKey<\(self.keySize)>" + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Rabbit.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Rabbit.swift new file mode 100644 index 00000000..49afec5c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Rabbit.swift @@ -0,0 +1,221 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public final class Rabbit: BlockCipher { + public enum Error: Swift.Error { + case invalidKeyOrInitializationVector + } + + /// Size of IV in bytes + public static let ivSize = 64 / 8 + + /// Size of key in bytes + public static let keySize = 128 / 8 + + /// Size of block in bytes + public static let blockSize = 128 / 8 + + public var keySize: Int { + self.key.count + } + + /// Key + private let key: Key + + /// IV (optional) + private let iv: Array? + + /// State variables + private var x = Array(repeating: 0, count: 8) + + /// Counter variables + private var c = Array(repeating: 0, count: 8) + + /// Counter carry + private var p7: UInt32 = 0 + + /// 'a' constants + private var a: Array = [ + 0x4d34d34d, + 0xd34d34d3, + 0x34d34d34, + 0x4d34d34d, + 0xd34d34d3, + 0x34d34d34, + 0x4d34d34d, + 0xd34d34d3 + ] + + // MARK: - Initializers + + public convenience init(key: Array) throws { + try self.init(key: key, iv: nil) + } + + public init(key: Array, iv: Array?) throws { + self.key = Key(bytes: key) + self.iv = iv + + guard key.count == Rabbit.keySize && (iv == nil || iv!.count == Rabbit.ivSize) else { + throw Error.invalidKeyOrInitializationVector + } + } + + // MARK: - + + fileprivate func setup() { + self.p7 = 0 + + // Key divided into 8 subkeys + let k = Array(unsafeUninitializedCapacity: 8) { buf, count in + for j in 0..<8 { + buf[j] = UInt32(self.key[Rabbit.blockSize - (2 * j + 1)]) | (UInt32(self.key[Rabbit.blockSize - (2 * j + 2)]) << 8) + } + count = 8 + } + + // Initialize state and counter variables from subkeys + for j in 0..<8 { + if j % 2 == 0 { + self.x[j] = (k[(j + 1) % 8] << 16) | k[j] + self.c[j] = (k[(j + 4) % 8] << 16) | k[(j + 5) % 8] + } else { + self.x[j] = (k[(j + 5) % 8] << 16) | k[(j + 4) % 8] + self.c[j] = (k[j] << 16) | k[(j + 1) % 8] + } + } + + // Iterate system four times + self.nextState() + self.nextState() + self.nextState() + self.nextState() + + // Reinitialize counter variables + for j in 0..<8 { + self.c[j] = self.c[j] ^ self.x[(j + 4) % 8] + } + + if let iv = iv { + self.setupIV(iv) + } + } + + private func setupIV(_ iv: Array) { + // 63...56 55...48 47...40 39...32 31...24 23...16 15...8 7...0 IV bits + // 0 1 2 3 4 5 6 7 IV bytes in array + let iv0 = UInt32(bytes: [iv[4], iv[5], iv[6], iv[7]]) + let iv1 = UInt32(bytes: [iv[0], iv[1], iv[4], iv[5]]) + let iv2 = UInt32(bytes: [iv[0], iv[1], iv[2], iv[3]]) + let iv3 = UInt32(bytes: [iv[2], iv[3], iv[6], iv[7]]) + + // Modify the counter state as function of the IV + c[0] = self.c[0] ^ iv0 + self.c[1] = self.c[1] ^ iv1 + self.c[2] = self.c[2] ^ iv2 + self.c[3] = self.c[3] ^ iv3 + self.c[4] = self.c[4] ^ iv0 + self.c[5] = self.c[5] ^ iv1 + self.c[6] = self.c[6] ^ iv2 + self.c[7] = self.c[7] ^ iv3 + + // Iterate system four times + self.nextState() + self.nextState() + self.nextState() + self.nextState() + } + + private func nextState() { + // Before an iteration the counters are incremented + var carry = self.p7 + for j in 0..<8 { + let prev = self.c[j] + self.c[j] = prev &+ self.a[j] &+ carry + carry = prev > self.c[j] ? 1 : 0 // detect overflow + } + self.p7 = carry // save last carry bit + + // Iteration of the system + self.x = Array(unsafeUninitializedCapacity: 8) { newX, count in + newX[0] = self.g(0) &+ rotateLeft(self.g(7), by: 16) &+ rotateLeft(self.g(6), by: 16) + newX[1] = self.g(1) &+ rotateLeft(self.g(0), by: 8) &+ self.g(7) + newX[2] = self.g(2) &+ rotateLeft(self.g(1), by: 16) &+ rotateLeft(self.g(0), by: 16) + newX[3] = self.g(3) &+ rotateLeft(self.g(2), by: 8) &+ self.g(1) + newX[4] = self.g(4) &+ rotateLeft(self.g(3), by: 16) &+ rotateLeft(self.g(2), by: 16) + newX[5] = self.g(5) &+ rotateLeft(self.g(4), by: 8) &+ self.g(3) + newX[6] = self.g(6) &+ rotateLeft(self.g(5), by: 16) &+ rotateLeft(self.g(4), by: 16) + newX[7] = self.g(7) &+ rotateLeft(self.g(6), by: 8) &+ self.g(5) + count = 8 + } + } + + private func g(_ j: Int) -> UInt32 { + let sum = self.x[j] &+ self.c[j] + let square = UInt64(sum) * UInt64(sum) + return UInt32(truncatingIfNeeded: square ^ (square >> 32)) + } + + fileprivate func nextOutput() -> Array { + self.nextState() + + var output16 = Array(repeating: 0, count: Rabbit.blockSize / 2) + output16[7] = UInt16(truncatingIfNeeded: self.x[0]) ^ UInt16(truncatingIfNeeded: self.x[5] >> 16) + output16[6] = UInt16(truncatingIfNeeded: self.x[0] >> 16) ^ UInt16(truncatingIfNeeded: self.x[3]) + output16[5] = UInt16(truncatingIfNeeded: self.x[2]) ^ UInt16(truncatingIfNeeded: self.x[7] >> 16) + output16[4] = UInt16(truncatingIfNeeded: self.x[2] >> 16) ^ UInt16(truncatingIfNeeded: self.x[5]) + output16[3] = UInt16(truncatingIfNeeded: self.x[4]) ^ UInt16(truncatingIfNeeded: self.x[1] >> 16) + output16[2] = UInt16(truncatingIfNeeded: self.x[4] >> 16) ^ UInt16(truncatingIfNeeded: self.x[7]) + output16[1] = UInt16(truncatingIfNeeded: self.x[6]) ^ UInt16(truncatingIfNeeded: self.x[3] >> 16) + output16[0] = UInt16(truncatingIfNeeded: self.x[6] >> 16) ^ UInt16(truncatingIfNeeded: self.x[1]) + + var output8 = Array(repeating: 0, count: Rabbit.blockSize) + for j in 0..> 8) + output8[j * 2 + 1] = UInt8(truncatingIfNeeded: output16[j]) + } + return output8 + } +} + +// MARK: Cipher + +extension Rabbit: Cipher { + public func encrypt(_ bytes: ArraySlice) throws -> Array { + self.setup() + + return Array(unsafeUninitializedCapacity: bytes.count) { result, count in + var output = self.nextOutput() + var byteIdx = 0 + var outputIdx = 0 + while byteIdx < bytes.count { + if outputIdx == Rabbit.blockSize { + output = self.nextOutput() + outputIdx = 0 + } + + result[byteIdx] = bytes[byteIdx] ^ output[outputIdx] + + byteIdx += 1 + outputIdx += 1 + } + count = bytes.count + } + } + + public func decrypt(_ bytes: ArraySlice) throws -> Array { + try self.encrypt(bytes) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA1.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA1.swift new file mode 100644 index 00000000..2b217002 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA1.swift @@ -0,0 +1,158 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public final class SHA1: DigestType { + + @usableFromInline + static let digestLength: Int = 20 // 160 / 8 + + @usableFromInline + static let blockSize: Int = 64 + + @usableFromInline + static let hashInitialValue: ContiguousArray = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0] + + @usableFromInline + var accumulated = Array() + + @usableFromInline + var processedBytesTotalCount: Int = 0 + + @usableFromInline + var accumulatedHash: ContiguousArray = SHA1.hashInitialValue + + public init() { + } + + @inlinable + public func calculate(for bytes: Array) -> Array { + do { + return try update(withBytes: bytes.slice, isLast: true) + } catch { + return [] + } + } + + @usableFromInline + func process(block chunk: ArraySlice, currentHash hh: inout ContiguousArray) { + // break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15, big-endian + // Extend the sixteen 32-bit words into eighty 32-bit words: + let M = UnsafeMutablePointer.allocate(capacity: 80) + M.initialize(repeating: 0, count: 80) + defer { + M.deinitialize(count: 80) + M.deallocate() + } + + for x in 0..<80 { + switch x { + case 0...15: + let start = chunk.startIndex.advanced(by: x * 4) // * MemoryLayout.size + M[x] = UInt32(bytes: chunk, fromIndex: start) + default: + M[x] = rotateLeft(M[x - 3] ^ M[x - 8] ^ M[x - 14] ^ M[x - 16], by: 1) + } + } + + var A = hh[0] + var B = hh[1] + var C = hh[2] + var D = hh[3] + var E = hh[4] + + // Main loop + for j in 0...79 { + var f: UInt32 = 0 + var k: UInt32 = 0 + + switch j { + case 0...19: + f = (B & C) | ((~B) & D) + k = 0x5a827999 + case 20...39: + f = B ^ C ^ D + k = 0x6ed9eba1 + case 40...59: + f = (B & C) | (B & D) | (C & D) + k = 0x8f1bbcdc + case 60...79: + f = B ^ C ^ D + k = 0xca62c1d6 + default: + break + } + + let temp = rotateLeft(A, by: 5) &+ f &+ E &+ M[j] &+ k + E = D + D = C + C = rotateLeft(B, by: 30) + B = A + A = temp + } + + hh[0] = hh[0] &+ A + hh[1] = hh[1] &+ B + hh[2] = hh[2] &+ C + hh[3] = hh[3] &+ D + hh[4] = hh[4] &+ E + } +} + +extension SHA1: Updatable { + @discardableResult @inlinable + public func update(withBytes bytes: ArraySlice, isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + if isLast { + let lengthInBits = (processedBytesTotalCount + self.accumulated.count) * 8 + let lengthBytes = lengthInBits.bytes(totalBytes: 64 / 8) // A 64-bit representation of b + + // Step 1. Append padding + bitPadding(to: &self.accumulated, blockSize: SHA1.blockSize, allowance: 64 / 8) + + // Step 2. Append Length a 64-bit representation of lengthInBits + self.accumulated += lengthBytes + } + + var processedBytes = 0 + for chunk in self.accumulated.batched(by: SHA1.blockSize) { + if isLast || (self.accumulated.count - processedBytes) >= SHA1.blockSize { + self.process(block: chunk, currentHash: &self.accumulatedHash) + processedBytes += chunk.count + } + } + self.accumulated.removeFirst(processedBytes) + self.processedBytesTotalCount += processedBytes + + // output current hash + var result = Array(repeating: 0, count: SHA1.digestLength) + var pos = 0 + for idx in 0..> 24) & 0xff) + result[pos + 1] = UInt8((h >> 16) & 0xff) + result[pos + 2] = UInt8((h >> 8) & 0xff) + result[pos + 3] = UInt8(h & 0xff) + pos += 4 + } + + // reset hash value for instance + if isLast { + self.accumulatedHash = SHA1.hashInitialValue + } + + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA2.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA2.swift new file mode 100644 index 00000000..447204f7 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA2.swift @@ -0,0 +1,368 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// TODO: generic for process32/64 (UInt32/UInt64) +// + +public final class SHA2: DigestType { + @usableFromInline + let variant: Variant + + @usableFromInline + let size: Int + + @usableFromInline + let blockSize: Int + + @usableFromInline + let digestLength: Int + + private let k: Array + + @usableFromInline + var accumulated = Array() + + @usableFromInline + var processedBytesTotalCount: Int = 0 + + @usableFromInline + var accumulatedHash32 = Array() + + @usableFromInline + var accumulatedHash64 = Array() + + @frozen + public enum Variant: RawRepresentable { + case sha224, sha256, sha384, sha512 + + public var digestLength: Int { + self.rawValue / 8 + } + + public var blockSize: Int { + switch self { + case .sha224, .sha256: + return 64 + case .sha384, .sha512: + return 128 + } + } + + public typealias RawValue = Int + public var rawValue: RawValue { + switch self { + case .sha224: + return 224 + case .sha256: + return 256 + case .sha384: + return 384 + case .sha512: + return 512 + } + } + + public init?(rawValue: RawValue) { + switch rawValue { + case 224: + self = .sha224 + case 256: + self = .sha256 + case 384: + self = .sha384 + case 512: + self = .sha512 + default: + return nil + } + } + + @usableFromInline + var h: Array { + switch self { + case .sha224: + return [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4] + case .sha256: + return [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19] + case .sha384: + return [0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4] + case .sha512: + return [0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] + } + } + + @usableFromInline + var finalLength: Int { + switch self { + case .sha224: + return 7 + case .sha384: + return 6 + default: + return Int.max + } + } + } + + public init(variant: SHA2.Variant) { + self.variant = variant + switch self.variant { + case .sha224, .sha256: + self.accumulatedHash32 = variant.h.map { UInt32($0) } // FIXME: UInt64 for process64 + self.blockSize = variant.blockSize + self.size = variant.rawValue + self.digestLength = variant.digestLength + self.k = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + ] + case .sha384, .sha512: + self.accumulatedHash64 = variant.h + self.blockSize = variant.blockSize + self.size = variant.rawValue + self.digestLength = variant.digestLength + self.k = [ + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, + 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, + 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, + 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, + 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, + 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, + 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, + 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, + 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817 + ] + } + } + + @inlinable + public func calculate(for bytes: Array) -> Array { + do { + return try update(withBytes: bytes.slice, isLast: true) + } catch { + return [] + } + } + + @usableFromInline + func process64(block chunk: ArraySlice, currentHash hh: inout Array) { + // break chunk into sixteen 64-bit words M[j], 0 ≤ j ≤ 15, big-endian + // Extend the sixteen 64-bit words into eighty 64-bit words: + let M = UnsafeMutablePointer.allocate(capacity: self.k.count) + M.initialize(repeating: 0, count: self.k.count) + defer { + M.deinitialize(count: self.k.count) + M.deallocate() + } + for x in 0...size + M[x] = UInt64(bytes: chunk, fromIndex: start) + default: + let s0 = rotateRight(M[x - 15], by: 1) ^ rotateRight(M[x - 15], by: 8) ^ (M[x - 15] >> 7) + let s1 = rotateRight(M[x - 2], by: 19) ^ rotateRight(M[x - 2], by: 61) ^ (M[x - 2] >> 6) + M[x] = M[x - 16] &+ s0 &+ M[x - 7] &+ s1 + } + } + + var A = hh[0] + var B = hh[1] + var C = hh[2] + var D = hh[3] + var E = hh[4] + var F = hh[5] + var G = hh[6] + var H = hh[7] + + // Main loop + for j in 0.., currentHash hh: inout Array) { + // break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15, big-endian + // Extend the sixteen 32-bit words into sixty-four 32-bit words: + let M = UnsafeMutablePointer.allocate(capacity: self.k.count) + M.initialize(repeating: 0, count: self.k.count) + defer { + M.deinitialize(count: self.k.count) + M.deallocate() + } + + for x in 0...size + M[x] = UInt32(bytes: chunk, fromIndex: start) + default: + let s0 = rotateRight(M[x - 15], by: 7) ^ rotateRight(M[x - 15], by: 18) ^ (M[x - 15] >> 3) + let s1 = rotateRight(M[x - 2], by: 17) ^ rotateRight(M[x - 2], by: 19) ^ (M[x - 2] >> 10) + M[x] = M[x - 16] &+ s0 &+ M[x - 7] &+ s1 + } + } + + var A = hh[0] + var B = hh[1] + var C = hh[2] + var D = hh[3] + var E = hh[4] + var F = hh[5] + var G = hh[6] + var H = hh[7] + + // Main loop + for j in 0.., isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + if isLast { + let lengthInBits = (processedBytesTotalCount + self.accumulated.count) * 8 + let lengthBytes = lengthInBits.bytes(totalBytes: self.blockSize / 8) // A 64-bit/128-bit representation of b. blockSize fit by accident. + + // Step 1. Append padding + bitPadding(to: &self.accumulated, blockSize: self.blockSize, allowance: self.blockSize / 8) + + // Step 2. Append Length a 64-bit representation of lengthInBits + self.accumulated += lengthBytes + } + + var processedBytes = 0 + for chunk in self.accumulated.batched(by: self.blockSize) { + if isLast || (self.accumulated.count - processedBytes) >= self.blockSize { + switch self.variant { + case .sha224, .sha256: + self.process32(block: chunk, currentHash: &self.accumulatedHash32) + case .sha384, .sha512: + self.process64(block: chunk, currentHash: &self.accumulatedHash64) + } + processedBytes += chunk.count + } + } + self.accumulated.removeFirst(processedBytes) + self.processedBytesTotalCount += processedBytes + + // output current hash + var result = Array(repeating: 0, count: variant.digestLength) + switch self.variant { + case .sha224, .sha256: + var pos = 0 + for idx in 0..> 24) & 0xff) + result[pos + 1] = UInt8((h >> 16) & 0xff) + result[pos + 2] = UInt8((h >> 8) & 0xff) + result[pos + 3] = UInt8(h & 0xff) + pos += 4 + } + case .sha384, .sha512: + var pos = 0 + for idx in 0..> 56) & 0xff) + result[pos + 1] = UInt8((h >> 48) & 0xff) + result[pos + 2] = UInt8((h >> 40) & 0xff) + result[pos + 3] = UInt8((h >> 32) & 0xff) + result[pos + 4] = UInt8((h >> 24) & 0xff) + result[pos + 5] = UInt8((h >> 16) & 0xff) + result[pos + 6] = UInt8((h >> 8) & 0xff) + result[pos + 7] = UInt8(h & 0xff) + pos += 8 + } + } + + // reset hash value for instance + if isLast { + switch self.variant { + case .sha224, .sha256: + self.accumulatedHash32 = self.variant.h.lazy.map { UInt32($0) } // FIXME: UInt64 for process64 + case .sha384, .sha512: + self.accumulatedHash64 = self.variant.h + } + } + + return result + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA3.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA3.swift new file mode 100644 index 00000000..1fd2e780 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SHA3.swift @@ -0,0 +1,299 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf +// http://keccak.noekeon.org/specs_summary.html +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#endif + +public final class SHA3: DigestType { + let round_constants: Array = [ + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000, + 0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009, + 0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003, + 0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a, + 0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + ] + + public let blockSize: Int + public let digestLength: Int + public let markByte: UInt8 + + @usableFromInline + var accumulated = Array() + + + @usableFromInline + var accumulatedHash: Array + + public enum Variant { + case sha224, sha256, sha384, sha512, keccak224, keccak256, keccak384, keccak512 + + var digestLength: Int { + 100 - (self.blockSize / 2) + } + + var blockSize: Int { + (1600 - self.outputLength * 2) / 8 + } + + var markByte: UInt8 { + switch self { + case .sha224, .sha256, .sha384, .sha512: + return 0x06 // 0x1F for SHAKE + case .keccak224, .keccak256, .keccak384, .keccak512: + return 0x01 + } + } + + public var outputLength: Int { + switch self { + case .sha224, .keccak224: + return 224 + case .sha256, .keccak256: + return 256 + case .sha384, .keccak384: + return 384 + case .sha512, .keccak512: + return 512 + } + } + } + + public init(variant: SHA3.Variant) { + self.blockSize = variant.blockSize + self.digestLength = variant.digestLength + self.markByte = variant.markByte + self.accumulatedHash = Array(repeating: 0, count: self.digestLength) + } + + @inlinable + public func calculate(for bytes: Array) -> Array { + do { + return try update(withBytes: bytes.slice, isLast: true) + } catch { + return [] + } + } + + /// 1. For all pairs (x,z) such that 0≤x<5 and 0≤z) { + let c = UnsafeMutablePointer.allocate(capacity: 5) + c.initialize(repeating: 0, count: 5) + defer { + c.deinitialize(count: 5) + c.deallocate() + } + let d = UnsafeMutablePointer.allocate(capacity: 5) + d.initialize(repeating: 0, count: 5) + defer { + d.deinitialize(count: 5) + d.deallocate() + } + + for i in 0..<5 { + c[i] = a[i] ^ a[i &+ 5] ^ a[i &+ 10] ^ a[i &+ 15] ^ a[i &+ 20] + } + + d[0] = rotateLeft(c[1], by: 1) ^ c[4] + d[1] = rotateLeft(c[2], by: 1) ^ c[0] + d[2] = rotateLeft(c[3], by: 1) ^ c[1] + d[3] = rotateLeft(c[4], by: 1) ^ c[2] + d[4] = rotateLeft(c[0], by: 1) ^ c[3] + + for i in 0..<5 { + a[i] ^= d[i] + a[i &+ 5] ^= d[i] + a[i &+ 10] ^= d[i] + a[i &+ 15] ^= d[i] + a[i &+ 20] ^= d[i] + } + } + + /// A′[x, y, z]=A[(x &+ 3y) mod 5, x, z] + private func π(_ a: inout Array) { + let a1 = a[1] + a[1] = a[6] + a[6] = a[9] + a[9] = a[22] + a[22] = a[14] + a[14] = a[20] + a[20] = a[2] + a[2] = a[12] + a[12] = a[13] + a[13] = a[19] + a[19] = a[23] + a[23] = a[15] + a[15] = a[4] + a[4] = a[24] + a[24] = a[21] + a[21] = a[8] + a[8] = a[16] + a[16] = a[5] + a[5] = a[3] + a[3] = a[18] + a[18] = a[17] + a[17] = a[11] + a[11] = a[7] + a[7] = a[10] + a[10] = a1 + } + + /// For all triples (x, y, z) such that 0≤x<5, 0≤y<5, and 0≤z) { + for i in stride(from: 0, to: 25, by: 5) { + let a0 = a[0 &+ i] + let a1 = a[1 &+ i] + a[0 &+ i] ^= ~a1 & a[2 &+ i] + a[1 &+ i] ^= ~a[2 &+ i] & a[3 &+ i] + a[2 &+ i] ^= ~a[3 &+ i] & a[4 &+ i] + a[3 &+ i] ^= ~a[4 &+ i] & a0 + a[4 &+ i] ^= ~a0 & a1 + } + } + + private func ι(_ a: inout Array, round: Int) { + a[0] ^= self.round_constants[round] + } + + @usableFromInline + func process(block chunk: ArraySlice, currentHash hh: inout Array) { + // expand + hh[0] ^= chunk[0].littleEndian + hh[1] ^= chunk[1].littleEndian + hh[2] ^= chunk[2].littleEndian + hh[3] ^= chunk[3].littleEndian + hh[4] ^= chunk[4].littleEndian + hh[5] ^= chunk[5].littleEndian + hh[6] ^= chunk[6].littleEndian + hh[7] ^= chunk[7].littleEndian + hh[8] ^= chunk[8].littleEndian + if self.blockSize > 72 { // 72 / 8, sha-512 + hh[9] ^= chunk[9].littleEndian + hh[10] ^= chunk[10].littleEndian + hh[11] ^= chunk[11].littleEndian + hh[12] ^= chunk[12].littleEndian + if self.blockSize > 104 { // 104 / 8, sha-384 + hh[13] ^= chunk[13].littleEndian + hh[14] ^= chunk[14].littleEndian + hh[15] ^= chunk[15].littleEndian + hh[16] ^= chunk[16].littleEndian + if self.blockSize > 136 { // 136 / 8, sha-256 + hh[17] ^= chunk[17].littleEndian + // FULL_SHA3_FAMILY_SUPPORT + if self.blockSize > 144 { // 144 / 8, sha-224 + hh[18] ^= chunk[18].littleEndian + hh[19] ^= chunk[19].littleEndian + hh[20] ^= chunk[20].littleEndian + hh[21] ^= chunk[21].littleEndian + hh[22] ^= chunk[22].littleEndian + hh[23] ^= chunk[23].littleEndian + hh[24] ^= chunk[24].littleEndian + } + } + } + } + + // Keccak-f + for round in 0..<24 { + self.θ(&hh) + + hh[1] = rotateLeft(hh[1], by: 1) + hh[2] = rotateLeft(hh[2], by: 62) + hh[3] = rotateLeft(hh[3], by: 28) + hh[4] = rotateLeft(hh[4], by: 27) + hh[5] = rotateLeft(hh[5], by: 36) + hh[6] = rotateLeft(hh[6], by: 44) + hh[7] = rotateLeft(hh[7], by: 6) + hh[8] = rotateLeft(hh[8], by: 55) + hh[9] = rotateLeft(hh[9], by: 20) + hh[10] = rotateLeft(hh[10], by: 3) + hh[11] = rotateLeft(hh[11], by: 10) + hh[12] = rotateLeft(hh[12], by: 43) + hh[13] = rotateLeft(hh[13], by: 25) + hh[14] = rotateLeft(hh[14], by: 39) + hh[15] = rotateLeft(hh[15], by: 41) + hh[16] = rotateLeft(hh[16], by: 45) + hh[17] = rotateLeft(hh[17], by: 15) + hh[18] = rotateLeft(hh[18], by: 21) + hh[19] = rotateLeft(hh[19], by: 8) + hh[20] = rotateLeft(hh[20], by: 18) + hh[21] = rotateLeft(hh[21], by: 2) + hh[22] = rotateLeft(hh[22], by: 61) + hh[23] = rotateLeft(hh[23], by: 56) + hh[24] = rotateLeft(hh[24], by: 14) + + self.π(&hh) + self.χ(&hh) + self.ι(&hh, round: round) + } + } +} + +extension SHA3: Updatable { + + @inlinable + public func update(withBytes bytes: ArraySlice, isLast: Bool = false) throws -> Array { + self.accumulated += bytes + + if isLast { + // Add padding + let markByteIndex = self.accumulated.count + + // We need to always pad the input. Even if the input is a multiple of blockSize. + let r = self.blockSize * 8 + let q = (r / 8) - (accumulated.count % (r / 8)) + self.accumulated += Array(repeating: 0, count: q) + + self.accumulated[markByteIndex] |= self.markByte + self.accumulated[self.accumulated.count - 1] |= 0x80 + } + + var processedBytes = 0 + for chunk in self.accumulated.batched(by: self.blockSize) { + if isLast || (self.accumulated.count - processedBytes) >= self.blockSize { + self.process(block: chunk.toUInt64Array().slice, currentHash: &self.accumulatedHash) + processedBytes += chunk.count + } + } + self.accumulated.removeFirst(processedBytes) + + // TODO: verify performance, reduce vs for..in + let result = self.accumulatedHash.reduce(into: Array()) { (result, value) in + result += value.bigEndian.bytes() + } + + // reset hash value for instance + if isLast { + self.accumulatedHash = Array(repeating: 0, count: self.digestLength) + } + + return Array(result[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// +// https://tools.ietf.org/html/rfc7914 +// + +/// Implementation of the scrypt key derivation function. +public final class Scrypt { + enum Error: Swift.Error { + case nIsTooLarge + case rIsTooLarge + case nMustBeAPowerOf2GreaterThan1 + case invalidInput + } + + /// Configuration parameters. + private let salt: SecureBytes + private let password: SecureBytes + private let blocksize: Int // 128 * r + private let salsaBlock = UnsafeMutableRawPointer.allocate(byteCount: 64, alignment: 64) + private let dkLen: Int + private let N: Int + private let r: Int + private let p: Int + + /// - parameters: + /// - password: password + /// - salt: salt + /// - dkLen: output length + /// - N: determines extra memory used + /// - r: determines a block size + /// - p: determines parallelicity degree + public init(password: Array, salt: Array, dkLen: Int, N: Int, r: Int, p: Int) throws { + precondition(dkLen > 0) + precondition(N > 0) + precondition(r > 0) + precondition(p > 0) + + guard !(N < 2 || (N & (N - 1)) != 0) else { throw Error.nMustBeAPowerOf2GreaterThan1 } + + guard N <= .max / 128 / r else { throw Error.nIsTooLarge } + guard r <= .max / 128 / p else { throw Error.rIsTooLarge } + + guard !salt.isEmpty else { + throw Error.invalidInput + } + + self.blocksize = 128 * r + self.N = N + self.r = r + self.p = p + self.password = SecureBytes(bytes: password) + self.salt = SecureBytes(bytes: salt) + self.dkLen = dkLen + } + + /// Runs the key derivation function with a specific password. + public func calculate() throws -> [UInt8] { + // Allocate memory (as bytes for now) for further use in mixing steps + let B = UnsafeMutableRawPointer.allocate(byteCount: 128 * self.r * self.p, alignment: 64) + let XY = UnsafeMutableRawPointer.allocate(byteCount: 256 * self.r + 64, alignment: 64) + let V = UnsafeMutableRawPointer.allocate(byteCount: 128 * self.r * self.N, alignment: 64) + + // Deallocate memory when done + defer { + B.deallocate() + XY.deallocate() + V.deallocate() + } + + /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ + // Expand the initial key + let barray = try PKCS5.PBKDF2(password: Array(self.password), salt: Array(self.salt), iterations: 1, keyLength: self.p * 128 * self.r, variant: .sha2(.sha256)).calculate() + barray.withUnsafeBytes { p in + B.copyMemory(from: p.baseAddress!, byteCount: barray.count) + } + + /* 2: for i = 0 to p - 1 do */ + // do the mixing + for i in 0 ..< self.p { + /* 3: B_i <-- MF(B_i, N) */ + smix(B + i * 128 * self.r, V.assumingMemoryBound(to: UInt32.self), XY.assumingMemoryBound(to: UInt32.self)) + } + + /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ + let pointer = B.assumingMemoryBound(to: UInt8.self) + let bufferPointer = UnsafeBufferPointer(start: pointer, count: p * 128 * self.r) + let block = [UInt8](bufferPointer) + return try PKCS5.PBKDF2(password: Array(self.password), salt: block, iterations: 1, keyLength: self.dkLen, variant: .sha2(.sha256)).calculate() + } +} + +private extension Scrypt { + /// Computes `B = SMix_r(B, N)`. + /// + /// The input `block` must be `128*r` bytes in length; the temporary storage `v` must be `128*r*n` bytes in length; + /// the temporary storage `xy` must be `256*r + 64` bytes in length. The arrays `block`, `v`, and `xy` must be + /// aligned to a multiple of 64 bytes. + @inline(__always) func smix(_ block: UnsafeMutableRawPointer, _ v: UnsafeMutablePointer, _ xy: UnsafeMutablePointer) { + let X = xy + let Y = xy + 32 * self.r + let Z = xy + 64 * self.r + + /* 1: X <-- B */ + let typedBlock = block.assumingMemoryBound(to: UInt32.self) + X.assign(from: typedBlock, count: 32 * self.r) + + /* 2: for i = 0 to N - 1 do */ + for i in stride(from: 0, to: self.N, by: 2) { + /* 3: V_i <-- X */ + UnsafeMutableRawPointer(v + i * (32 * self.r)).copyMemory(from: X, byteCount: 128 * self.r) + + /* 4: X <-- H(X) */ + self.blockMixSalsa8(X, Y, Z) + + /* 3: V_i <-- X */ + UnsafeMutableRawPointer(v + (i + 1) * (32 * self.r)).copyMemory(from: Y, byteCount: 128 * self.r) + + /* 4: X <-- H(X) */ + self.blockMixSalsa8(Y, X, Z) + } + + /* 6: for i = 0 to N - 1 do */ + for _ in stride(from: 0, to: self.N, by: 2) { + /* + 7: j <-- Integerify (X) mod N + where Integerify (B[0] ... B[2 * r - 1]) is defined + as the result of interpreting B[2 * r - 1] as a little-endian integer. + */ + var j = Int(integerify(X) & UInt64(self.N - 1)) + + /* 8: X <-- H(X \xor V_j) */ + self.blockXor(X, v + j * 32 * self.r, 128 * self.r) + self.blockMixSalsa8(X, Y, Z) + + /* 7: j <-- Integerify(X) mod N */ + j = Int(self.integerify(Y) & UInt64(self.N - 1)) + + /* 8: X <-- H(X \xor V_j) */ + self.blockXor(Y, v + j * 32 * self.r, 128 * self.r) + self.blockMixSalsa8(Y, X, Z) + } + + /* 10: B' <-- X */ + for k in 0 ..< 32 * self.r { + UnsafeMutableRawPointer(block + 4 * k).storeBytes(of: X[k], as: UInt32.self) + } + } + + /// Returns the result of parsing `B_{2r-1}` as a little-endian integer. + @inline(__always) func integerify(_ block: UnsafeRawPointer) -> UInt64 { + let bi = block + (2 * self.r - 1) * 64 + return bi.load(as: UInt64.self).littleEndian + } + + /// Compute `bout = BlockMix_{salsa20/8, r}(bin)`. + /// + /// The input `bin` must be `128*r` bytes in length; the output `bout` must also be the same size. The temporary + /// space `x` must be 64 bytes. + @inline(__always) func blockMixSalsa8(_ bin: UnsafePointer, _ bout: UnsafeMutablePointer, _ x: UnsafeMutablePointer) { + /* 1: X <-- B_{2r - 1} */ + UnsafeMutableRawPointer(x).copyMemory(from: bin + (2 * self.r - 1) * 16, byteCount: 64) + + /* 2: for i = 0 to 2r - 1 do */ + for i in stride(from: 0, to: 2 * self.r, by: 2) { + /* 3: X <-- H(X \xor B_i) */ + self.blockXor(x, bin + i * 16, 64) + self.salsa20_8_typed(x) + + /* 4: Y_i <-- X */ + /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ + UnsafeMutableRawPointer(bout + i * 8).copyMemory(from: x, byteCount: 64) + + /* 3: X <-- H(X \xor B_i) */ + self.blockXor(x, bin + i * 16 + 16, 64) + self.salsa20_8_typed(x) + + /* 4: Y_i <-- X */ + /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ + UnsafeMutableRawPointer(bout + i * 8 + self.r * 16).copyMemory(from: x, byteCount: 64) + } + } + + @inline(__always) func salsa20_8_typed(_ block: UnsafeMutablePointer) { + self.salsaBlock.copyMemory(from: UnsafeRawPointer(block), byteCount: 64) + let salsaBlockTyped = self.salsaBlock.assumingMemoryBound(to: UInt32.self) + + for _ in stride(from: 0, to: 8, by: 2) { + salsaBlockTyped[4] ^= rotateLeft(salsaBlockTyped[0] &+ salsaBlockTyped[12], by: 7) + salsaBlockTyped[8] ^= rotateLeft(salsaBlockTyped[4] &+ salsaBlockTyped[0], by: 9) + salsaBlockTyped[12] ^= rotateLeft(salsaBlockTyped[8] &+ salsaBlockTyped[4], by: 13) + salsaBlockTyped[0] ^= rotateLeft(salsaBlockTyped[12] &+ salsaBlockTyped[8], by: 18) + + salsaBlockTyped[9] ^= rotateLeft(salsaBlockTyped[5] &+ salsaBlockTyped[1], by: 7) + salsaBlockTyped[13] ^= rotateLeft(salsaBlockTyped[9] &+ salsaBlockTyped[5], by: 9) + salsaBlockTyped[1] ^= rotateLeft(salsaBlockTyped[13] &+ salsaBlockTyped[9], by: 13) + salsaBlockTyped[5] ^= rotateLeft(salsaBlockTyped[1] &+ salsaBlockTyped[13], by: 18) + + salsaBlockTyped[14] ^= rotateLeft(salsaBlockTyped[10] &+ salsaBlockTyped[6], by: 7) + salsaBlockTyped[2] ^= rotateLeft(salsaBlockTyped[14] &+ salsaBlockTyped[10], by: 9) + salsaBlockTyped[6] ^= rotateLeft(salsaBlockTyped[2] &+ salsaBlockTyped[14], by: 13) + salsaBlockTyped[10] ^= rotateLeft(salsaBlockTyped[6] &+ salsaBlockTyped[2], by: 18) + + salsaBlockTyped[3] ^= rotateLeft(salsaBlockTyped[15] &+ salsaBlockTyped[11], by: 7) + salsaBlockTyped[7] ^= rotateLeft(salsaBlockTyped[3] &+ salsaBlockTyped[15], by: 9) + salsaBlockTyped[11] ^= rotateLeft(salsaBlockTyped[7] &+ salsaBlockTyped[3], by: 13) + salsaBlockTyped[15] ^= rotateLeft(salsaBlockTyped[11] &+ salsaBlockTyped[7], by: 18) + + salsaBlockTyped[1] ^= rotateLeft(salsaBlockTyped[0] &+ salsaBlockTyped[3], by: 7) + salsaBlockTyped[2] ^= rotateLeft(salsaBlockTyped[1] &+ salsaBlockTyped[0], by: 9) + salsaBlockTyped[3] ^= rotateLeft(salsaBlockTyped[2] &+ salsaBlockTyped[1], by: 13) + salsaBlockTyped[0] ^= rotateLeft(salsaBlockTyped[3] &+ salsaBlockTyped[2], by: 18) + + salsaBlockTyped[6] ^= rotateLeft(salsaBlockTyped[5] &+ salsaBlockTyped[4], by: 7) + salsaBlockTyped[7] ^= rotateLeft(salsaBlockTyped[6] &+ salsaBlockTyped[5], by: 9) + salsaBlockTyped[4] ^= rotateLeft(salsaBlockTyped[7] &+ salsaBlockTyped[6], by: 13) + salsaBlockTyped[5] ^= rotateLeft(salsaBlockTyped[4] &+ salsaBlockTyped[7], by: 18) + + salsaBlockTyped[11] ^= rotateLeft(salsaBlockTyped[10] &+ salsaBlockTyped[9], by: 7) + salsaBlockTyped[8] ^= rotateLeft(salsaBlockTyped[11] &+ salsaBlockTyped[10], by: 9) + salsaBlockTyped[9] ^= rotateLeft(salsaBlockTyped[8] &+ salsaBlockTyped[11], by: 13) + salsaBlockTyped[10] ^= rotateLeft(salsaBlockTyped[9] &+ salsaBlockTyped[8], by: 18) + + salsaBlockTyped[12] ^= rotateLeft(salsaBlockTyped[15] &+ salsaBlockTyped[14], by: 7) + salsaBlockTyped[13] ^= rotateLeft(salsaBlockTyped[12] &+ salsaBlockTyped[15], by: 9) + salsaBlockTyped[14] ^= rotateLeft(salsaBlockTyped[13] &+ salsaBlockTyped[12], by: 13) + salsaBlockTyped[15] ^= rotateLeft(salsaBlockTyped[14] &+ salsaBlockTyped[13], by: 18) + } + for i in 0 ..< 16 { + block[i] = block[i] &+ salsaBlockTyped[i] + } + } + + @inline(__always) func blockXor(_ dest: UnsafeMutableRawPointer, _ src: UnsafeRawPointer, _ len: Int) { + let D = dest.assumingMemoryBound(to: UInt64.self) + let S = src.assumingMemoryBound(to: UInt64.self) + let L = len / MemoryLayout.size + + for i in 0 ..< L { + D[i] ^= S[i] + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SecureBytes.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SecureBytes.swift new file mode 100644 index 00000000..cad06c1c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/SecureBytes.swift @@ -0,0 +1,91 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(WinSDK) +import WinSDK +#endif + +typealias Key = SecureBytes + +/// Keeps bytes in memory. Because this is class, bytes are not copied +/// and memory area is locked as long as referenced, then unlocked on deinit +final class SecureBytes { + private let bytes: Array + let count: Int + + init(bytes: Array) { + self.bytes = bytes + self.count = bytes.count + self.bytes.withUnsafeBufferPointer { (pointer) -> Void in + #if os(Windows) + VirtualLock(UnsafeMutableRawPointer(mutating: pointer.baseAddress), SIZE_T(pointer.count)) + #elseif os(WASI) + // not supported on WASI + #else + mlock(pointer.baseAddress, pointer.count) + #endif + } + } + + deinit { + self.bytes.withUnsafeBufferPointer { (pointer) -> Void in + #if os(Windows) + VirtualUnlock(UnsafeMutableRawPointer(mutating: pointer.baseAddress), SIZE_T(pointer.count)) + #elseif os(WASI) + // not supported on WASI + #else + munlock(pointer.baseAddress, pointer.count) + #endif + } + } +} + +extension SecureBytes: Collection { + typealias Index = Int + + var endIndex: Int { + self.bytes.endIndex + } + + var startIndex: Int { + self.bytes.startIndex + } + + subscript(position: Index) -> UInt8 { + self.bytes[position] + } + + subscript(bounds: Range) -> ArraySlice { + self.bytes[bounds] + } + + func formIndex(after i: inout Int) { + self.bytes.formIndex(after: &i) + } + + func index(after i: Int) -> Int { + self.bytes.index(after: i) + } +} + +extension SecureBytes: ExpressibleByArrayLiteral { + public convenience init(arrayLiteral elements: UInt8...) { + self.init(bytes: elements) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Signature.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Signature.swift new file mode 100644 index 00000000..0df65900 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Signature.swift @@ -0,0 +1,66 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +public enum SignatureError: Error { + case sign + case verify +} + +public protocol Signature: AnyObject { + var keySize: Int { get } + + /// Sign the given bytes at once + /// + /// - parameter bytes: Plaintext data to be signed + /// - returns: The signed data + func sign(_ bytes: ArraySlice) throws -> Array + /// Sign the given bytes at once + /// + /// - parameter bytes: Plaintext data to be signed + /// - returns: The signed data + func sign(_ bytes: Array) throws -> Array + + /// Verify the given bytes against the expected data + /// + /// - parameter signature: Signature data + /// - parameter expectedData: The original data that you expected to be signed + /// - returns: `True` when the signature is valid for the expected data, `False` otherwise. + func verify(signature: ArraySlice, for expectedData: ArraySlice) throws -> Bool + /// Verify the given bytes against the expected data + /// + /// - parameter signature: Signature data + /// - parameter expectedData: The original data that you expected to be signed + /// - returns: `True` when the signature is valid for the expected data, `False` otherwise. + func verify(signature: Array, for expectedData: Array) throws -> Bool +} + +extension Signature { + /// Sign the given bytes at once + /// + /// - parameter bytes: Plaintext data to be signed + /// - returns: The signed data + public func sign(_ bytes: Array) throws -> Array { + try self.sign(bytes.slice) + } + + /// Verify the given bytes against the expected data + /// + /// - parameter signature: Signature data + /// - parameter expectedData: The original data that you expected to be signed + /// - returns: `True` when the signature is valid for the expected data, `False` otherwise. + public func verify(signature: Array, for expectedData: Array) throws -> Bool { + try self.verify(signature: signature.slice, for: expectedData.slice) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamDecryptor.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamDecryptor.swift new file mode 100644 index 00000000..9ec82945 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamDecryptor.swift @@ -0,0 +1,92 @@ +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@usableFromInline +final class StreamDecryptor: Cryptor, Updatable { + + @usableFromInline + internal let blockSize: Int + + @usableFromInline + internal var worker: CipherModeWorker + + @usableFromInline + internal let padding: Padding + + @usableFromInline + internal var accumulated = Array() + + @usableFromInline + internal var lastBlockRemainder = 0 + + @usableFromInline + init(blockSize: Int, padding: Padding, _ worker: CipherModeWorker) throws { + self.blockSize = blockSize + self.padding = padding + self.worker = worker + } + + // MARK: Updatable + + @inlinable + public func update(withBytes bytes: ArraySlice, isLast: Bool) throws -> Array { + self.accumulated += bytes + + let toProcess = self.accumulated.prefix(max(self.accumulated.count - self.worker.additionalBufferSize, 0)) + + if var finalizingWorker = worker as? FinalizingDecryptModeWorker, isLast == true { + // will truncate suffix if needed + try finalizingWorker.willDecryptLast(bytes: self.accumulated.slice) + } + + var processedBytesCount = 0 + var plaintext = Array(reserveCapacity: bytes.count + self.worker.additionalBufferSize) + for chunk in toProcess.batched(by: self.blockSize) { + plaintext += self.worker.decrypt(block: chunk) + processedBytesCount += chunk.count + } + + if var finalizingWorker = worker as? FinalizingDecryptModeWorker, isLast == true { + plaintext = Array(try finalizingWorker.didDecryptLast(bytes: plaintext.slice)) + } + + // omit unecessary calculation if not needed + if self.padding != .noPadding { + self.lastBlockRemainder = plaintext.count.quotientAndRemainder(dividingBy: self.blockSize).remainder + } + + if isLast { + // CTR doesn't need padding. Really. Add padding to the last block if really want. but... don't. + plaintext = self.padding.remove(from: plaintext, blockSize: self.blockSize - self.lastBlockRemainder) + } + + self.accumulated.removeFirst(processedBytesCount) // super-slow + + if var finalizingWorker = worker as? FinalizingDecryptModeWorker, isLast == true { + plaintext = Array(try finalizingWorker.finalize(decrypt: plaintext.slice)) + } + + return plaintext + } + + @inlinable + public func seek(to position: Int) throws { + guard var worker = self.worker as? SeekableModeWorker else { + fatalError("Not supported") + } + + try worker.seek(to: position) + self.worker = worker + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamEncryptor.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamEncryptor.swift new file mode 100644 index 00000000..73d25d76 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/StreamEncryptor.swift @@ -0,0 +1,68 @@ +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@usableFromInline +final class StreamEncryptor: Cryptor, Updatable { + + @usableFromInline + internal let blockSize: Int + + @usableFromInline + internal var worker: CipherModeWorker + + @usableFromInline + internal let padding: Padding + + @usableFromInline + internal var lastBlockRemainder = 0 + + @usableFromInline + init(blockSize: Int, padding: Padding, _ worker: CipherModeWorker) throws { + self.blockSize = blockSize + self.padding = padding + self.worker = worker + } + + // MARK: Updatable + + @inlinable + public func update(withBytes bytes: ArraySlice, isLast: Bool) throws -> Array { + var accumulated = Array(bytes) + if isLast { + // CTR doesn't need padding. Really. Add padding to the last block if really want. but... don't. + accumulated = self.padding.add(to: accumulated, blockSize: self.blockSize - self.lastBlockRemainder) + } + + var encrypted = Array(reserveCapacity: bytes.count) + for chunk in accumulated.batched(by: self.blockSize) { + encrypted += self.worker.encrypt(block: chunk) + } + + // omit unecessary calculation if not needed + if self.padding != .noPadding { + self.lastBlockRemainder = encrypted.count.quotientAndRemainder(dividingBy: self.blockSize).remainder + } + + if var finalizingWorker = worker as? FinalizingEncryptModeWorker, isLast == true { + encrypted = Array(try finalizingWorker.finalize(encrypt: encrypted.slice)) + } + + return encrypted + } + + @usableFromInline + func seek(to: Int) throws { + fatalError("Not supported") + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/String+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/String+Extension.swift new file mode 100644 index 00000000..163a8a2b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/String+Extension.swift @@ -0,0 +1,96 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/** String extension */ +extension String { + + @inlinable + public var bytes: Array { + data(using: String.Encoding.utf8, allowLossyConversion: true)?.bytes ?? Array(utf8) + } + + @inlinable + public func md5() -> String { + self.bytes.md5().toHexString() + } + + @inlinable + public func sha1() -> String { + self.bytes.sha1().toHexString() + } + + @inlinable + public func sha224() -> String { + self.bytes.sha224().toHexString() + } + + @inlinable + public func sha256() -> String { + self.bytes.sha256().toHexString() + } + + @inlinable + public func sha384() -> String { + self.bytes.sha384().toHexString() + } + + @inlinable + public func sha512() -> String { + self.bytes.sha512().toHexString() + } + + @inlinable + public func sha3(_ variant: SHA3.Variant) -> String { + self.bytes.sha3(variant).toHexString() + } + + @inlinable + public func crc32(seed: UInt32? = nil, reflect: Bool = true) -> String { + self.bytes.crc32(seed: seed, reflect: reflect).bytes().toHexString() + } + + @inlinable + public func crc32c(seed: UInt32? = nil, reflect: Bool = true) -> String { + self.bytes.crc32c(seed: seed, reflect: reflect).bytes().toHexString() + } + + @inlinable + public func crc16(seed: UInt16? = nil) -> String { + self.bytes.crc16(seed: seed).bytes().toHexString() + } + + /// - parameter cipher: Instance of `Cipher` + /// - returns: hex string of bytes + @inlinable + public func encrypt(cipher: Cipher) throws -> String { + try self.bytes.encrypt(cipher: cipher).toHexString() + } + + /// - parameter cipher: Instance of `Cipher` + /// - returns: base64 encoded string of encrypted bytes + @inlinable + public func encryptToBase64(cipher: Cipher) throws -> String { + try self.bytes.encrypt(cipher: cipher).toBase64() + } + + // decrypt() does not make sense for String + + /// - parameter authenticator: Instance of `Authenticator` + /// - returns: hex string of string + @inlinable + public func authenticate(with authenticator: A) throws -> String { + try self.bytes.authenticate(with: authenticator).toHexString() + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt128.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt128.swift new file mode 100644 index 00000000..76b3b3f2 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt128.swift @@ -0,0 +1,90 @@ +// +// UInt128.swift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +struct UInt128: Equatable, ExpressibleByIntegerLiteral { + let i: (a: UInt64, b: UInt64) + + typealias IntegerLiteralType = UInt64 + + init(integerLiteral value: IntegerLiteralType) { + self = UInt128(value) + } + + init(_ raw: Array) { + self = raw.prefix(MemoryLayout.stride).withUnsafeBytes({ (rawBufferPointer) -> UInt128 in + let arr = rawBufferPointer.bindMemory(to: UInt64.self) + return UInt128((arr[0].bigEndian, arr[1].bigEndian)) + }) + } + + init(_ raw: ArraySlice) { + self.init(Array(raw)) + } + + init(_ i: (a: UInt64, b: UInt64)) { + self.i = i + } + + init(a: UInt64, b: UInt64) { + self.init((a, b)) + } + + init(_ b: UInt64) { + self.init((0, b)) + } + + // Bytes + var bytes: Array { + var at = self.i.a.bigEndian + var bt = self.i.b.bigEndian + + let ar = Data(bytes: &at, count: MemoryLayout.size(ofValue: at)) + let br = Data(bytes: &bt, count: MemoryLayout.size(ofValue: bt)) + + var result = Data() + result.append(ar) + result.append(br) + return result.bytes + } + + static func ^ (n1: UInt128, n2: UInt128) -> UInt128 { + UInt128((n1.i.a ^ n2.i.a, n1.i.b ^ n2.i.b)) + } + + static func & (n1: UInt128, n2: UInt128) -> UInt128 { + UInt128((n1.i.a & n2.i.a, n1.i.b & n2.i.b)) + } + + static func >> (value: UInt128, by: Int) -> UInt128 { + var result = value + for _ in 0..> 1 + let b = result.i.b >> 1 + ((result.i.a & 1) << 63) + result = UInt128((a, b)) + } + return result + } + + // Equatable. + static func == (lhs: UInt128, rhs: UInt128) -> Bool { + lhs.i == rhs.i + } + + static func != (lhs: UInt128, rhs: UInt128) -> Bool { + !(lhs == rhs) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt16+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt16+Extension.swift new file mode 100644 index 00000000..a9b795a1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt16+Extension.swift @@ -0,0 +1,37 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/** array of bytes */ +extension UInt16 { + @_specialize(where T == ArraySlice) + init(bytes: T) where T.Element == UInt8, T.Index == Int { + self = UInt16(bytes: bytes, fromIndex: bytes.startIndex) + } + + @_specialize(where T == ArraySlice) + init(bytes: T, fromIndex index: T.Index) where T.Element == UInt8, T.Index == Int { + if bytes.isEmpty { + self = 0 + return + } + + let count = bytes.count + + let val0 = count > 0 ? UInt16(bytes[index.advanced(by: 0)]) << 8 : 0 + let val1 = count > 1 ? UInt16(bytes[index.advanced(by: 1)]) : 0 + + self = val0 | val1 + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt32+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt32+Extension.swift new file mode 100644 index 00000000..58905a8c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt32+Extension.swift @@ -0,0 +1,51 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#endif + +protocol _UInt32Type {} +extension UInt32: _UInt32Type {} + +/** array of bytes */ +extension UInt32 { + @_specialize(where T == ArraySlice) + init(bytes: T) where T.Element == UInt8, T.Index == Int { + self = UInt32(bytes: bytes, fromIndex: bytes.startIndex) + } + + @_specialize(where T == ArraySlice) + @inlinable + init(bytes: T, fromIndex index: T.Index) where T.Element == UInt8, T.Index == Int { + if bytes.isEmpty { + self = 0 + return + } + + let count = bytes.count + + let val0 = count > 0 ? UInt32(bytes[index.advanced(by: 0)]) << 24 : 0 + let val1 = count > 1 ? UInt32(bytes[index.advanced(by: 1)]) << 16 : 0 + let val2 = count > 2 ? UInt32(bytes[index.advanced(by: 2)]) << 8 : 0 + let val3 = count > 3 ? UInt32(bytes[index.advanced(by: 3)]) : 0 + + self = val0 | val1 | val2 | val3 + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt64+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt64+Extension.swift new file mode 100644 index 00000000..8e59e0cf --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt64+Extension.swift @@ -0,0 +1,44 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/** array of bytes */ +extension UInt64 { + @_specialize(where T == ArraySlice) + init(bytes: T) where T.Element == UInt8, T.Index == Int { + self = UInt64(bytes: bytes, fromIndex: bytes.startIndex) + } + + @_specialize(where T == ArraySlice) + @inlinable + init(bytes: T, fromIndex index: T.Index) where T.Element == UInt8, T.Index == Int { + if bytes.isEmpty { + self = 0 + return + } + + let count = bytes.count + + let val0 = count > 0 ? UInt64(bytes[index.advanced(by: 0)]) << 56 : 0 + let val1 = count > 1 ? UInt64(bytes[index.advanced(by: 1)]) << 48 : 0 + let val2 = count > 2 ? UInt64(bytes[index.advanced(by: 2)]) << 40 : 0 + let val3 = count > 3 ? UInt64(bytes[index.advanced(by: 3)]) << 32 : 0 + let val4 = count > 4 ? UInt64(bytes[index.advanced(by: 4)]) << 24 : 0 + let val5 = count > 5 ? UInt64(bytes[index.advanced(by: 5)]) << 16 : 0 + let val6 = count > 6 ? UInt64(bytes[index.advanced(by: 6)]) << 8 : 0 + let val7 = count > 7 ? UInt64(bytes[index.advanced(by: 7)]) : 0 + + self = val0 | val1 | val2 | val3 | val4 | val5 | val6 | val7 + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt8+Extension.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt8+Extension.swift new file mode 100644 index 00000000..d908920e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/UInt8+Extension.swift @@ -0,0 +1,74 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Darwin) +import Darwin +#elseif canImport(Glibc) +import Glibc +#elseif canImport(ucrt) +import ucrt +#endif + +public protocol _UInt8Type {} +extension UInt8: _UInt8Type {} + +/** casting */ +extension UInt8 { + /** cast because UInt8() because std initializer crash if value is > byte */ + static func with(value: UInt64) -> UInt8 { + let tmp = value & 0xff + return UInt8(tmp) + } + + static func with(value: UInt32) -> UInt8 { + let tmp = value & 0xff + return UInt8(tmp) + } + + static func with(value: UInt16) -> UInt8 { + let tmp = value & 0xff + return UInt8(tmp) + } +} + +/** Bits */ +extension UInt8 { + /** array of bits */ + public func bits() -> [Bit] { + let totalBitsCount = MemoryLayout.size * 8 + + var bitsArray = [Bit](repeating: Bit.zero, count: totalBitsCount) + + for j in 0.. String { + var s = String() + let arr: [Bit] = self.bits() + for idx in arr.indices { + s += (arr[idx] == Bit.one ? "1" : "0") + if idx.advanced(by: 1) % 8 == 0 { s += " " } + } + return s + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Updatable.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Updatable.swift new file mode 100644 index 00000000..e1f2d33c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Updatable.swift @@ -0,0 +1,107 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// A type that supports incremental updates. For example Digest or Cipher may be updatable +/// and calculate result incerementally. +public protocol Updatable { + /// Update given bytes in chunks. + /// + /// - parameter bytes: Bytes to process. + /// - parameter isLast: Indicate if given chunk is the last one. No more updates after this call. + /// - returns: Processed partial result data or empty array. + mutating func update(withBytes bytes: ArraySlice, isLast: Bool) throws -> Array + + /// Update given bytes in chunks. + /// + /// - Parameters: + /// - bytes: Bytes to process. + /// - isLast: Indicate if given chunk is the last one. No more updates after this call. + /// - output: Resulting bytes callback. + /// - Returns: Processed partial result data or empty array. + mutating func update(withBytes bytes: ArraySlice, isLast: Bool, output: (_ bytes: Array) -> Void) throws +} + +extension Updatable { + @inlinable + public mutating func update(withBytes bytes: ArraySlice, isLast: Bool = false, output: (_ bytes: Array) -> Void) throws { + let processed = try update(withBytes: bytes, isLast: isLast) + if !processed.isEmpty { + output(processed) + } + } + + @inlinable + public mutating func update(withBytes bytes: ArraySlice, isLast: Bool = false) throws -> Array { + try self.update(withBytes: bytes, isLast: isLast) + } + + @inlinable + public mutating func update(withBytes bytes: Array, isLast: Bool = false) throws -> Array { + try self.update(withBytes: bytes.slice, isLast: isLast) + } + + @inlinable + public mutating func update(withBytes bytes: Array, isLast: Bool = false, output: (_ bytes: Array) -> Void) throws { + try self.update(withBytes: bytes.slice, isLast: isLast, output: output) + } + + /// Finish updates. This may apply padding. + /// - parameter bytes: Bytes to process + /// - returns: Processed data. + @inlinable + public mutating func finish(withBytes bytes: ArraySlice) throws -> Array { + try self.update(withBytes: bytes, isLast: true) + } + + @inlinable + public mutating func finish(withBytes bytes: Array) throws -> Array { + try self.finish(withBytes: bytes.slice) + } + + /// Finish updates. May add padding. + /// + /// - Returns: Processed data + /// - Throws: Error + @inlinable + public mutating func finish() throws -> Array { + try self.update(withBytes: [], isLast: true) + } + + /// Finish updates. This may apply padding. + /// - parameter bytes: Bytes to process + /// - parameter output: Resulting data + /// - returns: Processed data. + @inlinable + public mutating func finish(withBytes bytes: ArraySlice, output: (_ bytes: Array) -> Void) throws { + let processed = try update(withBytes: bytes, isLast: true) + if !processed.isEmpty { + output(processed) + } + } + + @inlinable + public mutating func finish(withBytes bytes: Array, output: (_ bytes: Array) -> Void) throws { + try self.finish(withBytes: bytes.slice, output: output) + } + + /// Finish updates. May add padding. + /// + /// - Parameter output: Processed data + /// - Throws: Error + @inlinable + public mutating func finish(output: (Array) -> Void) throws { + try self.finish(withBytes: [], output: output) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Utils.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Utils.swift new file mode 100644 index 00000000..e26496a5 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/Utils.swift @@ -0,0 +1,117 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +@inlinable +func rotateLeft(_ value: UInt8, by: UInt8) -> UInt8 { + ((value << by) & 0xff) | (value >> (8 - by)) +} + +@inlinable +func rotateLeft(_ value: UInt16, by: UInt16) -> UInt16 { + ((value << by) & 0xffff) | (value >> (16 - by)) +} + +@inlinable +func rotateLeft(_ value: UInt32, by: UInt32) -> UInt32 { + ((value << by) & 0xffffffff) | (value >> (32 - by)) +} + +@inlinable +func rotateLeft(_ value: UInt64, by: UInt64) -> UInt64 { + (value << by) | (value >> (64 - by)) +} + +@inlinable +func rotateRight(_ value: UInt16, by: UInt16) -> UInt16 { + (value >> by) | (value << (16 - by)) +} + +@inlinable +func rotateRight(_ value: UInt32, by: UInt32) -> UInt32 { + (value >> by) | (value << (32 - by)) +} + +@inlinable +func rotateRight(_ value: UInt64, by: UInt64) -> UInt64 { + ((value >> by) | (value << (64 - by))) +} + +@inlinable +func reversed(_ uint8: UInt8) -> UInt8 { + var v = uint8 + v = (v & 0xf0) >> 4 | (v & 0x0f) << 4 + v = (v & 0xcc) >> 2 | (v & 0x33) << 2 + v = (v & 0xaa) >> 1 | (v & 0x55) << 1 + return v +} + +@inlinable +func reversed(_ uint32: UInt32) -> UInt32 { + var v = uint32 + v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1) + v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2) + v = ((v >> 4) & 0x0f0f0f0f) | ((v & 0x0f0f0f0f) << 4) + v = ((v >> 8) & 0x00ff00ff) | ((v & 0x00ff00ff) << 8) + v = ((v >> 16) & 0xffff) | ((v & 0xffff) << 16) + return v +} + +@inlinable +func xor(_ left: T, _ right: V) -> ArraySlice where T: RandomAccessCollection, V: RandomAccessCollection, T.Element == UInt8, T.Index == Int, V.Element == UInt8, V.Index == Int { + return xor(left, right).slice +} + +@inlinable +func xor(_ left: T, _ right: V) -> Array where T: RandomAccessCollection, V: RandomAccessCollection, T.Element == UInt8, T.Index == Int, V.Element == UInt8, V.Index == Int { + let length = Swift.min(left.count, right.count) + + let buf = UnsafeMutablePointer.allocate(capacity: length) + buf.initialize(repeating: 0, count: length) + defer { + buf.deinitialize(count: length) + buf.deallocate() + } + + // xor + for i in 0.., blockSize: Int, allowance: Int = 0) { + let msgLength = data.count + // Step 1. Append Padding Bits + // append one bit (UInt8 with one bit) to message + data.append(0x80) + + // Step 2. append "0" bit until message length in bits ≡ 448 (mod 512) + let max = blockSize - allowance // 448, 986 + if msgLength % blockSize < max { // 448 + data += Array(repeating: 0, count: max - 1 - (msgLength % blockSize)) + } else { + data += Array(repeating: 0, count: blockSize + max - 1 - (msgLength % blockSize)) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ZeroPadding.swift b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ZeroPadding.swift new file mode 100644 index 00000000..afe157dc --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Sources/CryptoSwift/ZeroPadding.swift @@ -0,0 +1,40 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +/// All the bytes that are required to be padded are padded with zero. +/// Zero padding may not be reversible if the original file ends with one or more zero bytes. +struct ZeroPadding: PaddingProtocol { + init() { + } + + @inlinable + func add(to bytes: Array, blockSize: Int) -> Array { + let paddingCount = blockSize - (bytes.count % blockSize) + if paddingCount > 0 { + return bytes + Array(repeating: 0, count: paddingCount) + } + return bytes + } + + @inlinable + func remove(from bytes: Array, blockSize _: Int?) -> Array { + for (idx, value) in bytes.reversed().enumerated() { + if value != 0 { + return Array(bytes[0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class AESCCMTests: XCTestCase { + + struct TestFixture { + let tagLength: Int + let key: Array + let nonce: Array + let aad: Array + let plaintext: Array + let expected: Array + + init(_ tagLength: Int, _ key: String, _ nonce: String, _ plaintext: String, _ expected: String, _ aad: String) { + self.tagLength = tagLength + self.key = Array(hex: key) + self.nonce = Array(hex: nonce) + self.aad = Array(hex: aad) + self.plaintext = Array(hex: plaintext) + self.expected = Array(hex: expected) + } + } + + func testAESCCMTestDVPT256() { + let fixtures = [ + //NIST Test vectors for AES-CCM with 256bit Key, from DVPT256.txt + //(Integer macLength, String key, String nonce, String plain, String ciphered, String aData) { + TestFixture(4, "eda32f751456e33195f1f499cf2dc7c97ea127b6d488f211ccc5126fbb24afa6", "a544218dadd3c1", "", "469c90bb", ""), + TestFixture(4, "eda32f751456e33195f1f499cf2dc7c97ea127b6d488f211ccc5126fbb24afa6", "dbb3923156cfd6", "", "1302d515", ""), + TestFixture(4, "eda32f751456e33195f1f499cf2dc7c97ea127b6d488f211ccc5126fbb24afa6", "a259c114eaac89", "", "4fe06e92", ""), + TestFixture(4, "eda32f751456e33195f1f499cf2dc7c97ea127b6d488f211ccc5126fbb24afa6", "e1be89af98ffd7", "", "e5417f6b", ""), + TestFixture(4, "eda32f751456e33195f1f499cf2dc7c97ea127b6d488f211ccc5126fbb24afa6", "1aa758eb2f9a28", "", "f8fa8e71", ""), + TestFixture(16, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "a544218dadd3c1", "", "8207eb14d33855a52acceed17dbcbf6e", ""), + TestFixture(16, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "dbb3923156cfd6", "", "e4dc5e03aacea691262ee69cee8ffbbe", ""), + TestFixture(16, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "a259c114eaac89", "", "f79c53fd5e69835b7e70496ea999718b", ""), + TestFixture(16, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "e1be89af98ffd7", "", "10d3f6fe08280d45e67e58fe41a7f036", ""), + TestFixture(16, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "1aa758eb2f9a28", "", "2590df2453cb94c304ba0a2bff3f3c71", ""), + TestFixture(4, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "a544218dadd3c10583db49cf39", "", "8a19a133", ""), + TestFixture(4, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "79ac204a26b9fee1132370c20f", "", "154024b2", ""), + TestFixture(4, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "0545fd9ecbc73ccdbbbd4244fd", "", "5c349fb2", ""), + TestFixture(4, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "0a37f2e7c66490e97285f1b09e", "", "c59bf14c", ""), + TestFixture(4, "e1b8a927a95efe94656677b692662000278b441c79e879dd5c0ddc758bdc9ee8", "c1ad812bf2bbb2cdaee4636ee7", "", "5b96f41d", ""), + TestFixture(16, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "a544218dadd3c10583db49cf39", "", "97e1a8dd4259ccd2e431e057b0397fcf", ""), + TestFixture(16, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "79ac204a26b9fee1132370c20f", "", "5c8c9a5b97be8c7bc01ca8d693b809f9", ""), + TestFixture(16, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "0545fd9ecbc73ccdbbbd4244fd", "", "84201662b213c7a1ff0c1b3c25e4ec45", ""), + TestFixture(16, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "0a37f2e7c66490e97285f1b09e", "", "586e728193ce6db9a926b03b2d77dd6e", ""), + TestFixture(16, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "c1ad812bf2bbb2cdaee4636ee7", "", "64864d21b6ee3fca13f07fc0486e232d", ""), + TestFixture(4, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "a544218dadd3c1", "d3d5424e20fbec43ae495353ed830271515ab104f8860c98", "64a1341679972dc5869fcf69b19d5c5ea50aa0b5e985f5b722aa8d59", ""), + TestFixture(4, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "9d773a31fe2ec7", "839d8cfa2c921c3cceb7d1f46bd2eaad706e53f64523d8c0", "5acfbe5e488976d8b9b77e69a736e8c919053f9415551209dce2d25e", ""), + TestFixture(4, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "24b7a65391f88b", "3bed52236182c19418867d468dbf47c8aac46c02445f99bb", "f00628e10e8e0115b4a4532a1212a23aade4090832c1972d750125f3", ""), + TestFixture(4, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "b672c91376f533", "4f7a561e61b7861719e4445057ac9b74a9be953b772b09ec", "758aa03dc72c362c43b5f85bfaa3db4a74860887a8c29e47d5642830", ""), + TestFixture(4, "af063639e66c284083c5cf72b70d8bc277f5978e80d9322d99f2fdc718cda569", "a6d01fb88ca547", "a36155de477364236591e453008114075b4872120ef17264", "615cbeabbe163ba8bc9c073df9ad40833fcf3f424644ccc37aa999d7", ""), + TestFixture(16, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "a544218dadd3c1", "d3d5424e20fbec43ae495353ed830271515ab104f8860c98", "bc51c3925a960e7732533e4ef3a4f69ee6826de952bcb0fd374f3bb6db8377ebfc79674858c4f305", ""), + TestFixture(16, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "9d773a31fe2ec7", "839d8cfa2c921c3cceb7d1f46bd2eaad706e53f64523d8c0", "4539bb13382b034ddb16a3329148f9243a4eee998fe444aff2870ce198af11f4fb698a67af6c89ad", ""), + TestFixture(16, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "24b7a65391f88b", "3bed52236182c19418867d468dbf47c8aac46c02445f99bb", "6d0f928352a17d63aca1899cbd305e1f831f1638d27c1e24432704eff9b6830476db3d30d4c103e4", ""), + TestFixture(16, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "b672c91376f533", "4f7a561e61b7861719e4445057ac9b74a9be953b772b09ec", "f23ac1426cb1130c9a0913b347d8efafb6ed125913aa678a9dc42d22a5436bc12eff5505edb25e19", ""), + TestFixture(16, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "a6d01fb88ca547", "a36155de477364236591e453008114075b4872120ef17264", "773b8eea2e9830297ac11d3c1f6ea4008c96040e83d76d55789d2043179fdd8fdcbd52313b7b15cb", ""), + TestFixture(4, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "a544218dadd3c10583db49cf39", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e", "63e00d30e4b08fd2a1cc8d70fab327b2368e77a93be4f4123d14fb3f", ""), + TestFixture(4, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "1501a243bf60b2cb40d5aa20ca", "f5730a05fec31a11662e2e14e362ccc75c7c30cdfccbf994", "377b2f1e7bd9e3d1077038e084f61950761361095f7eeebbf1a72afc", ""), + TestFixture(4, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "d65e0e53f765f9d5e6795c0c5e", "20e394c7cc90bdfa6186fc1ba6fff158dfc690e24ba4c9fb", "6cab3060bf3b33b163b933c2ed0ba51406810b54d0edcf5c9d0ef4f7", ""), + TestFixture(4, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "a6b2371acf8321864c08ddb4d8", "1a43ca628026219c5a430c54021a5a3152ae517167399635", "c5aa500d1f7c09a590e9d15d6860c4433684e04dd6bc5c8f94f223f0", ""), + TestFixture(4, "f7079dfa3b5c7b056347d7e437bcded683abd6e2c9e069d333284082cbb5d453", "c2b60f14c894ec6178fe79919f", "3e707d98f19972a63d913e6ea7533af2f41ff98aee2b2a36", "852cca903d7fdf899807bd14642057534c8a0ccacb8c7b8fb4d35d44", ""), + TestFixture(16, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "a544218dadd3c10583db49cf39", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e", "f0050ad16392021a3f40207bed3521fb1e9f808f49830c423a578d179902f912f9ea1afbce1120b3", ""), + TestFixture(16, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "1501a243bf60b2cb40d5aa20ca", "f5730a05fec31a11662e2e14e362ccc75c7c30cdfccbf994", "254b847d4175bbb44a82b4e805514fa444c224710933f3ec8aaa3f0133234c0cd91609982adc034b", ""), + TestFixture(16, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "d65e0e53f765f9d5e6795c0c5e", "20e394c7cc90bdfa6186fc1ba6fff158dfc690e24ba4c9fb", "c3618c991b15de641d291419ff6957e8b9ae5046dd8c6f08fafb76adf12f36740347e3edae62bca4", ""), + TestFixture(16, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "a6b2371acf8321864c08ddb4d8", "1a43ca628026219c5a430c54021a5a3152ae517167399635", "bd37326da18e5ac79a1a9512f724bb539530868576b79c67acb5a51d10a58d6584fbe73f1063c31b", ""), + TestFixture(16, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "c2b60f14c894ec6178fe79919f", "3e707d98f19972a63d913e6ea7533af2f41ff98aee2b2a36", "ecd337640022635ce1ed273756d02b7feeb2515614c1fadc95c66d3f411b478853886afd177d88c3", ""), + TestFixture(4, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "a544218dadd3c1", "", "92d00fbe", "d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab"), + TestFixture(4, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "3fcb328bc96404", "", "11250056", "10b2ffed4f95af0f98ed4f77c677b5786ad01b31c095bbc6e1c99cf13977abba"), + TestFixture(4, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "c42ac63de6f12a", "", "4eed80fd", "7ff8d06c5abcc50d3820de34b03089e6c5b202bcbaabca892825553d4d30020a"), + TestFixture(4, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "3a1701b185d33a", "", "9a5382c3", "e5d54df8ed9f89b98c5ebb1bc5d5279c2e182784ff4cd9c869ae152e29d7a2b2"), + TestFixture(4, "1b0e8df63c57f05d9ac457575ea764524b8610ae5164e6215f426f5a7ae6ede4", "4f490ce07e0150", "", "e1842c46", "3e12d09632c644c540077c6f90726d4167423a679322b2000a3f19cfcea02b33"), + TestFixture(16, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "a544218dadd3c1", "", "93af11a08379eb37a16aa2837f09d69d", "d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab"), + TestFixture(16, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "3fcb328bc96404", "", "b3884b69d117146cfa5529901753ddc0", "10b2ffed4f95af0f98ed4f77c677b5786ad01b31c095bbc6e1c99cf13977abba"), + TestFixture(16, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "c42ac63de6f12a", "", "b53d93cbfd3d5cf3720cef5080bc7224", "7ff8d06c5abcc50d3820de34b03089e6c5b202bcbaabca892825553d4d30020a"), + TestFixture(16, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "3a1701b185d33a", "", "0a5d1bc02c5fe096a8b9d94d1267c49a", "e5d54df8ed9f89b98c5ebb1bc5d5279c2e182784ff4cd9c869ae152e29d7a2b2"), + TestFixture(16, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "4f490ce07e0150", "", "1eda43bf07f2bf003107f3a0ba3a4c18", "3e12d09632c644c540077c6f90726d4167423a679322b2000a3f19cfcea02b33"), + TestFixture(4, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "a544218dadd3c10583db49cf39", "", "866d4227", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e09a1005e024f6907"), + TestFixture(4, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "dfdcbdff329f7af70731d8e276", "", "c4ac0952", "2ae56ddde2876d70b3b34eda8c2b1d096c836d5225d53ec460b724b6e16aa5a3"), + TestFixture(4, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "60f2490ba0c658848859fcbea8", "", "27c3953d", "3ad743283064929bf4fe4e0807f710f5e6a273e22614c728c3280a27b6c614a0"), + TestFixture(4, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "db113f38f0504615c5c9347c3d", "", "c38fbdff", "3b71bc84e48c6dadf6ead14621d22468a3d4c9c103ac96970269730bcfce239b"), + TestFixture(4, "a4bc10b1a62c96d459fbaf3a5aa3face7313bb9e1253e696f96a7a8e36801088", "d35f531f714694b5e49303a980", "", "d34e90bb", "55b791ee495299916ff3c2327b4990952bebd0a2da9acfc553c6c996e354a4b5"), + TestFixture(16, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "a544218dadd3c10583db49cf39", "", "867b0d87cf6e0f718200a97b4f6d5ad5", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e09a1005e024f6907"), + TestFixture(16, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "dfdcbdff329f7af70731d8e276", "", "ad879c64425e6c1ec4841bbb0f99aa8b", "2ae56ddde2876d70b3b34eda8c2b1d096c836d5225d53ec460b724b6e16aa5a3"), + TestFixture(16, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "60f2490ba0c658848859fcbea8", "", "e2751f153fc76c0dec5e0cf2d30c1a28", "3ad743283064929bf4fe4e0807f710f5e6a273e22614c728c3280a27b6c614a0"), + TestFixture(16, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "db113f38f0504615c5c9347c3d", "", "fc85464a81fe372c12c9e4f0f3bf9c37", "3b71bc84e48c6dadf6ead14621d22468a3d4c9c103ac96970269730bcfce239b"), + TestFixture(16, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "d35f531f714694b5e49303a980", "", "b1c09b093788da19e33c5a6e82ed9627", "55b791ee495299916ff3c2327b4990952bebd0a2da9acfc553c6c996e354a4b5"), + TestFixture(4, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "a544218dadd3c1", "78c46e3249ca28e1ef0531d80fd37c124d9aecb7be6668e3", "c2fe12658139f5d0dd22cadf2e901695b579302a72fc56083ebc7720", "d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab"), + TestFixture(4, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "57b940550a383b", "6fb5ce32a851676753ba3523edc5ca82af1843ffc08f1ef0", "e1b4ec4279bb62902c12521e6b874171695c5da46c647cc03b91ff03", "33c2c3a57bf8393b126982c96d87daeacd5eadad1519073ad8c84cb9b760296f"), + TestFixture(4, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "f32222e9eec4bd", "2c29d4e2bb9294e90cb04ec697e663a1f7385a39f90c8ccf", "224db21beb8cd0069007660e783c3f85706b014128368aab2a4e56a7", "684595e36eda1db5f586941c9f34c9f8d477970d5ccc14632d1f0cec8190ae68"), + TestFixture(4, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "14c9bd561c47c1", "c22524a1ea444be3412b0d773d4ea2ff0af4c1ad2383cba8", "61b46c9024eed3989064a52df90349c18e14e4b552779d3f8f9d6814", "141ae365f8e65ab9196c4e8cd4e62189b304d67de38f2117e84ec0ec8f260ebd"), + TestFixture(4, "8c5cf3457ff22228c39c051c4e05ed4093657eb303f859a9d4b0f8be0127d88a", "1ccec9923aa6e8", "518a7fb11c463bf23798982118f3cfe4d7ddde9184f37d4f", "52f8205534447d722be2b9377f7395938cc88af081a11ccb0d83fa19", "88a6d037009a1c1756f72bb4589d6d940bd514ed55386baefacc6ac3ca6f8795"), + TestFixture(16, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "a544218dadd3c1", "78c46e3249ca28e1ef0531d80fd37c124d9aecb7be6668e3", "3341168eb8c48468c414347fb08f71d2086f7c2d1bd581ce1ac68bd42f5ec7fa7e068cc0ecd79c2a", "d3d5424e20fbec43ae495353ed830271515ab104f8860c988d15b6d36c038eab"), + TestFixture(16, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "57b940550a383b", "6fb5ce32a851676753ba3523edc5ca82af1843ffc08f1ef0", "fbfed2c94f50ca10466da9903ef85833ad48ca00556e66d14d8b30df941f3536ffb42083ef0e1c30", "33c2c3a57bf8393b126982c96d87daeacd5eadad1519073ad8c84cb9b760296f"), + TestFixture(16, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "f32222e9eec4bd", "2c29d4e2bb9294e90cb04ec697e663a1f7385a39f90c8ccf", "dae13e6967c8b1ee0dd2d5ba1dd1de69f22c95da39528f9ef78e9e5e9faa058112af57f4ac78db2c", "684595e36eda1db5f586941c9f34c9f8d477970d5ccc14632d1f0cec8190ae68"), + TestFixture(16, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "14c9bd561c47c1", "c22524a1ea444be3412b0d773d4ea2ff0af4c1ad2383cba8", "a654238fb8b05e293dba07f9d68d75a7f0fbf40fe20edaeba1586bf922412e73ce338e372615c3bc", "141ae365f8e65ab9196c4e8cd4e62189b304d67de38f2117e84ec0ec8f260ebd"), + TestFixture(16, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "1ccec9923aa6e8", "518a7fb11c463bf23798982118f3cfe4d7ddde9184f37d4f", "765067ef768908d91ee4c3923943e0c7be70e2e06db99a4b3e3f51ee37fdcc5d81dd85d9e9d4f44e", "88a6d037009a1c1756f72bb4589d6d940bd514ed55386baefacc6ac3ca6f8795"), + TestFixture(4, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "a544218dadd3c10583db49cf39", "e8de970f6ee8e80ede933581b5bcf4d837e2b72baa8b00c3", "c0ea400b599561e7905b99262b4565d5c3dc49fad84d7c69ef891339", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e09a1005e024f6907"), + TestFixture(4, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "0dd613c0fe28e913c0edbb8404", "9522fb1f1aa58493cba682d788186d902cfc93e80fd6b998", "fabe11c9629e598228f5209f3dbcc641fe4b1a22cadb0821d2898c3b", "2ad306575b577c2f61da7212ab63e3db3941f1f751f2356c7443531a90b9d141"), + TestFixture(4, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "3e0fe3427eeda80f02dda4fed5", "38333ce78110bf53a2c2abc7db99e133ad218ca43ff7a7bc", "d88f8fcd772125212ce09c2a6e5b5693dd35073f992004f0d18fc889", "ae0d1c9c834d60ff0ecfb3c0d78c72ddb789e58adfc166c81d5fc6395b31ec33"), + TestFixture(4, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "60122cbd219e5cf17415e8bc09", "794e734966e6d0001699aec3f8ab8f194de7653d3091b1b9", "76bdd9a7b34bf14ae121a87fdfa144f71b848744af6a2f0b1c0d067c", "895a45ddbe0c80793eccbf820de13a233b6aa7045cfd5313388e7184c392b216"), + TestFixture(4, "705334e30f53dd2f92d190d2c1437c8772f940c55aa35e562214ed45bd458ffe", "3542fbe0f59a6d5f3abf619b7d", "c5b3d71312ea14f2f8fae5bd1a453192b6604a45db75c5ed", "617d8036e2039d516709062379e0550cbd71ebb90fea967c79018ad5", "dd4531f158a2fa3bc8a339f770595048f4a42bc1b03f2e824efc6ba4985119d8"), + TestFixture(16, "314a202f836f9f257e22d8c11757832ae5131d357a72df88f3eff0ffcee0da4e", "a544218dadd3c10583db49cf39", "e8de970f6ee8e80ede933581b5bcf4d837e2b72baa8b00c3", "8d34cdca37ce77be68f65baf3382e31efa693e63f914a781367f30f2eaad8c063ca50795acd90203", "3c0e2815d37d844f7ac240ba9d6e3a0b2a86f706e885959e09a1005e024f6907"), + TestFixture(16, "314a202f836f9f257e22d8c11757832ae5131d357a72df88f3eff0ffcee0da4e", "0dd613c0fe28e913c0edbb8404", "9522fb1f1aa58493cba682d788186d902cfc93e80fd6b998", "6df09613ea986c2d91a57a45a0942cbf20e0dfca12fbda8c945ee6db24aea5f5098952f1203339ce", "2ad306575b577c2f61da7212ab63e3db3941f1f751f2356c7443531a90b9d141"), + TestFixture(16, "314a202f836f9f257e22d8c11757832ae5131d357a72df88f3eff0ffcee0da4e", "3e0fe3427eeda80f02dda4fed5", "38333ce78110bf53a2c2abc7db99e133ad218ca43ff7a7bc", "2bfe51f1f43b982d47f76ea8206ddbf585d6f30cec0d4ef16b1556631d3b52bf24154afec1448ef6", "ae0d1c9c834d60ff0ecfb3c0d78c72ddb789e58adfc166c81d5fc6395b31ec33"), + TestFixture(16, "314a202f836f9f257e22d8c11757832ae5131d357a72df88f3eff0ffcee0da4e", "60122cbd219e5cf17415e8bc09", "794e734966e6d0001699aec3f8ab8f194de7653d3091b1b9", "bf0d219bb50fcc1d51f654bb0fd8b44efa25aef39e2f11afe47d00f2eebb544e6ba7559ac2f34edb", "895a45ddbe0c80793eccbf820de13a233b6aa7045cfd5313388e7184c392b216"), + TestFixture(16, "314a202f836f9f257e22d8c11757832ae5131d357a72df88f3eff0ffcee0da4e", "3542fbe0f59a6d5f3abf619b7d", "c5b3d71312ea14f2f8fae5bd1a453192b6604a45db75c5ed", "39c2e8f6edfe663b90963b98eb79e2d4f7f28a5053ae8881567a6b4426f1667136bed4a5e32a2bc1", "dd4531f158a2fa3bc8a339f770595048f4a42bc1b03f2e824efc6ba4985119d8"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "ca482c674b599046cc7d7ee0d00eec1e", "b4f8326944a45d95f91887c2a6ac36b60eea5edef84c1c358146a666b6878335"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "67747defe5da5fecc00b9bf3b249f434", "36c17fd901169e5b144fdb2c4bea8cd65ad8acf7b4d3dd39acf2ad83da7b1971"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "c57ef5d0faf49149c311707493a4cfd4", "9a37c654ab8e5a0c6bdfff9793457197d206ed207d768cbc8318cfb39f077b89"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "bc2fb5571a7563bb90689a229d2f63a7", "5ab80169184541393a6975f442ee583cd432d71a6d1568fa51159df7c5b8f959"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "428888c6420c56806f465b415a66e65a", "c78a22a667aafab0c94047e03837d51b11490693d5c57ea27b901ff80b6a38f9"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "9f1b7520025e1075731adc946b80121d", "e11e30cbf63623816379f578788b0c8e6b59ee3c9c50aa6e1dcd749172d48fed"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "bd36b053b6a90f19e3b6622cba93105d", "05716168829276ff7ab23b7dd373db361e6d9e1f11d0028d374a0d3fe62be19f"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "458595a3413b965b189de46703760aa0", "3e915389639435629fcc01e1b7022d3574e2848e9151261ad801d03387425dd7"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "8b259b84a6ee5669e175affca8ba3b1a", "2f496be73a9a5d9db5927e622e166c6ec946150687b21c51c8ca7e680f9775ac"), + TestFixture(16, "c6c14c655e52c8a4c7e8d54e974d698e1f21ee3ba717a0adfa6136d02668c476", "291e91b19de518cd7806de44f6", "", "c5f35fdf2b63e77a18d154f0ddcfedbf", "0a8725bd8c8eab9ed52ca47835837b9f00a6c8d834ab17105b01eb4eb30402e7"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "1a", "a5f24e87a11a95374d4c190945bf08ef2f", "080f82469505118842e5fa70df5323de175a37609904ee5e76288f94ca84b3c5"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "40", "ffd43c5f39be92778fdce3c832d2d3a019", "f6cfb81373f1cbb0574dda514747d0099635b48cb809c6f1fa30cbb671baa505"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "41", "fe753b7b661f1aad57c24c889b1c4fe513", "5a88b14bada16b513d4aa349b11ce4a77d4cda6f6322ff4939ad77d8ecb63748"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "06", "b91c5ac66e89bf2769ef5f38a3f1738b24", "a92b95b997cf9efded9ff5e1bff2e49d32e65f6283552ded4b05485b011f853f"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "c8", "773fe64379cea1a8ae3627418dd3e489a2", "a206a1eb70a9d24bb5e72f314e7d91de074f59055653bdd24aab5f2bbe112436"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "e2", "5dabc529442ff93005551b7689bcb748f7", "d3029f384fd7859c287e38c61a9475d5ddbfd64af93746b1dc86b8842a8c194c"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "1a", "a5ee68e416617ac974b3d1af7320cd51f6", "51ca3d3b70b5e354451a5177d7acfd8e7b44eae55e29d88b5e8eb8fc1e5c62fc"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "dd", "6243883d93d7066991e0fac453400b4fbf", "8c6c6791f1ac957b18bf008e260a0af4a5b7bfdb1e0008d6eaaa227f45cf4f62"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "4c", "f3b940d416f3435812f9d1b18f441b7721", "b0a1af969a95025385b251afd1e89f353426ed6e5d71019cd73366aa31d5b464"), + TestFixture(16, "cc49d4a397887cb57bc92c8a8c26a7aac205c653ef4011c1f48390ad35f5df14", "6df8c5c28d1728975a0b766cd7", "88", "371d27e9a32feea28a6a7e7da2d27e1cc4", "7e72b2ca698a18cb0bf625f5daddb0d40643009db938340a9e4fe164a052fee1"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "be80", "ecacc3152e43d9efea26e16c1d1793e2a8c4", "b5c6e8313b9c68e6bb84bffd65fa4108d243f580eab99bb80563ed1050c8266b"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "82c9", "d0e5d06bf4b50ccce0b2acfd16ce90a8854d", "38e5032c5949c2668191ef1af5bb17eddc28abdb4e5bb41eaffec2523b2525d6"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "8239", "d0158d784f486c1dc4a2bafd5b02ca1e1c05", "0b50f5173249fb7118f80d25874d6745d88e4ce265fa0dd141ad67ae26c31122"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "16c1", "44eda3377002a48f9fe306d157358e6df37d", "0296743a3125b103a2b2a78a109e825ea10834bd684215ab2e85cc4172e37348"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "2801", "7a2df6c09bf1dcb1c82bd98c6e2c13a8d7a5", "a94e64becb803e211785ba51db7f3db042fbf44a7a821509156a6828b0f207e9"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "65e7", "37cb2ea363c0d8864363056467570959ba03", "105358cc17b12107e023a23d57b44c66a2c58d8db05100311575e1ea152fc350"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "819d", "d3b16519377e6d0252b5f80cdf3d0253eccf", "669f9a63cf638a202dca1965c4116273249813ce0b39703887d89bdf5b3b12d6"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "761e", "24329a4dee6ca2cde473f08f76f779856c3c", "e288590a3eba28ac6847a50b0294ab6bd0a548716ff5102c44a5b656b2d9ddd6"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "56de", "04f29e65c0f01e644e74092253b470cd5511", "5b222aae3c7786c3b9021ba672f9136190ec931cf055f84c85706127f74c6d5b"), + TestFixture(16, "36b0175379e7ae19c277fe656a2252a82796309be0f0d4e1c07fdde88aca4510", "021bd8b551947be4c18cf1a455", "b275", "e059809fa107f379957b52ac29fe0bc8a1e2", "2082f96c7e36b204ad076d8b2f796cccf5cbc80b8384b53a504e07706b07f596"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "db457c", "54473c3f65d6be431e79700378049ac06f2599", "887486fff7922768186363ef17eb78e5cf2fab8f47a4eb327de8b16d63b02acb"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "62a6c5", "eda4853b186edc15c22ba24e470eb5a072da9f", "0683c20e82d3c66787cb047f0b1eb1c58cdde9fb99ee4e4494bbf27eb62777d1"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "cc67bc", "4365fc52a1fb5a58bd51931230c1a7dfb1a8c1", "413074619b598f8bed34cab51ddf59941861ba0169ebe7570a5ed01d790c08e5"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "33800b", "bc824b7d3810f59176cb108c7e969da51d4d79", "2d65a5175c29a095dc082dab9cfcf4b895efbfa715c57614589d4db159543ce9"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "b2c826", "3dca6646ffea832595c9c86e6517215541ddbd", "6a831b6059456be98e6fce608d8c71cb8efb04a96b45c2dfbdaeabf5420a1482"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "d7e620", "58e460e89a6725f0fc35622d89d2f3e34be90a", "3a04a01160402bf36f33337c340883597207972728c5014213980cd7744e9e41"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "795af4", "f658b4b1bd7ad5d81686aeb44caa6025d488bd", "64d8bd3c646f76dc6ce89defd40777fe17316729e22ba90f6a2443ee03f6390b"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "66efcd", "e9ed8d0553c801f37c2b6f82861a3cd68a75e3", "7bef8d35616108922aab78936967204980b8a4945b31602f5ef2feec9b144841"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "78b00d", "f7b24de3eeb8ea6c08b466baf246b3667feb3f", "92f7dc22dcbbe6420aca303bd586e5a24f4c3ed923a6ebe01ec1b66eee216341"), + TestFixture(16, "ddb739acda6c56ec9aefc4f4cbc258587f443da4e76ddfa85dbe0813a8784944", "0bddf342121b82f906368b0d7b", "9dd5e1", "12d7a11db811640c533794bfec6eeb977233ec", "71bf573cf63b0022d8143780fc2d9c7dbd0505ac31e9dce0ad68c2428b0878a0"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "87294078", "2bc22735ab21dfdcfe95bd83592fb6b4168d9a23", "fffb40b0d18cb23018aac109bf62d849adca42629d8a9ad1299b83fe274f9a63"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "0f28ee1c", "a3c38951b5de3331078aa13bd3742b59df4f661a", "75c3b3059e59032067e9cd94d872e66f168e503bcf46bc78d82a4d4a15a29f6e"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "d41c9c87", "78f7fbcae52afe7326a12a9aaf22255a38d4bd0d", "8fb9569f18a256aff71601d8412d22863e5a6e6f639214d180b095fa3b18d60e"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "046bc0d8", "a880a7957543692a72f0d599de48b5e5f5a9413f", "8b62d9adf6819c46c870df8a1486f0a329672f7d137bb7d8659f419c361a466c"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "39bd4db8", "95562af530fc357f5482b9004d466bf858586acb", "fd98f8f39dfa46ea5926e0ffacbabbe8c34205aade08aa0df82e1d4eaaf95515"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "b43cdd3a", "18d7ba77a9e8db046fdd548b52d40375c1e9a448", "09bf4f77a9883733590a3cc7ee97f3c9b70f4db255620e88cd5080badc73684c"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "e0052e9b", "4cee49d64efbdd4ad8d3e863172d9372fca07c20", "40326d765e0f6cf4b4deccb128bebf65a7b3c3e5bcf1d58f6158e1e9153b7e85"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "696825f6", "c58342bb95bd661b32bc18025808f8b4035acad6", "aa5ae6dcdc21b5446489bdabf5c6747bdf3bbfdb3de2c03170efefe5ccb06d69"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "7eb07739", "d25b1074ac05b072264e31a4b2801a6d790512d7", "d3d34f140a856e55b29471fde4c0e5f7306b76d03faab26db79c10f95ffb3122"), + TestFixture(16, "62b82637e567ad27c3066d533ed76e314522ac5c53851a8c958ce6c64b82ffd0", "5bc2896d8b81999546f88232ab", "9cad70b1", "304617fcc00514d260e1d211de361c254369e93a", "648a84813ca97aef4ab7e143ee29acb946388660f18eb671194646e0b0136432"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "3e8c6d1b12", "45f3795fcf9c66e1a43103d9a18f5fba5fab83f994", "574931ae4b24bdf7e9217eca6ce2a07287999e529f6e106e3721c42dacf00f5d"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "76fc98ec66", "0d838ca8bb6f3cd579294f706213ed0f0bf32f00c5", "99cd9d15630a55e166114f04093bd1bb6dbb94ecaad126fe5c408dee5f012d9f"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "6564c247cc", "1e1bd603117d38e026f706c9273dbcb6dc982751d0", "1516fdf7a7a99f3c9acc7fff686203dec794c3e52272985449ddf5a268a47bc3"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "c11b9c9d76", "ba6488d9abc3e46166767c6ad2aeffb347168b1b55", "0c9c35be98591bf6737fc8d5624dcdba1a3523c6029013363b9153f0de77725b"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "45a4e0d7dd", "3edbf4930033a7dca78bcbf4d75d651ee5fadff31b", "e74afe3ba960e6409dba78ecb9457e2a4ce2e09792b1d2e3858f4c79f7ddba62"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "e5861b2327", "9ef90f67fa11585167c83105ee16828a574c84ac86", "96cbe9cd193513599c81f5a520fabaff51ee8cbdb81063c8311b1a57a0b8c8fd"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "f5b5bcc38e", "8ecaa88753ffaba456f78e431f4baa5665f14e1845", "2e7ea84da4bc4d7cfb463e3f2c8647057afff3fbececa1d20024dac29e41e2cf"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "b6cc89c75d", "cdb39d838034714731f9503993df357954ecb19cd3", "be125386f5be9532e36786d2e4011f1149abd227b9841150d1c00f7d0efbca4a"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "3802f2aa9e", "437de6ee436c1b008b7572752f04362b2bfdc296bb", "3fa8628594b2645bc35530203dca640838037daeaf9cf8acaa0fb76abf27a733"), + TestFixture(16, "bc29a16e19cfbe32bf4948e8e4484159bc819b7eec504e4441a1a98ca210e576", "4f18bcc8ee0bbb80de30a9e086", "e082b8741c", "9bfdac30c1a3f7c3c29dc312c1f51a675400500e32", "642ae3466661ce1f51783deece86c38e986b8c0adea9e410e976f8a2fe0fe10f"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "1b62ad19dcac", "4ad1fcf57c12b14e0e659a6305b4aeffae82f8a66c94", "a66c980f6621e03ff93b55d5a148615c4ad36d6cbdd0b22b173b4b1479fb8ff7"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "3ef0faaa9b79", "6f43ab463bc779fa7932d365e2da9b05c00a7318384a", "c13f65bd491cb172a0f7bbc4a056c579484b62695e90383358d605307d5be0a5"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "1a98ddbf35f1", "4b2b8c53954f813229912137b7a4945dc07cea24a974", "59dcca8fc50740831f8f259eb55d4db11f763a83187d93758d78d166f4d73cd5"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "f46a7b1c28ea", "a5d92af088546e045f19f737a24c8addf832ed3f7a42", "578509ca4f57aadb78056794bf18b0714090970db786e2e838105e672165761c"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "e98f5e5a20d0", "b83c0fb6806edaae8a7dcd3b0fbb59438f88743ec6e8", "696c0c6427273cf06be79f2206c43af9cbda0b884efaf04deba0c4bf0a25cb26"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "06319c0480e2", "5782cde8205cd9cb636ca6543c4e35964f47341f2814", "95a66b60249ed086eecaeb9bc449afcee9de212619e87516ca947351b25120df"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "f4c723433b7c", "a57472af9bc2ec82eadf4eb1f055da1a92a82052ab8b", "2b411bea57b51d10a4d2fb17ef0f204aa53cf112e1130c21d411cdf16a84176d"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "02f809b01ce3", "534b585cbc5d01b10a7ae24a4ca2bfb07ea2a3b31a97", "ff3bff3a26fc5a91252d795f7e1b06f352314eb676bff50dc9fbe881c446941e"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "2b6004823a29", "7ad3556e9a97231323a4b88af5d7d0b07c0e73ddce1d", "f6be4aad63d33a96c0b5e9c4be62323c9e2308b29961fff980ba0dbda0549274"), + TestFixture(16, "5f4b4f97b6aa48adb3336c451aac377fde4adf47897fd9ccdf139f33be76b18c", "7a76eac44486afdb112fc4aab9", "236c60cba4fa", "72df31270444db30eb33d2ede33abbe22f37704fe68b", "c3706a28d7420b41e072dcecc06b6b13116cca110bde8faea8e51f5107352d71"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "d48daa2919348d", "eb32ab153a8e092fa325bafc176a07c31e6cc0a852d288", "e97175c23c5b47da8ce67811c6d60a7499b3b7e1347ad860519285b67201fe38"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "f95b716bfe3475", "c6e47057dd8ef1a24840f4f40a7963becde3a85968b29c", "ba45e1859efae362a44a0116a14e488ba369da6c76c3913b6df8e69e5e1111fa"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "4862e3677083f0", "77dde25b5339748f2a4a5c276727e0a210fc2efb5aeabe", "efcaa6f6cda3036b0b52ff9f36bc38ca74049c32c6b7cdfb8a46ca4144bacd64"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "7f1ca0728f6d65", "40a3a14eacd7e1051734fc31232ab2ab63474020ab4dc9", "360bcb407603fe92f856bf677625b9882521e6dae8f35fdfc3dc737f9398f609"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "67478ef73290fa", "58f88fcb112a7ec715244f307609ffa253e4e3659b0ece", "f12ee9d37946cfd88516cbe4a046f08c9bbba76a3973ff1e2cb14493405bd384"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "36bb9e511276c5", "09049f6d31cc41f11047da612d2987fa2e50ada5ae7f9d", "5833dde0c577b2be4eb4b3d01d7b0042fa8441ad7043ea462bbbbd56a59790ea"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "d68d6556c5a5b1", "e932646ae61f35382f7648718127ebae7eb7443ebd2c2c", "1e103c63d8ead36b985f921044cd32b8f9f04a2ba9fa154a09e676ffaa093970"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "0568cca4ff79dc", "3ad7cd98dcc358cc40a5e7fffb1fb9a5dd9d6ba91bede1", "a1cfb61d45a140bdea6329ba0fe80429ff9aa4624a1d31bc752f7c97f1d390a0"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "bd93d08eea4263", "822cd1b2c9f8e7468d2b70c311732f11ed72b57d83e500", "116b5b015e44ceef0061b2d2e73fa0b386d5c1e187782beebdfc6efb5a1c6935"), + TestFixture(16, "f7aaeff3a1dc0cc5ecf220c67ad9f6dda060b4f1be3cc609cb4f18b2342a88a2", "d0d6871b9adc8623ac63faf00f", "4fb62753024e92", "7009266f21f416b41a70f548e359add30c0e5746fbeb2b", "3d55882e6f3f89309b6940a3b408e573458eedd10fc3d0e1f3170eb313367475"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "e5653e512d8b0b70", "75d31f8d47bee5c4e2ba537355ae8ab25cc9ed3511ff5053", "579a637e37a0974cd2fc3b735d9ed088e8e488ffe210f043e0f9d2079a015ad6"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "2c4ba9ce52e01645", "bcfd881238d5f8f1781a9e359804831f31a1efb1ae1cb71d", "1583138aa307401dddc40804ac0f414d338fc3ffb2946f09aaaa7079426fc1ee"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "5eb2d054a0e58c62", "ce04f188cad062d62dcc77c4e1fe2bafd477598977835f0c", "78d3dda40e433bba7a330ca3e5bd5170f0895f2e3e438402344ced79fcb0c719"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "bbbf7830d04ab907", "2b0959ecba7f57b308946723baf0dbf613359b6e040f9bd5", "dfc762466fa84c27326e0ee4320aa71103d1e9c8a5cf7d9fab5f27d79df94bd6"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "10c654c78a9e3c06", "8070751be0abd2b2003bd62ca51f74088bbbd33e54ac9dd4", "7e8ea82d1137c1e233522da12626e90a5f66a988e70664cb014c12790d2ab520"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "668d32e322e1da3e", "f63b133f48d4348a67e65e7f2cdedf6ef8cc0ee7a6dcfb02", "873da112557935b3929f713d80744ed08b4b276b86331dbc386fba361726d565"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "e39f6225e8eab6cc", "732943f982df58780532f8c6639e5d6c7b755fcf516724e3", "cfba97919f703d864efc11eac5f260a5d920d780c52899e5d76f8fe66936ff82"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "6021a00f6d0610a4", "f09781d30733fe107fd7a33828413ebc252dd9d015773524", "01abcfee196f9d74fcaa7b69ae24a275485c25af93cc2306d56e41e1eb7f5702"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "bbaf0ac4e77ee78d", "2b192b188d4b0939d3d51368799325ad1c8233fa071bade0", "ce1c31e7121c071d89afab5a9676c9e96cac3d89dcae83136bbb6f5ca8f81e5d"), + TestFixture(16, "493e14623cd250058a7fc66a3fee0c24b6e363b966c2314aff53b276b6c2ea7b", "fe2d8ae8da94a6df563f89ce00", "98a2336549a23a76", "081412b92397d4c25d1ea568637f773174a7f920a51b1fe1", "bb210ca5bc07e3c5b06f1d0084a5a72125f177d3e56c151221115ae020177739"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "615d724ae94a5daf8d", "f019ae51063239287d896e7127f17d13f98013b420219eb877", "69adcae8a1e9a3f2fe9e62591f7b4c5b19d3b50e769521f67e7ea8d7b58d9fc8"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "0d9168eeab3b27ba69", "9cd5b4f54443433d997cc2cd61da9358b4045fef32f8192cbf", "162d0033c9ea8d8334d485b29eef727302135a07a934eea5fee6041e9f1f47c1"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "6287dcffdd5fb97885", "f3c300e43227ddff75d280f0ffdd560fb8915978e3bd6205bb", "3f4ab57efa32f51a4c00790280e77c0e55b85bbda4f854e242368e9a289b5a81"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "6e5e01b3fd71d16b9c", "ff1adda81209b5ec6c7dbf90420a1ff2e24bd6303b80cfc199", "945d18134c148f164b39fd7c4aef0335045553f6ea690a3b1726418d86f0de00"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "b51521e689b5247362", "2451fdfd66cd40f492d741f4329ae7cc77d42bf7e5f2ec5ab6", "23af12893431b07c2922ab623aed901c0eaaeb9a24efc55273e96aea4dab7038"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "7f973617e710fb76fe", "eed3ea0c08689ff10ec9ffdcc2f36edac14613b1d85baf25a9", "b15a118b3132c20c31e6c9d09acdee0e15fcc59d6f18306442682512d22eb10f"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "7e909b6727ac3fd02f", "efd4477cc8d45b57df5a61a28bb10265b26043d7a8dd357713", "dcfbeb6490f5fa7eaf917462473a6cec98bebf8f17493fe9b994119a6d5a5457"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "a5075638932b5632f8", "34438a237c5332b508d321c371ae1fd01bdf3b6c75a597da6e", "77e9317294f046f315a0d79e3423f29f7d9ebcd36d6eaa2a3fb2f4500309478c"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "c10f15a0de78db8aa3", "504bc9bb3100bf0d539393d1635bc40ac62405a39155406c47", "3aa8f204eb127b547e13873ed0238018394e13686c8734e49e3e629deb352c77"), + TestFixture(16, "b23255372455c69244a0210e6a9e13b155a5ec9d6d0900e54a8f4d9f7a255e3a", "274846196d78f0af2df5860231", "8294f830cfca42cfbe", "13d0242b20b226484eff89641e1bd5ad6cc827441b17c45ecf", "7f67e6f97c6c258f014d721a4edaaa0ddb3f9f09993276ab7b714ea9356c231d"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "2e3cf0af8c96c7b22719", "e317df43ab46eb31be7e76f2730d771d56099a0c8d2703d7a24e", "9ae5a04baa9d02c8854e609899c6240851cbc83f81f752bc04c71affa4eed385"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "e081c43a07450ce0dfa2", "2daaebd62095206346c5bcc7a8260ef361dc39fdb776d041f0d4", "da77c6d5627a2aa34911bd1f7cc5f8aa68a2c6546adc96a186b9af8e5baac4cf"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "c381d2ae5e72fc82324a", "0eaafd4279a2d001ab2d19f0cbb0899f221aac9762f2650f8058", "134d2d9726400d09dd3521326f96fbef993ddc0c4088770057b0f8d70356456f"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "737f4d00c54ddca80eec", "be5462ece29df02b978b3dc92a9bd26b9653e5917359c331fcff", "0d065dfde1de1f21784c7869eb566c977f807cfbd53578f4616995b51d7dc045"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "4e9e251ebbbbe5dbc8ff", "83b50af29c6bc958519891dda72c27d272561e00f7041845d998", "95c54d187f2415535451cbb9cb35869749b171f7043216ce6886dd77baeecf60"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "0db72b281ab4046d15a6", "c09c04c43d6428ee8cc1928ac628758ad58fc1b5a768d4722848", "0f98039e6a9fe360373b48c7850ce113a0ff7b2ae5ce773dd4c67ca967cd691b"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "4f7b4f38ff1ba4df5a59", "825060d4d8cb885cc33ed11dad4dc8b265a53cf0bdd85c5f15f4", "ad840bc55654762e5eba0e4a9e7998992d990a06d70da1b1ca922ef193dab19a"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "58ce55379ef24b72d6d6", "95e57adbb92267f14fb18eb659a5a7084be48d099467da4395df", "911e9876ea98e1bcf710d8fd05b5bf000ea317d926b41b6015998ee1462ab615"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "a219028a953ce1544835", "6f322d66b2eccdd7d1523b2b2583fd117cec47b1c84d3863159e", "3f68a4fb4043bcf9b6d277c97e11365d949c705bd6679c6f0aaf52e62330ad79"), + TestFixture(16, "dbf06366f766e2811ecd5d4384d6d08336adc37e0824d620cf0d9e7fd1e7afa9", "b3503ed4e277ed9769b20c10c0", "83b0ee9a52252c456105", "4e9bc17675f500c6f8625456eb2b6a2d35c649a84051f843153c", "02f32242cba6204319075ea8ce806a57845355ae73e6b875955df510096ebff9"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "8015c0f07a7acd4b1cbdd2", "8e9f80c726980b3d42e43a6512a0481255b729a10f9edb5f07c60c", "9bcc5848e928ba0068f7a867e79e83a6f93593354a8bfcfc306aeeb9821c1da1"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "c97b62a719720b44b7779c", "c7f122904590cd32e92e748c514444f00ffdb80a4bb7e9eb651946", "c2e75952ab49216f305e3776865791ce877cef8c0229ca97561787093fddf1d8"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "cb7c17ef62464ecc8008f6", "c5f657d83ea488bade511edb609dfc1929ac1ba5753fc83bf945b7", "c76a3ff4e6d1f742dd845be2d74c1a9b08e418909b15077deb20373ef55caf91"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "893a690cc5221de597d0e8", "87b0293b99c0db93c9890053b74283296d0fca83b262915289163c", "bdb69f99f9a144b9ad88c6cfd8ffb8304c201de9b2818552ce6379e6042c1951"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "80f3e4245c3eab16ef8bf0", "8e79a41300dc6d60b1d21888a34955893059d66549795b3ac2105c", "01815f599d6ba0d1c09f6f673bb6cca4c2a7a74f4e985be4c0f37842c7bbc5a4"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "641c6914920a79943dca39", "6a962923cee8bfe26393d1377c4e2f20aaa872a9a0b1d1d7f56df0", "a9db62e9ab53c4a805c43838ce36b587d29b75b43fb34c17a22d3981120f3bc5"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "2286a1eddd80737a724ca9", "2c0ce1da8162b50c2c15415545aa0c1dd11551891ae553d3a91908", "f0c2cc5a1b4c4cbe839338fa0d7a343514801302aef2403530605cf4f44d2811"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "d8c63e7d7d332198249c0c", "d64c7e4a21d1e7ee7ac5e4d9e07ec5806360843676ef27d811b246", "9842922499ad4d487488b3731f48765efe0b4eb59e7b491ba5f6636f09ed564d"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "4b81804d777a59b6a107cf", "450bc07a2b989fc0ff5e27483b8727c5753ede25e1fab0d86963be", "399b71ecb41f4590abda79045cdf6495f27daaa559c1b34f513b5c4ac105ec10"), + TestFixture(16, "4dd555bd3a5253a90b68b5d4d46bd050340ee07ddad3a72048c657b5d76bb207", "bdb1b82ba864893c2ee8f7426c", "dfc762466fa84c27326e0e", "d14d2271334a8a516c37e64b5c3c1dc577ee8fcf6ef3ebc0783430", "2c186c5c3463a4a8bad771feb71e2973c4f6dede2529827707bf4fa40672660f"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "a203aeb635e195bc33fd42fa", "62666297a809c982b50722bd56bc555899345e0404b2938edf33168e", "ea26ea68facdac3c75ba0cdf7b1ad703c9474af83b3fbfc58e548d776b2529b9"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "aac414fbad945a49ae178103", "6aa1d8da307c067728ede1449b15447c904b671824c2ca24c4fc7ad4", "0b32069fc7e676f229f1037d3026c93eef199913e426efd786b524ce1dbde543"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "7ee0ce371329192618e3cda0", "be8502168ec145189e19ade7ea13850e99ef9300c65f5abc9419d13a", "7a8658302e5181552292aa56e8209de63b5d86934167549b0d936202681757e1"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "b0a1af969a95025385b251af", "70c463b7077d5e6d034831e8486c93c31bbedc9e5ffa2f4154bceea9", "4f05600950664d5190a2ebc29c9edb89c20079a4d3e6bc3b27d75e34e2fa3d02"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "9f6c6d60110fd3782bdf49b0", "5f09a1418ce78f46ad2529f7f18b556e7da59fd2549dc57a17bf64f8", "4530e4dc6a4c3733b8ab7e77e384223cc1a8c179fb66818c08aca47e5c705d89"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "90958d7f458d98c48cbb464c", "50f0415ed865c4fa0a41260b30aad3a838680cbd313004685a5510c5", "f179353aef342f0f691caf1fcb811e3f6504e14d6d9381c5439b098ff978b01b"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "9f7ae892e5662803408d4d06", "5f1f24b3788e743dc6772d411d57b89ed0c91251aed37a6ca68a50c7", "f6df267e5cbc9d2a67b1c0fd762f891ee3b7c435884cb87d8228091b34aeddae"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "817074e351455f23cb67883d", "4115b8c2ccad031d4d9de87ad79a3b0feea16ff5fbca16211ea6fdd9", "4372e152b1afd99c7f87c8a51dbc3a5c14c49d04ea1c482a45dfbcda54972912"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "1b7da3835e074fdf62f1eb3c", "db186fa2c3ef13e1e40b8b7b49f22737c4b2f9fa0a7e3dd4b067fbaa", "82b6cd1c6618c42ba74e746075dc28700333578131ca6fde6971d2f0c6e31e6a"), + TestFixture(16, "d3ad8cda9a0d91a205c4c05665728bb255d50a83403c9ab9243fcbbe95ae7906", "0b5f69697eb1af24e8e6fcb605", "57473e7a105c806867379194", "9722f25b8db4dc56e1cdf1d3ef43a48dbea8c1547455ad0197af88a2", "a5422e53975e43168726677930f6d3e13281bdbd13c67c168340ed67e45d15b0"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "8714eb9ecf8bdb13e919de40f9", "ba6063824d314aa3cbab14b8c54c6520dac0f073856d9b9010b7857736", "9b1d85384cb6f47c0b13514a303d4e1d95af4c6442691f314a401135f07829ec"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "a0837676e091213890dc6e0a34", "9df7fe6a622bb088b26ea4f20820a423dd30796b6016baff106aaef206", "fa17c693d0997140fbc521d39e042d8e08388106874207ca81c85f45c035d6e6"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "b8a2ce7e051b8d094ec43f2a7f", "85d6466287a11cb96c76f5d2436032bc79c4aef1f74da25e92b0aa7f8a", "27663597b389b78e96c785ca2f5510c8963a5561d2b0b24c4dcdf8e58562c12c"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "9e4103ab1dfb77ae3494507332", "a3358bb79f41e61e16269a8b0e658123d2e5bb324c7ead8897f8e32b0a", "d8f1a83371487d611ce704e0a6731f97a933c43569690022fce33cb5aecdc0a7"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "fb3e3d1b6394d2daebf121f8ac", "c64ab507e12e436ac943eb0090270758ab09f93fa3ba7d7a2aa8eac789", "05c57aab99f94b315cf8bdd2d6b54440c097fe33c62a96b98b1568cdee4ce62c"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "549ba26a299391538b56ce4bd7", "69ef2a76ab2900e3a9e404b3eb2293813f1bcb96564f772e9308e42b2d", "1c1b0933c508c6a8a20846ebd0d0377e24f4abc0c900d3a92bc409ba14ef1434"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "287f31e69880823df7798c7970", "150bb9fa1a3a138dd5cb46814c81877380d5cf097c2fb5177750f8b53a", "9f5cf9149f556124d6bb4e3e243cca1502c02682709392cc2ec7eb262fd4d479"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "040d18b128ae4a1935f9509266", "397990adaa14dba9174b9a6a5acf42c75787edc62a180568c6ef56545d", "1a49aaea6fc6fae01a57d2fc207ef9f623dfd0bc2cf736c4a70aaaa0af5dafd3"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "92441cbe8d70820870bb01ad63", "af3094a20fca13b85209cb555f56d47a0631f2038103e3904b556ba7a5", "f29a0b2c602ff2cacb587292db301182e6c76c5110b97ca8b706198f0e1dbc26"), + TestFixture(16, "e300fc7a5b96806382c35af5b2c2e8e26382751b59010d4b1cfc90a4a9cb06df", "55b59eb434dd1ba3723ee0dc72", "f11d814df217de96333dee1cbf", "cc69095170ad4f26118f24e4835be15b7ae24edccd0b0934e3af513ed3", "01fcf5fef50e36175b0510874ea50a4d2005ad5e40e5889b61417700d827251e"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "959403e0771c21a416bd03f38983", "37a346bc4909965c5497838251826385a52c68914e9d1f63fd297ee6e7ed", "0245484bcd987787fe97fda6c8ffb6e7058d7b8f7064f27514afaac4048767fd"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "23fe445efa5bcb318cc85e2ad1ac", "81c90102c44e7cc9cee2de5b09ad364b603de6afbc2d96d00510894ccbe7", "52f6a10a022e5ee57eda3fcf53dcf0d922e9a3785b39fad9498327744f2852e4"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "762fdc3e0c30c7ecf2ec8808bb79", "d418996232257014b0c6087963781a4321c2ddbc35ce4864457d611219e9", "d236e3841b9556b32dbd02886724d053a9b8488c5ad1b466b06482a62b79ebb6"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "b6813d5fe8afa68d646c197337a2", "14b67803d6ba117526469902efa3296e55efebb17fe145cdca9b31ea7bcc", "0d2739cfdac782b61f484fa1a423c478c414397ec420327963d79112b2d70a7e"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "4ce8b6578537215224eb9398c011", "eedff30bbb2296aa66c113e9181059270a0510e7cc1b599705853af2144d", "7f291aa463c4babc76b4a6faf2e27e9401586b1ac83e4b06a4090e94b3ef5fd4"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "9ebf93643854ea5c97a4f38f50bd", "3c88d63806415da4d58e73fe88bcb55847573bf21e946ce9bdc5f569e3ff", "06bca7ef6f91355d19f90bf25590a44a24e5a782f92bc693c031e6de1e948008"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "da989cc7d375ed5fac4d7f938d74", "78afd99bed605aa7ee67ffe25575b8a61c5687ea02f0276824b8316b76f1", "5a44ff94f817c7c028a8f3db35a4d01364d2598432469f09ded86e5127d42d35"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "6fbab5a0f98e21e4d15904af5948", "cd8df0fcc79b961c937384de8149a07ee02791011129fcacffcfb1bf4145", "2a755e362373ef27a911c4d93ca07bc97135645442ad7ad6a8ef98146c71e9d7"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "b610349e8b370a7c195598573637", "142771c2b522bd845b7f1826ee36d34204b1ce23f5f58a8eb7cf1fa8cfa7", "f7988873f45a5de314e5381d3f14d8f8c48c9b649bf3e745ed5dc882d507da58"), + TestFixture(16, "3ae5be5904bae62609ac525e2d1cad90133447573d7b608975a6a2b16cb2efc0", "61bf06b9fa5a450d094f3ddcb5", "1d969fd81dab5ced3e6ee70be3bf", "bfa1da8423beeb157c44677a3bbe9c618bb88bbcefb008a5ea6bed4ff949", "95d2c8502e28ab3ee2cac52e975c3e7bccb1a93acc33d9c32786f66d6268d198"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "54be71705e453177b53c92bbf2ab13", "788db949697b8cd9abbc74ed9aa40cd6852dc829469368491149d6bb140071", "5e60b02b26e2d5f752eb55ea5f50bb354a6f01b800cea5c815ff0030b8c7d475"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "22197f9ad14591e7a6d5f8b18c969a", "0e2ab7a3e67b2c49b8551ee7e4998556940dc5a7e44bf10234806d00a012b5", "210c04632341fbfc185bfe3cbf6fe272bbe971104173bcb11419b35ab3aaf200"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "096b2f530933c1273304a6ad423726", "2558e76a3e0d7c892d8440fb2a38390898f7dbde25b0b70d335df71a06987b", "d3a205dd017e79a67400a937a20ef049f4c40d73311731f03ab857a3f93bd458"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "d44fdfd9da3a63c1083afe574e91bf", "f87c17e0ed04de6f16ba1801269ea02fd10d1f21b6b963c05aeda8eb09e272", "0c9b3ba4faf5fc2f310ad1bab06c4ca13474b714feeffb6ad615c1b850bbd6a3"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "8d836acc13ed83c2b2c706415c9679", "a1b0a2f524d33e6cac47e0173499664491d23d90ff55abca17e9d943b98c7f", "d9bb71ad90152d5c1af358c8501fa89ebd4b17bf4ff43841528cccb79fd791b3"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "2a68e3fe746f593c1b97cb637079c3", "065b2bc74351e49205172d351876dc9616886c6b2adc97db5a673846b6662c", "69dc21eb6f295b12ba493ee8fe6c40d78af946067ce772db316a3cbf00d3c521"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "39799b001ed2c334c269acb0f2328c", "154a533929ec7e9adce94ae69a3d932441dcae1760db90379bd354fa99164e", "095eb52135dc6d9c1f56a2571c1389852482e7aa3edc245a3904a0449db24a70"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "42143a2b9e1d0b354df3264d08f7b6", "6e27f212a923b69b5373c01b60f8a9c7c7deb28bdcf84886ef843216b94449", "efd7270e0396392fde8b0ddaab00544cbbd504f4d97d4e90d749d1946de90dcb"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "a3dcf26327059a4245b79a38bb8db6", "8fef3a5a103b27ec5b377c6ed382a935061ae3cd892ba63c44b809d6d29421", "8bc181ce2e66294e803a8dc3834958b5f173bc2123c0726e31f3fca25b622ed6"), + TestFixture(16, "fab62b3e5deda7a9c1128663cc81c44b74ab1bfe70bc1c9dec7c7fd08173b80a", "a5c1b146c82c34b2e6ebeceb58", "3d54883449ecca8f153436c25a0a01", "1167400d7ed277210bb4d09432051e3c9ae69a4c59ff8e251c2fe022d065a9", "c39ec70c2c71633ae0dccc41477ac32e47638c885cf59f34ebd4a096d32f91f9"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "d15f98f2c6d670f55c78a06648332bc9", "cc17bf8794c843457d899391898ed22a6f9d28fcb64234e1cd793c4144f1da50", "718d13e47522ac4cdf3f828063980b6d452fcdcd6e1a1904bf87f548a5fd5a05"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "60d55a8d5ab591a51e87fdf6aaa2ad25", "7d9d7df808aba2153f76ce016b1f54c68b55bbe42d8c97504b97c34a5f16e6a6", "a371ca29b92ed676bab5dfc4d78631bb6d9bb23a29f822907084a1f0fe17721f"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "cbf112e4fb85276c4e09649f3de225b2", "d6b93591a99b14dc6ff85768fc5fdc51017d8706acd676ae99e93d5312a4113c", "01ec87920b42639d4ba22adb1fbe5138d2849db670a2960fd94a399c1532ed75"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "865b89aa38ee1b5a3ce56620307e8937", "9b13aedf6af028ea1d1455d7f1c370d45982f0fe5d951a8c62c87894657301e4", "eebd2bbf1e9f6d817cd8062a6a9680e7f10464eefeb50b07cb46b14b9b3fcb2c"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "a8efc37d1b8b51f2a47b21dd14da383d", "b5a7e40849956242858a122ad567c1de5addfddbb59f4985947fb3a9ab56333e", "72863362612f146699f6b2f6ec3688f2ca6cb1505af7a309c91c1933e34d516a"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "d9b0eaaff786165f882f41a98dbc0c35", "c4f8cddaa59825efa9de725e4c01f5d6b651053516673402a57538db1a9ce7e9", "9c9efc6593f96207678db813608f2b8bc33ed1bef974ed77ed7b6e74b621b819"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "df49d972b6ebbbb18ee975ac635d847e", "c201fe07e4f58801af18465ba2e07d9d86d772b1a1991b7be6589bbccad36171", "dc482a051b58d8a3904d3af37c37b51983f634a504451bbba6f77d71337f8e78"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "78318aa5cd16699b77bdcea2fc9d1d20", "6579add09f085a2b564cfd553d20e4c3569387a1a6bcc826e94012670820576e", "51ef065a43caa23faf750b02a41ad6ba701aeb8058f6d8738d6f6b005bec7f60"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "8e20d65d02dd9a64379f75b6d8328f2d", "9368f12850c3a9d4166e4641198f76cee9c788b4aae9b2c6caf0c44aa9bd2ed0", "88e2a74d2920c89c6a101f5f06d0624a6d5eabd9bdb51395ee3983934c55c73d"), + TestFixture(16, "ee8ce187169779d13e443d6428e38b38b55dfb90f0228a8a4e62f8f535806e62", "121642c4218b391c98e6269c8a", "97e8d8513af41b97801de98cc4269096", "8aa0ff2468ea2827a1ecda7b059b6975f1df0f01944641a1b04d753e6ab8d3cc", "ada3ed7db2dabbfbc441ef68a5656e628d6d5bd6c1574369688497179a77601a"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "b0053d1f490809794250d856062d0aaa92", "a6341ee3d60eb34a8a8bc2806d50dd57a3f628ee49a8c2005c7d07d354bf80994d", "217d130408a738e6a833931e69f8696960c817407301560bbe5fbd92361488b4"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "51eb190c6a9f46e8ec1628b090795470c0", "47da3af0f599fcdb24cd3266fb04838df13c1c5755a5a240c33b2b890a486aac8b", "4ae414bc888a42141d3060c71c2dbbffd425b6a952806982271a8e756b3c9e24"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "25144e807e389bb0e45b6dc25558caf61a", "33256d7ce13e21832c8077143e251d0b2b4cfca1c19abf447d7bc0898d61885144", "7b7f78ae1a5ee96fdc49dacd71be1a6ac09a6a162d44dea0172886eca5674e46"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "dbe1ee14abfe2ecf4edf6db206cf9886ce", "cdd0cde834f894fc860477646db24f7bff229cc7a390867a245dcb7c434f1db347", "03f31c6143b77f6ad44749e2256306b8bf82242f2821fad4075b09b388ba81ca"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "db6df31f12bf552f81deff5fa2a373fc22", "cd5cd0e38db9ef1c4905e589c9dea401135361b539f9fe0fb7842907c2326aef63", "030390adb572f2bd2a6a4454fd68236cd1d465574328aa001d553375cc63f8a2"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "ff2a97b49fcc6a50d4549c979d53ccc51f", "e91bb44800cad0631c8f8641f62e1b382e8ed10943929e7d7bf798b2ae8371aae5", "7294ae94358669f2ada4b64c125b248df7fe86c6715e3b6a7b9bb2bd99392c8a"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "73ddfa0185200a890b7690a7e3986d8818", "65ecd9fd1a26b0bac3ad8a7188e5ba7529f92b9e49ab83f113f8949dc9e4a36e0d", "4d1513478fc1fb0a18eb6d2a9324fefbd975ecd1b409025de826bc397462acc1"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "5c7604f9ac8fdf30ee5820e5aeb75b65d7", "4a4727053389650326833a33c5ca8c98e6d0e53223adff22a08e3dddf66fff23e3", "b26a7ff61bfe94864249af7cc9b4a723627dd4463f5a22f0ca6063769522eab7"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "d44fdfd9da3a63c1083afe574e91bf01c9", "c27efc25453cd9f2c0e1e48125ec68fcf833f49a42521a7a2367f91bfcc2180b7c", "960f9a85cfbfb6eab223a4139c72ce926a680ea8e8ecc3088cf123de659ad310"), + TestFixture(16, "7da6ef35ad594a09cb74daf27e50a6b30d6b4160cf0de41ee32bbf2a208b911d", "98a32d7fe606583e2906420297", "bb515dc227abb9acad8fefaa14771bb77b", "ad607e3eb8ad039f6554f57c7f0acc4a4ac08bd395c6807223311070659f550934", "3718467effb5d5dc009aaefce84d8cb4fe8f80eb608f4c678f5d0de02ea11e59"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "6a26677836d65bd0d35a027d278b2534e7df", "d1c1f3c60603359c7d6a707f05ecb2296f8e52f2210b7a798ad5c778ee7cfd7fe6e0", "67874c808600a27fcab34d6f69cc5c730831ad4589075dd82479823cb9b41dc3"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "4021ff104ff1dbd91e46db249fd82198b0a1", "fbc66bae7f24b595b076a926bdbfb68538f00923bb5a347af13df12f234fca5f03ef", "e0c27cddf919d3092d9a34766c89a5ae6dcf39fe954d1e6f1a70ddf96805def4"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "6a681f164efce199a787bccff223b8ae1a98", "d18f8ba87e298fd509b7cecdd0442fb392c9d03ed7bffac83e890caceb6903d9cab5", "7ae9eca03f616ab39ebb3be26b848842b4aa584e5c8e5695065ad5af34951175"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "7861dac338ba3f8274dca04c8c6f92b6d44c", "c3864e7d086f51cedaecd24eae0805ab5c1d4dd8f30870025b2bd1e2a2511574d3e7", "b47c9bc4eb01c74f5db2e6a293bef80db18c58cf06feef7ee0f8a7a9a51c22bb"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "a3f0473c620d2739d5ba4f7156f88d0fb669", "1817d38252d849757b8a3d73749f1a123e386046d17f337f3cb49884d94995edbdc9", "f6afd661f218c7426b92ee53e65d14898cd0c78a7e594fcc6ac0e3fb5cab1c9c"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "07c535d9456a6ff1e41321150d16dae3f7a3", "bc22a16775bf01bd4a2353172f714dfe7ff25fdc77b43bca254d6459263cdfed8fbb", "d3802911e341577046cfc61d9043b4af059fb4bef3c6a2ff46ccdcb05670af37"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "5ee220720a896249efdab2ce418318bb5ebf", "e505b4cc3a5c0c0541eac0cc63e48fa6d6eedd1a1d36c8164c55d55dbf0ff1e9517a", "db60720db67a60ca286fe744d46173c231fbcc7deb4c9b0d87d52a2247e06b74"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "98e4eb0361c8bf40bcbe0539b0850e4c35ff", "23037fbd511dd10c128e773b92e29951bdaeb476e2ca48fd52bec0539b00744a8a07", "57f70ba5493265b30491decc726354e2065e7971a2efd56db9cf0f79b1d76859"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "7f0745bea62479c0080ecec52e37c1e32d72", "c4e0d10096f1178ca63ebcc70c5056fea523fad68c62b81d62f2d490ae74f5bb1465", "4a29b9ad548964942f87f28ba267ec0d0e8f72c73b3823ee57693dd63c2605c1"), + TestFixture(16, "0786706f680c27b792d054faa63f499a8e6b5ddb90502946235bf74c022d772c", "f61ef1c8c10a863efeb4a1de86", "e99ed2ac6c38e033061b5d85f3e77dd72518", "527946125ced8e7fa82b2f87d180eacaad4913b15d8000266c61ba5aec898eb35b52", "acbd2e9911b3218a230d9db5086d91dccac3fc93fc64b0f4a15d56954906b2b7"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "c1a994dc198f5676ea85801cd27cc8f47267ec", "7c9b138177590edaafec4728c4663e77458ffbe3243faec177de4a2e4a293952073e43", "89ad6ae1e550975eaa916a62615e6b6a66366a17a7e06380a95ea5cdcc1d3302"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "791e232bfb42fb18197adc1967da1a83f70168", "c42ca4769594a3b45c131b2d71c0ec00c0e97f8422f736fc435687634d42254b22fd99", "dfddb719d00398bf48a6cefd27736389e654a93b8595cd5ac446af1996e0f161"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "3d4127942459bb8682e662dfc862467582fa68", "8073a0c94a8fe32ac78fa5ebde78b0f6b5127f38a96e68ef7dbaef1b460cc0980eacd4", "58ef310997dcaf067dd217274921504da6dbf0428a2b48a65fe8a02c616ac306"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "0e71863c2962244c7d1a28fc755f0c73e5cbd6", "b343016147b47ce03873efc86345faf0d223c15c5c702a82d468929227502e4e35796f", "511e5d5e100b595f6b20e791830bca37e23f7b785e482a58405bffe7a632a5b8"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "e0f1cd013e6aea4fa484fc3fa35d348b1a2399", "5dc34a5c50bcb2e3e1ed3b0bb547c2082dcb8e89188c0940182dd99a902d158c5b0810", "e48dfaa53b6807ea6f01d8dca67960b9f321f7851f324459a9bf61fe0be73abb"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "b1cc1946b4fc1dbd033254cdf536f61e9f9cd7", "0cfe9e1bda2a4511465b93f9e32c009da874c015849acbb7af1892790300bb84fb0558", "c12c0423fe36e4c88775dd00b4af267b85b7dd2a37a742a3156923c8917c97a3"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "87284658928208e3bddca83e3ceb13708d88d4", "3a1ac105fc54504ff8b56f0a2af1e5f3ba60c3e75aaf3077ac6dfb5454851ec3910de6", "4255f8af18df7237e0abe98421aec9634443561752d893aaffe76380e829ef32"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "bdb79f931ef3035a33bdd1b032fd9de8f6b2ba", "008518ce70255bf676d4168424e76b6bc15aade70f42e3e1f2b5bb58433bd11f5dea1f", "ab83567833d2f3461b5fbecc0e366694bb5ea00933b2b3e792ec3aefe20325df"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "1f9c3a8eb8bc59f3869e10f73883aa8f8990cb", "a2aebdd3d66a015fc3f7d7c32e995c0cbe78dc564f6248cefe5fc7cfb547c90a558925", "bd1446ba3185d1c16551730947c22142142caa8cc1c540e89ab734ec297401bc"), + TestFixture(16, "bac55f9847d93325bf5071c220c0a3dfeb38f214292d47b4acb7b0a597fe056f", "05b50c458adbba16c55fcc454d", "5f28809181f9a889894da8d6fe1fde6cce354a", "e21a07ccef2ff025cc246fe2e80528eff9dd5db52249d812f7f235afa0732e984e91b2", "b87577755d2d9489194f6f7cfabf267dc3433a9c91954e81beb72c5e06870922"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "7b125c3b9612a8b554913d0384f4795c90cd387c", "6cc611d816b18c6847b348e46a4119465104254a04e2dfeeeac9c3255f6227704848d5b2", "7aebdfd955d6e8a19a701d387447a4bdd59a9382156ab0c0dcd37b89419d6eff"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "8b013f5782d5d1af8dbd451a4202866095dac975", "9cd572b40276f5729e9f30fdacb7e67a5413d44338d48329997c5981d678b5e24a6f01b0", "d119f300fbd74e754a200ea2c3f9fabc1466d02078c84245db693eef3f5672a6"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "b2b1d82a5523b72ea366a680922ed3a4624536c4", "a56595c9d58093f3b044d3677c9bb3bea38c2bf2a77e3ab68e0a73519591a33ed098b758", "d6204303b86acf62d5ab860ca70161288ede56e3cf017c08dca56fd2d6f8f6fe"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "f8c4eb4285d3d7744da52775bb44ca436a3154f7", "ef10a6a10570f3a95e87529255f1aa59abf849c1cff6c24251c2fb7b8604dfa10c60ef4a", "8557e22eb4529b43f16b1f8ae47c714ac8a2c827c1408a47704778b4c5b52601"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "6e7fe35fa39c937a0e6b3a8c072e218650f42b8d", "79abaebc233fb7a71d494f6be99b419c913d36bb6c3c39f915d081d34559179869b32d81", "8c1a4187efbb3d38332f608f2c8bbe64247d9afa2281ced56c586ecb4ab7a85e"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "917b467d841850fc6e648f1bc298a7f9f1ee38ca", "86af0b9e04bb74217d46fafc2c2dc7e3302725fc9389a6a6a74c6eb0e1f87562469f2082", "a41bb1f256228302cd0548ae2148ff42774d18c2d6d3e38b36bc4938da13bac3"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "2b4314fe1a6bfa786b7cfc13fbee861b348efbf6", "3c97591d9ac8dea5785e89f4155be601f547e6c03bed3a2f5dfdbfcc0d7ac26c88d1962c", "b0b024e20c4f75a6dad54c21a9edbce846792e957878b1c8ed2d916c757e2b3c"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "e19fa7f83c79920cbff45c41a9dee8fc99e97396", "f64bea1bbcdab6d1acd629a6476b88e658206ea035ea1d99be344fa1467ee91c73bbca67", "42153925c46fc9d5d328312d62f59bb99fdc4ac479a3386d5f88fefd4b32f577"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "53e0475cf492b3d39dad600f5c58eb0bd0021554", "44340abf7431970e8e8f15e8b2ed8b1111cb08627936ec10a81b36768b606e9a38b2f4c5", "37ab2a0b7b69942278e21032fc83eba6cdc34f5285a8b711a08da6acd42299fe"), + TestFixture(16, "8beedeb85d42c2a7fa6f7237b05acb197dd8e1672471ac878064fe5319eab876", "8479bdfad28ebe781e9c01a3f6", "c119a383d9a3d4bff4270a1d22076b346db5f61c", "d6cdee605900f062e7057ffaccb20b2eac7ceb2a11575ae03ea8a57bbe4a67c060367b74", "4a17522da707b4b2587a0ae367a2cd2831bb593a18ef442a7977eda6de045878"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "73b09d18554471309141aa33b687f9248b50fe3154", "b7e8264ca70fd2a4fb76f20a8ad5da3c37f5893fb12abeeaef1187f815ca481ed8ddd3dd37", "2a243246bfe5b5ab05f51bf5f401af52d5bbaa2549cf57a18e197597fe15dd8c"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "b64d00f3a4df754fa4ee6376922fb67ccce0c6209f", "7215bba75694d6dbced93b4fae7d95647045b12e7accc2b55011dbe92ce7619e0ad48b4ccf", "0595306eb7441622a49800edee0134492d82320707fceba902af2e0c95fe634a"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "2b11d1ac74ffe701ec733d32085b1054132726e622", "ef496af886b444958644650b3409334caf8251e8c71e8b1f4d70d8f4c7df4f22847d36b394", "bd439dbefec589e120fb4f9825b315bf86523b85c61791cd4da4c8d474ba2714"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "a88f22424643a523aa3d7d88f4364f1290f49dd0a2", "6cd79916b40806b7c00a25b1c8646c0a2c51eade47a85e76a9d07b7b361ca56d53c34cda50", "cfebe1cf82267394065bcecfada6709c6c35a3ac835644f560d4c9a8c1848364"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "c81427bc84c6a3cfefd4c4cb210fe82212977e1947", "0c4c9ce8768d005b85e39cf21d5dcb3aae320917a2fddb010e7508ad03ad287068ecee6020", "7a37255b682766a0bfecf78e5162528885a339174c2a49325739d2bd8877e64f"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "28c4d6de3e2ce51b849b135d9cfd3084f0e3155447", "ec9c6d8acc67468feeac4b64a0af139c4c46625aa2ddea785e6c470c52c4fdf432fd78b66e", "619f2ae80070e278615466a3fd6c9acb7b510c5679bed7038889c77e78d8bd32"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "4c88151cafef75832bacef43a06e862349d56b67ee", "88d0ae485da4d617419bb77a9c3ca53bf5701c690b91232cfbd7ffff252498b35274fb2995", "b2571e56f66a857daffbdc99370ceddd4a7bed3867d600cc797000a3b7b57a9d"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "572855e22ce89bc2bcf09cb15a1765d99973449d61", "9370eeb6dea33856d6c7c488664546c125d633938472b2c50e5e391ad104f9ee33b94f2872", "db409636e3e3bcd606a91aeb7592009896f9ad2c4cc6b7f578e6ad59c0f8fa22"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "89ce46b3de3afaf2518d419b1a2ac24cabca269a96", "4d96fde72c7159663bba19a22678e154176f5194732d69c5d6db1b130102af3dae0690673b", "62c89a835721207a182968c516dc8be45774ec846e8dcab9ab8611888f2a76a8"), + TestFixture(16, "c3a0c126cad581012151c25cf85a44472c23f83b6095b6004f4f32cd60ec2db2", "94ab51ce75db8b046d6ab92830", "edf1682a626e9fbf3d57bb260e0876c6f92ba5b114", "29a9d37e90253c2b5760e31f325a55de458ed2bff1489903365970c2673c9fd457e1077aad", "33f30ddd83002eea50fd4a8fae39d0980a04160a22ac88b755ac050f1d1f8639"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "3cbb08f133270e4454bcaaa0f20f6d63c38b6572e766", "3966930a2ae8fdd8f40e7007f3fde0bd6eb48a46e6d26eef83da9f6384b1a2bda10790dadb3f", "f5353fb6bfc8f09d556158132d6cbb97d9045eacdc71f782bcef62d258b1950a"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "946e86795c332031e2d1ee09d3d4a101fb6800d00911", "91b31d8245fcd3ad426334aed2262cdf5657efe408a5587bdd120a7d08cd3841cb117af444fb", "e3a1555ffe5f34bb43c4a2dae9019b19f1e44a45fb577d495d2a57097612448d"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "b76ce2ab0065ba1c0a754494991c8c452cb416f18ab1", "b2b1795019aa4980aac79e3398ee019b818bf9c58b0545b32f81dcf03e2bcc2aaf62ad366e97", "9c5d43c1a1269cde199509a1eff67cc83a1759b71c9e7a6ee99f76b98c6e23a6"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "a3e0d8d0784155bfc45769c52711d4fa68e8bc390c20", "a63d432b618ea62364e5b36226e35924c5d7530d0d94fea17d78533bc9e022dbfb460afdf499", "b07452a7900a289b91b2771dfdd5108852536659aa259def7b41e38f80bd03ab"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "6e6a88abbb52a709b47365ad6aa8016fa9a03a9bd834", "6bb71350a29d549514c1bf0a6b5a8cb1049fd5afd98056defc6dcaeec80b1c639350ab6f1fde", "6b30f55c3101540523a92380390f3f84632f42962061b2724cde78ac39809397"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "eba1810d537041821121aeff8e0914ac26a550072c8c", "ee7c1af64abfb21eb19374588ffb99728b9abf332d389d37b7251fb8c0ef2b37c36d51219d0f", "9fc62d14f8b7a6026509275cff80312ff1ade2b5d9c274cb72a506a571439fc1"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "dfc6692cd2442e5ff1f918c8812a27f81d107d16a12f", "da1bf2d7cb8bddc3514bc26f80d8aa26b02f9222a09bd279d9da4437c8a2a252436508134c56", "6b9389cc42113d639fd2b40cbc732ae0dc7c14513b88b36b45a6ea5a06fe4d2b"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "9ad338cbfd1b52e6ae4178f05e00062274f8b0b25eae", "9f0ea330e4d4a17a0ef3a2575ff28bfcd9c75f865f1a63943543bc1c5f5991ecc5964a288f79", "db72d98d63fc10acff7dceec0e2691a80ecee50a0e957ad166c77952a50318bd"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "9f5a05db89e0e336da066ce81b79ad9be1d0ec4fb7b8", "9a879e20902f10aa7ab4b64f1a8b20454cef037bb60c0a49ee2b7ceddcbd28abb24b77d5edee", "e98b710c47a4d12a73cd8aa2613fc2910c16f4195ea7f15650132493521d19be"), + TestFixture(16, "9cdebaeee8690b68751070691f49593668a6de12d3a948b38ddbd3f75218b2d4", "af1a97d43151f5ea9c48ad36a3", "58f31e5770070a5d4031fb795dc2d298561d3559960d", "5d2e85ac69c8f9c1e08321de5c305f46fb22da6d97b9b099a68cfa3572d974e03232e09f37fb", "527817316fc48b105f8ab178dd2db1fefa09c50461aa9d8bdf3c03482343bbf9"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "79ac1a6a9eca5e07ce635bfd666ef72b16f3f2e140d56c", "1abcc9b1649deaa0bfa7dcd23508282d9c50ca7fee72486950608d7bcb39dcf03a2cab01587f61", "0cda000ed754456a844c9ed61843deea9dadf5e723ea1448057712996d660f8c"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "76d12e3c4c5d990bf563c60aa4999e52998d887f97477f", "15c1fde7b60a2dac84a74125f7ff4154132eb0e139e05b1c4fb40e5c8bc37152a173d4bbb18c3e", "3fb6ddb76809b8e6d703347664ef00a365955124c603900d5c8d4ff476138252"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "a027c28fbe22111fd4c8a226cfe8531c16d7790d561eca", "c33711544475a5b8a50c25099c8e8c1a9c744193f8b9ee019c359008adae3070b5a543ead0effb", "d9fc295082e8f48569eb073ac1b9566246728fc62ccaab4a5667c472c98b2626"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "fa597e37c26c38694abdcf450f9edc529160fa0d651979", "9949adec383b8cce3b79486a5cf803541bc3c293cbbe5dbd099ab134756b90746762a92a4a9f7f", "7a459aadb48f1a528edae71fcf698b84ed64dc0e18cc23f27ab47eeabeaf833f"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "9e4c8aa9b58a8eabc5586892f5541000b43f17d9a051a0", "fd5c59724fdd3a0cb49cefbda632cf063e9c2f470ef684fa4f6adfec85d055310107ba89198afa", "484207909dec4c35929ebe82fcacf20d2af6d850bd69364ebac9557adeadfbd4"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "7d9582cf9e3bb9ee34dce965f56b08e716589486b0641c", "1e855114646c0d4945186e4aa60dd7e19cfbac181ec338915d23eb2e952afcc89fbddb567d9d75", "88b5448372548e6aab1b262630a28a471d285514703f1bdb10c695850e18fe6d"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "5a387e7cc22491fc556fe6a0c060b4911d01f0c11f801e", "3928ada73873255b24ab618f93066b9797a2c85fb1273aaad6c31828314e24198f005955ca8f5e", "0e71863c2962244c7d1a28fc755f0c73e5cbd630a8dbdeb38842d7795d830d2e"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "87946e910059cbaf48df63b220f397049c65ca10cd1920", "e484bd4afa0e7f08391be49d7395480216c6f28e63be04e531ebbadccfe47182b41904bbfebcfe", "2aa7a28da38c42fda2e578d9d6340cd8e80b9b32047c3db296d0640d517b0872"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "c62f67d208f1c8ffd5d57df9de15ef54f97fbc07d1630a", "a53fb409f2a67c58a411fad68d73305273dc84997fc42e7c582414154236c09ee704cf4a5de411", "3382051c268891da04e6ca73adcead4029f6a1593be4acfe3968e7351a6a2fb5"), + TestFixture(16, "d34264a12c35cdd67ac105e2826b071e46f8131d1e325f8e0ae80a6447375135", "3891e308b9f44c5b5a8b59004a", "697e73eaaf562d31bdbf7ce9e78c7426fe1c87e421def9", "0a6ea03155019996cc7bfbc6b4eaab2074bfbf7a8f79dd57c9990029c89d1b37988745fa5737a3", "c352828b1920e53bbb60f2ea6a5f15639659e6f3243405c26f6e48628d5519a9"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "9cea3b061e5c402d48497ea4948d75b8af7746d4e570c848", "f28ec535c2d834963c85814ec4173c0b8983dff8dc4a2d4e0f73bfb28ad42aa8f75f549a93594dd4", "5f8b1400920891e8057639618183c9c847821c1aae79f2a90d75f114db21e975"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "2b223932fb2fd8433e4b1af9e8234a824569a141f6c96a69", "4546c70127abacf84a87e513b8b90331639d386dcff38f6f4de907a59c5e4d3f21e1348d7cdf92b6", "1ae8108f216defea65d9426da8f8746a3ae408e563d62203063d49bf7e0d6bdf"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "4d57cbe4a7e780d4ed17267d5ebc91750c2f0209e0444bd2", "233335d77b63f46f99dbd9970e26d8c62adb9b25d97eaed4ff4239544e2f354d6c6837cd9c23b884", "460f08114b1015fe8b7a9b5dd1b9e6a3d28367c4bd15f29b13c02a8cb9a53968"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "fda8665f87c618646a89c7abdca275fd10c31453ad4b9c99", "93cc986c5b426cdf1e4538418c383c4e36378d7f9471799f3f6c6f7cc494201069344e2d6d41bd9b", "860f4428259d9c5b17698cc95363db6cfee603258582e3a3e8feb886599d4ac4"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "98104fd3f3413ad1f57ef4912cb50097dca379a58c47b0d2", "f674b1e02fc54e6a81b20b7b7c2f4924fa57e089b57d55d43787a15352cfceb028202c8730beaa7a", "1b43c482f83780c21583f88e5afcf6938edd20f21b74d895161b60c27a6a42f0"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "b46b343e64d2d70e0bd909dbb3f6bedf7e4adc74321be526", "da0fca0db856a3b57f15f631e36cf76c58be45580b210020f3a0ca3da647eb31893e867956097983", "b082ccd964617c27a5607b7324faad237ee53acfc18c35502dbf7c1937a9dfcb"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "8e12620bb575e6b167b085255b2b5631ff28e04cbef8826d", "e0769c3869f1920a137c7acf0bb11f82d9dc796087c2676be663fbbebbc251b9f1760afa49e89e71", "b8539ba93ef17254ec1d8d62e8f4eae4d41ee1e75345bf90c9cbb26c63bce501"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "792aaa23b923d1b53173fe19853b9aa402a301d48529873e", "174e541065a7a50e45bf01f3d5a1d317245798f8bc136238da90cd87e9d9ca5d85430a150e682752", "b6b09463b5ef5ead1f17f4021693a0d8452e98dcbb8e7590f9fde6394970a6f8"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "ddc5b4e48970ebd72869be6998e9103c014475e8ae6ea29c", "b3a14ad755f49f6c5ca54183c873598f27b0ecc49754479afc0cc4601afb61efa7059cfe49ec9dde", "390f6de14d5e1f2f78dbe757c00b89209d0cf8bc48cbbea035779f93de357905"), + TestFixture(16, "4ad98dbef0fb2a188b6c49a859c920967214b998435a00b93d931b5acecaf976", "00d772b07788536b688ff2b84a", "d2b66096c475a77648c27235e6972ba8f18761330d3c6adf", "bcd29ea518f1d3cd3c0e8ddfb60d621bd773f81f34068fd9cf7474962c3602dcfcb50039f43e3d6f", "1d75c9e7acb09932db332498d30f82e4009025cb1827047c59a8f97812b568a4") + ] + + func testEncrypt(fixture: TestFixture) -> Bool { + let aes = try! AES(key: fixture.key, blockMode: CCM(iv: fixture.nonce, tagLength: fixture.tagLength, messageLength: fixture.plaintext.count, additionalAuthenticatedData: fixture.aad), padding: .noPadding) + let encrypted = try! aes.encrypt(fixture.plaintext) + if encrypted != fixture.expected { + return false + } + return true + } + + func testDecrypt(fixture: TestFixture) -> Bool { + let aes = try! AES(key: fixture.key, blockMode: CCM(iv: fixture.nonce, tagLength: fixture.tagLength, messageLength: fixture.plaintext.count /*- fixture.tagLength*/, additionalAuthenticatedData: fixture.aad), padding: .noPadding) + let plaintext = try! aes.decrypt(fixture.expected) + if plaintext != fixture.plaintext { + return false + } + return true + } + + for (i, fixture) in fixtures.enumerated() { + XCTAssertTrue(testEncrypt(fixture: fixture), "Encryption failed") + XCTAssertTrue(testDecrypt(fixture: fixture), "(\(i) - Decryption failed.") + } + } + + func testAESCCMTestCase1() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] + let plaintext: Array = [0x20, 0x21, 0x22, 0x23] + let expected: Array = [0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 4, messageLength: plaintext.count, additionalAuthenticatedData: aad), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + } + + func testAESCCMTestCase1Decrypt() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] + let ciphertext: Array = [0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d] + let expected: Array = [0x20, 0x21, 0x22, 0x23] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 4, messageLength: ciphertext.count - 4, additionalAuthenticatedData: aad), padding: .noPadding) + let decrypted = try! aes.decrypt(ciphertext) + XCTAssertEqual(decrypted, expected, "decryption failed") + } + + func testAESCCMTestCase2() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f] + let expected: Array = [0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62, 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d, 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 6, messageLength: plaintext.count, additionalAuthenticatedData: aad), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + } + + func testAESCCMTestCase2Decrypt() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let ciphertext: Array = [0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62, 0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d, 0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd] + let expected: Array = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 6, messageLength: ciphertext.count - 6, additionalAuthenticatedData: aad), padding: .noPadding) + let plaintext = try! aes.decrypt(ciphertext) + XCTAssertEqual(plaintext, expected, "encryption failed") + } + + func testAESCCMTestCase3() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13] + let plaintext: Array = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37] + let expected: Array = [0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 8, messageLength: plaintext.count, additionalAuthenticatedData: aad), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + } + + func testAESCCMTestCase3Decrypt() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13] + let ciphertext: Array = [0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51] + let expected: Array = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 8, messageLength: ciphertext.count - 8, additionalAuthenticatedData: aad), padding: .noPadding) + let plaintext = try! aes.decrypt(ciphertext) + XCTAssertEqual(plaintext, expected, "encryption failed") + } + + func testAESCCMTestCase3DecryptPartial() { + let key: Array = [0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f] + let nonce: Array = [0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b] + let aad: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13] + let ciphertext: Array = [0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a, 0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b, 0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5, 0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51] + let expected: Array = [0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37] + + let aes = try! AES(key: key, blockMode: CCM(iv: nonce, tagLength: 8, messageLength: ciphertext.count - 8, additionalAuthenticatedData: aad), padding: .noPadding) + var decryptor = try! aes.makeDecryptor() + + var plaintext = [UInt8]() + plaintext += try! decryptor.update(withBytes: Array(ciphertext[0..<2])) + plaintext += try! decryptor.update(withBytes: Array(ciphertext[2..<6])) + plaintext += try! decryptor.update(withBytes: Array(ciphertext[6..<32]), isLast: true) + XCTAssertEqual(plaintext, expected, "encryption failed") + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESOCBTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESOCBTests.swift new file mode 100644 index 00000000..30a651cc --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESOCBTests.swift @@ -0,0 +1,154 @@ +// +// CryptoSwift +// +// Copyright (C) Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class OCBTests: XCTestCase { + + struct TestFixture { + let N: Array + let A: Array + let P: Array + let C: Array + } + + func testAESOCBWithRFC7253Tests() { + + let K = Array(hex: "000102030405060708090A0B0C0D0E0F") + + let fixtures = [ + TestFixture(N: Array(hex: "BBAA99887766554433221100"), + A: Array(hex: ""), + P: Array(hex: ""), + C: Array(hex: "785407BFFFC8AD9EDCC5520AC9111EE6")), + + TestFixture(N: Array(hex: "BBAA99887766554433221101"), + A: Array(hex: "0001020304050607"), + P: Array(hex: "0001020304050607"), + C: Array(hex: "6820B3657B6F615A5725BDA0D3B4EB3A257C9AF1F8F03009")), + + TestFixture(N: Array(hex: "BBAA99887766554433221102"), + A: Array(hex: "0001020304050607"), + P: Array(hex: ""), + C: Array(hex: "81017F8203F081277152FADE694A0A00")), + + TestFixture(N: Array(hex: "BBAA99887766554433221103"), + A: Array(hex: ""), + P: Array(hex: "0001020304050607"), + C: Array(hex: "45DD69F8F5AAE72414054CD1F35D82760B2CD00D2F99BFA9")), + + TestFixture(N: Array(hex: "BBAA99887766554433221104"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F"), + P: Array(hex: "000102030405060708090A0B0C0D0E0F"), + C: Array(hex: "571D535B60B277188BE5147170A9A22C3AD7A4FF3835B8C5701C1CCEC8FC3358")), + + TestFixture(N: Array(hex: "BBAA99887766554433221105"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F"), + P: Array(hex: ""), + C: Array(hex: "8CF761B6902EF764462AD86498CA6B97")), + + TestFixture(N: Array(hex: "BBAA99887766554433221106"), + A: Array(hex: ""), + P: Array(hex: "000102030405060708090A0B0C0D0E0F"), + C: Array(hex: "5CE88EC2E0692706A915C00AEB8B2396F40E1C743F52436BDF06D8FA1ECA343D")), + + TestFixture(N: Array(hex: "BBAA99887766554433221107"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F1011121314151617"), + P: Array(hex: "000102030405060708090A0B0C0D0E0F1011121314151617"), + C: Array(hex: "1CA2207308C87C010756104D8840CE1952F09673A448A122C92C62241051F57356D7F3C90BB0E07F")), + + TestFixture(N: Array(hex: "BBAA99887766554433221108"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F1011121314151617"), + P: Array(hex: ""), + C: Array(hex: "6DC225A071FC1B9F7C69F93B0F1E10DE")), + + TestFixture(N: Array(hex: "BBAA99887766554433221109"), + A: Array(hex: ""), + P: Array(hex: "000102030405060708090A0B0C0D0E0F1011121314151617"), + C: Array(hex: "221BD0DE7FA6FE993ECCD769460A0AF2D6CDED0C395B1C3CE725F32494B9F914D85C0B1EB38357FF")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110A"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"), + P: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"), + C: Array(hex: "BD6F6C496201C69296C11EFD138A467ABD3C707924B964DEAFFC40319AF5A48540FBBA186C5553C68AD9F592A79A4240")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110B"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"), + P: Array(hex: ""), + C: Array(hex: "FE80690BEE8A485D11F32965BC9D2A32")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110C"), + A: Array(hex: ""), + P: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F"), + C: Array(hex: "2942BFC773BDA23CABC6ACFD9BFD5835BD300F0973792EF46040C53F1432BCDFB5E1DDE3BC18A5F840B52E653444D5DF")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110D"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"), + P: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"), + C: Array(hex: "D5CA91748410C1751FF8A2F618255B68A0A12E093FF454606E59F9C1D0DDC54B65E8628E568BAD7AED07BA06A4A69483A7035490C5769E60")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110E"), + A: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"), + P: Array(hex: ""), + C: Array(hex: "C5CD9D1850C141E358649994EE701B68")), + + TestFixture(N: Array(hex: "BBAA9988776655443322110F"), + A: Array(hex: ""), + P: Array(hex: "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F2021222324252627"), + C: Array(hex: "4412923493C57D5DE0D700F753CCE0D1D2D95060122E9F15A5DDBFC5787E50B5CC55EE507BCB084E479AD363AC366B95A98CA5F3000B1479")), + ] + + func testEncrypt(fixture: TestFixture) -> Bool { + let ocb = OCB(nonce: fixture.N, additionalAuthenticatedData: fixture.A, mode: .combined) + let aes = try! AES(key: K, blockMode: ocb, padding: .noPadding) + let encrypted = try! aes.encrypt(fixture.P) + if encrypted != fixture.C { + return false + } + return true + } + + func testDecrypt(fixture: TestFixture) -> Bool { + let ocb = OCB(nonce: fixture.N, additionalAuthenticatedData: fixture.A, mode: .combined) + let aes = try! AES(key: K, blockMode: ocb, padding: .noPadding) + let plaintext = try! aes.decrypt(fixture.C) + if plaintext != fixture.P { + return false + } + return true + } + + func testInvalidTag(fixture: TestFixture) -> Bool { + let ocb = OCB(nonce: fixture.N, additionalAuthenticatedData: fixture.A, mode: .combined) + let aes = try! AES(key: K, blockMode: ocb, padding: .noPadding) + var C_ = fixture.C.slice + C_[C_.count - 1] ^= 0x01 + let plaintext = try? aes.decrypt(C_) + return plaintext == nil + } + + for (i, fixture) in fixtures.enumerated() { + XCTAssertTrue(testEncrypt(fixture: fixture), "Encryption failed") + XCTAssertTrue(testDecrypt(fixture: fixture), "(\(i) - Decryption failed.") + XCTAssertTrue(testInvalidTag(fixture: fixture), "(\(i) - Invalid Tag verification failed.") + } + } + + static let allTests = [ + ("testAESOCBWithRFC7253Tests", testAESOCBWithRFC7253Tests), + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTests.swift new file mode 100644 index 00000000..86fdf421 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTests.swift @@ -0,0 +1,713 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class AESTests: XCTestCase { + // 128 bit key + let aesKey: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + + func testAESEncrypt() { + let input: Array = [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff] + let expected: Array = [0x69, 0xc4, 0xe0, 0xd8, 0x6a, 0x7b, 0x4, 0x30, 0xd8, 0xcd, 0xb7, 0x80, 0x70, 0xb4, 0xc5, 0x5a] + + let aes = try! AES(key: self.aesKey, blockMode: ECB(), padding: .noPadding) + let encrypted = try! aes.encrypt(input) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, input, "decryption failed") + } + + func testAESEncrypt2() { + let key: Array = [0x36, 0x37, 0x39, 0x66, 0x62, 0x31, 0x64, 0x64, 0x66, 0x37, 0x64, 0x38, 0x31, 0x62, 0x65, 0x65] + let iv: Array = [0x6b, 0x64, 0x66, 0x36, 0x37, 0x33, 0x39, 0x38, 0x44, 0x46, 0x37, 0x33, 0x38, 0x33, 0x66, 0x64] + let input: Array = [0x62, 0x72, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + + let expected: Array = [0xae, 0x8c, 0x59, 0x95, 0xb2, 0x6f, 0x8e, 0x3d, 0xb0, 0x6f, 0x0a, 0xa5, 0xfe, 0xc4, 0xf0, 0xc2] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .noPadding) + do { + let encrypted = try aes.encrypt(input) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try aes.decrypt(encrypted) + XCTAssertEqual(decrypted, input, "decryption failed") + } catch { + XCTFail("\(error)") + } + } + + func testAESEncrypt3() { + let key = "679fb1ddf7d81bee" + let iv = "kdf67398DF7383fd" + let input: Array = [0x62, 0x72, 0x61, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + let expected: Array = [0xae, 0x8c, 0x59, 0x95, 0xb2, 0x6f, 0x8e, 0x3d, 0xb0, 0x6f, 0x0a, 0xa5, 0xfe, 0xc4, 0xf0, 0xc2] + + do { + let aes = try AES(key: key, iv: iv, padding: .noPadding) + let encrypted = try aes.encrypt(input) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try aes.decrypt(encrypted) + XCTAssertEqual(decrypted, input, "decryption failed") + } catch { + XCTFail("\(error)") + } + } + + func testAESEncryptCBCNoPadding() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptCBCWithPadding() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46, 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d, 0x89, 0x64, 0xe0, 0xb1, 0x49, 0xc1, 0x0b, 0x7b, 0x68, 0x2e, 0x6e, 0x39, 0xaa, 0xeb, 0x73, 0x1c] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptCBCWithPaddingPartial() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + + var ciphertext = Array() + var encryptor = try! aes.makeEncryptor() + ciphertext += try! encryptor.update(withBytes: plaintext[0..<8]) + ciphertext += try! encryptor.update(withBytes: plaintext[8..<16]) + ciphertext += try! encryptor.update(withBytes: plaintext[16..<32]) + ciphertext += try! encryptor.finish() + XCTAssertEqual(try! aes.encrypt(plaintext), ciphertext, "encryption failed") + } + + func testAESEncryptIncremental() { + do { + var ciphertext = Array() + let plaintext = "Today Apple launched the open source Swift community, as well as amazing new tools and resources." + let aes = try AES(key: "passwordpassword".bytes, blockMode: CBC(iv: "drowssapdrowssap".bytes)) + var encryptor = try! aes.makeEncryptor() + + ciphertext += try encryptor.update(withBytes: plaintext.bytes) + ciphertext += try encryptor.finish() + XCTAssertEqual(try aes.encrypt(plaintext.bytes), ciphertext, "encryption failed") + } catch { + XCTFail("\(error)") + } + } + + func testAESDecryptCBCWithPaddingPartial() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let ciphertext: Array = [118, 73, 171, 172, 129, 25, 178, 70, 206, 233, 142, 155, 18, 233, 25, 125, 76, 187, 200, 88, 117, 107, 53, 129, 37, 82, 158, 150, 152, 163, 143, 68, 169, 105, 137, 234, 93, 98, 239, 215, 41, 45, 51, 254, 138, 92, 251, 17] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + var plaintext = Array() + var decryptor = try! aes.makeDecryptor() + plaintext += try! decryptor.update(withBytes: ciphertext[0..<8]) + plaintext += try! decryptor.update(withBytes: ciphertext[8..<16]) + plaintext += try! decryptor.update(withBytes: ciphertext[16..<32]) + plaintext += try! decryptor.finish() + XCTAssertEqual(try! aes.decrypt(ciphertext), plaintext, "encryption failed") + } + + func testAESEncryptCFB() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0x3b, 0x3f, 0xd9, 0x2e, 0xb7, 0x2d, 0xad, 0x20, 0x33, 0x34, 0x49, 0xf8, 0xe8, 0x3c, 0xfb, 0x4a] + + let aes = try! AES(key: key, blockMode: CFB(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/142 + func testAESEncryptCFBLong() { + let key: Array = [56, 118, 37, 51, 125, 78, 103, 107, 119, 40, 74, 88, 117, 112, 123, 75, 122, 89, 72, 36, 46, 91, 106, 60, 54, 110, 34, 126, 69, 126, 61, 87] + let iv: Array = [69, 122, 99, 87, 83, 112, 110, 65, 54, 109, 107, 89, 73, 122, 74, 49] + let plaintext: Array = [123, 10, 32, 32, 34, 67, 111, 110, 102, 105, 114, 109, 34, 32, 58, 32, 34, 116, 101, 115, 116, 105, 110, 103, 34, 44, 10, 32, 32, 34, 70, 105, 114, 115, 116, 78, 97, 109, 101, 34, 32, 58, 32, 34, 84, 101, 115, 116, 34, 44, 10, 32, 32, 34, 69, 109, 97, 105, 108, 34, 32, 58, 32, 34, 116, 101, 115, 116, 64, 116, 101, 115, 116, 46, 99, 111, 109, 34, 44, 10, 32, 32, 34, 76, 97, 115, 116, 78, 97, 109, 101, 34, 32, 58, 32, 34, 84, 101, 115, 116, 101, 114, 34, 44, 10, 32, 32, 34, 80, 97, 115, 115, 119, 111, 114, 100, 34, 32, 58, 32, 34, 116, 101, 115, 116, 105, 110, 103, 34, 44, 10, 32, 32, 34, 85, 115, 101, 114, 110, 97, 109, 101, 34, 32, 58, 32, 34, 84, 101, 115, 116, 34, 10, 125] + let encrypted: Array = try! AES(key: key, blockMode: CFB(iv: iv)).encrypt(plaintext) + let decrypted: Array = try! AES(key: key, blockMode: CFB(iv: iv)).decrypt(encrypted) + XCTAssert(decrypted == plaintext, "decryption failed") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/500 + func testAESEncryptCFB8() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d] + let expected: Array = [0x3b, 0x79, 0x42, 0x4c, 0x9c, 0x0d, 0xd4, 0x36, 0xba, 0xce, 0x9e, 0x0e, 0xd4, 0x58, 0x6a, 0x4f, 0x32, 0xb9] + + let aes = try! AES(key: key, blockMode: CFB(iv: iv, segmentSize: .cfb8), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptOFB128() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0x3b, 0x3f, 0xd9, 0x2e, 0xb7, 0x2d, 0xad, 0x20, 0x33, 0x34, 0x49, 0xf8, 0xe8, 0x3c, 0xfb, 0x4a] + + let aes = try! AES(key: key, blockMode: OFB(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptOFB256() { + let key: Array = [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0xdc, 0x7e, 0x84, 0xbf, 0xda, 0x79, 0x16, 0x4b, 0x7e, 0xcd, 0x84, 0x86, 0x98, 0x5d, 0x38, 0x60] + + let aes = try! AES(key: key, blockMode: OFB(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptPCBC256() { + let key: Array = [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6] + + let aes = try! AES(key: key, blockMode: PCBC(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + print(encrypted.toHexString()) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptBigPCBC128() { + let key = "0123456789abcdef".bytes + let iv = "fedcba9876543210".bytes + let plaintext = "64 byte plaintext that will split into 4 chunks of 16 bytes each".bytes + let ciphertext: Array = [0xd6, 0x83, 0x7b, 0xb8, 0xfe, 0x1d, 0x62, 0xf7, 0x04, 0x69, 0xd1, 0xfd, 0x47, 0x06, 0x9c, 0x3d, 0xc0, 0x7c, 0xfe, 0xc9, 0x3d, 0xba, 0x35, 0x61, 0x40, 0xef, 0xe2, 0xac, 0xc6, 0x4c, 0x3d, 0x04, 0xbf, 0x4c, 0xa4, 0xf6, 0xfc, 0x09, 0xfc, 0x8c, 0x2e, 0x09, 0xd0, 0x74, 0x66, 0x2b, 0x8f, 0x02, 0x54, 0x01, 0x25, 0x76, 0x20, 0x88, 0x5e, 0x19, 0x3f, 0x74, 0xcd, 0x48, 0x29, 0xc7, 0xe1, 0xc6, 0xfb, 0xc9, 0xb9, 0xcf, 0xcd, 0xf8, 0xeb, 0x42, 0xbc, 0x0f, 0xc5, 0x73, 0x96, 0xe4, 0xf8, 0x0f] + + let aes = try! AES(key: key, blockMode: PCBC(iv: iv), padding: .pkcs7) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, ciphertext, "encryption failed") + let decrypted = try! aes.decrypt(ciphertext) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptCTR() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expected: Array = [0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce] + + let aes = try! AES(key: key, blockMode: CTR(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted.count, plaintext.count) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted.count, plaintext.count) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/424 + func testAESEncryptCTRZeroPadding() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0x01] + let expected: Array = [0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce, 0x37, 0x2b, 0x7c, 0x3c, 0x67, 0x73, 0x51, 0x63, 0x18, 0xa0, 0x77, 0xd7, 0xfc, 0x50, 0x73, 0xae] + + let aes = try! AES(key: key, blockMode: CTR(iv: iv), padding: .zeroPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertEqual(plaintext.count, 17) + XCTAssertEqual(encrypted.count, 32, "padding failed") + XCTAssertEqual(encrypted, expected, "encryption failed") + } + + func testAESEncryptCTRIrregularLength() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0x01] + let expected: Array = [0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce, 0x37] + + let aes = try! AES(key: key, blockMode: CTR(iv: iv), padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(encrypted, expected, "encryption failed") + let decrypted = try! aes.decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + // https://github.com/krzyzanowskim/CryptoSwift/pull/290 + func testAESDecryptCTRSeek() { + let key: Array = [0x52, 0x72, 0xb5, 0x9c, 0xab, 0x07, 0xc5, 0x01, 0x11, 0x7a, 0x39, 0xb6, 0x10, 0x35, 0x87, 0x02] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01] + var plaintext: Array = Array(repeating: 0, count: 6000) + + for i in 0.. = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff] + let plaintext: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0x01, 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0x01] + let expected: Array = [0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b, 0xef, 0x68, 0x64, 0x99, 0xd, 0xb6, 0xce, 0x37, 0x40, 0xbd, 0x82, 0x85, 0x5d, 0x11, 0xfc, 0x8e, 0x49, 0x4a, 0xa9, 0xed, 0x23, 0xe0, 0xb9, 0x40, 0x2d] + + let aes = try! AES(key: key, blockMode: CTR(iv: iv), padding: .noPadding) + var encryptor = try! aes.makeEncryptor() + var encrypted = Array() + encrypted += try! encryptor.update(withBytes: plaintext[0..<5]) + encrypted += try! encryptor.update(withBytes: plaintext[5..<15]) + encrypted += try! encryptor.update(withBytes: plaintext[15...]) + encrypted += try! encryptor.finish() + XCTAssertEqual(encrypted, expected, "encryption failed") + + var decryptor = try! aes.makeDecryptor() + var decrypted = Array() + decrypted += try! decryptor.update(withBytes: expected[0..<5]) + decrypted += try! decryptor.update(withBytes: expected[5..<15]) + decrypted += try! decryptor.update(withBytes: expected[15...]) + decrypted += try! decryptor.finish() + XCTAssertEqual(decrypted, plaintext, "decryption failed") + } + + func testAESEncryptCTRStream() { + let key = Array(hex: "0xbe3e9020816eb838782e2d9f4a2f40d4") + let iv = Array(hex: "0x0000000000000000a9bbd681ded0c0c8") + + do { + let aes = try AES(key: key, blockMode: CTR(iv: iv), padding: .noPadding) + var encryptor = try aes.makeEncryptor() + + let encrypted1 = try encryptor.update(withBytes: [0x00, 0x01, 0x02, 0x03] as [UInt8]) + XCTAssertEqual(encrypted1, Array(hex: "d79d0344")) + let encrypted2 = try encryptor.update(withBytes: [0x04, 0x05, 0x06, 0x07] as [UInt8]) + XCTAssertEqual(encrypted2, Array(hex: "b2a08879")) + let encrypted3 = try encryptor.update(withBytes: [0x08] as [UInt8]) + XCTAssertEqual(encrypted3, Array(hex: "db")) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testAESWithWrongKey() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let key2: Array = [0x22, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x33] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let plaintext: Array = [49, 46, 50, 50, 50, 51, 51, 51, 51] + + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + let aes2 = try! AES(key: key2, blockMode: CBC(iv: iv), padding: .pkcs7) + let encrypted = try! aes.encrypt(plaintext) + let decrypted = try? aes2.decrypt(encrypted) + XCTAssertTrue(decrypted! != plaintext, "failed") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/298 + func testIssue298() { + let encryptedValue = "47595cfa90f7b0b0e0d9d7240a2e035f7f4acde27d7ca778a7d8b05add32a0a92d945c0a59f7f0e029d7f2fbb258b2f0" + let expected: Array = [55, 52, 98, 54, 53, 51, 101, 51, 54, 52, 51, 48, 100, 55, 97, 57, 99, 100, 57, 49, 97, 50, 52, 100, 57, 57, 52, 52, 98, 48, 51, 50, 79, 114, 70, 101, 99, 107, 114, 87, 111, 0, 0, 0, 0, 0, 0, 0] + let key = "0123456789abcdef" + let iv = "fedcba9876543210" + + do { + let aes = try AES(key: key, iv: iv, padding: .noPadding) + let ciphertext = try aes.decrypt(Array(hex: encryptedValue)) + XCTAssertEqual(ciphertext, expected) + } catch { + XCTFail("failed") + } + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/394 + func testIssue394() { + let plaintext = "Nullam quis risus eget urna mollis ornare vel eu leo.".bytes + let key = "passwordpassword".bytes.md5() // -md md5 + let iv = "drowssapdrowssap".bytes // -iv 64726f777373617064726f7773736170 + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) // -aes-128-cbc + let ciphertext = try! aes.encrypt(plaintext) // enc + + // $ echo -n "Nullam quis risus eget urna mollis ornare vel eu leo." | openssl enc -aes-128-cbc -md md5 -nosalt -iv 64726f777373617064726f7773736170 -pass pass:passwordpassword -base64 + // cij+965z2Xqoj9tIHgtA72ZPfv5sxnt76vwkIt1CodYY313oa7mr0pSc5o++g0CX + // YczxK2fGIa84xtwDtRMwBQ== + XCTAssertEqual(ciphertext.toBase64(), "cij+965z2Xqoj9tIHgtA72ZPfv5sxnt76vwkIt1CodYY313oa7mr0pSc5o++g0CXYczxK2fGIa84xtwDtRMwBQ==") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/411 + func testIssue411() { + let ciphertext: Array = [0x2a, 0x3a, 0x80, 0x05, 0xaf, 0x46, 0x58, 0x2d, 0x66, 0x52, 0x10, 0xae, 0x86, 0xd3, 0x8e, 0x8f] // test + let key = "passwordpassword".bytes.md5() // -md md5 + let iv = "drowssapdrowssap".bytes // -iv 64726f777373617064726f7773736170 + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) // -aes-128-cbc + let plaintext = try! ciphertext.decrypt(cipher: aes) + XCTAssertEqual("74657374", plaintext.toHexString()) + } +} + +// MARK: - GCM + +extension AESTests { + func testAESGCMTestCase1() { + // Test Case 1 + let key = Array(hex: "0x00000000000000000000000000000000") + let iv = Array(hex: "0x000000000000000000000000") + + let gcm = GCM(iv: iv, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt([UInt8]()) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "58e2fccefa7e3061367f1d57a4e7455a")) // T (128-bit) + } + + func testAESGCMTestCase2() { + // Test Case 2 + let key = Array(hex: "0x00000000000000000000000000000000") + let plaintext = Array(hex: "0x00000000000000000000000000000000") + let iv = Array(hex: "0x000000000000000000000000") + + let gcm = GCM(iv: iv, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0388dace60b6a392f328c2b971b2fe78")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "ab6e47d42cec13bdf53a67b21257bddf")) // T (128-bit) + } + + func testAESGCMTestCase3() { + // Test Case 3 + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = Array(hex: "0xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255") + let iv = Array(hex: "0xcafebabefacedbaddecaf888") + + let encGCM = GCM(iv: iv, mode: .detached) + let aes = try! AES(key: key, blockMode: encGCM, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertNotNil(encGCM.authenticationTag) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0x42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985")) // C + XCTAssertEqual(encGCM.authenticationTag, [UInt8](hex: "0x4d5c2af327cd64a62cf35abd2ba6fab4")) // T (128-bit) + + // decrypt + func decrypt(_ encrypted: Array, tag: Array) -> Array { + let decGCM = GCM(iv: iv, authenticationTag: tag, mode: .detached) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted, tag: encGCM.authenticationTag!) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTestCase3Combined() { + // Test Case 3 + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = Array(hex: "0xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255") + let iv = Array(hex: "0xcafebabefacedbaddecaf888") + + let encGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: encGCM, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertNotNil(encGCM.authenticationTag) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0x42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f59854d5c2af327cd64a62cf35abd2ba6fab4")) // C + XCTAssertEqual(encGCM.authenticationTag, [UInt8](hex: "0x4d5c2af327cd64a62cf35abd2ba6fab4")) // T (128-bit) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTestCase4() { + // Test Case 4 + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = Array(hex: "0xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39") + let iv = Array(hex: "0xcafebabefacedbaddecaf888") + let auth = Array(hex: "0xfeedfacedeadbeeffeedfacedeadbeefabaddad2") + + let gcm = GCM(iv: iv, additionalAuthenticatedData: auth, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0x42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "0x5bc94fbc3221a5db94fae95ae7121a47")) // T (128-bit) + } + + func testAESGCMTestCase5() { + // Test Case 5 + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = Array(hex: "0xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39") + let iv = Array(hex: "0xcafebabefacedbad") + let auth = Array(hex: "0xfeedfacedeadbeeffeedfacedeadbeefabaddad2") + + let gcm = GCM(iv: iv, additionalAuthenticatedData: auth, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0x61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "0x3612d2e79e3b0785561be14aaca2fccb")) // T (128-bit) + } + + func testAESGCMTestCase6() { + // Test Case 6 + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = Array(hex: "0xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39") + let iv = Array(hex: "0x9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b") + let auth = Array(hex: "0xfeedfacedeadbeeffeedfacedeadbeefabaddad2") + + let gcm = GCM(iv: iv, additionalAuthenticatedData: auth, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0x8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "0x619cc5aefffe0bfa462af43c1699d050")) // T (128-bit) + } + + func testAESGCMTestCase7() { + // Test Case 7 + let key = Array(hex: "0x000000000000000000000000000000000000000000000000") + let plaintext = Array(hex: "") + let iv = Array(hex: "0x000000000000000000000000") + + let gcm = GCM(iv: iv, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertEqual(Array(encrypted), [UInt8](hex: "")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "0xcd33b28ac773f74ba00ed1f312572435")) // T (128-bit) + } + + func testAESGCMTagLengthDetached() { + // Test Case 2 + let key = Array(hex: "0x00000000000000000000000000000000") + let plaintext = Array(hex: "0x00000000000000000000000000000000") + let iv = Array(hex: "0x000000000000000000000000") + + let gcm = GCM(iv: iv, tagLength: 12, mode: .detached) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0388dace60b6a392f328c2b971b2fe78")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "ab6e47d42cec13bdf53a67b2")) // T (96-bit) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, authenticationTag: gcm.authenticationTag!, mode: .detached) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTagLengthCombined() { + // Test Case 2 + let key = Array(hex: "0x00000000000000000000000000000000") + let plaintext = Array(hex: "0x00000000000000000000000000000000") + let iv = Array(hex: "0x000000000000000000000000") + + let gcm = GCM(iv: iv, tagLength: 12, mode: .combined) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0388dace60b6a392f328c2b971b2fe78ab6e47d42cec13bdf53a67b2")) // C + XCTAssertEqual(gcm.authenticationTag, [UInt8](hex: "ab6e47d42cec13bdf53a67b2")) // T (96-bit) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, authenticationTag: gcm.authenticationTag!, mode: .combined) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTagLengthCombined2() { + let key = Array(hex: "0x00000000000000000000000000000000") + let plaintext = Array(hex: "0x0000000000000000000000000000000000000000") + let iv = Array(hex: "0x000000000000") + + let gcm = GCM(iv: iv, tagLength: 12, mode: .combined) + let aes = try! AES(key: key, blockMode: gcm, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, authenticationTag: gcm.authenticationTag!, mode: .combined) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTestCaseIrregularCombined1() { + // echo -n "0123456789010123456789012345" | openssl enc -aes-128-gcm -K feffe9928665731c6d6a8f9467308308 -iv cafebabefacedbaddecaf888 -nopad -nosalt + // openssl note: The enc program does not support authenticated encryption modes like CCM and GCM. The utility does not store or retrieve the authentication tag + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = "0123456789010123456789012345".bytes + let iv = Array(hex: "0xcafebabefacedbaddecaf888") + + let encGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: encGCM, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertNotNil(encGCM.authenticationTag) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0xab831ed4edc644f6d61218431b14c0355138be4b010f630b29be7a2b9793b9fbecc7b44cc86dfd697a50c1c6")) // C + XCTAssertEqual(encGCM.authenticationTag, [UInt8](hex: "0x9793b9fbecc7b44cc86dfd697a50c1c6")) // T (128-bit) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } + + func testAESGCMTestCaseIrregularCombined2() { + // echo -n "0123456789010123456789012345012345678901012345678901234567" | openssl enc -aes-128-gcm -K feffe9928665731c6d6a8f9467308308 -iv cafebabefacedbaddecaf888 -nopad -nosalt + // openssl note: The enc program does not support authenticated encryption modes like CCM and GCM. The utility does not store or retrieve the authentication tag + let key = Array(hex: "0xfeffe9928665731c6d6a8f9467308308") + let plaintext = "0123456789010123456789012345012345678901012345678901234567".bytes + let iv = Array(hex: "0xcafebabefacedbaddecaf888") + + let encGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: encGCM, padding: .noPadding) + let encrypted = try! aes.encrypt(plaintext) + + XCTAssertNotNil(encGCM.authenticationTag) + XCTAssertEqual(Array(encrypted), [UInt8](hex: "0xab831ed4edc644f6d61218431b14c0355138be4b010f630b29be7a2b93ac196f09dc2e10f937aa7e6271564dd117291792f0d6fdf2347ef5b10c86a7f414f0c91a8e59fd2405b850527e")) // C + XCTAssertEqual(encGCM.authenticationTag, [UInt8](hex: "0x86a7f414f0c91a8e59fd2405b850527e")) // T (128-bit) + + // decrypt + func decrypt(_ encrypted: Array) -> Array { + let decGCM = GCM(iv: iv, mode: .combined) + let aes = try! AES(key: key, blockMode: decGCM, padding: .noPadding) + return try! aes.decrypt(encrypted) + } + + let decrypted = decrypt(encrypted) + XCTAssertEqual(decrypted, plaintext) + } +} + +extension AESTests { + static func allTests() -> [(String, (AESTests) -> () -> Void)] { + let tests = [ + ("testAESEncrypt", testAESEncrypt), + ("testAESEncrypt2", testAESEncrypt2), + ("testAESEncrypt3", testAESEncrypt3), + ("testAESEncryptCBCNoPadding", testAESEncryptCBCNoPadding), + ("testAESEncryptCBCWithPadding", testAESEncryptCBCWithPadding), + ("testAESEncryptCBCWithPaddingPartial", testAESEncryptCBCWithPaddingPartial), + ("testAESEncryptIncremental", testAESEncryptIncremental), + ("testAESDecryptCBCWithPaddingPartial", testAESDecryptCBCWithPaddingPartial), + ("testAESEncryptCFB", testAESEncryptCFB), + ("testAESEncryptCFBLong", testAESEncryptCFBLong), + ("testAESEncryptCFB8", testAESEncryptCFB8), + ("testAESEncryptOFB128", testAESEncryptOFB128), + ("testAESEncryptOFB256", testAESEncryptOFB256), + ("testAESEncryptPCBC256", testAESEncryptPCBC256), + ("testAESEncryptCTR", testAESEncryptCTR), + ("testAESEncryptCTRZeroPadding", testAESEncryptCTRZeroPadding), + ("testAESEncryptCTRIrregularLength", testAESEncryptCTRIrregularLength), + ("testAESDecryptCTRSeek", testAESDecryptCTRSeek), + ("testAESEncryptCTRIrregularLengthIncrementalUpdate", testAESEncryptCTRIrregularLengthIncrementalUpdate), + ("testAESEncryptCTRStream", testAESEncryptCTRStream), + ("testIssue298", testIssue298), + ("testIssue394", testIssue394), + ("testIssue411", testIssue411), + ("testAESWithWrongKey", testAESWithWrongKey), + ("testAESGCMTestCase1", testAESGCMTestCase1), + ("testAESGCMTestCase2", testAESGCMTestCase2), + ("testAESGCMTestCase3", testAESGCMTestCase3), + ("testAESGCMTestCase3Combined", testAESGCMTestCase3Combined), + ("testAESGCMTestCase4", testAESGCMTestCase4), + ("testAESGCMTestCase5", testAESGCMTestCase5), + ("testAESGCMTestCase6", testAESGCMTestCase6), + ("testAESGCMTestCase7", testAESGCMTestCase7), + ("testAESGCMTestTagLengthDetached", testAESGCMTagLengthDetached), + ("testAESGCMTestTagLengthCombined", testAESGCMTagLengthCombined), + ("testAESGCMTestCaseIrregularCombined1", testAESGCMTestCaseIrregularCombined1), + ("testAESGCMTestCaseIrregularCombined2", testAESGCMTestCaseIrregularCombined2) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTestsPerf.swift new file mode 100644 index 00000000..174bcc80 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/AESTestsPerf.swift @@ -0,0 +1,50 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class AESTestsPerf: XCTestCase { + func testAESEncryptPerformance() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let message = Array(repeating: 7, count: 1024 * 1024) + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + measure { + _ = try! aes.encrypt(message) + } + } + + func testAESDecryptPerformance() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f] + let message = Array(repeating: 7, count: 1024 * 1024) + let aes = try! AES(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + measure { + _ = try! aes.decrypt(message) + } + } +} + +extension AESTestsPerf { + static func allTests() -> [(String, (AESTestsPerf) -> () -> Void)] { + let tests = [ + ("testAESEncryptPerformance", testAESEncryptPerformance), + ("testAESDecryptPerformance", testAESDecryptPerformance) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ASN1Tests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ASN1Tests.swift new file mode 100644 index 00000000..93356cb1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ASN1Tests.swift @@ -0,0 +1,521 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2021 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +final class ASN1Tests: XCTestCase { + + /// This test ensures that we get the same data out as we put in before and after encoding + /// + /// This test enforces that + /// 1) The data provided to each of the `ASN1.Node`s is preserved across encoding and decoding. + func testASN1NonDestructiveEncoding() throws { + let arbitraryData = Data(hex: "0123456789") + + // Encode the serialized BigInteger + let node: ASN1.Node = .sequence(nodes: [ + .integer(data: arbitraryData), + .bitString(data: arbitraryData), + .octetString(data: arbitraryData), + .null, + .objectIdentifier(data: arbitraryData) + ]) + + let encoded = ASN1.Encoder.encode(node) + + // Decode the Encoding + let decoded = try ASN1.Decoder.decode(data: Data(encoded)) + guard case .sequence(let sequence) = decoded else { + XCTFail("Failed to recover encoded SEQUENCE") + return + } + + XCTAssertEqual(sequence.count, 5) + + guard case .integer(let integerData) = sequence[0] else { + XCTFail("Failed to recover encoded INTEGER") + return + } + XCTAssertEqual(integerData, arbitraryData) + + guard case .bitString(let bitStringData) = sequence[1] else { + XCTFail("Failed to recover encoded BITSTRING") + return + } + XCTAssertEqual(bitStringData, arbitraryData) + + guard case .octetString(let octetData) = sequence[2] else { + XCTFail("Failed to recover encoded OCTETSTRING") + return + } + XCTAssertEqual(octetData, arbitraryData) + + guard case .null = sequence[3] else { + XCTFail("Failed to recover encoded NULL") + return + } + + guard case .objectIdentifier(let objIDData) = sequence[4] else { + XCTFail("Failed to recover encoded OBJECTIDENTIFIER") + return + } + XCTAssertEqual(objIDData, arbitraryData) + } + + /// The ASN1 Encoder / Decoder doesn't handle encoding / decoding Integers directly, it's your responsibility to accurately serialize your integers. + /// - Note: In this example we're using BigInteger's serialization technique to encode / decode Integers, which isn't the default method for handling integers. https://www.strozhevsky.com/free_docs/asn1_by_simple_words.pdf + /// + /// This test enforces that + /// 1) The data provided to the `ASN1.Node.integer` Node is preserved across encoding and decoding. + func testASN1DecodePrimitiveInteger() throws { + let tests = [ + 0, + -0, + 128, + -128, + 136, + -136, + 8388607, + -8388607, + 3409934108352718734, + -3409934108352718734 + ] + + for test in tests { + let number = BigInteger(test) + + // Encode the serialized Integer + let encoded = ASN1.Encoder.encode(.integer(data: number.serialize())) + + // Ensure the Integer Prefix was added + XCTAssertEqual(Array(arrayLiteral: 0x02), Array(encoded.prefix(1))) + + // Decode the Encoding + let decoded = try ASN1.Decoder.decode(data: Data(encoded)) + guard case .integer(let num) = decoded else { + XCTFail("Failed to recover encoded integer") + return + } + + // Ensure the original BigInteger was recovered + XCTAssertEqual(BigInteger(num), number) + } + } + + /// Another test showing that Integers are stored as arbitrary data and the proper serialization and signage are the responsibilities of the user and their application. + /// + /// This test enforces that + /// 1) The data provided to the `ASN1.Node.integer` Node is preserved across encoding and decoding. + func testASN1DecodeLargeBigInteger() throws { + // Because INTEGERS are stored as arbitrary data we should be able to store an integer that would otherwise overflow by using the BigInteger library + let largeBigInt = BigInteger("1541235134652345698374107823450134507610354876134950342785028743653") + + // Encode the serialized BigInteger + let encoded = ASN1.Encoder.encode(.integer(data: largeBigInt.serialize())) + + // Decode the Encoding + let decoded = try ASN1.Decoder.decode(data: Data(encoded)) + guard case .integer(let num) = decoded else { + XCTFail("Failed to recover encoded integer") + return + } + + // Ensure the original BigInteger was recovered + XCTAssertEqual(BigInteger(num), largeBigInt) + } + + /// This tests decodes an RSA Public Key from a Base64 DER Encoded representation + /// + /// This test enforces that + /// 1) The decoding process yeilds the expected format. + /// 2) The re-encoding of the data yeilds the exact same starting data. + func testANS1DERDecodingPublicKey() throws { + /// An example of an RSA Public Key ASN1 DER Encoding + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.1) + /// ``` + /// ========================= + /// RSA PublicKey Structure + /// ========================= + /// + /// RSAPublicKey ::= SEQUENCE { + /// modulus INTEGER, -- n + /// publicExponent INTEGER, -- e + /// } + /// ``` + let publicDER = """ + MIGJAoGBAMGeZvIG84vyKAATwKkKz2g+PeNaZ63rxk/zEnLGxkMCVKnUZ6jPAtzYOKM24949yIhfxYBC/bOCPwRK4wbr4YyIx3WB2v+Zcqe8pRM/BThUpNIx3K2+jbJBhAopf1GXJ3i31RuiLMh9HWhxzkVamz1KnDjCuTZguCRRHIv+r3XTAgMBAAE= + """ + + guard let publicDERData = Data(base64Encoded: publicDER) else { + XCTFail("Failed to convert base64 string into data for decoding.") + return + } + + let decoded = try ASN1.Decoder.decode(data: publicDERData) + + // Ensure the first node is of type Sequence + guard case .sequence(let nodes) = decoded else { + XCTFail("Expected the top level node to be a sequence and it wasn't") + return + } + + // Ensure there are two nodes within the top level sequence (our integers, n and e) + XCTAssertEqual(nodes.count, 2) + + // Ensure that the first node within our sequence is of type Integer + guard case .integer(let n) = nodes[0] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + + // Ensure the second node within our sequence is of type Integer + guard case .integer(let e) = nodes[1] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + + // Ensure that n contains the data we expected + XCTAssertEqual(n.toHexString(), "00c19e66f206f38bf2280013c0a90acf683e3de35a67adebc64ff31272c6c6430254a9d467a8cf02dcd838a336e3de3dc8885fc58042fdb3823f044ae306ebe18c88c77581daff9972a7bca5133f053854a4d231dcadbe8db241840a297f51972778b7d51ba22cc87d1d6871ce455a9b3d4a9c38c2b93660b824511c8bfeaf75d3") + + // Ensure that e contains the data we expected + XCTAssertEqual(e.toHexString(), "010001") // 65537 + + // Re Encode the data + let asn1: ASN1.Node = .sequence(nodes: [ + .integer(data: n), + .integer(data: e) + ]) + + let encoded = ASN1.Encoder.encode(asn1) + + // Ensure the re-encoded data matches the original exactly + XCTAssertEqual(Data(encoded), publicDERData) + XCTAssertEqual(encoded, publicDERData.bytes) + XCTAssertEqual(encoded.toBase64(), publicDER) + } + + /// This tests decodes an RSA Private Key from a Base64 DER Encoded representation + /// + /// This test enforces that + /// 1) The decoding process yeilds the expected format. + /// 2) The re-encoding of the data yeilds the exact same starting data. + func testANS1DERDecodingPrivateKey() throws { + /// An example of an RSA Private Key ASN1 DER Encoding + /// + /// [IETF Spec RFC2313](https://datatracker.ietf.org/doc/html/rfc2313#section-7.2) + /// ``` + /// ========================== + /// RSA PrivateKey Structure + /// ========================== + /// + /// RSAPrivateKey ::= SEQUENCE { + /// version Version, + /// modulus INTEGER, -- n + /// publicExponent INTEGER, -- e + /// privateExponent INTEGER, -- d + /// prime1 INTEGER, -- p + /// prime2 INTEGER, -- q + /// exponent1 INTEGER, -- d mod (p-1) + /// exponent2 INTEGER, -- d mod (q-1) + /// coefficient INTEGER, -- (inverse of q) mod p + /// otherPrimeInfos OtherPrimeInfos OPTIONAL + /// } + /// ``` + let privateDER = """ + MIICXQIBAAKBgQDBnmbyBvOL8igAE8CpCs9oPj3jWmet68ZP8xJyxsZDAlSp1GeozwLc2DijNuPePciIX8WAQv2zgj8ESuMG6+GMiMd1gdr/mXKnvKUTPwU4VKTSMdytvo2yQYQKKX9Rlyd4t9UboizIfR1occ5FWps9Spw4wrk2YLgkURyL/q910wIDAQABAoGAGJkNLxZe/pqHJmtcAJ3U98NgjW/A2EGp8iJJZ7eFHKJBK0pG2RVjobb+iw3AKU3kGh9AsijQnmufoeX5rblt7/ojgpfVhS7NHsKCi8Nx7U92bNnP0RP4mogpvzGWVknUdv6jW7dX83FKgEywbNKa5CPQk1XinqXL33gNjWdOh/ECQQDjdE4kNdVwKA59ddWRShvJiOMOG8+TjE5HvcZzKQ+UMlBwbknL5tIJE7KnN9ZEfNihVmyrMAzJAfe2PCyZAip/AkEA2esFkG+ScgeVYlGrUqrqUkvzj1j6F8R+8rGvCjq2WnDL8TzO7NoT7qivW/+6E9osX1WwWAtj/84eN7dvLLxCrQJBAN7GomZq58MzKIYPLH9iI3cwAJtn99ZfHKi9oipW9DBFW23TR6pTSDKlvVx0nwNzeEYFPOgqZstVhwZRR6kRawcCQHx/u0QTmjUvg/cR9bFbGFhAMDxbdzaQ+n4paXmMpZXyD3IZbZb/2JdnJBiJd4PUB7nHuOH0UANbfQQT9p42SFkCQQCcdFRTZEZv5TjmcUn0GBUzRmnswiRc1YEg81DSDlvD3dEIVSl6PLkzcNNItrgD5SfC5MxCv6PIUlJVhnkavEjS + """ + + guard let privateDERData = Data(base64Encoded: privateDER) else { + XCTFail("Failed to convert base64 string into data for decoding.") + return + } + + let decoded = try ASN1.Decoder.decode(data: privateDERData) + + // Ensure the first Node is of type SEQUENCE + guard case .sequence(let nodes) = decoded else { + XCTFail("Expected the top level node to be a sequence and it wasn't") + return + } + + // Ensure there are nine (9) Nodes within the top level SEQUENCE + XCTAssertEqual(nodes.count, 9) + + // Deconstruct the parameters + guard case .integer(let version) = nodes[0] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(version, Data(hex: "00")) + + guard case .integer(let n) = nodes[1] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(n, Data(hex: "00c19e66f206f38bf2280013c0a90acf683e3de35a67adebc64ff31272c6c6430254a9d467a8cf02dcd838a336e3de3dc8885fc58042fdb3823f044ae306ebe18c88c77581daff9972a7bca5133f053854a4d231dcadbe8db241840a297f51972778b7d51ba22cc87d1d6871ce455a9b3d4a9c38c2b93660b824511c8bfeaf75d3")) + + guard case .integer(let e) = nodes[2] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(e, Data(hex: "010001")) + + guard case .integer(let d) = nodes[3] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(d, Data(hex: "18990d2f165efe9a87266b5c009dd4f7c3608d6fc0d841a9f2224967b7851ca2412b4a46d91563a1b6fe8b0dc0294de41a1f40b228d09e6b9fa1e5f9adb96deffa238297d5852ecd1ec2828bc371ed4f766cd9cfd113f89a8829bf31965649d476fea35bb757f3714a804cb06cd29ae423d09355e29ea5cbdf780d8d674e87f1")) + + guard case .integer(let p) = nodes[4] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(p, Data(hex: "00e3744e2435d570280e7d75d5914a1bc988e30e1bcf938c4e47bdc673290f943250706e49cbe6d20913b2a737d6447cd8a1566cab300cc901f7b63c2c99022a7f")) + + guard case .integer(let q) = nodes[5] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(q, Data(hex: "00d9eb05906f927207956251ab52aaea524bf38f58fa17c47ef2b1af0a3ab65a70cbf13cceecda13eea8af5bffba13da2c5f55b0580b63ffce1e37b76f2cbc42ad")) + + guard case .integer(let exp1) = nodes[6] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(exp1, Data(hex: "00dec6a2666ae7c33328860f2c7f62237730009b67f7d65f1ca8bda22a56f430455b6dd347aa534832a5bd5c749f03737846053ce82a66cb5587065147a9116b07")) + + guard case .integer(let exp2) = nodes[7] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(exp2, Data(hex: "7c7fbb44139a352f83f711f5b15b185840303c5b773690fa7e2969798ca595f20f72196d96ffd897672418897783d407b9c7b8e1f450035b7d0413f69e364859")) + + guard case .integer(let coefficient) = nodes[8] else { + XCTFail("Expected an integer within our sequence and it wasn't") + return + } + XCTAssertEqual(coefficient, Data(hex: "009c74545364466fe538e67149f41815334669ecc2245cd58120f350d20e5bc3ddd10855297a3cb93370d348b6b803e527c2e4cc42bfa3c852525586791abc48d2")) + + // Ensure re-encoding the data yeilds the exact same starting data + let asn: ASN1.Node = .sequence(nodes: [ + .integer(data: version), + .integer(data: n), + .integer(data: e), + .integer(data: d), + .integer(data: p), + .integer(data: q), + .integer(data: exp1), + .integer(data: exp2), + .integer(data: coefficient) + ]) + + // Encode the ASN1 Nodes + let encodedData = ASN1.Encoder.encode(asn) + + // Ensure the re-encoded data matches the original data exactly + XCTAssertEqual(Data(encodedData), privateDERData) + XCTAssertEqual(encodedData, privateDERData.bytes) + XCTAssertEqual(encodedData.toBase64(), privateDER.replacingOccurrences(of: "\n", with: "")) + } + + /// This tests decodes an Encrypted RSA Private Key from a Base64 PEM Encoded representation + /// + /// This test enforces that + /// 1) The decoding process yeilds the expected format. + /// 2) The re-encoding of the data yeilds the exact same starting data. + func testASN1DecodingEncryptedPEM() throws { + /// ========================== + /// Encrypted PEM Structure + /// ========================== + /// + /// EncryptedPrivateKey ::= SEQUENCE { + /// + /// PEMStructure ::= SEQUENCE { + /// pemObjID OBJECTIDENTIFIER + /// + /// EncryptionAlgorithms ::= SEQUENCE { + /// + /// PBKDFAlgorithms ::= SEQUENCE { + /// pbkdfObjID OBJECTIDENTIFIER + /// PBKDFParams ::= SEQUENCE { + /// salt OCTETSTRING, + /// iterations INTEGER + /// } + /// }, + /// + /// CIPHERAlgorithms ::= SEQUENCE { + /// cipherObjID OBJECTIDENTIFIER, + /// iv OCTETSTRING + /// } + /// } + /// } + /// encryptedData OCTETSTRING + /// } + /// + /// /* + /// * Generated with + /// * openssl genpkey -algorithm RSA + /// * -pkeyopt rsa_keygen_bits:1024 + /// * -pkeyopt rsa_keygen_pubexp:65537 + /// * -out foo.pem + /// * openssl pkcs8 -in foo.pem -topk8 -v2 aes-128-cbc -passout pass:mypassword + /// */ + let encryptedPEMFormat = """ + MIICzzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIP5QK2RfqUl4CAggA + MB0GCWCGSAFlAwQBAgQQj3OyM9gnW2dd/eRHkxjGrgSCAoCpM5GZB0v27cxzZsGc + O4/xqgwB0c/bSJ6QogtYU2KVoc7ZNQ5q9jtzn3I4ONvneOkpm9arzYz0FWnJi2C3 + BPiF0D1NkfvjvMLv56bwiG2A1oBECacyAb2pXYeJY7SdtYKvcbgs3jx65uCm6TF2 + BylteH+n1ewTQN9DLfASp1n81Ajq9lQGaK03SN2MUtcAPp7N9gnxJrlmDGeqlPRs + KpQYRcot+kE6Ew8a5jAr7mAxwpqvr3SM4dMvADZmRQsM4Uc/9+YMUdI52DG87EWc + 0OUB+fnQ8jw4DZgOE9KKM5/QTWc3aEw/dzXr/YJsrv01oLazhqVHnEMG0Nfr0+DP + q+qac1AsCsOb71VxaRlRZcVEkEfAq3gidSPD93qmlDrCnmLYTilcLanXUepda7ez + qhjkHtpwBLN5xRZxOn3oUuLGjk8VRwfmFX+RIMYCyihjdmbEDYpNUVkQVYFGi/F/ + 1hxOyl9yhGdL0hb9pKHH10GGIgoqo4jSTLlb4ennihGMHCjehAjLdx/GKJkOWShy + V9hj8rAuYnRNb+tUW7ChXm1nLq14x9x1tX0ciVVn3ap/NoMkbFTr8M3pJ4bQlpAn + wCT2erYqwQtgSpOJcrFeph9TjIrNRVE7Zlmr7vayJrB/8/oPssVdhf82TXkna4fB + PcmO0YWLa117rfdeNM/Duy0ThSdTl39Qd+4FxqRZiHjbt+l0iSa/nOjTv1TZ/QqF + wqrO6EtcM45fbFJ1Y79o2ptC2D6MB4HKJq9WCt064/8zQCVx3XPbb3X8Z5o/6koy + ePGbz+UtSb9xczvqpRCOiFLh2MG1dUgWuHazjOtUcVWvilKnkjCMzZ9s1qG0sUDj + nPyn + """ + + guard let pemData = Data(base64Encoded: encryptedPEMFormat.replacingOccurrences(of: "\n", with: "")) else { + XCTFail("Failed to convert base64 string to data") + return + } + + let asn = try ASN1.Decoder.decode(data: pemData) + + // Ensure the first node is a Sequence + guard case .sequence(let encryptedPEMWrapper) = asn else { + XCTFail("Expected top level Node to be a SEQUENCE object") + return + } + // Ensure the first Sequence contains exactly 2 nodes (another Sequence and our OctetString of encrypted data) + XCTAssertEqual(encryptedPEMWrapper.count, 2) + + // Ensure the first node within the top level sequence is another sequence + guard case .sequence(let encryptionInfoWrapper) = encryptedPEMWrapper[0] else { + XCTFail("Expected the first Node within our top level SEQUENCE to be a SEQUENCE object and it wasn't") + return + } + // Ensure this sequence contains exactly two nodes (the PEMs ObjectIdentifier and another sequence that houses the encryption algorithms) + XCTAssertEqual(encryptionInfoWrapper.count, 2) + + // Ensure the first Node is the PEM's OBJECTIDENTIFIER Node + guard case .objectIdentifier(let pemObjID) = encryptionInfoWrapper[0] else { + XCTFail("Expected an OBJECTIDENTIFIER and it wasn't") + return + } + + // Ensure the second Node is another SEQUENCE Node + guard case .sequence(let encryptionAlgorithmsWrapper) = encryptionInfoWrapper[1] else { + XCTFail("Expected another SEQUENCE Node and it wasn't") + return + } + // Ensure this sequence contains exactly two nodes (the PEMs ObjectIdentifier and another sequence that houses the encryption algorithms) + XCTAssertEqual(encryptionAlgorithmsWrapper.count, 2) + + // Ensure the first Node is another SEQUENCE Node + guard case .sequence(let pbkdfAlgorithmWrapper) = encryptionAlgorithmsWrapper[0] else { + XCTFail("Expected another SEQUENCE Node and it wasn't") + return + } + // Ensure this sequence contains exactly two nodes (the PBKDF ObjectIdentifier and another sequence that houses the PBKDF params) + XCTAssertEqual(pbkdfAlgorithmWrapper.count, 2) + + guard case .objectIdentifier(let pbkdfObjID) = pbkdfAlgorithmWrapper[0] else { + XCTFail("Expected an OBJECTIDENTIFIER and it wasn't") + return + } + guard case .sequence(let pbkdfParamsWrapper) = pbkdfAlgorithmWrapper[1] else { + XCTFail("Expected an OCTETSTRING and it wasn't") + return + } + // Ensure this sequence contains exactly two nodes (the PBKDF Salt as an OCTETSTRING and the PBKDF Iterations as an INTEGER) + XCTAssertEqual(pbkdfParamsWrapper.count, 2) + guard case .octetString(let pbkdfSalt) = pbkdfParamsWrapper[0] else { + XCTFail("Expected an OCTETSTRING and it wasn't") + return + } + guard case .integer(let pbkdfIterations) = pbkdfParamsWrapper[1] else { + XCTFail("Expected an INTEGER and it wasn't") + return + } + + // Ensure the second Node is another SEQUENCE Node + guard case .sequence(let cipherAlgorithmWrapper) = encryptionAlgorithmsWrapper[1] else { + XCTFail("Expected another SEQUENCE Node and it wasn't") + return + } + // Ensure this sequence contains exactly two nodes (the CIPHER ObjectIdentifier and an OCTETSTRING that contains the CIPHERs InitialVector) + XCTAssertEqual(cipherAlgorithmWrapper.count, 2) + + guard case .objectIdentifier(let cipherObjID) = cipherAlgorithmWrapper[0] else { + XCTFail("Expected an OBJECTIDENTIFIER and it wasn't") + return + } + guard case .octetString(let cipherInitialVector) = cipherAlgorithmWrapper[1] else { + XCTFail("Expected an OCTETSTRING and it wasn't") + return + } + + // Ensure the last (2nd) Node in the top level SEQUENCE Node is an OCTETSTRING that contains the encrypted key data + guard case .octetString(let encryptedData) = encryptedPEMWrapper[1] else { + XCTFail("Expected the last Node in the first SEQUENCE Node to be an OCTETSTRING and it wasn't") + return + } + + // Now lets ensure we can re encode the object and get back the exact same data + let nodes: ASN1.Node = .sequence(nodes: [ + .sequence(nodes: [ + .objectIdentifier(data: pemObjID), + .sequence(nodes: [ + .sequence(nodes: [ + .objectIdentifier(data: pbkdfObjID), + .sequence(nodes: [ + .octetString(data: pbkdfSalt), + .integer(data: pbkdfIterations) + ]) + ]), + .sequence(nodes: [ + .objectIdentifier(data: cipherObjID), + .octetString(data: cipherInitialVector) + ]) + ]) + ]), + .octetString(data: encryptedData) + ]) + + // Encode the ASN1 Nodes + let encodedData = ASN1.Encoder.encode(nodes) + + // Ensure the re-encoded data matches the original data exactly + XCTAssertEqual(Data(encodedData), pemData) + XCTAssertEqual(encodedData, pemData.bytes) + XCTAssertEqual(encodedData.toBase64(), encryptedPEMFormat.replacingOccurrences(of: "\n", with: "")) + } + + static let allTests = [ + ("testASN1NonDestructiveEncoding", testASN1NonDestructiveEncoding), + ("testASN1DecodePrimitiveInteger", testASN1DecodePrimitiveInteger), + ("testASN1DecodeLargeBigInteger", testASN1DecodeLargeBigInteger), + ("testANS1DERDecodingPublicKey", testANS1DERDecodingPublicKey), + ("testANS1DERDecodingPrivateKey", testANS1DERDecodingPrivateKey), + ("testASN1DecodingEncryptedPEM", testASN1DecodingEncryptedPEM) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Access.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Access.swift new file mode 100644 index 00000000..a5745dc7 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Access.swift @@ -0,0 +1,294 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// import without @testable to test public API +import CryptoSwift +import Foundation +import XCTest + +class Access: XCTestCase { + let cipher = try! AES(key: "secret0key000000", iv: "0123456789012345") + let authenticator = HMAC(key: Array(hex: "b1b2b3b3b3b3b3b3b1b2b3b3b3b3b3b3"), variant: .sha1) + + func testChecksum() { + _ = Checksum.crc32([1, 2, 3]) + _ = Checksum.crc32c([1, 2, 3]) + _ = Checksum.crc16([1, 2, 3]) + } + + func testRandomIV() { + _ = AES.randomIV(AES.blockSize) + _ = ChaCha20.randomIV(ChaCha20.blockSize) + } + + func testDigest() { + _ = Digest.md5([1, 2, 3]) + _ = Digest.sha1([1, 2, 3]) + _ = Digest.sha224([1, 2, 3]) + _ = Digest.sha256([1, 2, 3]) + _ = Digest.sha384([1, 2, 3]) + _ = Digest.sha512([1, 2, 3]) + _ = Digest.sha3([1, 2, 3], variant: .sha224) + + _ = SHA1().calculate(for: [0]) + _ = SHA2(variant: .sha224).calculate(for: [0]) + _ = SHA3(variant: .sha256).calculate(for: [0]) + + _ = MD5().calculate(for: [0]) + } + + func testArrayExtension() { + let array = Array(hex: "b1b2b3b3b3b3b3b3b1b2b3b3b3b3b3b3") + _ = array.toHexString() + + _ = array.md5() + _ = array.sha1() + _ = array.sha256() + _ = array.sha384() + _ = array.sha512() + _ = array.sha2(.sha224) + _ = array.sha3(.sha224) + _ = array.crc32() + _ = array.crc32c() + _ = array.crc16() + + do { + _ = try array.encrypt(cipher: self.cipher) + _ = try array.decrypt(cipher: self.cipher) + _ = try array.authenticate(with: self.authenticator) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testCollectionExtension() { + // nothing public + } + + func testStringExtension() { + let string = "foofoobarbar" + _ = string.md5() + _ = string.sha1() + _ = string.sha224() + _ = string.sha256() + _ = string.sha384() + _ = string.sha512() + _ = string.sha3(.sha224) + _ = string.crc16() + _ = string.crc32() + _ = string.crc32c() + + do { + _ = try string.encrypt(cipher: self.cipher) + _ = try string.authenticate(with: self.authenticator) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testStringFoundationExtension() { + let string = "aPf/i9th9iX+vf49eR7PYk2q7S5xmm3jkRLejgzHNJs=" + do { + _ = try string.decryptBase64ToString(cipher: self.cipher) + _ = try string.decryptBase64(cipher: self.cipher) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testIntExtension() { + // nothing public + } + + func testUInt16Extension() { + // nothing public + } + + func testUInt32Extension() { + // nothing public + } + + func testUInt64Extension() { + // nothing public + } + + func testUInt8Extension() { + // nothing public + } + + func testDataExtension() { + let data = Data( [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]) + _ = data.checksum() + _ = data.md5() + _ = data.sha1() + _ = data.sha224() + _ = data.sha256() + _ = data.sha384() + _ = data.sha512() + _ = data.sha3(.sha224) + _ = data.crc16() + _ = data.crc32() + _ = data.crc32c() + + _ = data.bytes + _ = data.toHexString() + + do { + _ = try data.encrypt(cipher: self.cipher) + _ = try data.decrypt(cipher: self.cipher) + _ = try data.authenticate(with: self.authenticator) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testPadding() { + // PKCS7 + _ = Padding.pkcs7.add(to: [1, 2, 3], blockSize: 16) + _ = Padding.pkcs7.remove(from: [1, 2, 3], blockSize: 16) + + // PKCS5 + _ = Padding.pkcs5.add(to: [1, 2, 3], blockSize: 16) + _ = Padding.pkcs5.remove(from: [1, 2, 3], blockSize: 16) + + // NoPadding + _ = Padding.noPadding.add(to: [1, 2, 3], blockSize: 16) + _ = Padding.noPadding.remove(from: [1, 2, 3], blockSize: 16) + + // ZeroPadding + _ = Padding.zeroPadding.add(to: [1, 2, 3], blockSize: 16) + _ = Padding.zeroPadding.remove(from: [1, 2, 3], blockSize: 16) + } + + func testPBKDF() { + do { + _ = PKCS5.PBKDF1.Variant.md5 + _ = try PKCS5.PBKDF1(password: [1, 2, 3, 4, 5, 6, 7], salt: [1, 2, 3, 4, 5, 6, 7, 8]).calculate() + _ = try PKCS5.PBKDF2(password: [1, 2, 3, 4, 5, 6, 7], salt: [1, 2, 3, 4]).calculate() + } catch { + XCTFail(error.localizedDescription) + } + } + + func testAuthenticators() { + do { + _ = try HMAC(key: Array(hex: "b1b2b3b3b3b3b3b3b1b2b3b3b3b3b3b3"), variant: .sha1).authenticate([1, 2, 3]) + _ = try Poly1305(key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2]).authenticate([1, 2, 3]) + } catch { + XCTFail(error.localizedDescription) + } + } + + func testAES() { + do { + let cipher = try AES(key: "secret0key000000", iv: "0123456789012345") + var encryptor = try cipher.makeEncryptor() + _ = try encryptor.update(withBytes: [1, 2, 3]) + _ = try encryptor.finish() + + var decryptor = try cipher.makeDecryptor() + _ = try decryptor.update(withBytes: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) + _ = try decryptor.finish() + + let enc = try cipher.encrypt([1, 2, 3]) + _ = try cipher.decrypt(enc) + + _ = try AES(key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6], blockMode: CBC(iv: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6]), padding: .noPadding) + + _ = AES.Variant.aes128 + _ = AES.blockSize + } catch { + XCTFail("\(error)") + } + } + + func testBlowfish() { + do { + let cipher = try Blowfish(key: "secret0key000000", iv: "01234567") + let enc = try cipher.encrypt([1, 2, 3]) + _ = try cipher.decrypt(enc) + + _ = try Blowfish(key: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6], padding: .noPadding) + + _ = Blowfish.blockSize + } catch { + XCTFail(error.localizedDescription) + } + } + + func testRabbit() { + do { + let rabbit = try Rabbit(key: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + let enc = try rabbit.encrypt([1, 2, 3]) + _ = try rabbit.decrypt(enc) + + XCTAssertThrowsError(try Rabbit(key: "123")) + + _ = Rabbit.blockSize + _ = Rabbit.keySize + _ = Rabbit.ivSize + } catch { + XCTFail(error.localizedDescription) + } + } + + func testChaCha20() { + let key: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + let iv: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + + do { + _ = ChaCha20.blockSize + let chacha20 = try ChaCha20(key: key, iv: iv) + let enc = try chacha20.encrypt([1, 3, 4]) + _ = try chacha20.decrypt(enc) + + XCTAssertThrowsError(try ChaCha20(key: "123", iv: "12345678")) + + _ = chacha20.makeEncryptor() + _ = chacha20.makeDecryptor() + + } catch { + XCTFail(error.localizedDescription) + } + } + + func testUpdatable() { + // TODO: + } + + static let allTests = [ + ("testChecksum", testChecksum), + ("testDigest", testDigest), + ("testArrayExtension", testArrayExtension), + ("testCollectionExtension", testCollectionExtension), + ("testStringExtension", testStringExtension), + ("testStringFoundationExtension", testStringFoundationExtension), + ("testIntExtension", testIntExtension), + ("testUInt16Extension", testUInt16Extension), + ("testUInt32Extension", testUInt32Extension), + ("testUInt64Extension", testUInt64Extension), + ("testUInt8Extension", testUInt8Extension), + ("testDataExtension", testDataExtension), + ("testPadding", testPadding), + ("testPBKDF", testPBKDF), + ("testAuthenticators", testAuthenticators), + ("testAES", testAES), + ("testBlowfish", testBlowfish), + ("testRabbit", testRabbit), + ("testChaCha20", testChaCha20), + ("testUpdatable", testUpdatable), + ("testRandomIV", testRandomIV) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/BlowfishTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/BlowfishTests.swift new file mode 100644 index 00000000..9cd8532d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/BlowfishTests.swift @@ -0,0 +1,223 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Test vector from http://www.schneier.com/code/vectors.txt + +import XCTest +@testable import CryptoSwift + +class BlowfishTests: XCTestCase { + struct TestData { + let key: Array + let input: Array + let output: Array + } + + let tests = [ + TestData(key: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + input: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + output: [0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78]), + TestData(key: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + input: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + output: [0x51, 0x86, 0x6f, 0xd5, 0xb8, 0x5e, 0xcb, 0x8a]), + TestData(key: [0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + input: [0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01], + output: [0x7d, 0x85, 0x6f, 0x9a, 0x61, 0x30, 0x63, 0xf2]), + TestData(key: [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11], + input: [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11], + output: [0x24, 0x66, 0xdd, 0x87, 0x8b, 0x96, 0x3c, 0x9d]), + + TestData(key: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + input: [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11], + output: [0x61, 0xf9, 0xc3, 0x80, 0x22, 0x81, 0xb0, 0x96]), + + TestData(key: [0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11], + input: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + output: [0x7d, 0x0c, 0xc6, 0x30, 0xaf, 0xda, 0x1e, 0xc7]), + + TestData(key: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + input: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + output: [0x4e, 0xf9, 0x97, 0x45, 0x61, 0x98, 0xdd, 0x78]), + + TestData(key: [0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10], + input: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + output: [0x0a, 0xce, 0xab, 0x0f, 0xc6, 0xa0, 0xa2, 0x8d]), + + TestData(key: [0x7c, 0xa1, 0x10, 0x45, 0x4a, 0x1a, 0x6e, 0x57], + input: [0x01, 0xa1, 0xd6, 0xd0, 0x39, 0x77, 0x67, 0x42], + output: [0x59, 0xc6, 0x82, 0x45, 0xeb, 0x05, 0x28, 0x2b]), + + TestData(key: [0x01, 0x31, 0xd9, 0x61, 0x9d, 0xc1, 0x37, 0x6e], + input: [0x5c, 0xd5, 0x4c, 0xa8, 0x3d, 0xef, 0x57, 0xda], + output: [0xb1, 0xb8, 0xcc, 0x0b, 0x25, 0x0f, 0x09, 0xa0]), + + TestData(key: [0x07, 0xa1, 0x13, 0x3e, 0x4a, 0x0b, 0x26, 0x86], + input: [0x02, 0x48, 0xd4, 0x38, 0x06, 0xf6, 0x71, 0x72], + output: [0x17, 0x30, 0xe5, 0x77, 0x8b, 0xea, 0x1d, 0xa4]), + + TestData(key: [0x38, 0x49, 0x67, 0x4c, 0x26, 0x02, 0x31, 0x9e], + input: [0x51, 0x45, 0x4b, 0x58, 0x2d, 0xdf, 0x44, 0x0a], + output: [0xa2, 0x5e, 0x78, 0x56, 0xcf, 0x26, 0x51, 0xeb]), + + TestData(key: [0x04, 0xb9, 0x15, 0xba, 0x43, 0xfe, 0xb5, 0xb6], + input: [0x42, 0xfd, 0x44, 0x30, 0x59, 0x57, 0x7f, 0xa2], + output: [0x35, 0x38, 0x82, 0xb1, 0x09, 0xce, 0x8f, 0x1a]), + + TestData(key: [0x01, 0x13, 0xb9, 0x70, 0xfd, 0x34, 0xf2, 0xce], + input: [0x05, 0x9b, 0x5e, 0x08, 0x51, 0xcf, 0x14, 0x3a], + output: [0x48, 0xf4, 0xd0, 0x88, 0x4c, 0x37, 0x99, 0x18]), + + TestData(key: [0x01, 0x70, 0xf1, 0x75, 0x46, 0x8f, 0xb5, 0xe6], + input: [0x07, 0x56, 0xd8, 0xe0, 0x77, 0x47, 0x61, 0xd2], + output: [0x43, 0x21, 0x93, 0xb7, 0x89, 0x51, 0xfc, 0x98]), + + TestData(key: [0x43, 0x29, 0x7f, 0xad, 0x38, 0xe3, 0x73, 0xfe], + input: [0x76, 0x25, 0x14, 0xb8, 0x29, 0xbf, 0x48, 0x6a], + output: [0x13, 0xf0, 0x41, 0x54, 0xd6, 0x9d, 0x1a, 0xe5]), + + TestData(key: [0x07, 0xa7, 0x13, 0x70, 0x45, 0xda, 0x2a, 0x16], + input: [0x3b, 0xdd, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02], + output: [0x2e, 0xed, 0xda, 0x93, 0xff, 0xd3, 0x9c, 0x79]), + + TestData(key: [0x04, 0x68, 0x91, 0x04, 0xc2, 0xfd, 0x3b, 0x2f], + input: [0x26, 0x95, 0x5f, 0x68, 0x35, 0xaf, 0x60, 0x9a], + output: [0xd8, 0x87, 0xe0, 0x39, 0x3c, 0x2d, 0xa6, 0xe3]), + + TestData(key: [0x37, 0xd0, 0x6b, 0xb5, 0x16, 0xcb, 0x75, 0x46], + input: [0x16, 0x4d, 0x5e, 0x40, 0x4f, 0x27, 0x52, 0x32], + output: [0x5f, 0x99, 0xd0, 0x4f, 0x5b, 0x16, 0x39, 0x69]), + + TestData(key: [0x1f, 0x08, 0x26, 0x0d, 0x1a, 0xc2, 0x46, 0x5e], + input: [0x6b, 0x05, 0x6e, 0x18, 0x75, 0x9f, 0x5c, 0xca], + output: [0x4a, 0x05, 0x7a, 0x3b, 0x24, 0xd3, 0x97, 0x7b]), + + TestData(key: [0x58, 0x40, 0x23, 0x64, 0x1a, 0xba, 0x61, 0x76], + input: [0x00, 0x4b, 0xd6, 0xef, 0x09, 0x17, 0x60, 0x62], + output: [0x45, 0x20, 0x31, 0xc1, 0xe4, 0xfa, 0xda, 0x8e]), + + TestData(key: [0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xb0, 0x07], + input: [0x48, 0x0d, 0x39, 0x00, 0x6e, 0xe7, 0x62, 0xf2], + output: [0x75, 0x55, 0xae, 0x39, 0xf5, 0x9b, 0x87, 0xbd]), + + TestData(key: [0x49, 0x79, 0x3e, 0xbc, 0x79, 0xb3, 0x25, 0x8f], + input: [0x43, 0x75, 0x40, 0xc8, 0x69, 0x8f, 0x3c, 0xfa], + output: [0x53, 0xc5, 0x5f, 0x9c, 0xb4, 0x9f, 0xc0, 0x19]), + + TestData(key: [0x4f, 0xb0, 0x5e, 0x15, 0x15, 0xab, 0x73, 0xa7], + input: [0x07, 0x2d, 0x43, 0xa0, 0x77, 0x07, 0x52, 0x92], + output: [0x7a, 0x8e, 0x7b, 0xfa, 0x93, 0x7e, 0x89, 0xa3]), + + TestData(key: [0x49, 0xe9, 0x5d, 0x6d, 0x4c, 0xa2, 0x29, 0xbf], + input: [0x02, 0xfe, 0x55, 0x77, 0x81, 0x17, 0xf1, 0x2a], + output: [0xcf, 0x9c, 0x5d, 0x7a, 0x49, 0x86, 0xad, 0xb5]), + + TestData(key: [0x01, 0x83, 0x10, 0xdc, 0x40, 0x9b, 0x26, 0xd6], + input: [0x1d, 0x9d, 0x5c, 0x50, 0x18, 0xf7, 0x28, 0xc2], + output: [0xd1, 0xab, 0xb2, 0x90, 0x65, 0x8b, 0xc7, 0x78]), + + TestData(key: [0x1c, 0x58, 0x7f, 0x1c, 0x13, 0x92, 0x4f, 0xef], + input: [0x30, 0x55, 0x32, 0x28, 0x6d, 0x6f, 0x29, 0x5a], + output: [0x55, 0xcb, 0x37, 0x74, 0xd1, 0x3e, 0xf2, 0x01]), + + TestData(key: [0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01], + input: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + output: [0xfa, 0x34, 0xec, 0x48, 0x47, 0xb2, 0x68, 0xb2]), + + TestData(key: [0x1f, 0x1f, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x0e], + input: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + output: [0xa7, 0x90, 0x79, 0x51, 0x08, 0xea, 0x3c, 0xae]), + + TestData(key: [0xe0, 0xfe, 0xe0, 0xfe, 0xf1, 0xfe, 0xf1, 0xfe], + input: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + output: [0xc3, 0x9e, 0x07, 0x2d, 0x9f, 0xac, 0x63, 0x1d]), + + TestData(key: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + input: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + output: [0x01, 0x49, 0x33, 0xe0, 0xcd, 0xaf, 0xf6, 0xe4]), + + TestData(key: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + input: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + output: [0xf2, 0x1e, 0x9a, 0x77, 0xb7, 0x1c, 0x49, 0xbc]), + + TestData(key: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef], + input: [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + output: [0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9a]), + + TestData(key: [0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10], + input: [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + output: [0x6b, 0x5c, 0x5a, 0x9c, 0x5d, 0x9e, 0x0a, 0x5a]) + ] + + func testEncrypt() { + for test in self.tests { + XCTAssertEqual(try Blowfish(key: test.key, blockMode: ECB(), padding: .noPadding).encrypt(test.input), test.output) + } + } + + func testDecrypt() { + for test in self.tests { + XCTAssertEqual(try Blowfish(key: test.key, blockMode: ECB(), padding: .noPadding).decrypt(test.output), test.input) + } + } + + func testCBCZeroPadding() { + let key = Array(hex: "0123456789ABCDEFF0E1D2C3B4A59687") + let iv = Array(hex: "FEDCBA9876543210") + let input = Array(hex: "37363534333231204E6F77206973207468652074696D6520666F722000") + XCTAssertEqual(try Blowfish(key: key, blockMode: CBC(iv: iv), padding: .zeroPadding).encrypt(input), Array(hex: "6B77B4D63006DEE605B156E27403979358DEB9E7154616D959F1652BD5FF92CC")) + } + + func testEncryptDecrypt() { + let key = Array.init(hex: "0123456789ABCDEFF0E1D2C3B4A59687") + let iv = Array.init(hex: "FEDCBA9876543210") + let input = Array.init(hex: "37363534333231204E6F77206973207468652074696D6520666F722000") + + do { + let cipher = try Blowfish(key: key, blockMode: CBC(iv: iv), padding: .pkcs7) + let ciphertext = try cipher.encrypt(input) + let plaintext = try cipher.decrypt(ciphertext) + XCTAssertEqual(plaintext, input) + } catch { + XCTFail(error.localizedDescription) + } + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/415 + func testDecryptCFB415() { + do { + let plaintext = "secret12".bytes + let key = "passwordpassword".bytes + let iv = "12345678".bytes + let encrypted = try Blowfish(key: key, blockMode: CFB(iv: iv), padding: .noPadding).encrypt(plaintext) + let decrypted = try Blowfish(key: key, blockMode: CFB(iv: iv), padding: .noPadding).decrypt(encrypted) + XCTAssertEqual(plaintext, decrypted) + } catch { + XCTFail(error.localizedDescription) + } + } +} + +extension BlowfishTests { + static func allTests() -> [(String, (BlowfishTests) -> () -> Void)] { + let tests = [ + ("testEncrypt", testEncrypt), + ("testDecrypt", testDecrypt), + ("testCBCZeroPadding", testCBCZeroPadding), + ("testEncryptDecrypt", testEncryptDecrypt), + ("testDecryptCFB415", testDecryptCFB415) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Bridging.h b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Bridging.h new file mode 100644 index 00000000..1b7e731e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Bridging.h @@ -0,0 +1,21 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#ifndef CryptoSwift_Bridging_h +#define CryptoSwift_Bridging_h + +#import + +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CBCMacTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CBCMacTests.swift new file mode 100644 index 00000000..2fe5afb9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CBCMacTests.swift @@ -0,0 +1,61 @@ +//// CryptoSwift +// +// Copyright (C) 2014-__YEAR__ Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class CBCMacTests: XCTestCase { + func testMessageLength0() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [] + let expectedMac: Array = [0xf6, 0xc7, 0x1e, 0xed, 0xc3, 0xd9, 0x9b, 0xb1, 0x83, 0xcb, 0x5b, 0x8d, 0x15, 0x68, 0xe6, 0x06] + + let cbcmac = try! CBCMAC(key: key).authenticate(msg) + XCTAssertEqual(cbcmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength16() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expectedMac: Array = [0x05, 0x39, 0xbd, 0xa3, 0x0b, 0x3f, 0x76, 0x34, 0x46, 0x6a, 0x75, 0xd9, 0x84, 0x18, 0xbf, 0x65] + + let cbcmac = try! CBCMAC(key: key).authenticate(msg) + XCTAssertEqual(cbcmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength40() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11] + let expectedMac: Array = [0xa5, 0x26, 0x0f, 0x98, 0xf1, 0xab, 0xf2, 0xb2, 0x75, 0x62, 0xed, 0x5f, 0xc1, 0xfb, 0xeb, 0x8d] + + let cbcmac = try! CBCMAC(key: key).authenticate(msg) + XCTAssertEqual(cbcmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength64() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10] + let expectedMac: Array = [0x5b, 0xf8, 0x2f, 0x1f, 0xe7, 0x48, 0x3b, 0x9a, 0x87, 0x5c, 0xaf, 0x3d, 0xed, 0x3a, 0x01, 0x71] + + let cbcmac = try! CBCMAC(key: key).authenticate(msg) + XCTAssertEqual(cbcmac, expectedMac, "Invalid authentication result") + } + + static let allTests = [ + ("testMessageLength0", testMessageLength0), + ("testMessageLength16", testMessageLength16), + ("testMessageLength40", testMessageLength40), + ("testMessageLength64", testMessageLength64) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CMACTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CMACTests.swift new file mode 100644 index 00000000..062d32ec --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/CMACTests.swift @@ -0,0 +1,103 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// Test vectors from https://tools.ietf.org/html/rfc4493 +// Text vectors from http://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/tv/omac1-tv.txt + +import XCTest +@testable import CryptoSwift + +final class CMACTests: XCTestCase { + func testMessageLength0() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [] + let expectedMac: Array = [0xbb, 0x1d, 0x69, 0x29, 0xe9, 0x59, 0x37, 0x28, 0x7f, 0xa3, 0x7d, 0x12, 0x9b, 0x75, 0x67, 0x46] + + let cmac = try! CMAC(key: key).authenticate(msg) + XCTAssertEqual(cmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength16() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a] + let expectedMac: Array = [0x07, 0x0a, 0x16, 0xb4, 0x6b, 0x4d, 0x41, 0x44, 0xf7, 0x9b, 0xdd, 0x9d, 0xd0, 0x4a, 0x28, 0x7c] + + let cmac = try! CMAC(key: key).authenticate(msg) + XCTAssertEqual(cmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength40() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11] + let expectedMac: Array = [0xdf, 0xa6, 0x67, 0x47, 0xde, 0x9a, 0xe6, 0x30, 0x30, 0xca, 0x32, 0x61, 0x14, 0x97, 0xc8, 0x27] + + let cmac = try! CMAC(key: key).authenticate(msg) + XCTAssertEqual(cmac, expectedMac, "Invalid authentication result") + } + + func testMessageLength64() { + let key: Array = [0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c] + let msg: Array = [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10] + let expectedMac: Array = [0x51, 0xf0, 0xbe, 0xbf, 0x7e, 0x3b, 0x9d, 0x92, 0xfc, 0x49, 0x74, 0x17, 0x79, 0x36, 0x3c, 0xfe] + + let cmac = try! CMAC(key: key).authenticate(msg) + XCTAssertEqual(cmac, expectedMac, "Invalid authentication result") + } + + func testOMACTextVectors() { + // Test vectors: http://www.nuee.nagoya-u.ac.jp/labs/tiwata/omac/tv/omac1-tv.txt + let vectors: [(key: [UInt8], msg: [UInt8], cmac: [UInt8])] = [ + // AES-192 + (key: [0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b], + msg: [], + cmac: [0xd1, 0x7d, 0xdf, 0x46, 0xad, 0xaa, 0xcd, 0xe5, 0x31, 0xca, 0xc4, 0x83, 0xde, 0x7a, 0x93, 0x67]), + (key: [0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a], + cmac: [0x9e, 0x99, 0xa7, 0xbf, 0x31, 0xe7, 0x10, 0x90, 0x06, 0x62, 0xf6, 0x5e, 0x61, 0x7c, 0x51, 0x84]), + (key: [0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11], + cmac: [0x8a, 0x1d, 0xe5, 0xbe, 0x2e, 0xb3, 0x1a, 0xad, 0x08, 0x9a, 0x82, 0xe6, 0xee, 0x90, 0x8b, 0x0e]), + (key: [0x8e, 0x73, 0xb0, 0xf7, 0xda, 0x0e, 0x64, 0x52, 0xc8, 0x10, 0xf3, 0x2b, 0x80, 0x90, 0x79, 0xe5, 0x62, 0xf8, 0xea, 0xd2, 0x52, 0x2c, 0x6b, 0x7b], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10], + cmac: [0xa1, 0xd5, 0xdf, 0x0e, 0xed, 0x79, 0x0f, 0x79, 0x4d, 0x77, 0x58, 0x96, 0x59, 0xf3, 0x9a, 0x11]), + // AES-256 + (key: [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4], + msg: [], + cmac: [0x02, 0x89, 0x62, 0xf6, 0x1b, 0x7b, 0xf8, 0x9e, 0xfc, 0x6b, 0x55, 0x1f, 0x46, 0x67, 0xd9, 0x83]), + (key: [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a], + cmac: [0x28, 0xa7, 0x02, 0x3f, 0x45, 0x2e, 0x8f, 0x82, 0xbd, 0x4b, 0xf2, 0x8d, 0x8c, 0x37, 0xc3, 0x5c]), + (key: [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11], + cmac: [0xaa, 0xf3, 0xd8, 0xf1, 0xde, 0x56, 0x40, 0xc2, 0x32, 0xf5, 0xb1, 0x69, 0xb9, 0xc9, 0x11, 0xe6]), + (key: [0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4], + msg: [0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10], + cmac: [0xe1, 0x99, 0x21, 0x90, 0x54, 0x9f, 0x6e, 0xd5, 0x69, 0x6a, 0x2c, 0x05, 0x6c, 0x31, 0x54, 0x10]), + ] + + for v in vectors { + let cmac = try! CMAC(key: v.key).authenticate(v.msg) + XCTAssertEqual(cmac, v.cmac, "Failed \(v)") + } + } + + static let allTests = [ + ("testMessageLength0", testMessageLength0), + ("testMessageLength16", testMessageLength16), + ("testMessageLength40", testMessageLength40), + ("testMessageLength64", testMessageLength64), + ("testOMACTextVectors", testOMACTextVectors) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Poly1305Tests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Poly1305Tests.swift new file mode 100644 index 00000000..6ca4135a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Poly1305Tests.swift @@ -0,0 +1,84 @@ +// +// ChaCha20Poly1305Tests.swift +// CryptoSwiftTests +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// +// +// https://tools.ietf.org/html/rfc7539#section-2.8.1 + +import XCTest +@testable import CryptoSwift + +class ChaCha20Poly1305Tests: XCTestCase { + static let allTests = [ + ("testCCPoly1", test1), + ("testCCPoly2", test2), + ("testCCPoly3", test3) + ] + + func test1() { + self.executeTestCase("6b65792e6b65792e6b65792e6b65792e6b65792e6b65792e6b65792e6b65792e", + "6e6f6e63652e6e6f6e63652e", + "", + "6d657373616765", + "5d9c0a9fe7d5e5", + "c93aa61fc3cc66a819ac96f6ce365aee") + } + + func test2() { + /* Test vector from section 2.8.2. */ + self.executeTestCase("808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f", + "070000004041424344454647", + "50515253c0c1c2c3c4c5c6c7", + "4c616469657320616e642047656e746c656d656e206f662074686520636c617373206f66202739393a204966204920636f756c64206f6666657220796f75206f6e6c79206f6e652074697020666f7220746865206675747572652c2073756e73637265656e20776f756c642062652069742e", + "d31a8d34648e60db7b86afbc53ef7ec2a4aded51296e08fea9e2b5a736ee62d63dbea45e8ca9671282fafb69da92728b1a71de0a9e060b2905d6a5b67ecd3b3692ddbd7f2d778b8c9803aee328091b58fab324e4fad675945585808b4831d7bc3ff4def08e4b7a9de576d26586cec64b6116", + "1ae10b594f09e26a7e902ecbd0600691") + } + + func test3() { + /* Test vector from A.5. */ + self.executeTestCase("1c9240a5eb55d38af333888604f6b5f0473917c1402b80099dca5cbc207075c0", + "000000000102030405060708", + "f33388860000000000004e91", + "496e7465726e65742d4472616674732061726520647261667420646f63756d656e74732076616c696420666f722061206d6178696d756d206f6620736978206d6f6e74687320616e64206d617920626520757064617465642c207265706c616365642c206f72206f62736f6c65746564206279206f7468657220646f63756d656e747320617420616e792074696d652e20497420697320696e617070726f70726961746520746f2075736520496e7465726e65742d447261667473206173207265666572656e6365206d6174657269616c206f7220746f2063697465207468656d206f74686572207468616e206173202fe2809c776f726b20696e2070726f67726573732e2fe2809d", + "64a0861575861af460f062c79be643bd5e805cfd345cf389f108670ac76c8cb24c6cfc18755d43eea09ee94e382d26b0bdb7b73c321b0100d4f03b7f355894cf332f830e710b97ce98c8a84abd0b948114ad176e008d33bd60f982b1ff37c8559797a06ef4f0ef61c186324e2b3506383606907b6a7c02b0f9f6157b53c867e4b9166c767b804d46a59b5216cde7a4e99040c5a40433225ee282a1b0a06c523eaf4534d7f83fa1155b0047718cbc546a0d072b04b3564eea1b422273f548271a0bb2316053fa76991955ebd63159434ecebb4e466dae5a1073a6727627097a1049e617d91d361094fa68f0ff77987130305beaba2eda04df997b714d6c6f2c29a6ad5cb4022b02709b", + "eead9d67890cbb22392336fea1851f38") + } + + func executeTestCase(_ key: String, _ nonce: String, _ header: String, _ message: String, _ cipher: String, _ tag: String) { + let keyArr = Array(hex: key) + let nonceArr = Array(hex: nonce) + let headerArr = Array(hex: header) + let messageArr = Array(hex: message) + let cipherArr = Array(hex: cipher) + let tagArr = Array(hex: tag) + + do { + let encryptResult = try AEADChaCha20Poly1305.encrypt(messageArr, key: keyArr, iv: nonceArr, authenticationHeader: headerArr) + + XCTAssertEqual(encryptResult.cipherText, cipherArr, "cipher not equal") + XCTAssertEqual(encryptResult.authenticationTag, tagArr, "tag not equal") + } catch { + XCTAssert(false, "Encryption Failed with error: \(error.localizedDescription)") + } + + do { + let decryptResult = try AEADChaCha20Poly1305.decrypt(cipherArr, key: keyArr, iv: nonceArr, authenticationHeader: headerArr, authenticationTag: tagArr) + + XCTAssertEqual(decryptResult.success, true, "decrypt mac check failed") + XCTAssertEqual(decryptResult.plainText, messageArr, "message not equal") + } catch { + XCTAssert(false, "Encryption Failed with error: \(error.localizedDescription)") + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Tests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Tests.swift new file mode 100644 index 00000000..cdad6e60 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20Tests.swift @@ -0,0 +1,122 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class ChaCha20Tests: XCTestCase { + func testChaCha20() { + let keys: [Array] = [ + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f] + ] + + let ivs: [Array] = [ + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01], + [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] + ] + + let expectedHexes = [ + "76B8E0ADA0F13D90405D6AE55386BD28BDD219B8A08DED1AA836EFCC8B770DC7DA41597C5157488D7724E03FB8D84A376A43B8F41518A11CC387B669B2EE6586", + "4540F05A9F1FB296D7736E7B208E3C96EB4FE1834688D2604F450952ED432D41BBE2A0B6EA7566D2A5D1E7E20D42AF2C53D792B1C43FEA817E9AD275AE546963", + "DE9CBA7BF3D69EF5E786DC63973F653A0B49E015ADBFF7134FCB7DF137821031E85A050278A7084527214F73EFC7FA5B5277062EB7A0433E445F41E3", + "EF3FDFD6C61578FBF5CF35BD3DD33B8009631634D21E42AC33960BD138E50D32111E4CAF237EE53CA8AD6426194A88545DDC497A0B466E7D6BBDB0041B2F586B", + "F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB3AB78FAB78C9" + ] + + for idx in 0..(repeating: 0, count: expectedHex.count / 2) + + do { + let encrypted = try message.encrypt(cipher: ChaCha20(key: keys[idx], iv: ivs[idx])) + let decrypted = try encrypted.decrypt(cipher: ChaCha20(key: keys[idx], iv: ivs[idx])) + XCTAssertEqual(message, decrypted, "ChaCha20 decryption failed") + XCTAssertEqual(encrypted, Array(hex: expectedHex)) + } catch CipherError.encrypt { + XCTAssert(false, "Encryption failed") + } catch CipherError.decrypt { + XCTAssert(false, "Decryption failed") + } catch { + XCTAssert(false, "Failed") + } + } + } + + func testCore() { + let key: Array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + var counter: Array = [1, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 74, 0, 0, 0, 0] + let input = Array.init(repeating: 0, count: 129) + let chacha = try! ChaCha20(key: key, iv: Array(key[4..<16])) + let result = chacha.process(bytes: input.slice, counter: &counter, key: key) + XCTAssertEqual(result.toHexString(), "10f1e7e4d13b5915500fdd1fa32071c4c7d1f4c733c068030422aa9ac3d46c4ed2826446079faa0914c2d705d98b02a2b5129cd1de164eb9cbd083e8a2503c4e0a88837739d7bf4ef8ccacb0ea2bb9d69d56c394aa351dfda5bf459f0a2e9fe8e721f89255f9c486bf21679c683d4f9c5cf2fa27865526005b06ca374c86af3bdc") + } + + func testVector1Py() { + let key: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + let iv: Array = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + let expected: Array = [0x76, 0xb8, 0xe0, 0xad, 0xa0, 0xf1, 0x3d, 0x90, 0x40, 0x5d, 0x6a, 0xe5, 0x53, 0x86, 0xbd, 0x28, 0xbd, 0xd2, 0x19, 0xb8, 0xa0, 0x8d, 0xed, 0x1a, 0xa8, 0x36, 0xef, 0xcc, 0x8b, 0x77, 0x0d, 0xc7, 0xda, 0x41, 0x59, 0x7c, 0x51, 0x57, 0x48, 0x8d, 0x77, 0x24, 0xe0, 0x3f, 0xb8, 0xd8, 0x4a, 0x37, 0x6a, 0x43, 0xb8, 0xf4, 0x15, 0x18, 0xa1, 0x1c, 0xc3, 0x87, 0xb6, 0x69, 0xb2, 0xee, 0x65, 0x86] + let message = Array(repeating: 0, count: expected.count) + + do { + let encrypted = try ChaCha20(key: key, iv: iv).encrypt(message) + XCTAssertEqual(encrypted, expected, "Ciphertext failed") + } catch { + XCTFail() + } + } + + func testChaCha20EncryptPartial() { + let key: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] + let expectedHex = "F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB3AB78FAB78C9" + let plaintext: Array = Array(repeating: 0, count: expectedHex.count / 2) + + do { + let cipher = try ChaCha20(key: key, iv: iv) + + var ciphertext = Array() + var encryptor = cipher.makeEncryptor() + ciphertext += try encryptor.update(withBytes: Array(plaintext[0..<8])) + ciphertext += try encryptor.update(withBytes: Array(plaintext[8..<16])) + ciphertext += try encryptor.update(withBytes: Array(plaintext[16..<80])) + ciphertext += try encryptor.update(withBytes: Array(plaintext[80..<256])) + ciphertext += try encryptor.finish() + XCTAssertEqual(Array(hex: expectedHex), ciphertext) + } catch { + XCTFail() + } + } +} + +extension ChaCha20Tests { + static func allTests() -> [(String, (ChaCha20Tests) -> () -> Void)] { + let tests = [ + ("testChaCha20", testChaCha20), + ("testCore", testCore), + ("testVector1Py", testVector1Py), + ("testChaCha20EncryptPartial", testChaCha20EncryptPartial) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20TestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20TestsPerf.swift new file mode 100644 index 00000000..99d9e05d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ChaCha20TestsPerf.swift @@ -0,0 +1,41 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class ChaCha20TestsPerf: XCTestCase { + func testChaCha20Performance() { + let key: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f] + let iv: Array = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] + let message = Array(repeating: 7, count: 1024 * 1024) + measureMetrics([XCTPerformanceMetric.wallClockTime], automaticallyStartMeasuring: true) { () -> Void in + do { + _ = try ChaCha20(key: key, iv: iv).encrypt(message) + } catch { + XCTFail() + } + self.stopMeasuring() + } + } +} + +extension ChaCha20TestsPerf { + static func allTests() -> [(String, (ChaCha20TestsPerf) -> () -> Void)] { + let tests = [("testChaCha20Performance", testChaCha20Performance)] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTests.swift new file mode 100644 index 00000000..3399db1c --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTests.swift @@ -0,0 +1,299 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// http://www.di-mgt.com.au/sha_testvectors.html (http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA_All.pdf) +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class DigestTests: XCTestCase { + func testMD5() { + XCTAssertEqual("123".md5(), "202cb962ac59075b964b07152d234b70", "MD5 calculation failed") + XCTAssertEqual("".md5(), "d41d8cd98f00b204e9800998ecf8427e", "MD5 calculation failed") + XCTAssertEqual("a".md5(), "0cc175b9c0f1b6a831c399e269772661", "MD5 calculation failed") + XCTAssertEqual("abc".md5(), "900150983cd24fb0d6963f7d28e17f72", "MD5 calculation failed") + XCTAssertEqual("message digest".md5(), "f96b697d7cb7938d525a2f31aaf161d0", "MD5 calculation failed") + XCTAssertEqual("abcdefghijklmnopqrstuvwxyz".md5(), "c3fcd3d76192e4007dfb496cca67e13b", "MD5 calculation failed") + XCTAssertEqual("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".md5(), "d174ab98d277d9f5a5611c2c9f419d9f", "MD5 calculation failed") + XCTAssertEqual("12345678901234567890123456789012345678901234567890123456789012345678901234567890".md5(), "57edf4a22be3c955ac49da2e2107b67a", "MD5 calculation failed") + } + + func testSHA1() { + XCTAssertEqual(SHA1().calculate(for: Array(hex: "616263")).toHexString(), "a9993e364706816aba3e25717850c26c9cd0d89d") + XCTAssertEqual(SHA1().calculate(for: Array(hex: "")).toHexString(), "da39a3ee5e6b4b0d3255bfef95601890afd80709") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha1(), "84983e441c3bd26ebaae4aa1f95129e5e54670f1") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha1(), "a49b2446a02c645bf419f995b67091253a04a259") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha1(), Array(hex: "34aa973cd4c4daa4f61eeb2bdbad27316534016f"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + + // https://github.com/krzyzanowskim/CryptoSwift/issues/363 + XCTAssertEqual("1477304791&1XpnGSRhOlZz2etXMeOdfNaHILTjW16U&8mpBBbzwsgs".sha1(), "0809bbf8489c594131c2030a84be364a0851a635", "Failed") + XCTAssertEqual("1477304791&1XpnGSRhOlZz2etXMeOdfNaHILTjW16U&8mpBBbzwsgsa".sha1(), "d345b525ebada7becc8107c54e07fa88644471f5", "Failed") + XCTAssertEqual("1477304791&1XpnGSRhOlZz2etXMeOdfNaHILTjW16U&8mpBBbzwsg".sha1(), "c106aa0a98606294ee35fd2d937e928ebb5339e0", "Failed") + } + + func testSHA2() { + XCTAssertEqual(SHA2(variant: .sha224).calculate(for: Array(hex: "616263")).toHexString(), "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7") + XCTAssertEqual(SHA2(variant: .sha256).calculate(for: Array(hex: "616263")).toHexString(), "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") + XCTAssertEqual(SHA2(variant: .sha384).calculate(for: Array(hex: "616263")).toHexString(), "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7") + XCTAssertEqual(SHA2(variant: .sha512).calculate(for: Array(hex: "616263")).toHexString(), "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f") + + XCTAssertEqual(SHA2(variant: .sha224).calculate(for: Array(hex: "")).toHexString(), "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f") + XCTAssertEqual(SHA2(variant: .sha256).calculate(for: Array(hex: "")).toHexString(), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") + XCTAssertEqual(SHA2(variant: .sha384).calculate(for: Array(hex: "")).toHexString(), "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b") + XCTAssertEqual(SHA2(variant: .sha512).calculate(for: Array(hex: "")).toHexString(), "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e") + + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha224(), "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha256(), "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha384(), "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha512(), "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445") + + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha224(), "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha256(), "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha384(), "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha512(), "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909") + + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha224(), Array(hex: "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha256(), Array(hex: "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha384(), Array(hex: "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha512(), Array(hex: "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + + XCTAssertEqual("Rosetta code".sha256(), "764faf5c61ac315f1497f9dfa542713965b785e5cc2f707d6468d7d1124cdfcf", "SHA256 calculation failed") + XCTAssertEqual("The quick brown fox jumps over the lazy dog.".sha384(), "ed892481d8272ca6df370bf706e4d7bc1b5739fa2177aae6c50e946678718fc67a7af2819a021c2fc34e91bdb63409d7", "SHA384 calculation failed") + } + + func testSHA3() { + XCTAssertEqual(SHA3(variant: .sha224).calculate(for: Array(hex: "616263")).toHexString(), "e642824c3f8cf24ad09234ee7d3c766fc9a3a5168d0c94ad73b46fdf") + XCTAssertEqual(SHA3(variant: .sha256).calculate(for: Array(hex: "616263")).toHexString(), "3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532") + XCTAssertEqual(SHA3(variant: .sha384).calculate(for: Array(hex: "616263")).toHexString(), "ec01498288516fc926459f58e2c6ad8df9b473cb0fc08c2596da7cf0e49be4b298d88cea927ac7f539f1edf228376d25") + XCTAssertEqual(SHA3(variant: .sha512).calculate(for: Array(hex: "616263")).toHexString(), "b751850b1a57168a5693cd924b6b096e08f621827444f70d884f5d0240d2712e10e116e9192af3c91a7ec57647e3934057340b4cf408d5a56592f8274eec53f0") + XCTAssertEqual(SHA3(variant: .keccak224).calculate(for: Array(hex: "616263")).toHexString(), "c30411768506ebe1c2871b1ee2e87d38df342317300a9b97a95ec6a8") + XCTAssertEqual(SHA3(variant: .keccak256).calculate(for: Array(hex: "616263")).toHexString(), "4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45") + XCTAssertEqual(SHA3(variant: .keccak384).calculate(for: Array(hex: "616263")).toHexString(), "f7df1165f033337be098e7d288ad6a2f74409d7a60b49c36642218de161b1f99f8c681e4afaf31a34db29fb763e3c28e") + XCTAssertEqual(SHA3(variant: .keccak512).calculate(for: Array(hex: "616263")).toHexString(), "18587dc2ea106b9a1563e32b3312421ca164c7f1f07bc922a9c83d77cea3a1e5d0c69910739025372dc14ac9642629379540c17e2a65b19d77aa511a9d00bb96") + + XCTAssertEqual(SHA3(variant: .sha224).calculate(for: Array(hex: "")).toHexString(), "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7") + XCTAssertEqual(SHA3(variant: .sha256).calculate(for: Array(hex: "")).toHexString(), "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a") + XCTAssertEqual(SHA3(variant: .sha384).calculate(for: Array(hex: "")).toHexString(), "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004") + XCTAssertEqual(SHA3(variant: .sha512).calculate(for: Array(hex: "")).toHexString(), "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26") + XCTAssertEqual(SHA3(variant: .keccak224).calculate(for: Array(hex: "")).toHexString(), "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd") + XCTAssertEqual(SHA3(variant: .keccak256).calculate(for: Array(hex: "")).toHexString(), "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470") + XCTAssertEqual(SHA3(variant: .keccak384).calculate(for: Array(hex: "")).toHexString(), "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff") + XCTAssertEqual(SHA3(variant: .keccak512).calculate(for: Array(hex: "")).toHexString(), "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e") + + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.sha224), "8a24108b154ada21c9fd5574494479ba5c7e7ab76ef264ead0fcce33") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.sha256), "41c0dba2a9d6240849100376a8235e2c82e1b9998a999e21db32dd97496d3376") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.sha384), "991c665755eb3a4b6bbdfb75c78a492e8c56a22c5c4d7e429bfdbc32b9d4ad5aa04a1f076e62fea19eef51acd0657c22") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.sha512), "04a371e84ecfb5b8b77cb48610fca8182dd457ce6f326a0fd3d7ec2f1e91636dee691fbe0c985302ba1b0d8dc78c086346b533b49c030d99a27daf1139d6e75e") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.keccak224), "e51faa2b4655150b931ee8d700dc202f763ca5f962c529eae55012b6") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.keccak256), "45d3b367a6904e6e8d502ee04999a7c27647f91fa845d456525fd352ae3d7371") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.keccak384), "b41e8896428f1bcbb51e17abd6acc98052a3502e0d5bf7fa1af949b4d3c855e7c4dc2c390326b3f3e74c7b1e2b9a3657") + XCTAssertEqual("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".sha3(.keccak512), "6aa6d3669597df6d5a007b00d09c20795b5c4218234e1698a944757a488ecdc09965435d97ca32c3cfed7201ff30e070cd947f1fc12b9d9214c467d342bcba5d") + + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.sha224), "543e6868e1666c1a643630df77367ae5a62a85070a51c14cbf665cbc") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.sha256), "916f6061fe879741ca6469b43971dfdb28b1a32dc36cb3254e812be27aad1d18") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.sha384), "79407d3b5916b59c3e30b09822974791c313fb9ecc849e406f23592d04f625dc8c709b98b43b3852b337216179aa7fc7") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.sha512), "afebb2ef542e6579c50cad06d2e578f9f8dd6881d7dc824d26360feebf18a4fa73e3261122948efcfd492e74e82e2189ed0fb440d187f382270cb455f21dd185") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.keccak224), "344298994b1b06873eae2ce739c425c47291a2e24189e01b524f88dc") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.keccak256), "f519747ed599024f3882238e5ab43960132572b7345fbeb9a90769dafd21ad67") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.keccak384), "cc063f34685135368b34f7449108f6d10fa727b09d696ec5331771da46a923b6c34dbd1d4f77e595689c1f3800681c28") + XCTAssertEqual("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".sha3(.keccak512), "ac2fb35251825d3aa48468a9948c0a91b8256f6d97d8fa4160faff2dd9dfcc24f3f1db7a983dad13d53439ccac0b37e24037e7b95f80f59f37a2f683c4ba4682") + + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.sha224), Array(hex: "d69335b93325192e516a912e6d19a15cb51c6ed5c15243e7a7fd653c"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.sha256), Array(hex: "5c8875ae474a3634ba4fd55ec85bffd661f32aca75c6d699d0cdcb6c115891c1"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.sha384), Array(hex: "eee9e24d78c1855337983451df97c8ad9eedf256c6334f8e948d252d5e0e76847aa0774ddb90a842190d2c558b4b8340"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.sha512), Array(hex: "3c3a876da14034ab60627c077bb98f7e120a2a5370212dffb3385a18d4f38859ed311d0a9d5141ce9cc5c66ee689b266a8aa18ace8282a0e0db596c90b0a7b87"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.keccak224), Array(hex: "19f9167be2a04c43abd0ed554788101b9c339031acc8e1468531303f"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.keccak256), Array(hex: "fadae6b49f129bbb812be8407b7b2894f34aecf6dbd1f9b0f0c7e9853098fc96"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.keccak384), Array(hex: "0c8324e1ebc182822c5e2a086cac07c2fe00e3bce61d01ba8ad6b71780e2dec5fb89e5ae90cb593e57bc6258fdd94e17"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + XCTAssertEqual(Array(repeating: 0x61, count: 1_000_000).sha3(.keccak512), Array(hex: "5cf53f2e556be5a624425ede23d0e8b2c7814b4ba0e4e09cbbf3c2fac7056f61e048fc341262875ebc58a5183fea651447124370c1ebf4d6c89bc9a7731063bb"), "One million (1,000,000) repetitions of the character 'a' (0x61)") + + // *** Multiple of block size *** + + // keccak block size bytes + XCTAssertEqual(Array(repeating: 0x00, count: 144).sha3(.keccak224), Array(hex: "a50976d8ed54c961a052bfd01a64cd79b11928a9d5b75146a0828888"), "Block size bytes for keccak224") + XCTAssertEqual(Array(repeating: 0x00, count: 136).sha3(.keccak256), Array(hex: "3a5912a7c5faa06ee4fe906253e339467a9ce87d533c65be3c15cb231cdb25f9"), "Block size bytes for keccak256") + XCTAssertEqual(Array(repeating: 0x00, count: 104).sha3(.keccak384), Array(hex: "768e10c2eb9903fba6bf290669bf98bd03ce42e7492da9abb88cbbe2212ed153c857e4e883fb1b03a498391935ec6112"), "Block size bytes for keccak384") + XCTAssertEqual(Array(repeating: 0x00, count: 72).sha3(.keccak512), Array(hex: "bcf38e5b375422155b4d8eb150682a14778b0695d709cec479d013a772497bc8d7050ef2a23d69609d609b15e5001f275c4619270ffbd6e8c06a7a5bf72334b3"), "Block size bytes for keccak512") + + // keccak two times block size bytes + XCTAssertEqual(Array(repeating: 0x00, count: 288).sha3(.keccak224), Array(hex: "846f930bf21e7ec2175a635379adbdbce9ed9de6a34396c4a11aaf3c"), "Two times block size bytes for keccak224") + XCTAssertEqual(Array(repeating: 0x00, count: 272).sha3(.keccak256), Array(hex: "a8005c7a3125b6c3629b4181eca54d18721e41fef639718d205beb00b366ed7d"), "Two times block size bytes for keccak256") + XCTAssertEqual(Array(repeating: 0x00, count: 208).sha3(.keccak384), Array(hex: "db6451e6fb59ca16c9ba896de2967b07ca331e9558e21257cb6b26f126ed480c841d37788907f77ef71f8258218b0203"), "Two times block size bytes for keccak384") + XCTAssertEqual(Array(repeating: 0x00, count: 144).sha3(.keccak512), Array(hex: "04ddaacd88ce54a4acb468b792d5177ace573e9871dc10b33d02be637b674373601ba5f433b67cc6ba8dc3a1707052f1f6bffc55ef1580aca021ead8bc8e1f22"), "Two times block size bytes for keccak512") + + // nist sha3 block size bytes + XCTAssertEqual(Array(repeating: 0x00, count: 144).sha3(.sha224), Array(hex: "f2b8486fceee2c6a11a604ce4efe217da854829c2c2dcc9a23758b4d"), "Block size bytes for sha3 sha224") + XCTAssertEqual(Array(repeating: 0x00, count: 136).sha3(.sha256), Array(hex: "e772c9cf9eb9c991cdfcf125001b454fdbc0a95f188d1b4c844aa032ad6e075e"), "Block size bytes for sha3 sha256") + XCTAssertEqual(Array(repeating: 0x00, count: 104).sha3(.sha384), Array(hex: "aaed6beb61b1f9a9b469d38a27a35edde7f676f4603e67f5424c7588043b869ebbfcfc3ecee2ae6f5ecfaf7f706c49e3"), "Block size bytes for sha3 sha384") + XCTAssertEqual(Array(repeating: 0x00, count: 72).sha3(.sha512), Array(hex: "f8d76fdd8a082a67eaab47b5518ac486cb9a90dcb9f3c9efcfd86d5c8b3f1831601d3c8435f84b9e56da91283d5b98040e6e7b2c8dd9aa5bd4ebdf1823a7cf29"), "Block size bytes for sha3 sha512") + + // nist sha3 two times block size bytes + XCTAssertEqual(Array(repeating: 0x00, count: 288).sha3(.sha224), Array(hex: "920370d3fec17c0ecbc2b5b7cd64f551860fb93384e0dc4fcaf2e1ba"), "Two times block size bytes for sha3 sha224") + XCTAssertEqual(Array(repeating: 0x00, count: 272).sha3(.sha256), Array(hex: "5d86a8cc4aa8f0d98146a747281865a625a19f9580eef32e38905920bc532c5c"), "Two times block size bytes for sha3 sha256") + XCTAssertEqual(Array(repeating: 0x00, count: 208).sha3(.sha384), Array(hex: "e741867850b8753bf7fa714b11c1ca9904d0494adaf5e2db43cca42f39637bd67685279d9dfcc45d56e8c288273904af"), "Two times block size bytes for sha3 sha384") + XCTAssertEqual(Array(repeating: 0x00, count: 144).sha3(.sha512), Array(hex: "07625da1770011d59b0a71a8dec551f0ddf1917e4117fc860bd7e0a0e42f3e012284f86d509e2f22a8682aea5930197fc1f3c353d0141665c9ac2643278c3821"), "Two times block size bytes for sha3 sha512") + // *** End Multiple of block size *** + } + + func testMD5Data() { + let data = [0x31, 0x32, 0x33] as Array // "1", "2", "3" + XCTAssertEqual(Digest.md5(data), [0x20, 0x2C, 0xB9, 0x62, 0xAC, 0x59, 0x07, 0x5B, 0x96, 0x4B, 0x07, 0x15, 0x2D, 0x23, 0x4B, 0x70], "MD5 calculation failed") + } + + func testMD5Updates() { + do { + var hash = MD5() + _ = try hash.update(withBytes: [0x31, 0x32]) + _ = try hash.update(withBytes: [0x33]) + let result = try hash.finish() + XCTAssertEqual(result, [0x20, 0x2C, 0xB9, 0x62, 0xAC, 0x59, 0x07, 0x5B, 0x96, 0x4B, 0x07, 0x15, 0x2D, 0x23, 0x4B, 0x70]) + } catch { + XCTFail() + } + } + + func testSHA1Updatable1() { + do { + var hash = SHA1() + _ = try hash.update(withBytes: [0x31, 0x32]) + _ = try hash.update(withBytes: [0x33]) + XCTAssertEqual(try hash.finish().toHexString(), "40bd001563085fc35165329ea1ff5c5ecbdbbeef", "Failed") + } catch { + XCTFail() + } + } + + func testSHA1Updatable2() { + do { + var hash = SHA1() + _ = try hash.update(withBytes: [0x31, 0x32]) + _ = try hash.update(withBytes: [0x33]) + _ = try hash.update(withBytes: Array(repeating: 0x33, count: 64)) + XCTAssertEqual(try hash.finish().toHexString(), "0e659367eff83a6b868a35b96ac305b270025e86", "Failed") + } catch { + XCTFail() + } + } + + func testCRC32() { + let data: Data = Data(bytes: [49, 50, 51] as Array, count: 3) + XCTAssertEqual(data.crc32(seed: nil).toHexString(), "884863d2", "CRC32 calculation failed") + + XCTAssertEqual("".crc32(seed: nil), "00000000", "CRC32 calculation failed") + } + + func testCRC32C() { + let data: Data = Data(bytes: [0x32, 0, 0, 0] as Array, count: 4) + XCTAssertEqual(data.crc32c(seed: nil).toHexString(), "c941cdf0", "CRC32C calculation failed") + XCTAssertEqual("".crc32c(seed: nil), "00000000", "CRC32 calculation failed") + } + + func testCRC32NotReflected() { + let bytes: Array = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39] + let data: Data = Data(bytes: bytes, count: bytes.count) + XCTAssertEqual(data.crc32(seed: nil, reflect: false).toHexString(), "fc891918", "CRC32 (with reflection) calculation failed") + + XCTAssertEqual("".crc32(seed: nil, reflect: false), "00000000", "CRC32 (with reflection) calculation failed") + } + + func testCRC16() { + let result = Checksum.crc16([49, 50, 51, 52, 53, 54, 55, 56, 57] as Array) + XCTAssert(result == 0xBB3D, "CRC16 failed") + } + + func testChecksum() { + let data: Data = Data(bytes: [49, 50, 51] as Array, count: 3) + XCTAssert(data.checksum() == 0x96, "Invalid checksum") + } + + func testChecksumPerformance() { + let len = 1_000_000 + let a = [UInt8](unsafeUninitializedCapacity: len) { buf, count in + for i in 0.. [(String, (DigestTests) -> () -> Void)] { + let tests = [ + ("testMD5", testMD5), + ("testSHA1", testSHA1), + ("testSHA2", testSHA2), + ("testSHA3", testSHA3), + ("testMD5Data", testMD5Data), + ("testMD5Updates", testMD5Updates), + ("testSHA1Updatable1", testSHA1Updatable1), + ("testSHA1Updatable2", testSHA1Updatable2), + ("testCRC32", testCRC32), + ("testCRC32NotReflected", testCRC32NotReflected), + ("testCRC16", testCRC16), + ("testChecksum", testChecksum), + ("testSHAPartialUpdates", testSHAPartialUpdates) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTestsPerf.swift new file mode 100644 index 00000000..4d039b6d --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/DigestTestsPerf.swift @@ -0,0 +1,63 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +// http://www.di-mgt.com.au/sha_testvectors.html (http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA_All.pdf) +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class DigestTestsPerf: XCTestCase { + func testMD5Performance() { + measureMetrics([XCTPerformanceMetric.wallClockTime], automaticallyStartMeasuring: false) { + let arr = Array(repeating: 200, count: 1024 * 1024) + self.startMeasuring() + _ = Digest.md5(arr) + self.stopMeasuring() + } + } + + func testSHA1Performance() { + measureMetrics([XCTPerformanceMetric.wallClockTime], automaticallyStartMeasuring: false) { + let arr = Array(repeating: 200, count: 1024 * 1024) + self.startMeasuring() + _ = Digest.sha1(arr) + self.stopMeasuring() + } + } + + // Keep it to compare + /* + func testSHA1PerformanceCC() { + measureMetrics([XCTPerformanceMetric.wallClockTime], automaticallyStartMeasuring: false) { + let arr = Array(repeating: 200, count: 1024 * 1024) + self.startMeasuring() + var digest = Array(repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH)) + CC_SHA1(arr, CC_LONG(arr.count), &digest) + self.stopMeasuring() + } + } + */ +} + +extension DigestTestsPerf { + static func allTests() -> [(String, (DigestTestsPerf) -> () -> Void)] { + [ + ("testMD5Performance", testMD5Performance), + ("testSHA1Performance", testSHA1Performance) + ] + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Error+Extension.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Error+Extension.swift new file mode 100644 index 00000000..dbe14216 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Error+Extension.swift @@ -0,0 +1,25 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation + +#if !_runtime(_ObjC) + + extension Error { + var localizedDescription: String { + "\(self)" + } + } +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTest.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTest.swift new file mode 100644 index 00000000..7605756b --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTest.swift @@ -0,0 +1,140 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class ExtensionsTest: XCTestCase { + func testBytes() { + let size = MemoryLayout.size // 32 or 64 bit + + let i: UInt32 = 1024 + var bytes = i.bytes() + XCTAssertTrue(bytes.count == size, "Invalid bytes length = \(bytes.count)") + + // test padding + bytes = i.bytes(totalBytes: 16) + XCTAssertTrue(bytes.count == 16, "Invalid return type \(bytes.count)") + XCTAssertTrue(bytes[14] == 4, "Invalid return type \(bytes.count)") + } + + func testToUInt32Array() { + let chunk: ArraySlice = [0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1] + let result = chunk.toUInt32Array() + + XCTAssert(result.count == 2, "Invalid conversion") + XCTAssertEqual(result[0], 0x5060708) + XCTAssertEqual(result[1], 0x1020304) + } + + func testToUInt32Performance() { + let len = 1_000_000 + let a = [UInt8](unsafeUninitializedCapacity: len) { buf, count in + for i in 0..(hex: "0xb1b1b2b2") + XCTAssertEqual(bytes, [177, 177, 178, 178]) + + let str = "b1b2b3b3b3b3b3b3b1b2b3b3b3b3b3b3" + let array = Array(hex: str) + let hex = array.toHexString() + XCTAssertEqual(str, hex) + } + + func testToHexStringPerformance() { + let len = 100000 + let a = [UInt8](unsafeUninitializedCapacity: len) { buf, count in + for i in 0.. [(String, (ExtensionsTest) -> () -> Void)] { + let tests = [ + ("testBytes", testBytes), + ("testToUInt32Array", testToUInt32Array), + ("testDataInit", testDataInit), + ("testStringEncrypt", testStringEncrypt), + ("testStringDecryptBase64", testStringDecryptBase64), + ("testEmptyStringEncrypt", testEmptyStringEncrypt), + ("testArrayInitHex", testArrayInitHex) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTestPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTestPerf.swift new file mode 100644 index 00000000..0e90d3af --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ExtensionsTestPerf.swift @@ -0,0 +1,39 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class ExtensionsTestPerf: XCTestCase { + func testArrayInitHexPerformance() { + var str = "b1b2b3b3b3b3b3b3b1b2b3b3b3b3b3b3" + for _ in 0...12 { + str += str + } + measure { + _ = Array(hex: str) + } + } +} + +extension ExtensionsTestPerf { + static func allTests() -> [(String, (ExtensionsTestPerf) -> () -> Void)] { + let tests = [ + ("testArrayInitHexPerformance", testArrayInitHexPerformance) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HKDFTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HKDFTests.swift new file mode 100644 index 00000000..6b067a52 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HKDFTests.swift @@ -0,0 +1,97 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class HKDFTests: XCTestCase { + /// All test cases are implemented with regard to RFC 5869 + /// https://www.ietf.org/rfc/rfc5869.txt + + func testHKDF1() { + let password = Array(hex: "0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b") + let salt = Array(hex: "0x000102030405060708090a0b0c") + let info = Array(hex: "0xf0f1f2f3f4f5f6f7f8f9") + let keyLength = 42 + let variant = HMAC.Variant.sha2(.sha256) + let reference = Array(hex: "0x3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865") + + XCTAssertEqual(reference, try HKDF(password: password, salt: salt, info: info, keyLength: keyLength, variant: variant).calculate()) + } + + func testHKDF2() { + let password = Array(hex: "0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f") + let salt = Array(hex: "0x606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf") + let info = Array(hex: "0xb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff") + let keyLength = 82 + let variant = HMAC.Variant.sha2(.sha256) + let reference = Array(hex: "0xb11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87") + + XCTAssertEqual(reference, try HKDF(password: password, salt: salt, info: info, keyLength: keyLength, variant: variant).calculate()) + } + + func testHKDF3() { + let password = Array(hex: "0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b") + let keyLength = 42 + let variant = HMAC.Variant.sha2(.sha256) + let reference = Array(hex: "0x8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8") + + XCTAssertEqual(reference, try HKDF(password: password, keyLength: keyLength, variant: variant).calculate()) + } + + func testHKDF4() { + let password = Array(hex: "0x0b0b0b0b0b0b0b0b0b0b0b") + let salt = Array(hex: "0x000102030405060708090a0b0c") + let info = Array(hex: "0xf0f1f2f3f4f5f6f7f8f9") + let keyLength = 42 + let variant = HMAC.Variant.sha1 + let reference = Array(hex: "0x085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896") + + XCTAssertEqual(reference, try HKDF(password: password, salt: salt, info: info, keyLength: keyLength, variant: variant).calculate()) + } + + func testHKDF5() { + let password = Array(hex: "0x000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f") + let salt = Array(hex: "0x606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf") + let info = Array(hex: "0xb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff") + let keyLength = 82 + let variant = HMAC.Variant.sha1 + let reference = Array(hex: "0x0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4") + + XCTAssertEqual(reference, try HKDF(password: password, salt: salt, info: info, keyLength: keyLength, variant: variant).calculate()) + } + + func testHKDF6() { + let password = Array(hex: "0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b") + let keyLength = 42 + let variant = HMAC.Variant.sha1 + let reference = Array(hex: "0x0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918") + + XCTAssertEqual(reference, try HKDF(password: password, keyLength: keyLength, variant: variant).calculate()) + } + + static func allTests() -> [(String, (HKDFTests) -> () -> Void)] { + let tests = [ + ("Basic test case with SHA-256", testHKDF1), + ("Test with SHA-256 and longer inputs/outputs", testHKDF2), + ("Test with SHA-256 and zero-length salt/info", testHKDF3), + ("Basic test case with SHA-1", testHKDF4), + ("Test with SHA-1 and longer inputs/outputs", testHKDF5), + ("Test with SHA-1 and zero-length salt/info", testHKDF6) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HMACTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HMACTests.swift new file mode 100644 index 00000000..59aab5f6 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/HMACTests.swift @@ -0,0 +1,71 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +final class HMACTests: XCTestCase { + func testMD5() { + let key: Array = [] + let msg: Array = [] + let expectedMac: Array = [0x74, 0xe6, 0xf7, 0x29, 0x8a, 0x9c, 0x2d, 0x16, 0x89, 0x35, 0xf5, 0x8c, 0x00, 0x1b, 0xad, 0x88] + + let hmac = try! HMAC(key: key, variant: .md5).authenticate(msg) + XCTAssertEqual(hmac, expectedMac, "Invalid authentication result") + } + + func testSHA1() { + XCTAssertEqual(try HMAC(key: [], variant: .sha1).authenticate([]), Array(hex: "fbdb1d1b18aa6c08324b7d64b71fb76370690e1d")) + // echo -n "test" | openssl sha1 -hmac 'test' + XCTAssertEqual(try HMAC(key: Array(hex: "74657374"), variant: .sha1).authenticate(Array(hex: "74657374")), Array(hex: "0c94515c15e5095b8a87a50ba0df3bf38ed05fe6")) + // echo -n "test" | openssl sha1 -hmac '0123456789012345678901234567890123456789012345678901234567890123' + XCTAssertEqual(try HMAC(key: Array(hex: "30313233343536373839303132333435363738393031323334353637383930313233343536373839303132333435363738393031323334353637383930313233"), variant: .sha1).authenticate(Array(hex: "74657374")), Array(hex: "23cea58b0c484ed005434938ee70a938d7524e91")) + } + + func testSHA256() { + let key: Array = [] + let msg: Array = [] + let expectedMac: Array = [0xb6, 0x13, 0x67, 0x9a, 0x08, 0x14, 0xd9, 0xec, 0x77, 0x2f, 0x95, 0xd7, 0x78, 0xc3, 0x5f, 0xc5, 0xff, 0x16, 0x97, 0xc4, 0x93, 0x71, 0x56, 0x53, 0xc6, 0xc7, 0x12, 0x14, 0x42, 0x92, 0xc5, 0xad] + + let hmac = try! HMAC(key: key, variant: .sha2(.sha256)).authenticate(msg) + XCTAssertEqual(hmac, expectedMac, "Invalid authentication result") + } + + func testSHA384() { + let key: Array = [] + let msg: Array = [] + let expectedMac: Array = [0x6c, 0x1f, 0x2e, 0xe9, 0x38, 0xfa, 0xd2, 0xe2, 0x4b, 0xd9, 0x12, 0x98, 0x47, 0x43, 0x82, 0xca, 0x21, 0x8c, 0x75, 0xdb, 0x3d, 0x83, 0xe1, 0x14, 0xb3, 0xd4, 0x36, 0x77, 0x76, 0xd1, 0x4d, 0x35, 0x51, 0x28, 0x9e, 0x75, 0xe8, 0x20, 0x9c, 0xd4, 0xb7, 0x92, 0x30, 0x28, 0x40, 0x23, 0x4a, 0xdc] + + let hmac = try! HMAC(key: key, variant: .sha2(.sha384)).authenticate(msg) + XCTAssertEqual(hmac, expectedMac, "Invalid authentication result") + } + + func testSHA512() { + let key: Array = [] + let msg: Array = [] + let expectedMac: Array = [0xb9, 0x36, 0xce, 0xe8, 0x6c, 0x9f, 0x87, 0xaa, 0x5d, 0x3c, 0x6f, 0x2e, 0x84, 0xcb, 0x5a, 0x42, 0x39, 0xa5, 0xfe, 0x50, 0x48, 0x0a, 0x6e, 0xc6, 0x6b, 0x70, 0xab, 0x5b, 0x1f, 0x4a, 0xc6, 0x73, 0x0c, 0x6c, 0x51, 0x54, 0x21, 0xb3, 0x27, 0xec, 0x1d, 0x69, 0x40, 0x2e, 0x53, 0xdf, 0xb4, 0x9a, 0xd7, 0x38, 0x1e, 0xb0, 0x67, 0xb3, 0x38, 0xfd, 0x7b, 0x0c, 0xb2, 0x22, 0x47, 0x22, 0x5d, 0x47] + + let hmac = try! HMAC(key: key, variant: .sha2(.sha512)).authenticate(msg) + XCTAssertEqual(hmac, expectedMac, "Invalid authentication result") + } + + static let allTests = [ + ("testMD5", testMD5), + ("testSHA1", testSHA1), + ("testSHA256", testSHA256), + ("testSHA384", testSHA384), + ("testSHA512", testSHA512) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDF.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDF.swift new file mode 100644 index 00000000..43af56a6 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDF.swift @@ -0,0 +1,74 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class PBKDF: XCTestCase { + func testPBKDF1() { + let password: Array = [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64] + let salt: Array = [0x78, 0x57, 0x8e, 0x5a, 0x5d, 0x63, 0xcb, 0x06] + let value = try! PKCS5.PBKDF1(password: password, salt: salt, iterations: 1000, keyLength: 16).calculate() + XCTAssertEqual(value.toHexString(), "dc19847e05c64d2faf10ebfb4a3d2a20") + } + + func testPBKDF2() { + // P = "password", S = "salt", c = 1, dkLen = 20 + XCTAssertEqual([0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71, 0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06, 0x2f, 0xe0, 0x37, 0xa6], + try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64], salt: [0x73, 0x61, 0x6c, 0x74], iterations: 1, keyLength: 20, variant: .sha1).calculate()) + + // P = "password", S = "salt", c = 2, dkLen = 20 + XCTAssertEqual([0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c, 0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0, 0xd8, 0xde, 0x89, 0x57], + try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64], salt: [0x73, 0x61, 0x6c, 0x74], iterations: 2, keyLength: 20, variant: .sha1).calculate()) + + // P = "password", S = "salt", c = 4096, dkLen = 20 + XCTAssertEqual([0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a, 0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0, 0x65, 0xa4, 0x29, 0xc1], + try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64], salt: [0x73, 0x61, 0x6c, 0x74], iterations: 4096, keyLength: 20, variant: .sha1).calculate()) + + // P = "password", S = "salt", c = 16777216, dkLen = 20 + // Commented because it takes a lot of time with Debug build to finish. + // XCTAssertEqual([0xee, 0xfe, 0x3d, 0x61, 0xcd, 0x4d, 0xa4, 0xe4, 0xe9, 0x94, 0x5b, 0x3d, 0x6b, 0xa2, 0x15, 0x8c, 0x26, 0x34, 0xe9, 0x84], + // try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x77, 0x6F, 0x72, 0x64], salt: [0x73, 0x61, 0x6C, 0x74], iterations: 16777216, keyLength: 20, variant: .sha1).calculate()) + + // P = "passwordPASSWORDpassword", S = "saltSALTsaltSALTsaltSALTsaltSALTsalt", c = 4096, dkLen = 25 + XCTAssertEqual([0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b, 0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a, 0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70, 0x38], + try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64], salt: [0x73, 0x61, 0x6c, 0x74, 0x53, 0x41, 0x4c, 0x54, 0x73, 0x61, 0x6c, 0x74, 0x53, 0x41, 0x4c, 0x54, 0x73, 0x61, 0x6c, 0x74, 0x53, 0x41, 0x4c, 0x54, 0x73, 0x61, 0x6c, 0x74, 0x53, 0x41, 0x4c, 0x54, 0x73, 0x61, 0x6c, 0x74], iterations: 4096, keyLength: 25, variant: .sha1).calculate()) + + // P = "pass\0word", S = "sa\0lt", c = 4096, dkLen = 16 + XCTAssertEqual([0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d, 0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3], + try PKCS5.PBKDF2(password: [0x70, 0x61, 0x73, 0x73, 0x00, 0x77, 0x6f, 0x72, 0x64], salt: [0x73, 0x61, 0x00, 0x6c, 0x74], iterations: 4096, keyLength: 16, variant: .sha1).calculate()) + + // P = "", S = "salt", c = 1, dkLen = 20 + XCTAssertEqual([0xa3, 0x3d, 0xdd, 0xc3, 0x04, 0x78, 0x18, 0x55, 0x15, 0x31, 0x1f, 0x87, 0x52, 0x89, 0x5d, 0x36, 0xea, 0x43, 0x63, 0xa2], + try PKCS5.PBKDF2(password: [], salt: [0x73, 0x61, 0x6c, 0x74], iterations: 1, keyLength: 20, variant: .sha1).calculate()) + } + + func testPBKDF2Length() { + let password: Array = "s33krit".bytes + let salt: Array = "nacl".bytes + let value = try! PKCS5.PBKDF2(password: password, salt: salt, iterations: 2, keyLength: 8, variant: .sha1).calculate() + XCTAssertEqual(value.toHexString(), "a53cf3df485e5cd9") + } + + static func allTests() -> [(String, (PBKDF) -> () -> Void)] { + let tests = [ + ("testPBKDF1", testPBKDF1), + ("testPBKDF2", testPBKDF2), + ("testPBKDF2Length", testPBKDF2Length) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDFPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDFPerf.swift new file mode 100644 index 00000000..6ffa2ba4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PBKDFPerf.swift @@ -0,0 +1,32 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class PBKDFPerf: XCTestCase { + func testPerformance() { + let password: Array = "s33krit".bytes + let salt: Array = "nacl".bytes + measure { + _ = try! PKCS5.PBKDF2(password: password, salt: salt, iterations: 65536, keyLength: 32, variant: .sha1).calculate() + } + } + + static func allTests() -> [(String, (PBKDFPerf) -> () -> Void)] { + let tests = [("testPerformance", testPerformance)] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PaddingTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PaddingTests.swift new file mode 100644 index 00000000..c3bedefe --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/PaddingTests.swift @@ -0,0 +1,243 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +final class PaddingTests: XCTestCase { + func testPKCS7_0() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16] + let padded = PKCS7.Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "PKCS7 failed") + let clean = PKCS7.Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "PKCS7 failed") + } + + func testPKCS7_1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 1] + let padded = PKCS7.Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "PKCS7 failed") + let clean = PKCS7.Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "PKCS7 failed") + } + + func testPKCS7_2() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 2, 2] + let padded = PKCS7.Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "PKCS7 failed") + let clean = PKCS7.Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "PKCS7 failed") + } + + func testZeroPadding1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0] + let padding = ZeroPadding() + XCTAssertEqual(padding.add(to: input, blockSize: 16), expected, "ZeroPadding failed") + XCTAssertEqual(padding.remove(from: padding.add(to: input, blockSize: 16), blockSize: 16), input, "ZeroPadding failed") + } + + func testZeroPadding2() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + let padding = ZeroPadding() + XCTAssertEqual(padding.add(to: input, blockSize: 16), expected, "ZeroPadding failed") + XCTAssertEqual(padding.remove(from: padding.add(to: input, blockSize: 16), blockSize: 16), input, "ZeroPadding failed") + } + + func testISO78164_0() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 0x80] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 0x80, 0x80] + let padded = ISO78164Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "ISO78164 failed") + let clean = ISO78164Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO78164 failed") + } + + func testISO78164_1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 0] + let expected: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 0, 0x80] + [UInt8](repeating: UInt8(0), count: 15) + let padded = ISO78164Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "ISO78164 failed") + let clean = ISO78164Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO78164 failed") + } + + func testISO78164_2() { + let input: Array = [] + let expected: Array = [0x80] + [UInt8](repeating: UInt8(0), count: 15) + let padded = ISO78164Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded, expected, "ISO78164 failed") + let clean = ISO78164Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO78164 failed") + } + + func testISO10126_0() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3] + let padded = ISO10126Padding().add(to: input, blockSize: 16) + XCTAssertTrue(padded.starts(with: input), "ISO10126 failed") + XCTAssertEqual(padded.last, 3, "ISO10126 failed") + XCTAssertEqual(padded.count, 16) + let clean = ISO10126Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO10126 failed") + } + + func testISO10126_1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let padded = ISO10126Padding().add(to: input, blockSize: 16) + XCTAssertTrue(padded.starts(with: input), "ISO10126 failed") + XCTAssertEqual(padded.last, 16, "ISO10126 failed") + XCTAssertEqual(padded.count, 32) + let clean = ISO10126Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO10126 failed") + } + + func testISO10126_2() { + let input: Array = [] + let padded = ISO10126Padding().add(to: input, blockSize: 16) + XCTAssertTrue(padded.starts(with: input), "ISO10126 failed") + XCTAssertEqual(padded.last, 16, "ISO10126 failed") + XCTAssertEqual(padded.count, 16) + let clean = ISO10126Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "ISO10126 failed") + } + + func testEMSAPKCS1v15_1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let padded = EMSAPKCS1v15Padding().add(to: input, blockSize: 32) + XCTAssertEqual(padded.prefix(2), [0, 1], "EMSAPKCS1v15 failed") + XCTAssertTrue(padded.suffix(16) == input, "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMSAPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMSAPKCS1v15 failed") + } + + func testEMSAPKCS1v15_2() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let padded = EMSAPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 1], "EMSAPKCS1v15 failed") + XCTAssertTrue(padded.suffix(16) == input, "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMSAPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMSAPKCS1v15 failed") + } + + func testEMSAPKCS1v15_3() { + let input: Array = [] + let padded = EMSAPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertTrue(padded.starts(with: input), "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.last, 0, "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.count, 16) + let clean = EMSAPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMSAPKCS1v15 failed") + } + + func testEMSAPKCS1v15_4() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3] + let padded = EMSAPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 1], "EMSAPKCS1v15 failed") + XCTAssertTrue(padded.suffix(13) == input, "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMSAPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMSAPKCS1v15 failed") + } + + func testEMSAPKCS1v15_5() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2] + let padded = EMSAPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 1], "EMSAPKCS1v15 failed") + XCTAssertTrue(padded.suffix(12) == input, "EMSAPKCS1v15 failed") + XCTAssertEqual(padded.count, 16) + let clean = EMSAPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMSAPKCS1v15 failed") + } + + func testEMEPKCS1v15_1() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let padded = EMEPKCS1v15Padding().add(to: input, blockSize: 32) + XCTAssertEqual(padded.prefix(2), [0, 2], "EMEPKCS1v15 failed") + XCTAssertTrue(padded.suffix(16) == input, "EMEPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMEPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMEPKCS1v15 failed") + } + + func testEMEPKCS1v15_2() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6] + let padded = EMEPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 2], "EMEPKCS1v15 failed") + XCTAssertTrue(padded.suffix(16) == input, "EMEPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMEPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMEPKCS1v15 failed") + } + + func testEMEPKCS1v15_3() { + let input: Array = [] + let padded = EMEPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertTrue(padded.starts(with: input), "EMEPKCS1v15 failed") + XCTAssertEqual(padded.last, 0, "EMEPKCS1v15 failed") + XCTAssertEqual(padded.count, 16) + let clean = EMEPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMEPKCS1v15 failed") + } + + func testEMEPKCS1v15_4() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3] + let padded = EMEPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 2], "EMEPKCS1v15 failed") + XCTAssertTrue(padded.suffix(13) == input, "EMEPKCS1v15 failed") + XCTAssertEqual(padded.count, 32) + let clean = EMEPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMEPKCS1v15 failed") + } + + func testEMEPKCS1v15_5() { + let input: Array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2] + let padded = EMEPKCS1v15Padding().add(to: input, blockSize: 16) + XCTAssertEqual(padded.prefix(2), [0, 2], "EMEPKCS1v15 failed") + XCTAssertTrue(padded.suffix(12) == input, "EMEPKCS1v15 failed") + XCTAssertEqual(padded.count, 16) + let clean = EMEPKCS1v15Padding().remove(from: padded, blockSize: nil) + XCTAssertEqual(clean, input, "EMEPKCS1v15 failed") + } + + static let allTests = [ + ("testPKCS7_0", testPKCS7_0), + ("testPKCS7_1", testPKCS7_1), + ("testPKCS7_2", testPKCS7_2), + ("testZeroPadding1", testZeroPadding1), + ("testZeroPadding2", testZeroPadding2), + ("testISO78164_0", testISO78164_0), + ("testISO78164_1", testISO78164_1), + ("testISO78164_2", testISO78164_2), + ("testISO10126_0", testISO10126_0), + ("testISO10126_1", testISO10126_1), + ("testISO10126_2", testISO10126_2), + ("testEMSAPKCS1v15_1", testEMSAPKCS1v15_1), + ("testEMSAPKCS1v15_2", testEMSAPKCS1v15_2), + ("testEMSAPKCS1v15_3", testEMSAPKCS1v15_3), + ("testEMSAPKCS1v15_4", testEMSAPKCS1v15_4), + ("testEMSAPKCS1v15_5", testEMSAPKCS1v15_5), + ("testEMEPKCS1v15_1", testEMEPKCS1v15_1), + ("testEMEPKCS1v15_2", testEMEPKCS1v15_2), + ("testEMEPKCS1v15_3", testEMEPKCS1v15_3), + ("testEMEPKCS1v15_4", testEMEPKCS1v15_4), + ("testEMEPKCS1v15_5", testEMEPKCS1v15_5), + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Poly1305Tests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Poly1305Tests.swift new file mode 100644 index 00000000..a96312c1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/Poly1305Tests.swift @@ -0,0 +1,45 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class Poly1305Tests: XCTestCase { + func testPoly1305() { + let key: Array = [0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc] + let msg: Array = [0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1] + let expectedMac: Array = [0xdd, 0xb9, 0xda, 0x7d, 0xdd, 0x5e, 0x52, 0x79, 0x27, 0x30, 0xed, 0x5c, 0xda, 0x5f, 0x90, 0xa4] + + XCTAssertEqual(try Poly1305(key: key).authenticate(msg), expectedMac) + + // extensions + let msgData = Data( msg) + XCTAssertEqual(try msgData.authenticate(with: Poly1305(key: key)), Data( expectedMac), "Invalid authentication result") + } + + // https://github.com/krzyzanowskim/CryptoSwift/issues/183 + func testIssue183() { + let key: Array = [111, 53, 197, 181, 1, 92, 67, 199, 37, 92, 76, 167, 12, 35, 75, 226, 198, 34, 107, 84, 79, 6, 231, 10, 25, 221, 14, 155, 81, 244, 15, 203] + let message: Array = [208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 210, 40, 78, 3, 161, 87, 187, 96, 253, 104, 187, 87, 87, 249, 56, 5, 156, 122, 121, 196, 192, 254, 58, 98, 22, 47, 151, 205, 201, 108, 143, 197, 99, 182, 109, 59, 63, 172, 111, 120, 185, 175, 129, 59, 126, 68, 140, 237, 126, 175, 49, 224, 249, 245, 37, 75, 252, 69, 215, 171, 27, 163, 16, 185, 239, 184, 144, 37, 131, 242, 12, 90, 134, 24, 237, 209, 127, 71, 86, 122, 173, 238, 73, 186, 58, 102, 112, 90, 217, 243, 251, 110, 85, 106, 18, 172, 167, 179, 173, 73, 125, 9, 129, 132, 80, 70, 4, 254, 178, 211, 200, 207, 231, 232, 17, 176, 127, 153, 120, 71, 164, 139, 56, 106, 71, 96, 79, 11, 213, 243, 66, 53, 167, 108, 233, 250, 136, 69, 190, 191, 12, 136, 24, 157, 202, 49, 158, 152, 150, 34, 88, 132, 112, 74, 168, 153, 116, 31, 7, 61, 60, 22, 199, 108, 187, 209, 114, 234, 185, 247, 41, 68, 184, 95, 169, 60, 126, 73, 59, 54, 126, 162, 90, 18, 32, 230, 123, 2, 40, 74, 177, 127, 219, 93, 186, 22, 75, 251, 101, 95, 160, 68, 235, 77, 2, 10, 202, 2, 0, 0, 0, 0, 0, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0] + let expectedMac: Array = [68, 216, 92, 163, 164, 144, 55, 43, 185, 18, 83, 92, 41, 133, 72, 168] + XCTAssertEqual(try message.authenticate(with: Poly1305(key: key)), expectedMac) + } + + static let allTests = [ + ("testPoly1305", testPoly1305), + ("testIssue183", testIssue183) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSASecKeyTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSASecKeyTests.swift new file mode 100644 index 00000000..1bbd0fb4 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSASecKeyTests.swift @@ -0,0 +1,527 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2021 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#if canImport(Security) + + import Security + import XCTest + @testable import CryptoSwift + + final class RSASecKeyTests: XCTestCase { + + // MARK: SecKey <-> RSA Interoperability + + /// From CryptoSwift RSA -> External Representation -> SecKey + /// + /// This test enforces that + /// 1) We can export the raw external representation of a CryptoSwift RSA Public Key + /// 2) And that we can import / create an RSA SecKey from that raw external representation + /// 3) Proves interoperability between Apple's `Security` Framework and `CryptoSwift` + func testRSAExternalRepresentationPublic() throws { + + // Generate a CryptoSwift RSA Key + let rsaCryptoSwift = try RSA(keySize: 1024) + + // Get the key's rawExternalRepresentation + let rsaCryptoSwiftRawRep = try rsaCryptoSwift.publicKeyDER() + + // We should be able to instantiate an RSA SecKey from this data + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeyClass as String: kSecAttrKeyClassPublic, + kSecAttrKeySizeInBits as String: 1024, + kSecAttrIsPermanent as String: false + ] + var error: Unmanaged? + guard let rsaSecKey = SecKeyCreateWithData(Data(rsaCryptoSwiftRawRep) as CFData, attributes as CFDictionary, &error) else { + XCTFail("Error constructing SecKey from raw key data: \(error.debugDescription)") + return + } + + // Get the SecKey's external representation + var externalRepError: Unmanaged? + guard let rsaSecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + // Ensure both the CryptoSwift Ext Rep and the SecKey Ext Rep match + XCTAssertEqual(rsaSecKeyRawRep, Data(rsaCryptoSwiftRawRep)) + XCTAssertEqual(rsaSecKeyRawRep, try rsaCryptoSwift.publicKeyExternalRepresentation()) + } + + /// From CryptoSwift RSA -> External Representation -> SecKey + /// + /// This test enforces that + /// 1) We can export the raw external representation of a CryptoSwift RSA Private Key + /// 2) And that we can import / create an RSA SecKey from that raw external representation + /// 3) Proves interoperability between Apple's `Security` Framework and `CryptoSwift` + func testRSAExternalRepresentationPrivate() throws { + + // Generate a CryptoSwift RSA Key + let rsaCryptoSwift = try RSA(keySize: 1024) + + // Get the key's rawExternalRepresentation + let rsaCryptoSwiftRawRep = try rsaCryptoSwift.privateKeyDER() + + // We should be able to instantiate an RSA SecKey from this data + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, + kSecAttrKeySizeInBits as String: 1024, + kSecAttrIsPermanent as String: false + ] + var error: Unmanaged? + guard let rsaSecKey = SecKeyCreateWithData(Data(rsaCryptoSwiftRawRep) as CFData, attributes as CFDictionary, &error) else { + XCTFail("Error constructing SecKey from raw key data: \(error.debugDescription)") + return + } + + // Get the SecKey's external representation + var externalRepError: Unmanaged? + guard let rsaSecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + // Ensure both the CryptoSwift Ext Rep and the SecKey Ext Rep match + XCTAssertEqual(rsaSecKeyRawRep, Data(rsaCryptoSwiftRawRep)) + XCTAssertEqual(rsaSecKeyRawRep, try rsaCryptoSwift.externalRepresentation()) + } + + /// From SecKey -> External Representation -> CryptoSwift RSA + /// + /// This test enforces that + /// 1) Given the raw external representation of a Public RSA SecKey, we can import that same key into CryptoSwift + /// 2) When we export the raw external representation of the RSA Key we get the exact same data + /// 3) Proves interoperability between Apple's `Security` Framework and `CryptoSwift` + func testSecKeyExternalRepresentationPublic() throws { + // Generate a SecKey RSA Key + let parameters: [CFString: Any] = [ + kSecAttrKeyType: kSecAttrKeyTypeRSA, + kSecAttrKeySizeInBits: 1024 + ] + + var error: Unmanaged? + + // Generate the RSA SecKey + guard let rsaSecKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error) else { + XCTFail("Key Generation Error: \(error.debugDescription)") + return + } + + // Extract the public key from the private RSA SecKey + guard let rsaSecKeyPublic = SecKeyCopyPublicKey(rsaSecKey) else { + XCTFail("Public Key Extraction Error") + return + } + + // Let's grab the external representation of the public key + var externalRepError: Unmanaged? + guard let rsaSecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKeyPublic, &externalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + // Ensure we can import the private RSA key into CryptoSwift + let rsaCryptoSwift = try RSA(rawRepresentation: rsaSecKeyRawRep) + + XCTAssertNil(rsaCryptoSwift.d) + XCTAssertEqual(rsaSecKeyRawRep, try rsaCryptoSwift.externalRepresentation()) + } + + /// From SecKey -> External Representation -> CryptoSwift RSA + /// + /// This test enforces that + /// 1) Given the raw external representation of a Private RSA SecKey, we can import that same key into CryptoSwift + /// 2) When we export the raw external representation of the RSA Key we get the exact same data + /// 3) Proves interoperability between Apple's `Security` Framework and `CryptoSwift` + func testSecKeyExternalRepresentationPrivate() throws { + // Generate a SecKey RSA Key + let parameters: [CFString: Any] = [ + kSecAttrKeyType: kSecAttrKeyTypeRSA, + kSecAttrKeySizeInBits: 1024 + ] + + var error: Unmanaged? + + // Generate the RSA SecKey + guard let rsaSecKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error) else { + XCTFail("Key Generation Error: \(error.debugDescription)") + return + } + + // Let's grab the external representation + var externalRepError: Unmanaged? + guard let rsaSecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + // Ensure we can import the private RSA key into CryptoSwift + let rsaCryptoSwift = try RSA(rawRepresentation: rsaSecKeyRawRep) + + XCTAssertNotNil(rsaCryptoSwift.d) + XCTAssertEqual(rsaSecKeyRawRep, try rsaCryptoSwift.externalRepresentation()) + } + + /// This test generates X RSA keys and tests them between `Security` and `CryptoSwift` for interoperability + /// + /// For each key generated, this test enforces that + /// 1) We can import the raw external representation (generated by the `Security` framework) of the RSA Key into `CryptoSwift` + /// 2) When signing messages using a deterministic variant, we get the same output from both `Security` and `CryptoSwift` + /// 3) We can verify a signature generated from `CryptoSwift` with `Security` and vice versa + /// 4) We can encrypt and decrypt a message generated from `CryptoSwift` with `Security` and vice versa + func testRSASecKeys() throws { + + let tests = 3 + let messageToSign: String = "RSA Keys!" + + for _ in 0..? + + // Generate the RSA SecKey + guard let rsaSecKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error) else { + XCTFail("Key Generation Error: \(error.debugDescription)") + break + } + + // Let's grab the external representation + var externalRepError: Unmanaged? + guard let rsaSecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKey, &externalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + break + } + + // Ensure we can import the private RSA key into CryptoSwift + let rsaCryptoSwift = try RSA(rawRepresentation: rsaSecKeyRawRep) + + // Sign the message with both keys and ensure they're the same (the pkcs1v15 signature variant is deterministic) + let csSignature = try rsaCryptoSwift.sign(messageToSign.bytes, variant: .message_pkcs1v15_SHA256) + + let skSignature = try secKeySign(messageToSign.bytes, variant: .rsaSignatureMessagePKCS1v15SHA256, withKey: rsaSecKey) + + XCTAssertEqual(csSignature, skSignature.bytes, "Signatures don't match!") + + // Ensure we can verify each signature using the opposite library + XCTAssertTrue(try rsaCryptoSwift.verify(signature: skSignature.bytes, for: messageToSign.bytes, variant: .message_pkcs1v15_SHA256)) + XCTAssertTrue(try self.secKeyVerify(csSignature, forBytes: messageToSign.bytes, usingVariant: .rsaSignatureMessagePKCS1v15SHA256, withKey: rsaSecKey)) + + // Encrypt with SecKey + let skEncryption = try secKeyEncrypt(messageToSign.bytes, usingVariant: .rsaEncryptionRaw, withKey: rsaSecKey) + // Decrypt with CryptoSwift Key + XCTAssertEqual(try rsaCryptoSwift.decrypt(skEncryption.bytes, variant: .raw), messageToSign.bytes, "CryptoSwift Decryption of SecKey Encryption Failed") + + // Encrypt with CryptoSwift + let csEncryption = try rsaCryptoSwift.encrypt(messageToSign.bytes, variant: .raw) + // Decrypt with SecKey + XCTAssertEqual(try self.secKeyDecrypt(csEncryption, usingVariant: .rsaEncryptionRaw, withKey: rsaSecKey).bytes, messageToSign.bytes, "SecKey Decryption of CryptoSwift Encryption Failed") + + XCTAssertEqual(csEncryption, skEncryption.bytes, "Encrypted Data Does Not Match") + + // Encrypt with SecKey + let skEncryption2 = try secKeyEncrypt(messageToSign.bytes, usingVariant: .rsaEncryptionPKCS1, withKey: rsaSecKey) + // Decrypt with CryptoSwift Key + XCTAssertEqual(try rsaCryptoSwift.decrypt(skEncryption2.bytes, variant: .pksc1v15), messageToSign.bytes, "CryptoSwift Decryption of SecKey Encryption Failed") + + // Encrypt with CryptoSwift + let csEncryption2 = try rsaCryptoSwift.encrypt(messageToSign.bytes, variant: .pksc1v15) + // Decrypt with SecKey + XCTAssertEqual(try self.secKeyDecrypt(csEncryption2, usingVariant: .rsaEncryptionPKCS1, withKey: rsaSecKey).bytes, messageToSign.bytes, "SecKey Decryption of CryptoSwift Encryption Failed") + } + } + + private func secKeySign(_ bytes: Array, variant: SecKeyAlgorithm, withKey key: SecKey) throws -> Data { + var error: Unmanaged? + + // Sign the data + guard let signature = SecKeyCreateSignature( + key, + variant, + Data(bytes) as CFData, + &error + ) as Data? + else { throw NSError(domain: "Failed to sign bytes: \(bytes)", code: 0) } + + return signature + } + + private func secKeyVerify(_ signature: Array, forBytes bytes: Array, usingVariant variant: SecKeyAlgorithm, withKey key: SecKey) throws -> Bool { + let pubKey = SecKeyCopyPublicKey(key)! + + var error: Unmanaged? + + // Perform the signature verification + let result = SecKeyVerifySignature( + pubKey, + variant, + Data(bytes) as CFData, + Data(signature) as CFData, + &error + ) + + // Throw the error if we encountered one... + if let error = error { throw error.takeRetainedValue() as Error } + + // return the result of the verification + return result + } + + private func secKeyEncrypt(_ bytes: Array, usingVariant variant: SecKeyAlgorithm, withKey key: SecKey) throws -> Data { + let pubKey = SecKeyCopyPublicKey(key)! + + var error: Unmanaged? + + guard let encryptedData = SecKeyCreateEncryptedData(pubKey, variant, Data(bytes) as CFData, &error) else { + throw NSError(domain: "Error Encrypting Data: \(error.debugDescription)", code: 0, userInfo: nil) + } + + // Throw the error if we encountered one... + if let error = error { throw error.takeRetainedValue() as Error } + + // return the result of the encryption + return encryptedData as Data + } + + private func secKeyDecrypt(_ bytes: Array, usingVariant variant: SecKeyAlgorithm, withKey key: SecKey) throws -> Data { + var error: Unmanaged? + guard let decryptedData = SecKeyCreateDecryptedData(key, variant, Data(bytes) as CFData, &error) else { + throw NSError(domain: "Error Decrypting Data: \(error.debugDescription)", code: 0, userInfo: nil) + } + return (decryptedData as Data).drop { $0 == 0x00 } + } + } + + extension RSASecKeyTests { + static func allTests() -> [(String, (RSASecKeyTests) -> () throws -> Void)] { + let tests = [ + ("testRSAExternalRepresentationPublic", testRSAExternalRepresentationPublic), + ("testRSAExternalRepresentationPrivate", testRSAExternalRepresentationPrivate), + ("testSecKeyExternalRepresentationPublic", testSecKeyExternalRepresentationPublic), + ("testSecKeyExternalRepresentationPrivate", testSecKeyExternalRepresentationPrivate), + ("testRSASecKeys", testRSASecKeys) + ] + + return tests + } + } + + // - MARK: Test Fixture Generation Code + extension RSASecKeyTests { + + /// This 'Test' generates an RSA Key and uses that key to sign and encrypt a series of messages that we can test against. + /// + /// It prints a `Fixture` object that can be copy and pasted / used in other tests. + func testCreateTestFixture() throws { + + let keySize = 1024 + let messages = [ + "", + "👋", + "RSA Keys", + "CryptoSwift RSA Keys!", + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐" + ] + print(messages.map { $0.bytes.count }) + + /// Generate a SecKey RSA Key + let parameters: [CFString: Any] = [ + kSecAttrKeyType: kSecAttrKeyTypeRSA, + kSecAttrKeySizeInBits: keySize + ] + + var error: Unmanaged? + + // Generate the RSA SecKey + guard let rsaSecKey = SecKeyCreateRandomKey(parameters as CFDictionary, &error) else { + XCTFail("Key Generation Error: \(error.debugDescription)") + return + } + + // Extract the public key from the private RSA SecKey + guard let rsaSecKeyPublic = SecKeyCopyPublicKey(rsaSecKey) else { + XCTFail("Public Key Extraction Error") + return + } + + /// Let's grab the external representation of the public key + var publicExternalRepError: Unmanaged? + guard let publicRSASecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKeyPublic, &publicExternalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + /// Let's grab the external representation of the private key + var privateExternalRepError: Unmanaged? + guard let privateRSASecKeyRawRep = SecKeyCopyExternalRepresentation(rsaSecKey, &privateExternalRepError) as? Data else { + XCTFail("Failed to copy external representation for RSA SecKey") + return + } + + var template = RSASecKeyTests.FixtureTemplate + template = template.replacingOccurrences(of: "{{KEY_SIZE}}", with: "\(keySize)") + template = template.replacingOccurrences(of: "{{PUBLIC_DER}}", with: "\(publicRSASecKeyRawRep.base64EncodedString())") + template = template.replacingOccurrences(of: "{{PRIVATE_DER}}", with: "\(privateRSASecKeyRawRep.base64EncodedString())") + + var messageEntries: [String] = [] + for message in messages { + var messageTemplate = RSASecKeyTests.MessageTemplate + messageTemplate = messageTemplate.replacingOccurrences(of: "{{PLAINTEXT_MESSAGE}}", with: message) + + let encryptedMessages = try encrypt(data: message.data(using: .utf8)!, with: rsaSecKeyPublic) + messageTemplate = messageTemplate.replacingOccurrences(of: "{{ENCRYPTED_MESSAGES}}", with: encryptedMessages.joined(separator: ",\n\t\t ")) + + let signedMessages = try sign(message: message.data(using: .utf8)!, using: rsaSecKey) + messageTemplate = messageTemplate.replacingOccurrences(of: "{{SIGNED_MESSAGES}}", with: signedMessages.joined(separator: ",\n\t\t ")) + + messageEntries.append(messageTemplate) + } + + template = template.replacingOccurrences(of: "{{MESSAGE_TEMPLATES}}", with: "\(messageEntries.joined(separator: ",\n\t"))") + + print("\n**************************") + print(" Test Fixture Output ") + print("**************************\n") + print(template) + print("\n**************************") + } + + private static let FixtureTemplate = """ + static let RSA_{{KEY_SIZE}} = Fixture( + keySize: {{KEY_SIZE}}, + publicDER: \"\"\" + {{PUBLIC_DER}} + \"\"\", + privateDER: \"\"\" + {{PRIVATE_DER}} + \"\"\", + messages: [ + {{MESSAGE_TEMPLATES}} + ] + ) + """ + + private static let MessageTemplate = """ + "{{PLAINTEXT_MESSAGE}}": ( + encryptedMessage: [ + {{ENCRYPTED_MESSAGES}} + ], + signedMessage: [ + {{SIGNED_MESSAGES}} + ] + ) + """ + + private func initSecKey(rawRepresentation unsafe: Data) throws -> SecKey { + let attributes: [String: Any] = [ + kSecAttrKeyType as String: kSecAttrKeyTypeRSA, + kSecAttrKeyClass as String: kSecAttrKeyClassPrivate, + kSecAttrKeySizeInBits as String: 1024, + kSecAttrIsPermanent as String: false + ] + + var error: Unmanaged? + guard let secKey = SecKeyCreateWithData(unsafe as CFData, attributes as CFDictionary, &error) else { + throw NSError(domain: "Error constructing SecKey from raw key data: \(error.debugDescription)", code: 0, userInfo: nil) + } + + return secKey + } + + // We don't support PSS yet so we skip these variants + private func sign(message: Data, using key: SecKey) throws -> [String] { + let algorithms: [SecKeyAlgorithm] = [ + .rsaSignatureRaw, + //.rsaSignatureDigestPSSSHA1, + //.rsaSignatureDigestPSSSHA224, + //.rsaSignatureDigestPSSSHA256, + //.rsaSignatureDigestPSSSHA384, + //.rsaSignatureDigestPSSSHA512, + .rsaSignatureDigestPKCS1v15Raw, + .rsaSignatureDigestPKCS1v15SHA1, + .rsaSignatureDigestPKCS1v15SHA224, + .rsaSignatureDigestPKCS1v15SHA256, + .rsaSignatureDigestPKCS1v15SHA384, + .rsaSignatureDigestPKCS1v15SHA512, + //.rsaSignatureMessagePSSSHA1, + //.rsaSignatureMessagePSSSHA224, + //.rsaSignatureMessagePSSSHA256, + //.rsaSignatureMessagePSSSHA384, + //.rsaSignatureMessagePSSSHA512, + .rsaSignatureMessagePKCS1v15SHA1, + .rsaSignatureMessagePKCS1v15SHA224, + .rsaSignatureMessagePKCS1v15SHA256, + .rsaSignatureMessagePKCS1v15SHA384, + .rsaSignatureMessagePKCS1v15SHA512, + ] + + var sigs: [String] = [] + + for algo in algorithms { + var error: Unmanaged? + + // Sign the data + guard let signature = SecKeyCreateSignature( + key, + algo, + message as CFData, + &error + ) as Data? + else { + print("\"\(algo.rawValue)\": \"nil\",") + sigs.append("\"\(algo.rawValue)\": \"\"") + continue + } + + // Throw the error if we encountered one + if let error = error { print("\"\(algo.rawValue)\": \"\(error.takeRetainedValue())\","); continue } + + // Append the signature + sigs.append("\"\(algo.rawValue)\": \"\(signature.base64EncodedString())\"") + } + + return sigs + } + + private func encrypt(data: Data, with key: SecKey) throws -> [String] { + let algorithms: [SecKeyAlgorithm] = [ + .rsaEncryptionRaw, + .rsaEncryptionPKCS1 + ] + + var encryptions: [String] = [] + + for algo in algorithms { + var error: Unmanaged? + guard let encryptedData = SecKeyCreateEncryptedData(key, algo, data as CFData, &error) as? Data else { + print("\"\(algo.rawValue)\": \"\(error?.takeRetainedValue().localizedDescription ?? "nil")\",") + encryptions.append("\"\(algo.rawValue)\": \"\"") + continue + } + encryptions.append("\"\(algo.rawValue)\": \"\(encryptedData.base64EncodedString())\"") + } + + return encryptions + } + } + +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSATests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSATests.swift new file mode 100644 index 00000000..4d266f10 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RSATests.swift @@ -0,0 +1,1327 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class RSATests: XCTestCase { + + func testSmallRSA() { + /* + * Example taken from the book "Understanding Cryptography" + * + * p = 3; q = 11; n = pq = 33; e = 3; d = 7 + */ + + let n: Array = [33] + let e: Array = [3] + let d: Array = [7] + let message: Array = [4] + let expected: Array = [31] + + let rsa = RSA(n: n, e: e, d: d) + XCTAssertEqual(rsa.keySize, 6, "key size is not correct") + + let encrypted = try! rsa.encrypt(message, variant: .unsafe) + XCTAssertEqual(encrypted, expected, "small encrypt failed") + + let decrypted = try! rsa.decrypt(encrypted, variant: .unsafe) + XCTAssertEqual(decrypted, message, "small decrypt failed") + } + + func testRSA1() { + /* + * Taken from http://cryptomanager.com/tv.html + * + * 1. 1024-bit RSA bare exponentiation + */ + + let n: Array = [ + 0xF0, 0xC4, 0x2D, 0xB8, 0x48, 0x6F, 0xEB, 0x95, 0x95, 0xD8, 0xC7, 0x8F, 0x90, 0x8D, 0x04, 0xA9, + 0xB6, 0xC8, 0xC7, 0x7A, 0x36, 0x10, 0x5B, 0x1B, 0xF2, 0x75, 0x53, 0x77, 0xA6, 0x89, 0x3D, 0xC4, + 0x38, 0x3C, 0x54, 0xEC, 0x6B, 0x52, 0x62, 0xE5, 0x68, 0x8E, 0x5F, 0x9D, 0x9D, 0xD1, 0x64, 0x97, + 0xD0, 0xE3, 0xEA, 0x83, 0x3D, 0xEE, 0x2C, 0x8E, 0xBC, 0xD1, 0x43, 0x83, 0x89, 0xFC, 0xCA, 0x8F, + 0xED, 0xE7, 0xA8, 0x8A, 0x81, 0x25, 0x7E, 0x8B, 0x27, 0x09, 0xC4, 0x94, 0xD4, 0x2F, 0x72, 0x3D, + 0xEC, 0x2E, 0x0B, 0x5C, 0x09, 0x73, 0x1C, 0x55, 0x0D, 0xCC, 0x9D, 0x7E, 0x75, 0x25, 0x89, 0x89, + 0x1C, 0xBB, 0xC3, 0x02, 0x13, 0x07, 0xDD, 0x91, 0x8E, 0x10, 0x0B, 0x34, 0xC0, 0x14, 0xA5, 0x59, + 0xE0, 0xE1, 0x82, 0xAF, 0xB2, 0x1A, 0x72, 0xB3, 0x07, 0xCC, 0x39, 0x5D, 0xEC, 0x99, 0x57, 0x47 + ] + let e: Array = [ + 0x01, 0x00, 0x01 + ] + let d: Array = [ + 0x24, 0x89, 0x10, 0x8B, 0x0B, 0x6A, 0xF8, 0x6B, 0xED, 0x9E, 0x44, 0xC2, 0x33, 0x64, 0x42, 0xD5, + 0xE2, 0x27, 0xDB, 0xA5, 0x5E, 0xF8, 0xE2, 0x6A, 0x7E, 0x43, 0x71, 0x94, 0x11, 0x90, 0x77, 0xF0, + 0x03, 0xBC, 0x9C, 0x02, 0x78, 0x52, 0xBB, 0x31, 0x26, 0xC9, 0x9C, 0x16, 0xD5, 0xF1, 0x05, 0x7B, + 0xC8, 0x36, 0x1D, 0xCB, 0x26, 0xA5, 0xB2, 0xDB, 0x42, 0x29, 0xDB, 0x3D, 0xE5, 0xBD, 0x97, 0x9B, + 0x2E, 0x59, 0x7D, 0x19, 0x16, 0xD7, 0xBB, 0xC9, 0x27, 0x46, 0xFC, 0x07, 0x59, 0x5C, 0x76, 0xB4, + 0x4B, 0x39, 0xA4, 0x76, 0xA6, 0x5C, 0x86, 0xF0, 0x86, 0xDC, 0x92, 0x83, 0xCA, 0x6D, 0x1E, 0xEF, + 0xC1, 0x49, 0x15, 0x98, 0x2F, 0x9C, 0x4C, 0xED, 0x5F, 0x62, 0xA9, 0xFF, 0x3B, 0xE2, 0x42, 0x18, + 0xA9, 0x93, 0x57, 0xB5, 0xB6, 0x5C, 0x3B, 0x10, 0xAE, 0xB3, 0x67, 0xE9, 0x11, 0xEB, 0x9E, 0x21 + ] + let message: Array = [ + 0x11, 0x22, 0x33, 0x44 + ] + let expected: Array = [ + 0x50, 0x5B, 0x09, 0xBD, 0x5D, 0x0E, 0x66, 0xD7, 0xC8, 0x82, 0x9F, 0x5B, 0x47, 0x3E, 0xD3, 0x4D, + 0xB5, 0xCF, 0xDB, 0xB5, 0xD5, 0x8C, 0xE7, 0x83, 0x29, 0xC8, 0xBF, 0x85, 0x20, 0xE4, 0x86, 0xD3, + 0xC4, 0xCF, 0x9B, 0x70, 0xC6, 0x34, 0x65, 0x94, 0x35, 0x80, 0x80, 0xF4, 0x3F, 0x47, 0xEE, 0x86, + 0x3C, 0xFA, 0xF2, 0xA2, 0xE5, 0xF0, 0x3D, 0x1E, 0x13, 0xD6, 0xFE, 0xC5, 0x7D, 0xFB, 0x1D, 0x55, + 0x22, 0x24, 0xC4, 0x61, 0xDA, 0x41, 0x1C, 0xFE, 0x5D, 0x0B, 0x05, 0xBA, 0x87, 0x7E, 0x3A, 0x42, + 0xF6, 0xDE, 0x4D, 0xA4, 0x6A, 0x96, 0x5C, 0x9B, 0x69, 0x5E, 0xE2, 0xD5, 0x0E, 0x40, 0x08, 0x94, + 0x06, 0x1C, 0xB0, 0xA2, 0x1C, 0xA3, 0xA5, 0x24, 0xB4, 0x07, 0xE9, 0xFF, 0xBA, 0x87, 0xFC, 0x96, + 0x6B, 0x3B, 0xA9, 0x45, 0x90, 0x84, 0x9A, 0xEB, 0x90, 0x8A, 0xAF, 0xF4, 0xC7, 0x19, 0xC2, 0xE4 + ] + + let rsa = RSA(n: n, e: e, d: d) + XCTAssertEqual(rsa.keySize, 1024, "key size is not correct") + + let encrypted = try! rsa.encrypt(message, variant: .unsafe) + XCTAssertEqual(encrypted, expected, "encrypt failed") + + let decrypted = try! rsa.decrypt(encrypted, variant: .unsafe) + XCTAssertEqual(decrypted, message, "decrypt failed") + } + + func testRSA2() { + /* + * Taken from http://cryptomanager.com/tv.html + * + * 2. 2048-bit PKCS V. 1.5 enciphering. + */ + + let n: Array = [ + 0xF7, 0x48, 0xD8, 0xD9, 0x8E, 0xD0, 0x57, 0xCF, 0x39, 0x8C, 0x43, 0x7F, 0xEF, 0xC6, 0x15, 0xD7, + 0x57, 0xD3, 0xF8, 0xEC, 0xE6, 0xF2, 0xC5, 0x80, 0xAE, 0x07, 0x80, 0x76, 0x8F, 0x9E, 0xC8, 0x3A, + 0xAA, 0x08, 0x1F, 0xF0, 0x9E, 0x53, 0x17, 0xED, 0x60, 0x99, 0xC6, 0x3F, 0xD1, 0x5C, 0xFE, 0x11, + 0x17, 0x2F, 0x78, 0x90, 0x8C, 0xD5, 0x8C, 0x03, 0xAE, 0xC9, 0x3A, 0x48, 0x1F, 0xF5, 0x0E, 0x17, + 0x22, 0x04, 0xAF, 0xED, 0xFC, 0x1F, 0x16, 0xAF, 0xDB, 0x99, 0x0A, 0xAB, 0x45, 0xBE, 0x19, 0x0B, + 0xC1, 0x92, 0x59, 0xBD, 0x4A, 0x1B, 0xFC, 0xDF, 0xBE, 0x2A, 0x29, 0x8B, 0x3C, 0x0E, 0x31, 0x8F, + 0x78, 0xA3, 0x39, 0x19, 0x88, 0x23, 0x28, 0xDA, 0xCA, 0xC8, 0x5C, 0xB3, 0x5A, 0x0D, 0xE5, 0x37, + 0xB1, 0x63, 0x76, 0x97, 0x52, 0x17, 0xE5, 0xA5, 0xEA, 0xAF, 0x98, 0x26, 0x6B, 0x58, 0x8C, 0x2D, + 0xBA, 0xFD, 0x0B, 0xE3, 0x71, 0xC3, 0x49, 0x89, 0xCB, 0x36, 0xE6, 0x23, 0xD7, 0x5E, 0xFF, 0xED, + 0xBE, 0x4A, 0x95, 0x1A, 0x68, 0x40, 0x98, 0x2B, 0xC2, 0x79, 0xB3, 0x0F, 0xCD, 0x41, 0xDA, 0xC8, + 0x7C, 0x00, 0x74, 0xD4, 0x62, 0xF1, 0x01, 0x29, 0x00, 0xB8, 0x97, 0x3B, 0x46, 0xAD, 0xC7, 0xEA, + 0xC0, 0x17, 0x70, 0xDF, 0xC6, 0x32, 0xEA, 0x96, 0x7F, 0x94, 0x71, 0xE9, 0x78, 0x98, 0x31, 0xF3, + 0xA4, 0x10, 0x73, 0x0F, 0xF9, 0x14, 0x34, 0x8B, 0xE1, 0x11, 0x86, 0x3C, 0x13, 0x37, 0x63, 0x01, + 0x07, 0x97, 0x56, 0xA1, 0x47, 0xD8, 0x01, 0x03, 0xCE, 0x9F, 0xA6, 0x88, 0xA3, 0x38, 0xE2, 0x2B, + 0x2D, 0x91, 0x6C, 0xAD, 0x42, 0xD6, 0x73, 0xC9, 0xD0, 0x0F, 0x08, 0x21, 0x4D, 0xE5, 0x44, 0xF5, + 0xDE, 0x81, 0x2A, 0x9A, 0x94, 0x91, 0x89, 0x07, 0x8B, 0x2B, 0xDA, 0x14, 0xB2, 0x8C, 0xA6, 0x2F + ] + let e: Array = [ + 0x01, 0x00, 0x01 + ] + let d: Array = [ + 0x1C, 0xBC, 0x9A, 0x76, 0xAD, 0xE2, 0x08, 0x52, 0x4C, 0x9D, 0xC0, 0x3A, 0x5D, 0xE2, 0xE7, 0x26, + 0xDF, 0x4E, 0x02, 0xDF, 0x84, 0xF7, 0x31, 0x7C, 0x82, 0xBC, 0xDC, 0x70, 0xEA, 0xBF, 0xC9, 0x05, + 0x08, 0x3D, 0x69, 0x78, 0xCC, 0xED, 0x5B, 0x1A, 0x7A, 0xDF, 0x63, 0xEA, 0x86, 0xAA, 0x07, 0xDC, + 0x74, 0x95, 0x4F, 0xAD, 0x7C, 0xB0, 0x54, 0x55, 0x19, 0x3A, 0xC9, 0x4B, 0x18, 0x6B, 0xA1, 0xF7, + 0x8E, 0x3C, 0x7D, 0x35, 0x6A, 0xD7, 0x32, 0x0B, 0xBD, 0xB9, 0x4B, 0x44, 0x1C, 0x16, 0xBB, 0x52, + 0x62, 0x6C, 0x5F, 0x81, 0x5F, 0xDB, 0x60, 0xC7, 0x9F, 0x91, 0xC6, 0xC2, 0x27, 0x78, 0x7E, 0xC9, + 0xED, 0x7B, 0x0A, 0x67, 0xAD, 0x2A, 0x68, 0xD5, 0x04, 0x3B, 0xC4, 0x8A, 0x13, 0x2D, 0x0A, 0x36, + 0x2E, 0xA7, 0x20, 0x60, 0xF5, 0x69, 0x51, 0x86, 0xB6, 0x7F, 0x31, 0x6F, 0x45, 0x8A, 0x44, 0xBF, + 0xD1, 0x40, 0x3D, 0x93, 0xA9, 0xB9, 0x12, 0xCB, 0xB5, 0x98, 0x15, 0x91, 0x6A, 0x14, 0xA2, 0xBA, + 0xD4, 0xF9, 0xA1, 0xED, 0x57, 0x8E, 0xBD, 0x2B, 0x5D, 0x47, 0x2F, 0x62, 0x3B, 0x4B, 0xB5, 0xF9, + 0xB8, 0x0B, 0x93, 0x57, 0x2B, 0xEA, 0x61, 0xBD, 0x10, 0x68, 0x09, 0x4E, 0x41, 0xE8, 0x39, 0x0E, + 0x2E, 0x28, 0xA3, 0x51, 0x43, 0x3E, 0xDD, 0x1A, 0x09, 0x9A, 0x8C, 0x6E, 0x68, 0x92, 0x60, 0x4A, + 0xEF, 0x16, 0x3A, 0x43, 0x9B, 0x1C, 0xAE, 0x6A, 0x09, 0x5E, 0x68, 0x94, 0x3C, 0xA6, 0x7B, 0x18, + 0xC8, 0xDC, 0x7F, 0x98, 0xCC, 0x5F, 0x8E, 0xFA, 0x22, 0xBB, 0xC8, 0x7D, 0x2E, 0x73, 0x57, 0x83, + 0xD2, 0xBA, 0xA3, 0x8F, 0x4C, 0x17, 0xD5, 0xED, 0x0C, 0x58, 0x36, 0x6D, 0xCE, 0xF5, 0xE8, 0x52, + 0xDD, 0x3D, 0x6E, 0x0F, 0x63, 0x72, 0x95, 0x43, 0xE2, 0x63, 0x8B, 0x29, 0x14, 0xD7, 0x2A, 0x01 + ] + let message: Array = [ + 0x11, 0x22, 0x33, 0x44 + ] + let expected: Array = [ + 0xEE, 0x69, 0x09, 0x9A, 0xFD, 0x9F, 0x99, 0xD6, 0x06, 0x5D, 0x65, 0xE1, 0x5F, 0x90, 0xB9, 0x23, + 0x7C, 0x16, 0x98, 0x7D, 0x48, 0x72, 0xE2, 0xB9, 0x94, 0xED, 0x2B, 0x9E, 0x56, 0x85, 0xF9, 0xBA, + 0x48, 0x9A, 0xB9, 0x36, 0xCC, 0x1E, 0x3D, 0xFD, 0x15, 0xB3, 0x5F, 0xEE, 0x21, 0x53, 0x6F, 0x8C, + 0x22, 0x20, 0xAE, 0x43, 0x21, 0x7D, 0x91, 0xD8, 0x1C, 0x9E, 0xD0, 0x1D, 0xE5, 0xBA, 0xEE, 0xF4, + 0xEF, 0xC7, 0x21, 0xD7, 0x0D, 0x67, 0xB5, 0x16, 0x6E, 0x43, 0xD8, 0x27, 0x24, 0xF3, 0x9B, 0xF0, + 0xBD, 0x19, 0x7C, 0x31, 0xE7, 0x48, 0x51, 0x8D, 0xEE, 0x63, 0xEC, 0x10, 0x98, 0x7A, 0x08, 0x39, + 0x0B, 0x15, 0xCC, 0x41, 0x57, 0x67, 0x7C, 0x54, 0x22, 0x6A, 0x8B, 0x04, 0xB4, 0x76, 0x84, 0xAE, + 0xDD, 0x02, 0xB4, 0x8C, 0x8E, 0xD4, 0x8A, 0x44, 0xBD, 0x13, 0x53, 0x97, 0xAC, 0x28, 0x69, 0x76, + 0x9B, 0x68, 0xC7, 0xD3, 0xBF, 0xAC, 0xDB, 0x72, 0xAF, 0xCD, 0x74, 0x42, 0xC2, 0x25, 0x17, 0xE0, + 0x44, 0x99, 0x6C, 0xB6, 0x8E, 0x0A, 0x31, 0x1D, 0xF5, 0xD6, 0xD2, 0xD2, 0x86, 0x37, 0x25, 0x56, + 0xF0, 0x19, 0x31, 0x66, 0xCC, 0x36, 0x4E, 0x65, 0x4E, 0xF4, 0x05, 0xDD, 0x22, 0xFB, 0xE5, 0x84, + 0xDB, 0xF6, 0x0F, 0x05, 0x52, 0x96, 0x06, 0x68, 0xFB, 0x69, 0x52, 0x2C, 0x1B, 0x52, 0x64, 0xF1, + 0x94, 0xFA, 0xC9, 0xF3, 0x56, 0x22, 0xE9, 0x82, 0x27, 0x63, 0x8F, 0xF2, 0x8B, 0x91, 0x0D, 0x8C, + 0xC9, 0x0E, 0x50, 0x11, 0x02, 0x12, 0x12, 0xC9, 0x6C, 0x64, 0xC8, 0x58, 0x20, 0x87, 0x7A, 0x7D, + 0x15, 0x59, 0x23, 0x5E, 0x99, 0xC3, 0x2A, 0xBE, 0xF3, 0x3D, 0x95, 0xE2, 0x8E, 0x18, 0xCC, 0xA3, + 0x44, 0x2E, 0x6E, 0x3A, 0x43, 0x2F, 0xFF, 0xEA, 0x10, 0x10, 0x4A, 0x8E, 0xEE, 0x94, 0xC3, 0x62 + ] + + let rsa = RSA(n: n, e: e, d: d) + XCTAssertEqual(rsa.keySize, 2048, "key size is not correct") + + let encrypted = try! rsa.encrypt(message, variant: .unsafe) + XCTAssertEqual(encrypted, expected, "encrypt failed") + + let decrypted = try! rsa.decrypt(encrypted, variant: .unsafe) + XCTAssertEqual(decrypted, message, "decrypt failed") + } + + func testGenerateKeyPair() { + /* + * To test key generation and its validity + */ + let message: Array = [ + 0x11, 0x22, 0x33, 0x44 + ] + + do { + let rsa = try RSA(keySize: 2048) + // Sometimes the modulus size is 2047 bits, but it's okay (with two 1024 bits primes) + //XCTAssertEqual(rsa.keySize, 2048, "key size is not correct") + + let decrypted = try rsa.decrypt(rsa.encrypt(message, variant: .unsafe), variant: .unsafe) + XCTAssertEqual(decrypted, message, "encrypt+decrypt failed") + } catch { + XCTFail("\(error)") + } + } + + /// This test walks through the PKCS1 Encryption scheme manually + /// + /// This test enforces that + /// 1) We can decrypt a message appropriately using the PKCS1v15 Encryption Scheme + /// - Note: This signature scheme is non-deterministic so we can only test that decryption results in the expected message. + func testRSAPKCS1_v15EncryptionManual() throws { + let fixture = TestFixtures.RSA_1024 + + guard let privateDERData = Data(base64Encoded: fixture.privateDER) else { + XCTFail("Invalid Base64String Public DER") + return + } + + // Import RSA Key + let rsa = try RSA(rawRepresentation: privateDERData) + + let expectedMessage = "RSA Keys" + let messageToDecrypt = Data(base64Encoded: fixture.messages[expectedMessage]!.encryptedMessage["algid:encrypt:RSA:PKCS1"]!)!.bytes + + // Decrypt the data + let decrypted = BigUInteger(Data(messageToDecrypt)).power(rsa.d!, modulus: rsa.n).serialize().bytes + + let unpadded = Padding.eme_pkcs1v15.remove(from: [0x00] + decrypted, blockSize: rsa.keySize) + + XCTAssertEqual(expectedMessage, String(data: Data(unpadded), encoding: .utf8), "Failed to decrypt the message") + } + + /// This test focuses on ensuring that the encryption & decryption round trip works as expected. + /// + /// This test enforces that + /// 1) We can encrypt and then decrypt a random integer + /// 2) We recover the original integer after decryption + func testEncryptDecryptRoundTripRandomIntegers() { + do { + let rsa = try RSA(keySize: 1024) + + for _ in 0..<5 { + let message = BigUInteger.randomInteger(withMaximumWidth: 256).serialize().bytes + + let decrypted = try rsa.decrypt(rsa.encrypt(message, variant: .pksc1v15), variant: .pksc1v15) + XCTAssertEqual(decrypted, message, "encrypt+decrypt failed") + } + } catch { + XCTFail("\(error)") + } + } + + /// This test focuses on ensuring that the signature & signature verification works as expected. + /// + /// This test enforces that + /// 1) We can sign and then verify a random integer + /// 2) if we modify the signature or the message in any way, the verify function returns false or throws an error. + func testSignatureVerificationRandomIntegers() { + do { + let rsa = try RSA(keySize: 1024) + + for _ in 0..<5 { + let message = BigUInteger.randomInteger(withMaximumWidth: 256).serialize().bytes + + let signature = try rsa.sign(message, variant: .message_pkcs1v15_SHA256) + XCTAssertTrue(try rsa.verify(signature: signature, for: message, variant: .message_pkcs1v15_SHA256), "Failed to Verify Signature for `\(message)`") + XCTAssertFalse(try rsa.verify(signature: signature, for: message.shuffled())) + XCTAssertFalse(try rsa.verify(signature: signature.shuffled(), for: message)) + XCTAssertThrowsError(try rsa.verify(signature: signature.dropLast(), for: message)) + } + } catch { + XCTFail("\(error)") + } + } + + /// This test walks through the PKCS1 Signature scheme manually + /// + /// This test enforces that + /// 1) We can prepare and sign a message appropriately using the PKCS1v15 Signature Scheme + /// - Note: This signature scheme is deterministic so we can test against a known static value + func testRSAPKCS1_v15SignatureManual() throws { + let fixture = TestFixtures.RSA_1024 + + guard let privateDERData = Data(base64Encoded: fixture.privateDER) else { + XCTFail("Invalid Base64String Public DER") + return + } + + // Import RSA Key + let rsa = try RSA(rawRepresentation: privateDERData) + + let message = "CryptoSwift RSA Keys!" + + /// 1. Apply the hash function to the message M to produce a hash + let hashedMessage = SHA2(variant: .sha256).calculate(for: message.bytes) + + /// 2. Encode the algorithm ID for the hash function and the hash value into an ASN.1 value of type DigestInfo + /// PKCS#1_15 DER Structure (OID == sha256WithRSAEncryption) + let asn: ASN1.Node = .sequence(nodes: [ + .sequence(nodes: [ + .objectIdentifier(data: Data(Array(arrayLiteral: 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01))), + .null + ]), + .octetString(data: Data(hashedMessage)) + ]) + + let t = ASN1.Encoder.encode(asn) + + /// 3. If emLen < tLen + 11, output "intended encoded message length too short" and stop + if rsa.keySizeBytes < t.count + 11 { throw RSA.Error.invalidMessageLengthForSigning } + + /// 4. Generate an octet string PS consisting of emLen - tLen - 3 + /// octets with hexadecimal value 0xff. The length of PS will be + /// at least 8 octets. + /// 5. Concatenate PS, the DER encoding T, and other padding to form + /// the encoded message EM as EM = 0x00 || 0x01 || PS || 0x00 || T. + let padded = EMSAPKCS1v15Padding().add(to: t, blockSize: rsa.keySizeBytes) + + // Sign the data + let signedData = BigUInteger(Data(padded)).power(rsa.d!, modulus: rsa.n).serialize().bytes + + // Ensure the signed data matches that of our test fixture + XCTAssertEqual(signedData.toBase64(), fixture.messages[message]!.signedMessage["algid:sign:RSA:message-PKCS1v15:SHA256"], "Failed to correctly sign the data") + } + + /// Tests invalid message length for signatures + /// + /// This test enforces that + /// 1) The signature method throws an error when the data you're trying to sign is of an invalid length while using the `digest` variant + /// - The `digest` variants skip the hashing step + /// 2) The signature method hashes and signs the message appropriately when using the `message` variant + func testRSAPKCS1_v15SignaturesLength() throws { + let fixture = TestFixtures.RSA_1024 + + guard let privateDERData = Data(base64Encoded: fixture.privateDER) else { + XCTFail("Invalid Base64String Public DER") + return + } + + // Import RSA Key + let rsa = try RSA(rawRepresentation: privateDERData) + + let message = Data("This is a long message that if not hashed, will be tool large to safely sign / encrypt, therefore it should throw an error instead of resulting in a signature".utf8).bytes + + // The unhashed message is too long to sign, we expect an error to be thrown... + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA1)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA224)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA256)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA384)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA512)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA512_224)) + XCTAssertThrowsError(try rsa.sign(message, variant: .digest_pkcs1v15_SHA512_256)) + + // But if we hash the message first, then the signature works as expected... + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA1)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA224)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA256)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA384)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA512)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA512_224)) + XCTAssertNoThrow(try rsa.sign(message, variant: .message_pkcs1v15_SHA512_256)) + } + + /// This test uses the Fixtures (generated using Apple's `Security` framework) to test the entirety of an RSA keys functionality + /// + /// - Note: These Fixtures were generated using the `testCreateTestFixture` function in `RSASecKeyTests` file. + /// + /// For each fixture in the `fixtures` array, we test... + /// 1) Importing the RSA Public DER Representation + /// - Ensure the key was imported correctly + /// - Ensure that we can export the public key in it's DER representation and that it matches the expected data + /// - Ensure that we are able to encrypt the messages and that we receive the same data when testing deterministic encryption variants + /// - Ensure that attempting to decrypt a message without a private key throws and error + /// - Ensure that attempting to sign data without a private key throws an error + /// - Ensure that we can verify that the signed data was in fact signed with this public keys corresponding private key + /// 2) Importing the RSA Private DER Representation + /// - Ensure the key was imported correctly + /// - Ensure that we can export the public key in it's DER representation and that it matches the expected data + /// - Ensure that we can export the private key in it's DER representation and that it matches the expected data + /// - Ensure that we are able to encrypt the messages and that we receive the same data when testing deterministic encryption variants + /// - Ensure that we are able to decrypt the messages and that we recover the original plaintext message + /// - Ensure that we are able to sign the plaintext messages and that it produces the expected data + /// - Ensure that we can verify that the signed data was in fact signed with this public keys corresponding private key + func testRSAKeys() { + // These tests can take a very long time. Therefore the larger keys have been commented out in order to make the tests complete a little quicker. + let fixtures = [TestFixtures.RSA_1023, TestFixtures.RSA_1024, TestFixtures.RSA_1056, TestFixtures.RSA_2048] //, TestFixtures.RSA_3072, TestFixtures.RSA_4096] + + do { + /// Public Key Functionality + for fixture in fixtures { + print("Testing RSA<\(fixture.keySize)>:Public Key Fixture") + + let tic = DispatchTime.now().uptimeNanoseconds + + guard let publicDERData = Data(base64Encoded: fixture.publicDER) else { + XCTFail("Invalid Base64String Public DER") + return + } + + // Import RSA Key + let rsa = try RSA(rawRepresentation: publicDERData) + + // Ensure that the Key Size is correct + XCTAssertEqual(rsa.keySize, fixture.keySize, "\(rsa)::Invalid Key Size after import") + + // Ensure that we do not have a private key by checking the private exponent + XCTAssertNil(rsa.d, "\(rsa)::Private exponent not nil ") + + // Ensure the public external representation matches the fixture + XCTAssertEqual(try rsa.publicKeyExternalRepresentation(), Data(base64Encoded: fixture.publicDER), "\(rsa)::Public Key external Representation doesn't match fixture") + + // Ensure externalRepresentation results in the publicDER + XCTAssertEqual(try rsa.externalRepresentation(), Data(base64Encoded: fixture.publicDER), "\(rsa)::Public Key external Representation doesn't match fixture") + + for message in fixture.messages { + // Ensure each encryption algo matches the fixture + for test in message.value.encryptedMessage { + guard let variant = encryptionAlgoToVariant(test.key) else { + print("Warning::RSA<\(fixture.keySize)>::Skipping Encryption Algorithm \(test.key)") + continue + } + + if variant == .raw { + if test.value == "" { + XCTAssertThrowsError(try rsa.encrypt(message.key.bytes, variant: variant), "Encryption<\(test.key)>::Did not throw error while encrypting `\(message.key)`") + } else { + // The Raw encryption method is deterministic so we can test that encrypting the message matches the data in the test fixture... + let encrypted = try rsa.encrypt(message.key.bytes, variant: variant) + XCTAssertEqual(encrypted.toHexString(), Data(base64Encoded: message.value.encryptedMessage["algid:encrypt:RSA:raw"]!)!.bytes.toHexString(), "Encryption<\(test.key)>::Failed to encrypt the message `\(message.key)`") + + // Decryption requires access to the Private Key, therefore attempting to decrpyt with only a public key should throw an error + XCTAssertThrowsError(try rsa.decrypt(Data(base64Encoded: message.value.encryptedMessage["algid:encrypt:RSA:raw"]!)!.bytes), "Encryption<\(test.key)>::Did not throw error while decrypting `\(message.key)`") + } + } else { + // Sometimes the message is too long to be safely encrypted by our key. When this happens we should encouter an error and our test value should be empty. + if test.value == "" { + XCTAssertThrowsError(try rsa.encrypt(message.key.bytes, variant: variant), "Encryption<\(test.key)>::Did not throw error while encrypting `\(message.key)`") + } else { + // We should be able to encrypt the data using just the public key + let encrypted = try rsa.encrypt(test.key.bytes, variant: variant) + XCTAssertNotEqual(encrypted, test.key.bytes) + + // Decryption requires a private key, so this should throw an error + XCTAssertThrowsError(try rsa.decrypt(encrypted, variant: variant), "Encryption<\(test.key)>::Did not throw error while decrypting `\(message.key)`") + } + } + } + + // Ensure each signature algo matches the fixture + for test in message.value.signedMessage { + guard let variant = signatureAlgoToVariant(test.key) else { + print("Warning::RSA<\(fixture.keySize)>::Skipping Signature Algorithm \(test.key)") + continue + } + + // Signing data requires access to the private key, therefore this should throw an error when called on a public key + XCTAssertThrowsError(try rsa.sign(message.key.bytes, variant: variant), "Signature<\(test.key)>::Did not throw error") + + // Sometimes the message is too long to be safely signed by our key. When this happens we should encouter an error and our test value should be empty. + if test.value == "" { + XCTAssertThrowsError(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Did not throw error") + } else { + // Ensure the signature is valid for the test fixtures rawMessage + XCTAssertTrue(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verification Failed") + // Ensure a modifed message results in a false / invalid signature verification + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes + [0x00], variant: variant), "Signature<\(test.key)>::Verified a signature for an incorrect message `\(message.key)`") + if !message.key.bytes.isEmpty { + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes.dropLast(), variant: variant), "Signature<\(test.key)>::Verified a signature for an incorrect message `\(message.key)`") + } + // Ensure a modifed signature results in a false / invalid signature verification (we replace the last element with a 1 in case the signature is all 0's) + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes.shuffled().dropLast() + [0x01], for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verified a False signature for message `\(message.key)`") + // Ensure an invalid signature results in an error being thrown + XCTAssertThrowsError(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes.dropLast(), for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verified a False signature for message `\(message.key)`") + } + } + } + print("RSA<\(fixture.keySize)>Public Test took \(DispatchTime.now().uptimeNanoseconds - tic)ns") + } + + /// Private Key Functionality + for fixture in fixtures { + print("Testing RSA<\(fixture.keySize)>:Private Key Fixture") + + let tic = DispatchTime.now().uptimeNanoseconds + + guard let privateDERData = Data(base64Encoded: fixture.privateDER) else { + XCTFail("Invalid Base64String Private DER") + return + } + + // Import RSA Key + let rsa = try RSA(rawRepresentation: privateDERData) + + // Ensure that the Key Size is correct + XCTAssertEqual(rsa.keySize, fixture.keySize, "\(rsa)::Invalid Key Size after import") + + // Ensure that we have a private key by checking the private exponent + XCTAssertNotNil(rsa.d, "\(rsa)::Failed to import private exponent from Private Key external representation") + + // Ensure the public external representation matches the fixture + XCTAssertEqual(try rsa.publicKeyExternalRepresentation(), Data(base64Encoded: fixture.publicDER), "\(rsa)::Public Key external Representation doesn't match fixture") + + // Ensure the private external representation matches the fixture + XCTAssertEqual(try rsa.externalRepresentation(), Data(base64Encoded: fixture.privateDER), "\(rsa)::Private Key external representation doesn't match fixture") + + for message in fixture.messages { + // Ensure each encryption algo matches the fixture + for test in message.value.encryptedMessage { + guard let variant = encryptionAlgoToVariant(test.key) else { + print("Warning::RSA<\(fixture.keySize)>::Skipping Encryption Algorithm \(test.key)") + continue + } + + //print("Testing \(rsa) Encryption<\(variant)> - Encrypting Message `\(message.key)`") + + if variant == .raw { + if test.value == "" { + XCTAssertThrowsError(try rsa.encrypt(message.key.bytes, variant: variant)) + } else { + // The Raw encryption method is deterministic so we can test that encrypting the message matches the data in the test fixture... + let encrypted = try rsa.encrypt(message.key.bytes, variant: variant) + XCTAssertEqual(encrypted.toHexString(), Data(base64Encoded: message.value.encryptedMessage["algid:encrypt:RSA:raw"]!)!.bytes.toHexString(), "Encryption<\(test.key)>::Failed to encrypt the message `\(message.key)`") + + // Decrypt the fixtures encrypted message and ensure it matches the plaintext message + let decrypted = try rsa.decrypt(Data(base64Encoded: test.value)!.bytes, variant: variant) + XCTAssertEqual(String(data: Data(decrypted), encoding: .utf8), message.key, "Encryption<\(test.key)>::Failed to decrypt the message `\(message.key)`") + } + } else { + if test.value == "" { + XCTAssertThrowsError(try rsa.encrypt(message.key.bytes, variant: variant), "Encryption<\(test.key)>::Encrypted invalid message `\(message.key)`. Should have thrown an error...") + } else { + // We should be able to encrypt the data using just the public key + let encrypted = try rsa.encrypt(test.key.bytes, variant: variant) + XCTAssertNotEqual(encrypted, test.key.bytes) + + // Ensure we can decrypt the data and that it matches the original message + let decrypted = try rsa.decrypt(encrypted, variant: variant) + XCTAssertEqual(test.key.bytes, decrypted, "Encryption<\(test.key)>::Failed to decrypt the message `\(message.key)`") + + // Ensure the encrypted fixture can be decrypted and results in the expected raw message + let decryptedFixture = try rsa.decrypt(Data(base64Encoded: test.value)!.bytes, variant: variant) + XCTAssertEqual(decryptedFixture, message.key.bytes, "Encryption<\(test.key)>::Failed to decrypt the message `\(message.key)`") + } + } + } + + // Ensure each signature algo matches the fixture + for test in message.value.signedMessage { + guard let variant = signatureAlgoToVariant(test.key) else { + print("Warning::RSA<\(fixture.keySize)>::Skipping Signature Algorithm \(test.key)") + continue + } + + // Our Message is too long for some of our hashing / padding schemes. When this happens we should encouter an error and our test value should be empty. + if test.value == "" { + XCTAssertThrowsError(try rsa.sign(message.key.bytes, variant: variant), "Signature<\(test.key)>::Did not throw error") + } else { + let signature = try rsa.sign(message.key.bytes, variant: variant) + XCTAssertEqual(signature, Data(base64Encoded: test.value)?.bytes, "Signature<\(test.key)>::Signature does not match fixture") + + // Ensure the signature is valid for the test fixtures rawMessage + XCTAssertTrue(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verification Failed") + // Ensure a modifed message results in a false / invalid signature verification + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes + [0x00], variant: variant), "Signature<\(test.key)>::Verified a signature for an incorrect message `\(message.key)`") + if !message.key.bytes.isEmpty { + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes, for: message.key.bytes.dropLast(), variant: variant), "Signature<\(test.key)>::Verified a signature for an incorrect message `\(message.key)`") + } + // Ensure a modifed signature results in a false / invalid signature verification (we replace the last element with a 1 in case the signature is all 0's) + XCTAssertFalse(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes.shuffled().dropLast() + [0x01], for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verified a False signature for message `\(message.key)`") + // Ensure an invalid signature results in an error being thrown + XCTAssertThrowsError(try rsa.verify(signature: Data(base64Encoded: test.value)!.bytes.dropLast(), for: message.key.bytes, variant: variant), "Signature<\(test.key)>::Verified a False signature for message `\(message.key)`") + } + } + } + print("RSA<\(fixture.keySize)>Private Test took \(DispatchTime.now().uptimeNanoseconds - tic)ns") + } + } catch { + print(error) + XCTFail(error.localizedDescription) + } + } + + /// Converts an algorithm string key from our test fixture into an RSA.SignatureVariant enum case + private func signatureAlgoToVariant(_ algoString: String) -> RSA.SignatureVariant? { + switch algoString { + case "algid:sign:RSA:raw": + return .raw + case "algid:sign:RSA:digest-PKCS1v15": + return .digest_pkcs1v15_RAW + case "algid:sign:RSA:digest-PKCS1v15:SHA1": + return .digest_pkcs1v15_SHA1 + case "algid:sign:RSA:digest-PKCS1v15:SHA224": + return .digest_pkcs1v15_SHA224 + case "algid:sign:RSA:digest-PKCS1v15:SHA256": + return .digest_pkcs1v15_SHA256 + case "algid:sign:RSA:digest-PKCS1v15:SHA384": + return .digest_pkcs1v15_SHA384 + case "algid:sign:RSA:digest-PKCS1v15:SHA512": + return .digest_pkcs1v15_SHA512 + case "algid:sign:RSA:message-PKCS1v15:SHA1": + return .message_pkcs1v15_SHA1 + case "algid:sign:RSA:message-PKCS1v15:SHA224": + return .message_pkcs1v15_SHA224 + case "algid:sign:RSA:message-PKCS1v15:SHA256": + return .message_pkcs1v15_SHA256 + case "algid:sign:RSA:message-PKCS1v15:SHA384": + return .message_pkcs1v15_SHA384 + case "algid:sign:RSA:message-PKCS1v15:SHA512": + return .message_pkcs1v15_SHA512 + default: + return nil + } + } + + /// Converts an algorithm string key from our test fixture into an RSA.RSAEncryptionVariant enum case + private func encryptionAlgoToVariant(_ algoString: String) -> RSA.RSAEncryptionVariant? { + switch algoString { + case "algid:encrypt:RSA:raw": + return .raw + case "algid:encrypt:RSA:PKCS1": + return .pksc1v15 + default: + return nil + } + } +} + +extension RSATests { + static func allTests() -> [(String, (RSATests) -> () throws -> Void)] { + let tests = [ + ("testSmallRSA", testSmallRSA), + ("testRSA1", testRSA1), + ("testRSA2", testRSA2), + ("testGenerateKeyPair", testGenerateKeyPair), + ("testEncryptDecryptRoundTripRandomIntegers", testEncryptDecryptRoundTripRandomIntegers), + ("testRSAPKCS1_v15EncryptionManual", testRSAPKCS1_v15EncryptionManual), + ("testRSAPKCS1_v15SignatureManual", testRSAPKCS1_v15SignatureManual), + ("testRSAPKCS1_v15SignaturesLength", testRSAPKCS1_v15SignaturesLength), + ("testRSAKeys", testRSAKeys) + ] + + return tests + } +} + +// - MARK: RSA Test Fixtures +extension RSATests { + + /// RSA Test Fixtures + /// + /// - Note: These fixtures were generated using the `testCreateTestFixture` function in `RSASecKeyTests` file. + /// - Note: All values generated are done so via Apple's `Security` framework (we assume they got it right). + struct TestFixtures { + + struct Fixture { + let keySize: Int + let publicDER: String + let privateDER: String + let messages: [String: (encryptedMessage: [String: String], signedMessage: [String: String])] + } + + // An example of a 1024 bit RSA Key that's actually only 1023 bits + static let RSA_1023 = Fixture( + keySize: 1023, + publicDER: """ + MIGIAoGAWLOVh+J+wTEgOLuM+vWMeBZJTH9M5j9QgwmiC2BaVNeoUyvyw0hm/b9mXPvIP209Ml0F7mm1c4iWZX+7WF/YpML3S682IqY3sNbxg3rZRn36FvEnltiL+ZpUStXPe12p397KkdinrHbdVohNt0gXQQjEN6m26xv99nitPU1XcjECAwEAAQ== + """, + privateDER: """ + MIICWwIBAAKBgFizlYfifsExIDi7jPr1jHgWSUx/TOY/UIMJogtgWlTXqFMr8sNIZv2/Zlz7yD9tPTJdBe5ptXOIlmV/u1hf2KTC90uvNiKmN7DW8YN62UZ9+hbxJ5bYi/maVErVz3tdqd/eypHYp6x23VaITbdIF0EIxDeptusb/fZ4rT1NV3IxAgMBAAECgYAbtkeCQ53sR6fUcavy/+IZ5oSR9LeWu7MwrULGIR03ooTBL1rR7f3XSwP1CuieAEf9QxjGSppY9RRfs49ZZeBuAqDgPmQ9iukya+e3pm5N444WyR65hxyDUuStMPHmwVtUJg+prMOUXEe43PJfusMtISi8BEiNMY9DacLTCJAeTQJBAIgMqq/Ux7HWyQ0tCisZNPQZqGrlkrw4Nzv2DZmLlYEgea967LmnOoYcASAZODAY/yxj3vnfLX3yvGX+CdlesBcCQQCm6CRzikQfRGtYEB92ddV5xeVgN5r8rnNxvD+kBuMB7qrljta3Ir1JHP3gmA/zz39IvfRf6obdd1Qd1Ym07FT3AkAjFlE3A8N0xBYaBdGnh9q2UZ+z4f1T+ZOVLUIYpX0rTjrT3PoMb2qSh8pqgtaQ4QF+a0toWfybjOy1ySy1GMyFAkBWS1ftVON7twg4870QpkPFPggmAxni4t9VQps010qvSRKatYtWDGQJVS/92yEEUZfhqDSdEsi/4F5hPnKAVGBpAkEAgbpGZ3pPOLjtVgGEkF9srvegUinFd4+s1wL9SVdb3aEk/dqGfScVU9JJqAKHTjD6ULX0qfHGZTrKWQJi3hf/IA== + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:encrypt:RSA:PKCS1": "GrwJv13cGvyLbX02dNMEuRYPPGiP7xxNi4kqPs/OHRHkHhA+4WmIZ+aYfOMlFdoNELJdNAr5lBrr6pwiEV8WOyp0Fnqql78qKIj8YvqDiK6ATUUxuZmWBQ9LzxavIulWeZg+/VqJSMKE3FEmpKkXWCkAi3SMo5l0fgE3CTe9luY=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:sign:RSA:digest-PKCS1v15": "C+S8K4B+W3eM/et63v3nwRsh3ATZJ31bDbl8qhnJ9pdF6So85GzeHPQY64yzRfp4oo+JT4W0WZAhNOi6u9NiBbhdXUPzyj/89rTSYmMEi7tiIhlaoDQV8X+a8gVTJqfM44xAaT82DYLP77TBUjDJEG9WIWKLTBx1EytkvtamRpM=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "Pd0odftcQWd47zlDNmfQHZMdxZPpC9gmivXOfNxOxQ31TXU7g5lglVzUMrykz4YViffJtT6v4MC5J3RRk9a9INJHCpM8hHPx8IgtQiNVN2wHOMB16kFKNuy3d9DO4v1Qklg3MCntzGZUB057UNCwLuvKXc7P5ZwCXPt47Q+P3wc=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "J7/kWa5xUBIKdxLSmsOINlrDTlXLr043xbcH62P8mDNHIff0CHDvZOQHU/r0+lAdtlzB5l9jLOLR+hkyQ8reBL6t2jWyfKPUAVKyUJNT7zZfEfFaGtBi3IK4nS1GQKj7JPJ1d0SCWUCTX4SkLn6pESzR65YI3QIJK/GG/nxmHkk=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "FdkW7WKOlEIBkGSZfzBi9gsS0jFy++MDeZXwe4pWgR6S4J54a33Ws3uwQwnOW+D592IEq1QG4h+4pSmuusNk5tQ7w2qCHbbW7sTZgzWVgpF1HfZ8c0xAkd2oWzw2S8/31iDDromo3OLsaa6C+69bhbqsuNwgkvyKuSxyqziZWA8=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "K5PyLy399mIrI3avLx8T2FwIOKYjy/crsN3VH4GZaFprP4q3xdw9a2ldlngnkfThKTphyS3CCfpACO8V7pZB2Haicre04tgd6uqYwMMBKWTHi4VVIzgwS+SN5L/sC3d4Gwoh6Y9xtUyAbB0Do/s30hbFE8bGC9KV5JbnUairRB4=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "H4sU7sS/hFlrklqN86CWg6FHlF9l/Ll61SpS7wF1Te6Kj78tj1MZd7QMlVKEWGM7RLI1/bkqcTcNzoLGqh1zLI1sg+nUzEqJnx6nCyFT8Qy/V55FqC3wLVpICe99SewDnMsAQiWTwVpiIiwY0vqnS4r+FlCi5Rx/midH0HrzJ3Y=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "JEKtxjsHSejtvffWGafUqy3SjH2EVC5rmSSpz5v3IfPjIlVJxiiCRr7gDwaFNgfNiS4ZaVWGpw7hMeduP0RbsrLezS3hKtaRPlpIo89ET6QpDEjYnlDAeyVZQjgO9EOvkCCJ10FotsMRYJWoipePnkqHDlV1bf1wVh599iOMNqs=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "IvGyNwD8S9eSJ6TyxYv7Y/g2qOvpbcNem68LI1R6IlqBlTFz7xGpdGriLQOUC4AJL/O6NB1AtME4wJVQ3fKCDlSsASy6EGPtIdwXwdijSb5NkiR2AlxcWCBMFuNHlEpM9OrhhaEows4Y1W1k5l0ws4vbYY4/BrwceIeGSLKDux4=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "SavoMjikFHGb/7UOFVI6+FCr2igcsM4esTqvBxeFhHumFGc7Y28fJXIZ1gvw5oqYdj2jCL5okjBUVVnkUkY2TvokN7GHAt0KFdv6F83DdLCwMwaGURgfiAxfPw9kDGoDkqhi9bUdC4FTtOLaK6gVrQzIlqUugGBTBFKySwqdqF8=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "URo+XyJE9cFziAeXJliysj0eO629grgTUYXRgrEOA3B6uIOyh0CFZPi/pKpJFhjGJrSAARDzfbH5AbftEo/C3OSOYOVYsgT3ictJBlYk6NsplouCd/CnkdECi3NBe7MIrsp9ekZzkfULyNje5Y8tt1d0PfAgHNV0VHASxqVLJtw=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "DslGHod+WHWpUFKLrVU6mdJZh7KPE8E7IMPaBMEs6hPYHdp4Yqmv/2jiPBcnqgIfwTX8A5NVtUJ0EQnjVhFDIqYQXP5AplzaD33dP8IEa8ZhIOrBjfqTZs29ApLrSaPxiT3TRP9Z0FMLXCzU8E5QJuQSomLkpaaHIqyMOzyqWTY=" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "HXPOd8MFU57jSnCPj+/mAvzfzjOEgZltWxp3Aek/hhfH31t3wgaB8JQ/A502umjrFlnBupMwQaQr9iJOWYKTFClfDx1T+BFUJfnH28I1etk8DeD3lEiPTMuV/caR3bT0cxDA2TKeMpp4BSOX7iiC9Vd3WaOMH3xbH5UYFUbEdHg=", + "algid:encrypt:RSA:PKCS1": "Pi3h0pakf0/QanjJ0mM+AExhqPYnGFX6Z/fji7z8cX1gD8eIUyk26u4opDjyVPb82JOY+ulRBAUlBawcd1M2aiY3O8Bhzpn2awEy9Ps6HWUa9Yp4Un3hLEmySyajb8QdUko0OWzG28cEoInGiOgoU7ko3excvcbHG7O0aJG3FDg=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "TbQzWXDIIX3vir2A8YPSxBLJsIqc1EfydyhTcwSOvHPtKbkIS10bCbtrN3tcK8W/7Ii1VluZbQmf8rQjUXgVAF9s7LNoDmtrHp3kOBUwSBT5ebbr/OIskwVdt2IHoNyYtOFlx8V86LJc6HSLYAfQplEBQfVd83D8EjK6DHJJRWE=", + "algid:sign:RSA:digest-PKCS1v15": "KJNf91GcrEFS6DZrRhqs2WlVJrJl2Rxmuf7OaPT+ymTDyUGMvGsfM3MGlousZAk0Z4HvaoJCKAj/cc2UecKTM0tf0q4RaO12/qSDM242Max5MotBVVY/LihV0Vv5FGLX4AvHkDCC9W9nC/jDSGMfGSzLqbCI/J4ljxcFrJ6zWeI=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "Bfn8f0RrkdJynMUp8dHWzpAqGPxuI5dKySwoXOmXHtGcqypvv6mnBwzURwIXq6dRA5wL8/GcQ6GAUkPLyQ7mbpnjKZEf0/nHfYkgNkihV2Ay/VtQmvpwwnrtlDWmd6s/a3eLACYZqiNOmNQan2jPTNCbQZZ1idP6ilv2GedO4Qw=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "SZN1dw+SCGZUI5Ue6x2rK6giO9JdTJozEkHXu2DsE1d51iVOHD5eo1PXAgmFRpkfV9DTzEckFViVP3G0BE5H3ZPsem+HyB6+nPuAVArqL7T0JBUzHgZ4T+vThfvMJzExcDISLK7gwc9NOTwIKjePWBoeTv9u+CPHVkxFm2uF+lM=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "RghR0cKvs4hWc4XS++IPdAC8K7fri54d8fxeOoWXMPejVh2AZy9dOxKJm7+NBMJxymVODrxa8JbzKmJ4h6agMtCwH2B0f/NJO67FJFbn+RGsxG7MfvVO4z2Ejy+IOQJEOkIRTKxvwtRlUiJBgiQfdmUClPzd7j6Og8fGMumWFSI=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "RUgGeY9N6zWP9AfU3gLz8oiZaoyH5fvKCULX6/HuqDvSa2Y06hayCo7JLoCLDuLVxMvg44DobR7z6j1Ur7v85Wqv5kPTAAIiGNKEnt90Hpqn9f2RzrTToH6fnQC7ZJ9+e5N72p57fqIjZHlEnFk7o3XuEqpivOKZiSCEwo4KDS8=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "E9V2lyhaDyGWFnCKROi3kcPr8QG2AfCYSSa9tyj8mRFUmjnNyghpUW5gPDCy6nACaUnPOxvB0trJUD+irvvYD+7jr+VDnxCeHwe2ZE/ize0vvJFvtLSIAGGUA2aXTU5CohNvNnJs1wYSIWYVrWkaU0yyA8H73kKzsAcAY1+KSnM=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "JMui6+GXCll9KJ+G0n3XMv5Sdz0PUQY6hDMlrygCdtFiNgPWfOTko/Q88RVHFJXCw7NHxyae6G+IPzvve2AQOEP7TdrivACM3C7sqchTWKEnGV1DbZ9r0f2EZjQ7VPM90mnmxG2uDPyrXTKUyVvTTH/SlYW+Zt5NO5TNf6KH2GY=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "VIP9zszWW0M9IvkCeMaNrgd37kfDI/fKOfSCeK40XvcTYyFuNlSdYhaLzxxK9UHcpD5nQR3UPUMym15FQZb6XvDb3ru5f4/BmeCmMdn3J79izPIZAH5JvyY7o6AjqnW/1SjbIn/0sCVuw815hublKifT6A/kxT21y1KxgUtKAhM=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "KE1l25Ld+OvGwxDcww7PUPXWhHszt55YZfSA2jG0x5MCwkQvxkVvUIb3b/fxXH73FJ6stKO7WR47ihnZXzjOv7si/AnxwS/j4r2yHC5bTPz01NqMHbNZ0eAIzyiAl3Lo41njLn/QdopFORE88S+G5OUgCaA0MfmRyncOrC+Qy6E=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "NP9G1fQikdVJNqxxsLetyAEEIgiZ0AkOWSulSW3Azrz3koW7YLoDcucP/dj7oBtRNmpQ2YD5J7JLY4Ty0BdxVt5nekBVTgrp9kuChqDKAJALnU1CtpWQIDRzeX7uoEytnjdo2No35v0EaFdy7h6i7c2ipMMB04eSz67X2MsD7Ro=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "B3ZgVLml8rkRPyYFbIjZ2ZL4+4/qkGzoHrlOCofM569XLzkoImKSYJ4viCFCRJxMBBg/hxBRLM3sSvOlCXAXdICHegyeJ6glS6bD3lzd5LWXIeGTywLd66tR263D5gFjR1Z8HIPBeZdSlDdLDHTFVa3uclyhIy6zHq/OxN/LMPw=" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "Dwu3Aq+tmYoXh2k9RzP30jU0Q9BgzLHVsJfiuGIi34BG5wqBr5Zow8FS+6IGuTdeS5jXBi5EAY7VbmqfW2/L5oMNQ+C+SYqgaVDBXe9a6xT5f7irgkpm0wa/logz3ybEiH7eqs3VfZgwV688PYUr++aHqrti72gd/nmLWLaHvIw=", + "algid:encrypt:RSA:PKCS1": "HY9udxFzq4HnQsThVd+WvJjveDONZ7IYZCBAD7IFDT5o1fTNrGFKtFXfk2P76ha1tz5P2mKHVkDjaPDd1M6x+RvmX9QMMfrYb3sbu5J+/K1+vZ8bSwYgO1ou/IW0T0KhZ7lkuCjZ2GIm+F5YNjlE0CXox5a+DhINF5RJeqD79W8=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "ItiEkbOcx9MPot85FYOFGyxLA/dyb4Dpf4sv/rFBeCaxSJKIN5JSMMQ5DKy2KKVlQY+Xp99TgInXPu05KalKck3LWjLggdR0b0t0XvEfep8rLzlHkFoaQaVK4y/JDdwVYUoZQ2GYUGCBB1TS0UCfXt1H6HIjy/R/7zVcPpNEanA=", + "algid:sign:RSA:digest-PKCS1v15": "LSy4h1tf7CtIZt3YusIwYMgciuRdmsMXZfi3TMwS07xMJWiGH3MAqLjSpoxJxn43hnzqXmIfvUOc6ps1hwoBF2zJKVP6VQUiup01T3uQiH6gjg1kkIzrsAmUhwGHMRkgpjvQgb4PcqUXFV6j5B00rUlMZq5IrJxeFIwdsNep7TE=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "I1+a/1zhnmBWOVkoHeRzKb5a/J6xJN3NhnZLduUStMgS/Nm0SV7kEgalYJbVGMIh/kXDQ8BY5lXuWrfOjjisgmSOo5NxRfOBcXxwpmRKstGi7/lDAs1LryCBWajv2hyPSEAky3nih4+8xEhUrjAoWd4shSd7FonUAU027d/AaHI=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "T8JXiB0JlDUC3K8f7NF/h4t9lpc+QPFUUf2AW1nk/bMb1dbquLe2O8AD8Ylfu39g+ebA3W4w/2hn+tkQuVQGMFkZbhrKUUdx/FVVZJveIYigTHjSavM4zJfkdCyiu45SOaY+x7D1WeJHsTbYLSc29qfVZaac9LYCHan4oShnIBY=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "F1rCz2wqbs2JCBEAr4J6xyX5d/xeXaGbL8G00dpn5Zz7i0a7n7avBdTHTdnvCtxaRa2bQtxSsQ1KsOZT3BrVJCKrtcVYIf6t4OKP9tpjh2BwT/AA5Urvw2DDDqMtlwZdBEJxGYLumbnHxUWrKfBzSHMTK2vbwJ19IY769eLfvCA=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "LPRFTu1T5BxGUp3gLbsR70sANSnY67f6vhGvRIU23KE7dUVlHWkm0rTeZNif+LvNWL1suxBHI6fJPLkHfLRd/CJlBOIOzOvvifu4kEX3VIySybp4/fEdBXlJnpVzTdVzHh2hifkWme+derDBJRcXGVO6IcHpJl0xhXxDaTUfMes=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "FQToDphnuXKEDLtEJU0CSf7DgCivkzJLbNnmxI+jVajklROaM+h/+oQcDPDohDbjZ6fsici/rByLrkjgCAcHYTJ1cRzsGG/QIbXGLwjebl5nBD3NiC50Yu800idYmX3BhMEaYhB7Ce6xukJ82/DmCIq2fdyV/usvUJFU7pnRziA=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "UQ73vHah5CXieEVXBmg1SdcVOfO+nj8VyLH8m0b30JCFry9MztxJot5BZZHNGzMbvDHoNRA8ekMgj6bRwrHpr/VwuypJ4IbM8n5C3rWdJSoTfBBPWZeywJkgeo0LzTVTlxjBsCHJQiIBsfIwinQMGARfV/yJMo0Xfk4C32avkP4=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "KU2uKP0Y21I6xQZrIOmSvZZJE/YlU1sNis/y0szbqbF6T9gFSlnrT7RIuzfm26uWMH+d9jCuq6wRRMoNolEhLJqUPzq2xuR5OwSm++U6o+d9OW1AqWjkwBqVYeZKa6WmmXKAo4Y+sLPR2iH7oqUTU1Jfzkn/3u16nTYK7WkLJUQ=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "F8Sdbd9MXz/nigx+honEk/anKLyuafO0H2+fNmkG9Rb3V9cyh/Iqyo4kN7YGXWYHpzH/JSHiUNOFOlVxsA8vQNqFt+V08z4XSaHsFMmN9gjJBDyMTwMibSxqzJPwqV6cWjzVYj/78RdOt22z7Gst5Vrc0sJIob7Lvz9Q5UteAcs=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "B44iwunbuMkEubxni5MM+T40O9/QoY16ykiWIUW5efwpa9WGbEWBVTb10Se4J0qVh0w6J+FG+xt2qaB7DDr2IInbrB5SIKpIngZtNqqE0n0AaD675N9d4nTonf5wWVXvooKOWJf4zaX4qtAvZYKoZs9JiBVbmPXNLvs013/+QVw=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "PndOMnWTZ60cGTDbIwgfHtzl+6Nmhu2Ec7KPvRtPnV0UhI2Yoxa7dFLz6NQUMUkf0p1cDFEWYwAhdQrIzUROoTr3p9dCEoxf2eOFV4S3aEdFGDy2nh0WpyQ68PFizAgSTJpT6ePF8u/1d2npPpl2P0fcsdU3MlOwaUVyxkF3ngk=" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "ALMTIQ68Jm/8xrjuQE/b0USTShPr1sCX51EVRyheG5gKr8HqZ3BUWADdpB3M5D33A0QCkKqp5NMs3qNvUaGspHTAUnV6BvWuX15kk45P/ibw22n64SP8Y2CU/tGCc6Rf9B5DJ7OsL5n7pZKAbF2sKlPx8VEyFbwXyUPT4cao6bY=", + "algid:encrypt:RSA:PKCS1": "Tav12GnF3OKhnAkZgSa1Nso24C/+qwXlXuA8BcXybdWAyr9D7B5ACn/qfYyoDOvUQSnDF8xCPrUTsxaZ8HaKb0u+620QA57ueQdQLSK0MEFmwdOIQaPGKm3KwyIXx6APkeij+RA4yNjmzIgQgKQoQsmoBOa01mMr5teFnVO7c1s=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "EIu3l9qt9AyHoTSE5oHM4wICOrY5QrGJkLsbwewA0SfwRFEhmwgBD2tbQ0tK6o8Fe5omkPwoh8fOFCPInTD4r9D3bU3mFSFnaEGkDZAQnVL+0WpKUnMJggDBoBY7Fz7PwqTKVFGPw2ixfK4IoHB6t0qfz3Q0eTO5xzRRtj9XZ98=", + "algid:sign:RSA:digest-PKCS1v15": "IRFLtTvPhnF/tC7gYCKrhmC0xz9gYRXsBnJtg7yRjv8mRYCDM+xugVDW2GBSRdQRssQBTcXg6mYV6oSR+nlqU4vkf37BVbHSrIfSGWFOZCqkGioMaswjtIEUR10ia9s5YDH5fVk3vsVXJw9s730jAYW8B1T8PIvMAj1Xkzr775U=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "DQtXIwKJHPnR7vG+y10hrnAt/C/g5lMoo7pX6Fqeick9mfGU4tCY4/COUdSUOOZYLacA2IhYAbgfNW1P5GRB3zELc3mveHwIVlovyY1FOhEwzbp+S6SRWP9dmBjGlswpmDvvQ7RUrykQabiPYnuqYdR1jhDbdWx4r25vF+fGhn4=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "VeWhPR0yNYwr9ARUgNEdB7nWtYE1ItUTPupPT/1GEkGD4JNTi0wZxcuIN/Day2QhbFxZ/jDR1L6ToX+mcfT2pcpxAIfJsJQmmj5ISvbrp4zr0Q/vnIwv75BqL2geMx34raQOD5If7HNEYJrHBmQFwq4aKih+e5ADdV0Re9hC7Ds=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "C6cOQd0Z5F20L+ZV+r6WdElB05WRBSqh+lFgR9yDt/kAR/5FRNaJ9ZG00+0NiVZRQ4fj4SV+SBrmPzBfk5TYJN8BQW1QPc1GFj798/aem7qYQySAv1Dd2v1CRhAg/nW+UbK3YfE/68P5MsaSX52dhJfV1+DHVufZytdmHlOgcao=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "URJmACamzelP7FmEIZ4nkymu/jF67VBByot5sscDVUGCQdwDntegCqBPrXJFb0bbT+55dmRCo9E402mMRTLEF4y+Gbf+yFpKiPxkHx8jGbs2CwrFUhlKCSOALV9gGz/QkgEm0vWyLNu7a0TL/fEipkHKURE4dcR0AZhj+1UCiYE=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "B0hA+iRuN8sVDLYPn2365eCuk5qv/TbfXhqwk4HKHWHDHDu4/f+lSX9AS3//ZfWiJQX1Kz8y6QJbSmafr1LgOxDDLS9VpI4uuLYPcW8HLf54euzHADF5Kh69VAUeEq4f+8yF2su9mut5x9561dRa8iG+5+rIIAJ48RLjAzzV2Lk=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "F1B6DPF65vdORuS1mTBRNUW7FkF0pA3iMaU/VTWRomKRG9ztomelprDptADWLbZY6DRMQXSHfZM2wXBLPZGSlF8K3HdDB2xEe5VzZtLyzmY3K118W7jXU2JQ7TUG78aCPFDi76/IOSQV7jwLmMy4/akYILnDVxStIydMzw7uZlA=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "E0SQoSKJj1AMlyz9oy5uETbNhnfVqIogvtugXOmD+KouX8KsHZpJBUj9+MSJb2vWuDjF5qGsSaDGHHkOIEZROCxHyStYIOCtofPMIftov/yXJXTFhNcouYgQk9DD8yzeFII0+rf73or7Q4C4SzlPXF3Ds9kut+7Ozw28o1iwT+A=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "Fe9Hbg5FhjN9subc+TRovHrq5DHncrZRkSswqy6rVNgoBKPuxQsbEP+QgHZqg3zgTA6mo6R+icMvDYcUQY8X5F0pcx/KqSTCU2n0Ec3VrxtngxXoe96ra04aEfwToIWybFslC8Bhr07fg24PlZEwFNCGm4cVEaQNQD+GeKEiiJs=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "S7GstJ9uVW5I1NIgMeF2n6JA+PpGLXFJmLTAqjpnyAK+et+YIRoRA/bYTftnXxMU0wsUansUXxXOs5nBrGf+rdtLLTgzIrt4uHsUB05Cl3sTBVt7p9tK8N2fxpw/4F6Syn9zvxfjBJzKdMYrZw3BtsRHzXO7SfqfayRA8oQfk3I=" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "", + "algid:sign:RSA:digest-PKCS1v15": "", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "G5neBQbE/ctrRD7Yr2DIWDSxd39WJkKnym6dEkyFq6pQRsipNdGTCmwnjXXRXcWM6XUJG4htvaEnz+5W8rZzZ3fiMuZgRxlA5FpbRoEwvnArYovxgQFiazgRi0CGu1nUpbfgwkuSTBxERWUc+l4jImcWeqY0YdFEXDcADqp1gmI=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "JlmRNo9gevd5XxX8FsnZKSjHeZNxIkPHzKnSMBhFjm15Y6QBtcStIkAjg0wbmcxqX5NX9DAE29t9+4dluK6HXvi87TBBrsrXtMzm1EB247+9224eu2y6kghFuPW5lJFITIUdmxyKT/14zR29OIfEdCpnS9zjmZ2TdOXs7bZlJbg=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "Bn06v122hbYHG9Q8egUW7RGV4cDK7jf9EKJXe4ydpjhNs8pKLIhPhnS9ax9wG9IJWR+P8n7xwGxfFNdSmcrWIfSbbYat5/jaO5718voNC7+bq/N5g2mzzz4ugRAFXiDbFlA5pWBaAZTE+XwxH0pSg/5giC4RFi2qN28ihvWHyOY=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "NvxOxIy/szgB5p+CY02JqM6ZwJLvCTLYOpn4xkpBO/kxXG9NJX9AheD8T7mwEiMQw8dyQ200oZFkyUDFjBoHNZy8rXRf214INpryypjobte9oUCju70v3g6Z/AMkSetJqBi8hxVpm62op0Co2j91pxUYXvO/XVpvdB/6dY2akO8=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "K4vWQj11zTxyMsZG4XKYrMqdxYZ7XxRBNBREeYYlL5xGOnRdmW+m5ZPh0h+vRIa/8IEPoyd2fvCBOUtx1euNQfPD1YT1UzxEr5ua3cQdylCWa8ghfCaOeJuhhMUFAqhjHQfK1NBtEH0bAvvw1XcxLRbTwupdPJjAFGUfmMjfMZw=" + ] + ) + ] + ) + + static let RSA_1024 = Fixture( + keySize: 1024, + publicDER: """ + MIGJAoGBANafJnOmd7j9o05NFzmoOaPJ5tvKMOybyNQuTdElOI0UeUu9FFAKBJD1ClT1WMuyDzIEZMF3TJwohNnkY7q8tnuTHdO/f3Il3b/1bt4QGavVwnrLbalaJgFmnvaLqTs8dYu3nhcUZhWI+eKjTZxjUg1LrGJVbGZtbjTGPvKcvjOfAgMBAAE= + """, + privateDER: """ + MIICXAIBAAKBgQDWnyZzpne4/aNOTRc5qDmjyebbyjDsm8jULk3RJTiNFHlLvRRQCgSQ9QpU9VjLsg8yBGTBd0ycKITZ5GO6vLZ7kx3Tv39yJd2/9W7eEBmr1cJ6y22pWiYBZp72i6k7PHWLt54XFGYViPnio02cY1INS6xiVWxmbW40xj7ynL4znwIDAQABAoGAGexnTJjS5TldvFt7bq9vJuWASRQHDM1UWKyvIZAJYKEUdZ2FEpXjL08pzFFGRHRheX0mXmf2jPYn9dmsYiXhNJsiUH3hV1trsccv4tHG3Ctvq3xJ3BY7K0IGPhGNEAlqTLOqM3QeU55PDUenR8C8Vx4Ooc/lm+YRlZ3w79yX06ECQQD+tDVHmJ6655sipCsJMgOKu9o6Qj4v9FwgJf8InUFLbOqZKAvfAUANBiX8FOKZ/DENAFnU2sQUfB+emoLNEzYNAkEA17a6iGZ2YnRb1jsL+MAj4qOS2z+WG9v2WCVl/ZPATAa/+Np0TUSAu+XorUiG0Zx+pClitmaQgaVBBcwXaPexWwJAOU4gQqiC5fhf/g5DpID9LQSQ19S5mx52b8E8vRpsa2To72aELTthxsxgVXP5e72y54LxsyM5RIacspl+3lb5LQJAQEQjXKHSIVDzT2b2ER0FU+9RwFo4WYJ16RrzQNH1F3FnXjePMLn49IHxiTazW92Y6UWfMCJsaQOX1KdSTiaFQwJBANra8gEZ/e3gN39+Cu4eFyFm8afBd4ffLnpdKiK1yPebsLbTv66pwwCAchv6uyIHihyD6Kyq7XZvhaLMo7xwfck= + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:sign:RSA:digest-PKCS1v15": "yAeKf1vJjQ/1uVxOZB7sCPs5cbN5CTfXkhqFZeFJgahjBgmb+hs0GmIdRjmlgTWAI6rH1Ew56SkiJgkzL/7RbqWvUuqPsyPz97NeDbXXSI+NTy/7W0KaInF3YdR3GSNAIMHy8qFLiCeXNFY+6ixuwFeHCOQrTijlBqtZB2g3+e0=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "dsQr0HbJ5rl/fPLmVPLgyTqk58T0mU7C2gyrt7qni+AFsvdLNY0gIyLKC9hV22ChfFb9FHDSZ0TAnfJV4F+OklAYaGYhAtYNHcdohGN5NkA0P7MN88AoU3TWculwIFdtmSgewZZxED9aaddo9bbUreecaPvzfrJkdpC3qQY+3QQ=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "GMGv/t14qzu7Hl9JuCDCPwJIs9NGSI3ObVHucfT1VD6nvfl01oSmUx5Z8YFG4xh+eTfX1yFwuqo8h8Q56v0Mesy7h0ZBR4KbvITir5umbnxOdVx4CSUG4GBgfd5n+xzC8mhMkfFbzgZa+dDe85XQAfAIY0OBwRb1SMkRV529TWM=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "mbsLcVYBBPlvcpSxdOpgoxla4N1bvN9LYuFvsKiNV2vFZQkv9aFeGDTwesz0Wh6FTzObuu63veZfCAKS+WYkEXBmoAJ+ZqAmYhBDEtuFPUyP7X0xK6ZRL8x1CB5qEN93k1eYRe6c4lNwTK1wxMIr7ocfBlIwUjANK2ZLlvInDMQ=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "RxSKRd/lot+Ba889hCuTwjBUt81jiGmAf+0MFttzum/fBcyhy419n++mzPzVG1CIZtcBS5sXdd1gqJNlve+E/GG0f1/vuLWuursM7+IqWntukWk+v6zmmZq2S+skuKsYZJfDTkOpzfYyyARqWWL9fweut3nwPRSjOvl5q+kgZwI=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "h1n6982vnm9JwiLFOsLLlBmnEw6RmlR8l+XjQPUyUaTwBaXf6jpAORfNWarWcTR1ZG4DQVvfN2lFyP9mkMwczXkV7kKl3kDMxqZ6DrFL7GLmDKh/xRvglNhK/DxfOV+6PmMhzHLa01Mz424B0IX1uE+nN+XknGwPAQ+qIKKOJqc=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "A30eJ8+4ldu7KRjdWy6hvaXaP3HqaR7vq+/k+wm38PbjAI3YkXZQniOm+q6JVkYSfy7EqpnMvU5xiC5gkYSser579mE90ZwJd2nNO34DzEZYm/rAZaEYB/EeyIDH0l8mrAy5BTG93HSa8EbX1hvpJ6X/LfalwJWI5/eoxFczrYg=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "JQ48KbGEzM57dvsBF4QLJ9hP+U9fJPZTSonnls55viRTuWToupY93vGfcZPRL0LoS97Twfxt+Ax13k8Inu9kJJyjPinYE3qgdifUTlTUtZJmSfKUD8L+/B+fVbeJ33znSxepBOu3zevOSVIuDjXlIRrhs52oGtK6/7N7D12pXsQ=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "ZlSnyMd7IuUE3+9GrnxhCZvUC6xaWimK8TCRh941xq+Ae6Ofv3bNc8p9IZBn+mM68Q9TX7PMjniHTK7CIoXvLWQx4e+nOPZXB+m9NX63yKxmXtC/yMRo2F+FG/ywYU6J0TLuOov58ULqoIIroUDd+aZZqPnIC0qI8i6/E/DiExw=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "yFltWqqP+amkWRgsc0IMvDYC8uLiM6E1UydMdwtnuMidWZxBSBu9M96YcGRKTog1jcWNcTQb0Ly8uyDHLQO/sCBSR2H1vGKd4wl1n6xlBYKQZOI0b1VQ8c1JKHUpSkquVDTOHPhdpzTMD9P1F3AcGEF82BCSwxdNDv4Asag2JnI=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Zv6PL+K65f4MCWdq6uVpfiUh8U02aqoq8uUPSFJiwE+a9SEGRa6FC+Vk7dthMVi8r55JCvXLbMAzd97kw7OXlS6cs42hi2tzoUtewflbdTQyWj5M9ruD/fQtdi6bSXXHbbZEnSwkSfhuGT5DT7ysKc/GAnrIkP8Z+Spzp+CUXew=" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "JpNi0ZtVYGFOqzMm0jQm5xLct3JDlizrFOoaOlbBOsLogq3NvkwTS6eiqI39ldbFomTkQeQ5DUXGGQacajzgdi/jPpEs/17poRI5v8xwYytDzsLrF/vjRfdPSbTTsO7WEsFHGcUUrUKt+1jtM0vLBc8aCkkElkIs8TdmddG6jrI=", + "algid:encrypt:RSA:PKCS1": "ALOEqjLmjgezAhWo1EsKY0c4rczVDeANjrLp3KAMBiXMkbgV2B3nXttY4qtb/B5nYa2iK1G6XJ+72Yi/9lSJoIaOUZ2JfmhxNGnagXzW9d+NAnt2VIxlUMdInve4gH0P+bKUXtJ4Y8yIx5S0cDgDEaNJA8pGYnFFu/2+ZVfg12w=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "N8EyiZfzRGF2Jh9hFCaeo1y8wGH8L7YB8hscLL1vMwU12hMYH4+uJ6po+hwHDjsZj/nELO+faTX5i0iZIaAWhjAxvW8XEKr3aY5+lySYnt/NlTVwlooMi4pCiKW/VgN0jecf7iumUATC2z2VFkZ4CoL3i8aJx2KtPCHcSGJRxWs=", + "algid:sign:RSA:digest-PKCS1v15": "AWWAt/oKiEUA/NkHDb2fw2EN+NOYNXlxa6lh7oUfREJTOLHBLCORBFo5f/BjTcDdJDYJBw2Uw4mWBWphBoLgmD06DsjmXpn8WxMIBKkT10qJNJAooPxDf3YG8e3PBirEh90N/zRdIhPNsbWfHVMrU8DHzTBwk2cOYgcPu2Id56A=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "Baf6LsSUSMFs0FdIQXPe2rRRch9FGsOtZ9WSfzq9g5NMjCAkObQGCtlMMVRw5L8qEoz3UvKJ1OJ02TTkpk27VTuS74RL2GzyeF9GfvQSlVmHW8gDOUB+0+kPiU2ZT/cwG9l4MTWkvU593cc7J9LXZho/fWhHffP9TGdnCtIZXRw=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "nL1mwFUbINKqYdKejLf/f3JhTfr4FPouVHDOXfN6CyKkQQg8DOE1ACERQEGIDmYyetSNKEEgqWSwN+u46Wr7SXHacLcCsEtQrNrisdwZmv7BCsMGzjXti91JHBLqZHTY66v4Ht16w0VxmFcBmEW+2AlaK5jTh/YS3npiSQ9NX1E=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "Jb2v8DU0T+4Qp+PF4V4T404asAiR9s1XrBDehLXTrZas5TjRY5hgkc77A/a+lSxhRhCDA9Tc+Nw0ACMJW2PAYtDuNzEjxv7WkOhTJ+OLu/eWFIo6/WFRnPRu9a0uZzHEP8T9EPrhasoh3R5wQPtxlB2uBn5bUHhYEn+qN1Y0sRM=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "mxy9mxRXZeDHZa2TLMtHMt3WWhEyCHBhzPDILFr4AJ9X1RooP8WLocn/E2S2LQwYLYpW30ZOaXZY49Zd4dp+1mll9DppXcJkDWymXqdRj/T29SaJTDAIcGDfP+wnLjoOSlXGXs5NvTIJkgxeL44lSPoAvJV4vhNpeJGyp9GU1Ek=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "iR7KaI3RtGeNN1sSRmVxcCGb2ElZMh1dq+pmjg8igTicGpDQ//toLeyGQTdydJzsPFdYBG3SY9AIdaTOiZK6btPP8cL+tq4aRQVMy3aP53puahdqgi+ODvK+O8WQxSLwg+pDACMUCkIQJQA1nWoQ1JIIVq3ExRFsP9H7i2770QM=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "fuBRRx3U3JViImQMfKv1dDNoKJPtXqw6TN/44d7g6kWqwyoXe6XFjpy0P4tP28YAYJzCa3mLMfXTP42+B0tYXZA8bsWifXK2BsWATMiLRCikkyftg371eh5M/+Fw4oMPf+YdbeZmLgOUkdBR3avOjWBC7AfjgOKdBqkT6kVURpc=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "0qI2qFArOlA6uRmNF3uguPdmXhIBqhxZWzdUeXAwBseQLBPdl7rbsrh/AgwXFsbpvp3F4K1l1y8tON1TCUXAcYrP0NnCYKYk3hUuzykqWhhAX0g76+X63mPg4S34YQZfdW8EjhqoE7oubD3OslrwPdBR8JlwAau9f6CwbK7YkbI=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "noHkDUs5ZO14CLy95DEkOYQG32YmaruzMIZgBYgwv3vi2LmYmvCuOt1DoSFRb+nV/uIUrjqgAZFav2LBpwSuoHsB4sCSPWWIQicaln/EJx1+LUXpF+gG0KZVOkJNbvUTi3QqcXuW01TZZmw8MydKN/QTlBWlYhM+sm+1w0gYwyQ=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "Su85Fjt06dIRdIEpufLFEBDVumsQ8EuWyLlH/qEnHyYFfQP/Q5TylxgBCc2a+nvuX74EsvUyT65zIYrHn48zKKdLz49CClGqJlMRIjZbvyrAT3+ksK6dD+tjy2fEgtRDDcwLICowmF/UuT4K42GcYGLXNkZju8Yulh4EJJL/mi4=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "hSgRsvhQeZJzf9ggO3YAokfrY8VsL0q4OcZN6msqKXZE6u0Q1BMACc3P/BM3SOSOEYrYLr+uedpntEvXPtiBis4R5VvamMQF1tzs3QMPCCcbnwMPtuJoT44pz44NYdHfAyI1KFgZeEwcOevJW/DrUFkQG8syR6ew8mE2sEJl9ws=" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "A3vPcAHp9sIZyBSoSJ9e+5gF1I1owZtPn/T7qYlvkEu7jCELW/e4IlLrHh8oYZtaw/+NJ4O03CoAM5ve6iXzJlCWvoaEBeAVhnJZNEwArmKk1Ap5R0ZKty8RiE/V+3hhKqSnz4yxgvkQpjZN+xNKWSUba6D5n7GkrVykdzHY0sQ=", + "algid:encrypt:RSA:PKCS1": "ottU4RoCisIoZ1zSjM0Wy3Xk9HIzFBiFzEcNPUqcEgd0FY7KYDnnquXmANqj/a2cAgVFqZLWrYgehvOm3fpW0qdNHFDAKMQEyCu0qp2ovYbkAmAYYs0klBsNRIQS6QICIJ3sXgCi05O/0Eh48k/+fa0VDqrBkAlBhLQvxvZF0j4=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "WenkBunlIy7kQ9BxuS/fG36eHLME16vGTuuF8ZMiO3RXnJgjS0dnMlDSBAcGYxWqDq1cZU+BmYUjz7Kzk/WwS9+DimrFYGyQjYfDLylHVZ3HN1fJd7SMgmG0LbonqqKBLm6YSls2HC2Y2kApDnfomc/owevOEswGaKYybI1ItK0=", + "algid:sign:RSA:digest-PKCS1v15": "APEjD2A4ULLM8pf4QkifrhmW3WmrwWtfbybmCSdPlu9NQsWt8i4MbzSqF752iDhafRQHZJ3HRh1COFnmBGmt/OHbJ14AMRgiL0MAPF5nwDfZGhkqBt/DsD1K8i7vuSZCS4sLLn5SvcvdSYdwyz+cJTRkis5wKTdwbENF+pKKSgQ=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "x7WcrpJivdUX0MeQn5btGtWzqvg7vKhh0aqr0AhXTm/6R8jUsvy57nKrWYT3oZhRaZYQiM4iSOrhRvgXzmd/3gFQZtMCK7p1CAh6Mebv/WKwaQXCZauL0V4nKea1X1rxsU5hqlio9kfKEk/z8wYUCyDyAckPpUHSMGXiVFV+Z7o=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "iIUH2m4d6RThcOVrP+CXItTL6ZZYd3L2DamMCkLDnwCRruP9c9wsidK5FTI1+fLofftuBe1OV7GjMyiSMBV/ourcF/QrzbOINLKmF1M9STnlnCAdUKZS2W6erc9xyxYillvFivy22MnjN2vWeaRndM2fcJwklaiEeZZsOWFlANs=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "WhESRms3ivNwlXOzrIc2PhdyTywdbJ8QB7O75jxr3lcydi3UaYMyig5nif/InPCmyhlaU6k/BuXt6kGuqjmYMcCECIKrnlTcLE2ob/RYcOcmbNvyvT08t/8M0P/Ee//EsxehfhW9ZLzLUeuDodHUwYncXTzaxnyeoi5yMDp4404=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "obD02BmCEEKFxEoxFOuUgGkNQlUEAUYNQb0/p3/yYgLJBgpCt6QRt7jTEOrifsqSj7dbxb4N1UQzGjAnfVDong9WhB6qHaiV3LLczbnTb1CLDWnSIDRTgH1OmrUqJHuTcxG6c7lCtrfIUvFoB2u584mk0l5n7Qm0wzSFjmC0fxA=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "hUPfDfsRD3R0YzK+bXmvdas/iJkA2oPY7k0ohUZestI+wi76bOFpnJME/U75LyrHeU+2PXMZuzOne+HOy5xfwG1qXoCAa45uCUkO9/1hcJJ9p7iO7zPMDbcD8q8SHQnAWw9oqOWKWNppJSyZBr1ElvIy9ZZ91XEiWRwzAUPvWco=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "db/I881O2pZ2ZilPLrbFvBvRNVT5rMgDJ+gIkFLXJJX8o1YxKsEGcCOGMN2yOsF3cIsepJaPK8/7O+IVtsZIlkFO+7PFLU+QN8A9xQh/RAR8jVSxZEmlP/qPPJ+W+hv8HUA4WZ0Azb5VLchkO+z9UFNLxeD4qsm9a7wcLH/pzFU=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "IvnbMwj56jret+mw/IS/LMkw4PySyx0pcTmzxLIdob6o1tq9oi0IVWgprZ2AI3QbjPN4Q8wLuDRr/Vx1GAZ5Ut4O3UhxNQAmbgpheL/0180Otl1GE3lhru0Z2kOv9Brdf4Ro7Bxq6bPuZHnlHI21WTOlHis1dKPo7LGnBm/YW34=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "pw7oXUjREq688eClmI/SyiHwYpq7jwbN/3j+zVlF2xqtHkEbz+goCR0v9t5h3zjnYPPh5KtIRbNxm4a+LN/XG5i6hcGrslck1lukqolwhixt3e8spEzek2QgTqfcbdE8W22A3iv8zd6ofeTaY7BMZ0BfKlUVCYQfLFbRO+hDzkA=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "eOLJQCMSJbpwdRJxw3wFQdPD+Zrg/5T+PcDScLmtdOsGwXod01oEhdsADvpEotm1PiGazaTea8V6o3Fi1C9JF3roykzFp5T8oo7vBZ1RtajKc7RTUpvK2RcbhvgTz28jV6R9MJVJSaqF/XlZTrVbXgCGZ1pppArb2Gq42NhlyYA=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "QExyIGSV2qN4+TJikbVzOlnKbz88NQTmp4/oE+kJzS6XNhWAYwEz1I5av782lesQnnofuUixEigX7MKbtB2//Mzl4TMxojNfYheo3F1e8fm8qfpOtH2/RYyrxJx6yTkRj5/tlcSwjZHs2shgmeh4vc974kq2LkDvzDprw2f5e7o=" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "iN/hoQzpwUzgEEVTgQX9CB8pjv77pRvcHlh3GwLhTdHJZ5DNFOsigroxJxT75ms9Y+s6q/ogRdv1F/yEsetQ+51NdO+IaWs8cN4kPAOlTYZqwc6xdsqvxvKfDhu7E8tLuofkQDIIUeoXnDDOV1zBCzCs7/TdJ7aVZCh++QQoWlE=", + "algid:encrypt:RSA:PKCS1": "sTfXJoFBif4MGfcg3AjzPxFfM00B+gj4un9XmNw9AeVQbsUgx9/GayhkvNa1tgKW+u47jQcY16ZhyceTxBF2Aoqh4D4gVoqPcenEIxsnAYQeek7c/cp0hDk3SPNZ/+eSxeJuAV5/DgIttT35+TKmzcwNdSndCgm6dY+A976NQ78=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "IWL54w92rMgBR8HGWEv73JYBuGUkSmnA8TCN4HKFRZUpA5U2BeDSp8Ip89C7oIYACQ60INGXaUWeUi+NSXurgKJEWfUGesfzzfhyTOoHxOopdNyNEdRLsl5HjV4HMPcfuGuwOQ2BNbMWd0owTTKiKQRBZ6ktQ2JMRSQcw0uU9G0=", + "algid:sign:RSA:digest-PKCS1v15": "EBB/AcC+I4SGvkDQDPRYgRY/P8bWdcAOaoCE+0lLXDH8omLd1sQOiRbRwedWpoM2QDnqEwbNcSbHXnRgDw3UIB5P/DURizip4oRKPm//vsGZLCQAzPYTvjaM7GqJ5/mvTXOl63XRa2deYRWneA0kM76Dr9wlyvhiAfbnGmwF/pQ=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "OwaWORrWAby4M5p01gDLHCkgX+uMFbVKLaSqq7g3yc460SoNUOS12uLXLr4+c8j3H8IZAolASn/ntgDM6q9LaDEUT3QJA4ARDLNLPbCtzkM7y5ErEo5/b6Q25O+mzFIWoyh6O473s96teTaZ7FMwCOpcH1hO19BiX3Uay+JbFrw=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "hgde5P3kvsn5+OcPgMf6mZEOOMAtOTxl0pDonCRXVXMrBIjZkOkSyeonO7va+cmblHA4wa7Pak4dbm28vVMH2qKuVD0OQHY/3bvxef0plSrW+U2rfH+HJLhj1u0ix/rwG0D7WiLq0tyHmNZq5fCL9V568Bff6QiZobgb2PgiQ6w=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "h/BWo23Un5vGlwRHZg10E/P0hVrO25jd1tSftyaWW4j4bPafA3gnFvCRGNqN/Hs3R09uEJZrqHnnDf5/B/MHfgFx7x4gmJ+KmHmzVQt/+ZGs3Gv7y1IZXsE0PmhIcN0znjODu3LTHR3NrY8mxml/ZIbTw/rUcD2O7GjyjJsceX0=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "B3CEn6LZlIqrvGTPOVEqGuB2Exn+9iGMIn+e2r2MvuhkJot9hoT6UBne3jWDhZT35TxssTelD+z5hyWemqGulaiBwccgKSfIVlqL0kGhyF45DQ/f3wRHa7gqPdGRIOHPMj1LzmqDeoCXc0Lhrn8vmQPC4IG+oYJFDUSpBs3S8T4=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "NaceD2P26yV5uN31I+hKl7dlIh+JmgpAL08EWxFkIfTkfZN0kr4753AOsN+fjz1SQngGy4sxXJJIEBwrpK3YMRIIVPWAlO0fX/ArZzaSLkwDqR8Rau2NTvpUDj5hzZD72EaJscMMvt4Y1LY0VubZ9jYmFjzLoOVxs5k6YgtHZII=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "G2O/fR7XumApE3hQcZifpeQeCs4pmAXceu9bKN2FKEGj7q7KWShSUnLyRqVO7N9ZDFn65uq6zyEwR69hpg9eKsCQlZ50tnl9eYuDgmAshQvu8HyIatD5vPSwRRN1bjKr8nSQ1UVurgkNkcLw5VljhOW33slzD/f3tfUCfbXGp5o=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "SESOLgXnybYNZtoQj5onqdNQbN9ZqTh/i4FrFdAkVgRK6yt6x4Lg6kSMIH5/oMBFLs7XbTmnkKMkOrmXPCGT9jJvaD7axtZCeXuBx2GFhMfaGd3IfH/4ZSo+4r65BmcmnhYnlqB6/ZFY4Zyczqh5eVDe1moPm44uN/evUWQV41A=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "F8y4UQPGMioJIUrxAjYIV9OYMBJlKb5e8EQXHmPT5JauX3ejkkqyjyQr7Q6H0ZkBnnG0VSrqHx2m/3MdGzXDWFcgnLRnrv+i0trppUPSMYnt1LcW5uBjsg4vm4BLW+Jdp4uzIK1JdInfeWmBOZwa7QwrhK2qWHHG7eeYgdnH8c4=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Xc2GvDotWv1ld5uVNGHCL7sHxv/VTdcxOGpG7xbYNyrFm7rnZ/cC/+RngcJpXUZEVl+kuafBt3peXP8GmVT2iWyFqhCRoIaHQjordWQb+kfwCuaMoOddsizm5Pj2Krk4XLJ6vkIAYKRmLVrhRPvAObDewMLP5A5MhdpHQUGAzHU=" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "", + "algid:sign:RSA:digest-PKCS1v15": "", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "sQ0YsWQGbYJXwbx+0BlturgU8TJEyYlTbnJo0D5gcVnov8XG0ptDVM2wCXqhVM646nH0HiH1eOOjXZa25uRD8P1WwkT4AFsZxmMOm8TOn+h5H/pas7V+kG6qz5JAaQwrgaFnejCtcawDgSInN+aRdnNsHp+aK04Z112mHaNR5OM=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "kXESCymon7IJ3YGpBiMwVW6J+l875YMPtW7me4aGvZrrRvRHjAPQDcqMMKPM6JKOb8cBkUM2FhC4uda9J8X0QZku/PupFjBy42A171HU6W9K4e5MWDh6w5FDTg2kyO1VhcLgtqGjPxx2q57+UokggHdXNgETDboEKLhiTkLwVZI=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "yhxz2RERdhE/GB8hAr+Ttca6YVKBOPV7AjsQSGRaMTjDXsw4DZDYqjHAJM5xI34yPmXzfafZ+jd5vzkRBkMRHhzlqlCyZ3EbMbykIBmCGu/xJI1Ppapoh7LlCUnC5Q23hUg+WSfNcpaaIPyqmwuuM9vk0UrkH9GWLbjQFg/PalM=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "cShFP8ZmbN+VACN/yGRzlFPEVLcPuoGO/CIRvHBQrg1h1kEhyp4JJmFENtKpPWQEWNInrU4zeONa9TXxGnq4NcDf5bTvwcCAbxf8vRl4swlWp7HGYmkgNbEAbR4/TFUOvZ9LN/PrFP2xWr5BSCkyTw8R9jRTHeZFa97nGq72GA4=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "nKKmZx9ESVArtJeZXLS0bPVyLeW01hN3i9jXZkv+DLDPUkn6wKA15U9bGV0LEzRhfGQ9yYj2DnVpVBaviStx/JxYL+r2H4qKJwyzaqE0rB3pZiqkxMrzCleNNrx8mxRfdoVyXpFXQLd1jLOnDz7FDFn0m3ChCJSzEN3ujQ+ysos=" + ] + ) + ] + ) + + /// Non standard key length + static let RSA_1056 = Fixture( + keySize: 1056, + publicDER: """ + MIGNAoGFAKWx6RJnFWkMlZnnGQcFm3qe1pcIEdKY74OW/9K7VGF/dVw+CKfPqGHC4L60a30vTqnhpOP6TA+vW0EZ8Jfybe9ARPmbbHknW2beLGHo/vXj/+/Ln/3o35JfExEwIhtS6Go1gAnGBmjBCbIpJ/zgDcoVyFB0qUz/qSGyCLwG7vTXYSuaGQIDAQAB + """, + privateDER: """ + MIICbgIBAAKBhQClsekSZxVpDJWZ5xkHBZt6ntaXCBHSmO+Dlv/Su1Rhf3VcPginz6hhwuC+tGt9L06p4aTj+kwPr1tBGfCX8m3vQET5m2x5J1tm3ixh6P714//vy5/96N+SXxMRMCIbUuhqNYAJxgZowQmyKSf84A3KFchQdKlM/6khsgi8Bu7012ErmhkCAwEAAQKBhCEyNanUMTvso4REAoWfn/i/HesAWOHCdin89J/5m/w0lwS2APHt7qQ3cOOELgzUj4QFiw2JtfdmgHfYhJVMoq3OSDDbVYm5ubWkCltl++DT8R5L2dxp5sWELQVAZi6Dy7137yhPKt1RU2ArnOlOGpIM76aG8ONcsc19hPW4Dr+bnLoCoQJDAM4E9j++YPEaShNFrK1mJ3VS01M4Ei0lsxfZ3NBo2PcyB+pihhSQSqOAwsXEGamohdTecZAsWS2sTM+MNQ7IV/cSdQJDAM3kj3jeZv6aMuGQMGuDJmKWlp1v5F/nAfgPvYjMnUmHkiqS5VrG3L31Y4VGEf5a5idiwZPtnGsMHtQ+bmlYxLLslQJDALojt43eZ95PX3BMOnks3Cff3rnI5ntOHaNGH4FZyfaGiKpXvEcmG5ngw5pF1N36OnkbRkX6G9TtYTUAvAuQLhI45QJCfqeaJnVRkE9U+3LShmCQLVeLYV/icahOisVMB6ovG3tdS/k/Q59PTT91sBdRnFFYgWP7xr8FWMiE8nVRQFbN8W8dAkJ52r8vpPMhq7s+DVCmpLocL/A0WXsvlsdPnrE306pqFkyIs5V9M2+IQy1SDutqIWV2POInkcrT9UM2ubydJSTo/Mk= + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "algid:sign:RSA:digest-PKCS1v15": "Ul+IsDd/9H1e6nB07lNFyAXz9WRm3+15s/PVwAMrWHUz/GGEu0FCfA2hXoet2nrYXMVxWCUu1jg2bijuL9KAj90A7EKzEK+dMK2GvMRWUJjvLqAPX3rxBwoYV5OV1ocwh/bVY0Qsp3+BvL+ehkTmYvLmuYoJCRrKL8y12pFbwEraIxKs", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "ZuSggaLg1NXJjJlEuMsyZKHSTXOQYLYRwem1g8MftBQuSDTDrSpGalAqAqtFOdhBGUew92XXAzSbrm1qUvTvDy+BjdgdAOaDFD8KIg4FofKz6gAnKNP+eX2PJgZ3mpP+3K4YyRCt7RAHVfCbFcyfh/Fazrv44jSvevOgxXA1LLAbvfvn", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "jQlax0NxM5VunnO5Gv+De5TrhCBHDSSrc86R2BNpCuWQRMXhxX4A/AAszsMHDNUvrImz0/aAvB/iONh8mAbc0DlZ2xRFx2biVVYt2Jk4bmaoAJUDHveLeu1rHKzSw+aClW+LcQU6eW9SQZVa6RKxVtEoag4utHGdD1gySAm7z9CLgvBN", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "farZtjPK/cCeKhiYbyJFQmMR0F2aVLv+hHOyoHD5yQDMDzYaVU89hNaD8kvvugLsvPgaj7AjQ94cvrFGe8WdIgZniKSzMlY9kBzDIkKYLD4rGZ5AH25/YcsIma/qGW205EGb0BmCSBA3C+DiBn6O1EgXbrYG+FbIFsCEriHQniu8+ayp", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "BzXjYK7NwQEp0EJaq6keOLBRQjTG5R0JW+2zDhzj8aDhlXDNwhrjLLm/52RiSzTx5SLRG6IXC/KEUPNeG1DcXFIX4hszXdYdZ7gMQJ6TRmefkQDln9qeP9o76BGT6ZQVEoaRqPcLJe8ndRRVFIeKtr8Ebx9FrmWdS21vd7pU1j8bxLM+", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "fLQXVzoJp2kPk7i7kXVw1FUGgM2qoCR0aPoQq6J54zUmS2ebpDkVveQNWUG+YDJfRlle/EwOZvx1JUeoijgtKzKonJE8fmKuvc0Mb/tTzr+qlX722GyPQZrop5XeKY2LjtOm9i/2EaL777FsSdeGuYLi9cRZ6I1a5vev2d9mOPT1KPFZ", + "algid:sign:RSA:message-PKCS1v15:SHA1": "QLHLGgW2uvKyW5EwfLErD3rnSLRusZzCnE6Zz+m9b6q029FzY/9kpHnhbWNE9NSOqSV74KUXJL26lS718dnCPl6QaNbiLSoYPNzDpf+u35xtMmO0mUXvQXyL/I1eBiuXy5V4RnrVJKsGZ1PxnjHwaLf0JYxZ15FmCJDLGVeFcqZeRPct", + "algid:sign:RSA:message-PKCS1v15:SHA224": "FQWd4tPg3zTk8dsq83UFgNcBQuWEjSALDp7v/kWPZBhCCs+pRpxhFwc52V4MfrfZfAAf8biPCY7yRA4EeBhaTogoUobBGJkK1NNxSDmv0Oosf3quqNVPxDBA4uIYXY8G4+MIT/9Pyd4Ii648abZoMW6mH6QL1wHY+x3lb0f3+k3GcHjj", + "algid:sign:RSA:message-PKCS1v15:SHA256": "Prc9aRCeqTNWSu3KAP92yTlTf7TjbAc3ZBCJxvlLmmcELxl6OHdEBHK2NsFvOybW3QlONdoZOcwnMugFppIyFHr6fKQ1afUpJ+GfxC33LWtgohx2W/gp0LDUxoDNSkJOboMk334RyqDsJMMgq3cUf2vVCMgyzTCEIRSkIk1ImaxPDwYy", + "algid:sign:RSA:message-PKCS1v15:SHA384": "T3qAgzZwHv2ks37o/RYxEhEREjga4UI81j8uqGJrrwhs9xlO+ZTAfhojMLtYDt55nt3FcUNW50z5ZwGlkLoUFY36WG9bvQobFAKccpzIwrWpJZcC64/XejAdn4kyHXPJ0WcXXE4Pw2MyIW2BXOi2rPQmYaxWtz89PhsBt72a0VmmFEFn", + "algid:sign:RSA:message-PKCS1v15:SHA512": "B+koY5fGvU1OdFkzqygjBJizY1j6sP40BZ8A+N+rsx/T5EK9yluQCrmdo288E8bhqlkSe27ptPqYEThB0+fhuRhmAhbKSZZtZ4jedgG4ZWNP3r94/pJ9M9Vg3y5N26karpV0FYaaIurCWCUP4D0RULMsOXimOwVIruLPyV8WJs1wZUHV" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "I/Bj1wmy3I4KJfYpmArvWFf6pFJUsWXqkWKnx5GDGuLByG+raNmP/GP/YCAvYLqxyeZtRVg8uDe4+VR0taIGV/KVb2G8HbOFMBGS4888IAxWY8ovRFFpRTropAxS+ed+0K5+RG1h40cHVw7E31lfsiKIA/hExpTTnIsjMNnN3oa+u/YR", + "algid:encrypt:RSA:PKCS1": "OgMMS3psCcBCvaitf6dnrglx7w2rQSWAlgRJhzGNWXMdAt/YqVQ6x7RuI8d6y/pumsrLCkhVL28s1hp8lbZfkIp6c8bbMjpy7gMM3d72b8GOTiJU+OJxerMa1jGmO9tOX726V4vsjEu/Cq0ydqbzGMKde5QNoBCQLQrRkluPjRNvdcyy" + ], + signedMessage: [ + "algid:sign:RSA:raw": "Ba1OBm4L+q1rTme3HQzWP80FxiKhZ9GKC73hfNhZ37vm1MZ40yULXI4jV1iRX4Oheh/tXvyFg0NJT6OXsSDQeV5vvbu52QCvEu1O6AxGx2THXkNRCzd9enOIsmqZrpI93+iXteyG0oUDdlO6zMG4lAYOE0YfGJheXFqy36+CSmPNFscj", + "algid:sign:RSA:digest-PKCS1v15": "ZxzNTDc/mUPChfyT5/ZQDmwTMj7MAvAexQiWUhxwJFJ892EOCWQTdDsi7zIYCSvRaZUlrLEHsjPWUr+zJd4fsCFWwLKTDBJjL6b4AAeCsgf+pwgAinTpwUTwlo68XYON6WGlx0QrPUiK2USpvenIkK3m1khNwNoFAJOn/YVlsIXvdwgL", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "TtD+8Izo4ezCAvEh/yddOMD9mvUSWgSmHiCCdtu+tMAVeofrADVcQqNjDjGPJw/dED9qVDTZGBTyJ9K+IuDmG8JPDBzjWVBi+s6Z4d/7gfqQFw2Iuvsx4CVzFK4IropGWo+6WnWZaTeLSKmGxAt6tV4vQ2C+DnoqYt3W4PW1F+mE883m", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "T39ye0Qjf5vTraEoVXJn04lR2M3e2TfDBMiXSfXAaiYwKfWr1wShVwDGnqYTDgWQujagSlAnKJhb/GsPDUl/IZpSCG971yeh5qIDnsqSbQrSm+DaXimKQKKPBgbCgC7kxKUsR5zmabzu1c4pOkKT2OQvHjokz5Sxox6CXak5Z19Ih8Qx", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "BljerZ9FCn+0Bo57yvKsDHuVPd8sLGOdRN4R85l69FJ6if+V+uGQI6rWHpURs3wRRNY0hGkcU2snfog7obIcrh6SsGeT0JQNEjDZINDJ6/5rjFrIJGxMhsFYpqQdAF3GHx7RJFdrf9O8j5cJ6umVpFJ3AwQxEbWTGWTtfAgyHZpv5CH7", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "OQoLeMUtktY+LjVxgSGSoU70uM2kJCz4PaMRIdNquNk6KvuCz6x7tikuOzno3WF4UAz0mOnl4b/exdI3X2j1oZCwwfCcaHq/5tL6mCxaLXZ6zlyvdkADt+lHp8MF3xz/lp7ahbn5g3gkAD+Y7dLqZSRgvRaaN4lXMQR176BAXs/wp1JR", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "LnocrE7uaCx7n+zRivY2y4vzWnzUHlr01krZXM8ONfbJ5+ZJx3m+uCD8GmUzIRabKz+E+c28wurEicXKhKE8qETGRIpqIa9sTbtO+76QA4Nb3W4STJclNt4RKK7BvuNxtoQsrdCqCuZYLx6OYyuAB3orjw5vXHOyfCMui/UGiyehmfj1", + "algid:sign:RSA:message-PKCS1v15:SHA1": "LxqCh4V7k8iBBpluqHtBx5MqQhNYK4wsOpiMiaqLFASfK7US/oH7yEoJvTmLw+d25++4DQIYm2VP9DWsg2nOPl38TwNPXvCrK4eIw5wh+bqFgKastgLcwyETOWYD3p+dOe9XkFGQjONsVazm4FEhE3N0mvm8Ypfn8uZ7ZQm9tA6uH9++", + "algid:sign:RSA:message-PKCS1v15:SHA224": "d4LnV/nlcvnbjCkhxQCWksR+moMP1knLdurLTICDsUK8HamiYUcs35H/ygVBKZXQWcaHjb3q9suJ2xCPYH2++Z0uzvvH/YOnl5JW4v85cGopK5IfiLPo3jfYIUnMqJl14JCOhZz+LFptVFKJcsj+Q3mr/fV2h1L2SVCl0E01C4kh0Rsk", + "algid:sign:RSA:message-PKCS1v15:SHA256": "QTeXkVdRLYZxW1V0fQ3UW9iJdtjXEMkUPVhG3UH1+CPeOixnjDgVEZS4+kqoNkywlZqOgFS4QO4MsHwT8FsyCkG5tcUj3VTd4yOptJ59ti+Gy+G5s85kwmB8vgCOFABihe1pNswgIlYK0Sk6jVqeKzARWyid5btr50T4XWeKk8OF1rQy", + "algid:sign:RSA:message-PKCS1v15:SHA384": "D2flaFYfEgCkkue4uFe5E1LtS7OMdrfaA6C9rnVXjB1gp25GzP7PAEanN7wCmePlmcVA3bAW/+EjT2KRuxJVsRkHl3jiKX0Y4icJnwvbnDEVxcVbuLF17WI0mmP40+/hwOZDD1wqpNjHdBbO2Jb4QloEf3BknE3ICz9HG+ZqG2qNLLXc", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Eku3C+NT3K/6ED/uhHyux2fc0CaYkY2mKZj2g1tBpRZ9WT3IW6CW2g6/LLtlklKj7bXmZCrwL1JZWJxXWu9SZO60WBM8Ppr6SoXKOcBu8hYqLnxdHPvfaix+ivoj/NK2BjbARkihEBwFwXZCjGNiskeKLg8h5yj/aY5qTNKyUJ7LyIJM" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "DG4EcbiXQclDJ0FCX/nbFIDPV+QXO7HD/ESi0G467On/xqWDBbrz22S5YTvukygeA3j79x4Aj5x5r6PhF216wAW2S3MIA+kAFbzFX9ywSKko7EWmX9oSjhLx6lgTWqjqGK2/zKANsbFNEtc2iMe4Ma5v1f+6CHUfO+zSoWWusIAoEiRL", + "algid:encrypt:RSA:PKCS1": "dE3WKAme2QuETyEgwK1R1aK5we5ztjMuYjaNY03Zj9I7FmUtVaaMuhIkkmHg1bQm87xWYuc2ovcmfYUWBj3ox2gIy8p/jOHu54TdGEMjQoqi9OCR/ORkKIjJRhu9fploB8/U+8Oslb6p3tukLviT7XQsn3+wy9nj1iTVoRBISxBAa4AC" + ], + signedMessage: [ + "algid:sign:RSA:raw": "E5bpDIZqS92FTfuX6f/EpFBg2n24nOH1MLAHhyXtlJokjIDRhZWMtsyQg6zwXaoJ/fwzWlhjrpCWRtd1ewjIvzujfHrt6IZxvu6wMWl9c705YKBoOGyOW5xfVDc0gFyhmwtFPZ57tGSEYFTQxMS3mhTSmkPC02IHHKUMaxmKsKQBk0va", + "algid:sign:RSA:digest-PKCS1v15": "ot1lTy8Vnuy2WERztw0fjtq9VD5JS7lYKHi+MZ6155KWThsxuZIIUDgQL3bTQ8I5xxhGOHHDJ0qLOYuSEQxlsaiZBGmelCKG4HDH8qFvvedTbf28fHl7In4GIVEhRv+YhSysHrIfdtZEPnxxOIFNuTK0QxcT4TKd24ZMaoUK0UOqJxym", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "YayK3BLOkcjWyXufRj0m2Bzi1FXRATdqhcNF1gna5jwRbbSE1QY4MWq4MLeLin5aRtCZohfk7MzZt8T/sIxUTwGKJoe2yb87CTIZEM0DSG7qtPS7qe1DFucVEMPwIUhKgLoI14RfpPkgNTow2CjcW/dl/0/gQmeAadF6px1vwd/1w3J8", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "YkV14UcPKH540y+Mj7Vkp6MJnBzK1sCnTyA99vKH0RqaYgqpFXKisZmojoeXPOzfXkd89z4N7bW4JdwUk+rQdYm2RTpvnXoi7QR0JqqkN+vQ3TP9QlQLMCa2MwsuclcFie+zOVhDc2DX+TX80YdClwarwOdmMAF2e0QnMf3A5yQEcACt", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "CaSMBIMr3GcrGTmlcag3nP3aSUnW2qoNIJC8L4DQXdBZvAwKKflNnsqnoRjFDFMCV7G83bOG77MuZTLLVelsbqjweEi0VNJ0IBvleeohFxTU9NVHoKIwjPZks78mY3CWlYtrtBpEqN1UHPirkCciAdFlZvIPWvxwxGz0yD/IbLoANknd", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "Hp9/oI/m2ONhl68WYKNVCBJbfgzr3TFdZpjYOBMfWmHY0+qluQRdtxM+QVMFH+ujEp98yvgGC4/V12wfyGJZCLLymMKxhsbUF1cbFHjkEOzUSAey3rZeK85znQuUKOgpvCcnZ52MdynLX2OW9lffYHCO/Q9J1ob7U8KM8Ly8Tv4gJcZB", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "QEEGtSus2wpRBtY/A4Z8TtPcxchcAHlI7ekPV7y0t+JICBvFXEsbKD3C8sE0n5p8bVqcCiPmPmUB4J5m6Hw4fAtt4GPngU6YnRCiF4nehYIN2V+vAEDY8kp8SVIlkF0TbFmZNC5mTL1T6pmaWKoAmiuCJQCyGfitiNrYkHqcLOky4Rx1", + "algid:sign:RSA:message-PKCS1v15:SHA1": "gn53c4z/u6DWdMpT2ieR9Osk6NSfVkizCq5FvEUexH3CDol6mjAMotaU8im07PoLqU+CeI8Cd4PrD0JU5N2jTV8mBAIy/mpR+eE/vbsB56EGS6hBepMdUMgG3Xd/Zjd54rzw4+tEYKqT2YOxWHI5FLeTh4vXOMnBAs5YSKtv9mepZEV6", + "algid:sign:RSA:message-PKCS1v15:SHA224": "n7m4+xtV/i7+2Xy/s+Lrn+FaVM8b2kEYlrMQ0aOOYCMncBuE3LAF03+xygE+3FsvanLbUOSHgfDx2drRHPJUbJ9DXyi16QN5E7whcoq7gpkzYDn8MuwID3pTtpoNX+4DAAyWY+5RAay+Lyn7OZ2zO7xul/uKC/x1o9mRb2J4VkeBz616", + "algid:sign:RSA:message-PKCS1v15:SHA256": "WM0nFMDu5HsCuRwNu90O6Y8AAr+6DzE5sHfEimgoRuncnJudG2Up7XO2PF6KqU+x2ieKWSJFdX0zlDKSqloADHuqwrOfY6gb0JycGwJQygwDFher5P2vIU1vXZLLkLLtqStN0iQO/GuFFx21J6U2g63G82TU+JUozs9dHIxBs7clQwmp", + "algid:sign:RSA:message-PKCS1v15:SHA384": "AkBqQ4+6ljxcuYbeEcTI3PbpeghLHZYFxr/OGoiQJq74xyaDfsUsVQ0dQ24774zzI2VlHcIEBvx9qiFNknthArq31UblCevEZTqFzIAHBzLbwQQwvw6LdWOyCqHBDP5Ltua/H7q4A8BqKdF0bW6hN4DXrQdGPQDkwIaj1IpmaQJT0yju", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Gx+M8TOc6smAFLDpm3CjZ57hiH3eiEWlqyhIaYFSRWtsjvO0l5J+sa0Oy1A7zQM7yQsfoFZ25oGUJs/cx8oXUI54KiepX65Z6iQCy7pBZXgy8TWCrRZO/xY5l5Pj8ipRHyMkgTup5wWXpfxmwuQNMW9RUNVeyx1NIl/JgJdEpaE8KAaV" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "f7+Czhp0Y3kg6XPfjFjGoueJ2xorPtO7OPspMPTBmg2AsVriozvz14FHXkjxo+kRnM6ZKz+iN/d/JoSHERY3AWQ9Z3uVTSVx535PxZYOmKgCvzmXylEhpl4NK5fQKV+jaGNCI6Cl4T4W41HRZUETBAiTSWhwpTU/MOr5Xe1XSl0Mp0rE", + "algid:encrypt:RSA:PKCS1": "Fl/Ex3uU/lr3v6iD345HW7wodz7v4msF1nu/LLDH0vNADhHfc+vd4dxT3s7U/qSNQEIuwBeFG12KEpKWhJWfEzXYPK5zRvSIhIbeaAlIpsJb8O9Qa/kEs2Rc5LO9MVMETCnj5yDDlmeGqinV0lVC7E/mycVTug1Jr0ELfb0Df6lhMfql" + ], + signedMessage: [ + "algid:sign:RSA:raw": "m3psMTDc6xYFEbBuE6J7AWqEYGQIy3FwDvb/JNcSSuUiPR9w39nJRdlWeAUrS1qvxnb/ilMY5zoHNdK2j4DPt54KCthByJkZ7Xy9QsQvSgoVXJL9JusH6UAYJRIVQIpaPwrJnWwCpR6ttzGaPW2hBIO/6Df70xDCPSRJB9I1XbWF1VbL", + "algid:sign:RSA:digest-PKCS1v15": "VyWICNXgSpWspn3GoClUw7lKyuS41t42R3msGUHsguneCsy8BHqX8ELgyGee/C1LQvNEGPn4NhvDRbopX712NzdAww8Xo/6vm7uNo8NIcKBZbP7gMrxU5S3gF04c7AT5vtmVCPfjOzw7f+WUjTcInYVDWk3tHbA17gMlSyDNXx0U6Xdx", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "eUEnBMwJeSLWdoJwTfvDwmpJTtnAZ7w248cndGIrFyF8950ZF0JUZz6scm4qCqsF78DEiOFveGQTNKqiuPIXw4FOWI/LqZq2vPRLp8uG5dVeeaUI91+cYzGRBIdcTdDebSMOPbMoNguC65y9bkow0broG2B64S0kkrNp4XB42rOx1NFt", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "gmKXCAqltCqh4N1BXOLsGPTgZRc3oCdPOFnExGdaUcBwA2fIWtT2pNEIYswQyWwUgBjOz09PU9hSGkHaWHzDq3gdSUfA/99rxlfDnIEA5JUHQ4FwCXEXVNXVFdPIUtJ5ODmz4uaIM9IK4WCACXTp3nNB0B5u1Vk+b6uJnvCUy0XSAktG", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "CkQP2tyiSj2reiwv9dDFoBEgTnXrEcUDpgstbKz8y07WWc0jnnAtbA561vmCTcnN+loKisDuBzB8sj2sH8bQrUAr/Z4SGopEtxzilDKWqcg7wRT8O32tNkzctWvSZHcRTY4orkjpTNRG1We63fVWzGtQskbQFgqYjRc9pAWVhBfuUTrX", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "b2I38N81BQ84NCpus6qGgY6lF5WI6Z6nX92hKl1nA6Vx1zceivvOYLhT6WV9aAO0uXwRMqxXbheHBQhSgQemo9cWLtqQ4YhZwDK8Iz3tMhtWkyJPqQlci9HLQkOcQ7DlAVm7xe6+a8Eo3Ny9TDRMFk2/KPCrVpdT6Ca7LXc0tl5v3RI4", + "algid:sign:RSA:message-PKCS1v15:SHA1": "jwXobxBq6bzyzALQLkR8CZ2zZv47CD0MnbuBqji+JBh3w/B0GjovRhFA5O8L+yQxqO9GmeGSZMvetjsqmkrN4TJyj4+bLw3OmhCu9zf/A3Bayk3kr0GizhTiUxm0pMVuILpOCa8SKh0urbnR93F9F1wSQmDEMmdLEFTjje9GduBkAvgD", + "algid:sign:RSA:message-PKCS1v15:SHA224": "k3Nuv0ggnUtLf3dLY8lNkig6JI28g5Ya/t6pJDmCJHfdAcdkITfX6pQjJ0/nbTucWH5v8uAjpBSxdCx0tJYv/UPqfAhCbmImstOegPIsfZQGaeB/JAHRDQ0dxsoyF6oEvpYClvQJfGzhulRfrMz3xYmajzoP/ZLB+9M6tmM5I502btya", + "algid:sign:RSA:message-PKCS1v15:SHA256": "TyskblKb4z9x81suow250RIoPvX5ZMsDGo0T9mzsaBmUTMnCFfx0GkOiuMEsgkv2pDdWgWknJGAyefdF0ctIF4+WTHnQy9kd4T53sO9lXUFJprvMvvjPJid29xDb1a2U3RtmQawcF8pzCtOUm2FxaEcj/koDsV0qscgW35JdFvkzkTDm", + "algid:sign:RSA:message-PKCS1v15:SHA384": "MR2T4A/3GgWLJYHDh9wEPbu//ZqDhqNQVxTu3EzbxF+HO2wYctTLb19AZehe7KT/NCNH5lcM7jeCY1MCxyl2Cy77OJh9J7voayw5qh+ugBBJt2CCcqomfUHEqEosR6vdywqdRkn00Y24krCsUUQaQoc7VqGYSElJqwUOgTPXsDRHe0Pu", + "algid:sign:RSA:message-PKCS1v15:SHA512": "f+EkoL3OoZHjoVh3gMx2y3x5LH8D5dwD9YoYWXwUiOjDjGWM4LFYI+ZKOy+omQtEcngWQEWKv19XROQMu3S3/T0JBfM9jPvM2HsXIA5EGSa9aR1sn/E8I1s8ItKuPPNA0MxG0NtfCYTWxUM/jgy2fuwaA0lhE2IW0WpbLnanW0MQFL1l" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "", + "algid:sign:RSA:digest-PKCS1v15": "", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "ZU2t9DVxdH3xyeayRkYOvij+PaAn+xZMoL1PTM/yf0pBdJqkEvPzg1JaSwMQP0sgCS4zfGtOQg2vRdDsl48uYASUUn5e0k1mqfNi8OFEFCIAGBreInHwNS8GwX7WjdRvhBgdkf8/SQUoo3RitIlRUSi1tuX2dxSeV27e2dfy/UDqt3yZ", + "algid:sign:RSA:message-PKCS1v15:SHA224": "TdOQeZdywNUJSlQUyO3gt2CZhk7exdYxW8ibHKTxAckSYrYpGSDLnzsgmLpqmu1KQgz8bbtWjv0aPEmf7s1HkHnBcwmG9yIMZ/0JlKDVNj4L/T7fvflMHjjjmSx9hwibVME7+2pEpH2M5T6CTZHHAHviyGWjnnv9AuP7/yxpG+NjY1YK", + "algid:sign:RSA:message-PKCS1v15:SHA256": "hc9zFYIijd4MdYEEULX+6aZ58VxrVcCCFLK5IKoDQp6doD7kS8Bp2VwqTdG4hdFrRP+TgS2882RGMc3loZfy/LAsG6cpY3JgtzPF/aHqO9EKxPjSAwLyWhqD+0ZsZIpwYf/tIuNIEJHO5zVr3C/NSIPLcrMXYjtmBsYJWb+3MdthLP2u", + "algid:sign:RSA:message-PKCS1v15:SHA384": "nZcy0p9J5Vo58lRfvXMg/7lLRCyQZlyStkPehWqdX+rJMOY5OyLw/IPpmZ/KAiHFvKgqIZpQt7KVHeNxDmyB5yquPshyyvrwP9ter3HdFVXgK52rZqmQMpIPM1tWhnmX/EUt/6yXQYVGerGXF1txHrZUS29VPsv7G1S7TaP/7KDmTC9V", + "algid:sign:RSA:message-PKCS1v15:SHA512": "JhFgheCKfpA1xcubGHRqUtC6Mjc7PyzWtmfrcc8ud1AHPYiCpMnlrGvpY5p7pDKaWmlK8S7Rznl2r4QFtmEWt1de0vN62VH5Nwi3kSi6q3ufvjpGqKcH1p12o3dMM4qbS8bbnm2bIP5DmSOKAIP9Acd1ixlgomioCBsS0mm6U6sbZlCf" + ] + ) + ] + ) + + static let RSA_2048 = Fixture( + keySize: 2048, + publicDER: """ + MIIBCgKCAQEA3HI7SZJ1iiQ0b/6ow546Se0IuxJOyAqK854X/uspeiIVUzhDlC0cvUEQJjmo+ZfitKoH94eV0RulbbCjNUV0x/1OKonKJ8anHQ5tgwfXu89EO/zAry7odLHYTvgBoJXcM7sofzPdFuwUYXj/G1CKO3EVvF4sTvjFvfq3huDdrlrRGuGip9mWTvcH7VMFOPbIhLWWgwMyBp9AHTisQCA0YtRdnSRv70dAcy97ys/vy4Hcf2yV5HlryFt4ewR7YD57CSUofxsH2lZt+1uvQ4OfyjKvwN7HgrGUGL7xIVxddeAK8BeZzVAyp0sroRwNYlvGGRijYyJUut+xnB16lnSafwIDAQAB + """, + privateDER: """ + MIIEpAIBAAKCAQEA3HI7SZJ1iiQ0b/6ow546Se0IuxJOyAqK854X/uspeiIVUzhDlC0cvUEQJjmo+ZfitKoH94eV0RulbbCjNUV0x/1OKonKJ8anHQ5tgwfXu89EO/zAry7odLHYTvgBoJXcM7sofzPdFuwUYXj/G1CKO3EVvF4sTvjFvfq3huDdrlrRGuGip9mWTvcH7VMFOPbIhLWWgwMyBp9AHTisQCA0YtRdnSRv70dAcy97ys/vy4Hcf2yV5HlryFt4ewR7YD57CSUofxsH2lZt+1uvQ4OfyjKvwN7HgrGUGL7xIVxddeAK8BeZzVAyp0sroRwNYlvGGRijYyJUut+xnB16lnSafwIDAQABAoIBAQC2Jo1mlWYZ5yCNCddZC/0N6JY2PUJreIqoEhGxyY5UJKWKRgtQ/JWqq4A0laBR3Hau4XAD0DyytC1VHYc+FU4RkfRsob4wb6zWDX3frzNLNFAlYQu1tQTOp8UcO0Dc9/cjp5omwSwGLLwKbngckcgmpaJYK1hhSJ3cBLZw9I036rm+EvVvkwOh6eSZYgs/5H+sANNOw4YvnSGYBIvrvzcu1XmBkJW1kcSg9OYnih4G5Ac6/etDCg7w5umE9IYq9b0GU8Zhlip22tsCi18ACCC3Fb5Ki6gokyyjLzxSes28QwAVUWC6WurbsFTRF0Lw8HC0MH6r2XOwWXX/7iliCCNBAoGBAPfHlR36CqIsXHmp1FX1tMYLt0OprKN7pKmY+QfZoGK6dxv2sbZxcAuNg6Se4J+r+QThay1Q2BjsoxcFHj6UQNoC8ZuesMB+WM+1o4s/UUKUKclj736qjgTbr2La5lJWn+BXohhICDDN9DdV1JJFHWniga2HgZcBWr908uD4BB7jAoGBAOPCgPURAbrkGY9/B3Sr1HLeplvaGZsylD4lXkuPoc4JRgifer7okdXYDIySFXv9L0ts0NtHUrm2l3dgp3FBQB2ewubS5GDwe4xbszeD4R/Vc3zOuWq15YLNvWBastsr4P33kW0K6wW2kYjEPpMD43jldhTszB9KV/LTwTqT4Wy1AoGAYtsC2FHhGjC+uF+UcrMz62vTMzCnyxXSbUO133bpMVqZmNOEtXhurn1IT05/6dRv5o2U+CBwBwmqS83j8i2t7g0MnfzjIfmGr2AVnsGlRv3b6hhv/cZIIRIQ2EzjZWhgIt5zsmJSuj4BOG6K/8yJXqxa9oPApSGKNiaPnEf3ROcCgYAFdpDpT/MerIIAcyeWoNiDuNt8sIqUsm3j37mXTmavLoHDiy/CjImS+4+xf3+MbdJImN+ZouhVFBAmCOd7S/lhvIEoUD6yJJKSF1EBL+Sigtg2Ui8YZCyRKqY0PXi00SSgcuPGHdDtXie3hB2MITe/mqFudw+eYIYjiPjFku6BUQKBgQCnj/UumWRvGq23MKiGMun+xFhf0t/EA20CODgEGhYvRHESGNUAq1+hFaP9GTOCI1XwlVD4oWnXfhPxsiSujycTuY6K99xph+vq0JHwkoebdrZy/usqt3kxAX7EjhjCWP1Cj57t+HgDJH0PtwQ+SjYNW2l/1sMekTENZwon1PAgQQ== + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "algid:sign:RSA:digest-PKCS1v15": "t0M+coAeAwM1hzg98tozm3v4+EAXx0n8urSdltNcuD/T5+oO1g9MULmoGAajRcmHxtUBLtcfmzt7UcKlyPp0Tnd6lqaNT3CllbWAROXc9pD/AQgICxHEZJmQdD6rHsEWCsmveWnmX5Ztj8w7XB93eEfFqfkDSTv9cMvSdS9f4tHnqBsupv47YQe0rQkd46NJUKaJ4wWWW5ug+Hbp7u5bPrQp707SIBejOYYxMIynbEMGWDn/UdEqcLPgGeozWm2KJ+77KLljvfwEHZvopuyx6kHHxa+kZHzrUOxjdKRr+Y1YGyyZrzT/G2z/CgYva/qeQkLdwprZcsNC7jCKndDVVA==", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "YS5QXgKmNGmOlzeDI2C4TO/Tu5uPnE/5m5EidIUS/IRcwmwQ03rFHle61SFSGJC9unwwGpMGEl9lNpVyBZm+4HzIyJM3GtyY7D2GNlcXFCKRlU8VDxjf0+LaDkv7unTRHNVtiozSs7lZuLYYq18cpvI8lgqvKqmLVSpujSwIkRm9kxDrJoGCR536/uxlA0+rOvVwgvcFEPCxekuR/Jqtqg9fZsH/l3BHkzzOOrtG8mjpupUpg0X4Q0lHJD7+oKvO+ApoKD8oiOufkXhyQZrYvqXB18QBN0DesPHgGQoH3vmMtjSZTWOsBkjafNC/Zfei8XEvhvr+7lY2iWlO/fMC4w==", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "hzmuMNK65BJaApJIE3NepVyXOzK0U2kfjtytpzQiPnCKeXY0XM6MXb84qsfphRedNVLzvspDCN1nwkgiOJKHYtwshCA195c25XRgeNcg9WI1NS3i9ej/r4XviRa9d059XKAneZigzQp/Pb+Q29bM7zTeYh9dG367XeFlYvxh0Bf00xXnY5vuSolTLI1yQMqYvVhnnn1nUPzeGIHlzaZ8xYSGaF4OPxx3IN4oKmxqYrvFQbh9FNf43Y6CnnyK+WkflaVdbhX+Ge+JxaQbrZKu/DisqzSSRpZisPk+9FEbqzOoW1wjZw6IrIp9OquFlIK36oVKp4+bL1h6SCIuurqqGg==", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "x2/m9kmMiHIa47adCIchcXRVQEYiXlT8AZr0yZkadhKm1A8SWWya28MkfR1qSNFvPtTqJYzhKOjrEXX5aWLdjTN7KSra8IyMeF8CNihjVXpvHChan8U5PCouuv3bL3Ss0xe9f6mkeDlgZrCztNoK3OliQZslKcz5wkUxZU/h/PuETnW+8VFxPWv7zCudYnn3X5t+V357XmZXFjLqnFvnh284KC0uBVOFeEhOh7YkLdDAQcn0LIse30B6FLdBBPldhqbIYjCIucIzT7Mb6a2+x6EQPXxNOc96x2eqFXHXXtNCcNwknNd6gKgZ0gV9NoeEDoWZqUqwy0RpbNBxqKHn3g==", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "rj41lPJ95R0pdTRr+e9m9/lFdktP1QZJ6taUY44ridX7YcgEPZn6ftnJIHgl66XSjImwZGzgFVB/y8Ekt1A+fFbImQzkn1zLUl29J0cg1qM2STqxutCV3JMDxjWgXes/yGKg8o1ZpSMjEeQ/4J0VMpbGPKeFVQL1N+MFGKqDk/odhV6rCi295zThTxWRc70mF6jcGEf/m/y9yWcDFTA5TVqR5n/W3xJaZCTnken2M69wuY7LdjI9Y9TZRa0PrVpMgq2ppH89pwFg80CVqNQwBLW15Lo9b0MMlZrwJY1d6pfhSFlZALRwRCMRLL/vROZ5qNf1lxCuomK8uqbnGdyOJA==", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "Df98neyN24goN+prLICyWpfMAh6uIxDLmw84u3E/SE3zJAlg0WIK12ZdeLVJ7ca5mcQEINUKD+vgSRNyW+wf2hgONCOghshCv1LfSaUxmcHBWCca8HAK9isC7i7pJoe6yn/BzN1vJNXDpkCjgyeVck7fVK1uqxqxVl6wbp6UxUmcYnLFC9VgsmMVw66F4d3L3IS+rLW1iJEuVg+TPBaABdtGkAhWbVdoU+7q8uZK5E4W7HOC9Cg7y/0SBEA83jEnGsMctGd3X9XwfXSQzpkcm3x7hQErZ0gAGORYok/3JDDVzbmsOpDTlaRpanJl6j3YGTF9pnyNiee3vJp3A4L92g==", + "algid:sign:RSA:message-PKCS1v15:SHA1": "WOYji4b2Qk/TaBodcBNUfAC2ZHuB9ziP8cjsSHT0QlOVEIyQ/EHvzVEEViTcdoliVrgQE95nAdfN9e/9YFPBnVHN/UO/yD54IFSqc1rr/0xABjdATAng3sMLh3oiNQ4tfxVNOLHlXzVD3DlROZIru+V5D6eRlFFMrye+PYXMbYZNnaZ4mktcEJvpJgTI/mZl09FBLSP+yz3sZqxvVDEMZ8CAvIztzbc6pWozDNRtDfi0yWnuSPcnCF1eJHCr6DTDmsOXV+i9EUrsXABX8zs2qcCfBp/+3Q7WwLRWr5Ql90q6qp6h5dtUGJlFe8kPt/rxP7AUnI7vSRIDcqDnFNtm3w==", + "algid:sign:RSA:message-PKCS1v15:SHA224": "of41mKNY5Elnz/Vmhx0t8vPi64slKBYQAOMTVOXEDa315i3pTAcqj2EomfjQKA/xET3kUqHrXRSdpn5/8k+w5l3sLetNHHkw7E6DjYALCmrJS9RiFZjlMlYtIleeRZ9bevs5OAZikzn/VIr0wj94nPwbZB46nfLJIHgH71lR+SuzgM11HNLq2XqP3PkUZ+leWxpAxZBAD+UVEiMH07AxbzGEAiLdYvqScukU9FPELGfnaLEytoLS6ANsVPOdBZ8uLcH8z+eO92cFIJhm1Tw4ap0a14TReI2EKVPnQmAj3eKhWD6zMDfuntKMfgcC9YmL73vBUopv3SBXGpmjc32r7A==", + "algid:sign:RSA:message-PKCS1v15:SHA256": "F3OeO7Dz9jes3ny8+lFGHEVnPgVORtjtdi6/VEU+tENT8rRzvSLmobrYHwWTQoxfnN40vx8YSGcLesZ4evsmkCIoXKGK7pdKFdTsyBZ27wgzv6DTNaQ83arGmkawo8tY6NuV7FFuwg3T7r3pK3uZFVp6rMhU+IMBnaHauqFqkRMV/E40hF9dXkkUiyd+RORbOoQfUnm+Aj+fJhm3I1X0oiGhGmEbvbWNlSL+gFii3jen8IY4zMdWRH0b2yjPH76dYfQp5ziD+riGVmtMDCYaeItxzespyLMoy76O6W3ln/GIJS7F+Ur58/W2KGaYFBBiO29XQig0nNCpduv1cFWreA==", + "algid:sign:RSA:message-PKCS1v15:SHA384": "DhZLYXU9TlyzK3Z/9VeBXlOsAU/M1s3p3HFMYEq2d3ATDbruODfgfH5+pCcWOmtx/10t8oVCWvK99lzva01C44zp8GfizDnvLaeeGDYdIafHMWFgv5daHfyhhC6j9fUYjTGxINHR17FKr9FNKS69KQZa8U89HgSuChXTqeKXE5rhTdwLo4LvJzywQQzFxB+BnUAW5lYhh6RwFxQ5bwWkB0Tw4wb2x35yXuPRRNZ7ZEqg7a+FVY+3MLJlpYGsUncJo61O/OUiL4+DaK6N0pLrhE1vlITu6xQQacJzsnVfHKKbwmcsCW/tEkKrkDEQRB+evEkfySnj7tKvrRCp8138aA==", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Wwn8yGygpyV3vmdNVrO7DalkBKCjmrf4qvJqpBeSkpsfyEM8/WzSkPPBq3opw/owwqBCZ5eMoJ/jLDmtSFx3x/UuPFSma8ApNeVdYPokhmIFKkjJpKssT2xDsEIRykxx4cS+I26V8/S7ckMrh0wbzVgf84898i77qTVdRvabX4bbc0i+7Zo48dtexGTMDB+Q+RNrp1eWe/ftF28TXl8+smv8OkKpItUTX80XU9Jz9oPtpCbLyvg2nQlcSnumjtN0ViybAo27gjqYUngTUbvvt/K470mBQjMgCE2UPIPd8imJrvzfzi42hi4vkqnr8B75ju31zvds4xClioSw0pqUkQ==" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "mGwY+MlCOee7LwmbzBf8mN30wGoqOORpMngparguNXQ/ZTC2NEvE569YsXBurltZuewBtDUu92j64qJQL5RZj1jf8unc7bmZV/t9wi8Pp7WNivGUELCTbIl59FinzUX9RNnVDzrbeWUCV+el8Dgi5QVO2Imi0IuogFGsuaKOhqRFWjEGShlog/rO2lzW52qOJqD+MLlkah+SGwmeDAtZn9msPRPsDg6vUwdL0WXpBegdb1weJxYrDhQZds2jOWsNMoneeYLsJ91Mvej6g1fwGIuuFqyR+Abwko4FDJr2GkpazuL5i1cKzeDxk7XNl7d5rtV8wuvr9n9SikLJWIA/jw==", + "algid:encrypt:RSA:PKCS1": "vdsfQjDQEgDDknqlU5H2a1QSjFVqwBcI7TiN6yEuQfqv9IWsPkh/7stCQupoSsDj2Z05i4DjeN+Wz5AqXHh00FT10P3QCckidxWQjTCQYEyPjVwQz2fZgNhMeKnDnXKSdYw0I9CRzIG6nPcg9SGWBdvDM6T76kHLhvxndKOBcEWOgaJgYRV2J53CSFHqz5WdCAOAybtHS134YtyFxa32EcUI51hjfLdKePO3Zc6Itb7bYIsrjrNpbbjUXgzQaGP5D1cFU1j+m3IONsBKUXyq5UEmajiwNlGYcPaHbanack5rMaXgTTLSrxj42F4ixKwxU6zVYl78id5qZSZtLJSJAw==" + ], + signedMessage: [ + "algid:sign:RSA:raw": "CaOHcMXljUkF0T6+xqNBOMrzTqq9+7WpWkN1QkhOzN9Pn5+2m2y8NYFsdBOjeuWz4TmI8z0n+yDnl7psbTbn4KpXb0tm0HJTW0gcJS3bv2Cqw6+SQ3RTV6JzRBFvQAsZbwnUa0iikwLYlMHWKMFBT3NTIiOouPQN1RNBKm5wqGNFkUTnR/ILFE3hUVW2UdsySSAqvs7SLkWRYEi+WzZsmKv5h4ml5hMEX42I3cqmzkf8bsMQ+qT2sKjmt1bC+F0qbIyjsujDXAWuPnXNIT1AnDT7x+xPQ9dChdynHRqtUan+l8JDgk60oOghQkv1H1hv771yplvJP9J54NaABUBJ7A==", + "algid:sign:RSA:digest-PKCS1v15": "fyIf96DhRzHOC7r3JF7heecK5ajv20Atm4MhvT7Ga+ndRbtKLxOTVM5Uek28rfXvxJ8faFfiTTse0Bl+ewsy2WovjulJSzHftWACJiCC+40aUOYgtRNH58OUC4qn2m4UwtRHm2NEMKNdnGRvwzXa57WiSulwzy/QXn4qrVAHnAQl1xHCSEcDUi0fEY+pnGNJQczA7JuL2qN3k5a+66t2KWRKFvnApP7NLVjVL4oHwyRqsLGa7y6Kk087Q+GwrzHNvF0hz7bzhjxjXqpdnexkKeN9u1itMAmIH/RxDnagMgw25o66ZF2L29fJn6zn0a6ZVZEqryKaMlbZ2vMja/ka8Q==", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "c2cnpPTRoCJcTEV9BXt5n569Pv6EhA5hiXoRxyJfprriRlTb74nWERz42DawK0n5zAwxGH+UTKDFU74iCT90ZFb7Q/uNR76hPuX6rj0g/H7JltW+V0ITHztNl9V6qeQpT1Dv3BEG7fIscpDXwl/BuyGVvb/xqw3ggMGxWCOlu3kRpWxDP3GsyLbpriw1rWxOuB7+CNXghfN0c1ajiJms/DEr4x7zn1hXybvfBElDQp6D9C21paIF+i9gGIhdajvbz6r9uGOOpEJVf20kG9EAjgpRTUhHAvbNd8G59Di0CS8H6GZRDj7Yth7pS0Nqxeb7p5uu32nOkewlZg+eGJ6hjg==", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "B1BqaavjnFBJWwVYWoK36yB6w/k4+VYfG+yjgcyiK8t9fNZY/LJNkvtd1eAZFbUltunuoDafqq0lpava4aWtjwXogzFcQddFTZvZ3UR5+mX4EmTJrLeqnRQf2NH5p0eWqLLMCSxlMlpk4MIxdOY0R6RMW2sfjRaYSr4WVpJPQjw2QlBoNOePs4w0wrRodR65hyFxu7fjoRtXV+Ju+ZdcTZAEEBjT0CohP/unf8czdwbNywvT+bm6DSbjzLeQ0HRKlK3nSM38HplKeob7+jGi8l6oAopAgf7VYdN66tk7mfrgNTzy/dIlCbZFyJ8MnLY8WME4+JSdNInQsqPJaKS6nw==", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "m/QSRdR5dPinzrJodgs3+CitudyEu+dMO4ehlORc0+GovBA8vQMcfAy3hGmLcR6fJUh+TnaJjS3Mc5cCcPGPuL3Uam/k7ZkOogO5c8p+J0bj93A+3u+0rk+GjONGfkkR2kgKtFa3anJFMR+XPWHghhGHKqNHwL2X7JvW3hRDSCOhC9gALJ5s/LDkkojxt2lr5I51UL3JQLceKlTs/zey96SK8vGcCASUTzsWhXE5RbTkUqWF/+lnbuRpd96VrsTVsiUNBdYufnPSxQAhG8whZqgxGmOEBdY6ff/Ly3W5K18vF+NfAnLJuvmsLD6xFKTqptiaWpgFEX8KiT2j3b2hWQ==", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "T8BHMHkPeA3cyH1/97XReTybYgHYDXxQ443epTi4j6xDXP50R6aNMuqruTu86SaTSSftEtRUp+jvVNFG/b8YZ+wChZxRagoypgiL58MS/WWh0TuIL6guMeu6+U8JlZ7l4XJATrZ1PkIQ5ZmBfAxb7ZfFdS0j9Uz+rlkQXZhWr+0j1IMb8GYdilspf+s7NBdxtG3jppXNmxv6UldKTz/gHy9xLfUyLxLNUms/KxBot8ckLCDK4/iUuZROm3AhHhtl6nkd5V/oRVFT2R36eLvsI/hyuJMH+jRo7j3SxdVdUX3dY7aMaiTgScp/ZvdPnMg6jeVFei98uV140sielQ9aXw==", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "L9Vfilde/EPKT0TLqC1HUQdM314IWsNFDEFQsX87NQsNckkoyvc5pmdGwiN8bnEhcEKtv1dRLguZ1QKNt+DPB/gSjyUFrTttbCdkimc0cMHZ299IWpMQ48ouq615RLQU8clXdF8DdxP2RrLDRwR1cQikICVYyWhvVPQWjegemUyyDGDru0arNwOv8SOVgTs9JDKSnyCistbMV2UAUOBiTcL7438XRAnxGnOxsWLzqAdhM7LiGARvYZph3gCF1Esf0DxSuAbZRvcPClAsWqUyoGq3b8eIgGrgXoRHpc5GL3qFtRTK3Qyp/rvGNS4x463J6rqHwiEcy5YUE2ZbG5bkBw==", + "algid:sign:RSA:message-PKCS1v15:SHA1": "fI1C2MQN/NXyAkBUpqkv7LdNAnbOp4npAmQXwSxk41yKNwCHTS/kIWGcOp5YQO4oW+J8pKpVULa1N/z5Qyu6cu7rJA80Bl1hrXKwSrKPGJUUPlpsqQjtKpMEIDrjJiEUuicVDxWXIeCSH+M1RJFnq34xe4qKde2CzJQXMHORUb8WPxboqLjRGXkVm7biZWiay8eDT5ye96FOBWwZ/OgvJ0TP5IrhUhvufZ1bHZbpIRYJucGBbBN2jCyvZa76StqnEYxYdde0DgJQp+S39xD54OJoooV5f6KzBq7MFdRaf6ITBi4DW9Dzo6ArannaESM28zLHkMbAS0LMjpunvKEdug==", + "algid:sign:RSA:message-PKCS1v15:SHA224": "qEkbcbuxvqAfofKwNZ5V3mxFQvkX5kSAezgMERDilvkY8+dX2NK3v1hzGEdKsSyUpGgtTcLLhXSeWpMHeXZpJp3gUpuLFoeO55eaQZM+08WOf7274wMRI8HfXezutt1MCE68FV4lXHXgnybvYP3D3Uo9RtKvtbI/IxmxNqqptMlWNLZpgyz81MRRKyqlNpjPBCAYfnC3VNa3bw4/tfmxToYBBD7u60QCRKCSivf+CJLtuW4w6l/NnoWIzxK7Uq5yHpr+AbZ6aMMMqoqFvgXm74GtiASgcIesv5VlliHFLsUEehvwxwAfiw7am6WMjV/fYEuptK9xigVD2YZiMCv2Cg==", + "algid:sign:RSA:message-PKCS1v15:SHA256": "fhvyoCHHpxdI1sqryomWcGh5li2RChQYrFo1aIprtCIKunX0okvEhx5UajK1zqmMW91sT+5lvES18cpIyCuLsnnqbwF9Mke1eW3Lg/stCMSYMCsXoZETyXzpVhQsEMCj3KXXGrnQ9ZfWp257V1BiBlQBfJjVUoehx4NdMhvt2SRFQZ4+WH7ZY1isZTiCjTiSgVnEx8vHXIJp2bTqargmOXPPsCaGOXqTjbrKJt244C6SOPp2pwQ96WBToRPEujWiGmXBweyBku/RPcoSWeu4Gpn0tHcEbtd23FRhF9nNIAKlKd49Yr59FGohWnNqyKXLvYFNu4O/cwc+SXXQMcrimA==", + "algid:sign:RSA:message-PKCS1v15:SHA384": "H0xtEUUQBdCIHpdZ25Iu6V/zuecYvpHxYQ02PC4PFI3cgW7t4TGaD40yWy2I4KQS2b8sLBsIYe65tpp4saUiwPtQxyKcqg7YhYYWOmdn9+OF1W98BID0B/4MhWZMeYDH1Xq1PR4eEPLJZe8qZYPkZyPIIpQkLoTxwoC8zfwceosStdqxZ/QjNTu7hJLnFXKCtkc4vtmVXCFY/OTaG5ZFk7Y/zk6CfvXcGky5/SnXqNOjvD39EHmYbWAX8bHxucntqpY1ZPAr+NReFUJUvF9UA78h29oc3uXYsGoSotJ3z5rQoXzHsKeDM8KLY531l7cXePFuC6Fg0oFG91isXHn3hA==", + "algid:sign:RSA:message-PKCS1v15:SHA512": "ddTr+cPSiJV0nMcjP3VlhXyUMIA4tgW9LHhYEZzvDFBVINKrL/eL9ht3UmfgcHg/HMEilJOlRsHpCF7VIHwOejvb7ekSnySWuTX+5KiRgY9z1NmibYwEF/alJLyIHzPoOSDHMcsBUadTh/9CTY8rQXmxsKaENFdd8XfBNWw0sSLackcgH1+pgg+2fx3xTbYwuFrcfJzIkKQpCDV9CMaNsh7BngHJ1qVADZESrxRqwuJ56L+aMMTag9SdPGjdHambJX/yZbjEtE5JcDGu21IUvrcF/0hnmnzRsmwiO/PK3m8Ek1surYr8Ohzssh50FLtASOEz6gXQQpMYO6z3He/dAA==" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "bbxatm6qJob0II7nkk9XxOJjtJ46vNx+sraHGOo6i0oUbi5+iZT1kyVRnm/RLir654RVkTFT04194uSN0iDnbfPJDhrwh9m1uHaH0XMAxWStRhCMYJSIuk5YGSupjuNvzcbngTK5O8uEWWiVNJi/UmYUEtIn73FN9h8NbvJkjN90o+Qyb4Dnp8cutZDNoz3NvVufvt28Y+w7FR+i186lZ6S2efzoeHK/h7DHPrs2IQg1UxUP9CM53IeUvG23CXZdC8M2N8gNIcwRk9b5RNY4QK/AX+qr1lc1D+VfhiTYiICzedKfoyNZFmYkiJZiFQ6hK/QsmNkUAzgr6Qe0T4oI8w==", + "algid:encrypt:RSA:PKCS1": "RNk3JqS/irwF7LuAO4xNqAzPxzAksnzNsT5QioIGrMzThAhcvhArjHgJZMC4bBVrL66y1fYnNhogRNgvOWc5CUz+kfTQz7EbzgnEAgeDRSrB+MEHes2CTdGYoHNXLv4bSpY7y/bMZVX2ouhIvESYASdyJb+BaWRs5heOum1E5Je5hz34P7PlKiiLzoGRP0b3du7dbk3xWjId+g4kG5TRIa23tuirovz5nITWiAzNTef8TwcJuwYF6QRUn4Tyhx308VvqV3kKHTEU237TL7NUTY2shlv5F/hnA9u1KfvkTc9vfp7HZjTF/ufxNOZ/PTF8DO9OTbjGMNkGnag8bldPGA==" + ], + signedMessage: [ + "algid:sign:RSA:raw": "IwhvsO1TLzCORZi0n5Kebw2AOZybVYZHOC1wO8YiL2dYBHOcBIBTnmaeaHMn29cyfPB2POsoR7NYSZnpFK7Z4ikojQKOJANr/RoOPjJMHbF1QvuS0vzSbR11wC/qKAqqolfKzvVsML1Gacy++loAPiDN9ZknHDbTywU+1yeDM/8SwZlkO+kfwKgxjZEsffkbx2FMn95SJVNVqxGZKgXJexu4il8qvNzSyp94hkXzMyCSLS+DOxrLu1cwxesow/+clpw5kaBfmPFRr2dMN+ZJgHaK2ShaE30YpGVojWqUHKx5I9xogX9t9/ybEICziP3iA/tKybPA5AOnxbuGPvUZjw==", + "algid:sign:RSA:digest-PKCS1v15": "IqXz73PgySx0TcBvqT7fnc1Db/v+mAza7pKXEaqb8GVvZXc+X1B7iQ0o9WJ1KQ4m/zq8iAmDsy9B64eOV48mytrEbvV+Z/8M14oGd/GbbjIsWxGF2ksS0deC1j6uBFdFiuYptBSecMOmh8VBDFEvkMSvHvUVbssn29T+wZIkx1XR3wMGYnyZ8kBqShFPGWoSP/BElv7ZKIWqBox5qVMFQJ5WdKTAtp8296gg0CSwmRVayFJQk6hYSd6yj9ON2X3QGgaIYXTgMrkl3A5jTTtydBawWKZkdgWcGX468Kc+XOJG2lNN41Vv80ylXtbYr4wHxx0q5MDp9EB2TfLmGxcbtQ==", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "J/1XWvnJjeKEojtDBX0nwFJNVh0ONp2GNta9HaaNBmzOxLDg1B6Ejz94NBwKQDWsZobRDU9YRJa7uv0QTucWvRW+30dKRk8B3FFLzofW8wjJ6aYPN4WH8pCHcVpFEgLXj+i0Ic+3ZwLXmxRdFUkR5xm6yw5H97HgRH42fu+Nx49z28ax7x6RTwpN8nTUxpJd0b1uQsxmMUcYut9l2+B5xuOqy68HdyRRed7O9BK3tKaXOiJ41tYN2VQPmpBrg8mgPEK3jXTw0PRZDXknt7tOR+RetkLoTw/vyJg68hO/BI/R2W8IkdiYJcSvJuflKIpixthAQSxXtC1bPwfzsnoHzw==", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "l2twE1EC+epUT1n2Q5Vh9BN7OicgBhJIojm5mN++L7RM9ffpj+y64s36WF36ga2LwDhr9cI36BKyaSAVffuEhOyQP41pmJD5/Kzkabgnn0mbHY3hxCbGbGVNt756rZVEn5cKE5flduJN6F7NemTa2QLitxZjpcbnK040LF6rETddCeLEy/VyLkhHsPMPrwNV7kMObtyMZZSy0iuSXvJa1EyfPS8MWAtPaHA7jMKCcrBYNgNyu83S/EcjZMI32CkIXR/9RleREF+sjs3Dqw4f5CdlKE6uOsABnxs4c4f1Fw0FyvWUUXABth19hjvSBK90dL1rPGJemTReqDy838SQ/A==", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "jvwFWBg7TITy16V2c42CWW87vPhatuCCskeYmkrMimB7pg+QX279cNYaHdjiFepdiOc965KrzzyJtWjq9yQByPkPA/ht28Wu3DVtGOyKFAMb3e9/nyCSbyyOdmww8Jl4fSBm1PxsRZCnXFXPSgEOZxQsIgmvNPq940mnnQx9Gmm/MPNlX1esgz8l0blfsKv6iqCRypTUcalFshfaoyyuy5BXzvtShJq/aTiT/UrmHFpCs7B58SfI8M2X2WInz2OW4Dwu/0solFb0UBRxeZzJFkGn80fejrDGjM8uSFYs83s7q4qDkfsG6mguoRH/QmVkk5EqUy7atiO9cbc8ua0g+g==", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "q/nfxJuf9aT6+fidZfw73k4h0h3Uy0aE1nnhKTQx8eFKbM4pAek38Xb96vCXWKroBbNkjETL1Wnhoe6pN+mnZIVzrL78V7jvztvt/kUJR2wpDjbtlJ6DqseesI8NtxQrKV8KHL3jze24wts9pgtXJZXuP701hQDybCwErEhg3FTBFlGHRc6ZPHQTAs58uc7AvX3x5+FVTpktZm3e0EcTC2o0zhbYymrn8qqU9+IdQEW/MWMDGvG/Nws/AtqTkCJroZ1tuNN8ZHq1hvZLkJfzyK0M6B4BCJvclBAmlthir2H0zb1mvzMJURBZwXvigiQlPmtiYJ+eZ2LU8dC79EFyyQ==", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "kWyisxyJcUa9GpXukWKWv7HY3oGbkOt5NrfiiaSVJAIK5qYVF1IWnTsd375mCOqmuUL2jyrYJRLatKzMPhdrmNdoWvOcyt4Dcr5rMtHviREAAfCc+saR7eRmW7YNl0q3LTZapnqrJ+TdM/dKN5G9YK5t8jtb+rvB5iQkHPxrUd1mjbqUoYZggMSHJ+Hw04cSsd1Eohy9ZLclyVqc885aLpkftN6pqX/pNtMTpBexE5TTtyyr44C9rwxpc8ldRNVSYHoKd/BWqouVPO54MMZNiA7yNnXC+Koyu+8AatWzbl1R5vlCWiC7FJYW6T80DFFLproAsWh7dNw2buBH5qozVA==", + "algid:sign:RSA:message-PKCS1v15:SHA1": "QxbPM8B4mgNeO3lCTvPZ27WQwf0oIY0qjmj8l8CAK9g5VkMqjKWuW18sEgwIcaBfQOsZTJhF88sDJ2bM0DKRsmyQzbN2ogct9ADiIUYTp0osazb1uufsy7pQC+Nm2Ui/uGvb8lyYKQ2Nsd9TfBRx8hKlO9uTvcaN9jAk5ZF1etUzfN4p3DbQletPXJVKQgWOWkXD8U4F9BTHVK7IFqZ2bLkeCGppJfG+I8iYqz9D0r4SoojXsd3QvNBu8DeWR/6rrCyic53ct1K+fnrRb4oQZvREG/76oaqRALAyOKxDBQLvzuGyoSVxWfcBRMTub+dNVnvGFPADj7WF5LAgWqtGLg==", + "algid:sign:RSA:message-PKCS1v15:SHA224": "23yJJ0u0uFGL7uj4NrQundvvktuFgbmi9A8s8dFmSeZB9hzp6FSQYd/CKFYWYX477UCM9IJx02knhQbkYyGmQf/Ei/QIPkdLxrKmfobpgzUez0HFrVEUe3I4jLuffdg2vAqk14WATfTbJXIX/3QTUDgVDnsCfFZEWAE2OG4GMFocTr56GesBSZp6V2WwQ2tWbsrGiv49ADKAb0vCWvTGBZiiG3j34d3tHKubkICJ3bcOWWerwXrwO+8PRSe34lDc4CbUngq0JeIDlb3fVEUuvUe1Lq51G/bj9YS+nIwFzaE1YJUxF8iCmVeFPo8pgMIOCqfYkQ8tWVC5t4R4jCdz1Q==", + "algid:sign:RSA:message-PKCS1v15:SHA256": "FmBav3noN6KHfADGmCo+PRNXKzLkRGTmH8iLwEAXxGLqhX31fbN1Hnl2+TgjJLaTWmDmHY16jrpPwtZHETva71cXmDGKKfsMXEtSyz5XS+DSZKHQsokS1/JNyOzIPdJvFORHoWzyc128MODvjBMWU23nTLmgw3cogYAm5/hc+527yg4Ydftr77zSXoXBbO3r1oyTv3qL7FwOui+RpfH+sQ6Y9aGM1EUWqIXkKTfu1SfrAXIiu1J6vdoTLy8XTQrPcIQFa15/KMCUEte9Jh7XHzdWwNncqWqiqHoSt375hrDopMej94/rbqrOtHXo0D+sbyJCpSDPRckMkGDFGkQ5QQ==", + "algid:sign:RSA:message-PKCS1v15:SHA384": "2hWqGdpkFGynqvRJqRu5LPUjb2/X0ZRIcfz7nww5n9N8hbqhXs1SVbz3DNaPKYVHJCGsKs+TNvgHIBWPbveTuR1w4mxHTpx3DUufngLZuwNBfm6gizjwC9QxzHin3n5lLJ1TCEZWJIv+vb+c/lcqXStjUHHWr6WQPtJ9z+3i+O2biW/Y6kNt4TeVXZ8X61RVSb4F3BurYVt9KCuULcMVOsOVbHgukUrBszm6TeUm0DmhEBr7kaZZeSTOSqFmdUhupB+J5zqIxBGlQGaCxXRMUr8YVktewiwmf4QU9oOU8/aok5hq0RsdNtqXcBOXHUtmOcBdzN4fZhuWN0K7uubcIg==", + "algid:sign:RSA:message-PKCS1v15:SHA512": "kJ+yZMsLHDOlNCxQVd3iFgkzX5CewVhhSUpBziZW8CmYEncLaDF1bWpOPGt3ItMtsgHD+rpODAMnmtm3ESFYjJPOho77nLavNPDTmpDZwpVe+guO0GAErAjz8NnNcExLTcSM2kLFBx0eY8N5iLqBosUvJP5R/3vClWN7swE9b/tNyvMIEz0BMOUrA6y1YfHZdqrehs3O0P3jnOlO+Cah2QDx3DkVVjXxy7pZSHzkVJ0X270q9fGcXGfYO4wLRe4asZ7R5d+hMBCLPewjEi0lZdhyYk++jFBXRpKkxTXLKWEl+j3mwKYP0RO20CIG7M+jYqaijMwsGkpQhoX7Bigk4A==" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AP0oc4v21hwhV2XRWA3bNYMZiADeggp/eOaLgeHnMq5iskk2V+VqT3tiA+ezRlH8Tu1IivAxD3xC8nPmqzK8knWa3MeDu9u6VgxxKgl6vzkqrKQ97Rly1+qcNSdMkwLFylS1sa3uhHLq38MrvSdk/eA1ieI32eOzvKcRxGjgKPx5FMgtKZ9pmDVlAjRSxk8JSfzX+HcdhjoDClzaq+pzUaSRnrMMuGncrEsZFn1A1ZbjYLXXKDPpyz94kQsmlpltq+FcB5Pqru2oNhGdrdKHuM921cW7oPJBwGtuOeqWx3JBmZ35NTJiWdWd0BEUAHnuxPZT7+eG5cg0NkugRImxbg==", + "algid:encrypt:RSA:PKCS1": "LSPSLZbiMdve6f5y8JNoKCt+oXwmZBUN6hniDS6XwIDnVJ5uHxtFKuCOzJsnpuXmR02HesVWmOT2i9AT7DTgGX2FWcE9J6Li+Uf08YFjgUDVJ6DkvfZvD/Nm+AVULmu3DxjlNP+tjBOrKukGJP+NzLourAjfEls+H4hLVyaKCPCvsqZ14K+RCGHj60YE5Hx4vWXIpI2d0x7FR6C56RFaQp1xD4LCxGy/aRSBE02xEQVd5AmyJ77xmT9p+F12x9SNOf5VHdYNRT+8O59SMDV+zqWJJq5p/fjZKBsQKoEAoh1tJq9XlNqO/+EJNAF0okqHozXiaICI82E/lu8OOS7sgg==" + ], + signedMessage: [ + "algid:sign:RSA:raw": "w+O0E1zVIWerFfUawKJYak7WEkN6yhFa1uhplc+fLhjemZSIyzzd2mYoAhOl0qUHCCn3j0caqr0mny4wvkeXOSsJ3jH1XyANaiW/OAwmWGhSqUtldnW1PbR2sVnomkTR7LoVC2t126/P6bL8CcWj7knq1SJKjeQX02opRNQpYcWhYQT3/JfxMP7+Q7U33NA6MFGoZHkHNrt84/1jWtJV5gjA2Tbc8sM6Jgc2NjZiX16G9U2g9Idz+D10iWyrC1VHVjmzOEHeUGsBc706AGkrfo4B3GrdW//03YBzRYSZAzjFs0Wm0szKGmvWPItthZBDnjC92DYlatAZRprCNnkZuw==", + "algid:sign:RSA:digest-PKCS1v15": "o/pbYAxH/4KEhBA1AtIGhm6/momDLNqQ+2PLTEP+9hx0VbS4lKpinEpoEdSM0RmAAN8IeycbsQjx1O2pSmDwyTY5PEBXJ65Q4rAYuI8Chn2RNu+2HRnBZbP8l4DAFKle3vka4wJ0zmLCk1MAuDgleKSL/mcFIHR6GNweOjGzq5rhf9pKDeBeoI6uljg/9N15Sl49gto/q5Hx0FtmuR9MlIfhdLW9nC9qR+8NXapgXrbPFLFttr1Lts3feynssnVAHNGsGFegt9/1BYhVgt1e9KBBpktibYBLbU82YkCMbgtSEK4WAkHmJWM9MHzHbzgpX7VafBRSF3CI7Q3Pbw9gjA==", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "PTiz3mSJmMWmlUfvcrCITrEfZPcDWip50wLLNs+ju6w54/m+dONfjz4Bd3P1RpmixwXi1n67xKFjXCkcxcMbph62ywAFLrPG+p6kBVrEHKj6Aqmcv2uao5QquETYW5YJUTGAf0T3v5bjGvRW/sn+BqHpEYdYzS6M36awApgsOXyVkz7GL+8EEaP65b87YCZSOWDSTqpUcg77fOogBIWmZsdw0V2v5Dg/MazfKiqD+l1Zvic8z00BjxLi4O9SN4OJ1ObnMvRA1iKtaP4HHvyErRYhIC6iS/SjJErnCTdMpnPHbQRJVJriZ8CKtJTsMBcuwOKlQ2N6UGqj+MwSydzoaw==", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "Kk+o0qh5GU7pOjL0NxaCxfqIlSQBhr7OjVzjLEbIOWz3Ue4yMzu4fO6Rp7V3CRIy5Xm6VSZHjdt0P443Cvmeuo28djXWPSimXMOZ2AFo4K/G9mM2T+8wXM+NYiRLSpgns8IPSoLmDUTDoCFm1JE6drLVgBwF0YdkQkGY6XPExeylIzrglQ0890fX8oULms2cD64D8nFijfIk9+L7UJwF3JUQ5jZ27rHOdoTLZymtwY2xxwURBZ+9SLO4gu0EGrZMoSLm0nc+9XSmMd63LekYj4zalUTrFZq6wIMPHMGdIG4fFLrznZijGbynsJwReYciX740u3vlhnx3nE6XjNulVg==", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "Y1ICzwp8xr6JVIFvmmbeBIucD19tzDwuj6QaYfxo3AVQY6zIpAHT3WUcL1fQRrfYhxHzXqcmi6J/d2J5LCisL6Hd2q5HkXTO6+N6yrjOuSwvwgNta1X7jvCaYC1qvRqdfO/0xAYVTzwUXHYvNFp5Bvvob/nwsL9EPrxG66hFfXURXwg4N7IPF0Oa+bDG0/+Jl221xsyrkkamByWOwNgWd4rbcrWUpTy0HxwzA78iPivAmb1Pa+xIsqt2ARETluDzsNLvqdEk2u5gdQamQKb2nG/BSQdHcjQx8U8dk/we6xelaOfLFVdWlWSExo+aWtDKgFyactUiRqSwN51ua5m8tw==", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "dHP6KJOoT7Ig7i9WVhpS4BhL1fzC8dCVY58dVAPqwBQVEu9d8dbTz0LBvewdD/xux3xY01tvKErEO43S9ZCWUCWWnYL7vOo6/PShBl8J6zu8yK2ngSMRERmY/feIpT/1V9g8vx/ATh/CYYwtE9pYyZR9N7OpJ592Zf3CrnGduSPO+fEtWY0KCJBOYUIb5jct8ZQ4YTqebk1aYX2DS3BFvpcY6K6gM2/VfAbAKFlDRU+oXbqFOZsSUy3SUdf6kdosEfX48D03fBPGrzh2ljj068hgMX3qg3MS1XvhD5tzs4FoxT0Xzvr8WzXrNoSdtGS/4LHlSoXserjimBWoW4HF2g==", + "algid:sign:RSA:message-PKCS1v15:SHA1": "sB77+E7wJZGvc2/cLrGP2v7c1b+RSe/TCpyiYEfskg284ysKPwxPHGUl3Dr4zjrgk5kRN9byJ/4+zMinXW3a+Ri1GKyGaa24gp6RRdHSHbK0dar/jdhKl7BEK0i/IeBKppD8CLaVXhmC3rnf1xq7SO3hYcPGtpAJr8RRufzvbM8QCaNxRGyzDQofGs9MKmL33iA72ldGSund0DS6Ds73iGgTPJDL6IkiHTN3awshIMa4pw2ZVLgElGZs3nlXF3R7ok+y2N7e4XsACLedES2Hhc6AlxFMfLJqRz0r/4rt12IRFXg11sq7NZt03G9866r8AqaByR90u8ve+F4s9JB8BQ==", + "algid:sign:RSA:message-PKCS1v15:SHA224": "J9yYPlaymi8DwpKp/4GOW+8k7BwS/+FqL3aUB5TwMCrWwCTw6KdSM/Iw0murykqWw3QW+ZsYeE65pmX2fw7EjZVDveZZrMAODMn+qas/mqkk2dXfzAmX8WYHZuGNa3nP+Zljd+FatrQbHI1C9pAJHW/lRsmhGS3KgPRFRdeJXbHQomJNJHKpyZCkFuY2MS4uCzUaGyIF481SV6W0msg0O22mos/cZ7RYD+Dra131yWOucvbOY0INHHj6iRvUn9H7i1jGMXxSACl/MKi34aLgSWKBWzj8A5jbZAtXD19BAURxIXT7X5sAiQYmOlx6Vy4Lxg/8gf8Pc2w4wl071CTCug==", + "algid:sign:RSA:message-PKCS1v15:SHA256": "HJqncQ3D3IsfN1GhntgDmGIx58VOD5sY+kF/FT21NDmzZ2sZ1Rji+LTIIRVI3n6pOVVTO7tw+p5hZOKwvL5nzU3qIL20zqD8VnBcMGJrEI71t0QAEgF/fWu0K6clX52AoQ9vS9dw0oKVQeS4MIlbxy85cw2yAxTLBseAzcNWhXmnQcWAU8lhPv+nAcvKkAjkiZfrn3oHMaBMMBn6A2g/HzGlYfOv6L8wtmLR3h4hLy3gxxyR/GOyn6QCKzIf6aygi6/WEz6V4LHDJelsHLZlQeT49xzasebh6hSIF9+2/WiaR7SBMGJqIhqtHLmCuYIyO6vPnh3D8BYmFstHA7/TWw==", + "algid:sign:RSA:message-PKCS1v15:SHA384": "RumM6BMqNnf2523vugTgajXZvaqvVTMfCAWWj2PxjytjHxihBb6D2hOcEKKEDDhlRr2g5mfrXFWe1GjANnad2Y814vDlUhFHFcXRezPWwIo8XSPSmmq9VfvcWQ3V3RCxmoFUI+twQJY36X68TgTMcvge0SRKQKfhHMTXDRwuyyWFLxmSuzjwAp8HcKPDUqZN3sChPc5DVDaC4+5TL0lBg/dPXHjS150An2hsUQgpdhd1LC+WMcjFnOsAwPZr9vGW9043RhaSkJwahyckhWUANIwfD2PRVAp7KjiQ9x6JQXZ708nCwRuaVx6uuJbdENOLIEtibtBYWtX+e8znH1Q4Gw==", + "algid:sign:RSA:message-PKCS1v15:SHA512": "sOG110ohuLu+UnUTXoEtzAWAgoZBZPzaGX2Ercp+niA8QP7jf7Z/Aus6lVrvvwQTsXPiFbw+CSdyEUc7s2miWcNuMjN+kDSEKPSLVJHv+E1XoIZycVAS80Uiswj7t2id4gzwXvvW6jiJqbN7B+pRXsnUjndqnwzoDcmB9Hte8fIdwvQKNpCbfXXXRuDWMme8x+aqv6QYdnTV3LU6+cgk8ks/M7vtzNVzaT6swK8ppcxcskaHEJmN5MoSM4nE7ay/g7QJ3v3A4hSWPnqQ92bcTbySR4khizidoCLYiLXt5oVOOn19fZz4TD9WeWOQ7HKUSWCZtb9AN0KsLsxFFh7nuQ==" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "hGRauMzAod3Nd0EEtNZZ+xRo3PQI31KaK8xhDSu40NWaHp0DexelsuNmT7jQKL4ZycAKNcsdTPptxl5ej07YE5/kcBybwF64XNU2Q1mDYPPHjoEX/9Z6vihEtH82oInwg/j/7nnkW3P/CNPhV8d/LYyN2maGR/7Vjj5O859DLK20dlM1IzJ9yJXyP/5/00ziBl9MSkW56uslOhNRlLojkYtb1obt1VRhyM0U3G94shQo0kqMrz/8g7O9Tr1edpY/Hx1RLO96I5V8L2cbdHyw49vwCGqaXemb2xvdZspJGwUmAUhGboCMnWiNNytUB/HchWesdNurMw+55mvWGXa/tQ==", + "algid:encrypt:RSA:PKCS1": "X+pNC+F/PtjzHu1coJlKSs3TGf4N4bZEpj5MT2jZxqGg8pngbFMAlQ5T5+TR29foIhx1yNX1F7rzJrLrUNYlti7MJbkQA+Qskcgn8UfkA6WXmXX5WrKAn3VeKvqYquuP4NH14Nffz6tHV7edwGLBaxbNDNFZdi81BudMyRzcp+NI4ZLJ3XJuPVWvZxiCCcBi2sW7sxlPjJuvLRmXilxJRV5DU/2t7/lmQcZQBd3FWWuBnPfknJcMdyvI0hS9TAmRYd0vjef5VJ470+1odOAhjFl77YgFiWQagL7TEmxVFKdvTFK90raXgRwUlGdUVFD3YxlpFIWeaXAtx1lLRd4srw==" + ], + signedMessage: [ + "algid:sign:RSA:raw": "JpndIhMqiJCi4V9KoWii4Sl7HRLU6XrVyPQO68YmFLXGsRkXg9eR5tAhjZUiAK3spWzqVvoQInK0aGQ2Qgkv9OG1H4buprg0XwHNEdA5MDwiLMJ1131ZG2WtNu/HTA5H5SPCfhhBOh5gBDKZ8Gup+80LrMKnZkyLg5HAHr1SY5aoNhFJDvT3rXDnbRX3Db1WkW05WeCBjKdstqfEnUGpJu1PneyfGapml1jS9QO4wqiO1TGradEbK7WpajToCROfSYd+zH4P/CtkjY6GL3DjeYHd8fPv9q7TAL2TteHaVpARkoyyYHqn5ZNqpOZVI9Bm84lp18V+81qfAAbOyZYITA==", + "algid:sign:RSA:digest-PKCS1v15": "K5oEqdjid3PDag4Be5aIMZRPn5SPCtdVz014aNaNP6vm+BoKzy4HkhJ62uB2jj08Rc3g3dGQOCciZs8CpWcFRY2IsAtKbNYE6lMm9usAndPTzcxO56T7Mok/uNVfp1Y40TrF2TTG3Fn9j+qE+DuEqpc4mQI+8iLX54JN9b4LxPZEKO4NFNLMSuv3qvMT0aEx6J/bnpMg2Iwx9b4WgDTQwyGWuhs3hcrgJTrfMBa1wkP1Ld8dCF+rWn4jFcOBPooZj/9N4/0wThjvEULC5NxHrGTewHjWbvv7DdBgopwEVN0wcdor6Wvo6IQ4DIgkNHN7cgG6VSlLD0m+X8ghFGOMVQ==", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "MOilqXGEWJvTNTslUWQ4CVCBqZC/mPdc0UFI3NLA/E44zcjmY82u/k4ftpZR83L+HjxsxtMfKw7USm4MZUENh54up7tHp/8qU9QwRpL315UNEtJaB333kzxfAfa4Ypv927cM7NDbAdBjsbSzP1gQpflZ+tVTd8C7ZJs65lfFFS8ArjqzSnkPMnHxScvxc1OpbwH/3ro3L6Y0E8OUnZ6Uhlz90R2TwenMsXQF8h/IJd5z+o9NASEDzqeUzgXvU3GlwdsYIWdQAA79cPTO/5YtauJ1CPCtzeRDdeII8tgUJ0vzkNyZuyYLzVgqh3zmp2mz4u7rXCZEBnVhlHvQhSyzWA==", + "algid:sign:RSA:message-PKCS1v15:SHA224": "Ynzdvt+Z/i3Rn0snGaG2TN1hdppg6h9h54GwHj3ChcUWyiE4UbXK2bsUZf76AIZrT9MLuzmjTGNPea7qYegrxhdQ6AcF1Q+QrYcQzEDhyf9nAcdzc+I87soOMirDsy8w21JE+9UnryaIzWhGDdAlFHexvDemKPjgIIwbCYJbgxQuHaUIKaDiFL8T4OhPchC9x77pFVB7xYxe8+cXkhvV0Z8m3tdtgvQqUhtWlKodJJotrDRm7tqfnYTVJA+psUV3aHeXN2wJLZD8gPEa5jX7FBFFHQ4nx+qXZtoh1YI5eLm2kFrvZjs6YlWi/yM5/EAmI6gbT/WY8cQdGrKvn52fHg==", + "algid:sign:RSA:message-PKCS1v15:SHA256": "E1A3YD5LPZjpJef0Nt33gKAo3N90USLFNXbGbTUDzn9hX3g0/iJBnJGlOmagCdC5VR0EY6jzdeRvEJu7fT9jVNwOVXLd+j1r5cXpiG/YCtNKNB0TizIMrS29bBb1AlzLmjFll0yL+o54EDct8WQYnnK8p3iBRQDlnLsEIemljzuYH2z9C3s17Ir14NFugIHlaThjJtPWoPt1L3xMDzVlMN50CHovRKVLK2OuQFByX4i3PfAeBKCHY2vFfx1B/DGyZZmy6VxLRjIpmVyatsp2kUK4vACpYnIpH3A4X6SY0xBJ2+Ylz6TGgO8DGmHLRM/XTlClbPix7FJxQc9QQgtmuQ==", + "algid:sign:RSA:message-PKCS1v15:SHA384": "meCIcSgdL22FnKp5+zT+bjAFPjLH1fRBUfxTdgoU2Q1nLkQWN3aSLZ/881cjlHtvFRJA6PRRgrqruCc7NjYcBAQgQHqM5R83cV2urmi+zX8P6zctETMMtvABKIuAVuWqvcPRRBiYxxINBQOQh3e5WrwEVA1uA6vcfMfHJyC1WDITb1SCwcyCjkGd6Y11RDwMS4HtHy6+Yh84hN0Mp3wsbWXtJfC0+kHeNKs/thLxizoxZlnkqDwTAPEUoCKKbqfp0lx2n1svI/+nXbOlF+F+zdu3kKM77OrUMCx1KfZAtu6oUR6LzY3/zLHQB/t+npg2nfvsvgEHH3F+3QELMO+tZA==", + "algid:sign:RSA:message-PKCS1v15:SHA512": "U7MHoSi3DD6HiV3CwWgsRPakHdOU9J4UAcU2V5SQ04yr0LvKSy3MZ052G8aO4o8C8cfLTvrjOY2WPnoFpcx0wx0sEyDIQvu9iMzwcmlEwZ3Z69vvX80tbUeB97wXgeYV/Sk9DWUWX5g4k1yv1WiPatIyp17A+9Zvx5oXPSOcOkmsmxiDGh6a9u4fMTsc0u0FQGi+OPeaJ88gP0My0xeO21tQTExvcBcxZn6jFixS3c818uBBvLEoNToSNVdD4otnPOuu9Qx4oPv5vZ0LRw62IpA+LjbKz0YVYB2T2uI2DmGM9TWO0Jj0zyVtNk/l62fD5r/O5f/v1aRnT0agFa5e1Q==" + ] + ) + ] + ) + + static let RSA_3072 = Fixture( + keySize: 3072, + publicDER: """ + MIIBigKCAYEAuDSLJOL0aFe4tSmCeRaOnab5UMuZlY6rELI5CC4hbjChsxd3WN7F5sklqLBE5TtmAZqRCRzcIh2f8IgYqgY7xDbH2UpWixrnN623bl3IPM5JHEdRaQh51UoitJYvA6M4YBWgo9NwN3rRMpbLJ/5VJ3ICpZWQN7JuxquP+byJnkCkJEtnjgT4iTUrbtyj5JFAyM1wBGu5tS16h3fCebRWlZ/PSmdFyzkQAWkXFRkZ0vI5uO7Y+wP7cjcVYXjj6UF3nIacY9n5jmlrVvF9Po38jKMP5MY4FVudATla6TuBWlNf7QGyQiu+xu+/qyBSYG1IKmK6otsfMXkgFZZYA4SVARgtLYTDa4Rv4aVgNnkPYX+GzBsWXbv644G/782t46xOTGQiiNVPiUnyF+BZk5Sxj6AhWQA1aU8XeVFk9EjxYdueRoKN7cgrGluhCGuMs0YA40bI4j1EpUxR/Nz4vM+LyOC8nqyu0yG1InW4tu0mWVZFzwSccPK8YhdrPHzula7pAgMBAAE= + """, + privateDER: """ + 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 + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "algid:sign:RSA:digest-PKCS1v15": "lsJaqJpCxmn4VBwdgxhpstYtKN0QtYiouBa3BinSmQRdoRKi3raNmiit5dbpaoJIay11ZZKp7A2Rl+bdD1TJX8OejCF8I4W2WXHTJI+Dri3DFt93Z6YXTodroJ63wjWFhb7J/36d9wAU4ofXeeA5xzH14yWwE4DUPsShlivORWlHO+JQRSu8qEUZPqe1SRS27aRV61cqGmr+dHeowmgSBZ9n3ZfNqP8vS+x+sLKJNrVXNAeYxaT0U1r9HLLAV5iovFKN6STAM3En9xyTFWCBvDsAjl3gV11KzzjwS6bvefXO898vyrqacpcQc3c7DFBYLKuuQOJVuPr9RJdjArJ/SOE3jUX6fIE9w58Jl8/o+KmdhHPgoeeHnD4I9N29P2Z2ZYVYaRcPMVTL7s45OCkcM6kSDJ50p56B1JVSCgMQaSbB0/l8/wwmdqaHDDDu/2RnTLaJSYPngzvr9CPbgdSwHp5rrFX8afrooU4kqzN6zqpweo4NcZJ4AVxyny5+6OuU", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "WeOW8oN5I/xdZcpyoC3ggZxXfcHHCS2zkgAX2Lf2vowwVrqlO+O32qObIbCsVNYSdGkYfgVpeNSoCEix4jbxj2KeDRIaY/HaJSyQaMLLBIWIAz2QEBTuldyNBrPstvnu9A1nC9gb7j3r22Wx8GV6Mn/BLijeV+CtK8R9gut58QY4vCx0CvJKk2k7vk+MU3j0zqT7PLiVxrqjLP2xowPer4kwwd134g9vTqo4v+5q1KhdTbDOCuPWthvZy1/NJeo+yqFB/FS6UL6mZWVNU0EhWUjpWyDzq7UqlOj0EepNwiph9Y0uE7gr5++MCNuJ6YKSls34CpAPu/WL2oqm4yjh8yzEAFSQ+3BdZRKIn49iF0q2J/Kw7+2AiYSlm3VKOP+/he50IvpLyKzooBmyP2Cvde/ZF9W7TMpvZoy17PI2JtiqPeFGvCCc5CpEjI1gk+afTCpwh2WoQfEC41uG0j68XiYOAOdqmAtuKy2FRH1tpk+85etJ4EwKHqtfGLw9w/CD", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "qcFTjJBxcs1/g2EM9zkSrcBINvuf0lFLhamCGA+YG4qQ3DSqPBOg69PGiIHD6tK3O1BDV4WHh5ysLaHXo8L4PJyQJBG9zAiCJEQdu9tp3Ug0bX4SfV++SFAYoD/j/ALHoZYptQneu304+sfxNyW/07m0nt9xT6py3gIuHiRQGU9TKz9LG0IGPP8C/riV6g4/60iWIqSJvBzfEaN4a9eICeY0hdQCzmxyiTegkNoaYoQep7f/hZO2OkDeR/xMfwxg8DBpL8JfwTJg9gLTBjR1UoWAUtWIIRJeneLe0jKM9nC6KCYUsB8Y87k10Cab6jCleDirB0oiIveoUFTu1obKZU1MUuAvAh/t0Ld4IuJmo09BSG63QF1m8iPl5oqvGpsVnt491Xvru+btjGMm2smVfnkNdFlZmm7pgydJy5hCn51cu4TMaIRMCUXQVRsGgQK8PDhPmVU2qsfyaGGncVn8QTNO6KPP7n5QXafoUAT9vH3BoaJU2a7NFS/uSKi+hmsJ", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "P4mjZeQUn0nydkLFi9ty2Ggzm5vBRT5zh/qCJ9l+BeARAnWC/Ff3HPWevvi8CllQxFZC5ZcI/horUJPYHSgu5zuDvYOvWEKz2uWjW3+BO6HdTTh6qrzgj5SzQM4pwziJcGFHvqGSmYoaC55sfHHEGgpF8P8tSqervGQdC46P2BqLfgEDOJsN6Q/gp7AqrbW4pVvMbE8nUXZvhizc0BfynLu2fte+iR97nVLXjsjjO1ZxQHT7Dzr147SMimK+suRw4gjQCAMM3oRs1ROSITw7DdySb5RIhsWBdxdfwuqvLb3+sp7ot8g4nDtfvOAaRPAUGX5mAglRVNsrkHqg+INV6W+sgD48oxno4UbWxkdw/AMeYDL77pBuKjHPBKjcspxfFsjZbs8ILbgIxiKEKcLtsqjd7TrskOe4ezCzZF7Mno9gIjmaugpnZIWcjoGRrvp3zBevDaYK8aVwH4f6abOnhYuR2asHpiURwEz2oo6HVXRQKW9IJwNmn6FOrdcx+nFn", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "BJp9R7mbh7IlBCtl5EsXnPGFdAFrshCWxuV5NXfIePId90Z3vIxrGCOjT+LKPczy2QnPpFx6QjxPAY4eNJ6R94zEe26MWtYN3g6JnClFSjk3sGW1YL6AzPGeLG/IzL1zWabU8Try0tgbA4qvz/hTZk6+cKwcXrAUNFX6fLifyI2rjGtXRAeZojDBXoouBQ9leiywvv91D0Vu7Er9ztD1vS0T1zMTV5IlG1oLWcyyl390F60/As/DWQupVQchb8UU/v/cQ/hm31qu0eDMy8ej+oxwBQq0upz0gH4Tia2IO92ZPgbWoTTwIS0cXGSqZBXjNx1vSp+5mZqqiLUUiW2ddJUViCNeWuHfFKWjAAIK/Eap/CR5sGU8vcBe7gvQ7fZCO7tZAIhfcPQN4Qmu6cydIIR7lteTMJ2vuPQsxFXIIPMR6TU+tb5whMD19Gdo5BCku5McyTP5PlSLFmHfLUdO8X47o2K/iCb6zMdltgbvqoGySipxf+AtC6xJsObIg9Ds", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "rw4nagBmC5MSPQx2HrRiNr9VFaqpaZWEgA5Vj4VjcxtklYFxfefjhR4l7cX68LFy1V88+Y9ekqa1jVBgov5P6PSgRt3SDA3s91Nym43cGxMST32FH7QPvFJk+pqxS8B4TpuFOZOGRsoe5J2ayUGc+LxBEmr2HxGt1ALJ/y3aGMWjjLKtuRMSKV7WWR59kLBOOArUllBBFE17vKUbmRll3UwiSMJoT9GvH/qR+YP4aaqJpj6050f1rDgJx3FAFkXregOK3aArTmaIcxQ6Uy17PlNZtPrXt7M6bVAkkf4h3QtYigbEk4qcoH667FqDuxgbgOE6H//ZR0FSdM50Uen5TJwsmTdDLfqSOGyWqbtNnm8UY+VYfIL6u9GTTjhaN9QG1lxhKw1L1zCbdQPpybM2N19C9OTP7YLnlyQmE6IAskzxkj6GMEGYjBG7HOTNwoFmdD528ugEb/h7C/BkRcssbd666jx8hLZjvl/9sqsHJu820t0JjsUOkhA8dZ3uGD43", + "algid:sign:RSA:message-PKCS1v15:SHA1": "SbbZ7sLt7h1caCfLKTcI79N1OgivGCOYpwBzrNa5mi2DNqBuSMQ5qwpHmtz2PgygvEyyw7LIR4ZbA8qH/ZBbQbNzJpl6W+Ur2U75w2kCpW+v1+gyKMH71GWvnewkyQ9KE7q3EdbzEsAWpYNKCM2idBlOcTRWWQ21aoGEdwqmv4djRgE89N5strIVR+YQKMto+pfRx5PhmcHhUqpVMFZnTDg4IL2/ZHw/IZexzb9KjSAVvL2TTdlqZCs7AAI6gndrLnsdVunc0aiq1gqApRKC4tI4HVlNG7PeZRMRN0qsfRHvjhNQgXohs6SzXAvsXjOYZG3w+6Z4bDBE75ICXV6x6GpFq9T9GCFivipAXY/eoentkFWat8Hj3pThYsdZ2tp5Qedkq2tUnJj71bFAoukif51y9tM1h841WtxpHn6q16+kwKl+Q1HETCaAx0HDaMsLPvvsSDw3rca3wv5Ha8B3kTuFPdIibtKWaNcEQdPSx95EZWpmJrJWmYYDjCbQOVJu", + "algid:sign:RSA:message-PKCS1v15:SHA224": "Q5MJLDAQ13EGWxiHzhFztVJaiE9KAWCtg/zhG1mReLH5PKR9lBWYZdWm5Jn7qHbsMJbyVm9iC5TYsG7jMSCii3UmdTh0vJhmUA0DBFriVENkgCXPJDoHMhvPlPSzA2bExu98eMgQ5261Hy64JHMIb6za8tVnD7q23GyTKwrIkBuO62TC9pbjE6Z9JPoxsAGAXj7NVXxtn9o27SW1BqlMEsvpD2OQ3CbUO8UNyG7qtt38Ke/GThYE27iWSlcWJ1CIMxHLYS376z5hm5ZbWLy9w57d2DHWVBrkTVtW6TCpPP3DZyLAtZkqOV5m3CCr/VMID4lmh0wp3Jfs6lxQdvDJ7gcuL0DOMvXHDSSZ/bG0KA2vxtDaHApIL+MiLh9A9/3jguaSkiZ0/ljOLuoniDEfaZOhjJHf+Ye0Rw3Zu6+EKoYe05jcK5vEB5awyB5rO18ynZ5nH2OwtfU3XD9JA+bvp6SN2vjeelIGBec0TCIX9L10+UJxEYijCIdYgi0NeoWF", + "algid:sign:RSA:message-PKCS1v15:SHA256": "Ad6cTE873TG7b+RhcSzHeHlw01T7GD+iY3XOGQ8wwijU1OALSNo2HmjEUEpTwq02PNJ0b430uVAFtSLkVTrvbdB6LvSPAzjJZWSE4g4QGxdE8cqVClwcY/zVm9QmyAu8iOKBS9thJeJYEXD3VYTgjH+gSWlRpNY9bMcQ32KbE8M8tltYX6kdy1ehb6meGK4wUBggU0tWj6M+zE6nIiKN4cfY7wjrJ0xKdVTcR+QlIjV3WZRZXhsVn7y3b0C737W5l3qLDjn3OGRwftFcmxfFIW62YuwoukaPxgWOms57Ogc5EE57vAUzk3mn7rWQGQd1OfEzzrkMfw6ksQ4Lwh34AXbxqOMlvNJGooksdRpqRJq1DUOlsHN9kb9s9U6Y6ZKIzTJ0Pldtf/XnWRErkmm/Q9rorJrF3CtbcNZQqP2O1xEwBZpR18yBtkRACfYFCHbNj45YOx1tfhQUabxeDnMeghfrAmpbGMov+aLGSOxWnTtLzGUGSIzlbQD4Y+VkeM3a", + "algid:sign:RSA:message-PKCS1v15:SHA384": "sLYZAtuSKWJAHe1CIOWbB8Qc28LWHq+i2o3egLhcUsZk5myFn8iHlQPpQ6uRN/cv9iDXr+5hAWn423JfjWjTariVEchrVCV+3P8Iv8R3UutGN0L5gbXX3VNgdgTbBJG9DozFyc2lkW+MIPxmprbVKHmFpXkMTWs3SCWlOuzYoRazR9LGrApqLxk7fm5UAn9Z26jACIx3HsiVYQpwZ4g7TiHcGlc++CvFR2chKbDpFVhpzQDuGf4/DeKh9MUFlvUa6YpAacpJKJObq7PoXw9JWpWVRoDshV9h/lV5rrS1nGAxv7bzeg97bFr5aegEQwrIJ810n4VXSX9/ESabQuaOwRMaVdsE0dYrS3Lw4BsvfP8xVzT3Rn0R6hJA1mZTqecas4IsCVALmyOYNgv1GKemBDby+XJQklHrCoqPwIQMDWbaDaVvSlRCUoOIXfD8paIzQwBb3mBqpFXhhqsfRlaWOS0Xyzl5Px/kRByzEDn4kKXOT61+ZmBGTIGpHvD175lX", + "algid:sign:RSA:message-PKCS1v15:SHA512": "mP+Rd2JeZkWaMg+L/xZDWGRIvfkoQcSyJzEbsjTx077qJX5qGVSlh1pMfr7TtDqGepL6Eph9BZnbHEvKeFYh82up1TjZ3kYQ814GTbbDbQKFt8su41nzhkLePNI8fXgmO5U0bEPnJF5+DQaouzkBebNn8mfaWNNApDjwfvSFP/JJyDWCifLMJmsaSPg2OuMY4vkLFIh6EEUAyhowdmEGVSi6QRVKcsrFXp/fTMzRENFGSEvkL6kVZ5TksPfmMCr0MdFoFmK1b1Gc8SdJAafk+5S+y+YoGE9hEg9Z9jfSzRvvfmIPo1JifX3NLyKR0sNCZ7WCpQnBwWhTj9BfTVwWLJH6lsXKLzfdBn9lmjwEsBYNOgXpKopAhM+Ve+m9DzRZtu8Yff8tbt351VIqpReDrIXrasgHgqLvXu7zcFEwZUmHjQUlCKZHI4RclJt8clMOK1Vi59JMs3SvEb0VHPSYmHN+leYYQ9CMdwpHQZCyQwgJ02XTgu1agwJk6n+NzPpR" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "Fy9PP5WgcEI3dDD4o/JLPszkb04L1DedaA3e4VpNFT02d8KxQOaAbhwmAT+reshqehAoTuIWo9B+LtMFA1DTvoj8ldCxYJzaO1zGMw1577wv99OfFFZFKNhvs5pC9amJe6c2721oKwT61v+KdMRJ7h79yTnIj+2YgLeNYVDyBjJyEByDcAIBpcgBIL3DXfPdAF1/EhZFz/Cu0wMzht/p7FoIajtczIf6t30/1wG5IcyaZ9hS3nlNueiswaYnqzfKleNwgLwBEZMTXSRsYC8SzYs9gPA+/JmNaSKzxSbCIFkhubQoaSVd/KxRBCt/zSPkdCj44WoTTXlyBDN/aEJnhEsu4Zq3RkCzxsdVflhyTY2sGIbxCGozGMDg5k6MDK0Ob4GteD9goRuCSOFAEzioDwXS2Y7bRpH5SSzcSq87RDjEJC+jBTttPEch6Ex317NqLFRD3eVAkZ9qG2Zbh5fBE2jCzbnPOJGed7bG5xeTLJ+VVNfDsXEoyUJHewlTGVWk", + "algid:encrypt:RSA:PKCS1": "XYpdB+IsM6B9Qsv/0BKRfQM4ut2V36+M3OTkthKtNyKgKsO0EcDGbX36pm+JFkMSmW1uA06j+v09wdS4bX68m2Ndtn+cYvX5vJ7eEPg+erVYcKB6ecyBUUKMoWbR44uAtH3pzmfpnPMjJ4TnUrX7/OJ8hH/6WsdKQJdDeRWV+Xco0m1G6vHoMRw3RDHsZAhSINo7DbTZvovlyLHpjbrhVthv6RrF9J7svT6KGbtTlMlGo0YMml/NjfMKTyyjNwm5LwGqy9JTyMcbYXgfh7HraAhBvt6211p2aT0Mlex3YGw2lqnvEgNvm73buAQ5+fTH2NexGPtUS8w7Du1Qd4dnoDzruuB4Ds3scooICZoy73JAPQc8pI0VluVtofEnOcDQRj3WqvsdFB187zbL3xFICz5XOrwar3PNOMAj2JrtgrbHcngTZQEJmi5yR53TXY54EXoS09lPA6GrO1sptqXlrzxKYTqHZkN54I1v40O+G35h0YC5cdd4nDCDDgDcI96k" + ], + signedMessage: [ + "algid:sign:RSA:raw": "Q/h1sSTehYA/4fb8EQmhNC/39onLwBBCIKeFwGAWYQ7eIkOS5bfcgo77P49dM/MdwiB9zPKRkIst25sUvlFWj12dd4vIuPnOvru89LgWmYmOvsPHZIXLu3zN+4tcNHST/G0UfRhRQZAGKDhXXDDRFrGs5V3m0jEMoFVBFffTy/d9sDf90Fz/zKYp7NATBDRw5GooeFQfC9mT9fODWVWIWpm9gE7rxjw/sEYihTTAILUCDsAqtZU/rknc7RNsm3F4dQRe1ScM03Z3Xvt8WfMLmdAB2K5TS0T3V1VDXUeGK6NZ0BLmEr7q8OZhMbhZyv2hGHYyWpIENBsYqfRuKaDspV913GMoUkfl5HEcivOzRbPOwL0Fd9ZMZjC9GC8jIW9iTXSzgxOMRke32KaGtUY8jxO/6WpSJDQPOWbcEKxl+caLJFsTPNTQD8cIctl6ctU+ZodSC0aBddtGfCulC4KaLniOQEb20z+Mb/rOS/uiYSoPRl5nI8gKjiSEtc2OpAi9", + "algid:sign:RSA:digest-PKCS1v15": "G160knrFaIQpVPiVZX7mPSWfTGruTjbjWYdpds7caXMvB5k5IiNNnrrEVdHJw1zC2qhNGEmOEp2wSRoQQSt6wfqruqkFH0OD3AW4UZ0hwFJozjMd6UpDlRsSRb6WJkxMpWuN4QcbCDu12qQDFmEVzp3vy0Fu1YeqG971CYI5kRkBSiTj2uvF2VhEXYGnkMySSObKMobfLCmr+XJpBqZ6YloTRlss3bU7ajMzXR2dx82L7xMDLHTEEbF2Ej8jWPpjP0tKt3deMp3ZrPoNACTNXZlQETPOi9zTCPbv2gD8YNqtCQQnF6xeA3HprWnAS6+IyfRyTnC3q0chWSQhkkGv+sdJjfct1C+u5QOP4IuZYhGVN8yD/FwqCXpTZpZBhZxWqKGl/S206DHibxixxQnhXRRztmDXPz/+Nm7fzDP7gM3kb1F3G+ShYjKbUyzxQhlsgFCSRGK3p2arBgiiegtO8EWz8YqdgftnEh54vPNKkPt/SzZHTmJWPTe/jNLOugWl", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "kHQEKVu4wSL/KU9px0pkuuRD84120O6+COZbrvYnRfrlbZiT9sMaVEUJHbYupEmAdH3eLdI+tXy5iJ1D71Lv8k032oJVyVIdjMin5wQhXhuQ2tRaa+E6V7eUV9+cnFpiTZN4PLloe9Tc+xLqFZUTeWrMU77G8sI6XQwsrKKf6FNiqJBClkluESLIs9yzBnO+onTjGnNOKX1QPT470eYLY66b+FrAuh2ny9axa6ob//7G4otiwRbEDgNpjjpWFAkuGPUc8eOIViLZVL/tigweXywDlDhey7uM6i66pvERl5Orpcu8nWhX34ZqHB6OLRv1XUudCU+JKmYSnrqybd752EcJ6/K0cL/jbY2do+jALFSNxBt9QYt1vgU9wMNiuDlNmWtYL7GqdcSiIibrwSPrrwA3yNPw4aHrgHKDr5wLO5kzOIpA5vXSP1v/AnGHWXHe8uxcTCD0nlAg4lNcy/rj5h5bLSqjilR6KyJ+JLT2evxiTjYw4eEZsYvocTBieTIV", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "dULCP38bTCAVtwptFuUwcCdBQOcU+wvYYPxD3/TC7CxLcdXZZQNkRU4FqPXYMRnbDpDLy0c0hv8tfVamset1BmyuEQS4Gn6FtV9VcIz1FrdTpoulez0iAsCN/DbXAsc8p4tM+Mbp9ftv5+A0pFMb5IhKJxQnztu8C2ZbR4xV/J5H6D38ulzLG4KnZl+CWmOp8GlVT6mOdYYXbBX4tMfdk+PDbV1+kYExfx0EW0J1rktqcdgOZlyeADiAnyVmb7wKRZ6xxyES35oxzJO2ZjdXDAt/ON7QxeoETf55xW1vbTEEQlcRaaReku4iD5+OdmagLWDgwwq4dpWhwXjAqKzKTcp6zwq7saKUKb9SF3I+rg3C0HmuZFtMC3cg5cA+HAQl0SJQ76yY1wO5ypkrwIIdWgTFjjYG7xTaDJA2xhZ1MEmVN5W5gCH9l5p9iZgXuQVFD2smfcozVL7pUMBR1AcEs5AwXMtVfRkxLbwMlSLtzZSqjW5hcX8d2bWZ7ALnyIC3", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "tM7TMQvhywDqO/spQT13VQA5fY1IseTkum6axludNUjmuuWfiRjR1ndjg9rHpdoHxjYQsXQQufIIkbkXzkRsDjkokzoYcHB/vNUs+8wYwaka5Elb2rDzd84PQGaLtbCAYCL/t7DNtC3p+JxZe/Qv7z9V9vcOnqXTmMAHWKUTyluKSQ9a2KHfnESpUEdB331otietaO0xAlU5bSiIfpvwoq6UHUQp9V2Y37sRQG2DX6ns4GW8SH2ZkSbqmg7diETYemth5gtgqLc+40dxF2OkAyxNRX6uncJ3/GccnSwvz/zG1pGB2DNgjuEPr9WgjPnJRRUzL9zBXgVmC3YFUTdNcCBo/Sn0s2qpHR6Ha7iPh2QzZH/KpWmNp/J4XFh+OetSHcT82gFkjpWe+ivHCLNaNnHETfzyu3mzT636X0JTnh9oswMGh6zo5VF6Cp0LevU16i8BAFG5maqsAn0BmxoWM7VH4NdE5QwrdQNFn8dq5l562TTZu7G5Nc0OMqRducbD", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "FMbx8I2yGvTZ+VQogpJ/ukXYmHPtCmLEtluLSiWYVsQtCnETQ2e5nBv/h7MXyKvKyhVkR2EJ6Xn2M1ahVXNI/rN9WsaUi+G8dgUc7R9aYMuvouvpQxya0Te+hsdxorYU408YvptMFQXdzp7XKKUq5X1Ra08yB5lLwMzGkE8wZBO/AV0CHR6by9yNl3MB2MnLq7iXiO6jpgLjVuQIImYBvlAXPSvyfE7uEMAZjreG8tj1jTjruloNVK0DAztnolllvhIaTEJO7oMBM/0H0RNZL9sNP/mXs8HUMAvhqEuwq8qLG2k6avRWgfGmPpK7Gm9TWxeP/F7B6gHf+DfzqJNRLHCRt8f0rjcD4RSZ4qu6Q+j+3Jv9KNN3r4Y73/VcL7DHKdsqEMdL67zsDIuSYQh6UCPVWQ8LxzBOP4V4aakEbYXzwSeMyEWMwHG9KaOUPjmfMDPz8Z/TfTI9rDcNWevRQ1InCFCjOKql0P+BtzwX/0GV/tZ5AraIJ3fLxrVdxkfw", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "GdRp4dJWKDD7A2KR2Wyl7t0Gi01LG4oKeGKfBBtrrjDg/YSoSec0mMbHHPtnKTqn9pg69T3HtBHQr+F+OEMCshXqUe6+409/YXc8VsC43yHoxSJh2Usz0GyOZuoTccxY76nSqlRLUvpgYqgFeUDOaIE4l3wAHRXgnmiGVBYKCEg/OVeQkDp9RnZhhjIrUAR0ECR2hzv0F0hzmia/ackfDNtYvegQz2IraygQQqs/DtBcNedGdIVD7v36Aw8Z8kA0NYJbnefECNDPaMbHwCB5RiFFpClmwGQ3UWw6BLE0cgU/1Mg+YWmspKx3GQHpmYqQGtfL+jKS7cPER2uCVKY3bxoIeqTs2230avFLBo/FqF1/lUVBReVQwvo8jvmXjZ8OAnSEqw0zARLiVHPrmzzOwVzAFbEakhIvq+UGgkivmEHRFHc5D/ZzP4ktuYlb4pHbyzkljAkgvtj7oAeNuUqY+RZSk/2uztI2gcKy4YkCRo3/BSbNETX1asw0g4uupAVf", + "algid:sign:RSA:message-PKCS1v15:SHA1": "qGI7kUhcQC834dEX4FwB0jjELngtdFVnE4Zq+MLmt8aQf5AS8qZKZUU6UYo8dDuDUkhYgO7qZVDiaQoNmYrFzqt8Bm7GUGV/H7UgGmqsR3QUEZnJgysedhCpy5SzlcnYn8y9eVzCQwE88V6tlhxeE1ExV/g7rfxbJp6WS3hNzEfzZ5quRdWTUAtyIdZkqtfYFIcJ4ydV9WWCpePv8PSOA0TioqttkkODLBxfvjsAs+qs3SHl/iy8BP99BV/6M7bPFTmG2kTNEsw8cpF6FNVKSBm84Sel50svp34zBoDuCC4KdDgzF/QVATxxaWT/Ck/QfFe55UKdmQLUylQL8CPIqs9h/5hBNSTnNi/MG3gB5qP01suPRecnKpHyjiht4ZsPspLvUxuGZpsm34THhklZzryTjwZklvq2jBgo4z1WlKeOP9eb4gkOHelJ9LlEgQWtAOdNfybYx1kGbDwxkn9O4M5GycVmJ1qSiULlHaqa9g6Lz1S3Jl5njoLy5b1WPMzU", + "algid:sign:RSA:message-PKCS1v15:SHA224": "jHqxfKpOIX/yKLQ3hrMN+ADPdLpkq0BOarl9Od6+8qjnj5oXvVGLJKGQflGSZIEsW/RDuT/ObOnq+mVbdDwI+k2aN733IztgoIE1SRcCfqOj1SAdUL1y4BTempaAQQRyhTs0bPhwNxnOVv50Iz9UaR20LTru6E3xYUQweSGtrADG8C3aR22DK/UKOkFjYLbu5k13zu2rjlVUeGeAh0i6INQSxig70iqcDAwxqxhr7bF/jzx9Kn9k/6L00ynefG66sLLMmU/rOFYe1qpNUnmpWWvZx8XW+qmm6QoONhQ/uyV2hjAcaQmiormjlyy9et3jctN8Je1E8EHAp7VDIagNjn+SD/60CQ489x4ACaNvHRlz9LhM3sg+N3Z2/fPc6CRhT25OV86a33EDdHEXH5kq8zEzL6r7N4s9eiuH9ZMv+5z6Ylmd7bvaPoasW96pYekTG1NWTZOI4vUW36G2lQmm1Qiiqft0NTD8BM4rLMJP6cBvoM2fuQ19vW0biFNUJ+qZ", + "algid:sign:RSA:message-PKCS1v15:SHA256": "cS+GgxL982yGQkRB6cm6fxvG1l9tI4egdoPhpCK0OJV/lvBi45uPLCT+pKc2mFB1xZ65gtyFvrtlh0LKMLFuwr0e/RarBvfReaPSieX+X1fNMjUQlgDSv+RDk4Stbb1OPavKACbaCqVMOF8aT5XzmLrOgD7a1QAIU1gI6ERTAiDSxxpHKtoQMIRrd2IDhyMe/kQMiQ99Urdoys1di/8DV4iGU/x7SRcHTqieKPpawVjCwIAHEXy2hsqkMIS4Pp5INb+uVn9nGz4lRRrrPDNsqyiI8FDz+8hcsrzf2J/pdcU4AzQrl46xk4eC6OFgBtPbDL2u01zDbr1NqW9q3+Q75n0N8cUynf6aR/Z+1cGwwvf3Vm16ImgCnTtNm5g6/5q8RxyXexqH5WP0VZzKqjiYpGULawQF6ZNDJYI8RphNqs8bgGnYF7EtiW2GtgjH/BUHe6tcd2viM1ZJJPZ4KlxWAi0j9xhsGw//1j4QdDzRgZFSpzdXL8rMBuupuv6fNnOn", + "algid:sign:RSA:message-PKCS1v15:SHA384": "AyV+6+irP/70kPO29NmIyvJskmkdwgSIF081gy2J3qQTSgBzeDaUA0EvLjtDMhcQtP6TBojO2MfNs9Q2WjZMDjUh14Ld/I3Noxjdb+YVaMhdYwoTbF/q+8bmaQDg3Zx1sijxuWpg2cH70wdtbowaK5Vd/GJsUe4SKYTWWvBGlH/nT2/+YaXl9To6z3n9pRrXshH3laADgL0TQS1Ial/V5cNMeNk1iEjoEqCUEayEQa9VmeMgAzLRsvlZuipb8T+hks19DttMactOPGW3UTOUyA/d6WYkQHVQ5ShaxNr3l1PT1Cvlki9JUkgOELXuumH54q1X0WokpDxhBWZBqHXW41M7zfvUm2Cy7Dm6r4Uy1hg9K3qaYozRIyDW3X1HrKT8JugMKPfllBwf1+nvnzdbmbBKY7wSDzCwCQ8OhEzrhYd6/WNaMCsnaopr2k/oy9GT51QO1Ae/NYYu+NT8HTmpOPud/N2cIRaOVOhKigCAbB+1EMgG1tk/AFLCXXzWBZAL", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Z+jf0xk0iwOCiddO5U+bM7/kZdOfRYYAWByPJ7w5y8mqvWwF5QQxDHjEU+7wuthPxCYrHWONH7PbmaX/AHGuMOiiJBnoGDezNv2Xovl060fiXBo0lUKzXA3AMVLtYbk/CYMIpBBz9o2Fv2NX8d72drSvpuqfbskTiRZ0zl5qXmYGJikNduGKoehacTPYnwrHyauZ4fclmMluAOR/8fmLFJWj2pclcgmxDkowN0tFwuY5JYbxURhsryHzkpPeOHWo8dUZcAw6cltjm6dHKsRZopVEJuZx0Nv72Ag4hNp6U5Zpjq7ACMqVnhzc5KjB5dFkAf6ht2emQtYIZq+KTvevHdKHvRRy8tfIDD15ZYnpvTcmhHQBI/t/9xFgz5qAo863l3U/4g0DK0AtosNzCx4CQ/Q+oZK9NHavXjleqyc4mgIu/vN+HGgJ0fe7K7FsCW279XT+5WkjgIUTUzDXIKZ4zI+YSGFHJTDnzej7MED5r3dQeYSQ82UpMWJB7N7Ppg+6" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "U72VdQr/mTJpQQGs7buxEnmTG00jJizTCOmLgPbKE86B+Li9+8unTkgN35QJBc3agtZBKb+/VgdzvDXoIvwrGPPKMW+7qX6U92gVxqaASKOcQOW39OBgpVRJMP/NyqWMGSRMT2ZjCofh55j42+1ll029LlqwnOiOv6oZNhQ6OzZKRxja0TfdH9h1MtdUUx/KWRuMDomJ0w8kwnjQ6ZiRh1D0bJ4Tqb/hftCbkF9dJz64ob15tNtlD0HHs9NkoH9QIrg63O+FYL2gna6R1VFI3osvTWk2qhOy/99o7yxUJlxa/Iq5MEa/XjUi/Vv3ZtR/F6LPS4LI1mfVX0wEiN4Eubrvdy9m+zSuSVwkmN3MiqXxvykcgQEI33wOrCpukM+1nexF5xbvJbhjk4f5BC23avwrwd71DSeka5ARS8vajKHoPmtFVa63I/YSpGNXWTzeckqqB1Imv58NgcOF0txCYDYcXO5nMIQ/t1+30JbhzYtZfdY1vLdV0KahVnUBsq92", + "algid:encrypt:RSA:PKCS1": "NI29sa5hiL88OyGR/wywdDg0wdRc9ZAGRf/wgeBlV9utdrYd0+P4DV6Xz7IkECWRqb4b/Neb2B+5OWmAK8VdsugWnaG0ZWfCW9Ak5kULQlJZlKRgyKnzW6Mc2uzdw28pux7d87whMGtp/ZloH30onnnljlPu/LNXilZ72c3osnBMhYT8L3GENZuZgNN6mVZ5rJOqx16uP+v8M95sm8mONolAw6ZqZBeMbdsSOnJQVBriw0Rk+5MH7zKC4raum9uHUxvrQ/zhP1bSh+gUnxKsyfNrUjhAdEIZE+0gGOEzylj/xOaO+l9ObDDUbW+GNLN9D4Vge96p+iBGBPqXEZaLKtqTJ1ra3dO7Sw3d+wc4jPRv9OnzTz/agJBgxEdEdRFKH7/HeUtm8Ydfs3zBwISPQ918AkOwzsQYeYh5zkUwS4OMspGrm0xTt8flYBQmPVWp6CKs8OADL5sGJ9qVECxdAhtbpVzDSFn4aWWi6J5JBkNSdFwsHTg9lypiqVTReCbU" + ], + signedMessage: [ + "algid:sign:RSA:raw": "Rh/KvcbbFVG1rn/VohpSyc0QmmMmKYyrNQ9gCGWHJPS7rYKP8y0gCU+JlwsFznrz4XIzn1HuFTErqU8jIxccjTBD/t7//T8v+wQAxpnxVaLja0Od0d+txzFY6VpZkMJV0bs8wUThrLNUOdMfdlb0mZ8uceWYHCzTE5DO4rB5s08XAFWurBjDqn3uauwi0M+R7yNnXnm40bmZlWK/STmKyiYuKR43Jb6fnUykkqX8O2+85URKZkVAL9TzhUUQf5DJQv7gltVihASUiLH/cJrtpi4+oQ9+/Pesim5sTXbgkDl2/syIL+SlR8JNV5HLrpJYoIEhotP1U2ZUaFkiFGMQnR6yOQiVEgral/pjne/BgKWEa1bvfudWKLMcyvkCjw0WNC5qUMiULsdgUXbYh1ZwEUcB66HRWXBPHnYNbzoczdH+75jeCmqYew0EHV1dStD1tN1HdexnHTkoiM3v9x1qFcZnilI/RPTPETbFjf20z8703Za6hVgfrX4S3H8UObOh", + "algid:sign:RSA:digest-PKCS1v15": "EebJUans+9JXnl6Vdp6iNFCQUMC49JDRV412nqec06hyoHZt4auo594M405X1ZtIGsCbFRuc/W+L1NL1oH8k/U2z7q3OrR5SkwFngLUfXlfBS6JLpoczSYwIR62hLxbdCEkJwxCpuw2HiAnu8aT2UUg4BFYZiQyXSx6ynO/cTDA0JOpTuK3heZ7EsrpRAQFss3yk19YL+vw8QoZ2C+f8qEzpeVm27dWAZ7IZ1Zre/upgGGWVNsZbms1H1k3Xsbt2WQYgwMrKM/fDU6s3/uxhfI7d5gJq0Koy+qEc8c99EsUKGUm9veBAq3sAWtwDaHYNICN9fEjH8/JuOEFn34X9de2BZD3dWsinKoyGcFjr35RXROYy0ToJmO0Vb4eDC6KLxsMbamm6dc7caeOgxw63ALtvLlsbE28Yo9bTFV8pqJfGWadiwGRvKyBbcUpu/qkLjyeDaTvvXNQxWKl6jxf2QsQinKBRVqSH+Y6AG8aJvTRfSD1TRYxOkEnDzhI4i+4X", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "DNhnp3Twvbt/6kqzIMgtmOTUywS229/aJfmlkhta6ZxgL5Zh++5eXw0IK+PA38P+OiToFYD363UoPx0zbzd2kM5Nt0jGKw4bnvhLEuc7QPpwjcg+bGqQmmUcjpi2zI2sYTk8rMljmPrjNGdG8KLpEebpDO2Yqr+bhqWdPhCDIF0FAZNcH86SWo5vsbl2FiT16mD0YFQC241mexKJAS6YZPYpagYq/Sftf7AX5mB0tpBIE7Ga0bwROJZ00Nt7p3b897DYhDNL7XjrJGFSUkIkIHLgGlDyAv0O7QlqX8v+snU935wTCglzp0z1ppC+0avyOeSN32zVqSI5BLmp2GYeuanmH4pEz0n9+ymqDnCRNpAugNprrymM5lWi4UVF1xk7mxPiMUT2yi1PpT0AixsMnzRtd2uyUlls410TzKLO8W564OpxSKohfyonAmC37fbIBEEeEHbpU2QMbxDD9N1t6bOrBfISe4QprI3wBk8m2N4Pn9DUet5390HBR/MSbuNq", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "buQOIoJ0Bxro3D4UxrGId+iviipNKznLg09Nyv2vXJoDBC66IXBYI5nJ9g8Hfa7sC+Ou0ZYAmvupkLij66Q0umA5+kP0sRp0xLRJloUsqzqD8Xvqxm/na+XOPDpdygy8LXC5aXE1Qt5MGXXgkVvRMFhOYI6UFj19OpFmidKFX4+MznwgUiVz/k6f+7GQ3xY5jO9WqVSdD6Q3ISY3uM4xDDsUKaYojNTp+Z/3f3TgnqodxeBbA92cWkmmYqTzIZcKMpTSNM+fWYMDoIZvHx+r5jZ2uoXc0YKxr39bBW2SEe6WQF6pQDXLMUzn9hyb0EoOR75FWLYIV4DD+/zw5fYvEE88Fww73LYcXUQuqyMwXheOzJ5hQg5Q7W6OfcObT41zyqCaJujIGLX5Mnme/2kFa22HkvxZTb8dGJRUEoZ0ycIOkl14N9hdUdGhLeO9BrMsDdohL+LbR394JYYbSl2INE5Gl+hqr1j8gnr2fah+UEZ7Sy6uinRt7cX78bsLhe6K", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "izRlGRLjnjDPsYmLSfNXzLf+eGKcmw47NcAWlIhit31jyt28klhiOfkMM7thCQJfXsj6UBEEvxKopamuTaatUC3w+9qSVOG1bWXHJ52yCEpmfLueN4Z01ClnLIdm3kRmaYDA3ZRTXM11XSclLpZC07LXT5Bl+M54PxXf7JqmXeNCkmof6AVHop1bD3btLjsApfF7bG3Whsqvfzio69qctrb2MnA5x/yaMQS4CdLYedNNl52RF3oP6TdvlwTEi9O7Nb7XnGt76npFyr85cTwwZ7SsfkWROxLWNo1B4NbzApDieT/XRIH9wmksFvdTq0md5XGk5naBXOHCbKamzC37ehu08EgyHbt9tiHoYvc2p2fuySEWbuhflWBLelzZHD9F7CazjiSPbz7yBbNStv41/FoPFpziGFJgWYZ/0dpdSQ9nhPDmfFlRje2Sd25C3C3tYKO/m2qXF+Bhd6ywbjiHV+cZAxxdKfs0aLAiXOP4zdaVQJUD00At/V6nS3Z7bymR", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "Lz7cURi86Mk5brrH79zk7Wcfaz0CF0cJplzW68hMYPJVMaj3IMj81d3ZxHQxbvZzvKEjH4vgCxF1hCU+kXMT2BU3EeEgXLWRa0Ewwje9QB/Xt3h/vxIX+VzrI0F8xybbmJTXADqanybq53PKmovvt2kxYGkNx/F7Lxu8LVP9ofTpwY5imv3Qy6ZM6fm585ywXb8qZBlUHb/6j+EQk8iQ082amgvxDm8FFhX4hdu1YdHD4bCxgYNYDUNgVP2eMHoZqV5eSVWpNr5DApXt5Raom2OP/ElLJ3yNOgCw1UE1P8VQg/xfP/0jBdBI4iSylz7KNjx3lQUVZd+Yl8HqJy37fkXvvvpbJyLBp7RHxhpAfWqRYvUjtQm/6Y34myiEN9BWOqjw3Qb/jvwPsD+AWGSdfFHeS50p58gZZ4/9CYL8MafDJITTymyHLJcZ7aiXuv1/2+gJ/QqNVWBMI7bJRcV9vbEimsO9nXsp9GGmEXut7i891G7PJ+ggLwxq0s21MVpT", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "mLdJ7aqJiI5wDOp9kQA22x04uL5uTaaaWLlMybn7zPt1nzyL8xBfNndIk4/dRATgfdF3PxuUqEeZOVQ9txrFG70jkWqNnTYjzkOm1jGtyEYo9ld/huWdUgwYy1AfyPuLANxQM1EdhO/LITESTzq/JBPWPl9kLJVHJz+xqMnweL/5Anq7C5576B1hfWago5NNpB1LLCWHI/KTJ0Toy4eh7jnTeNk01B5ag52Rk/gHP7UZiuBiGHQN3n5/uSG1RwmmryNzFNpQm6W7As5RG/3ke27jbIYfZBs5/a/uXDAze7jZoj1hF565pDo8UFKdWOflteAG8c7GxWSyooLQLanz3uV5UcaINWfOyXZ++sEAtQWJPQ4dIRDRvea65bWIowt8so2t5nTvHSwSNs09wSgtYgtsylxbTsRP2qN1v+q53RsMzeMfk2UffEsL0v7jeE3JC0HsK4vfYEEpj8W1pwHwjZ4lrVAi9GucQ2BxF3TpD+opuEUgwQfOzbF1P9wSChQk", + "algid:sign:RSA:message-PKCS1v15:SHA1": "NcZ/8UO+hgqa8ZLK6SBpIfh/XoxoaXn+3rNGzZwhPLYhKjkDyaIZc8aUXdCrCL2BJZOMEvZSL/QDtq01Zit+3ksEDlo7QA6tavdDWYjKdZRk9s0HHXMlW+m1dqsIt/wXZByTiOAm3NgIoppkuhW1jMqiq0EcQzmuXEdLwJ7OaOaLhPv2J+vC0b9y1TwuXQ/eSVCQRAugkFqButpgCXOg5eVeCjqgVJfJMYZTSCTUqdQ/jdscw9TzdszPzOCjy2RMx8z7XQhh+0TJy7cFThAfLJAgA0ePNaxt66zGJl762FfZb30I5K02frX6fDBsAtjTv+U2Wdd5A17ifzAJ7nfhiXb8UJqzPq4Wtz7ftQxoYsyW1JXsgdTxyPJcdQeGGPQ4FT5SKmt8gOuGN2WywtdAurwC+qxVzZU5QDsD7CojcZgdSQ9pEz5DXkfb2TISikYyQ9StGaEDg+ajJ7U5laXD+L+JnSoWa18t5DJMS3MJk+RIXJZuoPsQJmbKLuZ65zmb", + "algid:sign:RSA:message-PKCS1v15:SHA224": "O6OOybN73B3uO0rOP0UqAq4yePd6mczA6KvG2RaitN4hjBM2CPXcJFt25tdBx8lE8rHb496uveZ3eiNFG4yG9T/szBnUdneN787Z0b4TBJBFMOekkwn3VXtrJANzqPLPtLqI/Ev32E5p3v35AEICx8iNk34/xzHXvUO5l4dRervCyljZnRIu8yBu5XhYKQR6vVAI7Yq4c7rwu/xF/EhJteQqJ6jD3FTgE4ByEVZuKTkTlUPJw+mZymhGnHhNwkHNEkBQ97vWKINNAWhfH4cnaa/645mWuBug5vziUWwBbfHY16wsM4hZHtg5KkmUvn0dV68xs2T8mcD0jwf+VD1LX2rSS20nzg321ZDwUPmgUq9VkD1f9C8L43a4xqJ7uqamFLAbAj0w9uIyGZQrwyUroThhogdkY5czMVxO8oaDItWDChajFoESHNrP7tIQUwTZIiXHqyQGAfhwnDcB4PFxdz0GSCI5RDqoYytXi2/mZtBHx8S3nLWPENjh4m9ZDytK", + "algid:sign:RSA:message-PKCS1v15:SHA256": "QSrniQVuYs+rYvcDpAgmBlyOO0G08hxyJtdk5rmexBhE5wEZUd1zLwsnHWskLz9Zjie0HC/GyuIPgjRPyEoySD8dLrtFjrjtWKq8S0+lTjA1uSw58RdNAATx0KteCxyjpNFXXKs/NP65qHuQNMDob+CAjuXuMysJOpa5Uy23fKHOjLWfR4ioMvntAKfHQp7m3e3pvHq1uTmHstcdrJuPEP22snML+E1W+6Vo57n0DQidCUQ3hmGByvWTr98YYsam6TP2Hn7qTxOnN+ocGVVFAH8ViAnURdpz5dVgWX+keetPh071tfXUQd5fYmjg7IITOzMNl81DrvJmPDSEmVmI9XiiHk1l+JI/bkJOUZmSANoH6UcascUUAtjkHv4a0YwjmwYbIbv0QADs3shvSzFveBrIdmbwbedRTXz0+VXjFuq+pIbXN9oHWowl3JVn/ikIJgHAMP90zttlAE0pJ2bnhN7DcvEfDYnXpG9cK8TrbwQqBfAerTMESc8lQl0aSH/K", + "algid:sign:RSA:message-PKCS1v15:SHA384": "b3Y1cyHjXr6zRaTqlnn4xlsKo8pCs4i2I9bWs0TtkzcHeYVk9vsC5Nf9Oa6YRnK1ezW+0cXrdLXB4Se9w2a0c3+j/eWBxcIo2n3P7QGOnOE0U/euNaHSyNOjNkb+ZmcI0NR0+p07p9AetaBpiEB1Bd4Xh2P4wHDaWvkc2hfq21snYTnWgwNc0XasgJSdka43UyX3whmellwNZ+LPpv4MgJ9b0W76tC3dpzZ28Axq6xa6bvek7sP3AfGrr+9J8V+0zrVaUvAgSnLr3nDISuf0iGfh0cntJSE9SLvuWmiOVtEVbcHfIdXtq9cC1z0eWzXfOz6Njt7p6N6H6F/JR7PJH6i2XjTyTwdtraMPwOtQp5QHTIXJoswjLSqcJZ0mSt/4CYNqNkQf/3/p3nAVsF21Kik6V4jonhIDJd/Jqy4+gVmzE9x4K2ayiMTKgyL7Hu68MXRicFlLtd83uVBBik52fudwejVmuary8+zA4Doep3foh0W3ZakIJnOR2USPBGI9", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Sj6+dUKsbxxreBjyRMHbxhlP1l/jKIipN9YWBQoxDQJtdkdtGxlYIjB180gunc8wSCWDR2bIXHYT+ch1JM/SDSRuAsGKWeZ6WlsAcubecuUjiKq1s0PAeuKDVgN8f1MRQye1sQh2M4t3sSlM9Kq2Dfzj92yYjf4XEtDBE2NFM1O+RpvGLDQMtomdOfc74R4hMovG7wrNCKmyhJMSRH/mtVsDV8UTiebi09t747SyehXHUzL78vhLEwzkmmpv05B5/FBRuFiwzuoI0J/a/S/L39NatrvHD8shk/jkyYtLKqxFOV4bc/ELU7r4zo9BOFNk7n70BIPv7bf1RYIr+4QF0x1W8y8TG5bQo4h1mD0PmBwL6ppb0WCI/JwBrQaYhyANao+AQNPGKtzT44WpTXKmq/EDwXv+fm54gR7qewqC/WkcqT2fCgYLkfmZZYNkQfikrEEeLCTIn44CeTROSn+KnOBK6E5vnyJqEJVC7Gw+f3OJBjN6mWQuhAoSA12oOsel" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "djrMGfalEl01C9fedRjSvlwhRLkcMbgS/uRXdGlnwnBmnlQGCNUx+bBzBKHxkm0lNW5/YWzI5n9xXn3uwGWunwid5/gRvED4aA8khW3Uuxx99v6zfR7h6+oIT1FDNX0zVJNVBA0tC4gFl29uqqCVh8LUHlR8/TkYtl3nGH/niX2JmW2trwmfpfx6cc7AxxAgPaipA9tJiKhQP09Oo6w3iIuoM5691gidhtFi3IVXOrJrS6xG0N8ow8vnycQ24cOPgX8QOC0YjjKg0P3TznNcsqOoSA/3iU4/zapkjXTl6WIUrHGfRktDhnLD4eILCfiwZeDKeZxVol+JCC2Qlpd8qtNJqzS04dt3O0ltmk0aeBeITYHzBP60hzdoQyMUnngXmn1Xu89ASCx+LAji+aTaXGuxq0dpFqSRI5f/W6iJ9Q470xDN1BQdcyFNVRpBx9xq3FCanCaZu4hnTWxU61tqgNUVYnGwNxTWOj2PbYY/p4Tg626W6MANWuzZ8IDMwAnu", + "algid:encrypt:RSA:PKCS1": "lmD+QCJjs713PHDvjAPmUP4XrlZTo11qe3l4UCcT4AbjVW8bfHv0X+MFG9obw195bw/3KCkugyod1CTJaIvsrj4Brop4jYtdg/cGl6im29Z4tpZ7N+u9nKPnagAqhTAo7XXguH9/WJFwNbfJqrZ1FgUPJ746L+NGylKtBhYmxkliD2vrJu8kOjEC6Mdi/p5Rr+wWZxWG2KnWbv0bVyhA5HxgP4HhGXu4ZRLmz1ChFQzTh5SENRAzlKUqXc/Ml2pYtqtkbt9DbTDY906lJGQR/VMc28JYNF56Hz5RKma9n3RkH6w336G+T/7mJeit2+K1DpVnjCX2un0hSNPcQ1ZxWoLXTuGpln1yWi4MPWyJKGMZUX4JEcMQvcPWoqjITC8PE77SR5mN6ygzYJOviiu8ltKCjz77D1oWSvH9MjkvSVVJ19oT/VbpiXBGmVR+q9fgUHZ04X00grLq50gXlhDzHXGPWBibgpWfXYSOQFZISBb5W45P1gn11m44G69lpst9" + ], + signedMessage: [ + "algid:sign:RSA:raw": "fGd2UWsA86DOlsOaiqhZMjubf6N/MPEqhjil/s00JkynPCYvqp/46J/6P9UAZQYhye6sBYL5JQJSxlqND1Z1yIMPNAxo27jNQzmI9T5sstk4L6wH3wnjrTwW5qRnLGzVVVpLEOLEJG5oR7vbF7DWXjub8OhPXa/8V5ILfMDgNVu34XzxpvC1Mk37Os6FpV3Z7ytZLzb6WNbtQAbXy+UA27xa2LsKQj+VnuB+/cpwPJnZvs0PT5iB3qd/eW4CjlOCIKJMJMuFQf7fvqOiIxaJmwKLAaGRNndLTvhKo54sW3suCqO8Tfk7i0/tS8Dcn1ojR3KQQK4OhUwqrmxROrY0K5yLrOb0UyB7IiFIXih0fT06MpkPlYW2gYtgkwQ/l6S3cEVN/TNNa2WEqgCREaboD0J/o06vfFcNsYwQLv9UxFc6CnRyF88/J4ySyYU6MPO30hoc+p6nw+8xLrz1mMJElPzn+sRL+LWMv3NFx8AF8gjeALsqk3PBYBSj1a37qnHS", + "algid:sign:RSA:digest-PKCS1v15": "RgoqDStvydecqvnTuwlNKfAwb9WWKjEyRVyNVjkiNRDbrOWqCVod2u7a0e7Areb0ZeF42+bcTWF4bHhO2cnLubVKDxXpYGjh06voyCMy4ZU3mn/VAI8h4XkmrcH+2SJBXMNraUlDkuGt/TUdttce7Qofma3Ax3r8+EqQcGNrLtJwUxLrC6sbZdbqyKUhA7j1WswpqLzDa/75IlMNM9qrKevM3SlYtxk3vz5ohr8FP0ltFkVBt9o8JVH9TaCO/djsDNp7weN77Hp+/VeyKny4uZnoFWtMdIDDPEyOle6uSZLopNOFsGCod4jaIFt+Swj12unsaX4NsYlg48K4oVFEyFdzUhHKYCcQli22l4kQpn6GHhI7BPAL5nCvPf58S+DDv927yqYkY+vn1KH22iN6ns+1IcPWNaRvz2K/mg8kl7ZNu0r8tpxic5GE0MAt14Fz444La/Ebq+9ZsxxpLOdo0yLReN2NWQacqb+mzsghw+BYZxWB/sByAaNA7EpbmWVY", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "fkedPCGJiL9pI8DHi2d99qUyCLT+nh2cSD/BxNXIQgoRyt18Qh6630MxeaXuVUt9HJ1hSyfvVITTRVk3lLGnrWutx0Ot6Rzk7skCqfAJ4b2eu0SYuuY3+xD61y2qlXsDbqM9EM5XOVu8cYrw5O3iGJwbTcV9RPTgFxZly4L92c8oX889LG3FphCV3YueIqbUDcuO0YUF5T4MAKQs80/NPeRDW1pd+OsMmm2f6IHo8gz6yaUzfnN1cFuuOl8aufQ8V/RESI8l1DDG6iuGqzV+/IDOkFQtZTs8D2HYmxR1p/MS7j5iU5y9JaC99lBxWigI/E1DHC55TUvUEp7F332o/dDo5+1kd6FGDaHS1LMYZvqM+Qhyxc3r2YCdfQHnXKBzGrfTDS+VZYo+eHSMEUbNpkwpRSUBBr0arXqKrnBS1ebORgQXLsTOp5TeMXsFQx0Oh2ixA4xBUat4Qcsdy3MSLLJka96WChZWbjAkChAhBUZhOZAIEiUc3wvGAjLVooUr", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "OzqP3cKyuni28jdKlamaWq3TYDBnAZR9lfe1HGyZaH5AaVnJIFtmLz226qWRoeQlkJcqPRFaUR7YdUCR5nbeu2+LYXGTZnDQTe1F0p3a+6m8WWWV1MFcMkuWrx9Tmst5sXyNW4PfPTQrUA5+q3nNVyWA3kDddYHTOUIOk41D8qRfiP5kQcNbDPitBlIzfu45U36iY3GV9uUpSAUqPuODnq73fCR81no7lm1vvIA2XS2YfPpbxYlRxwzDc4cfnLY5o+wIqbgrVWsZrkCgqDkWtpA1UxJpHUtGpGLO8R05OVuJA1oArovPhoC36THnw26zX3I+PL8WB+z/IkH5uqCrY30UEKCiEu4vBxpCDyX4XOuoJvBEU7DI5Vj35xMsqlguBkOfLAYoTSAgkG8sBas9jy7AX4Wuv1lEf7EQGucPRNxhUhFXds23i6h1uwN+UHHjqmvvqU/KAjk6AuOL4oJL8fAhhVSSuDeJGBJqijydgeW1DVMqB8fbBIO0FxUNSg3p", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "m5WaMZ/Kr8C0xDHPN0MuzCaizELNA2HrbX8cQzpxoxR/9cO88DpmXiGYhmcieExyDhbWo4WdYWayTbUw0HImVe2red/tsR6mjaA+GkRxL+h4Tz4p/0uG/4CBoAq3zWaLqBy6oUf5Sgdb8V9+2GIAhKV+9mTT8+y/gr+fqKLbufxb4S6oZCUKDETFJTFTJ7zu19a+iOwqkNPW58cJWrzWaIRZohZG/TLV0G6pf0dR0tiXb7XSVS0L5trtTgPNfwVURPOajZkB630xH0KE31JHWT8R6FKFXRv6FSXrhEJiDHMIML2jRbJAy2cmrO8T+vLVLY0h4Mx1PlhNMtpKDyYIYbtoZn2NVLccGYymmeeEYdjeVxvmfIsf6bWHz959tkchsCemPCy2teFE3Fvfi0al3qHkz9g1atgBEfLBuGtu8dEQuouI0+WFs40a55F0kx5O3SEUFYXboi3vzIcT8Lm32s7tUKiBSx78TuuA+3AanWmujMFo0XjIfVjqxJRUx2xJ", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "g56hHzxSpmVODiCkkktaRW6poDqjo6f8MNK0hOysM9OLKxoKMEeWIFu05opnGPHb3ISgPgPtXLBJOcUObBS9GUqH+m5E2qd5Aa5ZHv/B8pa2EiGiCZf2omvuXP54nnJusDprM+utmhDQRep5G3uZ1q1/WYtSRzTtFhYhwWX8gTkr7dOM+fdtAWWCty2+kvuCt7LxlBLOvpq77RiU0A0cntFXOc3DzOSzZimX/p1KUFkEL7uDBq2JOVxwZy3WbJXVjHhZcuuNHH/AybQaJTLIrdm3/86GyKfXCCU1r1qzdcnEgzD60TOA+M3Uds9SwdIKJAxpbSb/7pa34lq3lKpd1YcmPQxuiNB38Uv5wOqxMigDf+HdWgbnR4171erpQ/YG7rSCQSB7/Jeh7lIQ2OkUe83zDbeOleX2LWIgB1gjBVMDgJqh77x0LtJGmtxwHmGK/Nr3MSE01VFAA87KlDSHQwk8Nc4wnn8rXo37hkHdbWY4sjF8kjkkMwuZ6lhqYsMf", + "algid:sign:RSA:message-PKCS1v15:SHA1": "iVPY77wYQ+WiaWd8CMMxKJIhEu3nzlAGq/EFcon+hs3vIV3d1K9nASF9cUnuTFHsP6h2wN+UiigTCVKtsZtd4ZQm5QMrRznVk0w4UR+I0XtqZUpj4xXIMynwe6r7GmRBrRT8yID+aHAShV3meFlJD2pP9K9wbF07wPTlXzbyTspPduF0pkvlflT8e7Q713BL+hmPsUGOb/60JKvHt5UucnvcvHbelOUmx1ToNLpWEG0CkKIwxmzhTKJqLWL/wXR0vc7RCk/XuVl9lbsvI17lt1UHX15aj19Uc4ud0q25l55tsLjtvLyZXM8D4zonnZYkWiz0ZBdLRrKBvLkGo+ag8MXGqUMUwSMsLGKvVHLvpZCQWn6RMFlWv+SnsZ9KihzfXuiBam+COdIE7BdVM2kZK6FemjW1KWaETxdWJ/iMpUawdRIiW38udv37JdK1sMW7bC8Zqvqrkx4GhkZRtu+ZH1J0BpRsUepEn7cPeabZn2BGpElVBkukKsuIoBSdmJxq", + "algid:sign:RSA:message-PKCS1v15:SHA224": "od+mpd5UTymDudy/K3hkH66NQeC8xyLR7MtE+YbdHh+LtzcelnDl8sBhE4P8UAcJaeQsBlRpG6T1XOsJtI0etSu6fTYddl09AGIBE1ITPyrMv4CYft+tRfhHGmCSw/maahmgVUk+63lcNY0P2+3UtIdlvi0cQOacFsYfcnBmPpfnIN+qb5SmPM1J0y3xPIHfTuyvR1cewWMF+VXsSxeSKz+repWCI5AIvFia/3jCPbaS+9n8s0VWG62XVeiOt+0ekPiEaqMxkdysV3N8kZ/Yg4jFjZpcqBVPcT2sctmw4LB9VjCdX+96tcKWxqPnJcBk81XYzqDerEE7KVMA72jz9Svg4o/SkCQLbZY6/utwkqiaTegOpd4blbHq98U9gUiB6h5k//3XnIEksrq9adJnuAJzK0jeGbiY0H/atSq8ulgTRuUxILYLFD6MHENc6CaAjFvP8M5MRnYFglvaBWXhpfYdYt/uqSzb9wh9Mr/e1R8g2K/l0t+MdGUlVCL7PeXh", + "algid:sign:RSA:message-PKCS1v15:SHA256": "nt51Mi1IfDB2TDxso0duAQFkzwr8CrwJj5VmRAROTRwCNX3Ime2igfBeByBu8CWmzDFoOyBOWAMe7lzFVKzMFOyCbLNg/OFImem8Kyw9zN4BmB5yfchmRzcJr8CPykDQXgVdnj7cvVpdZitCP94z+xmV/AYcBfJvB2tooIWYsikQ2XsIm6zh5OBBZvV188sTzs9z/m33agmraM9H1EWG0PZZA8K0+sXUYOIEWD2uBZ5FX/6LP5c0k+RcF3jTiPs2WvhNnxmfv9DXlRSTJpZeXMxojDlboHsGqgsmT2k1geP0ecx8zqkOsbKvqQnTrsvuvesuAkF35TGAAIOx2ev3HY+mVemg6CnOZGGAEIHJNVSndJzyQrP2NlgaDG4nediZbPtwHXE2587gA+AoU2jrVLAzrinZCA3sjxdwUBUbysw5a0+XQwsgaa3hBxgJpRzdWRxD6I/o1MZ5IBfUxq7NsSIiQQ3MJzLx4HJqIBVV5fpRiNepbV0nh2AUalEzjrpZ", + "algid:sign:RSA:message-PKCS1v15:SHA384": "p4NIF2DG8qRwwf5tdFO2mZVaCaRXm508P1c94V7xoTfJPnsrpkaPvkkRATnDmM5VmvzoYkhqgXeSNkVS+GR8QisJsPPswlYABeMK3mkNBxWPbjxKVVMxWcYbZnOHUMUrkHC4yAQTXFZGwf4DwTsjilGeh5iB/wKsV70D0pu8IN26FEJMp6icyiH/A7GLhtLYTceNhsLSl3UiyZzJfLrETkvg8xJSCHMw6VBH3rxiryusTI8OwMFyYDME33iYK831EYoCj75I6AqwBEyKBQTra7pa1TEHY4139YLGjhNbtSH9roLNncES8Cz1Kz1/rJiKre97skYCebJfAZ8PyjSp5At6Fxc0ITQ/9ugwVPUba6KXoNTdTHv8jjPIISXYY+jSdEgCik9cSK6Kiqino5TcPaHu6muWyw2MWKcD5lCtZKf9iDam2BuABzYgB80d9RLGBaaCe7DTCcCG/rvjs5IOc9zerw9vSHXX+tpe3S1ZHpnZgKs+CtY8koVaSKlLuBHd", + "algid:sign:RSA:message-PKCS1v15:SHA512": "Pb6TidSTmUWcDiie+BRaWQg03LBHiQD2NdtZcxnC6S4MIp4tjVOWLjGzpQVbo3NiYN/EuzAEf8rCqtf3GZIeJ8eOt8t3prOipUWj6UZ0fjLFr/EOQW8Jo8oQdvmgpj61dmiGYDE4YpAHdVIffwTln28kyFSNpMKc/wFnHDJtJpj5/UvlQC6ywAKUdyq2Uj4llXUwLToAOj4VTuqPxJuPlbqmgFDg/s9niixwk/PDpxVVUPvflKnAsh2LWEQXjUcwX8stx99wBT0VnStaOlF9wDOP9LRp4OhEFOhNagZgRn19tRrV4YPqSlPoOZPT68AdF1sVieGXkWlV8ue/giRYuYeYRNCTGDsPUtC4sU8D+CTBaOPP6ch67Q9kU0/iFbYqlqWMktoBFpFfd2CxktMwZBVMl69TXMNK0F0BWmgR2YUip27ieME4ez0vbodTl7MBcvpawkruP869lbRDepN1g9ltbGKm6Fn1R4BWVQREtXgp5KSbYX/JsU+2Y6qrRdlO" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "OnZNqQXZb4KQ11TR8XY1pFMzOCBPjGEolZwQ6zpmJSTlT1XQOo4u8rf5lIYEE/qVpMyZVhIHQvHHa1wacXEde+Ni0VmIBOnfFyJdEtHQZbv1FT1KyU4SRWCyNI8g6zO4N1p0ldS1gT5pOYlrjF9VPNBpAyYS+wHbBsNlvOsWeY3r1FOtfF7Iw2V9mMQ+Q655r+sdgBYoB+nf7zRra+JwEhlOU+cGrV1WVhugHxvoIfzItIWzMWY9UCtpQ1IvFvDydjHzA3e9WAiwKIIA2dHtzErd1bAzKnkjZ2zq8ZbH+AiEwMxx7VrJBrrfCQHto2O56UmRPZubuDZHQsn5nW4vDTozo0oiSSY2x1j5ccAxcx8che0VF39OFPSUOyYiAcRJbjs+SL95XpzjMaTQBhi/3nQQIZ9tt6WYo56nyueCIv1pGoSjdqC1OuBpf2wlBitXy2y/7V4qfIYixscMlQtpIP2ijAWowHQf4swtFJzWz2nSbkc7AVlfun/S9Za8Q/CX", + "algid:encrypt:RSA:PKCS1": "gob1OHvXp4NbhFCz/YjCGVk3Q9EDkjouMNHU/cIA9dggiWOUUVfFBdUrVmw+xT83kcwoLghHSQhB9G9SOvP5dzPHGa9436ydRUU8ccyfR4xsu/ML1utXMGtkx++ptOAGLjo0lvDWnKEy4PgTgro73R/dQFBbNOoALMFc8QTp0jdmsRRRsAzt1gP0coPHYuEHjce7LHrtRNjjoicdjw///wp96mJyv3jTN2Ey8i+6Ujdd+JUoS4kwzabA3Mh2SI3AvMvnWXXyTFtZFdqwJcEGLA6ImYPtMnTuWTa43tJ3A/qsDF/9Oclnj0ajvsAH1O65UbhQurzEEA/PWJHI80xjwsA5BwFtxi6JzA/A8BcIiKKetv8KhZJUF3Fqusdx+oaz8mcqOoIIn5hq7HEqIaaKiRvA2decAQeZ2jlfoaiTpbaU4i73pl8hF9ryqEpr6U4tvf6S3FaUh0PRZqhAUNeDYQJB5hn1RnJ0pF0sulI4Vu4BM27orRvUGyL9D6gtPVdG" + ], + signedMessage: [ + "algid:sign:RSA:raw": "BtSjq0EDo+UnmKU3nC1sgzbE/0oMM5xziS+CPxuzRVNPzJj7qkB07hUoUNTEZveiqS5oY/h0Dnlu3TbOretwwQTPSSS28u1z9OL+h/D/0j08g18J1K0PymysbLMDYfhdDioDL6VoOcBEsiAQhQPMrJQ4QbQBpoz5K31irM4OCZhb3Pwm+aXBvrOT2J7obp7BLOCHngYCXvGBGut9q/CX5Ni4/ORt8vTx+yzyX7m+tloIimyKt52+YM8aRlS1DbldRgRXvXr98ypmjXzxrh6vgLIDgS+Lj3qobUeWZOxZIGQw/gJKwOMjkWyTpvn6i5Wyud16kup+xL/comDTTzr2d80puzFVMIDE6ft9OzU3hdAXD7uPr7v7Hv1BCDr4u99pcuMixuoskcNFNy4K4JPbOVRNiVGVUl6rqvyHsB4rOEDp20LKb8qmwKj+3jnP/tsJ6jyQ5oSxKcAfcLe547mo5W8AsNNk8ATdF8sw7U5PuXEdJgCnfsdrdwjQIJmI1LPe", + "algid:sign:RSA:digest-PKCS1v15": "Dy8wdbDuteUxtxdYDnczmZOuLXhgmyk6pKueK/rE3St2aJU67ENYk9oXqSvX3HowbaCYxrBBnsSIqYSPo+bWmLwtDNs8/Jmlc8gHJt3vpXQ9+mSezHpK7RpvLW9E06CrA4M5U+41BeReDn2ZWZNXHOXVtjCf9earKypqhu1x7uJgtO4+S/7g+vOekJnHWo1SQ+mdx7EegtHbqP8o6zFBCR3bIchWTqMqx+oVTwoFq97VS1BZ3DGDi0aaTtiM7kTcycCY61EhFp54UZdSl2PdizYuW4l5iMcIBnbukgEFz5bOIn1OCDXKKIE8eR5zGa8tLrYWxkldamzRYWCbvtj9MxoU+rUa0oPabINVFtJKb1d/yca0mLZfZ4zNAOLI4pXcjMXbiwWCL1NiOrIPcVOWL5T6fDaSW0kaRLAKn9U2yzuzTjGu069E1+IHyt1i0M6EyY483tilrfOgd/f/TRF4azHshozpPM8kVdRZN27wBYXmtdJnAOoAMQtjJJCgqBSk", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "V/CYYLSo4c0EK1Swqu5L9PU4JEOAcA3XkiwHEhm4NcDj5WTgaV9XkhXzWSyo+wJQiL9m9EBJsE34V7cqtNNxzHMyjnYw6IIPOUzYy+oTFXXODjIhgC8OfqUNLrnBl0z+NQX0QJyxiU9c5cY6U3C+hDJEqfqylE3puc7EPZDsxBts4wrl3qFAzCyCgxkdla/kWQtuh0f61eVZOSN7YNceFijxe90ttHBworGItngL6dEr4OjJ5HBAuashlX5gXhEF1JAZOSGiffKdWEsN3U4RdIsVoRA+LHjJdxdme3GW+doMICcTkV5o9SB3yiiattGhVIAeFn36jvErYTD9dXMJb0CBwxlln3DmIY66lVLLDWq6ICyup/Po5NJWXVi9JvtW9pSISRR+uyqYGGw2WdegdGn1WlP82WYeO0fQT7A38dHGuVkAlArSPbIubKvwdJRcLjTobork1iBwU7WwOIcsmePsiWqdoKXsZ5oGoe1emNxq092zBnj09uMnovihGxXD", + "algid:sign:RSA:message-PKCS1v15:SHA224": "fSb9Bk+9FhQ1AO5PX1IaDpJ9jjQhZa3MVOr3xC5sm1vV+nUZCpultdJBFweFKGjhQfdac5WkxMraXJD74weZv8PVuDTR0TINbc2Th+b8MGmcvJDT9r1M7l74ObTQtEAjAVygZwnio2TL/jb35OAYIOtv9Pmb8LxdwtgCvcl7Nov51bEx1v1HRIw4vp0MyxgIy1wuEQPc41O81WuUYWyv1KuIFSU1UkGJ2RQcO2b+5i9kYeFlqrFRs9iQsrM8AuDSKoqUYmwRtCdVBOVU8eKKSeL2ZIVVU2xfeCBzlwW6ptMvRUPeFu6PCMEZG/EN3BLVLbRoLOClejCUupD9Afjp7r8a2KFG3qFk8srptMZ+4UzzMoG4kp0zzoIjc4gcZ1BKCh7KCrP0IWFoWgXp0sjPjnP0D+nnpOG5+ptXrdyFzZolN6R0gfpQ40Aq8GZwt4TJYWbab2YiTGggpxuoYfIkikzUOGxR5qPjV71TLoDIyI4ojdBTCXF+SN6bb4PTvasP", + "algid:sign:RSA:message-PKCS1v15:SHA256": "TC3n6BcED9Xbva5SwEM54CFzMgeTFZ+e6cdLT5GOfLpA0PY3NLiLYxIePd6GeupZdld/GYLCZipORcbBcaCQc+mnmoe76xSlMnffrvdSrSpqyS9ns/FIz0n6S9eO2VCzta03TwnX2VBcMXn3hxXi5IpinzQFKKRpRKN4m6gegzFOMSWaBNgjBlxTNg/FE8Z8MHZ0eBtUgDd1l5UqqtwSjovKhW5poI1esMLpug+FibXyX6oUm13l7aFdjyHAQCF8gCCvt3fyrY9zMFapp0qifQOEs83brhLCGu3LTUsEFczfcysCkAITjiIYb6oFgo1mWzFj5KV6RWddCIBAQ0k0f8R9Ypc9qegzr6WHhOvPhcPnDQPLOeLi8Iv/aMgQKdWy6ctddtu7pAUPQmf4WJYV5IBsACFcbuveNybL2CL1YtC7fcI3FpPRdxYkJVcC+QZ2RT4VyqvohmnJ7kvOXsvQVbaSuHl1Qmcw87MnmF2EPHC6DxGdqfqopCp6A7AJeWQ+", + "algid:sign:RSA:message-PKCS1v15:SHA384": "Vs2S9PnPOFsCbiKLMSBesuMt7R3GJr4p0PUgRcOUKKv45d6KD7Dp4/GcUxgnchCBvW4SpSgRB1J4gcXhnkY06oarqwq6nQ3LfNdyns8eJJW0mrYSf1W1WZkMOo3nADhmeztqZ9/dsgWI65x/cjEaFkcc4JYbFGpqYLv7l6wEsfeOMvqOqHcIRR3vm7msgSAMMUg2Vbs3LnSeQmPKW481wYdIvRUuKzsZGKL7MEotoGM22Ix1jaLqvWrSIrsrHlqu/PatCBPKIgaQz8FOZgMbCjgxHp+7aND/1TsskPhi7RYf6m6LcAVgdr3vaIsy1qXyfyVNTpAoXBqHiUwlob145H11bCV9dlhKlPAQ35NNyAyEdIXAQc+rFaksvaVJdPj0hr+VBIaAOTkG+AHXlnuynbXFGyGtX+smHbMqS2fHhnWrLetRsxCX4ePnQvSvyN6x4wz68kaBMVfq/wwxgcZu4Pwm6rtQhTChaX/UaFKlelIS8O4NMQ1R+CUBJWMWAJpu", + "algid:sign:RSA:message-PKCS1v15:SHA512": "QclLn+13g81mpsWw48n44i4mQiT4lxQaIe4R+8wyL6ftHPIZM3xkjMRL9Ij/sSlCg+pynGyf9TOBLaV7qM+gZUqA1DKLlVvwsLgSrrssKmDOE0oPEJJ9wWDNwrTWa1o42my17FMXL/+CvOA+3xw09D5bCliI1bI+SoZSHzaES/W+lgsGlMS60xMzGmiN949xhBBIFfZjvddCSuTKiXPw9ObWYz+FgQjxPnsUHZRMJCSOSYgp7bgI9q9VaoO4AOMBJCrH0rnP362B3edSNtFQ2Hm3bAnyZlVGvDUoEM9r0GQ39L03ifrDu7bdIC96C05KQNE7z/8e+Wh4pz2Ly6KY4DoSiiHC0D5+gJ2wAFb/QfQJhaZc9SbS4Trc87deyaYx1CQ/wjW96gsFXQTvoUahi1tdbBaSPqqxz8DaP9/crj2ekdR3hzxSMy0aa1/QR+Y/3Ip6G306toc38mJXLtGy6CaMm8FO23y2JykaDPyA6FQD9+toozdPQv3DEzT+0K3r" + ] + ) + ] + ) + + static let RSA_4096 = Fixture( + keySize: 4096, + publicDER: """ + MIICCgKCAgEAyp6KFBHi8Tz29tMOICHD/fIiuDNCnx/oM39rUcWJ3vnqWSjjBUuZT4vUSap6TVogk1qJczJE4ykpy58VGM5GXaTgLOJkzVBEPOq+WV5n/9KwteUf0EX9oS4rCs5Vz4IbTfG7IrZH9UlmnMcK9Qm+ndJyLWd5kZ30zWFdLS8b7NOKF4SJxZ1UayGM/IXAkUuT3rCn//0qfctH6Kc8ORC/EaQeKe6T43tklMDi4WPQqc+FmV7XkX7IqtAVxcgoE0ii9XUSEru8PdtpUqDAbgbtyOOLPdg7o+M0J/J2nj9vsVJSJGHiRY4LToVeSTeM12L4AEm7yzpjOhHWyR4UU9VyIxYzrkNmjmC+M9f/110wst2tMwZnZlxaLBrXAt4g/UWULMDHxQ4hsQmCwrfupf87NfoTrElgohw2BvB+SvkyfPz0HBeJjDxu2xAmRtPj0jxcwwTKLQXD35ndk++z6PHghnYnwwqyGSPnS8/BdjryaHq5dbIq1GYO2n61aZ6Rv/JBKQa/5i8jhUC840/AgBIGcwdLZlbyvXRkVPXGEQsvHJZXn+uZZByRJgVazI6811Af0alIR/8hQ7CZOn63cfNQYpzU10r+Pi/4ep7QIf3h4pBNPOvd2tqO7PNBwAKXO4+XNdAlrIBXzNuObRhfb4B33ZACN6Pu17cVyomf5tYO9BECAwEAAQ== + """, + privateDER: """ + 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 + """, + messages: [ + "": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:encrypt:RSA:PKCS1": "" + ], + signedMessage: [ + "algid:sign:RSA:raw": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "algid:sign:RSA:digest-PKCS1v15": "io1hfWK5emPka90cbjukVgqd9BtIQzfCOX6+bCyQz/xQY4soEhq8ScbpLqY2SdLMHXGSyShpP8Itbb5fDjboCG9o6vMiipwndJtcR7s7owonFu2U8JJGjpcHIc1icOc+kJ+mWW0OjJj8wzx0mWv1ZJ8hHQ6AcNmzBlRjJdvvWRwZ0vJRh7sUEoOH8xXL0jmEi7JdbNcE9OvEN9ZueCVbkwN8WzezQAzzlWOYRG2zTB3JbjEUAODDK6QWMEYFm7L955dDA34vuzpLm6swZTLOlwHSvHG99G/m6twOou7kT4qxm/N1p5uyN+1AQovVGTCZc7d46q4dU09N6JkRZ2oZRIkHhKXa9f72sKyKQT4DF+Kuzg/bkfVf8Q6q3a8qFAEBcQ9rqCb/1Hgw+M/B/XfFgPC74a0lgz9BdUNkZcQZyxCJrrUUAnbC+0+RlBXdwZw436hng3utiZgh3Y25QN9buidxfkOSGagPPwfDm+Q4PUi1vC4LnDuSY/RRZc4kqMXWDRKOyfxY5bZcup2ay3I6b/3KSI0RBXCWWk+du8w49WkAf8FTqazHilAcf/GM1lWanRr0rxEx3BoWRnX63dZJkQnIWrO0IvVPGHM6Kb73jM0pImgTPIg33J23/zO0jEx19vMjcE3AB0xLM2o9Yz+Yp9EguWjLoPp8IDe9jGSBYqo=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "kRgxpE3HYDZpGvahoh/pGgmCFyQ86nl5Fc+tsBmDv/iouaCQh8t+PyDVoxgIFtWvSuWLWBKqWNoxR8HHMFBwcC1RbztJ7/YQZLS2yxb/Y33YwOfSXcuk7Ep2Qhk02qvOxBkXbNGaNT//UR0Kq6vAsD5e75NhEGUjGlLugUrnqEdj2aRZkcjSE0m84CSz1lin1rEHW60Wn5qDfoIDIAxEE3Tu74HLjcHyd7bjiHPWAscqyoGgVXi/KXTvew0ooyscMX2+WG5w1lXgKeNtAGa/bb7CkT31VI9DPwDpvsopfQDXhLSIMC5W1oQmgzZbPnUWi4guYF/z9A44LNXqpZQzhcupU+6MA7k8cq5sCy8i8C4017mruFqMZ/Jo7qRjb37t5zN3aylVzogoDpXfn3GE1ExEK7fOy0kRaNL1iVTPqJSWl+kJLFrRE3NvRGTlogfSBPL4uyREYv0P+jrpyEFSGRaycA4vSvXo3nWmCWWFpboE/6+Y1PE/0y2ha0L6+kH29cRJA7lDO+LNaCBq962ZlbAjlpr5W4pMMIBGB5O4tQ8nUOK3vAiIaf5OGRkPo/t55gKyjpgf+ZMUK7HbQx09rTENf33nGsF0F/HE5vz5kQ0ifUA+Ublu9l5Pu/WHvhf3lduotMr6D2MNByuoisf5cPu0FtgaH8CseTQCJHqT+YI=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "DB+dCwjY+P7gbYbs1AtU5T7y86oo85UUk1Gz6In0WIPIAr3Ua7IvtWXh/SfhXPynK4YMeg6mcl1ecGfrCJnTHiAYK3qhg4tTQqs/BbNueXLyHFgm6C8pXOrIFu5dodkEYa0lNPMSe6Au41vsq2cXfJ22Mp7MkND5gMDAdJZVx09LF3T7bbEtGyOudAToJuJoCk0qXlfVRSWQRs7HStJwtjROThWYsetG91kQZpnDptk/LMxkC1owyI2QjttAzKZ0jVPpTdhL5SdZzOMnBKP/bouC2MB0D1/xf1j5RYNjR/s3iHtiNR+CpGvho09+CrXIeo08jfKgNld7b70PHoBdc2wU/2TXTZbo1qSa3R3Ra9NKzfAjkfX+BK6JrJlhP4B2ujSuwSFHD89XFPmmL8hjy8qY9P512pkqW00RqL+w0FN2WyivIw2bazw7P1GEprSewTyWtycUrid3A3heXKw3lsyX9UyWaYk5ZTpe8Zl4Zr5LZviD8419hjdZU+Am9I5iIKhmN5+IxwH/bB/d2HlpWiG1NVtmxE1juxcgVsAH4gqoB+TgGt88wOyzzZnzkqF6XAsPszcKvlAotRaYYQNZr6RZ8uIkJu8JNpkGSh0iUm6A38Sm/Mr8NEr25aS5/P3keu8I56Sus4m75avWVvS1LEB2feoQeOSHc0mvE9QWKxo=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "bc8za0TQIN3p9wCaHgQp0L3XtwB43fgxdYyYWt7XLWKJE3uYwP5RFEN3MHC7WLUfbN2q03n3dxz3RCtHYyQeQwRJNv8VOIZfnof7wkn/CCP06Fbc/F6BBdgVSEF5ZuvfLSSt3kdQM+pdjKI0nK56OTiXDJfEvpV94+AGIlD09DWDmCPGmEW/rF4gfJUI7TlQdgUue4OcYssUOZSMXH41Hy1dzUKq4aqHD1ZfGSWXcMNmslyzpiucoq4ot9WfcEZat8KNUPbwTeHX4stcEpinmo8sxOJi/wm3uY2DDOPXrJJtgG/hgOU8NvX0hawbSmgEuuOvDLKNW5x08UPWFXpDEKgMls3Oesq2Jxvm8GvJsJVchv4F50vKc0E4Q/4c+Vmi59bLIZ1PmD4J2/wkDJDfq4UrUZjPigMvGJIFiUWT0CCcdBCXZbT4HAhq/SBgd1XtYtjVbeppkf2IuC+4es0w8Cj2/XIV9QSz9iEsaQQwUh75c+vFP4ZScBGwIoEbKfhas3BivixmmUuZawYx8BsSUlEzhGNCf6xDGzsNZpKAIoVvyXq/WZ3YzIoOskQcyPhZ+39A6oEilbQ7AoDh9JnCp1B0H90jCsblfmG9Aex0uz0BEc6wxL3dp5+SOOEtZ4La6U5qd+nvcwb/Nm0jZXWxIXTfO9pxrI+0i6EBjUxwif0=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "qTNv7KL5swdsK+1SJnwBOrkz47yEQFBZ4ksTfbEczDkmi6gz4Cdkq86+dbkVaypPjqbqQ9YxarEkgiSYNypzDWE0oJwp9VjrwvIOgDY+QsUlMJbMKF5XBx83f8GzfthidsDnZ3wpff7dMJyzLII5MrcsqH543Avv2WB7VDVhc62T/QkVtlfiqexVEl5SZH1g98oQNfooUGAQH88RBuf564TJnZWDklyIeuryKMW0RrtWIajN4hNh7HH5jxEBM8TFhcbkY4iQ9GeasvWWnnUgNPV8OKFowZryDHhVRFStlFkhnJAXIlEpteo4VGb/CxWHo516+hnWbixicnIv1qd4vwdPTSBBDDHK5w0OhTYaNP0jHjgs2Tkr6dRxv+F481pvxYT3hcj69Fh5bFa4DO8XxtFvbhNhP6/AMfWcZ4fxYn4XiToFmvMYa7Q3JP5A4UTeOEBeEL3LWgP//wAn4qmlj2dH5jUYZjSk+CNZeMuyXrxKklbaKP3Bjd6RYeAm0Rgp1in1MgUMd1ScQ1ic3SPjv1tdTfj2MVmJDvXCJKJ2t2oQerCo8nY/rhN95Y67OihL8LkAq4Jz2DRDgCm+TTo3x9g1WcBsO6D/m9dBihLLnfdkZFWhc1UBLda4mkqEs828B7q1QlFe7Z4EJV3KVgEkS4Zd19hmvnFeZ1H6+G2mkfc=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "Vrv+Iy0EgV/MwSzu1iMODl/SQ6ORy26sCwQNuG/4Zeub5pD9STOwRuZGpXC2IM7HutAHkJDWApfpTDkd4sH9HgwWmwWdNTHz2P+UY7GhjrWsAUBz5BtisvT0dRMNIhN+NCgTtMK1wHhSqYki8FP6ZgHcS9XfMS6aqoNbKqYDVfbcKblSzXkY/002JnXFJibD+TnPSzOsY9khh71zwDSFr/93V//p16uGVS23OVBLyK8gCVQsZ7fAJNVntXByqaRAEo9QeLfQisjJUfSgvAYgvEAtcJ1i1ncsfXGLlL12OFaAFJGxtNVXDywDDKLKxMAUPl1QI0BSmS/MkBDzabiOTciZhh8mer++5OkT/OtoXSI+dROhI1F6bsCS3jWPeFMehJ8iOJESOHqKiNAE1rxxVI48q2UsggyBU+Qu0fDiV9FMz7QIw2afyIAG9XDp6/sapjSBoKyUy4t2IRl+HlTpnV4x/SdIcnNbZck4nQqGsCgF7Z0Lx5Q8Ye5fMmAVBI0iHFucAr5D9FK6/V2SHKwENDOc7nq8z29xqHdXG5NqeZqQAd+KT7Imnr0CicKc8C12Ysu3eFKs6LoSPjKJZqWUMZxTJ+lMsfxCqrgNzRbJ8n1fZAGvtQrI8fsGZ8hqvI7Jcg5fFNOa2wNr2EcbvtI6pIjyXxu/uJixdUUxq5/cGro=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "vjT2h52Ib4dOMBIaXsFxgfWCD14BA7XuaasMsvAeVXtpGFWbdIc7juHcSG22nzRUvSFpJyEFwzkSIoBfyVf6smJ14k2Ns+iOMAM5g/gHzAE5lpCoX+1vxQhutxFr0/VYKy9Y51u5Qp0DBnBHQn08f6zJWeULbvN7CW6PiEfCi9HFXGlPWI1jS4YbM/N7C1JqGA2kLS9JCHjdGKoMXrsvKaqurBhiQGa9mD7zs6g8EumSZcnXldVy+BRClFzidCsCZihZu3RDleEhW0jZDCmj7tvhJcleUL2FfqatI2QghgdOkJEzv3oaUqbRwI6f8klb6Lz/US8ucSl77t9xBhwOROA9W9gB732mpADUQrv9KO1BXJwJ64YKouRA4JwAGGRd4rfuvsxR6JXVvd7SdccW/tsLxQurpsmFUBrO1jIt85kImnYpSCdlzXNduLinx9psYVK+b369CP5CYnWYveMhSQRV3A5XoiyvEuW6iKYHicYnteKoN01OVscvR5iQVBpmYaZzO4QrEAAHTT40BH4Ai8pFmt/1lOYpHSzMfajIGcxw/f5pmip2KvhjJ/U7mr5uc7R46JjAFRz7DJZvvp3sQS0QhZ0TlF4TpqUVboM7jludKc6K4oUbB9vlpgPOTJKBDU3m/cwD3vluIQXJB5RyO5UtlijyHYUjSzNcScyeq8g=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "xhl7MsNHXUzFPNXxt/KOI6AIaFbs6QlySawLASdYScVnBDmVK//10EMAelwuN/macRLa53khIzeq6GdR2I7eYuqbBn9vKX6bdPqHwjY7Bq/fbmFKUBFbB69yDJeI8jVu3stMQ1Sv2Bkao5By1vvdVhOFtsvaRlYKGFEHBZ5UhgRDCzVtOJE5eqRxt5MjT/W3X6/8AL9jVZ7r9Q/bSo8vBJaypzgsJOfpIyAWk5qnMDZ2miexbCH75PukLDdt5hK2EsiyilYRWMvLO4vr2IA/RktLsgJmfqbPflOD72TQ2kLMxoBC4PLDXpESu4Xl3BTZrG+DRvvsHBVrYod+KadieIZnUci7pnlQiI2J63OiZJW9izZsPhUDH8Oy/ZWxAJAi+zRCh2ZyTDelC0ykjkgyaHUn+hzl8deVSKRoMpCwHB5e/XoJvVAw9A1rljdom8u01xGPgMYc0iitLO5e9wsqUhVrhCTqUXAoZyz1L0Uib/JUhS3XQAiRGh2adjEhDubwVH5vNVkqclijjSFGtMLrelGbZFcKWP4k7GJcdwlbWNgOsOUkFYHB4myERBhQzFbm9iw3wVo9tnDmqmPe1vSfDyF9wpMfsryS0RMMC284kAqXzMuHFXHzYujRMuYBNQ5dPhjKaD8KVwWYH/M124gXQXwkWWAFcXrZtHdi9wFtGRk=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "HWA5bFNMeO69H5+R3efkyZbzIb3CtHXW5WHnXhtZBX6sBTH04Cn5PHFfydKOjmyIYXqRQfoW8rx2bmh+qQQ3GPg/RJvScsCLwYhfL1IuXEoAAZFLVQjFCA/jddUBUM7xmPMBLonxz4ctB/T+sJfmDJ+2fMOqsuGvPodfcFflHt0p1qKpvnfg675ijbxO0zkb6ZT3jQawyTuTNhXTVRG6dhdCa35+1RHqWBFMbWdBoX7dpVM5vbQ+DjOvzht7pSHiv5rXpyy6TbtXmhHRzEuznutmCYVx1i5Wg7lqoqqGuwK1Y7DGYSRZo21cm3PKTJgNg/XUp1AL8YlJzHHkOtGZwXH+eJC0cg7TDw4KtFGRwOdFEOFxjG6ikeAy2mhXCgJBR+xVagHI6wxEGtNhu7S6eOWpeCS0uuFUrHL+f+i3twD33Cf7AXYBPFt9UizNw63RE0xQyY1pm9SpNRvYdICXSLPbR2b3W+vDykci6hNDklSO8rWYbFR+SPju3qBQbN3/m1KKqdmUa2MuD7rwAe9zcNQ8rerSMrjeODeRDx+Ol/G5U/l0hvuTJX6Gh80eK0S5qDMsBQF4sE4Oz8dQov3/Y38nAeJdz62cyS5u+r8zhE2Ici8X9ERTEMi32uGYfAkrx1HzrkLpkmXq0M+us+DI2ahLv+HE9FwuJcNCHMv3m7o=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "FTV4T5ZQXxhf5NkRCmD+6PrDgvCPf9e5dHbBEt3ZKD1aUjlx21U3KW6nv61lJ4DrG9woXlFfSd9HEP/viPZ48p173mR4/WTJiuVaMB6M7kRGTGhA+ZNq6RWFEj0mqCuPNtma45gUzDvklJDDO09eEQfatNMHQo2F/1oEpbfZyuI1Euxi1JnjAmMNMBJzkzsltDPdBafxy+ZGqdaQp4+9f5z4gi6AVmbu0zxGbu2Fa8KjgCUllvCQfgOBcq3o59BTtvvpYqSnR5z00rq+HPVxbiqqPxLL8ZO111oSfzSUPQ9OFnjWK1wx4eBIesxa42wyWTvXXR8QF5t2wOjCtNfhRjRfWAJOuVgBD8+PceqceRLqIMySeCmKUTlLQInrZIPp6ZBsexqFKQKCyuMCP79QA294gB8Oy6Bui5+NuWhsK+upCu2TxXhb8/Uqj8aPKWLkOwS0BVeRfwDmDebkN0XEOgVO99uxlxALj1Clkz9fBM4RbVfecGcn8y2txbAejanWTNsN9ifK6lA5NO/dFGsOkZXmFm2IxWTzL0r52HyxzUxeBIk3OnfijQpWbyRsWrqYw/uNEIYBFxu7O0VxSwvQLjl4fmj3XglKUrq2siLeQk3eXOx64RLyZ6uXeUbTn6bBcUN6iGHO9UhMPJFezvcqIWqXoCIM+/My4/7sDoYACLg=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "yKR6+Od3PLRVh7ubg7dIFIVWXCCQdRvKA72C7giF72cKNPzd9MhiGRQM7xEwG8XnQGwtfVTcOwLdLfXJK4ZDy8iuIxQxoAiG7/+p9X+/W/My2duUvaaiMBFStdvMPKv0guEJlasoVqI8g1GJZHen6ZNbhEZMh+VlOgDbWOPwMiYnxP+13lJ0l4AkuK449+rP4iATgVYCPBAhV9+H2EPYuNOkXtkukJem6agQAlqXvnv4WwZc8bhukVKqy7WAzYTzJfQzH/XeN3r5wVBbwwiOn0r2L1T9PDLBiTYcRxbCoN9Q3oxVwk8sBFh3mc/LlnOW7pwlME2xDHY5lfUVOq8/lNhFMomS8hkSIS53TKshxoa09vQNPR2WJJat5gVLTYGGOXYWDXFfALGmpHstsxHIxg1K4FnO1FSXz/5k9ZxL9JSgyW8Y8u+0ihkID8+Hef8Gtid1eK3kVsTp/Z541K+BB5lnSiRrnUlonVkns+5oN1Ep0gqjq0dQ1i2e4GtSX+CGzB7sXysAIxzqtHwbL4/cQVbSljFgqP/Agm4pWUpR7FwcrwVCpYLZMPTCV4C3mMvZN2EYdhRABpX2pmwoDj+TX/gnMzRO+E7yetTk9ntnakVcCNzIPt3Zhd55q8NDxrcYY79A8a65aEnYw7NTfB3HTx6wKLAgqO7B6D1d5hAK/DY=" + ] + ), + "👋": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "fUrZJy3RZm2QJvCLDOMTiU6P99iFZ34k3GhaRSWb/83WdDerMZuN9nG/BB26YNlcU4oUkuH42mP0sBGVCppFd1W6XBUnPub5jIeT5XpHxdEnZsfx/UJlR0Y3pCUKYaUYhSrl0nJEVKnn+exqKn0ij/6lJm3y2syXsgHd4GjLnGVPaAUU08G5BnueoVaYrmh2Dwi0TRmLTMIvti3U52YhhDsSVa2jbeAbCz4dJiBUH08hqXWnTw7toBcXIhrNDmnuTGU1M/nYQg9JH/2Wn5VhGokPyLaDEGn1R2wlJJokriO52h3U63wH8GwJL2lBl4eC7btx8uEQcXjJvRQ927fNXxVMdSXacaikW+sYjzvqYcN36XVIHRDpIpZcXEU0EFNo8lmuP2LoTnCCoI8aErMc+ua08XyQHjKWBqga++XFyvJyuJEl4DeamtNUrkCVdPDYs58VYw/HzbjR67f4btRUWR3uch/Azz2mxXtUGI62uTCuKAv2TZva2ILvkGhJC2CcJNg8CYP4UqwHA0v+GIwipyoGm0anNuqf3rz9Gn1TDv9Eg6PXP11oDPvhCapvlFW4vOkO4hqQSashgNOVEEm1sjplhql2+8LRQZJuOgrp7JNnSeF/E0EaVGVy+16eF+kdBix0q4C0U9CrSGYep32zOIriMKrvw2h4tyCEalvPcWg=", + "algid:encrypt:RSA:PKCS1": "bW44iL5XzS3N3CU6SySet1aDMEVLYJvQoYflPrn4eE2ABE5/eurhdHIU1yh99zriAiWlhmDagmEKOQMroxhTRz+SKi+IDUV8Y3c2DIAi/LGFgzkBdvdiLmso9bxD7kq3w+ZDq+8ft6ETHUMibYPqtzIqQ58Ob3MgDxQqLsIFtY2iHWsJNylqkmEZVcNC4f9j+3FVkYgx396MizR/2p5WDHkO+bsJvKs9Kkmn2j5jFn4344VYXJFYf2vCtl6EEavfdklbtJGlsbXTZ5v7BfPI1CA9tLpnNhDQ5KvyBoiM8+iH1yJ4bdIT+diB5z39BE9EokYC7dCDczaW+Y/KK+xfu6DY1ht0B/DgiX30O7RF86tPVB6ZOHv9arhHx/GsY/bYDjQdl31pcIQ6RNuYxu4fM8RK8ig38zYvK7p8QoqTs/xQUkfij7JUU/MqDhWr1Syk/tM9ecauryUFh2hx8bT8ON83oCDq0R8EQcM31/nNz5NdGEnYVgrj+KI6olBUkfdHZ5Lrday7XOZA9OPUs0uvnhBgoVkIyGZR7MWZNOGBiz3LFEaQPIeEoR82o6u3CNuXLBi+Zm60gxooESne2XJLLTkkX1NAQJ7MUhBIPzZDVBqjBvsTVB/McoG/2iqNP9wHdBepyGJ9cVgvXb8pVjuh32giQt6IgYMtkJkdutvyy3c=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "RVfn/YLUJklmoAOwcNWO0EUOz0JlsbOXuIaTZ0E8Bvrcxc3QRzDgOo8esS468MkIG4L4iwEPpq9mkSqbz/Cua/MFkrZrcoiKrj5RMqvNsjExVOcAfW9I+keHzzEN2ymRobM7OsbO+bovlaXPe/APu4YW+rSvpBhHRzBchVtaHdzFhrraV7tGrJZeduq5CV/Sw1eTXP/JqStqFVEssib6fSKvks13yiaWBfGEdwjkSMVQpD5f9iPeKEpATGPT9D7rolWGPMN3pocI9DVnOQjY7jPD91G2M/N6onAfR3nH/HbH01HOGkpu+DJGqaCB8hgFMhwrhvRRtw1tsBlVAU0IFJfoX9kinpcpgY5U8YYkj2SQEKB9GMVEn9bVPaoiixy14y+HQocot8O9Lb6TJM/q/uI+yJ8X2nyU9NGy1q0HNWs7xH10FF8JCHcRDZHiCihtv6cVmst6gsKFMe5c502hHsdqk5pDmjeqgwm7Rnd3cRS8VD/Rxzl5y9MJw3APBQF1dqUto/QehLswh47uB+VlaR6KkUBPwWJGzKkstAjTUDUbmGO5wgG6EMP+7MoZbOVUa0xjk0uNUVstQs8HQ7ncS8+HC6dnoUTlFjF0GY9oNOi7KJNwqwmeBHin26sBruo/rN3lPF1ENT0TpHGaReK/amFtIY3wgdg9UI74/qug9uY=", + "algid:sign:RSA:digest-PKCS1v15": "eC1NYUeo3mCJcKJqcuQRl8i66Ykdy6NGQAgJNgsftcaX/BY5+W1em1LDNVFagmy7Y3Um6LjkCRbqdggAWH0iE0DS7NJLFX7EfEf+r7n0bi5DjPsjA2dktof6os86jke1/kfKkwBJVQ/FbzBjvVxrq5cCft0wwGQvTagD1wwF59+IYQFUDJv7nC17xwpk2ctPXoM2RfWlWPwmhQKxFrBPVrE6vng3Nr9SwYceS+CCeaIdWdg7it5Md6ARrUaHOqubsN5xMszH4pysPwrTX+ndY2PLqorhOB3+m8mSzXWVC2VGYv96aGuNO1ihUY0/vhvsOn1btMr/O8Uk+gLduh8WbNdtYXik7dFrXhcOtmpOWhFKg+MVwDgcvWje9tbESB/H7u+wyB/0qaxA9ZrY0cjurut1VP9GIJHG0BmooHWfQtrqBlsLFhGhklSHuomjq3KjmFEEtVWC+xfEyrnGFS+YVZvO6CqAGd5wHLlAjWru23tPv22EXjA9I5h6LjQjmRB81KpAvXsKb+3GB8YA9v0jIERWzgXJ5Ip/+a65rOpmSLwfmRLPjw9G10PjAZEBrhIAjTUZhQFu0Ito+MfVxpiwPF/k5WCuhNqntePK0fwqywvQmzsRoO3ZNbhaY9vehytB0CyqVzigXfdYHRvAwC4RJ2q+VWevPYiB6utFWzcR/a8=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "gmXFm7eKWN7eIt1IvCKBwQR1rhQCZH9KHqBwHOBfVijT4pM6l7ccgucimxX0RtH/51pQblviLhFFCTMAz+Wle5aPtda2zC1U9y6mO3ytsQcJ35u//dggkO/UILESfHDkadIeQM3usxaLK5GqBgxKCg5S2ivk/m8Qi4YSOgSV44g3cAOkdnwsfiKR3CFj2gO6l3aW2tIhDHSgds4v6hqhs0qLU6xLZWUQX8RDCkVapTEZjB0df877HFiIINUMaWRpo1y+nIwaNJ+X6es1gTMsBnlogCJ69aKFhkT/ryiA0VTlyfpP/ndJXbzEvbt3U4fSBrp+jR7A6/t/OJxm5sCrGyYfeW/UmSa1xh6vUY6XCCEgrdmVyqQ8hbaC3BPKt3tDM5CFRF8SljJcLptOS/sJZMGEx+tispZ9S8KqGAqUWV2CVYT+cqHUXSH/4E8zeAuvnT9pePEZaE29P7nLYOBZul6wW2wNv+H9J8fMXlJKeM3cPYFF6X334GRvhQbomoHUm8hWMsVEvrGE6IH6HVxU6nYu3EphmLuuigBqusMa+g2LpYPGNZEE0sz8MJRi0ygAKFrMTlkGqZLGC//oOqcSIb3trTGSB30+XPEXdq0gxtY/FLmGQTpSU1McIVU5ZoCn68nzSwR9L2w2IgcDE6tfLXLj8u+4z18AwzP7buKpeFE=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "GOk+2sarqkyWvSNVN4Thu2yfOmfWiHr9Mb9xPoYzgGutdqaAaD5fvHLezw0QW2QVVKO9mHZ8yShtOouioKsMWEjKXzxw+plLfWyAtvuwSapcm6ImWl5+iCi00Wt2UyBCMn+jJhzSSupFK/QZEV//pqmy9EkRBGAtXjlUOk0XqMnksUGQ5h4F6SyTIJ131Xt9cgzVN5h0/rIcoxniFQ88mq9FDiKaL9Yt9zJhengGEK60vl3Fpu5HL3PMxg48vdlOI1M4GWN96AJdc/BgE0rXlyGnEEE3Q5y6UetZ5l5dxTJKVtpQNTAUwVatLnshlBNJjYN7bldELEVdfVj3l09HIZYOVjAiCWjlPrH7JhfgVm2J1hYDEdj105yAotl4s2Fk9P8fYPfE3tZyOqKTaGxDtEINMdMPjzqcFPwKpazIoShSNFMyTu9xudonSwZk8HNi3XRhp7iX2cu1eoJ4enAkm+ORSwLwRFGR1E5CVLhTZ83gvultGEdef0fbzJyM9UGDk1sq4vlUPbNXz55sAGBoCPOOV8Wfw7h/tfzsJ6s9W2u64141s8fs5gVHqwqCGJ/L9HsSx6HSYSDFaLYu4sm0NS+6lcs/lzN3ffFV3dfTJOY1x4a2+gjPU03eKdv/YoZtzijEM04TjLPzf6eAr7/F0WmmzzdycBCEZl9eg4Cyowo=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "iZPHmN7uK8r2jVkUmBdqJsgPnLbAQd9HwNErF8hnHowHS/W4tCcFmYODh20hIIok00b9Z4BGOlfs6FPqYL+cBctASqHR8FA1wD/ZitY0pfo/4UEOkM0qFuqAJ6iKIyQq0LAzlZ14o0wmpw+36fFEW7xK9zXq4AL37MjKn/OmuFSR6Tz3Tn08jkU/pfONP/YGdC/pQe55PdVxL8c1hjViZQVNoJbZDSieHrwI/wycJFvihJAFsFsdY8sa02SNqTPsBtWTlByOD3C1+WX6IZoYxKQELEw30jMQJjs2KU5eG/f0e0iwN653cm8fGw3AjPtN1CXLGDEl/gdSwHfX23972R+TZi9QkvCqXg6N3xVhXZBSj7RzI+tR1y3MFJXSqUOHgu2Vge7SSey4HVCFymExCVChWDwy7cxm3frV5rSBrWpOTJrSDI27TaB0WcC+wGGrmFavzHO5HsXeJwjUMr8wAVj5p0jnm2i+qwduThmbgMgQCPK/nG+FqGKBLA+VtFDrk4zQ3WFhCUPHhb1GKBJiJqMRGXzs/IpQGSmpFKj1J1AFZ5PSAezrCh28lVDStvt5h9JfzXmMJcT9SWQIfLmK38v53D9G8UcaWD6F0XLiEqWHaC6RhVYcpi0IGIwea6jBEKwIOpauQqE7dgT3iHM7/N/nwrjW8hQfA6bNy/d2Z/k=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "MHWI/4we5lib51UOVvjIir0UGAv0wyVZnsWuE0NK643XvVGpgtxmwUwjKDZ8V2Xt1aeg8sfw/iN47nl9y0lscoH3ZFPLc33hykz4KdI9zLTyXEYptpUcdabF0SAhd35l33zo43EG1S48bVL4hPZAJVGItok/hS/DtmhXgZbZuu5kLJf/VoCEawYb6n/dgk8e9dR9GKhiFpAkgF6TZlfk7fg1due2OmcDzQ3NZZo2PQljGj7jCjBJ/CEBqS/QOgVdRquRoRVoIFyaJlVEbHHv/+E68bBhMMQvq0qbKWsvEJdJLTWWHSMhIziINWHNEXaNuoxd5SkzfRVfoZc+Zi3gC4XK2/1lMWvKYMlNgoh0IuVOJBMjIMxaW6YwtkLTkP8rAtQzCvy4VbyB5Fiz1S9rcOe9AD2TQX7dF3S0qJ2CMJWG738HK0usb9pY5q7XIzqUCvK/geOf6/UNv8Cal+hJCKU+NwktlHHGRcMmZ/HTFgiKZAWCClTfmEDhK8wFnR8N5tCUXCM8zy7EbvNYnxFMxo6Mj3Eoeo3YkXvGkjIKen4YE9NYm7VzDRGRwxKiU3OH86yJdGZE0e59sOuppMR0jUMrq/I3fmq25Bwdg7RMtwhwsh3aOc6afZw/6Q1VSZ4Q4eU2unjlYtZ6BeZJcIwiplZfYzuI9n4oj5IsfNpcRH8=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "Jv8LKcl80B0/1slYYDryZDHKq2rLYVdmJfef993gM9G1EqfjZgXxtmgY/gjhSk9ZK8PfqnXbd9r+xtHBfyqCTLg4ApypQa1ir0dHzvOZsyaj/fhILG/C1pFMnVaIyFmUgU2N3sgtFJz3tbROwiwfL7sLt9EcIFSIRYLAuYVI8Mq8kTRv4VJYgtZBQXh3dc7sbtNGdeNuvT7GasBe6yzNwC5mDwhBaAb4B5POpzruyf9ICV1C3RrVJuG9Jujod7MWIh/dQir13OPgG+zFCpwLg/MFLK2pI2m3kzXsUxh4QqJ48F9LXHDy3i0R0uWYGNdl4wdIrM1cgYugksFSgmaBn394C/nL6dPtMRhAxUTUJehcw3oFeeTWWUx80G2BypgcbootMFnOEZeJO68qp/r8J8ffw2T3npuLRl6V2sbXCErBvq9tYdkR2z3DapGRVhE1q7g73OhJMveOkLwsrjR5Fr2sjB2+utO8L55RAnSLqOPKxX9mT+Mjevjwk9uGbxI8YTQ6we9pEwQUJ/l7IWakIJiVfrg3Zq9WAP8aLnku9gmhciSawNZpe6LGqdzBwwW3g6lscUceHpQ+yStLQOzpmrYDZRrjr0Z1TaRfgmHEJajLCK2/FKR1YpN0GxIkj8LU4tjT+1BDM0DqNhDXe7BNHpG5UeR5xifMJU2+r1avf44=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "LUGycQCpRNBvCSwTblYZMR0E9enq7mpTh9q/6OQYyP+bfry/BycWa39ChzR4JGOLPUAyCVuVSHRw0+14u8DtVICdy7rtxCjSsDBtgpfxNmRP2OTWjv+Si0W/+/rj1eKxLOi+3T1IJUx5cRxK3aC3UcmBQAOgbbcJKwmlFV6oeiPi2po6MsyqmQu5WcgY1BQtDcrmNP+1wBjHapHwxr/9cfWK7LzshqBM7ZwpF4/57aSpDa1XS03aubh38rgfO0QeYo6/0btRse2ZTjOywYSqI2Aod6YwXpp0fhfGEH4RNANDWaMUsFVlDjweWde1V3QWMFDdVHrnzguvqJ/rHRbAxUkenQgCpWcMnEP/Z8i/81gwwKAMuGo9eEkfFW1rfwOvL2z2N3AdVOknjR6tSqJmuqejRqktf6U1qZ1rUxMFRgYJpA0rHTJItsRdX6030HRROopGK5/IgGL+0/B4HPVPMUm7ulJ9et+Kk0enpt9cIDaHggL5h8DTGxKaFXFgf1A8kf50+rhD2g5vArFl6WjsJiZHhI8VL/NBgkPGKU/2a6DrxTcDZL5YhKSJu5v4QTCvviAT7sginkyZxB4XvXwAJtJr++cNkHGkFLuFGb2x549zeRitu2ZjNLYtYDBRTz1/EmL1AWGX675gauk9ajm52Oixr5ztEXfUIkVIlqEeIV8=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "a8saObW4HZ11Eg7sle9NPqXT20Q/LEJzaZezkokoEOVliFec3eYzPFF+rMrbLcOB9pBhye/gQ9ybbzR4O43YkxgBjt0R8k65v+gbklT82w7wLzKqS4wi782wroyO3KdHYX/InWGJ6COhptuHTJKRnl9O5rS7U+uBgIb3sf5TgT9rN192ltNlcYG4963FPf0fJSdgiO56Q3Q+WFKP1R8ix6VJLt9kT9VLdhyZSHKRocIB+bNY3JlVtczjCzFMadBPG5ZeWt+YhfvcQfWxDkqa39li4/NRJwcelN2nwIJ2kdr6rg1hQ41OtycesPnSOXWDmOdYDVCeddNpLos+0CenHFY8roQoAmA/5LSRce4G00b58kjFlqDuPt2g7BcjKghJ0LjAt0nTjBS6dprqImvSmqjMa844RqkT86O4kbfPJR1C7wEeB8EyRqv4ExeZTNU4PRDCRruBnVNTSVBqOMGwdAD9xCxuHPkasa+IKZdTShD0Zxc8iMSzBqT/9hp+P6t2IRPLv4G9ZZHw+tTGqYKjGKL2G0o2VjBhrEjnVzP4DFEWj0FOl/h2hB7z30k7d8dKEx/xvOkTCe2i0fDPzlPBeKPXj1IRAuyeIwd8aWOiRpZrd5ROJ6st/oJRc6BLizz5zstprkcQFvJlbtYlM2Dot1uLyb4JuW/G+j7torMQqKM=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "Qi7nNlTs5/zKpyStJWd/iHqCPjdWJmUtYG9peQXWVtnfvYtZmetLjxXwBbQLKroeVef3BN/iiScEUwH1Sb+14iXBI7pvs4BsFvj52aCzUOKmEBH1F6sms2Q+OVTABSBbBgsmD8aONN/VuCog+Mi2T9QOUh9Z9TzsPcvLeo4GtMQIeS+x8+BKhY3arcMMKlLShfEp1zysa5VOnQaX7bs0suUU2Pq3ceRGe2c5rTfgnIh7md5A5LNZAi/h/xsYQcMB6iiRWGUGIIPKwlJfL0Waskyhx6nwiVSyPyUUbrTmelTTFM8bgfPiaSFWlXXIS3dGNUzaIMdCfwXkv0M5mdoFvi+VkM2JP6GwXg9rxv+d3MTHrRxdC709MxQeLTldfkX+Z1YRIgUaDa3gQBRXOnD0l2aotm0XpjQw4HwW//P6rLg2VYbZphbu9EYornucZvtXmLwui957E1CELkEC5fk0yq8s46phEKGm9yL80sbeWOmoUvVvb1aUr8SR3iqFm/iEYvV4xCKM5A+H2YJO5V59Vdl/iv1PkdGBIcQCCeqLq/KQzcgdE3s91WCFZFGt/ngxjhyLivdFvVIjiv+VHxtYZGGWzoFWTM2H+VPzwIkYMRAa7w32FAxb5vgJGp2eq5oNPVcVp4zhPIaQYV9KV39O9ggoj8zcWdTutMtPNox0QIQ=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "FQivNy4acd5UVjlgtMJDtvid1DVh2+LQ9kiOY0enDyF9Aoq0omhtiAhzr2fZ2jG4SWQ+En/3PxkDjnIzWsb9dY0lNXpmq2q4ekz/RwSt4r6699z/x49p6fg3X4rCt4AIzs40dlXL728gA3urPh6PmmtzmokvLv7wNE+pQZAaNUwPkEVy1GUNY0OHo2MF5L8KU95/FW+V5tctTxyA6WHwzLZ6nKeABVZzgIPpWpOCy4KVOLliT5dnyUutXuLMk/zyKWuzHMYX0V8IBTLaqS+zDAJ3bFe9mpXCRf50xTy6Kljt2ZxmOuxkfLFMoSTC+fOg/FiHjyoM5x1VDha/Bz+xCsoBXAVYvVg/2FjiJ1GJxKV0Gdvt271Ke5fEX1lsY8jNmvUGj7VwJtmdpldiD4RDTc/f50DvpZ913OaFloX3VSiz1/PHQQdFXfGhOiS0+1cnhBZRaCHVFZPpCllLfPmSKFVWMwo4ViTJdjSr1ZxNr3xoyt1zEnVYTzirHiPPDJM63XAMfVJ1D6PKpytrimAT2uN7BvENkraZ17cYlhanp2kRNop2IHMBhT77lcrwCuAvOsMrcQDNUthMnK/WDeuUfwIpaChm1tAzDAtaYAJV1qqvqgl8CkeSOF4+UibcpeQV+JzHzwZC6FwWbFsf7o8cfvN1P3ySFT6CDjTAnqmsONU=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "F54RyblfVaXJQJuaiHlGtPWGAlCtUKYPTENnM4JCA3lCbH8F4nlzp6+FYX0o851ZbOA4hW0n7E65Wub41wpPaB87XAunckjMeumb7xibpAQXVvmGqG8DuOGctQ/3/O4yiTU26cn9en6x5ahPUWk5mjUgOw2FumKcBADO/bQ8pyUC0qkwzWJvGk252qJpIS/2sJdrhZQw2gJ4BpgG+ZQPDzY6BKyOD0mp5QGI7ppGkskBRpGfuZmH4ncT+Q7dqu/RkpVLEq0ypMf+ig4OBEWq3Ez1pmSd5P6ZpVLtSJ4Vg88Z/y4qe5hOv7GHLYg41LVsc7gh8ZZQwaHYdn+7O+mBLvj6kh0tDAMSYx79vN9KEvT+CuOAeLeY6phPGttwkPjQPzMDBbMVZfVcobfMgM3tEH2ICIrHZIK6ydAYva4Ulw5KJ242+hnpYktwmEeCclufkpvpq6J8QsL61RLJCrkThNNdKpijCypuBGx4C/r0sPvUUez0JcZ1P63d8ZE0NBG7aTuHroH9IaXsg/fTz43ssLbnDP5lsE8VnWzoVBA6oi4kp25/l8onX0QiKtJ/mvxS2h7W/FZjUBVkpTS7Z3HYW9p7nbaozGJmPL+dWqqAb7CkBUwkJ9Q55dLOZ0uzI9GkKzv5FHpoV+NusN2z6r/ijIGor0midOYPHYIqhYMaCKE=" + ] + ), + "RSA Keys": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "LQy026ikurKFBYuLIuWMXy0u0gTOOd53n/tY+uuFwsbKLJoadbrLCLHgMjjANCv9hCWtq5KdyhckFT83cvdAsLxWDf/CQ92/gGtEFWVNl2k2GzEEvf6XAY0UVfk7i2qsfBgpfpebY55/npERHGuOnjsxzIMD9Qpcu8nMqls1CSGs/dtFbV+5NC1PtCKBhP11Fhr2a+SD854xBlP+wzJLb8V6gOc4n3VBA6DPPQYrfafK13x2LOmGYJ0jksB5I2N4yxJ4mWjqOhe0iezG3ZjGgXGrMrvIOjNg6Cfy4ft1onPbOqB2tcR7M8t2DbNOWA3AyFqhUV3nDuEfuUM9Gep2a6Bk484su1Mgz550rQV6XfvvWjcRWOJz7Lh3q6sJvFJmTwiKjZLggYIMZ1oD7mB0gqhJU3NxfyvNHjtdYxkDFvqy9yZTpnkEBlwOz5Q0EfqWWZTSprTDFJeQkPvv6/ZCki1ls3pMHuxAOQnrZ46vbr9eZ1hbkizfLoNW0zbuFfpA7iWD/lzfm6XIrXe+V/BSnT66A3WoYszhQ+7ru0czWZxWRJ0NdjBFt6rY7vJjra9X5lIICd5MWypTUFRh7C6AAl/fvOGui/cBm3VYc3V1iPNU1DJW0sicjtl4SVJx1em6JVv+uHH7X70mo+rWytvp9GsOM792Nr2shdYNAA7f0GY=", + "algid:encrypt:RSA:PKCS1": "hsfWWoLjpeX+LnoyzPHZoonzL118Kb/T8SlRGobNtPolGRIYouJC9chvAZzT18EGd6yh/E2AAbI46lENl3YREWZhKcnKohSovpVVHsM6lVBVir7C65uK9wfKkZbiRRoc6pdL45rwUVCF2/ffGKJseYL7LOSqK/GZPZA5/n16zQ5yICnmbT5ogCxdsEQsKsBpes3rbe13/R7W0nQCaZEP0KZv53CHuNzyVmjGc8TK5bYqYOm/XwwuyBLUxvoEMfXnIu6JIyPCygiOW5nMKcfIMuq63v/RpBJ70f0qjNLMzsgr5uxxZBwXyFQO9/zAdQQpYNkrOQj9XDK+tEox02Zf5IKEgB8+27k0aHuZqDumCJDHSOzJww6jmAP421Xn/tdkqP5kcqZ1q/e7sMlsDpMLcLr++PUaZwYxCs8GO32R20krmkgu/pmo4/0xIr/HWRMDii+HSfr40fvSY9DKBgbMla4IwYGmhJXnxKQwkZ4+xdsCZ8MhPPlC5wiRYIsuPVTKqAwPxtS1obYQ1oUZgIuKSI/TPkLNLGrepbJRKVxupN11PO0GdjAWratbIkrVgaNc61N7tSYQI2ny5aE+fUz2re0luUapDwmA2PxvYIxke/5rqIZrPWw65bhjGQoFTcu4w0wr2q+uMJvoYpYH2v7Ptct9K8vGXQ4u7BKw9KQSvhY=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "xApxotkihJbaaP/UPBR/nn2nWv7t7cMqX1w3l3fn/+FblVM9pxet08Z5TuQk9uJMxBYeCR37rUDxeYaA4stZ7lKyOZdh86Joy3PMcX4H7FnvzkZEB6KbFmpif4MOJflCEt0V3NpOW/NY9rA43c1P8EDVUYmnmC4qD9gWUvuzDHccsUas4IgUje9wHPRjt15jp3YYORRj/RRib8vTzcD5rfhliS9dmAWu5f55CD/nc9M9UaIO25bjvqoMEgykg6qRAP/C2urxU5pVlptxQavCwx0762bZhOBSm+WpDmmOq218tVq3v5bk+xEgZYR6kQoS3kust2FiBPbRvqAHUvwpREJN8eY30Tbt2I8vSoa0YejkJ7I9+2nj/dJPqXWkkjqdQWLXm3zP7zqC69d8RGjjGnpbuPpKgB0oSOSDsSrazJtOWgyQsnqRgEsBZtHWdGMAEZWavcAdbJqkxAyK/JCy8J8r+k0RB4wOah1kZZZ6uZlj3JO/rEx8Cy7STqMQJOyRarwgkjo0CCL4qvREk9Tb+QsHNp/tbmSfNcB3AgoO7YHwSN7pTRf7TlXXopMthu6jlEThJOf5NeIRC5KGNDMexV4HuqL06HdRBveLBU4DDiE6Y0QVZdLEu8T5A097qHhl5zfsjW/VlvUFXsR2gy9Qo0mJrhO/HUhlDO0PNU1oER8=", + "algid:sign:RSA:digest-PKCS1v15": "jDhhAD3SKdB9foLpSM/Y/+njoYIHzCs2ImlXRcHTlQZXV9dGejae/lcOzr147M3q6Kr95g5RLo7sBLOlw2MQS+toSAvPM0GrDZRJ5ZB3fEdHs0GcmYZEIfu+7h6TmU/Msbl3twloh70To/h7CykRjDxIolJx0sBCIzmn1pGDxuNJtaWf0FEnj/EvM0b9pixdN7b4fOxG6D7XTuq3ZEqWpxqC7pCZZzu9piuCKCaRUK/0nU4M6YGwPnI3Ndljkt0alIkfitmwBzjKwYo65rNfq02d8NFVZ5eRZhEUtfpTcqaV5Y0jSEM47MnL3kUYIVHjhYecLU126J7YlTdPTcOJ7gM8cMsrEUQAVCif+kfaeeOsR/cSej4yyQjQIvVP2kho1zJxlWX30sYoZipzoJcFdth5IEBRO2AS3ZCJWiEagDjClOPWSquX3XOa6QKjH/4aVVfdM5WlzdEIkNxeI8i04mpgtQnOOR2NXOy3HW8arz/+L2riVbf7GjWQ09lvg5h+mqXCIkUu7j0I9SsHahTk6bZQcxZJtblidFXOLQP5BKst7F9FGfAZmaFZXTRKNYyHf0mxpe3HNEEYGDepUJ686/FUfS/W7Qv4cEtFR/Blr2K7rwOeqZYX9Y77rSCN6XOM+KZn1oCk3XoIuGJ/tVaUs7qtHrAurRdo30e7oCI8TDM=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "SbLKflUrjcK7gX0CO2KY9E7A4/P61lsnjaGis/y+0sRjfcYVTx7gsR6yHLl9j/9e+2TcXdpS573pBLWAfgzHg0p0Fz62Apl7n/v1xM6FSxrIYNXIz8ol+yfwt6VuwpBcfRSwEcdVpNqW0wQ77RPVGWZKK2q+AB+4UJi7D7fJNnRvNx1b2rOrv464k3EGBnymfhnS3wbkYCWBtFMUcKqEn6jY0raqcTaZ0+GFOA3gWYR55qTWgO/PFwHhNAv1zW5P8TtSDMuWtnCNM/e6yx9npeOliPZdqMnmpI5cWadZufLsLu4p5SmKDHda0qDceDqYlc+b8I86jIJ5Q+WKJ66rqV4vKi5G3LisLLmiZkGpX47e8nS59RtUO8wDl1EBpikqsh71EUFfReKQ30n6mDPiE0Nc5q1fQ2LiTDqfWpWFvNLY7CZd7QqIPCPscdF+B0GqtR92cInm72sKKSkDIDJQJ3+IEizna5S62Fgva+rjKt1zILd3jprcKoO+HOvNeLaBrGc5FiGJD59zCgBKWdCu1WKQapuY9ccb3b99Ss+imkOz6qDcJp5EI+XSibLijCUCJBcgur0ZkyFxc42EPtahAk5hA4eXeFzB11FLSsPFdXoeJhwIcbelre93IOblUYfac+YK2V4qWO6Z+j2J+AMXHfRAbvQ+/+GHiW7B75mTFOk=", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "x7s2nhZgMkvI9/dauNvKO3BAkRivzmuc20t+rvjBTRiIzk6hx6CiDbNcaMtji2ZB26okDYeREaHz9QY+/5BiFO1Ub88pWMmP3lKCtnPwgiapOJgOHA7HIWZ3L8v240prf+HgoIvZYiMsuUNmCtExgG7+O2FsmsMXPZnTbugCgU6ieVRwXySWpWE9mcPvI+Kf64toyWIkEKPNT6x+ry4ucD7Qk5fbdlX9PBHzQljymUMqMVtXn76+TTew4GP9vf/JjxHs8M+2ugHMFSMamE0cBlghBd0lnpMLpY6DELX+zto5T2ypdywAXvSMPFqSj6lors2rJUvf2/iGnGlE97Bz6s2n+yWVer5mThUWbCsvzF2xZU3akVJ/tAhMvXnEO26QDFv6ERYytNoDCizBvsx2xn8FU2npmufXwSCcM/Htxrgn5uP5yfMjVt0R8VNbl2T3J9JxmqtlO9o34x0v46tyhGJsS5iRZqv57WKAuu6oHYTt7tedjyN+FZnvrURA78Uijg63VL1SoFVde2nXxaKDAjMg8/pvbgI35cCqiREHLGpR+M0aOtxUTZD/OtfZZHRc0Km+gOjJ1YJm8A5R1VpApVK85qEiSFtROsLpSsoncMBslJ46DQJTeup4/sJB6rtAVDMMYUIKc6dr8xZaI4pZ4Gsd4aaBB5ntKCI+fqdAqPA=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "OjqBix/b1jwp7jdfkdWlHE5dukr9cR2G9a/NJWWtp910Ct0lsuNq8KhFe0GywpDntDqowKaidDV4BBAS2SNTFREbKy2zS/W+po7DaTZOXK+9gsZDpNDU9C3+x/GT0qhZp6ooYLVRT3qNE4PMk+qggB0x+H22CLy+RmDX5Kue6WCit5PjEWdXO+drSahW5P80GOKKSlM46gjfW3mTx304fr+WJXesRlHEUeedTlhgl8SZl1e4eFeS+gUIkCjgDDwuPDaOhckJZxVIvfk4Xznp9mk9K99ZxwBW8T4fwYf6vATWXP0FOWLkGDmDZHT2MnnfS442/27Ipox1Zgi2XAFkMXAuFa0iLl4cw8j6boruC3FoWqJ2GEDFqQwY6J0NyGT/5tDOk0DrCpxk2wM6gq/kGwX5CbJYaTfyShhXlPVYG+OyJhedJRondns1My0oOeVdeVIpRfKnIcVEnihmsFfkryK6fh7A1O7JSrqzxmUYnvtDjuGZ3udYBXtN5rRfqo2XndbBvT+UxSZzgnlOJPgJ+uIID3Xd/kSqwrYZux3Ooe39VqVg++xm8cAIN0sdkF5FV50XGuXgnSAGF2GIHZtWcndBMMPKvC7/znW+wefjvjsL1Id3avXYEgCaDvcS1pRkhpKpSfmOKig5ttKKHKqDY7wz5R9S775jGByHLcgoiz0=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "ElprLAsYrMqVRuk6vydyrzQNOczfh2/udvt6qlTl9D67PjXnIz6Dl4MqwFqIo96H65pb2TAGXK4bCa5IcrnASmLb3wcIQzpNvbU+QeK/GXs7KRbBml5MgY4bBNbLm3KKBCEVQJqLAg+HsCgrwkrEzvp4mZ2MgD0CfrlW926hxDrcBKr0HpPoNmFRuwDS7UN3ro+c0T1T2YqPfNpsU/5gyi3oFQz05RpFdpSyS42lvflQr+lPZoWdfTL0tzvzXa+A8sdLJYyMC9d33a42Pgnhce1EoaP2q+qhOcQKnFTenVShwTMUOARIEz4o/8gO5u5pJ8pnz+vjs51DKPBSvgM/9uooVCIre5VDeRjnVgsWs3O2EJynip60dOqzncPPwXpPfXibV6+ko060mLrKyn3oU7Z6RM9ZEB/Q3nyuTG3R2ZT2MvlFZ8tPQzmSt7zUJWCJ+1DjsuDoVj15HOdlJLATOUFBZ5WlRO4wzHyDKRgRHxxsLfwnpDgKFUgarTLBnpqzyEuFxJdGMgPfqzEgterN9ojQfWHp0DlxWXrn2cf+uf2SDoLgeGcPd9zh/1JS4RMS/XHpA1KTPr9OrqpyS9OXVwTTWSEhWz+v+DJuvsvJwQm8O2GxukKG6u4Y9MnVtnTASI8cgTVNrQPHrt5KWHAS93Ge/mJMPMpjTPBQzCw3ZqA=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "ZfReBmsAM4vPICtGrKmUT0hhhyJUGlsrFh+ZUfKSHNSGiSHpCQMmQ2IgEnskqwFlCEwCB3Q18OHh1hjylQm5O+PgM+RdRVKGvEJTtkovueTr7ow3Vqa75PL+yPt8dgFxSVbZB+V9d+cOf436MwlJPS5qQjq2MQ43Wv7s8DTwo154z/a+NciC5sPCftbME4m4RXKpVUDDI81BGdzrwXWy8w/nMrOkoPFnu1a4t0IzaGILiMHRRFNOWxsIsdEjGdAtVF9rfqku9aSrbB6cLwflG24exBzvTuleKjN0nPeQytX8xNvsivGm06n4YqCCPIJ8ecirNyS9gzrjRl5zSp47bUt15XbFIitJSdOaLDmBRPqDDCS2vhAUIECiGYHaT0OfDs37wCmRo5mER7B0T0cakkR34ucK4/LlUXEjh/jQhT7aDJ0wxDxqXHrzDrFPtHX3EJQ8THn20/gy34z54giiwxcZ5mxEudSxv075vDwbT0Yd8RRX6B8BJK6Q4HSMIrP+RaAxRIPoMBBXBOXKBhqh51MXnBybilmYfaYn33m8sqVBSArc6XYc6Glhe9AdWS9WA5NMZeX8J20A3q8g60VUVPq/PNafjjNo1594TdSiOpmNIZhRekoC1YZe2R35MDEoD6c+bkvOmRr0d1qgtkgiD7hwKjYQkcs/ODOZJwqTac8=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "W+1k8WlZ2q62DuCW9rvu7O315mSeOyu5/jHrQOjwjFfkSmPTvvmBwtJvDGuK+NFbjyxF0gM0zXLaTwpGfSllDHNlizSmexl3+jb5PXjvj/Szr5Xn4HtmoeI4l3HCEDp8OQTCpbyDLF/KjUAUC/rB0ZHCbJ8LPy+53nkhAnOiz0YJIx3H/jrw1bZnSBiJvBQs/ekOEvDEJsYAFUdRSayrfcELujARk7t6OZ5E4uO2hASDfqLT3A4hhw8oiz2IcqaRqAWQx7N3CSXIHveZb0KT400r3554kGvJ8UEh5ia2OJxTt1Tw44x+1h+b6iSA4uaCUTan44HDCNzLpBwPeinkwvFaDsKyKsT6eO8XePq+SeRpK6ZB2KFoEG3XB646tI1HmbNiC7XfVCclQe3+osjWRkG20hSa7ollaUI7lDMkCQHATpIBJ4v6FYlfK5OoUQxHQqKUUMur1uoMt101fyrPfWe1cIdEF2UnBTsX1jE6W8dE2yMPLux72JsUsqprBEFdaw6gcm4zgRsJ8V22MMAQ9K9BtyapkmfwIvMYcol//GR/kBCo3I1wfLc7JeBDSr1aYFyq4w0cvW+eEdGRsCeUbrgAXZ4DIaBMyf5wmHT5G07ehk2P2iP7/I7bvydHxgvmm7tglfqWYjCxxnqYjuxNzY5nl3jwHihFY/Lfx8nMgRc=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "UQkToUyUbNQELROez0WEf3cWJti+7sAhEWE488y6JQ2w2F9CImcWVTyezAzt+mUs+VpFEEDBswqO0Wvgsr4FnpHbAIqLGoTjajbYmRRqDey5vqTbG7bVgJeoNI7a8nyXoLfSH2be58fK8JB+HPPdMFHh/8ZK0rRwW73y1zoyXqNQpbWrEaTSwg88+AJ8PScc3jqVd6192LAM9c8IrFrfSsmWHJ7PcGHoxs5Q1UpBsFZLoBkcvTPacAU0jb1V3yG9eyDaU8Zy9T/cMrz0WsM27herQb9wAecJG3rVK4RZ6bwOd1uiSt2xcTg3v4FbYhEGNH8LDvPi1HEJKGFSnbz4Nd79I+WLXqE24gOUKqwpKBw1NPLPxKN125la6al1ToSZGBBZiyRbtGuMwBOgnPBlAsU+LnvLRCRilaAlN6TuNl8lixv/no1j4jf32FD5f+xfj7wlxLqaWkqQKx0UXkhEiTZ7lw5LaZwCQa06w9jV4F4Jewcn42TrLjQpik64eAyBNQHMBhEnGTMYCqWUYaPV+rYxEiViezqvJCeo307AFnHXgXXbnkQriaGANLpyMGP7GyvOk+VtfMEXQZ5OChb+0cp4Wn4u+scpvhmKvD2t7gZiiQhNBELeiMENc5E6LwpR13eoJjDQ4MHWjPQc/bAZfqH6WHAXyPMyVCjTYVKE+aA=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "eFmNictbH/gHOJ9z0CS1Iq2McAr+jli7DiCFA7w957H9DejodrntVkm2nua7NMKhR7abuwP+q4SQFSoDEp6rZsxn8VOhp0vidlojR52XNiTE8N+zV89Ir/H4bT7SxAKWt4njc71/DVlSug8PWdYw/CfD5uYPgTrhVkRsA0y060NuPb9V+b2LZrMCQFLm9F7qLOeJEdMM5gLErQFQzOJro28vwknqfyC/uywhj7yaJ0+2MlTxrxn2u/kXuqoDEAKLVOMRbYLiYgidsqdBJFs96kkSALWeWShSZsX4qfH8F3lE+PmiZyJ2wRfDRfX6TKpoPnFaaXx71GoO9zq9crxcb/mxqL5PeCgUCJiIolSFiOom4zx5ngw0qbzXx7UrSjEcJ/6OWdYfmhP2EirMRFOfY9G5cahJE2MeoFid4dA+nLJ2gvRYl88NIcB5ozmDRd1XCglfT4EBxC0UGbyQBzuFwAqgAOLAXvpm7HMuJUMHP/XYGg1RVC+886h6OBI6KTqijUql9PO9fChRui9JQM6gZl1/7y/UvT1ce2fpI7HxTw3zvJRHP30TKmGn12q4by9rCzWg5XE4/HJWD2ENy4KShlVEJF0n0iNpLInAiE3hcVHhcLaf4XZvqeSX6JjwEJD2umJsb3ev5OHJNdRy5A8x1DLv4uFNALITZ7XzEIlo+1M=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "EQi5aKYBmblsgS9IJ2SpcR5IQAE8pwd+E7gmL72bYGgarEADPRB1BZzrWjkTx2+g1HtXftedWBU3RcRaXdhv3iWa9mUXWMVjG6VNLvzBgUsyVMXTDIq9Q9xbTBR/jzxndTzfrTvvH7v52iNRpujoqzGibrZnVFDT6YB3xbx4h4pqKMA4kilmCz9WeQNTHUfXBoVYVvZ1RqzcoN2iJoU2f/bOjqxa/ZHNt5ZuIpIHrAkWkwCRv8y9nWf+BIEb/pSTUN5uapwo4fp2BzR1Db4SFhMEEocdkQvrgX2PUGHeZtwY9dOXAR9Y7qbjegahvXsI1kkHtCozI2O6yAUHVOZMmid6vXaTFT5E6C8OYfbHp9dqkLG+TGnRVpmAEo6FRP0MHbE5BocQkUMQlxYqzbrVBf8WMtNfghyWzqPQvv8sIVqoeZ/cuE8ywqwdWULK2Ldm+6tPXOtdvG330Sp7YgP5B2dQxzPoFXsWs9kkFfnwoSgOfR62GJ/+xrkoeWYXcvBlg/jTp/XsAD2o0nUtY+jzh27/ojZk+hm9qfSWKJgnBndULZym/Z5XKYZsui5icVUy9pUvJtPlcaJlht0xyGr7P8w6ubh82a+4iQ+vhq0Ayozg6ubCGvNpgY+Nm8pGzs+1EiIxmnmCTyq6rY1mlmWoZYRJBlZ4DowaCHzRNlBV97Y=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "RipJ0BWBSJ1nt4n9iGz9GZlBv2rjeZPJoxxqcVKVG+Jlee2Nx6ETP+sxdM92GN7bMGT15qMvY3L/3oNWGiP+7Oju4BmFCXHePozkAb94WFS5yvlVuci9ZsY8NAHFaEHi8kQoWohku7uZ4SJ5aCrVpYXOaZw8/5hpoRRAS058YE2chAf9h1xhtpL96wQlTawKxJIyPu7MnDDI7NkvOx2EnJl3E+kt4eGCwvt+He/E0GsYPrUIFsB4+onU7279CxcCsw0/tuP2WtLYFxGWGesjY8RklfrP0xjrRudMSP8s1zYhuzUhPIwefg+xpCkW6rJoTCFxiV40Myt9/PZIKovO7r5iFsa/jT/9o+QBd2v/4gKBT63h4mKPXriQEjn1zha3PlCT5tf1Kf+JnNZLufLcZ3zkenlbw4fQ53HTml2VCae4qruVV4IGo4B8oixucNkWeQN1167vFx8J0BfPAOeL57UFo1IdzM7TQmSm95aqvBke9tF4d6xWTAxMS1EYyyLa5FfL8FfSI1IJnFETyDwhP3IOaeMOw2sUt+iwMQiZwR+hAhQEi8FE1zhAQ6NOljoMEWT41YUbchQaBreC+quelIWraJJjWZ8QJbnMvmAodE/WqMRk1qg1iC6cTBJdzdrb4jSO/eOui1rhO9wyM6KIfeTBDaxbqPtWDWmvobSLwGY=" + ] + ), + "CryptoSwift RSA Keys!": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "JYqLmIFJR3fHQdqy9CQAsTkY6tE67vxkpkqnte9YY0vjVWGfDzX2s249PgRi6HhQIUhXI+++Awdo0bDewe5pcGXrCV/3322wu0vDlJFDpnvFC8mAH9m94pIh6CZ4jpGfdyz4+fbQOCZ5vLMWo36nRdXbZz4+dyBPvhlTzIO2cvpcA5ygBszIXhK4Z7LXyRNpcWxDCJKKD7xoLXHFa058y72XU23Qpyh3syXoc6lR7WOz4hWYwKJ4RtXg4yHcYNFuPCbR7glQNjPAMD9Apf/UvTFMGAgmFUhNt/qnRU/97uKGFMISJRvCVDxuynTDImnYWONx2u89RVlD0Yd3Tf2nIpfX5cLm2zmoLy7tJ8ZQOzi3nYcd6LOArwxDekQNkTVw9y9nYMas4EIGUOOr3OTC3RNK9Kt7a97L7OzY8R5+4rlXLjg0OuefkaAN4MlE+haTOtWICi3G0DuNnypqovCABnIVqRt5LgQZ6uY5ZtZbZDSyeIjQAiejlza3l0LReU+4sa77tvG4GkyCejULKAKVZczRH89q30dNVX8kqoxUNDnYICyfXwXss7XKLfF8AUCp1yx4yWzJHbw4Vq8kkw7M2ISgFQwF9vI89sjCZlqxtDfjSHNHz0vezOehtP1fs/P5re3E+q8YanhnJAg2VxXU0Xv5BdRk2j/CXy3dOtEMrLo=", + "algid:encrypt:RSA:PKCS1": "uUT3t8NLWaZE/qCf9UaYUpCyQMkovESE8JfWnItU0uE6CD4NBTJK7d8kSdxBOeJL+vJBIqDkm3y7aCMEB6ah+QPRbh2NQFvPS/oilKE9YAcfZBa2V34bDCN+nr7N+p1UzVGPOdQeyXwh31/BbUZcZvNvQgNTspk9ZJ+5dEEnr6ACEipJIyjsH/pliP2kmfnC7KS92l33x0uT2sXsiFli8khqDCF5LObN3sGV3iCWwFyUU2nacW99HZ1SKkHryI/tfTGp+ficcUdjFxyb/Cj9RMJ113f7Cn3eCejXU2MLErXoB1GYSyWK9KccstUD4ohtCie225vQRxj0r60FlX8iiHD6ieEelPjT0cRqGNX7rmO5Tact0ldxhAQgoNOkmelMmOsjkJFwX/PaM20BLG/yr9WH8Rpp5eDlneKOE2zfQEwNQA8mYD3JAH/Xk1lx0ohZa1D8ZbJvbr75IPk/Cmf1DsbyvVeA646nKMMIzoloPU0Ux2PFVD0nu6O5Nkehnob8bkyPQ2kLNpxe2x08Nq8XsamZlHd+aMp91vzdbIb44ESzRX/JwCE/sw9NN6/focF6aVuVO+3syFUXLztvyre4QEw+lpmPDt2KCIGV23Gxw78g+nvBdLDjKlAnvtcjrELasD6VHuN/pJVzhx2n+DfHBbhjYt0KtNuRDdKMjSnjFJI=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "EuJuercZFslsiYtV9ynodBp3ov4AiE8W2dzMUJf62HeDyGANOEfRskUGzN0Iz7R/RwxfoiYEAKm7jzU7zWZUu/3toRfYkJzLE1V2+q8XM3DLUejWtfg4fTypBjg0gb8lZkxv9O1EZfwAEc/QHrDbHO+UL4ZPOkGPpBi6nI9m/ri6akumahYtt9uYPo6xQRmEd+1asIFmu6AgFR17L/wjRmY21UOMs3sUcSeA9klFXVBZszl+zF/abiROkrhA14wf9Q08Snj2BQwzrjjzpW1qlD1iDkd4gUJwL6kTc2r6NK1BLWF4PJ3yfH50Cf7cf9eHfPTFcROwuxFEVZmqJHDngJ6rGTr2wOXuT/WJfnzUc4GId1nD/h5rAZCeYXmOiksn22MQkiD5GHrsg5Gf1aqAt/U8X2w2N734X6Cg4klv5vB2CaCcCSHUeKb8UCx448aRYdzCPV0rm1z/VILydbAKk+l+Yss5fGHQtBIaWU5I7Uu1d8K4pLiEP0JH6EaQtr0w/E2IPNWjRcroTvfu2VyvRfMs+HxSARJ/OqsNUvocp8BXjXV5nYnzaAqmPQMRg0GRBo2k6G0zYpRSowwxvYjb5g53RZojc/zDfM74/GXLyuthxGCN0sNwAWfUtaTNWgglZTlM7zJbIlhXrxXPNjO34Nl/YbH6x1IzaAxXO3D5Fuo=", + "algid:sign:RSA:digest-PKCS1v15": "vu0PRjG00nkdyJQKAZsQ5wcnvWOJwcwAOyhVj1LIyGkuv6yp7mU4uMLBEuQzuA2Xsorewy18BVut7yPOGnM97yMgmpAV4SCpk/C/0CVfXIpw311rjiPY5oieh+TjDqiqa1TTxWTjumoMrXq6xP4TkZ82DqIELXI7K/I/fic1GoO84B+EJR3Zy7SB7EIiyTMRCfR5JLh9lY/BodmvK92l1WxDTQG1u/cBanw19y+V8fjrHgu3VckkhhTMMT91LC4knUnzgO5xi1LTUoI7P9Zl1nvjb3o9cV11xKpK1bf095e8ZKoWBcZOA719qgfQbRGBIvxJT6fZYEE1XnnsmGCAEnTprsqUKBDYgHz5ZpbaYpMisu2rN/VrxY+I/Pe5bUTeQnPWyxdvMwvVFTaIofDkv5alzT+ykERFfwd+1ic/Ljz4M9YN73Rh5MNeaSw+nTJ+l3Xsi2X5ebq9af8/1tFSaq/XUiaKULcYnJQqjYEh2syQbfBx+puxIQwYqmT8v4f+Aus/7PMl98naeX7vvg0BjqC+roJPnR4MHc463PDQMpZBxNRt2hHPoASyYAJ/5wg9VLmuZHMA0GuSUiyludBlac0hPTvhq0WXdCuSBklRECU45TjM+X95F2OyRpo5/Xzh6tmhnA1+fBOv9oOBgUZwR1rFUoqg0opQdprGMOfrd1I=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "WvGFjDp+NjT7f/3zGVkhzlZg67ggmCdClokkNm4l7SjSyJUnxACUX06dn8DdbUjfAYYdp1sgU9F35GkuaviXipnF4p+nPvaSYNSQIApZ9qvYANiPjd4BJjD4/upaK8iBJZLm3s7jo5C0MSjRRIkFkD9gbDqDqz6B0DqJpnHCZ8A4gVxuwS7Taw6+3xwolHp5u1Sl8uxfiyYBqsYNbD5FVAborL0bK31l7jnoUUy0xAhA/7Pi0IVWVxkhZSIccyKwGQ27sSwslLwP7GffRiHX1dgL5m2+fJ/KtCAVuN61PWoJTWU0pUoyFqtRPWLtxmIBqp3/nLwU5h7LSJfKH1gdJBQ/EHr0yTNj1hUsghvVGNSvWHmCIQuSnQj+2m/mgC1CRx/TF2Y1zsWof0cMkLdKIqvW1druJmLJjOA3afyXcbHjrNQbSzV2kZGp5yclRQi/2GrnkcYWuhpEmvppCmO0XyJJ7zEkNLaLxVPThcXfv4IGdHJVV8ZQ0K3ytNkKvdIesO50/mkcQ1KlrjlRbehM4ehAJAzQxqlyfAFRTTRyPjP4Y3ds+jiYR7OW3tVZJf92sJcpp+By2txBtLjZFAW5EDLQAF4uysRU56tYP1qZZ6hE9iAEOw8nxHuQziGJtNeeP6pLk8l8MGmshezNNhCXbxfhyON8yk7mxPqiY6NEpr4=", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "x5wYrUzX+d+I+Wtg52NUrnX2Ih8Mz5q+Wl5NPFCQTGVQYOzhN4Y5YLAtdXEPkmd7u/17O2pi8LpvZuuaXkypC3brZq9GLokKDrNEIiorJdN4FuKs/SGqnqUM6B2TYp7QHak1av3FndEQOnQz/VcqrTEWzq0iYfmqqJM4F52TLRp/4MUKE6F4mngUNfyqpt9ts88rGBQoNzzYDMpgolimfUtDh1iUmKm3cSmuYvuYtASgJxGHsjxN+H6JsGHt7ltYeXh2JL7qeDGQ5UB5YGYyWJiTBTt7hLDPHULuOXT33meU2KuXYZBul5+mjLlxflNdfgLzceYvZc+xUphYl67dqyhnFTsD/NCmuHWDwKmcwxXrrzA6B/BMCxwkmjDJ6iOdtnCn9RmPeB742tAFHmqfqRBNQAXhgDfH73cNauIfbKsOEdjP26f5A6Zuvvr91YniZmgaCe5qwjWOC4PBZ0faPbtC9z76qTrn742OgZ6b5V8vUMlivOWsv6NeVdKRb51TNVsd6we2+MKIjmBfWoV1L9Wapuq6ln3Ipei6ujqJug0Q3Lo0WKaXNBJBfrtncYNR8A81fJ9Cl2yYC2vO7vmREqvqQWopx91Z77cs0Rl5mwRpfMzn6ZDGZ3MmmgNfN+1gTXgeR1wI/yoy9h0plpjNdUqGhuLvSZfaChya5XeMyRg=", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "hPCBYxTh+6YInYogLRih2l1ngMC2HFpzJ50et/i6MX+4GpqezEnpW6EqS6qBuqG9GVv+047OeO6a6m96oDUKG7DBU6sndZOoYVDuGR6XZ2rW9sqUyFOqblRlqR7Y1p2MomS7jLlCD13LtDR/h7imnqrBX8LLRvSkZslDVaw08j8UJ7MYUPHvrtR5327djmIfgS2frDrmpJmfKJcA1V3RFnDftC7ZU2E7M2F0nFN+b2zKw9aSLqhzRbO4FtgKn4Hu5QEcT5whz7jLMSCZoFP91q32lSopJIZf39PtznxxGimttI1LW+lzH42qUfRLUnLp0PUlqgyXGxdLtajyIvmpFupb0vm9p1336QohwYyvI2NSdHn/wXJ8HIRZbStrUAwenF3hEwD+dT5eYXv54phkpMg25RszFV1lGCw53SE0PpCl1Qj+TY6kRCqRNyvqxJA3ywdWnFY2Dm/QtXVRNtRf1pkhnCL1X9fI5Bj3X3YV+TQCuKQavKX8rMk+XGxAmjAyKZS109CSaNsaXe2rSQQ4SMowzbw8EcUnN9VbG9/JgmDUOu6KCwJtu4q9gzra1kuxyrlCDrO6cn5ELfLau/cKGIbMbxjklqkFg/1/SlWbEGxGohqPBnRRWQWs88sUXEgTfMdCyflnfjJ+Ofauorx+t/lTZfyrGN2N0kZgrdhv8EE=", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "CBYAi7jv30XmIPh9BnGm2aSi3qjj2HZHFsFGiVmkGa8ETuR0FcRvuT1VG3/MoosSfKatOx8D76wM9OTneJQSiqqvFWCoygbwVjrQfPbFqFkwPD3OJWv1lDoeaId0RtqhURvVL2qUuH+wEfQhgFBTVePEcUmf8ocx4iVJHi6Mq4AYEpPoID7Zyf0v59K3DBEICYlafPrc4+LYCpNYRgSt2CjeiODyc1gEMLgFQF7l3knIjsUxkAEgu/9Tfxpx5Grr2Qjuq4tAKxJ7I+yf+IHG48cQKiD8j9xBGHDy7D+V/bkFX86kZpGcUEh08TzweEQBTCYgMjo5o+yENY38Q6XWdE4fNQrpyjS/APUm9nEgF6lkYY4U7uxjHO0f57XCxjetNc5HEGPKxG3qXaEwEGyfK5xGi+KHWkJNhBtuKfKOYQBXxy8Y7ah3sYND1oAWwmBgoeFMKhm5oPRD0wMueWjAyvq7PZfzmO3Wqk4S+AfuvBE3QfKIVWbzPMIWhYbHY0hZk9i3Bc/PWxYOvfWUjVAxOWW2QrfZPscQebTkJFqCujzXJepM78lZ9HpYWbBzY7YVyN5shOCe3SyADuaDltvTzTj43E5b0F/1ozhWFEbTyfOPNCNj0ZhmFu0PAeDhv6r0SUL0yt2l18wpyXj82217NLhoOZ1CtIylAV7uXIW72bE=", + "algid:sign:RSA:message-PKCS1v15:SHA1": "rmFdxrNZFYAkFf40eblr9DqQJd6pX4DJmrYoL6fXcBGr97Dh7IuELYrpIUPa/197q3InQkT0ViwWYHDhrQIbFx4aqycyQW0rd+f44tZGd2YJOKybxfShx2tmHxL2U8vx+iEz59OfoMs9YAZvcj2RRFkJMhafaihJNwEJofFZZ42tLbj3CrCOpKOwi39oTikstLjaV9e3ToFFtNioT9tLKSSuK2wH9+YQLVRF9bqu6usSYDDrC/RhchWE1FP6uaQbdXrg+9LkwU7dV9lsqBIQcLwFwBqYJ7yqUUC10yVRFcWeA4Sqj0oBehuoG2ozwRlkUUnULUXl3DXMLJquAqT+L1QLtxNqfQyXQtbLmmL+i9gVkEbQrd+Uk3pWeiB5ajgS4YYKcJhwdxtEmWHs4QIGZCD8bKDWESBRfH79BRA4kPUEd9ATkR/Pnj/+X/8NNH9gwj95BhGiBpe/F0UjDRIa1S3xI1muU0tcvX2emG0ZKYYyZd7ei1ZSWl1KZuNDNTABhqDayLM7EsZholpW8/1+t9lOpOO92utTjm1M35UBIA5odRdbuZPUtMHx+e5K4c2l7n3cQZdkrievjlPc5D04r30JJHey3L0QT06X8kkjAyjbsMDBcuKwdkGNBaAlrfmFd6YOxVyiaXLqHwbmcjgtWDQsLRKEZdLRFGcIsmH9B54=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "I4SK+LMQBpEU/XlK9pLSpFFLafx0q+pQGIMfpZPEAnUXL3FSCxZobbHasYSzyKvwqfmGXc4H7wxdeOSp1ADgVcN6e2YyPo22jShCIzS2mjMDVq/PmZp7tzpKGPhFa/+42uGaJYVMQX1V0YDGTljtpie/2xDWU4I8BfGdTyT2U1PtspyR+ldW1DxR7KzHUGzYvm141oLutXr80bMT3Pk9iMqYigcEu/o+lrUqam4n/HHZ0/PM6HZptkgyhaM3r5/4DqcuIpiThqxDzEt1Lbn80boz2S9xJ9u6eJ2jENq3DN/iD2BtRkKyh5NyLs/nC26afedV/dj7R7Fkuxq0HZ7+/CIM8L28++chluwjY2iQzFJUXJ8Wss5eU/ZHs60mWZmRh3180J6Wj8buH/T/7fE3J9ViGkPzbcENyiev7LU6uh2do5aKtxr3cjrx5zdOFR23E7q0ci5mY6OoGrWHCyZ9d4LAg+938HO05LtkbxZJUZD2DT5lAkbde6asGNmn47XHyYjTJ30Zxd9r1rRpcSNPtCyRiP6zLe/pQztmE+d78evB9vUGfmw26HXBKN621407AKdfGvNte9YLvJ8P/SvlJy1YQ1plWjzTkX/B3U5e9GkR/NSJP2wQ/OiXq/ns9eO1pXjesrPEB+eES2MTQX3UBuc0lnh1FJqB1FrCKJlCq28=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "azRVVXFadtDgsYjEkWddSycFMwdKl2FPLczbgdgeVLxWNltdHAibYSa0I/kKA5hl9M6dj8B+Di5zw71C2owKoLyJufhFGWmr7cNRQ8YzolBKnCm9AzZMCofMp86BBxuRSioWacmp1vMMRB9tG0LGSnlyVT/rJKNBoi8R6c2JfaFw3p87n3IyqhSaonAVdNCPAUp0Hi6iF2Hj+7kqVEbv0Az1DwHs7kAU7yFiJodKCsR9bh4Z6rXOG1oWcs02xTu35FlzzzBC+r6UUdhlAA5CEvzjGhein9v09LSP1Fks5CHbE0cgjW85mbJITPMMbXqGkM5LOgl0wynVPPZycVzoeelo7TKXsJqff6JzsZyFkmbLdX0Uimm7L3yABV6mgYQ0xcL9lvtvlNF+MOBjh6fWVn1jU5aq91Dx/exyR5QPg0u0jJkjFIq8vkitjuZ5Q0pZAmvmjYS/Mms/Sd4eP90Rq5s3n7v3BRXKr8rvMAd2x4LnHxHaV++k7uY1uSP+1En+3wp8HSmBs5rfoEiAkrGyHaYFJZCD1hLnwV7WtRNyI2cp3aP1P9Qh+QMliuJel0+SrdNlHzrouIL+Z/UmQ0QqZhEmuy3zkLZ+9XjtWJAxYQuNqBn0cMEx5BkZ1R+vwqIH2JzRhXDJMkhZiqbz8IjP25FahGUJzHt4uom0J6vbjp8=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "kEt8tqcYFA9lP95wZNkhBtx8sEf1tfp78PvgPj5bLEj5zO2dhC3ho8RV8076Ns7VqqtqGSdiLZ0xnNwwDUhgGerw1w23ar9ZxoQxYUM67SKIyfVS0l4TjnxDVGm/mREc3+O/v4NVjY+axo3FndsV8C5q0PIidt744GDVhheex82r7Cnp5gZdrObM8e3g2RIqJJUGEA+XKSwgofSspehh/tHkfgV122lUhf7SA9v6T3729NaxpWEzZCgQms+o+JQ4XoeNaCevMjGCRL2UZuhRelyFXiBwR469OJdwazEDO8QvrIdIU7a6WQMBi/kxDL8iLjRaZKCvLdvx9GueVgHoaSvEMJUhab6+v3GjzEbqs6BIRgyaJESYqjx3tU6WwvF98PWk9Vh9ZZ3D41oqt7sHVtDAtO+FWC7oasff7z1QY28qqZL4bt3KMIxFFbUpkKflGEQzZ28+d498FECfQSfu1be630D3O0p9S8Oxg1Y9QTlTXu0+7lU9zJWuSZGSetpNAewJEac50gfT3qpqQjKovEuzCEehGCqeJsQNU3WC7P+jfTr7JzXSCUNSuKwJQ3YHTwWNWIrIhXJb5otoDaKFd8fgB+QXruWCQQjGsb+kjXyCKsD6cfheH9PsuQVatbip5VbxnqLxcll3NapgR+kU4lAz+TilcpS/pXkbOqKdZZM=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "xnz4RUusIFwIaFiO63IIBgQ3GqyHsjJwnJ/a8B7T9z9YehKZa6Hh55bL3t1+7oKNAkK60H2nIprL7DZbS+bSoSkuDhihE9WQxqy4kt71zaqQIFu3FuFHji3ID1TYhZxEgf09NepVo7tQpYwOt9H6icc91mc2APrYiTlnjBuNGtm7vGixzXonhZcLAHLGjAhzqMqkx9LSpc6mc0DGqTHVC7++4syCznyf5T4JnE0ScgiMdLeFHeUiMG58HU8o9VOANWwQxdfDgl/saueaKhW3yHMS0ZvK2Ii07EiTjEhfBGBzb6xakdgH+ogEiqfqvGAN5OU09KnVRmWl4jDrk3d3xeQJl/LQvRt0M5Nbe3dw26HYDUNLf558fvYVuuMPi3mA9+6FDjQeJ0VakBujdHAG87a1x4pDurmreFIWGU3oJS0xC5WyHz1Tdh6IuPUVHCnM4V2fDW2Vq0rxgxz+KqHxtLrANjl6Jpe5b9Q/oC6VyWl5OHayu67xWYlI93BxCsKM9YN0kFJPI9ho6BzkEa2LowIJLKkmxjp5D/P/tMYCJRqNCtxatUj4aS5TLIw5SmrLEZA31bHYZ7xUoRmBqH4OnHd+GFc6KiAD4nTSznkSSlj8ybURjVHpOE65iafX0Q+c4DnvS4/0Lgu1PQ5as0uo+kCnRfLMYmt7iA8Ls6rGy9o=" + ] + ), + "CryptoSwift RSA Keys are really cool! They support encrypting / decrypting messages, signing and verifying signed messages, and importing and exporting encrypted keys for use between sessions 🔐": ( + encryptedMessage: [ + "algid:encrypt:RSA:raw": "FoQR9BSodvPui0+rY1MGQ8nxqpcWjZRJ6fQ9Ck8pqFtHyaZNG5rTYZIS+xn09f2bOdldAn9TV7MyHAO794hoEtUwbBHChdsUDsmqoag2VOdfU7mpHF0qVl77YO+dAybc/CZj8zOTAepZyS2btelyCUnrwh9nidCO7R4q21nDgEYPwnXwCgnXG0/9fFbA6kPho08pVApfFihgUMnFA/EY4Kg0VNkkSNtk1CLcM4rZOb2uslhdEQfBxEr6Bo8ZQUXZGckRTm2JIsT3k2vewddt9yQMF3jjaKeQbbsmx0kMZiblcEpv0s/s+Yqwgelhtg68go0WHO4M6Ae0Ds231DLTo2ctwTPOznlECtxQ43s1vjdaO9KViB2SrBrm+798P85EvtBQMI6P19W7sTAQzPJjbhDjvodks4WS/apCpHUkM6lowiBgfKAqCWTNjlTa4MN6thV63HTMUVt+zbWMWd3/RuJjTUmwDxwdD5gMDE3J26GZFi/IS/qImPgo/fTvsgEqHt1EivNBhGZ+5G6MYo7MSEH2ftLz6ZfLQz0+wn1VEsLH8jsUAX5+KIar1luTRSdeRGpNmThZU/rxGQgQqEGjaIhBUmym6TD15aNVBIIl+yhlAUn0iCaknmedj7SsOsL/h8IVieq2kjVl9zCHQ8jl5DqwX3LnxWhVzAJAhUcwMjg=", + "algid:encrypt:RSA:PKCS1": "LbjTnod9jalsiGR80n4slViv3auqAlqXL7+Te+ZnuQAWoInfjZjM4Wx4j2ITaW2swYJFAnB7N1EGVUdeMw0NHncTXXUoTQ/wuNhQefvFF6z9uFq4NJP2tXxhWc1H6/W4urXmlmKzbTAf0CKDbdiNjpnpXijg1hlkvFj/LOMn19TROpQfQyBVoBGIMDKndthZioMD0+8MUlThKLlH7f7BRpx2JQfn2KJ6f+YZfg9j9BHGWK0So8oaqTgwwPhPruzIMEJa5cFak3slss5gIGAFZZ5IjjnuL7OXH7uV+ntFo0Rv4kd56w6rrs6rE7o6iVNtYhP4Rzk5qUD2J0WTeXwj7tYEpGiNxNm5AQ4Bql0fxzVaV+zCtkJdyFzucLIl4/FOeuCIKAReA9Z1GvGVSbWoMxzrQVM4uOmmIcKCFLKMHsyW6kdtZXnvEl1BCJmkOdxTekmao02SZqWZh4yZV9fhq1lcy82OYSAD8Ou0dFf368HFFZmpv9rJZqOKKV05dWBFr7iCdrp3aXTwvs3G/uYsCP3Lng6mIIXIe+gzHR4+QzWHJsMZHlLVzGoYL2KLDC0SIjV+j9X31QalENIyTefmTrLxt3JwFhUNO2vF0w/8ZQuXDFEQswEB0zfharyJL1WFUOZ6uI/BEataICJ0Gv20lcPktAZx8Tsy2G4op0LTs20=" + ], + signedMessage: [ + "algid:sign:RSA:raw": "wvvDbby0xhUBI5srmt3pF1TB9UH8xQwm1grHPha3MKCjp1m9wzJGBScUz/nFotYY/w+sbirOe+UQeTsk96QU+iAURvvEF46n8ACXw7vThlf1j8+EJyWrfSyPvxcZfUP/4wNKAORPhHreUYM5Q6xASdhporadi8ITVKlch5QSvJxUH7wy6YDt/34z16C6OzoUPICJXy/b8q98Cf+xK4/es0k+z6Bt6cQDFYyEK+OUJm9HD588Mq0gAuteS7mRQqGL2LHDA0fKOX0ptSU6vNOSv9GAuflsNCSAPxRNkOhHXN3dWDCrM96AJM9bQGvxnQWlbQf+yVnf5tClXlPqZcWZEN/I4dR2KFcg5OQx0pmudJ9AxcQFfaiyMw0b79rIcbJIb6vHWmz7fS/dNq1bvjXxPeOM+ahR91xqLENbphGt4y8MXZesGQjP3POw9YBL4XrUHOiTGhMr2SWJR569yUzglWNfnKFHl66HaaZrS688spbd+9f6rAxsyUaSZmcd43/CJjetpgEmHqu3E9k4Hq2Nm2NyhSiV7vNaiceCyF9yXMTDKHd7xAmDcs4wQyBXwXcFaJwFbWyEjUwXvumaq0eyM5Vs5u4NIcpo16FHMvHsu3wbI39ze7AK7jjD45STq6DJsJklp5WiV5WYv+2xDamZGi06XJmPaI2XnH+DrsiDqgg=", + "algid:sign:RSA:digest-PKCS1v15": "aO5KdePNBsIJrolKleGat1/ZG1vqSHdocVznwvL96iLzxtr58I4IDO23P1U8/fsxz8HwDRRJoX/YvyZYRm8p+s1MO4stFZT6hOS2wCQx4z56JKFEzuld1rKSnUIppoxECQVBiQr3+xMb6jKX4eKPh42iN5e7x4Z0dQLk8cr6KfQFXJ8n7Hwz5154txDq/ZF0Jqbikwmg/yKsSWh1pecNkmel/PEgvP6HcAuuZx11QSu4U/P2psDngMV5AmuAeBEsd8cw7dmlRedUbNYTGk3FMEYL2q5lwigXr5uiwBvG8pBRtzX0r+TWRLk3x3i82dTEBID5FG2K5IIqsnqTyxvzspD5pePlc7v2JC61JcKIfWk/VAgSgAQbSdBbfpUj3XR3mBaWKjLBVTAGDHRLWFTgVnvcuC4hUmhUvpo7kRO9+c3XXAP0f+E3Zd3T3Cf+uhslB7mfmq1ctdg+zMNky9eBVbznWDDi3vVj/ase8ANTY0hHFXQfnDWfTpbPpJLYGK+SJuIyWzBxsOasPU6kSbN7nBgGUUnRSqFNWKpHfuHVT89nwDpPt1ynJoXWYjyVZGZdd5X36HfRjDrGw5q1AJMofAi/T/gb4QcfyDdrBDax7b/P/fiJ2PGeh1f1WJgjKiCDJvqBI6+vpKquhk6aqJFR5Z5XTBZTXXsV7nkZXeKE+98=", + "algid:sign:RSA:digest-PKCS1v15:SHA1": "", + "algid:sign:RSA:digest-PKCS1v15:SHA224": "", + "algid:sign:RSA:digest-PKCS1v15:SHA256": "", + "algid:sign:RSA:digest-PKCS1v15:SHA384": "", + "algid:sign:RSA:digest-PKCS1v15:SHA512": "", + "algid:sign:RSA:message-PKCS1v15:SHA1": "mmZt44HAZatukr2IHHmkvPJZOlL2rmkQ1KVGemw4pkLy/ixWmVKpMP/AT1DeB8bfINxVfwopeyAUhgcmXQrbEc5tlgmlezEhMBgHt7kqa03oAzqbDRw+ebTFCWsFMIsNdNII8fC6xHGpyB2mldNaitRmgvdWn3lrmuW8/1pWlXn4IRyOVbO0JevqHCFB4916khXT84FDxG0iAKTqFIJMXD213MDfyxM9kh7JFdbE+EpFDEknbCdpudOBNWrPLBpZVLyeV2p9usZpE2YT1KYzzPoWIvwHZbGTjcz54cC3ZPiX+x4Eu9ErAmC1CdmxYU2jd6xrMur4oNDn8rfvqK/xCpt/f2O90U1UwEvWzGTNYgtFaVwVURaryOIWz7algY26V6GWwJY31mftaL5PriAOxkajitegHvk7irHV2AFfEXZq4aR0VnBf7ua6tfvy9j/acbE9+ag/gojUkycXvTImYlpvQANUd2nJH/4wwB+dsiZUSMvOfgQjtSc3Ih+uu9whxOAQ3RNoYgvNbi4A8U1jflzA9aWo+Rfon4+wm/tuGB9NXn9ik0e7JeDJAWxhAmXW7AhPWpqfujS3kwgkb/Rm7W06r2+2xS3woCl+SST20nUu+/rcDsYUrwfS8SAiWQI69j1ukdZmgL13iK5Ah3sypNaj8Yx/0Y8S+E78LqzxKJg=", + "algid:sign:RSA:message-PKCS1v15:SHA224": "bwSdwF2gSkYLR1ji1kDRFQKXSwcO625TcqTSLdw+nGpYZKR/6UCxD0OpIYGfOwa2Pzp1FApqNVJlGO2jXYFpXKQPsUm1RhrB87t0NE2pKuEo/Bb2ekC8kIXk1NloKSef0fMR01EbfKOsIJvJSIf7E5dXf9p4c+JnWaMzJ94EHQGJlrlSjDaiQu485dGArwOiMU3ZI/C3XqL0raYh6iOclKhU1Wzn38F9KnReHYC+I5+fld9L4zAjoigmvHUVJ8yQRvdUUauh5gatuIOl2W03qR25Tstv86sF1j7PzFYf2hYTRvCqzQ814hC3/Oh9hAi1rO7JHl8ntXcIi6YpiJxi4fztbbESTz0Mnd0Hq8PXWPIkCZjP4w0voJ73tuQf3Ogfe92L4Mb1Mzb1CquD7moBEQkHeq1S3B6uCdNG3e8KRGxS3e5fgqvTYmlSUrCbBh2qoEEEOIaqjVrx+rUqUMEQwbi+pFQqM2sRUjX0kEMRTNx6ZJg/iM1fh6XqYBmSVz7ZSub1hoCZxPudQXRkar46A+kLsErr6sZRrXXG4wZqqjHUMRmTz7m1VEY9chddanmX3na3E3EJQH5Qw6oOBRVrLPyeH9ov1EAj80ZauNpZaPl+FobEF1PS1v0BKfVcUXwtD/ZqdAbSJomSoWets93UtEPHv9F+msWJEU68vR6pQ7Q=", + "algid:sign:RSA:message-PKCS1v15:SHA256": "Z2i9kWJBBTNccpZ27eB50h4jXGsTmjttJjbHZFpLeoJTLHe/VXt0UljlqRXoxkTi5gpJyFTA8wNRiekXBDZIILq3Od1AQR9/kRnx9VEhiXMJvQ8op6yVwI4w+kAroIIalLNGOSgPTjUNltj1l186UKJ0LM7SqeTuytEJJYJp8go8wC0ncU80Q1cl4CkSZQXP8y0WvJctguJFBIm2dg1/f2UF6HQBjyP4La35pXf3gfLJRZGf9fSkUlUpfpJvbdgc843saxfTyzvXQ7+YEk1zwEnRw62qp4l+A52fq1grJ8TwLMlRbn0YLEn76Kn8fWfkl3mlQu5ykfsLwqgpsUOndNjTATGSEc2qkxadTSJCJTaHeiW2UWmz+k6Blcy/+HCYc663zQxs/bV8qeoqrLapSdkDLBHYyr0C0cYuiM/xp6INITh4ryruiwA1zCiKv0hLKbT8r30mkwSfDxpal3VElOYIWsqA09oO0sk4g6bhByHWF4yg0Youx+yf1nQeQdHS1I7W86qXZCOJEVf/XNK/GZj7WOXkrt+QtYkv2DS2mAwF16Qlijcl4fBjpi+A9dezVEP/5celKdgSLOh5rtXlrQLdAv/qIqiO2r18IsJQplZdFOeR+TGt5x0QERt7EMEix5//pAEkhhWM7sCfUuLGFviWlX0GH2ZIt7qriEmASXk=", + "algid:sign:RSA:message-PKCS1v15:SHA384": "hRh6hS1J6J5fXiBwnuZRwZ3ilXeYpvP8PSYxyI8+iKbS0Td7jXXLZqGK8NC+3YAwo9i/fbLcOmqqsPma7fVrmwfaqdNMcbOMF1Ifxvw0CPlski/K4VmEaI5h+N9kOMdes7TrZW1ZvqGbt82i9YuZY+nW9NBNpwlKWNd8LfIcLdqAtl8CgBgLv5qVminhws1BZPdFmQnZtE2venak7l+QBk1mXR/CAmZbMc+sKLru9WMRIBJO2Y+RGuEXtY6aGeghC+lEMejlP8SO8dDK3t9guYJTrHnUVmiamNL0qshYNBtxP0v67JnhbxFwZaWCITvzuGAfBvPVqiP/u0PuoIVQpvCsK6bdfs0xrXpvqWGpO952VZfmevu6XthLPI2rNPqncvPIX6hpMmWCUpVjVl8jW/mGQUIYyrlevCGe+0waHU1pgVGENd1vFCJ4aZ0RQOD5c68Rc1au9+5RkaoV4SvQvnf6yo1OpTMmWPrRTVbeLF5ke3cNMvNHEtoBoSLcyaJoNXWoWwN2rhkJ17WqCaJE7TJUtSxnmoAP8D0E+58kCwLTx3iOcuGSqC9cI6Yh8icigoD2eUVK8M1zrHbpX5tOqt9myQCXP9zu3xwU+DuzhxY3xwpI2LUAmvg215/4elEH5gYzSpQqDDINUWwykcG0sAsr9AZUAzLuBcxEIRkORxI=", + "algid:sign:RSA:message-PKCS1v15:SHA512": "YDOCicIPMG7SRzkWybBnWXrDUBvc3I/N5cLDi41FaTwuFnnKSPZXmFKtYwsBJJEEr6dwtgJLJOVcqBShYW13XmOJWmtFqptCKxiS8K8ar9/CDaf0fnZLx3tYLqndi465ytbnGiDpcEy7uMOeKbyz744Vj4e8ZTLmADPZ1fG7IDvjfpJMVyKctus/elzFnKd9Xkczf7/drDjuQ9WejCbN/mTJblYFzY4PKmeukJl1LWcSw+jrsD4LAuIsLatpu2LjJK9W/RoGrzrR0rOk0xZCAA5m7BMnlr7vvDiSxH5Brt5CZ8UImrBgCV+Npl36m4aBlLUlGCQvMbYoUQa4oCoJsbwUHMnVSiRFxVGFBpkUjcxY7/6fvBsFZ2+sHY+nADrpAxlMRrq7mt6bZVTUFyQtCku2Un2We9XmTDIYEFZh3p+z44jLhdy1JFlAkgavVUjwDQA2GsdE2u/Hq3GiTAPx6CtJ1KG/SDqovxlIs+ImmYcWcgQcXCjVANjG3YnS9XIJXhF75TjVy+ooyxlATg1giNUzPHkVjovqf/2GcMNHotHumb98vafLXXSJXctErlP4ubk8ZHFtj09m5xrHXNm96B3DkOZWiuJ12bCMP1eSM2z8Wflq9+WUDti6DMb8O2NxxfVK5zh6cssTZrsUKH4AsSETxIE3sZJrWEDs2vJDVPA=" + ] + ) + ] + ) + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTests.swift new file mode 100644 index 00000000..02c79046 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTests.swift @@ -0,0 +1,128 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class RabbitTests: XCTestCase { + func testInitialization() { + var key = Array(repeating: 0, count: Rabbit.keySize - 1) + var iv: Array? + XCTAssertThrowsError(try Rabbit(key: key, iv: iv)) + + key = Array(repeating: 0, count: Rabbit.keySize + 1) + XCTAssertThrowsError(try Rabbit(key: key, iv: iv)) + + key = Array(repeating: 0, count: Rabbit.keySize) + XCTAssertNotNil(try Rabbit(key: key, iv: iv)) + + iv = Array(repeating: 0, count: Rabbit.ivSize - 1) + XCTAssertThrowsError(try Rabbit(key: key, iv: iv)) + + iv = Array(repeating: 0, count: Rabbit.ivSize) + XCTAssertNotNil(try Rabbit(key: key, iv: iv)) + } + + func testRabbitWithoutIV() { + // Examples from Appendix A: Test Vectors in http://tools.ietf.org/rfc/rfc4503.txt + let cases: [(Array, Array)] = [ // First case + ( + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [ + 0xb1, 0x57, 0x54, 0xf0, 0x36, 0xa5, 0xd6, 0xec, 0xf5, 0x6b, 0x45, 0x26, 0x1c, 0x4a, 0xf7, 0x02, + 0x88, 0xe8, 0xd8, 0x15, 0xc5, 0x9c, 0x0c, 0x39, 0x7b, 0x69, 0x6c, 0x47, 0x89, 0xc6, 0x8a, 0xa7, + 0xf4, 0x16, 0xa1, 0xc3, 0x70, 0x0c, 0xd4, 0x51, 0xda, 0x68, 0xd1, 0x88, 0x16, 0x73, 0xd6, 0x96 + ] + ), + // Second case + ( + [0x91, 0x28, 0x13, 0x29, 0x2e, 0x3d, 0x36, 0xfe, 0x3b, 0xfc, 0x62, 0xf1, 0xdc, 0x51, 0xc3, 0xac], + [ + 0x3d, 0x2d, 0xf3, 0xc8, 0x3e, 0xf6, 0x27, 0xa1, 0xe9, 0x7f, 0xc3, 0x84, 0x87, 0xe2, 0x51, 0x9c, + 0xf5, 0x76, 0xcd, 0x61, 0xf4, 0x40, 0x5b, 0x88, 0x96, 0xbf, 0x53, 0xaa, 0x85, 0x54, 0xfc, 0x19, + 0xe5, 0x54, 0x74, 0x73, 0xfb, 0xdb, 0x43, 0x50, 0x8a, 0xe5, 0x3b, 0x20, 0x20, 0x4d, 0x4c, 0x5e + ] + ), + // Third case + ( + [0x83, 0x95, 0x74, 0x15, 0x87, 0xe0, 0xc7, 0x33, 0xe9, 0xe9, 0xab, 0x01, 0xc0, 0x9b, 0x00, 0x43], + [ + 0x0c, 0xb1, 0x0d, 0xcd, 0xa0, 0x41, 0xcd, 0xac, 0x32, 0xeb, 0x5c, 0xfd, 0x02, 0xd0, 0x60, 0x9b, + 0x95, 0xfc, 0x9f, 0xca, 0x0f, 0x17, 0x01, 0x5a, 0x7b, 0x70, 0x92, 0x11, 0x4c, 0xff, 0x3e, 0xad, + 0x96, 0x49, 0xe5, 0xde, 0x8b, 0xfc, 0x7f, 0x3f, 0x92, 0x41, 0x47, 0xad, 0x3a, 0x94, 0x74, 0x28 + ] + ) + ] + + let plainText = Array(repeating: 0, count: 48) + for (key, expectedCipher) in cases { + let rabbit = try! Rabbit(key: key) + let cipherText = try! rabbit.encrypt(plainText) + XCTAssertEqual(cipherText, expectedCipher) + XCTAssertEqual(try! rabbit.decrypt(cipherText), plainText) + } + } + + func testRabbitWithIV() { + // Examples from Appendix A: Test Vectors in http://tools.ietf.org/rfc/rfc4503.txt + let key = Array(repeating: 0, count: Rabbit.keySize) + let cases: [(Array, Array)] = [ + ( + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [ + 0xc6, 0xa7, 0x27, 0x5e, 0xf8, 0x54, 0x95, 0xd8, 0x7c, 0xcd, 0x5d, 0x37, 0x67, 0x05, 0xb7, 0xed, + 0x5f, 0x29, 0xa6, 0xac, 0x04, 0xf5, 0xef, 0xd4, 0x7b, 0x8f, 0x29, 0x32, 0x70, 0xdc, 0x4a, 0x8d, + 0x2a, 0xde, 0x82, 0x2b, 0x29, 0xde, 0x6c, 0x1e, 0xe5, 0x2b, 0xdb, 0x8a, 0x47, 0xbf, 0x8f, 0x66 + ] + ), + ( + [0xc3, 0x73, 0xf5, 0x75, 0xc1, 0x26, 0x7e, 0x59], + [ + 0x1f, 0xcd, 0x4e, 0xb9, 0x58, 0x00, 0x12, 0xe2, 0xe0, 0xdc, 0xcc, 0x92, 0x22, 0x01, 0x7d, 0x6d, + 0xa7, 0x5f, 0x4e, 0x10, 0xd1, 0x21, 0x25, 0x01, 0x7b, 0x24, 0x99, 0xff, 0xed, 0x93, 0x6f, 0x2e, + 0xeb, 0xc1, 0x12, 0xc3, 0x93, 0xe7, 0x38, 0x39, 0x23, 0x56, 0xbd, 0xd0, 0x12, 0x02, 0x9b, 0xa7 + ] + ), + ( + [0xa6, 0xeb, 0x56, 0x1a, 0xd2, 0xf4, 0x17, 0x27], + [ + 0x44, 0x5a, 0xd8, 0xc8, 0x05, 0x85, 0x8d, 0xbf, 0x70, 0xb6, 0xaf, 0x23, 0xa1, 0x51, 0x10, 0x4d, + 0x96, 0xc8, 0xf2, 0x79, 0x47, 0xf4, 0x2c, 0x5b, 0xae, 0xae, 0x67, 0xc6, 0xac, 0xc3, 0x5b, 0x03, + 0x9f, 0xcb, 0xfc, 0x89, 0x5f, 0xa7, 0x1c, 0x17, 0x31, 0x3d, 0xf0, 0x34, 0xf0, 0x15, 0x51, 0xcb + ] + ) + ] + + let plainText = Array(repeating: 0, count: 48) + for (iv, expectedCipher) in cases { + let rabbit = try! Rabbit(key: key, iv: iv) + let cipherText = try! rabbit.encrypt(plainText) + XCTAssertEqual(cipherText, expectedCipher) + XCTAssertEqual(try! rabbit.decrypt(cipherText), plainText) + } + } +} + +extension RabbitTests { + static func allTests() -> [(String, (RabbitTests) -> () -> Void)] { + let tests = [ + ("testInitialization", testInitialization), + ("testRabbitWithoutIV", testRabbitWithoutIV), + ("testRabbitWithIV", testRabbitWithIV) + ] + + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTestsPerf.swift new file mode 100644 index 00000000..6395eccc --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/RabbitTestsPerf.swift @@ -0,0 +1,37 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class RabbitTestsPerf: XCTestCase { + func testRabbitPerformance() { + let key: Array = Array(repeating: 0, count: Rabbit.keySize) + let iv: Array = Array(repeating: 0, count: Rabbit.ivSize) + let message = Array(repeating: 7, count: (1024 * 1024) * 1) + measure { + _ = try! Rabbit(key: key, iv: iv).encrypt(message) + } + } +} + +extension RabbitTestsPerf { + static func allTests() -> [(String, (RabbitTestsPerf) -> () -> Void)] { + let tests = [ + ("testRabbitPerformance", testRabbitPerformance) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/SHATestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/SHATestsPerf.swift new file mode 100644 index 00000000..c1f52aa2 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/SHATestsPerf.swift @@ -0,0 +1,108 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2017 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import Foundation +import XCTest +@testable import CryptoSwift + +final class SHATestsPerf: XCTestCase { + + static let len = 100000 + let a = [UInt8](unsafeUninitializedCapacity: SHATestsPerf.len) { buf, count in + for i in 0.. +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class Scrypt: XCTestCase { + + func testScrypt_0() { + let password = Array("password".data(using: .ascii)!) + let salt = Array("NaCl".data(using: .ascii)!) + let deriver = try! CryptoSwift.Scrypt(password: password, salt: salt, dkLen: 64, N: 1024, r: 8, p: 16) + let derived = try! deriver.calculate() + let expected: [UInt8] = Array.init(hex: """ + fd ba be 1c 9d 34 72 00 78 56 e7 19 0d 01 e9 fe + 7c 6a d7 cb c8 23 78 30 e7 73 76 63 4b 37 31 62 + 2e af 30 d9 2e 22 a3 88 6f f1 09 27 9d 98 30 da + c7 27 af b9 4a 83 ee 6d 83 60 cb df a2 cc 06 40 + """.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: "\t", with: "")) + XCTAssertEqual(derived, expected) + } + + func testScrypt_1() { + let password = Array("pleaseletmein".data(using: .ascii)!) + let salt = Array("SodiumChloride".data(using: .ascii)!) + let deriver = try! CryptoSwift.Scrypt(password: password, salt: salt, dkLen: 64, N: 16384, r: 8, p: 1) + let derived = try! deriver.calculate() + let expected: [UInt8] = Array.init(hex: """ + 70 23 bd cb 3a fd 73 48 46 1c 06 cd 81 fd 38 eb + fd a8 fb ba 90 4f 8e 3e a9 b5 43 f6 54 5d a1 f2 + d5 43 29 55 61 3f 0f cf 62 d4 97 05 24 2a 9a f9 + e6 1e 85 dc 0d 65 1e 40 df cf 01 7b 45 57 58 87 + """.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: "\t", with: "")) + XCTAssertEqual(derived, expected) + } + +// Takes too long to run in debug mode! + func testScrypt_2() { + #if !DEBUG + let password = Array("pleaseletmein".data(using: .ascii)!) + let salt = Array("SodiumChloride".data(using: .ascii)!) + let deriver = try! CryptoSwift.Scrypt(password: password, salt: salt, dkLen: 64, N: 1048576, r: 8, p: 1) + let derived = try! deriver.calculate() + let expected: [UInt8] = Array.init(hex: """ + 21 01 cb 9b 6a 51 1a ae ad db be 09 cf 70 f8 81 + ec 56 8d 57 4a 2f fd 4d ab e5 ee 98 20 ad aa 47 + 8e 56 fd 8f 4b a5 d0 9f fa 1c 6d 92 7c 40 f4 c3 + 37 30 40 49 e8 a9 52 fb cb f4 5c 6f a7 7a 41 a4 + """.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "\n", with: "").replacingOccurrences(of: "\t", with: "")) + XCTAssertEqual(derived, expected) + #endif + } + + static let allTests = [ + ("testScrypt_0", testScrypt_0), + ("testScrypt_1", testScrypt_1), + ("testScrypt_2", testScrypt_2) + ] +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ScryptTestsPerf.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ScryptTestsPerf.swift new file mode 100644 index 00000000..3d1a463e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/ScryptTestsPerf.swift @@ -0,0 +1,37 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +import XCTest +@testable import CryptoSwift + +class ScryptTestsPeft: XCTestCase { + func testScryptPerformance() { + let N = 16384 + let password: Array = Array(repeating: 0, count: 32) + let salt: Array = Array(repeating: 0, count: 32) + measure { + _ = try! CryptoSwift.Scrypt(password: password, salt: salt, dkLen: 64, N: N, r: 8, p: 1).calculate() + } + } +} + +extension ScryptTestsPeft { + static func allTests() -> [(String, (ScryptTestsPeft) -> () -> Void)] { + let tests = [ + ("testScryptPerformance", testScryptPerformance) + ] + return tests + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/XCTestManifests.swift b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/XCTestManifests.swift new file mode 100644 index 00000000..25d18cfd --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/CryptoSwiftTests/XCTestManifests.swift @@ -0,0 +1,406 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension AESCCMTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__AESCCMTests = [ + ("testAESCCMTestCase1", testAESCCMTestCase1), + ("testAESCCMTestCase1Decrypt", testAESCCMTestCase1Decrypt), + ("testAESCCMTestCase2", testAESCCMTestCase2), + ("testAESCCMTestCase2Decrypt", testAESCCMTestCase2Decrypt), + ("testAESCCMTestCase3", testAESCCMTestCase3), + ("testAESCCMTestCase3Decrypt", testAESCCMTestCase3Decrypt), + ("testAESCCMTestCase3DecryptPartial", testAESCCMTestCase3DecryptPartial), + ("testAESCCMTestDVPT256", testAESCCMTestDVPT256), + ] +} + +extension AESTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__AESTests = [ + ("testAESDecryptCBCWithPaddingPartial", testAESDecryptCBCWithPaddingPartial), + ("testAESDecryptCTRSeek", testAESDecryptCTRSeek), + ("testAESEncrypt", testAESEncrypt), + ("testAESEncrypt2", testAESEncrypt2), + ("testAESEncrypt3", testAESEncrypt3), + ("testAESEncryptCBCNoPadding", testAESEncryptCBCNoPadding), + ("testAESEncryptCBCWithPadding", testAESEncryptCBCWithPadding), + ("testAESEncryptCBCWithPaddingPartial", testAESEncryptCBCWithPaddingPartial), + ("testAESEncryptCFB", testAESEncryptCFB), + ("testAESEncryptCFBLong", testAESEncryptCFBLong), + ("testAESEncryptCTR", testAESEncryptCTR), + ("testAESEncryptCTRIrregularLength", testAESEncryptCTRIrregularLength), + ("testAESEncryptCTRIrregularLengthIncrementalUpdate", testAESEncryptCTRIrregularLengthIncrementalUpdate), + ("testAESEncryptCTRStream", testAESEncryptCTRStream), + ("testAESEncryptCTRZeroPadding", testAESEncryptCTRZeroPadding), + ("testAESEncryptIncremental", testAESEncryptIncremental), + ("testAESEncryptOFB128", testAESEncryptOFB128), + ("testAESEncryptOFB256", testAESEncryptOFB256), + ("testAESEncryptPCBC256", testAESEncryptPCBC256), + ("testAESGCMTagLengthCombined", testAESGCMTagLengthCombined), + ("testAESGCMTagLengthCombined2", testAESGCMTagLengthCombined2), + ("testAESGCMTagLengthDetached", testAESGCMTagLengthDetached), + ("testAESGCMTestCase1", testAESGCMTestCase1), + ("testAESGCMTestCase2", testAESGCMTestCase2), + ("testAESGCMTestCase3", testAESGCMTestCase3), + ("testAESGCMTestCase3Combined", testAESGCMTestCase3Combined), + ("testAESGCMTestCase4", testAESGCMTestCase4), + ("testAESGCMTestCase5", testAESGCMTestCase5), + ("testAESGCMTestCase6", testAESGCMTestCase6), + ("testAESGCMTestCase7", testAESGCMTestCase7), + ("testAESGCMTestCaseIrregularCombined1", testAESGCMTestCaseIrregularCombined1), + ("testAESGCMTestCaseIrregularCombined2", testAESGCMTestCaseIrregularCombined2), + ("testAESWithWrongKey", testAESWithWrongKey), + ("testIssue298", testIssue298), + ("testIssue394", testIssue394), + ("testIssue411", testIssue411), + ] +} + +extension AESTestsPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__AESTestsPerf = [ + ("testAESDecryptPerformance", testAESDecryptPerformance), + ("testAESEncryptPerformance", testAESEncryptPerformance), + ] +} + +extension Access { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Access = [ + ("testAES", testAES), + ("testArrayExtension", testArrayExtension), + ("testAuthenticators", testAuthenticators), + ("testBlowfish", testBlowfish), + ("testChaCha20", testChaCha20), + ("testChecksum", testChecksum), + ("testCollectionExtension", testCollectionExtension), + ("testDataExtension", testDataExtension), + ("testDigest", testDigest), + ("testIntExtension", testIntExtension), + ("testPadding", testPadding), + ("testPBKDF", testPBKDF), + ("testRabbit", testRabbit), + ("testRandomIV", testRandomIV), + ("testStringExtension", testStringExtension), + ("testStringFoundationExtension", testStringFoundationExtension), + ("testUInt16Extension", testUInt16Extension), + ("testUInt32Extension", testUInt32Extension), + ("testUInt64Extension", testUInt64Extension), + ("testUInt8Extension", testUInt8Extension), + ("testUpdatable", testUpdatable), + ] +} + +extension BlowfishTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__BlowfishTests = [ + ("testCBCZeroPadding", testCBCZeroPadding), + ("testDecrypt", testDecrypt), + ("testDecryptCFB415", testDecryptCFB415), + ("testEncrypt", testEncrypt), + ("testEncryptDecrypt", testEncryptDecrypt), + ] +} + +extension CBCMacTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__CBCMacTests = [ + ("testMessageLength0", testMessageLength0), + ("testMessageLength16", testMessageLength16), + ("testMessageLength40", testMessageLength40), + ("testMessageLength64", testMessageLength64), + ] +} + +extension CMACTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__CMACTests = [ + ("testMessageLength0", testMessageLength0), + ("testMessageLength16", testMessageLength16), + ("testMessageLength40", testMessageLength40), + ("testMessageLength64", testMessageLength64), + ("testOMACTextVectors", testOMACTextVectors), + ] +} + +extension ChaCha20Poly1305Tests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ChaCha20Poly1305Tests = [ + ("test1", test1), + ("test2", test2), + ("test3", test3), + ] +} + +extension ChaCha20Tests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ChaCha20Tests = [ + ("testChaCha20", testChaCha20), + ("testChaCha20EncryptPartial", testChaCha20EncryptPartial), + ("testCore", testCore), + ("testVector1Py", testVector1Py), + ] +} + +extension ChaCha20TestsPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ChaCha20TestsPerf = [ + ("testChaCha20Performance", testChaCha20Performance), + ] +} + +extension DigestTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__DigestTests = [ + ("testChecksum", testChecksum), + ("testChecksumPerformance", testChecksumPerformance), + ("testCRC16", testCRC16), + ("testCRC32", testCRC32), + ("testCRC32C", testCRC32C), + ("testCRC32NotReflected", testCRC32NotReflected), + ("testMD5", testMD5), + ("testMD5Data", testMD5Data), + ("testMD5Updates", testMD5Updates), + ("testSHA1", testSHA1), + ("testSHA1Updatable1", testSHA1Updatable1), + ("testSHA1Updatable2", testSHA1Updatable2), + ("testSHA2", testSHA2), + ("testSHA3", testSHA3), + ("testSHAPartialUpdates", testSHAPartialUpdates), + ] +} + +extension DigestTestsPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__DigestTestsPerf = [ + ("testMD5Performance", testMD5Performance), + ("testSHA1Performance", testSHA1Performance), + ] +} + +extension ExtensionsTest { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ExtensionsTest = [ + ("testArrayInitHex", testArrayInitHex), + ("testBytes", testBytes), + ("testDataInit", testDataInit), + ("testEmptyStringEncrypt", testEmptyStringEncrypt), + ("testStringDecryptBase64", testStringDecryptBase64), + ("testStringEncrypt", testStringEncrypt), + ("testToHexStringPerformance", testToHexStringPerformance), + ("testToUInt32Array", testToUInt32Array), + ("testToUInt32Performance", testToUInt32Performance), + ("testToUInt64Performance", testToUInt64Performance), + ] +} + +extension ExtensionsTestPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ExtensionsTestPerf = [ + ("testArrayInitHexPerformance", testArrayInitHexPerformance), + ] +} + +extension HKDFTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__HKDFTests = [ + ("testHKDF1", testHKDF1), + ("testHKDF2", testHKDF2), + ("testHKDF3", testHKDF3), + ("testHKDF4", testHKDF4), + ("testHKDF5", testHKDF5), + ("testHKDF6", testHKDF6), + ] +} + +extension HMACTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__HMACTests = [ + ("testMD5", testMD5), + ("testSHA1", testSHA1), + ("testSHA256", testSHA256), + ("testSHA384", testSHA384), + ("testSHA512", testSHA512), + ] +} + +extension OCBTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__OCBTests = [ + ("testAESOCBWithRFC7253Tests", testAESOCBWithRFC7253Tests), + ] +} + +extension PBKDF { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PBKDF = [ + ("testPBKDF1", testPBKDF1), + ("testPBKDF2", testPBKDF2), + ("testPBKDF2Length", testPBKDF2Length), + ] +} + +extension PBKDFPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PBKDFPerf = [ + ("testPerformance", testPerformance), + ] +} + +extension PaddingTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PaddingTests = [ + ("testISO78164_0", testISO78164_0), + ("testISO78164_1", testISO78164_1), + ("testISO78164_2", testISO78164_2), + ("testPKCS7_0", testPKCS7_0), + ("testPKCS7_1", testPKCS7_1), + ("testPKCS7_2", testPKCS7_2), + ("testZeroPadding1", testZeroPadding1), + ("testZeroPadding2", testZeroPadding2), + ] +} + +extension Poly1305Tests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Poly1305Tests = [ + ("testIssue183", testIssue183), + ("testPoly1305", testPoly1305), + ] +} + +extension RabbitTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__RabbitTests = [ + ("testInitialization", testInitialization), + ("testRabbitWithIV", testRabbitWithIV), + ("testRabbitWithoutIV", testRabbitWithoutIV), + ] +} + +extension RabbitTestsPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__RabbitTestsPerf = [ + ("testRabbitPerformance", testRabbitPerformance), + ] +} + +extension SHATestsPerf { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__SHATestsPerf = [ + ("testSHA1Performance", testSHA1Performance), + ("testSHA2224Performance", testSHA2224Performance), + ("testSHA2256Performance", testSHA2256Performance), + ("testSHA2384Performance", testSHA2384Performance), + ("testSHA2512Performance", testSHA2512Performance), + ("testSHA3224Performance", testSHA3224Performance), + ("testSHA3256Performance", testSHA3256Performance), + ("testSHA3384Performance", testSHA3384Performance), + ("testSHA3512Performance", testSHA3512Performance), + ("testSHA3keccak224Performance", testSHA3keccak224Performance), + ("testSHA3keccak256Performance", testSHA3keccak256Performance), + ("testSHA3keccak384Performance", testSHA3keccak384Performance), + ("testSHA3keccak512Performance", testSHA3keccak512Performance), + ] +} + +extension Scrypt { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Scrypt = [ + ("testScrypt_0", testScrypt_0), + ("testScrypt_1", testScrypt_1), + ("testScrypt_2", testScrypt_2), + ] +} + +extension ScryptTestsPeft { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ScryptTestsPeft = [ + ("testScryptPerformance", testScryptPerformance), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(AESCCMTests.__allTests__AESCCMTests), + testCase(AESTests.__allTests__AESTests), + testCase(AESTestsPerf.__allTests__AESTestsPerf), + testCase(Access.__allTests__Access), + testCase(BlowfishTests.__allTests__BlowfishTests), + testCase(CBCMacTests.__allTests__CBCMacTests), + testCase(CMACTests.__allTests__CMACTests), + testCase(ChaCha20Poly1305Tests.__allTests__ChaCha20Poly1305Tests), + testCase(ChaCha20Tests.__allTests__ChaCha20Tests), + testCase(ChaCha20TestsPerf.__allTests__ChaCha20TestsPerf), + testCase(DigestTests.__allTests__DigestTests), + testCase(DigestTestsPerf.__allTests__DigestTestsPerf), + testCase(ExtensionsTest.__allTests__ExtensionsTest), + testCase(ExtensionsTestPerf.__allTests__ExtensionsTestPerf), + testCase(HKDFTests.__allTests__HKDFTests), + testCase(HMACTests.__allTests__HMACTests), + testCase(OCBTests.__allTests__OCBTests), + testCase(PBKDF.__allTests__PBKDF), + testCase(PBKDFPerf.__allTests__PBKDFPerf), + testCase(PaddingTests.__allTests__PaddingTests), + testCase(Poly1305Tests.__allTests__Poly1305Tests), + testCase(RabbitTests.__allTests__RabbitTests), + testCase(RabbitTestsPerf.__allTests__RabbitTestsPerf), + testCase(SHATestsPerf.__allTests__SHATestsPerf), + testCase(Scrypt.__allTests__Scrypt), + testCase(ScryptTestsPeft.__allTests__ScryptTestsPeft), + ] +} +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Tests/LinuxMain.swift b/Carthage/Checkouts/CryptoSwift/Tests/LinuxMain.swift new file mode 100644 index 00000000..7ece303a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/LinuxMain.swift @@ -0,0 +1,10 @@ +import XCTest + +import CryptoSwiftTests +import TestsPerformance + +var tests = [XCTestCaseEntry]() +tests += CryptoSwiftTests.__allTests() +tests += TestsPerformance.__allTests() + +XCTMain(tests) diff --git a/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/Bridging.h b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/Bridging.h new file mode 100644 index 00000000..1b7e731e --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/Bridging.h @@ -0,0 +1,21 @@ +// +// CryptoSwift +// +// Copyright (C) 2014-2022 Marcin Krzyżanowski +// This software is provided 'as-is', without any express or implied warranty. +// +// In no event will the authors be held liable for any damages arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: +// +// - The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required. +// - Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +// - This notice may not be removed or altered from any source or binary distribution. +// + +#ifndef CryptoSwift_Bridging_h +#define CryptoSwift_Bridging_h + +#import + +#endif diff --git a/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/TestsPerformance.swift b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/TestsPerformance.swift new file mode 100644 index 00000000..3e361836 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/TestsPerformance.swift @@ -0,0 +1,34 @@ +// +// TestsPerformance.swift +// TestsPerformance +// +// Created by Marcin Krzyzanowski on 03/04/2018. +// Copyright © 2018 Marcin Krzyzanowski. All rights reserved. +// + +import XCTest + +class TestsPerformance: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } +} diff --git a/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/XCTestManifests.swift b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/XCTestManifests.swift new file mode 100644 index 00000000..bd30b2f1 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/Tests/TestsPerformance/XCTestManifests.swift @@ -0,0 +1,19 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension TestsPerformance { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__TestsPerformance = [ + ("testExample", testExample), + ("testPerformanceExample", testPerformanceExample), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(TestsPerformance.__allTests__TestsPerformance), + ] +} +#endif diff --git a/Carthage/Checkouts/CryptoSwift/_config.yml b/Carthage/Checkouts/CryptoSwift/_config.yml new file mode 100644 index 00000000..fff4ab92 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Debug.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Debug.xcconfig new file mode 100644 index 00000000..b129b1c9 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Debug.xcconfig @@ -0,0 +1,6 @@ +#include "CryptoSwift-Shared.xcconfig" + +OTHER_SWIFT_FLAGS = $(inherited) -Xfrontend -debug-time-function-bodies +SWIFT_COMPILATION_MODE = incremental +SWIFT_OPTIMIZATION_LEVEL = -Onone +SWIFT_ENFORCE_EXCLUSIVE_ACCESS = none diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Release.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Release.xcconfig new file mode 100644 index 00000000..ff557156 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Release.xcconfig @@ -0,0 +1,10 @@ +#include "CryptoSwift-Shared.xcconfig" + +BITCODE_GENERATION_MODE = bitcode +CLANG_USE_OPTIMIZATION_PROFILE = NO +GCC_GENERATE_DEBUGGING_SYMBOLS = NO +GCC_UNROLL_LOOPS = YES +LLVM_LTO = YES +SWIFT_DISABLE_SAFETY_CHECKS = YES +SWIFT_ENFORCE_EXCLUSIVE_ACCESS = compile-time +SWIFT_OPTIMIZATION_LEVEL = -O diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Shared.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Shared.xcconfig new file mode 100644 index 00000000..6760a087 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Shared.xcconfig @@ -0,0 +1,16 @@ +CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES +APPLICATION_EXTENSION_API_ONLY = YES +DYLIB_COMPATIBILITY_VERSION = 1 +DYLIB_CURRENT_VERSION = 1 +DYLIB_INSTALL_NAME_BASE = @rpath + +ENABLE_BITCODE = YES +ENABLE_BITCODE[sdk=macosx*] = NO + +INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks +INFOPLIST_FILE = Info.plist +PRODUCT_BUNDLE_IDENTIFIER = com.krzyzanowskim.${PRODUCT_NAME:rfc1034identifier} +PRODUCT_NAME = $(TARGET_NAME) +SKIP_INSTALL = YES +DEAD_CODE_STRIPPING = YES diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Test.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Test.xcconfig new file mode 100644 index 00000000..fd1332e6 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-Test.xcconfig @@ -0,0 +1,8 @@ +#include "CryptoSwift-Shared.xcconfig" + +ENABLE_TESTABILITY = YES +STRIP_INSTALLED_PRODUCT = NO + +// Disable for tests. https://twitter.com/krzyzanowskim/status/1191515868401983489 +BUILD_LIBRARY_FOR_DISTRIBUTION = NO +COPY_PHASE_STRIP = NO diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Shared.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Shared.xcconfig new file mode 100644 index 00000000..df8cae11 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Shared.xcconfig @@ -0,0 +1,68 @@ +// +// CryptoSwift-TestHostApp-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 02/04/2018 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +CODE_SIGN_STYLE = Automatic +CODE_SIGN_IDENTITY = iPhone Developer +DEVELOPMENT_TEAM = HA4H7JURM8 +PROVISIONING_PROFILE_SPECIFIER = +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES + +// Asset Catalog App Icon Set Name +// +// Name of an asset catalog app icon set whose contents will be merged into the +// `Info.plist`. + +ASSETCATALOG_COMPILER_APPICON_NAME = + + +// Info.plist File +// +// The project-relative path to the property list file that contains the `Info.plist` +// information used by bundles. For details on information property list files, see +// [Information Property List +// Files](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigFiles.html#//apple_ref/doc/uid/20002091-CJBJIEDH) +// in [Runtime Configuration +// Guidelines](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPRuntimeConfig/000-Introduction/introduction.html). + +INFOPLIST_FILE = CryptoSwift-TestHostApp/Info.plist + + + +// Runpath Search Paths +// +// This is a list of paths to be added to the `runpath` search path list for the image +// being created. At runtime, `dyld` uses the `runpath` when searching for dylibs whose +// load path begins with `@rpath/`. See [Dynamic Library Programming +// Topics](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html). + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks + + + +// Product Bundle Identifier +// +// A string that uniquely identifies the bundle. The string should be in reverse DNS +// format using only alphanumeric characters (`A-Z`, `a-z`, `0-9`), the dot (`.`), and +// the hyphen (`-`). This value is used as the `CFBundleIdentifier` in the `Info.plist` +// of the built bundle. + +PRODUCT_BUNDLE_IDENTIFIER = test.CryptoSwiftTestHostApp + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the `ADDITIONAL_SDKS` +// setting. + +SDKROOT = iphoneos +SUPPORTED_PLATFORMS = iphonesimulator iphoneos + +COPY_PHASE_STRIP = NO +ONLY_ACTIVE_ARCH = YES diff --git a/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Test.xcconfig b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Test.xcconfig new file mode 100644 index 00000000..3cd31285 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/CryptoSwift-TestHostApp-Test.xcconfig @@ -0,0 +1,14 @@ +// +// CryptoSwift-TestHostApp-Test.xcconfig +// +// Generated by BuildSettingExtractor on 02/04/2018 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "CryptoSwift-TestHostApp-Shared.xcconfig" + +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym +ENABLE_NS_ASSERTIONS = NO +MTL_ENABLE_DEBUG_INFO = NO +SWIFT_OPTIMIZATION_LEVEL = -O +VALIDATE_PRODUCT = YES diff --git a/Carthage/Checkouts/CryptoSwift/config/Project-Debug.xcconfig b/Carthage/Checkouts/CryptoSwift/config/Project-Debug.xcconfig new file mode 100644 index 00000000..b008ac08 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/Project-Debug.xcconfig @@ -0,0 +1,9 @@ +#include "Project-Shared.xcconfig" + +COPY_PHASE_STRIP = NO +GCC_DYNAMIC_NO_PIC = NO +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1 +SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG +METAL_ENABLE_DEBUG_INFO = YES +ONLY_ACTIVE_ARCH = YES +ENABLE_TESTABILITY = YES diff --git a/Carthage/Checkouts/CryptoSwift/config/Project-Release.xcconfig b/Carthage/Checkouts/CryptoSwift/config/Project-Release.xcconfig new file mode 100644 index 00000000..e986f233 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/Project-Release.xcconfig @@ -0,0 +1,10 @@ +#include "Project-Shared.xcconfig" + +CODE_SIGN_IDENTITY[sdk=macosx*] = Developer ID Application + +CLANG_USE_OPTIMIZATION_PROFILE = YES +COPY_PHASE_STRIP = YES +ENABLE_NS_ASSERTIONS = NO +GCC_OPTIMIZATION_LEVEL = fast +METAL_ENABLE_DEBUG_INFO = NO +VALIDATE_PRODUCT = YES diff --git a/Carthage/Checkouts/CryptoSwift/config/Project-Shared.xcconfig b/Carthage/Checkouts/CryptoSwift/config/Project-Shared.xcconfig new file mode 100644 index 00000000..d285d32a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/Project-Shared.xcconfig @@ -0,0 +1,86 @@ +MARKETING_VERSION = 1.6.0 + +SUPPORTED_PLATFORMS = iphonesimulator iphoneos macosx appletvos watchos appletvsimulator watchsimulator + +SWIFT_COMPILATION_MODE = wholemodule +SWIFT_VERSION = 5.0 + +TARGETED_DEVICE_FAMILY = 1,2,3,4 + +TVOS_DEPLOYMENT_TARGET = 9.0 +IPHONEOS_DEPLOYMENT_TARGET = 11.0 +MACOSX_DEPLOYMENT_TARGET = 10.12 +WATCHOS_DEPLOYMENT_TARGET = 2.0 + +DEVELOPMENT_TEAM = +//PROVISIONING_PROFILE = +//PROVISIONING_PROFILE_SPECIFIER = + +CODE_SIGN_IDENTITY[sdk=macosx*] = Mac Developer +CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer +CODE_SIGN_IDENTITY[sdk=iphonesimulator*] = iPhone Developer +CODE_SIGN_STYLE = Automatic + +PRODUCT_NAME = ${TARGET_NAME} + +CLANG_ANALYZER_NONNULL = YES +CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE + +ALWAYS_SEARCH_USER_PATHS = NO + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x +CLANG_CXX_LIBRARY = libc++ +CLANG_ENABLE_MODULES = YES +CLANG_ENABLE_OBJC_ARC = YES +CLANG_ENABLE_OBJC_WEAK = YES + +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES +CLANG_WARN_BOOL_CONVERSION = YES +CLANG_WARN_COMMA = YES +CLANG_WARN_CONSTANT_CONVERSION = YES +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR +CLANG_WARN_EMPTY_BODY = YES +CLANG_WARN_ENUM_CONVERSION = YES +CLANG_WARN_INFINITE_RECURSION = YES +CLANG_WARN_INT_CONVERSION = YES +CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +CLANG_WARN_OBJC_LITERAL_CONVERSION = YES +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR +CLANG_WARN_RANGE_LOOP_ANALYSIS = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_SUSPICIOUS_MOVE = YES +CLANG_WARN_UNREACHABLE_CODE = YES +CLANG_WARN_DOCUMENTATION_COMMENTS = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE + +DEBUG_INFORMATION_FORMAT = dwarf +DEFINES_MODULE = YES + +ENABLE_STRICT_OBJC_MSGSEND = YES + +GCC_C_LANGUAGE_STANDARD = gnu99 +GCC_NO_COMMON_BLOCKS = YES +GCC_WARN_64_TO_32_BIT_CONVERSION = YES +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR +GCC_WARN_UNDECLARED_SELECTOR = YES +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE +GCC_WARN_UNUSED_FUNCTION = YES +GCC_WARN_UNUSED_LABEL = YES +GCC_WARN_UNUSED_VARIABLE = YES + +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES + +VERSION_INFO_PREFIX = +VERSIONING_SYSTEM = apple-generic +CURRENT_PROJECT_VERSION = 1 + +// XCFramework +// Swift have (at least) 2 language dialects: With and without Library Evolution behave differently regarding enums. +BUILD_LIBRARY_FOR_DISTRIBUTION = YES + +// Catalyst +SUPPORTS_MACCATALYST = YES +DERIVE_MACCATALYST_PRODUCT_BUNDLE_IDENTIFIER = NO diff --git a/Carthage/Checkouts/CryptoSwift/config/Tests-Shared.xcconfig b/Carthage/Checkouts/CryptoSwift/config/Tests-Shared.xcconfig new file mode 100644 index 00000000..a1d1007a --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/Tests-Shared.xcconfig @@ -0,0 +1,19 @@ +DEVELOPMENT_TEAM = +CODE_SIGN_IDENTITY = +CODE_SIGN_STYLE = Manual +CODE_SIGNING_REQUIRED = NO + +HEADER_SEARCH_PATHS = $(inherited) includes/** + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks @loader_path/../Frameworks @executable_path/../Frameworks + +PRODUCT_BUNDLE_IDENTIFIER = com.krzyzanowskim.${PRODUCT_NAME:rfc1034identifier} + +OTHER_SWIFT_FLAGS = $(inherited) -Xfrontend -debug-time-function-bodies + +// Disable for tests. https://twitter.com/krzyzanowskim/status/1191515868401983489 +BUILD_LIBRARY_FOR_DISTRIBUTION = NO + +MACOSX_DEPLOYMENT_TARGET = 10.15 + +INFOPLIST_FILE = Info.plist diff --git a/Carthage/Checkouts/CryptoSwift/config/Tests-Test.xcconfig b/Carthage/Checkouts/CryptoSwift/config/Tests-Test.xcconfig new file mode 100644 index 00000000..044ce709 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/config/Tests-Test.xcconfig @@ -0,0 +1,16 @@ +#include "Tests-Shared.xcconfig" + +COPY_PHASE_STRIP = NO +ENABLE_NS_ASSERTIONS = NO +ENABLE_TESTABILITY = YES +GCC_OPTIMIZATION_LEVEL = fast + +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1 CI=1 +SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG + +SWIFT_DISABLE_SAFETY_CHECKS = YES +SWIFT_OPTIMIZATION_LEVEL = -O + +METAL_ENABLE_DEBUG_INFO = NO +ONLY_ACTIVE_ARCH = YES +VALIDATE_PRODUCT = YES diff --git a/Carthage/Checkouts/CryptoSwift/scripts/build-framework.sh b/Carthage/Checkouts/CryptoSwift/scripts/build-framework.sh new file mode 100755 index 00000000..59427f57 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/scripts/build-framework.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +set -e + +BASE_PWD="$PWD" +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +OUTPUT_DIR=$( mktemp -d ) +COMMON_SETUP="-project ${SCRIPT_DIR}/../CryptoSwift.xcodeproj -scheme CryptoSwift -configuration Release -quiet SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES" + +# macOS +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=macOS' + +mkdir -p "${OUTPUT_DIR}/macos" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release/CryptoSwift.framework" "${OUTPUT_DIR}/macos/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# macOS Catalyst +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=macOS,variant=Mac Catalyst' + +mkdir -p "${OUTPUT_DIR}/maccatalyst" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-maccatalyst/CryptoSwift.framework" "${OUTPUT_DIR}/maccatalyst/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# iOS +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=iOS' + +mkdir -p "${OUTPUT_DIR}/iphoneos" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-iphoneos/CryptoSwift.framework" "${OUTPUT_DIR}/iphoneos/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# iOS Simulator +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=iOS Simulator' + +mkdir -p "${OUTPUT_DIR}/iphonesimulator" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-iphonesimulator/CryptoSwift.framework" "${OUTPUT_DIR}/iphonesimulator/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# tvOS +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=tvOS' + +mkdir -p "${OUTPUT_DIR}/appletvos" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-appletvos/CryptoSwift.framework" "${OUTPUT_DIR}/appletvos/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# tvOS Simulator +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=tvOS Simulator' + +mkdir -p "${OUTPUT_DIR}/appletvsimulator" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-appletvsimulator/CryptoSwift.framework" "${OUTPUT_DIR}/appletvsimulator/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# watchOS +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=watchOS' + +mkdir -p "${OUTPUT_DIR}/watchos" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-watchos/CryptoSwift.framework" "${OUTPUT_DIR}/watchos/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# watchOS Simulator +DERIVED_DATA_PATH=$( mktemp -d ) +xcrun xcodebuild build \ + $COMMON_SETUP \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -destination 'generic/platform=watchOS Simulator' + +mkdir -p "${OUTPUT_DIR}/watchsimulator" +ditto "${DERIVED_DATA_PATH}/Build/Products/Release-watchsimulator/CryptoSwift.framework" "${OUTPUT_DIR}/watchsimulator/CryptoSwift.framework" +rm -rf "${DERIVED_DATA_PATH}" + +# XCFRAMEWORK +rm -rf ${SCRIPT_DIR}/../CryptoSwift.xcframework +xcrun xcodebuild -quiet -create-xcframework \ + -framework "${OUTPUT_DIR}/iphoneos/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/iphonesimulator/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/appletvos/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/appletvsimulator/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/watchos/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/watchsimulator/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/macos/CryptoSwift.framework" \ + -framework "${OUTPUT_DIR}/maccatalyst/CryptoSwift.framework" \ + -output ${SCRIPT_DIR}/../CryptoSwift.xcframework + +# pushd ${OUTPUT_DIR} +# xcrun zip --symlinks -r -o ${BASE_PWD}/CryptoSwift.xcframework.zip CryptoSwift.xcframework +# popd + +echo "✔️ CryptoSwift.xcframework" +echo ${OUTPUT_DIR} + +rm -rf ${OUTPUT_DIR} +cd ${BASE_PWD} \ No newline at end of file diff --git a/Carthage/Checkouts/CryptoSwift/scripts/generate-contributors-list.sh b/Carthage/Checkouts/CryptoSwift/scripts/generate-contributors-list.sh new file mode 100755 index 00000000..cf120c80 --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/scripts/generate-contributors-list.sh @@ -0,0 +1,31 @@ +#!/bin/bash +##===----------------------------------------------------------------------===## +## +## This source file is part of the SwiftNIO open source project +## +## Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.txt for the list of SwiftNIO project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +set -eu +here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +contributors=$( cd "$here"/.. && git shortlog -es | cut -f2 | sed 's/^/- /' ) + +cat > "$here/../CONTRIBUTORS.txt" <<- EOF + For the purpose of tracking copyright, this is the list of individuals and + organizations who have contributed source code to CryptoSwift. + + ### Contributors + + $contributors + + **Updating this list** + + Please do not edit this file manually. It is generated using \`./scripts/generate-contributors-list.sh\`. If a name is misspelled or appearing multiple times: add an entry in \`./.mailmap\` +EOF diff --git a/Carthage/Checkouts/CryptoSwift/scripts/swiftformat.sh b/Carthage/Checkouts/CryptoSwift/scripts/swiftformat.sh new file mode 100755 index 00000000..90d1db0f --- /dev/null +++ b/Carthage/Checkouts/CryptoSwift/scripts/swiftformat.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +swiftformat --hexliteralcase lowercase --hexgrouping none --ranges nospace --wrapelements beforefirst --self remove $1 diff --git a/Carthage/Checkouts/PromiseKit/.github/FUNDING.yml b/Carthage/Checkouts/PromiseKit/.github/FUNDING.yml new file mode 100644 index 00000000..c62e094b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/FUNDING.yml @@ -0,0 +1,3 @@ +tidelift: "cocoapods/PromiseKit" +patreon: "mxcl" +github: mxcl diff --git a/Carthage/Checkouts/PromiseKit/.github/ISSUE_TEMPLATE.md b/Carthage/Checkouts/PromiseKit/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..7c027eb0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,11 @@ +[PLEASE READ THE TROUBLESHOOTING GUIDE](https://github.com/mxcl/PromiseKit/blob/master/Documentation/Troubleshooting.md). + +--- + +You read the guide but it didn’t help? OK, we’re here to help. + +* Please specify the PromiseKit major version you are using +* [Please format your code in triple backticks and ensure readable indentation](https://help.github.com/articles/creating-and-highlighting-code-blocks/) +* Please specify how you installed PromiseKit, ie. Carthage, CocoaPods, SwiftPM or other. If other provide DETAILED information about how you are integrating PromiseKit. + +If you ignore this template we will close your ticket and link to this template until you provide this necessary information. We cannot help you without it. diff --git a/Carthage/Checkouts/PromiseKit/.github/LinuxMain.stencil b/Carthage/Checkouts/PromiseKit/.github/LinuxMain.stencil new file mode 100644 index 00000000..11d1618e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/LinuxMain.stencil @@ -0,0 +1,19 @@ +@testable import Core +@testable import A_ +import XCTest + +//TODO get this to run on CI and don’t have it committed +//NOTE problem is Sourcery doesn’t support Linux currently +//USAGE: cd PromiseKit/Sources/.. && sourcery --config .github/sourcery.yml + +{% for type in types.classes|based:"XCTestCase" %} +extension {{ type.name }} { + static var allTests = [ + {% for method in type.methods %}{% if method.parameters.count == 0 and method.shortName|hasPrefix:"test" %} ("{{ method.shortName }}", {{type.name}}.{{ method.shortName }}), + {% endif %}{% endfor %}] +} + +{% endfor %} +XCTMain([ +{% for type in types.classes|based:"XCTestCase" %}{% if not type.annotations.excludeFromLinuxMain %} testCase({{ type.name }}.allTests), +{% endif %}{% endfor %}]) diff --git a/Carthage/Checkouts/PromiseKit/.github/codecov.yml b/Carthage/Checkouts/PromiseKit/.github/codecov.yml new file mode 100644 index 00000000..4396e60a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/codecov.yml @@ -0,0 +1,31 @@ +ignore: + - "Tests" + - "README.md" + - "Documentation" + - ".travis.yml" + +codecov: + notify: + require_ci_to_pass: yes + +coverage: + precision: 1 + round: up + range: "70...100" + + status: + project: yes + patch: + default: + threshold: 0.2% + changes: no + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: off diff --git a/Carthage/Checkouts/PromiseKit/.github/jazzy.yml b/Carthage/Checkouts/PromiseKit/.github/jazzy.yml new file mode 100644 index 00000000..9e8d71f0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/jazzy.yml @@ -0,0 +1,18 @@ +module: PromiseKit +custom_categories: + - name: Core Components + children: + - Promise + - Guarantee + - Thenable + - CatchMixin + - Resolver +xcodebuild_arguments: + - UseModernBuildSystem=NO +output: + ../output + # output directory is relative to config file… ugh +readme: + Documentation/README.md +theme: + fullwidth diff --git a/Carthage/Checkouts/PromiseKit/.github/ranger.yml b/Carthage/Checkouts/PromiseKit/.github/ranger.yml new file mode 100644 index 00000000..c9169dce --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/ranger.yml @@ -0,0 +1,2 @@ +merges: + - action: delete_branch diff --git a/Carthage/Checkouts/PromiseKit/.github/sourcery.yml b/Carthage/Checkouts/PromiseKit/.github/sourcery.yml new file mode 100644 index 00000000..e965499c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/sourcery.yml @@ -0,0 +1,12 @@ +sources: + include: + - ../Tests/A+ + - ../Tests/CorePromise + exclude: + - ../Tests/A+/0.0.0.swift + - ../Tests/CorePromise/Utilities.swift +templates: + include: + - LinuxMain.stencil +output: + ../Tests/LinuxMain.swift diff --git a/Carthage/Checkouts/PromiseKit/.github/workflows/cd.yml b/Carthage/Checkouts/PromiseKit/.github/workflows/cd.yml new file mode 100644 index 00000000..43132528 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/workflows/cd.yml @@ -0,0 +1,119 @@ +name: CD +on: + workflow_dispatch: + inputs: + version: + required: true +jobs: + pods: + runs-on: macos-latest + steps: + + - name: Start Deployment + uses: bobheadxi/deployments@v0.5.2 + id: deployment + with: + step: start + token: ${{ secrets.GITHUB_TOKEN }} + env: pods + + - uses: actions/checkout@v2 + with: + submodules: true + + - run: pod trunk push --allow-warnings --skip-tests --skip-import-validation + env: + COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} + + - name: Seal Deployment + uses: bobheadxi/deployments@v0.5.2 + if: always() + with: + step: finish + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + deployment_id: ${{ steps.deployment.outputs.deployment_id }} + + # carthage: + # runs-on: macos-latest + # steps: + + # - name: Start Deployment + # uses: bobheadxi/deployments@v0.5.2 + # id: deployment + # with: + # step: start + # token: ${{ secrets.GITHUB_TOKEN }} + # env: carthage + + # - uses: maxim-lobanov/setup-xcode@v1 + # with: + # xcode-version: ^11 + # # Waiting on https://github.com/Carthage/Carthage/issues/3103 for Xcode 12 + + # - uses: joutvhu/get-release@v1 + # id: release + # with: + # tag_name: ${{ github.event.inputs.version }} + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # - uses: actions/checkout@v2 + # - run: carthage build --no-skip-current --platform macOS,iOS,watchOS,tvOS --archive + # - run: mv PromiseKit.framework.zip PromiseKit-$v.framework.zip + + # - uses: actions/upload-release-asset@v1 + # with: + # upload_url: ${{ steps.release.outputs.upload_url }} + # asset_path: ./PromiseKit-${{ github.event.inputs.version }}.framework.zip + # asset_name: PromiseKit-${{ github.event.inputs.version }}.framework.zip + # asset_content_type: application/zip + # env: + # GITHUB_TOKEN: ${{ github.token }} + + # - name: Seal Deployment + # uses: bobheadxi/deployments@v0.5.2 + # if: always() + # with: + # step: finish + # token: ${{ secrets.GITHUB_TOKEN }} + # status: ${{ job.status }} + # deployment_id: ${{ steps.deployment.outputs.deployment_id }} + + docs: + runs-on: macos-latest + steps: + + - name: Start Deployment + uses: bobheadxi/deployments@v0.5.2 + id: deployment + with: + step: start + token: ${{ secrets.GITHUB_TOKEN }} + env: docs + + - uses: actions/checkout@v2 + - run: gem install jazzy + - run: | + jazzy --config .github/jazzy.yml \ + --github_url 'https://github.com/mxcl/PromiseKit' \ + --module-version ${{ github.event.inputs.version }} + - run: git remote update + - run: git checkout gh-pages + - run: rm -rf reference/v6 + - run: mv output reference/v6 + - run: git add reference/v6 + - run: git config user.name github-actions + - run: git config user.email github-actions@github.com + - run: git commit -m 'Updated docs for v${{ github.event.inputs.version }}' + - run: git remote add secure-origin https://${{ secrets.JAZZY_PAT }}@github.com/mxcl/PromiseKit.git + - run: git push secure-origin gh-pages + + - name: Seal Deployment + uses: bobheadxi/deployments@v0.5.2 + if: always() + with: + step: finish + token: ${{ secrets.GITHUB_TOKEN }} + status: ${{ job.status }} + deployment_id: ${{ steps.deployment.outputs.deployment_id }} diff --git a/Carthage/Checkouts/PromiseKit/.github/workflows/ci-podspec.yml b/Carthage/Checkouts/PromiseKit/.github/workflows/ci-podspec.yml new file mode 100644 index 00000000..cc61ef45 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/workflows/ci-podspec.yml @@ -0,0 +1,13 @@ +on: + workflow_dispatch: + pull_request: + paths: + - PromiseKit.podspec +jobs: + lint: + runs-on: macos-10.15 + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - run: pod lib lint --fail-fast diff --git a/Carthage/Checkouts/PromiseKit/.github/workflows/ci.yml b/Carthage/Checkouts/PromiseKit/.github/workflows/ci.yml new file mode 100644 index 00000000..23dfcd4d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/workflows/ci.yml @@ -0,0 +1,124 @@ +name: CI +on: + workflow_dispatch: + pull_request: + paths: + - Sources/** + - Tests/** + - .github/workflows/ci.yml + - PromiseKit.xcodeproj/** +jobs: + auto-cancel: + runs-on: ubuntu-latest + steps: + - uses: technote-space/auto-cancel-redundant-job@v1 + + linux: + needs: auto-cancel + runs-on: ubuntu-18.04 + strategy: + matrix: + swift: + - 4.0.3 + - 4.1.3 + - 4.2.4 + container: + image: swift:${{ matrix.swift }} + steps: + - uses: actions/checkout@v2 + - run: swift build -Xswiftc -warnings-as-errors -Xswiftc -swift-version -Xswiftc 3 + - run: swift build # generated linuxmain requires Swift 5 sadly + + linux-code-cov: + name: linux + needs: auto-cancel + runs-on: ubuntu-18.04 + strategy: + matrix: + swift: + - '5.0' + - 5.1 + - 5.2 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + container: + image: swift:${{ matrix.swift }} + steps: + - uses: actions/checkout@v2 + - run: swift build -Xswiftc -warnings-as-errors -Xswiftc -swift-version -Xswiftc 4 + - run: swift build -Xswiftc -warnings-as-errors -Xswiftc -swift-version -Xswiftc 4.2 + - run: swift test --enable-code-coverage --parallel + + - name: Generate Coverage Report + if: ${{ matrix.swift < 5.4 }} # fails for SOME REASON + run: | + apt-get -qq update + apt-get -qq install llvm-10 curl + export b=$(swift build --show-bin-path) && llvm-cov-10 \ + export -format lcov \ + -instr-profile=$b/codecov/default.profdata \ + --ignore-filename-regex='\.build/' \ + $b/*.xctest \ + > info.lcov + - uses: codecov/codecov-action@v1 + with: + file: ./info.lcov + + verify-linuxmain: + runs-on: macos-latest + name: linux (validate manifests) + steps: + - uses: actions/checkout@v2 + - run: swift test --generate-linuxmain + - run: git diff --exit-code + + test: + runs-on: macos-latest + strategy: + matrix: + dst: + - platform=macOS + - platform=tvOS Simulator,OS=14.3,name=Apple TV + - platform=iOS Simulator,OS=14.4,name=iPhone 12 + steps: + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: 12.4 + - uses: actions/checkout@v2 + - uses: sersoft-gmbh/xcodebuild-action@v1 + with: + project: PromiseKit.xcodeproj + scheme: PromiseKit + destination: ${{ matrix.dst }} + action: test + enable-code-coverage: true + - uses: codecov/codecov-action@v1 + + carthage: + runs-on: ${{ matrix.macos }} + strategy: + matrix: + xcode: [^11, ^12] + macos: [macos-11] + include: + - xcode: ^10 + macos: macos-10.15 + steps: + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: ${{ matrix.xcode }} + - uses: actions/checkout@v2 + + - uses: mingjun97/file-regex-replace@v1 + with: + regex: SWIFT_TREAT_WARNINGS_AS_ERRORS = NO + replacement: SWIFT_TREAT_WARNINGS_AS_ERRORS = YES + include: project.pbxproj + + - run: | + if [ ${{ matrix.xcode }} == ^12 ]; then + echo "CARTHAGE_ARGS=--use-xcframeworks" >> $GITHUB_ENV + fi + - run: carthage build --no-skip-current --no-use-binaries $CARTHAGE_ARGS diff --git a/Carthage/Checkouts/PromiseKit/.github/workflows/publish.yml b/Carthage/Checkouts/PromiseKit/.github/workflows/publish.yml new file mode 100644 index 00000000..cc59d544 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.github/workflows/publish.yml @@ -0,0 +1,73 @@ +name: Publish +on: + workflow_dispatch: + inputs: + version: + description: Version to publish + required: true +jobs: + ci: + runs-on: ubuntu-latest + steps: + - uses: aurelien-baudet/workflow-dispatch@v2 + with: + workflow: CI + token: ${{ secrets.JAZZY_PAT }} + wait-for-completion: true + + lint: + runs-on: macos-10.15 + strategy: + matrix: + xcode: + - ^10 + - ^11 + - ^12 + steps: + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: ${{ matrix.xcode }} + - uses: actions/checkout@v2 + with: + submodules: true + - run: pod lib lint --fail-fast + + create-release: + runs-on: ubuntu-latest + needs: [ci, lint] + env: + v: ${{ github.event.inputs.version }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # zero means “all” (or push fails) + - name: Update committed versions + run: | + ruby -i -pe "sub(/CURRENT_PROJECT_VERSION = [0-9.]+/, 'CURRENT_PROJECT_VERSION = $v')" PromiseKit.xcodeproj/project.pbxproj + ruby -i -pe "sub(/s.version = '[0-9.]+'/, 's.version = \'$v\'')" PromiseKit.podspec + - run: | + ! (git diff --quiet) + - name: Commit + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git commit -am "PromiseKit $v" + git push + - uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.event.inputs.version }} + name: ${{ github.event.inputs.version }} + + cd: + needs: create-release + runs-on: ubuntu-latest + steps: + - uses: aurelien-baudet/workflow-dispatch@v2 + with: + workflow: CD + token: ${{ secrets.JAZZY_PAT }} + inputs: "{\"version\": \"${{ github.event.inputs.version }}\"}" + ref: ${{ env.GITHUB_REF_NAME }} # or uses the SHA rather than branch and thus the above commit is not used + wait-for-completion: true diff --git a/Carthage/Checkouts/PromiseKit/.gitignore b/Carthage/Checkouts/PromiseKit/.gitignore new file mode 100644 index 00000000..6d14149a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.gitignore @@ -0,0 +1,8 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store +DerivedData +/Extensions/Carthage +/Tests/JS-A+/build diff --git a/Carthage/Checkouts/PromiseKit/.gitmodules b/Carthage/Checkouts/PromiseKit/.gitmodules new file mode 100644 index 00000000..9a18709e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.gitmodules @@ -0,0 +1,69 @@ +[submodule "Extensions/Foundation"] + path = Extensions/Foundation + url = https://github.com/PromiseKit/Foundation.git +[submodule "Extensions/UIKit"] + path = Extensions/UIKit + url = https://github.com/PromiseKit/UIKit.git +[submodule "Extensions/Accounts"] + path = Extensions/Accounts + url = https://github.com/PromiseKit/Accounts.git +[submodule "Extensions/MessagesUI"] + path = Extensions/MessagesUI + url = https://github.com/PromiseKit/MessagesUI.git +[submodule "Extensions/WatchConnectivity"] + path = Extensions/WatchConnectivity + url = https://github.com/PromiseKit/WatchConnectivity.git +[submodule "Extensions/Photos"] + path = Extensions/Photos + url = https://github.com/PromiseKit/Photos.git +[submodule "Extensions/MapKit"] + path = Extensions/MapKit + url = https://github.com/PromiseKit/MapKit.git +[submodule "Extensions/CloudKit"] + path = Extensions/CloudKit + url = https://github.com/PromiseKit/CloudKit.git +[submodule "Extensions/AddressBook"] + path = Extensions/AddressBook + url = https://github.com/PromiseKit/AddressBook.git +[submodule "Extensions/AssetsLibrary"] + path = Extensions/AssetsLibrary + url = https://github.com/PromiseKit/AssetsLibrary.git +[submodule "Extensions/CoreLocation"] + path = Extensions/CoreLocation + url = https://github.com/PromiseKit/CoreLocation.git +[submodule "Extensions/QuartzCore"] + path = Extensions/QuartzCore + url = https://github.com/PromiseKit/QuartzCore.git +[submodule "Extensions/Social"] + path = Extensions/Social + url = https://github.com/PromiseKit/Social.git +[submodule "Extensions/StoreKit"] + path = Extensions/StoreKit + url = https://github.com/PromiseKit/StoreKit.git +[submodule "Extensions/Bolts"] + path = Extensions/Bolts + url = https://github.com/PromiseKit/Bolts.git +[submodule "Extensions/CoreBluetooth"] + path = Extensions/CoreBluetooth + url = https://github.com/PromiseKit/CoreBluetooth.git +[submodule "Extensions/EventKit"] + path = Extensions/EventKit + url = https://github.com/PromiseKit/EventKit.git +[submodule "Extensions/SystemConfiguration"] + path = Extensions/SystemConfiguration + url = https://github.com/PromiseKit/SystemConfiguration +[submodule "Extensions/Alamofire"] + path = Extensions/Alamofire + url = https://github.com/PromiseKit/Alamofire +[submodule "Extensions/OMGHTTPURLRQ"] + path = Extensions/OMGHTTPURLRQ + url = https://github.com/PromiseKit/OMGHTTPURLRQ +[submodule "Extensions/AVFoundation"] + path = Extensions/AVFoundation + url = https://github.com/PromiseKit/AVFoundation +[submodule "Extensions/HomeKit"] + path = Extensions/HomeKit + url = https://github.com/PromiseKit/HomeKit.git +[submodule "Extensions/HealthKit"] + path = Extensions/HealthKit + url = https://github.com/PromiseKit/PMKHealthKit diff --git a/Carthage/Checkouts/PromiseKit/.tidelift.yml b/Carthage/Checkouts/PromiseKit/.tidelift.yml new file mode 100644 index 00000000..aab29a9c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.tidelift.yml @@ -0,0 +1 @@ +extra_ignore_directories: [ Tests ] diff --git a/Carthage/Checkouts/PromiseKit/.travis.yml b/Carthage/Checkouts/PromiseKit/.travis.yml new file mode 100644 index 00000000..16223f28 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/.travis.yml @@ -0,0 +1,30 @@ +os: osx +language: swift +osx_image: xcode9.4 + +if: tag =~ /^[0-9]+\.[0-9]+\.[0-9]+/ + +stages: + - swiftpm + - carthage + +jobs: + include: + - &swiftpm + stage: swiftpm + osx_image: xcode9.4 + script: swift build + - <<: *swiftpm + osx_image: xcode10.3 + - <<: *swiftpm + osx_image: xcode11.6 + + - &carthage + stage: carthage + osx_image: xcode9.4 + install: sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + script: carthage build --no-skip-current + - <<: *carthage + osx_image: xcode10.3 + - <<: *carthage + osx_image: xcode11.6 diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Appendix.md b/Carthage/Checkouts/PromiseKit/Documentation/Appendix.md new file mode 100644 index 00000000..d3797f4d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Appendix.md @@ -0,0 +1,211 @@ +# Common Misusage + +## Doubling up Promises + +Don’t do this: + +```swift +func toggleNetworkSpinnerWithPromise(funcToCall: () -> Promise) -> Promise { + return Promise { seal in + firstly { + setNetworkActivityIndicatorVisible(true) + return funcToCall() + }.then { result in + seal.fulfill(result) + }.always { + setNetworkActivityIndicatorVisible(false) + }.catch { err in + seal.reject(err) + } + } +} +``` + +Do this: + +```swift +func toggleNetworkSpinnerWithPromise(funcToCall: () -> Promise) -> Promise { + return firstly { + setNetworkActivityIndicatorVisible(true) + return funcToCall() + }.always { + setNetworkActivityIndicatorVisible(false) + } +} +``` + +You already *had* a promise, you don’t need to wrap it in another promise. + + +## Optionals in Promises + +When we see `Promise`, it usually implies a misuse of promises. For +example: + +```swift +return firstly { + getItems() +}.then { items -> Promise<[Item]?> in + guard !items.isEmpty else { + return .value(nil) + } + return Promise(value: items) +} +``` + +The second `then` chooses to return `nil` in some circumstances. This choice +imposes the need to check for `nil` on the consumer of the promise. + +It's usually better to shunt these sorts of exceptions away from the +happy path and onto the error path. In this case, we can create a specific +error type for this condition: + +```swift +return firstly { + getItems() +}.map { items -> [Item]> in + guard !items.isEmpty else { + throw MyError.emptyItems + } + return items +} +``` + +> *Note*: Use `compactMap` when an API outside your control returns an Optional and you want to generate an error instead of propagating `nil`. + +# Tips n’ Tricks + +## Background-Loaded Member Variables + +```swift +class MyViewController: UIViewController { + private let ambience: Promise = DispatchQueue.global().async(.promise) { + guard let asset = NSDataAsset(name: "CreepyPad") else { throw PMKError.badInput } + let player = try AVAudioPlayer(data: asset.data) + player.prepareToPlay() + return player + } +} +``` + +## Chaining Animations + +```swift +firstly { + UIView.animate(.promise, duration: 0.3) { + self.button1.alpha = 0 + } +}.then { + UIView.animate(.promise, duration: 0.3) { + self.button2.alpha = 1 + } +}.then { + UIView.animate(.promise, duration: 0.3) { + adjustConstraints() + self.view.layoutIfNeeded() + } +} +``` + + +## Voiding Promises + +It is often convenient to erase the type of a promise to facilitate chaining. +For example, `UIView.animate(.promise)` returns `Guarantee` because UIKit’s +completion API supplies a `Bool`. However, we usually don’t need this value and +can chain more simply if it is discarded (that is, converted to `Void`). We can use +`asVoid()` to achieve this conversion: + +```swift +UIView.animate(.promise, duration: 0.3) { + self.button1.alpha = 0 +}.asVoid().done(self.nextStep) +``` + +For situations in which we are combining many promises into a `when`, `asVoid()` +becomes essential: + +```swift +let p1 = foo() +let p2 = bar() +let p3 = baz() +//… +let p10 = fluff() + +when(fulfilled: p1.asVoid(), p2.asVoid(), /*…*/, p10.asVoid()).then { + let value1 = p1.value! // safe bang since all the promises fulfilled + // … + let value10 = p10.value! +}.catch { + //… +} +``` + +You normally don't have to do this explicitly because `when` does it for you +for up to 5 parameters. + + +## Blocking (Await) + +Sometimes you have to block the main thread to await completion of an asynchronous task. +In these cases, you can (with caution) use `wait`: + +```swift +public extension UNUserNotificationCenter { + var wasPushRequested: Bool { + let settings = Guarantee(resolver: getNotificationSettings).wait() + return settings != .notDetermined + } +} +``` + +The task under the promise **must not** call back onto the current thread or it +will deadlock. + +## Starting a Chain on a Background Queue/Thread + +`firstly` deliberately does not take a queue. A detailed rationale for this choice +can be found in the ticket tracker. + +So, if you want to start a chain by dispatching to the background, you have to use +`DispatchQueue.async`: + +```swift +DispatchQueue.global().async(.promise) { + return value +}.done { value in + //… +} +``` + +However, this function cannot return a promise because of Swift compiler ambiguity +issues. Thus, if you must start a promise on a background queue, you need to +do something like this: + + +```swift +Promise { seal in + DispatchQueue.global().async { + seal(value) + } +}.done { value in + //… +} +``` + +Or more simply (though with caveats; see the documentation for `wait`): + +```swift +DispatchQueue.global().async(.promise) { + return try fetch().wait() +}.done { value in + //… +} +``` + +However, you shouldn't need to do this often. If you find yourself wanting to use +this technique, perhaps you should instead modify the code for `fetch` to make it do +its work on a background thread. + +Promises abstract asynchronicity, so exploit and support that model. Design your +APIs so that consumers don’t have to care what queue your functions run on. diff --git a/Carthage/Checkouts/PromiseKit/Documentation/CommonPatterns.md b/Carthage/Checkouts/PromiseKit/Documentation/CommonPatterns.md new file mode 100644 index 00000000..97dfe5ef --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/CommonPatterns.md @@ -0,0 +1,495 @@ +# Common Patterns + +One feature of promises that makes them particularly useful is that they are composable. +This fact enables complex, yet safe asynchronous patterns that would otherwise be quite +intimidating when implemented with traditional methods. + + +## Chaining + +The most common pattern is chaining: + +```swift +firstly { + fetch() +}.then { + map($0) +}.then { + set($0) + return animate() +}.ensure { + // something that should happen whatever the outcome +}.catch { + handle(error: $0) +} +``` + +If you return a promise in a `then`, the next `then` *waits* on that promise +before continuing. This is the essence of promises. + +Promises are easy to compose, so they encourage you to develop highly asynchronous +apps without fear of the spaghetti code (and associated refactoring pains) of +asynchronous systems that use completion handlers. + + +## APIs That Use Promises + +Promises are composable, so return them instead of accepting completion blocks: + +```swift +class MyRestAPI { + func user() -> Promise { + return firstly { + URLSession.shared.dataTask(.promise, with: url) + }.compactMap { + try JSONSerialization.jsonObject(with: $0.data) as? [String: Any] + }.map { dict in + User(dict: dict) + } + } + + func avatar() -> Promise { + return user().then { user in + URLSession.shared.dataTask(.promise, with: user.imageUrl) + }.compactMap { + UIImage(data: $0.data) + } + } +} +``` + +This way, asynchronous chains can cleanly and seamlessly incorporate code from all over +your app without violating architectural boundaries. + +> *Note*: We provide [promises for Alamofire](https://github.com/PromiseKit/Alamofire-) too! + + +## Background Work + +```swift +class MyRestAPI { + func avatar() -> Promise { + let bgq = DispatchQueue.global(qos: .userInitiated) + + return firstly { + user() + }.then(on: bgq) { user in + URLSession.shared.dataTask(.promise, with: user.imageUrl) + }.compactMap(on: bgq) { + UIImage(data: $0) + } + } +} +``` + +All PromiseKit handlers take an `on` parameter that lets you designate the dispatch queue +on which to run the handler. The default is always the main queue. + +PromiseKit is *entirely* thread safe. + +> *Tip*: With caution, you can have all `then`, `map`, `compactMap`, etc., run on +a background queue. See `PromiseKit.conf`. Note that we suggest only changing +the queue for the `map` suite of functions, so `done` and `catch` will +continue to run on the main queue, which is *usually* what you want. + +## Failing Chains + +If an error occurs mid-chain, simply throw an error: + +```swift +firstly { + foo() +}.then { baz in + bar(baz) +}.then { result in + guard !result.isBad else { throw MyError.myIssue } + //… + return doOtherThing() +} +``` + +The error will surface at the next `catch` handler. + +Since promises handle thrown errors, you don't have to wrap calls to throwing functions +in a `do` block unless you really want to handle the errors locally: + +```swift +foo().then { baz in + bar(baz) +}.then { result in + try doOtherThing() +}.catch { error in + // if doOtherThing() throws, we end up here +} +``` + +> *Tip*: Swift lets you define an inline `enum Error` inside the function you +are working on. This isn’t *great* coding practice, but it's better than +avoiding throwing an error because you couldn't be bothered to define a good global +`Error` `enum`. + + +## Abstracting Away Asynchronicity + +```swift +var fetch = API.fetch() + +override func viewDidAppear() { + fetch.then { items in + //… + } +} + +func buttonPressed() { + fetch.then { items in + //… + } +} + +func refresh() -> Promise { + // ensure only one fetch operation happens at a time + + if fetch.isResolved { + startSpinner() + fetch = API.fetch().ensure { + stopSpinner() + } + } + return fetch +} +``` + +With promises, you don’t need to worry about *when* your asynchronous operation +finishes. Just act like it already has. + +Above, we see that you can call `then` as many times on a promise as you +like. All the blocks will be executed in the order they were added. + + +## Chaining Sequences + +When you have a series of tasks to perform on an array of data: + +```swift +// fade all visible table cells one by one in a “cascading” effect + +var fade = Guarantee() +for cell in tableView.visibleCells { + fade = fade.then { + UIView.animate(.promise, duration: 0.1) { + cell.alpha = 0 + } + } +} +fade.done { + // finish +} +``` + +Or if you have an array of closures that return promises: + +```swift +var foo = Promise() +for nextPromise in arrayOfClosuresThatReturnPromises { + foo = foo.then(nextPromise) + // ^^ you rarely would want an array of promises instead, since then + // they have all already started, you may as well use `when()` +} +foo.done { + // finish +} +``` + +> *Note*: You *usually* want `when()`, since `when` executes all of its +component promises in parallel and so completes much faster. Use the pattern +shown above in situations where tasks *must* be run sequentially; animation +is a good example. + +> We also provide `when(concurrently:)`, which lets you schedule more than +one promise at a time if you need to. + +## Timeout + +```swift +let fetches: [Promise] = makeFetches() +let timeout = after(seconds: 4) + +race(when(fulfilled: fetches).asVoid(), timeout).then { + //… +} +``` + +`race` continues as soon as one of the promises it is watching finishes. + +Make sure the promises you pass to `race` are all of the same type. The easiest way +to ensure this is to use `asVoid()`. + +Note that if any component promise rejects, the `race` will reject, too. + + +# Minimum Duration + +Sometimes you need a task to take *at least* a certain amount of time. (For example, +you want to show a progress spinner, but if it shows for less than 0.3 seconds, the UI +appears broken to the user.) + +```swift +let waitAtLeast = after(seconds: 0.3) + +firstly { + foo() +}.then { + waitAtLeast +}.done { + //… +} +``` + +The code above works because we create the delay *before* we do work in `foo()`. By the +time we get to waiting on that promise, either it will have already timed out or we will wait +for whatever remains of the 0.3 seconds before continuing the chain. + + +## Cancellation + +Promises don’t have a `cancel` function, but they do support cancellation through a +special error type that conforms to the `CancellableError` protocol. + +```swift +func foo() -> (Promise, cancel: () -> Void) { + let task = Task(…) + var cancelme = false + + let promise = Promise { seal in + task.completion = { value in + guard !cancelme else { return reject(PMKError.cancelled) } + seal.fulfill(value) + } + task.start() + } + + let cancel = { + cancelme = true + task.cancel() + } + + return (promise, cancel) +} +``` + +Promises don’t have a `cancel` function because you don’t want code outside of +your control to be able to cancel your operations--*unless*, of course, you explicitly +want to enable that behavior. In cases where you do want cancellation, the exact way +that it should work will vary depending on how the underlying task supports cancellation. +PromiseKit provides cancellation primitives but no concrete API. + +**Important**: Errors which conform to the `CancellableError` protocol do *not* normally trigger the `.catch` block. +Cancelation is neither success nor failure, so cancelled chains do not call `catch` handlers by default. +However you can intercept cancellation if you like: + +```swift +foo.then { + //… +}.catch(policy: .allErrors) { + // cancelled errors are handled *as well* +} +``` + +**Important**: Canceling a promise chain is *not* the same as canceling the underlying +asynchronous task. Promises are wrappers around asynchronicity, but they have no +control over the underlying tasks. If you need to cancel an underlying task, you +need to cancel the underlying task! + +> The library [CancellablePromiseKit](https://github.com/johannesd/CancellablePromiseKit) extends the concept of Promises to fully cover cancellable tasks. + +## Retry / Polling + +```swift +func attempt(maximumRetryCount: Int = 3, delayBeforeRetry: DispatchTimeInterval = .seconds(2), _ body: @escaping () -> Promise) -> Promise { + var attempts = 0 + func attempt() -> Promise { + attempts += 1 + return body().recover { error -> Promise in + guard attempts < maximumRetryCount else { throw error } + return after(delayBeforeRetry).then(attempt) + } + } + return attempt() +} + +attempt(maximumRetryCount: 3) { + flakeyTask(parameters: foo) +}.then { + //… +}.catch { _ in + // we attempted three times but still failed +} +``` + +In most cases, you should probably supplement the code above so that it re-attempts only for +specific error conditions. + + +## Wrapping Delegate Systems + +Be careful with Promises and delegate systems, as they are not always compatible. +Promises complete *once*, whereas most delegate systems may notify their delegate many +times. This is why, for example, there is no PromiseKit extension for a +`UIButton`. + +A good example of an appropriate time to wrap delegation is when you need a +single `CLLocation` lookup: + +```swift +extension CLLocationManager { + static func promise() -> Promise { + return PMKCLLocationManagerProxy().promise + } +} + +class PMKCLLocationManagerProxy: NSObject, CLLocationManagerDelegate { + private let (promise, seal) = Promise<[CLLocation]>.pending() + private var retainCycle: PMKCLLocationManagerProxy? + private let manager = CLLocationManager() + + init() { + super.init() + retainCycle = self + manager.delegate = self // does not retain hence the `retainCycle` property + + promise.ensure { + // ensure we break the retain cycle + self.retainCycle = nil + } + } + + @objc fileprivate func locationManager(_: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + seal.fulfill(locations) + } + + @objc func locationManager(_: CLLocationManager, didFailWithError error: Error) { + seal.reject(error) + } +} + +// use: + +CLLocationManager.promise().then { locations in + //… +}.catch { error in + //… +} +``` + +> Please note: we provide this promise with our CoreLocation extensions at +> https://github.com/PromiseKit/CoreLocation + + +## Recovery + +Sometimes you don’t want an error to cascade. Instead, you want to supply a default result: + +```swift +CLLocationManager.requestLocation().recover { error -> Promise in + guard error == MyError.airplaneMode else { + throw error + } + return .value(CLLocation.savannah) +}.done { location in + //… +} +``` + +Be careful not to ignore all errors, though! Recover only those errors that make sense to recover. + + +## Promises for Modal View Controllers + +```swift +class ViewController: UIViewController { + + private let (promise, seal) = Guarantee<…>.pending() // use Promise if your flow can fail + + func show(in: UIViewController) -> Promise<…> { + in.show(self, sender: in) + return promise + } + + func done() { + dismiss(animated: true) + seal.fulfill(…) + } +} + +// use: + +ViewController().show(in: self).done { + //… +}.catch { error in + //… +} +``` + +This is the best approach we have found, which is a pity as it requires the +presentee to control the presentation and requires the presentee to dismiss itself +explicitly. + +Nothing seems to beat storyboard segues for decoupling an app's controllers. + + +## Saving Previous Results + +Let’s say you have: + + +```swift +login().then { username in + fetch(avatar: username) +}.done { image in + //… +} +``` + +What if you want access to both `username` and `image` in your `done`? + +The most obvious way is to use nesting: + +```swift +login().then { username in + fetch(avatar: username).done { image in + // we have access to both `image` and `username` + } +}.done { + // the chain still continues as you'd expect +} +``` + +However, such nesting reduces the clarity of the chain. Instead, we could use Swift +tuples: + +```swift +login().then { username in + fetch(avatar: username).map { ($0, username) } +}.then { image, username in + //… +} +``` + +The code above simply maps `Promise` into `Promise<(UIImage, String)>`. + + +## Waiting on Multiple Promises, Whatever Their Result + +Use `when(resolved:)`: + +```swift +when(resolved: a, b).done { (results: [Result]) in + // `Result` is an enum of `.fulfilled` or `.rejected` +} + +// ^^ cannot call `catch` as `when(resolved:)` returns a `Guarantee` +``` + +Generally, you don't want this! People ask for it a lot, but usually because +they are trying to ignore errors. What they really need is to use `recover` on one of the +promises. Errors happen, so they should be handled; you usually don't want to ignore them. diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Examples/ImageCache.md b/Carthage/Checkouts/PromiseKit/Documentation/Examples/ImageCache.md new file mode 100644 index 00000000..98af805e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Examples/ImageCache.md @@ -0,0 +1,131 @@ +# Image Cache with Promises + +Here is an example of a simple image cache that uses promises to simplify the +state machine: + +```swift +import Foundation +import PromiseKit + +/** + * Small (10 images) + * Thread-safe + * Consolidates multiple requests to the same URLs + * Removes stale entries (FIXME well, strictly we may delete while fetching from cache, but this is unlikely and non-fatal) + * Completely _ignores_ server caching headers! + */ + +private let q = DispatchQueue(label: "org.promisekit.cache.image", attributes: .concurrent) +private var active: [URL: Promise] = [:] +private var cleanup = Promise() + + +public func fetch(image url: URL) -> Promise { + var promise: Promise? + q.sync { + promise = active[url] + } + if let promise = promise { + return promise + } + + q.sync { + promise = Promise(.start) { + + let dst = try url.cacheDestination() + + guard !FileManager.default.isReadableFile(atPath: dst.path) else { + return Promise(dst) + } + + return Promise { seal in + URLSession.shared.downloadTask(with: url) { tmpurl, _, error in + do { + guard let tmpurl = tmpurl else { throw error ?? E.unexpectedError } + try FileManager.default.moveItem(at: tmpurl, to: dst) + seal.fulfill(dst) + } catch { + seal.reject(error) + } + }.resume() + } + + }.then(on: .global(QoS: .userInitiated)) { + try Data(contentsOf: $0) + } + + active[url] = promise + + if cleanup.isFulfilled { + cleanup = promise!.asVoid().then(on: .global(QoS: .utility), execute: docleanup) + } + } + + return promise! +} + +public func cached(image url: URL) -> Data? { + guard let dst = try? url.cacheDestination() else { + return nil + } + return try? Data(contentsOf: dst) +} + + +public func cache(destination remoteUrl: URL) throws -> URL { + return try remoteUrl.cacheDestination() +} + +private func cache() throws -> URL { + guard let dst = FileManager.default.docs? + .appendingPathComponent("Library") + .appendingPathComponent("Caches") + .appendingPathComponent("cache.img") + else { + throw E.unexpectedError + } + + try FileManager.default.createDirectory(at: dst, withIntermediateDirectories: true, attributes: [:]) + + return dst +} + +private extension URL { + func cacheDestination() throws -> URL { + + var fn = String(hashValue) + let ext = pathExtension + + // many of Apple's functions don’t recognize file type + // unless we preserve the file extension + if !ext.isEmpty { + fn += ".\(ext)" + } + + return try cache().appendingPathComponent(fn) + } +} + +enum E: Error { + case unexpectedError + case noCreationTime +} + +private func docleanup() throws { + var contents = try FileManager.default + .contentsOfDirectory(at: try cache(), includingPropertiesForKeys: [.creationDateKey]) + .map { url -> (Date, URL) in + guard let date = try url.resourceValues(forKeys: [.creationDateKey]).creationDate else { + throw E.noCreationTime + } + return (date, url) + }.sorted(by: { + $0.0 > $1.0 + }) + + while contents.count > 10 { + let rm = contents.popLast()!.1 + try FileManager.default.removeItem(at: rm) + } +} +```` \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Examples/URLSession+BadResponseErrors.swift b/Carthage/Checkouts/PromiseKit/Documentation/Examples/URLSession+BadResponseErrors.swift new file mode 100644 index 00000000..efc37ef7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Examples/URLSession+BadResponseErrors.swift @@ -0,0 +1,20 @@ +Promise(.pending) { seal in + URLSession.shared.dataTask(with: rq, completionHandler: { data, rsp, error in + if let data = data { + seal.fulfill(data) + } else if let error = error { + if case URLError.badServerResponse = error, let rsp = rsp as? HTTPURLResponse { + seal.reject(Error.badResponse(rsp.statusCode)) + } else { + seal.reject(error) + } + } else { + seal.reject(PMKError.invalidCallingConvention) + } + }) +} + +enum Error: Swift.Error { + case badUrl + case badResponse(Int) +} diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Examples/detweet.swift b/Carthage/Checkouts/PromiseKit/Documentation/Examples/detweet.swift new file mode 100644 index 00000000..6522d0c7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Examples/detweet.swift @@ -0,0 +1,102 @@ +#!/usr/bin/swift sh +import Foundation +import PromiseKit // @mxcl ~> 6.5 +import Swifter // @mattdonnelly == b27a89 +let swifter = Swifter( + consumerKey: "FILL", + consumerSecret: "ME", + oauthToken: "IN", + oauthTokenSecret: "https://developer.twitter.com/en/docs/basics/apps/overview.html" +) + +extension JSON { + var date: Date? { + guard let string = string else { return nil } + + let formatter = DateFormatter() + formatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" + return formatter.date(from: string) + } +} + +let twoMonthsAgo = Date() - 24*60*60*30*2 + +print("Deleting qualifying tweets before:", twoMonthsAgo) + +func deleteTweets(maxID: String? = nil) -> Promise { + return Promise { seal in + swifter.getTimeline(for: "mxcl", count: 200, maxID: maxID, success: { json in + + if json.array!.count <= 1 { + // if we get one result for a requested maxID, we're done + return seal.fulfill() + } + + for item in json.array! { + let date = item["created_at"].date! + guard date < twoMonthsAgo, item["favorite_count"].integer! < 2 else { + continue + } + swifter.destroyTweet(forID: id, success: { _ in + print("D:", item["text"].string!) + }, failure: seal.reject) + } + + let next = json.array!.last!["id_str"].string! + deleteTweets(maxID: next).pipe(to: seal.resolve) + + }, failure: seal.reject) + } +} + +func deleteFavorites(maxID: String? = nil) -> Promise { + return Promise { seal in + swifter.getRecentlyFavoritedTweets(count: 200, maxID: maxID, success: { json in + + if json.array!.count <= 1 { + return seal.fulfill() + } + + for item in json.array! { + guard item["created_at"].date! < twoMonthsAgo else { continue } + + swifter.unfavoriteTweet(forID: item["id_str"].string!, success: { _ in + print("D❤️:", item["text"].string!) + }, failure: seal.reject) + } + + let next = json.array!.last!["id_str"].string! + deleteFavorites(maxID: next).pipe(to: seal.resolve) + + }, failure: seal.reject) + } +} + +func unblockPeople(cursor: String? = nil) -> Promise { + return Promise { seal in + swifter.getBlockedUsersIDs(stringifyIDs: "true", cursor: cursor, success: { json, prev, next in + for id in json.array! { + print("Unblocking:", id) + swifter.unblockUser(for: .id(id.string!)) + } + + if let next = next, !next.isEmpty, next != prev, next != "0" { + unblockPeople(cursor: next).pipe(to: seal.resolve) + } else { + seal.fulfill() + } + + }, failure: seal.reject) + } +} + +firstly { + when(fulfilled: deleteTweets(), deleteFavorites(), unblockPeople()) +}.done { + exit(0) +}.catch { + print("error:", $0) + exit(1) +} + +RunLoop.main.run() diff --git a/Carthage/Checkouts/PromiseKit/Documentation/FAQ.md b/Carthage/Checkouts/PromiseKit/Documentation/FAQ.md new file mode 100644 index 00000000..decd7ba3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/FAQ.md @@ -0,0 +1,398 @@ +# FAQ + +## Why should I use PromiseKit over X-Promises-Foo? + +* PromiseKit has a heavy focus on **developer experience**. You’re a developer; do you care about your experience? Yes? Then pick PromiseKit. +* Do you care about having any bugs you find fixed? Then pick PromiseKit. +* Do you care about having your input heard and reacted to in a fast fashion? Then pick PromiseKit. +* Do you want a library that has been maintained continuously and passionately for 6 years? Then pick PromiseKit. +* Do you want a library that the community has chosen to be their №1 Promises/Futures library? Then pick PromiseKit. +* Do you want to be able to use Promises with Apple’s SDKs rather than having to do all the work of writing the Promise implementations yourself? Then pick PromiseKit. +* Do you want to be able to use Promises with Swift 3.x, Swift 4.x, ObjC, iOS, tvOS, watchOS, macOS, Android & Linux? Then pick PromiseKit. +* PromiseKit verifies its correctness by testing against the entire [Promises/A+ test suite](https://github.com/promises-aplus/promises-tests). + +## How do I create a fulfilled `Void` promise? + +```swift +let foo = Promise() + +// or: + +let bar = Promise.value(()) +``` + +## How do I “early `return`”? + +```swift +func foo() -> Promise { + guard thingy else { + return Promise() + } + + //… +} + +func bar() -> Promise { + guard thingy else { + return .value(instanceOfSomethingNotVoid) + } + + //… +} +``` + +## Do I need to worry about retain cycles? + +Generally, no. Once a promise completes, all handlers are released and so +any references to `self` are also released. + +However, if your chain contains side effects that you would typically +not want to happen after, say, a view controller is popped, then you should still +use `weak self` (and check for `self == nil`) to prevent any such side effects. + +*However*, in our experience most things that developers consider side effects that +should be protected against are in fact *not* side effects. + +Side effects include changes to global application state. They *do not* include +changing the display state of a view-controller. So, protect against setting `UserDefaults` or +modifying the application database, and don't bother protecting against changing +the text in a `UILabel`. + +[This StackOverflow question](https://stackoverflow.com/questions/39281214/should-i-use-weak-self-in-promisekit-blocks) +has some good discussion on this topic. + +## Do I need to retain my promises? + +No. Every promise handler retains its promise until the handler is executed. Once +all handlers have been executed, the promise is deallocated. So you only need to retain +the promise if you need to refer to its final value after its chain has completed. + +## Where should I put my `catch`? + +`catch` deliberately terminates the chain. You should put it low in your promise +hierarchy at a point as close to the root as possible. Typically, this would be +somewhere such as a view controller, where your `catch` can then display a message +to the user. + +This means you should be writing one catch for many `then`s and returning +promises that do not have internal `catch` handlers of their own. + +This is obviously a guideline; do what is necessary. + +## How do branched chains work? + +Suppose you have a promise: + +``` +let promise = foo() +``` + +And you call `then` twice: + +``` +promise.then { + // branch A +} + +promise.then { + // branch B +} +``` + +You now have a branched chain. When `promise` resolves, both chains receive its +value. However, the two chains are entirely separate and Swift will prompt you +to ensure that both have `catch` handlers. + +You can most likely ignore the `catch` for one of these branches, but be careful: +in these situations, Swift cannot help you ensure that your chains are error-handled. + +``` +promise.then { + // branch A +}.catch { error in + //… +} + +_ = promise.then { + print("foo") + + // ignoring errors here as print cannot error and we handle errors above +} +``` + +It may be safer to recombine the two branches into a single chain again: + +``` +let p1 = promise.then { + // branch A +} + +let p2 = promise.then { + // branch B +} + +when(fulfilled: p1, p2).catch { error in + //… +} +``` + +> It's worth noting that you can add multiple `catch` handlers to a promise, too. +> And indeed, both will be called if the chain is rejected. + +## Is PromiseKit “heavy”? + +No. PromiseKit contains hardly any source code. In fact, it is quite lightweight. Any +“weight” relative to other promise implementations derives from 6 years of bug fixes +and tuning, from the fact that we have *stellar* Objective-C-to-Swift bridging and +from important things such as [Zalgo prevention](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) +that hobby-project implementations don’t consider. + +## Why is debugging hard? + +Because promises always execute via dispatch, the backtrace you see at the point of +an error has less information than is usually required to trace the path of execution. + +One solution is to turn off dispatch during debugging: + +```swift +// Swift +DispatchQueue.default = zalgo + +//ObjC +PMKSetDefaultDispatchQueue(zalgo) +``` + +Don’t leave this on. In normal use, we always dispatch to avoid you accidentally writing +a common bug pattern. See [this blog post](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony). + +## Where is `all()`? + +Some promise libraries provide `all` for awaiting multiple results. We call this function +`when`, but it is the same thing. We chose `when` because it's the more common term and +because we think it reads better in code. + +## How can I test APIs that return promises? + +You need to use `XCTestExpectation`. + +We also define `wait()` and `hang()`. Use them if you must, but be careful because they +block the current thread! + +## Is PromiseKit thread-safe? + +Yes, entirely. + +However the code *you* write in your `then`s might not be! + +Just make sure you don’t access state outside the chain from concurrent queues. +By default, PromiseKit handlers run on the `main` thread, which is serial, so +you typically won't have to worry about this. + +## Why are there separate classes for Objective-C and Swift? + +`Promise` is generic and and so cannot be represented by Objective-C. + +## Does PromiseKit conform to Promises/A+? + +Yes. We have tests that prove this. + +## How do PromiseKit and RxSwift/ReactiveSwift differ? + +PromiseKit is a lot simpler. + +The top-level difference between PromiseKit and RxSwift is that RxSwift `Observable`s (roughly +analogous to PromiseKit `Promise`s) do not necessarily return a single result: they may emit +zero, one, or an infinite stream of values. This small conceptual change leads to an API +that's both surprisingly powerful and surprisingly complex. + +RxSwift requires commitment to a paradigm shift in how you program. It proposes that you +restructure your code as a matrix of interacting value pipelines. When applied properly +to a suitable problem, RxSwift can yield great benefits in robustness and simplicity. +But not all applications are suitable for RxSwift. + +By contrast, PromiseKit selectively applies the best parts of reactive programming +to the hardest part of pure Swift development, the management of asynchronicity. It's a broadly +applicable tool. Most asynchronous code can be clarified, simplified and made more robust +just by converting it to use promises. (And the conversion process is easy.) + +Promises make for code that is clear to most developers. RxSwift, perhaps not. Take a look at this +[sign-up panel](https://github.com/ReactiveX/RxSwift/tree/master/RxExample/RxExample/Examples/GitHubSignup) +implemented in RxSwift and see what you think. (Note that this is one of RxSwift's own examples.) + +Even where PromiseKit and RxSwift are broadly similar, there are many differences in implementation: + +* RxSwift has a separate API for chain-terminating elements ("subscribers") versus interior +elements. In PromiseKit, all elements of a chain use roughly the same code pattern. + +* The RxSwift API to define an interior element of a chain (an "operator") is hair-raisingly complex. +So, RxSwift tries hard to supply every operator you might ever want to use right off the shelf. There are +hundreds. PromiseKit supplies a few utilities to help with specific scenarios, but because it's trivial +to write your own chain elements, there's no need for all this extra code in the library. + +* PromiseKit dispatches the execution of every block. RxSwift dispatches only when told to do so. Moreover, the +current dispatching state is an attribute of the chain, not the specific block, as it is in PromiseKit. +The RxSwift system is more powerful but more complex. PromiseKit is simple, predictable and safe. + +* In PromiseKit, both sides of a branched chain refer back to their shared common ancestors. In RxSwift, +branching normally creates a duplicate parallel chain that reruns the code at the head of the chain...except +when it doesn't. The rules for determining what will actually happen are complex, and given +a chain created by another chunk of code, you can't really tell what the behavior will be. + +* Because RxSwift chains don't necessarily terminate on their own, RxSwift needs you to take on some +explicit garbage collection duties to ensure that pipelines that are no longer needed are properly +deallocated. All promises yield a single value, terminate and then automatically deallocate themselves. + +You can find some additional discussion in [this ticket](https://github.com/mxcl/PromiseKit/issues/484). + +## Why can’t I return from a catch like I can in JavaScript? + +Swift demands that functions have one purpose. Thus, we have two error handlers: + +* `catch`: ends the chain and handles errors +* `recover`: attempts to recover from errors in a chain + +You want `recover`. + +## When do promises “start”? + +Often people are confused about when Promises “start”. Is it immediately? Is it +later? Is it when you call `then`? + +The answer is: The promise **body** executes during initialization of the promise, on the current thread. +As an example, `"Executing the promise body"` will be printed to the console right after the promise is created, +without having to call `then` on the promise. + +```swift +let testPromise = Promise { + print("Executing the promise body.") + return $0.fulfill(true) +} +``` + +But what about asynchronous tasks that you create in your promise's body? They behave the same way as they would +without using PromiseKit. Here's a simple example: + +```swift +let testPromise = Promise { seal in + print("Executing the promise body.") + DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { + print("Executing asyncAfter.") + return seal.fulfill(true) + } +} +``` + +The message `"Executing the promise body."` is being logged right away, but the message `"Executing asyncAfter."` +is only logged three seconds later. In this case `DispatchQueue` is responsible for deciding when to execute +the task you pass to it, PromiseKit has nothing to do with it. + +## What is a good way to use Firebase with PromiseKit + +There is no good way to use Firebase with PromiseKit. See the next question for +a more detailed rationale. + +The best option is to embed your chain in your Firebase handler: + +``` +foo.observe(.value) { snapshot in + firstly { + bar(with: snapshot) + }.then { + baz() + }.then { + baffle() + }.catch { + //… + } +} +``` + + +## I need my `then` to fire multiple times + +Then we’re afraid you cannot use PromiseKit for that event. Promises only +resolve *once*. This is the fundamental nature of promises and it is considered a +feature because it gives you guarantees about the flow of your chains. + + +## How do I change the default queues that handlers run on? + +You can change the values of `PromiseKit.conf.Q`. There are two variables that +change the default queues that the two kinds of handler run on. A typical +pattern is to change all your `then`-type handlers to run on a background queue +and to have all your “finalizers” run on the main queue: + +``` +PromiseKit.conf.Q.map = .global() +PromiseKit.conf.Q.return = .main //NOTE this is the default +``` + +Be very careful about setting either of these queues to `nil`. It has the +effect of running *immediately*, and this is not what you usually want to do in +your application. This is, however, useful when you are running specs and want +your promises to resolve immediately. (This is basically the same idea as "stubbing" +an HTTP request.) + +```swift +// in your test suite setup code +PromiseKit.conf.Q.map = nil +PromiseKit.conf.Q.return = nil +``` + +## How do I use PromiseKit on the server side? + +If your server framework requires that the main queue remain unused (e.g., Kitura), +then you must use PromiseKit 6 and you must tell PromiseKit not to dispatch to the +main queue by default. This is easy enough: + +```swift +PromiseKit.conf.Q = (map: DispatchQueue.global(), return: DispatchQueue.global()) +``` + +> Note, we recommend using your own queue rather than `.global()`, we've seen better performance this way. + +Here’s a more complete example: + +```swift +import Foundation +import HeliumLogger +import Kitura +import LoggerAPI +import PromiseKit + +HeliumLogger.use(.info) + +let pmkQ = DispatchQueue(label: "pmkQ", qos: .default, attributes: .concurrent, autoreleaseFrequency: .workItem) +PromiseKit.conf.Q = (map: pmkQ, return: pmkQ) + +let router = Router() +router.get("/") { _, response, next in + Log.info("Request received") + after(seconds: 1.0).done { + Log.info("Sending response") + response.send("OK") + next() + } +} + +Log.info("Starting server") +Kitura.addHTTPServer(onPort: 8888, with: router) +Kitura.run() +``` + +## How do I control console output? + +By default PromiseKit emits console messages when certain events occur. These events include: +- A promise or guarantee has blocked the main thread +- A promise has been deallocated without being fulfilled +- An error which occurred while fulfilling a promise was swallowed using cauterize + +You may turn off or redirect this output by setting a thread safe closure in [PMKConfiguration](https://github.com/mxcl/PromiseKit/blob/master/Sources/Configuration.swift) **before** processing any promises. For example, to turn off console output: + +```swift +conf.logHandler = { event in } +``` + +## My question was not answered + +[Please open a ticket](https://github.com/mxcl/PromiseKit/issues/new). diff --git a/Carthage/Checkouts/PromiseKit/Documentation/GettingStarted.md b/Carthage/Checkouts/PromiseKit/Documentation/GettingStarted.md new file mode 100644 index 00000000..8f6af48d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/GettingStarted.md @@ -0,0 +1,535 @@ +# `then` and `done` + +Here is a typical promise chain: + +```swift +firstly { + login() +}.then { creds in + fetch(avatar: creds.user) +}.done { image in + self.imageView = image +} +``` + +If this code used completion handlers, it would look like this: + +```swift +login { creds, error in + if let creds = creds { + fetch(avatar: creds.user) { image, error in + if let image = image { + self.imageView = image + } + } + } +} +``` + +`then` *is* just another way to structure completion handlers, but it is also quite a +bit more. At this initial stage of our understanding, it mostly helps +readability. The promise chain above is easy to scan and understand: one asynchronous +operation leads into the other, line by line. It's as close to +procedural code as we can easily come given the current state of Swift. + +`done` is the same as `then` but you cannot return a promise. It is +typically the end of the “success” part of the chain. Above, you can see that we +receive the final image in our `done` and use it to set up the UI. + +Let’s compare the signatures of the two login methods: + +```swift +func login() -> Promise + +// Compared with: + +func login(completion: (Creds?, Error?) -> Void) + // ^^ ugh. Optionals. Double optionals. +``` + +The distinction is that with promises, your functions return *promises* instead +of accepting and running callbacks. Each handler in a chain returns a promise. +`Promise` objects define the `then` method, which waits for the completion of the +promise before continuing the chain. Chains resolve procedurally, one promise +at a time. + +A `Promise` represents the future value of an asynchronous task. It has a type +that represents the type of object it wraps. For example, in the example above, +`login` is a function that returns a `Promise` that *will* represent an instance +of `Creds`. + +> *Note*: `done` is new to PromiseKit 5. We previously defined a variant of `then` that +did not require you to return a promise. Unfortunately, this convention often confused +Swift and led to odd and hard-to-debug error messages. It also made using PromiseKit +more painful. The introduction of `done` lets you type out promise chains that +compile without additional qualification to help the compiler figure out type information. + +--- + +You may notice that unlike the completion pattern, the promise chain appears to +ignore errors. This is not the case! In fact, it has the opposite effect: the promise +chain makes error handling more accessible and makes errors harder to ignore. + + +# `catch` + +With promises, errors cascade along the promise chain, ensuring that your apps are +robust and your code is clear: + +```swift +firstly { + login() +}.then { creds in + fetch(avatar: creds.user) +}.done { image in + self.imageView = image +}.catch { + // any errors in the whole chain land here +} +``` + +> Swift emits a warning if you forget to `catch` a chain. But we'll +> talk about that in more detail later. + +Each promise is an object that represents an individual, asynchronous task. +If a task fails, its promise becomes *rejected*. Chains that contain rejected +promises skip all subsequent `then`s. Instead, the next `catch` is executed. +(Strictly speaking, *all* subsequent `catch` handlers are executed.) + +For fun, let’s compare this pattern with its completion handler equivalent: + +```swift +func handle(error: Error) { + //… +} + +login { creds, error in + guard let creds = creds else { return handle(error: error!) } + fetch(avatar: creds.user) { image, error in + guard let image = image else { return handle(error: error!) } + self.imageView.image = image + } +} +``` + +The use of `guard` and a consolidated error handler help, but the promise chain’s +readability speaks for itself. + + +# `ensure` + +We have learned to compose asynchronicity. Next let’s extend our primitives: + +```swift +firstly { + UIApplication.shared.isNetworkActivityIndicatorVisible = true + return login() +}.then { + fetch(avatar: $0.user) +}.done { + self.imageView = $0 +}.ensure { + UIApplication.shared.isNetworkActivityIndicatorVisible = false +}.catch { + //… +} +``` + +No matter the outcome of your chain—-failure or success—-your `ensure` +handler is always called. + +Let’s compare this pattern with its completion handler equivalent: + +```swift +UIApplication.shared.isNetworkActivityIndicatorVisible = true + +func handle(error: Error) { + UIApplication.shared.isNetworkActivityIndicatorVisible = false + //… +} + +login { creds, error in + guard let creds = creds else { return handle(error: error!) } + fetch(avatar: creds.user) { image, error in + guard let image = image else { return handle(error: error!) } + self.imageView.image = image + UIApplication.shared.isNetworkActivityIndicatorVisible = false + } +} +``` + +It would be very easy for someone to amend this code and forget to unset +the activity indicator, leading to a bug. With promises, this type of error is +almost impossible: the Swift compiler resists your supplementing the chain without +using promises. You almost won’t need to review the pull requests. + +> *Note*: PromiseKit has perhaps capriciously switched between the names `always` +and `ensure` for this function several times in the past. Sorry about this. We suck. + +You can also use `finally` as an `ensure` that terminates the promise chain and does not return a value: + +``` +spinner(visible: true) + +firstly { + foo() +}.done { + //… +}.catch { + //… +}.finally { + self.spinner(visible: false) +} +``` + + +# `when` + +With completion handlers, reacting to multiple asynchronous operations is either +slow or hard. Slow means doing it serially: + +```swift +operation1 { result1 in + operation2 { result2 in + finish(result1, result2) + } +} +``` + +The fast (*parallel*) path code makes the code less clear: + +```swift +var result1: …! +var result2: …! +let group = DispatchGroup() +group.enter() +group.enter() +operation1 { + result1 = $0 + group.leave() +} +operation2 { + result2 = $0 + group.leave() +} +group.notify(queue: .main) { + finish(result1, result2) +} +``` + +Promises are easier: + +```swift +firstly { + when(fulfilled: operation1(), operation2()) +}.done { result1, result2 in + //… +} +``` + +`when` takes promises, waits for them to resolve and returns a promise containing the results. + +As with any promise chain, if any of the component promises fail, the chain calls the next `catch`. + + +# PromiseKit Extensions + +When we made PromiseKit, we understood that we wanted to use *only* promises to implement +asynchronous behavior. So wherever possible, we offer extensions to Apple’s APIs that reframe +the API in terms of promises. For example: + +```swift +firstly { + CLLocationManager.promise() +}.then { location in + CLGeocoder.reverseGeocode(location) +}.done { placemarks in + self.placemark.text = "\(placemarks.first)" +} +``` + +To use these extensions, you need to specify subspecs: + +```ruby +pod "PromiseKit" +pod "PromiseKit/CoreLocation" +pod "PromiseKit/MapKit" +``` + +All of these extensions are available at the [PromiseKit organization](https://github.com/PromiseKit). +Go there to see what's available and to read the source code and documentation. Every file and function +has been copiously documented. + +> We also provide extensions for common libraries such as [Alamofire](https://github.com/PromiseKit/Alamofire-). + + +# Making Promises + +The standard extensions will take you a long way, but sometimes you'll still need to start chains +of your own. Maybe you're using a third party API that doesn’t provide promises, or perhaps you wrote +your own asynchronous system. Either way, it's easy to add promises. If you look at the code of the +standard extensions, you'll see that it uses the same approach described below. + +Let’s say we have the following method: + +```swift +func fetch(completion: (String?, Error?) -> Void) +``` + +How do we convert this to a promise? Well, it's easy: + +```swift +func fetch() -> Promise { + return Promise { fetch(completion: $0.resolve) } +} +``` + +You may find the expanded version more readable: + +```swift +func fetch() -> Promise { + return Promise { seal in + fetch { result, error in + seal.resolve(result, error) + } + } +} +``` + +The `seal` object that the `Promise` initializer provides to you defines +many methods for handling garden-variety completion handlers. It even +covers a variety of rarer situations, thus making it easy for you to add +promises to an existing codebase. + +> *Note*: We tried to make it so that you could just do `Promise(fetch)`, but we +were not able to make this simpler pattern work universally without requiring +extra disambiguation for the Swift compiler. Sorry; we tried. + +> *Note*: In PMK 4, this initializer provided two parameters to your closure: +`fulfill` and `reject`. PMK 5 and 6 give you an object that has both `fulfill` and +`reject` methods, but also many variants of the method `resolve`. You can +typically just pass completion handler parameters to `resolve` and let Swift figure +out which variant to apply to your particular case (as shown in the example above). + +> *Note* `Guarantees` (below) have a slightly different initializer (since they +cannot error) so the parameter to the initializer closure is just a closure. Not +a `Resolver` object. Thus do `seal(value)` rather than `seal.fulfill(value)`. This +is because there is no variations in what guarantees can be sealed with, they can +*only* fulfill. + +# `Guarantee` + +Since PromiseKit 5, we have provided `Guarantee` as a supplementary class to +`Promise`. We do this to complement Swift’s strong error handling system. + +Guarantees *never* fail, so they cannot be rejected. A good example is `after`: + +``` +firstly { + after(seconds: 0.1) +}.done { + // there is no way to add a `catch` because after cannot fail. +} +``` + +Swift warns you if you don’t terminate a regular `Promise` chain (i.e., not +a `Guarantee` chain). You're expected to silence this warning by supplying +either a `catch` or a `return`. (In the latter case, you will then have to `catch` +at the point where you receive that promise.) + +Use `Guarantee`s wherever possible so that your code has error handling where +it's required and no error handling where it's not required. + +In general, you should be able to use `Guarantee`s and `Promise`s interchangeably, +We have gone to great lengths to try and ensure this, so please open a ticket +if you find an issue. + +--- + +If you are creating your own guarantees the syntax is simpler than that of promises; + +```swift +func fetch() -> Promise { + return Guarantee { seal in + fetch { result in + seal(result) + } + } +} +``` + +Which could be reduced to: + +```swift +func fetch() -> Promise { + return Guarantee(resolver: fetch) +} +``` + +# `map`, `compactMap`, etc. + +`then` provides you with the result of the previous promise and requires you to return +another promise. + +`map` provides you with the result of the previous promise and requires you to return +an object or value type. + +`compactMap` provides you with the result of the previous promise and requires you +to return an `Optional`. If you return `nil`, the chain fails with +`PMKError.compactMap`. + +> *Rationale*: Before PromiseKit 4, `then` handled all these cases, and it was +painful. We hoped the pain would disappear with new Swift versions. However, +it has become clear that the various pain points are here to stay. In fact, we +as library authors are expected to disambiguate at the naming level of our API. +Therefore, we have split the three main kinds of `then` into `then`, `map` and +`done`. After using these new functions, we realized this is much nicer in practice, +so we added `compactMap` as well (modeled on `Optional.compactMap`). + +`compactMap` facilitates quick composition of promise chains. For example: + +```swift +firstly { + URLSession.shared.dataTask(.promise, with: rq) +}.compactMap { + try JSONSerialization.jsonObject($0.data) as? [String] +}.done { arrayOfStrings in + //… +}.catch { error in + // Foundation.JSONError if JSON was badly formed + // PMKError.compactMap if JSON was of different type +} +``` + +> *Tip*: We also provide most of the functional methods you would expect for sequences, +e.g., `map`, `thenMap`, `compactMapValues`, `firstValue`, etc. + + +# `get` + +We provide `get` as a `done` that returns the value fed to `get`. + +```swift +firstly { + foo() +}.get { foo in + //… +}.done { foo in + // same foo! +} +``` + + +# `tap` + +We provide `tap` for debugging. It's the same as `get` but provides the +`Result` of the `Promise` so you can inspect the value of the chain at this +point without causing any side effects: + +```swift +firstly { + foo() +}.tap { + print($0) +}.done { + //… +}.catch { + //… +} +``` + + +# Supplement + +## `firstly` + +We've used `firstly` several times on this page, but what is it, really? In fact, +it is just [syntactic sugar](https://en.wikipedia.org/wiki/Syntactic_sugar). +You don’t really need it, but it helps to make your chains more readable. Instead of: + +```swift +firstly { + login() +}.then { creds in + //… +} +``` + +You could just do: + +```swift +login().then { creds in + //… +} +``` + +Here is a key understanding: `login()` returns a `Promise`, and all `Promise`s have a `then` function. `firstly` returns a `Promise`, and `then` returns a `Promise`, too! But don’t worry too much about these details. Learn the *patterns* to start with. Then, when you are ready to advance, learn the underlying architecture. + + +## `when` Variants + +`when` is one of PromiseKit’s more useful functions, and so we offer several variants. + +* The default `when`, and the one you should typically use, is `when(fulfilled:)`. This variant +waits on all its component promises, but if any fail, `when` fails too, and thus the chain *rejects*. +It's important to note that all promises in the `when` *continue*. Promises have *no* control over +the tasks they represent. Promises are just wrappers around tasks. + +* `when(resolved:)` waits even if one or more of its component promises fails. The value produced +by this variant of `when` is an array of `Result`. Consequently, this variant requires all its +component promises to have the same generic type. See our advanced patterns guide for work-arounds +for this limitation. + +* The `race` variant lets you *race* several promises. Whichever finishes first is the result. See the +advanced patterns guide for typical usage. + + +## Swift Closure Inference + +Swift automatically infers returns and return types for one-line closures. +The following two forms are the same: + +```swift +foo.then { + bar($0) +} + +// is the same as: + +foo.then { baz -> Promise in + return bar(baz) +} +``` + +Our documentation often omits the `return` for clarity. + +However, this shorthand is both a blessing and a curse. You may find that the Swift compiler +often fails to infer return types properly. See our [Troubleshooting Guide](Troubleshooting.md) if +you require further assistance. + +> By adding `done` to PromiseKit 5, we have managed to avoid many of these common +pain points in using PromiseKit and Swift. + + + +# Further Reading + +The above information is the 90% you will use. We **strongly** suggest reading the +[API Reference]. +There are numerous little +functions that may be useful to you, and the documentation for everything outlined above +is more thorough at the source. + +In Xcode, don’t forget to option-click on PromiseKit functions to access this +documentation while you're coding. + +Here are some recent articles that document PromiseKit 5+: + +* [Using Promises - Agostini.tech](https://agostini.tech/2018/10/08/using-promisekit) + +Careful with general online references, many of them refer to PMK < 5 which has a subtly +different API (sorry about that, but Swift has changed a lot over the years and thus +we had to too). + + +[API Reference]: https://mxcl.dev/PromiseKit/reference/v6/Classes/Promise.html diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Installation.md b/Carthage/Checkouts/PromiseKit/Documentation/Installation.md new file mode 100644 index 00000000..e0078ee1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Installation.md @@ -0,0 +1,222 @@ +# Xcode 8.3, 9.x or 10.x / Swift 3 or 4 + +We recommend Carthage over CocoaPods, but both installation methods are supported. + +## CocoaPods + +```ruby +use_frameworks! + +target "Change Me!" do + pod "PromiseKit", "~> 6.8" +end +``` + +If the generated Xcode project gives you a warning that PromiseKit needs to be upgraded to +Swift 4.0 or Swift 4.2, then add the following: + +```ruby +post_install do |installer| + installer.pods_project.targets.each do |target| + if target.name == 'PromiseKit' + target.build_configurations.each do |config| + config.build_settings['SWIFT_VERSION'] = '4.2' + end + end + end +end +``` + +Adjust the value for `SWIFT_VERSION` as needed. + +CocoaPods are aware of this [issue](https://github.com/CocoaPods/CocoaPods/issues/7134). + +## Carthage + +```ruby +github "mxcl/PromiseKit" ~> 6.8 +``` + +> Please note, since PromiseKit 6.8.1 our Carthage support has transitioned to +> Swift 4 and above only. Strictly we *do* still support Swift 3.1 for Carthage, +> and if you like you could edit the PromiseKit `project.pbxproj` file during +> `carthage bootstrap` to make this possible. This change was involuntary and due +> to Xcode 10.2 dropping support for Swift 3. + +From Xcode 12, you will likely need to build using `--use-xcframeworks`, eg: + + carthage build --use-xcframeworks + +## Accio + +Add the following to your Package.swift: + +```swift +.package(url: "https://github.com/mxcl/PromiseKit.git", .upToNextMajor(from: "6.8.4")), +``` + +Next, add `PromiseKit` to your App targets dependencies like so: + +```swift +.target( + name: "App", + dependencies: [ + "PromiseKit", + ] +), +``` + +Then run `accio update`. + +## SwiftPM + +```swift +package.dependencies.append( + .package(url: "https://github.com/mxcl/PromiseKit", from: "6.8.0") +) +``` + +## Manually + +You can just drop `PromiseKit.xcodeproj` into your project and then add +`PromiseKit.framework` to your app’s embedded frameworks. + + +# PromiseKit vs. Xcode + +PromiseKit contains Swift, so there have been rev-lock issues with Xcode: + +| PromiseKit | Swift | Xcode | CI Status | Release Notes | +| ---------- | ----------------------- | -------- | ------------ | ----------------- | +| 6 | 3.2, 3.3, 4.x, 5.x | 8.3, 9.x, 10.x | ![ci-master] | [2018/02][news-6] | +| 5 | 3.1, 3.2, 3.3, 4.x | 8.3, 9.x, 10.1 | *Deprecated* | *n/a* | +| 4 | 3.0, 3.1, 3.2, 3.3, 4.x | 8.x, 9.x, 10.1 | ![ci-master] | [2016/09][news-4] | +| 3 | 2.x | 7.x, 8.0 | ![ci-swift2] | [2015/10][news-3] | +| 2 | 1.x | 7.x | *Deprecated* | [2015/10][news-3] | +| 1† | *N/A* | * | ![ci-legacy] | – | + +† PromiseKit 1 is pure Objective-C and thus can be used with any Xcode, it is +also your only choice if you need to support iOS 7 or below. + +--- + +We also maintain a series of branches to aid migration for PromiseKit 2: + +| Xcode | Swift | PromiseKit | Branch | CI Status | +| ----- | ----- | -----------| --------------------------- | --------- | +| 8.0 | 2.3 | 2 | [swift-2.3-minimal-changes] | ![ci-23] | +| 7.3 | 2.2 | 2 | [swift-2.2-minimal-changes] | ![ci-22] | +| 7.2 | 2.2 | 2 | [swift-2.2-minimal-changes] | ![ci-22] | +| 7.1 | 2.1 | 2 | [swift-2.0-minimal-changes] | ![ci-20] | +| 7.0 | 2.0 | 2 | [swift-2.0-minimal-changes] | ![ci-20] | + +We do **not** usually backport fixes to these branches, but pull requests are welcome. + + +## Xcode 8 / Swift 2.3 or Xcode 7 + +```ruby +# CocoaPods +swift_version = "2.3" +pod "PromiseKit", "~> 3.5" + +# Carthage +github "mxcl/PromiseKit" ~> 3.5 +``` + + +[travis]: https://travis-ci.org/mxcl/PromiseKit +[ci-master]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=master +[ci-legacy]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=legacy-1.x +[ci-swift2]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=swift-2.x +[ci-23]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=swift-2.3-minimal-changes +[ci-22]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=swift-2.2-minimal-changes +[ci-20]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=swift-2.0-minimal-changes +[news-2]: http://mxcl.dev/PromiseKit/news/2015/05/PromiseKit-2.0-Released/ +[news-3]: https://github.com/mxcl/PromiseKit/blob/212f31f41864d1e3ec54f5dd529bd8e1e5697024/CHANGELOG.markdown#300-oct-1st-2015 +[news-4]: http://mxcl.dev/PromiseKit/news/2016/09/PromiseKit-4.0-Released/ +[news-6]: http://mxcl.dev/PromiseKit/news/2018/02/PromiseKit-6.0-Released/ +[swift-2.3-minimal-changes]: https://github.com/mxcl/PromiseKit/tree/swift-2.3-minimal-changes +[swift-2.2-minimal-changes]: https://github.com/mxcl/PromiseKit/tree/swift-2.2-minimal-changes +[swift-2.0-minimal-changes]: https://github.com/mxcl/PromiseKit/tree/swift-2.0-minimal-changes + + +# Using Git Submodules for PromiseKit’s Extensions + +> *Note*: This is a more advanced technique. + +If you use CocoaPods and a few PromiseKit extensions, then importing PromiseKit +causes that module to import all the extension frameworks. Thus, if you have an +app and a few app extensions (e.g., iOS app, iOS watch extension, iOS Today +extension) then all your final products that use PromiseKit will have forced +dependencies on all the Apple frameworks that PromiseKit provides extensions +for. + +This isn’t that bad, but every framework that loads entails overhead and +lengthens startup time. + +It’s both better and worse with Carthage. We build individual micro-frameworks +for each PromiseKit extension, so your final products link +against only the Apple frameworks that they actually need. However, Apple has +advised that apps link only against “about 12” frameworks for performance +reasons. So with Carthage, we are worse off on this metric. + +The solution is to instead import only CorePromise: + +```ruby +# CocoaPods +pod "PromiseKit/CorePromise" + +# Carthage +github "mxcl/PromiseKit" +# ^^ for Carthage *only* have this +``` + +And to use the extensions you need via `git submodules`: + +``` +git submodule init +git submodule add https://github.com/PromiseKit/UIKit Submodules/PMKUIKit +``` + +Then in Xcode you can add these sources to your targets on a per-target basis. + +Then when you `pod update`, ensure that you also update your submodules: + + pod update && git submodule update --recursive --remote + + + +# Release History + +## [6.0](https://github.com/mxcl/PromiseKit/releases/tag/6.0.0) Feb 13th, 2018 + +* [PromiseKit 6 announcement post][news-6]. + +## [4.0](https://github.com/mxcl/PromiseKit/releases/tag/4.0.0) + +* [PromiseKit 4 announcement post][news-4]. + +## [3.0](https://github.com/mxcl/PromiseKit/releases/tag/3.0.0) Oct 1st, 2015 + +In Swift 2.0 `catch` and `defer` became reserved keywords mandating we rename +our functions with these names. This forced a major semantic version change on +PromiseKit and thus we took the opportunity to make other minor (source +compatibility breaking) improvements. + +Thus if you cannot afford to adapt to PromiseKit 3 but still want to use +Xcode-7.0/Swift-2.0 we provide a [minimal changes branch] where `catch` and +`defer` are renamed `catch_` and `defer_` and all other changes are the bare +minimum to make PromiseKit 2 compile against Swift 2. + +If you still are using Xcode 6 and Swift 1.2 then use PromiseKit 2. + +[minimal changes branch]: https://github.com/mxcl/PromiseKit/tree/swift-2.0-minimal-changes + +## [2.0](https://github.com/mxcl/PromiseKit/releases/tag/2.0.0) May 14th, 2015 + +[PromiseKit 2 announcement post](http://mxcl.dev/PromiseKit/news/2015/05/PromiseKit-2.0-Released/). + +## [1.5](https://github.com/mxcl/PromiseKit/releases/tag/1.5.0) + +Swift 1.2 support. Xcode 6.3 required. diff --git a/Carthage/Checkouts/PromiseKit/Documentation/ObjectiveC.md b/Carthage/Checkouts/PromiseKit/Documentation/ObjectiveC.md new file mode 100644 index 00000000..5d8c6827 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/ObjectiveC.md @@ -0,0 +1,219 @@ +# Objective-C + +PromiseKit has two promise classes: + +* `Promise` (Swift) +* `AnyPromise` (Objective-C) + +Each is designed to be an appropriate promise implementation for the strong points of its language: + +* `Promise` is strict, defined and precise. +* `AnyPromise` is loose and dynamic. + +Unlike most libraries, we have extensive bridging support, you can use PromiseKit +in mixed projects with mixed language targets and mixed language libraries. + + +# Using PromiseKit with Objective-C + +`AnyPromise` is our promise class for Objective-C. It behaves almost identically to `Promise`, our Swift promise class. + +```objc +myPromise.then(^(NSString *bar){ + return anotherPromise; +}).then(^{ + //… +}).catch(^(NSError *error){ + //… +}); +``` + +You make new promises using `promiseWithResolverBlock`: + +```objc +- (AnyPromise *)myPromise { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve){ + resolve(foo); // if foo is an NSError, rejects, else, resolves + }]; +} +``` + +--- + +You reject promises by throwing errors: + +```objc +myPromise.then(^{ + @throw [NSError errorWithDomain:domain code:code userInfo:nil]; +}).catch(^(NSError *error){ + //… +}); +``` + +One important feature is the syntactic flexibility of your handlers: + +```objc +myPromise.then(^{ + // no parameters is fine +}); + +myPromise.then(^(id foo){ + // one parameter is fine +}); + +myPromise.then(^(id a, id b, id c){ + // up to three parameter is fine, no crash! +}); + +myPromise.then(^{ + return @1; // return anything or nothing, it's fine, no crash +}); +``` + +We do runtime inspection of the block you pass to achieve this magic. + +--- + +Another important distinction is that the equivalent function to Swift’s `recover` is combined with `AnyPromise`’s `catch`. This is typical to other “dynamic” promise implementations and thus achieves our goal that `AnyPromise` is loose and dynamic while `Promise` is strict and specific. + +A sometimes unexpected consequence of this fact is that returning nothing from a `catch` *resolves* the returned promise: + +```objc +myPromise.catch(^{ + [UIAlertView …]; +}).then(^{ + // always executes! +}); +``` + +--- + +Another important distinction is that the `value` property returns even if the promise is rejected; in that case, it returns the `NSError` object with which the promise was rejected. + + +# Bridging Between Objective-C & Swift + +Let’s say you have: + +```objc +@interface Foo +- (AnyPromise *)myPromise; +@end +``` + +Ensure that this interface is included in your bridging header. You can now use the +following pattern in your Swift code: + +```swift +let foo = Foo() +foo.myPromise.then { (obj: AnyObject?) -> Int in + // it is not necessary to specify the type of `obj` + // we just do that for demonstrative purposes +} +``` + +--- + +Let’s say you have: + +```swift +@objc class Foo: NSObject { + func stringPromise() -> Promise + func barPromise() -> Promise +} + +@objc class Bar: NSObject { /*…*/ } +``` + +Ensure that your project is generating a `…-Swift.h` header so that Objective-C can see your Swift code. + +If you built this project and opened the `…-Swift.h` header, you would only see this: + +```objc +@interface Foo +@end + +@interface Bar +@end +``` + +That's because Objective-C cannot import Swift objects that are generic. So we need to write some stubs: + +```swift +@objc class Foo: NSObject { + @objc func stringPromise() -> AnyPromise { + return AnyPromise(stringPromise()) + } + @objc func barPromise() -> AnyPromise { + return AnyPromise(barPromise()) + } +} +``` + +If we built this and opened our generated header, we would now see: + +```objc +@interface Foo +- (AnyPromise *)stringPromise; +- (AnyPromise *)barPromise; +@end + +@interface Bar +@end +``` + +Perfect. + +Note that AnyPromise can only bridge objects that conform to `AnyObject` or derive from `NSObject`. This is a limitation of Objective-C. + +# Using ObjC AnyPromises from Swift + +Simply use them, the type of your handler parameter is `Any`: + +```objective-c +- (AnyPromise *)fetchThings { + return [AnyPromise promiseWithValue:@[@"a", @"b", @"c"]]; +} +``` + +Since ObjC is not type-safe and Swift is, you will (probably) need to cast the `Any` to whatever it is you actually are feeding: + +```swift +Foo.fetchThings().done { any in + let bar = any as! [String] +} +``` + +## :warning: Caution: + +ARC in Objective-C, unlike in Objective-C++, is not exception-safe by default. +So, throwing an error will result in keeping a strong reference to the closure +that contains the throw statement. +This pattern will consequently result in memory leaks if you're not careful. + +> *Note:* Only having a strong reference to the closure would result in memory leaks. +> In our case, PromiseKit automatically keeps a strong reference to the closure until it's released. + +__Workarounds:__ + +1. Return a Promise with value NSError\ +Instead of throwing a normal error, you can return a Promise with value NSError instead. + +```objc +myPromise.then(^{ + return [AnyPromise promiseWithValue:[NSError myCustomError]]; +}).catch(^(NSError *error){ + if ([error isEqual:[NSError myCustomError]]) { + // In case, same error as the one we thrown + return; + } + //… +}); +``` +2. Enable ARC for exceptions in Objective-C (not recommended)\ +You can add this ```-fobjc-arc-exceptions to your``` to your compiler flags to enable ARC for exceptions. +This is not recommended unless you've read the Apple documentation and are comfortable with the caveats. + +For more details on ARC and exceptions: +https://clang.llvm.org/docs/AutomaticReferenceCounting.html#exceptions + diff --git a/Carthage/Checkouts/PromiseKit/Documentation/README.md b/Carthage/Checkouts/PromiseKit/Documentation/README.md new file mode 100644 index 00000000..a03f4aa4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/README.md @@ -0,0 +1,14 @@ +# Contents + +* [README](../README.md) +* Handbook + * [Getting Started](GettingStarted.md) + * [Promises: Common Patterns](CommonPatterns.md) + * [Frequently Asked Questions](FAQ.md) +* Manual + * [Installation Guide](Installation.md) + * [Objective-C Guide](ObjectiveC.md) + * [Troubleshooting](Troubleshooting.md) + * [Appendix](Appendix.md) +* [Examples](Examples) +* [API Reference](https://mxcl.dev/PromiseKit/reference/v6/Classes/Promise.html) diff --git a/Carthage/Checkouts/PromiseKit/Documentation/Troubleshooting.md b/Carthage/Checkouts/PromiseKit/Documentation/Troubleshooting.md new file mode 100644 index 00000000..cb27a12d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Documentation/Troubleshooting.md @@ -0,0 +1,304 @@ +# Troubleshooting + +## Compilation errors + +99% of compilation issues involving PromiseKit can be addressed or diagnosed by one of the fixes below. + +### Check your handler + +```swift +return firstly { + URLSession.shared.dataTask(.promise, with: url) +}.compactMap { + JSONSerialization.jsonObject(with: $0.data) as? [String: Any] +}.then { dict in + User(dict: dict) +} +``` + +Swift (unhelpfully) says: + +> Cannot convert value of type '([String : Any]) -> User' to expected argument type '([String : Any]) -> _' + +What’s the real problem? `then` *must* return a `Promise`, and you're trying to return something else. What you really want is `map`: + +```swift +return firstly { + URLSession.shared.dataTask(.promise, with: url) +}.compactMap { + JSONSerialization.jsonObject(with: $0.data) as? [String: Any] +}.map { dict in + User(dict: dict) +} +``` + +### Specify closure parameters **and** return type + +For example: + +```swift +return firstly { + foo() +}.then { user in + //… + return bar() +} +``` + +This code may compile if you specify the type of `user`: + + +```swift +return firstly { + foo() +}.then { (user: User) in + //… + return bar() +} +``` + +If it still doesn't compile, perhaps you need to specify the return type, too: + +```swift +return firstly { + foo() +}.then { (user: User) -> Promise in + //… + return bar() +} +``` + +We have made great effort to reduce the need for explicit typing in PromiseKit 6, +but as with all Swift functions that return a generic type (e.g., `Array.map`), +you may need to explicitly tell Swift what a closure returns if the closure's body is +longer than one line. + +> *Tip*: Sometimes you can force a one-liner by using semicolons. + + +### Acknowledge all incoming closure parameters + +Swift does not permit you to silently ignore a closure's parameters. For example, this code: + +```swift +func _() -> Promise { + return firstly { + proc.launch(.promise) // proc: Foundation.Process + }.then { + when(fulfilled: p1, p2) // both p1 & p2 are `Promise` + } +} +``` + +Fails to compile with the error: + + Cannot invoke 'then' with an argument list of type '(() -> _) + +What's the problem? Well, `Process.launch(.promise)` returns +`Promise<(String, String)>`, and we are ignoring this value in our `then` closure. +If we’d referenced `$0` or named the parameter, Swift would have been satisfied. + +Assuming that we really do want to ignore the argument, the fix is to explicitly +acknowledge its existence by assigning it the name "_". That's Swift-ese for "I +know there's a value here, but I'm ignoring it." + + +```swift +func _() -> Promise { + return firstly { + proc.launch(.promise) + }.then { _ in + when(fulfilled: p1, p2) + } +} +``` + +In this situation, you won't always receive an error message that's as clear as the +one shown above. Sometimes, a missing closure parameter sends Swift scurrying off +into type inference limbo. When it finally concludes that there's no way for it to make +all the inferred types work together, it may end up assigning blame to some other +closure entirely and giving you an error message that makes no sense at all. + +When faced with this kind of enigmatic complaint, a good rule of thumb is to +double-check your argument and return types carefully. If everything looks OK, +temporarily add explicit type information as shown above, just to rule +out misinference as a possible cause. + +### Try moving code to a temporary inline function + +Try taking the code out of a closure and putting it in a standalone function. Now Swift +will give you the *real* error message. For example: + +```swift +func doStuff() { + firstly { + foo() + }.then { + let bar = bar() + let baz = baz() + when(fulfilled: bar, baz) + } +} +``` + +Becomes: + +```swift +func doStuff() { + func fluff() -> Promise<…> { + let bar = bar() + let baz = baz() + when(fulfilled: bar, baz) + } + + firstly { + foo() + }.then { + fluff() + } +} +``` + +An *inline* function like this is all you need. Here, the problem is that you +forgot to mark the last line of the closure with an explicit `return`. It's required +here because the closure is longer than one line. + + +## You copied code off the Internet that doesn’t work + +Swift has changed a lot over the years and so PromiseKit has had to change to keep +up. The code you copied is probably for an older PromiseKit. *Read the definitions of the +functions.* It's easy to do this in Xcode by option-clicking or command-clicking function names. +All PromiseKit functions are documented and provide examples. + +## "Context type for closure argument expects 1 argument, which cannot be implicitly ignored" + +You have a `then`; you want a `done`. + +## "Missing argument for parameter #1 in call" + +This is part of Swift 4’s “tuplegate”. + +You must specify your `Void` parameter: + +```swift +seal.fulfill(()) +``` + +Yes: we hope they revert this change in Swift 5 too. + +## "Ambiguous reference to 'firstly(execute:)'" + +Remove the firstly, e.g.: + +```swift +firstly { + foo() +}.then { + //… +} +``` + +becomes: + +```swift +foo().then { + //… +} +``` + +Rebuild and Swift should now tell you the *real* error. + +## Other issues + +### `Pending Promise Deallocated!` + +If you see this warning, you have a path in your `Promise` initializer that allows +the promise to escape without being sealed: + +```swift +Promise { seal in + task { value, error in + if let value = value as? String { + seal.fulfill(value) + } else if let error = error { + seal.reject(error) + } + } +} +``` + +There are two missing paths here, and if either occurs, the promise will soon be +deallocated without resolving. This will manifest itself as a bug in your app, +probably the awful infinite spinner. + +So let’s be thorough: + +```swift +Promise { seal in + task { value, error in + if let value = value as? String { + fulfill(value) + } else if let error = error { + reject(error) + } else if value != nil { + reject(MyError.valueNotString) + } else { + // should never happen, but we have an `PMKError` for task being called with `nil`, `nil` + reject(PMKError.invalidCallingConvention) + } + } +} +``` + +If this seems tedious, it shouldn’t. You would have to be this thorough without promises, too. +The difference is that without promises, you wouldn’t get a warning in the console notifying +you of your mistake! + +### Slow compilation / compiler cannot solve in reasonable time + +Add return types to your closures. + +### My promise never resolves + +There are several potential causes: + +#### 1. Check to be sure that your asynchronous task even *starts* + +You’d be surprised how often this is the cause. + +For example, if you are using `URLSession` without our extension (but +don’t do that; *use* our extension! we know all the pitfalls), did you forget +to call `resume` on the task? If so, the task never actually starts, and so of +course it never finishes, either. + +#### 2. Check that all paths in your custom Promise initializers are handled + +See “Pending Promise Deallocated” above. Usually you will see this warning if +you are not handling a path, but that requires your promise deallocate, so you +may not see this warning yet you are still not handling all paths. + +Unhandled paths mean the promise will not resolve. + +#### 3. Ensure the queue your promise handler runs upon is not blocked + +If the thread is blocked the handlers cannot execute. Commonly you can see this +if you are using our `wait()` function. Please read the documentation for `wait()` +for suggestions and caveats. + +#### 4. Your promise returned a cancellation error + +Cancelation is neither success nor failure. So this is the correct behavior. +Use a `finally` if you need to do some clean up. + +### `Result of call to 'done(on:_:)' is unused`, `Result of call to 'then(on:_:)' is unused` + +PromiseKit deliberately avoids the `@discardableResult` annotation because the +unused result warning is a hint that you have not handled the error in your +chain. So do one of these: + +1. Add a `catch` +2. `return` the promise (thus punting the error handling to the caller) +3. Use `cauterize()` to silence the warning. + +Obviously, do 1 or 2 in preference to 3. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.gitignore new file mode 100644 index 00000000..30f50040 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.travis.yml new file mode 100644 index 00000000..a76fb3b8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/.travis.yml @@ -0,0 +1,78 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: cocoapods + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/AVFoundation/Sources + cp -R ../../../Sources Extensions/AVFoundation + pod lib lint --subspec=PromiseKit/AVFoundation --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - stage: test + name: iOS Tests + xcode_scheme: PMKAVFoundation + xcode_project: PMKAVFoundation.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.pbxproj new file mode 100644 index 00000000..64b1f535 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.pbxproj @@ -0,0 +1,456 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKAVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAVFoundation.framework */; }; + 63DD7EF81D7E7411000F279D /* TestAVFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 63DD7EF61D7E7411000F279D /* TestAVFoundation.m */; }; + 63DD7EF91D7E7411000F279D /* TestAVFoundation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DD7EF71D7E7411000F279D /* TestAVFoundation.swift */; }; + 63DD7EFD1D7E7419000F279D /* AVAudioSession+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63DD7EFA1D7E7419000F279D /* AVAudioSession+AnyPromise.h */; }; + 63DD7EFE1D7E7419000F279D /* AVAudioSession+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63DD7EFB1D7E7419000F279D /* AVAudioSession+AnyPromise.m */; }; + 63DD7EFF1D7E7419000F279D /* AVAudioSession+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DD7EFC1D7E7419000F279D /* AVAudioSession+Promise.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63167B891D5C23B4007A96B0 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKAVFoundation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKAVFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKAVTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKAVTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63DD7EF61D7E7411000F279D /* TestAVFoundation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestAVFoundation.m; path = Tests/TestAVFoundation.m; sourceTree = SOURCE_ROOT; }; + 63DD7EF71D7E7411000F279D /* TestAVFoundation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestAVFoundation.swift; path = Tests/TestAVFoundation.swift; sourceTree = SOURCE_ROOT; }; + 63DD7EFA1D7E7419000F279D /* AVAudioSession+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "AVAudioSession+AnyPromise.h"; path = "Sources/AVAudioSession+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63DD7EFB1D7E7419000F279D /* AVAudioSession+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "AVAudioSession+AnyPromise.m"; path = "Sources/AVAudioSession+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63DD7EFC1D7E7419000F279D /* AVAudioSession+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "AVAudioSession+Promise.swift"; path = "Sources/AVAudioSession+Promise.swift"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKAVFoundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63167B891D5C23B4007A96B0 /* Cartfile */, + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */, + 63C700091D5C0253003BAE60 /* Info.plist */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKAVFoundation.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKAVTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63DD7EFA1D7E7419000F279D /* AVAudioSession+AnyPromise.h */, + 63DD7EFB1D7E7419000F279D /* AVAudioSession+AnyPromise.m */, + 63DD7EFC1D7E7419000F279D /* AVAudioSession+Promise.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63DD7EF61D7E7411000F279D /* TestAVFoundation.m */, + 63DD7EF71D7E7411000F279D /* TestAVFoundation.swift */, + ); + path = Tests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63DD7EFD1D7E7419000F279D /* AVAudioSession+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKAVFoundation */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAVFoundation" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKAVFoundation; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKAVFoundation.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKAVTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKAVTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 638F9B161D5EEEDC00717B37 /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKAVTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKAVTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAVFoundation" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKAVFoundation */, + 63C7FFF11D5C020D003BAE60 /* PMKAVTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 638F9B161D5EEEDC00717B37 /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63DD7EFF1D7E7419000F279D /* AVAudioSession+Promise.swift in Sources */, + 63DD7EFE1D7E7419000F279D /* AVAudioSession+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63DD7EF81D7E7411000F279D /* TestAVFoundation.m in Sources */, + 63DD7EF91D7E7411000F279D /* TestAVFoundation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKAVFoundation */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Accounts; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Accounts; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAVFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAVFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKAVTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..ecdffaeb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/xcshareddata/xcschemes/PMKAVFoundation.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/xcshareddata/xcschemes/PMKAVFoundation.xcscheme new file mode 100644 index 00000000..6c27ca1b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/PMKAVFoundation.xcodeproj/xcshareddata/xcschemes/PMKAVFoundation.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/README.markdown new file mode 100644 index 00000000..35c2f001 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit AVFoundation Extensions ![Build Status] + +This project adds promises to Apple’s AVFoundation framework. + +## CococaPods + +```ruby +pod "PromiseKit/AVFoundation" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/AVFoundation" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKAVFoundation +``` + +```objc +// objc +@import PromiseKit; +@import PMKAVFoundation; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/AVFoundation.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.h new file mode 100644 index 00000000..54a95361 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.h @@ -0,0 +1,30 @@ +// +// AVFoundation+AnyPromise.h +// +// Created by Matthew Loseke on 6/21/14. +// + +#import +#import + +/** + To import the `AVAudioSession` category: + + use_frameworks! + pod "PromiseKit/AVFoundation" + + And then in your sources: + + #import +*/ +@interface AVAudioSession (PromiseKit) + +/** + Wraps `-requestRecordPermission:`, thens the `BOOL granted` parameter + passed to the wrapped completion block. This promise cannot fail. + + @see requestRecordPermission: +*/ +- (AnyPromise *)requestRecordPermission; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.m new file mode 100644 index 00000000..3de824c3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+AnyPromise.m @@ -0,0 +1,21 @@ +// +// AVAudioSession+PromiseKit.m +// +// Created by Matthew Loseke on 6/21/14. +// + +#import "AVAudioSession+AnyPromise.h" +#import + + +@implementation AVAudioSession (PromiseKit) + +- (AnyPromise *)requestRecordPermission { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { + resolve(@(granted)); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+Promise.swift new file mode 100644 index 00000000..742176b0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Sources/AVAudioSession+Promise.swift @@ -0,0 +1,21 @@ +import AVFoundation +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `AVAudioSession` category: + + use_frameworks! + pod "PromiseKit/AVFoundation" + + And then in your sources: + + import PromiseKit +*/ +extension AVAudioSession { + public func requestRecordPermission() -> Guarantee { + return Guarantee(resolver: requestRecordPermission) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.m b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.m new file mode 100644 index 00000000..19eae79f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.m @@ -0,0 +1,17 @@ +#import "AVAudioSession+AnyPromise.h" +@import AVFoundation; +@import XCTest; + +@implementation Test_AVAudioSession_ObjC: XCTestCase + +- (void)test { + id ex = [self expectationWithDescription:@""]; + + [[AVAudioSession new] requestRecordPermission].then(^{ + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.swift b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.swift new file mode 100644 index 00000000..0d777b3f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AVFoundation/Tests/TestAVFoundation.swift @@ -0,0 +1,24 @@ +import PMKAVFoundation +import AVFoundation +import PromiseKit +import XCTest + +class Test_AVAudioSession_Swift: XCTestCase { + func test() { + let ex = expectation(description: "") + + AVAudioSession().requestRecordPermission().done { _ in + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testNotAmbiguous() { + let ex = expectation(description: "") + AVAudioSession().requestRecordPermission { _ in + ex.fulfill() + } + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.travis.yml new file mode 100644 index 00000000..44b35745 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/.travis.yml @@ -0,0 +1,84 @@ +osx_image: xcode10.2 +language: swift +os: osx + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: cocoapods + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Accounts/Sources + cp -R ../../../Sources Extensions/Accounts + pod lib lint --subspec=PromiseKit/Accounts --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS,macOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + name: macOS Tests + xcode_scheme: PMKAccounts + xcode_project: PMKAccounts.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + name: iOS Tests diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.pbxproj new file mode 100644 index 00000000..63f5f436 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.pbxproj @@ -0,0 +1,448 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63167B841D5C2332007A96B0 /* ACAccountStore+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63167B811D5C2332007A96B0 /* ACAccountStore+AnyPromise.h */; }; + 63167B851D5C2332007A96B0 /* ACAccountStore+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63167B821D5C2332007A96B0 /* ACAccountStore+AnyPromise.m */; }; + 63167B861D5C2332007A96B0 /* ACAccountStore+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63167B831D5C2332007A96B0 /* ACAccountStore+Promise.swift */; }; + 63167B881D5C233C007A96B0 /* TestAccounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63167B871D5C233C007A96B0 /* TestAccounts.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKAccounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAccounts.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63167B811D5C2332007A96B0 /* ACAccountStore+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ACAccountStore+AnyPromise.h"; path = "Sources/ACAccountStore+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63167B821D5C2332007A96B0 /* ACAccountStore+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "ACAccountStore+AnyPromise.m"; path = "Sources/ACAccountStore+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63167B831D5C2332007A96B0 /* ACAccountStore+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "ACAccountStore+Promise.swift"; path = "Sources/ACAccountStore+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63167B871D5C233C007A96B0 /* TestAccounts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestAccounts.swift; path = Tests/TestAccounts.swift; sourceTree = SOURCE_ROOT; }; + 63167B891D5C23B4007A96B0 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKAccounts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKAccounts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKACTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKACTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKAccounts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63167B891D5C23B4007A96B0 /* Cartfile */, + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */, + 63C700091D5C0253003BAE60 /* Info.plist */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKAccounts.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKACTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63167B811D5C2332007A96B0 /* ACAccountStore+AnyPromise.h */, + 63167B821D5C2332007A96B0 /* ACAccountStore+AnyPromise.m */, + 63167B831D5C2332007A96B0 /* ACAccountStore+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63167B871D5C233C007A96B0 /* TestAccounts.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63167B841D5C2332007A96B0 /* ACAccountStore+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKAccounts */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAccounts" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKAccounts; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKAccounts.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKACTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKACTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 638F9B161D5EEEDC00717B37 /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKACTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKACTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAccounts" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKAccounts */, + 63C7FFF11D5C020D003BAE60 /* PMKACTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 638F9B161D5EEEDC00717B37 /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63167B851D5C2332007A96B0 /* ACAccountStore+AnyPromise.m in Sources */, + 63167B861D5C2332007A96B0 /* ACAccountStore+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63167B881D5C233C007A96B0 /* TestAccounts.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKAccounts */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Accounts; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Accounts; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAccounts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAccounts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKACTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/xcshareddata/xcschemes/PMKAccounts.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/xcshareddata/xcschemes/PMKAccounts.xcscheme new file mode 100644 index 00000000..7ca34a8d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/PMKAccounts.xcodeproj/xcshareddata/xcschemes/PMKAccounts.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/README.markdown new file mode 100644 index 00000000..af9bcde1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit Accounts Extensions ![Build Status] + +This project adds promises to Apple’s Accounts framework. + +## CococaPods + +```ruby +pod "PromiseKit/Accounts" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/Accounts" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKAccounts +``` + +```objc +// objc +@import PromiseKit; +@import PMKAccounts; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/Accounts.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.h new file mode 100644 index 00000000..b7353ae7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.h @@ -0,0 +1,66 @@ +// +// Created by merowing on 09/05/2014. +// +// +// + +#import +#import + +/** + To import the `ACAccountStore` category: + + use_frameworks! + pod "PromiseKit/Accounts" + + And then in your sources: + + @import PromiseKit; +*/ +@interface ACAccountStore (PromiseKit) + +/** + Obtains permission to access protected user properties. + + @param type The account type. + + @param options Can be nil. + + @return A promise that resolves when the requested permissions have been + successfully obtained. The promise thens all accounts of the specified + type. + + @see requestAccessToAccountsWithType:options:completion: +*/ +- (AnyPromise *)requestAccessToAccountsWithType:(ACAccountType *)type options:(NSDictionary *)options NS_REFINED_FOR_SWIFT; + +/** + Renews account credentials when the credentials are no longer valid. + + @param account The account to renew credentials. + + @return A promise that thens the `ACAccountCredentialRenewResult`. +*/ +- (AnyPromise *)renewCredentialsForAccount:(ACAccount *)account NS_REFINED_FOR_SWIFT; + +/** + Saves an account to the Accounts database. + + @param account The account to save. + + @return A promise that resolves when the account has been successfully + saved. +*/ +- (AnyPromise *)saveAccount:(ACAccount *)account NS_REFINED_FOR_SWIFT; + +/** + Removes an account from the account store. + + @param account The account to remove. + + @return A promise that resolves when the account has been successfully + removed. +*/ +- (AnyPromise *)removeAccount:(ACAccount *)account NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.m new file mode 100644 index 00000000..30f987a8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+AnyPromise.m @@ -0,0 +1,48 @@ +#import "ACAccountStore+AnyPromise.h" +#import + + +@implementation ACAccountStore (PromiseKit) + +- (AnyPromise *)requestAccessToAccountsWithType:(ACAccountType *)type options:(NSDictionary *)options { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self requestAccessToAccountsWithType:type options:options completion:^(BOOL granted, NSError *error) { + if (granted) { + resolve([self accountsWithAccountType:type]); + } else if (error) { + resolve(error); + } else { + error = [NSError errorWithDomain:PMKErrorDomain code:PMKAccessDeniedError userInfo:@{ + NSLocalizedDescriptionKey: @"Access to the requested social service has been denied. Please enable access in your device settings." + }]; + resolve(error); + } + }]; + }]; +} + +- (AnyPromise *)renewCredentialsForAccount:(ACAccount *)account { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { + resolve(error ?: @(renewResult)); + }]; + }]; +} + +- (AnyPromise *)saveAccount:(ACAccount *)account { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self saveAccount:account withCompletionHandler:^(BOOL success, NSError *error) { + resolve(error); + }]; + }]; +} + +- (AnyPromise *)removeAccount:(ACAccount *)account { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self removeAccount:account withCompletionHandler:^(BOOL success, NSError *error) { + resolve(error); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+Promise.swift new file mode 100644 index 00000000..1789f84c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Sources/ACAccountStore+Promise.swift @@ -0,0 +1,59 @@ +import Accounts +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `ACAccountStore` category: + + use_frameworks! + pod "PromiseKit/ACAccountStore" + + And then in your sources: + + import PromiseKit +*/ +extension ACAccountStore { + /// Renews account credentials when the credentials are no longer valid. + public func renewCredentials(for account: ACAccount) -> Promise { + return Promise { renewCredentials(for: account, completion: $0.resolve) } + } + + /// Obtains permission to access protected user properties. + public func requestAccessToAccounts(with type: ACAccountType, options: [AnyHashable: Any]? = nil) -> Promise { + return Promise { seal in + requestAccessToAccounts(with: type, options: options, completion: { granted, error in + if granted { + seal.fulfill(()) + } else if let error = error { + seal.reject(error) + } else { + seal.reject(PMKError.accessDenied) + } + }) + } + } + + /// Saves an account to the Accounts database. + public func saveAccount(_ account: ACAccount) -> Promise { + return Promise { saveAccount(account, withCompletionHandler: $0.resolve) }.asVoid() + } + + /// Removes an account from the account store. + public func removeAccount(_ account: ACAccount) -> Promise { + return Promise { removeAccount(account, withCompletionHandler: $0.resolve) }.asVoid() + } + + /// PromiseKit ACAccountStore errors + public enum PMKError: Error, CustomStringConvertible { + /// The request for accounts access was denied. + case accessDenied + + public var description: String { + switch self { + case .accessDenied: + return "Access to the requested social service has been denied. Please enable access in your device settings." + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Tests/TestAccounts.swift b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Tests/TestAccounts.swift new file mode 100644 index 00000000..5a6591ee --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Accounts/Tests/TestAccounts.swift @@ -0,0 +1,80 @@ +import PMKAccounts +import PromiseKit +import Accounts +import XCTest + +class Test_ACAccountStore_Swift: XCTestCase { + var dummy: ACAccount { return ACAccount() } + + func test_renewCredentialsForAccount() { + let ex = expectation(description: "") + + class MockAccountStore: ACAccountStore { + override func renewCredentials(for account: ACAccount!, completion: ACAccountStoreCredentialRenewalHandler!) { + completion(.renewed, nil) + } + } + + MockAccountStore().renewCredentials(for: dummy).done { result in + XCTAssertEqual(result, ACAccountCredentialRenewResult.renewed) + ex.fulfill() + }.catch { + XCTFail("\($0)") + } + + waitForExpectations(timeout: 1) + } + + func test_requestAccessToAccountsWithType() { + class MockAccountStore: ACAccountStore { + override func requestAccessToAccounts(with accountType: ACAccountType!, options: [AnyHashable : Any]! = [:], completion: ACAccountStoreRequestAccessCompletionHandler!) { + completion(true, nil) + } + } + + let ex = expectation(description: "") + let store = MockAccountStore() + let type = store.accountType(withAccountTypeIdentifier: ACAccountTypeIdentifierFacebook)! + store.requestAccessToAccounts(with: type).done { _ in + ex.fulfill() + }.catch { + XCTFail("\($0)") + } + + waitForExpectations(timeout: 1) + } + + func test_saveAccount() { + class MockAccountStore: ACAccountStore { + override func saveAccount(_ account: ACAccount!, withCompletionHandler completionHandler: ACAccountStoreSaveCompletionHandler!) { + completionHandler(true, nil) + } + } + + let ex = expectation(description: "") + MockAccountStore().saveAccount(dummy).done { _ in + ex.fulfill() + }.catch { + XCTFail("\($0)") + } + + waitForExpectations(timeout: 1) + } + + func test_removeAccount() { + class MockAccountStore: ACAccountStore { + override func removeAccount(_ account: ACAccount!, withCompletionHandler completionHandler: ACAccountStoreSaveCompletionHandler!) { + completionHandler(true, nil) + } + } + + let ex = expectation(description: "") + MockAccountStore().removeAccount(dummy).done { _ in + ex.fulfill() + }.catch { + XCTFail("\($0)") + } + + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.gitignore new file mode 100644 index 00000000..30f50040 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.travis.yml new file mode 100644 index 00000000..070b4ab0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/.travis.yml @@ -0,0 +1,76 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/AddressBook/Sources + cp -R ../../../Sources Extensions/AddressBook + pod lib lint --subspec=PromiseKit/AddressBook --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - stage: test + xcode_scheme: PMKAddressBook + xcode_project: PMKAddressBook.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries --platform iOS diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile new file mode 100644 index 00000000..d11272a9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.pbxproj new file mode 100644 index 00000000..180f4d66 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.pbxproj @@ -0,0 +1,442 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63938C031D5C27AE00F4C165 /* ABAddressBookRequestAccess+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63938C021D5C27AE00F4C165 /* ABAddressBookRequestAccess+Promise.swift */; }; + 63938C091D5C27F600F4C165 /* TestAddressBook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63938C081D5C27F600F4C165 /* TestAddressBook.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKAddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAddressBook.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63167B891D5C23B4007A96B0 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63938C021D5C27AE00F4C165 /* ABAddressBookRequestAccess+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "ABAddressBookRequestAccess+Promise.swift"; path = "Sources/ABAddressBookRequestAccess+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63938C081D5C27F600F4C165 /* TestAddressBook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestAddressBook.swift; path = Tests/TestAddressBook.swift; sourceTree = SOURCE_ROOT; }; + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKAddressBook.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKAddressBook.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKABTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKABTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKAddressBook.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63167B891D5C23B4007A96B0 /* Cartfile */, + 63BF28101D5C257100F62C66 /* Carthage.xcconfig */, + 63C700091D5C0253003BAE60 /* Info.plist */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKAddressBook.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKABTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63938C021D5C27AE00F4C165 /* ABAddressBookRequestAccess+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63938C081D5C27F600F4C165 /* TestAddressBook.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKAddressBook */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAddressBook" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKAddressBook; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKAddressBook.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKABTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKABTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 63EF83AD1D5FA940008748A6 /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKABTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKABTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAddressBook" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKAddressBook */, + 63C7FFF11D5C020D003BAE60 /* PMKABTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 63EF83AD1D5FA940008748A6 /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63938C031D5C27AE00F4C165 /* ABAddressBookRequestAccess+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63938C091D5C27F600F4C165 /* TestAddressBook.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKAddressBook */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63BF28101D5C257100F62C66 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.AddressBook; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.AddressBook; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAddressBook" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAddressBook" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKABTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/xcshareddata/xcschemes/PMKAddressBook.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/xcshareddata/xcschemes/PMKAddressBook.xcscheme new file mode 100644 index 00000000..48de4260 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/PMKAddressBook.xcodeproj/xcshareddata/xcschemes/PMKAddressBook.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/README.markdown new file mode 100644 index 00000000..3be2f777 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit AddressBook Extensions ![Build Status] + +This project adds promises to Apple’s AddressBook framework. + +## CococaPods + +```ruby +pod "PromiseKit/AddressBook" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/AddressBook" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKAddressBook +``` + +```objc +// objc +@import PromiseKit; +@import PMKAddressBook; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/AddressBook.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Sources/ABAddressBookRequestAccess+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Sources/ABAddressBookRequestAccess+Promise.swift new file mode 100644 index 00000000..64935296 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Sources/ABAddressBookRequestAccess+Promise.swift @@ -0,0 +1,107 @@ +import Foundation.NSError +import CoreFoundation +import AddressBook +#if !PMKCocoaPods +import PromiseKit +#endif + +public enum AddressBookError: Error { + case notDetermined + case restricted + case denied + + public var localizedDescription: String { + switch self { + case .notDetermined: + return "Access to the address book could not be determined." + case .restricted: + return "A head of family must grant address book access." + case .denied: + return "Address book access has been denied." + } + } +} + +/** + Requests access to the address book. + + To import `ABAddressBookRequestAccess`: + + use_frameworks! + pod "PromiseKit/AddressBook" + + And then in your sources: + + import PromiseKit + + @return A promise that fulfills with the ABAuthorizationStatus. +*/ +public func ABAddressBookRequestAccess() -> Promise { + return ABAddressBookRequestAccess().map(on: nil) { (_, _) -> ABAuthorizationStatus in + return ABAddressBookGetAuthorizationStatus() + } +} + +/** + Requests access to the address book. + + To import `ABAddressBookRequestAccess`: + + pod "PromiseKit/AddressBook" + + And then in your sources: + + import PromiseKit + + @return A promise that fulfills with the ABAddressBook instance if access was granted. +*/ +public func ABAddressBookRequestAccess() -> Promise { + return ABAddressBookRequestAccess().then(on: nil) { granted, book -> Promise in + guard granted else { + switch ABAddressBookGetAuthorizationStatus() { + case .notDetermined: + throw AddressBookError.notDetermined + case .restricted: + throw AddressBookError.restricted + case .denied: + throw AddressBookError.denied + case .authorized: + fatalError("This should not happen") + #if swift(>=4.3) + @unknown default: + print("warning: PromiseKit: unknown case statement, please PR a fix!") + throw AddressBookError.denied + #endif + } + } + + return .value(book) + } +} + +extension NSError { + fileprivate convenience init(CFError error: CoreFoundation.CFError) { + let domain = CFErrorGetDomain(error) as String + let code = CFErrorGetCode(error) + let info = CFErrorCopyUserInfo(error) as? [String: Any] ?? [:] + self.init(domain: domain, code: code, userInfo: info) + } +} + +private func ABAddressBookRequestAccess() -> Promise<(Bool, ABAddressBook)> { + var error: Unmanaged? = nil + guard let ubook = ABAddressBookCreateWithOptions(nil, &error) else { + return Promise(error: NSError(CFError: error!.takeRetainedValue())) + } + + let book: ABAddressBook = ubook.takeRetainedValue() + return Promise { seal in + ABAddressBookRequestAccessWithCompletion(book) { granted, error in + if let error = error { + seal.reject(NSError(CFError: error)) + } else { + seal.fulfill((granted, book)) + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Tests/TestAddressBook.swift b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Tests/TestAddressBook.swift new file mode 100644 index 00000000..76dd423b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AddressBook/Tests/TestAddressBook.swift @@ -0,0 +1,15 @@ +import PMKAddressBook +import AddressBook +import PromiseKit +import XCTest + +class AddressBookTests: XCTestCase { + func test() { + let ex = expectation(description: "") + ABAddressBookRequestAccess().done { (auth: ABAuthorizationStatus) in + XCTAssertEqual(auth, ABAuthorizationStatus.authorized) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.gitignore new file mode 100644 index 00000000..30f50040 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.travis.yml new file mode 100644 index 00000000..1b34fa86 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/.travis.yml @@ -0,0 +1,97 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - swiftpm + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: + - cocoapods + - directories: + - Carthage + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Alamofire/Sources + cp -R ../../../Sources Extensions/Alamofire + pod lib lint --subspec=PromiseKit/Alamofire --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &swiftpm + stage: swiftpm + osx_image: xcode8.3 + script: swift build + - <<: *swiftpm + osx_image: xcode9.4 + - <<: *swiftpm + osx_image: xcode10.1 + - <<: *swiftpm + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKAlamofire + xcode_project: PMKAlamofire.xcodeproj + xcode_destination: 'platform=macOS' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile new file mode 100644 index 00000000..14c7c128 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile @@ -0,0 +1,2 @@ +github "mxcl/PromiseKit" ~> 6.8.4 +github "Alamofire/Alamofire" ~> 4.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.private b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.private new file mode 100644 index 00000000..7ad353e5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.private @@ -0,0 +1 @@ +github "AliSoftware/OHHTTPStubs" ~> 7.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.resolved new file mode 100644 index 00000000..10b37bd5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Cartfile.resolved @@ -0,0 +1,3 @@ +github "Alamofire/Alamofire" "4.8.2" +github "AliSoftware/OHHTTPStubs" "7.0.0" +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.pbxproj new file mode 100644 index 00000000..45ae8f76 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.pbxproj @@ -0,0 +1,454 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C700081D5C021F003BAE60 /* TestAlamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C700021D5C021F003BAE60 /* TestAlamofire.swift */; }; + 63C7FFE91D5C00F2003BAE60 /* Alamofire+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFDB1D5C00F2003BAE60 /* Alamofire+Promise.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKAlamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAlamofire.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700021D5C021F003BAE60 /* TestAlamofire.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestAlamofire.swift; path = Tests/TestAlamofire.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKAlamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKAlamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFDB1D5C00F2003BAE60 /* Alamofire+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Alamofire+Promise.swift"; path = "Sources/Alamofire+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C7FFF21D5C020D003BAE60 /* PMKAFTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKAFTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8131D5C0C4E00503216 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKAlamofire.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8131D5C0C4E00503216 /* Cartfile.private */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C700091D5C0253003BAE60 /* Info.plist */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKAlamofire.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKAFTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63C7FFDB1D5C00F2003BAE60 /* Alamofire+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63C700021D5C021F003BAE60 /* TestAlamofire.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKAlamofire */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAlamofire" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKAlamofire; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKAlamofire.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKAFTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKAFTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKAFTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKAFTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAlamofire" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKAlamofire */, + 63C7FFF11D5C020D003BAE60 /* PMKAFTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + OHHTTPStubs, + Alamofire, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFE91D5C00F2003BAE60 /* Alamofire+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C700081D5C021F003BAE60 /* TestAlamofire.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKAlamofire */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.6; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.6; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.11; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAlamofire" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAlamofire" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKAFTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..3e1e5c8b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/xcshareddata/xcschemes/PMKAlamofire.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/xcshareddata/xcschemes/PMKAlamofire.xcscheme new file mode 100644 index 00000000..221628cb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/PMKAlamofire.xcodeproj/xcshareddata/xcschemes/PMKAlamofire.xcscheme @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package.swift new file mode 100644 index 00000000..2e0d3310 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package.swift @@ -0,0 +1,10 @@ +import PackageDescription + +let package = Package( + name: "PMKAlamofire", + dependencies: [ + .Package(url: "https://github.com/mxcl/PromiseKit.git", majorVersion: 6), + .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4) + ], + exclude: ["Tests"] +) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package@swift-4.2.swift b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package@swift-4.2.swift new file mode 100644 index 00000000..d6ab7217 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Package@swift-4.2.swift @@ -0,0 +1,23 @@ +// swift-tools-version:4.2 + +import PackageDescription + +let pkg = Package(name: "PMKAlamofire") +pkg.products = [ + .library(name: "PMKAlamofire", targets: ["PMKAlamofire"]), +] +pkg.dependencies = [ + .package(url: "https://github.com/Alamofire/Alamofire.git", .upToNextMajor(from: "4.0.0")), + .package(url: "https://github.com/mxcl/PromiseKit.git", .upToNextMajor(from: "6.0.0")) +] +pkg.swiftLanguageVersions = [.v3, .v4, .v4_2] + +let target: Target = .target(name: "PMKAlamofire") +target.path = "Sources" +target.exclude = ["Tests"] +target.dependencies = [ + "PromiseKit", + "Alamofire" +] + +pkg.targets = [target] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/README.markdown new file mode 100644 index 00000000..ced03e07 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/README.markdown @@ -0,0 +1,93 @@ +# PromiseKit Alamofire Extensions ![Build Status] + +This project adds promises to [Alamofire](https://github.com/Alamofire/Alamofire). + +This project supports Swift 3.1, 3.2, 4.0 and 4.1. + +## Usage + +```swift +Alamofire.request("https://httpbin.org/get", method: .GET) + .responseJSON().then { json, rsp in + // + }.catch{ error in + //… + } +``` + +Of course, the whole point in promises is composability, so: + +```swift +func login() -> Promise { + let q = DispatchQueue.global() + UIApplication.shared.isNetworkActivityIndicatorVisible = true + + return firstly { in + Alamofire.request(url, method: .get).responseData() + }.map(on: q) { data, rsp in + convertToUser(data) + }.ensure { + UIApplication.shared.isNetworkActivityIndicatorVisible = false + } +} + +firstly { + login() +}.done { user in + //… +}.catch { error in + UIAlertController(/*…*/).show() +} +``` + +## CocoaPods + +```ruby +# Podfile +pod 'PromiseKit/Alamofire', '~> 6.0' +``` + +```swift +// `.swift` files +import PromiseKit +import Alamofire +``` + +```objc +// `.m files` +@import PromiseKit; +@import Alamofire; +``` + +## Carthage + +```ruby +github "PromiseKit/PMKAlamofire" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// `.swift` files +import PromiseKit +import PMKAlamofire +``` + +```objc +// `.m files` +@import PromiseKit; +@import PMKAlamofire; +``` + +## SwiftPM + +```swift +let package = Package( + dependencies: [ + .Target(url: "https://github.com/PromiseKit/PMKAlamofire", majorVersion: 3) + ] +) +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/PMKAlamofire.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Sources/Alamofire+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Sources/Alamofire+Promise.swift new file mode 100644 index 00000000..f5f7b59c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Sources/Alamofire+Promise.swift @@ -0,0 +1,189 @@ +@_exported import Alamofire +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `Alamofire` category: + + use_frameworks! + pod "PromiseKit/Alamofire" + + And then in your sources: + + import PromiseKit + */ +extension Alamofire.DataRequest { + /// Adds a handler to be called once the request has finished. + public func response(_: PMKNamespacer, queue: DispatchQueue? = nil) -> Promise<(URLRequest, HTTPURLResponse, Data)> { + return Promise { seal in + response(queue: queue) { rsp in + if let error = rsp.error { + seal.reject(error) + } else if let a = rsp.request, let b = rsp.response, let c = rsp.data { + seal.fulfill((a, b, c)) + } else { + seal.reject(PMKError.invalidCallingConvention) + } + } + } + } + + /// Adds a handler to be called once the request has finished. + public func responseData(queue: DispatchQueue? = nil) -> Promise<(data: Data, response: PMKAlamofireDataResponse)> { + return Promise { seal in + responseData(queue: queue) { response in + switch response.result { + case .success(let value): + seal.fulfill((value, PMKAlamofireDataResponse(response))) + case .failure(let error): + seal.reject(error) + } + } + } + } + + /// Adds a handler to be called once the request has finished. + public func responseString(queue: DispatchQueue? = nil) -> Promise<(string: String, response: PMKAlamofireDataResponse)> { + return Promise { seal in + responseString(queue: queue) { response in + switch response.result { + case .success(let value): + seal.fulfill((value, PMKAlamofireDataResponse(response))) + case .failure(let error): + seal.reject(error) + } + } + } + } + + /// Adds a handler to be called once the request has finished. + public func responseJSON(queue: DispatchQueue? = nil, options: JSONSerialization.ReadingOptions = .allowFragments) -> Promise<(json: Any, response: PMKAlamofireDataResponse)> { + return Promise { seal in + responseJSON(queue: queue, options: options) { response in + switch response.result { + case .success(let value): + seal.fulfill((value, PMKAlamofireDataResponse(response))) + case .failure(let error): + seal.reject(error) + } + } + } + } + + /// Adds a handler to be called once the request has finished. + public func responsePropertyList(queue: DispatchQueue? = nil, options: PropertyListSerialization.ReadOptions = PropertyListSerialization.ReadOptions()) -> Promise<(plist: Any, response: PMKAlamofireDataResponse)> { + return Promise { seal in + responsePropertyList(queue: queue, options: options) { response in + switch response.result { + case .success(let value): + seal.fulfill((value, PMKAlamofireDataResponse(response))) + case .failure(let error): + seal.reject(error) + } + } + } + } + +#if swift(>=3.2) + /** + Returns a Promise for a Decodable + Adds a handler to be called once the request has finished. + + - Parameter queue: DispatchQueue, by default nil + - Parameter decoder: JSONDecoder, by default JSONDecoder() + */ + public func responseDecodable(queue: DispatchQueue? = nil, decoder: JSONDecoder = JSONDecoder()) -> Promise { + return Promise { seal in + responseData(queue: queue) { response in + switch response.result { + case .success(let value): + do { + seal.fulfill(try decoder.decode(T.self, from: value)) + } catch { + seal.reject(error) + } + case .failure(let error): + seal.reject(error) + } + } + } + } + + /** + Returns a Promise for a Decodable + Adds a handler to be called once the request has finished. + + - Parameter queue: DispatchQueue, by default nil + - Parameter decoder: JSONDecoder, by default JSONDecoder() + */ + public func responseDecodable(_ type: T.Type, queue: DispatchQueue? = nil, decoder: JSONDecoder = JSONDecoder()) -> Promise { + return Promise { seal in + responseData(queue: queue) { response in + switch response.result { + case .success(let value): + do { + seal.fulfill(try decoder.decode(type, from: value)) + } catch { + seal.reject(error) + } + case .failure(let error): + seal.reject(error) + } + } + } + } +#endif +} + +extension Alamofire.DownloadRequest { + public func response(_: PMKNamespacer, queue: DispatchQueue? = nil) -> Promise { + return Promise { seal in + response(queue: queue) { response in + if let error = response.error { + seal.reject(error) + } else { + seal.fulfill(response) + } + } + } + } + + /// Adds a handler to be called once the request has finished. + public func responseData(queue: DispatchQueue? = nil) -> Promise> { + return Promise { seal in + responseData(queue: queue) { response in + switch response.result { + case .success: + seal.fulfill(response) + case .failure(let error): + seal.reject(error) + } + } + } + } +} + + +/// Alamofire.DataResponse, but without the `result`, since the Promise represents the `Result` +public struct PMKAlamofireDataResponse { + public init(_ rawrsp: Alamofire.DataResponse) { + request = rawrsp.request + response = rawrsp.response + data = rawrsp.data + timeline = rawrsp.timeline + } + + /// The URL request sent to the server. + public let request: URLRequest? + + /// The server's response to the URL request. + public let response: HTTPURLResponse? + + /// The data returned by the server. + public let data: Data? + + /// The timeline of the complete lifecycle of the request. + public let timeline: Timeline +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Tests/TestAlamofire.swift b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Tests/TestAlamofire.swift new file mode 100644 index 00000000..043ee8a7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Alamofire/Tests/TestAlamofire.swift @@ -0,0 +1,74 @@ +import PMKAlamofire +import OHHTTPStubs +import PromiseKit +import XCTest + +class AlamofireTests: XCTestCase { + func test() { + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + } + + let ex = expectation(description: "") + + let rq = Alamofire.request("http://example.com", method: .get).responseJSON().done { rsp in + XCTAssertEqual(json, rsp.json as? NSDictionary) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + override func tearDown() { + OHHTTPStubs.removeAllStubs() + } + +#if swift(>=3.2) + private struct Fixture: Decodable { + let key1: String + let key2: [String] + } + + func testDecodable1() { + + func getFixture() -> Promise { + return Alamofire.request("http://example.com", method: .get).responseDecodable(queue: nil) + } + + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + } + + let ex = expectation(description: "") + + getFixture().done { fixture in + XCTAssert(fixture.key1 == "value1", "Value1 found") + ex.fulfill() + } + waitForExpectations(timeout: 1) + + } + + func testDecodable2() { + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + } + + let ex = expectation(description: "") + + firstly { + Alamofire.request("http://example.com", method: .get).responseDecodable(Fixture.self) + }.done { fixture in + XCTAssert(fixture.key1 == "value1", "Value1 found") + ex.fulfill() + } + waitForExpectations(timeout: 1) + + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.travis.yml new file mode 100644 index 00000000..af7371dd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/.travis.yml @@ -0,0 +1,79 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/AssetsLibrary/Sources + cp -R ../../../Sources Extensions/AssetsLibrary + pod lib lint --subspec=PromiseKit/AssetsLibrary --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + # 9.4 is highest UI tests still pass without reworking them + - stage: test + osx_image: xcode9.4 + xcode_scheme: PMKAssetsLibrary + xcode_project: PMKAssetsLibrary.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=11.4,name=iPhone 5s' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries --platform iOS diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Info.plist new file mode 100644 index 00000000..34dfbc3c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.pbxproj new file mode 100644 index 00000000..4a5ef108 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.pbxproj @@ -0,0 +1,601 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6362F8521D5DA15A0021D2DD /* app.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6362F8501D5DA15A0021D2DD /* app.swift */; }; + 6362F8531D5DA15A0021D2DD /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6362F8511D5DA15A0021D2DD /* Default-568h@2x.png */; }; + 6362F8541D5DA16A0021D2DD /* TestUIImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */; }; + 6362F8561D5DA1750021D2DD /* ALAssetsLibrary+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6362F8551D5DA1750021D2DD /* ALAssetsLibrary+Promise.swift */; }; + 63C9C45E1D5D341600101ECE /* PMKAssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAssetsLibrary.framework */; }; + 63C9C45F1D5D341600101ECE /* PMKAssetsLibrary.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKAssetsLibrary.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C9C4591D5D33A900101ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C9C4441D5D334700101ECE; + remoteInfo = PMKTestsHost; + }; + 63C9C4601D5D341600101ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKAssetsLibrary; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 63C9C4621D5D341600101ECE /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 63C9C45F1D5D341600101ECE /* PMKAssetsLibrary.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 630B2E131D5D0AF500DC10E9 /* PMKALTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKALTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6362F8501D5DA15A0021D2DD /* app.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = app.swift; path = Tests/app.swift; sourceTree = ""; }; + 6362F8511D5DA15A0021D2DD /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "Tests/Default-568h@2x.png"; sourceTree = ""; }; + 6362F8551D5DA1750021D2DD /* ALAssetsLibrary+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "ALAssetsLibrary+Promise.swift"; path = "Sources/ALAssetsLibrary+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestUIImagePickerController.swift; path = Tests/TestUIImagePickerController.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKAssetsLibrary.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKAssetsLibrary.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C9C4451D5D334700101ECE /* PMKALTestsHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PMKALTestsHost.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 630B2E0D1D5D0AF500DC10E9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C9C4421D5D334700101ECE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C9C45E1D5D341600101ECE /* PMKAssetsLibrary.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 630B2DF31D5D0ABF00DC10E9 /* TestsHost */ = { + isa = PBXGroup; + children = ( + 6362F8501D5DA15A0021D2DD /* app.swift */, + 6362F8511D5DA15A0021D2DD /* Default-568h@2x.png */, + ); + name = TestsHost; + sourceTree = ""; + }; + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 630B2DF31D5D0ABF00DC10E9 /* TestsHost */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKAssetsLibrary.framework */, + 630B2E131D5D0AF500DC10E9 /* PMKALTests.xctest */, + 63C9C4451D5D334700101ECE /* PMKALTestsHost.app */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6362F8551D5DA1750021D2DD /* ALAssetsLibrary+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 630B2DFF1D5D0AF500DC10E9 /* PMKALTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 630B2E101D5D0AF500DC10E9 /* Build configuration list for PBXNativeTarget "PMKALTests" */; + buildPhases = ( + 630B2E041D5D0AF500DC10E9 /* Sources */, + 630B2E0D1D5D0AF500DC10E9 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C9C45A1D5D33A900101ECE /* PBXTargetDependency */, + ); + name = PMKALTests; + productName = PMKALTests; + productReference = 630B2E131D5D0AF500DC10E9 /* PMKALTests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 63C7FFA61D5BEE09003BAE60 /* PMKAssetsLibrary */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAssetsLibrary" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKAssetsLibrary; + productName = PMKAssetsLibrary; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKAssetsLibrary.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C9C4441D5D334700101ECE /* PMKALTestsHost */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C9C4541D5D334800101ECE /* Build configuration list for PBXNativeTarget "PMKALTestsHost" */; + buildPhases = ( + 63C9C4411D5D334700101ECE /* Sources */, + 63C9C4421D5D334700101ECE /* Frameworks */, + 63C9C4431D5D334700101ECE /* Resources */, + 63C9C45D1D5D33E700101ECE /* Embed Carthage Frameworks */, + 63C9C4621D5D341600101ECE /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C9C4611D5D341600101ECE /* PBXTargetDependency */, + ); + name = PMKALTestsHost; + productName = PMKTestsHost; + productReference = 63C9C4451D5D334700101ECE /* PMKALTestsHost.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 630B2DFF1D5D0AF500DC10E9 = { + LastSwiftMigration = 1020; + TestTargetID = 63C9C4441D5D334700101ECE; + }; + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C9C4441D5D334700101ECE = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAssetsLibrary" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKAssetsLibrary */, + 63C9C4441D5D334700101ECE /* PMKALTestsHost */, + 630B2DFF1D5D0AF500DC10E9 /* PMKALTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 63C9C4431D5D334700101ECE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6362F8531D5DA15A0021D2DD /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 63C9C45D1D5D33E700101ECE /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 630B2E041D5D0AF500DC10E9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6362F8541D5DA16A0021D2DD /* TestUIImagePickerController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6362F8561D5DA1750021D2DD /* ALAssetsLibrary+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C9C4411D5D334700101ECE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6362F8521D5DA15A0021D2DD /* app.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C9C45A1D5D33A900101ECE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C9C4441D5D334700101ECE /* PMKALTestsHost */; + targetProxy = 63C9C4591D5D33A900101ECE /* PBXContainerItemProxy */; + }; + 63C9C4611D5D341600101ECE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKAssetsLibrary */; + targetProxy = 63C9C4601D5D341600101ECE /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 630B2E111D5D0AF500DC10E9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.ui.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_TARGET_NAME = PMKALTestsHost; + }; + name = Debug; + }; + 630B2E121D5D0AF500DC10E9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.ui.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_TARGET_NAME = PMKALTestsHost; + }; + name = Release; + }; + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_PACKAGE_TYPE = FMWK; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.UIKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_PACKAGE_TYPE = FMWK; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.UIKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 63C9C4551D5D334800101ECE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_PACKAGE_TYPE = APPL; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Tests/Entitlements.plist; + COPY_PHASE_STRIP = NO; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.host.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C9C4561D5D334800101ECE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_PACKAGE_TYPE = APPL; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Tests/Entitlements.plist; + COPY_PHASE_STRIP = NO; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.host.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 630B2E101D5D0AF500DC10E9 /* Build configuration list for PBXNativeTarget "PMKALTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 630B2E111D5D0AF500DC10E9 /* Debug */, + 630B2E121D5D0AF500DC10E9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKAssetsLibrary" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKAssetsLibrary" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C9C4541D5D334800101ECE /* Build configuration list for PBXNativeTarget "PMKALTestsHost" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C9C4551D5D334800101ECE /* Debug */, + 63C9C4561D5D334800101ECE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/xcshareddata/xcschemes/PMKAssetsLibrary.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/xcshareddata/xcschemes/PMKAssetsLibrary.xcscheme new file mode 100644 index 00000000..456af2ff --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/PMKAssetsLibrary.xcodeproj/xcshareddata/xcschemes/PMKAssetsLibrary.xcscheme @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/README.markdown new file mode 100644 index 00000000..1c2f7d20 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit AssetsLibrary Extensions ![Build Status] + +This project adds promises to Apple’s AssetsLibrary framework. + +## CococaPods + +```ruby +pod "PromiseKit/AssetsLibrary" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/AssetsLibrary" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKAssetsLibrary +``` + +```objc +// objc +@import PromiseKit; +@import PMKAssetsLibrary; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/AssetsLibrary.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Sources/ALAssetsLibrary+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Sources/ALAssetsLibrary+Promise.swift new file mode 100644 index 00000000..27cf85d4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Sources/ALAssetsLibrary+Promise.swift @@ -0,0 +1,100 @@ +import UIKit.UIViewController +import Foundation.NSData +import AssetsLibrary +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import this `UIViewController` extension: + + use_frameworks! + pod "PromiseKit/AssetsLibrary" + + And then in your sources: + + import PromiseKit +*/ +extension UIViewController { + /** + - Returns: A promise that presents the provided UIImagePickerController and fulfills with the user selected media’s `NSData`. + */ + public func promise(_ vc: UIImagePickerController, animated: Bool = false, completion: (() -> Void)? = nil) -> Promise { + let proxy = UIImagePickerControllerProxy() + vc.delegate = proxy + + present(vc, animated: animated, completion: completion) + + return proxy.promise.then(on: nil) { info -> Promise in + #if swift(>=4.2) + let url = info[.referenceURL] as! URL + #else + let url = info[UIImagePickerControllerReferenceURL] as! URL + #endif + + return Promise { seal in + ALAssetsLibrary().asset(for: url, resultBlock: { asset in + let N = Int(asset!.defaultRepresentation().size()) + let bytes = UnsafeMutablePointer.allocate(capacity: N) + var error: NSError? + asset!.defaultRepresentation().getBytes(bytes, fromOffset: 0, length: N, error: &error) + + if let error = error { + seal.reject(error) + } else { + seal.fulfill(NSData(bytesNoCopy: bytes, length: N)) + } + }, failureBlock: { seal.reject($0!) } ) + } + }.ensure { + self.dismiss(animated: animated, completion: nil) + } + } +} + +@objc private class UIImagePickerControllerProxy: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { +#if swift(>=4.2) + let (promise, seal) = Promise<[UIImagePickerController.InfoKey: Any]>.pending() +#else + let (promise, seal) = Promise<[String: Any]>.pending() +#endif + var retainCycle: AnyObject? + + required override init() { + super.init() + retainCycle = self + } + +#if swift(>=4.2) + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { + seal.fulfill(info) + retainCycle = nil + } +#else + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { + seal.fulfill(info) + retainCycle = nil + } +#endif + + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + seal.reject(UIImagePickerController.PMKError.cancelled) + retainCycle = nil + } +} + + +extension UIImagePickerController { + /// Errors representing PromiseKit UIImagePickerController failures + public enum PMKError: CancellableError { + /// The user cancelled the UIImagePickerController. + case cancelled + /// - Returns: true + public var isCancelled: Bool { + switch self { + case .cancelled: + return true + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Default-568h@2x.png b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..42d3f425033ab42f5640962487b6e58e3ee17c69 GIT binary patch literal 4594 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU@72W28#FwiW&hqDw)pC0iMpz3IRp=X_+~x z3=9^6t)chxZ-;^x5wll_aBuHAx;`{GdZ)D1+GA{JF-DuAChtc6CGrxz8A}?D~_04Ywws;1&YpwG1sD5#TUs3HXYv{w>Wl8G6 zM`FJII&FF1^11c%xZ5ta@tIp^NrrYzTfJ`Xd6lV?my1oA=i7B@^A&IAE304n=}tU- zR!Hxl==XE4AIf%doPIm;-9Nu?%KNLj?_BIu@;{I#DqAc0gD3FJmF#WaBKz5Y|H$0V zcIUIqhs$OxOskou*Uk~DxOiOM)=$x%v+sh|YtgkFd)RFD+(^^ko*2(8abohr&^+l~ zN@)`}ubq@wbpD}!f8ln+|NMHhOTWB{ZI1XoXX(!59sHg5w7-Sy>$JbV^^430?+x+m zcX}q)v;OG+b*YA_LO$@z%1N~)_ny1Q$FCK+$99jk`eMOyZr|TorH0iq5*sgmRee3< zgtEo;(sZHCOT-)AhyB=cBl*R|6(@o-A0$3F=vBLFX8f$euxBlIPj8Nzd4@^3KV|>& zvrih>8|=5N-Lr!A>?JF6<3(bhyu-8e)~$5BwQg2qAopLRnbvXrCp2?+Pdzk6{xsjN zvW1eT#k`JPe5qEyHmxdM@YW61-Sfn6O_+c8(wh=CiOL)Hd#v=IvB}(yy%LnPZSev3 z7cMT!eqy>wS66yjFA11uH08)%H!~YmqZ2KyhfgOOD*0a$%DG!<+5h->OV1|py}FA6 zms%fRU$Fn=#t8f1n~Z^B_V2dxhBv2qpVT8V01uGRSZd5?c- zh?tdMz^6YBwHh6P=Wf22`gOMdU)!t=-r8T3{Vy1rM86eQU>D9PHNRxHJUiR|4WG>^ zw%tF@z1^3cUGk^!bMM{m+~Z~&@{Vmg^y9|*jksrx4Cv0Cnazjwasjq3IBiNbfgVl%F0&o@;M_B&Pm zMEvQLKYRXcvXR~(vNK+8^71EpKfK}mc9!R_>|TiyuFYA#TdQ?HvPhWltFp~yyM8R> zXv^vnvB=x=Coc;!J8|sB7v<$;F>{_y>#DGt*QM^!`M%r#$ni(UOxx$}`4RU+ZNoC= zum2_s8(3LA$kp*tJz@N4u2o@}>ldz)*%!{n*0J5^TjaUA?3&pr(eRt=SFP9NtU0yA zDE6v*yXaXH(eqC=%*uD{J=DEeWnZ&W-wVfkzxTP8-Q~%B7wyvi|B&_Tu#D&x!nJP& zzV4U0)%L-!=9%%LZuYOc_C9*P*y9P?#9*rp_kYX2^nP@=Wc$U6hVP;0)m^OR&87aY zGncZCSNbn@G4->3Btv0EjP?Wt5Z@Sn2DRmzV368|&p4rRy77 zT3YHG80i}s=>k>g7FXt#Bv$C=6)QswftllyTAW;zSx}OhpQivaH!&%{w8U0P31kr* zK-^i9nTD__uNdkrpa=CqGWv#k2KsQbfm&@qqEm7$6{b!QF%`hORymn+3>% zPz^Tvpg=?lRB()eLIX{lP++H4Wa0>HkPK#EgG8+YGAmMZB3v?aQ}e(mv!<=wqs;T8siSJ>2Oixu+tr z05d*;s;zwUQ!>*kT@p)D?TiczjdTsnb&bqJ3{9;J%&iQ70gk2yDV9Jo&PAz-CHX}m z`T03^;0VhFaTSd84D^6m3S9->c!Gohu*k9F0_ubnUv^xY9}8y!OElvEpAc7Y*+v?% znAPnhP=`QCkY8|KRZZKD{iiQnx%=e9=bwN7T@mZ(U|`_T@pN$vskrs_%EgJT0UR!l z50m~euHF!7^KG$p%gW&3@M}9iH^skxUcFmM>Fe>PGkq(Bzi(uf*0NglsYUaK!1KJn z8zUctZvPiiyy?sFMH_kHQufp@nPRxQ{%gtJay}; b)BZ7hQM0)5-%UoJ0SG)@{an^LB{Ts5Wl;?~ literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Entitlements.plist b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Entitlements.plist new file mode 100644 index 00000000..76a15bb4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/Entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.private.tcc.allow + + kTCCServiceAddressBook + kTCCServiceCalendar + kTCCServicePhotos + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/TestUIImagePickerController.swift b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/TestUIImagePickerController.swift new file mode 100644 index 00000000..67b96814 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/TestUIImagePickerController.swift @@ -0,0 +1,30 @@ +import XCTest + +class UIImagePickerControllerTests: XCTestCase { + func test_fulfills_with_data() { + let app = XCUIApplication() + let tablesQuery = app.tables + tablesQuery.staticTexts["1"].tap() + tablesQuery.children(matching: .cell).element(boundBy: 1).tap() + app.collectionViews.children(matching: .cell).element(boundBy: 0).tap() + + XCTAssertTrue(value) + } + + var toggle: XCUIElement { + // calling this ensures that any other ViewController has dismissed + // as a side-effect since otherwise the switch won't be found + return XCUIApplication().tables.switches.element + } + + var value: Bool { + return (toggle.value as! String) == "1" + } + + override func setUp() { + super.setUp() + continueAfterFailure = false + XCUIApplication().launch() + XCTAssertFalse(value) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/app.swift b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/app.swift new file mode 100644 index 00000000..65efc863 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/AssetsLibrary/Tests/app.swift @@ -0,0 +1,39 @@ +import PMKAssetsLibrary +import AssetsLibrary +import PromiseKit +import UIKit + +@UIApplicationMain +class App: UITableViewController, UIApplicationDelegate { + + var window: UIWindow? = UIWindow(frame: UIScreen.main.bounds) + let testSuceededSwitch = UISwitch() + + func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { + window!.rootViewController = self + window!.backgroundColor = UIColor.purple + window!.makeKeyAndVisible() + UIView.setAnimationsEnabled(false) + return true + } + + override func viewDidLoad() { + view.addSubview(testSuceededSwitch) + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = UITableViewCell() + cell.textLabel?.text = "1" + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + _ = promise(UIImagePickerController()).done { (data: NSData) in + self.testSuceededSwitch.isOn = true + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.travis.yml new file mode 100644 index 00000000..3e63baa7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/.travis.yml @@ -0,0 +1,88 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: + - cocoapods + - directories: + - Carthage + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + before_script: + pod repo update + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Bolts/Sources + cp -R ../../../Sources Extensions/Bolts + pod lib lint --subspec=PromiseKit/Bolts --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + osx_image: xcode10.2 + xcode_scheme: PMKBolts + xcode_project: PMKBolts.xcodeproj + xcode_destination: 'platform=macOS' + before_script: + carthage bootstrap --cache-builds + cache.directories: + - Carthage + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile new file mode 100644 index 00000000..b751e30d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile @@ -0,0 +1,2 @@ +github "mxcl/PromiseKit" ~> 6.8.4 +github "BoltsFramework/Bolts-ObjC" ~> 1.9 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile.resolved new file mode 100644 index 00000000..33589847 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Cartfile.resolved @@ -0,0 +1,2 @@ +github "BoltsFramework/Bolts-ObjC" "1.9.0" +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.pbxproj new file mode 100644 index 00000000..a36379a6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.pbxproj @@ -0,0 +1,430 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKBolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKBolts.framework */; }; + 63FE02391D5D5CA800522465 /* BFTask+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63FE02381D5D5CA800522465 /* BFTask+Promise.swift */; }; + 63FE023B1D5D5CB300522465 /* TestBolts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63FE023A1D5D5CB300522465 /* TestBolts.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKBolts; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKBolts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKBolts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKBoltsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKBoltsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63FE02381D5D5CA800522465 /* BFTask+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "BFTask+Promise.swift"; path = "Sources/BFTask+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63FE023A1D5D5CB300522465 /* TestBolts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestBolts.swift; path = Tests/TestBolts.swift; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKBolts.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKBolts.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKBoltsTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63FE02381D5D5CA800522465 /* BFTask+Promise.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63FE023A1D5D5CB300522465 /* TestBolts.swift */, + ); + path = Tests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKBolts */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKBolts" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKBolts; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKBolts.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKBoltsTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKBoltsTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKBoltsTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKBoltsTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKBolts" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKBolts */, + 63C7FFF11D5C020D003BAE60 /* PMKBoltsTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + Bolts, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63FE02391D5D5CA800522465 /* BFTask+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63FE023B1D5D5CB300522465 /* TestBolts.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKBolts */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Bolts; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Bolts; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKBolts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKBolts" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKBoltsTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/xcshareddata/xcschemes/PMKBolts.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/xcshareddata/xcschemes/PMKBolts.xcscheme new file mode 100644 index 00000000..e80c26d6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/PMKBolts.xcodeproj/xcshareddata/xcschemes/PMKBolts.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/README.markdown new file mode 100644 index 00000000..5d59ab5b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/README.markdown @@ -0,0 +1,47 @@ +# PromiseKit Bolts Extensions ![Build Status] + +This project adds promises to Facebook’s [Bolts] framework. + +Bolts underlies the entire Facbook SDK. + +## Usage + +```swift +someBoltsTask().then { anyObject in + //… +} +``` + +## CocoaPods + +```ruby +pod "PromiseKit/Bolts" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/Bolts" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKBolts +``` + +```objc +// objc +@import PromiseKit; +@import PMKBolts; +``` + + +[Bolts]: https://github.com/BoltsFramework + + +[Build Status]: https://travis-ci.org/PromiseKit/Bolts.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Sources/BFTask+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Sources/BFTask+Promise.swift new file mode 100644 index 00000000..de786558 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Sources/BFTask+Promise.swift @@ -0,0 +1,27 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import Bolts + +extension Promise { + /** + The provided closure is executed when this promise is resolved. + */ + public func then(on q: DispatchQueue? = conf.Q.map, body: @escaping (T) -> BFTask) -> Promise { + return then(on: q) { tee -> Promise in + let task = body(tee) + return Promise { seal in + task.continueWith(block: { task in + if task.isCompleted { + seal.fulfill(task.result) + } else if let error = task.error { + seal.reject(error) + } else { + seal.reject(PMKError.invalidCallingConvention) + } + return nil + }) + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Tests/TestBolts.swift b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Tests/TestBolts.swift new file mode 100644 index 00000000..6985661a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Bolts/Tests/TestBolts.swift @@ -0,0 +1,23 @@ +import PromiseKit +import PMKBolts +import XCTest +import Bolts + +class TestBolts: XCTestCase { + func test() { + let ex = expectation(description: "") + + let value = { NSString(string: "1") } + + firstly { () -> Promise in + return Promise() + }.then { _ -> BFTask in + return BFTask(result: value()) + }.done { obj in + XCTAssertEqual(obj, value()) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.travis.yml new file mode 100644 index 00000000..954c1a86 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/.travis.yml @@ -0,0 +1,95 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - swiftpm + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + os: osx + language: objective-c + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/CloudKit/Sources + cp -R ../../../Sources Extensions/CloudKit + pod lib lint --subspec=PromiseKit/CloudKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &swiftpm + stage: swiftpm + osx_image: xcode8.3 + script: swift build -Xswiftc -target -Xswiftc x86_64-apple-macosx10.12 + - <<: *swiftpm + osx_image: xcode9.2 + - <<: *swiftpm + osx_image: xcode9.4 + - <<: *swiftpm + osx_image: xcode10.1 + - <<: *swiftpm + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKCloudKit + xcode_project: PMKCloudKit.xcodeproj + xcode_destination: 'platform=macOS' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..ca7d5653 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.pbxproj @@ -0,0 +1,484 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKCloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKCloudKit.framework */; }; + 63F6071E1D5D48B200A11DEA /* CKContainer+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F607171D5D48B200A11DEA /* CKContainer+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63F6071F1D5D48B200A11DEA /* CKContainer+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F607181D5D48B200A11DEA /* CKContainer+AnyPromise.m */; }; + 63F607201D5D48B200A11DEA /* CKContainer+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F607191D5D48B200A11DEA /* CKContainer+Promise.swift */; }; + 63F607211D5D48B200A11DEA /* CKDatabase+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F6071A1D5D48B200A11DEA /* CKDatabase+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63F607221D5D48B200A11DEA /* CKDatabase+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F6071B1D5D48B200A11DEA /* CKDatabase+AnyPromise.m */; }; + 63F607231D5D48B200A11DEA /* CKDatabase+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F6071C1D5D48B200A11DEA /* CKDatabase+Promise.swift */; }; + 63F607241D5D48B200A11DEA /* PMKCloudKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 63F6071D1D5D48B200A11DEA /* PMKCloudKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63F607281D5D48D600A11DEA /* TestCloudKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F607271D5D48D600A11DEA /* TestCloudKit.swift */; }; + 63F6072C1D5D4A0200A11DEA /* infrastructure.m in Sources */ = {isa = PBXBuildFile; fileRef = 63F6072B1D5D4A0200A11DEA /* infrastructure.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKCloudKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKCloudKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKCloudKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKCKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKCKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63F607171D5D48B200A11DEA /* CKContainer+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CKContainer+AnyPromise.h"; path = "Sources/CKContainer+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63F607181D5D48B200A11DEA /* CKContainer+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CKContainer+AnyPromise.m"; path = "Sources/CKContainer+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63F607191D5D48B200A11DEA /* CKContainer+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CKContainer+Promise.swift"; path = "Sources/CKContainer+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63F6071A1D5D48B200A11DEA /* CKDatabase+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CKDatabase+AnyPromise.h"; path = "Sources/CKDatabase+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63F6071B1D5D48B200A11DEA /* CKDatabase+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CKDatabase+AnyPromise.m"; path = "Sources/CKDatabase+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63F6071C1D5D48B200A11DEA /* CKDatabase+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CKDatabase+Promise.swift"; path = "Sources/CKDatabase+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63F6071D1D5D48B200A11DEA /* PMKCloudKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKCloudKit.h; path = Sources/PMKCloudKit.h; sourceTree = SOURCE_ROOT; }; + 63F607271D5D48D600A11DEA /* TestCloudKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestCloudKit.swift; path = Tests/TestCloudKit.swift; sourceTree = SOURCE_ROOT; }; + 63F6072A1D5D49BD00A11DEA /* infrastructure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = infrastructure.h; path = Tests/infrastructure.h; sourceTree = SOURCE_ROOT; }; + 63F6072B1D5D4A0200A11DEA /* infrastructure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = infrastructure.m; path = Tests/infrastructure.m; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKCloudKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKCloudKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKCKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63F607171D5D48B200A11DEA /* CKContainer+AnyPromise.h */, + 63F607181D5D48B200A11DEA /* CKContainer+AnyPromise.m */, + 63F607191D5D48B200A11DEA /* CKContainer+Promise.swift */, + 63F6071A1D5D48B200A11DEA /* CKDatabase+AnyPromise.h */, + 63F6071B1D5D48B200A11DEA /* CKDatabase+AnyPromise.m */, + 63F6071C1D5D48B200A11DEA /* CKDatabase+Promise.swift */, + 63F6071D1D5D48B200A11DEA /* PMKCloudKit.h */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63F6072A1D5D49BD00A11DEA /* infrastructure.h */, + 63F6072B1D5D4A0200A11DEA /* infrastructure.m */, + 63F607271D5D48D600A11DEA /* TestCloudKit.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63F607241D5D48B200A11DEA /* PMKCloudKit.h in Headers */, + 63F6071E1D5D48B200A11DEA /* CKContainer+AnyPromise.h in Headers */, + 63F607211D5D48B200A11DEA /* CKDatabase+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKCloudKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCloudKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKCloudKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKCloudKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKCKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKCKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKCKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCloudKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKCloudKit */, + 63C7FFF11D5C020D003BAE60 /* PMKCKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63F607231D5D48B200A11DEA /* CKDatabase+Promise.swift in Sources */, + 63F6071F1D5D48B200A11DEA /* CKContainer+AnyPromise.m in Sources */, + 63F607201D5D48B200A11DEA /* CKContainer+Promise.swift in Sources */, + 63F607221D5D48B200A11DEA /* CKDatabase+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63F6072C1D5D4A0200A11DEA /* infrastructure.m in Sources */, + 63F607281D5D48D600A11DEA /* TestCloudKit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKCloudKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CloudKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MACOSX_DEPLOYMENT_TARGET = 10.12; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CloudKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = Tests/infrastructure.h; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = Tests/infrastructure.h; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCloudKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCloudKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/xcshareddata/xcschemes/PMKCloudKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/xcshareddata/xcschemes/PMKCloudKit.xcscheme new file mode 100644 index 00000000..9eeccdc4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/PMKCloudKit.xcodeproj/xcshareddata/xcschemes/PMKCloudKit.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package.swift new file mode 100644 index 00000000..3db1930b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package.swift @@ -0,0 +1,16 @@ +import PackageDescription + +let pkg = Package(name: "PMKCloudKit") + +pkg.dependencies = [ + .Package(url: "https://github.com/mxcl/PromiseKit.git", majorVersion: 6) +] + +pkg.exclude = [ + "Sources/CKContainer+AnyPromise.h", + "Sources/CKDatabase+AnyPromise.h", + "Sources/PMKCloudKit.h", + "Sources/CKContainer+AnyPromise.m", + "Sources/CKDatabase+AnyPromise.m", + "Tests" +] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-4.2.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-4.2.swift new file mode 100644 index 00000000..94e11716 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-4.2.swift @@ -0,0 +1,26 @@ +// swift-tools-version:4.2 +import PackageDescription + +let name = "PMKCloudKit" + +let pkg = Package(name: name) +pkg.products = [ + .library(name: name, targets: [name]), +] +pkg.swiftLanguageVersions = [.v3, .v4, .v4_2] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0") +] + +let target: Target = .target(name: name) +target.path = "Sources" +target.exclude = [ + "CKContainer+AnyPromise.h", + "CKDatabase+AnyPromise.h", + "\(name).h", + "CKContainer+AnyPromise.m", + "CKDatabase+AnyPromise.m" +] +target.dependencies = ["PromiseKit"] + +pkg.targets = [target] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-5.0.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-5.0.swift new file mode 100644 index 00000000..b42b802e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Package@swift-5.0.swift @@ -0,0 +1,30 @@ +// swift-tools-version:5.0 +import PackageDescription + +let name = "PMKCloudKit" + +let pkg = Package(name: name) +pkg.products = [ + .library(name: name, targets: [name]), +] +pkg.swiftLanguageVersions = [.v4, .v4_2, .v5] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0") +] + +let target: Target = .target(name: name) +target.path = "Sources" +target.exclude = [ + "CKContainer+AnyPromise.h", + "CKDatabase+AnyPromise.h", + "\(name).h", + "CKContainer+AnyPromise.m", + "CKDatabase+AnyPromise.m" +] +target.dependencies = ["PromiseKit"] + +pkg.targets = [target] + +pkg.platforms = [ + .macOS(.v10_12), .iOS(.v10), .tvOS(.v10), .watchOS(.v3) +] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/README.markdown new file mode 100644 index 00000000..1c80f731 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit CloudKit Extensions ![Build Status] + +This project adds promises to Apple’s CloudKit framework. + +## CocoaPods + +```ruby +pod "PromiseKit/CloudKit", ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/CloudKit" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKFoundation +``` + +```objc +// objc +@import PromiseKit; +@import PMKCloudKit; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/CloudKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.h new file mode 100644 index 00000000..87e9b3de --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.h @@ -0,0 +1,79 @@ +#import +#import + +/** + To import the `CKContainer` category: + + use_frameworks! + pod "PromiseKit/CloudKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface CKContainer (PromiseKit) + +/** + Reports whether the current user’s iCloud account can be accessed. + + @return A promise that thens the `CKAccountStatus` of this container. +*/ +- (AnyPromise *)accountStatus NS_REFINED_FOR_SWIFT; + +/** + Requests the specified permission from the user asynchronously. + + @param applicationPermission The requested permission. + + @return A promise that thens the `CKApplicationPermissionStatus` for the + requested permission. +*/ +- (AnyPromise *)requestApplicationPermission:(CKApplicationPermissions)applicationPermission NS_REFINED_FOR_SWIFT; + +/** + Checks the status of the specified permission asynchronously. + + @param applicationPermission The permission whose status you want to + check. + + @return A promise that thens the `CKApplicationPermissionStatus` for + the requested permission. +*/ +- (AnyPromise *)statusForApplicationPermission:(CKApplicationPermissions)applicationPermission NS_REFINED_FOR_SWIFT; + +#if !(TARGET_OS_TV && (TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR)) +/** + + Retrieves information about all discoverable users that are known to the + current user. + + @return A promise that thens the array of `CKDiscoveredUserInfo` objects. +*/ +#if TARGET_OS_WATCH +- (AnyPromise *)discoverAllIdentities NS_REFINED_FOR_SWIFT; +#else +- (AnyPromise *)discoverAllContactUserInfos NS_REFINED_FOR_SWIFT; +#endif +#endif + +/** + Retrieves information about a single user based on that user’s email + address or record ID. + + @param emailStringOrRecordID Either the email string or the `CKRecordID` + for the user record. + + @return A promise that thens the `CKDiscoveredUserInfo` for the + requested user record. +*/ +- (AnyPromise *)discoverUserInfo:(id)emailStringOrRecordID NS_REFINED_FOR_SWIFT; + +/** + Returns the user record associated with the current user. + + @return A promise that thens the `CKRecord` for the current user or `nil` + if there is no current user. +*/ +- (AnyPromise *)fetchUserRecordID NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.m new file mode 100644 index 00000000..85aee808 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+AnyPromise.m @@ -0,0 +1,71 @@ +#import +#import "CKContainer+AnyPromise.h" + +@implementation CKContainer (PromiseKit) + +- (AnyPromise *)accountStatus { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError *error) { + resolve(error ?: @(accountStatus)); + }]; + }]; +} + +- (AnyPromise *)requestApplicationPermission:(CKApplicationPermissions)permissions { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self requestApplicationPermission:permissions completionHandler:^(CKApplicationPermissionStatus status, NSError *error) { + resolve(error ?: @(status)); + }]; + }]; +} + +- (AnyPromise *)statusForApplicationPermission:(CKApplicationPermissions)applicationPermission { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self statusForApplicationPermission:applicationPermission completionHandler:^(CKApplicationPermissionStatus status, NSError *error) { + resolve(error ?: @(status)); + }]; + }]; +} + +#if !(TARGET_OS_TV && (TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR)) +#if TARGET_OS_WATCH +- (AnyPromise *)discoverAllIdentities { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self discoverAllIdentitiesWithCompletionHandler:^(NSArray *userInfos, NSError *error) { + resolve(error ?: userInfos); + }]; + }]; +} +#else +- (AnyPromise *)discoverAllContactUserInfos { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self discoverAllIdentitiesWithCompletionHandler:^(NSArray *userInfos, NSError *error) { + resolve(error ?: userInfos); + }]; + }]; +} +#endif +#endif + +- (AnyPromise *)discoverUserInfo:(id)input { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + void (^adapter)(id, id) = ^(id value, id error){ + resolve(error ?: error); + }; + if ([input isKindOfClass:[CKRecordID class]]) { + [self discoverUserIdentityWithUserRecordID:input completionHandler:adapter]; + } else { + [self discoverUserIdentityWithEmailAddress:input completionHandler:adapter]; + } + }]; +} + +- (AnyPromise *)fetchUserRecordID { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) { + resolve(error ?: recordID); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+Promise.swift new file mode 100644 index 00000000..42ecd984 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKContainer+Promise.swift @@ -0,0 +1,79 @@ +import CloudKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if swift(>=4.2) +#else +public extension CKRecord { + typealias ID = CKRecordID +} +public typealias CKContainer_Application_Permissions = CKApplicationPermissions +public typealias CKContainer_Application_PermissionStatus = CKApplicationPermissionStatus +#endif + +/** + To import the `CKContainer` category: + + use_frameworks! + pod "PromiseKit/CloudKit" + + And then in your sources: + + @import PromiseKit; +*/ +extension CKContainer { + /// Reports whether the current user’s iCloud account can be accessed. + public func accountStatus() -> Promise { + return Promise { accountStatus(completionHandler: $0.resolve) } + } + + /// Requests the specified permission from the user asynchronously. + public func requestApplicationPermission(_ applicationPermissions: CKContainer_Application_Permissions) -> Promise { + return Promise { requestApplicationPermission(applicationPermissions, completionHandler: $0.resolve) } + } + + /// Checks the status of the specified permission asynchronously. + public func status(forApplicationPermission applicationPermissions: CKContainer_Application_Permissions) -> Promise { + return Promise { status(forApplicationPermission: applicationPermissions, completionHandler: $0.resolve) } + } + +#if !os(tvOS) + /// Retrieves information about all discoverable users that are known to the current user. + @available(*, deprecated) + public func discoverAllContactUserInfos() -> Promise<[CKUserIdentity]> { + return Promise { discoverAllIdentities(completionHandler: $0.resolve) } + } + + public func discoverAllIdentities() -> Promise<[CKUserIdentity]> { + return Promise { discoverAllIdentities(completionHandler: $0.resolve) } + } +#endif + + /// Retrieves information about a single user based on that user’s email address. + @available(*, deprecated) + public func discoverUserInfo(withEmailAddress email: String) -> Promise { + return Promise { discoverUserIdentity(withEmailAddress: email, completionHandler: $0.resolve) } + } + + /// Retrieves information about a single user based on that user’s email address. + public func discoverUserIdentity(withEmailAddress email: String) -> Promise { + return Promise { discoverUserIdentity(withEmailAddress: email, completionHandler: $0.resolve) } + } + + /// Retrieves information about a single user based on the ID of the corresponding user record. + @available(*, deprecated) + public func discoverUserInfo(withUserRecordID recordID: CKRecord.ID) -> Promise { + return Promise { discoverUserIdentity(withUserRecordID: recordID, completionHandler: $0.resolve) } + } + + /// Retrieves information about a single user based on the ID of the corresponding user record. + public func discoverUserIdentity(withUserRecordID recordID: CKRecord.ID) -> Promise { + return Promise { discoverUserIdentity(withUserRecordID: recordID, completionHandler: $0.resolve) } + } + + /// Returns the user record ID associated with the current user. + public func fetchUserRecordID() -> Promise { + return Promise { fetchUserRecordID(completionHandler: $0.resolve) } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.h new file mode 100644 index 00000000..c0f89599 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.h @@ -0,0 +1,46 @@ +#import +#import + +/** + To import the `CKDatabase` category: + + use_frameworks! + pod "PromiseKit/CloudKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface CKDatabase (PromiseKit) + +/// Fetches one record asynchronously from the current database. +- (AnyPromise *)fetchRecordWithID:(CKRecordID *)recordID NS_REFINED_FOR_SWIFT; +/// Saves one record zone asynchronously to the current database. +- (AnyPromise *)saveRecord:(CKRecord *)record NS_REFINED_FOR_SWIFT; +/// Delete one subscription object asynchronously from the current database. +- (AnyPromise *)deleteRecordWithID:(CKRecordID *)recordID NS_REFINED_FOR_SWIFT; + +/// Searches the specified zone asynchronously for records that match the query parameters. +- (AnyPromise *)performQuery:(CKQuery *)query inZoneWithID:(CKRecordZoneID *)zoneID NS_REFINED_FOR_SWIFT; + +/// Fetches all record zones asynchronously from the current database. +- (AnyPromise *)fetchAllRecordZones NS_REFINED_FOR_SWIFT; +/// Fetches one record asynchronously from the current database. +- (AnyPromise *)fetchRecordZoneWithID:(CKRecordZoneID *)zoneID NS_REFINED_FOR_SWIFT; +/// Saves one record zone asynchronously to the current database. +- (AnyPromise *)saveRecordZone:(CKRecordZone *)zone NS_REFINED_FOR_SWIFT; +/// Delete one subscription object asynchronously from the current database. +- (AnyPromise *)deleteRecordZoneWithID:(CKRecordZoneID *)zoneID NS_REFINED_FOR_SWIFT; + +#if !(TARGET_OS_WATCH && (TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR)) +/// Fetches one record asynchronously from the current database. +- (AnyPromise *)fetchSubscriptionWithID:(NSString *)subscriptionID NS_REFINED_FOR_SWIFT; +/// Fetches all subscription objects asynchronously from the current database. +- (AnyPromise *)fetchAllSubscriptions NS_REFINED_FOR_SWIFT; +/// Saves one subscription object asynchronously to the current database. +- (AnyPromise *)saveSubscription:(CKSubscription *)subscription NS_REFINED_FOR_SWIFT; +/// Delete one subscription object asynchronously from the current database. +- (AnyPromise *)deleteSubscriptionWithID:(NSString *)subscriptionID NS_REFINED_FOR_SWIFT; +#endif + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.m new file mode 100644 index 00000000..6f766ddb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+AnyPromise.m @@ -0,0 +1,41 @@ +#import "CKDatabase+AnyPromise.h" + +@implementation CKDatabase (PromiseKit) + +#define mkmethod1(method) \ +- (AnyPromise *)method { \ + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { \ + [self method ## WithCompletionHandler:^(id a, id b){ \ + resolve(b ?: a); \ + }]; \ + }]; \ +} + +#define mkmethod2(method) \ +- (AnyPromise *)method { \ + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { \ + [self method completionHandler:^(id a, id b){ \ + resolve(b ?: a); \ + }]; \ + }]; \ +} + +mkmethod2(fetchRecordWithID:(CKRecordID *)recordID); +mkmethod2(saveRecord:(CKRecord *)record); +mkmethod2(deleteRecordWithID:(CKRecordID *)recordID); + +mkmethod2(performQuery:(CKQuery *)query inZoneWithID:(CKRecordZoneID *)zoneID); + +mkmethod1(fetchAllRecordZones); +mkmethod2(fetchRecordZoneWithID:(CKRecordZoneID *)zoneID); +mkmethod2(saveRecordZone:(CKRecordZone *)zone); +mkmethod2(deleteRecordZoneWithID:(CKRecordZoneID *)zoneID); + +#if !(TARGET_OS_WATCH && (TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR)) +mkmethod2(fetchSubscriptionWithID:(NSString *)subscriptionID); +mkmethod1(fetchAllSubscriptions); +mkmethod2(saveSubscription:(CKSubscription *)subscription); +mkmethod2(deleteSubscriptionWithID:(NSString *)subscriptionID); +#endif + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+Promise.swift new file mode 100644 index 00000000..9d3ec9cf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/CKDatabase+Promise.swift @@ -0,0 +1,91 @@ +import CloudKit.CKDatabase +#if !PMKCocoaPods +import PromiseKit +#endif + +#if swift(>=4.2) +#else +public extension CKRecordZone { + typealias ID = CKRecordZoneID +} +#endif + +/** + To import the `CKDatabase` category: + + use_frameworks! + pod "PromiseKit/CloudKit" + + And then in your sources: + + @import PromiseKit; +*/ +extension CKDatabase { + /// Fetches one record asynchronously from the current database. + public func fetch(withRecordID recordID: CKRecord.ID) -> Promise { + return Promise { fetch(withRecordID: recordID, completionHandler: $0.resolve) } + } + + /// Fetches one record zone asynchronously from the current database. + public func fetch(withRecordZoneID recordZoneID: CKRecordZone.ID) -> Promise { + return Promise { fetch(withRecordZoneID: recordZoneID, completionHandler: $0.resolve) } + } + /// Fetches all record zones asynchronously from the current database. + public func fetchAllRecordZones() -> Promise<[CKRecordZone]> { + return Promise { fetchAllRecordZones(completionHandler: $0.resolve) } + } + + /// Saves one record zone asynchronously to the current database. + public func save(_ record: CKRecord) -> Promise { + return Promise { save(record, completionHandler: $0.resolve) } + } + + /// Saves one record zone asynchronously to the current database. + public func save(_ recordZone: CKRecordZone) -> Promise { + return Promise { save(recordZone, completionHandler: $0.resolve) } + } + + /// Delete one subscription object asynchronously from the current database. + public func delete(withRecordID recordID: CKRecord.ID) -> Promise { + return Promise { delete(withRecordID: recordID, completionHandler: $0.resolve) } + } + + /// Delete one subscription object asynchronously from the current database. + public func delete(withRecordZoneID zoneID: CKRecordZone.ID) -> Promise { + return Promise { delete(withRecordZoneID: zoneID, completionHandler: $0.resolve) } + } + + /// Searches the specified zone asynchronously for records that match the query parameters. + public func perform(_ query: CKQuery, inZoneWith zoneID: CKRecordZone.ID? = nil) -> Promise<[CKRecord]> { + return Promise { perform(query, inZoneWith: zoneID, completionHandler: $0.resolve) } + } + + /// Fetches the record for the current user. + public func fetchUserRecord(_ container: CKContainer = CKContainer.default()) -> Promise { + return container.fetchUserRecordID().then(on: nil) { uid in + return self.fetch(withRecordID: uid) + } + } + +#if !os(watchOS) + /// Fetches one record zone asynchronously from the current database. + public func fetch(withSubscriptionID subscriptionID: String) -> Promise { + return Promise { fetch(withSubscriptionID: subscriptionID, completionHandler: $0.resolve) } + } + + /// Fetches all subscription objects asynchronously from the current database. + public func fetchAllSubscriptions() -> Promise<[CKSubscription]> { + return Promise { fetchAllSubscriptions(completionHandler: $0.resolve) } + } + + /// Saves one subscription object asynchronously to the current database. + public func save(_ subscription: CKSubscription) -> Promise { + return Promise { save(subscription, completionHandler: $0.resolve) } + } + + /// Delete one subscription object asynchronously from the current database. + public func delete(withSubscriptionID subscriptionID: String) -> Promise { + return Promise { delete(withSubscriptionID: subscriptionID, completionHandler: $0.resolve) } + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/PMKCloudKit.h b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/PMKCloudKit.h new file mode 100644 index 00000000..3a831804 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Sources/PMKCloudKit.h @@ -0,0 +1,2 @@ +#import "CKContainer+AnyPromise.h" +#import "CKDatabase+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/TestCloudKit.swift b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/TestCloudKit.swift new file mode 100644 index 00000000..ca96fd2e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/TestCloudKit.swift @@ -0,0 +1,146 @@ +import PMKCloudKit +import XCTest + +//TODO possibly we should interpret eg. request permission result of Denied as error +// PMK should only resolve with values that allow a typical chain to proceed + +class Test_CKContainer_Swift: XCTestCase { + + func test_accountStatus() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func accountStatus(completionHandler: @escaping (CKAccountStatus, Error?) -> Void) { + completionHandler(.couldNotDetermine, nil) + } + } + + let ex = expectation(description: "") + MockContainer().accountStatus().done { status in + XCTAssertEqual(status, CKAccountStatus.couldNotDetermine) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_requestApplicationPermission() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func requestApplicationPermission(_ applicationPermission: CKApplicationPermissions, completionHandler: @escaping CKApplicationPermissionBlock) { + completionHandler(.granted, nil) + } + } + + let ex = expectation(description: "") + let pp = CKApplicationPermissions.userDiscoverability + MockContainer().requestApplicationPermission(pp).done { perms in + XCTAssertEqual(perms, CKApplicationPermissionStatus.granted) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_statusForApplicationPermission() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func status(forApplicationPermission applicationPermission: CKApplicationPermissions, completionHandler: @escaping CKApplicationPermissionBlock) { + completionHandler(.granted, nil) + } + } + + let ex = expectation(description: "") + let pp = CKApplicationPermissions.userDiscoverability + MockContainer().status(forApplicationPermission: pp).done { + XCTAssertEqual($0, CKApplicationPermissionStatus.granted) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + +#if !os(tvOS) + func test_discoverAllContactUserInfos() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func discoverAllIdentities(completionHandler: @escaping ([CKUserIdentity]?, Error?) -> Void) { + completionHandler([PMKDiscoveredUserInfo()], nil) + } + } + + let ex = expectation(description: "") + MockContainer().discoverAllIdentities().done { + XCTAssertEqual($0, [PMKDiscoveredUserInfo()]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } +#endif + + func test_discoverUserInfoWithEmailAddress() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func discoverUserIdentity(withEmailAddress email: String, completionHandler: @escaping (CKUserIdentity?, Error?) -> Void) { + completionHandler(PMKDiscoveredUserInfo(), nil) + } + } + + let ex = expectation(description: "") + MockContainer().discoverUserIdentity(withEmailAddress: "mxcl@me.com").done { + XCTAssertEqual($0, PMKDiscoveredUserInfo()) + ex.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + } + + func test_discoverUserInfoWithRecordID() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func discoverUserIdentity(withUserRecordID userRecordID: CKRecord.ID, completionHandler: @escaping (CKUserIdentity?, Error?) -> Void) { + completionHandler(PMKDiscoveredUserInfo(), nil) + } + } + + let ex = expectation(description: "") + MockContainer().discoverUserIdentity(withUserRecordID: dummy()).done { + XCTAssertEqual($0, PMKDiscoveredUserInfo()) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_fetchUserRecordID() { + class MockContainer: CKContainer { + init(_: Bool = false) + {} + + override func fetchUserRecordID(completionHandler: @escaping (CKRecordID?, Error?) -> Void) { + completionHandler(dummy(), nil) + } + } + + let ex = expectation(description: "") + MockContainer().fetchUserRecordID().done { + XCTAssertEqual($0, dummy()) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } +} + + + +/////////////////////////////////////////////////////////////// resources + +private func dummy() -> CKRecordID { + return CKRecordID(recordName: "foo") +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.h b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.h new file mode 100644 index 00000000..811cd498 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.h @@ -0,0 +1,2 @@ +@class CKUserIdentity; +extern CKUserIdentity *PMKDiscoveredUserInfo(); diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.m b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.m new file mode 100644 index 00000000..c940c19b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CloudKit/Tests/infrastructure.m @@ -0,0 +1,5 @@ +@import CloudKit; + +CKUserIdentity *PMKDiscoveredUserInfo() { + return [CKUserIdentity alloc]; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.travis.yml new file mode 100644 index 00000000..9014cdae --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/.travis.yml @@ -0,0 +1,14 @@ +language: objective-c +osx_image: xcode9.4 +env: + - DESTINATION="arch=x86_64" PLATFORM=Mac + - DESTINATION="OS=11.4,name=iPhone 5s" PLATFORM=iOS +cache: + directories: + - Carthage +before_install: + - carthage bootstrap --cache-builds --no-use-binaries --platform $PLATFORM --verbose +install: + - xcodebuild -scheme PMKCoreBluetooth -destination "$DESTINATION" build +script: + - xcodebuild -scheme PMKCoreBluetooth -destination "$DESTINATION" test diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile new file mode 100644 index 00000000..2bfea98d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile.resolved new file mode 100644 index 00000000..a1be2061 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.3.3" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.pbxproj new file mode 100644 index 00000000..84b3d637 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.pbxproj @@ -0,0 +1,447 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKCoreBluetooth.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKCoreBluetooth.framework */; }; + 63D3789F1D5D5AEC005B0A44 /* CBCentralManager+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D3789E1D5D5AEC005B0A44 /* CBCentralManager+Promise.swift */; }; + 63D40DFB1D61290800E91E6E /* CBTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D40DFA1D61290800E91E6E /* CBTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKCoreBluetooth; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKCoreBluetooth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKCoreBluetooth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKCBTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKCBTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63D3789E1D5D5AEC005B0A44 /* CBCentralManager+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CBCentralManager+Promise.swift"; path = "Sources/CBCentralManager+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63D40DFA1D61290800E91E6E /* CBTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CBTests.swift; path = Tests/CBTests.swift; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKCoreBluetooth.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKCoreBluetooth.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKCBTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63D3789E1D5D5AEC005B0A44 /* CBCentralManager+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63D40DFA1D61290800E91E6E /* CBTests.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKCoreBluetooth */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCoreBluetooth" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKCoreBluetooth; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKCoreBluetooth.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKCBTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCBTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKCBTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKCBTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCoreBluetooth" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKCoreBluetooth */, + 63C7FFF11D5C020D003BAE60 /* PMKCBTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63D3789F1D5D5AEC005B0A44 /* CBCentralManager+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63D40DFB1D61290800E91E6E /* CBTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKCoreBluetooth */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreBluetooth; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreBluetooth; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCoreBluetooth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCoreBluetooth" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCBTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/xcshareddata/xcschemes/PMKCoreBluetooth.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/xcshareddata/xcschemes/PMKCoreBluetooth.xcscheme new file mode 100644 index 00000000..20ad62ba --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/PMKCoreBluetooth.xcodeproj/xcshareddata/xcschemes/PMKCoreBluetooth.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/README.markdown new file mode 100644 index 00000000..54e84d63 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/README.markdown @@ -0,0 +1,38 @@ +# DEPRECATED + +THe promises provided here are not-sensible. You should use a full delegate pattern for CoreBluetooth, one shot listening for connectivity is not wise since the accessory may disconnect at any time. + +# PromiseKit CoreBluetooth Extensions ![Build Status] + +This project adds promises to Apple’s CoreBluetooth framework. + +## CocoaPods + +```ruby +pod "PromiseKit/CoreBluetooth" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/CoreBluetooth" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKCoreBluetooth +``` + +```objc +// objc +@import PromiseKit; +@import PMKCoreBluetooth; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/CoreBluetooth.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Sources/CBCentralManager+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Sources/CBCentralManager+Promise.swift new file mode 100644 index 00000000..01e9ddc7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Sources/CBCentralManager+Promise.swift @@ -0,0 +1,29 @@ +import CoreBluetooth +#if !PMKCocoaPods +import PromiseKit +#endif + + +private class CentralManager: CBCentralManager, CBCentralManagerDelegate { + var retainCycle: CentralManager? + let (promise, fulfill) = Guarantee.pending() + + @objc func centralManagerDidUpdateState(_ manager: CBCentralManager) { + if manager.state != .unknown { + fulfill(manager) + } + } +} + +extension CBCentralManager { + /// A promise that fulfills when the state of CoreBluetooth changes + public class func state(options: [String: Any]? = [CBCentralManagerOptionShowPowerAlertKey: false]) -> Guarantee { + let manager = CentralManager(delegate: nil, queue: nil, options: options) + manager.delegate = manager + manager.retainCycle = manager + manager.promise.done { _ in + manager.retainCycle = nil + } + return manager.promise + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Tests/CBTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Tests/CBTests.swift new file mode 100644 index 00000000..15631564 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreBluetooth/Tests/CBTests.swift @@ -0,0 +1,10 @@ +import PMKCoreBluetooth +import CoreBluetooth +import XCTest + +class PMKCBTestCase: XCTestCase { + func test() { + // just test linking etc. + CBCentralManager.state() + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.travis.yml new file mode 100644 index 00000000..95c07613 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/.travis.yml @@ -0,0 +1,78 @@ +osx_image: xcode10.2 +language: swift +os: osx + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/CoreLocation/Sources + cp -R ../../../Sources Extensions/CoreLocation + pod lib lint --subspec=PromiseKit/CoreLocation --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKCoreLocation + xcode_project: PMKCoreLocation.xcodeproj + xcode_destination: platform=macOS + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.pbxproj new file mode 100644 index 00000000..5ea24599 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.pbxproj @@ -0,0 +1,476 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63199F0C1D5FF25C007E8A0E /* CLGeocoder+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63199F061D5FF25C007E8A0E /* CLGeocoder+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63199F0D1D5FF25C007E8A0E /* CLGeocoder+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63199F071D5FF25C007E8A0E /* CLGeocoder+AnyPromise.m */; }; + 63199F0E1D5FF25C007E8A0E /* CLGeocoder+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63199F081D5FF25C007E8A0E /* CLGeocoder+Promise.swift */; }; + 63199F0F1D5FF25C007E8A0E /* CLLocationManager+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63199F091D5FF25C007E8A0E /* CLLocationManager+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63199F101D5FF25C007E8A0E /* CLLocationManager+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63199F0A1D5FF25C007E8A0E /* CLLocationManager+AnyPromise.m */; }; + 63199F111D5FF25C007E8A0E /* CLLocationManager+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63199F0B1D5FF25C007E8A0E /* CLLocationManager+Promise.swift */; }; + 63199F161D5FF7B9007E8A0E /* CLGeocoderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63199F141D5FF7B9007E8A0E /* CLGeocoderTests.swift */; }; + 63199F171D5FF7B9007E8A0E /* CLLocationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63199F151D5FF7B9007E8A0E /* CLLocationManagerTests.swift */; }; + 6358AB7A1D5D4B6700B9B157 /* PMKCoreLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6358AB791D5D4B6700B9B157 /* PMKCoreLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63C7FFF71D5C020D003BAE60 /* PMKCoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKCoreLocation.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKCoreLocation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63199F061D5FF25C007E8A0E /* CLGeocoder+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CLGeocoder+AnyPromise.h"; path = "Sources/CLGeocoder+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63199F071D5FF25C007E8A0E /* CLGeocoder+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CLGeocoder+AnyPromise.m"; path = "Sources/CLGeocoder+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63199F081D5FF25C007E8A0E /* CLGeocoder+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CLGeocoder+Promise.swift"; path = "Sources/CLGeocoder+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63199F091D5FF25C007E8A0E /* CLLocationManager+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CLLocationManager+AnyPromise.h"; path = "Sources/CLLocationManager+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63199F0A1D5FF25C007E8A0E /* CLLocationManager+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CLLocationManager+AnyPromise.m"; path = "Sources/CLLocationManager+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63199F0B1D5FF25C007E8A0E /* CLLocationManager+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "CLLocationManager+Promise.swift"; path = "Sources/CLLocationManager+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63199F141D5FF7B9007E8A0E /* CLGeocoderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CLGeocoderTests.swift; path = Tests/CLGeocoderTests.swift; sourceTree = SOURCE_ROOT; }; + 63199F151D5FF7B9007E8A0E /* CLLocationManagerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CLLocationManagerTests.swift; path = Tests/CLLocationManagerTests.swift; sourceTree = SOURCE_ROOT; }; + 6358AB791D5D4B6700B9B157 /* PMKCoreLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKCoreLocation.h; path = Sources/PMKCoreLocation.h; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKCoreLocation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKCoreLocation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKCLTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKCLTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKCoreLocation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKCoreLocation.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKCLTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6358AB791D5D4B6700B9B157 /* PMKCoreLocation.h */, + 63199F061D5FF25C007E8A0E /* CLGeocoder+AnyPromise.h */, + 63199F071D5FF25C007E8A0E /* CLGeocoder+AnyPromise.m */, + 63199F081D5FF25C007E8A0E /* CLGeocoder+Promise.swift */, + 63199F091D5FF25C007E8A0E /* CLLocationManager+AnyPromise.h */, + 63199F0A1D5FF25C007E8A0E /* CLLocationManager+AnyPromise.m */, + 63199F0B1D5FF25C007E8A0E /* CLLocationManager+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63199F141D5FF7B9007E8A0E /* CLGeocoderTests.swift */, + 63199F151D5FF7B9007E8A0E /* CLLocationManagerTests.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63199F0F1D5FF25C007E8A0E /* CLLocationManager+AnyPromise.h in Headers */, + 63199F0C1D5FF25C007E8A0E /* CLGeocoder+AnyPromise.h in Headers */, + 6358AB7A1D5D4B6700B9B157 /* PMKCoreLocation.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKCoreLocation */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCoreLocation" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKCoreLocation; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKCoreLocation.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKCLTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCLTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKCLTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKCLTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCoreLocation" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKCoreLocation */, + 63C7FFF11D5C020D003BAE60 /* PMKCLTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63199F0E1D5FF25C007E8A0E /* CLGeocoder+Promise.swift in Sources */, + 63199F101D5FF25C007E8A0E /* CLLocationManager+AnyPromise.m in Sources */, + 63199F0D1D5FF25C007E8A0E /* CLGeocoder+AnyPromise.m in Sources */, + 63199F111D5FF25C007E8A0E /* CLLocationManager+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63199F161D5FF7B9007E8A0E /* CLGeocoderTests.swift in Sources */, + 63199F171D5FF7B9007E8A0E /* CLLocationManagerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKCoreLocation */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreLocation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreLocation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKCoreLocation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKCoreLocation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKCLTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/xcshareddata/xcschemes/PMKCoreLocation.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/xcshareddata/xcschemes/PMKCoreLocation.xcscheme new file mode 100644 index 00000000..f75a810f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/PMKCoreLocation.xcodeproj/xcshareddata/xcschemes/PMKCoreLocation.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Package.swift new file mode 100644 index 00000000..cb1c83fc --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Package.swift @@ -0,0 +1,30 @@ +// swift-tools-version:5.1 + +import PackageDescription + +let exclude = ["PMKCoreLocation.h"] + ["CLGeocoder", "CLLocationManager"].flatMap { + ["\($0)+AnyPromise.m", "\($0)+AnyPromise.h"] +} + +let package = Package( + name: "PMKCoreLocation", + products: [ + .library( + name: "PMKCoreLocation", + targets: ["PMKCoreLocation"]), + ], + dependencies: [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0"), + ], + targets: [ + .target( + name: "PMKCoreLocation", + dependencies: ["PromiseKit"], + path: "Sources", + exclude: exclude), + .testTarget( + name: "PMKCoreLocationTests", + dependencies: ["PMKCoreLocation"], + path: "Tests"), + ] +) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/README.markdown new file mode 100644 index 00000000..49df0de3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit CoreLocation Extensions ![Build Status] + +This project adds promises to Apple’s CoreLocation framework. + +## CocoaPods + +```ruby +pod "PromiseKit/CoreLocation", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/CoreLocation" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKCoreLocation +``` + +```objc +// objc +@import PromiseKit; +@import PMKCoreLocation; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/CoreLocation.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.h new file mode 100644 index 00000000..c2db32be --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.h @@ -0,0 +1,40 @@ +#import +#import + +/** + To import the `CLGecoder` category: + + use_frameworks! + pod "PromiseKit/CoreLocation" + + And then in your sources: + + @import PromiseKit; +*/ +@interface CLGeocoder (PromiseKit) + +/** + Submits a reverse-geocoding request for the specified location. + + @param location The location object containing the coordinate data to look up. + + @return A promise that thens two parameters: + + 1. The first placemark that resides at the specified location. + 2. The array of *all* placemarks that reside at the specified location. +*/ +- (AnyPromise *)reverseGeocode:(CLLocation *)location NS_REFINED_FOR_SWIFT; + +/** + Submits a forward-geocoding request using the specified address dictionary or address string. + + @param addressDictionaryOrAddressString The address dictionary or address string to look up. + + @return A promise that thens two parameters: + + 1. The first placemark that resides at the specified address. + 2. The array of *all* placemarks that reside at the specified address. +*/ +- (AnyPromise *)geocode:(id)addressDictionaryOrAddressString NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.m new file mode 100644 index 00000000..5b19f7a6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+AnyPromise.m @@ -0,0 +1,47 @@ +#import "CLGeocoder+AnyPromise.h" +#import +#import +#import + + +@implementation CLGeocoder (PromiseKit) + +- (AnyPromise *)reverseGeocode:(CLLocation *)location { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { + resolve(error ?: PMKManifold(placemarks.firstObject, placemarks)); + }]; + }]; +} + +- (AnyPromise *)geocode:(id)address { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + id handler = ^(NSArray *placemarks, NSError *error) { + resolve(error ?: PMKManifold(placemarks.firstObject, placemarks)); + }; + if ([address isKindOfClass:[NSDictionary class]]) { + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + [self geocodeAddressDictionary:address completionHandler:handler]; + #pragma clang diagnostic pop + } else { + [self geocodeAddressString:address completionHandler:handler]; + } + }]; +} + +@end + + + +@implementation CLGeocoder (PMKDeprecated) + ++ (AnyPromise *)reverseGeocode:(CLLocation *)location { + return [[CLGeocoder new] reverseGeocode:location]; +} + ++ (AnyPromise *)geocode:(id)input { + return [[CLGeocoder new] geocode:input]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+Promise.swift new file mode 100644 index 00000000..a1682262 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLGeocoder+Promise.swift @@ -0,0 +1,81 @@ +import CoreLocation.CLGeocoder +#if !PMKCocoaPods +import PromiseKit +#endif +#if os(iOS) || os(watchOS) || os(OSX) +import class Contacts.CNPostalAddress +#endif + +/** + To import the `CLGeocoder` category: + + use_frameworks! + pod "PromiseKit/CoreLocation" + + And then in your sources: + + import PromiseKit +*/ +extension CLGeocoder { + /// Submits a reverse-geocoding request for the specified location. + public func reverseGeocode(location: CLLocation) -> Promise<[CLPlacemark]> { + return Promise { seal in + reverseGeocodeLocation(location, completionHandler: seal.resolve) + } + } + + /// Submits a forward-geocoding request using the specified address dictionary. + @available(iOS, deprecated: 11.0) + public func geocode(_ addressDictionary: [String: String]) -> Promise<[CLPlacemark]> { + return Promise { seal in + geocodeAddressDictionary(addressDictionary, completionHandler: seal.resolve) + } + } + + /// Submits a forward-geocoding request using the specified address string. + public func geocode(_ addressString: String) -> Promise<[CLPlacemark]> { + return Promise { seal in + geocodeAddressString(addressString, completionHandler: seal.resolve) + } + } + + /// Submits a forward-geocoding request using the specified address string within the specified region. + public func geocode(_ addressString: String, region: CLRegion?) -> Promise<[CLPlacemark]> { + return Promise { seal in + geocodeAddressString(addressString, in: region, completionHandler: seal.resolve) + } + } + +#if !os(tvOS) && swift(>=3.2) + /// Submits a forward-geocoding request using the specified postal address. + @available(iOS 11.0, OSX 10.13, watchOS 4.0, *) + public func geocodePostalAddress(_ postalAddress: CNPostalAddress) -> Promise<[CLPlacemark]> { + return Promise { seal in + geocodePostalAddress(postalAddress, completionHandler: seal.resolve) + } + } + + /// Submits a forward-geocoding requesting using the specified locale and postal address + @available(iOS 11.0, OSX 10.13, watchOS 4.0, *) + public func geocodePostalAddress(_ postalAddress: CNPostalAddress, preferredLocale locale: Locale?) -> Promise<[CLPlacemark]> { + return Promise { seal in + geocodePostalAddress(postalAddress, preferredLocale: locale, completionHandler: seal.resolve) + } + } + + /// Submits a reverse-geocoding request for the specified location and a preferred locale. + @available(iOS 11.0, OSX 10.13, watchOS 4.0, *) + public func reverseGeocode(location: CLLocation, preferredLocale locale: Locale?) -> Promise<[CLPlacemark]> { + return Promise { seal in + reverseGeocodeLocation(location, preferredLocale: locale, completionHandler: seal.resolve) + } + } +#endif +} + +// TODO still not possible in Swift 3.2 +//extension CLError: CancellableError { +// public var isCancelled: Bool { +// return self == .geocodeCanceled +// } +//} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.h new file mode 100644 index 00000000..30649671 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.h @@ -0,0 +1,46 @@ +#import +#import + +/** + To import the `CLLocationManager` category: + + use_frameworks! + pod "PromiseKit/CoreLocation" + + And then in your sources: + + @import PromiseKit; +*/ +@interface CLLocationManager (PromiseKit) + +/** + Determines the device’s location waiting until the positional accuracy + of the measured locations is better than 500 meters. + + If your app has not yet asked the user for locational determination + permissions, PromiseKit calls `+requestWhenInUseAuthorization`, if + you need always permissions, you must call this yourself before + any use of this method, or the promise will be rejected. + + @return A promise that thens two parameters: + + 1. The most recent `CLLocation`. + 2. An array of all recent `CLLocations`. +*/ ++ (AnyPromise *)promise NS_REFINED_FOR_SWIFT; + + +/** + Determines the device’s location using the provided block to determine + when locations become acceptably accurate. + + With this variant you can wait for good accuracy or acceptable accuracy + (at your own discretion) if the `CLLocationManager` is taking too + long. For example, the user is not outside so you will never get 10 meter + accuracy, but it would be nice to wait a little just in case. + + - see +promise +*/ ++ (AnyPromise *)until:(BOOL(^)(CLLocation *))isLocationGoodBlock NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.m new file mode 100644 index 00000000..8266a603 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+AnyPromise.m @@ -0,0 +1,72 @@ +#import +#import "CLLocationManager+AnyPromise.h" +#import + +#if !(TARGET_OS_TV && (TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR)) + +@interface PMKLocationManager : CLLocationManager { +@public + PMKResolver resolve; + id retainCycle; + BOOL (^block)(CLLocation *); +} +@end + +@implementation PMKLocationManager + +#define PMKLocationManagerCleanup() \ + [manager stopUpdatingLocation]; \ + retainCycle = self.delegate = nil; + +- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { + NSMutableArray *okd = [NSMutableArray new]; + for (id location in locations) + if (block(location)) + [okd addObject:location]; + + if (okd.count) { + resolve(PMKManifold(okd.lastObject, okd)); + PMKLocationManagerCleanup(); + } +} + +- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { + // Apple docs say to ignore this error + if (error.code != kCLErrorLocationUnknown) { + resolve(error); + PMKLocationManagerCleanup(); + } +} + +- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { + [manager startUpdatingLocation]; +} + +@end + + + +@implementation CLLocationManager (PromiseKit) + ++ (AnyPromise *)promise { + return [self until:^BOOL(CLLocation *location){ + return location.horizontalAccuracy <= 500 && location.verticalAccuracy <= 500; + }]; +} + ++ (AnyPromise *)until:(BOOL(^)(CLLocation *))block { + PMKLocationManager *manager = [PMKLocationManager new]; + manager.delegate = manager; + manager->block = block; + manager->retainCycle = manager; +#if TARGET_OS_IPHONE + if ([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) + [manager requestWhenInUseAuthorization]; +#endif + [manager startUpdatingLocation]; + return [[AnyPromise alloc] initWithResolver:&manager->resolve]; +} + +@end + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+Promise.swift new file mode 100644 index 00000000..0095a2ad --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/CLLocationManager+Promise.swift @@ -0,0 +1,311 @@ +import CoreLocation.CLLocationManager +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `CLLocationManager` category: + + use_frameworks! + pod "PromiseKit/CoreLocation" + + And then in your sources: + + import PromiseKit +*/ +extension CLLocationManager { + + /// The type of location permission we are asking for + public enum RequestAuthorizationType { + /// Determine the authorization from the application’s plist + case automatic + /// Request always-authorization + case always + /// Request when-in-use-authorization + case whenInUse + } + + public enum PMKError: Error { + case notAuthorized + } + + /** + Request the current location. + - Note: to obtain a single location use `Promise.lastValue` + - Parameters: + - authorizationType: requestAuthorizationType: We read your Info plist and try to + determine the authorization type we should request automatically. If you + want to force one or the other, change this parameter from its default + value. + - block: A block by which to perform any filtering of the locations that are + returned. In order to only retrieve accurate locations, only return true if the + locations horizontal accuracy < 50 + - Returns: A new promise that fulfills with the most recent CLLocation that satisfies + the provided block if it exists. If the block does not exist, simply return the + last location. + */ + public class func requestLocation(authorizationType: RequestAuthorizationType = .automatic, satisfying block: ((CLLocation) -> Bool)? = nil) -> Promise<[CLLocation]> { + + func std() -> Promise<[CLLocation]> { + return LocationManager(satisfying: block).promise + } + + func auth() -> Promise { + #if os(macOS) + return Promise() + #else + func auth(type: PMKCLAuthorizationType) -> Promise { + return AuthorizationCatcher(type: type).promise.done(on: nil) { + switch $0 { + case .restricted, .denied: + throw PMKError.notAuthorized + default: + break + } + } + } + + switch authorizationType { + case .automatic: + switch Bundle.main.permissionType { + case .always, .both: + return auth(type: .always) + case .whenInUse: + return auth(type: .whenInUse) + } + case .whenInUse: + return auth(type: .whenInUse) + case .always: + return auth(type: .always) + } + #endif + } + + switch CLLocationManager.authorizationStatus() { + case .authorizedAlways, .authorizedWhenInUse: + return std() + case .notDetermined: + return auth().then(std) + case .denied, .restricted: + return Promise(error: PMKError.notAuthorized) + #if swift(>=5) + @unknown default: + fatalError() + #endif + } + } + + @available(*, deprecated, renamed: "requestLocation") + public class func promise(_ requestAuthorizationType: RequestAuthorizationType = .automatic, satisfying block: ((CLLocation) -> Bool)? = nil) -> Promise<[CLLocation]> { + return requestLocation(authorizationType: requestAuthorizationType, satisfying: block) + } +} + +private class LocationManager: CLLocationManager, CLLocationManagerDelegate { + let (promise, seal) = Promise<[CLLocation]>.pending() + let satisfyingBlock: ((CLLocation) -> Bool)? + + @objc fileprivate func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + if let block = satisfyingBlock { + let satisfiedLocations = locations.filter(block) + if !satisfiedLocations.isEmpty { + seal.fulfill(satisfiedLocations) + } else { + #if os(tvOS) + requestLocation() + #endif + } + } else { + seal.fulfill(locations) + } + } + + init(satisfying block: ((CLLocation) -> Bool)? = nil) { + satisfyingBlock = block + super.init() + delegate = self + #if !os(tvOS) + startUpdatingLocation() + #else + requestLocation() + #endif + _ = self.promise.ensure { + self.stopUpdatingLocation() + } + } + + @objc func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { + let (domain, code) = { ($0.domain, $0.code) }(error as NSError) + if code == CLError.locationUnknown.rawValue && domain == kCLErrorDomain { + // Apple docs say you should just ignore this error + } else { + seal.reject(error) + } + } +} + + +#if !os(macOS) + +extension CLLocationManager { + /** + Request CoreLocation authorization from the user + - Note: By default we try to determine the authorization type you want by inspecting your Info.plist + - Note: This method will not perform upgrades from “when-in-use” to “always” unless you specify `.always` for the value of `type`. + */ + @available(iOS 8, tvOS 9, watchOS 2, *) + public class func requestAuthorization(type requestedAuthorizationType: RequestAuthorizationType = .automatic) -> Guarantee { + + let currentStatus = CLLocationManager.authorizationStatus() + + func std(type: PMKCLAuthorizationType) -> Guarantee { + if currentStatus == .notDetermined { + return AuthorizationCatcher(type: type).promise + } else { + return .value(currentStatus) + } + } + + switch requestedAuthorizationType { + case .always: + func iOS11Check() -> Guarantee { + switch currentStatus { + case .notDetermined, .authorizedWhenInUse: + return AuthorizationCatcher(type: .always).promise + default: + return .value(currentStatus) + } + } + #if PMKiOS11 + // ^^ define PMKiOS11 if you deploy against the iOS 11 SDK + // otherwise the warning you get below cannot be removed + return iOS11Check() + #else + if #available(iOS 11, *) { + return iOS11Check() + } else { + return std(type: .always) + } + #endif + + case .whenInUse: + return std(type: .whenInUse) + + case .automatic: + if currentStatus == .notDetermined { + switch Bundle.main.permissionType { + case .both, .whenInUse: + return AuthorizationCatcher(type: .whenInUse).promise + case .always: + return AuthorizationCatcher(type: .always).promise + } + } else { + return .value(currentStatus) + } + } + } +} + +@available(iOS 8, *) +private class AuthorizationCatcher: CLLocationManager, CLLocationManagerDelegate { + let (promise, fulfill) = Guarantee.pending() + var retainCycle: AuthorizationCatcher? + let initialAuthorizationState = CLLocationManager.authorizationStatus() + + init(type: PMKCLAuthorizationType) { + super.init() + + func ask(type: PMKCLAuthorizationType) { + delegate = self + retainCycle = self + + switch type { + case .always: + #if os(tvOS) + fallthrough + #else + requestAlwaysAuthorization() + #endif + case .whenInUse: + requestWhenInUseAuthorization() + } + + promise.done { _ in + self.retainCycle = nil + } + } + + func iOS11Check() { + switch (initialAuthorizationState, type) { + case (.notDetermined, .always), (.authorizedWhenInUse, .always), (.notDetermined, .whenInUse): + ask(type: type) + default: + fulfill(initialAuthorizationState) + } + } + + #if PMKiOS11 + // ^^ define PMKiOS11 if you deploy against the iOS 11 SDK + // otherwise the warning you get below cannot be removed + iOS11Check() + #else + if #available(iOS 11, *) { + iOS11Check() + } else { + if initialAuthorizationState == .notDetermined { + ask(type: type) + } else { + fulfill(initialAuthorizationState) + } + } + #endif + } + + @objc fileprivate func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + // `didChange` is a lie; it fires this immediately with the current status. + if status != initialAuthorizationState { + fulfill(status) + } + } +} + +#endif + +private extension Bundle { + enum PermissionType { + case both + case always + case whenInUse + } + + var permissionType: PermissionType { + func hasInfoPlistKey(_ key: String) -> Bool { + let value = object(forInfoDictionaryKey: key) as? String ?? "" + return !value.isEmpty + } + + if hasInfoPlistKey("NSLocationAlwaysAndWhenInUseUsageDescription") { + return .both + } + if hasInfoPlistKey("NSLocationAlwaysUsageDescription") { + return .always + } + if hasInfoPlistKey("NSLocationWhenInUseUsageDescription") { + return .whenInUse + } + + if #available(iOS 11, *) { + NSLog("PromiseKit: warning: `NSLocationAlwaysAndWhenInUseUsageDescription` key not set") + } else { + NSLog("PromiseKit: warning: `NSLocationWhenInUseUsageDescription` key not set") + } + + // won't work, but we warned the user above at least + return .whenInUse + } +} + +private enum PMKCLAuthorizationType { + case always + case whenInUse +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/PMKCoreLocation.h b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/PMKCoreLocation.h new file mode 100644 index 00000000..a4ab5c91 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Sources/PMKCoreLocation.h @@ -0,0 +1,2 @@ +#import "CLLocationManager+AnyPromise.h" +#import "CLGeocoder+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLGeocoderTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLGeocoderTests.swift new file mode 100644 index 00000000..e7c13d8b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLGeocoderTests.swift @@ -0,0 +1,121 @@ +import PMKCoreLocation +import CoreLocation +import PromiseKit +import XCTest +#if os(iOS) || os(watchOS) || os(OSX) + import class Contacts.CNPostalAddress +#endif + +class CLGeocoderTests: XCTestCase { + func test_reverseGeocodeLocation() { + class MockGeocoder: CLGeocoder { + override func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().reverseGeocode(location: CLLocation()).done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_geocodeAddressDictionary() { + class MockGeocoder: CLGeocoder { + override func geocodeAddressDictionary(_ addressDictionary: [AnyHashable : Any], completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().geocode([:]).done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_geocodeAddressString() { + class MockGeocoder: CLGeocoder { + override func geocodeAddressString(_ addressString: String, completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().geocode("").done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + +#if !os(tvOS) && swift(>=3.2) + func test_geocodePostalAddress() { + guard #available(iOS 11.0, OSX 10.13, watchOS 4.0, *) else { return } + + class MockGeocoder: CLGeocoder { + override func geocodePostalAddress(_ postalAddress: CNPostalAddress, completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().geocodePostalAddress(CNPostalAddress()).done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_geocodePostalAddressLocale() { + guard #available(iOS 11.0, OSX 10.13, watchOS 4.0, *) else { return } + + class MockGeocoder: CLGeocoder { + override func geocodePostalAddress(_ postalAddress: CNPostalAddress, preferredLocale locale: Locale?, completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().geocodePostalAddress(CNPostalAddress(), preferredLocale: nil).done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test_reverseGeocodeLocationLocale() { + guard #available(iOS 11.0, OSX 10.13, watchOS 4.0, *) else { return } + + class MockGeocoder: CLGeocoder { + override func reverseGeocodeLocation(_ location: CLLocation, preferredLocale locale: Locale?, completionHandler: @escaping CLGeocodeCompletionHandler) { + after(.seconds(0)).done { + completionHandler([dummyPlacemark], nil) + } + } + } + + let ex = expectation(description: "") + MockGeocoder().reverseGeocode(location: CLLocation(), preferredLocale: nil).done { x in + XCTAssertEqual(x, [dummyPlacemark]) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } +#endif +} + +private let dummyPlacemark = CLPlacemark() diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLLocationManagerTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLLocationManagerTests.swift new file mode 100644 index 00000000..914af867 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/CLLocationManagerTests.swift @@ -0,0 +1,95 @@ +import PMKCoreLocation +import CoreLocation +import PromiseKit +import XCTest + +#if !os(tvOS) + +class Test_CLLocationManager_Swift: XCTestCase { + func test_fulfills_with_multiple_locations() { + swizzle(CLLocationManager.self, #selector(CLLocationManager.startUpdatingLocation)) { + swizzle(CLLocationManager.self, #selector(CLLocationManager.authorizationStatus), isClassMethod: true) { + let ex = expectation(description: "") + + CLLocationManager.requestLocation().done { x in + XCTAssertEqual(x, dummy) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + } + } + + func test_fufillsWithSatisfyingBlock() { + swizzle(CLLocationManager.self, #selector(CLLocationManager.startUpdatingLocation)) { + swizzle(CLLocationManager.self, #selector(CLLocationManager.authorizationStatus), isClassMethod: true) { + let ex = expectation(description: "") + let block: ((CLLocation) -> Bool) = { location in + return location.coordinate.latitude == dummy.last?.coordinate.latitude + } + CLLocationManager.requestLocation(satisfying: block).done({ locations in + locations.forEach { XCTAssert(block($0) == true, "Block should be successful for returned values") } + ex.fulfill() + }) + waitForExpectations(timeout: 1) + } + } + } + +#if os(iOS) + func test_requestAuthorization() { + let ex = expectation(description: "") + + CLLocationManager.requestAuthorization().done { + XCTAssertEqual($0, CLAuthorizationStatus.restricted) + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } +#endif +} + + +/////////////////////////////////////////////////////////////// resources +private let dummy = [CLLocation(latitude: 0, longitude: 0), CLLocation(latitude: 10, longitude: 20)] + +extension CLLocationManager { + @objc func pmk_startUpdatingLocation() { + after(.milliseconds(100)).done { + self.delegate!.locationManager?(self, didUpdateLocations: dummy) + } + } + + @objc static func pmk_authorizationStatus() -> CLAuthorizationStatus { + #if os(macOS) + return .authorized + #else + return .authorizedWhenInUse + #endif + } +} + + +/////////////////////////////////////////////////////////////// utilities +import ObjectiveC + +func swizzle(_ foo: AnyClass, _ from: Selector, isClassMethod: Bool = false, body: () -> Void) { + let originalMethod: Method + let swizzledMethod: Method + + if isClassMethod { + originalMethod = class_getClassMethod(foo, from)! + swizzledMethod = class_getClassMethod(foo, Selector("pmk_\(from)"))! + } else { + originalMethod = class_getInstanceMethod(foo, from)! + swizzledMethod = class_getInstanceMethod(foo, Selector("pmk_\(from)"))! + } + + method_exchangeImplementations(originalMethod, swizzledMethod) + body() + method_exchangeImplementations(swizzledMethod, originalMethod) +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/Entitlements.plist b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/Entitlements.plist new file mode 100644 index 00000000..76a15bb4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/CoreLocation/Tests/Entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.private.tcc.allow + + kTCCServiceAddressBook + kTCCServiceCalendar + kTCCServicePhotos + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.travis.yml new file mode 100644 index 00000000..50d170da --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/.travis.yml @@ -0,0 +1,78 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/EventKit/Sources + cp -R ../../../Sources Extensions/EventKit + pod lib lint --subspec=PromiseKit/EventKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKEventKit + xcode_project: PMKEventKit.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..dccf9512 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.pbxproj @@ -0,0 +1,450 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKEventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKEventKit.framework */; }; + 63E5176D1D5D58B600742F86 /* EKEventStore+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E5176C1D5D58B600742F86 /* EKEventStore+Promise.swift */; }; + 63E5176F1D5D58C000742F86 /* TestEventKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E5176E1D5D58C000742F86 /* TestEventKit.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKEventKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKEventKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKEventKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKEKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKEKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63E5176C1D5D58B600742F86 /* EKEventStore+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "EKEventStore+Promise.swift"; path = "Sources/EKEventStore+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63E5176E1D5D58C000742F86 /* TestEventKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestEventKit.swift; path = Tests/TestEventKit.swift; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKEventKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKEventKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKEKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63E5176C1D5D58B600742F86 /* EKEventStore+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63E5176E1D5D58C000742F86 /* TestEventKit.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKEventKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKEventKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKEventKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKEventKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKEKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKEKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKEKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKEKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKEventKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKEventKit */, + 63C7FFF11D5C020D003BAE60 /* PMKEKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63E5176D1D5D58B600742F86 /* EKEventStore+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63E5176F1D5D58C000742F86 /* TestEventKit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKEventKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.EventKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.EventKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKEventKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKEventKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKEKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/xcshareddata/xcschemes/PMKEventKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/xcshareddata/xcschemes/PMKEventKit.xcscheme new file mode 100644 index 00000000..2c856d0d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/PMKEventKit.xcodeproj/xcshareddata/xcschemes/PMKEventKit.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Package.swift new file mode 100644 index 00000000..6e9f5641 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Package.swift @@ -0,0 +1,21 @@ +// swift-tools-version:4.2 + +import PackageDescription + +let name = "PMKEventKit" + +let pkg = Package(name: name) +pkg.products = [ + .library(name: name, targets: [name]), +] +pkg.swiftLanguageVersions = [.v4, .v4_2] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0") +] + +let target: Target = .target(name: name) +target.path = "Sources" +target.exclude = ["Tests"] +target.dependencies = ["PromiseKit"] + +pkg.targets = [target] \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/README.markdown new file mode 100644 index 00000000..20e66ac0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit EventKit Extensions ![Build Status] + +This project adds promises to Apple’s EventKit framework. + +## CocoaPods + +```ruby +pod "PromiseKit/EventKit" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/PMKEventKit" ~> 4.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKEventKit +``` + +```objc +// objc +@import PromiseKit; +@import PMKEventKit; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/PMKEventKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Sources/EKEventStore+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Sources/EKEventStore+Promise.swift new file mode 100644 index 00000000..732d07a5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Sources/EKEventStore+Promise.swift @@ -0,0 +1,41 @@ +// +// EKEventStore+Promise.swift +// PromiseKit +// +// Created by Lammert Westerhoff on 16/02/16. +// Copyright © 2016 Max Howell. All rights reserved. +// + +import EventKit +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import `EKEventStore`: + + pod "PromiseKit/EventKit" + + And then in your sources: + + import PromiseKit + */ +extension EKEventStore { + + /** + Requests access to the event store. + + - Returns: A promise that fulfills with the resulting EKAuthorizationStatus. + */ + public func requestAccess(to entityType: EKEntityType) -> Promise { + return Promise { seal in + requestAccess(to: entityType) { granted, error in + if let error = error { + seal.reject(error) + } else { + seal.fulfill(EKEventStore.authorizationStatus(for: entityType)) + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/Entitlements.plist b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/Entitlements.plist new file mode 100644 index 00000000..76a15bb4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/Entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.private.tcc.allow + + kTCCServiceAddressBook + kTCCServiceCalendar + kTCCServicePhotos + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/TestEventKit.swift b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/TestEventKit.swift new file mode 100644 index 00000000..b50f58da --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/EventKit/Tests/TestEventKit.swift @@ -0,0 +1,19 @@ +import PMKEventKit +import PromiseKit +import EventKit +import XCTest + +class Test_EventKit_Swift: XCTestCase { + func test() { + #if os(OSX) + //FIXME can't make this succeed on Travis :( + // needs Entitlements, but then I can't get it to sign + // so, we'll just test linkage + EKEventStore().requestAccess(to: .event) + #else + let ex = expectation(description: "") + EKEventStore().requestAccess(to: .event).ensure(ex.fulfill) + waitForExpectations(timeout: 30) + #endif + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.codecov.yml b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.codecov.yml new file mode 100644 index 00000000..278f3f60 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.codecov.yml @@ -0,0 +1,26 @@ +ignore: + - "Tests" + +codecov: + notify: + require_ci_to_pass: yes + +coverage: + precision: 1 + round: up + range: "70...100" + + status: + project: yes + patch: yes + changes: no + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: off diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.gitignore new file mode 100644 index 00000000..30f50040 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.travis.yml new file mode 100644 index 00000000..a3e84dc7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/.travis.yml @@ -0,0 +1,147 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - swiftpm + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --version '~> 1.8.0' + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Foundation/Sources + cp -R ../../../Sources Extensions/Foundation + pod lib lint --subspec=PromiseKit/Foundation --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + - <<: *pod + osx_image: xcode11 + env: SWIFT=5.1 + + - &linux + stage: swiftpm + env: SWIFT_BUILD_VERSION=3 SWIFT_VERSION=4.0 + # ^^ we have some source-conditionals for this version + name: Linux / Swift 3.2.0 + os: linux + dist: trusty + sudo: required + language: generic + before_install: + eval "$(curl -sL https://swiftenv.fuller.li/install.sh)" + script: + swift build -Xswiftc -swift-version -Xswiftc $SWIFT_BUILD_VERSION + - <<: *linux + env: SWIFT_BUILD_VERSION=3 SWIFT_VERSION=4.0.3 + name: Linux / Swift 3.2.3 + - <<: *linux + env: SWIFT_BUILD_VERSION=3 SWIFT_VERSION=4.1.2 + name: Linux / Swift 3.3 + - <<: *linux + env: SWIFT_BUILD_VERSION=3 SWIFT_VERSION=4.2 + name: Linux / Swift 3.4 + - <<: *linux + env: SWIFT_BUILD_VERSION=4 SWIFT_VERSION=4.0 + name: Linux / Swift 4.0.0 + # ^^ we have some source-conditionals for this version + - <<: *linux + env: SWIFT_BUILD_VERSION=4 SWIFT_VERSION=4.0.3 + name: Linux / Swift 4.0.3 + - <<: *linux + env: SWIFT_BUILD_VERSION=4 SWIFT_VERSION=4.1.2 + name: Linux / Swift 4.1 + - <<: *linux + env: SWIFT_BUILD_VERSION=4 SWIFT_VERSION=4.2 + name: Linux / Swift 4.2 + - <<: *linux + env: SWIFT_BUILD_VERSION=5 SWIFT_VERSION=5.0 + name: Linux / Swift 5.0 + - <<: *linux + env: SWIFT_BUILD_VERSION=5 SWIFT_VERSION=5.1 + name: Linux / Swift 5.1 + + - &swiftpm + stage: swiftpm + name: Xcode 8.3 / SwiftPM + os: osx + osx_image: xcode8.3 + language: objective-c + script: swift build + - <<: *swiftpm + name: Xcode 9.4 / SwiftPM + osx_image: xcode9.4 + - <<: *swiftpm + name: Xcode 10.0 / SwiftPM + osx_image: xcode10 + - <<: *swiftpm + name: Xcode 11.0 / SwiftPM + osx_image: xcode11 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + - <<: *carthage + osx_image: xcode11 + + - &test + stage: test + xcode_scheme: PMKFoundation + xcode_project: PMKFoundation.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: | + carthage bootstrap --cache-builds --no-use-binaries + after_success: + bash <(curl -s https://codecov.io/bash); + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.private b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.private new file mode 100644 index 00000000..7ad353e5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.private @@ -0,0 +1 @@ +github "AliSoftware/OHHTTPStubs" ~> 7.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.resolved new file mode 100644 index 00000000..47a3dc3b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Cartfile.resolved @@ -0,0 +1,2 @@ +github "AliSoftware/OHHTTPStubs" "7.0.0" +github "mxcl/PromiseKit" "6.11.0" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/LICENSE new file mode 100644 index 00000000..da14072b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/LICENSE @@ -0,0 +1,20 @@ +Copyright 2018-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.pbxproj new file mode 100644 index 00000000..8ac1bf01 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.pbxproj @@ -0,0 +1,507 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6364F66F1D68B8DF008D7B94 /* NSNotificationCenter+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6364F66C1D68B8DF008D7B94 /* NSNotificationCenter+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6364F6701D68B8DF008D7B94 /* NSTask+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6364F66D1D68B8DF008D7B94 /* NSTask+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6364F6711D68B8DF008D7B94 /* NSURLSession+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6364F66E1D68B8DF008D7B94 /* NSURLSession+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63C700031D5C021F003BAE60 /* TestNSNotificationCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFFD1D5C021F003BAE60 /* TestNSNotificationCenter.swift */; }; + 63C700041D5C021F003BAE60 /* TestNSObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFFE1D5C021F003BAE60 /* TestNSObject.swift */; }; + 63C700051D5C021F003BAE60 /* TestNSTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFFF1D5C021F003BAE60 /* TestNSTask.swift */; }; + 63C700081D5C021F003BAE60 /* TestNSURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */; }; + 63C7FFDC1D5C00F2003BAE60 /* afterlife.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFCE1D5C00F2003BAE60 /* afterlife.swift */; }; + 63C7FFDE1D5C00F2003BAE60 /* NSNotificationCenter+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFD01D5C00F2003BAE60 /* NSNotificationCenter+AnyPromise.m */; }; + 63C7FFDF1D5C00F2003BAE60 /* NSNotificationCenter+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFD11D5C00F2003BAE60 /* NSNotificationCenter+Promise.swift */; }; + 63C7FFE01D5C00F2003BAE60 /* NSObject+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFD21D5C00F2003BAE60 /* NSObject+Promise.swift */; }; + 63C7FFE21D5C00F2003BAE60 /* NSTask+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFD41D5C00F2003BAE60 /* NSTask+AnyPromise.m */; }; + 63C7FFE31D5C00F2003BAE60 /* Process+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFD51D5C00F2003BAE60 /* Process+Promise.swift */; }; + 63C7FFE81D5C00F2003BAE60 /* NSURLSession+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFDA1D5C00F2003BAE60 /* NSURLSession+AnyPromise.m */; }; + 63C7FFE91D5C00F2003BAE60 /* NSURLSession+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C7FFDB1D5C00F2003BAE60 /* NSURLSession+Promise.swift */; }; + 63C7FFED1D5C00FD003BAE60 /* PMKFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 63C7FFEB1D5C00FD003BAE60 /* PMKFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63C7FFF71D5C020D003BAE60 /* PMKFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKFoundation.framework */; }; + 63CAF1061D682F9600D3835B /* TestNSURLSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 63CAF1051D682F9600D3835B /* TestNSURLSession.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6364F66C1D68B8DF008D7B94 /* NSNotificationCenter+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+AnyPromise.h"; path = "Sources/NSNotificationCenter+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 6364F66D1D68B8DF008D7B94 /* NSTask+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSTask+AnyPromise.h"; path = "Sources/NSTask+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 6364F66E1D68B8DF008D7B94 /* NSURLSession+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSURLSession+AnyPromise.h"; path = "Sources/NSURLSession+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestNSURLSession.swift; path = Tests/TestNSURLSession.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKFoundation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFCE1D5C00F2003BAE60 /* afterlife.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = afterlife.swift; path = Sources/afterlife.swift; sourceTree = SOURCE_ROOT; }; + 63C7FFD01D5C00F2003BAE60 /* NSNotificationCenter+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+AnyPromise.m"; path = "Sources/NSNotificationCenter+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63C7FFD11D5C00F2003BAE60 /* NSNotificationCenter+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSNotificationCenter+Promise.swift"; path = "Sources/NSNotificationCenter+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C7FFD21D5C00F2003BAE60 /* NSObject+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSObject+Promise.swift"; path = "Sources/NSObject+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C7FFD41D5C00F2003BAE60 /* NSTask+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSTask+AnyPromise.m"; path = "Sources/NSTask+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63C7FFD51D5C00F2003BAE60 /* Process+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Process+Promise.swift"; path = "Sources/Process+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C7FFDA1D5C00F2003BAE60 /* NSURLSession+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURLSession+AnyPromise.m"; path = "Sources/NSURLSession+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63C7FFDB1D5C00F2003BAE60 /* NSURLSession+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSURLSession+Promise.swift"; path = "Sources/NSURLSession+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C7FFEB1D5C00FD003BAE60 /* PMKFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKFoundation.h; path = Sources/PMKFoundation.h; sourceTree = SOURCE_ROOT; }; + 63C7FFF21D5C020D003BAE60 /* PMKNSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKNSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFFD1D5C021F003BAE60 /* TestNSNotificationCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestNSNotificationCenter.swift; path = Tests/TestNSNotificationCenter.swift; sourceTree = SOURCE_ROOT; }; + 63C7FFFE1D5C021F003BAE60 /* TestNSObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestNSObject.swift; path = Tests/TestNSObject.swift; sourceTree = SOURCE_ROOT; }; + 63C7FFFF1D5C021F003BAE60 /* TestNSTask.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestNSTask.swift; path = Tests/TestNSTask.swift; sourceTree = SOURCE_ROOT; }; + 63CAF1051D682F9600D3835B /* TestNSURLSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestNSURLSession.m; path = Tests/TestNSURLSession.m; sourceTree = SOURCE_ROOT; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8131D5C0C4E00503216 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKFoundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8131D5C0C4E00503216 /* Cartfile.private */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKFoundation.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKNSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63C7FFCE1D5C00F2003BAE60 /* afterlife.swift */, + 63C7FFD51D5C00F2003BAE60 /* Process+Promise.swift */, + 6364F66C1D68B8DF008D7B94 /* NSNotificationCenter+AnyPromise.h */, + 63C7FFD01D5C00F2003BAE60 /* NSNotificationCenter+AnyPromise.m */, + 63C7FFD11D5C00F2003BAE60 /* NSNotificationCenter+Promise.swift */, + 63C7FFD21D5C00F2003BAE60 /* NSObject+Promise.swift */, + 6364F66D1D68B8DF008D7B94 /* NSTask+AnyPromise.h */, + 63C7FFD41D5C00F2003BAE60 /* NSTask+AnyPromise.m */, + 6364F66E1D68B8DF008D7B94 /* NSURLSession+AnyPromise.h */, + 63C7FFDA1D5C00F2003BAE60 /* NSURLSession+AnyPromise.m */, + 63C7FFDB1D5C00F2003BAE60 /* NSURLSession+Promise.swift */, + 63C7FFEB1D5C00FD003BAE60 /* PMKFoundation.h */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63C7FFFD1D5C021F003BAE60 /* TestNSNotificationCenter.swift */, + 63C7FFFE1D5C021F003BAE60 /* TestNSObject.swift */, + 63C7FFFF1D5C021F003BAE60 /* TestNSTask.swift */, + 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */, + 63CAF1051D682F9600D3835B /* TestNSURLSession.m */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFED1D5C00FD003BAE60 /* PMKFoundation.h in Headers */, + 6364F66F1D68B8DF008D7B94 /* NSNotificationCenter+AnyPromise.h in Headers */, + 6364F6711D68B8DF008D7B94 /* NSURLSession+AnyPromise.h in Headers */, + 6364F6701D68B8DF008D7B94 /* NSTask+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKFoundation */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKFoundation" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKFoundation; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKFoundation.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKNSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKNSTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKNSTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKNSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKFoundation" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKFoundation */, + 63C7FFF11D5C020D003BAE60 /* PMKNSTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + OHHTTPStubs, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFDF1D5C00F2003BAE60 /* NSNotificationCenter+Promise.swift in Sources */, + 63C7FFDC1D5C00F2003BAE60 /* afterlife.swift in Sources */, + 63C7FFDE1D5C00F2003BAE60 /* NSNotificationCenter+AnyPromise.m in Sources */, + 63C7FFE91D5C00F2003BAE60 /* NSURLSession+Promise.swift in Sources */, + 63C7FFE31D5C00F2003BAE60 /* Process+Promise.swift in Sources */, + 63C7FFE01D5C00F2003BAE60 /* NSObject+Promise.swift in Sources */, + 63C7FFE81D5C00F2003BAE60 /* NSURLSession+AnyPromise.m in Sources */, + 63C7FFE21D5C00F2003BAE60 /* NSTask+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C700051D5C021F003BAE60 /* TestNSTask.swift in Sources */, + 63C700031D5C021F003BAE60 /* TestNSNotificationCenter.swift in Sources */, + 63C700081D5C021F003BAE60 /* TestNSURLSession.swift in Sources */, + 63CAF1061D682F9600D3835B /* TestNSURLSession.m in Sources */, + 63C700041D5C021F003BAE60 /* TestNSObject.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKFoundation */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.4; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.4; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKNSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/xcshareddata/xcschemes/PMKFoundation.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/xcshareddata/xcschemes/PMKFoundation.xcscheme new file mode 100644 index 00000000..741434bb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/PMKFoundation.xcodeproj/xcshareddata/xcschemes/PMKFoundation.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package.swift new file mode 100644 index 00000000..6072eb00 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package.swift @@ -0,0 +1,23 @@ +import PackageDescription + +let package = Package( + name: "PMKFoundation", + dependencies: [ + .Package(url: "https://github.com/mxcl/PromiseKit.git", majorVersion: 6) + ], + swiftLanguageVersions: [3, 4], + exclude: [ + "Sources/NSNotificationCenter+AnyPromise.m", + "Sources/NSTask+AnyPromise.m", + "Sources/NSURLSession+AnyPromise.m", + "Sources/PMKFoundation.h", + "Tests" // currently SwiftPM is not savvy to having a single test… + ] +) + +#if os(Linux) +package.exclude += [ + "Sources/afterlife.swift", + "Sources/NSObject+Promise.swift" +] +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-4.2.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-4.2.swift new file mode 100644 index 00000000..2b8df6ab --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-4.2.swift @@ -0,0 +1,32 @@ +// swift-tools-version:4.2 + +import PackageDescription + +let pkg = Package(name: "PMKFoundation") +pkg.products = [ + .library(name: "PMKFoundation", targets: ["PMKFoundation"]), +] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", .upToNextMajor(from: "6.0.0")) +] +pkg.swiftLanguageVersions = [.v3, .v4, .v4_2, .version("5")] + +let target: Target = .target(name: "PMKFoundation") +target.path = "Sources" +target.exclude = ["NSNotificationCenter", "NSTask", "NSURLSession"].flatMap { + ["\($0)+AnyPromise.m", "\($0)+AnyPromise.h"] +} +target.exclude.append("PMKFoundation.h") + +target.dependencies = [ + "PromiseKit" +] + +#if os(Linux) +target.exclude += [ + "afterlife.swift", + "NSObject+Promise.swift" +] +#endif + +pkg.targets = [target] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-5.0.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-5.0.swift new file mode 100644 index 00000000..9800d38e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Package@swift-5.0.swift @@ -0,0 +1,36 @@ +// swift-tools-version:5.0 + +import PackageDescription + +let pkg = Package(name: "PMKFoundation") +pkg.products = [ + .library(name: "PMKFoundation", targets: ["PMKFoundation"]), +] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.8.3") +] +pkg.swiftLanguageVersions = [.v4, .v4_2, .v5] + +let target: Target = .target(name: "PMKFoundation") +target.path = "Sources" +target.exclude = ["NSNotificationCenter", "NSTask", "NSURLSession"].flatMap { + ["\($0)+AnyPromise.m", "\($0)+AnyPromise.h"] +} +target.exclude.append("PMKFoundation.h") + +target.dependencies = [ + "PromiseKit" +] + +#if os(Linux) +target.exclude += [ + "afterlife.swift", + "NSObject+Promise.swift" +] +#endif + +pkg.targets = [target] + +pkg.platforms = [ + .macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v2) +] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/README.markdown new file mode 100644 index 00000000..d726925a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/README.markdown @@ -0,0 +1,47 @@ +# PromiseKit Foundation Extensions ![Build Status] + +This project adds promises to the Swift Foundation framework. + +We support iOS, tvOS, watchOS, macOS and Linux, Swift 3.0, 3.1, 3.2, 4.0, 4.1, +4.2 and 5.0. + +## CococaPods + +```ruby +pod "PromiseKit/Foundation", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is +needed. + +## Carthage + +> Note we can no longer support Swift 3 with Carthage due to Xcode 10.2 dropping +it and our only being able to provide a single `.xcodeproj`. + +```ruby +github "PromiseKit/Foundation" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKFoundation +``` + +```objc +// objc +@import PromiseKit; +@import PMKFoundation; +``` + +## SwiftPM + +```swift +package.dependencies.append(.package(url: "https://github.com/PromiseKit/Foundation.git", from: "3.0.0")) +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/Foundation.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.h new file mode 100644 index 00000000..351a93b9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.h @@ -0,0 +1,44 @@ +#import +#import + + +/** + To import the `NSNotificationCenter` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSNotificationCenter` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + #import +*/ +@interface NSNotificationCenter (PromiseKit) +/** + Observe the named notification once. + + [NSNotificationCenter once:UIKeyboardWillShowNotification].then(^(id note, id userInfo){ + UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; + CGFloat duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; + + return [UIView promiseWithDuration:duration delay:0.0 options:(curve << 16) animations:^{ + + }]; + }); + + @warning *Important* Promises only resolve once. If you need your block to execute more than once then use `-addObserverForName:object:queue:usingBlock:`. + + @param notificationName The name of the notification for which to register the observer. + + @return A promise that fulfills with two parameters: + + 1. The NSNotification object. + 2. The NSNotification’s userInfo property. +*/ ++ (AnyPromise *)once:(NSString *)notificationName NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.m new file mode 100644 index 00000000..f8aee710 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+AnyPromise.m @@ -0,0 +1,18 @@ +#import +#import +#import "PMKFoundation.h" + +@implementation NSNotificationCenter (PromiseKit) + ++ (AnyPromise *)once:(NSString *)name { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + __block id identifier; + identifier = [[NSNotificationCenter defaultCenter] addObserverForName:name object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { + [[NSNotificationCenter defaultCenter] removeObserver:identifier name:name object:nil]; + identifier = nil; + resolve(PMKManifold(note, note.userInfo)); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+Promise.swift new file mode 100644 index 00000000..3b7f8434 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSNotificationCenter+Promise.swift @@ -0,0 +1,33 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `NSNotificationCenter` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSNotificationCenter` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + import PromiseKit +*/ +extension NotificationCenter { + /// Observe the named notification once + public func observe(once name: Notification.Name, object: Any? = nil) -> Guarantee { + let (promise, fulfill) = Guarantee.pending() + #if os(Linux) && ((swift(>=4.0) && !swift(>=4.0.1)) || (swift(>=3.0) && !swift(>=3.2.1))) + let id = addObserver(forName: name, object: object, queue: nil, usingBlock: fulfill) + #else + let id = addObserver(forName: name, object: object, queue: nil, using: fulfill) + #endif + promise.done { _ in self.removeObserver(id) } + return promise + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSObject+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSObject+Promise.swift new file mode 100644 index 00000000..135719bf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSObject+Promise.swift @@ -0,0 +1,57 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `NSObject` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSObject` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + import PromiseKit +*/ +extension NSObject { + /** + - Returns: A promise that resolves when the provided keyPath changes. + - Warning: *Important* The promise must not outlive the object under observation. + - SeeAlso: Apple’s KVO documentation. + */ + public func observe(_: PMKNamespacer, keyPath: String) -> Guarantee { + return Guarantee { KVOProxy(observee: self, keyPath: keyPath, resolve: $0) } + } +} + +private class KVOProxy: NSObject { + var retainCycle: KVOProxy? + let fulfill: (Any?) -> Void + + @discardableResult + init(observee: NSObject, keyPath: String, resolve: @escaping (Any?) -> Void) { + fulfill = resolve + super.init() + observee.addObserver(self, forKeyPath: keyPath, options: NSKeyValueObservingOptions.new, context: pointer) + retainCycle = self + } + + fileprivate override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if let change = change, context == pointer { + defer { retainCycle = nil } + fulfill(change[NSKeyValueChangeKey.newKey]) + if let object = object as? NSObject, let keyPath = keyPath { + object.removeObserver(self, forKeyPath: keyPath) + } + } + } + + private lazy var pointer: UnsafeMutableRawPointer = { + return Unmanaged.passUnretained(self).toOpaque() + }() +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.h new file mode 100644 index 00000000..60368977 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.h @@ -0,0 +1,53 @@ +#if TARGET_OS_MAC && !TARGET_OS_EMBEDDED && !TARGET_OS_SIMULATOR && !TARGET_OS_UIKITFORMAC + +#import +#import + +#define PMKTaskErrorLaunchPathKey @"PMKTaskErrorLaunchPathKey" +#define PMKTaskErrorArgumentsKey @"PMKTaskErrorArgumentsKey" +#define PMKTaskErrorStandardOutputKey @"PMKTaskErrorStandardOutputKey" +#define PMKTaskErrorStandardErrorKey @"PMKTaskErrorStandardErrorKey" +#define PMKTaskErrorExitStatusKey @"PMKTaskErrorExitStatusKey" + +/** + To import the `NSTask` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSTask` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + #import +*/ +@interface NSTask (PromiseKit) + +/** + Launches the receiver and resolves when it exits. + + If the task fails the promise is rejected with code `PMKTaskError`, and + `userInfo` keys: `PMKTaskErrorStandardOutputKey`, + `PMKTaskErrorStandardErrorKey` and `PMKTaskErrorExitStatusKey`. + + NSTask *task = [NSTask new]; + task.launchPath = @"/usr/bin/basename"; + task.arguments = @[@"/usr/bin/sleep"]; + [task promise].then(^(NSString *stdout){ + //… + }); + + @return A promise that fulfills with three parameters: + + 1) The stdout interpreted as a UTF8 string. + 2) The stderr interpreted as a UTF8 string. + 3) The stdout as `NSData`. +*/ +- (AnyPromise *)promise NS_REFINED_FOR_SWIFT; + +@end + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.m new file mode 100644 index 00000000..fa291d36 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSTask+AnyPromise.m @@ -0,0 +1,59 @@ +#import +#import +#import +#import +#import + +#if TARGET_OS_MAC && !TARGET_OS_EMBEDDED && !TARGET_OS_SIMULATOR && !TARGET_OS_UIKITFORMAC + +#import "NSTask+AnyPromise.h" + +@implementation NSTask (PromiseKit) + +- (AnyPromise *)promise { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + self.standardOutput = [NSPipe pipe]; + self.standardError = [NSPipe pipe]; + self.terminationHandler = ^(NSTask *task){ + id stdoutData = [[task.standardOutput fileHandleForReading] readDataToEndOfFile]; + id stdoutString = [[NSString alloc] initWithData:stdoutData encoding:NSUTF8StringEncoding]; + id stderrData = [[task.standardError fileHandleForReading] readDataToEndOfFile]; + id stderrString = [[NSString alloc] initWithData:stderrData encoding:NSUTF8StringEncoding]; + + if (task.terminationReason == NSTaskTerminationReasonExit && self.terminationStatus == 0) { + resolve(PMKManifold(stdoutString, stderrString, stdoutData)); + } else { + id cmd = [NSMutableArray arrayWithObject:task.launchPath]; + [cmd addObjectsFromArray:task.arguments]; + cmd = [cmd componentsJoinedByString:@" "]; + + id info = @{ + NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Failed executing: %@.", cmd], + PMKTaskErrorStandardOutputKey: stdoutString, + PMKTaskErrorStandardErrorKey: stderrString, + PMKTaskErrorExitStatusKey: @(task.terminationStatus), + }; + + resolve([NSError errorWithDomain:PMKErrorDomain code:PMKTaskError userInfo:info]); + } + }; + + #if __clang_major__ >= 9 + if (@available(macOS 10.13, *)) { + NSError *error = nil; + + if (![self launchAndReturnError:&error]) { + resolve(error); + } + } else { + [self launch]; + } + #else + [self launch]; // might @throw + #endif + }]; +} + +@end + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.h new file mode 100644 index 00000000..71952d48 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.h @@ -0,0 +1,79 @@ +#import +#import +#import +#import + +#define PMKURLErrorFailingURLResponseKey @"PMKURLErrorFailingURLResponseKey" +#define PMKURLErrorFailingDataKey @"PMKURLErrorFailingDataKey" +#define PMKURLErrorFailingStringKey @"PMKURLErrorFailingStringKey" +#define PMKJSONErrorJSONObjectKey @"PMKJSONErrorJSONObjectKey" + +/** + Really we shouldn’t assume JSON for (application|text)/(x-)javascript, + really we should return a String of Javascript. However in practice + for the apps we write it *will be* JSON. Thus if you actually want + a Javascript String, use the promise variant of our category functions. + */ +#define PMKHTTPURLResponseIsJSON(rsp) [@[@"application/json", @"text/json", @"text/javascript", @"application/x-javascript", @"application/javascript"] containsObject:[rsp MIMEType]] +#define PMKHTTPURLResponseIsImage(rsp) [@[@"image/tiff", @"image/jpeg", @"image/gif", @"image/png", @"image/ico", @"image/x-icon", @"image/bmp", @"image/x-bmp", @"image/x-xbitmap", @"image/x-win-bitmap"] containsObject:[rsp MIMEType]] +#define PMKHTTPURLResponseIsText(rsp) [[rsp MIMEType] hasPrefix:@"text/"] + +#define PMKJSONDeserializationOptions ((NSJSONReadingOptions)(NSJSONReadingAllowFragments | NSJSONReadingMutableContainers)) + + +/** + To import the `NSURLSession` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSURLConnection` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + #import +*/ +@interface NSURLSession (PromiseKit) + +/** + Creates a task that retrieves the contents of a URL based on the + specified URL request object. + + PromiseKit automatically deserializes the raw HTTP data response into the + appropriate rich data type based on the mime type the server provides. + Thus if the response is JSON you will get the deserialized JSON response. + PromiseKit supports decoding into strings, JSON and UIImages. + + However if your server does not provide a rich content-type, you will + just get `NSData`. This is rare, but a good example we came across was + downloading files from Dropbox. + + PromiseKit goes to quite some lengths to provide good `NSError` objects + for error conditions at all stages of the HTTP to rich-data type + pipeline. We provide the following additional `userInfo` keys as + appropriate: + + - `PMKURLErrorFailingDataKey` + - `PMKURLErrorFailingStringKey` + - `PMKURLErrorFailingURLResponseKey` + + [[NSURLConnection sharedSession] promiseDataTaskWithRequest:rq].then(^(id response){ + // response is probably an NSDictionary deserialized from JSON + }); + + @param request The URL request. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + + @see https://github.com/mxcl/OMGHTTPURLRQ +*/ +- (AnyPromise *)promiseDataTaskWithRequest:(NSURLRequest *)request NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.m new file mode 100644 index 00000000..901eb281 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+AnyPromise.m @@ -0,0 +1,113 @@ +#import +#import +#import +#import "NSURLSession+AnyPromise.h" +#import +#import +#import +#import +#import +#import +#import +#import + +@implementation NSURLSession (PromiseKit) + +- (AnyPromise *)promiseDataTaskWithRequest:(NSURLRequest *)rq { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [[self dataTaskWithRequest:rq completionHandler:^(NSData *data, id rsp, NSError *urlError){ + assert(![NSThread isMainThread]); + + PMKResolver fulfiller = ^(id responseObject){ + resolve(PMKManifold(responseObject, rsp, data)); + }; + PMKResolver rejecter = ^(NSError *error){ + id userInfo = error.userInfo.mutableCopy ?: [NSMutableDictionary new]; + if (data) userInfo[PMKURLErrorFailingDataKey] = data; + if (rsp) userInfo[PMKURLErrorFailingURLResponseKey] = rsp; + error = [NSError errorWithDomain:error.domain code:error.code userInfo:userInfo]; + resolve(error); + }; + + NSStringEncoding (^stringEncoding)(void) = ^NSStringEncoding{ + id encodingName = [rsp textEncodingName]; + if (encodingName) { + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)encodingName); + if (encoding != kCFStringEncodingInvalidId) + return CFStringConvertEncodingToNSStringEncoding(encoding); + } + return NSUTF8StringEncoding; + }; + + if (urlError) { + rejecter(urlError); + } else if (![rsp isKindOfClass:[NSHTTPURLResponse class]]) { + fulfiller(data); + } else if ([rsp statusCode] < 200 || [rsp statusCode] >= 300) { + id info = @{ + NSLocalizedDescriptionKey: @"The server returned a bad HTTP response code", + NSURLErrorFailingURLStringErrorKey: rq.URL.absoluteString, + NSURLErrorFailingURLErrorKey: rq.URL + }; + id err = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorBadServerResponse userInfo:info]; + rejecter(err); + } else if (PMKHTTPURLResponseIsJSON(rsp)) { + // work around ever-so-common Rails workaround: https://github.com/rails/rails/issues/1742 + if ([rsp expectedContentLength] == 1 && [data isEqualToData:[NSData dataWithBytes:" " length:1]]) + return fulfiller(nil); + + NSError *err = nil; + id json = [NSJSONSerialization JSONObjectWithData:data options:PMKJSONDeserializationOptions error:&err]; + if (!err) { + fulfiller(json); + } else { + id userInfo = err.userInfo.mutableCopy; + if (data) { + NSString *string = [[NSString alloc] initWithData:data encoding:stringEncoding()]; + if (string) + userInfo[PMKURLErrorFailingStringKey] = string; + } + long long length = [rsp expectedContentLength]; + id bytes = length <= 0 ? @"" : [NSString stringWithFormat:@"%lld bytes", length]; + id fmt = @"The server claimed a %@ JSON response, but decoding failed with: %@"; + userInfo[NSLocalizedDescriptionKey] = [NSString stringWithFormat:fmt, bytes, userInfo[NSLocalizedDescriptionKey]]; + err = [NSError errorWithDomain:err.domain code:err.code userInfo:userInfo]; + rejecter(err); + } + #ifdef UIKIT_EXTERN + } else if (PMKHTTPURLResponseIsImage(rsp)) { + UIImage *image = [[UIImage alloc] initWithData:data]; + image = [[UIImage alloc] initWithCGImage:[image CGImage] scale:image.scale orientation:image.imageOrientation]; + if (image) + fulfiller(image); + else { + id info = @{ + NSLocalizedDescriptionKey: @"The server returned invalid image data", + NSURLErrorFailingURLStringErrorKey: rq.URL.absoluteString, + NSURLErrorFailingURLErrorKey: rq.URL + }; + id err = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:info]; + rejecter(err); + } + #endif + } else if (PMKHTTPURLResponseIsText(rsp)) { + id str = [[NSString alloc] initWithData:data encoding:stringEncoding()]; + if (str) + fulfiller(str); + else { + id info = @{ + NSLocalizedDescriptionKey: @"The server returned invalid string data", + NSURLErrorFailingURLStringErrorKey: rq.URL.absoluteString, + NSURLErrorFailingURLErrorKey: rq.URL + }; + id err = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorCannotDecodeContentData userInfo:info]; + rejecter(err); + } + } else { + fulfiller(data); + } + }] resume]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+Promise.swift new file mode 100644 index 00000000..150654fb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/NSURLSession+Promise.swift @@ -0,0 +1,246 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif +#if swift(>=4.1) +#if canImport(FoundationNetworking) +import FoundationNetworking +#endif +#endif + +/** + To import the `NSURLSession` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSURLSession` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + import PromiseKit +*/ +extension URLSession { + /** + Example usage: + + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.compactMap { data, _ in + try JSONSerialization.jsonObject(with: data) as? [String: Any] + }.then { json in + //… + } + + We recommend the use of [OMGHTTPURLRQ] which allows you to construct correct REST requests: + + firstly { + let rq = OMGHTTPURLRQ.POST(url, json: parameters) + URLSession.shared.dataTask(.promise, with: rq) + }.then { data, urlResponse in + //… + } + + We provide a convenience initializer for `String` specifically for this promise: + + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.compactMap(String.init).then { string in + // decoded per the string encoding specified by the server + }.then { string in + print("response: string") + } + + Other common types can be easily decoded using compactMap also: + + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.compactMap { + UIImage(data: $0) + }.then { + self.imageView.image = $0 + } + + Though if you do decode the image this way, we recommend inflating it on a background thread + first as this will improve main thread performance when rendering the image: + + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.compactMap(on: QoS.userInitiated) { data, _ in + guard let img = UIImage(data: data) else { return nil } + _ = cgImage?.dataProvider?.data + return img + }.then { + self.imageView.image = $0 + } + + - Parameter convertible: A URL or URLRequest. + - Returns: A promise that represents the URL request. + - SeeAlso: [OMGHTTPURLRQ] + - Remark: We deliberately don’t provide a `URLRequestConvertible` for `String` because in our experience, you should be explicit with this error path to make good apps. + + [OMGHTTPURLRQ]: https://github.com/mxcl/OMGHTTPURLRQ + */ + public func dataTask(_: PMKNamespacer, with convertible: URLRequestConvertible) -> Promise<(data: Data, response: URLResponse)> { + return Promise { dataTask(with: convertible.pmkRequest, completionHandler: adapter($0)).resume() } + } + + public func uploadTask(_: PMKNamespacer, with convertible: URLRequestConvertible, from data: Data) -> Promise<(data: Data, response: URLResponse)> { + return Promise { uploadTask(with: convertible.pmkRequest, from: data, completionHandler: adapter($0)).resume() } + } + + public func uploadTask(_: PMKNamespacer, with convertible: URLRequestConvertible, fromFile file: URL) -> Promise<(data: Data, response: URLResponse)> { + return Promise { uploadTask(with: convertible.pmkRequest, fromFile: file, completionHandler: adapter($0)).resume() } + } + + /// - Remark: we force a `to` parameter because Apple deletes the downloaded file immediately after the underyling completion handler returns. + /// - Note: we do not create the destination directory for you, because we move the file with FileManager.moveItem which changes it behavior depending on the directory status of the URL you provide. So create your own directory first! + public func downloadTask(_: PMKNamespacer, with convertible: URLRequestConvertible, to saveLocation: URL) -> Promise<(saveLocation: URL, response: URLResponse)> { + return Promise { seal in + downloadTask(with: convertible.pmkRequest, completionHandler: { tmp, rsp, err in + if let error = err { + seal.reject(error) + } else if let rsp = rsp, let tmp = tmp { + do { + try FileManager.default.moveItem(at: tmp, to: saveLocation) + seal.fulfill((saveLocation, rsp)) + } catch { + seal.reject(error) + } + } else { + seal.reject(PMKError.invalidCallingConvention) + } + }).resume() + } + } +} + + +public protocol URLRequestConvertible { + var pmkRequest: URLRequest { get } +} +extension URLRequest: URLRequestConvertible { + public var pmkRequest: URLRequest { return self } +} +extension URL: URLRequestConvertible { + public var pmkRequest: URLRequest { return URLRequest(url: self) } +} + + +#if !os(Linux) +public extension String { + /** + - Remark: useful when converting a `URLSession` response into a `String` + + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.map(String.init).done { + print($0) + } + */ + init?(data: Data, urlResponse: URLResponse) { + guard let str = String(bytes: data, encoding: urlResponse.stringEncoding ?? .utf8) else { + return nil + } + self.init(str) + } +} + +private extension URLResponse { + var stringEncoding: String.Encoding? { + guard let encodingName = textEncodingName else { return nil } + let encoding = CFStringConvertIANACharSetNameToEncoding(encodingName as CFString) + guard encoding != kCFStringEncodingInvalidId else { return nil } + return String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(encoding)) + } +} +#endif + +private func adapter(_ seal: Resolver<(data: T, response: U)>) -> (T?, U?, Error?) -> Void { + return { t, u, e in + if let t = t, let u = u { + seal.fulfill((t, u)) + } else if let e = e { + seal.reject(e) + } else { + seal.reject(PMKError.invalidCallingConvention) + } + } +} + + +#if swift(>=3.1) +public enum PMKHTTPError: Error, LocalizedError, CustomStringConvertible { + case badStatusCode(Int, Data, HTTPURLResponse) + + public var errorDescription: String? { + func url(_ rsp: URLResponse) -> String { + return rsp.url?.absoluteString ?? "nil" + } + switch self { + case .badStatusCode(401, _, let response): + return "Unauthorized (\(url(response))" + case .badStatusCode(let code, _, let response): + return "Invalid HTTP response (\(code)) for \(url(response))." + } + } + +#if swift(>=4.0) + public func decodeResponse(_ t: T.Type, decoder: JSONDecoder = JSONDecoder()) -> T? { + switch self { + case .badStatusCode(_, let data, _): + return try? decoder.decode(t, from: data) + } + } +#endif + + //TODO rename responseJSON + public var jsonDictionary: Any? { + switch self { + case .badStatusCode(_, let data, _): + return try? JSONSerialization.jsonObject(with: data) + } + } + + var responseBodyString: String? { + switch self { + case .badStatusCode(_, let data, _): + return String(data: data, encoding: .utf8) + } + } + + public var failureReason: String? { + return responseBodyString + } + + public var description: String { + switch self { + case .badStatusCode(let code, let data, let response): + var dict: [String: Any] = [ + "Status Code": code, + "Body": String(data: data, encoding: .utf8) ?? "\(data.count) bytes" + ] + dict["URL"] = response.url + dict["Headers"] = response.allHeaderFields + return " \(NSDictionary(dictionary: dict))" // as NSDictionary makes the output look like NSHTTPURLResponse looks + } + } +} + +public extension Promise where T == (data: Data, response: URLResponse) { + func validate() -> Promise { + return map { + guard let response = $0.response as? HTTPURLResponse else { return $0 } + switch response.statusCode { + case 200..<300: + return $0 + case let code: + throw PMKHTTPError.badStatusCode(code, $0.data, response) + } + } + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/PMKFoundation.h b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/PMKFoundation.h new file mode 100644 index 00000000..8796c0d1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/PMKFoundation.h @@ -0,0 +1,3 @@ +#import "NSNotificationCenter+AnyPromise.h" +#import "NSURLSession+AnyPromise.h" +#import "NSTask+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/Process+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/Process+Promise.swift new file mode 100644 index 00000000..03cab3cf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/Process+Promise.swift @@ -0,0 +1,190 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +#if os(macOS) + +/** + To import the `Process` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `Process` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + import PromiseKit + */ +extension Process { + /** + Launches the receiver and resolves when it exits. + + let proc = Process() + proc.launchPath = "/bin/ls" + proc.arguments = ["/bin"] + proc.launch(.promise).compactMap { std in + String(data: std.out.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + }.then { stdout in + print(str) + } + */ + public func launch(_: PMKNamespacer) -> Promise<(out: Pipe, err: Pipe)> { + let (stdout, stderr) = (Pipe(), Pipe()) + + do { + standardOutput = stdout + standardError = stderr + + #if swift(>=4.0) + if #available(OSX 10.13, *) { + try run() + } else if let path = launchPath, FileManager.default.isExecutableFile(atPath: path) { + launch() + } else { + throw PMKError.notExecutable(launchPath) + } + #else + guard let path = launchPath, FileManager.default.isExecutableFile(atPath: path) else { + throw PMKError.notExecutable(launchPath) + } + launch() + #endif + } catch { + return Promise(error: error) + } + + + var q: DispatchQueue { + if #available(macOS 10.10, iOS 8.0, tvOS 9.0, watchOS 2.0, *) { + return DispatchQueue.global(qos: .default) + } else { + return DispatchQueue.global(priority: .default) + } + } + + return Promise { seal in + q.async { + self.waitUntilExit() + + guard self.terminationReason == .exit, self.terminationStatus == 0 else { + let stdoutData = try? self.readDataFromPipe(stdout) + let stderrData = try? self.readDataFromPipe(stderr) + + let stdoutString = stdoutData.flatMap { (data: Data) -> String? in String(data: data, encoding: .utf8) } + let stderrString = stderrData.flatMap { (data: Data) -> String? in String(data: data, encoding: .utf8) } + + return seal.reject(PMKError.execution(process: self, standardOutput: stdoutString, standardError: stderrString)) + } + seal.fulfill((stdout, stderr)) + } + } + } + + private func readDataFromPipe(_ pipe: Pipe) throws -> Data { + let handle = pipe.fileHandleForReading + defer { handle.closeFile() } + + // Someday, NSFileHandle will probably be updated with throwing equivalents to its read and write methods, + // as NSTask has, to avoid raising exceptions and crashing the app. + // Unfortunately that day has not yet come, so use the underlying BSD calls for now. + + let fd = handle.fileDescriptor + + let bufsize = 1024 * 8 + let buf = UnsafeMutablePointer.allocate(capacity: bufsize) + + #if swift(>=4.1) + defer { buf.deallocate() } + #else + defer { buf.deallocate(capacity: bufsize) } + #endif + + var data = Data() + + while true { + let bytesRead = read(fd, buf, bufsize) + + if bytesRead == 0 { + break + } + + if bytesRead < 0 { + throw POSIXError.Code(rawValue: errno).map { POSIXError($0) } ?? CocoaError(.fileReadUnknown) + } + + data.append(buf, count: bytesRead) + } + + return data + } + + /** + The error generated by PromiseKit’s `Process` extension + */ + public enum PMKError { + /// NOT AVAILABLE ON 10.13 and above because Apple provide this error handling themselves + case notExecutable(String?) + case execution(process: Process, standardOutput: String?, standardError: String?) + } +} + + +extension Process.PMKError: LocalizedError { + public var errorDescription: String? { + switch self { + case .notExecutable(let path?): + return "File not executable: \(path)" + case .notExecutable(nil): + return "No launch path specified" + case .execution(process: let task, standardOutput: _, standardError: _): + return "Failed executing: `\(task)` (\(task.terminationStatus))." + } + } +} + +public extension Promise where T == (out: Pipe, err: Pipe) { + func print() -> Promise { + return tap { result in + switch result { + case .fulfilled(let raw): + let stdout = String(data: raw.out.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + let stderr = String(data: raw.err.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + Swift.print("stdout: `\(stdout ?? "")`") + Swift.print("stderr: `\(stderr ?? "")`") + case .rejected(let err): + Swift.print(err) + } + } + } +} + +extension Process { + /// Provided because Foundation’s is USELESS + open override var description: String { + let launchPath = self.launchPath ?? "$0" + var args = [launchPath] + arguments.flatMap{ args += $0 } + return args.map { arg in + let contains: Bool + #if swift(>=3.2) + contains = arg.contains(" ") + #else + contains = arg.characters.contains(" ") + #endif + if contains { + return "\"\(arg)\"" + } else if arg == "" { + return "\"\"" + } else { + return arg + } + }.joined(separator: " ") + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/afterlife.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/afterlife.swift new file mode 100644 index 00000000..232c8da9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Sources/afterlife.swift @@ -0,0 +1,26 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + - Returns: A promise that resolves when the provided object deallocates + - Important: The promise is not guarenteed to resolve immediately when the provided object is deallocated. So you cannot write code that depends on exact timing. + */ +public func after(life object: NSObject) -> Guarantee { + var reaper = objc_getAssociatedObject(object, &handle) as? GrimReaper + if reaper == nil { + reaper = GrimReaper() + objc_setAssociatedObject(object, &handle, reaper, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + return reaper!.promise +} + +private var handle: UInt8 = 0 + +private class GrimReaper: NSObject { + deinit { + fulfill(()) + } + let (promise, fulfill) = Guarantee.pending() +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSNotificationCenter.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSNotificationCenter.swift new file mode 100644 index 00000000..3851029d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSNotificationCenter.swift @@ -0,0 +1,22 @@ +import PMKFoundation +import Foundation +import PromiseKit +import XCTest + +class NSNotificationCenterTests: XCTestCase { + func test() { + let ex = expectation(description: "") + let userInfo = ["a": 1] + + NotificationCenter.default.observe(once: PMKTestNotification).done { value in + XCTAssertEqual(value.userInfo?.count, 1) + ex.fulfill() + } + + NotificationCenter.default.post(name: PMKTestNotification, object: nil, userInfo: userInfo) + + waitForExpectations(timeout: 1) + } +} + +private let PMKTestNotification = Notification.Name("PMKTestNotification") diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSObject.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSObject.swift new file mode 100644 index 00000000..fc8806e6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSObject.swift @@ -0,0 +1,76 @@ +import PMKFoundation +import Foundation +import PromiseKit +import XCTest + +class NSObjectTests: XCTestCase { + func testKVO() { + let ex = expectation(description: "") + + let foo = Foo() + foo.observe(.promise, keyPath: "bar").done { newValue in + XCTAssertEqual(newValue as? String, "moo") + ex.fulfill() + }.catch { _ in + XCTFail() + } + foo.bar = "moo" + + waitForExpectations(timeout: 1) + } + + func testAfterlife() { + let ex = expectation(description: "") + var killme: NSObject! + + autoreleasepool { + + func innerScope() { + killme = NSObject() + after(life: killme).done { _ in + //… + ex.fulfill() + } + } + + innerScope() + + after(.milliseconds(200)).done { + killme = nil + } + } + + waitForExpectations(timeout: 1) + } + + func testMultiObserveAfterlife() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + var killme: NSObject! + + autoreleasepool { + + func innerScope() { + killme = NSObject() + after(life: killme).done { _ in + ex1.fulfill() + } + after(life: killme).done { _ in + ex2.fulfill() + } + } + + innerScope() + + after(.milliseconds(200)).done { + killme = nil + } + } + + waitForExpectations(timeout: 1) + } +} + +private class Foo: NSObject { + @objc dynamic var bar: String = "bar" +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSTask.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSTask.swift new file mode 100644 index 00000000..8d94c489 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSTask.swift @@ -0,0 +1,50 @@ +import PMKFoundation +import Foundation +import PromiseKit +import XCTest + +#if os(macOS) + +class NSTaskTests: XCTestCase { + func test1() { + let ex = expectation(description: "") + let task = Process() + task.launchPath = "/usr/bin/basename" + task.arguments = ["/foo/doe/bar"] + task.launch(.promise).done { stdout, _ in + let stdout = String(data: stdout.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + XCTAssertEqual(stdout, "bar\n") + ex.fulfill() + } + waitForExpectations(timeout: 10) + } + + func test2() { + let ex = expectation(description: "") + let dir = "PMKAbsentDirectory" + + let task = Process() + task.launchPath = "/bin/ls" + task.arguments = [dir] + + task.launch(.promise).done { _ in + XCTFail() + }.catch { err in + do { + throw err + } catch Process.PMKError.execution(let proc, let stdout, let stderr) { + let expectedStderr = "ls: \(dir): No such file or directory\n" + + XCTAssertEqual(stderr, expectedStderr) + XCTAssertEqual(proc.terminationStatus, 1) + XCTAssertEqual(stdout?.count ?? 0, 0) + } catch { + XCTFail() + } + ex.fulfill() + } + waitForExpectations(timeout: 10) + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.m b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.m new file mode 100644 index 00000000..314de699 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.m @@ -0,0 +1,55 @@ +@import PMKFoundation; +@import OHHTTPStubs; +@import Foundation; +@import PromiseKit; +@import XCTest; + +@implementation NSURLSessionTests: XCTestCase + +- (void)tearDown { + [OHHTTPStubs removeAllStubs]; +} + +- (void)test200 { + id stubData = [NSData dataWithBytes:"a" length:1]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *rq){ + return [rq.URL.host isEqualToString:@"example.com"]; + } withStubResponse:^(NSURLRequest *request){ + return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:@{@"Content-Type": @"text/html"}]; + }]; + + id ex = [self expectationWithDescription:@""]; + id rq = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com"]]; + + [[NSURLSession sharedSession] promiseDataTaskWithRequest:rq].then(^{ + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)testBadJSON { + id stubData = [NSData dataWithBytes:"[a: 3]" length:1]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *rq){ + return [rq.URL.host isEqualToString:@"example.com"]; + } withStubResponse:^(NSURLRequest *request){ + return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + id ex = [self expectationWithDescription:@""]; + id rq = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com"]]; + + [[NSURLSession sharedSession] promiseDataTaskWithRequest:rq].catch(^(NSError *err){ + XCTAssertEqualObjects(err.domain, NSCocoaErrorDomain); //TODO this is why we should replace this domain + XCTAssertEqual(err.code, 3840); + XCTAssertEqualObjects(err.userInfo[PMKURLErrorFailingDataKey], stubData); + XCTAssertNotNil(err.userInfo[PMKURLErrorFailingURLResponseKey]); + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.swift b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.swift new file mode 100644 index 00000000..f6906b55 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Foundation/Tests/TestNSURLSession.swift @@ -0,0 +1,76 @@ +import PMKFoundation +import OHHTTPStubs +import PromiseKit +import XCTest + +class NSURLSessionTests: XCTestCase { + func test1() { + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + } + + let ex = expectation(description: "") + let rq = URLRequest(url: URL(string: "http://example.com")!) + firstly { + URLSession.shared.dataTask(.promise, with: rq) + }.compactMap { + try JSONSerialization.jsonObject(with: $0.data) as? NSDictionary + }.done { rsp in + XCTAssertEqual(json, rsp) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test2() { + + // test that URLDataPromise chains thens + // this test because I don’t trust the Swift compiler + + let dummy = ("fred" as NSString).data(using: String.Encoding.utf8.rawValue)! + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(data: dummy, statusCode: 200, headers: [:]) + } + + let ex = expectation(description: "") + let rq = URLRequest(url: URL(string: "http://example.com")!) + + after(.milliseconds(100)).then { + URLSession.shared.dataTask(.promise, with: rq) + }.done { x in + XCTAssertEqual(x.data, dummy) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + /// test that our convenience String constructor applies + func test3() { + let dummy = "fred" + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + let data = dummy.data(using: .utf8)! + return OHHTTPStubsResponse(data: data, statusCode: 200, headers: [:]) + } + + let ex = expectation(description: "") + let rq = URLRequest(url: URL(string: "http://example.com")!) + + after(.milliseconds(100)).then { + URLSession.shared.dataTask(.promise, with: rq) + }.map(String.init).done { + XCTAssertEqual($0, dummy) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + override func tearDown() { + OHHTTPStubs.removeAllStubs() + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.travis.yml new file mode 100644 index 00000000..91caf3a7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/.travis.yml @@ -0,0 +1,76 @@ +osx_image: xcode10.2 +language: swift +os: osx + +branches: + only: + - master +stages: + - lint + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: cocoapods + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/HealthKit/Sources + cp -R ../../../Sources Extensions/HealthKit + pod lib lint --subspec=PromiseKit/HealthKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS,macOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - stage: test + xcode_scheme: PMKHealthKit + xcode_project: PMKHealthKit.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Info.plist new file mode 100644 index 00000000..20b05ecd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..8d563879 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.pbxproj @@ -0,0 +1,450 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6384FB811D5D4F6D00453755 /* HealthKit+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6384FB801D5D4F6D00453755 /* HealthKit+Promise.swift */; }; + 6384FB831D5D4F8B00453755 /* TestHealthKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6384FB821D5D4F8B00453755 /* TestHealthKit.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKHealthKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKHealthKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKWatchConnectivity; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6384FB801D5D4F6D00453755 /* HealthKit+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "HealthKit+Promise.swift"; path = "Sources/HealthKit+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 6384FB821D5D4F8B00453755 /* TestHealthKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestHealthKit.swift; path = Tests/TestHealthKit.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKHealthKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKHealthKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKHKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKHealthKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKHealthKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6384FB801D5D4F6D00453755 /* HealthKit+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 6384FB821D5D4F8B00453755 /* TestHealthKit.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKHealthKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKHealthKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKHealthKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKHealthKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKHKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKHKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKHKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKHealthKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKHealthKit */, + 63C7FFF11D5C020D003BAE60 /* PMKHKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6384FB811D5D4F6D00453755 /* HealthKit+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6384FB831D5D4F8B00453755 /* TestHealthKit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKHealthKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKHealthKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKHealthKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKHKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/xcshareddata/xcschemes/PMKHealthKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/xcshareddata/xcschemes/PMKHealthKit.xcscheme new file mode 100644 index 00000000..53cd1049 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/PMKHealthKit.xcodeproj/xcshareddata/xcschemes/PMKHealthKit.xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/README.markdown new file mode 100644 index 00000000..a457ad4e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit HealthKit Extensions ![Build Status] + +This project adds promises to Apple’s HealthKit framework. + +## CocoaPods + +```ruby +pod "PromiseKit/HealthKit" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/PMKHealthKit" ~> 1.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKHealthKit +``` + +```objc +// objc +@import PromiseKit; +@import PMKHealthKit; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/PMKHealthKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Sources/HealthKit+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Sources/HealthKit+Promise.swift new file mode 100644 index 00000000..b83fb9f8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Sources/HealthKit+Promise.swift @@ -0,0 +1,83 @@ +import HealthKit +#if !PMKCocoaPods +import PromiseKit +#endif + +public extension HKHealthStore { + func requestAuthorization(toShare typesToShare: Set?, read typesToRead: Set?) -> Promise { + return Promise { seal in + requestAuthorization(toShare: typesToShare, read: typesToRead, completion: seal.resolve) + } + } + +#if os(iOS) + func enableBackgroundDelivery(for type: HKObjectType, frequency: HKUpdateFrequency) -> Promise { + return Promise { seal in + enableBackgroundDelivery(for: type, frequency: frequency, withCompletion: seal.resolve) + } + } +#endif +} + +public extension HKStatisticsQuery { + static func promise(quantityType: HKQuantityType, quantitySamplePredicate: NSPredicate? = nil, options: HKStatisticsOptions = [], healthStore: HKHealthStore = .init()) -> Promise { + return Promise { seal in + let query = HKStatisticsQuery(quantityType: quantityType, quantitySamplePredicate: quantitySamplePredicate, options: options) { + seal.resolve($1, $2) + } + healthStore.execute(query) + } + } +} + +public extension HKAnchoredObjectQuery { + static func promise(type: HKSampleType, predicate: NSPredicate? = nil, anchor: HKQueryAnchor? = nil, limit: Int = HKObjectQueryNoLimit, healthStore: HKHealthStore = .init()) -> Promise<([HKSample], [HKDeletedObject], HKQueryAnchor)> { + return Promise { seal in + let query = HKAnchoredObjectQuery(type: type, predicate: predicate, anchor: anchor, limit: limit) { + if let a = $1, let b = $2, let c = $3 { + seal.fulfill((a, b, c)) + } else if let e = $4 { + seal.reject(e) + } else { + seal.reject(PMKError.invalidCallingConvention) + } + } + healthStore.execute(query) + } + } + +} + +public extension HKStatisticsCollectionQuery { + func promise(healthStore: HKHealthStore = .init()) -> Promise { + return Promise { seal in + initialResultsHandler = { + seal.resolve($1, $2) + } + healthStore.execute(self) + } + } +} + +public extension HKSampleQuery { + static func promise(sampleType: HKSampleType, predicate: NSPredicate? = nil, limit: Int = HKObjectQueryNoLimit, sortDescriptors: [NSSortDescriptor]? = nil, healthStore: HKHealthStore = .init()) -> Promise<[HKSample]> { + return Promise { seal in + let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: limit, sortDescriptors: sortDescriptors) { + seal.resolve($1, $2) + } + healthStore.execute(query) + } + } +} + +@available(iOS 9.3, iOSApplicationExtension 9.3, watchOSApplicationExtension 2.2, *) +public extension HKActivitySummaryQuery { + static func promise(predicate: NSPredicate, healthStore: HKHealthStore = .init()) -> Promise<[HKActivitySummary]> { + return Promise { seal in + let query = HKActivitySummaryQuery(predicate: predicate) { + seal.resolve($1, $2) + } + healthStore.execute(query) + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Tests/TestHealthKit.swift b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Tests/TestHealthKit.swift new file mode 100644 index 00000000..727a09dd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HealthKit/Tests/TestHealthKit.swift @@ -0,0 +1,4 @@ +import PMKHealthKit +import PromiseKit +import HealthKit +import XCTest diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.travis.yml new file mode 100644 index 00000000..5a0f7450 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/.travis.yml @@ -0,0 +1,67 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode9.4 + env: SWIFT=3.3 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/HomeKit/Sources + cp -R ../../../Sources Extensions/HomeKit + pod lib lint --subspec=PromiseKit/HomeKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.4 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKHomeKit + xcode_project: PMKHomeKit.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + after_success: + bash <(curl -s https://codecov.io/bash); + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Carthage.xcconfig new file mode 100644 index 00000000..de9f238c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Carthage.xcconfig @@ -0,0 +1,6 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..cf145647 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.pbxproj @@ -0,0 +1,480 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63C7FFF71D5C020D003BAE60 /* PMKHomeKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKHomeKit.framework */; }; + 7D619865235E333E001E0F2E /* HMActionSet+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D619864235E333E001E0F2E /* HMActionSet+Promise.swift */; }; + 7D619867235E33AC001E0F2E /* HMTrigger+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D619866235E33AC001E0F2E /* HMTrigger+Promise.swift */; }; + 7D619869235E3401001E0F2E /* HMEventTrigger+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D619868235E3401001E0F2E /* HMEventTrigger+Promise.swift */; }; + 8312EA1521096DF000A47DDF /* HMAccessoryBrowserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8312EA1421096DF000A47DDF /* HMAccessoryBrowserTests.swift */; }; + 8312EA19210974F600A47DDF /* UtilsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8312EA18210974F600A47DDF /* UtilsTests.swift */; }; + 838C29D32103FB9700CE5309 /* HMAcessoryBrowser+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838C29CE2103FB9600CE5309 /* HMAcessoryBrowser+Promise.swift */; }; + 838C29D42103FB9700CE5309 /* HMHome+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838C29CF2103FB9700CE5309 /* HMHome+Promise.swift */; }; + 838C29D52103FB9700CE5309 /* HMCharacteristic+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838C29D02103FB9700CE5309 /* HMCharacteristic+Promise.swift */; }; + 838C29D62103FB9700CE5309 /* HMHomeManager+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838C29D12103FB9700CE5309 /* HMHomeManager+Promise.swift */; }; + 838C29D72103FB9700CE5309 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 838C29D22103FB9700CE5309 /* Utils.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKCoreLocation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKHomeKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKHomeKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKHKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 7D619864235E333E001E0F2E /* HMActionSet+Promise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HMActionSet+Promise.swift"; sourceTree = ""; }; + 7D619866235E33AC001E0F2E /* HMTrigger+Promise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HMTrigger+Promise.swift"; sourceTree = ""; }; + 7D619868235E3401001E0F2E /* HMEventTrigger+Promise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HMEventTrigger+Promise.swift"; sourceTree = ""; }; + 8312EA1421096DF000A47DDF /* HMAccessoryBrowserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HMAccessoryBrowserTests.swift; sourceTree = ""; }; + 8312EA18210974F600A47DDF /* UtilsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilsTests.swift; sourceTree = ""; }; + 838C29CE2103FB9600CE5309 /* HMAcessoryBrowser+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HMAcessoryBrowser+Promise.swift"; sourceTree = ""; }; + 838C29CF2103FB9700CE5309 /* HMHome+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HMHome+Promise.swift"; sourceTree = ""; }; + 838C29D02103FB9700CE5309 /* HMCharacteristic+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HMCharacteristic+Promise.swift"; sourceTree = ""; }; + 838C29D12103FB9700CE5309 /* HMHomeManager+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HMHomeManager+Promise.swift"; sourceTree = ""; }; + 838C29D22103FB9700CE5309 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKHomeKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKHomeKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 838C29D02103FB9700CE5309 /* HMCharacteristic+Promise.swift */, + 838C29CE2103FB9600CE5309 /* HMAcessoryBrowser+Promise.swift */, + 7D619864235E333E001E0F2E /* HMActionSet+Promise.swift */, + 7D619868235E3401001E0F2E /* HMEventTrigger+Promise.swift */, + 838C29CF2103FB9700CE5309 /* HMHome+Promise.swift */, + 838C29D12103FB9700CE5309 /* HMHomeManager+Promise.swift */, + 7D619866235E33AC001E0F2E /* HMTrigger+Promise.swift */, + 838C29D22103FB9700CE5309 /* Utils.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 8312EA1421096DF000A47DDF /* HMAccessoryBrowserTests.swift */, + 8312EA18210974F600A47DDF /* UtilsTests.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKHomeKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKHomeKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKHomeKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKHomeKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKHKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKHKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKHKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKHKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKHomeKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKHomeKit */, + 63C7FFF11D5C020D003BAE60 /* PMKHKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 838C29D62103FB9700CE5309 /* HMHomeManager+Promise.swift in Sources */, + 7D619865235E333E001E0F2E /* HMActionSet+Promise.swift in Sources */, + 838C29D52103FB9700CE5309 /* HMCharacteristic+Promise.swift in Sources */, + 838C29D42103FB9700CE5309 /* HMHome+Promise.swift in Sources */, + 7D619869235E3401001E0F2E /* HMEventTrigger+Promise.swift in Sources */, + 7D619867235E33AC001E0F2E /* HMTrigger+Promise.swift in Sources */, + 838C29D32103FB9700CE5309 /* HMAcessoryBrowser+Promise.swift in Sources */, + 838C29D72103FB9700CE5309 /* Utils.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8312EA1521096DF000A47DDF /* HMAccessoryBrowserTests.swift in Sources */, + 8312EA19210974F600A47DDF /* UtilsTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKHomeKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreLocation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.CoreLocation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 3.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKHomeKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKHomeKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKHKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/xcshareddata/xcschemes/PMKHomeKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/xcshareddata/xcschemes/PMKHomeKit.xcscheme new file mode 100644 index 00000000..5134cc68 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/PMKHomeKit.xcodeproj/xcshareddata/xcschemes/PMKHomeKit.xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/README.markdown new file mode 100644 index 00000000..b48f5d67 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/README.markdown @@ -0,0 +1,32 @@ +# PromiseKit HomeKit Extensions ![Build Status] + +This project adds promises to Apple’s HomeKit framework. + +* Xcode >= 9.3 required for iOS +* Xcode >= 9.0 required for all other platforms + +Thus, Swift versions supported are: 3.2, 3.3, 3.4, 4.0, 4.1 & 4.2. + +## CocoaPods + +```ruby +pod "PromiseKit/HomeKit", "~> 6.0" +``` + +The extensions are built into PromiseKit.framework thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/HomeKit" ~> 1.0 +``` + +The extension is built into it's own framework: + +```swift +import PromiseKit +import PMKHomeKit +``` + + +[Build Status]: https://travis-ci.org/chrischares/PromiseKit-HomeKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMAcessoryBrowser+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMAcessoryBrowser+Promise.swift new file mode 100644 index 00000000..80d2e521 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMAcessoryBrowser+Promise.swift @@ -0,0 +1,78 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if !os(tvOS) && !os(watchOS) + +public enum HMPromiseAccessoryBrowserError: Error { + case noAccessoryFound +} + +public class HMPromiseAccessoryBrowser { + private var proxy: BrowserProxy? + + public func start(scanInterval: ScanInterval) -> Promise<[HMAccessory]> { + proxy = BrowserProxy(scanInterval: scanInterval) + return proxy!.promise + } + + public func stop() { + proxy?.cancel() + } +} + +private class BrowserProxy: PromiseProxy<[HMAccessory]>, HMAccessoryBrowserDelegate { + let browser = HMAccessoryBrowser() + let scanInterval: ScanInterval + + init(scanInterval: ScanInterval) { + self.scanInterval = scanInterval + super.init() + + browser.delegate = self; + browser.startSearchingForNewAccessories() + + //if we have a timeout, set it up + var timeout: TimeInterval? = nil + switch scanInterval { + case .returnAll(let interval): timeout = interval + case .returnFirst(let interval): timeout = interval + } + + if let timeout = timeout { + after(seconds: timeout) + .done { [weak self] () -> Void in + guard let _self = self else { return } + _self.reject(HMPromiseAccessoryBrowserError.noAccessoryFound) + } + } + } + + override func fulfill(_ value: [HMAccessory]) { + browser.stopSearchingForNewAccessories() + super.fulfill(value) + } + + override func reject(_ error: Error ) { + browser.stopSearchingForNewAccessories() + super.reject(error) + } + + override func cancel() { + browser.stopSearchingForNewAccessories() + super.cancel() + } + + /** + HMAccessoryBrowser delegate + */ + func accessoryBrowser(_ browser: HMAccessoryBrowser, didFindNewAccessory accessory: HMAccessory) { + if case .returnFirst = scanInterval { + fulfill([accessory]) + } + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMActionSet+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMActionSet+Promise.swift new file mode 100644 index 00000000..b5662859 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMActionSet+Promise.swift @@ -0,0 +1,26 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if !os(tvOS) && !os(watchOS) + +extension HMActionSet { + + @available(iOS 8.0, *) + public func addAction(_ action: HMAction) -> Promise { + return Promise { seal in + self.addAction(action, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func updateName(_ name: String) -> Promise { + return Promise { seal in + self.updateName(name, completionHandler: seal.resolve) + } + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMCharacteristic+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMCharacteristic+Promise.swift new file mode 100644 index 00000000..a116536e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMCharacteristic+Promise.swift @@ -0,0 +1,46 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +public enum AccessoryError: Error { + case incorrectType + case serviceMissing + case characteristicMissing +} + +@available(iOS 8.0, tvOS 10.0, *) +extension HMCharacteristic { + /** + A simple typesafe promise wrapper around readValue + */ + public func read() -> Promise { + return Promise { seal in + self.readValue { error in + if let error = error { seal.reject(error) } + else if let value = self.value as? T { seal.fulfill(value) } + else { seal.reject(AccessoryError.incorrectType) } + } + } + } + /// Because type inference is great... until you can't compile (thanks Swift) + public func readFloat() -> Promise { return read() } + public func readDouble() -> Promise { return read() } + public func readInt() -> Promise { return read() } + public func readString() -> Promise { return read() } + + /** + A simple promise wrapper around writeValue + */ + public func write(_ value: Any?) -> Promise { + return Promise { seal in + self.writeValue(value, completionHandler: seal.resolve) + } + } + /// Explicit is good + public func writeFloat(_ value: Float) -> Promise { return write(value) } + public func writeDouble(_ value: Double) -> Promise { return write(value) } + public func writeInt(_ value: Int) -> Promise { return write(value) } + public func writeString(_ value: String) -> Promise { return write(value) } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMEventTrigger+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMEventTrigger+Promise.swift new file mode 100644 index 00000000..1446d1a2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMEventTrigger+Promise.swift @@ -0,0 +1,21 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if !os(tvOS) && !os(watchOS) + +@available(iOS 9.0, *) +extension HMEventTrigger { + + @available(iOS 11.0, *) + public func updateExecuteOnce(_ executeOnce: Bool) -> Promise { + return Promise { seal in + self.updateExecuteOnce(executeOnce, completionHandler: seal.resolve) + } + } + +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHome+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHome+Promise.swift new file mode 100644 index 00000000..02c6a550 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHome+Promise.swift @@ -0,0 +1,116 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if !os(tvOS) && !os(watchOS) + +extension HMHome { + + @available(iOS 8.0, *) + public func updateName(_ name: String) -> Promise { + return Promise { seal in + self.updateName(name, completionHandler: seal.resolve) + } + } + + // MARK: Accessories + + /// Add and setup a new HMAccessory. Displays it's own UI + @available(iOS 11.3, *) + public func addAndSetupAccessories(with payload: HMAccessorySetupPayload) -> Promise<[HMAccessory]> { + return Promise { seal in + self.addAndSetupAccessories(with: payload, completionHandler: seal.resolve) + } + } + + /// Add and setup a new HMAccessory. Displays it's own UI + @available(iOS 10.0, *) + public func addAndSetupAccessories() -> Promise<[HMAccessory]> { + // We need to compare what we have before the action to after to know what is new + let beforeAccessories = self.accessories + let home = self + + return Promise { seal in + self.addAndSetupAccessories { error in + if let error = error { seal.reject(error) } + else { + let newAccessories = home.accessories.filter { beforeAccessories.contains($0) == false } + seal.fulfill(newAccessories) + } + } + } + } + + @available(iOS 8.0, *) + public func addAccessory(_ accessory: HMAccessory) -> Promise { + return Promise { seal in + self.addAccessory(accessory, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func assignAccessory(_ accessory: HMAccessory, to room: HMRoom) -> Promise { + return Promise { seal in + self.assignAccessory(accessory, to: room, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeAccessory(_ accessory: HMAccessory) -> Promise { + return Promise { seal in + self.removeAccessory(accessory, completionHandler: seal.resolve) + } + } + + // MARK: Rooms + + @available(iOS 8.0, *) + public func addRoom(withName name: String) -> Promise { + return Promise { seal in + self.addRoom(withName: name, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeRoom(_ room: HMRoom) -> Promise { + return Promise { seal in + self.removeRoom(room, completionHandler: seal.resolve) + } + } + + // MARK: Action Sets + + @available(iOS 8.0, *) + public func addActionSet(withName name: String) -> Promise { + return Promise { seal in + self.addActionSet(withName: name, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeActionSet(_ actionSet: HMActionSet) -> Promise { + return Promise { seal in + self.removeActionSet(actionSet, completionHandler: seal.resolve) + } + } + + // MARK: Triggers + + @available(iOS 8.0, *) + public func addTrigger(_ trigger: HMTrigger) -> Promise { + return Promise { seal in + self.addTrigger(trigger, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeTrigger(_ trigger: HMTrigger) -> Promise { + return Promise { seal in + self.removeTrigger(trigger, completionHandler: seal.resolve) + } + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHomeManager+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHomeManager+Promise.swift new file mode 100644 index 00000000..33e6311f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMHomeManager+Promise.swift @@ -0,0 +1,62 @@ +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif +import HomeKit + +@available(iOS 8.0, tvOS 10.0, *) +public enum HomeKitError: Error { + case permissionDeined +} + +@available(iOS 8.0, tvOS 10.0, *) +extension HMHomeManager { + public func homes() -> Promise<[HMHome]> { + return HMHomeManagerProxy().promise + } + + #if !os(tvOS) && !os(watchOS) + + @available(iOS 8.0, *) + public func addHome(withName name: String) -> Promise { + return Promise { seal in + self.addHome(withName: name, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeHome(_ home: HMHome) -> Promise { + return Promise { seal in + self.removeHome(home, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func updatePrimaryHome(_ home: HMHome) -> Promise { + return Promise { seal in + self.updatePrimaryHome(home, completionHandler: seal.resolve) + } + } + + #endif +} + +@available(iOS 8.0, tvOS 10.0, *) +internal class HMHomeManagerProxy: PromiseProxy<[HMHome]>, HMHomeManagerDelegate { + + fileprivate let manager: HMHomeManager + + override init() { + self.manager = HMHomeManager() + super.init() + self.manager.delegate = self + + DispatchQueue.main.asyncAfter(deadline: .now() + 20.0) { [weak self] in + self?.reject(HomeKitError.permissionDeined) + } + } + + func homeManagerDidUpdateHomes(_ manager: HMHomeManager) { + fulfill(manager.homes) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMTrigger+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMTrigger+Promise.swift new file mode 100644 index 00000000..edfabf03 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/HMTrigger+Promise.swift @@ -0,0 +1,41 @@ +import Foundation +import HomeKit +#if !PMKCocoaPods +import PromiseKit +#endif + +#if !os(tvOS) && !os(watchOS) + +extension HMTrigger { + + @available(iOS 8.0, *) + public func updateName(_ name: String) -> Promise { + return Promise { seal in + self.updateName(name, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func enable(_ enabled: Bool) -> Promise { + return Promise { seal in + self.enable(enabled, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func addActionSet(_ actionSet: HMActionSet) -> Promise { + return Promise { seal in + self.addActionSet(actionSet, completionHandler: seal.resolve) + } + } + + @available(iOS 8.0, *) + public func removeActionSet(_ actionSet: HMActionSet) -> Promise { + return Promise { seal in + self.removeActionSet(actionSet, completionHandler: seal.resolve) + } + } + +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/Utils.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/Utils.swift new file mode 100644 index 00000000..907dbbd3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Sources/Utils.swift @@ -0,0 +1,45 @@ +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + Commonly used functionality when promisifying a delegate pattern +*/ +internal class PromiseProxy: NSObject { + internal let (promise, seal) = Promise.pending(); + + private var retainCycle: PromiseProxy? + + override init() { + super.init() + // Create a retain cycle + self.retainCycle = self + // And ensure we break it when the promise is resolved + _ = promise.ensure { self.retainCycle = nil } + } + + /// These functions ensure we only resolve the promise once + internal func fulfill(_ value: T) { + guard self.promise.isResolved == false else { return } + seal.fulfill(value) + } + internal func reject(_ error: Error) { + guard self.promise.isResolved == false else { return } + seal.reject(error) + } + + /// Cancel helper + internal func cancel() { + self.reject(PMKError.cancelled) + } +} + +/** + Different ways to scan. +*/ +public enum ScanInterval { + // Return after our first item with an optional time limit + case returnFirst(timeout: TimeInterval?) + // Scan for this duration before returning all + case returnAll(interval: TimeInterval) +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/Entitlements.plist b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/Entitlements.plist new file mode 100644 index 00000000..76a15bb4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/Entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.private.tcc.allow + + kTCCServiceAddressBook + kTCCServiceCalendar + kTCCServicePhotos + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/HMAccessoryBrowserTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/HMAccessoryBrowserTests.swift new file mode 100644 index 00000000..b6f555f2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/HMAccessoryBrowserTests.swift @@ -0,0 +1,84 @@ +// +// HMAccessoryBrowserTests.swift +// PMKHKTests +// +// Created by Chris Chares on 7/25/18. +// Copyright © 2018 Max Howell. All rights reserved. +// + +import XCTest +import PromiseKit +import HomeKit +@testable import PMKHomeKit + +#if os(iOS) + +class HMAccessoryBrowserTests: XCTestCase { + + func testBrowserScanReturningFirst() { + swizzle(HMAccessoryBrowser.self, #selector(HMAccessoryBrowser.startSearchingForNewAccessories)) { + let ex = expectation(description: "") + + HMPromiseAccessoryBrowser().start(scanInterval: .returnFirst(timeout: 0.5)) + .done { accessories in + XCTAssertEqual(accessories.count, 1) + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + } + + func testBrowserScanReturningTimeout() { + let ex = expectation(description: "") + + HMPromiseAccessoryBrowser().start(scanInterval: .returnFirst(timeout: 0.5)) + .catch { error in + // Why would we have discovered anything? + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } +} + +extension HMAccessoryBrowser { + @objc func pmk_startSearchingForNewAccessories() { + after(.milliseconds(100)) + .done { swag in + self.delegate!.accessoryBrowser?(self, didFindNewAccessory: MockAccessory()) + } + } +} + +/// Mocks +class MockAccessory: HMAccessory { + var _uniqueID: UUID = UUID() + override var uniqueIdentifier: UUID { return _uniqueID } + + override init() { + super.init() + } +} + +// Utilty taken from https://github.com/PromiseKit/CoreLocation/blob/master/Tests/CLLocationManagerTests.swift +import ObjectiveC + +func swizzle(_ foo: AnyClass, _ from: Selector, isClassMethod: Bool = false, body: () -> Void) { + let originalMethod: Method + let swizzledMethod: Method + + if isClassMethod { + originalMethod = class_getClassMethod(foo, from)! + swizzledMethod = class_getClassMethod(foo, Selector("pmk_\(from)"))! + } else { + originalMethod = class_getInstanceMethod(foo, from)! + swizzledMethod = class_getInstanceMethod(foo, Selector("pmk_\(from)"))! + } + + method_exchangeImplementations(originalMethod, swizzledMethod) + body() + method_exchangeImplementations(swizzledMethod, originalMethod) +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/UtilsTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/UtilsTests.swift new file mode 100644 index 00000000..d1c167cd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/HomeKit/Tests/UtilsTests.swift @@ -0,0 +1,63 @@ +// +// UtilsTests.swift +// PMKHKTests +// +// Created by Chris Chares on 7/25/18. +// Copyright © 2018 Max Howell. All rights reserved. +// + +import XCTest +import PromiseKit +@testable import PMKHomeKit + +class UtilsTests: XCTestCase { + + var strongProxy: PromiseProxy? = PromiseProxy() + + override func setUp() { + strongProxy = PromiseProxy() + } + + override func tearDown() { + strongProxy = nil + } + + // The proxy should create a retain cycle until the promise is resolved + func testRetainCycle() { + weak var weakVar = strongProxy + XCTAssertNotNil(weakVar) + + let exp = expectation(description: "") + strongProxy = nil + after(.milliseconds(50)) + .done { + XCTAssertNotNil(weakVar) + exp.fulfill() + } + waitForExpectations(timeout: 1.0, handler: nil) + } + + // Once resolved, the proxy should break the retain cycle + func testRelease() { + weak var weakVar = strongProxy + XCTAssertNotNil(weakVar) + + let exp = expectation(description: "") + strongProxy!.fulfill(42) + strongProxy = nil + + after(.milliseconds(50)) + .done { + XCTAssertNil(weakVar) + exp.fulfill() + } + waitForExpectations(timeout: 1.0, handler: nil) + } + + // Cancel should reject with a PMKError + func testCancel() { + let proxy = strongProxy! + proxy.cancel() + XCTAssertNotNil(proxy.promise.error) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.gitignore new file mode 100644 index 00000000..f5554ff6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.gitignore @@ -0,0 +1,5 @@ +xcuserdata +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.travis.yml new file mode 100644 index 00000000..b904ead5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/.travis.yml @@ -0,0 +1,80 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/MapKit/Sources + cp -R ../../../Sources Extensions/MapKit + pod lib lint --subspec=PromiseKit/MapKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKMapKit + xcode_project: PMKMapKit.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile new file mode 100644 index 00000000..2bfea98d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..07f81b68 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.pbxproj @@ -0,0 +1,474 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6358AB711D5D4B3A00B9B157 /* MKDirections+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6358AB6B1D5D4B3A00B9B157 /* MKDirections+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6358AB721D5D4B3A00B9B157 /* MKDirections+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 6358AB6C1D5D4B3A00B9B157 /* MKDirections+AnyPromise.m */; }; + 6358AB731D5D4B3A00B9B157 /* MKDirections+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6358AB6D1D5D4B3A00B9B157 /* MKDirections+Promise.swift */; }; + 6358AB741D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6358AB6E1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6358AB751D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 6358AB6F1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.m */; }; + 6358AB761D5D4B3A00B9B157 /* MKMapSnapshotter+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6358AB701D5D4B3A00B9B157 /* MKMapSnapshotter+Promise.swift */; }; + 6358AB781D5D4B4700B9B157 /* TestMapKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6358AB771D5D4B4700B9B157 /* TestMapKit.swift */; }; + 6358AB7A1D5D4B6700B9B157 /* PMKMapKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6358AB791D5D4B6700B9B157 /* PMKMapKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63C7FFF71D5C020D003BAE60 /* PMKMapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKMapKit.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKMapKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6358AB6B1D5D4B3A00B9B157 /* MKDirections+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MKDirections+AnyPromise.h"; path = "Sources/MKDirections+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 6358AB6C1D5D4B3A00B9B157 /* MKDirections+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MKDirections+AnyPromise.m"; path = "Sources/MKDirections+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 6358AB6D1D5D4B3A00B9B157 /* MKDirections+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "MKDirections+Promise.swift"; path = "Sources/MKDirections+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 6358AB6E1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "MKMapSnapshotter+AnyPromise.h"; path = "Sources/MKMapSnapshotter+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 6358AB6F1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "MKMapSnapshotter+AnyPromise.m"; path = "Sources/MKMapSnapshotter+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 6358AB701D5D4B3A00B9B157 /* MKMapSnapshotter+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "MKMapSnapshotter+Promise.swift"; path = "Sources/MKMapSnapshotter+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 6358AB771D5D4B4700B9B157 /* TestMapKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestMapKit.swift; path = Tests/TestMapKit.swift; sourceTree = SOURCE_ROOT; }; + 6358AB791D5D4B6700B9B157 /* PMKMapKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKMapKit.h; path = Sources/PMKMapKit.h; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKMapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKMapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKMKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKMKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKMapKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKMapKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKMKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6358AB791D5D4B6700B9B157 /* PMKMapKit.h */, + 6358AB6B1D5D4B3A00B9B157 /* MKDirections+AnyPromise.h */, + 6358AB6C1D5D4B3A00B9B157 /* MKDirections+AnyPromise.m */, + 6358AB6D1D5D4B3A00B9B157 /* MKDirections+Promise.swift */, + 6358AB6E1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.h */, + 6358AB6F1D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.m */, + 6358AB701D5D4B3A00B9B157 /* MKMapSnapshotter+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 6358AB771D5D4B4700B9B157 /* TestMapKit.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 6358AB7A1D5D4B6700B9B157 /* PMKMapKit.h in Headers */, + 6358AB711D5D4B3A00B9B157 /* MKDirections+AnyPromise.h in Headers */, + 6358AB741D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKMapKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKMapKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKMapKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKMapKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKMKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKMKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKMKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKMKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKMapKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKMapKit */, + 63C7FFF11D5C020D003BAE60 /* PMKMKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6358AB761D5D4B3A00B9B157 /* MKMapSnapshotter+Promise.swift in Sources */, + 6358AB751D5D4B3A00B9B157 /* MKMapSnapshotter+AnyPromise.m in Sources */, + 6358AB721D5D4B3A00B9B157 /* MKDirections+AnyPromise.m in Sources */, + 6358AB731D5D4B3A00B9B157 /* MKDirections+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6358AB781D5D4B4700B9B157 /* TestMapKit.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKMapKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.MapKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.2; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.MapKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.2; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKMapKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKMapKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKMKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/xcshareddata/xcschemes/PMKMapKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/xcshareddata/xcschemes/PMKMapKit.xcscheme new file mode 100644 index 00000000..8dcf6302 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/PMKMapKit.xcodeproj/xcshareddata/xcschemes/PMKMapKit.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/README.markdown new file mode 100644 index 00000000..e302b4c2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit MapKit Extensions ![Build Status] + +This project adds promises to Apple’s MapKit framework. + +## CocoaPods + +```ruby +pod "PromiseKit/MapKit", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/MapKit" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKMapKit +``` + +```objc +// objc +@import PromiseKit; +@import PMKMapKit; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/MapKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.h new file mode 100644 index 00000000..e227cfb9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.h @@ -0,0 +1,30 @@ +#import +#import + +/** + To import the `MKDirections` category: + + use_frameworks! + pod "PromiseKit/MapKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface MKDirections (PromiseKit) + +/** + Begins calculating the requested route information asynchronously. + + @return A promise that fulfills with a `MKDirectionsResponse`. +*/ +- (AnyPromise *)calculateDirections NS_REFINED_FOR_SWIFT; + +/** + Begins calculating the requested travel-time information asynchronously. + + @return A promise that fulfills with a `MKETAResponse`. +*/ +- (AnyPromise *)calculateETA NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.m new file mode 100644 index 00000000..9b84be18 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+AnyPromise.m @@ -0,0 +1,22 @@ +#import "MKDirections+AnyPromise.h" + + +@implementation MKDirections (PromiseKit) + +- (AnyPromise *)calculateDirections { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self calculateDirectionsWithCompletionHandler:^(id rsp, id err){ + resolve(err ?: rsp); + }]; + }]; +} + +- (AnyPromise *)calculateETA { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self calculateETAWithCompletionHandler:^(id rsp, id err){ + resolve(err ?: rsp); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+Promise.swift new file mode 100644 index 00000000..2230d461 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKDirections+Promise.swift @@ -0,0 +1,38 @@ +import MapKit +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `MKDirections` category: + + use_frameworks! + pod "PromiseKit/MapKit" + + And then in your sources: + + import PromiseKit +*/ +extension MKDirections { +#if swift(>=4.2) + /// Begins calculating the requested route information asynchronously. + public func calculate() -> Promise { + return Promise { calculate(completionHandler: $0.resolve) } + } + + /// Begins calculating the requested travel-time information asynchronously. + public func calculateETA() -> Promise { + return Promise { calculateETA(completionHandler: $0.resolve) } + } +#else + /// Begins calculating the requested route information asynchronously. + public func calculate() -> Promise { + return Promise { calculate(completionHandler: $0.resolve) } + } + + /// Begins calculating the requested travel-time information asynchronously. + public func calculateETA() -> Promise { + return Promise { calculateETA(completionHandler: $0.resolve) } + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.h new file mode 100644 index 00000000..13f33e9b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.h @@ -0,0 +1,23 @@ +#import +#import + +/** + To import the `MKMapSnapshotter` category: + + use_frameworks! + pod "PromiseKit/MapKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface MKMapSnapshotter (PromiseKit) + +/** + Starts generating the snapshot using the options set in this object. + + @return A promise that fulfills with the generated `MKMapSnapshot` object. +*/ +- (AnyPromise *)start NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.m new file mode 100644 index 00000000..c732648b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+AnyPromise.m @@ -0,0 +1,14 @@ +#import "MKMapSnapshotter+AnyPromise.h" + + +@implementation MKMapSnapshotter (PromiseKit) + +- (AnyPromise *)start { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) { + resolve(error ?: snapshot); + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+Promise.swift new file mode 100644 index 00000000..768cfb75 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/MKMapSnapshotter+Promise.swift @@ -0,0 +1,28 @@ +import MapKit +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `MKMapSnapshotter` category: + + use_frameworks! + pod "PromiseKit/MapKit" + + And then in your sources: + + import PromiseKit +*/ +extension MKMapSnapshotter { +#if swift(>=4.2) + /// Starts generating the snapshot using the options set in this object. + public func start() -> Promise { + return Promise { start(completionHandler: $0.resolve) } + } +#else + /// Starts generating the snapshot using the options set in this object. + public func start() -> Promise { + return Promise { start(completionHandler: $0.resolve) } + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/PMKMapKit.h b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/PMKMapKit.h new file mode 100644 index 00000000..d0babbbe --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Sources/PMKMapKit.h @@ -0,0 +1,2 @@ +#import "MKDirections+AnyPromise.h" +#import "MKMapSnapshotter+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Tests/TestMapKit.swift b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Tests/TestMapKit.swift new file mode 100644 index 00000000..41cbdd65 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MapKit/Tests/TestMapKit.swift @@ -0,0 +1,63 @@ +import PromiseKit +import PMKMapKit +import MapKit +import XCTest + +class Test_MKDirections_Swift: XCTestCase { + func test_directions_response() { + let ex = expectation(description: "") + + class MockDirections: MKDirections { + override func calculate(completionHandler: @escaping MKDirectionsHandler) { + completionHandler(MKDirectionsResponse(), nil) + } + } + + let rq = MKDirectionsRequest() + let directions = MockDirections(request: rq) + + directions.calculate().done { _ in + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + + func test_ETA_response() { + let ex = expectation(description: "") + + class MockDirections: MKDirections { + override func calculateETA(completionHandler: @escaping MKETAHandler) { + completionHandler(MKETAResponse(), nil) + } + } + + let rq = MKDirectionsRequest() + MockDirections(request: rq).calculateETA().done { rsp in + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + +} + +class Test_MKSnapshotter_Swift: XCTestCase { + func test() { + let ex = expectation(description: "") + + class MockSnapshotter: MKMapSnapshotter { + override func start(completionHandler: @escaping MKMapSnapshotCompletionHandler) { + completionHandler(MKMapSnapshot(), nil) + } + } + + let snapshotter = MockSnapshotter() + snapshotter.start().done { _ in + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.travis.yml new file mode 100644 index 00000000..8e774587 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/.travis.yml @@ -0,0 +1,80 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: cocoapods + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/MessagesUI/Sources + cp -R ../../../Sources Extensions/MessagesUI + pod lib lint --subspec=PromiseKit/MessageUI --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS,macOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - stage: test + name: macOS Tests + xcode_scheme: PMKMessagesUI + xcode_project: PMKMessagesUI.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.pbxproj new file mode 100644 index 00000000..aebe7970 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.pbxproj @@ -0,0 +1,452 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 634B8E521D5D534F00D54CED /* MFMailComposeViewController+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634B8E501D5D534F00D54CED /* MFMailComposeViewController+Promise.swift */; }; + 634B8E531D5D534F00D54CED /* MFMessageComposeViewController+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634B8E511D5D534F00D54CED /* MFMessageComposeViewController+Promise.swift */; }; + 634B8E551D5D535900D54CED /* TestMessageUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 634B8E541D5D535900D54CED /* TestMessageUI.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKMessagesUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKMessagesUI.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKMessagesUI; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 634B8E501D5D534F00D54CED /* MFMailComposeViewController+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "MFMailComposeViewController+Promise.swift"; path = "Sources/MFMailComposeViewController+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 634B8E511D5D534F00D54CED /* MFMessageComposeViewController+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "MFMessageComposeViewController+Promise.swift"; path = "Sources/MFMessageComposeViewController+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 634B8E541D5D535900D54CED /* TestMessageUI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestMessageUI.swift; path = Tests/TestMessageUI.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKMessagesUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKMessagesUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKMFTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKMFTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKMessagesUI.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKMessagesUI.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKMFTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 634B8E501D5D534F00D54CED /* MFMailComposeViewController+Promise.swift */, + 634B8E511D5D534F00D54CED /* MFMessageComposeViewController+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 634B8E541D5D535900D54CED /* TestMessageUI.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKMessagesUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKMessagesUI" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKMessagesUI; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKMessagesUI.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKMFTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKMFTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKMFTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKMFTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKMessagesUI" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKMessagesUI */, + 63C7FFF11D5C020D003BAE60 /* PMKMFTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 634B8E531D5D534F00D54CED /* MFMessageComposeViewController+Promise.swift in Sources */, + 634B8E521D5D534F00D54CED /* MFMailComposeViewController+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 634B8E551D5D535900D54CED /* TestMessageUI.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKMessagesUI */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.MessagesUI; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.MessagesUI; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKMessagesUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKMessagesUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKMFTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/xcshareddata/xcschemes/PMKMessagesUI.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/xcshareddata/xcschemes/PMKMessagesUI.xcscheme new file mode 100644 index 00000000..1b44cfac --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/PMKMessagesUI.xcodeproj/xcshareddata/xcschemes/PMKMessagesUI.xcscheme @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/README.markdown new file mode 100644 index 00000000..32394389 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/README.markdown @@ -0,0 +1,36 @@ +# PromiseKit MessagesUI Extensions ![Build Status] + +This project adds promises to Apple’s MessagesUI framework. + +The Objective-C equivalents of this repo are in the UIKit extensions. + +## CocoaPods + +```ruby +pod "PromiseKit/MessageUI", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/MessagesUI" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKMessagesUI +``` + +```objc +// objc +@import PromiseKit; +@import PMKMessagesUI; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/MessagesUI.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMailComposeViewController+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMailComposeViewController+Promise.swift new file mode 100644 index 00000000..dd0335c3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMailComposeViewController+Promise.swift @@ -0,0 +1,81 @@ +import MessageUI.MFMailComposeViewController +import UIKit.UIViewController +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import this `UIViewController` category: + + use_frameworks! + pod "PromiseKit/MessageUI" + + And then in your sources: + + import PromiseKit +*/ +extension UIViewController { + /// Presents the message view controller and resolves with the user action. + public func promise(_ vc: MFMailComposeViewController, animated: Bool = true, completion:(() -> Void)? = nil) -> Promise { + let proxy = PMKMailComposeViewControllerDelegate() + proxy.retainCycle = proxy + vc.mailComposeDelegate = proxy + present(vc, animated: animated, completion: completion) + _ = proxy.promise.ensure { + self.dismiss(animated: animated, completion: nil) + } + return proxy.promise + } +} + +extension MFMailComposeViewController { + /// Errors representing PromiseKit MFMailComposeViewController failures + public enum PMKError: CancellableError, CustomStringConvertible { + /// The user cancelled sending mail + case cancelled + case failed + + /// - Returns: true + public var isCancelled: Bool { + switch self { + case .cancelled: + return true + case .failed: + return false + } + } + + public var description: String { + switch self { + case .failed: + return "The attempt to save or send the message was unsuccessful." + case .cancelled: + return "The mail was cancelled" + } + + } + } +} + +private class PMKMailComposeViewControllerDelegate: NSObject, MFMailComposeViewControllerDelegate, UINavigationControllerDelegate { + + let (promise, seal) = Promise.pending() + var retainCycle: NSObject? + + @objc func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { + defer { retainCycle = nil } + + if let error = error { + seal.reject(error) + } else { + switch result { + case .failed: + seal.reject(MFMailComposeViewController.PMKError.failed) + case .cancelled: + seal.reject(MFMailComposeViewController.PMKError.cancelled) + default: + seal.fulfill(result) + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMessageComposeViewController+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMessageComposeViewController+Promise.swift new file mode 100644 index 00000000..f3633664 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Sources/MFMessageComposeViewController+Promise.swift @@ -0,0 +1,82 @@ +import Foundation +import MessageUI.MFMessageComposeViewController +import UIKit.UIViewController +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import this `UIViewController` category: + + use_frameworks! + pod "PromiseKit/MessageUI" + + And then in your sources: + + import PromiseKit +*/ +extension UIViewController { + /// Presents the message view controller and resolves with the user action. + public func promise(_ vc: MFMessageComposeViewController, animated: Bool = true, completion:(() -> Void)? = nil) -> Promise { + let proxy = PMKMessageComposeViewControllerDelegate() + proxy.retainCycle = proxy + vc.messageComposeDelegate = proxy + present(vc, animated: animated, completion: completion) + _ = proxy.promise.ensure { + vc.dismiss(animated: animated, completion: nil) + } + return proxy.promise + } +} + +extension MFMessageComposeViewController { + /// Errors representing PromiseKit MFMailComposeViewController failures + public enum PMKError: CancellableError, CustomStringConvertible { + /// The user cancelled sending the message + case cancelled + case failed + + /// - Returns: true + public var isCancelled: Bool { + switch self { + case .cancelled: + return true + case .failed: + return false + } + } + + public var description: String { + switch self { + case .failed: + return "The attempt to save or send the message was unsuccessful." + case .cancelled: + return "The message was cancelled" + } + + } + } +} + +private class PMKMessageComposeViewControllerDelegate: NSObject, MFMessageComposeViewControllerDelegate, UINavigationControllerDelegate { + + let (promise, seal) = Promise.pending() + var retainCycle: NSObject? + + @objc func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) { + defer { retainCycle = nil } + + switch result { + case .sent: + seal.fulfill(()) + case .failed: + seal.reject(MFMessageComposeViewController.PMKError.failed) + case .cancelled: + seal.reject(MFMessageComposeViewController.PMKError.cancelled) + #if swift(>=5) + @unknown default: + seal.reject(MFMessageComposeViewController.PMKError.cancelled) + #endif + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Tests/TestMessageUI.swift b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Tests/TestMessageUI.swift new file mode 100644 index 00000000..082c95ad --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/MessagesUI/Tests/TestMessageUI.swift @@ -0,0 +1,69 @@ +import PMKMessagesUI +import PromiseKit +import MessageUI +import XCTest +import UIKit + + +class MessageUITests: XCTestCase { + var rootvc: UIViewController! + + func test_can_cancel_mail_composer() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + var order = false + + let mailer = MFMailComposeViewController() + mailer.setToRecipients(["mxcl@me.com"]) + + let promise = rootvc.promise(mailer, animated: false, completion: { + after(seconds: 0.25).done { _ in + XCTAssertFalse(order) + let button = mailer.viewControllers[0].navigationItem.leftBarButtonItem! + UIControl().sendAction(button.action!, to: button.target, for: nil) + ex1.fulfill() + } + }) + promise.catch { _ -> Void in + XCTFail() + } + promise.catch(policy: .allErrors) { _ -> Void in + // seems necessary to give vc stack a bit of time + after(seconds: 0.5).done(ex2.fulfill) + order = true + } + waitForExpectations(timeout: 10, handler: nil) + + XCTAssertNil(rootvc.presentedViewController) + } + + func test_can_cancel_message_composer() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + var order = false + + let messager = MFMessageComposeViewController() + + let promise = rootvc.promise(messager, animated: false, completion: { + after(seconds: 0.25).done { _ in + XCTAssertFalse(order) + + let button = messager.viewControllers[0].navigationItem.leftBarButtonItem! + UIControl().sendAction(button.action!, to: button.target, for: nil) + ex1.fulfill() + } + }) + + promise.catch { _ -> Void in + XCTFail() + } + promise.catch(policy: .allErrors) { _ -> Void in + // seems necessary to give vc stack a bit of time + after(seconds: 0.5).done(ex2.fulfill) + order = true + } + waitForExpectations(timeout: 10, handler: nil) + + XCTAssertNil(rootvc.presentedViewController) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.travis.yml new file mode 100644 index 00000000..6337a058 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/.travis.yml @@ -0,0 +1,42 @@ +language: objective-c +os: osx +matrix: + include: + # - {osx_image: xcode8.3, env: 'PLAT=macOS SWFT=3.1 DST="arch=x86_64"'} + # - {osx_image: xcode8.3, env: 'PLAT=iOS SWFT=3.1 DST="OS=10.3.1,name=iPhone SE"'} + # - {osx_image: xcode8.3, env: 'PLAT=tvOS SWFT=3.1 DST="OS=10.2,name=Apple TV 1080p"'} + # - {osx_image: xcode8.3, env: 'PLAT=watchOS SWFT=3.1 DST="OS=3.2,name=Apple Watch - 38mm"'} + + - {osx_image: xcode9.2, env: 'PLAT=macOS SWFT=3.2 DST="arch=x86_64"'} + - {osx_image: xcode9.2, env: 'PLAT=iOS SWFT=3.2 DST="OS=11.2,name=iPhone SE"'} + - {osx_image: xcode9.2, env: 'PLAT=tvOS SWFT=3.2 DST="OS=11.2,name=Apple TV"'} + - {osx_image: xcode9.2, env: 'PLAT=watchOS SWFT=3.2 DST="OS=4.2,name=Apple Watch - 38mm"'} + + - {osx_image: xcode9.4, env: 'PLAT=macOS SWFT=3.3 DST="arch=x86_64"'} + - {osx_image: xcode9.4, env: 'PLAT=iOS SWFT=3.3 DST="OS=11.4,name=iPhone 5s"'} + - {osx_image: xcode9.4, env: 'PLAT=tvOS SWFT=3.3 DST="OS=11.4,name=Apple TV"'} + - {osx_image: xcode9.4, env: 'PLAT=watchOS SWFT=3.3 DST="OS=4.3,name=Apple Watch - 38mm"'} + + - {osx_image: xcode9.2, env: 'PLAT=macOS SWFT=4.0 DST="arch=x86_64"'} + - {osx_image: xcode9.2, env: 'PLAT=iOS SWFT=4.0 DST="OS=11.2,name=iPhone SE"'} + - {osx_image: xcode9.2, env: 'PLAT=tvOS SWFT=4.0 DST="OS=11.2,name=Apple TV"'} + - {osx_image: xcode9.2, env: 'PLAT=watchOS SWFT=4.0 DST="OS=4.2,name=Apple Watch - 38mm"'} + + - {osx_image: xcode9.4, env: 'PLAT=macOS SWFT=4.1 DST="arch=x86_64" TEST=1'} + - {osx_image: xcode9.4, env: 'PLAT=iOS SWFT=4.1 DST="OS=11.4,name=iPhone 5s" TEST=1'} + - {osx_image: xcode9.4, env: 'PLAT=tvOS SWFT=4.1 DST="OS=11.4,name=Apple TV" TEST=1'} + - {osx_image: xcode9.4, env: 'PLAT=watchOS SWFT=4.1 DST="OS=4.3,name=Apple Watch - 38mm"'} +cache: + directories: + - Carthage +before_install: + - carthage bootstrap --cache-builds --no-use-binaries --platform $PLAT --verbose +install: + - xcodebuild -scheme PMKOMGHTTPURLRQ -target PMKOMGHTTPURLRQ -quiet -destination "$DST" SWIFT_VERSION=$SWFT SWIFT_TREAT_WARNINGS_AS_ERRORS=YES build + - if [[ $TEST == "1" ]]; then + xcodebuild -scheme PMKOMGHTTPURLRQ -target PMKOMGTests -quiet -destination "$DST" build; + fi +script: + - if [[ $TEST == "1" ]]; then + xcodebuild -scheme PMKOMGHTTPURLRQ -quiet -destination "$DST" test; + fi diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile new file mode 100644 index 00000000..62674f61 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile @@ -0,0 +1,3 @@ +github "mxcl/PromiseKit" ~> 6.3 +github "mxcl/OMGHTTPURLRQ" ~> 3.2 +github "PromiseKit/Foundation" ~> 3.1 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.private b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.private new file mode 100644 index 00000000..13f82806 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.private @@ -0,0 +1 @@ +github "AliSoftware/OHHTTPStubs" ~> 6.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.resolved new file mode 100644 index 00000000..ebbdb140 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Cartfile.resolved @@ -0,0 +1,4 @@ +github "AliSoftware/OHHTTPStubs" "6.1.0" +github "PromiseKit/Foundation" "3.1.0" +github "mxcl/OMGHTTPURLRQ" "3.2.5" +github "mxcl/PromiseKit" "6.3.3" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c6190613 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.pbxproj @@ -0,0 +1,466 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6331B3FC1D657CB700544154 /* PMKOMGHTTPURLRQ.h in Headers */ = {isa = PBXBuildFile; fileRef = 6331B3F91D657CB700544154 /* PMKOMGHTTPURLRQ.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6331B3FF1D657DA400544154 /* NSURLSession+OMG+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 6331B3FD1D657DA400544154 /* NSURLSession+OMG+AnyPromise.m */; }; + 6331B4001D657DA400544154 /* NSURLSession+OMG+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6331B3FE1D657DA400544154 /* NSURLSession+OMG+Promise.swift */; }; + 6342D1B51D68E7BB005D7062 /* TestNSURLSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 6331B4011D657DDB00544154 /* TestNSURLSession.m */; }; + 63C700081D5C021F003BAE60 /* TestNSURLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKOMGHTTPURLRQ.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKOMGHTTPURLRQ.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKFoundation; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6331B3F91D657CB700544154 /* PMKOMGHTTPURLRQ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKOMGHTTPURLRQ.h; path = Sources/PMKOMGHTTPURLRQ.h; sourceTree = SOURCE_ROOT; }; + 6331B3FD1D657DA400544154 /* NSURLSession+OMG+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSURLSession+OMG+AnyPromise.m"; path = "Sources/NSURLSession+OMG+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 6331B3FE1D657DA400544154 /* NSURLSession+OMG+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSURLSession+OMG+Promise.swift"; path = "Sources/NSURLSession+OMG+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 6331B4011D657DDB00544154 /* TestNSURLSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestNSURLSession.m; path = Tests/TestNSURLSession.m; sourceTree = SOURCE_ROOT; }; + 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestNSURLSession.swift; path = Tests/TestNSURLSession.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKOMGHTTPURLRQ.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKOMGHTTPURLRQ.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKOMGTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKOMGTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8131D5C0C4E00503216 /* Cartfile.private */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile.private; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKOMGHTTPURLRQ.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8131D5C0C4E00503216 /* Cartfile.private */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKOMGHTTPURLRQ.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKOMGTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6331B3F91D657CB700544154 /* PMKOMGHTTPURLRQ.h */, + 6331B3FD1D657DA400544154 /* NSURLSession+OMG+AnyPromise.m */, + 6331B3FE1D657DA400544154 /* NSURLSession+OMG+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63C700021D5C021F003BAE60 /* TestNSURLSession.swift */, + 6331B4011D657DDB00544154 /* TestNSURLSession.m */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 6331B3FC1D657CB700544154 /* PMKOMGHTTPURLRQ.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKOMGHTTPURLRQ */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKOMGHTTPURLRQ" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKOMGHTTPURLRQ; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKOMGHTTPURLRQ.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKOMGTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKOMGTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKOMGTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKOMGTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0900; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKOMGHTTPURLRQ" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKOMGHTTPURLRQ */, + 63C7FFF11D5C020D003BAE60 /* PMKOMGTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + OMGHTTPURLRQ, + OHHTTPStubs, + PMKFoundation, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6331B3FF1D657DA400544154 /* NSURLSession+OMG+AnyPromise.m in Sources */, + 6331B4001D657DA400544154 /* NSURLSession+OMG+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C700081D5C021F003BAE60 /* TestNSURLSession.swift in Sources */, + 6342D1B51D68E7BB005D7062 /* TestNSURLSession.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKOMGHTTPURLRQ */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.OMGHTTPURLRQ; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.OMGHTTPURLRQ; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKOMGHTTPURLRQ" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKOMGHTTPURLRQ" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKOMGTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/xcshareddata/xcschemes/PMKOMGHTTPURLRQ.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/xcshareddata/xcschemes/PMKOMGHTTPURLRQ.xcscheme new file mode 100644 index 00000000..687cbb28 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/PMKOMGHTTPURLRQ.xcodeproj/xcshareddata/xcschemes/PMKOMGHTTPURLRQ.xcscheme @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/README.markdown new file mode 100644 index 00000000..078e121d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/README.markdown @@ -0,0 +1,65 @@ +# DEPRECATED + +Use PMKFoundation or PMKAlamofire, the promises provided by this repository are minimal +and add little value over just using OMG by itself and passing its URLRequests to +URLSession manually. + +# PromiseKit OMGHTTPURLRQ Extensions ![Build Status] + +This project provides convenience methods on NSURLSession using [OMGHTTPURLRQ]. + +## Usage + +```swift +URLSession.shared.POST(url, formData: params).then { data -> Void in + // by default you just get the raw `Data` +} + +URLSession.shared.GET(url).asDictionary().then { json -> Void in + // call `asDictionary()` to have the result decoded + // as JSON with the result being an `NSDictionary` + // the promise is rejected if the JSON can not be + // decoded or the resulting object is not a dictionary +} + +URLSession.shared.PUT(url, json: params).asArray().then { json -> Void in + // json: NSArray +} + +URLSession.shared.DELETE(url).asString().then { string -> Void in + // string: String +} +``` + +## CocoaPods + +```ruby +pod "PromiseKit/OMGHTTPURLRQ", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/OMGHTTPURLRQ-" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import OMGHTTPURLRQ +import PMKOMGHTTPURLRQ +``` + +```objc +// objc +@import PromiseKit; +@import OMGHTTPURLRQ; +@import PMKOMGHTTPURLRQ; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/OMGHTTPURLRQ.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+AnyPromise.m new file mode 100644 index 00000000..967354c5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+AnyPromise.m @@ -0,0 +1,100 @@ +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import "PMKOMGHTTPURLRQ.h" + +#if !COCOAPODS +#import +#else +#import "NSURLSession+AnyPromise.h" +#endif + +static id PMKURLRequestFromURLFormat(NSError **err, id urlFormat, ...); +static id go(NSURLSession *, NSMutableURLRequest *); + + +@implementation NSURLSession (PMKOMG) + +- (AnyPromise *)GET:(id)urlFormat, ... { + id err; + id rq = PMKURLRequestFromURLFormat(&err, urlFormat); + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +- (AnyPromise *)GET:(NSString *)url query:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ GET:url:params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +- (AnyPromise *)POST:(NSString *)url formURLEncodedParameters:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ POST:url:params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +- (AnyPromise *)POST:(NSString *)urlString JSON:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ POST:urlString JSON:params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +- (AnyPromise *)PUT:(NSString *)url formURLEncodedParameters:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ PUT:url:params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); + +} + +- (AnyPromise *)DELETE:(NSString *)url formURLEncodedParameters:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ DELETE:url :params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +- (AnyPromise *)PATCH:(NSString *)url JSON:(NSDictionary *)params { + id err; + id rq = [OMGHTTPURLRQ PATCH:url JSON:params error:&err]; + if (err) return [AnyPromise promiseWithValue:err]; + return go(self, rq); +} + +@end + + +static id PMKURLRequestFromURLFormat(NSError **err, id urlFormat, ...) { + if ([urlFormat isKindOfClass:[NSString class]]) { + va_list arguments; + va_start(arguments, urlFormat); + urlFormat = [[NSString alloc] initWithFormat:urlFormat arguments:arguments]; + va_end(arguments); + } else if ([urlFormat isKindOfClass:[NSURL class]]) { + NSMutableURLRequest *rq = [[NSMutableURLRequest alloc] initWithURL:urlFormat]; + [rq setValue:OMGUserAgent() forHTTPHeaderField:@"User-Agent"]; + return rq; + } else { + urlFormat = [urlFormat description]; + } + return [OMGHTTPURLRQ GET:urlFormat:nil error:err]; +} + +static id go(NSURLSession *session, NSMutableURLRequest *rq) { + if ([rq valueForHTTPHeaderField:@"User-Agent"] == nil) { + [rq setValue:OMGUserAgent() forHTTPHeaderField:@"User-Agent"]; + } + return [session promiseDataTaskWithRequest:rq]; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+Promise.swift new file mode 100644 index 00000000..eca85121 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/NSURLSession+OMG+Promise.swift @@ -0,0 +1,170 @@ +import OMGHTTPURLRQ +import Foundation +#if !PMKCocoaPods +import PMKFoundation +import PromiseKit +#endif + +/** + To import the `OMGHTTPURLRQ` category: + + use_frameworks! + pod "PromiseKit/OMGHTTPURLRQ" + + And then in your sources: + + import PromiseKit + + We provide convenience categories for the `URLSession.shared`, or + an instance method `promise`. If you need more complicated behavior + we recommend wrapping that usage in a `Promise` initializer. +*/ +extension URLSession { + /** + Makes a **GET** request to the provided URL. + + let p = URLSession.shared.GET("http://example.com", query: ["foo": "bar"]) + p.then { data -> Void in + //… + } + p.asImage().then { image -> Void in + //… + } + p.asDictionary().then { json -> Void in + //… + } + + - Parameter url: The URL to request. + - Parameter query: The parameters to be encoded as the query string for the GET request. + - Returns: A promise that represents the GET request. + */ + public func GET(_ url: String, query: [String: Any]? = nil) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.get(url, query) as URLRequest) + } + + /** + Makes a POST request to the provided URL passing form URL encoded + parameters. + + Form URL-encoding is the standard way to POST on the Internet, so + probably this is what you want. If it doesn’t work, try the `+POST:JSON` + variant. + + let url = "http://jsonplaceholder.typicode.com/posts" + let params = ["title": "foo", "body": "bar", "userId": 1] + URLSession.shared.POST(url, formData: params).asDictionary().then { json -> Void in + //… + } + + - Parameter url: The URL to request. + - Parameter formData: The parameters to be form URL-encoded and passed as the POST body. + - Returns: A promise that represents the POST request. + */ + public func POST(_ url: String, formData: [String: Any]? = nil) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.post(url, formData) as URLRequest) + } + + /** + Makes a POST request to the provided URL passing multipart form-data. + + let formData = OMGMultipartFormData() + let imgData = Data(contentsOfFile: "image.png") + formData.addFile(imgdata, parameterName: "file1", filename: "myimage1.png", contentType: "image/png") + + URLSession.shared.POST(url, multipartFormData: formData).then { data in + //… + } + + - Parameter url: The URL to request. + - Parameter multipartFormData: The parameters to be multipart form-data encoded and passed as the POST body. + - Returns: A promise that represents the POST request. + - SeeAlso: [https://github.com/mxcl/OMGHTTPURLRQ](OMGHTTPURLRQ) + */ + public func POST(_ url: String, multipartFormData: OMGMultipartFormData) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.post(url, multipartFormData) as URLRequest) + } + + /** + Makes a POST request to the provided URL passing JSON encoded + parameters. + + Most web servers nowadays support POST with either JSON or form + URL-encoding. If in doubt try form URL-encoded parameters first. + + let url = "http://jsonplaceholder.typicode.com/posts" + let params = ["title": "foo", "body": "bar", "userId": 1] + URLSession.shared.POST(url, json: params).asDictionary().then { json -> Void in + //… + } + + - Parameter url: The URL to request. + - Parameter json: The parameters to be JSON-encoded and passed as the POST body. + - Returns: A promise that represents the POST request. + */ + public func POST(_ url: String, json: [String: Any]? = nil) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.post(url, json: json) as URLRequest) + } + + /** + Makes a PUT request to the provided URL passing JSON encoded parameters. + + let url = "http://jsonplaceholder.typicode.com/posts" + let params = ["title": "foo", "body": "bar", "userId": 1] + URLSession.shared.PUT(url, json: params).asDictionary().then { json -> Void in + //… + } + + - Parameter url: The URL to request. + - Parameter json: The parameters to be JSON-encoded and passed as the PUT body. + - Returns: A promise that represents the PUT request. + */ + public func PUT(_ url: String, json: [String: Any]? = nil) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.put(url, json: json) as URLRequest) + } + + /** + Makes a DELETE request to the provided URL passing form URL-encoded + parameters. + + let url = "http://jsonplaceholder.typicode.com/posts/1" + URLSession.shared.DELETE(url).then.asDictionary() { json -> Void in + //… + } + + - Parameter url: The URL to request. + - Returns: A promise that represents the PUT request. + */ + public func DELETE(_ url: String) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.delete(url, nil) as URLRequest) + } + + /** + Makes a PATCH request to the provided URL passing the provided JSON parameters. + + let url = "http://jsonplaceholder.typicode.com/posts/1" + let params = ["foo": "bar"] + NSURLConnection.PATCH(url, json: params).asDictionary().then { json -> Void in + //… + } + - Parameter url: The URL to request. + - Parameter json: The JSON parameters to encode as the PATCH body. + - Returns: A promise that represents the PUT request. + */ + public func PATCH(_ url: String, json: [String: Any]? = nil) -> Promise<(data: Data, response: URLResponse)> { + return start(try OMGHTTPURLRQ.patch(url, json: json) as URLRequest) + } + + private func start(_ body: @autoclosure () throws -> URLRequest) -> Promise<(data: Data, response: URLResponse)> { + do { + var request = try body() + + if request.value(forHTTPHeaderField: "User-Agent") == nil { + request.setValue(OMGUserAgent(), forHTTPHeaderField: "User-Agent") + } + + return dataTask(.promise, with: request) + } catch { + return Promise(error: error) + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/PMKOMGHTTPURLRQ.h b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/PMKOMGHTTPURLRQ.h new file mode 100644 index 00000000..3c29f2df --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Sources/PMKOMGHTTPURLRQ.h @@ -0,0 +1,200 @@ +#import +#import + +/** + To import the `NSURLSession` category: + + use_frameworks! + pod "PromiseKit/Foundation" + + Or `NSURLSession` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + #import + + PromiseKit automatically deserializes the raw HTTP data response into the + appropriate rich data type based on the mime type the server provides. + Thus if the response is JSON you will get the deserialized JSON response. + PromiseKit supports decoding into strings, JSON and UIImages. + + However if your server does not provide a rich content-type, you will + just get `NSData`. This is rare, but a good example we came across was + downloading files from Dropbox. + + PromiseKit goes to quite some lengths to provide good `NSError` objects + for error conditions at all stages of the HTTP to rich-data type + pipeline. We provide the following additional `userInfo` keys as + appropriate: + + - `PMKURLErrorFailingDataKey` + - `PMKURLErrorFailingStringKey` + - `PMKURLErrorFailingURLResponseKey` + + PromiseKit uses [OMGHTTPURLRQ](https://github.com/mxcl/OMGHTTPURLRQ) to + make its HTTP requests. PromiseKit only provides a convenience layer + above OMGHTTPURLRQ, thus if you need more power (eg. a multipartFormData + POST), use OMGHTTPURLRQ to generate the `NSURLRequest` and then pass + that request to `+promise:`. + + @see https://github.com/mxcl/OMGHTTPURLRQ + */ +@interface NSURLSession (PMKOMG) + +/** + Makes a GET request to the provided URL. + + [NSURLSession GET:@"http://placekitten.com/320/320"].then(^(UIImage *img){ + // PromiseKit decodes the image (if it’s an image) + }); + + @param urlStringFormatOrURL The `NSURL` or string format to request. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)GET:(id)urlStringFormatOrURL, ... NS_REFINED_FOR_SWIFT; + +/** + Makes a GET request with the provided query parameters. + + id url = @"http://jsonplaceholder.typicode.com/comments"; + id params = @{@"postId": @1}; + [NSURLSession GET:url query:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The `NSURL` or URL string format to request. + + @param parameters The parameters to be encoded as the query string for the GET request. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)GET:(NSString *)urlString query:(NSDictionary *)parameters NS_REFINED_FOR_SWIFT; + +/** + Makes a POST request to the provided URL passing form URL encoded + parameters. + + Form URL-encoding is the standard way to POST on the Internet, so + probably this is what you want. If it doesn’t work, try the `+POST:JSON` + variant. + + id url = @"http://jsonplaceholder.typicode.com/posts"; + id params = @{@"title": @"foo", @"body": @"bar", @"userId": @1}; + [NSURLSession POST:url formURLEncodedParameters:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The URL to request. + + @param parameters The parameters to be form URL-encoded and passed as the POST body. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)POST:(NSString *)urlString formURLEncodedParameters:(NSDictionary *)parameters NS_REFINED_FOR_SWIFT; + +/** + Makes a POST request to the provided URL passing JSON encoded parameters. + + Most web servers nowadays support POST with either JSON or form + URL-encoding. If in doubt try form URL-encoded parameters first. + + id url = @"http://jsonplaceholder.typicode.com/posts"; + id params = @{@"title": @"foo", @"body": @"bar", @"userId": @1}; + [NSURLSession POST:url JSON:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The URL to request. + + @param JSONParameters The parameters to be JSON encoded and passed as the POST body. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)POST:(NSString *)urlString JSON:(NSDictionary *)JSONParameters NS_REFINED_FOR_SWIFT; + +/** + Makes a PUT request to the provided URL passing form URL-encoded + parameters. + + id url = @"http://jsonplaceholder.typicode.com/posts/1"; + id params = @{@"id": @1, @"title": @"foo", @"body": @"bar", @"userId": @1}; + [NSURLSession PUT:url formURLEncodedParameters:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The URL to request. + + @param parameters The parameters to be form URL-encoded and passed as the HTTP body. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)PUT:(NSString *)urlString formURLEncodedParameters:(NSDictionary *)parameters NS_REFINED_FOR_SWIFT; + +/** + Makes a DELETE request to the provided URL passing form URL-encoded + parameters. + + id url = @"http://jsonplaceholder.typicode.com/posts/1"; + id params = nil; + [NSURLSession DELETE:url formURLEncodedParameters:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The URL to request. + + @param parameters The parameters to be form URL-encoded and passed as the HTTP body. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)DELETE:(NSString *)urlString formURLEncodedParameters:(NSDictionary *)parameters NS_REFINED_FOR_SWIFT; + +/** + Makes a PATCH request to the provided URL passing the provided JSON parameters. + + id url = @"http://jsonplaceholder.typicode.com/posts/1"; + id params = nil; + [NSURLSession PATCH:url JSON:params].then(^(NSDictionary *jsonResponse){ + // PromiseKit decodes the JSON dictionary (if it’s JSON) + }); + + @param urlString The URL to request. + + @param JSONParameters The JSON parameters. + + @return A promise that fulfills with three parameters: + + 1) The deserialized data response. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + */ +- (AnyPromise *)PATCH:(NSString *)urlString JSON:(NSDictionary *)JSONParameters NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.m b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.m new file mode 100644 index 00000000..d8c6d0d2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.m @@ -0,0 +1,48 @@ +@import PMKOMGHTTPURLRQ; +@import PMKFoundation; +@import OHHTTPStubs; +@import PromiseKit; +@import XCTest; + + +@implementation NSURLSessionTests: XCTestCase + +- (void)tearDown { + [OHHTTPStubs removeAllStubs]; +} + +- (void)test1 { + id stubData = [NSData dataWithBytes:"[a: 3]" length:1]; + + [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *rq){ + return [rq.URL.host isEqualToString:@"example.com"]; + } withStubResponse:^(NSURLRequest *request){ + return [OHHTTPStubsResponse responseWithData:stubData statusCode:200 headers:@{@"Content-Type": @"application/json"}]; + }]; + + id ex = [self expectationWithDescription:@""]; + + [[NSURLSession sharedSession] GET:[NSURL URLWithString:@"http://example.com"]].catch(^(NSError *err){ + XCTAssertEqualObjects(err.domain, NSCocoaErrorDomain); //TODO this is why we should replace this domain + XCTAssertEqual(err.code, 3840); + XCTAssertEqualObjects(err.userInfo[PMKURLErrorFailingDataKey], stubData); + XCTAssertNotNil(err.userInfo[PMKURLErrorFailingURLResponseKey]); + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test2 { + id ex = [self expectationWithDescription:@""]; + + [[NSURLSession sharedSession] GET:nil].catch(^(NSError *err){ + XCTAssertEqualObjects(err.domain, NSURLErrorDomain); + XCTAssertEqual(err.code, NSURLErrorUnsupportedURL); + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.swift b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.swift new file mode 100644 index 00000000..8e3d77e9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/OMGHTTPURLRQ/Tests/TestNSURLSession.swift @@ -0,0 +1,74 @@ +import PMKOMGHTTPURLRQ +import OHHTTPStubs +import PromiseKit +import XCTest + +class NSURLSessionTests: XCTestCase { + func test1() { + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + } + + let ex = expectation(description: "") + URLSession.shared.GET("http://example.com").compactMap { + try JSONSerialization.jsonObject(with: $0.data) + }.done { + XCTAssertEqual(json, $0 as? NSDictionary) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func test2() { + + // test that Promise chains thens + // this test because I don’t trust the Swift compiler + + let dummy = ("fred" as NSString).data(using: String.Encoding.utf8.rawValue)! + + OHHTTPStubs.stubRequests(passingTest: { $0.url!.host == "example.com" }) { _ in + return OHHTTPStubsResponse(data: dummy, statusCode: 200, headers: [:]) + } + + let ex = expectation(description: "") + + after(seconds: 0.1).then { + URLSession.shared.GET("http://example.com") + }.done { + XCTAssertEqual($0.data, dummy) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testSyntax() { + let json: NSDictionary = ["key1": "value1", "key2": ["value2A", "value2B"]] + + OHHTTPStubs.stubRequests(passingTest: { + $0.url!.host == "example.com" + }, withStubResponse: { _ in + OHHTTPStubsResponse(jsonObject: json, statusCode: 200, headers: nil) + }) + + let p = URLSession.shared.GET("http://example.com", query: [ + "1": 1, + "2": 2 + ]) + + let ex = expectation(description: "") + p.compactMap { + try JSONSerialization.jsonObject(with: $0.data) + }.done { + XCTAssertEqual(json, $0 as? NSDictionary) + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + override func tearDown() { + OHHTTPStubs.removeAllStubs() + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Photos/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Photos/.travis.yml new file mode 100644 index 00000000..b33720d9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/.travis.yml @@ -0,0 +1,73 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode9.2 + env: SWIFT=3.2 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Photos/Sources + cp -R ../../../Sources Extensions/Photos + pod lib lint --subspec=PromiseKit/Photos --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache.directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKPhotos + xcode_project: PMKPhotos.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Photos/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.pbxproj new file mode 100644 index 00000000..6f6c7027 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.pbxproj @@ -0,0 +1,450 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 63859F4C1D5D4D5F0021C52A /* PHPhotoLibrary+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63859F4B1D5D4D5F0021C52A /* PHPhotoLibrary+Promise.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKPhotos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKPhotos.framework */; }; + 63EE66491D5F8915002F86B0 /* PHPhototLibraryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63EE66481D5F8915002F86B0 /* PHPhototLibraryTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKPhotos; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 63859F4B1D5D4D5F0021C52A /* PHPhotoLibrary+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "PHPhotoLibrary+Promise.swift"; path = "Sources/PHPhotoLibrary+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKPhotos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKPhotos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKPHTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKPHTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63EE66481D5F8915002F86B0 /* PHPhototLibraryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PHPhototLibraryTests.swift; path = Tests/PHPhototLibraryTests.swift; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKPhotos.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKPhotos.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKPHTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 63859F4B1D5D4D5F0021C52A /* PHPhotoLibrary+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63EE66481D5F8915002F86B0 /* PHPhototLibraryTests.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKPhotos */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKPhotos" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKPhotos; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKPhotos.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKPHTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKPHTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKPHTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKPHTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKPhotos" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKPhotos */, + 63C7FFF11D5C020D003BAE60 /* PMKPHTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63859F4C1D5D4D5F0021C52A /* PHPhotoLibrary+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63EE66491D5F8915002F86B0 /* PHPhototLibraryTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKPhotos */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 10.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 10.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Photos; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Photos; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKPhotos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKPhotos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKPHTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/xcshareddata/xcschemes/PMKPhotos.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/xcshareddata/xcschemes/PMKPhotos.xcscheme new file mode 100644 index 00000000..3d33c794 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/PMKPhotos.xcodeproj/xcshareddata/xcschemes/PMKPhotos.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Photos/README.markdown new file mode 100644 index 00000000..a6bad75d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit Photos Extensions ![Build Status] + +This project adds promises to Apple’s Photos framework. + +## CocoaPods + +```ruby +pod "PromiseKit/Photos", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/Photos" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKPhotos +``` + +```objc +// objc +@import PromiseKit; +@import PMKPhotos; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/Photos.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Sources/PHPhotoLibrary+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Sources/PHPhotoLibrary+Promise.swift new file mode 100644 index 00000000..993762fe --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Sources/PHPhotoLibrary+Promise.swift @@ -0,0 +1,24 @@ +import Photos.PHPhotoLibrary +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `PHPhotoLibrary` category: + + use_frameworks! + pod "PromiseKit/Photos" + + And then in your sources: + + import PromiseKit +*/ +extension PHPhotoLibrary { + /** + - Returns: A promise that fulfills with the user’s authorization + - Note: This promise cannot reject. + */ + public class func requestAuthorization() -> Guarantee { + return Guarantee(resolver: PHPhotoLibrary.requestAuthorization) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Photos/Tests/PHPhototLibraryTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Tests/PHPhototLibraryTests.swift new file mode 100644 index 00000000..d0c1fec3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Photos/Tests/PHPhototLibraryTests.swift @@ -0,0 +1,12 @@ +import PromiseKit +import PMKPhotos +import Photos +import XCTest + +class PHTestCase: XCTestCase { + func test() { + let ex = expectation(description: "") + PHPhotoLibrary.requestAuthorization().done{ _ in ex.fulfill() } + waitForExpectations(timeout: 10) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.travis.yml new file mode 100644 index 00000000..5fef7788 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/.travis.yml @@ -0,0 +1,82 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + os: osx + language: objective-c + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/QuartzCore/Sources + cp -R ../../../Sources Extensions/QuartzCore + pod lib lint --subspec=PromiseKit/QuartzCore --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKQuartzCore + xcode_project: PMKQuartzCore.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/Info.plist new file mode 100644 index 00000000..6c6c23c4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/PMKQCTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/PMKQCTests.swift new file mode 100644 index 00000000..47b21e9f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQCTests/PMKQCTests.swift @@ -0,0 +1,35 @@ +// +// PMKQCTests.swift +// PMKQCTests +// +// Created by Max Howell on 8/13/16. +// Copyright © 2016 Max Howell. All rights reserved. +// + +import XCTest + +class PMKQCTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.pbxproj new file mode 100644 index 00000000..ded2d202 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.pbxproj @@ -0,0 +1,485 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 637B4A741D5D5FC600E1BC6C /* PMKQuartzCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 637B4A731D5D5FC600E1BC6C /* PMKQuartzCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 639E8D041D5D651300D210E4 /* CALayer+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 639E8D021D5D651300D210E4 /* CALayer+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 639E8D051D5D651300D210E4 /* CALayer+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 639E8D031D5D651300D210E4 /* CALayer+AnyPromise.m */; }; + 63D9E6791D6013E7006B2661 /* PMKQCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D9E6781D6013E7006B2661 /* PMKQCTests.swift */; }; + 63E15130219F387C003CE725 /* CALayer+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E1512F219F387C003CE725 /* CALayer+Promise.swift */; }; + 63E15132219F457E003CE725 /* TestQuartzCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63E15131219F457E003CE725 /* TestQuartzCore.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63E15133219F45F9003CE725 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKQuartzCore; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 637B4A731D5D5FC600E1BC6C /* PMKQuartzCore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKQuartzCore.h; path = Sources/PMKQuartzCore.h; sourceTree = SOURCE_ROOT; }; + 639E8D021D5D651300D210E4 /* CALayer+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "CALayer+AnyPromise.h"; path = "Sources/CALayer+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 639E8D031D5D651300D210E4 /* CALayer+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "CALayer+AnyPromise.m"; path = "Sources/CALayer+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 639E8D061D5D651D00D210E4 /* TestQuartzCore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestQuartzCore.m; path = Tests/TestQuartzCore.m; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKQuartzCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKQuartzCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + 63D9E6761D6013E7006B2661 /* PMKQCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKQCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63D9E6781D6013E7006B2661 /* PMKQCTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PMKQCTests.swift; sourceTree = ""; }; + 63D9E67A1D6013E7006B2661 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63E1512F219F387C003CE725 /* CALayer+Promise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CALayer+Promise.swift"; sourceTree = ""; }; + 63E15131219F457E003CE725 /* TestQuartzCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestQuartzCore.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63D9E6731D6013E7006B2661 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63D9E6771D6013E7006B2661 /* PMKQCTests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKQuartzCore.framework */, + 63D9E6761D6013E7006B2661 /* PMKQCTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 637B4A731D5D5FC600E1BC6C /* PMKQuartzCore.h */, + 639E8D021D5D651300D210E4 /* CALayer+AnyPromise.h */, + 639E8D031D5D651300D210E4 /* CALayer+AnyPromise.m */, + 63E1512F219F387C003CE725 /* CALayer+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 639E8D061D5D651D00D210E4 /* TestQuartzCore.m */, + 63E15131219F457E003CE725 /* TestQuartzCore.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; + 63D9E6771D6013E7006B2661 /* PMKQCTests */ = { + isa = PBXGroup; + children = ( + 63D9E6781D6013E7006B2661 /* PMKQCTests.swift */, + 63D9E67A1D6013E7006B2661 /* Info.plist */, + ); + path = PMKQCTests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 637B4A741D5D5FC600E1BC6C /* PMKQuartzCore.h in Headers */, + 639E8D041D5D651300D210E4 /* CALayer+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKQuartzCore */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKQuartzCore" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKQuartzCore; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKQuartzCore.framework */; + productType = "com.apple.product-type.framework"; + }; + 63D9E6751D6013E7006B2661 /* PMKQCTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63D9E67B1D6013E7006B2661 /* Build configuration list for PBXNativeTarget "PMKQCTests" */; + buildPhases = ( + 63D9E6721D6013E7006B2661 /* Sources */, + 63D9E6731D6013E7006B2661 /* Frameworks */, + 63D9E6741D6013E7006B2661 /* Resources */, + 63D9E67E1D6013F5006B2661 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 63E15134219F45F9003CE725 /* PBXTargetDependency */, + ); + name = PMKQCTests; + productName = PMKQCTests; + productReference = 63D9E6761D6013E7006B2661 /* PMKQCTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63D9E6751D6013E7006B2661 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKQuartzCore" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKQuartzCore */, + 63D9E6751D6013E7006B2661 /* PMKQCTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 63D9E6741D6013E7006B2661 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 63D9E67E1D6013F5006B2661 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 639E8D051D5D651300D210E4 /* CALayer+AnyPromise.m in Sources */, + 63E15130219F387C003CE725 /* CALayer+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63D9E6721D6013E7006B2661 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63D9E6791D6013E7006B2661 /* PMKQCTests.swift in Sources */, + 63E15132219F457E003CE725 /* TestQuartzCore.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63E15134219F45F9003CE725 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKQuartzCore */; + targetProxy = 63E15133219F45F9003CE725 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.QuartzCore; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.QuartzCore; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63D9E67C1D6013E7006B2661 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = PMKQCTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @loader_path/../Frameworks @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.PMKQCTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 63D9E67D1D6013E7006B2661 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = PMKQCTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @loader_path/../Frameworks @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.PMKQCTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKQuartzCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKQuartzCore" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63D9E67B1D6013E7006B2661 /* Build configuration list for PBXNativeTarget "PMKQCTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63D9E67C1D6013E7006B2661 /* Debug */, + 63D9E67D1D6013E7006B2661 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/xcshareddata/xcschemes/PMKQuartzCore.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/xcshareddata/xcschemes/PMKQuartzCore.xcscheme new file mode 100644 index 00000000..ff8daea9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/PMKQuartzCore.xcodeproj/xcshareddata/xcschemes/PMKQuartzCore.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/README.markdown new file mode 100644 index 00000000..a122759b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit QuartzCore Extensions ![Build Status] + +This project adds promises to Apple’s QuartzCore framework. + +## CocoaPods + +```ruby +pod "PromiseKit/QuartzCore" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/QuartzCore" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKQuartzCore +``` + +```objc +// objc +@import PromiseKit; +@import PMKQuartzCore; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/QuartzCore.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.h new file mode 100644 index 00000000..0026d378 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.h @@ -0,0 +1,40 @@ +// +// CALayer+AnyPromise.h +// +// Created by María Patricia Montalvo Dzib on 24/11/14. +// Copyright (c) 2014 Aluxoft SCP. All rights reserved. +// + +#import +#import + +/** + To import the `CALayer` category: + + use_frameworks! + pod "PromiseKit/QuartzCore" + + Or `CALayer` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface CALayer (PromiseKit) + +/** + Add the specified animation object to the layer’s render tree. + + @return A promise that thens two parameters: + + 1. `@YES` if the animation progressed entirely to completion. + 2. The `CAAnimation` object. + + @see addAnimation:forKey +*/ +- (AnyPromise *)promiseAnimation:(CAAnimation *)animation forKey:(NSString *)key; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.m new file mode 100644 index 00000000..6ad7e2f1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+AnyPromise.m @@ -0,0 +1,36 @@ +// +// CALayer+PromiseKit.m +// +// Created by María Patricia Montalvo Dzib on 24/11/14. +// Copyright (c) 2014 Aluxoft SCP. All rights reserved. +// + +#import +#import "CALayer+AnyPromise.h" + +@interface PMKCAAnimationDelegate : NSObject { +@public + PMKResolver resolve; + CAAnimation *animation; +} +@end + +@implementation PMKCAAnimationDelegate + +- (void)animationDidStop:(CAAnimation *)ignoreOrRetainCycleHappens finished:(BOOL)flag { + resolve(PMKManifold(@(flag), animation)); + animation.delegate = nil; +} + +@end + +@implementation CALayer (PromiseKit) + +- (AnyPromise *)promiseAnimation:(CAAnimation *)animation forKey:(NSString *)key { + PMKCAAnimationDelegate *d = animation.delegate = [PMKCAAnimationDelegate new]; + d->animation = animation; + [self addAnimation:animation forKey:key]; + return [[AnyPromise alloc] initWithResolver:&d->resolve]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+Promise.swift new file mode 100644 index 00000000..d5137254 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/CALayer+Promise.swift @@ -0,0 +1,31 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import QuartzCore + +public extension CALayer { + /** + Adds an animation to a layer, returning a Guarantee which resolves when the animation stops. + + layer.add(.promise, animation: animation).done { finished in + //… + } + */ + func add(_: PMKNamespacer, animation: CAAnimation, forKey key: String? = nil) -> Guarantee { + let proxy = Proxy() + proxy.retainCycle = proxy + animation.delegate = proxy + add(animation, forKey: key) + return proxy.pending.guarantee + } +} + +private class Proxy: NSObject, CAAnimationDelegate { + var retainCycle: Proxy? + let pending = Guarantee.pending() + + func animationDidStop(_ anim: CAAnimation, finished flag: Bool) { + pending.resolve(flag) + retainCycle = nil + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/PMKQuartzCore.h b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/PMKQuartzCore.h new file mode 100644 index 00000000..585f7fdd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Sources/PMKQuartzCore.h @@ -0,0 +1 @@ +#import "CALayer+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.m b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.m new file mode 100644 index 00000000..249d5f7a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.m @@ -0,0 +1,18 @@ +@import PMKQuartzCore; +@import PromiseKit; +@import QuartzCore; +@import XCTest; + +@implementation TestCALayer: XCTestCase + +- (void)test { + id ex = [self expectationWithDescription:@""]; + + [[CALayer layer] promiseAnimation:[CAAnimation new] forKey:@"center"].then(^{ + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.swift b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.swift new file mode 100644 index 00000000..9e5492b0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/QuartzCore/Tests/TestQuartzCore.swift @@ -0,0 +1,16 @@ +import PMKQuartzCore +import PromiseKit +import QuartzCore +import XCTest + +class TestCALayer: XCTestCase { + func test() { + let ex = expectation(description: "") + + CALayer().add(.promise, animation: CAAnimation()).done { _ in + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/Social/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/Social/.travis.yml new file mode 100644 index 00000000..4c57619e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/.travis.yml @@ -0,0 +1,78 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/Social/Sources + cp -R ../../../Sources Extensions/Social + pod lib lint --subspec=PromiseKit/Social --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKSocial + xcode_project: PMKSocial.xcodeproj + xcode_destination: 'platform=macOS' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile new file mode 100644 index 00000000..019d387b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile @@ -0,0 +1,2 @@ +github "mxcl/PromiseKit" ~> 6.8.4 +github "PromiseKit/Foundation" ~> 3.0 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile.resolved new file mode 100644 index 00000000..950dfab1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Cartfile.resolved @@ -0,0 +1,2 @@ +github "PromiseKit/Foundation" "3.3.2" +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/Social/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/Social/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/Social/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.pbxproj new file mode 100644 index 00000000..b2753084 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.pbxproj @@ -0,0 +1,469 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 637B4A741D5D5FC600E1BC6C /* PMKSocial.h in Headers */ = {isa = PBXBuildFile; fileRef = 637B4A731D5D5FC600E1BC6C /* PMKSocial.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63B8B9A81D5D621F007AAB62 /* SLComposeViewController+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B8B9A41D5D621F007AAB62 /* SLComposeViewController+Promise.swift */; }; + 63B8B9A91D5D621F007AAB62 /* SLRequest+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B8B9A51D5D621F007AAB62 /* SLRequest+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63B8B9AA1D5D621F007AAB62 /* SLRequest+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B8B9A61D5D621F007AAB62 /* SLRequest+AnyPromise.m */; }; + 63B8B9AB1D5D621F007AAB62 /* SLRequest+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B8B9A71D5D621F007AAB62 /* SLRequest+Promise.swift */; }; + 63B8B9AE1D5D622E007AAB62 /* TestSocial.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B8B9AC1D5D622E007AAB62 /* TestSocial.m */; }; + 63B8B9AF1D5D622E007AAB62 /* TestSocial.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B8B9AD1D5D622E007AAB62 /* TestSocial.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKSocial.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKSocial.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKSocial; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 637B4A731D5D5FC600E1BC6C /* PMKSocial.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKSocial.h; path = Sources/PMKSocial.h; sourceTree = SOURCE_ROOT; }; + 63B8B9A41D5D621F007AAB62 /* SLComposeViewController+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SLComposeViewController+Promise.swift"; path = "Sources/SLComposeViewController+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63B8B9A51D5D621F007AAB62 /* SLRequest+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SLRequest+AnyPromise.h"; path = "Sources/SLRequest+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 63B8B9A61D5D621F007AAB62 /* SLRequest+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SLRequest+AnyPromise.m"; path = "Sources/SLRequest+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 63B8B9A71D5D621F007AAB62 /* SLRequest+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SLRequest+Promise.swift"; path = "Sources/SLRequest+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63B8B9AC1D5D622E007AAB62 /* TestSocial.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestSocial.m; path = Tests/TestSocial.m; sourceTree = SOURCE_ROOT; }; + 63B8B9AD1D5D622E007AAB62 /* TestSocial.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestSocial.swift; path = Tests/TestSocial.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKSocial.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKSocial.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKSLTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKSLTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKSocial.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKSocial.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKSLTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 637B4A731D5D5FC600E1BC6C /* PMKSocial.h */, + 63B8B9A41D5D621F007AAB62 /* SLComposeViewController+Promise.swift */, + 63B8B9A51D5D621F007AAB62 /* SLRequest+AnyPromise.h */, + 63B8B9A61D5D621F007AAB62 /* SLRequest+AnyPromise.m */, + 63B8B9A71D5D621F007AAB62 /* SLRequest+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 63B8B9AC1D5D622E007AAB62 /* TestSocial.m */, + 63B8B9AD1D5D622E007AAB62 /* TestSocial.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 637B4A741D5D5FC600E1BC6C /* PMKSocial.h in Headers */, + 63B8B9A91D5D621F007AAB62 /* SLRequest+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKSocial */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKSocial" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKSocial; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKSocial.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKSLTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSLTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKSLTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKSLTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKSocial" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKSocial */, + 63C7FFF11D5C020D003BAE60 /* PMKSLTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + PMKFoundation, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63B8B9A81D5D621F007AAB62 /* SLComposeViewController+Promise.swift in Sources */, + 63B8B9AB1D5D621F007AAB62 /* SLRequest+Promise.swift in Sources */, + 63B8B9AA1D5D621F007AAB62 /* SLRequest+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63B8B9AF1D5D622E007AAB62 /* TestSocial.swift in Sources */, + 63B8B9AE1D5D622E007AAB62 /* TestSocial.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKSocial */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.StoreKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.StoreKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKSocial" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKSocial" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSLTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/xcshareddata/xcschemes/PMKSocial.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/xcshareddata/xcschemes/PMKSocial.xcscheme new file mode 100644 index 00000000..a4bc24a7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/PMKSocial.xcodeproj/xcshareddata/xcschemes/PMKSocial.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/Social/README.markdown new file mode 100644 index 00000000..bd6a9f9e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit Social Extensions ![Build Status] + +This project adds promises to Apple’s Social framework. + +## CocoaPods + +```ruby +pod "PromiseKit/Social", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/Social" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKSocial +``` + +```objc +// objc +@import PromiseKit; +@import PMKSocial; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/Social.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/PMKSocial.h b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/PMKSocial.h new file mode 100644 index 00000000..8eeb321c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/PMKSocial.h @@ -0,0 +1 @@ +#import "SLRequest+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLComposeViewController+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLComposeViewController+Promise.swift new file mode 100644 index 00000000..ab23a105 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLComposeViewController+Promise.swift @@ -0,0 +1,48 @@ +#if !os(OSX) + +import Social.SLComposeViewController +import UIKit.UIViewController +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import this `UIViewController` category: + + use_frameworks! + pod "PromiseKit/Social" + + And then in your sources: + + import PromiseKit +*/ +extension UIViewController { + /// Presents the message view controller and resolves with the user action. + public func promise(_ vc: SLComposeViewController, animated: Bool = true, completion: (() -> Void)? = nil) -> Promise { + present(vc, animated: animated, completion: completion) + return Promise { seal in + vc.completionHandler = { result in + if result == .cancelled { + seal.reject(SLComposeViewController.PMKError.cancelled) + } else { + seal.fulfill(()) + } + } + } + } +} + +extension SLComposeViewController { + /// Errors representing PromiseKit SLComposeViewController failures + public enum PMKError: CancellableError { + /// The user cancelled the view controller. + case cancelled + + /// - Returns: true + public var isCancelled: Bool { + switch self { case .cancelled: return true } + } + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.h new file mode 100644 index 00000000..190417ff --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.h @@ -0,0 +1,36 @@ +// +// Created by merowing on 09/05/2014. +// +// +// + +#import +#import + +/** + To import the `SLRequest` category: + + use_frameworks! + pod "PromiseKit/Social" + + And then in your sources: + + @import PromiseKit; +*/ +@interface SLRequest (PromiseKit) + +/** + Performs the request asynchronously. + + @return A promise that fulfills with three parameters: + + 1) The response decoded as JSON. + 2) The `NSHTTPURLResponse`. + 3) The raw `NSData` response. + + @warning *Note* If PromiseKit determines the response is not JSON, the first + parameter will instead be plain `NSData`. +*/ +- (AnyPromise *)promise NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.m new file mode 100644 index 00000000..01a1ea94 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+AnyPromise.m @@ -0,0 +1,51 @@ +// +// Created by merowing on 09/05/2014. +// +// +// + +#import +#import "SLRequest+AnyPromise.h" + +#if COCOAPODS +#import "NSURLSession+AnyPromise.h" +#else +#import +#endif + +@implementation SLRequest (PromiseKit) + +- (AnyPromise *)promise { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + [self performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { + + assert(![NSThread isMainThread]); + + if (error) + return resolve(error); + + NSInteger const statusCode = urlResponse.statusCode; + if (statusCode < 200 || statusCode >= 300) { + id userInfo = [NSMutableDictionary new]; + userInfo[PMKURLErrorFailingURLResponseKey] = urlResponse; + userInfo[NSLocalizedDescriptionKey] = [NSHTTPURLResponse localizedStringForStatusCode:statusCode]; + + if (responseData) { + id str = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; + userInfo[PMKURLErrorFailingStringKey] = str; + } + + resolve([NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorBadServerResponse userInfo:userInfo]); + } + else if (PMKHTTPURLResponseIsJSON(urlResponse)) { + id err = nil; + id json = [NSJSONSerialization JSONObjectWithData:responseData options:PMKJSONDeserializationOptions error:&err]; + resolve(err ?: PMKManifold(json, urlResponse, responseData)); + } else { + resolve(PMKManifold(responseData, urlResponse, responseData)); + } + }]; + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+Promise.swift new file mode 100644 index 00000000..c2a04313 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Sources/SLRequest+Promise.swift @@ -0,0 +1,37 @@ +#if !PMKCocoaPods +import PMKFoundation +import PromiseKit +#endif +import Social + +/** + To import the `SLRequest` category: + + use_frameworks! + pod "PromiseKit/Social" + + And then in your sources: + + import PromiseKit +*/ +extension SLRequest { + /** + Performs the request asynchronously. + + - Returns: A promise that fulfills with the response. + - SeeAlso: `URLDataPromise` + */ + public func perform() -> Promise<(data: Data, response: HTTPURLResponse)> { + return Promise { seal in + perform { data, rsp, error in + if let data = data, let rsp = rsp { + seal.fulfill((data, rsp)) + } else if let error = error { + seal.reject(error) + } else { + seal.reject(PMKError.invalidCallingConvention) + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSLComposeViewController.swift b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSLComposeViewController.swift new file mode 100644 index 00000000..3ada515f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSLComposeViewController.swift @@ -0,0 +1,16 @@ +import XCTest + +class UITest_SLComposeViewController_Swift: PMKiOSUITestCase { + func test_can_cancel() { + let app = XCUIApplication() + app.tables.staticTexts["5"].tap() + + sleep(5) // takes longer than usual + + app.alerts.buttons["Cancel"].tap() + + sleep(3) // takes longer than usual (this may only pass when you look at it) + + XCTAssertTrue(value) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.m b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.m new file mode 100644 index 00000000..61e646b2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.m @@ -0,0 +1,136 @@ +@import PMKSocial; +@import XCTest; + + +@interface MockSLRequest: SLRequest +@property id response; +@property id data; +@property id error; +@end +@implementation MockSLRequest +- (void)performRequestWithHandler:(SLRequestHandler)handler { + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + handler(_data, _response, _error); + }); +} +@end + + +@implementation Test_SLRequest_ObjC: XCTestCase + +- (void)test1 { + id url = [NSURL URLWithString:@"http://example.com"]; + id input = @{@"3": @4}; + + MockSLRequest *request = (id) [MockSLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:@{@"1": @2}]; + request.response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:200 HTTPVersion:@"1.1" headerFields:@{@"Content-Type": @"application/json"}]; + request.data = [NSJSONSerialization dataWithJSONObject:input options:0 error:nil]; + + id ex = [self expectationWithDescription:@""]; + [request promise].then(^(id json){ + XCTAssertEqualObjects(json, input); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test2 { + id url = [NSURL URLWithString:@"http://example.com"]; + + MockSLRequest *request = (id) [MockSLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:@{@"1": @2}]; + request.response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:500 HTTPVersion:@"1.1" headerFields:@{}]; + + id ex = [self expectationWithDescription:@""]; + [request promise].catch(^(id err){ + XCTAssertEqualObjects(NSURLErrorDomain, [err domain]); + XCTAssertEqual([err code], NSURLErrorBadServerResponse); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test3 { + id url = [NSURL URLWithString:@"http://example.com"]; + id data = [NSData dataWithBytes:"abc" length:3]; + + MockSLRequest *request = (id) [MockSLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:@{@"1": @2}]; + request.response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:200 HTTPVersion:@"1.1" headerFields:@{}]; + request.data = data; + + id ex = [self expectationWithDescription:@""]; + [request promise].then(^(id rspdata){ + XCTAssertEqualObjects(data, rspdata); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test4 { + id url = [NSURL URLWithString:@"http://example.com"]; + + MockSLRequest *request = (id) [MockSLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:@{@"1": @2}]; + request.response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:200 HTTPVersion:@"1.1" headerFields:@{}]; + request.error = [NSError errorWithDomain:@"Cat" code:123 userInfo:nil]; + + id ex = [self expectationWithDescription:@""]; + [request promise].catch(^(NSError *error){ + XCTAssertEqual(error.code, 123); + XCTAssertEqualObjects(error.domain, @"Cat"); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end + + +#ifndef TARGET_OS_MAC + +#import +@import Social.SLComposeViewController; +@import Stubbilino; +#import "UIViewController+AnyPromise.h" + +@implementation Test_SLComposeViewController_ObjC: XCTestCase + +- (void)__test:(SLComposeViewControllerResult)dummy :(void (^)(AnyPromise *, id expectation))block { + id rootvc = [UIViewController new]; + id ex = [self expectationWithDescription:@""]; + + SLComposeViewController *composevc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; + + id stub = [Stubbilino stubObject:rootvc]; + [stub stubMethod:@selector(presentViewController:animated:completion:) withBlock:^{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + composevc.completionHandler(dummy); + }); + }]; + + block([rootvc promiseViewController:composevc animated:NO completion:nil], ex); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test1 { + NSInteger dummy = SLComposeViewControllerResultDone; + + [self __test:dummy :^(AnyPromise *promise, id expectation) { + promise.then(^(id result){ + XCTAssertEqual([result integerValue], dummy); + [expectation fulfill]; + }); + }]; +} + +- (void)test2 { + [self __test:SLComposeViewControllerResultCancelled :^(AnyPromise *promise, id expectation) { + promise.catchWithPolicy(PMKCatchPolicyAllErrors, ^(NSError *error){ + XCTAssertTrue(error.cancelled); + [expectation fulfill]; + }); + }]; +} + +@end + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.swift b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.swift new file mode 100644 index 00000000..9fb18885 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/Social/Tests/TestSocial.swift @@ -0,0 +1,56 @@ +import PromiseKit +import PMKSocial +import Social +import XCTest + +class SLRequestTests: XCTestCase { + func testSLRequest() { + // I tried to just override SLRequest, but Swift wouldn't let me + // then use the long initializer, and an exception is thrown inside + // init() + + swizzle(SLRequest.self, #selector(SLRequest.perform(handler:))) { + let url = URL(string: "https://api.twitter.com/1.1/statuses/user_timeline.json") + let params = ["foo": "bar"] + let rq = SLRequest(forServiceType: SLServiceTypeTwitter, requestMethod: .GET, url: url, parameters: params)! + + let ex = expectation(description: "") + rq.perform().done { + XCTAssertEqual($0.data, Data()) + ex.fulfill() + }.catch { + XCTFail("\($0)") + } + waitForExpectations(timeout: 1, handler: nil) + } + } +} + +extension SLRequest { + @objc private func pmk_performRequestWithHandler(_ handler: @escaping SLRequestHandler) { + after(seconds: 0).done { _ in + let rsp = HTTPURLResponse(url: URL(string: "http://example.com")!, statusCode: 200, httpVersion: "2.0", headerFields: [:]) + handler(Data(), rsp, nil) + } + } +} + + +import ObjectiveC + +func swizzle(_ foo: AnyClass, _ from: Selector, isClassMethod: Bool = false, body: () -> Void) { + let originalMethod: Method! + let swizzledMethod: Method! + + if isClassMethod { + originalMethod = class_getClassMethod(foo, from) + swizzledMethod = class_getClassMethod(foo, Selector("pmk_\(from)")) + } else { + originalMethod = class_getInstanceMethod(foo, from) + swizzledMethod = class_getInstanceMethod(foo, Selector("pmk_\(from)")) + } + + method_exchangeImplementations(originalMethod, swizzledMethod) + body() + method_exchangeImplementations(swizzledMethod, originalMethod) +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.travis.yml new file mode 100644 index 00000000..76450b19 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/.travis.yml @@ -0,0 +1,91 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - swiftPM + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/StoreKit/Sources + cp -R ../../../Sources Extensions/StoreKit + pod lib lint --subspec=PromiseKit/StoreKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &swiftpm + stage: swiftpm + osx_image: xcode9.2 + script: swift build -Xswiftc -target -Xswiftc x86_64-apple-macosx10.12 + - <<: *swiftpm + osx_image: xcode9.4 + - <<: *swiftpm + osx_image: xcode10.1 + - <<: *swiftpm + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKStoreKit + xcode_project: PMKStoreKit.xcodeproj + xcode_destination: 'platform=macOS' + cache.directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'OS=12.2,name=iPhone SE' + - <<: *test + xcode_destination: 'OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..565dbd55 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.pbxproj @@ -0,0 +1,480 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 637B4A6C1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 637B4A691D5D5F9B00E1BC6C /* SKRequest+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 637B4A6D1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 637B4A6A1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.m */; }; + 637B4A6E1D5D5F9B00E1BC6C /* SKProductsRequest+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637B4A6B1D5D5F9B00E1BC6C /* SKProductsRequest+Promise.swift */; }; + 637B4A711D5D5FA400E1BC6C /* TestStoreKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 637B4A6F1D5D5FA400E1BC6C /* TestStoreKit.m */; }; + 637B4A721D5D5FA400E1BC6C /* TestStoreKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637B4A701D5D5FA400E1BC6C /* TestStoreKit.swift */; }; + 637B4A741D5D5FC600E1BC6C /* PMKStoreKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 637B4A731D5D5FC600E1BC6C /* PMKStoreKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63C7FFF71D5C020D003BAE60 /* PMKStoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKStoreKit.framework */; }; + B95EDB3B216E07C300963D64 /* SKPaymentQueue+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = B95EDB3A216E07C300963D64 /* SKPaymentQueue+Promise.swift */; }; + D3F6DBF31EA245750013E242 /* SKPayment+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3F6DBF21EA245750013E242 /* SKPayment+Promise.swift */; }; + D3F6DBF51EA246340013E242 /* SKReceiptRefreshRequest+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3F6DBF41EA246340013E242 /* SKReceiptRefreshRequest+Promise.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKStoreKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 637B4A691D5D5F9B00E1BC6C /* SKRequest+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SKRequest+AnyPromise.h"; path = "Sources/SKRequest+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 637B4A6A1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SKRequest+AnyPromise.m"; path = "Sources/SKRequest+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 637B4A6B1D5D5F9B00E1BC6C /* SKProductsRequest+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SKProductsRequest+Promise.swift"; path = "Sources/SKProductsRequest+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 637B4A6F1D5D5FA400E1BC6C /* TestStoreKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestStoreKit.m; path = Tests/TestStoreKit.m; sourceTree = SOURCE_ROOT; }; + 637B4A701D5D5FA400E1BC6C /* TestStoreKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestStoreKit.swift; path = Tests/TestStoreKit.swift; sourceTree = SOURCE_ROOT; }; + 637B4A731D5D5FC600E1BC6C /* PMKStoreKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKStoreKit.h; path = Sources/PMKStoreKit.h; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKStoreKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKStoreKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKSKTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKSKTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; + B95EDB3A216E07C300963D64 /* SKPaymentQueue+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SKPaymentQueue+Promise.swift"; sourceTree = ""; }; + D3F6DBF21EA245750013E242 /* SKPayment+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SKPayment+Promise.swift"; path = "Sources/SKPayment+Promise.swift"; sourceTree = SOURCE_ROOT; }; + D3F6DBF41EA246340013E242 /* SKReceiptRefreshRequest+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "SKReceiptRefreshRequest+Promise.swift"; path = "Sources/SKReceiptRefreshRequest+Promise.swift"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKStoreKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKStoreKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKSKTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 637B4A731D5D5FC600E1BC6C /* PMKStoreKit.h */, + 637B4A691D5D5F9B00E1BC6C /* SKRequest+AnyPromise.h */, + 637B4A6A1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.m */, + 637B4A6B1D5D5F9B00E1BC6C /* SKProductsRequest+Promise.swift */, + D3F6DBF21EA245750013E242 /* SKPayment+Promise.swift */, + D3F6DBF41EA246340013E242 /* SKReceiptRefreshRequest+Promise.swift */, + B95EDB3A216E07C300963D64 /* SKPaymentQueue+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 637B4A6F1D5D5FA400E1BC6C /* TestStoreKit.m */, + 637B4A701D5D5FA400E1BC6C /* TestStoreKit.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 637B4A741D5D5FC600E1BC6C /* PMKStoreKit.h in Headers */, + 637B4A6C1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKStoreKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKStoreKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKStoreKit; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKStoreKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKSKTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSKTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKSKTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKSKTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKStoreKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKStoreKit */, + 63C7FFF11D5C020D003BAE60 /* PMKSKTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D3F6DBF51EA246340013E242 /* SKReceiptRefreshRequest+Promise.swift in Sources */, + 637B4A6D1D5D5F9B00E1BC6C /* SKRequest+AnyPromise.m in Sources */, + B95EDB3B216E07C300963D64 /* SKPaymentQueue+Promise.swift in Sources */, + 637B4A6E1D5D5F9B00E1BC6C /* SKProductsRequest+Promise.swift in Sources */, + D3F6DBF31EA245750013E242 /* SKPayment+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 637B4A721D5D5FA400E1BC6C /* TestStoreKit.swift in Sources */, + 637B4A711D5D5FA400E1BC6C /* TestStoreKit.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKStoreKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.StoreKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.StoreKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos macosx"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKStoreKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKStoreKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSKTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/xcshareddata/xcschemes/PMKStoreKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/xcshareddata/xcschemes/PMKStoreKit.xcscheme new file mode 100644 index 00000000..20c493a4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/PMKStoreKit.xcodeproj/xcshareddata/xcschemes/PMKStoreKit.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package.swift new file mode 100644 index 00000000..32552bed --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package.swift @@ -0,0 +1,24 @@ +// swift-tools-version:4.0 +import PackageDescription + +let name = "PMKStoreKit" + +let pkg = Package(name: name) +pkg.products = [ + .library(name: name, targets: [name]), +] +pkg.swiftLanguageVersions = [3, 4] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0") +] + +let target: Target = .target(name: name) +target.path = "Sources" +target.exclude = [ + "SKRequest+AnyPromise.h", + "SKRequest+AnyPromise.m", + "\(name).h", +] +target.dependencies = ["PromiseKit"] + +pkg.targets = [target] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package@4.2.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package@4.2.swift new file mode 100644 index 00000000..9054d05c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Package@4.2.swift @@ -0,0 +1,24 @@ +// swift-tools-version:4.2 +import PackageDescription + +let name = "PMKStoreKit" + +let pkg = Package(name: name) +pkg.products = [ + .library(name: name, targets: [name]), +] +pkg.swiftLanguageVersions = [.v3, .v4, .v4_2, .version("5")] +pkg.dependencies = [ + .package(url: "https://github.com/mxcl/PromiseKit.git", from: "6.0.0") +] + +let target: Target = .target(name: name) +target.path = "Sources" +target.exclude = [ + "SKRequest+AnyPromise.h", + "SKRequest+AnyPromise.m", + "\(name).h", +] +target.dependencies = ["PromiseKit"] + +pkg.targets = [target] diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/README.markdown new file mode 100644 index 00000000..95475aa3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit StoreKit Extensions ![Build Status] + +This project adds promises to Apple’s StoreKit framework. + +## CocoaPods + +```ruby +pod "PromiseKit/StoreKit", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/StoreKit" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKStoreKit +``` + +```objc +// objc +@import PromiseKit; +@import PMKStoreKit; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/StoreKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/PMKStoreKit.h b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/PMKStoreKit.h new file mode 100644 index 00000000..fb67b803 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/PMKStoreKit.h @@ -0,0 +1 @@ +#import "SKRequest+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPayment+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPayment+Promise.swift new file mode 100644 index 00000000..63ae4a96 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPayment+Promise.swift @@ -0,0 +1,45 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import StoreKit + +extension SKPayment { + public func promise() -> Promise { + return PaymentObserver(payment: self).promise + } +} + +private class PaymentObserver: NSObject, SKPaymentTransactionObserver { + let (promise, seal) = Promise.pending() + let payment: SKPayment + var retainCycle: PaymentObserver? + + init(payment: SKPayment) { + self.payment = payment + super.init() + SKPaymentQueue.default().add(self) + SKPaymentQueue.default().add(payment) + retainCycle = self + } + + func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { + guard let transaction = transactions.first(where: { $0.payment.productIdentifier == payment.productIdentifier }) else { + return + } + switch transaction.transactionState { + case .purchased, .restored: + queue.finishTransaction(transaction) + seal.fulfill(transaction) + queue.remove(self) + retainCycle = nil + case .failed: + let error = transaction.error ?? PMKError.cancelled + queue.finishTransaction(transaction) + seal.reject(error) + queue.remove(self) + retainCycle = nil + default: + break + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPaymentQueue+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPaymentQueue+Promise.swift new file mode 100644 index 00000000..c60148c5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKPaymentQueue+Promise.swift @@ -0,0 +1,55 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import StoreKit + +public extension SKPaymentQueue { + func restoreCompletedTransactions(_: PMKNamespacer) -> Promise<[SKPaymentTransaction]> { + return PaymentObserver(self).promise + } + + func restoreCompletedTransactions(_: PMKNamespacer, withApplicationUsername username: String?) -> Promise<[SKPaymentTransaction]> { + return PaymentObserver(self, withApplicationUsername: true, userName: username).promise + } +} + +private class PaymentObserver: NSObject, SKPaymentTransactionObserver { + let (promise, seal) = Promise<[SKPaymentTransaction]>.pending() + var retainCycle: PaymentObserver? + var finishedTransactions = [SKPaymentTransaction]() + + //TODO:PMK7: this is weird, just have a `String?` parameter + init(_ paymentQueue: SKPaymentQueue, withApplicationUsername: Bool = false, userName: String? = nil) { + super.init() + paymentQueue.add(self) + withApplicationUsername ? + paymentQueue.restoreCompletedTransactions() : + paymentQueue.restoreCompletedTransactions(withApplicationUsername: userName) + retainCycle = self + } + + func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { + for transaction in transactions where transaction.transactionState == .restored { + finishedTransactions.append(transaction) + queue.finishTransaction(transaction) + } + } + + func paymentQueueRestoreCompletedTransactionsFinished(_ queue: SKPaymentQueue) { + resolve(queue, nil) + } + + func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: Error) { + resolve(queue, error) + } + + func resolve(_ queue: SKPaymentQueue, _ error: Error?) { + if let error = error { + seal.reject(error) + } else { + seal.fulfill(finishedTransactions) + } + queue.remove(self) + retainCycle = nil + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKProductsRequest+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKProductsRequest+Promise.swift new file mode 100644 index 00000000..5497fcd2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKProductsRequest+Promise.swift @@ -0,0 +1,52 @@ +import StoreKit +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `SKRequest` category: + + use_frameworks! + pod "PromiseKit/StoreKit" + + And then in your sources: + + import PromiseKit +*/ +extension SKProductsRequest { + /** + Sends the request to the Apple App Store. + + - Returns: A promise that fulfills if the request succeeds. + */ + public func start(_: PMKNamespacer) -> Promise { + let proxy = SKDelegate() + delegate = proxy + proxy.retainCycle = proxy + start() + return proxy.promise + } +} + + +fileprivate class SKDelegate: NSObject, SKProductsRequestDelegate { + let (promise, seal) = Promise.pending() + var retainCycle: SKDelegate? + + @objc fileprivate func request(_ request: SKRequest, didFailWithError error: Error) { + seal.reject(error) + retainCycle = nil + } + + @objc fileprivate func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { + seal.fulfill(response) + retainCycle = nil + } +} + +// perhaps one day Apple will actually make their errors into Errors… +//extension SKError: CancellableError { +// public var isCancelled: Bool { +// return true +// } +//} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKReceiptRefreshRequest+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKReceiptRefreshRequest+Promise.swift new file mode 100644 index 00000000..3bbc7848 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKReceiptRefreshRequest+Promise.swift @@ -0,0 +1,35 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import StoreKit + +extension SKReceiptRefreshRequest { + public func promise() -> Promise { + return ReceiptRefreshObserver(request: self).promise + } +} + +private class ReceiptRefreshObserver: NSObject, SKRequestDelegate { + let (promise, seal) = Promise.pending() + let request: SKReceiptRefreshRequest + var retainCycle: ReceiptRefreshObserver? + + init(request: SKReceiptRefreshRequest) { + self.request = request + super.init() + request.delegate = self + request.start() + retainCycle = self + } + + + func requestDidFinish(_: SKRequest) { + seal.fulfill(request) + retainCycle = nil + } + + func request(_: SKRequest, didFailWithError error: Error) { + seal.reject(error) + retainCycle = nil + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.h new file mode 100644 index 00000000..a2f473d4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.h @@ -0,0 +1,31 @@ +// +// PromiseKit+StoreKit.h +// Aluxoft SCP +// +// Created by Josejulio Martínez on 16/05/14. + +#import +#import + +/** + To import the `SKRequest` category: + + use_frameworks! + pod "PromiseKit/StoreKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface SKRequest (PromiseKit) + +/** + Sends the request to the Apple App Store. + + @return A promise that fulfills when the request succeeds. If the + receiver is an SKProductsRequest, the promise fulfills with its + `SKProductsResponse`, otherwise the promise is void. +*/ +- (AnyPromise *)promise NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.m new file mode 100644 index 00000000..896807aa --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Sources/SKRequest+AnyPromise.m @@ -0,0 +1,48 @@ +// +// PromiseKit+StoreKit.m +// Aluxoft SCP +// +// Created by Josejulio Martínez on 16/05/14. +// + +#import "SKRequest+AnyPromise.h" +#import + +//TODO do categories work on inherited classes? As would solve our swift SKProductsRequest problem + +@interface PMKSKRequestDelegate : NSObject { +@public + PMKResolver resolve; + id retainCycle; +} +@end + +@implementation PMKSKRequestDelegate + +- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { + resolve(response); + retainCycle = request.delegate = nil; +} + +- (void)requestDidFinish:(SKRequest *)request { + resolve(nil); + retainCycle = request.delegate = nil; +} + +- (void)request:(SKRequest *)request didFailWithError:(NSError *)error { + resolve(error); + retainCycle = request.delegate = nil; +} + +@end + +@implementation SKProductsRequest (PromiseKit) + +- (AnyPromise *)promise { + PMKSKRequestDelegate *d = [PMKSKRequestDelegate new]; + d->retainCycle = self.delegate = d; + [self start]; + return [[AnyPromise alloc] initWithResolver:&d->resolve]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.m b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.m new file mode 100644 index 00000000..9be72966 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.m @@ -0,0 +1,27 @@ +@import PMKStoreKit; +@import PromiseKit; +@import StoreKit; +@import XCTest; + +@implementation PMKSKProductsRequest: SKProductsRequest + +- (void)start { + PMKAfter(0.5).then(^{ + [self.delegate productsRequest:self didReceiveResponse:[SKProductsResponse new]]; + }); +} + +@end + +@implementation SKProductsRequestTests: XCTestCase + +- (void)test { + id ex = [self expectationWithDescription:@""]; + SKProductsRequest *rq = [PMKSKProductsRequest new]; + [rq promise].then(^{ + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.swift b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.swift new file mode 100644 index 00000000..e40ae84f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/StoreKit/Tests/TestStoreKit.swift @@ -0,0 +1,22 @@ +import PMKStoreKit +import PromiseKit +import StoreKit +import XCTest + +class SKProductsRequestTests: XCTestCase { + func test() { + class MockProductsRequest: SKProductsRequest { + override func start() { + after(seconds: 0.1).done { + self.delegate?.productsRequest(self, didReceive: SKProductsResponse()) + } + } + } + + let ex = expectation(description: "") + MockProductsRequest().start(.promise).done { _ in + ex.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.travis.yml new file mode 100644 index 00000000..013749d4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/.travis.yml @@ -0,0 +1,22 @@ +language: objective-c +osx_image: xcode9.3 +env: + - DESTINATION="arch=x86_64" PLATFORM=Mac TEST=1 + - DESTINATION="OS=11.3,name=iPhone SE" PLATFORM=iOS TEST=1 + - DESTINATION="OS=10.3.1,name=iPhone SE" PLATFORM=iOS + - DESTINATION="OS=9.3,name=iPhone 5s" PLATFORM=iOS + - DESTINATION="OS=8.4,name=iPhone 4s" PLATFORM=iOS + - DESTINATION="OS=11.3,name=Apple TV" PLATFORM=tvOS TEST=1 + - DESTINATION="OS=10.2,name=Apple TV 1080p" PLATFORM=tvOS + - DESTINATION="OS=9.2,name=Apple TV 1080p" PLATFORM=tvOS +before_install: + - carthage bootstrap --cache-builds --no-use-binaries --platform $PLATFORM --verbose +install: + - xcodebuild -scheme PMKSystemConfiguration -target PMKSystemConfiguration -destination "$DESTINATION" build + - if [[ $TEST == "1" ]]; then + xcodebuild -scheme PMKSystemConfiguration -target PMKSCTests -destination "$DESTINATION" build; + fi +script: + - if [[ $TEST == "1" ]]; then + xcodebuild -scheme PMKSystemConfiguration -destination "$DESTINATION" test; + fi diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.pbxproj new file mode 100644 index 00000000..f59f77d3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.pbxproj @@ -0,0 +1,457 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6358AB7A1D5D4B6700B9B157 /* PMKSystemConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 6358AB791D5D4B6700B9B157 /* PMKSystemConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6362F84E1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 6362F84C1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6362F84F1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 6362F84D1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m */; }; + 6383E14B1D611E0D00897651 /* SCTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6383E14A1D611E0D00897651 /* SCTests.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKSystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKSystemConfiguration.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKSystemConfiguration; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6358AB791D5D4B6700B9B157 /* PMKSystemConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKSystemConfiguration.h; path = Sources/PMKSystemConfiguration.h; sourceTree = SOURCE_ROOT; }; + 6362F84C1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SCNetworkReachability+AnyPromise.h"; path = "Sources/SCNetworkReachability+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 6362F84D1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SCNetworkReachability+AnyPromise.m"; path = "Sources/SCNetworkReachability+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 6383E14A1D611E0D00897651 /* SCTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SCTests.swift; path = Tests/SCTests.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKSystemConfiguration.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKSystemConfiguration.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKSCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKSCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKSystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKSystemConfiguration.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKSCTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6358AB791D5D4B6700B9B157 /* PMKSystemConfiguration.h */, + 6362F84C1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h */, + 6362F84D1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m */, + ); + path = Sources; + sourceTree = ""; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 6383E14A1D611E0D00897651 /* SCTests.swift */, + ); + path = Tests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 6358AB7A1D5D4B6700B9B157 /* PMKSystemConfiguration.h in Headers */, + 6362F84E1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKSystemConfiguration */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKSystemConfiguration" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKSystemConfiguration; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKSystemConfiguration.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKSCTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSCTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKSCTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKSCTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0920; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 0920; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKSystemConfiguration" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKSystemConfiguration */, + 63C7FFF11D5C020D003BAE60 /* PMKSCTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6362F84F1D5D934C0021D2DD /* SCNetworkReachability+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6383E14B1D611E0D00897651 /* SCTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKSystemConfiguration */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKSystemConfiguration" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKSystemConfiguration" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKSCTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/xcshareddata/xcschemes/PMKSystemConfiguration.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/xcshareddata/xcschemes/PMKSystemConfiguration.xcscheme new file mode 100644 index 00000000..389fad8a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/PMKSystemConfiguration.xcodeproj/xcshareddata/xcschemes/PMKSystemConfiguration.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/README.markdown new file mode 100644 index 00000000..6c1952c0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit SystemConfiguration Extensions ![Build Status] + +This project adds promises to Apple’s SystemConfiguration framework. + +## CocoaPods + +```ruby +pod "PromiseKit/SystemConfiguration" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/SystemConfiguration" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKSystemConfiguration +``` + +```objc +// objc +@import PromiseKit; +@import PMKSystemConfiguration; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/Foundation.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/PMKSystemConfiguration.h b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/PMKSystemConfiguration.h new file mode 100644 index 00000000..a8d32fbd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/PMKSystemConfiguration.h @@ -0,0 +1 @@ +#import "SCNetworkReachability+AnyPromise.h" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.h new file mode 100644 index 00000000..81f86dc4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.h @@ -0,0 +1,18 @@ +#import + +/** + Resolves as soon as the Internet is accessible. If it is already + accessible, resolves immediately. + + To import `SCNetworkReachability`: + + use_frameworks! + pod "PromiseKit/SystemConfiguration" + + And then in your sources: + + @import PromiseKit; + + @return A void promise that fulfills when the Internet becomes accessible. +*/ +AnyPromise *SCNetworkReachability(); diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.m new file mode 100644 index 00000000..5aaf0b18 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+AnyPromise.m @@ -0,0 +1,116 @@ +#import +#import +#import +#import +#import +#import +#import +#import + +@interface JTSReachability: NSObject { +@public + PMKResolver resolve; + id retainCycle; +} +- (BOOL)reachable; +- (void)start; +@end + + +AnyPromise *SCNetworkReachability() { + JTSReachability *reach = [JTSReachability new]; + if (reach.reachable) + return [AnyPromise promiseWithValue:nil]; + reach->retainCycle = reach; + [reach start]; + return [[AnyPromise alloc] initWithResolver:&reach->resolve]; +} + + +static void ReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) { + JTSReachability *reachability = (__bridge JTSReachability *)info; + if (reachability.reachable) { + reachability->resolve(nil); + reachability->retainCycle = nil; + } +} + + +@implementation JTSReachability { + SCNetworkReachabilityRef reachabilityRef; +} + +- (instancetype)init { + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)&zeroAddress); + + return self; +} + +- (void)start { + SCNetworkReachabilityContext context = {0, (__bridge void *)(self), NULL, NULL, NULL}; + SCNetworkReachabilitySetCallback(reachabilityRef, ReachabilityCallback, &context); + SCNetworkReachabilityScheduleWithRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); +} + +- (void)dealloc { + SCNetworkReachabilityUnscheduleFromRunLoop(reachabilityRef, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); + CFRelease(reachabilityRef); +} + +- (BOOL)reachable { + SCNetworkReachabilityFlags flags; + if (!SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) + return NO; + + if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) + return NO; + + BOOL returnValue = NO; + + if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) + { + /* + If the target host is reachable and no connection is required then we'll assume (for now) that you're on Wi-Fi... + */ + returnValue = YES; + } + + if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || + (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) + { + /* + ... and the connection is on-demand (or on-traffic) if the calling application is using the CFSocketStream or higher APIs... + */ + + if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) + { + /* + ... and no [user] intervention is needed... + */ + returnValue = YES; + } + } + +#if TARGET_OS_IPHONE + if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) + { + /* + ... but WWAN connections are OK if the calling application is using the CFNetwork APIs. + */ + if (flags & kSCNetworkReachabilityFlagsConnectionRequired) { + returnValue = NO; + } else { + returnValue = YES; + } + } +#endif + + return returnValue; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+Promise.swift new file mode 100644 index 00000000..b751b667 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Sources/SCNetworkReachability+Promise.swift @@ -0,0 +1,62 @@ +import SystemConfiguration +#if !PMKCocoaPods +import PromiseKit +#endif + +public extension SCNetworkReachability { + + enum PMKError: Error { + case couldNotInitializeReachability + } + + static func promise() -> Promise { + do { + var zeroAddress = sockaddr() + zeroAddress.sa_len = UInt8(MemoryLayout.size) + zeroAddress.sa_family = sa_family_t(AF_INET) + guard let ref = SCNetworkReachabilityCreateWithAddress(nil, &zeroAddress) else { + throw PMKError.couldNotInitializeReachability + } + + var flags = SCNetworkReachabilityFlags() + if SCNetworkReachabilityGetFlags(ref, &flags), flags.contains(.reachable) { + return Promise() + } + + return try Helper(ref: ref).pending.promise + } catch { + return Promise(error: error) + } + } +} + +private func callback(reachability: SCNetworkReachability, flags: SCNetworkReachabilityFlags, info: UnsafeMutableRawPointer?) { + if let info = info, flags.contains(.reachable) { + Unmanaged.fromOpaque(info).takeUnretainedValue().pending.resolver.fulfill(()) + } +} + +private class Helper { + let pending = Promise.pending() + let ref: SCNetworkReachability + + init(ref: SCNetworkReachability) throws { + self.ref = ref + + var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil) + context.info = UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()) + + guard SCNetworkReachabilitySetCallback(ref, callback, &context) else { + throw SCNetworkReachability.PMKError.couldNotInitializeReachability + } + guard SCNetworkReachabilitySetDispatchQueue(ref, .main) else { + SCNetworkReachabilitySetCallback(ref, nil, nil) + throw SCNetworkReachability.PMKError.couldNotInitializeReachability + } + + _ = pending.promise.ensure { + SCNetworkReachabilitySetCallback(self.ref, nil, nil) + SCNetworkReachabilitySetDispatchQueue(self.ref, nil) + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Tests/SCTests.swift b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Tests/SCTests.swift new file mode 100644 index 00000000..94946012 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/SystemConfiguration/Tests/SCTests.swift @@ -0,0 +1,9 @@ +import PMKSystemConfiguration +import XCTest + +class PMKSCTestCase: XCTestCase { + func test() { + // just verify everything links etc. + SCNetworkReachability() + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.gitignore new file mode 100644 index 00000000..30f50040 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.travis.yml new file mode 100644 index 00000000..fbcb5e19 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/.travis.yml @@ -0,0 +1,78 @@ +os: osx +language: swift +osx_image: xcode10.2 + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/UIKit/Sources + cp -R ../../../Sources Extensions/UIKit + pod lib lint --subspec=PromiseKit/UIKit --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - &test + stage: test + xcode_scheme: PMKUIKit + xcode_project: PMKUIKit.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache: + directories: + - Carthage + before_install: + carthage bootstrap --cache-builds --no-use-binaries + - <<: *test + xcode_destination: 'platform=tvOS Simulator,OS=12.2,name=Apple TV' diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Info.plist new file mode 100644 index 00000000..34dfbc3c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..26748334 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.pbxproj @@ -0,0 +1,757 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6304D6FE1D5F986A00CE6C99 /* PMKUIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 6304D6FD1D5F986A00CE6C99 /* PMKUIKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 630B2E161D5D0B3200DC10E9 /* TestUIImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 630B2DF71D5D0AD400DC10E9 /* TestUIImagePickerController.swift */; }; + 632B573520324C4C00FCD5E1 /* UIViewPropertyAnimator+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632B573420324C4C00FCD5E1 /* UIViewPropertyAnimator+Promise.swift */; }; + 6332142B1D83CD17009F67CE /* TestUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6332142A1D83CD17009F67CE /* TestUIView.swift */; }; + 637E2C841D5C2E0B0043E370 /* UIView+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 637E2C771D5C2E0B0043E370 /* UIView+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 637E2C851D5C2E0B0043E370 /* UIView+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C781D5C2E0B0043E370 /* UIView+AnyPromise.m */; }; + 637E2C861D5C2E0B0043E370 /* UIView+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C791D5C2E0B0043E370 /* UIView+Promise.swift */; }; + 637E2C871D5C2E0B0043E370 /* UIViewController+AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 637E2C7A1D5C2E0B0043E370 /* UIViewController+AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 637E2C881D5C2E0B0043E370 /* UIViewController+AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C7B1D5C2E0B0043E370 /* UIViewController+AnyPromise.m */; }; + 637E2C951D5C2E720043E370 /* TestUIImagePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */; }; + 637E2C961D5C2E720043E370 /* TestUIViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C8F1D5C2E720043E370 /* TestUIViewController.m */; }; + 637E2C9B1D5C2F600043E370 /* infrastructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 637E2C9A1D5C2F600043E370 /* infrastructure.swift */; }; + 63A686811D88E93300D1C66B /* UIImagePickerController+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A6867E1D88E93300D1C66B /* UIImagePickerController+Promise.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKUIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */; }; + 63C9C4571D5D339900101ECE /* app.swift in Sources */ = {isa = PBXBuildFile; fileRef = 630B2DF41D5D0AD400DC10E9 /* app.swift */; }; + 63C9C4581D5D339B00101ECE /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 630B2DF51D5D0AD400DC10E9 /* Default-568h@2x.png */; }; + 63C9C45E1D5D341600101ECE /* PMKUIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */; }; + 63C9C45F1D5D341600101ECE /* PMKUIKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKUIKit; + }; + 63C9C4591D5D33A900101ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C9C4441D5D334700101ECE; + remoteInfo = PMKTestsHost; + }; + 63C9C45B1D5D33AB00101ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C9C4441D5D334700101ECE; + remoteInfo = PMKTestsHost; + }; + 63C9C4601D5D341600101ECE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKUIKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 63C9C4621D5D341600101ECE /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 63C9C45F1D5D341600101ECE /* PMKUIKit.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 6304D6FD1D5F986A00CE6C99 /* PMKUIKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PMKUIKit.h; path = Sources/PMKUIKit.h; sourceTree = SOURCE_ROOT; }; + 630B2DF41D5D0AD400DC10E9 /* app.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = app.swift; path = UITests/app.swift; sourceTree = ""; }; + 630B2DF51D5D0AD400DC10E9 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "UITests/Default-568h@2x.png"; sourceTree = ""; }; + 630B2DF71D5D0AD400DC10E9 /* TestUIImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestUIImagePickerController.swift; path = UITests/TestUIImagePickerController.swift; sourceTree = ""; }; + 630B2E131D5D0AF500DC10E9 /* PMKUIUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKUIUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 632B573420324C4C00FCD5E1 /* UIViewPropertyAnimator+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewPropertyAnimator+Promise.swift"; sourceTree = ""; }; + 6332142A1D83CD17009F67CE /* TestUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestUIView.swift; path = Tests/TestUIView.swift; sourceTree = SOURCE_ROOT; }; + 637E2C771D5C2E0B0043E370 /* UIView+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIView+AnyPromise.h"; path = "Sources/UIView+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 637E2C781D5C2E0B0043E370 /* UIView+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIView+AnyPromise.m"; path = "Sources/UIView+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 637E2C791D5C2E0B0043E370 /* UIView+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIView+Promise.swift"; path = "Sources/UIView+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 637E2C7A1D5C2E0B0043E370 /* UIViewController+AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+AnyPromise.h"; path = "Sources/UIViewController+AnyPromise.h"; sourceTree = SOURCE_ROOT; }; + 637E2C7B1D5C2E0B0043E370 /* UIViewController+AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+AnyPromise.m"; path = "Sources/UIViewController+AnyPromise.m"; sourceTree = SOURCE_ROOT; }; + 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestUIImagePickerController.swift; path = Tests/TestUIImagePickerController.swift; sourceTree = SOURCE_ROOT; }; + 637E2C8F1D5C2E720043E370 /* TestUIViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TestUIViewController.m; path = Tests/TestUIViewController.m; sourceTree = SOURCE_ROOT; }; + 637E2C9A1D5C2F600043E370 /* infrastructure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = infrastructure.swift; path = Tests/infrastructure.swift; sourceTree = SOURCE_ROOT; }; + 63A6867E1D88E93300D1C66B /* UIImagePickerController+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIImagePickerController+Promise.swift"; path = "Sources/UIImagePickerController+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKUIKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C9C4451D5D334700101ECE /* PMKTestsHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PMKTestsHost.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 630B2E0D1D5D0AF500DC10E9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKUIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C9C4421D5D334700101ECE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C9C45E1D5D341600101ECE /* PMKUIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 630B2DF31D5D0ABF00DC10E9 /* TestsHost */ = { + isa = PBXGroup; + children = ( + 630B2DF41D5D0AD400DC10E9 /* app.swift */, + 630B2DF51D5D0AD400DC10E9 /* Default-568h@2x.png */, + 630B2DF71D5D0AD400DC10E9 /* TestUIImagePickerController.swift */, + ); + name = TestsHost; + sourceTree = ""; + }; + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 630B2DF31D5D0ABF00DC10E9 /* TestsHost */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKUITests.xctest */, + 630B2E131D5D0AF500DC10E9 /* PMKUIUITests.xctest */, + 63C9C4451D5D334700101ECE /* PMKTestsHost.app */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6304D6FD1D5F986A00CE6C99 /* PMKUIKit.h */, + 637E2C771D5C2E0B0043E370 /* UIView+AnyPromise.h */, + 637E2C781D5C2E0B0043E370 /* UIView+AnyPromise.m */, + 637E2C791D5C2E0B0043E370 /* UIView+Promise.swift */, + 637E2C7A1D5C2E0B0043E370 /* UIViewController+AnyPromise.h */, + 637E2C7B1D5C2E0B0043E370 /* UIViewController+AnyPromise.m */, + 63A6867E1D88E93300D1C66B /* UIImagePickerController+Promise.swift */, + 632B573420324C4C00FCD5E1 /* UIViewPropertyAnimator+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 637E2C8E1D5C2E720043E370 /* TestUIImagePickerController.swift */, + 637E2C8F1D5C2E720043E370 /* TestUIViewController.m */, + 6332142A1D83CD17009F67CE /* TestUIView.swift */, + 637E2C9A1D5C2F600043E370 /* infrastructure.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 6304D6FE1D5F986A00CE6C99 /* PMKUIKit.h in Headers */, + 637E2C871D5C2E0B0043E370 /* UIViewController+AnyPromise.h in Headers */, + 637E2C841D5C2E0B0043E370 /* UIView+AnyPromise.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 630B2DFF1D5D0AF500DC10E9 /* PMKUIUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 630B2E101D5D0AF500DC10E9 /* Build configuration list for PBXNativeTarget "PMKUIUITests" */; + buildPhases = ( + 630B2E041D5D0AF500DC10E9 /* Sources */, + 630B2E0D1D5D0AF500DC10E9 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C9C45A1D5D33A900101ECE /* PBXTargetDependency */, + ); + name = PMKUIUITests; + productName = PMKUIUITests; + productReference = 630B2E131D5D0AF500DC10E9 /* PMKUIUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + 63C7FFA61D5BEE09003BAE60 /* PMKUIKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKUIKit" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKUIKit; + productName = PMKUIKit; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKUIKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKUITests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 6332EC8D1D5D085F00480270 /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + 63C9C45C1D5D33AB00101ECE /* PBXTargetDependency */, + ); + name = PMKUITests; + productName = PMKUITests; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKUITests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 63C9C4441D5D334700101ECE /* PMKTestsHost */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C9C4541D5D334800101ECE /* Build configuration list for PBXNativeTarget "PMKTestsHost" */; + buildPhases = ( + 63C9C4411D5D334700101ECE /* Sources */, + 63C9C4421D5D334700101ECE /* Frameworks */, + 63C9C4431D5D334700101ECE /* Resources */, + 63C9C45D1D5D33E700101ECE /* Embed Carthage Frameworks */, + 63C9C4621D5D341600101ECE /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C9C4611D5D341600101ECE /* PBXTargetDependency */, + ); + name = PMKTestsHost; + productName = PMKTestsHost; + productReference = 63C9C4451D5D334700101ECE /* PMKTestsHost.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 630B2DFF1D5D0AF500DC10E9 = { + LastSwiftMigration = 1020; + TestTargetID = 63C9C4441D5D334700101ECE; + }; + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + TestTargetID = 63C9C4441D5D334700101ECE; + }; + 63C9C4441D5D334700101ECE = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKUIKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKUIKit */, + 63C7FFF11D5C020D003BAE60 /* PMKUITests */, + 630B2DFF1D5D0AF500DC10E9 /* PMKUIUITests */, + 63C9C4441D5D334700101ECE /* PMKTestsHost */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 63C9C4431D5D334700101ECE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C9C4581D5D339B00101ECE /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6332EC8D1D5D085F00480270 /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; + 63C9C45D1D5D33E700101ECE /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 630B2E041D5D0AF500DC10E9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 630B2E161D5D0B3200DC10E9 /* TestUIImagePickerController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63A686811D88E93300D1C66B /* UIImagePickerController+Promise.swift in Sources */, + 637E2C861D5C2E0B0043E370 /* UIView+Promise.swift in Sources */, + 637E2C851D5C2E0B0043E370 /* UIView+AnyPromise.m in Sources */, + 632B573520324C4C00FCD5E1 /* UIViewPropertyAnimator+Promise.swift in Sources */, + 637E2C881D5C2E0B0043E370 /* UIViewController+AnyPromise.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 637E2C951D5C2E720043E370 /* TestUIImagePickerController.swift in Sources */, + 637E2C961D5C2E720043E370 /* TestUIViewController.m in Sources */, + 637E2C9B1D5C2F600043E370 /* infrastructure.swift in Sources */, + 6332142B1D83CD17009F67CE /* TestUIView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C9C4411D5D334700101ECE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C9C4571D5D339900101ECE /* app.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKUIKit */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; + 63C9C45A1D5D33A900101ECE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C9C4441D5D334700101ECE /* PMKTestsHost */; + targetProxy = 63C9C4591D5D33A900101ECE /* PBXContainerItemProxy */; + }; + 63C9C45C1D5D33AB00101ECE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C9C4441D5D334700101ECE /* PMKTestsHost */; + targetProxy = 63C9C45B1D5D33AB00101ECE /* PBXContainerItemProxy */; + }; + 63C9C4611D5D341600101ECE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKUIKit */; + targetProxy = 63C9C4601D5D341600101ECE /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 630B2E111D5D0AF500DC10E9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.ui.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_TARGET_NAME = PMKTestsHost; + }; + name = Debug; + }; + 630B2E121D5D0AF500DC10E9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.ui.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_TARGET_NAME = PMKTestsHost; + }; + name = Release; + }; + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_PACKAGE_TYPE = FMWK; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.3; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.UIKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + BUNDLE_PACKAGE_TYPE = FMWK; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.0.3; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.UIKit; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos appletvsimulator appletvos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PMKTestsHost.app/PMKTestsHost"; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_PACKAGE_TYPE = BNDL; + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PMKTestsHost.app/PMKTestsHost"; + }; + name = Release; + }; + 63C9C4551D5D334800101ECE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_PACKAGE_TYPE = APPL; + CODE_SIGN_ENTITLEMENTS = UITests/Entitlements.plist; + COPY_PHASE_STRIP = NO; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.host.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 63C9C4561D5D334800101ECE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_PACKAGE_TYPE = APPL; + CODE_SIGN_ENTITLEMENTS = UITests/Entitlements.plist; + COPY_PHASE_STRIP = NO; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.tests.host.UIKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 630B2E101D5D0AF500DC10E9 /* Build configuration list for PBXNativeTarget "PMKUIUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 630B2E111D5D0AF500DC10E9 /* Debug */, + 630B2E121D5D0AF500DC10E9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKUIKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKUIKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C9C4541D5D334800101ECE /* Build configuration list for PBXNativeTarget "PMKTestsHost" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C9C4551D5D334800101ECE /* Debug */, + 63C9C4561D5D334800101ECE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..07a62057 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/xcshareddata/xcschemes/PMKUIKit.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/xcshareddata/xcschemes/PMKUIKit.xcscheme new file mode 100644 index 00000000..6ac62130 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/PMKUIKit.xcodeproj/xcshareddata/xcschemes/PMKUIKit.xcscheme @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/README.markdown new file mode 100644 index 00000000..dafd4e65 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/README.markdown @@ -0,0 +1,48 @@ +# PromiseKit UIKit Extensions ![Build Status] + +This project adds promises to Apple’s UIKit framework. + +This project supports Swift 3.0, 3.1, 3.2 and 4.0; iOS 9, 10 and 11; tvOS 10 and +11; CocoaPods and Carthage; Xcode 8.0, 8.1, 8.2, 8.3 and 9.0. + +## CocoaPods + +```ruby +pod "PromiseKit/UIKit", "~> 6.0" +``` + +The extensions are built into `PromiseKit.framework` thus `import PromiseKit` is +all that is needed. + +## Carthage + +```ruby +github "PromiseKit/UIKit" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKUIKit +``` + +```objc +// objc +@import PromiseKit; +@import PMKUIKit; +``` + +# `UIImagePickerController` + +Due to iOS 10 requiring an entry in your app’s `Info.plist` for any usage of `UIImagePickerController` (even if you don’t actually call it directly), we have removed UIImagePickerController from the default `UIKit` pod. To use it you must add an additional subspec: + +```ruby +pod "PromiseKit/UIImagePickerController" +``` + +Sorry, but there’s not an easier way. + + +[Build Status]: https://travis-ci.org/PromiseKit/UIKit.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/PMKUIKit.h b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/PMKUIKit.h new file mode 100644 index 00000000..75cbf90f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/PMKUIKit.h @@ -0,0 +1,8 @@ +#import "UIView+AnyPromise.h" +#import "UIViewController+AnyPromise.h" + +typedef NS_OPTIONS(NSInteger, PMKAnimationOptions) { + PMKAnimationOptionsNone = 1 << 0, + PMKAnimationOptionsAppear = 1 << 1, + PMKAnimationOptionsDisappear = 1 << 2, +}; diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIImagePickerController+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIImagePickerController+Promise.swift new file mode 100644 index 00000000..d112c64b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIImagePickerController+Promise.swift @@ -0,0 +1,80 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import UIKit + +#if !os(tvOS) + +extension UIViewController { +#if swift(>=4.2) + /// Presents the UIImagePickerController, resolving with the user action. + public func promise(_ vc: UIImagePickerController, animate: PMKAnimationOptions = [.appear, .disappear], completion: (() -> Void)? = nil) -> Promise<[UIImagePickerController.InfoKey: Any]> { + let animated = animate.contains(.appear) + let proxy = UIImagePickerControllerProxy() + vc.delegate = proxy + present(vc, animated: animated, completion: completion) + return proxy.promise.ensure { + vc.presentingViewController?.dismiss(animated: animated, completion: nil) + } + } +#else + /// Presents the UIImagePickerController, resolving with the user action. + public func promise(_ vc: UIImagePickerController, animate: PMKAnimationOptions = [.appear, .disappear], completion: (() -> Void)? = nil) -> Promise<[String: Any]> { + let animated = animate.contains(.appear) + let proxy = UIImagePickerControllerProxy() + vc.delegate = proxy + present(vc, animated: animated, completion: completion) + return proxy.promise.ensure { + vc.presentingViewController?.dismiss(animated: animated, completion: nil) + } + } +#endif +} + +@objc private class UIImagePickerControllerProxy: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { +#if swift(>=4.2) + let (promise, seal) = Promise<[UIImagePickerController.InfoKey: Any]>.pending() +#else + let (promise, seal) = Promise<[String: Any]>.pending() +#endif + var retainCycle: AnyObject? + + required override init() { + super.init() + retainCycle = self + } + +#if swift(>=4.2) + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { + seal.fulfill(info) + retainCycle = nil + } +#else + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) { + seal.fulfill(info) + retainCycle = nil + } +#endif + + func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { + seal.reject(UIImagePickerController.PMKError.cancelled) + retainCycle = nil + } +} + +extension UIImagePickerController { + /// Errors representing PromiseKit UIImagePickerController failures + public enum PMKError: CancellableError { + /// The user cancelled the UIImagePickerController. + case cancelled + /// - Returns: true + public var isCancelled: Bool { + switch self { + case .cancelled: + return true + } + } + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.h new file mode 100644 index 00000000..0a19cd6f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.h @@ -0,0 +1,80 @@ +#import +#import + +// Created by Masafumi Yoshida on 2014/07/11. +// Copyright (c) 2014年 DeNA. All rights reserved. + +/** + To import the `UIView` category: + + use_frameworks! + pod "PromiseKit/UIKit" + + Or `UIKit` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface UIView (PromiseKit) + +/** + Animate changes to one or more views using the specified duration. + + @param duration The total duration of the animations, measured in + seconds. If you specify a negative value or 0, the changes are made + without animating them. + + @param animations A block object containing the changes to commit to the + views. + + @return A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. +*/ ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations NS_REFINED_FOR_SWIFT; + +/** + Animate changes to one or more views using the specified duration, delay, + options, and completion handler. + + @param duration The total duration of the animations, measured in + seconds. If you specify a negative value or 0, the changes are made + without animating them. + + @param delay The amount of time (measured in seconds) to wait before + beginning the animations. Specify a value of 0 to begin the animations + immediately. + + @param options A mask of options indicating how you want to perform the + animations. For a list of valid constants, see UIViewAnimationOptions. + + @param animations A block object containing the changes to commit to the + views. + + @return A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. +*/ ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations NS_REFINED_FOR_SWIFT; + +/** + Performs a view animation using a timing curve corresponding to the + motion of a physical spring. + + @return A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. +*/ ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations NS_REFINED_FOR_SWIFT; + +/** + Creates an animation block object that can be used to set up + keyframe-based animations for the current view. + + @return A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. +*/ ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options keyframeAnimations:(void (^)(void))animations NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.m new file mode 100644 index 00000000..04ee9403 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+AnyPromise.m @@ -0,0 +1,64 @@ +// +// UIView+PromiseKit_UIAnimation.m +// YahooDenaStudy +// +// Created by Masafumi Yoshida on 2014/07/11. +// Copyright (c) 2014年 DeNA. All rights reserved. +// + +#import +#import "UIView+AnyPromise.h" + + +#define CopyPasta \ + NSAssert([NSThread isMainThread], @"UIKit animation must be performed on the main thread"); \ + \ + if (![NSThread isMainThread]) { \ + id error = [NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:@{NSLocalizedDescriptionKey: @"Animation was attempted on a background thread"}]; \ + return [AnyPromise promiseWithValue:error]; \ + } \ + \ + PMKResolver resolve = nil; \ + AnyPromise *promise = [[AnyPromise alloc] initWithResolver:&resolve]; + + +@implementation UIView (PromiseKit) + ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations { + return [self promiseWithDuration:duration delay:0 options:0 animations:animations]; +} + ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void(^)(void))animations +{ + CopyPasta; + + [UIView animateWithDuration:duration delay:delay options:options animations:animations completion:^(BOOL finished) { + resolve(@(finished)); + }]; + + return promise; +} + ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void(^)(void))animations +{ + CopyPasta; + + [UIView animateWithDuration:duration delay:delay usingSpringWithDamping:dampingRatio initialSpringVelocity:velocity options:options animations:animations completion:^(BOOL finished) { + resolve(@(finished)); + }]; + + return promise; +} + ++ (AnyPromise *)promiseWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options keyframeAnimations:(void(^)(void))animations +{ + CopyPasta; + + [UIView animateKeyframesWithDuration:duration delay:delay options:options animations:animations completion:^(BOOL finished) { + resolve(@(finished)); + }]; + + return promise; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+Promise.swift new file mode 100644 index 00000000..1bbb8c64 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIView+Promise.swift @@ -0,0 +1,115 @@ +import UIKit.UIView +#if !PMKCocoaPods +import PromiseKit +#endif + +/** + To import the `UIView` category: + + use_frameworks! + pod "PromiseKit/UIKit" + + Or `UIKit` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + import PromiseKit +*/ +public extension UIView { +#if swift(>=4.2) +/** + Animate changes to one or more views using the specified duration, delay, + options, and completion handler. + + - Parameter duration: The total duration of the animations, measured in + seconds. If you specify a negative value or 0, the changes are made + without animating them. + + - Parameter delay: The amount of time (measured in seconds) to wait before + beginning the animations. Specify a value of 0 to begin the animations + immediately. + + - Parameter options: A mask of options indicating how you want to perform the + animations. For a list of valid constants, see UIViewAnimationOptions. + + - Parameter animations: A block object containing the changes to commit to the + views. + + - Returns: A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. + */ + @discardableResult + static func animate(_: PMKNamespacer, duration: TimeInterval, delay: TimeInterval = 0, options: UIView.AnimationOptions = [], animations: @escaping () -> Void) -> Guarantee { + return Guarantee { animate(withDuration: duration, delay: delay, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func animate(_: PMKNamespacer, duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping damping: CGFloat, initialSpringVelocity: CGFloat, options: UIView.AnimationOptions = [], animations: @escaping () -> Void) -> Guarantee { + return Guarantee { animate(withDuration: duration, delay: delay, usingSpringWithDamping: damping, initialSpringVelocity: initialSpringVelocity, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func transition(_: PMKNamespacer, with view: UIView, duration: TimeInterval, options: UIView.AnimationOptions = [], animations: (() -> Void)?) -> Guarantee { + return Guarantee { transition(with: view, duration: duration, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func transition(_: PMKNamespacer, from: UIView, to: UIView, duration: TimeInterval, options: UIView.AnimationOptions = []) -> Guarantee { + return Guarantee { transition(from: from, to: to, duration: duration, options: options, completion: $0) } + } + + @discardableResult + static func perform(_: PMKNamespacer, animation: UIView.SystemAnimation, on views: [UIView], options: UIView.AnimationOptions = [], animations: (() -> Void)?) -> Guarantee { + return Guarantee { perform(animation, on: views, options: options, animations: animations, completion: $0) } + } +#else + /** + Animate changes to one or more views using the specified duration, delay, + options, and completion handler. + + - Parameter duration: The total duration of the animations, measured in + seconds. If you specify a negative value or 0, the changes are made + without animating them. + + - Parameter delay: The amount of time (measured in seconds) to wait before + beginning the animations. Specify a value of 0 to begin the animations + immediately. + + - Parameter options: A mask of options indicating how you want to perform the + animations. For a list of valid constants, see UIViewAnimationOptions. + + - Parameter animations: A block object containing the changes to commit to the + views. + + - Returns: A promise that fulfills with a boolean NSNumber indicating + whether or not the animations actually finished. + */ + @discardableResult + static func animate(_: PMKNamespacer, duration: TimeInterval, delay: TimeInterval = 0, options: UIViewAnimationOptions = [], animations: @escaping () -> Void) -> Guarantee { + return Guarantee { animate(withDuration: duration, delay: delay, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func animate(_: PMKNamespacer, duration: TimeInterval, delay: TimeInterval, usingSpringWithDamping damping: CGFloat, initialSpringVelocity: CGFloat, options: UIViewAnimationOptions = [], animations: @escaping () -> Void) -> Guarantee { + return Guarantee { animate(withDuration: duration, delay: delay, usingSpringWithDamping: damping, initialSpringVelocity: initialSpringVelocity, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func transition(_: PMKNamespacer, with view: UIView, duration: TimeInterval, options: UIViewAnimationOptions = [], animations: (() -> Void)?) -> Guarantee { + return Guarantee { transition(with: view, duration: duration, options: options, animations: animations, completion: $0) } + } + + @discardableResult + static func transition(_: PMKNamespacer, from: UIView, to: UIView, duration: TimeInterval, options: UIViewAnimationOptions = []) -> Guarantee { + return Guarantee { transition(from: from, to: to, duration: duration, options: options, completion: $0) } + } + + @discardableResult + static func perform(_: PMKNamespacer, animation: UISystemAnimation, on views: [UIView], options: UIViewAnimationOptions = [], animations: (() -> Void)?) -> Guarantee { + return Guarantee { perform(animation, on: views, options: options, animations: animations, completion: $0) } + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.h b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.h new file mode 100644 index 00000000..0e60ca9e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.h @@ -0,0 +1,71 @@ +#import +#import + +/** + To import the `UIViewController` category: + + use_frameworks! + pod "PromiseKit/UIKit" + + Or `UIKit` is one of the categories imported by the umbrella pod: + + use_frameworks! + pod "PromiseKit" + + And then in your sources: + + @import PromiseKit; +*/ +@interface UIViewController (PromiseKit) + +/** + Presents a view controller modally. + + If the view controller is one of the following: + + - MFMailComposeViewController + - MFMessageComposeViewController + - UIImagePickerController + - SLComposeViewController + + Then PromiseKit presents the view controller returning a promise that is + resolved as per the documentation for those classes. Eg. if you present a + `UIImagePickerController` the view controller will be presented for you + and the returned promise will resolve with the media the user selected. + + [self promiseViewController:[MFMailComposeViewController new] animated:YES completion:nil].then(^{ + //… + }); + + Otherwise PromiseKit expects your view controller to implement a + `promise` property. This promise will be returned from this method and + presentation and dismissal of the presented view controller will be + managed for you. + + \@interface MyViewController: UIViewController + @property (readonly) AnyPromise *promise; + @end + + @implementation MyViewController { + PMKResolver resolve; + } + + - (void)viewDidLoad { + _promise = [[AnyPromise alloc] initWithResolver:&resolve]; + } + + - (void)later { + resolve(@"some fulfilled value"); + } + + @end + + [self promiseViewController:[MyViewController new] aniamted:YES completion:nil].then(^(id value){ + // value == @"some fulfilled value" + }); + + @return A promise that can be resolved by the presented view controller. +*/ +- (AnyPromise *)promiseViewController:(UIViewController *)vc animated:(BOOL)animated completion:(void (^)(void))block NS_REFINED_FOR_SWIFT; + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.m b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.m new file mode 100644 index 00000000..5231e55b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewController+AnyPromise.m @@ -0,0 +1,140 @@ +#import +#import "UIViewController+AnyPromise.h" +#import + +#if PMKImagePickerController +#import +#endif + +@interface PMKGenericDelegate : NSObject { +@public + PMKResolver resolve; +} ++ (instancetype)delegateWithPromise:(AnyPromise **)promise; +@end + +@interface UIViewController () +- (AnyPromise*) promise; +@end + +@implementation UIViewController (PromiseKit) + +- (AnyPromise *)promiseViewController:(UIViewController *)vc animated:(BOOL)animated completion:(void (^)(void))block { + __kindof UIViewController *vc2present = vc; + AnyPromise *promise = nil; + + if ([vc isKindOfClass:NSClassFromString(@"MFMailComposeViewController")]) { + PMKGenericDelegate *delegate = [PMKGenericDelegate delegateWithPromise:&promise]; + [vc setValue:delegate forKey:@"mailComposeDelegate"]; + } + else if ([vc isKindOfClass:NSClassFromString(@"MFMessageComposeViewController")]) { + PMKGenericDelegate *delegate = [PMKGenericDelegate delegateWithPromise:&promise]; + [vc setValue:delegate forKey:@"messageComposeDelegate"]; + } +#ifdef PMKImagePickerController + else if ([vc isKindOfClass:[UIImagePickerController class]]) { + PMKGenericDelegate *delegate = [PMKGenericDelegate delegateWithPromise:&promise]; + [vc setValue:delegate forKey:@"delegate"]; + } +#endif + else if ([vc isKindOfClass:NSClassFromString(@"SLComposeViewController")]) { + PMKResolver resolve; + promise = [[AnyPromise alloc] initWithResolver:&resolve]; + [vc setValue:^(NSInteger result){ + if (result == 0) { + resolve([NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]); + } else { + resolve(@(result)); + } + } forKey:@"completionHandler"]; + } + else if ([vc isKindOfClass:[UINavigationController class]]) + vc = [(id)vc viewControllers].firstObject; + + if (!vc) { + id userInfo = @{NSLocalizedDescriptionKey: @"nil or effective nil passed to promiseViewController"}; + id err = [NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:userInfo]; + return [AnyPromise promiseWithValue:err]; + } + + if (!promise) { + if (![vc respondsToSelector:@selector(promise)]) { + id userInfo = @{NSLocalizedDescriptionKey: @"ViewController is not promisable"}; + id err = [NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:userInfo]; + return [AnyPromise promiseWithValue:err]; + } + + promise = [vc valueForKey:@"promise"]; + + if (![promise isKindOfClass:[AnyPromise class]]) { + id userInfo = @{NSLocalizedDescriptionKey: @"The promise property is nil or not of type AnyPromise"}; + id err = [NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:userInfo]; + return [AnyPromise promiseWithValue:err]; + } + } + + if (!promise.pending) + return promise; + + [self presentViewController:vc2present animated:animated completion:block]; + + promise.ensure(^{ + [vc2present.presentingViewController dismissViewControllerAnimated:animated completion:nil]; + }); + + return promise; +} + +@end + + + +@implementation PMKGenericDelegate { + id retainCycle; +} + ++ (instancetype)delegateWithPromise:(AnyPromise **)promise; { + PMKGenericDelegate *d = [PMKGenericDelegate new]; + d->retainCycle = d; + *promise = [[AnyPromise alloc] initWithResolver:&d->resolve]; + return d; +} + +- (void)mailComposeController:(id)controller didFinishWithResult:(int)result error:(NSError *)error { + if (error != nil) { + resolve(error); + } else if (result == 0) { + resolve([NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]); + } else { + resolve(@(result)); + } + retainCycle = nil; +} + +- (void)messageComposeViewController:(id)controller didFinishWithResult:(int)result { + if (result == 2) { + id userInfo = @{NSLocalizedDescriptionKey: @"The attempt to save or send the message was unsuccessful."}; + id error = [NSError errorWithDomain:PMKErrorDomain code:PMKOperationFailed userInfo:userInfo]; + resolve(error); + } else { + resolve(@(result)); + } + retainCycle = nil; +} + +#ifdef PMKImagePickerController + +- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { + id img = info[UIImagePickerControllerEditedImage] ?: info[UIImagePickerControllerOriginalImage]; + resolve(PMKManifold(img, info)); + retainCycle = nil; +} + +- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { + resolve([NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]); + retainCycle = nil; +} + +#endif + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewPropertyAnimator+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewPropertyAnimator+Promise.swift new file mode 100644 index 00000000..34ee1408 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Sources/UIViewPropertyAnimator+Promise.swift @@ -0,0 +1,14 @@ +#if !PMKCocoaPods +import PromiseKit +#endif +import UIKit + +@available(iOS 10, tvOS 10, *) +public extension UIViewPropertyAnimator { + func startAnimation(_: PMKNamespacer) -> Guarantee { + return Guarantee { + addCompletion($0) + startAnimation() + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIImagePickerController.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIImagePickerController.swift new file mode 100644 index 00000000..abefe68c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIImagePickerController.swift @@ -0,0 +1,34 @@ +import PromiseKit +import PMKUIKit +import XCTest +import UIKit + +#if os(iOS) + +class Test_UIImagePickerController_Swift: XCTestCase { + func test() { + class Mock: UIViewController { + var info = [String:AnyObject]() + + override func present(_ vc: UIViewController, animated flag: Bool, completion: (() -> Void)?) { + let ipc = vc as! UIImagePickerController + after(seconds: 0.05).done { + ipc.delegate?.imagePickerController?(ipc, didFinishPickingMediaWithInfo: self.info) + } + } + } + + let (originalImage, editedImage) = (UIImage(), UIImage()) + + let mockvc = Mock() + mockvc.info = [UIImagePickerControllerOriginalImage: originalImage, UIImagePickerControllerEditedImage: editedImage] + + let ex = expectation(description: "") + mockvc.promise(UIImagePickerController(), animate: []).done { _ in + ex.fulfill() + } + waitForExpectations(timeout: 10, handler: nil) + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIView.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIView.swift new file mode 100644 index 00000000..dd3b4fd5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIView.swift @@ -0,0 +1,19 @@ +import PromiseKit +import PMKUIKit +import XCTest +import UIKit + +class UIViewTests: XCTestCase { + func test() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + + UIView.animate(.promise, duration: 0.1) { + ex1.fulfill() + }.done { _ in + ex2.fulfill() + } + + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIViewController.m b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIViewController.m new file mode 100644 index 00000000..74266012 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/TestUIViewController.m @@ -0,0 +1,135 @@ +@import PromiseKit; +@import PMKUIKit; +@import XCTest; +@import UIKit; + + +@interface MyViewController: UIViewController +@property AnyPromise *promise; +@end +@implementation MyViewController +@end + + +@implementation UIViewControllerTests: XCTestCase { + UIViewController *rootvc; +} + +- (void)setUp { + rootvc = [UIApplication sharedApplication].keyWindow.rootViewController = [UIViewController new]; +} + +- (void)tearDown { + [UIApplication sharedApplication].keyWindow.rootViewController = nil; +} + +// view controller is presented and dismissed when promise is resolved +- (void)test1 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + PMKResolver resolve; + + MyViewController *myvc = [MyViewController new]; + myvc.promise = [[AnyPromise alloc] initWithResolver:&resolve]; + [rootvc promiseViewController:myvc animated:NO completion:nil].then(^{ + // seems to take another tick for the dismissal to complete + }).then(^{ + [ex fulfill]; + }); + + XCTAssertNotNil(rootvc.presentedViewController); + + PMKAfter(1).then(^{ + resolve(@1); + }); + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +// view controller is not presented if promise is resolved +- (void)test2 { + MyViewController *myvc = [MyViewController new]; + myvc.promise = [AnyPromise promiseWithValue:nil]; + [rootvc promiseViewController:myvc animated:NO completion:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +// promise property must be promise +- (void)test3 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + MyViewController *myvc = [MyViewController new]; + myvc.promise = (id) @1; + [rootvc promiseViewController:myvc animated:NO completion:nil].catch(^(id err){ + [ex fulfill]; + }); + + XCTAssertNil(rootvc.presentedViewController); + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +// promise property must not be nil +- (void)test4 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + MyViewController *myvc = [MyViewController new]; + [rootvc promiseViewController:myvc animated:NO completion:nil].catch(^(id err){ + [ex fulfill]; + }); + + XCTAssertNil(rootvc.presentedViewController); + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +// view controller must have a promise property +- (void)test5 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + UIViewController *vc = [UIViewController new]; + [rootvc promiseViewController:vc animated:NO completion:nil].catch(^(id err){ + [ex fulfill]; + }); + + XCTAssertNil(rootvc.presentedViewController); + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +// promised nav controllers use their root vc’s promise property +- (void)test6 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + PMKResolver resolve; + + MyViewController *myvc = [MyViewController new]; + UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:myvc]; + myvc.promise = [[AnyPromise alloc] initWithResolver:&resolve]; + [rootvc promiseViewController:nc animated:NO completion:nil].then(^(id obj){ + XCTAssertEqualObjects(@1, obj); + }).then(^{ + [ex fulfill]; + }); + + XCTAssertNotNil(rootvc.presentedViewController); + + PMKAfter(1).then(^{ + resolve(@1); + }); + + [self waitForExpectationsWithTimeout:10 handler:nil]; + + XCTAssertNil(rootvc.presentedViewController); +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/infrastructure.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/infrastructure.swift new file mode 100644 index 00000000..6d384271 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/Tests/infrastructure.swift @@ -0,0 +1,16 @@ +import XCTest +import UIKit + +extension XCTestCase { + var rootvc: UIViewController { + return UIApplication.shared.keyWindow!.rootViewController! + } + + override open func setUp() { + UIApplication.shared.keyWindow!.rootViewController = UIViewController() + } + + override open func tearDown() { + UIApplication.shared.keyWindow!.rootViewController = nil + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Default-568h@2x.png b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..42d3f425033ab42f5640962487b6e58e3ee17c69 GIT binary patch literal 4594 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU@72W28#FwiW&hqDw)pC0iMpz3IRp=X_+~x z3=9^6t)chxZ-;^x5wll_aBuHAx;`{GdZ)D1+GA{JF-DuAChtc6CGrxz8A}?D~_04Ywws;1&YpwG1sD5#TUs3HXYv{w>Wl8G6 zM`FJII&FF1^11c%xZ5ta@tIp^NrrYzTfJ`Xd6lV?my1oA=i7B@^A&IAE304n=}tU- zR!Hxl==XE4AIf%doPIm;-9Nu?%KNLj?_BIu@;{I#DqAc0gD3FJmF#WaBKz5Y|H$0V zcIUIqhs$OxOskou*Uk~DxOiOM)=$x%v+sh|YtgkFd)RFD+(^^ko*2(8abohr&^+l~ zN@)`}ubq@wbpD}!f8ln+|NMHhOTWB{ZI1XoXX(!59sHg5w7-Sy>$JbV^^430?+x+m zcX}q)v;OG+b*YA_LO$@z%1N~)_ny1Q$FCK+$99jk`eMOyZr|TorH0iq5*sgmRee3< zgtEo;(sZHCOT-)AhyB=cBl*R|6(@o-A0$3F=vBLFX8f$euxBlIPj8Nzd4@^3KV|>& zvrih>8|=5N-Lr!A>?JF6<3(bhyu-8e)~$5BwQg2qAopLRnbvXrCp2?+Pdzk6{xsjN zvW1eT#k`JPe5qEyHmxdM@YW61-Sfn6O_+c8(wh=CiOL)Hd#v=IvB}(yy%LnPZSev3 z7cMT!eqy>wS66yjFA11uH08)%H!~YmqZ2KyhfgOOD*0a$%DG!<+5h->OV1|py}FA6 zms%fRU$Fn=#t8f1n~Z^B_V2dxhBv2qpVT8V01uGRSZd5?c- zh?tdMz^6YBwHh6P=Wf22`gOMdU)!t=-r8T3{Vy1rM86eQU>D9PHNRxHJUiR|4WG>^ zw%tF@z1^3cUGk^!bMM{m+~Z~&@{Vmg^y9|*jksrx4Cv0Cnazjwasjq3IBiNbfgVl%F0&o@;M_B&Pm zMEvQLKYRXcvXR~(vNK+8^71EpKfK}mc9!R_>|TiyuFYA#TdQ?HvPhWltFp~yyM8R> zXv^vnvB=x=Coc;!J8|sB7v<$;F>{_y>#DGt*QM^!`M%r#$ni(UOxx$}`4RU+ZNoC= zum2_s8(3LA$kp*tJz@N4u2o@}>ldz)*%!{n*0J5^TjaUA?3&pr(eRt=SFP9NtU0yA zDE6v*yXaXH(eqC=%*uD{J=DEeWnZ&W-wVfkzxTP8-Q~%B7wyvi|B&_Tu#D&x!nJP& zzV4U0)%L-!=9%%LZuYOc_C9*P*y9P?#9*rp_kYX2^nP@=Wc$U6hVP;0)m^OR&87aY zGncZCSNbn@G4->3Btv0EjP?Wt5Z@Sn2DRmzV368|&p4rRy77 zT3YHG80i}s=>k>g7FXt#Bv$C=6)QswftllyTAW;zSx}OhpQivaH!&%{w8U0P31kr* zK-^i9nTD__uNdkrpa=CqGWv#k2KsQbfm&@qqEm7$6{b!QF%`hORymn+3>% zPz^Tvpg=?lRB()eLIX{lP++H4Wa0>HkPK#EgG8+YGAmMZB3v?aQ}e(mv!<=wqs;T8siSJ>2Oixu+tr z05d*;s;zwUQ!>*kT@p)D?TiczjdTsnb&bqJ3{9;J%&iQ70gk2yDV9Jo&PAz-CHX}m z`T03^;0VhFaTSd84D^6m3S9->c!Gohu*k9F0_ubnUv^xY9}8y!OElvEpAc7Y*+v?% znAPnhP=`QCkY8|KRZZKD{iiQnx%=e9=bwN7T@mZ(U|`_T@pN$vskrs_%EgJT0UR!l z50m~euHF!7^KG$p%gW&3@M}9iH^skxUcFmM>Fe>PGkq(Bzi(uf*0NglsYUaK!1KJn z8zUctZvPiiyy?sFMH_kHQufp@nPRxQ{%gtJay}; b)BZ7hQM0)5-%UoJ0SG)@{an^LB{Ts5Wl;?~ literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Entitlements.plist b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Entitlements.plist new file mode 100644 index 00000000..76a15bb4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/Entitlements.plist @@ -0,0 +1,12 @@ + + + + + com.apple.private.tcc.allow + + kTCCServiceAddressBook + kTCCServiceCalendar + kTCCServicePhotos + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/TestUIImagePickerController.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/TestUIImagePickerController.swift new file mode 100644 index 00000000..43c7bf37 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/TestUIImagePickerController.swift @@ -0,0 +1,61 @@ +import XCTest + +class UIImagePickerControllerTests: XCTestCase { + var button: XCUIElement { + // calling this ensures that any other ViewController has dismissed + // as a side-effect since otherwise the switch won't be found + return XCUIApplication().tables.buttons.element + } + + var value: Bool { + return button.isEnabled + } + + override func setUp() { + super.setUp() + continueAfterFailure = false + XCUIApplication().launch() + XCTAssertFalse(value) + } + +#if !os(tvOS) + // this test works locally but not on travis + // attempting to detect Travis and early-return did not work + func test_rejects_when_cancelled() { + let app = XCUIApplication() + let table = app.tables + table.cells.staticTexts["1"].tap() + table.cells.element(boundBy: 0).tap() + app.navigationBars.buttons["Cancel"].tap() + + XCTAssertTrue(value) + } + + // following two don't seem to work since Xcode 8.1 + // The UI-Testing infrastructure cannot “see” the image picking UI + // And… trying to re-record by hand fails. + + func test_fulfills_with_edited_image() { + let app = XCUIApplication() + app.tables.cells.staticTexts["2"].tap() + app.tables.children(matching: .cell).element(boundBy: 1).tap() + app.collectionViews.children(matching: .cell).element(boundBy: 0).tap() + + // XCUITesting fails to tap this button, hence this test disabled + app.buttons["Choose"].tap() + + XCTAssertTrue(value) + } + + func test_fulfills_with_image() { + let app = XCUIApplication() + let tablesQuery = app.tables + tablesQuery.staticTexts["3"].tap() + tablesQuery.children(matching: .cell).element(boundBy: 1).tap() + + app.collectionViews.children(matching: .cell).element(boundBy: 0).tap() + + XCTAssertTrue(value) + } +#endif +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/app.swift b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/app.swift new file mode 100644 index 00000000..f46e0082 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/UIKit/UITests/app.swift @@ -0,0 +1,100 @@ +import PromiseKit +import PMKUIKit +import UIKit + +@UIApplicationMain +class App: UITableViewController, UIApplicationDelegate { + var window: UIWindow? = UIWindow(frame: UIScreen.main.bounds) + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? = nil) -> Bool { + window!.rootViewController = self + window!.backgroundColor = UIColor.purple + window!.makeKeyAndVisible() + UIView.setAnimationsEnabled(false) + return true + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return Row.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = UITableViewCell() + cell.textLabel?.text = Row(indexPath)?.description + return cell + } + + let testSuceededButton = UIButton() + + override func viewDidLoad() { + testSuceededButton.setTitle("unused", for: .normal) + testSuceededButton.sizeToFit() + testSuceededButton.backgroundColor = UIColor.blue + testSuceededButton.isEnabled = false + + view.addSubview(testSuceededButton) + } + + override func viewDidLayoutSubviews() { + testSuceededButton.center = view.center + } + + private func success() { + self.testSuceededButton.isEnabled = true + } + +#if !os(tvOS) + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch Row(indexPath)! { + case .ImagePickerCancel: + let p = promise(UIImagePickerController()) + p.catch(policy: .allErrors) { error in + guard (error as! CancellableError).isCancelled else { abort() } + self.success() + } + p.catch { error in + abort() + } + case .ImagePickerEditImage: + let picker = UIImagePickerController() + picker.allowsEditing = true + _ = promise(picker).done { _ in + self.success() + } + case .ImagePickerPickImage: + _ = promise(UIImagePickerController()).done { image in + self.success() + } + } + } +#endif +} + +enum Row: Int { + case ImagePickerCancel + case ImagePickerEditImage + case ImagePickerPickImage + + init?(_ indexPath: IndexPath) { + guard let row = Row(rawValue: indexPath.row) else { + return nil + } + self = row + } + + var indexPath: IndexPath { + return IndexPath(row: rawValue, section: 0) + } + + var description: String { + return (rawValue + 1).description + } + + static var count: Int { + var x = 0 + while Row(rawValue: x) != nil { + x += 1 + } + return x + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.gitignore b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.gitignore new file mode 100644 index 00000000..bec9c174 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.gitignore @@ -0,0 +1,5 @@ +*.xcodeproj/**/xcuserdata/ +*.xcscmblueprint +/Carthage +/.build +.DS_Store \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.travis.yml b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.travis.yml new file mode 100644 index 00000000..738b34ac --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/.travis.yml @@ -0,0 +1,78 @@ +osx_image: xcode10.2 +language: swift +os: osx + +branches: + only: + - master +stages: + - lint + - carthage + - test +jobs: + include: + - &pod + stage: lint + osx_image: xcode8.3 + env: SWIFT=3.1 + cache: cocoapods + before_install: + gem install cocoapods --prerelease --version 1.7.0.beta.3 + install: + carthage bootstrap --no-build PromiseKit + script: | + cd Carthage/Checkouts/PromiseKit + mv .github/PromiseKit.podspec . + rm -rf Extensions/WatchConnectivity/Sources + cp -R ../../../Sources Extensions/WatchConnectivity + pod lib lint --subspec=PromiseKit/WatchConnectivity --fail-fast --swift-version=$SWIFT + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=3.2 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=3.3 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=3.4 + - <<: *pod + osx_image: xcode9.2 + env: SWIFT=4.0 + - <<: *pod + osx_image: xcode9.4 + env: SWIFT=4.1 + - <<: *pod + osx_image: xcode10.1 + env: SWIFT=4.2 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=4.3 + - <<: *pod + osx_image: xcode10.2 + env: SWIFT=5.0 + + - &carthage + stage: carthage + osx_image: xcode9.2 + script: | + carthage bootstrap --cache-builds --platform iOS,macOS + sed -i '' "s/SWIFT_TREAT_WARNINGS_AS_ERRORS = NO;/SWIFT_TREAT_WARNINGS_AS_ERRORS = YES;/" *.xcodeproj/project.pbxproj + carthage build --no-skip-current + cache: + directories: + - Carthage + - <<: *carthage + osx_image: xcode9.4 + - <<: *carthage + osx_image: xcode10.1 + - <<: *carthage + osx_image: xcode10.2 + + - stage: test + xcode_scheme: PMKWatchConnectivity + xcode_project: PMKWatchConnectivity.xcodeproj + xcode_destination: 'platform=iOS Simulator,OS=12.2,name=iPhone SE' + cache.directories: + - Carthage + before_script: + carthage bootstrap --cache-builds --no-use-binaries diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile new file mode 100644 index 00000000..d4703e98 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile @@ -0,0 +1 @@ +github "mxcl/PromiseKit" ~> 6.8.4 diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile.resolved b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile.resolved new file mode 100644 index 00000000..f54bbdbf --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Cartfile.resolved @@ -0,0 +1 @@ +github "mxcl/PromiseKit" "6.8.4" diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Carthage.xcconfig b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Carthage.xcconfig new file mode 100644 index 00000000..c8b99565 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Carthage.xcconfig @@ -0,0 +1,7 @@ +// Created by Kevin Ballard on 12/14/15. +// Copyright © 2015 Postmates. All rights reserved. + +FRAMEWORK_SEARCH_PATHS[sdk=macosx*] = $(SRCROOT)/Carthage/Build/Mac/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=iphone*] = $(SRCROOT)/Carthage/Build/iOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=watch*] = $(SRCROOT)/Carthage/Build/watchOS/ $(inherited) +FRAMEWORK_SEARCH_PATHS[sdk=appletv*] = $(SRCROOT)/Carthage/Build/tvOS/ $(inherited) diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Info.plist b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Info.plist new file mode 100644 index 00000000..fbe1e6b3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/LICENSE b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c0442276 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.pbxproj @@ -0,0 +1,450 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 6384FB811D5D4F6D00453755 /* WCSession+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6384FB801D5D4F6D00453755 /* WCSession+Promise.swift */; }; + 6384FB831D5D4F8B00453755 /* TestWatchConnectivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6384FB821D5D4F8B00453755 /* TestWatchConnectivity.swift */; }; + 63C7FFF71D5C020D003BAE60 /* PMKWatchConnectivity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63C7FFA71D5BEE09003BAE60 /* PMKWatchConnectivity.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 63C7FF9E1D5BEE09003BAE60 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63C7FFA61D5BEE09003BAE60; + remoteInfo = PMKWatchConnectivity; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 6384FB801D5D4F6D00453755 /* WCSession+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "WCSession+Promise.swift"; path = "Sources/WCSession+Promise.swift"; sourceTree = SOURCE_ROOT; }; + 6384FB821D5D4F8B00453755 /* TestWatchConnectivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TestWatchConnectivity.swift; path = Tests/TestWatchConnectivity.swift; sourceTree = SOURCE_ROOT; }; + 63C700091D5C0253003BAE60 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 63C7FFA71D5BEE09003BAE60 /* PMKWatchConnectivity.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PMKWatchConnectivity.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63C7FFF21D5C020D003BAE60 /* PMKWCTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKWCTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 63CCF8121D5C0C4E00503216 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Carthage.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 63C7FFA31D5BEE09003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEF1D5C020D003BAE60 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 63C7FFF71D5C020D003BAE60 /* PMKWatchConnectivity.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 63C7FF9D1D5BEE09003BAE60 = { + isa = PBXGroup; + children = ( + 63C700091D5C0253003BAE60 /* Info.plist */, + 63CCF8121D5C0C4E00503216 /* Cartfile */, + 63CCF8171D5C11B500503216 /* Carthage.xcconfig */, + 63C7FFA91D5BEE09003BAE60 /* Sources */, + 63C7FFF31D5C020D003BAE60 /* Tests */, + 63C7FFA81D5BEE09003BAE60 /* Products */, + ); + sourceTree = ""; + }; + 63C7FFA81D5BEE09003BAE60 /* Products */ = { + isa = PBXGroup; + children = ( + 63C7FFA71D5BEE09003BAE60 /* PMKWatchConnectivity.framework */, + 63C7FFF21D5C020D003BAE60 /* PMKWCTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63C7FFA91D5BEE09003BAE60 /* Sources */ = { + isa = PBXGroup; + children = ( + 6384FB801D5D4F6D00453755 /* WCSession+Promise.swift */, + ); + path = Sources; + sourceTree = SOURCE_ROOT; + }; + 63C7FFF31D5C020D003BAE60 /* Tests */ = { + isa = PBXGroup; + children = ( + 6384FB821D5D4F8B00453755 /* TestWatchConnectivity.swift */, + ); + path = Tests; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63C7FFA41D5BEE09003BAE60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 63C7FFA61D5BEE09003BAE60 /* PMKWatchConnectivity */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKWatchConnectivity" */; + buildPhases = ( + 63C7FFA21D5BEE09003BAE60 /* Sources */, + 63C7FFA31D5BEE09003BAE60 /* Frameworks */, + 63C7FFA41D5BEE09003BAE60 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PMKWatchConnectivity; + productName = "PMK+UIKit"; + productReference = 63C7FFA71D5BEE09003BAE60 /* PMKWatchConnectivity.framework */; + productType = "com.apple.product-type.framework"; + }; + 63C7FFF11D5C020D003BAE60 /* PMKWCTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKWCTests" */; + buildPhases = ( + 63C7FFEE1D5C020D003BAE60 /* Sources */, + 63C7FFEF1D5C020D003BAE60 /* Frameworks */, + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */, + ); + name = PMKWCTests; + productName = PMKTests/NS; + productReference = 63C7FFF21D5C020D003BAE60 /* PMKWCTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 63C7FF9E1D5BEE09003BAE60 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0800; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Max Howell"; + TargetAttributes = { + 63C7FFA61D5BEE09003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + 63C7FFF11D5C020D003BAE60 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKWatchConnectivity" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 63C7FF9D1D5BEE09003BAE60; + productRefGroup = 63C7FFA81D5BEE09003BAE60 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63C7FFA61D5BEE09003BAE60 /* PMKWatchConnectivity */, + 63C7FFF11D5C020D003BAE60 /* PMKWCTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 639447051D5D011300DDAE3C /* Embed Carthage Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + PromiseKit, + ); + name = "Embed Carthage Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "case \"$PLATFORM_NAME\" in\nmacosx) plat=Mac;;\niphone*) plat=iOS;;\nwatch*) plat=watchOS;;\nappletv*) plat=tvOS;;\n*) echo \"error: Unknown PLATFORM_NAME: $PLATFORM_NAME\"; exit 1;;\nesac\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nframework=$(basename \"${!VAR}\")\nexport SCRIPT_INPUT_FILE_$n=\"$SRCROOT\"/Carthage/Build/$plat/\"$framework\".framework\ndone\n\n/usr/local/bin/carthage copy-frameworks || exit\n\nfor (( n = 0; n < SCRIPT_INPUT_FILE_COUNT; n++ )); do\nVAR=SCRIPT_INPUT_FILE_$n\nsource=${!VAR}.dSYM\ndest=${BUILT_PRODUCTS_DIR}/$(basename \"$source\")\nditto \"$source\" \"$dest\" || exit\ndone"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 63C7FFA21D5BEE09003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6384FB811D5D4F6D00453755 /* WCSession+Promise.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63C7FFEE1D5C020D003BAE60 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6384FB831D5D4F8B00453755 /* TestWatchConnectivity.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 63C7FFF91D5C020D003BAE60 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63C7FFA61D5BEE09003BAE60 /* PMKWatchConnectivity */; + targetProxy = 63C7FFF81D5C020D003BAE60 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 63C7FFAD1D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 63C7FFAE1D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63CCF8171D5C11B500503216 /* Carthage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_SUSPICIOUS_MOVES = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MACOSX_DEPLOYMENT_TARGET = 10.10; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit.Foundation; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos watchsimulator watchos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63C7FFB01D5BEE09003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Debug; + }; + 63C7FFB11D5BEE09003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = ""; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_MODULE_NAME = "${TARGET_NAME}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + }; + name = Release; + }; + 63C7FFFB1D5C020D003BAE60 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 63C7FFFC1D5C020D003BAE60 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + GCC_WARN_INHIBIT_ALL_WARNINGS = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 63C7FFA11D5BEE09003BAE60 /* Build configuration list for PBXProject "PMKWatchConnectivity" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFAD1D5BEE09003BAE60 /* Debug */, + 63C7FFAE1D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFAF1D5BEE09003BAE60 /* Build configuration list for PBXNativeTarget "PMKWatchConnectivity" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFB01D5BEE09003BAE60 /* Debug */, + 63C7FFB11D5BEE09003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63C7FFFA1D5C020D003BAE60 /* Build configuration list for PBXNativeTarget "PMKWCTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63C7FFFB1D5C020D003BAE60 /* Debug */, + 63C7FFFC1D5C020D003BAE60 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 63C7FF9E1D5BEE09003BAE60 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..b49fefe7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/xcshareddata/xcschemes/PMKWatchConnectivity.xcscheme b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/xcshareddata/xcschemes/PMKWatchConnectivity.xcscheme new file mode 100644 index 00000000..5ca9a0df --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/PMKWatchConnectivity.xcodeproj/xcshareddata/xcschemes/PMKWatchConnectivity.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/README.markdown b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/README.markdown new file mode 100644 index 00000000..069026f3 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/README.markdown @@ -0,0 +1,34 @@ +# PromiseKit WatchConnectivity Extensions ![Build Status] + +This project adds promises to Apple’s WatchConnectivity framework. + +## CocoaPods + +```ruby +pod "PromiseKit/WatchConnectivity" ~> 6.0 +``` + +The extensions are built into `PromiseKit.framework` thus nothing else is needed. + +## Carthage + +```ruby +github "PromiseKit/WatchConnectivity" ~> 3.0 +``` + +The extensions are built into their own framework: + +```swift +// swift +import PromiseKit +import PMKWatchConnectivity +``` + +```objc +// objc +@import PromiseKit; +@import PMKWatchConnectivity; +``` + + +[Build Status]: https://travis-ci.org/PromiseKit/WatchConnectivity.svg?branch=master diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Sources/WCSession+Promise.swift b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Sources/WCSession+Promise.swift new file mode 100644 index 00000000..934d51b5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Sources/WCSession+Promise.swift @@ -0,0 +1,21 @@ +import WatchConnectivity +import Foundation +#if !PMKCocoaPods +import PromiseKit +#endif + + +@available(iOS 9.0, *) +@available(iOSApplicationExtension 9.0, *) +extension WCSession { + + /// Sends a message immediately to the paired and active device and optionally handles a response. + public func sendMessage(_ message: [String: Any]) -> Promise<[String: Any]> { + return Promise { sendMessage(message, replyHandler: $0.fulfill, errorHandler: $0.reject) } + } + + /// Sends a data object immediately to the paired and active device and optionally handles a response. + public func sendMessageData(_ data: Data) -> Promise { + return Promise { sendMessageData(data, replyHandler: $0.fulfill, errorHandler: $0.reject) } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Tests/TestWatchConnectivity.swift b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Tests/TestWatchConnectivity.swift new file mode 100644 index 00000000..d19635e9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Extensions/WatchConnectivity/Tests/TestWatchConnectivity.swift @@ -0,0 +1,52 @@ +import PMKWatchConnectivity +import WatchConnectivity +import PromiseKit +import XCTest + +class WatchConnectivityTests: XCTestCase { + class MockSession: WCSession { + + var fail = false + + override func sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)?, errorHandler: ((Error) -> Void)?) { + if fail { + errorHandler?(NSError(domain: "Test", code: 1, userInfo: [:])) + } else { + replyHandler?(["response": "Success"]) + } + } + } + + func testSuccess() { + + let ex = expectation(description: "Success callback") + let session = MockSession.default as! MockSession + session.fail = false + session.sendMessage(["message": "test"]).done { response in + XCTAssertEqual(response as! [String: String], ["response": "Success"]) + ex.fulfill() + }.catch { _ in + XCTFail("Should not fail") + } + waitForExpectations(timeout: 1, handler: nil) + } + + func testFailure() { + class MockFailSession: WCSession { + override func sendMessage(_ message: [String : Any], replyHandler: (([String : Any]) -> Void)?, errorHandler: ((Error) -> Void)?) { + errorHandler?(NSError(domain: "Test", code: 1, userInfo: [:])) + } + } + + let ex = expectation(description: "Error callback") + let session = MockSession.default as! MockSession + session.fail = true + session.sendMessage(["message": "test"]).done { response in + XCTFail("Should not succeed") + }.catch { error in + XCTAssertEqual((error as NSError).domain, "Test") + ex.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + } +} diff --git a/Carthage/Checkouts/PromiseKit/LICENSE b/Carthage/Checkouts/PromiseKit/LICENSE new file mode 100644 index 00000000..50f758c8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/LICENSE @@ -0,0 +1,20 @@ +Copyright 2016-present, Max Howell; mxcl@me.com + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Carthage/Checkouts/PromiseKit/Package.swift b/Carthage/Checkouts/PromiseKit/Package.swift new file mode 100644 index 00000000..d9671749 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Package.swift @@ -0,0 +1,30 @@ +// swift-tools-version:4.0 + +import PackageDescription + +let pkg = Package(name: "PromiseKit") +pkg.products = [ + .library(name: "PromiseKit", targets: ["PromiseKit"]), +] + +let pmk: Target = .target(name: "PromiseKit") +pmk.path = "Sources" +pmk.exclude = [ + "AnyPromise.swift", + "AnyPromise.m", + "PMKCallVariadicBlock.m", + "dispatch_promise.m", + "join.m", + "when.m", + "NSMethodSignatureForBlock.m", + "after.m", + "hang.m", + "race.m", + "Deprecations.swift" +] +pkg.swiftLanguageVersions = [3, 4, 5] +pkg.targets = [ + pmk, + .testTarget(name: "APlus", dependencies: ["PromiseKit"], path: "Tests/A+"), + .testTarget(name: "CorePromise", dependencies: ["PromiseKit"], path: "Tests/CorePromise"), +] diff --git a/Carthage/Checkouts/PromiseKit/Package@swift-4.2.swift b/Carthage/Checkouts/PromiseKit/Package@swift-4.2.swift new file mode 100644 index 00000000..571ea6b2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Package@swift-4.2.swift @@ -0,0 +1,30 @@ +// swift-tools-version:4.2 + +import PackageDescription + +let pkg = Package(name: "PromiseKit") +pkg.products = [ + .library(name: "PromiseKit", targets: ["PromiseKit"]), +] + +let pmk: Target = .target(name: "PromiseKit") +pmk.path = "Sources" +pmk.exclude = [ + "AnyPromise.swift", + "AnyPromise.m", + "PMKCallVariadicBlock.m", + "dispatch_promise.m", + "join.m", + "when.m", + "NSMethodSignatureForBlock.m", + "after.m", + "hang.m", + "race.m", + "Deprecations.swift" +] +pkg.swiftLanguageVersions = [.v3, .v4, .v4_2] +pkg.targets = [ + pmk, + .testTarget(name: "APlus", dependencies: ["PromiseKit"], path: "Tests/A+"), + .testTarget(name: "CorePromise", dependencies: ["PromiseKit"], path: "Tests/CorePromise"), +] diff --git a/Carthage/Checkouts/PromiseKit/Package@swift-5.0.swift b/Carthage/Checkouts/PromiseKit/Package@swift-5.0.swift new file mode 100644 index 00000000..5d1ea438 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Package@swift-5.0.swift @@ -0,0 +1,33 @@ +// swift-tools-version:5.0 + +import PackageDescription + +let pkg = Package(name: "PromiseKit") +pkg.platforms = [ + .macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v2) +] +pkg.products = [ + .library(name: "PromiseKit", targets: ["PromiseKit"]), +] + +let pmk: Target = .target(name: "PromiseKit") +pmk.path = "Sources" +pmk.exclude = [ + "AnyPromise.swift", + "AnyPromise.m", + "PMKCallVariadicBlock.m", + "dispatch_promise.m", + "join.m", + "when.m", + "NSMethodSignatureForBlock.m", + "after.m", + "hang.m", + "race.m", + "Deprecations.swift" +] +pkg.swiftLanguageVersions = [.v4, .v4_2, .v5] +pkg.targets = [ + pmk, + .testTarget(name: "APlus", dependencies: ["PromiseKit"], path: "Tests/A+"), + .testTarget(name: "CorePromise", dependencies: ["PromiseKit"], path: "Tests/CorePromise"), +] diff --git a/Carthage/Checkouts/PromiseKit/Package@swift-5.3.swift b/Carthage/Checkouts/PromiseKit/Package@swift-5.3.swift new file mode 100644 index 00000000..0c4bf4d2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Package@swift-5.3.swift @@ -0,0 +1,34 @@ +// swift-tools-version:5.3 + +import PackageDescription + +let pkg = Package(name: "PromiseKit") +pkg.platforms = [ + .macOS(.v10_10), .iOS(.v9), .tvOS(.v9), .watchOS(.v2) +] +pkg.products = [ + .library(name: "PromiseKit", targets: ["PromiseKit"]), +] + +let pmk: Target = .target(name: "PromiseKit") +pmk.path = "Sources" +pmk.exclude = [ + "AnyPromise.swift", + "AnyPromise.m", + "PMKCallVariadicBlock.m", + "dispatch_promise.m", + "join.m", + "when.m", + "NSMethodSignatureForBlock.m", + "after.m", + "hang.m", + "race.m", + "Deprecations.swift", + "Info.plist" +] +pkg.swiftLanguageVersions = [.v4, .v4_2, .v5] +pkg.targets = [ + pmk, + .testTarget(name: "APlus", dependencies: ["PromiseKit"], path: "Tests/A+", exclude: ["README.md"]), + .testTarget(name: "CorePromise", dependencies: ["PromiseKit"], path: "Tests/CorePromise"), +] diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.playground/Contents.swift b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/Contents.swift new file mode 100644 index 00000000..3ade47e9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/Contents.swift @@ -0,0 +1,27 @@ +import PlaygroundSupport + +// Is this erroring? If so open the `.xcodeproj` and build the +// framework for a macOS target (usually labeled: “My Mac”). +// Then select `PromiseKit.playground` from inside Xcode. +import PromiseKit + + +func promise3() -> Promise { + return after(.seconds(1)).map{ 3 } +} + +firstly { + Promise.value(1) +}.map { _ in + 2 +}.then { _ in + promise3() +}.done { + print($0) // => 3 +}.catch { error in + // only happens for errors +}.finally { + PlaygroundPage.current.finishExecution() +} + +PlaygroundPage.current.needsIndefiniteExecution = true diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.playground/contents.xcplayground b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/contents.xcplayground new file mode 100644 index 00000000..e6f50393 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/contents.xcplayground @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.playground/playground.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.podspec b/Carthage/Checkouts/PromiseKit/PromiseKit.podspec new file mode 100644 index 00000000..0b99a499 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.podspec @@ -0,0 +1,302 @@ +Pod::Spec.new do |s| + s.name = "PromiseKit" + + s.version = '6.18.1' + + s.source = { + :git => "https://github.com/mxcl/#{s.name}.git", + :tag => s.version, + :submodules => true + } + + s.license = 'MIT' + s.summary = 'Promises for Swift & ObjC.' + s.homepage = 'http://mxcl.dev/PromiseKit/' + s.description = 'A thoughtful and complete implementation of promises for iOS, macOS, watchOS and tvOS with first-class support for both Objective-C and Swift.' + s.social_media_url = 'https://twitter.com/mxcl' + s.authors = { 'Max Howell' => 'mxcl@me.com' } + s.documentation_url = 'http://mxcl.dev/PromiseKit/reference/v6/Classes/Promise.html' + s.default_subspecs = 'CorePromise', 'UIKit', 'Foundation' + s.requires_arc = true + + s.swift_versions = ['3.2', '3.3', '3.4', '4.0', '4.1', '4.2', '4.3', '4.4', '5.0', '5.1', '5.2', '5.3', '5.4', '5.5'] + + # CocoaPods requires us to specify the root deployment targets + # even though for us it is nonsense. Our root spec has no + # sources. + s.ios.deployment_target = '8.0' + s.osx.deployment_target = '10.10' + s.watchos.deployment_target = '2.0' + s.tvos.deployment_target = '9.0' + + s.pod_target_xcconfig = { + 'OTHER_SWIFT_FLAGS' => '-DPMKCocoaPods', + } + + s.subspec 'Accounts' do |ss| + ss.ios.source_files = ss.osx.source_files = 'Extensions/Accounts/Sources/**/*' + ss.exclude_files = 'Extensions/Accounts/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = 'Accounts' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + end + + s.subspec 'Alamofire' do |ss| + ss.source_files = 'Extensions/Alamofire/Sources/**/*' + ss.exclude_files = 'Extensions/Alamofire/Sources/*.plist' + ss.dependency 'Alamofire', '~> 4.0' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.11' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'AddressBook' do |ss| + ss.ios.source_files = 'Extensions/AddressBook/Sources/**/*' + ss.exclude_files = 'Extensions/AddressBook/Sources/*.plist' + ss.ios.frameworks = 'AddressBook' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + end + + s.subspec 'AssetsLibrary' do |ss| + ss.ios.source_files = 'Extensions/AssetsLibrary/Sources/**/*' + ss.exclude_files = 'Extensions/AssetsLibrary/Sources/*.plist' + ss.ios.frameworks = 'AssetsLibrary' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + end + + s.subspec 'AVFoundation' do |ss| + ss.ios.source_files = 'Extensions/AVFoundation/Sources/**/*' + ss.exclude_files = 'Extensions/AVFoundation/Sources/*.plist' + ss.ios.frameworks = 'AVFoundation' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + end + + s.subspec 'Bolts' do |ss| + ss.source_files = 'Extensions/Bolts/Sources/**/*' + ss.exclude_files = 'Extensions/Bolts/Sources/*.plist' + ss.dependency 'PromiseKit/CorePromise' + ss.dependency 'Bolts', '~> 1.9.0' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'CloudKit' do |ss| + ss.source_files = 'Extensions/CloudKit/Sources/**/*' + ss.exclude_files = 'Extensions/CloudKit/Sources/*.plist' + ss.frameworks = 'CloudKit' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '10.0' + ss.osx.deployment_target = '10.12' + ss.tvos.deployment_target = '10.0' + ss.watchos.deployment_target = '3.0' + end + + s.subspec 'CoreBluetooth' do |ss| + ss.ios.source_files = ss.osx.source_files = ss.tvos.source_files = 'Extensions/CoreBluetooth/Sources/**/*' + ss.exclude_files = 'Extensions/CoreBluetooth/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = ss.tvos.frameworks = 'CoreBluetooth' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'CorePromise' do |ss| + hh = Dir['Sources/*.h'] - Dir['Sources/*+Private.h'] + + cc = Dir['Sources/*.swift'] - ['Sources/SwiftPM.swift'] + cc << 'Sources/{after,AnyPromise,GlobalState,dispatch_promise,hang,join,PMKPromise,when,race}.m' + cc += hh + + ss.source_files = cc + ss.exclude_files = 'Sources/*.plist' + ss.public_header_files = hh + ss.preserve_paths = 'Sources/AnyPromise+Private.h', 'Sources/PMKCallVariadicBlock.m', 'Sources/NSMethodSignatureForBlock.m' + ss.frameworks = 'Foundation' + + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'CoreLocation' do |ss| + ss.source_files = 'Extensions/CoreLocation/Sources/**/*' + ss.exclude_files = 'Extensions/CoreLocation/Sources/*.plist' + ss.watchos.source_files = 'Extensions/CoreLocation/Sources/CLGeocoder*' + ss.dependency 'PromiseKit/CorePromise' + ss.frameworks = 'CoreLocation' + + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '3.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'EventKit' do |ss| + ss.ios.source_files = ss.osx.source_files = ss.watchos.source_files = 'Extensions/EventKit/Sources/**/*' + ss.exclude_files = 'Extensions/EventKit/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = ss.watchos.frameworks = 'EventKit' + ss.dependency 'PromiseKit/CorePromise' + + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + end + + s.subspec 'Foundation' do |ss| + ss.source_files = Dir['Extensions/Foundation/Sources/**/*'] + ss.exclude_files = 'Extensions/Foundation/Sources/*.plist' + ss.dependency 'PromiseKit/CorePromise' + ss.frameworks = 'Foundation' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'HealthKit' do |ss| + ss.source_files = Dir['Extensions/HealthKit/Sources/**/*'] + ss.exclude_files = 'Extensions/HealthKit/Sources/*.plist' + ss.dependency 'PromiseKit/CorePromise' + ss.frameworks = 'HealthKit' + ss.ios.deployment_target = '9.0' + ss.watchos.deployment_target = '2.0' + end + + s.subspec 'HomeKit' do |ss| + ss.source_files = Dir['Extensions/HomeKit/Sources/**/*'] + ss.exclude_files = 'Extensions/HomeKit/Sources/*.plist' + ss.dependency 'PromiseKit/CorePromise' + ss.frameworks = 'HomeKit' + ss.ios.deployment_target = '8.0' + ss.watchos.deployment_target = '3.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'MapKit' do |ss| + ss.ios.source_files = ss.osx.source_files = ss.tvos.source_files = 'Extensions/MapKit/Sources/**/*' + ss.exclude_files = 'Extensions/MapKit/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = ss.tvos.frameworks = 'MapKit' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.2' + end + + s.subspec 'MessageUI' do |ss| + ss.ios.source_files = 'Extensions/MessagesUI/Sources/**/*' + ss.exclude_files = 'Extensions/MessagesUI/Sources/*.plist' + ss.ios.frameworks = 'MessageUI' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + end + + s.subspec 'OMGHTTPURLRQ' do |ss| + ss.source_files = 'Extensions/OMGHTTPURLRQ/Sources/**/*' + ss.exclude_files = 'Extensions/OMGHTTPURLRQ/Sources/*.plist' + ss.dependency 'PromiseKit/Foundation' + ss.dependency 'OMGHTTPURLRQ', '~> 3.2' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.watchos.deployment_target = '2.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'Photos' do |ss| + ss.ios.source_files = ss.tvos.source_files = ss.osx.source_files = 'Extensions/Photos/Sources/**/*' + ss.exclude_files = 'Extensions/Photos/Sources/*.plist' + ss.ios.frameworks = ss.tvos.frameworks = ss.osx.frameworks = 'Photos' + ss.dependency 'PromiseKit/CorePromise' + + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.13' + ss.tvos.deployment_target = '10.0' + end + + s.subspec 'QuartzCore' do |ss| + ss.osx.source_files = ss.ios.source_files = ss.tvos.source_files = 'Extensions/QuartzCore/Sources/**/*' + ss.exclude_files = 'Extensions/QuartzCore/Sources/*.plist' + ss.osx.frameworks = ss.ios.frameworks = ss.tvos.frameworks = 'QuartzCore' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'Social' do |ss| + ss.ios.source_files = 'Extensions/Social/Sources/**/*' + ss.exclude_files = 'Extensions/Social/Sources/*.plist' + ss.osx.source_files = Dir['Extensions/Social/Sources/*'] - ['Categories/Social/Sources/*SLComposeViewController+Promise.swift'] + ss.ios.frameworks = ss.osx.frameworks = 'Social' + ss.dependency 'PromiseKit/Foundation' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + end + + s.subspec 'StoreKit' do |ss| + ss.ios.source_files = ss.osx.source_files = ss.tvos.source_files = 'Extensions/StoreKit/Sources/**/*' + ss.exclude_files = 'Extensions/StoreKit/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = ss.tvos.frameworks = 'StoreKit' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'SystemConfiguration' do |ss| + ss.ios.source_files = ss.osx.source_files = ss.tvos.source_files = 'Extensions/SystemConfiguration/Sources/**/*' + ss.exclude_files = 'Extensions/SystemConfiguration/Sources/*.plist' + ss.ios.frameworks = ss.osx.frameworks = ss.tvos.frameworks = 'SystemConfiguration' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.osx.deployment_target = '10.10' + ss.tvos.deployment_target = '9.0' + end + + picker_cc = 'Extensions/UIKit/Sources/UIImagePickerController+Promise.swift' + + s.subspec 'UIKit' do |ss| + ss.ios.source_files = ss.tvos.source_files = Dir['Extensions/UIKit/Sources/**/*'] - [picker_cc] + ss.exclude_files = 'Extensions/UIKit/Sources/*.plist' + ss.tvos.frameworks = ss.ios.frameworks = 'UIKit' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.tvos.deployment_target = '9.0' + end + + s.subspec 'UIImagePickerController' do |ss| + # Since iOS 10, App Store submissions that contain references to + # UIImagePickerController (even if unused in 3rd party libraries) + # are rejected unless an Info.plist key is specified, thus we + # moved this code to a sub-subspec. + # + # This *was* a subspec of UIKit, but bizarrely CocoaPods would + # include this when specifying *just* UIKit…! + + ss.ios.source_files = picker_cc + ss.exclude_files = 'Extensions/UIKit/Sources/*.plist' + ss.ios.frameworks = 'UIKit' + ss.ios.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) PMKImagePickerController=1' } + ss.dependency 'PromiseKit/UIKit' + ss.ios.deployment_target = '8.0' + end + + s.subspec 'WatchConnectivity' do |ss| + ss.ios.source_files = ss.watchos.source_files = 'Extensions/WatchConnectivity/Sources/**/*' + ss.exclude_files = 'Extensions/WatchConnectivity/Sources/*.plist' + ss.ios.frameworks = ss.watchos.frameworks = 'WatchConnectivity' + ss.dependency 'PromiseKit/CorePromise' + ss.ios.deployment_target = '8.0' + ss.watchos.deployment_target = '2.0' + end +end diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.pbxproj b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.pbxproj new file mode 100644 index 00000000..8d11c89b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.pbxproj @@ -0,0 +1,1242 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 085B96B321A6359500E5E22F /* LoggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 085B96B121A6358900E5E22F /* LoggingTests.swift */; }; + 085B96BF21A9B37C00E5E22F /* LogEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 085B96BE21A9B37C00E5E22F /* LogEvent.swift */; }; + 0C42F31B1FCF86320051309C /* HangTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C42F3191FCF86240051309C /* HangTests.swift */; }; + 0CC3AF2B1FCF84F7000E98C9 /* hang.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CC3AF2A1FCF84F7000E98C9 /* hang.swift */; }; + 49A5584D1DC5185900E4D01B /* ResolverTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49A5584B1DC5172F00E4D01B /* ResolverTests.swift */; }; + 630A8056203CEF6800D25F23 /* AnyPromiseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 630A8051203CEF6800D25F23 /* AnyPromiseTests.m */; settings = {COMPILER_FLAGS = "-fobjc-arc-exceptions"; }; }; + 630A8057203CEF6800D25F23 /* PMKManifoldTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 630A8052203CEF6800D25F23 /* PMKManifoldTests.m */; }; + 630A8058203CEF6800D25F23 /* JoinTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 630A8053203CEF6800D25F23 /* JoinTests.m */; }; + 630A8059203CEF6800D25F23 /* HangTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 630A8054203CEF6800D25F23 /* HangTests.m */; }; + 630A805A203CEF6800D25F23 /* WhenTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 630A8055203CEF6800D25F23 /* WhenTests.m */; }; + 630A805B203CF67800D25F23 /* DefaultDispatchQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D641B1D59635300BC0AF5 /* DefaultDispatchQueueTests.swift */; }; + 631411381D59795700E24B9E /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; }; + 631411431D59797100E24B9E /* BridgingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6314113E1D59797100E24B9E /* BridgingTests.m */; }; + 631411441D59797100E24B9E /* BridgingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6314113F1D59797100E24B9E /* BridgingTests.swift */; }; + 631411451D59797100E24B9E /* Infrastructure.m in Sources */ = {isa = PBXBuildFile; fileRef = 631411411D59797100E24B9E /* Infrastructure.m */; }; + 631411461D59797100E24B9E /* Infrastructure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631411421D59797100E24B9E /* Infrastructure.swift */; }; + 631751A41D59766500A9DDDC /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; }; + 631751B71D59768200A9DDDC /* 0.0.0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751AB1D59768200A9DDDC /* 0.0.0.swift */; }; + 631751B81D59768200A9DDDC /* 2.1.2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751AC1D59768200A9DDDC /* 2.1.2.swift */; }; + 631751B91D59768200A9DDDC /* 2.1.3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751AD1D59768200A9DDDC /* 2.1.3.swift */; }; + 631751BA1D59768200A9DDDC /* 2.2.2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751AE1D59768200A9DDDC /* 2.2.2.swift */; }; + 631751BB1D59768200A9DDDC /* 2.2.3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751AF1D59768200A9DDDC /* 2.2.3.swift */; }; + 631751BC1D59768200A9DDDC /* 2.2.4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B01D59768200A9DDDC /* 2.2.4.swift */; }; + 631751BD1D59768200A9DDDC /* 2.2.6.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B11D59768200A9DDDC /* 2.2.6.swift */; }; + 631751BE1D59768200A9DDDC /* 2.2.7.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B21D59768200A9DDDC /* 2.2.7.swift */; }; + 631751BF1D59768200A9DDDC /* 2.3.1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B31D59768200A9DDDC /* 2.3.1.swift */; }; + 631751C01D59768200A9DDDC /* 2.3.2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B41D59768200A9DDDC /* 2.3.2.swift */; }; + 631751C11D59768200A9DDDC /* 2.3.4.swift in Sources */ = {isa = PBXBuildFile; fileRef = 631751B51D59768200A9DDDC /* 2.3.4.swift */; }; + 632FBBE31F33B273008F8FBB /* Catchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632FBBE21F33B273008F8FBB /* Catchable.swift */; }; + 632FBBE51F33B338008F8FBB /* CatchableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 632FBBE41F33B338008F8FBB /* CatchableTests.swift */; }; + 633027E6203CC0060037E136 /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; }; + 6330B5E11F2E991200D60528 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6330B5E01F2E991200D60528 /* Configuration.swift */; }; + 634AAD2B1EAE517C00B17855 /* fwd.h in Headers */ = {isa = PBXBuildFile; fileRef = 634AAD2A1EAE517C00B17855 /* fwd.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 635D641D1D59635300BC0AF5 /* PromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64081D59635300BC0AF5 /* PromiseTests.swift */; }; + 635D641E1D59635300BC0AF5 /* CancellableErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64091D59635300BC0AF5 /* CancellableErrorTests.swift */; }; + 635D64221D59635300BC0AF5 /* ZalgoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D640D1D59635300BC0AF5 /* ZalgoTests.swift */; }; + 635D64231D59635300BC0AF5 /* AfterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D640E1D59635300BC0AF5 /* AfterTests.swift */; }; + 635D64261D59635300BC0AF5 /* WhenResolvedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64111D59635300BC0AF5 /* WhenResolvedTests.swift */; }; + 635D64271D59635300BC0AF5 /* RaceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64121D59635300BC0AF5 /* RaceTests.swift */; }; + 635D64281D59635300BC0AF5 /* WhenConcurrentTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64131D59635300BC0AF5 /* WhenConcurrentTests.swift */; }; + 635D642A1D59635300BC0AF5 /* WhenTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64151D59635300BC0AF5 /* WhenTests.swift */; }; + 635D642B1D59635300BC0AF5 /* StressTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64161D59635300BC0AF5 /* StressTests.swift */; }; + 635D642C1D59635300BC0AF5 /* RegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 635D64171D59635300BC0AF5 /* RegressionTests.swift */; }; + 635D64301D596E8500BC0AF5 /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; }; + 636A291A1F1C156B001229C2 /* Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A29191F1C156B001229C2 /* Promise.swift */; }; + 636A291F1F1C16FF001229C2 /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A291E1F1C16FF001229C2 /* Box.swift */; }; + 636A29211F1C1716001229C2 /* Thenable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A29201F1C1716001229C2 /* Thenable.swift */; }; + 636A29231F1C17A6001229C2 /* Guarantee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A29221F1C17A6001229C2 /* Guarantee.swift */; }; + 636A29251F1C3089001229C2 /* race.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A29241F1C3089001229C2 /* race.swift */; }; + 636A29271F1C3927001229C2 /* Resolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636A29261F1C3927001229C2 /* Resolver.swift */; }; + 639BF757203DF03100FA577B /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 639BF755203DF02C00FA577B /* Utilities.swift */; }; + 63B0AC7F1D595E6300FA21D9 /* after.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC611D595E6300FA21D9 /* after.m */; }; + 63B0AC801D595E6300FA21D9 /* after.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC621D595E6300FA21D9 /* after.swift */; }; + 63B0AC811D595E6300FA21D9 /* AnyPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B0AC631D595E6300FA21D9 /* AnyPromise.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63B0AC821D595E6300FA21D9 /* AnyPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC641D595E6300FA21D9 /* AnyPromise.m */; }; + 63B0AC831D595E6300FA21D9 /* AnyPromise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC651D595E6300FA21D9 /* AnyPromise.swift */; }; + 63B0AC841D595E6300FA21D9 /* AnyPromise+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B0AC661D595E6300FA21D9 /* AnyPromise+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 63B0AC851D595E6300FA21D9 /* dispatch_promise.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC671D595E6300FA21D9 /* dispatch_promise.m */; }; + 63B0AC871D595E6300FA21D9 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC691D595E6300FA21D9 /* Error.swift */; }; + 63B0AC891D595E6300FA21D9 /* hang.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC6B1D595E6300FA21D9 /* hang.m */; }; + 63B0AC8B1D595E6300FA21D9 /* join.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC6D1D595E6300FA21D9 /* join.m */; }; + 63B0AC931D595E6300FA21D9 /* PromiseKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B0AC761D595E6300FA21D9 /* PromiseKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 63B0AC991D595E6300FA21D9 /* when.m in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC7C1D595E6300FA21D9 /* when.m */; }; + 63B0AC9A1D595E6300FA21D9 /* when.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B0AC7D1D595E6300FA21D9 /* when.swift */; }; + 63B18AEC1F2D205C00B79E37 /* CustomStringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B18AEB1F2D205C00B79E37 /* CustomStringConvertible.swift */; }; + 63B7C94B203E2B8200FBEC00 /* AnyPromiseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B7C94A203E2B8200FBEC00 /* AnyPromiseTests.swift */; }; + 63B912AA1F1D7B1300D49110 /* firstly.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63B912A91F1D7B1300D49110 /* firstly.swift */; }; + 63CF6D7A203CC66000EC8927 /* ErrorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63CF6D79203CC66000EC8927 /* ErrorTests.swift */; }; + 63CF6D7C203CCDAB00EC8927 /* GuaranteeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63CF6D7B203CCDAB00EC8927 /* GuaranteeTests.swift */; }; + 63CF6D7E203CD12700EC8927 /* DeprecationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63648C94203CB97400EBA011 /* DeprecationTests.swift */; }; + 63CF6D80203CD19200EC8927 /* ThenableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63CF6D7F203CD19200EC8927 /* ThenableTests.swift */; }; + 63D9B2EF203385FD0075C00B /* race.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D9B2EE203385FD0075C00B /* race.m */; }; + 63D9B2F120338D5D0075C00B /* Deprecations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63D9B2F020338D5D0075C00B /* Deprecations.swift */; }; + 9E4170F9287D88C900A3B4B5 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4170F8287D88C800A3B4B5 /* Async.swift */; }; + 9E4170FC287D8DF900A3B4B5 /* AsyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4170FA287D8DBD00A3B4B5 /* AsyncTests.swift */; }; + 9E66231626FE5A8C00FA25CB /* RaceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E66231526FE5A8C00FA25CB /* RaceTests.m */; }; + C013F7382048E3B6006B57B1 /* MockNodeEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = C013F7372048E3B6006B57B1 /* MockNodeEnvironment.swift */; }; + C013F73A2049076A006B57B1 /* JSPromise.swift in Sources */ = {isa = PBXBuildFile; fileRef = C013F7392049076A006B57B1 /* JSPromise.swift */; }; + C013F73C20494291006B57B1 /* JSAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = C013F73B20494291006B57B1 /* JSAdapter.swift */; }; + C013F740204E5064006B57B1 /* JSUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C013F73F204E5063006B57B1 /* JSUtils.swift */; }; + C0244E5E2047A6CB00ACB4AC /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; }; + C0244E692047AC9F00ACB4AC /* AllTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0244E682047AC9F00ACB4AC /* AllTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 631411341D59795700E24B9E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6399A3721D595D9100D65233 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63B0AC561D595E1B00FA21D9; + remoteInfo = PromiseKit; + }; + 6317518D1D59766500A9DDDC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6399A3721D595D9100D65233 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63B0AC561D595E1B00FA21D9; + remoteInfo = PromiseKit; + }; + 633027E2203CC0060037E136 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6399A3721D595D9100D65233 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63B0AC561D595E1B00FA21D9; + remoteInfo = PromiseKit; + }; + 635D64041D5962F900BC0AF5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6399A3721D595D9100D65233 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63B0AC561D595E1B00FA21D9; + remoteInfo = PromiseKit; + }; + C0244E502047A6CB00ACB4AC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6399A3721D595D9100D65233 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 63B0AC561D595E1B00FA21D9; + remoteInfo = PromiseKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + C0244E6E2047AF0B00ACB4AC /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 7; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 085B96B121A6358900E5E22F /* LoggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingTests.swift; sourceTree = ""; }; + 085B96BE21A9B37C00E5E22F /* LogEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LogEvent.swift; path = Sources/LogEvent.swift; sourceTree = ""; }; + 0C42F3191FCF86240051309C /* HangTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HangTests.swift; sourceTree = ""; }; + 0CC3AF2A1FCF84F7000E98C9 /* hang.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = hang.swift; path = Sources/hang.swift; sourceTree = ""; }; + 49A5584B1DC5172F00E4D01B /* ResolverTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResolverTests.swift; sourceTree = ""; }; + 630019221D596292003B4E30 /* PMKCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 630A8051203CEF6800D25F23 /* AnyPromiseTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnyPromiseTests.m; sourceTree = ""; }; + 630A8052203CEF6800D25F23 /* PMKManifoldTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PMKManifoldTests.m; sourceTree = ""; }; + 630A8053203CEF6800D25F23 /* JoinTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JoinTests.m; sourceTree = ""; }; + 630A8054203CEF6800D25F23 /* HangTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HangTests.m; sourceTree = ""; }; + 630A8055203CEF6800D25F23 /* WhenTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WhenTests.m; sourceTree = ""; }; + 6314113C1D59795700E24B9E /* PMKBridgeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKBridgeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6314113E1D59797100E24B9E /* BridgingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BridgingTests.m; sourceTree = ""; }; + 6314113F1D59797100E24B9E /* BridgingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BridgingTests.swift; sourceTree = ""; }; + 631411401D59797100E24B9E /* Infrastructure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Infrastructure.h; sourceTree = ""; }; + 631411411D59797100E24B9E /* Infrastructure.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Infrastructure.m; sourceTree = ""; }; + 631411421D59797100E24B9E /* Infrastructure.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Infrastructure.swift; sourceTree = ""; }; + 631751A81D59766500A9DDDC /* PMKA+Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PMKA+Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 631751AB1D59768200A9DDDC /* 0.0.0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 0.0.0.swift; sourceTree = ""; }; + 631751AC1D59768200A9DDDC /* 2.1.2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.1.2.swift; sourceTree = ""; }; + 631751AD1D59768200A9DDDC /* 2.1.3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.1.3.swift; sourceTree = ""; }; + 631751AE1D59768200A9DDDC /* 2.2.2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.2.2.swift; sourceTree = ""; }; + 631751AF1D59768200A9DDDC /* 2.2.3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.2.3.swift; sourceTree = ""; }; + 631751B01D59768200A9DDDC /* 2.2.4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.2.4.swift; sourceTree = ""; }; + 631751B11D59768200A9DDDC /* 2.2.6.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.2.6.swift; sourceTree = ""; }; + 631751B21D59768200A9DDDC /* 2.2.7.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.2.7.swift; sourceTree = ""; }; + 631751B31D59768200A9DDDC /* 2.3.1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.3.1.swift; sourceTree = ""; }; + 631751B41D59768200A9DDDC /* 2.3.2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.3.2.swift; sourceTree = ""; }; + 631751B51D59768200A9DDDC /* 2.3.4.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = 2.3.4.swift; sourceTree = ""; }; + 631751B61D59768200A9DDDC /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 632FBBE21F33B273008F8FBB /* Catchable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Catchable.swift; path = Sources/Catchable.swift; sourceTree = ""; }; + 632FBBE41F33B338008F8FBB /* CatchableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CatchableTests.swift; sourceTree = ""; }; + 633027EA203CC0060037E136 /* PMKDeprecatedTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PMKDeprecatedTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6330B5E01F2E991200D60528 /* Configuration.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Configuration.swift; path = Sources/Configuration.swift; sourceTree = ""; }; + 634AAD2A1EAE517C00B17855 /* fwd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fwd.h; path = Sources/fwd.h; sourceTree = ""; }; + 635893921D5BE4E000F14B55 /* PromiseKit.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = PromiseKit.playground; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; + 635893941D5BE4F900F14B55 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + 635893951D5BE4F900F14B55 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; + 635893961D5BE4F900F14B55 /* PromiseKit.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; name = PromiseKit.podspec; path = .github/PromiseKit.podspec; sourceTree = ""; }; + 635893971D5BE4F900F14B55 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 635D64081D59635300BC0AF5 /* PromiseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PromiseTests.swift; sourceTree = ""; }; + 635D64091D59635300BC0AF5 /* CancellableErrorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CancellableErrorTests.swift; sourceTree = ""; }; + 635D640D1D59635300BC0AF5 /* ZalgoTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ZalgoTests.swift; sourceTree = ""; }; + 635D640E1D59635300BC0AF5 /* AfterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AfterTests.swift; sourceTree = ""; }; + 635D64111D59635300BC0AF5 /* WhenResolvedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhenResolvedTests.swift; sourceTree = ""; }; + 635D64121D59635300BC0AF5 /* RaceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RaceTests.swift; sourceTree = ""; }; + 635D64131D59635300BC0AF5 /* WhenConcurrentTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhenConcurrentTests.swift; sourceTree = ""; }; + 635D64151D59635300BC0AF5 /* WhenTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhenTests.swift; sourceTree = ""; }; + 635D64161D59635300BC0AF5 /* StressTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StressTests.swift; sourceTree = ""; }; + 635D64171D59635300BC0AF5 /* RegressionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RegressionTests.swift; sourceTree = ""; }; + 635D641B1D59635300BC0AF5 /* DefaultDispatchQueueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultDispatchQueueTests.swift; sourceTree = ""; }; + 63648C94203CB97400EBA011 /* DeprecationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DeprecationTests.swift; path = Tests/DeprecationTests.swift; sourceTree = ""; }; + 636A29191F1C156B001229C2 /* Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Promise.swift; path = Sources/Promise.swift; sourceTree = ""; }; + 636A291E1F1C16FF001229C2 /* Box.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = ""; }; + 636A29201F1C1716001229C2 /* Thenable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Thenable.swift; path = Sources/Thenable.swift; sourceTree = ""; }; + 636A29221F1C17A6001229C2 /* Guarantee.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Guarantee.swift; path = Sources/Guarantee.swift; sourceTree = ""; }; + 636A29241F1C3089001229C2 /* race.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = race.swift; path = Sources/race.swift; sourceTree = ""; }; + 636A29261F1C3927001229C2 /* Resolver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Resolver.swift; path = Sources/Resolver.swift; sourceTree = ""; }; + 639BF755203DF02C00FA577B /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PromiseKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 63B0AC611D595E6300FA21D9 /* after.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = after.m; path = Sources/after.m; sourceTree = ""; }; + 63B0AC621D595E6300FA21D9 /* after.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = after.swift; path = Sources/after.swift; sourceTree = ""; }; + 63B0AC631D595E6300FA21D9 /* AnyPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AnyPromise.h; path = Sources/AnyPromise.h; sourceTree = ""; }; + 63B0AC641D595E6300FA21D9 /* AnyPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AnyPromise.m; path = Sources/AnyPromise.m; sourceTree = ""; }; + 63B0AC651D595E6300FA21D9 /* AnyPromise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AnyPromise.swift; path = Sources/AnyPromise.swift; sourceTree = ""; }; + 63B0AC661D595E6300FA21D9 /* AnyPromise+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "AnyPromise+Private.h"; path = "Sources/AnyPromise+Private.h"; sourceTree = ""; }; + 63B0AC671D595E6300FA21D9 /* dispatch_promise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = dispatch_promise.m; path = Sources/dispatch_promise.m; sourceTree = ""; }; + 63B0AC691D595E6300FA21D9 /* Error.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Sources/Error.swift; sourceTree = ""; }; + 63B0AC6B1D595E6300FA21D9 /* hang.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = hang.m; path = Sources/hang.m; sourceTree = ""; }; + 63B0AC6C1D595E6300FA21D9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Sources/Info.plist; sourceTree = ""; }; + 63B0AC6D1D595E6300FA21D9 /* join.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = join.m; path = Sources/join.m; sourceTree = ""; }; + 63B0AC6F1D595E6300FA21D9 /* NSMethodSignatureForBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NSMethodSignatureForBlock.m; path = Sources/NSMethodSignatureForBlock.m; sourceTree = ""; }; + 63B0AC711D595E6300FA21D9 /* PMKCallVariadicBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PMKCallVariadicBlock.m; path = Sources/PMKCallVariadicBlock.m; sourceTree = ""; }; + 63B0AC761D595E6300FA21D9 /* PromiseKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PromiseKit.h; path = Sources/PromiseKit.h; sourceTree = ""; }; + 63B0AC7C1D595E6300FA21D9 /* when.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = when.m; path = Sources/when.m; sourceTree = ""; }; + 63B0AC7D1D595E6300FA21D9 /* when.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = when.swift; path = Sources/when.swift; sourceTree = ""; }; + 63B18AEB1F2D205C00B79E37 /* CustomStringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CustomStringConvertible.swift; path = Sources/CustomStringConvertible.swift; sourceTree = ""; }; + 63B7C94A203E2B8200FBEC00 /* AnyPromiseTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyPromiseTests.swift; sourceTree = ""; }; + 63B912A91F1D7B1300D49110 /* firstly.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = firstly.swift; path = Sources/firstly.swift; sourceTree = ""; }; + 63CF6D79203CC66000EC8927 /* ErrorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorTests.swift; sourceTree = ""; }; + 63CF6D7B203CCDAB00EC8927 /* GuaranteeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuaranteeTests.swift; sourceTree = ""; }; + 63CF6D7F203CD19200EC8927 /* ThenableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThenableTests.swift; sourceTree = ""; }; + 63D9B2EE203385FD0075C00B /* race.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = race.m; path = Sources/race.m; sourceTree = ""; }; + 63D9B2F020338D5D0075C00B /* Deprecations.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Deprecations.swift; path = Sources/Deprecations.swift; sourceTree = ""; }; + 9E4170F8287D88C800A3B4B5 /* Async.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/Async.swift; sourceTree = ""; }; + 9E4170FA287D8DBD00A3B4B5 /* AsyncTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncTests.swift; sourceTree = ""; }; + 9E66231526FE5A8C00FA25CB /* RaceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RaceTests.m; sourceTree = ""; }; + C013F7372048E3B6006B57B1 /* MockNodeEnvironment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MockNodeEnvironment.swift; path = "Tests/JS-A+/MockNodeEnvironment.swift"; sourceTree = ""; }; + C013F7392049076A006B57B1 /* JSPromise.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = JSPromise.swift; path = "Tests/JS-A+/JSPromise.swift"; sourceTree = ""; }; + C013F73B20494291006B57B1 /* JSAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = JSAdapter.swift; path = "Tests/JS-A+/JSAdapter.swift"; sourceTree = ""; }; + C013F73F204E5063006B57B1 /* JSUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = JSUtils.swift; path = "Tests/JS-A+/JSUtils.swift"; sourceTree = ""; }; + C0244E622047A6CB00ACB4AC /* PMKJSA+Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PMKJSA+Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C0244E682047AC9F00ACB4AC /* AllTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AllTests.swift; path = "Tests/JS-A+/AllTests.swift"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 630019181D596292003B4E30 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 635D64301D596E8500BC0AF5 /* PromiseKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 631411371D59795700E24B9E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 631411381D59795700E24B9E /* PromiseKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 631751A31D59766500A9DDDC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 631751A41D59766500A9DDDC /* PromiseKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 633027E5203CC0060037E136 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 633027E6203CC0060037E136 /* PromiseKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63B0AC531D595E1B00FA21D9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C0244E5D2047A6CB00ACB4AC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C0244E5E2047A6CB00ACB4AC /* PromiseKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 630A8050203CEF6800D25F23 /* CoreObjC */ = { + isa = PBXGroup; + children = ( + 630A8051203CEF6800D25F23 /* AnyPromiseTests.m */, + 63B7C94A203E2B8200FBEC00 /* AnyPromiseTests.swift */, + 630A8052203CEF6800D25F23 /* PMKManifoldTests.m */, + 630A8053203CEF6800D25F23 /* JoinTests.m */, + 630A8054203CEF6800D25F23 /* HangTests.m */, + 630A8055203CEF6800D25F23 /* WhenTests.m */, + 9E66231526FE5A8C00FA25CB /* RaceTests.m */, + ); + name = CoreObjC; + path = Tests/CoreObjC; + sourceTree = ""; + }; + 630B60BF1F2F739E00A1AEFE /* Features */ = { + isa = PBXGroup; + children = ( + 63B0AC611D595E6300FA21D9 /* after.m */, + 63B0AC6B1D595E6300FA21D9 /* hang.m */, + 63B0AC6D1D595E6300FA21D9 /* join.m */, + 63B0AC7C1D595E6300FA21D9 /* when.m */, + 63D9B2EE203385FD0075C00B /* race.m */, + ); + name = Features; + sourceTree = ""; + }; + 630B60C01F2F73B000A1AEFE /* Headers */ = { + isa = PBXGroup; + children = ( + 634AAD2A1EAE517C00B17855 /* fwd.h */, + 63B0AC631D595E6300FA21D9 /* AnyPromise.h */, + ); + name = Headers; + sourceTree = ""; + }; + 6314113D1D59797100E24B9E /* Bridging */ = { + isa = PBXGroup; + children = ( + 6314113E1D59797100E24B9E /* BridgingTests.m */, + 6314113F1D59797100E24B9E /* BridgingTests.swift */, + 631411401D59797100E24B9E /* Infrastructure.h */, + 631411411D59797100E24B9E /* Infrastructure.m */, + 631411421D59797100E24B9E /* Infrastructure.swift */, + ); + name = Bridging; + path = Tests/Bridging; + sourceTree = ""; + }; + 6317518A1D59765700A9DDDC /* Core */ = { + isa = PBXGroup; + children = ( + 9E4170FA287D8DBD00A3B4B5 /* AsyncTests.swift */, + 63CF6D7F203CD19200EC8927 /* ThenableTests.swift */, + 632FBBE41F33B338008F8FBB /* CatchableTests.swift */, + 635D64081D59635300BC0AF5 /* PromiseTests.swift */, + 49A5584B1DC5172F00E4D01B /* ResolverTests.swift */, + 63CF6D7B203CCDAB00EC8927 /* GuaranteeTests.swift */, + 635D64091D59635300BC0AF5 /* CancellableErrorTests.swift */, + 63CF6D79203CC66000EC8927 /* ErrorTests.swift */, + 635D64151D59635300BC0AF5 /* WhenTests.swift */, + 635D64131D59635300BC0AF5 /* WhenConcurrentTests.swift */, + 635D64111D59635300BC0AF5 /* WhenResolvedTests.swift */, + 635D640E1D59635300BC0AF5 /* AfterTests.swift */, + 0C42F3191FCF86240051309C /* HangTests.swift */, + 635D64121D59635300BC0AF5 /* RaceTests.swift */, + 635D641B1D59635300BC0AF5 /* DefaultDispatchQueueTests.swift */, + 635D64171D59635300BC0AF5 /* RegressionTests.swift */, + 635D64161D59635300BC0AF5 /* StressTests.swift */, + 635D640D1D59635300BC0AF5 /* ZalgoTests.swift */, + 639BF755203DF02C00FA577B /* Utilities.swift */, + 085B96B121A6358900E5E22F /* LoggingTests.swift */, + ); + name = Core; + path = Tests/CorePromise; + sourceTree = ""; + }; + 631751AA1D59768200A9DDDC /* A+ */ = { + isa = PBXGroup; + children = ( + 631751AB1D59768200A9DDDC /* 0.0.0.swift */, + 631751AC1D59768200A9DDDC /* 2.1.2.swift */, + 631751AD1D59768200A9DDDC /* 2.1.3.swift */, + 631751AE1D59768200A9DDDC /* 2.2.2.swift */, + 631751AF1D59768200A9DDDC /* 2.2.3.swift */, + 631751B01D59768200A9DDDC /* 2.2.4.swift */, + 631751B11D59768200A9DDDC /* 2.2.6.swift */, + 631751B21D59768200A9DDDC /* 2.2.7.swift */, + 631751B31D59768200A9DDDC /* 2.3.1.swift */, + 631751B41D59768200A9DDDC /* 2.3.2.swift */, + 631751B51D59768200A9DDDC /* 2.3.4.swift */, + 631751B61D59768200A9DDDC /* README.md */, + ); + name = "A+"; + path = "Tests/A+"; + sourceTree = ""; + }; + 635893991D5BE51700F14B55 /* … */ = { + isa = PBXGroup; + children = ( + 63B0AC581D595E1B00FA21D9 /* Products */, + 63B0AC6C1D595E6300FA21D9 /* Info.plist */, + 635893941D5BE4F900F14B55 /* LICENSE */, + 635893951D5BE4F900F14B55 /* Package.swift */, + 635893961D5BE4F900F14B55 /* PromiseKit.podspec */, + ); + name = "…"; + sourceTree = ""; + }; + 635D64061D59630200BC0AF5 /* Tests */ = { + isa = PBXGroup; + children = ( + C0244E6B2047ACAF00ACB4AC /* JS/A+ */, + 631751AA1D59768200A9DDDC /* A+ */, + 6314113D1D59797100E24B9E /* Bridging */, + 6317518A1D59765700A9DDDC /* Core */, + 630A8050203CEF6800D25F23 /* CoreObjC */, + 63648C94203CB97400EBA011 /* DeprecationTests.swift */, + ); + name = Tests; + sourceTree = ""; + }; + 6399A3711D595D9100D65233 = { + isa = PBXGroup; + children = ( + 635893971D5BE4F900F14B55 /* README.md */, + 635893921D5BE4E000F14B55 /* PromiseKit.playground */, + 63B0AC761D595E6300FA21D9 /* PromiseKit.h */, + 63B0AC601D595E4C00FA21D9 /* Sources.swift */, + 63B912AB1F1E657400D49110 /* Sources.objc */, + 635D64061D59630200BC0AF5 /* Tests */, + 635893991D5BE51700F14B55 /* … */, + ); + sourceTree = ""; + }; + 63B0AC581D595E1B00FA21D9 /* Products */ = { + isa = PBXGroup; + children = ( + 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */, + 630019221D596292003B4E30 /* PMKCoreTests.xctest */, + 631751A81D59766500A9DDDC /* PMKA+Tests.xctest */, + 6314113C1D59795700E24B9E /* PMKBridgeTests.xctest */, + 633027EA203CC0060037E136 /* PMKDeprecatedTests.xctest */, + C0244E622047A6CB00ACB4AC /* PMKJSA+Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 63B0AC601D595E4C00FA21D9 /* Sources.swift */ = { + isa = PBXGroup; + children = ( + 9E4170F8287D88C800A3B4B5 /* Async.swift */, + 636A29191F1C156B001229C2 /* Promise.swift */, + 636A29221F1C17A6001229C2 /* Guarantee.swift */, + 636A29201F1C1716001229C2 /* Thenable.swift */, + 632FBBE21F33B273008F8FBB /* Catchable.swift */, + 63B912AC1F1E663E00D49110 /* Features */, + 63B0AC691D595E6300FA21D9 /* Error.swift */, + 636A29261F1C3927001229C2 /* Resolver.swift */, + 636A291E1F1C16FF001229C2 /* Box.swift */, + 6330B5E01F2E991200D60528 /* Configuration.swift */, + 63B18AEB1F2D205C00B79E37 /* CustomStringConvertible.swift */, + 63D9B2F020338D5D0075C00B /* Deprecations.swift */, + 085B96BE21A9B37C00E5E22F /* LogEvent.swift */, + ); + name = Sources.swift; + sourceTree = ""; + }; + 63B0AC9D1D595E6E00FA21D9 /* Internal Utilities */ = { + isa = PBXGroup; + children = ( + 63B0AC661D595E6300FA21D9 /* AnyPromise+Private.h */, + 63B0AC6F1D595E6300FA21D9 /* NSMethodSignatureForBlock.m */, + 63B0AC711D595E6300FA21D9 /* PMKCallVariadicBlock.m */, + ); + name = "Internal Utilities"; + sourceTree = ""; + }; + 63B912AB1F1E657400D49110 /* Sources.objc */ = { + isa = PBXGroup; + children = ( + 63B0AC641D595E6300FA21D9 /* AnyPromise.m */, + 63B0AC651D595E6300FA21D9 /* AnyPromise.swift */, + 63B0AC671D595E6300FA21D9 /* dispatch_promise.m */, + 630B60C01F2F73B000A1AEFE /* Headers */, + 630B60BF1F2F739E00A1AEFE /* Features */, + 63B0AC9D1D595E6E00FA21D9 /* Internal Utilities */, + ); + name = Sources.objc; + sourceTree = ""; + }; + 63B912AC1F1E663E00D49110 /* Features */ = { + isa = PBXGroup; + children = ( + 0CC3AF2A1FCF84F7000E98C9 /* hang.swift */, + 63B0AC621D595E6300FA21D9 /* after.swift */, + 63B912A91F1D7B1300D49110 /* firstly.swift */, + 636A29241F1C3089001229C2 /* race.swift */, + 63B0AC7D1D595E6300FA21D9 /* when.swift */, + ); + name = Features; + sourceTree = ""; + }; + C0244E6B2047ACAF00ACB4AC /* JS/A+ */ = { + isa = PBXGroup; + children = ( + C0244E682047AC9F00ACB4AC /* AllTests.swift */, + C013F7372048E3B6006B57B1 /* MockNodeEnvironment.swift */, + C013F7392049076A006B57B1 /* JSPromise.swift */, + C013F73B20494291006B57B1 /* JSAdapter.swift */, + C013F73F204E5063006B57B1 /* JSUtils.swift */, + ); + name = "JS/A+"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 63B0AC541D595E1B00FA21D9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 63B0AC931D595E6300FA21D9 /* PromiseKit.h in Headers */, + 634AAD2B1EAE517C00B17855 /* fwd.h in Headers */, + 63B0AC811D595E6300FA21D9 /* AnyPromise.h in Headers */, + 63B0AC841D595E6300FA21D9 /* AnyPromise+Private.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 630019011D596292003B4E30 /* PMKCoreTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6300191F1D596292003B4E30 /* Build configuration list for PBXNativeTarget "PMKCoreTests" */; + buildPhases = ( + 630019021D596292003B4E30 /* Sources */, + 630019181D596292003B4E30 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 635D64051D5962F900BC0AF5 /* PBXTargetDependency */, + ); + name = PMKCoreTests; + productName = PromiseKit; + productReference = 630019221D596292003B4E30 /* PMKCoreTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 631411321D59795700E24B9E /* PMKBridgeTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 631411391D59795700E24B9E /* Build configuration list for PBXNativeTarget "PMKBridgeTests" */; + buildPhases = ( + 631411351D59795700E24B9E /* Sources */, + 631411371D59795700E24B9E /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 631411331D59795700E24B9E /* PBXTargetDependency */, + ); + name = PMKBridgeTests; + productName = PromiseKit; + productReference = 6314113C1D59795700E24B9E /* PMKBridgeTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 6317518B1D59766500A9DDDC /* PMKA+Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 631751A51D59766500A9DDDC /* Build configuration list for PBXNativeTarget "PMKA+Tests" */; + buildPhases = ( + 6317518E1D59766500A9DDDC /* Sources */, + 631751A31D59766500A9DDDC /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 6317518C1D59766500A9DDDC /* PBXTargetDependency */, + ); + name = "PMKA+Tests"; + productName = PromiseKit; + productReference = 631751A81D59766500A9DDDC /* PMKA+Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 633027E0203CC0060037E136 /* PMKDeprecatedTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 633027E7203CC0060037E136 /* Build configuration list for PBXNativeTarget "PMKDeprecatedTests" */; + buildPhases = ( + 633027E3203CC0060037E136 /* Sources */, + 633027E5203CC0060037E136 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 633027E1203CC0060037E136 /* PBXTargetDependency */, + ); + name = PMKDeprecatedTests; + productName = PromiseKit; + productReference = 633027EA203CC0060037E136 /* PMKDeprecatedTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 63B0AC561D595E1B00FA21D9 /* PromiseKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 63B0AC5F1D595E1B00FA21D9 /* Build configuration list for PBXNativeTarget "PromiseKit" */; + buildPhases = ( + 63B0AC541D595E1B00FA21D9 /* Headers */, + 63B0AC521D595E1B00FA21D9 /* Sources */, + 63B0AC531D595E1B00FA21D9 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PromiseKit; + productName = PromiseKit; + productReference = 63B0AC571D595E1B00FA21D9 /* PromiseKit.framework */; + productType = "com.apple.product-type.framework"; + }; + C0244E4E2047A6CB00ACB4AC /* PMKJSA+Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C0244E5F2047A6CB00ACB4AC /* Build configuration list for PBXNativeTarget "PMKJSA+Tests" */; + buildPhases = ( + C0244E512047A6CB00ACB4AC /* Sources */, + C0244E5D2047A6CB00ACB4AC /* Frameworks */, + C0244E6E2047AF0B00ACB4AC /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + C0244E4F2047A6CB00ACB4AC /* PBXTargetDependency */, + ); + name = "PMKJSA+Tests"; + productName = PromiseKit; + productReference = C0244E622047A6CB00ACB4AC /* PMKJSA+Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6399A3721D595D9100D65233 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1250; + TargetAttributes = { + 630019011D596292003B4E30 = { + LastSwiftMigration = 1100; + }; + 631411321D59795700E24B9E = { + LastSwiftMigration = 1100; + }; + 6317518B1D59766500A9DDDC = { + LastSwiftMigration = 1100; + }; + 633027E0203CC0060037E136 = { + LastSwiftMigration = 1100; + }; + 63B0AC561D595E1B00FA21D9 = { + CreatedOnToolsVersion = 8.0; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + }; + C0244E4E2047A6CB00ACB4AC = { + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 6399A3751D595D9100D65233 /* Build configuration list for PBXProject "PromiseKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 6399A3711D595D9100D65233; + productRefGroup = 63B0AC581D595E1B00FA21D9 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 63B0AC561D595E1B00FA21D9 /* PromiseKit */, + 6317518B1D59766500A9DDDC /* PMKA+Tests */, + 631411321D59795700E24B9E /* PMKBridgeTests */, + 630019011D596292003B4E30 /* PMKCoreTests */, + 633027E0203CC0060037E136 /* PMKDeprecatedTests */, + C0244E4E2047A6CB00ACB4AC /* PMKJSA+Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 630019021D596292003B4E30 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C42F31B1FCF86320051309C /* HangTests.swift in Sources */, + 635D641E1D59635300BC0AF5 /* CancellableErrorTests.swift in Sources */, + 630A8056203CEF6800D25F23 /* AnyPromiseTests.m in Sources */, + 635D64221D59635300BC0AF5 /* ZalgoTests.swift in Sources */, + 635D64271D59635300BC0AF5 /* RaceTests.swift in Sources */, + 632FBBE51F33B338008F8FBB /* CatchableTests.swift in Sources */, + 63CF6D80203CD19200EC8927 /* ThenableTests.swift in Sources */, + 635D642B1D59635300BC0AF5 /* StressTests.swift in Sources */, + 630A805A203CEF6800D25F23 /* WhenTests.m in Sources */, + 630A805B203CF67800D25F23 /* DefaultDispatchQueueTests.swift in Sources */, + 635D641D1D59635300BC0AF5 /* PromiseTests.swift in Sources */, + 63CF6D7C203CCDAB00EC8927 /* GuaranteeTests.swift in Sources */, + 9E66231626FE5A8C00FA25CB /* RaceTests.m in Sources */, + 639BF757203DF03100FA577B /* Utilities.swift in Sources */, + 9E4170FC287D8DF900A3B4B5 /* AsyncTests.swift in Sources */, + 635D64261D59635300BC0AF5 /* WhenResolvedTests.swift in Sources */, + 635D64231D59635300BC0AF5 /* AfterTests.swift in Sources */, + 63CF6D7A203CC66000EC8927 /* ErrorTests.swift in Sources */, + 49A5584D1DC5185900E4D01B /* ResolverTests.swift in Sources */, + 630A8057203CEF6800D25F23 /* PMKManifoldTests.m in Sources */, + 085B96B321A6359500E5E22F /* LoggingTests.swift in Sources */, + 63B7C94B203E2B8200FBEC00 /* AnyPromiseTests.swift in Sources */, + 630A8059203CEF6800D25F23 /* HangTests.m in Sources */, + 635D642A1D59635300BC0AF5 /* WhenTests.swift in Sources */, + 630A8058203CEF6800D25F23 /* JoinTests.m in Sources */, + 635D64281D59635300BC0AF5 /* WhenConcurrentTests.swift in Sources */, + 635D642C1D59635300BC0AF5 /* RegressionTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 631411351D59795700E24B9E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 631411461D59797100E24B9E /* Infrastructure.swift in Sources */, + 631411431D59797100E24B9E /* BridgingTests.m in Sources */, + 631411441D59797100E24B9E /* BridgingTests.swift in Sources */, + 631411451D59797100E24B9E /* Infrastructure.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6317518E1D59766500A9DDDC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 631751C11D59768200A9DDDC /* 2.3.4.swift in Sources */, + 631751BA1D59768200A9DDDC /* 2.2.2.swift in Sources */, + 631751BF1D59768200A9DDDC /* 2.3.1.swift in Sources */, + 631751B91D59768200A9DDDC /* 2.1.3.swift in Sources */, + 631751BD1D59768200A9DDDC /* 2.2.6.swift in Sources */, + 631751B71D59768200A9DDDC /* 0.0.0.swift in Sources */, + 631751C01D59768200A9DDDC /* 2.3.2.swift in Sources */, + 631751B81D59768200A9DDDC /* 2.1.2.swift in Sources */, + 631751BE1D59768200A9DDDC /* 2.2.7.swift in Sources */, + 631751BC1D59768200A9DDDC /* 2.2.4.swift in Sources */, + 631751BB1D59768200A9DDDC /* 2.2.3.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 633027E3203CC0060037E136 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 63CF6D7E203CD12700EC8927 /* DeprecationTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 63B0AC521D595E1B00FA21D9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 636A29251F1C3089001229C2 /* race.swift in Sources */, + 63B0AC9A1D595E6300FA21D9 /* when.swift in Sources */, + 636A29271F1C3927001229C2 /* Resolver.swift in Sources */, + 63B0AC991D595E6300FA21D9 /* when.m in Sources */, + 63D9B2EF203385FD0075C00B /* race.m in Sources */, + 63B0AC801D595E6300FA21D9 /* after.swift in Sources */, + 63B18AEC1F2D205C00B79E37 /* CustomStringConvertible.swift in Sources */, + 085B96BF21A9B37C00E5E22F /* LogEvent.swift in Sources */, + 9E4170F9287D88C900A3B4B5 /* Async.swift in Sources */, + 6330B5E11F2E991200D60528 /* Configuration.swift in Sources */, + 63B912AA1F1D7B1300D49110 /* firstly.swift in Sources */, + 636A29211F1C1716001229C2 /* Thenable.swift in Sources */, + 632FBBE31F33B273008F8FBB /* Catchable.swift in Sources */, + 63B0AC851D595E6300FA21D9 /* dispatch_promise.m in Sources */, + 636A291F1F1C16FF001229C2 /* Box.swift in Sources */, + 63B0AC821D595E6300FA21D9 /* AnyPromise.m in Sources */, + 636A29231F1C17A6001229C2 /* Guarantee.swift in Sources */, + 636A291A1F1C156B001229C2 /* Promise.swift in Sources */, + 63B0AC8B1D595E6300FA21D9 /* join.m in Sources */, + 63B0AC891D595E6300FA21D9 /* hang.m in Sources */, + 63B0AC831D595E6300FA21D9 /* AnyPromise.swift in Sources */, + 63D9B2F120338D5D0075C00B /* Deprecations.swift in Sources */, + 63B0AC871D595E6300FA21D9 /* Error.swift in Sources */, + 0CC3AF2B1FCF84F7000E98C9 /* hang.swift in Sources */, + 63B0AC7F1D595E6300FA21D9 /* after.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C0244E512047A6CB00ACB4AC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C013F73C20494291006B57B1 /* JSAdapter.swift in Sources */, + C0244E692047AC9F00ACB4AC /* AllTests.swift in Sources */, + C013F740204E5064006B57B1 /* JSUtils.swift in Sources */, + C013F73A2049076A006B57B1 /* JSPromise.swift in Sources */, + C013F7382048E3B6006B57B1 /* MockNodeEnvironment.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 631411331D59795700E24B9E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63B0AC561D595E1B00FA21D9 /* PromiseKit */; + targetProxy = 631411341D59795700E24B9E /* PBXContainerItemProxy */; + }; + 6317518C1D59766500A9DDDC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63B0AC561D595E1B00FA21D9 /* PromiseKit */; + targetProxy = 6317518D1D59766500A9DDDC /* PBXContainerItemProxy */; + }; + 633027E1203CC0060037E136 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63B0AC561D595E1B00FA21D9 /* PromiseKit */; + targetProxy = 633027E2203CC0060037E136 /* PBXContainerItemProxy */; + }; + 635D64051D5962F900BC0AF5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63B0AC561D595E1B00FA21D9 /* PromiseKit */; + targetProxy = 635D64041D5962F900BC0AF5 /* PBXContainerItemProxy */; + }; + C0244E4F2047A6CB00ACB4AC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 63B0AC561D595E1B00FA21D9 /* PromiseKit */; + targetProxy = C0244E502047A6CB00ACB4AC /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 630019201D596292003B4E30 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + SWIFT_INSTALL_OBJC_HEADER = NO; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Debug; + }; + 630019211D596292003B4E30 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + SWIFT_INSTALL_OBJC_HEADER = NO; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Release; + }; + 6314113A1D59795700E24B9E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_BRIDGING_HEADER = Tests/Bridging/Infrastructure.h; + }; + name = Debug; + }; + 6314113B1D59795700E24B9E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OBJC_BRIDGING_HEADER = Tests/Bridging/Infrastructure.h; + }; + name = Release; + }; + 631751A61D59766500A9DDDC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + SWIFT_INSTALL_OBJC_HEADER = NO; + }; + name = Debug; + }; + 631751A71D59766500A9DDDC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + SWIFT_INSTALL_OBJC_HEADER = NO; + }; + name = Release; + }; + 633027E8203CC0060037E136 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Debug; + }; + 633027E9203CC0060037E136 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_SUPPRESS_WARNINGS = YES; + }; + name = Release; + }; + 6399A3761D595D9100D65233 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 6.18.1; + DEBUG_INFORMATION_FORMAT = dwarf; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_DYLIB_INSTALL_NAME = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit; + PRODUCT_BUNDLE_PACKAGE_TYPE = BNDL; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "macosx appletvsimulator appletvos watchsimulator iphonesimulator watchos iphoneos"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Debug; + }; + 6399A3771D595D9100D65233 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 6.18.1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_DYLIB_INSTALL_NAME = "@rpath"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + PRODUCT_BUNDLE_IDENTIFIER = org.promisekit; + PRODUCT_BUNDLE_PACKAGE_TYPE = BNDL; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "macosx appletvsimulator appletvos watchsimulator iphonesimulator watchos iphoneos"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + WATCHOS_DEPLOYMENT_TARGET = 2.0; + }; + name = Release; + }; + 63B0AC5D1D595E1B00FA21D9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_CXX0X_EXTENSIONS = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_TESTABILITY = YES; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LD_DYLIB_INSTALL_NAME = "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_PACKAGE_TYPE = FMWK; + SKIP_INSTALL = YES; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + }; + name = Debug; + }; + 63B0AC5E1D595E1B00FA21D9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = YES; + BITCODE_GENERATION_MODE = bitcode; + CLANG_WARN_ASSIGN_ENUM = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_CXX0X_EXTENSIONS = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES; + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LD_DYLIB_INSTALL_NAME = "$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_PACKAGE_TYPE = FMWK; + SKIP_INSTALL = YES; + SWIFT_TREAT_WARNINGS_AS_ERRORS = NO; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + }; + name = Release; + }; + C0244E602047A6CB00ACB4AC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + C0244E612047A6CB00ACB4AC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CLANG_ENABLE_MODULES = YES; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks @loader_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INSTALL_OBJC_HEADER = NO; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6300191F1D596292003B4E30 /* Build configuration list for PBXNativeTarget "PMKCoreTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 630019201D596292003B4E30 /* Debug */, + 630019211D596292003B4E30 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 631411391D59795700E24B9E /* Build configuration list for PBXNativeTarget "PMKBridgeTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6314113A1D59795700E24B9E /* Debug */, + 6314113B1D59795700E24B9E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 631751A51D59766500A9DDDC /* Build configuration list for PBXNativeTarget "PMKA+Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 631751A61D59766500A9DDDC /* Debug */, + 631751A71D59766500A9DDDC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 633027E7203CC0060037E136 /* Build configuration list for PBXNativeTarget "PMKDeprecatedTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 633027E8203CC0060037E136 /* Debug */, + 633027E9203CC0060037E136 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6399A3751D595D9100D65233 /* Build configuration list for PBXProject "PromiseKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6399A3761D595D9100D65233 /* Debug */, + 6399A3771D595D9100D65233 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 63B0AC5F1D595E1B00FA21D9 /* Build configuration list for PBXNativeTarget "PromiseKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 63B0AC5D1D595E1B00FA21D9 /* Debug */, + 63B0AC5E1D595E1B00FA21D9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C0244E5F2047A6CB00ACB4AC /* Build configuration list for PBXNativeTarget "PMKJSA+Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0244E602047A6CB00ACB4AC /* Debug */, + C0244E612047A6CB00ACB4AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 6399A3721D595D9100D65233 /* Project object */; +} diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..08de0be8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/xcshareddata/xcschemes/PromiseKit.xcscheme b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/xcshareddata/xcschemes/PromiseKit.xcscheme new file mode 100644 index 00000000..288d4a27 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/PromiseKit.xcodeproj/xcshareddata/xcschemes/PromiseKit.xcscheme @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/PromiseKit/README.md b/Carthage/Checkouts/PromiseKit/README.md new file mode 100644 index 00000000..1cb2f5d2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/README.md @@ -0,0 +1,210 @@ +![PromiseKit](../gh-pages/public/img/logo-tight.png) + +[![badge-pod][]][cocoapods] ![badge-languages][] ![badge-pms][] ![badge-platforms][] [![badge-travis][]][travis] + +--- + +Promises simplify asynchronous programming, freeing you up to focus on the more +important things. They are easy to learn, easy to master and result in clearer, +more readable code. Your co-workers will thank you. + +```swift +UIApplication.shared.isNetworkActivityIndicatorVisible = true + +let fetchImage = URLSession.shared.dataTask(.promise, with: url).compactMap{ UIImage(data: $0.data) } +let fetchLocation = CLLocationManager.requestLocation().lastValue + +firstly { + when(fulfilled: fetchImage, fetchLocation) +}.done { image, location in + self.imageView.image = image + self.label.text = "\(location)" +}.ensure { + UIApplication.shared.isNetworkActivityIndicatorVisible = false +}.catch { error in + self.show(UIAlertController(for: error), sender: self) +} +``` + +PromiseKit is a thoughtful and complete implementation of promises for any +platform that has a `swiftc`. It has *excellent* Objective-C bridging and +*delightful* specializations for iOS, macOS, tvOS and watchOS. It is a top-100 +pod used in many of the most popular apps in the world. + +[![codecov](https://codecov.io/gh/mxcl/PromiseKit/branch/master/graph/badge.svg)](https://codecov.io/gh/mxcl/PromiseKit) + +# PromiseKit 6 + +[Release notes and migration guide][PMK6]. + +# Quick Start + +In your [Podfile]: + +```ruby +use_frameworks! + +target "Change Me!" do + pod "PromiseKit", "~> 6.8" +end +``` + +> The above gives an Xcode warning? See our [Installation Guide]. + +PromiseKit 6, 5 and 4 support Xcode 8.3, 9.x and 10.0; Swift 3.1, +3.2, 3.3, 3.4, 4.0, 4.1, 4.2, 4.3 and 5.0 (development snapshots); iOS, macOS, +tvOS, watchOS, Linux and Android; CocoaPods, Carthage and SwiftPM; +([CI Matrix](https://travis-ci.org/mxcl/PromiseKit)). + +For Carthage, SwiftPM, Accio, etc., or for instructions when using older Swifts or Xcodes, see our [Installation Guide]. We recommend +[Carthage](https://github.com/Carthage/Carthage) or +[Accio](https://github.com/JamitLabs/Accio). + +# PromiseKit and Swift 5.5+ Async/Await + +As of Swift 5.5, the Swift language now offers support for [built-in concurrency with async / await](https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html). See [Async+](https://github.com/async-plus/async-plus) for a port of PromiseKit's most useful patterns to this new paradigm. + +# Professionally Supported PromiseKit is Now Available + +TideLift gives software development teams a single source for purchasing +and maintaining their software, with professional grade assurances from +the experts who know it best, while seamlessly integrating with existing +tools. + +[Get Professional Support for PromiseKit with TideLift](https://tidelift.com/subscription/pkg/cocoapods-promisekit?utm_source=cocoapods-promisekit&utm_medium=referral&utm_campaign=readme). + +# PromiseKit is Thousands of Hours of Work + +Hey there, I’m Max Howell. I’m a prolific producer of open source software and +probably you already use some of it (I created [`brew`]). I work full-time on +open source and it’s hard; currently *I earn less than minimum wage*. Please +help me continue my work, I appreciate it 🙏🏻 + + + + + +[Other ways to say thanks](http://mxcl.dev/#donate). + +[`brew`]: https://brew.sh + +# Documentation + +* Handbook + * [Getting Started](Documentation/GettingStarted.md) + * [Promises: Common Patterns](Documentation/CommonPatterns.md) + * [Frequently Asked Questions](Documentation/FAQ.md) +* Manual + * [Installation Guide](Documentation/Installation.md) + * [Objective-C Guide](Documentation/ObjectiveC.md) + * [Troubleshooting](Documentation/Troubleshooting.md) (e.g., solutions to common compile errors) + * [Appendix](Documentation/Appendix.md) +* [API Reference](https://mxcl.dev/PromiseKit/reference/v6/Classes/Promise.html) + +# Extensions + +Promises are only as useful as the asynchronous tasks they represent. Thus, we +have converted (almost) all of Apple’s APIs to promises. The default CocoaPod +provides Promises and the extensions for Foundation and UIKit. The other +extensions are available by specifying additional subspecs in your `Podfile`, +e.g.: + +```ruby +pod "PromiseKit/MapKit" # MKDirections().calculate().then { /*…*/ } +pod "PromiseKit/CoreLocation" # CLLocationManager.requestLocation().then { /*…*/ } +``` + +All our extensions are separate repositories at the [PromiseKit organization]. + +## I don't want the extensions! + +Then don’t have them: + +```ruby +pod "PromiseKit/CorePromise", "~> 6.8" +``` + +> *Note:* Carthage installations come with no extensions by default. + +## Choose Your Networking Library + +Promise chains commonly start with a network operation. Thus, we offer +extensions for `URLSession`: + +```swift +// pod 'PromiseKit/Foundation' # https://github.com/PromiseKit/Foundation + +firstly { + URLSession.shared.dataTask(.promise, with: try makeUrlRequest()).validate() + // ^^ we provide `.validate()` so that eg. 404s get converted to errors +}.map { + try JSONDecoder().decode(Foo.self, with: $0.data) +}.done { foo in + //… +}.catch { error in + //… +} + +func makeUrlRequest() throws -> URLRequest { + var rq = URLRequest(url: url) + rq.httpMethod = "POST" + rq.addValue("application/json", forHTTPHeaderField: "Content-Type") + rq.addValue("application/json", forHTTPHeaderField: "Accept") + rq.httpBody = try JSONEncoder().encode(obj) + return rq +} +``` + +And [Alamofire]: + +```swift +// pod 'PromiseKit/Alamofire' # https://github.com/PromiseKit/Alamofire- + +firstly { + Alamofire + .request("http://example.com", method: .post, parameters: params) + .responseDecodable(Foo.self) +}.done { foo in + //… +}.catch { error in + //… +} +``` + +Nowadays, considering that: + +* We almost always POST JSON +* We now have `JSONDecoder` +* PromiseKit now has `map` and other functional primitives +* PromiseKit (like Alamofire, but not raw-`URLSession`) also defaults to having + callbacks go to the main thread + +We recommend vanilla `URLSession`. It uses fewer black boxes and sticks closer to the metal. Alamofire was essential until the three bullet points above +became true, but nowadays it isn’t really necessary. + +# Support + +Please check our [Troubleshooting Guide](Documentation/Troubleshooting.md), and +if after that you still have a question, ask at our [Gitter chat channel] or on [our bug tracker]. + +## Security & Vulnerability Reporting or Disclosure + +https://tidelift.com/security + + +[badge-pod]: https://img.shields.io/cocoapods/v/PromiseKit.svg?label=version +[badge-pms]: https://img.shields.io/badge/supports-CocoaPods%20%7C%20Carthage%20%7C%20Accio%20%7C%20SwiftPM-green.svg +[badge-languages]: https://img.shields.io/badge/languages-Swift%20%7C%20ObjC-orange.svg +[badge-platforms]: https://img.shields.io/badge/platforms-macOS%20%7C%20iOS%20%7C%20watchOS%20%7C%20tvOS%20%7C%20Linux-lightgrey.svg +[badge-mit]: https://img.shields.io/badge/license-MIT-blue.svg +[OMGHTTPURLRQ]: https://github.com/PromiseKit/OMGHTTPURLRQ +[Alamofire]: http://github.com/PromiseKit/Alamofire- +[PromiseKit organization]: https://github.com/PromiseKit +[Gitter chat channel]: https://gitter.im/mxcl/PromiseKit +[our bug tracker]: https://github.com/mxcl/PromiseKit/issues/new +[Podfile]: https://guides.cocoapods.org/syntax/podfile.html +[PMK6]: http://mxcl.dev/PromiseKit/news/2018/02/PromiseKit-6.0-Released/ +[Installation Guide]: Documentation/Installation.md +[badge-travis]: https://travis-ci.org/mxcl/PromiseKit.svg?branch=master +[travis]: https://travis-ci.org/mxcl/PromiseKit +[cocoapods]: https://cocoapods.org/pods/PromiseKit diff --git a/Carthage/Checkouts/PromiseKit/Sources/AnyPromise+Private.h b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise+Private.h new file mode 100644 index 00000000..cd28c418 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise+Private.h @@ -0,0 +1,32 @@ +@import Foundation.NSError; +@import Foundation.NSPointerArray; + +#if TARGET_OS_IPHONE + #define NSPointerArrayMake(N) ({ \ + NSPointerArray *aa = [NSPointerArray strongObjectsPointerArray]; \ + aa.count = N; \ + aa; \ + }) +#else + static inline NSPointerArray * __nonnull NSPointerArrayMake(NSUInteger count) { + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + NSPointerArray *aa = [[NSPointerArray class] respondsToSelector:@selector(strongObjectsPointerArray)] + ? [NSPointerArray strongObjectsPointerArray] + : [NSPointerArray pointerArrayWithStrongObjects]; + #pragma clang diagnostic pop + aa.count = count; + return aa; + } +#endif + +#define IsError(o) [o isKindOfClass:[NSError class]] +#define IsPromise(o) [o isKindOfClass:[AnyPromise class]] + +#import "AnyPromise.h" + +@class PMKArray; + +@interface AnyPromise () +- (void)__pipe:(void(^ __nonnull)(__nullable id))block NS_REFINED_FOR_SWIFT; +@end diff --git a/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.h b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.h new file mode 100644 index 00000000..34b5252d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.h @@ -0,0 +1,315 @@ +#import +#import +#import + +/// INTERNAL DO NOT USE +@class __AnyPromise; + +/// Provided to simplify some usage sites +typedef void (^PMKResolver)(id __nullable) NS_REFINED_FOR_SWIFT; + + +/// An Objective-C implementation of the promise pattern. +@interface AnyPromise: NSObject + +/** + Create a new promise that resolves with the provided block. + + Use this method when wrapping asynchronous code that does *not* use promises so that this code can be used in promise chains. + + If `resolve` is called with an `NSError` object, the promise is rejected, otherwise the promise is fulfilled. + + Don’t use this method if you already have promises! Instead, just return your promise. + + Should you need to fulfill a promise but have no sensical value to use: your promise is a `void` promise: fulfill with `nil`. + + The block you pass is executed immediately on the calling thread. + + - Parameter block: The provided block is immediately executed, inside the block call `resolve` to resolve this promise and cause any attached handlers to execute. If you are wrapping a delegate-based system, we recommend instead to use: initWithResolver: + - Returns: A new promise. + - Warning: Resolving a promise with `nil` fulfills it. + - SeeAlso: https://github.com/mxcl/PromiseKit/blob/master/Documentation/GettingStarted.md#making-promises + - SeeAlso: https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#wrapping-delegate-systems + */ ++ (instancetype __nonnull)promiseWithResolverBlock:(void (^ __nonnull)(__nonnull PMKResolver))resolveBlock NS_REFINED_FOR_SWIFT; + + +/// INTERNAL DO NOT USE +- (instancetype __nonnull)initWith__D:(__AnyPromise * __nonnull)d; + +/** + Creates a resolved promise. + + When developing your own promise systems, it is occasionally useful to be able to return an already resolved promise. + + - Parameter value: The value with which to resolve this promise. Passing an `NSError` will cause the promise to be rejected, passing an AnyPromise will return a new AnyPromise bound to that promise, otherwise the promise will be fulfilled with the value passed. + - Returns: A resolved promise. + */ ++ (instancetype __nonnull)promiseWithValue:(__nullable id)value NS_REFINED_FOR_SWIFT; + +/** + The value of the asynchronous task this promise represents. + + A promise has `nil` value if the asynchronous task it represents has not finished. If the value is `nil` the promise is still `pending`. + + - Warning: *Note* Our Swift variant’s value property returns nil if the promise is rejected where AnyPromise will return the error object. This fits with the pattern where AnyPromise is not strictly typed and is more dynamic, but you should be aware of the distinction. + + - Note: If the AnyPromise was fulfilled with a `PMKManifold`, returns only the first fulfillment object. + + - Returns: The value with which this promise was resolved or `nil` if this promise is pending. + */ +@property (nonatomic, readonly) __nullable id value NS_REFINED_FOR_SWIFT; + +/// - Returns: if the promise is pending resolution. +@property (nonatomic, readonly) BOOL pending NS_REFINED_FOR_SWIFT; + +/// - Returns: if the promise is resolved and fulfilled. +@property (nonatomic, readonly) BOOL fulfilled NS_REFINED_FOR_SWIFT; + +/// - Returns: if the promise is resolved and rejected. +@property (nonatomic, readonly) BOOL rejected NS_REFINED_FOR_SWIFT; + + +/** + The provided block is executed when its receiver is fulfilled. + + If you provide a block that takes a parameter, the value of the receiver will be passed as that parameter. + + [NSURLSession GET:url].then(^(NSData *data){ + // do something with data + }); + + @return A new promise that is resolved with the value returned from the provided block. For example: + + [NSURLSession GET:url].then(^(NSData *data){ + return data.length; + }).then(^(NSNumber *number){ + //… + }); + + @warning *Important* The block passed to `then` may take zero, one, two or three arguments, and return an object or return nothing. This flexibility is why the method signature for then is `id`, which means you will not get completion for the block parameter, and must type it yourself. It is safe to type any block syntax here, so to start with try just: `^{}`. + + @warning *Important* If an `NSError` or `NSString` is thrown inside your block, or you return an `NSError` object the next `Promise` will be rejected. See `catch` for documentation on error handling. + + @warning *Important* `then` is always executed on the main queue. + + @see thenOn + @see thenInBackground +*/ +- (AnyPromise * __nonnull (^ __nonnull)(id __nonnull))then NS_REFINED_FOR_SWIFT; + + +/** + The provided block is executed on the default queue when the receiver is fulfilled. + + This method is provided as a convenience for `thenOn`. + + @see then + @see thenOn +*/ +- (AnyPromise * __nonnull(^ __nonnull)(id __nonnull))thenInBackground NS_REFINED_FOR_SWIFT; + +/** + The provided block is executed on the dispatch queue of your choice when the receiver is fulfilled. + + @see then + @see thenInBackground +*/ +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_queue_t __nonnull, id __nonnull))thenOn NS_REFINED_FOR_SWIFT; + +#ifndef __cplusplus +/** + The provided block is executed when the receiver is rejected. + + Provide a block of form `^(NSError *){}` or simply `^{}`. The parameter has type `id` to give you the freedom to choose either. + + The provided block always runs on the main queue. + + @warning *Note* Cancellation errors are not caught. + + @warning *Note* Since catch is a c++ keyword, this method is not available in Objective-C++ files. Instead use catchOn. + + @see catchOn + @see catchInBackground +*/ +- (AnyPromise * __nonnull(^ __nonnull)(id __nonnull))catch NS_REFINED_FOR_SWIFT; +#endif + +/** + The provided block is executed when the receiver is rejected. + + Provide a block of form `^(NSError *){}` or simply `^{}`. The parameter has type `id` to give you the freedom to choose either. + + The provided block always runs on the global background queue. + + @warning *Note* Cancellation errors are not caught. + + @warning *Note* Since catch is a c++ keyword, this method is not available in Objective-C++ files. Instead use catchWithPolicy. + + @see catch + @see catchOn + */ +- (AnyPromise * __nonnull(^ __nonnull)(id __nonnull))catchInBackground NS_REFINED_FOR_SWIFT; + + +/** + The provided block is executed when the receiver is rejected. + + Provide a block of form `^(NSError *){}` or simply `^{}`. The parameter has type `id` to give you the freedom to choose either. + + The provided block always runs on queue provided. + + @warning *Note* Cancellation errors are not caught. + + @see catch + @see catchInBackground + */ +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_queue_t __nonnull, id __nonnull))catchOn NS_REFINED_FOR_SWIFT; + +/** + The provided block is executed when the receiver is resolved. + + The provided block always runs on the main queue. + + @see ensureOn +*/ +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull))ensure NS_REFINED_FOR_SWIFT; + +/** + The provided block is executed on the dispatch queue of your choice when the receiver is resolved. + + @see ensure + */ +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_queue_t __nonnull, dispatch_block_t __nonnull))ensureOn NS_REFINED_FOR_SWIFT; + +/** + The provided block is executed on the global background queue when the receiver is resolved. + + @see ensure + */ +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull))ensureInBackground NS_REFINED_FOR_SWIFT; + +/** + Wait until the promise is resolved. + + @return Value if fulfilled or error if rejected. + */ +- (id __nullable)wait NS_REFINED_FOR_SWIFT; + +/** + Create a new promise with an associated resolver. + + Use this method when wrapping asynchronous code that does *not* use + promises so that this code can be used in promise chains. Generally, + prefer `promiseWithResolverBlock:` as the resulting code is more elegant. + + PMKResolver resolve; + AnyPromise *promise = [[AnyPromise alloc] initWithResolver:&resolve]; + + // later + resolve(@"foo"); + + @param resolver A reference to a block pointer of PMKResolver type. + You can then call your resolver to resolve this promise. + + @return A new promise. + + @warning *Important* The resolver strongly retains the promise. + + @see promiseWithResolverBlock: +*/ +- (instancetype __nonnull)initWithResolver:(PMKResolver __strong __nonnull * __nonnull)resolver NS_REFINED_FOR_SWIFT; + +/** + Unavailable methods + */ + +- (instancetype __nonnull)init __attribute__((unavailable("It is illegal to create an unresolvable promise."))); ++ (instancetype __nonnull)new __attribute__((unavailable("It is illegal to create an unresolvable promise."))); +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull))always __attribute__((unavailable("See -ensure"))); +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull))alwaysOn __attribute__((unavailable("See -ensureOn"))); +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull))finally __attribute__((unavailable("See -ensure"))); +- (AnyPromise * __nonnull(^ __nonnull)(dispatch_block_t __nonnull, dispatch_block_t __nonnull))finallyOn __attribute__((unavailable("See -ensureOn"))); + +@end + + +typedef void (^PMKAdapter)(id __nullable, NSError * __nullable) NS_REFINED_FOR_SWIFT; +typedef void (^PMKIntegerAdapter)(NSInteger, NSError * __nullable) NS_REFINED_FOR_SWIFT; +typedef void (^PMKBooleanAdapter)(BOOL, NSError * __nullable) NS_REFINED_FOR_SWIFT; + + +@interface AnyPromise (Adapters) + +/** + Create a new promise by adapting an existing asynchronous system. + + The pattern of a completion block that passes two parameters, the first + the result and the second an `NSError` object is so common that we + provide this convenience adapter to make wrapping such systems more + elegant. + + return [PMKPromise promiseWithAdapterBlock:^(PMKAdapter adapter){ + PFQuery *query = [PFQuery …]; + [query findObjectsInBackgroundWithBlock:adapter]; + }]; + + @warning *Important* If both parameters are nil, the promise fulfills, + if both are non-nil the promise rejects. This is per the convention. + + @see https://github.com/mxcl/PromiseKit/blob/master/Documentation/GettingStarted.md#making-promises + */ ++ (instancetype __nonnull)promiseWithAdapterBlock:(void (^ __nonnull)(PMKAdapter __nonnull adapter))block NS_REFINED_FOR_SWIFT; + +/** + Create a new promise by adapting an existing asynchronous system. + + Adapts asynchronous systems that complete with `^(NSInteger, NSError *)`. + NSInteger will cast to enums provided the enum has been wrapped with + `NS_ENUM`. All of Apple’s enums are, so if you find one that hasn’t you + may need to make a pull-request. + + @see promiseWithAdapter + */ ++ (instancetype __nonnull)promiseWithIntegerAdapterBlock:(void (^ __nonnull)(PMKIntegerAdapter __nonnull adapter))block NS_REFINED_FOR_SWIFT; + +/** + Create a new promise by adapting an existing asynchronous system. + + Adapts asynchronous systems that complete with `^(BOOL, NSError *)`. + + @see promiseWithAdapter + */ ++ (instancetype __nonnull)promiseWithBooleanAdapterBlock:(void (^ __nonnull)(PMKBooleanAdapter __nonnull adapter))block NS_REFINED_FOR_SWIFT; + +@end + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + Whenever resolving a promise you may resolve with a tuple, eg. + returning from a `then` or `catch` handler or resolving a new promise. + + Consumers of your Promise are not compelled to consume any arguments and + in fact will often only consume the first parameter. Thus ensure the + order of parameters is: from most-important to least-important. + + Currently PromiseKit limits you to THREE parameters to the manifold. +*/ +#define PMKManifold(...) __PMKManifold(__VA_ARGS__, 3, 2, 1) +#define __PMKManifold(_1, _2, _3, N, ...) __PMKArrayWithCount(N, _1, _2, _3) +extern id __nonnull __PMKArrayWithCount(NSUInteger, ...); + +#ifdef __cplusplus +} // Extern C +#endif + + + + +__attribute__((unavailable("See AnyPromise"))) +@interface PMKPromise +@end diff --git a/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.m b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.m new file mode 100644 index 00000000..5b262624 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.m @@ -0,0 +1,185 @@ +#if __has_include("PromiseKit-Swift.h") + #import "PromiseKit-Swift.h" +#else + #import +#endif +#import "PMKCallVariadicBlock.m" +#import "AnyPromise+Private.h" +#import "AnyPromise.h" + +NSString *const PMKErrorDomain = @"PMKErrorDomain"; + + +@implementation AnyPromise { + __AnyPromise *d; +} + +- (instancetype)initWith__D:(__AnyPromise *)dd { + self = [super init]; + if (self) self->d = dd; + return self; +} + +- (instancetype)initWithResolver:(PMKResolver __strong *)resolver { + self = [super init]; + if (self) + d = [[__AnyPromise alloc] initWithResolver:^(void (^resolve)(id)) { + *resolver = resolve; + }]; + return self; +} + ++ (instancetype)promiseWithResolverBlock:(void (^)(PMKResolver _Nonnull))resolveBlock { + id d = [[__AnyPromise alloc] initWithResolver:resolveBlock]; + return [[self alloc] initWith__D:d]; +} + ++ (instancetype)promiseWithValue:(id)value { + //TODO provide a more efficient route for sealed promises + id d = [[__AnyPromise alloc] initWithResolver:^(void (^resolve)(id)) { + resolve(value); + }]; + return [[self alloc] initWith__D:d]; +} + +//TODO remove if possible, but used by when.m +- (void)__pipe:(void (^)(id _Nullable))block { + [d __pipe:block]; +} + +//NOTE used by AnyPromise.swift +- (id)__d { + return d; +} + +- (AnyPromise *(^)(id))then { + return ^(id block) { + return [self->d __thenOn:dispatch_get_main_queue() execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(dispatch_queue_t, id))thenOn { + return ^(dispatch_queue_t queue, id block) { + return [self->d __thenOn:queue execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(id))thenInBackground { + return ^(id block) { + return [self->d __thenOn:dispatch_get_global_queue(0, 0) execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(dispatch_queue_t, id))catchOn { + return ^(dispatch_queue_t q, id block) { + return [self->d __catchOn:q execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(id))catch { + return ^(id block) { + return [self->d __catchOn:dispatch_get_main_queue() execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(id))catchInBackground { + return ^(id block) { + return [self->d __catchOn:dispatch_get_global_queue(0, 0) execute:^(id obj) { + return PMKCallVariadicBlock(block, obj); + }]; + }; +} + +- (AnyPromise *(^)(dispatch_block_t))ensure { + return ^(dispatch_block_t block) { + return [self->d __ensureOn:dispatch_get_main_queue() execute:block]; + }; +} + +- (AnyPromise *(^)(dispatch_queue_t, dispatch_block_t))ensureOn { + return ^(dispatch_queue_t queue, dispatch_block_t block) { + return [self->d __ensureOn:queue execute:block]; + }; +} + +- (AnyPromise *(^)(dispatch_block_t))ensureInBackground { + return ^(dispatch_block_t block) { + return [self->d __ensureOn:dispatch_get_global_queue(QOS_CLASS_UNSPECIFIED, 0) execute:block]; + }; +} + +- (id)wait { + return [d __wait]; +} + +- (BOOL)pending { + return [[d valueForKey:@"__pending"] boolValue]; +} + +- (BOOL)rejected { + return IsError([d __value]); +} + +- (BOOL)fulfilled { + return !self.rejected; +} + +- (id)value { + id obj = [d __value]; + + if ([obj isKindOfClass:[PMKArray class]]) { + return obj[0]; + } else { + return obj; + } +} + +@end + + + +@implementation AnyPromise (Adapters) + ++ (instancetype)promiseWithAdapterBlock:(void (^)(PMKAdapter))block { + return [self promiseWithResolverBlock:^(PMKResolver resolve) { + block(^(id value, id error){ + resolve(error ?: value); + }); + }]; +} + ++ (instancetype)promiseWithIntegerAdapterBlock:(void (^)(PMKIntegerAdapter))block { + return [self promiseWithResolverBlock:^(PMKResolver resolve) { + block(^(NSInteger value, id error){ + if (error) { + resolve(error); + } else { + resolve(@(value)); + } + }); + }]; +} + ++ (instancetype)promiseWithBooleanAdapterBlock:(void (^)(PMKBooleanAdapter adapter))block { + return [self promiseWithResolverBlock:^(PMKResolver resolve) { + block(^(BOOL value, id error){ + if (error) { + resolve(error); + } else { + resolve(@(value)); + } + }); + }]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.swift b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.swift new file mode 100644 index 00000000..d7e575d2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/AnyPromise.swift @@ -0,0 +1,224 @@ +import Foundation + +/** + __AnyPromise is an implementation detail. + + Because of how ObjC/Swift compatibility work we have to compose our AnyPromise + with this internal object, however this is still part of the public interface. + Sadly. Please don’t use it. +*/ +@objc(__AnyPromise) public class __AnyPromise: NSObject { + fileprivate let box: Box + + @objc public init(resolver body: (@escaping (Any?) -> Void) -> Void) { + box = EmptyBox() + super.init() + body { + if let p = $0 as? AnyPromise { + p.d.__pipe(self.box.seal) + } else { + self.box.seal($0) + } + } + } + + @objc public func __thenOn(_ q: DispatchQueue, execute: @escaping (Any?) -> Any?) -> AnyPromise { + return AnyPromise(__D: __AnyPromise(resolver: { resolve in + self.__pipe { obj in + if !(obj is NSError) { + q.async { + resolve(execute(obj)) + } + } else { + resolve(obj) + } + } + })) + } + + @objc public func __catchOn(_ q: DispatchQueue, execute: @escaping (Any?) -> Any?) -> AnyPromise { + return AnyPromise(__D: __AnyPromise(resolver: { resolve in + self.__pipe { obj in + if obj is NSError { + q.async { + resolve(execute(obj)) + } + } else { + resolve(obj) + } + } + })) + } + + @objc public func __ensureOn(_ q: DispatchQueue, execute: @escaping () -> Void) -> AnyPromise { + return AnyPromise(__D: __AnyPromise(resolver: { resolve in + self.__pipe { obj in + q.async { + execute() + resolve(obj) + } + } + })) + } + + @objc public func __wait() -> Any? { + if Thread.isMainThread { + conf.logHandler(.waitOnMainThread) + } + + var result = __value + + if result == nil { + let group = DispatchGroup() + group.enter() + self.__pipe { obj in + result = obj + group.leave() + } + group.wait() + } + + return result + } + + /// Internal, do not use! Some behaviors undefined. + @objc public func __pipe(_ to: @escaping (Any?) -> Void) { + let to = { (obj: Any?) -> Void in + if obj is NSError { + to(obj) // or we cannot determine if objects are errors in objc land + } else { + to(obj) + } + } + switch box.inspect() { + case .pending: + box.inspect { + switch $0 { + case .pending(let handlers): + handlers.append { obj in + to(obj) + } + case .resolved(let obj): + to(obj) + } + } + case .resolved(let obj): + to(obj) + } + } + + @objc public var __value: Any? { + switch box.inspect() { + case .resolved(let obj): + return obj + default: + return nil + } + } + + @objc public var __pending: Bool { + switch box.inspect() { + case .pending: + return true + case .resolved: + return false + } + } +} + +extension AnyPromise: Thenable, CatchMixin { + + /// - Returns: A new `AnyPromise` bound to a `Promise`. + public convenience init(_ bridge: U) { + self.init(__D: __AnyPromise(resolver: { resolve in + bridge.pipe { + switch $0 { + case .rejected(let error): + resolve(error as NSError) + case .fulfilled(let value): + resolve(value) + } + } + })) + } + + public func pipe(to body: @escaping (Result) -> Void) { + + func fulfill() { + // calling through to the ObjC `value` property unwraps (any) PMKManifold + // and considering this is the Swift pipe; we want that. + body(.fulfilled(self.value(forKey: "value"))) + } + + switch box.inspect() { + case .pending: + box.inspect { + switch $0 { + case .pending(let handlers): + handlers.append { + if let error = $0 as? Error { + body(.rejected(error)) + } else { + fulfill() + } + } + case .resolved(let error as Error): + body(.rejected(error)) + case .resolved: + fulfill() + } + } + case .resolved(let error as Error): + body(.rejected(error)) + case .resolved: + fulfill() + } + } + + fileprivate var d: __AnyPromise { + return value(forKey: "__d") as! __AnyPromise + } + + var box: Box { + return d.box + } + + public var result: Result? { + guard let value = __value else { + return nil + } + if let error = value as? Error { + return .rejected(error) + } else { + return .fulfilled(value) + } + } + + public typealias T = Any? +} + + +#if swift(>=3.1) +public extension Promise where T == Any? { + convenience init(_ anyPromise: AnyPromise) { + self.init { + anyPromise.pipe(to: $0.resolve) + } + } +} +#else +extension AnyPromise { + public func asPromise() -> Promise { + return Promise(.pending, resolver: { resolve in + pipe { result in + switch result { + case .rejected(let error): + resolve.reject(error) + case .fulfilled(let obj): + resolve.fulfill(obj) + } + } + }) + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Sources/Async.swift b/Carthage/Checkouts/PromiseKit/Sources/Async.swift new file mode 100644 index 00000000..dbfc3445 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Async.swift @@ -0,0 +1,28 @@ +#if swift(>=5.5) +#if canImport(_Concurrency) +@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) +public extension Guarantee { + func async() async -> T { + await withCheckedContinuation { continuation in + done { value in + continuation.resume(returning: value) + } + } + } +} + +@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) +public extension Promise { + func async() async throws -> T { + try await withCheckedThrowingContinuation { continuation in + done { value in + continuation.resume(returning: value) + }.catch { error in + continuation.resume(throwing: error) + } + } + } +} +#endif +#endif + diff --git a/Carthage/Checkouts/PromiseKit/Sources/Box.swift b/Carthage/Checkouts/PromiseKit/Sources/Box.swift new file mode 100644 index 00000000..43cd3d1b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Box.swift @@ -0,0 +1,101 @@ +import Dispatch + +enum Sealant { + case pending(Handlers) + case resolved(R) +} + +final class Handlers { + var bodies: [(R) -> Void] = [] + func append(_ item: @escaping(R) -> Void) { bodies.append(item) } +} + +/// - Remark: not protocol ∵ http://www.russbishop.net/swift-associated-types-cont +class Box { + func inspect() -> Sealant { fatalError() } + func inspect(_: (Sealant) -> Void) { fatalError() } + func seal(_: T) {} +} + +final class SealedBox: Box { + let value: T + + init(value: T) { + self.value = value + } + + override func inspect() -> Sealant { + return .resolved(value) + } +} + +class EmptyBox: Box { + private var sealant = Sealant.pending(.init()) + private let barrier = DispatchQueue(label: "org.promisekit.barrier", attributes: .concurrent) + + override func seal(_ value: T) { + var handlers: Handlers! + barrier.sync(flags: .barrier) { + guard case .pending(let _handlers) = self.sealant else { + return // already fulfilled! + } + handlers = _handlers + self.sealant = .resolved(value) + } + + //FIXME we are resolved so should `pipe(to:)` be called at this instant, “thens are called in order” would be invalid + //NOTE we don’t do this in the above `sync` because that could potentially deadlock + //THOUGH since `then` etc. typically invoke after a run-loop cycle, this issue is somewhat less severe + + if let handlers = handlers { + handlers.bodies.forEach{ $0(value) } + } + + //TODO solution is an unfortunate third state “sealed” where then's get added + // to a separate handler pool for that state + // any other solution has potential races + } + + override func inspect() -> Sealant { + var rv: Sealant! + barrier.sync { + rv = self.sealant + } + return rv + } + + override func inspect(_ body: (Sealant) -> Void) { + var sealed = false + barrier.sync(flags: .barrier) { + switch sealant { + case .pending: + // body will append to handlers, so we must stay barrier’d + body(sealant) + case .resolved: + sealed = true + } + } + if sealed { + // we do this outside the barrier to prevent potential deadlocks + // it's safe because we never transition away from this state + body(sealant) + } + } +} + + +extension Optional where Wrapped: DispatchQueue { + @inline(__always) + func async(flags: DispatchWorkItemFlags?, _ body: @escaping() -> Void) { + switch self { + case .none: + body() + case .some(let q): + if let flags = flags { + q.async(flags: flags, execute: body) + } else { + q.async(execute: body) + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Catchable.swift b/Carthage/Checkouts/PromiseKit/Sources/Catchable.swift new file mode 100644 index 00000000..596abdcb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Catchable.swift @@ -0,0 +1,256 @@ +import Dispatch + +/// Provides `catch` and `recover` to your object that conforms to `Thenable` +public protocol CatchMixin: Thenable +{} + +public extension CatchMixin { + + /** + The provided closure executes when this promise rejects. + + Rejecting a promise cascades: rejecting all subsequent promises (unless + recover is invoked) thus you will typically place your catch at the end + of a chain. Often utility promises will not have a catch, instead + delegating the error handling to the caller. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter policy: The default policy does not execute your handler for cancellation errors. + - Parameter execute: The handler to execute if this promise is rejected. + - Returns: A promise finalizer. + - SeeAlso: [Cancellation](https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#cancellation) + */ + @discardableResult + func `catch`(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, policy: CatchPolicy = conf.catchPolicy, _ body: @escaping(Error) -> Void) -> PMKFinalizer { + let finalizer = PMKFinalizer() + pipe { + switch $0 { + case .rejected(let error): + guard policy == .allErrors || !error.isCancelled else { + fallthrough + } + on.async(flags: flags) { + body(error) + finalizer.pending.resolve(()) + } + case .fulfilled: + finalizer.pending.resolve(()) + } + } + return finalizer + } +} + +public class PMKFinalizer { + let pending = Guarantee.pending() + + /// `finally` is the same as `ensure`, but it is not chainable + public func finally(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping () -> Void) { + pending.guarantee.done(on: on, flags: flags) { + body() + } + } +} + + +public extension CatchMixin { + + /** + The provided closure executes when this promise rejects. + + Unlike `catch`, `recover` continues the chain. + Use `recover` in circumstances where recovering the chain from certain errors is a possibility. For example: + + firstly { + CLLocationManager.requestLocation() + }.recover { error in + guard error == CLError.unknownLocation else { throw error } + return .value(CLLocation.chicago) + } + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The handler to execute if this promise is rejected. + - SeeAlso: [Cancellation](https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#cancellation) + */ + func recover(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, policy: CatchPolicy = conf.catchPolicy, _ body: @escaping(Error) throws -> U) -> Promise where U.T == T { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + rp.box.seal(.fulfilled(value)) + case .rejected(let error): + if policy == .allErrors || !error.isCancelled { + on.async(flags: flags) { + do { + let rv = try body(error) + guard rv !== rp else { throw PMKError.returnedSelf } + rv.pipe(to: rp.box.seal) + } catch { + rp.box.seal(.rejected(error)) + } + } + } else { + rp.box.seal(.rejected(error)) + } + } + } + return rp + } + + /** + The provided closure executes when this promise rejects. + This variant of `recover` requires the handler to return a Guarantee, thus it returns a Guarantee itself and your closure cannot `throw`. + - Note it is logically impossible for this to take a `catchPolicy`, thus `allErrors` are handled. + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The handler to execute if this promise is rejected. + - SeeAlso: [Cancellation](https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#cancellation) + */ + @discardableResult + func recover(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(Error) -> Guarantee) -> Guarantee { + let rg = Guarantee(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + rg.box.seal(value) + case .rejected(let error): + on.async(flags: flags) { + body(error).pipe(to: rg.box.seal) + } + } + } + return rg + } + + /** + The provided closure executes when this promise resolves, whether it rejects or not. + + firstly { + UIApplication.shared.networkActivityIndicatorVisible = true + }.done { + //… + }.ensure { + UIApplication.shared.networkActivityIndicatorVisible = false + }.catch { + //… + } + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that executes when this promise resolves. + - Returns: A new promise, resolved with this promise’s resolution. + */ + func ensure(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping () -> Void) -> Promise { + let rp = Promise(.pending) + pipe { result in + on.async(flags: flags) { + body() + rp.box.seal(result) + } + } + return rp + } + + /** + The provided closure executes when this promise resolves, whether it rejects or not. + The chain waits on the returned `Guarantee`. + + firstly { + setup() + }.done { + //… + }.ensureThen { + teardown() // -> Guarante + }.catch { + //… + } + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that executes when this promise resolves. + - Returns: A new promise, resolved with this promise’s resolution. + */ + func ensureThen(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping () -> Guarantee) -> Promise { + let rp = Promise(.pending) + pipe { result in + on.async(flags: flags) { + body().done { + rp.box.seal(result) + } + } + } + return rp + } + + + + /** + Consumes the Swift unused-result warning. + - Note: You should `catch`, but in situations where you know you don’t need a `catch`, `cauterize` makes your intentions clear. + */ + @discardableResult + func cauterize() -> PMKFinalizer { + return self.catch { + conf.logHandler(.cauterized($0)) + } + } +} + + +public extension CatchMixin where T == Void { + + /** + The provided closure executes when this promise rejects. + + This variant of `recover` is specialized for `Void` promises and de-errors your chain returning a `Guarantee`, thus you cannot `throw` and you must handle all errors including cancellation. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The handler to execute if this promise is rejected. + - SeeAlso: [Cancellation](https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#cancellation) + */ + @discardableResult + func recover(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(Error) -> Void) -> Guarantee { + let rg = Guarantee(.pending) + pipe { + switch $0 { + case .fulfilled: + rg.box.seal(()) + case .rejected(let error): + on.async(flags: flags) { + body(error) + rg.box.seal(()) + } + } + } + return rg + } + + /** + The provided closure executes when this promise rejects. + + This variant of `recover` ensures that no error is thrown from the handler and allows specifying a catch policy. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The handler to execute if this promise is rejected. + - SeeAlso: [Cancellation](https://github.com/mxcl/PromiseKit/blob/master/Documentation/CommonPatterns.md#cancellation) + */ + func recover(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, policy: CatchPolicy = conf.catchPolicy, _ body: @escaping(Error) throws -> Void) -> Promise { + let rg = Promise(.pending) + pipe { + switch $0 { + case .fulfilled: + rg.box.seal(.fulfilled(())) + case .rejected(let error): + if policy == .allErrors || !error.isCancelled { + on.async(flags: flags) { + do { + rg.box.seal(.fulfilled(try body(error))) + } catch { + rg.box.seal(.rejected(error)) + } + } + } else { + rg.box.seal(.rejected(error)) + } + } + } + return rg + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Configuration.swift b/Carthage/Checkouts/PromiseKit/Sources/Configuration.swift new file mode 100644 index 00000000..4db52323 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Configuration.swift @@ -0,0 +1,35 @@ +import Dispatch + +/** + PromiseKit’s configurable parameters. + + Do not change these after any Promise machinery executes as the configuration object is not thread-safe. + + We would like it to be, but sadly `Swift` does not expose `dispatch_once` et al. which is what we used to use in order to make the configuration immutable once first used. +*/ +public struct PMKConfiguration { + /// The default queues that promises handlers dispatch to + public var Q: (map: DispatchQueue?, return: DispatchQueue?) = (map: DispatchQueue.main, return: DispatchQueue.main) + + /// The default catch-policy for all `catch` and `resolve` + public var catchPolicy = CatchPolicy.allErrorsExceptCancellation + + /// The closure used to log PromiseKit events. + /// Not thread safe; change before processing any promises. + /// - Note: The default handler calls `print()` + public var logHandler: (LogEvent) -> Void = { event in + switch event { + case .waitOnMainThread: + print("PromiseKit: warning: `wait()` called on main thread!") + case .pendingPromiseDeallocated: + print("PromiseKit: warning: pending promise deallocated") + case .pendingGuaranteeDeallocated: + print("PromiseKit: warning: pending guarantee deallocated") + case .cauterized (let error): + print("PromiseKit:cauterized-error: \(error)") + } + } +} + +/// Modify this as soon as possible in your application’s lifetime +public var conf = PMKConfiguration() diff --git a/Carthage/Checkouts/PromiseKit/Sources/CustomStringConvertible.swift b/Carthage/Checkouts/PromiseKit/Sources/CustomStringConvertible.swift new file mode 100644 index 00000000..eee0b020 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/CustomStringConvertible.swift @@ -0,0 +1,44 @@ + +extension Promise: CustomStringConvertible { + /// - Returns: A description of the state of this promise. + public var description: String { + switch result { + case nil: + return "Promise(…\(T.self))" + case .rejected(let error)?: + return "Promise(\(error))" + case .fulfilled(let value)?: + return "Promise(\(value))" + } + } +} + +extension Promise: CustomDebugStringConvertible { + /// - Returns: A debug-friendly description of the state of this promise. + public var debugDescription: String { + switch box.inspect() { + case .pending(let handlers): + return "Promise<\(T.self)>.pending(handlers: \(handlers.bodies.count))" + case .resolved(.rejected(let error)): + return "Promise<\(T.self)>.rejected(\(type(of: error)).\(error))" + case .resolved(.fulfilled(let value)): + return "Promise<\(T.self)>.fulfilled(\(value))" + } + } +} + +#if !SWIFT_PACKAGE +extension AnyPromise { + /// - Returns: A description of the state of this promise. + override open var description: String { + switch box.inspect() { + case .pending: + return "AnyPromise(…)" + case .resolved(let obj?): + return "AnyPromise(\(obj))" + case .resolved(nil): + return "AnyPromise(nil)" + } + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Sources/Deprecations.swift b/Carthage/Checkouts/PromiseKit/Sources/Deprecations.swift new file mode 100644 index 00000000..a837dcb8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Deprecations.swift @@ -0,0 +1,93 @@ +import Dispatch + +@available(*, deprecated, message: "See `init(resolver:)`") +public func wrap(_ body: (@escaping (T?, Error?) -> Void) throws -> Void) -> Promise { + return Promise { seal in + try body(seal.resolve) + } +} + +@available(*, deprecated, message: "See `init(resolver:)`") +public func wrap(_ body: (@escaping (T, Error?) -> Void) throws -> Void) -> Promise { + return Promise { seal in + try body(seal.resolve) + } +} + +@available(*, deprecated, message: "See `init(resolver:)`") +public func wrap(_ body: (@escaping (Error?, T?) -> Void) throws -> Void) -> Promise { + return Promise { seal in + try body(seal.resolve) + } +} + +@available(*, deprecated, message: "See `init(resolver:)`") +public func wrap(_ body: (@escaping (Error?) -> Void) throws -> Void) -> Promise { + return Promise { seal in + try body(seal.resolve) + } +} + +@available(*, deprecated, message: "See `init(resolver:)`") +public func wrap(_ body: (@escaping (T) -> Void) throws -> Void) -> Promise { + return Promise { seal in + try body(seal.fulfill) + } +} + +public extension Promise { + @available(*, deprecated, message: "See `ensure`") + func always(on q: DispatchQueue = .main, execute body: @escaping () -> Void) -> Promise { + return ensure(on: q, body) + } +} + +public extension Thenable { +#if PMKFullDeprecations + /// disabled due to ambiguity with the other `.flatMap` + @available(*, deprecated, message: "See: `compactMap`") + func flatMap(on: DispatchQueue? = conf.Q.map, _ transform: @escaping(T) throws -> U?) -> Promise { + return compactMap(on: on, transform) + } +#endif +} + +public extension Thenable where T: Sequence { +#if PMKFullDeprecations + /// disabled due to ambiguity with the other `.map` + @available(*, deprecated, message: "See: `mapValues`") + func map(on: DispatchQueue? = conf.Q.map, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U]> { + return mapValues(on: on, transform) + } + + /// disabled due to ambiguity with the other `.flatMap` + @available(*, deprecated, message: "See: `flatMapValues`") + func flatMap(on: DispatchQueue? = conf.Q.map, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U.Iterator.Element]> { + return flatMapValues(on: on, transform) + } +#endif + + @available(*, deprecated, message: "See: `filterValues`") + func filter(on: DispatchQueue? = conf.Q.map, test: @escaping (T.Iterator.Element) -> Bool) -> Promise<[T.Iterator.Element]> { + return filterValues(on: on, test) + } +} + +public extension Thenable where T: Collection { + @available(*, deprecated, message: "See: `firstValue`") + var first: Promise { + return firstValue + } + + @available(*, deprecated, message: "See: `lastValue`") + var last: Promise { + return lastValue + } +} + +public extension Thenable where T: Sequence, T.Iterator.Element: Comparable { + @available(*, deprecated, message: "See: `sortedValues`") + func sorted(on: DispatchQueue? = conf.Q.map) -> Promise<[T.Iterator.Element]> { + return sortedValues(on: on) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Error.swift b/Carthage/Checkouts/PromiseKit/Sources/Error.swift new file mode 100644 index 00000000..be22f6b4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Error.swift @@ -0,0 +1,111 @@ +import Foundation + +public enum PMKError: Error { + /** + The completionHandler with form `(T?, Error?)` was called with `(nil, nil)`. + This is invalid as per Cocoa/Apple calling conventions. + */ + case invalidCallingConvention + + /** + A handler returned its own promise. 99% of the time, this is likely a + programming error. It is also invalid per Promises/A+. + */ + case returnedSelf + + /** `when()`, `race()` etc. were called with invalid parameters, eg. an empty array. */ + case badInput + + /// The operation was cancelled + case cancelled + + /// `nil` was returned from `flatMap` + @available(*, deprecated, message: "See: `compactMap`") + case flatMap(Any, Any.Type) + + /// `nil` was returned from `compactMap` + case compactMap(Any, Any.Type) + + /** + The lastValue or firstValue of a sequence was requested but the sequence was empty. + + Also used if all values of this collection failed the test passed to `firstValue(where:)`. + */ + case emptySequence + + /// no winner in `race(fulfilled:)` + case noWinner +} + +extension PMKError: CustomDebugStringConvertible { + public var debugDescription: String { + switch self { + case .flatMap(let obj, let type): + return "Could not `flatMap<\(type)>`: \(obj)" + case .compactMap(let obj, let type): + return "Could not `compactMap<\(type)>`: \(obj)" + case .invalidCallingConvention: + return "A closure was called with an invalid calling convention, probably (nil, nil)" + case .returnedSelf: + return "A promise handler returned itself" + case .badInput: + return "Bad input was provided to a PromiseKit function" + case .cancelled: + return "The asynchronous sequence was cancelled" + case .emptySequence: + return "The first or last element was requested for an empty sequence" + case .noWinner: + return "All thenables passed to race(fulfilled:) were rejected" + } + } +} + +extension PMKError: LocalizedError { + public var errorDescription: String? { + return debugDescription + } +} + + +//////////////////////////////////////////////////////////// Cancellation + +/// An error that may represent the cancelled condition +public protocol CancellableError: Error { + /// returns true if this Error represents a cancelled condition + var isCancelled: Bool { get } +} + +extension Error { + public var isCancelled: Bool { + do { + throw self + } catch PMKError.cancelled { + return true + } catch let error as CancellableError { + return error.isCancelled + } catch URLError.cancelled { + return true + } catch CocoaError.userCancelled { + return true + } catch let error as NSError { + #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + let domain = error.domain + let code = error.code + return ("SKErrorDomain", 2) == (domain, code) + #else + return false + #endif + } catch { + return false + } + } +} + +/// Used by `catch` and `recover` +public enum CatchPolicy { + /// Indicates that `catch` or `recover` handle all error types including cancellable-errors. + case allErrors + + /// Indicates that `catch` or `recover` handle all error except cancellable-errors. + case allErrorsExceptCancellation +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Guarantee.swift b/Carthage/Checkouts/PromiseKit/Sources/Guarantee.swift new file mode 100644 index 00000000..ce887cdc --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Guarantee.swift @@ -0,0 +1,390 @@ +import class Foundation.Thread +import Dispatch + +/** + A `Guarantee` is a functional abstraction around an asynchronous operation that cannot error. + - See: `Thenable` +*/ +public final class Guarantee: Thenable { + let box: PromiseKit.Box + + fileprivate init(box: SealedBox) { + self.box = box + } + + /// Returns a `Guarantee` sealed with the provided value. + public static func value(_ value: T) -> Guarantee { + return .init(box: SealedBox(value: value)) + } + + /// Returns a pending `Guarantee` that can be resolved with the provided closure’s parameter. + public init(resolver body: (@escaping(T) -> Void) -> Void) { + box = Box() + body(box.seal) + } + + /// - See: `Thenable.pipe` + public func pipe(to: @escaping(Result) -> Void) { + pipe{ to(.fulfilled($0)) } + } + + func pipe(to: @escaping(T) -> Void) { + switch box.inspect() { + case .pending: + box.inspect { + switch $0 { + case .pending(let handlers): + handlers.append(to) + case .resolved(let value): + to(value) + } + } + case .resolved(let value): + to(value) + } + } + + /// - See: `Thenable.result` + public var result: Result? { + switch box.inspect() { + case .pending: + return nil + case .resolved(let value): + return .fulfilled(value) + } + } + + final private class Box: EmptyBox { + deinit { + switch inspect() { + case .pending: + PromiseKit.conf.logHandler(.pendingGuaranteeDeallocated) + case .resolved: + break + } + } + } + + init(_: PMKUnambiguousInitializer) { + box = Box() + } + + /// Returns a tuple of a pending `Guarantee` and a function that resolves it. + public class func pending() -> (guarantee: Guarantee, resolve: (T) -> Void) { + return { ($0, $0.box.seal) }(Guarantee(.pending)) + } +} + +public extension Guarantee { + @discardableResult + func done(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(T) -> Void) -> Guarantee { + let rg = Guarantee(.pending) + pipe { (value: T) in + on.async(flags: flags) { + body(value) + rg.box.seal(()) + } + } + return rg + } + + func get(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping (T) -> Void) -> Guarantee { + return map(on: on, flags: flags) { + body($0) + return $0 + } + } + + func map(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(T) -> U) -> Guarantee { + let rg = Guarantee(.pending) + pipe { value in + on.async(flags: flags) { + rg.box.seal(body(value)) + } + } + return rg + } + + #if swift(>=4) && !swift(>=5.2) + func map(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Guarantee { + let rg = Guarantee(.pending) + pipe { value in + on.async(flags: flags) { + rg.box.seal(value[keyPath: keyPath]) + } + } + return rg + } + #endif + + @discardableResult + func then(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(T) -> Guarantee) -> Guarantee { + let rg = Guarantee(.pending) + pipe { value in + on.async(flags: flags) { + body(value).pipe(to: rg.box.seal) + } + } + return rg + } + + func asVoid() -> Guarantee { + return map(on: nil) { _ in } + } + + /** + Blocks this thread, so you know, don’t call this on a serial thread that + any part of your chain may use. Like the main thread for example. + */ + func wait() -> T { + + if Thread.isMainThread { + conf.logHandler(.waitOnMainThread) + } + + var result = value + + if result == nil { + let group = DispatchGroup() + group.enter() + pipe { (foo: T) in result = foo; group.leave() } + group.wait() + } + + return result! + } +} + +public extension Guarantee where T: Sequence { + /** + `Guarantee<[T]>` => `T` -> `U` => `Guarantee<[U]>` + + Guarantee.value([1,2,3]) + .mapValues { integer in integer * 2 } + .done { + // $0 => [2,4,6] + } + */ + func mapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) -> U) -> Guarantee<[U]> { + return map(on: on, flags: flags) { $0.map(transform) } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Guarantee<[T]>` => `KeyPath` => `Guarantee<[U]>` + + Guarantee.value([Person(name: "Max"), Person(name: "Roman"), Person(name: "John")]) + .mapValues(\.name) + .done { + // $0 => ["Max", "Roman", "John"] + } + */ + func mapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Guarantee<[U]> { + return map(on: on, flags: flags) { $0.map { $0[keyPath: keyPath] } } + } + #endif + + /** + `Guarantee<[T]>` => `T` -> `[U]` => `Guarantee<[U]>` + + Guarantee.value([1,2,3]) + .flatMapValues { integer in [integer, integer] } + .done { + // $0 => [1,1,2,2,3,3] + } + */ + func flatMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) -> U) -> Guarantee<[U.Iterator.Element]> { + return map(on: on, flags: flags) { (foo: T) in + foo.flatMap { transform($0) } + } + } + + /** + `Guarantee<[T]>` => `T` -> `U?` => `Guarantee<[U]>` + + Guarantee.value(["1","2","a","3"]) + .compactMapValues { Int($0) } + .done { + // $0 => [1,2,3] + } + */ + func compactMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) -> U?) -> Guarantee<[U]> { + return map(on: on, flags: flags) { foo -> [U] in + #if !swift(>=3.3) || (swift(>=4) && !swift(>=4.1)) + return foo.flatMap(transform) + #else + return foo.compactMap(transform) + #endif + } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Guarantee<[T]>` => `KeyPath` => `Guarantee<[U]>` + + Guarantee.value([Person(name: "Max"), Person(name: "Roman", age: 26), Person(name: "John", age: 23)]) + .compactMapValues(\.age) + .done { + // $0 => [26, 23] + } + */ + func compactMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Guarantee<[U]> { + return map(on: on, flags: flags) { foo -> [U] in + #if !swift(>=4.1) + return foo.flatMap { $0[keyPath: keyPath] } + #else + return foo.compactMap { $0[keyPath: keyPath] } + #endif + } + } + #endif + + /** + `Guarantee<[T]>` => `T` -> `Guarantee` => `Guaranetee<[U]>` + + Guarantee.value([1,2,3]) + .thenMap { .value($0 * 2) } + .done { + // $0 => [2,4,6] + } + */ + func thenMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) -> Guarantee) -> Guarantee<[U]> { + return then(on: on, flags: flags) { + when(fulfilled: $0.map(transform)) + }.recover { + // if happens then is bug inside PromiseKit + fatalError(String(describing: $0)) + } + } + + /** + `Guarantee<[T]>` => `T` -> `Guarantee<[U]>` => `Guarantee<[U]>` + + Guarantee.value([1,2,3]) + .thenFlatMap { integer in .value([integer, integer]) } + .done { + // $0 => [1,1,2,2,3,3] + } + */ + func thenFlatMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) -> U) -> Guarantee<[U.T.Iterator.Element]> where U.T: Sequence { + return then(on: on, flags: flags) { + when(fulfilled: $0.map(transform)) + }.map(on: nil) { + $0.flatMap { $0 } + }.recover { + // if happens then is bug inside PromiseKit + fatalError(String(describing: $0)) + } + } + + /** + `Guarantee<[T]>` => `T` -> Bool => `Guarantee<[T]>` + + Guarantee.value([1,2,3]) + .filterValues { $0 > 1 } + .done { + // $0 => [2,3] + } + */ + func filterValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ isIncluded: @escaping(T.Iterator.Element) -> Bool) -> Guarantee<[T.Iterator.Element]> { + return map(on: on, flags: flags) { + $0.filter(isIncluded) + } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Guarantee<[T]>` => `KeyPath` => `Guarantee<[T]>` + + Guarantee.value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]) + .filterValues(\.isStudent) + .done { + // $0 => [Person(name: "John", age: 23, isStudent: true)] + } + */ + func filterValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Guarantee<[T.Iterator.Element]> { + return map(on: on, flags: flags) { + $0.filter { $0[keyPath: keyPath] } + } + } + #endif + + /** + `Guarantee<[T]>` => (`T`, `T`) -> Bool => `Guarantee<[T]>` + + Guarantee.value([5,2,3,4,1]) + .sortedValues { $0 > $1 } + .done { + // $0 => [5,4,3,2,1] + } + */ + func sortedValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ areInIncreasingOrder: @escaping(T.Iterator.Element, T.Iterator.Element) -> Bool) -> Guarantee<[T.Iterator.Element]> { + return map(on: on, flags: flags) { + $0.sorted(by: areInIncreasingOrder) + } + } +} + +public extension Guarantee where T: Sequence, T.Iterator.Element: Comparable { + /** + `Guarantee<[T]>` => `Guarantee<[T]>` + + Guarantee.value([5,2,3,4,1]) + .sortedValues() + .done { + // $0 => [1,2,3,4,5] + } + */ + func sortedValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil) -> Guarantee<[T.Iterator.Element]> { + return map(on: on, flags: flags) { $0.sorted() } + } +} + +#if swift(>=3.1) +public extension Guarantee where T == Void { + convenience init() { + self.init(box: SealedBox(value: Void())) + } + + static var value: Guarantee { + return .value(Void()) + } +} +#endif + + +public extension DispatchQueue { + /** + Asynchronously executes the provided closure on a dispatch queue. + + DispatchQueue.global().async(.promise) { + md5(input) + }.done { md5 in + //… + } + + - Parameter body: The closure that resolves this promise. + - Returns: A new `Guarantee` resolved by the result of the provided closure. + - Note: There is no Promise/Thenable version of this due to Swift compiler ambiguity issues. + */ + @available(macOS 10.10, iOS 2.0, tvOS 10.0, watchOS 2.0, *) + final func async(_: PMKNamespacer, group: DispatchGroup? = nil, qos: DispatchQoS = .default, flags: DispatchWorkItemFlags = [], execute body: @escaping () -> T) -> Guarantee { + let rg = Guarantee(.pending) + async(group: group, qos: qos, flags: flags) { + rg.box.seal(body()) + } + return rg + } +} + + +#if os(Linux) +import func CoreFoundation._CFIsMainThread + +extension Thread { + // `isMainThread` is not implemented yet in swift-corelibs-foundation. + static var isMainThread: Bool { + return _CFIsMainThread() + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Sources/Info.plist b/Carthage/Checkouts/PromiseKit/Sources/Info.plist new file mode 100644 index 00000000..3a619de4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(CURRENT_PROJECT_VERSION) + CFBundleSignature + ???? + CFBundleVersion + 1 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + + diff --git a/Carthage/Checkouts/PromiseKit/Sources/LogEvent.swift b/Carthage/Checkouts/PromiseKit/Sources/LogEvent.swift new file mode 100644 index 00000000..99683bdb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/LogEvent.swift @@ -0,0 +1,30 @@ +/** + The PromiseKit events which may be logged. + + ```` + /// A promise or guarantee has blocked the main thread + case waitOnMainThread + + /// A promise has been deallocated without being resolved + case pendingPromiseDeallocated + + /// An error which occurred while fulfilling a promise was swallowed + case cauterized(Error) + + /// Errors which give a string error message + case misc (String) + ```` +*/ +public enum LogEvent { + /// A promise or guarantee has blocked the main thread + case waitOnMainThread + + /// A promise has been deallocated without being resolved + case pendingPromiseDeallocated + + /// A guarantee has been deallocated without being resolved + case pendingGuaranteeDeallocated + + /// An error which occurred while resolving a promise was swallowed + case cauterized(Error) +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/NSMethodSignatureForBlock.m b/Carthage/Checkouts/PromiseKit/Sources/NSMethodSignatureForBlock.m new file mode 100644 index 00000000..700c1b37 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/NSMethodSignatureForBlock.m @@ -0,0 +1,77 @@ +#import + +struct PMKBlockLiteral { + void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock + int flags; + int reserved; + void (*invoke)(void *, ...); + struct block_descriptor { + unsigned long int reserved; // NULL + unsigned long int size; // sizeof(struct Block_literal_1) + // optional helper functions + void (*copy_helper)(void *dst, void *src); // IFF (1<<25) + void (*dispose_helper)(void *src); // IFF (1<<25) + // required ABI.2010.3.16 + const char *signature; // IFF (1<<30) + } *descriptor; + // imported variables +}; + +typedef NS_OPTIONS(NSUInteger, PMKBlockDescriptionFlags) { + PMKBlockDescriptionFlagsHasCopyDispose = (1 << 25), + PMKBlockDescriptionFlagsHasCtor = (1 << 26), // helpers have C++ code + PMKBlockDescriptionFlagsIsGlobal = (1 << 28), + PMKBlockDescriptionFlagsHasStret = (1 << 29), // IFF BLOCK_HAS_SIGNATURE + PMKBlockDescriptionFlagsHasSignature = (1 << 30) +}; + +// It appears 10.7 doesn't support quotes in method signatures. Remove them +// via @rabovik's method. See https://github.com/OliverLetterer/SLObjectiveCRuntimeAdditions/pull/2 +#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8 +NS_INLINE static const char * pmk_removeQuotesFromMethodSignature(const char *str){ + char *result = malloc(strlen(str) + 1); + BOOL skip = NO; + char *to = result; + char c; + while ((c = *str++)) { + if ('"' == c) { + skip = !skip; + continue; + } + if (skip) continue; + *to++ = c; + } + *to = '\0'; + return result; +} +#endif + +static NSMethodSignature *NSMethodSignatureForBlock(id block) { + if (!block) + return nil; + + struct PMKBlockLiteral *blockRef = (__bridge struct PMKBlockLiteral *)block; + PMKBlockDescriptionFlags flags = (PMKBlockDescriptionFlags)blockRef->flags; + + if (flags & PMKBlockDescriptionFlagsHasSignature) { + void *signatureLocation = blockRef->descriptor; + signatureLocation += sizeof(unsigned long int); + signatureLocation += sizeof(unsigned long int); + + if (flags & PMKBlockDescriptionFlagsHasCopyDispose) { + signatureLocation += sizeof(void(*)(void *dst, void *src)); + signatureLocation += sizeof(void (*)(void *src)); + } + + const char *signature = (*(const char **)signatureLocation); +#if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_8 + signature = pmk_removeQuotesFromMethodSignature(signature); + NSMethodSignature *nsSignature = [NSMethodSignature signatureWithObjCTypes:signature]; + free((void *)signature); + + return nsSignature; +#endif + return [NSMethodSignature signatureWithObjCTypes:signature]; + } + return 0; +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/PMKCallVariadicBlock.m b/Carthage/Checkouts/PromiseKit/Sources/PMKCallVariadicBlock.m new file mode 100644 index 00000000..1453a7d2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/PMKCallVariadicBlock.m @@ -0,0 +1,120 @@ +#import "NSMethodSignatureForBlock.m" +#import +#import +#import "AnyPromise+Private.h" +#import +#import +#import + +#ifndef PMKLog +#define PMKLog NSLog +#endif + +@interface PMKArray : NSObject { +@public + id objs[3]; + NSUInteger count; +} @end + +@implementation PMKArray + +- (id)objectAtIndexedSubscript:(NSUInteger)idx { + if (count <= idx) { + // this check is necessary due to lack of checks in `pmk_safely_call_block` + return nil; + } + return objs[idx]; +} + +@end + +id __PMKArrayWithCount(NSUInteger count, ...) { + PMKArray *this = [PMKArray new]; + this->count = count; + va_list args; + va_start(args, count); + for (NSUInteger x = 0; x < count; ++x) + this->objs[x] = va_arg(args, id); + va_end(args); + return this; +} + + +static inline id _PMKCallVariadicBlock(id frock, id result) { + NSCAssert(frock, @""); + + NSMethodSignature *sig = NSMethodSignatureForBlock(frock); + const NSUInteger nargs = sig.numberOfArguments; + const char rtype = sig.methodReturnType[0]; + + #define call_block_with_rtype(type) ({^type{ \ + switch (nargs) { \ + case 1: \ + return ((type(^)(void))frock)(); \ + case 2: { \ + const id arg = [result class] == [PMKArray class] ? result[0] : result; \ + return ((type(^)(id))frock)(arg); \ + } \ + case 3: { \ + type (^block)(id, id) = frock; \ + return [result class] == [PMKArray class] \ + ? block(result[0], result[1]) \ + : block(result, nil); \ + } \ + case 4: { \ + type (^block)(id, id, id) = frock; \ + return [result class] == [PMKArray class] \ + ? block(result[0], result[1], result[2]) \ + : block(result, nil, nil); \ + } \ + default: \ + @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"PromiseKit: The provided block’s argument count is unsupported." userInfo:nil]; \ + }}();}) + + switch (rtype) { + case 'v': + call_block_with_rtype(void); + return nil; + case '@': + return call_block_with_rtype(id) ?: nil; + case '*': { + char *str = call_block_with_rtype(char *); + return str ? @(str) : nil; + } + case 'c': return @(call_block_with_rtype(char)); + case 'i': return @(call_block_with_rtype(int)); + case 's': return @(call_block_with_rtype(short)); + case 'l': return @(call_block_with_rtype(long)); + case 'q': return @(call_block_with_rtype(long long)); + case 'C': return @(call_block_with_rtype(unsigned char)); + case 'I': return @(call_block_with_rtype(unsigned int)); + case 'S': return @(call_block_with_rtype(unsigned short)); + case 'L': return @(call_block_with_rtype(unsigned long)); + case 'Q': return @(call_block_with_rtype(unsigned long long)); + case 'f': return @(call_block_with_rtype(float)); + case 'd': return @(call_block_with_rtype(double)); + case 'B': return @(call_block_with_rtype(_Bool)); + case '^': + if (strcmp(sig.methodReturnType, "^v") == 0) { + call_block_with_rtype(void); + return nil; + } + // else fall through! + default: + @throw [NSException exceptionWithName:@"PromiseKit" reason:@"PromiseKit: Unsupported method signature." userInfo:nil]; + } +} + +static id PMKCallVariadicBlock(id frock, id result) { + @try { + return _PMKCallVariadicBlock(frock, result); + } @catch (id thrown) { + if ([thrown isKindOfClass:[NSString class]]) + return thrown; + if ([thrown isKindOfClass:[NSError class]]) + return thrown; + + // we don’t catch objc exceptions: they are meant to crash your app + @throw thrown; + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Promise.swift b/Carthage/Checkouts/PromiseKit/Sources/Promise.swift new file mode 100644 index 00000000..ef573522 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Promise.swift @@ -0,0 +1,184 @@ +import class Foundation.Thread +import Dispatch + +/** + A `Promise` is a functional abstraction around a failable asynchronous operation. + - See: `Thenable` + */ +public final class Promise: Thenable, CatchMixin { + let box: Box> + + fileprivate init(box: SealedBox>) { + self.box = box + } + + /** + Initialize a new fulfilled promise. + + We do not provide `init(value:)` because Swift is “greedy” + and would pick that initializer in cases where it should pick + one of the other more specific options leading to Promises with + `T` that is eg: `Error` or worse `(T->Void,Error->Void)` for + uses of our PMK < 4 pending initializer due to Swift trailing + closure syntax (nothing good comes without pain!). + + Though often easy to detect, sometimes these issues would be + hidden by other type inference leading to some nasty bugs in + production. + + In PMK5 we tried to work around this by making the pending + initializer take the form `Promise(.pending)` but this led to + bad migration errors for PMK4 users. Hence instead we quickly + released PMK6 and now only provide this initializer for making + sealed & fulfilled promises. + + Usage is still (usually) good: + + guard foo else { + return .value(bar) + } + */ + public static func value(_ value: T) -> Promise { + return Promise(box: SealedBox(value: .fulfilled(value))) + } + + /// Initialize a new rejected promise. + public init(error: Error) { + box = SealedBox(value: .rejected(error)) + } + + /// Initialize a new promise bound to the provided `Thenable`. + public init(_ bridge: U) where U.T == T { + box = EmptyBox() + bridge.pipe(to: box.seal) + } + + /// Initialize a new promise that can be resolved with the provided `Resolver`. + public init(resolver body: (Resolver) throws -> Void) { + box = EmptyBox() + let resolver = Resolver(box) + do { + try body(resolver) + } catch { + resolver.reject(error) + } + } + + /// - Returns: a tuple of a new pending promise and its `Resolver`. + public class func pending() -> (promise: Promise, resolver: Resolver) { + return { ($0, Resolver($0.box)) }(Promise(.pending)) + } + + /// - See: `Thenable.pipe` + public func pipe(to: @escaping(Result) -> Void) { + switch box.inspect() { + case .pending: + box.inspect { + switch $0 { + case .pending(let handlers): + handlers.append(to) + case .resolved(let value): + to(value) + } + } + case .resolved(let value): + to(value) + } + } + + /// - See: `Thenable.result` + public var result: Result? { + switch box.inspect() { + case .pending: + return nil + case .resolved(let result): + return result + } + } + + init(_: PMKUnambiguousInitializer) { + box = EmptyBox() + } +} + +public extension Promise { + /** + Blocks this thread, so—you know—don’t call this on a serial thread that + any part of your chain may use. Like the main thread for example. + */ + func wait() throws -> T { + + if Thread.isMainThread { + conf.logHandler(LogEvent.waitOnMainThread) + } + + var result = self.result + + if result == nil { + let group = DispatchGroup() + group.enter() + pipe { result = $0; group.leave() } + group.wait() + } + + switch result! { + case .rejected(let error): + throw error + case .fulfilled(let value): + return value + } + } +} + +#if swift(>=3.1) +extension Promise where T == Void { + /// Initializes a new promise fulfilled with `Void` + public convenience init() { + self.init(box: SealedBox(value: .fulfilled(Void()))) + } + + /// Returns a new promise fulfilled with `Void` + public static var value: Promise { + return .value(Void()) + } +} +#endif + + +public extension DispatchQueue { + /** + Asynchronously executes the provided closure on a dispatch queue. + + DispatchQueue.global().async(.promise) { + try md5(input) + }.done { md5 in + //… + } + + - Parameter body: The closure that resolves this promise. + - Returns: A new `Promise` resolved by the result of the provided closure. + - Note: There is no Promise/Thenable version of this due to Swift compiler ambiguity issues. + */ + @available(macOS 10.10, iOS 8.0, tvOS 9.0, watchOS 2.0, *) + final func async(_: PMKNamespacer, group: DispatchGroup? = nil, qos: DispatchQoS = .default, flags: DispatchWorkItemFlags = [], execute body: @escaping () throws -> T) -> Promise { + let promise = Promise(.pending) + async(group: group, qos: qos, flags: flags) { + do { + promise.box.seal(.fulfilled(try body())) + } catch { + promise.box.seal(.rejected(error)) + } + } + return promise + } +} + + +/// used by our extensions to provide unambiguous functions with the same name as the original function +public enum PMKNamespacer { + case promise +} + +enum PMKUnambiguousInitializer { + case pending +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/PromiseKit.h b/Carthage/Checkouts/PromiseKit/Sources/PromiseKit.h new file mode 100644 index 00000000..c30d9376 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/PromiseKit.h @@ -0,0 +1,7 @@ +#import +#import + +#import // `FOUNDATION_EXPORT` + +FOUNDATION_EXPORT double PromiseKitVersionNumber; +FOUNDATION_EXPORT const unsigned char PromiseKitVersionString[]; diff --git a/Carthage/Checkouts/PromiseKit/Sources/Resolver.swift b/Carthage/Checkouts/PromiseKit/Sources/Resolver.swift new file mode 100644 index 00000000..c6b339fc --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Resolver.swift @@ -0,0 +1,111 @@ +/// An object for resolving promises +public final class Resolver { + let box: Box> + + init(_ box: Box>) { + self.box = box + } + + deinit { + if case .pending = box.inspect() { + conf.logHandler(.pendingPromiseDeallocated) + } + } +} + +public extension Resolver { + /// Fulfills the promise with the provided value + func fulfill(_ value: T) { + box.seal(.fulfilled(value)) + } + + /// Rejects the promise with the provided error + func reject(_ error: Error) { + box.seal(.rejected(error)) + } + + /// Resolves the promise with the provided result + func resolve(_ result: Result) { + box.seal(result) + } + + /// Resolves the promise with the provided value or error + func resolve(_ obj: T?, _ error: Error?) { + if let error = error { + reject(error) + } else if let obj = obj { + fulfill(obj) + } else { + reject(PMKError.invalidCallingConvention) + } + } + + /// Fulfills the promise with the provided value unless the provided error is non-nil + func resolve(_ obj: T, _ error: Error?) { + if let error = error { + reject(error) + } else { + fulfill(obj) + } + } + + /// Resolves the promise, provided for non-conventional value-error ordered completion handlers. + func resolve(_ error: Error?, _ obj: T?) { + resolve(obj, error) + } +} + +#if swift(>=3.1) +extension Resolver where T == Void { + /// Fulfills the promise unless error is non-nil + public func resolve(_ error: Error?) { + if let error = error { + reject(error) + } else { + fulfill(()) + } + } +#if false + // disabled ∵ https://github.com/mxcl/PromiseKit/issues/990 + + /// Fulfills the promise + public func fulfill() { + self.fulfill(()) + } +#else + /// Fulfills the promise + /// - Note: underscore is present due to: https://github.com/mxcl/PromiseKit/issues/990 + public func fulfill_() { + self.fulfill(()) + } +#endif +} +#endif + +#if swift(>=5.0) +extension Resolver { + /// Resolves the promise with the provided result + public func resolve(_ result: Swift.Result) { + switch result { + case .failure(let error): self.reject(error) + case .success(let value): self.fulfill(value) + } + } +} +#endif + +public enum Result { + case fulfilled(T) + case rejected(Error) +} + +public extension PromiseKit.Result { + var isFulfilled: Bool { + switch self { + case .fulfilled: + return true + case .rejected: + return false + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/Thenable.swift b/Carthage/Checkouts/PromiseKit/Sources/Thenable.swift new file mode 100644 index 00000000..7d88ea6e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/Thenable.swift @@ -0,0 +1,533 @@ +import Dispatch + +/// Thenable represents an asynchronous operation that can be chained. +public protocol Thenable: AnyObject { + /// The type of the wrapped value + associatedtype T + + /// `pipe` is immediately executed when this `Thenable` is resolved + func pipe(to: @escaping(Result) -> Void) + + /// The resolved result or nil if pending. + var result: Result? { get } +} + +public extension Thenable { + /** + The provided closure executes when this promise is fulfilled. + + This allows chaining promises. The promise returned by the provided closure is resolved before the promise returned by this closure resolves. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that executes when this promise is fulfilled. It must return a promise. + - Returns: A new promise that resolves when the promise returned from the provided closure resolves. For example: + + firstly { + URLSession.shared.dataTask(.promise, with: url1) + }.then { response in + transform(data: response.data) + }.done { transformation in + //… + } + */ + func then(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(T) throws -> U) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + do { + let rv = try body(value) + guard rv !== rp else { throw PMKError.returnedSelf } + rv.pipe(to: rp.box.seal) + } catch { + rp.box.seal(.rejected(error)) + } + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + + /** + The provided closure is executed when this promise is fulfilled. + + This is like `then` but it requires the closure to return a non-promise. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter transform: The closure that is executed when this Promise is fulfilled. It must return a non-promise. + - Returns: A new promise that is fulfilled with the value returned from the provided closure or rejected if the provided closure throws. For example: + + firstly { + URLSession.shared.dataTask(.promise, with: url1) + }.map { response in + response.data.length + }.done { length in + //… + } + */ + func map(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + do { + rp.box.seal(.fulfilled(try transform(value))) + } catch { + rp.box.seal(.rejected(error)) + } + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + + #if swift(>=4) && !swift(>=5.2) + /** + Similar to func `map(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U) -> Promise`, but accepts a key path instead of a closure. + + - Parameter on: The queue to which the provided key path for value dispatches. + - Parameter keyPath: The key path to the value that is using when this Promise is fulfilled. + - Returns: A new promise that is fulfilled with the value for the provided key path. + */ + func map(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + rp.box.seal(.fulfilled(value[keyPath: keyPath])) + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + #endif + + /** + The provided closure is executed when this promise is fulfilled. + + In your closure return an `Optional`, if you return `nil` the resulting promise is rejected with `PMKError.compactMap`, otherwise the promise is fulfilled with the unwrapped value. + + firstly { + URLSession.shared.dataTask(.promise, with: url) + }.compactMap { + try JSONSerialization.jsonObject(with: $0.data) as? [String: String] + }.done { dictionary in + //… + }.catch { + // either `PMKError.compactMap` or a `JSONError` + } + */ + func compactMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U?) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + do { + if let rv = try transform(value) { + rp.box.seal(.fulfilled(rv)) + } else { + throw PMKError.compactMap(value, U.self) + } + } catch { + rp.box.seal(.rejected(error)) + } + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + + #if swift(>=4) && !swift(>=5.2) + /** + Similar to func `compactMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T) throws -> U?) -> Promise`, but accepts a key path instead of a closure. + + - Parameter on: The queue to which the provided key path for value dispatches. + - Parameter keyPath: The key path to the value that is using when this Promise is fulfilled. If the value for `keyPath` is `nil` the resulting promise is rejected with `PMKError.compactMap`. + - Returns: A new promise that is fulfilled with the value for the provided key path. + */ + func compactMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + do { + if let rv = value[keyPath: keyPath] { + rp.box.seal(.fulfilled(rv)) + } else { + throw PMKError.compactMap(value, U.self) + } + } catch { + rp.box.seal(.rejected(error)) + } + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + #endif + + /** + The provided closure is executed when this promise is fulfilled. + + Equivalent to `map { x -> Void in`, but since we force the `Void` return Swift + is happier and gives you less hassle about your closure’s qualification. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that is executed when this Promise is fulfilled. + - Returns: A new promise fulfilled as `Void` or rejected if the provided closure throws. + + firstly { + URLSession.shared.dataTask(.promise, with: url) + }.done { response in + print(response.data) + } + */ + func done(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(T) throws -> Void) -> Promise { + let rp = Promise(.pending) + pipe { + switch $0 { + case .fulfilled(let value): + on.async(flags: flags) { + do { + try body(value) + rp.box.seal(.fulfilled(())) + } catch { + rp.box.seal(.rejected(error)) + } + } + case .rejected(let error): + rp.box.seal(.rejected(error)) + } + } + return rp + } + + /** + The provided closure is executed when this promise is fulfilled. + + This is like `done` but it returns the same value that the handler is fed. + `get` immutably accesses the fulfilled value; the returned Promise maintains that value. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that is executed when this Promise is fulfilled. + - Returns: A new promise that is fulfilled with the value that the handler is fed or rejected if the provided closure throws. For example: + + firstly { + .value(1) + }.get { foo in + print(foo, " is 1") + }.done { foo in + print(foo, " is 1") + }.done { foo in + print(foo, " is Void") + } + */ + func get(on: DispatchQueue? = conf.Q.return, flags: DispatchWorkItemFlags? = nil, _ body: @escaping (T) throws -> Void) -> Promise { + return map(on: on, flags: flags) { + try body($0) + return $0 + } + } + + /** + The provided closure is executed with promise result. + + This is like `get` but provides the Result of the Promise so you can inspect the value of the chain at this point without causing any side effects. + + - Parameter on: The queue to which the provided closure dispatches. + - Parameter body: The closure that is executed with Result of Promise. + - Returns: A new promise that is resolved with the result that the handler is fed. For example: + + promise.tap{ print($0) }.then{ /*…*/ } + */ + func tap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ body: @escaping(Result) -> Void) -> Promise { + return Promise { seal in + pipe { result in + on.async(flags: flags) { + body(result) + seal.resolve(result) + } + } + } + } + + /// - Returns: a new promise chained off this promise but with its value discarded. + func asVoid() -> Promise { + return map(on: nil) { _ in } + } +} + +public extension Thenable { + /** + - Returns: The error with which this promise was rejected; `nil` if this promise is not rejected. + */ + var error: Error? { + switch result { + case .none: + return nil + case .some(.fulfilled): + return nil + case .some(.rejected(let error)): + return error + } + } + + /** + - Returns: `true` if the promise has not yet resolved. + */ + var isPending: Bool { + return result == nil + } + + /** + - Returns: `true` if the promise has resolved. + */ + var isResolved: Bool { + return !isPending + } + + /** + - Returns: `true` if the promise was fulfilled. + */ + var isFulfilled: Bool { + return value != nil + } + + /** + - Returns: `true` if the promise was rejected. + */ + var isRejected: Bool { + return error != nil + } + + /** + - Returns: The value with which this promise was fulfilled or `nil` if this promise is pending or rejected. + */ + var value: T? { + switch result { + case .none: + return nil + case .some(.fulfilled(let value)): + return value + case .some(.rejected): + return nil + } + } +} + +public extension Thenable where T: Sequence { + /** + `Promise<[T]>` => `T` -> `U` => `Promise<[U]>` + + firstly { + .value([1,2,3]) + }.mapValues { integer in + integer * 2 + }.done { + // $0 => [2,4,6] + } + */ + func mapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U]> { + return map(on: on, flags: flags){ try $0.map(transform) } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Promise<[T]>` => `KeyPath` => `Promise<[U]>` + + firstly { + .value([Person(name: "Max"), Person(name: "Roman"), Person(name: "John")]) + }.mapValues(\.name).done { + // $0 => ["Max", "Roman", "John"] + } + */ + func mapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Promise<[U]> { + return map(on: on, flags: flags){ $0.map { $0[keyPath: keyPath] } } + } + #endif + + /** + `Promise<[T]>` => `T` -> `[U]` => `Promise<[U]>` + + firstly { + .value([1,2,3]) + }.flatMapValues { integer in + [integer, integer] + }.done { + // $0 => [1,1,2,2,3,3] + } + */ + func flatMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U.Iterator.Element]> { + return map(on: on, flags: flags){ (foo: T) in + try foo.flatMap{ try transform($0) } + } + } + + /** + `Promise<[T]>` => `T` -> `U?` => `Promise<[U]>` + + firstly { + .value(["1","2","a","3"]) + }.compactMapValues { + Int($0) + }.done { + // $0 => [1,2,3] + } + */ + func compactMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) throws -> U?) -> Promise<[U]> { + return map(on: on, flags: flags) { foo -> [U] in + #if !swift(>=3.3) || (swift(>=4) && !swift(>=4.1)) + return try foo.flatMap(transform) + #else + return try foo.compactMap(transform) + #endif + } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Promise<[T]>` => `KeyPath` => `Promise<[U]>` + + firstly { + .value([Person(name: "Max"), Person(name: "Roman", age: 26), Person(name: "John", age: 23)]) + }.compactMapValues(\.age).done { + // $0 => [26, 23] + } + */ + func compactMapValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Promise<[U]> { + return map(on: on, flags: flags) { foo -> [U] in + #if !swift(>=4.1) + return foo.flatMap { $0[keyPath: keyPath] } + #else + return foo.compactMap { $0[keyPath: keyPath] } + #endif + } + } + #endif + + /** + `Promise<[T]>` => `T` -> `Promise` => `Promise<[U]>` + + firstly { + .value([1,2,3]) + }.thenMap { integer in + .value(integer * 2) + }.done { + // $0 => [2,4,6] + } + */ + func thenMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U.T]> { + return then(on: on, flags: flags) { + when(fulfilled: try $0.map(transform)) + } + } + + /** + `Promise<[T]>` => `T` -> `Promise<[U]>` => `Promise<[U]>` + + firstly { + .value([1,2,3]) + }.thenFlatMap { integer in + .value([integer, integer]) + }.done { + // $0 => [1,1,2,2,3,3] + } + */ + func thenFlatMap(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ transform: @escaping(T.Iterator.Element) throws -> U) -> Promise<[U.T.Iterator.Element]> where U.T: Sequence { + return then(on: on, flags: flags) { + when(fulfilled: try $0.map(transform)) + }.map(on: nil) { + $0.flatMap{ $0 } + } + } + + /** + `Promise<[T]>` => `T` -> Bool => `Promise<[T]>` + + firstly { + .value([1,2,3]) + }.filterValues { + $0 > 1 + }.done { + // $0 => [2,3] + } + */ + func filterValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ isIncluded: @escaping (T.Iterator.Element) -> Bool) -> Promise<[T.Iterator.Element]> { + return map(on: on, flags: flags) { + $0.filter(isIncluded) + } + } + + #if swift(>=4) && !swift(>=5.2) + /** + `Promise<[T]>` => `KeyPath` => `Promise<[T]>` + + firstly { + .value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]) + }.filterValues(\.isStudent).done { + // $0 => [Person(name: "John", age: 23, isStudent: true)] + } + */ + func filterValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, _ keyPath: KeyPath) -> Promise<[T.Iterator.Element]> { + return map(on: on, flags: flags) { + $0.filter { $0[keyPath: keyPath] } + } + } + #endif +} + +public extension Thenable where T: Collection { + /// - Returns: a promise fulfilled with the first value of this `Collection` or, if empty, a promise rejected with PMKError.emptySequence. + var firstValue: Promise { + return map(on: nil) { aa in + if let a1 = aa.first { + return a1 + } else { + throw PMKError.emptySequence + } + } + } + + func firstValue(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil, where test: @escaping (T.Iterator.Element) -> Bool) -> Promise { + return map(on: on, flags: flags) { + for x in $0 where test(x) { + return x + } + throw PMKError.emptySequence + } + } + + /// - Returns: a promise fulfilled with the last value of this `Collection` or, if empty, a promise rejected with PMKError.emptySequence. + var lastValue: Promise { + return map(on: nil) { aa in + if aa.isEmpty { + throw PMKError.emptySequence + } else { + let i = aa.index(aa.endIndex, offsetBy: -1) + return aa[i] + } + } + } +} + +public extension Thenable where T: Sequence, T.Iterator.Element: Comparable { + /// - Returns: a promise fulfilled with the sorted values of this `Sequence`. + func sortedValues(on: DispatchQueue? = conf.Q.map, flags: DispatchWorkItemFlags? = nil) -> Promise<[T.Iterator.Element]> { + return map(on: on, flags: flags){ $0.sorted() } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/after.m b/Carthage/Checkouts/PromiseKit/Sources/after.m new file mode 100644 index 00000000..d98fb381 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/after.m @@ -0,0 +1,14 @@ +#import "AnyPromise.h" +@import Dispatch; +@import Foundation.NSDate; +@import Foundation.NSValue; + +/// @return A promise that fulfills after the specified duration. +AnyPromise *PMKAfter(NSTimeInterval duration) { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)); + dispatch_after(time, dispatch_get_global_queue(QOS_CLASS_UNSPECIFIED, 0), ^{ + resolve(@(duration)); + }); + }]; +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/after.swift b/Carthage/Checkouts/PromiseKit/Sources/after.swift new file mode 100644 index 00000000..cdaeccd9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/after.swift @@ -0,0 +1,46 @@ +import struct Foundation.TimeInterval +import Dispatch + +/** + after(seconds: 1.5).then { + //… + } + +- Returns: A guarantee that resolves after the specified duration. +*/ +public func after(seconds: TimeInterval) -> Guarantee { + let (rg, seal) = Guarantee.pending() + let when = DispatchTime.now() + seconds +#if swift(>=4.0) + q.asyncAfter(deadline: when) { seal(()) } +#else + q.asyncAfter(deadline: when, execute: seal) +#endif + return rg +} + +/** + after(.seconds(2)).then { + //… + } + + - Returns: A guarantee that resolves after the specified duration. +*/ +public func after(_ interval: DispatchTimeInterval) -> Guarantee { + let (rg, seal) = Guarantee.pending() + let when = DispatchTime.now() + interval +#if swift(>=4.0) + q.asyncAfter(deadline: when) { seal(()) } +#else + q.asyncAfter(deadline: when, execute: seal) +#endif + return rg +} + +private var q: DispatchQueue { + if #available(macOS 10.10, iOS 8.0, tvOS 9.0, watchOS 2.0, *) { + return DispatchQueue.global(qos: .default) + } else { + return DispatchQueue.global(priority: .default) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/dispatch_promise.m b/Carthage/Checkouts/PromiseKit/Sources/dispatch_promise.m new file mode 100644 index 00000000..f4f10e38 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/dispatch_promise.m @@ -0,0 +1,10 @@ +#import "AnyPromise.h" +@import Dispatch; + +AnyPromise *dispatch_promise_on(dispatch_queue_t queue, id block) { + return [AnyPromise promiseWithValue:nil].thenOn(queue, block); +} + +AnyPromise *dispatch_promise(id block) { + return dispatch_promise_on(dispatch_get_global_queue(QOS_CLASS_UNSPECIFIED, 0), block); +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/firstly.swift b/Carthage/Checkouts/PromiseKit/Sources/firstly.swift new file mode 100644 index 00000000..4bfc0385 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/firstly.swift @@ -0,0 +1,39 @@ +import Dispatch + +/** + Judicious use of `firstly` *may* make chains more readable. + + Compare: + + URLSession.shared.dataTask(url: url1).then { + URLSession.shared.dataTask(url: url2) + }.then { + URLSession.shared.dataTask(url: url3) + } + + With: + + firstly { + URLSession.shared.dataTask(url: url1) + }.then { + URLSession.shared.dataTask(url: url2) + }.then { + URLSession.shared.dataTask(url: url3) + } + + - Note: the block you pass executes immediately on the current thread/queue. + */ +public func firstly(execute body: () throws -> U) -> Promise { + do { + let rp = Promise(.pending) + try body().pipe(to: rp.box.seal) + return rp + } catch { + return Promise(error: error) + } +} + +/// - See: firstly() +public func firstly(execute body: () -> Guarantee) -> Guarantee { + return body() +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/fwd.h b/Carthage/Checkouts/PromiseKit/Sources/fwd.h new file mode 100644 index 00000000..8c049f76 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/fwd.h @@ -0,0 +1,171 @@ +#import +#import + +@class AnyPromise; +extern NSString * __nonnull const PMKErrorDomain; + +#define PMKFailingPromiseIndexKey @"PMKFailingPromiseIndexKey" +#define PMKJoinPromisesKey @"PMKJoinPromisesKey" + +#define PMKUnexpectedError 1l +#define PMKInvalidUsageError 3l +#define PMKAccessDeniedError 4l +#define PMKOperationFailed 8l +#define PMKTaskError 9l +#define PMKJoinError 10l +#define PMKNoWinnerError 11l + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + @return A new promise that resolves after the specified duration. + + @parameter duration The duration in seconds to wait before this promise is resolve. + + For example: + + PMKAfter(1).then(^{ + //… + }); +*/ +extern AnyPromise * __nonnull PMKAfter(NSTimeInterval duration) NS_REFINED_FOR_SWIFT; + + + +/** + `when` is a mechanism for waiting more than one asynchronous task and responding when they are all complete. + + `PMKWhen` accepts varied input. If an array is passed then when those promises fulfill, when’s promise fulfills with an array of fulfillment values. If a dictionary is passed then the same occurs, but when’s promise fulfills with a dictionary of fulfillments keyed as per the input. + + Interestingly, if a single promise is passed then when waits on that single promise, and if a single non-promise object is passed then when fulfills immediately with that object. If the array or dictionary that is passed contains objects that are not promises, then these objects are considered fulfilled promises. The reason we do this is to allow a pattern know as "abstracting away asynchronicity". + + If *any* of the provided promises reject, the returned promise is immediately rejected with that promise’s rejection. The error’s `userInfo` object is supplemented with `PMKFailingPromiseIndexKey`. + + For example: + + PMKWhen(@[promise1, promise2]).then(^(NSArray *results){ + //… + }); + + @warning *Important* In the event of rejection the other promises will continue to resolve and as per any other promise will either fulfill or reject. This is the right pattern for `getter` style asynchronous tasks, but often for `setter` tasks (eg. storing data on a server), you most likely will need to wait on all tasks and then act based on which have succeeded and which have failed. In such situations use `PMKJoin`. + + @param input The input upon which to wait before resolving this promise. + + @return A promise that is resolved with either: + + 1. An array of values from the provided array of promises. + 2. The value from the provided promise. + 3. The provided non-promise object. + + @see PMKJoin + +*/ +extern AnyPromise * __nonnull PMKWhen(id __nonnull input) NS_REFINED_FOR_SWIFT; + + + +/** + Creates a new promise that resolves only when all provided promises have resolved. + + Typically, you should use `PMKWhen`. + + For example: + + PMKJoin(@[promise1, promise2]).then(^(NSArray *resultingValues){ + //… + }).catch(^(NSError *error){ + assert(error.domain == PMKErrorDomain); + assert(error.code == PMKJoinError); + + NSArray *promises = error.userInfo[PMKJoinPromisesKey]; + for (AnyPromise *promise in promises) { + if (promise.rejected) { + //… + } + } + }); + + @param promises An array of promises. + + @return A promise that thens three parameters: + + 1) An array of mixed values and errors from the resolved input. + 2) An array of values from the promises that fulfilled. + 3) An array of errors from the promises that rejected or nil if all promises fulfilled. + + @see when +*/ +AnyPromise *__nonnull PMKJoin(NSArray * __nonnull promises) NS_REFINED_FOR_SWIFT; + + + +/** + Literally hangs this thread until the promise has resolved. + + Do not use hang… unless you are testing, playing or debugging. + + If you use it in production code I will literally and honestly cry like a child. + + @return The resolved value of the promise. + + @warning T SAFE. IT IS NOT SAFE. IT IS NOT SAFE. IT IS NOT SAFE. IT IS NO +*/ +extern id __nullable PMKHang(AnyPromise * __nonnull promise); + + + +/** + Executes the provided block on a background queue. + + dispatch_promise is a convenient way to start a promise chain where the + first step needs to run synchronously on a background queue. + + dispatch_promise(^{ + return md5(input); + }).then(^(NSString *md5){ + NSLog(@"md5: %@", md5); + }); + + @param block The block to be executed in the background. Returning an `NSError` will reject the promise, everything else (including void) fulfills the promise. + + @return A promise resolved with the return value of the provided block. + + @see dispatch_async +*/ +extern AnyPromise * __nonnull dispatch_promise(id __nonnull block) NS_SWIFT_UNAVAILABLE("Use our `DispatchQueue.async` override instead"); + + + +/** + Executes the provided block on the specified background queue. + + dispatch_promise_on(myDispatchQueue, ^{ + return md5(input); + }).then(^(NSString *md5){ + NSLog(@"md5: %@", md5); + }); + + @param block The block to be executed in the background. Returning an `NSError` will reject the promise, everything else (including void) fulfills the promise. + + @return A promise resolved with the return value of the provided block. + + @see dispatch_promise +*/ +extern AnyPromise * __nonnull dispatch_promise_on(dispatch_queue_t __nonnull queue, id __nonnull block) NS_SWIFT_UNAVAILABLE("Use our `DispatchQueue.async` override instead"); + +/** + Returns a new promise that resolves when the value of the first resolved promise in the provided array of promises. +*/ +extern AnyPromise * __nonnull PMKRace(NSArray * __nonnull promises) NS_REFINED_FOR_SWIFT; + +/** + Returns a new promise that resolves with the value of the first fulfilled promise in the provided array of promises. +*/ +extern AnyPromise * __nonnull PMKRaceFulfilled(NSArray * __nonnull promises) NS_REFINED_FOR_SWIFT; + +#ifdef __cplusplus +} // Extern C +#endif diff --git a/Carthage/Checkouts/PromiseKit/Sources/hang.m b/Carthage/Checkouts/PromiseKit/Sources/hang.m new file mode 100644 index 00000000..913339e5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/hang.m @@ -0,0 +1,29 @@ +#import "AnyPromise.h" +#import "AnyPromise+Private.h" +@import CoreFoundation.CFRunLoop; + +/** + Suspends the active thread waiting on the provided promise. + + @return The value of the provided promise once resolved. + */ +id PMKHang(AnyPromise *promise) { + if (promise.pending) { + static CFRunLoopSourceContext context; + + CFRunLoopRef runLoop = CFRunLoopGetCurrent(); + CFRunLoopSourceRef runLoopSource = CFRunLoopSourceCreate(NULL, 0, &context); + CFRunLoopAddSource(runLoop, runLoopSource, kCFRunLoopDefaultMode); + + promise.ensure(^{ + CFRunLoopStop(runLoop); + }); + while (promise.pending) { + CFRunLoopRun(); + } + CFRunLoopRemoveSource(runLoop, runLoopSource, kCFRunLoopDefaultMode); + CFRelease(runLoopSource); + } + + return promise.value; +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/hang.swift b/Carthage/Checkouts/PromiseKit/Sources/hang.swift new file mode 100644 index 00000000..1022dcad --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/hang.swift @@ -0,0 +1,55 @@ +import Foundation +import CoreFoundation + +/** + Runs the active run-loop until the provided promise resolves. + + This is for debug and is not a generally safe function to use in your applications. We mostly provide it for use in testing environments. + + Still if you like, study how it works (by reading the sources!) and use at your own risk. + + - Returns: The value of the resolved promise + - Throws: An error, should the promise be rejected + - See: `wait()` +*/ +public func hang(_ promise: Promise) throws -> T { +#if os(Linux) || os(Android) +#if swift(>=4) + let runLoopMode: CFRunLoopMode = kCFRunLoopDefaultMode +#else + // isMainThread is not yet implemented on Linux. + let runLoopModeRaw = RunLoopMode.defaultRunLoopMode.rawValue._bridgeToObjectiveC() + let runLoopMode: CFString = unsafeBitCast(runLoopModeRaw, to: CFString.self) +#endif +#else + guard Thread.isMainThread else { + // hang doesn't make sense on threads that aren't the main thread. + // use `.wait()` on those threads. + fatalError("Only call hang() on the main thread.") + } + let runLoopMode: CFRunLoopMode = CFRunLoopMode.defaultMode +#endif + + if promise.isPending { + var context = CFRunLoopSourceContext() + let runLoop = CFRunLoopGetCurrent() + let runLoopSource = CFRunLoopSourceCreate(nil, 0, &context) + CFRunLoopAddSource(runLoop, runLoopSource, runLoopMode) + + _ = promise.ensure { + CFRunLoopStop(runLoop) + } + + while promise.isPending { + CFRunLoopRun() + } + CFRunLoopRemoveSource(runLoop, runLoopSource, runLoopMode) + } + + switch promise.result! { + case .rejected(let error): + throw error + case .fulfilled(let value): + return value + } +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/join.m b/Carthage/Checkouts/PromiseKit/Sources/join.m new file mode 100644 index 00000000..979f092d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/join.m @@ -0,0 +1,54 @@ +@import Foundation.NSDictionary; +#import "AnyPromise+Private.h" +#import +@import Foundation.NSError; +@import Foundation.NSNull; +#import "PromiseKit.h" +#import + +/** + Waits on all provided promises. + + `PMKWhen` rejects as soon as one of the provided promises rejects. `PMKJoin` waits on all provided promises, then rejects if any of those promises rejects, otherwise it fulfills with values from the provided promises. + + - Returns: A new promise that resolves once all the provided promises resolve. +*/ +AnyPromise *PMKJoin(NSArray *promises) { + if (promises == nil) + return [AnyPromise promiseWithValue:[NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:@{NSLocalizedDescriptionKey: @"PMKJoin(nil)"}]]; + + if (promises.count == 0) + return [AnyPromise promiseWithValue:promises]; + + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + NSPointerArray *results = NSPointerArrayMake(promises.count); + __block atomic_int countdown = promises.count; + __block BOOL rejected = NO; + + [promises enumerateObjectsUsingBlock:^(AnyPromise *promise, NSUInteger ii, BOOL *stop) { + [promise __pipe:^(id value) { + + if (IsError(value)) { + rejected = YES; + } + + //FIXME surely this isn't thread safe on multiple cores? + [results replacePointerAtIndex:ii withPointer:(__bridge void *)(value ?: [NSNull null])]; + + atomic_fetch_sub_explicit(&countdown, 1, memory_order_relaxed); + + if (countdown == 0) { + if (!rejected) { + resolve(results.allObjects); + } else { + id userInfo = @{PMKJoinPromisesKey: promises}; + id err = [NSError errorWithDomain:PMKErrorDomain code:PMKJoinError userInfo:userInfo]; + resolve(err); + } + } + }]; + + (void) stop; + }]; + }]; +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/race.m b/Carthage/Checkouts/PromiseKit/Sources/race.m new file mode 100644 index 00000000..92afed63 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/race.m @@ -0,0 +1,48 @@ +#import "AnyPromise+Private.h" +#import + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +// ^^ OSAtomicDecrement32 is deprecated on watchOS + +AnyPromise *PMKRace(NSArray *promises) { + if (promises == nil || promises.count == 0) + return [AnyPromise promiseWithValue:[NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:@{NSLocalizedDescriptionKey: @"PMKRace(nil)"}]]; + + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + for (AnyPromise *promise in promises) { + [promise __pipe:resolve]; + } + }]; +} + +/** + Waits for one promise to fulfill + + @note If there are no fulfilled promises, the returned promise is rejected with `PMKNoWinnerError`. + @param promises The promises to fulfill. + @return The promise that was fulfilled first. +*/ +AnyPromise *PMKRaceFulfilled(NSArray *promises) { + if (promises == nil || promises.count == 0) + return [AnyPromise promiseWithValue:[NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:@{NSLocalizedDescriptionKey: @"PMKRaceFulfilled(nil)"}]]; + + __block int32_t countdown = (int32_t)[promises count]; + + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + for (__strong AnyPromise* promise in promises) { + [promise __pipe:^(id value) { + if (IsError(value)) { + if (OSAtomicDecrement32(&countdown) == 0) { + id err = [NSError errorWithDomain:PMKErrorDomain code:PMKNoWinnerError userInfo:@{NSLocalizedDescriptionKey: @"PMKRaceFulfilled(nil)"}]; + resolve(err); + } + } else { + resolve(value); + } + }]; + } + }]; +} + +#pragma GCC diagnostic pop diff --git a/Carthage/Checkouts/PromiseKit/Sources/race.swift b/Carthage/Checkouts/PromiseKit/Sources/race.swift new file mode 100644 index 00000000..76ae96d0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/race.swift @@ -0,0 +1,102 @@ +import Dispatch + +@inline(__always) +private func _race(_ thenables: [U]) -> Promise { + let rp = Promise(.pending) + for thenable in thenables { + thenable.pipe(to: rp.box.seal) + } + return rp +} + +/** + Waits for one promise to resolve + + race(promise1, promise2, promise3).then { winner in + //… + } + + - Returns: The promise that resolves first + - Warning: If the first resolution is a rejection, the returned promise is rejected +*/ +public func race(_ thenables: U...) -> Promise { + return _race(thenables) +} + +/** + Waits for one promise to resolve + + race(promise1, promise2, promise3).then { winner in + //… + } + + - Returns: The promise that resolves first + - Warning: If the first resolution is a rejection, the returned promise is rejected + - Remark: If the provided array is empty the returned promise is rejected with PMKError.badInput +*/ +public func race(_ thenables: [U]) -> Promise { + guard !thenables.isEmpty else { + return Promise(error: PMKError.badInput) + } + return _race(thenables) +} + +/** + Waits for one guarantee to resolve + + race(promise1, promise2, promise3).then { winner in + //… + } + + - Returns: The guarantee that resolves first +*/ +public func race(_ guarantees: Guarantee...) -> Guarantee { + let rg = Guarantee(.pending) + for guarantee in guarantees { + guarantee.pipe(to: rg.box.seal) + } + return rg +} + +/** + Waits for one promise to fulfill + + race(fulfilled: [promise1, promise2, promise3]).then { winner in + //… + } + + - Returns: The promise that was fulfilled first. + - Warning: Skips all rejected promises. + - Remark: If the provided array is empty, the returned promise is rejected with `PMKError.badInput`. If there are no fulfilled promises, the returned promise is rejected with `PMKError.noWinner`. +*/ +public func race(fulfilled thenables: [U]) -> Promise { + var countdown = thenables.count + guard countdown > 0 else { + return Promise(error: PMKError.badInput) + } + + let rp = Promise(.pending) + + let barrier = DispatchQueue(label: "org.promisekit.barrier.race", attributes: .concurrent) + + for promise in thenables { + promise.pipe { result in + barrier.sync(flags: .barrier) { + switch result { + case .rejected: + guard rp.isPending else { return } + countdown -= 1 + if countdown == 0 { + rp.box.seal(.rejected(PMKError.noWinner)) + } + case .fulfilled(let value): + guard rp.isPending else { return } + countdown = 0 + rp.box.seal(.fulfilled(value)) + } + } + } + } + + return rp +} diff --git a/Carthage/Checkouts/PromiseKit/Sources/when.m b/Carthage/Checkouts/PromiseKit/Sources/when.m new file mode 100644 index 00000000..43e5fedd --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/when.m @@ -0,0 +1,107 @@ +@import Foundation.NSDictionary; +#import "AnyPromise+Private.h" +@import Foundation.NSProgress; +#import +@import Foundation.NSError; +@import Foundation.NSNull; +#import "PromiseKit.h" + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +// ^^ OSAtomicDecrement32 is deprecated on watchOS + + +// NSProgress resources: +// * https://robots.thoughtbot.com/asynchronous-nsprogress +// * http://oleb.net/blog/2014/03/nsprogress/ +// NSProgress! Beware! +// * https://github.com/AFNetworking/AFNetworking/issues/2261 + +/** + Wait for all promises in a set to resolve. + + @note If *any* of the provided promises reject, the returned promise is immediately rejected with that error. + @warning In the event of rejection the other promises will continue to resolve and, as per any other promise, will either fulfill or reject. This is the right pattern for `getter` style asynchronous tasks, but often for `setter` tasks (eg. storing data on a server), you most likely will need to wait on all tasks and then act based on which have succeeded and which have failed, in such situations use `when(resolved:)`. + @param promises The promises upon which to wait before the returned promise resolves. + @note PMKWhen provides NSProgress. + @return A new promise that resolves when all the provided promises fulfill or one of the provided promises rejects. +*/ +AnyPromise *PMKWhen(id promises) { + if (promises == nil) + return [AnyPromise promiseWithValue:[NSError errorWithDomain:PMKErrorDomain code:PMKInvalidUsageError userInfo:@{NSLocalizedDescriptionKey: @"PMKWhen(nil)"}]]; + + if ([promises isKindOfClass:[NSArray class]] || [promises isKindOfClass:[NSDictionary class]]) { + if ([promises count] == 0) + return [AnyPromise promiseWithValue:promises]; + } else if ([promises isKindOfClass:[AnyPromise class]]) { + promises = @[promises]; + } else { + return [AnyPromise promiseWithValue:promises]; + } + +#ifndef PMKDisableProgress + NSProgress *progress = [NSProgress progressWithTotalUnitCount:(int64_t)[promises count]]; + progress.pausable = NO; + progress.cancellable = NO; +#else + struct PMKProgress { + int completedUnitCount; + int totalUnitCount; + double fractionCompleted; + }; + __block struct PMKProgress progress; +#endif + + __block int32_t countdown = (int32_t)[promises count]; + BOOL const isdict = [promises isKindOfClass:[NSDictionary class]]; + + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + NSInteger index = 0; + + for (__strong id key in promises) { + AnyPromise *promise = isdict ? promises[key] : key; + if (!isdict) key = @(index); + + if (![promise isKindOfClass:[AnyPromise class]]) + promise = [AnyPromise promiseWithValue:promise]; + + [promise __pipe:^(id value){ + if (progress.fractionCompleted >= 1) + return; + + if (IsError(value)) { + progress.completedUnitCount = progress.totalUnitCount; + + NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithDictionary:[(NSError *)value userInfo] ?: @{}]; + userInfo[PMKFailingPromiseIndexKey] = key; + [userInfo setObject:value forKey:NSUnderlyingErrorKey]; + id err = [[NSError alloc] initWithDomain:[value domain] code:[value code] userInfo:userInfo]; + resolve(err); + } + else if (OSAtomicDecrement32(&countdown) == 0) { + progress.completedUnitCount = progress.totalUnitCount; + + id results; + if (isdict) { + results = [NSMutableDictionary new]; + for (id key in promises) { + id promise = promises[key]; + results[key] = IsPromise(promise) ? ((AnyPromise *)promise).value : promise; + } + } else { + results = [NSMutableArray new]; + for (AnyPromise *promise in promises) { + id value = IsPromise(promise) ? (promise.value ?: [NSNull null]) : promise; + [results addObject:value]; + } + } + resolve(results); + } else { + progress.completedUnitCount++; + } + }]; + } + }]; +} + +#pragma GCC diagnostic pop diff --git a/Carthage/Checkouts/PromiseKit/Sources/when.swift b/Carthage/Checkouts/PromiseKit/Sources/when.swift new file mode 100644 index 00000000..44335b84 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Sources/when.swift @@ -0,0 +1,363 @@ +import Foundation +import Dispatch + +private func _when(_ thenables: [U]) -> Promise { + var countdown = thenables.count + guard countdown > 0 else { + return .value(Void()) + } + + let rp = Promise(.pending) + +#if PMKDisableProgress || os(Linux) + var progress: (completedUnitCount: Int, totalUnitCount: Int) = (0, 0) +#else + let progress = Progress(totalUnitCount: Int64(thenables.count)) + progress.isCancellable = false + progress.isPausable = false +#endif + + let barrier = DispatchQueue(label: "org.promisekit.barrier.when", attributes: .concurrent) + + for promise in thenables { + promise.pipe { result in + barrier.sync(flags: .barrier) { + switch result { + case .rejected(let error): + if rp.isPending { + progress.completedUnitCount = progress.totalUnitCount + rp.box.seal(.rejected(error)) + } + case .fulfilled: + guard rp.isPending else { return } + progress.completedUnitCount += 1 + countdown -= 1 + if countdown == 0 { + rp.box.seal(.fulfilled(())) + } + } + } + } + } + + return rp +} + +/** + Wait for all promises in a set to fulfill. + + For example: + + when(fulfilled: promise1, promise2).then { results in + //… + }.catch { error in + switch error { + case URLError.notConnectedToInternet: + //… + case CLError.denied: + //… + } + } + + - Note: If *any* of the provided promises reject, the returned promise is immediately rejected with that error. + - Warning: In the event of rejection the other promises will continue to resolve and, as per any other promise, will either fulfill or reject. This is the right pattern for `getter` style asynchronous tasks, but often for `setter` tasks (eg. storing data on a server), you most likely will need to wait on all tasks and then act based on which have succeeded and which have failed, in such situations use `when(resolved:)`. + - Parameter promises: The promises upon which to wait before the returned promise resolves. + - Returns: A new promise that resolves when all the provided promises fulfill or one of the provided promises rejects. + - Note: `when` provides `NSProgress`. + - SeeAlso: `when(resolved:)` +*/ +public func when(fulfilled thenables: [U]) -> Promise<[U.T]> { + return _when(thenables).map(on: nil) { thenables.map{ $0.value! } } +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled promises: U...) -> Promise where U.T == Void { + return _when(promises) +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled promises: [U]) -> Promise where U.T == Void { + return _when(promises) +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled pu: U, _ pv: V) -> Promise<(U.T, V.T)> { + return _when([pu.asVoid(), pv.asVoid()]).map(on: nil) { (pu.value!, pv.value!) } +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled pu: U, _ pv: V, _ pw: W) -> Promise<(U.T, V.T, W.T)> { + return _when([pu.asVoid(), pv.asVoid(), pw.asVoid()]).map(on: nil) { (pu.value!, pv.value!, pw.value!) } +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled pu: U, _ pv: V, _ pw: W, _ px: X) -> Promise<(U.T, V.T, W.T, X.T)> { + return _when([pu.asVoid(), pv.asVoid(), pw.asVoid(), px.asVoid()]).map(on: nil) { (pu.value!, pv.value!, pw.value!, px.value!) } +} + +/// Wait for all promises in a set to fulfill. +public func when(fulfilled pu: U, _ pv: V, _ pw: W, _ px: X, _ py: Y) -> Promise<(U.T, V.T, W.T, X.T, Y.T)> { + return _when([pu.asVoid(), pv.asVoid(), pw.asVoid(), px.asVoid(), py.asVoid()]).map(on: nil) { (pu.value!, pv.value!, pw.value!, px.value!, py.value!) } +} + +/** + Generate promises at a limited rate and wait for all to fulfill. + + For example: + + func downloadFile(url: URL) -> Promise { + // ... + } + + let urls: [URL] = /*…*/ + let urlGenerator = urls.makeIterator() + + let generator = AnyIterator> { + guard url = urlGenerator.next() else { + return nil + } + return downloadFile(url) + } + + when(generator, concurrently: 3).done { datas in + // ... + } + + No more than three downloads will occur simultaneously. + + - Note: The generator is called *serially* on a *background* queue. + - Warning: Refer to the warnings on `when(fulfilled:)` + - Parameter promiseGenerator: Generator of promises. + - Returns: A new promise that resolves when all the provided promises fulfill or one of the provided promises rejects. + - SeeAlso: `when(resolved:)` + */ + +public func when(fulfilled promiseIterator: It, concurrently: Int) -> Promise<[It.Element.T]> where It.Element: Thenable { + + guard concurrently > 0 else { + return Promise(error: PMKError.badInput) + } + + var generator = promiseIterator + let root = Promise<[It.Element.T]>.pending() + var pendingPromises = 0 + var promises: [It.Element] = [] + + let barrier = DispatchQueue(label: "org.promisekit.barrier.when", attributes: [.concurrent]) + + func dequeue() { + guard root.promise.isPending else { return } // don’t continue dequeueing if root has been rejected + + var shouldDequeue = false + barrier.sync { + shouldDequeue = pendingPromises < concurrently + } + guard shouldDequeue else { return } + + var promise: It.Element! + + barrier.sync(flags: .barrier) { + guard let next = generator.next() else { return } + promise = next + pendingPromises += 1 + promises.append(next) + } + + func testDone() { + barrier.sync { + if pendingPromises == 0 { + #if !swift(>=3.3) || (swift(>=4) && !swift(>=4.1)) + root.resolver.fulfill(promises.flatMap{ $0.value }) + #else + root.resolver.fulfill(promises.compactMap{ $0.value }) + #endif + } + } + } + + guard promise != nil else { + return testDone() + } + + promise.pipe { resolution in + barrier.sync(flags: .barrier) { + pendingPromises -= 1 + } + + switch resolution { + case .fulfilled: + dequeue() + testDone() + case .rejected(let error): + root.resolver.reject(error) + } + } + + dequeue() + } + + dequeue() + + return root.promise +} + +/** + Waits on all provided promises. + + `when(fulfilled:)` rejects as soon as one of the provided promises rejects. `when(resolved:)` waits on all provided promises whatever their result, and then provides an array of `Result` so you can individually inspect the results. As a consequence this function returns a `Guarantee`, ie. errors are lifted from the individual promises into the results array of the returned `Guarantee`. + + when(resolved: promise1, promise2, promise3).then { results in + for result in results where case .fulfilled(let value) { + //… + } + }.catch { error in + // invalid! Never rejects + } + + - Returns: A new promise that resolves once all the provided promises resolve. The array is ordered the same as the input, ie. the result order is *not* resolution order. + - Note: we do not provide tuple variants for `when(resolved:)` but will accept a pull-request + - Remark: Doesn't take Thenable due to protocol `associatedtype` paradox +*/ +public func when(resolved promises: Promise...) -> Guarantee<[Result]> { + return when(resolved: promises) +} + +/// - See: `when(resolved: Promise...)` +public func when(resolved promises: [Promise]) -> Guarantee<[Result]> { + guard !promises.isEmpty else { + return .value([]) + } + + var countdown = promises.count + let barrier = DispatchQueue(label: "org.promisekit.barrier.join", attributes: .concurrent) + + let rg = Guarantee<[Result]>(.pending) + for promise in promises { + promise.pipe { result in + barrier.sync(flags: .barrier) { + countdown -= 1 + } + barrier.sync { + if countdown == 0 { + rg.box.seal(promises.map{ $0.result! }) + } + } + } + } + return rg +} + +/** +Generate promises at a limited rate and wait for all to resolve. + +For example: + + func downloadFile(url: URL) -> Promise { + // ... + } + + let urls: [URL] = /*…*/ + let urlGenerator = urls.makeIterator() + + let generator = AnyIterator> { + guard url = urlGenerator.next() else { + return nil + } + return downloadFile(url) + } + + when(resolved: generator, concurrently: 3).done { results in + // ... + } + +No more than three downloads will occur simultaneously. Downloads will continue if one of them fails + +- Note: The generator is called *serially* on a *background* queue. +- Warning: Refer to the warnings on `when(resolved:)` +- Parameter promiseGenerator: Generator of promises. +- Returns: A new promise that resolves once all the provided promises resolve. The array is ordered the same as the input, ie. the result order is *not* resolution order. +- SeeAlso: `when(resolved:)` +*/ +#if swift(>=5.3) +public func when(resolved promiseIterator: It, concurrently: Int) + -> Guarantee<[Result]> where It.Element: Thenable { + guard concurrently > 0 else { + return Guarantee.value([Result.rejected(PMKError.badInput)]) + } + + var generator = promiseIterator + let root = Guarantee<[Result]>.pending() + var pendingPromises = 0 + var promises: [It.Element] = [] + + let barrier = DispatchQueue(label: "org.promisekit.barrier.when", attributes: [.concurrent]) + + func dequeue() { + guard root.guarantee.isPending else { + return + } // don’t continue dequeueing if root has been rejected + + var shouldDequeue = false + barrier.sync { + shouldDequeue = pendingPromises < concurrently + } + guard shouldDequeue else { + return + } + + var promise: It.Element! + + barrier.sync(flags: .barrier) { + guard let next = generator.next() else { + return + } + + promise = next + + pendingPromises += 1 + promises.append(next) + } + + func testDone() { + barrier.sync { + if pendingPromises == 0 { + #if !swift(>=3.3) || (swift(>=4) && !swift(>=4.1)) + root.resolve(promises.flatMap { $0.result }) + #else + root.resolve(promises.compactMap { $0.result }) + #endif + } + } + } + + guard promise != nil else { + return testDone() + } + + promise.pipe { _ in + barrier.sync(flags: .barrier) { + pendingPromises -= 1 + } + + dequeue() + testDone() + } + + dequeue() + } + + dequeue() + + return root.guarantee +} +#endif + +/// Waits on all provided Guarantees. +public func when(_ guarantees: Guarantee...) -> Guarantee { + return when(guarantees: guarantees) +} + +// Waits on all provided Guarantees. +public func when(guarantees: [Guarantee]) -> Guarantee { + return when(fulfilled: guarantees).recover{ _ in }.asVoid() +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/0.0.0.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/0.0.0.swift new file mode 100644 index 00000000..5962caa0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/0.0.0.swift @@ -0,0 +1,185 @@ +import PromiseKit +import Dispatch +import XCTest + +enum Error: Swift.Error { + case dummy // we reject with this when we don't intend to test against it + case sentinel(UInt32) +} + +private let timeout: TimeInterval = 10 + +extension XCTestCase { + func describe(_ description: String, file: StaticString = #file, line: UInt = #line, body: () throws -> Void) { + + PromiseKit.conf.Q.map = .main + + do { + try body() + } catch { + XCTFail(description, file: file, line: line) + } + } + + func specify(_ description: String, file: StaticString = #file, line: UInt = #line, body: ((promise: Promise, fulfill: () -> Void, reject: (Error) -> Void), XCTestExpectation) throws -> Void) { + let expectation = self.expectation(description: description) + let (pending, seal) = Promise.pending() + + do { + try body((pending, seal.fulfill_, seal.reject), expectation) + waitForExpectations(timeout: timeout) { err in + if let _ = err { + XCTFail("wait failed: \(description)", file: file, line: line) + } + } + } catch { + XCTFail(description, file: file, line: line) + } + } + + func testFulfilled(file: StaticString = #file, line: UInt = #line, body: @escaping (Promise, XCTestExpectation, UInt32) -> Void) { + testFulfilled(withExpectationCount: 1, file: file, line: line) { + body($0, $1.first!, $2) + } + } + + func testRejected(file: StaticString = #file, line: UInt = #line, body: @escaping (Promise, XCTestExpectation, UInt32) -> Void) { + testRejected(withExpectationCount: 1, file: file, line: line) { + body($0, $1.first!, $2) + } + } + + func testFulfilled(withExpectationCount: Int, file: StaticString = #file, line: UInt = #line, body: @escaping (Promise, [XCTestExpectation], UInt32) -> Void) { + + let specify = mkspecify(withExpectationCount, file: file, line: line, body: body) + + specify("already-fulfilled") { value in + return (.value(value), {}) + } + specify("immediately-fulfilled") { value in + let (promise, seal) = Promise.pending() + return (promise, { + seal.fulfill(value) + }) + } + specify("eventually-fulfilled") { value in + let (promise, seal) = Promise.pending() + return (promise, { + after(ticks: 5) { + seal.fulfill(value) + } + }) + } + } + + func testRejected(withExpectationCount: Int, file: StaticString = #file, line: UInt = #line, body: @escaping (Promise, [XCTestExpectation], UInt32) -> Void) { + + let specify = mkspecify(withExpectationCount, file: file, line: line, body: body) + + specify("already-rejected") { sentinel in + return (Promise(error: Error.sentinel(sentinel)), {}) + } + specify("immediately-rejected") { sentinel in + let (promise, seal) = Promise.pending() + return (promise, { + seal.reject(Error.sentinel(sentinel)) + }) + } + specify("eventually-rejected") { sentinel in + let (promise, seal) = Promise.pending() + return (promise, { + after(ticks: 50) { + seal.reject(Error.sentinel(sentinel)) + } + }) + } + } + + +///////////////////////////////////////////////////////////////////////// + + private func mkspecify(_ numberOfExpectations: Int, file: StaticString, line: UInt, body: @escaping (Promise, [XCTestExpectation], UInt32) -> Void) -> (String, _ feed: (UInt32) -> (Promise, () -> Void)) -> Void { + return { desc, feed in + let value = arc4random() + let (promise, executeAfter) = feed(value) + let expectations = (1...numberOfExpectations).map { + self.expectation(description: "\(desc) (\($0))") + } + body(promise, expectations, value) + + executeAfter() + + self.waitForExpectations(timeout: timeout) { err in + if let _ = err { + XCTFail("timed out: \(desc)", file: file, line: line) + } + } + } + } + + func mkex() -> XCTestExpectation { + return expectation(description: "") + } +} + +func after(ticks: Int, execute body: @escaping () -> Void) { + precondition(ticks > 0) + + var ticks = ticks + func f() { + DispatchQueue.main.async { + ticks -= 1 + if ticks == 0 { + body() + } else { + f() + } + } + } + f() +} + +extension Promise { + func test(onFulfilled: @escaping () -> Void, onRejected: @escaping () -> Void) { + tap { result in + switch result { + case .fulfilled: + onFulfilled() + case .rejected: + onRejected() + } + }.silenceWarning() + } +} + +prefix func ++(a: inout Int) -> Int { + a += 1 + return a +} + +extension Promise { + func silenceWarning() {} +} + +#if os(Linux) +import func Glibc.random + +func arc4random() -> UInt32 { + return UInt32(random()) +} + +extension XCTestExpectation { + func fulfill() { + fulfill(#file, line: #line) + } +} + +extension XCTestCase { + func wait(for: [XCTestExpectation], timeout: TimeInterval, file: StaticString = #file, line: UInt = #line) { + #if !(swift(>=4.0) && !swift(>=4.1)) + let line = Int(line) + #endif + waitForExpectations(timeout: timeout, file: file, line: line) + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.2.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.2.swift new file mode 100644 index 00000000..c895c2f9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.2.swift @@ -0,0 +1,26 @@ +import PromiseKit +import XCTest + +class Test212: XCTestCase { + func test() { + describe("2.1.2.1: When fulfilled, a promise: must not transition to any other state.") { + testFulfilled { promise, expectation, _ in + promise.test(onFulfilled: expectation.fulfill, onRejected: { XCTFail() }) + } + + specify("trying to fulfill then immediately reject") { d, expectation in + d.promise.test(onFulfilled: expectation.fulfill, onRejected: { XCTFail() }) + d.fulfill() + d.reject(Error.dummy) + } + + specify("trying to fulfill then reject, delayed") { d, expectation in + d.promise.test(onFulfilled: expectation.fulfill, onRejected: { XCTFail() }) + after(ticks: 1) { + d.fulfill() + d.reject(Error.dummy) + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.3.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.3.swift new file mode 100644 index 00000000..d24ae683 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.1.3.swift @@ -0,0 +1,34 @@ +import PromiseKit +import XCTest + +class Test213: XCTestCase { + func test() { + describe("2.1.3.1: When rejected, a promise: must not transition to any other state.") { + testRejected { promise, expectation, _ in + promise.test(onFulfilled: { XCTFail() }, onRejected: expectation.fulfill) + } + + specify("trying to reject then immediately fulfill") { d, expectation in + d.promise.test(onFulfilled: { XCTFail() }, onRejected: expectation.fulfill) + d.reject(Error.dummy) + d.fulfill() + } + + specify("trying to reject then fulfill, delayed") { d, expectation in + d.promise.test(onFulfilled: { XCTFail() }, onRejected: expectation.fulfill) + after(ticks: 1) { + d.reject(Error.dummy) + d.fulfill() + } + } + + specify("trying to reject immediately then fulfill delayed") { d, expectation in + d.promise.test(onFulfilled: { XCTFail() }, onRejected: expectation.fulfill) + d.reject(Error.dummy) + after(ticks: 1) { + d.fulfill() + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.2.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.2.swift new file mode 100644 index 00000000..f1ba8991 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.2.swift @@ -0,0 +1,92 @@ +import PromiseKit +import XCTest + +class Test222: XCTestCase { + func test() { + describe("2.2.2: If `onFulfilled` is a function,") { + describe("2.2.2.1: it must be called after `promise` is fulfilled, with `promise`’s fulfillment value as its first argument.") { + testFulfilled { promise, expectation, sentinel in + promise.done { + XCTAssertEqual(sentinel, $0) + expectation.fulfill() + }.silenceWarning() + } + } + + describe("2.2.2.2: it must not be called before `promise` is fulfilled") { + specify("fulfilled after a delay") { d, expectation in + var called = false + d.promise.done { + called = true + expectation.fulfill() + }.silenceWarning() + after(ticks: 5) { + XCTAssertFalse(called) + d.fulfill() + } + } + specify("never fulfilled") { d, expectation in + d.promise.done{ XCTFail() }.silenceWarning() + after(ticks: 1000, execute: expectation.fulfill) + } + } + + describe("2.2.2.3: it must not be called more than once.") { + specify("already-fulfilled") { _, expectation in + let ex = (expectation, mkex()) + Promise().done { + ex.0.fulfill() + }.silenceWarning() + after(ticks: 1000) { + ex.1.fulfill() + } + } + specify("trying to fulfill a pending promise more than once, immediately") { d, expectation in + d.promise.done(expectation.fulfill).silenceWarning() + d.fulfill() + d.fulfill() + } + specify("trying to fulfill a pending promise more than once, delayed") { d, expectation in + d.promise.done(expectation.fulfill).silenceWarning() + after(ticks: 5) { + d.fulfill() + d.fulfill() + } + } + specify("trying to fulfill a pending promise more than once, immediately then delayed") { d, expectation in + let ex = (expectation, mkex()) + d.promise.done(ex.0.fulfill).silenceWarning() + d.fulfill() + after(ticks: 5) { + d.fulfill() + } + after(ticks: 10, execute: ex.1.fulfill) + } + specify("when multiple `then` calls are made, spaced apart in time") { d, expectation in + let ex = (expectation, self.expectation(description: ""), self.expectation(description: ""), self.expectation(description: "")) + + do { + d.promise.done(ex.0.fulfill).silenceWarning() + } + after(ticks: 5) { + d.promise.done(ex.1.fulfill).silenceWarning() + } + after(ticks: 10) { + d.promise.done(ex.2.fulfill).silenceWarning() + } + after(ticks: 15) { + d.fulfill() + ex.3.fulfill() + } + } + specify("when `then` is interleaved with fulfillment") { d, expectation in + let ex = (expectation, self.expectation(description: ""), self) + + d.promise.done(ex.0.fulfill).silenceWarning() + d.fulfill() + d.promise.done(ex.1.fulfill).silenceWarning() + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.3.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.3.swift new file mode 100644 index 00000000..996d6a22 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.3.swift @@ -0,0 +1,93 @@ +import PromiseKit +import XCTest + +class Test223: XCTestCase { + func test() { + describe("2.2.3: If `onRejected` is a function,") { + describe("2.2.3.1: it must be called after `promise` is rejected, with `promise`’s rejection reason as its first argument.") { + testRejected { promise, expectation, sentinel in + promise.catch { error in + if case Error.sentinel(let value) = error { + XCTAssertEqual(value, sentinel) + } else { + XCTFail() + } + expectation.fulfill() + } + } + } + describe("2.2.3.2: it must not be called before `promise` is rejected") { + specify("rejected after a delay") { d, expectation in + var called = false + d.promise.catch { _ in + called = true + expectation.fulfill() + } + after(ticks: 1) { + XCTAssertFalse(called) + d.reject(Error.dummy) + } + } + specify("never rejected") { d, expectation in + d.promise.catch { _ in XCTFail() } + after(ticks: 1, execute: expectation.fulfill) + } + } + describe("2.2.3.3: it must not be called more than once.") { + specify("already-rejected") { d, expectation in + var timesCalled = 0 + Promise(error: Error.dummy).catch { _ in + XCTAssertEqual(++timesCalled, 1) + } + after(ticks: 2) { + XCTAssertEqual(timesCalled, 1) + expectation.fulfill() + } + } + specify("trying to reject a pending promise more than once, immediately") { d, expectation in + d.promise.catch{_ in expectation.fulfill() } + d.reject(Error.dummy) + d.reject(Error.dummy) + } + specify("trying to reject a pending promise more than once, delayed") { d, expectation in + d.promise.catch{_ in expectation.fulfill() } + after(ticks: 1) { + d.reject(Error.dummy) + d.reject(Error.dummy) + } + } + specify("trying to reject a pending promise more than once, immediately then delayed") { d, expectation in + d.promise.catch{_ in expectation.fulfill() } + d.reject(Error.dummy) + after(ticks: 1) { + d.reject(Error.dummy) + } + } + specify("when multiple `then` calls are made, spaced apart in time") { d, expectation in + let mk = { self.expectation(description: "") } + let ex = (expectation, mk(), mk(), mk()) + + do { + d.promise.catch{ _ in ex.0.fulfill() } + } + after(ticks: 1) { + d.promise.catch{ _ in ex.1.fulfill() } + } + after(ticks: 2) { + d.promise.catch{ _ in ex.2.fulfill() } + } + after(ticks: 3) { + d.reject(Error.dummy) + ex.3.fulfill() + } + } + specify("when `then` is interleaved with rejection") { d, expectation in + let ex = (expectation, self.expectation(description: "")) + d.promise.catch{ _ in ex.0.fulfill() } + d.reject(Error.dummy) + d.promise.catch{ _ in ex.1.fulfill() } + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.4.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.4.swift new file mode 100644 index 00000000..0472b13f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.4.swift @@ -0,0 +1,146 @@ +import PromiseKit +import XCTest + +class Test224: XCTestCase { + func test() { + describe("2.2.4: `onFulfilled` or `onRejected` must not be called until the execution context stack contains only platform code.") { + + describe("`then` returns before the promise becomes fulfilled or rejected") { + testFulfilled { promise, expectation, dummy in + var thenHasReturned = false + promise.done { _ in + XCTAssert(thenHasReturned) + expectation.fulfill() + }.silenceWarning() + thenHasReturned = true + } + testRejected { promise, expectation, memo in + var catchHasReturned = false + promise.catch { _->() in + XCTAssert(catchHasReturned) + expectation.fulfill() + } + catchHasReturned = true + } + + } + + describe("Clean-stack execution ordering tests (fulfillment case)") { + specify("when `onFulfilled` is added immediately before the promise is fulfilled") { d, expectation in + var onFulfilledCalled = false + d.promise.done { + onFulfilledCalled = true + expectation.fulfill() + }.silenceWarning() + d.fulfill() + XCTAssertFalse(onFulfilledCalled) + } + specify("when `onFulfilled` is added immediately after the promise is fulfilled") { d, expectation in + var onFulfilledCalled = false + d.fulfill() + d.promise.done { + onFulfilledCalled = true + expectation.fulfill() + }.silenceWarning() + XCTAssertFalse(onFulfilledCalled) + } + specify("when one `onFulfilled` is added inside another `onFulfilled`") { _, expectation in + var firstOnFulfilledFinished = false + let promise = Promise() + promise.done { + promise.done { + XCTAssertTrue(firstOnFulfilledFinished) + expectation.fulfill() + }.silenceWarning() + firstOnFulfilledFinished = true + }.silenceWarning() + } + + specify("when `onFulfilled` is added inside an `onRejected`") { _, expectation in + let promise1 = Promise(error: Error.dummy) + let promise2 = Promise() + var firstOnRejectedFinished = false + + promise1.catch { _ in + promise2.done { + XCTAssertTrue(firstOnRejectedFinished) + expectation.fulfill() + }.silenceWarning() + firstOnRejectedFinished = true + } + } + + specify("when the promise is fulfilled asynchronously") { d, expectation in + var firstStackFinished = false + + after(ticks: 1) { + d.fulfill() + firstStackFinished = true + } + + d.promise.done { + XCTAssertTrue(firstStackFinished) + expectation.fulfill() + }.silenceWarning() + } + } + + describe("Clean-stack execution ordering tests (rejection case)") { + specify("when `onRejected` is added immediately before the promise is rejected") { d, expectation in + var onRejectedCalled = false + d.promise.catch { _ in + onRejectedCalled = true + expectation.fulfill() + } + d.reject(Error.dummy) + XCTAssertFalse(onRejectedCalled) + } + specify("when `onRejected` is added immediately after the promise is rejected") { d, expectation in + var onRejectedCalled = false + d.reject(Error.dummy) + d.promise.catch { _ in + onRejectedCalled = true + expectation.fulfill() + } + XCTAssertFalse(onRejectedCalled) + } + specify("when `onRejected` is added inside an `onFulfilled`") { d, expectation in + let promise1 = Promise() + let promise2 = Promise(error: Error.dummy) + var firstOnFulfilledFinished = false + + promise1.done { _ in + promise2.catch { _ in + XCTAssertTrue(firstOnFulfilledFinished) + expectation.fulfill() + } + firstOnFulfilledFinished = true + }.silenceWarning() + } + specify("when one `onRejected` is added inside another `onRejected`") { d, expectation in + let promise = Promise(error: Error.dummy) + var firstOnRejectedFinished = false; + + promise.catch { _ in + promise.catch { _ in + XCTAssertTrue(firstOnRejectedFinished) + expectation.fulfill() + } + firstOnRejectedFinished = true + } + } + specify("when the promise is rejected asynchronously") { d, expectation in + var firstStackFinished = false + after(ticks: 1) { + d.reject(Error.dummy) + firstStackFinished = true + } + d.promise.catch { _ in + XCTAssertTrue(firstStackFinished) + expectation.fulfill() + } + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.6.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.6.swift new file mode 100644 index 00000000..95cfe7b2 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.6.swift @@ -0,0 +1,275 @@ +import PromiseKit +import XCTest + +class Test226: XCTestCase { + func test() { + describe("2.2.6: `then` may be called multiple times on the same promise.") { + describe("2.2.6.1: If/when `promise` is fulfilled, all respective `onFulfilled` callbacks must execute in the order of their originating calls to `then`.") { + describe("multiple boring fulfillment handlers") { + testFulfilled(withExpectationCount: 4) { promise, exes, sentinel -> Void in + var orderValidator = 0 + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 1) + exes[0].fulfill() + }.silenceWarning() + promise.catch { _ in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 2) + exes[1].fulfill() + }.silenceWarning() + promise.catch { _ in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 3) + exes[2].fulfill() + }.silenceWarning() + promise.catch { _ in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 4) + exes[3].fulfill() + }.silenceWarning() + } + } + describe("multiple fulfillment handlers, one of which throws") { + testFulfilled(withExpectationCount: 4) { promise, exes, sentinel in + var orderValidator = 0 + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 1) + exes[0].fulfill() + }.silenceWarning() + promise.catch { _ in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 2) + exes[1].fulfill() + }.silenceWarning() + promise.catch { _ in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 3) + exes[2].fulfill() + throw Error.dummy + }.silenceWarning() + promise.catch { value in XCTFail() } + promise.done { + XCTAssertEqual($0, sentinel) + XCTAssertEqual(++orderValidator, 4) + exes[3].fulfill() + }.silenceWarning() + } + } + describe("results in multiple branching chains with their own fulfillment values") { + testFulfilled(withExpectationCount: 3) { promise, exes, memo in + let sentinel1 = 671 + let sentinel2: UInt32 = 672 + let sentinel3 = 673 + + promise.map { _ in + return sentinel1 + }.done { value in + XCTAssertEqual(sentinel1, value) + exes[0].fulfill() + }.silenceWarning() + + promise.done { _ in + throw Error.sentinel(sentinel2) + }.catch { err in + switch err { + case Error.sentinel(let err) where err == sentinel2: + break + default: + XCTFail() + } + exes[1].fulfill() + } + + promise.map { _ in + sentinel3 + }.done { + XCTAssertEqual($0, sentinel3) + exes[2].fulfill() + }.silenceWarning() + } + } + describe("`onFulfilled` handlers are called in the original order") { + testFulfilled(withExpectationCount: 3) { promise, exes, memo in + var orderValidator = 0 + + promise.done { _ in + XCTAssertEqual(++orderValidator, 1) + exes[0].fulfill() + }.silenceWarning() + promise.done { _ in + XCTAssertEqual(++orderValidator, 2) + exes[1].fulfill() + }.silenceWarning() + promise.done { _ in + XCTAssertEqual(++orderValidator, 3) + exes[2].fulfill() + }.silenceWarning() + } + } + describe("even when one handler is added inside another handler") { + testFulfilled(withExpectationCount: 3) { promise, exes, memo in + var x = 0 + promise.done { _ in + XCTAssertEqual(x, 0) + x += 1 + exes[0].fulfill() + promise.done { _ in + XCTAssertEqual(x, 2) + x += 1 + exes[1].fulfill() + }.silenceWarning() + }.silenceWarning() + promise.done { _ in + XCTAssertEqual(x, 1) + x += 1 + exes[2].fulfill() + }.silenceWarning() + } + } + } + describe("2.2.6.2: If/when `promise` is rejected, all respective `onRejected` callbacks must execute in the order of their originating calls to `then`.") { + describe("multiple boring rejection handlers") { + testRejected(withExpectationCount: 4) { promise, exes, sentinel in + var ticket = 0 + + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++ticket, 1) + exes[0].fulfill() + } + promise.done { _ in XCTFail() }.silenceWarning() + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++ticket, 2) + exes[1].fulfill() + } + promise.done { _ in XCTFail() }.silenceWarning() + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++ticket, 3) + exes[2].fulfill() + } + promise.done { _ in XCTFail() }.silenceWarning() + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++ticket, 4) + exes[3].fulfill() + } + } + } + describe("multiple rejection handlers, one of which throws") { + testRejected(withExpectationCount: 4) { promise, exes, sentinel in + var orderValidator = 0 + + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++orderValidator, 1) + exes[0].fulfill() + } + promise.done { _ in XCTFail() }.silenceWarning() + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++orderValidator, 2) + exes[1].fulfill() + } + promise.done { _ in XCTFail() }.silenceWarning() + promise.recover { err -> Promise in + if case Error.sentinel(let x) = err { + XCTAssertEqual(x, sentinel) + } else { + XCTFail() + } + XCTAssertEqual(++orderValidator, 3) + exes[2].fulfill() + throw Error.dummy + }.silenceWarning() + promise.done { _ in XCTFail() }.silenceWarning() + promise.catch { err in + guard case Error.sentinel(let x) = err, x == sentinel else { return XCTFail() } + XCTAssertEqual(++orderValidator, 4) + exes[3].fulfill() + } + } + } + describe("results in multiple branching chains with their own fulfillment values") { + testRejected(withExpectationCount: 3) { promise, exes, memo in + let sentinel1 = arc4random() + let sentinel2 = arc4random() + let sentinel3 = arc4random() + + promise.recover { _ in + return .value(sentinel1) + }.done { value in + XCTAssertEqual(sentinel1, value) + exes[0].fulfill() + } + + promise.recover { _ -> Promise in + throw Error.sentinel(sentinel2) + }.catch { err in + if case Error.sentinel(let x) = err, x == sentinel2 { + exes[1].fulfill() + } + } + + promise.recover { _ in + .value(sentinel3) + }.done { value in + XCTAssertEqual(value, sentinel3) + exes[2].fulfill() + } + } + } + describe("`onRejected` handlers are called in the original order") { + testRejected(withExpectationCount: 3) { promise, exes, memo in + var x = 0 + + promise.catch { _ in + XCTAssertEqual(x, 0) + x += 1 + exes[0].fulfill() + } + promise.catch { _ in + XCTAssertEqual(x, 1) + x += 1 + exes[1].fulfill() + } + promise.catch { _ in + XCTAssertEqual(x, 2) + x += 1 + exes[2].fulfill() + } + } + } + describe("even when one handler is added inside another handler") { + testRejected(withExpectationCount: 3) { promise, exes, memo in + var x = 0 + + promise.catch { _ in + XCTAssertEqual(x, 0) + x += 1 + exes[0].fulfill() + promise.catch { _ in + XCTAssertEqual(x, 2) + x += 1 + exes[1].fulfill() + } + } + promise.catch { _ in + XCTAssertEqual(x, 1) + x += 1 + exes[2].fulfill() + } + } + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.7.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.7.swift new file mode 100644 index 00000000..ad9052d4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.2.7.swift @@ -0,0 +1,33 @@ +import PromiseKit +import XCTest + +class Test227: XCTestCase { + func test() { + describe("2.2.7: `then` must return a promise: `promise2 = promise1.then(onFulfilled, onRejected)") { + describe("2.2.7.2: If either `onFulfilled` or `onRejected` throws an exception `e`, `promise2` must be rejected with `e` as the reason.") { + + testFulfilled { promise1, expectation, _ in + let sentinel = arc4random() + let promise2 = promise1.done { _ in throw Error.sentinel(sentinel) } + + promise2.catch { + if case Error.sentinel(let x) = $0, x == sentinel { + expectation.fulfill() + } + } + } + + testRejected { promise1, expectation, _ in + let sentinel = arc4random() + let promise2 = promise1.recover { _ -> Promise in throw Error.sentinel(sentinel) } + + promise2.catch { error in + if case Error.sentinel(let x) = error, x == sentinel { + expectation.fulfill() + } + } + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.1.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.1.swift new file mode 100644 index 00000000..d526a672 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.1.swift @@ -0,0 +1,31 @@ +import PromiseKit +import XCTest + +class Test231: XCTestCase { + func test() { + describe("2.3.1: If `promise` and `x` refer to the same object, reject `promise` with a `TypeError' as the reason.") { + specify("via return from a fulfilled promise") { d, expectation in + var promise: Promise! + promise = Promise().then { () -> Promise in + return promise + } + promise.catch { err in + if case PMKError.returnedSelf = err { + expectation.fulfill() + } + } + } + specify("via return from a rejected promise") { d, expectation in + var promise: Promise! + promise = Promise(error: Error.dummy).recover { _ -> Promise in + return promise + } + promise.catch { err in + if case PMKError.returnedSelf = err { + expectation.fulfill() + } + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.2.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.2.swift new file mode 100644 index 00000000..cf4ceb0b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.2.swift @@ -0,0 +1,116 @@ +import PromiseKit +import XCTest + +class Test232: XCTestCase { + func test() { + describe("2.3.2: If `x` is a promise, adopt its state") { + describe("2.3.2.1: If `x` is pending, `promise` must remain pending until `x` is fulfilled or rejected.") { + + func xFactory() -> Promise { + return Promise.pending().promise + } + + testPromiseResolution(factory: xFactory) { promise, expectation in + var wasFulfilled = false; + var wasRejected = false; + + promise.test(onFulfilled: { wasFulfilled = true }, onRejected: { wasRejected = true }) + + after(ticks: 4) { + XCTAssertFalse(wasFulfilled) + XCTAssertFalse(wasRejected) + expectation.fulfill() + } + } + } + + describe("2.3.2.2: If/when `x` is fulfilled, fulfill `promise` with the same value.") { + describe("`x` is already-fulfilled") { + let sentinel = arc4random() + + func xFactory() -> Promise { + return .value(sentinel) + } + + testPromiseResolution(factory: xFactory) { promise, expectation in + promise.done { + XCTAssertEqual($0, sentinel) + expectation.fulfill() + }.silenceWarning() + } + } + describe("`x` is eventually-fulfilled") { + let sentinel = arc4random() + + func xFactory() -> Promise { + return Promise { seal in + after(ticks: 2) { + seal.fulfill(sentinel) + } + } + } + + testPromiseResolution(factory: xFactory) { promise, expectation in + promise.done { + XCTAssertEqual($0, sentinel) + expectation.fulfill() + }.silenceWarning() + } + } + } + + describe("2.3.2.3: If/when `x` is rejected, reject `promise` with the same reason.") { + describe("`x` is already-rejected") { + let sentinel = arc4random() + + func xFactory() -> Promise { + return Promise(error: Error.sentinel(sentinel)) + } + + testPromiseResolution(factory: xFactory) { promise, expectation in + promise.catch { err in + if case Error.sentinel(let value) = err, value == sentinel { + expectation.fulfill() + } + } + } + } + describe("`x` is eventually-rejected") { + let sentinel = arc4random() + + func xFactory() -> Promise { + return Promise { seal in + after(ticks: 2) { + seal.reject(Error.sentinel(sentinel)) + } + } + } + + testPromiseResolution(factory: xFactory) { promise, expectation in + promise.catch { err in + if case Error.sentinel(let value) = err, value == sentinel { + expectation.fulfill() + } + } + } + } + } + } + } +} + + +///////////////////////////////////////////////////////////////////////// + +extension Test232 { + fileprivate func testPromiseResolution(factory: @escaping () -> Promise, line: UInt = #line, test: (Promise, XCTestExpectation) -> Void) { + specify("via return from a fulfilled promise", file: #file, line: line) { d, expectation in + let promise = Promise.value(arc4random()).then { _ in factory() } + test(promise, expectation) + } + specify("via return from a rejected promise", file: #file, line: line) { d, expectation in + let promise: Promise = Promise(error: Error.dummy).recover { _ in factory() } + test(promise, expectation) + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.4.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.4.swift new file mode 100644 index 00000000..2c0133b6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/2.3.4.swift @@ -0,0 +1,26 @@ +import PromiseKit +import XCTest + + +class Test234: XCTestCase { + func test() { + describe("2.3.4: If `x` is not an object or function, fulfill `promise` with `x`") { + testFulfilled { promise, exception, _ in + promise.map { value -> UInt32 in + return 1 + }.done { value in + XCTAssertEqual(value, 1) + exception.fulfill() + }.silenceWarning() + } + testRejected { promise, expectation, _ in + promise.recover { _ -> Promise in + return .value(UInt32(1)) + }.done { value in + XCTAssertEqual(value, 1) + expectation.fulfill() + }.silenceWarning() + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/README.md b/Carthage/Checkouts/PromiseKit/Tests/A+/README.md new file mode 100644 index 00000000..bba573e0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/README.md @@ -0,0 +1,13 @@ +Resources +========= +* https://github.com/promises-aplus/promises-tests + + +Skipped +======= +* 2.3.3: Otherwise, if x is an object or function. + This spec is a NOOP for Swift: + - We have decided not to interact with other Promises A+ implementations + - functions cannot have properties +* 2.3.3.4: If then is not a function, fulfill promise with x. + - See: The 2.3.4 suite. diff --git a/Carthage/Checkouts/PromiseKit/Tests/A+/XCTestManifests.swift b/Carthage/Checkouts/PromiseKit/Tests/A+/XCTestManifests.swift new file mode 100644 index 00000000..5f78de59 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/A+/XCTestManifests.swift @@ -0,0 +1,108 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension Test212 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test212 = [ + ("test", test), + ] +} + +extension Test213 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test213 = [ + ("test", test), + ] +} + +extension Test222 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test222 = [ + ("test", test), + ] +} + +extension Test223 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test223 = [ + ("test", test), + ] +} + +extension Test224 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test224 = [ + ("test", test), + ] +} + +extension Test226 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test226 = [ + ("test", test), + ] +} + +extension Test227 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test227 = [ + ("test", test), + ] +} + +extension Test231 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test231 = [ + ("test", test), + ] +} + +extension Test232 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test232 = [ + ("test", test), + ] +} + +extension Test234 { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__Test234 = [ + ("test", test), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(Test212.__allTests__Test212), + testCase(Test213.__allTests__Test213), + testCase(Test222.__allTests__Test222), + testCase(Test223.__allTests__Test223), + testCase(Test224.__allTests__Test224), + testCase(Test226.__allTests__Test226), + testCase(Test227.__allTests__Test227), + testCase(Test231.__allTests__Test231), + testCase(Test232.__allTests__Test232), + testCase(Test234.__allTests__Test234), + ] +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.m b/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.m new file mode 100644 index 00000000..928c0481 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.m @@ -0,0 +1,34 @@ +@import PromiseKit; +@import XCTest; +#import "Infrastructure.h" + + +@interface BridgingTests: XCTestCase @end @implementation BridgingTests + +- (void)testChainAnyPromiseFromSwiftCode { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + AnyPromise *promise = PMKAfter(0.02); + for (int x = 0; x < 100; ++x) { + promise = promise.then(^{ + return [[[PromiseBridgeHelper alloc] init] bridge1]; + }); + } + promise.then(^{ + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:20 handler:nil]; +} + +- (void)test626 { + XCTestExpectation *ex = [self expectationWithDescription:@""]; + + testCase626().then(^{ + XCTFail(); + }).ensure(^{ + [ex fulfill]; + }); + + [self waitForExpectationsWithTimeout:20 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.swift b/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.swift new file mode 100644 index 00000000..0e043346 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/Bridging/BridgingTests.swift @@ -0,0 +1,280 @@ +import Foundation +import PromiseKit +import XCTest + +class BridgingTests: XCTestCase { + + func testCanBridgeAnyObject() { + let sentinel = NSURLRequest() + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + + XCTAssertEqual(ap.value(forKey: "value") as? NSURLRequest, sentinel) + } + + func testCanBridgeOptional() { + let sentinel: NSURLRequest? = NSURLRequest() + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + + XCTAssertEqual(ap.value(forKey: "value") as? NSURLRequest, sentinel) + } + + func testCanBridgeSwiftArray() { + let sentinel = [NSString(), NSString(), NSString()] + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + + guard let foo = ap.value(forKey: "value") as? [NSString] else { return XCTFail() } + XCTAssertEqual(foo, sentinel) + } + + func testCanBridgeSwiftDictionary() { + let sentinel = [NSString(): NSString()] + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + + guard let foo = ap.value(forKey: "value") as? [NSString: NSString] else { return XCTFail() } + XCTAssertEqual(foo, sentinel) + } + + func testCanBridgeInt() { + let sentinel = 3 + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + XCTAssertEqual(ap.value(forKey: "value") as? Int, sentinel) + } + + func testCanBridgeString() { + let sentinel = "a" + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + XCTAssertEqual(ap.value(forKey: "value") as? String, sentinel) + } + + func testCanBridgeBool() { + let sentinel = true + let p = Promise.value(sentinel) + let ap = AnyPromise(p) + XCTAssertEqual(ap.value(forKey: "value") as? Bool, sentinel) + } + + func testCanChainOffAnyPromiseFromObjC() { + let ex = expectation(description: "") + + firstly { + .value(1) + }.then { _ -> AnyPromise in + return PromiseBridgeHelper().value(forKey: "bridge2") as! AnyPromise + }.done { value in + XCTAssertEqual(123, value as? Int) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func testCanThenOffAnyPromise() { + let ex = expectation(description: "") + + PMKDummyAnyPromise_YES().then { obj -> Promise in + if let value = obj as? NSNumber { + XCTAssertEqual(value, NSNumber(value: true)) + ex.fulfill() + } + return Promise() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func testCanThenOffManifoldAnyPromise() { + let ex = expectation(description: "") + + PMKDummyAnyPromise_Manifold().then { obj -> Promise in + defer { ex.fulfill() } + XCTAssertEqual(obj as? NSNumber, NSNumber(value: true), "\(obj ?? "nil") is not @YES") + return Promise() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func testCanAlwaysOffAnyPromise() { + let ex = expectation(description: "") + + PMKDummyAnyPromise_YES().then { obj -> Promise in + ex.fulfill() + return Promise() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func testCanCatchOffAnyPromise() { + let ex = expectation(description: "") + PMKDummyAnyPromise_Error().catch { err in + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func testAsPromise() { + #if swift(>=3.1) + XCTAssertTrue(Promise(PMKDummyAnyPromise_Error()).isRejected) + XCTAssertEqual(Promise(PMKDummyAnyPromise_YES()).value as? NSNumber, NSNumber(value: true)) + #else + XCTAssertTrue(PMKDummyAnyPromise_Error().asPromise().isRejected) + XCTAssertEqual(PMKDummyAnyPromise_YES().asPromise().value as? NSNumber, NSNumber(value: true)) + #endif + } + + func testFirstlyReturningAnyPromiseSuccess() { + let ex = expectation(description: "") + firstly { + PMKDummyAnyPromise_Error() + }.catch { error in + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func testFirstlyReturningAnyPromiseError() { + let ex = expectation(description: "") + firstly { + PMKDummyAnyPromise_YES() + }.done { _ in + ex.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1) + } + + func test1() { + let ex = expectation(description: "") + + // AnyPromise.then { return x } + + let input = after(seconds: 0).map{ 1 } + + AnyPromise(input).then { obj -> Promise in + XCTAssertEqual(obj as? Int, 1) + return .value(2) + }.done { value in + XCTAssertEqual(value, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func test2() { + let ex = expectation(description: "") + + // AnyPromise.then { return AnyPromise } + + let input = after(seconds: 0).map{ 1 } + + AnyPromise(input).then { obj -> AnyPromise in + XCTAssertEqual(obj as? Int, 1) + return AnyPromise(after(seconds: 0).map{ 2 }) + }.done { obj in + XCTAssertEqual(obj as? Int, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func test3() { + let ex = expectation(description: "") + + // AnyPromise.then { return Promise } + + let input = after(seconds: 0).map{ 1 } + + AnyPromise(input).then { obj -> Promise in + XCTAssertEqual(obj as? Int, 1) + return after(seconds: 0).map{ 2 } + }.done { value in + XCTAssertEqual(value, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1, handler: nil) + } + + + // can return AnyPromise (that fulfills) in then handler + func test4() { + let ex = expectation(description: "") + Promise.value(1).then { _ -> AnyPromise in + return AnyPromise(after(seconds: 0).map{ 1 }) + }.done { x in + XCTAssertEqual(x as? Int, 1) + ex.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + // can return AnyPromise (that rejects) in then handler + func test5() { + let ex = expectation(description: "") + + Promise.value(1).then { _ -> AnyPromise in + let promise = after(.milliseconds(100)).done{ throw Error.dummy } + return AnyPromise(promise) + }.catch { err in + ex.fulfill() + } + waitForExpectations(timeout: 1) + } + + func testStandardSwiftBridgeIsUnambiguous() { + let p = Promise.value(1) + let q = Promise(p) + + XCTAssertEqual(p.value, q.value) + } + + /// testing NSError to Error for cancelledError types + func testErrorCancellationBridging() { + let ex = expectation(description: "") + + let p = Promise().done { + throw LocalError.cancel as NSError + } + p.catch { _ in + XCTFail() + } + p.catch(policy: .allErrors) { + XCTAssertTrue($0.isCancelled) + ex.fulfill() + } + waitForExpectations(timeout: 1) + + // here we verify that Swift’s NSError bridging works as advertised + + XCTAssertTrue(LocalError.cancel.isCancelled) + XCTAssertTrue((LocalError.cancel as NSError).isCancelled) + } +} + +private enum Error: Swift.Error { + case dummy +} + +extension Promise { + func silenceWarning() {} +} + +private enum LocalError: CancellableError { + case notCancel + case cancel + + var isCancelled: Bool { + switch self { + case .notCancel: return false + case .cancel: return true + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.h b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.h new file mode 100644 index 00000000..104378fa --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.h @@ -0,0 +1,14 @@ +@import Foundation; +@class AnyPromise; + +AnyPromise *PMKDummyAnyPromise_YES(void); +AnyPromise *PMKDummyAnyPromise_Manifold(void); +AnyPromise *PMKDummyAnyPromise_Error(void); + +__attribute__((objc_runtime_name("PMKPromiseBridgeHelper"))) +__attribute__((objc_subclassing_restricted)) +@interface PromiseBridgeHelper: NSObject +- (AnyPromise *)bridge1; +@end + +AnyPromise *testCase626(void); diff --git a/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.m b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.m new file mode 100644 index 00000000..5049310a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.m @@ -0,0 +1,38 @@ +@import Foundation; +@import PromiseKit; +#import "Infrastructure.h" + +AnyPromise *PMKDummyAnyPromise_YES() { + return [AnyPromise promiseWithValue:@YES]; +} + +AnyPromise *PMKDummyAnyPromise_Manifold() { + return [AnyPromise promiseWithValue:PMKManifold(@YES, @NO, @NO)]; +} + +AnyPromise *PMKDummyAnyPromise_Error() { + return [AnyPromise promiseWithValue:[NSError errorWithDomain:@"a" code:1 userInfo:nil]]; +} + +@implementation PromiseBridgeHelper (objc) + +- (AnyPromise *)bridge2 { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + resolve(@123); + }); + }]; +} + +@end + +#import "PMKBridgeTests-Swift.h" + +AnyPromise *testCase626() { + return PMKWhen(@[[TestPromise626 promise], [TestPromise626 promise]]).then(^(id value){ + NSLog(@"Success: %@", value); + }).catch(^(NSError *error) { + NSLog(@"Error: %@", error); + @throw error; + }); +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.swift b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.swift new file mode 100644 index 00000000..775fd31c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/Bridging/Infrastructure.swift @@ -0,0 +1,24 @@ +import PromiseKit + +// for BridgingTests.m +@objc(PMKPromiseBridgeHelper) class PromiseBridgeHelper: NSObject { + @objc func bridge1() -> AnyPromise { + let p = after(.milliseconds(10)) + return AnyPromise(p) + } +} + +enum MyError: Error { + case PromiseError +} + +@objc class TestPromise626: NSObject { + + @objc class func promise() -> AnyPromise { + let promise: Promise = Promise { seal in + seal.reject(MyError.PromiseError) + } + + return AnyPromise(promise) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.m new file mode 100644 index 00000000..d2498b49 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.m @@ -0,0 +1,908 @@ +@import PromiseKit; +@import XCTest; +#import "Infrastructure.h" +#define PMKTestErrorDomain @"PMKTestErrorDomain" + +static inline NSError *dummyWithCode(NSInteger code) { + return [NSError errorWithDomain:PMKTestErrorDomain code:rand() userInfo:@{NSLocalizedDescriptionKey: @(code).stringValue}]; +} + +static inline NSError *dummy() { + return dummyWithCode(rand()); +} + +static inline AnyPromise *rejectLater() { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + dispatch_async(dispatch_get_main_queue(), ^{ + resolve(dummy()); + }); + }); + }]; +} + +static inline AnyPromise *fulfillLater() { + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + dispatch_async(dispatch_get_global_queue(QOS_CLASS_UNSPECIFIED, 0), ^{ + resolve(@1); + }); + }]; +} + + + +@interface AnyPromiseTestSuite : XCTestCase @end @implementation AnyPromiseTestSuite + +- (void)test_01_resolve { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }]; + promise.then(^(NSNumber *o){ + [ex1 fulfill]; + XCTAssertEqual(o.intValue, 1); + }); + promise.catch(^{ + XCTFail(); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_02_reject { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(dummyWithCode(2)); + }]; + promise.then(^{ + XCTFail(); + }); + promise.catch(^(NSError *error){ + XCTAssertEqualObjects(error.localizedDescription, @"2"); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_03_return_error { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@2); + }]; + promise.then(^{ + return [NSError errorWithDomain:@"a" code:3 userInfo:nil]; + }).catch(^(NSError *e){ + [ex1 fulfill]; + XCTAssertEqual(3, e.code); + }); + promise.catch(^{ + XCTFail(); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_04_return_error_doesnt_compromise_result { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@4); + }].then(^{ + return dummy(); + }); + promise.then(^{ + XCTFail(); + }); + promise.catch(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_05_throw_and_bubble { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@5); + }].then(^(id ii){ + XCTAssertEqual(5, [ii intValue]); + return [NSError errorWithDomain:@"a" code:[ii intValue] userInfo:nil]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.code, 5); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_05_throw_and_bubble_more { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@5); + }].then(^{ + return dummy(); + }).then(^{ + //NOOP + }).catch(^(NSError *e){ + [ex1 fulfill]; + XCTAssertEqualObjects(e.domain, PMKTestErrorDomain); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_06_return_error { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@5); + }].then(^{ + return dummy(); + }).catch(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_07_can_then_resolved { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].then(^(id o){ + [ex1 fulfill]; + XCTAssertEqualObjects(@1, o); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_07a_can_fail_rejected { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(dummyWithCode(1)); + }].catch(^(NSError *e){ + [ex1 fulfill]; + XCTAssertEqualObjects(@"1", e.localizedDescription); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_09_async { + id ex1 = [self expectationWithDescription:@""]; + + __block int x = 0; + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].then(^{ + XCTAssertEqual(x, 0); + x++; + }).then(^{ + XCTAssertEqual(x, 1); + x++; + }).then(^{ + XCTAssertEqual(x, 2); + x++; + }).then(^{ + XCTAssertEqual(x, 3); + x++; + }).then(^{ + XCTAssertEqual(x, 4); + x++; + + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + XCTAssertEqual(x, 5); +} + +- (void)test_10_then_returns_resolved_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@10); + }].then(^(id o){ + XCTAssertEqualObjects(@10, o); + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@100); + }]; + }).then(^(id o){ + XCTAssertEqualObjects(@100, o); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_11_then_returns_pending_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].then(^{ + return fulfillLater(); + }).then(^(id o){ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_12_then_returns_recursive_promises { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + __block int x = 0; + fulfillLater().then(^{ + NSLog(@"1"); + XCTAssertEqual(x++, 0); + return fulfillLater().then(^{ + NSLog(@"2"); + XCTAssertEqual(x++, 1); + return fulfillLater().then(^{ + NSLog(@"3"); + XCTAssertEqual(x++, 2); + return fulfillLater().then(^{ + NSLog(@"4"); + XCTAssertEqual(x++, 3); + [ex2 fulfill]; + return @"foo"; + }); + }); + }); + }).then(^(id o){ + NSLog(@"5"); + XCTAssertEqualObjects(@"foo", o); + XCTAssertEqual(x++, 4); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + XCTAssertEqual(x, 5); +} + + - (void)test_13_then_returns_recursive_promises_that_fails { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + fulfillLater().then(^{ + return fulfillLater().then(^{ + return fulfillLater().then(^{ + return fulfillLater().then(^{ + [ex2 fulfill]; + return dummy(); + }); + }); + }); + }).then(^{ + XCTFail(); + }).catch(^(NSError *e){ + XCTAssertEqualObjects(e.domain, PMKTestErrorDomain); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + } + +- (void)test_14_fail_returns_value { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].then(^{ + return [NSError errorWithDomain:@"a" code:1 userInfo:nil]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.code, 1); + return @2; + }).then(^(id o){ + XCTAssertEqualObjects(o, @2); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_15_fail_returns_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].then(^{ + return dummy(); + }).catch(^{ + return fulfillLater().then(^{ + return @123; + }); + }).then(^(id o){ + XCTAssertEqualObjects(o, @123); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_23_add_another_fail_to_already_rejected { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + PMKResolver resolve; + AnyPromise *promise = [[AnyPromise alloc] initWithResolver:&resolve]; + + promise.then(^{ + XCTFail(); + }).catch(^(NSError *e){ + XCTAssertEqualObjects(e.localizedDescription, @"23"); + [ex1 fulfill]; + }); + + resolve(dummyWithCode(23)); + + promise.then(^{ + XCTFail(); + }).catch(^(NSError *e){ + XCTAssertEqualObjects(e.localizedDescription, @"23"); + [ex2 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_25_then_plus_deferred_plus_GCD { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + id ex3 = [self expectationWithDescription:@""]; + + fulfillLater().then(^(id o){ + [ex1 fulfill]; + return fulfillLater().then(^{ + return @YES; + }); + }).then(^(id o){ + XCTAssertEqualObjects(@YES, o); + [ex2 fulfill]; + }).then(^(id o){ + XCTAssertNil(o); + [ex3 fulfill]; + }).catch(^{ + XCTFail(); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_26_promise_then_promise_fail_promise_fail { + id ex1 = [self expectationWithDescription:@""]; + + fulfillLater().then(^{ + return fulfillLater().then(^{ + return dummy(); + }).catch(^{ + return fulfillLater().then(^{ + return dummy(); + }); + }); + }).then(^{ + XCTFail(); + }).catch(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil];} + +- (void)test_27_eat_failure { + id ex1 = [self expectationWithDescription:@""]; + + fulfillLater().then(^{ + return dummy(); + }).catch(^{ + return @YES; + }).then(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_28_deferred_rejected_catch_promise { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + rejectLater().catch(^{ + [ex1 fulfill]; + return fulfillLater(); + }).then(^(id o){ + [ex2 fulfill]; + }).catch(^{ + XCTFail(); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_29_deferred_rejected_catch_promise { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + rejectLater().catch(^{ + [ex1 fulfill]; + return fulfillLater().then(^{ + return dummy(); + }); + }).then(^{ + XCTFail(@"1"); + }).catch(^(NSError *error){ + [ex2 fulfill]; + }).catch(^{ + XCTFail(@"2"); + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_30_dispatch_returns_pending_promise { + id ex1 = [self expectationWithDescription:@""]; + dispatch_promise(^{ + return fulfillLater(); + }).then(^{ + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_31_dispatch_returns_promise { + id ex1 = [self expectationWithDescription:@""]; + dispatch_promise(^{ + return [AnyPromise promiseWithValue:@1]; + }).then(^(id o){ + XCTAssertEqualObjects(o, @1); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_32_return_primitive { + id ex1 = [self expectationWithDescription:@""]; + __block void (^fulfiller)(id) = nil; + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + fulfiller = resolve; + }].then(^(id o){ + XCTAssertEqualObjects(o, @32); + return 3; + }).then(^(id o){ + XCTAssertEqualObjects(@3, o); + [ex1 fulfill]; + }); + fulfiller(@32); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_33_return_nil { + id ex1 = [self expectationWithDescription:@""]; + [AnyPromise promiseWithValue:@1].then(^(id o){ + XCTAssertEqualObjects(o, @1); + return nil; + }).then(^{ + return nil; + }).then(^(id o){ + XCTAssertNil(o); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_33a_return_nil { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:@"HI"].then(^(id o){ + XCTAssertEqualObjects(o, @"HI"); + [ex1 fulfill]; + return nil; + }).then(^{ + return nil; + }).then(^{ + [ex2 fulfill]; + return nil; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_36_promise_with_value_nil { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:nil].then(^(id o){ + XCTAssertNil(o); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_42 { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:@1].then(^{ + return fulfillLater(); + }).then(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_43_return_promise_from_itself { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *p = fulfillLater().then(^{ return @1; }); + p.then(^{ + return p; + }).then(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_44_reseal { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@123); + resolve(@234); + }].then(^(id o){ + XCTAssertEqualObjects(o, @123); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_46_test_then_on { + id ex1 = [self expectationWithDescription:@""]; + + dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); + dispatch_queue_t q2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [AnyPromise promiseWithValue:@1].thenOn(q1, ^{ + XCTAssertFalse([NSThread isMainThread]); + return dispatch_get_current_queue(); + }).thenOn(q2, ^(id q){ + XCTAssertFalse([NSThread isMainThread]); + XCTAssertNotEqualObjects(q, dispatch_get_current_queue()); + [ex1 fulfill]; + }); +#pragma clang diagnostic pop + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_47_finally_plus { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:@1].then(^{ + return @1; + }).ensure(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_48_finally_negative { + @autoreleasepool { + id ex1 = [self expectationWithDescription:@"always"]; + id ex2 = [self expectationWithDescription:@"errorUnhandler"]; + + [AnyPromise promiseWithValue:@1].then(^{ + return dummy(); + }).ensure(^{ + [ex1 fulfill]; + }).catch(^(NSError *err){ + XCTAssertEqualObjects(err.domain, PMKTestErrorDomain); + [ex2 fulfill]; + }); + } + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_49_finally_negative_later { + id ex1 = [self expectationWithDescription:@""]; + __block int x = 0; + + [AnyPromise promiseWithValue:@1].then(^{ + XCTAssertEqual(++x, 1); + return dummy(); + }).catch(^{ + XCTAssertEqual(++x, 2); + }).then(^{ + XCTAssertEqual(++x, 3); + }).ensure(^{ + XCTAssertEqual(++x, 4); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_50_fulfill_with_pending_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(fulfillLater().then(^{ return @"HI"; })); + }].then(^(id hi){ + XCTAssertEqualObjects(hi, @"HI"); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_51_fulfill_with_fulfilled_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve([AnyPromise promiseWithValue:@1]); + }].then(^(id o){ + XCTAssertEqualObjects(o, @1); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_52_fulfill_with_rejected_promise { //NEEDEDanypr + id ex1 = [self expectationWithDescription:@""]; + fulfillLater().then(^{ + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve([AnyPromise promiseWithValue:dummy()]); + }]; + }).catch(^(NSError *err){ + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_53_return_rejected_promise { + id ex1 = [self expectationWithDescription:@""]; + fulfillLater().then(^{ + return @1; + }).then(^{ + return [AnyPromise promiseWithValue:dummy()]; + }).catch(^{ + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_54_reject_with_rejected_promise { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + id err = [NSError errorWithDomain:@"a" code:123 userInfo:nil]; + resolve([AnyPromise promiseWithValue:err]); + }].catch(^(NSError *err){ + XCTAssertEqual(err.code, 123); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_58_just_finally { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = fulfillLater().then(^{ + return nil; + }).ensure(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + id ex2 = [self expectationWithDescription:@""]; + + promise.ensure(^{ + [ex2 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_59_catch_in_background { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + id err = [NSError errorWithDomain:@"a" code:123 userInfo:nil]; + resolve(err); + }].catchInBackground(^(NSError *err){ + XCTAssertEqual(err.code, 123); + XCTAssertFalse([NSThread isMainThread]); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_60_catch_on_specific_queue { + id ex1 = [self expectationWithDescription:@""]; + + NSString *expectedQueueName = @"specific queue 123"; + dispatch_queue_t q = dispatch_queue_create(expectedQueueName.UTF8String, DISPATCH_QUEUE_SERIAL); + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + id err = [NSError errorWithDomain:@"a" code:123 userInfo:nil]; + resolve(err); + }].catchOn(q, ^(NSError *err){ + XCTAssertEqual(err.code, 123); + XCTAssertFalse([NSThread isMainThread]); + NSString *currentQueueName = [NSString stringWithFormat:@"%s", dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)]; + XCTAssertEqualObjects(expectedQueueName, currentQueueName); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_61_wait_for_value { + id o = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(@1); + }].wait; + + XCTAssertEqualObjects(o, @1); +} + +- (void)test_62_wait_for_error { + NSError* err = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve([NSError errorWithDomain:@"a" code:123 userInfo:nil]); + }].wait; + + XCTAssertEqual(err.code, 123); +} + +- (void)test_properties { + XCTAssertEqualObjects([AnyPromise promiseWithValue:@1].value, @1); + XCTAssertEqualObjects([[AnyPromise promiseWithValue:dummyWithCode(2)].value localizedDescription], @"2"); + XCTAssertNil([AnyPromise promiseWithResolverBlock:^(id a){}].value); + XCTAssertTrue([AnyPromise promiseWithResolverBlock:^(id a){}].pending); + XCTAssertFalse([AnyPromise promiseWithValue:@1].pending); + XCTAssertTrue([AnyPromise promiseWithValue:@1].fulfilled); + XCTAssertFalse([AnyPromise promiseWithValue:@1].rejected); +} + +- (void)test_promiseWithValue { + XCTAssertEqual([AnyPromise promiseWithValue:@1].value, @1); + XCTAssertEqualObjects([[AnyPromise promiseWithValue:dummyWithCode(2)].value localizedDescription], @"2"); + XCTAssertEqual([AnyPromise promiseWithValue:[AnyPromise promiseWithValue:@1]].value, @1); +} + +- (void)testInBackground { + id ex = [self expectationWithDescription:@""]; + PMKAfter(0.1).thenInBackground(^{ [ex fulfill]; }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testEnsureOn { + id ex = [self expectationWithDescription:@""]; + PMKAfter(0.1).ensureOn(dispatch_get_global_queue(QOS_CLASS_UNSPECIFIED, 0), ^{ [ex fulfill]; }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testEnsureInBackground { + id ex = [self expectationWithDescription:@""]; + PMKAfter(0.1).ensureInBackground(^{ [ex fulfill]; }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testAdapterBlock { + void (^fetch)(PMKAdapter) = ^(PMKAdapter block){ + block(@1, nil); + }; + id ex = [self expectationWithDescription:@""]; + [AnyPromise promiseWithAdapterBlock:fetch].then(^(id obj){ + XCTAssertEqualObjects(obj, @1); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testIntegerAdapterBlock { + void (^fetch)(PMKIntegerAdapter) = ^(PMKIntegerAdapter block){ + block(1, nil); + }; + id ex = [self expectationWithDescription:@""]; + [AnyPromise promiseWithIntegerAdapterBlock:fetch].then(^(id obj){ + XCTAssertEqualObjects(obj, @1); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testBooleanAdapterBlock { + void (^fetch)(PMKBooleanAdapter) = ^(PMKBooleanAdapter block){ + block(YES, nil); + }; + id ex = [self expectationWithDescription:@""]; + [AnyPromise promiseWithBooleanAdapterBlock:fetch].then(^(id obj){ + XCTAssertEqualObjects(obj, @YES); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +static NSHashTable *errorArray; + +- (void)setUp { + [super setUp]; + errorArray = [NSHashTable weakObjectsHashTable]; +} + +- (void)testErrorLeaks { + id ex1 = [self expectationWithDescription:@""]; + NSError *error = dummyWithCode(1001); + [errorArray addObject:error]; + [AnyPromise promiseWithValue:error] + .then(^{ + XCTFail(); + }).catch(^(NSError *e){ + XCTAssertEqual(e.localizedDescription.intValue, 1001); + }).then(^{ + NSError *err = dummyWithCode(1002); + [errorArray addObject:err]; + return err; + }).catch(^(NSError *e){ + XCTAssertEqual(e.localizedDescription.intValue, 1002); + }).then(^{ + NSError *err = dummyWithCode(1003); + [errorArray addObject:err]; + return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve){ + resolve(err); + }]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.localizedDescription.intValue, 1003); + NSError *err = dummyWithCode(1004); + [errorArray addObject:err]; + return err; + }).catch(^(NSError *e){ + XCTAssertEqual(e.localizedDescription.intValue, 1004); + }).then(^{ + NSError *err = dummyWithCode(1005); + [errorArray addObject:err]; + // throw will lead to leak, if not use complie flag with "-fobjc-arc-exceptions" + @throw err; + }).catch(^(NSError *e){ + XCTAssertEqual(e.localizedDescription.intValue, 1005); + }).ensure(^{ + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)tearDown { + XCTAssertEqual(errorArray.allObjects.count, 0); + [super tearDown]; +} + +//- (void)test_nil_block { +// [AnyPromise promiseWithValue:@1].then(nil); +// [AnyPromise promiseWithValue:@1].thenOn(nil, nil); +// [AnyPromise promiseWithValue:@1].catch(nil); +// [AnyPromise promiseWithValue:@1].always(nil); +// [AnyPromise promiseWithValue:@1].alwaysOn(nil, nil); +//} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.swift new file mode 100644 index 00000000..adbc68f7 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/AnyPromiseTests.swift @@ -0,0 +1,38 @@ +import PromiseKit +import XCTest + +class AnyPromiseTests: XCTestCase { + func testFulfilledResult() { + switch AnyPromise(Promise.value(true)).result { + case .fulfilled(let obj as Bool)? where obj: + break + default: + XCTFail() + } + } + + func testRejectedResult() { + switch AnyPromise(Promise(error: PMKError.badInput)).result { + case .rejected(let err)?: + print(err) + break + default: + XCTFail() + } + } + + func testPendingResult() { + switch AnyPromise(Promise.pending().promise).result { + case nil: + break + default: + XCTFail() + } + } + + func testCustomStringConvertible() { + XCTAssertEqual("\(AnyPromise(Promise.pending().promise))", "AnyPromise(…)") + XCTAssertEqual("\(AnyPromise(Promise.value(1)))", "AnyPromise(1)") + XCTAssertEqual("\(AnyPromise(Promise.value(nil)))", "AnyPromise(nil)") + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/HangTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/HangTests.m new file mode 100644 index 00000000..cf31ead9 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/HangTests.m @@ -0,0 +1,13 @@ +@import PromiseKit; +@import XCTest; + +@interface HangTests: XCTestCase @end @implementation HangTests + +- (void)test { + __block int x = 0; + id value = PMKHang(PMKAfter(0.02).then(^{ x++; return 1; })); + XCTAssertEqual(x, 1); + XCTAssertEqualObjects(value, @1); +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/JoinTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/JoinTests.m new file mode 100644 index 00000000..1249cde0 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/JoinTests.m @@ -0,0 +1,90 @@ +@import Foundation; +@import PromiseKit; +@import XCTest; + + +@interface JoinTests: XCTestCase @end @implementation JoinTests + +- (void)test_73_join { + XCTestExpectation *ex1 = [self expectationWithDescription:@""]; + + __block void (^fulfiller)(id) = nil; + AnyPromise *promise = [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + fulfiller = resolve; + }]; + + PMKJoin(@[ + [AnyPromise promiseWithValue:[NSError errorWithDomain:@"dom" code:1 userInfo:nil]], + promise, + [AnyPromise promiseWithValue:[NSError errorWithDomain:@"dom" code:2 userInfo:nil]] + ]).then(^{ + XCTFail(); + }).catch(^(NSError *error){ + id promises = error.userInfo[PMKJoinPromisesKey]; + + int cume = 0, cumv = 0; + + for (AnyPromise *promise in promises) { + if ([promise.value isKindOfClass:[NSError class]]) { + cume |= [promise.value code]; + } else { + cumv |= [promise.value unsignedIntValue]; + } + } + + XCTAssertTrue(cumv == 4); + XCTAssertTrue(cume == 3); + + [ex1 fulfill]; + }); + fulfiller(@4); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_74_join_no_errors { + XCTestExpectation *ex1 = [self expectationWithDescription:@""]; + PMKJoin(@[ + [AnyPromise promiseWithValue:@1], + [AnyPromise promiseWithValue:@2] + ]).then(^(NSArray *values, id errors) { + XCTAssertEqualObjects(values, (@[@1, @2])); + XCTAssertNil(errors); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + + +- (void)test_75_join_no_success { + XCTestExpectation *ex1 = [self expectationWithDescription:@""]; + PMKJoin(@[ + [AnyPromise promiseWithValue:[NSError errorWithDomain:@"dom" code:1 userInfo:nil]], + [AnyPromise promiseWithValue:[NSError errorWithDomain:@"dom" code:2 userInfo:nil]], + ]).then(^{ + XCTFail(); + }).catch(^(NSError *error){ + XCTAssertNotNil(error.userInfo[PMKJoinPromisesKey]); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_76_join_fulfills_if_empty_input { + XCTestExpectation *ex1 = [self expectationWithDescription:@""]; + PMKJoin(@[]).then(^(id a, id b, id c){ + XCTAssertEqualObjects(@[], a); + XCTAssertNil(b); + XCTAssertNil(c); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_join_nil { + NSArray *foo = nil; + NSError *err = PMKJoin(foo).value; + XCTAssertEqual(err.domain, PMKErrorDomain); + XCTAssertEqual(err.code, PMKInvalidUsageError); +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/PMKManifoldTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/PMKManifoldTests.m new file mode 100644 index 00000000..78248d6a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/PMKManifoldTests.m @@ -0,0 +1,83 @@ +@import PromiseKit; +@import XCTest; + +@interface PMKManifoldTests: XCTestCase @end @implementation PMKManifoldTests + +- (void)test_62_access_extra_elements { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { + resolve(PMKManifold(@1)); + }].then(^(id o, id m, id n){ + XCTAssertNil(m, @"Accessing extra elements should not crash"); + XCTAssertNil(n, @"Accessing extra elements should not crash"); + XCTAssertEqualObjects(o, @1); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_63_then_manifold { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:@0].then(^{ + return PMKManifold(@1, @2, @3); + }).then(^(id o1, id o2, id o3){ + XCTAssertEqualObjects(o1, @1); + XCTAssertEqualObjects(o2, @2); + XCTAssertEqualObjects(o3, @3); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_63_then_manifold_with_nil { + id ex1 = [self expectationWithDescription:@""]; + + [AnyPromise promiseWithValue:@0].then(^{ + return PMKManifold(@1, nil, @3); + }).then(^(id o1, id o2, id o3){ + XCTAssertEqualObjects(o1, @1); + XCTAssertEqualObjects(o2, nil); + XCTAssertEqualObjects(o3, @3); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_65_manifold_fulfill_value { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithValue:@1].then(^{ + return PMKManifold(@123, @2); + }); + + promise.then(^(id a, id b){ + XCTAssertNotNil(a); + XCTAssertNotNil(b); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + XCTAssertEqualObjects(promise.value, @123); +} + +- (void)test_37_PMKMany_2 { + id ex1 = [self expectationWithDescription:@""]; + + PMKAfter(0.02).then(^{ + return PMKManifold(@1, @2); + }).then(^(id a, id b){ + XCTAssertEqualObjects(a, @1); + XCTAssertEqualObjects(b, @2); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/RaceTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/RaceTests.m new file mode 100644 index 00000000..e4764409 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/RaceTests.m @@ -0,0 +1,88 @@ +@import Foundation; +@import PromiseKit; +@import XCTest; +#define PMKTestErrorDomain @"PMKTestErrorDomain" + +static inline NSError *dummyWithCode(NSInteger code) { + return [NSError errorWithDomain:PMKTestErrorDomain code:rand() userInfo:@{NSLocalizedDescriptionKey: @(code).stringValue}]; +} + +@interface RaceTests : XCTestCase @end @implementation RaceTests + +- (void)test_race { + id ex = [self expectationWithDescription:@""]; + id p = PMKAfter(0.1).then(^{ return @2; }); + PMKRace(@[PMKAfter(10), PMKAfter(20), p]).then(^(id obj){ + XCTAssertEqual(2, [obj integerValue]); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_race_empty { + id ex = [self expectationWithDescription:@""]; + PMKRace(@[]).then(^(NSArray* array){ + XCTFail(); + [ex fulfill]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.domain, PMKErrorDomain); + XCTAssertEqual(e.code, PMKInvalidUsageError); + XCTAssertEqualObjects(e.userInfo[NSLocalizedDescriptionKey], @"PMKRace(nil)"); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_race_fullfilled { + id ex = [self expectationWithDescription:@""]; + NSArray* promises = @[ + PMKAfter(1).then(^{ return dummyWithCode(1); }), + PMKAfter(2).then(^{ return dummyWithCode(2); }), + PMKAfter(5).then(^{ return @1; }), + PMKAfter(4).then(^{ return @2; }), + PMKAfter(3).then(^{ return dummyWithCode(3); }) + ]; + PMKRaceFulfilled(promises).then(^(id obj){ + XCTAssertEqual(2, [obj integerValue]); + [ex fulfill]; + }).catch(^{ + XCTFail(); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +- (void)test_race_fulfilled_empty { + id ex = [self expectationWithDescription:@""]; + PMKRaceFulfilled(@[]).then(^(NSArray* array){ + XCTFail(); + [ex fulfill]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.domain, PMKErrorDomain); + XCTAssertEqual(e.code, PMKInvalidUsageError); + XCTAssertEqualObjects(e.userInfo[NSLocalizedDescriptionKey], @"PMKRaceFulfilled(nil)"); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_race_fullfilled_with_no_winner { + id ex = [self expectationWithDescription:@""]; + NSArray* promises = @[ + PMKAfter(1).then(^{ return dummyWithCode(1); }), + PMKAfter(2).then(^{ return dummyWithCode(2); }), + PMKAfter(3).then(^{ return dummyWithCode(3); }) + ]; + PMKRaceFulfilled(promises).then(^(id obj){ + XCTFail(); + [ex fulfill]; + }).catch(^(NSError *e){ + XCTAssertEqual(e.domain, PMKErrorDomain); + XCTAssertEqual(e.code, PMKNoWinnerError); + XCTAssertEqualObjects(e.userInfo[NSLocalizedDescriptionKey], @"PMKRaceFulfilled(nil)"); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:10 handler:nil]; +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/WhenTests.m b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/WhenTests.m new file mode 100644 index 00000000..20267c15 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CoreObjC/WhenTests.m @@ -0,0 +1,265 @@ +@import Foundation; +@import PromiseKit; +@import XCTest; + + +@interface WhenTests: XCTestCase @end @implementation WhenTests + +- (void)testProgress { + + id ex = [self expectationWithDescription:@""]; + + XCTAssertNil([NSProgress currentProgress]); + + id p1 = PMKAfter(0.01); + id p2 = PMKAfter(0.02); + id p3 = PMKAfter(0.03); + id p4 = PMKAfter(0.04); + + NSProgress *progress = [NSProgress progressWithTotalUnitCount:1]; + [progress becomeCurrentWithPendingUnitCount:1]; + + PMKWhen(@[p1, p2, p3, p4]).then(^{ + XCTAssertEqual(progress.completedUnitCount, 1); + [ex fulfill]; + }); + + [progress resignCurrent]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; +} + +- (void)testProgressDoesNotExceed100Percent { + + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + XCTAssertNil([NSProgress currentProgress]); + + id p1 = PMKAfter(0.01); + id p2 = PMKAfter(0.02).then(^{ return [NSError errorWithDomain:@"a" code:1 userInfo:nil]; }); + id p3 = PMKAfter(0.03); + id p4 = PMKAfter(0.04); + + id promises = @[p1, p2, p3, p4]; + + NSProgress *progress = [NSProgress progressWithTotalUnitCount:1]; + [progress becomeCurrentWithPendingUnitCount:1]; + + PMKWhen(promises).catch(^{ + [ex2 fulfill]; + }); + + [progress resignCurrent]; + + PMKJoin(promises).catch(^{ + XCTAssertLessThanOrEqual(1, progress.fractionCompleted); + XCTAssertEqual(progress.completedUnitCount, 1); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testWhenManifolds { + id ex = [self expectationWithDescription:@""]; + id p1 = dispatch_promise(^{ return PMKManifold(@1, @2); }); + id p2 = dispatch_promise(^{}); + PMKWhen(@[p1, p2]).then(^(NSArray *results){ + XCTAssertEqualObjects(results[0], @1); + XCTAssertEqualObjects(results[1], [NSNull null]); + [ex fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_55_all_dictionary { + id ex1 = [self expectationWithDescription:@""]; + + id promises = @{ + @1: @2, + @2: @"abc", + @"a": PMKAfter(0.1).then(^{ return @"HI"; }) + }; + PMKWhen(promises).then(^(NSDictionary *dict){ + XCTAssertEqual(dict.count, 3ul); + XCTAssertEqualObjects(dict[@1], @2); + XCTAssertEqualObjects(dict[@2], @"abc"); + XCTAssertEqualObjects(dict[@"a"], @"HI"); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_56_empty_array_when { + id ex1 = [self expectationWithDescription:@""]; + + PMKWhen(@[]).then(^(NSArray *array){ + XCTAssertEqual(array.count, 0ul); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_57_empty_array_all { + id ex1 = [self expectationWithDescription:@""]; + + PMKWhen(@[]).then(^(NSArray *array){ + XCTAssertEqual(array.count, 0ul); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_18_when { + id ex1 = [self expectationWithDescription:@""]; + + id a = PMKAfter(0.02).then(^{ return @345; }); + id b = PMKAfter(0.03).then(^{ return @345; }); + PMKWhen(@[a, b]).then(^(NSArray *objs){ + XCTAssertEqual(objs.count, 2ul); + XCTAssertEqualObjects(objs[0], objs[1]); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_21_recursive_when { + id domain = @"sdjhfg"; + + id ex1 = [self expectationWithDescription:@""]; + id a = PMKAfter(0.03).then(^{ + return [NSError errorWithDomain:domain code:123 userInfo:nil]; + }); + id b = PMKAfter(0.02); + id c = PMKWhen(@[a, b]); + PMKWhen(c).then(^{ + XCTFail(); + }).catch(^(NSError *e){ + XCTAssertEqualObjects(e.userInfo[PMKFailingPromiseIndexKey], @0); + XCTAssertEqualObjects(e.domain, domain); + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_22_already_resolved_and_bubble { + id ex1 = [self expectationWithDescription:@""]; + id ex2 = [self expectationWithDescription:@""]; + + PMKResolver resolve; + AnyPromise *promise = [[AnyPromise alloc] initWithResolver:&resolve]; + + promise.then(^{ + XCTFail(); + }).catch(^(NSError *e){ + [ex1 fulfill]; + }); + + resolve([NSError errorWithDomain:@"a" code:1 userInfo:nil]); + + PMKWhen(promise).then(^{ + XCTFail(); + }).catch(^{ + [ex2 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_24_some_edge_case { + id ex1 = [self expectationWithDescription:@""]; + id a = PMKAfter(0.02).catch(^{}); + id b = PMKAfter(0.03); + PMKWhen(@[a, b]).then(^(NSArray *objs){ + [ex1 fulfill]; + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_35_when_nil { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithValue:@"35"].then(^{ return nil; }); + PMKWhen(@[PMKAfter(0.02).then(^{ return @1; }), [AnyPromise promiseWithValue:nil], promise]).then(^(NSArray *results){ + XCTAssertEqual(results.count, 3ul); + XCTAssertEqualObjects(results[1], [NSNull null]); + [ex1 fulfill]; + }).catch(^(NSError *err){ + abort(); + }); + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + + +- (void)test_39_when_with_some_values { + id ex1 = [self expectationWithDescription:@""]; + + id p = PMKAfter(0.02); + id v = @1; + PMKWhen(@[p, v]).then(^(NSArray *aa){ + XCTAssertEqual(aa.count, 2ul); + XCTAssertEqualObjects(aa[1], @1); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_40_when_with_all_values { + id ex1 = [self expectationWithDescription:@""]; + + PMKWhen(@[@1, @2]).then(^(NSArray *aa){ + XCTAssertEqualObjects(aa[0], @1); + XCTAssertEqualObjects(aa[1], @2); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_41_when_with_repeated_promises { + id ex1 = [self expectationWithDescription:@""]; + + id p = PMKAfter(0.02); + id v = @1; + PMKWhen(@[p, v, p, v]).then(^(NSArray *aa){ + XCTAssertEqual(aa.count, 4ul); + XCTAssertEqualObjects(aa[1], @1); + XCTAssertEqualObjects(aa[3], @1); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_45_when_which_returns_void { + id ex1 = [self expectationWithDescription:@""]; + + AnyPromise *promise = [AnyPromise promiseWithValue:@1].then(^{}); + PMKWhen(@[promise, [AnyPromise promiseWithValue:@1]]).then(^(NSArray *stuff){ + XCTAssertEqual(stuff.count, 2ul); + XCTAssertEqualObjects(stuff[0], [NSNull null]); + [ex1 fulfill]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)test_when_nil { + NSArray *foo = nil; + NSError *err = PMKWhen(foo).value; + XCTAssertEqual(err.domain, PMKErrorDomain); + XCTAssertEqual(err.code, PMKInvalidUsageError); +} + + +- (void)test_when_bad_input { + id foo = @"a"; + XCTAssertEqual(PMKWhen(foo).value, foo); +} + +@end diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AfterTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AfterTests.swift new file mode 100644 index 00000000..6b587c95 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AfterTests.swift @@ -0,0 +1,52 @@ +import PromiseKit +import XCTest + +class AfterTests: XCTestCase { + func testZero() { + let ex2 = expectation(description: "") + after(seconds: 0).done(ex2.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + let ex3 = expectation(description: "") + after(.seconds(0)).done(ex3.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + #if !SWIFT_PACKAGE + let ex4 = expectation(description: "") + __PMKAfter(0).done{ _ in ex4.fulfill() }.silenceWarning() + waitForExpectations(timeout: 2, handler: nil) + #endif + } + + func testNegative() { + let ex2 = expectation(description: "") + after(seconds: -1).done(ex2.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + let ex3 = expectation(description: "") + after(.seconds(-1)).done(ex3.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + #if !SWIFT_PACKAGE + let ex4 = expectation(description: "") + __PMKAfter(-1).done{ _ in ex4.fulfill() }.silenceWarning() + waitForExpectations(timeout: 2, handler: nil) + #endif + } + + func testPositive() { + let ex2 = expectation(description: "") + after(seconds: 1).done(ex2.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + let ex3 = expectation(description: "") + after(.seconds(1)).done(ex3.fulfill) + waitForExpectations(timeout: 2, handler: nil) + + #if !SWIFT_PACKAGE + let ex4 = expectation(description: "") + __PMKAfter(1).done{ _ in ex4.fulfill() }.silenceWarning() + waitForExpectations(timeout: 2, handler: nil) + #endif + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AsyncTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AsyncTests.swift new file mode 100644 index 00000000..c075aef6 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/AsyncTests.swift @@ -0,0 +1,99 @@ +import PromiseKit +import Dispatch +import XCTest + +private enum Error: Swift.Error { case dummy } + +class AsyncTests: XCTestCase { + + #if swift(>=5.5) + #if canImport(_Concurrency) + @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) + func testAsyncPromiseValue() async throws { + let promise = after(.milliseconds(100)).then(on: nil){ Promise.value(1) } + let value = try await promise.async() + XCTAssertEqual(value, 1) + } + + @available(iOS, deprecated: 13.0) + @available(macOS, deprecated: 10.15) + @available(tvOS, deprecated: 13.0) + @available(watchOS, deprecated: 6.0) + func testAsyncPromiseValue() { + + } + #else + func testAsyncPromiseValue() { + + } + #endif + #else + func testAsyncPromiseValue() { + + } + #endif + + #if swift(>=5.5) + #if canImport(_Concurrency) + @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) + func testAsyncGuaranteeValue() async { + let guarantee = after(.milliseconds(100)).then(on: nil){ Guarantee.value(1) } + let value = await guarantee.async() + XCTAssertEqual(value, 1) + } + + @available(iOS, deprecated: 13.0) + @available(macOS, deprecated: 10.15) + @available(tvOS, deprecated: 13.0) + @available(watchOS, deprecated: 6.0) + func testAsyncGuaranteeValue() { + + } + #else + func testAsyncGuaranteeValue() { + + } + #endif + #else + func testAsyncGuaranteeValue() { + + } + #endif + + #if swift(>=5.5) + #if canImport(_Concurrency) + @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) + func testAsyncPromiseThrow() async throws { + do { + let promise = after(.milliseconds(100)).then(on: nil){ Promise(error: Error.dummy) }.then(on: nil){ Promise.value(1) } + try await _ = promise.async() + XCTAssert(false) + } catch { + switch error as? Error { + case .dummy: + XCTAssert(true) + default: + XCTAssert(false) + } + } + } + + @available(iOS, deprecated: 13.0) + @available(macOS, deprecated: 10.15) + @available(tvOS, deprecated: 13.0) + @available(watchOS, deprecated: 6.0) + func testAsyncPromiseThrow() { + + } + #else + func testAsyncPromiseThrow() { + + } + #endif + #else + func testAsyncPromiseThrow() { + + } + #endif +} + diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CancellableErrorTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CancellableErrorTests.swift new file mode 100644 index 00000000..3eb7212c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CancellableErrorTests.swift @@ -0,0 +1,167 @@ +import Foundation +import PromiseKit +import XCTest + +#if canImport(StoreKit) +import StoreKit +#endif + +class CancellationTests: XCTestCase { + func testCancellation() { + let ex1 = expectation(description: "") + + let p = after(seconds: 0).done { _ in + throw LocalError.cancel + }.done { + XCTFail() + } + p.catch { _ in + XCTFail() + } + p.catch(policy: .allErrors) { + XCTAssertTrue($0.isCancelled) + ex1.fulfill() + } + + waitForExpectations(timeout: 60) + } + + func testThrowCancellableErrorThatIsNotCancelled() { + let expct = expectation(description: "") + + after(seconds: 0).done { _ in + throw LocalError.notCancel + }.done { + XCTFail() + }.catch { + XCTAssertFalse($0.isCancelled) + expct.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testRecoverWithCancellation() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + + let p = after(seconds: 0).done { _ in + throw CocoaError.cancelled + }.recover(policy: .allErrors) { err -> Promise in + ex1.fulfill() + XCTAssertTrue(err.isCancelled) + throw err + }.done { _ in + XCTFail() + } + p.catch { _ in + XCTFail() + } + p.catch(policy: .allErrors) { + XCTAssertTrue($0.isCancelled) + ex2.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testFoundationBridging1() { + let ex = expectation(description: "") + + let p = after(seconds: 0).done { _ in + throw CocoaError.cancelled + } + p.catch { _ in + XCTFail() + } + p.catch(policy: .allErrors) { + XCTAssertTrue($0.isCancelled) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testFoundationBridging2() { + let ex = expectation(description: "") + + let p = Promise().done { + throw URLError.cancelled + } + p.catch { _ in + XCTFail() + } + p.catch(policy: .allErrors) { + XCTAssertTrue($0.isCancelled) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testDoesntCrashSwift() { + #if os(macOS) + // Previously exposed a bridging crash in Swift + // NOTE nobody was brave enough or diligent enough to report this to Apple :{ + // NOTE no Linux test since this constructor doesn’t exist there + XCTAssertFalse(NSError().isCancelled) + #endif + + #if canImport(StoreKit) + do { + let err = SKError(.paymentCancelled) + XCTAssertTrue(err.isCancelled) + throw err + } catch { + XCTAssertTrue(error.isCancelled) + } + + XCTAssertFalse(SKError(.clientInvalid).isCancelled) + + #endif + } + + func testBridgeToNSError() { + // Swift.Error types must be cast to NSError for the bridging to occur. + // The below would throw an expection about an invalid selector without a cast: + // `(error as AnyObject).value(forKey: "domain")` + // This simply checks to make sure `isCancelled` is not making that mistake. + + class TestingError: Error { } + + XCTAssertFalse(TestingError().isCancelled) + } + +#if swift(>=3.2) + func testIsCancelled() { + XCTAssertTrue(PMKError.cancelled.isCancelled) + XCTAssertTrue(URLError.cancelled.isCancelled) + XCTAssertTrue(CocoaError.cancelled.isCancelled) + XCTAssertFalse(CocoaError(_nsError: NSError(domain: NSCocoaErrorDomain, code: CocoaError.Code.coderInvalidValue.rawValue)).isCancelled) + } +#endif +} + +private enum LocalError: CancellableError { + case notCancel + case cancel + + var isCancelled: Bool { + switch self { + case .notCancel: return false + case .cancel: return true + } + } +} + +private extension URLError { + static var cancelled: URLError { + return .init(_nsError: NSError(domain: NSURLErrorDomain, code: URLError.Code.cancelled.rawValue)) + } +} + +private extension CocoaError { + static var cancelled: CocoaError { + return .init(_nsError: NSError(domain: NSCocoaErrorDomain, code: CocoaError.Code.userCancelled.rawValue)) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CatchableTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CatchableTests.swift new file mode 100644 index 00000000..d94b2b6f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/CatchableTests.swift @@ -0,0 +1,267 @@ +import PromiseKit +import Dispatch +import XCTest + +class CatchableTests: XCTestCase { + + func testFinally() { + let finallyQueue = DispatchQueue(label: "\(#file):\(#line)", attributes: .concurrent) + + func helper(error: Error, on queue: DispatchQueue = .main, flags: DispatchWorkItemFlags? = nil) { + let ex = (expectation(description: ""), expectation(description: "")) + var x = 0 + Promise(error: error).catch(policy: .allErrors) { _ in + XCTAssertEqual(x, 0) + x += 1 + ex.0.fulfill() + }.finally(on: queue, flags: flags) { + if let flags = flags, flags.contains(.barrier) { + dispatchPrecondition(condition: .onQueueAsBarrier(queue)) + } else { + dispatchPrecondition(condition: .onQueue(queue)) + } + XCTAssertEqual(x, 1) + x += 1 + ex.1.fulfill() + } + wait(for: [ex.0, ex.1], timeout: 10) + } + + helper(error: Error.dummy) + helper(error: Error.cancelled) + helper(error: Error.dummy, on: finallyQueue) + helper(error: Error.dummy, on: finallyQueue, flags: .barrier) + } + + func testCauterize() { + let ex = expectation(description: "") + let p = Promise(error: Error.dummy) + + // cannot test specifically that this outputs to console, + // but code-coverage will note that the line is run + p.cauterize() + + p.catch { _ in + ex.fulfill() + } + wait(for: [ex], timeout: 1) + } +} + + +/// `Promise.recover` +extension CatchableTests { + func test__void_specialized_full_recover() { + + func helper(error: Swift.Error) { + let ex = expectation(description: "") + Promise(error: error).recover { _ in }.done(ex.fulfill) + wait(for: [ex], timeout: 10) + } + + helper(error: Error.dummy) + helper(error: Error.cancelled) + } + + func test__void_specialized_full_recover__fulfilled_path() { + let ex = expectation(description: "") + Promise().recover { _ in XCTFail() }.done(ex.fulfill) + wait(for: [ex], timeout: 10) + } + + func test__void_specialized_conditional_recover() { + func helper(policy: CatchPolicy, error: Swift.Error, line: UInt = #line) { + let ex = expectation(description: "") + var x = 0 + Promise(error: error).recover(policy: policy) { err in + guard x < 1 else { throw err } + x += 1 + }.done(ex.fulfill).silenceWarning() + wait(for: [ex], timeout: 10) + } + + for error in [Error.dummy as Swift.Error, Error.cancelled] { + helper(policy: .allErrors, error: error) + } + helper(policy: .allErrorsExceptCancellation, error: Error.dummy) + } + + func test__void_specialized_conditional_recover__no_recover() { + + func helper(policy: CatchPolicy, error: Error, line: UInt = #line) { + let ex = expectation(description: "") + Promise(error: error).recover(policy: policy) { err in + throw err + }.catch(policy: .allErrors) { + XCTAssertEqual(error, $0 as? Error) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + for error in [Error.dummy, Error.cancelled] { + helper(policy: .allErrors, error: error) + } + helper(policy: .allErrorsExceptCancellation, error: Error.dummy) + } + + func test__void_specialized_conditional_recover__ignores_cancellation_but_fed_cancellation() { + let ex = expectation(description: "") + Promise(error: Error.cancelled).recover(policy: .allErrorsExceptCancellation) { _ in + XCTFail() + }.catch(policy: .allErrors) { + XCTAssertEqual(Error.cancelled, $0 as? Error) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func test__void_specialized_conditional_recover__fulfilled_path() { + let ex = expectation(description: "") + Promise().recover { _ in + XCTFail() + }.catch { _ in + XCTFail() // this `catch` to ensure we are calling the `recover` variant we think we are + }.finally { + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } +} + + +/// `Promise.recover` +extension CatchableTests { + func test__full_recover() { + + func helper(error: Swift.Error) { + let ex = expectation(description: "") + Promise(error: error).recover { _ in return .value(2) }.done { + XCTAssertEqual($0, 2) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + helper(error: Error.dummy) + helper(error: Error.cancelled) + } + + func test__full_recover__fulfilled_path() { + let ex = expectation(description: "") + Promise.value(1).recover { _ in XCTFail(); return .value(2) }.done{ + XCTAssertEqual($0, 1) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + + func test__conditional_recover() { + func helper(policy: CatchPolicy, error: Swift.Error, line: UInt = #line) { + let ex = expectation(description: "") + var x = 0 + Promise(error: error).recover(policy: policy) { err -> Promise in + guard x < 1 else { throw err } + x += 1 + return .value(x) + }.done { + XCTAssertEqual($0, x) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + for error in [Error.dummy as Swift.Error, Error.cancelled] { + helper(policy: .allErrors, error: error) + } + helper(policy: .allErrorsExceptCancellation, error: Error.dummy) + } + + func test__conditional_recover__no_recover() { + + func helper(policy: CatchPolicy, error: Error, line: UInt = #line) { + let ex = expectation(description: "") + Promise(error: error).recover(policy: policy) { err -> Promise in + throw err + }.catch(policy: .allErrors) { + XCTAssertEqual(error, $0 as? Error) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + for error in [Error.dummy, Error.cancelled] { + helper(policy: .allErrors, error: error) + } + helper(policy: .allErrorsExceptCancellation, error: Error.dummy) + } + + func test__conditional_recover__ignores_cancellation_but_fed_cancellation() { + let ex = expectation(description: "") + Promise(error: Error.cancelled).recover(policy: .allErrorsExceptCancellation) { _ -> Promise in + XCTFail() + return .value(1) + }.catch(policy: .allErrors) { + XCTAssertEqual(Error.cancelled, $0 as? Error) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func test__conditional_recover__fulfilled_path() { + let ex = expectation(description: "") + Promise.value(1).recover { err -> Promise in + XCTFail() + throw err + }.done { + XCTAssertEqual($0, 1) + ex.fulfill() + }.catch { _ in + XCTFail() // this `catch` to ensure we are calling the `recover` variant we think we are + } + wait(for: [ex], timeout: 10) + } + + func testEnsureThen_Error() { + let ex = expectation(description: "") + + Promise.value(1).done { + XCTAssertEqual($0, 1) + throw Error.dummy + }.ensureThen { + after(seconds: 0.01) + }.catch { + XCTAssertEqual(Error.dummy, $0 as? Error) + }.finally { + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testEnsureThen_Value() { + let ex = expectation(description: "") + + Promise.value(1).ensureThen { + after(seconds: 0.01) + }.done { + XCTAssertEqual($0, 1) + }.catch { _ in + XCTFail() + }.finally { + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } +} + +private enum Error: CancellableError { + case dummy + case cancelled + + var isCancelled: Bool { + return self == Error.cancelled + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/DefaultDispatchQueueTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/DefaultDispatchQueueTests.swift new file mode 100644 index 00000000..f9908e26 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/DefaultDispatchQueueTests.swift @@ -0,0 +1,70 @@ +// +// PMKDefaultDispatchQueue.test.swift +// PromiseKit +// +// Created by David Rodriguez on 4/14/16. +// Copyright © 2016 Max Howell. All rights reserved. +// + +import class Foundation.Thread +import PromiseKit +import Dispatch +import XCTest + +private enum Error: Swift.Error { case dummy } + + +class PMKDefaultDispatchQueueTest: XCTestCase { + + let myQueue = DispatchQueue(label: "myQueue") + + override func setUp() { + // can actually only set the default queue once + // - See: PMKSetDefaultDispatchQueue + conf.Q = (myQueue, myQueue) + } + + override func tearDown() { + conf.Q = (.main, .main) + } + + func testOverrodeDefaultThenQueue() { + let ex = expectation(description: "resolving") + + Promise.value(1).then { _ -> Promise in + ex.fulfill() + XCTAssertFalse(Thread.isMainThread) + return Promise() + }.silenceWarning() + + XCTAssertTrue(Thread.isMainThread) + + waitForExpectations(timeout: 1) + } + + func testOverrodeDefaultCatchQueue() { + let ex = expectation(description: "resolving") + + Promise(error: Error.dummy).catch { _ in + ex.fulfill() + XCTAssertFalse(Thread.isMainThread) + } + + XCTAssertTrue(Thread.isMainThread) + + waitForExpectations(timeout: 1) + } + + func testOverrodeDefaultAlwaysQueue() { + let ex = expectation(description: "resolving") + + Promise.value(1).ensure { + ex.fulfill() + XCTAssertFalse(Thread.isMainThread) + }.silenceWarning() + + XCTAssertTrue(Thread.isMainThread) + + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ErrorTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ErrorTests.swift new file mode 100644 index 00000000..d9087d2a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ErrorTests.swift @@ -0,0 +1,22 @@ +import PromiseKit +import XCTest + +class PMKErrorTests: XCTestCase { + func testCustomStringConvertible() { + XCTAssertNotNil(PMKError.invalidCallingConvention.errorDescription) + XCTAssertNotNil(PMKError.returnedSelf.errorDescription) + XCTAssertNotNil(PMKError.badInput.errorDescription) + XCTAssertNotNil(PMKError.cancelled.errorDescription) + XCTAssertNotNil(PMKError.compactMap(1, Int.self).errorDescription) + XCTAssertNotNil(PMKError.emptySequence.errorDescription) + } + + func testCustomDebugStringConvertible() { + XCTAssertFalse(PMKError.invalidCallingConvention.debugDescription.isEmpty) + XCTAssertFalse(PMKError.returnedSelf.debugDescription.isEmpty) + XCTAssertNotNil(PMKError.badInput.debugDescription.isEmpty) + XCTAssertFalse(PMKError.cancelled.debugDescription.isEmpty) + XCTAssertFalse(PMKError.compactMap(1, Int.self).debugDescription.isEmpty) + XCTAssertFalse(PMKError.emptySequence.debugDescription.isEmpty) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/GuaranteeTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/GuaranteeTests.swift new file mode 100644 index 00000000..55d12a71 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/GuaranteeTests.swift @@ -0,0 +1,205 @@ +import PromiseKit +import XCTest + +class GuaranteeTests: XCTestCase { + func testInit() { + let ex = expectation(description: "") + Guarantee { seal in + seal(1) + }.done { + XCTAssertEqual(1, $0) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testMap() { + let ex = expectation(description: "") + + Guarantee.value(1).map { + $0 * 2 + }.done { + XCTAssertEqual(2, $0) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testMapByKeyPath() { + let ex = expectation(description: "") + + Guarantee.value(Person(name: "Max")).map(\.name).done { + XCTAssertEqual("Max", $0) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testWait() { + XCTAssertEqual(after(.milliseconds(100)).map(on: nil){ 1 }.wait(), 1) + } + + func testMapValues() { + let ex = expectation(description: "") + + Guarantee.value([1, 2, 3]) + .mapValues { $0 * 2 } + .done { values in + XCTAssertEqual([2, 4, 6], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testMapValuesByKeyPath() { + let ex = expectation(description: "") + + Guarantee.value([Person(name: "Max"), Person(name: "Roman"), Person(name: "John")]) + .mapValues(\.name) + .done { values in + XCTAssertEqual(["Max", "Roman", "John"], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testFlatMapValues() { + let ex = expectation(description: "") + + Guarantee.value([1, 2, 3]) + .flatMapValues { [$0, $0] } + .done { values in + XCTAssertEqual([1, 1, 2, 2, 3, 3], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testCompactMapValues() { + let ex = expectation(description: "") + + Guarantee.value(["1","2","a","3"]) + .compactMapValues { Int($0) } + .done { values in + XCTAssertEqual([1, 2, 3], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testCompactMapValuesByKeyPath() { + let ex = expectation(description: "") + + Guarantee.value([Person(name: "Max"), Person(name: "Roman", age: 26), Person(name: "John", age: 23)]) + .compactMapValues(\.age) + .done { values in + XCTAssertEqual([26, 23], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testThenMap() { + + let ex = expectation(description: "") + + Guarantee.value([1, 2, 3]) + .thenMap { Guarantee.value($0 * 2) } + .done { values in + XCTAssertEqual([2, 4, 6], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testThenFlatMap() { + + let ex = expectation(description: "") + + Guarantee.value([1, 2, 3]) + .thenFlatMap { Guarantee.value([$0, $0]) } + .done { values in + XCTAssertEqual([1, 1, 2, 2, 3, 3], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testFilterValues() { + + let ex = expectation(description: "") + + Guarantee.value([1, 2, 3]) + .filterValues { $0 > 1 } + .done { values in + XCTAssertEqual([2, 3], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testFilterValuesByKeyPath() { + + let ex = expectation(description: "") + + Guarantee.value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]) + .filterValues(\.isStudent) + .done { values in + XCTAssertEqual([Person(name: "John", age: 23, isStudent: true)], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testSorted() { + + let ex = expectation(description: "") + + Guarantee.value([5, 2, 3, 4, 1]) + .sortedValues() + .done { values in + XCTAssertEqual([1, 2, 3, 4, 5], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testSortedBy() { + + let ex = expectation(description: "") + + Guarantee.value([5, 2, 3, 4, 1]) + .sortedValues { $0 > $1 } + .done { values in + XCTAssertEqual([5, 4, 3, 2, 1], values) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + #if swift(>=3.1) + func testNoAmbiguityForValue() { + let ex = expectation(description: "") + let a = Guarantee.value + let b = Guarantee.value(Void()) + let c = Guarantee.value(()) + when(fulfilled: a, b, c).done { + ex.fulfill() + }.cauterize() + wait(for: [ex], timeout: 10) + } + #endif +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/HangTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/HangTests.swift new file mode 100644 index 00000000..84156d35 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/HangTests.swift @@ -0,0 +1,38 @@ +import PromiseKit +import XCTest + +class HangTests: XCTestCase { + func test() { + let ex = expectation(description: "block executed") + do { + let value = try hang(after(seconds: 0.02).then { _ -> Promise in + ex.fulfill() + return .value(1) + }) + XCTAssertEqual(value, 1) + } catch { + XCTFail("Unexpected error") + } + waitForExpectations(timeout: 0) + } + + enum Error: Swift.Error { + case test + } + + func testError() { + var value = 0 + do { + _ = try hang(after(seconds: 0.02).done { + value = 1 + throw Error.test + }) + XCTAssertEqual(value, 1) + } catch Error.test { + return + } catch { + XCTFail("Unexpected error (expected Error.test)") + } + XCTFail("Expected error but no error was thrown") + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/LoggingTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/LoggingTests.swift new file mode 100644 index 00000000..ab869d1a --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/LoggingTests.swift @@ -0,0 +1,199 @@ +@testable import PromiseKit +import Dispatch +import XCTest + +class LoggingTests: XCTestCase { + /** + The test should emit the following log messages: + + PromiseKit: warning: `wait()` called on main thread! + PromiseKit: warning: pending promise deallocated + PromiseKit:cauterized-error: purposes + This is an error message + */ + func testLogging() { + + var logOutput: String? = nil + + enum ForTesting: Error { + case purposes + } + + // Test Logging to Console, the default behavior + conf.logHandler(.waitOnMainThread) + conf.logHandler(.pendingPromiseDeallocated) + conf.logHandler(.pendingGuaranteeDeallocated) + conf.logHandler(.cauterized(ForTesting.purposes)) + XCTAssertNil(logOutput) + + // Now test no logging + conf.logHandler = { event in } + conf.logHandler(.waitOnMainThread) + conf.logHandler(.pendingPromiseDeallocated) + conf.logHandler(.cauterized(ForTesting.purposes)) + XCTAssertNil(logOutput) + + conf.logHandler = { event in + switch event { + case .waitOnMainThread, .pendingPromiseDeallocated, .pendingGuaranteeDeallocated: + logOutput = "\(event)" + case .cauterized: + // Using an enum with associated value does not convert to a string properly in + // earlier versions of swift + logOutput = "cauterized" + } + } + conf.logHandler(.waitOnMainThread) + XCTAssertEqual(logOutput!, "waitOnMainThread") + logOutput = nil + conf.logHandler(.pendingPromiseDeallocated) + XCTAssertEqual(logOutput!, "pendingPromiseDeallocated") + logOutput = nil + conf.logHandler(.cauterized(ForTesting.purposes)) + XCTAssertEqual(logOutput!, "cauterized") + } + + // Verify waiting on main thread in Promise is logged + func testPromiseWaitOnMainThreadLogged() throws { + + enum ForTesting: Error { + case purposes + } + + var logOutput: String? = nil + conf.logHandler = { event in + logOutput = "\(event)" + } + let promiseResolver = Promise.pending() + let workQueue = DispatchQueue(label: "worker") + workQueue.async { + promiseResolver.resolver.fulfill ("PromiseFulfilled") + } + let promisedString = try promiseResolver.promise.wait() + XCTAssertEqual("PromiseFulfilled", promisedString) + XCTAssertEqual(logOutput!, "waitOnMainThread") + } + + // Verify Promise.cauterize() is logged + func testCauterizeIsLogged() { + + enum ForTesting: Error { + case purposes + } + + var logOutput: String? = nil + conf.logHandler = { event in + switch event { + case .waitOnMainThread, .pendingPromiseDeallocated, .pendingGuaranteeDeallocated: + logOutput = "\(event)" + case .cauterized: + // Using an enum with associated value does not convert to a string properly in + // earlier versions of swift + logOutput = "cauterized" + } + } + func createPromise() -> Promise { + let promiseResolver = Promise.pending() + + let queue = DispatchQueue(label: "workQueue") + queue.async { + promiseResolver.resolver.reject(ForTesting.purposes) + } + return promiseResolver.promise + } + var ex = expectation(description: "cauterize") + firstly { + createPromise() + }.ensure { + ex.fulfill() + }.cauterize() + waitForExpectations(timeout: 1) + ex = expectation(description: "read") + let readQueue = DispatchQueue(label: "readQueue") + readQueue.async { + var outputSet = false + while !outputSet { + if let logOutput = logOutput { + XCTAssertEqual(logOutput, "cauterized") + outputSet = true + ex.fulfill() + } + if !outputSet { + usleep(10000) + } + } + } + waitForExpectations(timeout: 1) + } + + // Verify waiting on main thread in Guarantee is logged + func testGuaranteeWaitOnMainThreadLogged() { + + enum ForTesting: Error { + case purposes + } + + var logOutput: String? = nil + conf.logHandler = { event in + switch event { + case .waitOnMainThread, .pendingPromiseDeallocated, .pendingGuaranteeDeallocated: + logOutput = "\(event)" + case .cauterized: + // Using an enum with associated value does not convert to a string properly in + // earlier versions of swift + logOutput = "cauterized" + } + } + let guaranteeResolve = Guarantee.pending() + let workQueue = DispatchQueue(label: "worker") + workQueue.async { + guaranteeResolve.resolve("GuaranteeFulfilled") + } + let guaranteedString = guaranteeResolve.guarantee.wait() + XCTAssertEqual("GuaranteeFulfilled", guaranteedString) + XCTAssertEqual(logOutput!, "waitOnMainThread") + } + + // Verify pendingPromiseDeallocated is logged + func testPendingPromiseDeallocatedIsLogged() { + + var logOutput: String? = nil + conf.logHandler = { event in + switch event { + case .waitOnMainThread, .pendingPromiseDeallocated, .pendingGuaranteeDeallocated: + logOutput = "\(event)" + case .cauterized: + // Using an enum with associated value does not convert to a string properly in + // earlier versions of swift + logOutput = "cauterized" + } + } + do { + let _ = Promise.pending() + } + XCTAssertEqual ("pendingPromiseDeallocated", logOutput!) + } + + // Verify pendingGuaranteeDeallocated is logged + func testPendingGuaranteeDeallocatedIsLogged() { + + var logOutput: String? = nil + let loggingClosure: (PromiseKit.LogEvent) -> Void = { event in + switch event { + case .waitOnMainThread, .pendingPromiseDeallocated, .pendingGuaranteeDeallocated: + logOutput = "\(event)" + case .cauterized: + // Using an enum with associated value does not convert to a string properly in + // earlier versions of swift + logOutput = "cauterized" + } + } + conf.logHandler = loggingClosure + do { + let _ = Guarantee.pending() + } + XCTAssertEqual ("pendingGuaranteeDeallocated", logOutput!) + } + + //TODO Verify pending promise deallocation is logged +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/PromiseTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/PromiseTests.swift new file mode 100644 index 00000000..fd010a0f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/PromiseTests.swift @@ -0,0 +1,152 @@ +import PromiseKit +import Dispatch +import XCTest + +class PromiseTests: XCTestCase { + func testIsPending() { + XCTAssertTrue(Promise.pending().promise.isPending) + XCTAssertFalse(Promise().isPending) + XCTAssertFalse(Promise(error: Error.dummy).isPending) + } + + func testIsResolved() { + XCTAssertFalse(Promise.pending().promise.isResolved) + XCTAssertTrue(Promise().isResolved) + XCTAssertTrue(Promise(error: Error.dummy).isResolved) + } + + func testIsFulfilled() { + XCTAssertFalse(Promise.pending().promise.isFulfilled) + XCTAssertTrue(Promise().isFulfilled) + XCTAssertFalse(Promise(error: Error.dummy).isFulfilled) + } + + func testIsRejected() { + XCTAssertFalse(Promise.pending().promise.isRejected) + XCTAssertTrue(Promise(error: Error.dummy).isRejected) + XCTAssertFalse(Promise().isRejected) + } + + @available(macOS 10.10, iOS 2.0, tvOS 10.0, watchOS 2.0, *) + func testDispatchQueueAsyncExtensionReturnsPromise() { + let ex = expectation(description: "") + + DispatchQueue.global().async(.promise) { () -> Int in + XCTAssertFalse(Thread.isMainThread) + return 1 + }.done { one in + XCTAssertEqual(one, 1) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + @available(macOS 10.10, iOS 2.0, tvOS 10.0, watchOS 2.0, *) + func testDispatchQueueAsyncExtensionCanThrowInBody() { + let ex = expectation(description: "") + + DispatchQueue.global().async(.promise) { () -> Int in + throw Error.dummy + }.done { _ in + XCTFail() + }.catch { _ in + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testCustomStringConvertible() { + XCTAssertEqual(Promise.pending().promise.debugDescription, "Promise.pending(handlers: 0)") + XCTAssertEqual(Promise().debugDescription, "Promise<()>.fulfilled(())") + XCTAssertEqual(Promise(error: Error.dummy).debugDescription, "Promise.rejected(Error.dummy)") + + XCTAssertEqual("\(Promise.pending().promise)", "Promise(…Int)") + XCTAssertEqual("\(Promise.value(3))", "Promise(3)") + XCTAssertEqual("\(Promise(error: Error.dummy))", "Promise(dummy)") + } + + func testCannotFulfillWithError() { + + // sadly this test proves the opposite :( + // left here so maybe one day we can prevent instantiation of `Promise` + + _ = Promise { seal in + seal.fulfill(Error.dummy) + } + + _ = Promise.pending() + + _ = Promise.value(Error.dummy) + + _ = Promise().map { Error.dummy } + } + +#if swift(>=3.1) + func testCanMakeVoidPromise() { + _ = Promise() + _ = Guarantee() + } +#endif + + enum Error: Swift.Error { + case dummy + } + + func testThrowInInitializer() { + let p = Promise { _ in + throw Error.dummy + } + XCTAssertTrue(p.isRejected) + guard let err = p.error, case Error.dummy = err else { return XCTFail() } + } + + func testThrowInFirstly() { + let ex = expectation(description: "") + + firstly { () -> Promise in + throw Error.dummy + }.catch { + XCTAssertEqual($0 as? Error, Error.dummy) + ex.fulfill() + } + + wait(for: [ex], timeout: 10) + } + + func testWait() throws { + let p = after(.milliseconds(100)).then(on: nil){ Promise.value(1) } + XCTAssertEqual(try p.wait(), 1) + + do { + let p = after(.milliseconds(100)).map(on: nil){ throw Error.dummy } + try p.wait() + XCTFail() + } catch { + XCTAssertEqual(error as? Error, Error.dummy) + } + } + + func testPipeForResolved() { + let ex = expectation(description: "") + Promise.value(1).done { + XCTAssertEqual(1, $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + #if swift(>=3.1) + func testNoAmbiguityForValue() { + let ex = expectation(description: "") + let a = Promise.value + let b = Promise.value(Void()) + let c = Promise.value(()) + when(fulfilled: a, b, c).done { + ex.fulfill() + }.cauterize() + wait(for: [ex], timeout: 10) + } + #endif +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RaceTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RaceTests.swift new file mode 100644 index 00000000..45d7ef0b --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RaceTests.swift @@ -0,0 +1,91 @@ +import XCTest +import PromiseKit + +class RaceTests: XCTestCase { + func test1() { + let ex = expectation(description: "") + race(after(.milliseconds(10)).then{ Promise.value(1) }, after(seconds: 1).map{ 2 }).done { index in + XCTAssertEqual(index, 1) + ex.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func test2() { + let ex = expectation(description: "") + race(after(seconds: 1).map{ 1 }, after(.milliseconds(10)).map{ 2 }).done { index in + XCTAssertEqual(index, 2) + ex.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + } + + func test1Array() { + let ex = expectation(description: "") + let promises = [after(.milliseconds(10)).map{ 1 }, after(seconds: 1).map{ 2 }] + race(promises).done { index in + XCTAssertEqual(index, 1) + ex.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func test2Array() { + let ex = expectation(description: "") + race(after(seconds: 1).map{ 1 }, after(.milliseconds(10)).map{ 2 }).done { index in + XCTAssertEqual(index, 2) + ex.fulfill() + } + waitForExpectations(timeout: 1, handler: nil) + } + + func testEmptyArray() { + let ex = expectation(description: "") + let empty = [Promise]() + race(empty).catch { + guard case PMKError.badInput = $0 else { return XCTFail() } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testFulfilled() { + enum Error: Swift.Error { case test1, test2, test3 } + let ex = expectation(description: "") + let promises: [Promise] = [after(seconds: 1).map { _ in throw Error.test1 }, after(seconds: 2).map { _ in throw Error.test2 }, after(seconds: 5).map { 1 }, after(seconds: 4).map { 2 }, after(seconds: 3).map { _ in throw Error.test3 }] + race(fulfilled: promises).done { + XCTAssertEqual($0, 2) + ex.fulfill() + }.catch { _ in + XCTFail() + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testFulfilledEmptyArray() { + let ex = expectation(description: "") + let empty = [Promise]() + race(fulfilled: empty).catch { + guard case PMKError.badInput = $0 else { return XCTFail() } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testFulfilledWithNoWinner() { + enum Error: Swift.Error { case test1, test2 } + let ex = expectation(description: "") + let promises: [Promise] = [after(seconds: 1).map { _ in throw Error.test1 }, after(seconds: 2).map { _ in throw Error.test2 }] + race(fulfilled: promises).done { _ in + XCTFail() + ex.fulfill() + }.catch { + guard let pmkError = $0 as? PMKError else { return XCTFail() } + guard case .noWinner = pmkError else { return XCTFail() } + guard pmkError.debugDescription == "All thenables passed to race(fulfilled:) were rejected" else { return XCTFail() } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RegressionTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RegressionTests.swift new file mode 100644 index 00000000..8bcb1a00 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/RegressionTests.swift @@ -0,0 +1,27 @@ +import PromiseKit +import XCTest + +class RegressionTests: XCTestCase { + func testReturningPreviousPromiseWorks() { + + // regression test because we were doing this wrong + // in our A+ tests implementation for spec: 2.3.1 + + do { + let promise1 = Promise() + let promise2 = promise1.then(on: nil) { promise1 } + promise2.catch(on: nil) { _ in XCTFail() } + } + do { + enum Error: Swift.Error { case dummy } + + let promise1 = Promise(error: Error.dummy) + let promise2 = promise1.recover(on: nil) { _ in promise1 } + promise2.catch(on: nil) { err in + if case PMKError.returnedSelf = err { + XCTFail() + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ResolverTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ResolverTests.swift new file mode 100644 index 00000000..63b35322 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ResolverTests.swift @@ -0,0 +1,234 @@ +import PromiseKit +import XCTest + +class WrapTests: XCTestCase { + fileprivate class KittenFetcher { + let value: Int? + let error: Error? + + init(value: Int?, error: Error?) { + self.value = value + self.error = error + } + + func fetchWithCompletionBlock(block: @escaping(Int?, Error?) -> Void) { + after(.milliseconds(20)).done { + block(self.value, self.error) + } + } + + func fetchWithCompletionBlock2(block: @escaping(Error?, Int?) -> Void) { + after(.milliseconds(20)).done { + block(self.error, self.value) + } + } + + func fetchWithCompletionBlock3(block: @escaping(Int, Error?) -> Void) { + after(.milliseconds(20)).done { + block(self.value ?? -99, self.error) + } + } + + func fetchWithCompletionBlock4(block: @escaping(Error?) -> Void) { + after(.milliseconds(20)).done { + block(self.error) + } + } + +#if swift(>=5.0) + func fetchWithCompletionBlock5(block: @escaping(Swift.Result) -> Void) { + after(.milliseconds(20)).done { + if let value = self.value { + block(.success(value)) + } else { + block(.failure(self.error!)) + } + } + } +#endif + } + + func testSuccess() { + let ex = expectation(description: "") + let kittenFetcher = KittenFetcher(value: 2, error: nil) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock(block: seal.resolve) + }.done { + XCTAssertEqual($0, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + } + + func testError() { + let ex = expectation(description: "") + + let kittenFetcher = KittenFetcher(value: nil, error: Error.test) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock(block: seal.resolve) + }.catch { error in + defer { ex.fulfill() } + guard case Error.test = error else { + return XCTFail() + } + } + + waitForExpectations(timeout: 1) + } + + func testInvalidCallingConvention() { + let ex = expectation(description: "") + + let kittenFetcher = KittenFetcher(value: nil, error: nil) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock(block: seal.resolve) + }.catch { error in + defer { ex.fulfill() } + guard case PMKError.invalidCallingConvention = error else { + return XCTFail() + } + } + + waitForExpectations(timeout: 1) + } + + func testInvertedCallingConvention() { + let ex = expectation(description: "") + let kittenFetcher = KittenFetcher(value: 2, error: nil) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock2(block: seal.resolve) + }.done { + XCTAssertEqual($0, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + + } + + func testNonOptionalFirstParameter() { + let ex1 = expectation(description: "") + let kf1 = KittenFetcher(value: 2, error: nil) + Promise { seal in + kf1.fetchWithCompletionBlock3(block: seal.resolve) + }.done { + XCTAssertEqual($0, 2) + ex1.fulfill() + }.silenceWarning() + + let ex2 = expectation(description: "") + let kf2 = KittenFetcher(value: -100, error: Error.test) + Promise { seal in + kf2.fetchWithCompletionBlock3(block: seal.resolve) + }.catch { _ in ex2.fulfill() } + + wait(for: [ex1, ex2] ,timeout: 1) + } + +#if swift(>=3.1) + func testVoidCompletionValue() { + let ex1 = expectation(description: "") + let kf1 = KittenFetcher(value: nil, error: nil) + Promise { seal in + kf1.fetchWithCompletionBlock4(block: seal.resolve) + }.done(ex1.fulfill).silenceWarning() + + let ex2 = expectation(description: "") + let kf2 = KittenFetcher(value: nil, error: Error.test) + Promise { seal in + kf2.fetchWithCompletionBlock4(block: seal.resolve) + }.catch { _ in ex2.fulfill() } + + wait(for: [ex1, ex2], timeout: 1) + } +#endif + + func testSwiftResultSuccess() { + #if swift(>=5.0) + let ex = expectation(description: "") + let kittenFetcher = KittenFetcher(value: 2, error: nil) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock5(block: seal.resolve) + }.done { + XCTAssertEqual($0, 2) + ex.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 1) + #endif + } + + func testSwiftResultError() { + #if swift(>=5.0) + let ex = expectation(description: "") + + let kittenFetcher = KittenFetcher(value: nil, error: Error.test) + Promise { seal in + kittenFetcher.fetchWithCompletionBlock5(block: seal.resolve) + }.catch { error in + defer { ex.fulfill() } + guard case Error.test = error else { + return XCTFail() + } + } + + waitForExpectations(timeout: 1) + #endif + } + + func testIsFulfilled() { + XCTAssertTrue(Promise.value(()).result?.isFulfilled ?? false) + XCTAssertFalse(Promise(error: Error.test).result?.isFulfilled ?? true) + } + + func testPendingPromiseDeallocated() { + + // NOTE this doesn't seem to register the `deinit` as covered :( + // BUT putting a breakpoint in the deinit CLEARLY shows it getting covered… + + class Foo { + let p = Promise.pending() + var ex: XCTestExpectation! + + deinit { + after(.milliseconds(100)).done(ex.fulfill) + } + } + + let ex = expectation(description: "") + do { + // for code coverage report for `Resolver.deinit` warning + let foo = Foo() + foo.ex = ex + } + wait(for: [ex], timeout: 10) + } + + func testVoidResolverFulfillAmbiguity() { + #if !swift(>=5) && swift(>=4.1) || swift(>=3.3) && !swift(>=4.0) + // ^^ this doesn’t work with Swift < 3.3 for some reason + // ^^ this doesn’t work with Swift 5.0-beta1 for some reason + + // reference: https://github.com/mxcl/PromiseKit/issues/990 + + func foo(success: () -> Void, failure: (Error) -> Void) { + success() + } + + func bar() -> Promise { + return Promise { (seal: Resolver) in + foo(success: seal.fulfill, failure: seal.reject) + } + } + + let ex = expectation(description: "") + bar().done(ex.fulfill).cauterize() + wait(for: [ex], timeout: 10) + #endif + } +} + +private enum Error: Swift.Error { + case test +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/StressTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/StressTests.swift new file mode 100644 index 00000000..787e485d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/StressTests.swift @@ -0,0 +1,78 @@ +import PromiseKit +import Dispatch +import XCTest + +class StressTests: XCTestCase { + func testThenDataRace() { + let e1 = expectation(description: "") + + //will crash if then doesn't protect handlers + stressDataRace(expectation: e1, stressFunction: { promise in + promise.done { s in + XCTAssertEqual("ok", s) + return + }.silenceWarning() + }, fulfill: { "ok" }) + + waitForExpectations(timeout: 10, handler: nil) + } + + @available(macOS 10.10, iOS 2.0, tvOS 10.0, watchOS 2.0, *) + func testThensAreSequentialForLongTime() { + var values = [Int]() + let ex = expectation(description: "") + var promise = DispatchQueue.global().async(.promise){ 0 } + let N = 1000 + for x in 1.. Guarantee in + values.append(y) + XCTAssertEqual(x - 1, y) + return DispatchQueue.global().async(.promise) { x } + } + } + promise.done { x in + values.append(x) + XCTAssertEqual(values, (0..(expectation e1: XCTestExpectation, iterations: Int = 1000, stressFactor: Int = 10, stressFunction: @escaping (Promise) -> Void, fulfill f: @escaping () -> T) { + let group = DispatchGroup() + let queue = DispatchQueue(label: "the.domain.of.Zalgo", attributes: .concurrent) + + for _ in 0...pending() + + DispatchQueue.concurrentPerform(iterations: stressFactor) { n in + stressFunction(promise) + } + + queue.async(group: group) { + seal.fulfill(f()) + } + } + + group.notify(queue: queue, execute: e1.fulfill) +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ThenableTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ThenableTests.swift new file mode 100644 index 00000000..f004455f --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ThenableTests.swift @@ -0,0 +1,249 @@ +import PromiseKit +import Dispatch +import XCTest + +struct Person: Equatable { + let name: String + let age: Int? + let isStudent: Bool + + init( + name: String = "", + age: Int? = nil, + isStudent: Bool = false + ) { + self.name = name + self.age = age + self.isStudent = isStudent + } +} + +class ThenableTests: XCTestCase { + func testGet() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + Promise.value(1).get { + XCTAssertEqual($0, 1) + ex1.fulfill() + }.done { + XCTAssertEqual($0, 1) + ex2.fulfill() + }.silenceWarning() + wait(for: [ex1, ex2], timeout: 10) + } + + func testMap() { + let ex = expectation(description: "") + Promise.value(1).map { + $0 * 2 + }.done { + XCTAssertEqual($0, 2) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testMapByKeyPath() { + let ex = expectation(description: "") + Promise.value(Person(name: "Max")).map(\.name).done { + XCTAssertEqual($0, "Max") + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testCompactMap() { + let ex = expectation(description: "") + Promise.value(1.0).compactMap { + Int($0) + }.done { + XCTAssertEqual($0, 1) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testCompactMapThrows() { + + enum E: Error { case dummy } + + let ex = expectation(description: "") + Promise.value("a").compactMap { x -> Int in + throw E.dummy + }.catch { + if case E.dummy = $0 {} else { + XCTFail() + } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testRejectedPromiseCompactMap() { + + enum E: Error { case dummy } + + let ex = expectation(description: "") + Promise(error: E.dummy).compactMap { + Int($0) + }.catch { + if case E.dummy = $0 {} else { + XCTFail() + } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testPMKErrorCompactMap() { + let ex = expectation(description: "") + Promise.value("a").compactMap { + Int($0) + }.catch { + if case PMKError.compactMap = $0 {} else { + XCTFail() + } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testCompactMapByKeyPath() { + let ex = expectation(description: "") + Promise.value(Person(name: "Roman", age: 26)).compactMap(\.age).done { + XCTAssertEqual($0, 26) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testMapValues() { + let ex = expectation(description: "") + Promise.value([14, 20, 45]).mapValues { + $0 * 2 + }.done { + XCTAssertEqual([28, 40, 90], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testMapValuesByKeyPath() { + let ex = expectation(description: "") + Promise.value([Person(name: "Max"), Person(name: "Roman"), Person(name: "John")]).mapValues(\.name).done { + XCTAssertEqual(["Max", "Roman", "John"], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testCompactMapValues() { + let ex = expectation(description: "") + Promise.value(["1","2","a","4"]).compactMapValues { + Int($0) + }.done { + XCTAssertEqual([1,2,4], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testCompactMapValuesByKeyPath() { + let ex = expectation(description: "") + Promise.value([Person(name: "Max"), Person(name: "Roman", age: 26), Person(name: "John", age: 23)]).compactMapValues(\.age).done { + XCTAssertEqual([26, 23], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testThenMap() { + let ex = expectation(description: "") + Promise.value([1,2,3,4]).thenMap { + Promise.value($0) + }.done { + XCTAssertEqual([1,2,3,4], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testThenFlatMap() { + let ex = expectation(description: "") + Promise.value([1,2,3,4]).thenFlatMap { + Promise.value([$0, $0]) + }.done { + XCTAssertEqual([1,1,2,2,3,3,4,4], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testFilterValues() { + let ex = expectation(description: "") + Promise.value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]).filterValues { + $0.isStudent + }.done { + XCTAssertEqual([Person(name: "John", age: 23, isStudent: true)], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testFilterValuesByKeyPath() { + let ex = expectation(description: "") + Promise.value([Person(name: "Max"), Person(name: "Roman", age: 26, isStudent: false), Person(name: "John", age: 23, isStudent: true)]).filterValues(\.isStudent).done { + XCTAssertEqual([Person(name: "John", age: 23, isStudent: true)], $0) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testLastValueForEmpty() { + XCTAssertTrue(Promise.value([]).lastValue.isRejected) + } + + func testFirstValueForEmpty() { + XCTAssertTrue(Promise.value([]).firstValue.isRejected) + } + + func testThenOffRejected() { + // surprisingly missing in our CI, mainly due to + // extensive use of `done` in A+ tests since PMK 5 + + let ex = expectation(description: "") + Promise(error: PMKError.badInput).then { x -> Promise in + XCTFail() + return .value(x) + }.catch { _ in + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testBarrier() { + let ex = expectation(description: "") + let q = DispatchQueue(label: "\(#file):\(#line)", attributes: .concurrent) + Promise.value(1).done(on: q, flags: .barrier) { + XCTAssertEqual($0, 1) + dispatchPrecondition(condition: .onQueueAsBarrier(q)) + ex.fulfill() + }.catch { _ in + XCTFail() + } + wait(for: [ex], timeout: 10) + } + + func testDispatchFlagsSyntax() { + let ex = expectation(description: "") + let q = DispatchQueue(label: "\(#file):\(#line)", attributes: .concurrent) + Promise.value(1).done(on: q, flags: [.barrier, .inheritQoS]) { + XCTAssertEqual($0, 1) + dispatchPrecondition(condition: .onQueueAsBarrier(q)) + ex.fulfill() + }.catch { _ in + XCTFail() + } + wait(for: [ex], timeout: 10) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/Utilities.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/Utilities.swift new file mode 100644 index 00000000..6e9bce69 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/Utilities.swift @@ -0,0 +1,33 @@ +import PromiseKit + +extension Promise { + func silenceWarning() {} +} + +#if os(Linux) +import func CoreFoundation._CFIsMainThread + +extension Thread { + // `isMainThread` is not implemented yet in swift-corelibs-foundation. + static var isMainThread: Bool { + return _CFIsMainThread() + } +} + +import XCTest + +extension XCTestCase { + func wait(for: [XCTestExpectation], timeout: TimeInterval, file: StaticString = #file, line: UInt = #line) { + #if !(swift(>=4.0) && !swift(>=4.1)) + let line = Int(line) + #endif + waitForExpectations(timeout: timeout, file: file, line: line) + } +} + +extension XCTestExpectation { + func fulfill() { + fulfill(#file, line: #line) + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenConcurrentTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenConcurrentTests.swift new file mode 100644 index 00000000..1b2c8179 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenConcurrentTests.swift @@ -0,0 +1,190 @@ +import XCTest +import PromiseKit + +class WhenConcurrentTestCase_Swift: XCTestCase { + + func testWhen() { + let e = expectation(description: "") + + var numbers = (0..<42).makeIterator() + let squareNumbers = numbers.map { $0 * $0 } + + let generator = AnyIterator> { + guard let number = numbers.next() else { + return nil + } + + return after(.milliseconds(10)).map { + return number * number + } + } + + when(fulfilled: generator, concurrently: 5).done { numbers in + if numbers == squareNumbers { + e.fulfill() + } + }.silenceWarning() + + waitForExpectations(timeout: 3, handler: nil) + } + + func testWhenEmptyGenerator() { + let e = expectation(description: "") + + let generator = AnyIterator> { + return nil + } + + when(fulfilled: generator, concurrently: 5).done { numbers in + if numbers.count == 0 { + e.fulfill() + } + }.silenceWarning() + + waitForExpectations(timeout: 1, handler: nil) + } + + func testWhenGeneratorError() { + enum LocalError: Error { + case Unknown + case DivisionByZero + } + + let expectedErrorIndex = 42 + let expectedError = LocalError.DivisionByZero + + let e = expectation(description: "") + + var numbers = (-expectedErrorIndex..> { + guard let number = numbers.next() else { + return nil + } + + return after(.milliseconds(10)).then { _ -> Promise in + if number != 0 { + return Promise(error: expectedError) + } else { + return .value(100500 / number) + } + } + } + + when(fulfilled: generator, concurrently: 3) + .catch { error in + guard let error = error as? LocalError else { + return + } + guard case .DivisionByZero = error else { + return + } + e.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } + + func testWhenConcurrency() { + let expectedConcurrently = 4 + var currentConcurrently = 0 + var maxConcurrently = 0 + + let e = expectation(description: "") + + var numbers = (0..<42).makeIterator() + + let generator = AnyIterator> { + currentConcurrently += 1 + maxConcurrently = max(maxConcurrently, currentConcurrently) + + guard let number = numbers.next() else { + return nil + } + + return after(.milliseconds(10)).then(on: .main) { _ -> Promise in + currentConcurrently -= 1 + return .value(number * number) + } + } + + when(fulfilled: generator, concurrently: expectedConcurrently).done { _ in + XCTAssertEqual(expectedConcurrently, maxConcurrently) + e.fulfill() + }.silenceWarning() + + waitForExpectations(timeout: 3) + } + + func testWhenConcurrencyLessThanZero() { + let generator = AnyIterator> { XCTFail(); return nil } + + let p1 = when(fulfilled: generator, concurrently: 0) + let p2 = when(fulfilled: generator, concurrently: -1) + + guard let e1 = p1.error else { return XCTFail() } + guard let e2 = p2.error else { return XCTFail() } + guard case PMKError.badInput = e1 else { return XCTFail() } + guard case PMKError.badInput = e2 else { return XCTFail() } + } + + func testStopsDequeueingOnceRejected() { + let ex = expectation(description: "") + enum Error: Swift.Error { case dummy } + + var x: UInt = 0 + let generator = AnyIterator> { + x += 1 + switch x { + case 0: + fatalError() + case 1: + return Promise() + case 2: + return Promise(error: Error.dummy) + case _: + XCTFail() + return nil + } + } + + when(fulfilled: generator, concurrently: 1).done { + XCTFail("\($0)") + }.catch { error in + ex.fulfill() + } + + waitForExpectations(timeout: 3) + } + + func testWhenResolvedContinuesWhenRejected() { + #if swift(>=5.3) + let ex = expectation(description: "") + enum Error: Swift.Error { case dummy } + + var x: UInt = 0 + let generator = AnyIterator> { + x += 1 + switch x { + case 0: + fatalError() + case 1: + return Promise() + case 2: + return Promise(error: Error.dummy) + case 3: + return Promise() + case _: + return nil + } + } + + when(resolved: generator, concurrently: 1).done { results in + XCTAssertEqual(results.count, 3) + ex.fulfill() + } + + waitForExpectations(timeout: 3) + #endif + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenResolvedTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenResolvedTests.swift new file mode 100644 index 00000000..32bda7bb --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenResolvedTests.swift @@ -0,0 +1,41 @@ +// Created by Austin Feight on 3/19/16. +// Copyright © 2016 Max Howell. All rights reserved. + +import PromiseKit +import XCTest + +class JoinTests: XCTestCase { + func testImmediates() { + let successPromise = Promise() + + var joinFinished = false + when(resolved: successPromise).done(on: nil) { _ in joinFinished = true } + XCTAssert(joinFinished, "Join immediately finishes on fulfilled promise") + + let promise2 = Promise.value(2) + let promise3 = Promise.value(3) + let promise4 = Promise.value(4) + var join2Finished = false + when(resolved: promise2, promise3, promise4).done(on: nil) { _ in join2Finished = true } + XCTAssert(join2Finished, "Join immediately finishes on fulfilled promises") + } + + func testFulfilledAfterAllResolve() { + let (promise1, seal1) = Promise.pending() + let (promise2, seal2) = Promise.pending() + let (promise3, seal3) = Promise.pending() + + var finished = false + when(resolved: promise1, promise2, promise3).done(on: nil) { _ in finished = true } + XCTAssertFalse(finished, "Not all promises have resolved") + + seal1.fulfill_() + XCTAssertFalse(finished, "Not all promises have resolved") + + seal2.fulfill_() + XCTAssertFalse(finished, "Not all promises have resolved") + + seal3.fulfill_() + XCTAssert(finished, "All promises have resolved") + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenTests.swift new file mode 100644 index 00000000..9a6781ac --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/WhenTests.swift @@ -0,0 +1,267 @@ +import PromiseKit +import Dispatch +import XCTest + +class WhenTests: XCTestCase { + + func testEmpty() { + let e1 = expectation(description: "") + let promises: [Promise] = [] + when(fulfilled: promises).done { _ in + e1.fulfill() + }.silenceWarning() + + let e2 = expectation(description: "") + when(resolved: promises).done { _ in + e2.fulfill() + }.silenceWarning() + + wait(for: [e1, e2], timeout: 1) + } + + func testInt() { + let e1 = expectation(description: "") + let p1 = Promise.value(1) + let p2 = Promise.value(2) + let p3 = Promise.value(3) + let p4 = Promise.value(4) + + when(fulfilled: [p1, p2, p3, p4]).done { x in + XCTAssertEqual(x[0], 1) + XCTAssertEqual(x[1], 2) + XCTAssertEqual(x[2], 3) + XCTAssertEqual(x[3], 4) + XCTAssertEqual(x.count, 4) + e1.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func testDoubleTuple() { + let e1 = expectation(description: "") + let p1 = Promise.value(1) + let p2 = Promise.value("abc") + when(fulfilled: p1, p2).done{ x, y in + XCTAssertEqual(x, 1) + XCTAssertEqual(y, "abc") + e1.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func testTripleTuple() { + let e1 = expectation(description: "") + let p1 = Promise.value(1) + let p2 = Promise.value("abc") + let p3 = Promise.value( 1.0) + when(fulfilled: p1, p2, p3).done { u, v, w in + XCTAssertEqual(1, u) + XCTAssertEqual("abc", v) + XCTAssertEqual(1.0, w) + e1.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func testQuadrupleTuple() { + let e1 = expectation(description: "") + let p1 = Promise.value(1) + let p2 = Promise.value("abc") + let p3 = Promise.value(1.0) + let p4 = Promise.value(true) + when(fulfilled: p1, p2, p3, p4).done { u, v, w, x in + XCTAssertEqual(1, u) + XCTAssertEqual("abc", v) + XCTAssertEqual(1.0, w) + XCTAssertEqual(true, x) + e1.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func testQuintupleTuple() { + let e1 = expectation(description: "") + let p1 = Promise.value(1) + let p2 = Promise.value("abc") + let p3 = Promise.value(1.0) + let p4 = Promise.value(true) + let p5 = Promise.value("a" as Character) + when(fulfilled: p1, p2, p3, p4, p5).done { u, v, w, x, y in + XCTAssertEqual(1, u) + XCTAssertEqual("abc", v) + XCTAssertEqual(1.0, w) + XCTAssertEqual(true, x) + XCTAssertEqual("a" as Character, y) + e1.fulfill() + }.silenceWarning() + waitForExpectations(timeout: 1, handler: nil) + } + + func testVoid() { + let e1 = expectation(description: "") + let p1 = Promise.value(1).done { _ in } + let p2 = Promise.value(2).done { _ in } + let p3 = Promise.value(3).done { _ in } + let p4 = Promise.value(4).done { _ in } + + when(fulfilled: p1, p2, p3, p4).done(e1.fulfill).silenceWarning() + + waitForExpectations(timeout: 1, handler: nil) + } + + func testRejected() { + enum Error: Swift.Error { case dummy } + + let e1 = expectation(description: "") + let p1 = after(.milliseconds(100)).map{ true } + let p2: Promise = after(.milliseconds(200)).map{ throw Error.dummy } + let p3 = Promise.value(false) + + when(fulfilled: p1, p2, p3).catch { _ in + e1.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testProgress() { + let ex = expectation(description: "") + + XCTAssertNil(Progress.current()) + + let p1 = after(.milliseconds(10)) + let p2 = after(.milliseconds(20)) + let p3 = after(.milliseconds(30)) + let p4 = after(.milliseconds(40)) + + let progress = Progress(totalUnitCount: 1) + progress.becomeCurrent(withPendingUnitCount: 1) + + when(fulfilled: p1, p2, p3, p4).done { _ in + XCTAssertEqual(progress.completedUnitCount, 1) + ex.fulfill() + }.silenceWarning() + + progress.resignCurrent() + + waitForExpectations(timeout: 1, handler: nil) + } + + func testProgressDoesNotExceed100Percent() { + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + + XCTAssertNil(Progress.current()) + + let p1 = after(.milliseconds(10)) + let p2 = after(.milliseconds(20)).done { throw NSError(domain: "a", code: 1, userInfo: nil) } + let p3 = after(.milliseconds(30)) + let p4 = after(.milliseconds(40)) + + let progress = Progress(totalUnitCount: 1) + progress.becomeCurrent(withPendingUnitCount: 1) + + let promise = when(fulfilled: p1, p2, p3, p4) + + progress.resignCurrent() + + promise.catch { _ in + ex2.fulfill() + } + + var x = 0 + func finally() { + x += 1 + if x == 4 { + XCTAssertLessThanOrEqual(1, progress.fractionCompleted) + XCTAssertEqual(progress.completedUnitCount, 1) + ex1.fulfill() + } + } + + let q = DispatchQueue.main + p1.done(on: q, finally) + p2.ensure(on: q, finally).silenceWarning() + p3.done(on: q, finally) + p4.done(on: q, finally) + + waitForExpectations(timeout: 1, handler: nil) + } + + func testUnhandledErrorHandlerDoesNotFire() { + enum Error: Swift.Error { + case test + } + + let ex = expectation(description: "") + let p1 = Promise(error: Error.test) + let p2 = after(.milliseconds(100)) + when(fulfilled: p1, p2).done{ _ in XCTFail() }.catch { error in + XCTAssertTrue(error as? Error == Error.test) + ex.fulfill() + } + + waitForExpectations(timeout: 1, handler: nil) + } + + func testUnhandledErrorHandlerDoesNotFireForStragglers() { + enum Error: Swift.Error { + case test + case straggler + } + + let ex1 = expectation(description: "") + let ex2 = expectation(description: "") + let ex3 = expectation(description: "") + + let p1 = Promise(error: Error.test) + let p2 = after(.milliseconds(100)).done { throw Error.straggler } + let p3 = after(.milliseconds(200)).done { throw Error.straggler } + + let whenFulfilledP1P2P3: Promise<(Void, Void, Void)> = when(fulfilled: p1, p2, p3) + whenFulfilledP1P2P3.catch { error -> Void in + XCTAssertTrue(Error.test == error as? Error) + ex1.fulfill() + } + + p2.ensure { after(.milliseconds(100)).done(ex2.fulfill) }.silenceWarning() + p3.ensure { after(.milliseconds(100)).done(ex3.fulfill) }.silenceWarning() + + waitForExpectations(timeout: 1, handler: nil) + } + + func testAllSealedRejectedFirstOneRejects() { + enum Error: Swift.Error { + case test1 + case test2 + case test3 + } + + let ex = expectation(description: "") + let p1 = Promise(error: Error.test1) + let p2 = Promise(error: Error.test2) + let p3 = Promise(error: Error.test3) + + let whenFulfilledP1P2P3: Promise = when(fulfilled: p1, p2, p3) + whenFulfilledP1P2P3.catch { error in + XCTAssertTrue(error as? Error == Error.test1) + ex.fulfill() + } + + waitForExpectations(timeout: 1) + } + + func testGuaranteeWhen() { + let ex1 = expectation(description: "") + when(Guarantee(), Guarantee()).done { + ex1.fulfill() + } + + let ex2 = expectation(description: "") + when(guarantees: [Guarantee(), Guarantee()]).done { + ex2.fulfill() + } + + wait(for: [ex1, ex2], timeout: 10) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/XCTestManifests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/XCTestManifests.swift new file mode 100644 index 00000000..7dcb0513 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/XCTestManifests.swift @@ -0,0 +1,326 @@ +#if !canImport(ObjectiveC) +import XCTest + +extension AfterTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__AfterTests = [ + ("testNegative", testNegative), + ("testPositive", testPositive), + ("testZero", testZero), + ] +} + +extension AsyncTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__AsyncTests = [ + ("testAsyncGuaranteeValue", testAsyncGuaranteeValue), + ("testAsyncGuaranteeValue", testAsyncGuaranteeValue), + ("testAsyncPromiseThrow", testAsyncPromiseThrow), + ("testAsyncPromiseThrow", testAsyncPromiseThrow), + ("testAsyncPromiseValue", testAsyncPromiseValue), + ("testAsyncPromiseValue", testAsyncPromiseValue), + ] +} + +extension CancellationTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__CancellationTests = [ + ("testBridgeToNSError", testBridgeToNSError), + ("testCancellation", testCancellation), + ("testDoesntCrashSwift", testDoesntCrashSwift), + ("testFoundationBridging1", testFoundationBridging1), + ("testFoundationBridging2", testFoundationBridging2), + ("testIsCancelled", testIsCancelled), + ("testRecoverWithCancellation", testRecoverWithCancellation), + ("testThrowCancellableErrorThatIsNotCancelled", testThrowCancellableErrorThatIsNotCancelled), + ] +} + +extension CatchableTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__CatchableTests = [ + ("test__conditional_recover", test__conditional_recover), + ("test__conditional_recover__fulfilled_path", test__conditional_recover__fulfilled_path), + ("test__conditional_recover__ignores_cancellation_but_fed_cancellation", test__conditional_recover__ignores_cancellation_but_fed_cancellation), + ("test__conditional_recover__no_recover", test__conditional_recover__no_recover), + ("test__full_recover", test__full_recover), + ("test__full_recover__fulfilled_path", test__full_recover__fulfilled_path), + ("test__void_specialized_conditional_recover", test__void_specialized_conditional_recover), + ("test__void_specialized_conditional_recover__fulfilled_path", test__void_specialized_conditional_recover__fulfilled_path), + ("test__void_specialized_conditional_recover__ignores_cancellation_but_fed_cancellation", test__void_specialized_conditional_recover__ignores_cancellation_but_fed_cancellation), + ("test__void_specialized_conditional_recover__no_recover", test__void_specialized_conditional_recover__no_recover), + ("test__void_specialized_full_recover", test__void_specialized_full_recover), + ("test__void_specialized_full_recover__fulfilled_path", test__void_specialized_full_recover__fulfilled_path), + ("testCauterize", testCauterize), + ("testEnsureThen_Error", testEnsureThen_Error), + ("testEnsureThen_Value", testEnsureThen_Value), + ("testFinally", testFinally), + ] +} + +extension GuaranteeTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__GuaranteeTests = [ + ("testCompactMapValues", testCompactMapValues), + ("testCompactMapValuesByKeyPath", testCompactMapValuesByKeyPath), + ("testFilterValues", testFilterValues), + ("testFilterValuesByKeyPath", testFilterValuesByKeyPath), + ("testFlatMapValues", testFlatMapValues), + ("testInit", testInit), + ("testMap", testMap), + ("testMapByKeyPath", testMapByKeyPath), + ("testMapValues", testMapValues), + ("testMapValuesByKeyPath", testMapValuesByKeyPath), + ("testNoAmbiguityForValue", testNoAmbiguityForValue), + ("testSorted", testSorted), + ("testSortedBy", testSortedBy), + ("testThenFlatMap", testThenFlatMap), + ("testThenMap", testThenMap), + ("testWait", testWait), + ] +} + +extension HangTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__HangTests = [ + ("test", test), + ("testError", testError), + ] +} + +extension JoinTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__JoinTests = [ + ("testFulfilledAfterAllResolve", testFulfilledAfterAllResolve), + ("testImmediates", testImmediates), + ] +} + +extension LoggingTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__LoggingTests = [ + ("testCauterizeIsLogged", testCauterizeIsLogged), + ("testGuaranteeWaitOnMainThreadLogged", testGuaranteeWaitOnMainThreadLogged), + ("testLogging", testLogging), + ("testPendingGuaranteeDeallocatedIsLogged", testPendingGuaranteeDeallocatedIsLogged), + ("testPendingPromiseDeallocatedIsLogged", testPendingPromiseDeallocatedIsLogged), + ("testPromiseWaitOnMainThreadLogged", testPromiseWaitOnMainThreadLogged), + ] +} + +extension PMKDefaultDispatchQueueTest { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PMKDefaultDispatchQueueTest = [ + ("testOverrodeDefaultAlwaysQueue", testOverrodeDefaultAlwaysQueue), + ("testOverrodeDefaultCatchQueue", testOverrodeDefaultCatchQueue), + ("testOverrodeDefaultThenQueue", testOverrodeDefaultThenQueue), + ] +} + +extension PMKErrorTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PMKErrorTests = [ + ("testCustomDebugStringConvertible", testCustomDebugStringConvertible), + ("testCustomStringConvertible", testCustomStringConvertible), + ] +} + +extension PromiseTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__PromiseTests = [ + ("testCanMakeVoidPromise", testCanMakeVoidPromise), + ("testCannotFulfillWithError", testCannotFulfillWithError), + ("testCustomStringConvertible", testCustomStringConvertible), + ("testDispatchQueueAsyncExtensionCanThrowInBody", testDispatchQueueAsyncExtensionCanThrowInBody), + ("testDispatchQueueAsyncExtensionReturnsPromise", testDispatchQueueAsyncExtensionReturnsPromise), + ("testIsFulfilled", testIsFulfilled), + ("testIsPending", testIsPending), + ("testIsRejected", testIsRejected), + ("testIsResolved", testIsResolved), + ("testNoAmbiguityForValue", testNoAmbiguityForValue), + ("testPipeForResolved", testPipeForResolved), + ("testThrowInFirstly", testThrowInFirstly), + ("testThrowInInitializer", testThrowInInitializer), + ("testWait", testWait), + ] +} + +extension RaceTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__RaceTests = [ + ("test1", test1), + ("test1Array", test1Array), + ("test2", test2), + ("test2Array", test2Array), + ("testEmptyArray", testEmptyArray), + ("testFulfilled", testFulfilled), + ("testFulfilledEmptyArray", testFulfilledEmptyArray), + ("testFulfilledWithNoWinner", testFulfilledWithNoWinner), + ] +} + +extension RegressionTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__RegressionTests = [ + ("testReturningPreviousPromiseWorks", testReturningPreviousPromiseWorks), + ] +} + +extension StressTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__StressTests = [ + ("testThenDataRace", testThenDataRace), + ("testThensAreSequentialForLongTime", testThensAreSequentialForLongTime), + ("testZalgoDataRace", testZalgoDataRace), + ] +} + +extension ThenableTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ThenableTests = [ + ("testBarrier", testBarrier), + ("testCompactMap", testCompactMap), + ("testCompactMapByKeyPath", testCompactMapByKeyPath), + ("testCompactMapThrows", testCompactMapThrows), + ("testCompactMapValues", testCompactMapValues), + ("testCompactMapValuesByKeyPath", testCompactMapValuesByKeyPath), + ("testDispatchFlagsSyntax", testDispatchFlagsSyntax), + ("testFilterValues", testFilterValues), + ("testFilterValuesByKeyPath", testFilterValuesByKeyPath), + ("testFirstValueForEmpty", testFirstValueForEmpty), + ("testGet", testGet), + ("testLastValueForEmpty", testLastValueForEmpty), + ("testMap", testMap), + ("testMapByKeyPath", testMapByKeyPath), + ("testMapValues", testMapValues), + ("testMapValuesByKeyPath", testMapValuesByKeyPath), + ("testPMKErrorCompactMap", testPMKErrorCompactMap), + ("testRejectedPromiseCompactMap", testRejectedPromiseCompactMap), + ("testThenFlatMap", testThenFlatMap), + ("testThenMap", testThenMap), + ("testThenOffRejected", testThenOffRejected), + ] +} + +extension WhenConcurrentTestCase_Swift { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__WhenConcurrentTestCase_Swift = [ + ("testStopsDequeueingOnceRejected", testStopsDequeueingOnceRejected), + ("testWhen", testWhen), + ("testWhenConcurrency", testWhenConcurrency), + ("testWhenConcurrencyLessThanZero", testWhenConcurrencyLessThanZero), + ("testWhenEmptyGenerator", testWhenEmptyGenerator), + ("testWhenGeneratorError", testWhenGeneratorError), + ("testWhenResolvedContinuesWhenRejected", testWhenResolvedContinuesWhenRejected), + ] +} + +extension WhenTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__WhenTests = [ + ("testAllSealedRejectedFirstOneRejects", testAllSealedRejectedFirstOneRejects), + ("testDoubleTuple", testDoubleTuple), + ("testEmpty", testEmpty), + ("testGuaranteeWhen", testGuaranteeWhen), + ("testInt", testInt), + ("testProgress", testProgress), + ("testProgressDoesNotExceed100Percent", testProgressDoesNotExceed100Percent), + ("testQuadrupleTuple", testQuadrupleTuple), + ("testQuintupleTuple", testQuintupleTuple), + ("testRejected", testRejected), + ("testTripleTuple", testTripleTuple), + ("testUnhandledErrorHandlerDoesNotFire", testUnhandledErrorHandlerDoesNotFire), + ("testUnhandledErrorHandlerDoesNotFireForStragglers", testUnhandledErrorHandlerDoesNotFireForStragglers), + ("testVoid", testVoid), + ] +} + +extension WrapTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__WrapTests = [ + ("testError", testError), + ("testInvalidCallingConvention", testInvalidCallingConvention), + ("testInvertedCallingConvention", testInvertedCallingConvention), + ("testIsFulfilled", testIsFulfilled), + ("testNonOptionalFirstParameter", testNonOptionalFirstParameter), + ("testPendingPromiseDeallocated", testPendingPromiseDeallocated), + ("testSuccess", testSuccess), + ("testSwiftResultError", testSwiftResultError), + ("testSwiftResultSuccess", testSwiftResultSuccess), + ("testVoidCompletionValue", testVoidCompletionValue), + ("testVoidResolverFulfillAmbiguity", testVoidResolverFulfillAmbiguity), + ] +} + +extension ZalgoTests { + // DO NOT MODIFY: This is autogenerated, use: + // `swift test --generate-linuxmain` + // to regenerate. + static let __allTests__ZalgoTests = [ + ("test1", test1), + ("test2", test2), + ("test3", test3), + ("test4", test4), + ] +} + +public func __allTests() -> [XCTestCaseEntry] { + return [ + testCase(AfterTests.__allTests__AfterTests), + testCase(AsyncTests.__allTests__AsyncTests), + testCase(CancellationTests.__allTests__CancellationTests), + testCase(CatchableTests.__allTests__CatchableTests), + testCase(GuaranteeTests.__allTests__GuaranteeTests), + testCase(HangTests.__allTests__HangTests), + testCase(JoinTests.__allTests__JoinTests), + testCase(LoggingTests.__allTests__LoggingTests), + testCase(PMKDefaultDispatchQueueTest.__allTests__PMKDefaultDispatchQueueTest), + testCase(PMKErrorTests.__allTests__PMKErrorTests), + testCase(PromiseTests.__allTests__PromiseTests), + testCase(RaceTests.__allTests__RaceTests), + testCase(RegressionTests.__allTests__RegressionTests), + testCase(StressTests.__allTests__StressTests), + testCase(ThenableTests.__allTests__ThenableTests), + testCase(WhenConcurrentTestCase_Swift.__allTests__WhenConcurrentTestCase_Swift), + testCase(WhenTests.__allTests__WhenTests), + testCase(WrapTests.__allTests__WrapTests), + testCase(ZalgoTests.__allTests__ZalgoTests), + ] +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ZalgoTests.swift b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ZalgoTests.swift new file mode 100644 index 00000000..e3909b4d --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/CorePromise/ZalgoTests.swift @@ -0,0 +1,59 @@ +import XCTest +import PromiseKit + +class ZalgoTests: XCTestCase { + func test1() { + var resolved = false + Promise.value(1).done(on: nil) { _ in + resolved = true + }.silenceWarning() + XCTAssertTrue(resolved) + } + + func test2() { + let p1 = Promise.value(1).map(on: nil) { x in + return 2 + } + XCTAssertEqual(p1.value!, 2) + + var x = 0 + + let (p2, seal) = Promise.pending() + p2.done(on: nil) { _ in + x = 1 + }.silenceWarning() + XCTAssertEqual(x, 0) + + seal.fulfill(1) + XCTAssertEqual(x, 1) + } + + // returning a pending promise from its own zalgo’d then handler doesn’t hang + func test3() { + let ex = (expectation(description: ""), expectation(description: "")) + + var p1: Promise! + p1 = after(.milliseconds(100)).then(on: nil) { _ -> Promise in + ex.0.fulfill() + return p1 + } + + p1.catch { err in + defer{ ex.1.fulfill() } + guard case PMKError.returnedSelf = err else { return XCTFail() } + } + + waitForExpectations(timeout: 1) + } + + // return a sealed promise from its own zalgo’d then handler doesn’t hang + func test4() { + let ex = expectation(description: "") + let p1 = Promise.value(1) + p1.then(on: nil) { _ -> Promise in + ex.fulfill() + return p1 + }.silenceWarning() + waitForExpectations(timeout: 1) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/DeprecationTests.swift b/Carthage/Checkouts/PromiseKit/Tests/DeprecationTests.swift new file mode 100644 index 00000000..d382ce85 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/DeprecationTests.swift @@ -0,0 +1,158 @@ +import PromiseKit +import XCTest + +class DeprecationTests: XCTestCase { + func testWrap1() { + let dummy = 10 + + func completion(_ body: (_ a: Int?, _ b: Error?) -> Void) { + body(dummy, nil) + } + + let ex = expectation(description: "") + wrap(completion).done { + XCTAssertEqual($0, dummy) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testWrap2() { + let dummy = 10 + + func completion(_ body: (_ a: Int, _ b: Error?) -> Void) { + body(dummy, nil) + } + + let ex = expectation(description: "") + wrap(completion).done { + XCTAssertEqual($0, dummy) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testWrap3() { + let dummy = 10 + + func completion(_ body: (_ a: Error?, _ b: Int?) -> Void) { + body(nil, dummy) + } + + let ex = expectation(description: "") + wrap(completion).done { + XCTAssertEqual($0, dummy) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testWrap4() { + let dummy = 10 + + func completion(_ body: (_ a: Error?) -> Void) { + body(nil) + } + + let ex = expectation(description: "") + wrap(completion).done { + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testWrap5() { + let dummy = 10 + + func completion(_ body: (_ a: Int) -> Void) { + body(dummy) + } + + let ex = expectation(description: "") + wrap(completion).done { + XCTAssertEqual($0, dummy) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testAlways() { + let ex = expectation(description: "") + Promise.value(1).always(execute: ex.fulfill) + wait(for: [ex], timeout: 10) + } + +#if PMKFullDeprecations + func testFlatMap() { + let ex = expectation(description: "") + Promise.value(1).flatMap { _ -> Int? in + nil + }.catch { + //TODO should be `flatMap`, but how to enact that without causing + // compiler to warn when building PromiseKit for end-users? LOL + guard case PMKError.compactMap = $0 else { return XCTFail() } + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testSequenceMap() { + let ex = expectation(description: "") + Promise.value([1, 2]).map { + $0 + 1 + }.done { + XCTAssertEqual($0, [2, 3]) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testSequenceFlatMap() { + let ex = expectation(description: "") + Promise.value([1, 2]).flatMap { + [$0 + 1, $0 + 2] + }.done { + XCTAssertEqual($0, [2, 3, 3, 4]) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } +#endif + + func testSequenceFilter() { + let ex = expectation(description: "") + Promise.value([0, 1, 2, 3]).filter { + $0 < 2 + }.done { + XCTAssertEqual($0, [0, 1]) + ex.fulfill() + }.silenceWarning() + wait(for: [ex], timeout: 10) + } + + func testSorted() { + let ex = expectation(description: "") + Promise.value([5, 2, 1, 8]).sorted().done { + XCTAssertEqual($0, [1,2,5,8]) + ex.fulfill() + } + wait(for: [ex], timeout: 10) + } + + func testFirst() { + XCTAssertEqual(Promise.value([1,2]).first.value, 1) + } + + func testLast() { + XCTAssertEqual(Promise.value([1,2]).last.value, 2) + } + + func testPMKErrorFlatMap() { + XCTAssertNotNil(PMKError.flatMap(1, Int.self).errorDescription) + } +} + + +extension Promise { + func silenceWarning() {} +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/.gitignore b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/.gitignore new file mode 100644 index 00000000..6c0be0ce --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/.gitignore @@ -0,0 +1,63 @@ +# From https://github.com/github/gitignore/blob/master/Node.gitignore + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/AllTests.swift b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/AllTests.swift new file mode 100644 index 00000000..a1fd6445 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/AllTests.swift @@ -0,0 +1,84 @@ +// +// AllTests.swift +// PMKJSA+Tests +// +// Created by Lois Di Qual on 2/28/18. +// + +#if swift(>=3.2) + +import XCTest +import PromiseKit +import JavaScriptCore + +class AllTests: XCTestCase { + + func testAll() { + + let scriptPath = URL(fileURLWithPath: #file).deletingLastPathComponent().appendingPathComponent("build/build.js") + guard FileManager.default.fileExists(atPath: scriptPath.path) else { + return print("Skipping JS-A+: see README for instructions on how to build") + } + + guard let script = try? String(contentsOf: scriptPath) else { + return XCTFail("Couldn't read content of test suite JS file") + } + + let context = JSUtils.sharedContext + + // Add a global exception handler + context.exceptionHandler = { context, exception in + guard let exception = exception else { + return XCTFail("Unknown JS exception") + } + JSUtils.printStackTrace(exception: exception, includeExceptionDescription: true) + } + + // Setup mock functions (timers, console.log, etc) + let environment = MockNodeEnvironment() + environment.setup(with: context) + + // Expose JSPromise in the javascript context + context.setObject(JSPromise.self, forKeyedSubscript: "JSPromise" as NSString) + + // Create adapter + guard let adapter = JSValue(object: NSDictionary(), in: context) else { + fatalError("Couldn't create adapter") + } + adapter.setObject(JSAdapter.resolved, forKeyedSubscript: "resolved" as NSString) + adapter.setObject(JSAdapter.rejected, forKeyedSubscript: "rejected" as NSString) + adapter.setObject(JSAdapter.deferred, forKeyedSubscript: "deferred" as NSString) + + // Evaluate contents of `build.js`, which exposes `runTests` in the global context + context.evaluateScript(script) + guard let runTests = context.objectForKeyedSubscript("runTests") else { + return XCTFail("Couldn't find `runTests` in JS context") + } + + // Create a callback that's called whenever there's a failure + let onFail: @convention(block) (JSValue, JSValue) -> Void = { test, error in + guard let test = test.toString(), let error = error.toString() else { + return XCTFail("Unknown test failure") + } + XCTFail("\(test) failed: \(error)") + } + let onFailValue: JSValue = JSValue(object: onFail, in: context) + + // Create a new callback that we'll send to `runTest` so that it notifies when tests are done running. + let expectation = self.expectation(description: "async") + let onDone: @convention(block) (JSValue) -> Void = { failures in + expectation.fulfill() + } + let onDoneValue: JSValue = JSValue(object: onDone, in: context) + + // If there's a need to only run one specific test, uncomment the next line and comment the one after + // let testName: JSValue = JSValue(object: "2.3.1", in: context) + let testName = JSUtils.undefined + + // Call `runTests` + runTests.call(withArguments: [adapter, onFailValue, onDoneValue, testName]) + self.wait(for: [expectation], timeout: 60) + } +} + +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSAdapter.swift b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSAdapter.swift new file mode 100644 index 00000000..6dcbe74c --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSAdapter.swift @@ -0,0 +1,53 @@ +// +// JSAdapter.swift +// PMKJSA+Tests +// +// Created by Lois Di Qual on 3/2/18. +// + +import Foundation +import JavaScriptCore +import PromiseKit + +enum JSAdapter { + + static let resolved: @convention(block) (JSValue) -> JSPromise = { value in + return JSPromise(promise: .value(value)) + } + + static let rejected: @convention(block) (JSValue) -> JSPromise = { reason in + let error = JSUtils.JSError(reason: reason) + let promise = Promise(error: error) + return JSPromise(promise: promise) + } + + static let deferred: @convention(block) () -> JSValue = { + + let context = JSContext.current() + + guard let object = JSValue(object: NSDictionary(), in: context) else { + fatalError("Couldn't create object") + } + + let pendingPromise = Promise.pending() + let jsPromise = JSPromise(promise: pendingPromise.promise) + + // promise + object.setObject(jsPromise, forKeyedSubscript: "promise" as NSString) + + // resolve + let resolve: @convention(block) (JSValue) -> Void = { value in + pendingPromise.resolver.fulfill(value) + } + object.setObject(resolve, forKeyedSubscript: "resolve" as NSString) + + // reject + let reject: @convention(block) (JSValue) -> Void = { reason in + let error = JSUtils.JSError(reason: reason) + pendingPromise.resolver.reject(error) + } + object.setObject(reject, forKeyedSubscript: "reject" as NSString) + + return object + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSPromise.swift b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSPromise.swift new file mode 100644 index 00000000..70381fd8 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSPromise.swift @@ -0,0 +1,94 @@ +// +// JSPromise.swift +// PMKJSA+Tests +// +// Created by Lois Di Qual on 3/1/18. +// + +import Foundation +import XCTest +import PromiseKit +import JavaScriptCore + +@objc protocol JSPromiseProtocol: JSExport { + func then(_: JSValue, _: JSValue) -> JSPromise +} + +class JSPromise: NSObject, JSPromiseProtocol { + + let promise: Promise + + init(promise: Promise) { + self.promise = promise + } + + func then(_ onFulfilled: JSValue, _ onRejected: JSValue) -> JSPromise { + + // Keep a reference to the returned promise so we can comply to 2.3.1 + var returnedPromiseRef: Promise? + + let afterFulfill = promise.then { value -> Promise in + + // 2.2.1: ignored if not a function + guard JSUtils.isFunction(value: onFulfilled) else { + return .value(value) + } + + // Call `onFulfilled` + // 2.2.5: onFulfilled/onRejected must be called as functions (with no `this` value) + guard let returnValue = try JSUtils.call(function: onFulfilled, arguments: [JSUtils.undefined, value]) else { + return .value(value) + } + + // Extract JSPromise.promise if available, or use plain return value + if let jsPromise = returnValue.toObjectOf(JSPromise.self) as? JSPromise { + + // 2.3.1: if returned value is the promise that `then` returned, throw TypeError + if jsPromise.promise === returnedPromiseRef { + throw JSUtils.JSError(reason: JSUtils.typeError(message: "Returned self")) + } + return jsPromise.promise + } else { + return .value(returnValue) + } + } + + let afterReject = promise.recover { error -> Promise in + + // 2.2.1: ignored if not a function + guard let jsError = error as? JSUtils.JSError, JSUtils.isFunction(value: onRejected) else { + throw error + } + + // Call `onRejected` + // 2.2.5: onFulfilled/onRejected must be called as functions (with no `this` value) + guard let returnValue = try JSUtils.call(function: onRejected, arguments: [JSUtils.undefined, jsError.reason]) else { + throw error + } + + // Extract JSPromise.promise if available, or use plain return value + if let jsPromise = returnValue.toObjectOf(JSPromise.self) as? JSPromise { + + // 2.3.1: if returned value is the promise that `then` returned, throw TypeError + if jsPromise.promise === returnedPromiseRef { + throw JSUtils.JSError(reason: JSUtils.typeError(message: "Returned self")) + } + return jsPromise.promise + } else { + return .value(returnValue) + } + } + + let newPromise = Promise> { resolver in + _ = promise.tap(resolver.fulfill) + }.then(on: nil) { result -> Promise in + switch result { + case .fulfilled: return afterFulfill + case .rejected: return afterReject + } + } + returnedPromiseRef = newPromise + + return JSPromise(promise: newPromise) + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSUtils.swift b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSUtils.swift new file mode 100644 index 00000000..d08a44b4 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/JSUtils.swift @@ -0,0 +1,116 @@ +// +// JSUtils.swift +// PMKJSA+Tests +// +// Created by Lois Di Qual on 3/2/18. +// + +import Foundation +import JavaScriptCore + +enum JSUtils { + + class JSError: Error { + let reason: JSValue + init(reason: JSValue) { + self.reason = reason + } + } + + static let sharedContext: JSContext = { + guard let context = JSContext() else { + fatalError("Couldn't create JS context") + } + return context + }() + + static var undefined: JSValue { + guard let undefined = JSValue(undefinedIn: JSUtils.sharedContext) else { + fatalError("Couldn't create `undefined` value") + } + return undefined + } + + static func typeError(message: String) -> JSValue { + let message = message.replacingOccurrences(of: "\"", with: "\\\"") + let script = "new TypeError(\"\(message)\")" + guard let result = sharedContext.evaluateScript(script) else { + fatalError("Couldn't create TypeError") + } + return result + } + + // @warning: relies on lodash to be present + static func isFunction(value: JSValue) -> Bool { + guard let context = value.context else { + return false + } + guard let lodash = context.objectForKeyedSubscript("_") else { + fatalError("Couldn't get lodash in JS context") + } + guard let result = lodash.invokeMethod("isFunction", withArguments: [value]) else { + fatalError("Couldn't invoke _.isFunction") + } + return result.toBool() + } + + // Calls a JS function using `Function.prototype.call` and throws any potential exception wrapped in a JSError + static func call(function: JSValue, arguments: [JSValue]) throws -> JSValue? { + + let context = JSUtils.sharedContext + + // Create a new exception handler that will store a potential exception + // thrown in the handler. Save the value of the old handler. + var caughtException: JSValue? + let savedExceptionHandler = context.exceptionHandler + context.exceptionHandler = { context, exception in + caughtException = exception + } + + // Call the handler + let returnValue = function.invokeMethod("call", withArguments: arguments) + context.exceptionHandler = savedExceptionHandler + + // If an exception was caught, throw it + if let exception = caughtException { + throw JSError(reason: exception) + } + + return returnValue + } + + static func printCurrentStackTrace() { + guard let exception = JSUtils.sharedContext.evaluateScript("new Error()") else { + return print("Couldn't get current stack trace") + } + printStackTrace(exception: exception, includeExceptionDescription: false) + } + + static func printStackTrace(exception: JSValue, includeExceptionDescription: Bool) { + guard let lineNumber = exception.objectForKeyedSubscript("line"), + let column = exception.objectForKeyedSubscript("column"), + let message = exception.objectForKeyedSubscript("message"), + let stacktrace = exception.objectForKeyedSubscript("stack")?.toString() else { + return print("Couldn't print stack trace") + } + + if includeExceptionDescription { + print("JS Exception at \(lineNumber):\(column): \(message)") + } + + let lines = stacktrace.split(separator: "\n").map { "\t> \($0)" }.joined(separator: "\n") + print(lines) + } +} + +#if !swift(>=3.2) +extension String { + func split(separator: Character, omittingEmptySubsequences: Bool = true) -> [String] { + return characters.split(separator: separator, omittingEmptySubsequences: omittingEmptySubsequences).map(String.init) + } + + var first: Character? { + return characters.first + } +} +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/MockNodeEnvironment.swift b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/MockNodeEnvironment.swift new file mode 100644 index 00000000..82808fe5 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/MockNodeEnvironment.swift @@ -0,0 +1,129 @@ +// +// MockNodeEnvironment.swift +// PMKJSA+Tests +// +// Created by Lois Di Qual on 3/1/18. +// + +#if swift(>=3.2) + +import Foundation +import JavaScriptCore + +class MockNodeEnvironment { + + private var timers: [UInt32: Timer] = [:] + + func setup(with context: JSContext) { + + // console.log / console.error + setupConsole(context: context) + + // setTimeout + let setTimeout: @convention(block) (JSValue, Double) -> UInt32 = { function, intervalMs in + let timerID = self.addTimer(interval: intervalMs / 1000, repeats: false, function: function) + return timerID + } + context.setObject(setTimeout, forKeyedSubscript: "setTimeout" as NSString) + + // clearTimeout + let clearTimeout: @convention(block) (JSValue) -> Void = { timeoutID in + guard timeoutID.isNumber else { + return + } + self.removeTimer(timerID: timeoutID.toUInt32()) + } + context.setObject(clearTimeout, forKeyedSubscript: "clearTimeout" as NSString) + + // setInterval + let setInterval: @convention(block) (JSValue, Double) -> UInt32 = { function, intervalMs in + let timerID = self.addTimer(interval: intervalMs / 1000, repeats: true, function: function) + return timerID + } + context.setObject(setInterval, forKeyedSubscript: "setInterval" as NSString) + + // clearInterval + let clearInterval: @convention(block) (JSValue) -> Void = { intervalID in + guard intervalID.isNumber else { + return + } + self.removeTimer(timerID: intervalID.toUInt32()) + } + context.setObject(clearInterval, forKeyedSubscript: "clearInterval" as NSString) + } + + private func setupConsole(context: JSContext) { + + guard let console = context.objectForKeyedSubscript("console") else { + fatalError("Couldn't get global `console` object") + } + + let consoleLog: @convention(block) () -> Void = { + guard let arguments = JSContext.currentArguments(), let format = arguments.first as? JSValue else { + return + } + + let otherArguments = arguments.dropFirst() + if otherArguments.count == 0 { + print(format) + } else { + + let otherArguments = otherArguments.compactMap { $0 as? JSValue } + let format = format.toString().replacingOccurrences(of: "%s", with: "%@") + let expectedTypes = format.split(separator: "%", omittingEmptySubsequences: false).dropFirst().compactMap { $0.first }.map { String($0) } + + let typedArguments = otherArguments.enumerated().compactMap { index, value -> CVarArg? in + let expectedType = expectedTypes[index] + let converted: CVarArg + switch expectedType { + case "s": converted = value.toString() + case "d": converted = value.toInt32() + case "f": converted = value.toDouble() + default: converted = value.toString() + } + return converted + } + + let output = String(format: format, arguments: typedArguments) + print(output) + } + } + console.setObject(consoleLog, forKeyedSubscript: "log" as NSString) + console.setObject(consoleLog, forKeyedSubscript: "error" as NSString) + } + + private func addTimer(interval: TimeInterval, repeats: Bool, function: JSValue) -> UInt32 { + let block = BlockOperation { + DispatchQueue.main.async { + function.call(withArguments: []) + } + } + let timer = Timer.scheduledTimer(timeInterval: interval, target: block, selector: #selector(Operation.main), userInfo: nil, repeats: repeats) + let rawHash = UUID().uuidString.hashValue + #if swift(>=4.0) + let hash = UInt32(truncatingIfNeeded: rawHash) + #else + let hash = UInt32(truncatingBitPattern: rawHash) + #endif + timers[hash] = timer + return hash + } + + private func removeTimer(timerID: UInt32) { + guard let timer = timers[timerID] else { + return print("Couldn't find timer \(timerID)") + } + timer.invalidate() + timers[timerID] = nil + } +} + + +#if swift(>=4.0) && !swift(>=4.1) || !swift(>=3.3) +extension Sequence { + func compactMap(_ transform: (Self.Element) throws -> T?) rethrows -> [T] { + return try flatMap(transform) + } +} +#endif +#endif diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/README.md b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/README.md new file mode 100644 index 00000000..05ab7f9e --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/README.md @@ -0,0 +1,75 @@ +Promises/A+ Compliance Test Suite (JavaScript) +============================================== + +What is this? +------------- + +This contains the necessary Swift and JS files to run the Promises/A+ compliance test suite from PromiseKit's unit tests. + + - Promise/A+ Spec: + - Compliance Test Suite: + +Run tests +--------- + +``` +$ npm install +$ npm run build +``` + +then open `PromiseKit.xcodeproj` and run the `PMKJSA+Tests` unit test scheme. + +Known limitations +----------------- + +See `ignoredTests` in `index.js`. + + + - 2.3.3 is disabled: Otherwise, if x is an object or function. This spec is a NOOP for Swift: + - We have decided not to interact with other Promises A+ implementations + - functions cannot have properties + +Upgrade the test suite +---------------------- + +``` +$ npm install --save promises-aplus-tests@latest +$ npm run build +``` + +Develop +------- + +JavaScriptCore is a bit tedious to work with so here are a couple tips in case you're trying to debug the test suite. + +If you're editing JS files, enable live rebuilds: + +``` +$ npm run watch +``` + +If you're editing Swift files, a couple things you can do: + + - You can adjust `testName` in `AllTests.swift` to only run one test suite + - You can call `JSUtils.printCurrentStackTrace()` at any time. It won't contain line numbers but some of the frame names might help. + +How it works +------------ + +The Promises/A+ test suite is written in JavaScript but PromiseKit is written in Swift/ObjC. For the test suite to run against swift code, we expose a promise wrapper `JSPromise` inside a JavaScriptCore context. This is done in a regular XCTestCase. + +Since JavaScriptCore doesn't support CommonJS imports, we inline all the JavaScript code into `build/build.js` using webpack. This includes all the npm dependencies (`promises-aplus-tests`, `mocha`, `sinon`, etc) as well as the glue code in `index.js`. + +`build.js` exposes one global variable `runTests(adapter, onFail, onDone, [testName])`. In our XCTestCase, a shared JavaScriptCore context is created, `build.js` is evaluated and now `runTests` is accessible from the Swift context. + +In our swift test, we create a JS-bridged `JSPromise` which only has one method `then(onFulfilled, onRejected) -> Promise`. It wraps a swift `Promise` and delegates call `then` calls to it. + +An [adapter](https://github.com/promises-aplus/promises-tests#adapters) – plain JS object which provides `revoled(value), rejected(reason), and deferred()` – is passed to `runTests` to run the whole JavaScript test suite. + +Errors and end events are reported back to Swift and piped to `XCTFail()` if necessary. + +Since JavaScriptCore isn't a node/web environment, there is quite a bit of stubbing necessary for all this to work: + + - The `fs` module is stubbed with an empty function + - `console.log` redirects to `Swift.print` and provides only basic format parsing + - `setTimeout/setInterval` are implemented with `Swift.Timer` behind the scenes and stored in a `[TimerID: Timer]` map. diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/index.js b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/index.js new file mode 100644 index 00000000..d18e0468 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/index.js @@ -0,0 +1,42 @@ +const _ = require('lodash') +require('mocha') + +// Ignored by design +const ignoredTests = [ + '2.3.3' +] + +module.exports = function(adapter, onFail, onDone, testName) { + + global.adapter = adapter + const mocha = new Mocha({ ui: 'bdd' }) + + // Require all tests + console.log('Loading test files') + const requireTest = require.context('promises-aplus-tests/lib/tests', false, /\.js$/) + requireTest.keys().forEach(file => { + + let currentTestName = _.replace(_.replace(file, './', ''), '.js', '') + if (testName && currentTestName !== testName) { + return + } + + if (_.includes(ignoredTests, currentTestName)) { + return + } + + console.log(`\t${currentTestName}`) + mocha.suite.emit('pre-require', global, file, mocha) + mocha.suite.emit('require', requireTest(file), file, mocha) + mocha.suite.emit('post-require', global, file, mocha) + }) + + const runner = mocha.run(failures => { + onDone(failures) + }) + + runner.on('fail', (test, err) => { + console.error(err) + onFail(test.title, err) + }) +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package-lock.json b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package-lock.json new file mode 100644 index 00000000..273f8002 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package-lock.json @@ -0,0 +1,8036 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@sinonjs/formatio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz", + "integrity": "sha512-ls6CAMA6/5gG+O/IdsBcblvnd8qcO/l1TYoNeAzp3wcISOxlPXQEus0mLcdwazEkWjaBdaJ3TaxmNgCLWwvWzg==", + "requires": { + "samsam": "1.3.0" + }, + "dependencies": { + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==" + } + } + }, + "acorn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.0.tgz", + "integrity": "sha512-arn53F07VXmls4o4pUhSzBa4fvaagPRe7AVZ8l7NHxFWUie2DsuFSBMMNAkgzRlOhEhzAnxeKyaWVzOH4xqp/g==" + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "requires": { + "acorn": "^5.0.0" + } + }, + "ajv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.0.tgz", + "integrity": "sha1-r6wpW7qgFSRJ5SJ0LkVHwa6TKNI=", + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "ajv-keywords": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.1.0.tgz", + "integrity": "sha1-rCsnk5xUPpXSwG5/f1wnvkqlQ74=" + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=" + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "ast-types": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.1.tgz", + "integrity": "sha512-UY7+9DPzlJ9VM8eY0b2TUZcZvF+1pO0hzMtAyjBYKhOmnvRlqYNYnWdtsMj0V16CGaMlpL0G1jnLbLo4AyotuQ==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.3.tgz", + "integrity": "sha512-PeN29YvOynPMvNk7QCzsHqxpmfXwKAC+uxkiSNFQsmXBBVltzEkVWmv/Ip3tx7yk149dQUwk497bTXNu+DZjLA==", + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "requires": { + "babel-plugin-syntax-class-constructor-call": "^6.18.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "requires": { + "babel-plugin-syntax-export-extensions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.24.1", + "babel-plugin-transform-es2015-classes": "^6.24.1", + "babel-plugin-transform-es2015-computed-properties": "^6.24.1", + "babel-plugin-transform-es2015-destructuring": "^6.22.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", + "babel-plugin-transform-es2015-for-of": "^6.22.0", + "babel-plugin-transform-es2015-function-name": "^6.24.1", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", + "babel-plugin-transform-es2015-modules-umd": "^6.24.1", + "babel-plugin-transform-es2015-object-super": "^6.24.1", + "babel-plugin-transform-es2015-parameters": "^6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", + "babel-plugin-transform-regenerator": "^6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "requires": { + "babel-plugin-transform-class-constructor-call": "^6.24.1", + "babel-plugin-transform-export-extensions": "^6.22.0", + "babel-preset-stage-2": "^6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "binaryextensions": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", + "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "caniuse-lite": { + "version": "1.0.30000812", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000812.tgz", + "integrity": "sha512-j+l55ayQ9BO4Sy9iVfbf99+G+4ddAmkXoiEt73WCW4vJ83usrlHzDkFEnNXe5/swkVqE7YBm5i8M2uRXlx9vWg==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "requires": { + "ansi-styles": "^3.2.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chokidar": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", + "integrity": "sha512-l32Hw3wqB0L2kGVmSbK/a+xXLDrUEsc84pSgMkmwygHvD7ubRsP/vxxHa5BtB6oix1XLLVCHyYMsckRXxThmZw==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "chrome-trace-event": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz", + "integrity": "sha1-kPNohdU0WlBiEzLwcXtZWIPV2YI=" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=" + }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + } + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "requires": { + "inherits": "^2.0.1", + "process-nextick-args": "^1.0.6", + "through2": "^2.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codecov": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.0.0.tgz", + "integrity": "sha1-wnO4xPEpRXI+jcnSWAPYk0Pl8o4=", + "requires": { + "argv": "0.0.2", + "request": "2.81.0", + "urlgrey": "0.4.4" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + } + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.x.x" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "dargs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-5.1.0.tgz", + "integrity": "sha1-7H6lDHhWTNNsnV7Bj2Yyn63ieCk=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-conflict": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/detect-conflict/-/detect-conflict-1.0.1.tgz", + "integrity": "sha1-CIZXpmqWHAUBnbfEIwiDsca0F24=" + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "^2.0.0" + } + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", + "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==" + }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=" + }, + "electron-to-chromium": { + "version": "1.3.35", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.35.tgz", + "integrity": "sha1-aTwXz7k4QdOMtZuN8BnRfjVphfA=" + }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "requires": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=" + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "first-chunk-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz", + "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "flow-parser": { + "version": "0.66.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.66.0.tgz", + "integrity": "sha1-vlg/77ARkqpRZEFdMaYkGzVxiYM=" + }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "requires": { + "samsam": "~1.1" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^0.4.1", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "optional": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "optional": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "optional": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "optional": true, + "requires": { + "mime-db": "~1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "request": "2.81.0", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "optional": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "gh-got": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gh-got/-/gh-got-6.0.0.tgz", + "integrity": "sha512-F/mS+fsWQMo1zfgG9MD8KWvTWPPzzhuVwY++fhQ5Ggd+0P+CAMHtzMZhNxG+TqGfHDChJKsbh6otfMGqO2AKBw==", + "requires": { + "got": "^7.0.0", + "is-plain-obj": "^1.1.0" + } + }, + "github-username": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/github-username/-/github-username-4.1.0.tgz", + "integrity": "sha1-y+KABBiDIG2kISrp5LXxacML9Bc=", + "requires": { + "gh-got": "^6.0.0" + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "glob-all": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz", + "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=", + "requires": { + "glob": "^7.0.5", + "yargs": "~1.2.6" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" + }, + "yargs": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz", + "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=", + "requires": { + "minimist": "^0.1.0" + } + } + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "grouped-queue": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/grouped-queue/-/grouped-queue-0.3.3.tgz", + "integrity": "sha1-wWfSpTGcWg4JZO9qJbfC34mWyFw=", + "requires": { + "lodash": "^4.17.2" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "^2.0.1" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "invariant": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.3.tgz", + "integrity": "sha512-7Z5PPegwDTyjbaeCnV0efcyS6vdKAU51kpEmS7QFib3P4822l8ICYyMn7qvJnc+WzLoDsuI9gPMKbJ8pCu8XtA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "requires": { + "is-number": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + } + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-scoped": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-scoped/-/is-scoped-1.0.0.tgz", + "integrity": "sha1-RJypgpnnEwOCViieyytUDcQ3yzA=", + "requires": { + "scoped-regex": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istextorbinary": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", + "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", + "requires": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + } + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jscodeshift": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.4.1.tgz", + "integrity": "sha512-iOX6If+hsw0q99V3n31t4f5VlD1TQZddH08xbT65ZqA7T4Vkx68emrDZMUOLVvCEAJ6NpAk7DECe3fjC/t52AQ==", + "requires": { + "async": "^1.5.0", + "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.9.0", + "babel-preset-stage-1": "^6.5.0", + "babel-register": "^6.9.0", + "babylon": "^6.17.3", + "colors": "^1.1.2", + "flow-parser": "^0.*", + "lodash": "^4.13.1", + "micromatch": "^2.3.7", + "node-dir": "0.1.8", + "nomnom": "^1.8.1", + "recast": "^0.12.5", + "temp": "^0.8.1", + "write-file-atomic": "^1.2.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "recast": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.12.9.tgz", + "integrity": "sha512-y7ANxCWmMW8xLOaiopiRDlyjQ9ajKRENBH+2wjntIbk3A6ZR1+BLQttkmSHMY7Arl+AAZFwJ10grg2T6f1WI8A==", + "requires": { + "ast-types": "0.10.1", + "core-js": "^2.4.1", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "requires": { + "set-getter": "^0.1.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "listr": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", + "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.2.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.0.0-beta.11", + "stream-to-observable": "^0.1.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=" + }, + "listr-update-renderer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", + "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "log-symbols": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", + "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + } + } + }, + "lolex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "requires": { + "pify": "^3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + } + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "mem-fs": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/mem-fs/-/mem-fs-1.1.3.tgz", + "integrity": "sha1-uK6NLj/Lb10/kWXBLUVRoGXZicw=", + "requires": { + "through2": "^2.0.0", + "vinyl": "^1.1.0", + "vinyl-file": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "mem-fs-editor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mem-fs-editor/-/mem-fs-editor-3.0.2.tgz", + "integrity": "sha1-3Qpuryu4prN3QAZ6pUnrUwEFr58=", + "requires": { + "commondir": "^1.0.1", + "deep-extend": "^0.4.0", + "ejs": "^2.3.1", + "glob": "^7.0.3", + "globby": "^6.1.0", + "mkdirp": "^0.5.0", + "multimatch": "^2.0.0", + "rimraf": "^2.2.8", + "through2": "^2.0.0", + "vinyl": "^2.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", + "integrity": "sha512-SlIz6sv5UPaAVVFRKodKjCg48EbNoIhgetzfK/Cy0v5U52Z6zB136M8tp0UC9jM53LYbmIRihJszvvqpKkfm9g==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mimic-response": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.0.tgz", + "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.1.tgz", + "integrity": "sha512-SpwyojlnE/WRBNGtvJSNfllfm5PqEDFxcWluSIgLeSBJtXG4DmoX2NNAeEA7rP5kK+79VgtVq8nG6HskaL1ykg==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", + "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==", + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", + "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==" + }, + "nise": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.7.tgz", + "integrity": "sha512-8LqP1pFLB1v5QU8KlT2WqWzhMRJ3o9LwnZHz+VCbVB8rTsRTFCjtOYv/BatcmLOWp21NedTrErVGinfxe6XYtA==", + "requires": { + "@sinonjs/formatio": "^2.0.0", + "just-extend": "^1.1.27", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "lolex": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", + "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==" + } + } + }, + "node-dir": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.8.tgz", + "integrity": "sha1-VfuN62mQcHB/tn+RpGDwRIKUx30=" + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + } + }, + "nomnom": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", + "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" + }, + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "requires": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-lazy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", + "integrity": "sha1-7FPIAvLuOsKPFmzILQsrAt4nqDU=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "prettier": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", + "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==" + }, + "pretty-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promises-aplus-tests": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/promises-aplus-tests/-/promises-aplus-tests-2.1.2.tgz", + "integrity": "sha1-drfFY4locghhlpz7zYeVr9J0iFw=", + "requires": { + "mocha": "^2.5.3", + "sinon": "^1.10.3", + "underscore": "~1.8.3" + }, + "dependencies": { + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=" + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + } + }, + "sinon": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "requires": { + "formatio": "1.1.1", + "lolex": "1.3.2", + "samsam": "1.1.2", + "util": ">=0.10.3 <1" + } + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=" + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", + "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "requires": { + "duplexify": "^3.5.3", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-chunk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz", + "integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=", + "requires": { + "pify": "^3.0.0", + "safe-buffer": "^5.1.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "recast": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.13.2.tgz", + "integrity": "sha512-Xqo0mKljGUWGUhnkdbODk7oJGFrMcpgKQ9cCyZ4y+G9VfoTKdum8nHbf/SxIdKx5aBSZ29VpVy20bTyt7jyC8w==", + "requires": { + "ast-types": "0.10.2", + "esprima": "~4.0.0", + "private": "~0.1.5", + "source-map": "~0.6.1" + }, + "dependencies": { + "ast-types": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.10.2.tgz", + "integrity": "sha512-ufWX953VU1eIuWqxS0nRDMYlGyFH+yxln5CsmIHlpzEt3fdYqUnRtsFt0XAsQot8OaVCwFqxT1RiwvtzYjeYeg==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "~0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "^2.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "samsam": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=" + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "scoped-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scoped-regex/-/scoped-regex-1.0.0.tgz", + "integrity": "sha1-o0a7Gs1CB65wvXwMfKnlZra63bg=" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "requires": { + "to-object-path": "^0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.4.2.tgz", + "integrity": "sha512-cpOHpnRyY3Dk9dTHBYMfVBB0HUCSKIpxW07X6OGW2NiYPovs4AkcL8Q8MzecbAROjbfRA9esJCmlZgikxDz7DA==", + "requires": { + "@sinonjs/formatio": "^2.0.0", + "diff": "^3.1.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^5.1.0", + "type-detect": "^4.0.5" + }, + "dependencies": { + "lolex": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", + "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==" + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^2.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.x.x" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "requires": { + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "ssri": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.2.4.tgz", + "integrity": "sha512-UnEAgMZa15973iH7cUi0AHjJn1ACDIkaMyZILoqwN6yzt+4P81I8tBc5Hl+qwi5auMplZtPQsHrPBR5vJLcQtQ==", + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "stream-to-observable": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", + "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=" + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-bom-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz", + "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco=", + "requires": { + "first-chunk-stream": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==" + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + } + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "textextensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", + "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "requires": { + "punycode": "^1.4.1" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.2.tgz", + "integrity": "sha512-CG/NvzXfemUAm5Y4Guh5eEaJYHtkG7kKNpXEJHp9QpxsFVB5/qKvYWoMaq4sa99ccZ0hM3MK8vQV9XPZB4357A==", + "requires": { + "cacache": "^10.0.1", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.2", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "upath": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.4.tgz", + "integrity": "sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=" + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "requires": { + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "lazy-cache": "^2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "v8-compile-cache": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz", + "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA==" + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + }, + "vinyl-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-2.0.0.tgz", + "integrity": "sha1-p+v1/779obfRjRQPyweyI++2dRo=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^2.0.0", + "vinyl": "^1.1.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=" + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", + "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.0.1.tgz", + "integrity": "sha512-jHQNMmKPElreOYLCxR7SHfPnbhcqRT9O7lYPOMDR6Gt5XueJ7tH7JReXm4uMFstBKf7rj2Y7AD3LiMKR2zexYA==", + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^0.1.1", + "enhanced-resolve": "^4.0.0", + "eslint-scope": "^3.7.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.2", + "tapable": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.1.1", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1" + } + }, + "webpack-addons": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/webpack-addons/-/webpack-addons-1.1.5.tgz", + "integrity": "sha512-MGO0nVniCLFAQz1qv22zM02QPjcpAoJdy7ED0i3Zy7SY1IecgXCm460ib7H/Wq7e9oL5VL6S2BxaObxwIcag0g==", + "requires": { + "jscodeshift": "^0.4.0" + } + }, + "webpack-cli": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.0.9.tgz", + "integrity": "sha512-KIkOFHhrq8W7ovg5u8M7Xbduzr1aQ1Ch1aGGY0TvL5neO81T6/aCZ/NeG7R92UaXIF/BK4KCkla35wtoOoxyDQ==", + "requires": { + "chalk": "^2.0.1", + "codecov": "^3.0.0", + "cross-spawn": "^5.1.0", + "diff": "^3.3.0", + "enhanced-resolve": "^3.4.1", + "glob-all": "^3.1.0", + "global": "^4.3.2", + "global-modules": "^1.0.0", + "got": "^7.1.0", + "inquirer": "^3.2.0", + "interpret": "^1.0.4", + "jscodeshift": "^0.4.0", + "listr": "^0.12.0", + "loader-utils": "^1.1.0", + "lodash": "^4.17.4", + "log-symbols": "2.1.0", + "mkdirp": "^0.5.1", + "p-each-series": "^1.0.0", + "p-lazy": "^1.0.0", + "prettier": "^1.5.3", + "recast": "^0.13.0", + "resolve-cwd": "^2.0.0", + "supports-color": "^4.4.0", + "uglifyjs-webpack-plugin": "^1.2.2", + "v8-compile-cache": "^1.1.0", + "webpack-addons": "^1.1.5", + "webpack-fork-yeoman-generator": "^1.1.1", + "yargs": "9.0.1", + "yeoman-environment": "^2.0.0" + }, + "dependencies": { + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + } + } + }, + "webpack-fork-yeoman-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webpack-fork-yeoman-generator/-/webpack-fork-yeoman-generator-1.1.1.tgz", + "integrity": "sha512-TrLT6Bw6gl9rJA7iZw+YJ+4xHhEUzfOQB3tHpyINBFdZDmO0tlDW9MtMSMZ5rsUNjHxcEba5yuGaAW86J84j/w==", + "requires": { + "async": "^2.0.0", + "chalk": "^1.0.0", + "cli-table": "^0.3.1", + "cross-spawn": "^5.0.1", + "dargs": "^5.1.0", + "dateformat": "^2.0.0", + "debug": "^2.1.0", + "detect-conflict": "^1.0.0", + "error": "^7.0.2", + "find-up": "^2.1.0", + "github-username": "^4.0.0", + "istextorbinary": "^2.1.0", + "lodash": "^4.11.1", + "mem-fs-editor": "^3.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.0", + "pretty-bytes": "^4.0.2", + "read-chunk": "^2.0.0", + "read-pkg-up": "^2.0.0", + "rimraf": "^2.2.0", + "run-async": "^2.0.0", + "shelljs": "^0.7.0", + "text-table": "^0.2.0", + "through2": "^2.0.0", + "yeoman-environment": "^1.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "^4.14.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "diff": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", + "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=" + }, + "external-editor": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-1.1.1.tgz", + "integrity": "sha1-Etew24UPf/fnCBuvQAVwAGDEYAs=", + "requires": { + "extend": "^3.0.0", + "spawn-sync": "^1.0.15", + "tmp": "^0.0.29" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-4.1.0.tgz", + "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^6.0.1", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "inquirer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.2.3.tgz", + "integrity": "sha1-TexvMvN+97sLLtPx0aXD9UUHSRg=", + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "external-editor": "^1.1.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "mute-stream": "0.0.6", + "pinkie-promise": "^2.0.0", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "^1.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tmp": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz", + "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "yeoman-environment": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-1.6.6.tgz", + "integrity": "sha1-zYX6Z9FWBg5EDXgH1+988NLR1nE=", + "requires": { + "chalk": "^1.0.0", + "debug": "^2.0.0", + "diff": "^2.1.2", + "escape-string-regexp": "^1.0.2", + "globby": "^4.0.0", + "grouped-queue": "^0.3.0", + "inquirer": "^1.0.2", + "lodash": "^4.11.1", + "log-symbols": "^1.0.1", + "mem-fs": "^1.1.0", + "text-table": "^0.2.0", + "untildify": "^2.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "worker-farm": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.4.tgz", + "integrity": "sha512-ITyClEvcfv0ozqJl1vmWFWhvI+OIrkbInYqkEPE50wFPXj8J9Gd3FYf8+CkZJXJJsQBYe+2DvmoK9Zhx5w8W+w==", + "requires": { + "errno": "~0.1.7", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + }, + "yeoman-environment": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.5.tgz", + "integrity": "sha512-6/W7/B54OPHJXob0n0+pmkwFsirC8cokuQkPSmT/D0lCcSxkKtg/BA6ZnjUBIwjuGqmw3DTrT4en++htaUju5g==", + "requires": { + "chalk": "^2.1.0", + "debug": "^3.1.0", + "diff": "^3.3.1", + "escape-string-regexp": "^1.0.2", + "globby": "^6.1.0", + "grouped-queue": "^0.3.3", + "inquirer": "^3.3.0", + "is-scoped": "^1.0.0", + "lodash": "^4.17.4", + "log-symbols": "^2.1.0", + "mem-fs": "^1.1.0", + "text-table": "^0.2.0", + "untildify": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz", + "integrity": "sha512-QpVuMTEoJMF7cKzi6bvWhRulU1fZqZnvyVQgNhPaxxuTYwyjn/j1v9falseQ/uXWwPnO56RBfwtg4h/EQXmucA==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "untildify": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.2.tgz", + "integrity": "sha1-fx8wIFWz/qDz6B3HjrNnZstl4/E=" + } + } + } + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package.json b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package.json new file mode 100644 index 00000000..d7a83903 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/package.json @@ -0,0 +1,17 @@ +{ + "scripts": { + "build": "webpack-cli", + "watch": "webpack-cli --watch --mode development" + }, + "dependencies": { + "babel-core": "^6.26.0", + "babel-loader": "^7.1.3", + "babel-preset-env": "^1.6.1", + "lodash": "^4.17.21", + "mocha": "^5.0.1", + "promises-aplus-tests": "^2.1.2", + "sinon": "^4.4.2", + "webpack": "^4.0.1", + "webpack-cli": "^2.0.9" + } +} diff --git a/Carthage/Checkouts/PromiseKit/Tests/JS-A+/webpack.config.js b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/webpack.config.js new file mode 100644 index 00000000..1570fce1 --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/JS-A+/webpack.config.js @@ -0,0 +1,32 @@ +var webpack = require('webpack'); + +module.exports = { + mode: 'development', + context: __dirname, + entry: './index.js', + output: { + path: __dirname + '/build', + filename: 'build.js', + library: 'runTests' + }, + stats: { + warnings: false + }, + module: { + rules: [ + { + test: /\.js$/, + exclude: /(node_modules)/, + use: { + loader: 'babel-loader', + options: { + presets: ['env'] + } + } + } + ] + }, + node: { + fs: 'empty' + }, +}; diff --git a/Carthage/Checkouts/PromiseKit/Tests/LinuxMain.swift b/Carthage/Checkouts/PromiseKit/Tests/LinuxMain.swift new file mode 100644 index 00000000..f2291bab --- /dev/null +++ b/Carthage/Checkouts/PromiseKit/Tests/LinuxMain.swift @@ -0,0 +1,10 @@ +import XCTest + +import APlus +import CorePromise + +var tests = [XCTestCaseEntry]() +tests += APlus.__allTests() +tests += CorePromise.__allTests() + +XCTMain(tests) diff --git a/Carthage/Checkouts/secp256k1.swift/.gitignore b/Carthage/Checkouts/secp256k1.swift/.gitignore new file mode 100644 index 00000000..b957ede5 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/.gitignore @@ -0,0 +1,37 @@ +# OS X +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +*.xccheckout +profile +*.moved-aside +DerivedData +*.hmap +*.ipa + +# Bundler +.bundle + +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml +# +# Pods/ diff --git a/Carthage/Checkouts/secp256k1.swift/.gitmodules b/Carthage/Checkouts/secp256k1.swift/.gitmodules new file mode 100644 index 00000000..70344b36 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/.gitmodules @@ -0,0 +1,3 @@ +[submodule "secp256k1/Classes/secp256k1"] + path = secp256k1/Classes/secp256k1 + url = https://github.com/Boilertalk/secp256k1.git diff --git a/Carthage/Checkouts/secp256k1.swift/.travis.yml b/Carthage/Checkouts/secp256k1.swift/.travis.yml new file mode 100644 index 00000000..6288e11f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/.travis.yml @@ -0,0 +1,16 @@ +# references: +# * http://www.objc.io/issue-6/travis-ci.html +# * https://github.com/supermarin/xcpretty#usage + +osx_image: xcode9.2 +xcode_sdk: iphonesimulator11.2 +language: objective-c +# cache: cocoapods +# podfile: Example/Podfile +before_install: + #- gem install cocoapods # Since Travis is not always on latest version + - pod repo update + - pod install --project-directory=Example +script: + - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/secp256k1.xcworkspace -scheme secp256k1-Example -sdk iphonesimulator11.2 -destination 'platform=iOS Simulator,name=iPhone 6,OS=11.2' ONLY_ACTIVE_ARCH=NO | xcpretty + - pod lib lint diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Podfile b/Carthage/Checkouts/secp256k1.swift/Example/Podfile new file mode 100644 index 00000000..dac6ffcd --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Podfile @@ -0,0 +1,5 @@ +use_frameworks! + +target 'secp256k1_Example' do + pod 'secp256k1.swift', :path => '../' +end diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Podfile.lock b/Carthage/Checkouts/secp256k1.swift/Example/Podfile.lock new file mode 100644 index 00000000..5a5e21cf --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - secp256k1.swift (0.1.4) + +DEPENDENCIES: + - secp256k1.swift (from `../`) + +EXTERNAL SOURCES: + secp256k1.swift: + :path: "../" + +SPEC CHECKSUMS: + secp256k1.swift: a7e7a214f6db6ce5db32cc6b2b45e5c4dd633634 + +PODFILE CHECKSUM: 3db7b1524806eb9f232bc646fc70d93371765943 + +COCOAPODS: 1.10.2 diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Local Podspecs/secp256k1.swift.podspec.json b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Local Podspecs/secp256k1.swift.podspec.json new file mode 100644 index 00000000..272b9743 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Local Podspecs/secp256k1.swift.podspec.json @@ -0,0 +1,51 @@ +{ + "name": "secp256k1.swift", + "version": "0.1.4", + "summary": "secp256k1 bindings for swift. Cocoapods, Carthage and SPM support. Linux support.", + "description": "This pod binds the bitcoin-core library, the ECDSA curve, secp256k1 into Swift. This curve is used for\nBitcoin, Ethereum and many other Cryptocurrency Signature generation and verification.", + "homepage": "https://github.com/Boilertalk/secp256k1.swift", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "Koray Koska": "koray@koska.at" + }, + "source": { + "git": "https://github.com/Boilertalk/secp256k1.swift.git", + "tag": "0.1.4", + "submodules": true + }, + "platforms": { + "ios": "8.0", + "osx": "10.10", + "tvos": "9.0", + "watchos": "2.0" + }, + "module_name": "secp256k1", + "pod_target_xcconfig": { + "SWIFT_INCLUDE_PATHS": "${PODS_ROOT}", + "OTHER_CFLAGS": "-DHAVE_CONFIG_H=1 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-shorten-64-to-32 -Wno-conditional-uninitialized -Wno-unused-function -Wno-long-long -Wno-overlength-strings -O3", + "HEADER_SEARCH_PATHS": "\"${PODS_ROOT}/secp256k1/Classes\"" + }, + "source_files": [ + "secp256k1/Classes/secp256k1/{src,include,contrib}/*.{h,c}", + "secp256k1/Classes/secp256k1/src/modules/{recovery,ecdh}/*.{h,c}", + "secp256k1/Classes/secp256k1-config.h", + "secp256k1/Classes/secp256k1_main.h", + "secp256k1/Classes/secp256k1_ec_mult_static_context.h" + ], + "public_header_files": "secp256k1/Classes/secp256k1/include/*.h", + "private_header_files": [ + "secp256k1/Classes/secp256k1_ec_mult_static_context.h", + "secp256k1/Classes/secp256k1/*.h", + "secp256k1/Classes/secp256k1/{contrib,src}/*.h", + "secp256k1/Classes/secp256k1/src/modules/{recovery, ecdh}/*.h" + ], + "exclude_files": [ + "secp256k1/Classes/secp256k1/src/test*.{c,h}", + "secp256k1/Classes/secp256k1/src/gen_context.c", + "secp256k1/Classes/secp256k1/src/*bench*.{c,h}", + "secp256k1/Classes/secp256k1/src/modules/{recovery,ecdh}/*test*.{c,h}" + ] +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Manifest.lock b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Manifest.lock new file mode 100644 index 00000000..5a5e21cf --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Manifest.lock @@ -0,0 +1,16 @@ +PODS: + - secp256k1.swift (0.1.4) + +DEPENDENCIES: + - secp256k1.swift (from `../`) + +EXTERNAL SOURCES: + secp256k1.swift: + :path: "../" + +SPEC CHECKSUMS: + secp256k1.swift: a7e7a214f6db6ce5db32cc6b2b45e5c4dd633634 + +PODFILE CHECKSUM: 3db7b1524806eb9f232bc646fc70d93371765943 + +COCOAPODS: 1.10.2 diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Pods.xcodeproj/project.pbxproj b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c6d4070f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,865 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04093ECC854E2CB00658F226FE102ED8 /* secp256k1_ecdh.h in Headers */ = {isa = PBXBuildFile; fileRef = F42A42FB7DCE7CAB168FBE78C7BE34EA /* secp256k1_ecdh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0893A58AFB8FEDC1F53C2714A3AFE918 /* Pods-secp256k1_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F63C7E141D0DF0B89011A7115A8F3D4 /* Pods-secp256k1_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B2CDCFB663DEE7F5229917CB9EDD34A /* num_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 94DD921CB9548777F318AD61C0060499 /* num_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 0C302FD966582C038DA738F0F96CA9F7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 0FB36BCAAB5D61029E374BD9650CE549 /* hash_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 046A1373606D428906EAB6BB0E31301F /* hash_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 1307F844AC7BB985BDA2A5777BCCD107 /* scalar.h in Headers */ = {isa = PBXBuildFile; fileRef = 22F4A3F4EE380B41E9C1EFF57EDA89EE /* scalar.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 13C06B88E9FDF2D76A0CC225CFB576BC /* hash.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A653DD78C5B727521CECAE3637643E1 /* hash.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 175AE9BAB5DCA8A97E9E986473B976BC /* ecmult_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 65F9926AEDAB9A757A40D960BAB41C9E /* ecmult_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 17F6136821BAB91BE4B7ED4D084EB3F4 /* ecmult_gen_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E750DFA0C55C7649C4384A0E5A0BF96 /* ecmult_gen_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 218E4586B930A2ECC03182398B9A13D3 /* eckey.h in Headers */ = {isa = PBXBuildFile; fileRef = 349285A2F487C4A8E1672E257FB114AF /* eckey.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 2582023347F529BFA0FCFCCD7131C94C /* scalar_low_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = A969820CFC22458956D564BB68EB4C58 /* scalar_low_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 2C617B11143E0FD0CEF5FFEC4892E971 /* lax_der_privatekey_parsing.h in Headers */ = {isa = PBXBuildFile; fileRef = A8D8B4A8C57012F6647838DBA10D41D7 /* lax_der_privatekey_parsing.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 2F30986508E7397CB99DEDDD828F3AF1 /* scalar_low.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FAB8D1F95CA6C1A86C18217FFD94BCA /* scalar_low.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 3569BDF40B7BD78701FC54A8E6025314 /* secp256k1-config.h in Headers */ = {isa = PBXBuildFile; fileRef = AF46DB253A015A99727C270D8B70F2ED /* secp256k1-config.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 3CCA46E532F889C86567CF5592456B58 /* field_10x26.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DFD76CCA923720BAF907D7748AC533B /* field_10x26.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 42555395595FBD2A81FEA6A72BD500C0 /* field_5x52_asm_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 975A6C2E6BFCC5B63D6436887D4FB56C /* field_5x52_asm_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 583F598BC437BB463351F39AD0294B50 /* scratch_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C85323F0C5BC4BFAC6A9106FF269E9F /* scratch_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 5DA602584B0F843203D1ECB8D9E040EB /* lax_der_parsing.h in Headers */ = {isa = PBXBuildFile; fileRef = 9795DE30BAB83582D4ACD386CC917142 /* lax_der_parsing.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 5F0A34BDD9ACCD58C36CDC09339CBD7B /* ecmult_const.h in Headers */ = {isa = PBXBuildFile; fileRef = 88F79686FFB6A24690B995FBAADBFDD7 /* ecmult_const.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 6534968FA31E8AE000D02F699FE9ABF9 /* ecdsa.h in Headers */ = {isa = PBXBuildFile; fileRef = 084ADA1919695F04F006DBC7F1B33A07 /* ecdsa.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 6603B33C2A5F631157D822A63E40AD76 /* group_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 082C63D927E4D1398F20AD5E6CE26B20 /* group_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 6AF6FECE1D952D0EAB251A0359FFDC6A /* scalar_8x32.h in Headers */ = {isa = PBXBuildFile; fileRef = A96A4ACC2178B72112F0515C81F8C2A0 /* scalar_8x32.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 6D68AB5DC1504C9240E0B705D5FA5D28 /* secp256k1.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F9B4CCF320BB730EDD85784B12755C5 /* secp256k1.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7059DE904AB048904B0C30B3210D761D /* scalar_4x64_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = A53658DAD4F44118E99C4CBB724344C1 /* scalar_4x64_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 76CB19E36FA605FFDD2B7C345476D33A /* field_5x52.h in Headers */ = {isa = PBXBuildFile; fileRef = 60D50A8800A332FA499E9302FF29619B /* field_5x52.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 7714805D5846A6062E87ACE85DB2280B /* util.h in Headers */ = {isa = PBXBuildFile; fileRef = BA9B4DE276952E8B579A79AEDF616467 /* util.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 78486EBA7BED916696062A1C2A06A88B /* secp256k1.swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CE9EE20BCCBE7E7B1A1EB6C3646048B /* secp256k1.swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7D5CCCC7CC67CC281DE8F2BE46CDDBE4 /* scalar_8x32_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 82006C4E59808DF4240103CCC39AE5CF /* scalar_8x32_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 7F206B6F9EC25CD28CF2459FA99FCE63 /* basic-config.h in Headers */ = {isa = PBXBuildFile; fileRef = 122AA0C7145F83784F901A9DF065BC9C /* basic-config.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 87A024A8FCB762E41CF44D5D9D8FC8EF /* ecmult.h in Headers */ = {isa = PBXBuildFile; fileRef = 685A39567298B2AA0DB265871CA1406C /* ecmult.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 886A34DB97B3F27FB620D305D52B4759 /* scalar_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 870882360CEBDDD10089CB05FB14D599 /* scalar_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 8967E055F53E28ABC50866725D077944 /* ecmult_gen.h in Headers */ = {isa = PBXBuildFile; fileRef = CDB8180E5F555EE746D3714D02F7A785 /* ecmult_gen.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 8C1503044F9A7B8EA31BE0E1EB21CDDE /* group.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F2AF47BBE7F1AFEC4C6F639DD27BCF0 /* group.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 90BD6148F2060726CBBB32164D6F5BA2 /* lax_der_privatekey_parsing.c in Sources */ = {isa = PBXBuildFile; fileRef = 2626C5DDB91FB08C9DB5D6C13BB09F1B /* lax_der_privatekey_parsing.c */; }; + 920F1F5DFD1026060008A31C176E2730 /* secp256k1.c in Sources */ = {isa = PBXBuildFile; fileRef = B50BB213A3E53AA9B6859DB762B03B14 /* secp256k1.c */; }; + 934A307EF18ADDEC316F1E2EB25FD83A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 97C22F941B4B8AED9EFBE26E7BD4F744 /* scratch.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D232268ACBE601BA43C10EE338CB0BE /* scratch.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 97CB03D1700B0246AA7ABBF881ED708A /* main_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A9CEE789A35A6667289B30B1452B893 /* main_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 98BC5F9106C46207907A1408D6318497 /* scalar_4x64.h in Headers */ = {isa = PBXBuildFile; fileRef = 375AFABC353F9299140C90195B00875E /* scalar_4x64.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 9BF7AB163F2B0AA60AE7A38042B0E0AF /* field_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B066FE540289F11289310002E4BF240 /* field_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 9C7D527C927DB03F21D3F61129F4DBB8 /* main_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = E29DAD21B5555255B1E64DC5B9A811B6 /* main_impl.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A6C9FBB514BC38512F5723ABDB5C2670 /* secp256k1_recovery.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D06BA0A17B56C80D7CFDE991A74BBB /* secp256k1_recovery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AA6CEA732097D0E5AA45FFCD4C7E7F17 /* ecmult_const_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = C3EE0DDD562A5E6EDC4476061D23F215 /* ecmult_const_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + AB02B614F0757C7B097358D2E5BCB793 /* secp256k1.swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A4C161FB60E96802580D70CEEA2AEB3 /* secp256k1.swift-dummy.m */; }; + B21B12ABDB09F49564ED4ABC81FABD76 /* field.h in Headers */ = {isa = PBXBuildFile; fileRef = 00A3AB2BA283FB0CCA6DB3C77B633D21 /* field.h */; settings = {ATTRIBUTES = (Private, ); }; }; + B66668DD67322713056F4430AA6AAC8E /* lax_der_parsing.c in Sources */ = {isa = PBXBuildFile; fileRef = 1BDB9C97B67A53BF29746028402811F5 /* lax_der_parsing.c */; }; + B8428CAAD76F5702372F1ACF13757ACA /* ecdsa_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 53B7C07B3799AF6F17D8D2D6D5DDC2B9 /* ecdsa_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BDE2FC71D3413C7ACCDCA50528B676FA /* num_gmp_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 27E7D79E6643A9EA0BFC293423E205F2 /* num_gmp_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BF4A1E86732E69D7E71E4C5D4F7A1D0A /* num.h in Headers */ = {isa = PBXBuildFile; fileRef = 34A3BE4D3A710E313635827E140A7D47 /* num.h */; settings = {ATTRIBUTES = (Private, ); }; }; + BF7A7CBB78DD8040E87FFBC30F942DE0 /* Pods-secp256k1_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D83C177CD5A2650822804D509ADA42A2 /* Pods-secp256k1_Example-dummy.m */; }; + C6419A87B3D873C892BD471663EBED19 /* eckey_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = A4AAEB524EA4D6B78F946DBBA5DB2DC6 /* eckey_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + D0C45572A39E7C092453DE7792D251CB /* field_5x52_int128_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = C6487173CE8C29143CBB63890DB7F4F0 /* field_5x52_int128_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + DB6A58B20EB80A63CB1C206BB7E36C12 /* secp256k1_ec_mult_static_context.h in Headers */ = {isa = PBXBuildFile; fileRef = 3637D7E5477D87B7706CA0EEC1005DF3 /* secp256k1_ec_mult_static_context.h */; settings = {ATTRIBUTES = (Private, ); }; }; + EAEAE2882B4AAB696F971509380CC0B3 /* secp256k1_main.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE4B053D35AA75974DA185B6AD6A79F /* secp256k1_main.h */; settings = {ATTRIBUTES = (Project, ); }; }; + EF5AC10C5CB4AFBC976F0B26E62B5B65 /* field_5x52_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DCF539EAC23F6904788A2FF55AEC2C7 /* field_5x52_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; + FD0F43871597615CA0FED9CFE0E59B4A /* num_gmp.h in Headers */ = {isa = PBXBuildFile; fileRef = E94D11A1D2A02577E8FA56044FDB7BA6 /* num_gmp.h */; settings = {ATTRIBUTES = (Private, ); }; }; + FD3086B982AD934281B1F30EC666CEC4 /* field_10x26_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E82AD54AC462644C261813DC458C4EF /* field_10x26_impl.h */; settings = {ATTRIBUTES = (Private, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 93C9C4CED06132A4920C507716F2ADA6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4FF1EE5493800BD023263DE462914B83; + remoteInfo = secp256k1.swift; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00A3AB2BA283FB0CCA6DB3C77B633D21 /* field.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field.h; sourceTree = ""; }; + 046A1373606D428906EAB6BB0E31301F /* hash_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = hash_impl.h; sourceTree = ""; }; + 082C63D927E4D1398F20AD5E6CE26B20 /* group_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = group_impl.h; sourceTree = ""; }; + 084ADA1919695F04F006DBC7F1B33A07 /* ecdsa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; + 0C85323F0C5BC4BFAC6A9106FF269E9F /* scratch_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scratch_impl.h; sourceTree = ""; }; + 0D6DD349491CF6D482C269B687733835 /* Pods_secp256k1_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_secp256k1_Example.framework; path = "Pods-secp256k1_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 0FAB8D1F95CA6C1A86C18217FFD94BCA /* scalar_low.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_low.h; sourceTree = ""; }; + 122AA0C7145F83784F901A9DF065BC9C /* basic-config.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "basic-config.h"; sourceTree = ""; }; + 1A4C161FB60E96802580D70CEEA2AEB3 /* secp256k1.swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "secp256k1.swift-dummy.m"; sourceTree = ""; }; + 1A653DD78C5B727521CECAE3637643E1 /* hash.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; + 1BDB9C97B67A53BF29746028402811F5 /* lax_der_parsing.c */ = {isa = PBXFileReference; includeInIndex = 1; path = lax_der_parsing.c; sourceTree = ""; }; + 22F4A3F4EE380B41E9C1EFF57EDA89EE /* scalar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar.h; sourceTree = ""; }; + 2626C5DDB91FB08C9DB5D6C13BB09F1B /* lax_der_privatekey_parsing.c */ = {isa = PBXFileReference; includeInIndex = 1; path = lax_der_privatekey_parsing.c; sourceTree = ""; }; + 26AE8F8840C66B3BC4AF2432110EBF32 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 27E7D79E6643A9EA0BFC293423E205F2 /* num_gmp_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = num_gmp_impl.h; sourceTree = ""; }; + 2B0B5EF5280862B64E495345306D7616 /* Pods-secp256k1_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-secp256k1_Example-Info.plist"; sourceTree = ""; }; + 349285A2F487C4A8E1672E257FB114AF /* eckey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = eckey.h; sourceTree = ""; }; + 34A3BE4D3A710E313635827E140A7D47 /* num.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = num.h; sourceTree = ""; }; + 3637D7E5477D87B7706CA0EEC1005DF3 /* secp256k1_ec_mult_static_context.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = secp256k1_ec_mult_static_context.h; path = secp256k1/Classes/secp256k1_ec_mult_static_context.h; sourceTree = ""; }; + 375AFABC353F9299140C90195B00875E /* scalar_4x64.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_4x64.h; sourceTree = ""; }; + 39E75358E49D1155B28FC6250F4F2094 /* secp256k1.swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = secp256k1.swift.release.xcconfig; sourceTree = ""; }; + 3D232268ACBE601BA43C10EE338CB0BE /* scratch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scratch.h; sourceTree = ""; }; + 3F9B4CCF320BB730EDD85784B12755C5 /* secp256k1.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = secp256k1.h; sourceTree = ""; }; + 40CCE1281164DE769303759678296832 /* secp256k1.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = secp256k1.framework; path = secp256k1.swift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 42D5FC95E772A3444ED2386DF21A2C02 /* secp256k1.swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "secp256k1.swift-Info.plist"; sourceTree = ""; }; + 4CE9EE20BCCBE7E7B1A1EB6C3646048B /* secp256k1.swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "secp256k1.swift-umbrella.h"; sourceTree = ""; }; + 4E6371BBBB2F41CD8378779FED51A31F /* Pods-secp256k1_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-secp256k1_Example.modulemap"; sourceTree = ""; }; + 4E750DFA0C55C7649C4384A0E5A0BF96 /* ecmult_gen_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult_gen_impl.h; sourceTree = ""; }; + 53B7C07B3799AF6F17D8D2D6D5DDC2B9 /* ecdsa_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecdsa_impl.h; sourceTree = ""; }; + 60D50A8800A332FA499E9302FF29619B /* field_5x52.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_5x52.h; sourceTree = ""; }; + 65F9926AEDAB9A757A40D960BAB41C9E /* ecmult_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult_impl.h; sourceTree = ""; }; + 685A39567298B2AA0DB265871CA1406C /* ecmult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult.h; sourceTree = ""; }; + 6B066FE540289F11289310002E4BF240 /* field_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_impl.h; sourceTree = ""; }; + 6DFD76CCA923720BAF907D7748AC533B /* field_10x26.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_10x26.h; sourceTree = ""; }; + 6F63C7E141D0DF0B89011A7115A8F3D4 /* Pods-secp256k1_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-secp256k1_Example-umbrella.h"; sourceTree = ""; }; + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 82006C4E59808DF4240103CCC39AE5CF /* scalar_8x32_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_8x32_impl.h; sourceTree = ""; }; + 8517554C9E562623BDD04AFB9736A6BC /* secp256k1.swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = secp256k1.swift.debug.xcconfig; sourceTree = ""; }; + 870882360CEBDDD10089CB05FB14D599 /* scalar_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_impl.h; sourceTree = ""; }; + 88F79686FFB6A24690B995FBAADBFDD7 /* ecmult_const.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult_const.h; sourceTree = ""; }; + 8C5222B1CF0D8D5844AC1CF895E39B70 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 8DCF539EAC23F6904788A2FF55AEC2C7 /* field_5x52_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_5x52_impl.h; sourceTree = ""; }; + 8F2AF47BBE7F1AFEC4C6F639DD27BCF0 /* group.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = group.h; sourceTree = ""; }; + 94DD921CB9548777F318AD61C0060499 /* num_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = num_impl.h; sourceTree = ""; }; + 975A6C2E6BFCC5B63D6436887D4FB56C /* field_5x52_asm_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_5x52_asm_impl.h; sourceTree = ""; }; + 9795DE30BAB83582D4ACD386CC917142 /* lax_der_parsing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = lax_der_parsing.h; sourceTree = ""; }; + 98DDD39099AAC4E6D9BAF4B7CC966746 /* secp256k1.swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = secp256k1.swift.modulemap; sourceTree = ""; }; + 9A9CEE789A35A6667289B30B1452B893 /* main_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = main_impl.h; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9E82AD54AC462644C261813DC458C4EF /* field_10x26_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_10x26_impl.h; sourceTree = ""; }; + A49811ED0B692013B65D28B078F02A72 /* Pods-secp256k1_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-secp256k1_Example.debug.xcconfig"; sourceTree = ""; }; + A4AAEB524EA4D6B78F946DBBA5DB2DC6 /* eckey_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = eckey_impl.h; sourceTree = ""; }; + A53658DAD4F44118E99C4CBB724344C1 /* scalar_4x64_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_4x64_impl.h; sourceTree = ""; }; + A8D8B4A8C57012F6647838DBA10D41D7 /* lax_der_privatekey_parsing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = lax_der_privatekey_parsing.h; sourceTree = ""; }; + A969820CFC22458956D564BB68EB4C58 /* scalar_low_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_low_impl.h; sourceTree = ""; }; + A96A4ACC2178B72112F0515C81F8C2A0 /* scalar_8x32.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = scalar_8x32.h; sourceTree = ""; }; + AF46DB253A015A99727C270D8B70F2ED /* secp256k1-config.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "secp256k1-config.h"; path = "secp256k1/Classes/secp256k1-config.h"; sourceTree = ""; }; + B50BB213A3E53AA9B6859DB762B03B14 /* secp256k1.c */ = {isa = PBXFileReference; includeInIndex = 1; path = secp256k1.c; sourceTree = ""; }; + BA9B4DE276952E8B579A79AEDF616467 /* util.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; + BB7C4B59278453635FBE238613BE44C0 /* secp256k1.swift.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = secp256k1.swift.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + C3A305F774534124DAE16EEE9F656F9B /* Pods-secp256k1_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-secp256k1_Example-acknowledgements.plist"; sourceTree = ""; }; + C3EE0DDD562A5E6EDC4476061D23F215 /* ecmult_const_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult_const_impl.h; sourceTree = ""; }; + C6487173CE8C29143CBB63890DB7F4F0 /* field_5x52_int128_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = field_5x52_int128_impl.h; sourceTree = ""; }; + CDB8180E5F555EE746D3714D02F7A785 /* ecmult_gen.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = ecmult_gen.h; sourceTree = ""; }; + D0D06BA0A17B56C80D7CFDE991A74BBB /* secp256k1_recovery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = secp256k1_recovery.h; sourceTree = ""; }; + D83C177CD5A2650822804D509ADA42A2 /* Pods-secp256k1_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-secp256k1_Example-dummy.m"; sourceTree = ""; }; + DF1039AFD6610EF6305372A5661B7748 /* secp256k1.swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "secp256k1.swift-prefix.pch"; sourceTree = ""; }; + E29DAD21B5555255B1E64DC5B9A811B6 /* main_impl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = main_impl.h; sourceTree = ""; }; + E51F9024DBE68AF340A86CBFC6FBA56C /* Pods-secp256k1_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-secp256k1_Example-acknowledgements.markdown"; sourceTree = ""; }; + E94D11A1D2A02577E8FA56044FDB7BA6 /* num_gmp.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = num_gmp.h; sourceTree = ""; }; + E9F650751A5C02899F5D2A97CA62479F /* Pods-secp256k1_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-secp256k1_Example.release.xcconfig"; sourceTree = ""; }; + F42A42FB7DCE7CAB168FBE78C7BE34EA /* secp256k1_ecdh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = secp256k1_ecdh.h; sourceTree = ""; }; + FC020AEC760131B36354D7598775E65F /* Pods-secp256k1_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-secp256k1_Example-frameworks.sh"; sourceTree = ""; }; + FEE4B053D35AA75974DA185B6AD6A79F /* secp256k1_main.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = secp256k1_main.h; path = secp256k1/Classes/secp256k1_main.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 10E4A5E57A75C10D5F2FB6A8194D7FEE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0C302FD966582C038DA738F0F96CA9F7 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F0EF36705DA05B60411DEB5D0DA5EE47 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 934A307EF18ADDEC316F1E2EB25FD83A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08F0163B4AEB4A8E34141B4F7A8DFCE8 /* Pods-secp256k1_Example */ = { + isa = PBXGroup; + children = ( + 4E6371BBBB2F41CD8378779FED51A31F /* Pods-secp256k1_Example.modulemap */, + E51F9024DBE68AF340A86CBFC6FBA56C /* Pods-secp256k1_Example-acknowledgements.markdown */, + C3A305F774534124DAE16EEE9F656F9B /* Pods-secp256k1_Example-acknowledgements.plist */, + D83C177CD5A2650822804D509ADA42A2 /* Pods-secp256k1_Example-dummy.m */, + FC020AEC760131B36354D7598775E65F /* Pods-secp256k1_Example-frameworks.sh */, + 2B0B5EF5280862B64E495345306D7616 /* Pods-secp256k1_Example-Info.plist */, + 6F63C7E141D0DF0B89011A7115A8F3D4 /* Pods-secp256k1_Example-umbrella.h */, + A49811ED0B692013B65D28B078F02A72 /* Pods-secp256k1_Example.debug.xcconfig */, + E9F650751A5C02899F5D2A97CA62479F /* Pods-secp256k1_Example.release.xcconfig */, + ); + name = "Pods-secp256k1_Example"; + path = "Target Support Files/Pods-secp256k1_Example"; + sourceTree = ""; + }; + 21936CC593B7A568EE110F07007BEFE7 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 08F0163B4AEB4A8E34141B4F7A8DFCE8 /* Pods-secp256k1_Example */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 23C4C961CE9DEC443B4A3143A9837825 /* Pod */ = { + isa = PBXGroup; + children = ( + 26AE8F8840C66B3BC4AF2432110EBF32 /* LICENSE */, + 8C5222B1CF0D8D5844AC1CF895E39B70 /* README.md */, + BB7C4B59278453635FBE238613BE44C0 /* secp256k1.swift.podspec */, + ); + name = Pod; + sourceTree = ""; + }; + 345D896426AC56AE5175F4ACEB07B4F6 /* include */ = { + isa = PBXGroup; + children = ( + 3F9B4CCF320BB730EDD85784B12755C5 /* secp256k1.h */, + F42A42FB7DCE7CAB168FBE78C7BE34EA /* secp256k1_ecdh.h */, + D0D06BA0A17B56C80D7CFDE991A74BBB /* secp256k1_recovery.h */, + ); + name = include; + path = include; + sourceTree = ""; + }; + 464B6E842341D9FE94CF2E3068BA7816 /* secp256k1 */ = { + isa = PBXGroup; + children = ( + 8DFE43C556BEC19299E9DEAC94D0C386 /* contrib */, + 345D896426AC56AE5175F4ACEB07B4F6 /* include */, + CA7E0EAB5F1A2EB4687E206E2BE578C8 /* src */, + ); + name = secp256k1; + path = secp256k1/Classes/secp256k1; + sourceTree = ""; + }; + 4CFB113E1E86151606DAC659C8A46DD7 /* Support Files */ = { + isa = PBXGroup; + children = ( + 98DDD39099AAC4E6D9BAF4B7CC966746 /* secp256k1.swift.modulemap */, + 1A4C161FB60E96802580D70CEEA2AEB3 /* secp256k1.swift-dummy.m */, + 42D5FC95E772A3444ED2386DF21A2C02 /* secp256k1.swift-Info.plist */, + DF1039AFD6610EF6305372A5661B7748 /* secp256k1.swift-prefix.pch */, + 4CE9EE20BCCBE7E7B1A1EB6C3646048B /* secp256k1.swift-umbrella.h */, + 8517554C9E562623BDD04AFB9736A6BC /* secp256k1.swift.debug.xcconfig */, + 39E75358E49D1155B28FC6250F4F2094 /* secp256k1.swift.release.xcconfig */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/secp256k1.swift"; + sourceTree = ""; + }; + 5760D98159652706E0323C31B2A8CC53 /* Products */ = { + isa = PBXGroup; + children = ( + 0D6DD349491CF6D482C269B687733835 /* Pods_secp256k1_Example.framework */, + 40CCE1281164DE769303759678296832 /* secp256k1.framework */, + ); + name = Products; + sourceTree = ""; + }; + 578452D2E740E91742655AC8F1636D1F /* iOS */ = { + isa = PBXGroup; + children = ( + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 8DFE43C556BEC19299E9DEAC94D0C386 /* contrib */ = { + isa = PBXGroup; + children = ( + 1BDB9C97B67A53BF29746028402811F5 /* lax_der_parsing.c */, + 9795DE30BAB83582D4ACD386CC917142 /* lax_der_parsing.h */, + 2626C5DDB91FB08C9DB5D6C13BB09F1B /* lax_der_privatekey_parsing.c */, + A8D8B4A8C57012F6647838DBA10D41D7 /* lax_der_privatekey_parsing.h */, + ); + name = contrib; + path = contrib; + sourceTree = ""; + }; + 9DFC9F88375C82D37C98788C621CAB52 /* secp256k1.swift */ = { + isa = PBXGroup; + children = ( + AF46DB253A015A99727C270D8B70F2ED /* secp256k1-config.h */, + 3637D7E5477D87B7706CA0EEC1005DF3 /* secp256k1_ec_mult_static_context.h */, + FEE4B053D35AA75974DA185B6AD6A79F /* secp256k1_main.h */, + 23C4C961CE9DEC443B4A3143A9837825 /* Pod */, + 464B6E842341D9FE94CF2E3068BA7816 /* secp256k1 */, + 4CFB113E1E86151606DAC659C8A46DD7 /* Support Files */, + ); + name = secp256k1.swift; + path = ../..; + sourceTree = ""; + }; + A4EDDDCC60CB64FD325E2EA5A188613A /* recovery */ = { + isa = PBXGroup; + children = ( + 9A9CEE789A35A6667289B30B1452B893 /* main_impl.h */, + ); + name = recovery; + path = recovery; + sourceTree = ""; + }; + C40F381A4A6953C23FFF80DA50CC1965 /* ecdh */ = { + isa = PBXGroup; + children = ( + E29DAD21B5555255B1E64DC5B9A811B6 /* main_impl.h */, + ); + name = ecdh; + path = ecdh; + sourceTree = ""; + }; + CA7E0EAB5F1A2EB4687E206E2BE578C8 /* src */ = { + isa = PBXGroup; + children = ( + 122AA0C7145F83784F901A9DF065BC9C /* basic-config.h */, + 084ADA1919695F04F006DBC7F1B33A07 /* ecdsa.h */, + 53B7C07B3799AF6F17D8D2D6D5DDC2B9 /* ecdsa_impl.h */, + 349285A2F487C4A8E1672E257FB114AF /* eckey.h */, + A4AAEB524EA4D6B78F946DBBA5DB2DC6 /* eckey_impl.h */, + 685A39567298B2AA0DB265871CA1406C /* ecmult.h */, + 88F79686FFB6A24690B995FBAADBFDD7 /* ecmult_const.h */, + C3EE0DDD562A5E6EDC4476061D23F215 /* ecmult_const_impl.h */, + CDB8180E5F555EE746D3714D02F7A785 /* ecmult_gen.h */, + 4E750DFA0C55C7649C4384A0E5A0BF96 /* ecmult_gen_impl.h */, + 65F9926AEDAB9A757A40D960BAB41C9E /* ecmult_impl.h */, + 00A3AB2BA283FB0CCA6DB3C77B633D21 /* field.h */, + 6DFD76CCA923720BAF907D7748AC533B /* field_10x26.h */, + 9E82AD54AC462644C261813DC458C4EF /* field_10x26_impl.h */, + 60D50A8800A332FA499E9302FF29619B /* field_5x52.h */, + 975A6C2E6BFCC5B63D6436887D4FB56C /* field_5x52_asm_impl.h */, + 8DCF539EAC23F6904788A2FF55AEC2C7 /* field_5x52_impl.h */, + C6487173CE8C29143CBB63890DB7F4F0 /* field_5x52_int128_impl.h */, + 6B066FE540289F11289310002E4BF240 /* field_impl.h */, + 8F2AF47BBE7F1AFEC4C6F639DD27BCF0 /* group.h */, + 082C63D927E4D1398F20AD5E6CE26B20 /* group_impl.h */, + 1A653DD78C5B727521CECAE3637643E1 /* hash.h */, + 046A1373606D428906EAB6BB0E31301F /* hash_impl.h */, + 34A3BE4D3A710E313635827E140A7D47 /* num.h */, + E94D11A1D2A02577E8FA56044FDB7BA6 /* num_gmp.h */, + 27E7D79E6643A9EA0BFC293423E205F2 /* num_gmp_impl.h */, + 94DD921CB9548777F318AD61C0060499 /* num_impl.h */, + 22F4A3F4EE380B41E9C1EFF57EDA89EE /* scalar.h */, + 375AFABC353F9299140C90195B00875E /* scalar_4x64.h */, + A53658DAD4F44118E99C4CBB724344C1 /* scalar_4x64_impl.h */, + A96A4ACC2178B72112F0515C81F8C2A0 /* scalar_8x32.h */, + 82006C4E59808DF4240103CCC39AE5CF /* scalar_8x32_impl.h */, + 870882360CEBDDD10089CB05FB14D599 /* scalar_impl.h */, + 0FAB8D1F95CA6C1A86C18217FFD94BCA /* scalar_low.h */, + A969820CFC22458956D564BB68EB4C58 /* scalar_low_impl.h */, + 3D232268ACBE601BA43C10EE338CB0BE /* scratch.h */, + 0C85323F0C5BC4BFAC6A9106FF269E9F /* scratch_impl.h */, + B50BB213A3E53AA9B6859DB762B03B14 /* secp256k1.c */, + BA9B4DE276952E8B579A79AEDF616467 /* util.h */, + FE949C0094CE08C36B3B64501C03E3F2 /* modules */, + ); + name = src; + path = src; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + F2128E885261603FF3EDCF1BB5465042 /* Development Pods */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 5760D98159652706E0323C31B2A8CC53 /* Products */, + 21936CC593B7A568EE110F07007BEFE7 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 578452D2E740E91742655AC8F1636D1F /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + F2128E885261603FF3EDCF1BB5465042 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 9DFC9F88375C82D37C98788C621CAB52 /* secp256k1.swift */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + FE949C0094CE08C36B3B64501C03E3F2 /* modules */ = { + isa = PBXGroup; + children = ( + C40F381A4A6953C23FFF80DA50CC1965 /* ecdh */, + A4EDDDCC60CB64FD325E2EA5A188613A /* recovery */, + ); + name = modules; + path = modules; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 5B95571341C8497DF8EF4EC6558CD181 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7F206B6F9EC25CD28CF2459FA99FCE63 /* basic-config.h in Headers */, + 6534968FA31E8AE000D02F699FE9ABF9 /* ecdsa.h in Headers */, + B8428CAAD76F5702372F1ACF13757ACA /* ecdsa_impl.h in Headers */, + 218E4586B930A2ECC03182398B9A13D3 /* eckey.h in Headers */, + C6419A87B3D873C892BD471663EBED19 /* eckey_impl.h in Headers */, + 87A024A8FCB762E41CF44D5D9D8FC8EF /* ecmult.h in Headers */, + 5F0A34BDD9ACCD58C36CDC09339CBD7B /* ecmult_const.h in Headers */, + AA6CEA732097D0E5AA45FFCD4C7E7F17 /* ecmult_const_impl.h in Headers */, + 8967E055F53E28ABC50866725D077944 /* ecmult_gen.h in Headers */, + 17F6136821BAB91BE4B7ED4D084EB3F4 /* ecmult_gen_impl.h in Headers */, + 175AE9BAB5DCA8A97E9E986473B976BC /* ecmult_impl.h in Headers */, + B21B12ABDB09F49564ED4ABC81FABD76 /* field.h in Headers */, + 3CCA46E532F889C86567CF5592456B58 /* field_10x26.h in Headers */, + FD3086B982AD934281B1F30EC666CEC4 /* field_10x26_impl.h in Headers */, + 76CB19E36FA605FFDD2B7C345476D33A /* field_5x52.h in Headers */, + 42555395595FBD2A81FEA6A72BD500C0 /* field_5x52_asm_impl.h in Headers */, + EF5AC10C5CB4AFBC976F0B26E62B5B65 /* field_5x52_impl.h in Headers */, + D0C45572A39E7C092453DE7792D251CB /* field_5x52_int128_impl.h in Headers */, + 9BF7AB163F2B0AA60AE7A38042B0E0AF /* field_impl.h in Headers */, + 8C1503044F9A7B8EA31BE0E1EB21CDDE /* group.h in Headers */, + 6603B33C2A5F631157D822A63E40AD76 /* group_impl.h in Headers */, + 13C06B88E9FDF2D76A0CC225CFB576BC /* hash.h in Headers */, + 0FB36BCAAB5D61029E374BD9650CE549 /* hash_impl.h in Headers */, + 5DA602584B0F843203D1ECB8D9E040EB /* lax_der_parsing.h in Headers */, + 2C617B11143E0FD0CEF5FFEC4892E971 /* lax_der_privatekey_parsing.h in Headers */, + 9C7D527C927DB03F21D3F61129F4DBB8 /* main_impl.h in Headers */, + 97CB03D1700B0246AA7ABBF881ED708A /* main_impl.h in Headers */, + BF4A1E86732E69D7E71E4C5D4F7A1D0A /* num.h in Headers */, + FD0F43871597615CA0FED9CFE0E59B4A /* num_gmp.h in Headers */, + BDE2FC71D3413C7ACCDCA50528B676FA /* num_gmp_impl.h in Headers */, + 0B2CDCFB663DEE7F5229917CB9EDD34A /* num_impl.h in Headers */, + 1307F844AC7BB985BDA2A5777BCCD107 /* scalar.h in Headers */, + 98BC5F9106C46207907A1408D6318497 /* scalar_4x64.h in Headers */, + 7059DE904AB048904B0C30B3210D761D /* scalar_4x64_impl.h in Headers */, + 6AF6FECE1D952D0EAB251A0359FFDC6A /* scalar_8x32.h in Headers */, + 7D5CCCC7CC67CC281DE8F2BE46CDDBE4 /* scalar_8x32_impl.h in Headers */, + 886A34DB97B3F27FB620D305D52B4759 /* scalar_impl.h in Headers */, + 2F30986508E7397CB99DEDDD828F3AF1 /* scalar_low.h in Headers */, + 2582023347F529BFA0FCFCCD7131C94C /* scalar_low_impl.h in Headers */, + 97C22F941B4B8AED9EFBE26E7BD4F744 /* scratch.h in Headers */, + 583F598BC437BB463351F39AD0294B50 /* scratch_impl.h in Headers */, + 6D68AB5DC1504C9240E0B705D5FA5D28 /* secp256k1.h in Headers */, + 3569BDF40B7BD78701FC54A8E6025314 /* secp256k1-config.h in Headers */, + 78486EBA7BED916696062A1C2A06A88B /* secp256k1.swift-umbrella.h in Headers */, + DB6A58B20EB80A63CB1C206BB7E36C12 /* secp256k1_ec_mult_static_context.h in Headers */, + 04093ECC854E2CB00658F226FE102ED8 /* secp256k1_ecdh.h in Headers */, + EAEAE2882B4AAB696F971509380CC0B3 /* secp256k1_main.h in Headers */, + A6C9FBB514BC38512F5723ABDB5C2670 /* secp256k1_recovery.h in Headers */, + 7714805D5846A6062E87ACE85DB2280B /* util.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D013D3EB1546A9CA1607F62E3E99E2CD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0893A58AFB8FEDC1F53C2714A3AFE918 /* Pods-secp256k1_Example-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 17CE60C3295B364E97F40406C23AD098 /* Pods-secp256k1_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 20163E1478DEBE60CD3A2633B9E8B564 /* Build configuration list for PBXNativeTarget "Pods-secp256k1_Example" */; + buildPhases = ( + D013D3EB1546A9CA1607F62E3E99E2CD /* Headers */, + 4A22AF7990B20A2A21ACDF279D30D84A /* Sources */, + 10E4A5E57A75C10D5F2FB6A8194D7FEE /* Frameworks */, + BE0D986F3DCC66C42FB9662812EDAFB5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 7205993EDE7E349FEAB7447B6EB3FC1A /* PBXTargetDependency */, + ); + name = "Pods-secp256k1_Example"; + productName = "Pods-secp256k1_Example"; + productReference = 0D6DD349491CF6D482C269B687733835 /* Pods_secp256k1_Example.framework */; + productType = "com.apple.product-type.framework"; + }; + 4FF1EE5493800BD023263DE462914B83 /* secp256k1.swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 187A6BB7FBE7969ACB708C17759B115E /* Build configuration list for PBXNativeTarget "secp256k1.swift" */; + buildPhases = ( + 5B95571341C8497DF8EF4EC6558CD181 /* Headers */, + 425372362136879A4A5FCFBD5CF8E3FC /* Sources */, + F0EF36705DA05B60411DEB5D0DA5EE47 /* Frameworks */, + 9CC0319DA5D6DDAF6C1F27F446E6A25A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = secp256k1.swift; + productName = secp256k1.swift; + productReference = 40CCE1281164DE769303759678296832 /* secp256k1.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 5760D98159652706E0323C31B2A8CC53 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 17CE60C3295B364E97F40406C23AD098 /* Pods-secp256k1_Example */, + 4FF1EE5493800BD023263DE462914B83 /* secp256k1.swift */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 9CC0319DA5D6DDAF6C1F27F446E6A25A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BE0D986F3DCC66C42FB9662812EDAFB5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 425372362136879A4A5FCFBD5CF8E3FC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B66668DD67322713056F4430AA6AAC8E /* lax_der_parsing.c in Sources */, + 90BD6148F2060726CBBB32164D6F5BA2 /* lax_der_privatekey_parsing.c in Sources */, + 920F1F5DFD1026060008A31C176E2730 /* secp256k1.c in Sources */, + AB02B614F0757C7B097358D2E5BCB793 /* secp256k1.swift-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4A22AF7990B20A2A21ACDF279D30D84A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BF7A7CBB78DD8040E87FFBC30F942DE0 /* Pods-secp256k1_Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 7205993EDE7E349FEAB7447B6EB3FC1A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = secp256k1.swift; + target = 4FF1EE5493800BD023263DE462914B83 /* secp256k1.swift */; + targetProxy = 93C9C4CED06132A4920C507716F2ADA6 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 219333B6B389B3C58A2416E3B7D41F2B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A49811ED0B692013B65D28B078F02A72 /* Pods-secp256k1_Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 431BA2B8298F0EE71735B9E0114E1955 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 79759604D78320E712558F49DF19AA9F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + D21D0E71EE517391E714E380A89713D2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 39E75358E49D1155B28FC6250F4F2094 /* secp256k1.swift.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/secp256k1.swift/secp256k1.swift.modulemap"; + PRODUCT_MODULE_NAME = secp256k1; + PRODUCT_NAME = secp256k1; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D4CD8C23DC9B7FE3DC1F84EF988F16D1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E9F650751A5C02899F5D2A97CA62479F /* Pods-secp256k1_Example.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + E28357890112AC6E164A1F2068B1A9B9 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8517554C9E562623BDD04AFB9736A6BC /* secp256k1.swift.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/secp256k1.swift/secp256k1.swift.modulemap"; + PRODUCT_MODULE_NAME = secp256k1; + PRODUCT_NAME = secp256k1; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 187A6BB7FBE7969ACB708C17759B115E /* Build configuration list for PBXNativeTarget "secp256k1.swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E28357890112AC6E164A1F2068B1A9B9 /* Debug */, + D21D0E71EE517391E714E380A89713D2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 20163E1478DEBE60CD3A2633B9E8B564 /* Build configuration list for PBXNativeTarget "Pods-secp256k1_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 219333B6B389B3C58A2416E3B7D41F2B /* Debug */, + D4CD8C23DC9B7FE3DC1F84EF988F16D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79759604D78320E712558F49DF19AA9F /* Debug */, + 431BA2B8298F0EE71735B9E0114E1955 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist new file mode 100644 index 00000000..2243fe6e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.markdown b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.markdown new file mode 100644 index 00000000..117f1f1e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.markdown @@ -0,0 +1,28 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## secp256k1.swift + +The MIT License (MIT) + +Copyright (c) 2018 Boilertalk Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.plist b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.plist new file mode 100644 index 00000000..46b7c1cd --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-acknowledgements.plist @@ -0,0 +1,60 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2018 Boilertalk Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + secp256k1.swift + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-dummy.m b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-dummy.m new file mode 100644 index 00000000..ecdd7f65 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_secp256k1_Example : NSObject +@end +@implementation PodsDummy_Pods_secp256k1_Example +@end diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh new file mode 100755 index 00000000..74bf3c30 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh @@ -0,0 +1,185 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" + + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures from the dSYM. + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=1 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=0 +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/secp256k1.swift/secp256k1.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/secp256k1.swift/secp256k1.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-umbrella.h b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-umbrella.h new file mode 100644 index 00000000..c78c9919 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_secp256k1_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_secp256k1_ExampleVersionString[]; + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.debug.xcconfig b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.debug.xcconfig new file mode 100644 index 00000000..958b8e33 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.debug.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift/secp256k1.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "secp256k1" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap new file mode 100644 index 00000000..f7ef020f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_secp256k1_Example { + umbrella header "Pods-secp256k1_Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.release.xcconfig b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.release.xcconfig new file mode 100644 index 00000000..958b8e33 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.release.xcconfig @@ -0,0 +1,12 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift/secp256k1.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "secp256k1" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist new file mode 100644 index 00000000..7db8bd3f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.4 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-dummy.m b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-dummy.m new file mode 100644 index 00000000..9b4e22d1 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_secp256k1_swift : NSObject +@end +@implementation PodsDummy_secp256k1_swift +@end diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch new file mode 100644 index 00000000..beb2a244 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-umbrella.h b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-umbrella.h new file mode 100644 index 00000000..da889c89 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift-umbrella.h @@ -0,0 +1,19 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "secp256k1.h" +#import "secp256k1_ecdh.h" +#import "secp256k1_recovery.h" + +FOUNDATION_EXPORT double secp256k1VersionNumber; +FOUNDATION_EXPORT const unsigned char secp256k1VersionString[]; + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.debug.xcconfig b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.debug.xcconfig new file mode 100644 index 00000000..9dee400a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.debug.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/secp256k1/Classes" +OTHER_CFLAGS = $(inherited) -DHAVE_CONFIG_H=1 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-shorten-64-to-32 -Wno-conditional-uninitialized -Wno-unused-function -Wno-long-long -Wno-overlength-strings -O3 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_INCLUDE_PATHS = $(inherited) ${PODS_ROOT} +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.modulemap b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.modulemap new file mode 100644 index 00000000..301c4d17 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.modulemap @@ -0,0 +1,6 @@ +framework module secp256k1 { + umbrella header "secp256k1.swift-umbrella.h" + + export * + module * { export * } +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.release.xcconfig b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.release.xcconfig new file mode 100644 index 00000000..9dee400a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Pods/Target Support Files/secp256k1.swift/secp256k1.swift.release.xcconfig @@ -0,0 +1,14 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/secp256k1.swift +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/secp256k1/Classes" +OTHER_CFLAGS = $(inherited) -DHAVE_CONFIG_H=1 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-shorten-64-to-32 -Wno-conditional-uninitialized -Wno-unused-function -Wno-long-long -Wno-overlength-strings -O3 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +SWIFT_INCLUDE_PATHS = $(inherited) ${PODS_ROOT} +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Tests/Info.plist b/Carthage/Checkouts/secp256k1.swift/Example/Tests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/Tests/Tests.swift b/Carthage/Checkouts/secp256k1.swift/Example/Tests/Tests.swift new file mode 100644 index 00000000..cc8b6513 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/Tests/Tests.swift @@ -0,0 +1,9 @@ + +import XCTest + +class Test: XCTest { + + func testExample() { + XCTAssert(10 == 10) + } +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.pbxproj b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.pbxproj new file mode 100644 index 00000000..704493d0 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.pbxproj @@ -0,0 +1,539 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 28C87C5295E19294E17FEAFB /* Pods_secp256k1_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE85D6957744DDAB8F346E07 /* Pods_secp256k1_Example.framework */; }; + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 607FACCF1AFB9204008FA782; + remoteInfo = secp256k1; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 37B25BA0A2B2E51AC45C6F1B /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 3C7FCC32CB0510D76DCCF4B7 /* secp256k1.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = secp256k1.podspec; path = ../secp256k1.podspec; sourceTree = ""; }; + 607FACD01AFB9204008FA782 /* secp256k1_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = secp256k1_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* secp256k1_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = secp256k1_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; + 651F233348013DB00E398AE8 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = ""; }; + A4A2B58E31A177A30945ACD0 /* Pods-secp256k1_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-secp256k1_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.debug.xcconfig"; sourceTree = ""; }; + BE85D6957744DDAB8F346E07 /* Pods_secp256k1_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_secp256k1_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C31B04AB194C6A0DC0067A4D /* Pods-secp256k1_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-secp256k1_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACCD1AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 28C87C5295E19294E17FEAFB /* Pods_secp256k1_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3452269D6FFE2919F644E3D4 /* Pods */ = { + isa = PBXGroup; + children = ( + A4A2B58E31A177A30945ACD0 /* Pods-secp256k1_Example.debug.xcconfig */, + C31B04AB194C6A0DC0067A4D /* Pods-secp256k1_Example.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + 4E6F569EE64A311D6B46035C /* Frameworks */ = { + isa = PBXGroup; + children = ( + BE85D6957744DDAB8F346E07 /* Pods_secp256k1_Example.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACD21AFB9204008FA782 /* Example for secp256k1 */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + 3452269D6FFE2919F644E3D4 /* Pods */, + 4E6F569EE64A311D6B46035C /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACD01AFB9204008FA782 /* secp256k1_Example.app */, + 607FACE51AFB9204008FA782 /* secp256k1_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 607FACD21AFB9204008FA782 /* Example for secp256k1 */ = { + isa = PBXGroup; + children = ( + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 607FACD71AFB9204008FA782 /* ViewController.swift */, + 607FACD91AFB9204008FA782 /* Main.storyboard */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 607FACD31AFB9204008FA782 /* Supporting Files */, + ); + name = "Example for secp256k1"; + path = secp256k1; + sourceTree = ""; + }; + 607FACD31AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACD41AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 607FACEB1AFB9204008FA782 /* Tests.swift */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + 3C7FCC32CB0510D76DCCF4B7 /* secp256k1.podspec */, + 651F233348013DB00E398AE8 /* README.md */, + 37B25BA0A2B2E51AC45C6F1B /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACCF1AFB9204008FA782 /* secp256k1_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "secp256k1_Example" */; + buildPhases = ( + B2BD5E4C789A15C45E92AC77 /* [CP] Check Pods Manifest.lock */, + 607FACCC1AFB9204008FA782 /* Sources */, + 607FACCD1AFB9204008FA782 /* Frameworks */, + 607FACCE1AFB9204008FA782 /* Resources */, + 112D045169968519ACD2A4C1 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = secp256k1_Example; + productName = secp256k1; + productReference = 607FACD01AFB9204008FA782 /* secp256k1_Example.app */; + productType = "com.apple.product-type.application"; + }; + 607FACE41AFB9204008FA782 /* secp256k1_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "secp256k1_Tests" */; + buildPhases = ( + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 607FACE71AFB9204008FA782 /* PBXTargetDependency */, + ); + name = secp256k1_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* secp256k1_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "secp256k1" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACCF1AFB9204008FA782 /* secp256k1_Example */, + 607FACE41AFB9204008FA782 /* secp256k1_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACCE1AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 112D045169968519ACD2A4C1 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/secp256k1.swift/secp256k1.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/secp256k1.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-secp256k1_Example/Pods-secp256k1_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B2BD5E4C789A15C45E92AC77 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-secp256k1_Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACCC1AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 607FACCF1AFB9204008FA782 /* secp256k1_Example */; + targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 607FACD91AFB9204008FA782 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 607FACDA1AFB9204008FA782 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 607FACDF1AFB9204008FA782 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF01AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A4A2B58E31A177A30945ACD0 /* Pods-secp256k1_Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = secp256k1/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 607FACF11AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C31B04AB194C6A0DC0067A4D /* Pods-secp256k1_Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = secp256k1/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "secp256k1" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "secp256k1_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF01AFB9204008FA782 /* Debug */, + 607FACF11AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "secp256k1_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..8cada0f0 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/xcshareddata/xcschemes/secp256k1-Example.xcscheme b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/xcshareddata/xcschemes/secp256k1-Example.xcscheme new file mode 100644 index 00000000..9adfd61e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcodeproj/xcshareddata/xcschemes/secp256k1-Example.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..edeb60b5 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/AppDelegate.swift b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/AppDelegate.swift new file mode 100644 index 00000000..3a676a61 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// secp256k1 +// +// Created by Koray Koska on 02/14/2018. +// Copyright (c) 2018 Koray Koska. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/LaunchScreen.xib b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/LaunchScreen.xib new file mode 100644 index 00000000..819f5e1e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/LaunchScreen.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/Main.storyboard b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/Main.storyboard new file mode 100644 index 00000000..d2cd946d --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Base.lproj/Main.storyboard @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Images.xcassets/AppIcon.appiconset/Contents.json b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..7006c9ee --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Info.plist b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Info.plist new file mode 100644 index 00000000..eb18faac --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + + + diff --git a/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/ViewController.swift b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/ViewController.swift new file mode 100644 index 00000000..b1bc1a27 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Example/secp256k1/ViewController.swift @@ -0,0 +1,32 @@ +// +// ViewController.swift +// secp256k1 +// +// Created by Koray Koska on 02/14/2018. +// Copyright (c) 2018 Koray Koska. All rights reserved. +// + +import UIKit +import secp256k1 + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + + let ctx = secp256k1_context_create(UInt32(SECP256K1_CONTEXT_SIGN)) + if ctx != nil { + print("Context created") + } else { + print("Context creation failed") + } + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +} + diff --git a/Carthage/Checkouts/secp256k1.swift/LICENSE b/Carthage/Checkouts/secp256k1.swift/LICENSE new file mode 100644 index 00000000..d202b84a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018 Boilertalk Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Carthage/Checkouts/secp256k1.swift/Package.swift b/Carthage/Checkouts/secp256k1.swift/Package.swift new file mode 100644 index 00000000..db68530e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/Package.swift @@ -0,0 +1,65 @@ +// swift-tools-version:5.1 +// The swift-tools-version declares the minimum version of Swift required to build this package. +import PackageDescription + +let package = Package( + name: "secp256k1", + products: [ + // Products define the executables and libraries produced by a package, and make them visible to other packages. + .library( + name: "secp256k1", + targets: ["secp256k1"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages which this package depends on. + .target( + name: "libsecp256k1", + path: "./secp256k1/Classes", + exclude: [ + "secp256k1/build-aux", + "secp256k1/obj", + "secp256k1/sage", + "secp256k1/src/asm", + "secp256k1/src/java", + "secp256k1/src/testrand_impl.h", + "secp256k1/src/testrand.h", + "secp256k1/src/tests_exhaustive.c", + "secp256k1/src/tests.c", + "secp256k1/src/gen_context.c", + "secp256k1/src/bench_ecdh.c", + "secp256k1/src/bench_ecmult.c", + "secp256k1/src/bench_internal.c", + "secp256k1/src/bench_recover.c", + "secp256k1/src/bench_sign.c", + "secp256k1/src/bench_verify.c", + "secp256k1/src/bench.h", + "secp256k1/src/modules/ecdh/tests_impl.h", + "secp256k1/src/modules/recovery/tests_impl.h", + + "exporter" + ], + sources: [ + ".", + "secp256k1/src", + "secp256k1/include", + "secp256k1/contrib", + "secp256k1/src/modules/ecdh", + "secp256k1/src/modules/recovery" + ], + publicHeadersPath: "secp256k1/include", + cSettings: [ + .headerSearchPath("secp256k1/src") + ] + ), + .target( + name: "secp256k1", + dependencies: ["libsecp256k1"], + path: "./secp256k1/Classes/exporter", + sources: ["."]) + ] +) diff --git a/Carthage/Checkouts/secp256k1.swift/README.md b/Carthage/Checkouts/secp256k1.swift/README.md new file mode 100644 index 00000000..921b3c66 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/README.md @@ -0,0 +1,83 @@ + + + + +

+ + CI Status + + + Version + + + License + + + Platform + + + Carthage compatible + +

+ +# :alembic: secp256k1 + +This library provides [secp256k1](https://github.com/bitcoin-core/secp256k1) bindings for Swift with Cocoapods, Carthage and Swift Package Manager on macOS and Linux. +The Cocoapods version supports iOS 8.0, macOS 10.10, tvOS 9.0 and watchOS 2.0. The Swift Package Manager version supports macOS and Linux. + +We try to merge bug fix commits ASAP and only change the import and config structure of the original repository in order to create a compilable version for the package managers. + +All credits for the original source code goes to [bitcoin-core](https://github.com/bitcoin-core). + +> Note: This library only binds the original C code into a Swift package. If you want an Ethereum Web3 package which manages signatures and verifications, check out [Web3.swift](https://github.com/Boilertalk/Web3.swift) + +## Example + +To run the example project, run `pod try secp256k1.swift`. Or clone the repo, and run pod install from the Example directory. + +## Installation + +### CocoaPods + +secp256k1 is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your `Podfile`: + +```ruby +pod 'secp256k1.swift' +``` + +### Carthage + +secp256k1 is compatible with [Carthage](https://github.com/Carthage/Carthage), a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To install it, simply add the following line to your `Cartfile`: + +``` +github "Boilertalk/secp256k1.swift" +``` + +### Swift Package Manager + +secp256k1 is compatible with Swift Package Manager v4 (Swift 4 and above). Simply add it to the dependencies in your `Package.swift`. + +```Swift +dependencies: [ + .package(url: "https://github.com/Boilertalk/secp256k1.swift.git", from: "0.1.0") +] +``` + +## Usage + +To use secp256k1 functions you need to import it first. + +```Swift +import secp256k1 +``` + +After that you can use all secp256k1 functions as described [in the official headers](https://github.com/bitcoin-core/secp256k1/tree/master/include). + +## Author + +Koray Koska, koray@koska.at + +## License + +secp256k1 is available under the MIT license. See the LICENSE file for more info. diff --git a/Carthage/Checkouts/secp256k1.swift/_Pods.xcodeproj b/Carthage/Checkouts/secp256k1.swift/_Pods.xcodeproj new file mode 120000 index 00000000..3c5a8e71 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/_Pods.xcodeproj @@ -0,0 +1 @@ +Example/Pods/Pods.xcodeproj \ No newline at end of file diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1.swift.podspec b/Carthage/Checkouts/secp256k1.swift/secp256k1.swift.podspec new file mode 100644 index 00000000..a5447453 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1.swift.podspec @@ -0,0 +1,56 @@ +# +# Be sure to run `pod lib lint secp256k1.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = 'secp256k1.swift' + s.version = '0.1.4' + s.summary = 'secp256k1 bindings for swift. Cocoapods, Carthage and SPM support. Linux support.' + +# This description is used to generate tags and improve search results. +# * Think: What does it do? Why did you write it? What is the focus? +# * Try to keep it short, snappy and to the point. +# * Write the description between the DESC delimiters below. +# * Finally, don't worry about the indent, CocoaPods strips it! + + s.description = <<-DESC +This pod binds the bitcoin-core library, the ECDSA curve, secp256k1 into Swift. This curve is used for +Bitcoin, Ethereum and many other Cryptocurrency Signature generation and verification. + DESC + + s.homepage = 'https://github.com/Boilertalk/secp256k1.swift' + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'Koray Koska' => 'koray@koska.at' } + s.source = { :git => 'https://github.com/Boilertalk/secp256k1.swift.git', :tag => s.version.to_s, :submodules => true } + # s.social_media_url = 'https://twitter.com/' + + s.ios.deployment_target = '8.0' + s.osx.deployment_target = '10.10' + s.tvos.deployment_target = '9.0' + s.watchos.deployment_target = '2.0' + + s.module_name = 'secp256k1' + + s.pod_target_xcconfig = { + 'SWIFT_INCLUDE_PATHS' => '${PODS_ROOT}', + 'OTHER_CFLAGS' => '-DHAVE_CONFIG_H=1 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-shorten-64-to-32 -Wno-conditional-uninitialized -Wno-unused-function -Wno-long-long -Wno-overlength-strings -O3', + 'HEADER_SEARCH_PATHS' => '"${PODS_ROOT}/secp256k1/Classes"' + } + + s.source_files = 'secp256k1/Classes/secp256k1/{src,include,contrib}/*.{h,c}', 'secp256k1/Classes/secp256k1/src/modules/{recovery,ecdh}/*.{h,c}', 'secp256k1/Classes/secp256k1-config.h', 'secp256k1/Classes/secp256k1_main.h', 'secp256k1/Classes/secp256k1_ec_mult_static_context.h' + s.public_header_files = 'secp256k1/Classes/secp256k1/include/*.h' + s.private_header_files = 'secp256k1/Classes/secp256k1_ec_mult_static_context.h', 'secp256k1/Classes/secp256k1/*.h', 'secp256k1/Classes/secp256k1/{contrib,src}/*.h', 'secp256k1/Classes/secp256k1/src/modules/{recovery, ecdh}/*.h' + s.exclude_files = 'secp256k1/Classes/secp256k1/src/test*.{c,h}', 'secp256k1/Classes/secp256k1/src/gen_context.c', 'secp256k1/Classes/secp256k1/src/*bench*.{c,h}', 'secp256k1/Classes/secp256k1/src/modules/{recovery,ecdh}/*test*.{c,h}' + + # s.resource_bundles = { + # 'secp256k1' => ['secp256k1/Assets/*.png'] + # } + + # s.frameworks = 'UIKit', 'MapKit' + # s.dependency 'AFNetworking', '~> 2.3' +end diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Assets/.gitkeep b/Carthage/Checkouts/secp256k1.swift/secp256k1/Assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/.gitkeep b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/exporter/Exporter.swift b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/exporter/Exporter.swift new file mode 100644 index 00000000..5921657c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/exporter/Exporter.swift @@ -0,0 +1 @@ +@_exported import libsecp256k1 diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1-config.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1-config.h new file mode 100644 index 00000000..e6982f32 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1-config.h @@ -0,0 +1,169 @@ +/* src/libsecp256k1-config.h. Generated from libsecp256k1-config.h.in by configure. */ +/* src/libsecp256k1-config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef LIBSECP256K1_CONFIG_H + +#define LIBSECP256K1_CONFIG_H + +#undef USE_BASIC_CONFIG + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Define this symbol to compile out all VERIFY code */ +/* #undef COVERAGE */ + +/* Define this symbol to enable the ECDH module */ +#define ENABLE_MODULE_ECDH 1 + +/* Define this symbol to enable the ECDSA pubkey recovery module */ +#define ENABLE_MODULE_RECOVERY 1 + +/* Define this symbol if OpenSSL EC functions are available */ +/* #undef ENABLE_OPENSSL_TESTS */ + +/* Define this symbol if __builtin_expect is available */ +#define HAVE_BUILTIN_EXPECT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define this symbol if libcrypto is installed */ +/* #define HAVE_LIBCRYPTO 1 */ + +/* Define this symbol if libgmp is installed */ +/* #define HAVE_LIBGMP 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type `__int128'. */ +/* #define HAVE___INT128 1 */ + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +/* #define LT_OBJDIR ".libs/" */ + +/* Name of package */ +#define PACKAGE "libsecp256k1" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "libsecp256k1" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "libsecp256k1 0.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "libsecp256k1" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "0.1" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define this symbol to enable x86_64 assembly optimizations */ +/* #define USE_ASM_X86_64 1 */ + +/* Define this symbol to use a statically generated ecmult table */ +#define USE_ECMULT_STATIC_PRECOMPUTATION 1 + +/* Define this symbol to use endomorphism optimization */ +/* #undef USE_ENDOMORPHISM */ + +/* Define this symbol if an external (non-inline) assembly implementation is + used */ +/* #undef USE_EXTERNAL_ASM */ + +/* Define this symbol to use the FIELD_10X26 implementation */ +/* #undef USE_FIELD_10X26 */ + +/* Define this symbol to use the FIELD_5X52 implementation */ +/* #define USE_FIELD_5X52 1 */ + +/* Define this symbol to use the native field inverse implementation */ +/* #undef USE_FIELD_INV_BUILTIN */ + +/* Define this symbol to use the num-based field inverse implementation */ +/* #define USE_FIELD_INV_NUM 1 */ + +/* Define this symbol to use the gmp implementation for num */ +/* #define USE_NUM_GMP 1 */ + +/* Define this symbol to use no num implementation */ +/* #undef USE_NUM_NONE */ + +/* Define this symbol to use the 4x64 scalar implementation */ +/* #define USE_SCALAR_4X64 1 */ + +/* Define this symbol to use the 8x32 scalar implementation */ +/* #undef USE_SCALAR_8X32 */ + +/* Define this symbol to use the native scalar inverse implementation */ +/* #undef USE_SCALAR_INV_BUILTIN */ + +/* Define this symbol to use the num-based scalar inverse implementation */ +/* #define USE_SCALAR_INV_NUM 1 */ + +/* Version number of package */ +#define VERSION "0.1" + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ + +// #if defined AC_APPLE_UNIVERSAL_BUILD +// # if defined __BIG_ENDIAN__ +// # define WORDS_BIGENDIAN 1 +// # endif +// #else +// # ifndef WORDS_BIGENDIAN +// /* # undef WORDS_BIGENDIAN */ +// # endif +// #endif + +/* Extra configuration */ + +#define USE_NUM_NONE 1 +#define USE_FIELD_INV_BUILTIN 1 +#define USE_SCALAR_INV_BUILTIN 1 +#define ENABLE_MODULE_RECOVERY 1 + +#ifdef __LP64__ +#define HAVE___INT128 1 +#define USE_FIELD_5X52 1 +#define USE_SCALAR_4X64 1 +#else +#define USE_FIELD_10X26 1 +#define USE_SCALAR_8X32 1 +#endif + +#endif /*LIBSECP256K1_CONFIG_H*/ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.gitignore b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.gitignore new file mode 100644 index 00000000..55d325ae --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.gitignore @@ -0,0 +1,50 @@ +bench_inv +bench_ecdh +bench_ecmult +bench_sign +bench_verify +bench_schnorr_verify +bench_recover +bench_internal +tests +exhaustive_tests +gen_context +*.exe +*.so +*.a +!.gitignore + +Makefile +configure +.libs/ +Makefile.in +aclocal.m4 +autom4te.cache/ +config.log +config.status +*.tar.gz +*.la +libtool +.deps/ +.dirstamp +*.lo +*.o +*~ +src/libsecp256k1-config.h +src/libsecp256k1-config.h.in +src/ecmult_static_context.h +build-aux/config.guess +build-aux/config.sub +build-aux/depcomp +build-aux/install-sh +build-aux/ltmain.sh +build-aux/m4/libtool.m4 +build-aux/m4/lt~obsolete.m4 +build-aux/m4/ltoptions.m4 +build-aux/m4/ltsugar.m4 +build-aux/m4/ltversion.m4 +build-aux/missing +build-aux/compile +build-aux/test-driver +src/stamp-h1 +libsecp256k1.pc diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.travis.yml b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.travis.yml new file mode 100644 index 00000000..c4154e9a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/.travis.yml @@ -0,0 +1,69 @@ +language: c +sudo: false +addons: + apt: + packages: libgmp-dev +compiler: + - clang + - gcc +cache: + directories: + - src/java/guava/ +env: + global: + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no JNI=no + - GUAVA_URL=https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar GUAVA_JAR=src/java/guava/guava-18.0.jar + matrix: + - SCALAR=32bit RECOVERY=yes + - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes + - SCALAR=64bit + - FIELD=64bit RECOVERY=yes + - FIELD=64bit ENDOMORPHISM=yes + - FIELD=64bit ENDOMORPHISM=yes ECDH=yes EXPERIMENTAL=yes + - FIELD=64bit ASM=x86_64 + - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 + - FIELD=32bit ENDOMORPHISM=yes + - BIGNUM=no + - BIGNUM=no ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes + - BIGNUM=no STATICPRECOMPUTATION=no + - BUILD=distcheck + - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC + - EXTRAFLAGS=CFLAGS=-O0 + - BUILD=check-java JNI=yes ECDH=yes EXPERIMENTAL=yes +matrix: + fast_finish: true + include: + - compiler: clang + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 + - compiler: clang + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 +before_install: mkdir -p `dirname $GUAVA_JAR` +install: if [ ! -f $GUAVA_JAR ]; then wget $GUAVA_URL -O $GUAVA_JAR; fi +before_script: ./autogen.sh +script: + - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi + - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi + - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY --enable-jni=$JNI $EXTRAFLAGS $USE_HOST && make -j2 $BUILD +os: linux diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/COPYING b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/COPYING new file mode 100644 index 00000000..4522a599 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2013 Pieter Wuille + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/Makefile.am b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/Makefile.am new file mode 100644 index 00000000..01fd0cd6 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/Makefile.am @@ -0,0 +1,183 @@ +ACLOCAL_AMFLAGS = -I build-aux/m4 + +lib_LTLIBRARIES = libsecp256k1.la +if USE_JNI +JNI_LIB = libsecp256k1_jni.la +noinst_LTLIBRARIES = $(JNI_LIB) +else +JNI_LIB = +endif +include_HEADERS = include/secp256k1.h +noinst_HEADERS = +noinst_HEADERS += src/scalar.h +noinst_HEADERS += src/scalar_4x64.h +noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_low.h +noinst_HEADERS += src/scalar_impl.h +noinst_HEADERS += src/scalar_4x64_impl.h +noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/scalar_low_impl.h +noinst_HEADERS += src/group.h +noinst_HEADERS += src/group_impl.h +noinst_HEADERS += src/num_gmp.h +noinst_HEADERS += src/num_gmp_impl.h +noinst_HEADERS += src/ecdsa.h +noinst_HEADERS += src/ecdsa_impl.h +noinst_HEADERS += src/eckey.h +noinst_HEADERS += src/eckey_impl.h +noinst_HEADERS += src/ecmult.h +noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_const.h +noinst_HEADERS += src/ecmult_const_impl.h +noinst_HEADERS += src/ecmult_gen.h +noinst_HEADERS += src/ecmult_gen_impl.h +noinst_HEADERS += src/num.h +noinst_HEADERS += src/num_impl.h +noinst_HEADERS += src/field_10x26.h +noinst_HEADERS += src/field_10x26_impl.h +noinst_HEADERS += src/field_5x52.h +noinst_HEADERS += src/field_5x52_impl.h +noinst_HEADERS += src/field_5x52_int128_impl.h +noinst_HEADERS += src/field_5x52_asm_impl.h +noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/java/org_bitcoin_Secp256k1Context.h +noinst_HEADERS += src/util.h +noinst_HEADERS += src/scratch.h +noinst_HEADERS += src/scratch_impl.h +noinst_HEADERS += src/testrand.h +noinst_HEADERS += src/testrand_impl.h +noinst_HEADERS += src/hash.h +noinst_HEADERS += src/hash_impl.h +noinst_HEADERS += src/field.h +noinst_HEADERS += src/field_impl.h +noinst_HEADERS += src/bench.h +noinst_HEADERS += contrib/lax_der_parsing.h +noinst_HEADERS += contrib/lax_der_parsing.c +noinst_HEADERS += contrib/lax_der_privatekey_parsing.h +noinst_HEADERS += contrib/lax_der_privatekey_parsing.c + +if USE_EXTERNAL_ASM +COMMON_LIB = libsecp256k1_common.la +noinst_LTLIBRARIES = $(COMMON_LIB) +else +COMMON_LIB = +endif + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libsecp256k1.pc + +if USE_EXTERNAL_ASM +if USE_ASM_ARM +libsecp256k1_common_la_SOURCES = src/asm/field_10x26_arm.s +endif +endif + +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/include -I$(top_srcdir)/src $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(JNI_LIB) $(SECP_LIBS) $(COMMON_LIB) + +libsecp256k1_jni_la_SOURCES = src/java/org_bitcoin_NativeSecp256k1.c src/java/org_bitcoin_Secp256k1Context.c +libsecp256k1_jni_la_CPPFLAGS = -DSECP256K1_BUILD $(JNI_INCLUDES) + +noinst_PROGRAMS = +if USE_BENCHMARK +noinst_PROGRAMS += bench_verify bench_sign bench_internal bench_ecmult +bench_verify_SOURCES = src/bench_verify.c +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) +bench_sign_SOURCES = src/bench_sign.c +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) +bench_internal_SOURCES = src/bench_internal.c +bench_internal_LDADD = $(SECP_LIBS) $(COMMON_LIB) +bench_internal_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) +bench_ecmult_SOURCES = src/bench_ecmult.c +bench_ecmult_LDADD = $(SECP_LIBS) $(COMMON_LIB) +bench_ecmult_CPPFLAGS = -DSECP256K1_BUILD $(SECP_INCLUDES) +endif + +TESTS = +if USE_TESTS +noinst_PROGRAMS += tests +tests_SOURCES = src/tests.c +tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src -I$(top_srcdir)/include $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +if !ENABLE_COVERAGE +tests_CPPFLAGS += -DVERIFY +endif +tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) $(COMMON_LIB) +tests_LDFLAGS = -static +TESTS += tests +endif + +if USE_EXHAUSTIVE_TESTS +noinst_PROGRAMS += exhaustive_tests +exhaustive_tests_SOURCES = src/tests_exhaustive.c +exhaustive_tests_CPPFLAGS = -DSECP256K1_BUILD -I$(top_srcdir)/src $(SECP_INCLUDES) +if !ENABLE_COVERAGE +exhaustive_tests_CPPFLAGS += -DVERIFY +endif +exhaustive_tests_LDADD = $(SECP_LIBS) +exhaustive_tests_LDFLAGS = -static +TESTS += exhaustive_tests +endif + +JAVAROOT=src/java +JAVAORG=org/bitcoin +JAVA_GUAVA=$(srcdir)/$(JAVAROOT)/guava/guava-18.0.jar +CLASSPATH_ENV=CLASSPATH=$(JAVA_GUAVA) +JAVA_FILES= \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Test.java \ + $(JAVAROOT)/$(JAVAORG)/NativeSecp256k1Util.java \ + $(JAVAROOT)/$(JAVAORG)/Secp256k1Context.java + +if USE_JNI + +$(JAVA_GUAVA): + @echo Guava is missing. Fetch it via: \ + wget https://search.maven.org/remotecontent?filepath=com/google/guava/guava/18.0/guava-18.0.jar -O $(@) + @false + +.stamp-java: $(JAVA_FILES) + @echo Compiling $^ + $(AM_V_at)$(CLASSPATH_ENV) javac $^ + @touch $@ + +if USE_TESTS + +check-java: libsecp256k1.la $(JAVA_GUAVA) .stamp-java + $(AM_V_at)java -Djava.library.path="./:./src:./src/.libs:.libs/" -cp "$(JAVA_GUAVA):$(JAVAROOT)" $(JAVAORG)/NativeSecp256k1Test + +endif +endif + +if USE_ECMULT_STATIC_PRECOMPUTATION +CPPFLAGS_FOR_BUILD +=-I$(top_srcdir) +CFLAGS_FOR_BUILD += -Wall -Wextra -Wno-unused-function + +gen_context_OBJECTS = gen_context.o +gen_context_BIN = gen_context$(BUILD_EXEEXT) +gen_%.o: src/gen_%.c + $(CC_FOR_BUILD) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) -c $< -o $@ + +$(gen_context_BIN): $(gen_context_OBJECTS) + $(CC_FOR_BUILD) $^ -o $@ + +$(libsecp256k1_la_OBJECTS): src/ecmult_static_context.h +$(tests_OBJECTS): src/ecmult_static_context.h +$(bench_internal_OBJECTS): src/ecmult_static_context.h +$(bench_ecmult_OBJECTS): src/ecmult_static_context.h + +src/ecmult_static_context.h: $(gen_context_BIN) + ./$(gen_context_BIN) + +CLEANFILES = $(gen_context_BIN) src/ecmult_static_context.h $(JAVAROOT)/$(JAVAORG)/*.class .stamp-java +endif + +EXTRA_DIST = autogen.sh src/gen_context.c src/basic-config.h $(JAVA_FILES) + +if ENABLE_MODULE_ECDH +include src/modules/ecdh/Makefile.am.include +endif + +if ENABLE_MODULE_RECOVERY +include src/modules/recovery/Makefile.am.include +endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/README.md b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/README.md new file mode 100644 index 00000000..8cd344ea --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/README.md @@ -0,0 +1,61 @@ +libsecp256k1 +============ + +[![Build Status](https://travis-ci.org/bitcoin-core/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin-core/secp256k1) + +Optimized C library for EC operations on curve secp256k1. + +This library is a work in progress and is being used to research best practices. Use at your own risk. + +Features: +* secp256k1 ECDSA signing/verification and key generation. +* Adding/multiplying private/public keys. +* Serialization/parsing of private keys, public keys, signatures. +* Constant time, constant memory access signing and pubkey generation. +* Derandomized DSA (via RFC6979 or with a caller provided function.) +* Very efficient implementation. + +Implementation details +---------------------- + +* General + * No runtime heap allocation. + * Extensive testing infrastructure. + * Structured to facilitate review and analysis. + * Intended to be portable to any system with a C89 compiler and uint64_t support. + * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") +* Field operations + * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). + * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). + * Using 10 26-bit limbs. + * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). +* Scalar operations + * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. + * Using 4 64-bit limbs (relying on __int128 support in the compiler). + * Using 8 32-bit limbs. +* Group operations + * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). + * Use addition between points in Jacobian and affine coordinates where possible. + * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. + * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. +* Point multiplication for verification (a*P + b*G). + * Use wNAF notation for point multiplicands. + * Use a much larger window for multiples of G, using precomputed multiples. + * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. + * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. +* Point multiplication for signing + * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. + * Access the table with branch-free conditional moves so memory access is uniform. + * No data-dependent branches + * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. + +Build steps +----------- + +libsecp256k1 is built using autotools: + + $ ./autogen.sh + $ ./configure + $ make + $ ./tests + $ sudo make install # optional diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/TODO b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/TODO new file mode 100644 index 00000000..a300e1c5 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/TODO @@ -0,0 +1,3 @@ +* Unit tests for fieldelem/groupelem, including ones intended to + trigger fieldelem's boundary cases. +* Complete constant-time operations for signing/keygen diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/autogen.sh b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/autogen.sh new file mode 100755 index 00000000..65286b93 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +autoreconf -if --warnings=all diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_jni_include_dir.m4 b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_jni_include_dir.m4 new file mode 100644 index 00000000..cdc78d87 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_jni_include_dir.m4 @@ -0,0 +1,145 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_jni_include_dir.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_JNI_INCLUDE_DIR +# +# DESCRIPTION +# +# AX_JNI_INCLUDE_DIR finds include directories needed for compiling +# programs using the JNI interface. +# +# JNI include directories are usually in the Java distribution. This is +# deduced from the value of $JAVA_HOME, $JAVAC, or the path to "javac", in +# that order. When this macro completes, a list of directories is left in +# the variable JNI_INCLUDE_DIRS. +# +# Example usage follows: +# +# AX_JNI_INCLUDE_DIR +# +# for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS +# do +# CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" +# done +# +# If you want to force a specific compiler: +# +# - at the configure.in level, set JAVAC=yourcompiler before calling +# AX_JNI_INCLUDE_DIR +# +# - at the configure level, setenv JAVAC +# +# Note: This macro can work with the autoconf M4 macros for Java programs. +# This particular macro is not part of the original set of macros. +# +# LICENSE +# +# Copyright (c) 2008 Don Anderson +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 14 + +AU_ALIAS([AC_JNI_INCLUDE_DIR], [AX_JNI_INCLUDE_DIR]) +AC_DEFUN([AX_JNI_INCLUDE_DIR],[ + +JNI_INCLUDE_DIRS="" + +if test "x$JAVA_HOME" != x; then + _JTOPDIR="$JAVA_HOME" +else + if test "x$JAVAC" = x; then + JAVAC=javac + fi + AC_PATH_PROG([_ACJNI_JAVAC], [$JAVAC], [no]) + if test "x$_ACJNI_JAVAC" = xno; then + AC_MSG_WARN([cannot find JDK; try setting \$JAVAC or \$JAVA_HOME]) + fi + _ACJNI_FOLLOW_SYMLINKS("$_ACJNI_JAVAC") + _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[[^/]]*$::'` +fi + +case "$host_os" in + darwin*) # Apple Java headers are inside the Xcode bundle. + macos_version=$(sw_vers -productVersion | sed -n -e 's/^@<:@0-9@:>@*.\(@<:@0-9@:>@*\).@<:@0-9@:>@*/\1/p') + if @<:@ "$macos_version" -gt "7" @:>@; then + _JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework" + _JINC="$_JTOPDIR/Headers" + else + _JTOPDIR="/System/Library/Frameworks/JavaVM.framework" + _JINC="$_JTOPDIR/Headers" + fi + ;; + *) _JINC="$_JTOPDIR/include";; +esac +_AS_ECHO_LOG([_JTOPDIR=$_JTOPDIR]) +_AS_ECHO_LOG([_JINC=$_JINC]) + +# On Mac OS X 10.6.4, jni.h is a symlink: +# /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h +# -> ../../CurrentJDK/Headers/jni.h. +AC_CACHE_CHECK(jni headers, ac_cv_jni_header_path, +[ + if test -f "$_JINC/jni.h"; then + ac_cv_jni_header_path="$_JINC" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" + else + _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[[^/]]*$::'` + if test -f "$_JTOPDIR/include/jni.h"; then + ac_cv_jni_header_path="$_JTOPDIR/include" + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" + else + ac_cv_jni_header_path=none + fi + fi +]) + +# get the likely subdirectories for system specific java includes +case "$host_os" in +bsdi*) _JNI_INC_SUBDIRS="bsdos";; +freebsd*) _JNI_INC_SUBDIRS="freebsd";; +darwin*) _JNI_INC_SUBDIRS="darwin";; +linux*) _JNI_INC_SUBDIRS="linux genunix";; +osf*) _JNI_INC_SUBDIRS="alpha";; +solaris*) _JNI_INC_SUBDIRS="solaris";; +mingw*) _JNI_INC_SUBDIRS="win32";; +cygwin*) _JNI_INC_SUBDIRS="win32";; +*) _JNI_INC_SUBDIRS="genunix";; +esac + +if test "x$ac_cv_jni_header_path" != "xnone"; then + # add any subdirectories that are present + for JINCSUBDIR in $_JNI_INC_SUBDIRS + do + if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then + JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" + fi + done +fi +]) + +# _ACJNI_FOLLOW_SYMLINKS +# Follows symbolic links on , +# finally setting variable _ACJNI_FOLLOWED +# ---------------------------------------- +AC_DEFUN([_ACJNI_FOLLOW_SYMLINKS],[ +# find the include directory relative to the javac executable +_cur="$1" +while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do + AC_MSG_CHECKING([symlink for $_cur]) + _slink=`ls -ld "$_cur" | sed 's/.* -> //'` + case "$_slink" in + /*) _cur="$_slink";; + # 'X' avoids triggering unwanted echo options. + *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[[^/]]*$::'`"$_slink";; + esac + AC_MSG_RESULT([$_cur]) +done +_ACJNI_FOLLOWED="$_cur" +])# _ACJNI diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 new file mode 100644 index 00000000..77fd346a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 @@ -0,0 +1,125 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_CC_FOR_BUILD +# +# DESCRIPTION +# +# This macro searches for a C compiler that generates native executables, +# that is a C compiler that surely is not a cross-compiler. This can be +# useful if you have to generate source code at compile-time like for +# example GCC does. +# +# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything +# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). +# The value of these variables can be overridden by the user by specifying +# a compiler with an environment variable (like you do for standard CC). +# +# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object +# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if +# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are +# substituted in the Makefile. +# +# LICENSE +# +# Copyright (c) 2008 Paolo Bonzini +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 8 + +AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) +AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_CPP])dnl +AC_REQUIRE([AC_EXEEXT])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl + +dnl Use the standard macros, but make them use other variable names +dnl +pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl +pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl +pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl +pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl +pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl +pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl +pushdef([ac_cv_objext], ac_cv_build_objext)dnl +pushdef([ac_exeext], ac_build_exeext)dnl +pushdef([ac_objext], ac_build_objext)dnl +pushdef([CC], CC_FOR_BUILD)dnl +pushdef([CPP], CPP_FOR_BUILD)dnl +pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl +pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl +pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl +pushdef([host], build)dnl +pushdef([host_alias], build_alias)dnl +pushdef([host_cpu], build_cpu)dnl +pushdef([host_vendor], build_vendor)dnl +pushdef([host_os], build_os)dnl +pushdef([ac_cv_host], ac_cv_build)dnl +pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl +pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl +pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl +pushdef([ac_cv_host_os], ac_cv_build_os)dnl +pushdef([ac_cpp], ac_build_cpp)dnl +pushdef([ac_compile], ac_build_compile)dnl +pushdef([ac_link], ac_build_link)dnl + +save_cross_compiling=$cross_compiling +save_ac_tool_prefix=$ac_tool_prefix +cross_compiling=no +ac_tool_prefix= + +AC_PROG_CC +AC_PROG_CPP +AC_EXEEXT + +ac_tool_prefix=$save_ac_tool_prefix +cross_compiling=$save_cross_compiling + +dnl Restore the old definitions +dnl +popdef([ac_link])dnl +popdef([ac_compile])dnl +popdef([ac_cpp])dnl +popdef([ac_cv_host_os])dnl +popdef([ac_cv_host_vendor])dnl +popdef([ac_cv_host_cpu])dnl +popdef([ac_cv_host_alias])dnl +popdef([ac_cv_host])dnl +popdef([host_os])dnl +popdef([host_vendor])dnl +popdef([host_cpu])dnl +popdef([host_alias])dnl +popdef([host])dnl +popdef([LDFLAGS])dnl +popdef([CPPFLAGS])dnl +popdef([CFLAGS])dnl +popdef([CPP])dnl +popdef([CC])dnl +popdef([ac_objext])dnl +popdef([ac_exeext])dnl +popdef([ac_cv_objext])dnl +popdef([ac_cv_exeext])dnl +popdef([ac_cv_prog_cc_g])dnl +popdef([ac_cv_prog_cc_cross])dnl +popdef([ac_cv_prog_cc_works])dnl +popdef([ac_cv_prog_gcc])dnl +popdef([ac_cv_prog_CPP])dnl + +dnl Finally, set Makefile variables +dnl +BUILD_EXEEXT=$ac_build_exeext +BUILD_OBJEXT=$ac_build_objext +AC_SUBST(BUILD_EXEEXT)dnl +AC_SUBST(BUILD_OBJEXT)dnl +AC_SUBST([CFLAGS_FOR_BUILD])dnl +AC_SUBST([CPPFLAGS_FOR_BUILD])dnl +AC_SUBST([LDFLAGS_FOR_BUILD])dnl +]) diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/bitcoin_secp.m4 b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/bitcoin_secp.m4 new file mode 100644 index 00000000..3b3975cb --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/build-aux/m4/bitcoin_secp.m4 @@ -0,0 +1,68 @@ +dnl libsecp25k1 helper checks +AC_DEFUN([SECP_INT128_CHECK],[ +has_int128=$ac_cv_type___int128 +]) + +dnl escape "$0x" below using the m4 quadrigaph @S|@, and escape it again with a \ for the shell. +AC_DEFUN([SECP_64BIT_ASM_CHECK],[ +AC_MSG_CHECKING(for x86_64 assembly availability) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include ]],[[ + uint64_t a = 11, tmp; + __asm__ __volatile__("movq \@S|@0x100000000,%1; mulq %%rsi" : "+a"(a) : "S"(tmp) : "cc", "%rdx"); + ]])],[has_64bit_asm=yes],[has_64bit_asm=no]) +AC_MSG_RESULT([$has_64bit_asm]) +]) + +dnl +AC_DEFUN([SECP_OPENSSL_CHECK],[ + has_libcrypto=no + m4_ifdef([PKG_CHECK_MODULES],[ + PKG_CHECK_MODULES([CRYPTO], [libcrypto], [has_libcrypto=yes],[has_libcrypto=no]) + if test x"$has_libcrypto" = x"yes"; then + TEMP_LIBS="$LIBS" + LIBS="$LIBS $CRYPTO_LIBS" + AC_CHECK_LIB(crypto, main,[AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed])],[has_libcrypto=no]) + LIBS="$TEMP_LIBS" + fi + ]) + if test x$has_libcrypto = xno; then + AC_CHECK_HEADER(openssl/crypto.h,[ + AC_CHECK_LIB(crypto, main,[ + has_libcrypto=yes + CRYPTO_LIBS=-lcrypto + AC_DEFINE(HAVE_LIBCRYPTO,1,[Define this symbol if libcrypto is installed]) + ]) + ]) + LIBS= + fi +if test x"$has_libcrypto" = x"yes" && test x"$has_openssl_ec" = x; then + AC_MSG_CHECKING(for EC functions in libcrypto) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include ]],[[ + EC_KEY *eckey = EC_KEY_new_by_curve_name(NID_secp256k1); + ECDSA_sign(0, NULL, 0, NULL, NULL, eckey); + ECDSA_verify(0, NULL, 0, NULL, 0, eckey); + EC_KEY_free(eckey); + ECDSA_SIG *sig_openssl; + sig_openssl = ECDSA_SIG_new(); + ECDSA_SIG_free(sig_openssl); + ]])],[has_openssl_ec=yes],[has_openssl_ec=no]) + AC_MSG_RESULT([$has_openssl_ec]) +fi +]) + +dnl +AC_DEFUN([SECP_GMP_CHECK],[ +if test x"$has_gmp" != x"yes"; then + CPPFLAGS_TEMP="$CPPFLAGS" + CPPFLAGS="$GMP_CPPFLAGS $CPPFLAGS" + LIBS_TEMP="$LIBS" + LIBS="$GMP_LIBS $LIBS" + AC_CHECK_HEADER(gmp.h,[AC_CHECK_LIB(gmp, __gmpz_init,[has_gmp=yes; GMP_LIBS="$GMP_LIBS -lgmp"; AC_DEFINE(HAVE_LIBGMP,1,[Define this symbol if libgmp is installed])])]) + CPPFLAGS="$CPPFLAGS_TEMP" + LIBS="$LIBS_TEMP" +fi +]) diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/configure.ac b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/configure.ac new file mode 100644 index 00000000..68c45a56 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/configure.ac @@ -0,0 +1,494 @@ +AC_PREREQ([2.60]) +AC_INIT([libsecp256k1],[0.1]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) +AC_CANONICAL_HOST +AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) +AH_TOP([#define LIBSECP256K1_CONFIG_H]) +AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) +AM_INIT_AUTOMAKE([foreign subdir-objects]) +LT_INIT + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +PKG_PROG_PKG_CONFIG + +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(STRIP, strip) +AX_PROG_CC_FOR_BUILD + +if test "x$CFLAGS" = "x"; then + CFLAGS="-g" +fi + +AM_PROG_CC_C_O + +AC_PROG_CC_C89 +if test x"$ac_cv_prog_cc_c89" = x"no"; then + AC_MSG_ERROR([c89 compiler support required]) +fi +AM_PROG_AS + +case $host_os in + *darwin*) + if test x$cross_compiling != xyes; then + AC_PATH_PROG([BREW],brew,) + if test x$BREW != x; then + dnl These Homebrew packages may be keg-only, meaning that they won't be found + dnl in expected paths because they may conflict with system files. Ask + dnl Homebrew where each one is located, then adjust paths accordingly. + + openssl_prefix=`$BREW --prefix openssl 2>/dev/null` + gmp_prefix=`$BREW --prefix gmp 2>/dev/null` + if test x$openssl_prefix != x; then + PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH + fi + if test x$gmp_prefix != x; then + GMP_CPPFLAGS="-I$gmp_prefix/include" + GMP_LIBS="-L$gmp_prefix/lib" + fi + else + AC_PATH_PROG([PORT],port,) + dnl if homebrew isn't installed and macports is, add the macports default paths + dnl as a last resort. + if test x$PORT != x; then + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" + LDFLAGS="$LDFLAGS -L/opt/local/lib" + fi + fi + fi + ;; +esac + +CFLAGS="$CFLAGS -W" + +warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings" +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $warn_CFLAGS" +AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden" +AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + +AC_ARG_ENABLE(benchmark, + AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is yes)]), + [use_benchmark=$enableval], + [use_benchmark=yes]) + +AC_ARG_ENABLE(coverage, + AS_HELP_STRING([--enable-coverage],[enable compiler flags to support kcov coverage analysis]), + [enable_coverage=$enableval], + [enable_coverage=no]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_ENABLE(openssl_tests, + AS_HELP_STRING([--enable-openssl-tests],[enable OpenSSL tests, if OpenSSL is available (default is auto)]), + [enable_openssl_tests=$enableval], + [enable_openssl_tests=auto]) + +AC_ARG_ENABLE(experimental, + AS_HELP_STRING([--enable-experimental],[allow experimental configure options (default is no)]), + [use_experimental=$enableval], + [use_experimental=no]) + +AC_ARG_ENABLE(exhaustive_tests, + AS_HELP_STRING([--enable-exhaustive-tests],[compile exhaustive tests (default is yes)]), + [use_exhaustive_tests=$enableval], + [use_exhaustive_tests=yes]) + +AC_ARG_ENABLE(endomorphism, + AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), + [use_endomorphism=$enableval], + [use_endomorphism=no]) + +AC_ARG_ENABLE(ecmult_static_precomputation, + AS_HELP_STRING([--enable-ecmult-static-precomputation],[enable precomputed ecmult table for signing (default is yes)]), + [use_ecmult_static_precomputation=$enableval], + [use_ecmult_static_precomputation=auto]) + +AC_ARG_ENABLE(module_ecdh, + AS_HELP_STRING([--enable-module-ecdh],[enable ECDH shared secret computation (experimental)]), + [enable_module_ecdh=$enableval], + [enable_module_ecdh=no]) + +AC_ARG_ENABLE(module_recovery, + AS_HELP_STRING([--enable-module-recovery],[enable ECDSA pubkey recovery module (default is no)]), + [enable_module_recovery=$enableval], + [enable_module_recovery=no]) + +AC_ARG_ENABLE(jni, + AS_HELP_STRING([--enable-jni],[enable libsecp256k1_jni (default is no)]), + [use_jni=$enableval], + [use_jni=no]) + +AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], +[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) + +AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], +[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) + +AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], +[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) + +AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm|no|auto] +[Specify assembly optimizations to use. Default is auto (experimental: arm)])],[req_asm=$withval], [req_asm=auto]) + +AC_CHECK_TYPES([__int128]) + +AC_MSG_CHECKING([for __builtin_expect]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], + [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ], + [ AC_MSG_RESULT([no]) + ]) + +if test x"$enable_coverage" = x"yes"; then + AC_DEFINE(COVERAGE, 1, [Define this symbol to compile out all VERIFY code]) + CFLAGS="$CFLAGS -O0 --coverage" + LDFLAGS="--coverage" +else + CFLAGS="$CFLAGS -O3" +fi + +if test x"$use_ecmult_static_precomputation" != x"no"; then + save_cross_compiling=$cross_compiling + cross_compiling=no + TEMP_CC="$CC" + CC="$CC_FOR_BUILD" + AC_MSG_CHECKING([native compiler: ${CC_FOR_BUILD}]) + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([], [return 0])], + [working_native_cc=yes], + [working_native_cc=no],[dnl]) + CC="$TEMP_CC" + cross_compiling=$save_cross_compiling + + if test x"$working_native_cc" = x"no"; then + set_precomp=no + if test x"$use_ecmult_static_precomputation" = x"yes"; then + AC_MSG_ERROR([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + else + AC_MSG_RESULT([${CC_FOR_BUILD} does not produce working binaries. Please set CC_FOR_BUILD]) + fi + else + AC_MSG_RESULT([ok]) + set_precomp=yes + fi +else + set_precomp=no +fi + +if test x"$req_asm" = x"auto"; then + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" = x"yes"; then + set_asm=x86_64 + fi + if test x"$set_asm" = x; then + set_asm=no + fi +else + set_asm=$req_asm + case $set_asm in + x86_64) + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" != x"yes"; then + AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) + fi + ;; + arm) + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid assembly optimization selection]) + ;; + esac +fi + +if test x"$req_field" = x"auto"; then + if test x"set_asm" = x"x86_64"; then + set_field=64bit + fi + if test x"$set_field" = x; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_field=64bit + fi + fi + if test x"$set_field" = x; then + set_field=32bit + fi +else + set_field=$req_field + case $set_field in + 64bit) + if test x"$set_asm" != x"x86_64"; then + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available]) + fi + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid field implementation selection]) + ;; + esac +fi + +if test x"$req_scalar" = x"auto"; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_scalar=64bit + fi + if test x"$set_scalar" = x; then + set_scalar=32bit + fi +else + set_scalar=$req_scalar + case $set_scalar in + 64bit) + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid scalar implementation selected]) + ;; + esac +fi + +if test x"$req_bignum" = x"auto"; then + SECP_GMP_CHECK + if test x"$has_gmp" = x"yes"; then + set_bignum=gmp + fi + + if test x"$set_bignum" = x; then + set_bignum=no + fi +else + set_bignum=$req_bignum + case $set_bignum in + gmp) + SECP_GMP_CHECK + if test x"$has_gmp" != x"yes"; then + AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) + fi + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid bignum implementation selection]) + ;; + esac +fi + +# select assembly optimization +use_external_asm=no + +case $set_asm in +x86_64) + AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) + ;; +arm) + use_external_asm=yes + ;; +no) + ;; +*) + AC_MSG_ERROR([invalid assembly optimizations]) + ;; +esac + +# select field implementation +case $set_field in +64bit) + AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) + ;; +32bit) + AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) + ;; +*) + AC_MSG_ERROR([invalid field implementation]) + ;; +esac + +# select bignum implementation +case $set_bignum in +gmp) + AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) + AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) + AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) + ;; +no) + AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) + AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) + ;; +*) + AC_MSG_ERROR([invalid bignum implementation]) + ;; +esac + +#select scalar implementation +case $set_scalar in +64bit) + AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) + ;; +32bit) + AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) + ;; +*) + AC_MSG_ERROR([invalid scalar implementation]) + ;; +esac + +if test x"$use_tests" = x"yes"; then + SECP_OPENSSL_CHECK + if test x"$has_openssl_ec" = x"yes"; then + if test x"$enable_openssl_tests" != x"no"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" + + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + fi + else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but OpenSSL with EC support is not available]) + fi + fi +else + if test x"$enable_openssl_tests" = x"yes"; then + AC_MSG_ERROR([OpenSSL tests requested but tests are not enabled]) + fi +fi + +if test x"$use_jni" != x"no"; then + AX_JNI_INCLUDE_DIR + have_jni_dependencies=yes + if test x"$enable_module_ecdh" = x"no"; then + have_jni_dependencies=no + fi + if test "x$JNI_INCLUDE_DIRS" = "x"; then + have_jni_dependencies=no + fi + if test "x$have_jni_dependencies" = "xno"; then + if test x"$use_jni" = x"yes"; then + AC_MSG_ERROR([jni support explicitly requested but headers/dependencies were not found. Enable ECDH and try again.]) + fi + AC_MSG_WARN([jni headers/dependencies not found. jni support disabled]) + use_jni=no + else + use_jni=yes + for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS; do + JNI_INCLUDES="$JNI_INCLUDES -I$JNI_INCLUDE_DIR" + done + fi +fi + +if test x"$set_bignum" = x"gmp"; then + SECP_LIBS="$SECP_LIBS $GMP_LIBS" + SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" +fi + +if test x"$use_endomorphism" = x"yes"; then + AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) +fi + +if test x"$set_precomp" = x"yes"; then + AC_DEFINE(USE_ECMULT_STATIC_PRECOMPUTATION, 1, [Define this symbol to use a statically generated ecmult table]) +fi + +if test x"$enable_module_ecdh" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_ECDH, 1, [Define this symbol to enable the ECDH module]) +fi + +if test x"$enable_module_recovery" = x"yes"; then + AC_DEFINE(ENABLE_MODULE_RECOVERY, 1, [Define this symbol to enable the ECDSA pubkey recovery module]) +fi + +AC_C_BIGENDIAN() + +if test x"$use_external_asm" = x"yes"; then + AC_DEFINE(USE_EXTERNAL_ASM, 1, [Define this symbol if an external (non-inline) assembly implementation is used]) +fi + +AC_MSG_NOTICE([Using static precomputation: $set_precomp]) +AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) +AC_MSG_NOTICE([Using field implementation: $set_field]) +AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) +AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) +AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) +AC_MSG_NOTICE([Building benchmarks: $use_benchmark]) +AC_MSG_NOTICE([Building for coverage analysis: $enable_coverage]) +AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) +AC_MSG_NOTICE([Building ECDSA pubkey recovery module: $enable_module_recovery]) +AC_MSG_NOTICE([Using jni: $use_jni]) + +if test x"$enable_experimental" = x"yes"; then + AC_MSG_NOTICE([******]) + AC_MSG_NOTICE([WARNING: experimental build]) + AC_MSG_NOTICE([Experimental features do not have stable APIs or properties, and may not be safe for production use.]) + AC_MSG_NOTICE([Building ECDH module: $enable_module_ecdh]) + AC_MSG_NOTICE([******]) +else + if test x"$enable_module_ecdh" = x"yes"; then + AC_MSG_ERROR([ECDH module is experimental. Use --enable-experimental to allow.]) + fi + if test x"$set_asm" = x"arm"; then + AC_MSG_ERROR([ARM assembly optimization is experimental. Use --enable-experimental to allow.]) + fi +fi + +AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) +AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(JNI_INCLUDES) +AC_SUBST(SECP_INCLUDES) +AC_SUBST(SECP_LIBS) +AC_SUBST(SECP_TEST_LIBS) +AC_SUBST(SECP_TEST_INCLUDES) +AM_CONDITIONAL([ENABLE_COVERAGE], [test x"$enable_coverage" = x"yes"]) +AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_EXHAUSTIVE_TESTS], [test x"$use_exhaustive_tests" != x"no"]) +AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) +AM_CONDITIONAL([USE_ECMULT_STATIC_PRECOMPUTATION], [test x"$set_precomp" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_ECDH], [test x"$enable_module_ecdh" = x"yes"]) +AM_CONDITIONAL([ENABLE_MODULE_RECOVERY], [test x"$enable_module_recovery" = x"yes"]) +AM_CONDITIONAL([USE_JNI], [test x"$use_jni" == x"yes"]) +AM_CONDITIONAL([USE_EXTERNAL_ASM], [test x"$use_external_asm" = x"yes"]) +AM_CONDITIONAL([USE_ASM_ARM], [test x"$set_asm" = x"arm"]) + +dnl make sure nothing new is exported so that we don't break the cache +PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" +unset PKG_CONFIG_PATH +PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" + +AC_OUTPUT diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.c new file mode 100644 index 00000000..5b141a99 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.c @@ -0,0 +1,150 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_parsing.h" + +int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + size_t rpos, rlen, spos, slen; + size_t pos = 0; + size_t lenbyte; + unsigned char tmpsig[64] = {0}; + int overflow = 0; + + /* Hack to initialize sig with a correctly-parsed but invalid signature. */ + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + + /* Sequence tag byte */ + if (pos == inputlen || input[pos] != 0x30) { + return 0; + } + pos++; + + /* Sequence length bytes */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + pos += lenbyte; + } + + /* Integer tag byte for R */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for R */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + rlen = 0; + while (lenbyte > 0) { + rlen = (rlen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + rlen = lenbyte; + } + if (rlen > inputlen - pos) { + return 0; + } + rpos = pos; + pos += rlen; + + /* Integer tag byte for S */ + if (pos == inputlen || input[pos] != 0x02) { + return 0; + } + pos++; + + /* Integer length for S */ + if (pos == inputlen) { + return 0; + } + lenbyte = input[pos++]; + if (lenbyte & 0x80) { + lenbyte -= 0x80; + if (pos + lenbyte > inputlen) { + return 0; + } + while (lenbyte > 0 && input[pos] == 0) { + pos++; + lenbyte--; + } + if (lenbyte >= sizeof(size_t)) { + return 0; + } + slen = 0; + while (lenbyte > 0) { + slen = (slen << 8) + input[pos]; + pos++; + lenbyte--; + } + } else { + slen = lenbyte; + } + if (slen > inputlen - pos) { + return 0; + } + spos = pos; + pos += slen; + + /* Ignore leading zeroes in R */ + while (rlen > 0 && input[rpos] == 0) { + rlen--; + rpos++; + } + /* Copy R value */ + if (rlen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 32 - rlen, input + rpos, rlen); + } + + /* Ignore leading zeroes in S */ + while (slen > 0 && input[spos] == 0) { + slen--; + spos++; + } + /* Copy S value */ + if (slen > 32) { + overflow = 1; + } else { + memcpy(tmpsig + 64 - slen, input + spos, slen); + } + + if (!overflow) { + overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + if (overflow) { + memset(tmpsig, 0, 64); + secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig); + } + return 1; +} + diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.h new file mode 100644 index 00000000..7eaf63bf --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_parsing.h @@ -0,0 +1,91 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file defines a function that parses DER with various errors and + * violations. This is not a part of the library itself, because the allowed + * violations are chosen arbitrarily and do not follow or establish any + * standard. + * + * In many places it matters that different implementations do not only accept + * the same set of valid signatures, but also reject the same set of signatures. + * The only means to accomplish that is by strictly obeying a standard, and not + * accepting anything else. + * + * Nonetheless, sometimes there is a need for compatibility with systems that + * use signatures which do not strictly obey DER. The snippet below shows how + * certain violations are easily supported. You may need to adapt it. + * + * Do not use this for new systems. Use well-defined DER or compact signatures + * instead if you have the choice (see secp256k1_ecdsa_signature_parse_der and + * secp256k1_ecdsa_signature_parse_compact). + * + * The supported violations are: + * - All numbers are parsed as nonnegative integers, even though X.609-0207 + * section 8.3.3 specifies that integers are always encoded as two's + * complement. + * - Integers can have length 0, even though section 8.3.1 says they can't. + * - Integers with overly long padding are accepted, violation section + * 8.3.2. + * - 127-byte long length descriptors are accepted, even though section + * 8.1.3.5.c says that they are not. + * - Trailing garbage data inside or after the signature is ignored. + * - The length descriptor of the sequence is ignored. + * + * Compared to for example OpenSSL, many violations are NOT supported: + * - Using overly long tag descriptors for the sequence or integers inside, + * violating section 8.1.2.2. + * - Encoding primitive integers as constructed values, violating section + * 8.3.1. + */ + +#ifndef SECP256K1_CONTRIB_LAX_DER_PARSING_H +#define SECP256K1_CONTRIB_LAX_DER_PARSING_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Parse a signature in "lax DER" format + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. In addition, it will accept signatures + * which violate the DER spec in various ways. Its purpose is to allow + * validation of the Bitcoin blockchain, which includes non-DER signatures + * from before the network rules were updated to enforce DER. Note that + * the set of supported violations is a strict subset of what OpenSSL will + * accept. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +int ecdsa_signature_parse_der_lax( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_CONTRIB_LAX_DER_PARSING_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.c new file mode 100644 index 00000000..c2e63b4b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.c @@ -0,0 +1,113 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "lax_der_privatekey_parsing.h" + +int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *out32, const unsigned char *privkey, size_t privkeylen) { + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + memset(out32, 0, 32); + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(out32 + 32 - privkey[1], privkey + 2, privkey[1]); + if (!secp256k1_ec_seckey_verify(ctx, out32)) { + memset(out32, 0, 32); + return 0; + } + return 1; +} + +int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) { + secp256k1_pubkey pubkey; + size_t pubkeylen = 0; + if (!secp256k1_ec_pubkey_create(ctx, &pubkey, key32)) { + *privkeylen = 0; + return 0; + } + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 33; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + memcpy(ptr, key32, 32); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + pubkeylen = 65; + secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED); + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.h new file mode 100644 index 00000000..fece261f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/contrib/lax_der_privatekey_parsing.h @@ -0,0 +1,90 @@ +/********************************************************************** + * Copyright (c) 2014, 2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/**** + * Please do not link this file directly. It is not part of the libsecp256k1 + * project and does not promise any stability in its API, functionality or + * presence. Projects which use this code should instead copy this header + * and its accompanying .c file directly into their codebase. + ****/ + +/* This file contains code snippets that parse DER private keys with + * various errors and violations. This is not a part of the library + * itself, because the allowed violations are chosen arbitrarily and + * do not follow or establish any standard. + * + * It also contains code to serialize private keys in a compatible + * manner. + * + * These functions are meant for compatibility with applications + * that require BER encoded keys. When working with secp256k1-specific + * code, the simple 32-byte private keys normally used by the + * library are sufficient. + */ + +#ifndef SECP256K1_CONTRIB_BER_PRIVATEKEY_H +#define SECP256K1_CONTRIB_BER_PRIVATEKEY_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Export a private key in DER format. + * + * Returns: 1 if the private key was valid. + * Args: ctx: pointer to a context object, initialized for signing (cannot + * be NULL) + * Out: privkey: pointer to an array for storing the private key in BER. + * Should have space for 279 bytes, and cannot be NULL. + * privkeylen: Pointer to an int where the length of the private key in + * privkey will be stored. + * In: seckey: pointer to a 32-byte secret key to export. + * compressed: 1 if the key should be exported in + * compressed format, 0 otherwise + * + * This function is purely meant for compatibility with applications that + * require BER encoded keys. When working with secp256k1-specific code, the + * simple 32-byte private keys are sufficient. + * + * Note that this function does not guarantee correct DER output. It is + * guaranteed to be parsable by secp256k1_ec_privkey_import_der + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_export_der( + const secp256k1_context* ctx, + unsigned char *privkey, + size_t *privkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Import a private key in DER format. + * Returns: 1 if a private key was extracted. + * Args: ctx: pointer to a context object (cannot be NULL). + * Out: seckey: pointer to a 32-byte array for storing the private key. + * (cannot be NULL). + * In: privkey: pointer to a private key in DER format (cannot be NULL). + * privkeylen: length of the DER private key pointed to be privkey. + * + * This function will accept more than just strict DER, and even allow some BER + * violations. The public key stored inside the DER-encoded private key is not + * verified for correctness, nor are the curve parameters. Use this function + * only if you know in advance it is supposed to contain a secp256k1 private + * key. + */ +SECP256K1_WARN_UNUSED_RESULT int ec_privkey_import_der( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *privkey, + size_t privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_CONTRIB_BER_PRIVATEKEY_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1.h new file mode 100644 index 00000000..3c4a311a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1.h @@ -0,0 +1,654 @@ +#ifndef SECP256K1_H +#define SECP256K1_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* These rules specify the order of arguments in API calls: + * + * 1. Context pointers go first, followed by output arguments, combined + * output/input arguments, and finally input-only arguments. + * 2. Array lengths always immediately the follow the argument whose length + * they describe, even if this violates rule 1. + * 3. Within the OUT/OUTIN/IN groups, pointers to data that is typically generated + * later go first. This means: signatures, public nonces, private nonces, + * messages, public keys, secret keys, tweaks. + * 4. Arguments that are not data pointers go last, from more complex to less + * complex: function pointers, algorithm names, messages, void pointers, + * counts, flags, booleans. + * 5. Opaque data pointers follow the function pointer they are to be passed to. + */ + +/** Opaque data structure that holds context information (precomputed tables etc.). + * + * The purpose of context structures is to cache large precomputed data tables + * that are expensive to construct, and also to maintain the randomization data + * for blinding. + * + * Do not create a new context object for each operation, as construction is + * far slower than all other API calls (~100 times slower than an ECDSA + * verification). + * + * A constructed context can safely be used from multiple threads + * simultaneously, but API call that take a non-const pointer to a context + * need exclusive access to it. In particular this is the case for + * secp256k1_context_destroy and secp256k1_context_randomize. + * + * Regarding randomization, either do it once at creation time (in which case + * you do not need any locking for the other calls), or use a read-write lock. + */ +typedef struct secp256k1_context_struct secp256k1_context; + +/** Opaque data structure that holds rewriteable "scratch space" + * + * The purpose of this structure is to replace dynamic memory allocations, + * because we target architectures where this may not be available. It is + * essentially a resizable (within specified parameters) block of bytes, + * which is initially created either by memory allocation or TODO as a pointer + * into some fixed rewritable space. + * + * Unlike the context object, this cannot safely be shared between threads + * without additional synchronization logic. + */ +typedef struct secp256k1_scratch_space_struct secp256k1_scratch_space; + +/** Opaque data structure that holds a parsed and valid public key. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use secp256k1_ec_pubkey_serialize and secp256k1_ec_pubkey_parse. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_pubkey; + +/** Opaque data structured that holds a parsed ECDSA signature. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 64 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage, transmission, or + * comparison, use the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_parse_* functions. + */ +typedef struct { + unsigned char data[64]; +} secp256k1_ecdsa_signature; + +/** A pointer to a function to deterministically generate a nonce. + * + * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. + * Out: nonce32: pointer to a 32-byte array to be filled by the function. + * In: msg32: the 32-byte message hash being verified (will not be NULL) + * key32: pointer to a 32-byte secret key (will not be NULL) + * algo16: pointer to a 16-byte array describing the signature + * algorithm (will be NULL for ECDSA for compatibility). + * data: Arbitrary data pointer that is passed through. + * attempt: how many iterations we have tried to find a nonce. + * This will almost always be 0, but different attempt values + * are required to result in a different nonce. + * + * Except for test cases, this function should compute some cryptographic hash of + * the message, the algorithm, the key and the attempt. + */ +typedef int (*secp256k1_nonce_function)( + unsigned char *nonce32, + const unsigned char *msg32, + const unsigned char *key32, + const unsigned char *algo16, + void *data, + unsigned int attempt +); + +# if !defined(SECP256K1_GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define SECP256K1_GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define SECP256K1_GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(2,7) +# define SECP256K1_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define SECP256K1_INLINE __inline +# else +# define SECP256K1_INLINE +# endif +# else +# define SECP256K1_INLINE inline +# endif + +#ifndef SECP256K1_API +# if defined(_WIN32) +# ifdef SECP256K1_BUILD +# define SECP256K1_API __declspec(dllexport) +# else +# define SECP256K1_API +# endif +# elif defined(__GNUC__) && defined(SECP256K1_BUILD) +# define SECP256K1_API __attribute__ ((visibility ("default"))) +# else +# define SECP256K1_API +# endif +#endif + +/**Warning attributes + * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out + * some paranoid null checks. */ +# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) +# else +# define SECP256K1_WARN_UNUSED_RESULT +# endif +# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) +# else +# define SECP256K1_ARG_NONNULL(_x) +# endif + +/** All flags' lower 8 bits indicate what they're for. Do not use directly. */ +#define SECP256K1_FLAGS_TYPE_MASK ((1 << 8) - 1) +#define SECP256K1_FLAGS_TYPE_CONTEXT (1 << 0) +#define SECP256K1_FLAGS_TYPE_COMPRESSION (1 << 1) +/** The higher bits contain the actual data. Do not use directly. */ +#define SECP256K1_FLAGS_BIT_CONTEXT_VERIFY (1 << 8) +#define SECP256K1_FLAGS_BIT_CONTEXT_SIGN (1 << 9) +#define SECP256K1_FLAGS_BIT_COMPRESSION (1 << 8) + +/** Flags to pass to secp256k1_context_create. */ +#define SECP256K1_CONTEXT_VERIFY (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) +#define SECP256K1_CONTEXT_SIGN (SECP256K1_FLAGS_TYPE_CONTEXT | SECP256K1_FLAGS_BIT_CONTEXT_SIGN) +#define SECP256K1_CONTEXT_NONE (SECP256K1_FLAGS_TYPE_CONTEXT) + +/** Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export. */ +#define SECP256K1_EC_COMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION | SECP256K1_FLAGS_BIT_COMPRESSION) +#define SECP256K1_EC_UNCOMPRESSED (SECP256K1_FLAGS_TYPE_COMPRESSION) + +/** Prefix byte used to tag various encoded curvepoints for specific purposes */ +#define SECP256K1_TAG_PUBKEY_EVEN 0x02 +#define SECP256K1_TAG_PUBKEY_ODD 0x03 +#define SECP256K1_TAG_PUBKEY_UNCOMPRESSED 0x04 +#define SECP256K1_TAG_PUBKEY_HYBRID_EVEN 0x06 +#define SECP256K1_TAG_PUBKEY_HYBRID_ODD 0x07 + +/** Create a secp256k1 context object. + * + * Returns: a newly created context object. + * In: flags: which parts of the context to initialize. + * + * See also secp256k1_context_randomize. + */ +SECP256K1_API secp256k1_context* secp256k1_context_create( + unsigned int flags +) SECP256K1_WARN_UNUSED_RESULT; + +/** Copies a secp256k1 context object. + * + * Returns: a newly created context object. + * Args: ctx: an existing context to copy (cannot be NULL) + */ +SECP256K1_API secp256k1_context* secp256k1_context_clone( + const secp256k1_context* ctx +) SECP256K1_ARG_NONNULL(1) SECP256K1_WARN_UNUSED_RESULT; + +/** Destroy a secp256k1 context object. + * + * The context pointer may not be used afterwards. + * Args: ctx: an existing context to destroy (cannot be NULL) + */ +SECP256K1_API void secp256k1_context_destroy( + secp256k1_context* ctx +); + +/** Set a callback function to be called when an illegal argument is passed to + * an API call. It will only trigger for violations that are mentioned + * explicitly in the header. + * + * The philosophy is that these shouldn't be dealt with through a + * specific return value, as calling code should not have branches to deal with + * the case that this code itself is broken. + * + * On the other hand, during debug stage, one would want to be informed about + * such mistakes, and the default (crashing) may be inadvisable. + * When this callback is triggered, the API function called is guaranteed not + * to cause a crash, though its return value and output arguments are + * undefined. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an illegal argument is + * passed to the API, taking a message and an opaque pointer + * (NULL restores a default handler that calls abort). + * data: the opaque pointer to pass to fun above. + */ +SECP256K1_API void secp256k1_context_set_illegal_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data +) SECP256K1_ARG_NONNULL(1); + +/** Set a callback function to be called when an internal consistency check + * fails. The default is crashing. + * + * This can only trigger in case of a hardware failure, miscompilation, + * memory corruption, serious bug in the library, or other error would can + * otherwise result in undefined behaviour. It will not trigger due to mere + * incorrect usage of the API (see secp256k1_context_set_illegal_callback + * for that). After this callback returns, anything may happen, including + * crashing. + * + * Args: ctx: an existing context object (cannot be NULL) + * In: fun: a pointer to a function to call when an internal error occurs, + * taking a message and an opaque pointer (NULL restores a default + * handler that calls abort). + * data: the opaque pointer to pass to fun above. + */ +SECP256K1_API void secp256k1_context_set_error_callback( + secp256k1_context* ctx, + void (*fun)(const char* message, void* data), + const void* data +) SECP256K1_ARG_NONNULL(1); + +/** Create a secp256k1 scratch space object. + * + * Returns: a newly created scratch space. + * Args: ctx: an existing context object (cannot be NULL) + * In: max_size: maximum amount of memory to allocate + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT secp256k1_scratch_space* secp256k1_scratch_space_create( + const secp256k1_context* ctx, + size_t max_size +) SECP256K1_ARG_NONNULL(1); + +/** Destroy a secp256k1 scratch space. + * + * The pointer may not be used afterwards. + * Args: scratch: space to destroy + */ +SECP256K1_API void secp256k1_scratch_space_destroy( + secp256k1_scratch_space* scratch +); + +/** Parse a variable-length public key into the pubkey object. + * + * Returns: 1 if the public key was fully valid. + * 0 if the public key could not be parsed or is invalid. + * Args: ctx: a secp256k1 context object. + * Out: pubkey: pointer to a pubkey object. If 1 is returned, it is set to a + * parsed version of input. If not, its value is undefined. + * In: input: pointer to a serialized public key + * inputlen: length of the array pointed to by input + * + * This function supports parsing compressed (33 bytes, header byte 0x02 or + * 0x03), uncompressed (65 bytes, header byte 0x04), or hybrid (65 bytes, header + * byte 0x06 or 0x07) format public keys. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( + const secp256k1_context* ctx, + secp256k1_pubkey* pubkey, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize a pubkey object into a serialized byte sequence. + * + * Returns: 1 always. + * Args: ctx: a secp256k1 context object. + * Out: output: a pointer to a 65-byte (if compressed==0) or 33-byte (if + * compressed==1) byte array to place the serialized key + * in. + * In/Out: outputlen: a pointer to an integer which is initially set to the + * size of output, and is overwritten with the written + * size. + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key. + * flags: SECP256K1_EC_COMPRESSED if serialization should be in + * compressed format, otherwise SECP256K1_EC_UNCOMPRESSED. + */ +SECP256K1_API int secp256k1_ec_pubkey_serialize( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_pubkey* pubkey, + unsigned int flags +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Parse an ECDSA signature in compact (64 bytes) format. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to the 64-byte array to parse + * + * The signature must consist of a 32-byte big endian R value, followed by a + * 32-byte big endian S value. If R or S fall outside of [0..order-1], the + * encoding is invalid. R and S with value 0 are allowed in the encoding. + * + * After the call, sig will always be initialized. If parsing failed or R or + * S are zero, the resulting sig value is guaranteed to fail validation for any + * message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input64 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Parse a DER ECDSA signature. + * + * Returns: 1 when the signature could be parsed, 0 otherwise. + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input: a pointer to the signature to be parsed + * inputlen: the length of the array pointed to be input + * + * This function will accept any valid DER encoded signature, even if the + * encoded numbers are out of range. + * + * After the call, sig will always be initialized. If parsing failed or the + * encoded numbers are out of range, signature validation with it is + * guaranteed to fail for every message and public key. + */ +SECP256K1_API int secp256k1_ecdsa_signature_parse_der( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const unsigned char *input, + size_t inputlen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in DER format. + * + * Returns: 1 if enough space was available to serialize, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: output: a pointer to an array to store the DER serialization + * In/Out: outputlen: a pointer to a length integer. Initially, this integer + * should be set to the length of output. After the call + * it will be set to the length of the serialization (even + * if 0 was returned). + * In: sig: a pointer to an initialized signature object + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_der( + const secp256k1_context* ctx, + unsigned char *output, + size_t *outputlen, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Serialize an ECDSA signature in compact (64 byte) format. + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array to store the compact serialization + * In: sig: a pointer to an initialized signature object + * + * See secp256k1_ecdsa_signature_parse_compact for details about the encoding. + */ +SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + const secp256k1_ecdsa_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Verify an ECDSA signature. + * + * Returns: 1: correct signature + * 0: incorrect or unparseable signature + * Args: ctx: a secp256k1 context object, initialized for verification. + * In: sig: the signature being verified (cannot be NULL) + * msg32: the 32-byte message hash being verified (cannot be NULL) + * pubkey: pointer to an initialized public key to verify with (cannot be NULL) + * + * To avoid accepting malleable signatures, only ECDSA signatures in lower-S + * form are accepted. + * + * If you need to accept ECDSA signatures from sources that do not obey this + * rule, apply secp256k1_ecdsa_signature_normalize to the signature prior to + * validation, but be aware that doing so results in malleable signatures. + * + * For details, see the comments for that function. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const secp256k1_context* ctx, + const secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Convert a signature to a normalized lower-S form. + * + * Returns: 1 if sigin was not normalized, 0 if it already was. + * Args: ctx: a secp256k1 context object + * Out: sigout: a pointer to a signature to fill with the normalized form, + * or copy if the input was already normalized. (can be NULL if + * you're only interested in whether the input was already + * normalized). + * In: sigin: a pointer to a signature to check/normalize (cannot be NULL, + * can be identical to sigout) + * + * With ECDSA a third-party can forge a second distinct signature of the same + * message, given a single initial signature, but without knowing the key. This + * is done by negating the S value modulo the order of the curve, 'flipping' + * the sign of the random point R which is not included in the signature. + * + * Forgery of the same message isn't universally problematic, but in systems + * where message malleability or uniqueness of signatures is important this can + * cause issues. This forgery can be blocked by all verifiers forcing signers + * to use a normalized form. + * + * The lower-S form reduces the size of signatures slightly on average when + * variable length encodings (such as DER) are used and is cheap to verify, + * making it a good choice. Security of always using lower-S is assured because + * anyone can trivially modify a signature after the fact to enforce this + * property anyway. + * + * The lower S value is always between 0x1 and + * 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, + * inclusive. + * + * No other forms of ECDSA malleability are known and none seem likely, but + * there is no formal proof that ECDSA, even with this additional restriction, + * is free of other malleability. Commonly used serialization schemes will also + * accept various non-unique encodings, so care should be taken when this + * property is required for an application. + * + * The secp256k1_ecdsa_sign function will by default create signatures in the + * lower-S form, and secp256k1_ecdsa_verify will not accept others. In case + * signatures come from a system that cannot enforce this property, + * secp256k1_ecdsa_signature_normalize must be called before verification. + */ +SECP256K1_API int secp256k1_ecdsa_signature_normalize( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sigout, + const secp256k1_ecdsa_signature *sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3); + +/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. + * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of + * extra entropy. + */ +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_rfc6979; + +/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ +SECP256K1_API extern const secp256k1_nonce_function secp256k1_nonce_function_default; + +/** Create an ECDSA signature. + * + * Returns: 1: signature created + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + * + * The created signature is always in lower-S form. See + * secp256k1_ecdsa_signature_normalize for more details. + */ +SECP256K1_API int secp256k1_ecdsa_sign( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Verify an ECDSA secret key. + * + * Returns: 1: secret key is valid + * 0: secret key is invalid + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seckey: pointer to a 32-byte secret key (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( + const secp256k1_context* ctx, + const unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Compute the public key for a secret key. + * + * Returns: 1: secret was valid, public key stores + * 0: secret was invalid, try again + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: pubkey: pointer to the created public key (cannot be NULL) + * In: seckey: pointer to a 32-byte private key (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Negates a private key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: seckey: pointer to the 32-byte private key to be negated (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_negate( + const secp256k1_context* ctx, + unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Negates a public key in place. + * + * Returns: 1 always + * Args: ctx: pointer to a context object + * In/Out: pubkey: pointer to the public key to be negated (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_negate( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Tweak a private key by adding tweak to it. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting private key + * would be invalid (only when the tweak is the complement of the + * private key). 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by adding tweak times the generator to it. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or if the resulting public key + * would be invalid (only when the tweak is the complement of the + * corresponding private key). 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key object. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a private key by multiplying it by a tweak. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object (cannot be NULL). + * In/Out: seckey: pointer to a 32-byte private key. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + const secp256k1_context* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by multiplying it by a tweak value. + * Returns: 0 if the tweak was out of range (chance of around 1 in 2^128 for + * uniformly random 32-byte arrays, or equal to zero. 1 otherwise. + * Args: ctx: pointer to a context object initialized for validation + * (cannot be NULL). + * In/Out: pubkey: pointer to a public key obkect. + * In: tweak: pointer to a 32-byte tweak. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Updates the context randomization to protect against side-channel leakage. + * Returns: 1: randomization successfully updated + * 0: error + * Args: ctx: pointer to a context object (cannot be NULL) + * In: seed32: pointer to a 32-byte random seed (NULL resets to initial state) + * + * While secp256k1 code is written to be constant-time no matter what secret + * values are, it's possible that a future compiler may output code which isn't, + * and also that the CPU may not emit the same radio frequencies or draw the same + * amount power for all values. + * + * This function provides a seed which is combined into the blinding value: that + * blinding value is added before each multiplication (and removed afterwards) so + * that it does not affect function results, but shields against attacks which + * rely on any input-dependent behaviour. + * + * You should call this after secp256k1_context_create or + * secp256k1_context_clone, and may call this repeatedly afterwards. + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( + secp256k1_context* ctx, + const unsigned char *seed32 +) SECP256K1_ARG_NONNULL(1); + +/** Add a number of public keys together. + * Returns: 1: the sum of the public keys is valid. + * 0: the sum of the public keys is not valid. + * Args: ctx: pointer to a context object + * Out: out: pointer to a public key object for placing the resulting public key + * (cannot be NULL) + * In: ins: pointer to array of pointers to public keys (cannot be NULL) + * n: the number of public keys to add together (must be at least 1) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_combine( + const secp256k1_context* ctx, + secp256k1_pubkey *out, + const secp256k1_pubkey * const * ins, + size_t n +) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_ecdh.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_ecdh.h new file mode 100644 index 00000000..88492dc1 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_ecdh.h @@ -0,0 +1,31 @@ +#ifndef SECP256K1_ECDH_H +#define SECP256K1_ECDH_H + +#include "secp256k1.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Compute an EC Diffie-Hellman secret in constant time + * Returns: 1: exponentiation was successful + * 0: scalar was invalid (zero or overflow) + * Args: ctx: pointer to a context object (cannot be NULL) + * Out: result: a 32-byte array which will be populated by an ECDH + * secret computed from the point and scalar + * In: pubkey: a pointer to a secp256k1_pubkey containing an + * initialized public key + * privkey: a 32-byte scalar with which to multiply the point + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdh( + const secp256k1_context* ctx, + unsigned char *result, + const secp256k1_pubkey *pubkey, + const unsigned char *privkey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_ECDH_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_recovery.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_recovery.h new file mode 100644 index 00000000..cf6c5ed7 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/include/secp256k1_recovery.h @@ -0,0 +1,110 @@ +#ifndef SECP256K1_RECOVERY_H +#define SECP256K1_RECOVERY_H + +#include "secp256k1.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Opaque data structured that holds a parsed ECDSA signature, + * supporting pubkey recovery. + * + * The exact representation of data inside is implementation defined and not + * guaranteed to be portable between different platforms or versions. It is + * however guaranteed to be 65 bytes in size, and can be safely copied/moved. + * If you need to convert to a format suitable for storage or transmission, use + * the secp256k1_ecdsa_signature_serialize_* and + * secp256k1_ecdsa_signature_parse_* functions. + * + * Furthermore, it is guaranteed that identical signatures (including their + * recoverability) will have identical representation, so they can be + * memcmp'ed. + */ +typedef struct { + unsigned char data[65]; +} secp256k1_ecdsa_recoverable_signature; + +/** Parse a compact ECDSA signature (64 bytes + recovery id). + * + * Returns: 1 when the signature could be parsed, 0 otherwise + * Args: ctx: a secp256k1 context object + * Out: sig: a pointer to a signature object + * In: input64: a pointer to a 64-byte compact signature + * recid: the recovery id (0, 1, 2 or 3) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_parse_compact( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature* sig, + const unsigned char *input64, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Convert a recoverable signature into a normal signature. + * + * Returns: 1 + * Out: sig: a pointer to a normal signature (cannot be NULL). + * In: sigin: a pointer to a recoverable signature (cannot be NULL). + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_convert( + const secp256k1_context* ctx, + secp256k1_ecdsa_signature* sig, + const secp256k1_ecdsa_recoverable_signature* sigin +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Serialize an ECDSA signature in compact format (64 bytes + recovery id). + * + * Returns: 1 + * Args: ctx: a secp256k1 context object + * Out: output64: a pointer to a 64-byte array of the compact signature (cannot be NULL) + * recid: a pointer to an integer to hold the recovery id (can be NULL). + * In: sig: a pointer to an initialized signature object (cannot be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact( + const secp256k1_context* ctx, + unsigned char *output64, + int *recid, + const secp256k1_ecdsa_recoverable_signature* sig +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Create a recoverable ECDSA signature. + * + * Returns: 1: signature created + * 0: the nonce generation function failed, or the private key was invalid. + * Args: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In: msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + */ +SECP256K1_API int secp256k1_ecdsa_sign_recoverable( + const secp256k1_context* ctx, + secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32, + const unsigned char *seckey, + secp256k1_nonce_function noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Recover an ECDSA public key from a signature. + * + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * Args: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * Out: pubkey: pointer to the recovered public key (cannot be NULL) + * In: sig: pointer to initialized signature that supports pubkey recovery (cannot be NULL) + * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) + */ +SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover( + const secp256k1_context* ctx, + secp256k1_pubkey *pubkey, + const secp256k1_ecdsa_recoverable_signature *sig, + const unsigned char *msg32 +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +#ifdef __cplusplus +} +#endif + +#endif /* SECP256K1_RECOVERY_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/libsecp256k1.pc.in b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/libsecp256k1.pc.in new file mode 100644 index 00000000..a0d006f1 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/libsecp256k1.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libsecp256k1 +Description: Optimized C library for EC operations on curve secp256k1 +URL: https://github.com/bitcoin-core/secp256k1 +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs.private: @SECP_LIBS@ +Libs: -L${libdir} -lsecp256k1 + diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/obj/.gitignore b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/obj/.gitignore new file mode 100644 index 00000000..e69de29b diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/group_prover.sage b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/group_prover.sage new file mode 100644 index 00000000..8521f079 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/group_prover.sage @@ -0,0 +1,322 @@ +# This code supports verifying group implementations which have branches +# or conditional statements (like cmovs), by allowing each execution path +# to independently set assumptions on input or intermediary variables. +# +# The general approach is: +# * A constraint is a tuple of two sets of symbolic expressions: +# the first of which are required to evaluate to zero, the second of which +# are required to evaluate to nonzero. +# - A constraint is said to be conflicting if any of its nonzero expressions +# is in the ideal with basis the zero expressions (in other words: when the +# zero expressions imply that one of the nonzero expressions are zero). +# * There is a list of laws that describe the intended behaviour, including +# laws for addition and doubling. Each law is called with the symbolic point +# coordinates as arguments, and returns: +# - A constraint describing the assumptions under which it is applicable, +# called "assumeLaw" +# - A constraint describing the requirements of the law, called "require" +# * Implementations are transliterated into functions that operate as well on +# algebraic input points, and are called once per combination of branches +# executed. Each execution returns: +# - A constraint describing the assumptions this implementation requires +# (such as Z1=1), called "assumeFormula" +# - A constraint describing the assumptions this specific branch requires, +# but which is by construction guaranteed to cover the entire space by +# merging the results from all branches, called "assumeBranch" +# - The result of the computation +# * All combinations of laws with implementation branches are tried, and: +# - If the combination of assumeLaw, assumeFormula, and assumeBranch results +# in a conflict, it means this law does not apply to this branch, and it is +# skipped. +# - For others, we try to prove the require constraints hold, assuming the +# information in assumeLaw + assumeFormula + assumeBranch, and if this does +# not succeed, we fail. +# + To prove an expression is zero, we check whether it belongs to the +# ideal with the assumed zero expressions as basis. This test is exact. +# + To prove an expression is nonzero, we check whether each of its +# factors is contained in the set of nonzero assumptions' factors. +# This test is not exact, so various combinations of original and +# reduced expressions' factors are tried. +# - If we succeed, we print out the assumptions from assumeFormula that +# weren't implied by assumeLaw already. Those from assumeBranch are skipped, +# as we assume that all constraints in it are complementary with each other. +# +# Based on the sage verification scripts used in the Explicit-Formulas Database +# by Tanja Lange and others, see http://hyperelliptic.org/EFD + +class fastfrac: + """Fractions over rings.""" + + def __init__(self,R,top,bot=1): + """Construct a fractional, given a ring, a numerator, and denominator.""" + self.R = R + if parent(top) == ZZ or parent(top) == R: + self.top = R(top) + self.bot = R(bot) + elif top.__class__ == fastfrac: + self.top = top.top + self.bot = top.bot * bot + else: + self.top = R(numerator(top)) + self.bot = R(denominator(top)) * bot + + def iszero(self,I): + """Return whether this fraction is zero given an ideal.""" + return self.top in I and self.bot not in I + + def reduce(self,assumeZero): + zero = self.R.ideal(map(numerator, assumeZero)) + return fastfrac(self.R, zero.reduce(self.top)) / fastfrac(self.R, zero.reduce(self.bot)) + + def __add__(self,other): + """Add two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top + self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot + self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __sub__(self,other): + """Subtract two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top - self.bot * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot - self.bot * other.top,self.bot * other.bot) + return NotImplemented + + def __neg__(self): + """Return the negation of a fraction.""" + return fastfrac(self.R,-self.top,self.bot) + + def __mul__(self,other): + """Multiply two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top * other,self.bot) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.top,self.bot * other.bot) + return NotImplemented + + def __rmul__(self,other): + """Multiply something else with a fraction.""" + return self.__mul__(other) + + def __div__(self,other): + """Divide two fractions.""" + if parent(other) == ZZ: + return fastfrac(self.R,self.top,self.bot * other) + if other.__class__ == fastfrac: + return fastfrac(self.R,self.top * other.bot,self.bot * other.top) + return NotImplemented + + def __pow__(self,other): + """Compute a power of a fraction.""" + if parent(other) == ZZ: + if other < 0: + # Negative powers require flipping top and bottom + return fastfrac(self.R,self.bot ^ (-other),self.top ^ (-other)) + else: + return fastfrac(self.R,self.top ^ other,self.bot ^ other) + return NotImplemented + + def __str__(self): + return "fastfrac((" + str(self.top) + ") / (" + str(self.bot) + "))" + def __repr__(self): + return "%s" % self + + def numerator(self): + return self.top + +class constraints: + """A set of constraints, consisting of zero and nonzero expressions. + + Constraints can either be used to express knowledge or a requirement. + + Both the fields zero and nonzero are maps from expressions to description + strings. The expressions that are the keys in zero are required to be zero, + and the expressions that are the keys in nonzero are required to be nonzero. + + Note that (a != 0) and (b != 0) is the same as (a*b != 0), so all keys in + nonzero could be multiplied into a single key. This is often much less + efficient to work with though, so we keep them separate inside the + constraints. This allows higher-level code to do fast checks on the individual + nonzero elements, or combine them if needed for stronger checks. + + We can't multiply the different zero elements, as it would suffice for one of + the factors to be zero, instead of all of them. Instead, the zero elements are + typically combined into an ideal first. + """ + + def __init__(self, **kwargs): + if 'zero' in kwargs: + self.zero = dict(kwargs['zero']) + else: + self.zero = dict() + if 'nonzero' in kwargs: + self.nonzero = dict(kwargs['nonzero']) + else: + self.nonzero = dict() + + def negate(self): + return constraints(zero=self.nonzero, nonzero=self.zero) + + def __add__(self, other): + zero = self.zero.copy() + zero.update(other.zero) + nonzero = self.nonzero.copy() + nonzero.update(other.nonzero) + return constraints(zero=zero, nonzero=nonzero) + + def __str__(self): + return "constraints(zero=%s,nonzero=%s)" % (self.zero, self.nonzero) + + def __repr__(self): + return "%s" % self + + +def conflicts(R, con): + """Check whether any of the passed non-zero assumptions is implied by the zero assumptions""" + zero = R.ideal(map(numerator, con.zero)) + if 1 in zero: + return True + # First a cheap check whether any of the individual nonzero terms conflict on + # their own. + for nonzero in con.nonzero: + if nonzero.iszero(zero): + return True + # It can be the case that entries in the nonzero set do not individually + # conflict with the zero set, but their combination does. For example, knowing + # that either x or y is zero is equivalent to having x*y in the zero set. + # Having x or y individually in the nonzero set is not a conflict, but both + # simultaneously is, so that is the right thing to check for. + if reduce(lambda a,b: a * b, con.nonzero, fastfrac(R, 1)).iszero(zero): + return True + return False + + +def get_nonzero_set(R, assume): + """Calculate a simple set of nonzero expressions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = set() + for nz in map(numerator, assume.nonzero): + for (f,n) in nz.factor(): + nonzero.add(f) + rnz = zero.reduce(nz) + for (f,n) in rnz.factor(): + nonzero.add(f) + return nonzero + + +def prove_nonzero(R, exprs, assume): + """Check whether an expression is provably nonzero, given assumptions""" + zero = R.ideal(map(numerator, assume.zero)) + nonzero = get_nonzero_set(R, assume) + expl = set() + ok = True + for expr in exprs: + if numerator(expr) in zero: + return (False, [exprs[expr]]) + allexprs = reduce(lambda a,b: numerator(a)*numerator(b), exprs, 1) + for (f, n) in allexprs.factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for (f, n) in zero.reduce(numerator(allexprs)).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in numerator(expr).factor(): + if f not in nonzero: + ok = False + if ok: + return (True, None) + ok = True + for expr in exprs: + for (f,n) in zero.reduce(numerator(expr)).factor(): + if f not in nonzero: + expl.add(exprs[expr]) + if expl: + return (False, list(expl)) + else: + return (True, None) + + +def prove_zero(R, exprs, assume): + """Check whether all of the passed expressions are provably zero, given assumptions""" + r, e = prove_nonzero(R, dict(map(lambda x: (fastfrac(R, x.bot, 1), exprs[x]), exprs)), assume) + if not r: + return (False, map(lambda x: "Possibly zero denominator: %s" % x, e)) + zero = R.ideal(map(numerator, assume.zero)) + nonzero = prod(x for x in assume.nonzero) + expl = [] + for expr in exprs: + if not expr.iszero(zero): + expl.append(exprs[expr]) + if not expl: + return (True, None) + return (False, expl) + + +def describe_extra(R, assume, assumeExtra): + """Describe what assumptions are added, given existing assumptions""" + zerox = assume.zero.copy() + zerox.update(assumeExtra.zero) + zero = R.ideal(map(numerator, assume.zero)) + zeroextra = R.ideal(map(numerator, zerox)) + nonzero = get_nonzero_set(R, assume) + ret = set() + # Iterate over the extra zero expressions + for base in assumeExtra.zero: + if base not in zero: + add = [] + for (f, n) in numerator(base).factor(): + if f not in nonzero: + add += ["%s" % f] + if add: + ret.add((" * ".join(add)) + " = 0 [%s]" % assumeExtra.zero[base]) + # Iterate over the extra nonzero expressions + for nz in assumeExtra.nonzero: + nzr = zeroextra.reduce(numerator(nz)) + if nzr not in zeroextra: + for (f,n) in nzr.factor(): + if zeroextra.reduce(f) not in nonzero: + ret.add("%s != 0" % zeroextra.reduce(f)) + return ", ".join(x for x in ret) + + +def check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require): + """Check a set of zero and nonzero requirements, given a set of zero and nonzero assumptions""" + assume = assumeLaw + assumeAssert + assumeBranch + + if conflicts(R, assume): + # This formula does not apply + return None + + describe = describe_extra(R, assumeLaw + assumeBranch, assumeAssert) + + ok, msg = prove_zero(R, require.zero, assume) + if not ok: + return "FAIL, %s fails (assuming %s)" % (str(msg), describe) + + res, expl = prove_nonzero(R, require.nonzero, assume) + if not res: + return "FAIL, %s fails (assuming %s)" % (str(expl), describe) + + if describe != "": + return "OK (assuming %s)" % describe + else: + return "OK" + + +def concrete_verify(c): + for k in c.zero: + if k != 0: + return (False, c.zero[k]) + for k in c.nonzero: + if k == 0: + return (False, c.nonzero[k]) + return (True, None) diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/secp256k1.sage b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/secp256k1.sage new file mode 100644 index 00000000..a97e732f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/secp256k1.sage @@ -0,0 +1,306 @@ +# Test libsecp256k1' group operation implementations using prover.sage + +import sys + +load("group_prover.sage") +load("weierstrass_prover.sage") + +def formula_secp256k1_gej_double_var(a): + """libsecp256k1's secp256k1_gej_double_var, used by various addition functions""" + rz = a.Z * a.Y + rz = rz * 2 + t1 = a.X^2 + t1 = t1 * 3 + t2 = t1^2 + t3 = a.Y^2 + t3 = t3 * 2 + t4 = t3^2 + t4 = t4 * 2 + t3 = t3 * a.X + rx = t3 + rx = rx * 4 + rx = -rx + rx = rx + t2 + t2 = -t2 + t3 = t3 * 6 + t3 = t3 + t2 + ry = t1 * t3 + t2 = -t4 + ry = ry + t2 + return jacobianpoint(rx, ry, rz) + +def formula_secp256k1_gej_add_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_var""" + if branch == 0: + return (constraints(), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z22 = b.Z^2 + z12 = a.Z^2 + u1 = a.X * z22 + u2 = b.X * z12 + s1 = a.Y * z22 + s1 = s1 * b.Z + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={h : 'h=0', i : 'i=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}), r) + if branch == 3: + return (constraints(), constraints(zero={h : 'h=0', a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h2 * h + h = h * b.Z + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge_var, which assume bz==1""" + if branch == 0: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(nonzero={a.Infinity : 'a_infinite'}), b) + if branch == 1: + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite'}, nonzero={b.Infinity : 'b_infinite'}), a) + z12 = a.Z^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * a.Z + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if (branch == 2): + r = formula_secp256k1_gej_double_var(a) + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if (branch == 3): + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(zero={b.Z - 1 : 'b.z=1'}), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_zinv_var(branch, a, b): + """libsecp256k1's secp256k1_gej_add_zinv_var""" + bzinv = b.Z^(-1) + if branch == 0: + return (constraints(), constraints(nonzero={b.Infinity : 'b_infinite'}), a) + if branch == 1: + bzinv2 = bzinv^2 + bzinv3 = bzinv2 * bzinv + rx = b.X * bzinv2 + ry = b.Y * bzinv3 + rz = 1 + return (constraints(), constraints(zero={b.Infinity : 'b_finite'}, nonzero={a.Infinity : 'a_infinite'}), jacobianpoint(rx, ry, rz)) + azz = a.Z * bzinv + z12 = azz^2 + u1 = a.X + u2 = b.X * z12 + s1 = a.Y + s2 = b.Y * z12 + s2 = s2 * azz + h = -u1 + h = h + u2 + i = -s1 + i = i + s2 + if branch == 2: + r = formula_secp256k1_gej_double_var(a) + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0', i : 'i=0'}), r) + if branch == 3: + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite', h : 'h=0'}, nonzero={i : 'i!=0'}), point_at_infinity()) + i2 = i^2 + h2 = h^2 + h3 = h * h2 + rz = a.Z + rz = rz * h + t = u1 * h2 + rx = t + rx = rx * 2 + rx = rx + h3 + rx = -rx + rx = rx + i2 + ry = -rx + ry = ry + t + ry = ry * i + h3 = h3 * s1 + h3 = -h3 + ry = ry + h3 + return (constraints(), constraints(zero={a.Infinity : 'a_finite', b.Infinity : 'b_finite'}, nonzero={h : 'h!=0'}), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge(branch, a, b): + """libsecp256k1's secp256k1_gej_add_ge""" + zeroes = {} + nonzeroes = {} + a_infinity = False + if (branch & 4) != 0: + nonzeroes.update({a.Infinity : 'a_infinite'}) + a_infinity = True + else: + zeroes.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + rr = t^2 + m_alt = -u2 + tt = u1 * m_alt + rr = rr + tt + degenerate = (branch & 3) == 3 + if (branch & 1) != 0: + zeroes.update({m : 'm_zero'}) + else: + nonzeroes.update({m : 'm_nonzero'}) + if (branch & 2) != 0: + zeroes.update({rr : 'rr_zero'}) + else: + nonzeroes.update({rr : 'rr_nonzero'}) + rr_alt = s1 + rr_alt = rr_alt * 2 + m_alt = m_alt + u1 + if not degenerate: + rr_alt = rr + m_alt = m + n = m_alt^2 + q = n * t + n = n^2 + if degenerate: + n = m + t = rr_alt^2 + rz = a.Z * m_alt + infinity = False + if (branch & 8) != 0: + if not a_infinity: + infinity = True + zeroes.update({rz : 'r.z=0'}) + else: + nonzeroes.update({rz : 'r.z!=0'}) + rz = rz * 2 + q = -q + t = t + q + rx = t + t = t * 2 + t = t + q + t = t * rr_alt + t = t + n + ry = -t + rx = rx * 4 + ry = ry * 4 + if a_infinity: + rx = b.X + ry = b.Y + rz = 1 + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zeroes, nonzero=nonzeroes), jacobianpoint(rx, ry, rz)) + +def formula_secp256k1_gej_add_ge_old(branch, a, b): + """libsecp256k1's old secp256k1_gej_add_ge, which fails when ay+by=0 but ax!=bx""" + a_infinity = (branch & 1) != 0 + zero = {} + nonzero = {} + if a_infinity: + nonzero.update({a.Infinity : 'a_infinite'}) + else: + zero.update({a.Infinity : 'a_finite'}) + zz = a.Z^2 + u1 = a.X + u2 = b.X * zz + s1 = a.Y + s2 = b.Y * zz + s2 = s2 * a.Z + z = a.Z + t = u1 + t = t + u2 + m = s1 + m = m + s2 + n = m^2 + q = n * t + n = n^2 + rr = t^2 + t = u1 * u2 + t = -t + rr = rr + t + t = rr^2 + rz = m * z + infinity = False + if (branch & 2) != 0: + if not a_infinity: + infinity = True + else: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(nonzero={z : 'conflict_a'}, zero={z : 'conflict_b'}), point_at_infinity()) + zero.update({rz : 'r.z=0'}) + else: + nonzero.update({rz : 'r.z!=0'}) + rz = rz * (0 if a_infinity else 2) + rx = t + q = -q + rx = rx + q + q = q * 3 + t = t * 2 + t = t + q + t = t * rr + t = t + n + ry = -t + rx = rx * (0 if a_infinity else 4) + ry = ry * (0 if a_infinity else 4) + t = b.X + t = t * (1 if a_infinity else 0) + rx = rx + t + t = b.Y + t = t * (1 if a_infinity else 0) + ry = ry + t + t = (1 if a_infinity else 0) + rz = rz + t + if infinity: + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), point_at_infinity()) + return (constraints(zero={b.Z - 1 : 'b.z=1', b.Infinity : 'b_finite'}), constraints(zero=zero, nonzero=nonzero), jacobianpoint(rx, ry, rz)) + +if __name__ == "__main__": + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge) + check_symbolic_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old) + + if len(sys.argv) >= 2 and sys.argv[1] == "--exhaustive": + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_var", 0, 7, 5, formula_secp256k1_gej_add_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_var", 0, 7, 5, formula_secp256k1_gej_add_ge_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_zinv_var", 0, 7, 5, formula_secp256k1_gej_add_zinv_var, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge", 0, 7, 16, formula_secp256k1_gej_add_ge, 43) + check_exhaustive_jacobian_weierstrass("secp256k1_gej_add_ge_old [should fail]", 0, 7, 4, formula_secp256k1_gej_add_ge_old, 43) diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/weierstrass_prover.sage b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/weierstrass_prover.sage new file mode 100644 index 00000000..03ef2ec9 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/sage/weierstrass_prover.sage @@ -0,0 +1,264 @@ +# Prover implementation for Weierstrass curves of the form +# y^2 = x^3 + A * x + B, specifically with a = 0 and b = 7, with group laws +# operating on affine and Jacobian coordinates, including the point at infinity +# represented by a 4th variable in coordinates. + +load("group_prover.sage") + + +class affinepoint: + def __init__(self, x, y, infinity=0): + self.x = x + self.y = y + self.infinity = infinity + def __str__(self): + return "affinepoint(x=%s,y=%s,inf=%s)" % (self.x, self.y, self.infinity) + + +class jacobianpoint: + def __init__(self, x, y, z, infinity=0): + self.X = x + self.Y = y + self.Z = z + self.Infinity = infinity + def __str__(self): + return "jacobianpoint(X=%s,Y=%s,Z=%s,inf=%s)" % (self.X, self.Y, self.Z, self.Infinity) + + +def point_at_infinity(): + return jacobianpoint(1, 1, 1, 1) + + +def negate(p): + if p.__class__ == affinepoint: + return affinepoint(p.x, -p.y) + if p.__class__ == jacobianpoint: + return jacobianpoint(p.X, -p.Y, p.Z) + assert(False) + + +def on_weierstrass_curve(A, B, p): + """Return a set of zero-expressions for an affine point to be on the curve""" + return constraints(zero={p.x^3 + A*p.x + B - p.y^2: 'on_curve'}) + + +def tangential_to_weierstrass_curve(A, B, p12, p3): + """Return a set of zero-expressions for ((x12,y12),(x3,y3)) to be a line that is tangential to the curve at (x12,y12)""" + return constraints(zero={ + (p12.y - p3.y) * (p12.y * 2) - (p12.x^2 * 3 + A) * (p12.x - p3.x): 'tangential_to_curve' + }) + + +def colinear(p1, p2, p3): + """Return a set of zero-expressions for ((x1,y1),(x2,y2),(x3,y3)) to be collinear""" + return constraints(zero={ + (p1.y - p2.y) * (p1.x - p3.x) - (p1.y - p3.y) * (p1.x - p2.x): 'colinear_1', + (p2.y - p3.y) * (p2.x - p1.x) - (p2.y - p1.y) * (p2.x - p3.x): 'colinear_2', + (p3.y - p1.y) * (p3.x - p2.x) - (p3.y - p2.y) * (p3.x - p1.x): 'colinear_3' + }) + + +def good_affine_point(p): + return constraints(nonzero={p.x : 'nonzero_x', p.y : 'nonzero_y'}) + + +def good_jacobian_point(p): + return constraints(nonzero={p.X : 'nonzero_X', p.Y : 'nonzero_Y', p.Z^6 : 'nonzero_Z'}) + + +def good_point(p): + return constraints(nonzero={p.Z^6 : 'nonzero_X'}) + + +def finite(p, *affine_fns): + con = good_point(p) + constraints(zero={p.Infinity : 'finite_point'}) + if p.Z != 0: + return con + reduce(lambda a, b: a + b, (f(affinepoint(p.X / p.Z^2, p.Y / p.Z^3)) for f in affine_fns), con) + else: + return con + +def infinite(p): + return constraints(nonzero={p.Infinity : 'infinite_point'}) + + +def law_jacobian_weierstrass_add(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian add, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(nonzero={pa.x - pb.x : 'different_x'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + colinear(pa, pb, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_double(A, B, pa, pb, pA, pB, pC): + """Check whether the passed set of coordinates is a valid Jacobian doubling, given assumptions""" + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y - pb.y : 'equal_y'})) + require = (finite(pC, lambda pc: on_weierstrass_curve(A, B, pc) + + tangential_to_weierstrass_curve(A, B, pa, negate(pc)))) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_opposites(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + on_weierstrass_curve(A, B, pb) + + finite(pA) + + finite(pB) + + constraints(zero={pa.x - pb.x : 'equal_x', pa.y + pb.y : 'opposite_y'})) + require = infinite(pC) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_a(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pb) + + infinite(pA) + + finite(pB)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pb.x : 'c.x=b.x', pc.y - pb.y : 'c.y=b.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_b(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + on_weierstrass_curve(A, B, pa) + + infinite(pB) + + finite(pA)) + require = finite(pC, lambda pc: constraints(zero={pc.x - pa.x : 'c.x=a.x', pc.y - pa.y : 'c.y=a.y'})) + return (assumeLaw, require) + + +def law_jacobian_weierstrass_add_infinite_ab(A, B, pa, pb, pA, pB, pC): + assumeLaw = (good_affine_point(pa) + + good_affine_point(pb) + + good_jacobian_point(pA) + + good_jacobian_point(pB) + + infinite(pA) + + infinite(pB)) + require = infinite(pC) + return (assumeLaw, require) + + +laws_jacobian_weierstrass = { + 'add': law_jacobian_weierstrass_add, + 'double': law_jacobian_weierstrass_double, + 'add_opposite': law_jacobian_weierstrass_add_opposites, + 'add_infinite_a': law_jacobian_weierstrass_add_infinite_a, + 'add_infinite_b': law_jacobian_weierstrass_add_infinite_b, + 'add_infinite_ab': law_jacobian_weierstrass_add_infinite_ab +} + + +def check_exhaustive_jacobian_weierstrass(name, A, B, branches, formula, p): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve, by executing and validating the result for every possible addition in a prime field""" + F = Integers(p) + print "Formula %s on Z%i:" % (name, p) + points = [] + for x in xrange(0, p): + for y in xrange(0, p): + point = affinepoint(F(x), F(y)) + r, e = concrete_verify(on_weierstrass_curve(A, B, point)) + if r: + points.append(point) + + for za in xrange(1, p): + for zb in xrange(1, p): + for pa in points: + for pb in points: + for ia in xrange(2): + for ib in xrange(2): + pA = jacobianpoint(pa.x * F(za)^2, pa.y * F(za)^3, F(za), ia) + pB = jacobianpoint(pb.x * F(zb)^2, pb.y * F(zb)^3, F(zb), ib) + for branch in xrange(0, branches): + assumeAssert, assumeBranch, pC = formula(branch, pA, pB) + pC.X = F(pC.X) + pC.Y = F(pC.Y) + pC.Z = F(pC.Z) + pC.Infinity = F(pC.Infinity) + r, e = concrete_verify(assumeAssert + assumeBranch) + if r: + match = False + for key in laws_jacobian_weierstrass: + assumeLaw, require = laws_jacobian_weierstrass[key](A, B, pa, pb, pA, pB, pC) + r, e = concrete_verify(assumeLaw) + if r: + if match: + print " multiple branches for (%s,%s,%s,%s) + (%s,%s,%s,%s)" % (pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity) + else: + match = True + r, e = concrete_verify(require) + if not r: + print " failure in branch %i for (%s,%s,%s,%s) + (%s,%s,%s,%s) = (%s,%s,%s,%s): %s" % (branch, pA.X, pA.Y, pA.Z, pA.Infinity, pB.X, pB.Y, pB.Z, pB.Infinity, pC.X, pC.Y, pC.Z, pC.Infinity, e) + print + + +def check_symbolic_function(R, assumeAssert, assumeBranch, f, A, B, pa, pb, pA, pB, pC): + assumeLaw, require = f(A, B, pa, pb, pA, pB, pC) + return check_symbolic(R, assumeLaw, assumeAssert, assumeBranch, require) + +def check_symbolic_jacobian_weierstrass(name, A, B, branches, formula): + """Verify an implementation of addition of Jacobian points on a Weierstrass curve symbolically""" + R. = PolynomialRing(QQ,8,order='invlex') + lift = lambda x: fastfrac(R,x) + ax = lift(ax) + ay = lift(ay) + Az = lift(Az) + bx = lift(bx) + by = lift(by) + Bz = lift(Bz) + Ai = lift(Ai) + Bi = lift(Bi) + + pa = affinepoint(ax, ay, Ai) + pb = affinepoint(bx, by, Bi) + pA = jacobianpoint(ax * Az^2, ay * Az^3, Az, Ai) + pB = jacobianpoint(bx * Bz^2, by * Bz^3, Bz, Bi) + + res = {} + + for key in laws_jacobian_weierstrass: + res[key] = [] + + print ("Formula " + name + ":") + count = 0 + for branch in xrange(branches): + assumeFormula, assumeBranch, pC = formula(branch, pA, pB) + pC.X = lift(pC.X) + pC.Y = lift(pC.Y) + pC.Z = lift(pC.Z) + pC.Infinity = lift(pC.Infinity) + + for key in laws_jacobian_weierstrass: + res[key].append((check_symbolic_function(R, assumeFormula, assumeBranch, laws_jacobian_weierstrass[key], A, B, pa, pb, pA, pB, pC), branch)) + + for key in res: + print " %s:" % key + val = res[key] + for x in val: + if x[0] is not None: + print " branch %i: %s" % (x[1], x[0]) + + print diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/asm/field_10x26_arm.s b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/asm/field_10x26_arm.s new file mode 100644 index 00000000..5a9cc3ff --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/asm/field_10x26_arm.s @@ -0,0 +1,919 @@ +@ vim: set tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab syntax=armasm: +/********************************************************************** + * Copyright (c) 2014 Wladimir J. van der Laan * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +/* +ARM implementation of field_10x26 inner loops. + +Note: + +- To avoid unnecessary loads and make use of available registers, two + 'passes' have every time been interleaved, with the odd passes accumulating c' and d' + which will be added to c and d respectively in the even passes + +*/ + + .syntax unified + .arch armv7-a + @ eabi attributes - see readelf -A + .eabi_attribute 8, 1 @ Tag_ARM_ISA_use = yes + .eabi_attribute 9, 0 @ Tag_Thumb_ISA_use = no + .eabi_attribute 10, 0 @ Tag_FP_arch = none + .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte + .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Aggressive Speed + .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 + .text + + @ Field constants + .set field_R0, 0x3d10 + .set field_R1, 0x400 + .set field_not_M, 0xfc000000 @ ~M = ~0x3ffffff + + .align 2 + .global secp256k1_fe_mul_inner + .type secp256k1_fe_mul_inner, %function + @ Arguments: + @ r0 r Restrict: can overlap with a, not with b + @ r1 a + @ r2 b + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_mul_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r7,r8 scratch + r1 a (pointer) + r2 b (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + + /* A - interleaved with B */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #9*4] @ b[9] + ldr r0, [r1, #1*4] @ a[1] + umull r5, r6, r7, r8 @ d = a[0] * b[9] + ldr r14, [r2, #8*4] @ b[8] + umull r9, r10, r0, r8 @ d' = a[1] * b[9] + ldr r7, [r1, #2*4] @ a[2] + umlal r5, r6, r0, r14 @ d += a[1] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r14 @ d' += a[2] * b[8] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r8 @ d += a[2] * b[7] + ldr r14, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r8 @ d' += a[3] * b[7] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r14 @ d += a[3] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r14 @ d' += a[4] * b[6] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r8 @ d += a[4] * b[5] + ldr r14, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r8 @ d' += a[5] * b[5] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r14 @ d += a[5] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r14 @ d' += a[6] * b[4] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[3] + ldr r14, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r8 @ d' += a[7] * b[3] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[7] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r9, r10, r7, r14 @ d' += a[8] * b[2] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r8 @ d += a[8] * b[1] + ldr r14, [r2, #0*4] @ b[0] + umlal r9, r10, r0, r8 @ d' += a[9] * b[1] + ldr r7, [r1, #0*4] @ a[0] + umlal r5, r6, r0, r14 @ d += a[9] * b[0] + @ r7,r14 used in B + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 4*9] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + umull r3, r4, r7, r14 @ c = a[0] * b[0] + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C - interleaved with D */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #2*4] @ b[2] + ldr r14, [r2, #1*4] @ b[1] + umull r11, r12, r7, r8 @ c' = a[0] * b[2] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[1] * b[1] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[2] * b[0] + ldr r0, [r1, #3*4] @ a[3] + umlal r5, r6, r7, r14 @ d += a[2] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[3] * b[9] + ldr r7, [r1, #4*4] @ a[4] + umlal r5, r6, r0, r8 @ d += a[3] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[4] * b[8] + ldr r0, [r1, #5*4] @ a[5] + umlal r5, r6, r7, r14 @ d += a[4] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[5] * b[7] + ldr r7, [r1, #6*4] @ a[6] + umlal r5, r6, r0, r8 @ d += a[5] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r9, r10, r7, r8 @ d' += a[6] * b[6] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r9, r10, r0, r14 @ d' += a[7] * b[5] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r9, r10, r7, r8 @ d' += a[8] * b[4] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r9, r10, r0, r14 @ d' += a[9] * b[3] + umlal r5, r6, r0, r8 @ d += a[9] * b[2] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E - interleaved with F */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #4*4] @ b[4] + umull r11, r12, r7, r8 @ c' = a[0] * b[4] + ldr r8, [r2, #3*4] @ b[3] + umlal r3, r4, r7, r8 @ c += a[0] * b[3] + ldr r7, [r1, #1*4] @ a[1] + umlal r11, r12, r7, r8 @ c' += a[1] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r3, r4, r7, r8 @ c += a[1] * b[2] + ldr r7, [r1, #2*4] @ a[2] + umlal r11, r12, r7, r8 @ c' += a[2] * b[2] + ldr r8, [r2, #1*4] @ b[1] + umlal r3, r4, r7, r8 @ c += a[2] * b[1] + ldr r7, [r1, #3*4] @ a[3] + umlal r11, r12, r7, r8 @ c' += a[3] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r3, r4, r7, r8 @ c += a[3] * b[0] + ldr r7, [r1, #4*4] @ a[4] + umlal r11, r12, r7, r8 @ c' += a[4] * b[0] + ldr r8, [r2, #9*4] @ b[9] + umlal r5, r6, r7, r8 @ d += a[4] * b[9] + ldr r7, [r1, #5*4] @ a[5] + umull r9, r10, r7, r8 @ d' = a[5] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umlal r5, r6, r7, r8 @ d += a[5] * b[8] + ldr r7, [r1, #6*4] @ a[6] + umlal r9, r10, r7, r8 @ d' += a[6] * b[8] + ldr r8, [r2, #7*4] @ b[7] + umlal r5, r6, r7, r8 @ d += a[6] * b[7] + ldr r7, [r1, #7*4] @ a[7] + umlal r9, r10, r7, r8 @ d' += a[7] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r5, r6, r7, r8 @ d += a[7] * b[6] + ldr r7, [r1, #8*4] @ a[8] + umlal r9, r10, r7, r8 @ d' += a[8] * b[6] + ldr r8, [r2, #5*4] @ b[5] + umlal r5, r6, r7, r8 @ d += a[8] * b[5] + ldr r7, [r1, #9*4] @ a[9] + umlal r9, r10, r7, r8 @ d' += a[9] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r5, r6, r7, r8 @ d += a[9] * b[4] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G - interleaved with H */ + ldr r7, [r1, #0*4] @ a[0] + ldr r8, [r2, #6*4] @ b[6] + ldr r14, [r2, #5*4] @ b[5] + umull r11, r12, r7, r8 @ c' = a[0] * b[6] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[1] * b[5] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[2] * b[4] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[3] * b[3] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[4] * b[2] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[5] * b[1] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[6] * b[0] + ldr r0, [r1, #7*4] @ a[7] + umlal r5, r6, r7, r14 @ d += a[6] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[7] * b[9] + ldr r7, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r8 @ d += a[7] * b[8] + ldr r14, [r2, #7*4] @ b[7] + umlal r9, r10, r7, r8 @ d' += a[8] * b[8] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r9, r10, r0, r14 @ d' += a[9] * b[7] + umlal r5, r6, r0, r8 @ d += a[9] * b[6] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I - interleaved with J */ + ldr r8, [r2, #8*4] @ b[8] + ldr r7, [r1, #0*4] @ a[0] + ldr r14, [r2, #7*4] @ b[7] + umull r11, r12, r7, r8 @ c' = a[0] * b[8] + ldr r0, [r1, #1*4] @ a[1] + umlal r3, r4, r7, r14 @ c += a[0] * b[7] + ldr r8, [r2, #6*4] @ b[6] + umlal r11, r12, r0, r14 @ c' += a[1] * b[7] + ldr r7, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r8 @ c += a[1] * b[6] + ldr r14, [r2, #5*4] @ b[5] + umlal r11, r12, r7, r8 @ c' += a[2] * b[6] + ldr r0, [r1, #3*4] @ a[3] + umlal r3, r4, r7, r14 @ c += a[2] * b[5] + ldr r8, [r2, #4*4] @ b[4] + umlal r11, r12, r0, r14 @ c' += a[3] * b[5] + ldr r7, [r1, #4*4] @ a[4] + umlal r3, r4, r0, r8 @ c += a[3] * b[4] + ldr r14, [r2, #3*4] @ b[3] + umlal r11, r12, r7, r8 @ c' += a[4] * b[4] + ldr r0, [r1, #5*4] @ a[5] + umlal r3, r4, r7, r14 @ c += a[4] * b[3] + ldr r8, [r2, #2*4] @ b[2] + umlal r11, r12, r0, r14 @ c' += a[5] * b[3] + ldr r7, [r1, #6*4] @ a[6] + umlal r3, r4, r0, r8 @ c += a[5] * b[2] + ldr r14, [r2, #1*4] @ b[1] + umlal r11, r12, r7, r8 @ c' += a[6] * b[2] + ldr r0, [r1, #7*4] @ a[7] + umlal r3, r4, r7, r14 @ c += a[6] * b[1] + ldr r8, [r2, #0*4] @ b[0] + umlal r11, r12, r0, r14 @ c' += a[7] * b[1] + ldr r7, [r1, #8*4] @ a[8] + umlal r3, r4, r0, r8 @ c += a[7] * b[0] + ldr r14, [r2, #9*4] @ b[9] + umlal r11, r12, r7, r8 @ c' += a[8] * b[0] + ldr r0, [r1, #9*4] @ a[9] + umlal r5, r6, r7, r14 @ d += a[8] * b[9] + ldr r8, [r2, #8*4] @ b[8] + umull r9, r10, r0, r14 @ d' = a[9] * b[9] + umlal r5, r6, r0, r8 @ d += a[9] * b[8] + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_mul_inner, .-secp256k1_fe_mul_inner + + .align 2 + .global secp256k1_fe_sqr_inner + .type secp256k1_fe_sqr_inner, %function + @ Arguments: + @ r0 r Can overlap with a + @ r1 a + @ Stack (total 4+10*4 = 44) + @ sp + #0 saved 'r' pointer + @ sp + #4 + 4*X t0,t1,t2,t3,t4,t5,t6,t7,u8,t9 +secp256k1_fe_sqr_inner: + stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r14} + sub sp, sp, #48 @ frame=44 + alignment + str r0, [sp, #0] @ save result address, we need it only at the end + /****************************************** + * Main computation code. + ****************************************** + + Allocation: + r0,r14,r2,r7,r8 scratch + r1 a (pointer) + r3:r4 c + r5:r6 d + r11:r12 c' + r9:r10 d' + + Note: do not write to r[] here, it may overlap with a[] + */ + /* A interleaved with B */ + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r7, [r1, #0*4] @ a[0] + mov r0, r0, asl #1 + ldr r14, [r1, #9*4] @ a[9] + umull r3, r4, r7, r7 @ c = a[0] * a[0] + ldr r8, [r1, #8*4] @ a[8] + mov r7, r7, asl #1 + umull r5, r6, r7, r14 @ d = a[0]*2 * a[9] + ldr r7, [r1, #2*4] @ a[2]*2 + umull r9, r10, r0, r14 @ d' = a[1]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[1]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #3*4] @ a[3]*2 + umlal r9, r10, r7, r8 @ d' += a[2]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[7] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umlal r9, r10, r0, r14 @ d' += a[3]*2 * a[7] + ldr r14, [r1, #5*4] @ a[5] + mov r7, r7, asl #1 + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[6] + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[6] + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[5] + umlal r9, r10, r14, r14 @ d' += a[5] * a[5] + + bic r0, r5, field_not_M @ t9 = d & M + str r0, [sp, #4 + 9*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + /* B */ + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u0 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u0 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t0 = c & M + str r14, [sp, #4 + 0*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u0 * R1 + umlal r3, r4, r0, r14 + + /* C interleaved with D */ + ldr r0, [r1, #0*4] @ a[0]*2 + ldr r14, [r1, #1*4] @ a[1] + mov r0, r0, asl #1 + ldr r8, [r1, #2*4] @ a[2] + umlal r3, r4, r0, r14 @ c += a[0]*2 * a[1] + mov r7, r8, asl #1 @ a[2]*2 + umull r11, r12, r14, r14 @ c' = a[1] * a[1] + ldr r14, [r1, #9*4] @ a[9] + umlal r11, r12, r0, r8 @ c' += a[0]*2 * a[2] + ldr r0, [r1, #3*4] @ a[3]*2 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r7, r14 @ d += a[2]*2 * a[9] + mov r0, r0, asl #1 + ldr r7, [r1, #4*4] @ a[4]*2 + umull r9, r10, r0, r14 @ d' = a[3]*2 * a[9] + ldr r14, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r8 @ d += a[3]*2 * a[8] + mov r7, r7, asl #1 + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r9, r10, r7, r8 @ d' += a[4]*2 * a[8] + ldr r8, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umlal r5, r6, r7, r14 @ d += a[4]*2 * a[7] + umlal r9, r10, r0, r14 @ d' += a[5]*2 * a[7] + umlal r5, r6, r0, r8 @ d += a[5]*2 * a[6] + umlal r9, r10, r8, r8 @ d' += a[6] * a[6] + + bic r0, r5, field_not_M @ u1 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u1 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t1 = c & M + str r14, [sp, #4 + 1*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u1 * R1 + umlal r3, r4, r0, r14 + + /* D */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u2 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u2 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t2 = c & M + str r14, [sp, #4 + 2*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u2 * R1 + umlal r3, r4, r0, r14 + + /* E interleaved with F */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + ldr r14, [r1, #2*4] @ a[2] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + ldr r2, [r1, #4*4] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[3] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[4] + mov r2, r2, asl #1 @ a[4]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[3] + ldr r8, [r1, #9*4] @ a[9] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[2] + ldr r0, [r1, #5*4] @ a[5]*2 + umlal r11, r12, r14, r14 @ c' += a[2] * a[2] + ldr r14, [r1, #8*4] @ a[8] + mov r0, r0, asl #1 + umlal r5, r6, r2, r8 @ d += a[4]*2 * a[9] + ldr r7, [r1, #6*4] @ a[6]*2 + umull r9, r10, r0, r8 @ d' = a[5]*2 * a[9] + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + umlal r5, r6, r0, r14 @ d += a[5]*2 * a[8] + umlal r9, r10, r7, r14 @ d' += a[6]*2 * a[8] + umlal r5, r6, r7, r8 @ d += a[6]*2 * a[7] + umlal r9, r10, r8, r8 @ d' += a[7] * a[7] + + bic r0, r5, field_not_M @ u3 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u3 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t3 = c & M + str r14, [sp, #4 + 3*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u3 * R1 + umlal r3, r4, r0, r14 + + /* F */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u4 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u4 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t4 = c & M + str r14, [sp, #4 + 4*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u4 * R1 + umlal r3, r4, r0, r14 + + /* G interleaved with H */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #5*4] @ a[5] + ldr r2, [r1, #6*4] @ a[6] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[5] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[6] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[5] + mov r7, r7, asl #1 + ldr r8, [r1, #3*4] @ a[3] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[4] + mov r0, r2, asl #1 @ a[6]*2 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[4] + ldr r14, [r1, #9*4] @ a[9] + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[3] + ldr r7, [r1, #7*4] @ a[7]*2 + umlal r11, r12, r8, r8 @ c' += a[3] * a[3] + mov r7, r7, asl #1 + ldr r8, [r1, #8*4] @ a[8] + umlal r5, r6, r0, r14 @ d += a[6]*2 * a[9] + umull r9, r10, r7, r14 @ d' = a[7]*2 * a[9] + umlal r5, r6, r7, r8 @ d += a[7]*2 * a[8] + umlal r9, r10, r8, r8 @ d' += a[8] * a[8] + + bic r0, r5, field_not_M @ u5 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u5 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t5 = c & M + str r14, [sp, #4 + 5*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u5 * R1 + umlal r3, r4, r0, r14 + + /* H */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + adds r5, r5, r9 @ d += d' + adc r6, r6, r10 + + bic r0, r5, field_not_M @ u6 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u6 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t6 = c & M + str r14, [sp, #4 + 6*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u6 * R1 + umlal r3, r4, r0, r14 + + /* I interleaved with J */ + ldr r7, [r1, #0*4] @ a[0]*2 + ldr r0, [r1, #1*4] @ a[1]*2 + mov r7, r7, asl #1 + ldr r8, [r1, #7*4] @ a[7] + ldr r2, [r1, #8*4] @ a[8] + umlal r3, r4, r7, r8 @ c += a[0]*2 * a[7] + ldr r14, [r1, #6*4] @ a[6] + mov r0, r0, asl #1 + umull r11, r12, r7, r2 @ c' = a[0]*2 * a[8] + ldr r7, [r1, #2*4] @ a[2]*2 + umlal r11, r12, r0, r8 @ c' += a[1]*2 * a[7] + ldr r8, [r1, #5*4] @ a[5] + umlal r3, r4, r0, r14 @ c += a[1]*2 * a[6] + ldr r0, [r1, #3*4] @ a[3]*2 + mov r7, r7, asl #1 + umlal r11, r12, r7, r14 @ c' += a[2]*2 * a[6] + ldr r14, [r1, #4*4] @ a[4] + mov r0, r0, asl #1 + umlal r3, r4, r7, r8 @ c += a[2]*2 * a[5] + mov r2, r2, asl #1 @ a[8]*2 + umlal r11, r12, r0, r8 @ c' += a[3]*2 * a[5] + umlal r3, r4, r0, r14 @ c += a[3]*2 * a[4] + umlal r11, r12, r14, r14 @ c' += a[4] * a[4] + ldr r8, [r1, #9*4] @ a[9] + umlal r5, r6, r2, r8 @ d += a[8]*2 * a[9] + @ r8 will be used in J + + bic r0, r5, field_not_M @ u7 = d & M + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u7 * R0 + umlal r3, r4, r0, r14 + bic r14, r3, field_not_M @ t7 = c & M + str r14, [sp, #4 + 7*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u7 * R1 + umlal r3, r4, r0, r14 + + /* J */ + adds r3, r3, r11 @ c += c' + adc r4, r4, r12 + umlal r5, r6, r8, r8 @ d += a[9] * a[9] + + bic r0, r5, field_not_M @ u8 = d & M + str r0, [sp, #4 + 8*4] + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + movw r14, field_R0 @ c += u8 * R0 + umlal r3, r4, r0, r14 + + /****************************************** + * compute and write back result + ****************************************** + Allocation: + r0 r + r3:r4 c + r5:r6 d + r7 t0 + r8 t1 + r9 t2 + r11 u8 + r12 t9 + r1,r2,r10,r14 scratch + + Note: do not read from a[] after here, it may overlap with r[] + */ + ldr r0, [sp, #0] + add r1, sp, #4 + 3*4 @ r[3..7] = t3..7, r11=u8, r12=t9 + ldmia r1, {r2,r7,r8,r9,r10,r11,r12} + add r1, r0, #3*4 + stmia r1, {r2,r7,r8,r9,r10} + + bic r2, r3, field_not_M @ r[8] = c & M + str r2, [r0, #8*4] + mov r3, r3, lsr #26 @ c >>= 26 + orr r3, r3, r4, asl #6 + mov r4, r4, lsr #26 + mov r14, field_R1 @ c += u8 * R1 + umlal r3, r4, r11, r14 + movw r14, field_R0 @ c += d * R0 + umlal r3, r4, r5, r14 + adds r3, r3, r12 @ c += t9 + adc r4, r4, #0 + + add r1, sp, #4 + 0*4 @ r7,r8,r9 = t0,t1,t2 + ldmia r1, {r7,r8,r9} + + ubfx r2, r3, #0, #22 @ r[9] = c & (M >> 4) + str r2, [r0, #9*4] + mov r3, r3, lsr #22 @ c >>= 22 + orr r3, r3, r4, asl #10 + mov r4, r4, lsr #22 + movw r14, field_R1 << 4 @ c += d * (R1 << 4) + umlal r3, r4, r5, r14 + + movw r14, field_R0 >> 4 @ d = c * (R0 >> 4) + t0 (64x64 multiply+add) + umull r5, r6, r3, r14 @ d = c.lo * (R0 >> 4) + adds r5, r5, r7 @ d.lo += t0 + mla r6, r14, r4, r6 @ d.hi += c.hi * (R0 >> 4) + adc r6, r6, 0 @ d.hi += carry + + bic r2, r5, field_not_M @ r[0] = d & M + str r2, [r0, #0*4] + + mov r5, r5, lsr #26 @ d >>= 26 + orr r5, r5, r6, asl #6 + mov r6, r6, lsr #26 + + movw r14, field_R1 >> 4 @ d += c * (R1 >> 4) + t1 (64x64 multiply+add) + umull r1, r2, r3, r14 @ tmp = c.lo * (R1 >> 4) + adds r5, r5, r8 @ d.lo += t1 + adc r6, r6, #0 @ d.hi += carry + adds r5, r5, r1 @ d.lo += tmp.lo + mla r2, r14, r4, r2 @ tmp.hi += c.hi * (R1 >> 4) + adc r6, r6, r2 @ d.hi += carry + tmp.hi + + bic r2, r5, field_not_M @ r[1] = d & M + str r2, [r0, #1*4] + mov r5, r5, lsr #26 @ d >>= 26 (ignore hi) + orr r5, r5, r6, asl #6 + + add r5, r5, r9 @ d += t2 + str r5, [r0, #2*4] @ r[2] = d + + add sp, sp, #48 + ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner + diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/basic-config.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/basic-config.h new file mode 100644 index 00000000..fc588061 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/basic-config.h @@ -0,0 +1,33 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_BASIC_CONFIG_H +#define SECP256K1_BASIC_CONFIG_H + +#ifdef USE_BASIC_CONFIG + +#undef USE_ASM_X86_64 +#undef USE_ENDOMORPHISM +#undef USE_FIELD_10X26 +#undef USE_FIELD_5X52 +#undef USE_FIELD_INV_BUILTIN +#undef USE_FIELD_INV_NUM +#undef USE_NUM_GMP +#undef USE_NUM_NONE +#undef USE_SCALAR_4X64 +#undef USE_SCALAR_8X32 +#undef USE_SCALAR_INV_BUILTIN +#undef USE_SCALAR_INV_NUM + +#define USE_NUM_NONE 1 +#define USE_FIELD_INV_BUILTIN 1 +#define USE_SCALAR_INV_BUILTIN 1 +#define USE_FIELD_10X26 1 +#define USE_SCALAR_8X32 1 + +#endif /* USE_BASIC_CONFIG */ + +#endif /* SECP256K1_BASIC_CONFIG_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench.h new file mode 100644 index 00000000..5b59783f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench.h @@ -0,0 +1,82 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_BENCH_H +#define SECP256K1_BENCH_H + +#include +#include +#include +#include "sys/time.h" + +static double gettimedouble(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_usec * 0.000001 + tv.tv_sec; +} + +void print_number(double x) { + double y = x; + int c = 0; + if (y < 0.0) { + y = -y; + } + while (y > 0 && y < 100.0) { + y *= 10.0; + c++; + } + printf("%.*f", c, x); +} + +void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { + int i; + double min = HUGE_VAL; + double sum = 0.0; + double max = 0.0; + for (i = 0; i < count; i++) { + double begin, total; + if (setup != NULL) { + setup(data); + } + begin = gettimedouble(); + benchmark(data); + total = gettimedouble() - begin; + if (teardown != NULL) { + teardown(data); + } + if (total < min) { + min = total; + } + if (total > max) { + max = total; + } + sum += total; + } + printf("%s: min ", name); + print_number(min * 1000000.0 / iter); + printf("us / avg "); + print_number((sum / count) * 1000000.0 / iter); + printf("us / max "); + print_number(max * 1000000.0 / iter); + printf("us\n"); +} + +int have_flag(int argc, char** argv, char *flag) { + char** argm = argv + argc; + argv++; + if (argv == argm) { + return 1; + } + while (argv != NULL && argv != argm) { + if (strcmp(*argv, flag) == 0) { + return 1; + } + argv++; + } + return 0; +} + +#endif /* SECP256K1_BENCH_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecdh.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecdh.c new file mode 100644 index 00000000..76285ac6 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecdh.c @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include + +#include "secp256k1.h" +#include "secp256k1_ecdh.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context *ctx; + secp256k1_pubkey point; + unsigned char scalar[32]; +} bench_ecdh_data; + +static void bench_ecdh_setup(void* arg) { + int i; + bench_ecdh_data *data = (bench_ecdh_data*)arg; + const unsigned char point[] = { + 0x03, + 0x54, 0x94, 0xc1, 0x5d, 0x32, 0x09, 0x97, 0x06, + 0xc2, 0x39, 0x5f, 0x94, 0x34, 0x87, 0x45, 0xfd, + 0x75, 0x7c, 0xe3, 0x0e, 0x4e, 0x8c, 0x90, 0xfb, + 0xa2, 0xba, 0xd1, 0x84, 0xf8, 0x83, 0xc6, 0x9f + }; + + /* create a context with no capabilities */ + data->ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT); + for (i = 0; i < 32; i++) { + data->scalar[i] = i + 1; + } + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1); +} + +static void bench_ecdh(void* arg) { + int i; + unsigned char res[32]; + bench_ecdh_data *data = (bench_ecdh_data*)arg; + + for (i = 0; i < 20000; i++) { + CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar) == 1); + } +} + +int main(void) { + bench_ecdh_data data; + + run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecmult.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecmult.c new file mode 100644 index 00000000..4dd53484 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_ecmult.c @@ -0,0 +1,196 @@ +/********************************************************************** + * Copyright (c) 2017 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include + +#include "secp256k1.h" + +#include "util.h" +#include "hash_impl.h" +#include "num_impl.h" +#include "field_impl.h" +#include "group_impl.h" +#include "scalar_impl.h" +#include "ecmult_impl.h" +#include "bench.h" +#include "secp256k1.c" + +#define POINTS 32768 +#define ITERS 10000 + +typedef struct { + /* Setup once in advance */ + secp256k1_context* ctx; + secp256k1_scratch_space* scratch; + secp256k1_scalar* scalars; + secp256k1_ge* pubkeys; + secp256k1_scalar* seckeys; + secp256k1_gej* expected_output; + secp256k1_ecmult_multi_func ecmult_multi; + + /* Changes per test */ + size_t count; + int includes_g; + + /* Changes per test iteration */ + size_t offset1; + size_t offset2; + + /* Test output. */ + secp256k1_gej* output; +} bench_data; + +static int bench_callback(secp256k1_scalar* sc, secp256k1_ge* ge, size_t idx, void* arg) { + bench_data* data = (bench_data*)arg; + if (data->includes_g) ++idx; + if (idx == 0) { + *sc = data->scalars[data->offset1]; + *ge = secp256k1_ge_const_g; + } else { + *sc = data->scalars[(data->offset1 + idx) % POINTS]; + *ge = data->pubkeys[(data->offset2 + idx - 1) % POINTS]; + } + return 1; +} + +static void bench_ecmult(void* arg) { + bench_data* data = (bench_data*)arg; + + size_t count = data->count; + int includes_g = data->includes_g; + size_t iters = 1 + ITERS / count; + size_t iter; + + for (iter = 0; iter < iters; ++iter) { + data->ecmult_multi(&data->ctx->ecmult_ctx, data->scratch, &data->output[iter], data->includes_g ? &data->scalars[data->offset1] : NULL, bench_callback, arg, count - includes_g); + data->offset1 = (data->offset1 + count) % POINTS; + data->offset2 = (data->offset2 + count - 1) % POINTS; + } +} + +static void bench_ecmult_setup(void* arg) { + bench_data* data = (bench_data*)arg; + data->offset1 = (data->count * 0x537b7f6f + 0x8f66a481) % POINTS; + data->offset2 = (data->count * 0x7f6f537b + 0x6a1a8f49) % POINTS; +} + +static void bench_ecmult_teardown(void* arg) { + bench_data* data = (bench_data*)arg; + size_t iters = 1 + ITERS / data->count; + size_t iter; + /* Verify the results in teardown, to avoid doing comparisons while benchmarking. */ + for (iter = 0; iter < iters; ++iter) { + secp256k1_gej tmp; + secp256k1_gej_add_var(&tmp, &data->output[iter], &data->expected_output[iter], NULL); + CHECK(secp256k1_gej_is_infinity(&tmp)); + } +} + +static void generate_scalar(uint32_t num, secp256k1_scalar* scalar) { + secp256k1_sha256 sha256; + unsigned char c[11] = {'e', 'c', 'm', 'u', 'l', 't', 0, 0, 0, 0}; + unsigned char buf[32]; + int overflow = 0; + c[6] = num; + c[7] = num >> 8; + c[8] = num >> 16; + c[9] = num >> 24; + secp256k1_sha256_initialize(&sha256); + secp256k1_sha256_write(&sha256, c, sizeof(c)); + secp256k1_sha256_finalize(&sha256, buf); + secp256k1_scalar_set_b32(scalar, buf, &overflow); + CHECK(!overflow); +} + +static void run_test(bench_data* data, size_t count, int includes_g) { + char str[32]; + static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + size_t iters = 1 + ITERS / count; + size_t iter; + + data->count = count; + data->includes_g = includes_g; + + /* Compute (the negation of) the expected results directly. */ + data->offset1 = (data->count * 0x537b7f6f + 0x8f66a481) % POINTS; + data->offset2 = (data->count * 0x7f6f537b + 0x6a1a8f49) % POINTS; + for (iter = 0; iter < iters; ++iter) { + secp256k1_scalar tmp; + secp256k1_scalar total = data->scalars[(data->offset1++) % POINTS]; + size_t i = 0; + for (i = 0; i + 1 < count; ++i) { + secp256k1_scalar_mul(&tmp, &data->seckeys[(data->offset2++) % POINTS], &data->scalars[(data->offset1++) % POINTS]); + secp256k1_scalar_add(&total, &total, &tmp); + } + secp256k1_scalar_negate(&total, &total); + secp256k1_ecmult(&data->ctx->ecmult_ctx, &data->expected_output[iter], NULL, &zero, &total); + } + + /* Run the benchmark. */ + sprintf(str, includes_g ? "ecmult_%ig" : "ecmult_%i", (int)count); + run_benchmark(str, bench_ecmult, bench_ecmult_setup, bench_ecmult_teardown, data, 10, count * (1 + ITERS / count)); +} + +int main(int argc, char **argv) { + bench_data data; + int i, p; + secp256k1_gej* pubkeys_gej; + size_t scratch_size; + + if (argc > 1) { + if(have_flag(argc, argv, "pippenger_wnaf")) { + printf("Using pippenger_wnaf:\n"); + data.ecmult_multi = secp256k1_ecmult_pippenger_batch_single; + } else if(have_flag(argc, argv, "strauss_wnaf")) { + printf("Using strauss_wnaf:\n"); + data.ecmult_multi = secp256k1_ecmult_strauss_batch_single; + } + } else { + data.ecmult_multi = secp256k1_ecmult_multi_var; + } + + /* Allocate stuff */ + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + scratch_size = secp256k1_strauss_scratch_size(POINTS) + STRAUSS_SCRATCH_OBJECTS*16; + data.scratch = secp256k1_scratch_space_create(data.ctx, scratch_size); + data.scalars = malloc(sizeof(secp256k1_scalar) * POINTS); + data.seckeys = malloc(sizeof(secp256k1_scalar) * POINTS); + data.pubkeys = malloc(sizeof(secp256k1_ge) * POINTS); + data.expected_output = malloc(sizeof(secp256k1_gej) * (ITERS + 1)); + data.output = malloc(sizeof(secp256k1_gej) * (ITERS + 1)); + + /* Generate a set of scalars, and private/public keypairs. */ + pubkeys_gej = malloc(sizeof(secp256k1_gej) * POINTS); + secp256k1_gej_set_ge(&pubkeys_gej[0], &secp256k1_ge_const_g); + secp256k1_scalar_set_int(&data.seckeys[0], 1); + for (i = 0; i < POINTS; ++i) { + generate_scalar(i, &data.scalars[i]); + if (i) { + secp256k1_gej_double_var(&pubkeys_gej[i], &pubkeys_gej[i - 1], NULL); + secp256k1_scalar_add(&data.seckeys[i], &data.seckeys[i - 1], &data.seckeys[i - 1]); + } + } + secp256k1_ge_set_all_gej_var(data.pubkeys, pubkeys_gej, POINTS, &data.ctx->error_callback); + free(pubkeys_gej); + + for (i = 1; i <= 8; ++i) { + run_test(&data, i, 1); + } + + for (p = 0; p <= 11; ++p) { + for (i = 9; i <= 16; ++i) { + run_test(&data, i << p, 1); + } + } + secp256k1_context_destroy(data.ctx); + secp256k1_scratch_space_destroy(data.scratch); + free(data.scalars); + free(data.pubkeys); + free(data.seckeys); + free(data.output); + free(data.expected_output); + + return(0); +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_internal.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_internal.c new file mode 100644 index 00000000..bf6441d4 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_internal.c @@ -0,0 +1,367 @@ +/********************************************************************** + * Copyright (c) 2014-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include + +#include "secp256k1.h" + +#include "util.h" +#include "hash_impl.h" +#include "num_impl.h" +#include "field_impl.h" +#include "group_impl.h" +#include "scalar_impl.h" +#include "ecmult_const_impl.h" +#include "ecmult_impl.h" +#include "bench.h" +#include "secp256k1.c" + +typedef struct { + secp256k1_scalar scalar_x, scalar_y; + secp256k1_fe fe_x, fe_y; + secp256k1_ge ge_x, ge_y; + secp256k1_gej gej_x, gej_y; + unsigned char data[64]; + int wnaf[256]; +} bench_inv; + +void bench_setup(void* arg) { + bench_inv *data = (bench_inv*)arg; + + static const unsigned char init_x[32] = { + 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, + 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, + 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, + 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 + }; + + static const unsigned char init_y[32] = { + 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83, + 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5, + 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9, + 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3 + }; + + secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL); + secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL); + secp256k1_fe_set_b32(&data->fe_x, init_x); + secp256k1_fe_set_b32(&data->fe_y, init_y); + CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0)); + CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1)); + secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); + secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); + memcpy(data->data, init_x, 32); + memcpy(data->data + 32, init_y, 32); +} + +void bench_scalar_add(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_negate(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_sqr(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_mul(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +#ifdef USE_ENDOMORPHISM +void bench_scalar_split(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_scalar l, r; + secp256k1_scalar_split_lambda(&l, &r, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} +#endif + +void bench_scalar_inverse(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_inverse_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_field_normalize(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize(&data->fe_x); + } +} + +void bench_field_normalize_weak(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize_weak(&data->fe_x); + } +} + +void bench_field_mul(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); + } +} + +void bench_field_sqr(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_sqr(&data->fe_x, &data->fe_x); + } +} + +void bench_field_inverse(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_inverse_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_sqrt(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_sqrt(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_group_double_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL); + } +} + +void bench_group_add_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL); + } +} + +void bench_group_add_affine(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); + } +} + +void bench_group_add_affine_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL); + } +} + +void bench_group_jacobi_var(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_gej_has_quad_y_var(&data->gej_x); + } +} + +void bench_ecmult_wnaf(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_ecmult_wnaf(data->wnaf, 256, &data->scalar_x, WINDOW_A); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_wnaf_const(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_wnaf_const(data->wnaf, data->scalar_x, WINDOW_A, 256); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + + +void bench_sha256(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + secp256k1_sha256 sha; + + for (i = 0; i < 20000; i++) { + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, data->data, 32); + secp256k1_sha256_finalize(&sha, data->data); + } +} + +void bench_hmac_sha256(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + secp256k1_hmac_sha256 hmac; + + for (i = 0; i < 20000; i++) { + secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); + secp256k1_hmac_sha256_write(&hmac, data->data, 32); + secp256k1_hmac_sha256_finalize(&hmac, data->data); + } +} + +void bench_rfc6979_hmac_sha256(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + secp256k1_rfc6979_hmac_sha256 rng; + + for (i = 0; i < 20000; i++) { + secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 64); + secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); + } +} + +void bench_context_verify(void* arg) { + int i; + (void)arg; + for (i = 0; i < 20; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_VERIFY)); + } +} + +void bench_context_sign(void* arg) { + int i; + (void)arg; + for (i = 0; i < 200; i++) { + secp256k1_context_destroy(secp256k1_context_create(SECP256K1_CONTEXT_SIGN)); + } +} + +#ifndef USE_NUM_NONE +void bench_num_jacobi(void* arg) { + int i; + bench_inv *data = (bench_inv*)arg; + secp256k1_num nx, norder; + + secp256k1_scalar_get_num(&nx, &data->scalar_x); + secp256k1_scalar_order_get_num(&norder); + secp256k1_scalar_get_num(&norder, &data->scalar_y); + + for (i = 0; i < 200000; i++) { + secp256k1_num_jacobi(&nx, &norder); + } +} +#endif + +int main(int argc, char **argv) { + bench_inv data; + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000); +#ifdef USE_ENDOMORPHISM + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000); +#endif + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000); + + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt", bench_field_sqrt, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "jacobi")) run_benchmark("group_jacobi_var", bench_group_jacobi_var, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "verify")) run_benchmark("context_verify", bench_context_verify, bench_setup, NULL, &data, 10, 20); + if (have_flag(argc, argv, "context") || have_flag(argc, argv, "sign")) run_benchmark("context_sign", bench_context_sign, bench_setup, NULL, &data, 10, 200); + +#ifndef USE_NUM_NONE + if (have_flag(argc, argv, "num") || have_flag(argc, argv, "jacobi")) run_benchmark("num_jacobi", bench_num_jacobi, bench_setup, NULL, &data, 10, 200000); +#endif + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_recover.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_recover.c new file mode 100644 index 00000000..75cf58ec --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_recover.c @@ -0,0 +1,60 @@ +/********************************************************************** + * Copyright (c) 2014-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "secp256k1.h" +#include "secp256k1_recovery.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context *ctx; + unsigned char msg[32]; + unsigned char sig[64]; +} bench_recover_data; + +void bench_recover(void* arg) { + int i; + bench_recover_data *data = (bench_recover_data*)arg; + secp256k1_pubkey pubkey; + unsigned char pubkeyc[33]; + + for (i = 0; i < 20000; i++) { + int j; + size_t pubkeylen = 33; + secp256k1_ecdsa_recoverable_signature sig; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(data->ctx, &sig, data->sig, i % 2)); + CHECK(secp256k1_ecdsa_recover(data->ctx, &pubkey, &sig, data->msg)); + CHECK(secp256k1_ec_pubkey_serialize(data->ctx, pubkeyc, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED)); + for (j = 0; j < 32; j++) { + data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ + data->msg[j] = data->sig[j]; /* Move former R to message. */ + data->sig[j] = pubkeyc[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + } + } +} + +void bench_recover_setup(void* arg) { + int i; + bench_recover_data *data = (bench_recover_data*)arg; + + for (i = 0; i < 32; i++) { + data->msg[i] = 1 + i; + } + for (i = 0; i < 64; i++) { + data->sig[i] = 65 + i; + } +} + +int main(void) { + bench_recover_data data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + + run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_sign.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_sign.c new file mode 100644 index 00000000..9b16251c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_sign.c @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context* ctx; + unsigned char msg[32]; + unsigned char key[32]; +} bench_sign; + +static void bench_sign_setup(void* arg) { + int i; + bench_sign *data = (bench_sign*)arg; + + for (i = 0; i < 32; i++) { + data->msg[i] = i + 1; + } + for (i = 0; i < 32; i++) { + data->key[i] = i + 65; + } +} + +static void bench_sign_run(void* arg) { + int i; + bench_sign *data = (bench_sign*)arg; + + unsigned char sig[74]; + for (i = 0; i < 20000; i++) { + size_t siglen = 74; + int j; + secp256k1_ecdsa_signature signature; + CHECK(secp256k1_ecdsa_sign(data->ctx, &signature, data->msg, data->key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data->ctx, sig, &siglen, &signature)); + for (j = 0; j < 32; j++) { + data->msg[j] = sig[j]; + data->key[j] = sig[j + 32]; + } + } +} + +int main(void) { + bench_sign data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + + run_benchmark("ecdsa_sign", bench_sign_run, bench_sign_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_verify.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_verify.c new file mode 100644 index 00000000..ed454e90 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/bench_verify.c @@ -0,0 +1,112 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "secp256k1.h" +#include "util.h" +#include "bench.h" + +#ifdef ENABLE_OPENSSL_TESTS +#include +#include +#include +#endif + +typedef struct { + secp256k1_context *ctx; + unsigned char msg[32]; + unsigned char key[32]; + unsigned char sig[72]; + size_t siglen; + unsigned char pubkey[33]; + size_t pubkeylen; +#ifdef ENABLE_OPENSSL_TESTS + EC_GROUP* ec_group; +#endif +} benchmark_verify_t; + +static void benchmark_verify(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + CHECK(secp256k1_ec_pubkey_parse(data->ctx, &pubkey, data->pubkey, data->pubkeylen) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(data->ctx, &sig, data->sig, data->siglen) == 1); + CHECK(secp256k1_ecdsa_verify(data->ctx, &sig, data->msg, &pubkey) == (i == 0)); + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} + +#ifdef ENABLE_OPENSSL_TESTS +static void benchmark_verify_openssl(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + { + EC_KEY *pkey = EC_KEY_new(); + const unsigned char *pubkey = &data->pubkey[0]; + int result; + + CHECK(pkey != NULL); + result = EC_KEY_set_group(pkey, data->ec_group); + CHECK(result); + result = (o2i_ECPublicKey(&pkey, &pubkey, data->pubkeylen)) != NULL; + CHECK(result); + result = ECDSA_verify(0, &data->msg[0], sizeof(data->msg), &data->sig[0], data->siglen, pkey) == (i == 0); + CHECK(result); + EC_KEY_free(pkey); + } + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} +#endif + +int main(void) { + int i; + secp256k1_pubkey pubkey; + secp256k1_ecdsa_signature sig; + benchmark_verify_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + for (i = 0; i < 32; i++) { + data.msg[i] = 1 + i; + } + for (i = 0; i < 32; i++) { + data.key[i] = 33 + i; + } + data.siglen = 72; + CHECK(secp256k1_ecdsa_sign(data.ctx, &sig, data.msg, data.key, NULL, NULL)); + CHECK(secp256k1_ecdsa_signature_serialize_der(data.ctx, data.sig, &data.siglen, &sig)); + CHECK(secp256k1_ec_pubkey_create(data.ctx, &pubkey, data.key)); + data.pubkeylen = 33; + CHECK(secp256k1_ec_pubkey_serialize(data.ctx, data.pubkey, &data.pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + + run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); +#ifdef ENABLE_OPENSSL_TESTS + data.ec_group = EC_GROUP_new_by_curve_name(NID_secp256k1); + run_benchmark("ecdsa_verify_openssl", benchmark_verify_openssl, NULL, NULL, &data, 10, 20000); + EC_GROUP_free(data.ec_group); +#endif + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa.h new file mode 100644 index 00000000..80590c7c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa.h @@ -0,0 +1,21 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECDSA_H +#define SECP256K1_ECDSA_H + +#include + +#include "scalar.h" +#include "group.h" +#include "ecmult.h" + +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *r, secp256k1_scalar *s, const unsigned char *sig, size_t size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar *r, const secp256k1_scalar *s); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar* r, const secp256k1_scalar* s, const secp256k1_ge *pubkey, const secp256k1_scalar *message); +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid); + +#endif /* SECP256K1_ECDSA_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa_impl.h new file mode 100644 index 00000000..c3400042 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecdsa_impl.h @@ -0,0 +1,313 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + + +#ifndef SECP256K1_ECDSA_IMPL_H +#define SECP256K1_ECDSA_IMPL_H + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult.h" +#include "ecmult_gen.h" +#include "ecdsa.h" + +/** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1 + * sage: for t in xrange(1023, -1, -1): + * .. p = 2**256 - 2**32 - t + * .. if p.is_prime(): + * .. print '%x'%p + * .. break + * 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f' + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) + * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' + */ +static const secp256k1_fe secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL +); + +/** Difference between field and order, values 'p' and 'n' values defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + * sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) + * '14551231950b75fc4402da1722fc9baee' + */ +static const secp256k1_fe secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( + 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL +); + +static int secp256k1_der_read_len(const unsigned char **sigp, const unsigned char *sigend) { + int lenleft, b1; + size_t ret = 0; + if (*sigp >= sigend) { + return -1; + } + b1 = *((*sigp)++); + if (b1 == 0xFF) { + /* X.690-0207 8.1.3.5.c the value 0xFF shall not be used. */ + return -1; + } + if ((b1 & 0x80) == 0) { + /* X.690-0207 8.1.3.4 short form length octets */ + return b1; + } + if (b1 == 0x80) { + /* Indefinite length is not allowed in DER. */ + return -1; + } + /* X.690-207 8.1.3.5 long form length octets */ + lenleft = b1 & 0x7F; + if (lenleft > sigend - *sigp) { + return -1; + } + if (**sigp == 0) { + /* Not the shortest possible length encoding. */ + return -1; + } + if ((size_t)lenleft > sizeof(size_t)) { + /* The resulting length would exceed the range of a size_t, so + * certainly longer than the passed array size. + */ + return -1; + } + while (lenleft > 0) { + ret = (ret << 8) | **sigp; + if (ret + lenleft > (size_t)(sigend - *sigp)) { + /* Result exceeds the length of the passed array. */ + return -1; + } + (*sigp)++; + lenleft--; + } + if (ret < 128) { + /* Not the shortest possible length encoding. */ + return -1; + } + return ret; +} + +static int secp256k1_der_parse_integer(secp256k1_scalar *r, const unsigned char **sig, const unsigned char *sigend) { + int overflow = 0; + unsigned char ra[32] = {0}; + int rlen; + + if (*sig == sigend || **sig != 0x02) { + /* Not a primitive integer (X.690-0207 8.3.1). */ + return 0; + } + (*sig)++; + rlen = secp256k1_der_read_len(sig, sigend); + if (rlen <= 0 || (*sig) + rlen > sigend) { + /* Exceeds bounds or not at least length 1 (X.690-0207 8.3.1). */ + return 0; + } + if (**sig == 0x00 && rlen > 1 && (((*sig)[1]) & 0x80) == 0x00) { + /* Excessive 0x00 padding. */ + return 0; + } + if (**sig == 0xFF && rlen > 1 && (((*sig)[1]) & 0x80) == 0x80) { + /* Excessive 0xFF padding. */ + return 0; + } + if ((**sig & 0x80) == 0x80) { + /* Negative. */ + overflow = 1; + } + while (rlen > 0 && **sig == 0) { + /* Skip leading zero bytes */ + rlen--; + (*sig)++; + } + if (rlen > 32) { + overflow = 1; + } + if (!overflow) { + memcpy(ra + 32 - rlen, *sig, rlen); + secp256k1_scalar_set_b32(r, ra, &overflow); + } + if (overflow) { + secp256k1_scalar_set_int(r, 0); + } + (*sig) += rlen; + return 1; +} + +static int secp256k1_ecdsa_sig_parse(secp256k1_scalar *rr, secp256k1_scalar *rs, const unsigned char *sig, size_t size) { + const unsigned char *sigend = sig + size; + int rlen; + if (sig == sigend || *(sig++) != 0x30) { + /* The encoding doesn't start with a constructed sequence (X.690-0207 8.9.1). */ + return 0; + } + rlen = secp256k1_der_read_len(&sig, sigend); + if (rlen < 0 || sig + rlen > sigend) { + /* Tuple exceeds bounds */ + return 0; + } + if (sig + rlen != sigend) { + /* Garbage after tuple. */ + return 0; + } + + if (!secp256k1_der_parse_integer(rr, &sig, sigend)) { + return 0; + } + if (!secp256k1_der_parse_integer(rs, &sig, sigend)) { + return 0; + } + + if (sig != sigend) { + /* Trailing garbage inside tuple. */ + return 0; + } + + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, size_t *size, const secp256k1_scalar* ar, const secp256k1_scalar* as) { + unsigned char r[33] = {0}, s[33] = {0}; + unsigned char *rp = r, *sp = s; + size_t lenR = 33, lenS = 33; + secp256k1_scalar_get_b32(&r[1], ar); + secp256k1_scalar_get_b32(&s[1], as); + while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } + while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } + if (*size < 6+lenS+lenR) { + *size = 6 + lenS + lenR; + return 0; + } + *size = 6 + lenS + lenR; + sig[0] = 0x30; + sig[1] = 4 + lenS + lenR; + sig[2] = 0x02; + sig[3] = lenR; + memcpy(sig+4, rp, lenR); + sig[4+lenR] = 0x02; + sig[5+lenR] = lenS; + memcpy(sig+lenR+6, sp, lenS); + return 1; +} + +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar *sigs, const secp256k1_ge *pubkey, const secp256k1_scalar *message) { + unsigned char c[32]; + secp256k1_scalar sn, u1, u2; +#if !defined(EXHAUSTIVE_TEST_ORDER) + secp256k1_fe xr; +#endif + secp256k1_gej pubkeyj; + secp256k1_gej pr; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_inverse_var(&sn, sigs); + secp256k1_scalar_mul(&u1, &sn, message); + secp256k1_scalar_mul(&u2, &sn, sigr); + secp256k1_gej_set_ge(&pubkeyj, pubkey); + secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); + if (secp256k1_gej_is_infinity(&pr)) { + return 0; + } + +#if defined(EXHAUSTIVE_TEST_ORDER) +{ + secp256k1_scalar computed_r; + secp256k1_ge pr_ge; + secp256k1_ge_set_gej(&pr_ge, &pr); + secp256k1_fe_normalize(&pr_ge.x); + + secp256k1_fe_get_b32(c, &pr_ge.x); + secp256k1_scalar_set_b32(&computed_r, c, NULL); + return secp256k1_scalar_eq(sigr, &computed_r); +} +#else + secp256k1_scalar_get_b32(c, sigr); + secp256k1_fe_set_b32(&xr, c); + + /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) + * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p), + * compute the remainder modulo n, and compare it to xr. However: + * + * xr == X(pr) mod n + * <=> exists h. (xr + h * n < p && xr + h * n == X(pr)) + * [Since 2 * n > p, h can only be 0 or 1] + * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr)) + * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p] + * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p) + * [Multiplying both sides of the equations by pr.z^2 mod p] + * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x) + * + * Thus, we can avoid the inversion, but we have to check both cases separately. + * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. + */ + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* xr * pr.z^2 mod p == pr.x, so the signature is valid. */ + return 1; + } + if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + /* xr + n >= p, so we can skip testing the second case. */ + return 0; + } + secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */ + return 1; + } + return 0; +#endif +} + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context *ctx, secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *seckey, const secp256k1_scalar *message, const secp256k1_scalar *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej rp; + secp256k1_ge r; + secp256k1_scalar n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(sigr, b, &overflow); + /* These two conditions should be checked before calling */ + VERIFY_CHECK(!secp256k1_scalar_is_zero(sigr)); + VERIFY_CHECK(overflow == 0); + + if (recid) { + /* The overflow condition is cryptographically unreachable as hitting it requires finding the discrete log + * of some P where P.x >= order, and only 1 in about 2^127 points meet this criteria. + */ + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, sigr, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(sigs, nonce); + secp256k1_scalar_mul(sigs, sigs, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(sigs)) { + return 0; + } + if (secp256k1_scalar_is_high(sigs)) { + secp256k1_scalar_negate(sigs, sigs); + if (recid) { + *recid ^= 1; + } + } + return 1; +} + +#endif /* SECP256K1_ECDSA_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey.h new file mode 100644 index 00000000..b621f1e6 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey.h @@ -0,0 +1,25 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECKEY_H +#define SECP256K1_ECKEY_H + +#include + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed); + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak); + +#endif /* SECP256K1_ECKEY_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey_impl.h new file mode 100644 index 00000000..1ab9a68e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/eckey_impl.h @@ -0,0 +1,100 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECKEY_IMPL_H +#define SECP256K1_ECKEY_IMPL_H + +#include "eckey.h" + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge *elem, const unsigned char *pub, size_t size) { + if (size == 33 && (pub[0] == SECP256K1_TAG_PUBKEY_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_ODD)) { + secp256k1_fe x; + return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == SECP256K1_TAG_PUBKEY_ODD); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe x, y; + if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { + return 0; + } + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_EVEN || pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD) && + secp256k1_fe_is_odd(&y) != (pub[0] == SECP256K1_TAG_PUBKEY_HYBRID_ODD)) { + return 0; + } + return secp256k1_ge_is_valid_var(elem); + } else { + return 0; + } +} + +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge *elem, unsigned char *pub, size_t *size, int compressed) { + if (secp256k1_ge_is_infinity(elem)) { + return 0; + } + secp256k1_fe_normalize_var(&elem->x); + secp256k1_fe_normalize_var(&elem->y); + secp256k1_fe_get_b32(&pub[1], &elem->x); + if (compressed) { + *size = 33; + pub[0] = secp256k1_fe_is_odd(&elem->y) ? SECP256K1_TAG_PUBKEY_ODD : SECP256K1_TAG_PUBKEY_EVEN; + } else { + *size = 65; + pub[0] = SECP256K1_TAG_PUBKEY_UNCOMPRESSED; + secp256k1_fe_get_b32(&pub[33], &elem->y); + } + return 1; +} + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar *key, const secp256k1_scalar *tweak) { + secp256k1_scalar_add(key, key, tweak); + if (secp256k1_scalar_is_zero(key)) { + return 0; + } + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_gej pt; + secp256k1_scalar one; + secp256k1_gej_set_ge(&pt, key); + secp256k1_scalar_set_int(&one, 1); + secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); + + if (secp256k1_gej_is_infinity(&pt)) { + return 0; + } + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar *key, const secp256k1_scalar *tweak) { + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_mul(key, key, tweak); + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context *ctx, secp256k1_ge *key, const secp256k1_scalar *tweak) { + secp256k1_scalar zero; + secp256k1_gej pt; + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_set_int(&zero, 0); + secp256k1_gej_set_ge(&pt, key); + secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero); + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +#endif /* SECP256K1_ECKEY_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult.h new file mode 100644 index 00000000..ea1cd8a2 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2017 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_H +#define SECP256K1_ECMULT_H + +#include "num.h" +#include "group.h" +#include "scalar.h" +#include "scratch.h" + +typedef struct { + /* For accelerating the computation of a*P + b*G: */ + secp256k1_ge_storage (*pre_g)[]; /* odd multiples of the generator */ +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage (*pre_g_128)[]; /* odd multiples of 2^128*generator */ +#endif +} secp256k1_ecmult_context; + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx); +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb); +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx); +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx); + +/** Double multiply: R = na*A + ng*G */ +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng); + +typedef int (secp256k1_ecmult_multi_callback)(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *data); + +/** + * Multi-multiply: R = inp_g_sc * G + sum_i ni * Ai. + * Chooses the right algorithm for a given number of points and scratch space + * size. Resets and overwrites the given scratch space. If the points do not + * fit in the scratch space the algorithm is repeatedly run with batches of + * points. + * Returns: 1 on success (including when inp_g_sc is NULL and n is 0) + * 0 if there is not enough scratch space for a single point or + * callback returns 0 + */ +static int secp256k1_ecmult_multi_var(const secp256k1_ecmult_context *ctx, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n); + +#endif /* SECP256K1_ECMULT_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const.h new file mode 100644 index 00000000..d4804b8b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const.h @@ -0,0 +1,17 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_CONST_H +#define SECP256K1_ECMULT_CONST_H + +#include "scalar.h" +#include "group.h" + +/* Here `bits` should be set to the maximum bitlength of the _absolute value_ of `q`, plus + * one because we internally sometimes add 2 to the number during the WNAF conversion. */ +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q, int bits); + +#endif /* SECP256K1_ECMULT_CONST_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const_impl.h new file mode 100644 index 00000000..8411752e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_const_impl.h @@ -0,0 +1,257 @@ +/********************************************************************** + * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_CONST_IMPL_H +#define SECP256K1_ECMULT_CONST_IMPL_H + +#include "scalar.h" +#include "group.h" +#include "ecmult_const.h" +#include "ecmult_impl.h" + +/* This is like `ECMULT_TABLE_GET_GE` but is constant time */ +#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \ + int m; \ + int abs_n = (n) * (((n) > 0) * 2 - 1); \ + int idx_n = abs_n / 2; \ + secp256k1_fe neg_y; \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \ + VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \ + for (m = 0; m < ECMULT_TABLE_SIZE(w); m++) { \ + /* This loop is used to avoid secret data in array indices. See + * the comment in ecmult_gen_impl.h for rationale. */ \ + secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \ + secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \ + } \ + (r)->infinity = 0; \ + secp256k1_fe_negate(&neg_y, &(r)->y, 1); \ + secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \ +} while(0) + + +/** Convert a number to WNAF notation. + * The number becomes represented by sum(2^{wi} * wnaf[i], i=0..WNAF_SIZE(w)+1) - return_val. + * It has the following guarantees: + * - each wnaf[i] an odd integer between -(1 << w) and (1 << w) + * - each wnaf[i] is nonzero + * - the number of words set is always WNAF_SIZE(w) + 1 + * + * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar + * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.) + * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlagy Berlin Heidelberg 2003 + * + * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335 + */ +static int secp256k1_wnaf_const(int *wnaf, secp256k1_scalar s, int w, int size) { + int global_sign; + int skew = 0; + int word = 0; + + /* 1 2 3 */ + int u_last; + int u; + + int flip; + int bit; + secp256k1_scalar neg_s; + int not_neg_one; + /* Note that we cannot handle even numbers by negating them to be odd, as is + * done in other implementations, since if our scalars were specified to have + * width < 256 for performance reasons, their negations would have width 256 + * and we'd lose any performance benefit. Instead, we use a technique from + * Section 4.2 of the Okeya/Tagaki paper, which is to add either 1 (for even) + * or 2 (for odd) to the number we are encoding, returning a skew value indicating + * this, and having the caller compensate after doing the multiplication. + * + * In fact, we _do_ want to negate numbers to minimize their bit-lengths (and in + * particular, to ensure that the outputs from the endomorphism-split fit into + * 128 bits). If we negate, the parity of our number flips, inverting which of + * {1, 2} we want to add to the scalar when ensuring that it's odd. Further + * complicating things, -1 interacts badly with `secp256k1_scalar_cadd_bit` and + * we need to special-case it in this logic. */ + flip = secp256k1_scalar_is_high(&s); + /* We add 1 to even numbers, 2 to odd ones, noting that negation flips parity */ + bit = flip ^ !secp256k1_scalar_is_even(&s); + /* We check for negative one, since adding 2 to it will cause an overflow */ + secp256k1_scalar_negate(&neg_s, &s); + not_neg_one = !secp256k1_scalar_is_one(&neg_s); + secp256k1_scalar_cadd_bit(&s, bit, not_neg_one); + /* If we had negative one, flip == 1, s.d[0] == 0, bit == 1, so caller expects + * that we added two to it and flipped it. In fact for -1 these operations are + * identical. We only flipped, but since skewing is required (in the sense that + * the skew must be 1 or 2, never zero) and flipping is not, we need to change + * our flags to claim that we only skewed. */ + global_sign = secp256k1_scalar_cond_negate(&s, flip); + global_sign *= not_neg_one * 2 - 1; + skew = 1 << bit; + + /* 4 */ + u_last = secp256k1_scalar_shr_int(&s, w); + while (word * w < size) { + int sign; + int even; + + /* 4.1 4.4 */ + u = secp256k1_scalar_shr_int(&s, w); + /* 4.2 */ + even = ((u & 1) == 0); + sign = 2 * (u_last > 0) - 1; + u += sign * even; + u_last -= sign * even * (1 << w); + + /* 4.3, adapted for global sign change */ + wnaf[word++] = u_last * global_sign; + + u_last = u; + } + wnaf[word] = u * global_sign; + + VERIFY_CHECK(secp256k1_scalar_is_zero(&s)); + VERIFY_CHECK(word == WNAF_SIZE_BITS(size, w)); + return skew; +} + +static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar, int size) { + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge tmpa; + secp256k1_fe Z; + + int skew_1; +#ifdef USE_ENDOMORPHISM + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)]; + int skew_lam; + secp256k1_scalar q_1, q_lam; +#endif + int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)]; + + int i; + secp256k1_scalar sc = *scalar; + + /* build wnaf representation for q. */ + int rsize = size; +#ifdef USE_ENDOMORPHISM + if (size > 128) { + rsize = 128; + /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */ + secp256k1_scalar_split_lambda(&q_1, &q_lam, &sc); + skew_1 = secp256k1_wnaf_const(wnaf_1, q_1, WINDOW_A - 1, 128); + skew_lam = secp256k1_wnaf_const(wnaf_lam, q_lam, WINDOW_A - 1, 128); + } else +#endif + { + skew_1 = secp256k1_wnaf_const(wnaf_1, sc, WINDOW_A - 1, size); +#ifdef USE_ENDOMORPHISM + skew_lam = 0; +#endif + } + + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + */ + secp256k1_gej_set_ge(r, a); + secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r); + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_fe_normalize_weak(&pre_a[i].y); + } +#ifdef USE_ENDOMORPHISM + if (size > 128) { + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]); + } + } +#endif + + /* first loop iteration (separated out so we can directly set r, rather + * than having it start at infinity, get doubled several times, then have + * its new value added to it) */ + i = wnaf_1[WNAF_SIZE_BITS(rsize, WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A); + secp256k1_gej_set_ge(r, &tmpa); +#ifdef USE_ENDOMORPHISM + if (size > 128) { + i = wnaf_lam[WNAF_SIZE_BITS(rsize, WINDOW_A - 1)]; + VERIFY_CHECK(i != 0); + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A); + secp256k1_gej_add_ge(r, r, &tmpa); + } +#endif + /* remaining loop iterations */ + for (i = WNAF_SIZE_BITS(rsize, WINDOW_A - 1) - 1; i >= 0; i--) { + int n; + int j; + for (j = 0; j < WINDOW_A - 1; ++j) { + secp256k1_gej_double_nonzero(r, r, NULL); + } + + n = wnaf_1[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); +#ifdef USE_ENDOMORPHISM + if (size > 128) { + n = wnaf_lam[i]; + ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A); + VERIFY_CHECK(n != 0); + secp256k1_gej_add_ge(r, r, &tmpa); + } +#endif + } + + secp256k1_fe_mul(&r->z, &r->z, &Z); + + { + /* Correct for wNAF skew */ + secp256k1_ge correction = *a; + secp256k1_ge_storage correction_1_stor; +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage correction_lam_stor; +#endif + secp256k1_ge_storage a2_stor; + secp256k1_gej tmpj; + secp256k1_gej_set_ge(&tmpj, &correction); + secp256k1_gej_double_var(&tmpj, &tmpj, NULL); + secp256k1_ge_set_gej(&correction, &tmpj); + secp256k1_ge_to_storage(&correction_1_stor, a); +#ifdef USE_ENDOMORPHISM + if (size > 128) { + secp256k1_ge_to_storage(&correction_lam_stor, a); + } +#endif + secp256k1_ge_to_storage(&a2_stor, &correction); + + /* For odd numbers this is 2a (so replace it), for even ones a (so no-op) */ + secp256k1_ge_storage_cmov(&correction_1_stor, &a2_stor, skew_1 == 2); +#ifdef USE_ENDOMORPHISM + if (size > 128) { + secp256k1_ge_storage_cmov(&correction_lam_stor, &a2_stor, skew_lam == 2); + } +#endif + + /* Apply the correction */ + secp256k1_ge_from_storage(&correction, &correction_1_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); + +#ifdef USE_ENDOMORPHISM + if (size > 128) { + secp256k1_ge_from_storage(&correction, &correction_lam_stor); + secp256k1_ge_neg(&correction, &correction); + secp256k1_ge_mul_lambda(&correction, &correction); + secp256k1_gej_add_ge(r, r, &correction); + } +#endif + } +} + +#endif /* SECP256K1_ECMULT_CONST_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen.h new file mode 100644 index 00000000..7564b701 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen.h @@ -0,0 +1,43 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_GEN_H +#define SECP256K1_ECMULT_GEN_H + +#include "scalar.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*G: + * To harden against timing attacks, use the following mechanism: + * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. + * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: + * * U_i = U * 2^i (for i=0..62) + * * U_i = U * (1-2^63) (for i=63) + * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. + * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is + * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). + * None of the resulting prec group elements have a known scalar, and neither do any of + * the intermediate sums while computing a*G. + */ + secp256k1_ge_storage (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar blind; + secp256k1_gej initial; +} secp256k1_ecmult_gen_context; + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context* ctx, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context* src, const secp256k1_callback* cb); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx); + +/** Multiply with the generator: R = a*G */ +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context* ctx, secp256k1_gej *r, const secp256k1_scalar *a); + +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32); + +#endif /* SECP256K1_ECMULT_GEN_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen_impl.h new file mode 100644 index 00000000..8ecc23f8 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_gen_impl.h @@ -0,0 +1,210 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_ECMULT_GEN_IMPL_H +#define SECP256K1_ECMULT_GEN_IMPL_H + +#include "scalar.h" +#include "group.h" +#include "ecmult_gen.h" +#include "hash_impl.h" +#ifdef USE_ECMULT_STATIC_PRECOMPUTATION +#include "../../secp256k1_ec_mult_static_context.h" +#endif +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context *ctx) { + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context *ctx, const secp256k1_callback* cb) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + secp256k1_ge prec[1024]; + secp256k1_gej gj; + secp256k1_gej nums_gej; + int i, j; +#endif + + if (ctx->prec != NULL) { + return; + } +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + ctx->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*ctx->prec)); + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ + { + static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; + secp256k1_fe nums_x; + secp256k1_ge nums_ge; + int r; + r = secp256k1_fe_set_b32(&nums_x, nums_b32); + (void)r; + VERIFY_CHECK(r); + r = secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0); + (void)r; + VERIFY_CHECK(r); + secp256k1_gej_set_ge(&nums_gej, &nums_ge); + /* Add G to make the bits in x uniformly distributed. */ + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g, NULL); + } + + /* compute prec. */ + { + secp256k1_gej precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej gbase; + secp256k1_gej numsbase; + gbase = gj; /* 16^j * G */ + numsbase = nums_gej; /* 2^j * nums. */ + for (j = 0; j < 64; j++) { + /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ + precj[j*16] = numsbase; + for (i = 1; i < 16; i++) { + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase, NULL); + } + /* Multiply gbase by 16. */ + for (i = 0; i < 4; i++) { + secp256k1_gej_double_var(&gbase, &gbase, NULL); + } + /* Multiply numbase by 2. */ + secp256k1_gej_double_var(&numsbase, &numsbase, NULL); + if (j == 62) { + /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ + secp256k1_gej_neg(&numsbase, &numsbase); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej, NULL); + } + } + secp256k1_ge_set_all_gej_var(prec, precj, 1024, cb); + } + for (j = 0; j < 64; j++) { + for (i = 0; i < 16; i++) { + secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); + } + } +#else + (void)cb; + ctx->prec = (secp256k1_ge_storage (*)[64][16])secp256k1_ecmult_static_context; +#endif + secp256k1_ecmult_gen_blind(ctx, NULL); +} + +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context* ctx) { + return ctx->prec != NULL; +} + +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context *dst, + const secp256k1_ecmult_gen_context *src, const secp256k1_callback* cb) { + if (src->prec == NULL) { + dst->prec = NULL; + } else { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + dst->prec = (secp256k1_ge_storage (*)[64][16])checked_malloc(cb, sizeof(*dst->prec)); + memcpy(dst->prec, src->prec, sizeof(*dst->prec)); +#else + (void)cb; + dst->prec = src->prec; +#endif + dst->initial = src->initial; + dst->blind = src->blind; + } +} + +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context *ctx) { +#ifndef USE_ECMULT_STATIC_PRECOMPUTATION + free(ctx->prec); +#endif + secp256k1_scalar_clear(&ctx->blind); + secp256k1_gej_clear(&ctx->initial); + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context *ctx, secp256k1_gej *r, const secp256k1_scalar *gn) { + secp256k1_ge add; + secp256k1_ge_storage adds; + secp256k1_scalar gnb; + int bits; + int i, j; + memset(&adds, 0, sizeof(adds)); + *r = ctx->initial; + /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */ + secp256k1_scalar_add(&gnb, gn, &ctx->blind); + add.infinity = 0; + for (j = 0; j < 64; j++) { + bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4); + for (i = 0; i < 16; i++) { + /** This uses a conditional move to avoid any secret data in array indexes. + * _Any_ use of secret indexes has been demonstrated to result in timing + * sidechannels, even when the cache-line access patterns are uniform. + * See also: + * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe + * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and + * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006, + * by Dag Arne Osvik, Adi Shamir, and Eran Tromer + * (http://www.tau.ac.il/~tromer/papers/cache.pdf) + */ + secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); + } + secp256k1_ge_from_storage(&add, &adds); + secp256k1_gej_add_ge(r, r, &add); + } + bits = 0; + secp256k1_ge_clear(&add); + secp256k1_scalar_clear(&gnb); +} + +/* Setup blinding values for secp256k1_ecmult_gen. */ +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context *ctx, const unsigned char *seed32) { + secp256k1_scalar b; + secp256k1_gej gb; + secp256k1_fe s; + unsigned char nonce32[32]; + secp256k1_rfc6979_hmac_sha256 rng; + int retry; + unsigned char keydata[64] = {0}; + if (seed32 == NULL) { + /* When seed is NULL, reset the initial point and blinding value. */ + secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); + secp256k1_gej_neg(&ctx->initial, &ctx->initial); + secp256k1_scalar_set_int(&ctx->blind, 1); + } + /* The prior blinding value (if not reset) is chained forward by including it in the hash. */ + secp256k1_scalar_get_b32(nonce32, &ctx->blind); + /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data, + * and guards against weak or adversarial seeds. This is a simpler and safer interface than + * asking the caller for blinding values directly and expecting them to retry on failure. + */ + memcpy(keydata, nonce32, 32); + if (seed32 != NULL) { + memcpy(keydata + 32, seed32, 32); + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, seed32 ? 64 : 32); + memset(keydata, 0, sizeof(keydata)); + /* Retry for out of range results to achieve uniformity. */ + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + retry = !secp256k1_fe_set_b32(&s, nonce32); + retry |= secp256k1_fe_is_zero(&s); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > Fp. */ + /* Randomize the projection to defend against multiplier sidechannels. */ + secp256k1_gej_rescale(&ctx->initial, &s); + secp256k1_fe_clear(&s); + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + secp256k1_scalar_set_b32(&b, nonce32, &retry); + /* A blinding value of 0 works, but would undermine the projection hardening. */ + retry |= secp256k1_scalar_is_zero(&b); + } while (retry); /* This branch true is cryptographically unreachable. Requires sha256_hmac output > order. */ + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + memset(nonce32, 0, 32); + secp256k1_ecmult_gen(ctx, &gb, &b); + secp256k1_scalar_negate(&b, &b); + ctx->blind = b; + ctx->initial = gb; + secp256k1_scalar_clear(&b); + secp256k1_gej_clear(&gb); +} + +#endif /* SECP256K1_ECMULT_GEN_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_impl.h new file mode 100644 index 00000000..d5fb6c5b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/ecmult_impl.h @@ -0,0 +1,1027 @@ +/***************************************************************************** + * Copyright (c) 2013, 2014, 2017 Pieter Wuille, Andrew Poelstra, Jonas Nick * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php. * + *****************************************************************************/ + +#ifndef SECP256K1_ECMULT_IMPL_H +#define SECP256K1_ECMULT_IMPL_H + +#include +#include + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" + +#if defined(EXHAUSTIVE_TEST_ORDER) +/* We need to lower these values for exhaustive tests because + * the tables cannot have infinities in them (this breaks the + * affine-isomorphism stuff which tracks z-ratios) */ +# if EXHAUSTIVE_TEST_ORDER > 128 +# define WINDOW_A 5 +# define WINDOW_G 8 +# elif EXHAUSTIVE_TEST_ORDER > 8 +# define WINDOW_A 4 +# define WINDOW_G 4 +# else +# define WINDOW_A 2 +# define WINDOW_G 2 +# endif +#else +/* optimal for 128-bit and 256-bit exponents. */ +#define WINDOW_A 5 +/** larger numbers may result in slightly better performance, at the cost of + exponentially larger precomputed tables. */ +#ifdef USE_ENDOMORPHISM +/** Two tables for window size 15: 1.375 MiB. */ +#define WINDOW_G 15 +#else +/** One table for window size 16: 1.375 MiB. */ +#define WINDOW_G 16 +#endif +#endif + +#ifdef USE_ENDOMORPHISM + #define WNAF_BITS 128 +#else + #define WNAF_BITS 256 +#endif +#define WNAF_SIZE_BITS(bits, w) (((bits) + (w) - 1) / (w)) +#define WNAF_SIZE(w) WNAF_SIZE_BITS(WNAF_BITS, w) + +/** The number of entries a table with precomputed multiples needs to have. */ +#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) + +/* The number of objects allocated on the scratch space for ecmult_multi algorithms */ +#define PIPPENGER_SCRATCH_OBJECTS 6 +#define STRAUSS_SCRATCH_OBJECTS 6 + +#define PIPPENGER_MAX_BUCKET_WINDOW 12 + +/* Minimum number of points for which pippenger_wnaf is faster than strauss wnaf */ +#ifdef USE_ENDOMORPHISM + #define ECMULT_PIPPENGER_THRESHOLD 88 +#else + #define ECMULT_PIPPENGER_THRESHOLD 160 +#endif + +#ifdef USE_ENDOMORPHISM + #define ECMULT_MAX_POINTS_PER_BATCH 5000000 +#else + #define ECMULT_MAX_POINTS_PER_BATCH 10000000 +#endif + +/** Fill a table 'prej' with precomputed odd multiples of a. Prej will contain + * the values [1*a,3*a,...,(2*n-1)*a], so it space for n values. zr[0] will + * contain prej[0].z / a.z. The other zr[i] values = prej[i].z / prej[i-1].z. + * Prej's Z values are undefined, except for the last value. + */ +static void secp256k1_ecmult_odd_multiples_table(int n, secp256k1_gej *prej, secp256k1_fe *zr, const secp256k1_gej *a) { + secp256k1_gej d; + secp256k1_ge a_ge, d_ge; + int i; + + VERIFY_CHECK(!a->infinity); + + secp256k1_gej_double_var(&d, a, NULL); + + /* + * Perform the additions on an isomorphism where 'd' is affine: drop the z coordinate + * of 'd', and scale the 1P starting value's x/y coordinates without changing its z. + */ + d_ge.x = d.x; + d_ge.y = d.y; + d_ge.infinity = 0; + + secp256k1_ge_set_gej_zinv(&a_ge, a, &d.z); + prej[0].x = a_ge.x; + prej[0].y = a_ge.y; + prej[0].z = a->z; + prej[0].infinity = 0; + + zr[0] = d.z; + for (i = 1; i < n; i++) { + secp256k1_gej_add_ge_var(&prej[i], &prej[i-1], &d_ge, &zr[i]); + } + + /* + * Each point in 'prej' has a z coordinate too small by a factor of 'd.z'. Only + * the final point's z coordinate is actually used though, so just update that. + */ + secp256k1_fe_mul(&prej[n-1].z, &prej[n-1].z, &d.z); +} + +/** Fill a table 'pre' with precomputed odd multiples of a. + * + * There are two versions of this function: + * - secp256k1_ecmult_odd_multiples_table_globalz_windowa which brings its + * resulting point set to a single constant Z denominator, stores the X and Y + * coordinates as ge_storage points in pre, and stores the global Z in rz. + * It only operates on tables sized for WINDOW_A wnaf multiples. + * - secp256k1_ecmult_odd_multiples_table_storage_var, which converts its + * resulting point set to actually affine points, and stores those in pre. + * It operates on tables of any size, but uses heap-allocated temporaries. + * + * To compute a*P + b*G, we compute a table for P using the first function, + * and for G using the second (which requires an inverse, but it only needs to + * happen once). + */ +static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) { + secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), prej, zr, a); + /* Bring them to the same Z denominator. */ + secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A), pre, globalz, prej, zr); +} + +static void secp256k1_ecmult_odd_multiples_table_storage_var(int n, secp256k1_ge_storage *pre, const secp256k1_gej *a, const secp256k1_callback *cb) { + secp256k1_gej *prej = (secp256k1_gej*)checked_malloc(cb, sizeof(secp256k1_gej) * n); + secp256k1_ge *prea = (secp256k1_ge*)checked_malloc(cb, sizeof(secp256k1_ge) * n); + secp256k1_fe *zr = (secp256k1_fe*)checked_malloc(cb, sizeof(secp256k1_fe) * n); + int i; + + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(n, prej, zr, a); + /* Convert them in batch to affine coordinates. */ + secp256k1_ge_set_table_gej_var(prea, prej, zr, n); + /* Convert them to compact storage form. */ + for (i = 0; i < n; i++) { + secp256k1_ge_to_storage(&pre[i], &prea[i]); + } + + free(prea); + free(prej); + free(zr); +} + +/** The following two macro retrieves a particular odd multiple from a table + * of precomputed multiples. */ +#define ECMULT_TABLE_GET_GE(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + *(r) = (pre)[((n)-1)/2]; \ + } else { \ + secp256k1_ge_neg((r), &(pre)[(-(n)-1)/2]); \ + } \ +} while(0) + +#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \ + } else { \ + secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \ + secp256k1_ge_neg((r), (r)); \ + } \ +} while(0) + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context *ctx) { + ctx->pre_g = NULL; +#ifdef USE_ENDOMORPHISM + ctx->pre_g_128 = NULL; +#endif +} + +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context *ctx, const secp256k1_callback *cb) { + secp256k1_gej gj; + + if (ctx->pre_g != NULL) { + return; + } + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + ctx->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* precompute the tables with odd multiples */ + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g, &gj, cb); + +#ifdef USE_ENDOMORPHISM + { + secp256k1_gej g_128j; + int i; + + ctx->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* calculate 2^128*generator */ + g_128j = gj; + for (i = 0; i < 128; i++) { + secp256k1_gej_double_var(&g_128j, &g_128j, NULL); + } + secp256k1_ecmult_odd_multiples_table_storage_var(ECMULT_TABLE_SIZE(WINDOW_G), *ctx->pre_g_128, &g_128j, cb); + } +#endif +} + +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context *dst, + const secp256k1_ecmult_context *src, const secp256k1_callback *cb) { + if (src->pre_g == NULL) { + dst->pre_g = NULL; + } else { + size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); + memcpy(dst->pre_g, src->pre_g, size); + } +#ifdef USE_ENDOMORPHISM + if (src->pre_g_128 == NULL) { + dst->pre_g_128 = NULL; + } else { + size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g_128 = (secp256k1_ge_storage (*)[])checked_malloc(cb, size); + memcpy(dst->pre_g_128, src->pre_g_128, size); + } +#endif +} + +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context *ctx) { + return ctx->pre_g != NULL; +} + +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context *ctx) { + free(ctx->pre_g); +#ifdef USE_ENDOMORPHISM + free(ctx->pre_g_128); +#endif + secp256k1_ecmult_context_init(ctx); +} + +/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), + * with the following guarantees: + * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) + * - two non-zero entries in wnaf are separated by at least w-1 zeroes. + * - the number of set values in wnaf is returned. This number is at most 256, and at most one more + * than the number of bits in the (absolute value) of the input. + */ +static int secp256k1_ecmult_wnaf(int *wnaf, int len, const secp256k1_scalar *a, int w) { + secp256k1_scalar s = *a; + int last_set_bit = -1; + int bit = 0; + int sign = 1; + int carry = 0; + + VERIFY_CHECK(wnaf != NULL); + VERIFY_CHECK(0 <= len && len <= 256); + VERIFY_CHECK(a != NULL); + VERIFY_CHECK(2 <= w && w <= 31); + + memset(wnaf, 0, len * sizeof(wnaf[0])); + + if (secp256k1_scalar_get_bits(&s, 255, 1)) { + secp256k1_scalar_negate(&s, &s); + sign = -1; + } + + while (bit < len) { + int now; + int word; + if (secp256k1_scalar_get_bits(&s, bit, 1) == (unsigned int)carry) { + bit++; + continue; + } + + now = w; + if (now > len - bit) { + now = len - bit; + } + + word = secp256k1_scalar_get_bits_var(&s, bit, now) + carry; + + carry = (word >> (w-1)) & 1; + word -= carry << w; + + wnaf[bit] = sign * word; + last_set_bit = bit; + + bit += now; + } +#ifdef VERIFY + CHECK(carry == 0); + while (bit < 256) { + CHECK(secp256k1_scalar_get_bits(&s, bit++, 1) == 0); + } +#endif + return last_set_bit + 1; +} + +struct secp256k1_strauss_point_state { +#ifdef USE_ENDOMORPHISM + secp256k1_scalar na_1, na_lam; + int wnaf_na_1[130]; + int wnaf_na_lam[130]; + int bits_na_1; + int bits_na_lam; +#else + int wnaf_na[256]; + int bits_na; +#endif + size_t input_pos; +}; + +struct secp256k1_strauss_state { + secp256k1_gej* prej; + secp256k1_fe* zr; + secp256k1_ge* pre_a; +#ifdef USE_ENDOMORPHISM + secp256k1_ge* pre_a_lam; +#endif + struct secp256k1_strauss_point_state* ps; +}; + +static void secp256k1_ecmult_strauss_wnaf(const secp256k1_ecmult_context *ctx, const struct secp256k1_strauss_state *state, secp256k1_gej *r, int num, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { + secp256k1_ge tmpa; + secp256k1_fe Z; +#ifdef USE_ENDOMORPHISM + /* Splitted G factors. */ + secp256k1_scalar ng_1, ng_128; + int wnaf_ng_1[129]; + int bits_ng_1 = 0; + int wnaf_ng_128[129]; + int bits_ng_128 = 0; +#else + int wnaf_ng[256]; + int bits_ng = 0; +#endif + int i; + int bits = 0; + int np; + int no = 0; + + for (np = 0; np < num; ++np) { + if (secp256k1_scalar_is_zero(&na[np]) || secp256k1_gej_is_infinity(&a[np])) { + continue; + } + state->ps[no].input_pos = np; +#ifdef USE_ENDOMORPHISM + /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ + secp256k1_scalar_split_lambda(&state->ps[no].na_1, &state->ps[no].na_lam, &na[np]); + + /* build wnaf representation for na_1 and na_lam. */ + state->ps[no].bits_na_1 = secp256k1_ecmult_wnaf(state->ps[no].wnaf_na_1, 130, &state->ps[no].na_1, WINDOW_A); + state->ps[no].bits_na_lam = secp256k1_ecmult_wnaf(state->ps[no].wnaf_na_lam, 130, &state->ps[no].na_lam, WINDOW_A); + VERIFY_CHECK(state->ps[no].bits_na_1 <= 130); + VERIFY_CHECK(state->ps[no].bits_na_lam <= 130); + if (state->ps[no].bits_na_1 > bits) { + bits = state->ps[no].bits_na_1; + } + if (state->ps[no].bits_na_lam > bits) { + bits = state->ps[no].bits_na_lam; + } +#else + /* build wnaf representation for na. */ + state->ps[no].bits_na = secp256k1_ecmult_wnaf(state->ps[no].wnaf_na, 256, &na[np], WINDOW_A); + if (state->ps[no].bits_na > bits) { + bits = state->ps[no].bits_na; + } +#endif + ++no; + } + + /* Calculate odd multiples of a. + * All multiples are brought to the same Z 'denominator', which is stored + * in Z. Due to secp256k1' isomorphism we can do all operations pretending + * that the Z coordinate was 1, use affine addition formulae, and correct + * the Z coordinate of the result once at the end. + * The exception is the precomputed G table points, which are actually + * affine. Compared to the base used for other points, they have a Z ratio + * of 1/Z, so we can use secp256k1_gej_add_zinv_var, which uses the same + * isomorphism to efficiently add with a known Z inverse. + */ + if (no > 0) { + /* Compute the odd multiples in Jacobian form. */ + secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), state->prej, state->zr, &a[state->ps[0].input_pos]); + for (np = 1; np < no; ++np) { + secp256k1_gej tmp = a[state->ps[np].input_pos]; +#ifdef VERIFY + secp256k1_fe_normalize_var(&(state->prej[(np - 1) * ECMULT_TABLE_SIZE(WINDOW_A) + ECMULT_TABLE_SIZE(WINDOW_A) - 1].z)); +#endif + secp256k1_gej_rescale(&tmp, &(state->prej[(np - 1) * ECMULT_TABLE_SIZE(WINDOW_A) + ECMULT_TABLE_SIZE(WINDOW_A) - 1].z)); + secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), state->prej + np * ECMULT_TABLE_SIZE(WINDOW_A), state->zr + np * ECMULT_TABLE_SIZE(WINDOW_A), &tmp); + secp256k1_fe_mul(state->zr + np * ECMULT_TABLE_SIZE(WINDOW_A), state->zr + np * ECMULT_TABLE_SIZE(WINDOW_A), &(a[state->ps[np].input_pos].z)); + } + /* Bring them to the same Z denominator. */ + secp256k1_ge_globalz_set_table_gej(ECMULT_TABLE_SIZE(WINDOW_A) * no, state->pre_a, &Z, state->prej, state->zr); + } else { + secp256k1_fe_set_int(&Z, 1); + } + +#ifdef USE_ENDOMORPHISM + for (np = 0; np < no; ++np) { + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_ge_mul_lambda(&state->pre_a_lam[np * ECMULT_TABLE_SIZE(WINDOW_A) + i], &state->pre_a[np * ECMULT_TABLE_SIZE(WINDOW_A) + i]); + } + } + + if (ng) { + /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ + secp256k1_scalar_split_128(&ng_1, &ng_128, ng); + + /* Build wnaf representation for ng_1 and ng_128 */ + bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, 129, &ng_1, WINDOW_G); + bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, 129, &ng_128, WINDOW_G); + if (bits_ng_1 > bits) { + bits = bits_ng_1; + } + if (bits_ng_128 > bits) { + bits = bits_ng_128; + } + } +#else + if (ng) { + bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, 256, ng, WINDOW_G); + if (bits_ng > bits) { + bits = bits_ng; + } + } +#endif + + secp256k1_gej_set_infinity(r); + + for (i = bits - 1; i >= 0; i--) { + int n; + secp256k1_gej_double_var(r, r, NULL); +#ifdef USE_ENDOMORPHISM + for (np = 0; np < no; ++np) { + if (i < state->ps[np].bits_na_1 && (n = state->ps[np].wnaf_na_1[i])) { + ECMULT_TABLE_GET_GE(&tmpa, state->pre_a + np * ECMULT_TABLE_SIZE(WINDOW_A), n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); + } + if (i < state->ps[np].bits_na_lam && (n = state->ps[np].wnaf_na_lam[i])) { + ECMULT_TABLE_GET_GE(&tmpa, state->pre_a_lam + np * ECMULT_TABLE_SIZE(WINDOW_A), n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); + } + } + if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); + } + if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); + } +#else + for (np = 0; np < no; ++np) { + if (i < state->ps[np].bits_na && (n = state->ps[np].wnaf_na[i])) { + ECMULT_TABLE_GET_GE(&tmpa, state->pre_a + np * ECMULT_TABLE_SIZE(WINDOW_A), n, WINDOW_A); + secp256k1_gej_add_ge_var(r, r, &tmpa, NULL); + } + } + if (i < bits_ng && (n = wnaf_ng[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_zinv_var(r, r, &tmpa, &Z); + } +#endif + } + + if (!r->infinity) { + secp256k1_fe_mul(&r->z, &r->z, &Z); + } +} + +static void secp256k1_ecmult(const secp256k1_ecmult_context *ctx, secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_scalar *na, const secp256k1_scalar *ng) { + secp256k1_gej prej[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + struct secp256k1_strauss_point_state ps[1]; +#ifdef USE_ENDOMORPHISM + secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; +#endif + struct secp256k1_strauss_state state; + + state.prej = prej; + state.zr = zr; + state.pre_a = pre_a; +#ifdef USE_ENDOMORPHISM + state.pre_a_lam = pre_a_lam; +#endif + state.ps = ps; + secp256k1_ecmult_strauss_wnaf(ctx, &state, r, 1, a, na, ng); +} + +static size_t secp256k1_strauss_scratch_size(size_t n_points) { +#ifdef USE_ENDOMORPHISM + static const size_t point_size = (2 * sizeof(secp256k1_ge) + sizeof(secp256k1_gej) + sizeof(secp256k1_fe)) * ECMULT_TABLE_SIZE(WINDOW_A) + sizeof(struct secp256k1_strauss_point_state) + sizeof(secp256k1_gej) + sizeof(secp256k1_scalar); +#else + static const size_t point_size = (sizeof(secp256k1_ge) + sizeof(secp256k1_gej) + sizeof(secp256k1_fe)) * ECMULT_TABLE_SIZE(WINDOW_A) + sizeof(struct secp256k1_strauss_point_state) + sizeof(secp256k1_gej) + sizeof(secp256k1_scalar); +#endif + return n_points*point_size; +} + +static int secp256k1_ecmult_strauss_batch(const secp256k1_ecmult_context *ctx, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n_points, size_t cb_offset) { + secp256k1_gej* points; + secp256k1_scalar* scalars; + struct secp256k1_strauss_state state; + size_t i; + + secp256k1_gej_set_infinity(r); + if (inp_g_sc == NULL && n_points == 0) { + return 1; + } + + if (!secp256k1_scratch_allocate_frame(scratch, secp256k1_strauss_scratch_size(n_points), STRAUSS_SCRATCH_OBJECTS)) { + return 0; + } + points = (secp256k1_gej*)secp256k1_scratch_alloc(scratch, n_points * sizeof(secp256k1_gej)); + scalars = (secp256k1_scalar*)secp256k1_scratch_alloc(scratch, n_points * sizeof(secp256k1_scalar)); + state.prej = (secp256k1_gej*)secp256k1_scratch_alloc(scratch, n_points * ECMULT_TABLE_SIZE(WINDOW_A) * sizeof(secp256k1_gej)); + state.zr = (secp256k1_fe*)secp256k1_scratch_alloc(scratch, n_points * ECMULT_TABLE_SIZE(WINDOW_A) * sizeof(secp256k1_fe)); +#ifdef USE_ENDOMORPHISM + state.pre_a = (secp256k1_ge*)secp256k1_scratch_alloc(scratch, n_points * 2 * ECMULT_TABLE_SIZE(WINDOW_A) * sizeof(secp256k1_ge)); + state.pre_a_lam = state.pre_a + n_points * ECMULT_TABLE_SIZE(WINDOW_A); +#else + state.pre_a = (secp256k1_ge*)secp256k1_scratch_alloc(scratch, n_points * ECMULT_TABLE_SIZE(WINDOW_A) * sizeof(secp256k1_ge)); +#endif + state.ps = (struct secp256k1_strauss_point_state*)secp256k1_scratch_alloc(scratch, n_points * sizeof(struct secp256k1_strauss_point_state)); + + for (i = 0; i < n_points; i++) { + secp256k1_ge point; + if (!cb(&scalars[i], &point, i+cb_offset, cbdata)) { + secp256k1_scratch_deallocate_frame(scratch); + return 0; + } + secp256k1_gej_set_ge(&points[i], &point); + } + secp256k1_ecmult_strauss_wnaf(ctx, &state, r, n_points, points, scalars, inp_g_sc); + secp256k1_scratch_deallocate_frame(scratch); + return 1; +} + +/* Wrapper for secp256k1_ecmult_multi_func interface */ +static int secp256k1_ecmult_strauss_batch_single(const secp256k1_ecmult_context *actx, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n) { + return secp256k1_ecmult_strauss_batch(actx, scratch, r, inp_g_sc, cb, cbdata, n, 0); +} + +static size_t secp256k1_strauss_max_points(secp256k1_scratch *scratch) { + return secp256k1_scratch_max_allocation(scratch, STRAUSS_SCRATCH_OBJECTS) / secp256k1_strauss_scratch_size(1); +} + +/** Convert a number to WNAF notation. + * The number becomes represented by sum(2^{wi} * wnaf[i], i=0..WNAF_SIZE(w)+1) - return_val. + * It has the following guarantees: + * - each wnaf[i] is either 0 or an odd integer between -(1 << w) and (1 << w) + * - the number of words set is always WNAF_SIZE(w) + * - the returned skew is 0 or 1 + */ +static int secp256k1_wnaf_fixed(int *wnaf, const secp256k1_scalar *s, int w) { + int skew = 0; + int pos; + int max_pos; + int last_w; + const secp256k1_scalar *work = s; + + if (secp256k1_scalar_is_zero(s)) { + for (pos = 0; pos < WNAF_SIZE(w); pos++) { + wnaf[pos] = 0; + } + return 0; + } + + if (secp256k1_scalar_is_even(s)) { + skew = 1; + } + + wnaf[0] = secp256k1_scalar_get_bits_var(work, 0, w) + skew; + /* Compute last window size. Relevant when window size doesn't divide the + * number of bits in the scalar */ + last_w = WNAF_BITS - (WNAF_SIZE(w) - 1) * w; + + /* Store the position of the first nonzero word in max_pos to allow + * skipping leading zeros when calculating the wnaf. */ + for (pos = WNAF_SIZE(w) - 1; pos > 0; pos--) { + int val = secp256k1_scalar_get_bits_var(work, pos * w, pos == WNAF_SIZE(w)-1 ? last_w : w); + if(val != 0) { + break; + } + wnaf[pos] = 0; + } + max_pos = pos; + pos = 1; + + while (pos <= max_pos) { + int val = secp256k1_scalar_get_bits_var(work, pos * w, pos == WNAF_SIZE(w)-1 ? last_w : w); + if ((val & 1) == 0) { + wnaf[pos - 1] -= (1 << w); + wnaf[pos] = (val + 1); + } else { + wnaf[pos] = val; + } + /* Set a coefficient to zero if it is 1 or -1 and the proceeding digit + * is strictly negative or strictly positive respectively. Only change + * coefficients at previous positions because above code assumes that + * wnaf[pos - 1] is odd. + */ + if (pos >= 2 && ((wnaf[pos - 1] == 1 && wnaf[pos - 2] < 0) || (wnaf[pos - 1] == -1 && wnaf[pos - 2] > 0))) { + if (wnaf[pos - 1] == 1) { + wnaf[pos - 2] += 1 << w; + } else { + wnaf[pos - 2] -= 1 << w; + } + wnaf[pos - 1] = 0; + } + ++pos; + } + + return skew; +} + +struct secp256k1_pippenger_point_state { + int skew_na; + size_t input_pos; +}; + +struct secp256k1_pippenger_state { + int *wnaf_na; + struct secp256k1_pippenger_point_state* ps; +}; + +/* + * pippenger_wnaf computes the result of a multi-point multiplication as + * follows: The scalars are brought into wnaf with n_wnaf elements each. Then + * for every i < n_wnaf, first each point is added to a "bucket" corresponding + * to the point's wnaf[i]. Second, the buckets are added together such that + * r += 1*bucket[0] + 3*bucket[1] + 5*bucket[2] + ... + */ +static int secp256k1_ecmult_pippenger_wnaf(secp256k1_gej *buckets, int bucket_window, struct secp256k1_pippenger_state *state, secp256k1_gej *r, const secp256k1_scalar *sc, const secp256k1_ge *pt, size_t num) { + size_t n_wnaf = WNAF_SIZE(bucket_window+1); + size_t np; + size_t no = 0; + int i; + int j; + + for (np = 0; np < num; ++np) { + if (secp256k1_scalar_is_zero(&sc[np]) || secp256k1_ge_is_infinity(&pt[np])) { + continue; + } + state->ps[no].input_pos = np; + state->ps[no].skew_na = secp256k1_wnaf_fixed(&state->wnaf_na[no*n_wnaf], &sc[np], bucket_window+1); + no++; + } + secp256k1_gej_set_infinity(r); + + if (no == 0) { + return 1; + } + + for (i = n_wnaf - 1; i >= 0; i--) { + secp256k1_gej running_sum; + + for(j = 0; j < ECMULT_TABLE_SIZE(bucket_window+2); j++) { + secp256k1_gej_set_infinity(&buckets[j]); + } + + for (np = 0; np < no; ++np) { + int n = state->wnaf_na[np*n_wnaf + i]; + struct secp256k1_pippenger_point_state point_state = state->ps[np]; + secp256k1_ge tmp; + int idx; + + if (i == 0) { + /* correct for wnaf skew */ + int skew = point_state.skew_na; + if (skew) { + secp256k1_ge_neg(&tmp, &pt[point_state.input_pos]); + secp256k1_gej_add_ge_var(&buckets[0], &buckets[0], &tmp, NULL); + } + } + if (n > 0) { + idx = (n - 1)/2; + secp256k1_gej_add_ge_var(&buckets[idx], &buckets[idx], &pt[point_state.input_pos], NULL); + } else if (n < 0) { + idx = -(n + 1)/2; + secp256k1_ge_neg(&tmp, &pt[point_state.input_pos]); + secp256k1_gej_add_ge_var(&buckets[idx], &buckets[idx], &tmp, NULL); + } + } + + for(j = 0; j < bucket_window; j++) { + secp256k1_gej_double_var(r, r, NULL); + } + + secp256k1_gej_set_infinity(&running_sum); + /* Accumulate the sum: bucket[0] + 3*bucket[1] + 5*bucket[2] + 7*bucket[3] + ... + * = bucket[0] + bucket[1] + bucket[2] + bucket[3] + ... + * + 2 * (bucket[1] + 2*bucket[2] + 3*bucket[3] + ...) + * using an intermediate running sum: + * running_sum = bucket[0] + bucket[1] + bucket[2] + ... + * + * The doubling is done implicitly by deferring the final window doubling (of 'r'). + */ + for(j = ECMULT_TABLE_SIZE(bucket_window+2) - 1; j > 0; j--) { + secp256k1_gej_add_var(&running_sum, &running_sum, &buckets[j], NULL); + secp256k1_gej_add_var(r, r, &running_sum, NULL); + } + + secp256k1_gej_add_var(&running_sum, &running_sum, &buckets[0], NULL); + secp256k1_gej_double_var(r, r, NULL); + secp256k1_gej_add_var(r, r, &running_sum, NULL); + } + return 1; +} + +/** + * Returns optimal bucket_window (number of bits of a scalar represented by a + * set of buckets) for a given number of points. + */ +static int secp256k1_pippenger_bucket_window(size_t n) { +#ifdef USE_ENDOMORPHISM + if (n <= 1) { + return 1; + } else if (n <= 4) { + return 2; + } else if (n <= 20) { + return 3; + } else if (n <= 57) { + return 4; + } else if (n <= 136) { + return 5; + } else if (n <= 235) { + return 6; + } else if (n <= 1260) { + return 7; + } else if (n <= 4420) { + return 9; + } else if (n <= 7880) { + return 10; + } else if (n <= 16050) { + return 11; + } else { + return PIPPENGER_MAX_BUCKET_WINDOW; + } +#else + if (n <= 1) { + return 1; + } else if (n <= 11) { + return 2; + } else if (n <= 45) { + return 3; + } else if (n <= 100) { + return 4; + } else if (n <= 275) { + return 5; + } else if (n <= 625) { + return 6; + } else if (n <= 1850) { + return 7; + } else if (n <= 3400) { + return 8; + } else if (n <= 9630) { + return 9; + } else if (n <= 17900) { + return 10; + } else if (n <= 32800) { + return 11; + } else { + return PIPPENGER_MAX_BUCKET_WINDOW; + } +#endif +} + +/** + * Returns the maximum optimal number of points for a bucket_window. + */ +static size_t secp256k1_pippenger_bucket_window_inv(int bucket_window) { + switch(bucket_window) { +#ifdef USE_ENDOMORPHISM + case 1: return 1; + case 2: return 4; + case 3: return 20; + case 4: return 57; + case 5: return 136; + case 6: return 235; + case 7: return 1260; + case 8: return 1260; + case 9: return 4420; + case 10: return 7880; + case 11: return 16050; + case PIPPENGER_MAX_BUCKET_WINDOW: return SIZE_MAX; +#else + case 1: return 1; + case 2: return 11; + case 3: return 45; + case 4: return 100; + case 5: return 275; + case 6: return 625; + case 7: return 1850; + case 8: return 3400; + case 9: return 9630; + case 10: return 17900; + case 11: return 32800; + case PIPPENGER_MAX_BUCKET_WINDOW: return SIZE_MAX; +#endif + } + return 0; +} + + +#ifdef USE_ENDOMORPHISM +SECP256K1_INLINE static void secp256k1_ecmult_endo_split(secp256k1_scalar *s1, secp256k1_scalar *s2, secp256k1_ge *p1, secp256k1_ge *p2) { + secp256k1_scalar tmp = *s1; + secp256k1_scalar_split_lambda(s1, s2, &tmp); + secp256k1_ge_mul_lambda(p2, p1); + + if (secp256k1_scalar_is_high(s1)) { + secp256k1_scalar_negate(s1, s1); + secp256k1_ge_neg(p1, p1); + } + if (secp256k1_scalar_is_high(s2)) { + secp256k1_scalar_negate(s2, s2); + secp256k1_ge_neg(p2, p2); + } +} +#endif + +/** + * Returns the scratch size required for a given number of points (excluding + * base point G) without considering alignment. + */ +static size_t secp256k1_pippenger_scratch_size(size_t n_points, int bucket_window) { +#ifdef USE_ENDOMORPHISM + size_t entries = 2*n_points + 2; +#else + size_t entries = n_points + 1; +#endif + size_t entry_size = sizeof(secp256k1_ge) + sizeof(secp256k1_scalar) + sizeof(struct secp256k1_pippenger_point_state) + (WNAF_SIZE(bucket_window+1)+1)*sizeof(int); + return ((1<ps = (struct secp256k1_pippenger_point_state *) secp256k1_scratch_alloc(scratch, entries * sizeof(*state_space->ps)); + state_space->wnaf_na = (int *) secp256k1_scratch_alloc(scratch, entries*(WNAF_SIZE(bucket_window+1)) * sizeof(int)); + buckets = (secp256k1_gej *) secp256k1_scratch_alloc(scratch, (1<ps[i].skew_na = 0; + for(j = 0; j < WNAF_SIZE(bucket_window+1); j++) { + state_space->wnaf_na[i * WNAF_SIZE(bucket_window+1) + j] = 0; + } + } + for(i = 0; i < 1< max_alloc) { + break; + } + space_for_points = max_alloc - space_overhead; + + n_points = space_for_points/entry_size; + n_points = n_points > max_points ? max_points : n_points; + if (n_points > res) { + res = n_points; + } + if (n_points < max_points) { + /* A larger bucket_window may support even more points. But if we + * would choose that then the caller couldn't safely use any number + * smaller than what this function returns */ + break; + } + } + return res; +} + +typedef int (*secp256k1_ecmult_multi_func)(const secp256k1_ecmult_context*, secp256k1_scratch*, secp256k1_gej*, const secp256k1_scalar*, secp256k1_ecmult_multi_callback cb, void*, size_t); +static int secp256k1_ecmult_multi_var(const secp256k1_ecmult_context *ctx, secp256k1_scratch *scratch, secp256k1_gej *r, const secp256k1_scalar *inp_g_sc, secp256k1_ecmult_multi_callback cb, void *cbdata, size_t n) { + size_t i; + + int (*f)(const secp256k1_ecmult_context*, secp256k1_scratch*, secp256k1_gej*, const secp256k1_scalar*, secp256k1_ecmult_multi_callback cb, void*, size_t, size_t); + size_t max_points; + size_t n_batches; + size_t n_batch_points; + + secp256k1_gej_set_infinity(r); + if (inp_g_sc == NULL && n == 0) { + return 1; + } else if (n == 0) { + secp256k1_scalar szero; + secp256k1_scalar_set_int(&szero, 0); + secp256k1_ecmult(ctx, r, r, &szero, inp_g_sc); + return 1; + } + + max_points = secp256k1_pippenger_max_points(scratch); + if (max_points == 0) { + return 0; + } else if (max_points > ECMULT_MAX_POINTS_PER_BATCH) { + max_points = ECMULT_MAX_POINTS_PER_BATCH; + } + n_batches = (n+max_points-1)/max_points; + n_batch_points = (n+n_batches-1)/n_batches; + + if (n_batch_points >= ECMULT_PIPPENGER_THRESHOLD) { + f = secp256k1_ecmult_pippenger_batch; + } else { + max_points = secp256k1_strauss_max_points(scratch); + if (max_points == 0) { + return 0; + } + n_batches = (n+max_points-1)/max_points; + n_batch_points = (n+n_batches-1)/n_batches; + f = secp256k1_ecmult_strauss_batch; + } + for(i = 0; i < n_batches; i++) { + size_t nbp = n < n_batch_points ? n : n_batch_points; + size_t offset = n_batch_points*i; + secp256k1_gej tmp; + if (!f(ctx, scratch, &tmp, i == 0 ? inp_g_sc : NULL, cb, cbdata, nbp, offset)) { + return 0; + } + secp256k1_gej_add_var(r, r, &tmp, NULL); + n -= nbp; + } + return 1; +} + +#endif /* SECP256K1_ECMULT_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field.h new file mode 100644 index 00000000..39126541 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field.h @@ -0,0 +1,130 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_H +#define SECP256K1_FIELD_H + +/** Field element module. + * + * Field elements can be represented in several ways, but code accessing + * it (and implementations) need to take certain properties into account: + * - Each field element can be normalized or not. + * - Each field element has a magnitude, which represents how far away + * its representation is away from normalization. Normalized elements + * always have a magnitude of 1, but a magnitude of 1 doesn't imply + * normality. + */ + +#include "../../secp256k1-config.h" + +#if defined(USE_FIELD_10X26) +#include "field_10x26.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52.h" +#else +#error "Please select field implementation" +#endif + +#include "util.h" + +/** Normalize a field element. */ +static void secp256k1_fe_normalize(secp256k1_fe *r); + +/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ +static void secp256k1_fe_normalize_weak(secp256k1_fe *r); + +/** Normalize a field element, without constant-time guarantee. */ +static void secp256k1_fe_normalize_var(secp256k1_fe *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r); + +/** Set a field element equal to a small integer. Resulting field element is normalized. */ +static void secp256k1_fe_set_int(secp256k1_fe *r, int a); + +/** Sets a field element equal to zero, initializing all fields. */ +static void secp256k1_fe_clear(secp256k1_fe *a); + +/** Verify whether a field element is zero. Requires the input to be normalized. */ +static int secp256k1_fe_is_zero(const secp256k1_fe *a); + +/** Check the "oddness" of a field element. Requires the input to be normalized. */ +static int secp256k1_fe_is_odd(const secp256k1_fe *a); + +/** Compare two field elements. Requires magnitude-1 inputs. */ +static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b); + +/** Same as secp256k1_fe_equal, but may be variable time. */ +static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b); + +/** Compare two field elements. Requires both inputs to be normalized */ +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b); + +/** Set a field element equal to 32-byte big endian value. If successful, the resulting field element is normalized. */ +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a); + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a); + +/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input + * as an argument. The magnitude of the output is one higher. */ +static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m); + +/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that + * small integer. */ +static void secp256k1_fe_mul_int(secp256k1_fe *r, int a); + +/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ +static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a); + +/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b); + +/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a); + +/** If a has a square root, it is computed in r and 1 is returned. If a does not + * have a square root, the root of its negation is computed and 0 is returned. + * The input's magnitude can be at most 8. The output magnitude is 1 (but not + * guaranteed to be normalized). The result in r will always be a square + * itself. */ +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a); + +/** Checks whether a field element is a quadratic residue. */ +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a); + +/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be + * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a); + +/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a); + +/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be + * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and + * outputs must not overlap in memory. */ +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len); + +/** Convert a field element to the storage type. */ +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a); + +/** Convert a field element back from the storage type. */ +static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag); + +#endif /* SECP256K1_FIELD_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26.h new file mode 100644 index 00000000..727c5267 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26.h @@ -0,0 +1,48 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H + +#include + +typedef struct { + /* X = sum(i=0..9, elem[i]*2^26) mod n */ + uint32_t n[10]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) & 0x3FFFFFFUL, \ + (((uint32_t)d0) >> 26) | (((uint32_t)(d1) & 0xFFFFFUL) << 6), \ + (((uint32_t)d1) >> 20) | (((uint32_t)(d2) & 0x3FFFUL) << 12), \ + (((uint32_t)d2) >> 14) | (((uint32_t)(d3) & 0xFFUL) << 18), \ + (((uint32_t)d3) >> 8) | (((uint32_t)(d4) & 0x3UL) << 24), \ + (((uint32_t)d4) >> 2) & 0x3FFFFFFUL, \ + (((uint32_t)d4) >> 28) | (((uint32_t)(d5) & 0x3FFFFFUL) << 4), \ + (((uint32_t)d5) >> 22) | (((uint32_t)(d6) & 0xFFFFUL) << 10), \ + (((uint32_t)d6) >> 16) | (((uint32_t)(d7) & 0x3FFUL) << 16), \ + (((uint32_t)d7) >> 10) \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint32_t n[8]; +} secp256k1_fe_storage; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} +#define SECP256K1_FE_STORAGE_CONST_GET(d) d.n[7], d.n[6], d.n[5], d.n[4],d.n[3], d.n[2], d.n[1], d.n[0] + +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26_impl.h new file mode 100644 index 00000000..94f8132f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_10x26_impl.h @@ -0,0 +1,1161 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H + +#include "util.h" +#include "num.h" +#include "field.h" + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe *a) { + const uint32_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + r &= (d[0] <= 0x3FFFFFFUL * m); + r &= (d[1] <= 0x3FFFFFFUL * m); + r &= (d[2] <= 0x3FFFFFFUL * m); + r &= (d[3] <= 0x3FFFFFFUL * m); + r &= (d[4] <= 0x3FFFFFFUL * m); + r &= (d[5] <= 0x3FFFFFFUL * m); + r &= (d[6] <= 0x3FFFFFFUL * m); + r &= (d[7] <= 0x3FFFFFFUL * m); + r &= (d[8] <= 0x3FFFFFFUL * m); + r &= (d[9] <= 0x03FFFFFUL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 32); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[9] == 0x03FFFFFUL)) { + uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; + if (mid == 0x3FFFFFFUL) { + r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); + } + } + } + VERIFY_CHECK(r == 1); +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + if (x) { + t0 += 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint32_t z0, z1; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0 = t0; z1 = t0 ^ 0x3D0UL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; + uint32_t z0, z1; + uint32_t x; + + t0 = r->n[0]; + t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + x = t9 >> 22; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0x3FFFFFFUL; + z1 = z0 ^ 0x3D0UL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + t4 = r->n[4]; + t5 = r->n[5]; + t6 = r->n[6]; + t7 = r->n[7]; + t8 = r->n[8]; + + t9 &= 0x03FFFFFUL; + t1 += (x << 6); + + t1 += (t0 >> 26); + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { + const uint32_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<10; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 9; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint32_t)a[31] | ((uint32_t)a[30] << 8) | ((uint32_t)a[29] << 16) | ((uint32_t)(a[28] & 0x3) << 24); + r->n[1] = (uint32_t)((a[28] >> 2) & 0x3f) | ((uint32_t)a[27] << 6) | ((uint32_t)a[26] << 14) | ((uint32_t)(a[25] & 0xf) << 22); + r->n[2] = (uint32_t)((a[25] >> 4) & 0xf) | ((uint32_t)a[24] << 4) | ((uint32_t)a[23] << 12) | ((uint32_t)(a[22] & 0x3f) << 20); + r->n[3] = (uint32_t)((a[22] >> 6) & 0x3) | ((uint32_t)a[21] << 2) | ((uint32_t)a[20] << 10) | ((uint32_t)a[19] << 18); + r->n[4] = (uint32_t)a[18] | ((uint32_t)a[17] << 8) | ((uint32_t)a[16] << 16) | ((uint32_t)(a[15] & 0x3) << 24); + r->n[5] = (uint32_t)((a[15] >> 2) & 0x3f) | ((uint32_t)a[14] << 6) | ((uint32_t)a[13] << 14) | ((uint32_t)(a[12] & 0xf) << 22); + r->n[6] = (uint32_t)((a[12] >> 4) & 0xf) | ((uint32_t)a[11] << 4) | ((uint32_t)a[10] << 12) | ((uint32_t)(a[9] & 0x3f) << 20); + r->n[7] = (uint32_t)((a[9] >> 6) & 0x3) | ((uint32_t)a[8] << 2) | ((uint32_t)a[7] << 10) | ((uint32_t)a[6] << 18); + r->n[8] = (uint32_t)a[5] | ((uint32_t)a[4] << 8) | ((uint32_t)a[3] << 16) | ((uint32_t)(a[2] & 0x3) << 24); + r->n[9] = (uint32_t)((a[2] >> 2) & 0x3f) | ((uint32_t)a[1] << 6) | ((uint32_t)a[0] << 14); + + if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + r[0] = (a->n[9] >> 14) & 0xff; + r[1] = (a->n[9] >> 6) & 0xff; + r[2] = ((a->n[9] & 0x3F) << 2) | ((a->n[8] >> 24) & 0x3); + r[3] = (a->n[8] >> 16) & 0xff; + r[4] = (a->n[8] >> 8) & 0xff; + r[5] = a->n[8] & 0xff; + r[6] = (a->n[7] >> 18) & 0xff; + r[7] = (a->n[7] >> 10) & 0xff; + r[8] = (a->n[7] >> 2) & 0xff; + r[9] = ((a->n[7] & 0x3) << 6) | ((a->n[6] >> 20) & 0x3f); + r[10] = (a->n[6] >> 12) & 0xff; + r[11] = (a->n[6] >> 4) & 0xff; + r[12] = ((a->n[6] & 0xf) << 4) | ((a->n[5] >> 22) & 0xf); + r[13] = (a->n[5] >> 14) & 0xff; + r[14] = (a->n[5] >> 6) & 0xff; + r[15] = ((a->n[5] & 0x3f) << 2) | ((a->n[4] >> 24) & 0x3); + r[16] = (a->n[4] >> 16) & 0xff; + r[17] = (a->n[4] >> 8) & 0xff; + r[18] = a->n[4] & 0xff; + r[19] = (a->n[3] >> 18) & 0xff; + r[20] = (a->n[3] >> 10) & 0xff; + r[21] = (a->n[3] >> 2) & 0xff; + r[22] = ((a->n[3] & 0x3) << 6) | ((a->n[2] >> 20) & 0x3f); + r[23] = (a->n[2] >> 12) & 0xff; + r[24] = (a->n[2] >> 4) & 0xff; + r[25] = ((a->n[2] & 0xf) << 4) | ((a->n[1] >> 22) & 0xf); + r[26] = (a->n[1] >> 14) & 0xff; + r[27] = (a->n[1] >> 6) & 0xff; + r[28] = ((a->n[1] & 0x3f) << 2) | ((a->n[0] >> 24) & 0x3); + r[29] = (a->n[0] >> 16) & 0xff; + r[30] = (a->n[0] >> 8) & 0xff; + r[31] = a->n[0] & 0xff; +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; + r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; + r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; + r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; + r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; + r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; + r->n[5] *= a; + r->n[6] *= a; + r->n[7] *= a; + r->n[8] *= a; + r->n[9] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; + r->n[5] += a->n[5]; + r->n[6] += a->n[6]; + r->n[7] += a->n[7]; + r->n[8] += a->n[8]; + r->n[9] += a->n[9]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#if defined(USE_EXTERNAL_ASM) + +/* External assembler implementation */ +void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b); +void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a); + +#else + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + VERIFY_BITS(b[0], 30); + VERIFY_BITS(b[1], 30); + VERIFY_BITS(b[2], 30); + VERIFY_BITS(b[3], 30); + VERIFY_BITS(b[4], 30); + VERIFY_BITS(b[5], 30); + VERIFY_BITS(b[6], 30); + VERIFY_BITS(b[7], 30); + VERIFY_BITS(b[8], 30); + VERIFY_BITS(b[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)a[0] * b[9] + + (uint64_t)a[1] * b[8] + + (uint64_t)a[2] * b[7] + + (uint64_t)a[3] * b[6] + + (uint64_t)a[4] * b[5] + + (uint64_t)a[5] * b[4] + + (uint64_t)a[6] * b[3] + + (uint64_t)a[7] * b[2] + + (uint64_t)a[8] * b[1] + + (uint64_t)a[9] * b[0]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * b[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)a[1] * b[9] + + (uint64_t)a[2] * b[8] + + (uint64_t)a[3] * b[7] + + (uint64_t)a[4] * b[6] + + (uint64_t)a[5] * b[5] + + (uint64_t)a[6] * b[4] + + (uint64_t)a[7] * b[3] + + (uint64_t)a[8] * b[2] + + (uint64_t)a[9] * b[1]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)a[0] * b[1] + + (uint64_t)a[1] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)a[2] * b[9] + + (uint64_t)a[3] * b[8] + + (uint64_t)a[4] * b[7] + + (uint64_t)a[5] * b[6] + + (uint64_t)a[6] * b[5] + + (uint64_t)a[7] * b[4] + + (uint64_t)a[8] * b[3] + + (uint64_t)a[9] * b[2]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)a[0] * b[2] + + (uint64_t)a[1] * b[1] + + (uint64_t)a[2] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)a[3] * b[9] + + (uint64_t)a[4] * b[8] + + (uint64_t)a[5] * b[7] + + (uint64_t)a[6] * b[6] + + (uint64_t)a[7] * b[5] + + (uint64_t)a[8] * b[4] + + (uint64_t)a[9] * b[3]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[3] + + (uint64_t)a[1] * b[2] + + (uint64_t)a[2] * b[1] + + (uint64_t)a[3] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)a[4] * b[9] + + (uint64_t)a[5] * b[8] + + (uint64_t)a[6] * b[7] + + (uint64_t)a[7] * b[6] + + (uint64_t)a[8] * b[5] + + (uint64_t)a[9] * b[4]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[4] + + (uint64_t)a[1] * b[3] + + (uint64_t)a[2] * b[2] + + (uint64_t)a[3] * b[1] + + (uint64_t)a[4] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[5] * b[9] + + (uint64_t)a[6] * b[8] + + (uint64_t)a[7] * b[7] + + (uint64_t)a[8] * b[6] + + (uint64_t)a[9] * b[5]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[5] + + (uint64_t)a[1] * b[4] + + (uint64_t)a[2] * b[3] + + (uint64_t)a[3] * b[2] + + (uint64_t)a[4] * b[1] + + (uint64_t)a[5] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[6] * b[9] + + (uint64_t)a[7] * b[8] + + (uint64_t)a[8] * b[7] + + (uint64_t)a[9] * b[6]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[6] + + (uint64_t)a[1] * b[5] + + (uint64_t)a[2] * b[4] + + (uint64_t)a[3] * b[3] + + (uint64_t)a[4] * b[2] + + (uint64_t)a[5] * b[1] + + (uint64_t)a[6] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[7] * b[9] + + (uint64_t)a[8] * b[8] + + (uint64_t)a[9] * b[7]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[7] + + (uint64_t)a[1] * b[6] + + (uint64_t)a[2] * b[5] + + (uint64_t)a[3] * b[4] + + (uint64_t)a[4] * b[3] + + (uint64_t)a[5] * b[2] + + (uint64_t)a[6] * b[1] + + (uint64_t)a[7] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[8] * b[9] + + (uint64_t)a[9] * b[8]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[8] + + (uint64_t)a[1] * b[7] + + (uint64_t)a[2] * b[6] + + (uint64_t)a[3] * b[5] + + (uint64_t)a[4] * b[4] + + (uint64_t)a[5] * b[3] + + (uint64_t)a[6] * b[2] + + (uint64_t)a[7] * b[1] + + (uint64_t)a[8] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * b[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)(a[0]*2) * a[9] + + (uint64_t)(a[1]*2) * a[8] + + (uint64_t)(a[2]*2) * a[7] + + (uint64_t)(a[3]*2) * a[6] + + (uint64_t)(a[4]*2) * a[5]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * a[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)(a[1]*2) * a[9] + + (uint64_t)(a[2]*2) * a[8] + + (uint64_t)(a[3]*2) * a[7] + + (uint64_t)(a[4]*2) * a[6] + + (uint64_t)a[5] * a[5]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)(a[0]*2) * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)(a[2]*2) * a[9] + + (uint64_t)(a[3]*2) * a[8] + + (uint64_t)(a[4]*2) * a[7] + + (uint64_t)(a[5]*2) * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[2] + + (uint64_t)a[1] * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)(a[3]*2) * a[9] + + (uint64_t)(a[4]*2) * a[8] + + (uint64_t)(a[5]*2) * a[7] + + (uint64_t)a[6] * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[3] + + (uint64_t)(a[1]*2) * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)(a[4]*2) * a[9] + + (uint64_t)(a[5]*2) * a[8] + + (uint64_t)(a[6]*2) * a[7]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[4] + + (uint64_t)(a[1]*2) * a[3] + + (uint64_t)a[2] * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[5]*2) * a[9] + + (uint64_t)(a[6]*2) * a[8] + + (uint64_t)a[7] * a[7]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[5] + + (uint64_t)(a[1]*2) * a[4] + + (uint64_t)(a[2]*2) * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[6]*2) * a[9] + + (uint64_t)(a[7]*2) * a[8]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[6] + + (uint64_t)(a[1]*2) * a[5] + + (uint64_t)(a[2]*2) * a[4] + + (uint64_t)a[3] * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[7]*2) * a[9] + + (uint64_t)a[8] * a[8]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[7] + + (uint64_t)(a[1]*2) * a[6] + + (uint64_t)(a[2]*2) * a[5] + + (uint64_t)(a[3]*2) * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[8]*2) * a[9]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[8] + + (uint64_t)(a[1]*2) * a[7] + + (uint64_t)(a[2]*2) * a[6] + + (uint64_t)(a[3]*2) * a[5] + + (uint64_t)a[4] * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * a[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} +#endif + +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); + r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); + r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); +#ifdef VERIFY + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 26; + r->n[1] = a->n[1] >> 6 | a->n[2] << 20; + r->n[2] = a->n[2] >> 12 | a->n[3] << 14; + r->n[3] = a->n[3] >> 18 | a->n[4] << 8; + r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28; + r->n[5] = a->n[6] >> 4 | a->n[7] << 22; + r->n[6] = a->n[7] >> 10 | a->n[8] << 16; + r->n[7] = a->n[8] >> 16 | a->n[9] << 10; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { + r->n[0] = a->n[0] & 0x3FFFFFFUL; + r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); + r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); + r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL); + r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL); + r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL; + r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL); + r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL); + r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL); + r->n[9] = a->n[7] >> 10; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52.h new file mode 100644 index 00000000..bccd8feb --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_REPR_H +#define SECP256K1_FIELD_REPR_H + +#include + +typedef struct { + /* X = sum(i=0..4, elem[i]*2^52) mod n */ + uint64_t n[5]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) | (((uint64_t)(d1) & 0xFFFFFUL) << 32), \ + ((uint64_t)(d1) >> 20) | (((uint64_t)(d2)) << 12) | (((uint64_t)(d3) & 0xFFUL) << 44), \ + ((uint64_t)(d3) >> 8) | (((uint64_t)(d4) & 0xFFFFFFFUL) << 24), \ + ((uint64_t)(d4) >> 28) | (((uint64_t)(d5)) << 4) | (((uint64_t)(d6) & 0xFFFFUL) << 36), \ + ((uint64_t)(d6) >> 16) | (((uint64_t)(d7)) << 16) \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint64_t n[4]; +} secp256k1_fe_storage; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ + (d0) | (((uint64_t)(d1)) << 32), \ + (d2) | (((uint64_t)(d3)) << 32), \ + (d4) | (((uint64_t)(d5)) << 32), \ + (d6) | (((uint64_t)(d7)) << 32) \ +}} + +#endif /* SECP256K1_FIELD_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_asm_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_asm_impl.h new file mode 100644 index 00000000..1fc3171f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_asm_impl.h @@ -0,0 +1,502 @@ +/********************************************************************** + * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/** + * Changelog: + * - March 2013, Diederik Huys: original version + * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm + * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly + */ + +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * r15:rcx = d + * r10-r14 = a0-a4 + * rbx = b + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + + /* d += a3 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rcx\n" + "movq %%rdx,%%r15\n" + /* d += a2 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d = a0 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c = a4 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* d += a4 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a0 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* t4 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a4 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* u0 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a1 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a4 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a2 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a1 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b2 (last use of %%r10 = a0) */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* d += a4 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rcx only) */ + "shrdq $52,%%r15,%%rcx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rcx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "b"(b), "D"(r) +: "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * rcx:rbx = d + * r10-r14 = a0-a4 + * r15 = M (0xfffffffffffff) + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + "movq $0xfffffffffffff,%%r15\n" + + /* d = (a0*2) * a3 */ + "leaq (%%r10,%%r10,1),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rbx\n" + "movq %%rdx,%%rcx\n" + /* d += (a1*2) * a2 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c = a4 * a4 */ + "movq %%r14,%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* a4 *= 2 */ + "addq %%r14,%%r14\n" + /* d += a0 * a4 */ + "movq %%r10,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d+= (a1*2) * a3 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a2 * a2 */ + "movq %%r12,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* t4 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * a0 */ + "movq %%r10,%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a1 * a4 */ + "movq %%r11,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += (a2*2) * a3 */ + "leaq (%%r12,%%r12,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* u0 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* a0 *= 2 */ + "addq %%r10,%%r10\n" + /* c += a0 * a1 */ + "movq %%r10,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a2 * a4 */ + "movq %%r12,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a3 * a3 */ + "movq %%r13,%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a0 * a2 (last use of %%r10) */ + "movq %%r10,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* c += a1 * a1 */ + "movq %%r11,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a3 * a4 */ + "movq %%r13,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rbx only) */ + "shrdq $52,%%rcx,%%rbx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rbx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "D"(r) +: "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_impl.h new file mode 100644 index 00000000..b1ac42b1 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_impl.h @@ -0,0 +1,494 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_REPR_IMPL_H +#define SECP256K1_FIELD_REPR_IMPL_H + +#include "../../secp256k1-config.h" + +#include "util.h" +#include "num.h" +#include "field.h" + +#if defined(USE_ASM_X86_64) +#include "field_5x52_asm_impl.h" +#else +#include "field_5x52_int128_impl.h" +#endif + +/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, + * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, + * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element + * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations + * accept any input with magnitude at most M, and have different rules for propagating magnitude to their + * output. + */ + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe *a) { + const uint64_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 2048); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { + r &= (d[0] < 0xFFFFEFFFFFC2FULL); + } + } + VERIFY_CHECK(r == 1); +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + if (x) { + t0 += 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint64_t z0, z1; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0 = t0; z1 = t0 ^ 0x1000003D0ULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r) { + uint64_t t0, t1, t2, t3, t4; + uint64_t z0, z1; + uint64_t x; + + t0 = r->n[0]; + t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + x = t4 >> 48; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0xFFFFFFFFFFFFFULL; + z1 = z0 ^ 0x1000003D0ULL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + + t4 &= 0x0FFFFFFFFFFFFULL; + + t1 += (t0 >> 52); + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) { + const uint64_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<5; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 4; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { + r->n[0] = (uint64_t)a[31] + | ((uint64_t)a[30] << 8) + | ((uint64_t)a[29] << 16) + | ((uint64_t)a[28] << 24) + | ((uint64_t)a[27] << 32) + | ((uint64_t)a[26] << 40) + | ((uint64_t)(a[25] & 0xF) << 48); + r->n[1] = (uint64_t)((a[25] >> 4) & 0xF) + | ((uint64_t)a[24] << 4) + | ((uint64_t)a[23] << 12) + | ((uint64_t)a[22] << 20) + | ((uint64_t)a[21] << 28) + | ((uint64_t)a[20] << 36) + | ((uint64_t)a[19] << 44); + r->n[2] = (uint64_t)a[18] + | ((uint64_t)a[17] << 8) + | ((uint64_t)a[16] << 16) + | ((uint64_t)a[15] << 24) + | ((uint64_t)a[14] << 32) + | ((uint64_t)a[13] << 40) + | ((uint64_t)(a[12] & 0xF) << 48); + r->n[3] = (uint64_t)((a[12] >> 4) & 0xF) + | ((uint64_t)a[11] << 4) + | ((uint64_t)a[10] << 12) + | ((uint64_t)a[9] << 20) + | ((uint64_t)a[8] << 28) + | ((uint64_t)a[7] << 36) + | ((uint64_t)a[6] << 44); + r->n[4] = (uint64_t)a[5] + | ((uint64_t)a[4] << 8) + | ((uint64_t)a[3] << 16) + | ((uint64_t)a[2] << 24) + | ((uint64_t)a[1] << 32) + | ((uint64_t)a[0] << 40); + if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + r[0] = (a->n[4] >> 40) & 0xFF; + r[1] = (a->n[4] >> 32) & 0xFF; + r[2] = (a->n[4] >> 24) & 0xFF; + r[3] = (a->n[4] >> 16) & 0xFF; + r[4] = (a->n[4] >> 8) & 0xFF; + r[5] = a->n[4] & 0xFF; + r[6] = (a->n[3] >> 44) & 0xFF; + r[7] = (a->n[3] >> 36) & 0xFF; + r[8] = (a->n[3] >> 28) & 0xFF; + r[9] = (a->n[3] >> 20) & 0xFF; + r[10] = (a->n[3] >> 12) & 0xFF; + r[11] = (a->n[3] >> 4) & 0xFF; + r[12] = ((a->n[2] >> 48) & 0xF) | ((a->n[3] & 0xF) << 4); + r[13] = (a->n[2] >> 40) & 0xFF; + r[14] = (a->n[2] >> 32) & 0xFF; + r[15] = (a->n[2] >> 24) & 0xFF; + r[16] = (a->n[2] >> 16) & 0xFF; + r[17] = (a->n[2] >> 8) & 0xFF; + r[18] = a->n[2] & 0xFF; + r[19] = (a->n[1] >> 44) & 0xFF; + r[20] = (a->n[1] >> 36) & 0xFF; + r[21] = (a->n[1] >> 28) & 0xFF; + r[22] = (a->n[1] >> 20) & 0xFF; + r[23] = (a->n[1] >> 12) & 0xFF; + r[24] = (a->n[1] >> 4) & 0xFF; + r[25] = ((a->n[0] >> 48) & 0xF) | ((a->n[1] & 0xF) << 4); + r[26] = (a->n[0] >> 40) & 0xFF; + r[27] = (a->n[0] >> 32) & 0xFF; + r[28] = (a->n[0] >> 24) & 0xFF; + r[29] = (a->n[0] >> 16) & 0xFF; + r[30] = (a->n[0] >> 8) & 0xFF; + r[31] = a->n[0] & 0xFF; +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); +#ifdef VERIFY + if (a->magnitude > r->magnitude) { + r->magnitude = a->magnitude; + } + r->normalized &= a->normalized; +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 52; + r->n[1] = a->n[1] >> 12 | a->n[2] << 40; + r->n[2] = a->n[2] >> 24 | a->n[3] << 28; + r->n[3] = a->n[3] >> 36 | a->n[4] << 16; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a) { + r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; + r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); + r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); + r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL); + r->n[4] = a->n[3] >> 16; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif /* SECP256K1_FIELD_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_int128_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_int128_impl.h new file mode 100644 index 00000000..95a0d179 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_5x52_int128_impl.h @@ -0,0 +1,277 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H +#define SECP256K1_FIELD_INNER5X52_IMPL_H + +#include + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { + uint128_t c, d; + uint64_t t3, t4, tx, u0; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + VERIFY_BITS(b[0], 56); + VERIFY_BITS(b[1], 56); + VERIFY_BITS(b[2], 56); + VERIFY_BITS(b[3], 56); + VERIFY_BITS(b[4], 52); + VERIFY_CHECK(r != b); + + /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)a0 * b[3] + + (uint128_t)a1 * b[2] + + (uint128_t)a2 * b[1] + + (uint128_t)a3 * b[0]; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * b[4]; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + d += (uint128_t)a0 * b[4] + + (uint128_t)a1 * b[3] + + (uint128_t)a2 * b[2] + + (uint128_t)a3 * b[1] + + (uint128_t)a4 * b[0]; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * b[0]; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * b[4] + + (uint128_t)a2 * b[3] + + (uint128_t)a3 * b[2] + + (uint128_t)a4 * b[1]; + VERIFY_BITS(d, 115); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 63); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 115); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + c += (uint128_t)a0 * b[1] + + (uint128_t)a1 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * b[4] + + (uint128_t)a3 * b[3] + + (uint128_t)a4 * b[2]; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * b[2] + + (uint128_t)a1 * b[1] + + (uint128_t)a2 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * b[4] + + (uint128_t)a4 * b[3]; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R + t3; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { + uint128_t c, d; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + int64_t t3, t4, tx, u0; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + + /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)(a0*2) * a3 + + (uint128_t)(a1*2) * a2; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * a4; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + a4 *= 2; + d += (uint128_t)a0 * a4 + + (uint128_t)(a1*2) * a3 + + (uint128_t)a2 * a2; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * a0; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * a4 + + (uint128_t)(a2*2) * a3; + VERIFY_BITS(d, 114); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 62); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 113); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + a0 *= 2; + c += (uint128_t)a0 * a1; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * a4 + + (uint128_t)a3 * a3; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * a2 + + (uint128_t)a1 * a1; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * a4; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += d * R + t3; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_impl.h new file mode 100644 index 00000000..9cb8f687 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/field_impl.h @@ -0,0 +1,313 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_FIELD_IMPL_H +#define SECP256K1_FIELD_IMPL_H + +#include "../../secp256k1-config.h" + +#include "util.h" + +#if defined(USE_FIELD_10X26) +#include "field_10x26_impl.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52_impl.h" +#else +#error "Please select field implementation" +#endif + +SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero(&na); +} + +SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero_var(&na); +} + +static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a) { + /** Given that p is congruent to 3 mod 4, we can compute the square root of + * a mod p as the (p+1)/4'th power of a. + * + * As (p+1)/4 is an even number, it will have the same result for a and for + * (-a). Only one of these two numbers actually has a square root however, + * so we test at the end by squaring and comparing to the input. + * Also because (p+1)/4 is an even number, the computed square root is + * itself always a square (a ** ((p+1)/4) is the square of a ** ((p+1)/8)). + */ + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in + * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<6; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_sqr(r, &t1); + + /* Check that a square root was actually calculated */ + + secp256k1_fe_sqr(&t1, r); + return secp256k1_fe_equal(&t1, a); +} + +static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a) { + secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in + * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<5; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, a); + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(r, a, &t1); +} + +static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a) { +#if defined(USE_FIELD_INV_BUILTIN) + secp256k1_fe_inv(r, a); +#elif defined(USE_FIELD_INV_NUM) + secp256k1_num n, m; + static const secp256k1_fe negone = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL + ); + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + unsigned char b[32]; + int res; + secp256k1_fe c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + res = secp256k1_fe_set_b32(r, b); + (void)res; + VERIFY_CHECK(res); + /* Verify the result is the (unique) valid inverse using non-GMP code. */ + secp256k1_fe_mul(&c, &c, r); + secp256k1_fe_add(&c, &negone); + CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); +#else +#error "Please select field inverse implementation" +#endif +} + +static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { + secp256k1_fe u; + size_t i; + if (len < 1) { + return; + } + + VERIFY_CHECK((r + len <= a) || (a + len <= r)); + + r[0] = a[0]; + + i = 0; + while (++i < len) { + secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); + } + + secp256k1_fe_inv_var(&u, &r[--i]); + + while (i > 0) { + size_t j = i--; + secp256k1_fe_mul(&r[j], &r[i], &u); + secp256k1_fe_mul(&u, &u, &a[j]); + } + + r[0] = u; +} + +static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { +#ifndef USE_NUM_NONE + unsigned char b[32]; + secp256k1_num n; + secp256k1_num m; + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + + secp256k1_fe c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + return secp256k1_num_jacobi(&n, &m) >= 0; +#else + secp256k1_fe r; + return secp256k1_fe_sqrt(&r, a); +#endif +} + +#endif /* SECP256K1_FIELD_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/gen_context.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/gen_context.c new file mode 100644 index 00000000..8d328f7c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/gen_context.c @@ -0,0 +1,74 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Thomas Daede, Cory Fields * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define USE_BASIC_CONFIG 1 + +#include "basic-config.h" +#include "secp256k1.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_gen_impl.h" + +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + +int main(int argc, char **argv) { + secp256k1_ecmult_gen_context ctx; + int inner; + int outer; + FILE* fp; + + (void)argc; + (void)argv; + + fp = fopen("src/ecmult_static_context.h","w"); + if (fp == NULL) { + fprintf(stderr, "Could not open src/ecmult_static_context.h for writing!\n"); + return -1; + } + + fprintf(fp, "#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#define _SECP256K1_ECMULT_STATIC_CONTEXT_\n"); + fprintf(fp, "#include \"src/group.h\"\n"); + fprintf(fp, "#define SC SECP256K1_GE_STORAGE_CONST\n"); + fprintf(fp, "static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = {\n"); + + secp256k1_ecmult_gen_context_init(&ctx); + secp256k1_ecmult_gen_context_build(&ctx, &default_error_callback); + for(outer = 0; outer != 64; outer++) { + fprintf(fp,"{\n"); + for(inner = 0; inner != 16; inner++) { + fprintf(fp," SC(%uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu, %uu)", SECP256K1_GE_STORAGE_CONST_GET((*ctx.prec)[outer][inner])); + if (inner != 15) { + fprintf(fp,",\n"); + } else { + fprintf(fp,"\n"); + } + } + if (outer != 63) { + fprintf(fp,"},\n"); + } else { + fprintf(fp,"}\n"); + } + } + fprintf(fp,"};\n"); + secp256k1_ecmult_gen_context_clear(&ctx); + + fprintf(fp, "#undef SC\n"); + fprintf(fp, "#endif\n"); + fclose(fp); + + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group.h new file mode 100644 index 00000000..3947ea2d --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group.h @@ -0,0 +1,147 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_GROUP_H +#define SECP256K1_GROUP_H + +#include "num.h" +#include "field.h" + +/** A group element of the secp256k1 curve, in affine coordinates. */ +typedef struct { + secp256k1_fe x; + secp256k1_fe y; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_ge; + +#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} +#define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +/** A group element of the secp256k1 curve, in jacobian coordinates. */ +typedef struct { + secp256k1_fe x; /* actual X: x/z^2 */ + secp256k1_fe y; /* actual Y: y/z^3 */ + secp256k1_fe z; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_gej; + +#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} +#define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +typedef struct { + secp256k1_fe_storage x; + secp256k1_fe_storage y; +} secp256k1_ge_storage; + +#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} + +#define SECP256K1_GE_STORAGE_CONST_GET(t) SECP256K1_FE_STORAGE_CONST_GET(t.x), SECP256K1_FE_STORAGE_CONST_GET(t.y) + +/** Set a group element equal to the point with given X and Y coordinates */ +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y); + +/** Set a group element (affine) equal to the point with the given X coordinate + * and a Y coordinate that is a quadratic residue modulo p. The return value + * is true iff a coordinate with the given X coordinate exists. + */ +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x); + +/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness + * for Y. Return value indicates whether the result is valid. */ +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_ge_is_infinity(const secp256k1_ge *a); + +/** Check whether a group element is valid (i.e., on the curve). */ +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a); + +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a); + +/** Set a group element equal to another which is given in jacobian coordinates */ +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a); + +/** Set a batch of group elements equal to the inputs given in jacobian coordinates */ +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb); + +/** Set a batch of group elements equal to the inputs given in jacobian + * coordinates (with known z-ratios). zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. */ +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len); + +/** Bring a batch inputs given in jacobian coordinates (with known z-ratios) to + * the same global z "denominator". zr must contain the known z-ratios such + * that mul(a[i].z, zr[i+1]) == a[i+1].z. zr[0] is ignored. The x and y + * coordinates of the result are stored in r, the common z coordinate is + * stored in globalz. */ +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr); + +/** Set a group element (affine) equal to the point at infinity. */ +static void secp256k1_ge_set_infinity(secp256k1_ge *r); + +/** Set a group element (jacobian) equal to the point at infinity. */ +static void secp256k1_gej_set_infinity(secp256k1_gej *r); + +/** Set a group element (jacobian) equal to another which is given in affine coordinates. */ +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a); + +/** Compare the X coordinate of a group element (jacobian). */ +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a); + +/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_gej_is_infinity(const secp256k1_gej *a); + +/** Check whether a group element's y coordinate is a quadratic residue. */ +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a); + +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). + * a may not be zero. Constant time. */ +static void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the double of a. If rzr is not-NULL, r->z = a->z * *rzr (where infinity means an implicit z = 0). */ +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient + than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time + guarantee, and b is allowed to be infinity. If rzr is non-NULL, r->z = a->z * *rzr (a cannot be infinity in that case). */ +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr); + +/** Set r equal to the sum of a and b (with the inverse of b's Z coordinate passed as bzinv). */ +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv); + +#ifdef USE_ENDOMORPHISM +/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a); +#endif + +/** Clear a secp256k1_gej to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej *r); + +/** Clear a secp256k1_ge to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge *r); + +/** Convert a group element to the storage type. */ +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a); + +/** Convert a group element back from the storage type. */ +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag); + +/** Rescale a jacobian point by b which must be non-zero. Constant-time. */ +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *b); + +#endif /* SECP256K1_GROUP_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group_impl.h new file mode 100644 index 00000000..b1ace87b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/group_impl.h @@ -0,0 +1,706 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_GROUP_IMPL_H +#define SECP256K1_GROUP_IMPL_H + +#include "num.h" +#include "field.h" +#include "group.h" + +/* These points can be generated in sage as follows: + * + * 0. Setup a worksheet with the following parameters. + * b = 4 # whatever CURVE_B will be set to + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (b)]) + * + * 1. Determine all the small orders available to you. (If there are + * no satisfactory ones, go back and change b.) + * print C.order().factor(limit=1000) + * + * 2. Choose an order as one of the prime factors listed in the above step. + * (You can also multiply some to get a composite order, though the + * tests will crash trying to invert scalars during signing.) We take a + * random point and scale it to drop its order to the desired value. + * There is some probability this won't work; just try again. + * order = 199 + * P = C.random_point() + * P = (int(P.order()) / int(order)) * P + * assert(P.order() == order) + * + * 3. Print the values. You'll need to use a vim macro or something to + * split the hex output into 4-byte chunks. + * print "%x %x" % P.xy() + */ +#if defined(EXHAUSTIVE_TEST_ORDER) +# if EXHAUSTIVE_TEST_ORDER == 199 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xFA7CC9A7, 0x0737F2DB, 0xA749DD39, 0x2B4FB069, + 0x3B017A7D, 0xA808C2F1, 0xFB12940C, 0x9EA66C18, + 0x78AC123A, 0x5ED8AEF3, 0x8732BC91, 0x1F3A2868, + 0x48DF246C, 0x808DAE72, 0xCFE52572, 0x7F0501ED +); + +const int CURVE_B = 4; +# elif EXHAUSTIVE_TEST_ORDER == 13 +const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0xedc60018, 0xa51a786b, 0x2ea91f4d, 0x4c9416c0, + 0x9de54c3b, 0xa1316554, 0x6cf4345c, 0x7277ef15, + 0x54cb1b6b, 0xdc8c1273, 0x087844ea, 0x43f4603e, + 0x0eaf9a43, 0xf6effe55, 0x939f806d, 0x37adf8ac +); +const int CURVE_B = 2; +# else +# error No known generator for the specified exhaustive test group order. +# endif +#else +/** Generator for secp256k1, value 'g' defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + */ +static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, + 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, + 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, + 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL +); + +const int CURVE_B = 7; +#endif + +static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) { + secp256k1_fe zi2; + secp256k1_fe zi3; + secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r->x, &a->x, &zi2); + secp256k1_fe_mul(&r->y, &a->y, &zi3); + r->infinity = a->infinity; +} + +static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; +} + +static int secp256k1_ge_is_infinity(const secp256k1_ge *a) { + return a->infinity; +} + +static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) { + *r = *a; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; + r->infinity = a->infinity; + secp256k1_fe_inv(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) { + secp256k1_fe z2, z3; + r->infinity = a->infinity; + if (a->infinity) { + return; + } + secp256k1_fe_inv_var(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len, const secp256k1_callback *cb) { + secp256k1_fe *az; + secp256k1_fe *azi; + size_t i; + size_t count = 0; + az = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * len); + for (i = 0; i < len; i++) { + if (!a[i].infinity) { + az[count++] = a[i].z; + } + } + + azi = (secp256k1_fe *)checked_malloc(cb, sizeof(secp256k1_fe) * count); + secp256k1_fe_inv_all_var(azi, az, count); + free(az); + + count = 0; + for (i = 0; i < len; i++) { + r[i].infinity = a[i].infinity; + if (!a[i].infinity) { + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &azi[count++]); + } + } + free(azi); +} + +static void secp256k1_ge_set_table_gej_var(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zr, size_t len) { + size_t i = len - 1; + secp256k1_fe zi; + + if (len > 0) { + /* Compute the inverse of the last z coordinate, and use it to compute the last affine output. */ + secp256k1_fe_inv(&zi, &a[i].z); + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + + /* Work out way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + secp256k1_fe_mul(&zi, &zi, &zr[i]); + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zi); + } + } +} + +static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr) { + size_t i = len - 1; + secp256k1_fe zs; + + if (len > 0) { + /* The z of the final point gives us the "global Z" for the table. */ + r[i].x = a[i].x; + r[i].y = a[i].y; + *globalz = a[i].z; + r[i].infinity = 0; + zs = zr[i]; + + /* Work our way backwards, using the z-ratios to scale the x/y values. */ + while (i > 0) { + if (i != len - 1) { + secp256k1_fe_mul(&zs, &zs, &zr[i]); + } + i--; + secp256k1_ge_set_gej_zinv(&r[i], &a[i], &zs); + } + } +} + +static void secp256k1_gej_set_infinity(secp256k1_gej *r) { + r->infinity = 1; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); +} + +static void secp256k1_ge_set_infinity(secp256k1_ge *r) { + r->infinity = 1; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); +} + +static void secp256k1_gej_clear(secp256k1_gej *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); +} + +static void secp256k1_ge_clear(secp256k1_ge *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); +} + +static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x) { + secp256k1_fe x2, x3, c; + r->x = *x; + secp256k1_fe_sqr(&x2, x); + secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_set_int(&c, CURVE_B); + secp256k1_fe_add(&c, &x3); + return secp256k1_fe_sqrt(&r->y, &c); +} + +static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) { + if (!secp256k1_ge_set_xquad(r, x)) { + return 0; + } + secp256k1_fe_normalize_var(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) { + secp256k1_fe_negate(&r->y, &r->y, 1); + } + return 1; + +} + +static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + secp256k1_fe_set_int(&r->z, 1); +} + +static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) { + secp256k1_fe r, r2; + VERIFY_CHECK(!a->infinity); + secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); + r2 = a->x; secp256k1_fe_normalize_weak(&r2); + return secp256k1_fe_equal_var(&r, &r2); +} + +static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + r->z = a->z; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static int secp256k1_gej_is_infinity(const secp256k1_gej *a) { + return a->infinity; +} + +static int secp256k1_gej_is_valid_var(const secp256k1_gej *a) { + secp256k1_fe y2, x3, z2, z6; + if (a->infinity) { + return 0; + } + /** y^2 = x^3 + 7 + * (Y/Z^3)^2 = (X/Z^2)^3 + 7 + * Y^2 / Z^6 = X^3 / Z^6 + 7 + * Y^2 = X^3 + 7*Z^6 + */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); + secp256k1_fe_mul_int(&z6, CURVE_B); + secp256k1_fe_add(&x3, &z6); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) { + secp256k1_fe y2, x3, c; + if (a->infinity) { + return 0; + } + /* y^2 = x^3 + 7 */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, CURVE_B); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate. + * + * Note that there is an implementation described at + * https://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l + * which trades a multiply for a square, but in practice this is actually slower, + * mainly because it requires more normalizations. + */ + secp256k1_fe t1,t2,t3,t4; + /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, + * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have + * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. + * + * Having said this, if this function receives a point on a sextic twist, e.g. by + * a fault attack, it is possible for y to be 0. This happens for y^2 = x^3 + 6, + * since -6 does have a cube root mod p. For this point, this function will not set + * the infinity flag even though the point doubles to infinity, and the result + * point will be gibberish (z = 0 but infinity = 0). + */ + r->infinity = a->infinity; + if (r->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } + return; + } + + if (rzr != NULL) { + *rzr = a->y; + secp256k1_fe_normalize_weak(rzr); + secp256k1_fe_mul_int(rzr, 2); + } + + secp256k1_fe_mul(&r->z, &a->z, &a->y); + secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ + secp256k1_fe_sqr(&t1, &a->x); + secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ + secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ + secp256k1_fe_sqr(&t3, &a->y); + secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ + secp256k1_fe_sqr(&t4, &t3); + secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ + secp256k1_fe_mul(&t3, &t3, &a->x); /* T3 = 2*X*Y^2 (1) */ + r->x = t3; + secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ + secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ + secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ + secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ + secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ + secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ + secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ + secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ + secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ +} + +static SECP256K1_INLINE void secp256k1_gej_double_nonzero(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) { + VERIFY_CHECK(!secp256k1_gej_is_infinity(a)); + secp256k1_gej_double_var(r, a, rzr); +} + +static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) { + /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ + secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + + if (a->infinity) { + VERIFY_CHECK(rzr == NULL); + *r = *b; + return; + } + + if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } + *r = *a; + return; + } + + r->infinity = 0; + secp256k1_fe_sqr(&z22, &b->z); + secp256k1_fe_sqr(&z12, &a->z); + secp256k1_fe_mul(&u1, &a->x, &z22); + secp256k1_fe_mul(&u2, &b->x, &z12); + secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a, rzr); + } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + secp256k1_fe_mul(&h, &h, &b->z); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) { + /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + VERIFY_CHECK(rzr == NULL); + secp256k1_gej_set_ge(r, b); + return; + } + if (b->infinity) { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 1); + } + *r = *a; + return; + } + r->infinity = 0; + + secp256k1_fe_sqr(&z12, &a->z); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a, rzr); + } else { + if (rzr != NULL) { + secp256k1_fe_set_int(rzr, 0); + } + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + if (rzr != NULL) { + *rzr = h; + } + secp256k1_fe_mul(&r->z, &a->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) { + /* 9 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + + if (b->infinity) { + *r = *a; + return; + } + if (a->infinity) { + secp256k1_fe bzinv2, bzinv3; + r->infinity = b->infinity; + secp256k1_fe_sqr(&bzinv2, bzinv); + secp256k1_fe_mul(&bzinv3, &bzinv2, bzinv); + secp256k1_fe_mul(&r->x, &b->x, &bzinv2); + secp256k1_fe_mul(&r->y, &b->y, &bzinv3); + secp256k1_fe_set_int(&r->z, 1); + return; + } + r->infinity = 0; + + /** We need to calculate (rx,ry,rz) = (ax,ay,az) + (bx,by,1/bzinv). Due to + * secp256k1's isomorphism we can multiply the Z coordinates on both sides + * by bzinv, and get: (rx,ry,rz*bzinv) = (ax,ay,az*bzinv) + (bx,by,1). + * This means that (rx,ry,rz) can be calculated as + * (ax,ay,az*bzinv) + (bx,by,1), when not applying the bzinv factor to rz. + * The variable az below holds the modified Z coordinate for a, which is used + * for the computation of rx and ry, but not for rz. + */ + secp256k1_fe_mul(&az, &a->z, bzinv); + + secp256k1_fe_sqr(&z12, &az); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &az); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a, NULL); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + + +static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b) { + /* Operations: 7 mul, 5 sqr, 4 normalize, 21 mul_int/add/negate/cmov */ + static const secp256k1_fe fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr; + secp256k1_fe m_alt, rr_alt; + int infinity, degenerate; + VERIFY_CHECK(!b->infinity); + VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); + + /** In: + * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. + * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. + * we find as solution for a unified addition/doubling formula: + * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. + * x3 = lambda^2 - (x1 + x2) + * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). + * + * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: + * U1 = X1*Z2^2, U2 = X2*Z1^2 + * S1 = Y1*Z2^3, S2 = Y2*Z1^3 + * Z = Z1*Z2 + * T = U1+U2 + * M = S1+S2 + * Q = T*M^2 + * R = T^2-U1*U2 + * X3 = 4*(R^2-Q) + * Y3 = 4*(R*(3*Q-2*R^2)-M^4) + * Z3 = 2*M*Z + * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + * + * This formula has the benefit of being the same for both addition + * of distinct points and doubling. However, it breaks down in the + * case that either point is infinity, or that y1 = -y2. We handle + * these cases in the following ways: + * + * - If b is infinity we simply bail by means of a VERIFY_CHECK. + * + * - If a is infinity, we detect this, and at the end of the + * computation replace the result (which will be meaningless, + * but we compute to be constant-time) with b.x : b.y : 1. + * + * - If a = -b, we have y1 = -y2, which is a degenerate case. + * But here the answer is infinity, so we simply set the + * infinity flag of the result, overriding the computed values + * without even needing to cmov. + * + * - If y1 = -y2 but x1 != x2, which does occur thanks to certain + * properties of our curve (specifically, 1 has nontrivial cube + * roots in our field, and the curve equation has no x coefficient) + * then the answer is not infinity but also not given by the above + * equation. In this case, we cmov in place an alternate expression + * for lambda. Specifically (y1 - y2)/(x1 - x2). Where both these + * expressions for lambda are defined, they are equal, and can be + * obtained from each other by multiplication by (y1 + y2)/(y1 + y2) + * then substitution of x^3 + 7 for y^2 (using the curve equation). + * For all pairs of nonzero points (a, b) at least one is defined, + * so this covers everything. + */ + + secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ + u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ + secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ + s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ + secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z1^2 (1) */ + secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ + t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ + m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ + secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ + secp256k1_fe_negate(&m_alt, &u2, 1); /* Malt = -X2*Z1^2 */ + secp256k1_fe_mul(&tt, &u1, &m_alt); /* tt = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &tt); /* rr = R = T^2-U1*U2 (3) */ + /** If lambda = R/M = 0/0 we have a problem (except in the "trivial" + * case that Z = z1z2 = 0, and this is special-cased later on). */ + degenerate = secp256k1_fe_normalizes_to_zero(&m) & + secp256k1_fe_normalizes_to_zero(&rr); + /* This only occurs when y1 == -y2 and x1^3 == x2^3, but x1 != x2. + * This means either x1 == beta*x2 or beta*x1 == x2, where beta is + * a nontrivial cube root of one. In either case, an alternate + * non-indeterminate expression for lambda is (y1 - y2)/(x1 - x2), + * so we set R/M equal to this. */ + rr_alt = s1; + secp256k1_fe_mul_int(&rr_alt, 2); /* rr = Y1*Z2^3 - Y2*Z1^3 (2) */ + secp256k1_fe_add(&m_alt, &u1); /* Malt = X1*Z2^2 - X2*Z1^2 */ + + secp256k1_fe_cmov(&rr_alt, &rr, !degenerate); + secp256k1_fe_cmov(&m_alt, &m, !degenerate); + /* Now Ralt / Malt = lambda and is guaranteed not to be 0/0. + * From here on out Ralt and Malt represent the numerator + * and denominator of lambda; R and M represent the explicit + * expressions x1^2 + x2^2 + x1x2 and y1 + y2. */ + secp256k1_fe_sqr(&n, &m_alt); /* n = Malt^2 (1) */ + secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*Malt^2 (1) */ + /* These two lines use the observation that either M == Malt or M == 0, + * so M^3 * Malt is either Malt^4 (which is computed by squaring), or + * zero (which is "computed" by cmov). So the cost is one squaring + * versus two multiplications. */ + secp256k1_fe_sqr(&n, &n); + secp256k1_fe_cmov(&n, &m, degenerate); /* n = M^3 * Malt (2) */ + secp256k1_fe_sqr(&t, &rr_alt); /* t = Ralt^2 (1) */ + secp256k1_fe_mul(&r->z, &a->z, &m_alt); /* r->z = Malt*Z (1) */ + infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2); /* r->z = Z3 = 2*Malt*Z (2) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&t, &q); /* t = Ralt^2-Q (3) */ + secp256k1_fe_normalize_weak(&t); + r->x = t; /* r->x = Ralt^2-Q (1) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*x3 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*x3 - Q: (4) */ + secp256k1_fe_mul(&t, &t, &rr_alt); /* t = Ralt*(2*x3 - Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = Ralt*(2*x3 - Q) + M^3*Malt (3) */ + secp256k1_fe_negate(&r->y, &t, 3); /* r->y = Ralt*(Q - 2x3) - M^3*Malt (4) */ + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_mul_int(&r->x, 4); /* r->x = X3 = 4*(Ralt^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4); /* r->y = Y3 = 4*Ralt*(Q - 2x3) - 4*M^3*Malt (4) */ + + /** In case a->infinity == 1, replace r with (b->x, b->y, 1). */ + secp256k1_fe_cmov(&r->x, &b->x, a->infinity); + secp256k1_fe_cmov(&r->y, &b->y, a->infinity); + secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); + r->infinity = infinity; +} + +static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) { + /* Operations: 4 mul, 1 sqr */ + secp256k1_fe zz; + VERIFY_CHECK(!secp256k1_fe_is_zero(s)); + secp256k1_fe_sqr(&zz, s); + secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ + secp256k1_fe_mul(&r->y, &r->y, &zz); + secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */ + secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ +} + +static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) { + secp256k1_fe x, y; + VERIFY_CHECK(!a->infinity); + x = a->x; + secp256k1_fe_normalize(&x); + y = a->y; + secp256k1_fe_normalize(&y); + secp256k1_fe_to_storage(&r->x, &x); + secp256k1_fe_to_storage(&r->y, &y); +} + +static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a) { + secp256k1_fe_from_storage(&r->x, &a->x); + secp256k1_fe_from_storage(&r->y, &a->y); + r->infinity = 0; +} + +static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) { + secp256k1_fe_storage_cmov(&r->x, &a->x, flag); + secp256k1_fe_storage_cmov(&r->y, &a->y, flag); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) { + static const secp256k1_fe beta = SECP256K1_FE_CONST( + 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, + 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul + ); + *r = *a; + secp256k1_fe_mul(&r->x, &r->x, &beta); +} +#endif + +static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a) { + secp256k1_fe yz; + + if (a->infinity) { + return 0; + } + + /* We rely on the fact that the Jacobi symbol of 1 / a->z^3 is the same as + * that of a->z. Thus a->y / a->z^3 is a quadratic residue iff a->y * a->z + is */ + secp256k1_fe_mul(&yz, &a->y, &a->z); + return secp256k1_fe_is_quad_var(&yz); +} + +#endif /* SECP256K1_GROUP_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash.h new file mode 100644 index 00000000..de26e4b8 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash.h @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_HASH_H +#define SECP256K1_HASH_H + +#include +#include + +typedef struct { + uint32_t s[8]; + uint32_t buf[16]; /* In big endian */ + size_t bytes; +} secp256k1_sha256; + +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash); +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32); + +typedef struct { + secp256k1_sha256 inner, outer; +} secp256k1_hmac_sha256; + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t size); +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size); +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32); + +typedef struct { + unsigned char v[32]; + unsigned char k[32]; + int retry; +} secp256k1_rfc6979_hmac_sha256; + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen); +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen); +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng); + +#endif /* SECP256K1_HASH_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash_impl.h new file mode 100644 index 00000000..009f26be --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/hash_impl.h @@ -0,0 +1,282 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_HASH_IMPL_H +#define SECP256K1_HASH_IMPL_H + +#include "hash.h" + +#include +#include +#include + +#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10)) +#define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7)) +#define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3)) +#define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10)) + +#define Round(a,b,c,d,e,f,g,h,k,w) do { \ + uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \ + uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \ + (d) += t1; \ + (h) = t1 + t2; \ +} while(0) + +#ifdef WORDS_BIGENDIAN +#define BE32(x) (x) +#else +#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) +#endif + +static void secp256k1_sha256_initialize(secp256k1_sha256 *hash) { + hash->s[0] = 0x6a09e667ul; + hash->s[1] = 0xbb67ae85ul; + hash->s[2] = 0x3c6ef372ul; + hash->s[3] = 0xa54ff53aul; + hash->s[4] = 0x510e527ful; + hash->s[5] = 0x9b05688cul; + hash->s[6] = 0x1f83d9abul; + hash->s[7] = 0x5be0cd19ul; + hash->bytes = 0; +} + +/** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */ +static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { + uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; + uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; + + Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0])); + Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1])); + Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2])); + Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3])); + Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4])); + Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5])); + Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6])); + Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7])); + Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8])); + Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9])); + Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10])); + Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11])); + Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12])); + Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13])); + Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14])); + Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15])); + + Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); + + s[0] += a; + s[1] += b; + s[2] += c; + s[3] += d; + s[4] += e; + s[5] += f; + s[6] += g; + s[7] += h; +} + +static void secp256k1_sha256_write(secp256k1_sha256 *hash, const unsigned char *data, size_t len) { + size_t bufsize = hash->bytes & 0x3F; + hash->bytes += len; + while (bufsize + len >= 64) { + /* Fill the buffer, and process it. */ + size_t chunk_len = 64 - bufsize; + memcpy(((unsigned char*)hash->buf) + bufsize, data, chunk_len); + data += chunk_len; + len -= chunk_len; + secp256k1_sha256_transform(hash->s, hash->buf); + bufsize = 0; + } + if (len) { + /* Fill the buffer with what remains. */ + memcpy(((unsigned char*)hash->buf) + bufsize, data, len); + } +} + +static void secp256k1_sha256_finalize(secp256k1_sha256 *hash, unsigned char *out32) { + static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint32_t sizedesc[2]; + uint32_t out[8]; + int i = 0; + sizedesc[0] = BE32(hash->bytes >> 29); + sizedesc[1] = BE32(hash->bytes << 3); + secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64)); + secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8); + for (i = 0; i < 8; i++) { + out[i] = BE32(hash->s[i]); + hash->s[i] = 0; + } + memcpy(out32, (const unsigned char*)out, 32); +} + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256 *hash, const unsigned char *key, size_t keylen) { + size_t n; + unsigned char rkey[64]; + if (keylen <= sizeof(rkey)) { + memcpy(rkey, key, keylen); + memset(rkey + keylen, 0, sizeof(rkey) - keylen); + } else { + secp256k1_sha256 sha256; + secp256k1_sha256_initialize(&sha256); + secp256k1_sha256_write(&sha256, key, keylen); + secp256k1_sha256_finalize(&sha256, rkey); + memset(rkey + 32, 0, 32); + } + + secp256k1_sha256_initialize(&hash->outer); + for (n = 0; n < sizeof(rkey); n++) { + rkey[n] ^= 0x5c; + } + secp256k1_sha256_write(&hash->outer, rkey, sizeof(rkey)); + + secp256k1_sha256_initialize(&hash->inner); + for (n = 0; n < sizeof(rkey); n++) { + rkey[n] ^= 0x5c ^ 0x36; + } + secp256k1_sha256_write(&hash->inner, rkey, sizeof(rkey)); + memset(rkey, 0, sizeof(rkey)); +} + +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256 *hash, const unsigned char *data, size_t size) { + secp256k1_sha256_write(&hash->inner, data, size); +} + +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256 *hash, unsigned char *out32) { + unsigned char temp[32]; + secp256k1_sha256_finalize(&hash->inner, temp); + secp256k1_sha256_write(&hash->outer, temp, 32); + memset(temp, 0, 32); + secp256k1_sha256_finalize(&hash->outer, out32); +} + + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256 *rng, const unsigned char *key, size_t keylen) { + secp256k1_hmac_sha256 hmac; + static const unsigned char zero[1] = {0x00}; + static const unsigned char one[1] = {0x01}; + + memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */ + memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */ + + /* RFC6979 3.2.d. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + + /* RFC6979 3.2.f. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, one, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + rng->retry = 0; +} + +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256 *rng, unsigned char *out, size_t outlen) { + /* RFC6979 3.2.h. */ + static const unsigned char zero[1] = {0x00}; + if (rng->retry) { + secp256k1_hmac_sha256 hmac; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + } + + while (outlen > 0) { + secp256k1_hmac_sha256 hmac; + int now = outlen; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + if (now > 32) { + now = 32; + } + memcpy(out, rng->v, now); + out += now; + outlen -= now; + } + + rng->retry = 1; +} + +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256 *rng) { + memset(rng->k, 0, 32); + memset(rng->v, 0, 32); + rng->retry = 0; +} + +#undef BE32 +#undef Round +#undef sigma1 +#undef sigma0 +#undef Sigma1 +#undef Sigma0 +#undef Maj +#undef Ch + +#endif /* SECP256K1_HASH_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java new file mode 100644 index 00000000..1c67802f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java @@ -0,0 +1,446 @@ +/* + * Copyright 2013 Google Inc. + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import java.math.BigInteger; +import com.google.common.base.Preconditions; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import static org.bitcoin.NativeSecp256k1Util.*; + +/** + *

This class holds native methods to handle ECDSA verification.

+ * + *

You can find an example library that can be used for this at https://github.com/bitcoin/secp256k1

+ * + *

To build secp256k1 for use with bitcoinj, run + * `./configure --enable-jni --enable-experimental --enable-module-ecdh` + * and `make` then copy `.libs/libsecp256k1.so` to your system library path + * or point the JVM to the folder containing it with -Djava.library.path + *

+ */ +public class NativeSecp256k1 { + + private static final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); + private static final Lock r = rwl.readLock(); + private static final Lock w = rwl.writeLock(); + private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); + /** + * Verifies the given secp256k1 signature in native code. + * Calling when enabled == false is undefined (probably library not loaded) + * + * @param data The data which was signed, must be exactly 32 bytes + * @param signature The signature + * @param pub The public key which did the signing + */ + public static boolean verify(byte[] data, byte[] signature, byte[] pub) throws AssertFailException{ + Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 520) { + byteBuff = ByteBuffer.allocateDirect(520); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.put(signature); + byteBuff.put(pub); + + byte[][] retByteArray; + + r.lock(); + try { + return secp256k1_ecdsa_verify(byteBuff, Secp256k1Context.getContext(), signature.length, pub.length) == 1; + } finally { + r.unlock(); + } + } + + /** + * libsecp256k1 Create an ECDSA signature. + * + * @param data Message hash, 32 bytes + * @param key Secret key, 32 bytes + * + * Return values + * @param sig byte array of signature + */ + public static byte[] sign(byte[] data, byte[] sec) throws AssertFailException{ + Preconditions.checkArgument(data.length == 32 && sec.length <= 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + 32) { + byteBuff = ByteBuffer.allocateDirect(32 + 32); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.put(sec); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ecdsa_sign(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] sigArr = retByteArray[0]; + int sigLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(sigArr.length, sigLen, "Got bad signature length."); + + return retVal == 0 ? new byte[0] : sigArr; + } + + /** + * libsecp256k1 Seckey Verify - returns 1 if valid, 0 if invalid + * + * @param seckey ECDSA Secret key, 32 bytes + */ + public static boolean secKeyVerify(byte[] seckey) { + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + r.lock(); + try { + return secp256k1_ec_seckey_verify(byteBuff,Secp256k1Context.getContext()) == 1; + } finally { + r.unlock(); + } + } + + + /** + * libsecp256k1 Compute Pubkey - computes public key from secret key + * + * @param seckey ECDSA Secret key, 32 bytes + * + * Return values + * @param pubkey ECDSA Public key, 33 or 65 bytes + */ + //TODO add a 'compressed' arg + public static byte[] computePubkey(byte[] seckey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seckey.length) { + byteBuff = ByteBuffer.allocateDirect(seckey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + + byte[][] retByteArray; + + r.lock(); + try { + retByteArray = secp256k1_ec_pubkey_create(byteBuff, Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + int pubLen = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + return retVal == 0 ? new byte[0]: pubArr; + } + + /** + * libsecp256k1 Cleanup - This destroys the secp256k1 context object + * This should be called at the end of the program for proper cleanup of the context. + */ + public static synchronized void cleanup() { + w.lock(); + try { + secp256k1_destroy_context(Secp256k1Context.getContext()); + } finally { + w.unlock(); + } + } + + public static long cloneContext() { + r.lock(); + try { + return secp256k1_ctx_clone(Secp256k1Context.getContext()); + } finally { r.unlock(); } + } + + /** + * libsecp256k1 PrivKey Tweak-Mul - Tweak privkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakMul(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_mul(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PrivKey Tweak-Add - Tweak privkey by adding to it + * + * @param tweak some bytes to tweak with + * @param seckey 32-byte seckey + */ + public static byte[] privKeyTweakAdd(byte[] privkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(privkey.length == 32); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < privkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(privkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(privkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_privkey_tweak_add(byteBuff,Secp256k1Context.getContext()); + } finally { + r.unlock(); + } + + byte[] privArr = retByteArray[0]; + + int privLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(privArr.length, privLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return privArr; + } + + /** + * libsecp256k1 PubKey Tweak-Add - Tweak pubkey by adding to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakAdd(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_add(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 PubKey Tweak-Mul - Tweak pubkey by multiplying to it + * + * @param tweak some bytes to tweak with + * @param pubkey 32-byte seckey + */ + public static byte[] pubKeyTweakMul(byte[] pubkey, byte[] tweak) throws AssertFailException{ + Preconditions.checkArgument(pubkey.length == 33 || pubkey.length == 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < pubkey.length + tweak.length) { + byteBuff = ByteBuffer.allocateDirect(pubkey.length + tweak.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(pubkey); + byteBuff.put(tweak); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_pubkey_tweak_mul(byteBuff,Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] pubArr = retByteArray[0]; + + int pubLen = (byte) new BigInteger(new byte[] { retByteArray[1][0] }).intValue() & 0xFF; + int retVal = new BigInteger(new byte[] { retByteArray[1][1] }).intValue(); + + assertEquals(pubArr.length, pubLen, "Got bad pubkey length."); + + assertEquals(retVal, 1, "Failed return value check."); + + return pubArr; + } + + /** + * libsecp256k1 create ECDH secret - constant time ECDH calculation + * + * @param seckey byte array of secret key used in exponentiaion + * @param pubkey byte array of public key used in exponentiaion + */ + public static byte[] createECDHSecret(byte[] seckey, byte[] pubkey) throws AssertFailException{ + Preconditions.checkArgument(seckey.length <= 32 && pubkey.length <= 65); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < 32 + pubkey.length) { + byteBuff = ByteBuffer.allocateDirect(32 + pubkey.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seckey); + byteBuff.put(pubkey); + + byte[][] retByteArray; + r.lock(); + try { + retByteArray = secp256k1_ecdh(byteBuff, Secp256k1Context.getContext(), pubkey.length); + } finally { + r.unlock(); + } + + byte[] resArr = retByteArray[0]; + int retVal = new BigInteger(new byte[] { retByteArray[1][0] }).intValue(); + + assertEquals(resArr.length, 32, "Got bad result length."); + assertEquals(retVal, 1, "Failed return value check."); + + return resArr; + } + + /** + * libsecp256k1 randomize - updates the context randomization + * + * @param seed 32-byte random seed + */ + public static synchronized boolean randomize(byte[] seed) throws AssertFailException{ + Preconditions.checkArgument(seed.length == 32 || seed == null); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null || byteBuff.capacity() < seed.length) { + byteBuff = ByteBuffer.allocateDirect(seed.length); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(seed); + + w.lock(); + try { + return secp256k1_context_randomize(byteBuff, Secp256k1Context.getContext()) == 1; + } finally { + w.unlock(); + } + } + + private static native long secp256k1_ctx_clone(long context); + + private static native int secp256k1_context_randomize(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_add(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_privkey_tweak_mul(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_pubkey_tweak_add(ByteBuffer byteBuff, long context, int pubLen); + + private static native byte[][] secp256k1_pubkey_tweak_mul(ByteBuffer byteBuff, long context, int pubLen); + + private static native void secp256k1_destroy_context(long context); + + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff, long context, int sigLen, int pubLen); + + private static native byte[][] secp256k1_ecdsa_sign(ByteBuffer byteBuff, long context); + + private static native int secp256k1_ec_seckey_verify(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_create(ByteBuffer byteBuff, long context); + + private static native byte[][] secp256k1_ec_pubkey_parse(ByteBuffer byteBuff, long context, int inputLen); + + private static native byte[][] secp256k1_ecdh(ByteBuffer byteBuff, long context, int inputLen); + +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java new file mode 100644 index 00000000..d766a102 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Test.java @@ -0,0 +1,226 @@ +package org.bitcoin; + +import com.google.common.io.BaseEncoding; +import java.util.Arrays; +import java.math.BigInteger; +import javax.xml.bind.DatatypeConverter; +import static org.bitcoin.NativeSecp256k1Util.*; + +/** + * This class holds test cases defined for testing this library. + */ +public class NativeSecp256k1Test { + + //TODO improve comments/add more tests + /** + * This tests verify() for a valid signature + */ + public static void testVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + assertEquals( result, true , "testVerifyPos"); + } + + /** + * This tests verify() for a non-valid signature + */ + public static void testVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A91".toLowerCase()); //sha256hash of "testing" + byte[] sig = BaseEncoding.base16().lowerCase().decode("3044022079BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F817980220294F14E883B3F525B5367756C2A11EF6CF84B730B36C17CB0C56F0AAB2C98589".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + result = NativeSecp256k1.verify( data, sig, pub); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testVerifyNeg"); + } + + /** + * This tests secret key verify() for a valid secretkey + */ + public static void testSecKeyVerifyPos() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, true , "testSecKeyVerifyPos"); + } + + /** + * This tests secret key verify() for an invalid secretkey + */ + public static void testSecKeyVerifyNeg() throws AssertFailException{ + boolean result = false; + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + result = NativeSecp256k1.secKeyVerify( sec ); + //System.out.println(" TEST " + new BigInteger(1, resultbytes).toString(16)); + assertEquals( result, false , "testSecKeyVerifyNeg"); + } + + /** + * This tests public key create() for a valid secretkey + */ + public static void testPubKeyCreatePos() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString , "04C591A8FF19AC9C4E4E5793673B83123437E975285E7B442F4EE2654DFFCA5E2D2103ED494718C697AC9AEBCFD19612E224DB46661011863ED2FC54E71861E2A6" , "testPubKeyCreatePos"); + } + + /** + * This tests public key create() for a invalid secretkey + */ + public static void testPubKeyCreateNeg() throws AssertFailException{ + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.computePubkey( sec); + String pubkeyString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( pubkeyString, "" , "testPubKeyCreateNeg"); + } + + /** + * This tests sign() for a valid secretkey + */ + public static void testSignPos() throws AssertFailException{ + + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "30440220182A108E1448DC8F1FB467D06A0F3BB8EA0533584CB954EF8DA112F1D60E39A202201C66F36DA211C087F3AF88B50EDF4F9BDAA6CF5FD6817E74DCA34DB12390C6E9" , "testSignPos"); + } + + /** + * This tests sign() for a invalid secretkey + */ + public static void testSignNeg() throws AssertFailException{ + byte[] data = BaseEncoding.base16().lowerCase().decode("CF80CD8AED482D5D1527D7DC72FCEFF84E6326592848447D2DC0B0E87DFC9A90".toLowerCase()); //sha256hash of "testing" + byte[] sec = BaseEncoding.base16().lowerCase().decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.sign(data, sec); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString, "" , "testSignNeg"); + } + + /** + * This tests private key tweak-add + */ + public static void testPrivKeyTweakAdd_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakAdd( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "A168571E189E6F9A7E2D657A4B53AE99B909F7E712D1C23CED28093CD57C88F3" , "testPrivKeyAdd_1"); + } + + /** + * This tests private key tweak-mul + */ + public static void testPrivKeyTweakMul_1() throws AssertFailException { + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.privKeyTweakMul( sec , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "97F8184235F101550F3C71C927507651BD3F1CDB4A5A33B8986ACF0DEE20FFFC" , "testPrivKeyMul_1"); + } + + /** + * This tests private key tweak-add uncompressed + */ + public static void testPrivKeyTweakAdd_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakAdd( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "0411C6790F4B663CCE607BAAE08C43557EDC1A4D11D88DFCB3D841D0C6A941AF525A268E2A863C148555C48FB5FBA368E88718A46E205FABC3DBA2CCFFAB0796EF" , "testPrivKeyAdd_2"); + } + + /** + * This tests private key tweak-mul uncompressed + */ + public static void testPrivKeyTweakMul_2() throws AssertFailException { + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + byte[] data = BaseEncoding.base16().lowerCase().decode("3982F19BEF1615BCCFBB05E321C10E1D4CBA3DF0E841C2E41EEB6016347653C3".toLowerCase()); //sha256hash of "tweak" + + byte[] resultArr = NativeSecp256k1.pubKeyTweakMul( pub , data ); + String sigString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( sigString , "04E0FE6FE55EBCA626B98A807F6CAF654139E14E5E3698F01A9A658E21DC1D2791EC060D4F412A794D5370F672BC94B722640B5F76914151CFCA6E712CA48CC589" , "testPrivKeyMul_2"); + } + + /** + * This tests seed randomization + */ + public static void testRandomize() throws AssertFailException { + byte[] seed = BaseEncoding.base16().lowerCase().decode("A441B15FE9A3CF56661190A0B93B9DEC7D04127288CC87250967CF3B52894D11".toLowerCase()); //sha256hash of "random" + boolean result = NativeSecp256k1.randomize(seed); + assertEquals( result, true, "testRandomize"); + } + + public static void testCreateECDHSecret() throws AssertFailException{ + + byte[] sec = BaseEncoding.base16().lowerCase().decode("67E56582298859DDAE725F972992A07C6C4FB9F62A8FFF58CE3CA926A1063530".toLowerCase()); + byte[] pub = BaseEncoding.base16().lowerCase().decode("040A629506E1B65CD9D2E0BA9C75DF9C4FED0DB16DC9625ED14397F0AFC836FAE595DC53F8B0EFE61E703075BD9B143BAC75EC0E19F82A2208CAEB32BE53414C40".toLowerCase()); + + byte[] resultArr = NativeSecp256k1.createECDHSecret(sec, pub); + String ecdhString = javax.xml.bind.DatatypeConverter.printHexBinary(resultArr); + assertEquals( ecdhString, "2A2A67007A926E6594AF3EB564FC74005B37A9C8AEF2033C4552051B5C87F043" , "testCreateECDHSecret"); + } + + public static void main(String[] args) throws AssertFailException{ + + + System.out.println("\n libsecp256k1 enabled: " + Secp256k1Context.isEnabled() + "\n"); + + assertEquals( Secp256k1Context.isEnabled(), true, "isEnabled" ); + + //Test verify() success/fail + testVerifyPos(); + testVerifyNeg(); + + //Test secKeyVerify() success/fail + testSecKeyVerifyPos(); + testSecKeyVerifyNeg(); + + //Test computePubkey() success/fail + testPubKeyCreatePos(); + testPubKeyCreateNeg(); + + //Test sign() success/fail + testSignPos(); + testSignNeg(); + + //Test privKeyTweakAdd() 1 + testPrivKeyTweakAdd_1(); + + //Test privKeyTweakMul() 2 + testPrivKeyTweakMul_1(); + + //Test privKeyTweakAdd() 3 + testPrivKeyTweakAdd_2(); + + //Test privKeyTweakMul() 4 + testPrivKeyTweakMul_2(); + + //Test randomize() + testRandomize(); + + //Test ECDH + testCreateECDHSecret(); + + NativeSecp256k1.cleanup(); + + System.out.println(" All tests passed." ); + + } +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java new file mode 100644 index 00000000..04732ba0 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/NativeSecp256k1Util.java @@ -0,0 +1,45 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +public class NativeSecp256k1Util{ + + public static void assertEquals( int val, int val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + } + + public static void assertEquals( boolean val, boolean val2, String message ) throws AssertFailException{ + if( val != val2 ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static void assertEquals( String val, String val2, String message ) throws AssertFailException{ + if( !val.equals(val2) ) + throw new AssertFailException("FAIL: " + message); + else + System.out.println("PASS: " + message); + } + + public static class AssertFailException extends Exception { + public AssertFailException(String message) { + super( message ); + } + } +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/Secp256k1Context.java b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/Secp256k1Context.java new file mode 100644 index 00000000..216c986a --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org/bitcoin/Secp256k1Context.java @@ -0,0 +1,51 @@ +/* + * Copyright 2014-2016 the libsecp256k1 contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.bitcoin; + +/** + * This class holds the context reference used in native methods + * to handle ECDSA operations. + */ +public class Secp256k1Context { + private static final boolean enabled; //true if the library is loaded + private static final long context; //ref to pointer to context obj + + static { //static initializer + boolean isEnabled = true; + long contextRef = -1; + try { + System.loadLibrary("secp256k1"); + contextRef = secp256k1_init_context(); + } catch (UnsatisfiedLinkError e) { + System.out.println("UnsatisfiedLinkError: " + e.toString()); + isEnabled = false; + } + enabled = isEnabled; + context = contextRef; + } + + public static boolean isEnabled() { + return enabled; + } + + public static long getContext() { + if(!enabled) return -1; //sanity check + return context; + } + + private static native long secp256k1_init_context(); +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c new file mode 100644 index 00000000..bcef7b32 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c @@ -0,0 +1,377 @@ +#include +#include +#include +#include "org_bitcoin_NativeSecp256k1.h" +#include "include/secp256k1.h" +#include "include/secp256k1_ecdh.h" +#include "include/secp256k1_recovery.h" + + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv* env, jclass classObject, jlong ctx_l) +{ + const secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + jlong ctx_clone_l = (uintptr_t) secp256k1_context_clone(ctx); + + (void)classObject;(void)env; + + return ctx_clone_l; + +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + const unsigned char* seed = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_context_randomize(ctx, seed); + +} + +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv* env, jclass classObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + secp256k1_context_destroy(ctx); + + (void)classObject;(void)env; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint siglen, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* sigdata = { (unsigned char*) (data + 32) }; + const unsigned char* pubdata = { (unsigned char*) (data + siglen + 32) }; + + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pubkey; + + int ret = secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigdata, siglen); + + if( ret ) { + ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if( ret ) { + ret = secp256k1_ecdsa_verify(ctx, &sig, data, &pubkey); + } + } + + (void)classObject; + + return ret; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + unsigned char* secKey = (unsigned char*) (data + 32); + + jobjectArray retArray; + jbyteArray sigArray, intsByteArray; + unsigned char intsarray[2]; + + secp256k1_ecdsa_signature sig[72]; + + int ret = secp256k1_ecdsa_sign(ctx, sig, data, secKey, NULL, NULL ); + + unsigned char outputSer[72]; + size_t outputLen = 72; + + if( ret ) { + int ret2 = secp256k1_ecdsa_signature_serialize_der(ctx,outputSer, &outputLen, sig ); (void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + sigArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, sigArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, sigArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + (void)classObject; + + return secp256k1_ec_seckey_verify(ctx, secKey); +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secKey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + + secp256k1_pubkey pubkey; + + jobjectArray retArray; + jbyteArray pubkeyArray, intsByteArray; + unsigned char intsarray[2]; + + int ret = secp256k1_ec_pubkey_create(ctx, &pubkey, secKey); + + unsigned char outputSer[65]; + size_t outputLen = 65; + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubkeyArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubkeyArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubkeyArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; + +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_add(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* privkey = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (privkey + 32); + + jobjectArray retArray; + jbyteArray privArray, intsByteArray; + unsigned char intsarray[2]; + + int privkeylen = 32; + + int ret = secp256k1_ec_privkey_tweak_mul(ctx, privkey, tweak); + + intsarray[0] = privkeylen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + privArray = (*env)->NewByteArray(env, privkeylen); + (*env)->SetByteArrayRegion(env, privArray, 0, privkeylen, (jbyte*)privkey); + (*env)->SetObjectArrayElement(env, retArray, 0, privArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; +/* secp256k1_pubkey* pubkey = (secp256k1_pubkey*) (*env)->GetDirectBufferAddress(env, byteBufferObject);*/ + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if( ret ) { + ret = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + unsigned char* pkey = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* tweak = (unsigned char*) (pkey + publen); + + jobjectArray retArray; + jbyteArray pubArray, intsByteArray; + unsigned char intsarray[2]; + unsigned char outputSer[65]; + size_t outputLen = 65; + + secp256k1_pubkey pubkey; + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pkey, publen); + + if ( ret ) { + ret = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, tweak); + } + + if( ret ) { + int ret2 = secp256k1_ec_pubkey_serialize(ctx,outputSer, &outputLen, &pubkey,SECP256K1_EC_UNCOMPRESSED );(void)ret2; + } + + intsarray[0] = outputLen; + intsarray[1] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + pubArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, pubArray, 0, outputLen, (jbyte*)outputSer); + (*env)->SetObjectArrayElement(env, retArray, 0, pubArray); + + intsByteArray = (*env)->NewByteArray(env, 2); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 2, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} + +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1pubkey_1combine + (JNIEnv * env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint numkeys) +{ + (void)classObject;(void)env;(void)byteBufferObject;(void)ctx_l;(void)numkeys; + + return 0; +} + +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen) +{ + secp256k1_context *ctx = (secp256k1_context*)(uintptr_t)ctx_l; + const unsigned char* secdata = (*env)->GetDirectBufferAddress(env, byteBufferObject); + const unsigned char* pubdata = (const unsigned char*) (secdata + 32); + + jobjectArray retArray; + jbyteArray outArray, intsByteArray; + unsigned char intsarray[1]; + secp256k1_pubkey pubkey; + unsigned char nonce_res[32]; + size_t outputLen = 32; + + int ret = secp256k1_ec_pubkey_parse(ctx, &pubkey, pubdata, publen); + + if (ret) { + ret = secp256k1_ecdh( + ctx, + nonce_res, + &pubkey, + secdata + ); + } + + intsarray[0] = ret; + + retArray = (*env)->NewObjectArray(env, 2, + (*env)->FindClass(env, "[B"), + (*env)->NewByteArray(env, 1)); + + outArray = (*env)->NewByteArray(env, outputLen); + (*env)->SetByteArrayRegion(env, outArray, 0, 32, (jbyte*)nonce_res); + (*env)->SetObjectArrayElement(env, retArray, 0, outArray); + + intsByteArray = (*env)->NewByteArray(env, 1); + (*env)->SetByteArrayRegion(env, intsByteArray, 0, 1, (jbyte*)intsarray); + (*env)->SetObjectArrayElement(env, retArray, 1, intsByteArray); + + (void)classObject; + + return retArray; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h new file mode 100644 index 00000000..665cf4dd --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h @@ -0,0 +1,119 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "secp256k1.h" +/* Header for class org_bitcoin_NativeSecp256k1 */ + +#ifndef _Included_org_bitcoin_NativeSecp256k1 +#define _Included_org_bitcoin_NativeSecp256k1 +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ctx_clone + * Signature: (J)J + */ +SECP256K1_API jlong JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ctx_1clone + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_context_randomize + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1context_1randomize + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_privkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1privkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_add + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1add + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_pubkey_tweak_mul + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1pubkey_1tweak_1mul + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_destroy_context + * Signature: (J)V + */ +SECP256K1_API void JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1destroy_1context + (JNIEnv *, jclass, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;JII)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject, jlong, jint, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_sign + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1sign + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_seckey_verify + * Signature: (Ljava/nio/ByteBuffer;J)I + */ +SECP256K1_API jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1seckey_1verify + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_create + * Signature: (Ljava/nio/ByteBuffer;J)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1create + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ec_pubkey_parse + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ec_1pubkey_1parse + (JNIEnv *, jclass, jobject, jlong, jint); + +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdh + * Signature: (Ljava/nio/ByteBuffer;JI)[[B + */ +SECP256K1_API jobjectArray JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdh + (JNIEnv* env, jclass classObject, jobject byteBufferObject, jlong ctx_l, jint publen); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.c new file mode 100644 index 00000000..a52939e7 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.c @@ -0,0 +1,15 @@ +#include +#include +#include "org_bitcoin_Secp256k1Context.h" +#include "include/secp256k1.h" + +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv* env, jclass classObject) +{ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + (void)classObject;(void)env; + + return (uintptr_t)ctx; +} + diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.h new file mode 100644 index 00000000..f1ed91ad --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/java/org_bitcoin_Secp256k1Context.h @@ -0,0 +1,22 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +#include "secp256k1.h" +/* Header for class org_bitcoin_Secp256k1Context */ + +#ifndef _Included_org_bitcoin_Secp256k1Context +#define _Included_org_bitcoin_Secp256k1Context +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_Secp256k1Context + * Method: secp256k1_init_context + * Signature: ()J + */ +SECP256K1_API jlong JNICALL Java_org_bitcoin_Secp256k1Context_secp256k1_1init_1context + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/Makefile.am.include b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/Makefile.am.include new file mode 100644 index 00000000..e3088b46 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_ecdh.h +noinst_HEADERS += src/modules/ecdh/main_impl.h +noinst_HEADERS += src/modules/ecdh/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_ecdh +bench_ecdh_SOURCES = src/bench_ecdh.c +bench_ecdh_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/main_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/main_impl.h new file mode 100644 index 00000000..85602208 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/main_impl.h @@ -0,0 +1,54 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_ECDH_MAIN_H +#define SECP256K1_MODULE_ECDH_MAIN_H + +#include "secp256k1_ecdh.h" +#include "ecmult_const_impl.h" + +int secp256k1_ecdh(const secp256k1_context* ctx, unsigned char *result, const secp256k1_pubkey *point, const unsigned char *scalar) { + int ret = 0; + int overflow = 0; + secp256k1_gej res; + secp256k1_ge pt; + secp256k1_scalar s; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(result != NULL); + ARG_CHECK(point != NULL); + ARG_CHECK(scalar != NULL); + + secp256k1_pubkey_load(ctx, &pt, point); + secp256k1_scalar_set_b32(&s, scalar, &overflow); + if (overflow || secp256k1_scalar_is_zero(&s)) { + ret = 0; + } else { + unsigned char x[32]; + unsigned char y[1]; + secp256k1_sha256 sha; + + secp256k1_ecmult_const(&res, &pt, &s, 256); + secp256k1_ge_set_gej(&pt, &res); + /* Compute a hash of the point in compressed form + * Note we cannot use secp256k1_eckey_pubkey_serialize here since it does not + * expect its output to be secret and has a timing sidechannel. */ + secp256k1_fe_normalize(&pt.x); + secp256k1_fe_normalize(&pt.y); + secp256k1_fe_get_b32(x, &pt.x); + y[0] = 0x02 | secp256k1_fe_is_odd(&pt.y); + + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, y, sizeof(y)); + secp256k1_sha256_write(&sha, x, sizeof(x)); + secp256k1_sha256_finalize(&sha, result); + ret = 1; + } + + secp256k1_scalar_clear(&s); + return ret; +} + +#endif /* SECP256K1_MODULE_ECDH_MAIN_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/tests_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/tests_impl.h new file mode 100644 index 00000000..0c53f8ee --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/ecdh/tests_impl.h @@ -0,0 +1,105 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_ECDH_TESTS_H +#define SECP256K1_MODULE_ECDH_TESTS_H + +void test_ecdh_api(void) { + /* Setup context that just counts errors */ + secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_pubkey point; + unsigned char res[32]; + unsigned char s_one[32] = { 0 }; + int32_t ecount = 0; + s_one[31] = 1; + + secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1); + + /* Check all NULLs are detected */ + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdh(tctx, res, NULL, s_one) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdh(tctx, res, &point, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdh(tctx, res, &point, s_one) == 1); + CHECK(ecount == 3); + + /* Cleanup */ + secp256k1_context_destroy(tctx); +} + +void test_ecdh_generator_basepoint(void) { + unsigned char s_one[32] = { 0 }; + secp256k1_pubkey point[2]; + int i; + + s_one[31] = 1; + /* Check against pubkey creation when the basepoint is the generator */ + for (i = 0; i < 100; ++i) { + secp256k1_sha256 sha; + unsigned char s_b32[32]; + unsigned char output_ecdh[32]; + unsigned char output_ser[32]; + unsigned char point_ser[33]; + size_t point_ser_len = sizeof(point_ser); + secp256k1_scalar s; + + random_scalar_order(&s); + secp256k1_scalar_get_b32(s_b32, &s); + + /* compute using ECDH function */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[0], s_one) == 1); + CHECK(secp256k1_ecdh(ctx, output_ecdh, &point[0], s_b32) == 1); + /* compute "explicitly" */ + CHECK(secp256k1_ec_pubkey_create(ctx, &point[1], s_b32) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, point_ser, &point_ser_len, &point[1], SECP256K1_EC_COMPRESSED) == 1); + CHECK(point_ser_len == sizeof(point_ser)); + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, point_ser, point_ser_len); + secp256k1_sha256_finalize(&sha, output_ser); + /* compare */ + CHECK(memcmp(output_ecdh, output_ser, sizeof(output_ser)) == 0); + } +} + +void test_bad_scalar(void) { + unsigned char s_zero[32] = { 0 }; + unsigned char s_overflow[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + unsigned char s_rand[32] = { 0 }; + unsigned char output[32]; + secp256k1_scalar rand; + secp256k1_pubkey point; + + /* Create random point */ + random_scalar_order(&rand); + secp256k1_scalar_get_b32(s_rand, &rand); + CHECK(secp256k1_ec_pubkey_create(ctx, &point, s_rand) == 1); + + /* Try to multiply it by bad values */ + CHECK(secp256k1_ecdh(ctx, output, &point, s_zero) == 0); + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 0); + /* ...and a good one */ + s_overflow[31] -= 1; + CHECK(secp256k1_ecdh(ctx, output, &point, s_overflow) == 1); +} + +void run_ecdh_tests(void) { + test_ecdh_api(); + test_ecdh_generator_basepoint(); + test_bad_scalar(); +} + +#endif /* SECP256K1_MODULE_ECDH_TESTS_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/Makefile.am.include b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/Makefile.am.include new file mode 100644 index 00000000..bf23c26e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/Makefile.am.include @@ -0,0 +1,8 @@ +include_HEADERS += include/secp256k1_recovery.h +noinst_HEADERS += src/modules/recovery/main_impl.h +noinst_HEADERS += src/modules/recovery/tests_impl.h +if USE_BENCHMARK +noinst_PROGRAMS += bench_recover +bench_recover_SOURCES = src/bench_recover.c +bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) $(COMMON_LIB) +endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/main_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/main_impl.h new file mode 100755 index 00000000..1abe509f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/main_impl.h @@ -0,0 +1,193 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_RECOVERY_MAIN_H +#define SECP256K1_MODULE_RECOVERY_MAIN_H + +#include "secp256k1_recovery.h" + +static void secp256k1_ecdsa_recoverable_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, int* recid, const secp256k1_ecdsa_recoverable_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } + *recid = sig->data[64]; +} + +static void secp256k1_ecdsa_recoverable_signature_save(secp256k1_ecdsa_recoverable_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s, int recid) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } + sig->data[64] = recid; +} + +int secp256k1_ecdsa_recoverable_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature* sig, const unsigned char *input64, int recid) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + ARG_CHECK(recid >= 0 && recid <= 3); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(sig, &r, &s, recid); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature* sig) { + secp256k1_scalar r, s; + + (void)ctx; + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(recid != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, recid, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_recoverable_signature_convert(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const secp256k1_ecdsa_recoverable_signature* sigin) { + secp256k1_scalar r, s; + int recid; + + (void)ctx; + ARG_CHECK(sig != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, sigin); + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context *ctx, const secp256k1_scalar *sigr, const secp256k1_scalar* sigs, secp256k1_ge *pubkey, const secp256k1_scalar *message, int recid) { + unsigned char brx[32]; + secp256k1_fe fx; + secp256k1_ge x; + secp256k1_gej xj; + secp256k1_scalar rn, u1, u2; + secp256k1_gej qj; + int r; + + if (secp256k1_scalar_is_zero(sigr) || secp256k1_scalar_is_zero(sigs)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, sigr); + r = secp256k1_fe_set_b32(&fx, brx); + (void)r; + VERIFY_CHECK(r); /* brx comes from a scalar, so is less than the order; certainly less than p */ + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, sigr); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, sigs); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} + +int secp256k1_ecdsa_sign_recoverable(const secp256k1_context* ctx, secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; + int recid; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, &recid)) { + break; + } + } + count++; + } + memset(nonce32, 0, 32); + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (ret) { + secp256k1_ecdsa_recoverable_signature_save(signature, &r, &s, recid); + } else { + memset(signature, 0, sizeof(*signature)); + } + return ret; +} + +int secp256k1_ecdsa_recover(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const secp256k1_ecdsa_recoverable_signature *signature, const unsigned char *msg32) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + int recid; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(pubkey != NULL); + + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, signature); + VERIFY_CHECK(recid >= 0 && recid < 4); /* should have been caught in parse_compact */ + secp256k1_scalar_set_b32(&m, msg32, NULL); + if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &r, &s, &q, &m, recid)) { + secp256k1_pubkey_save(pubkey, &q); + return 1; + } else { + memset(pubkey, 0, sizeof(*pubkey)); + return 0; + } +} + +#endif /* SECP256K1_MODULE_RECOVERY_MAIN_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/tests_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/tests_impl.h new file mode 100644 index 00000000..5c9bbe86 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/modules/recovery/tests_impl.h @@ -0,0 +1,393 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_MODULE_RECOVERY_TESTS_H +#define SECP256K1_MODULE_RECOVERY_TESTS_H + +static int recovery_test_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + (void) msg32; + (void) key32; + (void) algo16; + (void) data; + + /* On the first run, return 0 to force a second run */ + if (counter == 0) { + memset(nonce32, 0, 32); + return 1; + } + /* On the second run, return an overflow to force a third run */ + if (counter == 1) { + memset(nonce32, 0xff, 32); + return 1; + } + /* On the next run, return a valid nonce, but flip a coin as to whether or not to fail signing. */ + memset(nonce32, 1, 32); + return secp256k1_rand_bits(1); +} + +void test_ecdsa_recovery_api(void) { + /* Setup contexts that just count errors */ + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + secp256k1_ecdsa_signature normal_sig; + secp256k1_ecdsa_recoverable_signature recsig; + unsigned char privkey[32] = { 1 }; + unsigned char message[32] = { 2 }; + int32_t ecount = 0; + int recid = 0; + unsigned char sig[74]; + unsigned char zero_privkey[32] = { 0 }; + unsigned char over_privkey[32] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + + secp256k1_context_set_error_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_error_callback(both, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(both, counting_illegal_callback_fn, &ecount); + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Check bad contexts and NULLs for signing */ + ecount = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(none, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(sign, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(vrfy, &recsig, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign_recoverable(both, NULL, message, privkey, NULL, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, NULL, privkey, NULL, NULL) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, NULL, NULL, NULL) == 0); + CHECK(ecount == 5); + /* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */ + secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, recovery_test_nonce_function, NULL); + CHECK(ecount == 5); + /* These will all fail, but not in ARG_CHECK way */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, zero_privkey, NULL, NULL) == 0); + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, over_privkey, NULL, NULL) == 0); + /* This one will succeed. */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + CHECK(ecount == 5); + + /* Check signing with a goofy nonce function */ + + /* Check bad contexts and NULLs for recovery */ + ecount = 0; + CHECK(secp256k1_ecdsa_recover(none, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recover(sign, &recpubkey, &recsig, message) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(vrfy, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, message) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recover(both, NULL, &recsig, message) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, NULL, message) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recover(both, &recpubkey, &recsig, NULL) == 0); + CHECK(ecount == 5); + + /* Check NULLs for conversion */ + CHECK(secp256k1_ecdsa_sign(both, &normal_sig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, NULL, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, NULL) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(both, &normal_sig, &recsig) == 1); + + /* Check NULLs for de/serialization */ + CHECK(secp256k1_ecdsa_sign_recoverable(both, &recsig, message, privkey, NULL, NULL) == 1); + ecount = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, NULL, &recid, &recsig) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, NULL, &recsig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(both, sig, &recid, &recsig) == 1); + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, NULL, sig, recid) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, NULL, recid) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, -1) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, 5) == 0); + CHECK(ecount == 7); + /* overflow in signature will fail but not affect ecount */ + memcpy(sig, over_privkey, 32); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(both, &recsig, sig, recid) == 0); + CHECK(ecount == 7); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); +} + +void test_ecdsa_recovery_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + secp256k1_ecdsa_signature signature[5]; + secp256k1_ecdsa_recoverable_signature rsignature[5]; + unsigned char sig[74]; + secp256k1_pubkey pubkey; + secp256k1_pubkey recpubkey; + int recid = 0; + + /* Generate a random key and message. */ + { + secp256k1_scalar msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Serialize/parse compact and verify/recover. */ + extra[0] = 0; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[1], message, privkey, NULL, extra) == 1); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[2], message, privkey, NULL, extra) == 1); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign_recoverable(ctx, &rsignature[3], message, privkey, NULL, extra) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(memcmp(&signature[4], &signature[0], 64) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + memset(&rsignature[4], 0, sizeof(rsignature[4])); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 1); + /* Parse compact (with recovery id) and recover. */ + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 1); + CHECK(memcmp(&pubkey, &recpubkey, sizeof(pubkey)) == 0); + /* Serialize/destroy/parse signature and verify again. */ + CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(ctx, sig, &recid, &rsignature[4]) == 1); + sig[secp256k1_rand_bits(6)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsignature[4], sig, recid) == 1); + CHECK(secp256k1_ecdsa_recoverable_signature_convert(ctx, &signature[4], &rsignature[4]) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[4], message, &pubkey) == 0); + /* Recover again */ + CHECK(secp256k1_ecdsa_recover(ctx, &recpubkey, &rsignature[4], message) == 0 || + memcmp(&pubkey, &recpubkey, sizeof(pubkey)) != 0); +} + +/* Tests several edge cases. */ +void test_ecdsa_recovery_edge_cases(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + /* Generated by signing the above message with nonce 'This is the nonce we will use...' + * and secret key 0 (which is not valid), resulting in recid 0. */ + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + secp256k1_pubkey pubkey; + /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ + const unsigned char sigb64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + secp256k1_pubkey pubkeyb; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + int recid; + + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 0)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 1)); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 2)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sig64, 3)); + CHECK(!secp256k1_ecdsa_recover(ctx, &pubkey, &rsig, msg32)); + + for (recid = 0; recid < 4; recid++) { + int i; + int recid2; + /* (4,4) encoded in DER. */ + unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; + unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; + unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; + unsigned char sigbderalt1[39] = { + 0x30, 0x25, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt2[39] = { + 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + unsigned char sigbderalt3[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt4[40] = { + 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + }; + /* (order + r,4) encoded in DER. */ + unsigned char sigbderlong[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, + 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, + 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 + }; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 1); + for (recid2 = 0; recid2 < 4; recid2++) { + secp256k1_pubkey pubkey2b; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigb64, recid2) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkey2b, &rsig, msg32) == 1); + /* Verifying with (order + r,4) should always fail. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderlong, sizeof(sigbderlong)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + /* DER parsing tests. */ + /* Zero length r/s. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zr, sizeof(sigcder_zr)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder_zs, sizeof(sigcder_zs)) == 0); + /* Leading zeros. */ + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt1, sizeof(sigbderalt1)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt2, sizeof(sigbderalt2)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 0); + sigbderalt3[4] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt3, sizeof(sigbderalt3)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbderalt4[7] = 1; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbderalt4, sizeof(sigbderalt4)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + /* Damage signature. */ + sigbder[7]++; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + sigbder[7]--; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, 6) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder) - 1) == 0); + for(i = 0; i < 8; i++) { + int c; + unsigned char orig = sigbder[i]; + /*Try every single-byte change.*/ + for (c = 0; c < 256; c++) { + if (c == orig ) { + continue; + } + sigbder[i] = c; + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigbder, sizeof(sigbder)) == 0 || secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyb) == 0); + } + sigbder[i] = orig; + } + } + + /* Test r/s equal to zero */ + { + /* (1,1) encoded in DER. */ + unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; + unsigned char sigc64[64] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + secp256k1_pubkey pubkeyc; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyc, &rsig, msg32) == 1); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 1); + sigcder[4] = 0; + sigc64[31] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + sigcder[4] = 1; + sigcder[7] = 0; + sigc64[31] = 1; + sigc64[63] = 0; + CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(ctx, &rsig, sigc64, 0) == 1); + CHECK(secp256k1_ecdsa_recover(ctx, &pubkeyb, &rsig, msg32) == 0); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, sigcder, sizeof(sigcder)) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg32, &pubkeyc) == 0); + } +} + +void run_recovery_tests(void) { + int i; + for (i = 0; i < count; i++) { + test_ecdsa_recovery_api(); + } + for (i = 0; i < 64*count; i++) { + test_ecdsa_recovery_end_to_end(); + } + test_ecdsa_recovery_edge_cases(); +} + +#endif /* SECP256K1_MODULE_RECOVERY_TESTS_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num.h new file mode 100644 index 00000000..3ed65d9c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num.h @@ -0,0 +1,72 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_NUM_H +#define SECP256K1_NUM_H + +#ifndef USE_NUM_NONE + +#include "../../secp256k1-config.h" + +#if defined(USE_NUM_GMP) +#include "num_gmp.h" +#else +#error "Please select num implementation" +#endif + +/** Copy a number. */ +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a); + +/** Convert a number's absolute value to a binary big-endian string. + * There must be enough place. */ +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a); + +/** Set a number to the value of a binary big-endian string. */ +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen); + +/** Compute a modular inverse. The input must be less than the modulus. */ +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m); + +/** Compute the jacobi symbol (a|b). b must be positive and odd. */ +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b); + +/** Compare the absolute value of two numbers. */ +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b); + +/** Test whether two number are equal (including sign). */ +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b); + +/** Add two (signed) numbers. */ +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); + +/** Subtract two (signed) numbers. */ +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); + +/** Multiply two (signed) numbers. */ +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b); + +/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, + even if r was negative. */ +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m); + +/** Right-shift the passed number by bits bits. */ +static void secp256k1_num_shift(secp256k1_num *r, int bits); + +/** Check whether a number is zero. */ +static int secp256k1_num_is_zero(const secp256k1_num *a); + +/** Check whether a number is one. */ +static int secp256k1_num_is_one(const secp256k1_num *a); + +/** Check whether a number is strictly negative. */ +static int secp256k1_num_is_neg(const secp256k1_num *a); + +/** Change a number's sign. */ +static void secp256k1_num_negate(secp256k1_num *r); + +#endif + +#endif /* SECP256K1_NUM_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp.h new file mode 100644 index 00000000..3619844b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp.h @@ -0,0 +1,20 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_NUM_REPR_H +#define SECP256K1_NUM_REPR_H + +#include + +#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) + +typedef struct { + mp_limb_t data[2*NUM_LIMBS]; + int neg; + int limbs; +} secp256k1_num; + +#endif /* SECP256K1_NUM_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp_impl.h new file mode 100644 index 00000000..0ae2a8ba --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_gmp_impl.h @@ -0,0 +1,288 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_NUM_REPR_IMPL_H +#define SECP256K1_NUM_REPR_IMPL_H + +#include +#include +#include + +#include "util.h" +#include "num.h" + +#ifdef VERIFY +static void secp256k1_num_sanity(const secp256k1_num *a) { + VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); +} +#else +#define secp256k1_num_sanity(a) do { } while(0) +#endif + +static void secp256k1_num_copy(secp256k1_num *r, const secp256k1_num *a) { + *r = *a; +} + +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a) { + unsigned char tmp[65]; + int len = 0; + int shift = 0; + if (a->limbs>1 || a->data[0] != 0) { + len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); + } + while (shift < len && tmp[shift] == 0) shift++; + VERIFY_CHECK(len-shift <= (int)rlen); + memset(r, 0, rlen - len + shift); + if (len > shift) { + memcpy(r + rlen - len + shift, tmp + shift, len - shift); + } + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen) { + int len; + VERIFY_CHECK(alen > 0); + VERIFY_CHECK(alen <= 64); + len = mpn_set_str(r->data, a, alen, 256); + if (len == 0) { + r->data[0] = 0; + len = 1; + } + VERIFY_CHECK(len <= NUM_LIMBS*2); + r->limbs = len; + r->neg = 0; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_add_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { + mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); + r->limbs = a->limbs; + if (c != 0) { + VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); + r->data[r->limbs++] = c; + } +} + +static void secp256k1_num_sub_abs(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { + mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + (void)c; + VERIFY_CHECK(c == 0); + r->limbs = a->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_mod(secp256k1_num *r, const secp256k1_num *m) { + secp256k1_num_sanity(r); + secp256k1_num_sanity(m); + + if (r->limbs >= m->limbs) { + mp_limb_t t[2*NUM_LIMBS]; + mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); + memset(t, 0, sizeof(t)); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } + + if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { + secp256k1_num_sub_abs(r, m, r); + r->neg = 0; + } +} + +static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m) { + int i; + mp_limb_t g[NUM_LIMBS+1]; + mp_limb_t u[NUM_LIMBS+1]; + mp_limb_t v[NUM_LIMBS+1]; + mp_size_t sn; + mp_size_t gn; + secp256k1_num_sanity(a); + secp256k1_num_sanity(m); + + /** mpn_gcdext computes: (G,S) = gcdext(U,V), where + * * G = gcd(U,V) + * * G = U*S + V*T + * * U has equal or more limbs than V, and V has no padding + * If we set U to be (a padded version of) a, and V = m: + * G = a*S + m*T + * G = a*S mod m + * Assuming G=1: + * S = 1/a mod m + */ + VERIFY_CHECK(m->limbs <= NUM_LIMBS); + VERIFY_CHECK(m->data[m->limbs-1] != 0); + for (i = 0; i < m->limbs; i++) { + u[i] = (i < a->limbs) ? a->data[i] : 0; + v[i] = m->data[i]; + } + sn = NUM_LIMBS+1; + gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + (void)gn; + VERIFY_CHECK(gn == 1); + VERIFY_CHECK(g[0] == 1); + r->neg = a->neg ^ m->neg; + if (sn < 0) { + mpn_sub(r->data, m->data, m->limbs, r->data, -sn); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } else { + r->limbs = sn; + } + memset(g, 0, sizeof(g)); + memset(u, 0, sizeof(u)); + memset(v, 0, sizeof(v)); +} + +static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b) { + int ret; + mpz_t ga, gb; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + VERIFY_CHECK(!b->neg && (b->limbs > 0) && (b->data[0] & 1)); + + mpz_inits(ga, gb, NULL); + + mpz_import(gb, b->limbs, -1, sizeof(mp_limb_t), 0, 0, b->data); + mpz_import(ga, a->limbs, -1, sizeof(mp_limb_t), 0, 0, a->data); + if (a->neg) { + mpz_neg(ga, ga); + } + + ret = mpz_jacobi(ga, gb); + + mpz_clears(ga, gb, NULL); + + return ret; +} + +static int secp256k1_num_is_one(const secp256k1_num *a) { + return (a->limbs == 1 && a->data[0] == 1); +} + +static int secp256k1_num_is_zero(const secp256k1_num *a) { + return (a->limbs == 1 && a->data[0] == 0); +} + +static int secp256k1_num_is_neg(const secp256k1_num *a) { + return (a->limbs > 1 || a->data[0] != 0) && a->neg; +} + +static int secp256k1_num_cmp(const secp256k1_num *a, const secp256k1_num *b) { + if (a->limbs > b->limbs) { + return 1; + } + if (a->limbs < b->limbs) { + return -1; + } + return mpn_cmp(a->data, b->data, a->limbs); +} + +static int secp256k1_num_eq(const secp256k1_num *a, const secp256k1_num *b) { + if (a->limbs > b->limbs) { + return 0; + } + if (a->limbs < b->limbs) { + return 0; + } + if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) { + return 0; + } + return mpn_cmp(a->data, b->data, a->limbs) == 0; +} + +static void secp256k1_num_subadd(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b, int bneg) { + if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ + r->neg = a->neg; + if (a->limbs >= b->limbs) { + secp256k1_num_add_abs(r, a, b); + } else { + secp256k1_num_add_abs(r, b, a); + } + } else { + if (secp256k1_num_cmp(a, b) > 0) { + r->neg = a->neg; + secp256k1_num_sub_abs(r, a, b); + } else { + r->neg = b->neg ^ bneg; + secp256k1_num_sub_abs(r, b, a); + } + } +} + +static void secp256k1_num_add(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 0); +} + +static void secp256k1_num_sub(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 1); +} + +static void secp256k1_num_mul(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *b) { + mp_limb_t tmp[2*NUM_LIMBS+1]; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + + VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); + if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { + r->limbs = 1; + r->neg = 0; + r->data[0] = 0; + return; + } + if (a->limbs >= b->limbs) { + mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); + } else { + mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); + } + r->limbs = a->limbs + b->limbs; + if (r->limbs > 1 && tmp[r->limbs - 1]==0) { + r->limbs--; + } + VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); + mpn_copyi(r->data, tmp, r->limbs); + r->neg = a->neg ^ b->neg; + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_shift(secp256k1_num *r, int bits) { + if (bits % GMP_NUMB_BITS) { + /* Shift within limbs. */ + mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); + } + if (bits >= GMP_NUMB_BITS) { + int i; + /* Shift full limbs. */ + for (i = 0; i < r->limbs; i++) { + int index = i + (bits / GMP_NUMB_BITS); + if (index < r->limbs && index < 2*NUM_LIMBS) { + r->data[i] = r->data[index]; + } else { + r->data[i] = 0; + } + } + } + while (r->limbs>1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_negate(secp256k1_num *r) { + r->neg ^= 1; +} + +#endif /* SECP256K1_NUM_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_impl.h new file mode 100644 index 00000000..25620d35 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/num_impl.h @@ -0,0 +1,22 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_NUM_IMPL_H +#define SECP256K1_NUM_IMPL_H + +#include "../../secp256k1-config.h" + +#include "num.h" + +#if defined(USE_NUM_GMP) +#include "num_gmp_impl.h" +#elif defined(USE_NUM_NONE) +/* Nothing. */ +#else +#error "Please select num implementation" +#endif + +#endif /* SECP256K1_NUM_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar.h new file mode 100644 index 00000000..dff45da2 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar.h @@ -0,0 +1,104 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_H +#define SECP256K1_SCALAR_H + +#include "num.h" + +#include "../../secp256k1-config.h" + +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low.h" +#elif defined(USE_SCALAR_4X64) +#include "scalar_4x64.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32.h" +#else +#error "Please select scalar implementation" +#endif + +/** Clear a scalar to prevent the leak of sensitive data. */ +static void secp256k1_scalar_clear(secp256k1_scalar *r); + +/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ +static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count); + +/** Access bits from a scalar. Not constant time. */ +static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count); + +/** Set a scalar from a big endian byte array. */ +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *bin, int *overflow); + +/** Set a scalar to an unsigned integer. */ +static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v); + +/** Convert a scalar to a byte array. */ +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a); + +/** Add two scalars together (modulo the group order). Returns whether it overflowed. */ +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); + +/** Conditionally add a power of two to a scalar. The result is not allowed to overflow. */ +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag); + +/** Multiply two scalars (modulo the group order). */ +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b); + +/** Shift a scalar right by some amount strictly between 0 and 16, returning + * the low bits that were shifted off */ +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n); + +/** Compute the square of a scalar (modulo the group order). */ +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a); + +/** Compute the inverse of a scalar (modulo the group order). */ +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a); + +/** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *a); + +/** Compute the complement of a scalar (modulo the group order). */ +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a); + +/** Check whether a scalar equals zero. */ +static int secp256k1_scalar_is_zero(const secp256k1_scalar *a); + +/** Check whether a scalar equals one. */ +static int secp256k1_scalar_is_one(const secp256k1_scalar *a); + +/** Check whether a scalar, considered as an nonnegative integer, is even. */ +static int secp256k1_scalar_is_even(const secp256k1_scalar *a); + +/** Check whether a scalar is higher than the group order divided by 2. */ +static int secp256k1_scalar_is_high(const secp256k1_scalar *a); + +/** Conditionally negate a number, in constant time. + * Returns -1 if the number was negated, 1 otherwise */ +static int secp256k1_scalar_cond_negate(secp256k1_scalar *a, int flag); + +#ifndef USE_NUM_NONE +/** Convert a scalar to a number. */ +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a); + +/** Get the order of the group as a number. */ +static void secp256k1_scalar_order_get_num(secp256k1_num *r); +#endif + +/** Compare two scalars. */ +static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b); + +#ifdef USE_ENDOMORPHISM +/** Find r1 and r2 such that r1+r2*2^128 = a. */ +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); +/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a); +#endif + +/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ +static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift); + +#endif /* SECP256K1_SCALAR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64.h new file mode 100644 index 00000000..19c7495d --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint64_t d[4]; +} secp256k1_scalar; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} + +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64_impl.h new file mode 100644 index 00000000..db1ebf94 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_4x64_impl.h @@ -0,0 +1,949 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) +#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) +#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) +#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) +#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) +#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) +#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); + return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 6 == offset >> 6) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 6) + 1 < 4); + return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ + no |= (a->d[2] < SECP256K1_N_2); + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1); + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigned int overflow) { + uint128_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint64_t)r->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + int overflow; + uint128_t t = (uint128_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { + uint128_t t; + VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */ + t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F)); + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F)); + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 64) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; + r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; + r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; + r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { + bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; + bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; + bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; + bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { + uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); + uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_H_3); + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint64_t mask = !flag - 1; + uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1; + uint128_t t = (uint128_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; + return 2 * (mask == 0) - 1; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint64_t tl, th, th2, tl2; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint64_t *l) { +#ifdef USE_ASM_X86_64 + /* Reduce 512 bits into 385. */ + uint64_t m0, m1, m2, m3, m4, m5, m6; + uint64_t p0, p1, p2, p3, p4; + uint64_t c; + + __asm__ __volatile__( + /* Preload. */ + "movq 32(%%rsi), %%r11\n" + "movq 40(%%rsi), %%r12\n" + "movq 48(%%rsi), %%r13\n" + "movq 56(%%rsi), %%r14\n" + /* Initialize r8,r9,r10 */ + "movq 0(%%rsi), %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9) += n0 * c0 */ + "movq %8, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract m0 */ + "movq %%r8, %q0\n" + "xorq %%r8, %%r8\n" + /* (r9,r10) += l1 */ + "addq 8(%%rsi), %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += n1 * c0 */ + "movq %8, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n0 * c1 */ + "movq %9, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract m1 */ + "movq %%r9, %q1\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += l2 */ + "addq 16(%%rsi), %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n2 * c0 */ + "movq %8, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n1 * c1 */ + "movq %9, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n0 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract m2 */ + "movq %%r10, %q2\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += l3 */ + "addq 24(%%rsi), %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n3 * c0 */ + "movq %8, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n2 * c1 */ + "movq %9, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n1 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* extract m3 */ + "movq %%r8, %q3\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += n3 * c1 */ + "movq %9, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n2 */ + "addq %%r13, %%r9\n" + "adcq $0, %%r10\n" + "adcq $0, %%r8\n" + /* extract m4 */ + "movq %%r9, %q4\n" + /* (r10,r8) += n3 */ + "addq %%r14, %%r10\n" + "adcq $0, %%r8\n" + /* extract m5 */ + "movq %%r10, %q5\n" + /* extract m6 */ + "movq %%r8, %q6\n" + : "=g"(m0), "=g"(m1), "=g"(m2), "=g"(m3), "=g"(m4), "=g"(m5), "=g"(m6) + : "S"(l), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc"); + + /* Reduce 385 bits into 258. */ + __asm__ __volatile__( + /* Preload */ + "movq %q9, %%r11\n" + "movq %q10, %%r12\n" + "movq %q11, %%r13\n" + /* Initialize (r8,r9,r10) */ + "movq %q5, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9) += m4 * c0 */ + "movq %12, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract p0 */ + "movq %%r8, %q0\n" + "xorq %%r8, %%r8\n" + /* (r9,r10) += m1 */ + "addq %q6, %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += m5 * c0 */ + "movq %12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += m4 * c1 */ + "movq %13, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract p1 */ + "movq %%r9, %q1\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += m2 */ + "addq %q7, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m6 * c0 */ + "movq %12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m5 * c1 */ + "movq %13, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m4 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract p2 */ + "movq %%r10, %q2\n" + /* (r8,r9) += m3 */ + "addq %q8, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += m6 * c1 */ + "movq %13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* (r8,r9) += m5 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + /* extract p3 */ + "movq %%r8, %q3\n" + /* (r9) += m6 */ + "addq %%r13, %%r9\n" + /* extract p4 */ + "movq %%r9, %q4\n" + : "=&g"(p0), "=&g"(p1), "=&g"(p2), "=g"(p3), "=g"(p4) + : "g"(m0), "g"(m1), "g"(m2), "g"(m3), "g"(m4), "g"(m5), "g"(m6), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "cc"); + + /* Reduce 258 bits into 256. */ + __asm__ __volatile__( + /* Preload */ + "movq %q5, %%r10\n" + /* (rax,rdx) = p4 * c0 */ + "movq %7, %%rax\n" + "mulq %%r10\n" + /* (rax,rdx) += p0 */ + "addq %q1, %%rax\n" + "adcq $0, %%rdx\n" + /* extract r0 */ + "movq %%rax, 0(%q6)\n" + /* Move to (r8,r9) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + /* (r8,r9) += p1 */ + "addq %q2, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += p4 * c1 */ + "movq %8, %%rax\n" + "mulq %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* Extract r1 */ + "movq %%r8, 8(%q6)\n" + "xorq %%r8, %%r8\n" + /* (r9,r8) += p4 */ + "addq %%r10, %%r9\n" + "adcq $0, %%r8\n" + /* (r9,r8) += p2 */ + "addq %q3, %%r9\n" + "adcq $0, %%r8\n" + /* Extract r2 */ + "movq %%r9, 16(%q6)\n" + "xorq %%r9, %%r9\n" + /* (r8,r9) += p3 */ + "addq %q4, %%r8\n" + "adcq $0, %%r9\n" + /* Extract r3 */ + "movq %%r8, 24(%q6)\n" + /* Extract c */ + "movq %%r9, %q0\n" + : "=g"(c) + : "g"(p0), "g"(p1), "g"(p2), "g"(p3), "g"(p4), "D"(r), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "cc", "memory"); +#else + uint128_t c; + uint64_t c0, c1, c2; + uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; + uint64_t m0, m1, m2, m3, m4, m5; + uint32_t m6; + uint64_t p0, p1, p2, p3; + uint32_t p4; + + /* Reduce 512 bits into 385. */ + /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + sumadd(n0); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + sumadd(n1); + extract(m3); + muladd(n3, SECP256K1_N_C_1); + sumadd(n2); + extract(m4); + sumadd_fast(n3); + extract_fast(m5); + VERIFY_CHECK(c0 <= 1); + m6 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m4, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m5, SECP256K1_N_C_0); + muladd(m4, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m6, SECP256K1_N_C_0); + muladd(m5, SECP256K1_N_C_1); + sumadd(m4); + extract(p2); + sumadd_fast(m3); + muladd_fast(m6, SECP256K1_N_C_1); + sumadd_fast(m5); + extract_fast(p3); + p4 = c0 + m6; + VERIFY_CHECK(p4 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ + c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; + r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; + r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p2 + (uint128_t)p4; + r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p3; + r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; +#endif + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, const secp256k1_scalar *b) { +#ifdef USE_ASM_X86_64 + const uint64_t *pb = b->d; + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r15\n" + "movq 8(%%rdi), %%rbx\n" + "movq 16(%%rdi), %%rcx\n" + "movq 0(%%rdx), %%r11\n" + "movq 8(%%rdx), %%r12\n" + "movq 16(%%rdx), %%r13\n" + "movq 24(%%rdx), %%r14\n" + /* (rax,rdx) = a0 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a0 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a1 * b0 */ + "movq %%rbx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a0 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * b1 */ + "movq %%rbx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a2 * b0 */ + "movq %%rcx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += a0 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Preload a3 */ + "movq 24(%%rdi), %%r15\n" + /* (r10,r8,r9) += a1 * b2 */ + "movq %%rbx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a2 * b1 */ + "movq %%rcx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a3 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a1 * b3 */ + "movq %%rbx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * b2 */ + "movq %%rcx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a3 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a2 * b3 */ + "movq %%rcx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a3 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : "+d"(pb) + : "S"(l), "D"(a->d) + : "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + extract(l[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + extract(l[5]); + muladd_fast(a->d[3], b->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 == 0); + l[7] = c0; +#endif +} + +static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar *a) { +#ifdef USE_ASM_X86_64 + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r11\n" + "movq 8(%%rdi), %%r12\n" + "movq 16(%%rdi), %%r13\n" + "movq 24(%%rdi), %%r14\n" + /* (rax,rdx) = a0 * a0 */ + "movq %%r11, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx,0) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a0 * a1 */ + "movq %%r11, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a0 * a2 */ + "movq %%r11, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * a1 */ + "movq %%r12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += 2 * a0 * a3 */ + "movq %%r11, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += 2 * a1 * a2 */ + "movq %%r12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a1 * a3 */ + "movq %%r12, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * a2 */ + "movq %%r13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a2 * a3 */ + "movq %%r13, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * a3 */ + "movq %%r14, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : + : "S"(l), "D"(a->d) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd_fast(a->d[3], a->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 == 0); + l[7] = c0; +#endif +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + uint64_t l[8]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n)); + r->d[3] = (r->d[3] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { + uint64_t l[8]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = 0; + r1->d[3] = 0; + r2->d[0] = a->d[2]; + r2->d[1] = a->d[3]; + r2->d[2] = 0; + r2->d[3] = 0; +} +#endif + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { + uint64_t l[8]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 6; + shiftlow = shift & 0x3F; + shifthigh = 64 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1); +} + +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32.h new file mode 100644 index 00000000..2c9a348e --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint32_t d[8]; +} secp256k1_scalar; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} + +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32_impl.h new file mode 100644 index 00000000..4f9ed61f --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_8x32_impl.h @@ -0,0 +1,721 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint32_t)0xD0364141UL) +#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) +#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) +#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) +#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) +#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (~SECP256K1_N_2) +#define SECP256K1_N_C_3 (~SECP256K1_N_3) +#define SECP256K1_N_C_4 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) +#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) +#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) +#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) +#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); + return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 5 == offset >> 5) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 5) + 1 < 8); + return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ + no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_4); + yes |= (a->d[4] > SECP256K1_N_4) & ~no; + no |= (a->d[3] < SECP256K1_N_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_3) & ~no; + no |= (a->d[2] < SECP256K1_N_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_t overflow) { + uint64_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; + r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; + r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[5]; + r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[6]; + r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[7]; + r->d[7] = t & 0xFFFFFFFFUL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + int overflow; + uint64_t t = (uint64_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[4] + b->d[4]; + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[5] + b->d[5]; + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[6] + b->d[6]; + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[7] + b->d[7]; + r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { + uint64_t t; + VERIFY_CHECK(bit < 256); + bit += ((uint32_t) flag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */ + t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F)); + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F)); + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F)); + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F)); + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F)); + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F)); + r->d[7] = t & 0xFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 32) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; + r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; + r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; + r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; + r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; + r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; + r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; + r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { + bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; + bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; + bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; + bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; + bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; + bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; + bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; + bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); + uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; + r->d[7] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_H_7); + yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; + no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ + no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + /* If we are flag = 0, mask = 00...00 and this is a no-op; + * if we are flag = 1, mask = 11...11 and this is identical to secp256k1_scalar_negate */ + uint32_t mask = !flag - 1; + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0); + uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask); + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask); + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[2] ^ mask) + (SECP256K1_N_2 & mask); + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[3] ^ mask) + (SECP256K1_N_3 & mask); + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[4] ^ mask) + (SECP256K1_N_4 & mask); + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[5] ^ mask) + (SECP256K1_N_5 & mask); + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[6] ^ mask) + (SECP256K1_N_6 & mask); + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask); + r->d[7] = t & nonzero; + return 2 * (mask == 0) - 1; +} + + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint32_t tl, th, th2, tl2; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar *r, const uint32_t *l) { + uint64_t c; + uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; + uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; + uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8; + + /* 96 bit accumulator. */ + uint32_t c0, c1, c2; + + /* Reduce 512 bits into 385. */ + /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + muladd(n0, SECP256K1_N_C_2); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + muladd(n1, SECP256K1_N_C_2); + muladd(n0, SECP256K1_N_C_3); + extract(m3); + sumadd(l[4]); + muladd(n4, SECP256K1_N_C_0); + muladd(n3, SECP256K1_N_C_1); + muladd(n2, SECP256K1_N_C_2); + muladd(n1, SECP256K1_N_C_3); + sumadd(n0); + extract(m4); + sumadd(l[5]); + muladd(n5, SECP256K1_N_C_0); + muladd(n4, SECP256K1_N_C_1); + muladd(n3, SECP256K1_N_C_2); + muladd(n2, SECP256K1_N_C_3); + sumadd(n1); + extract(m5); + sumadd(l[6]); + muladd(n6, SECP256K1_N_C_0); + muladd(n5, SECP256K1_N_C_1); + muladd(n4, SECP256K1_N_C_2); + muladd(n3, SECP256K1_N_C_3); + sumadd(n2); + extract(m6); + sumadd(l[7]); + muladd(n7, SECP256K1_N_C_0); + muladd(n6, SECP256K1_N_C_1); + muladd(n5, SECP256K1_N_C_2); + muladd(n4, SECP256K1_N_C_3); + sumadd(n3); + extract(m7); + muladd(n7, SECP256K1_N_C_1); + muladd(n6, SECP256K1_N_C_2); + muladd(n5, SECP256K1_N_C_3); + sumadd(n4); + extract(m8); + muladd(n7, SECP256K1_N_C_2); + muladd(n6, SECP256K1_N_C_3); + sumadd(n5); + extract(m9); + muladd(n7, SECP256K1_N_C_3); + sumadd(n6); + extract(m10); + sumadd_fast(n7); + extract_fast(m11); + VERIFY_CHECK(c0 <= 1); + m12 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m8, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m9, SECP256K1_N_C_0); + muladd(m8, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m10, SECP256K1_N_C_0); + muladd(m9, SECP256K1_N_C_1); + muladd(m8, SECP256K1_N_C_2); + extract(p2); + sumadd(m3); + muladd(m11, SECP256K1_N_C_0); + muladd(m10, SECP256K1_N_C_1); + muladd(m9, SECP256K1_N_C_2); + muladd(m8, SECP256K1_N_C_3); + extract(p3); + sumadd(m4); + muladd(m12, SECP256K1_N_C_0); + muladd(m11, SECP256K1_N_C_1); + muladd(m10, SECP256K1_N_C_2); + muladd(m9, SECP256K1_N_C_3); + sumadd(m8); + extract(p4); + sumadd(m5); + muladd(m12, SECP256K1_N_C_1); + muladd(m11, SECP256K1_N_C_2); + muladd(m10, SECP256K1_N_C_3); + sumadd(m9); + extract(p5); + sumadd(m6); + muladd(m12, SECP256K1_N_C_2); + muladd(m11, SECP256K1_N_C_3); + sumadd(m10); + extract(p6); + sumadd_fast(m7); + muladd_fast(m12, SECP256K1_N_C_3); + sumadd_fast(m11); + extract_fast(p7); + p8 = c0 + m12; + VERIFY_CHECK(p8 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ + c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; + r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; + c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; + r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; + c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; + r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; + c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; + r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; + c += p4 + (uint64_t)p8; + r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; + c += p5; + r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; + c += p6; + r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; + c += p7; + r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, const secp256k1_scalar *b) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7] * b[0..7]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[0], b->d[4]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + muladd(a->d[4], b->d[0]); + extract(l[4]); + muladd(a->d[0], b->d[5]); + muladd(a->d[1], b->d[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + muladd(a->d[4], b->d[1]); + muladd(a->d[5], b->d[0]); + extract(l[5]); + muladd(a->d[0], b->d[6]); + muladd(a->d[1], b->d[5]); + muladd(a->d[2], b->d[4]); + muladd(a->d[3], b->d[3]); + muladd(a->d[4], b->d[2]); + muladd(a->d[5], b->d[1]); + muladd(a->d[6], b->d[0]); + extract(l[6]); + muladd(a->d[0], b->d[7]); + muladd(a->d[1], b->d[6]); + muladd(a->d[2], b->d[5]); + muladd(a->d[3], b->d[4]); + muladd(a->d[4], b->d[3]); + muladd(a->d[5], b->d[2]); + muladd(a->d[6], b->d[1]); + muladd(a->d[7], b->d[0]); + extract(l[7]); + muladd(a->d[1], b->d[7]); + muladd(a->d[2], b->d[6]); + muladd(a->d[3], b->d[5]); + muladd(a->d[4], b->d[4]); + muladd(a->d[5], b->d[3]); + muladd(a->d[6], b->d[2]); + muladd(a->d[7], b->d[1]); + extract(l[8]); + muladd(a->d[2], b->d[7]); + muladd(a->d[3], b->d[6]); + muladd(a->d[4], b->d[5]); + muladd(a->d[5], b->d[4]); + muladd(a->d[6], b->d[3]); + muladd(a->d[7], b->d[2]); + extract(l[9]); + muladd(a->d[3], b->d[7]); + muladd(a->d[4], b->d[6]); + muladd(a->d[5], b->d[5]); + muladd(a->d[6], b->d[4]); + muladd(a->d[7], b->d[3]); + extract(l[10]); + muladd(a->d[4], b->d[7]); + muladd(a->d[5], b->d[6]); + muladd(a->d[6], b->d[5]); + muladd(a->d[7], b->d[4]); + extract(l[11]); + muladd(a->d[5], b->d[7]); + muladd(a->d[6], b->d[6]); + muladd(a->d[7], b->d[5]); + extract(l[12]); + muladd(a->d[6], b->d[7]); + muladd(a->d[7], b->d[6]); + extract(l[13]); + muladd_fast(a->d[7], b->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar *a) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7]^2. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[0], a->d[4]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[0], a->d[5]); + muladd2(a->d[1], a->d[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd2(a->d[0], a->d[6]); + muladd2(a->d[1], a->d[5]); + muladd2(a->d[2], a->d[4]); + muladd(a->d[3], a->d[3]); + extract(l[6]); + muladd2(a->d[0], a->d[7]); + muladd2(a->d[1], a->d[6]); + muladd2(a->d[2], a->d[5]); + muladd2(a->d[3], a->d[4]); + extract(l[7]); + muladd2(a->d[1], a->d[7]); + muladd2(a->d[2], a->d[6]); + muladd2(a->d[3], a->d[5]); + muladd(a->d[4], a->d[4]); + extract(l[8]); + muladd2(a->d[2], a->d[7]); + muladd2(a->d[3], a->d[6]); + muladd2(a->d[4], a->d[5]); + extract(l[9]); + muladd2(a->d[3], a->d[7]); + muladd2(a->d[4], a->d[6]); + muladd(a->d[5], a->d[5]); + extract(l[10]); + muladd2(a->d[4], a->d[7]); + muladd2(a->d[5], a->d[6]); + extract(l[11]); + muladd2(a->d[5], a->d[7]); + muladd(a->d[6], a->d[6]); + extract(l[12]); + muladd2(a->d[6], a->d[7]); + extract(l[13]); + muladd_fast(a->d[7], a->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + uint32_t l[16]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = r->d[0] & ((1 << n) - 1); + r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n)); + r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n)); + r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n)); + r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n)); + r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n)); + r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n)); + r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n)); + r->d[7] = (r->d[7] >> n); + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { + uint32_t l[16]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = a->d[2]; + r1->d[3] = a->d[3]; + r1->d[4] = 0; + r1->d[5] = 0; + r1->d[6] = 0; + r1->d[7] = 0; + r2->d[0] = a->d[4]; + r2->d[1] = a->d[5]; + r2->d[2] = a->d[6]; + r2->d[3] = a->d[7]; + r2->d[4] = 0; + r2->d[5] = 0; + r2->d[6] = 0; + r2->d[7] = 0; +} +#endif + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b, unsigned int shift) { + uint32_t l[16]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 5; + shiftlow = shift & 0x1F; + shifthigh = 32 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; + secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1); +} + +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_impl.h new file mode 100644 index 00000000..538f3778 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_impl.h @@ -0,0 +1,331 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_IMPL_H +#define SECP256K1_SCALAR_IMPL_H + +#include "group.h" +#include "scalar.h" + +#include "../../secp256k1-config.h" + +#if defined(EXHAUSTIVE_TEST_ORDER) +#include "scalar_low_impl.h" +#elif defined(USE_SCALAR_4X64) +#include "scalar_4x64_impl.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32_impl.h" +#else +#error "Please select scalar implementation" +#endif + +#ifndef USE_NUM_NONE +static void secp256k1_scalar_get_num(secp256k1_num *r, const secp256k1_scalar *a) { + unsigned char c[32]; + secp256k1_scalar_get_b32(c, a); + secp256k1_num_set_bin(r, c, 32); +} + +/** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ +static void secp256k1_scalar_order_get_num(secp256k1_num *r) { +#if defined(EXHAUSTIVE_TEST_ORDER) + static const unsigned char order[32] = { + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,EXHAUSTIVE_TEST_ORDER + }; +#else + static const unsigned char order[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; +#endif + secp256k1_num_set_bin(r, order, 32); +} +#endif + +static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { +#if defined(EXHAUSTIVE_TEST_ORDER) + int i; + *r = 0; + for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) + if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) + *r = i; + /* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus + * have a composite group order; fix it in exhaustive_tests.c). */ + VERIFY_CHECK(*r != 0); +} +#else + secp256k1_scalar *t; + int i; + /* First compute xN as x ^ (2^N - 1) for some values of N, + * and uM as x ^ M for some values of M. */ + secp256k1_scalar x2, x3, x6, x8, x14, x28, x56, x112, x126; + secp256k1_scalar u2, u5, u9, u11, u13; + + secp256k1_scalar_sqr(&u2, x); + secp256k1_scalar_mul(&x2, &u2, x); + secp256k1_scalar_mul(&u5, &u2, &x2); + secp256k1_scalar_mul(&x3, &u5, &u2); + secp256k1_scalar_mul(&u9, &x3, &u2); + secp256k1_scalar_mul(&u11, &u9, &u2); + secp256k1_scalar_mul(&u13, &u11, &u2); + + secp256k1_scalar_sqr(&x6, &u13); + secp256k1_scalar_sqr(&x6, &x6); + secp256k1_scalar_mul(&x6, &x6, &u11); + + secp256k1_scalar_sqr(&x8, &x6); + secp256k1_scalar_sqr(&x8, &x8); + secp256k1_scalar_mul(&x8, &x8, &x2); + + secp256k1_scalar_sqr(&x14, &x8); + for (i = 0; i < 5; i++) { + secp256k1_scalar_sqr(&x14, &x14); + } + secp256k1_scalar_mul(&x14, &x14, &x6); + + secp256k1_scalar_sqr(&x28, &x14); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x28, &x28); + } + secp256k1_scalar_mul(&x28, &x28, &x14); + + secp256k1_scalar_sqr(&x56, &x28); + for (i = 0; i < 27; i++) { + secp256k1_scalar_sqr(&x56, &x56); + } + secp256k1_scalar_mul(&x56, &x56, &x28); + + secp256k1_scalar_sqr(&x112, &x56); + for (i = 0; i < 55; i++) { + secp256k1_scalar_sqr(&x112, &x112); + } + secp256k1_scalar_mul(&x112, &x112, &x56); + + secp256k1_scalar_sqr(&x126, &x112); + for (i = 0; i < 13; i++) { + secp256k1_scalar_sqr(&x126, &x126); + } + secp256k1_scalar_mul(&x126, &x126, &x14); + + /* Then accumulate the final result (t starts at x126). */ + t = &x126; + for (i = 0; i < 3; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 5; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 6; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 3; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u5); /* 101 */ + for (i = 0; i < 10; i++) { /* 0000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 9; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u11); /* 1011 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 5; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 6; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 10; i++) { /* 000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u13); /* 1101 */ + for (i = 0; i < 4; i++) { + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &u9); /* 1001 */ + for (i = 0; i < 6; i++) { /* 00000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 8; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(r, t, &x6); /* 111111 */ +} + +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(a->d[0] & 1); +} +#endif + +static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { +#if defined(USE_SCALAR_INV_BUILTIN) + secp256k1_scalar_inverse(r, x); +#elif defined(USE_SCALAR_INV_NUM) + unsigned char b[32]; + secp256k1_num n, m; + secp256k1_scalar t = *x; + secp256k1_scalar_get_b32(b, &t); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_scalar_order_get_num(&m); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + secp256k1_scalar_set_b32(r, b, NULL); + /* Verify that the inverse was computed correctly, without GMP code. */ + secp256k1_scalar_mul(&t, &t, r); + CHECK(secp256k1_scalar_is_one(&t)); +#else +#error "Please select scalar inverse implementation" +#endif +} + +#ifdef USE_ENDOMORPHISM +#if defined(EXHAUSTIVE_TEST_ORDER) +/** + * Find k1 and k2 given k, such that k1 + k2 * lambda == k mod n; unlike in the + * full case we don't bother making k1 and k2 be small, we just want them to be + * nontrivial to get full test coverage for the exhaustive tests. We therefore + * (arbitrarily) set k2 = k + 5 and k1 = k - k2 * lambda. + */ +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r2 = (*a + 5) % EXHAUSTIVE_TEST_ORDER; + *r1 = (*a + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER; +} +#else +/** + * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where + * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, + * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72} + * + * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm + * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1 + * and k2 have a small size. + * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are: + * + * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3} + * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8} + * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * + * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives + * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and + * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2. + * + * g1, g2 are precomputed constants used to replace division with a rounded multiplication + * when decomposing the scalar for an endomorphism-based point multiplication. + * + * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve + * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5. + * + * The derivation is described in the paper "Efficient Software Implementation of Public-Key + * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez), + * Section 4.3 (here we use a somewhat higher-precision estimate): + * d = a1*b2 - b1*a2 + * g1 = round((2^272)*b2/d) + * g2 = round((2^272)*b1/d) + * + * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found + * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda'). + * + * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). + */ + +static void secp256k1_scalar_split_lambda(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + secp256k1_scalar c1, c2; + static const secp256k1_scalar minus_lambda = SECP256K1_SCALAR_CONST( + 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, + 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL + ); + static const secp256k1_scalar minus_b1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, + 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL + ); + static const secp256k1_scalar minus_b2 = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL + ); + static const secp256k1_scalar g1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, + 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL + ); + static const secp256k1_scalar g2 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, + 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL + ); + VERIFY_CHECK(r1 != a); + VERIFY_CHECK(r2 != a); + /* these _var calls are constant time since the shift amount is constant */ + secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); + secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); + secp256k1_scalar_mul(&c1, &c1, &minus_b1); + secp256k1_scalar_mul(&c2, &c2, &minus_b2); + secp256k1_scalar_add(r2, &c1, &c2); + secp256k1_scalar_mul(r1, r2, &minus_lambda); + secp256k1_scalar_add(r1, r1, a); +} +#endif +#endif + +#endif /* SECP256K1_SCALAR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low.h new file mode 100644 index 00000000..5836febc --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low.h @@ -0,0 +1,15 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_H +#define SECP256K1_SCALAR_REPR_H + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef uint32_t secp256k1_scalar; + +#endif /* SECP256K1_SCALAR_REPR_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low_impl.h new file mode 100644 index 00000000..c80e70c5 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scalar_low_impl.h @@ -0,0 +1,114 @@ +/********************************************************************** + * Copyright (c) 2015 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_SCALAR_REPR_IMPL_H +#define SECP256K1_SCALAR_REPR_IMPL_H + +#include "scalar.h" + +#include + +SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) { + return !(*a & 1); +} + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r = 0; } +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) { *r = v; } + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + if (offset < 32) + return ((*a >> offset) & ((((uint32_t)1) << count) - 1)); + else + return 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) { + return secp256k1_scalar_get_bits(a, offset, count); +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; } + +static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a + *b) % EXHAUSTIVE_TEST_ORDER; + return *r < *b; +} + +static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) { + if (flag && bit < 32) + *r += (1 << bit); +#ifdef VERIFY + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) { + const int base = 0x100 % EXHAUSTIVE_TEST_ORDER; + int i; + *r = 0; + for (i = 0; i < 32; i++) { + *r = ((*r * base) + b32[i]) % EXHAUSTIVE_TEST_ORDER; + } + /* just deny overflow, it basically always happens */ + if (overflow) *overflow = 0; +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) { + memset(bin, 0, 32); + bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) { + return *a == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) { + if (*a == 0) { + *r = 0; + } else { + *r = EXHAUSTIVE_TEST_ORDER - *a; + } +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) { + return *a == 1; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar *a) { + return *a > EXHAUSTIVE_TEST_ORDER / 2; +} + +static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) { + if (flag) secp256k1_scalar_negate(r, r); + return flag ? -1 : 1; +} + +static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) { + *r = (*a * *b) % EXHAUSTIVE_TEST_ORDER; +} + +static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) { + int ret; + VERIFY_CHECK(n > 0); + VERIFY_CHECK(n < 16); + ret = *r & ((1 << n) - 1); + *r >>= n; + return ret; +} + +static void secp256k1_scalar_sqr(secp256k1_scalar *r, const secp256k1_scalar *a) { + *r = (*a * *a) % EXHAUSTIVE_TEST_ORDER; +} + +static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) { + *r1 = *a; + *r2 = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) { + return *a == *b; +} + +#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch.h new file mode 100644 index 00000000..fef377af --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch.h @@ -0,0 +1,39 @@ +/********************************************************************** + * Copyright (c) 2017 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCRATCH_ +#define _SECP256K1_SCRATCH_ + +#define SECP256K1_SCRATCH_MAX_FRAMES 5 + +/* The typedef is used internally; the struct name is used in the public API + * (where it is exposed as a different typedef) */ +typedef struct secp256k1_scratch_space_struct { + void *data[SECP256K1_SCRATCH_MAX_FRAMES]; + size_t offset[SECP256K1_SCRATCH_MAX_FRAMES]; + size_t frame_size[SECP256K1_SCRATCH_MAX_FRAMES]; + size_t frame; + size_t max_size; + const secp256k1_callback* error_callback; +} secp256k1_scratch; + +static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t max_size); + +static void secp256k1_scratch_destroy(secp256k1_scratch* scratch); + +/** Attempts to allocate a new stack frame with `n` available bytes. Returns 1 on success, 0 on failure */ +static int secp256k1_scratch_allocate_frame(secp256k1_scratch* scratch, size_t n, size_t objects); + +/** Deallocates a stack frame */ +static void secp256k1_scratch_deallocate_frame(secp256k1_scratch* scratch); + +/** Returns the maximum allocation the scratch space will allow */ +static size_t secp256k1_scratch_max_allocation(const secp256k1_scratch* scratch, size_t n_objects); + +/** Returns a pointer into the most recently allocated frame, or NULL if there is insufficient available space */ +static void *secp256k1_scratch_alloc(secp256k1_scratch* scratch, size_t n); + +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch_impl.h new file mode 100644 index 00000000..abed713b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/scratch_impl.h @@ -0,0 +1,86 @@ +/********************************************************************** + * Copyright (c) 2017 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCRATCH_IMPL_H_ +#define _SECP256K1_SCRATCH_IMPL_H_ + +#include "scratch.h" + +/* Using 16 bytes alignment because common architectures never have alignment + * requirements above 8 for any of the types we care about. In addition we + * leave some room because currently we don't care about a few bytes. + * TODO: Determine this at configure time. */ +#define ALIGNMENT 16 + +static secp256k1_scratch* secp256k1_scratch_create(const secp256k1_callback* error_callback, size_t max_size) { + secp256k1_scratch* ret = (secp256k1_scratch*)checked_malloc(error_callback, sizeof(*ret)); + if (ret != NULL) { + memset(ret, 0, sizeof(*ret)); + ret->max_size = max_size; + ret->error_callback = error_callback; + } + return ret; +} + +static void secp256k1_scratch_destroy(secp256k1_scratch* scratch) { + if (scratch != NULL) { + VERIFY_CHECK(scratch->frame == 0); + free(scratch); + } +} + +static size_t secp256k1_scratch_max_allocation(const secp256k1_scratch* scratch, size_t objects) { + size_t i = 0; + size_t allocated = 0; + for (i = 0; i < scratch->frame; i++) { + allocated += scratch->frame_size[i]; + } + if (scratch->max_size - allocated <= objects * ALIGNMENT) { + return 0; + } + return scratch->max_size - allocated - objects * ALIGNMENT; +} + +static int secp256k1_scratch_allocate_frame(secp256k1_scratch* scratch, size_t n, size_t objects) { + VERIFY_CHECK(scratch->frame < SECP256K1_SCRATCH_MAX_FRAMES); + + if (n <= secp256k1_scratch_max_allocation(scratch, objects)) { + n += objects * ALIGNMENT; + scratch->data[scratch->frame] = checked_malloc(scratch->error_callback, n); + if (scratch->data[scratch->frame] == NULL) { + return 0; + } + scratch->frame_size[scratch->frame] = n; + scratch->offset[scratch->frame] = 0; + scratch->frame++; + return 1; + } else { + return 0; + } +} + +static void secp256k1_scratch_deallocate_frame(secp256k1_scratch* scratch) { + VERIFY_CHECK(scratch->frame > 0); + scratch->frame -= 1; + free(scratch->data[scratch->frame]); +} + +static void *secp256k1_scratch_alloc(secp256k1_scratch* scratch, size_t size) { + void *ret; + size_t frame = scratch->frame - 1; + size = ((size + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT; + + if (scratch->frame == 0 || size + scratch->offset[frame] > scratch->frame_size[frame]) { + return NULL; + } + ret = (void *) ((unsigned char *) scratch->data[frame] + scratch->offset[frame]); + memset(ret, 0, size); + scratch->offset[frame] += size; + + return ret; +} + +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/secp256k1.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/secp256k1.c new file mode 100644 index 00000000..5262e121 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/secp256k1.c @@ -0,0 +1,597 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "secp256k1.h" + +#include "util.h" +#include "num_impl.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_impl.h" +#include "ecmult_const_impl.h" +#include "ecmult_gen_impl.h" +#include "ecdsa_impl.h" +#include "eckey_impl.h" +#include "hash_impl.h" +#include "scratch_impl.h" + +#define ARG_CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + secp256k1_callback_call(&ctx->illegal_callback, #cond); \ + return 0; \ + } \ +} while(0) + +static void default_illegal_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] illegal argument: %s\n", str); + abort(); +} + +static const secp256k1_callback default_illegal_callback = { + default_illegal_callback_fn, + NULL +}; + +static void default_error_callback_fn(const char* str, void* data) { + (void)data; + fprintf(stderr, "[libsecp256k1] internal consistency check failed: %s\n", str); + abort(); +} + +static const secp256k1_callback default_error_callback = { + default_error_callback_fn, + NULL +}; + + +struct secp256k1_context_struct { + secp256k1_ecmult_context ecmult_ctx; + secp256k1_ecmult_gen_context ecmult_gen_ctx; + secp256k1_callback illegal_callback; + secp256k1_callback error_callback; +}; + +secp256k1_context* secp256k1_context_create(unsigned int flags) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&default_error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = default_illegal_callback; + ret->error_callback = default_error_callback; + + if (EXPECT((flags & SECP256K1_FLAGS_TYPE_MASK) != SECP256K1_FLAGS_TYPE_CONTEXT, 0)) { + secp256k1_callback_call(&ret->illegal_callback, + "Invalid flags"); + free(ret); + return NULL; + } + + secp256k1_ecmult_context_init(&ret->ecmult_ctx); + secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); + + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_SIGN) { + secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx, &ret->error_callback); + } + if (flags & SECP256K1_FLAGS_BIT_CONTEXT_VERIFY) { + secp256k1_ecmult_context_build(&ret->ecmult_ctx, &ret->error_callback); + } + + return ret; +} + +secp256k1_context* secp256k1_context_clone(const secp256k1_context* ctx) { + secp256k1_context* ret = (secp256k1_context*)checked_malloc(&ctx->error_callback, sizeof(secp256k1_context)); + ret->illegal_callback = ctx->illegal_callback; + ret->error_callback = ctx->error_callback; + secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx, &ctx->error_callback); + secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx, &ctx->error_callback); + return ret; +} + +void secp256k1_context_destroy(secp256k1_context* ctx) { + if (ctx != NULL) { + secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); + + free(ctx); + } +} + +void secp256k1_context_set_illegal_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_illegal_callback_fn; + } + ctx->illegal_callback.fn = fun; + ctx->illegal_callback.data = data; +} + +void secp256k1_context_set_error_callback(secp256k1_context* ctx, void (*fun)(const char* message, void* data), const void* data) { + if (fun == NULL) { + fun = default_error_callback_fn; + } + ctx->error_callback.fn = fun; + ctx->error_callback.data = data; +} + +secp256k1_scratch_space* secp256k1_scratch_space_create(const secp256k1_context* ctx, size_t max_size) { + VERIFY_CHECK(ctx != NULL); + return secp256k1_scratch_create(&ctx->error_callback, max_size); +} + +void secp256k1_scratch_space_destroy(secp256k1_scratch_space* scratch) { + secp256k1_scratch_destroy(scratch); +} + +static int secp256k1_pubkey_load(const secp256k1_context* ctx, secp256k1_ge* ge, const secp256k1_pubkey* pubkey) { + if (sizeof(secp256k1_ge_storage) == 64) { + /* When the secp256k1_ge_storage type is exactly 64 byte, use its + * representation inside secp256k1_pubkey, as conversion is very fast. + * Note that secp256k1_pubkey_save must use the same representation. */ + secp256k1_ge_storage s; + memcpy(&s, &pubkey->data[0], sizeof(s)); + secp256k1_ge_from_storage(ge, &s); + } else { + /* Otherwise, fall back to 32-byte big endian for X and Y. */ + secp256k1_fe x, y; + secp256k1_fe_set_b32(&x, pubkey->data); + secp256k1_fe_set_b32(&y, pubkey->data + 32); + secp256k1_ge_set_xy(ge, &x, &y); + } + ARG_CHECK(!secp256k1_fe_is_zero(&ge->x)); + return 1; +} + +static void secp256k1_pubkey_save(secp256k1_pubkey* pubkey, secp256k1_ge* ge) { + if (sizeof(secp256k1_ge_storage) == 64) { + secp256k1_ge_storage s; + secp256k1_ge_to_storage(&s, ge); + memcpy(&pubkey->data[0], &s, sizeof(s)); + } else { + VERIFY_CHECK(!secp256k1_ge_is_infinity(ge)); + secp256k1_fe_normalize_var(&ge->x); + secp256k1_fe_normalize_var(&ge->y); + secp256k1_fe_get_b32(pubkey->data, &ge->x); + secp256k1_fe_get_b32(pubkey->data + 32, &ge->y); + } +} + +int secp256k1_ec_pubkey_parse(const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen) { + secp256k1_ge Q; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(input != NULL); + if (!secp256k1_eckey_pubkey_parse(&Q, input, inputlen)) { + return 0; + } + secp256k1_pubkey_save(pubkey, &Q); + secp256k1_ge_clear(&Q); + return 1; +} + +int secp256k1_ec_pubkey_serialize(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey* pubkey, unsigned int flags) { + secp256k1_ge Q; + size_t len; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(*outputlen >= ((flags & SECP256K1_FLAGS_BIT_COMPRESSION) ? 33 : 65)); + len = *outputlen; + *outputlen = 0; + ARG_CHECK(output != NULL); + memset(output, 0, len); + ARG_CHECK(pubkey != NULL); + ARG_CHECK((flags & SECP256K1_FLAGS_TYPE_MASK) == SECP256K1_FLAGS_TYPE_COMPRESSION); + if (secp256k1_pubkey_load(ctx, &Q, pubkey)) { + ret = secp256k1_eckey_pubkey_serialize(&Q, output, &len, flags & SECP256K1_FLAGS_BIT_COMPRESSION); + if (ret) { + *outputlen = len; + } + } + return ret; +} + +static void secp256k1_ecdsa_signature_load(const secp256k1_context* ctx, secp256k1_scalar* r, secp256k1_scalar* s, const secp256k1_ecdsa_signature* sig) { + (void)ctx; + if (sizeof(secp256k1_scalar) == 32) { + /* When the secp256k1_scalar type is exactly 32 byte, use its + * representation inside secp256k1_ecdsa_signature, as conversion is very fast. + * Note that secp256k1_ecdsa_signature_save must use the same representation. */ + memcpy(r, &sig->data[0], 32); + memcpy(s, &sig->data[32], 32); + } else { + secp256k1_scalar_set_b32(r, &sig->data[0], NULL); + secp256k1_scalar_set_b32(s, &sig->data[32], NULL); + } +} + +static void secp256k1_ecdsa_signature_save(secp256k1_ecdsa_signature* sig, const secp256k1_scalar* r, const secp256k1_scalar* s) { + if (sizeof(secp256k1_scalar) == 32) { + memcpy(&sig->data[0], r, 32); + memcpy(&sig->data[32], s, 32); + } else { + secp256k1_scalar_get_b32(&sig->data[0], r); + secp256k1_scalar_get_b32(&sig->data[32], s); + } +} + +int secp256k1_ecdsa_signature_parse_der(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input != NULL); + + if (secp256k1_ecdsa_sig_parse(&r, &s, input, inputlen)) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + return 1; + } else { + memset(sig, 0, sizeof(*sig)); + return 0; + } +} + +int secp256k1_ecdsa_signature_parse_compact(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input64) { + secp256k1_scalar r, s; + int ret = 1; + int overflow = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(input64 != NULL); + + secp256k1_scalar_set_b32(&r, &input64[0], &overflow); + ret &= !overflow; + secp256k1_scalar_set_b32(&s, &input64[32], &overflow); + ret &= !overflow; + if (ret) { + secp256k1_ecdsa_signature_save(sig, &r, &s); + } else { + memset(sig, 0, sizeof(*sig)); + } + return ret; +} + +int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context* ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output != NULL); + ARG_CHECK(outputlen != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return secp256k1_ecdsa_sig_serialize(output, outputlen, &r, &s); +} + +int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context* ctx, unsigned char *output64, const secp256k1_ecdsa_signature* sig) { + secp256k1_scalar r, s; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(output64 != NULL); + ARG_CHECK(sig != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + secp256k1_scalar_get_b32(&output64[0], &r); + secp256k1_scalar_get_b32(&output64[32], &s); + return 1; +} + +int secp256k1_ecdsa_signature_normalize(const secp256k1_context* ctx, secp256k1_ecdsa_signature *sigout, const secp256k1_ecdsa_signature *sigin) { + secp256k1_scalar r, s; + int ret = 0; + + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(sigin != NULL); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, sigin); + ret = secp256k1_scalar_is_high(&s); + if (sigout != NULL) { + if (ret) { + secp256k1_scalar_negate(&s, &s); + } + secp256k1_ecdsa_signature_save(sigout, &r, &s); + } + + return ret; +} + +int secp256k1_ecdsa_verify(const secp256k1_context* ctx, const secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const secp256k1_pubkey *pubkey) { + secp256k1_ge q; + secp256k1_scalar r, s; + secp256k1_scalar m; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(sig != NULL); + ARG_CHECK(pubkey != NULL); + + secp256k1_scalar_set_b32(&m, msg32, NULL); + secp256k1_ecdsa_signature_load(ctx, &r, &s, sig); + return (!secp256k1_scalar_is_high(&s) && + secp256k1_pubkey_load(ctx, &q, pubkey) && + secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &r, &s, &q, &m)); +} + +static SECP256K1_INLINE void buffer_append(unsigned char *buf, unsigned int *offset, const void *data, unsigned int len) { + memcpy(buf + *offset, data, len); + *offset += len; +} + +static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + unsigned char keydata[112]; + unsigned int offset = 0; + secp256k1_rfc6979_hmac_sha256 rng; + unsigned int i; + /* We feed a byte array to the PRNG as input, consisting of: + * - the private key (32 bytes) and message (32 bytes), see RFC 6979 3.2d. + * - optionally 32 extra bytes of data, see RFC 6979 3.6 Additional Data. + * - optionally 16 extra bytes with the algorithm name. + * Because the arguments have distinct fixed lengths it is not possible for + * different argument mixtures to emulate each other and result in the same + * nonces. + */ + buffer_append(keydata, &offset, key32, 32); + buffer_append(keydata, &offset, msg32, 32); + if (data != NULL) { + buffer_append(keydata, &offset, data, 32); + } + if (algo16 != NULL) { + buffer_append(keydata, &offset, algo16, 16); + } + secp256k1_rfc6979_hmac_sha256_initialize(&rng, keydata, offset); + memset(keydata, 0, sizeof(keydata)); + for (i = 0; i <= counter; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + return 1; +} + +const secp256k1_nonce_function secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; +const secp256k1_nonce_function secp256k1_nonce_function_default = nonce_function_rfc6979; + +int secp256k1_ecdsa_sign(const secp256k1_context* ctx, secp256k1_ecdsa_signature *signature, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void* noncedata) { + secp256k1_scalar r, s; + secp256k1_scalar sec, non, msg; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(msg32 != NULL); + ARG_CHECK(signature != NULL); + ARG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + unsigned char nonce32[32]; + unsigned int count = 0; + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + ret = noncefp(nonce32, msg32, seckey, NULL, (void*)noncedata, count); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + if (!overflow && !secp256k1_scalar_is_zero(&non)) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &r, &s, &sec, &msg, &non, NULL)) { + break; + } + } + count++; + } + memset(nonce32, 0, 32); + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (ret) { + secp256k1_ecdsa_signature_save(signature, &r, &s); + } else { + memset(signature, 0, sizeof(*signature)); + } + return ret; +} + +int secp256k1_ec_seckey_verify(const secp256k1_context* ctx, const unsigned char *seckey) { + secp256k1_scalar sec; + int ret; + int overflow; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + ret = !overflow && !secp256k1_scalar_is_zero(&sec); + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ec_pubkey_create(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) { + secp256k1_gej pj; + secp256k1_ge p; + secp256k1_scalar sec; + int overflow; + int ret = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + memset(pubkey, 0, sizeof(*pubkey)); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + ARG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + ret = (!overflow) & (!secp256k1_scalar_is_zero(&sec)); + if (ret) { + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); + secp256k1_ge_set_gej(&p, &pj); + secp256k1_pubkey_save(pubkey, &p); + } + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ec_privkey_negate(const secp256k1_context* ctx, unsigned char *seckey) { + secp256k1_scalar sec; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, NULL); + secp256k1_scalar_negate(&sec, &sec); + secp256k1_scalar_get_b32(seckey, &sec); + + return 1; +} + +int secp256k1_ec_pubkey_negate(const secp256k1_context* ctx, secp256k1_pubkey *pubkey) { + int ret = 0; + secp256k1_ge p; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(pubkey != NULL); + + ret = secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + secp256k1_ge_neg(&p, &p); + secp256k1_pubkey_save(pubkey, &p); + } + return ret; +} + +int secp256k1_ec_privkey_tweak_add(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar term; + secp256k1_scalar sec; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + + ret = !overflow && secp256k1_eckey_privkey_tweak_add(&sec, &term); + memset(seckey, 0, 32); + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&term); + return ret; +} + +int secp256k1_ec_pubkey_tweak_add(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar term; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + if (secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; + } + } + + return ret; +} + +int secp256k1_ec_privkey_tweak_mul(const secp256k1_context* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar factor; + secp256k1_scalar sec; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(seckey != NULL); + ARG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + ret = !overflow && secp256k1_eckey_privkey_tweak_mul(&sec, &factor); + memset(seckey, 0, 32); + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&factor); + return ret; +} + +int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context* ctx, secp256k1_pubkey *pubkey, const unsigned char *tweak) { + secp256k1_ge p; + secp256k1_scalar factor; + int ret = 0; + int overflow = 0; + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + ARG_CHECK(pubkey != NULL); + ARG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + ret = !overflow && secp256k1_pubkey_load(ctx, &p, pubkey); + memset(pubkey, 0, sizeof(*pubkey)); + if (ret) { + if (secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor)) { + secp256k1_pubkey_save(pubkey, &p); + } else { + ret = 0; + } + } + + return ret; +} + +int secp256k1_context_randomize(secp256k1_context* ctx, const unsigned char *seed32) { + VERIFY_CHECK(ctx != NULL); + ARG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + return 1; +} + +int secp256k1_ec_pubkey_combine(const secp256k1_context* ctx, secp256k1_pubkey *pubnonce, const secp256k1_pubkey * const *pubnonces, size_t n) { + size_t i; + secp256k1_gej Qj; + secp256k1_ge Q; + + ARG_CHECK(pubnonce != NULL); + memset(pubnonce, 0, sizeof(*pubnonce)); + ARG_CHECK(n >= 1); + ARG_CHECK(pubnonces != NULL); + + secp256k1_gej_set_infinity(&Qj); + + for (i = 0; i < n; i++) { + secp256k1_pubkey_load(ctx, &Q, pubnonces[i]); + secp256k1_gej_add_ge(&Qj, &Qj, &Q); + } + if (secp256k1_gej_is_infinity(&Qj)) { + return 0; + } + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(pubnonce, &Q); + return 1; +} + +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/main_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/main_impl.h" +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand.h new file mode 100644 index 00000000..426baafb --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand.h @@ -0,0 +1,36 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_TESTRAND_H +#define SECP256K1_TESTRAND_H + +#include "../../secp256k1-config.h" + +/* A non-cryptographic RNG used only for test infrastructure. */ + +/** Seed the pseudorandom number generator for testing. */ +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); + +/** Generate a pseudorandom number in the range [0..2**32-1]. */ +static uint32_t secp256k1_rand32(void); + +/** Generate a pseudorandom number in the range [0..2**bits-1]. Bits must be 1 or + * more. */ +static uint32_t secp256k1_rand_bits(int bits); + +/** Generate a pseudorandom number in the range [0..range-1]. */ +static uint32_t secp256k1_rand_int(uint32_t range); + +/** Generate a pseudorandom 32-byte array. */ +static void secp256k1_rand256(unsigned char *b32); + +/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ +static void secp256k1_rand256_test(unsigned char *b32); + +/** Generate pseudorandom bytes with long sequences of zero and one bits. */ +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len); + +#endif /* SECP256K1_TESTRAND_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand_impl.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand_impl.h new file mode 100644 index 00000000..30a91e52 --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/testrand_impl.h @@ -0,0 +1,110 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_TESTRAND_IMPL_H +#define SECP256K1_TESTRAND_IMPL_H + +#include +#include + +#include "testrand.h" +#include "hash.h" + +static secp256k1_rfc6979_hmac_sha256 secp256k1_test_rng; +static uint32_t secp256k1_test_rng_precomputed[8]; +static int secp256k1_test_rng_precomputed_used = 8; +static uint64_t secp256k1_test_rng_integer; +static int secp256k1_test_rng_integer_bits_left = 0; + +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { + secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, seed16, 16); +} + +SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { + if (secp256k1_test_rng_precomputed_used == 8) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed)); + secp256k1_test_rng_precomputed_used = 0; + } + return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; +} + +static uint32_t secp256k1_rand_bits(int bits) { + uint32_t ret; + if (secp256k1_test_rng_integer_bits_left < bits) { + secp256k1_test_rng_integer |= (((uint64_t)secp256k1_rand32()) << secp256k1_test_rng_integer_bits_left); + secp256k1_test_rng_integer_bits_left += 32; + } + ret = secp256k1_test_rng_integer; + secp256k1_test_rng_integer >>= bits; + secp256k1_test_rng_integer_bits_left -= bits; + ret &= ((~((uint32_t)0)) >> (32 - bits)); + return ret; +} + +static uint32_t secp256k1_rand_int(uint32_t range) { + /* We want a uniform integer between 0 and range-1, inclusive. + * B is the smallest number such that range <= 2**B. + * two mechanisms implemented here: + * - generate B bits numbers until one below range is found, and return it + * - find the largest multiple M of range that is <= 2**(B+A), generate B+A + * bits numbers until one below M is found, and return it modulo range + * The second mechanism consumes A more bits of entropy in every iteration, + * but may need fewer iterations due to M being closer to 2**(B+A) then + * range is to 2**B. The array below (indexed by B) contains a 0 when the + * first mechanism is to be used, and the number A otherwise. + */ + static const int addbits[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0}; + uint32_t trange, mult; + int bits = 0; + if (range <= 1) { + return 0; + } + trange = range - 1; + while (trange > 0) { + trange >>= 1; + bits++; + } + if (addbits[bits]) { + bits = bits + addbits[bits]; + mult = ((~((uint32_t)0)) >> (32 - bits)) / range; + trange = range * mult; + } else { + trange = range; + mult = 1; + } + while(1) { + uint32_t x = secp256k1_rand_bits(bits); + if (x < trange) { + return (mult == 1) ? x : (x % range); + } + } +} + +static void secp256k1_rand256(unsigned char *b32) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); +} + +static void secp256k1_rand_bytes_test(unsigned char *bytes, size_t len) { + size_t bits = 0; + memset(bytes, 0, len); + while (bits < len * 8) { + int now; + uint32_t val; + now = 1 + (secp256k1_rand_bits(6) * secp256k1_rand_bits(5) + 16) / 31; + val = secp256k1_rand_bits(1); + while (now > 0 && bits < len * 8) { + bytes[bits / 8] |= val << (bits % 8); + now--; + bits++; + } + } +} + +static void secp256k1_rand256_test(unsigned char *b32) { + secp256k1_rand_bytes_test(b32, 32); +} + +#endif /* SECP256K1_TESTRAND_IMPL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests.c new file mode 100644 index 00000000..fccd7bda --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests.c @@ -0,0 +1,5079 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "../../secp256k1-config.h" + +#include +#include +#include + +#include + +#include "secp256k1.c" +#include "secp256k1.h" +#include "testrand_impl.h" + +#ifdef ENABLE_OPENSSL_TESTS +#include "openssl/bn.h" +#include "openssl/ec.h" +#include "openssl/ecdsa.h" +#include "openssl/obj_mac.h" +# if OPENSSL_VERSION_NUMBER < 0x10100000L +void ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps) {*pr = sig->r; *ps = sig->s;} +# endif +#endif + +#include "lax_der_parsing.c" +#include "lax_der_privatekey_parsing.c" + +#if !defined(VG_CHECK) +# if defined(VALGRIND) +# include +# define VG_UNDEF(x,y) VALGRIND_MAKE_MEM_UNDEFINED((x),(y)) +# define VG_CHECK(x,y) VALGRIND_CHECK_MEM_IS_DEFINED((x),(y)) +# else +# define VG_UNDEF(x,y) +# define VG_CHECK(x,y) +# endif +#endif + +static int count = 64; +static secp256k1_context *ctx = NULL; + +static void counting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts. */ + int32_t *p; + (void)str; + p = data; + (*p)++; +} + +static void uncounting_illegal_callback_fn(const char* str, void* data) { + /* Dummy callback function that just counts (backwards). */ + int32_t *p; + (void)str; + p = data; + (*p)--; +} + +void random_field_element_test(secp256k1_fe *fe) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + if (secp256k1_fe_set_b32(fe, b32)) { + break; + } + } while(1); +} + +void random_field_element_magnitude(secp256k1_fe *fe) { + secp256k1_fe zero; + int n = secp256k1_rand_int(9); + secp256k1_fe_normalize(fe); + if (n == 0) { + return; + } + secp256k1_fe_clear(&zero); + secp256k1_fe_negate(&zero, &zero, 0); + secp256k1_fe_mul_int(&zero, n - 1); + secp256k1_fe_add(fe, &zero); + VERIFY_CHECK(fe->magnitude == n); +} + +void random_group_element_test(secp256k1_ge *ge) { + secp256k1_fe fe; + do { + random_field_element_test(&fe); + if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand_bits(1))) { + secp256k1_fe_normalize(&ge->y); + break; + } + } while(1); +} + +void random_group_element_jacobian_test(secp256k1_gej *gej, const secp256k1_ge *ge) { + secp256k1_fe z2, z3; + do { + random_field_element_test(&gej->z); + if (!secp256k1_fe_is_zero(&gej->z)) { + break; + } + } while(1); + secp256k1_fe_sqr(&z2, &gej->z); + secp256k1_fe_mul(&z3, &z2, &gej->z); + secp256k1_fe_mul(&gej->x, &ge->x, &z2); + secp256k1_fe_mul(&gej->y, &ge->y, &z3); + gej->infinity = ge->infinity; +} + +void random_scalar_order_test(secp256k1_scalar *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256_test(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void random_scalar_order(secp256k1_scalar *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void run_context_tests(void) { + secp256k1_pubkey pubkey; + secp256k1_pubkey zero_pubkey; + secp256k1_ecdsa_signature sig; + unsigned char ctmp[32]; + int32_t ecount; + int32_t ecount2; + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_context *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar msg, key, nonce; + secp256k1_scalar sigr, sigs; + + memset(&zero_pubkey, 0, sizeof(zero_pubkey)); + + ecount = 0; + ecount2 = 10; + secp256k1_context_set_illegal_callback(vrfy, counting_illegal_callback_fn, &ecount); + secp256k1_context_set_illegal_callback(sign, counting_illegal_callback_fn, &ecount2); + secp256k1_context_set_error_callback(sign, counting_illegal_callback_fn, NULL); + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); + + /*** clone and destroy all of them to make sure cloning was complete ***/ + { + secp256k1_context *ctx_tmp; + + ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); + } + + /* Verify that the error callback makes it across the clone. */ + CHECK(vrfy->error_callback.fn != sign->error_callback.fn); + /* And that it resets back to default. */ + secp256k1_context_set_error_callback(sign, NULL, NULL); + CHECK(vrfy->error_callback.fn == sign->error_callback.fn); + + /*** attempt to use them ***/ + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + + /* Verify context-type checking illegal-argument errors. */ + memset(ctmp, 1, 32); + CHECK(secp256k1_ec_pubkey_create(vrfy, &pubkey, ctmp) == 0); + CHECK(ecount == 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(sign, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ecdsa_sign(vrfy, &sig, ctmp, ctmp, NULL, NULL) == 0); + CHECK(ecount == 2); + VG_UNDEF(&sig, sizeof(sig)); + CHECK(secp256k1_ecdsa_sign(sign, &sig, ctmp, ctmp, NULL, NULL) == 1); + VG_CHECK(&sig, sizeof(sig)); + CHECK(ecount2 == 10); + CHECK(secp256k1_ecdsa_verify(sign, &sig, ctmp, &pubkey) == 0); + CHECK(ecount2 == 11); + CHECK(secp256k1_ecdsa_verify(vrfy, &sig, ctmp, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_add(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 12); + CHECK(secp256k1_ec_pubkey_tweak_add(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_tweak_mul(sign, &pubkey, ctmp) == 0); + CHECK(ecount2 == 13); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, &pubkey) == 1); + CHECK(ecount == 2); + CHECK(secp256k1_ec_pubkey_negate(sign, NULL) == 0); + CHECK(ecount2 == 14); + CHECK(secp256k1_ec_pubkey_negate(vrfy, &zero_pubkey) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ec_pubkey_tweak_mul(vrfy, &pubkey, ctmp) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_context_randomize(vrfy, ctmp) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_context_randomize(sign, NULL) == 1); + CHECK(ecount2 == 14); + secp256k1_context_set_illegal_callback(vrfy, NULL, NULL); + secp256k1_context_set_illegal_callback(sign, NULL, NULL); + + /* This shouldn't leak memory, due to already-set tests. */ + secp256k1_ecmult_gen_context_build(&sign->ecmult_gen_ctx, NULL); + secp256k1_ecmult_context_build(&vrfy->ecmult_ctx, NULL); + + /* obtain a working nonce */ + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); + + /* try signing */ + CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sigr, &sigs, &key, &msg, &nonce, NULL)); + + /* try verifying */ + CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sigr, &sigs, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sigr, &sigs, &pub, &msg)); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); + /* Defined as no-op. */ + secp256k1_context_destroy(NULL); +} + +void run_scratch_tests(void) { + int32_t ecount = 0; + secp256k1_context *none = secp256k1_context_create(SECP256K1_CONTEXT_NONE); + secp256k1_scratch_space *scratch; + + /* Test public API */ + secp256k1_context_set_illegal_callback(none, counting_illegal_callback_fn, &ecount); + + scratch = secp256k1_scratch_space_create(none, 1000); + CHECK(scratch != NULL); + CHECK(ecount == 0); + + /* Test internal API */ + CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000); + CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 1000); + + /* Allocating 500 bytes with no frame fails */ + CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL); + CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000); + + /* ...but pushing a new stack frame does affect the max allocation */ + CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1 == 1)); + CHECK(secp256k1_scratch_max_allocation(scratch, 1) < 500); /* 500 - ALIGNMENT */ + CHECK(secp256k1_scratch_alloc(scratch, 500) != NULL); + CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL); + + CHECK(secp256k1_scratch_allocate_frame(scratch, 500, 1) == 0); + + /* ...and this effect is undone by popping the frame */ + secp256k1_scratch_deallocate_frame(scratch); + CHECK(secp256k1_scratch_max_allocation(scratch, 0) == 1000); + CHECK(secp256k1_scratch_alloc(scratch, 500) == NULL); + + /* cleanup */ + secp256k1_scratch_space_destroy(scratch); + secp256k1_context_destroy(none); +} + +/***** HASH TESTS *****/ + +void run_sha256_tests(void) { + static const char *inputs[8] = { + "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "For this sample, this 63-byte string will be used as input data", + "This is exactly 64 bytes long, not counting the terminating byte" + }; + static const unsigned char outputs[8][32] = { + {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, + {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}, + {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50}, + {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d}, + {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30}, + {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}, + {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42}, + {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8} + }; + int i; + for (i = 0; i < 8; i++) { + unsigned char out[32]; + secp256k1_sha256 hasher; + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand_int(strlen(inputs[i])); + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_hmac_sha256_tests(void) { + static const char *keys[6] = { + "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", + "\x4a\x65\x66\x65", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + }; + static const char *inputs[6] = { + "\x48\x69\x20\x54\x68\x65\x72\x65", + "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", + "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", + "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74", + "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e" + }; + static const unsigned char outputs[6][32] = { + {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7}, + {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43}, + {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe}, + {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b}, + {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54}, + {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2} + }; + int i; + for (i = 0; i < 6; i++) { + secp256k1_hmac_sha256 hasher; + unsigned char out[32]; + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand_int(strlen(inputs[i])); + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_rfc6979_hmac_sha256_tests(void) { + static const unsigned char key1[65] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a, 0}; + static const unsigned char out1[3][32] = { + {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, + {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, + {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} + }; + + static const unsigned char key2[64] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; + static const unsigned char out2[3][32] = { + {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, + {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, + {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} + }; + + secp256k1_rfc6979_hmac_sha256 rng; + unsigned char out[32]; + int i; + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 64); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 65); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) != 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 64); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out2[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); +} + +/***** RANDOM TESTS *****/ + +void test_rand_bits(int rand32, int bits) { + /* (1-1/2^B)^rounds[B] < 1/10^9, so rounds is the number of iterations to + * get a false negative chance below once in a billion */ + static const unsigned int rounds[7] = {1, 30, 73, 156, 322, 653, 1316}; + /* We try multiplying the results with various odd numbers, which shouldn't + * influence the uniform distribution modulo a power of 2. */ + static const uint32_t mults[6] = {1, 3, 21, 289, 0x9999, 0x80402011}; + /* We only select up to 6 bits from the output to analyse */ + unsigned int usebits = bits > 6 ? 6 : bits; + unsigned int maxshift = bits - usebits; + /* For each of the maxshift+1 usebits-bit sequences inside a bits-bit + number, track all observed outcomes, one per bit in a uint64_t. */ + uint64_t x[6][27] = {{0}}; + unsigned int i, shift, m; + /* Multiply the output of all rand calls with the odd number m, which + should not change the uniformity of its distribution. */ + for (i = 0; i < rounds[usebits]; i++) { + uint32_t r = (rand32 ? secp256k1_rand32() : secp256k1_rand_bits(bits)); + CHECK((((uint64_t)r) >> bits) == 0); + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + uint32_t rm = r * mults[m]; + for (shift = 0; shift <= maxshift; shift++) { + x[m][shift] |= (((uint64_t)1) << ((rm >> shift) & ((1 << usebits) - 1))); + } + } + } + for (m = 0; m < sizeof(mults) / sizeof(mults[0]); m++) { + for (shift = 0; shift <= maxshift; shift++) { + /* Test that the lower usebits bits of x[shift] are 1 */ + CHECK(((~x[m][shift]) << (64 - (1 << usebits))) == 0); + } + } +} + +/* Subrange must be a whole divisor of range, and at most 64 */ +void test_rand_int(uint32_t range, uint32_t subrange) { + /* (1-1/subrange)^rounds < 1/10^9 */ + int rounds = (subrange * 2073) / 100; + int i; + uint64_t x = 0; + CHECK((range % subrange) == 0); + for (i = 0; i < rounds; i++) { + uint32_t r = secp256k1_rand_int(range); + CHECK(r < range); + r = r % subrange; + x |= (((uint64_t)1) << r); + } + /* Test that the lower subrange bits of x are 1. */ + CHECK(((~x) << (64 - subrange)) == 0); +} + +void run_rand_bits(void) { + size_t b; + test_rand_bits(1, 32); + for (b = 1; b <= 32; b++) { + test_rand_bits(0, b); + } +} + +void run_rand_int(void) { + static const uint32_t ms[] = {1, 3, 17, 1000, 13771, 999999, 33554432}; + static const uint32_t ss[] = {1, 3, 6, 9, 13, 31, 64}; + unsigned int m, s; + for (m = 0; m < sizeof(ms) / sizeof(ms[0]); m++) { + for (s = 0; s < sizeof(ss) / sizeof(ss[0]); s++) { + test_rand_int(ms[m] * ss[s], ss[s]); + } + } +} + +/***** NUM TESTS *****/ + +#ifndef USE_NUM_NONE +void random_num_negate(secp256k1_num *num) { + if (secp256k1_rand_bits(1)) { + secp256k1_num_negate(num); + } +} + +void random_num_order_test(secp256k1_num *num) { + secp256k1_scalar sc; + random_scalar_order_test(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void random_num_order(secp256k1_num *num) { + secp256k1_scalar sc; + random_scalar_order(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void test_num_negate(void) { + secp256k1_num n1; + secp256k1_num n2; + random_num_order_test(&n1); /* n1 = R */ + random_num_negate(&n1); + secp256k1_num_copy(&n2, &n1); /* n2 = R */ + secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(!secp256k1_num_is_zero(&n1)); + secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); + secp256k1_num_negate(&n1); /* n1 = R */ + CHECK(secp256k1_num_eq(&n1, &n2)); +} + +void test_num_add_sub(void) { + int i; + secp256k1_scalar s; + secp256k1_num n1; + secp256k1_num n2; + secp256k1_num n1p2, n2p1, n1m2, n2m1; + random_num_order_test(&n1); /* n1 = R1 */ + if (secp256k1_rand_bits(1)) { + random_num_negate(&n1); + } + random_num_order_test(&n2); /* n2 = R2 */ + if (secp256k1_rand_bits(1)) { + random_num_negate(&n2); + } + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ + secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ + secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ + secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ + CHECK(secp256k1_num_eq(&n1p2, &n2p1)); + CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); + secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1m2)); + CHECK(!secp256k1_num_eq(&n2m1, &n1)); + secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1)); + CHECK(!secp256k1_num_eq(&n2p1, &n1)); + secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ + CHECK(secp256k1_num_eq(&n2p1, &n1)); + + /* check is_one */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&n1, &s); + CHECK(secp256k1_num_is_one(&n1)); + /* check that 2^n + 1 is never 1 */ + secp256k1_scalar_get_num(&n2, &s); + for (i = 0; i < 250; ++i) { + secp256k1_num_add(&n1, &n1, &n1); /* n1 *= 2 */ + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = n1 + 1 */ + CHECK(!secp256k1_num_is_one(&n1p2)); + } +} + +void test_num_mod(void) { + int i; + secp256k1_scalar s; + secp256k1_num order, n; + + /* check that 0 mod anything is 0 */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_set_int(&s, 0); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that anything mod 1 is 0 */ + secp256k1_scalar_set_int(&s, 1); + secp256k1_scalar_get_num(&order, &s); + secp256k1_scalar_get_num(&n, &s); + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); + + /* check that increasing the number past 2^256 does not break this */ + random_scalar_order_test(&s); + secp256k1_scalar_get_num(&n, &s); + /* multiply by 2^8, which'll test this case with high probability */ + for (i = 0; i < 8; ++i) { + secp256k1_num_add(&n, &n, &n); + } + secp256k1_num_mod(&n, &order); + CHECK(secp256k1_num_is_zero(&n)); +} + +void test_num_jacobi(void) { + secp256k1_scalar sqr; + secp256k1_scalar small; + secp256k1_scalar five; /* five is not a quadratic residue */ + secp256k1_num order, n; + int i; + /* squares mod 5 are 1, 4 */ + const int jacobi5[10] = { 0, 1, -1, -1, 1, 0, 1, -1, -1, 1 }; + + /* check some small values with 5 as the order */ + secp256k1_scalar_set_int(&five, 5); + secp256k1_scalar_get_num(&order, &five); + for (i = 0; i < 10; ++i) { + secp256k1_scalar_set_int(&small, i); + secp256k1_scalar_get_num(&n, &small); + CHECK(secp256k1_num_jacobi(&n, &order) == jacobi5[i]); + } + + /** test large values with 5 as group order */ + secp256k1_scalar_get_num(&order, &five); + /* we first need a scalar which is not a multiple of 5 */ + do { + secp256k1_num fiven; + random_scalar_order_test(&sqr); + secp256k1_scalar_get_num(&fiven, &five); + secp256k1_scalar_get_num(&n, &sqr); + secp256k1_num_mod(&n, &fiven); + } while (secp256k1_num_is_zero(&n)); + /* next force it to be a residue. 2 is a nonresidue mod 5 so we can + * just multiply by two, i.e. add the number to itself */ + if (secp256k1_num_jacobi(&n, &order) == -1) { + secp256k1_num_add(&n, &n, &n); + } + + /* test residue */ + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_num_add(&n, &n, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + + /** test with secp group order as order */ + secp256k1_scalar_order_get_num(&order); + random_scalar_order_test(&sqr); + secp256k1_scalar_sqr(&sqr, &sqr); + /* test residue */ + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); + /* test nonresidue */ + secp256k1_scalar_mul(&sqr, &sqr, &five); + secp256k1_scalar_get_num(&n, &sqr); + CHECK(secp256k1_num_jacobi(&n, &order) == -1); + /* test multiple of the order*/ + CHECK(secp256k1_num_jacobi(&order, &order) == 0); + + /* check one less than the order */ + secp256k1_scalar_set_int(&small, 1); + secp256k1_scalar_get_num(&n, &small); + secp256k1_num_sub(&n, &order, &n); + CHECK(secp256k1_num_jacobi(&n, &order) == 1); /* sage confirms this is 1 */ +} + +void run_num_smalltests(void) { + int i; + for (i = 0; i < 100*count; i++) { + test_num_negate(); + test_num_add_sub(); + test_num_mod(); + test_num_jacobi(); + } +} +#endif + +/***** SCALAR TESTS *****/ + +void scalar_test(void) { + secp256k1_scalar s; + secp256k1_scalar s1; + secp256k1_scalar s2; +#ifndef USE_NUM_NONE + secp256k1_num snum, s1num, s2num; + secp256k1_num order, half_order; +#endif + unsigned char c[32]; + + /* Set 's' to a random scalar, with value 'snum'. */ + random_scalar_order_test(&s); + + /* Set 's1' to a random scalar, with value 's1num'. */ + random_scalar_order_test(&s1); + + /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ + random_scalar_order_test(&s2); + secp256k1_scalar_get_b32(c, &s2); + +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&snum, &s); + secp256k1_scalar_get_num(&s1num, &s1); + secp256k1_scalar_get_num(&s2num, &s2); + + secp256k1_scalar_order_get_num(&order); + half_order = order; + secp256k1_num_shift(&half_order, 1); +#endif + + { + int i; + /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar n; + secp256k1_scalar_set_int(&n, 0); + for (i = 0; i < 256; i += 4) { + secp256k1_scalar t; + int j; + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); + for (j = 0; j < 4; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + + { + /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar n; + int i = 0; + secp256k1_scalar_set_int(&n, 0); + while (i < 256) { + secp256k1_scalar t; + int j; + int now = secp256k1_rand_int(15) + 1; + if (now + i > 256) { + now = 256 - i; + } + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now)); + for (j = 0; j < now; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + i += now; + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + +#ifndef USE_NUM_NONE + { + /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ + secp256k1_num rnum; + secp256k1_num r2num; + secp256k1_scalar r; + secp256k1_num_add(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_add(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + } + + { + /* Test that multiplying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_scalar r; + secp256k1_num r2num; + secp256k1_num rnum; + secp256k1_num_mul(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_mul(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + /* The result can only be zero if at least one of the factors was zero. */ + CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); + /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ + CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); + CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); + } + + { + secp256k1_scalar neg; + secp256k1_num negnum; + secp256k1_num negnum2; + /* Check that comparison with zero matches comparison with zero on the number. */ + CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); + /* Check that comparison with the half order is equal to testing for high scalar. */ + CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0)); + secp256k1_scalar_negate(&neg, &s); + secp256k1_num_sub(&negnum, &order, &snum); + secp256k1_num_mod(&negnum, &order); + /* Check that comparison with the half order is equal to testing for high scalar after negation. */ + CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0)); + /* Negating should change the high property, unless the value was already zero. */ + CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); + secp256k1_scalar_get_num(&negnum2, &neg); + /* Negating a scalar should be equal to (order - n) mod order on the number. */ + CHECK(secp256k1_num_eq(&negnum, &negnum2)); + secp256k1_scalar_add(&neg, &neg, &s); + /* Adding a number to its negation should result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + secp256k1_scalar_negate(&neg, &neg); + /* Negating zero should still result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + } + + { + /* Test secp256k1_scalar_mul_shift_var. */ + secp256k1_scalar r; + secp256k1_num one; + secp256k1_num rnum; + secp256k1_num rnum2; + unsigned char cone[1] = {0x01}; + unsigned int shift = 256 + secp256k1_rand_int(257); + secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); + secp256k1_num_mul(&rnum, &s1num, &s2num); + secp256k1_num_shift(&rnum, shift - 1); + secp256k1_num_set_bin(&one, cone, 1); + secp256k1_num_add(&rnum, &rnum, &one); + secp256k1_num_shift(&rnum, 1); + secp256k1_scalar_get_num(&rnum2, &r); + CHECK(secp256k1_num_eq(&rnum, &rnum2)); + } + + { + /* test secp256k1_scalar_shr_int */ + secp256k1_scalar r; + int i; + random_scalar_order_test(&r); + for (i = 0; i < 100; ++i) { + int low; + int shift = 1 + secp256k1_rand_int(15); + int expected = r.d[0] % (1 << shift); + low = secp256k1_scalar_shr_int(&r, shift); + CHECK(expected == low); + } + } +#endif + + { + /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ + if (!secp256k1_scalar_is_zero(&s)) { + secp256k1_scalar inv; +#ifndef USE_NUM_NONE + secp256k1_num invnum; + secp256k1_num invnum2; +#endif + secp256k1_scalar_inverse(&inv, &s); +#ifndef USE_NUM_NONE + secp256k1_num_mod_inverse(&invnum, &snum, &order); + secp256k1_scalar_get_num(&invnum2, &inv); + CHECK(secp256k1_num_eq(&invnum, &invnum2)); +#endif + secp256k1_scalar_mul(&inv, &inv, &s); + /* Multiplying a scalar with its inverse must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + secp256k1_scalar_inverse(&inv, &inv); + /* Inverting one must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&invnum, &inv); + CHECK(secp256k1_num_is_one(&invnum)); +#endif + } + } + + { + /* Test commutativity of add. */ + secp256k1_scalar r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + secp256k1_scalar r1, r2; + secp256k1_scalar b; + int i; + /* Test add_bit. */ + int bit = secp256k1_rand_bits(8); + secp256k1_scalar_set_int(&b, 1); + CHECK(secp256k1_scalar_is_one(&b)); + for (i = 0; i < bit; i++) { + secp256k1_scalar_add(&b, &b, &b); + } + r1 = s1; + r2 = s1; + if (!secp256k1_scalar_add(&r1, &r1, &b)) { + /* No overflow happened. */ + secp256k1_scalar_cadd_bit(&r2, bit, 1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + /* cadd is a noop when flag is zero */ + secp256k1_scalar_cadd_bit(&r2, bit, 0); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + } + + { + /* Test commutativity of mul. */ + secp256k1_scalar r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of add. */ + secp256k1_scalar r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r1, &r1, &s); + secp256k1_scalar_add(&r2, &s2, &s); + secp256k1_scalar_add(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of mul. */ + secp256k1_scalar r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s2, &s); + secp256k1_scalar_mul(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test distributitivity of mul over add. */ + secp256k1_scalar r1, r2, t; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s1, &s); + secp256k1_scalar_mul(&t, &s2, &s); + secp256k1_scalar_add(&r2, &r2, &t); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test square. */ + secp256k1_scalar r1, r2; + secp256k1_scalar_sqr(&r1, &s1); + secp256k1_scalar_mul(&r2, &s1, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test multiplicative identity. */ + secp256k1_scalar r1, v1; + secp256k1_scalar_set_int(&v1,1); + secp256k1_scalar_mul(&r1, &s1, &v1); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test additive identity. */ + secp256k1_scalar r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_add(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test zero product property. */ + secp256k1_scalar r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_mul(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &v0)); + } + +} + +void run_scalar_tests(void) { + int i; + for (i = 0; i < 128 * count; i++) { + scalar_test(); + } + + { + /* (-1)+1 should be zero. */ + secp256k1_scalar s, o; + secp256k1_scalar_set_int(&s, 1); + CHECK(secp256k1_scalar_is_one(&s)); + secp256k1_scalar_negate(&o, &s); + secp256k1_scalar_add(&o, &o, &s); + CHECK(secp256k1_scalar_is_zero(&o)); + secp256k1_scalar_negate(&o, &o); + CHECK(secp256k1_scalar_is_zero(&o)); + } + +#ifndef USE_NUM_NONE + { + /* A scalar with value of the curve order should be 0. */ + secp256k1_num order; + secp256k1_scalar zero; + unsigned char bin[32]; + int overflow = 0; + secp256k1_scalar_order_get_num(&order); + secp256k1_num_get_bin(bin, 32, &order); + secp256k1_scalar_set_b32(&zero, bin, &overflow); + CHECK(overflow == 1); + CHECK(secp256k1_scalar_is_zero(&zero)); + } +#endif + + { + /* Does check_overflow check catch all ones? */ + static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL + ); + CHECK(secp256k1_scalar_check_overflow(&overflowed)); + } + + { + /* Static test vectors. + * These were reduced from ~10^12 random vectors based on comparison-decision + * and edge-case coverage on 32-bit and 64-bit implementations. + * The responses were generated with Sage 5.9. + */ + secp256k1_scalar x; + secp256k1_scalar y; + secp256k1_scalar z; + secp256k1_scalar zz; + secp256k1_scalar one; + secp256k1_scalar r1; + secp256k1_scalar r2; +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar zzv; +#endif + int overflow; + unsigned char chal[33][2][32] = { + {{0xff, 0xff, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0xc0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff}}, + {{0xef, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x80, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xe0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1e, 0xf8, 0xff, 0xff, 0xff, 0xfd, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, + 0x00, 0x00, 0x00, 0xf8, 0xff, 0x03, 0x00, 0xe0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, + 0xf3, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x80, 0xff, 0xff, 0x3f, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xfc, 0x9f, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x0f, 0xfc, 0xff, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0x00, 0xf8, 0xff, 0x0f, 0xc0, 0xff, 0xff, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x07, 0x80, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x00, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x00, 0xf8, 0xff, 0x03, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0xc0, 0xff, 0x0f, 0xfc, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x3f, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0x8f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x80, 0xff, 0x7f}, + {0xff, 0xcf, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0xff, 0xff, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0x01, 0xfc, 0xff, 0x01, 0x00, 0xfe, 0xff}, + {0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7f, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xff, 0x01, 0x00, 0xf0, 0xff, 0xff, + 0xe0, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0x3f, 0xf0, 0xff, 0xff, 0x3f, + 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0f, 0x7e, 0x00, 0x00}}, + {{0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x1f, 0x00, 0x00, 0xfe, 0x07, 0x00}, + {0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60}}, + {{0xff, 0x01, 0x00, 0xff, 0xff, 0xff, 0x0f, 0x00, + 0x80, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0x1f, 0x00, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00}}, + {{0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, + 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0xff, 0xff, 0xcf, 0xff, 0x1f, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x7e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00}, + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x80, + 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x7f, 0xf8, 0xff, 0xff, 0x1f, 0x00, 0xfe}}, + {{0xff, 0xff, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0x03, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xc0, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff}}, + {{0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x7e, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x07, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, + {{0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x3f, 0x00, 0x00, 0xc0, 0xf1, 0x7f, 0x00}}, + {{0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00}, + {0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, + 0x00, 0x00, 0xfc, 0xff, 0xff, 0x01, 0xff, 0xff}}, + {{0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0x00, 0x00, 0x80, 0xff, 0x03, 0xe0, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00}, + {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0xff, 0xff, 0xf0, 0x07, 0x00, 0x3c, 0x80, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x07, 0xe0, 0xff, 0x00, 0x00, 0x00}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80}, + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x80, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0x7f, 0xfe, 0xff, 0x1f, + 0x00, 0xfe, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff}}, + {{0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, + 0xff, 0xff, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, + 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf0}, + {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, + 0xf8, 0x07, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc7, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff}}, + {{0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}, + {0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0x82, 0xc9, 0xfa, 0xb0, 0x68, 0x04, 0xa0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0x03, 0xfb, + 0xfa, 0x8a, 0x7d, 0xdf, 0x13, 0x86, 0xe2, 0x03}} + }; + unsigned char res[33][2][32] = { + {{0x0c, 0x3b, 0x0a, 0xca, 0x8d, 0x1a, 0x2f, 0xb9, + 0x8a, 0x7b, 0x53, 0x5a, 0x1f, 0xc5, 0x22, 0xa1, + 0x07, 0x2a, 0x48, 0xea, 0x02, 0xeb, 0xb3, 0xd6, + 0x20, 0x1e, 0x86, 0xd0, 0x95, 0xf6, 0x92, 0x35}, + {0xdc, 0x90, 0x7a, 0x07, 0x2e, 0x1e, 0x44, 0x6d, + 0xf8, 0x15, 0x24, 0x5b, 0x5a, 0x96, 0x37, 0x9c, + 0x37, 0x7b, 0x0d, 0xac, 0x1b, 0x65, 0x58, 0x49, + 0x43, 0xb7, 0x31, 0xbb, 0xa7, 0xf4, 0x97, 0x15}}, + {{0xf1, 0xf7, 0x3a, 0x50, 0xe6, 0x10, 0xba, 0x22, + 0x43, 0x4d, 0x1f, 0x1f, 0x7c, 0x27, 0xca, 0x9c, + 0xb8, 0xb6, 0xa0, 0xfc, 0xd8, 0xc0, 0x05, 0x2f, + 0xf7, 0x08, 0xe1, 0x76, 0xdd, 0xd0, 0x80, 0xc8}, + {0xe3, 0x80, 0x80, 0xb8, 0xdb, 0xe3, 0xa9, 0x77, + 0x00, 0xb0, 0xf5, 0x2e, 0x27, 0xe2, 0x68, 0xc4, + 0x88, 0xe8, 0x04, 0xc1, 0x12, 0xbf, 0x78, 0x59, + 0xe6, 0xa9, 0x7c, 0xe1, 0x81, 0xdd, 0xb9, 0xd5}}, + {{0x96, 0xe2, 0xee, 0x01, 0xa6, 0x80, 0x31, 0xef, + 0x5c, 0xd0, 0x19, 0xb4, 0x7d, 0x5f, 0x79, 0xab, + 0xa1, 0x97, 0xd3, 0x7e, 0x33, 0xbb, 0x86, 0x55, + 0x60, 0x20, 0x10, 0x0d, 0x94, 0x2d, 0x11, 0x7c}, + {0xcc, 0xab, 0xe0, 0xe8, 0x98, 0x65, 0x12, 0x96, + 0x38, 0x5a, 0x1a, 0xf2, 0x85, 0x23, 0x59, 0x5f, + 0xf9, 0xf3, 0xc2, 0x81, 0x70, 0x92, 0x65, 0x12, + 0x9c, 0x65, 0x1e, 0x96, 0x00, 0xef, 0xe7, 0x63}}, + {{0xac, 0x1e, 0x62, 0xc2, 0x59, 0xfc, 0x4e, 0x5c, + 0x83, 0xb0, 0xd0, 0x6f, 0xce, 0x19, 0xf6, 0xbf, + 0xa4, 0xb0, 0xe0, 0x53, 0x66, 0x1f, 0xbf, 0xc9, + 0x33, 0x47, 0x37, 0xa9, 0x3d, 0x5d, 0xb0, 0x48}, + {0x86, 0xb9, 0x2a, 0x7f, 0x8e, 0xa8, 0x60, 0x42, + 0x26, 0x6d, 0x6e, 0x1c, 0xa2, 0xec, 0xe0, 0xe5, + 0x3e, 0x0a, 0x33, 0xbb, 0x61, 0x4c, 0x9f, 0x3c, + 0xd1, 0xdf, 0x49, 0x33, 0xcd, 0x72, 0x78, 0x18}}, + {{0xf7, 0xd3, 0xcd, 0x49, 0x5c, 0x13, 0x22, 0xfb, + 0x2e, 0xb2, 0x2f, 0x27, 0xf5, 0x8a, 0x5d, 0x74, + 0xc1, 0x58, 0xc5, 0xc2, 0x2d, 0x9f, 0x52, 0xc6, + 0x63, 0x9f, 0xba, 0x05, 0x76, 0x45, 0x7a, 0x63}, + {0x8a, 0xfa, 0x55, 0x4d, 0xdd, 0xa3, 0xb2, 0xc3, + 0x44, 0xfd, 0xec, 0x72, 0xde, 0xef, 0xc0, 0x99, + 0xf5, 0x9f, 0xe2, 0x52, 0xb4, 0x05, 0x32, 0x58, + 0x57, 0xc1, 0x8f, 0xea, 0xc3, 0x24, 0x5b, 0x94}}, + {{0x05, 0x83, 0xee, 0xdd, 0x64, 0xf0, 0x14, 0x3b, + 0xa0, 0x14, 0x4a, 0x3a, 0x41, 0x82, 0x7c, 0xa7, + 0x2c, 0xaa, 0xb1, 0x76, 0xbb, 0x59, 0x64, 0x5f, + 0x52, 0xad, 0x25, 0x29, 0x9d, 0x8f, 0x0b, 0xb0}, + {0x7e, 0xe3, 0x7c, 0xca, 0xcd, 0x4f, 0xb0, 0x6d, + 0x7a, 0xb2, 0x3e, 0xa0, 0x08, 0xb9, 0xa8, 0x2d, + 0xc2, 0xf4, 0x99, 0x66, 0xcc, 0xac, 0xd8, 0xb9, + 0x72, 0x2a, 0x4a, 0x3e, 0x0f, 0x7b, 0xbf, 0xf4}}, + {{0x8c, 0x9c, 0x78, 0x2b, 0x39, 0x61, 0x7e, 0xf7, + 0x65, 0x37, 0x66, 0x09, 0x38, 0xb9, 0x6f, 0x70, + 0x78, 0x87, 0xff, 0xcf, 0x93, 0xca, 0x85, 0x06, + 0x44, 0x84, 0xa7, 0xfe, 0xd3, 0xa4, 0xe3, 0x7e}, + {0xa2, 0x56, 0x49, 0x23, 0x54, 0xa5, 0x50, 0xe9, + 0x5f, 0xf0, 0x4d, 0xe7, 0xdc, 0x38, 0x32, 0x79, + 0x4f, 0x1c, 0xb7, 0xe4, 0xbb, 0xf8, 0xbb, 0x2e, + 0x40, 0x41, 0x4b, 0xcc, 0xe3, 0x1e, 0x16, 0x36}}, + {{0x0c, 0x1e, 0xd7, 0x09, 0x25, 0x40, 0x97, 0xcb, + 0x5c, 0x46, 0xa8, 0xda, 0xef, 0x25, 0xd5, 0xe5, + 0x92, 0x4d, 0xcf, 0xa3, 0xc4, 0x5d, 0x35, 0x4a, + 0xe4, 0x61, 0x92, 0xf3, 0xbf, 0x0e, 0xcd, 0xbe}, + {0xe4, 0xaf, 0x0a, 0xb3, 0x30, 0x8b, 0x9b, 0x48, + 0x49, 0x43, 0xc7, 0x64, 0x60, 0x4a, 0x2b, 0x9e, + 0x95, 0x5f, 0x56, 0xe8, 0x35, 0xdc, 0xeb, 0xdc, + 0xc7, 0xc4, 0xfe, 0x30, 0x40, 0xc7, 0xbf, 0xa4}}, + {{0xd4, 0xa0, 0xf5, 0x81, 0x49, 0x6b, 0xb6, 0x8b, + 0x0a, 0x69, 0xf9, 0xfe, 0xa8, 0x32, 0xe5, 0xe0, + 0xa5, 0xcd, 0x02, 0x53, 0xf9, 0x2c, 0xe3, 0x53, + 0x83, 0x36, 0xc6, 0x02, 0xb5, 0xeb, 0x64, 0xb8}, + {0x1d, 0x42, 0xb9, 0xf9, 0xe9, 0xe3, 0x93, 0x2c, + 0x4c, 0xee, 0x6c, 0x5a, 0x47, 0x9e, 0x62, 0x01, + 0x6b, 0x04, 0xfe, 0xa4, 0x30, 0x2b, 0x0d, 0x4f, + 0x71, 0x10, 0xd3, 0x55, 0xca, 0xf3, 0x5e, 0x80}}, + {{0x77, 0x05, 0xf6, 0x0c, 0x15, 0x9b, 0x45, 0xe7, + 0xb9, 0x11, 0xb8, 0xf5, 0xd6, 0xda, 0x73, 0x0c, + 0xda, 0x92, 0xea, 0xd0, 0x9d, 0xd0, 0x18, 0x92, + 0xce, 0x9a, 0xaa, 0xee, 0x0f, 0xef, 0xde, 0x30}, + {0xf1, 0xf1, 0xd6, 0x9b, 0x51, 0xd7, 0x77, 0x62, + 0x52, 0x10, 0xb8, 0x7a, 0x84, 0x9d, 0x15, 0x4e, + 0x07, 0xdc, 0x1e, 0x75, 0x0d, 0x0c, 0x3b, 0xdb, + 0x74, 0x58, 0x62, 0x02, 0x90, 0x54, 0x8b, 0x43}}, + {{0xa6, 0xfe, 0x0b, 0x87, 0x80, 0x43, 0x67, 0x25, + 0x57, 0x5d, 0xec, 0x40, 0x50, 0x08, 0xd5, 0x5d, + 0x43, 0xd7, 0xe0, 0xaa, 0xe0, 0x13, 0xb6, 0xb0, + 0xc0, 0xd4, 0xe5, 0x0d, 0x45, 0x83, 0xd6, 0x13}, + {0x40, 0x45, 0x0a, 0x92, 0x31, 0xea, 0x8c, 0x60, + 0x8c, 0x1f, 0xd8, 0x76, 0x45, 0xb9, 0x29, 0x00, + 0x26, 0x32, 0xd8, 0xa6, 0x96, 0x88, 0xe2, 0xc4, + 0x8b, 0xdb, 0x7f, 0x17, 0x87, 0xcc, 0xc8, 0xf2}}, + {{0xc2, 0x56, 0xe2, 0xb6, 0x1a, 0x81, 0xe7, 0x31, + 0x63, 0x2e, 0xbb, 0x0d, 0x2f, 0x81, 0x67, 0xd4, + 0x22, 0xe2, 0x38, 0x02, 0x25, 0x97, 0xc7, 0x88, + 0x6e, 0xdf, 0xbe, 0x2a, 0xa5, 0x73, 0x63, 0xaa}, + {0x50, 0x45, 0xe2, 0xc3, 0xbd, 0x89, 0xfc, 0x57, + 0xbd, 0x3c, 0xa3, 0x98, 0x7e, 0x7f, 0x36, 0x38, + 0x92, 0x39, 0x1f, 0x0f, 0x81, 0x1a, 0x06, 0x51, + 0x1f, 0x8d, 0x6a, 0xff, 0x47, 0x16, 0x06, 0x9c}}, + {{0x33, 0x95, 0xa2, 0x6f, 0x27, 0x5f, 0x9c, 0x9c, + 0x64, 0x45, 0xcb, 0xd1, 0x3c, 0xee, 0x5e, 0x5f, + 0x48, 0xa6, 0xaf, 0xe3, 0x79, 0xcf, 0xb1, 0xe2, + 0xbf, 0x55, 0x0e, 0xa2, 0x3b, 0x62, 0xf0, 0xe4}, + {0x14, 0xe8, 0x06, 0xe3, 0xbe, 0x7e, 0x67, 0x01, + 0xc5, 0x21, 0x67, 0xd8, 0x54, 0xb5, 0x7f, 0xa4, + 0xf9, 0x75, 0x70, 0x1c, 0xfd, 0x79, 0xdb, 0x86, + 0xad, 0x37, 0x85, 0x83, 0x56, 0x4e, 0xf0, 0xbf}}, + {{0xbc, 0xa6, 0xe0, 0x56, 0x4e, 0xef, 0xfa, 0xf5, + 0x1d, 0x5d, 0x3f, 0x2a, 0x5b, 0x19, 0xab, 0x51, + 0xc5, 0x8b, 0xdd, 0x98, 0x28, 0x35, 0x2f, 0xc3, + 0x81, 0x4f, 0x5c, 0xe5, 0x70, 0xb9, 0xeb, 0x62}, + {0xc4, 0x6d, 0x26, 0xb0, 0x17, 0x6b, 0xfe, 0x6c, + 0x12, 0xf8, 0xe7, 0xc1, 0xf5, 0x2f, 0xfa, 0x91, + 0x13, 0x27, 0xbd, 0x73, 0xcc, 0x33, 0x31, 0x1c, + 0x39, 0xe3, 0x27, 0x6a, 0x95, 0xcf, 0xc5, 0xfb}}, + {{0x30, 0xb2, 0x99, 0x84, 0xf0, 0x18, 0x2a, 0x6e, + 0x1e, 0x27, 0xed, 0xa2, 0x29, 0x99, 0x41, 0x56, + 0xe8, 0xd4, 0x0d, 0xef, 0x99, 0x9c, 0xf3, 0x58, + 0x29, 0x55, 0x1a, 0xc0, 0x68, 0xd6, 0x74, 0xa4}, + {0x07, 0x9c, 0xe7, 0xec, 0xf5, 0x36, 0x73, 0x41, + 0xa3, 0x1c, 0xe5, 0x93, 0x97, 0x6a, 0xfd, 0xf7, + 0x53, 0x18, 0xab, 0xaf, 0xeb, 0x85, 0xbd, 0x92, + 0x90, 0xab, 0x3c, 0xbf, 0x30, 0x82, 0xad, 0xf6}}, + {{0xc6, 0x87, 0x8a, 0x2a, 0xea, 0xc0, 0xa9, 0xec, + 0x6d, 0xd3, 0xdc, 0x32, 0x23, 0xce, 0x62, 0x19, + 0xa4, 0x7e, 0xa8, 0xdd, 0x1c, 0x33, 0xae, 0xd3, + 0x4f, 0x62, 0x9f, 0x52, 0xe7, 0x65, 0x46, 0xf4}, + {0x97, 0x51, 0x27, 0x67, 0x2d, 0xa2, 0x82, 0x87, + 0x98, 0xd3, 0xb6, 0x14, 0x7f, 0x51, 0xd3, 0x9a, + 0x0b, 0xd0, 0x76, 0x81, 0xb2, 0x4f, 0x58, 0x92, + 0xa4, 0x86, 0xa1, 0xa7, 0x09, 0x1d, 0xef, 0x9b}}, + {{0xb3, 0x0f, 0x2b, 0x69, 0x0d, 0x06, 0x90, 0x64, + 0xbd, 0x43, 0x4c, 0x10, 0xe8, 0x98, 0x1c, 0xa3, + 0xe1, 0x68, 0xe9, 0x79, 0x6c, 0x29, 0x51, 0x3f, + 0x41, 0xdc, 0xdf, 0x1f, 0xf3, 0x60, 0xbe, 0x33}, + {0xa1, 0x5f, 0xf7, 0x1d, 0xb4, 0x3e, 0x9b, 0x3c, + 0xe7, 0xbd, 0xb6, 0x06, 0xd5, 0x60, 0x06, 0x6d, + 0x50, 0xd2, 0xf4, 0x1a, 0x31, 0x08, 0xf2, 0xea, + 0x8e, 0xef, 0x5f, 0x7d, 0xb6, 0xd0, 0xc0, 0x27}}, + {{0x62, 0x9a, 0xd9, 0xbb, 0x38, 0x36, 0xce, 0xf7, + 0x5d, 0x2f, 0x13, 0xec, 0xc8, 0x2d, 0x02, 0x8a, + 0x2e, 0x72, 0xf0, 0xe5, 0x15, 0x9d, 0x72, 0xae, + 0xfc, 0xb3, 0x4f, 0x02, 0xea, 0xe1, 0x09, 0xfe}, + {0x00, 0x00, 0x00, 0x00, 0xfa, 0x0a, 0x3d, 0xbc, + 0xad, 0x16, 0x0c, 0xb6, 0xe7, 0x7c, 0x8b, 0x39, + 0x9a, 0x43, 0xbb, 0xe3, 0xc2, 0x55, 0x15, 0x14, + 0x75, 0xac, 0x90, 0x9b, 0x7f, 0x9a, 0x92, 0x00}}, + {{0x8b, 0xac, 0x70, 0x86, 0x29, 0x8f, 0x00, 0x23, + 0x7b, 0x45, 0x30, 0xaa, 0xb8, 0x4c, 0xc7, 0x8d, + 0x4e, 0x47, 0x85, 0xc6, 0x19, 0xe3, 0x96, 0xc2, + 0x9a, 0xa0, 0x12, 0xed, 0x6f, 0xd7, 0x76, 0x16}, + {0x45, 0xaf, 0x7e, 0x33, 0xc7, 0x7f, 0x10, 0x6c, + 0x7c, 0x9f, 0x29, 0xc1, 0xa8, 0x7e, 0x15, 0x84, + 0xe7, 0x7d, 0xc0, 0x6d, 0xab, 0x71, 0x5d, 0xd0, + 0x6b, 0x9f, 0x97, 0xab, 0xcb, 0x51, 0x0c, 0x9f}}, + {{0x9e, 0xc3, 0x92, 0xb4, 0x04, 0x9f, 0xc8, 0xbb, + 0xdd, 0x9e, 0xc6, 0x05, 0xfd, 0x65, 0xec, 0x94, + 0x7f, 0x2c, 0x16, 0xc4, 0x40, 0xac, 0x63, 0x7b, + 0x7d, 0xb8, 0x0c, 0xe4, 0x5b, 0xe3, 0xa7, 0x0e}, + {0x43, 0xf4, 0x44, 0xe8, 0xcc, 0xc8, 0xd4, 0x54, + 0x33, 0x37, 0x50, 0xf2, 0x87, 0x42, 0x2e, 0x00, + 0x49, 0x60, 0x62, 0x02, 0xfd, 0x1a, 0x7c, 0xdb, + 0x29, 0x6c, 0x6d, 0x54, 0x53, 0x08, 0xd1, 0xc8}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0x28, 0x56, 0xac, 0x0e, 0x4f, 0x98, 0x09, 0xf0, + 0x49, 0xfa, 0x7f, 0x84, 0xac, 0x7e, 0x50, 0x5b, + 0x17, 0x43, 0x14, 0x89, 0x9c, 0x53, 0xa8, 0x94, + 0x30, 0xf2, 0x11, 0x4d, 0x92, 0x14, 0x27, 0xe8}, + {0x39, 0x7a, 0x84, 0x56, 0x79, 0x9d, 0xec, 0x26, + 0x2c, 0x53, 0xc1, 0x94, 0xc9, 0x8d, 0x9e, 0x9d, + 0x32, 0x1f, 0xdd, 0x84, 0x04, 0xe8, 0xe2, 0x0a, + 0x6b, 0xbe, 0xbb, 0x42, 0x40, 0x67, 0x30, 0x6c}}, + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x73, 0x2f, 0xc9, 0xbe, 0xbd}, + {0x27, 0x59, 0xc7, 0x35, 0x60, 0x71, 0xa6, 0xf1, + 0x79, 0xa5, 0xfd, 0x79, 0x16, 0xf3, 0x41, 0xf0, + 0x57, 0xb4, 0x02, 0x97, 0x32, 0xe7, 0xde, 0x59, + 0xe2, 0x2d, 0x9b, 0x11, 0xea, 0x2c, 0x35, 0x92}}, + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}}, + {{0x1c, 0xc4, 0xf7, 0xda, 0x0f, 0x65, 0xca, 0x39, + 0x70, 0x52, 0x92, 0x8e, 0xc3, 0xc8, 0x15, 0xea, + 0x7f, 0x10, 0x9e, 0x77, 0x4b, 0x6e, 0x2d, 0xdf, + 0xe8, 0x30, 0x9d, 0xda, 0xe8, 0x9a, 0x65, 0xae}, + {0x02, 0xb0, 0x16, 0xb1, 0x1d, 0xc8, 0x57, 0x7b, + 0xa2, 0x3a, 0xa2, 0xa3, 0x38, 0x5c, 0x8f, 0xeb, + 0x66, 0x37, 0x91, 0xa8, 0x5f, 0xef, 0x04, 0xf6, + 0x59, 0x75, 0xe1, 0xee, 0x92, 0xf6, 0x0e, 0x30}}, + {{0x8d, 0x76, 0x14, 0xa4, 0x14, 0x06, 0x9f, 0x9a, + 0xdf, 0x4a, 0x85, 0xa7, 0x6b, 0xbf, 0x29, 0x6f, + 0xbc, 0x34, 0x87, 0x5d, 0xeb, 0xbb, 0x2e, 0xa9, + 0xc9, 0x1f, 0x58, 0xd6, 0x9a, 0x82, 0xa0, 0x56}, + {0xd4, 0xb9, 0xdb, 0x88, 0x1d, 0x04, 0xe9, 0x93, + 0x8d, 0x3f, 0x20, 0xd5, 0x86, 0xa8, 0x83, 0x07, + 0xdb, 0x09, 0xd8, 0x22, 0x1f, 0x7f, 0xf1, 0x71, + 0xc8, 0xe7, 0x5d, 0x47, 0xaf, 0x8b, 0x72, 0xe9}}, + {{0x83, 0xb9, 0x39, 0xb2, 0xa4, 0xdf, 0x46, 0x87, + 0xc2, 0xb8, 0xf1, 0xe6, 0x4c, 0xd1, 0xe2, 0xa9, + 0xe4, 0x70, 0x30, 0x34, 0xbc, 0x52, 0x7c, 0x55, + 0xa6, 0xec, 0x80, 0xa4, 0xe5, 0xd2, 0xdc, 0x73}, + {0x08, 0xf1, 0x03, 0xcf, 0x16, 0x73, 0xe8, 0x7d, + 0xb6, 0x7e, 0x9b, 0xc0, 0xb4, 0xc2, 0xa5, 0x86, + 0x02, 0x77, 0xd5, 0x27, 0x86, 0xa5, 0x15, 0xfb, + 0xae, 0x9b, 0x8c, 0xa9, 0xf9, 0xf8, 0xa8, 0x4a}}, + {{0x8b, 0x00, 0x49, 0xdb, 0xfa, 0xf0, 0x1b, 0xa2, + 0xed, 0x8a, 0x9a, 0x7a, 0x36, 0x78, 0x4a, 0xc7, + 0xf7, 0xad, 0x39, 0xd0, 0x6c, 0x65, 0x7a, 0x41, + 0xce, 0xd6, 0xd6, 0x4c, 0x20, 0x21, 0x6b, 0xc7}, + {0xc6, 0xca, 0x78, 0x1d, 0x32, 0x6c, 0x6c, 0x06, + 0x91, 0xf2, 0x1a, 0xe8, 0x43, 0x16, 0xea, 0x04, + 0x3c, 0x1f, 0x07, 0x85, 0xf7, 0x09, 0x22, 0x08, + 0xba, 0x13, 0xfd, 0x78, 0x1e, 0x3f, 0x6f, 0x62}}, + {{0x25, 0x9b, 0x7c, 0xb0, 0xac, 0x72, 0x6f, 0xb2, + 0xe3, 0x53, 0x84, 0x7a, 0x1a, 0x9a, 0x98, 0x9b, + 0x44, 0xd3, 0x59, 0xd0, 0x8e, 0x57, 0x41, 0x40, + 0x78, 0xa7, 0x30, 0x2f, 0x4c, 0x9c, 0xb9, 0x68}, + {0xb7, 0x75, 0x03, 0x63, 0x61, 0xc2, 0x48, 0x6e, + 0x12, 0x3d, 0xbf, 0x4b, 0x27, 0xdf, 0xb1, 0x7a, + 0xff, 0x4e, 0x31, 0x07, 0x83, 0xf4, 0x62, 0x5b, + 0x19, 0xa5, 0xac, 0xa0, 0x32, 0x58, 0x0d, 0xa7}}, + {{0x43, 0x4f, 0x10, 0xa4, 0xca, 0xdb, 0x38, 0x67, + 0xfa, 0xae, 0x96, 0xb5, 0x6d, 0x97, 0xff, 0x1f, + 0xb6, 0x83, 0x43, 0xd3, 0xa0, 0x2d, 0x70, 0x7a, + 0x64, 0x05, 0x4c, 0xa7, 0xc1, 0xa5, 0x21, 0x51}, + {0xe4, 0xf1, 0x23, 0x84, 0xe1, 0xb5, 0x9d, 0xf2, + 0xb8, 0x73, 0x8b, 0x45, 0x2b, 0x35, 0x46, 0x38, + 0x10, 0x2b, 0x50, 0xf8, 0x8b, 0x35, 0xcd, 0x34, + 0xc8, 0x0e, 0xf6, 0xdb, 0x09, 0x35, 0xf0, 0xda}}, + {{0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}, + {0xdb, 0x21, 0x5c, 0x8d, 0x83, 0x1d, 0xb3, 0x34, + 0xc7, 0x0e, 0x43, 0xa1, 0x58, 0x79, 0x67, 0x13, + 0x1e, 0x86, 0x5d, 0x89, 0x63, 0xe6, 0x0a, 0x46, + 0x5c, 0x02, 0x97, 0x1b, 0x62, 0x43, 0x86, 0xf5}} + }; + secp256k1_scalar_set_int(&one, 1); + for (i = 0; i < 33; i++) { + secp256k1_scalar_set_b32(&x, chal[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&y, chal[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r1, res[i][0], &overflow); + CHECK(!overflow); + secp256k1_scalar_set_b32(&r2, res[i][1], &overflow); + CHECK(!overflow); + secp256k1_scalar_mul(&z, &x, &y); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&r1, &z)); + if (!secp256k1_scalar_is_zero(&y)) { + secp256k1_scalar_inverse(&zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); +#if defined(USE_SCALAR_INV_NUM) + secp256k1_scalar_inverse_var(&zzv, &y); + CHECK(secp256k1_scalar_eq(&zzv, &zz)); +#endif + secp256k1_scalar_mul(&z, &z, &zz); + CHECK(!secp256k1_scalar_check_overflow(&z)); + CHECK(secp256k1_scalar_eq(&x, &z)); + secp256k1_scalar_mul(&zz, &zz, &y); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&one, &zz)); + } + secp256k1_scalar_mul(&z, &x, &x); + CHECK(!secp256k1_scalar_check_overflow(&z)); + secp256k1_scalar_sqr(&zz, &x); + CHECK(!secp256k1_scalar_check_overflow(&zz)); + CHECK(secp256k1_scalar_eq(&zz, &z)); + CHECK(secp256k1_scalar_eq(&r2, &zz)); + } + } +} + +/***** FIELD TESTS *****/ + +void random_fe(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_test(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256_test(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_non_zero(secp256k1_fe *nz) { + int tries = 10; + while (--tries >= 0) { + random_fe(nz); + secp256k1_fe_normalize(nz); + if (!secp256k1_fe_is_zero(nz)) { + break; + } + } + /* Infinitesimal probability of spurious failure here */ + CHECK(tries >= 0); +} + +void random_fe_non_square(secp256k1_fe *ns) { + secp256k1_fe r; + random_fe_non_zero(ns); + if (secp256k1_fe_sqrt(&r, ns)) { + secp256k1_fe_negate(ns, ns, 1); + } +} + +int check_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe an = *a; + secp256k1_fe bn = *b; + secp256k1_fe_normalize_weak(&an); + secp256k1_fe_normalize_var(&bn); + return secp256k1_fe_equal_var(&an, &bn); +} + +int check_fe_inverse(const secp256k1_fe *a, const secp256k1_fe *ai) { + secp256k1_fe x; + secp256k1_fe one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe_mul(&x, a, ai); + return check_fe_equal(&x, &one); +} + +void run_field_convert(void) { + static const unsigned char b32[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 + }; + static const secp256k1_fe_storage fes = SECP256K1_FE_STORAGE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + static const secp256k1_fe fe = SECP256K1_FE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + secp256k1_fe fe2; + unsigned char b322[32]; + secp256k1_fe_storage fes2; + /* Check conversions to fe. */ + CHECK(secp256k1_fe_set_b32(&fe2, b32)); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + secp256k1_fe_from_storage(&fe2, &fes); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + /* Check conversion from fe. */ + secp256k1_fe_get_b32(b322, &fe); + CHECK(memcmp(b322, b32, 32) == 0); + secp256k1_fe_to_storage(&fes2, &fe); + CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); +} + +int fe_memcmp(const secp256k1_fe *a, const secp256k1_fe *b) { + secp256k1_fe t = *b; +#ifdef VERIFY + t.magnitude = a->magnitude; + t.normalized = a->normalized; +#endif + return memcmp(a, &t, sizeof(secp256k1_fe)); +} + +void run_field_misc(void) { + secp256k1_fe x; + secp256k1_fe y; + secp256k1_fe z; + secp256k1_fe q; + secp256k1_fe fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); + int i, j; + for (i = 0; i < 5*count; i++) { + secp256k1_fe_storage xs, ys, zs; + random_fe(&x); + random_fe_non_zero(&y); + /* Test the fe equality and comparison operations. */ + CHECK(secp256k1_fe_cmp_var(&x, &x) == 0); + CHECK(secp256k1_fe_equal_var(&x, &x)); + z = x; + secp256k1_fe_add(&z,&y); + /* Test fe conditional move; z is not normalized here. */ + q = x; + secp256k1_fe_cmov(&x, &z, 0); + VERIFY_CHECK(!x.normalized && x.magnitude == z.magnitude); + secp256k1_fe_cmov(&x, &x, 1); + CHECK(fe_memcmp(&x, &z) != 0); + CHECK(fe_memcmp(&x, &q) == 0); + secp256k1_fe_cmov(&q, &z, 1); + VERIFY_CHECK(!q.normalized && q.magnitude == z.magnitude); + CHECK(fe_memcmp(&q, &z) == 0); + secp256k1_fe_normalize_var(&x); + secp256k1_fe_normalize_var(&z); + CHECK(!secp256k1_fe_equal_var(&x, &z)); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (i&1)); + VERIFY_CHECK(q.normalized && q.magnitude == 1); + for (j = 0; j < 6; j++) { + secp256k1_fe_negate(&z, &z, j+1); + secp256k1_fe_normalize_var(&q); + secp256k1_fe_cmov(&q, &z, (j&1)); + VERIFY_CHECK(!q.normalized && q.magnitude == (j+2)); + } + secp256k1_fe_normalize_var(&z); + /* Test storage conversion and conditional moves. */ + secp256k1_fe_to_storage(&xs, &x); + secp256k1_fe_to_storage(&ys, &y); + secp256k1_fe_to_storage(&zs, &z); + secp256k1_fe_storage_cmov(&zs, &xs, 0); + secp256k1_fe_storage_cmov(&zs, &zs, 1); + CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0); + secp256k1_fe_storage_cmov(&ys, &xs, 1); + CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0); + secp256k1_fe_from_storage(&x, &xs); + secp256k1_fe_from_storage(&y, &ys); + secp256k1_fe_from_storage(&z, &zs); + /* Test that mul_int, mul, and add agree. */ + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&y, &x); + z = x; + secp256k1_fe_mul_int(&z, 3); + CHECK(check_fe_equal(&y, &z)); + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&z, &x); + CHECK(check_fe_equal(&z, &y)); + z = x; + secp256k1_fe_mul_int(&z, 5); + secp256k1_fe_mul(&q, &x, &fe5); + CHECK(check_fe_equal(&z, &q)); + secp256k1_fe_negate(&x, &x, 1); + secp256k1_fe_add(&z, &x); + secp256k1_fe_add(&q, &x); + CHECK(check_fe_equal(&y, &z)); + CHECK(check_fe_equal(&q, &y)); + } +} + +void run_field_inv(void) { + secp256k1_fe x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_var(void) { + secp256k1_fe x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv_var(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv_var(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_all_var(void) { + secp256k1_fe x[16], xi[16], xii[16]; + int i; + /* Check it's safe to call for 0 elements */ + secp256k1_fe_inv_all_var(xi, x, 0); + for (i = 0; i < count; i++) { + size_t j; + size_t len = secp256k1_rand_int(15) + 1; + for (j = 0; j < len; j++) { + random_fe_non_zero(&x[j]); + } + secp256k1_fe_inv_all_var(xi, x, len); + for (j = 0; j < len; j++) { + CHECK(check_fe_inverse(&x[j], &xi[j])); + } + secp256k1_fe_inv_all_var(xii, xi, len); + for (j = 0; j < len; j++) { + CHECK(check_fe_equal(&x[j], &xii[j])); + } + } +} + +void run_sqr(void) { + secp256k1_fe x, s; + + { + int i; + secp256k1_fe_set_int(&x, 1); + secp256k1_fe_negate(&x, &x, 1); + + for (i = 1; i <= 512; ++i) { + secp256k1_fe_mul_int(&x, 2); + secp256k1_fe_normalize(&x); + secp256k1_fe_sqr(&s, &x); + } + } +} + +void test_sqrt(const secp256k1_fe *a, const secp256k1_fe *k) { + secp256k1_fe r1, r2; + int v = secp256k1_fe_sqrt(&r1, a); + CHECK((v == 0) == (k == NULL)); + + if (k != NULL) { + /* Check that the returned root is +/- the given known answer */ + secp256k1_fe_negate(&r2, &r1, 1); + secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); + secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); + CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); + } +} + +void run_sqrt(void) { + secp256k1_fe ns, x, s, t; + int i; + + /* Check sqrt(0) is 0 */ + secp256k1_fe_set_int(&x, 0); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + + /* Check sqrt of small squares (and their negatives) */ + for (i = 1; i <= 100; i++) { + secp256k1_fe_set_int(&x, i); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + } + + /* Consistency checks for large random values */ + for (i = 0; i < 10; i++) { + int j; + random_fe_non_square(&ns); + for (j = 0; j < count; j++) { + random_fe(&x); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + secp256k1_fe_mul(&t, &s, &ns); + test_sqrt(&t, NULL); + } + } +} + +/***** GROUP TESTS *****/ + +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); +} + +/* This compares jacobian points including their Z, not just their geometric meaning. */ +int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) { + secp256k1_gej a2; + secp256k1_gej b2; + int ret = 1; + ret &= a->infinity == b->infinity; + if (ret && !a->infinity) { + a2 = *a; + b2 = *b; + secp256k1_fe_normalize(&a2.x); + secp256k1_fe_normalize(&a2.y); + secp256k1_fe_normalize(&a2.z); + secp256k1_fe_normalize(&b2.x); + secp256k1_fe_normalize(&b2.y); + secp256k1_fe_normalize(&b2.z); + ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0; + ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0; + ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0; + } + return ret; +} + +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void test_ge(void) { + int i, i1; +#ifdef USE_ENDOMORPHISM + int runs = 6; +#else + int runs = 4; +#endif + /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). + * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. + * All magnitudes are randomized. + * All 17*17 combinations of points are added to each other, using all applicable methods. + * + * When the endomorphism code is compiled in, p5 = lambda*p1 and p6 = lambda^2*p1 are added as well. + */ + secp256k1_ge *ge = (secp256k1_ge *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_ge) * (1 + 4 * runs)); + secp256k1_gej *gej = (secp256k1_gej *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_gej) * (1 + 4 * runs)); + secp256k1_fe *zinv = (secp256k1_fe *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + secp256k1_fe zf; + secp256k1_fe zfi2, zfi3; + + secp256k1_gej_set_infinity(&gej[0]); + secp256k1_ge_clear(&ge[0]); + secp256k1_ge_set_gej_var(&ge[0], &gej[0]); + for (i = 0; i < runs; i++) { + int j; + secp256k1_ge g; + random_group_element_test(&g); +#ifdef USE_ENDOMORPHISM + if (i >= runs - 2) { + secp256k1_ge_mul_lambda(&g, &ge[1]); + } + if (i >= runs - 1) { + secp256k1_ge_mul_lambda(&g, &g); + } +#endif + ge[1 + 4 * i] = g; + ge[2 + 4 * i] = g; + secp256k1_ge_neg(&ge[3 + 4 * i], &g); + secp256k1_ge_neg(&ge[4 + 4 * i], &g); + secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); + random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); + secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); + random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); + for (j = 0; j < 4; j++) { + random_field_element_magnitude(&ge[1 + j + 4 * i].x); + random_field_element_magnitude(&ge[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].x); + random_field_element_magnitude(&gej[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].z); + } + } + + /* Compute z inverses. */ + { + secp256k1_fe *zs = checked_malloc(&ctx->error_callback, sizeof(secp256k1_fe) * (1 + 4 * runs)); + for (i = 0; i < 4 * runs + 1; i++) { + if (i == 0) { + /* The point at infinity does not have a meaningful z inverse. Any should do. */ + do { + random_field_element_test(&zs[i]); + } while(secp256k1_fe_is_zero(&zs[i])); + } else { + zs[i] = gej[i].z; + } + } + secp256k1_fe_inv_all_var(zinv, zs, 4 * runs + 1); + free(zs); + } + + /* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */ + do { + random_field_element_test(&zf); + } while(secp256k1_fe_is_zero(&zf)); + random_field_element_magnitude(&zf); + secp256k1_fe_inv_var(&zfi3, &zf); + secp256k1_fe_sqr(&zfi2, &zfi3); + secp256k1_fe_mul(&zfi3, &zfi3, &zfi2); + + for (i1 = 0; i1 < 1 + 4 * runs; i1++) { + int i2; + for (i2 = 0; i2 < 1 + 4 * runs; i2++) { + /* Compute reference result using gej + gej (var). */ + secp256k1_gej refj, resj; + secp256k1_ge ref; + secp256k1_fe zr; + secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); + /* Check Z ratio. */ + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&refj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &refj.z)); + } + secp256k1_ge_set_gej_var(&ref, &refj); + + /* Test gej + ge with Z ratio result (var). */ + secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr); + ge_equals_gej(&ref, &resj); + if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) { + secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zrz, &resj.z)); + } + + /* Test gej + ge (var, with additional Z factor). */ + { + secp256k1_ge ge2_zfi = ge[i2]; /* the second term with x and y rescaled for z = 1/zf */ + secp256k1_fe_mul(&ge2_zfi.x, &ge2_zfi.x, &zfi2); + secp256k1_fe_mul(&ge2_zfi.y, &ge2_zfi.y, &zfi3); + random_field_element_magnitude(&ge2_zfi.x); + random_field_element_magnitude(&ge2_zfi.y); + secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf); + ge_equals_gej(&ref, &resj); + } + + /* Test gej + ge (const). */ + if (i2 != 0) { + /* secp256k1_gej_add_ge does not support its second argument being infinity. */ + secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]); + ge_equals_gej(&ref, &resj); + } + + /* Test doubling (var). */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { + secp256k1_fe zr2; + /* Normal doubling with Z ratio result. */ + secp256k1_gej_double_var(&resj, &gej[i1], &zr2); + ge_equals_gej(&ref, &resj); + /* Check Z ratio. */ + secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z); + CHECK(secp256k1_fe_equal_var(&zr2, &resj.z)); + /* Normal doubling. */ + secp256k1_gej_double_var(&resj, &gej[i2], NULL); + ge_equals_gej(&ref, &resj); + } + + /* Test adding opposites. */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) { + CHECK(secp256k1_ge_is_infinity(&ref)); + } + + /* Test adding infinity. */ + if (i1 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i1])); + CHECK(secp256k1_gej_is_infinity(&gej[i1])); + ge_equals_gej(&ref, &gej[i2]); + } + if (i2 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i2])); + CHECK(secp256k1_gej_is_infinity(&gej[i2])); + ge_equals_gej(&ref, &gej[i1]); + } + } + } + + /* Test adding all points together in random order equals infinity. */ + { + secp256k1_gej sum = SECP256K1_GEJ_CONST_INFINITY; + secp256k1_gej *gej_shuffled = (secp256k1_gej *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_gej)); + for (i = 0; i < 4 * runs + 1; i++) { + gej_shuffled[i] = gej[i]; + } + for (i = 0; i < 4 * runs + 1; i++) { + int swap = i + secp256k1_rand_int(4 * runs + 1 - i); + if (swap != i) { + secp256k1_gej t = gej_shuffled[i]; + gej_shuffled[i] = gej_shuffled[swap]; + gej_shuffled[swap] = t; + } + } + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i], NULL); + } + CHECK(secp256k1_gej_is_infinity(&sum)); + free(gej_shuffled); + } + + /* Test batch gej -> ge conversion with and without known z ratios. */ + { + secp256k1_fe *zr = (secp256k1_fe *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_fe)); + secp256k1_ge *ge_set_table = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); + secp256k1_ge *ge_set_all = (secp256k1_ge *)checked_malloc(&ctx->error_callback, (4 * runs + 1) * sizeof(secp256k1_ge)); + for (i = 0; i < 4 * runs + 1; i++) { + /* Compute gej[i + 1].z / gez[i].z (with gej[n].z taken to be 1). */ + if (i < 4 * runs) { + secp256k1_fe_mul(&zr[i + 1], &zinv[i], &gej[i + 1].z); + } + } + secp256k1_ge_set_table_gej_var(ge_set_table, gej, zr, 4 * runs + 1); + secp256k1_ge_set_all_gej_var(ge_set_all, gej, 4 * runs + 1, &ctx->error_callback); + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_fe s; + random_fe_non_zero(&s); + secp256k1_gej_rescale(&gej[i], &s); + ge_equals_gej(&ge_set_table[i], &gej[i]); + ge_equals_gej(&ge_set_all[i], &gej[i]); + } + free(ge_set_table); + free(ge_set_all); + free(zr); + } + + free(ge); + free(gej); + free(zinv); +} + +void test_add_neg_y_diff_x(void) { + /* The point of this test is to check that we can add two points + * whose y-coordinates are negatives of each other but whose x + * coordinates differ. If the x-coordinates were the same, these + * points would be negatives of each other and their sum is + * infinity. This is cool because it "covers up" any degeneracy + * in the addition algorithm that would cause the xy coordinates + * of the sum to be wrong (since infinity has no xy coordinates). + * HOWEVER, if the x-coordinates are different, infinity is the + * wrong answer, and such degeneracies are exposed. This is the + * root of https://github.com/bitcoin-core/secp256k1/issues/257 + * which this test is a regression test for. + * + * These points were generated in sage as + * # secp256k1 params + * F = FiniteField (0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F) + * C = EllipticCurve ([F (0), F (7)]) + * G = C.lift_x(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798) + * N = FiniteField(G.order()) + * + * # endomorphism values (lambda is 1^{1/3} in N, beta is 1^{1/3} in F) + * x = polygen(N) + * lam = (1 - x^3).roots()[1][0] + * + * # random "bad pair" + * P = C.random_element() + * Q = -int(lam) * P + * print " P: %x %x" % P.xy() + * print " Q: %x %x" % Q.xy() + * print "P + Q: %x %x" % (P + Q).xy() + */ + secp256k1_gej aj = SECP256K1_GEJ_CONST( + 0x8d24cd95, 0x0a355af1, 0x3c543505, 0x44238d30, + 0x0643d79f, 0x05a59614, 0x2f8ec030, 0xd58977cb, + 0x001e337a, 0x38093dcd, 0x6c0f386d, 0x0b1293a8, + 0x4d72c879, 0xd7681924, 0x44e6d2f3, 0x9190117d + ); + secp256k1_gej bj = SECP256K1_GEJ_CONST( + 0xc7b74206, 0x1f788cd9, 0xabd0937d, 0x164a0d86, + 0x95f6ff75, 0xf19a4ce9, 0xd013bd7b, 0xbf92d2a7, + 0xffe1cc85, 0xc7f6c232, 0x93f0c792, 0xf4ed6c57, + 0xb28d3786, 0x2897e6db, 0xbb192d0b, 0x6e6feab2 + ); + secp256k1_gej sumj = SECP256K1_GEJ_CONST( + 0x671a63c0, 0x3efdad4c, 0x389a7798, 0x24356027, + 0xb3d69010, 0x278625c3, 0x5c86d390, 0x184a8f7a, + 0x5f6409c2, 0x2ce01f2b, 0x511fd375, 0x25071d08, + 0xda651801, 0x70e95caf, 0x8f0d893c, 0xbed8fbbe + ); + secp256k1_ge b; + secp256k1_gej resj; + secp256k1_ge res; + secp256k1_ge_set_gej(&b, &bj); + + secp256k1_gej_add_var(&resj, &aj, &bj, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge(&resj, &aj, &b); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); + + secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL); + secp256k1_ge_set_gej(&res, &resj); + ge_equals_gej(&res, &sumj); +} + +void run_ge(void) { + int i; + for (i = 0; i < count * 32; i++) { + test_ge(); + } + test_add_neg_y_diff_x(); +} + +void test_ec_combine(void) { + secp256k1_scalar sum = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_pubkey data[6]; + const secp256k1_pubkey* d[6]; + secp256k1_pubkey sd; + secp256k1_pubkey sd2; + secp256k1_gej Qj; + secp256k1_ge Q; + int i; + for (i = 1; i <= 6; i++) { + secp256k1_scalar s; + random_scalar_order_test(&s); + secp256k1_scalar_add(&sum, &sum, &s); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &s); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&data[i - 1], &Q); + d[i - 1] = &data[i - 1]; + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &Qj, &sum); + secp256k1_ge_set_gej(&Q, &Qj); + secp256k1_pubkey_save(&sd, &Q); + CHECK(secp256k1_ec_pubkey_combine(ctx, &sd2, d, i) == 1); + CHECK(memcmp(&sd, &sd2, sizeof(sd)) == 0); + } +} + +void run_ec_combine(void) { + int i; + for (i = 0; i < count * 8; i++) { + test_ec_combine(); + } +} + +void test_group_decompress(const secp256k1_fe* x) { + /* The input itself, normalized. */ + secp256k1_fe fex = *x; + secp256k1_fe fez; + /* Results of set_xquad_var, set_xo_var(..., 0), set_xo_var(..., 1). */ + secp256k1_ge ge_quad, ge_even, ge_odd; + secp256k1_gej gej_quad; + /* Return values of the above calls. */ + int res_quad, res_even, res_odd; + + secp256k1_fe_normalize_var(&fex); + + res_quad = secp256k1_ge_set_xquad(&ge_quad, &fex); + res_even = secp256k1_ge_set_xo_var(&ge_even, &fex, 0); + res_odd = secp256k1_ge_set_xo_var(&ge_odd, &fex, 1); + + CHECK(res_quad == res_even); + CHECK(res_quad == res_odd); + + if (res_quad) { + secp256k1_fe_normalize_var(&ge_quad.x); + secp256k1_fe_normalize_var(&ge_odd.x); + secp256k1_fe_normalize_var(&ge_even.x); + secp256k1_fe_normalize_var(&ge_quad.y); + secp256k1_fe_normalize_var(&ge_odd.y); + secp256k1_fe_normalize_var(&ge_even.y); + + /* No infinity allowed. */ + CHECK(!ge_quad.infinity); + CHECK(!ge_even.infinity); + CHECK(!ge_odd.infinity); + + /* Check that the x coordinates check out. */ + CHECK(secp256k1_fe_equal_var(&ge_quad.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_even.x, x)); + CHECK(secp256k1_fe_equal_var(&ge_odd.x, x)); + + /* Check that the Y coordinate result in ge_quad is a square. */ + CHECK(secp256k1_fe_is_quad_var(&ge_quad.y)); + + /* Check odd/even Y in ge_odd, ge_even. */ + CHECK(secp256k1_fe_is_odd(&ge_odd.y)); + CHECK(!secp256k1_fe_is_odd(&ge_even.y)); + + /* Check secp256k1_gej_has_quad_y_var. */ + secp256k1_gej_set_ge(&gej_quad, &ge_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + do { + random_fe_test(&fez); + } while (secp256k1_fe_is_zero(&fez)); + secp256k1_gej_rescale(&gej_quad, &fez); + CHECK(!secp256k1_gej_has_quad_y_var(&gej_quad)); + secp256k1_gej_neg(&gej_quad, &gej_quad); + CHECK(secp256k1_gej_has_quad_y_var(&gej_quad)); + } +} + +void run_group_decompress(void) { + int i; + for (i = 0; i < count * 4; i++) { + secp256k1_fe fe; + random_fe_test(&fe); + test_group_decompress(&fe); + } +} + +/***** ECMULT TESTS *****/ + +void run_ecmult_chain(void) { + /* random starting point A (on the curve) */ + secp256k1_gej a = SECP256K1_GEJ_CONST( + 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, + 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, + 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, + 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f + ); + /* two random initial factors xn and gn */ + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( + 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, + 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 + ); + secp256k1_scalar gn = SECP256K1_SCALAR_CONST( + 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, + 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de + ); + /* two small multipliers to be applied to xn and gn in every iteration: */ + static const secp256k1_scalar xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); + static const secp256k1_scalar gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); + /* accumulators with the resulting coefficients to A and G */ + secp256k1_scalar ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + /* actual points */ + secp256k1_gej x; + secp256k1_gej x2; + int i; + + /* the point being computed */ + x = a; + for (i = 0; i < 200*count; i++) { + /* in each iteration, compute X = xn*X + gn*G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn); + /* also compute ae and ge: the actual accumulated factors for A and G */ + /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ + secp256k1_scalar_mul(&ae, &ae, &xn); + secp256k1_scalar_mul(&ge, &ge, &xn); + secp256k1_scalar_add(&ge, &ge, &gn); + /* modify xn and gn */ + secp256k1_scalar_mul(&xn, &xn, &xf); + secp256k1_scalar_mul(&gn, &gn, &gf); + + /* verify */ + if (i == 19999) { + /* expected result after 19999 iterations */ + secp256k1_gej rp = SECP256K1_GEJ_CONST( + 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, + 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, + 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, + 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88 + ); + + secp256k1_gej_neg(&rp, &rp); + secp256k1_gej_add_var(&rp, &rp, &x, NULL); + CHECK(secp256k1_gej_is_infinity(&rp)); + } + } + /* redo the computation, but directly with the resulting ae and ge coefficients: */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); + secp256k1_gej_neg(&x2, &x2); + secp256k1_gej_add_var(&x2, &x2, &x, NULL); + CHECK(secp256k1_gej_is_infinity(&x2)); +} + +void test_point_times_order(const secp256k1_gej *point) { + /* X * (point + G) + (order-X) * (pointer + G) = 0 */ + secp256k1_scalar x; + secp256k1_scalar nx; + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_gej res1, res2; + secp256k1_ge res3; + unsigned char pub[65]; + size_t psize = 65; + random_scalar_order_test(&x); + secp256k1_scalar_negate(&nx, &x); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ + secp256k1_gej_add_var(&res1, &res1, &res2, NULL); + CHECK(secp256k1_gej_is_infinity(&res1)); + CHECK(secp256k1_gej_is_valid_var(&res1) == 0); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + CHECK(secp256k1_ge_is_valid_var(&res3) == 0); + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); + psize = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); + /* check zero/one edge cases */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &zero); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &one, &zero); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_gej(&res3, point); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &zero, &one); + secp256k1_ge_set_gej(&res3, &res1); + ge_equals_ge(&res3, &secp256k1_ge_const_g); +} + +void run_point_times_order(void) { + int i; + secp256k1_fe x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); + static const secp256k1_fe xr = SECP256K1_FE_CONST( + 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, + 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 + ); + for (i = 0; i < 500; i++) { + secp256k1_ge p; + if (secp256k1_ge_set_xo_var(&p, &x, 1)) { + secp256k1_gej j; + CHECK(secp256k1_ge_is_valid_var(&p)); + secp256k1_gej_set_ge(&j, &p); + CHECK(secp256k1_gej_is_valid_var(&j)); + test_point_times_order(&j); + } + secp256k1_fe_sqr(&x, &x); + } + secp256k1_fe_normalize_var(&x); + CHECK(secp256k1_fe_equal_var(&x, &xr)); +} + +void ecmult_const_random_mult(void) { + /* random starting point A (on the curve) */ + secp256k1_ge a = SECP256K1_GE_CONST( + 0x6d986544, 0x57ff52b8, 0xcf1b8126, 0x5b802a5b, + 0xa97f9263, 0xb1e88044, 0x93351325, 0x91bc450a, + 0x535c59f7, 0x325e5d2b, 0xc391fbe8, 0x3c12787c, + 0x337e4a98, 0xe82a9011, 0x0123ba37, 0xdd769c7d + ); + /* random initial factor xn */ + secp256k1_scalar xn = SECP256K1_SCALAR_CONST( + 0x649d4f77, 0xc4242df7, 0x7f2079c9, 0x14530327, + 0xa31b876a, 0xd2d8ce2a, 0x2236d5c6, 0xd7b2029b + ); + /* expected xn * A (from sage) */ + secp256k1_ge expected_b = SECP256K1_GE_CONST( + 0x23773684, 0x4d209dc7, 0x098a786f, 0x20d06fcd, + 0x070a38bf, 0xc11ac651, 0x03004319, 0x1e2a8786, + 0xed8c3b8e, 0xc06dd57b, 0xd06ea66e, 0x45492b0f, + 0xb84e4e1b, 0xfb77e21f, 0x96baae2a, 0x63dec956 + ); + secp256k1_gej b; + secp256k1_ecmult_const(&b, &a, &xn, 256); + + CHECK(secp256k1_ge_is_valid_var(&a)); + ge_equals_gej(&expected_b, &b); +} + +void ecmult_const_commutativity(void) { + secp256k1_scalar a; + secp256k1_scalar b; + secp256k1_gej res1; + secp256k1_gej res2; + secp256k1_ge mid1; + secp256k1_ge mid2; + random_scalar_order_test(&a); + random_scalar_order_test(&b); + + secp256k1_ecmult_const(&res1, &secp256k1_ge_const_g, &a, 256); + secp256k1_ecmult_const(&res2, &secp256k1_ge_const_g, &b, 256); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + secp256k1_ecmult_const(&res1, &mid1, &b, 256); + secp256k1_ecmult_const(&res2, &mid2, &a, 256); + secp256k1_ge_set_gej(&mid1, &res1); + secp256k1_ge_set_gej(&mid2, &res2); + ge_equals_ge(&mid1, &mid2); +} + +void ecmult_const_mult_zero_one(void) { + secp256k1_scalar zero = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + secp256k1_scalar one = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar negone; + secp256k1_gej res1; + secp256k1_ge res2; + secp256k1_ge point; + secp256k1_scalar_negate(&negone, &one); + + random_group_element_test(&point); + secp256k1_ecmult_const(&res1, &point, &zero, 3); + secp256k1_ge_set_gej(&res2, &res1); + CHECK(secp256k1_ge_is_infinity(&res2)); + secp256k1_ecmult_const(&res1, &point, &one, 2); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); + secp256k1_ecmult_const(&res1, &point, &negone, 256); + secp256k1_gej_neg(&res1, &res1); + secp256k1_ge_set_gej(&res2, &res1); + ge_equals_ge(&res2, &point); +} + +void ecmult_const_chain_multiply(void) { + /* Check known result (randomly generated test problem from sage) */ + const secp256k1_scalar scalar = SECP256K1_SCALAR_CONST( + 0x4968d524, 0x2abf9b7a, 0x466abbcf, 0x34b11b6d, + 0xcd83d307, 0x827bed62, 0x05fad0ce, 0x18fae63b + ); + const secp256k1_gej expected_point = SECP256K1_GEJ_CONST( + 0x5494c15d, 0x32099706, 0xc2395f94, 0x348745fd, + 0x757ce30e, 0x4e8c90fb, 0xa2bad184, 0xf883c69f, + 0x5d195d20, 0xe191bf7f, 0x1be3e55f, 0x56a80196, + 0x6071ad01, 0xf1462f66, 0xc997fa94, 0xdb858435 + ); + secp256k1_gej point; + secp256k1_ge res; + int i; + + secp256k1_gej_set_ge(&point, &secp256k1_ge_const_g); + for (i = 0; i < 100; ++i) { + secp256k1_ge tmp; + secp256k1_ge_set_gej(&tmp, &point); + secp256k1_ecmult_const(&point, &tmp, &scalar, 256); + } + secp256k1_ge_set_gej(&res, &point); + ge_equals_gej(&res, &expected_point); +} + +void run_ecmult_const_tests(void) { + ecmult_const_mult_zero_one(); + ecmult_const_random_mult(); + ecmult_const_commutativity(); + ecmult_const_chain_multiply(); +} + +typedef struct { + secp256k1_scalar *sc; + secp256k1_ge *pt; +} ecmult_multi_data; + +static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) { + ecmult_multi_data *data = (ecmult_multi_data*) cbdata; + *sc = data->sc[idx]; + *pt = data->pt[idx]; + return 1; +} + +static int ecmult_multi_false_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) { + (void)sc; + (void)pt; + (void)idx; + (void)cbdata; + return 0; +} + +void test_ecmult_multi(secp256k1_scratch *scratch, secp256k1_ecmult_multi_func ecmult_multi) { + int ncount; + secp256k1_scalar szero; + secp256k1_scalar sc[32]; + secp256k1_ge pt[32]; + secp256k1_gej r; + secp256k1_gej r2; + ecmult_multi_data data; + secp256k1_scratch *scratch_empty; + + data.sc = sc; + data.pt = pt; + secp256k1_scalar_set_int(&szero, 0); + + /* No points to multiply */ + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, NULL, ecmult_multi_callback, &data, 0)); + + /* Check 1- and 2-point multiplies against ecmult */ + for (ncount = 0; ncount < count; ncount++) { + secp256k1_ge ptg; + secp256k1_gej ptgj; + random_scalar_order(&sc[0]); + random_scalar_order(&sc[1]); + + random_group_element_test(&ptg); + secp256k1_gej_set_ge(&ptgj, &ptg); + pt[0] = ptg; + pt[1] = secp256k1_ge_const_g; + + /* only G scalar */ + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &ptgj, &szero, &sc[0]); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &sc[0], ecmult_multi_callback, &data, 0)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + + /* 1-point */ + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &ptgj, &sc[0], &szero); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 1)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + + /* Try to multiply 1 point, but scratch space is empty */ + scratch_empty = secp256k1_scratch_create(&ctx->error_callback, 0); + CHECK(!ecmult_multi(&ctx->ecmult_ctx, scratch_empty, &r, &szero, ecmult_multi_callback, &data, 1)); + secp256k1_scratch_destroy(scratch_empty); + + /* Try to multiply 1 point, but callback returns false */ + CHECK(!ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_false_callback, &data, 1)); + + /* 2-point */ + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 2)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + + /* 2-point with G scalar */ + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &ptgj, &sc[0], &sc[1]); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &sc[1], ecmult_multi_callback, &data, 1)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + /* Check infinite outputs of various forms */ + for (ncount = 0; ncount < count; ncount++) { + secp256k1_ge ptg; + size_t i, j; + size_t sizes[] = { 2, 10, 32 }; + + for (j = 0; j < 3; j++) { + for (i = 0; i < 32; i++) { + random_scalar_order(&sc[i]); + secp256k1_ge_set_infinity(&pt[i]); + } + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j])); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + for (j = 0; j < 3; j++) { + for (i = 0; i < 32; i++) { + random_group_element_test(&ptg); + pt[i] = ptg; + secp256k1_scalar_set_int(&sc[i], 0); + } + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j])); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + for (j = 0; j < 3; j++) { + random_group_element_test(&ptg); + for (i = 0; i < 16; i++) { + random_scalar_order(&sc[2*i]); + secp256k1_scalar_negate(&sc[2*i + 1], &sc[2*i]); + pt[2 * i] = ptg; + pt[2 * i + 1] = ptg; + } + + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j])); + CHECK(secp256k1_gej_is_infinity(&r)); + + random_scalar_order(&sc[0]); + for (i = 0; i < 16; i++) { + random_group_element_test(&ptg); + + sc[2*i] = sc[0]; + sc[2*i+1] = sc[0]; + pt[2 * i] = ptg; + secp256k1_ge_neg(&pt[2*i+1], &pt[2*i]); + } + + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, sizes[j])); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + random_group_element_test(&ptg); + secp256k1_scalar_set_int(&sc[0], 0); + pt[0] = ptg; + for (i = 1; i < 32; i++) { + pt[i] = ptg; + + random_scalar_order(&sc[i]); + secp256k1_scalar_add(&sc[0], &sc[0], &sc[i]); + secp256k1_scalar_negate(&sc[i], &sc[i]); + } + + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 32)); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + /* Check random points, constant scalar */ + for (ncount = 0; ncount < count; ncount++) { + size_t i; + secp256k1_gej_set_infinity(&r); + + random_scalar_order(&sc[0]); + for (i = 0; i < 20; i++) { + secp256k1_ge ptg; + sc[i] = sc[0]; + random_group_element_test(&ptg); + pt[i] = ptg; + secp256k1_gej_add_ge_var(&r, &r, &pt[i], NULL); + } + + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &r, &sc[0], &szero); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + /* Check random scalars, constant point */ + for (ncount = 0; ncount < count; ncount++) { + size_t i; + secp256k1_ge ptg; + secp256k1_gej p0j; + secp256k1_scalar rs; + secp256k1_scalar_set_int(&rs, 0); + + random_group_element_test(&ptg); + for (i = 0; i < 20; i++) { + random_scalar_order(&sc[i]); + pt[i] = ptg; + secp256k1_scalar_add(&rs, &rs, &sc[i]); + } + + secp256k1_gej_set_ge(&p0j, &pt[0]); + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &p0j, &rs, &szero); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20)); + secp256k1_gej_neg(&r2, &r2); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + } + + /* Sanity check that zero scalars don't cause problems */ + secp256k1_scalar_clear(&sc[0]); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 20)); + secp256k1_scalar_clear(&sc[1]); + secp256k1_scalar_clear(&sc[2]); + secp256k1_scalar_clear(&sc[3]); + secp256k1_scalar_clear(&sc[4]); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 6)); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &r, &szero, ecmult_multi_callback, &data, 5)); + CHECK(secp256k1_gej_is_infinity(&r)); + + /* Run through s0*(t0*P) + s1*(t1*P) exhaustively for many small values of s0, s1, t0, t1 */ + { + const size_t TOP = 8; + size_t s0i, s1i; + size_t t0i, t1i; + secp256k1_ge ptg; + secp256k1_gej ptgj; + + random_group_element_test(&ptg); + secp256k1_gej_set_ge(&ptgj, &ptg); + + for(t0i = 0; t0i < TOP; t0i++) { + for(t1i = 0; t1i < TOP; t1i++) { + secp256k1_gej t0p, t1p; + secp256k1_scalar t0, t1; + + secp256k1_scalar_set_int(&t0, (t0i + 1) / 2); + secp256k1_scalar_cond_negate(&t0, t0i & 1); + secp256k1_scalar_set_int(&t1, (t1i + 1) / 2); + secp256k1_scalar_cond_negate(&t1, t1i & 1); + + secp256k1_ecmult(&ctx->ecmult_ctx, &t0p, &ptgj, &t0, &szero); + secp256k1_ecmult(&ctx->ecmult_ctx, &t1p, &ptgj, &t1, &szero); + + for(s0i = 0; s0i < TOP; s0i++) { + for(s1i = 0; s1i < TOP; s1i++) { + secp256k1_scalar tmp1, tmp2; + secp256k1_gej expected, actual; + + secp256k1_ge_set_gej(&pt[0], &t0p); + secp256k1_ge_set_gej(&pt[1], &t1p); + + secp256k1_scalar_set_int(&sc[0], (s0i + 1) / 2); + secp256k1_scalar_cond_negate(&sc[0], s0i & 1); + secp256k1_scalar_set_int(&sc[1], (s1i + 1) / 2); + secp256k1_scalar_cond_negate(&sc[1], s1i & 1); + + secp256k1_scalar_mul(&tmp1, &t0, &sc[0]); + secp256k1_scalar_mul(&tmp2, &t1, &sc[1]); + secp256k1_scalar_add(&tmp1, &tmp1, &tmp2); + + secp256k1_ecmult(&ctx->ecmult_ctx, &expected, &ptgj, &tmp1, &szero); + CHECK(ecmult_multi(&ctx->ecmult_ctx, scratch, &actual, &szero, ecmult_multi_callback, &data, 2)); + secp256k1_gej_neg(&expected, &expected); + secp256k1_gej_add_var(&actual, &actual, &expected, NULL); + CHECK(secp256k1_gej_is_infinity(&actual)); + } + } + } + } + } +} + +void test_secp256k1_pippenger_bucket_window_inv(void) { + int i; + + CHECK(secp256k1_pippenger_bucket_window_inv(0) == 0); + for(i = 1; i <= PIPPENGER_MAX_BUCKET_WINDOW; i++) { +#ifdef USE_ENDOMORPHISM + /* Bucket_window of 8 is not used with endo */ + if (i == 8) { + continue; + } +#endif + CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)) == i); + if (i != PIPPENGER_MAX_BUCKET_WINDOW) { + CHECK(secp256k1_pippenger_bucket_window(secp256k1_pippenger_bucket_window_inv(i)+1) > i); + } + } +} + +/** + * Probabilistically test the function returning the maximum number of possible points + * for a given scratch space. + */ +void test_ecmult_multi_pippenger_max_points(void) { + size_t scratch_size = secp256k1_rand_int(256); + size_t max_size = secp256k1_pippenger_scratch_size(secp256k1_pippenger_bucket_window_inv(PIPPENGER_MAX_BUCKET_WINDOW-1)+512, 12); + secp256k1_scratch *scratch; + size_t n_points_supported; + int bucket_window = 0; + + for(; scratch_size < max_size; scratch_size+=256) { + scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size); + CHECK(scratch != NULL); + n_points_supported = secp256k1_pippenger_max_points(scratch); + if (n_points_supported == 0) { + secp256k1_scratch_destroy(scratch); + continue; + } + bucket_window = secp256k1_pippenger_bucket_window(n_points_supported); + CHECK(secp256k1_scratch_allocate_frame(scratch, secp256k1_pippenger_scratch_size(n_points_supported, bucket_window), PIPPENGER_SCRATCH_OBJECTS)); + secp256k1_scratch_deallocate_frame(scratch); + secp256k1_scratch_destroy(scratch); + } + CHECK(bucket_window == PIPPENGER_MAX_BUCKET_WINDOW); +} + +/** + * Run secp256k1_ecmult_multi_var with num points and a scratch space restricted to + * 1 <= i <= num points. + */ +void test_ecmult_multi_batching(void) { + static const int n_points = 2*ECMULT_PIPPENGER_THRESHOLD; + secp256k1_scalar scG; + secp256k1_scalar szero; + secp256k1_scalar *sc = (secp256k1_scalar *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_scalar) * n_points); + secp256k1_ge *pt = (secp256k1_ge *)checked_malloc(&ctx->error_callback, sizeof(secp256k1_ge) * n_points); + secp256k1_gej r; + secp256k1_gej r2; + ecmult_multi_data data; + int i; + secp256k1_scratch *scratch; + + secp256k1_gej_set_infinity(&r2); + secp256k1_scalar_set_int(&szero, 0); + + /* Get random scalars and group elements and compute result */ + random_scalar_order(&scG); + secp256k1_ecmult(&ctx->ecmult_ctx, &r2, &r2, &szero, &scG); + for(i = 0; i < n_points; i++) { + secp256k1_ge ptg; + secp256k1_gej ptgj; + random_group_element_test(&ptg); + secp256k1_gej_set_ge(&ptgj, &ptg); + pt[i] = ptg; + random_scalar_order(&sc[i]); + secp256k1_ecmult(&ctx->ecmult_ctx, &ptgj, &ptgj, &sc[i], NULL); + secp256k1_gej_add_var(&r2, &r2, &ptgj, NULL); + } + data.sc = sc; + data.pt = pt; + + /* Test with empty scratch space */ + scratch = secp256k1_scratch_create(&ctx->error_callback, 0); + CHECK(!secp256k1_ecmult_multi_var(&ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, 1)); + secp256k1_scratch_destroy(scratch); + + /* Test with space for 1 point in pippenger. That's not enough because + * ecmult_multi selects strauss which requires more memory. */ + scratch = secp256k1_scratch_create(&ctx->error_callback, secp256k1_pippenger_scratch_size(1, 1) + PIPPENGER_SCRATCH_OBJECTS*ALIGNMENT); + CHECK(!secp256k1_ecmult_multi_var(&ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, 1)); + secp256k1_scratch_destroy(scratch); + + secp256k1_gej_neg(&r2, &r2); + for(i = 1; i <= n_points; i++) { + if (i > ECMULT_PIPPENGER_THRESHOLD) { + int bucket_window = secp256k1_pippenger_bucket_window(i); + size_t scratch_size = secp256k1_pippenger_scratch_size(i, bucket_window); + scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size + PIPPENGER_SCRATCH_OBJECTS*ALIGNMENT); + } else { + size_t scratch_size = secp256k1_strauss_scratch_size(i); + scratch = secp256k1_scratch_create(&ctx->error_callback, scratch_size + STRAUSS_SCRATCH_OBJECTS*ALIGNMENT); + } + CHECK(secp256k1_ecmult_multi_var(&ctx->ecmult_ctx, scratch, &r, &scG, ecmult_multi_callback, &data, n_points)); + secp256k1_gej_add_var(&r, &r, &r2, NULL); + CHECK(secp256k1_gej_is_infinity(&r)); + secp256k1_scratch_destroy(scratch); + } + free(sc); + free(pt); +} + +void run_ecmult_multi_tests(void) { + secp256k1_scratch *scratch; + + test_secp256k1_pippenger_bucket_window_inv(); + test_ecmult_multi_pippenger_max_points(); + scratch = secp256k1_scratch_create(&ctx->error_callback, 819200); + test_ecmult_multi(scratch, secp256k1_ecmult_multi_var); + test_ecmult_multi(scratch, secp256k1_ecmult_pippenger_batch_single); + test_ecmult_multi(scratch, secp256k1_ecmult_strauss_batch_single); + secp256k1_scratch_destroy(scratch); + + /* Run test_ecmult_multi with space for exactly one point */ + scratch = secp256k1_scratch_create(&ctx->error_callback, secp256k1_strauss_scratch_size(1) + STRAUSS_SCRATCH_OBJECTS*ALIGNMENT); + test_ecmult_multi(scratch, secp256k1_ecmult_multi_var); + secp256k1_scratch_destroy(scratch); + + test_ecmult_multi_batching(); +} + +void test_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, two, t; + int wnaf[256]; + int zeroes = -1; + int i; + int bits; + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&two, 2); + bits = secp256k1_ecmult_wnaf(wnaf, 256, number, w); + CHECK(bits <= 256); + for (i = bits-1; i >= 0; i--) { + int v = wnaf[i]; + secp256k1_scalar_mul(&x, &x, &two); + if (v) { + CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ + zeroes=0; + CHECK((v & 1) == 1); /* check non-zero elements are odd */ + CHECK(v <= (1 << (w-1)) - 1); /* check range below */ + CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ + } else { + CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ + zeroes++; + } + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ +} + +void test_constant_wnaf_negate(const secp256k1_scalar *number) { + secp256k1_scalar neg1 = *number; + secp256k1_scalar neg2 = *number; + int sign1 = 1; + int sign2 = 1; + + if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) { + secp256k1_scalar_negate(&neg1, &neg1); + sign1 = -1; + } + sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2)); + CHECK(sign1 == sign2); + CHECK(secp256k1_scalar_eq(&neg1, &neg2)); +} + +void test_constant_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, shift; + int wnaf[256] = {0}; + int i; + int skew; + int bits = 256; + secp256k1_scalar num = *number; + + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&shift, 1 << w); + /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ +#ifdef USE_ENDOMORPHISM + for (i = 0; i < 16; ++i) { + secp256k1_scalar_shr_int(&num, 8); + } + bits = 128; +#endif + skew = secp256k1_wnaf_const(wnaf, num, w, bits); + + for (i = WNAF_SIZE_BITS(bits, w); i >= 0; --i) { + secp256k1_scalar t; + int v = wnaf[i]; + CHECK(v != 0); /* check nonzero */ + CHECK(v & 1); /* check parity */ + CHECK(v > -(1 << w)); /* check range above */ + CHECK(v < (1 << w)); /* check range below */ + + secp256k1_scalar_mul(&x, &x, &shift); + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + /* Skew num because when encoding numbers as odd we use an offset */ + secp256k1_scalar_cadd_bit(&num, skew == 2, 1); + CHECK(secp256k1_scalar_eq(&x, &num)); +} + +void test_fixed_wnaf(const secp256k1_scalar *number, int w) { + secp256k1_scalar x, shift; + int wnaf[256] = {0}; + int i; + int skew; + secp256k1_scalar num = *number; + + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&shift, 1 << w); + /* With USE_ENDOMORPHISM on we only consider 128-bit numbers */ +#ifdef USE_ENDOMORPHISM + for (i = 0; i < 16; ++i) { + secp256k1_scalar_shr_int(&num, 8); + } +#endif + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + + for (i = WNAF_SIZE(w)-1; i >= 0; --i) { + secp256k1_scalar t; + int v = wnaf[i]; + CHECK(v == 0 || v & 1); /* check parity */ + CHECK(v > -(1 << w)); /* check range above */ + CHECK(v < (1 << w)); /* check range below */ + + secp256k1_scalar_mul(&x, &x, &shift); + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + /* If skew is 1 then add 1 to num */ + secp256k1_scalar_cadd_bit(&num, 0, skew == 1); + CHECK(secp256k1_scalar_eq(&x, &num)); +} + +/* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the + * rest is 0.*/ +void test_fixed_wnaf_small_helper(int *wnaf, int *wnaf_expected, int w) { + int i; + for (i = WNAF_SIZE(w)-1; i >= 8; --i) { + CHECK(wnaf[i] == 0); + } + for (i = 7; i >= 0; --i) { + CHECK(wnaf[i] == wnaf_expected[i]); + } +} + +void test_fixed_wnaf_small(void) { + int w = 4; + int wnaf[256] = {0}; + int i; + int skew; + secp256k1_scalar num; + + secp256k1_scalar_set_int(&num, 0); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + for (i = WNAF_SIZE(w)-1; i >= 0; --i) { + int v = wnaf[i]; + CHECK(v == 0); + } + CHECK(skew == 0); + + secp256k1_scalar_set_int(&num, 1); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + for (i = WNAF_SIZE(w)-1; i >= 1; --i) { + int v = wnaf[i]; + CHECK(v == 0); + } + CHECK(wnaf[0] == 1); + CHECK(skew == 0); + + { + int wnaf_expected[8] = { 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf }; + secp256k1_scalar_set_int(&num, 0xffffffff); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); + CHECK(skew == 0); + } + { + int wnaf_expected[8] = { -1, -1, -1, -1, -1, -1, -1, 0xf }; + secp256k1_scalar_set_int(&num, 0xeeeeeeee); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); + CHECK(skew == 1); + } + { + int wnaf_expected[8] = { 1, 0, 1, 0, 1, 0, 1, 0 }; + secp256k1_scalar_set_int(&num, 0x01010101); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); + CHECK(skew == 0); + } + { + int wnaf_expected[8] = { -0xf, 0, 0xf, -0xf, 0, 0xf, 1, 0 }; + secp256k1_scalar_set_int(&num, 0x01ef1ef1); + skew = secp256k1_wnaf_fixed(wnaf, &num, w); + test_fixed_wnaf_small_helper(wnaf, wnaf_expected, w); + CHECK(skew == 0); + } +} + +void run_wnaf(void) { + int i; + secp256k1_scalar n = {{0}}; + + /* Sanity check: 1 and 2 are the smallest odd and even numbers and should + * have easier-to-diagnose failure modes */ + n.d[0] = 1; + test_constant_wnaf(&n, 4); + n.d[0] = 2; + test_constant_wnaf(&n, 4); + /* Test 0 */ + test_fixed_wnaf_small(); + /* Random tests */ + for (i = 0; i < count; i++) { + random_scalar_order(&n); + test_wnaf(&n, 4+(i%10)); + test_constant_wnaf_negate(&n); + test_constant_wnaf(&n, 4 + (i % 10)); + test_fixed_wnaf(&n, 4 + (i % 10)); + } + secp256k1_scalar_set_int(&n, 0); + CHECK(secp256k1_scalar_cond_negate(&n, 1) == -1); + CHECK(secp256k1_scalar_is_zero(&n)); + CHECK(secp256k1_scalar_cond_negate(&n, 0) == 1); + CHECK(secp256k1_scalar_is_zero(&n)); +} + +void test_ecmult_constants(void) { + /* Test ecmult_gen() for [0..36) and [order-36..0). */ + secp256k1_scalar x; + secp256k1_gej r; + secp256k1_ge ng; + int i; + int j; + secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); + for (i = 0; i < 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&secp256k1_ge_const_g, &r); + } + secp256k1_gej_add_ge(&r, &r, &ng); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } + for (i = 1; i <= 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_scalar_negate(&x, &x); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&ng, &r); + } + secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } +} + +void run_ecmult_constants(void) { + test_ecmult_constants(); +} + +void test_ecmult_gen_blind(void) { + /* Test ecmult_gen() blinding and confirm that the blinding changes, the affine points match, and the z's don't match. */ + secp256k1_scalar key; + secp256k1_scalar b; + unsigned char seed32[32]; + secp256k1_gej pgej; + secp256k1_gej pgej2; + secp256k1_gej i; + secp256k1_ge pge; + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); + secp256k1_rand256(seed32); + b = ctx->ecmult_gen_ctx.blind; + i = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key); + CHECK(!gej_xyz_equals_gej(&pgej, &pgej2)); + CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial)); + secp256k1_ge_set_gej(&pge, &pgej); + ge_equals_gej(&pge, &pgej2); +} + +void test_ecmult_gen_blind_reset(void) { + /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ + secp256k1_scalar b; + secp256k1_gej initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + b = ctx->ecmult_gen_ctx.blind; + initial = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial)); +} + +void run_ecmult_gen_blind(void) { + int i; + test_ecmult_gen_blind_reset(); + for (i = 0; i < 10; i++) { + test_ecmult_gen_blind(); + } +} + +#ifdef USE_ENDOMORPHISM +/***** ENDOMORPHISH TESTS *****/ +void test_scalar_split(void) { + secp256k1_scalar full; + secp256k1_scalar s1, slam; + const unsigned char zero[32] = {0}; + unsigned char tmp[32]; + + random_scalar_order_test(&full); + secp256k1_scalar_split_lambda(&s1, &slam, &full); + + /* check that both are <= 128 bits in size */ + if (secp256k1_scalar_is_high(&s1)) { + secp256k1_scalar_negate(&s1, &s1); + } + if (secp256k1_scalar_is_high(&slam)) { + secp256k1_scalar_negate(&slam, &slam); + } + + secp256k1_scalar_get_b32(tmp, &s1); + CHECK(memcmp(zero, tmp, 16) == 0); + secp256k1_scalar_get_b32(tmp, &slam); + CHECK(memcmp(zero, tmp, 16) == 0); +} + +void run_endomorphism_tests(void) { + test_scalar_split(); +} +#endif + +void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, int yvalid) { + unsigned char pubkeyc[65]; + secp256k1_pubkey pubkey; + secp256k1_ge ge; + size_t pubkeyclen; + int32_t ecount; + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) { + /* Smaller sizes are tested exhaustively elsewhere. */ + int32_t i; + memcpy(&pubkeyc[1], input, 64); + VG_UNDEF(&pubkeyc[pubkeyclen], 65 - pubkeyclen); + for (i = 0; i < 256; i++) { + /* Try all type bytes. */ + int xpass; + int ypass; + int ysign; + pubkeyc[0] = i; + /* What sign does this point have? */ + ysign = (input[63] & 1) + 2; + /* For the current type (i) do we expect parsing to work? Handled all of compressed/uncompressed/hybrid. */ + xpass = xvalid && (pubkeyclen == 33) && ((i & 254) == 2); + /* Do we expect a parse and re-serialize as uncompressed to give a matching y? */ + ypass = xvalid && yvalid && ((i & 4) == ((pubkeyclen == 65) << 2)) && + ((i == 4) || ((i & 251) == ysign)) && ((pubkeyclen == 33) || (pubkeyclen == 65)); + if (xpass || ypass) { + /* These cases must parse. */ + unsigned char pubkeyo[65]; + size_t outl; + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + ecount = 0; + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 33); + CHECK(memcmp(&pubkeyo[1], &pubkeyc[1], 32) == 0); + CHECK((pubkeyclen != 33) || (pubkeyo[0] == pubkeyc[0])); + if (ypass) { + /* This test isn't always done because we decode with alternative signs, so the y won't match. */ + CHECK(pubkeyo[0] == ysign); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + secp256k1_pubkey_save(&pubkey, &ge); + VG_CHECK(&pubkey, sizeof(pubkey)); + outl = 65; + VG_UNDEF(pubkeyo, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyo, &outl, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(pubkeyo, outl); + CHECK(outl == 65); + CHECK(pubkeyo[0] == 4); + CHECK(memcmp(&pubkeyo[1], input, 64) == 0); + } + CHECK(ecount == 0); + } else { + /* These cases must fail to parse. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + } + } + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void run_ec_pubkey_parse_test(void) { +#define SECP256K1_EC_PARSE_TEST_NVALID (12) + const unsigned char valid[SECP256K1_EC_PARSE_TEST_NVALID][64] = { + { + /* Point with leading and trailing zeros in x and y serialization. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x52, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0xef, 0xa1, 0x7b, 0x77, 0x61, 0xe1, 0xe4, 0x27, 0x06, 0x98, 0x9f, 0xb4, 0x83, + 0xb8, 0xd2, 0xd4, 0x9b, 0xf7, 0x8f, 0xae, 0x98, 0x03, 0xf0, 0x99, 0xb8, 0x34, 0xed, 0xeb, 0x00 + }, + { + /* Point with x equal to a 3rd root of unity.*/ + 0x7a, 0xe9, 0x6a, 0x2b, 0x65, 0x7c, 0x07, 0x10, 0x6e, 0x64, 0x47, 0x9e, 0xac, 0x34, 0x34, 0xe9, + 0x9c, 0xf0, 0x49, 0x75, 0x12, 0xf5, 0x89, 0x95, 0xc1, 0x39, 0x6c, 0x28, 0x71, 0x95, 0x01, 0xee, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with largest x. (1/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0x0e, 0x99, 0x4b, 0x14, 0xea, 0x72, 0xf8, 0xc3, 0xeb, 0x95, 0xc7, 0x1e, 0xf6, 0x92, 0x57, 0x5e, + 0x77, 0x50, 0x58, 0x33, 0x2d, 0x7e, 0x52, 0xd0, 0x99, 0x5c, 0xf8, 0x03, 0x88, 0x71, 0xb6, 0x7d, + }, + { + /* Point with largest x. (2/2) */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2c, + 0xf1, 0x66, 0xb4, 0xeb, 0x15, 0x8d, 0x07, 0x3c, 0x14, 0x6a, 0x38, 0xe1, 0x09, 0x6d, 0xa8, 0xa1, + 0x88, 0xaf, 0xa7, 0xcc, 0xd2, 0x81, 0xad, 0x2f, 0x66, 0xa3, 0x07, 0xfb, 0x77, 0x8e, 0x45, 0xb2, + }, + { + /* Point with smallest x. (1/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Point with smallest x. (2/2) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* Point with largest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with largest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + }, + { + /* Point with smallest y. (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Point with smallest y. (3/3) */ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + } + }; +#define SECP256K1_EC_PARSE_TEST_NXVALID (4) + const unsigned char onlyxvalid[SECP256K1_EC_PARSE_TEST_NXVALID][64] = { + { + /* Valid if y overflow ignored (y = 1 mod p). (1/3) */ + 0x1f, 0xe1, 0xe5, 0xef, 0x3f, 0xce, 0xb5, 0xc1, 0x35, 0xab, 0x77, 0x41, 0x33, 0x3c, 0xe5, 0xa6, + 0xe8, 0x0d, 0x68, 0x16, 0x76, 0x53, 0xf6, 0xb2, 0xb2, 0x4b, 0xcb, 0xcf, 0xaa, 0xaf, 0xf5, 0x07, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (2/3) */ + 0xcb, 0xb0, 0xde, 0xab, 0x12, 0x57, 0x54, 0xf1, 0xfd, 0xb2, 0x03, 0x8b, 0x04, 0x34, 0xed, 0x9c, + 0xb3, 0xfb, 0x53, 0xab, 0x73, 0x53, 0x91, 0x12, 0x99, 0x94, 0xa5, 0x35, 0xd9, 0x25, 0xf6, 0x73, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* Valid if y overflow ignored (y = 1 mod p). (3/3)*/ + 0x14, 0x6d, 0x3b, 0x65, 0xad, 0xd9, 0xf5, 0x4c, 0xcc, 0xa2, 0x85, 0x33, 0xc8, 0x8e, 0x2c, 0xbc, + 0x63, 0xf7, 0x44, 0x3e, 0x16, 0x58, 0x78, 0x3a, 0xb4, 0x1f, 0x8e, 0xf9, 0x7c, 0x2a, 0x10, 0xb5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + }, + { + /* x on curve, y is from y^2 = x^3 + 8. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 + } + }; +#define SECP256K1_EC_PARSE_TEST_NINVALID (7) + const unsigned char invalid[SECP256K1_EC_PARSE_TEST_NINVALID][64] = { + { + /* x is third root of -8, y is -1 * (x^3+7); also on the curve for y^2 = x^3 + 9. */ + 0x0a, 0x2d, 0x2b, 0xa9, 0x35, 0x07, 0xf1, 0xdf, 0x23, 0x37, 0x70, 0xc2, 0xa7, 0x97, 0x96, 0x2c, + 0xc6, 0x1f, 0x6d, 0x15, 0xda, 0x14, 0xec, 0xd4, 0x7d, 0x8d, 0x27, 0xae, 0x1c, 0xd5, 0xf8, 0x53, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0x42, 0x18, 0xf2, 0x0a, 0xe6, 0xc6, 0x46, 0xb3, 0x63, 0xdb, 0x68, 0x60, 0x58, 0x22, 0xfb, 0x14, + 0x26, 0x4c, 0xa8, 0xd2, 0x58, 0x7f, 0xdd, 0x6f, 0xbc, 0x75, 0x0d, 0x58, 0x7e, 0x76, 0xa7, 0xee, + }, + { + /* Valid if x overflow ignored (x = 1 mod p). */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x30, + 0xbd, 0xe7, 0x0d, 0xf5, 0x19, 0x39, 0xb9, 0x4c, 0x9c, 0x24, 0x97, 0x9f, 0xa7, 0xdd, 0x04, 0xeb, + 0xd9, 0xb3, 0x57, 0x2d, 0xa7, 0x80, 0x22, 0x90, 0x43, 0x8a, 0xf2, 0xa6, 0x81, 0x89, 0x54, 0x41, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0xf4, 0x84, 0x14, 0x5c, 0xb0, 0x14, 0x9b, 0x82, 0x5d, 0xff, 0x41, 0x2f, 0xa0, 0x52, 0xa8, 0x3f, + 0xcb, 0x72, 0xdb, 0x61, 0xd5, 0x6f, 0x37, 0x70, 0xce, 0x06, 0x6b, 0x73, 0x49, 0xa2, 0xaa, 0x28, + }, + { + /* x is -1, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 5. */ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfc, 0x2e, + 0x0b, 0x7b, 0xeb, 0xa3, 0x4f, 0xeb, 0x64, 0x7d, 0xa2, 0x00, 0xbe, 0xd0, 0x5f, 0xad, 0x57, 0xc0, + 0x34, 0x8d, 0x24, 0x9e, 0x2a, 0x90, 0xc8, 0x8f, 0x31, 0xf9, 0x94, 0x8b, 0xb6, 0x5d, 0x52, 0x07, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8f, 0x53, 0x7e, 0xef, 0xdf, 0xc1, 0x60, 0x6a, 0x07, 0x27, 0xcd, 0x69, 0xb4, 0xa7, 0x33, 0x3d, + 0x38, 0xed, 0x44, 0xe3, 0x93, 0x2a, 0x71, 0x79, 0xee, 0xcb, 0x4b, 0x6f, 0xba, 0x93, 0x60, 0xdc, + }, + { + /* x is zero, y is the result of the sqrt ladder; also on the curve for y^2 = x^3 - 7. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0xac, 0x81, 0x10, 0x20, 0x3e, 0x9f, 0x95, 0xf8, 0xd8, 0x32, 0x96, 0x4b, 0x58, 0xcc, 0xc2, + 0xc7, 0x12, 0xbb, 0x1c, 0x6c, 0xd5, 0x8e, 0x86, 0x11, 0x34, 0xb4, 0x8f, 0x45, 0x6c, 0x9b, 0x53 + } + }; + const unsigned char pubkeyc[66] = { + /* Serialization of G. */ + 0x04, 0x79, 0xBE, 0x66, 0x7E, 0xF9, 0xDC, 0xBB, 0xAC, 0x55, 0xA0, 0x62, 0x95, 0xCE, 0x87, 0x0B, + 0x07, 0x02, 0x9B, 0xFC, 0xDB, 0x2D, 0xCE, 0x28, 0xD9, 0x59, 0xF2, 0x81, 0x5B, 0x16, 0xF8, 0x17, + 0x98, 0x48, 0x3A, 0xDA, 0x77, 0x26, 0xA3, 0xC4, 0x65, 0x5D, 0xA4, 0xFB, 0xFC, 0x0E, 0x11, 0x08, + 0xA8, 0xFD, 0x17, 0xB4, 0x48, 0xA6, 0x85, 0x54, 0x19, 0x9C, 0x47, 0xD0, 0x8F, 0xFB, 0x10, 0xD4, + 0xB8, 0x00 + }; + unsigned char sout[65]; + unsigned char shortkey[2]; + secp256k1_ge ge; + secp256k1_pubkey pubkey; + size_t len; + int32_t i; + int32_t ecount; + int32_t ecount2; + ecount = 0; + /* Nothing should be reading this far into pubkeyc. */ + VG_UNDEF(&pubkeyc[65], 1); + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + /* Zero length claimed, fail, zeroize, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(shortkey, 2); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 0) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Length one claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 256 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i; + VG_UNDEF(&shortkey[1], 1); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 1) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + /* Length two claimed, fail, zeroize, no illegal arg error. */ + for (i = 0; i < 65536 ; i++) { + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + shortkey[0] = i & 255; + shortkey[1] = i >> 8; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, shortkey, 2) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + } + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + /* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 33) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */ + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, pubkeyc, 65) == 0); + CHECK(ecount == 2); + /* NULL input string. Illegal arg and zeroize output. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, NULL, 65) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 1); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 2); + /* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 64) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* 66 bytes claimed, fail, zeroize output, no illegal arg error. */ + memset(&pubkey, 0xfe, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 66) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 0); + CHECK(ecount == 1); + /* Valid parse. */ + memset(&pubkey, 0, sizeof(pubkey)); + ecount = 0; + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, 65) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(ecount == 0); + VG_UNDEF(&ge, sizeof(ge)); + CHECK(secp256k1_pubkey_load(ctx, &ge, &pubkey) == 1); + VG_CHECK(&ge.x, sizeof(ge.x)); + VG_CHECK(&ge.y, sizeof(ge.y)); + VG_CHECK(&ge.infinity, sizeof(ge.infinity)); + ge_equals_ge(&secp256k1_ge_const_g, &ge); + CHECK(ecount == 0); + /* secp256k1_ec_pubkey_serialize illegal args. */ + ecount = 0; + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 1); + CHECK(len == 0); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0); + CHECK(ecount == 2); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0); + VG_CHECK(sout, 65); + CHECK(ecount == 3); + CHECK(len == 0); + len = 65; + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, ~0) == 0); + CHECK(ecount == 4); + CHECK(len == 0); + len = 65; + VG_UNDEF(sout, 65); + CHECK(secp256k1_ec_pubkey_serialize(ctx, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1); + VG_CHECK(sout, 65); + CHECK(ecount == 4); + CHECK(len == 65); + /* Multiple illegal args. Should still set arg error only once. */ + ecount = 0; + ecount2 = 11; + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + /* Does the illegal arg callback actually change the behavior? */ + secp256k1_context_set_illegal_callback(ctx, uncounting_illegal_callback_fn, &ecount2); + CHECK(secp256k1_ec_pubkey_parse(ctx, NULL, NULL, 65) == 0); + CHECK(ecount == 1); + CHECK(ecount2 == 10); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); + /* Try a bunch of prefabbed points with all possible encodings. */ + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) { + ec_pubkey_parse_pointtest(valid[i], 1, 1); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NXVALID; i++) { + ec_pubkey_parse_pointtest(onlyxvalid[i], 1, 0); + } + for (i = 0; i < SECP256K1_EC_PARSE_TEST_NINVALID; i++) { + ec_pubkey_parse_pointtest(invalid[i], 0, 0); + } +} + +void run_eckey_edge_case_test(void) { + const unsigned char orderc[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41 + }; + const unsigned char zeros[sizeof(secp256k1_pubkey)] = {0x00}; + unsigned char ctmp[33]; + unsigned char ctmp2[33]; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey2; + secp256k1_pubkey pubkey_one; + secp256k1_pubkey pubkey_negone; + const secp256k1_pubkey *pubkeys[3]; + size_t len; + int32_t ecount; + /* Group order is too large, reject. */ + CHECK(secp256k1_ec_seckey_verify(ctx, orderc) == 0); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, orderc) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Maximum value is too large, reject. */ + memset(ctmp, 255, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* Zero is too small, reject. */ + memset(ctmp, 0, 32); + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* One must be accepted. */ + ctmp[31] = 0x01; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_one = pubkey; + /* Group order + 1 is too large, reject. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x42; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 0); + memset(&pubkey, 1, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 0); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* -1 must be accepted. */ + ctmp[31] = 0x40; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + memset(&pubkey, 0, sizeof(pubkey)); + VG_UNDEF(&pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, ctmp) == 1); + VG_CHECK(&pubkey, sizeof(pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + pubkey_negone = pubkey; + /* Tweak of zero leaves the value unchanged. */ + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, ctmp2) == 1); + CHECK(memcmp(orderc, ctmp, 31) == 0 && ctmp[31] == 0x40); + memcpy(&pubkey2, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Multiply tweak of zero zeroizes the output. */ + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, ctmp2) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Overflowing key tweak zeroizes. */ + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, orderc) == 0); + CHECK(memcmp(zeros, ctmp, 32) == 0); + memcpy(ctmp, orderc, 32); + ctmp[31] = 0x40; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, orderc) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Private key tweaks results in a key of zero. */ + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 0); + CHECK(memcmp(zeros, ctmp2, 32) == 0); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + /* Tweak computation wraps and results in a key of 1. */ + ctmp2[31] = 2; + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp2, ctmp) == 1); + CHECK(memcmp(ctmp2, zeros, 31) == 0 && ctmp2[31] == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 1; + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Tweak mul * 2 = 1+1. */ + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 1); + ctmp2[31] = 2; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + /* Test argument errors. */ + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(ecount == 0); + /* Zeroize pubkey on parse error. */ + memset(&pubkey, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(memcmp(&pubkey, zeros, sizeof(pubkey)) == 0); + memcpy(&pubkey, &pubkey2, sizeof(pubkey)); + memset(&pubkey2, 0, 32); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey2, ctmp2) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey2, zeros, sizeof(pubkey2)) == 0); + /* Plain argument errors. */ + ecount = 0; + CHECK(secp256k1_ec_seckey_verify(ctx, ctmp) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ec_seckey_verify(ctx, NULL) == 0); + CHECK(ecount == 1); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 4; + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_add(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + memset(ctmp2, 0, 32); + ctmp2[31] = 1; + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, NULL, ctmp2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_privkey_tweak_mul(ctx, ctmp, NULL) == 0); + CHECK(ecount == 2); + ecount = 0; + CHECK(secp256k1_ec_pubkey_create(ctx, NULL, ctmp) == 0); + CHECK(ecount == 1); + memset(&pubkey, 1, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 2); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + /* secp256k1_ec_pubkey_combine tests. */ + ecount = 0; + pubkeys[0] = &pubkey_one; + VG_UNDEF(&pubkeys[0], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[1], sizeof(secp256k1_pubkey *)); + VG_UNDEF(&pubkeys[2], sizeof(secp256k1_pubkey *)); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 0) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ec_pubkey_combine(ctx, NULL, pubkeys, 1) == 0); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 2); + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, NULL, 1) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + pubkeys[0] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 1) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Result is infinity. */ + pubkeys[0] = &pubkey_one; + pubkeys[1] = &pubkey_negone; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 0); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0); + CHECK(ecount == 3); + /* Passes through infinity but comes out one. */ + pubkeys[2] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 3) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + len = 33; + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1); + CHECK(secp256k1_ec_pubkey_serialize(ctx, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1); + CHECK(memcmp(ctmp, ctmp2, 33) == 0); + /* Adds to two. */ + pubkeys[1] = &pubkey_one; + memset(&pubkey, 255, sizeof(secp256k1_pubkey)); + VG_UNDEF(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(secp256k1_ec_pubkey_combine(ctx, &pubkey, pubkeys, 2) == 1); + VG_CHECK(&pubkey, sizeof(secp256k1_pubkey)); + CHECK(memcmp(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0); + CHECK(ecount == 3); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); +} + +void random_sign(secp256k1_scalar *sigr, secp256k1_scalar *sigs, const secp256k1_scalar *key, const secp256k1_scalar *msg, int *recid) { + secp256k1_scalar nonce; + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sigr, sigs, key, msg, &nonce, recid)); +} + +void test_ecdsa_sign_verify(void) { + secp256k1_gej pubj; + secp256k1_ge pub; + secp256k1_scalar one; + secp256k1_scalar msg, key; + secp256k1_scalar sigr, sigs; + int recid; + int getrec; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + getrec = secp256k1_rand_bits(1); + random_sign(&sigr, &sigs, &key, &msg, getrec?&recid:NULL); + if (getrec) { + CHECK(recid >= 0 && recid < 4); + } + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &pub, &msg)); +} + +void run_ecdsa_sign_verify(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_sign_verify(); + } +} + +/** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ +static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + (void)msg32; + (void)key32; + (void)algo16; + memcpy(nonce32, data, 32); + return (counter == 0); +} + +static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + /* Dummy nonce generator that has a fatal error on the first counter value. */ + if (counter == 0) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 1); +} + +static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, const unsigned char *algo16, void *data, unsigned int counter) { + /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ + if (counter < 3) { + memset(nonce32, counter==0 ? 0 : 255, 32); + if (counter == 2) { + nonce32[31]--; + } + return 1; + } + if (counter < 5) { + static const unsigned char order[] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + memcpy(nonce32, order, 32); + if (counter == 4) { + nonce32[31]++; + } + return 1; + } + /* Retry rate of 6979 is negligible esp. as we only call this in deterministic tests. */ + /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ + if (counter > 5) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, algo16, data, counter - 5); +} + +int is_empty_signature(const secp256k1_ecdsa_signature *sig) { + static const unsigned char res[sizeof(secp256k1_ecdsa_signature)] = {0}; + return memcmp(sig, res, sizeof(secp256k1_ecdsa_signature)) == 0; +} + +void test_ecdsa_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + unsigned char privkey2[32]; + secp256k1_ecdsa_signature signature[6]; + secp256k1_scalar r, s; + unsigned char sig[74]; + size_t siglen = 74; + unsigned char pubkeyc[65]; + size_t pubkeyclen = 65; + secp256k1_pubkey pubkey; + secp256k1_pubkey pubkey_tmp; + unsigned char seckey[300]; + size_t seckeylen = 300; + + /* Generate a random key and message. */ + { + secp256k1_scalar msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, privkey) == 1); + + /* Verify exporting and importing public key. */ + CHECK(secp256k1_ec_pubkey_serialize(ctx, pubkeyc, &pubkeyclen, &pubkey, secp256k1_rand_bits(1) == 1 ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED)); + memset(&pubkey, 0, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_parse(ctx, &pubkey, pubkeyc, pubkeyclen) == 1); + + /* Verify negation changes the key and changes it back */ + memcpy(&pubkey_tmp, &pubkey, sizeof(pubkey)); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) != 0); + CHECK(secp256k1_ec_pubkey_negate(ctx, &pubkey_tmp) == 1); + CHECK(memcmp(&pubkey_tmp, &pubkey, sizeof(pubkey)) == 0); + + /* Verify private key import and export. */ + CHECK(ec_privkey_export_der(ctx, seckey, &seckeylen, privkey, secp256k1_rand_bits(1) == 1)); + CHECK(ec_privkey_import_der(ctx, privkey2, seckey, seckeylen) == 1); + CHECK(memcmp(privkey, privkey2, 32) == 0); + + /* Optionally tweak the keys using addition. */ + if (secp256k1_rand_int(3) == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + secp256k1_pubkey pubkey2; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_add(ctx, &pubkey, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + } + + /* Optionally tweak the keys using multiplication. */ + if (secp256k1_rand_int(3) == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + secp256k1_pubkey pubkey2; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, &pubkey, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey2, privkey) == 1); + CHECK(memcmp(&pubkey, &pubkey2, sizeof(pubkey)) == 0); + } + + /* Sign. */ + CHECK(secp256k1_ecdsa_sign(ctx, &signature[0], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[4], message, privkey, NULL, NULL) == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &signature[1], message, privkey, NULL, extra) == 1); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, &signature[2], message, privkey, NULL, extra) == 1); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, &signature[3], message, privkey, NULL, extra) == 1); + CHECK(memcmp(&signature[0], &signature[4], sizeof(signature[0])) == 0); + CHECK(memcmp(&signature[0], &signature[1], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[0], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[2], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[1], &signature[3], sizeof(signature[0])) != 0); + CHECK(memcmp(&signature[2], &signature[3], sizeof(signature[0])) != 0); + /* Verify. */ + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[1], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[2], message, &pubkey) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[3], message, &pubkey) == 1); + /* Test lower-S form, malleate, verify and fail, test again, malleate again */ + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[0])); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &signature[0]); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 0); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, &signature[5], &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + secp256k1_scalar_negate(&s, &s); + secp256k1_ecdsa_signature_save(&signature[5], &r, &s); + CHECK(!secp256k1_ecdsa_signature_normalize(ctx, NULL, &signature[5])); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[5], message, &pubkey) == 1); + CHECK(memcmp(&signature[5], &signature[0], 64) == 0); + + /* Serialize/parse DER and verify again */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + memset(&signature[0], 0, sizeof(signature[0])); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 1); + /* Serialize/destroy/parse DER and verify again. */ + siglen = 74; + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, sig, &siglen, &signature[0]) == 1); + sig[secp256k1_rand_int(siglen)] += 1 + secp256k1_rand_int(255); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &signature[0], sig, siglen) == 0 || + secp256k1_ecdsa_verify(ctx, &signature[0], message, &pubkey) == 0); +} + +void test_random_pubkeys(void) { + secp256k1_ge elem; + secp256k1_ge elem2; + unsigned char in[65]; + /* Generate some randomly sized pubkeys. */ + size_t len = secp256k1_rand_bits(2) == 0 ? 65 : 33; + if (secp256k1_rand_bits(2) == 0) { + len = secp256k1_rand_bits(6); + } + if (len == 65) { + in[0] = secp256k1_rand_bits(1) ? 4 : (secp256k1_rand_bits(1) ? 6 : 7); + } else { + in[0] = secp256k1_rand_bits(1) ? 2 : 3; + } + if (secp256k1_rand_bits(3) == 0) { + in[0] = secp256k1_rand_bits(8); + } + if (len > 1) { + secp256k1_rand256(&in[1]); + } + if (len > 33) { + secp256k1_rand256(&in[33]); + } + if (secp256k1_eckey_pubkey_parse(&elem, in, len)) { + unsigned char out[65]; + unsigned char firstb; + int res; + size_t size = len; + firstb = in[0]; + /* If the pubkey can be parsed, it should round-trip... */ + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); + CHECK(size == len); + CHECK(memcmp(&in[1], &out[1], len-1) == 0); + /* ... except for the type of hybrid inputs. */ + if ((in[0] != 6) && (in[0] != 7)) { + CHECK(in[0] == out[0]); + } + size = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0)); + CHECK(size == 65); + CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); + ge_equals_ge(&elem,&elem2); + /* Check that the X9.62 hybrid type is checked. */ + in[0] = secp256k1_rand_bits(1) ? 6 : 7; + res = secp256k1_eckey_pubkey_parse(&elem2, in, size); + if (firstb == 2 || firstb == 3) { + if (in[0] == firstb + 4) { + CHECK(res); + } else { + CHECK(!res); + } + } + if (res) { + ge_equals_ge(&elem,&elem2); + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0)); + CHECK(memcmp(&in[1], &out[1], 64) == 0); + } + } +} + +void run_random_pubkeys(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_random_pubkeys(); + } +} + +void run_ecdsa_end_to_end(void) { + int i; + for (i = 0; i < 64*count; i++) { + test_ecdsa_end_to_end(); + } +} + +int test_ecdsa_der_parse(const unsigned char *sig, size_t siglen, int certainly_der, int certainly_not_der) { + static const unsigned char zeroes[32] = {0}; +#ifdef ENABLE_OPENSSL_TESTS + static const unsigned char max_scalar[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x40 + }; +#endif + + int ret = 0; + + secp256k1_ecdsa_signature sig_der; + unsigned char roundtrip_der[2048]; + unsigned char compact_der[64]; + size_t len_der = 2048; + int parsed_der = 0, valid_der = 0, roundtrips_der = 0; + + secp256k1_ecdsa_signature sig_der_lax; + unsigned char roundtrip_der_lax[2048]; + unsigned char compact_der_lax[64]; + size_t len_der_lax = 2048; + int parsed_der_lax = 0, valid_der_lax = 0, roundtrips_der_lax = 0; + +#ifdef ENABLE_OPENSSL_TESTS + ECDSA_SIG *sig_openssl; + const BIGNUM *r = NULL, *s = NULL; + const unsigned char *sigptr; + unsigned char roundtrip_openssl[2048]; + int len_openssl = 2048; + int parsed_openssl, valid_openssl = 0, roundtrips_openssl = 0; +#endif + + parsed_der = secp256k1_ecdsa_signature_parse_der(ctx, &sig_der, sig, siglen); + if (parsed_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der, &sig_der)) << 0; + valid_der = (memcmp(compact_der, zeroes, 32) != 0) && (memcmp(compact_der + 32, zeroes, 32) != 0); + } + if (valid_der) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der, &len_der, &sig_der)) << 1; + roundtrips_der = (len_der == siglen) && memcmp(roundtrip_der, sig, siglen) == 0; + } + + parsed_der_lax = ecdsa_signature_parse_der_lax(ctx, &sig_der_lax, sig, siglen); + if (parsed_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_compact(ctx, compact_der_lax, &sig_der_lax)) << 10; + valid_der_lax = (memcmp(compact_der_lax, zeroes, 32) != 0) && (memcmp(compact_der_lax + 32, zeroes, 32) != 0); + } + if (valid_der_lax) { + ret |= (!secp256k1_ecdsa_signature_serialize_der(ctx, roundtrip_der_lax, &len_der_lax, &sig_der_lax)) << 11; + roundtrips_der_lax = (len_der_lax == siglen) && memcmp(roundtrip_der_lax, sig, siglen) == 0; + } + + if (certainly_der) { + ret |= (!parsed_der) << 2; + } + if (certainly_not_der) { + ret |= (parsed_der) << 17; + } + if (valid_der) { + ret |= (!roundtrips_der) << 3; + } + + if (valid_der) { + ret |= (!roundtrips_der_lax) << 12; + ret |= (len_der != len_der_lax) << 13; + ret |= (memcmp(roundtrip_der_lax, roundtrip_der, len_der) != 0) << 14; + } + ret |= (roundtrips_der != roundtrips_der_lax) << 15; + if (parsed_der) { + ret |= (!parsed_der_lax) << 16; + } + +#ifdef ENABLE_OPENSSL_TESTS + sig_openssl = ECDSA_SIG_new(); + sigptr = sig; + parsed_openssl = (d2i_ECDSA_SIG(&sig_openssl, &sigptr, siglen) != NULL); + if (parsed_openssl) { + ECDSA_SIG_get0(sig_openssl, &r, &s); + valid_openssl = !BN_is_negative(r) && !BN_is_negative(s) && BN_num_bits(r) > 0 && BN_num_bits(r) <= 256 && BN_num_bits(s) > 0 && BN_num_bits(s) <= 256; + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(r, tmp + 32 - BN_num_bytes(r)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; + } + if (valid_openssl) { + unsigned char tmp[32] = {0}; + BN_bn2bin(s, tmp + 32 - BN_num_bytes(s)); + valid_openssl = memcmp(tmp, max_scalar, 32) < 0; + } + } + len_openssl = i2d_ECDSA_SIG(sig_openssl, NULL); + if (len_openssl <= 2048) { + unsigned char *ptr = roundtrip_openssl; + CHECK(i2d_ECDSA_SIG(sig_openssl, &ptr) == len_openssl); + roundtrips_openssl = valid_openssl && ((size_t)len_openssl == siglen) && (memcmp(roundtrip_openssl, sig, siglen) == 0); + } else { + len_openssl = 0; + } + ECDSA_SIG_free(sig_openssl); + + ret |= (parsed_der && !parsed_openssl) << 4; + ret |= (valid_der && !valid_openssl) << 5; + ret |= (roundtrips_openssl && !parsed_der) << 6; + ret |= (roundtrips_der != roundtrips_openssl) << 7; + if (roundtrips_openssl) { + ret |= (len_der != (size_t)len_openssl) << 8; + ret |= (memcmp(roundtrip_der, roundtrip_openssl, len_der) != 0) << 9; + } +#endif + return ret; +} + +static void assign_big_endian(unsigned char *ptr, size_t ptrlen, uint32_t val) { + size_t i; + for (i = 0; i < ptrlen; i++) { + int shift = ptrlen - 1 - i; + if (shift >= 4) { + ptr[i] = 0; + } else { + ptr[i] = (val >> shift) & 0xFF; + } + } +} + +static void damage_array(unsigned char *sig, size_t *len) { + int pos; + int action = secp256k1_rand_bits(3); + if (action < 1 && *len > 3) { + /* Delete a byte. */ + pos = secp256k1_rand_int(*len); + memmove(sig + pos, sig + pos + 1, *len - pos - 1); + (*len)--; + return; + } else if (action < 2 && *len < 2048) { + /* Insert a byte. */ + pos = secp256k1_rand_int(1 + *len); + memmove(sig + pos + 1, sig + pos, *len - pos); + sig[pos] = secp256k1_rand_bits(8); + (*len)++; + return; + } else if (action < 4) { + /* Modify a byte. */ + sig[secp256k1_rand_int(*len)] += 1 + secp256k1_rand_int(255); + return; + } else { /* action < 8 */ + /* Modify a bit. */ + sig[secp256k1_rand_int(*len)] ^= 1 << secp256k1_rand_bits(3); + return; + } +} + +static void random_ber_signature(unsigned char *sig, size_t *len, int* certainly_der, int* certainly_not_der) { + int der; + int nlow[2], nlen[2], nlenlen[2], nhbit[2], nhbyte[2], nzlen[2]; + size_t tlen, elen, glen; + int indet; + int n; + + *len = 0; + der = secp256k1_rand_bits(2) == 0; + *certainly_der = der; + *certainly_not_der = 0; + indet = der ? 0 : secp256k1_rand_int(10) == 0; + + for (n = 0; n < 2; n++) { + /* We generate two classes of numbers: nlow==1 "low" ones (up to 32 bytes), nlow==0 "high" ones (32 bytes with 129 top bits set, or larger than 32 bytes) */ + nlow[n] = der ? 1 : (secp256k1_rand_bits(3) != 0); + /* The length of the number in bytes (the first byte of which will always be nonzero) */ + nlen[n] = nlow[n] ? secp256k1_rand_int(33) : 32 + secp256k1_rand_int(200) * secp256k1_rand_int(8) / 8; + CHECK(nlen[n] <= 232); + /* The top bit of the number. */ + nhbit[n] = (nlow[n] == 0 && nlen[n] == 32) ? 1 : (nlen[n] == 0 ? 0 : secp256k1_rand_bits(1)); + /* The top byte of the number (after the potential hardcoded 16 0xFF characters for "high" 32 bytes numbers) */ + nhbyte[n] = nlen[n] == 0 ? 0 : (nhbit[n] ? 128 + secp256k1_rand_bits(7) : 1 + secp256k1_rand_int(127)); + /* The number of zero bytes in front of the number (which is 0 or 1 in case of DER, otherwise we extend up to 300 bytes) */ + nzlen[n] = der ? ((nlen[n] == 0 || nhbit[n]) ? 1 : 0) : (nlow[n] ? secp256k1_rand_int(3) : secp256k1_rand_int(300 - nlen[n]) * secp256k1_rand_int(8) / 8); + if (nzlen[n] > ((nlen[n] == 0 || nhbit[n]) ? 1 : 0)) { + *certainly_not_der = 1; + } + CHECK(nlen[n] + nzlen[n] <= 300); + /* The length of the length descriptor for the number. 0 means short encoding, anything else is long encoding. */ + nlenlen[n] = nlen[n] + nzlen[n] < 128 ? 0 : (nlen[n] + nzlen[n] < 256 ? 1 : 2); + if (!der) { + /* nlenlen[n] max 127 bytes */ + int add = secp256k1_rand_int(127 - nlenlen[n]) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + nlenlen[n] += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + CHECK(nlen[n] + nzlen[n] + nlenlen[n] <= 427); + } + + /* The total length of the data to go, so far */ + tlen = 2 + nlenlen[0] + nlen[0] + nzlen[0] + 2 + nlenlen[1] + nlen[1] + nzlen[1]; + CHECK(tlen <= 856); + + /* The length of the garbage inside the tuple. */ + elen = (der || indet) ? 0 : secp256k1_rand_int(980 - tlen) * secp256k1_rand_int(8) / 8; + if (elen != 0) { + *certainly_not_der = 1; + } + tlen += elen; + CHECK(tlen <= 980); + + /* The length of the garbage after the end of the tuple. */ + glen = der ? 0 : secp256k1_rand_int(990 - tlen) * secp256k1_rand_int(8) / 8; + if (glen != 0) { + *certainly_not_der = 1; + } + CHECK(tlen + glen <= 990); + + /* Write the tuple header. */ + sig[(*len)++] = 0x30; + if (indet) { + /* Indeterminate length */ + sig[(*len)++] = 0x80; + *certainly_not_der = 1; + } else { + int tlenlen = tlen < 128 ? 0 : (tlen < 256 ? 1 : 2); + if (!der) { + int add = secp256k1_rand_int(127 - tlenlen) * secp256k1_rand_int(16) * secp256k1_rand_int(16) / 256; + tlenlen += add; + if (add != 0) { + *certainly_not_der = 1; + } + } + if (tlenlen == 0) { + /* Short length notation */ + sig[(*len)++] = tlen; + } else { + /* Long length notation */ + sig[(*len)++] = 128 + tlenlen; + assign_big_endian(sig + *len, tlenlen, tlen); + *len += tlenlen; + } + tlen += tlenlen; + } + tlen += 2; + CHECK(tlen + glen <= 1119); + + for (n = 0; n < 2; n++) { + /* Write the integer header. */ + sig[(*len)++] = 0x02; + if (nlenlen[n] == 0) { + /* Short length notation */ + sig[(*len)++] = nlen[n] + nzlen[n]; + } else { + /* Long length notation. */ + sig[(*len)++] = 128 + nlenlen[n]; + assign_big_endian(sig + *len, nlenlen[n], nlen[n] + nzlen[n]); + *len += nlenlen[n]; + } + /* Write zero padding */ + while (nzlen[n] > 0) { + sig[(*len)++] = 0x00; + nzlen[n]--; + } + if (nlen[n] == 32 && !nlow[n]) { + /* Special extra 16 0xFF bytes in "high" 32-byte numbers */ + int i; + for (i = 0; i < 16; i++) { + sig[(*len)++] = 0xFF; + } + nlen[n] -= 16; + } + /* Write first byte of number */ + if (nlen[n] > 0) { + sig[(*len)++] = nhbyte[n]; + nlen[n]--; + } + /* Generate remaining random bytes of number */ + secp256k1_rand_bytes_test(sig + *len, nlen[n]); + *len += nlen[n]; + nlen[n] = 0; + } + + /* Generate random garbage inside tuple. */ + secp256k1_rand_bytes_test(sig + *len, elen); + *len += elen; + + /* Generate end-of-contents bytes. */ + if (indet) { + sig[(*len)++] = 0; + sig[(*len)++] = 0; + tlen += 2; + } + CHECK(tlen + glen <= 1121); + + /* Generate random garbage outside tuple. */ + secp256k1_rand_bytes_test(sig + *len, glen); + *len += glen; + tlen += glen; + CHECK(tlen <= 1121); + CHECK(tlen == *len); +} + +void run_ecdsa_der_parse(void) { + int i,j; + for (i = 0; i < 200 * count; i++) { + unsigned char buffer[2048]; + size_t buflen = 0; + int certainly_der = 0; + int certainly_not_der = 0; + random_ber_signature(buffer, &buflen, &certainly_der, &certainly_not_der); + CHECK(buflen <= 2048); + for (j = 0; j < 16; j++) { + int ret = 0; + if (j > 0) { + damage_array(buffer, &buflen); + /* We don't know anything anymore about the DERness of the result */ + certainly_der = 0; + certainly_not_der = 0; + } + ret = test_ecdsa_der_parse(buffer, buflen, certainly_der, certainly_not_der); + if (ret != 0) { + size_t k; + fprintf(stderr, "Failure %x on ", ret); + for (k = 0; k < buflen; k++) { + fprintf(stderr, "%02x ", buffer[k]); + } + fprintf(stderr, "\n"); + } + CHECK(ret == 0); + } + } +} + +/* Tests several edge cases. */ +void test_ecdsa_edge_cases(void) { + int t; + secp256k1_ecdsa_signature sig; + + /* Test the case where ECDSA recomputes a point that is infinity. */ + { + secp256k1_gej keyj; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_negate(&ss, &ss); + secp256k1_scalar_inverse(&ss, &ss); + secp256k1_scalar_set_int(&sr, 1); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sr); + secp256k1_ge_set_gej(&key, &keyj); + msg = ss; + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Verify signature with r of zero fails. */ + { + const unsigned char pubkey_mods_zero[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x41 + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 0); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey_mods_zero, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Verify signature with s of zero fails. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01 + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 0); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 1); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Verify signature with message 0 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02 + }; + const unsigned char pubkey2[33] = { + 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, + 0x3b, 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, + 0x43 + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_set_int(&msg, 0); + secp256k1_scalar_set_int(&sr, 2); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message 1 passes. */ + { + const unsigned char pubkey[33] = { + 0x02, 0x14, 0x4e, 0x5a, 0x58, 0xef, 0x5b, 0x22, + 0x6f, 0xd2, 0xe2, 0x07, 0x6a, 0x77, 0xcf, 0x05, + 0xb4, 0x1d, 0xe7, 0x4a, 0x30, 0x98, 0x27, 0x8c, + 0x93, 0xe6, 0xe6, 0x3c, 0x0b, 0xc4, 0x73, 0x76, + 0x25 + }; + const unsigned char pubkey2[33] = { + 0x02, 0x8a, 0xd5, 0x37, 0xed, 0x73, 0xd9, 0x40, + 0x1d, 0xa0, 0x33, 0xd2, 0xdc, 0xf0, 0xaf, 0xae, + 0x34, 0xcf, 0x5f, 0x96, 0x4c, 0x73, 0x28, 0x0f, + 0x92, 0xc0, 0xf6, 0x9d, 0xd9, 0xb2, 0x09, 0x10, + 0x62 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xeb + }; + secp256k1_ge key; + secp256k1_ge key2; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_eckey_pubkey_parse(&key2, pubkey2, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 1); + secp256k1_scalar_set_int(&ss, 2); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key2, &msg) == 0); + } + + /* Verify signature with message -1 passes. */ + { + const unsigned char pubkey[33] = { + 0x03, 0xaf, 0x97, 0xff, 0x7d, 0x3a, 0xf6, 0xa0, + 0x02, 0x94, 0xbd, 0x9f, 0x4b, 0x2e, 0xd7, 0x52, + 0x28, 0xdb, 0x49, 0x2a, 0x65, 0xcb, 0x1e, 0x27, + 0x57, 0x9c, 0xba, 0x74, 0x20, 0xd5, 0x1d, 0x20, + 0xf1 + }; + const unsigned char csr[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x45, 0x51, 0x23, 0x19, 0x50, 0xb7, 0x5f, 0xc4, + 0x40, 0x2d, 0xa1, 0x72, 0x2f, 0xc9, 0xba, 0xee + }; + secp256k1_ge key; + secp256k1_scalar msg; + secp256k1_scalar sr, ss; + secp256k1_scalar_set_int(&ss, 1); + secp256k1_scalar_set_int(&msg, 1); + secp256k1_scalar_negate(&msg, &msg); + secp256k1_scalar_set_b32(&sr, csr, NULL); + CHECK(secp256k1_eckey_pubkey_parse(&key, pubkey, 33)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_negate(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 1); + secp256k1_scalar_set_int(&ss, 3); + secp256k1_scalar_inverse_var(&ss, &ss); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sr, &ss, &key, &msg) == 0); + } + + /* Signature where s would be zero. */ + { + secp256k1_pubkey pubkey; + size_t siglen; + int32_t ecount; + unsigned char signature[72]; + static const unsigned char nonce[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + static const unsigned char nonce2[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 + }; + const unsigned char key[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + }; + unsigned char msg[32] = { + 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53, + 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7, + 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, + 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, + }; + ecount = 0; + secp256k1_context_set_illegal_callback(ctx, counting_illegal_callback_fn, &ecount); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 0); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 0); + msg[31] = 0xaa; + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce) == 1); + CHECK(ecount == 0); + CHECK(secp256k1_ecdsa_sign(ctx, NULL, msg, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, precomputed_nonce_function, nonce2) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, key) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, NULL, msg, &pubkey) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, NULL, &pubkey) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, NULL) == 0); + CHECK(ecount == 6); + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 1); + CHECK(ecount == 6); + CHECK(secp256k1_ec_pubkey_create(ctx, &pubkey, NULL) == 0); + CHECK(ecount == 7); + /* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */ + CHECK(secp256k1_ecdsa_verify(ctx, &sig, msg, &pubkey) == 0); + CHECK(ecount == 8); + siglen = 72; + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, NULL, &siglen, &sig) == 0); + CHECK(ecount == 9); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, NULL, &sig) == 0); + CHECK(ecount == 10); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, NULL) == 0); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 1); + CHECK(ecount == 11); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, NULL, signature, siglen) == 0); + CHECK(ecount == 12); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, NULL, siglen) == 0); + CHECK(ecount == 13); + CHECK(secp256k1_ecdsa_signature_parse_der(ctx, &sig, signature, siglen) == 1); + CHECK(ecount == 13); + siglen = 10; + /* Too little room for a signature does not fail via ARGCHECK. */ + CHECK(secp256k1_ecdsa_signature_serialize_der(ctx, signature, &siglen, &sig) == 0); + CHECK(ecount == 13); + ecount = 0; + CHECK(secp256k1_ecdsa_signature_normalize(ctx, NULL, NULL) == 0); + CHECK(ecount == 1); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, NULL, &sig) == 0); + CHECK(ecount == 2); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, NULL) == 0); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_serialize_compact(ctx, signature, &sig) == 1); + CHECK(ecount == 3); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, NULL, signature) == 0); + CHECK(ecount == 4); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, NULL) == 0); + CHECK(ecount == 5); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 1); + CHECK(ecount == 5); + memset(signature, 255, 64); + CHECK(secp256k1_ecdsa_signature_parse_compact(ctx, &sig, signature) == 0); + CHECK(ecount == 5); + secp256k1_context_set_illegal_callback(ctx, NULL, NULL); + } + + /* Nonce function corner cases. */ + for (t = 0; t < 2; t++) { + static const unsigned char zero[32] = {0x00}; + int i; + unsigned char key[32]; + unsigned char msg[32]; + secp256k1_ecdsa_signature sig2; + secp256k1_scalar sr[512], ss; + const unsigned char *extra; + extra = t == 0 ? NULL : zero; + memset(msg, 0, 32); + msg[31] = 1; + /* High key results in signature failure. */ + memset(key, 0xFF, 32); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); + /* Zero key results in signature failure. */ + memset(key, 0, 32); + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, NULL, extra) == 0); + CHECK(is_empty_signature(&sig)); + /* Nonce function failure results in signature failure. */ + key[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_fail, extra) == 0); + CHECK(is_empty_signature(&sig)); + /* The retry loop successfully makes its way to the first good value. */ + CHECK(secp256k1_ecdsa_sign(ctx, &sig, msg, key, nonce_function_test_retry, extra) == 1); + CHECK(!is_empty_signature(&sig)); + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, nonce_function_rfc6979, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); + /* The default nonce function is deterministic. */ + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + CHECK(memcmp(&sig, &sig2, sizeof(sig)) == 0); + /* The default nonce function changes output with different messages. */ + for(i = 0; i < 256; i++) { + int j; + msg[0] = i; + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); + } + } + msg[0] = 0; + msg[31] = 2; + /* The default nonce function changes output with different keys. */ + for(i = 256; i < 512; i++) { + int j; + key[0] = i - 256; + CHECK(secp256k1_ecdsa_sign(ctx, &sig2, msg, key, NULL, extra) == 1); + CHECK(!is_empty_signature(&sig2)); + secp256k1_ecdsa_signature_load(ctx, &sr[i], &ss, &sig2); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&sr[i], &sr[j])); + } + } + key[0] = 0; + } + + { + /* Check that optional nonce arguments do not have equivalent effect. */ + const unsigned char zeros[32] = {0}; + unsigned char nonce[32]; + unsigned char nonce2[32]; + unsigned char nonce3[32]; + unsigned char nonce4[32]; + VG_UNDEF(nonce,32); + VG_UNDEF(nonce2,32); + VG_UNDEF(nonce3,32); + VG_UNDEF(nonce4,32); + CHECK(nonce_function_rfc6979(nonce, zeros, zeros, NULL, NULL, 0) == 1); + VG_CHECK(nonce,32); + CHECK(nonce_function_rfc6979(nonce2, zeros, zeros, zeros, NULL, 0) == 1); + VG_CHECK(nonce2,32); + CHECK(nonce_function_rfc6979(nonce3, zeros, zeros, NULL, (void *)zeros, 0) == 1); + VG_CHECK(nonce3,32); + CHECK(nonce_function_rfc6979(nonce4, zeros, zeros, zeros, (void *)zeros, 0) == 1); + VG_CHECK(nonce4,32); + CHECK(memcmp(nonce, nonce2, 32) != 0); + CHECK(memcmp(nonce, nonce3, 32) != 0); + CHECK(memcmp(nonce, nonce4, 32) != 0); + CHECK(memcmp(nonce2, nonce3, 32) != 0); + CHECK(memcmp(nonce2, nonce4, 32) != 0); + CHECK(memcmp(nonce3, nonce4, 32) != 0); + } + + + /* Privkey export where pubkey is the point at infinity. */ + { + unsigned char privkey[300]; + unsigned char seckey[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, + }; + size_t outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 0)); + outlen = 300; + CHECK(!ec_privkey_export_der(ctx, privkey, &outlen, seckey, 1)); + } +} + +void run_ecdsa_edge_cases(void) { + test_ecdsa_edge_cases(); +} + +#ifdef ENABLE_OPENSSL_TESTS +EC_KEY *get_openssl_key(const unsigned char *key32) { + unsigned char privkey[300]; + size_t privkeylen; + const unsigned char* pbegin = privkey; + int compr = secp256k1_rand_bits(1); + EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); + CHECK(ec_privkey_export_der(ctx, privkey, &privkeylen, key32, compr)); + CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); + CHECK(EC_KEY_check_key(ec_key)); + return ec_key; +} + +void test_ecdsa_openssl(void) { + secp256k1_gej qj; + secp256k1_ge q; + secp256k1_scalar sigr, sigs; + secp256k1_scalar one; + secp256k1_scalar msg2; + secp256k1_scalar key, msg; + EC_KEY *ec_key; + unsigned int sigsize = 80; + size_t secp_sigsize = 80; + unsigned char message[32]; + unsigned char signature[80]; + unsigned char key32[32]; + secp256k1_rand256_test(message); + secp256k1_scalar_set_b32(&msg, message, NULL); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(key32, &key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); + secp256k1_ge_set_gej(&q, &qj); + ec_key = get_openssl_key(key32); + CHECK(ec_key != NULL); + CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); + CHECK(secp256k1_ecdsa_sig_parse(&sigr, &sigs, signature, sigsize)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg2, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sigr, &sigs, &q, &msg2)); + + random_sign(&sigr, &sigs, &key, &msg, NULL); + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sigr, &sigs)); + CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); + + EC_KEY_free(ec_key); +} + +void run_ecdsa_openssl(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_openssl(); + } +} +#endif + +#ifdef ENABLE_MODULE_ECDH +# include "modules/ecdh/tests_impl.h" +#endif + +#ifdef ENABLE_MODULE_RECOVERY +# include "modules/recovery/tests_impl.h" +#endif + +int main(int argc, char **argv) { + unsigned char seed16[16] = {0}; + unsigned char run32[32] = {0}; + /* find iteration count */ + if (argc > 1) { + count = strtol(argv[1], NULL, 0); + } + + /* find random seed */ + if (argc > 2) { + int pos = 0; + const char* ch = argv[2]; + while (pos < 16 && ch[0] != 0 && ch[1] != 0) { + unsigned short sh; + if (sscanf(ch, "%2hx", &sh)) { + seed16[pos] = sh; + } else { + break; + } + ch += 2; + pos++; + } + } else { + FILE *frand = fopen("/dev/urandom", "r"); + if ((frand == NULL) || fread(&seed16, sizeof(seed16), 1, frand) != sizeof(seed16)) { + uint64_t t = time(NULL) * (uint64_t)1337; + seed16[0] ^= t; + seed16[1] ^= t >> 8; + seed16[2] ^= t >> 16; + seed16[3] ^= t >> 24; + seed16[4] ^= t >> 32; + seed16[5] ^= t >> 40; + seed16[6] ^= t >> 48; + seed16[7] ^= t >> 56; + } + if (frand) { + fclose(frand); + } + } + secp256k1_rand_seed(seed16); + + printf("test count = %i\n", count); + printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]); + + /* initialize */ + run_context_tests(); + run_scratch_tests(); + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + if (secp256k1_rand_bits(1)) { + secp256k1_rand256(run32); + CHECK(secp256k1_context_randomize(ctx, secp256k1_rand_bits(1) ? run32 : NULL)); + } + + run_rand_bits(); + run_rand_int(); + + run_sha256_tests(); + run_hmac_sha256_tests(); + run_rfc6979_hmac_sha256_tests(); + +#ifndef USE_NUM_NONE + /* num tests */ + run_num_smalltests(); +#endif + + /* scalar tests */ + run_scalar_tests(); + + /* field tests */ + run_field_inv(); + run_field_inv_var(); + run_field_inv_all_var(); + run_field_misc(); + run_field_convert(); + run_sqr(); + run_sqrt(); + + /* group tests */ + run_ge(); + run_group_decompress(); + + /* ecmult tests */ + run_wnaf(); + run_point_times_order(); + run_ecmult_chain(); + run_ecmult_constants(); + run_ecmult_gen_blind(); + run_ecmult_const_tests(); + run_ecmult_multi_tests(); + run_ec_combine(); + + /* endomorphism tests */ +#ifdef USE_ENDOMORPHISM + run_endomorphism_tests(); +#endif + + /* EC point parser test */ + run_ec_pubkey_parse_test(); + + /* EC key edge cases */ + run_eckey_edge_case_test(); + +#ifdef ENABLE_MODULE_ECDH + /* ecdh tests */ + run_ecdh_tests(); +#endif + + /* ecdsa tests */ + run_random_pubkeys(); + run_ecdsa_der_parse(); + run_ecdsa_sign_verify(); + run_ecdsa_end_to_end(); + run_ecdsa_edge_cases(); +#ifdef ENABLE_OPENSSL_TESTS + run_ecdsa_openssl(); +#endif + +#ifdef ENABLE_MODULE_RECOVERY + /* ECDSA pubkey recovery tests */ + run_recovery_tests(); +#endif + + secp256k1_rand256(run32); + printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); + + /* shutdown */ + secp256k1_context_destroy(ctx); + + printf("no problems found\n"); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests_exhaustive.c b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests_exhaustive.c new file mode 100644 index 00000000..5d1ed9cf --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/tests_exhaustive.c @@ -0,0 +1,508 @@ +/*********************************************************************** + * Copyright (c) 2016 Andrew Poelstra * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "../../secp256k1-config.h" + +#include +#include + +#include + +#undef USE_ECMULT_STATIC_PRECOMPUTATION + +#ifndef EXHAUSTIVE_TEST_ORDER +/* see group_impl.h for allowable values */ +#define EXHAUSTIVE_TEST_ORDER 13 +#define EXHAUSTIVE_TEST_LAMBDA 9 /* cube root of 1 mod 13 */ +#endif + +#include "secp256k1.h" +#include "group.h" +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_MODULE_RECOVERY +#include "modules/recovery/main_impl.h" +#include "secp256k1_recovery.h" +#endif + +/** stolen from tests.c */ +void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&a->y, &b->y)); +} + +void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) { + secp256k1_fe z2s; + secp256k1_fe u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void random_fe(secp256k1_fe *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} +/** END stolen from tests.c */ + +int secp256k1_nonce_function_smallint(unsigned char *nonce32, const unsigned char *msg32, + const unsigned char *key32, const unsigned char *algo16, + void *data, unsigned int attempt) { + secp256k1_scalar s; + int *idata = data; + (void)msg32; + (void)key32; + (void)algo16; + /* Some nonces cannot be used because they'd cause s and/or r to be zero. + * The signing function has retry logic here that just re-calls the nonce + * function with an increased `attempt`. So if attempt > 0 this means we + * need to change the nonce to avoid an infinite loop. */ + if (attempt > 0) { + *idata = (*idata + 1) % EXHAUSTIVE_TEST_ORDER; + } + secp256k1_scalar_set_int(&s, *idata); + secp256k1_scalar_get_b32(nonce32, &s); + return 1; +} + +#ifdef USE_ENDOMORPHISM +void test_exhaustive_endomorphism(const secp256k1_ge *group, int order) { + int i; + for (i = 0; i < order; i++) { + secp256k1_ge res; + secp256k1_ge_mul_lambda(&res, &group[i]); + ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res); + } +} +#endif + +void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j; + + /* Sanity-check (and check infinity functions) */ + CHECK(secp256k1_ge_is_infinity(&group[0])); + CHECK(secp256k1_gej_is_infinity(&groupj[0])); + for (i = 1; i < order; i++) { + CHECK(!secp256k1_ge_is_infinity(&group[i])); + CHECK(!secp256k1_gej_is_infinity(&groupj[i])); + } + + /* Check all addition formulae */ + for (j = 0; j < order; j++) { + secp256k1_fe fe_inv; + secp256k1_fe_inv(&fe_inv, &groupj[j].z); + for (i = 0; i < order; i++) { + secp256k1_ge zless_gej; + secp256k1_gej tmp; + /* add_var */ + secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_ge */ + if (j > 0) { + secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + /* add_ge_var */ + secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL); + ge_equals_gej(&group[(i + j) % order], &tmp); + /* add_zinv_var */ + zless_gej.infinity = groupj[j].infinity; + zless_gej.x = groupj[j].x; + zless_gej.y = groupj[j].y; + secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv); + ge_equals_gej(&group[(i + j) % order], &tmp); + } + } + + /* Check doubling */ + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + if (i > 0) { + secp256k1_gej_double_nonzero(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + secp256k1_gej_double_var(&tmp, &groupj[i], NULL); + ge_equals_gej(&group[(2 * i) % order], &tmp); + } + + /* Check negation */ + for (i = 1; i < order; i++) { + secp256k1_ge tmp; + secp256k1_gej tmpj; + secp256k1_ge_neg(&tmp, &group[i]); + ge_equals_ge(&group[order - i], &tmp); + secp256k1_gej_neg(&tmpj, &groupj[i]); + ge_equals_gej(&group[order - i], &tmpj); + } +} + +void test_exhaustive_ecmult(const secp256k1_context *ctx, const secp256k1_ge *group, const secp256k1_gej *groupj, int order) { + int i, j, r_log; + for (r_log = 1; r_log < order; r_log++) { + for (j = 0; j < order; j++) { + for (i = 0; i < order; i++) { + secp256k1_gej tmp; + secp256k1_scalar na, ng; + secp256k1_scalar_set_int(&na, i); + secp256k1_scalar_set_int(&ng, j); + + secp256k1_ecmult(&ctx->ecmult_ctx, &tmp, &groupj[r_log], &na, &ng); + ge_equals_gej(&group[(i * r_log + j) % order], &tmp); + + if (i > 0) { + secp256k1_ecmult_const(&tmp, &group[i], &ng, 256); + ge_equals_gej(&group[(i * j) % order], &tmp); + } + } + } + } +} + +typedef struct { + secp256k1_scalar sc[2]; + secp256k1_ge pt[2]; +} ecmult_multi_data; + +static int ecmult_multi_callback(secp256k1_scalar *sc, secp256k1_ge *pt, size_t idx, void *cbdata) { + ecmult_multi_data *data = (ecmult_multi_data*) cbdata; + *sc = data->sc[idx]; + *pt = data->pt[idx]; + return 1; +} + +void test_exhaustive_ecmult_multi(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k, x, y; + secp256k1_scratch *scratch = secp256k1_scratch_create(&ctx->error_callback, 4096); + for (i = 0; i < order; i++) { + for (j = 0; j < order; j++) { + for (k = 0; k < order; k++) { + for (x = 0; x < order; x++) { + for (y = 0; y < order; y++) { + secp256k1_gej tmp; + secp256k1_scalar g_sc; + ecmult_multi_data data; + + secp256k1_scalar_set_int(&data.sc[0], i); + secp256k1_scalar_set_int(&data.sc[1], j); + secp256k1_scalar_set_int(&g_sc, k); + data.pt[0] = group[x]; + data.pt[1] = group[y]; + + secp256k1_ecmult_multi_var(&ctx->ecmult_ctx, scratch, &tmp, &g_sc, ecmult_multi_callback, &data, 2); + ge_equals_gej(&group[(i * x + j * y + k) % order], &tmp); + } + } + } + } + } + secp256k1_scratch_destroy(scratch); +} + +void r_from_k(secp256k1_scalar *r, const secp256k1_ge *group, int k) { + secp256k1_fe x; + unsigned char x_bin[32]; + k %= EXHAUSTIVE_TEST_ORDER; + x = group[k].x; + secp256k1_fe_normalize(&x); + secp256k1_fe_get_b32(x_bin, &x); + secp256k1_scalar_set_b32(r, x_bin, NULL); +} + +void test_exhaustive_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* Verify by calling verify */ + secp256k1_ecdsa_signature_save(&sig, &r_s, &s_s); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + secp256k1_scalar_get_b32(msg32, &msg_s); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} + +void test_exhaustive_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign(ctx, &sig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } + + /* We would like to verify zero-knowledge here by counting how often every + * possible (s, r) tuple appears, but because the group order is larger + * than the field order, when coercing the x-values to scalar values, some + * appear more often than others, so we are actually not zero-knowledge. + * (This effect also appears in the real code, but the difference is on the + * order of 1/2^128th the field order, so the deviation is not useful to a + * computationally bounded attacker.) + */ +} + +#ifdef ENABLE_MODULE_RECOVERY +void test_exhaustive_recovery_sign(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + int i, j, k; + + /* Loop */ + for (i = 1; i < order; i++) { /* message */ + for (j = 1; j < order; j++) { /* key */ + for (k = 1; k < order; k++) { /* nonce */ + const int starting_k = k; + secp256k1_fe r_dot_y_normalized; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_scalar sk, msg, r, s, expected_r; + unsigned char sk32[32], msg32[32]; + int expected_recid; + int recid; + secp256k1_scalar_set_int(&msg, i); + secp256k1_scalar_set_int(&sk, j); + secp256k1_scalar_get_b32(sk32, &sk); + secp256k1_scalar_get_b32(msg32, &msg); + + secp256k1_ecdsa_sign_recoverable(ctx, &rsig, msg32, sk32, secp256k1_nonce_function_smallint, &k); + + /* Check directly */ + secp256k1_ecdsa_recoverable_signature_load(ctx, &r, &s, &recid, &rsig); + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + /* In computing the recid, there is an overflow condition that is disabled in + * scalar_low_impl.h `secp256k1_scalar_set_b32` because almost every r.y value + * will exceed the group order, and our signing code always holds out for r + * values that don't overflow, so with a proper overflow check the tests would + * loop indefinitely. */ + r_dot_y_normalized = group[k].y; + secp256k1_fe_normalize(&r_dot_y_normalized); + /* Also the recovery id is flipped depending if we hit the low-s branch */ + if ((k * s) % order == (i + r * j) % order) { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 1 : 0; + } else { + expected_recid = secp256k1_fe_is_odd(&r_dot_y_normalized) ? 0 : 1; + } + CHECK(recid == expected_recid); + + /* Convert to a standard sig then check */ + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + secp256k1_ecdsa_signature_load(ctx, &r, &s, &sig); + /* Note that we compute expected_r *after* signing -- this is important + * because our nonce-computing function function might change k during + * signing. */ + r_from_k(&expected_r, group, k); + CHECK(r == expected_r); + CHECK((k * s) % order == (i + r * j) % order || + (k * (EXHAUSTIVE_TEST_ORDER - s)) % order == (i + r * j) % order); + + /* Overflow means we've tried every possible nonce */ + if (k < starting_k) { + break; + } + } + } + } +} + +void test_exhaustive_recovery_verify(const secp256k1_context *ctx, const secp256k1_ge *group, int order) { + /* This is essentially a copy of test_exhaustive_verify, with recovery added */ + int s, r, msg, key; + for (s = 1; s < order; s++) { + for (r = 1; r < order; r++) { + for (msg = 1; msg < order; msg++) { + for (key = 1; key < order; key++) { + secp256k1_ge nonconst_ge; + secp256k1_ecdsa_recoverable_signature rsig; + secp256k1_ecdsa_signature sig; + secp256k1_pubkey pk; + secp256k1_scalar sk_s, msg_s, r_s, s_s; + secp256k1_scalar s_times_k_s, msg_plus_r_times_sk_s; + int recid = 0; + int k, should_verify; + unsigned char msg32[32]; + + secp256k1_scalar_set_int(&s_s, s); + secp256k1_scalar_set_int(&r_s, r); + secp256k1_scalar_set_int(&msg_s, msg); + secp256k1_scalar_set_int(&sk_s, key); + secp256k1_scalar_get_b32(msg32, &msg_s); + + /* Verify by hand */ + /* Run through every k value that gives us this r and check that *one* works. + * Note there could be none, there could be multiple, ECDSA is weird. */ + should_verify = 0; + for (k = 0; k < order; k++) { + secp256k1_scalar check_x_s; + r_from_k(&check_x_s, group, k); + if (r_s == check_x_s) { + secp256k1_scalar_set_int(&s_times_k_s, k); + secp256k1_scalar_mul(&s_times_k_s, &s_times_k_s, &s_s); + secp256k1_scalar_mul(&msg_plus_r_times_sk_s, &r_s, &sk_s); + secp256k1_scalar_add(&msg_plus_r_times_sk_s, &msg_plus_r_times_sk_s, &msg_s); + should_verify |= secp256k1_scalar_eq(&s_times_k_s, &msg_plus_r_times_sk_s); + } + } + /* nb we have a "high s" rule */ + should_verify &= !secp256k1_scalar_is_high(&s_s); + + /* We would like to try recovering the pubkey and checking that it matches, + * but pubkey recovery is impossible in the exhaustive tests (the reason + * being that there are 12 nonzero r values, 12 nonzero points, and no + * overlap between the sets, so there are no valid signatures). */ + + /* Verify by converting to a standard signature and calling verify */ + secp256k1_ecdsa_recoverable_signature_save(&rsig, &r_s, &s_s, recid); + secp256k1_ecdsa_recoverable_signature_convert(ctx, &sig, &rsig); + memcpy(&nonconst_ge, &group[sk_s], sizeof(nonconst_ge)); + secp256k1_pubkey_save(&pk, &nonconst_ge); + CHECK(should_verify == + secp256k1_ecdsa_verify(ctx, &sig, msg32, &pk)); + } + } + } + } +} +#endif + +int main(void) { + int i; + secp256k1_gej groupj[EXHAUSTIVE_TEST_ORDER]; + secp256k1_ge group[EXHAUSTIVE_TEST_ORDER]; + + /* Build context */ + secp256k1_context *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + /* TODO set z = 1, then do num_tests runs with random z values */ + + /* Generate the entire group */ + secp256k1_gej_set_infinity(&groupj[0]); + secp256k1_ge_set_gej(&group[0], &groupj[0]); + for (i = 1; i < EXHAUSTIVE_TEST_ORDER; i++) { + /* Set a different random z-value for each Jacobian point */ + secp256k1_fe z; + random_fe(&z); + + secp256k1_gej_add_ge(&groupj[i], &groupj[i - 1], &secp256k1_ge_const_g); + secp256k1_ge_set_gej(&group[i], &groupj[i]); + secp256k1_gej_rescale(&groupj[i], &z); + + /* Verify against ecmult_gen */ + { + secp256k1_scalar scalar_i; + secp256k1_gej generatedj; + secp256k1_ge generated; + + secp256k1_scalar_set_int(&scalar_i, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &generatedj, &scalar_i); + secp256k1_ge_set_gej(&generated, &generatedj); + + CHECK(group[i].infinity == 0); + CHECK(generated.infinity == 0); + CHECK(secp256k1_fe_equal_var(&generated.x, &group[i].x)); + CHECK(secp256k1_fe_equal_var(&generated.y, &group[i].y)); + } + } + + /* Run the tests */ +#ifdef USE_ENDOMORPHISM + test_exhaustive_endomorphism(group, EXHAUSTIVE_TEST_ORDER); +#endif + test_exhaustive_addition(group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_ecmult(ctx, group, groupj, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_ecmult_multi(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); + +#ifdef ENABLE_MODULE_RECOVERY + test_exhaustive_recovery_sign(ctx, group, EXHAUSTIVE_TEST_ORDER); + test_exhaustive_recovery_verify(ctx, group, EXHAUSTIVE_TEST_ORDER); +#endif + + secp256k1_context_destroy(ctx); + return 0; +} diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/util.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/util.h new file mode 100644 index 00000000..96872f1b --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1/src/util.h @@ -0,0 +1,119 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef SECP256K1_UTIL_H +#define SECP256K1_UTIL_H + +#include "../../secp256k1-config.h" + +#include +#include +#include + +typedef struct { + void (*fn)(const char *text, void* data); + const void* data; +} secp256k1_callback; + +static SECP256K1_INLINE void secp256k1_callback_call(const secp256k1_callback * const cb, const char * const text) { + cb->fn(text, (void*)cb->data); +} + +#ifdef DETERMINISTIC +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s\n", msg); \ + abort(); \ +} while(0); +#else +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ + abort(); \ +} while(0) +#endif + +#ifdef HAVE_BUILTIN_EXPECT +#define EXPECT(x,c) __builtin_expect((x),(c)) +#else +#define EXPECT(x,c) (x) +#endif + +#ifdef DETERMINISTIC +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed"); \ + } \ +} while(0) +#else +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed: " #cond); \ + } \ +} while(0) +#endif + +/* Like assert(), but when VERIFY is defined, and side-effect safe. */ +#if defined(COVERAGE) +#define VERIFY_CHECK(check) +#define VERIFY_SETUP(stmt) +#elif defined(VERIFY) +#define VERIFY_CHECK CHECK +#define VERIFY_SETUP(stmt) do { stmt; } while(0) +#else +#define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#define VERIFY_SETUP(stmt) +#endif + +static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) { + void *ret = malloc(size); + if (ret == NULL) { + secp256k1_callback_call(cb, "Out of memory"); + } + return ret; +} + +static SECP256K1_INLINE void *checked_realloc(const secp256k1_callback* cb, void *ptr, size_t size) { + void *ret = realloc(ptr, size); + if (ret == NULL) { + secp256k1_callback_call(cb, "Out of memory"); + } + return ret; +} + +/* Macro for restrict, when available and not in a VERIFY build. */ +#if defined(SECP256K1_BUILD) && defined(VERIFY) +# define SECP256K1_RESTRICT +#else +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(3,0) +# define SECP256K1_RESTRICT __restrict__ +# elif (defined(_MSC_VER) && _MSC_VER >= 1400) +# define SECP256K1_RESTRICT __restrict +# else +# define SECP256K1_RESTRICT +# endif +# else +# define SECP256K1_RESTRICT restrict +# endif +#endif + +#if defined(_WIN32) +# define I64FORMAT "I64d" +# define I64uFORMAT "I64u" +#else +# define I64FORMAT "lld" +# define I64uFORMAT "llu" +#endif + +#if defined(HAVE___INT128) +# if defined(__GNUC__) +# define SECP256K1_GNUC_EXT __extension__ +# else +# define SECP256K1_GNUC_EXT +# endif +SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; +#endif + +#endif /* SECP256K1_UTIL_H */ diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_ec_mult_static_context.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_ec_mult_static_context.h new file mode 100644 index 00000000..aef9d59c --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_ec_mult_static_context.h @@ -0,0 +1,1160 @@ +#ifndef _SECP256K1_ECMULT_STATIC_CONTEXT_ +#define _SECP256K1_ECMULT_STATIC_CONTEXT_ +#include "secp256k1/src/group.h" +#define SC SECP256K1_GE_STORAGE_CONST +static const secp256k1_ge_storage secp256k1_ecmult_static_context[64][16] = { +{ + SC(983487347u, 1861041900u, 2599115456u, 565528146u, 1451326239u, 148794576u, 4224640328u, 3120843701u, 2076989736u, 3184115747u, 3754320824u, 2656004457u, 2876577688u, 2388659905u, 3527541004u, 1170708298u), + SC(3830281845u, 3284871255u, 1309883393u, 2806991612u, 1558611192u, 1249416977u, 1614773327u, 1353445208u, 633124399u, 4264439010u, 426432620u, 167800352u, 2355417627u, 2991792291u, 3042397084u, 505150283u), + SC(1792710820u, 2165839471u, 3876070801u, 3603801374u, 2437636273u, 1231643248u, 860890267u, 4002236272u, 3258245037u, 4085545079u, 2695347418u, 288209541u, 484302592u, 139267079u, 14621978u, 2750167787u), + SC(11094760u, 1663454715u, 3104893589u, 1290390142u, 1334245677u, 2671416785u, 3982578986u, 2050971459u, 2136209393u, 1792200847u, 367473428u, 114820199u, 1096121039u, 425028623u, 3983611854u, 923011107u), + SC(3063072592u, 3527226996u, 3276923831u, 3785926779u, 346414977u, 2234429237u, 547163845u, 1847763663u, 2978762519u, 623753375u, 2207114031u, 3006533282u, 3147176505u, 1421052999u, 4188545436u, 1210097867u), + SC(1763690305u, 2162645845u, 1202943473u, 469109438u, 1159538654u, 390308918u, 1603161004u, 2906790921u, 2394291613u, 4089459264u, 1827402608u, 2166723935u, 3207526147u, 1197293526u, 436375990u, 1773481373u), + SC(1882939156u, 2815960179u, 295089455u, 2929502411u, 2990911492u, 2056857815u, 3502518067u, 957616604u, 1591168682u, 1240626880u, 1298264859u, 1839469436u, 3185927997u, 2386526557u, 4025121105u, 260593756u), + SC(699984967u, 3527536033u, 3843799838u, 958940236u, 927446270u, 2095887205u, 733758855u, 793790581u, 2288595512u, 2237855935u, 4158071588u, 103726164u, 1804839263u, 2006149890u, 3944535719u, 3558448075u), + SC(1145702317u, 3893958345u, 851308226u, 566580932u, 1803510929u, 244954233u, 754894895u, 1321302288u, 772295727u, 4004336128u, 2009158070u, 4026087258u, 1899732245u, 1392930957u, 3019192545u, 149625039u), + SC(3772604811u, 577564124u, 4116730494u, 548732504u, 241159976u, 965811878u, 3286803623u, 3781136673u, 2690883927u, 863484863u, 463101630u, 2948469162u, 1712070245u, 3742601912u, 2535479384u, 1015456764u), + SC(2610513434u, 780361970u, 4072278968u, 3165566617u, 362677842u, 1775830058u, 4195110448u, 2813784845u, 1072168452u, 1018450691u, 1028609376u, 2101464438u, 2419500187u, 2190549840u, 1837865365u, 625038589u), + SC(1347265449u, 3654928411u, 3255194520u, 1322421425u, 3049188507u, 1827004342u, 3467202132u, 4261348427u, 3419671838u, 2239837129u, 3441474020u, 268041876u, 4157379961u, 971431753u, 2053887746u, 2038404815u), + SC(3723233964u, 515696298u, 2908946645u, 1626400003u, 2191461318u, 1201029625u, 186243574u, 1212380923u, 858781105u, 4236445790u, 1936144063u, 1009147468u, 2407567966u, 1865959325u, 1701035060u, 241151649u), + SC(3696430315u, 3089900654u, 1103438577u, 3528924465u, 1259662835u, 2438429227u, 1692672370u, 2989843137u, 1446894995u, 2239587625u, 2340544036u, 434491102u, 128239031u, 2734594294u, 2667284742u, 1865591178u), + SC(1980028431u, 1099813170u, 2013628738u, 4214038867u, 3231891435u, 3896266769u, 2756820145u, 1490749299u, 951981230u, 3655451652u, 1676645053u, 3593230746u, 3010864552u, 405419875u, 1336073872u, 1398624425u), + SC(3414779716u, 2008156201u, 4125277506u, 2287126283u, 2446053551u, 212726297u, 2794923956u, 3421277562u, 1460719994u, 552209919u, 2551004934u, 953727248u, 3096710400u, 3712627263u, 3614955842u, 557715603u) +}, +{ + SC(461660907u, 483260338u, 3090624303u, 3468817529u, 2869411999u, 3408320195u, 157674611u, 1298485121u, 103769941u, 3030878493u, 1440637991u, 4223892787u, 3840844824u, 2730509202u, 2748389383u, 214732837u), + SC(4143598594u, 459898515u, 2922648667u, 1209678535u, 1176716252u, 1612841999u, 2202917330u, 13015901u, 1575346251u, 891263272u, 3091905261u, 3543244385u, 3935435865u, 2372913859u, 1075649255u, 201888830u), + SC(3481295448u, 3640243220u, 2859715852u, 3846556079u, 1065182531u, 2330293896u, 2178091110u, 3893510868u, 4099261975u, 2577582684u, 4207143791u, 589834100u, 2090766670u, 4242818989u, 2413240316u, 1338191979u), + SC(1222367653u, 2295459885u, 1856816550u, 918616911u, 3733449540u, 288527426u, 308654335u, 175301747u, 2585816357u, 1572985110u, 3820086017u, 3400646033u, 3928615806u, 2543586180u, 1619974000u, 1257448912u), + SC(3467862907u, 681146163u, 2909728989u, 83906098u, 2626131995u, 3872919971u, 2290108548u, 1697087700u, 1793941143u, 3236443826u, 1940064764u, 1563989881u, 527371209u, 610869743u, 1604941439u, 3670721525u), + SC(2302729378u, 1391194029u, 1641771531u, 3876177737u, 1929557473u, 2752989331u, 2519109900u, 1131448856u, 3786463166u, 506905989u, 2345013855u, 2144715811u, 1583628159u, 291930150u, 3243470493u, 4130365181u), + SC(2855519179u, 3147287790u, 1536116015u, 1784764672u, 959281397u, 3099717666u, 86403980u, 3409201632u, 3921301684u, 2101228153u, 575924517u, 1382150904u, 641478876u, 3860064926u, 1937521554u, 2358132463u), + SC(972265053u, 3025511526u, 2467192450u, 4011934802u, 4015820825u, 3179306985u, 1744647725u, 423238442u, 2406064939u, 901607195u, 3316491016u, 4128592049u, 1397491632u, 439641584u, 90500461u, 2834580417u), + SC(1730532518u, 2821193463u, 2700804628u, 2416923244u, 3795632308u, 2799866320u, 3434703577u, 3883111373u, 1777933228u, 2963254493u, 3042948878u, 1746288680u, 2832145340u, 544625602u, 3633879343u, 2300858165u), + SC(62331695u, 2228442612u, 3527845246u, 2989876118u, 3995298903u, 3601545798u, 4170931516u, 445717530u, 1981201926u, 94264130u, 2668647577u, 953251412u, 3322279962u, 3837653687u, 3116466555u, 3369796531u), + SC(2739333573u, 3637259489u, 443756582u, 825678124u, 2455706402u, 2994548791u, 3653546249u, 2584145078u, 1245698352u, 89066746u, 1738138166u, 2916153640u, 1850062717u, 3472193431u, 2110631011u, 1214009088u), + SC(2386327178u, 3993497770u, 1051345891u, 4137183237u, 3078790224u, 3598213568u, 3344610192u, 1517270932u, 869515922u, 2057215060u, 2792454282u, 4228826509u, 3425305972u, 2708629086u, 880185559u, 1356729037u), + SC(2989561710u, 3550122639u, 1990591383u, 2036612756u, 3588709655u, 595888062u, 4189293408u, 1955008963u, 987876526u, 542093629u, 1953520395u, 2315684331u, 2929815182u, 3270759899u, 393611756u, 1677885197u), + SC(2331762734u, 371120497u, 1141333410u, 3466824114u, 4113916626u, 3698793791u, 2483365276u, 4265751258u, 3804325409u, 4085909553u, 3531838853u, 2629626707u, 625187055u, 3045263564u, 198131065u, 3993694760u), + SC(27419592u, 3267954699u, 2966738458u, 3143461717u, 3869766944u, 2163162934u, 1886283869u, 2052225367u, 958768216u, 2006727717u, 2069130137u, 1939449196u, 3015752138u, 258766841u, 3290132621u, 4163970366u), + SC(903383785u, 2983456345u, 4269392462u, 3731664159u, 1837248343u, 1888413004u, 652691803u, 897487558u, 3732206419u, 3625013640u, 1917594162u, 967935585u, 1804564817u, 883883125u, 2389854768u, 2347234078u) +}, +{ + SC(1793692126u, 406948681u, 23075151u, 2805328754u, 3264854407u, 427926777u, 2859563730u, 198037267u, 2129133850u, 1089701106u, 3842694445u, 2533380467u, 663211132u, 2312829798u, 807127373u, 38506815u), + SC(571890638u, 3882751380u, 1536180709u, 3437159763u, 3953528399u, 516828575u, 3769463872u, 1449076325u, 4270798907u, 3135758980u, 3520630973u, 1452980147u, 3957715387u, 3054428574u, 2391664223u, 2297670550u), + SC(2724204046u, 2456139736u, 265045669u, 1367810338u, 1722635060u, 1306450931u, 2894913322u, 3094293390u, 3490680992u, 2550020195u, 3028635086u, 4200216295u, 1066664286u, 4170330175u, 777827015u, 183484181u), + SC(947228665u, 1559209921u, 3080864826u, 3123295835u, 2934045313u, 1590990229u, 2766960143u, 3113606941u, 1136432319u, 3758046297u, 2054046144u, 1377389889u, 3244301201u, 127071274u, 1752358610u, 2783507663u), + SC(1460807831u, 3649051054u, 2799484569u, 1231562901u, 3377754600u, 3577118892u, 1234337315u, 380370215u, 3272388869u, 3656237932u, 2653126291u, 786263023u, 1028996455u, 4274234235u, 4225822550u, 10734444u), + SC(2071087047u, 1934036755u, 611830132u, 2015415885u, 1373497691u, 3709112893u, 3810392851u, 1519037663u, 779113716u, 2738053543u, 2754096050u, 2121500804u, 982626833u, 1064427872u, 1627071029u, 1799421889u), + SC(490669665u, 331510235u, 927653097u, 4010558541u, 1341899186u, 2739641489u, 1436050289u, 1379364712u, 441190387u, 3816107121u, 4151493979u, 3530159022u, 2848669857u, 2894763699u, 1938279708u, 3206735972u), + SC(1164630680u, 735028522u, 1426163473u, 1764145219u, 2188722839u, 2599797011u, 2331123230u, 996298865u, 2803113036u, 1732133918u, 4135374745u, 1403496102u, 61305906u, 1982207767u, 35608603u, 680731708u), + SC(3097030574u, 2239944926u, 3004506636u, 3698971324u, 438440050u, 806226289u, 3299217652u, 2137747676u, 2376642592u, 2372355096u, 1444993877u, 4198291752u, 3194432604u, 579432496u, 3143260503u, 58153128u), + SC(3073570790u, 2457870973u, 3254087300u, 132589961u, 3090464363u, 4031655485u, 3397735349u, 3738272915u, 2438408586u, 1610016484u, 3607490511u, 1979839295u, 1993157220u, 1628966973u, 2566520843u, 2415504793u), + SC(2516700697u, 2521039798u, 2777488721u, 3196543385u, 3593950703u, 2445108602u, 4227515375u, 3361503440u, 3741757104u, 1367007706u, 4282009789u, 2127358709u, 2970274265u, 108953332u, 1376097231u, 3612352600u), + SC(2841122028u, 289695603u, 908429972u, 1449591303u, 3496532142u, 430811028u, 1377898285u, 198605765u, 702014643u, 1582973696u, 1654127041u, 4145703462u, 294032334u, 4235431914u, 3438393459u, 865474483u), + SC(3545445168u, 3333415739u, 2928811023u, 1435493501u, 3112072977u, 3466119300u, 61597844u, 839813414u, 3787328278u, 1928915478u, 3046796186u, 549615137u, 3862451403u, 1325262296u, 3520760105u, 1333228419u), + SC(1325790793u, 3907821545u, 4134901119u, 1951705246u, 3223387882u, 561480379u, 1136389443u, 2963679361u, 3722857515u, 626885912u, 3665060294u, 2975869036u, 1378007717u, 1212143055u, 3672021732u, 2520983812u), + SC(436660944u, 1593040065u, 2835874356u, 3054866405u, 1746716106u, 2901130226u, 3275156703u, 889550475u, 1667636846u, 2171317649u, 477876339u, 169193861u, 3301423024u, 2923695575u, 1084572294u, 981889567u), + SC(3803276281u, 4055280968u, 3904809427u, 186227966u, 932166956u, 2399165660u, 3851784532u, 3001852135u, 813014380u, 4116676373u, 2706810629u, 527442580u, 120296772u, 3128162880u, 662936789u, 1729392771u) +}, +{ + SC(1686440452u, 1988561476u, 754604000u, 1313277943u, 3972816537u, 316394247u, 994407191u, 1904170630u, 2086644946u, 2443632379u, 2709748921u, 1003213045u, 3157743406u, 1758245536u, 3227689301u, 1181052876u), + SC(1258105424u, 4154135555u, 2219123623u, 3901620566u, 4152326230u, 2255006844u, 2043811343u, 3401743053u, 1077175625u, 4217078864u, 23446180u, 3296093630u, 2983403379u, 483875022u, 1821322007u, 933769937u), + SC(4094896192u, 2631249021u, 2047644402u, 1580854103u, 3103587285u, 3577080832u, 2726417365u, 309664155u, 1801899606u, 2578001137u, 150353312u, 1950478529u, 895600852u, 3405805048u, 2316670682u, 3067768105u), + SC(443311827u, 441757202u, 1505167796u, 3339695156u, 4080303377u, 2032258566u, 4249816510u, 3524388084u, 3057881006u, 1951550910u, 755229308u, 2331249069u, 1739558582u, 2222328965u, 511821487u, 2764767310u), + SC(989753134u, 2338266356u, 549068233u, 4113024610u, 2746193091u, 2634969710u, 3079940655u, 3384912157u, 143838693u, 4047635856u, 4286586687u, 149695182u, 1777393012u, 52209639u, 2932952119u, 3267437714u), + SC(682610480u, 2717190045u, 3874701500u, 2657184992u, 2055845501u, 1316949440u, 1867841182u, 3514766617u, 3083609836u, 2586162565u, 866399081u, 1085717952u, 3259379257u, 575055971u, 3866877694u, 451222497u), + SC(328731030u, 2942825188u, 1841689481u, 3492191519u, 967390237u, 99172838u, 3036642267u, 3931425637u, 933459735u, 3523655044u, 2662830483u, 2533317360u, 1151283556u, 1285468956u, 15891850u, 3194406721u), + SC(3082245252u, 2305218459u, 2853219703u, 1279555698u, 3695999195u, 2225441691u, 2702374346u, 2002979755u, 3394310641u, 1438568303u, 441738339u, 2319547123u, 745721770u, 3663132780u, 3613740038u, 3163545587u), + SC(3109530474u, 209548946u, 1705898345u, 1227555051u, 1300903197u, 521706788u, 1046889791u, 392785355u, 1195852439u, 1128202903u, 589172095u, 3844020294u, 989062243u, 3765536158u, 3601935109u, 563198009u), + SC(1408383323u, 2941773350u, 4185382573u, 3662857379u, 4172908289u, 4118722458u, 1935569844u, 1296819381u, 439467796u, 917888253u, 1573015538u, 2875181025u, 22626495u, 313409715u, 121133518u, 1579603291u), + SC(838355261u, 2323744266u, 929233883u, 1533162328u, 2939669145u, 1021427197u, 2448693967u, 1568998094u, 455286333u, 2516902543u, 1708158744u, 278073872u, 978123683u, 2512836694u, 3972232382u, 1433020779u), + SC(2010810703u, 4018381427u, 571706262u, 1692351234u, 4256546562u, 1231266051u, 268479287u, 2820752911u, 2261632188u, 845795375u, 3555293251u, 4247559674u, 3383569817u, 4149228066u, 180667610u, 1402241180u), + SC(3525485702u, 3451430050u, 2349871300u, 60510511u, 4165534527u, 3431222792u, 4244473672u, 526926602u, 763199050u, 672899723u, 1978849638u, 489006191u, 1575850086u, 1948428588u, 201110001u, 2038136322u), + SC(3829603224u, 567257667u, 2324557421u, 3080821304u, 1922441927u, 1741539649u, 2023385976u, 3349327437u, 1997432110u, 3734074051u, 1330703636u, 3180299184u, 1913578229u, 141656008u, 2692604045u, 1602929664u), + SC(29051889u, 27392875u, 2013870801u, 1608859787u, 4192290684u, 944038467u, 2706126772u, 4086572363u, 3654238115u, 631287070u, 4277765317u, 2361271762u, 4170133585u, 2022489410u, 2834765713u, 1378478404u), + SC(2835113470u, 3839837803u, 3596950757u, 2129670392u, 1881028173u, 4057879348u, 2459142230u, 3736551989u, 3032996358u, 1333513239u, 3006303259u, 3885122327u, 4228039994u, 134788219u, 3631677646u, 450886807u) +}, +{ + SC(2450731413u, 2768047193u, 2114778718u, 2363611449u, 3811833768u, 1142236074u, 836975073u, 719658637u, 89564040u, 2055034782u, 2279505737u, 2354364196u, 748992674u, 2341838369u, 3471590741u, 3103440079u), + SC(464369172u, 1784969737u, 2303680721u, 1699015058u, 1839678160u, 53342253u, 3929309179u, 3713202491u, 1764215120u, 2190365769u, 3137266333u, 3919018972u, 3446276485u, 1027535494u, 3649392538u, 1979045036u), + SC(3689697965u, 1535268856u, 4095087266u, 1879342666u, 1901613989u, 4062220771u, 1231692686u, 3479254943u, 517178359u, 3704348661u, 3200159500u, 592930780u, 3995209641u, 2367381241u, 1790597847u, 2276745810u), + SC(1563410665u, 2779883331u, 320555798u, 143478861u, 1984047202u, 2486036480u, 1819096593u, 876845470u, 4160262809u, 1685665332u, 1096211683u, 3396846267u, 1079209808u, 1622135728u, 2746449213u, 2258485533u), + SC(1981422448u, 2212169687u, 873443773u, 3576733408u, 3923794933u, 1875069523u, 3053667173u, 4292418240u, 2192702144u, 1027092432u, 278807989u, 2315740043u, 485097259u, 4099751129u, 1350843241u, 1137138810u), + SC(3929635582u, 2647315129u, 1255145681u, 2059161179u, 1939751218u, 2574940312u, 1013734441u, 3958841903u, 615021475u, 1092396560u, 1516857705u, 4167743313u, 744612233u, 1609870616u, 1905505775u, 2106400820u), + SC(1036005687u, 2272703162u, 2208830030u, 2182996589u, 441615709u, 3591433922u, 3586649797u, 164179585u, 3077875769u, 1792522157u, 2657252843u, 657567108u, 656390324u, 1816007391u, 3075467586u, 3873231707u), + SC(1236896749u, 2895887291u, 1978987518u, 822801819u, 516389325u, 1102535042u, 1787993035u, 3557481093u, 3231661433u, 991180576u, 3686912074u, 1297456949u, 3327185778u, 308709174u, 495078044u, 2969592590u), + SC(2019907021u, 744703189u, 2139199843u, 518542186u, 3124680574u, 142934434u, 551498542u, 3021773546u, 4091561632u, 1051317147u, 825719313u, 3707224763u, 335483791u, 4028731434u, 1335000639u, 4102709448u), + SC(1093818871u, 985937516u, 327542691u, 2046117782u, 1264752065u, 697293694u, 1615263505u, 1156460629u, 2812684388u, 1192736815u, 3019618111u, 4209127823u, 2556369187u, 2112950523u, 637809851u, 2176824541u), + SC(1687299893u, 3728297084u, 490922479u, 3634470646u, 250826345u, 3692215527u, 3273717576u, 965983458u, 2226919381u, 1460789800u, 2122435754u, 2519058236u, 1620196106u, 4066817802u, 1130044433u, 3889340415u), + SC(852530522u, 3312783835u, 1596416107u, 1741549460u, 2684468674u, 3424816114u, 2501858342u, 1775689041u, 2140910620u, 3593295971u, 3269455071u, 2386348485u, 3506744308u, 1454965514u, 1429132807u, 1936823584u), + SC(606602909u, 3019871883u, 3512048756u, 3287518999u, 3877975051u, 3914786486u, 3870177904u, 1340649290u, 520571284u, 3028797996u, 2616337132u, 1103844529u, 3133726039u, 1357152000u, 1508799653u, 31330228u), + SC(2817743510u, 2877820134u, 3034826170u, 1694674814u, 3472934533u, 2992700940u, 940570741u, 734740020u, 2101869811u, 3976806699u, 3986671415u, 556491401u, 2336314226u, 3375597171u, 2706276162u, 2068498899u), + SC(2875346415u, 3996130283u, 2530370154u, 2292821435u, 1717542531u, 4166402291u, 2045046397u, 210928306u, 1305773764u, 891667924u, 1720475570u, 2097400197u, 3748242244u, 1645769622u, 3986372109u, 4259524466u), + SC(258680563u, 3407077353u, 3701760456u, 1531445568u, 3746171918u, 2983392727u, 1490964851u, 3947644742u, 2779475335u, 3867487462u, 2573576052u, 3434694262u, 2755711440u, 3366989652u, 566303708u, 3091229946u) +}, +{ + SC(2925506593u, 3911544000u, 1647760999u, 3077282783u, 810174083u, 3532746750u, 1218244633u, 1800164995u, 3882366571u, 1552758454u, 417617232u, 3581187042u, 1107218813u, 308444727u, 2996521844u, 3546298006u), + SC(2766498247u, 1567718891u, 906631353u, 1539374134u, 2937267715u, 3075423755u, 466239025u, 348294756u, 2802746156u, 3822638356u, 2215866298u, 2676073175u, 2327206803u, 3701444736u, 533673746u, 1949565232u), + SC(779912645u, 2120746348u, 3775586707u, 1719694388u, 3225985094u, 1124933767u, 2466028289u, 3688916232u, 2352972448u, 3100332066u, 3699049642u, 105143046u, 3528587757u, 3202351686u, 3275195870u, 2542878955u), + SC(4208701680u, 3032319563u, 1934783333u, 1683344422u, 1898255641u, 1818484420u, 1090856325u, 4203146066u, 3166734039u, 1425051511u, 411614967u, 1272168350u, 905464202u, 2860309946u, 2899721999u, 4016531256u), + SC(1252276677u, 705548877u, 3321309972u, 2587486609u, 1841091772u, 1176108340u, 2483104333u, 1124739854u, 1417860124u, 2145011089u, 1095816787u, 561231448u, 3047186502u, 2188442748u, 782343512u, 2073487869u), + SC(773625401u, 1399854511u, 2112273744u, 3798562401u, 2328245221u, 4053035765u, 884849756u, 2543299151u, 3064173848u, 3322400978u, 2493736578u, 4109781307u, 3356431908u, 2033183790u, 3916558464u, 937192909u), + SC(1676839026u, 1837563838u, 681907940u, 1979087218u, 3861274680u, 1004821519u, 3526269549u, 3587326189u, 4130121750u, 5876755u, 277168273u, 3347389376u, 1295078502u, 3055055655u, 988901279u, 1750695367u), + SC(1466696987u, 793586382u, 3395028606u, 688541023u, 227515247u, 433349930u, 1151320534u, 2638968365u, 2730052118u, 2419949779u, 4184196159u, 3075595332u, 1762597117u, 3208522231u, 3793454426u, 2205574333u), + SC(2271935805u, 2221340650u, 4006866556u, 3892925071u, 3300102857u, 4023132062u, 1966820825u, 193229358u, 3829742367u, 3288127030u, 2999566231u, 1746318860u, 611198282u, 1740582489u, 586692015u, 272371975u), + SC(1512874083u, 1683202061u, 3100471136u, 875884760u, 2252521753u, 3056609126u, 2397470151u, 3238829627u, 398340158u, 1086173909u, 2650682699u, 3851040891u, 267796754u, 1063916466u, 134772391u, 616879617u), + SC(1190901836u, 3498895828u, 121518848u, 4122627266u, 4044339275u, 3929319666u, 3725675569u, 2249645810u, 1648430039u, 805152867u, 604009597u, 428134903u, 3660078748u, 1495738811u, 2912743026u, 3529964664u), + SC(1098872981u, 3803982233u, 1184687675u, 1724685244u, 1166128174u, 3324080552u, 2889006549u, 591614595u, 442372335u, 2188313994u, 392144341u, 559497602u, 2786744839u, 1080958720u, 963196350u, 4153188088u), + SC(2439538370u, 4080798018u, 3371249236u, 2272355420u, 3780648680u, 116755088u, 1743646150u, 3071185844u, 3348389643u, 3506488228u, 3592742183u, 3935997343u, 3470563636u, 4177761627u, 2879753187u, 203653531u), + SC(3278048310u, 2898758456u, 2355004932u, 2165371155u, 909690763u, 4208028121u, 3529336571u, 120122699u, 1468577489u, 2088039937u, 3804192119u, 4005659309u, 496708233u, 114985314u, 4186471387u, 1516837088u), + SC(1694326758u, 3482448156u, 2533790413u, 3535432659u, 1293417127u, 2007819995u, 3512854075u, 2476797465u, 936262398u, 4149678787u, 807292055u, 1683402105u, 3767740082u, 682769936u, 2956180563u, 2800734304u), + SC(804843744u, 1565609957u, 1986774659u, 4163563545u, 1192892219u, 2967653559u, 1407927717u, 134508609u, 2584983666u, 3798685912u, 1759632157u, 1938927553u, 3974685712u, 2763800386u, 3702401831u, 3969543832u) +}, +{ + SC(2016238746u, 3648008750u, 3741265531u, 1468285316u, 3314132186u, 3225615603u, 2260838904u, 650230459u, 666608997u, 1079817106u, 1685466519u, 3417306450u, 465799968u, 1454367507u, 1432699603u, 4060146438u), + SC(1761873323u, 2175765323u, 123320402u, 1086415744u, 3425420197u, 3163463272u, 2096010147u, 892174421u, 3834451486u, 191088153u, 650609666u, 1384830375u, 430440180u, 1275312435u, 936713210u, 3964237847u), + SC(3490530311u, 4154571850u, 1473147571u, 1874492814u, 3394183939u, 690761407u, 1765847887u, 4254640890u, 3957252213u, 852293459u, 403059579u, 1419995731u, 373422976u, 1691953324u, 1513498303u, 3782064719u), + SC(2587537765u, 1727580331u, 2067598687u, 2050934719u, 1018600463u, 825517190u, 281367288u, 396667874u, 2125440864u, 2142555808u, 3739024155u, 471264185u, 2298783646u, 926505635u, 485317745u, 4237064052u), + SC(4177694527u, 1331122857u, 2632274962u, 2272030823u, 2711200568u, 493910969u, 64158788u, 2976239616u, 2805230971u, 1856476899u, 706343172u, 883417303u, 3085501222u, 2167885061u, 2608970459u, 1305891290u), + SC(3887930902u, 1612140391u, 329833229u, 737708613u, 660227298u, 2588285981u, 3429746116u, 4247477263u, 2536670475u, 1091054728u, 1521783433u, 4262529359u, 3261855757u, 453613765u, 484850910u, 3619344637u), + SC(3635973664u, 4002263582u, 683484955u, 1188525929u, 3024525647u, 1588813480u, 3496033065u, 109022234u, 2342061519u, 1416918501u, 2207158673u, 948640868u, 637445219u, 508491813u, 3897434662u, 680054967u), + SC(1039851594u, 403130855u, 3868498597u, 1611578944u, 2942424644u, 2874427101u, 1261647069u, 261871566u, 2520758170u, 2840740989u, 3799279215u, 381717039u, 3582347301u, 2025353438u, 2948438214u, 2918501540u), + SC(81851588u, 3029358979u, 3777821133u, 2109529880u, 3684139703u, 3572137489u, 2624799u, 2076188243u, 53500651u, 2606703535u, 3206313372u, 346558880u, 465806762u, 434266486u, 1902707603u, 4080110534u), + SC(3612241613u, 1917140707u, 4136616607u, 4041104182u, 2193790431u, 801466537u, 3599423303u, 3561003895u, 1189069231u, 8494816u, 4244955339u, 451969883u, 3908494655u, 517115239u, 1812731691u, 777430858u), + SC(3522137911u, 2027939004u, 2210696271u, 3920541975u, 875695915u, 2825269477u, 687289812u, 4252564584u, 1824925315u, 507608234u, 2614820601u, 2462525050u, 3886866857u, 668083682u, 2768243607u, 3293579201u), + SC(1682273922u, 1330912967u, 3636074852u, 840196898u, 1025234484u, 1557176067u, 2837118766u, 3109038869u, 594323342u, 3200796742u, 1959017554u, 1440926582u, 3021668826u, 3738492638u, 446292405u, 2414347832u), + SC(4116164451u, 4091036540u, 474505628u, 1269644927u, 3643568118u, 1673027873u, 1438360759u, 4022285580u, 4024623082u, 1654730750u, 1581385912u, 3853471495u, 335076979u, 2185560806u, 2494598452u, 3520671279u), + SC(4099595861u, 2215053464u, 488918654u, 2772869965u, 2247823716u, 1588093320u, 1138185172u, 732569291u, 247618738u, 1702163570u, 1772683376u, 1056938600u, 1997535786u, 2064838561u, 3705150691u, 1453615480u), + SC(3809909081u, 1962152573u, 3909100601u, 1479514000u, 1615313752u, 3569344372u, 997113509u, 3043376485u, 3480943705u, 4021042580u, 2284195092u, 2749518560u, 3037939132u, 3554704413u, 185068622u, 683070990u), + SC(3163624176u, 326387389u, 438403431u, 1924575191u, 1706136937u, 2432230714u, 4175139676u, 713582699u, 175432919u, 505729353u, 375905517u, 3179239595u, 2233296987u, 472507277u, 1822318909u, 3059447908u) +}, +{ + SC(3955300819u, 2390314746u, 8780989u, 1526705205u, 4147934248u, 1494146575u, 1667625450u, 2277923659u, 406493586u, 957460913u, 3449491434u, 912766689u, 1387230361u, 2368913075u, 3538729245u, 2943257094u), + SC(2095358020u, 3831852940u, 1752942227u, 477088929u, 2503091779u, 898077u, 2215106688u, 1298885808u, 352224250u, 3952364758u, 3669616566u, 664714721u, 1826685582u, 1576488055u, 2121138397u, 1442223205u), + SC(1378268686u, 187975558u, 3210161726u, 870689300u, 1860632239u, 902013623u, 571573600u, 25414363u, 3412397724u, 3841538145u, 215707661u, 324367139u, 2323478150u, 3794355190u, 1128115053u, 2519022352u), + SC(566244395u, 2591175241u, 2926679038u, 2852174582u, 200192886u, 521908517u, 2098042185u, 3563798587u, 1529741033u, 1248315044u, 233787221u, 2706044694u, 2870731528u, 3970719810u, 4167465378u, 525407392u), + SC(2196340159u, 4056996284u, 1702457669u, 2086317410u, 3933566271u, 3751624213u, 4023204768u, 677196918u, 2137509058u, 4037704026u, 2299370032u, 1748548051u, 3326874481u, 1974512389u, 1751264060u, 266112293u), + SC(1812114662u, 524787647u, 285577300u, 3638318945u, 3389691808u, 585441476u, 145370930u, 1149989778u, 1314386440u, 3471672106u, 908522311u, 4171434326u, 329350743u, 2954206373u, 856961382u, 2008618089u), + SC(2318825510u, 3826102862u, 687747522u, 4263777564u, 2387018418u, 1135189382u, 1414060091u, 217356911u, 2998889592u, 698204196u, 801530770u, 3479982231u, 1117806357u, 154519605u, 960816747u, 3149429798u), + SC(3250819610u, 351683992u, 296382659u, 4149667465u, 2183346760u, 1485561783u, 2218034265u, 420633334u, 1869679065u, 1205517989u, 3666184780u, 1975151679u, 371905540u, 367504198u, 1917294142u, 2403996454u), + SC(3958230362u, 3773825115u, 783748416u, 1243337893u, 4032003144u, 3908441244u, 201600922u, 2000451013u, 728826842u, 3533421010u, 3229478766u, 278198864u, 3933272000u, 1331731276u, 3202405750u, 1474627286u), + SC(3181836998u, 2581633616u, 3993055681u, 4020956268u, 2094932060u, 3551878275u, 393027783u, 2154269634u, 2283536956u, 2260289773u, 832949759u, 2403309662u, 3488387345u, 1652392255u, 393935478u, 2309058441u), + SC(4141036972u, 1727820200u, 832481848u, 1055621047u, 1091666560u, 1393833209u, 3406509646u, 2428157250u, 2974564551u, 2286298667u, 3776410458u, 815994971u, 1241023789u, 775596275u, 1035618310u, 3934253771u), + SC(206932164u, 4239023187u, 2046365950u, 2616857124u, 4246776524u, 4059028269u, 129664965u, 907402684u, 3859465657u, 4204192080u, 91453633u, 301171900u, 385561248u, 2689085222u, 1614465584u, 3977451005u), + SC(3683171878u, 3148577689u, 4042394721u, 1085044656u, 682611813u, 2857177748u, 2417075323u, 2983755657u, 3777418770u, 2448398967u, 3909780770u, 4000218621u, 4227580585u, 2425908645u, 1704039191u, 3712924954u), + SC(290465694u, 3921687099u, 2971845338u, 1854613741u, 1583022754u, 371222458u, 1744154613u, 3918664956u, 1960343256u, 1291903121u, 4010470137u, 1525668440u, 4091170130u, 1370665614u, 3468958243u, 1262617601u), + SC(469638518u, 1129475898u, 3766065538u, 1777952666u, 2589258222u, 3182239596u, 2626554219u, 1853296675u, 2912212627u, 2518041806u, 2743002885u, 3765128027u, 851537937u, 2059010589u, 1827964742u, 3630398912u), + SC(2458599023u, 2699477701u, 2305781427u, 2536499567u, 2118412162u, 1356010449u, 1426052710u, 725853717u, 1358092245u, 4196538471u, 66159936u, 4076320019u, 3065284443u, 2664736186u, 1943959552u, 939016920u) +}, +{ + SC(3159079334u, 690659487u, 1550245019u, 1719420482u, 1795694879u, 2846363486u, 15987067u, 569538014u, 1561199762u, 967336684u, 3110376818u, 1863433225u, 3468533545u, 3644881587u, 369296717u, 3652676359u), + SC(3207794512u, 2847938045u, 2415472979u, 1444858769u, 666387488u, 1660608279u, 1038886882u, 10876848u, 2468284561u, 2494495733u, 2622688628u, 2362399325u, 2213804831u, 3448783854u, 3958704532u, 3639349832u), + SC(54374990u, 186360229u, 3420619566u, 1356363720u, 2768151763u, 3862789233u, 4270651882u, 2681019589u, 2332931746u, 928338209u, 3968478928u, 3908570621u, 923281930u, 2285715383u, 3620920276u, 130031468u), + SC(4009596626u, 493238747u, 1786722937u, 653638870u, 1636723425u, 1884625267u, 2113708566u, 1448416211u, 3613674959u, 239497564u, 404863679u, 1521570751u, 2819432609u, 623319225u, 3073321373u, 565867032u), + SC(1220575379u, 4235426741u, 1889734996u, 43054857u, 879216917u, 3299856237u, 2922851906u, 1054251029u, 693641076u, 1704223409u, 961665328u, 2828086835u, 2727513652u, 1580557310u, 4169876178u, 682569510u), + SC(1757813477u, 22814395u, 3549822650u, 2254547303u, 372100012u, 1555116803u, 2587184145u, 3995169383u, 2645743307u, 188252331u, 3723854483u, 2138484090u, 1895504984u, 3538655836u, 1183003060u, 1439034601u), + SC(2578441833u, 3136721732u, 380864696u, 817462912u, 2257087586u, 2256998015u, 93155068u, 930999672u, 2793712092u, 2223512111u, 3157527446u, 1098951014u, 3490358734u, 1362531303u, 2421324125u, 1961922428u), + SC(1049179776u, 2969815936u, 3869567708u, 2883407597u, 1876243265u, 3498929528u, 2248008570u, 1231166427u, 3544374122u, 2839689583u, 1991744998u, 2798946627u, 736844268u, 1293771673u, 153373649u, 1931110485u), + SC(3785289356u, 1913060964u, 169967200u, 3348219956u, 3732729076u, 987877186u, 3063387163u, 3310757163u, 3480818987u, 1991307039u, 2882756981u, 1215305494u, 855630497u, 1471153868u, 1338946323u, 398364632u), + SC(1356154057u, 3013675057u, 3810909135u, 1796458190u, 2691409967u, 3963509663u, 2487357466u, 2764459334u, 2828737787u, 378542508u, 427318427u, 2412936991u, 393927878u, 3384382899u, 1135834101u, 3447900619u), + SC(3813669196u, 1922867812u, 483725924u, 518662823u, 3954558327u, 1908218112u, 2258643690u, 2093138355u, 1162728847u, 205977116u, 821018600u, 1237824238u, 2980682686u, 1821003630u, 3221633606u, 2717269894u), + SC(1353035942u, 2442753208u, 348196860u, 2355246066u, 2218279077u, 2203055542u, 1964199656u, 1329637142u, 1824193111u, 3965017045u, 795175573u, 1029253807u, 3915633667u, 1084707851u, 1682462202u, 2090124205u), + SC(190807548u, 1133131805u, 249542006u, 2858611426u, 304500253u, 2183315108u, 4145782890u, 2998333644u, 962888949u, 974441750u, 1484862994u, 801464190u, 2311388331u, 114769498u, 4260362972u, 1017092877u), + SC(1311406963u, 465174990u, 1760870095u, 883652788u, 1015674641u, 840236175u, 3124632038u, 2756294642u, 178804852u, 3164952754u, 241649187u, 1040890173u, 82588907u, 1771630815u, 1058353446u, 2473824375u), + SC(943051847u, 4107933890u, 535438460u, 2683519853u, 3177219980u, 3711205196u, 3390138615u, 2920849102u, 3747455519u, 4138118615u, 400899690u, 4278329560u, 2602463649u, 808685972u, 136036034u, 1078020636u), + SC(2185570356u, 3896907774u, 3620938057u, 1790823508u, 720763411u, 2404776615u, 3257162972u, 1221107462u, 3223154083u, 2528715719u, 688766234u, 1813423773u, 2324112952u, 83241050u, 4119437520u, 552112812u) +}, +{ + SC(3370489298u, 1718569235u, 523721575u, 2176389434u, 218587365u, 2490878487u, 2288222859u, 812943600u, 2821517993u, 3626217235u, 1545838667u, 3155352961u, 741681736u, 669093936u, 2382929309u, 2620482966u), + SC(40739723u, 469402467u, 1810137291u, 109375068u, 1888845715u, 2140810583u, 1053250454u, 3220064762u, 2539857789u, 4089587896u, 1364971662u, 2996699084u, 3939034030u, 2020251221u, 1606532641u, 3453095239u), + SC(1376139558u, 886121026u, 3003069127u, 3500718919u, 4223467610u, 3212808910u, 126355621u, 2065481301u, 218954382u, 1236555811u, 2283280895u, 4256918831u, 1550185311u, 896721211u, 4286247506u, 2515527710u), + SC(2942433244u, 2364220023u, 3675668782u, 3695614763u, 4041312428u, 2311531471u, 543507321u, 1902188023u, 1380686629u, 2455468346u, 2346421766u, 2211296276u, 3675221499u, 3890242164u, 3592353914u, 323566438u), + SC(971323999u, 4115912859u, 3703400072u, 2662062035u, 2355087034u, 610373016u, 2293984834u, 2456129286u, 2927901115u, 1832014620u, 1168920846u, 552716242u, 3101454502u, 1707155244u, 3450287619u, 2546358284u), + SC(3062358608u, 1394539264u, 4158727824u, 1704721957u, 1117692646u, 4057908715u, 1958466020u, 2309578289u, 271836599u, 2617957229u, 202314495u, 2948978715u, 1423414031u, 4128837100u, 1937488702u, 3301405882u), + SC(1276638700u, 885904232u, 3686149920u, 3283641475u, 619290126u, 2510808612u, 1691008630u, 573145513u, 506979295u, 3062936948u, 2703005699u, 4056634904u, 3460956977u, 3783023797u, 1215556973u, 3726733337u), + SC(3145485089u, 2008513183u, 2407056102u, 633050174u, 2634406893u, 2883313710u, 1233018283u, 3273507959u, 174012667u, 2126243450u, 2258342097u, 2857351925u, 3446764464u, 1187986524u, 3004835628u, 3228122242u), + SC(991481464u, 1720231754u, 1918287975u, 2752686681u, 1174123782u, 4227334584u, 1634945718u, 1074218184u, 3572504705u, 1199611126u, 1378243227u, 2901862427u, 2145083550u, 1055786253u, 3960418624u, 587771424u), + SC(3060872990u, 789280525u, 184089463u, 1784976524u, 344050594u, 2949751745u, 3173202246u, 3813443247u, 1247337895u, 4000924548u, 76989753u, 2093985529u, 265772293u, 3310477933u, 717631968u, 1024610284u), + SC(3399834097u, 2964304651u, 3593395714u, 2850196125u, 2344305533u, 3920139836u, 937580696u, 1116439644u, 4147778799u, 544787491u, 2461636418u, 2647550544u, 1451408824u, 3266700679u, 829974548u, 2625074193u), + SC(645329496u, 2808202504u, 1366740717u, 2841442794u, 1298546911u, 2730798019u, 3834987045u, 3258634143u, 4257492959u, 2976079952u, 1735944512u, 988426767u, 2395072762u, 3103996991u, 730963792u, 4206896923u), + SC(3457675112u, 4140282966u, 1286302693u, 575230857u, 2270112110u, 3056424235u, 1835144711u, 421529065u, 2499621064u, 1907217915u, 1365357672u, 2875249236u, 1193490885u, 644367230u, 2115448516u, 2507997379u), + SC(70240820u, 3745431832u, 1098747160u, 82118642u, 2446590634u, 851446619u, 2715739022u, 2142293045u, 2689000746u, 4219383621u, 3140617705u, 1457579904u, 2541485894u, 3932513084u, 3406615220u, 2746135210u), + SC(2576508439u, 3244150028u, 2516535555u, 3986514000u, 2903382402u, 2225326585u, 1780804949u, 1164188435u, 1682143109u, 2949153515u, 1249412173u, 349674695u, 3467452794u, 1021028584u, 1194554595u, 1296132950u), + SC(1028084134u, 2577983628u, 184499631u, 1037888434u, 1676727662u, 1831883333u, 1276555462u, 4161670547u, 372201005u, 844715673u, 24290758u, 1268964661u, 297554992u, 4061435345u, 719976096u, 1670144314u) +}, +{ + SC(1239892635u, 3772349433u, 1058531752u, 1409211242u, 2847698653u, 2391143499u, 2637108329u, 3000217976u, 4288568828u, 658925470u, 2552628125u, 1468771377u, 3230644908u, 2692030796u, 7587087u, 1951830015u), + SC(488413080u, 1055864530u, 1967623060u, 3973308786u, 2745059783u, 477755698u, 544732176u, 3786002606u, 1569550024u, 2935491988u, 1047898991u, 1749060996u, 1828274710u, 2943223535u, 3716062834u, 1253889972u), + SC(1626917485u, 492893476u, 2371366539u, 3928996000u, 3710769983u, 1237244931u, 1562679102u, 2930576193u, 2085522193u, 2968039733u, 3202113740u, 4250144171u, 3666251088u, 2016963274u, 293320478u, 3775462481u), + SC(3337977767u, 1831658883u, 1096680294u, 2436280860u, 119870062u, 1444445305u, 1467566544u, 2038307180u, 661842797u, 2493843529u, 3851219498u, 3941720925u, 1848373617u, 4051739727u, 1120765529u, 1101800264u), + SC(929493756u, 2211014659u, 3851484027u, 3468182176u, 147674626u, 3850162187u, 1517171722u, 907705770u, 3997080856u, 3666272567u, 659948161u, 2282159142u, 429200635u, 2563204390u, 1422415938u, 1688129608u), + SC(551422730u, 1797390513u, 2828310972u, 97463725u, 131839682u, 3917501017u, 566617767u, 700714239u, 3061891811u, 856175415u, 1072683059u, 1754819408u, 3533865753u, 2568134802u, 4226648923u, 32646755u), + SC(3538971706u, 2916601269u, 2891999350u, 3825811373u, 2355258376u, 2876141009u, 3940019347u, 1309282440u, 2567828520u, 1367177503u, 2910098023u, 1986452448u, 1802584940u, 1360144734u, 2877029236u, 3033303547u), + SC(3313753312u, 261894832u, 3637017242u, 3699232915u, 3508549542u, 3960876382u, 582644479u, 3199091169u, 3644395252u, 2675904765u, 2072396219u, 4071523208u, 3976776729u, 1025403411u, 2178466200u, 1107450603u), + SC(2163612584u, 2845646977u, 4033161886u, 2723908899u, 1902990762u, 3375716497u, 2588626243u, 513179480u, 3101622846u, 1458272618u, 3875706546u, 3028150894u, 3612001457u, 2583302957u, 3385091312u, 3719047138u), + SC(1256280924u, 3685139058u, 1853414115u, 3160743702u, 3455476559u, 2505590918u, 2308735646u, 3742507036u, 4016470170u, 330769483u, 3470077232u, 3383715347u, 1440115354u, 2667395648u, 1883060415u, 3332144245u), + SC(558087170u, 3027059128u, 1986900497u, 1642930671u, 5966195u, 3083778816u, 3199769457u, 1248728791u, 2110460619u, 327014118u, 2524517189u, 1776442925u, 1472982408u, 3459887088u, 1029172283u, 2232815594u), + SC(1544258748u, 3397993939u, 2721410152u, 2948125157u, 3562231734u, 3011402493u, 3266317933u, 527195819u, 369665170u, 3216603774u, 1952585925u, 258420856u, 3339671680u, 3733846143u, 2326118329u, 2310291176u), + SC(4140585488u, 4198875250u, 3415599245u, 3398679011u, 4155727512u, 331520374u, 785987151u, 146809315u, 2929041163u, 1558279570u, 1346822944u, 4167931729u, 2800498595u, 2809390575u, 3295157947u, 4121566122u), + SC(3571413466u, 1596401972u, 140853088u, 3137527478u, 204556611u, 4111255020u, 3835120334u, 3048525996u, 399176328u, 3005771198u, 780994070u, 3747160103u, 3136546207u, 508755537u, 2521091931u, 1715747893u), + SC(1156063870u, 393984449u, 1521183961u, 3649564442u, 183535572u, 3139859119u, 445469714u, 2815871833u, 1268459010u, 355340626u, 2465929503u, 750513297u, 1590602217u, 3983872541u, 97286792u, 110438349u), + SC(2549125874u, 1976691716u, 2532749644u, 279085303u, 633988261u, 3513450026u, 1057503157u, 1110164955u, 317735960u, 3241215082u, 3855084900u, 4137511567u, 3550729054u, 819799870u, 1929320159u, 2825290282u) +}, +{ + SC(2585638847u, 1394876113u, 3750575776u, 4144761638u, 1991524028u, 3165938218u, 158354186u, 812072970u, 3814951634u, 2507408645u, 1163603486u, 3566585210u, 1424854671u, 3326584505u, 3332079056u, 1901915986u), + SC(1520752595u, 1952396314u, 3263601295u, 3458083478u, 3797830135u, 509407552u, 3232598095u, 1205382790u, 2667815610u, 2560349365u, 2472625295u, 2883979179u, 554514567u, 2376619906u, 638138357u, 2568018129u), + SC(2442202610u, 2091297602u, 25025777u, 3622813695u, 3869161931u, 614884494u, 984078136u, 3345125623u, 3918959025u, 227030161u, 3885929851u, 1281751413u, 1612359075u, 2958486463u, 2884267132u, 3619290927u), + SC(3048700207u, 2570072469u, 1076153001u, 3767270422u, 1408579070u, 2076435276u, 2224129615u, 1962182553u, 1823335118u, 1499162388u, 1563913085u, 2068011578u, 1991334162u, 1665201834u, 1756239294u, 648108494u), + SC(2337582449u, 1819429591u, 3833487099u, 3870804287u, 2300831739u, 2232929806u, 1869816966u, 4084965807u, 4220168543u, 1248736546u, 924637940u, 73528534u, 2319796252u, 3657850751u, 2794932350u, 4220430348u), + SC(3028904021u, 2992718647u, 2354594543u, 3084902105u, 3127673085u, 783373559u, 3896264500u, 3984439851u, 820119108u, 4253719169u, 2623678017u, 3039126654u, 2922756242u, 2436956481u, 442364253u, 918876081u), + SC(1539558451u, 2306960255u, 1095386938u, 770368485u, 2906552323u, 3075682102u, 3534951832u, 2083903147u, 1308495764u, 2261904633u, 2112467113u, 1044610889u, 3222649255u, 1736090274u, 1954974285u, 1361850096u), + SC(587984395u, 1588261189u, 4052666242u, 512106258u, 651085942u, 2768947530u, 1250487652u, 1245674804u, 857176247u, 3594046498u, 647658046u, 2882585491u, 259918032u, 3698728358u, 632752990u, 351374374u), + SC(2404749839u, 3296323382u, 805352255u, 3954906457u, 3558496371u, 2470613864u, 2024150378u, 3564550335u, 2499521206u, 2051669779u, 607498894u, 3748811695u, 1128400961u, 3072401950u, 3042994760u, 811721793u), + SC(3595493043u, 1889077187u, 1981480426u, 4189336058u, 2081249554u, 2321560592u, 971543366u, 358725627u, 3595364674u, 3986924883u, 2193763710u, 4189195361u, 3121216309u, 1140981210u, 3226790033u, 353586077u), + SC(2871195936u, 2843651834u, 635723881u, 287569049u, 2067429609u, 2943584978u, 644639896u, 1264563774u, 670309272u, 2690274713u, 246950668u, 933865226u, 4053660195u, 1381269871u, 462688690u, 5420925u), + SC(977313734u, 4104230969u, 3334283655u, 1580178205u, 1578158646u, 1460773045u, 1728595474u, 3957344726u, 553676110u, 966612385u, 1786516334u, 2979157051u, 921122693u, 911238485u, 3922067113u, 1046213221u), + SC(91424183u, 123813459u, 1667146297u, 3387121372u, 438965888u, 4260725592u, 154972710u, 3237027664u, 3006360433u, 2505005588u, 2902337724u, 2660287100u, 1901200613u, 2646189902u, 2780155597u, 49560303u), + SC(3586622617u, 925349590u, 415005474u, 1260234539u, 30249250u, 2179523979u, 3475887768u, 3019952034u, 3517624902u, 4230850494u, 3734868171u, 742624613u, 822822789u, 3974379285u, 3711572581u, 3366701706u), + SC(329275906u, 1905371123u, 4004795330u, 2339811253u, 353091905u, 548998992u, 3687895576u, 356859438u, 2494263562u, 926298666u, 3983230019u, 2882391620u, 2824170047u, 2247742371u, 1881005652u, 1386887463u), + SC(1046492158u, 2680429213u, 1614272999u, 4010933686u, 2479992689u, 595409283u, 765550354u, 2852655093u, 1983575334u, 3910696497u, 2308266592u, 3012641543u, 2582478313u, 14949228u, 60656360u, 1955264759u) +}, +{ + SC(1355623958u, 2575138117u, 2562403739u, 1638722303u, 1523970956u, 2189861089u, 3498071469u, 1919711232u, 231840827u, 3230371223u, 143629793u, 1497495034u, 1677900731u, 1608282251u, 3485501508u, 3944969019u), + SC(1317209868u, 3823870608u, 3335344652u, 3702793515u, 2425890570u, 1442662397u, 4007605978u, 2976935239u, 1444558882u, 3449074340u, 523287240u, 1767769527u, 1776192231u, 1111610095u, 4035220013u, 3434023407u), + SC(1286632782u, 1751340143u, 184421370u, 3989392405u, 1838859918u, 3681550977u, 707040060u, 2695037953u, 1828105102u, 812532736u, 1115387936u, 1381188966u, 1389542552u, 621856846u, 1135930465u, 831833090u), + SC(2741542793u, 3565635943u, 455105161u, 2389444906u, 2966273581u, 4048751601u, 2569017914u, 1796095397u, 1515760827u, 3870103158u, 2737365395u, 818096507u, 2179280538u, 1254083919u, 2114706477u, 1413209953u), + SC(2036431795u, 3313380793u, 2996275588u, 625273343u, 1627738147u, 2163909313u, 2645773664u, 3066825866u, 3862562238u, 3189614065u, 3074707667u, 1611214266u, 689055345u, 1845962762u, 3616153367u, 98214289u), + SC(1783057147u, 1095836105u, 952581152u, 665189523u, 4159236737u, 3621720388u, 2768968806u, 1541462219u, 1550070665u, 2946487171u, 3084327270u, 3528580128u, 3683323170u, 2326350340u, 681502936u, 611874814u), + SC(2075965546u, 3954443814u, 3457426695u, 3100575745u, 795895906u, 2051458923u, 4220432661u, 3191956430u, 2978441632u, 1935083482u, 1260223004u, 1989210512u, 708452144u, 1742032782u, 412060225u, 942058976u), + SC(1554952802u, 1148928548u, 435577880u, 1218016814u, 774531999u, 4171943086u, 2728379380u, 1755428421u, 3096769247u, 551470356u, 663936617u, 2259245103u, 3605128160u, 4254582248u, 2543346251u, 2641240630u), + SC(2834055303u, 3779347324u, 986655417u, 1060344853u, 1961336735u, 3444096071u, 3402507696u, 1296975131u, 4013745799u, 318316127u, 3012349080u, 1543913977u, 3581569730u, 3073345556u, 1048961320u, 3338742347u), + SC(1917475623u, 1573453706u, 3775608035u, 1560651154u, 3305702627u, 840251936u, 2021694407u, 1567223161u, 1217097878u, 4101089784u, 1480235880u, 823763473u, 1860062290u, 3212933927u, 305432786u, 2664137512u), + SC(488290329u, 2159084342u, 1977681447u, 3072933047u, 2133970307u, 2904163387u, 2929381044u, 2852811875u, 3486789427u, 3312981159u, 2897952520u, 3716688458u, 3312599340u, 2231560239u, 2736260178u, 2100166993u), + SC(2561748569u, 2171003952u, 3930314290u, 4171544961u, 4084487200u, 1829909478u, 4190664042u, 1205662930u, 1332053018u, 3102835265u, 2758716514u, 3094681405u, 890009818u, 1835725787u, 3657145276u, 2012429206u), + SC(1490727773u, 2663703693u, 1786667419u, 3911642156u, 1173781475u, 1032437218u, 949369190u, 3379245680u, 3855657643u, 102309733u, 3862169655u, 1953708469u, 2899532678u, 2185103023u, 2246792392u, 2140300644u), + SC(1105179994u, 3403119551u, 2151897995u, 2133026531u, 4095632628u, 1958582421u, 3756551819u, 1353448323u, 343568827u, 940163873u, 3647008605u, 2675342302u, 2020863909u, 3314608025u, 3678853306u, 2350764749u), + SC(3610890660u, 7527132u, 3948519712u, 999155044u, 1566318108u, 1592356541u, 1395933920u, 3725362820u, 1628394109u, 2361449910u, 3407340106u, 1370203307u, 1521539242u, 166450716u, 1562824595u, 815891091u), + SC(4169640806u, 3985781662u, 2412370154u, 452406588u, 105016225u, 176939651u, 3796204183u, 875428687u, 2497589429u, 82221910u, 4277856341u, 1375558239u, 286683641u, 3316069361u, 519521869u, 2295715438u) +}, +{ + SC(1272080061u, 1249052793u, 3406223580u, 3180222548u, 3305857569u, 3627944464u, 989639337u, 2790050407u, 2758101533u, 2203734512u, 1518825984u, 392742217u, 2425492197u, 2028188113u, 3750975833u, 2472872035u), + SC(23055961u, 3145183377u, 2430976923u, 2926141735u, 1297155725u, 3931229778u, 1820665319u, 2985180446u, 3042883880u, 2460902302u, 3663963302u, 4048537328u, 3995357361u, 2497655514u, 2584741032u, 1771542440u), + SC(3555045486u, 1984442910u, 1340694232u, 3778110580u, 1134128670u, 754930307u, 645413801u, 419876731u, 718672506u, 2655370853u, 650960778u, 1175245889u, 3468383881u, 2671574337u, 44753822u, 3359158981u), + SC(289419990u, 2387037467u, 2851881154u, 4063189789u, 1829943773u, 2629576813u, 942097665u, 562844855u, 2647906183u, 117874787u, 202211775u, 3519990636u, 3082138694u, 1836881245u, 583992800u, 2183831281u), + SC(2721107251u, 1807232970u, 3202569269u, 3708638735u, 3532027994u, 4114767065u, 2764680156u, 135914892u, 1473879964u, 2935607101u, 4201045944u, 3202280567u, 3793176244u, 41830505u, 969791663u, 1519485648u), + SC(1497249350u, 1416277963u, 4236912956u, 1827689230u, 1595876921u, 792380080u, 2973128767u, 43523726u, 365213078u, 1703541227u, 1608568996u, 2447861933u, 4236202627u, 2270952660u, 996772411u, 1327926083u), + SC(930257564u, 986864131u, 3788206015u, 4282936823u, 3575152799u, 1711906087u, 3523467955u, 1026809541u, 3754676659u, 126901401u, 34761162u, 674497989u, 546239979u, 3916171265u, 4169565745u, 1773808675u), + SC(1188611875u, 4038625723u, 846346399u, 3124471166u, 3540873247u, 133640400u, 3354116939u, 2182269853u, 3158440321u, 538434017u, 508437111u, 2461460484u, 1662547818u, 3578959375u, 209001526u, 3335522863u), + SC(4264155336u, 4248354463u, 3273048757u, 2876562537u, 4290560912u, 509206354u, 1722430555u, 1796475043u, 864985283u, 4161684480u, 1401260098u, 2472895218u, 2342429930u, 827590760u, 300446032u, 2313806596u), + SC(2581459341u, 3429172659u, 2024065972u, 4099664542u, 1148350145u, 3444652410u, 3577141975u, 2981349935u, 4203645620u, 3053918552u, 3258443245u, 1577847138u, 1635931506u, 873577721u, 2391948063u, 3880308298u), + SC(348781524u, 168814463u, 525438717u, 333282992u, 3413546488u, 563982782u, 3571937262u, 2168075485u, 2567967190u, 4135534212u, 2773230423u, 2560090101u, 4070935767u, 1086323696u, 2826348049u, 1398744384u), + SC(1019826995u, 663251023u, 3152709102u, 4103744231u, 1372971676u, 1214523997u, 1159949230u, 2703418845u, 786011241u, 2156179212u, 1156040729u, 3454726929u, 1928366760u, 4000343119u, 4288863167u, 3214674902u), + SC(2681260382u, 4128008241u, 2510236484u, 1511367526u, 1684226652u, 979685907u, 2954161581u, 3173181201u, 2348267479u, 1347783270u, 1149362033u, 739573388u, 2484197607u, 335176176u, 4239049161u, 739872951u), + SC(2990421330u, 2634202447u, 3179573376u, 2783566953u, 2521510477u, 3781882024u, 2239710944u, 2912891640u, 4089020966u, 4152247187u, 3694477470u, 1764138981u, 2507816564u, 3857045441u, 3960587447u, 1062920229u), + SC(2607237939u, 3082469982u, 2290705462u, 3066564076u, 3196897175u, 4248068159u, 2751492888u, 1096521131u, 1350638971u, 3209282660u, 3725272910u, 717966828u, 1468400702u, 1807609199u, 332456241u, 3283231722u), + SC(752680913u, 2889161941u, 555836002u, 2587892579u, 793746532u, 2681266768u, 719050347u, 3803221u, 1422540107u, 1615046554u, 1724888503u, 923959013u, 3231965435u, 2753642578u, 1839210672u, 3344430910u) +}, +{ + SC(35118683u, 172484830u, 3416100291u, 3700412376u, 540823883u, 3117923166u, 4211300427u, 2853939967u, 3346783680u, 988896867u, 2435731911u, 431849862u, 1744411117u, 2614624696u, 297543835u, 4045956333u), + SC(2040009399u, 3617093372u, 1922089948u, 419196583u, 488784755u, 779735420u, 2537006207u, 704283906u, 1092151363u, 2578829348u, 2820670194u, 2121866485u, 3135057501u, 2561548080u, 1838738028u, 3520705790u), + SC(2347233873u, 2021920507u, 3747005552u, 3302704092u, 1421533666u, 2091592699u, 3349570591u, 3813605549u, 115030445u, 3350012162u, 2428670067u, 3833734570u, 1834087037u, 3648785167u, 3795974654u, 230561124u), + SC(3166315679u, 1499753232u, 1332394568u, 512254231u, 3188709397u, 2787249743u, 4120940214u, 2887173650u, 3906489413u, 2295240998u, 2578634494u, 1588397589u, 1261609842u, 547227344u, 3285763119u, 2699176838u), + SC(2920964533u, 3740093834u, 2438698186u, 1924062654u, 745692322u, 2251363856u, 1198363872u, 1945834517u, 3791006786u, 4021475876u, 1202959856u, 137650558u, 3764418806u, 2028729507u, 3549185474u, 4085572018u), + SC(2715838951u, 1959655040u, 1103474341u, 961883214u, 3220165814u, 946461598u, 3310562057u, 3895921046u, 3423737504u, 3466676673u, 4053794032u, 4003999722u, 704282430u, 186242539u, 1929875533u, 2743489242u), + SC(3863164996u, 1689760206u, 3183192577u, 2929742795u, 2741898431u, 3788088914u, 2356234821u, 7039846u, 36640443u, 397902308u, 1207730645u, 450227359u, 3243815017u, 2084858847u, 1390053102u, 1800322698u), + SC(2899288970u, 284742850u, 4164169257u, 657423444u, 1943078242u, 2187671316u, 2338824812u, 1463135135u, 2886625321u, 272841068u, 3193451269u, 275059886u, 893727404u, 1588413844u, 3713690958u, 858582046u), + SC(220208151u, 2716463025u, 2076296789u, 1220608226u, 1158026410u, 3025895717u, 2670689841u, 80726308u, 1182245224u, 514737744u, 1549626516u, 2794996864u, 1140029757u, 2873715616u, 2877687374u, 2336796195u), + SC(1712499527u, 3009254442u, 159655935u, 3126441867u, 4265886590u, 3094626983u, 2035167860u, 2311303989u, 3444838362u, 2596170866u, 3801673179u, 1837914686u, 3231006463u, 1247923284u, 584065013u, 4147287941u), + SC(900839097u, 216650153u, 2150488455u, 1952211291u, 2276027011u, 3518121564u, 3433005808u, 477320989u, 4007917006u, 2860081630u, 3686269191u, 921073036u, 3922496269u, 1487331039u, 3974930220u, 2054391386u), + SC(3348685354u, 1508268709u, 1715972206u, 4188610176u, 2563479521u, 2178972493u, 3288192040u, 3754144178u, 1173914019u, 454089507u, 3398639886u, 574196980u, 135948897u, 105476021u, 2877469782u, 2140775314u), + SC(60661201u, 2505799644u, 1330476086u, 2641855913u, 3370908611u, 3545887069u, 2369313011u, 278373074u, 1677987717u, 2174519857u, 2497481396u, 1568231376u, 3671812134u, 1893623337u, 1526376990u, 3328774765u), + SC(2836826686u, 3566150450u, 1220364883u, 3711427451u, 3528155780u, 2723292785u, 3326692341u, 2222164977u, 1858144237u, 1869912598u, 665154087u, 1299959695u, 2415334423u, 2100885199u, 1677986979u, 848478053u), + SC(2293836559u, 1740853836u, 1031472293u, 3209927466u, 2722427870u, 1686533972u, 3134525842u, 43165427u, 4133377528u, 4179858803u, 3614537390u, 3380004165u, 2699323023u, 2351902646u, 3408173486u, 2494501357u), + SC(1820258417u, 3371479244u, 1743152481u, 953496909u, 4267482844u, 97428203u, 2755286865u, 830318058u, 1082737155u, 2096588114u, 869939293u, 1138867599u, 3414628151u, 3300388932u, 2755674787u, 886356844u) +}, +{ + SC(1981590337u, 957784565u, 3778147127u, 3909235993u, 1637480329u, 2280601867u, 1059949562u, 2968107974u, 4043469535u, 4159249472u, 895867525u, 402468881u, 3186079639u, 86430659u, 4027560590u, 4067278225u), + SC(174847206u, 2629171882u, 2333280466u, 3666750170u, 1365991192u, 1932613341u, 769674425u, 2870677148u, 3091982589u, 717533940u, 691292429u, 746447527u, 2346750954u, 2424023836u, 2489851473u, 1000862947u), + SC(1294470925u, 420276534u, 18534679u, 2910625938u, 3592407247u, 3676292946u, 91786365u, 2630448437u, 4060747756u, 3372072880u, 766751258u, 2899531047u, 631745164u, 3523898915u, 3168717447u, 2801541394u), + SC(4228902076u, 3340600279u, 3364406353u, 4167190351u, 39030410u, 2148305555u, 4106423272u, 4019775241u, 1048613489u, 896239533u, 2278643848u, 649090509u, 1858593869u, 1017004108u, 2725922618u, 2362479567u), + SC(3279186701u, 4095625861u, 3191586341u, 3252046177u, 4161721618u, 2329134038u, 751155705u, 2989611709u, 942304573u, 3648059604u, 2883823407u, 1492175829u, 54393633u, 3106238944u, 429976962u, 1435978615u), + SC(3849622377u, 2984399872u, 690474125u, 61954906u, 3671421106u, 3429544548u, 2830056933u, 4242121816u, 952897126u, 3854066003u, 462125754u, 3261473627u, 4248077119u, 2601130223u, 2596495819u, 1081964366u), + SC(3544595842u, 126020837u, 2577264196u, 3433073867u, 496013073u, 2132398305u, 2482253446u, 1347711182u, 3954364337u, 261394336u, 1107608476u, 3443266300u, 104305688u, 870955527u, 3446753045u, 646876293u), + SC(164137956u, 1354687087u, 347069906u, 2162313159u, 2097666782u, 2177194309u, 1083298213u, 1791764705u, 445921337u, 2034078155u, 2254058003u, 1297019339u, 2457505957u, 3923390662u, 3364713163u, 2092921u), + SC(2010686846u, 2180989257u, 2265174665u, 208481647u, 547071646u, 2570387552u, 227431381u, 3946252713u, 1802054573u, 2876468168u, 3435214380u, 619729504u, 96719536u, 601795828u, 1679578869u, 3266813859u), + SC(1689091897u, 2850488954u, 85895902u, 2363909390u, 557966933u, 189022184u, 4135255025u, 2090271113u, 2804992462u, 2897353835u, 3129164865u, 2671868525u, 1204434986u, 2421048110u, 1069687644u, 573230363u), + SC(1864118934u, 1742326766u, 130305247u, 3848358018u, 448383585u, 389136808u, 676464280u, 133776905u, 3973153497u, 15653017u, 4189644276u, 1910866015u, 4017185152u, 3100723612u, 137322886u, 3499754296u), + SC(2165760230u, 1978556390u, 4038887110u, 3280144759u, 2755863878u, 1292009146u, 4196675347u, 2883653205u, 2360229279u, 2940095236u, 4183119698u, 122598923u, 483221264u, 2336117478u, 1200036442u, 1470973u), + SC(22625049u, 2110942382u, 3865539390u, 3568657648u, 4280364838u, 467068956u, 1638706151u, 934686603u, 1016938107u, 1378881668u, 2052861738u, 969631954u, 3114829317u, 2704079673u, 4202235721u, 1896331078u), + SC(1272877817u, 322275610u, 2048255u, 3828419764u, 283292018u, 656555904u, 1730883898u, 407673382u, 3259565233u, 3319282763u, 829721223u, 1466466546u, 121051626u, 1142159685u, 3894622225u, 1384264827u), + SC(3763136398u, 3055118026u, 3433748869u, 930030556u, 2135841826u, 2075894041u, 2845381068u, 3086878324u, 257833966u, 160279206u, 524657374u, 1855318297u, 1760771791u, 1248968332u, 2414205221u, 2464430473u), + SC(3809273981u, 900900763u, 2895572448u, 3283497701u, 1349213062u, 580961411u, 3299214221u, 3628519825u, 3643683404u, 3319374656u, 3868217535u, 427844533u, 3841842588u, 2749654710u, 2681210929u, 1051800659u) +}, +{ + SC(1622151271u, 634353693u, 3884689189u, 1079019159u, 1060108012u, 22091029u, 115446660u, 534633082u, 1649201031u, 4042006969u, 137296836u, 1833810040u, 1562442638u, 3756418044u, 1181092791u, 160208619u), + SC(1041667920u, 3037209402u, 1477404634u, 1440610569u, 2797465015u, 2054982250u, 3391499235u, 3605494419u, 3639198696u, 1933432209u, 1915711520u, 2741088986u, 3869566747u, 1879175626u, 717801628u, 458685614u), + SC(2768417957u, 2138940313u, 1896672548u, 1414723957u, 827016389u, 745281061u, 1045174332u, 3577682097u, 2169383377u, 1730416479u, 712654956u, 3155052928u, 1776219501u, 3353461099u, 711436547u, 1497369655u), + SC(1896697766u, 3621973902u, 926548253u, 4069206549u, 2297004301u, 3251063401u, 993943014u, 1270589313u, 3281589988u, 588955836u, 2429665887u, 1734915238u, 3409902793u, 2578722241u, 654727507u, 3216225031u), + SC(2536890957u, 2554531636u, 2109372546u, 2649000077u, 358086224u, 3391808161u, 1211714614u, 2605265326u, 2606629887u, 206756474u, 1092207840u, 3362434504u, 3945886373u, 4232252600u, 2886868947u, 3532954370u), + SC(65718672u, 4071991225u, 2060698395u, 2198173427u, 3957878549u, 4022831630u, 3461473682u, 419893418u, 779469249u, 2019627177u, 2019172804u, 3609556656u, 2681069216u, 2978123659u, 1249817695u, 2366599297u), + SC(2811735153u, 3049657771u, 1390752797u, 1411409994u, 2127695318u, 3083850245u, 787626821u, 1929564189u, 855492837u, 4008216334u, 1809444437u, 2182869717u, 813270534u, 2247412174u, 1161082081u, 1381922858u), + SC(3920648469u, 503487540u, 2083562080u, 327383264u, 2785608988u, 867359286u, 1036950980u, 431152821u, 1419040671u, 2665230771u, 2455357484u, 351717207u, 3187759581u, 3348793239u, 2511298896u, 1213040259u), + SC(2396309679u, 670711827u, 2849604206u, 3201137057u, 818618388u, 2531623890u, 3805810347u, 1463443182u, 79508933u, 3480790940u, 3579218280u, 263259195u, 3368747551u, 3044188079u, 1352272344u, 3090026690u), + SC(337838342u, 789695791u, 185502398u, 1517725636u, 783544345u, 2877621235u, 2946546356u, 1215973672u, 1208860651u, 725001171u, 1289736233u, 3756237869u, 1654092362u, 364807179u, 4279861158u, 4016003402u), + SC(1113567525u, 3780565260u, 836674522u, 1827009520u, 756906197u, 2663480421u, 3902552087u, 3507352398u, 774509259u, 224530498u, 2361577079u, 3744385228u, 3961162378u, 2586454589u, 3040342450u, 332039963u), + SC(3041171145u, 1474749273u, 2282851768u, 649990155u, 2952549483u, 1360702019u, 1809905451u, 544396952u, 68636355u, 2878101257u, 1478326650u, 2199663643u, 320705780u, 628185476u, 2087425498u, 3828181698u), + SC(3988280964u, 459019854u, 4007245269u, 1946776277u, 125932076u, 3922945473u, 608655237u, 759981570u, 1458494773u, 3686363491u, 3746534866u, 3692063331u, 290340676u, 486223220u, 3313127929u, 2280570810u), + SC(233319658u, 3886064320u, 853251650u, 1236563554u, 538386922u, 1967845333u, 3003439052u, 2872751142u, 150287328u, 2176354561u, 3956114759u, 3858039u, 2003618785u, 4212993191u, 2956509701u, 3196752221u), + SC(2121593903u, 3906201458u, 1137774967u, 3978600103u, 780659717u, 3484790562u, 769856015u, 36405780u, 695767695u, 3397748350u, 3377872749u, 1577340836u, 783581424u, 3804923626u, 2896998870u, 1723843622u), + SC(2572703671u, 2154230449u, 1195305676u, 4208655231u, 922600921u, 448134411u, 986012643u, 2442352758u, 1662902878u, 1367546113u, 2863017129u, 59878996u, 2111442975u, 648834983u, 865532037u, 1000323350u) +}, +{ + SC(2802315204u, 2299944053u, 2128407100u, 3463617348u, 2448441666u, 1070000794u, 1884246751u, 210372176u, 4075251068u, 1818330260u, 3223083664u, 3496698459u, 3376508259u, 4156094473u, 3718580079u, 1962552466u), + SC(3866141502u, 1978128229u, 2646349807u, 2688968712u, 1012393569u, 2539553175u, 2230158790u, 2206981245u, 3747509223u, 1243575365u, 3510697084u, 4007723917u, 859148499u, 1713821117u, 199178654u, 2644187203u), + SC(1964672019u, 297703434u, 1518880848u, 3373273121u, 959853764u, 2251122694u, 723413077u, 800337307u, 648287930u, 2947400245u, 1113383775u, 3610122168u, 1829970570u, 2892296971u, 1554744636u, 494969279u), + SC(4031050415u, 1835549397u, 2490029791u, 1131956513u, 1204048760u, 1914510905u, 3436953651u, 3943499769u, 1759802551u, 3820069122u, 4025269834u, 2717988015u, 2671631612u, 1159803272u, 1951365142u, 4085381442u), + SC(606110736u, 4064038873u, 70240913u, 2494945854u, 3729188113u, 2063877878u, 3912150605u, 3215847250u, 2977890044u, 3389766053u, 356841724u, 356991784u, 2228722660u, 3145515298u, 2594559598u, 1158432841u), + SC(1794017518u, 25183950u, 1671020817u, 785574353u, 95301808u, 1715172822u, 2718673424u, 1470113919u, 1142251437u, 2499778479u, 4281783303u, 1325560741u, 2913926884u, 3804531669u, 3139007483u, 1406557472u), + SC(2970751291u, 2450850294u, 545967636u, 1959629374u, 3303894193u, 455065073u, 41447235u, 1831795469u, 3594460859u, 4077235761u, 722461030u, 598330044u, 192707446u, 509790368u, 1051867275u, 1446366645u), + SC(1959543921u, 1887295052u, 3154544834u, 487969766u, 2252004301u, 996805128u, 2018864848u, 597352487u, 1136669046u, 533675042u, 981364938u, 2653382923u, 1408807893u, 2742559841u, 1833041360u, 1912794731u), + SC(2721713526u, 3549551325u, 601974093u, 2790584575u, 3951999363u, 4215366345u, 2845142034u, 4218934731u, 1726020765u, 823952138u, 3809833u, 4233069287u, 1129914456u, 1399496316u, 1915356031u, 4169077603u), + SC(3926695685u, 1849292395u, 1522137139u, 1552827989u, 4109112844u, 2060253220u, 2853920191u, 801241282u, 3422535773u, 1693187125u, 2113050221u, 2708536698u, 2777027446u, 4174902187u, 1811957361u, 3772547370u), + SC(3930825929u, 747327770u, 2505687587u, 2880650279u, 583976081u, 3834434841u, 1957901663u, 82062519u, 1246607062u, 4096185443u, 1298601955u, 3551964017u, 2293924654u, 2316870880u, 1326950040u, 3135743003u), + SC(2476396705u, 2790106263u, 443544224u, 2802435205u, 819417773u, 177556618u, 4130535785u, 2505448107u, 2591437865u, 1610510350u, 3815578981u, 4114533339u, 2461835810u, 3856846001u, 1439644255u, 3343979676u), + SC(4065627430u, 2927818196u, 950831561u, 4171626868u, 1177734694u, 150634338u, 2487656862u, 796691698u, 2119716392u, 2975402883u, 833495592u, 2179672277u, 346833760u, 3054174076u, 3573945862u, 3318693908u), + SC(2752867821u, 4203551149u, 1685153083u, 1110714758u, 1962211454u, 2837810663u, 1792364454u, 4089022191u, 3967274249u, 192406218u, 3350506767u, 1577386058u, 1497165592u, 1817646171u, 1066733732u, 617241273u), + SC(307712584u, 3903562077u, 681601120u, 3047177738u, 2486055863u, 3842609448u, 3660507009u, 2553494609u, 3174736607u, 3482954246u, 1496988826u, 1025695462u, 3184242644u, 1095387068u, 949053977u, 2083266597u), + SC(3022399010u, 1538609936u, 2420072227u, 990220729u, 2914167049u, 3768364162u, 1346299210u, 1681335666u, 2574961060u, 4053930867u, 303191498u, 2606902764u, 726562386u, 2306023171u, 939416980u, 608183941u) +}, +{ + SC(1862109024u, 2933191225u, 198801920u, 104305860u, 4011109577u, 4122560610u, 1283427153u, 1072910968u, 1957473321u, 1766609671u, 2854361911u, 4075423370u, 2724854995u, 3336067759u, 2831739585u, 400030103u), + SC(3665137971u, 362515859u, 3613170351u, 1634568159u, 2407386812u, 2769867978u, 3661728638u, 966943982u, 2329232814u, 928287686u, 386060431u, 2380767940u, 993235698u, 994357638u, 4262826729u, 789587319u), + SC(700222805u, 4205189715u, 1681820282u, 2408317852u, 3145763515u, 149703318u, 2996102375u, 2778856747u, 1243021847u, 118692771u, 660320701u, 2037909966u, 3471407521u, 3539034550u, 2338530850u, 798101514u), + SC(202761792u, 3072251152u, 936980226u, 2112028598u, 55725596u, 545941282u, 2866544613u, 2541609642u, 2986914411u, 250525398u, 494419489u, 904338436u, 448237071u, 2519815520u, 3547503723u, 3479815920u), + SC(2591263445u, 2313710919u, 2225850186u, 2907469855u, 1923973028u, 2439332754u, 1359667863u, 1147453888u, 591668157u, 1802961428u, 2115337573u, 3814501239u, 1652114003u, 3286770823u, 2320492326u, 1627762005u), + SC(915583786u, 1541647557u, 857793588u, 1120457139u, 593298997u, 1235522530u, 3835902793u, 4029633796u, 2892088014u, 950803214u, 2067553664u, 3466102617u, 417988445u, 1721721291u, 2995105031u, 1833135847u), + SC(3713015457u, 984220366u, 1636921821u, 69668826u, 2853588756u, 3372417728u, 1514016965u, 3165630303u, 549067200u, 2237752955u, 3528219045u, 2819816242u, 2536477233u, 430232621u, 1219272797u, 2682238494u), + SC(4158909478u, 628504302u, 1961569314u, 3701318609u, 1298978065u, 2797817112u, 2778611026u, 2986972418u, 2728592083u, 1350107926u, 261737783u, 1726357156u, 2342206098u, 3937750792u, 3688276065u, 1598643893u), + SC(673033353u, 989709407u, 1304069795u, 4233856570u, 603282839u, 3834722266u, 3349356388u, 2690783748u, 318351191u, 3370905692u, 2347975280u, 2009518842u, 2234183321u, 2940030960u, 2623873751u, 1542240694u), + SC(2380479990u, 2443937714u, 165899369u, 1753008008u, 3688956092u, 2346743686u, 143829732u, 3830274100u, 446444093u, 1705814492u, 2316415254u, 1337109896u, 3093454689u, 1928322219u, 2296006624u, 2093435857u), + SC(4072133379u, 1665275533u, 1975626640u, 3338948757u, 3639875020u, 2527617364u, 2537708733u, 3825629008u, 3956434656u, 2047924528u, 2149850378u, 563001677u, 1364815414u, 2503665164u, 637530147u, 630327427u), + SC(2169035971u, 3667715128u, 133026623u, 1213164483u, 1858042667u, 1566345391u, 3257221880u, 1553218197u, 1494901497u, 2543246705u, 3407410762u, 149097838u, 2595763051u, 3921913476u, 3975713216u, 1013875562u), + SC(4285039888u, 3972750160u, 2508056116u, 3828502305u, 1554885499u, 2478771653u, 3465835374u, 2839338634u, 936668484u, 3860842840u, 1796057260u, 539213045u, 1979230663u, 2637220243u, 3822691920u, 124051918u), + SC(4008482152u, 442930842u, 3844390262u, 1477377511u, 2570068482u, 380269897u, 3550124210u, 1507268577u, 1690622835u, 1216029693u, 2876552462u, 1409060125u, 862828291u, 1145788484u, 2966975851u, 3091998876u), + SC(992351977u, 3038251247u, 1125019979u, 3468273479u, 2933515034u, 2848650947u, 3581678949u, 3449520008u, 3870604714u, 2854135121u, 1257402460u, 1206940695u, 2996845551u, 725641056u, 3899090423u, 600507448u), + SC(1594814264u, 3363681343u, 1687711901u, 1220822433u, 2890970125u, 4169329849u, 1095390946u, 3969022672u, 2174219653u, 1940964660u, 1237339498u, 2965031440u, 1016584643u, 2590104317u, 4235803743u, 3748725935u) +}, +{ + SC(770670183u, 2030489407u, 913827766u, 28354808u, 2556411291u, 589717159u, 413516142u, 20574376u, 1695189435u, 3750527782u, 3546610407u, 1435363367u, 2770958348u, 2608593137u, 3331479090u, 2086258508u), + SC(386282669u, 3729286075u, 814752142u, 1413230862u, 2616133966u, 2483044279u, 1602859126u, 1971292416u, 3070813417u, 3451205972u, 735409142u, 4007950155u, 2905395594u, 2869625175u, 3709680291u, 2952203732u), + SC(3404816958u, 563114856u, 2100979818u, 2101934521u, 2503989815u, 1063833326u, 1723163772u, 3130704072u, 2515274210u, 1396315966u, 393457735u, 2691705207u, 828877164u, 3349330754u, 122605524u, 2602269000u), + SC(3709941627u, 592327138u, 2051205206u, 810649302u, 871212350u, 1541388603u, 4163983787u, 2631105522u, 665062813u, 2612020092u, 3229205070u, 3819479307u, 3310127863u, 1843015221u, 2875318880u, 3723951791u), + SC(1567440489u, 946197176u, 1275093448u, 4236630568u, 3990268727u, 196525149u, 15396621u, 1859637416u, 3138749279u, 3859238173u, 3227404352u, 2720346799u, 3006927153u, 2147957966u, 397899810u, 870180302u), + SC(1039540230u, 838590221u, 2330450212u, 923346890u, 4067788704u, 3619481496u, 3864357516u, 1659963629u, 3299501842u, 1079788777u, 949881347u, 2502746723u, 3228809289u, 247884983u, 3118597092u, 302086001u), + SC(3566621623u, 1671359399u, 3923258138u, 1638982085u, 325268348u, 4006635798u, 1207442469u, 3002539627u, 4047574291u, 2011583803u, 1713508996u, 1060703309u, 4012225302u, 3776068377u, 2784459927u, 3025510009u), + SC(4215947449u, 1997878089u, 1026649407u, 646510252u, 850804277u, 1871694871u, 3390738440u, 3114862405u, 3567086852u, 195428920u, 1556755650u, 1851670178u, 2207687769u, 3388294264u, 4058594964u, 4248126948u), + SC(45480372u, 1361999478u, 2195192123u, 956464540u, 1294436548u, 3045580134u, 2390633033u, 757048237u, 1350268583u, 862465366u, 1780970485u, 3285033794u, 559081924u, 163710122u, 3170983363u, 2626972150u), + SC(90053239u, 741607095u, 3003181022u, 3546281037u, 1996206866u, 2019149839u, 2216417072u, 1170259974u, 4159879668u, 130215053u, 2605146665u, 3967236653u, 1930867601u, 2409157952u, 3775975830u, 1489883331u), + SC(40478381u, 3873592210u, 35609037u, 272986081u, 3051595606u, 504620408u, 1019656134u, 250693036u, 942133950u, 156032543u, 3738710122u, 1712961843u, 2888111563u, 1171258741u, 645705716u, 511104714u), + SC(239657447u, 2278853730u, 2391081998u, 746810345u, 3484552464u, 1369592268u, 2655434121u, 1213868536u, 2934523673u, 3058111393u, 4281279490u, 3966376385u, 1307651904u, 1645528218u, 3652190772u, 1126527756u), + SC(123809694u, 110218531u, 117547539u, 2035819815u, 3596140063u, 1382818318u, 3664758070u, 3019339789u, 2719299822u, 3892472009u, 2876096109u, 412140786u, 2578091481u, 2196346764u, 3068803053u, 1395690512u), + SC(880155357u, 791542602u, 112062960u, 2175792069u, 531560395u, 3155859615u, 1042526138u, 680268271u, 1355330482u, 2485441305u, 148200464u, 964096786u, 3215229166u, 2660485876u, 3076499838u, 353883041u), + SC(2388114644u, 1552848777u, 1649071283u, 2325568488u, 3165393822u, 2695611152u, 2713875122u, 898903657u, 2377088931u, 1138573339u, 3366910425u, 3238180215u, 676550680u, 1043832292u, 1583145576u, 3925456200u), + SC(3116588854u, 731097341u, 35427079u, 152855963u, 655343116u, 2522648040u, 3048497137u, 3838372571u, 777022751u, 2851975543u, 235569549u, 3020787559u, 727642795u, 120522014u, 2406411931u, 4235508200u) +}, +{ + SC(2533741935u, 4150033708u, 3133949860u, 2798619408u, 806119564u, 266064305u, 1385120185u, 1697466874u, 3309272849u, 2305765083u, 4237655511u, 751372374u, 3319766406u, 1139025033u, 1880631363u, 2216696728u), + SC(531691765u, 3457214584u, 2884896024u, 292273176u, 250051106u, 4144042126u, 176967583u, 4132839552u, 2406879878u, 872979134u, 3029052987u, 2283805120u, 2613859206u, 553294045u, 1245122721u, 3840523078u), + SC(1249934121u, 993078438u, 2897493833u, 1681305911u, 57100476u, 365202891u, 2111004277u, 4247410280u, 1628827737u, 3793711703u, 3364391257u, 3510640052u, 3346661510u, 885793286u, 3903378618u, 356572920u), + SC(680178688u, 1413780236u, 356581993u, 2539116542u, 3091268161u, 952393142u, 3601213640u, 3759147734u, 3201912600u, 2029303323u, 3233109971u, 3469579370u, 4191225303u, 2727922547u, 4241219026u, 1108397896u), + SC(581424072u, 2231376178u, 2556335427u, 507971440u, 4133814232u, 3831053002u, 2090051536u, 2682264467u, 1696017056u, 2590078109u, 3496563305u, 1242917226u, 2491190071u, 2058502209u, 3614091208u, 50680464u), + SC(1148224059u, 3153210519u, 1979896166u, 3699990000u, 2774705970u, 4177914488u, 1097495713u, 3943642621u, 28438271u, 1936652546u, 2951976972u, 917798112u, 3345031007u, 3414386063u, 2086388059u, 3336786964u), + SC(3207879285u, 3245056275u, 2753912038u, 3444068917u, 3619101580u, 301796681u, 469710494u, 37792426u, 2324375961u, 3765435021u, 2308122387u, 186365381u, 1748483921u, 2929955002u, 2507797221u, 1450081310u), + SC(2628113752u, 657975440u, 4188527535u, 3642824575u, 1167948061u, 570005820u, 1209373950u, 3114955026u, 2156903999u, 3426648275u, 258877187u, 4116394669u, 3424577769u, 1876755024u, 3610721045u, 137959590u), + SC(1295746957u, 2893879416u, 2731249393u, 43796623u, 1509060380u, 3580712054u, 2063633991u, 246915731u, 245935590u, 2758600953u, 1174591025u, 3759438209u, 874703696u, 3900497366u, 2032803558u, 741576512u), + SC(737124188u, 2899307081u, 1769647158u, 617077642u, 1659909664u, 278863054u, 4232490889u, 625515113u, 3013249184u, 3621100329u, 3078044036u, 1407642415u, 2069197169u, 551433765u, 2836890938u, 3978268035u), + SC(1956698332u, 1096426127u, 1006277939u, 3889489220u, 4030026180u, 3579514159u, 4250029335u, 2203857202u, 3553085216u, 3293255490u, 1237506477u, 1050435484u, 3944172449u, 3169627003u, 1477888937u, 2421667267u), + SC(867315816u, 669003983u, 4033294932u, 3994270030u, 1836283861u, 4220295811u, 3981502955u, 1254544883u, 2953929766u, 3399467612u, 2767815501u, 1837724890u, 359769422u, 525366934u, 2275330754u, 1596174485u), + SC(2757381304u, 618201396u, 1587888624u, 1754675322u, 309402992u, 1862772816u, 1766295424u, 776578164u, 3139660404u, 2518031939u, 4144540600u, 2162413735u, 2788510259u, 3413511116u, 1497090248u, 130610227u), + SC(4221771265u, 792248867u, 928054053u, 140258355u, 1340321712u, 917602285u, 1586319677u, 1429062327u, 3604542914u, 1952132240u, 3586261493u, 1380920077u, 1224870626u, 1321897505u, 3109874655u, 2938496454u), + SC(2321281375u, 3760646295u, 420407446u, 4154009512u, 2825227525u, 4188075686u, 2041350513u, 1285713851u, 1670924786u, 1104780793u, 3524777730u, 1315724274u, 2655303597u, 1675669649u, 3173211461u, 1286635196u), + SC(1138423224u, 1326909178u, 3451890502u, 3840823688u, 3093921534u, 4140902218u, 2007985143u, 2980979703u, 3539657192u, 1914000311u, 3861983402u, 1995841174u, 2739822780u, 4269529997u, 1752802206u, 3674790048u) +}, +{ + SC(1529327297u, 3326406825u, 3128910982u, 2593525414u, 42156971u, 3661621938u, 1244490461u, 1967679138u, 1025455708u, 720268318u, 2871990393u, 1117479541u, 1562094725u, 697888549u, 2324777980u, 3391621955u), + SC(1194208642u, 570517940u, 3796480395u, 3996975496u, 1891180536u, 2012913508u, 2586036803u, 2779419249u, 2424448764u, 654631266u, 3378681847u, 1794600320u, 850887774u, 2610529382u, 3440406071u, 442629809u), + SC(3922776395u, 1021134129u, 4161953411u, 3695042522u, 416696694u, 3141869998u, 2208946602u, 2248782897u, 3791212714u, 2183092330u, 2442693998u, 3821686193u, 359924765u, 1313892u, 732537261u, 3441185514u), + SC(3832647873u, 4126820624u, 1633739521u, 1776853127u, 1990846870u, 2931750872u, 723350088u, 2100866125u, 1353427778u, 3735236517u, 2936890827u, 1037652209u, 3538242522u, 1205440750u, 2681851721u, 3428134171u), + SC(3715940368u, 3100195993u, 139205042u, 933899119u, 508675941u, 2073279390u, 3838896736u, 762162827u, 2670162920u, 363468845u, 4142816880u, 2331633868u, 1859516459u, 2571514805u, 1415575689u, 3310370398u), + SC(1850103477u, 2861511197u, 2158258814u, 1914352173u, 4112609179u, 1613408074u, 2229142795u, 2743410061u, 386541358u, 4131835227u, 238820765u, 350328321u, 796595210u, 325800094u, 1477199872u, 130087432u), + SC(3503083399u, 2168288449u, 3773780757u, 707691176u, 2640783803u, 600372304u, 3521490788u, 1266639681u, 3049849833u, 3696342843u, 1559948576u, 3113774976u, 2979720549u, 3508429388u, 1393959701u, 716360542u), + SC(2281167118u, 2404489970u, 874916137u, 3296730075u, 4266077966u, 1052198560u, 3487426822u, 379036992u, 918125804u, 3064034925u, 3007906638u, 2843799763u, 13395259u, 1525101299u, 3917909303u, 323214095u), + SC(4272733253u, 1134926458u, 1071872991u, 1594198106u, 2743911342u, 1759781849u, 3909986783u, 357998405u, 4054491364u, 588230484u, 3248723140u, 4206364217u, 407716541u, 1660843258u, 3535395038u, 735131513u), + SC(3679104282u, 2103136756u, 3192389130u, 3635496721u, 3762160259u, 813057806u, 1922167568u, 196643685u, 1370854030u, 2657803320u, 3197001343u, 2838705898u, 1256322653u, 3731470140u, 1658864516u, 4241135314u), + SC(4138122573u, 1064712956u, 1914688217u, 3980579663u, 234064841u, 1340868250u, 2408246134u, 2334390091u, 3574856083u, 4185747404u, 2592066932u, 72932352u, 1132443153u, 3084950430u, 2850577555u, 531426487u), + SC(2552518597u, 1814188589u, 3771797408u, 1688271073u, 1392417060u, 1864411028u, 2178912172u, 2411760311u, 772279774u, 2791980611u, 2940533230u, 3149501999u, 370215731u, 2968115262u, 942881455u, 2310941126u), + SC(751991992u, 3546574605u, 2773077774u, 2498170045u, 3288367839u, 3030402134u, 1196921751u, 3823185297u, 3245569995u, 3802879953u, 493640893u, 3321821285u, 1141758187u, 3411864659u, 306737884u, 2761165281u), + SC(1865741334u, 706283811u, 2318095713u, 1419794148u, 2504644337u, 1922210484u, 263491957u, 3084520625u, 705689999u, 2554474009u, 3818190952u, 2133768662u, 3690402460u, 3381523320u, 831084441u, 1146769937u), + SC(831531101u, 3633896804u, 1996958159u, 636851001u, 4007892767u, 380666960u, 2826737942u, 4021398986u, 1411635481u, 515161969u, 4199924051u, 371116192u, 1868116156u, 397223417u, 972171737u, 2331326509u), + SC(974457928u, 3569708670u, 2643527780u, 699675161u, 2627045402u, 3565281489u, 1504374419u, 2979851122u, 688725044u, 4064400308u, 4156347928u, 4119156622u, 2098702491u, 2615488234u, 1090654007u, 3790938610u) +}, +{ + SC(1397828129u, 1248172308u, 2194412927u, 3657598991u, 2085616102u, 1202270518u, 3253032741u, 2632389423u, 1019922267u, 332153082u, 1521672215u, 2163564334u, 3102124007u, 582149809u, 329417494u, 188520915u), + SC(2484409087u, 165527253u, 332794704u, 523511269u, 3524328119u, 4077596669u, 3681267981u, 2969751460u, 3456338723u, 628364217u, 4089156990u, 1135761223u, 1241363911u, 2843043452u, 1927162020u, 1187988850u), + SC(3424784620u, 4001207648u, 1967060425u, 33527184u, 588161341u, 2216089406u, 1194534688u, 3972415390u, 3430941953u, 3671974564u, 355464831u, 2638417624u, 987848314u, 3854256447u, 2513703271u, 847178398u), + SC(944122325u, 1095537200u, 1611102749u, 3845108718u, 3985128242u, 1188491807u, 3783427529u, 722821803u, 2594736624u, 4038805042u, 2146959275u, 3199724336u, 3631416672u, 3989329185u, 1113423723u, 925573746u), + SC(536468163u, 2790961065u, 141113925u, 985919057u, 2438788330u, 374449238u, 2980068000u, 621714839u, 2454037345u, 2810385667u, 3189321079u, 794373297u, 4178743943u, 2630861151u, 1229894711u, 2665151675u), + SC(71889345u, 3684655732u, 3834974630u, 40555081u, 3804280840u, 423207811u, 1620826812u, 3717508581u, 1813258849u, 713714932u, 491517868u, 2389605511u, 767769458u, 2826892693u, 3923819122u, 3331321015u), + SC(3333750894u, 150650636u, 3555142699u, 1161199649u, 3068475424u, 1509735584u, 1033908609u, 3073273527u, 3313105177u, 3410735718u, 2770838598u, 2161939200u, 1654309303u, 1247727621u, 4123284974u, 3218452135u), + SC(4107359918u, 3667881557u, 4099213325u, 905728122u, 3167924799u, 3731720507u, 1537227227u, 659110227u, 2101733778u, 2731849932u, 1103266972u, 887588276u, 2413509058u, 3876926094u, 2675347623u, 834362982u), + SC(3178393694u, 2636806389u, 1832500758u, 186297941u, 3662837586u, 3282938029u, 1064394039u, 2117567716u, 95811670u, 1968831533u, 3070787872u, 2658254448u, 3676980228u, 3909574788u, 2135784404u, 3803100103u), + SC(2624310917u, 420491519u, 3322620679u, 3357048697u, 614451586u, 1196461215u, 41516451u, 3256616699u, 3715883496u, 2257787428u, 2455669147u, 880443853u, 2246776764u, 3074399406u, 278369115u, 1177356599u), + SC(439711555u, 2231299488u, 1079942678u, 677737570u, 563039018u, 2032266501u, 3704274118u, 1877323449u, 2386821791u, 2066266240u, 2520835526u, 1611863315u, 3800297318u, 2553770190u, 1751820038u, 2175904420u), + SC(3515911639u, 4055231138u, 2717511782u, 6831543u, 3016647759u, 2007513585u, 1217171617u, 3815960975u, 2720128636u, 364849140u, 4285658094u, 4211508323u, 127732138u, 997100418u, 3152669382u, 146802488u), + SC(3082714386u, 513166810u, 2182067081u, 798923178u, 921230382u, 1956178560u, 883901335u, 4290259857u, 2290170782u, 3274942148u, 2025203706u, 2950735447u, 3706997198u, 979032741u, 1714061744u, 1756952042u), + SC(1785121933u, 665679939u, 3927612276u, 926826810u, 456860581u, 4247102861u, 1802871345u, 3111467239u, 2947918463u, 4090223916u, 2765919892u, 3848356305u, 2236940933u, 2379663516u, 2033761836u, 170415812u), + SC(723418419u, 3083992977u, 2885930256u, 4084559514u, 3550295439u, 795067132u, 3902666387u, 98659646u, 3559229619u, 3518103022u, 3093345450u, 3504265473u, 3135355783u, 1746911831u, 3896748938u, 1982334610u), + SC(4151598450u, 129451956u, 3923175367u, 306344029u, 336516292u, 3560777935u, 2695409605u, 934056748u, 4131395595u, 112767211u, 3377236273u, 797539933u, 516899453u, 2089210576u, 1999558205u, 4107023428u) +}, +{ + SC(87353816u, 3198238907u, 1232123158u, 3291424375u, 3695263554u, 2608617182u, 3798070797u, 3966302680u, 3847946128u, 278442153u, 3929504461u, 3056452729u, 3658519828u, 643043450u, 684101279u, 121314490u), + SC(4041434108u, 1283940781u, 3208791522u, 2974918612u, 861706326u, 3183082284u, 508820598u, 682206875u, 1177134745u, 1065833400u, 1830916342u, 1348337823u, 1877305145u, 2647094535u, 2714586296u, 2450197741u), + SC(2726369020u, 1580548584u, 150986819u, 369792970u, 2983651480u, 3064179956u, 3511715342u, 1538695618u, 3829066845u, 578378703u, 2038030944u, 3732775932u, 1174552062u, 2377418012u, 375009203u, 1203897576u), + SC(3480144388u, 847968760u, 3831609064u, 2454845771u, 827762235u, 3561019074u, 3068061128u, 2125290281u, 500142325u, 2613926927u, 908976630u, 461018064u, 1790330457u, 2138554260u, 3099515250u, 2668195629u), + SC(1153226571u, 752634643u, 4102962367u, 2953166708u, 3172028384u, 1546019245u, 73810680u, 2123706323u, 2289283451u, 1736737040u, 4246735980u, 196740994u, 886758605u, 1893565373u, 3405498929u, 3744937024u), + SC(768993978u, 3888906052u, 3538251248u, 352204151u, 4022234611u, 1471705290u, 4243963811u, 2027117811u, 1763868778u, 1322271979u, 3608278288u, 3888498758u, 3465093513u, 3125049811u, 2129222282u, 295188310u), + SC(2552844131u, 1588346847u, 4175462227u, 3528353039u, 48525488u, 1810438463u, 342094266u, 3279671133u, 111165134u, 1329165912u, 4063411685u, 1911765579u, 2818934337u, 3808545183u, 3789526924u, 1948478023u), + SC(3331030119u, 905985030u, 3533623355u, 799989600u, 1593247216u, 4044824934u, 3057376453u, 1132187407u, 2788031862u, 3252641138u, 1745792893u, 1362467427u, 2194538589u, 4207162080u, 1731158987u, 3426969514u), + SC(282742454u, 1925220542u, 3537150606u, 1044967349u, 4104410814u, 3036747834u, 2170951116u, 4063975818u, 2876870249u, 40785387u, 3225638952u, 2818597718u, 1556539976u, 2301588618u, 2800555653u, 916700871u), + SC(607531008u, 2820787318u, 1270007122u, 63140951u, 2489460286u, 3749254552u, 3480926448u, 2300022433u, 3335552281u, 3577740253u, 4083676266u, 1879037356u, 3793973091u, 653990091u, 981292091u, 2669230849u), + SC(1168110979u, 889306226u, 331429321u, 3194220363u, 4271486769u, 2440942709u, 3008822642u, 561011853u, 2621371879u, 1149493671u, 1110535664u, 2670803472u, 394628735u, 4014155619u, 3742604108u, 1418371877u), + SC(1139004104u, 1152838795u, 3053437035u, 3533998804u, 965296070u, 2842987726u, 3847937142u, 3591812355u, 1659887171u, 3058851485u, 1843832825u, 2284970388u, 153709291u, 2147381595u, 1241923942u, 3246474482u), + SC(2372841964u, 95150550u, 785345036u, 3777509922u, 3777338585u, 1256811659u, 530593057u, 2218391448u, 163045439u, 4110451435u, 940149273u, 3289892018u, 1950559815u, 2046468986u, 785769535u, 229305669u), + SC(4222560409u, 1251917359u, 3419952330u, 3518946758u, 2125025139u, 840904710u, 2104865575u, 3206919775u, 407519472u, 2004634252u, 1712650404u, 3590313236u, 840286442u, 2628712493u, 3254945248u, 1148702071u), + SC(3313735124u, 1648160975u, 2356873919u, 1752134136u, 1812666743u, 1155388994u, 2048656880u, 513774477u, 495906662u, 2103152333u, 2943961999u, 735251223u, 2523783965u, 2210023145u, 1945848363u, 2437613245u), + SC(1086803487u, 4028294733u, 2247710942u, 1830793111u, 1634316303u, 2935377055u, 600165818u, 1578619540u, 2988076738u, 457218665u, 4176910460u, 454493682u, 1199052867u, 1940805269u, 347367761u, 1212452462u) +}, +{ + SC(3715433378u, 171840999u, 971741983u, 2238541363u, 3192426674u, 4094492328u, 467620204u, 194258737u, 3399274574u, 3279461044u, 1351137305u, 2503870624u, 193649547u, 2998335432u, 1712991547u, 2208648311u), + SC(2715750837u, 1950207216u, 2432412079u, 3161034889u, 3163700758u, 2527560734u, 1574123740u, 2830017576u, 1235654592u, 1173758764u, 3503805913u, 3353556737u, 1972267538u, 2593804497u, 4050894516u, 1536909338u), + SC(4252707359u, 3437282014u, 3776749445u, 203710275u, 463138159u, 2772620289u, 1182212975u, 1132575015u, 2008846240u, 1446588540u, 1178588185u, 2810502365u, 3189501211u, 3192046357u, 3703545124u, 2781338651u), + SC(127281203u, 3251296097u, 4229877600u, 1655402395u, 2971465573u, 744237737u, 3839563968u, 1414447733u, 2055975912u, 547297398u, 3544526703u, 1086573241u, 4145442250u, 370020177u, 2948813570u, 1970539713u), + SC(3163465607u, 792227545u, 605650287u, 3454430637u, 4436412u, 957261079u, 2917570432u, 3199157324u, 317922439u, 2607400867u, 3201779931u, 1812841573u, 973872378u, 3838606231u, 3221928943u, 461831659u), + SC(246719913u, 1498935408u, 1945961723u, 1327338499u, 2917210822u, 1660082997u, 597934446u, 1244971072u, 662537876u, 3851981101u, 2064803568u, 1228771649u, 4273868614u, 3144280868u, 3367923741u, 2660003700u), + SC(958115915u, 3015255252u, 3159655209u, 1681296573u, 2092702329u, 3275820278u, 1666603934u, 3861667140u, 2501203189u, 4234907638u, 1084271161u, 60369385u, 1104875606u, 3495688315u, 3738262066u, 4032927728u), + SC(1265262733u, 3131514218u, 237040963u, 4104455196u, 2691347880u, 3487609649u, 1785135800u, 1176579745u, 4089650722u, 3141152552u, 3206481300u, 1333364227u, 276607745u, 113027050u, 176916027u, 1602590030u), + SC(2774594376u, 3129694750u, 2287032514u, 2766750820u, 29083039u, 1069500497u, 840365222u, 3485333678u, 2555809577u, 3972967703u, 629036427u, 3011729266u, 1526288233u, 1119437732u, 917067812u, 194168105u), + SC(592881983u, 3318575349u, 4127058062u, 1732571107u, 3503756272u, 837953701u, 482225210u, 1269788935u, 1504556881u, 1896976655u, 165783184u, 328929494u, 4077662490u, 1253488686u, 3518656631u, 977900779u), + SC(4160682596u, 2908983358u, 1718640008u, 3588190607u, 1505225185u, 4179103009u, 1685793395u, 115536342u, 817223934u, 1402206707u, 3062750872u, 450873212u, 3409531894u, 2142975045u, 1392180850u, 3108320562u), + SC(1943394512u, 2513880371u, 1620134863u, 1529322591u, 4060169700u, 3770293993u, 1183592156u, 3047089385u, 1457468150u, 3671110754u, 1216162597u, 2044466392u, 888112901u, 3589252991u, 523705271u, 1679814981u), + SC(2715251449u, 70744868u, 3381212136u, 1205646623u, 2056792384u, 3523601635u, 3273403565u, 2609964048u, 1635414738u, 3927671477u, 2002719738u, 17329846u, 673666863u, 4128776449u, 1023303890u, 2113317599u), + SC(678583802u, 2909193903u, 1603800869u, 1698604501u, 292539447u, 3194048567u, 1222053939u, 4292027072u, 1744031112u, 463670025u, 1002183205u, 880963334u, 2427537891u, 2521706813u, 3815796576u, 836594698u), + SC(945238598u, 3719965767u, 2849528520u, 3282124488u, 1093917226u, 3479450861u, 2561471910u, 139299258u, 3917471374u, 1798050709u, 2851226278u, 2410252745u, 1571541746u, 2877491529u, 1276119582u, 4206041035u), + SC(3869162698u, 1114491339u, 1196187395u, 1533960773u, 3407411925u, 765004505u, 1831463563u, 3761422880u, 841664315u, 226257499u, 2314441323u, 2186776430u, 2801566686u, 2703073796u, 3780881787u, 1370189991u) +}, +{ + SC(3356584800u, 529363654u, 613773845u, 1186481398u, 3211505163u, 123165303u, 4059481794u, 1428486699u, 3074915494u, 3726640351u, 881339493u, 977699355u, 1396125459u, 3984731327u, 1086458841u, 3721516733u), + SC(3675076449u, 3333909775u, 1262445603u, 3668028655u, 433069981u, 3324184640u, 206500128u, 2656010471u, 782457265u, 4053687660u, 3895856132u, 315252919u, 2755213770u, 922519354u, 2055252100u, 2429801305u), + SC(2756940336u, 2847978751u, 1709353190u, 1195969566u, 1965491900u, 3974470294u, 4065860779u, 457378802u, 2625680435u, 4168918960u, 912437805u, 1940496017u, 2831564708u, 2681452721u, 2977785501u, 178951684u), + SC(2809970073u, 2149172818u, 128792792u, 4173216994u, 3752778392u, 3547909179u, 2139546257u, 363162335u, 1029632619u, 226065897u, 1871318430u, 3511308809u, 4293432909u, 733440206u, 3154916386u, 2246758263u), + SC(731502074u, 2752951666u, 3348551978u, 3130709972u, 1526861742u, 2511266125u, 4044638365u, 215744304u, 1267320586u, 1960868675u, 3421832152u, 2257930073u, 2620941002u, 851383950u, 547951559u, 1340068454u), + SC(2684856551u, 174120198u, 1829892583u, 1225976594u, 2442169561u, 2751359631u, 1396256832u, 4190566994u, 616089248u, 1633732935u, 1633964885u, 3929429044u, 842800539u, 676918864u, 1428572539u, 219449459u), + SC(133428457u, 620472331u, 1882141266u, 1679319159u, 679060192u, 3481716513u, 213482586u, 3423863792u, 4201383258u, 1319777873u, 927348830u, 208213775u, 4087467606u, 3653264448u, 3835415188u, 3916570843u), + SC(1895413499u, 3284443662u, 1774671761u, 36215094u, 1302729892u, 3712548907u, 689399756u, 809699792u, 1542256887u, 1010909539u, 1793915800u, 371041697u, 3719334021u, 1415418990u, 3304256413u, 1722896741u), + SC(4292037144u, 3413799593u, 431584770u, 554753321u, 1212891070u, 139387849u, 4633456u, 4145076332u, 2956733683u, 2226540590u, 257006677u, 3020881975u, 3400787219u, 587473979u, 260993303u, 3410840543u), + SC(4018910540u, 3254488333u, 2078930374u, 2245837925u, 2632570996u, 3139405325u, 1623001428u, 3612462970u, 2032232089u, 519993838u, 198517548u, 1752888302u, 2236384752u, 3428944014u, 3264747145u, 2955960571u), + SC(3519760330u, 3333709979u, 1048481536u, 1985059447u, 2643412116u, 3131942587u, 1137942580u, 1547604917u, 2831143240u, 2752062158u, 438973315u, 216212421u, 839130203u, 4170782680u, 1103599719u, 3606044489u), + SC(3979124118u, 943995448u, 2583700510u, 3458129573u, 1268799005u, 2693058918u, 2421470342u, 2310844252u, 4161944025u, 2910466020u, 1520150746u, 2594375360u, 1025693596u, 3356457299u, 1405172368u, 3357345029u), + SC(3608628529u, 1093067289u, 2172624909u, 336171229u, 1137437622u, 2177129887u, 3319848621u, 3625148145u, 940129946u, 3128586787u, 111536296u, 1792339610u, 2781599252u, 3659875306u, 872551800u, 2302213340u), + SC(1104919194u, 189973497u, 2565652941u, 2930155667u, 3463454839u, 2388313768u, 2445171637u, 16202936u, 1593006897u, 2191020511u, 2084184836u, 1467463398u, 2313657914u, 2691464051u, 4089268188u, 4294499481u), + SC(4188734592u, 3528391612u, 40836399u, 4036867171u, 4090825107u, 2939803682u, 140442162u, 2546416492u, 1084596508u, 3326586985u, 72576332u, 3780421002u, 3675044591u, 2008171921u, 3141075467u, 4288443118u), + SC(3852374110u, 4271371075u, 2076634991u, 3101716180u, 518739558u, 3284103928u, 1607286758u, 3505817896u, 42970787u, 1339303318u, 3280473330u, 1956150319u, 790791234u, 1449585627u, 3814185461u, 3901254732u) +}, +{ + SC(3892284764u, 2210224198u, 97085365u, 934022966u, 3120556498u, 264721182u, 4011343025u, 1936310374u, 2593930315u, 3833725723u, 4141640186u, 2218699022u, 3726005369u, 649732123u, 1594208266u, 3687592104u), + SC(2459115622u, 155132544u, 2344650987u, 2337329027u, 2478875455u, 1363777389u, 666384305u, 779524970u, 131624810u, 1099629813u, 755087667u, 1116544707u, 3462583113u, 1765615231u, 1221263451u, 345614861u), + SC(283432140u, 3102718597u, 937211953u, 3334135604u, 2242058317u, 3044145753u, 1441000856u, 2163904099u, 654999768u, 3976748269u, 4108102772u, 1209693616u, 3022484925u, 2592361118u, 3806239715u, 2457345174u), + SC(1983572202u, 34789206u, 3963513429u, 2661898079u, 3999779459u, 2657216026u, 2570146353u, 810465768u, 1310539449u, 3517224567u, 1830164911u, 2328664885u, 3323158486u, 200812613u, 1588943475u, 1631047872u), + SC(1996456687u, 665652044u, 360516388u, 3634015955u, 3932508085u, 3762889476u, 2869080596u, 2179691892u, 1880327422u, 3850327759u, 1653803674u, 236673399u, 2154944705u, 3229042401u, 2981554507u, 485288416u), + SC(264936494u, 3091907543u, 2050111855u, 2694936127u, 1954787063u, 722933256u, 3813405263u, 739130277u, 2256053561u, 3585156690u, 2029190911u, 3133350308u, 3458910883u, 3499638057u, 41852560u, 491183838u), + SC(2808085465u, 1288453772u, 2477084166u, 3837131567u, 1141955368u, 3112183866u, 1372456734u, 2203526963u, 2954171016u, 3969349716u, 2868857569u, 414601865u, 4013256181u, 468368341u, 1996835394u, 3658768313u), + SC(394302887u, 1097097404u, 3291468368u, 1194224926u, 1035172467u, 1541144594u, 3844885672u, 3479557309u, 3116596876u, 2815221788u, 2598284757u, 360029902u, 1618439794u, 2569763994u, 3258655905u, 2917038348u), + SC(2305403224u, 515881048u, 3401955316u, 2294640138u, 2523482065u, 2913659188u, 1840514079u, 1334322081u, 1545396585u, 4197671987u, 447162882u, 3846426473u, 2663235502u, 750784192u, 4164775689u, 2390294077u), + SC(2816642384u, 3952759529u, 3784236377u, 1797857230u, 1881467157u, 3886776601u, 754213935u, 2085935272u, 3814437883u, 3598631313u, 3014087408u, 1480756254u, 2838244491u, 132661795u, 909841870u, 675503551u), + SC(2053456581u, 627096201u, 3974668317u, 245144267u, 3845450294u, 1209560693u, 1003623636u, 3431474873u, 3952764341u, 3855863791u, 1357940588u, 3374805012u, 2942824193u, 2988435703u, 329942625u, 4139666589u), + SC(73006928u, 4068145413u, 2752900485u, 643186737u, 2386201439u, 296363448u, 2965535934u, 2202307569u, 1300692310u, 3766694667u, 2421404412u, 2295288621u, 1987219755u, 3682346025u, 885571108u, 1086202535u), + SC(3800801259u, 1729576293u, 2024334221u, 266315944u, 3877353536u, 2983817286u, 1164606138u, 2981999790u, 2626097845u, 3537364374u, 3559786635u, 2149380619u, 2137897542u, 2218263339u, 206251476u, 3754285811u), + SC(1009857555u, 1650586423u, 3853695002u, 1715580147u, 1146669099u, 1380681899u, 2219018152u, 1791877891u, 3247738482u, 1042579957u, 4035547117u, 2619207487u, 2408116465u, 3045899420u, 1771645449u, 1340019342u), + SC(2004305920u, 978372350u, 1705342765u, 503429310u, 3635208103u, 3659317811u, 3957481997u, 297103567u, 2521968324u, 599616959u, 1167498361u, 357125999u, 3158983160u, 3114128384u, 3086595483u, 2336612985u), + SC(4103187540u, 1182325894u, 97419735u, 1615223731u, 2031918136u, 2818146326u, 1038685355u, 1330155299u, 2657284062u, 4126074186u, 2871281156u, 2738191090u, 1922990674u, 2689532011u, 4040564095u, 99693623u) +}, +{ + SC(3639643416u, 3974502485u, 1527161781u, 180938703u, 2788643910u, 3418867931u, 2912046968u, 1776807950u, 1185488163u, 2433308651u, 3682797092u, 1938004308u, 753534320u, 795320477u, 3620835863u, 105275502u), + SC(2971894151u, 635573958u, 1662864280u, 3637757763u, 1966418418u, 2382544768u, 3521712538u, 4180511568u, 1216311665u, 1622710591u, 2836323703u, 1065095206u, 3046512769u, 2304432132u, 1370910091u, 3540050165u), + SC(3003078502u, 1266710982u, 63268125u, 3769826631u, 2161222028u, 1624738852u, 2999285769u, 2485757266u, 3350017650u, 1836975640u, 3947916645u, 3226839039u, 3416803572u, 2607406281u, 3224012241u, 1574498192u), + SC(2417128114u, 3148595382u, 316383238u, 491687931u, 3782721648u, 71265990u, 725842943u, 2574280796u, 2910592942u, 1266732336u, 3293910730u, 3812834954u, 758280869u, 2044998492u, 585388705u, 2220041893u), + SC(492257517u, 927280821u, 3326474467u, 3418658462u, 175063450u, 4228793954u, 2332128647u, 2793872080u, 3349562222u, 3060602442u, 1750735766u, 864506271u, 3021446456u, 1089650280u, 684313887u, 2273360774u), + SC(569437869u, 3392548160u, 448456633u, 786222873u, 1891470348u, 56622530u, 1988234620u, 1200550357u, 3540465428u, 1566012807u, 3682627310u, 3118219502u, 421481320u, 474517348u, 4276632114u, 3506654966u), + SC(200012878u, 1289466640u, 383837247u, 2978212823u, 641013196u, 1218428129u, 2429292619u, 1428313217u, 4155302101u, 1036892035u, 3775206351u, 778853475u, 3322870631u, 4195074838u, 3725481759u, 3550082329u), + SC(126839072u, 3914304851u, 1035784989u, 2867617428u, 1989254908u, 3724484330u, 1316610484u, 1040102649u, 1452719164u, 210631948u, 1224888518u, 1113840153u, 910511278u, 2297844676u, 797967535u, 283877762u), + SC(1244500121u, 2493482314u, 3779000024u, 2685901143u, 2759844693u, 2465008309u, 2989069530u, 1046572576u, 3374497605u, 2414541412u, 1726159904u, 3650454710u, 2872643374u, 1536622747u, 1381290537u, 3538573283u), + SC(1982773073u, 895953548u, 653968243u, 2944168854u, 1891156211u, 862699673u, 178384938u, 2122337777u, 3992617936u, 1827424625u, 1827918311u, 4247768891u, 2116109311u, 2389157370u, 3259962586u, 3018719650u), + SC(16401953u, 2306633926u, 2338480543u, 3225473112u, 3429377887u, 2444554167u, 3036218027u, 811186210u, 2350667613u, 3590742085u, 2594672781u, 575072326u, 272468093u, 997542396u, 3031146350u, 3776453205u), + SC(1784787552u, 1031272746u, 3302965053u, 805306745u, 3874552409u, 2790720051u, 483200429u, 1779723984u, 1097599486u, 1897611475u, 2456960784u, 1754250527u, 3808506348u, 3902842183u, 2596972722u, 2928554842u), + SC(2323692909u, 829274841u, 1103316386u, 1866432209u, 1938371795u, 4027514213u, 3989131198u, 2637747342u, 2193562562u, 1183535102u, 290853894u, 707762868u, 1909722738u, 2733745164u, 2354524179u, 94921256u), + SC(390966983u, 2005348047u, 1183001210u, 3460046175u, 1194344520u, 3385791048u, 306982602u, 876126480u, 3192052847u, 3055117485u, 1493712024u, 239443620u, 3677526258u, 3935077241u, 3195438491u, 2508943164u), + SC(3776157658u, 1760005001u, 3371368706u, 4151959572u, 4117952947u, 2782084300u, 3075220020u, 3130861900u, 3220322643u, 4251107806u, 2765944679u, 2454606920u, 3864173523u, 2241965276u, 1056706189u, 2253371852u), + SC(10455103u, 669421195u, 538798805u, 681593482u, 4243109638u, 2765550308u, 1560790187u, 2332940655u, 157674749u, 358872640u, 2549359913u, 811329072u, 318369228u, 2192271276u, 2616093049u, 3105543667u) +}, +{ + SC(3392929934u, 3483303263u, 1976307765u, 4193102460u, 1186037029u, 2559946979u, 3008510830u, 4008303279u, 2792795817u, 3991995u, 311426100u, 3736693519u, 1914150184u, 2000710916u, 1829538652u, 896726226u), + SC(1506989834u, 781231698u, 1423994091u, 932436763u, 2811140941u, 235158077u, 3312925598u, 1277169313u, 2161654787u, 95045550u, 2507009285u, 3400899479u, 1327874861u, 2641030305u, 845165129u, 3067306163u), + SC(81377829u, 4112377516u, 996390415u, 1466127523u, 1087938057u, 1370439327u, 2374941315u, 3221315808u, 35184362u, 4155013651u, 4157224703u, 3036174627u, 820839223u, 644204168u, 3814924360u, 2548030643u), + SC(1091124676u, 3446444543u, 108918031u, 285417020u, 1457053816u, 2518578419u, 3204558864u, 1447981867u, 3090612039u, 774503865u, 3344583272u, 2737274269u, 3562442510u, 1127429989u, 2804182977u, 1775681652u), + SC(2318905039u, 2047942274u, 566069924u, 123115342u, 2915025724u, 2614503051u, 611479778u, 1680640702u, 111791999u, 3565934367u, 3623017458u, 358904698u, 718271833u, 2594429479u, 2455462208u, 1049889789u), + SC(2072590390u, 2994175732u, 776612573u, 3305897523u, 938985307u, 4037860099u, 405398386u, 312125617u, 834030222u, 4269222652u, 3952042783u, 188369721u, 969558599u, 2241466312u, 1494637662u, 3640394545u), + SC(793329188u, 1680204464u, 4194525713u, 1397937237u, 2203558613u, 193170132u, 590149348u, 3837254789u, 2629901211u, 1547324833u, 4256276761u, 178627910u, 1204782838u, 3049171442u, 2847310157u, 1633221731u), + SC(1445130399u, 3305816299u, 706740166u, 1986021205u, 2637844550u, 1419078314u, 1678054887u, 2432697110u, 870544859u, 890225672u, 4294515721u, 4251895411u, 1276311012u, 1177847908u, 2958585231u, 4245816799u), + SC(4225912221u, 703507803u, 1922376483u, 3748563847u, 841832204u, 937238929u, 1762562329u, 2321245641u, 3396851205u, 4196168123u, 2898493537u, 4105193320u, 3913075709u, 3714213782u, 3736794417u, 1813506206u), + SC(473058800u, 1281200026u, 2096535567u, 1916392924u, 2499055699u, 1592813861u, 1665248526u, 1352252079u, 2539722497u, 3800235497u, 2456011531u, 2486813252u, 2969323588u, 2786889819u, 264256920u, 4162650714u), + SC(4093970658u, 1112717313u, 4105391438u, 692152127u, 3191447576u, 765356874u, 3774754898u, 3659714922u, 1417146611u, 4116649329u, 2382824064u, 4091923584u, 2943998996u, 2572469258u, 2350556732u, 4055180934u), + SC(4241530692u, 3958450744u, 2400383404u, 466315350u, 35062538u, 2419973666u, 1574066566u, 718969713u, 2103427683u, 1844215170u, 377438369u, 3472936858u, 4219642124u, 2727593550u, 2415179286u, 530554266u), + SC(1717990860u, 490767589u, 4104938990u, 1912533482u, 1727757083u, 4081637760u, 2971627803u, 4227474711u, 2482396781u, 1077462396u, 1040490667u, 188422725u, 1078987146u, 1905877850u, 3465315863u, 3779881072u), + SC(2343360099u, 2602377036u, 540592495u, 3215700530u, 2276091252u, 330543342u, 1521140429u, 3101043196u, 1353643940u, 4257187260u, 3766970644u, 3977679607u, 2139641066u, 2691703488u, 1191064988u, 3899819176u), + SC(4020334744u, 3662481612u, 4168714619u, 3391835711u, 3785299560u, 71469795u, 2493742903u, 3412561168u, 3292204549u, 1481564183u, 2157273751u, 477496008u, 931448839u, 2827709521u, 2133135454u, 3513095854u), + SC(1821292885u, 77067071u, 2713776553u, 2767520127u, 1059460035u, 985220275u, 2884538737u, 221640066u, 2657382407u, 232264137u, 3155923068u, 3788271780u, 2919723565u, 1308585734u, 3615447351u, 9588952u) +}, +{ + SC(2320406161u, 892569437u, 3092616448u, 1707673477u, 2810327980u, 4012118332u, 4142748730u, 3869507620u, 92116036u, 2366184953u, 1613655167u, 3287845172u, 3562699894u, 416962379u, 1296831910u, 1764080884u), + SC(220529260u, 249394787u, 707093586u, 3327680194u, 3905189366u, 612327964u, 3292761054u, 3030686883u, 1334491337u, 3207860077u, 3280619568u, 1041320647u, 2483468975u, 1479881667u, 3211575507u, 3039423798u), + SC(2075210586u, 859890386u, 3979249840u, 1571749934u, 1787834945u, 3779262932u, 3834468444u, 2848979155u, 3949299214u, 3265482052u, 521566179u, 4090178483u, 2634506734u, 537774764u, 1760986104u, 1885781444u), + SC(2157623553u, 1245488719u, 2108443037u, 4226304849u, 1701247415u, 4110744868u, 1746909616u, 3191493799u, 846028927u, 3826268145u, 3155840342u, 1303740777u, 3325552898u, 2580884535u, 3592783405u, 4209959030u), + SC(535271984u, 3867256577u, 2621667187u, 479852461u, 3031868718u, 681291605u, 3866870888u, 975222367u, 189285295u, 2489945122u, 4002580885u, 1631683077u, 2806354223u, 990581176u, 3013857114u, 805874285u), + SC(4221232460u, 3061114345u, 3434676469u, 1406782470u, 155821803u, 124504941u, 3888697140u, 2788501814u, 1026476732u, 2216503728u, 3089015914u, 2063998098u, 272392246u, 1587339314u, 677528523u, 2432699241u), + SC(3643892943u, 4282202220u, 2100563362u, 826776443u, 1365722925u, 2702305724u, 679208928u, 3149950187u, 1446692720u, 2990196076u, 3121167752u, 25041546u, 1204401671u, 3950457476u, 478874733u, 4191001246u), + SC(1002796340u, 395169719u, 3087599283u, 10336612u, 2123927609u, 504611529u, 4163730275u, 706425703u, 1588733263u, 4149509341u, 1952228143u, 3819719132u, 766367752u, 1435203845u, 1906598194u, 3492363785u), + SC(1774340829u, 3089482890u, 2870005976u, 919794943u, 2035504962u, 4034646005u, 3486869666u, 3458779364u, 2688966610u, 4246698276u, 241215855u, 1193302498u, 1307583268u, 129792487u, 301354381u, 2759318534u), + SC(1993945167u, 2379081822u, 2587040362u, 3154537819u, 1926143939u, 2749781524u, 935556830u, 4138641196u, 1781637476u, 2939621229u, 45782825u, 4247420511u, 1775642409u, 3169645376u, 1224651656u, 1411268824u), + SC(4099217380u, 332485632u, 702660355u, 2932600301u, 2644542769u, 1705216342u, 2043283695u, 2373746705u, 2092217219u, 1660104946u, 3159676245u, 3674605841u, 226100099u, 3987250021u, 2436672589u, 1083744721u), + SC(775618835u, 2173251804u, 4192653515u, 3582997173u, 3769245096u, 484007740u, 503088416u, 1360222738u, 586791868u, 3760447547u, 3490651251u, 3534666198u, 2531156474u, 1207301882u, 832959081u, 3020069982u), + SC(298341207u, 1349761730u, 1369831393u, 1101983922u, 2409775356u, 3892600618u, 3875266737u, 3482966490u, 4002034047u, 2018792567u, 1932407387u, 1184232926u, 3015567427u, 301694942u, 437132459u, 3636206614u), + SC(4090425889u, 2348669465u, 2575850637u, 3995997864u, 3040420324u, 1615191584u, 2490849366u, 2670494936u, 2841563080u, 3763919842u, 3580970157u, 3864708123u, 187158351u, 2199194387u, 4160227448u, 2176418944u), + SC(3040328915u, 1001466289u, 3676795030u, 2946692141u, 3593888463u, 2224708622u, 4148397123u, 4253879884u, 1993280384u, 1176406404u, 3148404923u, 4180061590u, 1786680964u, 4036906941u, 1164279397u, 3562714780u), + SC(1286200509u, 4232891464u, 1656861418u, 3412215448u, 1086562483u, 2512121988u, 2650588176u, 3097245464u, 3192968944u, 2220731064u, 3414522916u, 4204353060u, 3690514744u, 3688465060u, 2246470987u, 498255717u) +}, +{ + SC(1167035839u, 2632944828u, 1562396359u, 1120559767u, 244303722u, 181546963u, 2941229710u, 561240151u, 1460096143u, 346254175u, 110249239u, 1849542582u, 1293066381u, 147850597u, 3876457633u, 1458739232u), + SC(3571928080u, 2436259038u, 1291130511u, 4109706148u, 535321895u, 223400632u, 1981907545u, 281269666u, 3986674262u, 1137333737u, 1403128295u, 1607985509u, 1996916063u, 3564990547u, 3398899933u, 2822030993u), + SC(4187142002u, 2183119934u, 1635192887u, 2899344980u, 2532710469u, 3583070294u, 1537984623u, 296183513u, 2324170481u, 3475303187u, 3887648540u, 634736823u, 1254765115u, 3808584578u, 3772430219u, 561684376u), + SC(513372587u, 1759503751u, 4262413842u, 2894839952u, 1546497784u, 1634597484u, 3075497476u, 1112503488u, 1318854936u, 1645523550u, 1808408161u, 1471049890u, 1607196116u, 1989192912u, 3845591311u, 3230210229u), + SC(4281800629u, 256065360u, 161761292u, 2162610453u, 3289868207u, 803664088u, 1737988317u, 3468667062u, 1313091619u, 3871261661u, 4163576187u, 3519070773u, 663580583u, 2181685257u, 1282501745u, 373224564u), + SC(1305532007u, 4040631353u, 3016994284u, 364840424u, 312087064u, 2832713285u, 813363164u, 1634515727u, 2857968226u, 2482770921u, 2702964276u, 1457003903u, 4233117491u, 978467573u, 454990490u, 2451215822u), + SC(3309788844u, 1373644165u, 2568421202u, 4021050421u, 3214613315u, 3179866441u, 2282215282u, 4192353052u, 766132975u, 1427735093u, 3905164154u, 3510365574u, 3650419996u, 1208798186u, 2311177541u, 3425106727u), + SC(1485656607u, 1872571460u, 3807266779u, 3227427836u, 1367154025u, 2087101352u, 2787930808u, 1683647111u, 611621831u, 1033465938u, 1055561737u, 1718623444u, 3674681330u, 3643294293u, 3841507882u, 2950124804u), + SC(3583452191u, 43558840u, 2702416786u, 2831018419u, 4179535508u, 3293628424u, 3781032090u, 4272940814u, 1561835153u, 3434531879u, 2033417772u, 143682419u, 2206689113u, 2885101743u, 3330838914u, 3213033967u), + SC(1563269339u, 3268845808u, 481878529u, 1366255066u, 188999428u, 2024859095u, 3740130866u, 1902201859u, 3294724532u, 3498902869u, 2063801661u, 3851840419u, 1697955856u, 1216829830u, 2472036433u, 2158918739u), + SC(3706632627u, 1854832685u, 4075722340u, 3009760070u, 1947919686u, 1613829674u, 3359356634u, 160149010u, 3211678034u, 1403957074u, 2395316449u, 232911190u, 3595342115u, 593590477u, 4003146812u, 1042747586u), + SC(3566751331u, 1293366329u, 237055278u, 781035984u, 3490518265u, 471671502u, 3279573882u, 4088428685u, 3341570902u, 1660948465u, 2602036180u, 3189056267u, 1448251311u, 3378653995u, 367559448u, 1247557023u), + SC(332188181u, 124235367u, 2908363616u, 57405667u, 3860321591u, 2915594808u, 3193053797u, 3103490367u, 2893876952u, 791722516u, 2759950240u, 2647310599u, 1060814304u, 1104815755u, 3283917665u, 954167246u), + SC(3633439037u, 1737408037u, 3240746577u, 2032524778u, 210349431u, 1157873376u, 3552462955u, 3068823u, 2593869163u, 1645741574u, 2624282012u, 1595174943u, 3150496822u, 2635369792u, 3670346328u, 1317499755u), + SC(3066163224u, 734815666u, 3189326611u, 2603442644u, 551273493u, 3201260612u, 896218759u, 1203901890u, 3082479753u, 4206490018u, 1615910957u, 3112412856u, 3354260034u, 1776181406u, 227950091u, 2452682654u), + SC(2235295503u, 3336503999u, 656069002u, 1855251063u, 1400966644u, 100804460u, 3316705750u, 794158471u, 3220130150u, 1524496317u, 4024763824u, 915138624u, 1872936127u, 829155670u, 1406327784u, 3285915916u) +}, +{ + SC(3539989726u, 2664422354u, 3717852078u, 3493347675u, 431408204u, 2534904428u, 166307432u, 1071633271u, 2817060747u, 2307358268u, 3433391820u, 2071844151u, 219511979u, 303896099u, 3062367591u, 2892429963u), + SC(4169968731u, 2129799654u, 437437237u, 369342547u, 1225909990u, 105177072u, 378686654u, 1403688950u, 3897807924u, 3252342965u, 1215424641u, 560413328u, 1897408132u, 317929004u, 3828647679u, 1630564758u), + SC(2120346993u, 1574861569u, 4055542703u, 3156063114u, 2155135979u, 3395705935u, 3607950162u, 1649229112u, 1891339524u, 2871189526u, 475543260u, 4035849276u, 919486311u, 4103998043u, 2581732188u, 3337457769u), + SC(2650342494u, 2112594502u, 300482146u, 4214370423u, 3712572735u, 2394678491u, 944484075u, 2859174140u, 1298074617u, 4123981874u, 2931863188u, 4060402101u, 408241016u, 1141274074u, 2343754010u, 2412599648u), + SC(1561545950u, 3513590208u, 46110254u, 2131948246u, 1318148204u, 2154872738u, 1632214749u, 3758828119u, 3082206346u, 1424038120u, 2361241545u, 845137641u, 307971779u, 1724404993u, 861282060u, 1237934782u), + SC(2774909901u, 771645224u, 1285073837u, 2193431137u, 1992145786u, 1323638656u, 695741715u, 2225025760u, 1506694954u, 4281622541u, 648809495u, 1264275594u, 2179049970u, 2134563430u, 1143161913u, 1676304803u), + SC(146493114u, 1026262009u, 3602767471u, 2183478058u, 1903997235u, 4037497130u, 232766761u, 3333583275u, 4037065903u, 338762279u, 3658077565u, 3465013868u, 2987748329u, 1503145496u, 1553131083u, 2250198737u), + SC(2341715858u, 2700579248u, 3859696179u, 2395756825u, 1875611477u, 3083700335u, 3413235310u, 1368601544u, 2011324934u, 2489277894u, 3393073269u, 1479863073u, 1546719681u, 1270920228u, 832404816u, 4096637834u), + SC(3098090164u, 3937526885u, 3922595589u, 3117243593u, 3619511456u, 687964457u, 2049777986u, 2737216841u, 904576627u, 2497431372u, 3782524472u, 2176150332u, 3538905622u, 1249874595u, 386091287u, 597337724u), + SC(653517061u, 2613638042u, 3043803086u, 3430911227u, 3939946327u, 3394071887u, 1634025406u, 422896314u, 2056719107u, 2825344479u, 4064697313u, 3122017483u, 3752686726u, 3984230999u, 2989927946u, 36279219u), + SC(2977387875u, 1756856293u, 2305658602u, 3898809838u, 2022534013u, 3053356239u, 1719149320u, 1006974664u, 3980567886u, 911250528u, 3970581037u, 4208855094u, 2375475175u, 3461024498u, 4207299460u, 172606632u), + SC(2123341088u, 2610619360u, 3636249805u, 2405928311u, 194895330u, 4166746397u, 1666551241u, 3089845290u, 830253287u, 1769367456u, 492844122u, 2898915009u, 1465071417u, 1748645392u, 3136192983u, 3149049830u), + SC(182090295u, 2773063932u, 2875617227u, 2014878906u, 4034576690u, 3504190878u, 648632813u, 578906269u, 3395653562u, 3622802446u, 1642118462u, 1105217635u, 3484288771u, 4187487776u, 3066363798u, 3248936252u), + SC(154149828u, 3967951687u, 1435057545u, 77065166u, 3232269485u, 3912916706u, 592527655u, 4277917673u, 3417904405u, 3905839920u, 1437307359u, 2532079592u, 1386597940u, 4043192840u, 828125384u, 1712244674u), + SC(4144828863u, 1262971610u, 2738002832u, 3848745747u, 554156666u, 3660926287u, 1405749523u, 293551868u, 956195932u, 2061195588u, 3476646641u, 1003448777u, 4182963546u, 1462193925u, 2827901865u, 1370898532u), + SC(287054389u, 4206061741u, 3909899140u, 2957058664u, 2712205523u, 1231432323u, 1252507865u, 2198483068u, 3163354130u, 595880373u, 2050058791u, 535083586u, 4093274722u, 251534866u, 1425149793u, 2349787856u) +}, +{ + SC(3015000623u, 325176924u, 3212623969u, 1014540936u, 2686878702u, 3453922035u, 257234635u, 689320672u, 395365200u, 3425465866u, 3351439740u, 3293249321u, 2261203941u, 1504215424u, 2365812346u, 2486464854u), + SC(2802351214u, 1019547153u, 1581443183u, 2237644987u, 2316167912u, 1277137594u, 922833639u, 1775757119u, 2259030628u, 3320484395u, 3474839377u, 3039388985u, 3157017009u, 701728799u, 45087422u, 1375130067u), + SC(1408178651u, 332882372u, 2572930650u, 1429622838u, 3740348959u, 3769865143u, 1102404486u, 2395773863u, 2055053046u, 1642858333u, 434575788u, 1458579645u, 1077283311u, 3435370625u, 412513198u, 1108997u), + SC(166351317u, 1290556120u, 1492697218u, 3828755332u, 1787027698u, 2627329842u, 818520792u, 3844511768u, 1093689215u, 2840813230u, 4268955351u, 1793367442u, 1197897289u, 1467402002u, 558600125u, 4039642298u), + SC(2618143148u, 4195387407u, 3571081448u, 176847982u, 3021045559u, 2151239299u, 4216918791u, 349987936u, 1438071630u, 2148079477u, 510134808u, 1844452199u, 3473619148u, 3775643892u, 3701006526u, 2069649956u), + SC(2536827719u, 256373429u, 82685205u, 2031847695u, 1685669223u, 3749398630u, 3100433967u, 2559626296u, 2614261735u, 2095898325u, 2650411530u, 4139725354u, 2433652522u, 1465137472u, 3074463995u, 2942034210u), + SC(950856594u, 2511634642u, 447889167u, 3271534101u, 3998181635u, 850059409u, 1500318444u, 2845728509u, 2319192144u, 1285732158u, 3307511706u, 1860111207u, 106597122u, 1317987028u, 3909997475u, 2833499319u), + SC(197466102u, 106471666u, 3969627291u, 425148315u, 2088018812u, 3287551129u, 2083642145u, 386904296u, 2967132086u, 417456225u, 2418726206u, 2685222098u, 3920069151u, 388803267u, 1008714223u, 4223482981u), + SC(1730602173u, 1587573223u, 1136504786u, 801576255u, 1239639300u, 3897044404u, 2640640405u, 3098571739u, 2095045418u, 1782771792u, 2216047065u, 2006450887u, 1019963460u, 450135304u, 1704523436u, 4178916267u), + SC(3045516080u, 2837283309u, 3652809443u, 3617799274u, 2953845221u, 1870697859u, 1987277049u, 671334013u, 2347392220u, 1637733040u, 408564290u, 531095235u, 1714215546u, 2668823252u, 4291679007u, 1499030154u), + SC(1785804164u, 3771923969u, 1688952513u, 4078905240u, 4219818381u, 2140263698u, 3560443409u, 1027592498u, 981877075u, 1273450409u, 1808708945u, 366130160u, 1509712333u, 1419790056u, 3592515372u, 1023304152u), + SC(689558936u, 2052202277u, 1573780309u, 1046114431u, 1768897198u, 1193436549u, 613072153u, 961650488u, 3203433527u, 2587127126u, 2088764244u, 3898254742u, 1779313411u, 2448405043u, 2102013432u, 2635393468u), + SC(2025692259u, 905848568u, 1759010770u, 1792571870u, 4118995060u, 266283808u, 4139640706u, 3438115348u, 2780184652u, 3445643695u, 656585512u, 181166262u, 2272629776u, 370943424u, 1751557846u, 2309122167u), + SC(267180733u, 424783777u, 1080203254u, 2661909603u, 1424050736u, 3737445342u, 2397112235u, 1140319020u, 3540605726u, 1560404816u, 714090654u, 3305695922u, 4001926073u, 4235374954u, 2250613806u, 603974704u), + SC(244840167u, 1554020100u, 3702066775u, 2862773506u, 3785435454u, 3651035430u, 218349583u, 1404753202u, 3766478445u, 2586133471u, 1533117238u, 4149938439u, 2210912076u, 3594357012u, 575816505u, 525962129u), + SC(4146528898u, 2136081288u, 1410528199u, 2682243562u, 3659634297u, 3884779676u, 1276188622u, 3650143718u, 2534539131u, 69352587u, 4188728680u, 4144009400u, 528573366u, 1948891771u, 2778384350u, 3961787045u) +}, +{ + SC(771871546u, 3238832643u, 2874232693u, 1176661863u, 1772130049u, 1442937700u, 2722327092u, 1148976574u, 4122834849u, 744616687u, 1621674295u, 3475628518u, 2284524224u, 1048213347u, 4058663310u, 153122870u), + SC(2125145888u, 3034373129u, 148397811u, 141146887u, 2520820550u, 761993323u, 2298029094u, 2891332110u, 2829144983u, 2531560926u, 2167918181u, 3311166313u, 1986747894u, 2110826144u, 1833688282u, 2697250572u), + SC(3869871954u, 4004844136u, 2445592287u, 191554676u, 1824322074u, 1934754654u, 1806989779u, 631655906u, 1640478312u, 3779394326u, 3878618879u, 1897296401u, 116845712u, 1282189569u, 1638341398u, 253193742u), + SC(869049848u, 3185853214u, 1086566153u, 574813225u, 768296876u, 2336838903u, 1037196762u, 3581040974u, 1545806877u, 1185761684u, 533220394u, 2594450382u, 518321105u, 3416686830u, 2271268151u, 3918676320u), + SC(3856331543u, 2684505765u, 649861433u, 2052378851u, 4281491040u, 1056350427u, 1268888422u, 3791019043u, 2372988231u, 1754646015u, 3964172838u, 3080977165u, 1940074122u, 2762476976u, 3389041795u, 1131517310u), + SC(1630655860u, 1949945516u, 3883647184u, 3029959080u, 1311781856u, 408642488u, 2800393690u, 3410356207u, 115351401u, 3420630797u, 2709679468u, 2872316445u, 1790203899u, 1997501520u, 3278242062u, 551284298u), + SC(2323279372u, 1575922229u, 4047150033u, 1372010426u, 3148623809u, 2453870821u, 2339486538u, 2280451262u, 2466099576u, 2994948921u, 132102763u, 1776872552u, 3906687848u, 1416385780u, 2716658831u, 3839935313u), + SC(1482060017u, 4064599659u, 4201421603u, 1862488009u, 1206323034u, 1506270647u, 4148487892u, 2940354206u, 221477839u, 2184047858u, 1052602625u, 1800724448u, 2376949890u, 1248004043u, 4042069004u, 1001474649u), + SC(1973975072u, 2109156381u, 895285550u, 2806725496u, 4257596779u, 2294716595u, 2126073388u, 4029509053u, 2287557214u, 3863235224u, 910675328u, 3403565516u, 2460443864u, 4145068647u, 1675629270u, 2972605807u), + SC(3067953236u, 2487048107u, 1053067642u, 2406833819u, 1120120518u, 2019615106u, 2151977185u, 2444444329u, 3698388134u, 2675794597u, 2346696087u, 3691916163u, 416413840u, 2548582733u, 2519917531u, 3323365251u), + SC(4258867839u, 1450083676u, 3423817219u, 2338254228u, 956448310u, 2038800503u, 2270893323u, 23474499u, 4001071451u, 434241187u, 4225947271u, 3009484949u, 1212186223u, 3021170789u, 3408787844u, 4241328442u), + SC(544425045u, 2335106449u, 1970249987u, 676962447u, 2451092807u, 3397085111u, 644609608u, 622894566u, 3012162452u, 742316904u, 1183695331u, 1942632009u, 3993963459u, 2025380463u, 2934502595u, 2424729664u), + SC(489227787u, 2064607364u, 749046162u, 1223089239u, 4103152782u, 944881113u, 2156101348u, 2809656549u, 2750173639u, 2290439348u, 455194332u, 3662094961u, 2388553957u, 2373693996u, 3087294434u, 714908241u), + SC(844100070u, 1293873339u, 240400805u, 2741251793u, 4185619158u, 3756747900u, 2600026127u, 4095003808u, 2551250677u, 1982555415u, 1538344606u, 2598805396u, 1759235723u, 1251966u, 1750681115u, 626531732u), + SC(3996016258u, 3876613311u, 1191787057u, 3901742282u, 1577096572u, 270596184u, 3165567618u, 4061944625u, 3613068329u, 3912630805u, 2056061785u, 2568706449u, 2343664228u, 1807908509u, 1314728487u, 1028342757u), + SC(2729604648u, 2866824008u, 1921075953u, 959207538u, 460881358u, 1786258799u, 989199155u, 1140694999u, 3534517067u, 1671080238u, 1077292982u, 69981150u, 2456995550u, 2177711190u, 3355630373u, 505438766u) +}, +{ + SC(2470971363u, 1622646280u, 3521284388u, 611900249u, 53592433u, 1667691553u, 3986964859u, 3228144262u, 4160240678u, 1357358974u, 796266088u, 2135382104u, 2999113584u, 425466269u, 866665252u, 3795780335u), + SC(1943673032u, 163567132u, 2998325065u, 4151760187u, 4286963295u, 2037110896u, 4023804057u, 2843670454u, 4267379728u, 470850548u, 1360194572u, 542908383u, 117354082u, 3909600634u, 3301531838u, 585104523u), + SC(421763950u, 3621776882u, 1804759030u, 1922063749u, 28357531u, 2718763721u, 3528327041u, 2594458380u, 1745913977u, 1705774731u, 3785007083u, 1889010688u, 4275556992u, 2808027536u, 1706627542u, 967259307u), + SC(3761989171u, 2069950976u, 953323220u, 30139149u, 3360357391u, 466334029u, 1085748790u, 717259079u, 3822910993u, 1348849055u, 4159668773u, 3924702853u, 4257335520u, 1714446370u, 3394938265u, 2541598048u), + SC(2132231371u, 3951042779u, 332537683u, 2179456991u, 3112576172u, 2873883577u, 502046554u, 4014018248u, 4272356370u, 2124475345u, 3140973257u, 1234959848u, 3468807232u, 3812306463u, 2768101189u, 3493652974u), + SC(2983624056u, 158967077u, 546553405u, 3473936990u, 3742593866u, 3986716933u, 2905591308u, 285301696u, 2640868047u, 3062221467u, 70156428u, 150492378u, 3977001273u, 1087159682u, 1233481348u, 3391921638u), + SC(3432795737u, 4256529583u, 3151717298u, 4190687875u, 1563633254u, 158068428u, 685294219u, 733826550u, 2829744078u, 4225504275u, 2375584227u, 1429440840u, 2192098666u, 1015042413u, 840775854u, 41702830u), + SC(3231767315u, 1865273494u, 1093659663u, 1873962287u, 1664376931u, 1435837948u, 31100007u, 316783664u, 996300708u, 334486049u, 1648124912u, 3615910102u, 2480590997u, 2253624363u, 548978494u, 3975730498u), + SC(1923874249u, 3947343158u, 2264687656u, 1121555015u, 3593673308u, 289357572u, 3048054908u, 3707221766u, 2043411687u, 1708537123u, 3350208529u, 2939237811u, 2793137666u, 3370678100u, 1405378414u, 2235087472u), + SC(139882711u, 1304366355u, 1276034712u, 2139658031u, 2197726287u, 3663457902u, 2357615523u, 1611719773u, 2323318078u, 260257531u, 2850134214u, 3099029628u, 553263652u, 173876122u, 2118167747u, 1771928540u), + SC(566458485u, 3545725305u, 2257836680u, 2245189792u, 1605297549u, 245844769u, 2016071772u, 1896412522u, 821618527u, 1870442187u, 3958912319u, 4032980189u, 2069248247u, 4226059888u, 3345680132u, 1791157180u), + SC(4148097755u, 2486537082u, 4003164230u, 2318687306u, 2491702264u, 229564758u, 4126839602u, 211561653u, 3452304873u, 2572510204u, 1630441069u, 3167885411u, 4175966562u, 1295680948u, 161732432u, 107333173u), + SC(1923252062u, 311708286u, 1678166990u, 3717252154u, 3161198614u, 1069601573u, 4091259962u, 359278439u, 3768419820u, 2520693990u, 650972975u, 383288062u, 1217231824u, 2559091429u, 4278580592u, 2250271391u), + SC(510621576u, 1629846927u, 3397488683u, 961386517u, 653633283u, 1754007094u, 2769834941u, 2247122605u, 2701964981u, 3912616774u, 3406969249u, 63999109u, 3141040146u, 2619453260u, 1468121925u, 4171492447u), + SC(3961993547u, 1155134029u, 1496861029u, 1279080034u, 2846121209u, 3483514199u, 2468398271u, 505281559u, 3532558643u, 2311328115u, 2310583909u, 3085705085u, 2999958380u, 2683778623u, 32663880u, 1366954658u), + SC(3799286526u, 1580228485u, 2766986278u, 586308614u, 2894037718u, 587959438u, 1301020570u, 2323176208u, 3827747523u, 2955860540u, 455053544u, 124753776u, 703403555u, 1658788582u, 3867772588u, 3276199889u) +}, +{ + SC(2899222640u, 2858879423u, 4023946212u, 3203519621u, 2698675175u, 2895781552u, 3987224702u, 3120457323u, 2482773149u, 4275634169u, 1626305806u, 2497520450u, 1604357181u, 2396667630u, 133501825u, 425754851u), + SC(373198437u, 4218322088u, 1482670194u, 928038760u, 4272261342u, 1584479871u, 2503531505u, 354736840u, 303523947u, 2146627908u, 2295709985u, 233918502u, 3061152653u, 3878359811u, 3090216214u, 1263334344u), + SC(2076294749u, 898460940u, 2754527139u, 2099281956u, 3551675677u, 4195211229u, 3603181913u, 1984445192u, 1121699734u, 573102875u, 2187911072u, 656800898u, 1477748883u, 3685470532u, 3965328576u, 4253954499u), + SC(1876288412u, 2267864341u, 434083874u, 1779401913u, 2781669786u, 3073195348u, 669142308u, 3636028767u, 127310509u, 372075961u, 2537369503u, 2705808591u, 971889633u, 2718294671u, 1415139024u, 276903675u), + SC(3596445084u, 2918342013u, 1827011883u, 3900260359u, 1783558754u, 1921301616u, 3293933601u, 1111091218u, 3238604202u, 967515902u, 1208493040u, 1614341552u, 903992012u, 480937886u, 28823639u, 2379076161u), + SC(1968094521u, 1600813704u, 2958098796u, 909224758u, 1752381729u, 3115930502u, 3643078327u, 2863416031u, 2510423171u, 2162796973u, 1796627662u, 3678673773u, 239312629u, 2457874359u, 3809753210u, 2494718541u), + SC(1731463174u, 4265769542u, 194787641u, 1036371942u, 1745836602u, 660344840u, 1082796561u, 3963871960u, 4001246025u, 3118794916u, 3886266100u, 1928084049u, 3032262555u, 2306541818u, 3921311698u, 2426451176u), + SC(4018285402u, 658949239u, 1329629679u, 2738829796u, 776877685u, 1774949833u, 2797031752u, 3236392582u, 2542061420u, 1832249084u, 183211998u, 1840198657u, 1314474881u, 3361925365u, 3440999944u, 974653576u), + SC(1671164742u, 4271520021u, 1517391404u, 3289979834u, 1233503784u, 3050636514u, 3728319521u, 2919957525u, 3518724155u, 1272537958u, 3303667759u, 3864284110u, 234069183u, 1495943844u, 1989482539u, 3056780355u), + SC(1575547612u, 2187321001u, 2701011625u, 2761636008u, 1864623673u, 3995428494u, 1950725639u, 3749309698u, 2711714857u, 3743669273u, 3222519898u, 621366782u, 2554696188u, 176315043u, 1467854493u, 1806812435u), + SC(1182422499u, 3354985654u, 814715964u, 4226927046u, 3360200226u, 2503195953u, 1526762508u, 3747376732u, 1505823655u, 3718914053u, 2708056196u, 1868291203u, 1664951819u, 1982491563u, 751360443u, 1075645602u), + SC(101076600u, 386741863u, 2955045918u, 1653351871u, 1070602553u, 321875967u, 3200546966u, 2632915072u, 225765461u, 1759013254u, 4169466720u, 3880757831u, 1769634729u, 2642211393u, 4245887731u, 3909815727u), + SC(2379322656u, 1554830911u, 1971754317u, 1058862290u, 623917994u, 2775317172u, 3261049248u, 1667374591u, 3883068608u, 3752131736u, 2607464936u, 1251402973u, 4056909038u, 937468613u, 309280197u, 1804321090u), + SC(395093976u, 2154850233u, 624748058u, 3473623511u, 530005996u, 1656467301u, 451942772u, 3238178099u, 691726480u, 2563588439u, 3675387583u, 3294893253u, 1205949092u, 3844564019u, 114533547u, 4193437592u), + SC(1241354591u, 1121646490u, 1686974686u, 3373490541u, 1189649937u, 2948191343u, 2978671156u, 3827318062u, 3377194192u, 3805066092u, 3271994064u, 2484020181u, 549626522u, 1166583694u, 3299399570u, 764854172u), + SC(2808929206u, 427994673u, 2338143204u, 3942895356u, 2304289727u, 1468778908u, 1350679341u, 3972686632u, 2399853022u, 2097821409u, 3799931826u, 2500883276u, 1352425312u, 3372587055u, 596007302u, 2017539287u) +}, +{ + SC(172527491u, 737404283u, 1378219848u, 1967891125u, 3449182151u, 391223470u, 304889116u, 3996348146u, 1311927616u, 1686958697u, 766780722u, 1429807050u, 1546340567u, 1151984543u, 3172111324u, 2189332513u), + SC(3269764283u, 1288133244u, 1314904801u, 996741356u, 1884733412u, 1544206289u, 558284137u, 1518251699u, 1924323147u, 1635892959u, 1275016917u, 3776324356u, 1705865502u, 202621081u, 499067715u, 3311904259u), + SC(2660619816u, 3307703068u, 1451637465u, 3851776926u, 2364760323u, 1977782632u, 1515607226u, 1445106389u, 2327693248u, 2319920969u, 1115274896u, 1834441597u, 402374626u, 1205432354u, 1396686295u, 491780324u), + SC(1996097434u, 731516361u, 974312078u, 3421366629u, 3812294134u, 3978884039u, 3352635742u, 1797690428u, 13489496u, 1642706934u, 3128398168u, 106641350u, 4016459895u, 2470770670u, 115922099u, 2925890710u), + SC(2686884812u, 2748914055u, 1937433663u, 756783569u, 413219250u, 1566264233u, 3400883298u, 1726270584u, 1877719428u, 1988282262u, 4210071735u, 1623567192u, 186026227u, 1235988261u, 878101455u, 3591361377u), + SC(4053231115u, 4124107153u, 3534184341u, 1110486344u, 81952807u, 4125498697u, 1693462482u, 2990125452u, 3439709895u, 1055710168u, 4246237022u, 1943085528u, 719511299u, 700284484u, 1082914808u, 1529874921u), + SC(1481485493u, 1935423659u, 913226612u, 2395711383u, 1541429099u, 2771316424u, 3338417471u, 399999946u, 26796724u, 1562275554u, 2290450886u, 1574607684u, 2722372873u, 1229315759u, 1998792801u, 1299123352u), + SC(3949810665u, 1328858449u, 2680298883u, 4060684833u, 1165923991u, 2656262528u, 835037267u, 1633040358u, 3109606689u, 3612027263u, 1850965274u, 2501035455u, 1956880692u, 2989837601u, 2991272131u, 514909703u), + SC(3542886422u, 2995653583u, 3564619313u, 2091503271u, 1371789218u, 2765269616u, 3068810600u, 1666719265u, 2118314133u, 3335278251u, 3361418207u, 807286765u, 899334530u, 3994904643u, 2747385847u, 3528707340u), + SC(3132681349u, 3533155425u, 2330764867u, 3555018576u, 1500828005u, 1243623897u, 1071818853u, 2130356426u, 4099162373u, 1333917673u, 445413180u, 915835391u, 3998951530u, 3932499234u, 2014496944u, 1476384528u), + SC(2104877156u, 1430391164u, 3607724722u, 2456386351u, 3275987562u, 653382938u, 360082336u, 281545563u, 2556998173u, 802173963u, 1898654040u, 2873697709u, 3526274706u, 30023701u, 1532464389u, 335648001u), + SC(1216717657u, 3420164715u, 1026103527u, 2814363815u, 3399248527u, 2265457834u, 4230549954u, 3191596424u, 2096767009u, 197782440u, 661821193u, 3129199915u, 3603027595u, 571989255u, 3350141303u, 902722054u), + SC(86788496u, 2319129483u, 1051755765u, 871757145u, 3910221139u, 2373267495u, 991927221u, 3506242540u, 2918237538u, 555183593u, 3050652275u, 2550066259u, 1935622924u, 1141386013u, 1915989302u, 1193809339u), + SC(2961067645u, 912271025u, 3829956364u, 976054309u, 2426360429u, 3756714048u, 860863671u, 2976390123u, 651422564u, 3348472580u, 4062622529u, 3566918328u, 1262646615u, 526922344u, 336090107u, 3690353753u), + SC(1104160934u, 638409761u, 4090697585u, 3951520784u, 412890746u, 3037968225u, 623962484u, 1861465265u, 4172453316u, 2731726287u, 468253494u, 2636411583u, 2233875405u, 976659501u, 1885152597u, 441456529u), + SC(228814647u, 3127034711u, 536841111u, 970423620u, 335496573u, 1496573821u, 3839638808u, 2076574157u, 3960354230u, 1830746438u, 2136594363u, 1397484405u, 335074021u, 421124372u, 4043995000u, 1296743377u) +}, +{ + SC(2759056966u, 2773771898u, 915395955u, 378399267u, 1065424189u, 3786627878u, 2430240867u, 1910948145u, 1268823138u, 2460932406u, 2049702377u, 3729301642u, 2270156417u, 2935515669u, 1488232015u, 333167852u), + SC(3963231590u, 2717344665u, 3330507643u, 2069094492u, 1576271806u, 844971343u, 3725773593u, 3293220801u, 1933125411u, 1106657228u, 3650404527u, 3511000962u, 3309805512u, 23235466u, 884265026u, 3867812812u), + SC(2380535986u, 2007649740u, 291610222u, 4151143005u, 2330231880u, 3336494284u, 4079710776u, 3045731925u, 300175272u, 1753290057u, 2323446107u, 2448133203u, 1897525100u, 62520621u, 938748110u, 2483424933u), + SC(3941565796u, 4020457560u, 536627435u, 849338423u, 1622694903u, 2253013822u, 1890968103u, 2458058141u, 2431563444u, 3273994144u, 2920282564u, 2871620844u, 315460419u, 2331615405u, 105614140u, 3825521500u), + SC(1770365960u, 436268948u, 2889892729u, 3688514673u, 3952720709u, 1774783907u, 605504449u, 2947048934u, 38294098u, 846447109u, 2199988078u, 482652009u, 58745901u, 1043251865u, 1692020085u, 2977904741u), + SC(3749156389u, 3930496686u, 342096417u, 2961755248u, 1791611872u, 2622150301u, 1430397623u, 2049694734u, 1457522946u, 1307567328u, 1594457791u, 2920040322u, 2838823131u, 3221083429u, 2327375059u, 307491364u), + SC(439175999u, 704562179u, 1530705937u, 343762620u, 1895613568u, 82869187u, 23704978u, 3831637605u, 1611450850u, 923617677u, 3571146990u, 2520538539u, 2376639038u, 2377370369u, 3624250410u, 3615349574u), + SC(764309941u, 395778606u, 890380761u, 1156064327u, 244397938u, 560614464u, 4033284221u, 1090955901u, 3643294611u, 2912576497u, 772374999u, 2861631454u, 564730390u, 3124994653u, 646536012u, 3616789797u), + SC(3040822479u, 2767342245u, 2776280569u, 3485527708u, 3592541314u, 980436690u, 2153312390u, 215781809u, 2169043418u, 2501125521u, 3698439429u, 3999324854u, 2793459908u, 501030861u, 3583683133u, 3712651293u), + SC(4078810936u, 708788696u, 3557269243u, 3488736225u, 3893932756u, 4164798985u, 1241795187u, 3595203666u, 2393791384u, 3416169943u, 714289829u, 1522223608u, 2613922570u, 3640037692u, 3871460094u, 693107847u), + SC(2095442944u, 4280954881u, 166522183u, 982064125u, 4072843681u, 2413289870u, 966372633u, 3054322365u, 3306439070u, 657208192u, 175957468u, 411297739u, 771116169u, 1596617487u, 3454202820u, 2489020407u), + SC(1474971529u, 4158663721u, 2047384831u, 2598838221u, 256974012u, 2456523417u, 631366020u, 3323296862u, 3331748634u, 1360209248u, 3346726166u, 365777010u, 1290850614u, 2085594058u, 2979720197u, 2832663037u), + SC(1555709774u, 2326491405u, 2273744879u, 2585453209u, 2182701308u, 3405285511u, 2624534747u, 1273093088u, 862771016u, 2571185727u, 2627816705u, 753650915u, 1122934423u, 1670176575u, 3747348599u, 2369664950u), + SC(90900628u, 2102730721u, 781890942u, 2802660398u, 1018645876u, 4115262915u, 4149550831u, 3399458752u, 3886843346u, 2763694604u, 1310436099u, 1905281291u, 3814148817u, 4190880658u, 4069475791u, 3679310561u), + SC(2090876031u, 2877257381u, 2723690078u, 1430728835u, 1519931567u, 1820574481u, 3028789440u, 1269332520u, 487867652u, 423473929u, 386546855u, 57358783u, 1188070806u, 1428826466u, 1782333616u, 177182180u), + SC(1560550296u, 3093603077u, 293048812u, 568213435u, 3420818052u, 2217333393u, 3134601365u, 71485947u, 1184987600u, 3737951852u, 162939585u, 1604396734u, 102336303u, 398862141u, 820178097u, 490472018u) +}, +{ + SC(1198357412u, 890731121u, 697460724u, 351217501u, 1219769569u, 940317437u, 2678867462u, 4175440864u, 2131908090u, 1470497863u, 3243074932u, 494367929u, 1767796005u, 457609517u, 3543955443u, 4149669314u), + SC(3330984275u, 2556191310u, 3686726368u, 344917147u, 3386773283u, 2065247867u, 3908122913u, 3695674005u, 2012204991u, 2693522884u, 103992040u, 209624682u, 1376640025u, 3686868767u, 2902487256u, 913177313u), + SC(51667624u, 2920015049u, 3017253519u, 1071812123u, 2571723173u, 2160964558u, 1290623835u, 537361271u, 825729747u, 1392761590u, 1142623949u, 609149740u, 478665972u, 658807909u, 3553467330u, 1636424506u), + SC(3616504574u, 1808500084u, 668829693u, 946464586u, 1979729368u, 406956181u, 4175922839u, 412791377u, 2386664246u, 1192624407u, 2943858119u, 2548487829u, 1705793661u, 3457595727u, 202485393u, 1924721832u), + SC(2189382710u, 4186169698u, 1109472631u, 1983920883u, 3607145598u, 92147950u, 1402492489u, 429006982u, 2674194346u, 4283195956u, 1593180543u, 3760708566u, 643378372u, 4031840072u, 3394015175u, 1558737750u), + SC(1805700700u, 1754525187u, 1654624487u, 2216136944u, 68436239u, 2233918826u, 2968997668u, 4123197178u, 634669625u, 2517670383u, 3007433093u, 3522650191u, 696793327u, 1110232330u, 152147442u, 726198231u), + SC(742639492u, 3149716575u, 880320409u, 4630949u, 1505653181u, 1071542118u, 3069898832u, 2578767084u, 1314905164u, 2213468220u, 3680194608u, 2445142726u, 2802637025u, 3977804516u, 1184600151u, 419058566u), + SC(1336605659u, 403108152u, 2724587657u, 3679190711u, 2874389193u, 1647236788u, 3333657299u, 528273159u, 3515102004u, 947876802u, 3658623910u, 174276546u, 653934448u, 3828171172u, 1444811038u, 2933240663u), + SC(339431464u, 3233735983u, 2646677300u, 43177515u, 392637796u, 1436471495u, 1239428896u, 2348305406u, 2289915967u, 3084305790u, 3250948245u, 178888356u, 2146779246u, 4234024427u, 1032696742u, 3905672369u), + SC(961540617u, 2841143833u, 962675692u, 4171962245u, 2791421965u, 2368576296u, 3328980779u, 2916707843u, 1558316022u, 134331787u, 2460382133u, 1215270659u, 146717643u, 3198704598u, 2091590890u, 2460305557u), + SC(1042706599u, 2034894580u, 690504458u, 2345543782u, 4005260856u, 2432547988u, 112379796u, 3543073874u, 835904670u, 2590827554u, 918469413u, 3408148837u, 1789043194u, 1729294718u, 1834822488u, 2928788408u), + SC(3301658713u, 837504950u, 1727706187u, 1845900341u, 896114239u, 2352826711u, 3111232113u, 2017659422u, 2679415011u, 2370224692u, 3953323203u, 2250773775u, 1103871456u, 1933857783u, 3328123972u, 3307902309u), + SC(1767706194u, 3006067357u, 35851140u, 3240494485u, 2221989856u, 1899667734u, 6385932u, 2363969169u, 4105037265u, 1831329288u, 2027489194u, 884350865u, 1094001278u, 159320441u, 4110377537u, 68569781u), + SC(1525490260u, 665735034u, 2452169880u, 171203360u, 1236274187u, 676156893u, 1374080130u, 357190845u, 1839504596u, 1514713169u, 4060710869u, 1096636593u, 2588809028u, 3627704311u, 1809407212u, 476953361u), + SC(957000182u, 26105440u, 3440739633u, 2098069989u, 1584380370u, 2860012851u, 1732766592u, 212521659u, 3179187407u, 887560394u, 2490695882u, 2732057577u, 1018218231u, 3635922188u, 2062474881u, 2513446682u), + SC(1107263183u, 578424674u, 37103195u, 466969755u, 2523291988u, 291121216u, 3279675483u, 2003600853u, 4199013737u, 2715326244u, 4169142308u, 3686083459u, 3512922856u, 3093381668u, 1195683747u, 1393205701u) +}, +{ + SC(1331866444u, 3086683411u, 308412705u, 2554456370u, 2967351597u, 1733087234u, 827692265u, 2178921377u, 289799640u, 3318834771u, 2836568844u, 972864473u, 1500041772u, 4280362943u, 2447939655u, 904037199u), + SC(2575383612u, 3753748540u, 2811819999u, 1587868018u, 1038431720u, 790984055u, 3731301644u, 1846621966u, 951964491u, 415041564u, 2200992348u, 4272384400u, 296027191u, 4287888493u, 2854418940u, 3573682726u), + SC(1970740379u, 2607713160u, 3470587124u, 930264002u, 1173824281u, 122965335u, 3335069900u, 326806848u, 3632692886u, 129472919u, 3226625539u, 2728837633u, 416887061u, 1130551300u, 356705234u, 1369994655u), + SC(4223755401u, 2079062379u, 3389104769u, 4073338565u, 3689225172u, 440818499u, 856809827u, 381405275u, 127244068u, 376610605u, 2598268701u, 2534766433u, 2820385475u, 4294123141u, 330930335u, 318185845u), + SC(761419527u, 3536226585u, 2328998689u, 3591334816u, 1578134205u, 1103093801u, 3418753973u, 3588283844u, 1530820786u, 2684864777u, 924992522u, 3557568163u, 1869705595u, 3313643247u, 841618349u, 1632346896u), + SC(3475240082u, 1688964704u, 2950217939u, 2829510968u, 4218043142u, 1723444205u, 599182149u, 3585292920u, 1201476124u, 1461631424u, 3796636907u, 3015591958u, 325310290u, 4221903599u, 2685464188u, 843835594u), + SC(3270571096u, 3849271420u, 2838244847u, 4029431364u, 3703574760u, 3266810236u, 1964057057u, 1045028730u, 3535646880u, 4117469088u, 268273252u, 28527135u, 616206627u, 3498685014u, 1783632491u, 2430589238u), + SC(1270864764u, 2335784868u, 3187652054u, 3487500065u, 3514696661u, 4279511860u, 2691960889u, 1283768022u, 3239440117u, 3088430000u, 3270700109u, 2562105500u, 920167200u, 797042551u, 4008345612u, 1713652205u), + SC(1233553764u, 2449552413u, 3139739949u, 2886523083u, 3648218127u, 435238208u, 231513377u, 3598351734u, 1003225207u, 1550611030u, 4262337852u, 2819804714u, 3244463273u, 2073740987u, 855086785u, 975917304u), + SC(2715954175u, 3495328708u, 4029028922u, 3684471179u, 2815956881u, 3599669751u, 4163140273u, 33191313u, 2635890672u, 3683103094u, 1579697202u, 287936530u, 2496546027u, 832886459u, 1241267398u, 3564329642u), + SC(718666875u, 1628061148u, 3834972005u, 11037458u, 3790987439u, 2312775807u, 3375415349u, 3089087440u, 2679862136u, 918687461u, 3176925215u, 1435039099u, 1342114588u, 1906963252u, 3488735014u, 1611160706u), + SC(4216184459u, 1084561028u, 249927207u, 3584932419u, 1355984265u, 990857900u, 1870305536u, 582023708u, 1966962179u, 1733088207u, 1190083164u, 3785297292u, 1004947745u, 1784159416u, 1841702516u, 180335137u), + SC(4084089742u, 2441136551u, 426220168u, 1375299216u, 1841338030u, 1250354698u, 2728864721u, 2959990011u, 1071025467u, 1691914484u, 2858760972u, 1516700275u, 2771651049u, 607063247u, 4219381388u, 3373946171u), + SC(2146554811u, 2380633398u, 431356428u, 2501496525u, 4195490782u, 4281443977u, 1707183170u, 3515016439u, 43334925u, 2064458077u, 4149827026u, 2544422546u, 1259302114u, 1919625668u, 729425798u, 2757346641u), + SC(2475010648u, 501654469u, 1262984133u, 2284058265u, 3864896735u, 3216144340u, 3043718887u, 3290359029u, 2513504704u, 1583873907u, 787550022u, 889877880u, 4155285556u, 2519357244u, 1887123831u, 2544852082u), + SC(1329107374u, 3899397847u, 1931705980u, 3537599611u, 2074239136u, 1267070685u, 2447524924u, 3173107761u, 2842541385u, 924561908u, 2664553616u, 395476463u, 813764142u, 3107511895u, 179660379u, 2380654703u) +}, +{ + SC(286197159u, 1217476806u, 1373931377u, 3573925838u, 1757245025u, 108852419u, 959661087u, 2721509987u, 123823405u, 395119964u, 4128806145u, 3492638840u, 789641269u, 663309689u, 1335091190u, 3909761814u), + SC(2458775681u, 3448095605u, 3846079069u, 1243939168u, 2712179703u, 2514528696u, 1400411181u, 3792085496u, 528921884u, 1230512228u, 4062090867u, 931590129u, 3669288723u, 1764179131u, 2650488188u, 764612514u), + SC(3981461254u, 1881876860u, 3861653384u, 1419940889u, 3890280301u, 225359362u, 3772709602u, 2406778923u, 1744011295u, 836946168u, 1547583643u, 2969842237u, 3997288340u, 2150480638u, 3129156617u, 1325216902u), + SC(3592470591u, 3671101194u, 2792523734u, 2070472959u, 1473838345u, 785123121u, 2721504084u, 2212009910u, 4070989896u, 1696639999u, 2859248441u, 3104578877u, 2309769016u, 4267049236u, 2484173427u, 1626540609u), + SC(4267160019u, 2981312649u, 344263087u, 698599319u, 1002907346u, 93565259u, 286808078u, 1804582990u, 3599771325u, 2181306538u, 1961279765u, 187428107u, 223299791u, 4043449191u, 587626985u, 2106033479u), + SC(501761768u, 2386293097u, 1180388710u, 1812775472u, 918601490u, 3009070794u, 1574279477u, 1505824867u, 3643095372u, 3370828988u, 832869144u, 404837899u, 3152252263u, 3925885097u, 69867335u, 3741018586u), + SC(2051920526u, 1020215512u, 2058830843u, 1611771091u, 2552120098u, 75944844u, 1802229404u, 915313553u, 2313215016u, 1745739579u, 443475191u, 2998247588u, 3289885130u, 1289464560u, 2961919458u, 3798282256u), + SC(1496487624u, 2215532014u, 4148657376u, 3923080315u, 216179279u, 3856996518u, 2014567019u, 880786726u, 2125033974u, 58008256u, 4039109547u, 402585883u, 2182540617u, 437175766u, 1441865826u, 1665450276u), + SC(3078919323u, 1109978808u, 3102316446u, 4252174800u, 1046362670u, 3864571927u, 2260100326u, 3682270765u, 2139319322u, 1066628173u, 240059747u, 1164853046u, 1454716611u, 512654137u, 1544275853u, 2556727566u), + SC(580428655u, 115762757u, 1593355348u, 2740341778u, 1504897999u, 975028678u, 2401832824u, 4197869940u, 3667767462u, 644880229u, 691878327u, 369150353u, 4026243769u, 737605979u, 2791271214u, 2620684209u), + SC(624678531u, 4114750403u, 1274989179u, 1531504358u, 3520816024u, 2554021149u, 1865577096u, 1362433716u, 1638936249u, 3016959317u, 2526207810u, 3033412199u, 695904139u, 2060012285u, 3230414132u, 860289224u), + SC(3442642063u, 1520946900u, 218826564u, 968761561u, 4098434233u, 3360677602u, 2204368028u, 486310067u, 2601372374u, 1399175099u, 2183933043u, 806379489u, 2424203087u, 2668736829u, 1664637882u, 3005713727u), + SC(700899790u, 1066183324u, 3546718434u, 998702102u, 2557230354u, 2084117292u, 2934243163u, 1545771642u, 3688392810u, 3908656537u, 3447657276u, 840000010u, 2955752477u, 44371204u, 3799655472u, 3734995825u), + SC(3265506533u, 942399325u, 173917125u, 161041810u, 2297418901u, 849604788u, 2703870825u, 2810175425u, 3617296913u, 1432689375u, 3133875354u, 1118654553u, 2616257301u, 495686053u, 4127407123u, 1943733376u), + SC(2005668850u, 485568946u, 2260461782u, 2622034876u, 2693998905u, 2811925574u, 2831747304u, 3217266392u, 2520502878u, 1176196783u, 2567958416u, 1525744035u, 2841811417u, 1157609637u, 3871707993u, 2765099676u), + SC(207989197u, 368293876u, 3237374184u, 1394768686u, 1254103141u, 935691540u, 375090092u, 2481205522u, 2920254212u, 492683984u, 2055637221u, 4291235240u, 3889542314u, 2465899605u, 1694380507u, 757371549u) +}, +{ + SC(136266275u, 1782161742u, 3530966629u, 586004249u, 4076565170u, 3312577895u, 876489815u, 1337331291u, 888213221u, 1813863938u, 1374206604u, 2668794769u, 1377764865u, 784024905u, 1937217146u, 3627318859u), + SC(3161427495u, 2344678392u, 1808682441u, 2396619894u, 3034006140u, 1044331129u, 4102609084u, 1058091322u, 1515502621u, 1258860285u, 1406233340u, 127619173u, 3057107171u, 225762630u, 1651671815u, 4285298193u), + SC(630785468u, 1344100570u, 1929331818u, 828088181u, 2313124884u, 1302120759u, 3180735860u, 313275450u, 1008942268u, 2707820177u, 4248947940u, 1732478629u, 3645496831u, 611830707u, 1937638387u, 61731419u), + SC(1347537282u, 2857000226u, 227299159u, 1108544547u, 1181072563u, 1291715943u, 3752803919u, 2688390945u, 2484326219u, 1350060758u, 452823659u, 2363636452u, 2152205190u, 1812507720u, 607624535u, 2319475408u), + SC(3222638329u, 3875752446u, 758301165u, 51152840u, 2430504171u, 1189996379u, 44948392u, 232960619u, 3026371583u, 2974537914u, 3244781723u, 3702394182u, 2835938901u, 663347918u, 3320069474u, 3071978352u), + SC(1947047272u, 3022037725u, 949698504u, 1728470528u, 283847009u, 1458268020u, 360012619u, 1579646653u, 4005878207u, 1765381301u, 20903539u, 2558445559u, 757888638u, 2604781527u, 2240457927u, 3990518442u), + SC(4281545336u, 1208697934u, 2578865021u, 2456188396u, 1796646478u, 3757714293u, 2622755030u, 1606025966u, 30472258u, 3850691354u, 1208779266u, 405050222u, 3807844323u, 3748806955u, 358470323u, 4212845387u), + SC(2041619043u, 3711576883u, 835794591u, 2392116351u, 2862318436u, 689502669u, 2866163103u, 2052898811u, 576580608u, 1144506306u, 542475550u, 474572979u, 4137279429u, 2221684538u, 331268239u, 1556318477u), + SC(705880713u, 2092991958u, 815360595u, 3449491044u, 1305192012u, 2057063005u, 3299868133u, 1114733861u, 730760330u, 1129737257u, 4233249504u, 1217580888u, 452658791u, 2612091783u, 1764043106u, 1669202162u), + SC(3689992902u, 700129090u, 282055655u, 756126609u, 382876308u, 4262209576u, 2436932760u, 484247369u, 1415138625u, 2340918814u, 3058199817u, 4145497883u, 334812059u, 461523021u, 2221122791u, 2995497332u), + SC(706669295u, 3007808000u, 3728730665u, 3241577762u, 3126001367u, 292940936u, 1126531898u, 3913205978u, 304146054u, 2548053118u, 3490807704u, 3465095661u, 3938930443u, 804039554u, 297557674u, 1669808877u), + SC(2395818908u, 3199065200u, 4060875213u, 1731284266u, 1022607637u, 1154299144u, 3879751917u, 384430926u, 86892497u, 2036004815u, 2668116514u, 901861508u, 2277490553u, 1312485879u, 562264334u, 170374972u), + SC(2192479620u, 3046309306u, 143307916u, 3468295982u, 3110013374u, 699221760u, 273412494u, 3153322038u, 2886126025u, 1296005576u, 2326933823u, 3713038344u, 919578907u, 258326637u, 1991591857u, 604405680u), + SC(3283196708u, 902217854u, 1295144146u, 503984315u, 566424671u, 1755595238u, 2455519229u, 120267530u, 1004363245u, 1611271287u, 1013059281u, 3646183010u, 183890924u, 188417891u, 1612883046u, 2255154239u), + SC(1231171449u, 2524105034u, 653815517u, 585754026u, 3098352226u, 866901449u, 4223318963u, 1071806142u, 3239364285u, 4077877700u, 423690458u, 2222266564u, 4117269051u, 1893556406u, 3304547745u, 215164118u), + SC(3229321461u, 3443938850u, 803179772u, 3340311630u, 2749197592u, 565049216u, 1674980657u, 45735981u, 3858875409u, 2208179057u, 2167864606u, 3853383863u, 3320158569u, 901453102u, 2505912317u, 1486241881u) +}, +{ + SC(768143995u, 3015559849u, 803917440u, 4076216623u, 2181646206u, 1394504907u, 4103550766u, 2586780259u, 2146132903u, 2528467950u, 4288774330u, 4277434230u, 4233079764u, 751685015u, 1689565875u, 271910800u), + SC(2894970956u, 471567486u, 2880252031u, 2717262342u, 4077383193u, 1268797362u, 4257261832u, 2560701319u, 2691453933u, 1607372210u, 2771176414u, 58794458u, 4272438220u, 2521311077u, 642919262u, 3613569198u), + SC(549667688u, 1635817891u, 3597742712u, 2133548191u, 983618585u, 1077056145u, 1016537981u, 3024916594u, 3788763915u, 2354027825u, 234019788u, 1129974745u, 3836449602u, 132091652u, 2429034711u, 3714188356u), + SC(3752023309u, 1237246457u, 810507218u, 1575719630u, 2984629402u, 1312110059u, 1532351529u, 3778270553u, 500991970u, 3016414634u, 2451804626u, 3116044735u, 2749076428u, 609078974u, 343845623u, 1628221103u), + SC(1079050562u, 537097107u, 2113045556u, 1216978919u, 795109794u, 494396817u, 3615304214u, 3016596136u, 1485503229u, 2246940765u, 2872639209u, 812577075u, 3970992077u, 816616346u, 4279493103u, 2696304890u), + SC(302016674u, 1709668681u, 88411267u, 3337357281u, 3061995584u, 3396993199u, 1858891069u, 2509301562u, 3807375387u, 3567949934u, 3737724046u, 4137514111u, 1709156749u, 1400722499u, 3253197246u, 830289695u), + SC(86642997u, 2517748533u, 1802616926u, 3224858276u, 667521935u, 294768443u, 3699185630u, 2619978653u, 1654256627u, 789295435u, 4056501046u, 2298266369u, 3425028365u, 3740463800u, 2064449616u, 423401599u), + SC(587205175u, 208206623u, 1253389730u, 3674422134u, 284316357u, 2112208954u, 1196434050u, 302049830u, 985808817u, 4037289748u, 2191325460u, 4289570719u, 592322138u, 3671063901u, 886295122u, 2540475213u), + SC(2164961127u, 4048157441u, 2790139366u, 1435011700u, 4142835891u, 3320410016u, 2681849481u, 1047872443u, 2885564134u, 874029678u, 2048520878u, 2934385850u, 1097367713u, 1997417466u, 2045706034u, 898129538u), + SC(3451958921u, 95403444u, 4056502814u, 671939501u, 2069116441u, 3101129770u, 553516228u, 1712496197u, 2639919391u, 3157824758u, 2182076931u, 2920510603u, 91421090u, 3496854290u, 1333938225u, 2005754623u), + SC(469295760u, 426796598u, 3855795018u, 970866434u, 856973549u, 2439780350u, 2385957015u, 2589908140u, 3781058972u, 4109407963u, 32316753u, 3931244779u, 68560366u, 1699148814u, 843806029u, 3772908229u), + SC(3846833357u, 4119412096u, 438094070u, 2645426661u, 884548695u, 2876447138u, 80918210u, 2029354870u, 135282137u, 3030947473u, 2960763605u, 1898348122u, 4127316996u, 2240743006u, 2934791826u, 887094286u), + SC(1897883656u, 1406242187u, 2434671426u, 2734794757u, 2714201131u, 3046668149u, 257451999u, 3794951424u, 152449195u, 3454838096u, 2737741298u, 821046884u, 2554260361u, 962889686u, 1262263641u, 2203109889u), + SC(1985684731u, 222483668u, 2849949193u, 1221492625u, 2084499056u, 1235444595u, 2655267198u, 1020186662u, 1447071023u, 3629752849u, 651251319u, 2167418603u, 2268535831u, 2985934672u, 2652239173u, 3259021212u), + SC(3062826974u, 1796450254u, 1939504794u, 476729966u, 3521076442u, 3086668105u, 234121934u, 986487065u, 1570879569u, 2820662853u, 1206879400u, 4271520206u, 4242315964u, 2749978648u, 3007865079u, 4114755771u), + SC(3649818358u, 3409857055u, 1537210569u, 2398557069u, 3130583052u, 536941530u, 3880813719u, 1419070102u, 1164730147u, 2533104753u, 2046210979u, 2821557175u, 2327264610u, 1639358616u, 2001893732u, 1524105344u) +}, +{ + SC(294473811u, 4198428764u, 2165111046u, 977342291u, 950658751u, 1362860671u, 1381568815u, 4165654500u, 2742156443u, 3373802792u, 668387394u, 853861450u, 2637359866u, 2230427693u, 2824878545u, 103849618u), + SC(3462974251u, 3960356708u, 3970663027u, 1911703734u, 2602955995u, 2496279357u, 210580885u, 3874806640u, 2822070051u, 4063068709u, 2061277285u, 1429537360u, 2349584518u, 2910686068u, 3963567776u, 3972103816u), + SC(2016723458u, 2541590237u, 3532225472u, 3001659539u, 112442257u, 922189826u, 2246032020u, 3487464820u, 1658786807u, 2276379919u, 1596562072u, 457926499u, 2193005220u, 2575074329u, 529788645u, 1519231207u), + SC(1572936313u, 886315817u, 1530415140u, 2311860166u, 3941188424u, 45807153u, 2483174955u, 1469805839u, 3162970586u, 2454510043u, 2417743140u, 2783896043u, 4229304966u, 1351489836u, 284407686u, 4050060666u), + SC(1089549454u, 2684562245u, 1059803961u, 224950790u, 58262787u, 3033299806u, 927475933u, 1400133226u, 3082832878u, 1490904482u, 3040968407u, 593844137u, 1569781919u, 798746464u, 1083127814u, 1590280691u), + SC(1538536818u, 1828650047u, 3754703497u, 985555578u, 1002045074u, 767791702u, 915104522u, 465342914u, 1114045622u, 3426575950u, 1922317875u, 1070157234u, 3077282627u, 509171365u, 1607316331u, 668038565u), + SC(3323765415u, 1224391265u, 2469548057u, 3722781348u, 3031269370u, 4289586349u, 2226931390u, 957179955u, 2298143215u, 388542993u, 1780793152u, 2112973240u, 1502081645u, 1973971844u, 934878133u, 1618693887u), + SC(3954817210u, 3380652139u, 2572526672u, 1228436929u, 465848053u, 3939966705u, 2398020514u, 2900599831u, 2007674400u, 2727714272u, 2337519533u, 1681172994u, 4089802218u, 142069883u, 4261364192u, 2856729470u), + SC(4248537414u, 694781904u, 571619480u, 3221145068u, 2970038253u, 3370542615u, 2832314379u, 1807587465u, 1411648700u, 1964173012u, 121911610u, 1134463822u, 2574507072u, 885427058u, 3741638072u, 3097389771u), + SC(2158675312u, 116080836u, 3333803512u, 3797833536u, 984464391u, 4149942538u, 1145746749u, 1195624987u, 426540232u, 1021913877u, 3121679962u, 3390873776u, 3273678689u, 3851165262u, 4274383191u, 1915176720u), + SC(1158541955u, 1843489443u, 998849897u, 969171492u, 1791167915u, 2484857096u, 1119081920u, 1901041264u, 2534183757u, 1529097558u, 2956376281u, 1260291681u, 1159207651u, 3441978306u, 2518693280u, 4253362775u), + SC(1690661001u, 2213259738u, 3615956917u, 105152953u, 308358176u, 1328282355u, 1666389191u, 1019854259u, 2059193948u, 4244545599u, 1952864052u, 329670934u, 3592985517u, 571024701u, 1172799188u, 3135874872u), + SC(1184018396u, 889004172u, 1920099477u, 1964506637u, 189152569u, 1805931691u, 3250067608u, 3446883320u, 1471577127u, 2315956523u, 1588897116u, 2470229082u, 3602241877u, 554726955u, 1644067322u, 87402371u), + SC(1360270758u, 326216664u, 3362619326u, 1255989535u, 4140691901u, 856602972u, 2084629207u, 3858539838u, 78510889u, 2277092409u, 3136284616u, 1772786459u, 3229606238u, 94732571u, 2598206327u, 492226777u), + SC(1257123658u, 2873597433u, 3001150814u, 421725801u, 236310867u, 582305583u, 3367057659u, 2102668336u, 153914902u, 4226436363u, 290094468u, 690656835u, 1748591179u, 3668885459u, 165028339u, 2139821087u), + SC(2349582063u, 631395785u, 941018791u, 1503410647u, 181331585u, 2473834542u, 2528647747u, 3710284323u, 2364124560u, 3901998444u, 3224972026u, 605068436u, 546878913u, 356944705u, 3829683853u, 160452346u) +}, +{ + SC(1451965994u, 766802222u, 1324674662u, 350355960u, 2823290314u, 951779387u, 2914020724u, 508533147u, 1932833685u, 1640746212u, 1238908653u, 542788672u, 3642566481u, 2475403216u, 1859773861u, 3791645308u), + SC(216282074u, 1906267522u, 1852437064u, 1010678235u, 3729121535u, 4197231849u, 4150055440u, 1128246703u, 3264673345u, 1375783733u, 3415088931u, 34309836u, 2603881793u, 3106237815u, 2950890176u, 505684202u), + SC(3927516830u, 2488673756u, 327917152u, 614182630u, 2355346359u, 730432873u, 88446505u, 4240960753u, 4121410433u, 1398090547u, 2262743232u, 651724036u, 4138228417u, 3106475766u, 4179362424u, 750466827u), + SC(434692713u, 3111300976u, 3323560909u, 3413395188u, 601658363u, 2967722170u, 1070605430u, 74966422u, 813799229u, 4061279746u, 1996953298u, 1765274397u, 4035137864u, 2359104373u, 3535793255u, 618634298u), + SC(1231617791u, 3545122377u, 2628213180u, 2391855988u, 3734909337u, 2705206020u, 681643510u, 368801430u, 691450613u, 2224147576u, 951972679u, 2767063862u, 3676868191u, 158497152u, 2165075628u, 2832330233u), + SC(3529008459u, 1174295398u, 55914117u, 2816083797u, 205887723u, 1756010196u, 1648915894u, 1477354329u, 86311333u, 3889682737u, 1098085375u, 3464880379u, 1139759451u, 542536350u, 186494667u, 2442759451u), + SC(3094023174u, 1995851063u, 4191388160u, 1722723757u, 1329293492u, 727282912u, 2669776257u, 2772951118u, 1386276034u, 3089621174u, 2303649396u, 2292749559u, 1467806712u, 266878652u, 2651863592u, 1006978704u), + SC(2450691869u, 3012269556u, 3887712993u, 4048656504u, 2160727935u, 1940770088u, 174916584u, 3472792113u, 2648524840u, 990354037u, 1957678544u, 3888925732u, 1168435347u, 3720532709u, 3528212798u, 2624020545u), + SC(69863181u, 2459013627u, 4217968964u, 2735851825u, 1081344097u, 737361378u, 2157825722u, 2900791120u, 1412000158u, 1206005337u, 3067055303u, 230632577u, 601427243u, 2760861753u, 3679310020u, 2091861010u), + SC(2304197829u, 1531316041u, 2716383108u, 434697890u, 508817514u, 2929310544u, 3751532879u, 3785491984u, 2716598214u, 3666495867u, 3150261948u, 1306653078u, 2283636929u, 2492138954u, 1527136744u, 3312103429u), + SC(3387483809u, 1095455990u, 3248396980u, 3181117152u, 2258888938u, 2053848664u, 2160875912u, 553275695u, 1752757914u, 1504034431u, 1046528434u, 1855690339u, 2425857774u, 2142030048u, 237252438u, 3919745098u), + SC(3690358562u, 221287988u, 2268047572u, 3655202989u, 756646724u, 68846869u, 1965143185u, 513684595u, 404949341u, 3706987369u, 15990563u, 3409604325u, 658214808u, 2112012281u, 1742449680u, 1802932879u), + SC(2972942716u, 4184192946u, 4124576773u, 3089123761u, 1179063207u, 2093485395u, 512951348u, 59239037u, 3674464770u, 787225894u, 1288484371u, 1987692265u, 3767465580u, 4044585132u, 2916653148u, 2297816723u), + SC(3784876742u, 1057734114u, 4078669159u, 2003536621u, 3146165592u, 3800656487u, 297129408u, 4248472894u, 3906942491u, 4017607636u, 1285879766u, 3310681130u, 2653159866u, 2524355569u, 84128323u, 2374174391u), + SC(1598027967u, 344901367u, 413901309u, 2414916476u, 417612014u, 1371467558u, 1499802638u, 967537237u, 1571117481u, 1088564682u, 3141693657u, 833402800u, 723113978u, 882224086u, 3586817872u, 3592950853u), + SC(513582137u, 3376206006u, 3649593908u, 274710963u, 395026609u, 3340190413u, 1543782101u, 90195397u, 4157807658u, 412153222u, 558068169u, 2001737608u, 3474337160u, 1679447360u, 12885220u, 843004632u) +}, +{ + SC(2083716311u, 321936583u, 1157386229u, 758210093u, 3570268096u, 833886820u, 3681471481u, 4249803963u, 2130717687u, 3101800692u, 172642091u, 421697598u, 4220526099u, 1506535732u, 2318522651u, 2076732404u), + SC(3635330426u, 3675180635u, 4282523718u, 1750526474u, 1682343466u, 1292539119u, 2893227939u, 2897346987u, 1855384826u, 3916002889u, 4211021149u, 3439442996u, 241993264u, 1634586947u, 29890244u, 2635163863u), + SC(2111268073u, 1081371355u, 3873218083u, 4044562588u, 2141674529u, 2107952064u, 3689043955u, 3423481956u, 2548188353u, 2697516682u, 4235866514u, 2985306600u, 3687062917u, 2383095614u, 206503719u, 2548448480u), + SC(961167287u, 839569057u, 3482959339u, 4268254472u, 364097642u, 1343091094u, 3226753483u, 2159507482u, 3968394805u, 2518014496u, 3451298154u, 38127252u, 267735247u, 3484363065u, 957363479u, 1698662790u), + SC(2744437828u, 3863759709u, 3010153901u, 3500431594u, 2624982656u, 875272695u, 1378345519u, 1791692262u, 3726226549u, 2682325366u, 3925052276u, 389591343u, 3869112658u, 650251545u, 6263093u, 860194434u), + SC(309822299u, 841707800u, 2661553828u, 3383039256u, 238699224u, 1100968507u, 3534897900u, 4177846894u, 3463859410u, 1435499569u, 2006933774u, 3007046995u, 2819231184u, 288756524u, 1854189890u, 3858081977u), + SC(2088052675u, 3396090720u, 416722812u, 2597822221u, 1176386826u, 3290882216u, 1002529034u, 2156491632u, 4202546863u, 1988253003u, 164033721u, 941800849u, 1186836065u, 2298291750u, 1863561032u, 1437279190u), + SC(2858016010u, 775169843u, 2706497878u, 2821546952u, 2660836656u, 2077717717u, 3498848893u, 658545289u, 4048269927u, 418273988u, 1144587321u, 3094511386u, 4122354470u, 4225741678u, 603926280u, 979427875u), + SC(1933550557u, 635706492u, 1314164193u, 391588743u, 834468642u, 1475393570u, 467867971u, 1271027212u, 2540684860u, 3801872764u, 1235100171u, 2159823063u, 532708943u, 665828867u, 4215955726u, 3885758496u), + SC(3602864699u, 4002116109u, 644187852u, 1895585048u, 2776091504u, 72205071u, 554242761u, 4049640413u, 3149249833u, 688714164u, 687706448u, 3680924185u, 2274039047u, 303853541u, 2977107717u, 1196398757u), + SC(3014099531u, 1302405838u, 17960870u, 4110705157u, 3801652109u, 2085339416u, 223612049u, 2870889264u, 3353629397u, 3527061798u, 674241336u, 3525864585u, 2278818471u, 2069831593u, 2885891701u, 1329881521u), + SC(943450806u, 3704544104u, 3603194299u, 3757910007u, 502151885u, 765197432u, 4190577627u, 771063523u, 2436865367u, 678307964u, 1498061278u, 4120830837u, 3369466394u, 3399332765u, 1670894068u, 2891073104u), + SC(501595739u, 1876059299u, 4182005344u, 160804770u, 962098784u, 2636270989u, 1828906496u, 1316975808u, 4088133273u, 2943366134u, 216957582u, 1003216568u, 4242258589u, 3505873185u, 2810125978u, 3429220861u), + SC(2021386647u, 4046435053u, 1951135097u, 3941871277u, 2261999657u, 3808836272u, 2028063026u, 3659044589u, 3595750274u, 34514326u, 1889867282u, 1898224864u, 1659225476u, 3153868894u, 1647148554u, 1185039302u), + SC(4119269244u, 1304843028u, 2354051818u, 2031439365u, 533555049u, 1418960734u, 214120313u, 4187370667u, 4256529561u, 2635160409u, 1836564249u, 3828261559u, 3235640513u, 181194540u, 4018312346u, 680914749u), + SC(1914329770u, 3317667974u, 1413160514u, 2952053282u, 3332782151u, 3751637695u, 2146129829u, 167804454u, 2499496888u, 4213150810u, 223599992u, 2197202825u, 2869811316u, 2635473358u, 952082661u, 1532017334u) +}, +{ + SC(701959589u, 2450082966u, 3801334037u, 1119476651u, 3004037339u, 2895659371u, 1706080091u, 3016377454u, 2829429308u, 3274085782u, 3716849048u, 2275653490u, 4020356712u, 1066046591u, 4286629474u, 835127193u), + SC(897324213u, 739161909u, 1962309113u, 3449528554u, 2634765108u, 226285020u, 2832650161u, 324642926u, 2242711487u, 162722959u, 2264531309u, 2307017293u, 4006636248u, 1035416591u, 2557266093u, 3957962218u), + SC(1912896448u, 699621778u, 2975109255u, 1580597872u, 2818493758u, 515803157u, 1642586345u, 785148275u, 2098287545u, 1424779842u, 1039209855u, 4238164284u, 4173562747u, 3569896384u, 1089361492u, 1858690350u), + SC(2757340308u, 2538321018u, 2388474793u, 379482919u, 882562385u, 3129659692u, 4216198588u, 3565768337u, 1772023241u, 2931080253u, 3451485646u, 748689895u, 562737327u, 663797632u, 3315310934u, 2629536884u), + SC(242169331u, 1243063456u, 175561111u, 2950276224u, 3213816292u, 692329775u, 3181354285u, 3015261169u, 1744760252u, 3733849950u, 4219512025u, 693702734u, 2844842003u, 722286940u, 2391355922u, 3564773447u), + SC(2291286292u, 966238959u, 506903622u, 2122264528u, 1392182009u, 3447321781u, 3873294792u, 1373792940u, 991667700u, 2332723711u, 2764968211u, 2471301595u, 649629323u, 783169152u, 1459916213u, 3846736182u), + SC(2664330880u, 1149932862u, 1416201114u, 318583284u, 4140857901u, 1128356267u, 1095497693u, 1624736741u, 761312690u, 241788645u, 2036924781u, 1946525101u, 3225208750u, 4156033061u, 2590150721u, 3771407135u), + SC(2862143077u, 233168744u, 2659004990u, 155440145u, 3918377979u, 1360152661u, 627903232u, 1469886352u, 2876841580u, 3955906097u, 580277652u, 3039511497u, 1597126708u, 1404269416u, 42059925u, 2098341602u), + SC(812381463u, 3272442363u, 496180006u, 1236237424u, 2267310113u, 2237850197u, 1113026387u, 716498059u, 3503382440u, 328287114u, 1410789607u, 477863076u, 1362085890u, 3569642059u, 2006757845u, 675415451u), + SC(747557402u, 4212477852u, 3286869720u, 3708058361u, 3240421074u, 1188732842u, 916816078u, 2444327052u, 2111479336u, 1745064524u, 3637408011u, 3599633029u, 4230973048u, 1160089497u, 1136388910u, 4138160782u), + SC(1255139572u, 1856599651u, 1458352865u, 3271906169u, 3410637086u, 2119040671u, 1680850868u, 413922813u, 2782309328u, 3561735700u, 3723648708u, 609378416u, 268989415u, 3293584485u, 3271843364u, 1954072630u), + SC(4155626312u, 931793228u, 1049414704u, 1037617746u, 265265177u, 616902615u, 844384832u, 3477591939u, 3106685802u, 2357099686u, 1845236259u, 3355104451u, 3327830357u, 3100545339u, 1162051156u, 2646331847u), + SC(514329180u, 948073745u, 1774920952u, 105860125u, 2811186644u, 1695131452u, 940976033u, 2019732362u, 309099076u, 1607914408u, 4118428245u, 1337868060u, 3952860679u, 2578427283u, 265792106u, 295755030u), + SC(3882528435u, 2629929072u, 1617404150u, 1421619579u, 2309432083u, 724299897u, 2666040048u, 1096383838u, 1836447402u, 426930713u, 3934220119u, 3232225281u, 1000075862u, 3631628825u, 3529619355u, 1219322120u), + SC(3335633324u, 4194223138u, 3901817518u, 1335914529u, 3871871049u, 3709757137u, 3499113177u, 235348888u, 781652835u, 1102256292u, 3754223033u, 833068853u, 4178470716u, 1807198743u, 2733399861u, 3740356601u), + SC(228568838u, 3126580587u, 4000897922u, 1303869372u, 3850020302u, 1548458239u, 2356371812u, 3570971356u, 2544858219u, 4220062752u, 2062616152u, 953792592u, 764216612u, 2052428514u, 2314665964u, 2792116584u) +}, +{ + SC(2022030201u, 622422758u, 4099630680u, 255591669u, 2746707126u, 492890866u, 1170945474u, 626140794u, 2553916130u, 3034177025u, 437361978u, 3530139681u, 3716731527u, 788732176u, 2733886498u, 780490151u), + SC(4207089618u, 3411945447u, 1960753704u, 3552759657u, 1130668432u, 848791484u, 3810908171u, 353148861u, 3312275539u, 2963747704u, 2966813687u, 2483733320u, 2880725255u, 463405312u, 3340834122u, 1292390014u), + SC(2664721153u, 4108676217u, 2604619822u, 775242570u, 636236518u, 2873717047u, 1857718302u, 2091477716u, 1586310695u, 2528697445u, 2256487867u, 2787362203u, 2741360704u, 496928924u, 601271512u, 3586110309u), + SC(1791685197u, 4242641311u, 3369628733u, 2052809939u, 806398185u, 3412279529u, 1946210627u, 1398934260u, 3077042954u, 2276630414u, 814388665u, 1749609309u, 3367688729u, 1959714965u, 2411157301u, 2263996211u), + SC(439326213u, 4256425445u, 876987216u, 1314194194u, 3010100734u, 1576065730u, 598365157u, 3705087566u, 3427486218u, 1877721147u, 358249820u, 410263983u, 1386735339u, 573015435u, 3312164843u, 1274000474u), + SC(1340417963u, 1112802360u, 10328826u, 706586684u, 2526013892u, 4135069035u, 3566832565u, 2945858092u, 107866747u, 2114273476u, 1970904771u, 965191541u, 1793617219u, 1453495760u, 4269949644u, 41605060u), + SC(123137558u, 4245690796u, 820317976u, 1443287541u, 4203849632u, 2954045926u, 714382464u, 3076066234u, 1293485113u, 2554869888u, 1663243834u, 1823619723u, 3832632037u, 2772671780u, 1362964704u, 558960720u), + SC(104412626u, 1897841881u, 4081037590u, 3456756312u, 3025873323u, 2036419348u, 663042483u, 1254379139u, 1882881825u, 3296543036u, 153313200u, 916960321u, 2276001640u, 759388499u, 1134495268u, 1699779658u), + SC(4218137867u, 889442133u, 2322944798u, 2659784159u, 2592614267u, 3345396604u, 3647495000u, 2837331949u, 75759322u, 2350992064u, 2461684340u, 2333444962u, 60872001u, 106935728u, 2095087192u, 2026584532u), + SC(818402121u, 2851948581u, 2197490142u, 4158011576u, 1665124994u, 3116095068u, 4019154383u, 478938546u, 1455910301u, 1844755722u, 2818772446u, 2743310120u, 1907022363u, 1639658700u, 517605614u, 2705809838u), + SC(335193145u, 4147885949u, 3527556636u, 2575925391u, 2530836608u, 2938195122u, 3771589905u, 2663025172u, 4017017665u, 2146447634u, 3974365403u, 2994000421u, 3198356067u, 3382731724u, 2593683495u, 3554902256u), + SC(1108422413u, 1982378939u, 2047758090u, 246779179u, 2568353687u, 279750626u, 1730233650u, 784289836u, 2712478714u, 3614283837u, 1824826964u, 2514128237u, 3308726345u, 3623735281u, 887459898u, 3896777957u), + SC(3527405352u, 290146745u, 125808293u, 735109902u, 1788801307u, 3306408847u, 822599754u, 3798637803u, 1514985656u, 2967186195u, 716984495u, 3386310843u, 3156794500u, 1007814159u, 1629566196u, 4265651874u), + SC(1178327293u, 565847309u, 518944000u, 3901419432u, 941693255u, 4276272755u, 3595637504u, 1831384538u, 553054976u, 3799273120u, 516961220u, 3048859574u, 1887176404u, 3648800625u, 2905989893u, 2971331974u), + SC(561598562u, 3812086269u, 2571795641u, 1946669885u, 4094345694u, 1247304730u, 725275648u, 2382611624u, 3912910386u, 3657806663u, 2347179560u, 3311073478u, 3031523768u, 2672297551u, 829774364u, 4138790294u), + SC(3908534093u, 41076189u, 4026661177u, 1264946070u, 3582612650u, 3167460834u, 3305185564u, 1828271691u, 1883569901u, 567401887u, 2154847219u, 3599749472u, 834678216u, 1517326104u, 465030801u, 2253777505u) +}, +{ + SC(69398569u, 525452511u, 2938319650u, 1880483009u, 3967907249u, 2829806383u, 1621746321u, 1916983616u, 1370370736u, 248894365u, 3788903479u, 221658457u, 404383926u, 1308961733u, 2635279776u, 2619294254u), + SC(4116760418u, 3197079795u, 2972456007u, 1278881079u, 1399016013u, 267334468u, 3129907813u, 468505870u, 1237093446u, 3810554944u, 1980244001u, 1830827024u, 4255330344u, 3556724451u, 2936427778u, 3969278111u), + SC(3989128687u, 604159041u, 3302470711u, 1703086807u, 4153485525u, 2444501021u, 449535888u, 2817157702u, 3967126593u, 3774839729u, 4230523164u, 1130105305u, 2419296875u, 560268503u, 173246097u, 1794638932u), + SC(1735434103u, 3810847770u, 4216841726u, 1126260487u, 1019034952u, 4140633019u, 3223272164u, 440162565u, 3864068825u, 3275406276u, 2196958479u, 4212485308u, 539037402u, 431338309u, 4061221107u, 4289896057u), + SC(1802752446u, 2780168117u, 1133399256u, 2599868866u, 3158418134u, 2848371717u, 2893014484u, 1878597835u, 139427334u, 1841937895u, 2016179766u, 2330806831u, 3849381146u, 2224326221u, 2296824272u, 3983748073u), + SC(1520559143u, 1690628296u, 1614953069u, 1422707415u, 257987514u, 3063997315u, 2652769123u, 3445956897u, 843436720u, 4264023440u, 365609354u, 2250088148u, 2769492081u, 59746990u, 1275187671u, 1973406172u), + SC(2823162534u, 2631304853u, 2485683334u, 33106529u, 243176015u, 492943806u, 489814307u, 4023911334u, 4139752347u, 4133120235u, 2455727203u, 1293330101u, 1838339727u, 4219498628u, 2131345625u, 3646653738u), + SC(4198202713u, 3167956639u, 2765023077u, 3652537372u, 1708707687u, 2324231909u, 1009881825u, 1679047879u, 2515346176u, 794145218u, 554048969u, 3173445869u, 2193645289u, 1271864237u, 1006139617u, 1072905092u), + SC(4273823033u, 1749314885u, 4263358248u, 538495360u, 4104454924u, 1997598205u, 3080563305u, 3238994582u, 3099819109u, 3162260128u, 1706963773u, 405274298u, 1894479347u, 1596497438u, 1094591269u, 1522128209u), + SC(2640931764u, 1304425992u, 2939922746u, 3918107623u, 1248692482u, 1121191585u, 2062140937u, 1807331998u, 3643560968u, 3236720945u, 2667270358u, 411521120u, 3664086365u, 2334989504u, 2668098536u, 3236026237u), + SC(2404161740u, 567514400u, 3895963765u, 1201374790u, 674719322u, 2894222365u, 467511362u, 3395036514u, 1038550674u, 2948454520u, 1518702565u, 1362236790u, 157238862u, 3475771959u, 1415257606u, 2714484334u), + SC(1831986705u, 588754101u, 4075551797u, 2767613701u, 2944855428u, 1912813036u, 1398542170u, 3440695634u, 2367865816u, 842155635u, 2602621363u, 2143763320u, 4256143529u, 1826541687u, 1851134007u, 2997377819u), + SC(3699972731u, 227995919u, 3067674252u, 477404832u, 847958753u, 893077929u, 2153170373u, 3057114881u, 1197132301u, 3330088847u, 2465660906u, 549749504u, 722435391u, 4124201578u, 3419977887u, 636305133u), + SC(3346980455u, 338882355u, 1940861469u, 2106574528u, 4065634984u, 939438415u, 880899904u, 173329243u, 3962520186u, 3417951565u, 2532850810u, 1158609417u, 1846710650u, 305050726u, 600225342u, 3684765712u), + SC(1932816778u, 3409537322u, 2445361402u, 1740774412u, 3661005378u, 2854030637u, 1914937560u, 1558250179u, 3808763123u, 1298026979u, 2417248681u, 899022004u, 847010236u, 506303181u, 1296472514u, 648957572u), + SC(600303058u, 722185115u, 3110060002u, 3818809602u, 1551617161u, 4208042174u, 526230670u, 1957951010u, 3160030963u, 3295123990u, 3121214191u, 1337066151u, 2200271451u, 1066776105u, 1163805043u, 2606444927u) +}, +{ + SC(1137648243u, 3815904636u, 35128896u, 1498158156u, 2482392993u, 1978830034u, 1585381051u, 335710867u, 529205549u, 1286325760u, 863511412u, 283835652u, 936788847u, 101075250u, 116973165u, 2483395918u), + SC(2210369250u, 711585268u, 1961210974u, 1353321439u, 1215935705u, 1641330999u, 11213011u, 2020212318u, 695107713u, 3413272123u, 1378074688u, 2790029989u, 658491086u, 1881545465u, 3409839898u, 2042086316u), + SC(1723393102u, 3373492622u, 3599711002u, 3748987970u, 1143620470u, 2663282777u, 2229588531u, 2674289435u, 2963045423u, 2234232397u, 4178299567u, 2791622546u, 4001934471u, 757990509u, 2858420658u, 605204372u), + SC(4272330873u, 3840847353u, 659917277u, 1664684318u, 1563018625u, 821178295u, 3329580379u, 794312951u, 2169136998u, 1706378889u, 3017987093u, 1159314572u, 2524368718u, 2444830959u, 898030098u, 68613446u), + SC(3172236096u, 1547478676u, 3467968131u, 1603626860u, 1411948645u, 2916654969u, 2891471305u, 2110051838u, 1733578576u, 2788816800u, 1613389791u, 759324595u, 3991538909u, 4073480091u, 3323038139u, 2043658072u), + SC(3011536148u, 2207224783u, 101813390u, 4149858178u, 961260436u, 3760245299u, 2099300570u, 3143747485u, 3209436103u, 902146054u, 3598885374u, 597299239u, 1369786353u, 2099087354u, 1506359374u, 1017249349u), + SC(3137350455u, 1622014086u, 2828880803u, 599881832u, 2213606365u, 4248974065u, 675350384u, 1446749674u, 1254778294u, 1745968946u, 409433048u, 1103126998u, 2370471436u, 1143685003u, 3341252280u, 1003299547u), + SC(2019014241u, 1108099665u, 1035538349u, 2878848993u, 2585673617u, 1565675366u, 2261830657u, 117854892u, 1965053814u, 2351841804u, 4065720752u, 3747135308u, 959541091u, 1629950401u, 4236240320u, 189693687u), + SC(3443026785u, 3216851941u, 278623472u, 1568038608u, 1548544711u, 2243949731u, 3359141033u, 1425753427u, 2934907774u, 2301245979u, 2216178210u, 153063705u, 1690071616u, 791861830u, 1201756636u, 1249732113u), + SC(2497506925u, 3815453805u, 1308318422u, 1061717857u, 710358190u, 3797004413u, 1870767051u, 2099598345u, 845543228u, 2941187056u, 1083282999u, 1311194087u, 3227025541u, 423673289u, 2634724972u, 3297305091u), + SC(1394185841u, 1653557808u, 2313575976u, 1732811292u, 2133445032u, 171245194u, 3242484287u, 2667183179u, 1165233778u, 997752293u, 501180123u, 2529762237u, 429212016u, 1660866777u, 1766992150u, 2066419882u), + SC(945381459u, 1085161105u, 3490034658u, 983140246u, 425352282u, 2175943302u, 1166850024u, 3968884285u, 1417959566u, 3386676357u, 3168826489u, 2984241621u, 3305143707u, 246924146u, 4113453679u, 123892017u), + SC(1498291154u, 979168666u, 2565114847u, 3722708999u, 3116533535u, 2044826765u, 118913881u, 2684275795u, 30932180u, 3147559151u, 3769605849u, 2376328043u, 753602217u, 3789763983u, 1247346722u, 4123341034u), + SC(3203969599u, 2514533821u, 1007395325u, 2063305304u, 520326691u, 3823758018u, 3095693832u, 1864628246u, 2586004821u, 4190638257u, 2952735262u, 2977139992u, 1124651421u, 295756268u, 3428261546u, 3110485030u), + SC(1663042556u, 4114384947u, 1430450710u, 3825340149u, 1051862436u, 3194752601u, 3106848742u, 1383208530u, 3142397378u, 4065704146u, 1545077688u, 2297695627u, 3152458457u, 4134880529u, 2187655177u, 3419805764u), + SC(3081663242u, 3880428040u, 2670880433u, 1398290076u, 1232125961u, 3862005121u, 1297357575u, 3334998678u, 1135063881u, 1723120988u, 2716095891u, 1113861429u, 3955845594u, 88397004u, 1699846421u, 887623013u) +}, +{ + SC(2668669863u, 1518051232u, 591131964u, 3625564717u, 2443152079u, 2589878039u, 747840157u, 1417298109u, 2236109461u, 625624150u, 2276484522u, 3671203634u, 3004642785u, 2519941048u, 286358016u, 3502187361u), + SC(1979235571u, 2198968296u, 3104128030u, 1368659294u, 3672213117u, 1391937809u, 2759329883u, 1389958836u, 2420411428u, 890766213u, 2707043165u, 2738550562u, 3382941095u, 378763942u, 3093409509u, 2964936317u), + SC(738589056u, 2116353374u, 2279888429u, 1705963022u, 828292114u, 896734726u, 2179570630u, 199574728u, 977051187u, 779668316u, 2330529056u, 3992755888u, 1000402439u, 2191612089u, 357145081u, 1441305104u), + SC(3372185571u, 1990378702u, 1181109789u, 3007260699u, 2430812419u, 1342872134u, 2198044770u, 1122343273u, 492870646u, 795688582u, 3226537448u, 1245881435u, 1071312339u, 1997541910u, 3829149062u, 1964864598u), + SC(3005241683u, 2859584860u, 2297396821u, 999606499u, 3964655188u, 3075624064u, 1368424820u, 847579236u, 744318941u, 1201524211u, 1104903258u, 3771742070u, 4093550286u, 53333408u, 659192149u, 3026115299u), + SC(3415227510u, 2060701016u, 1724277801u, 2661091313u, 215175235u, 1719160017u, 2940192603u, 1942243742u, 2398510742u, 4053370504u, 720436957u, 3760614784u, 2014232625u, 4199009336u, 2658914393u, 246186938u), + SC(446126854u, 165933106u, 2141828870u, 892600041u, 4146883601u, 2127439849u, 3431174989u, 2697318886u, 754216027u, 2671089369u, 1463409379u, 2826265846u, 334206028u, 1562078629u, 62819702u, 350080249u), + SC(3607678201u, 1305808009u, 3724583207u, 482185919u, 703873206u, 1075587326u, 1772056430u, 1356871295u, 4212601732u, 3762698616u, 2707284202u, 752961239u, 3089561250u, 1634547883u, 2919906767u, 31529502u), + SC(299389109u, 1252069111u, 2304374236u, 1252642323u, 2415535563u, 271885157u, 592252779u, 1178960198u, 53568246u, 3149254195u, 2937703855u, 1474069228u, 1764301842u, 954790502u, 4245417136u, 3132108431u), + SC(2094400513u, 3190829985u, 2239253067u, 2918833540u, 4106202305u, 2502268912u, 1731261142u, 2453877410u, 1861934729u, 934615026u, 3785479199u, 3605446967u, 3582056355u, 3042887218u, 1961855879u, 496882544u), + SC(3179454680u, 881405516u, 158640787u, 2790186672u, 162147899u, 376983910u, 3379568747u, 1408037207u, 1411174731u, 535638557u, 1510230718u, 2856041085u, 1958999115u, 3678347246u, 2958940834u, 520309445u), + SC(1870118851u, 1980314816u, 3987573623u, 4117586697u, 396136405u, 3149345244u, 70002589u, 2314836548u, 1713919226u, 3789182954u, 2123295507u, 3015665476u, 4069315088u, 3980795614u, 2021907367u, 4155874670u), + SC(4078777812u, 3708497519u, 1529048728u, 3747007128u, 2780224299u, 2728976580u, 3953400499u, 550363476u, 3812495996u, 3116459113u, 2211909765u, 3967732138u, 315888386u, 4202077281u, 1437542127u, 2815522910u), + SC(3236576167u, 3189780679u, 2030714184u, 2121402515u, 772212369u, 2193424420u, 1417920098u, 2031545011u, 4110769775u, 697022136u, 1206489717u, 1691036150u, 88940849u, 535864250u, 547921653u, 2569798466u), + SC(598120112u, 3876471191u, 3533286352u, 3003233155u, 1039593763u, 2148663879u, 2659932582u, 279051507u, 988977723u, 3458445518u, 2950275676u, 4048574808u, 3093122873u, 831143981u, 214208408u, 3935649503u), + SC(2893621405u, 3242329790u, 1948255717u, 4083664057u, 3803596193u, 740414223u, 4293576836u, 3875047642u, 667197150u, 2081112783u, 2447275650u, 242164299u, 706345359u, 1928593492u, 1774391838u, 3660333945u) +}, +{ + SC(3009793609u, 3525092161u, 3245586135u, 574145899u, 4034974232u, 2828949446u, 3457574134u, 1546193476u, 3883480541u, 1976722737u, 3557056370u, 994794948u, 106991499u, 1626704265u, 3534503938u, 3271872260u), + SC(2939511082u, 3508735083u, 975571643u, 1775005849u, 4144127005u, 706007446u, 420750190u, 1296964164u, 3061654480u, 2268588398u, 258119220u, 1152421762u, 2183948554u, 3016917902u, 1186604447u, 3147111215u), + SC(405897674u, 923178082u, 1575208079u, 3088321769u, 2214762612u, 3893926734u, 3167279390u, 3951912989u, 2709000001u, 2390687969u, 3858727239u, 866338457u, 2045181240u, 3217044625u, 2328560686u, 1861539550u), + SC(1277015638u, 1098202702u, 1559301990u, 2587773702u, 236499920u, 458659357u, 2353007333u, 2611100088u, 3428309717u, 2008274629u, 3647015407u, 268886847u, 2626192792u, 3341061984u, 1515395072u, 3708589435u), + SC(4042661445u, 3420460388u, 402520550u, 3677541300u, 2230979515u, 1273170666u, 2514471146u, 827498216u, 1259202696u, 3072082970u, 475301020u, 2118811945u, 3612811582u, 1387362670u, 2779447975u, 2265478999u), + SC(2229583001u, 1885758268u, 2744744533u, 2751282929u, 3032060674u, 1949605811u, 1570835257u, 793354274u, 1683039266u, 449593771u, 109462780u, 1941150268u, 1808732776u, 139050949u, 2225765509u, 1246293964u), + SC(2802845617u, 3765730171u, 462111640u, 590276976u, 2549490668u, 1227143343u, 384473299u, 1872236586u, 2432932105u, 2621627369u, 29218585u, 3541815309u, 3762320683u, 3470760231u, 2011203130u, 2527437401u), + SC(796052351u, 4037990088u, 4017471553u, 1320960316u, 561010825u, 3728618461u, 3540350568u, 1334322515u, 2252671868u, 3217596003u, 3122272084u, 3124892250u, 146022162u, 3584383023u, 2911266650u, 2958817688u), + SC(161418820u, 3776882969u, 4050624816u, 1522984750u, 3239766493u, 3767349571u, 782872272u, 4177710199u, 1140123311u, 211837022u, 1955996644u, 402816745u, 3326870942u, 1443720320u, 1645866695u, 3832886909u), + SC(452931871u, 3201459109u, 3989748495u, 3779670060u, 3234605835u, 2462489907u, 3541849378u, 3952908948u, 2234764749u, 2534999097u, 1221823414u, 2220662906u, 2593424893u, 3688122472u, 2131104831u, 243658822u), + SC(1244527825u, 1331697159u, 1126644730u, 922926684u, 1475975786u, 704282514u, 1718439968u, 1878820141u, 2509443841u, 2182928123u, 1663057853u, 2828328506u, 1475048880u, 791101245u, 3209045799u, 807262644u), + SC(1506123994u, 75559732u, 2487617790u, 2776679170u, 2522687136u, 3704896305u, 945074946u, 2943008309u, 1088584510u, 2469322363u, 1078526500u, 2073262975u, 691596720u, 2702927487u, 380178128u, 704842212u), + SC(1460389583u, 4274587105u, 1447626425u, 3957246995u, 1621878179u, 1643627976u, 4030517934u, 1056559397u, 1438644008u, 32976965u, 2197709285u, 3567855255u, 2001746745u, 2603748421u, 3462117821u, 903804357u), + SC(3179129705u, 2297226467u, 1646197352u, 950157362u, 2929140164u, 4242027992u, 1652798968u, 4193267428u, 3343133888u, 2499845914u, 423061238u, 3494957413u, 3637365392u, 784231823u, 595573026u, 2713123590u), + SC(2810225213u, 3951319549u, 1905650326u, 3909017486u, 2335763951u, 3772810842u, 2983632261u, 489145948u, 4173940274u, 2703192453u, 2654763363u, 4064871590u, 1399005653u, 257836626u, 831912020u, 895345820u), + SC(4037755568u, 3145789767u, 2141184942u, 4120133888u, 346636610u, 3895536529u, 2259736314u, 1057113066u, 595225270u, 3051392771u, 2813693848u, 3877775276u, 1832280309u, 1138362004u, 3061980317u, 858203300u) +}, +{ + SC(941124125u, 1620226392u, 1431256941u, 3336438938u, 540497787u, 766040889u, 373284400u, 2979905322u, 177008709u, 2625544842u, 1096614388u, 1196846420u, 4186360501u, 3945210662u, 1143943919u, 3412870088u), + SC(2868459499u, 3255324438u, 807131982u, 2853200483u, 3487859623u, 3501857558u, 3107820062u, 2163227213u, 2115527726u, 2346720657u, 2251713340u, 3377131273u, 3223650794u, 3766790266u, 177525458u, 4167009497u), + SC(311132793u, 3961991670u, 3475828441u, 4275227465u, 4114440759u, 287999228u, 3329759386u, 2384037498u, 4228771259u, 844254234u, 256179964u, 1796107218u, 3127243322u, 1425447302u, 1385509204u, 1101567113u), + SC(2084416542u, 1837746358u, 3915669193u, 60671540u, 2731498203u, 842785439u, 103116859u, 3404407266u, 2713222963u, 3049100113u, 368142082u, 2923502225u, 3018451818u, 2169399182u, 3017634865u, 1845463402u), + SC(1620925474u, 3368534446u, 555437218u, 4144603563u, 1969376145u, 213474605u, 1856420595u, 3939242692u, 1705488978u, 252956811u, 1258322279u, 1776729832u, 3988114536u, 3572272198u, 1383845751u, 1398527932u), + SC(1762997475u, 799707654u, 1609033889u, 2324053368u, 2951656833u, 2545022095u, 1325992886u, 2638191889u, 737853621u, 891297811u, 1613139572u, 594983169u, 2686965496u, 4040759974u, 1496585540u, 294269531u), + SC(3866323582u, 3807637640u, 654389167u, 993860478u, 3985490230u, 874636344u, 2342980699u, 1928023737u, 1520117329u, 644165140u, 150615609u, 199275733u, 463804864u, 310744654u, 2057873049u, 1169977839u), + SC(239011286u, 715635161u, 1855226016u, 2750348850u, 4059485278u, 800137564u, 3998891997u, 4048007508u, 1194893107u, 3761772527u, 273800027u, 653240081u, 1187997500u, 310579555u, 786511222u, 3092283411u), + SC(3036944959u, 3482022954u, 3739636749u, 3919006909u, 4266819119u, 1212326408u, 103856594u, 597427799u, 1319114089u, 4260737761u, 1982976744u, 741084092u, 689793522u, 4260038527u, 1319231386u, 1661185367u), + SC(3846585080u, 1572901113u, 2683774833u, 3251385733u, 3753876990u, 849242549u, 4245340911u, 1064393430u, 3309340124u, 2842098330u, 2556268102u, 2033409485u, 757257328u, 2031055308u, 487255243u, 3197919149u), + SC(273355511u, 2413549351u, 710350577u, 1361281890u, 2485522754u, 1210096318u, 3839671116u, 3619357718u, 3954210633u, 312725146u, 3792397974u, 3833954588u, 1779821907u, 2701218449u, 2422680647u, 3829673069u), + SC(379167192u, 3494512635u, 855436470u, 2928216366u, 4239059924u, 4254878455u, 3617218283u, 739826290u, 3488721213u, 1288540569u, 2623691196u, 4237777587u, 1234356449u, 2367467024u, 185343202u, 2198868227u), + SC(333398980u, 1306721698u, 1267933489u, 3888643170u, 2305763143u, 1886386521u, 2247721544u, 1287414137u, 497238456u, 1934421131u, 1960709128u, 2688614248u, 3637710577u, 3756130276u, 1929365309u, 2796038772u), + SC(772805737u, 461244658u, 3551164236u, 4177074918u, 3920537361u, 4259237061u, 3625379235u, 3715444221u, 3444473673u, 2576271136u, 2750230085u, 2167864295u, 2571239709u, 3663560660u, 743894391u, 703945624u), + SC(2955504442u, 4192737708u, 2813336533u, 2037901957u, 1563142269u, 620241136u, 3249364868u, 1805455553u, 422364625u, 3061329310u, 3824436397u, 1640020182u, 2540832302u, 2063844885u, 2982901072u, 2809011473u), + SC(4188085081u, 1849071252u, 4251112483u, 1368274267u, 2811635355u, 3535120523u, 478922770u, 1090405967u, 2358353504u, 2249592823u, 2367480425u, 1158857070u, 1979230110u, 3661225756u, 2903524693u, 1830110173u) +}, +{ + SC(3638948794u, 3243385178u, 2365114888u, 1084927340u, 2097158816u, 336310452u, 231393062u, 580838002u, 3851653288u, 568877195u, 3846156888u, 2754011062u, 3396743120u, 2639744892u, 1431686029u, 1903473537u), + SC(3268926613u, 1818698216u, 1862252109u, 1578913474u, 4289804840u, 1885759995u, 2888888373u, 2636129891u, 2360477693u, 1672434489u, 4188472821u, 2046052045u, 437371108u, 3454488779u, 2151384078u, 1514762405u), + SC(3140765176u, 3623124217u, 3204258419u, 1994235030u, 4141313973u, 3067394014u, 3891883464u, 3387486245u, 3254639322u, 1970078634u, 2106725210u, 2833086525u, 1670513208u, 472865524u, 2121280699u, 2548725819u), + SC(309446023u, 3610145983u, 678094472u, 3223511337u, 4188624231u, 2675209562u, 619208065u, 1214683627u, 307823706u, 3407147709u, 2103429213u, 3636822787u, 2441204583u, 1675916090u, 1444359140u, 2979809856u), + SC(1982287011u, 2286805587u, 3436767742u, 3002584758u, 477850697u, 439716674u, 3863581947u, 2155905635u, 220608999u, 1402913678u, 2974580099u, 1207717136u, 3265452095u, 2174870701u, 464004734u, 3218951674u), + SC(2374025586u, 3926883961u, 3555874460u, 1238670328u, 856489843u, 4258163476u, 977941661u, 3889087192u, 2262660846u, 1677408901u, 2922467369u, 1043137100u, 4279650771u, 3357788771u, 1512036754u, 2539641395u), + SC(1142842756u, 272648505u, 914080820u, 4056304706u, 1529598235u, 1542384711u, 898735874u, 77881967u, 1035144846u, 702992091u, 2075420139u, 2454875215u, 1266516833u, 2974932401u, 3666315911u, 2262316403u), + SC(282628724u, 2966722803u, 3533567779u, 2474391608u, 1236598744u, 3094620093u, 2714845907u, 369896328u, 366951725u, 2971547133u, 2753808137u, 618960857u, 2006195012u, 551749950u, 1402811398u, 3808228405u), + SC(962649761u, 2486282608u, 1808066694u, 2361174774u, 234593415u, 400975056u, 83848885u, 1091105486u, 1020816894u, 1838575736u, 2668167699u, 73800319u, 2028242253u, 2121917721u, 1921251529u, 2828854963u), + SC(2717497535u, 366873177u, 336873963u, 978494261u, 2877822089u, 2054875183u, 2521644031u, 4057807064u, 3713415744u, 3955164880u, 2229410320u, 3755022307u, 3363858805u, 1398106956u, 800395520u, 1799982442u), + SC(399227430u, 164572050u, 2101616757u, 962629850u, 1654784623u, 3459989194u, 2240801569u, 1986371042u, 1911756881u, 2723553175u, 2964071573u, 3609789600u, 3185432638u, 2208423303u, 2967147750u, 4279453877u), + SC(282950688u, 2418348758u, 1686423600u, 1392917024u, 3343336708u, 976718153u, 671781049u, 4166009090u, 371505957u, 2474457927u, 1126253569u, 3355537407u, 4151375790u, 2105071839u, 941370857u, 331122028u), + SC(2127306191u, 1587304141u, 1137651997u, 1529991785u, 1356564935u, 726775332u, 1952136309u, 4003891353u, 61741949u, 780292838u, 1136081573u, 1836882786u, 528077243u, 30578492u, 465809744u, 2709331701u), + SC(4118645416u, 3394012023u, 348789448u, 3808052591u, 1284813572u, 265335400u, 545565522u, 929596026u, 744207086u, 3837069751u, 130735480u, 1107476780u, 910486599u, 2623115273u, 1478462314u, 2130033795u), + SC(1955617954u, 1897311939u, 3110934223u, 4221780767u, 1556888759u, 3849614629u, 306928433u, 3178221670u, 2099698284u, 308858727u, 2221495536u, 1221057715u, 974275765u, 2399830054u, 3285960273u, 1758193777u), + SC(1309372774u, 3725783295u, 3135972452u, 3122681380u, 3898315320u, 1245625291u, 3684458552u, 2498694383u, 145248803u, 3480764710u, 874108791u, 2482726617u, 434324108u, 1522025692u, 3554266182u, 2125028368u) +}, +{ + SC(4095464112u, 3774124339u, 1954448156u, 2941024780u, 584234335u, 483707475u, 286644251u, 3027719344u, 2257880535u, 651454587u, 3313147574u, 3910046631u, 3169039651u, 2576160449u, 696031594u, 3062648739u), + SC(3459141530u, 1009969738u, 35229281u, 2373814441u, 355537356u, 4228991558u, 213496956u, 1669603654u, 1552983955u, 3304370832u, 604896268u, 499179421u, 2737968344u, 807678026u, 3567168353u, 2353882345u), + SC(2454671851u, 2184874449u, 831795291u, 1169825676u, 1084590471u, 1942690394u, 2762211706u, 3042637679u, 2365319338u, 3552008694u, 348752618u, 993280940u, 1178602031u, 1559708076u, 3354759347u, 972286478u), + SC(2677560697u, 4247966509u, 151962163u, 3310844434u, 2986095882u, 3914030856u, 3436387520u, 860446559u, 4289606749u, 2343453766u, 3218454181u, 293342071u, 1238022655u, 3938175190u, 1394478132u, 4256084776u), + SC(3033685698u, 1795086146u, 719843849u, 255984080u, 2447365525u, 874035973u, 313642533u, 1163634918u, 2316564524u, 1195940716u, 1914843207u, 3907025376u, 23457264u, 1278433300u, 3111232984u, 668125878u), + SC(2135745017u, 2899432034u, 1819124473u, 2109840859u, 3124696519u, 2070710502u, 990727745u, 2752134271u, 1963223245u, 866344359u, 606159585u, 3867224292u, 3038840373u, 3295910586u, 2433460716u, 3384811471u), + SC(1744070416u, 383286836u, 3000319326u, 3310329765u, 4062980155u, 2749127191u, 1895582230u, 439084228u, 1884304792u, 326674045u, 377650590u, 3363592478u, 2947641322u, 1784390018u, 1332541121u, 4203919218u), + SC(472957101u, 1135650637u, 4212757570u, 185931877u, 2096733734u, 4238795506u, 481917546u, 1405180051u, 925427330u, 1923351053u, 2204480714u, 3944038373u, 372144582u, 3395978522u, 3795034464u, 1074487901u), + SC(227727393u, 2219043153u, 2909459085u, 3082645761u, 1970114976u, 3426610084u, 35253812u, 3123666967u, 4231900027u, 2888054525u, 2744804820u, 1500359618u, 191232240u, 3239664209u, 1569663960u, 1330983134u), + SC(996304063u, 2759713926u, 1022152104u, 4268512678u, 2870837640u, 3507597858u, 1252922637u, 3276898019u, 3824649934u, 1524401760u, 2559990337u, 1660220688u, 2350855385u, 609332995u, 2406016501u, 2406242521u), + SC(3333888266u, 3838886221u, 3016467419u, 3341790649u, 3667104212u, 783789160u, 1310400762u, 3633793516u, 4105695306u, 2973076533u, 455893547u, 2864660063u, 3696934279u, 2872882056u, 2264350097u, 539812697u), + SC(3263458726u, 2820785414u, 3760367911u, 628854049u, 1473785327u, 426717862u, 2025377226u, 3498407835u, 3577945153u, 1319190911u, 1062047947u, 3346460201u, 2590672215u, 2723591074u, 1487439866u, 4217021014u), + SC(2076058913u, 33130418u, 1949000294u, 3536165044u, 31327487u, 1891010986u, 2347335564u, 1669503944u, 3753248202u, 881959988u, 3846164684u, 3636142472u, 208517894u, 3407391141u, 3485893709u, 1074365179u), + SC(2175348532u, 3463201667u, 168136052u, 2889266255u, 4105885613u, 3068947090u, 2279310533u, 2649966235u, 828612565u, 2017635648u, 1260407590u, 1970316631u, 2447304459u, 2893112079u, 2425504835u, 1197046834u), + SC(2653983058u, 1419924288u, 2320709126u, 3640188854u, 2683911962u, 2643927342u, 3261193464u, 3929873787u, 2878724355u, 3436083049u, 3424148509u, 1311037973u, 3116391362u, 2037892948u, 454042580u, 970415398u), + SC(16199673u, 2464180001u, 89776423u, 672570852u, 2291071982u, 3899998968u, 4262439281u, 412856039u, 3677249728u, 1182323568u, 3472045521u, 3554674668u, 819725249u, 4078699211u, 2037243914u, 4166444096u) +}, +{ + SC(1740919499u, 3877396933u, 2326751436u, 2985697421u, 1447445291u, 2255966095u, 1611141497u, 1834170313u, 3589822942u, 2703601378u, 299681739u, 3037417379u, 4014970727u, 2126073701u, 3064037855u, 2610138122u), + SC(2959647136u, 3814991611u, 764778261u, 1677371416u, 497556143u, 1000564042u, 4065791500u, 1027030318u, 2636763418u, 2469599275u, 839050056u, 4115114412u, 3982189672u, 2204140838u, 1747652790u, 3786215179u), + SC(3812425833u, 3703652912u, 1980699604u, 1506061914u, 2330998846u, 3874717363u, 20614012u, 1484655664u, 2896690261u, 1196646483u, 159078055u, 1300317512u, 2570981831u, 1267318554u, 3037645632u, 3117135345u), + SC(2012483448u, 279997059u, 1908492604u, 1638405820u, 284407565u, 1607271004u, 1423855670u, 3949669604u, 1635878907u, 4045715556u, 3600475894u, 3387647818u, 3950223476u, 3109131487u, 2524676171u, 3329048150u), + SC(3505120665u, 1999377488u, 158974979u, 636438923u, 1767149410u, 2424026197u, 532320013u, 3350230775u, 3506414357u, 999737675u, 3415715721u, 797201045u, 3439137094u, 3636888232u, 1001867404u, 1070514934u), + SC(803341976u, 972240723u, 2174569332u, 4037031657u, 720363583u, 1532359940u, 222173943u, 3948724459u, 669414977u, 446802288u, 4195328223u, 2316597014u, 3039478974u, 1217500351u, 1058613984u, 3974805650u), + SC(2497689022u, 832535973u, 4012390289u, 3862385792u, 473134599u, 855172718u, 3160709443u, 2946049581u, 1340978834u, 1282260619u, 3672935594u, 1114896253u, 1194768191u, 2151967837u, 3557909289u, 83919397u), + SC(2685697085u, 4183307820u, 393931333u, 2425217781u, 2950365274u, 2300063381u, 3990090983u, 1961757942u, 3357278228u, 2993935030u, 779960569u, 3652282828u, 1743505267u, 3193034940u, 2134245237u, 4042181132u), + SC(2449311128u, 4037657778u, 318968012u, 1098807866u, 3241626396u, 745989749u, 4126255071u, 850508142u, 4075976689u, 357235455u, 2000916706u, 3900438139u, 2804084317u, 3036848582u, 604252796u, 2006800965u), + SC(101955641u, 2732365617u, 2730133770u, 3908553062u, 2872853047u, 264325893u, 2086018926u, 546076667u, 582367640u, 2242336949u, 2223649162u, 1521240572u, 178342991u, 3408523296u, 2216853754u, 1636770650u), + SC(1697876449u, 998213608u, 2367869150u, 3635535434u, 3029347602u, 2697162358u, 300760335u, 3790588806u, 3127970813u, 157171921u, 2766714052u, 3441353031u, 3760111386u, 1962222723u, 1338315915u, 1705537099u), + SC(2069540711u, 3174156395u, 3834082852u, 2243125169u, 1332693007u, 1773075089u, 820191370u, 262117783u, 184405617u, 469065021u, 1286610377u, 946922506u, 2233109630u, 2803987975u, 489850357u, 3341265389u), + SC(3152895344u, 3190413328u, 1371373852u, 2133030998u, 2097773989u, 3484604561u, 3233580762u, 2103971308u, 580626917u, 3723142348u, 1233964596u, 2884246809u, 1451113068u, 2274332609u, 834566918u, 4166322862u), + SC(474309298u, 31198476u, 474732582u, 1614612386u, 2339718649u, 702598622u, 2007092771u, 1563921691u, 3096928870u, 2036801390u, 3171632090u, 2666464957u, 2581592302u, 84487705u, 4066440296u, 250703600u), + SC(2850943751u, 3355276358u, 3608928556u, 645558581u, 1754003398u, 2401097307u, 4007141515u, 2306720640u, 2585847442u, 2486681168u, 916961025u, 2906286711u, 2183350629u, 3403456959u, 1234360906u, 608407455u), + SC(3919397u, 2910764499u, 1130649170u, 2504839137u, 475960727u, 4198145923u, 3575554927u, 727034596u, 3487299979u, 2134210036u, 1295494166u, 1094003986u, 3153584442u, 1125501956u, 1050325095u, 3018071122u) +}, +{ + SC(1456510740u, 215912204u, 253318863u, 2775298218u, 3073705928u, 3154352632u, 3237812190u, 434409115u, 3593346865u, 3020727994u, 1910411353u, 2325723409u, 1818165255u, 3742118891u, 4111316616u, 4010457359u), + SC(2413332453u, 1353953544u, 4051432026u, 303594340u, 1259813651u, 366336945u, 3380747343u, 2634392445u, 2066562619u, 120707135u, 1398541407u, 502464084u, 2984999938u, 3829298149u, 1120989122u, 3373752257u), + SC(1681071159u, 120984332u, 2029459879u, 1382039080u, 3634662556u, 54408822u, 48099449u, 1179080842u, 2669759950u, 3169946602u, 1520730683u, 3878549631u, 1666070500u, 1804495215u, 1101808889u, 1988315741u), + SC(1810699040u, 1982264875u, 1311915666u, 268159494u, 1265118580u, 1494821999u, 2740360551u, 3403457379u, 2370002476u, 3663200326u, 1969174367u, 2988878975u, 2261867571u, 1896957751u, 4228495601u, 268030737u), + SC(3788031612u, 1459331879u, 4195039120u, 148760443u, 2710036304u, 3803193725u, 2316636996u, 1290739855u, 2078515077u, 1158390637u, 187516666u, 1165781180u, 3871854912u, 2887741280u, 3432370474u, 3017515415u), + SC(2660400581u, 1115514969u, 819611304u, 2438542525u, 1149450061u, 641570348u, 4195260176u, 114239580u, 3415942550u, 2418164759u, 3596450733u, 4170880111u, 3742333800u, 707266970u, 294392938u, 1502400257u), + SC(4244209414u, 4144723933u, 1206802017u, 3395049043u, 1534528858u, 212213384u, 273948964u, 2465871688u, 98513287u, 526054552u, 101003852u, 2178852720u, 1739213138u, 2000068838u, 3443316390u, 2907641948u), + SC(4170329393u, 2397160575u, 698736458u, 1726629095u, 2059726015u, 608224441u, 940962377u, 3160021800u, 2474105021u, 1418624931u, 3220142189u, 3165061177u, 609263259u, 3526248509u, 2451110984u, 882122082u), + SC(1803413035u, 2626850042u, 3923382679u, 2501640460u, 887077755u, 2970691407u, 3982443858u, 546345352u, 545064661u, 1905866916u, 4137411501u, 4293519422u, 399697152u, 2101209662u, 4081268472u, 3745325674u), + SC(3913855272u, 3324082002u, 2401043817u, 1769760109u, 2460560183u, 875956117u, 1942607787u, 1641754800u, 1964565342u, 442388011u, 1687580604u, 293988342u, 3046598358u, 2835075967u, 920490836u, 349604594u), + SC(2643665013u, 1607952309u, 2279132309u, 992705865u, 1231530495u, 2682680275u, 2340070945u, 1036310446u, 2160469638u, 3849593659u, 569936175u, 133751759u, 1309000826u, 3681058360u, 1289881501u, 385711414u), + SC(1190130845u, 2798968177u, 277741425u, 3875973536u, 2502592372u, 251555512u, 1825737360u, 462006518u, 2334535950u, 3997809264u, 2012251623u, 3408888487u, 2549759312u, 3379458376u, 2301581275u, 4171117892u), + SC(1923456093u, 1653002750u, 3279649712u, 4281661052u, 1248011568u, 933375742u, 2109342469u, 751470571u, 2742486580u, 2572871261u, 3296809419u, 4075155428u, 3182626853u, 3435860599u, 3916597057u, 245531435u), + SC(514908612u, 2222061780u, 506774061u, 381342968u, 789366883u, 3683832850u, 9270407u, 528428861u, 590313143u, 483933274u, 1128871308u, 2791400346u, 3033966006u, 2397900561u, 174539653u, 2363998101u), + SC(3558289816u, 1015432688u, 3960686128u, 2087286003u, 446928557u, 4028273076u, 3055038539u, 885707705u, 942001648u, 3175434773u, 3929872598u, 2961036794u, 1122092143u, 2142675404u, 4054255588u, 1958229328u), + SC(2852327378u, 1383667573u, 3763466478u, 3195889922u, 2107642962u, 1739908882u, 157313327u, 492435243u, 4236498733u, 1510923342u, 3227437908u, 1896980749u, 154410481u, 2958311799u, 3270353062u, 1889012642u) +}, +{ + SC(822693957u, 1703644293u, 3960229340u, 2092754577u, 3495958557u, 4288710741u, 4092815138u, 1275224613u, 2592916775u, 472063207u, 2931222331u, 2597044591u, 1261640449u, 1272207288u, 2040245568u, 1417421068u), + SC(57865933u, 2591783175u, 1332940705u, 2361514832u, 2842982424u, 2581566511u, 1328343723u, 3898369656u, 2090549923u, 2179715082u, 2370481583u, 775215786u, 3850307123u, 2489521783u, 3999750482u, 1014134079u), + SC(2011629934u, 1914036612u, 3406392133u, 1425412057u, 1338374071u, 683386303u, 3190457777u, 428137206u, 1251032257u, 3672462899u, 2593185313u, 1953316437u, 2123216916u, 3258622817u, 3197533388u, 3442579011u), + SC(265734183u, 884987600u, 2786263189u, 3536027957u, 3885575220u, 1854265340u, 3853595664u, 1987453181u, 2744740518u, 512197390u, 114481815u, 96285071u, 3293497789u, 4015333892u, 4092376929u, 3025411574u), + SC(612519829u, 3198151239u, 3191059512u, 226844204u, 3503855660u, 764021515u, 3628841562u, 3951882416u, 3622158804u, 3603368155u, 2780109382u, 822859403u, 25907739u, 3882220368u, 3789068172u, 1684074913u), + SC(3520260226u, 1656105499u, 1676578448u, 838040958u, 3130046810u, 995588852u, 3233766730u, 2629592527u, 3096399775u, 1659682138u, 1365617549u, 2450677843u, 1725372848u, 2623357383u, 1402837393u, 1993344168u), + SC(2434333993u, 2901722469u, 518468307u, 3322336116u, 3303354477u, 2422295273u, 3584734361u, 1255342255u, 2224600785u, 3752112711u, 3720624102u, 3425652159u, 3563799906u, 957522630u, 501907560u, 3362627156u), + SC(3271809032u, 2402529419u, 3935184016u, 3639910664u, 659985988u, 2584831332u, 1091987512u, 224789177u, 2944016703u, 3591574599u, 1273021052u, 967556634u, 1019501719u, 1864898605u, 3453844870u, 4011599553u), + SC(1326048883u, 3477092042u, 1799777609u, 296885426u, 1109310872u, 255028335u, 163456938u, 2108662143u, 3501831646u, 225777648u, 4099069764u, 3428610561u, 4069711767u, 3876386370u, 1215899260u, 369937558u), + SC(3466874302u, 1921411468u, 3753149186u, 3739960133u, 1909238781u, 2219053499u, 4040572016u, 1651280893u, 754573870u, 383500798u, 2400558032u, 922698902u, 2125517085u, 2541623325u, 2827334144u, 2773618829u), + SC(2040368526u, 2190975469u, 1347589661u, 1684817146u, 2021572959u, 1656810013u, 330975936u, 994237514u, 2596719101u, 3800849855u, 600269956u, 1857741551u, 3033366103u, 1496147464u, 2628189942u, 4210116847u), + SC(3076719908u, 2490548320u, 377911263u, 2002478742u, 2549252529u, 839159951u, 230337140u, 3095221595u, 1528132928u, 2083899038u, 2503451113u, 272698731u, 2624407067u, 161482016u, 4135914440u, 2519252428u), + SC(2556876861u, 2107629748u, 2377697213u, 1433609947u, 3343742332u, 3505415093u, 2690575000u, 2017949066u, 4133794057u, 4184820210u, 2960078982u, 1333558937u, 3733636790u, 3960011078u, 945143131u, 3343864106u), + SC(1801254589u, 1449097227u, 181948563u, 1034221031u, 1779862110u, 3141289560u, 3383585093u, 2578193674u, 554670851u, 2530857925u, 4076682145u, 2827602863u, 4244507626u, 2938597885u, 3223414171u, 2204001183u), + SC(291814305u, 2937237569u, 1434020428u, 3585179044u, 3677832974u, 2016114805u, 3981784693u, 538800869u, 2673738915u, 999373833u, 1457987857u, 3180983013u, 501300267u, 4103517997u, 997980659u, 1113009463u), + SC(3993610129u, 1037741502u, 330412440u, 2749687355u, 1555232145u, 1196959672u, 530284980u, 340384986u, 2298150586u, 3185141181u, 26985524u, 2219307959u, 2447245692u, 1065988754u, 1248620406u, 2208024308u) +}, +{ + SC(3660855132u, 3816892380u, 3431508003u, 1440179111u, 768988979u, 3652895254u, 2084463131u, 3991218655u, 323118457u, 3675476946u, 2157306354u, 2684850253u, 1543808805u, 744627428u, 1091926767u, 3538062578u), + SC(2810298495u, 3411171710u, 4062828084u, 3003344135u, 3264709694u, 1048068132u, 3549102117u, 1927032841u, 3841604555u, 1360558064u, 2204714588u, 1197341693u, 3768005385u, 2899352192u, 2849083812u, 3793398404u), + SC(3631867959u, 3146872034u, 420513606u, 2446059169u, 2652499910u, 429155541u, 748397809u, 3543114527u, 235482177u, 894763888u, 1086818023u, 3285579564u, 1810274445u, 1142434275u, 140188668u, 4059040723u), + SC(2682453748u, 1595694625u, 17869409u, 4001607469u, 759206176u, 3336900820u, 3693692341u, 2473365492u, 2714988574u, 637563477u, 4105755464u, 3161387095u, 2814461644u, 4283494186u, 3858290792u, 1516784203u), + SC(4062605051u, 1956634460u, 3701616314u, 2342355265u, 1267526896u, 464674235u, 2247549950u, 3633206724u, 296547100u, 2905295542u, 4077085273u, 2746567644u, 1803616500u, 918536622u, 2709233803u, 2413530101u), + SC(1383097263u, 1316928613u, 759541292u, 3793001510u, 257497874u, 3658838865u, 3213596633u, 3650670599u, 63812226u, 1947202098u, 3651967368u, 2399936732u, 2521262969u, 322630211u, 4004516883u, 1422335688u), + SC(2852550033u, 3224936812u, 733055828u, 3325391168u, 1930707186u, 731324754u, 3498518219u, 4117056191u, 2179511600u, 2761523161u, 4282458808u, 3042559735u, 2438675720u, 2532100345u, 3706723018u, 4059342362u), + SC(2048163474u, 1848349034u, 3258863528u, 3644103333u, 1151231486u, 3308192205u, 2814277731u, 4197063636u, 3510455851u, 1315219655u, 2185965649u, 3799505477u, 4254363720u, 3128925961u, 1852465545u, 4138612075u), + SC(960983998u, 3301464188u, 2737893955u, 1522861436u, 4164105020u, 1184099683u, 64022400u, 2368856028u, 326418376u, 2065332946u, 2081529277u, 3466798514u, 208026276u, 417986090u, 3587033208u, 2294843214u), + SC(2712989146u, 349068332u, 3978782854u, 1513755929u, 4281030368u, 4041238337u, 1631550267u, 936378809u, 3831648862u, 1780262732u, 3189639539u, 328937247u, 722753719u, 3671027558u, 215485348u, 294998383u), + SC(170533035u, 3100330628u, 2519007245u, 2729143680u, 1780483799u, 1771308699u, 777046078u, 1252661309u, 944830935u, 3219243484u, 2959537667u, 145170296u, 892161275u, 1151850054u, 2176346749u, 598783080u), + SC(3596882604u, 51304713u, 1277701547u, 3288737023u, 2143659411u, 1229626338u, 2504854740u, 2518260221u, 2909459409u, 3820898741u, 1076396276u, 3330086214u, 2070741501u, 1675949151u, 4169029889u, 2072266145u), + SC(3395707749u, 1912264784u, 839246291u, 1812660322u, 2590197689u, 3115125394u, 280633483u, 1476186344u, 2182942190u, 4022517575u, 1314348304u, 2211853573u, 1730367526u, 3842875309u, 1411362967u, 749836026u), + SC(822183119u, 2084092802u, 2957672615u, 1548122281u, 2555590320u, 4127903458u, 704941703u, 3216796016u, 1310798669u, 1681974379u, 2704001393u, 836064664u, 2498528840u, 2878347924u, 3344415063u, 1714110968u), + SC(3763417450u, 1647484613u, 2916400914u, 1340277384u, 3671023234u, 2962715012u, 2086976330u, 2356641838u, 861453503u, 2497852292u, 3384683911u, 2044029625u, 3423593678u, 602612346u, 1947876325u, 1071593133u), + SC(502143537u, 3800930061u, 289630048u, 2019675509u, 690814111u, 1395759030u, 2095320716u, 1658529388u, 2140950369u, 4113871752u, 2130755443u, 1184235968u, 2624156111u, 1053548247u, 1666584094u, 3436241707u) +}, +{ + SC(2819478132u, 2629026829u, 2945562911u, 1854605392u, 41922071u, 2531530491u, 2316774439u, 3550381961u, 1180787169u, 3914439365u, 3786421842u, 3441223373u, 494782102u, 2858003292u, 1448968751u, 2940369046u), + SC(1228705098u, 2320747717u, 1742025124u, 3358828738u, 1857762103u, 2669617968u, 2684123743u, 2427291148u, 3948024171u, 3841263454u, 3817968782u, 3617000488u, 3457510946u, 3443415072u, 3976288418u, 291039859u), + SC(1118114309u, 1364783097u, 3986370035u, 1058514953u, 3723130907u, 2966082807u, 1592373613u, 4029958112u, 1261460522u, 159904028u, 385928252u, 2962822321u, 213058425u, 39305506u, 3400567258u, 2953928339u), + SC(4004285350u, 3275325131u, 2912133301u, 482119944u, 699333459u, 1353300830u, 498723416u, 2738735797u, 3773472794u, 1167510524u, 1995708610u, 1872986795u, 1771998886u, 460328822u, 2566240531u, 3665251184u), + SC(870908870u, 249845288u, 3674648542u, 3670939624u, 3213883826u, 2765218754u, 3292181727u, 1765634472u, 2846619223u, 156162860u, 2158300764u, 3792761756u, 4248292998u, 1588571137u, 1696144875u, 2915693433u), + SC(1257645965u, 743351844u, 3299328612u, 1606739395u, 2242479072u, 526126122u, 3132670209u, 2327012389u, 1257540758u, 1688790030u, 864103666u, 1782879705u, 2344074317u, 878043196u, 569218289u, 3875319913u), + SC(676712446u, 2310487862u, 3297058723u, 154140360u, 1534807165u, 2207878247u, 4002312458u, 1195155314u, 3973562995u, 203866583u, 1307033594u, 1808951889u, 3485439766u, 2123920858u, 3400721970u, 628518531u), + SC(453432196u, 3506137302u, 962794710u, 2800823697u, 944975983u, 445662356u, 620440622u, 225699982u, 1038708892u, 3484553780u, 4174808994u, 3862318255u, 1961625058u, 2183421173u, 2682639230u, 3890472885u), + SC(3472048934u, 1436162338u, 4281682055u, 1419885595u, 1926695253u, 861477946u, 2586543901u, 2286266784u, 2854911092u, 1779735787u, 2994125983u, 2248840912u, 677288518u, 3593153557u, 3383199489u, 2094768467u), + SC(971218259u, 3653638590u, 3374334294u, 479058129u, 1331477004u, 2497262229u, 892109896u, 3651901580u, 1455849852u, 2738531309u, 14202660u, 1968080740u, 1927308794u, 897128363u, 3654300057u, 1275380700u), + SC(684658124u, 660984744u, 2929312783u, 1473333980u, 1562502960u, 656352357u, 338449257u, 2159155320u, 2425193686u, 930413364u, 2001285554u, 307432757u, 2238003500u, 1858295105u, 481986971u, 1067622012u), + SC(943383548u, 127299943u, 2909652237u, 1257655712u, 4123282405u, 78394323u, 1736026340u, 2126927829u, 296638455u, 1861436609u, 641299684u, 636649068u, 3331138991u, 1014270261u, 257248847u, 1556179874u), + SC(2668740334u, 4261010365u, 3376970497u, 2258271000u, 3369826513u, 906131732u, 12531263u, 2501581679u, 861444520u, 2059219969u, 3536488433u, 3392343056u, 3231250347u, 3425501702u, 4204845226u, 3883035310u), + SC(875006280u, 3061145215u, 799684212u, 4150716124u, 1344915012u, 1442298502u, 887378800u, 2722425542u, 4141895498u, 4068116328u, 601774281u, 3538746538u, 1671758462u, 3066546971u, 1116345758u, 554718074u), + SC(1149406575u, 702696847u, 505403366u, 331269161u, 664926760u, 2151357672u, 2890104906u, 3156886545u, 1199701084u, 1614409973u, 4222014462u, 1336462493u, 3214687968u, 1279434993u, 2285235388u, 2975474024u), + SC(2419658919u, 481424988u, 2207220911u, 2736159805u, 4086711147u, 477511738u, 1428567116u, 3971000648u, 429362137u, 3495313342u, 3653961670u, 4170077754u, 2057308114u, 1445981917u, 97057494u, 3847612010u) +}, +{ + SC(3017729014u, 3423125690u, 1534829496u, 1346803271u, 888659105u, 1661894766u, 4165031912u, 697485157u, 3575889724u, 1795181757u, 1507549874u, 1480154979u, 3565672142u, 830054113u, 1507719534u, 3652903656u), + SC(4123340423u, 2168639254u, 3491407759u, 395600125u, 2056091205u, 1233197217u, 2716612715u, 3263564356u, 2257286689u, 2753339767u, 2228663460u, 3584404544u, 3972978154u, 3637886739u, 3854541466u, 1603898424u), + SC(641806023u, 3776877383u, 3574980110u, 2564901152u, 1378226343u, 738790225u, 4030459977u, 2255719927u, 295765315u, 60094770u, 422069111u, 439158593u, 3956842123u, 1242303994u, 150522972u, 3682386439u), + SC(2385589330u, 2076597417u, 605447848u, 3200763641u, 3106877254u, 3374069827u, 3828392492u, 1315607291u, 3211667999u, 305089333u, 179172787u, 3225149656u, 1080822644u, 3286534940u, 2231515542u, 2699760148u), + SC(3983719183u, 1208009460u, 767048521u, 326825213u, 1087716958u, 3599826498u, 3107818740u, 2785268698u, 1304576537u, 1847155836u, 3250405674u, 2694326935u, 2163030471u, 3253944705u, 1698753082u, 3845065767u), + SC(2823293375u, 2790862099u, 1207038844u, 3886043838u, 3567640686u, 3799791258u, 1638354726u, 1428653770u, 2075289233u, 1582582790u, 213364421u, 2858522524u, 2809903954u, 1742449197u, 324107072u, 1051562955u), + SC(2291926834u, 1805734123u, 3420689573u, 1003089617u, 476535216u, 1334543097u, 2045923069u, 2990972415u, 1822043289u, 2128934150u, 3541372378u, 1912558832u, 2295908612u, 1500502429u, 3539272060u, 2641558214u), + SC(3069594753u, 3051481608u, 2339450545u, 2054924228u, 4282917353u, 65440790u, 2134400604u, 3588265957u, 2569563771u, 741034486u, 740973978u, 93172292u, 1583303041u, 2980574219u, 2969067524u, 1088571815u), + SC(78721532u, 1566330912u, 1219109269u, 3229207312u, 2345730495u, 3209647323u, 2033975193u, 1009666575u, 2794060854u, 4218956981u, 3379703631u, 2400336569u, 100401885u, 3519721431u, 4007729122u, 3851183625u), + SC(2344993313u, 2454241381u, 3071516966u, 4207668067u, 250885582u, 1733938903u, 1658948056u, 2192440210u, 1717829063u, 849763004u, 2334162093u, 3715296533u, 1757279167u, 3270001477u, 2677428083u, 4197601814u), + SC(2911676146u, 4069956071u, 3299890629u, 3133371278u, 3551760603u, 558967408u, 205243474u, 237180706u, 4227661901u, 390685951u, 658498389u, 225847327u, 3028263358u, 3941067795u, 1850521034u, 1584413524u), + SC(304549398u, 3089811378u, 549382137u, 2353383127u, 2278640956u, 781853185u, 1734676013u, 3311472816u, 957105351u, 1291924767u, 2025324585u, 3897237789u, 80455313u, 302089802u, 3496158310u, 4000611245u), + SC(1221283087u, 3865703766u, 1551786763u, 3208862988u, 2964616465u, 1429406173u, 2847895093u, 3047143885u, 3187847794u, 3875229246u, 2044093786u, 2855772466u, 2252977997u, 1253496627u, 1824313803u, 3492626272u), + SC(1435191953u, 2954553263u, 3689501374u, 3761866706u, 3160683386u, 2172174457u, 4033800334u, 2293562561u, 500568896u, 2877151546u, 112648553u, 2760351679u, 1976713840u, 2960166087u, 1364536484u, 4127293522u), + SC(2942286091u, 3570696800u, 2680748212u, 879905933u, 371824626u, 2796545677u, 2544287558u, 1654320774u, 3724452395u, 1875952433u, 1755420330u, 700510406u, 2122483560u, 357724466u, 2579725929u, 4152935597u), + SC(732269412u, 3045632405u, 947036931u, 2403831527u, 2919479301u, 2947112020u, 1653738112u, 2316444303u, 3103978479u, 2856978461u, 308282125u, 1154683958u, 2086296447u, 1288456128u, 528614237u, 2945631134u) +}, +{ + SC(3751554592u, 1759634227u, 4138518211u, 3130599659u, 3881948336u, 669688286u, 3672211577u, 695226401u, 1226786139u, 1855160209u, 905875552u, 2831529665u, 1625185017u, 3130043300u, 3227522138u, 3659203373u), + SC(399372699u, 529779700u, 1206056828u, 1867177702u, 196488961u, 2148657353u, 2522788662u, 2308787051u, 1566407979u, 857878238u, 2852634973u, 2131204123u, 2812808340u, 3651465982u, 1947448513u, 3757182587u), + SC(3732610632u, 1025396308u, 60450219u, 3075208965u, 2460440177u, 301478800u, 2020185415u, 2910424285u, 1627945543u, 473410099u, 4114096970u, 2440686062u, 3031404169u, 2099206907u, 1232790956u, 2248800462u), + SC(2343232878u, 1198836246u, 1270188071u, 2305538045u, 1841160260u, 1049160535u, 2935147928u, 3818293360u, 2128394208u, 692132409u, 3183837651u, 981952986u, 3501941431u, 1239605342u, 1265208179u, 225920797u), + SC(1958540456u, 418545838u, 1645667403u, 4203505141u, 81660142u, 351421726u, 2877676470u, 871152679u, 2804776066u, 431108218u, 927442607u, 3782508732u, 318483929u, 4079394971u, 1143889788u, 4195920424u), + SC(2351179626u, 1598459225u, 3579449038u, 4292231882u, 2911534527u, 3174868713u, 2883217980u, 1046921244u, 3074833211u, 117299980u, 3425406982u, 2813303717u, 879305153u, 3439142119u, 1270010014u, 2633468950u), + SC(3394012837u, 1133386629u, 2931266329u, 2512080059u, 3268046571u, 585832644u, 1151303760u, 4164956195u, 1787214290u, 3523549326u, 4139598868u, 530139359u, 2107355242u, 1401770006u, 4264627539u, 3014221080u), + SC(1988836761u, 3474599222u, 2535855552u, 3118306895u, 1953046625u, 30632894u, 8987922u, 1482010220u, 1585584845u, 441041520u, 3045700482u, 362734762u, 3723600227u, 1056985402u, 2472480517u, 3558297033u), + SC(4137318322u, 915055827u, 1432589840u, 3550795442u, 1919127293u, 1256417138u, 946345068u, 1353195020u, 2948635882u, 3916808200u, 3223857138u, 2259986522u, 636089773u, 2116476405u, 266813303u, 3992924481u), + SC(1294364269u, 2282087282u, 719947200u, 1065389577u, 67185303u, 600695627u, 3423704882u, 507439949u, 1464333499u, 954935833u, 1949391476u, 2146234814u, 640934838u, 2477152026u, 3767255766u, 2397668523u), + SC(1825548026u, 2780595753u, 282065873u, 3347141416u, 3152283414u, 1656153711u, 1047376382u, 3616949007u, 464657631u, 3299783240u, 1162505878u, 3862534742u, 3899846651u, 3980167606u, 2513773976u, 1803555687u), + SC(734708953u, 181663675u, 2018505992u, 1055015000u, 2266993350u, 3679506170u, 1032089726u, 2239152753u, 3271229362u, 257492591u, 519168390u, 890304984u, 594386284u, 933877218u, 2646719799u, 439652468u), + SC(1253204385u, 2215899770u, 848155650u, 1305331452u, 1831981169u, 4101626048u, 253253616u, 718148001u, 3846087699u, 2362703617u, 564971301u, 878503956u, 2792594154u, 3831500219u, 630060686u, 2654848235u), + SC(2082956373u, 965635733u, 1172460454u, 3057130868u, 485386699u, 558270142u, 2819896785u, 247008390u, 1884023798u, 3291747866u, 1725636793u, 1552257124u, 171155452u, 894504521u, 3157754944u, 4135144713u), + SC(3013624247u, 3479051648u, 3976465681u, 139584997u, 690715168u, 2972053528u, 2543659091u, 81834710u, 261064551u, 1476481099u, 2550215537u, 1381589752u, 3557508349u, 3578290922u, 1272133161u, 3008228265u), + SC(3507369103u, 1077600519u, 1522596015u, 3088783267u, 2852999673u, 751358577u, 733140212u, 3467225217u, 100497019u, 50410977u, 68742811u, 3090618848u, 1603912616u, 2272476179u, 1767751118u, 3249696448u) +}, +{ + SC(2950670644u, 1870384244u, 3964091927u, 4110714448u, 298132763u, 3177974896u, 3260855649u, 1258311080u, 2976836646u, 3581267654u, 3094482836u, 80535005u, 2024129606u, 168620678u, 4254285674u, 2577025593u), + SC(1515179601u, 3578614970u, 3088354879u, 797813018u, 1355130048u, 1083957563u, 119796717u, 2021253602u, 1525138732u, 4127381203u, 3062851977u, 4142386071u, 1213064952u, 3609844670u, 1484215992u, 3431673114u), + SC(1401099367u, 3953214819u, 830584870u, 2207781603u, 918659453u, 4293181358u, 4072336467u, 4282551694u, 262435288u, 1941569548u, 147995405u, 1811389750u, 4118444114u, 1252574507u, 578798636u, 1074483177u), + SC(2872591360u, 1058667772u, 16799222u, 688522560u, 3475129040u, 3433794124u, 1076991040u, 1425059515u, 2939587530u, 236447274u, 3960100164u, 1298525395u, 2761371754u, 4025787449u, 2464666072u, 3981743594u), + SC(3976786453u, 1358319886u, 3905641993u, 1405765539u, 2585003073u, 3447572652u, 741448872u, 3444688769u, 971292808u, 1486657617u, 3079335839u, 862424956u, 248802634u, 1703726921u, 2982469234u, 2682500687u), + SC(4273605693u, 2467118193u, 3538801384u, 3862847335u, 1065478730u, 1602785515u, 1071410798u, 2624755760u, 2768741032u, 2700950902u, 558848464u, 3400938789u, 1410632048u, 2094050860u, 1686695852u, 2101955993u), + SC(4124709913u, 3191744141u, 3038636619u, 2944952304u, 2687117769u, 1502766822u, 14738299u, 223780235u, 32298390u, 1195949618u, 1154476371u, 1873391152u, 273358443u, 2362272244u, 509120994u, 606974408u), + SC(3937286725u, 1520668653u, 941545039u, 3056942351u, 574018151u, 2549472282u, 82289937u, 374652507u, 619831005u, 2134744303u, 1462663193u, 2963006112u, 3726585674u, 1797461239u, 1470634776u, 3441417480u), + SC(2845288945u, 3925574221u, 1989126288u, 3105801567u, 210047271u, 1545005898u, 2572648420u, 2278643173u, 2633053858u, 3288168184u, 3566345146u, 165026071u, 191806458u, 4116335861u, 1768316231u, 3169297484u), + SC(253765755u, 2509241970u, 1926513613u, 3735004917u, 4188741775u, 2806800711u, 281300019u, 3635185u, 3462483807u, 2277745510u, 1708651892u, 1413928970u, 56262931u, 531946794u, 2864634184u, 3118504241u), + SC(4194010611u, 4232988065u, 1802432341u, 3448133339u, 3732370320u, 253801846u, 2726367450u, 3905836819u, 1373544282u, 2066678017u, 3439519431u, 3381452691u, 2754663978u, 535580478u, 2512241599u, 2720083475u), + SC(3589933363u, 4047249230u, 2311777188u, 270484672u, 1108190662u, 2080251561u, 1724842405u, 4014518744u, 1593608472u, 2342434397u, 4205240553u, 2166622191u, 3528923u, 1996089122u, 4284726332u, 989608730u), + SC(2475269743u, 4230552139u, 3917936952u, 3098769598u, 3209444661u, 4188126675u, 3974782724u, 3639917274u, 2711234947u, 1439392508u, 1127433801u, 478802541u, 4223040451u, 2268034322u, 2452212595u, 3508939070u), + SC(2413851784u, 190519100u, 3576747926u, 2710481928u, 2148944938u, 3984096005u, 2427227598u, 1001464024u, 2191178977u, 1139441673u, 3841324161u, 308061908u, 3976150834u, 1467800561u, 3226772030u, 1743883019u), + SC(281260179u, 1415659644u, 915707047u, 1662956706u, 911938094u, 3456789397u, 2082200558u, 947098788u, 4036848108u, 2455542339u, 1466205449u, 4158358953u, 586549709u, 850657486u, 61343079u, 2292663847u), + SC(3487862268u, 4116082621u, 1969417576u, 1466595601u, 3136251120u, 3697533272u, 438943523u, 1041892750u, 1141661777u, 435333448u, 3031876514u, 2121342186u, 209290199u, 256519609u, 1400190683u, 4260080502u) +}, +{ + SC(1406628534u, 2978091511u, 343468499u, 973866526u, 757277528u, 1142388839u, 2945536141u, 3759469101u, 3001571847u, 2170606364u, 1017327004u, 3120716036u, 468321128u, 3656061918u, 2331571461u, 1930702552u), + SC(3117811324u, 4230396490u, 526101390u, 3589443580u, 12282838u, 3055128772u, 453582536u, 750425919u, 87216299u, 1999749165u, 2446098001u, 1907762611u, 183870981u, 3643605669u, 4232900175u, 2946539195u), + SC(3903405291u, 1034986659u, 2587588236u, 1880077572u, 1696686560u, 1243434386u, 3746745675u, 2212912696u, 2031851135u, 575946730u, 2663616094u, 2706019532u, 2635197066u, 1942621203u, 3760379195u, 4173271368u), + SC(2892050679u, 1105289247u, 1519565685u, 2426902952u, 65580444u, 3373395323u, 2112756687u, 3658806066u, 2548718870u, 3586646888u, 3350821933u, 1921239811u, 4061525916u, 3520594550u, 1872307168u, 3464547908u), + SC(2889143489u, 489507550u, 788811400u, 1800916293u, 3249681744u, 1400920516u, 3917828215u, 1093821500u, 1905385813u, 2931012984u, 1800788801u, 1697549042u, 3133274419u, 3606456099u, 2156683634u, 3205410986u), + SC(2814687995u, 4053305746u, 484530004u, 410862009u, 246830045u, 3164065541u, 3723774424u, 3388961612u, 3438413619u, 3662326637u, 2178649434u, 3555798301u, 164350275u, 2341607004u, 3896269562u, 1591806179u), + SC(3226183767u, 3881369008u, 700458770u, 376569395u, 2607908019u, 1353553198u, 2636334721u, 1140283021u, 2632309194u, 1710844790u, 3031461719u, 4081969123u, 3326745889u, 4034909949u, 3950856167u, 3153389256u), + SC(2184243175u, 2166726232u, 3921103433u, 872887260u, 623636347u, 95935618u, 2766774027u, 697875047u, 164043041u, 993154257u, 4114304816u, 3500729957u, 409872172u, 3504722710u, 2806324915u, 717798207u), + SC(1913401183u, 1684394893u, 957780895u, 2366199383u, 3846687839u, 2225031745u, 50628017u, 764720583u, 2251658783u, 1601491318u, 3836612294u, 3836982164u, 1834686310u, 4239983357u, 2677791106u, 718595268u), + SC(641418698u, 3008658673u, 1590313857u, 1025261614u, 1545641278u, 883067087u, 405447843u, 251932751u, 890679795u, 1380695500u, 4259157180u, 4219905082u, 665298826u, 4240175069u, 1720908833u, 2268480568u), + SC(1323007329u, 2757671761u, 531677728u, 1863777888u, 1512057206u, 2416428007u, 297355401u, 2843988168u, 3028483811u, 4269951770u, 844221740u, 1060678479u, 2913804270u, 3550002834u, 1490208797u, 2041637686u), + SC(4098631786u, 3088674341u, 2277647863u, 546429701u, 239595915u, 96051385u, 2043858235u, 356783975u, 3081379864u, 1495630942u, 1713035648u, 2797737429u, 4252005067u, 1174473008u, 182861961u, 1284115192u), + SC(1497340893u, 2990980382u, 435071738u, 25048206u, 1369038540u, 2388914024u, 3985375113u, 3187649864u, 1375850783u, 2762762203u, 3714513839u, 1546363407u, 2343675571u, 416152492u, 1797618344u, 3540898582u), + SC(2184924310u, 2347360549u, 640504537u, 1253044800u, 1440674061u, 1666425671u, 3827600864u, 2022304946u, 2918906490u, 263308814u, 3892002350u, 1942380643u, 1520343008u, 1245225248u, 3081248535u, 2098883649u), + SC(2377054091u, 3295547231u, 2240796492u, 1757295037u, 62158041u, 1809272299u, 4005194159u, 1592984938u, 366675588u, 3144502911u, 2973082795u, 4105706826u, 2851896979u, 3262002710u, 3082369242u, 634669574u), + SC(729159370u, 3948971047u, 1511320403u, 3061460707u, 3090283349u, 1868816562u, 3759558902u, 3868199437u, 2438888892u, 1660478281u, 2415784493u, 3546303863u, 3144683831u, 3066258755u, 2228021651u, 3294706852u) +} +}; +#undef SC +#endif diff --git a/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_main.h b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_main.h new file mode 100644 index 00000000..ff54afff --- /dev/null +++ b/Carthage/Checkouts/secp256k1.swift/secp256k1/Classes/secp256k1_main.h @@ -0,0 +1,5 @@ +//! Project version number for secp256k1. +FOUNDATION_EXPORT double secp256k1VersionNumber; + +//! Project version string for secp256k1. +FOUNDATION_EXPORT const unsigned char secp256k1VersionString[]; diff --git a/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/BUG_REPORT.md b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/BUG_REPORT.md new file mode 100755 index 00000000..989dfc9e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/BUG_REPORT.md @@ -0,0 +1,40 @@ +--- +name: 🐛 Bug Report +about: Something isn't working as expected +labels: bug +--- + + + +Replace this paragraph with a short description of the incorrect behavior. +(If this is a regression, please note the last version of the package that exhibited the correct behavior in addition to your current version.) + +### Information + +- **Package version:** What tag or branch of swift-collections are you using? +- **Platform version:** Please tell us the version number of your operating system. +- **Swift version:** Paste the output of `swift --version` here. + +### Checklist + +- [ ] If possible, I've reproduced the issue using the `main` branch of this package. +- [ ] I've searched for [existing GitHub issues](https://github.com/apple/swift-collections/issues). + +### Steps to Reproduce +Replace this paragraph with an explanation of how to reproduce the incorrect behavior. +Include a simple code example, if possible. + +### Expected behavior +Describe what you expect to happen. + +### Actual behavior +Describe or copy/paste the behavior you observe. diff --git a/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md new file mode 100755 index 00000000..f22af61e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md @@ -0,0 +1,16 @@ +--- +name: 💡 Feature Request +about: A suggestion for a new feature +labels: enhancement +--- + + + +Replace this paragraph with a description of your proposed feature. +Please be sure to describe some concrete use cases for the new feature -- be as specific as possible. +Provide links to existing issues or external references/discussions, if appropriate. diff --git a/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/config.yml b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..095c1d69 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: ❓ Discussion Forum + url: https://forums.swift.org/c/related-projects/collections/ + about: Questions about using Swift Collections? Ask here! diff --git a/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE.md b/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..61a5aa54 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,24 @@ + + +Replace this paragraph with a description of your changes and rationale. Provide links to an existing issue or external references/discussions, if appropriate. + +### Checklist +- [ ] I've read the [Contribution Guidelines](/README.md#contributing-to-swift-collections) +- [ ] My contributions are licensed under the [Swift license](/LICENSE.txt). +- [ ] I've followed the coding style of the rest of the project. +- [ ] I've added tests covering all new code paths my change adds to the project (if appropriate). +- [ ] I've added benchmarks covering new functionality (if appropriate). +- [ ] I've verified that my change does not break any existing tests or introduce unexplained benchmark regressions. +- [ ] I've updated the documentation if necessary. diff --git a/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE/NEW.md b/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE/NEW.md new file mode 100644 index 00000000..b4bcf980 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.github/PULL_REQUEST_TEMPLATE/NEW.md @@ -0,0 +1,45 @@ + + +### Description +Replace this paragraph with a description of your changes and rationale. +Provide links to an existing issue or external references/discussions, if appropriate. + +### Detailed Design +Include any additional information about the design here. At minimum, describe a synopsis of any public API additions. + +```swift +/// The new feature implemented by this pull request. +public struct Example: Collection { +} +``` + +### Documentation +How has the new feature been documented? +Have the relevant portions of the guides in the Documentation folder been updated in addition to symbol-level documentation? + +### Testing +How is the new feature tested? + +### Performance +How did you verify the new feature performs as expected? + +### Source Impact +What is the impact of this change on existing users of this package? Does it deprecate or remove any existing API? + +### Checklist +- [ ] I've read the [Contribution Guidelines](/README.md#contributing-to-swift-collections) +- [ ] My contributions are licensed under the [Swift license](https://swift.org/LICENSE.txt). +- [ ] I've followed the coding style of the rest of the project. +- [ ] I've added tests covering all new code paths my change adds to the project (to the extent possible). +- [ ] I've added benchmarks covering new functionality (if appropriate). +- [ ] I've verified that my change does not break any existing tests or introduce unexpected benchmark regressions. +- [ ] I've updated the documentation (if appropriate). diff --git a/Carthage/Checkouts/swift-collections/.gitignore b/Carthage/Checkouts/swift-collections/.gitignore new file mode 100644 index 00000000..f0e519a2 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.swiftpm +/.build +/Packages +/*.xcodeproj +xcuserdata/ +.*.sw? +/Benchmarks/.swiftpm +/Benchmarks/.build diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/ArrayBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/ArrayBenchmarks.swift new file mode 100644 index 00000000..18801349 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/ArrayBenchmarks.swift @@ -0,0 +1,276 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark + +extension Benchmark { + public mutating func addArrayBenchmarks() { + self.addSimple( + title: "Array init from range", + input: Int.self + ) { size in + blackHole(Array(0 ..< size)) + } + + self.addSimple( + title: "Array init from unsafe buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + blackHole(Array(buffer)) + } + } + + self.addSimple( + title: "Array sequential iteration", + input: [Int].self + ) { input in + for i in input { + blackHole(i) + } + } + + self.addSimple( + title: "Array subscript get, random offsets", + input: ([Int], [Int]).self + ) { input, lookups in + for i in lookups { + blackHole(input[i]) + } + } + + self.addSimple( + title: "Array successful contains", + input: ([Int], [Int]).self + ) { input, lookups in + for i in lookups { + precondition(input.contains(i)) + } + } + + self.addSimple( + title: "Array unsuccessful contains", + input: ([Int], [Int]).self + ) { input, lookups in + let c = input.count + for i in lookups { + precondition(!input.contains(i + c)) + } + } + + self.add( + title: "Array mutate through subscript", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var array = input + array.reserveCapacity(0) // Ensure unique storage + timer.measure { + var v = 0 + for i in lookups { + array[i] = v + v += 1 + } + } + blackHole(array) + } + } + + self.add( + title: "Array random swaps", + input: [Int].self + ) { input in + return { timer in + var array = Array(0 ..< input.count) + timer.measure { + var v = 0 + for i in input { + array.swapAt(i, v) + v += 1 + } + } + blackHole(array) + } + } + + self.add( + title: "Array partitioning around middle", + input: [Int].self + ) { input in + return { timer in + let pivot = input.count / 2 + var array = input + array.reserveCapacity(0) // Force unique storage + timer.measure { + let r = array.partition(by: { $0 >= pivot }) + precondition(r == pivot) + } + blackHole(array) + } + } + + self.add( + title: "Array sort", + input: [Int].self + ) { input in + return { timer in + var array = input + array.reserveCapacity(0) // Force unique storage + timer.measure { + array.sort() + } + precondition(array.elementsEqual(0 ..< input.count)) + } + } + + self.addSimple( + title: "Array append", + input: [Int].self + ) { input in + var array: [Int] = [] + for i in input { + array.append(i) + } + precondition(array.count == input.count) + blackHole(array) + } + + self.addSimple( + title: "Array append, reserving capacity", + input: [Int].self + ) { input in + var array: [Int] = [] + array.reserveCapacity(input.count) + for i in input { + array.append(i) + } + blackHole(array) + } + + self.addSimple( + title: "Array prepend", + input: [Int].self + ) { input in + var array: [Int] = [] + for i in input { + array.insert(i, at: 0) + } + blackHole(array) + } + + self.addSimple( + title: "Array prepend, reserving capacity", + input: [Int].self + ) { input in + var array: [Int] = [] + array.reserveCapacity(input.count) + for i in input { + array.insert(i, at: 0) + } + blackHole(array) + } + + self.addSimple( + title: "Array kalimba", + input: [Int].self + ) { input in + blackHole(input.kalimbaOrdered()) + } + + self.addSimple( + title: "Array kalimba fast", + input: [Int].self + ) { input in + blackHole(input.kalimbaOrdered3()) + } + + self.add( + title: "Array random insertions", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var array: [Int] = [] + timer.measure { + for i in insertions.indices { + array.insert(i, at: insertions[i]) + } + } + blackHole(array) + } + } + + self.add( + title: "Array random insertions, reserving capacity", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var array: [Int] = [] + array.reserveCapacity(insertions.count) + timer.measure { + for i in insertions.indices { + array.insert(i, at: insertions[i]) + } + } + blackHole(array) + } + } + + self.add( + title: "Array removeLast", + input: Int.self + ) { size in + return { timer in + var array = Array(0 ..< size) + timer.measure { + for _ in 0 ..< size { + array.removeLast() + } + } + precondition(array.isEmpty) + blackHole(array) + } + } + + self.add( + title: "Array removeFirst", + input: Int.self + ) { size in + return { timer in + var array = Array(0 ..< size) + timer.measure { + for _ in 0 ..< size { + array.removeFirst() + } + } + precondition(array.isEmpty) + blackHole(array) + } + } + + self.add( + title: "Array random removals", + input: Insertions.self + ) { insertions in + let removals = Array(insertions.values.reversed()) + return { timer in + var array = Array(0 ..< removals.count) + timer.measure { + for i in removals { + array.remove(at: i) + } + } + blackHole(array) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/CppBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/CppBenchmarks.swift new file mode 100644 index 00000000..19b51d8f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/CppBenchmarks.swift @@ -0,0 +1,629 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark +import CppBenchmarks + +internal class CppVector { + var ptr: UnsafeMutableRawPointer? + + init(_ input: [Int]) { + self.ptr = input.withUnsafeBufferPointer { buffer in + cpp_vector_create(buffer.baseAddress, buffer.count) + } + } + + deinit { + destroy() + } + + func destroy() { + if let ptr = ptr { + cpp_vector_destroy(ptr) + } + ptr = nil + } +} + +internal class CppDeque { + var ptr: UnsafeMutableRawPointer? + + init(_ input: [Int]) { + self.ptr = input.withUnsafeBufferPointer { buffer in + cpp_deque_create(buffer.baseAddress, buffer.count) + } + } + + deinit { + destroy() + } + + func destroy() { + if let ptr = ptr { + cpp_deque_destroy(ptr) + } + ptr = nil + } +} + +internal class CppUnorderedSet { + var ptr: UnsafeMutableRawPointer? + + init(_ input: [Int]) { + self.ptr = input.withUnsafeBufferPointer { buffer in + cpp_unordered_set_create(buffer.baseAddress, buffer.count) + } + } + + deinit { + destroy() + } + + func destroy() { + if let ptr = ptr { + cpp_unordered_set_destroy(ptr) + } + ptr = nil + } +} + +internal class CppUnorderedMap { + var ptr: UnsafeMutableRawPointer? + + init(_ input: [Int]) { + self.ptr = input.withUnsafeBufferPointer { buffer in + cpp_unordered_map_create(buffer.baseAddress, buffer.count) + } + } + + deinit { + destroy() + } + + func destroy() { + if let ptr = ptr { + cpp_unordered_map_destroy(ptr) + } + ptr = nil + } +} + + +extension Benchmark { + public mutating func addCppBenchmarks() { + cpp_set_hash_fn { value in value._rawHashValue(seed: 0) } + + self.addSimple( + title: "std::hash", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_hash(buffer.baseAddress, buffer.count) + } + } + + self.addSimple( + title: "custom_intptr_hash (using Swift.Hasher)", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_custom_hash(buffer.baseAddress, buffer.count) + } + } + + self.addSimple( + title: "std::vector push_back from integer range", + input: Int.self + ) { count in + cpp_vector_from_int_range(count) + } + + self.addSimple( + title: "std::deque push_back from integer range", + input: Int.self + ) { count in + cpp_deque_from_int_range(count) + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::vector constructor from buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_vector_from_int_buffer(buffer.baseAddress, buffer.count) + } + } + + self.addSimple( + title: "std::deque constructor from buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_deque_from_int_buffer(buffer.baseAddress, buffer.count) + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector sequential iteration", + input: [Int].self + ) { input in + let vector = CppVector(input) + return { timer in + cpp_vector_iterate(vector.ptr) + } + } + + self.add( + title: "std::deque sequential iteration", + input: [Int].self + ) { input in + let deque = CppDeque(input) + return { timer in + cpp_deque_iterate(deque.ptr) + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector random-access offset lookups (operator [])", + input: ([Int], [Int]).self + ) { input, lookups in + let vector = CppVector(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_vector_lookups_subscript(vector.ptr, buffer.baseAddress, buffer.count) + } + } + } + + self.add( + title: "std::deque random-access offset lookups (operator [])", + input: ([Int], [Int]).self + ) { input, lookups in + let vector = CppDeque(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_deque_lookups_subscript(vector.ptr, buffer.baseAddress, buffer.count) + } + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector random-access offset lookups (at)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = CppVector(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_vector_lookups_at(deque.ptr, buffer.baseAddress, buffer.count) + } + } + } + + self.add( + title: "std::deque at, random offsets", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = CppDeque(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_deque_lookups_at(deque.ptr, buffer.baseAddress, buffer.count) + } + } + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::vector push_back", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_vector_append_integers(buffer.baseAddress, buffer.count, false) + } + } + + self.addSimple( + title: "std::vector push_back, reserving capacity", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_vector_append_integers(buffer.baseAddress, buffer.count, true) + } + } + + self.addSimple( + title: "std::deque push_back", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_deque_append_integers(buffer.baseAddress, buffer.count) + } + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::vector insert at front", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_vector_prepend_integers(buffer.baseAddress, buffer.count, false) + } + } + + self.addSimple( + title: "std::vector insert at front, reserving capacity", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_vector_prepend_integers(buffer.baseAddress, buffer.count, true) + } + } + + self.addSimple( + title: "std::deque push_front", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_deque_prepend_integers(buffer.baseAddress, buffer.count) + } + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::vector random insertions", + input: Insertions.self + ) { insertions in + insertions.values.withUnsafeBufferPointer { buffer in + cpp_vector_random_insertions(buffer.baseAddress, buffer.count, false) + } + } + + self.addSimple( + title: "std::deque random insertions", + input: Insertions.self + ) { insertions in + insertions.values.withUnsafeBufferPointer { buffer in + cpp_deque_random_insertions(buffer.baseAddress, buffer.count) + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector pop_back", + input: Int.self + ) { size in + return { timer in + let vector = CppVector(Array(0 ..< size)) + timer.measure { + cpp_vector_pop_back(vector.ptr) + } + vector.destroy() + } + } + + self.add( + title: "std::deque pop_back", + input: Int.self + ) { size in + return { timer in + let deque = CppDeque(Array(0 ..< size)) + timer.measure { + cpp_deque_pop_back(deque.ptr) + } + deque.destroy() + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector erase first", + input: Int.self + ) { size in + return { timer in + let vector = CppVector(Array(0 ..< size)) + timer.measure { + cpp_vector_pop_front(vector.ptr) + } + vector.destroy() + } + } + + self.add( + title: "std::deque pop_front", + input: Int.self + ) { size in + return { timer in + let deque = CppDeque(Array(0 ..< size)) + timer.measure { + cpp_deque_pop_front(deque.ptr) + } + deque.destroy() + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector random removals", + input: Insertions.self + ) { insertions in + let removals = Array(insertions.values.reversed()) + return { timer in + let vector = CppVector(Array(0 ..< removals.count)) + timer.measure { + removals.withUnsafeBufferPointer { buffer in + cpp_vector_random_removals(vector.ptr, buffer.baseAddress, buffer.count) + } + } + vector.destroy() + } + } + + self.add( + title: "std::deque random removals", + input: Insertions.self + ) { insertions in + let removals = Array(insertions.values.reversed()) + return { timer in + let deque = CppDeque(Array(0 ..< removals.count)) + timer.measure { + removals.withUnsafeBufferPointer { buffer in + cpp_deque_random_removals(deque.ptr, buffer.baseAddress, buffer.count) + } + } + deque.destroy() + } + } + + //-------------------------------------------------------------------------- + + self.add( + title: "std::vector sort", + input: [Int].self + ) { input in + return { timer in + let vector = CppVector(input) + timer.measure { + cpp_vector_sort(vector.ptr) + } + vector.destroy() + } + } + + self.add( + title: "std::deque sort", + input: [Int].self + ) { input in + return { timer in + let deque = CppDeque(input) + timer.measure { + cpp_deque_sort(deque.ptr) + } + deque.destroy() + } + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::unordered_set insert from integer range", + input: Int.self + ) { count in + cpp_unordered_set_from_int_range(count) + } + + self.addSimple( + title: "std::unordered_set constructor from buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_unordered_set_from_int_buffer(buffer.baseAddress, buffer.count) + } + } + + self.add( + title: "std::unordered_set sequential iteration", + input: [Int].self + ) { input in + let set = CppUnorderedSet(input) + return { timer in + cpp_unordered_set_iterate(set.ptr) + } + } + + self.add( + title: "std::unordered_set successful find", + input: ([Int], [Int]).self + ) { input, lookups in + let set = CppUnorderedSet(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_set_lookups(set.ptr, buffer.baseAddress, buffer.count, true) + } + } + } + + self.add( + title: "std::unordered_set unsuccessful find", + input: ([Int], [Int]).self + ) { input, lookups in + let set = CppUnorderedSet(input) + let lookups = lookups.map { $0 + input.count } + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_set_lookups(set.ptr, buffer.baseAddress, buffer.count, false) + } + } + } + + self.addSimple( + title: "std::unordered_set insert", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_unordered_set_insert_integers(buffer.baseAddress, buffer.count, false) + } + } + + self.addSimple( + title: "std::unordered_set insert, reserving capacity", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_unordered_set_insert_integers(buffer.baseAddress, buffer.count, true) + } + } + + self.add( + title: "std::unordered_set erase", + input: ([Int], [Int]).self + ) { input, removals in + return { timer in + let set = CppUnorderedSet(input) + timer.measure { + removals.withUnsafeBufferPointer { buffer in + cpp_unordered_set_removals(set.ptr, buffer.baseAddress, buffer.count) + } + } + set.destroy() + } + } + + //-------------------------------------------------------------------------- + + self.addSimple( + title: "std::unordered_map insert from integer range", + input: Int.self + ) { count in + cpp_unordered_map_from_int_range(count) + } + + self.add( + title: "std::unordered_map sequential iteration", + input: [Int].self + ) { input in + let set = CppUnorderedMap(input) + return { timer in + cpp_unordered_map_iterate(set.ptr) + } + } + + self.add( + title: "std::unordered_map successful find", + input: ([Int], [Int]).self + ) { input, lookups in + let map = CppUnorderedMap(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_map_lookups(map.ptr, buffer.baseAddress, buffer.count, true) + } + } + } + + self.add( + title: "std::unordered_map unsuccessful find", + input: ([Int], [Int]).self + ) { input, lookups in + let map = CppUnorderedMap(input) + let lookups = lookups.map { $0 + input.count } + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_map_lookups(map.ptr, buffer.baseAddress, buffer.count, false) + } + } + } + + self.add( + title: "std::unordered_map subscript, existing key", + input: ([Int], [Int]).self + ) { input, lookups in + let map = CppUnorderedMap(input) + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_map_subscript(map.ptr, buffer.baseAddress, buffer.count) + } + } + } + + self.add( + title: "std::unordered_map subscript, new key", + input: ([Int], [Int]).self + ) { input, lookups in + let map = CppUnorderedMap(input) + let lookups = lookups.map { $0 + input.count } + return { timer in + lookups.withUnsafeBufferPointer { buffer in + cpp_unordered_map_subscript(map.ptr, buffer.baseAddress, buffer.count) + } + } + } + + self.addSimple( + title: "std::unordered_map insert", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_unordered_map_insert_integers(buffer.baseAddress, buffer.count, false) + } + } + + self.addSimple( + title: "std::unordered_map insert, reserving capacity", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + cpp_unordered_map_insert_integers(buffer.baseAddress, buffer.count, true) + } + } + + self.add( + title: "std::unordered_map erase existing", + input: ([Int], [Int]).self + ) { input, removals in + return { timer in + let map = CppUnorderedMap(input) + timer.measure { + removals.withUnsafeBufferPointer { buffer in + cpp_unordered_map_removals(map.ptr, buffer.baseAddress, buffer.count) + } + } + map.destroy() + } + } + + self.add( + title: "std::unordered_map erase missing", + input: ([Int], [Int]).self + ) { input, removals in + return { timer in + let map = CppUnorderedMap(input.map { input.count + $0 }) + timer.measure { + removals.withUnsafeBufferPointer { buffer in + cpp_unordered_map_removals(map.ptr, buffer.baseAddress, buffer.count) + } + } + map.destroy() + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DequeBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DequeBenchmarks.swift new file mode 100644 index 00000000..7f916254 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DequeBenchmarks.swift @@ -0,0 +1,490 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark +@_spi(Testing) import DequeModule + +extension Deque { + @inline(__always) + internal init(discontiguous contents: [Element]) { + self.init(_capacity: contents.count, + startSlot: contents.count / 4, + contents: contents) + } +} + +extension Benchmark { + public mutating func addDequeBenchmarks() { + self.addSimple( + title: "Deque init from range", + input: Int.self + ) { size in + blackHole(Deque(0 ..< size)) + } + + self.addSimple( + title: "Deque init from unsafe buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + blackHole(Deque(buffer)) + } + } + + self.add( + title: "Deque sequential iteration (contiguous)", + input: [Int].self + ) { input in + let deque = Deque(input) + return { timer in + for i in deque { + blackHole(i) + } + } + } + + self.add( + title: "Deque sequential iteration (discontiguous)", + input: [Int].self + ) { input in + let deque = Deque(discontiguous: input) + return { timer in + for i in deque { + blackHole(i) + } + } + } + + self.add( + title: "Deque subscript get, random offsets (contiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(input) + return { timer in + for i in lookups { + blackHole(deque[i]) + } + } + } + + self.add( + title: "Deque subscript get, random offsets (discontiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(discontiguous: input) + return { timer in + for i in lookups { + blackHole(deque[i]) + } + } + } + + self.add( + title: "Deque successful contains (contiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(input) + return { timer in + for i in lookups { + precondition(deque.contains(i)) + } + } + } + + self.add( + title: "Deque successful contains (discontiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(discontiguous: input) + return { timer in + for i in lookups { + precondition(deque.contains(i)) + } + } + } + + self.add( + title: "Deque unsuccessful contains (contiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(input) + return { timer in + let c = input.count + for i in lookups { + precondition(!deque.contains(i + c)) + } + } + } + + self.add( + title: "Deque unsuccessful contains (discontiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + let deque = Deque(discontiguous: input) + return { timer in + let c = input.count + for i in lookups { + precondition(!deque.contains(i + c)) + } + } + } + + self.add( + title: "Deque mutate through subscript (contiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var deque = Deque(input) + timer.measure { + var v = 0 + for i in lookups { + deque[i] = v + v += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque mutate through subscript (discontiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var deque = Deque(discontiguous: input) + timer.measure { + var v = 0 + for i in lookups { + deque[i] = v + v += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque modify through subscript (contiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var deque = Deque(input) + timer.measure { + for i in lookups { + deque[i] += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque modify through subscript (discontiguous)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var deque = Deque(discontiguous: input) + timer.measure { + for i in lookups { + deque[i] += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque random swaps (contiguous)", + input: [Int].self + ) { input in + return { timer in + var deque = Deque(0 ..< input.count) + timer.measure { + var v = 0 + for i in input { + deque.swapAt(i, v) + v += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque random swaps (discontiguous)", + input: [Int].self + ) { input in + return { timer in + var deque = Deque(discontiguous: input) + timer.measure { + var v = 0 + for i in input { + deque.swapAt(i, v) + v += 1 + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque partitioning around middle (contiguous)", + input: [Int].self + ) { input in + return { timer in + let pivot = input.count / 2 + var deque = Deque(input) + timer.measure { + let r = deque.partition(by: { $0 >= pivot }) + precondition(r == pivot) + } + blackHole(deque) + } + } + + self.add( + title: "Deque partitioning around middle (discontiguous)", + input: [Int].self + ) { input in + return { timer in + let pivot = input.count / 2 + var deque = Deque(discontiguous: input) + timer.measure { + let r = deque.partition(by: { $0 >= pivot }) + precondition(r == pivot) + } + blackHole(deque) + } + } + + self.add( + title: "Deque sort (contiguous)", + input: [Int].self + ) { input in + return { timer in + var deque = Deque(input) + timer.measure { + deque.sort() + } + precondition(deque.elementsEqual(0 ..< input.count)) + } + } + + self.add( + title: "Deque sort (discontiguous)", + input: [Int].self + ) { input in + return { timer in + var deque = Deque(discontiguous: input) + timer.measure { + deque.sort() + } + precondition(deque.elementsEqual(0 ..< input.count)) + } + } + + self.addSimple( + title: "Deque append from range", + input: Int.self + ) { count in + var deque: Deque = [] + for i in 0 ..< count { + deque.append(i) + } + precondition(deque.count == count) + blackHole(deque) + } + + self.addSimple( + title: "Deque append", + input: [Int].self + ) { input in + var deque: Deque = [] + for i in input { + deque.append(i) + } + precondition(deque.count == input.count) + blackHole(deque) + } + + self.addSimple( + title: "Deque append, reserving capacity", + input: [Int].self + ) { input in + var deque: Deque = [] + deque.reserveCapacity(input.count) + for i in input { + deque.append(i) + } + blackHole(deque) + } + + self.addSimple( + title: "Deque prepend", + input: [Int].self + ) { input in + var deque: Deque = [] + for i in input { + deque.prepend(i) + } + blackHole(deque) + } + + self.addSimple( + title: "Deque prepend, reserving capacity", + input: [Int].self + ) { input in + var deque: Deque = [] + deque.reserveCapacity(input.count) + for i in input { + deque.prepend(i) + } + blackHole(deque) + } + + self.addSimple( + title: "Deque kalimba", + input: [Int].self + ) { input in + blackHole(input.kalimbaOrdered2()) + } + + self.add( + title: "Deque random insertions", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var deque: Deque = [] + timer.measure { + for i in insertions.indices { + deque.insert(i, at: insertions[i]) + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque random insertions, reserving capacity", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var deque: Deque = [] + deque.reserveCapacity(insertions.count) + timer.measure { + for i in insertions.indices { + deque.insert(i, at: insertions[i]) + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque removeLast (contiguous)", + input: Int.self + ) { size in + return { timer in + var deque = Deque(0 ..< size) + timer.measure { + for _ in 0 ..< size { + deque.removeLast() + } + } + precondition(deque.isEmpty) + blackHole(deque) + } + } + + self.add( + title: "Deque removeLast (discontiguous)", + input: Int.self + ) { size in + return { timer in + var deque = Deque(discontiguous: Array(0 ..< size)) + timer.measure { + for _ in 0 ..< size { + deque.removeLast() + } + } + precondition(deque.isEmpty) + blackHole(deque) + } + } + + self.add( + title: "Deque removeFirst (contiguous)", + input: Int.self + ) { size in + return { timer in + var deque = Deque(0 ..< size) + timer.measure { + for _ in 0 ..< size { + deque.removeFirst() + } + } + precondition(deque.isEmpty) + blackHole(deque) + } + } + + self.add( + title: "Deque removeFirst (discontiguous)", + input: Int.self + ) { size in + return { timer in + var deque = Deque(discontiguous: Array(0 ..< size)) + timer.measure { + for _ in 0 ..< size { + deque.removeFirst() + } + } + precondition(deque.isEmpty) + blackHole(deque) + } + } + + self.add( + title: "Deque random removals (contiguous)", + input: Insertions.self + ) { insertions in + let removals = Array(insertions.values.reversed()) + return { timer in + var deque = Deque(0 ..< removals.count) + timer.measure { + for i in removals { + deque.remove(at: i) + } + } + blackHole(deque) + } + } + + self.add( + title: "Deque random removals (discontiguous)", + input: Insertions.self + ) { insertions in + let removals = Array(insertions.values.reversed()) + return { timer in + let size = removals.count + var deque = Deque(discontiguous: Array(0 ..< size)) + timer.measure { + for i in removals { + deque.remove(at: i) + } + } + blackHole(deque) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DictionaryBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DictionaryBenchmarks.swift new file mode 100644 index 00000000..8388fe61 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/DictionaryBenchmarks.swift @@ -0,0 +1,342 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark + +extension Benchmark { + public mutating func addDictionaryBenchmarks() { + self.add( + title: "Dictionary init(uniqueKeysWithValues:)", + input: [Int].self + ) { input in + let keysAndValues = input.map { ($0, 2 * $0) } + return { timer in + blackHole(Dictionary(uniqueKeysWithValues: keysAndValues)) + } + } + + self.add( + title: "Dictionary sequential iteration", + input: [Int].self + ) { input in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for item in d { + blackHole(item) + } + } + } + + self.add( + title: "Dictionary.Keys sequential iteration", + input: [Int].self + ) { input in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for item in d.keys { + blackHole(item) + } + } + } + + self.add( + title: "Dictionary.Values sequential iteration", + input: [Int].self + ) { input in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for item in d.values { + blackHole(item) + } + } + } + + self.add( + title: "Dictionary subscript, successful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for i in lookups { + precondition(d[i] == 2 * i) + } + } + } + + self.add( + title: "Dictionary subscript, unsuccessful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + let c = input.count + return { timer in + for i in lookups { + precondition(d[i + c] == nil) + } + } + } + + self.add( + title: "Dictionary subscript, noop setter", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[i + c] = nil + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary subscript, set existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i] = 0 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary subscript, _modify", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i]! *= 2 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.addSimple( + title: "Dictionary subscript, insert", + input: [Int].self + ) { input in + var d: [Int: Int] = [:] + for i in input { + d[i] = 2 * i + } + precondition(d.count == input.count) + blackHole(d) + } + + self.addSimple( + title: "Dictionary subscript, insert, reserving capacity", + input: [Int].self + ) { input in + var d: [Int: Int] = [:] + d.reserveCapacity(input.count) + for i in input { + d[i] = 2 * i + } + precondition(d.count == input.count) + blackHole(d) + } + + self.add( + title: "Dictionary subscript, remove existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i] = nil + } + } + precondition(d.isEmpty) + blackHole(d) + } + } + + self.add( + title: "Dictionary subscript, remove missing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[i + c] = nil + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary defaulted subscript, successful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for i in lookups { + precondition(d[i, default: -1] != -1) + } + } + } + + self.add( + title: "Dictionary defaulted subscript, unsuccessful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + let c = d.count + for i in lookups { + precondition(d[i + c, default: -1] == -1) + } + } + } + + self.add( + title: "Dictionary defaulted subscript, _modify existing", + input: [Int].self + ) { input in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in input { + d[i, default: -1] *= 2 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary defaulted subscript, _modify missing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[c + i, default: -1] *= 2 + } + } + precondition(d.count == 2 * input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary successful index(forKey:)", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for i in lookups { + precondition(d.index(forKey: i) != nil) + } + } + } + + self.add( + title: "Dictionary unsuccessful index(forKey:)", + input: ([Int], [Int]).self + ) { input, lookups in + let d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + return { timer in + for i in lookups { + precondition(d.index(forKey: lookups.count + i) == nil) + } + } + } + + self.add( + title: "Dictionary updateValue(_:forKey:), existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d.updateValue(0, forKey: i) + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary updateValue(_:forKey:), insert", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d.updateValue(0, forKey: input.count + i) + } + } + precondition(d.count == 2 * input.count) + blackHole(d) + } + } + + self.add( + title: "Dictionary random removals (existing keys)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + precondition(d.removeValue(forKey: i) != nil) + } + } + precondition(d.count == 0) + blackHole(d) + } + } + + self.add( + title: "Dictionary random removals (missing keys)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + let c = input.count + var d = Dictionary(uniqueKeysWithValues: input.lazy.map { (c + $0, 2 * $0) }) + timer.measure { + for i in lookups { + precondition(d.removeValue(forKey: i) == nil) + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Kalimba.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Kalimba.swift new file mode 100644 index 00000000..5da2e92c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Kalimba.swift @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import DequeModule + +extension Sequence { + func kalimbaOrdered() -> [Element] { + var kalimba: [Element] = [] + kalimba.reserveCapacity(underestimatedCount) + var insertAtStart = false + for element in self { + if insertAtStart { + kalimba.insert(element, at: 0) + } else { + kalimba.append(element) + } + insertAtStart.toggle() + } + return kalimba + } + + func kalimbaOrdered2() -> Deque { + var kalimba: Deque = [] + kalimba.reserveCapacity(underestimatedCount) + var insertAtStart = false + for element in self { + if insertAtStart { + kalimba.prepend(element) + } else { + kalimba.append(element) + } + insertAtStart.toggle() + } + return kalimba + } + + func kalimbaOrdered3() -> [Element] { + var odds: [Element] = [] + var evens: [Element] = [] + odds.reserveCapacity(underestimatedCount) + evens.reserveCapacity(underestimatedCount / 2) + var insertAtStart = false + for element in self { + if insertAtStart { + odds.append(element) + } else { + evens.append(element) + } + insertAtStart.toggle() + } + odds.reverse() + odds.append(contentsOf: evens) + return odds + } + +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.json b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.json new file mode 100644 index 00000000..4d3cad8b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.json @@ -0,0 +1,2001 @@ +{ + "kind": "group", + "title": "All results", + "directory": "Results", + "contents": [ + { + "kind": "group", + "title": "Individual types", + "directory": "single", + "contents": [ + { + "kind": "group", + "title": "Array", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "Array init from unsafe buffer", + "Array sequential iteration", + "Array subscript get, random offsets", + "Array append", + "Array append, reserving capacity", + "Array prepend", + "Array prepend, reserving capacity", + "Array removeFirst", + "Array removeLast", + "Array sort" + ] + }, + { + "kind": "chart", + "title": "access", + "tasks": [ + "Array sequential iteration", + "Array subscript get, random offsets" + ] + }, + { + "kind": "chart", + "title": "mutate", + "tasks": [ + "Array mutate through subscript", + "Array random swaps", + "Array partitioning around middle", + "Array sort" + ] + }, + ] + }, + { + "kind": "group", + "title": "Set", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "Set init from range", + "Set init from unsafe buffer", + "Set sequential iteration", + "Set successful contains", + "Set unsuccessful contains", + "Set insert", + "Set insert, reserving capacity", + "Set remove" + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "union with Self", + "tasks": [ + "Set union with Self (0% overlap)", + "Set union with Self (25% overlap)", + "Set union with Self (50% overlap)", + "Set union with Self (75% overlap)", + "Set union with Self (100% overlap)" + ] + }, + { + "kind": "chart", + "title": "union with Array", + "tasks": [ + "Set union with Array (0% overlap)", + "Set union with Array (25% overlap)", + "Set union with Array (50% overlap)", + "Set union with Array (75% overlap)", + "Set union with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion with Self", + "tasks": [ + "Set formUnion with Self (0% overlap)", + "Set formUnion with Self (25% overlap)", + "Set formUnion with Self (50% overlap)", + "Set formUnion with Self (75% overlap)", + "Set formUnion with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion with Array", + "tasks": [ + "Set formUnion with Array (0% overlap)", + "Set formUnion with Array (25% overlap)", + "Set formUnion with Array (50% overlap)", + "Set formUnion with Array (75% overlap)", + "Set formUnion with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "intersection with Self", + "tasks": [ + "Set intersection with Self (0% overlap)", + "Set intersection with Self (25% overlap)", + "Set intersection with Self (50% overlap)", + "Set intersection with Self (75% overlap)", + "Set intersection with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection with Array", + "tasks": [ + "Set intersection with Array (0% overlap)", + "Set intersection with Array (25% overlap)", + "Set intersection with Array (50% overlap)", + "Set intersection with Array (75% overlap)", + "Set intersection with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection with Self", + "tasks": [ + "Set formIntersection with Self (0% overlap)", + "Set formIntersection with Self (25% overlap)", + "Set formIntersection with Self (50% overlap)", + "Set formIntersection with Self (75% overlap)", + "Set formIntersection with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection with Array", + "tasks": [ + "Set formIntersection with Array (0% overlap)", + "Set formIntersection with Array (25% overlap)", + "Set formIntersection with Array (50% overlap)", + "Set formIntersection with Array (75% overlap)", + "Set formIntersection with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "symmetricDifference with Self", + "tasks": [ + "Set symmetricDifference with Self (0% overlap)", + "Set symmetricDifference with Self (25% overlap)", + "Set symmetricDifference with Self (50% overlap)", + "Set symmetricDifference with Self (75% overlap)", + "Set symmetricDifference with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference with Array", + "tasks": [ + "Set symmetricDifference with Array (0% overlap)", + "Set symmetricDifference with Array (25% overlap)", + "Set symmetricDifference with Array (50% overlap)", + "Set symmetricDifference with Array (75% overlap)", + "Set symmetricDifference with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference with Self", + "tasks": [ + "Set formSymmetricDifference with Self (0% overlap)", + "Set formSymmetricDifference with Self (25% overlap)", + "Set formSymmetricDifference with Self (50% overlap)", + "Set formSymmetricDifference with Self (75% overlap)", + "Set formSymmetricDifference with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference with Array", + "tasks": [ + "Set formSymmetricDifference with Array (0% overlap)", + "Set formSymmetricDifference with Array (25% overlap)", + "Set formSymmetricDifference with Array (50% overlap)", + "Set formSymmetricDifference with Array (75% overlap)", + "Set formSymmetricDifference with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "subtracting Self", + "tasks": [ + "Set subtracting Self (0% overlap)", + "Set subtracting Self (25% overlap)", + "Set subtracting Self (50% overlap)", + "Set subtracting Self (75% overlap)", + "Set subtracting Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting Array", + "tasks": [ + "Set subtracting Array (0% overlap)", + "Set subtracting Array (25% overlap)", + "Set subtracting Array (50% overlap)", + "Set subtracting Array (75% overlap)", + "Set subtracting Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract Self", + "tasks": [ + "Set subtract Self (0% overlap)", + "Set subtract Self (25% overlap)", + "Set subtract Self (50% overlap)", + "Set subtract Self (75% overlap)", + "Set subtract Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract with Array", + "tasks": [ + "Set subtract Array (0% overlap)", + "Set subtract Array (25% overlap)", + "Set subtract Array (50% overlap)", + "Set subtract Array (75% overlap)", + "Set subtract Array (100% overlap)", + ] + }, + ] + }, + ] + }, + { + "kind": "group", + "title": "Dictionary", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "Dictionary init(uniqueKeysWithValues:)", + "Dictionary sequential iteration", + "Dictionary subscript, successful lookups", + "Dictionary subscript, insert", + "Dictionary subscript, remove existing", + ] + }, + { + "kind": "chart", + "title": "iteration", + "tasks": [ + "Dictionary sequential iteration", + "Dictionary.Keys sequential iteration", + "Dictionary.Values sequential iteration" + ] + }, + { + "kind": "chart", + "title": "lookups", + "tasks": [ + "Dictionary subscript, successful lookups", + "Dictionary subscript, unsuccessful lookups", + "Dictionary defaulted subscript, successful lookups", + "Dictionary defaulted subscript, unsuccessful lookups", + "Dictionary successful index(forKey:)", + "Dictionary unsuccessful index(forKey:)", + ] + }, + { + "kind": "chart", + "title": "subscript", + "tasks": [ + "Dictionary subscript, successful lookups", + "Dictionary subscript, unsuccessful lookups", + "Dictionary subscript, noop setter", + "Dictionary subscript, set existing", + "Dictionary subscript, _modify", + "Dictionary subscript, insert", + "Dictionary subscript, insert, reserving capacity", + "Dictionary subscript, remove existing", + "Dictionary subscript, remove missing", + ] + }, + { + "kind": "chart", + "title": "defaulted subscript", + "tasks": [ + "Dictionary defaulted subscript, successful lookups", + "Dictionary defaulted subscript, unsuccessful lookups", + "Dictionary defaulted subscript, _modify existing", + "Dictionary defaulted subscript, _modify missing", + ] + }, + { + "kind": "chart", + "title": "mutations", + "tasks": [ + "Dictionary updateValue(_:forKey:), existing", + "Dictionary subscript, set existing", + "Dictionary subscript, _modify", + "Dictionary defaulted subscript, _modify existing", + ] + }, + { + "kind": "chart", + "title": "removals", + "tasks": [ + "Dictionary subscript, remove existing", + "Dictionary subscript, remove missing", + "Dictionary random removals (existing keys)", + "Dictionary random removals (missing keys)", + ] + }, + ] + }, + { + "kind": "group", + "title": "Deque", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "Deque init from unsafe buffer", + "Deque sequential iteration (contiguous)", + "Deque subscript get, random offsets (contiguous)", + "Deque append", + "Deque append, reserving capacity", + "Deque prepend", + "Deque prepend, reserving capacity", + "Deque removeFirst (contiguous)", + "Deque removeLast (contiguous)", + "Deque sort (contiguous)", + "Deque sort (discontiguous)" + ] + }, + { + "kind": "chart", + "title": "access", + "tasks": [ + "Deque sequential iteration (contiguous)", + "Deque sequential iteration (discontiguous)", + "Deque subscript get, random offsets (contiguous)", + "Deque subscript get, random offsets (discontiguous)", + "Deque mutate through subscript (contiguous)", + "Deque mutate through subscript (discontiguous)" + ] + }, + { + "kind": "chart", + "title": "mutate", + "tasks": [ + "Deque mutate through subscript (contiguous)", + "Deque mutate through subscript (discontiguous)", + "Deque random swaps (contiguous)", + "Deque random swaps (discontiguous)", + "Deque partitioning around middle (contiguous)", + "Deque partitioning around middle (discontiguous)", + "Deque sort (contiguous)", + "Deque sort (discontiguous)" + ] + }, + { + "kind": "chart", + "title": "push", + "tasks": [ + "Deque append", + "Deque append, reserving capacity", + "Deque prepend", + "Deque prepend, reserving capacity" + ] + }, + { + "kind": "chart", + "title": "pop", + "tasks": [ + "Deque removeFirst (contiguous)", + "Deque removeFirst (discontiguous)", + "Deque removeLast (contiguous)", + "Deque removeLast (discontiguous)" + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedSet", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "OrderedSet init from range", + "OrderedSet init from unsafe buffer", + "OrderedSet sequential iteration", + "OrderedSet successful contains", + "OrderedSet unsuccessful contains", + "OrderedSet append", + "OrderedSet append, reserving capacity", + "OrderedSet remove", + ] + }, + { + "kind": "chart", + "title": "initializers", + "tasks": [ + "OrderedSet init from range", + "OrderedSet init from unsafe buffer", + "OrderedSet init(uncheckedUniqueElements:) from range" + ] + }, + { + "kind": "chart", + "title": "mutations", + "tasks": [ + "OrderedSet random swaps", + "OrderedSet partitioning around middle", + "OrderedSet sort", + ] + }, + { + "kind": "chart", + "title": "range replaceable", + "tasks": [ + "OrderedSet append", + "OrderedSet append, reserving capacity", + "OrderedSet prepend", + "OrderedSet prepend, reserving capacity", + "OrderedSet random insertions, reserving capacity", + "OrderedSet remove", + "OrderedSet removeLast", + "OrderedSet removeFirst", + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "union with Self", + "tasks": [ + "OrderedSet union with Self (0% overlap)", + "OrderedSet union with Self (25% overlap)", + "OrderedSet union with Self (50% overlap)", + "OrderedSet union with Self (75% overlap)", + "OrderedSet union with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "union with Array", + "tasks": [ + "OrderedSet union with Array (0% overlap)", + "OrderedSet union with Array (25% overlap)", + "OrderedSet union with Array (50% overlap)", + "OrderedSet union with Array (75% overlap)", + "OrderedSet union with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion with Self", + "tasks": [ + "OrderedSet formUnion with Self (0% overlap)", + "OrderedSet formUnion with Self (25% overlap)", + "OrderedSet formUnion with Self (50% overlap)", + "OrderedSet formUnion with Self (75% overlap)", + "OrderedSet formUnion with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion with Array", + "tasks": [ + "OrderedSet formUnion with Array (0% overlap)", + "OrderedSet formUnion with Array (25% overlap)", + "OrderedSet formUnion with Array (50% overlap)", + "OrderedSet formUnion with Array (75% overlap)", + "OrderedSet formUnion with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "intersection with Self", + "tasks": [ + "OrderedSet intersection with Self (0% overlap)", + "OrderedSet intersection with Self (25% overlap)", + "OrderedSet intersection with Self (50% overlap)", + "OrderedSet intersection with Self (75% overlap)", + "OrderedSet intersection with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection with Array", + "tasks": [ + "OrderedSet intersection with Array (0% overlap)", + "OrderedSet intersection with Array (25% overlap)", + "OrderedSet intersection with Array (50% overlap)", + "OrderedSet intersection with Array (75% overlap)", + "OrderedSet intersection with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection with Self", + "tasks": [ + "OrderedSet formIntersection with Self (0% overlap)", + "OrderedSet formIntersection with Self (25% overlap)", + "OrderedSet formIntersection with Self (50% overlap)", + "OrderedSet formIntersection with Self (75% overlap)", + "OrderedSet formIntersection with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection with Array", + "tasks": [ + "OrderedSet formIntersection with Array (0% overlap)", + "OrderedSet formIntersection with Array (25% overlap)", + "OrderedSet formIntersection with Array (50% overlap)", + "OrderedSet formIntersection with Array (75% overlap)", + "OrderedSet formIntersection with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "symmetricDifference with Self", + "tasks": [ + "OrderedSet symmetricDifference with Self (0% overlap)", + "OrderedSet symmetricDifference with Self (25% overlap)", + "OrderedSet symmetricDifference with Self (50% overlap)", + "OrderedSet symmetricDifference with Self (75% overlap)", + "OrderedSet symmetricDifference with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference with Array", + "tasks": [ + "OrderedSet symmetricDifference with Array (0% overlap)", + "OrderedSet symmetricDifference with Array (25% overlap)", + "OrderedSet symmetricDifference with Array (50% overlap)", + "OrderedSet symmetricDifference with Array (75% overlap)", + "OrderedSet symmetricDifference with Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference with Self", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (0% overlap)", + "OrderedSet formSymmetricDifference with Self (25% overlap)", + "OrderedSet formSymmetricDifference with Self (50% overlap)", + "OrderedSet formSymmetricDifference with Self (75% overlap)", + "OrderedSet formSymmetricDifference with Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference with Array", + "tasks": [ + "OrderedSet formSymmetricDifference with Array (0% overlap)", + "OrderedSet formSymmetricDifference with Array (25% overlap)", + "OrderedSet formSymmetricDifference with Array (50% overlap)", + "OrderedSet formSymmetricDifference with Array (75% overlap)", + "OrderedSet formSymmetricDifference with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "subtracting Self", + "tasks": [ + "OrderedSet subtracting Self (0% overlap)", + "OrderedSet subtracting Self (25% overlap)", + "OrderedSet subtracting Self (50% overlap)", + "OrderedSet subtracting Self (75% overlap)", + "OrderedSet subtracting Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting Array", + "tasks": [ + "OrderedSet subtracting Array (0% overlap)", + "OrderedSet subtracting Array (25% overlap)", + "OrderedSet subtracting Array (50% overlap)", + "OrderedSet subtracting Array (75% overlap)", + "OrderedSet subtracting Array (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract Self", + "tasks": [ + "OrderedSet subtract Self (0% overlap)", + "OrderedSet subtract Self (25% overlap)", + "OrderedSet subtract Self (50% overlap)", + "OrderedSet subtract Self (75% overlap)", + "OrderedSet subtract Self (100% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract with Array", + "tasks": [ + "OrderedSet subtract Array (0% overlap)", + "OrderedSet subtract Array (25% overlap)", + "OrderedSet subtract Array (50% overlap)", + "OrderedSet subtract Array (75% overlap)", + "OrderedSet subtract Array (100% overlap)", + ] + }, + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedDictionary", + "contents": [ + { + "kind": "chart", + "title": "operations", + "tasks": [ + "OrderedDictionary init(uniqueKeysWithValues:)", + "OrderedDictionary sequential iteration", + "OrderedDictionary subscript, successful lookups", + "OrderedDictionary subscript, append", + "OrderedDictionary subscript, remove existing", + ] + }, + { + "kind": "chart", + "title": "initializers", + "tasks": [ + "OrderedDictionary init(uniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeys:values:)" + ] + }, + { + "kind": "chart", + "title": "iteration", + "tasks": [ + "OrderedDictionary sequential iteration", + "OrderedDictionary.Keys sequential iteration", + "OrderedDictionary.Values sequential iteration" + ] + }, + { + "kind": "chart", + "title": "lookups", + "tasks": [ + "OrderedDictionary subscript, successful lookups", + "OrderedDictionary subscript, unsuccessful lookups", + "OrderedDictionary defaulted subscript, successful lookups", + "OrderedDictionary defaulted subscript, unsuccessful lookups", + "OrderedDictionary successful index(forKey:)", + "OrderedDictionary unsuccessful index(forKey:)", + ] + }, + { + "kind": "chart", + "title": "subscript", + "tasks": [ + "OrderedDictionary subscript, successful lookups", + "OrderedDictionary subscript, unsuccessful lookups", + "OrderedDictionary subscript, noop setter", + "OrderedDictionary subscript, set existing", + "OrderedDictionary subscript, _modify", + "OrderedDictionary subscript, append", + "OrderedDictionary subscript, append, reserving capacity", + "OrderedDictionary subscript, remove existing", + "OrderedDictionary subscript, remove missing", + ] + }, + { + "kind": "chart", + "title": "defaulted subscript", + "tasks": [ + "OrderedDictionary defaulted subscript, successful lookups", + "OrderedDictionary defaulted subscript, unsuccessful lookups", + "OrderedDictionary defaulted subscript, _modify existing", + "OrderedDictionary defaulted subscript, _modify missing", + ] + }, + { + "kind": "chart", + "title": "mutations", + "tasks": [ + "OrderedDictionary updateValue(_:forKey:), existing", + "OrderedDictionary subscript, set existing", + "OrderedDictionary subscript, _modify", + "OrderedDictionary defaulted subscript, _modify existing", + "OrderedDictionary random swaps", + "OrderedDictionary partitioning around middle", + "OrderedDictionary sort", + ] + }, + { + "kind": "chart", + "title": "removals", + "tasks": [ + "OrderedDictionary subscript, remove existing", + "OrderedDictionary subscript, remove missing", + "OrderedDictionary removeLast", + "OrderedDictionary removeFirst", + "OrderedDictionary random removals (offset-based)", + "OrderedDictionary random removals (existing keys)", + "OrderedDictionary random removals (missing keys)", + ] + }, + ] + } + ] + }, + { + "kind": "group", + "title": "Against other Swift collections", + "directory": "stdlib", + "contents": [ + { + "kind": "group", + "title": "Deque vs Array", + "contents": [ + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "Deque init from unsafe buffer", + "Array init from unsafe buffer" + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "Deque sequential iteration (contiguous)", + "Deque sequential iteration (discontiguous)", + "Array sequential iteration", + ] + }, + { + "kind": "chart", + "title": "random-access offset lookups", + "tasks": [ + "Deque subscript get, random offsets (contiguous)", + "Deque subscript get, random offsets (discontiguous)", + "Array subscript get, random offsets" + ] + }, + { + "kind": "chart", + "title": "mutate through subscript", + "tasks": [ + "Deque mutate through subscript (contiguous)", + "Deque mutate through subscript (discontiguous)", + "Array mutate through subscript" + ] + }, + { + "kind": "chart", + "title": "random swaps", + "tasks": [ + "Deque random swaps (contiguous)", + "Deque random swaps (discontiguous)", + "Array random swaps", + ] + }, + { + "kind": "chart", + "title": "partitioning around middle", + "tasks": [ + "Deque partitioning around middle (contiguous)", + "Deque partitioning around middle (discontiguous)", + "Array partitioning around middle", + ] + }, + { + "kind": "chart", + "title": "sort", + "tasks": [ + "Deque sort (contiguous)", + "Deque sort (discontiguous)", + "Array sort", + ] + }, + { + "kind": "chart", + "title": "append individual integers", + "tasks": [ + "Deque append", + "Deque append, reserving capacity", + "Array append", + "Array append, reserving capacity" + ] + }, + { + "kind": "chart", + "title": "prepend individual integers", + "tasks": [ + "Deque prepend", + "Deque prepend, reserving capacity", + "Array prepend", + "Array prepend, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "random insertions", + "tasks": [ + "Deque random insertions", + "Array random insertions", + ] + }, + { + "kind": "chart", + "title": "removeFirst", + "tasks": [ + "Deque removeFirst (contiguous)", + "Deque removeFirst (discontiguous)", + "Array removeFirst", + ] + }, + { + "kind": "chart", + "title": "removeLast", + "tasks": [ + "Deque removeLast (contiguous)", + "Deque removeLast (discontiguous)", + "Array removeLast", + ] + }, + { + "kind": "chart", + "title": "random removals", + "tasks": [ + "Deque random removals (contiguous)", + "Deque random removals (discontiguous)", + "Array random removals", + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedSet vs Set", + "contents": [ + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "OrderedSet init from unsafe buffer", + "Set init from unsafe buffer", + ] + }, + { + "kind": "chart", + "title": "init from range of integers", + "tasks": [ + "OrderedSet init from range", + "Set init from range", + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "OrderedSet sequential iteration", + "Set sequential iteration", + ] + }, + { + "kind": "chart", + "title": "successful random lookups", + "tasks": [ + "OrderedSet successful contains", + "Set successful contains", + ] + }, + { + "kind": "chart", + "title": "unsuccessful random lookups", + "tasks": [ + "OrderedSet unsuccessful contains", + "Set unsuccessful contains", + ] + }, + { + "kind": "chart", + "title": "insert", + "tasks": [ + "OrderedSet append", + "OrderedSet append, reserving capacity", + "Set insert", + "Set insert, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "remove", + "tasks": [ + "OrderedSet remove", + "Set remove", + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "union (0% overlap)", + "tasks": [ + "OrderedSet union with Self (0% overlap)", + "OrderedSet union with Array (0% overlap)", + "Set union with Self (0% overlap)", + "Set union with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "union (25% overlap)", + "tasks": [ + "OrderedSet union with Self (25% overlap)", + "OrderedSet union with Array (25% overlap)", + "Set union with Self (25% overlap)", + "Set union with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "union (50% overlap)", + "tasks": [ + "OrderedSet union with Self (50% overlap)", + "OrderedSet union with Array (50% overlap)", + "Set union with Self (50% overlap)", + "Set union with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "union (75% overlap)", + "tasks": [ + "OrderedSet union with Self (75% overlap)", + "OrderedSet union with Array (75% overlap)", + "Set union with Self (75% overlap)", + "Set union with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "union (100% overlap)", + "tasks": [ + "OrderedSet union with Self (100% overlap)", + "OrderedSet union with Array (100% overlap)", + "Set union with Self (100% overlap)", + "Set union with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "formUnion (0% overlap)", + "tasks": [ + "OrderedSet formUnion with Self (0% overlap)", + "OrderedSet formUnion with Array (0% overlap)", + "Set formUnion with Self (0% overlap)", + "Set formUnion with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion (25% overlap)", + "tasks": [ + "OrderedSet formUnion with Self (25% overlap)", + "OrderedSet formUnion with Array (25% overlap)", + "Set formUnion with Self (25% overlap)", + "Set formUnion with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion (50% overlap)", + "tasks": [ + "OrderedSet formUnion with Self (50% overlap)", + "OrderedSet formUnion with Array (50% overlap)", + "Set formUnion with Self (50% overlap)", + "Set formUnion with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion (75% overlap)", + "tasks": [ + "OrderedSet formUnion with Self (75% overlap)", + "OrderedSet formUnion with Array (75% overlap)", + "Set formUnion with Self (75% overlap)", + "Set formUnion with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "formUnion (100% overlap)", + "tasks": [ + "OrderedSet formUnion with Self (100% overlap)", + "OrderedSet formUnion with Array (100% overlap)", + "Set formUnion with Self (100% overlap)", + "Set formUnion with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "intersection (0% overlap)", + "tasks": [ + "OrderedSet intersection with Self (0% overlap)", + "OrderedSet intersection with Array (0% overlap)", + "Set intersection with Self (0% overlap)", + "Set intersection with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection (25% overlap)", + "tasks": [ + "OrderedSet intersection with Self (25% overlap)", + "OrderedSet intersection with Array (25% overlap)", + "Set intersection with Self (25% overlap)", + "Set intersection with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection (50% overlap)", + "tasks": [ + "OrderedSet intersection with Self (50% overlap)", + "OrderedSet intersection with Array (50% overlap)", + "Set intersection with Self (50% overlap)", + "Set intersection with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection (75% overlap)", + "tasks": [ + "OrderedSet intersection with Self (75% overlap)", + "OrderedSet intersection with Array (75% overlap)", + "Set intersection with Self (75% overlap)", + "Set intersection with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "intersection (100% overlap)", + "tasks": [ + "OrderedSet intersection with Self (100% overlap)", + "OrderedSet intersection with Array (100% overlap)", + "Set intersection with Self (100% overlap)", + "Set intersection with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "formIntersection (0% overlap)", + "tasks": [ + "OrderedSet formIntersection with Self (0% overlap)", + "OrderedSet formIntersection with Array (0% overlap)", + "Set formIntersection with Self (0% overlap)", + "Set formIntersection with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection (25% overlap)", + "tasks": [ + "OrderedSet formIntersection with Self (25% overlap)", + "OrderedSet formIntersection with Array (25% overlap)", + "Set formIntersection with Self (25% overlap)", + "Set formIntersection with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection (50% overlap)", + "tasks": [ + "OrderedSet formIntersection with Self (50% overlap)", + "OrderedSet formIntersection with Array (50% overlap)", + "Set formIntersection with Self (50% overlap)", + "Set formIntersection with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection (75% overlap)", + "tasks": [ + "OrderedSet formIntersection with Self (75% overlap)", + "OrderedSet formIntersection with Array (75% overlap)", + "Set formIntersection with Self (75% overlap)", + "Set formIntersection with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "formIntersection (100% overlap)", + "tasks": [ + "OrderedSet formIntersection with Self (100% overlap)", + "OrderedSet formIntersection with Array (100% overlap)", + "Set formIntersection with Self (100% overlap)", + "Set formIntersection with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "symmetricDifference (0% overlap)", + "tasks": [ + "OrderedSet symmetricDifference with Self (0% overlap)", + "OrderedSet symmetricDifference with Array (0% overlap)", + "Set symmetricDifference with Self (0% overlap)", + "Set symmetricDifference with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference (25% overlap)", + "tasks": [ + "OrderedSet symmetricDifference with Self (25% overlap)", + "OrderedSet symmetricDifference with Array (25% overlap)", + "Set symmetricDifference with Self (25% overlap)", + "Set symmetricDifference with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference (50% overlap)", + "tasks": [ + "OrderedSet symmetricDifference with Self (50% overlap)", + "OrderedSet symmetricDifference with Array (50% overlap)", + "Set symmetricDifference with Self (50% overlap)", + "Set symmetricDifference with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference (75% overlap)", + "tasks": [ + "OrderedSet symmetricDifference with Self (75% overlap)", + "OrderedSet symmetricDifference with Array (75% overlap)", + "Set symmetricDifference with Self (75% overlap)", + "Set symmetricDifference with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "symmetricDifference (100% overlap)", + "tasks": [ + "OrderedSet symmetricDifference with Self (100% overlap)", + "OrderedSet symmetricDifference with Array (100% overlap)", + "Set symmetricDifference with Self (100% overlap)", + "Set symmetricDifference with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "formSymmetricDifference (0% overlap)", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (0% overlap)", + "OrderedSet formSymmetricDifference with Array (0% overlap)", + "Set formSymmetricDifference with Self (0% overlap)", + "Set formSymmetricDifference with Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference (25% overlap)", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (25% overlap)", + "OrderedSet formSymmetricDifference with Array (25% overlap)", + "Set formSymmetricDifference with Self (25% overlap)", + "Set formSymmetricDifference with Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference (50% overlap)", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (50% overlap)", + "OrderedSet formSymmetricDifference with Array (50% overlap)", + "Set formSymmetricDifference with Self (50% overlap)", + "Set formSymmetricDifference with Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference (75% overlap)", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (75% overlap)", + "OrderedSet formSymmetricDifference with Array (75% overlap)", + "Set formSymmetricDifference with Self (75% overlap)", + "Set formSymmetricDifference with Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "formSymmetricDifference (100% overlap)", + "tasks": [ + "OrderedSet formSymmetricDifference with Self (100% overlap)", + "OrderedSet formSymmetricDifference with Array (100% overlap)", + "Set formSymmetricDifference with Self (100% overlap)", + "Set formSymmetricDifference with Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "subtracting (0% overlap)", + "tasks": [ + "OrderedSet subtracting Self (0% overlap)", + "OrderedSet subtracting Array (0% overlap)", + "Set subtracting Self (0% overlap)", + "Set subtracting Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting (25% overlap)", + "tasks": [ + "OrderedSet subtracting Self (25% overlap)", + "OrderedSet subtracting Array (25% overlap)", + "Set subtracting Self (25% overlap)", + "Set subtracting Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting (50% overlap)", + "tasks": [ + "OrderedSet subtracting Self (50% overlap)", + "OrderedSet subtracting Array (50% overlap)", + "Set subtracting Self (50% overlap)", + "Set subtracting Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting (75% overlap)", + "tasks": [ + "OrderedSet subtracting Self (75% overlap)", + "OrderedSet subtracting Array (75% overlap)", + "Set subtracting Self (75% overlap)", + "Set subtracting Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtracting (100% overlap)", + "tasks": [ + "OrderedSet subtracting Self (100% overlap)", + "OrderedSet subtracting Array (100% overlap)", + "Set subtracting Self (100% overlap)", + "Set subtracting Array (100% overlap)", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "subtract (0% overlap)", + "tasks": [ + "OrderedSet subtract Self (0% overlap)", + "OrderedSet subtract Array (0% overlap)", + "Set subtract Self (0% overlap)", + "Set subtract Array (0% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract (25% overlap)", + "tasks": [ + "OrderedSet subtract Self (25% overlap)", + "OrderedSet subtract Array (25% overlap)", + "Set subtract Self (25% overlap)", + "Set subtract Array (25% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract (50% overlap)", + "tasks": [ + "OrderedSet subtract Self (50% overlap)", + "OrderedSet subtract Array (50% overlap)", + "Set subtract Self (50% overlap)", + "Set subtract Array (50% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract (75% overlap)", + "tasks": [ + "OrderedSet subtract Self (75% overlap)", + "OrderedSet subtract Array (75% overlap)", + "Set subtract Self (75% overlap)", + "Set subtract Array (75% overlap)", + ] + }, + { + "kind": "chart", + "title": "subtract (100% overlap)", + "tasks": [ + "OrderedSet subtract Self (100% overlap)", + "OrderedSet subtract Array (100% overlap)", + "Set subtract Self (100% overlap)", + "Set subtract Array (100% overlap)", + ] + }, + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedDictionary vs Dictionary", + "contents": [ + { + "kind": "chart", + "title": "initializers", + "tasks": [ + "Dictionary init(uniqueKeysWithValues:)", + "OrderedDictionary init(uniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeys:values:)" + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "iteration", + "tasks": [ + "Dictionary sequential iteration", + "OrderedDictionary sequential iteration", + ] + }, + { + "kind": "chart", + "title": "Keys iteration", + "tasks": [ + "Dictionary.Keys sequential iteration", + "OrderedDictionary.Keys sequential iteration", + ] + }, + { + "kind": "chart", + "title": "Values iteration", + "tasks": [ + "Dictionary.Values sequential iteration", + "OrderedDictionary.Values sequential iteration", + ] + }, + { + "kind": "chart", + "title": "Values iteration", + "tasks": [ + "Dictionary.Values sequential iteration", + "OrderedDictionary.Values sequential iteration", + ] + }, + ] + }, + { + "kind": "chart", + "title": "index(forKey:)", + "tasks": [ + "Dictionary successful index(forKey:)", + "Dictionary unsuccessful index(forKey:)", + "OrderedDictionary successful index(forKey:)", + "OrderedDictionary unsuccessful index(forKey:)", + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "subscript lookups", + "tasks": [ + "Dictionary subscript, successful lookups", + "Dictionary subscript, unsuccessful lookups", + "OrderedDictionary subscript, successful lookups", + "OrderedDictionary subscript, unsuccessful lookups", + ] + }, + { + "kind": "chart", + "title": "subscript setter, simple", + "tasks": [ + "Dictionary subscript, noop setter", + "Dictionary subscript, set existing", + "Dictionary subscript, _modify", + "OrderedDictionary subscript, noop setter", + "OrderedDictionary subscript, set existing", + "OrderedDictionary subscript, _modify", + ] + }, + { + "kind": "chart", + "title": "subscript insert/append", + "tasks": [ + "Dictionary subscript, insert", + "Dictionary subscript, insert, reserving capacity", + "OrderedDictionary subscript, append", + "OrderedDictionary subscript, append, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "subscript remove", + "tasks": [ + "Dictionary subscript, remove existing", + "Dictionary subscript, remove missing", + "OrderedDictionary subscript, remove existing", + "OrderedDictionary subscript, remove missing", + ] + }, + ] + }, + { + "kind": "variants", + "charts": [ + { + "kind": "chart", + "title": "defaulted subscript lookups", + "tasks": [ + "Dictionary defaulted subscript, successful lookups", + "Dictionary defaulted subscript, unsuccessful lookups", + "OrderedDictionary defaulted subscript, successful lookups", + "OrderedDictionary defaulted subscript, unsuccessful lookups", + ] + }, + { + "kind": "chart", + "title": "defaulted subscript mutations", + "tasks": [ + "Dictionary defaulted subscript, _modify existing", + "Dictionary defaulted subscript, _modify missing", + "OrderedDictionary defaulted subscript, _modify existing", + "OrderedDictionary defaulted subscript, _modify missing", + ] + }, + ] + }, + { + "kind": "chart", + "title": "updateValue(_:forKey:)", + "tasks": [ + "Dictionary updateValue(_:forKey:), existing", + "Dictionary updateValue(_:forKey:), insert", + "OrderedDictionary updateValue(_:forKey:), existing", + "OrderedDictionary updateValue(_:forKey:), append", + ] + }, + ] + }, + ] + }, + { + "kind": "group", + "title": "Against containers in the C++ Standard Template Library", + "directory": "stl", + "contents": [ + { + "kind": "chart", + "title": "Hashing", + "tasks": [ + "std::hash", + "custom_intptr_hash (using Swift.Hasher)", + "Hasher.combine on a single buffer of integers", + "Int.hashValue on each value", + ] + }, + { + "kind": "group", + "title": "Array vs std::vector", + "directory": "Array + vector", + "contents": [ + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "std::vector constructor from buffer", + "Array init from unsafe buffer", + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "std::vector sequential iteration", + "Array sequential iteration", + ] + }, + { + "kind": "chart", + "title": "random-access offset lookups", + "tasks": [ + "std::vector random-access offset lookups (operator [])", + "std::vector random-access offset lookups (at)", + "Array subscript get, random offsets", + ] + }, + { + "kind": "chart", + "title": "append individual integers", + "tasks": [ + "std::vector push_back", + "std::vector push_back, reserving capacity", + "Array append", + "Array append, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "prepend individual integers", + "tasks": [ + "std::vector insert at front", + "std::vector insert at front, reserving capacity", + "Array prepend", + "Array prepend, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "random insertions", + "tasks": [ + "std::vector random insertions", + "Array random insertions", + ] + }, + { + "kind": "chart", + "title": "removeFirst", + "tasks": [ + "std::vector erase first", + "Array removeFirst", + ] + }, + { + "kind": "chart", + "title": "removeLast", + "tasks": [ + "std::vector pop_back", + "Array removeLast", + ] + }, + { + "kind": "chart", + "title": "random removals", + "tasks": [ + "std::vector random removals", + "Array random removals", + ] + }, + { + "kind": "chart", + "title": "sort", + "tasks": [ + "std::vector sort", + "Array sort", + ] + }, + ] + }, + { + "kind": "group", + "title": "Deque vs std::deque", + "directory": "Deque + deque", + "contents": [ + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "std::deque constructor from buffer", + "Deque init from unsafe buffer", + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "std::deque sequential iteration", + "Deque sequential iteration (contiguous)", + "Deque sequential iteration (discontiguous)", + ] + }, + { + "kind": "chart", + "title": "random-access offset lookups", + "tasks": [ + "std::deque random-access offset lookups (operator [])", + "std::deque at, random offsets", + "Deque subscript get, random offsets (contiguous)", + "Deque subscript get, random offsets (discontiguous)", + ] + }, + { + "kind": "chart", + "title": "append individual integers", + "tasks": [ + "std::deque push_back", + "Deque append", + "Deque append, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "prepend individual integers", + "tasks": [ + "std::deque push_front", + "Deque prepend", + "Deque prepend, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "random insertions", + "tasks": [ + "std::deque random insertions", + "Deque random insertions", + ] + }, + { + "kind": "chart", + "title": "removeFirst", + "tasks": [ + "std::deque pop_front", + "Deque removeFirst (contiguous)", + "Deque removeFirst (discontiguous)", + ] + }, + { + "kind": "chart", + "title": "removeLast", + "tasks": [ + "std::deque pop_back", + "Deque removeLast (contiguous)", + "Deque removeLast (discontiguous)", + ] + }, + { + "kind": "chart", + "title": "random removals", + "tasks": [ + "std::deque random removals", + "Deque random removals (contiguous)", + "Deque random removals (discontiguous)", + ] + }, + { + "kind": "chart", + "title": "sort", + "tasks": [ + "std::deque sort", + "Deque sort (contiguous)", + "Deque sort (discontiguous)", + ] + }, + ] + }, + { + "kind": "group", + "title": "Set vs std::unordered_set", + "directory": "Set + unordered_set", + "contents": [ + { + "kind": "chart", + "title": "init from integer range", + "tasks": [ + "std::unordered_set insert from integer range", + "Set init from range", + ] + }, + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "std::unordered_set constructor from buffer", + "Set init from unsafe buffer", + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "std::unordered_set sequential iteration", + "Set sequential iteration", + ] + }, + { + "kind": "chart", + "title": "successful lookups", + "tasks": [ + "std::unordered_set successful find", + "Set successful contains", + ] + }, + { + "kind": "chart", + "title": "unsuccessful lookups", + "tasks": [ + "std::unordered_set unsuccessful find", + "Set unsuccessful contains", + ] + }, + { + "kind": "chart", + "title": "random insertions", + "tasks": [ + "std::unordered_set insert", + "std::unordered_set insert, reserving capacity", + "Set insert", + "Set insert, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "random removals", + "tasks": [ + "std::unordered_set erase", + "Set remove", + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedSet vs std::unordered_set", + "directory": "OrderedSet + unordered_set", + "contents": [ + { + "kind": "chart", + "title": "init from integer range", + "tasks": [ + "std::unordered_set insert from integer range", + "Set init from range", + "OrderedSet init from range", + ] + }, + { + "kind": "chart", + "title": "init from buffer of integers", + "tasks": [ + "std::unordered_set constructor from buffer", + "Set init from unsafe buffer", + "OrderedSet init from unsafe buffer", + ] + }, + { + "kind": "chart", + "title": "sequential iteration", + "tasks": [ + "std::unordered_set sequential iteration", + "Set sequential iteration", + "OrderedSet sequential iteration", + ] + }, + { + "kind": "chart", + "title": "successful lookups", + "tasks": [ + "std::unordered_set successful find", + "OrderedSet successful contains", + "Set successful contains", + ] + }, + { + "kind": "chart", + "title": "unsuccessful lookups", + "tasks": [ + "std::unordered_set unsuccessful find", + "OrderedSet unsuccessful contains", + "Set unsuccessful contains", + ] + }, + { + "kind": "chart", + "title": "insertions", + "tasks": [ + "std::unordered_set insert", + "Set insert", + "OrderedSet append", + ] + }, + { + "kind": "chart", + "title": "insertions, reserving capacity", + "tasks": [ + "std::unordered_set insert, reserving capacity", + "Set insert, reserving capacity", + "OrderedSet append, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "random removals", + "tasks": [ + "std::unordered_set erase", + "Set remove", + "OrderedSet remove", + ] + }, + ] + }, + { + "kind": "group", + "title": "OrderedDictionary vs std::unordered_map", + "directory": "OrderedDictionary + unordered_map", + "contents": [ + { + "kind": "chart", + "title": "initializers", + "tasks": [ + "std::unordered_map insert", + "Dictionary init(uniqueKeysWithValues:)", + "OrderedDictionary init(uniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeysWithValues:)", + "OrderedDictionary init(uncheckedUniqueKeys:values:)", + ] + }, + { + "kind": "chart", + "title": "iteration", + "tasks": [ + "std::unordered_map sequential iteration", + "Dictionary sequential iteration", + "OrderedDictionary sequential iteration", + ] + }, + { + "kind": "chart", + "title": "successful find index", + "tasks": [ + "std::unordered_map successful find", + "OrderedDictionary successful index(forKey:)", + "Dictionary successful index(forKey:)", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "unsuccessful find index", + "tasks": [ + "std::unordered_map unsuccessful find", + "OrderedDictionary unsuccessful index(forKey:)", + "Dictionary unsuccessful index(forKey:)", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "defaulted subscript, existing key", + "tasks": [ + "std::unordered_map subscript, existing key", + "OrderedDictionary defaulted subscript, _modify existing", + "Dictionary defaulted subscript, _modify existing", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "defaulted subscript, new key", + "tasks": [ + "std::unordered_map subscript, new key", + "OrderedDictionary defaulted subscript, _modify missing", + "Dictionary defaulted subscript, _modify missing", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "insert", + "tasks": [ + "std::unordered_map insert", + "OrderedDictionary subscript, append", + "Dictionary subscript, insert", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "insert, reserving capacity", + "tasks": [ + "std::unordered_map insert, reserving capacity", + "OrderedDictionary subscript, append, reserving capacity", + "Dictionary subscript, insert, reserving capacity", + "Int.hashValue on each value", + ] + }, + { + "kind": "chart", + "title": "removing existing elements", + "tasks": [ + "std::unordered_map erase existing", + "OrderedDictionary subscript, remove existing", + "Dictionary subscript, remove existing", + ] + }, + { + "kind": "chart", + "title": "removing missing elements", + "tasks": [ + "std::unordered_map erase missing", + "OrderedDictionary subscript, remove missing", + "Dictionary subscript, remove missing", + ] + }, + ] + }, + ] + }, + ] +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.swift new file mode 100644 index 00000000..44b6818e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/Library.swift @@ -0,0 +1,20 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import Foundation +import CollectionsBenchmark + +extension Benchmark { + public func loadReferenceLibrary() throws -> ChartLibrary { + let url = Bundle.module.url(forResource: "Library", withExtension: "json")! + return try ChartLibrary.load(from: url) + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedDictionaryBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedDictionaryBenchmarks.swift new file mode 100644 index 00000000..f68c2aa8 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedDictionaryBenchmarks.swift @@ -0,0 +1,486 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark +import OrderedCollections + +extension Benchmark { + public mutating func addOrderedDictionaryBenchmarks() { + self.add( + title: "OrderedDictionary init(uniqueKeysWithValues:)", + input: [Int].self + ) { input in + let keysAndValues = input.map { ($0, 2 * $0) } + return { timer in + blackHole(OrderedDictionary(uniqueKeysWithValues: keysAndValues)) + } + } + + self.add( + title: "OrderedDictionary init(uncheckedUniqueKeysWithValues:)", + input: [Int].self + ) { input in + let keysAndValues = input.map { ($0, 2 * $0) } + return { timer in + blackHole( + OrderedDictionary(uncheckedUniqueKeysWithValues: keysAndValues)) + } + } + + self.add( + title: "OrderedDictionary init(uncheckedUniqueKeys:values:)", + input: [Int].self + ) { input in + let values = input.map { 2 * $0 } + return { timer in + blackHole( + OrderedDictionary(uncheckedUniqueKeys: input, values: values)) + } + } + + self.add( + title: "OrderedDictionary sequential iteration", + input: [Int].self + ) { input in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, values: input.map { 2 * $0 }) + return { timer in + for item in d { + blackHole(item) + } + } + } + + self.add( + title: "OrderedDictionary.Keys sequential iteration", + input: [Int].self + ) { input in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, values: input.map { 2 * $0 }) + return { timer in + for item in d.keys { + blackHole(item) + } + } + } + + self.add( + title: "OrderedDictionary.Values sequential iteration", + input: [Int].self + ) { input in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, values: input.map { 2 * $0 }) + return { timer in + for item in d.values { + blackHole(item) + } + } + } + + self.add( + title: "OrderedDictionary subscript, successful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, values: input.map { 2 * $0 }) + return { timer in + for i in lookups { + precondition(d[i] == 2 * i) + } + } + } + + self.add( + title: "OrderedDictionary subscript, unsuccessful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, values: input.map { 2 * $0 }) + let c = input.count + return { timer in + for i in lookups { + precondition(d[i + c] == nil) + } + } + } + + self.add( + title: "OrderedDictionary subscript, noop setter", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[i + c] = nil + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary subscript, set existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i] = 0 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary subscript, _modify", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i]! *= 2 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.addSimple( + title: "OrderedDictionary subscript, append", + input: [Int].self + ) { input in + var d: OrderedDictionary = [:] + for i in input { + d[i] = 2 * i + } + precondition(d.count == input.count) + blackHole(d) + } + + self.addSimple( + title: "OrderedDictionary subscript, append, reserving capacity", + input: [Int].self + ) { input in + var d: OrderedDictionary = [:] + d.reserveCapacity(input.count) + for i in input { + d[i] = 2 * i + } + precondition(d.count == input.count) + blackHole(d) + } + + self.add( + title: "OrderedDictionary subscript, remove existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i] = nil + } + } + precondition(d.isEmpty) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary subscript, remove missing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[i + c] = nil + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary defaulted subscript, successful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + return { timer in + for i in lookups { + precondition(d[i, default: -1] != -1) + } + } + } + + self.add( + title: "OrderedDictionary defaulted subscript, unsuccessful lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + return { timer in + let c = d.count + for i in lookups { + precondition(d[i + c, default: -1] == -1) + } + } + } + + self.add( + title: "OrderedDictionary defaulted subscript, _modify existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d[i, default: -1] *= 2 + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary defaulted subscript, _modify missing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + let c = input.count + timer.measure { + for i in lookups { + d[c + i, default: -1] *= 2 + } + } + precondition(d.count == 2 * input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary successful index(forKey:)", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, + values: input.map { 2 * $0 }) + return { timer in + for i in lookups { + precondition(d.index(forKey: i) != nil) + } + } + } + + self.add( + title: "OrderedDictionary unsuccessful index(forKey:)", + input: ([Int], [Int]).self + ) { input, lookups in + let d = OrderedDictionary( + uncheckedUniqueKeys: input, + values: input.map { 2 * $0 }) + return { timer in + for i in lookups { + precondition(d.index(forKey: lookups.count + i) == nil) + } + } + } + + self.add( + title: "OrderedDictionary updateValue(_:forKey:), existing", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d.updateValue(0, forKey: i) + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary updateValue(_:forKey:), append", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + d.updateValue(0, forKey: input.count + i) + } + } + precondition(d.count == 2 * input.count) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary random swaps", + input: [Int].self + ) { input in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + var v = 0 + for i in input { + d.swapAt(i, v) + v += 1 + } + } + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary partitioning around middle", + input: [Int].self + ) { input in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + let pivot = input.count / 2 + timer.measure { + let r = d.partition(by: { $0.key >= pivot }) + precondition(r == pivot) + } + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary sort", + input: [Int].self + ) { input in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + d.sort() + } + precondition(d.keys.elementsEqual(0 ..< input.count)) + precondition(d.values.elementsEqual((0 ..< input.count).lazy.map { 2 * $0 })) + } + } + + self.add( + title: "OrderedDictionary removeLast", + input: Int.self + ) { size in + return { timer in + var d = OrderedDictionary(uncheckedUniqueKeys: 0 ..< size, + values: size ..< 2 * size) + timer.measure { + for _ in 0 ..< size { + d.removeLast() + } + } + precondition(d.isEmpty) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary removeFirst", + input: Int.self + ) { size in + return { timer in + var d = OrderedDictionary(uncheckedUniqueKeys: 0 ..< size, + values: size ..< 2 * size) + timer.measure { + for _ in 0 ..< size { + d.removeFirst() + } + } + precondition(d.isEmpty) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary random removals (offset-based)", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var d = OrderedDictionary(uncheckedUniqueKeys: 0 ..< insertions.count, + values: insertions.count ..< 2 * insertions.count) + timer.measure { + for i in stride(from: insertions.count, to: 0, by: -1) { + d.remove(at: insertions[i - 1]) + } + } + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary random removals (existing keys)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { ($0, 2 * $0) }) + timer.measure { + for i in lookups { + precondition(d.removeValue(forKey: i) != nil) + } + } + precondition(d.count == 0) + blackHole(d) + } + } + + self.add( + title: "OrderedDictionary random removals (missing keys)", + input: ([Int], [Int]).self + ) { input, lookups in + return { timer in + let c = input.count + var d = OrderedDictionary( + uncheckedUniqueKeysWithValues: input.map { (c + $0, 2 * $0) }) + timer.measure { + for i in lookups { + precondition(d.removeValue(forKey: i) == nil) + } + } + precondition(d.count == input.count) + blackHole(d) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedSetBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedSetBenchmarks.swift new file mode 100644 index 00000000..2717dc46 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/OrderedSetBenchmarks.swift @@ -0,0 +1,541 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark +import OrderedCollections + +extension Benchmark { + public mutating func addOrderedSetBenchmarks() { + self.addSimple( + title: "OrderedSet init from range", + input: Int.self + ) { size in + blackHole(OrderedSet(0 ..< size)) + } + + self.addSimple( + title: "OrderedSet init from unsafe buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + blackHole(OrderedSet(buffer)) + } + } + + self.addSimple( + title: "OrderedSet init(uncheckedUniqueElements:) from range", + input: Int.self + ) { size in + blackHole(OrderedSet(0 ..< size)) + } + + self.add( + title: "OrderedSet random-access offset lookups", + input: ([Int], [Int]).self + ) { input, lookups in + let set = OrderedSet(input) + return { timer in + for i in lookups { + blackHole(set[i]) + } + } + } + + self.add( + title: "OrderedSet sequential iteration", + input: [Int].self + ) { input in + let set = OrderedSet(input) + return { timer in + for i in set { + blackHole(i) + } + } + } + + self.add( + title: "OrderedSet successful contains", + input: ([Int], [Int]).self + ) { input, lookups in + let set = OrderedSet(input) + return { timer in + for i in lookups { + precondition(set.contains(i)) + } + } + } + + self.add( + title: "OrderedSet unsuccessful contains", + input: ([Int], [Int]).self + ) { input, lookups in + let set = OrderedSet(input) + let lookups = lookups.map { $0 + input.count } + return { timer in + for i in lookups { + precondition(!set.contains(i)) + } + } + } + + self.add( + title: "OrderedSet random swaps", + input: [Int].self + ) { input in + return { timer in + var set = OrderedSet(0 ..< input.count) + timer.measure { + for i in input.indices { + set.swapAt(i, input[i]) + } + } + blackHole(set) + } + } + + self.add( + title: "OrderedSet partitioning around middle", + input: [Int].self + ) { input in + return { timer in + let pivot = input.count / 2 + var set = OrderedSet(input) + timer.measure { + let r = set.partition(by: { $0 >= pivot }) + precondition(r == pivot) + } + blackHole(set) + } + } + + self.add( + title: "OrderedSet sort", + input: [Int].self + ) { input in + return { timer in + var set = OrderedSet(input) + timer.measure { + set.sort() + } + precondition(set.elementsEqual(0 ..< input.count)) + } + } + + self.addSimple( + title: "OrderedSet append", + input: [Int].self + ) { input in + var set: OrderedSet = [] + for i in input { + set.append(i) + } + precondition(set.count == input.count) + blackHole(set) + } + + self.addSimple( + title: "OrderedSet append, reserving capacity", + input: [Int].self + ) { input in + var set: OrderedSet = [] + set.reserveCapacity(input.count) + for i in input { + set.append(i) + } + precondition(set.count == input.count) + blackHole(set) + } + + self.addSimple( + title: "OrderedSet prepend", + input: [Int].self + ) { input in + var set: OrderedSet = [] + for i in input { + _ = set.insert(i, at: 0) + } + blackHole(set) + } + + self.addSimple( + title: "OrderedSet prepend, reserving capacity", + input: [Int].self + ) { input in + var set: OrderedSet = [] + set.reserveCapacity(input.count) + for i in input { + _ = set.insert(i, at: 0) + } + blackHole(set) + } + + self.add( + title: "OrderedSet random insertions, reserving capacity", + input: Insertions.self + ) { insertions in + return { timer in + let insertions = insertions.values + var set: OrderedSet = [] + set.reserveCapacity(insertions.count) + timer.measure { + for i in insertions.indices { + _ = set.insert(i, at: insertions[i]) + } + } + blackHole(set) + } + } + + self.add( + title: "OrderedSet remove", + input: ([Int], [Int]).self + ) { input, removals in + return { timer in + var set = OrderedSet(input) + timer.measure { + for i in removals { + set.remove(i) + } + } + precondition(set.isEmpty) + blackHole(set) + } + } + + self.add( + title: "OrderedSet removeLast", + input: Int.self + ) { size in + return { timer in + var set = OrderedSet(0 ..< size) + timer.measure { + for _ in 0 ..< size { + set.removeLast() + } + } + precondition(set.isEmpty) + blackHole(set) + } + } + + self.add( + title: "OrderedSet removeFirst", + input: Int.self + ) { size in + return { timer in + var set = OrderedSet(0 ..< size) + timer.measure { + for _ in 0 ..< size { + set.removeFirst() + } + } + precondition(set.isEmpty) + blackHole(set) + } + } + + if #available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) { + self.add( + title: "OrderedSet diff computation", + input: ([Int], [Int]).self + ) { pa, pb in + let a = OrderedSet(pa) + let b = OrderedSet(pb) + return { timer in + timer.measure { + blackHole(b.difference(from: a)) + } + } + } + + self.add( + title: "OrderedSet diff application", + input: ([Int], [Int]).self + ) { a, b in + let d = OrderedSet(b).difference(from: OrderedSet(a)) + return { timer in + timer.measure { + blackHole(a.applying(d)) + } + } + } + } + + let overlaps: [(String, (Int) -> Int)] = [ + ("0%", { c in c }), + ("25%", { c in 3 * c / 4 }), + ("50%", { c in c / 2 }), + ("75%", { c in c / 4 }), + ("100%", { c in 0 }), + ] + + // SetAlgebra operations with Self + do { + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet union with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = OrderedSet(start ..< start + input.count) + return { timer in + blackHole(a.union(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet intersection with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = OrderedSet(start ..< start + input.count) + return { timer in + blackHole(a.intersection(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet symmetricDifference with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = OrderedSet(start ..< start + input.count) + return { timer in + blackHole(a.symmetricDifference(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet subtracting Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = OrderedSet(start ..< start + input.count) + return { timer in + blackHole(a.subtracting(b)) + } + } + } + } + + // SetAlgebra operations with Array + do { + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet union with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.union(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet intersection with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.intersection(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet symmetricDifference with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.symmetricDifference(b)) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet subtracting Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = OrderedSet(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.subtracting(b)) + } + } + } + } + + // SetAlgebra mutations with Self + do { + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formUnion with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = OrderedSet(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formUnion(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formIntersection with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = OrderedSet(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formIntersection(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formSymmetricDifference with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = OrderedSet(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formSymmetricDifference(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet subtract Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = OrderedSet(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.subtract(b) + } + blackHole(a) + } + } + } + } + + // SetAlgebra mutations with Array + do { + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formUnion with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formUnion(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formIntersection with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formIntersection(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet formSymmetricDifference with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.formSymmetricDifference(b) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "OrderedSet subtract Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = OrderedSet(input) + timer.measure { + a.subtract(b) + } + blackHole(a) + } + } + } + } + + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/SetBenchmarks.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/SetBenchmarks.swift new file mode 100644 index 00000000..3a853b6a --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Benchmarks/SetBenchmarks.swift @@ -0,0 +1,397 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark + +extension Benchmark { + public mutating func addSetBenchmarks() { + self.addSimple( + title: "Int.hashValue on each value", + input: Int.self + ) { size in + for i in 0 ..< size { + blackHole(i.hashValue) + } + } + + self.addSimple( + title: "Hasher.combine on a single buffer of integers", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + var hasher = Hasher() + hasher.combine(bytes: UnsafeRawBufferPointer(buffer)) + blackHole(hasher.finalize()) + } + } + + self.addSimple( + title: "Set init from range", + input: Int.self + ) { size in + blackHole(Set(0 ..< size)) + } + + self.addSimple( + title: "Set init from unsafe buffer", + input: [Int].self + ) { input in + input.withUnsafeBufferPointer { buffer in + blackHole(Set(buffer)) + } + } + + self.add( + title: "Set sequential iteration", + input: Int.self + ) { size in + let set = Set(0 ..< size) + return { timer in + for i in set { + blackHole(i) + } + } + } + + self.add( + title: "Set successful contains", + input: ([Int], [Int]).self + ) { input, lookups in + let set = Set(input) + return { timer in + for i in lookups { + precondition(set.contains(i)) + } + } + } + + self.add( + title: "Set unsuccessful contains", + input: ([Int], [Int]).self + ) { input, lookups in + let set = Set(input) + let lookups = lookups.map { $0 + input.count } + return { timer in + for i in lookups { + precondition(!set.contains(i)) + } + } + } + + self.addSimple( + title: "Set insert", + input: [Int].self + ) { input in + var set: Set = [] + for i in input { + set.insert(i) + } + precondition(set.count == input.count) + blackHole(set) + } + + self.addSimple( + title: "Set insert, reserving capacity", + input: [Int].self + ) { input in + var set: Set = [] + set.reserveCapacity(input.count) + for i in input { + set.insert(i) + } + precondition(set.count == input.count) + blackHole(set) + } + + self.add( + title: "Set remove", + input: ([Int], [Int]).self + ) { input, removals in + return { timer in + var set = Set(input) + for i in removals { + set.remove(i) + } + precondition(set.isEmpty) + blackHole(set) + } + } + + let overlaps: [(String, (Int) -> Int)] = [ + ("0%", { c in c }), + ("25%", { c in 3 * c / 4 }), + ("50%", { c in c / 2 }), + ("75%", { c in c / 4 }), + ("100%", { c in 0 }), + ] + + // SetAlgebra operations with Self + do { + for (percentage, start) in overlaps { + self.add( + title: "Set union with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Set(start ..< start + input.count) + return { timer in + blackHole(a.union(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set intersection with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Set(start ..< start + input.count) + return { timer in + blackHole(a.intersection(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set symmetricDifference with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Set(start ..< start + input.count) + return { timer in + blackHole(a.symmetricDifference(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set subtracting Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Set(start ..< start + input.count) + return { timer in + blackHole(a.subtracting(identity(b))) + } + } + } + } + + // SetAlgebra operations with Array + do { + for (percentage, start) in overlaps { + self.add( + title: "Set union with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.union(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set intersection with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.intersection(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set symmetricDifference with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.symmetricDifference(identity(b))) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set subtracting Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let a = Set(input) + let b = Array(start ..< start + input.count) + return { timer in + blackHole(a.subtracting(identity(b))) + } + } + } + } + + // SetAlgebra mutations with Self + do { + for (percentage, start) in overlaps { + self.add( + title: "Set formUnion with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Set(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formUnion(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set formIntersection with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Set(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formIntersection(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set formSymmetricDifference with Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Set(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formSymmetricDifference(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set subtract Self (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Set(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.subtract(identity(b)) + } + blackHole(a) + } + } + } + } + + // SetAlgebra mutations with Array + do { + for (percentage, start) in overlaps { + self.add( + title: "Set formUnion with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formUnion(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set formIntersection with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formIntersection(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set formSymmetricDifference with Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.formSymmetricDifference(identity(b)) + } + blackHole(a) + } + } + } + + for (percentage, start) in overlaps { + self.add( + title: "Set subtract Array (\(percentage) overlap)", + input: [Int].self + ) { input in + let start = start(input.count) + let b = Array(start ..< start + input.count) + return { timer in + var a = Set(input) + timer.measure { + a.subtract(identity(b)) + } + blackHole(a) + } + } + } + } + + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/DequeBenchmarks.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/DequeBenchmarks.h new file mode 100644 index 00000000..1aaae6c5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/DequeBenchmarks.h @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CPPBENCHMARKS_DEQUE_BENCHMARKS_H +#define CPPBENCHMARKS_DEQUE_BENCHMARKS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/// Create a std::deque, populating it with data from the supplied buffer. +/// Returns an opaque pointer to the created instance. +extern void *cpp_deque_create(const intptr_t *start, size_t count); + +/// Destroys a deque previously returned by `cpp_deque_create`. +extern void cpp_deque_destroy(void *ptr); + +extern void cpp_deque_from_int_range(intptr_t count); +extern void cpp_deque_from_int_buffer(const intptr_t *start, size_t count); + +extern void cpp_deque_append_integers(const intptr_t *start, size_t count); +extern void cpp_deque_prepend_integers(const intptr_t *start, size_t count); +extern void cpp_deque_random_insertions(const intptr_t *start, size_t count); + +extern void cpp_deque_iterate(void *ptr); +extern void cpp_deque_lookups_subscript(void *ptr, const intptr_t *start, size_t count); +extern void cpp_deque_lookups_at(void *ptr, const intptr_t *start, size_t count); +extern void cpp_deque_pop_back(void *ptr); +extern void cpp_deque_pop_front(void *ptr); +extern void cpp_deque_random_removals(void *ptr, const intptr_t *start, size_t count); +extern void cpp_deque_sort(void *ptr); + +#ifdef __cplusplus +} +#endif + + +#endif /* CPPBENCHMARKS_DEQUE_BENCHMARKS_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/Hashing.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/Hashing.h new file mode 100644 index 00000000..5d85e7b7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/Hashing.h @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CPPBENCHMARKS_HASHING_H +#define CPPBENCHMARKS_HASHING_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef size_t (*cpp_hash_fn)(intptr_t); +extern void cpp_set_hash_fn(cpp_hash_fn fn); + +// Benchmarks +void cpp_hash(const intptr_t *start, size_t count); +void cpp_custom_hash(const intptr_t *start, size_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* CPPBENCHMARKS_HASHING_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedMapBenchmarks.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedMapBenchmarks.h new file mode 100644 index 00000000..e368f79f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedMapBenchmarks.h @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CPPBENCHMARKS_UNORDERED_MAP_BENCHMARKS_H +#define CPPBENCHMARKS_UNORDERED_MAP_BENCHMARKS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/// Create a std::unordered_map, populating it with data from the supplied buffer. +/// Returns an opaque pointer to the created instance. +extern void *cpp_unordered_map_create(const intptr_t *start, size_t count); + +/// Destroys an unordered map previously returned by `cpp_unordered_map_create`. +extern void cpp_unordered_map_destroy(void *ptr); + +extern void cpp_unordered_map_iterate(void *ptr); + +extern void cpp_unordered_map_from_int_range(intptr_t count); +extern void cpp_unordered_map_insert_integers(const intptr_t *start, size_t count, bool reserve); + +extern void cpp_unordered_map_lookups(void *ptr, const intptr_t *start, size_t count, bool expectMatch); +extern void cpp_unordered_map_subscript(void *ptr, const intptr_t *start, size_t count); +extern void cpp_unordered_map_removals(void *ptr, const intptr_t *start, size_t count); + +#ifdef __cplusplus +} +#endif + + +#endif /* CPPBENCHMARKS_UNORDERED_MAP_BENCHMARKS_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedSetBenchmarks.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedSetBenchmarks.h new file mode 100644 index 00000000..fb627d44 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/UnorderedSetBenchmarks.h @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CPPBENCHMARKS_UNORDERED_SET_BENCHMARKS_H +#define CPPBENCHMARKS_UNORDERED_SET_BENCHMARKS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void cpp_hash(const intptr_t *start, size_t count); + +/// Create a std::unordered_set, populating it with data from the supplied buffer. +/// Returns an opaque pointer to the created instance. +extern void *cpp_unordered_set_create(const intptr_t *start, size_t count); + +/// Destroys an unordered set previously returned by `cpp_unordered_set_create`. +extern void cpp_unordered_set_destroy(void *ptr); + +extern void cpp_unordered_set_iterate(void *ptr); +extern void cpp_unordered_set_from_int_range(intptr_t count); +extern void cpp_unordered_set_from_int_buffer(const intptr_t *start, size_t count); + +extern void cpp_unordered_set_insert_integers(const intptr_t *start, size_t count, bool reserve); + +extern void cpp_unordered_set_lookups(void *ptr, const intptr_t *start, size_t count, bool expectMatch); +extern void cpp_unordered_set_removals(void *ptr, const intptr_t *start, size_t count); + +#ifdef __cplusplus +} +#endif + + +#endif /* CPPBENCHMARKS_UNORDERED_SET_BENCHMARKS_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/VectorBenchmarks.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/VectorBenchmarks.h new file mode 100644 index 00000000..6a4a99b1 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/VectorBenchmarks.h @@ -0,0 +1,50 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CPPBENCHMARKS_VECTOR_BENCHMARKS_H +#define CPPBENCHMARKS_VECTOR_BENCHMARKS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/// Create a std::vector, populating it with data from the supplied buffer. +/// Returns an opaque pointer to the created instance. +extern void *cpp_vector_create(const intptr_t *start, size_t count); + +/// Destroys a vector previously returned by `cpp_vector_create`. +extern void cpp_vector_destroy(void *ptr); + +extern void cpp_vector_from_int_range(intptr_t count); +extern void cpp_vector_from_int_buffer(const intptr_t *start, size_t count); + +extern void cpp_vector_append_integers(const intptr_t *start, size_t count, bool reserve); +extern void cpp_vector_prepend_integers(const intptr_t *start, size_t count, bool reserve); +extern void cpp_vector_random_insertions(const intptr_t *start, size_t count, bool reserve); + +extern void cpp_vector_iterate(void *ptr); +extern void cpp_vector_lookups_subscript(void *ptr, const intptr_t *start, size_t count); +extern void cpp_vector_lookups_at(void *ptr, const intptr_t *start, size_t count); +extern void cpp_vector_pop_back(void *ptr); +extern void cpp_vector_pop_front(void *ptr); +extern void cpp_vector_random_removals(void *ptr, const intptr_t *start, size_t count); +extern void cpp_vector_sort(void *ptr); + +#ifdef __cplusplus +} +#endif + + +#endif /* CPPBENCHMARKS_VECTOR_BENCHMARKS_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/module.modulemap b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/module.modulemap new file mode 100644 index 00000000..13fe2d39 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/include/module.modulemap @@ -0,0 +1,9 @@ +module CppBenchmarks { + header "Hashing.h" + header "VectorBenchmarks.h" + header "DequeBenchmarks.h" + header "UnorderedSetBenchmarks.h" + header "UnorderedMapBenchmarks.h" + export * +} + diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/CustomHash.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/CustomHash.h new file mode 100644 index 00000000..c8ba3597 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/CustomHash.h @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef CUSTOMHASH_H +#define CUSTOMHASH_H + +#include +#include + +#include "Hashing.h" + +extern cpp_hash_fn custom_hash_fn; + +struct custom_intptr_hash: public std::unary_function +{ + std::size_t + operator()(intptr_t value) const + { + return static_cast(custom_hash_fn(value)); + } +}; + +#endif /* CUSTOMHASH_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/DequeBenchmarks.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/DequeBenchmarks.cpp new file mode 100644 index 00000000..dc76acca --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/DequeBenchmarks.cpp @@ -0,0 +1,140 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#include "DequeBenchmarks.h" +#include +#include +#include "utils.h" + +void * +cpp_deque_create(const intptr_t *start, size_t count) +{ + auto deque = new std::deque(start, start + count); + return deque; +} + +void +cpp_deque_destroy(void *ptr) +{ + delete static_cast *>(ptr); +} + +void +cpp_deque_from_int_range(intptr_t count) +{ + auto deque = std::deque(); + for (intptr_t i = 0; i < count; i++) { + deque.push_back(identity(i)); + } + black_hole(&deque); +} + +void +cpp_deque_from_int_buffer(const intptr_t *start, size_t count) +{ + auto deque = std::deque(start, start + count); + black_hole(&deque); +} + +void +cpp_deque_append_integers(const intptr_t *start, size_t count) +{ + auto deque = std::deque(); + auto end = start + count; + for (auto p = start; p != end; ++p) { + deque.push_back(*identity(p)); + } + black_hole(&deque); +} + +void +cpp_deque_prepend_integers(const intptr_t *start, size_t count) +{ + auto deque = std::deque(); + auto end = start + count; + for (auto p = start; p != end; ++p) { + deque.push_front(*identity(p)); + } + black_hole(&deque); +} + +void +cpp_deque_random_insertions(const intptr_t *start, size_t count) +{ + auto deque = std::deque(); + for (intptr_t i = 0; i < count; i++) { + deque.insert(deque.cbegin() + start[i], identity(i)); + } + black_hole(&deque); +} + +void +cpp_deque_iterate(void *ptr) +{ + auto deque = static_cast *>(ptr); + for (auto it = deque->cbegin(); it != deque->cend(); ++it) { + black_hole(*it); + } +} + +void +cpp_deque_lookups_subscript(void *ptr, const intptr_t *start, size_t count) +{ + auto deque = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + black_hole((*deque)[*it]); + } +} + +void +cpp_deque_lookups_at(void *ptr, const intptr_t *start, size_t count) +{ + auto deque = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + black_hole((*deque).at(*it)); + } +} + +void +cpp_deque_pop_back(void *ptr) +{ + auto deque = static_cast *>(ptr); + auto size = deque->size(); + for (int i = 0; i < size; ++i) { + identity(deque)->pop_back(); + } +} + +void +cpp_deque_pop_front(void *ptr) +{ + auto deque = static_cast *>(ptr); + auto size = deque->size(); + for (int i = 0; i < size; ++i) { + identity(deque)->pop_front(); + } +} + +void +cpp_deque_random_removals(void *ptr, const intptr_t *start, size_t count) +{ + auto deque = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + identity(deque)->erase(deque->cbegin() + *it); + } +} + +void +cpp_deque_sort(void *ptr) +{ + auto deque = static_cast *>(ptr); + std::sort(deque->begin(), deque->end()); +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/Hashing.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/Hashing.cpp new file mode 100644 index 00000000..cdbac9d6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/Hashing.cpp @@ -0,0 +1,39 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#import "Hashing.h" +#import "CustomHash.h" +#import "utils.h" + +cpp_hash_fn custom_hash_fn; + +void +cpp_set_hash_fn(cpp_hash_fn fn) +{ + custom_hash_fn = fn; +} + +void +cpp_hash(const intptr_t *start, size_t count) +{ + for (auto p = start; p < start + count; ++p) { + black_hole(std::hash{}(*p)); + } +} + +void +cpp_custom_hash(const intptr_t *start, size_t count) +{ + for (auto p = start; p < start + count; ++p) { + black_hole(custom_intptr_hash{}(*p)); + } +} + diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedMapBenchmarks.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedMapBenchmarks.cpp new file mode 100644 index 00000000..17f4f95a --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedMapBenchmarks.cpp @@ -0,0 +1,96 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#include "UnorderedMapBenchmarks.h" +#include +#include +#include +#include "CustomHash.h" +#include "utils.h" + +typedef std::unordered_map custom_map; + +void * +cpp_unordered_map_create(const intptr_t *start, size_t count) +{ + auto map = new custom_map(); + for (size_t i = 0; i < count; ++i) { + map->insert({start[i], 2 * start[i]}); + } + return map; +} + +void +cpp_unordered_map_destroy(void *ptr) +{ + delete static_cast(ptr); +} + +void +cpp_unordered_map_from_int_range(intptr_t count) +{ + auto map = custom_map(); + for (intptr_t i = 0; i < count; i++) { + map.insert({identity(i), 2 * i}); + } + black_hole(&map); +} + +void +cpp_unordered_map_insert_integers(const intptr_t *start, size_t count, bool reserve) +{ + auto map = custom_map(); + if (reserve) map.reserve(count); + auto end = start + count; + for (auto p = start; p != end; ++p) { + auto v = *identity(p); + map.insert({ v, 2 * v }); + } + black_hole(&map); +} + +void +cpp_unordered_map_iterate(void *ptr) +{ + auto map = static_cast(ptr); + for (auto it = map->cbegin(); it != map->cend(); ++it) { + black_hole(it->first); + black_hole(it->second); + } +} + +void +cpp_unordered_map_lookups(void *ptr, const intptr_t *start, size_t count, bool expectMatch) +{ + auto map = static_cast(ptr); + for (auto it = start; it < start + count; ++it) { + auto found = map->find(*it) != map->end(); + if (found != expectMatch) { abort(); } + } +} + +void +cpp_unordered_map_subscript(void *ptr, const intptr_t *start, size_t count) +{ + auto map = static_cast(ptr); + for (auto it = start; it < start + count; ++it) { + black_hole((*map)[*it]); + } +} + +void +cpp_unordered_map_removals(void *ptr, const intptr_t *start, size_t count) +{ + auto map = static_cast(ptr); + for (auto it = start; it < start + count; ++it) { + identity(map)->erase(*it); + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedSetBenchmarks.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedSetBenchmarks.cpp new file mode 100644 index 00000000..625523c1 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/UnorderedSetBenchmarks.cpp @@ -0,0 +1,90 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#include "UnorderedSetBenchmarks.h" +#include +#include +#include +#include +#include "CustomHash.h" +#include "utils.h" + +typedef std::unordered_set custom_set; + +void * +cpp_unordered_set_create(const intptr_t *start, size_t count) +{ + auto set = new custom_set(start, start + count); + return set; +} + +void +cpp_unordered_set_destroy(void *ptr) +{ + delete static_cast(ptr); +} + +void +cpp_unordered_set_from_int_range(intptr_t count) +{ + auto set = custom_set(); + for (intptr_t i = 0; i < count; i++) { + set.insert(identity(i)); + } + black_hole(&set); +} + +void +cpp_unordered_set_from_int_buffer(const intptr_t *start, size_t count) +{ + auto set = custom_set(start, start + count); + black_hole(&set); +} + +void +cpp_unordered_set_insert_integers(const intptr_t *start, size_t count, bool reserve) +{ + auto set = custom_set(); + if (reserve) set.reserve(count); + auto end = start + count; + for (auto p = start; p != end; ++p) { + set.insert(*identity(p)); + } + black_hole(&set); +} + +void +cpp_unordered_set_iterate(void *ptr) +{ + auto set = static_cast(ptr); + for (auto it = set->cbegin(); it != set->cend(); ++it) { + black_hole(*it); + } +} + +void +cpp_unordered_set_lookups(void *ptr, const intptr_t *start, size_t count, bool expectMatch) +{ + auto set = static_cast(ptr); + for (auto it = start; it < start + count; ++it) { + auto found = set->find(*it) != set->end(); + if (found != expectMatch) { abort(); } + } +} + +void +cpp_unordered_set_removals(void *ptr, const intptr_t *start, size_t count) +{ + auto set = static_cast(ptr); + for (auto it = start; it < start + count; ++it) { + identity(set)->erase(*it); + } +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/VectorBenchmarks.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/VectorBenchmarks.cpp new file mode 100644 index 00000000..cd93965b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/VectorBenchmarks.cpp @@ -0,0 +1,143 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#include "VectorBenchmarks.h" +#include +#include +#include "utils.h" + +void * +cpp_vector_create(const intptr_t *start, size_t count) +{ + auto vector = new std::vector(start, start + count); + return vector; +} + +void +cpp_vector_destroy(void *ptr) +{ + delete static_cast *>(ptr); +} + +void +cpp_vector_from_int_range(intptr_t count) +{ + auto vector = std::vector(); + for (intptr_t i = 0; i < count; i++) { + vector.push_back(identity(i)); + } + black_hole(&vector); +} + +void +cpp_vector_from_int_buffer(const intptr_t *start, size_t count) +{ + auto vector = std::vector(start, start + count); + black_hole(&vector); +} + +void +cpp_vector_append_integers(const intptr_t *start, size_t count, bool reserve) +{ + auto vector = std::vector(); + if (reserve) vector.reserve(count); + auto end = start + count; + for (auto p = start; p != end; ++p) { + vector.push_back(*identity(p)); + } + black_hole(&vector); +} + +void +cpp_vector_prepend_integers(const intptr_t *start, size_t count, bool reserve) +{ + auto vector = std::vector(); + if (reserve) vector.reserve(count); + auto end = start + count; + for (auto p = start; p != end; ++p) { + vector.insert(vector.cbegin(), *identity(p)); + } + black_hole(&vector); +} + +void +cpp_vector_random_insertions(const intptr_t *start, size_t count, bool reserve) +{ + auto vector = std::vector(); + if (reserve) vector.reserve(count); + for (intptr_t i = 0; i < count; i++) { + vector.insert(vector.cbegin() + start[i], identity(i)); + } + black_hole(&vector); +} + +void +cpp_vector_iterate(void *ptr) +{ + auto vector = static_cast *>(ptr); + for (auto it = vector->cbegin(); it != vector->cend(); ++it) { + black_hole(*it); + } +} + +void +cpp_vector_lookups_subscript(void *ptr, const intptr_t *start, size_t count) +{ + auto vector = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + black_hole((*vector)[*it]); + } +} + +void +cpp_vector_lookups_at(void *ptr, const intptr_t *start, size_t count) +{ + auto vector = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + black_hole((*vector).at(*it)); + } +} + +void +cpp_vector_pop_back(void *ptr) +{ + auto vector = static_cast *>(ptr); + auto size = vector->size(); + for (int i = 0; i < size; ++i) { + identity(vector)->pop_back(); + } +} + +void +cpp_vector_pop_front(void *ptr) +{ + auto vector = static_cast *>(ptr); + auto size = vector->size(); + for (int i = 0; i < size; ++i) { + identity(vector)->erase(vector->cbegin()); + } +} + +void +cpp_vector_random_removals(void *ptr, const intptr_t *start, size_t count) +{ + auto vector = static_cast *>(ptr); + for (auto it = start; it < start + count; ++it) { + identity(vector)->erase(vector->cbegin() + *it); + } +} + +void +cpp_vector_sort(void *ptr) +{ + auto vector = static_cast *>(ptr); + std::sort(vector->begin(), vector->end()); +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.cpp b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.cpp new file mode 100644 index 00000000..1e2c542c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.cpp @@ -0,0 +1,42 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#include "utils.h" + +void +black_hole(intptr_t value) +{ + // Do nothing. +} + +void +black_hole(void *value) +{ + // Do nothing. +} + +intptr_t +identity(intptr_t value) +{ + return value; +} + +void * +_identity(void *value) +{ + return value; +} + +const void * +_identity(const void *value) +{ + return value; +} diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.h b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.h new file mode 100644 index 00000000..9109a093 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/CppBenchmarks/src/utils.h @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#ifndef BLACK_HOLE_H +#define BLACK_HOLE_H + +#include + +// FIXME: Is putting this in a separate compilation unit enough to make +// sure the function call is always emitted? + +extern void black_hole(intptr_t value); +extern void black_hole(void *value); + +extern intptr_t identity(intptr_t value); +extern void *_identity(void *value); +extern const void *_identity(const void *value); + +template +static inline T *identity(T *value) +{ + return static_cast(_identity(value)); +} + +template +static inline const T *identity(const T *value) +{ + return static_cast(_identity(value)); +} +#endif /* BLACK_HOLE_H */ diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/Package.swift b/Carthage/Checkouts/swift-collections/Benchmarks/Package.swift new file mode 100644 index 00000000..d7a7ec64 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/Package.swift @@ -0,0 +1,47 @@ +// swift-tools-version:5.3 +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import PackageDescription + +let package = Package( + name: "swift-collections.Benchmarks", + dependencies: [ + .package(name: "swift-collections", path: ".."), + .package(url: "https://github.com/apple/swift-collections-benchmark", from: "0.0.1"), + ], + targets: [ + .target( + name: "Benchmarks", + dependencies: [ + .product(name: "Collections", package: "swift-collections"), + .product(name: "CollectionsBenchmark", package: "swift-collections-benchmark"), + "CppBenchmarks", + ], + path: "Benchmarks", + resources: [ + .copy("Library.json"), + ] + ), + .target( + name: "CppBenchmarks", + path: "CppBenchmarks" + ), + .target( + name: "benchmark", + dependencies: [ + "Benchmarks", + ], + path: "benchmark-tool" + ), + ], + cxxLanguageStandard: .cxx1z +) diff --git a/Carthage/Checkouts/swift-collections/Benchmarks/benchmark-tool/main.swift b/Carthage/Checkouts/swift-collections/Benchmarks/benchmark-tool/main.swift new file mode 100644 index 00000000..ddfed857 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Benchmarks/benchmark-tool/main.swift @@ -0,0 +1,26 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import CollectionsBenchmark +import Benchmarks + +var benchmark = Benchmark(title: "Collection Benchmarks") +benchmark.addArrayBenchmarks() +benchmark.addSetBenchmarks() +benchmark.addDictionaryBenchmarks() +benchmark.addDequeBenchmarks() +benchmark.addOrderedSetBenchmarks() +benchmark.addOrderedDictionaryBenchmarks() +benchmark.addCppBenchmarks() + +benchmark.chartLibrary = try benchmark.loadReferenceLibrary() + +benchmark.main() diff --git a/Carthage/Checkouts/swift-collections/CMakeLists.txt b/Carthage/Checkouts/swift-collections/CMakeLists.txt new file mode 100644 index 00000000..efb36775 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/CMakeLists.txt @@ -0,0 +1,32 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +cmake_minimum_required(VERSION 3.16) +project(SwiftCollections + LANGUAGES C Swift) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) +set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift) + +if(CMAKE_SYSTEM_NAME STREQUAL Windows OR CMAKE_SYSTEM_NAME STREQUAL Darwin) + option(BUILD_SHARED_LIBS "Build shared libraries by default" YES) +endif() + +include(CTest) +include(SwiftSupport) + +add_subdirectory(Sources) +# if(BUILD_TESTING) +# add_subdirectory(Tests) +# endif() +add_subdirectory(cmake/modules) diff --git a/Carthage/Checkouts/swift-collections/CODEOWNERS b/Carthage/Checkouts/swift-collections/CODEOWNERS new file mode 100644 index 00000000..7a84b3bc --- /dev/null +++ b/Carthage/Checkouts/swift-collections/CODEOWNERS @@ -0,0 +1,19 @@ +# This file is a list of the people responsible for ensuring that patches for a +# particular part of Swift are reviewed, either by themselves or by someone else. +# They are also the gatekeepers for their part of Swift, with the final word on +# what goes in or not. +# +# The list is sorted by surname and formatted to allow easy grepping and +# beautification by scripts. The fields are: name (N), email (E), web-address +# (W), PGP key ID and fingerprint (P), description (D), and snail-mail address +# (S). + +# N: Karoy Lorentey +# E: klorentey@apple.com +# D: Everything in swift-collections not covered by someone else + +### + +# The following lines are used by GitHub to automatically recommend reviewers. + +* @lorentey diff --git a/Carthage/Checkouts/swift-collections/CODE_OF_CONDUCT.md b/Carthage/Checkouts/swift-collections/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..95c80e78 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/CODE_OF_CONDUCT.md @@ -0,0 +1,38 @@ +# Code of Conduct + +To be a truly great community, Swift.org needs to welcome developers from all walks of life, with different backgrounds, and with a wide range of experience. A diverse and friendly community will have more great ideas, more unique perspectives, and produce more great code. We will work diligently to make the Swift community welcoming to everyone. + +To give clarity of what is expected of our members, this code of conduct is based on [contributor-covenant.org](http://contributor-covenant.org). This document is used across many open source communities, and we think it articulates our values well. + +### Contributor Code of Conduct v1.4 + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language (e.g., prefer non-gendered words like “folks” to “guys”, non-ableist words like “soundness check” to “sanity check”, etc.) +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others’ private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +This Code of Conduct applies within all project spaces managed by Swift.org, including (but not limited to) source code repositories, bug trackers, web sites, documentation, and online forums. It also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a member of the [Swift Core Team](https://swift.org/community/#community-structure) or by flagging the behavior for moderation (e.g., in the Forums), whether you are the target of that behavior or not. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident. The site of the disputed behavior is usually not an acceptable place to discuss moderation decisions, and moderators may move or remove any such discussion. + +Project maintainers are held to a higher standard, and project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership. +If you disagree with a moderation action, you can appeal to the Core Team (or individual Core Team members) privately. + +This policy is adapted from the Contributor Code of Conduct [version 1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct/). diff --git a/Carthage/Checkouts/swift-collections/CONTRIBUTING.md b/Carthage/Checkouts/swift-collections/CONTRIBUTING.md new file mode 100644 index 00000000..b4612da5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/CONTRIBUTING.md @@ -0,0 +1,11 @@ +By submitting a pull request, you represent that you have the right to license +your contribution to Apple and the community, and agree by submitting the patch +that your contributions are licensed under the [Swift +license](https://swift.org/LICENSE.txt). + +--- + +Before submitting the pull request, please make sure you have tested your +changes and that they follow the Swift project [guidelines for contributing +code](https://swift.org/contributing/#contributing-code). + diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Library.json b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Library.json new file mode 100644 index 00000000..a6d29916 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Library.json @@ -0,0 +1,62 @@ +{ + "kind": "group", + "title": "All results", + "directory": "Results", + "contents": [ + { + "kind": "chart", + "title": "Deque - random access lookups", + "tasks": [ + "Deque subscript get, random offsets (discontiguous)", + "Array subscript get, random offsets", + "std::deque at, random offsets", + ] + }, + { + "kind": "chart", + "title": "Deque - prepending individual integers", + "tasks": [ + "Deque prepend, reserving capacity", + "Array prepend, reserving capacity", + "std::deque push_front", + ] + }, + { + "kind": "chart", + "title": "OrderedSet lookups", + "tasks": [ + "OrderedSet successful contains", + "Set successful contains", + "std::unordered_set successful find", + "Array successful contains" + ] + }, + { + "kind": "chart", + "title": "OrderedSet insertions", + "tasks": [ + "OrderedSet append, reserving capacity", + "Set insert, reserving capacity", + "std::unordered_set insert, reserving capacity", + ] + }, + { + "kind": "chart", + "title": "OrderedDictionary lookups", + "tasks": [ + "OrderedDictionary subscript, successful lookups", + "Dictionary subscript, successful lookups", + "std::unordered_map successful find", + ] + }, + { + "kind": "chart", + "title": "OrderedDictionary insertions", + "tasks": [ + "OrderedDictionary subscript, append, reserving capacity", + "Dictionary subscript, insert, reserving capacity", + "std::unordered_map insert, reserving capacity", + ] + }, + ] +} diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/README.md b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/README.md new file mode 100644 index 00000000..9b8358ac --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/README.md @@ -0,0 +1,17 @@ +# Benchmark data from the swift.org announcement + +This directory contains the benchmark configuration that we used to collect benchmarking data and render the charts in the [Swift Collections announcement on swift.org][announcement]. + +* [`generate-results.sh`](./generate-results.sh): A script that you can use to run the benchmark on your own machine, and to reproduce the charts. +* [`Library.json`](./Library.json): The benchmark library definition collecting the chart definitions used in the blog post. +* [`Theme.json`](./Theme.json): The chart theme to set up colors, line widths, font sizes etc. (Slightly adapted.) +* [`Results.md`](./Results.md): The generated results summary. +* [`Results/`](./Results/): The generated subdirectory containing the PNG files for the charts. +* [`results.json`](./results.json): The result data we collected. + +Note: If you'd like to try reproducing our results (it's easy!), note that the script is configured to collect 20 rounds of data on up to 16 million items, and this will likely take a very long time. Feel free to reduce the maximum size, or just plan to allow the measurement run overnight. + +For more information on how to use the Swift Collections benchmarking tool, please see [Swift Collections Benchmark][swift-collections-benchmark]. + +[announcement]: https://swift.org/blog/swift-collections +[swift-collections-benchmark]: https://github.com/apple/swift-collections-benchmark diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results.md b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results.md new file mode 100644 index 00000000..2d6d9ac4 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results.md @@ -0,0 +1,32 @@ +# Benchmark results + +Click to expand individual items below. +
+ All results +
    +
    + 01: Deque - random access lookups + +
    +
    + 02: Deque - prepending individual integers + +
    +
    + 03: OrderedSet lookups + +
    +
    + 04: OrderedSet insertions + +
    +
    + 05: OrderedDictionary lookups + +
    +
    + 06: OrderedDictionary insertions + +
    +
+
diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/01 Deque - random access lookups.png b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/01 Deque - random access lookups.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7ed54c9f33216302cf685870151dacdcb30855 GIT binary patch literal 350275 zcmeFa2UwHY);1hb#5N+LA|gal!3s)1kP<{uW+W6vK)Ol^9TBNXhzz5EQd9&CEhrmU%w4?q2=c>w}hc)7A_(`xW5yA@!-MlRSK3Fhy4@}9feWJ^2s>dV`)Y<`I=-V|SYf;SP@MDK0tmBXE&LLvJ&_g+t2<#~e8D;`*g|&kieKa1l=fTmxa|3k z0w1)f2xPzbM?_+1T+lTUxkQhB@Ax440z#EtKl6n=$lZ;Il;oG3B|P94o;_cW8wiz( z$o(mJ{i#PQAc;*Mf8>YUqY0@e2Om1we=kZ+Da2Ru*sG^&xbC-hO1!EQDk3(<<$l`z zOZI){X2||G!w|b6{MB`Ho7D}r;;V(ye4gaGR}0*=d0^i1YJSpwu6S^8o9@sv&DAFR ze~2&`I^9BdZJGUX>s=VK7V$h-@qFZiTem)jL^eh7Kh=?o5Z;;I9j5|we2}mC*x4|i z&+FCRN!#6w$ioTH)P|^iKU~$3(^5{134T^~RQmj&$d|5+>3y$$`Sg>_=6%iaHYU30 zPwlb0qO44}r)J<~H?EIw5X%@*(_^LjpK0rv?GlpUj(4BIH zQs)aTFKkL{*jFEBm`$bLPM>}L#0Omc>AEg0%rN1~acN1f2LWp|S8n_u*Dk&GCZE51 z!1Mb_oCmiq+&_7#>hkW~FyiIAFTzGPxYqY z8p!Tld^I;$-CH*#S-4I^;@;2vNm~vJY)x91B@m|}{(h}jAn(H_CBE*L?$>t23&gxs zxVByua{cHU%bP+I5}_KKehJ*aY3sYd(B13bY`h-u=pJ+n-x&>e{eurztlf3&;+m*a zhmsDa?Z^o9(gpbMlski5)_6uwg-ulZOji-;F>tAT!d~sjK z>W-U^XFZ?z=_~4AZ`W>@mfxmx2G+XK9(qGbS*ZC8H901Ulr-APee3c$|FhU<|EV=I zVz+-jR`vc$*)eCty0bS;Zl+hYUuIo3Jw`oRd^GS8`_kd)@WNMqSF7{V-#d>(ZvOwZ~RTT-kj^{EFb?$ZJtYf84&uadUQXMa`&<9(O7=Vmd^7y%)ECn)@arNR3C@vQr}BPX zrT=a}|HHzEXB$KttQ)ixGGdc=n1!VlUCg%3)}fVlAM*UU^p>(VCdV(tFKp&KGjl{% zVa<-{9U41!hV9$I+)*b#ZXfD+K_NlGT7FWVWG~TLmUiOTTW!zV*S+m`h;pKJDkm$P zJafJ|P2-}BC%>m4bEoIM+fPm2zAtb#-Adb(9drCi_ETC)!mk!t7P**HX1ZE$j|@Be z$za5JYk0?b`QeW@Y6s=!o2HsjOIrlU4y7wf(d2XFZDg}jJafC>ZodE}oH+|W`7U%rp-E;Ew zH|I!qTnw*v*f3jTuhQHS+{l+PZL6KC3+nT_Ts@k%6?qnK?e6TcEDWTnj%j-J&}PPt zu`F3vxvRM<8*K!lPv1WsdAf2B`B+03FlO~_2Z`*}eTfqLP@75K-ZMzCoZt7-d$0&{SB z{7V$~*sR>F|3oA=ZrWp3Y!<)j5&r}qYqhF%*R$s)0w%e934BijvIC$$mj!MU@Z?Ya zx%%frfvD33r#7D+IVBMkdwbofxKmoMdaJkH^1NmJYEQM|FO(}{&tHt4W&QXIvZg;c z|Nf^p({D=ONS`k{|1Pb?UP)Qf&w8pFw+;3h)?_Xv^{nUd24wbw1&< zriVHK%IoZde=NOVZ!v9g1$*D>Jmzg3|4-|~w>fRQdpGxRfklbm$NUGa51=BCMchR^ zV`3l5$kMEuOv{|s7VP!-iG3me>7cei%&j9mmGLF2NKUS;u5E`c-Dq#_=fjGJt&HFk z7Vo`vwmNQocSq$A#%SF9mgPRv4nnslv$KP8&^Ib3BR<11qay2L&Wow?Np>OSP^Vos z&4QZeTIV3i~ZAuJINV>S#Di+&s>;Af<3-Hx%4&f-r#tH@l9F zKOyU}_tJ(r_c_)Bmb`L9ROPrZJ(3>LgDrZSpU1fQGQd;kn!%N}iI-D>q>cR05qmHD zzK&CF>B<{6ib(j+8Pw_(M`%h6!y8n)XY*eZdrZ@_qg?cRUKQQ;Td=F~PHlZT{)S zdg^H+e)tMAzVrj?S z;^pEigwO-CI;`f#V!OT(LV^!>JYh=Z3!#i~nth#KUSV|uJNEK<(4(NJ2ziMP)#E%%iy5Y31iyRUnRZWg=pbnm$}kY|~hj!iQO z*ms@0?8~c<&M&UG6}^=}PC)Px*Fxm{awHOMNwIb-C+o8I7mW|giv zdgRi5#`anv{tCG!&Dkn#IUzkGt(x4*L&6Nf7Tb;fk#A*t6?s>s`qvBE+F@JRYO=zN z^=?g?WezGZuAkbHi#qc_QbmU&TqN04FTh~*gmZG@z6ttxL;J0HI}1fOt{crp(w_xI zN>-SOH+$nV!e=V1xQt%(81ej^1hBrc~I~)>GCMwvJbhlFl#VlzV{jbd03Y zJsMviYGlcY={;J=TyleE*{B*Wm_&XQQgTULsM5<=s$aTTF4;SqNX*>;6T(Z_Nmh8@ z3-KA=CCmst_;INXFDneFVjVZFy;#|DzJl)moGw;MdAllc)^Erje~d_=VBJ!D2hH4w z@;%aKb1lFuf&_4-Y|Q)~VaBDX((=(Uk?}X0@j2l$)IHS*5@F9-l1>Gd8xB-J1Y9zz zf}8Otswad@GsIv*Sk4WpepDhZ#D^JylpKfJvEWr2ODu#-?kkwt&rcazxH(=d&KS)L z%Q2v2XrG%exyg5PV29JSx$t77Bpj$Nz7mZZnh@sb+DO9DyA7}{3bI7aGUt2gJ%kq5 z-iCH#H6wAMd2dC7V($dZ1X}7U5D#U>POAS!;KFnIV;`kc)Mw&F%o7|c=B?b2lK$h- z2wufdRE%k2T6l1T`5R61`8$XjH5Hr*{hjU-Kc;c9qA=mGk7@6~F~k&_E;C1a=>+5;g=A#i>1$1WXd(Oa-ykcQ+&}UXLL^6|I=S6_n{fEp`T%if%BA|~A zz$?fCsY&<)&yaq_j_x0bP+DrI^?FU3+tUieV|Ov(AqOE!0vCRYQQeFiV)Xv@5SgoS zLxxu3cCoa`BW#+Tl-ZsZXWNB0z;xUxb#k8ch;n6N_l$GoIr1C%2tjgONXekNRR8mX z&7-b_6TvsWm2u9 zGd))|KxCs_voF@=(ZUm`$~DR7`t|KfMsrmGwQtUBrU(>A!=+DZH=x5uhzKiz(-NThxmLj#087=Mu$w_rNXoc*@9BfF7V;! z{Zb^}30eRhSK0Hdo{yywH+!QwTe}LLru`#!EqK3A)z%|^-({%0_F2>)@5eSj6CBz6 zuJS*BJ$2s7F4wgc`0$i1d>1K>^CK3d86z(8Bk-(SAgWotw=3ukV9Bx)7fR;yVq;Z> z8G`@}a{`;3f033HW|+}|nOjVLLDV#^#+72ejJ@LF>Vdum0u_5cSP1}i1*-!=Mh(pX zA$=J$_L39ASEviS&z!&o_Y}dH9m#w@Q#1Blotgv-Vle*2J_D=yw?x|!5+wwZpO+KqkMWI)~@48Vj_mxBuIF z3m_zmQ!|SH@#{Z~S>S^25^&A9ycwf7LyDt^(Ga8Q(O!&%UFvo0c;)~-3m5Hic zb$YYrYy)sr#dAG~nq)(%T-ORXN(Lavku}1;yxxN-d!!eA6k>F`gKF%+ZxizMxLcU3} zmz9F35eA-`DXeHSLTXv+#r)~oG&j%TkW4qj?gomw6+eWH@?k!#np}+wW>+c-yT6XY z#inM=7mK?yhY>Y~(sDv>CHvYA-(+jMHEWjn+)GzSei<7e;JWx{=XgLiP$d9EUbf+a zv0mCz{XHE*?#+!bW-10Aoe%077e8~8?UHxIOx>tWnvRsSN~?`tWPu83nWrn zG|QeTm#R}UM&2I^X6GPk;)-EpI^if-n+RFTv9#pq^DisrIRu>DipmUKiuRt0;)c%_ z&3Ixcq6USP&Nn_fF@wO6@rGJ8b?VW;)kfkudXNXXJg1fIbG z!c2E7glBp(wfr2JLH5502$gWmrGR(ZMRy^v+?;JCD*)bKz%t|HW=*v9qYx#vH=48U zVDFZnQPW#@3k7R#gaT0!e}JLbnVa34!T#)>hE#@Jkjdu>u!BQM2dP@hz0vGtgLM_U z5iGF9aUs*)M-4<+Vi&b)4uLDw1(qK5bXs1%NOGL=I4^u*0sWlGe(E{1lOIAFcF1nM zWOe+FX4#mzo%>1x{Zz_a8C1eX@+?2=torDoXq1J7{O^I-eF z8Sm%o0XOM;*zB{FzXIN*iOx_S5lZZ8XwOX$TI#Lsrbk-fD}5iDw-tlEALcHBaxs8= z8#rFzBCaoBiEh!QRjY*%mhY(%lb%IYiW-<>RwZxv_k1*_Z5q-!t^Xd~zt`J{ucHlLcFh3`a78|ZQn8lq07MMMp@MxzAreLGcIA<;_; zPJxOmbNOEEoyO*(vXJn$UT!AikX z7Tjtn*Vbc<`Vhr0!$#@j0VX1N-03qBgJ!V2BZ z-;EL}^xsw}Xxi@6ja0+tG78KXFFwJXpf_x7hSX=dKYJa5qiexpE=saboOFl{Ek4{$ zP2(n=i9n)rf=(zVdMUuU7%8>}gLRNA>*za3N3CzM6u~pUaO`ZN*}b!K4pxHb@H*-< z?k?h}Pogo`0?GEXY;!rwO&TuGH{)UOE|F^J&PL=EMO(%R`iZT_1skI>xBywe*RqaV z)=lplW0u8AaZOj>$8jgv+g^98vA@XU{sHDJYV zcTK?{{MK%|q_+aB3X?BH6#`zYswj*L@tMfSz3981bl2Zm1vYOc(Ochyw zKudIk_|F$0dZcT!rn$citS4;?zKf3rMpsQ`BsBG1a!Y>)|D0!8iLX1F68{DFvs`C^ zBiyRun1SHLOEEd-XmTP4^Iql+)d#b&RPak#INP_7QrO|pwyHE@ zI1vp#rf6VANW&kbt@&FXKTcbx0wqGIDKpz_w0p7a+6qZkE3`PHz4bY zg^O}yiKiD}uA6P_fSO~YJC-6{=cXDd$+e2<_jr%dKLF<%zn;yVE-=f!L$rr(Q8aRZ zPF*ywXmY?sqxVxli5UD)?84XVM>*~<%fjb-2rNyOKfT*>#lJw0J|;_P6s&M?FEQMUsuV0YoK_7@7Rob zR~b!Hs=pA#&vG*Pf=`O_dAlJ;UVy#y|B{{Wh(OfD!{)pj0g+EvK2rZa9{%%b;DX@~ z$xFSl`fYszp)AO=>3xtTjv@aJxMntiy9?T~mmGgB+%TXYfP};TYa!p~?(kIrf}HMB zTk5^u*QGSc2l&XlR(z1}b9X^-cdovd;CCUK_geym?2my!zRTU0)qN2tzpU08pW zx-a6sm%aO9#$jlsru9l4>_qOF^5cnK^%pRJPKg?6 zt8g5#gcrX4jbu6gw^v2UGk{dN(avaxnKj`U1uD_wZH0md$*CCTG&>Mox~iLtsr<^q z$T;#2J39YHw9LyEn2iL%=ZQU}m3ZcaC@rvG^Xt^*jIuG#>jabw6MJ5ClBwE&qp_t0c9QGZ zd*YrO=<#vad z3=%@}GYg0&vMcyT4=qFBQl;gqq5)so!}!=H)7t06%PJPNorAAn5m@55e7Di;7W5WT19_>hn7AZzn2M>)@kqj#>PfCOwnd%6V(i{OLSPqiFm_=sPy_!tB>(j zL+j9c<%FOm;Bb8OU0m>?VpyDt8*I-#z6cj^eDv$d!ya(*(C~_8(uM#+F^p;M)(1}H zB?!H@S;0-x@h=_f1SdY*_x)PA3cTN(`20i*IPn>~FS-1W_g=ppN~HYfuV)6H^Jy5m zR9aR4ZbcLR-$Sp9tTz7ub*FYGK`uiZ#+N#)4?TNXbx+8!x;Det85HhF0BJrmmCC{lsu^zhc$euNqH_RC0zUe2@{$cJ zTr3mB?z2dA>aoxRspyoXP=)MR;=uj%h=0mh>AKop9k+gqg-W@N`Rd#m!!{!;>po>x z&!|>JrK`J~ADw+RkgoOoJ#4^%eYgYJhtW?5xjrf5g9c^@l>wN}Q`dpNy;8~ejn~jq z%YPj&szd(EGsKImConQzm5 zjVwn?h}p5`Pyrq|Rvt8kT~bMpv_78r(|um9Hsiz?9Ar%KGOx}Vqr0<>UIV7X5$cjp zqOeoyeb(dM!-hB+oCTJn&b8&RKeXT=h5a`2_q@7qj;|$Y0PiANrv1CG2;7b{B_d|Vk8nK6k~|vOAdhq6fR^s(x8vmZhCZNA`IW6 ziS8H2b&r9$V!R_17DcJ$Z1q=t$XiusWw4LqK?fGP;xN(m6#d#mmsYr)4@l|Ss^ih!Xm81hQ z0k=-Fzc>^t%ivA8NmMPnxoUN+YjJ-y()>e71%1GJySifHf(%l)fRrp4hBt3@f3^)y zvjqI(3&A^gf6G~<177NHIg7|CjFSECiM#`ai4tr!=K8f-7+_mH55R)}uiBrFHEf!{ zqetk-m=5))*9{+}1xk!s6joZ*!dTaS&ySOzq3_e81f8J=8Vz#cvCkQydsF5QH&c^< z!lF}hA9Q7-?Rsp88JvQMqOMUul-m48l%hM(@E4I?nPTqVe-pHxhfa9$!;#4_5j)A8 z3^|$pcu0Vbkdiwi-P%CP2CxFNSg&!}+M>*ymDBXTzV7RL*6eM)x`}%3;OkYUyJ;?( zpD%9yp$77Upj6Tg*I8koqqhVsLsQyB&L4}`KAN=Z(H;BtprVjnpHBuhGFY z`=H=coS0M3jF-(hz6Q(m3c6TFN#GO};qFzEppdqAhD4x^r}^{1@9z zC7x<+;h%0Z5!_zU0NZWP1Wkv!6pG-0UW4yuJ8gOBVlOzU1z(jV{h^gzuI zy*Ir7{Pp_kX}3*|*LL%7ByGGr`&}55lS#h-%4FZe!tcYfbu6%Kyzj-b?E@KGhaYGC zun3CzGhq3@U}V}t*3-!M%6i(r8*oW$ZC(EB`xe{r{Ry$3WC9A$=(`bwYeBM^_I{`D zlb@Keke@j7z48;!0bcgfDHE|jF{%HY_0um0rquDhxJ~_2Kp!_ZbT6Tv{MRD|jDXb2 ztnZduxf$qVw0`I6#fYrGWT_VyXj$g>qGca0WVHVB{P-fU_rIp_&pca_A26lN@0Jz1 z?ApJ*GAz6HMYQ?kvTOhL%CPL(7Xc~(%dY*~wzTZp7XvEGsQufvw2aypgMrJa{oA&* zjM^6q(=Vg;MQrJN2V}w@+G~n6%1$VX;ey>1LZ&$#h?=~prLTs*YMc4V@^pUuNiu$Y zK()u)^$C|Q1?0Mc8mH`0T(DvyhzVYYR;B>$lP4BC`1B7Y97urtjvMo=W<#ZvD;!y@^BHE`Gok%L%1| zA84t9FhfKP$1ncSb&0EMuUZqoRo`vo@GW6Jm@o+O+Z8l2UgoObKmVD|y&qEI21ZY;zr!u?Z5CwaN7?eN?qa(B_VU;=5K7c>227 zWK7xcP}7@6Y0K?p{%or1vnWwa4;E;EtJ3`tCBMDG?i^5lTRW#wQ+4u^RR05{t)%}b z2ovwoIjc_Ey2M&hRkk)w@o8UsS$4hccm&_gMpc5r_8x*;y=E_IXL3X(%D`^j4?5Gq z3r%9OhwP!U97fYGieWEi^CIlJ+3Hi*r25kj;aERV-ZyB@Hfe+Q7Db@@NWqD25)IDn zHiikgnSprrY$>89>A~nY3ANM}RUe6fDQ}O9jVZizS{+1!u0#{Bgz8zIipKm2NvLcU$W^I`6;*YDLhZv@9L0+0knLMGqZy7VoMC)<@v;FQP+A=53_<`@}%s4MkD6NMk1k?rZ5&Up?)2&v#k(J*6`F9z zyrJ@=a|L@SJ-E3WDvV*4uPgXI1eaYs9^FiGy`Mnjj7`1gjU~bJLDpM=I-yP>n>y2W z#3Ykw$<`>Gxse;olEHUg{q2Sd@a)$mF!;d5ZYSypjD~4_!AceHy3sO~+LPynufXWj z;N;9YiU4P7?F|Zh@^z|N5_i0ylUTsgXdBUEr?LHwv8CD5s^c&R=nX?KkZF`g@m46j zny&(TTj4B`6B@h03RgsYF&>yg#(&I{_+*YP?U){$>M9q!V-`DxK3@l`q^Mjga$}er z#=j(1zZS!dS3p1I(DAMcaB3YO{&r1z`VVCiI_kZfNj`Be*%eq>SRe9Q$BgKYp;+@9 zcrGPAWc#ct0tGGj3};Oaka!lhlAZ3YU|iScu4X zIE>l~R*~Ebmc|!9wAdOx=PATJFU%t00r{G1}k;euo)PxY5$Ll24D zA3oNe9GZL>hUj^j&UVxF?<0omV_PnSs--s}Dcqz6bZyT4oV)1K8&5b^fnsD?(FzqN zec+=YaWYDZkgJP^PtILZ7pBFDq3!x%`Ivj0*m|@l_VbC}>>CxVGQo^?B=OK4Jw+g7 zG9TGH8;=8}%AqzDcFI;{sQ*n+mD89GPrHuq+xj{+E?5xn8Zb`i)Dyy|(*m1}?{h|6 zZJ^%G#(@eB&;r5wp{H|}tw(Buh#OZ>)K!$uCQgX%?sC7<0H>A-#$LyIg)(>PO{JQJ z5jWz=+$3>D_CyVx?Yb9!cW`ow8447^p)-s6lU#(A)kXYDdf+Tzr#GRuy+S?{{6e=a zO?4Wdn=kjTD3x}`!vnFhC-O0^aBhBDr5-{0>3|G=V?50a#_D3j?Q40%wc9<6v9(DX zEc#);9P=wJyf0b~AHGBXdUtC6C3v8+5UfXlGdB#rVdxe0NwG~4;d$S$1U>C*#^vez z9%-I_UtIMVrni&ppQ^a&{WhQZvr_%WdN!sH1TmlrdTAj7g~>%$x`TS6ePIZ04mZ}C zOJOQ%p)l;Oc~DtB5p%e$Pc1LHYn&}0M`Mza>cODUyQ@tRl>SE3*_dHwsEJ5u(d_j% z8=8$UFHdK9T&oz>38P14PRd;K=~GF=dajFCPH?F6uYZc0dxZ`3p6xhmH<5)=^><0Z zz=y|PfvWFUj^tbXI9!CNSt)2M3HL`z^%s-Cp%6tau0w=Eo!6C`VjIa8c?Y`6o<9wI z|F*LKw-@a)NqrY-hmu+t&~(tWO)Zy?0#=xEwoSLCB?c@*V0`mHQR<5A&RTh*_rd&l z>IL`r?z$53Tvf0&Aa_ zTnYj2_X)c^B7+7ZWcawufBO1cRWxas5Hj{K{a#0$Y2OQl=l%<|M8nFSBvo0&fp$c( z$u85+qYzv)yUQA2(zX!LD#FFK+gRKsJXj>lu6r~vUkju-w|LvEHr|uizPF$4T3X_g=pc_!VeN9tjReE!ieZ(9q z88lO(0N)RW(gq#?PXN72UWPS&=31dWrDEkUCTVVLMj6lqm~3-_H-$^Z1q-_U_8gMJ zd0jh&=yQ=xA6#pmg7v323V|Xob!q><8~C2D15X`q31xkzRNf1jzBMYB%oZ^A9|6sA zD*boEN_M!Wm)-ykm*@)yo%xyPR8$G zgcsYM%_W@rN5J`){*q=0Hr%Gjz7m5EM_2PvC9i4NoQ>B6?Spd|(0@nN%PN8?10asU91o}6nf(y!lerd&N zs#=4KgaJlzGJ?6xFa3V_T7X7E`pW^0pya-GjlnWE960x4p3-IhArI{cgDKwxa7t3f ztiB*3IXAvJO5@5)<7^vA%feWkj@goTIe6B@H==W7a%@MBCI3b`^OmL7MQux?@8)w ze}#w&-?mA~Jn09WzrGZF%dss7$G5=eK5M0SPbj zp5LZv{w>!&wlVtHAGH9!eY^k5zGV4$%Ob1)^6{3%bZPl`%eV2|vYTIa^Z!nG2lV?{ zK9s)5ge@cZMQmvq!7l=4mh+7k*$w}%&Nr&MKf({$bm?k<7T`=JdfyS%TExCJtqo{j8= z>!Id`2C0~%r+y<;K^8SPsT*CJ`=H*KgD9$3nH*{(_q-*v&GDWQZuw5W#gkzLlbq+% zO`v@5VYmts<42snVHW+RYZRV#5nF25O_*sj4Fwt2x=+h%Qwz6y*CON3pa3xVI5f@LnrL)P<=&mWQ_V73yM0~5#188P|kN~bhgRZJ2R3Vo69&Jh-sZB zMCQ)$;9XMmi3PU3GA6zQ{)Vl`1`Ra*F)RWY7}dL?)C^kgRB=|v%iQE{Q=(ucg^)gd z_z_Wf-qqiTy9?ZXG=PYnRxQPaDD?vRbA0ozXOBQul*~}sutI>^S~T|}Xn`Fhhw^Kz zu)LuIjs*1P$98c?+1zuy;cc0(sdvS2!Q41awCg@$cZQ?g^YcgGkzj5nOg7+OLa+5} z>y)af-5{|iH`P8efLrU|mT8V7#^e$U#LKAB2=1&o5e@ZP|K&s_oJ$tKtA4Hof3Gdo$ieZ%sW^|;YItsiw z1=|K%rb7)Jav2UsY7-cusqZXRjPVZiz?MRF+M5)Q6m@cVA$N)v=*S+nRC_yH*h3*m zA2LyobosLJH}*TV&>zS%)(BgwRn7*g;qsd5j{k|9)bVDFH$kBivZp6Rw@vV1S;zcZ zknJ|p4F#AMPpCX?ZbJlf7dVxXU5iX5j$>L|2t4AfKmB+=Aeyaun>5W!qKC)18sjr_ z!$t!h{%BCq8ps9-WRrjTRZmczo9k;97LgzJecMX&nAo@;wc6CLW%)qV@H;3~QG z?*$g3@n(3yBjWFI6#&iHakQ~k>8C2V{e#faKi3t@L6(EZ zi#gxrwD(2g7t6upZ`;yx@OTl0S>_18tuV{M7$=`OWz|My=MM$#m>yVu-S$oG)y3ckio zN=2b@C7|zE(4L72Q0+D{4iu&RD4=H}HQ#q8ELojzU|3ro>-C!2mw>1tjW=qdM|`CE zvzih4Iz?Wfgzw20L3%1^3G$nibD{PY-I?xp*_tOQG=nM|# zQqOT3!{I`D&o&y2rfmOqARUi>t~PK$g>is8m645ZxlAvchi~xr9*@hta=*L|&GOp- zZ629?-HhP5O!^U#;(BTiIOC#vUHO^t$eh5^5d(jxh0dL4+9dE&QKeyeE^iC!Qh$2t zs**-5BWVbT>+x(RyI_gWtx1^L?7-4-1Ao*k-5Wlzs)6TUG5wIgp?uO0J5;zamgLi* zr{c$hsM|3$QLKP6fF+h9aCC(zTHsFIR)jd$wlGma$W- zd}cN`<1Hp}UgGTv_@QE(8;9_3k9Xxe!rh;o^KD&Op2=c2`mB~py%M9hvf*S~svnMA zDx_#LRJqZ#5br%8`e^nxIcG){4H5x*MeKH5mKWO9x)94SQ@k=Y3Dm z5?yZ|(#h?FG=@Cc>A~@V1BZY>;|U4r#1qcB)fLzy?v6yC+he=I>M9YYe$({_8c4d1D z^ld7}vJTzw0R2^XefVMYMwGZsMM_-mm#({Xi(*bJTiKqB9^##49Ju@CqrtZQY(K2s zJH1ny;8@5#hyI<%b~YiqMnMAdGtNOP zwfR0zeC|h2{rD`oW1mX7hz-a3HQ{?MSG1Km!l^DuuXz;CGDVeTJCzd)rV3e}4R16R zDC|g89i1EFT#5q9zybYH`=}<=(R4xE z24Y4GB*1IIFOPFzetc&FV7Z`Xgp;&^s^@`(Ou6v6>K%GkPdNG6aFMfi#XoyS&G6Jw z(rvR@`2|HC$Y^B3;10NL;TewV^Qf+J_I+Ty8>VC&RaX{2as&opj&6YKMIg$>i%3@} zmC;ItNY!ddR7B5s{%2499t^96H5)PgP)CI3;U|7kqIS6NOayf*Ose--qTCjIJvtE- zE+?uTF0L+h<9$N0Ly@_46K_kW4?Bt%$iS;7;knju+n;{7D&h@zQ29nVtF~ri&e&^q zP7k^nC0^hPpY%_jet3p6abW#JRJnRSXJ@DK8+7w=tHI1|Btp)lf}^;6_NUSr#OTox zG(6cx7ZfW0P2?Mg^2dP4mEWVIauc!iQX**ri2S7|8`o()jfO8ghjDZ2{N%HP1Ex{# zQ^@A8_T|Df=~Pb3hBxP{%^SgO+s<&Nu=E&uMI{hl7dExtG&FUrCUvZBp1zN(E*M1f ze9wk<$|WxNDi^lNlyVvkjzXg5w9pMHcUc^?jTB{@T4KG{^%2Ctfx8S`6Sa2_j?DLl zlD^0NtA3w9R|`8gbdg&+txBs!)YQ`u92|4=u2$WEWZKT6^GjYEu94s%kB(&9d4otIeNt zxr==2U&1zf59##(Q43&k4g4ooyllLSPu;&Hg~dPqKRxqRdC}oL&pt4`>joCX|UeUKc1K5q;1b)@B*k9T!%#lPhnlz`JF zd=JaDx%sQdG*1^aQbTA6wIN?3o)T2(@*BhE@)q8f69|IZGxgFvfL9a7KPMKHPtI|V zqOp?-ho7?_ePwG*Fxvp9=BZjuRLHd+IH2v-fqdtwZ;WYh(;+ve7TI?XwEcRan2~-Y zmNhM(-tHp6#Icn>Cjmat8IGzo@ER*6mU!xu!1WPW=qH$NQZJo)SI;D=S0$H?v>Z+H z4NIMEk7V!A>$*ccfImN)l)neY8KSIjFhWmnSU1gsrR8DqME}T_(Z1ZBH^k-Xj1BP7 z!`xZ}qk()9(nowtjA0k*!pAohHeZXY2;PgMT7m0IC=NsTj^zXP5?tn?1kcY2Y$APZ zGUntYqneHLbpV$mV(b7r-r{e zKE)Ljd3|%e)ZGNmE7i~{hNZf>1wjH7HiH7RVNz|$o3?NB`7DkLj;K5U>qSirRBizj zQ3P8q60c6f)f#LYy+c$p1DSTYpfYIT{VtxMPe$nRkvl~Dfa`*IuW8lJMnKSpe}kYM zC+sm0oER{}%}ghu{GrkOoSiwuf&~_=WYVyLJ7+mrNU?b~cuNKMGWyG029GBvF{!Zs z=qQm32A&^|oWKpea8tEy&Y3}!ZXC(b<7B6!IPKeXQ0Ul;Bgg;7&eD?Lla>PFH&mIC z%}An8L%0Q7w0Pr4sUC+GGGayGq1g8O=tTRtv5#N5xC9axmh0JCR%_rtQjZEtb$(5K zNKEr=ZCnubJYLp}@e#KF1DlvsJBNXDbyk}V(L7qg^>wi6to$)CJ(Dn^CH|vlYhNEj zYpx3?e`RI;=O1=V?+hnqEj*?Yc+AnymXjUMZS&<&#cv4N18XBWqb>-> z5BjrCY~CQx5UsL*Z&3iIDd|i^YCzI^8`U!s^K+I%A+U_l6AnqJjyZo(V$~=4u`doM zMeRpOpdR#i(<})HTJW;sZ+|q6CZ0C7m7JU6-~v{>-*@t|%c}7B*_NW?dY?4bYzoeF zYtoGG1r<;Iv{!Eka9x9z2YGg7yM-CIBXPm`#d74M6A#H-eQZF<;zL@XI;?79NJ-f_ zZwpo5;#IDF4edm9vr!7XNb7O}e^y|pua{bn(u&a}_fs>3U6;k%Z<(+{lUHR0o~^g1 z|9sO^U&O8p7B2j3;|}RxvHuevNb>(W1TTvZ_M{c6>WeIu|HRAwvrk>R4Y;XBeJ{c9 z!h9_s30qV=%SXZ%Q_WW20P6&iOPi~>;KYYS)@H^YkS%=|g?r?SIxHvD)3J^50vx+B z$kd!21OnCRL;A{|MJ?<^V7W(bk}KdiN+yXr2R#FV{PYDRFPVsd?*oclxmiQqq4w9rQLJ#E2?U zWd7_x7kl!mbL-PmpC)#mt4ul~*84U(tk|=fHz)@4{8$+XuX0NS#alnAH-yT}dS`Wy z5HLJYOqtksFT{r%f*`9q(%*uj(Ie6@!mU}?<}uk>MRcW`v007Qc$4OA2Pj=C@xDH^ zG|p?O-ARChyQ83tP zqrwgfmskXZv4Rf%_pLB4m{JPreZM?|o0%oe2ZFlC`bub|cxluFTa9@8EFpaprnDkr~6BnWR zxmpCdkHWRHk(^`p$niRZJzAPI(H~fdn#SXx%Swi(`MXBYNIL~okSO14U^R~d#)9&a z^W>JX<|x2;1ie6tyAh65tc7-w7Ivq4rBo1w@8=0E>csxUwiircw{%isw4bR-F_7or z?ASqw&q=Cu<^2;MVi4Cj0^@JS)EPQ;Fm6wf+1v~$An#j_Aamy^&6=tgp1RKSXics! z2?Aiy5%ZvEuOJJ&n&=Y+#jJUwa@FNR^zsw=m6(!2N&@JlLG+LlB4Tt?;G@Q%b~q8M z0orhY1_g7yuW`YXE%lnS6QDZ_zOTNW6w$3BiVOAzA2K(05h9i;2{Yauf-x~IzK&A; zuVtGxd&?ucczj|@tO1u_^S8G-ChlSufM5Qwjhz{g4=-o?X>I`In7MG(u?!zOR-CE? zz_`7*^h)XjDpFF0W;?=iM;W`?jO0tC7X?SSAxBs$MKGp2mR^_hW-6icDjg|75TZ!$B?+RBQU!SskQy6AYNXc?6cD9FrI!!^L+Bwu2qA?0$7h~* zzWL@G=6z>I*Z=+ha;>;b4ml_1+-L7=Uwhxz+4tJNcjLF;tMKHr9IH^>-X1fP!p(<< z1BEPK103nyjnC3zrY%Rdun@{Qx?E<>csYQzZ3V@R^R4n9d)ty19fEY+m_y*9kG%^_ z;-VpJ6dz93&5Jm{wGti`RETb~w2d~+ zw3vc;mqUIPKiWC0j4o;vFUNm}1uNSA^b+b|08%Y{h?Q&c<{F;zZUyj*wn}^MbjFCa zgt<2tT*6$GN|lT6T(!fne7( z=f(V#oxV|np@ORvcq9vp@khuez)A^lXNB*VUoz6J4PDSbIUxWn%fz^MAMg$BO`7A$ zA00*`y8+`xCJb!|^GN(RCQtqu5Pss{L8-`qT-PXeOAGYYs9WS3 zTqDxgjNO>#S)u0uOtSBoR7+<-viZ})=s`DU7vkOHl&|M{Ap%I`wsVvrNOpF9A`%xq zr0cd^C-Q#y(IyQN+kol0fWwtS)Y{V!A`r1mkf9I zB8WQgb^k+Q_22J4opU$rdYAtgD!gyB9%HFd%sA=kagD{N6|!K9?%cYx^*O0?Yt2^{ zoY=Wl46Z4`uN18)FkVJ`TiLZtTF$Orp*C(^%mdK{1zcw*Z&P!IIt<}`r7H@PSj?-m zm=Gcg@I(9-0Q-ane zg+s15yToGp&MF2i2iGwl5sM<-T&qsJ6Y3*b&Mb-xORs~C!Z3wt`B>3vs#9ej#9?*b z5T?E`mY!rgx;ETp*usA_J-QnIG$w>u4B*7V%~?8i@A0i};KLTthy>80Y5-un3(UaP z(`YO+;N-+qapw!t6n%Hm!zOevAZl)u<|T_dX2*mKTe)3$e~XXp(21ok;J^;muHwdy z=`riy_|tW8ebj?CvXM+*UpFU1J0K`e{|4l!l6gZ~3EV)Ay5nW7Icxu=>SP@l(c}HXMP@85-X>fuxt`OorMCAnDDYS$m@e?5HJn;IE%0z9+#= zw-*2NA6TME0Iq3ai_jCb9&jI)v^2SMt~4+od10uhidgh=LC{@EPqn~#rfsp^(0e(Z zevXc+f0dR$f`GyEK#L@phh&fD5hkq_;QK(7nq83(1-3i(p*4E|9#cCk4hjdnzA;>Z zN6FHz1>Y!LZs!DWR%C7YaL`^(FW1?i@a;(Ozv=vuB>-*()+iL`^p9_F;TeNI_b2-f zDyyC2kq06%{8DYbCa|ExEWoAG(Vf$!nmhpQ+yp!T1&$^GK=U*7!cKL!?7?xzMf%suA{Dy4m4noOauti2SAuUkOf3Lbc)JoX{}nM&R#&y43t{{ zTu-S62n4EZx}FYal@Wi#pWZWa!7jZgDu}bF@^0X#>n5nEqY{Aq?9vZb0?eT9EHE}9etcXqPKviYoDBW%W;lktGP9B?mIz3dE6AwaqtAVac~2$hDA)a zAr90))xRkYXQ0#Ts8W4Zc8_mKm{+6P$D)86)IgC17NBI9ot$_sJ*gK;aXUE??_P+F zxcb8r%gDt&uaT8mwbmwgRJzN@baph^5>lZ!{19*-tvxAScz<9$lR&ML6Dw-zbxt@G zz-AiOkmo3Y5a4p>B2Ipf-W%+5C5)Nx+$F|6E~KjuFutK~ZFR>Je=vK^FjqI~dX6EC zQ5m7h>w8K5kE`r(%+A+a38~cC?Cnb*t^`f?j->^k;~8*3TS+EAIGejj zW$W#^-knv5tP~>JlKedS_c~PDM*?6Q%{7`jB>RS1@Q1^T7i>h>QHV948SgTI1yS%F z@gO=8AS<9i>ys1x?r}Br62lgmlFsy_pC;kkuPd9)H5R|cD zX)ntir|UklU#*Hbpa=YKR$9Tq=h-|>HiRQea0XG0HHERH>$rv`4=rk zy|W@8XvH{Si=j*x3DhP0o8j%h%Wj|A0}l;;EY7;}_eAmE@sj^D8+1GLeSKP0frCHh zaDVp$kspC)e6vQ|(|<50_;b*l+<<4tAbI}B{<}f^_b%?&&~Iz=;=XFCeR$^8p(egV$E6DfZI&M&~(9##Gc`S}Gn{|s;;lw4>=CzdwmRo%m-r1ahr6FhkfBca8@E_Xk>1Ec|^-icUcBH1&@ZPx$WMomtfN zO;C|%=3gXeace+pg^Fo%uL)=6=qal7lH`Yd5Z*dyYqkPaIyYh`lqV<8=c|80iS>aDHv4eHb00jgqS1JSFK7WX1wDSofG-Ir4 z!*C^@LnY0`*83U=;^7)Zg88N_i|q;%xR4WRXIObh-Bk|cicqLlpr`=-8fGV5N$IFE zWdv>GbQsVyVoD86@Ky^!(WH<5rBg)7EWKQM?wKV;3OljoJ?PT=wf_6=Nz{v$TiXr&^4l=sc4|FNYMb@9G*d=cGDSx zjvPj66QPNaVLBJW`;X=ew0X*5&@5BED7L2{{w3+AIxJ=iTeWfej&QFPVrnQSLIzPb z^8&hop>_o0@jyq8c}&kuSwK<=be))CQh#S4qMFxK=jmK`1hH>Ej7?V2fuZOPLZE?; z2NK^q9?;c=0ISzYge)gzsrH1lJ44^E&s)WOP~|Bs0~$2AOc`jTi+?I2VFd?VW5LDA zERm^ug;Z$S#RTk)bvDj@oc1u6lM~;7na6&+b2}vmPrP~0DhgCXIJ|)p-uTUv6Z6HL zM>K2nB;Lp@eXs%+OiuvTdkt0R^$q3MW~)2qvtpG8@4r)Zj#8?@ItSEVE4s_)hTiW6 zYNEVf@a#aXRj#uPA_Nrk&tKII7x-SZJ=2lnn*|hQm5(w0U)h23$0?M~vFg`Q}X|C2=fUTt!#9}Z%DK|#Sd8i=yvwaP~(RX6leop($i<)d~ zEb~!ip#RaiZ0ic!6a<{Uva_)Wt)F1|arg3X$9UtI7>kqU6UxtVz@749EMJ@Ce^UF* zPh2~8u+X0u{TzY);Sk{H9Pr&gseLA#lapnT%N6#o+Qa|I44Rtua;HnW5E7sPKD_9K5m{B|h#3*xu+r~m69 z-t{skz#}fQT+zN{@h=3&UyOdcX!48EZ$m4&#eOmR?O5sm#~Hm-z*k`Liov(69k!X` zhw5(ACF|6ND`=Ctk6c{Y-j|D)!a=7%Y0HW_r*R{B6?ZekdvuY8iu$s zyn{poUbdB=BXv!^@3D(D@kSI^c~S9EX;cynZU0TJ1KQX#Nywd}*wWPAEH^A%Cl09P zr1*LSd#R&!IQqUHp@Qp(1!Anwtuh5$&>9AT_M6)lPnNrvjtL?t7FKhP`Pg=RWQruP zEbu28VQjl{m5fr(*zflj%geSdjm835tB0c z=sp+}AC6(z0au4Zb$XSryvea{>BrKFNM&Z>o|O2<;EH%|{PGt=?A- zZCWuKy@PUO25=svju5M{&J9{BtfVEzChUdL2!?BTImF9!G?icWkJA*jK%~@M()xT7 zC;_Qm12Vwub*rwJCjQ7Cz+ym_Rk!K3@E0CEQ;6`F?@Q0I{$(FNgnXZ8?0Uc5FdsSH zI8*%ntYWcuPyc~fY$Y(zOSKoEa=MvcN?RlDt!C^ zz2SWcget*WQ7?@R6w({RsPMo-YGCEZ;SA9PMbE7zD!Q5v6E#wyy0$P3Oiz}( z*Zq0>HwfiJFjLI?a_LX>&XD!hL(@2S#?p-Jr}{u-F=AniW8pkt05|4}p<$Vn5y(s6 zyKOyoZJ5N#KMZ0n{f}F#7Rc}z0Np}vtUB^%dJ}p^X8V?F`$5z4Q=YRLQLpY^9#selt9>6*a-tcck)B4nKLNv4jOEVtd#*CBQ}bjk zu4B=q>mDd9qSrIlMtY=|J~YrX3!_*~uFS66lRzKnVS!`TBu5l(7FO(CUd9z0Rezfi z*Pma>wB>L$;zwLKJeM`*0m2smV=W2x?pY%NT}W&pJVp5v<-1(6dyX!Y_rX3r62Ypn zX%xmICBOF}Q8JmA8mV}zb0@>Q3Il#$K1C?(j-6MWOeB&67PZ8&1vOjXe@Tpk|Hz*k?u&`R|JX$+AaeW? z$C-%jsKvj)&;CIP;aBwi|7rC7RZrU{5&gd|+4>h8_*a6p9SZ(Ruzn?2+tycpLHu_0 z%D7A#ewKc7b(j~#bw_-Hot6XZorYk93Q&o$-iZ|D27kx4&( z{kH&m-f$1+Q|3pG#-QVX z9c^7+OD4q)9@Q&kDr>mC7Akz-@d!cO^WzPQ&5He@wMjOQ*qa`3!o`{B??R&qJ0)Ty&!Cb<#-mq5 zjfD+&W|vB%KZk|5g@{jl+-PZu3v7vT_Hy5PUhIFmU*0&&pgLPRg0$Y2fFz#B_>#1^ zbnRb*G8rA>7x)ZXH~U5B4*d8Vt#%z4O<_iuk=G~o92vRJPK>5=sbjaAIgfYOdr7JQ zk6zrsR8*csPCm9@;JrBLC^iwBx3;%6H$9hJTfa<9o@>_~EVAXcKdUPG`05OB_=L4c z{L^A4X`Td`3GIWzPZEB@h~Ga2ppaN&pufoB$mX8#_rWmlJ*xu^UeL`&zGzgIyueDd zWMOg-vQ6C4LoPMWwdLsK#VV?Hi&~*tW^>@tCU5d!E>avcwCjN30JdebwDoiq)Lz;R ziM8fIF5}TmE|Hk^psnCV1}Z0^#s>O)qxqah$&9w-&%o3s7C$pAONzcQ zS*uT&;7Qeif)&Q*QR0n43g*Q35+HnoDdNfw7IWpsk58`-@S~)>)DDt0d~dl&)RE#^ z<0wO1I?#L-4cH=sC#{`Ol)Q+a^*u}9=!{w2^cINlo+fEk=9)L< zc8TN2cWU6Zjk}1oE zoqasGxr_h@xOM1yPIQvT^x!AJ9G^(W_DDU(fAsKzZoRYvvea?KCS8!0)~r!DuowhM1p_W1XCP|)M1=>r*Y`P^b}bRwU--;!>RR%&|- z^{%6qxP!})3F}uu3ZWqO_3$!v9(nljiQ>MHAg6N^bmxXKuuencpb}b=oqN;FcjH5C zlz5{saV3tb(;%y6FZw~^ea7do;~J3iw%n=tq`i9LIf-0tq}+=YM}=N3&R)m56WRV_71twVX`Oo&#m+ZC>2USa#a8POX|< zn{W~)S8jH;(5TvmO2~|%UXa=TG_7ErO&b`oWnKH|Yi|!XYBCR^ASW~9%8s3g?rtl8 zs&>F^x3)zoVbXc!QF`)BExtrknO-d#A0h{rp%Y&6bkK%2X|kGK`+xlH@;VUtIn(8^ z?xnj;U8j7M*KXFEiDCGry=Rv!0Gshw5cqPDSrh8zH?-hH@aP-%$qO|Y^2jj2_a?b*RqTw8Eyr%kFDwx3q!)@)kfM4xs9?TX{=1x z^U(1R>3sT2`O4XdLLkI+ghJfs{OzQ>vG#@xL_276Jqlue@!f`X0&||hvqD3pAZ}M} zsR#e~E1E`r=ls3>0+GVvZ`5?#$4^dpb}bOz&P0nAffWKr^duUuWoh_5k6rhmK^5q4 zqZzbYpfKx}`U17W<~H$%&aaQ^FMZtj)-oe0k<&qJrrOW3?8Ta$x+qb$UA{5x! zpe0+y^VVh;n+VJH7n0wP|AQI9|K3gh>81N9?2aEZynpr(D_fQIGZnw}m-rOcC7n>B z1|C>E{o{=HloWnyvdS$Oq$)^GSndW^?-2W1y}Z)ZimZ!dDIDUPCUp;5FGxu=D%E?s zGqqdhI$(V^hse3h0lq=%6C+*r_6=$ii+&C2PiNZ-KD*b%8i{7R*G`}3flTs}^TnM@ zvOpUMH=d|WOe#iFgJ3$EhE_6>w6(Z~+-xVO6dB3nE@1J)6}MNg7jnj|GAT4&Twb(* z8!*G&*EY;oTJ7FbNndI#@$9MkLrb8Y`GtH@i6XL^(ccBf^pBS1n$IDX1P}`pm89z1 zl=KmFBN}BnLg`*FLY7?*ehI6pW)WN^CHGT-lv9p=^2&9BMj<|h4K-9 z(i}k?Z#%V;Eg~=PfWpQU7!{g~lmx=jleWSi*K!0+ys?)kL-U|prm!$nMxPa^@X%Z~ z+1A9hGU0y-Qo?gVBWSL$T;P|6*0O+o+AdLtZi$|s2BEDJBjCipQ=bf#z&-^%LQ;#A z@b2p9;&uDA?`ngnc14P!{YaeyQ*Cw_Qldd^?02_^brao_D=$F**IP9lF=g?7P#t!- z(no^`4J$+sgXHlXxlAn@ARBqZoH1%8_Ak?Pd-9^m4MylTxJEH*jmjXnDCVTaK_Q{0 z(2`)$^QS=gT4_b_1fX?rBijyfP(&8`inkiUo@G@JvDY6JV!ag+DNM&@-G%#JsU&)P z=9wJ+7|P0}m7!VCtxwQ?@QHyEg1={G6~S#KCNDFLE6ixFYmM3w(%+C3XiO`*UzRsp zXqjm?8ciSJE5*^DWiHUY)bBWMsUq*s`Y!^4fq7D1ppylUm`?|gMuv1?F7t}{ct+AZ z=1Uj?5^K(4_oeHk~qv9nVD^(YDYfj%eBxZhN<4Qx$)`=+6~7%h2EQO z)eWkZ67!=`gmPYDqRwXhly*>^Az;B;t&O}qnukzFH8;1SAFI+WM*@ z@L+lMMUvGV#2=*80mws!N9nULOXl_9c6!}4K+-Vb|I&&NF;)isQ}*J~MeG~n2nE}P zgVCr)a@>@{F_=0}w`9_LG-E z19xl9VC6JGndFt~i#t7O6B_r2rVL)Vv3duPDs2=otEw@nCf+?q3FXV-nqyy#&>W?C z6x~MA!1wK;Vf6V7Krb>lqv*+ukRPh27TTdvg+~4TOSXl+6q*&xYZY{>aI!W` zcf`&`9j(F91vv@mv|K(x73KYDS3&4jFI9w$ueet#?2{2u!tpAW9c?}~@WC)M%-B+5 z2WxdrlPR&?HxAppv>Rwb;KP*gyt-p+R#C@Lqd%{2Z)$lt!6RMVL4XNij7VwP!8X@L zK~GD(Rdpo6Xs>!~w`*KqE;$+q!pX$psI;@$X3&UuQMJdc{EM;UtzlYJyPPqXS0$PWF-Ag}w? z9L64Nm}3yhnifllF_!kG=#O(J2AGMxEhi+GoAmRTSaXRm(!(X(3L}I?OTP3B-;Mbx zeBJ9VKq-`1`XqLby0eCtux*8FQI=*R9<%Ofl%v;T8NrD<@vkmMP7?M%HOg_OKhhiR zo0nO$;32s$7I9%P3*M(h-Nkd_d6VVyHq9D^vOh+L&#J{WyWAFXg{bDlu50_2DQobP z?d_lDnC#ezqS|!JDXz4M8}l+FMjUfi7H?&m14q9Iln%fBM2&EoR{cZ`eu5F-0$2l z%rtG`YP$n@Z|>BXOnHz`>%~J>h>4xX$h(oWEs1b5I+q(Ny>a1VG>Qnxs7=%s@-`M$ zQxH6hkTsG;`hrQNrs_u}%_8t}@P!$0h!_RG>BguA$W`u?Va{Qpf1BF=BU1KtgRPw~ zZ!h>crgcIaH?^0%u=>iP+k|iCxZP=!DV}f_6LeN?*?pEsVVN^^E)X|oHqHj;$Z;sR z5ff7*v8B7RGIP87Lg-3QXiNS?@GKsxJaL&qm;^r!ZN=GB?lNd4`AIQeVomzK901Ik0p+PEm&&tqLd|{8 z;KR>qJWFs%LPC@EkTD;P!@6tNEjH@|u=b(QHHAdIQAZpYqqKk8l$=(8$w5B!t2r|C zO~K)Zc3D@u{4C~N*ULq|6{Ge-!qnw<)z;jws_Xlw2R&d>ci=hpHv-O#@0628BaL5K;+bszw5e=LIAVzH-09+)o)^{kmMwBG1 zm#mA%;q`^HWwuUj8MT9>6V*3IyklxCx;h)q)G{PO9MGuIWL6q3X(4+Ic6wrtlI|yG zu!C8atbl9-vXTj>N_h(XCArRJGFS(yqNV{~%<*z+`bZ04jKnria+opRx>I|nadx73 zKNW=hs}bWA(a=pqr*76q(ArlL{wR5PmRJUcf?I4>s;2ZyDa5)TTGsY@a}g&cFx#tF z%Lg&R_jp|yB#n)AvHcJ0AyZP6WBPSpBj8kcI=NXC@ z!9)9dtr52`v;)}C_XyIHWkk6q@36aN;G>yx`gE_97&zH@xCts1Cqv+yM$PY9D^x4} zR7IRYYRu|uO<q6zN!$S{6;%yzHNU zRhFO+dZM$>vboPRecA7oh@3b@>G%Buo(z3lKQLEySUvLd+sraSUa>bgRxOH6X?1Lf z(WW68{3;4>HPu?58ExMBvd>#2=4oN$`d0|Dx_%%U-8$W=KTBL_74{v8GK=VYkoTx! zGj}2Yu9)Io7%VI(oVY$dUrBh*w?s-;R`MUuiI!a9CCogD04K4s=h4AO!{=~Pre7%{ z!~(1kQ#*SqJz`5XB8yd2L~d)g4Xzk>7!{$)oO2CxSNIZtNa{x>*I)a2U)R4S7ZAea z4DOrk*yuilV}bdWY$o{i@Bd^iMGgOTb6)_k6|BX{hKFXWGIeVdVd^o(w6zx$JQph2N1Eu}}*!5U=+CJp&1Sf9=# zb`tTo+!B!L;dLO`t4z(1FmdN&joH~!=3g<(mrHE|!b8t2lBV?P5jyGz6OrZO4Eqwz zv8iTC$%{t_1vBBC;mi!($+g6V%=j9g&HVY=C^Mac(4J(^MX`%c$ldXa6}!{9cCexv zn@W}`eMdW@2immAm{;Rj@|ujnHoOq|G6gF_`$UdzoqDiQ>qc)2)hiA53l{MWS5Wk& z<9JL4Ado50VR9RJbKMXKlp9~ajh&vrrd2138XnD(Peac62kWS3c3BD_B^ou~Ckj7} z88nZN=Ry)aDEcE^E_-k9q+H&N)7zp3tfUvfSE=T-gi~cP=bXWtrYi|)E4c zEie`d&n*&O@Mbsj7!Yc0YN{6|?aO^mr^NZwpef6n_LZg;z_S_x2^9=`_@Yl~z2FtX z^RUxLjTV|IHt~7%hnb}w*3w-3^>In(z9_5e%=LYgCv+&}XUX?vtEZG(7`NuiU>&60 zGWO1F8T8HH7mys;G70W5=o%u^^m-_kkQWLmUN#!-H*q4ZDW<>S-nnU}&b7Kr8LY$- zC+zEPpUqJVlcT7CHT-?28ZE9h5Lz7(2`rIzSAeM*yBSYGnMgYerwCfYlw{8! z)zup{MyrkP>B6Wou$j^6^Hfn9j^oSwlX59>JtIoBJ3}d$b4VQSaNM zQN0Q}^>0I~RPgqONApRt2aH5NnBRTp>^o~VyaX)+*&;;d#+1_x`AZ^XwqIDz9FE&k~Td@(RTdn25nK(-i@^iT#SB-bF zV@r+m?@C{NMJu}9`1|sM*`r+pv5H?uhddNbB8ST2`s}5-2Eq%_o;f7cNXW_N)-AuH z*uzq5ZDV!Cc!BVYCvA;x!I==3E+2lWyCXjEV|uh4PLUx6xqNZ7zlmH?Pf+5fHtyKzrZ}^mtS9Z+#a~4JA2;ZTZ3B zVdTgsZ4V?5wV6A1YKBQ^NIu|FugYRw)2Tc8g&_~?pP3J_Yw&v_rTIle6M6!8GR0hH zcA-59*`Tj!v=I~1Kp$!uSA-j?TIB>)*maLAMdBuXsO823#Tv^Nuj~2Ctyz~fzQDYA z^ib-|WrmToiDPX^ro#+%8SQD5b=Mqm5zmuDco6*0rb1L*ThcwAJ3=E`JW4;= zyLWWGTXzm~+;eKMC1zD5^SQWAP0aIi3HxxuzJ9lWSq#63{63&AZOjL>n2~I>^cVL@ z-c!MoMCIeDZi_H`1#=ipW!?-0AM%ynO4MSCc|PhM=qWd`%D<7BSnBcWu$%<^4b*5< zk(cZoT6$gmAQ?jIT&+Fr?0w;gglOz~HKq81_98 zc=M7i<3nof`Ii%B8g{u&kU*r(tq!Sg4o6>mo{EFMzP$ZF>)TNFzN=R+qWNS?>=Z^kQQ%nySq7^) z+SQT9I-xO!29_8amf;GQg5o;n;?hdO8;(AeH!zX;Vq^!5l)?ft2;pWT2E5sPPrXYWa~$Q&#$IhQ7Q(J)EWT>kzgoTd ziLh3sZf&1od&FR&&#V+`-SQl2q8N6(bwnyybSPz6$&%wF6*mx=btO*2Yzfm~j-=S< zJ-#n`#n&rg5$=Az4}5xZanTZJ)HCSIiaMU!m(YCX7%SU`%$e($5-6<4t0v+YTsBa{ z+C&La1mtd;2+)RIV%5>iWCeW2;MQ53h)Z%k5G}ixyJMR3F%UDM`MoYYU=PQ51<^+# zTK>;Q!%sW^Wva*!f}Ajv##=7Ptc?P^mGC?UCVDlgD)YI-f~K+uW%^YybK>S6Z5xe4 zm}D;yuV};u7`ZG=9-GD72DBlGe406)l>8qy0a-%;$mejA3yvk&NC_*S*I*tPORKY! z8)*ujc|Cmh#>_3pJz*>h=Ff6}8V&#{lXx*|du`UH>l z52ky1sXeWqUV7Rm8n2in!q#M^K>DXaZ_f9P16{gxy?ijCKgUjz+)h*s-L&q}6rY!gct%TFCP zoQE9R$B*)_a8fETkW(cmMH2efml)V?L#7c+1L#`ohnugnaeuy0114 zdx|?~j>5XlW+}9y{ibWq@PezMzN+EmTXs1g-B!-$xS!NaW_=*r_F&TUF2=a>ll|2N zDGxk37a(^J$hpl@@`uU{dZbVS__D0oo{;wvt(e2HpIw?0^BP2oquS)t^b&H{PNtam z=T9X%hP{A|jjlSUw;O$@XGezLgv`{=gs8jqK$5Sv)f4p0ItY{GCn+-!&stBFEch~? zDJet=BXkvINKAZ%SOWsG$_T^5z?C|Gi(0P#eCNo^X?T_B?cSMF{k;{0lUY2w(KI-ARt+i>+5<4d5{?bd2i#QBE> z&!fy7xv={%lC8J%AG(~XBuPg>9xl%A`qmL;-YBW-_E7VPZ@7xpyfJm*qi)&ShKA0b zuW31$YN7PQAA9@@`B;65E8Mun~cL={q@CMlPydzA7}NoSyL}Iwj>ab%uQhk6QY@-8Q>M{D<$#Ewwat0Qnt`o1;eSu|_n{0s>{87C<3j2DB-Rk<7-Y5q!%(C*1H6v)D z7`AwwF7J?ttG$TlzH_ZuGJ78V4CBFb`yJFM!5*IQ&BJ&T3hS>N=t!5?aZoJM@Gk3J zd(Pt*Sy8I2>o>;jbnz6?#~42CwTH}iu%nyoOx|S)x=zVDSZ&EW$dOE#5`2CU#;4_o$cjKHTWpFEp8%baMtVDrVOmQ9`b5o z7VbFvp=1LOUDaHDt}e0_w6Q1$&mAO%EMreBoq??w7s|)(ExrF#mlZglpY`&Y8#cJLEHW=|OqPD}&wdY=KGE-k!$R{I31 z0*0u8_OFF6@8M!NQ0$`LPLAJEJ}^0tweXX3){Jrxv!R|cLk)S{@!!#~(?7C)QjOm~ zLVZ9|`%djQp)gamH1u*Q|vc#7+4?fccN6VgbMfrKH~TqAnN>p1 z&@xu5jZqJ>-0uY`jpD^2enzAG^GAtc!Oc9imy8c8KLa1x{g`F<<~5#MTi3FqiO0U1 zaoW{qQq>RCvOgSU)PIY(BuSs}{+R6eO(m4stQjEh$hUy3GeP%uGw)8;m7Vc8k)-L0 zS61iN0o_IgphA=I3U|C<{F7G>P9BjzJSX^u2q7)7ZbsTi5><&&4>Z_ zSkg0cQY(3AGVv;NoH`o1o_+XU$Z|uJkAuw$R+Ce-EzzMu9JlIWuR~KCs~$spXj}Ev zf59xoUY8XW_&PUAws%h&%k&S-m`Xa7-9cz84_1lL@a29J&OJ`?d&DNa`;P5W_X|W_ zTjl8xAQr*I8qf=4MuQo{MJ2-f&}jL}EoASMs*yhm9+VXDn|NkDnwUykbXq9gPhxCR&W^WNaK<24esu}yqc}5=+wL$VF!IPerqp8 z9LTHW;%}EpPZwM@aPvB(BPt|~4>?rY=5X$E(L2~F#L$q>!)4+7`bZujYr)>H>M3ou zpGCt8U83mC5~)K@ioczKXvZD@67MR#?>G8swsosxEdobMv@xFGU5`e-a1su)LQ7^k zw8ZI??_SqFzXyHfHOV$SqFY^Yi+E&mdEaj;*#UtFk_9$IQ$$a#T$NiZ7?0ApW;QIz8Mz7W3V{BJB{Pt~}KXfl| z>4DaKg;2TH=#?(`PWajLmnY9pd=h$cDWL!5=C`@=_8$GaY+hGbyX^d|viNpCZjv=} z`rPQSND=p5VUEl*-y05WVl`-i~AxLy#Kv%IOKcE6m%iaTV zAg3WN&JTz-3LSfzQq^N6@XjdDb=ZZ|?ZM(?HT7%H!dg|F`2K1<>B?cf>qdy0qpaZN zB)X>f;Y4(ZSA5VXxx3e!AVcWd&9}8q4yKWXe#k4sA3r6t?1mm=wagIYx5|9lZpq{5 z2IF_T&ppO@p#}vJ*YnGIuoT2b&RdxjOSInmO;8_I{0wI-B$g62DfV@shsd^pWf(7X zV$FoDKk=p?)~Ad^c_YPyoLAMd0?9&Wc-1OHK(F2joFc8~dGGrw!M4`jocZwlR{>9j z3qG5k`3hcpb9OpHeK`dsT_W2)@9fi*QvV`x%DT3Lzoqod*V#%O`V(p14&hQ)%idnAqNlm;%rZQ74So z^upB9oG&sP(9x?YsD0~owi)AwvT^B@vs~saUz|mrAHLTm;LW2Ts8u6xRNu#W)W|6$7DNMmWCF_r5(|!4`!+=SuE<82co0AzOc-ilewkoNlOg{+i=%tNrZ| zV=K35d8`)NOijvf$b&bSB$n?H<)^%wWUe@kM7)Q+ zE4=uHRF`<1|6SOa2CvvBzW3uV_&Ie_N|x3SfaHE_eZ^{&U2~XHPd835z&NSyx_kw$ z;Q0)Gq-{Jj3jXeT$XGwQmF^#LM_?EC#2$gp9*2rxYh2x)X%&?yqlLS-JP4mdv-Tcy zr+ih1@00C4(3!iQ(BTqoFL&u)P$2r-nnKv${hDf z5Ih)?!ZXP8dL-3--|Y*d)s=5>B~D`rJ~{U*9J#1=PXjGEO)R{+E{DjbP9AKl6nZuF z?B(b9+*_k-xt0zIcWz9`v{m+9(ZASk=Uo7Xi>MF-)MZ3MY zOLs}!fJ~Q^aKpZ8S)n4T$r1d3a+2o@6tWzWy{FRX;BR#9NkJFOrjn#R)@xJmf}+MX z-a{;+cDjoxH|lf0KRUg_30Z8Ce6l*O;r4Lln8-yH?N4D@?2A4{Ya_cK!FLk47kjF{ zMCVE!c)_$N;VYbtyAgUE5&Zfx^pt2J>DBuhZ2@Jx{>a-6zw`977Gu4;Xo9ay4i_tx zv9gA3ozg1qFK<4rSozf4NY@n6v&^reAipv+H+^Si=(hK;xBT8o8cw9{hzVumq`I|d zUtb`LJb&0zWqa>+Aw<@|o!ZEz@l&GJFWQX6e> zU@cTQ>te(%?R~Ra<4I|GvM(J4;={5AN}E+xV{Ar>FGgb})|Pf(hBc2euhvSJaUZ?E zysre|`D)h&=~bS5V$A6gH;)N*Z$$%iH_N+-Qrw*vBB`Xkop&BH(I0eF1g9w9d>Z$+ z92n>#_$g4O^nOPrI8x<;Xw*avUO7jeQ0ZyuT);I(W7#sQCtfK_0z7L#GV&pgbU-^v z>Fa_p=}MVAERKfC`ruD)TikjpX>pB~Ki0N15m4^weUG)ApEkU{t4BBvs#?_cDCq;K z-oTG?{z;{gWCfWusLxP$Lz6Y@Q6YK4HVI|O@h&Il!$O|K!iqf1qTG}sEd)vhD{n>m zb02R(J!&IM-WzEKKPLHxT&uwIHEKMM{D@ln@Ck^dKkN0CON<+GcCR??`eW}2xw^f( zSsfRl%0!E4lEfiIU&n=&kvqhtZ2IvMVbkZJK^I#VlLxCJS~rtKumrC5BMn+mv9{sM zE=GN%LA1)t1$VW_57tkI2|jD;HlRe4y>bAj3*-w_o=mxx zQp?K5m8XLGN#l(L9)Y?Ky4>H^FF1^=ai%`Uq&H8UrEm(?Vtq9`E1-d6i?4Dphpa}7 z`(CT2vXdS@xPKS%1jkC@Uh239=PodizSyt-K*w0@RljWayOA<*)jnSKt${NtRu_HfiSkG?%x&I=)4@N z?@wpFcUSri=g_(m|W&;(9>}4^e zT}oe^?N7Fpqk&W4Fc^dw`F27@geTnIx5cJIf}gF07N3KZ&6Uy%8+-T!xlGGWom5s3 zFclIjkaZ)zx<7XZvdi;ktmX9+MIEN>{9>nN*$(?^&jj+nl@#RH4RyH?c;UTr+v_Fe zjZ+Oy>VfLNKc0jev(Ir(ww!vXl3=!%*(Kwh(Gx17?R~7{@>qq}5DySf3!^Ts^eONq z{Px`syyPMiXv?c>V#`)E_)0U6{OBSWPf@V?7D|)6GY+>*a8ydO_L@+kwC3-9;ASf_ z2{RpY5@4`84#G9rm~BCW%vI_D2h?OQSnHBgo@>B{)yy7J3Q8rxd&T z_*=YQVj|a4@aK;$)L5BbZQru(J+To}_AU1vikz9btZiD>@18srVCxQZy?a30qv&`jXEr^xMWO_00c=wy$t%YyF}{ixw@=VnIrA0)+y_tw{0W z?xnap1b1soaf(!+xVr>*D-HpIyIT?<;c@SK??3q6nVd}KOfpGMzWwdB*IIiA8!9)x zh6WU$ZG}6AGZ>p;_qu*#0Ft;KmWCLPd;{t6x||s(e9szqPOL2;-)u%(+GgIKQ^HF< zo|i`)?V&{JJnc~DFyQTx8Gq44S-8S}FQ0Lx6XMFR7X9cR>NyaL3n`7ez`$_8?$=!E zKD^F(ZcI$uh}|r00&H?N5GDoX%Q%tv@f#)|I$mDS9Ui#11_pIW67W>~KCZyOcY?>} z(UUHc8->3buN7*D9t&qOshxDNSa?uc5H*x*qs=OaMb&cA-bOza$TTdY!Yq)@Ow!pS z>Gn5(yKYpCPg+8Be{?6FiBsf;qvikUq^p?TBmU|hPPqC!`x)s>tG=Y>liGp`=0Pq) z-|r@)AU4+Z#In)xZi4ZWV==b84+VW6E78Gb48}3%_2P3z8DVoo`eauru$lZ?ge5T-)A_TP(9hN3Kwq40sET&#L?r6lzfYW}e4N1@%Kmu>u>7jSUmcA#R3*@Uq z|J3>G8*z~DTiiRP#zs~fi_R`f;_hGzTAt0wMvDUNL@J&85MKVaPpFb$f8T263mZ_d zz6AFLr9s2@TkN^}byI0cSf|kaX&QIDx?>;~%G8N8}qz^f|lz2vKj$b(Z)zEa{h5c}~JG z&qgkEMIP%eUJ72V0&(1or#ie&1RY`HUEXE#9Fq;lMY6N9olDoXTAid-ANqsQ(qe9B z53faKd=K3qYEKOIfNCj&{yEmfny*VST$CHOsVOA{Rci_I7|a_AV6xkcC$F-f#F60e z5s4~u1U^CU_=OQjVtH9B>mMwIf5J9SQ(ZD4qtGQKd?t6Jq*huX!^bn;sZ6RPRk`k} zRbawAixEyjQpdryAh?~s+=(!mrube)@E1rTWVtxq^de5$!acZJ81Iyz5-IEKsBI2< zBq4mmlb7gA$W3NbLtOK?`+sa6PDBon%v@@9H6_Lzl5{~;zpqYcX%UP{e|G)0%YL@! z!s(p+O(7DYjzMk6XRrp8;U(c4r*gCLLK#SrY{nZB`Ezo}HQE(5bo(|~ZgYHd3A6Tc zrT4jRdmhAjmh`&*7*VLv64^I)A)$EvKTWS;NFsFT=_dhX!vdmi6)$ zpQ3+O>FIpu`S;1HZIabD1HbzM#kTHpD)@~je%>0(f`x&)CX*-vt+G8oH{^kz1!$>5 z;5E-=MO_B#61xut*>Yy^v<%v5Ohsj(Qx27%(K5uW*KMR?J6i;xH=*vCTc21vy?VGT zHF3E(=Q>HSZ)u`9edu+XFI}9-bZhXJ(6QdTNj?Kd@H$vOzV&JAYb&f9y^*(r_X?h0dUXGNJ;=FLUWE@vqWRyYuZn|vpJ_xhQ9o}?;H zv6^vu)WB``4}a9(#PJ*Af&z1$)1h3ve`p=~e82dy=;?p?NuZ*+!r6%$!WohMsT~;T z0q0@9$a&zq3ztr9ap-CTF8rlhG*7N;Nh}x)c0M)U-@xga-m&)~M_JW0)N~XKL%Hqz zzo@rxZaOH)Ns!N9J|vv!phAvJq}yE*ss98QM**xggGo%j4s1@W6AK;g%%32I;PqZc z@XK}JPiWA^7z$jsw=x?R3%nK+OZu-sv$GCHYV*;&SVYK{9pYQKkb05&yxUS@y_ndc z9za*Re3w`Z5*_lHM$&7Y9T%(bQ8P-?fTC*}rED%riclSmpnq+d^#W@-`@FuYq{9#m z3&^%xDwih-!Jj^V7N&0Cddv_p_+foV#zOpUgs=>XP>(vyL3h(hE76v9EyzZD&}qZA zoGOa%#Ks zy=h3gU+efpZ8jWvYAlMaij6mLJCPp~;99cd47%IUM@F795Pdf4af_+Nhj6VsTJ6b) zxco*o+nGfY3W;N#l9*kRi@u3rj%d{ANM+#7xa<2;x;Ie3nuuvVGf8ycYM?PDGfA-h z8PAygmLx#ANd{fUqtWi>@o>2<|(SPlw*Yz$ZSS;~V^3Ql?CW7j} z-0GJ2)qIZn-&$qdAFB6uQRG-~vRl>PL#r0FwmKn%7|uofK&`j9dzqO!xg=BkhNeSh zLZVS9OFr#&SzOwi;Y$zcHk~id#%J6K1UWy`ti%aDmxVhXS>Qb|FnS#`0-@HW;3|pf zQk}(gd;OgCR>AO+|M|R9Z?!3ypm5#G)Cm)>?g7#g@PX}+bNIEZ zTLl?|Ksgn8 zA9~p4khIWR{I*=tT~y!M9H=j!PZ_wDh|s)4Tq>N_&~G4`);&anBy?GMS8-z}`Ok`P zAeX+>AH(r?SE?;n0k`FMjqgAejAMrw#yG=NmuG$JM=AKB4S|`%(=l#TlxkSCEgXt* ztt-2`m~-N}3@w6}m-w*Y$xX-ys1HHd9s2BKUaTrSNkINLHgWu+pTK1W!WTCr$qg(S zwL8H2chVxKgiz&CwrkqP-K!1xS0<};!1xz(t8HciA4gdxb>&)%$vHXsLFKIQ@_ilY3NV)?I1=lX|;-MwX35=z(_E%cJF=;-Y0*U)vHQLb6QK7a&ztLRTT`640qgWHRI%=X%Q4DhF6^V) zg&!Y;)DU;8#{WQPvP!J11y8l;a+zvmlGe7M{SV&`U`95-qI6!CX{$kASiMta{W8!i zmmZn-XH$&GNeGQKda#84UAuFkTiVBr0qvczkD8Ss6@ap$r146N5ytUdSBY=3dzGcT z(QW$byLnC&cHJNm1%|w!EJ+~@-Cs+?%exE%-mIc9+giZS--avk`BZtE(rRyF-_B1I z@6ARUltp~=*la$_9a%lC5am>GM>5=HTxQM8E9iZlu=$x|sy=#sn74LydV}cP!EP|nfUoNV zYdiVbGOabEWO8eHytnV_h7u zp_2&@FQu~63#7xb>=-%XmFahAaw`t6EXGS$2a->#)YEHR{}wQ>NO*m9;+O(@f-dOx zoZo_+?hE6YCbEP5`PyhO{7%CAtkm}ij8ZACUAkX*P~C<%b(Ssy(vdZU4?A^jQ!nBI zwRs9T#oPXfv}xpqYUH(lY;^6NzA+3Y2WCXe2pxH8wD^3t;LP8!St<-DfmMeN7LCD@ zb(x<1>=DXv@nUKm(R|P&>$iZlVzL$eSKNK4LtuZzi3&QE`OJA+u&EH$S3`czy>S+ zk3iKc*ptRjOA3r<9~sYfCs(Byh&K(@AxhX?xkA}Lof2S{%P~fH*Oc8FMLHy=dmS|?tXj*ZJQ z;)mJQb<}Oy$=b&wBONONGO9c? z;Ac8e^hCOXX(wmGPO9WCer)SUmC-ss06mqt)#kc-O)4M~PtGJ$f1m=Mtv#j_siBD%IYo7k7$8-%Mv87Y`jR4Hwe}H?SnNIhxLZ1Q zTJhm3ZR9d2c6m5(Og@OGWAIxKz?wAmBT9`dl^d2{ZeJ1#_;Mc#~ zfcKX{GX3Hb=Svr=`%Z$2VShVe5zj0MX!%p`2e`XVUNt@!Bf=Cjw}<}WheaFzef*nQ z_kZNM!!)T&FHsM*oPR2W4z$oIp2h8#?$K@2AmGx;B`o_ifoTE(;FlEc2DslN0wlG; zO+lf#9Zd%;$$*PJm}&F$=|I86aQ*q5-503arYAOV367pau`lTeOaRjL!|yl#BvQ3j z#;i1nbrPTJSA2WEtNdm!LG<1_edI#I-rQf((B`(LwlB z_+QhTc-BSw4O|++Kn#~cJ+K>t z!O|4Scb)alW8vD_7wxM$+S1a$I62T3u0F5H1o2aL2nZ*0>f$G~vTvL7d=|?2F5k@V zkG%wJ>d%iDfZaWT!U_6)-VZFMx&Q2SBSEX3^$SdPX<#9^>q|VRJm5oV)9QA$_W$V> zZX}QBCG412CuoR--_-Fs=II25Al=^Xc(0IchLy+Mst64T6L2X?2B=Pn`FNfvoKd#+ zRCsrIw<>%>+P;uaj~p}%^ZP+06KaaAK$xtTN%PcRX3^!@)M@POyfzTw7{w7B?6&fT z!M`|exs%dW_Iz*TKM@8N1N+gHy}b++0|KoF4)6`$u0# zYVqF0sjaVEJJUK!Ss(ca`gK^gO{?M9Q^TOQ0sr7H_%F(q5;A;`_>45(BZpPuE0r*q zQ65aY<&498B-E1ir0bQs&u!iP)DIi~@}v`B@l;DN=D!Wu%9Uc{-}gW}>@cF2@#A74 zu(Mx&=NDF0IQO&d8ScH(w15Z`&Zvx;mw1|%Lq4CUw0vU36M7jhw&?Xw`rVFh68Z}! zrwSfzDV}Z#tHhkmo$H?x?JC(Z-m#gyIBQF9|JnEFa674MRiZ7pC*`hPVxD;EL~(xQ zmxbJZx1e`y50uTqeR*%5yD2e;jGtL{T_Caiff;w`q2hO<0a|2w%KKcmx z?p6(vNCaFIkQ3{-okowKs7=o#Er7%oENu59QIHEJ@K@cGTS@wx;QV#dJdpo_m+yK+2ztZ~73!O{0V>n6!DT*G>;ruQ3n+ob;$O?ZZl zr?2<}o8t4WwaTY9Qi&{ywoOe}Zq)csFaoOs)?<__D-8}EpK$xiN#ffjSzD7|OWrMj`Lmhk(Up`prZ&W3@ zlzn>mJ}JB)oO}umx|A!fcJNQsl;BeTX%VufOH7{?(UNP9iqfuapvQ54PQ@fHU!JX% zz)NuSHo?7U>#WT*NDj=rjWZ+@VN_kiAASD56!Lt>do$<2@6F9+OcIs^PAJvNK*51d z(GHAr?$T>r>_thZ$-cFQa634Tf+Cl*3{IOZl1q*Ikv>AI$gybuNp7~CeW5s9gTU_u z*WVI(!?7%>pC{fn55wE=e`HRN#JZ)#o5DgSV#B*dXx8od;!_X%PPXv+JY z>1itL{Hy!BDm&Ru#ilWP62lD%Jia-|gkCcV#0SVeJ&f>MZ*trN8s*&eoIPosgCHs< z;$zwv`g|>}H9Hx5H>ala!&L8+DMY_ecpjh;6kZN(_xWb<}YqmTPafsar=4)`8uRO zPZucTxA6LHgD($FozLgAib3`90OK&ydnGV+6Z^ZWaWlP{UhVXqV2ZPbn?dTMDbU6| z{r#R*R)7Skprei=@lgh-SI9>!(Y#hr`Nt+$NrVxwJU`%a0}l_sqrNM8YMQ=`a{~s* z8WGr@po(Cdk&~(lDX1|TPE(q5GWH9bnhBou=&tPPDSb1I;DMyOLska4J;8QVGTQF+ zy8xD$z&l?F{;6`chI zEFU;;wq7XPK~$m`%xz^UH0=A`3HO0^kspR-IdZhIC`hti3_dVcl=)Iz^}HFvi2VaN zfE}G#)qRs^E5ortCp-?&`Fn#Sj2yCO>K*OfxlksYO!vezv(y-#rYF=XJhMG+m1c|+oCX# z=tqzK!`msV-5qz7f14I+*q2kj<$0r&B8LqW+hEBdHDrK;#=@k;HCL0k;5D4Xy#D6= zKJ0TLzNvGo;U|v`+d_P=W_(ArZetQ+A19u4doj^afB0}uHpg*4TXe`OLBw0-LAedn zCJ;ar7ve=?<+YE*>T0dPU+bcMd4TmJK=<@8bM1&;;(c(`t$~bKFVZm%R2_G>xB;SH z2MLZ%_6naSe0LKq5EC5mU{oy%vnKJT*|II~DUpb)#l?bnAIXh3<=p1X!Aw@1e;wO4 zRbGR*2)E{3>GgZ*e*8S1K>Dt_JeCe~Be3R0arMbv6~P3mk5_(Q+6(;~=Leo{z1;W} z>7l&nvkL=%Pe&Ed?tI5SrgnQUXAkjcvwDz70Nc4-a!kJR&f-WYdQC%Q`P(uuT_#@X zP_mTvo&C1)XLanWCDLloU+q6Yf9s>(f)q#MwbO-Exa;&Hup#gN=%KeAQ6=E7Q@9n; zR^zXYZFV;p%hs&0047kRet^Jl(Fc}(a=AIXGcN`=?bUB2G8O4<8;inx~ZCXK&3JX){mg91~N;@RHtMwmfC1H){?%Q*N=(*k>3+=X@21* z^G}XFQ&2$zR#m4kghZQBLBl;xQ|`7z%LYBxk;xAvrh%0$!~pm;Y7C&wDvc0{yT@y0 zJ`u%0@2vU@IglaYP3jRD7gft{S5nwY-?ZOFT#^u7-QnDB*eT zG808%p?JM#6Ibs_iGpL4hnmqy1ceG{40MkGS$pdbbIY8!w)ubbJ@tWP16Lh2YXD zs<^a;$p~c68A#k=$H?7)fBKlWm7KGNs;EP<9s7>0;7P`U)}^d9>qV@kS|kVfV_MsG zUm_=~o(3v(tkG1&M`p)mAp(D*2&&66dE9aL# zLr9-HEMY)@$(j>jm>*b3V~_EgwsK;p#b>rX!=SO)D5aoCaJY)&1y=;GrTVek`t1*l z(nf5w;s23tA=`{7%X}|2JUZ@A?K1G5h1=$U;YDUuM|~ge>X}_oqg@>8WIYnP zVHPfxT^y-nvhWU1UmQ{uZo~b}iRlScahR#{r-LctrO zT!I4u5v%yb7Oi(%Eq#7-ahbaZUn3MFw=t~uW*{^XrzA{iT)w+5BvsQFKu2P!7P({6 z#pD^wfu<|dMT#X^!E{Ny(>G0B_6B0yzV}fd#w1=6FKcXk0TZFhV&lr2?9D3D8J9a_dRxuNV^iyf1b=aSvqD{x z1Tg86{HFY;t{%(v8W=|#J02{Uh|xISH;o}EriqvAeRP6Li?gQLJ;Itq@da;JBERhFi+9_dMV6V?PGG zA4DT5jIwH*0>=Tqf~n@mjl~%+T0wz3!+u{TBCcnj-jg5>JRusvA+%=%$g}`Ncyaff zlvyuuP<`YffapOs;y(LiVpGiLm(T5KyR!Ar@+O$*`agmZ|9n@9iY!igL&fzx1VD(S z$^*cK@*BURwt?{NkDiIP~ zWfDqRNhin|%aXJ?SL&zvG7zSi1z}^0-mRLZWO5p@I zh@}Q?Wct)0Je&Sp8m>*Gqd_bawAn4yIVRmnc1-#E?W7m9=C=#|(0~F(m1EXx%7H6i zc;fQvH~L-TcWg|zN_*mr-hH2Vq@pyfJv_jhx;roO+6x(XD_F0;XcGNovj9w#x}qHI zPUzbDDy~Uuin4+u%N55aI|-@1-6rYx0@J(0qLT^2b&2QM$L0Bb&na>ZZUakR5;SA? z_Ru`pm3mYh%6lu0Qs{$5o8K8TAzvO~cVxdp{mVA*?_`>IdJpdo5)A$Fg~(I9{@dCfF)Z`SWS0 z@xFIf8?9MJWD^zLH@Be`3tpa9bC_K;^)YnbbCW z3dz0NX4ugtPtL70D!ccV$v6Y%gu*;RC7Fv|W0-H2j8E7>b8PisswFk!yNKbKAX{3Z z<`_CXi6S*6hFw!$j&k>`WpigCfVT(G(MH30*Xv+f%&Zk2hO5Vsyw*P@;v!K>C;N{* z_igCTVIV3;;vX}6+XhzJaULOb?;LX;Y6Tu&7fMI$65nsNUN_E9lp|-7*Q4#0)QncL zg$VDjQTIKi|YiEm4^H&i)lU{3)#3mmb9Ru)&T5`BPWsv__m})UJ!}%*RQe*}ubXtB5!j z2sNKyaBe=9Whw;))$KFxQ3-A8MpR`j8n4h>pwPoUJ;6{f5Z3CXG9@aR)MJ&lEN6Ak z<|2fAg6&j^9p&e>6NQ0~38!<8~mk3N`pt#fOyuy*>x@s)`W$;}8xFv;!X-Mh~fv}F6Y zkuwL~k0!n)lID>UI&OTwTne4zz(kw%giR0L#PcJx^#3*8b}D<;P^~MQ>A?<0u7*s{9R1>(ptNI;%}i$i6AzxlJz=u%sWzKjuqn z3RGuhAR6&Tr?39oM4C1orlm#)?f1i!7SV@duBd)Sd5XMlTfnde-el+9(}5MF;7H z8xexaaI~P%i-*DICt{T8gt9ruqv?Za;oHYgGd}vp>=dtgX<6;n-BsA02llxKMaSst zN2uW|4LHFj#r&rn_x(=(sbhRMctq`?DBRh%dOUlu(O^aHM6hK@x#8*Gr>7)~av@2F3h!A11q5AEe>!jMbSz*+Xwe0%zSVq&I_pVZ5B7Fd zm$>DWH(E6|!cELY73@l;LV8T$jf1(&-)ot`+*A|B^zru{#v*~&F@r@tx5NGHUmA-b zqpLkkF76}JkQFXSCR7KuJ^-R4j>6n&?KYFzT{*Mu7G3s|5IPJzivEv^hIm%qM2Gbs zktC)fhdO%u_SBJPLC`LR~UgBUum3op!!WSz?gNRJuDD^6yn_TM< zhgPt;4>`hK!IS*C9laXQgRZAf9-UU(r6&ims&$ZtS^L@WSF>6Nl3cI<|15yoX%0rO zA_HSh#v*6q=Z*4A!K0_iBSnmRtmQfs$NE=eZav-6JDL3@ips;Lf2AX(B#x|ayuR`h zrPp@wgwRsohL7rS@6<7$?RpHg;jK92hD482Rb0N|-!ElYrl?){F0x19Th>GFA1v() zERaw^dcMPc!&)JOOsl-5I1sH^r@=%@1b5YIfNYm{(FnVRNAz=db*LFXn~FP zXUFv*4qCn2am?}~M!29{xWHW}SKN^jxhS1%{%a?w5ZyW`2?ChBv;5dFp(+-*bfWqf z^sx~q}U zd7f;V|HmNM5 znPK(Xo5~|G6ZZ0Q6OaiAS`m*e!#`@DJoy6Kx@Zx2Kf1YOxB1x*a1-+7WFnHUD1%+z zeZ`pDRS)j>h1)6C@r$9CboaSEPf=EHj>p@eF&2^n0c?4b+cZz6ofp{#LLX$NJwGHR zuHy8Gr3nLx$LiMVJFxd91Y%Snp$fE=Z+C7pY$4GlVff%K3t=3PkKco z#@af&@BDI;u$WB zc&B2n$qy5cp?Q$f5`+RdgJp%joZgwPoH?u<-XI{gQCOzQSXt}i@K?-m7g|(d;6v+q zkFms6XmBz-%9LKxO%XM6fhzOarP) zz?yCQ4kg#Ja?%rc`gwfl<^^s=P@wcx>ybQHD~A~NVaaC(toj_OxFNO_+zSHSe7`J0xLKTVAIv-s(0RkJt~Ksp>CUsI zO`hW6AKX4^N%Zu?@xXky&)~5lf-#$WxOE+K*nz-99oCH7^!g3cTKDHGH=DdJQPIUiM-TA4cWI(%V# zpJw=>W&%8Zvpea=_W;sINM^j zus#>By^lZBB4$(IgU&}MmI=3c^QQF-Fbe8Z4Z=Fj7HFOFLK|t?xj8S`4FJvz z9a|0lsSkU9_RR?>?IDmWcX%4%u27CCYXC#JCWfky>Ju%c&UNk9y{$&CuJo5&h`ebJ+Zyn>pW5r_q!%fD_VGDMZ+!zgKw}Fqg8Z(uHZ0Elg_|+65 z)I}fvjQAWFT{i8DG_TkaoV|IMoFYuMRr_0y5p0n2j^fuh{om}CO8m<-)Dt5nFK8%t z`3c;B!vxbe0qyyy+Fxh1x&~5+q(#4vkInRcLteWcbH+fa@q+K*g5G6UAhWR_&TRAVVSm?sI&p+OU&h#|2>++7ed%qi__(!%TYy8kwFi))|HsPx?ljONo zOYFV%o3CKtr6R}b;duBU7(xGZ~6 z@A-;cN8iD#e>k9tcMNYnOz#IjoY`*C{ee1k`~}f$>>jB{X(?^RA!j|#g*lvS>VL0~ zyu6r22`j%90&=v?Up=h3m@-0aA3nOLh3y@-E5X)Q68|uR=2irJ^`^@ubB|yZx1sk+|#PKG}=mO?3g#@@`w5h4}i#584`AK>=w#kXy$!8Rn4$7CCx8lK&h7VTQ5)Cr7I4*{FG^eEdy*J`x3a&Zq zT6XV_b94NE0VbLmPQ&N*$E0Lb$E<>-_=OhUZPDFCSK%Dldkg6esJIBCXIDnL{A$n( z3j1iN0mv%G1fCJ7ZOWU_?{0TkEdAjLWUeE8U2($!g>^TPE*S!-D;^Dmg(+)Rhb`uS z5}(LN_9p8IHs!oYyWw#0Sg~|TYtJ7av2Lmi=`9zwzrF)ZxAnq#{q(JUpr3EQH5r?` zaE<#t{2-(J$EMTCgMMIi{KNba+wftG>6O`f-^Y=_m5C3%FC$PAP=?@{!zW$Uj`K$1 zN1o(}P}rV#dmt<9yROg|7_!b8?&J=3)`%N_bwNx&d%Qz{rVCfnvmgPdc!q1}uga~O zd&>5W)N%iP3hsN1AF9X0%-NH?d3x_L7JT2~3QReDP1CD=_cFw-%cQu3Q1XD5$?tb+CxUN%Dmh455RoHvI zphCb|j#VHDp6B|plI!XkOf_(PZBlzAmuACPVs2>BM`eP0^LA^EK<}5#n(BF|C1IDi znLfpVL(yCrADKbT_jr!MhJiI-+*7a7?z=4hXZqEVp*{<nYriGO{zBM09LaNJkKPJ7)>Jl)e=@a}nb!0D015JQz}TI1C3y5_a!Z`%V{TML z?J{pvSpW^YmO1%#9zKkfXw#2diFyNW*;Zr@T4?Wr=vRe)(P7P35Y|ZLBsXEQb zwx!h#fwD&sx0W08B)*;P-OdSDf2+spEtKc&k>$34>HV*Tt*!qN^&EJZ@g5ijIrDG@ z`C(-NPhIJekK=q^&mE^q9!^LUK;kDZCEFDmsnUbJhw`c)3x~|Vs#~y>$4qfa(6Ub~ zvT_#A=`t8de`n=$81*1+{v&%3dJB3?1|tWrF4~C?UtNrV3$h2dm0L_sk9dC4^iF5ZK-Dp6=F6K6BYhWjl3nc7P8?@;iWfwz81Xm8Svtv z{mnh&1k!SHcZTk!;Hu*8ESeT3_+TTnt#b5lYxDnHdNf61HT2kSrRaj851$cl2z|tn zEr{QDyJ5itV9!nHzg@t!H-<~@OnEhj=Sv1(E|U|FQ)Qp)Wt9&{4bCrLMybL64AR*A z1tz?^8Srj=WD#K}7aDK1rFjRt5+_a1>OBTmceU#u)OMHSdi{nD7bprmZ9>+v3}}nb zUIbP;tuuEJB$MoiD^lS7kKdm)9}S(v_%_ldcKX-*3@obD{DQvzK^xUY#colEqu z89S-c=?z1m4ryZ;OLPLt6_{XJhEbsiq3_5C$p9DzU|tjY^r5jdwXUVodNBxzs*=6N6SAZYfH#7SIv>)R@+Q@bg1kOMwNm6I{sP_`|4yUZpdh+9*cup_ zs8*OAsJo0;fJoctndRPZm>N=CYziqrUIl++e#)6D;qR>=RQm%Bn@uXTmfRe~xzi}p zs!jy;62vI3^&^LRtYb;Evp+ejR^@w@ym@LuxJG;$%jb7jJV(g*pL?wl z!YC6*tu{WfW^!NK?$?537OLLYI{f-^S+m|1HGyiDcZXYl&tidfQHO{a|gRau2-U{|oC;XR1goOu~b|7E&a9wFviY_!pK zvA)7wgVNaZ2ru6#e==KjC3GY|`e%kkes%uIH-9CxKOuFTZhh6|@j>q!(lbA#e}$P) z59_pOk|7c9IxQ+>x0!W3ra-(^F-1b<8)pqcet~|HiT7-X7eG+px_|=< zIF#|#MM^K|BJEs+-A{1#3(x(RgFOew%=?;ga6c7nij3;tU&=g+fEP@0X*710e3n2h zL5?>5X9Rnu`1yxjtBW z11y?tg?0*NiMl^d0d`tFhK>TP7tQRg5*#%Ksbaz~TU|T7hJ+h7 z*z3*u-O5cD3?UfC6(uH->5}&*KXmA^b3BHct4A|(^n~aa=2{HNn6g})e5KI!j!K7l z#(Pg#&^J0fBnUlbt!B({L~y%==E z+3z-gzKVUX=o6JIa8`CacIBWXFfT6nIptcX0FL@rRtd8y_=T5oI*rL9ze9DH6~K9t z8sSl*$U^g5%a3?z%Qhr0=l~jp&!N&FVyl<2LF6s|CW2ausdxS zHQU1UZ5Z@I%WmXX5Ibd*;Uai6?RKO5D|~_i!nDY9+2SN~!KpZh;|Kfufw?|?arN!v zsvPva@BpVP1v&B!2sYinM*m)=1PIcq5O5YYWHr|85buyEcv+pB8j)16JiB`s$7|-T z4*yxt{WtZ!E-hkg5ZIfJd4K~CopEvq_MiCqbz-Buxnz0DxBcjEZ?GFH<^SDoq(ZSX zpmB(D{QEDKK3cfH3K#lSJv7$LWB3rgyEc|8rokm|Se3Qm7?wFfh~O+MH12H6L4XJ% zWAF3{oh&MUs2{Ck?eR<aCqJU6P-hHT~eL!}A zA%QT{Qx>KB>OsA_-;hur&e^Fds)f=T)pjEI%?|P=Kkeqb33oeYC(SXF39DCsT9l>V zXT3jPtB?giG>6ILf#1_=?R@8?ti=8I$4y#&E$ld6Qx=oTy0#+Pu>s`azsE;M5s{)P`b zIF*_NnyqAy^WB~Hkzaksi@Yi7N7_tNKdBAgu~g>-+Z|0!sIcRG|D;^k+Y7p+E`9x4 za*^9W$Cjla*W|~Jk_qij_5qL5*6zz{Q#7K?p1UVEXeR4bG>)kahendP#ZKT@FYs`Q zYz-7wzB?lwB~#3k)*EbRX8A$h-sDGoIlTBo-q+34<~q)_>+2F-9l`hAl4cd}VcU(6 zjg0(>kqKP{-`7dtoWk4|)dlc&??;OG*k2pn5Q(fR;Ilh-HzoLn2IZkf*>F(DjSclh z7totxO6{O7G4_t^)vpw;+Uj%C^ zQ1u_4Uzf4}-y~RT8iFX#fZERm4^FIMWul!CR_%0G;E-Cm7mxI2w4t;eUUT$swTs9k z3>~W1e*``5d=o-_89AR%;jlv*E0vdMv`|pZrtPIoATWP3@_DB-0JBMcAY(zILp%I= z=L6D^(65Tj5-naQ;k;d6YYhYMlV7j(HVy3=eLlSZKtOdg-jLZ3n4k=SMY`urB}kVb0ohJpv;dZCp^p?I_o8xOXHL>n1sFPP0gcMi3xhO;W;=tGHn%#2K#!6i{j+IbY)Ia_dIH zJ?l@p*GivMI`eRK@3`c>Ey`6ew8?_{xZ$$@(fT8=(AH=2zLbDxqcOEAIZUCr*=tO6 zGma=cm@2NZ(3OX|QhYKs=Z@*Iq4{U$jr=1`9>yRYfHLa3R3p3}dHSShEq0W$h=mM~ zeuQ#)uCWVa$wlh6@!}=b@wp)gqf!-}n!>2!kn7Zh`ifX`+QlX25~odzg0|k#AL}m- zN*RCV&(~a4-hO7B*(bVd7J`*TXt1C=al1{2JHZqi>7K>VhXLguMUF@>S4Z1#pF)V= z@oe;8Drn?$4N^GVX?_?*RnI8;5ej#QH3<1Z_u^M4QkdaE7!wzbFlKHV$v3hOigo_J zbn}~Ch$T%&sXkjA`Lw(-EEs0ui{RCN=@fhjn`IU*d=ca2wsTMY6(>6r-!Jv zmkeQis9=i^^#Ut!goQ3%4!vW5Kh7I^G|qz5oVzP#5=5x?iOjj^RWrLi4t0m9=DHcM zfm1s_7E;-DuT*2GGn>hN5m0Pu)07Mu?Mr>qz0Uqb=0%NxoC|nX)lD%X>3hELh@MJ| zi+W++-hf?3Vgut=sVm|X(NH$pNY0hNavJ^0Uly-eQ<6!5d9FrUxBBhfh}6|}*#R+; zB~e|PVt3%|rctj^2M@ue8!-O?v@7-ZWIl+99df0`(}~U&4Q5n+cDuSUW3+iybid|_ z4MxLQ&I#jhQ8wdvD+i7vGOW#`T=nx_DMb-g;S4N!_-WU3R1IvO3KBJEf?XX4f@KNfeUXO4Xw zcqeRrQ_g@wE#h@b2eIkx5Tz_yaHqdDyj{%`dE>YV9uUeM>O?Mtn2FwR>d~(x^b|dN z^>>EVXN@?YcKLoj<%D~5CQY>KG2YEU%AJ!=hrW!iGp`1ynBU4BHjRLMID0+cj^|~i zvbnU6!7*dtA!A)S6z6H9{Q;8#MyS`qBVJSh=dY_330E;A=gR7<%vbc;QlAv&+%r^f zsMnBQ+EGAnv-%=K?KORo)alf*V!F8ghJqPbSF=Dt7i|r0#R)h8CHe`nDrAC8_ z<X>r^om_yD%DNs5WPOM6iMsMOvcF=L+#ywMmfRrU_N2quma6x$3G zsQ5Xhi`%9<8NA(oMDvJ@6M-*|OWjum%vtw_f$2D#e4`j~UhT~Viv;;wbc3dsSV%85 z5{k!hg{fL|Ap8WkQ>kJh9(uREpS26(9UeyT6u`1~6R{{$AdQK=&n;B7t_!hz71P4* zC3j;XJ$f+C_`5McUJAFfCwh{*Sw_@z18*GyJ~LnwVziO26dH389RjSljQlf24nABw z$j10}OrFPTBTb#34yecyJNU41$r8B9fO{eOIqO3+2Lzej?04$DkG|P55PjK-rLn`W zM>rVWGy~7jx9wzMWCq+@hCc+7Y}BA1w{bkV*$f9*Spf0mCmxdMrDWM=F4VGMa&%o! zv81i*>sP#(*1B*VC{F)$5-<~CCVl_A>8H6*OhHh1Nu{#{^M-f`NDqG>%dn{s?5?_T z#PuxpPT2n=a!=u)e{q}2m)Eu+P&RjQ^vl=Lh-Xc1lUEeW(RAa^hOS8rJh{>% z+>v}wcHCo>WJUG{TI9_a+zWiv6>*xnw9}3Yl9ww75)>rCUsNp=%-ZjTR6HS?c~l?c zQHJ_~N6>YFAbh(mFcERn#kJARTT$Oubmv`WzM&$6<|4f{;y@#ZoWTzd4Rx(ZRGV% zX%M!@kIcaX%uK-~M;m?8+r?_y1%v_mXR?1Q-tpnY#wI#+$(m50PPVh`;&9x~U_+fd zfsE2=(z@%kc8a6gO}v?h2S?xOF6V+moS&WG$Zb(b?Ax%WZ%)Dq$e~_8$L!WR`y7gjzbcE(iZ=REpD-29$#d7JO%mnMbx%jm z%j%OlA|eX>l!(H80+-H(E~T;pW;9F|)k>)bVPhPgld>%~me5TMO_5+IF@DV# zXP4-AXi!@(MH3{g|KtmU4Sht>zxud_hyJ+Q$lwV~V3WQo2&94#3-`RTN5f;Ah5PO0 zoCd1n5LZFGXG=GP_oalNtE`XtnqurU_B>a?Uw^mpJ}{DHmd0b2PR;WZcR6Z^!uXYE zy@%OKVn#9(hXcSAHVV-cKXyMwo!uAK?HaVLc6KBNU`bL5j zU?G_4nBGT(=%!fGkO+Df8hvtSK>yFBj@(E07tbFgQ&v+Tw^h;7KWBJm7M zdrHHF``N+%NkwcsFZa?t^Vmys>}TAz83&)FZ55wQlarN)3Ks7@PO}b=ggX?+#@t7m zFlG#`o_2#|8;nXT&XP6)<+U9Y%t7FLSpfow>5H$1x-C?cioEx{<#1pFJSx(ux7Qs& z5%8FC5VLH#ynjNON)ef!wRtPo=_ESm3%QqeY;CQrqvPS?pFcp!UilJe;_p{o(~;>k zc;s6nCWYh0z%RvhFXRR1uWzT&@(}LC(G}{A#sMRe-+jn3X&Q1AXg$_baxQL$@#Dl6 zR+D9 z!_}i|&_wq65}E1o_3Au}<4R}I>D6%#Q^ZCtsd)?Nd3OW+Ynrn_|v z74mCFg4`i|mrs0$l;u8efl9&e){9<(4kQ)+UYg_?JI*I55ui=bCMt{bW|3GTM#Ad+e+pda>3&qok~&bo><+z_${iX8j>5Ty&r+*70NxD zW;>^v@?@0T=0AO`lS;Ikn5~n7r{_rJ4I+1rMCfJbCzmAj7c{pGw9bSEhiK@c$A}#g z>cTWKTJ#%OB!g2J%)S-s3r}(U0d}g!iD=q*GDcJzZ5@N+TZPZXm@!0gzw0kvDG1}K zW^j`ep0`rPUZ6732evMZ7C7crL>Q*up^%AU8+QgbB;+8Rr~2ANr$xRydgz>(hgte` zmK)8$ZI~*SF&I(5yp0eMHVRY;VD7ol%6?=NIH(yOdaC~wVn-(1q{hI&IN5A826hNk z=#X(l>;k->tsAw&+=s_K3+`7uzgLeTzNsnYCxJLy$Uo}}6MQxToB6ZwrfEwc8UUt5zO0CGPG5TX5{dbHpgJ5KR z&5wk(0zdp5+yD@X((KP6Yzb1tZ8Gh=U#U#LL9aG8BfOBB#WKId1vi_Y^2nCi7+z|! zbB4F+nFGq3>%4=)3wsjzDF@r;;09#EKN6$8>z@E)$~7fanjFp(=)HLL-B(Q>oCnOh z7;t>pzI9p@y9YMQ8EblNcUAaQ$=NOWqG_!}227sHbjQVWxx^i2E zrFM!M$sLj?Hg1B;G8Z9qG%l>1+R+E(FaQk(+pOK&5eC+Uowo2jwYH9h6;mvT0_wD; zy>G%axQ@I+aZ;WbH|v>N?Y|X%(pAyJfXFJel@N&2yIPprjHEwRISI$v*1Wx3I&aeV zA<(lsS`isyih;Na@c0VQ+zdFw=iyp<V)m$x|LTNkauTAac<*uz)iD_8ABd8_!9z0!c zRK#m*W>}^o$kHC(nJd@ha{Wc#jErRKjCl9~ahuilLD_&jmV|+eg8Up@DqkUN$VGdH z9sAj+g=Fv$H9n5AOaHF~7)bub{_W z$@;O!EZejCyJ*trm>AP243mFt5WP>iQCvUeGPftBiwVQT1{NMshFw0m@% zAGa648%3H-1u?@eUQ3d%BS5w=nNwPKi^YsaxeSf&l2`PH_giFj#k*vR9IL|YGEQ!SXe#B6R@P`<4XGll z5}>2?QT(EDn801(G|~qzS`ypaC&o2Mf(_C{_iEvo|{ZVKRY30sdWX^|WJ<#C2asA1#ux zV!W}=2ne@B`&auT>J*k8iuws++PI6#W$YKuA)S5A>EVt6MN;NrL%rQ!=!n%kS8Fth zcp-%T_Y?b?rsr%Y?h8Ol7uG#~_!tKj!!>!u!K{q#V;M~cl4VLwkJU{~-+$AsT?mcR z*;vX8bh}7#Dy*X$Yho!k{*ob#{B?{oDazTr)` zlIs*G8*@{tD%utZ!kVkx6m9C8omy&dXs6StAYKMVe8ASoM*&5fM2A+NF?UaR0;L{( zGTYGR32aQEk}wB2O|3f_h1UW_3``e zs37KScvaH97$wJ;=wi?^RnSMqD|Qlza$iyhbjfW0Q$-_9_7gwnox%nT|Lt$?PzSLM zVqD#_V<$ z;4Bc{mf1K~9>V*C#OrR#lnWEwe{ZEn7hCSQ(QXIpL3e6Z-^3y-+}PfmHQ@}wMvz39 zPcgIEYA1<3+6>4#i|vJ=+HTxKo-<4{=Vx$Ndwi~x`9g1Gtn_cLZWVOYrnTyxb7}cY zC&4yhY0Z4vi4({NvoUyO+AiOXQNhc@^)=|e7i&Em-l4;NDI2<62>v_Id&#+2Pt_eM zg|jh-&*+PhlTttNUy@;!aJvN@TO0Q^wr&c(`Imf$DI zPDh*U+uCW;Mi;9!GJj)Oe`bq|wVRw&tF9UvEv^vv3~|{PHi}43K$LleAwHJD&Tgvr z*=ZtY4YRv{KATFk#q(&%nv0}Z4qaaascZ~`_Iq&8EzAseYz2oM2fZG?Bj=1h9XIH~ zqK=92E`MYnRzAU8{$)Lz>7BJhW|@)0-q^Jv1+Ft=h}v9{4c+k0hJ*t(=wjLz_Tp14kRi zA5eC;^2*qcfzV@Q=eIowWh+Dd=!@A%gpxDT_Vj8)kv;lYjxm);Fg!_^x^DC%OIqOO z(VMHxvhu^qYR9)M1eiyI+d?ZJ)E12sL3KjEDH8tmp8u9j{1>N&WVgQO()R_wM5a$1 zz7V4pD*33STfCS2A+gJI-*Fh~f!%)Xy8~k1dw)Ob4ml$D`zlE#4yYQvHQ=gNHqcgB zeGG%DR?WbNJX-K+nj(YP_KP9yz1q%*T#79>?02%4G_fg7rY;LF`3ib;^8%pXHEhj* z6)DqNlWbfK8;LHn0XaHerp!-5Zy8|QV5?e|z5z1+$lB%X?jMcuu)ANzs5qyMpHf)5 zShosymME2Fqjp zorF2U_^)sC^RnV!{qX0#rNd?QBi8E8B}a|GH5t3W_JX+!MscV4nDR``GnKhmW*%mw zh?*kkSccj!|6h^sR|yGC^(SLEIT$!*a{iK#Jz!B?vsG#j_rU~&i}Om<1K|Z(a0!`< zjux;XC-fCrrY17aU`vf*z%LYYDQvKFg<|_@*!t-Vni$sZ;BJDz0!4vfJnZc(|wACbP)AM~$TLuT8*Bb9=2;{l9k1 zzmQ%c=*1IbX?MZQGJ0Z^!%CTqzRZ>?gy`D!+OZJ>+sp4X4rqd$<%%fbiL;IKE^L@T z-@~1=li6BgA~?6>QKJbmdh5~M9u_eaqRAxeevraouDX#BSufuq8Ss`={$@0%u^y~L zb^+5cRl5Yg(l#4JXFf#kE%KL@TGNY7D_q%%<&dxbE}|Jt+&TFk2n}C!;XS#d;41DT z5U?6#QcE>WCC9Nvaj7lxB9WVysTxo5I^mzx+#k*0B#Cw((MLquYQHcB(#;lqRtaGv z=5P;aK=RRV9f`DnKm^Z=ZoD(*@xs5dn3?__h_4&d|ljHp0Ev1Hv#n^=NgC8UnjP7Z9sW zbWciq^8nMlcD=f;yrXWEbCWM&2e^ySXLWRMt!?Jn%t5eH`;1Cu?AMQAWD%CYx-vSA zPG0d-nS$|?I*e05xqKeVMx1ogK6Yy~KTUz!jJ~+}awNZ|eN2Cq3rsFMr>5S9+&Vf* zVK{e#zPZP%{8aA5GU=mjTRO{j$2tYik8CbGo0qV-;Qv$wLTK+8V?kax#dv@D)fyK0 zfpQ=767dtg_<$qWn%k#dwb=9?S#KD$B|>k0wm9|+)iBzVm@2WpeR|fvk%vE({cUmy zr>$dRP9BERtMFIyGe)Y=WLg0Y>9Z>&{q=@XkW#md@>u*vCf1t%hawbBx0_L34R>dv zZt4+Hc?T}Y61|ETc&6o&qlqMhte&4^8W+IYn){#b{6DD~DJ3D1#fC5TKkq@bh)-7L zy__r+ug(u_8KBIe7)p+-*@L8I)ptT+cnhEDZ1Eb>EK`kCAyqW30g9IaA9U-g9f+&C zwD|Ks(2mNpiKZNQ7np-#rY zN7Ugne0X<2)giF63D71rV$pgqGk(MG#J;hpLmP;B<#g&9Z^!CX?3~Zp-5TgQYfenG zj=9a(N}6M|ec(|K^{K-3;y2TD@E{v{ z^<$2dGYKcuaNg4=Td-}K>V@vz5>4qrtiLmhPJW7Ifn&fsWq2-znkLyAE1w58;ZqUr zZA1fn$Z9~U=*8`K9>ETbgg)xcAM~+Y>cve#lz?)BSk{Ga%wj1l4a@SF;=PMhKJME= zF%BPJ)=J@dmFop6va7D534@d*UGr%>-A6kL9go$0vuK$?l^a8(o+X})O7(^&K_>02 z`~xGeJwQ4zvu})&F=dwjHdgwF#3cxJ7wrfzXYT++OpCbw{(brSP zv^_Z<>JUu1u{H#svXREm4o(a0M(;~?FxE{J>Sna60jMhi|d+{nv}~c@D zgUv*}c2%74tT3O6s$UNu5+auJcqMG>N|)jwcX)1R@8}DjIM5nAu#fi6QP6+wdbw09 zJ{S0a$J8Y~M5A!OA4@>kKFk~dv+YQ00F7a5HsK{fSwk=MkEXtQQMvoT&dFLddJ(1F z7S($8f$=t~rSWBlPm@U0dQFZi0XM?eU!%Cfr&o7$)c-UvfOy}R&796XGX5=;1`%;) zFE6iR{}B4r_*4!;2>>~U`Ee>_=y-10x2~rtD9X9c-2+BzR^$mVk@`(vGL--@9G9y3 z^|%QzTA$4bwh>+UcnSM1GaIXHS#8JQfBRrjXJ3Xvnyuo&+W;{4PKJTcU;&2-n4-@3xmQ_$K+X{HQA+Wt^eAiq3Xe05jtqh7@ll z-%RF4=kYZIY@{I*b9w$97(f+xP;}Ptp$1CtCg?7bEp*#bCJ(i*IoK#<#&nbw(-q*E ze(l_QPFs`fqevZfX{S(0dw|>sPOONCogOtxG}sCf+9sW9E5BbfWjjQeGMyTI4~Xar zSfxwPQ*Pl^FAP+3uXl8jNNJh!?~`8vS4|kPoDP!R$o)B(W8iW*ptGyCrb<#7nSbPs z;~de?mi5OA1=Cb+HFdhny_dM@DR*3CBURSyU=k(NuJb#W$9r4GR$~o2H2~_2 zcVO_h_)N&IfP3`?=S!I$W&2(hV0&V!!1gyf@u-NKr_$RTTjaq3cJQdRpd*#jMH)aG zzSp+^X@3rSZO`UNm@q5yPx<&CvF*R=pvTWX0mmuPgVxPOa5M4Nw6ASee#>E4h2 z4>Wc~hDXdBzpB#2V~_dNBLkBfQYf{oWTjtTe2hu`Q&NS_qw+A&D*nE~o|pgd7>FCe zJ%p}0y6EzqfiPfsjYjuMEDg{s4}b6)p&b}jKYdIvQQ*o$HN#RTAZ1121`V{NNZ=<@S@IgJ-STD zj8Rz)*Nhk%Z0piYt>OP(j5kq*hh9r)oE^?b`L(T{A6ws+;$jXNWTXCmg02v-ojg## zey@sDEFxq+=-_Mn(Q;3+mD5o7s}GL12HiUimxW#RhIL;kC+Or*aErKudkf+Rgv3RSRp|6^}ejWuO3 z6h_^9aqD@eb13<=Yq#Z4Z?vP&EG;%wGgD7-0IBkZdP!p1eZ053H~4~bi4pe6GJ@zS*=p%($d2REQ><{BOJv+8(xu=-ri{d?(^p$ zf$Iav#igY05nPnZcO@0T;_<*pWD&5Mbu->hn!0}!o^=kJq8*)3J4u<7*_Sa*_jq~& zChcWNp5F0_Nos__U7}X?EO+=QOcYPFibfH$k(MTm!3HZ{1!w7{fI?peer^AP>j_1> z{Lzoyp^00rj}t=OPg1I${~+^M&f~4#*Y_v%XK<@nO?h71!Qm{bE;8btrM`$i?4DID zE{5S>K=G9neMt6U7Z=~`EmS>!*=D%8>7(QyKMoz(aqrqTJAYZo?QJ$HDJCN}>+IdG z%P51G(IAX4T5n?4L(qoWJgSBm~;g-bp;;^MtfG=&LJ7CX%KJ-oKGVY?jS z$l|##wL!2&r5=T{YcSk`p0D-}9no?hAD`(Ty_iSK6IS5ID&4R~^m8Y>SNMPoALrpb zr`b`n0|C&eZ_mFy_E!#c87c`Iwk+fMG?b<>?#ken1BA->PkFK}V*ncVJ5FU_)ljd?=m9V@A}|Ao;2=;0PyonQ?3yL3YaTays1{i43*1GEvNKPw44pP zXQrFAvtLXXgEl>-SdEEk#93Emh>W{;y~a{dbFB5<&73nq^; z*l)h~ISMuErV?psQ{B8$OUbi>Jxc}QqQjOAp?Yrp!XS&#v%LKqHt8qO9rAKb7=t6q zQ2PomanTnvNzAxgMW?|cHuS*J%4uCGpC$-lVch`0P?@EtJv%1m1Ej$Wuy;>JEk!u1 z7PMMjbOQ2As_#qFtEOo*ux2lt|3gl*hF*60Hh{U^vlPw!waAcR&7Fsc_x*dENnf5BsN|_lrQhb|k6$)TcOL;4kMG!{L`D61H8~Kh! zno7>W2aB}Pt_1EOGXDY(Q7E9Wg;W^2nxc!3xN%RpK_2%fc(p4#kT-r00jLuxw!1d~ zfrRc1{Ca3_)JVV9x>U4x&+$|CU^o$EFx}>1Xid2B{Z>sKmjvURU7Ha&d7))`%kVr*{-Sp?mVQ zY?QtW1J6Ia7zs#2f4zF?kIjyY^gaJOmD9n^hUyHbYkFu$wL`m++e$f$(I7G_ZoZ52 zBt-|X3TGw_V*BkvGsRmKK7TdmZRBO_`_h>Wa}*9$}km zdI_Ai7z0uz%~srpC?^T`2Xfy-V(pyCo$TL!S7V1i9_KQT<3wbpKH5{KV27Q}1r~Nb zI?+pMEFpn)j@`%`vG-rEw2kr_JAZTglbtiV`Rd%zHYWZzz~<@!-cT9$2Tk zhoVtVVCG@oj_c8|$|uL(?Issc<+O81)Z-pP@oGzcV|Uc;v$+YtA*d zAj!%tz`#{zta5O@{czJ1qg>B4-Abh*7qUx!foXza1ZKfIjM2aC?PP1J2t`B=Jee%R zCs`S6Qo#-x8u7i}vqp%ynWpe~JLzqWZHA;t>zO=;RP;!lV~-*Mw{Q1-FhPr$Tvmb2 zr6l+FVyT{KG$vTC(HOanv7{1;ed$MO&e^s)6vc=?M9Wel9`@G5H9w@ZF-$8)LEh0| zUkv`zhk5p57$!x*UNHOSL%Nx(x_gqTCVgm3zYa4I4p{^dp{*=U$=iWXCh+_v-=?l} z-Z%?d;03ESAEgANrCVIrwq19Xv(RS+qlsdpv}mE$aJp@G422>3`d}gRsQNfIC{|{wyo!P1UKV< ziFqg1H~Q&Wp3U!nh!hbMeCni&HN@bitGEz~#i#p_`NKb%2lRB|FRJCdx}a)Y@E77S z?FirbOZRikjI)D7*gE7LdXPgpfW0J{@Y{q9{angA3lB^M=b76UK{9^Y3YFOO=Zl`F zc*`%Ko&h%~NCNNI0lgrmma)A2#095eE4B$M=1W*Tv=U_@^gV=O3h2oh{X?kuyzjY9 zXKN?2omMD5XF+jyl_PiK<5kdY+vbBWAY2*z?hWHaS$oX@mi<_(=^Uw6w2giHE28LwhEkVy1kt*8#@483^ zk6Ny@r%|2s%horoi;ebpJ{>|G+8<~q*C&#*DspT8MmZDLM+wInbI-n@EO$>PpnC@6 zwK_M`wMgkt(RE*4()nZwr#$DnyH*n3%$x)m0d^uvQJ98%n~3c_h-jP^(`+1r$`7R)9tPRIlT}0n6jms8z^Zq{8a6^bNRH;o4<;39z$>fuc&_Sl93M*&DJNj z_nZg-KC71N{qFu362l?3fsgfO)fP3HFd3!3^4tv^lp3Ax|Ho5f>09A2!^zwr?6b-t2H)aImew0P^z3wGs&D6PRtIo$ z`gwHB_0T(kDx$Z$Y`WvT+%DWLCy%Tvc~9*HDEcnc?v;kF?t1!L7!x0U+;)K3;$9E7 z1=?YNinAPd;}P*Hi2W&mH}u!gXw84j(bR{@DZ_}0m%d1iNf0+1Cv46}N|9rxZdKS? zyLlSH-h$>d4b_eu}pFUf9xS}q{-GWaKbLKATR%8)>Ku#Oy6{`vbz zQlL`H;}=@QOP}0@0k?p;zB`M@5j++<``mVDNep(QqXNbYzBxg)z^=e`SpkZE?ET4P zZs`3d1Q&K-dP0b4U&EOLKFM}a;ydr}C^50@7Bf+WI?*BrY_4$urTY}D4gCclMVGnU z9(1?@vrcZ>P*m3v^lREya?w_6FPnfy7vD3En!*;CYBK&Zn*OhQEhtRI_!*iZdVwZ$ zEE0m%S`N*Gv z^AT5}em$Gxm(c49J@@=L9N;_eX~~oW*6uYUmE%|!c=eck2gE7g-#0qL?G0O(C0ltZKa~1ZiUcKkY3c5if=A1uEY#p&k??Pe@zAre;z>1Agck zYu?YqRPy=isc&sZ=i%UFl7!r0_{gA&vQecsV{k&veiOl1FX3H34n&e^2qxBVGT0%n zKI~ydShl4Bpi}LGFMAGiImP>=Lxj@O%thVL(40|mT!mVWWr=1NdpAzufiInI6H+fNs%A+qlaAetp=rZFZ~VA1xWZY(Ooi| z>KnwHH9*lX+VxT>l`d|Nv_E_(6N#p$6jHuQ8`q~g+L{3v-!tydCom+PBs#9nAY$b7 z-fQ3$b=kIX#kDMe#teMIhH~9rGe13*3*%H{s;Sm6_z7imfAe)wm-AztlPe+LMjd! zeba69qzQ_*WdrWTw3~0zhR@_gXz(VTD7<=38%`>5GU5IWM)cuELDUA1_HbEkITj<| zC#BQb( z4%cdt9j8R-T^p+?UI~5onMp^!LtZ(JTM->*17CU$wso5@##kkKM*^#y-?jvl>wQl@ zign_?C%}|2Bz{}UVNGjUrlhvolGv%Zw9cHD`)EvcQi~bRkk9{9Hp7wjMs0UTuOux{ z_$Jc4^c+*pATi5`fQ10NkX6pWoRa-Ph~5JSl33PfdG-+#|57*qVKPCrzX~(8Z&rPO z|H@6df5?bPIVJ=%t>-)$l%qO6Ex`|CdvYRX-S=I6W_8ZP#SRJ-U zkpUUjrQKEn{_PkZI*fq09NE8EB<+p>1#S9D7hwlXX!3Jt*2r9!*rE>yf-sM+D>c z=xIFKslrAAcQ$DX=H)#yd_baPi z+i+~(?^cqt-L?H^EcmB6L0;Tq9R1nuhaTDdM&WKMNU*qd$bS{9oD_NQM@|d?`6?ud zT6qXLUasq{y{u)^Vmf}O-r-&D2Ie34?fa8;<#U#Fg9b}!xZFu7|#t&&JV%t``Dfv^pttgf9&MgxP zO?<_7NL5oZilGuBwUu-x;PcY8Kp^XaJ6(ANtk#<6oEd=xqX(Vm{eFtbz9`K1{M`W;B|C4pygg=5;Yqp^EEmCUmBeCvqZ_m_A2r}Qu2{fiH<_0 zlsNp6i`Q4Fw9UHh=HtVj*cnYms0e(YYTJ6K>%Npc4#F^kR;$UmrST{%Nj|HgDcfMr7u{%)mP<&VGB>W5r{fH&m34HAur#>pE-_}Lxf zk@a}et4@m4!c%4qa{9NNO(;PUDuoMM9r@T&$E zzu*kgr-T&3T(SfR?YMyTzZSWTsej3bs8whG(B%0M<(;%uJ;We7dUxgd!b`e+5hSxs z0`H#8TDn7iA_imNsac^_ux7Q9r(T{+4zcl$2HwFg@5F}W3eL}!2D&61zmC0Cr9k@W z=N<$OQX!T_x~Pxq{=nl;KJFQ7HM^rrADq>Lea1((AL#uUUKO`$@&pJLL057H+I=hm zj~+Te?~>zG@Qa&{)@kpn{P(f<4@~{-3CT2ArUgPLeZ`<`@mi17JqfP0>wvR;QRRwl z5d6Baq;b2wrM~`7Y~ehxE1`8YFri`d&qDIB8S zu|?jZDerjsHcUhw#6Eu$!;-@4K}+IcH;AXl^o)vhhBowdYl{!GHOok#!-IBEQqp96 z^H41d)VMEpzTk-@1#h%YD@aJ%&|5CiMq4s8Qi2yKM7C&_miY+ zQ_QADJU?xGZ<3o!iZmk^fc@N6%}?wX{F$#9>2(UOJIOVz-6QMr+7=GP8<|nL~UdP>_(zsrupAXs@)^#tL z#Dj&|+f;L(Ww}VzS7)4ZUv4VEQ~aIjb#0WGU<95VkvK%R!iV#F@~&U|c@}qqlDW+y zbe1Ya^z21Nm*DFf)YGeaAUjg)Fl~$J8RYpV2I3`s-7DN#rXPUpNB`ON|EFgC&wg>F zli|WA0IOcJa-IPMC}@S#rPMvPE^Y8?-Dl)X+DJIpDlBSr1kF_JeG$qN+N~1))&!WR z-Fs!_#);l_?B8wm*9%ul1zqhpDJv5E(bBOJT-JocDY!??!1M9Yx*pV2JA-!*Xy)u- z$tljiIzz!F-w#D}qCKOlFU4sTyHsKbwHDdaPt{?_L+`JWKFqPjEvQAkON1!kXV@{S z3i!c5P1UC0BTUj=or+7=61@F>T*q;B|A!cf3$mAKOISMD6P% z27>!X%V4Q~FJaBMx33jGA@kYCm~^xosIDjtm5q(!4m4#Ra~|n==-YNu)Sh=Ul;hvz zJ5EN)h`b@aEqD&lS{D*+=F# zv*7qE%UVPmM7jBLJCs+F;N6zm#h$DER`G+~<|FL}R5~suz2g2`w{`G4A&DpXhnUkx7V6AY=VNS^PBIlT2vIpO!dcc{gu-G%x)AyuJmV`)BS;}(G zmb0&uS6vpxPYsvBqdnDyAJZE%KmDh>1VU&evX6+L$rOD4{U4RF60UD| zxLwA)FPTth4%Qri8dR-^AOCeF@_OFTn)!u>e~!y#T)&+8sX}QjN&Vb2c1hb}b2YR* z-tQey2XZDBdj5X^)!t_u#@Z8MATSC;zUTRei%iSZhEOrxAS zR-1s5Dg?l>o!bNxCR#mk@Ng}rjA5*Y#LOz-Uk5YWW+d<@nQj`ibTGB+iL#fg#Hiw3{^@cL3mY*~n3 zpRQ3DVp$tA@Np88!mktM&22xRb#l7Ey>40&U)usMtVw04#itv4Wjl{w-=MQki3A&_7BL43fBO3UymqmKW(X#w zam*a->Bdl~7js(^p|@_riT!zep;fGd;J?Xpb5`@NzDB?9U~VZQ3}0bVT#Q#LXWhExGeWz`Y_7DDMCWqU%)}&;13CG4xHg=8XpJ;~| zfq$N7#>{mjh*T(#KxoyN*yJ{Y&(ywM?$m%x{5P{Cr{3CZC4si_ZBK*W@8@+3%_0;u zb`Of=Mq8@~%%VMlv0=+x^AA`bs1y%8FM#yHcui;=7jta)o*+Zz0BN$KrAFFQ8;CU# zw=n$FQ7^n7{GJrk1Qk@t+wT2fk24DQbk}prLUzvsO+QSeXKEYR8y$kjrj}h$&8coL z=QJH^GlD82*eBq5{0}VgH`Iu5hVa;PQD;|W<=}O$c^=lMC8mYAM~EMG9s5X0pDJOi zxaaB0RxNhm^gRg)aqWzH1UkiPy;;Fb3jzMzPjifqG-GgPARN=@O{S~1{{G)Y#Qy~N z=W$r3`$X1Nm|25kG&k#lMEmF!@xNP(E)xWB&@{`X4s6)C3N8oBdFC%(T8{r%`IrF~ zJ)07q);r9?>ny^>1hQW^rtCCaf|9neR8F?iKYg8k#}t@c5h zYUx5cUK+tE`Y2iO3rYncIu1k*Q^U7qrLN=j=&5QXAQx~chBg)9?ErB^qS*>f1cbkh&_oHA=IkelkERo+D8DL4Qd*bh3{kM7=j6|42JrF_B-zvSbZ>DuG=Eb2*;> zA8GF$*3_1TjbBl0D5z)#RL?ka=UYFSl&pa#ZkK zU!a9uyL1Q5dK@OGW>U;B*HIl$$(`q`csyQ#4k7cDEt$!jfR%UV30_6mL}h3C1*GCT zq#aSO(gk}GVJG`TFcQHZ)_+vLE|KkiwYgC#f$N7+;UEjx$RbcV-Vpn0|CW` zk+BJs5AE+!+imO^0n!dQ1r((T^!!r1dh7V?g}-Y=f;|+>?!lKHCp_9@4&;PO%MxnW zG?2>uQ=yrGKEfA2Ih_O7r#n8DBBWYPs1HkKJ{Y=~MDL05m7NM-**O6?7`i&t4!#UnNbk&4{WE`> zG&+}OJN5fU4c2|g;qo+qpl%Qsz;OWQC{hdZ-);v8>xe#KU0)j3p~luMfF&krPPm&FtX}Cr0gWvZ^W;=KgJzzc-{| z-R{kaH*x3!7Gz|bfVYJGgQkH?pMiG~fgfopyG(rh%LhxykIrSc0_FF@!U|@#m0XnH zl#+w;KV2`+E<#Ye&6BMtui(Em&-StHgk-nMH)ccX zzekfHZ81>5$-Gl?fWCFE%YT*$es|~pX^;OwSpV{4a**-$x(YO6wsbSL8`m*StTr9z zC)MaZ|I*8Jkc^bIBH4Ig^se5lTem;kzBFApI4(OC4I{1fYK&T%=d!k2&Yiby*HU=HMai~XyL7O^$^)K&$AC7HRIX=4*iS6w>(&kn}d7|^vK_}b-~z%zhD z?qSYZ0B;IB^mXI_VT7=?0pD^jh}!nN>}?qcIJro_$soO?;KfToa=1AmKa5xovA<<( zy}5r-5G2B)jHBZ|Yv1z1IN2+Clo(rW;eoPiw=L+YITfW1wZuf%$XPHjuR|`6xJ5oY zBR3m#z>FC^kgw)0Wx!G1lRy4#oYw+rqfe04xHW2cZ`q6ODo|f12a>0&HA>=bT1vB9 zWFxh(9}j0rRyDx~tBIbBK}ZSR1hyze_|#`T_J#Dq%$4VI03Me(omWVUCLE?d^GuZ} z-ET%2o;&Co0DehfKYnZW!O^mPQ)kB>p?W9d&wfptyyL=#znRs|O3{{qj(m_Z(wjp)!^rP}FN+{Qd*kMPY+)*v!_a5)NHmtc1;y zbmjRI^NdSfE3VQBDjsPi0($STuOVx2+I;2b$@t_jG2`^o4c+!RSZ3TncFyn<{eWVb z#L0%RZ&M>52a=uoUA#ugK*d!o=XJS11OMGR$L}$j%f;XvPwQ&wa^Zt`$dJnfe+J}m zB+P#~l7e*IbxIy>R_M()GBuMLN6)1>Mj65?TIUii65iug42viZR}0Zcx7j=tKefbb zRyeMyZL1Dh2ez8vldI6faU;=+OW#Lazx(-oVHn+gD#vI;ZGI0jISlj&LKv9-b|o5I z-HuimfUNYeA)jAF7=j%an3^BoBA6cf8b$oc@Bhy~S38e|kxlncfL_-HjZQ$2FBh!J%oJt(#`BBxS|1+1{n2D9;qEIFTvjw-$wa(!x%{ zfcKtiNTb&J*2#uxsxqbJX9cw9lf>vu;3H2VMdo*B+B!?EABXk}1M9FQuqdiuw5q9DN-LV0XG@}NPUiWtp z{5ekeZ!f%0YZMJM(&uFDUBU0Z8}y+P!bCT)gXQ~(f|$JyDW|3&a1s!H*a+Puod{F0 zRPTJ~q;28lrtfIlMMmWeFZiQX3kIhQ7>47u_7R@A+rBqB?z!~L@j^@e<3=n#8i zfU71JUDj1^1P$!GmLD5t(9(p}fAcRO+)c3Kuq79}a>ydPUT&ejgFfhhgZzu0e3qBT z>aNIgT(VS!-BdAEXV_-YhLybfxTK_iMZ*?;M+P|RBvCLJO+Wnd>A}~d>?1ZCk2?*6 zaL)Nj2l_il(}w~iRvz`kW$FI5*|f7?!vR0PP!5!Px*&5iJHCqT~z*_ZPdogj%Ptdpe)=#)!ctzU4v zah_8?6{#o|~BQ0*%f0^A^@-uhVl4`mBb>V$HP3Wd3WorOH@0mN{Ofxf*5rm`f z@P2Zo+9y&B7FZTgujL$dt;9&bTCeq+vkwH~brBy7){q%Ja#N4P%$+0kb7(9bd}Y{~ zL60C4r&Hsc=&~JpLzd~0YP=y#c=x`3&mMR26Q^P&JW8m1{F&*bU7`4}7u6qzWiRV- zvJSH2Tl_)yZj#}KhmCiu$IkkhCRF!t!{m}wqJr$JIsdFE{K?q<7e6PD(J*3W4!fFg z<<0D~EBdxf+R|!0X5O8lX}0;1~PNeMEAq4D9}j&rFFmDeFth-MNQ<4gvm) z>HNS5>xUmdp>4&3@ArK< zdddDq>c}0#q+&h23o<^+y*{6uK6RcHG| z3JlbU+W>@6P`W^&>wmUgu0p5I{pKq~E`P53FRtzTwDIO_?Lek6Q-u`WG0%p>NyQ4) zF0ZaF26~mA?2=)vfHhSAE{4_Mc-kkFxLXy!bDYk8G<5JKnJuQ>;X3lgx}KE5Rpf%Y zqfkc01b4<9(k}Q#X~{s17GGtU`+dGZQJH7V-B8|^ESB=n)SFc0qhztLA{mhOXu7zD zeK|I>zXWtpC5WP1lN=Mi%Mpcty8Rh$|G-c}rFYNM_kVVEKe6*KBfeUFUQdY!eoC0o zhs5sk>-dN#M<<2%$&U}I-UEmCpHfRMViUZh!`uPYz=uvhrCS~Scs*#5&0e5;OiYHO zZZ7PD^m0{Qv8zUWhUr3$10lVzxTj=McuO^-v}z=!)*bo2PZytkOm+MOk^*#SqH-(xN27%BkN3A%S5o69g#<5lScw8INsQI?wnrj5`m zO_i|kJnN;|Z@wn?tc=0LS#|bVf)1BcX)8cIX&3!%8fM#K=hfWiD|H8Iz*E#c5-=rX zXy#_DpDy^NP_<@22RYe@_&DqUA<|tZGs?h(p(hGLj!I;X@Ciz+RL?X8_cU#pl+D1$ zdBzwGKW)7`C7X>K2PEWeoG^O#W-WY^vG*Vj-?9z!z6W|8^%oM)|L7-Id8kW~E5-~9 z*&AOi@G+=M^)J4Pr`65H*fa-tHL05Rn^_OwTB6&O)eKn;bVmx?3}Inh$@6@gz>dTL z7cV1a54+PSke(7C6M+x#Kvim24|_2nN=kI;VeCi598bk<879l^81vVe1ok5CbIbYh~qWip=k z7TN6Jp~?6GCVv+Sde@jF->AHl4^4WD*|i_#?`-oM9GRxk=A<5jIkb^Zjp8N8llJpj zth2+wndIyqOW@mZQM~;x_x(F|{=BpQ@OC<&CM_SW<8@j~7er(O&RT(XrI&vED*trSTA| zE1?702|_+~t?D(-qC3JP3$}UURoorxafoJe0imJnGc_~mvT1AQ8uqUs@(&sq{E!;g z?6TARbg-@$f@=wC2+mU0I7BOXl$uf}@yi7Dd-LIW9D>XF8%JNh^&TtYOSfpRAR%n*$xVxcfIvAeZrwnc^$T=(DSf(w0xANC&#K) zK1T4{*DlN~g8!-j!$_cMUs#-|p;_vWNFrVQCwpH{Je#5;`>Pom0JHGB@H4e|v|n2S4lzumul{EvnB*SEuH`5Ek; z=|9}lB$Vc?vP{S4H003;uSa3%KZXl7n(Vi!uX2TG7`~2hQ7*I;*Y0qW1KfStgOdW%dK*O&g3V1 z9l@*&m}rgat)?$*CU525A3m^=d2H?29Gai;w@V#Lkn#z-oKazY?G2@eDU_W+Oj2uO zLoibq=vIV^t%ZvJ%xj)PdeDv3=-b;$Ras&_1%u!!w1tPw5pZ$I*anoA-sa<=vJ1(< ze5CKu(($5o)s+goaj~h6+?I-=kfUo<>N6!F%%M(!B>tOtM~#H4+FC8B=j8xSSh@J* zR)QJj;a_ZV*EZUdzuldIp81(gUU>VW>n0PdZMk-t&wt5;as*sO%9z?4hZLNk3DY3% zc+efY+QX*5ognzCJLf)ZO-s-0xjk=Ah2ukm$1rk`z+;kf47cLUst(;Z55er4@j{!% zgIk{jD_^yV$#K*@Y_(_?vNs;lc3?nxT=8N=p4)`E-YCEXj@M(v$DM;;=-ZYL_A(7> z+P{&;J6+4*@4F<(@sxVzxfUtwL7?+Yu7m+ccD}K-jG5qZ8lWBBgQ+*04q$X{%h5ka z+J7m2{ei$geVe=rxXduP6WUEfX=ZmhSe3Tt8z0*6D)1?@(KfIxX6@mbK@4ikvW89D z4dT8R@(DI{;2Ml{LFE&;TE3za(EDjhIfaLK{U`wM2hS)|6G7?xYqNVE<^2$ik9fXI zA%kxAEg>!ySq zaf9QJ{&~;A9_k#9Uk#RF>7K#Pn^e10)HyK^Isu&}Yy+k2?!D+(7z^3fFBz{Y8GYFW zx-6t|tY*qeFwiX~FVR86kPr0+T7))=+p@X7^hJFsQd&%85w>CBFECt*AJBI4kYGqA z_QBd?2+WSg)NDZzSR!-K=f&P9YQmBBH;G*;2@%=U*YIx_nGc~zI@VmR73BbMfm8f%Ug-i!fW;?ZN2!;{LCKwKiWAL&EO?Z z(}PExtP$*|*sHbDzSbibLvNLim@jdskly)+hqnBrs!p02VLL)iSc$#rjXm(!hG_ue)~dPm3Jy)CPmc^^;1 zx+KGj-8i$4Tvc4QB!f3w#MXHnapHn;tyFyL1po?tx5 zSL8i#AnMb%6}pE@ESS%2C!l@pN6lB2=?*qBvc==6YHYub;c7>_(L2_XGFbXcSxfDa z%t4~edo^gk3@mU->3Ki_fom>2PP8T{N_uZpLjSWF+QhzeVJ=WzqFLWX3j<%0T)uh2 zOQX-&5c+W~W@R68iAu@kE@O!>p-A0>DQJDxz$XcroWCo2VsC!V!g%tigp^*8OHvjm z?*?ug$_^<==w=oKE)3eP_=-?v%nw@gulAN9I_IJH%JYOx02A*|33&F!U_y1lD2**;?Ryc*p{6Lo6n* zAQ?^a$%Pe_I~y`VV!MeQ4l+ZN)r0YY?crB{kNSSXuu=aK$8W2J>$jwSa)wpG-~d!= z<^oiqOq86uYQZr%T1S;H_$w$qJ*bod+$kA0wNH{j%V2+xphB_KC1}wd`>*TBNd$1| zsUoKB)a}GOh9~!`S%hL9(rxuCSvS8tFk1YCz`XqS+@S!#BPcK2GsxtIcwCfSWfka9 zCwS(pjG6ZzLzSTAE%SiD&mDR&1Ot)m6Q{ANuF=q5m<+Stx8wpj7WW z@UW@`5$h?okzxeXyya25tNDcvxb6ztigyEwhknv`MZ60(eWfJsSdjE+hg=!6IXW{TnJC&MM8sg;#DIwk*>*DNt8+Tw!YOr^l$qTy*mb5_u(TIWkr zT6|k@E9=Jr?RcI8kaaI`B02h1M9|WP^fz#Kv7xj7{qkc}4qu2E*+mzY4x0@@2ogjd zF`ay3C8>dUc-?>a$(}Auu6!oib(~ewkM7u8xmobt_%t$Z^CeuC`ESZt!9&l?nl!lM z)unS{@DpEfQPZa56_zoGNhZDxSz8x}k3l@$#TAWIUG`R-N(%;&UM|f`x6Uty2`E-i z#+r^2vRQYik@CWpz;!#)S9$ar(*Ld0} zw3c{!0TUSNYkknzBAIYvyg!HUE!dX#@+_0c#LPmxN96bRb2Oq)3tmktXO84Mn~e3tqL_$6y7!C z4Gc4vbEbR5#AU2Jss>n2M(!pZm9XQ?ovwIE7J8~N^4)d_HeO2BS*r3Bdz=7M9LqjT z%OFMz+6RW`m*d_#dDoAM@3-x1+^V|0y7m%M(7R>$E&I^Bi`VHcJ{-6!FRQe6+SqdA zMjQK=zoAk>W=;Qfy9-fttkgub@sgbXmJ3|h_zo{^tG>>KrUEbDbhPfiL&7gk}N zl>`kwZx*ffqFrV>EJxYcM0jP<8>{aKc5`S#6|~*^TjvCp+(ej9Nf;}a5dM`D{8z#A zPqSQmNZST?DC1XABsHw;*F^zd=TdXuh0aR%{0l9X-d0exJKPb!zR>TeSA!1;J&(kk zNh+%SXq64Opm zl>k4~^H2=Dwy@N6)W?7$i;WP0JSP^<+Hdzw*-*poreq?lpxg*41ikL&ZnhUhEXkpBK14QvUfbPjM$#7+7 zGGso*X)}Eq<0n1y3q|<3LjTorHf~=?(P&4-a;R~cM)~6ceT_`ji(+E7myy-^OCU;{ zt!m`;X8>^K6gwU21!$IxNr8-6d1;$hO4JX&+zIfos~x2B1(%}RDx%EMGl80L$CJB9 zmM&b1k2XflOzB-!hUrV1rcwhcS$z|Jp#2axwc^x!y+eY>_-IkYz(=BKjro(#Rs}RO zbbrRSpIXlpUoV5q2)JDQZ!7n&a6}#oSV;}<)v`6U(F`i zqDX2)I8Zqpeoc5#Y*22dzUy;7A=!Fcn69YRhHj^3L^!7PrJ$>|>|C^&3}`psYNTzq zaFiH>A@o68u2gK?Hm^6pM&Je=wES`?l;OKuwhi!wWMVP#3#rTBWt=~%MtHx^S|ZYJ z--EjZ4f3V`N#6capZdQo;6hmAkMxn2y%NOp5+341G4E?wEOpOZ^^iPVlvt8?_tB{S z4%DDjFZ8idOXT~hNl7@37|ynN*>CB*j|ln`DqG}fDxb1$7u^d??lnc{pnWIJ zcthriX?OH%^MxKQ{@L{9Oajofo@|?1)H4PYLP&)qV1uli+Ux-%; z-Rv6N{wFe#yM&lg|HJz+w7fZvW1)CZd!bb%C3OHWIX38L`*}gy`qQs(82rK*elowm zydag|s34J{X06#nu|Dwq4BU+r1bafnN=`-T2gZIF#1Ai&=oq@vMRcNW2SLGOxRlK8 zkAo4su*mzR1Lp-_3&R^53}L+Dd9fKfCtw&*F^|*RE(M>b((}Asx4G?OMC z)0lprgECJ&{qbiAc}~9ZSb&g93{iIV+nC9ceff?fq4G|Zp4?*5&?nHKvwjYCdpuz7 zxZx8Oq;t^1SyBe9c(_g?alJTyuWU0zHWUYP;_C5K28cQ+H~63S)RkgckT$JE+K_jo~&cKr3kYciC?%{=xs5^F9f zw}2>WqV+WyPiI9XuwuMIT5Rj0j8=`Xz)dgx@p#%}IxL{E_;Q7^M_rvd4Rc^nJBdNX3DdTW zvn}jZW#T55r?ZeXjpH!F%0fMgfAQR_IX@_l8ijYB_9y)bo}p0|65~R0BxEpQ0XVwH zLr_XL(4iOI%2G>v$W6c@`eaaXXu@Y&*yhnuY&plJ@v|&K75FQIT7=J`IgI5--Lz+w z7Q&+~3IvUeiFU_zn$7^0>pYZ~*;i z@HwjiZ)uue!C9me?kLOADiRkxS_#ph=L$hiZYkW-$w2($y(ko8jDHR=)w?gzl9P1+ zJh4-7A1T7@(nnsFFw8pxiD4LdPIII$L2Tv^)c)_^-kS&Kb>m#c80oo5e(y0LsdC;* zX7HC@N?np*kq~lZA~wmjFtJjxFQLQk7$*7%RP1 z-{9t_isudIm{b76xl^dhL3RSFDY)sz9Lk70+293)xJ0bQ(wu5hu(8(KOUNu>tuo$w z>z_@uYbx%d7Rm3Cow=ARcDJjL7Lm!tYPzr3YD#$RmD8NdSTs=UrSHTsQsaKx^IcR- z1e$J-I_C|!8Rt0$%I*-GSJ`YyM#V!x@kb2}A)%6VHl{SFU5DR`DVSXr-pxM8ko>{x|ndShU2S+>5nHQ8rA2tiwL)bfbcwoYN_e*VN1R08oTLF#e)?x=k z$N;rceRr04mY0sCYDH(-HTWs%6Y0C3OmS%bba&2P<;THOELgzerx`MGBE@qL`Ak|E z*{;w7n4FG05{k8+z3uKW((nYsgbRK_dDwtdyRs>>c|P4%V=+d~X+dVpYblDvyKB_V zi|+qRzxfMa{CygJw}1Z_;(Lj99_}WIgGDThQkFQ>ax`)^hS%Q8Ez|2ybp=RIKO!d0 zqrQ(-4l?v`U%%3^93bI`eQn(ELy5>Q1U_Q1Cf&w@^2s^}^WO^&yMiQj(hv*aaR%Ks z!K{+JBo(cD2CUM@4fgT(LM^w7b%=~Po&D;5Iv*v~hIh9RZjP3mbuxE|ncUuBTRRmN zLO?p{ELyVCNL1G_Amf3~w&#Z=`01kK`=4b^O3j@mJ?4zQ zzdW?M2ljUN8ksV$lr--D9TPVeyIC3iv*R53&ijsTe-7XY&>d7+k(F($IZ4XlQh>YoTQPWUl;7 zK{~xh&;%|-pi#JcIU#yCzwK9{d+a3ffr1g(3peX!>RWN?>TcZaV ze56+HCm>uogTF1}?**v2AC8kIiaLwwsY!U-nS~6Jc|(yMW*4NtIAL}qpu@i<(fclw zV)FwVI;*9RZY~ydAxlGBcd;&XA!$AH%NxlCA6xh4YCW^7E&bo2cX|s40Rtb{i_t{v z9DULWA6ABC55VMt^q_Y#!Sm93XQEg0Kjp1#f{LJaGU>XTbVhjruu53@s6CZ2Nn=_{$42(RSmGBa|S9gPVu|>@SR;^#6-VmZRcGXB|vwjjMK`hGh4ST zWYygd7QHZPR`Aw4wj{YL9Xu*1SBWCOZ`fzjy6JLeUQ*dGG(y=ySF8Lx&ht$Z?zOiH zRw>+Z1}z86R79oOHGjq<^GDbJw8(gyETF-!UvAcQ>gdsa-dk--2N8Me-q8!+fNCFxcchzPvI2l;9|7rx}CuOKs;6VL+ z^iLLWqi1W(zpfv>W6ShD%d2`GaR~M+*;EbC?eG?$yIopu zw*6Sz=qgxqq=5R;W)vLlgEnxX>fF$ACQy*A%sJObCmj2dofJj4{bd{MH&{Fqaf;i+ z3Rcw^@_;i{gC>5hmxD8ug+Z_B{pu0_e;mMHISQ#(I9BI2^-A*W z3M8vgWh~e!|DqNjjUD?M4F>yMK9u3gjg{rk)masx#R}>07eMiC@#18I`rA6gdoXNEHl0&2CGiVRE2?p^>J=E6(MB#o=gg8DQ661uq z@E0uL$T4*;>dTT5R#Ja7l~|Rfbq5p<#bRg@Yn0^7bS118@CGuO5&O-y@p}rR*{hZC z(1LGqV%C6Tc~RAq^oG7&#YV2%XrBxI4y&R2pc8_!Bk&=>h>dZNcRxzfFw!w^P8G#% zuQ6h7J7kk_)XAD|#p8Nw=_gv6wxi_sOazBKmKi7GqAy~mnU`_5vgEqGdsGdSKaLxq zY1gM=bMRhpc97|GJLsB=%Pq}JJ(rnJA5jkNRE`;};4ouzCmFtwStK#TkhrBttwRP2 zlXYUKZ?Lek$k_zOjJ`jBQt>fsyu>iFaEvDH$RE{8|LNxcYL)-=H>vPrHsmQQZ~{G- z&%#Q#vX(iqE%yZANUueCSL%t(NV>$(4~V{)1fCWBGn*TXIz#>G$esDJLEf9DJp_aw zr|$dZ$}Zet#Jy8E)4n)$PF=?J<}Kzv7SJ!VU&6gA8t<>LfnNmYf{WvU{K3 zGlCjh7z@T_k@`kbBY^fzf?Ryyb`I>^XIZhqE4QeN6z4D`WN%sKnKin??%fa5_wThO zA8zV>2LJ?pU8jZYCj_4{jrlMyo`IxwL_<&1QjtQbTJu2;Z_Egfk?-Ndr+HDVP4lr) zHQzVS$R$ku9oKFmNz=bnzZ3Pq4>)#bvt(Ou6@oRCW;@ufPMz6K`dGb?5Z49A92y2fD9eYsBUc8P4YcSuyMuf;9;FjeJHh^xCMO;COR6hmxdZGoCn1$FwVYZN z-=-93PrgyOhLiVXb@$7uSxghXE_NFkR)o3ID_O7I32Hx+E-Yn=)*BVQK0Kb<>Wv22 z`k|9B1kCB4w`yHT8$fPN+6AxkFF(9H{mMu|!N&%=-uw0SaD!rwymr=rAlKUV=eN9L z*sd9-{I^eb@O`6YoF`hUraEMmQgYq6Kex~1={E@b#g?PA`Xog@^C;2jH60Ps^aJH& zmT@w0UNd7yr=rwGo7d>`-6YGeoH{~S8+m;JGr0$P8d=z1M+!KryQ~?ZLbKoS6t>it z7q2q=_F!(f;W8t0X$fIZH~oR%LB-(q_X&2-o!Aga4Hi^>0aDq*!Sic_sQ>Jv^pEp{ z{*O(W8l8AV7=cfS%&{|DkQg$2;o*pP=i`aS=lm9;bTE3ZNKd~x{>JqS$H>yT^PL+h zeI7jBm3O$7WoB{n$;}#wdYqcDWS(F{(Ruej~1%IT|YYVbv>Py z{(0O2wR7T-z`K*O4xv%H)qahX>&rz&Je#Lt9)KmjVzcUCkF-VfKI`4`gPrkwpt8OV z8QJ4Zs`0oLdZa7jvx{S6<2XX@Ga;Vu0!XiRTz%qdIhk?bZUH)-W-B z#n;QqtF~Fs6!s#hh@nn1@A|bYNm4Ho&uhk|8!f% z#mH9FE0<3^7Q3hwCCXbi#`IXnJTqE3{h7X1FVfMeyTQIqFM^ar>No*(>~-v~b+k zuk;{DQV-YS%@2FhxpH24HG%OQN48ChLjp@{T1FIV)}J%G&I* z&sycPWLicI=oe7W(U`b>v~LZd_N1%1~A2d!cHQ%6{?8@@aFjr2)jk>{Ae zCD*HG7^@%beyFK)rb}}#a|7wk7Lpsh$u7hA*JPhT-7B0Ajdez`@)q(XgE92kY)G67 zf1%lhYx(E(e{YcZ|J+fy{$lW{=c@j~?wyCi8V#!sK0%KICyXh@-MdNlmWN%ZB#rP4{(iHjK)q5zU@Yiw=lVY}6L>7s4N+)7U!XLU!*0KWfo$c!M-iF_tFL zn>7~aI>Hee&p{zKCERJ!KkXXOjS@F(RTj2hUxmjD_YFL3gFUxk<0mYS85@M`IduCj z^)86o1pwqqcUH*aEwB+z@nVy4-yCGB&@Qz~ti2U9`YR&NzGfRt4=TN_Rrqc;pPGYVY9lSG^QRv8b=c z#T5p=I_Z-6-?$v66QPv4t8;Xp{rK7Qd;^;>mf`&w}+ z^zrw(_e$zcSL+=0po?sp*d>lVC%^qi-SKYxr``Sk%{H)bzB|L6`|R;aJ;2;U1BWkHAJo~0?54kX^}+#_@rWFtyvvs1qhy!c zz`uQcE2V7o;=9#eH22-8S12iX+eLjkz8_>W_^})VvT2cgO*TZ-v+h zJgy6S^}@MUB6O<<39i(;#C&@9UF(Zkm`W3rC7;8+fw@fd8b`5Sj^UMkx*6{)Yib_N zZ_Oxp*B*Ft7bgp-qdPCvj*%tXejuoHKeOx34IEu1|nxkKdB*iM&G#Bd0RtTZHT3 zjbwJM`iiu6Z`mmp83_vttq-K0;?*s4i{W6_|4N_g++(cPYoUBCw)UpNO!3##n%BaA zZ4Up#pE`^GIJ#`mRkj#ks*s}nuvP03kF!!xcUx6K=<4u$EU@7sh#zs;Ag zx!l(Nk4>({W(4Sp1l_2!NeAJ~jvR$*;mCoCEJ`Qy=G6+`@V^NS;I6syeZd%Q zF0ZLkfZ=tU6TK~QH)4+2U+6J2*Rjo`gPB7jzu`RMnhu4v*RK&~8mGv&^p;w^(~YpM zZkKmA52W^}_*{8lIZGXmsI<5;eH<%eH2m__3*gODg+6c#;?O z&h1N_^^FB?%kJA|r(b?TIVn1W#+^0z+kB#tRanGwLQ9SzrH^w4_r9%P-2Uc=iLH2G zFGH&Cb@vet+<7m9>(#gCXNB&qH(*`%1?R&NPPe=3xKf_HgoJ9=i%d=IwiQI3=t)WY zQk&B6+}7>H^n9SC_-x(V=ht|iD*MLzEMwZLF3cBHzEZo(zwXsgh$6ldVbHSr@^#^K z&g3%~&n+H!eZ*nRCyWE*KC9^M7LO|%>IVUJ+UbJ_ygk3l zxC+;cyY{p`j(S``a)GVUV-CF_=lC}pFWHy{DN?;e{f|iCc}DW3mh~ZSK=^EE+^RjK zKQe+MV4%hcy~_EQ1ibPgZOU(}fI#zM!P7ixk(PtQnsZ`L~4$0lmN8)JK5Xg6!~K)w2=q~pVhp^s4!L$0AB>9;y; zYmO$4zj{FyDnRK4<;O|drx(5fiH4ve6SWt89!83)`4>xs2KP#mBSubU4jc5(Z1|to z*0>H~x;cVSP82TR#y8Z$+Pf?bpx3~%Te?c`heg13`z5X^FRO=uJC`pU^(zYUyx|A@ z;G=gYC9SZ7x$v*|(f`6toSA}Oi1`{=-8xVS3X>`hng{RQy|9BJ*GxQ3skp$?A~he9 zwVaUhRXAyUd_Ngj+|tn{J0cQ^MQEmxT0 zdq0X!nd%W%v=&P`!?lmp__(c{4g#U9pQz=%Um~FC{GNQg7oqy)tHNJdVrRD>2B+1O z!#jp%i1V{(;Vln(-8UFF_Zdq4(NnRYQHC1R<&da`<70t$ZJ`VyqKTMtOvSD&b zZuowWk@|U)kP2goyV%R z*&y6R(#j^SD)Dtg-xUp|$mUAUiNWK85a}}_VfO4|7y6gn$UqA|gw;rAE_XhivV#Ne{Lk#%I$)ufVy50R&iXyhr&!i{H*!RYrb z!T!cMu}C)#c*6z8JyL#Q-Ft@7=b;Z?>Vc^aGv%CXJf5L7?Q5yXl&uNlu9}oF8~+qB zMeQsvp89`EC-_VerR>VdPfj7Q%eU%$X{+sb>ka@X6{B>u!QtIacd!ZXWNU`Zd3mX{?WeC(n1!?I0PmRY)ByQ z)^>ynZdN^+*@zj+^W6{FZ#CH2-nFy$gJmiCv zj|)J$$X7k#dmE{ZsF-2)JpsYbo0^A*-)!xJVaXHr4RS;K9^W$N;hQckiNdfxl#S%* zf+i%y*&CdMZld*)s;}ibADA>dMeIY}-Q0b%XH?R6?_eLkDSR%_Sq%~yNbmP#ny^mS zz+gJ^21vcT7hneAft>@(y?}|?<|I79qX-gG>;o1GDAwIbA?q7N0l|wK?U0b!C)-=$ z{DMzs_V+JH={M}Q1c6-$ zJ#zplVK-p;2--GfIhTrRb;ZWS-WNrvy>IVFM4ek0M>uuHTt_}ewLX8zn)p^0m-PLz zU>uY5m*M`<;iC5qHRF`P42baakH8b-E5Kwjk$fQh<dH5i<97?{;p zGx~Il7(1(rs@wv< zzF*CrQHMuulGhR(F%h+HzvtUhYD%E);V-nRF3-S1QeQ5~*3KXLK3#jE*3ntV7UEMa z2a@1?etX4|a|9@vPyZ_AHy?Ekzg+~Ec9ZQ>yjDz}zv-7tEn{e=#HfhhwyRodL|!a{ zw})fTm4MJ!oz3gSvvV`s<>wr<3TIg_Y*lrj&fxYBFr8JOzP{-Cgdp%76O(-{E3Kt^ zwu@V}cj}GxB@pk?L5sJ3S5#~;AB36#W1z5%Lsp~8WxbOLn= z4RX5k8`j_-W37LT#qPj-M(|#Bawo>^fkXR0#zy|z*o6)2z#n71sACPsD`7r3yjN-8 zJzc)%xqC+WEv@L>zE&&1$kKfXj5f)n6AN+NsKP)(cKnP-@#UN7A@EYhp&xl|ftpA3 zuK|6P8DA*7CR9dktVso5K*26Fu+}{DMN9>3Kj?PS1Rq(7VuXQgTrj=rq6I#^QTN5ghlsjW9o?~tn^p#RT$#^v2!g@$KJ`8%z>cByjotbvSOm&tNmvu4k+T0V$%qY`qx8Fhv1Wsk#;KlhiAPaEZ zEDI!1fIsb)w#asRV&1}XU52=ZIa?NC2rGZrM$xLO?X=0W=IbM`G&nsKP`2k7ckZn# zDA)LcXS!O0z|IH%A8B757FYIV8{9p(6c8l1yK6|WB)D5}cXtoL0tpb@-CYYWf;)u5 z-5m<&ReHMTH#4vMeKYg^34!9fRGoXz*=w)0_TKTp8)ODNdyl8FK5){rz^?j*k^iTk zPObNgyJHfKtz%!=o?JEMGV^i%wY>Shlf28Po{lPQzPG=Z`RCVAQTcP-D@bzW(pi`< z_}F$Y*nt7zwSx{SjbPMP!=Z?fA`GfecIRl)y5eTnLc!h34nto%kbmo0c%{!;iT`|2 zFO9FlfJzkvo@PIuqE!*ZCR=M&j!%HPNB|2=^uW7S9s{Kgh#mEka%zJ;T3Iq+h2931 z5+v6^W3U(v^rCOZ`celPTN_K4kJ1~nt;0RpIPJwyfD$(Qxz{YhLorq*cCf8c!W#`g zIGkZnV7ABw9-s_l3k1{ukbV3h_39Q4ksF*H?5>I~ypO_VD-%SDrBZ}-``|!uuta{R zhI17ppY#!Uc))`PKH)@Q{{siPzKXMmyomn-g2-0^SCa3pRz4c)`G12F@(+ zF9S#=M)Yx2_PRXQEX=^Mq(PB;4xsc`R=S(}&gdEX_n8perC+bk>)9zqJX(fyJJQ-e z7p9*UJEb*#m1YDoZ-?jEIPw=d2n$_qh(`4W8AUS)(A*?kx!tPQ9egvwU*M`)w&l@W zxooXukjMenkw_Y9LA_YP->=suE5m-T6_38T=nxx0lRosrdz{$hcb2n27o_p}pl5lB zEb!tsSWt9X+Da_4G1b|I0y?9qNdR^))tTsz|FXabH8se>(g>AfX7#Y7xN*=)%Bq*# zgxXYk6Aj@tP(rfx5Q*Q8sh`rmelpX$k8h7z{}O!U_XAX=*;|pdgbXm{KUEX zI6hpe6@?H*OMK2+8ds&%@d}bv4zjyKz502o#D55-!aDdo@NwIk+LF6uMmEY zKE?-!rQ*|2CjRV4M|8oubKcDzKuu_@ezwNIg{vT7*wYo^a{d+GYRBZJP%0Yxq?l|l z^Gx8K9%u0Oi=~Q}*RQG5tCb7?u-slSU36_l zi_hf8SOggcUi6+*+Su0*mQjy8i@JaH0=T8;RZ}+d8)RGjx%Q#gwPlVl1OL|{B8dp* zh1_s*#sam|=*Zsoklag)xYyVha_XtZulSggA=KJcKrvR!B?A@<=#0tZvTBaN6~uPo z-Vk4e)N*6LV#W{~qzieq?W;@7$gSez_U{vRm+NPr-!dk)-EnLO??#{N0U8gIT5a4h zm}SnEyqEu+H~612v%tzW=#($NEq?@L@j!Vr7gZIdUr=y9eYjU4TCgmx&_eMT_Xb_W zh$(0O({6plpX5>?_-$u_D#7E(0OA$BASU}Veurf|_Iq*+Ap25p03#jZOYld<>9M4| zu|0(dxS|za1F6GmtoEh}N}Mb&4RUDmm34b`oJ{n-Ti26fi0_?&0NuV$q1Rw&%K%PF zk%GyKOTs4o#n%>)dK|G#8MmSE{_{Os_|e%%Uk9>Ai@!)Dl4Yp)P#npE zKBtYV*loX!hijNf?sQz};9_P2!H0@qkSWa;QKW){cTN&|-o}Qd>Tc`hIuc;!o&(&0 zVJ5FIJ9r}kH%@sxUjT&fMq*A0iAatyVvERm>0YzSO)PFIojd$bHJ1Ohx-h7^0GKIM zmS9gTr$qot#I*~5;9Z>`=n?nod*(D=5hP{B{%%P$UJMH~3{u}LdpfaxetAJJ>vOO- zYZR|!5hgG##A%;8k9k35TN~qvXJ&l3I2DoI%)|Z}^HXBmxO;b|S(R`{h$d)&aSK(x-wRp}KQnO0K)~fVA zKwy4uA!WQWx|fzCqIta6W%zO5u&jp1aK}PNw>y-qmYZL$Inu}Nx0KTYAz=|BAZdX( zQeb}1^Z9AdzO?)PTO!HFR2)2BHaLoZKWP5Tntgu>)#+$Go8n*_8$0Qv@x0It7Be_r zh0_HOIPuYl>CD^fM5o?_dP$;QQ-p^EOqw*f9%$9iqW-zJSFdp$ zisNcIs8(ffMZGdUSobu#DCD`Tp14LF<6ZFPtUfv{zheEKH+1_&DoF5xq?L zJqoyDQYnL6_Aem;f?HoPZ2UuMU;X^pZTw>Ha=#lIa=K)yV`_d^14ZL@_x zBizkx0BbkyDc}~ak=7iiFOL0cXWlWRikSX?j+$B}z)f~?g?yJ-7kxZwXum5NNE6zI z-R5v%H!(SOXv`Hdr8nLcjd4$w3GgJ>4>P$R)Rag`h#e-{CeBjLUyj~68H~cR`q-W8 z&~dxn?+I2Xr{_G-iEaS-AkSIVUH9M8DuNeYIZZ0hnN3VF@EJs2`F*p^!^kL9oJ}ZV z<3spXZnzwtns94WM!2nbKpgMw@)Kexbmn1}jP%T77I~N^f6?B9ih26?Rk0d& z3BT;(CW0M3V_rG#iGFQg@VS{>K18N9Od9GL}%?0<8K`nkED8A%c4)h zcjPC{XmjJR-}_J5%bLXAhb`Q|S1DjEKf#RIF5Z!HxA)c<$TzjQ;{-ZD7EN13_{fO}sLq3&8S z&H-xLdkz=6pd^VOj@~;YpJaU%v^44N`Cf;=?OgJSrTPsG(@!hh3!c$m0$k5QazD3y z(!x1k3#3mZhwa@B%GAB;(kD)k-wd#wrXLqQ0r%M2JiCgi?n||Yyy`oO8#qCe@6LLY z%*JWxZsYqt^5vn3-$>_yg!q z8w&NxIVn<^&kd_w^T*oqZ+Lnb4)bVp&0=G`NmT|wuinn(0?s3{>1||QrlPkK#Q!DbpZ$}RcGM!imkW$z^Cpv4Xb4d7L;HMI^?XPBum3h%m{xawZ=_+1TF_ssAPN{@o4vlYi~3M{}93QxJ&9F>rqF zH|EWLJm@tr>W~Jx58BqP*qJJfVe$=8pA1>}!d@^T>Q=;`QA-Kh*LV})Jy=R-GSX)D zwqZs!0WPGveVU_h$w8kcl{KW578t~$9?^@+2HV2m{TVezH*t8b!?%3tnD&TikkMJ@ z`n?JtTudyNf4Zdj_TXjZ#4^jS>peefh{1m0bv|G5a ztD&2GGgcreXsG|COe2;^x^dL@jh=3!i>MWk7 zS(vUewicb#$#fn<ZlJN$XfpID=+^^|3h*mRr z?`J;57Ks(5zmBxQY+5Hlbm6no?Xtzfgylvct0e4UooX>9`I@65)_~G0eC-cIU&ZrXO@`~X_vqne`}fk z$Ccx!J$Y&to{q{ukJkKH>*9tz!>6urD+RiVM=qoOQL3}$_H5NX8Q;*CgTIo_D4Fw? ztV@;JbETD%8APHy$uf6;_J1Kvah*>%8Z907tP?YaTD4Mkzn9QYh%%MSk{%f8_d6({ z-+1$=XO2%)YuR@BHV>$-!mBIrVD6H;R&MUAB2fAMqe}U8W*=_}jx0N}_WAj?i5x>}S(tKIGoQ(Gbhm3uir?+3bNeGI-dx zw+B4!n;Oyny>9v6&Wl&o33fxwEEv;v?6G#;u?x3EAPo|#C$UF8o)@)@ZD-!YfWxNQ z2KC~51viw1_!oBOjdZwqlfIXe#)s0SRsF2QI=UCM(kx&C>+7iPx6G`qrahKo z<=f1-XM3`?#@>7|D-I3JH6mp-!KZKE*8F%c=RmZ5D4fy9!Lw(QBSv$2QCo!dBW=vE zRj~l5+UqtXxolqDW+JHONsIz(TEZPH9R!M7w@18SDp-Unq%<$lL*uv{7e1{x;2dD> zEjkcfu;Ma)_{M@ebShaQA#CMxAiqpYYhS~22zuz74X-w%D`S5Y>lap>AyiM*G$;f( zdWhNyn6+iSZgctvKZU`M-+8m;r7-*NhxG#GkvG|uvx!5W3K0h-{Eyf!w;3l&{Yv5! z@bP`7FmsJ)8Bg#{j=|oQ7xDq2ZI}6Qy;x<8RhY`WqP*+~1v!MTVEO&oX9*Fr(&PTq zI6R!x%XSO%KU09kL0A+6)gj%s$)!ic+lM?``VofdRMuo5j|UL#)iLEhAyZ_W8w1nF zIPYogGSw=G+?NZpL;8eD;}^@v{`W+P5zcFnNadHyK-)|~-TpjC_jwT6whNHcAp{>JAZIPC3r?xPH=T7~cDC#V3uqE9)y6sqjvvk==i_i(Pf! zTb+h&?_C6Qr4JeHqL^n1VP@SBAHsf0LrXXZ^%lhdZ#{>ZP!N{}GP%I~}<>ro=S6_c%ubxvC zkN7m!*7p?uA!8s;`xxiSO2>_3Z6%-#D>=#X?n+N~-7zt1^zR|j>DF)8Q_{g$uF7fy z_8(wCJcok#Yepe^mZ4eRZJONsH-`~8w<*3uJ|S!c;gW9&GeHobpA=EI*AV%v#@rf1 zi(9fAkwctgJt4@t)bSoIimfT%@EGN0UCV2c7jU4Z#q<{`q@zRGVPDQI_u9OJ^_fV| z_TJH#?8=Pacx4)DNLZs>U{jm469+-IL?0s-qrQ0`HEvn6V%`A!w(2B}^?}bbCS#OF zm5=jjU7e>Nxb)NYS`m%fhOaxVk1Ya`=Bv3km~0gC#${$ ztHDphm5YvYA^xYgLiuKJxUl=qX6J9?A&*6tCbuLjDkD15YIOo-8t?bKN@5TUoVxHa zNdbwgQ6G-6+^DOKZc4i}#tX~z+wGS~q4ZVmiqLfQxd^~uWyDUt6ZKu%KP~RxI8guY zxowOHu)O_FkfH*bHgYM>2h9-e+lp)ypl=uNg}l|Kd9R~T6)x?a%tVNHd*ub`kKrAiKjCS;{-$ADcbS2`4?spu=NvfUCyN$09daHc^k9*b}6CHWM zE|k4U9CLvo<8HG1y6XYHj%`})%}}kT0ZZB3*(A1&zh?iVD#8VUWb7C)%rk)sP*W-+ z`qi0^?wHhFQ6zS&)W(RvQE&5!z39#%4JL^tzgqNjeEZo|nucxN^D^HjW1!)jO1)Mu ze#`j4_St&!mY*ToHu0_kOX$`6s<~3Ox2fM;P%iL4Nx6CwU&wAgY0R3$YPlzASK|OH zlgrNo`c8_`n@13VAi6D1%nLT#Or25$;2V^;jMD$t%<4blS)h(&0Llyd$fUsZtj=g0 zer=I*P9C2R_r}}fp961XTvgIB=lsfoMpM7^6V5qR>V+;XmGY+I=Td_f9f`g5H$_?v zGK>1zCi|eA0Q0|qg?^*~WueccQBNt0gszUsvzs<~r>M5$K+l?I*ca_cFIwqFSjc_cYx*FcJ=4)lhc~4BR8mj5ZM?5JNnWK* z`JL`z2-58f`TMy^(&~1DHeznLEHXHdmhKS=gBp<@{d$Sr z#}8LRE`Yv7_p6qdOx*5c->TL_O#zJhZoWSpuy(@Thlpa>_Ns@C(%9_YnGB6*xcF}Q z*{qyn@a43g?ZsR9WTb0@-5M8uEyeadRr$Irbs9FdQ(xI_lEaVwAQs~bE;1W**8U`E z;uk29X!eS3UEZSl?CRK+INghC7O$rU@TBhpyPRzB9)CDou0&c+ICzUHu z1xXi25$m~@E&#Mr*DY_kA8I{8CC%(P$<;3g)LA5zy(GuP=PZag z`bxF(=uSh&P#o|V+4Zj*`RC4iN9ikn6_yS~EET1lMdX!*0_a6 z6kzPDY5k4_C8FDln56HUnGF;-sR5p*FydF)(xRo~v~Ct(ro z&aNbmc=#V*VTn2Nt!D`^nnOPOjI@cl)dexlG_Tyoa$rBk2!Z*-ue>Gc@-lFmbs*ss z=r1ARWl9=su63mb%O>%=W1kma<$GbdUGRvplWh>Ed~lZ7Y|23AQeGeQDEW}mDSr1( z&0E=KFw21}Y23$A(L6=`NP0A+K5nv*(yz4C3 zkV|2FzwVU6o8TxSRtQDdc)5GBJaf?_cI~agvrEi&9HYN}B^gWBPw=gKPAdAA_y`+{ zxoOi`;|_^-wQ)G!{0arc+ge2Kw8y$yQ?t1yf!^tkt(qJC_H_9f#mr{1JpF;b5V0v{G^1}I# zwiSn7!DJ4r?Npo7oR>BpM6~2Dlve9%=Ql`*)X_BX`Ib)Dx!|3tCEP>JX3d)f!zP!- zvI-%M%$rizJn?EDxtnoEFCcH>;{mfv+W?c0yI zLPe+{;n`kn3o20C>U1kuZ&t6Hjw4*0X5;&}dxwX#g>fy>FGP5cmUZ`A75+$W`KKoF z^UC`LW&vu4z&JV^*4~U(l4>l9U3+Em+NgMJJ=qUWNtn=Kza`xqnP(XKN&*W znw!D;@LVoRGTQNlY4MkfNGKM1Y8-Zz<{!#%aNs_vnuAP-m2k01=*v^3=pr=UegVsw zg?F3M$t5Gl_?{~16dAaKhc-DHcV<(_a;7fS{n@q0aj~|CvRJI*$yH$2iv@Yx+ zk4%?V)3X^*^0bqLeye~+IrJjGqNfj?0qtcUt<(QMf}1>Y-BpNS;fCj|Ek0gIex3nF zPE4;>Md}v}tjdy`m=n$6H|HvTlCKb@Lw{-7eWWvPO;z2X%K$B+J6ptpw!!8O+<;Xa$m5eE&SLfUY-K`rg%G?2Jd(U_u>m`5+Q2a`9f zLmTF*Olgm1KbMpAxALumcSYQ*6(#Lg8F`s%!=U$h2fX7_z&M#ZB^teQPxX_>*cjOM z&eepq-<%LaSS1y;atOi^V6Trn{G&tZZE^i2VJ##py>26`J+aog+HlY~ds%n-cHv zLjJ>M3k1vl29v2tpULw(F|ex`X3WnJ*by5#VwdQpfSxa}Vlp{TywP9$%&P>o*zHfr zRy4na=Ji#X_ap5!sNSs_P-H3AMR@)nI4fu&wahOJyCUkE(eeqn%2hOLpRIJ4og{r3 zbUBowGoM4K*0jx%(tt$P@fwS`eNsAH|K34-iC|Nd88mkyn!gVBm(*1LD(*D2O2J5+ z6#Fq4WA~|+0{VN{smv%F~HN}32=g2?^_cISWQBbZ$pE20}fnoVitoDC_8~=8j zZr-5`4@C$ZNf#`Fz3j15xb0gr?In%bpFgaNi_i^_t_U<($HVWe(Mbw^!rbsNcb_vM zt=6Yne16v)ynCXd!?SQCTmK7$mf(Mgr4>(nmHntEo{06}4R+9P5ao>+;W*jVwfJI0 z@o_g9lX|ehPO|OBf*zVo5iB4Pf(^b()b-`Ft%jAFCnhnI`wXQ=ONe>Gdp!$hTzu7|(m1D#u1ycw@?21lL|9FXh4aRm zi;3e+MJsE(IoP^3nNsLwX5~*Dp0pm8OBLjRUwSMT*$rOg*LXZ=H@ZEsrum;*PA9)~ z{K;u-=29EvmwYxzb2m{}u8jmzDe-S2l2%X6*&Ju3cwTVfbHjVi_p#@R-GaMrO~1!+ zHrv=meMpyB`C=peg$pn9VA-9?!k~z4nkM_aV3PwtQ#Ru$YO+vyiADKtpefnn6zj9Z z$dd#b)8F4k_XzPjOiv0Q5-5Fhh5a6P9S|DAHpu6q&=kJAAwH8P@Yzd;?$F-&H&~ox z5!LtHu^PG!@gp4;B<>{yL&2hqZWrjwz^6{g%yk5@r_`qS&3Fb$FCoOJoMF$yH1mp+ z`*SaU6beG+_03M>K~aI&)_Uh+(ejinnTkCTw9H0?4)c&IEW8Su2%WW~{=0&PhSJ+x ze}?)^t9kAbS|<~SJ#MtB~!(XXXvf|Yh;0$W~0G#}qz++`mIsn&kzW8e1BkFDf zjP*XD>pxt;5jg#M)7P*T)3b+Y798@YS7A zo*Y{p^!s|n-z?Lx+ofFz!hf-3Qyd8cneuB9_LkhVb=K|=I}-rWhT*|Hh8P^1(jcma z#?^Dc7&m-h4kGt?i!g^$UeBVW@YUetLFm$G@=4ox_-BD4M080Jx#=u()mf$TIc90C zx^oRag6Mx;Eb2gtS~rcnjY~z9dD{zcqn>gD`f0pc%k;g^x62Xp{&Y%->q1pN+tD}e z34Who$H}_ndkO8a!&CV~jRu)Jd`pTsZ7dW11s*%Jt z)-A>T!s3L3IEnYH?OuUJPnJ8yiR9?brL^l^$N)!5nNn^B`a0f?d$Mcs<6APe%8$Ii zu(giQsiK=E3BzjnWBpTf^hdWH{eW*(amVDC3%mg*Re%Rl)ue=hlPO!)^DG9arKleW zSNm<-D!#{RQE~0IUZHTIm`W$}xRlTUPb)u)F5Hb~v2;Mvzr|Z&S6W0gGskcB>I!uX z?7u^A01os_7Bra@+pDPA)SJ94ZROtfHVoTz1MJvh-i~0V@(W8vd8}O=t9$-ExI0zD zj%e=q!?wrF5cgiIanv2CDf_uYQ=8K+e)o-HNsH99%9Eb7qb&~}c4alQyVPXvX=n$D z6Ngf><+pO4koWpzbI~K@CUM{LX;aY;d~b0#lfrSP|~{}ZVvPib_{X$W;acpq-;YWLfp`sYBcfIf%IlD?v8 zsweQmr?yMy5gM9b1xvZKKh+9DJzGa+SG&$S>XAOw+0M9dizls(j6hJp!yDEjmEBIk zpQ@Y|2G(9B0CdD|vTInGwIHreH3@UXep_2a#5-)_F`YJEt{gfxB4N@pE8 zCiGCwJeWOr!bD9!0!)0ylpig5 z<~jq~b>qV=Wwxd>(uqE(++(5pC~{nC|E~*{9CXlJd{oAW<6}}LrcfsuY|zGDo8GI6 z?c;u=vc;~fs(VN#o#6-0lPAUE>=>&$HjFoqpYs3V;=&WnpDdy$W7Rx@-*4&R|E1mh_6z3IYMvge&6dsIOY-{kMB?toI%*pDk)}$L8J@*7B;t1nj zysx*iJ+x=!wyg^!2zi$@MNv{Zc#fN;h#W6lQ^ZH`|lEs_p5{OHt(*qe9o93x9>T^{O(_0 zkDsY*`vUNG6z>EVgj$M~Ntv7aKh_~+a!^B3y%BChH}!u(b;m(|5PK*8b=yFz5m2lH z1@48cf-yZV>>Y-Yh2|z}tt?_jR3w^;=w3xO9!xO?PeyF|_s58G4;GF?HXLZPiAc=$ z>$QLumI2?O9QM58e_^;JwzzSDrC7U9Th{01yqNs<4zY-7$g436$=FqUu?M~upjN$P zNQ8#gEMmTfNT{^GlIu$4n~~&HLFO6*KRisUc!R;f{tt)VrpaX^>ClSc_o}z%6M%GP z`b9O0OA_9L-yI9wm0!oXh|qD9#bux>DU2(EOCr-SxvUzf&a(k32@zbJ_BwR>j#Y-v z^Q?4;!#U4VUrWtO9mPd)L`87cNbX#lQ%4Ub7E*APvf})ip7--T`uY~8{EJV0y0IQM z2$U6@6&f6Fla}w-KJ4vm6VelTc$GN`u z_}jH1qYa}CcEIt^#-Gg58NjK#%9JI32Hm$640>Kx15tUdKmb`ED(}`uWJUk={9Kc$ z$fv<%NN(Zqr^ST+F+ft2Ic@Ng*(;M8jMy)S-+h;$b%eA8u^S`=M~=- zwGdM9MW?W%JQotMk~NMUyW0}){`aWwNclQGAQs`KANPNXs}XGDe44#;GNaJm`p^oXtk@!)Lx14& zcxE@@*+GxC%48F#vL>4pQKxX``%|kJ-!)$Hnae_lG=d70kTcXoj;pXpgKwJ%!z!8L*ujeuCn$l*iKU1U)3-0y5PCDo&4SsOsBthY&Dcc z$}ZEUEXEl7lMi!E`b90YE2~=sSzY)rO4@iWTN_h22IA~UQM#(!qBXc9ID!f9E-{I% z{H1Sy0pragC9z5`3KD6)GBm@2XPj|5N{S~MS3LOjNd0EG=|=?0;ud>Fk5we$;Y(x7Mb7k=gxxwBea4dN#-ZTwA`=Fv4$>AJ0BW zxo|8(;p1reD{{@bp1;yG$88kkD*DTlCXABpr=d@kCi=B=$1?xQfLvhet8q8-JqsEO zw2LiXV@cc|jtO1$ue@5I+gZ8H@9a)fgK4&VyfM55JKb&g#AjS)$HehHM$m#wtzqS! zhejy(hW4hrwXENBjSeW7LAZQUQ}5zQHKC7tB#^+^7a{EvJ^lUoLJCzd&D~D>%B?)L zsAAa*!}Z=$#05-_dyBE*;};#`#IMh=X_ay$S5=6{DijRw>z1Xx82nhQo)7J)kR%{h z>5u`mmL~`pEP9oBwyR$bT}z;%(?b$dz>sc6tI4F3%+g@sz@A?q@`eTA~iz=whY1(_wM zYYgyxFmxtwXoib*w2cKBn;k6g{-;!B@&zbG+XkRy)Cb^ZRH|s03)S6ZXB|cIX5kyKu z+!D$yBP%j~5zpH-a@=zJXmYhI-}G;ij$8*S)%vaukt8&LdF!-N^PSDz!fM$V7mj0^ zY-`a9y%ym0+c z=Q$n_4TkEJ6no$i(KYWgHa4u}Y7DZt;lPR7FF>88{j6l>cNRpNnG&lOn|}6Z3gKqe zYQqsT+o;rh$38C9k+3sDc9nQNKD}@lBG>N~IcLu~{sGNn?1tHlZilWpkA8rWoaM9> z*9{naUTap2gBS#?q#2H$on{+<3s1w6Lrjkcs!X~=qY+2ZLl+u4_>h1<-h#8li!s_E zxM5GA7-{TSY5V?%aCjK!(Wlp)VCA0Hh@aO|NXJUHi%GUHLSi``CD-l4a7PA#(ro8Z zhlNuba1+WiWBZvN!*M$m3p0pL$d|6IVIGngRzyL-9d(ztJQX-c*(i*;VyESt>lN>; z;i9CmYAblPr3oK?m_4hkl$29u8@Bc-gckwllxK%fQD72F>AsCUxv*DmNPhM!pA=Gl z;=x4n5Au~b;jiAYrQt6UOMj~M9R4J?lI35)zh)?@Xw;hg`;&+xBg0Tp{`s-~hu?JC zCyCRisT7KQ7Zk@mLYFux7mjh*s3Tlr9UDiH;LYzH7IIZ zZN4T-u-{6xinPWnX~uUoll2o1SlOzdkJVMLP;`upwtS`V%+NbM<=cCJ$U=48TsJ6b zXPSh@yvSPx2gZqeV-+)zAsvEg5E5@nj#KDfoP9W)xP;P*bzU-QBZ)OQH!4y1?5f%AGMxL_`EL? z0cMEAb3+k%X3w}jU?b7Sm>rl3^>*y!=r15;#JNI%w77j43_5J=-J~S z>+p^ZpX&>|nL3{HL(36|3}5hNDRT&aF{-Oyv!^!xk7knd;~64+2Z~j7VkXm_lrzTN z8aASB-sf)hM8fWjTY*EUr*Cf1RTmQXdYicT6L#Y`Wgi;|vpO7moyQ|7ggWvrsA#w<0DaiKVrw2FsVgvqr}Xo5^oXj*-f8`-ca1|Tm+i0wW+O0--^3m(FS9r z)^X@u3um3h35bIyW?@=ZY#uQu1e}*yd{cKtTtB9-#ELbMa!w?qP#Pxp0iN7b)43mE z(FoVE9_{ebk>hx$h1u(s=-2LvS_C7vbK)Ri7UuxUED4*TOUl8w@yahNBmQ_V&|TaV z4ll`?h=B`pYIsN25J)HIpHePLh0F7$h`RP3@JWRYrKnP~~o5xmDa^UW0J*B4H zbB2B>Q1Utakq;+?U@7qdfa|>U|8INfh(yA6NaK@5g_5C6J9ZFwm~m zRjO`nbRpJ(gxsAjO|s1@^=_UR*{2v!`Kc-hBka2c;?s9Z4T1qlw*cJ;x)5ejOKx4SmrhtaP zSaapau_I&7OOpCCif>Vj6Qv$2Kc!!iOC834dLS?+t*5?`&Ry&-ZK9yUB9`=E^@9tt zC6IJSiVr74o$(2_K>K!paM_x*q5WlpmY4HG!b)k7!zyMk%u%-AvQ+ZOD+67LqROu* zFtdn7jcZh7n(G%zJiw&Bow3KT_lD{B@~G`%-><+Ng&l9q1U~cG0K2=LNT==d>DQ!y z3!rPBIqPdMaZ+EGyfh@GxUhe<5nN5)hYM*`Wm=Jtja7gcVpqaA|Lm z`)JvCODJWAq`!eoM;l44%w?@r!~9-?^oF2;@;*0rVh?&I-|!??3V@Z2EXFx?4?HV& zp;l#odd615)B1t>Zn|v0!59-;zmA_xWR{VF>h4E|wSv)oNdLE;i*tSe2H>>W$iBLB zSv7YtNIc8$@(d1R(cBNX@I=Cx{DD?JMt^j6rYK~We^zytWQv1t$Wtbo+S_?4_MKmS zEy`BU``r^J0tnNHz%};61zyV7Ms(kyuQ*?BBp4DOOo#{j&%wf7oYEcXet`A&Zv?Jj z!pH^r8tK}(ZJ+RdJ zj%BQzW$y$5{pGFWeZ**+*yeki58e6-e}=TqcA8b^5+Y4(hm0rq$AN=(XnAG3!*Yg$ zTnKyScq|UqLs+}rUJS;??%Ge##!9ONLHV!=MOz9z`vySI?@kc$RC$6v*5HF2a#iwe zrBdBcy>FwWs$)`zFZun|<40eNvzV4!2fBN_mzk@jr~xe*hM7!OJI*xz0ezS z*M%_T9F(XWd3JOZQ-~**nIkc}Hm)CIP>CeWB1Ks&%l^RZw$^pkb&uG>Fp*b#00o(| z(BP@8pm)D;{45lfKS()Nh{(U(N$G_GnUh)O!=263E&UxL9X`k%FYA*+}Jzo z?8foZnmAe-r0}hZO6<~#BXSr3*b@Ccn_6&ofMI|Ooca?_GhOLbvH!^dBQRpis0Fj93IAajc%$U#||(?}l5 zD3v)bl95nQ)sh2!8oq*xVa#rlDOI=YoVDp9^YPTje!h!2MG)luqbT22vq5c%bZ7u< zZ0jba@X#%WFTq0t;ZU~8?M?M(*cCB^)M?GCxRX}|9=$*V!B&In!LU{pu439bOV_T} zEj|~*9p@1{)fSdTr0j#HcGOYolL)s16cs^~l+FO{fBWzelAhv#O0dam=t4# zpzzB9o=_H(V~GB86y$+AiKyd5%sR^DgCgQ$p&6RU?rIOF^T6s&i3Pn#;F}yYlBckg zFXPd2ZT}CjIsY)twe1`I&q)pIiu&Z zyqZv_{bWOvmN8W-iy7}1U;qq$t6fXX?iWFMjfrc>B8T7=^+Z~EvSSYy|52{ibShV^ zop4sS*+{;h;#wPJvorIlCu=JpX9O8m28oZ&oi`2U_=e-vL&dcY16H`P}M4P3~Gj!99_G3T(d>>oVZ5 zZ@U4Kg<)sinUq%=g(+PX?vLT)ej4^Y?h-ft=Y#sc^-7aDJYqI!3+ioITu#gO+8bCu zvPSH}{T6F20tf5R(!)nnSBdJ*71P!m+uq~JsHlOJ&GV?&%2MXVM-fK?f`R#?vsFYX z*(nnX=rlm&8rzw&(W3W@_TilYMO{HgbE>Tqo{<;YYw`Bp0%d%HiUePxNT&Pm#T%v> ztu~t%+RVBdW$K~bGBS2)^thM?dRRVAewm;pfZr6}wbU!xS`lyc3T}bvHtVSE4Dz?# zuh(3)AH=t6#)Tj8sg4IZQZj2q@thafE-E+(4;*?DBnOKdM4%fJ&b@-lxI&=Y?l>eg z=1ab+xL|Lz>V8k|n|8{9qM232>GeAf2_lRuJPfJ^gkD5R&v`6KUqLGg!^un6J4Sej zPvbJ^sWcnSQWSYRW!lMeA1MQTB+zS7XhIbp;a9F%0)a-9EKv{iE3z1Go0r~CqJ}`h zh1`te_P`DCWj5QID!rPxHUt>n1bdn>@i;}PUCb@62BKtPQDox3dI6B0|IoYjw9#lL zKwG6{EfF7%zF+!;S+(}@%*xED&IY|_Vsi0iz(p?Z$XvCuWoRh25bw<1TaTcsbsSLx zWCSY*v=7k~Jy+wAk=67ePgW?SaNVxu7H?+1w*KM_hXGsy)bn@Vh&pFZNG1fKQhY;x ztUVR&;z1O<-Xn6Z(`Y(Z3?YbQy}Lpftppa$N$oJ`vTe@~94n6r zw@w?#83dV24DoeN1=HWDsJ>+qh=3dlhfslkK}u87dLfd8dK71(1KZymJ5*p+3hA!V zu(5les|C>BEa4b>$n9Ej=gzz_P zdEiB!msUo6$WAZVCADC~RJo2_L-JGf&*C@@$u8RZ{F11n3f1Tefc;h6xG?L*gBTCLbKan|OUp|GqPiVPNprh(mWWS7Z(P*6~065%MqJS78a@E*JqjrAL$4mBdd z@}b$Cz7vWV{ej;a36}gtAc9N#kjKJAGrF7BkvjG~?Mjk1;Fi8D`Y@ZC zQrM_3(H)v8cF~!lfbDQMF0lz#Mo%kKUFNI~~#)ChfAJQrcV6=wN% z4dVaaSaTc$*51PH8>J0WSC!gS?IVK6Qhj^l{Hw5)_ad2I$gvWJ%t%x<!KJtc4-f*Ewf0{7+)ii6Gv8z;lT0Sb_j{lBd7sxp zu+HO<-RzfVd9E5zda;$Aa}26GEgGOK*$~_x8=Gqz&em(04{!Xa6M-X_M0GKr_gYP~{x& zAXh(p<3O{ZLCa-~iTa($Xg~myp0D*9@eb!QRjuLN%y}dgJZl^BvmPN}xibu^fo1K} zonu|M=OUM5s%X3#ga07S`O@m+E28EY2cp;SDH~+w$YJgN6rUfdUD6*|>MBlVUL+q7 z+|zx00rf?5Q@D8_8mY8}`6tnsrK*wE_EsxtPrz#DAW}^5d|HqiOKxZc1k7yyM0t z$1GNN`vwEK?#rOzS#C_J;3KhC*3B+Ye@v%dakf;Y{Go;REwz7*=#a(F7lCp$ErJm`DQeRcfzO*HH_&m)um(w(4nA;YR0*Gtn#pj~#n9z8DeMaRRXAS;s`O+-0>o2-=pts+(5d=dU zXr@j~)k|jS;>%|CYXfcRRb-%y%{rw!V+(P^d-i_`krcQw(sYc`p?*7`8L#2O0Jk){ zezcN3`2a^X5=Ue>K-T^>exlY-OGCLp36R{!WAlCwv(5dhd)FHy?CBD%r_Q1ASnJUQ z^NxlMbgX85^;&@f`96u2=nQrMW^Mm5k;b}Pfp%>%AXL%BzOLV-#VyZF;avFl`^@sX zm(jCc?YySp*!5;8$6pS}+Yb!sa}1h(cC+6`7Ew`IFI4Sn1hqOz7uW?X%Fy5ghVUeR z?Vh`wnuS301w0OtY2Fy$%g=AOQEWef508`Z_~N?o&%D@oef~d@lz(%tVEzb^dH_@@ z?Yzwv)XD^t9Uoy#&9wKo{P%FVL~(NBkF@SEcHDw|5PfsEs-VdC(cvi+s?lkI{dAH& zwP7e?-R#R*D%E_R!EU+Rl4!VGR5css={fBV5>%93{w_ZcI+b3`wy4T~eq z0;Z_LWxx*hyE`Ulw?^D9NVybIVz1;Mmjq0B2U0?6sn6U_{IcrEKMYIp^|m0MB3_Ei zONC%(JA4THNFwDvRaZyY(kIPU(+4bbL1gtq2M%H&JaY*OBS+Ga{PJ)q>WY)P#(&t~ zjwJ3#EDvDS$hFCKcw=kRL0L((65}+vXW9o5;A_Q3I*}J>U?}d<6XhNoONy4EO!61? zU;-cvd|JMyTK4?$F3gL{QC@Kqr3USW>_{a$Y!d#-XP@MO6cG*XQ|n38aZAh#=QJmH zvbP1cA568M={)FM1L<`3jI^=Wr6K3l#JjRNcXynG0%N?E6L|L0`iaMf1LyYy%4vBv zscDGA*wi>Td7jh6>ilJh05N64kvKRMNd%|@#6bvN zXrS5z&v7bX;!G^XZNWtUS0*Hs&xP&AAr7f3hUXI-%L zATU$5muA=?L)liyMq>_hMPZ+R;hOJt^jf-U`1zwJayfGB=@eEHE$eu|-Gp|D%Si_|6|&6cb9vz}qAXsi z@lV`B76yqyHcgF>O;ENrm>Wl;VIv)o$UPA4e2@IWfsDV!S7$Lf;!R)-1(YxX=CHod z&1A?!N7Vk@e~>Ws(St~cG5SAY%|E4;|AF%a9m6BmgpaEu>&=+`3ZvWM3kp7bmhO5# zoM-ZY?3w$)CM_i6jlohdo!+v0AWb2<9xJiAEQ`7fzt|k}sbj$gl_sB(r?Y((*ubS@ zs%P;*gy{~q#Tw8Tz=l+=US+zje)gak7X5B>geS26N%~%E0IJ#TVWX=)3aGWtCyHOn z9y?lc%p>YQ`O+AK){k-L_y(L9gM zKd;|K^=zaaW4|<#{vw?dRrJ8{CfgS;5xJJS6)kT_u?B8JW_tpyU59C-)Ggol${`yp zGzNYDPS`v{87|xv(Qh~+R16@Ea#18+BkHF~no+e!jEY432;?BemaE6aZpc4!Honr=IzoTsY{EUdSA^6&CiA_O;{KVk2}Ov0HXR5_SUdK4W!1V- z&RlEW(?>@bp6~4(>UiW!<(a2ioF`UIny~+#iWbyL8%0$J33N<$6eM$9EF57#{VzpV zlnOhmxByjwu@G`tuyu#P?ea80rO_8?zwW7!QdjWcji2vOLAt=ZR!_&KTTeHx)Rt$x zxN>TaSZ&e_B$$fu8_H|d!-%*ZA3np?{OL8T%e_m5e&BU)fDEfU4hQt2k&_y*%fDzU znG_A2zwE5<{Zk}v2sv+W&ePpbNOSA}uKXZ?}mY#=v*j*PNPw_-DZ%$g(+y<6B; zrxq9+Z)P;=8}6!If;$4z?1#i8G@~fPJaC{GU##DtSI>WTJJky zjugNn6K}ZUDp@QCl+?IFzBm}nef0v#;zo)G$-S`F~Emk^e=1y!)eLgg- zX0BabP=h$Y7dclx2saNPUw@AFMZ~r-)dcHiqr1Zu5s`d@(#{hdRoGYu3A0)ckiXhx}T(!!N2b zfP_A`C9{xpzq`2OGsUHeTi3*a&JN(gSkz4>y-3|svXR`p%0MIxrO&RNFZ6+K^anAg ztu7Z^=g^+yLAhh~;8-Y$zEsC?Y4S7IWc3`ant+6BbsuO=qUM|m2oDUQ3nsaXfm*|h z#DsbP%TyFraNx-rAwJU5neI6CXL{VV*d?aXnqyL*O*W>EyjkH%+yGSiOCPr0B^lVJ zwU)IxV?WN`A)W(_zmfZxy(>$U+>AX;_X|Lm@}{pDboo#pE6@@{oj_Pj!oCL?kek=dtmklW$bj{|F4xVkmVQ|)nPxgpSdVpd#X$8l zwOBmb*2Jprg`B}=;mM4kA(6EPR|j6m*=w%5)?JW3(Z1HXj03xuDOqQxlP=Eh@#~TJ zzeNoW*dOfr!QVRmpe>=o426v6;(n==CDEdYn8*|tR36t$Jz*itXKm6a%UhoY5zztf zy&8mDB5)}!pM6`StvPzQ)cpI#HHybPbgC^B=%$Cam|B7*C@auhEPEJFP`P7t7R#*F zEUDx(luc(#G5Qpr!umpRO|&+6S69<~S1v*h+Ww4=q?8HiP6q$dB3990#rEI9pr9+f z2uw)@K>xXy?C!%f!ZXEa#~vPp)(3g*=u4@}N>$#ar4QSb6k{ed>g<5R5US6*>=1Q; z^yD&;MFM}Qy+lC$GHJy-YAMFHV~wb#b10Vl%D!@NJYQkU2ieUiSRr2FjlK>jPe4mH zcul7@;naJ~TE&hUbQf?Afk9exg|cuSYIQH$17nj`#+tvSKSE$X%F;+$wUY4fmbr?x z8#D7Y4$uX&<9^lz+BMC92p*`n_NS-WUxsop=e?zr`~9UNYPc?N^-1HdRO)$6dM{;n zgB{O&H2r@E5w1ii=;Kk&%$-C<&(+Up!(oOl;$V{<18cATWGOeQ_tcA#A``qvkz##T zqWCmuUO&2YCB@#X8<`h%_+r2`@W-^w=r`ZtGWng{kH>6ch@%Eqs?NeD$yRoC^x#=Z zrzGpA)RI52$%?mQ8!Ay+_O=AkFD`89(_*&%hH3FuF;pad?82O<#*GnquW&~mdY%#X zDmxUIvglBs9QdN1+oankY$qH)N`?8Y1pN4UUxg>OF}l@;?aG}>%a_AS@V4T8qUez% z@q|@h_|lMBch5|t$P(wMRiDNAC+$Y)W9+HMNywrDTX;C%VbO3cKN6cHqK z?Ry<%+mlqBUpeUq*iiB#LBfM$k{uOG;j>wi;3=Ul%7!3AWUQ7Hv(vKUm&s;?qBiv8 z`&usI+Vuei&LxNG=k}F3eo>$))WoS07*g_G2r+nRR=)wDEMJd)i1tzhp$`Xl-Csk# zEYZdN;ngYCIW!qUI;^zX#%?jC|Jl<#1bWUIgV}pkX(dhS$B%ok-EcTVD1K=MZ-b{J zA&w{f&09FPHm?)_{S8$q7M9zi1RLG zKDJm4Vax=f?@o3_=}%<3eR5egJ_6zwY;cjIo!c)xPg}z&J-rIRryn=}WGVNpZZ`F= zLm%od-7~;cb|0+oMY1ES&US(xjRQ{Qy49LOk=TidJ`JdUY0t8(C6lE* zuZ&D$dolRLFEp#zzO7fMfEcBRULuO1uzSinGj0P%U+ayjGhVFLDi-hy#s?@zqLgi+5r$b) z^f`TM{edtb=5=v(&Qy={klZ%uwoZRT>|2f_X*!9cQHc7*QQ)05#@8^+iM}l5As1rE z_**}8)9wDJj~1*QMeVFR<=Mu}D4QQ}hhbd`p;)G6`6}~0q3kzDqOJzKCM#wV6iuqf z;j)Cv@y8mmS0*KLU$HwD8*H`)?vRgGYL3anfubwHX!j!|kbYX{I?zK?7Re5s0~x{% zVm2XSevjydTS%+#=xbxF4B$^CAG48NB6lYrv+q0hC-I57yT>9Llv)AM_)iW!#}=#` z5v_xMU86vNKpw-~)i(xI`W5G^?Cr}#DKz7`9Xu;XO7BK?wa$dAX*x5;;+`2hDKSs$ z=sKP|&&*EUa{9x$lXkQ zCvt8wF|RGFcb29iGi0(wTPuQ+0&!1WUg#x0MXERMLB znBcr@UM%7+EG9owywp=Iqzeg8w_2<9YTvF}znW85%KKb)<{ELrJ=o4XFMsra%<~nT zZTn?~{tb>uf{(P=?C^iN*?)r*J>oAK1(wq%r+>hNA}rrbIt&~R&$n)rS8kb_X3>;) zywFhVm&&hT;|mEnps`%10coRE0l$pdAoiIT&n?v&sAUo_uW^4ZjmD2Xpm3_7H$*YU z_*w`);BlS9h+)~uTN44!G`7E|d@#w|{w0iXGquiBW#X{_Vn7&o;J^%}C=duqy_F(u zCJm9lDb8P3^WyXvzaqkmfKR@h_A^gKqymlS?uK9mB&1`FSthdhHUG#SS3BJ2>qHW??-$=Ca>0l zSp^Tyj(M^ovx=L`qo6nIcVJjF*qX|M0)g%x6kO4MZoQyAzIQy!@2t$GWsGzT2t=%H zbpT8ZuL3P}i57BXK-02-uPJpUoFzwBcYq=WS^?xVhl{zC{d{d{Jj;0oCc+cXS7b`*{0gl9rKLx|x7x9?B%}_tPqVB!0>?38KvXtF8DUgzR-^7u2UYTT3;9C>xWzPTg z>4^W^lN`ZW>2Y*#Utyo`x3-|T$itU9jr(L!FGg=S)`X@N!6`Z{GS76)>*-hU?P4<* zNy=2UpT&oKE4~S#Z4r2sf04hBTMF5sJ;Q>7=?M=A#&^W*9In^3cL(IgvYs&)8%Eqh z5S1qKnc$D{zV5KlU+P+F%RmT>>p2}a%1Ub!EuR&Qd=mqgR1djs6#@Zs8)Ljk#8nr!p=FukOaNhH z6J^fm7k)w#gOxows;7J$^)}Q{PHj!n z-N>jb;$ITlkhgCtl{d}(+hdgTCS_&ksiEV~bjg^SgvMqt3$3^umOr`=w#aYEgYS(| z2rzn4VIei-ss@f!mzmPXNvyrt#tG2O21=+HI2DU7b7MBH%kLewoKCdpaA8NK1zFe=sz)1wHiv8xMY)BO) z?Qlz+u=vYezT{lTsTBNSaqVoELA@6nJfNdzf(s}Q!2$-n*QstaKI`xOZ!sC**Y?XQwt0({+MW0| z#V?p^020?){?!er-Dql13rj|H{h`~mcjyc>f$LQ^HS;w*zER7Rx#!r(5y8JcGKlWL zP-7EEU&dY#%>;u({E>m>J1+!b5LBgk7YC{6ySc)Oh~_!cSW2XQX@vair~eI9{|628 z+=^;?mgv+sGS<5p>lr0zDHt?hG}3tdgDw!`-V@tLDB;=Jpsm@D9jJ)}!TWoHKrw^lT~67376;htrzyWevRST? zdd1~elS$tC5E6@I-s|qMHti%?apFueaGw=OI-NYr*5|9*P4_@}TZ|5MVhx>(`+Nb+ z=4tO@;!8CtUA6#}-DJz5wsO)bQxXbORTUVyAF>{(b@X2^xgRW2ET~1-oXxv#EXIP^_ z1^URWPe?oo?X=Rj9Lm(@VBz!7B#XpT6ovB{1;@l~V8i0okyEKWtDw)iSz=AY>(47W zp5zzp?XSm1iDE$0Y;_x_*9paywu$SE8jq8Ze8L4CYV)Zd@`dEeL=e58 z36#SU+d6Mq&}n3d2s`OeZf^c*i3UBhNJ@qkI(cx zGnAR)jnCu(8^*sFwmQyc&)Hha{z3M4Jyq#!_r;dU_okPFI+P|bsS0gsXWrpW*$LIw zFd>86XFYnQ+JL9XpM|Cde$dwSfMo6h+p%`H&!%~;I7-T%QV1PnDvtnoHWjNImCmnM zKwo5q?5VQiTMpd;ZOCf7))$q&*FNRIJY1c{`tHf-%_8 z81AB;&b8fJ18sGM&?=2c$5C&jQiWV z5x3^7eiTa4CqD;SFkhZ{68`Qhla&{cdDPuIq@>|fFO1t}gE%*Wi8~MH{1~W>ZKs2M zkSBTloOa^dyI$st4HD{5K(m_%4WH(QO}gIa&N7(afnY^hTQaQDS&^{q~BI2QK>fT)n))=pXJ8Xy4-*E3S%rjh>l< zn7mwi;-<=R{a5r%;)D5BHoOJA0_Qm&K?ilY#w6_&yTL$@55Yz1RvSj-+h&ZbHth;p zi}~MC8rQa;=Cr(sdINsPMd`^AI#;dUvhwqf1zl{s@i+QWg$naGhI{^lAqBDuRu^LY z!?y2=vFl><(TQD)-a=Kb1&3ayipq@~dTUzx0sPU;6H^1@Tw zQ_1!Xr#uEB`Tf&02EVBn;%!NlzE2cyY9rYLFmF+9S~>eV+9*QxdC`nS;bHjZZHkIp z?p)QZVx-AwyI`yU>V4fBNA#c6o3+G+LzeBf^QHUnABT984R<fak4yu3|CIL) zCiJryg;<5ecc5y{h07Laxp!2S3vK9_2(qGJzWKG}vL^<2Y=zqOXC{Uk0Qi)fbsYcQ z9})XwKJt#-TUmio8yCx$W~l=ZoO!#DX*lparnWqh#e6r+aF$d!CTNrGz(EZs5doR@ zrH=!KbdXQrz`Z&KzPb3FVQ$QgZ>uCRJ)hV47*k;*x#tKvAi!;Ce9~ zuPsRS#U~%2iv+om`(U7i`9&|4qzHWXCQ*eS4Igk0-;j5fQlb7|Ip&vyZ@H-k(320Q z=7ICE{V7D%CqL#c{2QJNEr^xn=p)(^PQLUI=?ePNc#flQ2BGMV73OquL6+{vU8;vl z|LPzVsE+8Gco<6ld?AK-wvmJ zb6D%8=2>Qv>#AseE%s56xLhmm!FYRdQ?x_gPGt{H5RrmCm>NmPe zU%LOXUccqLLm}O*V@@3%q?RQ`7yWeNwmpygTT#b$SDg|-a{JQB8jHp5v-INE}pfHypsYNrW#G65;pHyNNbUBaG+p|*=7$dt=J7efe*w0a6vz-+B}t!1AjKH+Ee)n zoD|=KT*Vldg%eQ&C|_!-? zJnd}*s_IHN%a4I|frZ$|D}fBm(HsSbQB@`d%?|G5k4lEN34i4RQMxg<)RO}L%a@(OgzBsKsLnCA!Ci0szC&mh zf3%}IiW+q7lfs@Z@E+C>J11>Q@M+|89@XYiplSdMs#5t)PaQj*7qrFC^`V!DYfv7_ zs=B%>;PigBWn*X}Qde0`vgV+W~?l4V8Eot(QfK74SClfwe zJ2DcJ>qW=K3MM#m5)#%Q_m_zIcUb-(=-Hzx z?!kksH>OR{{FD5ZOIKuUT(%!~w(GsvuS1xXz zzs{b_eVrHCyL3wIbdO;i>ZNOgKNC^i)zXdWY#v?S8TF{qeJ1R(4aGp-_f$_3aP+yW zs}WjtmcYW^J|%odcrF&5S4TJJpf$7S5YcM*P)Zq7vpB!))E^eW+?CjNDx80%sTKbA zGY*)#`3o*3L-XUhlKrm~!=`fhXqAC49%Rc&?)q$p zth|h((>2pq2PI9tGn4HZ;3IO)d$Dzv&av_|d0DL5A0jUA5KW2ZKkY&+#wXgxD_O;u z8Q7AwdzBe!P&v;~e5$OJBI$zB#iX@b1HGL;)dRadpc77zRa2M6FMA!&M9Ma)viGj1 zM11f5!yW&N`?amW`y@#Iv%Tqz1_oU}5`YPp!K37V-&O>wp;eu?=QB5|06wZ=r>pT| z6*@1pyf5V@TwV!-nYjQ-WDeB`6Yik=Q+?lp?BOFS?9Ww^gJmGlE)EFGFn83pN{-T6 zcK`hhSK!9wA8ith=sV>N;voX4czboBWdVz^?*D4{1V>1WZ2ug9b@ZRNJdiLwZB7rRuzrct-YgbjDs(IKY3jF<)G{+ zq3eJe{(EcrA(4jKsYj!lCH>;L+QDWB-Y~_t+Ri8$Mo%V|$+}l-kPWfc9&YeUbJEs* zP%G{)|F|)Q|s#9R~;^8+$+3Ld01w(bl?y zcjxg&hQWDwq$ARhP6HCexX3ouEV}0Q@PlH*T1VUB+Nh<6ufsC^UHVfWyIHx`)bpz& z$2ZbtqaXNmuy4^$<&a_n^w8gcrqe4+ojMMlBbc<)_}2SfzuDv5Cq?(=X4Sl>`A`6k zl^&G%oQnNgzLiBn|D@b#OWcd~mj<^zmH2e|0-qX>HHDa1?X(*C_8J=U?b3BKK2)Kf z&QNNd5grZh4cc2z0n+~6*hHTWijN3kdW)uX_J>w0HF&H!%tt~k8B&}(BKsvtl?|it z7ak}fVd*;%j9hUQRKE^=d-y5foS3)osbv?rTP;*j@g7luZ{c^JnreH)sEtW zSkeTZdl{c-{$Mr&ynoOL`6*929POPPM7~6WsJ411Yyq%$Ua{8U4r`Q3@_> zSLLW)rd0lun!i+_ZsKxVaZtU}x>g|*$4tMzNx?`s1QTGj)kKv_|KCV=uY}M)Nq0eu zn50M2^$d`vokFN$*f*|*T!>(A*|}kQqy13l;Q*W~ zDMs7k;%Q|fb1%uORUp&N8R{nLhlW5>fDlkvl))N27N47M|A}{Bx}s#oVWhGNQr7ym zSgo&pg~Mm6Kd%VQGe5<5IYCFCn8U?Af1@MDWG+H4HP-N)O>;&{H-9j8qC8X1ji4{c zPgeyI`RNcvhh($;0RFisY%uuh+>voO(E8BLCmAcJZ+QK-C}G6)Q2j|M3al>D?UKel z0vc#BrkbEQ#biw|Y$>_BI&(a^jAL+LKg4t^P&xS+b!8?TB*@W_SXZHubVVZIQ-DU- z540SgqKU%#hzc6M<7|$!H2L~=4EO`o9@WzV;uGKt1a2*swbX8zOkO~VR~qsz^k<~a z0iZ14=`kT^4z1tfdRf=5V4LFNs_|Hy3){(r!>H_*^}VaCIr|lw6<^2M!B!p5sPTtk zJLUy!!P~6Jl`s9c27enWzc||-7X>OX=|Z~wKXg*pR^;z7?u2j_=HudFmh?Pw$p?-h z>Uq4_XGQXTT_4u@i0iJm&r(J^g9psR z6UnC->Hifjn__Rm=L!z@d0>5iCLw<*PT6xClL{ev^k)S9P@C^y!fVF>@;EKOLo7GU zNATabBQ=Dep7I*O&fL2in2Co+2tMeW@X3I3l2;MlxH@qXh(6Ke=U}G!FS3^c*p$eA zb(m)M-qwg68>svA2YCF3Z7HkJF_MNgB2(|^oici3TCb-TVY8w^K|RCz zBJCItqqlyleS_vPjQC>YE=-wIj+mLjSMP2&z1W^(HI+C^#}+WBY?DxXUx?&Q&GsPfS)4Y zDTYAZZqVp6Qp}Yb<3+-{@c)Hxc8u$hXkBZkZpVJIc@}5Esm{i$ecaTI0+ud!rRQ~s zIblv0C=0kCUEZzAmH5Ml1-EN~XbP&F{3e&;1$U^=!0Cyc@=a^W_cXWRk&gGT z+5N=k!x4%rTdIW*hOPMVA3A<-VbM%!F|b9+2U+liUg*tvIFY^VY%HGWjwDcPHp3NL z(N0bUWbK+*^qDdlArJo$6kpm2=v*o}x$yqAK%nYQ7sSQz5?xmTD_R12MKyvrWc!nFmUf`CLcAW~sU3X(~_2e`7y&pWp?pL@_C;0&kSK@R9&74a|*Kx_3fe{aa zv`0ZsMKZ5ktUK#+r<+vXBs^lQ4Q$l(rWEEWNRkAvy_byJLHG@}h5s0J(fM0dmesmk z{kyl-x+|zqZ9pVGG>=aRLgO9rl*Phd*`5X%U$5-%FyW8BMmwSO+qRTb|YFWj{9JS11H4fD}0VxV63EL)I6vhjqh`j*EYT z8SX&$7ij%kLE`UyYFH?<;Ek(tQWp}>m+ve33zh-+OaE&);pQ{S+$mL zg@O8!X!&!}78s67gh>COwl1ZT)@3Gq43F>G=d;)X{(Y3IUqo)~$X!h7!$aSIrEG7A2irSyj z-QwM^Ub;N+G9OgPI)}?<9c9FPA(7m~WoP0Kj} z!A3U?3mFa!dm>Rdyh6y|U1zUgNM5bOd_PJ1<6UBSuxt(w=oIhY6$Fq9k4Ko^>-K~z zv{tAwi)3mmJ-u-^;yMFlMCTp=F4*|9=@P1~|$i=258 zYhUt(;r!jXManCbKdv4dC5isuSis$P>WeNoe1V*;CMpxcsd8<_YRj3m6=u=bLZ|k& z&rKQ^fYL`?^s}#e7F{ZiUw0IiJJib9@`hqn_Y=})+PWT#$oiVBfE2aD#4u5<;{=h8 z8yp$*=C5p=f2Iwi+NLvX2O^@waQdqfGBHoZbkYDz_o(hxPW^|*^ki?_P0jc=H*r6Y zzaJFFr%P|ldW*dNM(?c!rDfOHU_y@xvcU0|_@PJ+Rq9i7Bo*mSD30g{`F_+Y_eS;aOr$ojq|+L**?|5YreV?qhFj%jpvmkVyebGK^*VM zYjThDgO=j>8drfMzVug>B0m>l@gpw+Mk_*gU+a;u`+Rsi^|hHPke%egN_%No=(t^H zhFYnXRc&Z>TS=cH@oDsqLWbstP2=JdA70n+uE88G7%}jh%lAFgR6zq*W>XI1>yDQ+ z(LO7nuw;f3(M#8X{s^zbvmCWVYJPuIiv}yYb_wutdMUDjjY3i$vsN{8BFmqXfsH7R z?~;-OVyPQ`^h)A`6?V9e<>q&h`|!^b`j2z^-yeHyltU0h3OHTQlK!x&Gh&!X`7uJQOzDhgA+NMZ z9hLFZx-&LE;+v5)$Y&*tm>u$X1fQKHUArfl^r`{*dyczQ6TeOWk)RCp+PFCQ)Ir0bZsCQvVr{=9Bj{V5=pR}LwPVd7>n|0Pq2ZK1cavoK%ebt8? zd$%O-X@lR#>+^E50>XALE}V&Q|H1_9Vc9_UdaXH{K7Fw}Ye!)A>%NFH1i zk%7X}Qy%xxG&XAi`V>U>SwG@9wdz-IvT7(}9kJF*BX-*;9C|OOnB2u^e}0u{(aC0c zU)EoPkIKO)lgaqSL3kB|nmxs)9l^#gGu`3L zce^ex7^jbwFkl+npTC9LlPR`ZVrK#^t%0V*c1KY6?qv>KnJDa8Pg?H32g`r|>gJf# zdli6_8q&e+$+OebcD;Z)h;&$ODX|1ddaw1h#oi%nAf%?t%8&p(w-Wf3;=OViu;Mr` zcVS|>VwC6Fqew)<2jRhASpP6mwPp%m`wW9D5lT?V^)FaTvvEZ6ScFgk8JzH<pI}*@3Y5zv?Cll>9`Gm>iL)93 zw0!t~cn*171#RjRuZ!N>!jmM2$WkM94r0x*Lp`kra}qHPa6T%O!{fvZqMet?6pyg6W*cx;tu6 z=^||ZS+vVwYTj?on06xAURHquo09cx*#Jbe^Y;QasjuHi!2WTa8{me#VnQu)=OQUK zcbQBo9RjenZf@{mCoPRplYseFRRqIHS^!;<4_9%yB-5g8HQ;6OPvM+nlwv{HNLs)~ zdBRkOtvp&iQMuyJjatA`DqTM>m?}M_>8k z^tbvj@7T{sev1zSG{5gy%Xq~q4|qj<&K_xZQEkEOr<$(rkW)y6^@Pe2Q!FENTqcY( z)T;5M)ZZp_!pxdyRDP&8S@L$*8%eZLvIPsqp5}~oz@KiWV-QpOikzLT$9*YRsj9FI zFvu|+EC+IyUhl?Gb=u(h(0s8Q-+r2~qMQ)Ls5z^<7g{f41E)Nc*qHYmBxQ@EUVv?L zNVpG|bN>eb{qK*VEsjl&-pxc#{vGE|}O))U0Z!Ac8a>^qFmLx_aq^$E%hv z>dMo|i}Be)9(WRG=r6kyXK>LBD)Z}nXNl`48ms{7aihcllP`td;sD?_cta@0!Ad}^ z!dh<88vNER zsW#YocKl1`3}db4;C;&X_Q1E+K+CarACg~d!A;lR96FoyAyH|>swKs2>cf`KY}Vpg z(*}DfmQ{HSS&Jr(y`d&*WICdV1ZhP$H&0M0CBH@+sgO^;Z^A73KDeii^A;nre3021 zW`DxYhKm z9ODk;wyHz!3mB&tW;n)Oq}N42CE!~5&=fZm@^6Ttjoi!%bSuQsUwJ3ZIMuhQo5U2X zm$V()5Q#8_jt&E*cr61_<=taS-V6ndEyLe1VA9n@Ca!qt$ijUqt%~BV=Pp?EF?Jhh z3nU?P{3#pWBa^WjL4AF@LK}t>oJ|Ex7FFmN}CL zON;wbt+PEco@kG!!c39Yi`!s-XRWdmRjmWmC>yivn6t6)A7Y?S>RkPHCFFis|05+3 z(ZEv1D!J-1El2K403C$pELoc?b<^jp**0fS*%Eej+yya+pz+cANsj}u)9!g{`}sk=}I@+C~U$f3=@Fw~O*}eFx zD`Xe_|C}Pi;NEeBwitZmMGF`Bu`@-@KOdH*H@y|jYck7`b|rqpE{2hp8F*T5Cbd8B zaxVhSRNd5j+t_0XB${l2L15Mu*pc6=Y~wm~=Zqb*n`25Hd2N1O<>b4JfmKY0+pth<$uH2K`W@MwmYlS|SC}RWY|}nhO|{)A2W3#) znPywP5?z~X^t#U-5e(FrKqQ90Zymq!O=<8*H?G)uQW79Wh zH&YJ806a)IXJO#1d0xsLi#u-IyQ1;Mh7Pq7zHfEnd6`*DukY8hSld7W#1;1oXf8&UMjYkRR(BT24v_cn#Bn zqQ8M&_8gM%1!A|0GH!g5-hY2b^s*k1qtky3+L%io-`B5K*7tQJB{lYg;ZDd|!9m}} zZlE<6>Oz-eYKAghy+DxO_krLR$X6;(+96>(%cJ$mUq3wH_p)qlftg95m9)7s5~d`^ zPO+H~?5j8yz3rG`r53SuA7VN0c1s0f3>Ym-iB)od4K{KTfWFqfR^}<|VjLenm=BK+ zKG2~w6~ zwr#7^v2EMzpkuRQ+s4WF?f2bhk2B8Ldw+jwRE_6HDo?Fv&U;<+o@@G92PdJGhL$^w z5T2YI|KM5uBFsfrhdvR^ENHa;_V|P{DZFT!R0gX|^AJ#|Nl;&fzCcY}ytgp09ZCGq z?jMeSYBG>a5ovMq@L=y*@vYb^B7qE^_|_^_FEG@AFa| z>upT$^xU?l8`O2#Uu%Brs`zQ0BX(dN3lXJu7++(89nu>s{?WyO5BK_~$uD}e2-AV> zel`D(jFA*V>!WwzPf_l!YPpbYx{KU=N6u`~HyyPOVMbIR9U->I@U2<%xzr=>8+e=B z4QNYAOC@rBpf#71d9(TY@u!<*K`}&e@JZAT+ZL6K*&Yw|nKGtl9kn zzTW;p1^3L|(m+9Mc#0xTSh}Q(losv=U7waxE-+y1v+I%2DBVQM|0z=`HOkx~s{l8z zR4Sh{@BkO$KfmvU%2lPbm@&+q%U2uV0c^H9vGeL)$&F^OsnM?pds`aAF}G%_79b3} zAIM)f3yshHqsJfE#*y^_4}cKXCokTsLXcy!&N$$r!Jyx^ikH>mfhQ4rd7yYdc^y1L z*yNi!IDnP)Q(Y=Y=)#Q#c_;&W#61{yQFF4{_1iOPUkTOnN8>O6DEA5Ww~*Fnde~h!KiRo$+E1HL3bh%pk{SZBp-&NQevTNv zpR#T1roOJ87fyiMz8VRPJ@o-=qiTK&_D`51dKNR&z$8EBY;KS(I8J&!He!*}x@HaJ zqA8m%*1x16(}g~q1eEH~@SDX9`y3*S%2|m9cEed`hV@O7lmNvdV_=c^v_XLjo|Y~v z-Gs9PdqUGfvFMO}d{CLGQ7hHo4u#l{Zy9QFZChHUNz&LHh5pkmvU5co2I3X>*8hX; zwCsRuE!?{E=naxQ+8UasPFZ#v=gY5`@m1zCZvNyil{*Q^yt^*Vr~XA|D~ccYGDhjq zzJVKOeIPQvc17dqnQW_&ma|m{ua(c4g12-F zfhWO>wqisfC50T?ig0O$#L#pIjYCmffC>y-irP>J6mlB*3pV-7N(oT3FzH)nCJLPn z6wNS5YwlvAZpT6u|g{#qD4hD`dLJLJll?92ep zB7Vzf)xp2!YeNC%m`ZtD zE>Uo9i8;XGkl$>^{hrCK}>65p1z)Na{)wGH)Hc4hHuad{$f>Aulqov zGSVHJZWU^rz7j`j_8>f446NgWNP`gX08)eH^}S+o`SAOhVR5WY#M!a+YKuF#5*xnUE$8ZEe^Xf9Uxv6TpbdiX_kKlkV(G^n-q z;)z(n5DR`KSqr_d&0A~Q??3q6Q242@U;O{C&(Nhjc$$8%GA-bEx6FM}Jaes18=%Hr z@PknO<|2g|Qq1|D0*oRD#p0Q)ezWEk{&&&&$#%%q23og)#T4~hE>5Y+4`Q-l5Yy}q zVeanA)g+6_hQwj%My^gDv=HAS&UxIxtK9RZLc%&tUuTC4SJC$|zA1vcTQCpR4>^9W zsgYLj=Mr`9ZdWXi^2J*T-+TFZ)_VN3sfXKk9m@nnM>Dw@=!T8@4rXKCWX`x-PIz#$DW2^(oiB-u~qcKP$2cX*8o6it_`lkV*XEPN^@RB{ z9lsEM@e}Cz#lp7qd}*DW)f{mEWa0R5BDmSNoz4<)s}cUKB@+#zk7$PAUZGdt#!mP* zQri41uc1&0azdZ>3E#s&^mBZF_NgTDaymHMz|z9dCu@#+eGyBhZUt@foH|`x-5Dg3 zK@_v%4x?FB*7ZdP{Za2_geEiy(OF<=mVMK_BDvA~CeU(wEsav$4r}6!3+eB&ECSX` z*N(g}wSH2+lX@ZUuW#SscZZTJRa_LRc3=}jN~%+o=T9<0KoP-%$1DWHL0lnK+{z5| zoi!e;CGa@wi)(3m5lZWpO1Y)VuC!()U950eX?j)onK;X!Qr0mhm{?$spk~^zFNXJ; z;h-PK&IXpX`O-50fPUAWc%ugPwDfeDt1Jstfl7@X^bhmr7%AzX;sMDQsJGr&%AXdn zTa{d;E_wUDGZiXl#bZF=Xh@?ad3?+UY~|&sK##( zQvqhaW~}7s|8qvNb47;6lv5A|K4^t`)VFCVCga^+c+6KgO<=w7|C}Qyz3si zsPr8b%Lp|GGHlOuG@`(vC1bQ2Bo$juwRRd}=skskFp}wxNcTU=THhqvAKojQ9LF5{ z^ZfFh+R&1dOt|8pYoBpj`)ImkZ9agDuYRiLt$U~$PQmkOLh$H{8VQO@D!~X;gLUD3Y zW8cl|Dj$mS*fqN}&7aoIUJc%ReE-rAaqXk#Wdr)-#Rui!{~u%i3l2E925t3xxplw) z2gA~oCX^Rl4wR`^VDSW)2+h(SI)RI%3NFu3pDRaVZ7^AaJSh&=;MW1gj4&1aY@i|k zN29%nPLxYJj7GdF$h1Z(pAPi;AhH5LgmobT!1yg*_BYE6o(n5#wOoU6Q&!8MtydWZ zJTQ2hXe)H$G?^|s2f@4(77fY0Yr6FTYUh|>ZB`{56~ligA$l->H)l8o;)L2cXbuXJ zYqU9M@9Fn7l5)wdY`I9w))2w>0{;`IJdrl|=dLB}! ztU&$D^2Wv30!aS@3;IYUppaT>NSvIuhYdPAsp;LGcRe}@)QR)r?Qqxru^OM5MiX!N z3nr9*0rDWEzs*Q{MfmH@3>oo{=K|Ociz0oEAG>WDnd-BM8EwJGb!ePt2YS7bf#1Qv zOrZr}f7W6_^TR?KmDf(l6yBM%8(AYK+s+v$JE~*CpyL5xDQfyXc{FnI7pM^j|Llds zZnoLb6Li~gqrB)`{pz`dkC$OCx>ULXkNR?Ue*`=r*#O3#zJOR@CF0SohxQ%P>79Mi zFO3OVu$~o5N`b2j5G{&)sKf!)hTAHWZcd0oUuHp<(i%zje&uE`61Vc&xDNt@>=rKq zW&XZgR}$PjXB#!l`tf zerXEQ&`jwOCS9M|l^MtxMDxj9m&9()Gs47{*BE{~0rmb`*hVh#r1g=v*92gd5elEG z`dSe4FBtk?>OuifT_w;eGFpUAiIls=_><$dwy3p*6BF%G+ut57W)r!M*g8BPA02@F zo|;Fc#(b8iO6TUhtq|=*=R@TQ4a_}hkxYbJWk@kkedr&w@qEhAoHU{O>rqNg2C?1k zu|+3UziP6Zl_VS>hxCUgOD`f`xjFM5I^lU!s8(L#ZSdLSU;%;9;>GyezA zA_jgNr9?_s2QT7vv` z#a11fe65TRFYi+Xa+l`$~ly5g& zoLeK>3em?la%G%!Y$KPGUWuS|noiG!Y57bc!T!k;x`x562KSU%FjuL419rxO&-8Iy z>3RoGw1l-2RPnGuNo~G9!HYK29trvBXVOXN(^p;CsNFU0Ox&k4Y8@;}zqJk`VTPA# z9wY(kI`3wPle#RbJCz!VJDajtK+mDPw43cf(VDsHV=}HBZLm%nrAHe9Cg)d_tr?>n z{!fn8zj_UrtB>}LP9)-4S2N7@pSVbCD*H=VTcQgat<5o6fAq6W@rAN#7A~!)SqU?= z9pfaDFHnPHLUo13=S#bn`Q3#oo7ee0Id_`$Xivy?@+RyX+7hfT z?St1Pb41%q#T2{qWl||+w#JBNCHObsHBTLRnB+&?l}0~JU}yS7@t|qmcyL7FhhDPd zdfof`U>*g(+y)X=o`HRBRJ|vxOCdF4xfUPz`KslKkT3Dk&GROO?E8_%93393_N2&S zi%q+*o58)KXZP)3cMQhq@%_nlV$#LsXUVP^6M}x-@eLTqPR6Q>5nw2>nZ)8{r-VHk z)OzT1`mu*__t5i5eF^+Eg?In@?0pFJ=y}nsn6x zGEpJhvSS8)9)kZ!O`Nza{~dhi_2zA9k7<;B{=k%sfXm#IS zgz2!slGcc55p#Bxc@X}|!jWLCzHWcL=X-L64-jmeefu;!rh5#%R)%iMssi0Q4CJe{`Pk2*=4mgdG7THhjuz%WcFVf=(BZ%%EUG$LNM;NXc-XK-LWBlQ zi|lm?u`nEa7y7syW+(XD0`}mT`MVUN?*d|4_ZFlLwa!y1%dA)fZ)n>pBCxh*N(KHb zho?sK5Y0Q;i0MewODxXCE#-YS&zH6hzHC|4os0UQ*p!M|Enl9cy0Abt6v7$yI9LEU z3VzHBoh}>j@0j~$c*TGpzZbO?<$)ZI?=0HkMqdA^O}5LXEi=SPf#W@R!ACo~-Z@T> z?XO|x+3hkmcyoS%+co}xeQ`w}^nLbSeMnZTKGR^HZh47BKKs&J7Zb95bB+%GRozCJ z2-DS;fZO}EDc>oDKYror)G*@*Ei&A`LA(2;-j!O$XwbDH5C#A)-5uVy-4WGU1ACC! z%>8<9y0ejfW)mxI*}R(T!aar`eWn$AjPm!*|Idr*AN4H1B^5JuK+4g^v?+@dMG+GA zese3!8XO9gQ}uKA@`LI@uHzN^LA84Y#$}zGwLA+Pq!=8r?UQ@^=?sYCJlCxPRKbSp zWLQ+owb7OSsZ?Zyn4cz|XtyS0=CI#K{XtB}7wvROQcqIscZk;ehGFScLChWNsTwM7D8;DNfJtyZ2lhm=3RhURSgo7{D7ynjX}KFl%h#AzAdl zd+)+z8 z00o|XWhM{~bNyWSmrDC{tQ?OV@IF4mLjvUwY2kfgc>gId{>{qz*GpXm;0r(qUls9A zXE=@g2id$*bnST|igVM`$>}aD-^L5msnP~%$2^$KL6sp|#aVlS=f%4;ORHuFRkY`x?!) zinuDJTy+UWvhB9%!&C;z@@8eKx zTNhOn$XncnHz~HIk#)d(6Bi+e{S7v5-_KW2_0ym4qHE#fD>|??O-2aB;)XphEOk_e znSus~PELQEl2HE6rC!iRUZVGIm?{!vBL4bBVQ6U8mgNqTJ01k++PM0yXi00z4eb3t zWi8be7Ug|a#Qd?+O9q7f!go$N1FWdppxS-q@+uGq{ptv*Tj*Q1KdlfF@!74ql9(9Z zPV&YHq6hs}oi;{W_@Vo|Z0T3VQ}Er0fDOzr*KS;fyJWrIVyl%G)@D(Zcs9IE;D*&9 zor&0B3&09Zp$|CMlP5}O(IheizAnC5ftOBX<4-e0IVPiqNAVv7l5(B!*2>icdn1#m zb?X&6A03S@I7;cotccbv%|x~);mX-leOlGtw@mYi2A`n##=Ep~Lrwq$g$e}&sGFHg zgAVFZVxJS8Kug)DN7hvz5%Vh-KN=jUBNunb!|Z<9l^b%V)bBTDK0N;>7AtQ^Z}6$P z?5b){^OGVS+}IC{iV)Fo_1*FO>ffYH*)ptFpjQvzQn7{38GsIUicik~nfTR*@FC3G zFsEj`VC09PRH3gKvbyS6k7VXOQJ}`%ON%@CuR>U7gUGUi?GI~FRrsrqIGM~Ah2nKJ z1hF6!%+cDefxEw*EC1zYtwtFf`#z-GA{T|pk?ADoqZZ>--KlHa#F8C-9pejXPjP=r;Y=oCI9$+b1GD!+vB&KZhVg7O7~p3!Lz ziMS6cX1wY!u_5*E<@s*}a|<{0?s?4Yrusi}{@NY5Q(oTH59GGjMf*DSqn|0OATxm7 zBn`&uW3$7$y!GqpFyi>6{s7vTpQzFk5vMnveT2_qO^lzXFPc-vmmjxj&dK4lM4D6) zGa2gMBp>L5V}>|A@L_%on;rIhkl3W3L_=bqyT<+sqvO|Bi;_3*6-@$4gjTK9Wv~pB z=jREE4<_C9e#t7@h5u%xeCyc&J%CJ(jm!8~VBB;h${}2YZJ}$e8#u94VY>-)|H3ME z#QObW7DH~9u7$313Hs_WqT-P zJhfHX@BgD%%9xWX{^q(>;9-g#;*cwemObe0kDuhGTLVN`fpoBn#gxC zR5%h>8J>*ri;3?XX3XlB?CqJ@c^9WY*Otz+Lwj-L@NFlyMATsGFVh{mM(3zByi3yc zegbO@sAY^PE?g*JMQhef(-DL7FOR)TrbSMc3XC@*8j~)Y&Y?N+6D5SIw90@@BHnJ8 zWx|&nXz5w9Ep~cQD3&SgWB|;anM3OX+hQ`%$J)wpIb z{XJ3NQhtW}Qbaa|MSbW9iTxjqiRbE|(!9ks8u1p7lh5K`+wfhlk5qFM&4$-X(?Qe# zI(*}^OyM2B?MLUFyoGk1dD-#qR{I(1s0D1Vq`BGnz6dI)kfDsYHn|lyJG)A=7N_qJ zFTTE~%4cl6o#zhSEPi+&Fcl$S)8fYR?S9~5ZNSQ{_Ca|}PbD$@Ya;*uf4`YU z6xVJ#@r&Ze|6&n4Rb)T=%+uafVruCk)WRt6xu%nsj#hn0f|B@ zA}p#C&6c*9@c)UOb-_WuqAP)X&hCl^9Vd*Tre56z$;Qu-C~le2m-ZLbYbndiotM5T z61%Ub!-j0WjYxy5+e3l_BI5*SpdE$iIV=%=ic6$8Z+0q=ERA%oNa`4udq`)%manV0Fz zI8TKvQ0`jzy;_G2O@&XL8U1gOZN{(~M)MtLbRAI@IvWp`4gKHki~M)GREdk3`Ffw= ze@I-Xx3<~erw3>mVHQh|BJ_S^8A^vF30ZA3@A9XC!?_92Mu^6Owi=JneX$v0s0n_z z=rT{|@AJ-{2m&-wLtqN?hg;RLaR*m8B&1&Sb1)bc*YoXXOm>CQv>pMD$L~HfUgtyB zXeSOsRR$`>by}CQdd*|!=d1_#R}V5<$DSFSujH<*4riDQdEr-_$R(lbzPy_ka1{#G zI~*!=)v@oy?_h-x*H1Zg!*>4>@MME=tLwUV=#H~-S?ym$S+EwkKfzF!o zxe~9u4Pf*D^Esa$Kz8IA7~R5h%bJ0=rV<(1Aw7lz$?6K_3UFv#CUZdw`El2itTM5=!&D zhUb#<72x7B3LoD3Io}Y%|97LEF#UNTNL;H81{DL1y=_Z5WFLa!l`%A9Q+o{KW(u~l z_hbaB-naPQ*R-+GH=#%hZsU2b-FdpO!(6oxi;R#wdip^~(I9Abbn3<;A`+Y9;2eJi zmaY=;1~siArC5S~BonLHfeZ}euIM$k@^h6X25_eqK3h!irq?_zLGHexvt}wLHu><- z+HCBGPR4Y>lmt;hN*}om2IcnGU&GGa7)cewt#;~kdhQ0bz}FBW!eeU>LJ_bnqWS7J zqPelQs6T2nkH6v%D{NBSx@*VTr&On{5x8jqm#2nX8+;UXRaGU*4fLxC``JW~T8-72 zk7Vb%|HJ;{FXoq6Hcw_4>>z{aMp{oFq0FpiQrFEY3y@V}xxZn~RGt)B3qEQpN@ttQ zW?1EUv$70o9-7L}d+%^RY7Lj^crt0*mOU}l*~Bz=;cOIJvF7J}cJS^2#MYahQcsyn zSOJ&hh9UNZ4px)7yx2;A=AdFOB()oaG+`!QlrjI%Qf5?-7ehuMgWnQ5!H*_tNE=D0 zQecPXBbl|YbhUk!VLUc4YgG3r9Bc0xzE*5|H@NZ7;v3LM(Nq0HtX`DUK(DizYwU)* zHDJVKMN9NETvFBzq56u?x=~fKf5rN~n#e=;*dDU+N5-rG1?MKy31GQ~e}nV8H2Pk# zRz_<=48-@_S~32>z4pG~!xR#xYg%<1|J0*5+z)t2B>S2Qrz@^GXgItNe(O~7G?bBY zp|t7PKEQtgApV(A&Ot$G4|S5jAfe~F>pl)YJuzf7nujg7F3plVobCK2UE6t8g}d7V zB?M?E&mErJ0;Yx8+#X)|&seT(9We(tVIZk8H+Y#e0%Y@#NKw~ow4IMp-+d{U)_#3% z9}fov(75Oz$fjMJ-VuM6#7s{)2ZPy+g@dzmES}~2P;w`yB0VKsqSbRBk4b;RxOI~T zr_n}vflPD_y5rpyu4A+u1!!98>zM9STf8B^rZS5pDq@6D)wA`4smT-@T@M%>pT6N% z>w9Xp<0<$@-<|33Kk0PQxcxyJ)b77j7J9&uRoMcm-VHlOy=IHl zyTW&@%bmMX^ET~Oy5~pEX=7KE#vzQZtO+3EHPNsVV6bSJs6G=iXv~VtpcQtc582#4 zq1K&aUC@i4>uLM*Ld)=oo!EM2fME6otahxJVNb*b%A7p4uXy;}I9w@F^>XArXwqW8@>^Bx>i7vKt}QbS4_D|5 z*4z#UoOzpZBS(0uCvO8KNOHi$Ge8ZMlsc6{^jT!kkv>mw3nG`HuXuJGH~MVb0WPv# zHIGQIzqtnZvq}{k5;A%w#VX3s$X+vDE!z+7)A7nu>-C$xO!~AM?-GVi-!t~Cd>Ecq zb^2WXH&;`>49&eGW}}3X(}YOn?8>M}o;->09W_LH=Jz7|><>^EFQ3FTPJKfO=O*f=~%eYdbEF?~|=b?7xHk@dZDBR*%Dv^~(uj2(J z$$mA)idc4w;Wi!X?N^&kK3BLqZVP<_h`Tg%m2_qXtJ&or=qJhE6UKHrWXaCzyLBUl zVu7_29CPr4v9-XxqHPcN?9`|aUxss9(Daa?^5a`ZFE69{Y(B=oj~$VBi%nntuHJ3% zxSswVi5N=JV^v=s(Kc=MPLf=aM?dXdf< zU3?=twt_$A7oP|MX_S=!B*<_Q{U;yu=LYyO6MV+hx!Vy2=dV72O&!7p{$=`YZOe)qHuk=Dm%fQEUHCx8e7!()Q{{KNM&JSn{b zGTQlf{3waF3eB=UOgUXg*dM!6Zkkp6Xwk}T&Ww8ApZWW=4q5(!HjxttKlqT&IHl+>17rZ5Mx124QSWs;?)-lWWn)?&dCDoR4->T zSYrRv3)L5fK*CUNyhgBQ=jdXtwQJ?33e4~qn7wVIoce6@Y0V`N5pKfQU0AwI2n{t) zY*-8EisI9#(=(JojRMjH6&=R`_j*RXCEr1v7i^dxsA-a4TWx4BLM_TdA|DWLa*yrt zn=DM?RreYO^+)TT5?@bYFl&yQA3FK)F4$LQvxD_8+TR^SSvF@8c>>*v5(){4`^BWT z(8dPbFzKoJ8hd6_JT3ue-`tVUutVGuo!pgC>qw~#e`PQ8R#() zw1(anoFyA;y2~n}7byrE?oSl$3vMJWTI(Y2EI&0oiK>=94?o;iJ#{Xf!@#kcim6Q9DtLxBj@!Ggi zb}_}}!_q_6Np^Va(1Yjhl(QxAfx4TrJ+Jp}VQ~V*buYq57(|C+oXR zP@NMN%YU&Y{o66qg$j=CFuG=kDKL`-_%O?(qgZOTp1a%Ck{R+p6f=TKN`3<)$390p z#W(u}?os-`HDD3#Zt8yH^NaV#9fy;si*?SuQk#64YPd#}6X8(9Q8R@# z7@k-d7@JPr!DWV*G~Ed2Ei*kor?Ub62~G#(WdJzD*CcLy%UpGHeg5j>z}@7qyW^WYO|lPA8|g`PUvT+mY4G~MF5_!;r<;3+%y!|W2hTXRqQsr((b!Oy znH7n9_o$CBQF-UREN>GW78<|o-y4H}L(vHRW5o#{u2gn3{?;RtNK@0Br1B7*u*F#| z0RtKFJ`W|qTj7-_)I|HrZ$*MG<@eU1R%tdmqefNX#v1T|P^S~Bxy`|2xT6D-Odi=qzC z?8yIt4?f&x2xu|T0X|Hk*!x<}V>cOoQY)Mgf6V1oal`fvqy+Qyk4@wXe%c+k4Yu^a zC<-F<&odL&Y=0E}tQ^d^VYI~<4zt!;kGEz=J6B5_u29F(^<~0Vu1dQz|D-Ihx7W&; z;%QoBn*DE;^sBcIlD(7&Z(d3bw4_^~#>9%DclgM)3rMNhp%rZY9fHRBi;bA8$xf-? zNOO){k>mQq7MZLx zv*&K=F3J@E>gh8T%C)11sV2Ap%so)2VF%_e4z@`?fE&#hwtKJ8byg`3ZR`LRPQn|V zT5SYfM8B1{bmvhKnOeyk$Vg42M{l~l@6o5}!Tr}_W=#=Xqs}5JaQNpF)KfUJ`lT=T zNA}f#E3KB&!M3AbWN|Nr0%>MxS7pp7glu?rpQCzq`X50W1v$fF7k;EW-s9T9sVmem zm*uluQ|NAcidg*~5#Q$l2|RXTy>^y9v3KOcr<(KaFLB96<_6BlTo}sb6~eyuJ-4mr z1QDkVyiK?Hw?VjKBWu@(j0oPg4^nfo-mIs-QoFQ{>OcidhV{2WZ4N4j>pKM0cwdK!sW^LUiwdWu zxz834`t4gcH0uMLM*k#<50cmLATA-owc`g@geW6`v*{}8BBi24EplQc5d?k_(RGCd zBjzUx5aj;*ECA;2ngc3Cox^}pb)( zFLQ`f8G@euYnRm|&1(TZiw0tZ1E;$UOJx#+rcwbDzt)KYTj-ban?pg?FtqO3Z+WU- zs!QwN%VLLM0vVu15Q4OAhWq@a5z=%jl4AhYQ@zE}e)WnRy6QU-X4tOqg+KIf;I^oQ4_dO%vsw+cFoV|-?fkrQ>(-`SAp@cms4IyF)7XsTvOt z5zOoLc75gTk4GgfXR7|}$U%wyY+=?&6ZHwIVBa_NK%$4^3XP}bVT@0&vR>KnCn^ed zCQPbc3b72>s4Gt&e8@+7{81QkXEBozGZ=96{T4sl)_-~v{Jy#_A(i0Ms6YQ{KKUV* zzwj9r$jYy+ z0jJ;;iljG3N|&PXiYbo6Lwr-~jJNW7Jcux~LKUS}I6cpg-&=kYO?_dK*=#K6n#>7cN*yIuzGo9^c^w2ofjkT?t1nJ)OKFkvtGmXGrI zz%BXOTNf7gqRt-LYq||Mtln1`0LVU7TIT|U^0V3<}U-KYkVu-8PCH-#DXXAoh8x94<^ym2f!{@BfcIy`e+{w`UKzO#M z)k6v!)9HxE%O~r(%wT(N95@>6u3V9KsrT;~tWg<4)ty0YXN#{4$0BHR@YKZENs(Xw zDoogk!}KsLxmseLE#qCwg+cmrj|ndsYF0l%>=t!mO}OncoUFSH+w^u@*7h`e!``Vt z00Nb_iR2RF<-(U^58nwLq)qx~_~Pr2fp(5!yHQ*hwo(zeLBE_^B3{0*TX{}yz4sUi ziH&9=Y|Kcjzv~tF|Mz)tEFa4~F@Vvk-prj57Hpqbu?D zeG4o^wZ=J$`!G=dwD*B71Rzs(2}w_JDL>FxB!{P=BFRrO?oN=9cq(Yz??n>5)Q_|n z8XKjYC?@Obc?IW%?0qrDd9r;UH4I@ib+J<9-C$2-(^f}D=K zbppHRpNTOo739_;sYLABil?m~_@x$`WSw%aoD+f;mW_YZrFT^{p?rY(JHvN@O=`k8 zIaSx=S03$*v$>8Y*cg-+IZn-Bg^r6)hu{xc@!|H+j>668&NockE0+qfwUi?I zh<@mV-KVdSK04xyY-6HJyv*50klHLY-`?a@h}-h=8SzO&t&q++*{dk@57vU{JmI*V zRjr0x)}%FpFd*dZP-;bhzE^h%Ow*N7wx;JMp?;Usdvg~^|}UJ%@kq`*83sl>w*tJ zQu?&Nu!$Ik{An8v1K#w(N5A-&oB2Duu5diH3bBE5=4bFP#I8W;_H`h#Qc2480554u zM+dgM4#JMFg`JTP+>4ifC>oEUG$+_NEgEmxc&lD_?1G*Zcn?=^2E8!*i$EMPz{BAN z{5LoLub)MY0{r^qm&|wafBD65i1cnu@{Ni8?BlKk8R9JoEay?+f?*6jAQTyEE_JI* z5Xc%1m+C_nbVg>a5g0{JM&Z;x&b7S`xGM17N-B&>0wa+4q~b!O25N z>Exxd7~nkoVS*k8{9wW~tkmKA@k*baYMXVo-9S}@teppmCEgK4jJa(#!FVXGR{A%NA(_4ndkLkA~T|Aq3M)3$k)0LyGehJQOlDRxDUcew`soVSgVZ(gTd zb}Or;N!w|uRXN@b9~$xZj2LT7Lyq|?*%Vp0yG9w3w}tE<*pNenYeh#B_G$EX!5HPs z*W~m8@NMg&I(+ZIRo2>YeP6`@`sjA_YuQ_#uEB9|@0%Fbfyc@yEgJvo6m(f=M2KVH z{v=*6yJ>_R*vNDcg%mcU=RBV{i_p|*sXLhcEepSX`}10RF&y;tnE3g`cYG__$VyVw_(Od!!%4c-{cU(zj4cw%MBLCK?o3ts!cG1-hnn1wxY! zEt)Dnr6^TwTNH7*&&GV84wtS)woHZ%PoJ0_qMZfJ|q*wzfWdRC#?c#Km;W+5lg#gPFRF#~O3mIzI>>f|(0%1Hc67T*&U zDwkt^$I)WD=-xb>e>YX@0Tvt)^7bD6CMOfPeX6mRw7|TQhacG^Om=jKz$5*ar{>?s zxfgi@*>`zxSWN42!)= zSh*B5d#_Pke%Wx_`A&9?EeMW%3F1oCyD)-kM%ZI&J#jjUm zS67K+_-~JrBK_x3kfE`)wHIweh^g<5Syz6gKwO$TglT51W*Xj?Ijd>p(awk6X5WhRhg zMrUJ&Tm>a%WN>lZh6t}poOO$T_$x)QZ`{9MaQ~mH&SHe!6Gy?j|B{g(si0FbsBxs? zau}Z(hnQ0rc-smXiM|J7${F;9+LXoO%D$Stz(_$Kr4ZV77FJLU)a)(Wqp(B`bkh?| zYvy9?k^u+6vzh%h7)$$xcQKEpNSK)&qGHHt0Tn!jwpqaZ2 z@FH3vu3cGHED0{R>Rw11G7<8m(=K?k-msIth$A{4sS?Jr)4#b)%2#9OzBNEKrNOa; zxb(2Cm{B15B%~@B@{6{Mi4)h^Jr?~YZ?g5nD2d(>Rrk0Kcpo+hDDxb6OGbW-fZNt@ z@hyesA)qCHPao${F$-{6l8-eVh+gW}QnDZ|BTJXf>ol4;VzxV3x!HE?J-7(qJ*ldr z?W^UtJ1cV>auec0M^~bs*mOUu=@I;&*a!6Y8&taa>br#(n+JWpdn(ic9 zf&7(?DLcg0{zsXKOR%uhH!@VMI-t7F)RaOeHVWjus6w&17Q)x}m&djqGj&=1Kf1iu&?c}4=pEY>8CAHs4tIauJUXTye;%pwjH<~SY zknk_)$vxtM`EB&MKWI?!4Ngkp6H^j{gPlm=SnmBWwG(%zWH0fJBI_XrvQdSZA$DeO zjvRgwg7|X>_iVPtPchNvuHTQ>=_q8pxa)w5v_w2yJ4bQ(PFda?$or(*)J%cjc?ocE zWYel~Z}Q?b9j*J=q9oPg^=0)2GzF%@QfJZ@&$1-8PIy)#M)cnZaXjkv&RRYlJhtJe zkU%zJD~Lj9!j0EKPH$FF5dI2o4%wU>2r5*MfyxuYjisPlg8-H9B&0hdd)~=E$WJiN zlPtSG{fKdqhUGIf_b4ktk~IMj0izAckX1#untpusdJnWy(=&-&7`oYlJg=w@OD+rz z)?^C3bd|#WmZ6wI-{8s8@B=2U7UMsM`W8vV@8Hn6fI+Z5PW}r^0Zg>irCqr}BI-F; z@Mmrq5xps0s?XESgdWvq9PKT%6xXXchFWK zvEK#^eZTXy$wx1~e>CSuu1K=m3Rk@m=R_;Rn_A@6T{fDW_PQON;3DeMM;B#TZ z6DJLyGkTr)2L+>?@8;h^zL)+W7y#SiGs*RDbKQHq!g-he9Gty30bhwiThwH7BNbll z+>R~e!QGhyDf?72LPho`gSF%<$#z1w9cgLJw>0O`=FM_O^B}OpYl4+IuI^c(~ zHFs;>Oc9hxFr(2JnWB#X7%o!t{zvy-49-gi|7rC0Tdj?hb@qLqk8|4kCG5-}$hr^_ zA&hqSo$Fls3}4ov!aBelEaUka<@nbIi{+*V$)djr^kACIObw!=N|gob26I(MDdf|?QqljXbiV6MgxseU2jd9wKX+ZWsK|%uBrbf_4w2qN!-p(?jyraP zp2F0pWswh2V3(b(JicQ^wBv1)W%YdJ061$UF-!*%72?oDzDZdjB4AAC>abeLIj&?R zpbmy^D3cXU7JgCs_Ek>Omr&74Y3GUm4NaVEXpoH_Oh9=8jp z&-cDfqe?7mM%o1i@bl!J%H=&EuklFE8Wtc=yI#bo-*c2qSl!PvLVYD}A^VGQsBMV5 zWyk;iw~h)qEUQnpPt4klb%ZzWeXPe4G{`q#{4))q26LF~bRvlY-G(r17{;)Qp(;pl z={mE`V5ZCumFAG9;pV6275q)DApZ+HK76sGu%cvvZr#Py2e+BWu!oVey&#kxavw>4D-@Sgs=3unjk23Nz;2p2IkO=#$eZO; zh%st%XeT|!>~mD(ZOQ5$?|Z~^=B8kV28IzEw}6`y1R^p2K6qc?Y9%$sVv>A`^l)oZ zarea!*BJ92ZJJv6H%Fn@#*j);hCHr-`-(mzz6_d!MoX%7v1!X|jA;b(??|L%rEb-M zwlWRM=M)*zs*Y}9^K=bTqW&kuMa%aTnWE6jr`xaX@2z4hK?v;CVf12DtjrF`g1Oi9 zA(weA+4i;}m7&MDAIWWXDPoIsGQtEs>bP3pwbSFPiuY>0iif+2@Qrt^y=Oo?5Cxn2ciUwA<}Q>$YEM5zU5&U=#)`!_iM z_oxFyu7@+-=z8Ho{>>jngyfZ!)a;hF3(+rS-y4BwiKlQmLu+CW?_v%3d#FHN=`iFC zfG=9BGj%iNHO)S18{@dbj5DfaU{IzRJkgt=Z4nt4(9?&^;Qw$$Rj z*oN&RWGhH?8sz*Nf3~i8w=-b~YnQYR&dqN{%*PJWvW$Z= zGHFl%E-ci1DkdIeI=eHR@=1a2&!BUu=xf9hU8B^NdBLefG;OUn?db;kOyj7t^cUed zk9}?NIb5Q&f&tty9%qwXLIhCMq=7Kg&8)(l+VtQ-LhfgSS znorQ~F$uvO*(YvgpIe(_nr+(L&&`_?K8NDjT5CRZ&ClwB6sMmW`m;B`^na*L^lVy6 z*sY?ekfb+`x|U45bE=>cU^@zi^=wBtx1g-MitT)9vOX zcaavb`2+&4|GnMIRTF9xemOjLIFIahGEO}FEzw~h&d?i7Q>oNJJ<8QB@p59~n%g}{`$?s2aE!}wA~Fo6`>s5Su&DEyf~Tj6?WBEbe+}jph8Jq94SZPL zYmX@MQ62I$u5LxJS_X}g9=2}?jJ=#fvM0N9g}uI~m1rI)ZO#|>4q`%FmDS4}`E2Hq zdBHfa+AY}=Ka~t3PD(laeRdi_pjCc*2QEmXky2A$@X z&nDG~H0iM-eJ(Gwu|N8dQc@Md`)pI&SED$b#|OAo$XYiP=A!E?BweacG+QTC%Hj{g zL>-Z4*}iO=S=|lhTzIbB=zV4wy{Vl@<8BN*=<>KP;=Uo7-r2_nzl(1C72c9v8SR9w zX)i-?_N7(%9MELbid~P*vC?WDL7}zjrs@A5f$YC*um11#&#g3J@^7pU#x{I>5?}ex zR|Q=97T|B%4u85S90kJP#JKGHU*hf`!{uCcv|t7aB7G+b$eVk*UDX}je_q;*cg(kY zK;5uc3^~hS!H;)eO_9{EUc)+B#a_!_D(|v{2d~>+GQ?YjoQkOr8>B}Yj0lRe3U2IS zFmDm+`3sijoo58!#8;$N41X-c4ZhzP= zo8)ks{q_B~{h`q>%xL&x+1l5ky$&a&UYkb|GN}Y*^?fK_D%T?A%I94ApkPf!2mjTO zBau|8zwiRCM8vWSgUW7J!m@o0G6a_&5m8%6EF<{Q#~b#7=+rK$V`H8VyF3PCWB3gP zEV^Eq;sS$5^3`*J=lxkPF$xCTwXS{q<_qsRn>Jdva|KM4yuHS}&@Q5R8Rh9r9ik_= zI^P9Pw4FIQBHq>QOpH!a+kRvy!ucm&%E7zmR^rShMO5tZTwK0X$z`b8y(%kFxdT!! z{NKV?j(K1Zdef!~N=xZuZP*RGKU=$MRjh)G9KjJogmwGkR*(-jK$PI?MtbZ`?68~m zTrnw;DfS5j`P_oCq7M<|XiZbnomi!WQ3=wivJ1Ev{Afo@CyIpfZ{>KGPq1;rKdzf% z_MDpAV8G?+8Sd`N0a=6VNxT@7b`06hGpjAiua8K6MmBT@0|7Gk`8<{T89)Q$i(8LJc- zH%!y=FR|W)AU?l$7OIXNZA7Tk?H?knh?v%pA1K4&eRtjiK_G)t8@H(-kyGZA{ILcwlDE z^*72Z829n>t-2G@nLbu}Qb_uR;CveOz~&j?kD&Jo0C(6&;?N}9tQigp*E|cU+mm*X z&FlQ`W4Q^CE!*jne81=Hrs_MyA z&_Z-kde)lHN8aWTfddB2*T}vTFF8o|g?l+|C|qhcS*Ae&kDYf997tV?zTi+9%;iF- zC8`lPDyX^_r^`pmx7iK}E{Y~2m0c@wvrhg@SlEqJ3FOI>-rSF#V)W2CNbEE@+9aZA zTK~Kh&>H{h3zttu?#q!EIvGes<#Yj^p~HzV`}ij7WoT0+*i+5Bir=){HuPclf`^WH zXVuv%%#H3mp2rP&=llI(j>1;Q;A#3=^s^LWyVtM*2^BFj%(QNO4z~_?;Ss$Cih^Z5 z9<6FCs6vh$h^W8Sx+6ulL#ymXqN*FPgn3R*SUXx9scF%`4X0VAw~N;BO)%7tP<1H# zHE*k+bQR&e)O;0{7u!aPpPV#3usjEZk>*@2X!U0mIKy_-Bu7@~6hZVL#1^ME$uunP zkWzlI=H};(>m)*2KegZIr%*WKonVLqy6i^LojjTt%J$w}S21*mdeR?Q|2T4I5{s`qUTHQj)}ErNuxDYAToHZ#AWHQy%qnEkX z7>dnw!p2@x6SUnTE^z`KDxUnwY5$Lpw8w(Vt(R-25f$5ZSqSY#4{(|XcWvr8U2>f4 zCwPk->+05vcaEJRw?(d@1#!>-V-1Cucx#R8a~QB>>Z%~-6lM;UI?kU7Nmb7co4c2u z!n)`*=FgM!FTy?#IImM=zaAQ+5r%(1)?904?6l8h**Z0MRsi27u6-kFR^=+0W9x{6 zA#TM5@rZ+$uZ$`186g;k^mKaV6nq(iw;4HZEEPyy!=oX04+R# zgxFPUKWn}^D>l7qwUVM~!3n^9tSGnP6ws{)I<}5FSiRkp=wCNA^n@y1W1j5m?r$bF z2An4zEN&HvxFJeuX(D-6M2&ViNnc~$1nBH+J~jsQyqNgj);o0_tTdr%UEm75&O1E! zaybY2h}CmKIO)Wv-dd$yFTO%hZ>~^Vw0{Qm*iBV2K4SN;yPNgBYvCu#eVu6pGS97E zIB(Bp*~tj;B!7_H)!8ST-c*C?!wTZ3CuUdDg82llZTbX@K1a)2`KA=6r?QJ>FXp+) z)D1_cAg+zNt1xyUu4i7Nx`7%pS#v`eng6;b2kr&oV#-jcacavr>2|?e-ZblUiES$c z0tmiP>}i8}dBXgyrqkAwVU!{^B#Z(-V4W1OiPJ?cftqBmqs%=o~W=%QbkvmyaFRjyL&l4`4271y172avN^nMJ) zjIUuit8x4Kxq?1P3}s38Ar`qa_0^njf>!D8LmU2j>=s_J;)E$Yzxm~!Kq1^+R zMTPykfDt;aq0n~jgYU_dA!QW^I`K5T+FdU_PV=rp{`))ASp)BUph$1UO|O zQe?xkWZ(Ds28Y2AoKk+pzKrKH**DRf{cUEDgT4aC0pwoarJM z@78J8CO^UFtZM6rm@|sL#3xq1t}lP38X1{|dH{<0{uMO+M+_-q(eE>>(u(v$4l*fP zrX4PfPZUlE?*7ua4|-c4Fw8h|6NU6}&fYZz)IemOC##7(-K6D@Qu!A z2IaJ`m>@R0%CHm+&?&EaNDr)Y+OeVg=2p|(MW5g|l0wKhv{Nt;f$_c#LISdG94pPa z4i#g1)V*+rnz&->Z3{M3;zamsIy?O3Ck;nW#9rCXUSrZ?!)lHo_4)l3S_X`rEh4b) zXQH3ubdl!hOPwgDc0+;oSSb-xGk?*#42<+b>FH~)+S}fEm}?&qi{f_Gq{(H0L@&`5{L*zvfY9Hz^-oT)m0I?D8kc;?62DL921kNspW&A-;KP59V zxW6{ppgW>3CzsZ|SrqUA)z%L(L<0{5&+j~{2kob9+#I-8dAIJMV}j`Y@*ZrjDup?? z=so$F7|pG)N@M^!Nl*C4~lqn8l>}i6IYAt+^>wpvYO=f z9LFQ%Dk(JK5v?bGPvw#~P>}3E$8^F-&jXOw3pv5fkP-`_3_M9&gZ3z|y()hR;#qZL z`;{YJ{oSBkW)Iu%{(FJ`TMdN%XqvN4u!wxgXUXEPsOax!hr}#Nk9o2%K?BVJ)}K@U zvcH;j(Pch-z5c;J4@lp9&q$oRnWlTBi}P5hCE37m(qQo|u+eJSow(tgiw1w|o@(&I zVwbb`2(5Tqv&yI&AG?EDU(@u*CC~3LS*$Z8`Js$UvbtBqGcm01$-%*`8g;UNG5n9W75ZX@3l$98k?( zS@JP{-98rC=z24`S|cyFa9gJrSp0VLb4}zeQ{2cHFqtBAY`3fC)y^c&b3i&5)cxsO z`V1$a3S*z};j;OCZ0XqBO4ON``qIfb5Or3$*ZfW$Ln}Ko zb59|)U_K_6%|v_k>+94SbCW1v+i4it1#Aw?3+MUfw-&SJ<%2izHste3V86+g zH*NNvWF=7IsYWQO_y#F9V?v`m{e}+;TRsZ~MP6zj~%yARyGU#$WHOkJ>%Yjcp!Qqt85#G^d#{9E*w&?N9}UNkEWPbDy4U%0ecnAw^Z_0f(7-m{ zi}sqEBaQQ$SR+T#MHWint&2p6twU62VoA{ zTl3nVNvHF$*?vkqr4NX!3rAdOe0aFuRbxeo+DSrrHk_p(RSji#L~l4BYy7Tx9F&<<-eg=B_XCSQL6tlE!{|brmmOvbTN}}d$DadA_kvMU zCM&W7ilyn$#bzvxeW()-Fg+JGLX@-M zNJ{#0z<{&FrWy*y2U4RKgn5P+R-aIW8i5x?dg}9&>9$nSTz|)}I0a`ZO=z3i=?$PT0BdmSrYy<6BGGyX}E&R!20&tRsFPCsTX2NpWonb){3ATI{ zrj1l~qm;=~aHqL9zB`K@?570o%+l+A23`O-z;94Y@n_C=dQ&k=1+()zO&vK$5Q_U3 z>X&h-FkL0465I-C@_!ybEbFX|s|p%pgKoeZ*Z%MI%}8fbc=HdU&Ur10lkNU) z%negRog-w|40AVCl1>|~F(V?3uarFzL)shOgr4LV@mh&;e_!7`s@YAZHwv0YcJ_JA z%J{S>-Lt2LN+2aYrY#nXCM^RGlR#)4GN5hV7fe$5Q0uPsHos!-Mg{$7-vf{V1 zQWZu52l#W>Fk^oTCQlK>Z?j5iPp#`#nP>d9C3wru1yl;BDzdVbMlbY<&Azho6(EC%a! zJit5x_yqCV%wHlSwbvn@^UhOeOq2CWO&u0=lXunn zS-z7|S0AXL>uqaRla-2@#96KXcI8s6sqvu^dX{bb+ROrl$!dkmxDiJlPh+u18qX|8CTUVJW;5^gwe!}s=GyiFxD%U5T+#8IOupwzsbVS2 z=g-G^SOd)HkI2Zhr+VLzfs-fL3;&VLJQ(Y|0uV-xf)7X%Q?hoMV&6r9)%Wo48p50V z*#s!?>Bo8dzPDK6b!MM69bA9j*oS5I9}NSo-T%cF$yALm21M5qL)OHW3KfQpg(nEu8V6 zbkEcU(Z4 z-VPv~MLVFMJA;4=E#BgRa-yBtiSlt%aJj-Lz}BYpj}4gzaRawp76|fGplwC;9tR8J zjx5E%TVJHm^ylvDanjj50Acn1B$Eq^r`ta~x~IpSAz7#ik(m(5j{Hi*(x&t9rLwBE zf%(a%N1L4QdD(coJ5vU}PFioWv*mm3u}2Zmv)5z*+c-^hZj7I)okznTmhv6Nf>Vr&Whe^7zP)dw1iq z=|y8KYo-`m)ln9Q=cy~A?d6Wc?pK)Rha)+*wKtx~606q6&%C20YtX^E z7w;qLx%z`JGJEe?aOnHm=MMZZe?oKDR@Pm$1Cs|YcrvbHSC@P6xfvJM{zq9Xc5G);IqhU5P`HUdvJnZ509Sk!LS1U4g$yTG|YtNewK^ zQ?rGX)<`2`WrnaRBGx#+#3hYGSxV=|FJjIetS+QZyEmg3%vN#c-Z9cz9`n{z3=#z2 zH66tVySn2!hT&l(e$0ekF94WWef^z}3rvKu*f_aCkWx5pA z6aA@l(K=ZIi!>0z^yYybe!QG1#`}}=(BBWA;E3-uGZn7h%bovA+=LLN=I>s_ht}Uj z`c@%q+TTwF$iIhM%J1s$v~TQvU9*y};pd7jy@LA7rDz51wBA;Dt75-sy?DM(W>Gy} z+@9|GW$EiTB>$}uO-CzaxaTj#Ne{z_?ggBn3SdS=hXp(m^%YNropKB4#=W6kqMm|3 z`~ld;j3?`5%o@6rKndl(a2I*VJ*qW$4qtoxc+?N7fDtbnP%6qi7X}IBqyCQZ7_r24 z-DFWV2do+Lr;>8sUzn&bJogfGP(eYcZ}75N$dP>Dj6&a2keHojRH=J{8 zp)=*IE#Jf-SlU|$PmOr3aLlNo|E@AL^a2V0JcS>bEJB~{{Y83mo${0{+QCIgTPMa$ zJwcy3Opn0b1u!O03#Zfd=>W-2OZWO2+M zqTvj=u>?)P0qSFGq>s)?fnoX;AEz9g0kfB^xBoR$>*hJs=)*Y=HNNN^FC|x2g6DXa z>So2UCYE^VYL=6H!C7`XeG=!Gz0cUeIqt15-RXT2`R@M#alU4O{1M)rzpXPp4{zB$ z0p%5+AGApsYS+rfmxb78FDW!eJJ5Ie!MjuZHN$v2Rz4rKosM@ebL5mjzf?XSsr|I& zYi5#i-;>h$hqjBHMfRB63FX=a2_9mrVpbKAmcwzNcLvJoCCmx^dMyr0YLu-f_2Yyl zv4w2^Qb>G6a#X_Ez$oJ1i0Si>n-VeeBv z*}KPTHe7ITzUly9S$}11CCv# zQJMdm7U%uG3x9kA!Nr)3DB$S}f6HC13RojXW|(HZdT7Z$=)1On*wfwq_G3I)W2K?I zE24d3OLpBW=##?h^EDrdDv6}KM3C*O*=Y%csCj;p7TRQ_bd@H?Uz)zAElkKj z0Ka}$^EWLK1=;&-W04j^FQ*l_AWC;>emxN#d|ZxG;0SlorLN$q@&eUxTYU8J<>3My-p$T9jR1VgDej=F02^>_fAbkai< zA24n+>uk{4z@0o(5l&(B=?$2+Lf(*)~{d+jV?LbN$a?i20c)GsvQh#F<$QgwQ zKw2wC7^V9jYr_H?5JaQBP7nriN6i&NwGzfs>xFe*%A`}I;jt^qg2jdR{~C(iE`L1C zzUZLXcPiSBSHZKJBN9oU3=U6TWvnn~VGG&(-G8Cib5z3hMTx=SK+6wGbj63#14vx?gUp6|FLHKxXDUUxuW?L%%;DZhO3~xSh98P3K zL7pSPg3yVOmO|DznOE8-m2hY%7kOEECE>2kV+%8gyeN`P z9QMMIs=>&F}bwPHvk(pZ22NY&795AT_sQ5$0nP{Z1armn1nsGHd;8h>x%S>@xzOOlzPLLMswNrV~b!`Xs!?;vk|` zhEp%5>C6H$g_BFcmX%t`9<_E%q_vc5jw5jOpA7^q6wzV;XmT!+xpdx#xJxneM9Tse zSqBjgyu-fa|E{wAW3Nb#tg=ddTuIsxL#Uf|N0sQBlSHI6^&jx-_wWWR1q~W&oa2O6 zK?;7(pHbG6l1|M|-@t$*c4}XE$Pw!pTmE8iF~uoq{}zotRM-O?Q}7iEG-RbX*Z^M2 zi_#Qgu)VSZm*2Mol~ZY5)~SP_MEzYoZ!*tqfr*D@-Om0;txs zX8{??X{X?i&hVKl7>`T#++GFEKS0?gTX z&RdCZPK>T+KN%Cw@>3gaws`&l8ND5E_9@qd&<>eQJ2r^PWx|unUVLzO&-7P=^23D|NXtb7}@ChRI*8IInrdHM(_POE=|0BE*ncsUONRF z``DY?uBefoVnKV}##K(5QP^D@){Y#%qRWTllba?u#ui&htLMtnXCWjh>{jD8ftKA- zn%ix#Q+3e{lO2R^PF5FXd5gALc_nby;!-J&c)^Iz^{K70x#Hw&w%p_`XjAFU5j`A% zIQ|cJR1hs*h!ohlV##IAt$>>Ua zap(OxxF504bWb3fH^;f&3=+FiJKi0a?}}FDSE2WbQ>NdBv0>sO|IA$6qrJXC+6oov z42b!QOTp-#;)33^b1@()`{5LLuZPccSAEz_XTpN0zbFhgQ)m1NX?IFd6D?7%VN>TH z8ats2X$=2xQTS7ou+wG9h7ow*7g85KIp2hqEB62luw`;6ar0W*;ox!?v8KFvB{Elh zeR6EDUjfl)*E+610(Za7SpG{3V8;H+x_{No?c+pqkX=>sRxk$79lqp;IoRxyy4M z!|sZCnFOr!(9RJ8qUc$_^)~@ydu1QgE~)Fu?z_$i$sc^^=+> z@-bduE#wwp8CbcuA?6ubxx2(+%UPz}y60|03N~9NmG~8#H2}fZGc$1>?ecOT_rj_; zxJ2>88PI1K@cM{6^#(H;xYFmd488%*RPSCTitJ;oK4B`A8SWAk7k!(g%3}rua8|P= zA$)hW5Oce1aL<1-5@y3|*_8smpfEBl%O-W<=p2|7}F6AvC86@>9K0@V;PX)|z9j8Ck zJv_)N{+vE0vz1FA-5I74o5g4Qm^O~dQf^|WBykHf7(11|Y%H#zjR+bj<;C?NN^%~?n2hmX*uA)8{cb7r1M z8whE}hNNfIM);eKMJ4A_KNjxW(Pr*F`r2uYS!i%}FVk^Bv)4$kD$!<=cI=5y-`EuY z3w`Im8-fvGA3XAsbK?KYuRQaRk!$#{>As7*BO_dC=;ww~^`e^MEaMF7)3y`~)Tjv= z{Tv(gNAB}=PH~ED#qrZuw&%MtX`ZsqXjBDd&00FK2D1>U#evk+F%!EOzV zaCZ9as8jA{3wZYv1EI$6&n;e9eZKZHQEH~G!jT3dD-zlbRLMmu1=75ckm`3Z2)950 zlKIE5$G0d&Zu)!9E@BNB_PVR+Bd2uki*6wFnCVw817{$_jrRJlN4BMg^)@K#_L_~J z<#5G2q_~S8xY=MF`hx+`zH@U6tWTyYd=@cx=*HP}`HFJL%TV1vXSVyGeU-iBf3VDM z-Mfu@~@LafK9l6h5ESg8_pbSP_*d{LnPKwXd_MIf)tq4v}n=>yxdRAZ2YI}I9zb4uD%?$-4 z%&=t2q?>*I^Z1%~t?g>ZwEyC)e!=O^44^OfwUgfvMIS8PfHR5Z6z$Gaa zwywyTq*(PDomLW-tUK%InVx$LV*M5)p>*GUbf!4e-qq6H42qCSr4VQd)6;#3xYG8|KbT;OzL*>yBux#+;Ra4lJH-z z9_wQ!IW7^Sm1?B@L;w9FgKW((yTuY-<;m#=fizGiT1~ZzJVN~w6JG< zUiu1`M|w=eLMYlYzMTe>a5TZ3-?^>OuJFI|jQ@^0-lgs5D}F)qs5%X1sPW!w%~i|6 zg7G7!c$eEsw@x5FMBRC)ug9JA3IAMb67Wa?4M*%I zKP@;sf|fP@P{1B9#&;r_BvWH*JSLx*;T}B-NLFBB(T%fDJ!8@S;?_s@+t#K_yQdv~ z)n8~zzfHQ24@VessgkeYy*5BIuv!mATYXWdp*cO&$r!ZJ({$FYSvM!R`togO&o zAeSYYy&eDKOjCdmP85}dTc<3Rj$LGJg^X-u$g>51h#dt2EPuR(3c)e=A&Yv|gZff@ zTj?upLYVemaf5EqE+PQE6Df7+s~1ri!^wG(R*0i z>tYd)3CQ~9dPg8UPo=)-#ipjh_Be1W%$I^BC3N|0<|bmgb3;xByx ztzgke)!<^OwI-~EU}T!bPu!}f=iG%cY$v!ac<(?&76uXWU-cj+9LFJ^~6#@ zad2+=KymZ-!*sH+X8>Ed>&6UI{RbA8SvY&D>+T zEi(J)A97?z2lHl$TT(C6Nj;HS>h`~y=(*A?=fS12Xk2>|xOM;Z6LwHkjCdpC?UTcC zi9fnN^&5WK))@5=dKEH=;Jt;{26Zm9D=_YdL zJ_=u8`^GQIN~PVk7Qd~2kQFmXbc(JJ!5qeoVbj50otH?ja6cvH zlT1HN%OnW?XsCKX%yZ#wRaq42+SAej@ni#wSUvgw68#FemtNBOyP50cmO^(b2s$e~ zDxAXcS%}Wu_nL|lY`;ZZadMZ>bdmMtFq!OaEhRpNJN+U-ZFx--6fl2IWtQ z#nNzPY|Xu4wd_0XBD?sU8aDq^T#TlsG*O}OsOqxUo97OOy>M38gY&H|<4n1gg!zF% zZN@D@RDvoH!A`O&uf~Y){S&MYY*hBZ!uG|b$#O`iDAz)OqQ&D%{UXKJkSYApVqC#a z0K;^TlM#*&<2`y}#n|QDVr6%bJ1oc34Qy4Gkmiz+DaK&Ku`1y2;*TogDks)7JqiH6 z%8w^Gn(V!Y^7JrIJ_h1a76JZ*re9>yqh%mJYH!u0 zNK8{8ztS%qib0c0&&8>5f@i&>Wrb`fEtA&RhX7w}nE~6j_wbSMaa^1JqXCZrx3*(= zm5c_`5DT@_%3OM8_LGPX-9w}`#!i#GbSU4$P0s<$-u~mlcr?|80f1tiV&un5kMsv( z9lGH&$^nqGjLfZhn-D7MUg+p+0zuKnIc)GP+<&7=vX+nRXqDx0`V--Wn{7>Z_bKjs zIi+dK$U2xa0py(}Ma-Y-U;2qxm}_CnTj93n(fhnK z=CjhF;6hPn%Yl1W^O5^J^s`o$vPf-#NX+d?6~d#EuDDP8*;jY`m0O~8vSY72%rtiQ zwHRM=dE621zqP_ir&#RBbLOIFuqeSQ!m>o_Q7k5frdJbK$pOb|<% zZO0^ZBv*}5D$oT|$jZBPwNjxGK6>$5D$ltDdLD)HNv9}eDgc-k2d2CiH91sVCQa9YNZzOl0$7XKmk|IAz@L`cA8a83JrjK<4?^FoTEYm6v z*w0H7B|V?rtowefy^8;Re%Xv8bLrt2U(eygQ-fFeeirtrow0h)hrU)veNOQNY+U=O zC^=4^ZnUS}oOycX@uL!N#w3f~<=(ap#oh}3+PZ|5;i2Qs@w%w{0e3TN?Haa+{#jpC zOUA(BvQD)qX4_#gVBbxaQ{6`fdpd+9g(Hn4bUb1XF{BcU8G*kTx?k=hDyUnK` z-079&b<0tCW18#6*MLO$0zBYem>d6e$Wyx6;a-*>-PBmv-eRagd{#?sh^zmNzd7kH zGiOZNZ)5+i8scvFB6K1#ze$mZPyF<5+hhgrdR{rgje0&|!G-UH(@u#v7@rgM`4Zi! zCyh~EQsG7D|GV~wngTpSLFCS3&yA31T6)Sa-l6s&-*ByoN0g$vAQ@}P_KB;GeK{Ho z<-Wg>+igp{Wbrf!TnI{${t(Y)>XEwQ0$l~k{Td^P@)H?HIx^OQ~wn+uykgqV0ji6l+Sg|W4~?dUSm=l zH_NoC6wd($WD6w`l%!I%?X`_LD_T8$ejrHGm$Xziw^5q1j$g|7^~(Y0(HeV}Q#du6 zb>mq@6Vj)pH`Xf>u}srMC34cEl)Ez)yhi?0m|0pPC`f^%N#F>SMSQ%#5bF75@c z0$joUdi^2r>_}qA;A_-QBTvOXk*C-0uMR{4Nw&7#zc#Bi`JSOwD9CI4$WmHzMjbu@ z?;Y`+JuNSJ(z=l!sXP7OZha?&(X~DG&u2q*TBnPKt&>?D>NZVc2)%tWF`G z$=WFDKg`?BRMnB?J*h-t2opFm!JEGv^X&T?V4=uJnwS1UHki*RwyJ8jKYJY3?@wOL z7{+R~oY1b+6#gTnez5&Z3z=JYP|=3ej1S z+20*ot*;EpfNJ?LnA)IWB2*ZZGp3**=idaT15t!W5QJQhY@_371h)jpkGesz)|q;> zWYeo+e=i8RpZQ`7a$}KjA6isUNKaDlJ+T+$2DVqtPfB^$Nd8N;vG86jv`9h_=~;%7 zGtC40>X*bN-A+nTv$H3(X|n5Q9IfKm=kz$%o-|yf$5j8DtrH7>gl4U*Cg^2?e=RM* zbdJd;JwYB(`D`7C$>?+=bh`Jr_)^VCIgOOy_ZMgh?aV)zs1 z)jX?1dq{^TI~SvprzyTP~RhnDPAG+NKKNJpbW->hZ6+D02pB!NEE9`@L4lC`t(H~aM*m8?i;67LQkIWKTA(aCSJOrnE> z+WvY^PjlC#*#rPJy1yumkF}QfPoC8GjL7 zt(zc9L=VE~B_x7~UMHdx1PRfD=)L!uDA7C78KM)t8%(12(K{2p_cE9tm_&$HIjI@oq-C@RuTPfgSIG7WrDS*PXx-VMi7`S97wqd{>V zi@=gFT`MYzS90&6qDvE`&ZU9J=fNz9~8D$GGSMdyHmCmEThMxm(?Rnb}95jUZ$s^VXlH z7KWcHWL&lyU~w!nY$BsWhbz*YIndc6$?_JmBOy}-7aYv!NL!FrQfg^iaT6JDH1~!_ zO{@O+-sA;wq}yuG>h!PV#B>wKknFug;*H&H-{ycd$#o>BST zl1bJ*C80E7T^s*Ju729?UI>1NI6GAkAry-_8N4ugBUneiWeszXN^|b(N;=10=w(RM zRtU%LwI8hK?3J~GTccuCY;(JJeDhgy=#b@U8Utl#MN~Vn?3)^TFS{Yyu)Y=oB4t$L@%b#3dDI z>3Pc6><8*`$unon5|QxUG{3sZq6k>+FVSK;2L_yT&nt_Mrb|G-^X!~kRBT5ZIveqt zwWNM)eq(>W@jcwhn187%kGFj*_H9HtMXocK?1 z9%KE#FB{pg4)kj#3r7FxvBgsSXNG~}U&03tCUaI4Wb3b%PD4v&5Eb53qq7b^)Wbll zp7L+nDKo5y-=0>MMGUw*FYoMqo7M}Yzze{Ibkn}@k2_@(d$}w%f8uMhmMJPvXNv1N zPl(=}tLx0}l%9uqxntZ#E5#}+8Vl*pU)MG6Wk`l%0M`8WKJjZ9yv;lLJMF7L#MbAk z9r?uwvLD5SnZOs;cvPD4bJBCXT4V>8MI|d8g_iCQ{SYLhTL+Jz16XCA6W*{J|9G8= z7iWjUC84+RqPJLt#cLHJ%3`RcWdYGjoB+~CV*5?-_xFY@zq#UAe{41zaUD&R3B2 zVzu-YQ9N8Y9#-__2wN#OQF+eqY(R*_?xcn0V%tNVm#T7^vjlnBg@U^hPk6^})E6Zq z+tt!yphHb$*FP7x&iuNOxzKnb5p4pi=Zo734z175@~)0f*Gy#Hiv=(yZWRr%XrZ+?wCgF!0d@nA zcVzIb?kGy^(vADhs1$-9^X3p4Q+CdrshWy94F0xDtN$JHY^GnfMN+#BQiBtEz|TiI z^PXEq97W?Rkh6q2z77*Yb^3>cm{>v7m(f%`fHIsg{hhDqJFKRK#tww9geGtkB=D-y zdRBfN1S!0Y&j;u`M8XQh=#o%vA7I+gWGJugSVo=l9ENuMP?4wROsQXFuips0k%O9$tCEPlw3A>^*uy>5<07AR{UH1%_6zobs~EA&Y^Zi% zP{^3KjNE6YhInBHM~WK){branI@rUi_e4n}P3L_^1KE1j2vFpXxz6zl_vD1=ROCc* zgXxrs9OBf#g(sJ^hz-(<$ut`L*!A6huxHIZ%kdK+E)+ATeb*JT_c7G0mQ36+pDp&i zqT;+a_H#g6iVN^~h*Uie()(^gztl-*j;PoBZ)28&jZr)%#?StTqoEqYN%&GK#ukA{JbgUC_4z8Pnm#d<&2fGs@nH#2XV5no#i{;}o% z&*^DQ9&m=0I~d7Q*+giu@%pT?&kw%siy!8H>bL$bn`7C&XunIWOU7Ylf7VYhmhG@o zHQ7+^0mkREGk_$#)mmG8Z&GF}mZ%Kp@sP@x@4@VTA1md#u&`}jXh0mjh~51=T}=aj6K0%#eOC~TFRlFx?aN`s>(7%p2scZs%39=N zY3WNGpGZ=%pNjWxu^A}a$iy!n{mHNvU_3IWJUiugSaTQmyNo^qOD^HKF8;o}kMiNu zrdQi%#=>?B(sx$h#yRfEvFqkCzR1}1Ey=)>Mk2dWCA~Z5F#!CJtD%!#jNyWQAG~|c zD4u(Uby@GPH!A);{$~1ps~k1kcmyL$m-f22HP@GoXIFAV!OXX3oB(eb*6Ae+_RRSm*=&H61B!q1&#HtEFNT| zVKh4aw->SThdVO76RPwr2btkgB!er9V=yHY!#%Iiq{hIpXv2A>U?VU3TxOwh44QAR z7yO~(y`7?WnaiVNG{Z(?5;)-0#MWD|HFo){o2IWsokhkvo^x6qL>@4o=5`d8n011( z1&}os#2;t`WPC33^LJq`qYH@Z1n;TkSi8x(Ts@7#6!CCD$R;6q`jK}n*||Tw z#my2`YNqa!?Y9G|3lLzHd?HCHzd27oUC`ys|L)2$wGDKmgdery&hvj@-97@eUa%P_?UuaIfV;qsuj-rDx4%k?l zWudAK!nhEBLAFdctjm%np6O9(sl!5ye^`&{l{-wXOQ|Y4l?`InDyo9Zs`J(ej}X6% zz>;vUGj0j2t$4@I!Cywab*R<`uFI$qysotlNVT~(LMt9J#_$;A8dcTd`)Wm*w4%Wv z(86j+AbHoTw7&n-)B3r6y*>qfU2J-G2@$ah-pFL5@|_vWT6t=>pf~zqe^h&spNzKHUhtU$Tdm=0tTGn`RReaHe?DG7=^hzm&#t7c52eiCGE23| z2(oincLK$V@;d|966y->m-~rko(vAm|A*YGddu4B&UXha;Q6w=gZK?mdSMzq`df`u z%b~ThCMi`g0c8N=&X6^VB?}D_9&P7auvQ>W(D3C$*)FHBZ`OXTd=0MgmSSh6-Mx}& zQ-sRi+{vVb6Cp!St~CaJJi7Z247tKgXP%jngz(=lQ()dyxtko3J7hE&*vHMjIKQVV zVovzm*uee)C&HLj6wpLs&GY0uCdPIqu8=X&~{YkGJg+tx!<<9J@0XMVyNz% zumZR;lJPlww@Wci!nLShK}K+-v$%77iDbr{Z5dd~f9+8l#Mv-iw!u?cKf641i}Ufv zan`HwkYIy_JIn>GfX-v)uzGyIf6}g?KL<&WUA7B1UH$)Y?mxp@Q+xs3`bE(Spz^L6lBI%7!SOOb1U|-su;750Zpf}9InG&69r12VOhRYiMa4f0UOoyy zN`IN!Q&@-7-rrw4+E!TSIvK=B5Bf9P_weI#0}kDWJVeSH=AJnI)csB4_V8es#UHL| zm`Aw8o9<2`oda~#Zi2O~!560D2(XuIzWxyC#JGx6B%89yC3Nc2~FpDum2p#4s^NRfI#|n4SORP7{5{K)|Tcm~8%ddwCTll_q z+H==P_gA90(NoK^mCf!&moA?Zi8_#TOD5FFKfXj=LGUWFaOmHr#doH&QVC5X2Zvq? zUjkf3o*fBWxz0+34f_l5e(AYrcNzAM^ZO1rrYk!WuDD0N%y))i}eA-cZ*VHI$+@f5QHH zUS+5l9l^S4sbOkO`Z3hvvkuqma?+@c>&Pg6f7lx^f#h-9_41R4_h9nh*3w^P96Qy? zFQ_vy$9;Bu92#D{mZj_y3YKrh0Jk}zOxlO`Ui!K7)qg}DpW*Za3Y~9lG*htWyE4JT zn#7uP$@dO?jiCmc&LjNInql1I_e`^+r*xZLzb_G}v=lGpFpE57!&09IJwvI}$Oxds zmzX6ge+OBq2-9Edz(o~2-0|FVNpRGB*R2}B6zDeh8bTn{@CwjUK2Mn|JrOwLYFB(o z8Q*F3tvJBcKBcmU%r_ZsZZI|N(SFsQL@UyL` z8TR-it-1>^cvOZ!s%4Q+kO45q&u1nsK%E}qZDQx;LR$YRF;s^oYIxRDnW>u6SEVI4 z8{zOq17G%OL$l&d1ItSqavZx9V_|Jz5^Av3L2>Jc@pC#moQ4Tt1)N|hjp6!N`k`i} zRuP34;~~>#syS-`W16EgCfJ&{KAAJ6l7ItC|CGqX28W%+im(f(%PgoxCoq^>Jaq?X zxDrPo@*d1X;UVkfLwwibZ(SdO-=}k+##&z|dl~W+!P?x0bz5<$o;LdJ%=cV)WcE@= zA0=6ykRmOD* z<|W1o2kGBBCL01C$lBZmceaE5@n2~EX9^C8`CWiBM%vs;&O84Dm1Zm(7T*MX_gbLx z2;jKJtJGt`Lv5x=dZqU{#&)fhmk2hAJZ+?g5@^sK*P@HG!|>&%&T z7d34V%N`%|-ODEVTFcHdkbk>=lNOY<+s|cE$P%E=4^tYJfCYam%{#*8{Sd=*g1oA} z7TN&D^=!$LMAAi2@S8>Et3c23jq43929%#P2qI7n^KMz~>I@_N1yq|EY53u~!$J== zpU(nrNLWjk{uFPqE}SJ#R!LO9W-JXK-1R1c3#NUJyw($hk6ja8IJVeiw_CJm6Rb}Y z$+}EZ{DggP*C9HgzF_Rhc+EZ20hXvYOT5|i>yOp_l+7sgUh*h<2yM4fd8TNQ^~tMr zGx3XkS~Wko96vPGbL(2@49(7NqdCm4+@o-y{cCe)RAghTfsF7W?M6NIXsnV&<540yL*p_i?YkY+VBnAF=lVE+YkdQFV@ANKTv$XE-qF z=bJw3{8eb1%he6<7i}Kxd}`j3>aY2?=N+InQiu?I9}WOgy=n}Nk(*KLX27H>UM4?gMUU-qi_V0WWFEur9^UUw8Wj~G3c z|5-UuZ2#RNbZ^Y*2j2D2;IY3_r#9T&J5vSX{rT|&M#_h9dYf=(NoQC?RA;phV^LT7 zfgE|{l>c7dbNyB7e`A!?9|trbpjBXbguY`JQBSRrfuVsA%;&IN;J{L1PiK54=8jL+ z&-d!$#`saz-BBX;Hc8y;;~~#m{Y#FJEhc0F8aCVJB)u%(*!li5=J`%A&4OtreRXK3 z0JwSPc*rTLRpE1Np{o*2uzN3^?p~TZ@YljX4}vr>M2}>`U z3tXq@DJ@KeNVq8v zc$g2AktB(jme3hX|$c@vBtpv z$s+%al5@f)t0Dr@y8nTv(y?ab_Uv5MI9dNTeL*Eupo;W)H)tVZKec>Z6g01Y_zKg- zZy1UR&MyJbCSc6Y8Pc4rf-G_;+y1b5$GM0m8=DwM3_AF$KgSg)<7WY?z+P`%+KeIw ztzY`hGPptSGNYv~h31C6@eV-1oj-qs-m~`gzKAcUX?goz&4(&;j>uJ0OFaR@`;j%K z8%jjjfR?@S`|YuID5dg^tLt0NhxOXPx8w^d28=uOy<&=OMw;zvbZhax#-yh`6ztpM z&f#Z6cZcpPYll~#_6ySpW0V4p04F-;%r?Q?=Yjd}ha2I)%_PidiK#T^G0F(vZoKarQq9;<(jy zU5-Hi#>{4=hvtm#yR5mgAf@q}fNx2+FR%JTFQPI&x-r*}-F(D}$cN@T@;4_@K zu0ZniJz%KJAF;27EcYL8-8Y`nyA5QKD|YB=pznoQ zBlDr;3?W4B@#rD#&l(F3bMD3qJhre9`BLXmi^kCwB|}wVX4EUf?zAyKzTLnR)*Vms zhwW+dSoi$k7d))C(HK^Fl-WX*h|o)v@4+od0jK2VlT-*7dadE&RYje>;m+}?z4v?6 z0d2-ye=m1Y1d~&@VT5u{P}VUC*JeU*3|Ec8PLo~LgpEOid(*`6R8yd;gzHYm90qgx zYTnUpn&NuWXMq^tcO0u<3&9G?|$*rwOMyc@qX3^*HB?dMG~z=kocnkTZ@83I zs{IP_B=)7We>)EvAQYY62pS%#Gt5psh>P`cQqBx{_40%PS->o&Ch3c-EUZO=CGWNy zN!}z~XZ7QAtgbnaXa+X*I*v!ahgF9ePcFNmD&myBDC<=hEwTN}pJeln6*bH@%nS;M z*FRTXyz}Mn-L+{`C~8l(Rd>mXquhe$f5UEbFpFhBvxR9hRED?QSWRsks&fDo%!i8U zuQu4TeuZ<$XDKcVWgDto7mLJ6k)LXigjY^G7K;ygQpmCd5XBc}5LjzVbbZUOa)3sr zjqQlEr_1>s`(*lfZ8od@u8t=- zb29Jf4#6u5{XIMr%v};6j>(xjW2!tzB)~!?JMD^Bk%~WedOvzJti`a9!gHxjcV)n% zMMk1&Bx!G@+#Y#kKxeXiN}4l+#>3+}#T1msL+LD>zBAXzA)@^GZOI_(b$M$VJR?#DsBFCaw>`3hY5QX6~T zLg?5$BAj5VEL@?5lIIrA=a9L~BLlOn(XvXknkPBk%UE$G^2bcyb@ zxL)MxlkZ~9A>EJb25+MtW-pH2cQ5+#KDD==yQ>@@7%D~VYhjhcJ#8{x9lfva>vrCf zx6B{p_?7Mnccn-g*Zu<*^{qW7P9DETf-t9&tnhH$(rQ;x0Yr<$BrB5fMwJK5I!ahC zb!B_|l(*bdd^B7B#M%N&#VVL8efFS>CP@obO|BfMAQ!y8doy2}EsE&O=Q2ofMgMu5 zA2JKbW%=5nb{m%E!+%R*png@R3Rpj_r<>^(xfU5wX#A)}GOz*&@oHefS$+9<@=?Yq zDDo7qBDA+!60;qpjwkuFJIn29Y>$cCI??UiFY%*DOt5>H|Ud8!Y4&k=O$ zx87f_RRe}rY(8cy7eq`hG+cy+C%`L#20r2M-1Cqpr=9iAN$&EJP6B@F9aLO2& z+tRWKLjC-PW2vNG37~I0^|yJxmeI?10iQ_>Sp!BX*q>g=gYV6gGBcN3G;3@WSkXFqYy2er zI6ZU52One4>f56f+;0Ug#E|PG?bj_hM^Vs}?)i$a4pXymQX0ZV&ll65e=Wc#WxvLY z2Q?JU*IG#fjtQf8TQ)LDo~nqlh!ow3x%%%UBGe1a&Tl{WI*hz{xXf28e!v1@HE~fw za0%siZ0yz{H51}Py&QLX7V!i27~YxAKYaIAxA(4cC}RgL(PfGo$Tz;llO68StnzV# z6u+N}*BCh@`Hsi<*CAl(x4)MpB;_cv?(mhQyk7W;;D!%;bnPqnnR=eax-01Udnq;V z)z8mFxjx-@v-$=qh^C$JaI2OKO4hKZxN}I$9z(V+4qHkqCU;uwYJz%l{rtz^nafDw z0$~U$?Yw+5cpE?rL@HpXFXjsaITudQDH2qo^vc_>h z0ZMPHy+E&Y{wx}ngZoAY;kbI~XGLtR^5hhLqZF-O(Am1gIa1ztYw{d<=3Ua^n$JZ{ z|Emkxy$?9m7}V*GotwV&C)W9U7QJug;vIZy-CB&yepUN}MPQ}H09=MivN1vdW-fkR zx^{3Y{78yrInxcDA3ra1Nt-V!t?b|aX!Ov$Uwx1|+;Qxsj}Z=}wDpXJquY`v^yN?C zSS#_74|G$t!s^vhI|)%;n|}O{KSUKg_sUrcYcO7gj-=#Dz&Qkq6H1Nsq7<&4x6`-J zj}YpnbQ0s}6*5#(WK*h%zl*G8a>~N@k}uT_`&htTUdq^fz<&^-yV6_MGI&~V_BA?aD0ZojKM(#I7;WotAp%!8bO$F~0Zs%_Hj`U< z6MWw2jbXP<#IXdW5XLXaDLXW;9rnx>Ddl_T-6Mm{z<5SU^-5e#9!aXS6dov4owauT ztYnvuX8H03{Dn z?1BD|>~|2l>+Wi&6mywSNF1-19UdPOW;OjM&bxb_2l5=p=hYw@$UP(T?FxRUDX3!C z@ilit?kpvIue&afJi~cu);H_v^)J>hU9Rv1k0zP+Csf=p#ImJs*gn_>gLT&qV=5wg z2zg_z%r8KMgt^IHYBlC)GQ%DFzq7|P_H(U7=LfSM%sRZy2OPQJ$*#vCxU{h8 zgqzJ-tGsx|x6>Ko~> znW6wai<*WDwCy%Dj^4p)dVWJZnYR6srj+?n|0u{zN@*v-4d}gRMJ58eN9q$DogW|aQT=$(eMwrnEvgeacd2+`z+ujK0UXr1 zz(O#O5a@g#G)D`33>SGf&BG{X9YWe&l6RJD6ZE1hATo%fn!8J3ZOHaXS3vAn`ithm zt+|Ms4;#QHMs89KvXMN)=Qcr?He_!EHHxtLGaH)MB5 z8^^lr9|{n<1yrjN!l|r=D%LC;^+_40Txw~v>b4lR6`!Rzj7QTSM+p>wJ@}mkZLK?0 zi^nEoFiqzC@1Dt_<&H6dh_MX6t-Z00Jml}Y}U*z-BZh{Dps9MlR+9XTa*-}-} z`D_p}dU2Uh42T$~mCAN6x-+o%ji=o4XvsaDaoUC_III^Myg)i;GIAREdON^$2il|Y z94fn%bFy9TPTheMeH?wEJ}>#6d-d42n)YzV#%4CA_L6a=i8xQzZT?`gU2NRcL%aiU zmQp=~4>tiWW~&8fx*(XQ*?e>wX`EBoNj|LjNd4u{flmur2U%0m2Y{^dI8@P$^LI>K zcv(}7i};xBmV0I{@YVF1C69vf!iM!g`G#-IX?n|@URuHPm!Ev)D`weWsn{}(V6I2Q zR-f|SD2!eiJWBh^S42^BaO!R)9dfhzaWslTsK~4glZhgD;Q}+XYgI%+r{C4)A@zlJ z6M2xvkdw#UMYkb7pKkeyD1nY$0%-NCB9gN2e@v#nvR|lwINs%)F(hbaZm|Zq-4D zD>UcDPyljm-4^GoZksW>x7fe9cd|b~g%@JCWl=r?2a6M@-=Ibu5w)vIzCQNCt0T5P zJ@4U1KU+!rhRZ9oq4kaZ7)es(uo}0`tx~L;RB2R^hn@5CmQ{n&u50YV zfgr*hwgF8_bSpTayYB7D+(f*7Q#r%ku6@D+7qwwheF#_1h-$PSvT757$@G8XWH&9t zD1MgXd~x0zS_3A=6o-bq&en*r7H%1xPNX-Ue|TS8nV%R-Tbb}77GAH5Lgii$?wEkZ zwmH7KJ;ahsO9c!o9S~`eDGY=#l-~DA(+#`H9L3fdQd3F-e?HA+2;n8B-)^EWJ5^;e z=>O1bM@!p8uD?K7U*T6D%qMQI_UCWK0Ogy)aF-%FjICsyq$gcUTqyJ0f)_)S90sea8U~vc?2GXEa7}|@L82f;=H|TnmLWv(M-brg} z{cve+njd_A`qt`;k@wA#;&k;DBI~s`uBA$2Za&|pXGm6{;=*=v_GK>2=dv~FXVy)B z$IG63F3Z~$K*Z=I{+!p8l4wA#F8miCEeMyw#iv%iSx8!W-{@EDU9qa3x%eEgT{KAC zr8bcL?_L1mKFpaMJ94Ux*5_@w>et#389)e!4mPvzcGHiT?Foy?tu*jzJ2_B6@~-D@ z78Wwh=sX`3e8i^(!ZN7Tkw??-42JvdE3jes^Q^};Mg(X`=JtlmySV-b#<>3!44XcY zT0OC8{`A;j;2*%pPXx>O&h@tHcLrm_wYB~~6vI%6j_G|2CBjF)y%!6q)$bKS1o3&N zJa;8TU4}@7{xQ~!{J$uMp$qD#%s2Yflu;eCshX(BdUKQP;qNw5ZW zQgi|IUBQv|LAqMFc31t7tme{Fq2@AJIXXk$zWSbd9D`_FSIodS27sFvu5&yU#w1wS zP+H9Lw)}+J4GG5VRghzM$?uRMFHW>Ii{Zj+`zeUVi?bXOhpTo`h>@z@xrgNtLhm4! zdPu2m8RA2B`+^dmyp?>cod!Xa@;U96A3TtqG4^OkH4l&nJUWVLd3~L;1Sm4Pbs`m7 z)ZW({cRiX_c@<|A4RE#%|2_;Fj|EUgWf*!yp|^^ zawGg2{z1^HH?-lI@Y~@C<)lWut%7JTJ(m06D|cIP8rmmdPuo*A+F*|cSad}xms5z< z--b2s10`U4@Pbd;2QdAwfQMCMH-$r4djkiJr|uAM%ltG_&^Bf;I1+fvxVC@rlErnQD=Y zZZPu;&y~h~KsZ7J-FziKiqKuYACS&b+m;V&JYTgj$o@e>Ic?^i-eo%%@qp;yQVx_- z@5`{z7zTszq1wyOc9q0`oE{0d^vAb1KjWzaK{-;goBoa+CN#eln*Z$I|cRJd1C zL4r8sTznQxVMx`9LZE7>Z!Gws*?CB&r7?aK6K3Evrl3cOyeOrF4l*f*@&nEG4M zH8Hf9WF*Yki&m`vE{Or2hFeX~&A}G{BHs+iN`6UG{kKMd`V=uA67BjiTqr9(8*j zt#roqjz)h;p0BppjfDHn-O0D^UGGU{Ie&#MQqus}t0b%{*Cb@@$=6gC+41O_TAXV+ z40^pG@tiYyjBcGXN?`e8?x|KmQqH~qAoTh0libIJac2^C|C#zH`v>)Z&+^}H%KwA< zKfHWV0IkMP@*a)uZp^>;t9-cn_t#(HqhI3Jfqx_pHvi{Q@*jrWhYgg?@?Ue~qnbK@ z2UwJlcf4b}?bUQ!9}KLh5VzEI>K?D<-v-S;DLP?f!^h5h`*DJ#?4f^#%ON!MaJR!$*s&%F;hV+kzodHjaVyC*ky}}nKcW{O3{`O|t zS4otot`Pi(3cz94IR41yFAIkf^?ltj>XEmP>%!VNFM^xLRc*0;CD&$C=cEU^MC=51qW;`!#dddWW# z`y<@XAx?kVsdkDA%_uOEu2O7egx__>o0(oZ`wk6nhSJ$}3g^XiYh99RWO%$>bfAF` zCy${FfJO;yT5@GD%eSeF_h5Arbl!=MY?=_!phL{rg}1)}0MBRiIso%uTIIJUr#;Z4o)jjZ7qS~Pw@=p=Bs^w4xed;6w&Krn zAenb8Iv_)LkD@64-KNZdL+daZEh^;IU;NRB#51+5%W`2oZ^OoA&fPGy+AH=t5UxS5 z^V6wfFqy&6gXomc$?qlf)P%_p_TwB>YkDg2;#cbXCssB;-$5N_o*P z1HpP3Ri|e{SKI!!gAO7Wh+`Whfw9hA)=p+?hg8~x`<`pMF}Qg6X7wIaUA__{ra~Fr z9~l2P^Z9QD*&OLYGQK{H6JMMrXGraN<=!7d)z$r{1^A-{n`3AQQ;ec zZ!0|;k+F0Hyi;!TFwO)RTytbjfAmWAzJ}CyE>!asu%QTKfIP-|w&A3Wlz>N6N4~-YeM2TJ{ zSuwsu$A2_pNVE}Ms}U;VvWL@&6a1Oe_L<1mokaNhoVBHqs9vU%r8~HR7I%(D z5Z3p-3Xg-_LL2MQMSjIZZdE$ ziY42x@m3tw`~R7^c+%3KTltQr4k0KL>4fo?(!mZVtl{BJ96O9+%bV@nqVRQEBmRflfaZoG#x!f+XR0v8dCdPNBmUV0{4XK? zU(R!>CHy+z(iB(ye*u+E1f*5oJDN5{K~D>r?L|}Fr04U^vVQQ`m9lxH*e(+-UrGl4uVMh%XC@%VDY0q(h{ zdgI_XN1^V`Z?7IKX>ex<#cp-<9c-jf58^u{ksg1W_`Vgo6p%{rkRtfo;!H^Jw+w5p zi@-j62T0l}3$jprB0%oY^_6-yot0!pMJ{1R+q0M-PK>gd3_gX7CGcyE$Mvbd)-E*+fBa~x z5&v}1Z@9eE^DTLf5okH)0c%!2sGFe?Xya@+Mo=xd?}dPDb^2)RwL6=WQ02cwB%a77 z6^GChdIvy(U!)jMj=A|GUjDD}QO)`RM5Qtn8Gg5Fk9f zIpYcvHD2}S?p4pI1-Pcb0r@sTX%0`y#uw6;o)wn;J5d+{sS@n#Fh)YkL z+kufuW&7SE;TrubU7xKZ!I_LYl=;9^Lfhfn$qQ1_R|ykrqCh|Q7~kX9ZFx%%al$Lk zwxM-eh>zgc^{VeJ<%g`sFTPA2X%Nu}-uNCh7>24?(b;Emyj`F2o9xu`OBAb!YqF;? z&=coQUDFRAY$z!Yo_6C=8B+6|Gh6s^PVxwt!tmQn9`geoj++|s%~@;N>-^jqq=TgQ z?$rWu3;&r%kUXoKyW3{2>xu{?(P1apsF|>|uZ8aN*Yk5-c=}EFPIJlnmA%%tt^Xu} zsLI>iE#mVpuPr4Oh<7YLBangwrdQEFXgOz}c5i~r&9wFX zy7g-cI@$Y2ig?)yC#au!eC=Vb>eKHI`|L8P7MTkAVm@BXsdUED5quAN}_W;{O6n)akJf z)D5GRzyFte4yrh&`jx=NBR|^Lx@tT@F zJ1K1^&*{#)oFm?=JG&hc53cMpMx(|6lji3q7@_vB#=c7Hnx8KL+lWh&D^^74vscSh zKZ@`FFWf>Err<9-chbVQMrXYfpSMhguN8Sc8W?l>v0# zu*B=TJ2z`|DuHRusML~7X7Uo@^{YTcgO|b0Cj#t=S_2)BVEZ0Zd!*%3g5^qEW<9WD z8mxRIf384@!UTWwN2s6LS8&WciB?dWbmZ7?Fl78|RZuwfXvlXl={>1qY~{JXOA+u} zn}g6A)eejX(N9=?@8kN}<*Z-0=fj`o^qTIk6w0KAQoR`#MQb~>ug>DS(>TuA@?urW z=}&WZpqtDL*Vqc8h2rF#f`#PDY~`2^C-5W(apo68et{pKi})=?znnl!2sN$)AE}YQ zIqV(p6P7znlCiJ|I72^#0$M*`Wx1^g3%m!B-d7T_acq**#5eHdtoh8cWYt%Z35}IG zvo3I1510DCqL23{4(zD{z6Wy7BkVeJfXrhXS7lUwwo&+D()jVlgN{zY})G#CZ#5LXDvoYsi`*w#S+r=6x@RQgg<1D3eORL zYGxxgMQAZtqsX9n2B4uRKz-Sz9kD%)GwT(yBcf!$`A;_W{^vcn>KY1jEmVPi)(y5;S{#)!%s{m!0x2xp!- zwnW|i455DU-*S3?+wh-+XQYD$)b%^O)n9-9>pkyb=1IJO-16mI1`j!u+*R(xl5=*T z2BtP$ZF+}L0eNzQeaGTLg)m$C_Lzj-p4d*plGriLho zzsMaKX5j|bR{`kc4-65a(<`?T&_P5eVOE3qHVK|`$w3UmmDG_})gDrz6RC&}P`ICS z=cshl)mQ@(Z+F)O&-iSqIMO<~Z*48dFfwMl1bs&u@ZT)kvMk=EVzT*6KokBuB56Gy zHsZT^NA<6Lt0|W2=d%IY3$^_;iB`ww&=Wj$aO_u>(&Gmh^w?)9u;^{ddFuos*9bj+ zhR`vsPpqwc^(}Ufdt)!c)kAskutrNI-;zP(u7K^7apN2&YAFlilDzo~27Wu{lq6;R z4FmA5pB^(*jOS8}EYM>ff)$!K-tEes^0&e#8G~O*x@Di{W*FIHNcY8mfX#&iG2^bH zbSXV&<)iO*P%8ehN_Us@uttO>@$G@tBr;32LomC7!&+~^gg1?_G}Mb&uWI%+jW=$;eM#)E zczYY*=bs4If-+E&bs|mLWlmN@)N+C6OQpJeH{x5sKExvs-UY`#Nwx4WjpylJ1n?;9 zPjyq|7|Z*2B(myHyKfjx&FoiHU<2@9v)AV^f;Rci0bS>;O^NS4@v zfP;^xAxs0bBCPk>c+cbyy`ZYh8vn1v&$mlfUvyR%w0kp%D)+EzpIsno$_NgoJD?iw zGZi8Gjw6p(eM%B1VT>(T{F>piAJ=uB2_Tza`Ztpcg!;!w5!V^m*HB#Mb-2^@K`u1D z#aCK#OaHQ%UTwvC3S9v;YuW#isz3_LJFFU3Mm4cwq~YG6$@d{h(ZSK%Cu?74DUlS5 z$7{};x2tXNlJ2tq5jOjeaQk;6^et*ar$96BzeH_ycC6eD4{<7qe%a@y?*_4FRSj=8 zbf4Y-h&^fQu<|s>Uj)hCp``{J1-2=8@eNtegd%xgdQ1dn;zDwU2^X#8)19?I$d_{) z4>V&s3k3occY<4R3ki>N z@B7}p=iKkT@4P>MVKe+xy1;itNSmXst zYz9#V4S-(ksI=N`{XM~_nqa%T!LWhzRY$@%3<mkR5N)PA3dTyzgQiKM0An1rcTt??O@%(unJvlp3o=D(YQLW+asM`ltiR?c=LPu-r?%R99KZYB%)_=Uy%x(ig{OfI}AYR+snX-^X zaO1M*y2VHNDL?Tgn*OK6_`hWA9|+L5SL!;IRr`=URNiMD+k+D(r0v)SA}boA$suKR$)YMwLsp}ewld`$yQbDYohuJv~F z6vbsc%9*~5<_1+HovQ9Oyp?w5mQj$jkLYkg)c3C69y*^i8^t%CbE6-nB8ybTkx_c1?oCrW`z(p?U&XbXm?B1fejzzxAg9TW z&D=H*w1GZ{Vy8uSmXYXi>X}T`o8E)tv2G%zW^>N)Q zsIT|UYAnk3!7x%~)1u|6bg=fMse-&*m5MvN4dM`F2QRpc+ib!HW(oCiW zt-L+)-p>bU43r-_fYy4A$^GsLxPQG`^rCVDEw1dTGMjt*u=|$t?KC$B;x1N=kVKz9 z@2d675EGd8?}_zU=%BML@fm*Tv+>W0tM)r`-hoLH-zBXh-$7m7t0hlf%%*orQp(10 zu;o1J7nYHKJI5!@j^_FooSO$7+ijK@kMpKT7(MqGudKSWW^=+j3@5$fJ74~>*uR!g zf~5aufBD=j5xADAW@wwaJ}fDhWuBW%I(wY|kGz+G83Ikc?D0tv8GWvvh~dr9sG!|u z3Xit85dXaBNV_fFM7i?XZ?%irxh!bO?cnBB`R*IYZ;!7c^OLT>XJDNpGEG;rr(B=B zJu5na8kfev%g$fFPr{`izWlO3`z+?H2wJ^wV(^c-q|Q#ET_yJ&$&ODo{fG=NOr9-B z|8DED5_qL04t?|@X&qng0wV%wQpkrahh%ks>+b2tN2M5iHHOquSs#*@oPU$m0ae*j&E8$;q_rE^=1Lj;=my{P3{}YA!sI=3?dPg@H%0(-j zt{V6Cy-KN#-qlSt?bA&0@5+|-0;4FQS~A{>#T*H#fbmMj3kVPV5k;#kgPvklr(d=x znL2-YY=Dhpyh6N|c+~z80qcyq`i~Q`!sm8WTSlLsLc3bVH)GMWD=#APa%3XIWZQog zXA1821ch)eKum>#Y_V-yZ51RJPJRCD%Oh(w$mRqrw@axlEW>R%JrXl8(N~*CBC&I- zEFZ#(R70wF5G-d-67aWdgs+zOF8J<9`xTB?cHW;H4|O!bkAA7`nTasjv{!iZHvl% zq4WHU)35oLoy=#F+n^v$!ank(cz|1Qi|9UvYXqiMRLgtdPx@bNT@W#xBeVV1kuO1- ziypB*rwUDDQm2(^Abr=?HF`{P%~R6WV~bXkx9@#;v-OTl>vvGbo9^iHJxPB6eITGF z$ie%ZxX;;u7HVn8+tQko7No-QV~;p!sg`AUDHWC8`~9~E7x@YKS7Jib(}NQAV~5R6 zF;!`gSH}bh%$7luX&f>1AZ?%jl~`I@$!c`QeYY>YhK@@<@urhctNu}eyy;eOT~axM zwt%GB7wo}dZiwj;TB!|#Y^TMh$0H2dPpRSp4|1M#Hhtj^{p0VJ9FXH?`1h@Lt>3#? zhZ`-{poc#7s~zP{rw7D#P66pJ!#=~4?hPjD+Ue?VVjiCY=RbPAiEi6~2B)pLsczkJ zy>I{n`RzzKh#7Zry;}kw0^p@G4+^R_7lE3ZI%#iVQCqFLe8uPFj(p*Srk6z>#5i8WRxYU;ICXQzKBtL#8kr+t=WBq)EmU%UNjvE{rI}J;k6-74Nk*~ zX_<15Wtp1v^h~Vxyq0GRbEH?zCb#gL!iwLodqnI%8+eu@d9e~#*+IO#9Oh6Dn8!lW z?znC9&j_w!WDMl(gKA60#njuK=Z=d*V^|c*JN~24J_d@{MEK7{kn~r=IXe%>$(Eo4 zGw*8Y5XP03lLel0JzwuG*6`i&i&UWyZRKRKy1m~cLZLkQF!MLAt4?6;Vj6&WszvLb zQgmBl!+#xTnGw90;jF7P>Urmfc9n7>#`61#=D+74)Aa&aHS1#@1MbRs&-kb1DDb%^O(hL$Gq0oP?X4l7b zUgeu{`+?u&X3{tR)x)9w`M8}7fuMm>vgVvth&j*r4zsHNRh)RBHsPBE%RAEpmyRj< zdxh4Qpx@&(WZ9;>uaR*_PN7G=o=gIN)`8 zqN@CeD^Umg01@h$Fb6^`<5v>hP8rB6ogzS2tjEHYtc0RuOs=zfN><}g{hWofm}~%w znWs^D%j4c6nVj6LlX^&tH@Xt_{*}A?X0@1dL+2;{wblC6KiGPE(etKbs4w)y0E%|& zzOK^o^!8CA)KP;r3C>|nJjF*9ybLT}|La3eV-0(4#PbGfqiX`%Px5TwobaD3&&&Kk zyYo@d>;sOy%et+xc~OcjA^7m(Th}GLD9dL&=XXm2$IogqT>JLmgRx>x^;yi{`^_At z_8+fe8rNu=J3o54SV(`p$Nlbc;maNpR1tBmGR26p`MZx-Z zEzs;|S3fuu}m)i2FZe#mZf729LItNK=jm zXD7HI%I}2mOYES3A9Wv9;)@NQplSEkeiC;v!6YSvB051*00T~|>pe#LC; zGkKy$xBItEya*)-K0X5WFuu}$KmX>FZ#D$Zy#j}RV5Ve;V?_R`PpzgO zkgTIJ5RO0EdUie0pOG;fo>wRWDDW6bb09)bf7fMRDCfNq^NY2p?!ulNI<9tSB)yqJ zNSkjlbWPNEBVG6do(CRwvbZc<9G6AJO6_DG%;%M8(xS7OV>ywBI2k1s%)JGF-%Q27 zPHY&1U=p~f%)cFdm$@Hj(-r&B=WTAk225V7D(-J(n*YFZ(ssh=u-owG>tGIfR&ssa z4TdQ+;*>|)=q`yk4@KI~<^-?5$%-<=wkJG!WpR`K=ip&*(G-bsY}qk)nttEM4)k)F z`h|H0Nyg4VQqU616A^BdIynK97=uV8X4 zwk|1oWlXP^*A~#{y0XjpH}4W0%iXKH9Ci+BpAO&c>-h#&)$S{omT$M|<8Peq2)Spd zLRIcvjqjB}3Sf3>y_qj6Zuv61lWWW6$lN7tll9(~S#k@&P16D?(Virqns4)R=KU&@ zKiz4mL2y^N5F3V5-l+Yf`Rl!SEcR)_DmM5JI=CkYH91UL?7u9M{9p`{0~~R*u^krv z=3DrRGd)@4Ww`zKjRB^#r!Pm>(d9Yt2~$g5;=J-&`)lU6t>hPSQ;%GtJ|gQZ@X$U9 zm}tnzkhMO9j9NQicODN8mV{O0^jw~LNC3VItTZca?B!5MKRJ$CtOb}Ej)mX)kgsy~ z<=mae?Zz+3%=;?>=D3a5yPe=SD)h7RDS3LaXO}5m*$$_AwohOq=s2f=K11V!90AT< z@c5$o-8<=P!K_>S3CxMxN-jV`c(ruVtkPlp8iHTnIPna1>rl`TVPq;cd6pfEKsQvl zJz~xB=?&aCWo|+kMBq#HKlNqqV=-;Q4$Lk8@yv>Jn4C<^pmYB$!09yo#7hT^(!2QF z7x;z8uaikuUQ7726T5sPd{Vz}hy8F1lKWGN?b`39;QzCioSuc~$n2WsSItTY((sOV`wY$sEeG+wgBq_FUbkx~jT1ib51?_N8L;eY#&Ycb9gyd;fV#IdaoD z-Ra4<-N3&F9L8^lQ{Q9!Iz+wC*=e2(VlPW@JwchfOF@Hr{qz_GD%H-4dvhpLv_z(3G&9k~J*un6E!3Fl*Hlpg3Zy)eDBGKr+NTXM z%teG4N+3_c2Jfko3k+5OjwJ`DoXzhBA1R%0H=Zg zh2-|t8kvjttvYdW0*kiU7i+?6SGU~D;QS1Y8eWn+1?rNAG#C_ zGRqz0O_6I(g( zCeh6Uc4uyX^rX_t>)>ta=ITi#?{NeY$bT(|-UJzxdOS*Kt22M*y?~azXv{r2jbeVg zjOT|`mTe6{9;d>@#E?rn<6*lU^5VyKnQ736bJ>qt)f!S5L)ZM z){10rM|R+;CH(Av33%otx>m#)D!XJL1s7qE4 zc6P=Tu`pr)BVd`JvGbiaRt0g{G@O~maIe^wsny84Zdj1$X^@n1+pL(KA`nmeYl-RK zrSLDYnV&uG7eMt=8N@kLX?mI@+f2Uw#cqVsl2^x~de@NwK@-kTdu}7UCZ<&Cyu>wI zLQ}*Sphmq<_+V6xE=la0o~`n3vLebB@@U=M`+i3p)Fs?6Xq)&lI6f)34U6+arbj>= zTP~lzft_R&W-ZWA%-;tmI7lyNvZ!1blz)a%zSx?_=dgxN`7J;?oj48cyMOk;Mf zKivyV^dI}XLZ)sQ_h&zzGvALbwV#TCbWAR|>ri_6{wB01&Lw}sPx0@aqJ3&%Tix+B z?xI>3U#AuD&*^MMrT3xyh6SjcT>d*mGfw*k#MfHhw!E+nEb?C=`TvmXGw}Y3Z1LLv zb4dWA$MXriK_@LWB_R6c($MyVMj*>&f30a_Mah@5;sg=-x0cuV0xJ40d^4&ixQ=ry zInFvp#lG}6?+mVYhLd#D)p`iPF8pfhz4`%1eq+Pf(T+LdaxR!9iHAFS7G}$xQrZZ%?t!gJ-;Ku*zudqsIhD2=d71F z*&++pvv0I?gFbXjN0`e}Emya~D)dExqwnx-BdGCT=-};;g?jEGfB0r!W6{HJti+xyQ z{gt*eu^R#1y5YWJLRcXWpE$MimfQC*z3Fxq*)DPqJL*mi4!t^^{v#i&g=Iu<2Fs-iD($@0ozAh(nDW~8oyh9ad%c8fzB)?oZ zKCAfBxi4CH_hH`(@A2y}nkI@jd`McoQLr&||FD4xCBBw^Sl#t2+s088 z=iBP3bBuvyYhHSYZ~}(6>Rf& zG-};bznqsE1%aA|DT-BwOu0p=C7RxXRfgO3+u75z86U37tMVC+;S|G|7${jPn)e2| zdM5idu0SOiG$C0pM~_kaaO?F}Zs8w0KfW$1AYSTWUa+i$-AM6iiTdR(uTve@hl~UN zB?9>#7NIX*TWUn7%YOQgokQvKP3yQtk4)1_a) z_C)SixOt!S-h1nz)IXc$8D{%!;pcY;X+1=sp51F+JDc{yJH+nq1%@LR%aF;()<74l zGRX`_p?>%k^oipt{#`pk2s2V|u#oXO<)vgrr!vPuB-}i3v)+GkHX4Z!h~n`aQrnKctN8nq+D>^~cNG@+NDZ7co{jpZzxc zj9eP7Ham``J@G>%IWN5Tz8RAtrJD!tB>7VNyPSG&zl~>LVW8W~9o%ARaga8$4X3Dw z;*=P#?o57ger32-Y~0w1@|!_%y9yBFgC1`P4=FX`+)b{gBhiYvUJS~ux5y87as+f4 z1o)dFgzrJ$eI>x(;>e02*U^GwkAFiODA-~D98ikBS60gHp?lmdZ zqO5rL!?u7W!Ic$GsuVJCL7IS;x3BDY)rE{%3}}J~VRjbTdCq;|@Ym`e3rzw6k>_FD z`mSPtJ{uZK8`10&IHS=u@dSM5fp=gBb!@HpV1(M3f4EZ02iyUM0E+r}GCNEX77Q^* z{bP_?vlW0@cP4r1m?iMz(XF4_)tXgK(8UB>7k?1&D|gp)jZ#AkJN|qLU%L49;j<4S zTh}b{r_6sDSZXZOa)Phi@rp_wNYl@EC>j=QWajqhy}k%Y4b{tAM~o=7(3qOm5J9 z=%C@da2I5d5=YD+BMGfpVU%pfzlE|N!Fb3|vQm?xKT-djqGW^@I>p_{HC>UpCEe$Ko=Z9ZqY1S`J#{0g5epE|-!xA9Ovh)W^a3i+elsW^x5L zYevDIVu9s^nPHnuR-loTyb@aO%*6a-hft0YXY~T!qCJ5ujrrB1O$Hrh$)#U#KChSZ zO0dCj-emkFbaLYk6;&I$7hsACV>9od90R%BxVv9mqtmO;YrZMF~ibXyIbJ?RVJM>0b&xT(RVG7RgMpBHrpum03f+ZM0DL9)`SloVOR~&P=1jY zCuWL&3(cBJbUWyxHMX)3@BTX(o*@=iO#2?GF-q#3vx1b2A1XMfRQj4t7J*((+Vs}9 z4=yj>HTsE5*6ds9Y9%)DgwXH{q4{>6OFFzNZ6+jy&`pXN`omumm7@h{F(p;k$l<FFoh0PUi43vz?*HM5d<&dZQHJ1*0)5cGbUVei6u0Tjh>Q6E)B zGtGBf$0(cUJnh1N`@QVnIX|!X?hk}-bYTAkNErMp+r&AN6XBV$l$r;Hbr1#)n2|avNLTR2w-TqZMdwUwrdbHPPftpXw z;CWDPxV>=avy6cqsU7{QzHYPC*##Y;d3KN0C$lGb)ynnTXMNc9c?@St^3;K* zaW#u2kjB^KuJ6~)$_gS=rLOGjcfs#piujjCN{@FMBTjef-X4so!+qFl=pCmUv5nkB z`AP&!GLp`&D;@acvuk~L0#A`daR~~h)V*#+cmy|f^1OMY-FfcPJCodtc6spW3-^vP z#c`RHQk7!L?=ZKXj=`0vYO0$cJw@5JQr;I`<*zxm^o5j?bQzM(T~isUo&@x748yBm z^!-_1<<{4PRkVdXGzG?=&kYN0-%o!_#=q4xi0Obc^70xYzI};3ELu`dwEE|e@gIcV znh4w44>vl61JdR zFejo9!K>*b4~9|G@3c$fg@4F*HdQDhyA`B&eYmBbHu*n+d4tw-HUBp+_P?bqd#K4u z1Ld*|{)2k`Z(oA?3%$m~JjNj=CTjVxR;q+YwCiRrD^5Zmg1+nz#UuJv{uoaARCX7Q zPqsgVa07_H;7otR*|l}KWwTK9BMrs=ad0$X`TkXkk*YLSnZxwy@?0Q+^U_!Kl{2RN zsXZQEr2*E9ZW2gPsH|9RWUd$_&q#zu=#xd2^&9;=BRj)PQ# z9%cE#f`=UB+Zn*~eJoGrRD`}e)5zyYdeTWXzBrdnLNVt;rY1$tiv#R556q4c>&2tV z@VsxzIzfx-`)5CTCML&kyW@Qu+@wQlo}S|D2sZ?!%4|+0DF$r@#b0j(loh__aT7Jm zyuh?r8S&ofdE?yby|oF-2TYKzbNfDC!_mFtpnKb=>LZpX?ei0}BJz>hWnLRb`$WYw zj_$(k)6;TqD$nT5%AP72TE$ z#Wt4;zBjS(PbC|3`dux{CcwR-{J@Lx&}PAanJ*~HQ{LSEo;D1I zOr!ty{vwqT4p1= z_zEjl;&G^?dj4Ok8&atF`vvt289>1+{@rNvQ#%V4k8k6sPZMk>t9|pGgeSN(g+reh zQ6}xMnLtW>RH(&pY~C{6I@JI;a%?gnTRSHYpH>d&t<(WMwY_11y3j-vB6fF~g;*N$ z_LHxbFK558zEzMm2W4~md>H5mpdqrX5Wzrluo4)Qmq!+%Q*{+LpB2qz zWk#YkJT$a^NikfTrZ)FQDhiPgEkpBO3arh&f_8jWS#J@2s{9UZm!oyABK4$%Hs&kK>-;RY}yIe7s7fU zb#&B6rYWK~bF2HeE;$a@cz7w{da#9`LB)evPSo0?Bv#bNEZ zP`5s_RWL-$SQV&Z%b_umV^-dn`FISQ6J$9w&$1Quz1#0evCu!>e(}GQXzJEJ&db7k za$P0)!upC5DaAwr*zj}ZU;X_d53aG;&t66E^5Oa`n*_P``TdCE&b@p`#0HQ6VdG4l z{$jxlMK-_Y49EA7VB@XyTu` z$vD57exxaRv>|dTz~B(zeYdR zPYVj)&AFZRxFDO*0@8DWLQzv$b=Z*Bp++66w)IIXViP=6Em43^zo<(m<4~Nve90w)d~#*?$rt`RDe$km>VIy_E(0vG znt1JJH~2TO`|*4f#?BNNy16*{arcYTAk{m8AfgA1%~A^R$MtpX9>+hymR;|k28!lk zoI}O`=3HzayzvljjYtT*!z(HHbDYQL|6*Q}A(?`~t;X^$4ESllUvnM1nLG8J}ZXS@t9 z&`isog+Zy9q9t{RjO60u{}JQ=&%eZD*1UO%WoK4g+xTBx=YOWswI5hg#=X1cA?O7X zE0rZMrpFfFswMH0hDlPQwC{|8)>dLfMG{xDt&%=;{`ic=IfL|ITJ#O3DKt%YCp9wW zgt1=~47fq-ASxLU4zcvpUn1FCZ^Q_kig=wap690vafmZNnwe(zTg;z)_|eDmiibUu zy5aEYJMWM0S9FW2zP`}?9g<35cVi+zXoy2lAvPBps_)$ytYOSPC;F}pl)idFlVi4i zeS0Sv6upw7ZKkru1yrO2OWn3NsyPJ6ZXEM0F?W5WhL@Y*)qz_jN9j)zgvFLu%sw)DYxx zw0}Nm^(dM57O|;$+Y=Z?5_i7WLPl<*e|6`maX~L5U$UlyD!8a|=kH6DG*}OfrK)Dx zuUf`a#Jp#g-h-xb8%INP*pwJHY{9|d9=J$3*#b0^Ce0%GeRsa?zbu;KhR`HQK{nX`gZi*8?Zwgw$a!he3vMXSPyY z37dv*05&a)M+C35HxSZVQ#5g_s&oXg{I#UY|YPTXEs z?f$lg>~zWD)#s_ZH%~>6aDyEt)ci1Ee~ch&1l6+$R^d-P+lWwsr!HL(M_Z;X?!Ox^ z4!guTS6NsRxk))_&8z;WqN|EKkC?l zL9(%)IFJS*HYho7IZ?o)l$ni|>6j{vM^>9R+m2;@iFFA~#F9u*xO<;iHS2dNdYIp& z$(=`^IB`{8&0^gj(9x2ry2Rbw-j?im_tbD|A{|p+Pm<>XcjPIHwh}+nD$zz^P<|scIc$O7@ z+*X_!K2Pju`r2qEk&4%lxZc^CxIROo;mxrQvkS)sbd{oP=w(L&Bf5!LOVmBW2j}ceW!zTdQ~wvu8iNk}L)+rNNJRc$Ll?M#DgWK*z1! z_g1*uL9ZMltx+*Cx&-)O{n=PK#%EB$-Z8NI!uZBBwit82Wdn>Qa^b=}XHY^CVI)J8 zHB!_7mY?}1oH!m=)I~MMA?9#~(K%2`%`?lAbEmi7_hjO|w~UFD#s%jo>EtrvENWfi zZTIJ-_drVJw3F;zawamO5k}ZKFwC-i6=t2C%TMtJcTDSDE|v*#{ROa?-_FVNF~}_m zVHm3llMCN~P$Q}hKTHXOb|Sev6;v)CcQDZi+QPks-mFZ6sM z31X{?I#LN^4Ce}G(E15-7i=?}O0}xG0MjeTx(Fo7{qA)W_#8JFCW|CDn4*FTUl0+%nRG{@Tm-B#P1J77-D>D@+uK z{!YgwkXk~X&7oR4ATj)JL$AlQQOU|I5l;dXHgbigjhdZFz!$El-#gwk%k_`*ruIAY z3bPF}$`@kWn5l)yAUFrnOS}@#?mMdojE@OtZm0R0CPRkqx_FD6TxY7Xa`k2_<>ll# zY>lWcUxlqE(TCy#OS_7DbFpbcn2EF80+u$u7J9+4E0+l7XOIM3vsdMNt6zK2g3aYlXz_iXYcFGOyFj zD!D)zb9~8xmJshGJT_)Rl}=0*k95=K(R`peVCQ-Mt7BthKOA(7J)TFc!9^D$V!Y@0 zWnV|HYpqqd7~=fL$QcB%#pUVhN%nt4F!WEnRmX^H3DYuhk~2|% zyHqYTv8(C#K}K5f!v6y4!zngX`2EGPk^PR}s^qoawZspg>hs=y?8;T=_J%Vw@o6n@njUCZ;_9i7phEUu(j*`9^G_dKq_*eW9^M^T_uw z6~ac?5_}l-0f{vn#7-&+KIm6vAc&RTmEH2?(Rzi)usdW$bLSE;o+BGnauZ;DPus-l zUBYN%2ub<*qrvJqVO=udUW`KKbSHkJOJVz7S8+{NG-HTyV!Yqt4i6avO>n;d;*zWr z=W4aAWG>sAg`FC>O!Ayb^$|Klf|hwLjKxSXG&+xAOTD45u&(ijxl2uYT_+IwQUbl+ z<&2zDS$4Qmvgn$%bhx=1|BbHsKd8}KLa;u9--eByS0OC(&+|up#`1!at-JaE9Bkd1 zg;=Mmw9beX>W(2kJ{4wV&w9N(O5c9?z-D5Lo%}l02%kSYX|V7-C#!+xduLaKlekd2 zj<)Ge`npQtQ4$6b3+5P0vv^l5m{@!ONX%z?Fz93-b$%5MiO zer!lN^ZHw`<(fh7m^?pK=`l!&NG}Zi$a#81UHy?rY$1tdGYz6jkdt;8QlRnPOK8Y{D#9Z8Ys zq2Mum9enUnk)?T=RbRAH$#s9GWk24f$sJ9?lgtrEs6|cJ9ghn__s*I=){_4HPgq`m z4q0W1=WKRZaj|o6i0g8tJHmDss!_Sqz;H<(Qmp&xv5S%U(J=5F4TI=b$>{6QUG1fh z6ZIm{U^(V!HV-M$oV(t&w?~UrK|oyoF_4(+9jrou%CCnQ3t217n*{Qqh)aAq*zaH0 z&rX_qFYO~5cnamZ)Pf$P}LA-RQl4SS$~Rs zIi2i;SK^i$x+)@vruXBlWd)okHVx>wcw{~HNP_*h$}Q8YC-|-vM%^TmXec}WO{l9YX(I<_C@XGXSxMk=wN1SqAu;Nj6clBXqirfo^h z8*OdBMx2OeZ{Gk1Vk3@}?*&cthL8~e#h<`9#FFU}umcufJk=6+Z|yf4c%%0y48p^T z0Li?DOoipTB)O17e7??lhfE$DB!mJ^ z?AO_PZ~AJ8q|{ohY4hYRz_@&qYv{WI6gZq7_x-kLM+AndS zp>|Q6yD4Z#(fScG=7REzxj$XM!Sy9sWOKo>2X|GfHw?2&!LqA76X!{;*@JNn3}UZM z!lgvExt^B)+htGBkp{Cz2M*oAP>PiHBL2^HOwx>*KG#&-W67H5m!JJcURIv$I~SaP zR25a1{h(`>-C?dQwpf-lvS|B8BIXuoN|tPH+Dv=)=jE^;MV%Ly=dYqke>~W!Nm^T# zo$7EIw+E4aOZY4WmR*v(u%Uc*_f|PSqI&c6X3O(C? zduBW7+u|wYppV|Hg8v^9SzuGu9nLJ==P2;mUu%{ptIVSx@xY&3X+k?q{qO zqgaSQ5byah>p~~pN}^>NE->fmYuAS|zpPQ?Js;HOL2)%1kK`+pi^%9(b>qM#4@85?`E|~a#oy^Ttp;LrnIC?t*zWPiCO&5q_$j0j zkM}Y=fWD2}K43|q#NZ)u!L^cz>=$pg%B?1)Lrx~nhJB&kuLXmz%xrHMvDbU{_Ba~X zpS9uID*o_{(T~j-FVKEd z`udF+@)edmLF2oSg5Bi}n{9leRqOrPB~oHz&uT-JQNINelSB($h!wHeMYMfYtgMck z_uSc&btp>VW(`|DxLESuL%wHFhz=JzzVq5<OCZUC^k(crO!bRopk z?{{e7ryxEh^&vdC-a}kGM1bIYP*)XE4Fb`GA?RZ8Qckw{r=?hTJQe3vnMeaCtj=ub zJcOX1O&7omh-Rts^j2>MK4RsqrE`3u?7tfYIDrX}pYYrCbcgP@u>GP?pN<*Ps*YE= zu}W^()eq2f)67q}oP9kcRAV}?Fz2HRQ@?n(9;Gie5$4M82=QB7YKTE%p`(+pyu%z` zVe|si8qYSZ4@+OsU5&H!tVP?DPR{t=bk`U#L4GCZwX#kZhvscj6Mw!og@z`Q?^U+X60&Y_z8JAckTqeHXdk|N`8oRO84w0K&^WSu0zE_z#`(z~N7-P`t8QDrJsNQk4S<4#Fa}+C11{u9qB2%CMGlJ z%#NkI75`CQoJl|8C)Dii3G$oJ$-eocA2BJuz4|h7nMkVyI_d2F7q|*tiHXg`>@NwP zo31})&n(!Q#o0V(f}4rkQc(v4{q#Hr9zA9v5e0dupiL~jtiH{3okB{&t zK+qGs$o>_URQ*!10v@F(6qbP&=)z)u#C7%S_C5lmQSZZrT*mn+20u)~YhnB=hswps zO~y&><`ww?^sOAT{9M0N&-5Fq1e}0aR~ZP-v~+_|z>#euZXuuVy)WWIQ+?Nk61F!P zm2>@`l5gtox~4T*L9n0KuiG=8=wF0lWpVUJloh(H$&fIbqLzxn00GP#Z(2=1;G-FM z#~BR~rQD@}ea~oGhGqx?;<+Enu0c=%;I9?BY|5q`y-G%jz`>xPN7&SSE^*8NOR7hE;) zTY!idSS`>Gl_G;{Kx?0V#;`yb&_&fKq(Eq!^yNXW^y?jp;$v#RcZ!^E4bt!;)b`_X zM%7E<;aU#8UGGD0O_`J*QpEc9OO(r4FVQMD-0c4CzDbKMmYry&^}*bK)1&@p!^MRo zBqG?E>!%K{rqZW-yg;+X!Ycc|A^O}c7#gD?QYEHGz?K&m?~7%nSt!ymwO1g)E}Lx0 zi9SA+jwPke#}6O9s&Gq^96gu@9fPqU<9dWp5nd9%>%eN1OX#$PHc<*#5Bbf&oB%eE z#KK$B-nHi;?h9#kmG#T#;5f*a!RBdTl zl}iVcaw$0WHgSRz&KbT=48L73jLRhCQ>&tC;R~udOk4&Lz{q5_$NKZGJfzg4ZMsve zeR)8~c773X1FBwnjs64-mYOK#&9vu8m8u;O=gXJ2dVD3GNyQ?(W(I*PtDw zad(%?uCLCmTj%`uclLc+wI0^Xsu1Fl4wuGbwJ>b7Q%Rw&g!sUqou>L~UwSyx(9`U%7 z2yD7k7ne9}<{Abneiq1flk`#i{q(3ILpFl!p*yrmfcNW`t&7?^w^gd|W%JZuluznJ ztZBOVT-$%_;?a@nNngQB@Uf_nqWMJKjv~NUj0VT9N6qX#DO6MiT_68}va&3`u{w zAP`w%QjvMJ01gpnl4t*_0!5>Ze5Oe;UkEqk%}jl8jXSkVzwgg3VY*>o)Svr5vF48w zFFx7q2@dw$UPrX7Y;p8ry$U*cwi-MLB+<9vS55~0S4mOD<-3EY<8WL2_o@G38SvqK z+lfEHKY9|JbcyAX^3WPW%$^VF6)IBBAK!UhKmD8_Cem#iYrX$79Z#NXc*HANO?mLsBxROSG29|9%YoveDZ5Uu;vPISRO?ClOu;)G}gYFsZY?(gzlm992 zKbNR>t#qWx?M`3;T;fk}$GE(mTI5kA^eY0(>^xB&s+{@gdf~#oDBtBby3R*e6kfC* zOnZqKto?~wTJ4REvg!Qlsh^^q3h_NUbI;*F#%VsO*|Qj&e2z8CX=8YIB*PygCm8#> zqiqvu`+FUrek$E`8sBYk%W>=ffPU^Y=fh zL5czUM(w89y&eIiiAYGQFCsqVW?Dy++q9P{S1kS-sk78EZ5Ux%Qbc}G?6Pa_WKu7V z|9H$|{^Pecb99^kNp>|aBKWKyl*f1nxinda4sxx3OwC<;w@}Ewt}HB!fZ{^o=yrIK zBPyoMZT?iDU|pH~IojXViVOM8($_i#csLPU!MvC;GIijXr~8L;9v&Aj1Tli3SDRbA^ z5@BBa5b^@1Ub&DKZeB@Z%2k%<;8QA(lcnyD^>-X;ZZ?obv zLMw{c7g)G7VeG(W2F)7%uLGYXi(T^Q!m9P=2^;cxmf+qedf{T{^MHfJ;1i>Yu+Acf zfjI$kfwe^s`{|PxIABat`g8LOB6ULN;+r6%o)lb!Lv;Ap(hRMpnB*ioMyK`C6Tr;! zx(g;rgw@0@_+s23dc3n{ddGBcrq%b32vJI+o>xp9$_P+x1_ku5U;NK!; z#u}lo?l=f3_r;3Bz?6T~U>*b*PoDYM^$3|SoqOt3^)~lg!GkM5)aV7IVWrVv=o_1^ z=2*7`(c4M}(M}eTKmVCgq6zVJ+R2S?wPu{oRk%}PM=To|b%)AD`v&qY+7rhQX)6`k zS(=UIN5>bZYjnJT9VGD`wM)bV5>`3yZXc}SuMc02(wT2ETd~+vKWD1Q;}X1f5Q*%m zivh=WbSW#ng(J}1XC)>{`c{9>o(25q%+|bwb8wF`R0&l60HxUyj&7jZ)|10syCJb!IGCWZ2g#vf{n8`>c`G!9b@~zuPqa4?##Zr(NBk>et~N97}aKo z)Pv{?tOt#5{=bHkGzEh01VKuqM;WtDSyDAw{!h0$(GwpyD3?syl?5^UnDqHtYYADj z6V{L4{K;^GfjqKzW9pd{jGvI^vySPut+aM-&IKwgyE{Xg0TJq!z9+R4Fu%su90$$k z+6QlX2>M1gx$pOH{$_8Z3{f>J-yQmu^Wc?ya?pkX3eRtDoV;0+dN5A0kX(A1ES=3kVj`bjAI zc1)EV)Pl+BU5uj~|3VZjMOAEz)xSaOT5u0oqc~D&slM>FDqHm7{`Usy-x0&7@~^TK z9%;jW^Y;JC1JL;%u4E=THzxBn97Y49;L^L)WWFMjue`FwBx0BKY5EBg&i#2tSQ&ZV z`}Vk=^eU0hAwRfZVK_i#BQ$G%o?z+OE#+$<>=P0%rqsC6@AR;X+^osYzq_(WbAb;G z?mKH92N^XLd=+7Ta1icMQ7$i(8%-WsbSI9)CgJR}Lxc82Te}%penI7q;zmkb-(Zyp zOpE{}g)1D2Ga|%q9=tcWE)%jo5Z{vo`g1%A)(5l|`vp6jRHD{16sCXmU5uTbbc@0| zdSZQv`PFyAmxGc>_Em@c-r3Y9^*hO%9qC)1S;Vm|%}fSXP-{XFHhBCicfO`WsHaOI zEc948gAng99EeOR>o)n_fl_|xp;ll=tWj^=hRnns-$x8cev9+f_0cR z^90xMy5!-kV_Npl;<)`r<3EXdHc1)wY+rF(%6}eQ-hvX#Dy|kpTPW0km5oxAqS&u& zJxJ9ZFKZxI!URwmO9TXk3k9-Eo95nK-(Grq!t&QK2|WZEHLLDp^n2GE{*KCy zz89f=S0}A;$F6Hx%Ss2#0}U(fTofREhEVKuNy~v z;I>X)l4n{^yyj4DiK-*`Xu+a-n>Az$TLfaN;uf!&nVzVJd6|I;rItP7D!X@{6R zD#K3c2A0BG87=JM&!w!Q%VgaG7Uj)vFMLT9DsjV^J%WeD+>3kf=;jn(vtF`o^P!C# z9rkk7zS`a(NAiHDUra}R;wl1e4nzkNp)%w>_uhTufKI|vqN;fwWD)c5qU0}jT2zQCV)?mDy`v~Zfx4X4?_(`2-0PVy2$D(%BeAH;yOxj(KZM8mz&%i-{3e=; zdDr{yXmEuUI~OdKzI7(%fs+9`qQS1CPOvesggOsAmFkKPOw3vOK&16{hFS`b3wK+9=PraP>3B%zRpVxfyUG-%q<@O5u7B0)pEU}+) zvz*YTGj}*=ww1+a~CLeL!817DpD|C+smdz;o%&_<}DVU!+^C6s94x%8-I3$!AN+l zrOk{FYa`vJ_-U6|)W0S_@`{Ak{Bls>rpsXxu?vwjEnD*%T6I6XdN@OP!F8LVxT#|8 zw9sQ`rn`?;ovt3`5g-y>exk7E?-=J1^81pU%G~o4)?pI?6|=yf3eoisH=CBcv5IPIXd`r@3(hRhCc`uB30{zEz}6U_PaFz4i`SaSNc!n-Sm{^If|< ziw3m&Wv7nG^SVI8^+IjlNT1e_Tq06c*iXxEjwPQ@qhY_-Sw z_V;fGqHggCHy~`#&~E}NqLaOJY0R9ZsC>rDgg0w1Evi6fMl@o=LynqvC@|&dr@c+K zc3$iwWZcPY_zWV4_MZTKZ@>tZQFSZ|xxV1D)XFL;_|~y3!L0drmMlzX`)~+r=(6=B z@8VdPhtcqS0g9o#8c4SX@A`M;9@r$}($YMEz464;#dRA-HO1kB-OcFpcvEqb$5 z*4j~<#z2~3qHA3D;tk~xJf$N}-uRIWALY3CN*lIIcQxJkQUx;W;%Ng`w`uA`1OMmq zjYQ9Z*ft6_p8KTB7;6v&Jzhvd@+qA3U49nIEC+c6xbNgn#o^JHX#K#g`>c_IGQQK~ zEwcGIbH4*U=z+A_IqxWi2y5|}sv~~VAUO1Ux1}RSDQ?*9b9tB+JiK!0&qb7f!5)jZ zHDdRaqEZA~U8UC}&)nqjZqWK<*OLsPbsfRHOf(XIX5;S=V)I|25!2Tx%X79iZK!sT zB-TJTFJEGe$$R-BEuC|D+%?fsRP4x8(7kVTfn?jv$t%_=zrCP833b!80N9s=87)XG zp!i4{d_>PK7a#laW{(`TMRp8j8841>V%XSD#+O$>(+dP=PWO*mt% znM22y!#wFk8MvjRX@}`9JBE-kuXoV$xTaA4h{3l8M_xbg?;kRA;M#+j~7dcx=5OC$p9fO12E?9^3miam0#~-sFxSGJuOnSVNA;NQ<`s zGaNQI1#YzMJ)lPGJgYh2NP>(c`eDb|WNdb+UrNct$*d~QsKbUx1pp=l+vYefLZ-)R zIU~Jhau?CaU%n>TZCCUTDKJL@ZsS!1Fh*?_6TEB`O@L-X*2WHMH>DgqX9yP`W73$e z4;J{;4mD)A4lrZvw`Itdx*pYL9}1sQLY z4!bXHchGPk0_=PI;0X(e_nrb@^DnH6A~ycfi{=Frpf&YH|JmcAAm7f>rO#>vH*B2R zXL6)GBT2R$nDCl%UAQvyoTy_i^c}{5dogE~)YgsMBX{K3PPYlch&29tqV>I9v9>?} zK$9L4RK@z8y>^#z;}CyeR(?nE3vic2%3p8BwPEZcv;e> z-iuzv2X#C8%$N#xY=z8!+qsUrR4hBCDtVX@Khjeizl&XCj4o7|BrKXA%i+`4Ox8Jm zsqboCsYEJyt!Fz4b;j z*prV{T(lslq+uiv0&*P1cX>%?fGf%dQi!m#VtanO-xm2MN(UmUmNr`JV>K*3hW3jF zdd%pf9`0ILLHy&#YJKDSLo^`%=QEO5E(`-u|h{Jxx8^l>qA?m7i;d z(D2I3%uTs+cG=Z*Rr~EWcg}|h9h^)2=)RSJye06I?u=muAJc~JWI!XUBz?!Ba(=O% z$L^1$3p>xgSl|c~eft#ef~&&$8f2)$yStfDCVaFm_#tPm1LMzGoy;?S}*& z`8qudGMrV;i2AXfoghl+wqjxhZvX@*4ILHPa)Ah~QRaV&V1zNU2!4x!c-& zep0{H>AzMK#ncaX@GY1d4(!lgA#7wYde-y8FPOYz)+Bpkf|oh3c_P7>^7KR9iN@@4 z%A?ho#l0Ioqw+s}t^f4NccUV0P>qX`$Hv<8xuP_^+Vx@Q<}4k!H4qu1AU^xmarah% zAUxumrUgAFzLUO3njBrKuB?UOy~pnCt{`6{$zxVj*u$6rT#flL#Kfw<{x-h5UmiNT z-pve^Yg;Awd+#xC&z|EPHlg^PS((KOutLUvjXp}JH|52AxZypj($6=i7*ynzH08QbFXDXT4La7#=w6D8ezOgKQ4zqr z?-FfDzHRHK8dlHB#5F{en$j6~OsF5fl1D|63M`+)apjff&4v*jcHXW1p*)AHK+mkI z!ksZYH+zwAz7FwuT$u3`mK@TEnO;T=`#@+zr2fJ zrAW3eJKFZ~qKt3=raOx)uV%R*KXi8B|Lq<1Mt7Wm(SNB3yGXvq=dN%(q}w@~&mS*l zYO4!Gz>NHl>(hS~vl}XSzA){=e=cs|6bvF%*G&moeJkHM*hX`|;BNTou({hC(v zr`awW&w$sEfY<*yx;G<$kWY=9$Oq>CeL;}MRhz9H$jDiFMea=DJNFqV*F|wDF$eY- zqGy3!7QL*&PV=41f4{71**vfDo|Edw)4p^HqL?_a9EY9N<-+D{^b`Mnckc~cJ*Q4b+}(VGF$oge>BsIR~k*SXbm-2EIs)*$U;WS-CR8Rjr%Ahi?O@?wl1 zKa{-RoO$k>NcPr=A}tKidT@$XSHyA{?Gm$Pp6nEJ6_UZb0Sl?L)n>hddXB2?7deMY@Befzh3E?qhA#|TJ!2=n zM&*+8f)-+P%V5@T?aW#uCBXbhqaXFT8N0)|xBSrGZ|&?&26gevFb+%}jBH>pCD{QC zriH}7i~2K+ZZpi5;hLCSeL3*H;}QshI7qs1BzAse?r3VF^Y)r9t2la;qHSkE(G4g3 zhmB6~W!HR{1sgTT4+PM))|uD$abeST0Jk6y@@s7T&RkM8{JTb8XziPUGP?blX{_V4}`j z&8yLdFJh(J?uW9r*ey^r{dD{qvzQ)~_Rz8R%Y#;|6WRBeM_`$HWG*5hI7QZkt+t?V`QA>tQ(jfiEX5J9F-`biX(*kmdX<4?Q z^i)8=jeg%2u-bE`knf<;23orl z3Uqp6&t2AOB`tsrf2%6fDNKbE4tPsU2lA3-P4GH!lO2g4Hy^-pc<;4B$fX>m&V3Zw zg$^yOqQ`ALNN5gAgEoqed^TsJ3-&XABI9LzHLkNgNtsReArH9OpT%M`{z7|=u^WJk z544ULU7_>!gMFh_2j05S0YH)MR`!K<+jgL|qxu`n_&QKuIXKo{;pYS9?^>hz$7xxr z2Gyc3xgV}S?jC&e)4+LPpU&jI;DUuS^z5Xu)IJzpe!)V(PeWdcLUy$6aoELQW#c~T z!50$7ci450zYzkQc*offFb{OX!<2Vb4y}77a&dU64;)=(SF!iPnD-3#g(_nf?>isL z$0<0lPR|?S7}>%?)P2ZKFvQ>Jj0S4TOwD7nHqvt)ROS2ri0j)xhvMOrQk5>zo*R5}fbo7W`+h!W ztA4VZtHWKcFSM)^#3>zM&9eXhh;Pp*_hGNZy2R?Az~Su*tKqq9R}JZ<>?nSf2Ujy= zte3Cj-R|6q){=yV6azOC@zdx@z+wQgTf~LOJ7Hk#Ls8918M*mccMuM;#qOs4l|(wx zA%(iGUGhS)iDHPK)h~N(tQQXOf~b(svw|k!!CcJ<=EaHdM>Av{-uoW7DmA(-cN(T* zp+$Am#a;BJjq!Um-!tB7!C~5Vp$9-7?1am}AtlYg-y38g$r4aIF|yu%3BrN~6Lv^} z-WO?HNt{7BzO4!n zEwu^n#@>Vbi6XfbF?lf8Z=Z%Kn$JUpJGtp?JZnQ!W~10fJQI$!z@(6>yQY91{YCnJ zWdZy;qQNav$1ViOP#MQwloZ|7V?Y6UU(0dx21Jsr1JQd?QU`08j^^E?8|O_rd2)xmv9MKn=plxnaui( z`TK3WB;DnxD&Cc%cO-WOjf>WJKm$R`?Z@YDYdz$r$cB!j`6I(Xq+~KuW@bk!@tq6D{N{vC%JWf zI9G37ck_sO8G2mlB;$#J@#y=})y!geyP-6P9P^hTsa2`IZg@bfCo_;D$Ze6y)Si^f zWJVE`ChRm zs+~DUamO-Py9>0`Yu+p24N<&um{%cykQX)3-N zhXI1Cm;(hp{P)666{%nWh@IqKgV$;$$94HkZ0N8fMNvG|j5}NVhu=wAc5N0vSs{Kj zJaLS8tbMI9=jMFNs$4y`_I`@b;H9@A*`FE0nweNg3}V#(4u~iO;Ukp9`feS4=3m}t z4!S>%0L-?Vwi<-{$DtTJxLMe`Se}3h;6`^d`7t-&xcld9$*PSXzT&m1ZvC}WLVJ^( z6ra~S;LBhO(z+gG5K}Omcx@$hmL~!y*F-lXU#(9%PK%W zq9)tQsxJH<7pcGM_1^2|@2+*i$N4Eggpqh~LH>k~tdUAAYyTB3TP8SBT8M1hUQ+`+ z43N4#;GSrt3i6ujn@C+Be&GH(;VQqQLuF$`gBdggza2g0nT)=E(-(xzUWI#y@bSdX zVO(;@zQ{4T{^@8*ungxp6NYfM=i*?s5y!C$^pYI_FS0y^D^8i#0>TvDz9svJe6C2+2rtbA8| zGE_^<52wc^|0UNIXlP|%WohO1`TADhU5iEJpUUq4tz$nWw#a=T26j1l{ZmK3RyX2* za{8H`CGac60-39ZckZhJ&EU9f-Z4=|A#J_zkWzx!*j@xN+x|B+ z>K@h<_|fnZ+`N+^>q*$n)`!?^2Ml}>{EWU>ZfQaHzh}nfIyEmGr=snPb?p;RH8ONA zK3ftBXK1&qjUMNglE%+(y?ckEw$or5!jNm8476V$?``oqlkQ?|sQ{5PR{5?V6Oka3 zo-!(KC{vw9umt79_O%Js!*h4EC!6m^vDLBX`U;Gm^{lr==UVVo+TeVQaL2+CiH`AO zjdRuAj!`m!#$-!nRPMdN_*75%#0ujM4AHafn%#V+!XG;gdE-8TNA9cGOafIG9J~x+ z>ssziDXb!d8q55QSB`gU)BSF2gpSc|_7keB6V8cCe75vtn3I|=lZNL1nMYN zwYwIwl&O~Dy@naqJFQS$40+zc|3)A4xL@fOND*v_7jCn#*PQeZ^>N&E&;M0;-D=tf=!#<3-a)@O;FaeGKQ==S`su3z#W3GB)j$2L|6g)WF*V>9%y3a8W6H6L z--#)|_&SKph`e}r)F4&l?NN6&E|~$T`R0Z1db-);d?)Cox4Mhpq3Or&tv+=?svV5Z z|1K=|;#{T099+0tc}HQ@TJj@?P`#3r;V}Gw1d~|jg6bveA!VX8sQzyq^~(jlqt{il<8lTqXQ!}qeNMf@UTo@hq}vvDo!R9B=DSU= znh@57JD)4%NH2uL`{2=VXloRra+-7U5X?BiVwl!>ig0GEkHyn6S0iAHTw#GgM?es0 zQB@Rcm7;&palLoUj38t4b!alVtNMsJucu}4%-(vXj_ehuT;!YvGrA%Jw5Q8SbxjEG(7B{`r
p! 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 D4GK6~ literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/02 Deque - prepending individual integers.png b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Results/02 Deque - prepending individual integers.png new file mode 100644 index 0000000000000000000000000000000000000000..2409569bd07dc2d197e53ea3ff991c8e6b0a489d GIT binary patch literal 444177 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
4Uw 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

(m+%sm$o^v)bZ|KKu%Ev!RZ8?ekq`srP=* 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%0D1Sp9Y8k2 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 z z-QDyVvv`4XyNm}`WDTCd_%-uv&HNq-|YcocVHcLo^j~Au2h-}0+qUi^O<5=W>z0{ z;wOp<5ALiA`3vQ6MRZ}$L~dJnbvVu>33h=sRpiK*L=M>ZuG}u3@~KHLB_RMj#OAp_ z9f+EdM=@1P}YgP2)$v+ z^bn`r>vDu zcejZ@lRZHV&F0L8m%4jLl?EVP_We*KleYao%<~-x=R}1nG)f(njlsY_!HiD=l_gDj zUccECGI@oU2XYoCZr^;i*em{UlznRtCwB7=#%ZTwQ*1B^un44xzFUKpTx*I(KX6kx zE(iK`tr(n5r%s@=RJ?aip2MPhR~A>khm2vqGo`$bsl0m=fV^)Nn#NKJj}wo8U9 zZj={#06_3|$l&Gse?R+O$`q5TRGfuhgv9c%P!LWfRtb^^aV<+3&4*y}_XFp-dAwv| z<@I&K1z2c2J=#ADj>gk0?GR%ePqLh0o$}T=4J8)E+1AlTKEjAFpIrFzxxG4nKAc%? zuo0@dt{7foNFC&$O1HV<(I%jpHG!Jt>fxzbp*OLep?UAHg9$mFg^!KLvKn+tchxx;TGSQz2vzt}N$%`

0f4lYd-@pkU8S;ZmjU*O0pw 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∾^`@9Sa4!dj=mXbD2&CZJxk)=bQ$= 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


U=}$F)t^4 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 (nzVB*5gQi6TDpWv!b@^YD-^MArI{>lf? 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

XfTAZ{LOC6FFAqSxNK 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 %vlDkU}&JD?#S_MQ_J}8$z}dPkIdYUr#66 zJSg}I`9wSw5uQ}HJ{{ejoXlL_^xAhWNQd2edPg=tIgY~0%YK+wY);!I{VJoTgwt*o zdX0+|_9DO#=-t=H%3bsFeBO2&<|9V%ZzDe6_X=xjW=q=IjD!8o#EQ`I)L+(-|HjHW z=1i(JGD1a+aU#y41a!$RCZ9@5Qc_R8&`8|TC#vlJK#Srma%>_xCW+$FX0FiQ>;LNa z|A7=_AN;?_s>xOm{1Tns-w_IHlmYQa@L0q?YXJl{?xPPpI!RFh2AGbOk^(y-yt3|E z-FR}991AAMxR|R-s=tDbumIJl0mb@+KKvS6;wvqH>Liw~Vb>N`u-x zS*CqnDd?YcsR=QgbRa8yI6V<`FfYX?33nL|;Z?~C-<$Fb^+qZvSPBalE*1S5aa@@q z;2Dh^Dbfu8h;`>MY*iIkjnexmiGVK@VjvE)a8Ne4lDWLYN~blYcG(s0!>MB;>@=iC zsBB7a>+5p%^6gW=|Da6BKE%8yP~0?~{Ws1N{H@?S8imMRw4*UEaco7CrQRwc@bqtX zzT+}5+2k1M$5K~G(JCjb&DHGbN`sfz4!_RfSmIP9I!IzmfHKsiBB+lE zR%T_+IrAi}HN7HU|DI-zk0lb8-UJ60vGYNc$q^Y0u2m4n{+wWj^qlSx zIqcS4Rx5D9>c6-Clyh-n^lc~8x)h3MMj>_zREnv*Yz9qe6bTS!qgnt(eR!DRvJ3sxcgg9+n%avKU`*`9R6lhM7a;z9>!;S6dnF`+~kdDh<{sl)p|jA z%W?%DgD(3xzxHk%M>pXqP$tk2wn0_7|g9Lrpm+$%f)=Ilt?)4e&=$9_d%F-hZq07 zaVa)2f2*tyXa4hb1U++~1S7BobaN;Fy%I(XoBl}a^(Ztr%{a;3(<2U_Ha z1QE1wWB;xj$4M0=QUD2XyAE8bb^MO{mgQsjq}Mb5&r7>v-iBCDTw^iD9njLlh;*t> z&VTN>q7)a=c+r-JxaO2c-#RH$sR}-`49UK)=cIYjFd1)|JM7@6zcG%T= z`g}e5VmP5P0tcX~1vt~KpTuR>E*a{^TBZ4NBDiE88RVJTa+|{(ueo=tVzL$ktvK36 z(qlLMIHFJ%c)2JL-t>ZcM2&vPp38W~iHMisdPjZ(2jb$01HCT3@eVY@%o&@kP;o?J zn4>FV&S+bs`~z^Nmi9&vo&O@gsM5-0?I1pt>{|Ua9c}h6gQVo}nW1KV9z(Hk0-Rep_Wc6d=gb;@dl)>E<8)9BRAdsaG8N-@HwfUmSbeeD*wQ{@6Mb5g zDrGUp1oYkh#atcSl;pX{1od>IUeUv;q>^&Ru=16U~)(`Gjh9Qlj`&N6YQ z?;E-U5o{bsKYbi3t8KyDMyvWzVVv()k(-bD>Bk-K_w1gy%MUZ02bkq06NmfA1myML z04HoIpH_A6EX`qovT7Vr;W+<43`sJ+fS$IK4-d7v^o+k`KpFt){%g)$!^=MYjZCI( zSHY{Tk2x}2%2CzTp)(6d1!t?L^OQ@E00?GZH&WI3I-i#c(z zOfpCi|GF}BHHsgcAN8)9f0CyH5pr*4nL87rxyut2qjiu?)0Q|TzX>IM)JF*|E$oS~ z%YM8L4apre_D^vmY$~89i6svc-4t`s3;pNZ(RD$#T`!uWV~V~IcdrDzRWWXgB7UaO zFfYw}-Yz|XeeptgqS!Qx3omt?CXozvF%C9V))$FA=i+xHJr6+&o$*E6b=s9Sy~WQI z@;{I?)bGAeM-%)MhfAA$?fmCQDZLGvxQzE#9U~==XQsUD$UTAMIsTm=cy_XH^|zRW z6B7@>`H8N+z&brRai!WC^6j4pSbSMw8dRi42bQJC(J}j#loRGy6Fmsq%MEoKt%xDN z51S909vxrCe6>3j7ZT_+CHxl-$MsIIpmp8YJAUDo33FvE9_YGWZO#605SwX|hsNIk zt7K+IkIeMC<5?SRj^m7hyBKfxfqW5R#e8Av#z;n)GpUwBepB>CLSe7%QZ3NHPJ!A- zO@H_cgd>|j5k>hxd#~cU@H+=s6530dq?EJY2!z_y9TH-HpoLM ztSv}|NC13{sXD0H{81N(W= zM$qEB1!X!`h!9#DV~>Kr5rtXOVp8pxf8H+7D77AJg@t52g^Sq&iUa*)y*NpYQs@*2 z3MSovCEDWI$dF9fhw}i*iT z1mB%ZP_AlDGC9Rfo}F3I2lyvId;mbEvQ7u# zPB#}(H+AKvVw0{A^hg#FDZ zUeai_8EXFRFeN)Q?7;j2*&(RW;+$@jkK7B#2OI?5n_G~+NrqhC31b}B?5M8~t5HAK zL4(2@pqYxWgrb{|CVys1w^9hPW?YY(&vY05rUWVbo!f+FrU zvud9T*E@_;`a5PRh`LLy*fWI6I?4C|1c;Q0-02Y~F1Oxki&TJZG{82Na;nr@wk+&O z<_FmWaKOR?7tf~iTvShp}!%0<13lrP; zu=J@B@@2<^Agg9gas4e@6J0kd8cCq!iCnEKddecJ)aqtM_Rt z7aFZb_o13l&h@b3Fgn4<9Ty{2C&)WvT3p&QF-o@wcHnT2AUac=)pvai4=jntFYrl1uykigb5?1J9GGGsP|C4PAdHAMLgv(pkO5 zz0Viz6&G6Vuc|}!7uh>(#m!%G*@fp?1|ue_TQ-ky*O+TCA=2Ie&>~}CGcSR;-UoAI zdGS1rE2q%!?HAHQ@;z)vzF9}-<$GuCX|StyUq!3-_ZCWm!yIV#@VpDIr%R26N55}G zP7QP{{xCm=5fNI_hVjaIO!ylPJFWV&cBA6Xh=iTVdrMd19ypG&zMyPkqHQ8j$LU=R z&%povEG~xlivaN%+4uWgO7_Z~^Lw+-cMj0YB0(xpC3@+%YUxQqHHroRcDRTb&!e=s zf~HCzuFhv3OL|~8o}?8q^!ccmEVQ%KdYHu3*6dijvp)2>O!2&3Ww4kEwR?kaOM-k$ z<>H;PlMMv&LQ&ihpJCRhH9M4PI9Cai`bmC?jEluN=HJBK2ONIB2q~>i49Lb@z76mB zqS=#^K<_Nm_IKR+zlaufDEAYE}?+CDiG5 zCVqd*x~@rv1|p)Wk+C%p^K-#@E8w%ur@L8(w@3R68FsWyv!HY^gK6!TpP~(Gn%B4O z>=4Q-yGF3eoVsWTv>qYkB1L*^wu@s`JsZtl*hl4cHRzga1}>C6LZ~Vz#T>Q(rGJ|n zu^Of0`dMRU^VZKQOo)*+-XIuJO=72qCq6b@MF@PObW!q!$$r;_=mrC8E$1n5tu>(o zi(z9<7{Y5(4*+t*gxPPg(mo z;%G7#AsTu;i9bqUt|nt~6~S?dm4a?DzD^fmtq5yMgE^Ts@yNTU0@$wQ68FNsU-3SG zF{M|3rc`mSad(}B1_X!PCn?wMf_s_aeBIDrY8Aox><>O}tfYahi$m~uqd9BF>oo|m z+5wRW4x$TBhtlpl@u!V*^`}LRzvqTJ@Ro7)NyP8wT~@O=nAJT2ct}+GdZ?(dYnqQy~v!&`K$pXRcn}Mw#w9Ji+H*&W?R%l})Hnn6*DRgYT}dk>2~I zTSg1A;NLu#d)`lOJl6E8vB)}~H4>B}E6m#6+ctX{1@{*@mck^CR0tT06gD0w^|g!c zkK(TC8@3Oxp~4ntSFdy|5E|t{AVrr9dWkd1b26QQEQn~1P6MAk=M#OnI}nVEtLcai zR=WE*5aEas+AFk0GOtUunNwh{3~ay5|3M({4dE*I0%A(ki3W*(Lj(J2pyO8~4GCr6RFiMmlc;RqqG} z)L|5wS@S}W(|~;86LjR#;;!>T2k1$RFZ-ebFF4!<8;Yl&`mq^eKQLCnYLED~qwUVj zgKm{ni?G&Si2M8w(Ry1|c3@saI6`Ypmn(`s1Y#PrOTGHW`6Bx7o;+2fMZSj(u{k&G zTJWsqU8ZBV0dQNJ;N6XSP(1AZc=R_nUI&JYxU_)QOh~)u(#=Jy9I*R*F1{vrN((w$oQ=#^x3iYPPoPZ~%v5|?$uj}> z8VEOKy!tl-FGAukY1Wl|NPY={uabG~B!h2O+0;wP9&9H&#E*n8g#N}0$dw||8Nnac zdnj}0bLLgMW$4of!)tETFHhQBdCxz4(7f_Eb9A(4FbcFQ!x8Peat7UgV3{;Kn|9hH zc1k3h5s8~>4zq&qtHX}|CdMncS-C$IE4o?30|;nag?sp&)p_DCW6E>$fu>vXsity9 z5nRNM|L>pFCW}Mt@jmR=G5%~(qsw3jy!3m_0iKbSmg(f%7vQy9X~kAgSWR|UW33(R zVQOI($&=5OTZ|vI#R0Fy{uJ%iZP2`E%O%neFG3Gq*R+)2pFQ)!q!(mQezc7s1pi^- zF-!<(Mr?=adgD=Q^++&l5$X{iq)P`dvbLn$!I)zaYSb}mN{z_rAdIXo9oBx4FS`!* z=<1&FjgQNr+%VG&Khtjzn|w`0H5-*}f-lykZmnZv=yS%FLRE@I;ItqE2bd%)Vi@TQ zwZFE>-s}lu!o(}~sZA~IeC1mxs??jH&aT;mr{7i|(u_KL)fG#1cn@x$_4v{S(NkIA zzR!oc^hT?}oWeadHK%t$>B6uZOwo`$?-J)9xm(roKUyKp{ znp#C`0j>xGb)65e!$EPLC0v3om-B`5e)h5V`|7uU@joP_9EB}LD^S&H$!C(MjP|NG`wTyR3p zL@Z;v$JK6*mt{>h1ZVR<#0tkeG?6zE7`5{r()CP0y8+z`Rulc_R*b6Ad=}AX{?GE4 z5;@~9gxU=g^jkQs%+n3O65soqubPfj1FVPVlgrLpIg3!U?f-NEn83h<1@qnz5vn;> zZ2@QZvFze)#v&0}sgNs`@Cr3Wu2fgWC0W3lfs(Q1xUxK0I zT~#1|`{KJN(V*oXXAvI!_uKjgrX4*`cp(8H+co7273h?^_jd`L@mh*O1XMde;4pB* z6At10%G<9li|OVn;LPEG^-ahimX6FMJ0HXaxBWAq<&BF7Z}eANP)0hXLUw=GSnHB^ zM{RhO;9t1->7oGNfr%U4p4jXi(17Ld7RvE`@gyMpZJwu6{!3}+pLR|?rqmP)5ahJ~ z;slVDw-?FUa}Q|n+o8pzR>I}O4vb;FtQC34S(_AEy^rjY#mRD(SgLN zTbSS+C^>UmpLq^|)DW}J>20b2!doE0o)|MEWVW1vco?9~RB1-?(IqbwNH)rL9dGrL zX*S}7SQuzn^2~)Wo(CDAD44+NjM@eO^At474`|@AgI}ZJpT99mO*E5uj<*;T1_H8; z8D=nON#5ng2lhM`KsjC~-1bWO^&w&gA%?nJCa?whN|H&x!-2#T?$lqKV9g&Zo>Mt# zzMAh>9L*{U@xpvaZbfX4AD}-F*4v=Aft5zI@y+{q2&GKe?c#6udliU78M3~3M3MAd zN#7wF)_yt6&E8ZL`yq~0d_%{He7GKZ!rAyCySIb1~2MfvaBDlfu-4H=M1v?^)u{iG?NqR zAiY949;X+WFGFw!=P1ZhTp%vDtZ+!Orefs0w%>7n^HWWex{f)Iz51*+nynuIK>9$q z9Ok9tKK$UvNyQhTj`q51AHHr4FI)Xep#rEiDp6j0Oogvsr0GO_#eOw^d8D;czFF=f zRIBKhcNNbbj?OcfmkPq!-vlWam=F*}Q0W3npO0=+L}Lj&8x<3q26OWge~A zbKn5rQqyg$EjxYmqxb0VfvI2k0|y(5e=1E-lr328oW3qdxa&q!lk3$dqf^j8W`a4A(V2j&VG?PKJ@ydF1Uie6FwQ^vnQQJ@OklP?{j>B zn>53<3*iGqE~mdO>wu=Tmv*R)aUkIBXfu0FifyKvxsc`ImA5`0xjz4Q31|bj0K~Xj zWhzZi2LfCK`{X?X^55CsuoHOrG1PWl#U?B3;bDahRfgF?gL;L(-L4G3AFEFVKTqkI zVL1n#D7bgU2?_uYw!CODi(hoaMTCVTzFL^q@*{f5{FfJ?j6b<~HVT}!^`iIW)xjqy z#(`j6C?7^vlAvA?T2A5Vp~8hYkGgWfKi*JaWWWR`{?2aN1w1GygP!3?q!g85j&?;Q zEO#&2;TAa%XL@`h?Eh#e;oP3W@(t_AaFvN0bb8Hae9aHv0Jb0iT!vw<f^IK zsF49^L$E}5!^P1jJy1K6>WZK+ukf)9-t#A8%~4HvQ~kk6!7@bBqCFYLq?S^f{^85` zeZ&(HQl*s#9M+8Ya*$ZbE;F>}QhB|}E$~}u?uiV8;~J{+#k$Y>je=ec_}(}I-~1g2 zu^t7_Ob#4n*;?8Yyjbt$u@3$Q*ubuix(Cqzmmf2~{i?Ov$6XxY{pvgx!+KjKOXkch*c&sksDyW-`KdCnOE;K4EW7DGEl*J+U zWjP8}^2+zo@&~gL`afj_K%z~n0aME{zB0$sSY8?@&dEGBwtEf-uOngwrFg)F#{p-^ zretF`6TC;-*B|;Gn}w|Nc1K#hz{OE*E2Hes-kPH3R4FQVn?M(`Fat)jHk&VMSl^M7sn3u3`A4+2XlqW`LF7@;SaWhk1xE`RG7J-j$Ao4wF3tC^_r_G`gK~NKXzK=kBfXe zfw)0f2Qwlrkfg9Ii=ap2SX6~YfMK9J&jvI%Es{5vr7#jY0M%Q(6=W|RrsEnnc~)xK zKK??Pb^Q!4`eA@)l3_@)q4(q=Ikwm3 z53~Kr>za@Y%WAlGQH8?d{lTVV3b7YB!~8Mw*(d0(o6LA~{1+_VAEl7%x|X1-VA4r) z6FM=BBc=Hb-|-WdHjnHijHo7YFr91%S$!|_=)_r@BV+(Gov;C#0438_C%b?F5NfzR zq+JS5QeZsbdip#Z4Ag!Ue6JZ~9rM0+5tYLr+Cqo#ixr{6MD_{V|8~P>zn%V-A;xV* zA*r@_1P#jV9vw;%29qNsW2yqdup(+HsQ5SK-2scTV87P2g|uLglCD&Tk`OxQ?S)u} z2-Q3$wWATRc(s=?QEfNrh#DyBduw^>^qXFH^cHwwzT)3dH&YRHA$tBo>Ks$!Tv~dn zxH?qd9^v!%i6IqQ@q3Hksj%MRUC%5z`m&ESV< zZ!F|`6eHbUgtYd@BSE3QjCO&G^7&!>zIm4x`Bh;P%(lB?%CC;^fkj7Evf^Pi3ze=5 zO|rxZ1tRBa+#{m8PW>ZlBS8XSQd;JOmAM_BEJ7&0}8oOOrf7Z6GA8&w9JMLpH3()>rWs?tK^W?n1XoUGxNtg4MLr}38VSdUvh z(;`0u8>ph_2IL9AAUpUbH1{*oq2K!(onBD4g57~9_3PNZ4<>k%*ey{|CU528=nKyC zX}mGE{Fuj46sJGNqQ)ug)*n`?4}fC8=W3*DL8)JWHc0s^$_tCy%iEF%^Od}+lhYi=Z^ekry5}uj-1Ds2LX%lhqwn5UsS_L^Ni~~s=~+B&&7Pt zy&FCqrXli`z);2F+{3mJ@EXSMJb-zv54;{jk>jBk;>PJAyF=_azrJmLGPi z7M5zB{_Ip8x@|6(Bu4bW2JZMZQIpE=>%*uGLF_q7{iQKJ1_YVSS!2bWg&EBG6zi4W zN@@nTOZ?TmaW>LU`GZ!PMLC2Ks&zh)O4A_b$fym+QN3)NOah~?z!~$vVkriVQ7_0N zP3S%@jP4u;*n14$e4`RYeEDETy76n2^{m=?kqE#k`5J#I?VR`LIa|}uz(ZZv7qKQg z&XH@qRnSk>algD`C<;-LcC@k??*{AD-vkq+OUp=Wh_X44ZK!jb>drHUb@*@dzTfzJ zJ+n!_vqEzPC0+V_U25yMEyQoWBY3|3VVK_*CR(7YY8N3karW5YAumL{DuMZt>sPxf zMyJt46rMCw3x1?(;{fawR=d$m6$M6?=S+Ojj^YQ4zk@9b; z7e33l?We3{@j+gzd7h-ZJ2sEpcBKRSJNGDW4j4w0izn5%vwjyxtzZy_9+!-Jnb^vV z;(H4M1=Cc(*L*A4m)I5aGy0|^ZniU-rf^%e1#0aW+1}P8aIk+)$HjYPPoVFOw)=_S z(KojBv}gUbqOgWM(a^qj^WoUYfk9w?{pxh0cle7nQyE)CzQmIGpK1ct0 z^v9tt)?>NvbGn<)B1Y+>&DSL`Or6r?hglj{9{ROJau125*BIc#4}hQ4 z+I+AcN#W)+2rv0WtjY5L#$KKlD96V+05J0*#1cfj>HGzKun0lr<%ihU0}>i&PFj&}W8O1@Zk5>E^umb> zFJ!?Y#=B%3wC3_hg_M8xMhKx06DdoJw1={TR9KU&agxP+5)L!Jqg7mJlZs!aw2gQp zBzE6qnzZqNQDFF(#);;=ips#X;%gFga(SRpoc-oI6rSKm*DqHw;tY^iTOS@GZeiTw;+=%jEjeaMSH5|6|9=)y*c!=D#%Yz`qw#2m}KsLrwy~ z;Mxv~k5zk~RZ+XY<=ryJU zC`JEqo2kA?3$h4cqypxLn@(laXF|7RobT zf1hbB{~8-dQn!9!pMb?yrXH1vRf+JngpJ7jMr z+ir;f@4>Ru;Cy1pJ^P#O@ktrM_R|kT6B4bpJG-9a@%5h@2@h+wVNZeLxn!*Oqa3)* zOyw!R+OqN(pMV1KGL+SF;zlZ{A6X?@Z=LCa%XoUu3;0oOj4tb&x&5(Z&&2rvN#JOt2Gf+%Lz2LAfq=&*QJ( zvh-njrTPtzKm{B4(s75aH?Tn=iYBY%jo~~!p*`3n_@+3hi8sb8Au*VUv(!hU7u{C{ zv6d0Pis4(}LsxW|>5llR-iYZlRE&>55TKPlZeciPh;V3HoAmsQ5OxgPO-tlwevW!6 z?Lw~EtAY(c1MU_d4ZGr9Jj1Fb$fsd7=9 zGUha0Ip?+Qcr_a<;5*h+(ZF z%!SsB{KsG2Z&(78Fs9)#Igi4%lg;0afzLHk zYeCUc+gbc3Jx~K6_6M7v4{j3{Ap7wPL$2DetKho(&{z8pVes?~pZtpN%T89mxRA;- ze^xm%ixBROM?ASKg^BO?whd0HqxL~KAiCvyzAZHtjyw+ugK9fDgP|{#$2?MA zd9AB@3G$}2WMiy=r4XN>YX#y99AZ|O{1nBaGESCY z8ZLGsscy#Uji&quf46E{TpG|+oUesmQc!9K4h!cP=sstT-oQAp|H2v$J}vahJ5SrD zfM9?lB4OGl#!CD69H|SJDBN3(d0HqCt*`(&?oOh_?)fC*D(;mw4OVeXi73M)#@_>W|BLCs%D0i9nunLh(i1pun{+0d2F&!X-|ECgi7Fg=G};;_fY{C_`_ zOF6sPN)CihifOErlJ-MbB*FSmkKZUgl_ax&kO%Xn|#JN>N2zp z5JOe0Y?&aAE4uvGo^}t^tGt{&gS5FGAmwEj#1D3$fPUx)s=|HqJ-w@27Dt=EM4+c^kbTopL;vx{*sQ`s4Yx-bZp-FM>g+ zt%)cQabP+jn((#W2{vFql^T|HC7x6X#!(W}d*gi*^k!9&kG{JFWpR_Jnq4*8Zg=~y zteUBvG%uiRsS*~c^~=Wy?*~NqO%F81-_|c>_b+EOLZ4ntkak<=8q7$tK6q=m9vM7W zR?sKJZnf&2rPtnic3zL&kHX5y{BFlMY-l!IyZlBvNwHMDbKddIcW#faU+qp<+4rR+ z;*^U^1E$SZrR=_3X9TPtH!T#i`hn_eYIaa8i|HHX`*{6=yFc>dm$cH;WwTps$a9Nx zdNEb3+JyIkC3^;jL3XXe8nEx~bx-qa;dIMBB1T3jd^Z+J6F!J* zKqepKn$Wup=okTgYk9Lc|5!W6Xa^(icl0SXFiAVk2=cp``@5+L$)U!|g6LK1p?#0% zsK#DdN;? z|HxwObeHVC53NC@7t8&@)^1ayrEGujGJ9~m4K2z*!)2J|gRjVJ5%ktcrE z!E7$vF|}DZmuqEN7>wIi6_>T0%@7^m-SJu6?WK>7dg}97c(L(6q6317+#Jj|84h4r zL;!7i>Pn)Sx@e2&qOE-f3;zya+_$_nx3?Z*hsskQ6L?fq;&K(lFZ2+c5xO_!}FV9daz8kYsxN`T|EI^rJPF zLbW>@1Ps+lb6=0fracqdj#iTD7vsRozmlNb$U@B9E6p`)67(D5WY!<&e`Gi4Zun8W ziz;A8M}+VV4Sk>n1~V%ipXI*Fv~k=xV&?D_N|sPf`;FXMASM{5u!_~aw+lr zZSv%Uesln{`vCSgBl+^5TVOr?r(^an2B<|NPb&oo^0xLafx~X(x=RAn?eqH^*4O&C zP#`I2HuhE4SGp>RC?N89)#RcC2jj=g!Pq#>9(M)?o zzX;=FWus!eztWOPZ7+#>fkpLW3;OYHBy|LvN|eGhkZuopeU;fvelB3tdac|o zbqN6I?F_xKZcTngS?1XhVICLSu4%4U`-gV;%L;W|pWs+cQfiOfesA#WHs_6#+GaK$ zr?`9ZwLz4NZMI(u0UNL6SqQEcgHh!#Sc1I|4STi7S8iX8)&jD|1^%IUP3Usb=4p&$ zKesY)e+C*#cxA~k9S?T_ww(vj80#mTIYIFupnu>=*kx0lv;a)Cs5JDq;#T`8@wU{& zGgB+=Ec6{p=#|tflOff#@l#tF!^7`ObAws;#crL&BYMtgcW{0&y3e4I=Unqa|TJU{P6z6iu ze@N{YLgbg*$fHLR35px}_(dc@#6q|a6K#Ei?4wV-n7^FMm(4w#83ER8Un={eliV%~ zzzcCXDwlvGx%;X=`cpkC^7{U=2`N_!icgA8jxIhBz?Z&5kS^G59hlSCWWb;oW#$7x zh6s(qcX#d)pnt?X1IHdG(`5T1w^hOUiXQm&ZG+lm{~uXj9n@C8bsfC8ySrPl;%>#= zy|}wWaF)$dL>tTBrZ&#k#FBH1df$UHw(4DXWh!0rJNVJ!eTm#(?P%HuSYTMZC=d(?*mYdYa zMt7v`7Yw9%=_pR)kJ%4cdDRva;g(MVJ>6~!wRO@O_{687OhBJGS^{Out^t2SSrhPs!7*{93Pz5-Gqx_nZ~ViyZsKv6 zZM923Z$9C}>K=*LuorR$Yqgg?_u!61)Wg0ON=Ytd#@IdT;R`ap#Ufsdg7P!I_ALbD zVb7#5Fy4wXOvtbusJQE)S`Sk=sO5oE=L@>Y44tYEEhRqGCsU(uzq9dqiw8RFiruc} zu4p$EOzCKV*yY~Whzm=J34^xRjA=IUgUHq_mj~R%a%Ki_AHHkEA0mL?@9a+RMp2-U z>1E?4{aByrWjVZPjXO;c-1A>T@N9AA*ywDo5M2*%*^zGy+~$;%Gu1U)qXl03#^N zTLHMLAfO+64S>=8E0QZ>ZJDD7BL`d+QcA%!^srZvsZDV71XCCmH`=y}Z#E^t7(p z7Z|7Lslx-R=d|VWAAwTp;hu-`I5OLU%Dxe!zB*D@&BAKOiVJVC=4Nw0os|mKT+x38 zdB6a;!&e{F5S~-t^;J+8kh{z5o3Ugru;5gNguPHw)YPZXTfURhmH78vlhHG>4FRG@~f8KR1dq5n&vGnP(Z5tRT4>fr^Bj?Hj zv+1{xeSo?Jg9RktjPrz{jU!9$NJO4DnM8jy{GE!yciO@;1ep%prex9lUFV(gjLZIk z6r*FB8f}HOMQIvYW_M;)+_mAe+3|(eiYX-XeEd#6fSd@!27V(Qo+dsY@rZRHi;R28 z)CmCzg~mV5afFY`xF8x&Pvuj@EhG3KkoaSdq1a{bF8npXPwFE%*Fz8v-XE(NV-8uv z0};S(sb(W(qH9vj%7;-tJ-0?aK8j0Yx9;y4h~1PQzh40*XAcqA6&CLKq~58Q?nY=IH6p z5~7YL4AqdcgT&xE8&1>@U{+r#kG-19mHsa{TT`$=0j>z5OK9Min_p9a<^t6w_zP#K z=7c9vO0A(DJ~ggELqLFPpPT0819PTzAX%#TnlSwW;Ku3%RvOcemm6zr@CswXDthp{3n5;cla zJ^$KRymtm401+(9*VZ zV}`&&SW@h?L~F7hqXnrp*1}#tdoJ%llQA8JV!2_}?HcwxDW9bACuS6S@5PC@dQTDq zqBA_PHbNdsvV*PlL__xx!G-b?AAOQW)KR->S*>u1nk1??r|q>lHUo5Oro_(Ye;vok z{mwk+k-wcKdY#{c!l69!E2f=JfN1@C&SDVh`!P=@ zlea>hM3&BQ`$%YkRAk)0uQj@B8J4D9S)*rX)l3mdJ7y50{ z%M$~8tou9WVf!$MovxIn>0VdbqPskF!F4@`u;q8um-a39egNiPq=BYjVxc4I6=*zEG?{z)68 zg&vD7Ba)IKg|WrXSKctjcr|mK~?V9CMP2BRb{+4*}L~@S~Z=Pd|)Rwk=Ds)TO zR3l$N9(_c6F2gg|G9KXPiG?6_3KSmhY)v^6|5j`#%Ap{}E**#fY9f{SGUX(2BsEFu zqS%cUI)gG$#j3X`Km54&yuvZq`;x1YjfH63XHz!X3iTe)?L zTzAeiyygH89p=&;hp@$6`%Q_cT=DitZ9J&{6ITsyb>;mg31PA7|NBSi@H1@WBNP6Lnzw*06 z_3Zzd`%iO+JEi9a={g@RQk&ykRUm-Ev%yy3W;Qc;F24sps1H-0Zd3K9+ zPWL@4l+H1K{Dtu?APZ2{q|Rc>g}>R4gG-$R&9vP?G)K z%$Z)+cxjp`Of@mB63!9arrOU@qeJ%f4$LdNd?8Z4Ntpoa7NiA+eb!~ILpkS z{{y~kYB@;9U=emF&`X{h8_|+ZN6-_cvkqkVRDW_`Ldm0qwu4_DyUlJ?#I3-2blR0&56R*_87WZ^rb;$7q=J-hgQi7vqIw zL!N*?%2YopxkHH}`Qxy^*5I&dZ85?1ow({~LSp%j$+=01kbe$9`Ql7P{GiX;GCo|^ zbQg36_Vfyh&(Ui@ag!8D)+3a~$4a^-g+k5LHy1%8cijdw&0fXKkuMUXuzv{c)*nrGS>K{{kg?JLg}}~f2MYn{sf*HrmTfi%kj5SVI)>09?R#(?V3#S9 z#Ho_w7`N|8Ee?(e51a3ru)x&AK)i8zzzUjm3HAwBMWOYNj$7EvQc5>E$$Pw zrT#H(1y2->OD*ZpRXRqmF4Yv9CPeN4JWEPkal{A^p4G~^5BRd+8NpSxHYiAQM@oFL z(npM^v#b@mazkr1z$>J>v~1Hu4+56nTFBcif+-wk8?fCmzzikWZPEkw&C4bvC8Am; zhKP_7zstTOOsjP*7}d`eelEA>Hd*5yvH=pka$r{lmS8JmJ&p{ikN@A$+?_Hek19!|24}~-U zuf%tiTb5pN+%&JVcN}As-wwp57fd ze>P7?Uc-Bl=2d5ieSAaa$ucDd1lX|N7e!a{-P!(e2dm+`3agCiwa`VqE}Ow~3qJ-d zOMS%ENN$2pPQAL_bD%ItFsaaa5D`nvurIyFy$09{1-{6m135I72Z+N49r>fYHYSRT zDcMc&EWTGH+5s>*eb;hmeY%?4)izp*?os`}+32h$ZB##LCp=YHtZW;345)SwYV}?Y zmfqd+r#^jf479s>M{-@5PvW{3BvieBUEp`bqOPvA5C2w**X9Vz(lSK)K?|?sAWchY zK~vOz5k4*@8&9vz2`bD|n^Ju<)MBrK6HX}Ty1f0?Ht&!v(H{EA_;h{pOrDBVNxTa) zq4A32nrB*P+*YkhUiLQ`Upd0cqA7_OQMZ(-rB+H9G$et98z%NSJB3Ieg>5s^FpQ3F zsS-b5=Bu4-pbm4tqstCZ@(L6lAnl;Biuq*VRonOJ>Ozq;8G&epp>~{Q}AJBQKTpZJ%Ijm;fvlQ%*0q^NXeWatgegtT?-D z1ga-wV2TG$$dG@~1>vyDg~6ln@J;|Dqw`U#r0|Ym_O-@c=FJJfpiJ^`h`zrzKy@;S_Uk)%n)H zZ0*sT0lbl9^4o%s>W>Kxxtn*%IRhkF3_rbt^ky)b^L;AKYhCBH2E+ zr36oAwla&z14b9qANk*CT$r!e+nJq;W$QdXFPt4bV(T(#IPe|kg;*^ev7*hN2zY1i zG%k{<3r)?+%EAsVk2$6Hy2#}sq6%Tb*Tp4zh%Mj`)E%mv$HDlWvCghcHT!Sf%XYrmzXx`oE5DN;zZkI zlwpv$|8~H*FK|ryDJagvL#}`GLM=fjTjb{7OPA3O+xrduIO_J_KWJv6G3|@R*OWEg zZbN6s`MP-IPs{Ei$Yg@Md2ICTC`67AInOA*Dc0k)JkB)L?SDFGWd$r3K=nk9K&~k~ zKlCoQ;xC{tnuU~SODAl`?FIY|b@5EC<`fcr-|Le>;+}mgN%OI|2M%S5h(3m)y(xoT zr#Cq9@z-c5-w)ZgKaRTzw!v({Z-@kPYbVSm`v_c$4X82-AK;JZ%_zJ-QLdXqH6Kpi zD&z-qMLFVMcZ8@%v>Gvxn^6-zD5|Ml_}x3_>_z<9Ko4L?ryza2xDB4>xLoG<%gHJ; zeDU~)Va|w$9V{L4)XT9UVvaxmsTe=k=K~;nu1?ktkL|%N5zUHc289loX5z2&{MjViA%mXJsZ|OBGda{prenIYo$ga`2_tHF=ppxDI z8%jl$FYUm<1?CGRfT(@`b@T)~2!q+yZQ$&pzqMvtIY$D8tJMw!#fapKOd1C03OV__ zT%p#rAtO`ucVz^JlL^sm=)N$$40)D)+C7Aoma6zkP4MaB536^5fzY+cGbJkDn!{ZC zWe>nlI^;$@8VO7?*HPGSAtHk<6rNp5VyQKG`KiJrVPA$*IYvY7Dzco2 zV@v9a-tSzhicnX&ewe4Ua63X05VX(nkU(Rh!u^PT^4JTLiZ7WOLn{hE3+yS6au z>v?mJTP@F0vJDdenUQcp>T(r^WcBz;Lh8D=2ACC7WVBPs(rk1ET!39>M+PvoFQU>F z9k;xWVH4wR0bkjme~5hz!PAdJp}E5&=SYSIz>-ej?|cB2b{}z8lfyi@p5PAa458Zl zP#aIft#o@1!(y^qLD@ok&qgBWQNp`L9~698EVTG5N89B9*lLF}GX)t&7#S_<2jf&Z zdBAXlw4y`Q)wO`HfS>E!2EG>#HmuE8=j_Y0qun*bjv|2}LHHZ4T~FF`q6$kjt0w1= zFi#W|cS91)4=y1e8ffv~O#-RzHvtkCL37jy_cf4e#XS~)5;stnZwG`<$eYK#OV>x0 zDjw)5PUsU7E!9AVJWmb>){<#JU7WC6D^|I%65f?GN^T0hriHiQwV%{!i6E- z1bxSWkTlDjYa*;)+S$TKrAJ)zwAyf1G9# z0l{}yyyTR3sX`-E7ZZ9uO#1xbS})K7T;_c+g%hSv_X|0D21E|J=UQn)1EhwzD4@}1 z|K7$VZ0=t*h?X^rCM+>Dy&cHA1{QQoT>Ds0hCEJfwUzh7g2jPAY6*?Q&{o7jXJ$#z;H!=Gi7rU?c68S-Szmwr71H@-ckrqO0^P#CLwAryzQwr ze&;yUUIn%3g?Cm{hJA(mtLhtz=zC~W#<`>q;NWncXvx*18e{s~R9CSIW#{GvogI|R z&+F|2A&RjPdQYtglyV#1O5L}&;bPCTY2tnhrQDQi{EWiid?oGW1JO?&ZVP_KS6U^a z;bXoc`~BGm?X&EF%fe={XS#ESjV8EzeNf_APOrkkU=di2n5V$lJ36nodf-9x_7G}* zh|jW#L=1vctVYYXt2I6c#jP*@U% zwetm2-LT5FItmeFyhA@ar%eX#CdAgs@tSk+D`o@ zh?#c}5f?3mYR&fXVqFW@%-(U;C0%Q|f0a(I=+LSB^B}y(YJZ`NDz6JT{h>jVUk*k} zv)o$KY2N>v%~bZzr|%?On_Usqo_sX<{3acAe1qBG3&gegdfcGnbYP_CY#1R}N&k(a z+en=v?mj;M?=V|Z-ypR5L#`$g$-}G~4lrR6e;R!jA}G?DaHtT6T&BY_Qx#*v_C~Zk zQYd#!^XU(@<1Xq;-@Ri^E`Nswn3|;7eUthL6!1*QZs?7lgYad35M>#T$6tZiXPixa zOtlMeN}nd^LT_pxw(gXLOK!8h@Vl5vwnNI%y;)ms(J4SA4_32CG+RkjvWtZijR(D1 z7Nbl9q5>|dM)p4;i`95DrW@sR$h`S&JB|>OYYd4imG!)40|WOx8-;7_SqEA7?azXf zu2F_Bj+_f};zuo*(ep@zoX96lN$8iak#Sax(j5$H$Tz+|$t?}HD>@t|nzSnGf-fxe z>;RGxL%NRapD%pwhXlyL{-nFbPeLO$QBJm}?^M}TS4Tk3wA8^@9Y|pcQ_T!4^ycwF z-&-@99;3>%&ipzBUGyHU=G;}1nX_5giW)kEo zsxvY^%m)NmE0WDY|Ida$em3Q(Wnb^(z7e)WO2z5MrsiA41T0Ynr(;YkE9hr4gdE(m z|3_60s6#FvrS5nB1H>D`VI@P6*6VglyB}${D=&?IA0IMX^2CC-y-R#*+<`MOauWSC zoRcJ9y{@GUY*At zj2!(s_93aX;CdR$#r5`Y*oR@UU+q_B(TYXZGD6o+;aOl<;@dF!P{4aK zt_}0QT&Af#*U}!K#R=MRMkKf!F1;sk#GhNFa2^?n0*+e_j zLh41@T^+Hnyz2%2CktR#K7nfBsWUr|#b`JJ_twA<=u-gO8~}SxlyDNXwlaXM%|xsZ z%~nfm*IvS)^}T+`a)GDdSB|z`Ose33$?s-*H7;?zrp`f+ z;S}ur9%3zXZGpD&jf}@auItN?n?)(Td=zS}YkXFJsc9e$6BJ7`A+eBDJ%Nlc3_y;O zMHs|QY&Q9NLg}1e=R`r0Or1H$x{Q@Tly86nl#bP;G}sdnEP<^C4Z%{BG`HEx66Fys zgk4h`T(*rG9HLDS*Q(D$zmlmZ&6I5NS3Vh{`;Z6Ly|h~a-k(HF{Burv&~tooyZWSn z<*s$VeCoCn+>*|x9Qwg@+Q07rGBkr#a#fRSwjux#8)M9f>`l9kI{&R4riqV;*wVrR z`;k&O>`ztus+HJx&LO|2XmFaW_Y?{5Tny83S6Bz(iU>2}JzB&*EGDph zFtWrG^@egnQDncHRuuzl5MRxD2X)?K5BvUp#f_%_>{l;$8+kklHW-#oEc97j-vyv# z^dXk#8`Es&>|y<|iM{EoE#`jU|3K^-v$7agE~+8X+$3#chVeMgBTp#ln>IYC=$4MJ zhf%@@#fpR4($DmAjx%xTjaQ&bsSCSENxT|$|L!p4aQ{qojRFvjux1ct(At}HzXA)y zyi}O68{oO23KY#K$DDv!(vsu!OVdG+sFfN)rm7pCc)XaRG_mimVK^K9h2<}`=AQdx z5RkOLgU+ZHgIUt6{`1CGN9$2V+zr7yh4GTGp7&du1uhe=F8w%ZX`(T2l1hf5LFqETHAFsk%Gr{;UjRL%nxI z`yMgn*xB8~d?jz~J_BRUU%7|p3$?&ll~Jpl%h0b~CCZ#SlL%h^`flHyuG92s!>0R!BIm#iY0Sq(;?1wtKM zA?Eb43h_NlCSAUC9KfjD;?KOb9e)~+FBwF}?I?=(7*0L&L0g4>NMFNqa`|IFdWk;L zYA)Q2px6L+7x|2Uz<(0OCq&o$=Afz+4X?h=XVj8gV;}Zl`Z(j&`1Z#7%Ll)b>69E2RzCGx<10avZF+~?jZQhgBtUHF7g#tKjq6WKeyWA<$38~#xdhZ6 zA%?srzJ@k3wc6mQhd2Ou9@wC(nTX77j(p=uY>M}{*p}lA^Wy=B2S-qd-gAxIMC2C$ zxKvtkK1YZ2#^Y_T`&|g)RK=ZD+UjPIE6lXo$+dk~RE5=TKD0iKDRcn{ujHa2T3LHDNBR(d8EAhcGQI5C(mo;vz zQW;yGD-Rs-Zya{1I1~o0S!y&uK&vdO*aiPDcsEIV(`Y!R;F;F`$gkI=1_z43Evi(Yt)3` zW4w&B*BVEh*oNv4hM8{n|E~@CLkairnKyoYn7NAAIsmWllXBy(Z zbfyxSv1;`D=Rf|r7t%}iXg8y?RPH9vwePZBpg(1~>j_PJS0&I!BUs_0+=MlJ z_7|+Xrzo7)weq`qg=RkQd&GIG*5WJf*j-J%&@}j?^3KRC!>ecos_tl&OtJlf-9DCa zC9drjkKXofG;ODl*{u#0u~_HcFd6gGB7qG*C@5zTB-y{yDiJnzW%f!cS9T{!c>072 z2R}Utt2kY^BQx>RfILG;8GZWP< z-8;CM^E*pAF!u0WZJB(J8~tTwouWxNafaaiu=vm=<&phk$H(}}^CpcSzKt=_^?sdN z=2P`VcAIJgB##DT@TcJFK+s1}o3(i%D2Vc1~ zw>8WuFR#qk1!KnV-k$5kzD?@`nj6YLZ(EbS#j|jJ!{0DE#rP5U!W-4;q6GCCha0?m zO8-%X{|^;xWegqS_T5UvR#f^Q5XJVsq)d1$n1iN!TD4K?k@Us8?DNjSiNfagd)RM( zu#`zq&7x9~o0oJ(Otao{uH3VuRSgH$qQ#3!xXzJn^ck~G}{FCfxpH9pQY4twb+<46SfZF#M&5j#@(=OG((CKMEY=^r6> zP|hCFRUm?=7%WCmF(U)=J2S!(AVdV14+Pj|zx4fY229MHJ@scN%$!A(VsjL5#apW+b1p*r}`^?K9n( zI{|`V^WMlk3tiQsLbB6v!!%1+7NX6(S9Ae1(EFONRTNC(EJmb?vdU#75c)vdPo7#Z zQ1fZj68aH%e+nC!vmYS~z#FCXBvz%NWXJxx6_}hJvo8#AjC1^cnah+Q82<;i(||9P z88>>}t>drw{Gu6u4skkQbLMWKpKTrVouyx`(=}q62)PA-FBt7}p_)q)fOY2XNqq{f zk-m?*y;OaYFE>+A?_!F#^r5~pdsKey zO)qVnX;fZqczYFoFrFycJ;33$(g}%U^Fb`{Isy3)oPJ$(?kb*snJ(ooMk^q(T;+VH zXs@|2&6y0CGotGvaY0Neteh2!uA|R3Q z1v9-OU!Q5eH9H+}-{z!SMxE+u%#i1!-J6Bcj+Jim1Qt*v;Lm zwIs_S^+kQh%ogzPhPmI{LtX*!XSWQVr3FMgg5X5YDL)`LGuWWfQXWCsI z83kZ-8!Oy&Vf8$z1V16N0DJ|ZGn_jIX6C>O^ykjtlis?47fQTNvyF)^h!vpG{%D_x z5WYCk{Y1ju;EQ~_WWfT8WXlsB3SM_gqo0Wh+AoggVpVqyYx50d(}rH~@FQl_Hj%;l zO>+_dF>Ch=0h}fsi4#rMcF?9J04+M?*(m6A`YR|k-*dr8H#)ol5=5(P%gw(?pIUM4 zTE2A3v14DR19}IMpYQ!XY*9@=R-!k5kiM&-R((9Iv|+che|hFrvq|2Z;P5 z8Sf?7G)<^`e-ro-`#y?M$nw%=uLAx01hT*218+QZU|lZCcj?e|PBl<|J&`!kKY%7oLbT+I1_c z?TdAY2z<{u$L^VIFd-|P6haG474ApKFjjGAq>TyBInd`YA=crohLwULy%){)9*ZIPVU;rgb5d>s}0F3nTAg@1;$DpSJZF35M1c*UtrN=hS#H%F*1?^R4FHtxJRX=Dcl8k$HF}#ND zZ9EG!=}zkM21)$GP>Deov?`D_WMkP*;o* zbj|oo`QKhNOF4>n_xU;Kz%(|Sui1BX6F!JuZfo+Viz_<_&C=uoUE>vXR@m!~u?avP5TF*Ia6&(~Bt+zj97Gu32N`ZaH zZ6N%rZ%JdhhG(>tQ`+n9v}72Vn63<6KiKi8RADi+k+?plu-6YiXnZztZV#yDXM}rTKLOdmw?W>NRZh!dp&3K zuV!hZcu*tkW;>ODdDE;_ykLofJEN_6sccDutD*Bm%#&TY3`85RJVXD%_$p|YY%o<@(cDPovI_#7gkprS{5<~Nm)T!88H zp|7zRLGC0|$iJBXdH=wZW5Fv@n$xp=Hq@q;g*8i`9@AL;O?X@VxQe|M`wXcf=?^RX zt9TY6))Be+8@g%AQVmCNX!pEN1?L-78b-+iH+au2^s z1v|fXL%QHEXl43Uxn>Zi?bd1{&Qinrk`lQ=+|<(U@&Z(z=pR6h-U}@P)}dJ zTH*5hsBnihy1mQ$WC_lBvZJ0ba*xnQtsqX_J8z{A07I%S*fsNv-27nqb7x_V%!QHbl5cW?x$nx7`e)A;5lzna=g`nX!lir4J*tiPWY+(VrL<^qjO+7{hWs zg__xM*5LwU&Ll(c1OXPYM*xdSo4l9)VwRBT%%T;P6W?6tw>!E3bfoUGw!DMUx2JJu z;gCn#K#m)2uh9`@0?JU=A(D`Qi39Kp{BluqyV=Tbw_cm{Kp@>C=A&!sN0~UjHK14V z*cnc6CxI6hc^PkR{iu@yB2E z;_Pm}F1Vuy*@WCF@z*sGCC8=ja%43{vYTKt*XVJPYgGd6uS5&733vwby{iX(OAM7j zNItnBY_HrOpC3~Su|os%J2(H*d##4}kuD$)sE1uO9j4Q!9{OHguP=g3UbzR6iB-ES z5*-MqTtT^J6tAwFUl6*-+^V-DMcW=9f%~p~r6h1eJ*@d(eZn+~0##Z^AGpM37C0Xy z$Gkcx`$9jdsN;f`@xVJzTsF>$)A&bx-Z|Ep)-fUm^bAN4T+Nmo+VStFdkH$%LRA=^ zchXDphlvef@f^Oxq_QO93&9x$lJ(@hwV=_g&+)e`tJmS=Z2_%vSaQ)>TFZWZJ0TCB z>m{u|@qJ-a-w)!QOA|X2i^Y4is1OaiC{x~e*NsT!D$NsqdbQG1X|D`mpI5v@K3~z| zA?yy5>)pyDbmYF~ybi51gNs}-WJN;2axqEYg9E7dgC~+^RXnc1Ms`fL%eu3&X6mmkImOZ(CTr@nFKhi4w zzjvhn9T)tkMVTIBsaja+-UyAmJ_knK{j8jWsG6@<#$E$n#@sZog$PfJj&ZUWR|1#3 z2W<>tn3SR=b)PjV^!bRLO?QB#R|p>4<2MdNQd5ayZI<VBW^b0Lc9b<_u@$_F1H~WW_ur){KsQ5TmE~4=VTXU{`Yc*RLDcK<)@^C z5aG?h_*6w3*qn#?Ym$6rXLh+ueB@o-u~WT@1lxXt^$6WW)tu1Xg;$_ zz4tT(J6h0H*_pnbAXg=NM}*SErF0{eow!%iqdw$7K&)r-hqPRF>kEOL8I6+1H(Rzp z*1|BZY!s8CU^7pSx3qznv2#(OJKsyIra!N#lCS%i4S44iv<}%68Qx~ee>O!P-x&f9 zOT_pQHh)8k%s$cO-|ziB5qF4%9TqJHR5}>xUyH-bYNt(@_gz$&OYg_y)_;}Dg^~tC zYw?6u&gUO%hBrEIPzGOHCp&@Maqj8{Km4kQ)P)f2xxhVH1TnGNTstO@6~3cxWCRod z-W}Zi<~(n2^xRV;6uROi;K+&eQ^Y6->w~JUENqguh(gz_GJyPT>imelJzvsak>#M%aYoP?dJqScl;Hmo^O=y-atzq z4d`=`uRU5`*c^G>Fu%9Dp%}TJc=X$!BOS^3_;lxkJ2ZcDypXaT>kn>((4O77KFn@z zSLJyPvE>#sguvJ7zeS4)(mW~U4u-0O)BWE}*Kn{~fIZmTk-|;;(fWtq3cU(MnzPm#^j|Kf+`Lh>2H1mdXR{gRYQ0lSxZ>wqqzw?t&82Q-%PJiXDEd22m`EspMIoVCx)ia=>j}g#T7OS|FCe)=YJ_t zP!ksI!nmtc6KOx=oNx1URe27xpJCUi%N&R~#%2`kw9iM68)AhadVPEDsz>nBf66*{ zMBi$o0x;n6_wR|LnlH$#eBRCPJqdI1j-ZSK1!ojD zm0y8KN3fRaT&Ca!nTA($G6)fb*VswXQzIR=xG~76>x*7upA*5WWsGZ@#4{aWHSVDA zw$g2r)a`jxbTtmJ$RHkU=Vy)peCtPO5;~^ClMs{EQgjW*FCswDDY22jmIX^HYCvaL z^9W5X)8(qaAv`UHUGsroYsI@9qAcZ=xMs#U^t&UBXiomJgI9Mhv&&(aH-_^9@v_S- zetbI%{7nuNrW?4=2yeF}hJio<|5jp6OYWiyI?ecqlX6pXB+=Z8gB_oENwTM2HXoaE zLtf3RbQEBFPYUJyLO?w~MiaannguSD{TDTOgzn28uO&Nm9&V08)Ne*j>sdE%Bq? zMfgSVsi?wwe*^<$%~^zFgAl~3)&r1vJ>tq&h`ljZ&SuDa*e*z$33$r_D*C-?@SXH# z2gF9vhh6v)|CuAhq1L<1w$KDi3ecJ!a+K(>vILFoh z;Df}v*RP@Ulrx1|v`~T4zLbo@{w!EBG3frg%lq7jFpx5U#wYp>{pxsZynJ;0siQoq zTleJB1*i&lN6YwWv^5|4PLSt&u_wfOnt2)SgY6GpEKfYt!X~ zby5FMc|*psf$|aYvVD~-SoJ2Kd0DPc9Iqoup7q80N<~1q+^+ePK4Aj9{PY#>3zP>^ ze<~LI7++Kg($pd%T|Jk;9ez7ET%QbJ*R>p-Uk9mdAJ z=I|;A+k3vy#eX>LJd2aZ(a2G0%b)A$i8xD4xH=(=|A#~;b=X$-?g{hfpH`_te zTn{re)1=s6q>Es5l97y34Razxey-S!OX0V)A#6X^*BEX2P(Lol2FC6s=Yc_>j^fSE zZ@JwjO>MCjJoU;^_Q_yAaY1I6&Iy37j9Ira9?fYw&QWFe)rWAyTdR4XUUgb5}~XdOOzKMSz$ma930luGO8%Ae6D=-Ubzvla`NK%|CWN5!m}J#Tx6B zI=AnPXrWiGM0=~*dVGdi)o$SyF^U}aDw_$pB7#mWKM#4a_w1J4OLR6!v)L$?f*V5* zesGSvH^hTyLpy|u1Cs*Hde%O59)vd-G`$XQ@5dG5L!Fp7+s7 zCAy_++8|0#c#~>t*d0GR3TPNiF-1F2eLF{~wjw;m(s%cn*`O28W!2R!QJd3)F66{+=4ad(h|-I~ z(-m&W^g~n?7U(9^xbiVlGizU+E^9v?U*8A2cVz1&3FtLXy5(2m$?F89Y=fL8hS-ko ziU^&rdkqJ416Ds#1h3{kHz402sPaCxp<=;z`yoSXFCOu(7<3|M9G?xOz`Gbzmo^&X z4bR?51%`i=na_knKYhS;+gt1}>&uoe`o(?W%K{F%e^=Duxe+}}H?Tu8k=1%2 zOd#_ts487}p(F6^XFrGfQM^`0S-_4+S<)C#3foWw9{O09r`}wB|_FO z{sHI}=tdfF+b#Eg%$UFpSMu<{UbBB$0=a;svGm7Qq|#XYTo{}}Ynn&*Y?@k7j&*!;c#>5FlI)1H?zagx1@ z-33Pnn&kucFPgA^y>8O^m)aW)qQtl*)nXez_%IjZYzwq4p6(#hDyv@{uK4e))lR^r zchAl_hr%*Q28Ym9iF*f1;Vo7VTILevqoI=YU)@nl^ZiTQI!D}{z7E&igWoz>lU9}c z%{yS0(|$9H=t4jRFvh$;-*J82#q_K@1r0=LFR`c&yLl$K~}Vg(R4u0*l#yW?G9(K6(Fn(!k6(c3ZsgLorBOZ|C_yRuBQ9VDh zC}kDDPUYIsw=Xju>wO@p4|gV@K5_M%Invv9gy=$~^L6gu`X={(iAS?Q3z))&w&ajd z{bS*ri?Ifb4spz%s99_vKk52Z*W}O z70$>GS!!&}F9yRo%asPKJjw6bmdtr(E4{owRQpyxo50WjBCNpe6`L11W9Scq<$I^( z#{0h{&11Gfwi5QAMcO^?KoqS{F0&BB1Z`veqNOieAL@yd33jYeTt>&++XjWqox9i@b#Bfxy7xG-MI!kb0mQG0J= zVCCKb0}J}IKI5UVtSp|t|Mn@MjPcpgf~wtv$M1W)!*A|88h=j$v%hv7UaDCAL%bAu zl*M5s$z#LsAnaSOjWvf@iDg4V64?g`qLjh%lJVWtu)QMaQ)pC|DRa9w#rJ%N){ec;a* zXlY`Om&=3~oM(V4RrXq5)1|BGqLOR@MvkoJUWN+7bQAEm5s(ti zyVQNQd>v~73F8T$bI=2CjEc?u0+H)(?Lyz3Xko#8>uiU8kK}Hi-XPApnXv0>@4iOL zq@KA$3xBgRl`MVC=K`eyK| za{Bt$-CnEHM=#-p10&XorS4S8f&6+hv-fbvtzyrb&lFc6e zengnNi?+*Fo`84r9}@2s?v{j7`;Ny+gUgIf@Zb}69*mm;oi^P%y-t8Sua1S30UkrQ;xa;%)uD@f5(_Q@4!9FF=lLMsr=B3>X)K))F$C+=_P z3fdPh!sivqy)z$y6SosBG_2RS-RW`Ha~UsFOTVJaM+h@^A4ZN8&8euJt`WPEl9<+f zz2%axk|?Ykc6I*2x7T7*NchCqWxUl}Q%X|3uS0f(Sl2PUdGlCcRiC7nppf|A){aYu}nC@S#BoE0g z&XMXBxc3$(cf?4Fjg7u_vc*eQ97k*iT+dFch%dxfTm3?h znvkGAw;<^(Pu+KNOUPOP_9fCGm?EF@`+*15bPrbmAF{kw1_cb6&Rkw-6`F{2!;vpo*mCUr~ z!(JvcQWSS$_7()hXWe&&KSr!0#hdiyo{R7S>|5C^Gq{GfyiRoVlbAE7!m`^vZ-zw) zam|(Qdp@_U|K0a|@b>fp1H#GpOI(qQvz`c@deY6%9QI0{d5E3AShj_Ut-p9o4b%Ba4cKBh6p-(xO&ff{9u6nSc<0A0DZt*BBDu{pcPPT zclh~9yS~Bo!z0PL@{bj|dyk+d#a}r&vg7(qVSwi6qg$W{(Miw=YFnw5j zrWHS9+2WR38b?Ne5-r70$vei0HC8}Uo=b+{dN{7@mbPM3LF{u z=)e$E<=oQRlLF#Uc4Qs#n#Z_2=g>kLl^Y8M#;e(mV}sj}W>X!nUa+4fkznjsWUp5k z(CXT?0#Q2NBY~xA47;RqG%N~)erykM^!bHUO7|-j!;=3fX z<>?pA|KecQ^oCKQfU=!#u~r#voF?+Zp|(Pt7d{MC1c{X3KNqW$TJlW@dd)~Q)3+D- zCmdVuPqD`W)@+mV!nsdR-W3yZXJGFDd{?K1dDe72XBgjPcHeoY*&96g6b) z8amx;z9RGDd|I!eR6F8X8mFtXIv`wOF7g-e06qhSa9>`8+V4~2HeV*g#3uF8nTQ#F z5$q{88=0rL*en&NF#YeXJz>ksU)Ful%jfP(^hKs3GcCm^+ zs~$Z>$i#t7L`B~D{qC=v{1SY1Y*4hTg@7^R_2tC=~t0 zF6*oZ1I@=U`g$=N{DO?(jpRqNSkJ$@M=VG4Jrz*wHu5P_S5ICiU61vW(|8^SlncaO zI(m6m0qi{vD{Qq#Sihar6hN4bV!zFsi#ffWAzi!^e6)M5szO>9D*VoI(I@G5dUz-; z*v3CQ8+o#8YxALl+luXc#cAm-+4q`tp>^l#^X;9i*V7&eg2y4L$db?e$eG|2%e*fB zr`BJ#hK77@qzSd9%X;}b8HCrPt!ySMn!*NV)EOdn&i>!H;*hha=n3CK=|p()GOgVVSJ>RNQlYG-f{GdD=W@z z@%KD?^uH{|9{v8lv^38Tc^tAxH?kqugvl*l1qK{Qu-Y@=f_NjVh@8)~zyR#2*2WNzJ@ZtT9!gFtOwK*382oCm!$&#i$ zZnUopTSb8{nS@(XdA=)eL~&J|4xRe^zaq5;gkGLgG;McK=N$@{kXty4f4)&Zz4eR7 z;ArX(ZM?cc{?cYc>J7bPtNXFog}4ZQJ1~;8!AZ{krS~c70d4aMJkR(7bt~@H9w?)2 zg@1~+G>v;}xO)qJemAz&2FbeDxI~T~C5heAQMt<__qoVBkidl1?{SQ43aIwF%{zO} z`l>u$BQO3);CECZsEBclX6zY=>D->)X6I_7=LOG00(Nv^fadPEMg zQWjYYTf66Iw^p=o9Q>5jDUo$%QP9WY{yEdK6`@0kmFJ?F18;)leI-mbyDp5VsYOTt zau}nu?^(ql$F#{|V7;Snu5LEBEvsX<>nOpvyk%wc zLV}?u<`6erjO!5?e9%;coI?ccib{~@MA)xA%lY=gL2|%zFBt?Dr-;wAjWlB9-R#uc z?tpLH6e65{+THe~3j0QHlV#lDsY6i~(+u8Bh^^}_$YCX+x7>VWA6#l;`v6j*aY#q$ zY;DYmn4aU1`-9i~MGl?OV81-1t%g2Dj;>a5{veh|4NpWvM9OiwN(|n;Ac+L~L~t5)b}IZ(_m%x(7> zG8d3*#x=U7&ls7nUvz=5ERjw=L2XsKkL4{&O;s@1SbfL7Q*2fs1!bH0nq6Z&+i5RM zSox3jsPb|PbEs}aJ){)(1%xVh1n#Zn6(temp!+5o5vHurUNS<;&<(M!gsZn)ffGE~ zQcK+gx=UX?l{07YBT;BU!DHJew0aR^`37I(y9rSxkI}8c^VT!-%!s^@yY`uwTgKtK zTKprMzo^Qqp+ggVob0n8Wc#OJsTeM%kPITgBV&u?yNGS8rtQS69 z_X{NLIET!pX~6crV;-Gs+PIanVb2Hw>QKfQ0;9A)T{K=eUe5(!b!2)+AxJM8xF3oB zgWL#My>S!E$M($m9F0Wep~XR7j4iWV)qjhaTm!SUN;I)vY@0u3B35myjjYMhX~?Z7 z-s3k^xM59oE>6Q{>notTok+RNkj*JNMK0%zYy1UEiZdJ$O04S_x83jq+%(ZGN9}5| z;D1TJCeRi&YRoQ8<7heP#^Q@U_ia+5n`jP!A7sTlX+s*%52IEDxBQ#i4sI!)#p?x{ zkDkXJyE6rMEInjhNE0ei5wj zPEJP(M?!#-D(LWGN&6iN`f^Akq7>*G6D^)6$D7K6aQsIx%mF1KR-Qqfog=tzSgZi0 zoTbS^7m}ZSEDcxr?mk69{r6^eiWJikloTAMNJgfIWf8Y`6LMm4$j-Ax=tr$e*cp#q z5ibEy#pVD9o%T4V=jXgB7(o_;t{u;Cy>Qpe9rWd#zE4{oP>kWz96=L5{L8O5X}q6G z7DKO1Um{kIE&?a;?8gn|1je z`u7&~A^Wye`3tR8bx2fJmByn54?Peby5!`Z**vvF5+Nb+b;D-U*2tmi2=Dv%dsPJ({l*zkE3!d7gD>I(?K~S-D#&cWGP!zMDse9h1=R8n306P)E8wYmmlG&##JSYHs?8pqZw1 znt>7SMAjQd>BM8~VXUKWeW24CP(qGEC+fcsiQ9Z8KlWf1v}cpd#HJ{%_p*PGV!ZSK zo&i@w*KXNZ)CAI%^%xB6zeuRfBeB3E6m}n(pWIDRZ8WhR+hu&}>hz&eb4&qg4Y=h# zV%_hN-16_n_kt(BpSMqWowovpo(?N=?4yBOwRS*yFU2JtvYfYvstu3)m&I(a{k&t^ zMr%ss`(04#FDK9G%gRwnlU38rYahH<;~uaCV@vK{s20}l-iubmlEt=?gzEDylh*Iw z3C2PyPk4{By2`83r@8VNS(k`gEGW+Poz7xF{zT5>uZjpMU)}zTO+2 zX)-a;n;*gq5AexJ#Syv4<^GYaOHS;fZj(5Bj(fv)KCMjo>4MkBl*9P~pv~;cE0Be5 zX?&M1E4-Y>V0-6P4X0CD!t-T0)F*8|#wjnK1S&dZU_Ym8rf&FW>TSgS z&8Bl=pARL@zF&&>+{B+$Np9T%w#G@(6#74-|9`HHff6*&$&jY~z5xaA+qIrUCE5g$-3P$bIqROK?pt|L=AVzBY^1c2MlWNm5kz96T%OVft5}J^E85!@ zK-E|Q1gHpH9Uv4|_~WPPDv}Va0u2Tf&#YfsVLJsrSTveNtU`CD(NPt<)ehqhu~-La zbsi91OR!3&pG_PwLuq~oB@YqrLKdqV1*=@60OCd!bwdl~eAG>ciq;Bah-v#E7$G|m zHQoPE%RPw5D{%VR30i>fv5?2{GztruUA!+l+2gZhRP?Uq)W(Ni&E$m(N}4SWxk$G3 zm=IW9C2srR$oL=S?+6e9YzSf)oL}j(UcfVRA_kGQ^|@*zaUOj~43zi=PEr1T4b4>Z z>9OPaY%{Z;5xqoal+jrS4mv4 zB)LkGa0&W};^WYJQjaaH4~hi~+)J^+Gz>c$Brp-0*-r6N17`iMg5-R)#JBHS=$TL! z)`-9Hat*muuH9nt5LLsE5-y;*Qe~T+?}17lQ9({!PpWR6VO~O3R6Qvp_blP}hW602 z50a;OxLBGe^`7l`{5ApVFI&C{D+jcXV-D}%;G#JN)MA}LALgI*c_#AEn*{OBMsS2) z@tL>Q@EOxgbLNi81dAfriZr+*(-=WY6Qfp=AAIpZ#6vfiulmK~Z=ajA<8Ghhh?V%B z`;$O3FxhHh`*Vl5@NuGGU;`(bLDovI>-OXK6wl_dp&-OsaZ#}DOx|ih!5%V?2p(?> zu7~A((x`$xZ}Dr9?_PXXGU%i~`}3L))e9?#ZJl|!_K5@qpwHO2j&6B@c&C)X&xkvJ zG^lk=bshlwEvn&}S^uE17oR#9A2X=4_{Gp3L>SO^?|0YEQmoEB#om)WZd#k-y!Hw; z8zQpv2i`eu)eaigg&Gy}ym=hwIr0c9P3dsNHUi|@X1^UQk{Gu z|Iz;zV<_}nDf6k>M2`zMnh0x7GOO^{pe|ay&MGg|Glipma5qF#&hGBOvQTymttInXf3rQm2($DzCrkSIGvPd1KaUufr(mGNrbt!eNTO%{=@m1 zXteQBa1#H$br!~)NrvyYJ=1#ZgZd4#hs1KZ#;p^PL8r#o-D`jgO9PU`8^}2Xip6A( zr1CzqKL+_)&R3$e9cu%PqQH}ECJ)FT-}NSOou)o&*p%ZHb2zvPHk8&JdD>Tn++cW0 z11fMq@_1njBGXjJpJ)VFFp*t^U|;;c_N=>F!j5IF8P~3LvM_JNb-$Et!XEhFsGHOj zsg{VufK@&?GN6pvU86Ih-wC6~OdV4#6_|IIs&sE5b25*R{S8?Dg4V~@UmKa~?7-=ME zBjl&?+mq1^064PH{?|CfT&SW9jc$IAU56dKHZ$x>2^|bni?}ZK+@(Uj7@h^p^#!oB zyv9I3wtc{X5#JB9Yb6_R+@>;Lo#dD6&!Mn9z5XwsBiHSS%1%E zagxVp56Ub@{3mYw6Fpc6pu%@Af+EzW&F6n$;-h562B37iL=qDKPP)$P;-1rd=}p4@ z&UiabqVaWWM>7xGF;Y5{nh#^r=yD^jKjSQ(p(~R! zy>i+Zo}~cV6T)KMM0)yT8@QR)8yBj7funDte;qr4QceESL?r%cQ_KF%csL(BBR*f; z&El(uZX_k4ZIPft89W>%HhJB&RoxxnSWkk9@TP-GgVG}W`0gw;TUjNsnL~?XC?%aVO&!%A|R}_s}#TF8@ZTUR&W`V z5|4Zgve4U&d+Mx|;O~5sp5v>A3ua`;oSF9*L(k>$0c?_*o{O*Yz%e{+_{>bpG7h@gE>T6*S#05fC;>Ugo{fNCt) zF$=}l)1J?iiQCcu*86i-qzYU`MT!E6Ut0|+Xhl+Cr7|`Dqs%85oi12DIKASs-8<1oDcMcKaE>{Rr?)DkUz~)In%#OYg6T*mp4|p`DFMX4r+`sxTb2R z57E>DI+%0YfYvK=+zvJ#%)=?Ce%7?>kjW7Y%K{Ib$jVlXit*ds3YMeru!3eua#VB3 zo6tH9*D4;CMID-6t6&KF_eEIgiASP`6kwbtM{$HB3d-*%{L=pKF&Pg6vWAWla@1vouW zb_Ctgdn}=u1uSc<{X8PYZ0Hh;*=DFF!}gWz?Z8LAoHFu63wFWT>8vP`Un5(NYt&%b0E2CTH?}A%2NL zZQrA6CgKj-ucM?vZ|~$e8<@)K-)8L$^V|%M#>9H@S%|2%)SKQ=*)xPxUybSIO>9jI zBvAeYulUZd2S!m}tNMYbXilMIKMc(Y zG|nv(#w1OCEGHG0`Mut?bLr|N7(ncWdvtAF-~xZzw7avJuQjYTg(RVL=aeQdy8D%U z$RFj6^u2r9$QMO@v2)AM>yIi+j!^SsU8Q14?s&A@(_2b^itI6cq8Y+Z0S2zOwwgss z8*!KShUwqreitMOjSp!VbL`xu&+&L2l^c+l%PzdHn%VU7nnde;twTQ6sorQaB8V5E zNBQiCp5xBp6Bhq^q7@T5iw@ZPB{gazw2nW8<4kqf+1F~6}4_qko3i~ zVd1|bP>~<7GlB?3qZ?}EY)o1-Na(Bfr=8EUNUM}T&Vx}wPvw<%3DbwtD>z#LKz~E= z^%c}sal*4RJBL+Mi99`vx%bCTj&ojR{hjzi?3!kR1c+JE>q6PDEkyW3<$m*~-R;iF z+#B9YGEb3ZK9SO8&F}KxaBaeX`EQb2<4@vz z>1XF@7`n*6WB;F$&A+utKSGPU51JYjWPPKYJPKK<+yb;ZLKq&?PEg_75Tp*2=pP2t zsU2POt-g77;mN846Vr@8&@5tv&)2XVZ8f!Uqaj=AMi_8Vd&y=j1T?V_C;UYTn>2ryc!h3de5GpQ>uKa3KD2#GBKzrZyb)d zS(-Wc^;+6cp%pERsia_~d42a0FqW2slu;aSkXCD@=Y#U?54vTb4qKx$GkIz97o@*# z1(7CLz}$|6J()30;|5)=X?nY|IN!K?dbmt07!kd8r7K@m}u=HIFF3s*q1gupKj87kJg5HF*(gPNx$-{13 zOC@?*%GHwfRvmNm6`>7Q=2YK}TZS|l)D=F%T=YS~>9(&ST+6f?sl zYPLgQSzw^)2bVZ-a;$gLB4des-$C2B%T4&_J6P9YKjB!fQhP3b zTAR?AJb6}p3Y2Q&eRKxJW_x!Bz7xE;W&^WI3e+Pz>0eU8?}jvpVkLXg|-{Y z^h0fO{UJC034H&J-DHp07Tsw)iEWAT8>@ZHd{= z7oF%ShMK#NH@oV5_ihAo)u-0&9ha2Ax1}s&Fo{DNG@sY-`QAIvQ8Pw34DUQ5i{%JY z7Z-N{Aa0(wY>sF0Y#1KuzHT<4X4bKu-#pm)cwaXY_7>{u{mo|3p`teKzQ<=Xp|4R} zNT!y0G2dWW$VT?`%*$~G@3TsHy>pxV7X8=6e@tcZtb7KR9@LHR(;f4Y@9$kH^firx zv`NFCZEq;Nvm^y9HrAp#WCZ>qfd3K5kwY&k7O|8e{VmST5`{)G#DYR?@-`dS8sOgg z?LUZi7!r&60zb-$W<-oQPHr@nXDavV2g-{*`59e9fqJ-occJ-qreeb4cyv*k(Kzf^S^sBfOw?m=EA^njb z7mU`5_awGQ{}xL6zWK38C*N4u)U)7I|459W<06yBiIXSkA~xZ+oxS}+Ag^L%wVEbH zeeO6hul1cyp&?KbrlSO9_BENku0f{8CHx#Fp)8anPLkmt6EX7l3BVpGbk8@Y~1I&6fO-p*#9Hj+fFSLwd1==S|9m-z?u{PkD-nfUj8Q13@s!e?QNsea;ZPTRla?t9}LOW;Bi$lA8W5N0)!m87Axm{N0@!@*NmU< ze56lO&C+;12S{%Hvnfg~nr%h@Y$Xtq#R7xr=`^v;R0% z_=FgDwR(FHiW?HogEjQC|5h#Z+P&x^I%yrET55ki2`xhKn*7LOVTM)KjknJjwxuqF++{=1hvvjnCY-Y(P;!j>##VDPBl`Bk9N1Cp_45_pv0q^csft zF;*w(_R*ir7ko(1w70_1^?5B-^=nEFJbQ1pdj&KY-aRJj(YmVLdZGTL+_8Dp4yF4Q z2As<8>jr+RSuj)ubl5X}Z8A*)v8oQUa)qHkRYa1k!I3zg6cBEd-Z1ax>9cj|a36#p zp47_?e&m4i9%wr>>U|(;37dP%bqC4P?C1eIjR(_Hu?51)D94GMCO-P*A_j|Na~dRVrJ{}-BmL1IS-Wc;okHdEDyL^5WJK0vL@k)whzd}2!js*sh->T;xL_n%#^alaU zX9GKeB|G)XBo&VlD_YDV$fhrG#A?mO7_*b;;WrYk zJZ*C|BUIK;9%JQ*M?!~oLmuH0&@r$q&`=0(9=5i2HkrORqn7?8=<(2TB%ei$vvbt$ z4osxBFvzn(leY)(H~;Mf{wHhwE86`Z80(Li&SsvPlI!FD&|OD9B=)57M>MfCJ;|^c zD@$;&B43SRw3^_CKl~Ikjysu#@rrs?Tu-SKL<{^Li!t6l!x>`V4a)c)J$k%7ISL}M4qrT9VDp`B0Lt; zczJxjLcq%)RtmjrY5U3w{XCgU8l?8K{I_80xg}lek17h>(|m469Sus)_W^3a!&@?b zTDy@OxSJ$jjO`eC z`+-vfp!A(1PR$?l17>5iU)`qz>5a1xT>;HfTtV{dNY`4+Tq8U+z(9mTzAERxQ}_&= zp|RhztqhI%r)e*a$Ao| z*0DUZuQ20PT*2N9zLUwHnbUk;9u5Q&F*pDZ>gkNZLv9OqX&&J{Xig~_q^_jWZBrGf zymSfVFD1v~zAD-v4>`P?Y5?CCGHbk$&Z5&r9{}2Xj|tswG^_ZV2`eOXJ%SnHD=l>^cFhoouyW#yI9nn+z9Eo%_vg~s6rGM8lz~WiPK|L-vO==xo z!GEPd=hn+)74IPgS=C!ZxB4Xar;7MszBhUgQ zPDxDf+j>P^M|^mwizGAQ+i&HKev|={S9(gk8E2We=XtjyGTj0d5=7~#Grk%k2lVMM z4Gf4)_KsZ1z+T;kC9k1LoZk5us1Or2iI(7h_z&G9+IheoT>@c3vvm0fuXYooR=?OJ{)@H! zTgv}``Xw74v{{4BswRcxhV)7?dmPGDDcqxhtM8saTV`(@J_6)mm8}Z1JD@}r)js_8 z?OG+fu~Ifz689=kDW=>#ZExquKN+)muB;9jChWyMrm|P4u1=9~A4Z1r!*IL&{wLPD z1*uNewRLu5Rxa3`O+cGEPTUdwjop(XH3toKw#37UOr~G__l6tKbScIAuPV@gyD|3< z@84-59RwYeIy>Jt^kc>Qz>zTg>B|pzhxbG+AFEuN}_q5x*%l z`{-YxO*#RUC%tq{(2kvsnn5n;3Y0sKwD+nU7@w`>ImWU9E9Vv{n@8OjwKoKz_IyCC z`~+m@ww7tZ5LMOA8`cE7BzR2G)i>secp-vT=e3 zs)Y8|(zH0z=YWqY7E0Je`gxZcFkQgp78R{Pyqk-{%R-R!cd)D=(z%cEr1~87l&!7S zY@_s{rVqIwi?gRl$wi0H*YJ1va}OVqT>y zcOS2L)6wCPV4!gvaA9RU&?~N+LGfa5Fy`g!lW=P6ta4Ok4ljLTp6r(_EP;Zz|6OeV zKl?s-__euZ`cK)L(IUbI3Tl0K$ybRelWhK?4+D_3Hu)Ly6(6IPyv9c`Z|V&{JW=CuDof0;YaIA-p`=6 z4@N%^qBUOfty%tc6R&Ung9P-Mjeq;oA5@q?+vu|nhscG`L|Uw?X-IaU2h0$wsrubH z^BwcZ!)r|ChH1Igl#SkTfi-=joS3A8+xr?!+XvqHOJpagmPO5L0YWDH|d}CC?jI*nGEqJO)a{w5kkqF8~(ib})*ZxTYuN(-$81gsDu|9I6 z;1A6RL_X3g*X-s^C!&I??s?n5E?O3;gbfQ&2#BrOAbsHX{-wOQ`!PqMd2+4hL;mko zf>YQv+rUIXZ|>I6o)WcC3~T|`dv4*=Fa-^sVae(F5hkJcUpT;+0la{M_}@N!`onj> z!Mhhn)@Sy&JK#T$!2iANEdLJSrvd?YO`hpT>Z_`5=g%$(kY>*AfRASpOq&%{W^hN@ zy*o|xe4->wgYg1UCJH(xzdvN@XzgU6Vq(LdtpB#JYYc6On@g8O>8_9~g-^^!NoP0>M9vDCH`1;-j%h(8M+ z8DCMx$SfR@W{hF}hGDWpm};}a{Pwz5c;yW=8fJm*mwhhI*9)XLB9n2MKB*_P^V9!Y zP1A`Z{^}HTdgn(%ss0FXn`RJyn90rOezOQjUf$VIE(P|yx@J=C)_0`U@JiTlO!wrV z$m`b{`d{|1(E!CXQ+1nkz%risY^*c}wqM^_N_%7UcEG@w-+D+Zw=jIJ zF5o$~uxzDm{8zs8$GZFvup-!v3WE%%FkY5Up1l*I@jja5f<5_;$|ytW*35K-awX>A z9p2j~nJ2Zcpr3IPfz-T~GVl6?5IN~L@$#ZRepiuT&=tsUqH+gA?_djGs`t>08HfDH zAy)rv#xw2G+wb0WB5R=ZJEaR1G(W3K4DG2D^ZpKh35x&F_cluC$cP)Bea*U=sqP*v zAugP!{*XN(t2mw`$GpHYZO3O3OVqY6EJK|?OM3spK8LZJt7E|%D#h3Ok1PrC~mq~r5T9OLD#=yfi5og zRN%w$gK{wEIub=YD{tr5oYpB$^DIEK0>n}?wt|5zkYZFNI%TN0jralpb*LoJWY_Mj zVd|1|6DMP=mul^R+e9?I2kvv*!s91OJK33Mv^0WUTUUO>5Su}+<++2N6*z2VTgVWKauSR)dPUENWyw*jr;51_bsSU9^xsxA zS6OZeoR1CK){phy&7KN`pDi{NNiW2KyQp4ERF_@2Z_Nmiu%Lsc!}(mE$7gCP)Ol}T zCwuUg{_XzCzvAuxIax3fK}`FJFY#=)kuQw$dX0$u-Ep)91At4!DpTR7h%R9$&1<_t zml*8K{2|C#ECMywTUbSK-O+CrGuI&^kICECJg8N)JI81oaV12wUkAlP9!hEPIM-O* zH*)NEBNHJa*e&FDjs5MXXm$xP&z6DQyAE2QtR&ITN+T$o8C#b0^tDvS-(7rKDNH&N%Qcl1evfuG)7M}{{WG8TS3UPXjVt-}HrrR7MmnAM?-If!EcR-e z`9#;JObcc)b6BH3v?>vgHwTmtK`|jg(t*qEn^c}ci^UbpQdV}eC96915*Ta%b&(pK zZ5hbLcf$BV#$Bs`@gDXUb~$wU8+WFhAH_i4fxc`Bpxxj zQN+ZLl*(4nuAI+JN@Kus(T>_M*392{xO;tOs^xCDv^#HUVZ1d&I6e5PI4(hksyiON z5%cN3nk9jJasGlqA!v=rzw%LzWF;Q^Ud_PLqumBTh6G))8ek~$4q--}uByATVcyg~ zoDTRqFH||XxQ485`0Fcmyy)*g5_&EluX>i|wp8E?)VL_=Af5-xd;HpUHnIYQ+MsbV zC1w6c4(DIa$^ZDVlL#T{G5*9&-K27jq;cTQRhEL=fK@?jQg=LmabDG0vGanoDEWCI zL{g&zKT$nrJEDG?X(SGIO~gyi!z^IJ$fGlxjlwG(eQ`FE4SiU9|B9cK4rfU7S7c{S zDX;nj>(YsU zkxEm1f`PA@*YepF-2B0n;G+L2pZSaU!`tpN+*P})pD&#&7aK->Y30M~M)xjE}0 z;<+Hc&wMJ@nva0}s!dlDYF$nQWQC(f{FH(kM9QJhpC9|w-)NuVfhxeyI-;-5rttrV zNxD&ENTm{m-D(1fu3Q49;{^~&!(Xa|ypXB6E#rYC=lwWsqV$pRM<4l$(GNbZRvksE zDkD7X^YH(qjJ#k*UIxI3 zVhLz>fh$k?zLE5tWmx1VPQ`$zXs z1RmT!e8l+8yM5XHj|fvRZZFXlWclGC9{b9Sb>lJVYd*-Tc5e}6>Hn%G%W>{Y6#joY z@y!@jX1=}D5`f*RegO4{>z;GB`fnuFh1{3wPa8#jLix@b#4-S;tZzM^qY07okeSJz*YVkzcS{STWPNb3M>!b;`$>|-=UIu+#794@E zmissVuR#hd-5YP+0EaTJzrFC0_@Lo1B;*ZVU7AMIRQr#%PT{N>W|tIGve!_Md|BDF zEF{_WJzILif?C`VH_vu;ikhWWGRCX{*QZS4$e028mt#XH#)o6}gL;boQ5#;AuJ-ng z?YZe!otH(74x`&rxurWdU(;o9Uu6^BsUtnVH z;aiNJ4+h)_I^|2=sk_y+pK{KDxPOV3wv{F}Tp0l#T+&bj68Z*rs*NDt26uDk|6=W} zquOe_?a`veU0U3=Sh3<>pjd$d#f!VU1lIz^T~b_&yChhFmKJw+cZU#i^PclN_kLf$ z_l{$~e;8x$Bzus(SJtzhx#pZpfB>%Bk}8r1F|SI^qd;Ne7t5%L4`+(=VOLDIS}>1D zV&P&XRfd*20YPeyWBrcN@RJZh& zl4eMuYFF?ck7jbP(%|WBWU-Y6-Q%umE6bx-m(4OV{9*I3uY()QFO_No+w^T3Bi4+| zFo!vF`^;7TwLsa4eunaF7yVTO<3HB6!AeO%?-bdh%pVckaEN~mA^PP;Q(AOAVLz9W zM3R!M;(8$5(PA8b)XlX}oPcm?2yobh;;;kabSE&JW<;CscoK!dtCXv+lDs-P5Rvb- zhfF3Xqh0$x>Yy)DdzD_-5(=T3fM~fc>i6qPL5v!Q!w&Ft&4DT%0F2=NT66TuDW1}F zz8dQyvs~(=n%)yp8t?s2;}F5Nn~PKF7w^gJu@A-zpNni}4}N)=JeF~wQwtNHHj}F` z5CFc6?F~vL>#yO%G*vp!koocbo@Hb3F(dR7klMA2>XQEG z)1I8GsW05bXy7qwu#;iYZdKO(RnAl-{|)aZe9NHe-bcbtA&x+eI$&WIfxlqETz7HiIT>;UIfYpP9vg%A^pR zkN1i@m{3iH>Z}|6^#_XQuStedf}W+BF%;CF>D8K*nV+6m=b0*rX^biyR0ouG%>QQM zTD=8aev{FFS|)ScKp-NmyE>8k>a~%bAQ~DW z;NW7}x5$Jp`Uc~>1?i@&k;2bCz=t=jpqe{jWEc(B81V)*qMsRQ7;lNn%okbYhAkE|&W_iW{T$%7d3{TBZ9b8G&ZRES|@G#kGOuKX#}_ADx4wxhNxN>4v^ zNdwU%D#xj3*+j>=aG;9G6DFa_HuWnk8N4xy2`Lll-vLDW-D1U$*cgYk|K3)Y8^CnogV6 zyKi@BG0T#D3)}WQ)Co)^7bO;;pNATI$UCHoPz@S~dxLgA_+a%0F|pee$V9m_u8Y))iTbA0t%3Ax6!i>Q`}8SP%Fo#RSj1L)f#PQWzL4T7%h zuXiCmL#8h_jTPIL+DLAQ7!d=X!a~zoy?zbcuvZ^3>e=&{z}Z^EY3^Fn#5dQitYWuf zciaxUxkD+y)bBELqlF#*__;67826>yxWXc#YtBm&lMccwA+^Bperi!=lS?%|=9*24 zGu@!y>q-IzT`gOI_Nvi^L}Xr@ZKW|`=wWHNhX6gm+UVDq3iq| zFAKxd5T;Gh=7}3)`!49F^>bQBR`ub2f?y(WzvPJGXR365P9N6F3~_L`L%Vgs`%f#I zx%y>ZGWz(aN9iG3?_aFQ!CFtKlkpQ@mOngjcb4Br3?dikk$q!JjGt2WS;AQ0F zx2~PgDc?zDh+;T?M>e^KR@MaBAXGgwo8Z~6_9rI>#Gsv>>QTKvf1Ce|Lj0FrbvDLF zoBNgzFNOiyGD9Ox{*wk`z0D3LyUIlE`p(HiYT=yoo*s3JK!OE4W?8Vm%4p>t`*28L z^S&*@ODgJ6HKMY`sC!RqU*~a5&)2?!?7)J6$&s++C?z7qsWZVY8M^Y0^~uIe%or!L zz%R=1;8Qr1KsHGpCv^1vI>0H?R5(^IsK=kw06RTSD)V}E7eVT5xz(4 ze^h5z$z(tzj!BD;`hi-+Tf#zIJL6+Y)~gq7`4;x+tOfq@Pg%ZL#T`ey2a=}D+5Z(p(?|eh=ADKn| z+=)=}GB_*l+g_ES(kDv*R@l6{1Fzgt}uMtKNj0+HLDci7~xF05&Ire92tu zkpiGk_W3@4d&5dqvr~Li)le8zeh@Zjk|?$Vo`kWi1++T^lpRlFFihMKTo~Lz zx*061$E6C_(r+=Nq{m5$IBfPTI}l27{Lz_%Jsd#i+x2yn-TaOPfJWUnZs59dr8(Rz zqaX9@z{k)>tJ_wa!_;^25<;Ps zylm8ftZ(nzpqMnYi=0~WG z!=vcQ0}binr!{tn-DxDI=ZVN(x=s3`3_PTwPr21;oMSjLI(uYI6ntLFi5xa+1^3cD zDQZjRQcehcKvUd?GqbA&SHxq`m9^Lf{ps-DOgYn8J@zVW%O&C-Uwx$fuBjJcj<=bv zZCwZ)eUMspLM|M}v3SQ)D`mHEpE%EhhMz?}ce;UX-I4178`~6qVbNn>%R>T-m6TDt zS4@>PetP91hQMKV-d3gL*2z!7T*WK1AM{z>+7&6Sj#1*P;QL^?KZ@c%?&W{!a7~_&^%uGXnf%VNgKKgfaKX_WP-!I`l`PipH6PK>gBNgxI}SzwkZj8{d6cSr}*vN!tZyf{HUWTB2R!x;Z5X5H?i{_M4B zx5w{-Xv8oMUFTiA_>e&Ly_#=#j2;hcAJ zlV`u5nRM3{*_}pF;JVds$>J^;}qxM1RkPa{Sv|fm7>F;u{1#b$;dxw?N0n*yypEvg6I-dWFcJa7=3C?Y9Hf zg~Bp-Bj}G7nAP3!4mbhaG5+=>;sVF%7q82P|4i=0ndP{ukaEUh$iX>Y2^Mty*+vHU ztS(YuOqET^vbp`D(-ET9EFZ_xsKF3c>EL^vO(DwpkK}dkGfw0BNQkJK=l@MXz~2^i z-rZ=8#Uvy|H^h?fPdoe8kQlZ^A5p&@FO=*TCag%majKP|-SSBP9`K@zh17kCbTWx) zVmv_9*utSao5g>2%EC+9#5ivM40^`;V^Nj-Rzgw|@4We2c{mMSbu}ARz;}(g%(2%j zrKHnEpSMYtQ{b6>e~({ z*>izr5B?OpGW8-@-e^zZD`V%_M}F^LrjM6JH4A=rG}z;Ajjvcdb)PHUfP9k{-4^~u(*I9JF8?PMYe^6=o>j|5`urK2 zsggg5ibp?fj2vkj_oOytj6puXl@yfLG6~TvnPMhE3JThKqN$ zAGK#8qR3O`l~;5P@&TGu;Wd$%0XXkMiG^&Li8>{+ve2w&f5mdWA!_Xv_Rt;_EIv-o ztNUV6Q-EhI(_-&O)Ek6@=wI^<4LLx5i(Z1a{@H5j1ykfzZpARk3emjf=jJo}oFSz+ zIokeFyWAwopDD7!fEM@ILc^Hy?>e$8lcYzl7GM=CMx3n53=vcB+3X)}-PUu{R}TiW zC#Hf+sd-rWn3_>>ib6gW~@JqWxT9zo1Iv`5N3lhEsk30MR zkPJ_SFo-!@c}r2rD@28u83857ceI~4_spDOUjnAA086v#ypi}di)IKSR0Z=}M@g3# zoM>GHpwy9=cqkCdqUo%82;Dghunb#U@sSuh7bg$XR zM{^XV9eML=Mi=1TC4Vj!YaphCt{VBloq)QY`FVY{? zGhe{r_d%m9NoWMyFydos+O>^hTol$jtMZ^Hlr3$et`RVS)CI?4xDAJiwux-?)iuT+t3{18z1tc6(rORign5kHSJ<)wE^ zo@yB5HX)Hs1S((nESDvEUTCp zK~ixOv{EIt_TC9wP(SYHnX;Soaf= zLrbo_l>HlkhbDm$1+GViq)TGD3aZ16>M61%Mmqb=pq`Zvbqh#0R;m3>(9qt}{7nP| z;O<87uJIuKQ%}s`^|92t8vxO6H(|7^$LiWAy(QV~Sk*Xbcy%K8(Qjy4r ze5w7yprB(a_a)PXro?)oGda_WJ@ZnaIZOf8K|%Ukg@PkvGCBaR$tH|V?tAMDWzciww=v%Xm27eP_Gm6W?!ar7H*&(f8~ht zl({?IbzMopUMUjitQY?eF90St8Ku?1Fxx#=FMq4hxcoQf7w^8gppjL;jx%9T4vCZx zr`OOL48nZJZYNyQ#g4c@u7XBjW3LU2&;U%V8czM)@uLD)`-?mOnY4DpsaEhw<0GO9 z|JD8(W@xn0WbvlA=8IdYqEe{mHPJ=^Z$2K>ql$LY^EE?eYvo}}g+J4?kE(;1Z#$xQ z^Bp?0Y6frV$OBEe792W_Nx9nJMnQFvaO#Jw9K^|gcWnm3$ANM~+)xtO3%364Z>7IB zOsq4jD+@#h)*W4yuuG-~c7%=|Tm}}xa5tdsA}6y8U9B0z5Rb&~P10L#9BibML%Vb_ zcHt+2;+28VwFe)3z|WVR{I%Qc)0lxxiYt!r$&;{a(DUV!rz(|57+6YNkgnEK9B6f+ zo87(8c6)f)@Zj~y<4O=BwimG7@N@gp7yimx?ncAIqw&31ndU}aK*u~V``Tz-^}Njp zHU~UR)Kz7s{`Zgj2RL#8r@=^-I?H>fZYwofuCq5=ZVsH4g&2VbJ4ImvumDAtV|iDqAYU z+28H)>%$UX{X)BGDJ3Em^+#g}wX#;~ zLPt`>*Y0mGgiqvIK0U_@yIc~0X2^6~c&N**gUz0fgDxsgNYttl?2AVq#dX?hq`EkCFaB`9FjPBhc%yxJe{|aYF5dA9 z0@c2?TK=SsQ7>UfNDpkfx97WkD?v@}aQgG2(^!X~O;lAp{j&9SvxzvnF#hkBP5fJ* z0i?j+g8Q&gfhFprkxuu(ozzW8r^}6%LkKP#P;2>XN`EL^80{=U@KFhKKY)U3P!N2`Gz`mZ{j}6LfO(LD+-Rp`_(aBNA+ciX& z<6;002|tQN`k!En6GuO{4~2znp6)iCa@{ZK`+uSOJosH4CQE%IzxnI<0@9ik8|gf9 zpR#Hu>zjLL!=droL9m$SuJrqF8Zi#M)XO*DK59F;EZ_M}aOfBLNpwO#i$40PKXcX_ z1!I{=1WGf>pHoL391TyRuBf!Wj29@{u+5k=Xp)B4!f{baD|M~s$N^=SDv2)*Jv^{Y zB*E5|*1MGa>m{o_verY{OLponYKKV%WSiRx*uQqAD8(7F8MH1uRTvY~JQk3%T>GNY zSGa);VxgmLM_$NJ#trRSQ~z3pW9TVzyIxw{`xM1 z#RDI5v;+S=?lz?cdGxJEp*Hq!jY~ApV41Q|93)*?0NfC)%`KH%PX~6U-dD?$2X7M+ za+Z&PPyZoJcf^gRGg2K2J^_rgiSL)P{lDA{ZknzJZfv^n1T^G#9Pj2rbs?(aW&Se| zm=yfMHvzL^+P2*OOd&(NdLKAT07l~3P_ezso865e0p|Xvs^8~QyKaT2Qn|ApSO-Fo{PE zGM&gDyS7Z}B?+U&eAPI~qtnWqDzrc)8v{xZK5!JChE$=@cHg35)}ztup@h+y!-? z>#8z2=CL(97JzV$Lf^h<3Jy}q)QGyr1IqZez-I%H-ugv}Rn}6Y?5iuB@?I7s*E+qU z!(-uZ2nx%}(*zD+rMd`F0(k8eoVjPZ(6e>sT1;ti`-dt^EB9NL>FH!HGUl&2Cjc!mi)6Lwa-~H6k01RVQ}Quo&78tyP_&9uN$r^nNUo;Nj3&iGu!OcHB z98!DHYE`h&&*g_(s4o=Sx$hq^!{l9ad7l~o+@0PiE^=ty?0l{hhTA@Sf3^!a-h~CM z^Dg7Zw{nS6!FQm+kVMIfF4No1wKq%z-tW;n&s;^%sN=+`=*(&cH>HYuTqLZK1K8l1 zq~Y|t%vSv3Io^Kbx%Zg0b0;oYupBvVB8(NDiX*-Q3HrH-xM10{K5P?y54Q-_IyM zX1?qvH}N$GrT9CM+tPzbEv0h+j!JX)(|S8hq)sdJxJnsgjcht%f$Sh(7o-k!~#Z~$FgHT3PpLztVg2>5gF)dOFj?82t8{EeT0YFM*&}R>}0%5~|%T zQw77QiP2{V z(a-$G#C$jBj#U`X+Q82pY@Oy_pf4FAKEl2(4rl9hbfCfCuJMX+cVc@t7dz7@oQRK9?q18dH#;ME zYqwuT`f_!;ME>o9F4S`||8PONzb-fn{p94x_16WvI#1`OLq0L1%&Z^QQ^+$fR5Q8+ z4q|hhm~yia_s4XY*x=7Lx&+EC`yT{UxQI!Rj#QPd*iJH0zGeXm$j!pxb<$(=kH0(J zK>68o5IT)CxMNr3t($E**6Gd^9b9;w)9*dc)KPmc$LU{4h@88_K47Vl8W95Sqo3~YF7i@7)Gf&Tev>90YI{ns@kJ;pY=i@PEaZUi>K#Jx;s z@Q4^w$J%&Syv1UEK-IYe+TxG48!RS`!<{NFTw2FbF;WynuQqg%(4^32x5iJh6@L}S zaQY)ADCDuP_34$rUa9l}KU%+>RQJafk1wQ+3M*F9?F<@8y&pLx(ME35gj0w7TurP= z&TBG`^PSMH;Y{oSi#~zV0MEVLx}kmI>*Gy4x~V`pC~;it=_~|$;hM3KqSL+OIBL+P zv;dqqpVp&)S5zX74qK4T?{7E|>*wL1UYx7V4gI>gM2kk#9>0w>&?etpnG`y^sDj=b zZV2kz5nMVTBc|bdvD&HAvU`;&nB?lT^sC>MpHJx<{W*46rmHV@@ZjM!!{$2~B!spd zU&aj8zuDOQckuwPJjq3!qbkKPm_1RweoOc@2CS(lzgDe>(hD}TA?(Sjob6$}Z7MaZ zp)#cu2IDMQxfnAoQ^20>`eb>vF^qS^>t-?z*IwJQM!m}XTn?t0AZ-V@5J42&<4;*k zR>PL@-&rJbmC5(29yzfdbZ&jg??4#zTG#QincD_%D*m+0Bl6_)KH_y@?7$Ug7g>Ts zB2MSHC_U4fbCU#Op0OXjLy54dH3XvlTz-fX0pBk7n{xggB!7a5$PSz7;u`3c`j=4q zMwg(>P@>gx)J?1nP(8f`hk7sSBuDQ=WQ|4gBOgwM2_J2SIe$;1#4s4t5H4*XL3HwL z=@(2Oo^nj?jQ;f_K$gd3KA;`S83z0HW0#AfyT9rw{lqZdM`clDAsYSTUH*umoTdBp zv}d(#btGbDQ;6}YH+pZVWjY3)01@-k@m!H&M^!XoW0zw~Oh_oewnmx) zG1@ONZ$`|Ld4dPwglq0iet;|#%;T75E<6 z(q@Cuy-F?#&F*^oeVx_xzsCel{18D7*)9pf7Q8^KS}FHM#t{Diy?oj*#NhmVD-?b2pohHSNr2lv~d&Hb={Qw%pV zv4TRz7ZoAw^mN|ThS(<&B^peiwyGe{7HNXoL2<~#Cf-SQD%gJ$Z9?bUDCt`_Jl{i^ z9~2YRUd4$g_=%V8uRmPVSy`BLe!eoEx5z z-hM7k)7Ow@yG((F%rsaHtcxe{+sSHr4GP*`xa0nN>%k^_e@!FJ^zAnVDlJEcJX~45 z)XZSHD6T~$h{0*=~5UgIok6Iv)4Q!(Jm67d?RSF_Ra@7l7>hY4@Fk>0!ygjSm`ZU-M>=^TtbR zB$EH9lV=*~>cDk?gIdN9q8q!tp7+8LPy_+s5u|l|+p@Rwm2M)i)%buA?+KCx3zl=?X|v(P`<_;@w+vie_0KtWmgx_0-HE!hQ;d5Ar)0e)20V0uX9T|k z1@5zCxgZiy|bI-hkD!1 z;b%a-scE_}WJ8C}r!PamE`YziG~6q|v-OFTmS#_>ojuC^Fy|*-VAo92=SrzPM?KhZ zI*wG36OAbBQDzq}0wJJzf$h|^tIT&67CVmrHfhpu_aiKn_b zTE5+?ed^C)h0jTBF@Ol6Audohhuw)c$-K+p9wm2nZ5<l=p+=7`9Nj8Q)#L(iGVS$gwC5Iw#kp8cPS`*q{ zgb~IZY;AW+*L!F&lf<7~guJ9lVWBt)fW)f#0YG&xSU;9V^0VJbl3*Ncg`ewyGFOPs8Gm zQU3~{UlMZLBzt7+@hxt%Hl_v38ecgWUpFw}BlAUSZA_cQyX)6kFze_7VU-8bvu17k zf;+|$pK`O@8xAT=br`o84BzRZ&F!C@)438F2Y<>t(8_%-_q3GfV}TLk;#T2V^aYVJ ziNh)ZH0h2*3=WO9TYQNjLx+;eTDo3iRSC^>haJUH1JsHpMX#?`TGp>O0|djaHJDE8 zpM0B~a*W)r$GGVvbR-181ITywch~2WQd>OADT3-lr)HW#_ zp~S2la;fXR)eP2{U&DUTK_KD27ML-<>lx>|ddH!U_x!i#@2jhJuLv&G_T4I~WLLDo zW56PA&P9{URigO{$cNdv3-W7W7l8Vu6W4dD7ybgDv}Rwm_*2N2qy&%<GJpc4GHV*8c5w;oq=C|5#)G)59f7WP8m6 zGQ+x;KkgS-iv_foxL%;`xA_R-*PMQDt{IO@GjdN>P=lnX=pT`fq3j2P^Gv{D!0{n| z2hwn4L3_}47Ao}fEcV&!(^0)U?%mOXy5{mspSW&e?0P>9UOI`STbVaB8XnhU6g?n} z{71hXGoiREwPPRN&>PSewYmsWRvl}$^pn~zuIXqUxjYTra;c-|b0-jw(a9mO zR*6Q^+eMpwjYa#V-Fi8RDp~{UmWaW1O@#fk=<=~c)vaDFK;QU^BU7u?o(^pfm%htn(QnF{bR5Z8%NlZ1hx38>o1v5Ca)r2UVwt4kJXhQ|LPKc1$)kL6y)kE2g7VdF^-`2k7mjryjtbK z9m9;hLB2IT{oE_avt0vWR~4UDOAiu|mCa!vz|f0z7#`t#zL9M{l&f8Q`kt;;!Iy!b zNzkG4@#oGrE1c(vpCv3u)_nmdUaNo$@)xD2Jd{p7hg4DYpG8@pPvNAnR|S&r{_=FKB(QH&r-Rka+Jn zSc;0ZX0^KjU0Q3H%1b#b9kMIFT(#$P=k@?DO8YuUZhNpExM=fS7LSv0ZpS^sSo~R- zI9^gC{qOtc!Hd$8{8LG!HV?XfdS-x@<0~Yl6K0n7q-1?Z2V?$*RwE^jvdeQ@gy&V? zY#n=glsFg={YqZiQk}P|E*F3uH7J8gQ*V5bPS4-@!6}pNS#mI9^Ubxz_H{PBg!tTN zR7R!l3ydppCHH6xo>OJ}E8Bh#FCi`OVWI4;&Jj(yY5!&TuSUc^ zo|?et*KzVOee@WR>zWaQV*bMv7$g*)*aOiF(1@WJ!@KiCg)lyb)I<%%=FXY?Pom;%QoFZ4L~&|1)DK zYH!4W^;RTnZMG9J*Sgp4P+<7V_C-3+ z-5Uq-y#6LE#&eI{*VU7xSf9x#_C~K?>Ao>3q*-IVN5|lQ^tsH38`+ZaspE08hdK^@ zlBQNOC7t*?7Q}y(j@c3=iMQOW?(MXaJK6dcFH%O&SDlk4E2*TSw^Sy59*66lJ==py zeTj0m83u%83gxyg4*GFw7vCuxg*^PU_G#%utN~vU7@Ot#87GFG$||S%PA_%JYsKCG6Svl=VjlYH=zy)+1akv z*r73G<@^p1!(g-=C{J1{F?3ALhk@TgY6D>N4>s|MkpvB#RdMD{tHPQh$cHW2d<~)otezI^VMiS;3 zLa+B3q*#87Kc&%|mm+L`N2_ZpsM}Ci>P$6S`R9bQ$NR0q_f&=~rXlmvE2mLIeV|!S zPzbumJ{gy(v{)vV;F;H4+LZigj#QxS$(7sW+afjSbW7e9o&c8L@0nfNj9rrA5<;o| z{2Maq*q5nfs`b*@@zVvf)wmbtvRpwHVekfKOUy)9kd$(A#LFmi{U9s8VCwR@t+x7bdfuUrrm*>m1Y zNN=|r-k9>z?!w&${2r_EP@el~8FVM`bP)jbZVwD`5YiP%NN8mL_W(gF3BvN33$^61 z)>N!~aF7|c-C@KB{-4<|JqQ>HX(hd@R&P*Hz@`pe)=V5T!4TfpRJE(!%6oknnfWhm z6-dE!=%x6e_;2NUAPbsDtAKq~s_rMu#Yz!*l-B`}rDo{uNVh&6Qz6X@>zmFpXlNg4)x-c=q8o}9Z;K3m8fuu4|ym%qbb2eT1>RNGQ`qj_xSf_M|CCp^|o9+AF=7TSvWa8b$ zDpfl&zKqu2Pj^H2(u>FrUd#!Ja9r}9nfx4yi_U48^rbpHxP7412no~>Ge-r2ywLdk zC!4y4boEn0g)vBR4!DG`j7tGHoOQJu`+u7mPtgBj>oPkMiYWfMbR9A$Ob7wJ;9{-* zfYGQNSJ-hdjAA<5GQi&x`rBW-ewFmCD?QzF=^A&bgcJEEdmCGWE&Tn-<>zvq5uBRN zc%GW&>qJbw5;Y!Wzloo+(fMb+)wg6b$aVeYw_FU#_TMsJCe`hq`S|(OJrz8hjj_fC z!l9!btUHDhokvsyE&fP7E85x@uQ|msK1`99af*TX7PjS5o_enWI-}1z2YSPi=;Woj z3F+b1hQJ3*>ofF9^Fg>!>Nf0){^fu)HEDF?RROU7TF+6vz-f>7z%V>WEiG5!9Y*`? z`h6WBAYL&H;h4&tp3_gpAIYSYOj7)Ry`G#1B7WnhW_mTFTZs;s`?MUG(cB}y4$jJ) zB~W49jWHsi?LNz-`J`~MIsYxJzzaC7MBsE=&d4!|;oT$pc4p!XgrBu1%T{DyV3p@- zlNvFa(WqwA?;%`-)u|ZX2>R%#sH0^V{h?s6{f<$GH_pV{Fg3$StLeQLU2?TODZW~@ zCc*p;1mLA>?lo8Puol^C=6Q=N>k2Q6R@3yI-WgEn%s9F|7n_-cRAfi5NG0I!AGUNJ zqtn3{9>alCbjCB_$`<;7%rokOzuh?n`^8J%tQ@}fQ~onn7;32ybsMHnoascC0&Ski zxm*VxL#MpB*OxuNY1sLTaTpj`f)5hEoW@+0cm6EsN`6h9MpNd+_v;{>2Mr-h)sTXC z-mHBvrY71w!(NDx(`i$CU;!jXK>8}@Qps#ObPt$)t0bqqb~xiq9*};_MoNo(XO@|8 zfe)8%z`S+j%sbq%h*y?6^O}ljRREXAefrJ{-<>CAJD*`C%eTYB?ax} z3W0duKi_y~dkUeb(FglQOIj6zt7|8DHW;})!wSDI^^2X*V^B&nAu;$JnEyhf4-6ly~S(+UU zWqrW8|LjMl76bAw)i6@3?`q*UJ-G9umtYw!AB$gK1H$2|mg4c{5dU8A_q(O4d!qA* zoYdQdrQS*B5t_9uPK=i&%8`fiaD?QjFlyFaQS8gzyc6jD_xLVDmg=CeqjV{~X$ZczSXveEZpeL1mVvz>+!VB9G<-2C^`?da%NnL=+;Pbv3hC0ZgjoCAoiH?$H#a>N50{V=ZSsiCFXAs=0`a^gao zPd0Br>s*JENn~x_xr-$A8x|CVSD<};#zg<2*rIhoTbtQ?$DXfg-wA?SIA>JbQdDRG z@%B1(^M;OS)*T zxnGcSW||dZX3%+}s%Ws6^coLUR`js>o_XpsH_e94KE`6={~XP3#YD>}DK8*bkzlrx z_D67D@f4{-YBa3>jS+|JD2M<=^USm?LqWUAjHr0wy^N+6S3Or!ZLJ|bU1Z@UGgf73Z;HQOd#y_XX$))Xe}I_8G5 z;orH&hqvN*cK9Ohn`+Q*uG@HF1_u$ZOlV`eim!n>Y%@IevIc}5KEgffn5Au2%TXx^ z;0Wn@bz`$(l1;qF*h9)AgY0?>x)23sW-}lDAn$&fer&YYNXb&Hp|}242(T$;6YoyO ze_ZBnbo8*8Ane9Jk~P*u40NKItG5-jyp4*-6%q3L=~;*uZMG;_D0pr4(z{wkuN2I& z7NW)%I(o=cYZ}1+jJC@fmFl{CY0&!W_*sok*dtbNde#6=ur&fdFrtMAQRcpX^-=LV zXy?fBmfV{D_?<1d&l~x0X8jz}%Y|ZImZd9e;IC~W5@K!uoR4{f{3s2UMtsL0#>Wng z6?3c0<+$K}ts@rlf^~!hXwjg!#3gU*IsU3*n|t(cyF|C7!ADSjiZA~>TK!;ukoLVkEbhudbf%pW57>;8M+}0!#!{5cb*l6|ouvA63i2o#e z(X6>(PFy1672n;*T)t#)PMmDDUzt3KD6ig>3!x!koXoZ=1n%)u($g_677D)yOI&4) zIBmwoCbi55MK~r)y%-y1c@>tJe1TJ~+rsQ|^%1Z59W7_no)<2ygc;<~C^Ve(%x~>{ z;KOQh_K$6mezShtr>g+Qs`br5K^3AiyPs8`N1cX$M`$WI?xO%y zY1bAi9M*JHWM9Ha`dd730uy^8s;tmx-XIGBOK$_4j~P3AO~>=2Pjmz6NHE4;2@ zMhqzaOd?ca8CjA?{L(#l6NSEh&@&xw?o&E)5ZjxLWXL%6juZv9qXnq)LEaV(+p8LK z+V2_X;F9K6D~{AOBOoP6aWQHs)?(`y+!JFf9_O4|*b#OIv0O-H2)MPLkZ5t=<8Lh{ z#e_s;dSDP&cOdByRYh2qho2LFD9I7`mfJxsuvxUg#2|h}f}>mmHdVFKVu})_eg61G zd<2|6m85SiTY?bfU$R7Ih_|e0a}ECT)p}J2oOGZI6(O3X`iqlE#1F=AlafA2kfw zv=iKAiMui61(n*U$HYYa|GDM=c`H6R4ljsXyHDPvp*~s_ame1G$EwUCx-O{wiI?%t=hQOqHZ3fzAG2w?n?9JZ>D zW@!6RpJJi=<`E==?`KoDNS-&*P#*=<*1PRD4R zkh74YWHh6oC8&kD$uW23?aTecHJ$jQ)fT`QXWk`oH6`{3bxdllq^f+NTiW=`>>E0y zeB7ij(SqvSJi7h$o!#^U<~^MEY#WmSsvOwS%JVP5*0LcI-?%8^rIS5u#GjkUO>PRW z3?Sm8oq0TL#U)IjuK-YQ@1NssUD_mn#$KW8kfj;hsHgLkUb#Jc_iE(KhV;})*uBz0 z{DHGUtb4fP)N@hg$Vz99iMzu<9QA(+u%C6~MFNb3Y6l7;@0Bs zv``$1y98-)*WuiIXYQSIzVFQQ%+Ii&@MCAMwbv_a?R?n{8FTnO#-lnci!BQ_vg)gHh$Bz3doNQPQ^7N0TYNpDY`m5%9|0Bl2&4bhjFARK2lSW_j(~`B%S@HFh*$SmZ z%9Z=KDL+sr1eS17Tda#?e?x``MKeJzWDmUw62yh5ya70lj!DM(Vp8+5O>*|LBNAbAycr#d z76A3S1}g}Nf{TgR6PhHy_@nZ)6?~?JCzTJnDRoA;nVUmU?GF-=U!PW*SCws?J-;+a z#X3I1Qf}SWZy~$tpv4EOycyh;QgIT zo57HyOJH5&5n|ev*srd0h$mgTXVU)&OC^rd`E_&t z5H!-P_=`@YtY1KUQ9uE9fseXOSRT;XkW$esQsfbjQhzN|gd~Y$XE+*sfAmMwNDjvD zt)K8Ma!(wg=1cq8W{ytId*aueHkvC}erNy4w?@)ReP1QthWs9tzQv97{h%wQ{v+<| z6V$zra){%o(u1$+OEG@9d0(8&jCsfIMdvmquc)wH>w7?tZleC6hUKN+Ssk` z^;bCcTtypUG+%Ayj~zwHtDaFMZChKsm+cp{i4`Pq8dFt@-iDi>kqVbx9w%hUZ4Ymz zUI($Fv@C+D1^E`a_6KPrQ7qTmRo-u@c$4lih^{bASD25jbC?h+ZHFHwkx;+WNPAi0 z8c%my!9d_3r34yst=RxEY!-+-I+6;!j?D8ksq)&`;wj=idJ=Z6B2l$jV6O*KRBbj< za^I#E3W!{a4c!RP&b9A7v=<53sgKg&E==s7Vg{-KcRb1z8zOwu_o5`z{$lU`d#C<+ zSO00{@)Sc>V3Gz<+(-%ry2=VR(vLa^j?}t~6(YYeYhy%~kA|ozWrS$CLu`Zw@a6oy ze;!5e9dpx>_AG`vL!=q`lJ=6uPIo*Vd}dtGWF#?hZ{84whh-N~7FxoT1&ZziKnWT1 z%g_d~O7EUeUrWSE1OttyvS0sUDQBoPPQiiNv4L#ojg1vr_yL6M5yV!}MAi$SeQ(LB ze3EZlO*X}iefSVLb7}8v=B}D~UzVeBLI1D^vv{1?{X9qcrX8zO>E$HM9vbcR+mqL(NapBW2sria5t{OS#xIE| zFKfzZzwk&}9M49-QJ`}O)~PQ~YAUy|n0w%FIO@9#rNZ*^wVSe1`%A47jD^ZYrB56x$e$!mFvU}g&TqPtVQaj4l8B^#{Z&raO z()OJf%cAqy4vXn&wfB3ovzQV&H$K^5&&^i!kyd>kPWyajVK1kV&E^)|o5v{*1O7`u z{MS!s!iKiF=Vl^a_CJH=zt-#o(Byq%Bmt2gqwA*_eL`FQY2QvQwuW_e@s&ZI0WzEDkSwcpHYj#Xn`2e~N?uk$3)O zMVKuRvH-~NhJ9dtD%Zt4t%O4!t!CZf(Chv?1jbcQ{ncDJLCN}eCt+!II*67i@}mJ# z@RPRM-ZzXGkaEyBF22%`N%(>CBuK^hc{(u%qj|bGZLI9YxSxv`KG6fEl+J+uxbV1l zm*F*lk^E#d z3(@+M>k-qNDjbiKX+FM^4XV%M=|NL4Ex@clHqBc;hOYaVbwQSMsa0kU-fE>roeGp4 ztOnl_g9==BJx8-OWza;@V^~cYkI~K}w^Qd+$3K+OFo_Mn zbM0z3<sD~ED(;xjtlE<6kJvP zQ%+HVMlVyEB4jr%o{=EzQ8t!Yb-0ex>2JQRhoG}=?YK#IM3){b*DwVzX2y)xJSWEt zd>So{Hz&s4WWj+qMhm74Ba-fB66AZ`UH?ug^Z0vBS_Jp#OCt&6|U{ z)q2n_h|eMm6?peeLAH~GGFj?zh7|FuP0hwWGzXm7&W3Il_;7e7!-zLXC~M5VeG`O9`1Z0qmz*s)Iodtu+)Qr6~no zxJ{(fx3c5sXE{wDf5Z5S%!r~eB9)#{mWR7%kZq^v-Z4Y9t=jj$@t~v$9N#D z;KLJGsZC81r;Fj4V&vomm2JjOVmmPj+fRX2kv~|m9*kBG1?(_2li7eE&+9+g>M^k* z+g^sPruIG#LCa>?pK`AnBvOHQ)#@gGu{=k&Cu#I1-j4_~;6y}Fn^0pjs2U$vS#SFO_XcP$+SruP|&ru$i5OK>UJW0H7YhI1=JciYA{GqdEnW7`=7UNo^6l;+>1gH`YP?QR3pNPJ+6~{^UzUvYt2x2Ri>&_A4KZvj<3w-7oHf9-Is`R=a-Llm`WZgEPbH-=g zKs6I1K&ym|sC61%P|Hd*-~>4!Cq4#LxRnlG|40C4Zy6 zH7aOq$jGtEO6k0*X^$@<0&?Bdz7kgead%HX*k$o)UlW!>iClQ*!q;E_xuG2+Ch9S> zi~FSCNW9a8+a=!Jgzc}^^VswlW#-OCp?+7)RbBo89>9hfC=A+nxS)C^v`U1Pp-7>2 z1I+bjNWr)sU``KLgY|giz<%ma>OClrvi_TZ{>$?JKQh9~7Ax^jTa%G8A9Cv5 z`xg&s=7VLbL1CjGhETYAb%Hp;P}`ZdLe!7l<3#A%<@U|Xc(3e8BFZOUMm(t4)({iF zOC{SuvxAAUjegtUu@*1Sr;LNcKO$Z;nW=&TpYL`rA^oBamjVE+VF3S8e4*h&f_iLreU~&=bC?R)1ARYJxwA znz3#)8R9_9j*)CaALB2V$IadKtInqLX&(tPH~E_S&#QCEgsLoGRGaz8No%#^tDn@} zab8?66r#0$)aU4EkE$p(!Ik$O;enL1B=-)70tdfR=f{S`9PQBNNK|Y}P7`sy*Ndi! z)8;~61FhVn=2BVbutNg`;iHB`l7z93O(@mGUSW-&! zb59=bmVMOXi1YUEAkoS$$#ZC{>1@{j4K@Gs zti5F(B|rFrjVWNHWjsA`YDo?pYq`O{PBMf=vfaB;2TD2|8L+*6Z0y)olkgx%v+Y}` zkA1k;WVTa<`a^hW*R(iF&kg9se;oNEiM`g_*5LA>SL;xzTQK#cbmFJ#;_kWiT_ug4 zUzwJWiwOu-A2(v6Y4U=&m9k_?9+H*$Rop%hJ2QdI6R^-=JWJrK5j-_=L+ipyO zWz${%M^+*l8uzBDxlVQ1kN(A8(lZ{VN?2ZN;-CC7>%s-{v6bqgOV;TOtoR`&H_~ZS zbk88H!(TTO1~Di+oxWj=!OR<9ds=I`y=!xnl% zHuXMn;M$K%sfXv5nB>Hz==LshBrpbtSHPvI?pd#2Ob)ScH)+E6kSX0yfSZ?%C_@qF zQKQA{bhPf_n^*~NVJ-p|L1y8&-Xv_^!y4hC-Ab3_g%e$#Q*l08lt=Mt+xlUl+o_v@ zZihHyQ9Dy^fOE%usEa2{&v#9}r=NsAie+k4US^>1GCa|i7qTFmKOafOeOW9oXsCru zohSr{B=bS0|+qLbu2$r8w5<7&M3O%Tx;0(G8{{~xNJSR#Vog>nsk7ir*wGdA* z=d2iz_+8`My?GL~ojOWlymkB~Dj)Zm>zdT?4Q~4LO42gQw?ol@(Jn+Ty3&$>I1r{F3z(jiwp zV~@4D*N=spHKscgukwoq`@U@1@mZ?F?K`=x%aCoq3Jx~(K6YJCfJan<*96er7b0j> zZ`KrfPj<`i8?+tW{KIuQG^H4H@uI?W7eTww?jUb7UM&Y9YHGffYRO5!N>qs^kVvto zSNgGog>e!12o|`Bo^Mqb=>1vfp7Zc5s|H*rExijL=iW}FlNnHk)psv)6*b6my#IT| zP7$~#o8xO5YlAKLuT@Ln$csRJv|10oF~}wQ^$7Kt*LCYD#UJ^HJGO^$rd6tk*-j=6 zhMc}kk<)Vlx85MP*HesW99R>nZ5N!eut`78J6bf`>jlYM%th6n<1{@flk0B8L@LwR z{bm1=zj>bO4z&3J7nKVCcslO>>I+>PlFd-OOLFR%&Z5t#o-;-l*BmxDRqHQv3Iq>P zISI11>Rh3snKrnWg`RNsujO_D=^m80Xg@F!nK$=O6IS@&4plCZwWV>$pv(7dqnyu8 zHAuliA-`VJ2zI#hnY==7trh14#-?7X)vlv$J!koNft|DQwNziHC_{w=)!5<521te( zz+dM%V#t!LVJVTTJhXlo*O2j>5r7$1&=9s4j1g#V6k(QIzq!E2OyMT}ej}9nQqFQ& zF0X?(O-heZg4#iqxdzB1WX*0eiO#>ZM=;9W9+d3;xmnKG*o(F;*gmOk4zU}6ARO#H)pV55Rk^5B4qX7&dvVE)dorl5qJ`;Rdr8%JAfXH`(b zWDvarH^cq}4{Ii@ewXaFq=T?3voExw=PWn^vB9t_XR=6}7113Yu^&Oi49CFzEdeOc zrGvP9A}+?F{Kzovk8zZI=&6?65C>*F`UE|j$~g+1a!MqDlJ##3{lQM;pN@Fy&U+}9 zOgcpi9LH+qCNPYH#h*KC-nb>kzm2Mf7ALV1@9oB9x~O*-I6IDuuJ4x=&6~0ouj873 z;o73|v`d{9w<8rp%GN|(f9VS+D<(FADN^UWHot zx-&||vq!1wvP#9@uZb9QlCD{96?9C`ZSZH8@+^K<_PK}Atw%)`&v%7xpv~7D~MWs#!;KB_g4$Vb}g&F6zVSJ;Lcg?MIhn!pT#<_l}>;50L zBT9|=TvRvN1g~rwaeR=dKs#QuysZS$;$iCeGm^k~_y?%QVN`=OBB$QyLq*z$pa40l zJUF#4h_Dw9F+dhBN}L03h0DLXhf`Vt-=bONwR=_`6~A+m%B5C4{4zhjFG41c`bIY| zYlg|{Z10t`RgEW*WITquT9WB~_t1NSTbmG3u>wSoceCGduk^M?^-7M~zwY|K$2Eb^!lZ>YsQ^EJu*Y4- zRZ*2juiiN1rMc{q_h4UUy70JlUTlispYrmd8EbS1H*T#IS_h8E2zRxBKf5ewWsTNQ zA~NT=N{;wt(C(>0mW^0iUy_b)Xpda1`4_k%3RfBG#m$1zXSu<&fuk?aFxs6s&9RJs zFIrz%Oo|BiG>d{l&LKsqEC#acXQ_I!D&TOh`Uo#!nKh~U#NX}sLxXUnQ{8$Kn-Lyo ziw8#JLs#NNkJ(*r9H(W(=M%Ywk+egRCk1U0m!kE?eQ2x$1u{G0C=b!{`d+a(mAG+Q zP&&GFX{6BNJ#I)$!HGKXjKTbw#i^8$jT?tAl-M(zg{=W!t)h9@qojGKtjRu8SGYw5 zDZm*Xzp6AA+}F73;9`EhcEouCP|Q1Il?;1U~Fa)!8matcMWVK??}6@l{E zFJq0X{i)x#spgIl_?liy7m{*j5T0#z{5aL>-YblI+=TQV5$3zhch+wTN{K(@SxR;A z!@1x7pyf-ml&s2}{Xx^GCx*_pWd7&?&YoLrkiIKBu5pQAT+dIl-^)>&{@8uBSYJ=(i)4Az_P5Rw4Y zuy=H~bWCXT8wX~w%Z=CJTwl9#Wf?PWD6|Hxt{{;QO-!~8)x1Be)H5WC1Ok_ewBpSu zJ68seQZ7|dsmztzF`h-D-nA%pBxD~~HdFIbE-6vP*U%$EK=eaQPu~q%1PmngbN6A=Pf)*#vErdn=sih^H zZ5g~tMcq%n%n%xRPo_xiiv~eHR&n-!Q)Gubf4G7^PLqKPM)5ZM8loPvpe+|MU&y8X13=+DRqbGUvlO7pt;yeF`{CM=ns zI2?vjrZ^5zDCR@AN6wGQ2&&xb!?+7*)Ys9xyCsk4yg-*0B^Zyjqmv+x6W5FWKb8A6 zjyHS7@prYz_LgL}vdKw9QPji{>u=BTujS^fDjZ~TE2$K2pJXS}Nk3``r$5N3&%a7y zc-5b7m@byf)S5_El%#kYsg06c2*7$Of9}C5*B5WOWI_`TN93?yl+-KzhAmE0;@-e? ze?!C6IlqN9d}A>@+M|$jX#Zt)UTS_vtVx$8#6b(>4~Or($D$&!X;pMXTPL9`vgk6N z1@`svu5uCeEFnO#mCP*E*cXnBJ^h_*=#nXqvn_#x6(IKR{z&-1!FZ#kSi&hsB{-&` zL0w|$t$5#!n%GBB;B?kuXn7(T?E-(Z}Oe`?;Pb1CLtX8 zAEt3V`Hmc@L;RYfLpF1O&iW0jB;h|CM<0d^Pyx@RD9l9-O6ntjh4wZai>$HJuo}U! za9Qv8D?3Mi7ku8XM2@&y=d<=L43ctVZ-?NfX3O8^RIaEXLL71*aK?nYgYW5YtDwZt zD`ugU;aRcC_He5x%xQM(yheaVk2oeak($10I=$Nmvx_QWAOkyZ7|+cu24J4WGxqJF zH-#sYMAfWNYVGub;l0n;MRlc~&nUvN}u6~jU!^vbT* zSg2&WG!Yn&6+@fp95uoeE3W$!6TSEoLZll9fhZule+`Ssz$y||s=Ks!S_x}Wm>*~tSnDvRxEvj4@03lF3?neWag zEnRfH3kkPp>t1YTqL+Q^)AtR=ei+PHr%Yz(c#Z{?Yb*cI{61OvQN8e}V`8n>KY#PBKHGXM&8!;vHhkoIP`Ep!l6F+L)MAYWR- zw{dEsABPmqTz0fYsk_*NDeQtKFb_cOH14?XWC zHJ6pr(=c#H^GOd|HK<>TPrW@=G2-Jx6Q)P4C?M^;XmA+L#JTo!&{gj%o50;pf#w>* zE=3W^PZ!jE!!UTNlMf}|Q6uI}Z*E=%n&R9^(EjYfF@d60lYVAki(Lf8i%hB;t+;Ww`F`mM6mceC+V%Yv6}BuK8AvLe*0ulWE>xit5bnl=(d?IV`j{R5np@C2Zld41t} z?<>Ew?IpL418P)w`wXeew=+VMc=i(i{?e{tJ7N9 z9}r2#ZJxD-gYNO>Y2tqSPo<>N35FxTH6f>!$o&HG6Sno{Wnfc?QxE;C0$H8_KPiH6%S%z% z6EZ>`sk@qbL-MKgqEeDS^68A%ehjHTTpc*0o8hvXfR~EHNPi(&E=~9v_tNKu@i_aU zyYeadU@lMR!2+Sb=OiRqe4;gaT9-NoJH*KzPv>xS^6>h>f$3MiXRdJt$*Ftmrv;AY z1qzXtUN-ApX9?_3LA_W%LU!cZTjQPk!nHkv_O*B0B8c@%L1b1HZ%Tl?ypWCkjaVvY zO^OXgw_(iHFk(sl=&+gq*y$0K?`7FiLaNh>rc$mki^bIFH47LbLK`S+VB|h$hY|I#Hv_gNa+#6#PqS0DC}_0ao#%vWN-e>d{& z_QMO`gD9Mwgitxx<7!WzDWPq|4c(0eWFWv5XH@&L`8{)uKe2wEa}&)wQ`waf zB&~os2P*9LHO@2+svC%IxYO?Py+2hGCAo`*G=^IfKI&~($u9vtyXuVq6@@&h-A%^W z#St8<6D0}CFlKCwT|?>)yv}1l%FNiSQ);v<9M>hRJbVW|vN(E87CHQ}&#U>(5gmmp z9O3+b79AJ~-($Fh!FNLYTI#DM!a78!X8bFIS*J)jFm>`JzrV1VS4q#@t5@NfXg7bt zWh&GnecIp~b6xYZa@;?_NEsaAf3QOC{DLNe3MR}-1;hTVOKw6JW6}Ee_rpJUjp=rOVscufYTibyqo(kJY-X!W30%KN!yn;UDpfp{d3CViM?yQTxdd{Yc1 z3PDyuUYI&B4*cHT5g|{dW$_lyz?}$B_z^>9b%w**0HGdy&FIaPnG>bt=Efs{ysyf2 z_nO?OxgBMaAzM^#zcat9_cpZyW3Nd8KBHoL%0pwP;lz@~AN2tH+N*%}ofYhFf4({` zq!^zIj1C3#zzwq5=&fLeM5?kJ421@GjrV2@2fE*hSWdOaw8;JZAD#xCzRSCqJ-Iw^ zT6Mle=NZ7e&7~q+-vvgfZuB;w`EN%mMPRj4;&(65ktmXdn`Fz$g6jpMbHRXH<&oe9 zo-mgeo6p4h&H%*?WunuyuxUmc4U3&D`3i?@i}rag%VpMU_-&*(N#wqAeQ%~nI~tSV z+Zo>sf=`?4gb#`nZ<;voEx>2!ci@)J@1lHEtQ3#W++=GB{2qgUy7X-y73u_>OgTW9rP`WztIs|N{d)F2C^F7ez#UL885iQen)f;C z(6Sv;8XjL1?@xR7odM20TMc4uSL?q=*wj3!!h_D@>7&ssJkGyAx-gPz8r!r59S z5)W^Y*H$mxsgg}e;3<8#sAY<`417Q{Q%tDRD50vpRy`V0bpc(M&}R)j8bK*02X3-E z8_^$Zdm06UFiKbA0<^`*-(_{&py&JvYb|Cbe$#p&_#BL|pL4d=2Nh7Bp6e9I7hcp_ zXMJHI;?k|xVKIsr{N{lJ2Y7}gSVFSbgB^r_Ycyzri{OANw@nm|itldobxNM#>^{WP zBUe6uvxK&l6}HKKQ4$_cEPz<$P3#puN3Q(R^saE(h0Qaye?uWPG~y&XR!r1>{|ho2 zmFW-{_mRxT8^gI1yHjVT`T&h15*RDHh3*()WDNa;O5FRR27=m-AePZ}FIg|?Li@9O zUKWGYPK-S!pKVJwI21&5a8mW!bs8c*3G?88Rlc$VpiODYp}bGW8^w`m+Wt<%?Lvt0 z3pE%ArvS6Yk^HAXx)_Gnb*4x+_4bZpTpoZ#>xSZ%pI-V@G>=_)FNIdmKQnF+C&MUa zufmMQD600AKc!d=GJUe~NCZt;nmj63Hn8Iry8kgBywO`cz(f^~&#q@8pKqhD6d6;t_=NAHEWx?z1l-=8~(xpy0iW5Zyp&0hm>~Eux zPhwfMmnA;K=8U2jx)&Pm*}0N3S$dDz7YlV-{Z}{w`2Laf2;#ZU#+1-!W>x^60+`d@ zY)|^_E0~5lXFK4(>rE{uf;rEx?=<%nb`we7^TZpE>ofL|J{CSQpY8O~G$pY|hLAVU zxxSug-Z}G`5c@fp;iUq83uO75Gj&2u^yh`g#a=S=;$2-af=q_K$lPhU_l%P*m%kxO zA=o>XN)>d_6x6a~Vea^#&Ho@Wb~LJfIqjxY7I_|Q4NaGLdAjN3*y2uh;aTh~7jZvF z_r)`gWc&&lC(gL$(!k78E0Cw()aJ~^C2L{wOuY6SL zaUe1aRK|zlEJS8X2RHqYxDvYG0>6^WCa~lL`L)IU6b-*gf7z%{Ilpdw@`nCeUDX1L zQCa12i;b3rETaFDjU#okbf=1}Q&J2c7WeFLsZ*IKsY3(gAF+TRUX0D}>tuLS9PH6* z*Tyo8k;eS!05;tF+NMF;HHDL}vxg(^OxVqY>H-9Oi0fX92C!^^b?O?O7|5vm(u4rR z@Rb1UV(>Zt8lRm1_Iq03>cC4A=@CimM1?MFhs0+`52{8^hroSilmhqq5J9EO)Y$LW zo9Wr)AU75_PT~5BUhi>4khL(I>T>S`^wD=PU9d$(lD=oZSZ!-^;%=X+E?$4LiOiC< z0E4^GaVtKZH#sxRv8+2^Dyt>yM`H$ISm;ixiNPaqzb+zCorAtHEs*j_NvOTV+1D7) zl5Xf|h0i2>=od(eH6A2NIqe*xn>0GVxg6wXLpcSHBLU|lqn~m5TP5x#Tfhyeo0s?y z&#}k%9=jW~H9wdq#Z;J|$Qrnm(q0&bbKXDS?=L3#tf(_>DIlxOWQBaT&?EBp@O{@f zU#l@s18G_Ro{@L;-5aU`)UtN;v1aiqcsSijaDQjEc%+nRTkw~DcL4MWY2S@XKX{<# zb35@Wo5KrQCyFGKt)Kti(WajyePy%%>)h%u*gA!kw+ye6QO7!ZeqP4yw09`ST`osF zi~>zn9`=GCZk_Y2;G3J|BtCJck-gZXHj?M>jrKq~z2`;V1`^P^5=hfcqw=M2SyX zKwcQkwV~o-#SYhccD1Ls#Oa|ZrA9UltZs5tlM)|1uqClGsc;q&w zGykD&V@MvHtddGLO`yR$?j$-X-cdcG;L_1>66YZSQy& zfdb&~?ahy*D!C8YpwntzuX<)9ekXI*^g@1oM6-614pP_azeeYvaCcjkqCS36U8rXe zr;3V8xL|r*ex6khLYvNzR!!+q7WF>jaWzMo={wQ;>bXY&nyFad zQ{IJTjj%H4Ap6_zgZF4Qv{5$0R?UPbHp&wtKX(Ekz#aQ5*SHJRrquh@skufZ;=3Y! zorS>mMW(CUht&~l);9EJlC8zr5JY5yitY?oalbCC+&T|WqCDi!3E^3tQ(JdG!63qD zd&anocPVFG9u0JzD<@0;=I%;&X-#HkwT>t-M4YDroHZy1SZLqzRmaeao4D2M;gu8k zt=oP9$%;YhxdAQQfqgo%qRCz1(fpvKEb^?uZG!Ng7d32%&g*zCyQxhKv5S6%^pyJG zCGx_nq2z2^E2A2w3Z)*`w`H&V1HNW~Hb$uvy!2hfFFId@@Sm~N3IiGI~#;bQJ^FLDk|eA#wBWsoB`+JKtuW3uXi*}jXUhf!TCt3aIzQu3r(VS45g%l&2?c})V* zC&Z`9o>}kuBOMUNO6!_JA4fOBR<3@~c=C9)@Emd-aT2x`q^VT>B(*fGed^1;mS&P{ zL0@ZX#uH(CWJ5kLq|E`D(dWoj_P%AUXG4=llQvYD5m`Cl?>y5G45J(UfI{?!rN&*n z;%kS}lYWEjx%=rnLBoK>)3jIgJFe_YBj~^Tbt?~+XT-lO#PgFnvp(CZD|S0@MBEmL zJfMvk-zR4WK~Ed-Qu`yMviEU(vd6r-HL0kFx(NgFE78C9f6H`fT*U9=BxT|X3rt=w zdLx32ta_hz&R_HFs9w4o+;ZKY{$PDue>(PU8JXa$=r#b&*=6X-{K*{Wd-^tHByN1U zZ($6Kr`;c)SO?8ZFq$$PE$l`m}^A`Z%CVGUFt(U#N{lhj{HP#(Bk`{UgcJ;c*osAlhx zFyoLi|MEcv2A{}hb-RnKT#S0%v>h=R``_v=UesF`4``vnWp&%VDAM^>L2jQ0wR%K| zr`R`xZJ0F6wc82|e(kAh^<1h{Z$$OGW%x{luw5rEtYg#4fc4J{47DEUuZ2=V ztuQOlW5lAh#V*)sw_1a4bf;sxzX=0w>xorg8Rlz$E&I1c-E_3{RXTFk!|pG$Gb`h( zBcE=#MosGdvun$Y3m1u$dqPyTiTmYWcOy8yhH;4Qon1C;t@y50#&hr%9FYt5!WAg& zTi)xr^E>vNOQ8!!VQS%ISa~Gz*hq0+Gr`8B>zXg?GqKV&LWM_{;-gjzQRhbb1!xJX z*<*10f|bT>Be;eKb&2x}5c=lN$E7z2DCM~<-V+B796~0y&%L5vcJb&_x}sudM!pxb ze!Y(?MfYy?VvyF>Y_!AV*Y+(9%z;EQv|}+~&KzTgh59T?Nk>V^Kt$0E`g-<^dMszJ z&@3F?gw49?BX5$EQ@gCdD}p9w$0D^|0^&gE8<_xpTWN!Kea29SAZe<##h?zpeC#*d zj08WkAXFV&;ywZ9|E{5;4m&Uf+N<$cs=kv*H9Nk3Kl4&#|4`J7jl}3)#@nZeB-^=I ziM!HSQzNaTdlmbOd7MN56WOBE0(r%ejQvISd$jU~ErjH)F;Mjpv@MT0aA$-p0+>sP z$49!&WiToO_84-LR=NvM^(ka{{9^qdyra8g-^&4EnnOJJ`v*H2{*>>u;t-VWgNj|G z%tp#ZB3=!<_8jiQq|ojejuvR!{+SPpYDl9R&(!ZHgMtfGu_1`37ZtlALyp+B?^@?X z154xzIIC~`XsIw%dtA`*vPO>g>KL(o)lp!}!b=AFd?2~Sor`s3NU~R(dg|+L=mf{Q z&LJF1zC8no;epxDAR)#Z&vLhpPd5a9_6RP zO+Hw9++YM<+VOX15@*!A@jVWM2j212#hvQF8a6Qq5*-uw(~e;H1AZP0%B{5YV&AB8 zTH0{Gen%;*68#5vuVv4ZIqVEwtH{PDjZc%gr{_Yw^?&L9WI-GsOBK6@pJfUjZpO?J z=o{vd8mij+n^G!17GWdTx1d3M^DD}p?htn_c(C{>HX8&wrtq69r za;Y!D^EqN%zeyxFR~wFLo`UM2&qovfIXl%Up+*Dwx=HO#~%m!RQT9E z(A}fnxlWh~vv)_3`+Qv9JQ>;DbBM7Gn*O*)@UdZ5FFVsCqjKUzQW;@&uGylYMW^4# zo6CKnIYI*4S*Jae@osoU*wC){a&<7hsC+kdln(b^gzehZD;u-jOrgCy;=pyCKN%oxH{7R3 z9;)Mv9&|&m7BcUA$X^e+uGG8sJSF%YUow1N$&+{71yLmBdsUA zsPQ7O3yc?H$<~A|+fS*Hf6B|X&(XV@;qw|zO^dkmZ=Da55n^YyCA>$TufP>8E4%rS@qcNjkUGJ@+938HvPSt$zNQa( z=Ph-8+J1uL^c4*D+F)nKIDJQy4M7=ttFB!SmnV+S*&v7u=QZ;$FPgF8JqKLmwOlESeRw&lZWW12 z=)H5ymU}BSVRoTSeeOXap>2|hH2MMs=}r|8CjBm*LSDX#x<8LWN8=rh>yD;WI7<-4 zT-=Fa`unhL$8}DI7$7n!Q{tF^%oOfFBN~M=tAlGL^MGW1RC7?LHJn;=fAZW|KWBcD zFPvkWd|8=;U;VOG8U1;G{2FoKJ7jMs{oXq6)wiMn7mR$S|f**0&jc)Nn97_RBo4a`djnKNg z_mb-$GTWXwcmDTB$o=w0=)l3Yf*iHDP;mc}tM3(2>g{JV+zU47+yPKb5aa_p8KwhSk7 z&T^b_3vW3`&%DCSqF3@S2tos{hhC(mXc?ISsksU>R(O70ZIUmkD$T0BG{lqV@Fl~7W;T@|9vkh<-De2Gq%=T(uw<8I z@&rI1w}^SZgZIBy&l1f>I=+fIxeJYBQ}YFV+Q&ORVtJg%ZKPGGYezt%cLM(n@%)Xq zXO1fbKn^rN8Tu~O$vPdehbuWF*yt!584^G~HAFE?)r#~2wuIsKG*ZGt-a%w-jMrN;v&)pc!J1w7a8+eW~ zUeGZ$shwXQF)2y!k{M(_3_}*kC0JL~N{hqJY^^ihOjw{VF&B7P*C~kd9x4KQ>?60$ zM5UW!Ei;OR_1e_jW^22a=#RdoEI9e$F;lxsn%%kToQpec&`JPH>CTz`{CVuhv&r{f&j zd+uBHkW56-NdzJbNR2ETM!aAC^u?)jWSP3G1lLr}vloZS6M;YAe>;A%^llvGg7p$V z?l_03NqmXSje6Zd2?Oz<#P@$_Nf;>!KWLG~ft zkw0$pG*P|`>>n`-t!gU&8uRzY*N!^IS4(Tg%=n)i)=(gT|Yv6`Yg6asDuz78&A#u2niPOPx!hGPJ{?Y-2rWL_5hEgUo_px6} zNz{$oJ|kkesMkdGS)HD5Ki<$Qa)L>tv+pu@Z+i8a+#dC#Dw5ZG%V$;A3|a5S4_Vqt zf-q0QNUTR*`VfP)$3FdXbZ>qW%_mR??$y>HX_W?Vc>(}<17=wwxv07BHW654!j==o z4k3ERuIP6P>rPqDe&KZPR5OB9VSW#)4YX|?p-R(g#LqK-Q#`up#-CBhs}oZkJGmGt z`B^`G`!lA;Sc0SChgIMf8Y!@*MsPUK-j%_9PP@~xm4{)H0M)UW?Fj@{q9jiLZM>R< zg3`^;2Wund&Qkkt?!y%-k_awqh;J4{;d)e}f5ZX&=_&T8VEdD2V2uz=>(uMUSCb=I9S0VqUuQ|82V(?n3>aAuuL%z zzPpaMo|8F(D=aPnfFI%_>-m<35hkDQ{}*9z9TsJ{?hDflA>BEElyoEAA<_y+4IxUG zbPdhWB_T+MfJi7^Bdww^gn)ENGcfcJGxM>|KHuJF?X%WCf6g`Y&L7Y9Uibanzq;+< zCAv8I-U+$yBW(ND#(DlhSkK+?2(nNdfyP=mu}ocHY)digbInINmkn(;RD2zQ2DqTur9!T`i^ zOa6Ii8IRB@e*8A~tOhpB=gDcff)MqPJ*8lW>Ag>V`#8(0LC-jkVDC!iivqh@G5q0D zl;UQ_8Ye~g@9<);P}0@(%5oZeFP;LxnMZo-(^IQL|Ie4q2`aAO#&^e?(Z|20{A4EC zp{#4Gh%~*tl2pID$F?gS;rn_moR6EI-CwqOGhk0MU{y)6U>9Lw_K~x2!Oo3Moequ) zT_{xHTYHDD;dxT1-Z&@6sK^qM*49E2 zUTU(!4BwP8F7$LVOr`@^Rsz!1pl6}F>xWL+^d_(0Vw5Xsi z<6y47L)~*rH)ZF;Nl}o}HeRHU*d)5g&K z6Q}v`=z|97i+jPC(~AeKV#vfnFj8bK9QIoWGocDLkC1k&EoG-_i^JK$cv*AoUZ^G~ zus*T=8nHt~wWSnuMv43*mYT3gJxV>v(Pic7vIVaUdJAZL%=0_QX*&DG4o)I*r+-hc zqHX;Td=j(H)NbemYr9^5oP~FYEu84h7!kD)iM#UmKuyvq+FH__;jOGUwRj5wqp?}m z9(kQ1o3vZrBq*wJyJe^@I0SzXLjYc34NBS7jvo5HyGr`2vauvOrleokB$0{OV*NUJ}Y8P)r^+qkAGX84SIk9l^aI`9=N@)Pz4iH2O~$bh7M-7bj58fp?jwi=Q#hT?>GxyG_?S=anY6AY1M@otTx<;#;2mM zB)3UwLt>pNqCP58vQTYDMBvDAzI_09Qq{YUmpD5sSN6Mor+hS?OmMhCm;>9Sj9N

Rj_Q$f%2R#I6sQd*)So}Filx+I+6*i}9X)iS{hV#TJhvIeJdH_G65w8?bEbkmU zkZ9bakGeE(qH?!w!00fd-J_AmG-5vLNdExqrKHs(DY zy1D+U8BDu;a&4fHgTS3a0x`TzBvS%h_kO%JN6L(@Y4+2`5A9nM&GyUs-`%=!!#peY zUG+>0u%XJ;kG1N)&_n8?V+|*qH$KEQq!l1sQs>lBPXF+KHu#h;?%mG>_Az^XN*gUb zv?swpc$wQ-_YFC7?5FN+Jhf!z=-ZNyQ$)XY{LT#`t6y9h44@?Ie}q+D#h&baNZ2!~ z8xJ(z70U8-_>yd|MOUKc!18WAZV+iL_o=!--63(tKrpJrp1SDk&SLZG-p=RVDRn2+ z4c=gZB1Nt9#Z&(--u_0%#3xS+pK#eG?PF-$OZwKO;jaYl!Sngc2`!5=#A*c*rTzb( z1#q;pkuovtXt0(iT&~EAG%b{-y8BM!p7pBU5#^M1e+xfzor4yV5fLa*1w4E>1PNj< z3vsV8NSzN;_1NXQk@GNIdX`GkV={atC0>#{ijeajb3qwD?C~31qKEJ>to|(RWiPog zZ(7av6&^3gs0JpNRQ{@>opZ)U6@LCJT+Yn1LEOExjq>>A&q*B{5w`{r*#FG2k`O$Cc53L882 zuTS`@&a8`k$NWVs8@8mxezpKFUSQwDOmU*T9qHX6HJcHI(+>BJ7+DhigsBmT>bM_~r^b2;}M8g&g^QJaRHK zAar3FbYVg9~Onh%S%7Fa(G}L;$h5}0W*an6-IDb7pzpi*E$Ar!+kr8%l)Kti9 zT1ls062FX*bVw|Axph=-W3J$sONSp-qI`JI^GUD!cGg514)xNWJ4EmZ;yR-I_3K(SST&fU;-50+B$eXcbbD0g0@jry)ks$My5V!CG3 zyz~Ujfci(OS30ZqEKk6Z$!%Z8b88JY6TNoJWvbtci;9J6(srQ)1eI)HQBu-Um`KJA zJ>Sh40|hhMjzJWr&Gr@KUdoN@NbWwdyBq#t#{*h8Us##TC&uR^G}|WJg8XOV0s2lp3O4uiI* za%$nCX`|}LbmWe&?JaH%o-8rm;E$?v9lg{+sazxJT3J-QevEMV>*ksHpc^K8tfG{3 zxMsk~7Yi@ow`*_jCu-1!5}&!>k>rh+v&^h5x7+}spAn?Eiudm~mP=|CBw^8wJ=E1> zxW#RlXy=c+hmA4mt<6$9%Vn(iK@VlyJ!hd~HGV_8cTIHrvAfId=iY=JkXM4fWAfr~w7{2q4vXuNwvU54zq zwHBEH_y4VVGsyE?k)fFMGAvxU#sc&4!ai3q(s>mcp|+~`LBZzO%#8TWqG9WAj4y1~ zmM9nGX#ZBU7xa*3lU6`nBfZpsmT4<{a$(u$$|E5ba*{y2oI9WPvWW5<;3b|o4r5e` ziWZP7M8IulWrJ zoQo=ht)c?bOM$;8@aI2My5q?8t^E?v;q8wVk9$SY{@9t+eh3IA#S`u$O%n+_d)kA- zlB_>z)d78#$>Ex$Mt3M9iKS~lVY|~YKj}95>}TM^jHT~_)k34bB$~-F%gQ4gi~l0H z*qLcs(#+^`+M9bmmMbjt#er7~1RFFm#3I8GlIf`tV-w{Jy!4s#VYVQ4Rjcw!iw#*C znv^7>#+jGA)|8i9Wn!vv;Vb4ddfU+$S7mdSOO5!8LYMPX5{fDZumDQswe&CY- zfvUi=15cK(d$-3r4N=ZK2ZQrL`Y5=L0l}+{Oi26u?@rSW#DT?0t<0U@F?t_B$1c`9 zO+OUAw@1GRdcL3`!;HqofSdHKBY4mPSI^sX=Wa*1C{!N~22I4YD~+wJ+zQ2$$nNT2 z`5>=ckHKxxlru}UExaZoLr&71?_CN$(8i^a^n?)%fr+EvPX|Hc6EBL+@?nCwQ_1Jw zWw!}e9)^e)!-#q&1T=eyh&8}l6CH*b5z%A^42LFyE<_VS+ z7nZWWUd=;DO1b`>p#~Ux;n(e1N-UNdThvN$`Yt3p926}*IrLn4Y;1zsCO{(Mga&|j z7j1RTx*~8}1`8}u85bRoLG1L+v&toub!y9jaEwjsM}D}~gxq@rWmBNjS9c$dBiFco z#yPp~h^BULv<7B^9RcOCof}jB!tv}78c$t7H0O&xGQ1X`9!zSnR-vq1GUF=!|i#gw@SSReuCrUI(SF+@(Cgn*jm z#zN2M)y-c*EObyL=U}I#Ot#q|10Tg$x=GLyBDraDC2nS$2rc!5X>_&RaIf3#lm~h^oSka?(LD?T1mLm_{%V9c9w! zB#zw=1G+_F%&2p~05F}k%w4ZTlYwTDsN27A?JzP8*%x^b_4+rYIPEl+eZ>Y59~5Jb zWST;}FTI4WsOwQ2t=mvyR!uaSNioS|=p-KNZxFRb`FeD=BY2dX1C{CSqT9-A7 zfU?SLqVz|m8W9ufNTpgaqOl;Ai}YI{cbR?5nMs-W0vsE@eO#FJ(1|>%gpQN zny`tW-#4_ox<3cWhSBa&+P{Iu+BJQU09n5eA*ID8k7IV8oU`!QMuW6d{+1pLd0DAL z-Z_nhXJu`~B(2=F@*McyK2cyw{}u$i$rtHhWZ8iOu-e;e^g(kkPXZQOi>}u+7w~#a z6)N<2VGVmNAOyn|^^QwUlpf0#+SIwky3z0Pl5*5clSL>_IdlgSqTXJx!t+F(tv7Yp zUJNSwI8QCF1xSWTa3((Xg?YBi?PemTozcqthKt3Wf2S^9NnJDveWI94Q~1{PBcZ2v zv_BN<^)a?5@914D^Cb}R#@wH5hxv+d4wG~tPZGWT4}%vrJX!GIW(kHH+@%wVdUc6{VqV^24{g06c7N8(IJL9z>X#^Oxpb(-I0B={NOQ0Sr{Gr z*Sugu(+Ur|bhYus0p1vH)JB*i}CHZeZhbBU^H`y$4{Wu{UPn> zd(Ox6T3>ToHoTY5>~B=RzJa{YgD#ARA-E9P10ppbUd}u9`1AZ2@NN^^Rnw+Qer&3= zfnHPl@J5%%md?NGWB*5&TPss5y)k0-P@4ZATN)Qm8H+p~?uqD(H|Z#-%(gkP#ifal zMkBe2|B~CkQt!J-hX!{P52?Q7i3LtBBtxv!gl-dm-oGd}9S>xi$A~f#^L{bwALX(N zAc!0#-k19BsNl?`t?bLzU+^z2Bm&slZzG|ko35IKHXC#;CfjN@_*%3 zeMJP^0GQsdQ_v0Zik_c)6hyu$9309naa^&W(P?jwwhYXaX)B=s3==9c^&u$|uJb65 zS`q`9KC|sGwq1WvIf$3w6h&4T;_-aC3WQ&Qz7d0*o}7iuKMeJfrhT=1Dnd2M-ngbX zFDVk619ISO#Vz~h5@r#TP@#WM%%sJh(5uGss88Ky>E8);i?3v>IuL(iYpi5wABd#c zzffGb7GIf&qH=gXogk-z-`pMvOq-B64Ntbvd*pC@@Og#~n0 zAu6n4sWPRiu_O0tTBSU;ImSJo>^!b_-o&+ARa2jjnq8@_gvbJ~%3sk7 zp_?zF*f^My)rBchojyzo>V7{IDapubW4UQ}&)dR19Ab2@Us37=jYqj&SqtUd+ZN zf%Q3Cu0LrrSYayghV-q+N*4Dt_xp&L8#wf5w#9#SXd*AJgZ@kqPZD^!K7h+Z%I_e& zHxsDzT_2=RoIrEEMSt3rM{IKyTu0x5_!mY!nIdU7&a9wTF+_Va;@g$|?d#o%Fdyt8 z!aiiF=`Fa(#;QYjfk$f}F}k7LCCtkVB8sx0Fo;soPqk~Iq+5F3e-|-nlkt*wK)Ge- z?cM75nWv8sxlvGLoA|&HPT=FTUZ#_0oVhpn3#Kw-dTa|5Q>V!Yw`IT9;POO3dFeC~ zta}3GIMndQe^8z~fBi^FgZp{jRA)@~Wodad`_&_WjW+-}XE=7uN!6S$D>&Lb?|)PV zEoV9BavgFqzpDqO07bKinA#2wrExY`t}PDHZ@wuWc$p$q$I~=POp?tvj=kUeck+PE z%E8}x2cGW|=dg&OkE;Urz?2J=o~?%8^mcfc*4pK{{dq$$4j!Bp@zNa}mrHYNJgx+b zQucF;(tfymZ|wOSdhrL8i>89LTlVKrvlFQ*r={$2n&%bBw=6O2RhZVv@oKj>fCb!7 zd8LEGjZ%vW3#W|m+XGm1{$A+A1gE73eURHM+p|lILPN5s_d)o_qREi_Gxx6$OWmJdN6tS zDH}F0tO5CPk(Uao(ad-vRkw+@PMDJ_X^r45Myv&P7@BIP+EF!6GZ^-N^r?vT;|Jgp zR+Xg8lW+3$P-+&XX!{*%&ZnHenJ;lrtW+n4onbxV_cCGE62L9GKy27km*|KQ#*u2LKxX(jDZJC92DqwSdJ ztm=>}fn0Q6bt;;7A2SBo5(^x!$<_i_hJyp1OW}-;8z~YBv925%tg7Zj1_(4v=Mvgi zHtgO2jyAD}GA9q6UVQKa1-dCGtQtX&M^4x;H^pNwiWAd^2fYfFH~Qd-Yf@^Bs)YBi z!#_OowmZ5y9Z-`E;nsj(089jxF}NUQLiS+?RUU1ZY&6X^4MCV|gXsK)3rV_Sh^$B-FR6sM^*cGd0?R;- zl8re+;%qBjG{Lg?mo6zB)*AqZLDSVf30>O3Hc;>-VmTtyWEb11WO+ghiKjjdD2WyB z7S0>7iBCEvMKIUi2s^v}ah|h&XJ6<|ocy&cE|=yvCr84+8@~RlX)#B+%4hliyQ2QT z#<#Ec3pE9-U+D^L>D5TD zKhu3u_SXx_xl+-gEY9QLo$0D=%@yI$5K9~=r4=fM-bmn5h?>M_p9OPrq?IWd$i968;;*u)z|)lc>~KK z5~n^*L^Xta@@TrPH?w)_Duo4**LTrj`v|nz>kVzvp0WwGn4l>kV=5sU9z=nTn-7eq zd8-PC)lOcJr@7VQj*WQ5@XholuBaz}y&}oIxk~4wy9PMfHJ0g(&-XtG+Fg?aX6siK zk_;gUC--w$Y1uUJX3**zmzSeMSWT?BYBWB@NG1pBkVJ#43Vik z9BV%G?v3L(iot-+-nb8GBrs~QKM5ti@$bL!2g1r|cc~f{mHvDQ8h7S^{iSV=AYAZA z>%dl!an6|O-%gn#YSfmPf&^)B;45k_!9$u(s4A|Mrv?Rq03c>v#N5R!&w#sJx&53B z{o!q$Sq7K_UUy;MC&0T|$w2v2<&g171nZLt*tmac&p$5gp7O6UVf(2zdB_V!!U4dA zR3dt)q+<*^7@QfO5PW;9^8O?MM1Z{((M?W+Ru3wkYD}XBGz>amMRD~`coBI|avSA1 zgkHWUaG}P$2m>Y4;pM#P;d6twV6tBa?dk7|9^{Q5QaI({+)J|0j>arQNJc-vg#VbJ z@g?&d_I5t`y*-$--B&|9qA3*-oHqyJPs8uC2^5tO^pQIAeKGy>7+;;y!L>yVaIWEI zt4w|PfZ_DX=;sQ>s_n+_x8FWZ#i(Kdl&i-m;ocoX;Nzzt680d@pu~j}OToB6hL%+c z>r6(Q=+zb?3}2~?V8`(pmqGy3l@+0yn;U(RafWK)`@s#NsjN94=vK8G0R^tB{((Ba zvE99cvcqj=rN0AkG&{Z-WJoEemeX8p$3N80b$(!0|EXQ#(kC`qpte5TSLG)=p;#{7 zTp2qcfw4^hf_}0vSP}Kq`hb+q?8yRAou5U-y;c-*n%9*b;aHD~*nKI>G)fOqswRmb zn7bz5)3v_70=bqQG1ZJ{cJYwZfC_c)5$A4+d<7hM;5@O^3^U$znGz{{O|@xVb0LWB zn7W3GVg0D|*qjT=OdPI~1zEP2age^4UN=ANRaboou?Z23EA5>>#)b-0_brHBl8JI1%OM84q&0|sm_G%1dL z^@@l)F!tWjkXv9i(8wS=QLAJPX7GOzijpPkQLFIH(og@UJMSbzlSa(hO!I>{)uQXO zLz2~6yW?ZuD@sI_g>g@Uui*)pTGg2qO@VHYyltREt##XAQ(O%TA2tfA_d|fH=R2KM zhQMBpWuN>+Z-2Os#!T+=h7bPDGSTDW{|?LjS7-R&Jt6D`UL7bP&RXgJhVcIBx84GH zPx=budmaD})6~sGEt~Whd=fNyHm8jkc3HsRq>b*VukPcdnWB^s67#qE2yWj7;z@?I zAGUR=!4$VIxZ|R0FC*KvzCN4Eb064su<+NImTQ#8hNBpQpQx}f%mocPsudDau8qkL zMG`v2-e5CSzp;a`6HJNm_&QHL%NiKztNAMmob}USNb>u#hzr`|$ke|!LKiKld}EIt zlto`+?I-+2oY}wn*PtXx)GLdM$HTXH#aChl#hY(d0Jz)BAF!#n!&psIziXKC1x3Fe zdavlDE*UpB+LnD}i-#xk`HrM~HQ~$ARB$&-T{|bU4NT>}Id7hPU+$4t0v5$r}MBEnKh<^|Kxw@6Qd#Pqk5(iBjtVLbsvGs*&kZlkraruWx*mhaow_DMiJGjx#oKdM zb{cH6gTLbNSQfv^vwXwc6UQ`uK-CxpaVS>VC3J`kw!Ey)^BewzNvV-J_vWors*72Y zH#`UEci8_`u1LQfgyQ%l9zdRh2bHI`>HzDA0WxyZ9xGUTnlAe04hwUikcwk?N zCJAS4PE+;vv0g;n9B3pVkrRMki52>2ub6Lp!u-KBR9LFzBQ7>vHq9-TpmUTGH4{D| zamOktP)3c>dwA_nJSeSdC~$3CL!?}X!q)H}(i$@j?sw^2fx$+zFUD%?9gDA|VI$|JhF57A37 z?^!k@KD~s!P@yt5nPx+zRfvJhZoDwy=JnDs`D3mE#`A=?-fWK?;4pY4W!_euM0APr zcg#4#YQawc9pJW%xjV-+4PGZBLC9;3r|$shhFHcIH}5EIqGaW%UO?v{jo^od`&<+K zUiamT5%b1GS1*bf9L~HzZIVr6nQ%GyVo(M_G!8FRJM{GqjI^VY8HXR{e~}XjNgkI^gqzlIC^IN ztMSYA1(i+Gd;}i0v}9b@qPWm=F|hQ;`y;GR_)%m^vH9cbG3M7yr;`%^b9_rH_J`gd zBbc_}j|t0)q)>7THEkH18Gb0jj5B3(Z?*rJ20o@R*?um|F8d(*8B-$eHYgee#ez45 zVK*C-Y?mPGIiDN%Nd#23ikd~sua8oc3=j%=<71n>BaCh}M_4H`!93$s75B5@Khf68 z@|>S2R@1^V4;lyA?>X0$Zu^XJtkxD&FRn8#3+0QD4k)Lu$TzCpyxJXLMP1XBuY0QzjM> ze`8yAu+{pK?wFFsXNEm?=d*qgnsf?Jk0UCLs~quE53GVW2ldlNrjp(|!k){}u?Hg9 zAFn|@M%Ppjap!__Tt-!iNXdJD(Dgya>ABgQvDaZ*5#QX{@|4T4)2-4wGjugx)qKC! z`8xoY;@!9OG3tUF^&YCSLCbvV9_S{xbXA;@Y%(LLAmZ>nk8iBeKaAG76Z!WHT4GoRl=?IDgv-_;r=+9=No$%q=$Cn6_qrhxp@Dyd> zQva;I!2%cSHG+fCP@I2&=9lXKI8*$C67m+ItXUZ=+6s62*A@9c|G-nD^eIYVT@;Je zFA~El&a7Z)ELJLH8vs3XQ3>mL$N(F$Y9V083o28~Fq$MwIJY3pU#_Hm%GwmQ^BhF{ z4QgmY#x2ZGAUmCLNn0R_Eb7bA5?I8VWtvM6#n#wf{y|jkMoBG)+m~XHCpNQ~_N7+e zYxMWa8~ij-#;Jq74E>Q){C^B_tK$9meq}*eM|BO z3D^k@R6jy);q8R7o;S+f_e^2edFah*d`ofn@2_i%UXSzssmJ~YiPk5HGnG-$PW1kx z+=JA_Id^KbE_2yYDHnuKEu_Kcf!IBJf#2M5rB-o1&*t>z zv{${9BRPa}r$Wp8f}CuJ*ZK{+MoTCg-rJ`3Ih%Y_f*9+Ap5HL=-;QoQKP zS-BeBKLe7!>7Bs`6Z+))^%89;C=07MQau>ioVs8Fh+7Bl#tH|w?93}QP*vw;kpZq! zS@1F!vGy;NhD9$NLOj>DCH9nPy!_d5*7KFekgEfRN;(Q+@*ShmP2{L}M3lDj0BD-r zTftvur@kc5vK7EmNhM!IDRrKVDv6iS%LbGv$V}EtCZ@#-1uIj1+5;VcLf3YPH|jh@ z=!29T23|*i_{<_`4O6 z#{gFn)k>F`I{qw)D)^~&w_3Y%q3p_;|MyFOKoUB?)(-nLdFv`Z^Yx>`^l%<)3Q{~Y>D$+s?k@Wv2G z%~IXdMdS_*kvl!2+XNZt^o{8sB5QT2%S(xVfa%68GX5~57$XV;vyB>Mj#;ww@6<_W zBsT@xT>Z+bPk+|3Gl>v(vzMG;MmSK?zVoTmz25?;dbQcT!hQCfC= z!7At9wmhJ931peIW(`*efN@BN0$HS4?X?H~JktApAEqx9E$=g5G6?TG(h?~>t5)%NX=(3so?7{@I1@XY2l z0-Gcx*U%whd4``g4Zue`RA~g#_;HU0h?pQe^G=3uV|;ggxExShN9VRo5fzu#W*fq+ zcF4rNmx1xvx_bx~XY;?=xwXX1oX)t!3Y>nqR-7<&llyPliDoGo&Eq($2H!yOchT2e zBcCSm)DzfP6LpLzKH$H94Ob!ds~IAj-+etDFVQ>v@zoh!qweQr%ZK6)h6ke?ih4Eb z_UCysiky_@+`Mom4i7^)yS$dXQG0V#P}o3O(dj18gS$nK8$srBIRm>e|q$dG|DBYf=J0~z)Thp&Bt zr`+jy!!vI4S9()J4-dgp>9?xW_Diii!hj<6PYh#=LJu^t#~Ouj_*?XRNNjb*+M25U zUGDWRX7y!DT9FY-f1ZJ-5A_>#$H?+CsOFZoKU$=_HK&~mk>e=MTa`&679DkvR^QU4 zT<^-IRPMrnaW?29;OO`mQUwAVs33e{n;g+j^ z1Oy^ra9)`Ne&+&r1N*PkMP9>MuJ}oQs!KoApG2b>9iD^EkHw;_z*K^S+{8sGEDCmj z4$CFG^U=YApEZi0hOQT0)N?9`1a)0Juvpct8}?q0s$O)8b8isjQ0|s^@#gB*LNt6~ z@xpr+O!ontn0T$#5}!Do9;Y3oK!s8%{;R#hZJAV>A*<>auSA*`Pi_2M0fC?PQJ=kDpXe`?Z+zRvI*t2sK6DjsN_Wwf&VU&!z>7MtB2)RHV-Z&lBhyx>F?oT$%Q@ZT*8C$37I45?uk6Mjrpv9Um?YRU)-L&^3Ds1u!cZp=^2;x=N)S&4n zG?Q27#>HXG_(k{GWyc&+?@rj|&M+~jsXSOMw@SEppv?=rp@3gad>RwO+EPV<=n6D* zLclMt4t$=oV+ibTL)*9H7PSMi<5g7k{4G+b?hWgXmtMO=Q5oa$+^;sjw~IWs#yxrL zBOxt}hd0)w0zK>0_9g9ChcOKzeq7;vr8dQcnQxhswN%8vh4(R|2=69H6p1%97}=CkR_|nc+7Ll9<5h#^ ziD3jrMfNyT@Bv5ye)X8reJp)4z2eFkL{SsBTGP4+d`42Eydl(i^i!%+RqADAe$rut zb~Pn>?vBR4K=&d@6E@yqW2LhfDC0~`_6aGq3;=4805w9TQS6n4q=h6Kv$Xvfb;NCZDol1ewp!V;ppLzA>|MAw-p(bh@&R8BLy6v+&l|A&-;P7jb<9RwY-lrCHnNR@Lto%e zSE{OylyLv7HqUogra3iS=Z{vpW7(MeVb)Vwya0#;7Y)6Jjx2MuG(P+hpAKV$K7N$r zAM!3PY%~wo&#cpmtq+?QFuz{qNM|9+hMbPY2b$J|pBqTrhdqUXcbollDHNCQOF{@g z70%Y4WZ4+Dqa&@C>EW&k*7pY3p=+C$?g=}{_X#6!)MsWu222_TlM5m7g$^6T>wwV2Xn%}=Zk;D!6E!J3wEp`OV= z0(aqO>hzN6or{?2;ID>tf1CrkU6h8lSBsX8ziCWgr}9Uv#?-M~C_ifvImyD@M(#VC znud01|6==HF%GzyKFiP+iKIu>ZOEPo_;iKPda43vNveXK`%%;p#!eI^P{^&v(3`As z41?-ng5R{$7b5A?lPKNV0dSX^*b%PP`c(Hz&S$#=B@Fx%_Cyw!Wsw;osonf~>FiEx zoW1rl*y%>|Te&u_J8$UUVb=JJA0@7MyK9CljenSBO-kMX9i!@6eh)V5xI zx$|j3yPu$up4i4otTQpF=YAT7vPf-~+0A(o2)ZTj`(0TEB!CO}BktW4>yOr_HS?!= z`B`hcx#mg8j887BwC*exy4`mw8bdi9?gh>HhnLcELKgQDx=S^nnPa*P=A(&WH|e2G zd2N+R<&aJ72~sny@@$ZVF3@c)7JH zhOTvS87gSsYe@FvsKiG5vPl!%jlOwFZ9qJLP1=-}3W+6rT31%?G}HNncAqpql5^QT z#0qcFFd2J6V>FYg>5eJc%cZ<15zEX#^zTedj3>$Lpd^V0Qj#OS-8PD>@L4FYzIUZ% zB;3BFe~57fVKvU2ZteechE?Je5~ zmczD(F4$EQA}SrnDt9sGLc)Lur8N4xpM}6fV+y&V0Tvew3dx7H_m|8({6PX;lS+J; z@)aK9W3?X{h?*D z@a$?v_p&|n&6Gd(za~^SYo{1bMt69O<89bd4!eb2y&4ecvBq1W{#*J1LOPZAxN6k3 zy{;h=?)c8byqtE8-{U2qEq8AX3SDD)M}x)FC?>C#xg^n~D;0PYcy^(If_*Fk_muO* zxyn=Ox<5Q7bLS>O^vqr%3W;1`k$2B1ta~-i$?u}NBM;UWgK8z4&DU-AfR+C2k1lsc zc756fHnEeXgL4|o#{G+PG>kZt!zQ^nHu^ro`goZ87p4n9ugmGrI}ErwA8o;6SIRd~ z40dPV&G8f2#%yv4q{6rsLg|bSWoHIsT&H;9`kP6ztTRC*&My+IV!>w` z(_LQ$p3I0S_DMwUlE)gMK0u1MyoM`8B4H0NeK;i(KheGQscfWN@1vqzk>RhfCB(TS zXAili+YCeEuK4MOZZMoz7yDym{`h;pn@~CC?v?E_Xhs_(n5|$pCkUS`1os%`VDB%x zaaXpZ@Ff+k+kIE~2n9bI4$b|!Yby&9*(nQtQEk-vYKe4AM;r5XF|;cH)A)T+I)sXE ze*6k?>nuI4JY{G>>KmP&P^ak}LnoP_@3C z)r(v0KKPogV{w$&Ac)iKM7FV+>zV!4DBFGr?H=1(!L!^I#z&NBA>d6+Nlf){P8?rv zNy30seRW&!{kl&P{MG{sWGkDWq2|m4`F^HK4QRL!nyWS(h#zfp5wJWEP(-RKok zPjUU+!nH4_&L-J>Z<)5-L}|&#?GudzXY2TRz;uZ9PUkrXf2~>`UaX^ft=3Z!RYIT% zfH!_H*JtkSJ@VTg@~l%{&F#1UAP*d&nA@O}KvbR&6PShWz1gf*SB*4FLwTAQM>eza z%|M03hVRAM_L55bKI~YiW%i`X!gyS4OeOrs3*wJG*ta9+Hku|hc#$WL2F4!0`{8wC zsl#4gqZ^pFOd$N$M|Zgsae+7sE-Su?UyZEbQ}A{_bG?Vk)+(W@5?y}8@RT*(UvP@s zs5Nr`_FF{m3~dB&QL|tBi=R+N9|=_4C`eUYIF8|gQW^-%%S&S@a9QBrmBM+E1 z!*0n@(9{l*Z=5!<1{&}-rj6R+-?PEKO^jno*#Xd-tdd#HbAj>Eu?PciYm=UYpdtMm zN-3Pb$I}(g%9CCxzs!rW*q2voC}BhLZPei5vs;6GkJkI6(Pw zB6vZy3@*l({gUv58P2o$#O?WTHDCbJHsSVD=)Jx?{exVv2)bYrbP4>HcD^;dK#~v; z+Z}B52{T(!LAgMFN;wd2BvuUQ`YUgv%*hR^I*P~=?R*_gcM#G!*{399^{=HI|Cg@-3+H!=+JE-qf9gp8DWG2~Q~8?Lx$kbb z(gtoe3kM^BbbM;~|7Taq@s`FXU zOYKCjx6d5@>5YJ@o@3x~JZ?`V9=XWD} z5+G%A3mqR)uy7!h%p*8J9C}pBSh#eaSSsSKDiU?%>WGJCAReHnfWo##-B&+v*10RV zQCG;fCizk1J74He7fp$g|3YF7y7XwTv#rM6`LLQ5!crzQbS@Zs2(#%gye@V{QICsD^3F^{erHFGG=NQOZ_+9UQ*c)Bd7bXhkv6b&pl#9% zK+ol8os_44+bTNx?7bnONAm&qLy0yjt_EA?kEUIsL5-rrb9ru-Q{Iy2d zd|~NNlp8Q$3W|P$@?#j$pNd`o??A1~*O}1=XT>*|h9`Uq^r*j@y;vUb+uM`_wdz4a zw$Wc!J=HJKhgL!T9T=PeGtiZWL|3VRGH!FpA`g<93u$%o(T93ZJtDFjAALm7NxzqV z!sQvpa4!x-^m^e2nxAYvW+8VBW=-DEA(^ZkxHNwA8Q=Murn_6U#+mRkCL&25+s5DV z#OF2qFT}8zmU!SDeBo$DOKImob7efUb?heKrI*cmGr}SkG-O4M)z%()phAc<`Sxd5 z6{wV5qj$>bYFM#Sx6rw)ei^@6Y7tcj;=SSvwfRgp5sow}NEf^Qh@m)$G0GSph+j21 zwHmngZSfj{Owz4zh8QZHn1de5?WOH9-1%6XV1JH`@Y+rKJNo-cK@Wy$}61PxqvDpsIial1e z>5=hS-r#xy8$98%Z20r-MQ#HLWv6A!ZNRkp;81Ak%b5J0CVY(^%8RTdKMr=x;8~5O zyyO~hslXEFlT_BJgWVAR!~6yMUL^sWaIvc8{5R_Tgo}p|?Lp8Qg{$YIo*l|W{W+T5 z1nVc(6kl>`l?{ge8u~$gm1tc&Y8vM&>;Btxe$=LRxTk^RMzEb z{(Sh|?Gd*ZYR~Ol>9ET>TUonB*~c^&_m4kSLCR%(cNnxi;3K`Eb5rYFy7v5iB-pRq zy5soNfV8Qz7Q%iB_a)q_AsA26uzjcP-Nkl8@nGuXIM(CQ@QeSCvA2wBtNq%2kpRJy zV#T$%7WY7dLxEBXEp7!$vEmlotvJP9O3~u(w73;_in~h^*gX3^|9$p*_BiJ`UoyrT zNxrN#)_vb|&fj%iAz~l-|ApQ8uT7N30q~vB9qDw%|Nko5`>$!F5h0p>_u7~MZ{k2z zAC8Hi^<=@SDRdz(l>uyGC4<1~h6v-f(2y<#ql{cw=ixD@PI;tY_FiC4{`BSp+@lp$ zDR_6SRKIRjPIbD-)i=-c9aiVq7B@!WVScu1sx?w2?-YT}r`8g2Ukx=jS5;2?lAA1t#>umIY7>&`$55F9e zQ0nTt26_UTH?Vq4n7ey_&0%=ydCQECPrG~orGKq^>Qpy9A7Ay0M*U@q9;;HV1*aBp z>6c=jZXo8s$=r&h&&lc5SmTI%cvE{&RgpgK6+sG!FO|SaBHz&jpIPX*{I7y{Z5>LN z*U;%o`~HfbTZV4LxXmw19dDLSDuy7R940dod|F&0_RJ%z z%ebv<|f~$v3@>uDm+WnqVZ%-mM#$HT5>}?;V4b6uttVF9j$O;Jvj{z z5hbpDdeakhDl%F?x0=sgl=JR+lFX0I$_if zAKf#xYz%A=vA&PgdT5*Du4%}ct`<3Em>|hoFKmdq#q9O-B2(}!@4tR1UnfHpkFHGN zDO_Lvk<&ZDb`Ixet1naW6rH=)nS$rWzsvlCbz(1DN%xGsny4AD3^wMsCZ_<9!=iJ^ zd)3j@C{2Frd5LrRx>lJz5fcR1Y)dR%vie1W)4S{={e?S3U;|y*Wg#n-gBYvsz*OM1 zlGvb`B}B2CF3o%Kv=ja^HVOqWOgKVhq~!V%)Mzg5{+S+Q{Wa8sD7)K>_O@9b`0YPl z0NovDQam)^TlMGh`6ViHA-mw|A}XvUld>cZDPFUQw>nDIi=B3JNgBibh#v@=(@+gXbo_^HO+_*_LzeiCX+#OB3uh-g%0SYaeR2A z8Xt_l`6iMSZ*`^AuTGU@m|r>}=x=_gAF)uo?VTcKCtvcF*5TT2sDipCvnRLhY4DVd z4oPbptme~MqEOuMxh(f9o49w|06`Y#)dl)RskKige%V5GL;@BDWY1wIWV`%UAhVV+ z*=B+b52Yh-{UCV`OL{6`2Sf5O{K-K(x{AcX=!(uExT67EenOnUW^Ch?s-q&D3W#)u zc)ku?i+>&T+XVEu=XW6EWk~Qs#}l*8k~6rs;23AHT+$mm_))Wjr*mxS`LCLISEU07 ziR~)-&>LYqYCYWPHewKno&S1wFmXQ@-}2Gu@P%vk5h0ZJtk`6MNOC`B@b;gZn(y;E z=$FN+dP2)&12TCB*#z|65{+3wxWQiS$?0_)0N*2A^kjYcW_ME?!=iCFW zCMr+wBcV>MOg2{bTE6fdsKN#+wP{}V{*6RWCA?(7EsZwxh!LmsvB?%zr}*1tJ*~^f z=*$GaerHe#hAHH@ZaJqAq#YI*(U@h&d=>(A3sfs_$xecMuk7GR|G*Bf!oyl!kJ*hS z-lU|G@;*liL`C}`?Z1fI^ZQ8T4iH6(d2~ zy$b^aeLc_<+}89XF!!Dc8%}9X4Rli2I%I3 zQxGI6%+rm})yx8-O-%#2&tDV-D)LhB$s`|u-JvYb?qODgW;ng+P~VvB^S5-K@pEde zK0fo6R;6lbD4ICTI)}SlH{TwF7-SqU$rnfyx?e7yq}>~D%^iw`JoDXsBMJcZ&jhM< z?#1+s|NZ1hjYHJoVgNeRRYfE1tN9sfPPg`s$+n}HWM5YKw~N_+huYV@6eTR`2<+d; z>0F^R3vw-VcEu;x`L`^T5b9%NjvH%jRr7p|zPs^x_jeA479%51u{vwXaWUAKj(y-! zy}(b30|0g-(w3OBEjK}ZFDro@{kf>2QD#Hx)76-uFXh+)VIP10U&HHA6#sDtJyT@h zi#nJr|MYUR`oPEwtRo?3uArhfI$%WEyBG*DHK#8>r`HtaBs*F1aJ{zzbkdyBIWXv*bdsK=l3MBN zlh*smaXd&jV!bi|tSKq;sNZglb=MbL{MT{Dzo+U_B4weNmsZ-O$C8=zmGJU+RWm2L zfJ7VcLS^53IW%EeYS$slaTvWFL)aZLF56NuYU_%i<||P58V;%^;n>|)HrODN?o>1| z{L=AvWjh8#*qq8T4jL^DflqN*dk>4%xj>kjIo)+@z_oaCLD1Ed;Dy)|S1D%9XTte$ zm67~B2L?})91v(cdlG7v|GIa43NyU3YjAt<)ILAD!#W|;{|6;LIc)+_HsPAC49-;u zd8_3V=GFnFuP_`bvr;TZCJmxz$oHbIK@>qY;lG|@eY}4!UaY)nB?i7>X)$_CSznyS zw!MB4B#&q~T1@uNHa8GLB%@Dct2PC@JzJ+8>A>kQ%U5I+qaZv7js8qHfh&ZLXMtIn zHECEqg2bP><_Uz}+Ii{BEJq~w7>h(iy9Gam*82OT08T_Nhfd0$DIl@CJZS)*P(M7O z&f{Lc%&F7>e!kAMQ%PjuG{t7lD6>6B1()G41bdFNhdffu1n!V zoZqynJN03Sv)gsjKJ%&+QdH2e1nrC$Fy!UT$cXh8j~AYfqKEDP`n;Gak`%}RLe9}E z9ewXYO*^hdZs~;uz&U5%?QWrpl+ETRBr*u%(U<4Tn{r-5r}d3xt+l`c>u;5LR4aOs zZ4LDgy9^QQfvoKnVTWNwu%fzI)7d^%#IM5ZZ!>5(^jXQ794Odu^-phbT~NDTXW$Om zL&QOm-C4;V4G7MAO@SOqmM}=~(Dlld*L^D0yfzb; ztdIN8Z_W~a`vLCZgdyfy9Fn@8`@+1n^`s>&^dvM119^9k<=7~T@T{+z`vX2-lr255 z!;!~8mtfc99l@;h>8unA$9V&7DwdnTmwzwfS7>nuf9DzEjoS&nhQI6Rk%4b`L_ZlJ zjK?fb&$!5@*9KfpCo4pD@<_<`oeK`OqVr8((BTx3*B>}Z5GbwkBL3ii1)q0G7cyk8 zu0M;hlh_bJ4;evANq>dVgAw7Z?XCR~Q#HqS5 zbETCb|7D2}&$>rvn-c>t~a*&aW^jDYL%oL&y?-fV~&onlm*^XyBLVwtU4gUW}#UT-vd7V3$``RZxH zv66OUFRNS5o$@?tF>R_I9laMaZw2p*E40cQmVY66z5>}_+?D%w=Vx#AZ#f39?rVsQ z2I1D+La0rHt;7R)Hbh!Px$Y>!vm4y zUL@V%1(wAv>A|w~470t5*XwUHca7(mEBxc$y8W=??$7%5(O%CyiFPJ*yzjIbCtvxl z3w&l<*c$cAFwyTYNjj3MVWzAJKFC|WxgX_+22N5&@4D*Vmr@=`zhJT6Ao)>AQp)@8 zHVvcqlSJMe%sUA7%vKs}S!K3yQUL)XR*w!w>Q0c8z=N~a7%uqog7nnC-8H?NpxE!z?}iy^-oyi}MdUxtQdJ?oPlq`zVDGcf z$W(1#{JmZK3+392C#_1_XysGwesNN7oIhqlf6u{1{l>oMO)G{{LE+-}swRt&eF9(l3{$J>{C6KR`W24alqctc^oSP2=z(9f7LXfF#I)i^74GQc9kEhSdj zOBqo0OIw3jvbcxLQ?0!awM#x^Hn2QeX`>zqjUU*nUuLiBAl_B}weU(cu{at7gqRPy zGns3p5MI-CA3FX(x$k4Z;4^PVvl24H!c@>Vpj3Gyi^MAkAXS?Q9CssbSA% z`(DwK7hcEZh4WK}fRD3ik?X{w7f@n0_eD^Q+9z2V*-v-+5qd4UPdSz|Xc+6n{lw2& z8^SQ=Xr81kLU9X;qh~J{x^Ufx_)o$}Jw$)x$Ar2|5Of=<_pywdl27zNcCF!?xbVMp zt~xz|Ib-BqcyQlsM{2p+pW`An3(bLDw>ZxRC%aD7sWm$RzL{~ccGcg&zi^i;_>bF64T`s3$w^6*KH#pfVLkr6s9LYQWT}2w5%77A{qSC2T14ot zthdTgy=Bo~EUvjcibWUUGF+1@>Zj(aGY8rTZteYdaNH00h*7|JET&my9yR`}g&XDx z^}j7=A`T}PlGB2TF(39st*qBKK8RTy1^VH3XVmb7A=pj6#?-WRpq>R4+=!T-IE~xi z_z=Xo9^|sYeAX(3PePt#!jB@?=x7ihBfAbPkjw8*HW2^hXNGf6&dV>eTy-Tgrw_lWek#Z9p6^`MLxqg`aVN- zpZ}65S-ErMz7QOwDe~|K3{nRJgEZ!q$Rp8DZ%%%josAz{x3@>sW0SiU^MMi9DI&F9 zfQ>ue!?oGzVxkFW8TWVV4_2<}PqMC>9E6(O*TM3PC$7m&Pur@1F2Lml7uI3Vs-DjiChl;C(la^h~{Wch3;nk@p@j6D2!6 z={`Zm!+)7A`#*q$!qAZHhX<~Gtm;48t?jK|HA0o`dAZ*Ni>GrQq%E|sQ{SK(^h-S# zYGAl-Fv-rAQoEG$rK-#dkRJF`wH{VQp^Sd@`GJN6q}?R7XD4qac2Y9J${gONC9l} zcM|#H$qLZmkNgz!HOcU>GTOp9{9efMMHJV{Ylp^$!rjazB!)6^Dqf_cjDQ-x=)lFv2 z6SFoZ6-!=%jTOC^K%N$}u^YzrxIDRzXTob8fp-@*8$QQ?6>;alh8Po=%hbz=u|=X{ z@e&R#nDjI?>ui`;d$ksHxWEh8ae3*R%L?!I%RDE!F#WXJIM zRn=TU**eLCEomtZ05@(8q~KdOd3d#(HaeBhy}ZEk$Z=ju$I=2s{V^sek6pldRl?SV+GF!K+HZ3Zxm6HTNT4#nxasypxLX=&DXy&TH^20^+HNHCo zo|Me-cK43ipN$sG;XhHk#J)8qeo=Oc|5u{xe?NaDfl7P}%g*Kgzt0{|-*%pa_*M4H zS3&$4AW49QgzzF~%MDiwi>zFdQ11$us)eHKZa4d+F39fdE1(7h@)cbsJT#f0!8pM= z4nFV}Qtv~CoeWkB27Y83V!9TdOkyQDqPI?E*kb!udFOw_IR*L*C&_*%B+ z@p)1i)lX&6HnfVYFjs?Zi~8=R&6p$6mXEArO;TUoS7%;ECAtt-Hhb)1D!o)vrZo^1 zy6@9vI0t%0gpFCvk7OPjhtgNgp&VR1XN&>ZU+}$RT@nu+C5LtG1Je$@hMTH@m)V)?3S7-9UMjjs%r1guNO!bDJ`m z;E2v8eUEe@V|t9LNMXQ(*P-yM8drmWDz_RBa;Q&juu#QB$f6jbtn|-yVb&crj@ilW zx?XB-HaN7ApZEGQQECT1uikGjHC}YsVFT)(z{!4zr}P@oh^*Tv41CTbhYW zPJ5_nvr3n6&bCeIu12xfgv1B?DVGHYJn)9T6_s`xv`(qYpKWCIR|yWu)iL)f=QlIV zMy<;Ib_twko6NSHe)lwjC|82u(7g`14#;O!e(t)(6b}8Du-O9c3s0(> zqd{#?9eYRNP?rq<{Nej>ovIZPjXD3EO&Pba?d;Y&ms=UUj^iq+#s*}^RXvaHBq92? zW<#NTMnW(B6y|Xfi^tE;yx$ zZQIjLI{k%aWv6Nfz>eO`=kKqNcgBxza}>m>SYrSmj*5+Q>>1$88LDebi&Fb9c0>27 zI;hcV>$BXXHT82Atr`Vr6%r2_P$gr2BCk4Qu{?(wUXj5T*9lyxVW&){mW~uxKfL+= zs6TXU$uyz26sG6;L|Cy^G|iCbwF%_Qr(U6)Bv|V|!V#(Bh-ZktS#Rw#f96WEeM+@L zIw2J(2Y6Hc;3b2Ve}FMfGkcF6#TMP|h1bZoWr#$`Cx`eVV-d=BSBe_~><6%6_W)veU# z8NozSg}fFHc`3G458UTyv5zq6tF74=?VF5$w{g)0U|g}@=bTLVHbz$%OI>WD1^9e$ zC`0YFtW7Dl-)ycdi)fp*mCws=S?yK#jdJ|4JQs-1;49`#0gn+;${*XDLVpOdBECqA zhBMa2e#}Xr?UtT34?L8jG)Y*npS$61n=`7tS%u{!%r(d%GCMs&FQQJ!y4||L`k@Aq z?<9^d1eIP)oB!H$Dmc};wdCyx?(o!8kAEa}UGFHde8A1)q#y)zaJBDLwHNoi8M165 z@Q;Y;6~(N0xqag<;bs__l55WlH7KxT16I4ZE?sKIxHkkH33?2o;Yy zsjj8_)FF!j-V!uCw>e#fx+CAo)QVzucxA-=Zl99>DoM}C!{qC9?Lz|9qB!+di%6u% zrTHZLQM@47H$SuYmIJDctSg~0D~jrT3c+kh+=ZX7Hu`Qw)48tD21{D8e0hJ&1;{A( zu4{~Kk93{o^@YvS=ij=K^&y^ruw(0VB{2%b=gIL5>S+GXM7gz1cKNMbFoa74Eylm` zCI7hi?Bc<}Zs$@pgFV@n>c4ck1F^ruc`8j-4I~anhoLs$4M4cZ z*WQgJIJsu&RnKTVxG^6H4HD-?P)~!%95!jlnz?8vjKqm~B{bJVE4C?l;RL;DG~}UY zW(%_1fYJ?CXnaJlrX!<7bbRx1A&d9qc~B3Ma}96n{V^Y4u=BxC|1A6aNW#!DBjFK* zij>Qt_+VjNd)7GtFhbZNOO2HXv!wvqv!7&9}*0RJKtdh4b<)*Nozu8 z)-MzCn$N01`UY;Yd0{ab zhixx?X1*eZ%9qTYuPkgBS#Q4^!f{3&lHEsgQ@Z9gfAu0~TH34Q9%Tp_XHw@#gmW?iyo#_hjj7*4ui;@K*x{c^x-&Xt}tbVX+=q zjGZ)anGSwG#{^j4Bj(mu-J2=r&5p>eIgUrZj70yj_=^&1}q$LY=_bW!_*$ z%ho}N+2;k8!7^1VPdz`&P1!ViU)Ms2cp!GQ!4!Kk2ijn z6I9N$$jH^p(r2+h)yT zoszp3@FqwMoo#meOm(BVs*$+uO1FH7moev{(}Ah+?RoRayA#;A$OIap=s{4{R26~d zrrHw3k#mhV2*;N3{y4lc1XHSGP)!hx4>VHjK`Az`P0bZ1?EFD@svT^W(C*qL!A0oh zjfeQjKK=nD&gk}Pp4R_H3B+`U<-I2WM5&ftB0&A1zzsL@SbDi~THjI+0>I3JnBt`V z*x;pn8ESRJ>5W=Atuw19>?O3|loj9oIsV4&V_+u}o@gG+#;a4!JZqz2Mv@Te?0i{6 z);hL+K2~A4T_ka@)v3zzX7sLUa;)Rib30Z4wiX!kW7!e@Z37|6(#{0An4%N!M@0PI zKY$Yj7oy1ya%s+FvIpN0L=mO?$5Vwvv_Bo zFX+*PDlNr@Bz8!J|4ux>J+Uq8$3Xp%LfQ~|5$*Z5FaYBAy4d;zMkct$uRCkRA}r~jh+++8pmwWF^9Z^59=@{0wrFW8*8GHeY=We9o z&AX~)(R{5+Ai@Z889IqgZ8o)9>(}`*)o2sT0b%0pKB7JW{<+*Jy|#8!qZYN@{|(r} zn3&8ko;$p#D0pVwTXcxbz-!Mg3*l>EG4>tlyZJ7BaABBrwRsw9bl&7}Mm~KrH_=_; z`Qy~{XBq6~Tzg)_%eSpl$74$n#0M{{d4?-nCxp1w6y3k+j3qoU{C2!3p>w-+1gmMI z6%su%YJ9K%H=*XzYLEo}Ne-4<>l=C3N+Cbl*nM;G8P2eFdD! zpA-7;@?6>98vJ;qYn2Cmi`dKNCD%}NHe>@M+U2v;_byoy-v z;v7yr4taoZoC}_%1jBxlF(({0GY_1P$J|{~bEAH!U!pnVbsw6ME9I0oQJsE2vd|;xAW$esXq?ZEnA{nck#OGh8xXhelr>B z>ql+`8B&|+Uj3Z8jrPj0bnG@k`IE{z(1u^L+hW@gt0cpt`*(~#wP$Us;x zvv|2SdFVB!@%PHxIgh@mJ6b-qqif`Vt$#>u>Bp^^U;o;@Xw2diAYpkDoVhaO_}HV4 z(K+NnPi28r_gn=h!b=Pl_ER4B*cE{>(wetk8HulGVAMCI7^JhvR;ke-6hc6W-0m_n zI6r%Wb(WM7c;u8mgG)U_vQ>TJiAr(Q;P>Y{Z7z9e6c5^FTniU!X%{XV|#u21h>DK0{-yE4w?%{mrSM}M(@(v{!W`iH28nrEkFu#q+B`t`P_ke4rIVtguaU3 z-tu#GPaIlHs29v4AFRWps_~{zd&}7qYO0y~Mya&ul7rdZuy!LFXu?lQ0TpW0F}VKi z)(1qPaed5O*8Bd3F!?SS*pLrq{(Q%3pEHz+!XO~Wd|5CAm3AQ1pl0rSErR8h0NWdV z(UR)M-u}9W=AnDDcJ*7eAoq@Bz4d@%>`X>%p`;&q&+AGK{ z*$VD$#u%2YIECWv(hmOMiOq5m;ZV#Jv??F0lE!|L2e z)mjxV(@*IQMCC3U#Yu0}eC|SPw=zn4?w^0Wlv%<8aHLM!46K@Ps4ccNB(CV6afqTBqj5-F~=^Z2HvJ$zpc z#3F62I6kvY2zG1;!2lJ(jhqMW1oEd1j$&U2HF@U`HO z*cHSxkSZo)1|avX1QtFTm*?E~7SrrVB;BGE_=LO`1z&u@GxjQz2jYhOvd|E~nzkq# zRQ#;ohkUz@!KQXyh%pR_c%z$*I+2auwaQS-y|+N=?n~DC*nzp6w+J!RH# z#8Q>I_w$` zF-e`$<0D}&aW{DIE|++Drh547+8ZvQEHYBHRa&X(SiKT(s}vh{x8wZR_+s-bt=7eu zC)M@%huGh=Bl41<0?c&UBX4%HL~-IZ{rU5-B_9q!VV>Bh-BbqUx!uYLj*cnD&ducK z=f3y=)%8#MU9GN(1Ysk3Epo}--|Zw6oDF%5p@F?E_HJn&Ll<`uQs1zNXr6-O zy5?`7p#bPQ&uV}0szy>5Jf+R8j_P{EWZqUn3slTyMxzcru#ASdOMw@px(3XRIy*RS zm8kn#V>FN1d2*^-hSedd@*!SntGP0l3ZeP)3D)hEyCtK!R2yeHQDz}R;cPB!Bfs&% z&!0$w*qO^OjV4KNMSAH(NQP799`SQm1V2o=?0R&2r+xCS13&|+PawYrhfI)ic|#FM z;IS9IX{KoOl@jD{#5ok<8^6o9T}5_P?7|JTQ>1h7$oz4N%Pq4uhTW9OwMuS&Y%9kTlEJ2$Am9SwB6pKMBI%S!#~|C87XOd zBzj#EV;vGG8VURHXAfZnG^Y}^9{UMOWZ{fO!PM7wLofTadqwi+Z@&sN{C#ysNPNM2 zt*Jn5t3oCXz1H%-GreEr9{ct$(A)o!_OiC}DhGBVDB2+MuNZox5$O3O)+YZb5G#2D z3%pQ%p}m`~^y00zT-d{t1FX*gyN3#0fL}C&Uk@WrJu5B1q16tmXuG<{s4;GIQ3gg; zGoi0|IZ?SwW#CPK%3z|%sbM~<&VuHr-7zXZS5F~ib%2NV6KuF5mvi)-Pz(LKgf=es zC)BsNV_iL)&-D9;lB}1qol4|=K2gsd0M`YSPCb#pw>&3-Enwki@Dc>oMjOAc1)(^La58^rN1< zXaiu|eldi(ssiHcau-^_bI%kN9?q!&t4&g_me_g3g#i-R{sDzSEHSWzX}HuHV2YU- zI>DRn3^tBkqmNxj+4G8`qL>51H=*X6EfwXi^+Vg0e_I?mn8hj9(SCOx2dQNr8eiQ{ z#zCETTUG|6Z>xf*e6Th;!lI0OU)CzATF3FCRRP``r3Th+$o$wCe_|;=qSek=K!G=V zy`;tPP}0HJP_+;8XPd|5G%>$=v!{llcBt#6@q?8F3iUCg__G?r2fFsErWZ&j$%mhj zjm*^45tQS-(}+k;-uR?uAypXvrX@DH{!h+9g&GU21px3h2ly^K1g~@z8n^|ky%H!a zlKfI#>pd^s&%!?_`yLkiogk~9hxh=hpQIAt!6&i)z!GAlsKvs#+%Wm4Y~4U@Q{n-R z(h+OB;;_qozC|RzJ%q8T`FY9Nny={>WOGpC7EVBTR!Uq)AOG;CzSd=N?Py7jpKfLY zKh~84h^JYm@HAvH)X7xgNOpp#3b9mjsasrm0P2_Ei01A`gFw!;mLjh`@tXX1hg#YG z;vbC|UH3z?T=PbX1wR40wRpmHYAe(T7qx4*b2`2QK#|{l3}qyOJ<@Dpn3@GY$FSne zTFr%?=2RJ<+n^=1!p@p;CK5i0M#7=rxI|Qm4ZpM9lq)w+MoPwBaoUB%Sg%Z8a|9m) z4(*Yol*cw;sE(z~VX=*g69s?>CTS-X>OW!L-wBc|> zEt7Qodiw}V4!gg+ZSGDkF5$}~uKDr+B$HqrFk{E>j$d^Et93r#F>9hy1N7kE7}4(_ zCF#a$_0u)tGiBPB2PfCLdN*^3J0l@34glIuAVz$_@8`;9L3)9ro5Rzpeo>1x>BG5*wn z$pzj@WnrOS)Q!*k@jpMUYJ2?e>{p&-!ycfNAndi9AYYB^4!e^@I+Q4Ycl)V+`6cC( zxd3IvldTSm#K(n^3C2$_QPOMo+ZV!{Oachr74smz(FJ{yg!*3l9aq~T=8Ln&o`<(G zDDIK(-Ze5o66Sd|QBf(3l9IG^Y5zhp+WK6KuBJ)Nw%>vdcWaD7vkmZ7VAQar&xt*& ztv=bt(!>+KBkhFWKe49Y}wnrY6>0goPWAQi(CaOQ> zMR;I5un`7O;jF3zvr&5`tJbRGW=6H7-hTM(e#t+2%4dnpBJzUKF|UWFhHa3+zIGN@ zvx*dps1h@&e_o2n@_wb&}4ZN>Fh!)4}m-in@33CvYT>BfI;*QVJPGnv_ zqE=hP-cQDsO3uE}RXYv6V}19uXsB}NbieE$!19(MrGiy4xSE{^m?SL}PnFz^?GkP< zT3KcCGW_U5vv+?c_IXT;W~L%30&glY2bmg7do$iVCJCPKr4Dye6_<0P5cTx};{`R= zoZ#(F9dM&V4up&8?c{(1+b>#91!X!6Y^|wS`{psy2sfZVv~ZcYN!=KQ%8^IYy^eWI zd?-{ecUdj+>ASvY8hD8wfc(@+IK#Sq)5uPi)1gWOIr=uM$?P|4Hm!QSo%w$#>;K;y^|2FR|Hk9-%gukQyZ^WG`2Vf4 zUXJqfyM6M;dQUUui@H21jC|Y!`dj#9hyD86Ml^{>H?9TJ0ikIY=XlVnNfR;vaG&Er zRUDJ_vaIL>C|-e13xLCsK)-k}g>2h8igG(G!IO~IpSQc_fnQ? z%acmDR440o$6vCaBMj~*w_!nhzADf{jyKReQ__E#WC7Bhmp^GH@VCP=eI^I7IP~;7 zwsI@59E9;6YFy^;c;-qQWT+!$q<@rt9Xf-jyH`ABuJV8L;8 ziKDE-s|&orBgC_cn_KaDHGWcum)g(d=|72oktoqOUTuL zw_Ny6SDvG#M&tC7RU%1~7wENNo@*?QH#qtRXLl-*<4tTUHTs!Fhzj)^pz!)}aIdLE zfnR~lx6JU_<-!s#N;aUEKEq+xl>Vl(jACiQ^t1YcbuPhDjo{pxrCFdKM3oz3IAz_E z!t{gmt?#A#y?!qHAvaH>)dJ7&(5~%Bd_%gh%07B~R2MVY%6zLh#!JRIlR;{*6@?qA z6_7zdCm4wlSMfQ|0n!`hqTGUtk;|+WJ4SeAA(A+;^Lous>O^*Fw@@U7h^lgmlv* zgJl+%dI~iZd(%NgB1TqZWd7||8oxAmxGA}yBzx}>xjy_O(e|COwe&RuV%E(%(qy3h zCvy7QhkRCaE~3N#7hOUv2ba;l*Bkt6ew*npdSJLE`F%< zT>Ra%Gy~i{q-rd;dfXfJBIBI_$(B;pSg#fr6S2C_B6p-)B*ljO58R1B=dkT8Mo)2h zw>|Z6SS$^0sC|AMdY<`PLG=e!*ZWP&!kf=_kVCgWJa=_wbPhQ$1kpmZm%ok>g|Eea zUf$ObzSMXktqm>|lm?gw2Rz=Uv#yeT+;le?C_1_^Yg$dRy_9&JF5)S=mpZwe))?`Y zjz9|A2-#%6Ea;xrh>b zMP&)-a1u;&GrHC^`N4|1CuZ&k|#i5xl5eKRC;=ZIu&JL%*vc@%$ZZXEcyvMt~m zv$e^ymX<#)>89$#<(WrY7&$?G+fLz)DEkU7AH45a0FhkTAoGjJ_M!Lt##0Ina%Wp< zO4na~(Q7Fv214tE<#MdAbV?AtfXZfDsV?rc*DIXiAanW^IQ{(OPi<`b!5X2-sAQg1 zBR4LtZRcJ;Huv7U{_SdaX&}q1Qkh9ZleV8Hh4#7FiEi zUF=nX?Qwz9CbTVAS8Ls;++qq(-a9kNdV!QY^G=#VFa1;=`g?SBY-u4pCR8>lo_HO9 zvQA8Bf{#2C5n1;N)#|wT-(?7`GY@#oXmD;Huy*LY|wr>oL>?|6TQQT49w~ z5m_(F&j-}oE^=vGl(ISd%t-qF)&ojMXjP>#!cV^OF7za6o;Swh+H&3YCT;*h8S_bf zeHQ#!am9cT;U2nYvoge{ESCOxwEF53Yj)4YQ&9{Hy6Lx8aF&fZ$aOl^>-IP_nryYb zr-@VMbb#ADRtp8~N|bvta`u95Zil|a(vOEJAfzGb!eclSS>?=9~g?lkH{P|2a>{y(8^7$aCR1?@Gi`USI^vxmsLN@t z{XK-kHM@&^`XNB+r<-q*;BNnMPm>P*hV_y}l=NV zpq2UdQiefq~o^QttRU=TZyNc zCg`lRylkh(H)JKbDzl|6>N=x*%I7%vs*8kxoaXsB_m*hko2>BP%_s5D+Cur-IvSxf zs;WaNXBT#NP6GZcwoYxe+u&Km5S+K<~8eBFZ=Jb;>zeJ^6i;s zkihFy$+R%WDz6E4L@o`4m%cGppd`cx7x*A+hI&QisyufiBdbh)@A9|Nn#3>l@T1E)VvX&lh_LZ536;Hig9 zq}Xj@-nf%6N*pNe`Hq1Mv_YAy6G@G~Y%FCiL%&%PU5x%nca{f85#rQV6UhrmF>YEy zqP7)Ev85?UZ;2`biA!}!pJ^#y&bx2dn7gqXMdHW0EX0mS&3Q^HUleVot`3dsgYMp~ z(_(27zNny4Gwa2Bqts*&H;rud6)-kf<5;JDIA^9FzvB(xd9ZH$&OtDyGhj8>4>w5W z>c=T|x5r6AFw9h6c>1dmY6jXApSBaPWsmRqB=8X`3cefP#x#TJ^?H+kAD#JwO|ix7 z+#{Tk^wdXMxXMA_Vn;NR^D(|A_ovv_qbE|ZXQtNrR3DxUFEw960$}VHR+wQAOKv2{ zKR(CdK&leDhvtf4@64-mUQ7``6fPS1M=#hnsb;ycXcXJS7kM39Mty`vjACTc6J@6< z6LV3o+EY*VD;IBwQ*Y1^a% zR#}Pg0i^YYbV40_vy)tA%bcpO)kZpSLNxM*tZO*R6J6GN{Jx2x|F_1E7K;5%uQ6UU zFR|Cqsat>I%#XKiv`^ugIwO@FJX2&ZNa4Wo+ySZMgzc-~nuUaM0^b&`jB>nFd$CR- z!<|h>tj82lU;PQAzIHSr=pdN=_u&6v@4dsC>bAX6M0^2Js)~q!fPe~86zLF36a}P+ zG$|2~B2`N01h4_pRGQRK1O!6py#(pf0#ZX25CVkILr6lBo4wCD_dDM``#t;Y@9z8D zfA$~AleIF}T62y08)J?+<|sepU#rKl(6{@Ye57v5sf{v?h^j11;nFP?BM8~)!)u{i zF`bhMIS$tHUXbLy(=uW*NM+|a`Bvo8Nkb>(%~(UO(J}Qj13j+#3w1@miJWeSExr?D84`VT?${i{f2Vx$>YY%x$_K{tBt!3 zaxDTM?y77Ek(V!Fznru8Qh2`L{iQfHieg2*MY%#zF242$`Y?M-yKoE<({S?`??10q zB>+*`s<;b?>ShMY{3Y@{^CcL(bFRo7s647B)hKw3D=tYpDpMn**(J>O{y69qeXMW`nESP_aD1naWxv~Y zL;ur@T|bU7Cjz!3^B-O#w}mo|BSNi*Rfqp>RGXhTJy=yQtnbpVN`CnJ3&+>P#F}es z{mZS-(+j@l6x@~3|59jCMd!hg+&&}trd?9Js=YhBqN*sj@!TOxUq(ZcPCn<`OT|)pzpZjknz{R!(ZU_ENq>(=cCVgs;~W)g2w%eWw*cC;_Xk;-c~_9 zdI`SELl8-}bl;w-ftTGr{J||>VYf4ovG!57Oix#3)U~(E{QYc^s$RqkOhqRx zdcO|h^mE>moEiZfbhiuZ>3Yx8e==t{bvEIV@rap!Ffia-pxGH&$J~TVFhM#LeOan7 zQ}u$h9qiuX>v>~ChD?n!pgmvC6}68~yL@ep8NSnPMqEy6Lb9vU6Qcv~hnHxFm*jiu zhZvlr@|TT>9TmUsT-v=EIq0s_bupICbYr*BdU+slT~3NxGVzS#ppwxeB#i6RQHX|u z*JF*hw9*Qs<=3EyFx)pWGSi{7$2lr6Aeg?6-RyahcQv-_(1Q z<=+y1m821PVZeKOm&*x*MV`#=<%f&Nzm77C)?fFkr3=dhUwl9OnSI?y0~Uyq8gY5I zuH`>^Tk^_M=X;O9r>AVXR#k+R-Nb9rQX<*#C&zClv;)tq`pw@OSycMtH4`7R7XK+6 z2T;8zxAQXFijVq*ua^uH)JfAJ_f)40eKy(}l%l`NUh58=n-CT`tB~Eb^mF*b&n>#J z?-m+5M<@lS8E<^78yE8rtAOkDY-#x3i$HPyx0)4#PmI2DL^2D11w0Swa|oKX{2o_u zYl2pyE1@aB2G5fRQreMc_?>!12E(t@#mPzePB6)H zox0%$3!CdE6g246c}V(bC`4P^rca4>HV8aW-O``$W6tXxCAGdL+|+wJS`^{K@J`-Z zOwhvH8U??reonBHe`VN{i@0G04D%i5wS9KK_eFMM7Ss5xao@xnQrd~DH{yzg>hC6J z^>_@iF?l{LaoZ8R5LB5j?}??*-D<4{dN%s6i0!^vA%-tjzd9iL69=Cog5pxZWR*#S z9%A4h&&uB=3#_z?3~w@Uk@*4rk@_5unNM&IHJWvnPkwix-Rj+qgV<_#^4ROZGD9h* z9kX{IdL4Nbz?Vzx4rU+9c6`&h9OsjHGCoB5$};=7;m!Axfa%BgXKpslcV-nV?w^Ez zbdAxV`zFuW$wVlPEqE&M>5XT2JIJ*0-QKHv67O({8^O#k5oaFf7`_A9wZ*lfV;k}} zV_*5Ry}35A5-NPvEBHB*WnmW7?(^XyTt!zj{iosPi@D$*M@?6C>=4ogYzn{F3s)ne zDE+T8O%HWny=cTRg+~pmF2i`xum2dUPvP2bP<~6Ga#K{vvdfJwdk~pOwCb$@f$N6k zrAv>`oLR$k2iKO}J?1ys3U1`UAUy}dt;idJ^UB)%`Yi^B5=3&TEp8oyrSG|-B@mr z2~p1~4L4%7wo~YBQWhO*AT1!^bEMjBL>8+MXC+0e*Vrd5OH3*vwx@(gse3&LHEOvy zFl?E&WysSX_A6n4?J^J7idb%KNvs$*n99bW{G=yAmdnjJJ|ceO3r&!`4v60 z(2G-Ifl38}1s}!>=B6?p?x`6Uk%_J01o?K)+#gdb58q0j!SJ;m+z-}Oy%D)~2jr|# zS|Gu*{&UXsLnfbSn~DTG9bZBQB#se}T@jJ+5`ukT{#zOUD0z4C$!=l`+ zzc9O{J4R{UN?=SH6tATZw!Ex}aR0}Am;Y^(wPA&6eCL?&;QZgq*!9=ArKt9gw3K#M z9IrS;eF57O@o1b_1!?>U!+OSI`xgCq#h7o6m3EJctOdR zl3MO7V8Qz0j@FN{@0X;n1KCC(S2W)|Mz*{?M|9{i7Kg;ig)z~;Zup8R(um?H@4vGt zU$gDv6h~Ld;i4y-_t+zck`({WcDnuUq`G?eZoc7nut2!}tEKBv9&}^f_9B8y#=yvc z1if5}%H!TjF(bgGu9r!x^_tJsuhwqVPe+-?N|uoA9!>&m^XL=pl=7W-NBP8EwtY<(@|RG;5!vMor`Tz4*>kPgCtc^4)If4!=X-`6 z8ZX8D!gAg|o}i;QwK#Mw|J4SOm1BOZB`d~Nv;<`perm){w8LK4j@TtUoS>H_vCj0X zI#Xd*&$F%*^N&^2g0Emd+1(Aci2` zVQkB_a^w2-f_D+#kqDC6WzxA*tPlm!Jn`GiC})*z<5=Yp#>&n>`CLYNT5#YW*KB@& zCJ??ZDXPSEu!2_o%d(F$IhN=3SQ}N9qS5RtV%t};Nn%0wQ)M7*?*r4DQ1|_FS_X0| zE)E9I*$Jn}y1#wG%kj3gfqKiH52$P!*y)+OaLW`}tsyVcS|q)5bF%ZkBya9i7D;NH_4jh(= zkKT|$#Y~zkU&eY>Tm-(X(8v_^sd$8$yRaUiaG1#W;HO}LWC0$uT$=k`F5Yqe&AN3e zd{?=CeYHlvkLe_j`xmJE`FwXg96UZbB~yu`_$PmFYL+N%1M_3bK>Mz-%DtfNoT<;a457Y_n+M_Q!UE&IkC%d|89NvCr z;HBWMxxcj9wRe~7?*3&z+>_MK@AvJC{}}*qS5#kN{BAVOPH!!lY?vrm3H}`(_A?Ej z&%&4i;{6^4wgFQ`DLhN6PnxaXQD~(p?i;;e=+&3WtlCmy;N*aJ`hfFQxTTTJ;E+V1 zd~#EHu_~I&HZq1S0;nzNZmSp=}^ z44(g@d%%I`y7alY&^NIUZ7mgL9=sPO-XxEcFA$M7Ckav%R1A=+tcs8!G1DdyT$V1LkSIG0XXHZ`SK?y)=CWQmQ8pgO62Fujtei#%sg$<1=#6@^* zi(D=APn3T5;rSv*Vdv@51(u_JF2`QNE34=mmph?aw`E6> zZN3f%m&knk=Zo{zzCJWQ;(cgk;>rps84DS&859ZQJE5and-<5Eb|HGdh2>mT$UTOT zxX4!yT#Hi_sSjk8HfmsMrP}%#>ZShR+>4j!@3iGx8cvH{Af4uaLW+=Ox78Ld6kxX# zJI}l5`i|!@DZT-!x2wp}Z_7t)=|i(rW&I;DwEte64#KbrqH6y(_**EiV zstlTOX3=$D`IK&uWW(3j&gc2BL@wRgf{uAEi+yYAMUEWD0FPz)=syhxTn0b(40;=x z%_#Hvv|z@wb}o9m)1eML?9yPN8}1iYZu(lY`MXBK>%AtU`LL~j@HOT7&(QldyWo`g zafQ)xe8i;@C|yUR@kr&6^*Hae0tVY8!~ckUIiD|mRN%@d(Oq>wAMun@>vY!5d&Bj$ zWi)4{?S5+~Af#;ChT)Xv-2PD@trWSt=TV_&XB`r&`Nksw(+-}NZ-htFNw8-11kM$o zZq>MUT&zxd>;kZV%W@BXYUk5PY@9jgkvt*)qo@;IMZ7V5n>Nb75GVBM;ki7ZOYeNc>BaIU8is)aU^qp&GX$f zLG$bQJG&d5?x_z=N-8&_DB%LB!kUMm)g9UFj*yE0Kb-nu4*yR@%#P}nEhr#nJv?LTkr0vb#9C=4lFD$* z=9_MEDaUi+dqH)&?`179<<(V~<$z@egVz-< z9etTJlIbYbxtwefsRuJ0I@IrCxU_PER$PT`%X0HCJ|5xHdaT4n?IF3auT<#5GN(%F zS+P8sdV{FpP31!`Y5Eb1w5Z7hmv2>P-us6lZRc4n;pgYi=E#yh4JBI6Fn1FdIo6~2 zPP@VOyCK)>va&pbw_ez7gz=LucegD!dWU`VHRin`5Iybx-Lp3$aR@|O$%Io3NH+MmIR`VO)|1=CsTggYBzddGXR zI1CdqtM}fM7Y1HbM+mk0zm?IwUjx-JFIo4@+;e-zLZ9f8$&hvxDE`DJ<>q}I&x_M= ziGj^{VZ%>_`VWHneTY%hA&}&S*3-~C*BnKQiOR2JaM0Ost+CNWL3}$(ea_}RT<(VJ9d-@(L^{YCK!g5cY~K333r55HlM^B zP_DL#)y2miKtztkAvdn6hlxUzOZ$G*iG`W+!^I;%twJ<%;K79GC~|#sfG&NzM%W(t zIqYpjZA@+HaY@I{{8vDq92AMkXT@YKt_Wxc-oFC55ES`v!E;M}W%e`f%#sD4rv-p1 zKqemBu9WI6`zth!%k3D-<_l6b?`8OvM+9Kz__@4epz^9)eJJ^ckrt#r{Pb0* zd11nj?dCOFInoQjw}qZU$XFD{V>#x{0>pSOO&AZR`L``gw zli_`c)*v!||5W;YXu^|Rjd8&Y4hA2H#T3%Ao%)AoU>;lNyM|XvD3>~pU$wc~Jizd~ zyJA>l>h+o(M*2#|o)7Z#+)1>=x3}C@@^t5&BkHX;Z+Dc3E{-uXlyKfyz1m|8Gs0b< zuV@gRn3DL|Tv(fUgAHex{Gxd?Ee~=YH~gkyzafvin6MalT@1PzbB!O$TlC+x&~+q*lO zhFw4yNC3mQAggL2XW#lklI5?Ca_#3R?_OVXDAQTJ1kH$o8dB}7c1w51Xx_g;Z$W); zwr|E}FTe>j2)apb1lYl>v8Ak(yLZds4y(ddP?VV-~dF%RJTyObVtH;9| zkr4`PSC)VJ#P_MPXkMEU66Ume@~dP7er?P3%(3ET`0%axtezGwjmmerJ%O^a+~FB^ zCo6g+hWC4ct8LXdP-w9iSHurr&oUl(sAO#VT zh2hAd>qAA~sFlqy-QJ(adu3nNR)D)vB-eXi(L62z!{+WSLzwfipJyy!EU^|nTH@K) z+|HV72-Pejx1Pi@O)^<&oLmWRvM1-n9}Qo7#b+}K{(-O>7*=MFR?}kG$#d*Fx%{BB zA`;UjQx|v;-r3R{{ronoDl<0yrvf7&>We3X(({G)`ra{=)O&5JIy9F7Ikwnii}!_l z&)-^`Tsfe5!}K^vjYz)+h>L;Hj&DV^E-pWDiI&nn%u#1dE7y`=KSdUn$!ldXqLMH+FFjHj({=8{fxfRG z{;u$EaYZEpDTiu#`4Ilw@XasRhgK-zoe+avO1Hw&9!03o>r0{cd$vB*r&V!5!xhCq z^H;@B3$}B#r2H-rMfbz)$h{}uD4r{xzZQ2I6KH!r(ya7HOS`TCt)6m-Gdsbj?g^`p5kZ&3|yOag|*}6d;#<1ZBNWokoZ&l zy1^H3My7^c$}6Gvg!#-cCb@UdoRtRJV;-}_OEmuxA&5Nbbsl;zxgY47ywg)=J*G69 zAUk)XDDci;u&l%+n8EK#z2UL#*=?ousI0`7Ju198TGo*$c)50lwwC~(*T}OuwnY}g z%_RG_RoO+Cc{XwE1!^NM5Z#!GFkt^S*7h8j;7&ChM&drSu~&6x88`@ z6w|#n@2<`x;~?|ry^s9aXB;W%nrE&SR=;5I2v--rnj*l^GSwqaa}!w!pXzXE)97BT z?K815`33cO!WMMwn#tOmxxwS`pi%Fb%wTI+`@x~^UA>QD;y*qO{afAvzWX^4?VS|Q zl>fmE{AB1ax~zYx4lisy1ilqr$IK2CY;gQOOjCGae<$XtG5^#~?heE6f(nk~+YhEk z5;B?wM}Fcg`E4O>o0}El9$zFXGBhXTpNkoN^*eW+_0CA{PV=c#Ag^}-924DvZcf0% zh>zP^;%wLWV>f(WhYr`C38Q{>4H z20))rcB>+t#hi&dN^?t(r}=>y#+SL_o3|>sM!9+8C(Q2$awb{Q<#0q5v`^%XPct)@ z{rY_Ex@eg)eGA9{C#g)F*9pR*!uDWr5CsjV~N zbPbBv9_}(|M1Q?8dfj`dg0=rrS5C*-tcQJhFD;&ad>Zw=!tIPV_T!7Rlv5*qeV;oX zbZ|Nton=w~_)$cc^*Z>I#vk|9TbQ5dNoZs?56qwO^Yiy}oS_bErf;Tg!?V+{8yg!Z z3j!umivzI!R8Si{XiS~jTxLIgCCp2){f@z5ip|7^TJPw>gbh!x=W29%nYO9F_m8e* zue_M!p0&rgM!{uaoOYx^4F|x6YIUzgl`9_yS_oMxcM=-x1AajQRX7ZKeL^QY$0pDK z6;Xaysd?_b-B)3AWaqA;60wy6Jo>^0V2a{+*?A&u+W^ zD-G|YnJ!utnv0lD-D?@Q*^)eOf#;6YolqFw{F&hsMt$e8m8>y9fgof zzbi%`gjkbShcMeiB%Aq*MPZ^sPJy-Vg-*S=0?Otcp4piAW4fLitj=ZpQiE-y?LzGn~Y3$aeGYJ82?z@pPsn`7NvI+ zhUAe^YxW6o%-O_Ryd!<}k{GHFB0QhwELldsjW@9R&5}{P~A z7cLJgupT%{{^^#Xs&$kS>5XBSnXt_tASL^+;2u+grLw<4M2;lWKv-|R)9hBc0T|C3*xHF&%2he(wgoqc zV-O3}=eYW&sKu#J*AUkXOhLfdE*J$EUUYLR?sYQIe)hZoV5~Zlj5{{#sy7p{#YwU5 zcJYq`;nvSYANrG105>WJ^+ zxEzt*B@=;WZP4Dg*^eh1@2RC02@05~=@i$k*{jy|8!J;@9GT6?72YsJa^A_>MBJjh zN<2W2P{)j5N_I(LTd+%m$TgfBKlIA>(7|uC3;7ik?BCRe$Sk*UpVF~*IJ;dkK3eWu zU{h=wxp$lk6EiJsZvHIY5TXy=us51<$3)+!73tPJqdy6nqh0prwMN#)Jtpt2ucPfI6U`0Rsg(P3cWo89ZtMP}Q*|6qUtS zc>^meFGBrQ`Q>3W89GZDtom{EYL!hIK2!yR?k|X$8+=NH%6)s@+k2`gu0@iA4`S7|K>!TD((n1h_k9|hv zYIM8%Mf1|BnF+P!`tHfFRs*Ladz=y5#@Q;n~6}bsSM$^!l0Gi z8UGg@m780ys$%Y-G08NB=^tD5^O=STXBPuN0IInt`xf*i63>y)TZCEcr?6;=YLekRE@^*uivG8xSd*V(1{ylfmCj*q2`R<0K-qxp}O&ywXZka&Q zbW7g(0d$^!(45likUp>m+(!C-HhBqMm+!%&)+c9c)kviwXzd;{m~eI0d8)bA^I68C@sJD5$)~!}y!8uqpc6f7a2{1@@FUO| z>L%QlODNg?1PiO8Hd6LP(I9!<8-(I*Dam?RzNM!`)eXpxJ z$%{m-;WyiQ2kKeixqB^DHIdcxosTC?>PX&DgL`;~V7^;d0$3 ztZID4=dPM(m`iyjrYB2Ft$xL{-XtMT8TYakg4E$(k2j&6dwv}dArqIN#)Y~Gcz3oTSm#Fn9wd1*E= z2iF@0Q-kozfiWzn`Hld8TMJ5uZh8ms!HZAkx0kz`PH0#EGk*~E9oRyuwTX~^b@o{y zIJom8@8d!>_o_BO3K(U~f52mjo|LX@3dv6PfX!IgV;WVVpB78e%azB|)AE)$Yw*XO zEYXS?2fOs#>z61q+saK=ATxmks9Qg>*Aq-_yN!XP-y;o$?s)lb z|6uruQ;9hIV%RiHHGIII%ADKtHZ-lFJj^76(bST;xO5I)&u`)IvKM{7bz-pOioj}P zlHcrE`^lBG_Qz*oheeT$C7D!m1__Xjdv}yN%f?C|EUJuA9@LdL%T{+mRu|pz=$Jc# zez@n#l;Ecfd1sMz#9OqXYW^tZifNu^6YgntdZk%_$tICVDS z%|&M?M1m3z$S5>814_aXmZD)&Yt$=yF$H|w?+?I`;dAp6VB;ovuT-lm#+ssNWB!7zw(Q#?gmhgkV^ zan3)%EW=8g0}Gt@~R{TBLR|a zsSB1iZf+?I{?=G88BNe<d zo~#xPDpz~#hwAXH7=*p_-^;F?k3)v4r6OwF_mA;$suQO3v1Np@3LF9D){0yvmz3d4 zd$c0U$n%p$E0Y-XN;V>k=o0Z+e;t?+igQ7jI%VB;y>L~oH&DKA_Gi{z_&83dTJAUc zRp>39ygI$`(WEYS432F7I&Xs5w*6^Ks<+IMn%ta{u}Tu<8tyq(rHTFWet2!)&LXy; z*$VO0N!!0TwD?Dpg{#~Qta&1+HSS4CvLK>9>8xMZ1uNT4kF;!y>CPt*?j7C;sN2G;*Ix= zwYtUBUYd_u+$tn+R}zL+$%b?e8{<2`NffDGILIgxx!nj-GO%1_japB0;8 ztN>uAO%iF(2cmaP0d6pJ1G*hU0L{ca0imwK-B8zFT|Z+=ygT$pu_`X$E1}SDmOaBO z`H51xdu#QOt#$(IpKEFVuAKd1Vu1-PRq|Z) zyL$(y;jS|>qLN?u)(BsiV6sKT;P;u@SXDA+M&{IgYt9eW+fY6=R4UPjESBCv9V*z? z+y+!US%s>z1-2-7 z9-BXHP07WnXqbl4Se;Z}qf2Gy&?@{nNRhxDXF6TMY(K%-d9<37pWuYuDT4kgCS($< zy#B>9!XqECkYD6uwJ;D=+fOp|d|FgBjLem>-MG!|T+f+dDo%qnT6I0J8GI^@-StNF zr^ymhhWziqDtOxse3_g-zTCsd-W7s2{jIlXvsvaBT2MVRv)LPTr1IM@IbnYj0`uH1 zw#LeDhP-UP!dvZs8BXa!4ht^7z&lI`d=s{D4wHj4{D6{<(ugb8TbBBhVniIlXd=X3 z6Wsc_Ban(=BuaVgYZZ_ikH)OKiZBP(gcd?#Xa0m`b!frU*~9Yf^7^Agv-tToBln^A zEs17L&El4Ftme-t2Q3Q_4g4&|im?{z3~2)VO1%1ecA~oLT`6{B`=a7-vYr@8JsGM^ zPLtW|bMX&K3ID2Sy(qtp1QuBTc6;X9uVTG1S;~bPJd&O?krfAT^xcU?4jo^WDfg*L zP@Op5+Gt=NUrk&C7D|y@!SIAlC?7;&He;xJvm54VX2G++sQP#qb3|L&TU*pG%(m9` zD{XrsYZVh_Gtpo-XaUNQY0fU<7O`q!kio!+(=erLuz(+Md$!7};PFNG(uR?u&k^9qy5%Yv$1x_xA)q=au{^zx2lG162|t_X{M^M-)rVGR;u!rv(+VS zB?TJ)?ONr3$OR1t44W2qdC3YgxJ7#I0u zS7=t!`_>kFFku`js#Gk+DrJfa8*?bI7?^^~ibXcRhm|IVK4PkT28|7#Df2Vg#SbV&w1W*-b+{&sxK`dSGXc{1Q3u1x_Y)S`6(0H>KSRC=o=aaC1W=Vuixrl ziL4dG1itLgy39*%afM}+Ed)9xuDH}+DS-FisJ058n{NDFY{{!%#~~J3?o2hjxc7uw zxeb!DU`wb6WMd^_4q_i03^1r!0C-bNqtJI`Hg?v97RDi=WQ04X*oMlI_v z8b8Tk!hSvu9O40!Unw{WIRf3p&Qy%9wrn7u+S~O~^i)MdwyLto;+?3q@0Zb2Fg`I- z@aEQK?>5<$KoXL+j6g?<&8UEeSHvP=)#Ml3$fh8n*$nKKk3`t^%DWpo&7%p??@O9X z&CCcs#`A!dHa@QNanY20bYYu#0d?? z7`ssaBgwJ$S-Fo|Z4pW4(=(rvHvhh(Nwl-5UYQPk?THFz06pyjNk@oQji&|NnT39U zUR{`VZ2p0ayM>v%s}|fOd`ACVc>=WpiG1VI3K;#3*Hl@c2Jo&P6wEgvPysvz3(tzq z^UA=riE&H5su0THjF+8)r9-pg1Z|=nM!@QadK>C*t|+6DaazMokOE|oO?p{epmqF> z*%-gr#eCc(9)+1256 z64$#LB%8s##{8h-ptgY^o04Qdhr0RrVy89it(jy&f7#NB2iBZ#UeH&_&0?Q{X;n!k zqTL*o^?gMI`+|J(_-2QGz^do72G?}zCzHs5b1=lBv;I94+!Pa6GETGG*|vQ$djfYf zEs2>paOa^CyiPK_1hY$hrr5!cDpJur`m2=nsZyE}gY1#=Mf}u0NnC^82i-quBnCGl zMu3^{;Tk792~_`2bpBB9@K39WdoNrPB}!L|2ecE7`dcJt-2-PfrOHZbEK<<#PSJl}p0>8=rHSy?YE{>Wr+qS~Kk2UIazncNDQpFC=Dse3T` zLR)o5MH4p(_K;1eSxoADhTSf)K{<6~tfiK+`JqN_N^D%JOyQh2qGb*61Rqdq717Hql0L7hLCAlVt+AdW9fL6*B%gB1o7Y z@=?n?ve^$xXQ(wlfZ=yC?TC=Y!<6bK62;pxYtP%@+LlS7?>(=K!Obfqt*9hVQs zOCs=1FtkHooX0|6Q|o?XbJ^HhCD*t81E)S<-;l5t!N%NEAijL-E{FF4YK^-&v)(cq zDBnCV(cKg>>~>g`0V^#7B5*$%nuiD`Sy#8=Jp^w23uSazs99ZpcA2ZUcn=clI9p_R z?`Rl$DOe{gl{QpoBedB2fXx$H?vEIbXG;OeI2FMF(YJ8O-B}}$8?;;}E4rNI1u^p< z+Ekd0!(K*23Ik}lL(Rly_kB35MfI^&*{ObQpKu=&I2i}TNv zzh60LHa~wA<`TdEXt(xG=9Z4C=*$&wdz<%j&gi&G54cNr-CLcB$!tN4hikBnyXO=N z^#F>j{^>B`)@pDUa|JpZ0{3qjt2^z7x;h#8xzFj|cJ$PsKYpcWt8oY`DPXy(3G4Fw zeZ-Pr6XJG&Z8WOdjY~VOV{Mo)N#@j2d?YH-G=WZUCzao0I|q8=MBlsS+Qb+c#X{Cz zfy!~DraKWA*Xh6 z$LM;SVaovQ5X&H!ST=k?<>ZGFmu-*K(T*oPjM6))VvX6x2>h5T!?BrxWM0tMu6^{BZhDOi}<#??B0hhWo9LQkEdg0e?j zeun2a=D9TbQgY~!Fxf4O`mph>?W~)pj&_P;h>eQ%yhmL*l$#MH^e3qK6MOD2KW5k> zoJ(2i6n(wTuLE#&RD!7pDI4ho=sXPKHj=r5yA#l?nD!Ad|JiYO9&j+wW>kuZMUj^IB_SrTWb%Yjlt2~bZkK( zYHZwf&F*`s#}1?ZrJ)|ae7>c<)eZZY**n>*`XMQ#mcpBrCtt9^Y($bRDLB;~k9qc~ zlm^G6hB|Py8gx@fVgZ}8Mi`2BlKK2*o_0~TF|Kg|Jn}R&1)1KxkiY43XW>HF*P*T# z6FxX6pN7;KCrpAr3J$tr^G!#n#Tcim)wME_2!7P=Uun6s?U9${5)ywRVtW%Ts)6b6 zacQZ1iWTn(Dr=O@EZ51a(VagCeKb;!N?~x$NZW>8mutS@YA@6_h4+ND-I_Hj^A*>c zbXRjM$nZ?^0cPDCucFi*nGr$G)vCY6(?18iDpRF+u0|_a6CQ$wPJ*uA4!2vozwm=UcHsS-kF#K7YZft>(0GA1MtPWdVZY@G}%)G?x~6FE@7I zH^iOWE6=91RLQcFWk{^b|F+Xpg6i|(Qb+r!fSb@ASK(|=eO3{f->ZIQs`J{z`A!GL zNlq*F)}|)IUtsm~+riMc%@G;0Gis&+GM>5QZDzMv{woKv5R`VHUl=CQ||GI+@7glL{7n_nj-WM z0u?Vo-{1m6Zg6;ktnCQFi-R_J*G8JmTJfpIT*G6I=E_%{=7Y;gwar5zd^Mzn*5I{H$8#2H2Z+=b6U;RzU;up@I*aki|LYYCv?~@Hr^quey-koGsRrXqCD{e%7k6|6 zVPPo;R~4Zktj>#tC{OWE)UdtNl+cez=qlH1m6m7Hbbl?zx*f-P&dxs$VN2BnN>32?u?gj8vajMZ_&g zJzHBU(tFHuZA?3wSF+wsMPB7IiY3-b@hWsxP3%2qjJ-$w6jqI@X;%+IvH<@5^R+fEA9mj1+ zuyanOku!SB+)j~CKsP(L>IHd+-mR@Xrr1>Uj|btBTS=bhR{f(aO7xs3U(CnPe%djr zyEFPMr9{Qlj;2^5K1ZK6BSj@npw`+%+2H#|X!|d%i|6AdK>^aM6+2Uqe7WpZP34fL zvAw2{AMYCK#la~-A=^HVCM%{%T@bO}LkJ4a=2wWljGVmbX$Hmyc;J=RXZGeKQwf1_ zPLh?up>rXuL43Y*A%4&^@{6<@8GHh217}ip?uB^_qy5U>%#~*}g9bog%n|<-sdh?f z{eehADKbuJ3#VCP|jb9O3roy4^ zz~}orB>o|P8sX{kUqNF54P3~XUo@c!>0XWJ4nCz6H=qEKu%qYMa+KHQU4pR-O;ouRQJH(=E&-rBEHE&(P zb5*d;81zwAB%bs6X70dUXARnwoB@KQ|J8z%)y>}MXISPL*qiu+ zd9XW)*_;t8_TqoFu%SIQ_{Tc*HSJ*+wyRv{{{5Z_)wB~{ZOw3Z0Ifgdw_CIpCmO~L z18}cR`ch-YSL8pL+x{n}f&Zq>FKLGBbSmc@(0^w`^uJZ#h+YWq|HuXKr`?SB!Saw! zfpC-Vzv<2Yi@#X4)alzh4gLPUx$ytwAzxa;8Nw5x^mKoF*Wv%LL3QS)a~@Lw|iU!vwuDe%8D(SL%_zeLUdZ=$B1`1?%! z&33?+4p8OZgRUJoO`R^)>3W>Xod*O0Qldb-I>5}!!ppoEP7aW1a+EobFevBm`)K@w zGx6Lg{l4Y=Xg%^*LKIEU(*FJ6>bSI;a#GZB{vu7&Up5zltgDLLIrZFlxd$mnZ6_}v zo(e6?18nSe@PWU+b8=8|(Ayk)t?tpS3H6cxn9=_4!}XW***;IO>`si)d>TC`-9j4P z9ce_Z^-ndwPMJMu$IR^|G;wl-{WeIAYLHFIlClvPSZ*;;qjenlmnF(m6WR}15x+JY zw!i=5-5Ipy#nIN$9MlGy4Xby-MrgSlQQ9?t50s>> zhS2!r>9pe=sXCfz>tIS3s6u)Y9mNLu2J9lUrI^RAASuPPD?uQ;QO}rvJ_VWnLc#4f zMpr#gG1Ki-kdzG$@##Lau2AzugeW#<%fBSoJZW9azC5rTy0}0a`GK7q9D8R>qNB#_ zfg!HeLd&YuimqjFhJEz$?2csRI^bK`0FA_{wD*Pb=v*Cd*0!SIG&Pd;5{0zaN96)< z{DUa`d$5jBHdTj|&UCO?yDC-Hy(}CGLVcOAI!G=Z_DK#3#mM<$W zn*Fok_3ImRpQi|7!YCuLH&BHJd|Q9KXG=A$+X)U%WU~dMmvLIyx8FwL>hVjinQfUO&y(w6QS20S%yGwKP7zosbe`R2^{Z zpFO_$x2_?QPfWGJ9{jytkLUtu;gh6NPL2t4zsYi#&fLj;@+PgL?AbUe~ZUHB`j!XlKd?WMYRl zGC23wgM*PbG}87f>u%}w`C~Dd`lNb3tLkCe0t?O`m1Hi{Ht1}PNhr%?&o)!Gk-=chjF~Yrzf0%b_vgO9pZc70 z?$7Cu&*SGjoN8v?bG_f!b-k|V>-l=VUe|@t@vGx4Tk6@0OI;Pk)x(c#ntAC5PmYh1 zb1A=?gXd3At+^9_2;&kJSzh~5!0>)yGOjzxR>>=fW(!jz32hGm%)~|J3gW;Z&oqH2 zp77kEFqUV8v<5yXVNCK*R9F7RHRS;y!cyJto%gV)qteTjKUW8YS)JQa#A+zg4G}I4S;)?0^a5W zn4_^tU=2;4+~e@KJEVP@w*qo6!fOsEh&TA?SEe&sn-dfrB~o6%T5ssYjwB0|{B+qxl8fdMyCXw>LrZ_Mo^s zbz1Pms3x>mGQ$5HMgB_YGBmFa_~Rk*xX8J3@4XT}`Fnjr>qf>!yb8fy$0$=HE?6T8 z0OICu0K@D+u=pZ(Z&nj@tQ>pK_ozHx_wYJU3b%U|-0nL9jU>)>EKYD*2b&k81)ovg_KV z(eH=$!1hbyL-obx8SB{4Eqjz5rRq{Hk6 zYK?g<0QK2rhkgP>4SA4!2l##E1OWX+E+C~mbSrqHt%R6!)e20Ny|v$IBQX04hk9I8H@#eIGwDRj+xT*=PG@n~ z+X+Qr4&pKWZNP3G)uI9(l&=J{{r-us0%$_2v_;jo6qv(RNGP@t{GC@-spazrmTWw5|k^oKA-wD7q0BJmq`!V#zf<(@k@b}>^SkO{u)^-t+U=moq zlQjNh9C<8gxL60OL1)^%8=KJ1E|B#PgYlDgY)q}tii@P7U(_tHDMHtS$e^(($=j*? z`(#_k7U(Y9c(B&QtFmgIOp@#!1r|9+fiuRqMk9#zn%o{lL!{ zyHJ7AL`DD?wLg=<3k1yIC16c>Z~JIT2_7)^TJoO#NjnrAd;+5)jq4<*pXcpy5abYS99xS1 z_LZCYb>*som5UK}?b<8!X@9xE9q<_IJCcVSs-CM#OjiNW4eB`0#NfHLlGB6*W`p-W zIW8!3$DX$ZW8P2YY&5p3EbN*N4W5r$K>De>k`l_b`9VZ8G$1o(JV5S6>jBbO$kff>SA< z#jYv>{q_R0+W^dx$l9TxdPic~9C$YdutV>RlSX}d$Nv84$>BnB*JTGt`?7ZnQH4R% zv%_Cd+m}?_pX`*_O5FyCwzr3g^y4s@DRT!4fOShPqh3%YMUj%;#(y|ke-yg?Ka_3V zj4e*&?7H(wzaA|+_Pq+D|J_ZmlrIB)>kq7Ei~Yri`%|SY7bHRSc^Y`=<3Hr_OZpdt zj>*HH=Kmre{BwQXCk9jiWuFB5?f=ij{HebG;l%WLf#$tgGFQ+)WN-ih1GzxJb$ z0U2P>-RTdCFvv^k^0KpYci$7a^PK2~S`a-=JbRu1>bu%OHOP)o)=YPA+PL;*sKuQ; z@4d|QL*eH>?7>7U1&s(7i1H@;YifmLYa15m@0G?F1&xBppX6%lrzfsogcK$ z$^YoCyXtm-(cE}i{^(%A%a5M7iC(*IR}GH%egLHpBLyXN(So;#(!q<|@#3{Q&tmW0mt0yi$!JG{Lc0T+_ z6LGM(^~So7JExoh<$)6lK`gFTOi4(sVZ>wl<4gF1-m}LCtyK?hz{3GM$94gS`vkDQ z%PJC~aiCmK>?Lt6v?1*7E#fNwC~0cyH!B8HAv^One1H4;`5Z#rCk`r#%RVe=jrBV6jIvc5Dm{K%*oFCrLjT<;sKXrTS)I}0yNF_Uq&BLyz|MON%FPZ>n=C*wr7OwaCGZB?=HJSa z^m6Ew6c9ypAlNTT_?5^w+kRDiWv2n5TrCgT*vo3h5XvfPa>d^9M2D^mps=lx!=AEM zeTmFv`<5)21~8>bU`j_JpUO)bn~noaoBeb!XlHVVGo+JuOilxGsMA1>5s7c!vPm9{=4LS5o-Pg8UKBh7NKSlYQ8%H-*dN%Q1kDL=wAkK5o#8p z=DQ>CFLv_p*ZlvM)$lRQN$9c8tSa$2TGhi%M}+sU|Jm_^>i*X%Ph&E@9^c6KdUjmy z=v=1QtzV8i>{c+m9Q*Lt3HVcH&h4%3t?Lsqjy`|VM>RR!HWM*n^mCdaLrF5M=DPj^ zSW0`JkTjh?5VwgQ_k~|83-hH6y}&@8#&=iqKW53? zP+zE8@_o;DC-8en`G+k7%`9we+4?0f&|*I*5Rw#Lxg^fKbNQcnl)rqYR{&nAx8eP&-zs zEIH4UT=J*C@R!8c9U|+O?0NiR%@2ufGaSHD8jJryk+X_CutzZ$&+o)Y-!+CmH3Rw# zu$0abM3(%R*2RE5o>X!FF@i7o8ckAw=F+eBm-^DwgL4Q1OsZLQ`t zZKN-G#;2GwJA z$~WH3X+JfZxaYyhR(!2v=N7#6uBO64&WjL;UmyQ~qHPn7|LSn(WWgoKPvvIZv1zUW z^tMP3jmsHmQ~iJrw4@>|xha;6bX0o-xdR`t8;a#L_KH?+S8srzp=2*`3_{5@7T)L1 z7hh(#prR;ou`zr10w0(L=rhw0Pkkrc0*JGe+oT6l%v zRjw#B;WNE3LPNqzyp5zB2=X|mf!8bcCCxsnJ|mpYRF|;oPqZF8+sS#F#nf>3957eQ zflb);j`+~TDVWGUh@`La!lBjEMbO?kn33_BR zfh;8SOw%6a1|0dVvtB(M?eci-jBP%uzBAmEQ}h=6CB3o%-!W3-Yjf63H<^M2krf{4 z)z4o$)dd8=bH&y@+;N3}*ROkz!I%Dozl=HJWtnzw|gwN*}U zl?d|*%cZ#}kV1AzP4}$AMQ*#f1(W70+`pm3SFJ6YHd1Ly|F|Vgb=5~v|KNZ-p7*Yy zJ}Ahu+}FJn&%79S$0r%Q*4@(e&)2_yUcTo7qvz8XsjPK|Ye+}lpGrHf2ViuwO+xP{hViDTEJv58Zz6kB#L8@;X zjF9jmw0~#77NPw+YiUua{%t3zB>n%e2x6N@8 z+P}jER{WpNL53A{tXd-X;bPe930&lBv@2t&Ug3RfzJFH-)1MYGFc1sg`-9eDP^;0UvF;ze2xhx^8vJK}z3 z=zSeBXZ9h|?HC8qk8D z9=X>stQpYJ5}w>`dr|>2-JBgW0gRC(# zZbm#I3pQ~MDa*hWi(l?asG_o#Eu^UCqTNmLblkx$gkKSMPMk#It9Nq`jza7DMcHVb z96eMsqQ`mu{Ryt=Wca|qzCn8rJ@_o6gY)iWpRODJo$46zY5fCiF-dv3sP#Nq%uai3 z7~)xpC2aCc8uvuObjP6eAzt=t`OtzSgcI@@H)UCWQdwm-oOX7p^~}$?tbmMc))pS? z7xx}f@HL(pbyIZ_0U{d!an>tVjkv?+L&u)6x1MNZmq_8Bf!{zL0uM>S>a}p(Hc@X8 zKQ%YLCWf7>0GS{&?k+8kJ#-@AEz%3*G#YNY(PGO%2ILtiSg_Uh)H!uQJ4~%gS1L~c zS8qTyUrhF|=bXudHD0vQ>hoo!_h)UyV<(*zIK?gs{7W#Y>8HF#WU38vWYsJ3=K>ih zb{w&m6VeM3TC(L-UhrzC+MW0Ze4l`eC$)I}^Xp50$As4!zV5=BKJ} zA)z?!#$xy0v*w>?up-{YHFYfv8Qbp5e)ebvl-eUIQwY01Xw%`ubBlk`f#^n=XG15l z(n=fB^B(%wBH~PZ@BA}s+2eycS1GRJg?V%@d&CseBje7pekGpSpN?YGObOEbA_e$g z$bo8081%RRIViGr**ONk0%SuoIU3N~!G#p0EZ!J3G7;_|g&P*95rIL>MXw4HZ0ULk zrD%Yhs!PYh)MuB$2A%ZYm-1g_O_#PJu0s5V``==b81F*^1@=%#-#a6ur&=3{mDAQoRN3S#MR--8t{qiW`cW_Yi~42sqvO!X|w`8V=MO8OxOWDe=2hBQxmRZApzOw zAex$mJSJHH%jpHF-4uToqUhK8ERF_Qi8kfN3cl{v>uFw0nJz#hyk+9f8cWHHV4 zO-}GXmi8?M$=`8|i%e>fN&Sy2=fCN3|EHPMVxjK0abU4f_uG}Yi&YEX6N(m7TmKCi zznaiuYU|qwBeJ*$`ly}m*Qz;S=dm5ZC*5WaXRDq7AEh;bEg?tV7*%9|-4=%%r_+b% z;Eko=f7YzJ1gyQm$WGH#>)T86zdH3-pLLsBN>zL6*{41=xQ@_S(P&L|D^O+^NEmYUY=_G&yZp*t*wizF~^nbt&bap9Z(c9T8$lRoPCo_)`% z+Ha~7oBdA;RX3md5+XW#7f8UW;@B@(LV$b$2ddjgG}4{Dpfqq++*JY1j5DptCB(!G0vtPtS?;Vdt|6-l53ORfDOk%K?Rwx!AA~CPY&s(!Jy^w zJB|Iio|)F%&uuoU7&aV9`9MbDBFU8xqe{@AA6qv_BDpfS5zgrNW3-YZ4eoNxN)i1s zK58y^lZFH)SX*iuql!=<1;|TH$ELd~$ZnC9AWW&LOOUsw1?wUH?qz*{qdD9J_58j= zxMm@yDDCxDca}&_u&dGlc3~tl;&HN+HHUHG!f1+m6OUB|YtxlYszkt~_HUL=&5{tz z8Y&Gi%D?tz!Tcy@K-TwEliI&aYpw;YG+_KAAkcIL7<{3Di|JrL_ISHr=b?vio-vMn zLvTz%ZPY~}In?tvBdVIhHI7<0)zOZ*a!P388WP3ht_sboHFy=a-pxjRQ}d?20`}Ma zGv9@SKQxGMLw5B8;jxqUUp`wDi<}O0*E)7Kp*kx-y#dQP+6Al`@?Qri^puzJjcGK1j_a=pN=2nSZjbZ2UD{kAJQXZQ z3(;AD&jXp;F4DuOppp9kV6^d3b7sKrVOO^yt2F**Pp~Ac8;oUBfKTBzVMO`<)u|bl zpHAGfCQsk&H?7GERF|NYC`wIpSgBgo$&Y)&)X2$EbK|FQk>cad3e8BZ0&7&qHsP#|bCbYsod6Qj4&&>M zkmPKfW$_4Og-2SoGWnq!CxFHNzp~@%n18rK;MugB5=7Zl&Y1#xyNR0%ThNRT-E>;7 zymzV>Oc^ZjWZIV|djLGJ$^^F@wNPdpm~9wgZyT~R9iULogv%o;z1acmpjppRc7_%`w0xHB3eP7JGYg9X-&wlf`ks z{Vxpl89l#r2I3?ftF^8g`J`WCZkxE|D^h2IrUj{7X&i%w=KjutyO(~8k2w-uYNPp*sq4!6^dDlB<`LE1Iyc>7MaCq9D1hF_-;A2e zOERq~bx@KP(UG4@syCW{3#bDht@K0?)%ZFD172_(00#yn#cT_>D0AIhU?@0(K{qjK zE;P5ns3Ji5?6NR}fb*Z!xVT6d6*$*2K&5K;NvMs3$|ufgrGbc0AR&BQ8Rk!;5I}r1 z|9XL&faPulX*ROswt@%_G#C$RrA~`WtrgxavDrvz00W=^laG(u>_rimh4+H{q{K%B zy#=j_y{Wk;F1V|uo@8d1TFqr@NI=FB3bOOyOXK?_F!T=G2#UR>vT^M2>|<~f8Yv-4 zi!p0jL%LyFBNbtdDtE|B5T=rd$SS-WT6Puzo;vI1!oPk2;{a%)G<%AMRcy1Ij-onX z;de}HhS4K)PhsnDk?tY5VK|YX7*{+tqjAVZ@ATHd32yVyoNms^PbE}Pj|He?o4N!> zQ&)jB-++s>WvTn)woZ(!eBlmZfIaRt1Rle*ro*hs2+3^2H8DPD2oDMy^R(|UU^%16 zv&%Xez8k^D`=seIjwXlQB=|^_o}YJl7>Vy|deQ9IL9m))6qJ=d|MGzE?W_QO362Ng zCe@)&W559jv|wXQu?DA-W^t#J5$Zq{WM~Y~&s^xB)zw+*jgfD20&9GR%ct2?Qr!zG z3Yp9gRBW5qYc=NJMhF@~opg;RGLD}F27t9%gJzjPt@7G>+f&z;719?=PS2*Y$~y%C z*_>0>*!!1zIjA}ULDNzRW>AV8B^rWA8_?94@J4jwp_eWUa=wbSzL_V1qSY zX{G4)0yq-5^Z{>|H282f0Sxb;mn)}gx4+m6E=9FUyuC2_p#Q5n-r?q>gEn2XO-RA{ z?KEiEnvI)*iZL2pO;JTG4=;G*v@d8j8?mp1>X@eS=0ME*WvXkjuRp!BLOk+^+R*4w zXm0$L)g)hd+Et@Bw2JD(s;+4SD0;fnloH{6O=d%obIg|2{9y;zeL(|L4;?7rtLRiSIJQxx^y{?=L7z<`E2B_mxa? z8fUwP<5dyox{|HNimJ<)8t{rl@H~?Z8f{d+8LG?7G?C`I{7pwP71bhQx~KOaX90XB zLvCLmtAdB<@hP`)Z*sZsa>H8&F(~kzhzT$8Ep&8f zQUO&W3Y(e&kWoM--6i53ta|>87JY&pfua?#tT!N1oiOO&p)?}mm5>jGlQeS zu)>5btD(W#1r_~e7@|8*4Yny+d-Dq}Z!V*@ju&bHMkfKJ+JG&678#xX$SMG7F(io6Vi4uQB9uwz_EPu4{y5sbsXEHj4kei5Rl| zvIAZB0#Z*>`#_Ci6kRSOvLgRd#V_@`Dl4b2y_H&*Xdoe>9mh>0u^DrzAIH**5F@xR zlQ?zuAp4%O{%Nyj@n-S@la}myL`c>-0L>1dq$7dCT{EJi7fBH z!!9mYxAm2F4xoqBQwl5PQo09s$5@97SHT?c;f)T=UG?SeCq>HSuS|k#E;%-ORmhsu zO}(sn+K&m;bS~1_?+Sl(qm^&CNzeGY(JT1&FxWwG7g=Fk9%@ZnyF(=Lh2F*YkYV4c z%#N6D4AFoelxyp4zXoUTv$NfO&q`%sPhs99asIg&PNqasoy)&r{^%fHw8+$yGly_} z+zC^FZBq}Gv*>}?&(0f2=0i+UGB`nREk7JN`wOusS#jpGt_NagCbU-T&U=({9IO<( zDGc33nSPSq7nh`O!OO_^wcr?CfC_I-$6;^v-AuYxYkjj)w&_u7&&+tbuDp?)AoIyH&VC*n_E34}ni<_mi5SK+a*Ojq0{}l9!vfCx&=8 zY(t3KBwNt;MBewvx>sGgSLo>1te1f{B~8rbCd61Xp2c(@rOLriCyICR-?Yxom$*wg zG0VUpd?|<#&&~d<6cdQrGlqIZqOA?ollf`vb|yA&KKl1g911h&pzXuh*G^8hv9 zXm+HVKjc&)Hq@W{{z*0mfAo0WZMm2(F3B6cO1)guf~GypT8$}_9n+J&A?+#bA`{qx zy6}o>Z&6BR={DzA!awj*Gafyo-_jQqxrxX&eD;%w(KQh?`C1}3MCR&b$9;383xn7t zcQbCU@SCHbC~H*g3B6Kp6AwRIuFXncK12`jTzU%*c~GMjXsiG^ZL6>^T4eHSj4yXj zcx%_m@{^;|f)kfF(=!fW)xu~UkNql1!D2&w!T$B7qLRT}QSi62>W$XVSp3bz=oRY? z<#PG+E^F$wnF&F#OKLAi`f!@{I|NlDeN0F(Fo3)h~YbF(oo4lG&jDDOdTiA8G`)hnFYBj?Kr= z!`xJ4?h4M+j`$TbZfuRc8_!zRbLe2o`#aAk89k!tqdk>2=``MfY=j`#3b`Lr#+#{`}iM5e1O?IzY-S? z?lL|D>EN!VD~DFBSX~CCYbWx8dmxW)*4{3>YAY)o%u3ZF)o=($9pAq>vQr|Ay<*lq z@fZUGExWq=mOg24&zR^2%ho}Ehh~lPr$X8+Vq1)Fxn;_%)==`v$D}R83*6}h46>Ga(43fGG$S9E6_d5Z-u7aW zS=Ze%xN{pE53Cr{n|#8pzSN$OPjUP}*TM-Z$N(n|X7Z0-m|O92YKQgCjbYO})~&6e zzuwu_IEdUA9E;u;;T)Xh*$w`Q`9CsX_g!^-|Dah#IF1fnx4t+MTI3=F$*NwkJ^gkmr&>nB0o<8yaT%W`>D@y@?4 zODr;p_We9Bh(E2rx}y}83w&?;+8A%z8z!E$Z10kf+PxMt@22S$b@qOc&ChIps;U^$ z#1>?*R+V95bDMV_Rrs(I_}{zn=%e}~H^Zt?)W;W(KW|kL<|$rj(NU3smxm_>h}&=6 z;v6v4Vjk2!{)@KCgz6@V&C7-1z(qpQl0#?v&|#yj!X3hIOh2{yo9l?~R(|{{bTr>= znR;kVXACUF({UdBPC+?<6ATJXqkg;rVE{#h?!D3IuwN{g_3>P2HPNGKy>q9-%O($U zO^x9@dy#|Nr?Rv!9XT{EQzUFsUT2qFpcV_|Bq+rObom-Rin6<sYCML zpbFV`&D|U_*0Lp3|tT8Ml{O8!x~BZ#9ZnWA%mv?_%^CNis|l; znr?*a3gJAh!YV>Ns4=_RX9$~Ts?bc|`o}ewKkrt(QGzJys)`}g zx;E0JLhg=kYH5j9&gC2rNkx+{LS3+;VHIO^L$_w7+Hs$9eGe6F`#hj14 zxgRXkw)v2zd;w4V8j?q0#OTHm{kCPz->#k)`6y6r(7H1wm>=HWbwgrvkh42mP?rPGbs5|e0 zxnkgHsU?<0%n}d!QHJz>=|U(C;2qsR2v(}RzshvZA^2o?{wWWK*1}UNhmq+}zkWZH zOc;MA2W#r@Kx@;gIHD=Mhj zlN5b7)}DAZ)V7%_ro&2{p3Bam{z6TX$gMG}8|{{YBMLogzbxSn23OMh{WR)56!t?Y zWd3sJqAD=qFS2QkU}o&ZgUJyPF*eHc&Y`gUJLRL$eI!O6yp#y|q4fegY{`9;8f0`~ zO61j&PoK6>S1WutB#hUUP0B+SYb+ z>_OJH?TWycUz0L9M-ZNIgZT-oA9h_nGua~)KxuTSxM(K6FG2Iiz2K-Uk zlk$Yzy%P0+s`A*kM^gMMF>fTyDcZw^@0Al*;CKyDG1gp&(_ySJv@W4qad%8Nd{0D0 zWreVR^GLjvftw(Ydp%jP^~KN`=`fnTFq`g8SnABoKT%(f@T`2flFfWLaW$P-R|gTr z*2hJe_OcinUwq^31TVE(zQgmz7}th^fK4(K>0ZYU?2u3}?ZXJlnJ+y5DMc z{&V-8!E+Xj=~^Y{fVPnO`*54Ed1&$EfsDXZN+hZK&XM{Gsv_<#2Nl7N)stPo$I8}u zmUaDjM$JQeUrpx#if2qW1uEt*K<9MLs`Oo2r;-Wj*ju>`tObMJ@&&YJ1HMks=hrda z-!~ zOxv;KGK$1|SkXJZV?({i{hGP_QlyOYJN4%C_1X=M_QKCl6Bc2ull^6*WnbdXW9BLL z5IP!v@T-+_&*IDP?4WV#XYVZZdc3ofex$hO{TCRGBa`~Fp(qA(I-Q`=W!TqHlzZ9G zRgkcmCU{_M=xX=zJ*1^m3!plDgHtvKqNvDHSTV$_VpY{Vl*wB;qdoHToI6F1mR#sR z@;ruBXzAFv)>7;{C8N%L?`FmRYJdH5BZX;za`Cz}O$^8|6W*3H6s^}R|@6c{G zp2ppj&8`01E#zNo${&0#6do_xJ^`rXk532o#=hNi)gaDDIX-R1$S)0+)l;ZT_wK3n`g zHdmjNWE*lH4m$?dpfo%hf~Qnbdov*E|F#To$~sGIXUh8bFgz z7nfXlEsBjmX0ViNJ%TrUU2k_J>a$?J7dFfc8c1)lvA%II?$&qcI;ystpM0CDcIms7mJN7?)* zSmxPDX_oGl9nJyMI`t9gH`|?=-CJYP=qV_0V@Xmf3z&?dxG3Q(rBt{JJfbpwLhI&` zmZJwrslWK+Y8$P`PsqEShxNP6Ha>3AYKGZW$?fOs(aK#@#&z=vd1IF5J%W?0h}KCL z3^9v?S1qsz*jc8h+KaSs=nAPi{b#w zAMZ4BrP(dTp-_8=-p~qGtJ|KtQ4v}Ucxl;=PPibrs}2x~2RvTR7zRW2EzTRZhv2F# z2(*3pq@ED;DDV|?4dv*%j4Kzb6yYMl@TQtq$z)*Fvb{R)8)s+{U$CoA=8=s8yMarj zp)I3}#xT**ee~_-?OYOf61Zmb8}k*iBRqigeYbmATb%=#Huc=Y<2Pcu%uJLrXZU27d~ySjMWyqYJL|b^aVu6! zh23|L0Vl31p=4eOUU!u4m6U?<#Wg zwmhZkOnB{cqu4Ip6@8!OC=O5|?LhMlSG~A0DSmqPzig(U&qpkeH`Fs;eRo3ZEiyj5 zl`;2e*HB+uoWYmDi-)BrA?iY`MsF^uvs$iq zI+a5{^}OEOL1bntfN+&u$&TQI$K*UHEW4GSdundh-3rM~p(5T~{ooKNayiP!YglBc z?|!`Dbg-DQnPE89JCK`f#UPZ=$ZjGZEv%D=R}ly3yC%K{RYu3rx~xq-*e{z3y?T9; zS;cGWOA&h`S_kzi&|0V0-@QFE=WtSAaeLHL>Q0_7q7WWA-vTgv(;D~R_%%U;ghFD|mN@USaq zgOJ2J@B@UVE2pH?L%U7t$9Z)IUn+RLZZX{lqgv~R6@*rr7ySSfiy560sk07||IWx*CTZ7?*HRz* zHHu2F#_2s<`3%b%dqRnHc(=2!cEt;CLpO*(1E6fhTJ_MOgE8F}_sz4&u%(5`?#gln z5j$$@=uL$&-Q}HtM)rjaZmk~=v^v7qO~**6_a3m=Y{FI8*C%osf1@!u58@o)A~h3i zlf1d$`Ih?f2-~lL8ex<0s%)&)fycABUa7)H2W=r-lGYj=>dA7P%t0ac6{G{d{X|Un z35^BiPR}^z`Z#;VkUfNQ^2nC{jUh?#`^`++My2NF0DJH3SjRuJw$`Jr=3$50wZ>$d zuw(d$tLIM(hhK*0dK$WlN(MhRE%N>KAyizg#q<1jCaX}{t>fk=P+M64IJh4pu@W4@X-9w4+_dYEjC^?4>U3-;R zVqIy}vUjdOxk5nqg9&E4d%5-N$Nh{A*9by}T_2o6hL0?A;yqgv`461?sqA z$ewmGy4z|5;I>y%@U9_yZ7=RGfKvidQr6_!gjdU;s;N|4DtcX1y{Z)WmYQ?k2cF{X zn7g<2!$f-2RA+Y!E9_e-va#&Rl*&GH*;?!pfx(wlpsq~ZkZKj|n~KZ^7-=3}i@kqU zH&MjPH^$e@ZY4XU^1%M){(CA(#R)P)yyEgl&6TK?CR|{!vAF7DYK*T(oi*MK=Coy~ zuRL9jGDrMH)bjDHfAy6L?^tb`N$;G*s1=4EDW>8e5IkG{mOX<%2B7!ZVDMX!_2RjT z3Ln-8brv&!t!=Ihk-R#omKEchprm9k-VNiNS~@lo?MVP3Rx-}e&+M9D1(9!j3An$j zldLr=vVuTxbK4zCD82a#A@-EuTzD)0a?~{c*S&nY`@_?Gr;DR-V7HJkGy^emI}}=c za%+rlN6k~J9+kcd+y--5pZ>Nzpp9;vc;~LO)My~eSr94c>q)*e+*dqi9uNYx0*c<- zjZr?6Wy^;KTYRr09%mm20~4#Wj9$K)i$d`2-uc^!0f43l$MfWR4y%Q=vX;pTSX&R| z%s!w!5t}WCyk&{JAirYStbCRmZofOmSA6@fM>m^cmqlh|(=B+A!mS7T*zZCUkMdGJ z=cuLr!m*FjuOj48&ScR0HhdMjC@$OaZo=^A2F=;Y*Aqj(066}oW{w)hn>h*|Yz~Ne z@VHgf-4xy)zbchMC(b3RwocaeW85H%2_K8EfnN`!w5@OND@fay;E$8cEExjXpt&+g z*n}J?TeV@RFY`owDGmr-v)hOIQUkBGehz|^JQsTAn@&|~a^7su`AV|SwJ(_U=ZpzJ zHN2j$rlKMymgBcwqF24#~O&D0^X%!(yvbsDnp{H#|>&T-jg1bb_FfscYFELhb_b z;=!p49~k=&FY|=FL6g56z|S0#72#OowJ*l=o}8Yjvr3tRh~F{ZsS+P7vDpu{iz#%u zlQD(c8oOy(5~5vfy(XXyurW>dl9~9gLfRWk*fGt*RlMrMG}g*JqV}-u^5u9DEp!bm zW8hcJcsw2ZDaS*<8zI}iAe(tG2S-ygm|D{5ME9zUWX0ONxO95O2ehe9?Hc>#9e3g8 z5v_EUT~R(c-PaD9HXLDTk#*+x#j&!S(o-UCUh<}vozU2#6mQT`7bCq$ZoEW*SS;0ez_TZIh)^>U-Ojb zCRBYus`RPY>P+}E4&HTd{JhwDMpeA_8vNNe%a#BZ45Mqu4d!4x^k;{q3As;UJ?>Os zV?eK5<*9A;)yy(cM=$3~my#UEWsYCbs%XfaocLf}HTekGYqy_-1EjvSv*8 zYf%GND}bS|U~W5|nG79gW+8|@`gemi_b!NL1^95J3FLTmcR4oPrt7tkc@K1aNqxj% zXFTy*D<9Kxee`6}irDb#q~*AzK>4Az*=U!TZUHW=@!*LeY=o^^wxO#rVa<#&tzxNq z`GvJ#BP0&_ldm-3-1^P&21N1JRa?lPff~^;o2k8@MBZ>p zg(tlZYKHu>XW?<-**B4M1pB4a86Fb#5!J+mm~IUg2u`)d)XQP}T_>XUx_aY(Zd4UW zI5X2u)O%Pw39@0#OCVAe-Gsw)uwOKa>mAM__uYt_*l{QVZsXGV1m`?0c;ssXU7hV_>Su7)OR(n zYN_P4!4PS(fFuokv*lNjV$Z$l{M(nY4Lb0jh!TUA0`7y}ik@ljWYK45dDB~ClUW-% zeYJ80ZI?l^@UaMu+NWJl3oLs^O*?yrJ=c&0y;*t@qvA*GfiPL+nF8w_c8${pU3HFE zhlw`r{*z}vkXq?SjvH}<*L}@oqL59X15;8T{ST=mVLjK3k#zlmj%+D4^Et^t zUE!sVu-Qi$^>Qw>ew;0O#1)@wuuYu%Ar-m*4X24S7g3|zPPy3|a`$6Q1aoFbHKi3q zi>?Gf2YbEN_~YZ!e@gKydBF^_cWnKv~N)UTP`(Xdu&6)Y!2wDX)%miZg6EZ!M zUjVLCJsD~@i?q-)jz;ikRyp*`bxx~h_0om?leaaW>_M4j6zVsFWbA|ZBT03s)HL67 z!JJ0W^WA1iRlhS=5S(3o+vbMaqtkH|P6fH z_DE6b@tXcu%EJ4Fj}{l_`90^?)z_oeiQEbyZ)<4q&5G$Bi~}=7*s9KL1tVl}Kc?G? zAk030u41)%ufn~+uDBJtu}ioc#Qom{SPZIO)G5j3E;&)Jx-=}m0$%UVUK zub=rGKwgvYyyYHyqvZ600+d|c5#@GjI~!789$5BvS+iG}#LVLWvuH8}VCHedfGsOt z+K&idYa$!C7AvWTIzJhYb?Cg_%1_Q$bFRhQvhmf3WyTNB^n=xJsb7LJzY#f4#BtWW|`Ga-VFz#r7;Sz)b37^ta z^9}Wpy1aME!^oU&=9*I~6Ev|6_2u!yAh;r^-S;8AFV|CT_-duT+3+9|-K(zHcJ;G1 z)P10Uo5Vt8eM<)q)MMi-eEnDxk_3{O1zO&2_R%}&i|A{ zFKaHCNvA~YG1N&G4U4ywFDUj{URZVHWHfxq*suOEX74oO3|vEhl3Q>F53%~zJ-zJK z<%c>1o41szUDvlJv0R5Q-ZOB`)sj{}ymP-R1+z(=I}XD0la5G_T)SmoVHXLa$w_s1 zkL*|)xB7_NrSd%@T3%;oxunhF{V+%8AywgJl2_D$g(@ET1iK6ZDy6r*0KgRQpK@_- zTv6e&a)uGy1~|5l%vO!f?{il89slGY%BJ3A-6%FQkU6H{tzf<{tXz7i&oyeA!M@k4 z-^|Mqa#5ZU5?zp}W~Qgg=7N{LziSL#$eRIyi_YmT6lRAIKt{Ecy45`3Zq>O6WRSz5 zT-^2iHw_X0AA4^e4)y=H4NHqks8m!KQc+o=vNM)%X|qKk%ak?Qcf%}6sK_X?WG_-)Q|`?;UzIIjD;|M~rO9Y@FHICA*-d_M2j>wUh@ z*Lj}peew-vpgkA7_DZc!^#iUCOlgbK0Ll9g$JBgi-GT2Wp1|nV9-6a5&m;pb1@|8O zc9!50QXQ=XoVFIKf(f(%`9Iai?Ifo+e`Z2Tn)?%Gne2f$wbsuj) za*J9^Hb;t7ZtwM12j&-iL2Z_rR%BuRfYgUgK7Hd`0DJ%8wb(y+anA@`lm3oP-{tOdd6uM)s_vUgQgJD2LAPdU;}7{L<%oubPT4f~Q{nBYqjB-TEvT z`s&c5f@yilKZsSFdm8+ANFr0cm8^h2%A|3+R?W!cK!>jMd*L;_7YP6K-Z06p;W|$8 znglI6?E>y6m7-eL}Go4tT6Bz03iqD)O*m$i1VFS-r4RrA2_L*Dnaw5M-N@y?X%& zOxWud{jIMUY#eyqanfX@u2Y5v0Ip^G%h~W+?(M+^fS5-WnZ|aAb$a83Q)~XyI`zsm z5peVa0vJB9Oq2vqVxk&6 zu`U4f0UF(z0U$vnc5kv~HFvURY}-O3==uIYe>UP7wxC080K0z03o$>`vf598Z{N$_ zdTf7)rr=43!$@$F5o!CS40dJ?AgBKV%zv=B!$7)&9X(V)&q+SxS!cq%%va5y>`zVX zJ8+A+*?yxfKY-tXUQiB(%XnQUiVDACN`a0R8q73J#4|Uc`*SQBG?q2*4gqWcF>9## za0Jfnhz3>An%FPx>8&+Q1v_*gNxT$dy*F7jfXjhie8Qo^eD`BbqqD2TcnU(^Az&jX zR%(DPsai^hWCSrvu%x>{$asa{%Fz=Ob$+L&{*kLFmF|>4^#(h1+d@-{o)ZJiyr(dF zP6D?a=#{Mio0(@OVE=N0C5Ly$Amyiyd%h7aRfh1w8Mc*vV{11(9)dA4CK#)ZhJR+` zaE``>SG$yj%}^!3yO?UYn?^y_I01=6izJo5Z+6aK3VfHgnXGYz-OWWi$CZQ2?K#&wna|Uq5!J`&(8a6$ ztpsHt*Q(t05++brR3@|#!wgySX{%NjY*qzOw%aKc0|X4ENdioy)CIJfmhCnHKrv*0 zP)9=7e_oF7S~G|8lXDRcioEV6v#vL7F-- z#e7&tc}AD4h$x|$x8Bx?)^y)y2F}IZGNBcJ`VV22sXHb&=hLRJ(XR;oh;40FBwvR~ z2vyMH5z8r`gwOKh%!KtGMCQ1U^K7Jw(IeB#MQ%p&+5lo|Yr~$p*yuG3k>$=ef@AQX z*qD2oC-9?dn+=I|jg)WeW2Z5#3xP&D4J>}jP7%_}aE_tq%}9LUx`G{XGM(`c2~`A0 zC{!2Gfjzk7(|{h7^Tomlujl?lv?cRcdGGcJL3lTJ%87WTr~_{fg-)LGG6B6vTp{ch z^W)J+UMm-z4oSb!4tX+`D;|)stW|b~ds^~q6?ZaV(|`_B`--c)*-UQ-+M}Mz-&X5O z-hH=iAr~6f!x1+`mt4)f&RrZ(gJ)|rl|ye|am6kh!Jv#YEzwHHHG;wH^CSuMiloqg z<|PwR&Uy`E6)^3O#41Sz7X~0EhKAJ~0!9H}mrHsMsFL`|Z&9F6V9+~~WpCY9Lk6BX zyU3mg{r>kJ2m0*(csf4s)|!@?W#65m;`5_bhn^37kZYAfm+_wvsW%YPnOmoA0b!U> z>HB%&Hm|T00*=T!j-_<&u?B}hbd9>gcp9$j(hCK33U`}Z$6w>Hs+>RiMI9h*O}dI6 zq^MhN^scO&0s`c^7dlRp%pDaJOEahjUvjyS!*T-_E#VL_Ec1ueIJv!I&)22DS>hlB z&prKKDa5VJWCrT}{rA9L}{e8+^L^N+z&OKMul^R22~7%4QUxu4njKOlx?NW zOKHcnOQ*liImHI@jX0vSOAG48FU)Sve9{Bru;=gL z?3c0&HjTD7NO3p)@a zKY@OPpqw?ptzyu&unKlX_Fqoc(vK0)M+300F>$hYDvPD!X%3F~s6j+@a9d;@@`fEPSL} z5WWL!YvjWl><+D?pUS!PcY_~rFqC`m?8XPKSvALa?Mn(yP*>gUDOv&ZuTuoi;XH0f z`E?;p6EAJtp&bVo&u*&@8|D9njsA5j7wdLi?pCaG%#9Z^(xx1JDZex48?K|eZeOyE z8W^k%J?pF})OIq;*LDg4dXKd8u|J-FyME9(MB{Mtr`ypgq09r1S-s zgSKeMGpbg(=WfN3Lhj_~y=!l^O(?xaG1#7) zq5tkHKmVWC{Xeh!-?ZBQr@H^Ay8lg2;D4I=zv)5$uh#M3t?u~e-*ODv^0j!93p{nT zLc7IFnPAit+XlhkQ{DR&@u+mP{k2+-?ykSI|MjOOl8b3y#xo{wzokK_qTxNSv_WxO zU-rE+LYf)^H^qN`7mfH?To)qz`YZ@ks}{8I15@k87-h1ashZ@qgJ z=Om8iO!?mauHp$!iW_m)caLxyWgIHDxy?fG zSa51wit6si+Am2F;e{Sp%9yWb8}0+F{KN^PfcmNXRKJj{d+8U=FH1lnFR4VMjPUk2 z!yE_VE-kg4IUOtS&X%owRl9G?4M_^!V$Bt+>r5LI-2qgRu@-mATlpI|U+;acZL+K3 z3QuygmN0bDuWdn6O1B`!@%{TddDQJ)91L1V!Tiwu#mdTCN}Xow?Zbn_^)St1%bO2Nb1PvByXwk^ym>o`fBX;}~j}6=@aEBuw39h8yOu_Gtuk^$fa|wpd%cLKJUPbI>2w-$>Y~yv zC!>hpL#$p}>~W#}8u|O1S>)&c>O|3}cJOEC8vqS~VN})t+u;;id;6)FaF0lRr0t;D z7?UA#hp*O?wfBU=tam3P{bi>#3BR7*=jGa-8_T}kxvh9+ANuLv4^7~G@fjcBEkWv( zT(}3wkCEnBC~;=bkF}co!DD~|IQ@Z;=P*qoXjkY1}8PgQdfK>;R z;x%XSQrsUh{b?tEzV6xoVEO-fz5n&6-i^!=I1`!_)&s7r3arSr`?q=V5}sExHX6@$ zPo5F~NoEwh%e8viXnOd6^|A+I+)*>$adBXICmpKF+Lw%6JQ<7Afcnwp77Ka}BXrFd z|7lhKYQ@@tyVyWrGNnG3av$=30N7AtDdB>~sxqlrb_bJunsEP-1rQnwRyJ_7GH*-_ z-e@C0;gGR}wu|u*i>X={M#yn$(Jl`3U z_0rB>UhgA-24a+A%pjfdjKBr~(xh--xz=Ad`_yzY4nWtdD)!ON_3*zx_XVMLefV1a z=tJ<`GoZ&FcE8;Alz)8iStn}j*?o@6Dk-==^Sb(8gumb_ttw0$Noz#RAXxz^FW$G4 zw8A=3L(gi8gz(A|rMFUkPH1hNeWd^h8%sX^Fxo+e`_&6abBl%Wz5jG#kl1m-o zQ>^vk2hMdMevUlb$6>nI($ZMRXQCi71Xp9uZCjG%qnDnKb=ggeI{i{~oX3^xXHRP{ z)yRiC1drfq>lb9-)G<_t#|D;1IJmSC)I{dEL2?-r

-@BqG9>B+fzFVmV)Z`Wjq+glJtKCtTsLxmKDs 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

n>C5jP;W!wt{1h851XTl3iV7E`Tu@ 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

W{aZ9i%b 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 Yg}uRV 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

*SL+}CU0n}r$i7dJRBvrF9V=U2 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 z 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%0Aa23~W2fco>rh4GNGxqOm%9|*YVr#uEHrMQno)!I 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 z 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 TmSO!dHSmMlgm%f@=yT#fLj&qJ literal 0 HcmV?d00001 diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Theme.json b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Theme.json new file mode 100644 index 00000000..763df33c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/Theme.json @@ -0,0 +1,98 @@ +{ + "axisLabels" : { + "color" : "#000000FF", + "font" : { + "family" : "Helvetica", + "isBold" : false, + "isItalic" : false, + "size" : 13 + } + }, + "axisLeading" : 3, + "background" : "#FFFFFFFF", + "bandDimmingFactor" : 0.29999999999999999, + "border" : { + "capStyle" : "round", + "color" : "#000000FF", + "joinStyle" : "round", + "width" : 0.5 + }, + "curveFallback" : { + "color" : "#000000FF", + "lineWidth" : 4 + }, + "curves" : [ + { + "color" : "#F05138FF", + "lineWidth" : 8 + }, + { + "color" : "#FFC07FFF", + "lineWidth" : 6 + }, + { + "color" : "#FFE57FFF", + "lineWidth" : 6 + }, + { + "color" : "#93E6C0FF", + "lineWidth" : 6 + }, + ], + "hairlines" : { + "capStyle" : "round", + "color" : "#0000004D", + "joinStyle" : "round", + "width" : 0.5 + }, + "legendCornerOffset" : [ + 24, + 24 + ], + "legendLabels" : { + "color" : "#000000FF", + "font" : { + "family" : "Menlo", + "isBold" : false, + "isItalic" : false, + "size" : 13 + } + }, + "legendLineLeading" : 3, + "legendLineSampleWidth" : 24, + "legendPadding" : { + "bottom" : 12, + "left" : 12, + "right" : 12, + "top" : 12 + }, + "legendPosition" : "topLeft", + "legendSeparation" : 9, + "majorGridline" : { + "capStyle" : "butt", + "color" : "#0000007F", + "joinStyle" : "round", + "width" : 0.75 + }, + "margins" : { + "bottom" : 9, + "left" : 9, + "right" : 9, + "top" : 9 + }, + "minorGridline" : { + "capStyle" : "butt", + "color" : "#00000042", + "dash" : { + "phase" : 0, + "style" : [ + 6, + 3 + ] + }, + "joinStyle" : "round", + "width" : 0.5 + }, + "xPadding" : 6, + "yPadding" : 3 +} diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/generate-results.sh b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/generate-results.sh new file mode 100755 index 00000000..49baf896 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/generate-results.sh @@ -0,0 +1,16 @@ +#!/bin/sh +#===----------------------------------------------------------------------===// +# +# This source file is part of the Swift Collections open source project +# +# Copyright (c) 2021 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# +#===----------------------------------------------------------------------===// + +set -eux + +../../Utils/run-benchmarks.sh library run results.json --library Library.json --max-size 16M --cycles 20 --mode replace-all +../../Utils/run-benchmarks.sh library render results.json --library Library.json --max-time 10us --min-time 1ns --theme-file Theme.json --percentile 90 --output . diff --git a/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/results.json b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/results.json new file mode 100644 index 00000000..a58c75a5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Announcement-benchmarks/results.json @@ -0,0 +1 @@ +{"version":1,"tasks":[{"title":"std::deque at, random offsets","results":{"28":[3.442e-08,3.442e-08,3.442e-08,3.442e-08,3.442e-08,3.442e-08,3.442e-08,3.4429999999999998e-08,3.4429999999999998e-08,3.4429999999999998e-08,3.5749999999999999e-08,3.5980000000000002e-08,3.6020000000000001e-08,3.6029999999999999e-08,3.7310000000000001e-08,3.7319999999999999e-08,3.7779999999999998e-08,3.8630000000000002e-08,3.892e-08,4.0759999999999996e-08],"34":[4.5050000000000003e-08,4.5090000000000002e-08,4.5090000000000002e-08,4.5090000000000002e-08,4.5090000000000002e-08,4.51e-08,4.51e-08,4.51e-08,4.51e-08,4.51e-08,4.51e-08,4.5109999999999998e-08,4.5109999999999998e-08,4.5140000000000006e-08,4.5140000000000006e-08,4.5229999999999995e-08,4.6229999999999998e-08,4.6560000000000001e-08,4.7190000000000001e-08,4.9110000000000001e-08],"29":[3.5740000000000001e-08,3.5740000000000001e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5749999999999999e-08,3.5760000000000004e-08,3.5760000000000004e-08,3.5769999999999995e-08,3.7129999999999996e-08,3.7369999999999996e-08,3.7409999999999996e-08,3.742e-08,3.742e-08,3.7429999999999998e-08,3.8339999999999998e-08,4.2289999999999997e-08],"40":[5.1719999999999996e-08,5.1760000000000002e-08,5.1760000000000002e-08,5.1760000000000002e-08,5.1760000000000002e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.177e-08,5.1780000000000004e-08,5.1780000000000004e-08,5.1780000000000004e-08,5.1780000000000004e-08,5.1900000000000002e-08,5.4190000000000004e-08],"17408":[2.0809694444444444e-05,2.0890000000000002e-05,2.0891999999999999e-05,2.0920999999999998e-05,2.1532750000000001e-05,2.157459523809524e-05,2.1597849999999999e-05,2.1636000000000001e-05,2.1686290000000002e-05,2.1729090000000001e-05,2.1740840000000003e-05,2.1783679999999998e-05,2.1849e-05,2.1878966666666665e-05,2.193913e-05,2.1957279999999999e-05,2.204486e-05,2.208636e-05,2.2193080000000001e-05,2.229399e-05],"1472":[1.6656e-06,1.66761e-06,1.6686800000000001e-06,1.6689499999999999e-06,1.6769300000000002e-06,1.67822e-06,1.67872e-06,1.6789299999999999e-06,1.6831100000000001e-06,1.68471e-06,1.6853500000000001e-06,1.6872916666666666e-06,1.6877600000000001e-06,1.6891099999999999e-06,1.6899100000000002e-06,1.6941300000000002e-06,1.6950099999999999e-06,1.69522e-06,1.6992200000000001e-06,1.7567099999999999e-06],"112":[1.3187999999999999e-07,1.3189e-07,1.3194e-07,1.3200000000000002e-07,1.3206000000000001e-07,1.3207000000000002e-07,1.3209000000000001e-07,1.321e-07,1.321e-07,1.3210999999999998e-07,1.3210999999999998e-07,1.3210999999999998e-07,1.3211999999999999e-07,1.3234999999999999e-07,1.3241000000000001e-07,1.3246000000000001e-07,1.3283000000000001e-07,1.3385e-07,1.3488e-07,1.3514e-07],"1376256":[0.0103576295,0.010581736999999997,0.0106050255,0.010694301,0.011128743,0.0111377165,0.0112343535,0.011252343,0.011420239,0.0114469385,0.011530246000000003,0.011554452,0.011564687000000001,0.011595618,0.011613703,0.011779598,0.012380664,0.012931569,0.0129851715,0.014710902500000012],"5242880":[0.06621221200000002,0.066710434000000013,0.066819084500000001,0.067044103999999979,0.067096666000000027,0.067252526000000049,0.067306073999999966,0.067355611999999954,0.067362915999999967,0.067386782000000062,0.067411955999999967,0.067575289499999996,0.067622342999999974,0.067804616999999984,0.067894410000000002,0.06803638649999999,0.068050535999999967,0.068238768000000033,0.068263351,0.068338604499999997],"36":[4.7309999999999998e-08,4.7309999999999998e-08,4.7309999999999998e-08,4.7309999999999998e-08,4.7309999999999998e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7319999999999996e-08,4.7330000000000001e-08,4.7330000000000001e-08,4.7330000000000001e-08,4.737e-08,4.7539999999999994e-08,4.8339999999999995e-08,4.8650000000000002e-08,4.9530000000000001e-08],"42":[5.404e-08,5.404e-08,5.404e-08,5.4049999999999998e-08,5.4049999999999998e-08,5.4049999999999998e-08,5.4049999999999998e-08,5.4049999999999998e-08,5.4049999999999998e-08,5.4060000000000002e-08,5.4060000000000002e-08,5.4060000000000002e-08,5.4060000000000002e-08,5.4079999999999999e-08,5.4079999999999999e-08,5.4079999999999999e-08,5.4229999999999997e-08,5.5230000000000006e-08,5.5829999999999998e-08,5.6849999999999996e-08],"11534336":[0.15407092350000001,0.15420450099999999,0.15429484399999999,0.15483044499999998,0.1551639215,0.15541995650000001,0.15544913849999997,0.15558654,0.15594090250000001,0.15599065349999999,0.15599373299999997,0.156029688,0.15606384500000001,0.156076309,0.15622255199999999,0.1563919745,0.15654939949999999,0.15660137099999999,0.156886831,0.156942468],"114688":[0.000264942,0.0002678759999999999,0.00026909299999999987,0.00027104285714285711,0.00027285999999999999,0.00027509691666666668,0.00027534199999999998,0.00027733599999999988,0.00027822733333333341,0.00028054180000000004,0.00028066559999999997,0.00028094000000000009,0.00028321269230769226,0.00028393021739130429,0.00028564949999999986,0.00028771627272727288,0.00028796342857142853,0.00028928621739130443,0.00029004924999999994,0.0002964397272727273],"144":[1.6750000000000001e-07,1.6752000000000001e-07,1.6752000000000001e-07,1.6754e-07,1.6767000000000002e-07,1.6773000000000001e-07,1.6773000000000001e-07,1.6773999999999999e-07,1.6948000000000001e-07,1.6948999999999999e-07,1.6951000000000001e-07,1.6953999999999999e-07,1.6966999999999998e-07,1.6968000000000002e-07,1.6976000000000001e-07,1.6983999999999999e-07,1.6997000000000001e-07,1.7002000000000001e-07,1.7325000000000002e-07,1.9867000000000002e-07],"38":[4.9540000000000006e-08,4.9540000000000006e-08,4.9540000000000006e-08,4.9540000000000006e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9549999999999997e-08,4.9559999999999995e-08,4.9710000000000006e-08,5.1850000000000004e-08,5.205e-08,5.421e-08],"240":[2.7474000000000004e-07,2.7475e-07,2.7476000000000001e-07,2.7476000000000001e-07,2.7653e-07,2.7663000000000001e-07,2.7665999999999999e-07,2.7676e-07,2.7687000000000002e-07,2.7693999999999999e-07,2.7702999999999999e-07,2.7704e-07,2.7798e-07,2.7827000000000002e-07,2.7831000000000001e-07,2.7841000000000002e-07,2.7954999999999999e-07,2.8952999999999997e-07,2.9075999999999999e-07,2.91e-07],"9216":[1.0934999999999999e-05,1.0956333333333334e-05,1.0987e-05,1.1029000000000001e-05,1.1186220000000001e-05,1.120097e-05,1.125919e-05,1.129084e-05,1.133644e-05,1.1340300000000001e-05,1.134676e-05,1.1372960000000002e-05,1.1432882352941176e-05,1.1435410000000001e-05,1.1441380000000001e-05,1.144791e-05,1.151928e-05,1.1734569999999999e-05,1.2057089999999999e-05,1.2399090000000001e-05],"44":[5.6209999999999998e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6219999999999997e-08,5.6260000000000002e-08,5.634e-08,5.6439999999999995e-08,5.6439999999999995e-08,5.7320000000000006e-08,5.7919999999999999e-08,5.8459999999999995e-08,5.8830000000000005e-08,6.011e-08],"1664":[1.8867699999999999e-06,1.8889100000000001e-06,1.89325e-06,1.8943500000000001e-06,1.8971099999999999e-06,1.8973399999999999e-06,1.8975799999999999e-06,1.8982600000000001e-06,1.90398e-06,1.9048900000000001e-06,1.9077100000000002e-06,1.9080299999999998e-06,1.9082499999999999e-06,1.9090399999999997e-06,1.9096700000000001e-06,1.9129899999999999e-06,1.9205800000000002e-06,1.96674e-06,1.99451e-06,1.99563e-06],"196608":[0.0005651082,0.00056688516666666673,0.00057085981818181825,0.00057431416666666683,0.00057665490909090923,0.00057671372727272725,0.00057916072727272729,0.00057919660000000013,0.00058000383333333349,0.00058015940000000004,0.00058270749999999997,0.0005838752727272726,0.00059299672727272732,0.00059432599999999984,0.00059499399999999984,0.00060527518181818188,0.00060700266666666679,0.0006086504,0.00061202439999999999,0.00061721269999999982],"155648":[0.0004236203749999999,0.00042726099999999996,0.0004282228571428572,0.00043155014285714284,0.00043247785714285725,0.00043536160000000004,0.00043627300000000004,0.00043698973333333323,0.00044172937500000015,0.00044391171428571398,0.00044470778571428565,0.00044668059999999996,0.00044703571428571438,0.00044781550000000002,0.00044818385714285713,0.00045017271428571417,0.00045211364285714287,0.00045373685714285717,0.00045385742857142846,0.00047548076923076916],"2816":[3.2159230769230769e-06,3.21791e-06,3.2196200000000002e-06,3.21998e-06,3.22078e-06,3.2252200000000002e-06,3.2304500000000001e-06,3.2397999999999999e-06,3.3759000000000002e-06,3.3763505154639171e-06,3.3793499999999997e-06,3.3899899999999999e-06,3.4061900000000002e-06,3.5290400000000003e-06,3.5342500000000001e-06,3.5408100000000003e-06,3.5424499999999999e-06,3.5478999999999999e-06,3.7387199999999996e-06,3.80905e-06],"50":[6.2839999999999999e-08,6.2849999999999997e-08,6.2870000000000006e-08,6.2879999999999991e-08,6.2879999999999991e-08,6.2890000000000003e-08,6.2890000000000003e-08,6.2890000000000003e-08,6.2890000000000003e-08,6.2900000000000001e-08,6.2900000000000001e-08,6.2900000000000001e-08,6.2900000000000001e-08,6.2909999999999999e-08,6.2909999999999999e-08,6.2909999999999999e-08,6.2929999999999995e-08,6.5019999999999996e-08,6.5820000000000003e-08,6.9030000000000003e-08],"2359296":[0.026693489000000008,0.026824818,0.026932642499999992,0.026949682999999992,0.026992252500000001,0.027014224,0.027022306500000016,0.027071194,0.02717309,0.027192017999999991,0.027347110499999994,0.027362711499999991,0.027415211499999998,0.0274179635,0.027490697500000001,0.027503545000000001,0.027512927,0.027936511000000008,0.0283205825,0.030106611499999998],"46":[5.84e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8440000000000006e-08,5.8449999999999997e-08,5.8449999999999997e-08,5.8449999999999997e-08,5.8449999999999997e-08,5.8549999999999998e-08,6.0549999999999996e-08,6.0930000000000004e-08,6.1169999999999998e-08,6.1319999999999996e-08,6.5890000000000003e-08,6.6609999999999999e-08],"176":[2.0316999999999999e-07,2.0329000000000002e-07,2.0338000000000001e-07,2.0339e-07,2.0339999999999998e-07,2.0344e-07,2.0344999999999999e-07,2.0520000000000001e-07,2.0521e-07,2.0521e-07,2.0526e-07,2.0536999999999999e-07,2.0537999999999998e-07,2.0559999999999999e-07,2.0560999999999997e-07,2.0571000000000001e-07,2.0590000000000001e-07,2.0795000000000001e-07,2.1489000000000001e-07,2.2330000000000002e-07],"52":[6.5110000000000005e-08,6.5110000000000005e-08,6.5110000000000005e-08,6.5110000000000005e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.511999999999999e-08,6.5130000000000002e-08,6.5340000000000001e-08,6.6710000000000006e-08,6.6720000000000005e-08,6.814e-08,7.1480000000000002e-08,8.240000000000001e-08],"272":[3.1041000000000004e-07,3.1045999999999999e-07,3.1229999999999996e-07,3.1246999999999999e-07,3.1248000000000006e-07,3.1254999999999998e-07,3.1285999999999996e-07,3.1329999999999998e-07,3.1344999999999999e-07,3.1353000000000003e-07,3.1391999999999999e-07,3.1440999999999997e-07,3.1464999999999998e-07,3.2493000000000004e-07,3.2654999999999997e-07,3.2718e-07,3.2725263157894737e-07,3.2795000000000002e-07,3.4321000000000001e-07,3.4765999999999998e-07],"116":[1.3628999999999998e-07,1.3637e-07,1.3638999999999999e-07,1.3649e-07,1.3652000000000001e-07,1.3656e-07,1.3656e-07,1.3657000000000001e-07,1.3664000000000001e-07,1.3679e-07,1.3792999999999999e-07,1.3794999999999999e-07,1.3796e-07,1.3967000000000001e-07,1.3988000000000001e-07,1.4083e-07,1.4137e-07,1.4291999999999999e-07,1.4603000000000002e-07,1.4627e-07],"47104":[6.7254000000000004e-05,6.7309380000000002e-05,6.7320833333333328e-05,6.772007e-05,6.7749810000000007e-05,6.7867239130434779e-05,6.8017154639175254e-05,6.8600610000000287e-05,6.8779642857142858e-05,6.9096123076923074e-05,6.9154388235294115e-05,6.9163030927835042e-05,6.9270738095238092e-05,6.9532142857142861e-05,6.966493e-05,6.9857489999999999e-05,6.9933888888888882e-05,6.9953890000000007e-05,7.0390829999999999e-05,7.1944763157894736e-05],"6912":[8.161340909090908e-06,8.1792999999999998e-06,8.1796000000000004e-06,8.1894300000000003e-06,8.1974117647058838e-06,8.28249e-06,8.2914800000000004e-06,8.3397900000000003e-06,8.3557000000000003e-06,8.3620900000000001e-06,8.3641100000000008e-06,8.3724100000000004e-06,8.3915400000000003e-06,8.4055100000000001e-06,8.4227199999999995e-06,8.51269e-06,8.5144900000000005e-06,8.5442500000000004e-06,8.8182600000000005e-06,8.9556200000000008e-06],"1856":[2.1017000000000001e-06,2.10587e-06,2.1061699999999999e-06,2.1062300000000002e-06,2.1066899999999998e-06,2.1066999999999997e-06,2.10688e-06,2.1088099999999999e-06,2.1108900000000001e-06,2.1128999999999997e-06,2.1130699999999997e-06,2.1154900000000001e-06,2.11762e-06,2.12052e-06,2.1211299999999999e-06,2.1224100000000001e-06,2.1265999999999997e-06,2.1305299999999997e-06,2.1326799999999998e-06,2.1329299999999999e-06],"48":[6.0619999999999996e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.0660000000000002e-08,6.067e-08,6.067e-08,6.067e-08,6.0679999999999998e-08,6.0679999999999998e-08,6.081e-08,6.088e-08,6.0909999999999994e-08,6.1710000000000001e-08,6.2579999999999995e-08,6.3489999999999995e-08,6.6800000000000003e-08],"2097152":[0.0226580945,0.022723894000000001,0.022735948999999998,0.022877897500000001,0.0230610945,0.023061452999999999,0.023071294999999999,0.023098845999999999,0.023102081,0.023134787,0.023181926499999998,0.023196393500000002,0.023204521500000002,0.023284478500000001,0.023379307000000023,0.023494382000000001,0.023661061000000001,0.024007119,0.024126019000000005,0.02422392700000001],"54":[6.7340000000000006e-08,6.7340000000000006e-08,6.7340000000000006e-08,6.7340000000000006e-08,6.7340000000000006e-08,6.7340000000000006e-08,6.7340000000000006e-08,6.7350000000000004e-08,6.7350000000000004e-08,6.7360000000000002e-08,6.7360000000000002e-08,6.7389999999999997e-08,6.7560000000000004e-08,6.7570000000000002e-08,6.758e-08,6.758e-08,6.7599999999999997e-08,7.0480000000000006e-08,7.3939999999999999e-08,1.0203999999999999e-07],"2031616":[0.021561539000000001,0.0218579655,0.021894879500000002,0.021950931999999999,0.021957216499999998,0.022000473999999999,0.022102384500000002,0.022137298,0.022159124000000002,0.022189596999999998,0.022211585499999992,0.022242894999999999,0.022276760499999989,0.022301204500000001,0.022568392,0.022648112000000001,0.0226736625,0.023026415000000008,0.023275915000000001,0.023825277500000002],"43008":[5.981390909090909e-05,6.002262903225806e-05,6.0257999999999998e-05,6.0276999999999999e-05,6.0362000000000002e-05,6.0447116666666669e-05,6.2348359999999991e-05,6.2386530000000005e-05,6.2390170000000002e-05,6.2433491228070174e-05,6.2462630000000003e-05,6.3211309999999996e-05,6.3280367346938774e-05,6.3359059999999992e-05,6.3447000000000004e-05,6.3462999999999999e-05,6.3920779999999998e-05,6.4076339999999998e-05,6.4171038461538458e-05,6.5159442307692307e-05],"60":[7.3959999999999995e-08,7.4009999999999999e-08,7.4009999999999999e-08,7.4019999999999997e-08,7.4019999999999997e-08,7.4029999999999995e-08,7.4029999999999995e-08,7.4029999999999995e-08,7.4029999999999995e-08,7.4060000000000003e-08,7.4089999999999997e-08,7.4120000000000005e-08,7.4189999999999991e-08,7.4229999999999997e-08,7.5619999999999998e-08,7.6059999999999994e-08,7.7460000000000007e-08,7.7470000000000005e-08,7.7490000000000001e-08,7.7690000000000003e-08],"30720":[3.8414999999999997e-05,3.8921999999999998e-05,3.9696000000000001e-05,4.056347222222222e-05,4.0713999999999997e-05,4.0935e-05,4.1219e-05,4.2281580000000004e-05,4.2298960000000007e-05,4.2337850000000003e-05,4.2342129999999998e-05,4.2688000000000002e-05,4.2699319999999994e-05,4.274735e-05,4.2748539999999995e-05,4.2964499999999998e-05,4.3124434782608695e-05,4.3612999999999997e-05,4.5181539999999997e-05,4.5823499999999999e-05],"56":[6.9559999999999996e-08,6.9569999999999994e-08,6.9569999999999994e-08,6.9569999999999994e-08,6.9580000000000005e-08,6.9580000000000005e-08,6.9580000000000005e-08,6.9580000000000005e-08,6.9789999999999992e-08,7.0790000000000001e-08,7.0850000000000002e-08,7.1480000000000002e-08,7.1729999999999994e-08,7.2800000000000003e-08,7.2800000000000003e-08,7.2800000000000003e-08,7.2810000000000001e-08,7.2810000000000001e-08,7.2829999999999998e-08,7.289e-08],"62":[7.6199999999999994e-08,7.6199999999999994e-08,7.624e-08,7.624e-08,7.624e-08,7.6249999999999998e-08,7.6249999999999998e-08,7.6249999999999998e-08,7.6249999999999998e-08,7.6249999999999998e-08,7.6260000000000009e-08,7.6269999999999994e-08,7.6290000000000004e-08,7.6300000000000002e-08,7.6480000000000007e-08,7.7309999999999995e-08,7.7729999999999995e-08,7.8059999999999999e-08,8.0020000000000011e-08,8.0280000000000002e-08],"58":[7.1750000000000004e-08,7.1779999999999998e-08,7.1779999999999998e-08,7.1789999999999996e-08,7.1789999999999996e-08,7.1789999999999996e-08,7.1789999999999996e-08,7.1789999999999996e-08,7.1799999999999994e-08,7.1810000000000006e-08,7.1810000000000006e-08,7.1820000000000004e-08,7.184e-08,7.2010000000000008e-08,7.3119999999999996e-08,7.3230000000000001e-08,7.3879999999999997e-08,7.514000000000001e-08,7.5149999999999995e-08,7.8839999999999997e-08],"3014656":[0.036056488499999997,0.036189091499999979,0.036234726500000008,0.036256879500000019,0.036279469499999994,0.036294749500000001,0.036297035499999998,0.036429569000000002,0.03643838249999997,0.0364492415,0.036514406999999999,0.036541794999999988,0.036546699000000002,0.036654688999999997,0.036713062499999997,0.036725674,0.036917639999999988,0.037217419000000002,0.037453911999999978,0.0374742255],"64":[7.8460000000000002e-08,7.8470000000000001e-08,7.8479999999999999e-08,7.8479999999999999e-08,7.8479999999999999e-08,7.8479999999999999e-08,7.8499999999999995e-08,7.8509999999999993e-08,7.8509999999999993e-08,7.8509999999999993e-08,7.868e-08,7.8699999999999997e-08,8.0519999999999996e-08,8.0649999999999998e-08,8.138999999999999e-08,8.1670000000000003e-08,8.2130000000000008e-08,8.2360000000000004e-08,8.2439999999999989e-08,8.6139999999999989e-08],"8388608":[0.109017873,0.109117829,0.1095111565,0.10961418950000001,0.10967302750000001,0.109701653,0.110036498,0.11034600899999999,0.110467178,0.1105659255,0.110776257,0.1108421065,0.111036367,0.111236272,0.111257551,0.1113865,0.1114491485,0.111591574,0.1116112635,0.113035092],"29696":[3.7045000000000002e-05,3.7048999999999997e-05,3.7267500000000002e-05,3.7367999999999999e-05,3.8170999999999998e-05,3.8372549019607843e-05,3.8465639999999996e-05,3.856256e-05,3.8587352941176469e-05,3.8858e-05,3.8916579999999998e-05,3.94177e-05,3.9434539999999999e-05,3.9651717391304351e-05,4.0346890000000004e-05,4.046623255813953e-05,4.0961514285714285e-05,4.1141128205128206e-05,4.1348979999999999e-05,4.2565830000000007e-05],"216":[2.4794999999999999e-07,2.4806000000000001e-07,2.4864999999999999e-07,2.4881999999999997e-07,2.4885000000000001e-07,2.4885999999999997e-07,2.4901000000000003e-07,2.4970999999999998e-07,2.4982e-07,2.5031999999999998e-07,2.5106999999999998e-07,2.5301999999999997e-07,2.6090000000000001e-07,2.6187e-07,2.6234000000000001e-07,2.6262000000000001e-07,2.6363000000000004e-07,2.6409999999999999e-07,2.7419e-07,2.7557000000000003e-07],"106496":[0.00021352400000000004,0.00022744699999999998,0.00023510752000000006,0.00023544000000000004,0.000235656962962963,0.00023977231249999999,0.00024209893333333328,0.00024309750000000001,0.00024432716666666665,0.00024464112500000002,0.00024476040000000004,0.00024719696,0.00024882806666666674,0.0002511862307692308,0.00025398941666666665,0.00025665809090909085,0.00026109365384615382,0.00026193400000000002,0.0002680526,0.0002874207],"72":[8.7360000000000009e-08,8.7360000000000009e-08,8.7369999999999994e-08,8.7369999999999994e-08,8.7369999999999994e-08,8.7369999999999994e-08,8.7369999999999994e-08,8.7369999999999994e-08,8.7380000000000006e-08,8.7399999999999989e-08,8.7469999999999988e-08,8.7579999999999994e-08,8.7590000000000005e-08,8.7590000000000005e-08,8.7600000000000004e-08,8.9339999999999991e-08,8.9550000000000004e-08,9.146e-08,9.5759999999999992e-08,1.1654000000000001e-07],"442368":[0.001391883,0.0014449390000000001,0.0014456529999999994,0.001446131,0.001446363,0.001458481,0.0014586935,0.0014604435,0.001465655,0.001467491,0.0014682665000000001,0.0014857519999999999,0.0014860700000000001,0.001492331,0.0014926065,0.0015015,0.0015033780000000001,0.001505029,0.00152305,0.0015589810000000005],"147456":[0.00039428800000000002,0.00039457000000000001,0.00040296993749999992,0.000404041,0.00040490506249999997,0.00040490900000000001,0.00040643387500000002,0.00040718286666666684,0.00040938418749999995,0.00041057577777777778,0.00041209624999999996,0.00041314137500000003,0.00041526093333333329,0.00041832300000000012,0.00041921512499999995,0.00042308599999999987,0.00042321087499999979,0.00042356333333333338,0.00042623237499999999,0.00044872368750000017],"4456448":[0.05531356300000001,0.05566508550000001,0.055845055000000011,0.05595399999999999,0.056025224499999984,0.056139697999999981,0.056162224999999996,0.056176314999999998,0.056240511999999999,0.05632438,0.056329474000000025,0.056330505999999982,0.056396435999999973,0.056446917999999992,0.056464928999999997,0.056576837000000026,0.056769899999999998,0.056793354000000004,0.056898841999999963,0.058425944],"63488":[8.7856999999999996e-05,9.1836000000000006e-05,9.2458581818181823e-05,9.3197268656716416e-05,9.3494999999999998e-05,9.381731746031746e-05,9.3854310344827595e-05,9.3938914285714284e-05,9.4465476190476195e-05,9.4687999999999999e-05,9.4945999999999995e-05,9.5351157142857133e-05,9.5533999999999997e-05,9.6109339999999994e-05,9.6365372093023239e-05,9.6833384615384625e-05,9.8677974358974367e-05,9.8950517241379318e-05,9.9424437500000002e-05,0.000105228],"38912":[5.1393333333333328e-05,5.1651999999999999e-05,5.1690000000000001e-05,5.3921000000000001e-05,5.3962499999999997e-05,5.3968999999999998e-05,5.4380333333333332e-05,5.4503660000000002e-05,5.4649820000000001e-05,5.5067e-05,5.5220999999999999e-05,5.5511356164383567e-05,5.5881194805194805e-05,5.624208e-05,5.6283986842105262e-05,5.6306230000000002e-05,5.7092239999999998e-05,5.7629749999999998e-05,5.7967149999999999e-05,5.8571350000000003e-05],"68":[8.287e-08,8.2910000000000006e-08,8.2910000000000006e-08,8.2919999999999991e-08,8.2919999999999991e-08,8.2919999999999991e-08,8.2930000000000002e-08,8.2930000000000002e-08,8.2949999999999998e-08,8.2989999999999991e-08,8.3130000000000004e-08,8.3130000000000004e-08,8.3319999999999994e-08,8.3869999999999996e-08,8.3950000000000007e-08,8.4919999999999995e-08,8.5189999999999997e-08,8.678e-08,8.6799999999999996e-08,9.1090000000000004e-08],"188416":[0.00053894199999999983,0.00054194360000000001,0.00054422100000000011,0.0005488489999999998,0.00054996579999999997,0.00055082199999999997,0.00055211430000000014,0.00055381780000000002,0.00055982141666666662,0.00055995620000000009,0.00056014499999999996,0.00056123341666666673,0.00056173740000000001,0.0005680514,0.00056873554545454547,0.00057045700000000002,0.00057408559999999999,0.00057515919999999996,0.00058208119999999999,0.00059519899999999982],"248":[2.8368999999999997e-07,2.8485000000000001e-07,2.8529999999999999e-07,2.8566000000000003e-07,2.8571999999999999e-07,2.8587e-07,2.8587e-07,2.8588000000000002e-07,2.8626999999999998e-07,2.8663999999999998e-07,2.8738999999999998e-07,2.8795999999999999e-07,2.8798999999999997e-07,2.8834e-07,2.8900000000000001e-07,2.9878000000000003e-07,2.9887000000000003e-07,3.0081e-07,3.0116000000000003e-07,3.1142000000000002e-07],"80":[9.6229999999999995e-08,9.6229999999999995e-08,9.6260000000000003e-08,9.6270000000000001e-08,9.6270000000000001e-08,9.6270000000000001e-08,9.6290000000000011e-08,9.6290000000000011e-08,9.6299999999999995e-08,9.6320000000000005e-08,9.6330000000000003e-08,9.6460000000000005e-08,9.6489999999999999e-08,9.6489999999999999e-08,9.7240000000000003e-08,9.8689999999999992e-08,9.914e-08,1.0078999999999999e-07,1.0081e-07,1.1657e-07],"2560":[2.9078300000000003e-06,2.9124599999999998e-06,2.91308e-06,2.9132399999999997e-06,2.9146999999999998e-06,2.9153700000000001e-06,2.9161475409836064e-06,2.9171800000000001e-06,2.9175400000000003e-06,2.91782e-06,2.91793e-06,2.91819e-06,2.91822e-06,2.91908e-06,2.92224e-06,2.9224900000000001e-06,2.9256899999999999e-06,2.9308200000000001e-06,2.9332900000000001e-06,3.7232600000000002e-06],"34816":[4.5274000000000001e-05,4.71065e-05,4.7121606382978726e-05,4.7220430000000001e-05,4.7732219999999998e-05,4.8116840000000003e-05,4.8454530000000004e-05,4.8628950000000001e-05,4.8907119999999999e-05,4.9042170000000001e-05,4.9291089999999999e-05,4.93066e-05,4.9386499999999999e-05,4.9772439999999994e-05,4.9777129999999997e-05,4.9867640000000006e-05,4.9921760416666665e-05,5.0364648351648357e-05,5.1487999999999999e-05,5.3685488372093022e-05],"3712":[4.3059900000000001e-06,4.3087199999999996e-06,4.3100799999999999e-06,4.3104799999999999e-06,4.3115900000000005e-06,4.3130399999999995e-06,4.3149199999999997e-06,4.3161799999999997e-06,4.3181100000000001e-06,4.3200399999999996e-06,4.3236399999999998e-06,4.3238500000000001e-06,4.3250526315789471e-06,4.3347000000000002e-06,4.4447799999999996e-06,4.4924599999999995e-06,4.5023399999999995e-06,4.5270400000000003e-06,4.7407600000000002e-06,5.0952799999999996e-06],"3538944":[0.043069347000000001,0.0431070775,0.043124292000000002,0.043203704500000009,0.043210999,0.043249577000000004,0.043505319000000001,0.043548402,0.043686427999999985,0.043742931999999998,0.043809982999999997,0.043840920999999991,0.043862093000000019,0.043914386999999999,0.043925571000000004,0.043983324999999997,0.04412250500000002,0.044250619500000019,0.044272793000000019,0.044382726999999997],"76":[9.1810000000000013e-08,9.1819999999999998e-08,9.1819999999999998e-08,9.1819999999999998e-08,9.1819999999999998e-08,9.1829999999999996e-08,9.1840000000000007e-08,9.1849999999999992e-08,9.1880000000000013e-08,9.1880000000000013e-08,9.2029999999999998e-08,9.2029999999999998e-08,9.2029999999999998e-08,9.2040000000000009e-08,9.2040000000000009e-08,9.2040000000000009e-08,9.2050000000000007e-08,9.3100000000000006e-08,9.3489999999999999e-08,9.6090000000000009e-08],"4194304":[0.051874014499999996,0.052073853999999975,0.052146065000000019,0.052265180000000001,0.052286908999999993,0.052337776000000003,0.052446326000000001,0.052497343499999981,0.052577348499999996,0.052674669,0.052730458000000001,0.05274504,0.052803745499999999,0.052945425999999997,0.052966224499999992,0.053030091500000001,0.053112590999999987,0.053126574000000003,0.053260744000000027,0.053294300000000003],"851968":[0.0036165820000000001,0.003638040999999999,0.0036572550000000003,0.0036682240000000012,0.0036969939999999999,0.0037155449999999994,0.003762409,0.0038105529999999999,0.0038173,0.0038332290000000014,0.0038456799999999998,0.003853614,0.0039030779999999999,0.0039299040000000014,0.0039641030000000001,0.003980361,0.0040948369999999996,0.0041739060000000007,0.0041820439999999993,0.0051863249999999994],"4096":[4.7707300000000003e-06,4.7735799999999998e-06,4.7742299999999995e-06,4.7758799999999997e-06,4.7785000000000001e-06,4.7788900000000003e-06,4.7820899999999996e-06,4.7829999999999998e-06,4.7832000000000002e-06,4.7863100000000001e-06,4.78758e-06,4.7937222222222224e-06,4.7961900000000001e-06,4.9185200000000001e-06,4.9193000000000005e-06,4.9969081632653056e-06,4.9996899999999999e-06,5.0003199999999999e-06,5.0012926829268288e-06,5.2573599999999996e-06],"59392":[8.5968121951219523e-05,8.649308219178082e-05,8.6687674418604654e-05,8.6937166666666672e-05,8.6970541666666669e-05,8.7262000000000006e-05,8.7281780487804872e-05,8.7450399999999999e-05,8.7528999999999995e-05,8.7630321839080464e-05,8.7751363636363636e-05,8.7875290322580641e-05,8.8331560000000004e-05,8.8442294117647058e-05,8.8605999999999998e-05,8.8672970149253732e-05,8.9378388888888889e-05,8.9754380281690139e-05,9.0092021739130425e-05,9.2245657894736839e-05],"84":[1.0071000000000001e-07,1.0071999999999999e-07,1.0071999999999999e-07,1.0071999999999999e-07,1.0073e-07,1.0073e-07,1.0074e-07,1.0075e-07,1.0078999999999999e-07,1.0088e-07,1.0091999999999999e-07,1.0094e-07,1.0108999999999999e-07,1.0210000000000001e-07,1.0238999999999999e-07,1.0295000000000001e-07,1.0322999999999999e-07,1.0357999999999999e-07,1.0543000000000001e-07,1.3573000000000001e-07],"3276800":[0.039542240000000006,0.039744536499999997,0.039831688500000004,0.039901995499999988,0.039945149999999999,0.040072803500000004,0.040112962999999981,0.040154926000000001,0.040199851500000008,0.040279029500000021,0.040360576500000002,0.040379845499999997,0.040449452999999982,0.040451094,0.040453659000000003,0.040462485499999992,0.04048293800000001,0.040528389000000012,0.040706102000000001,0.041425813500000019],"55296":[7.6167000000000004e-05,7.9178999999999995e-05,7.9412999999999993e-05,7.9465987341772155e-05,7.9703211111111115e-05,8.0058454545454537e-05,8.0094758620689646e-05,8.0255461538461539e-05,8.0946852459016402e-05,8.1011530120481923e-05,8.1087974358974354e-05,8.1564233333333334e-05,8.1704967032967038e-05,8.1835975903614462e-05,8.1930111111111112e-05,8.2494699999999995e-05,8.2595133333333338e-05,8.2667897435897446e-05,8.2788580645161287e-05,8.3064581395348832e-05],"688128":[0.0024999650000000007,0.0025088910000000001,0.002590831,0.0026204139999999993,0.0026641019999999998,0.0026668069999999998,0.0026672650000000011,0.0026693090000000008,0.0026924309999999999,0.0027321620000000002,0.0027593240000000001,0.0028462840000000006,0.0028687835000000004,0.0028740525000000008,0.0028743470000000002,0.0028789345000000003,0.002928965999999999,0.0030132965000000001,0.0030879709999999988,0.0035226860000000014],"8192":[9.7132000000000004e-06,9.7144999999999999e-06,9.7219999999999994e-06,9.728057142857143e-06,9.8783000000000016e-06,9.9660700000000006e-06,9.9675200000000004e-06,9.9950199999999997e-06,1.006407e-05,1.006528e-05,1.008213e-05,1.008414e-05,1.0090159999999999e-05,1.0108009999999999e-05,1.012741e-05,1.0203029999999999e-05,1.036912e-05,1.045664e-05,1.14901e-05,1.159307e-05],"10240":[1.2242000000000001e-05,1.2499830000000001e-05,1.252057e-05,1.257305e-05,1.26467e-05,1.264696e-05,1.2686e-05,1.2700999999999999e-05,1.271447e-05,1.2754e-05,1.2791720000000001e-05,1.281129e-05,1.2833999999999999e-05,1.2846009999999999e-05,1.2922050000000001e-05,1.2945750000000001e-05,1.3358210000000001e-05,1.3366879999999999e-05,1.4406000000000001e-05,1.451594e-05],"15872":[1.8974666666666666e-05,1.95497e-05,1.9694000000000002e-05,1.9696629629629629e-05,1.9697000000000001e-05,1.9891520000000002e-05,1.9893259999999999e-05,1.9951589743589744e-05,2.0073679999999999e-05,2.0103780000000001e-05,2.0117000000000001e-05,2.017055e-05,2.0389259999999999e-05,2.0398679999999997e-05,2.0463419999999999e-05,2.0752999999999999e-05,2.2027700000000003e-05,2.2061780000000001e-05,2.2508990000000004e-05,2.3294219999999999e-05],"92":[1.0963e-07,1.0964000000000001e-07,1.0964000000000001e-07,1.0964999999999999e-07,1.097e-07,1.0977e-07,1.0978999999999999e-07,1.0983e-07,1.0983e-07,1.0983e-07,1.0984e-07,1.0984e-07,1.0984e-07,1.1097000000000001e-07,1.1141999999999999e-07,1.1175e-07,1.1178e-07,1.1207e-07,1.2982999999999999e-07,1.6935999999999998e-07],"26624":[3.2236333333333335e-05,3.2772499999999998e-05,3.3137499999999999e-05,3.3287000000000002e-05,3.3621000000000002e-05,3.3741434782608694e-05,3.3769999999999997e-05,3.4270999999999998e-05,3.4276000000000002e-05,3.4476929999999997e-05,3.4495216867469879e-05,3.4562666666666667e-05,3.4619210000000003e-05,3.4907129870129871e-05,3.4962380000000001e-05,3.4983919999999997e-05,3.5410039999999998e-05,3.6647999999999999e-05,3.676e-05,3.6929079999999997e-05],"1792":[2.0306399999999999e-06,2.0310499999999998e-06,2.0321999999999998e-06,2.0337200000000002e-06,2.0349199999999999e-06,2.0358799999999997e-06,2.03681e-06,2.0371100000000002e-06,2.03738e-06,2.0392400000000001e-06,2.0418399999999999e-06,2.0421099999999997e-06,2.0440400000000001e-06,2.0458599999999999e-06,2.0478200000000002e-06,2.0484000000000002e-06,2.0516500000000001e-06,2.05289e-06,2.0535700000000001e-06,2.0561000000000001e-06],"11776":[1.4003442307692308e-05,1.4051666666666666e-05,1.4459099999999998e-05,1.453114e-05,1.453133e-05,1.45316e-05,1.4541101694915256e-05,1.4541809999999999e-05,1.455115e-05,1.4576199999999999e-05,1.4590939999999999e-05,1.4596000000000001e-05,1.4656929999999999e-05,1.4665119999999999e-05,1.4730469999999999e-05,1.486622e-05,1.503877e-05,1.509512e-05,1.5308800000000002e-05,1.672127e-05],"2944":[3.3713299999999998e-06,3.3726555555555559e-06,3.3737099999999998e-06,3.3747699999999999e-06,3.37554e-06,3.3762e-06,3.3768699999999998e-06,3.3780434782608693e-06,3.3780799999999998e-06,3.3782199999999998e-06,3.3792499999999999e-06,3.38168e-06,3.3822200000000001e-06,3.3877499999999999e-06,3.38875e-06,3.3894200000000002e-06,3.3906499999999999e-06,3.5488799999999999e-06,3.7069799999999997e-06,3.7120799999999999e-06],"88":[1.0517999999999999e-07,1.0517999999999999e-07,1.0517999999999999e-07,1.0519e-07,1.0522e-07,1.0523000000000001e-07,1.0523000000000001e-07,1.0523000000000001e-07,1.0539000000000001e-07,1.054e-07,1.0540999999999999e-07,1.0540999999999999e-07,1.0542e-07,1.0655000000000001e-07,1.0656e-07,1.0675e-07,1.0733000000000001e-07,1.0739e-07,1.1008e-07,1.1297e-07],"22528":[2.7098999999999999e-05,2.7138999999999999e-05,2.7803000000000001e-05,2.7903e-05,2.814618e-05,2.8239945945945945e-05,2.828e-05,2.8359113636363635e-05,2.8543000000000001e-05,2.8669289999999999e-05,2.8684149999999999e-05,2.873618e-05,2.8867039999999999e-05,2.8907770000000003e-05,2.8989e-05,2.9292120000000002e-05,2.9445320000000002e-05,3.0688799999999997e-05,3.1012000000000001e-05,3.1525000000000001e-05],"1245184":[0.0080085529999999981,0.0080682289999999997,0.008181364,0.0082147120000000007,0.0082665944999999984,0.0084025990000000002,0.0084054560000000021,0.0084884509999999993,0.0085577274999999974,0.0085871394999999968,0.0086923880000000005,0.0088884024999999998,0.0088999690000000024,0.0091452259999999994,0.0092206089999999994,0.0094016129999999996,0.0094403425000000006,0.0094560019999999963,0.010378828000000007,0.010556922],"15728640":[0.21885550399999998,0.219417164,0.21999850000000001,0.22009331600000001,0.22032594050000001,0.22061917450000001,0.2209160855,0.22096864700000002,0.22097366600000001,0.22118406199999999,0.22132047449999998,0.22166812,0.22208026450000001,0.22213492949999999,0.222139106,0.22262419050000001,0.2230299255,0.223155038,0.22342158499999998,0.22508320100000001],"96":[1.1406999999999999e-07,1.1408e-07,1.1412000000000001e-07,1.1413e-07,1.1413e-07,1.1413e-07,1.1430000000000001e-07,1.1430000000000001e-07,1.1430000000000001e-07,1.1430000000000001e-07,1.1431e-07,1.1431e-07,1.1433999999999999e-07,1.1467000000000001e-07,1.1591e-07,1.1623e-07,1.1637999999999999e-07,1.166e-07,1.194e-07,1.1960000000000001e-07],"1984":[2.2472900000000002e-06,2.2506199999999998e-06,2.2506499999999998e-06,2.2508500000000002e-06,2.2508799999999998e-06,2.2523700000000003e-06,2.2525500000000001e-06,2.2547800000000003e-06,2.2559899999999998e-06,2.2566699999999999e-06,2.2572299999999997e-06,2.25744e-06,2.25862e-06,2.2589300000000001e-06,2.2604400000000002e-06,2.2611499999999999e-06,2.3568620689655175e-06,2.35818e-06,2.36025e-06,2.4699299999999998e-06],"139264":[0.000363755,0.00036531400000000005,0.00036693125,0.00037175966666666658,0.00037347375000000002,0.00037355264705882365,0.00037382840000000001,0.00037795612500000014,0.00037844144444444449,0.00037885066666666666,0.00038035599999999999,0.00038036268750000015,0.00038227422222222217,0.00038434912500000007,0.00038478676470587992,0.00038615237499999998,0.00038678137500000001,0.00039128833333333337,0.00039174857142857138,0.00039259312499999988],"475136":[0.001489333,0.001532748,0.0015402700000000001,0.001550336,0.0015522576666666666,0.0015551846666666666,0.0015711235,0.0015762714999999999,0.0015883634999999999,0.00159385,0.0015943883333333331,0.0016086140000000006,0.0016179014999999999,0.0016189925,0.001624154,0.0016388836666666664,0.0016477524999999999,0.0016856130000000001,0.0016971293333333329,0.0020763146666666664],"13631488":[0.18589469250000001,0.1864194545,0.18645109500000001,0.18646132900000001,0.18716332899999999,0.18758438,0.18781015899999998,0.187882984,0.18789137199999995,0.18809373400000001,0.18820129149999998,0.18857022100000001,0.1888222745,0.18908456300000001,0.18919502699999999,0.18989070350000001,0.1901866435,0.19079566749999999,0.19195954900000001,0.1924435545],"416":[4.7066000000000001e-07,4.7067000000000002e-07,4.7206999999999996e-07,4.7295000000000001e-07,4.7309999999999997e-07,4.7364999999999996e-07,4.7417999999999998e-07,4.7442999999999999e-07,4.7453999999999996e-07,4.7457000000000005e-07,4.7472999999999996e-07,4.7484999999999999e-07,4.7496000000000001e-07,4.7506000000000002e-07,4.7528e-07,4.7546999999999996e-07,4.757e-07,4.7642999999999999e-07,5.1981000000000005e-07,5.2050999999999999e-07],"928":[1.0440399999999999e-06,1.0469000000000001e-06,1.04794e-06,1.0479899999999999e-06,1.0481899999999999e-06,1.0484899999999999e-06,1.0485e-06,1.0489700000000001e-06,1.04906e-06,1.0490800000000001e-06,1.0492499999999999e-06,1.0493399999999999e-06,1.04955e-06,1.0501900000000001e-06,1.05113e-06,1.0517199999999999e-06,1.0990500000000001e-06,1.09972e-06,1.1960000000000001e-06,1.327e-06],"512":[5.8059000000000004e-07,5.8065e-07,5.8069000000000005e-07,5.8084000000000006e-07,5.8084000000000006e-07,5.8093e-07,5.8095999999999998e-07,5.8103999999999997e-07,5.8121e-07,5.8144e-07,5.8166999999999999e-07,5.8169000000000002e-07,5.8194999999999999e-07,5.8211000000000007e-07,5.8217999999999999e-07,5.8218999999999995e-07,6.0788999999999997e-07,6.0816999999999997e-07,6.0849000000000002e-07,6.0905999999999998e-07],"18432":[2.200007692307692e-05,2.2874449999999999e-05,2.2911619999999997e-05,2.293476e-05,2.2948000000000001e-05,2.2977999999999999e-05,2.299971e-05,2.3015624999999999e-05,2.3042000000000001e-05,2.3084421052631578e-05,2.3092466666666666e-05,2.3113e-05,2.3122849999999998e-05,2.3130780000000001e-05,2.3147999999999999e-05,2.3224349999999997e-05,2.3400139999999999e-05,2.3455199999999999e-05,2.3846390000000002e-05,2.6263819444444445e-05],"16777216":[0.234653261,0.2363455985,0.2368176615,0.23715776499999999,0.23715810349999999,0.2377974175,0.23789452450000001,0.23807584999999998,0.238293278,0.23837603600000001,0.238698785,0.23889159500000001,0.23890565400000002,0.23969945100000001,0.24008605300000002,0.24021422949999999,0.24041140599999999,0.2415428825,0.24169490399999999,0.24266885999999999],"9728":[1.1526428571428572e-05,1.1559750000000001e-05,1.1567500000000001e-05,1.1586999999999999e-05,1.1764880434782608e-05,1.1875320000000001e-05,1.188029e-05,1.1893940000000001e-05,1.19475e-05,1.197849e-05,1.205451e-05,1.2101e-05,1.21055e-05,1.216224e-05,1.218e-05,1.2576e-05,1.2579150000000001e-05,1.2653740000000002e-05,1.367829e-05,1.4412109999999999e-05],"1769472":[0.017249720500000003,0.017524049999999999,0.017575735499999988,0.017576504,0.017639481500000009,0.017650203499999999,0.017706398500000005,0.017738,0.017758843000000017,0.0178121205,0.017825292999999996,0.017846506500000001,0.017868806499999994,0.0179905445,0.018002579999999997,0.018128078499999999,0.018145822999999998,0.018203403999999999,0.018279581,0.018685215999999998],"1703936":[0.016248440999999999,0.016282927499999999,0.016314203999999995,0.016331485500000003,0.016681538000000006,0.01673752600000001,0.016742006,0.016785030999999999,0.016831703999999992,0.016859220000000001,0.016986246999999999,0.017030160999999999,0.017113928,0.017141857999999999,0.0173057,0.017571757,0.017769590999999994,0.017838780000000005,0.018139620000000002,0.0183436885],"2048":[2.31683e-06,2.3188500000000003e-06,2.3202799999999999e-06,2.3204000000000003e-06,2.3209800000000002e-06,2.32119e-06,2.32217e-06,2.3229199999999999e-06,2.32312e-06,2.32596e-06,2.3260100000000001e-06,2.3266400000000001e-06,2.32728e-06,2.32737e-06,2.3289099999999997e-06,2.32892e-06,2.334e-06,2.4294200000000001e-06,2.75017e-06,2.9193900000000001e-06],"14336":[1.7130135135135135e-05,1.7132499999999999e-05,1.7136999999999999e-05,1.7150500000000001e-05,1.717e-05,1.7575609999999999e-05,1.762658e-05,1.774678e-05,1.776229e-05,1.781828e-05,1.7828969999999999e-05,1.783595e-05,1.7857280000000001e-05,1.785891e-05,1.802653e-05,1.8420529999999546e-05,1.8836020000000002e-05,1.898168e-05,1.9976890243902437e-05,2.0009979999999998e-05],"448":[5.0630999999999999e-07,5.0918000000000001e-07,5.0930000000000004e-07,5.0933999999999998e-07,5.0939999999999994e-07,5.0969999999999996e-07,5.0971999999999999e-07,5.0992999999999996e-07,5.1008602150537639e-07,5.1017000000000002e-07,5.1033999999999995e-07,5.1050999999999998e-07,5.1057000000000005e-07,5.1078000000000002e-07,5.1111000000000003e-07,5.1279999999999999e-07,5.2987999999999998e-07,5.3290999999999997e-07,5.3361000000000002e-07,5.3450999999999999e-07],"5505024":[0.069570049999999967,0.069990164999999965,0.070110028500000046,0.070225293999999966,0.070277688500000032,0.070282068499999961,0.070341890000000004,0.070620953,0.070666855000000001,0.070669259999999998,0.070685562499999979,0.070703693499999956,0.070757476500000013,0.070827927000000013,0.070847789999999938,0.070866733500000001,0.071177725000000025,0.071397853000000025,0.071431351999999948,0.072009941999999966],"544":[6.1625999999999999e-07,6.1631999999999995e-07,6.1631999999999995e-07,6.1633999999999997e-07,6.1633999999999997e-07,6.1635999999999999e-07,6.1637999999999991e-07,6.1640000000000004e-07,6.1649000000000009e-07,6.1727999999999998e-07,6.172999999999999e-07,6.1734000000000005e-07,6.1745999999999997e-07,6.1772000000000005e-07,6.1983999999999992e-07,6.4524999999999998e-07,6.4528000000000007e-07,6.455e-07,6.4613000000000003e-07,6.7681000000000009e-07],"221184":[0.00064663025000000001,0.00064924188888888887,0.00064928959999999993,0.00065462266666666664,0.00065824499999999979,0.00065866700000000026,0.00065910074999999985,0.000661963,0.00066491174999999973,0.00066683244444444459,0.00066915622222222225,0.00067352824999999971,0.00067400088888888905,0.00067888633333333345,0.0006792526000000004,0.00068605024999999998,0.00069051777777777781,0.00069576322222222246,0.00069881049999999997,0.0007068414000000004],"90112":[0.00013780000000000004,0.00014808400000000001,0.00014840799999999999,0.00015440199999999994,0.00015448717073170731,0.00015505899999999993,0.00015983349999999999,0.00016069465217391304,0.00016547216666666666,0.00016559168181818181,0.00016578308823529404,0.00016683273913043479,0.00016706499999999993,0.00016868124000000005,0.000171242,0.00017393719047619052,0.00017696068421052628,0.00017804600000000001,0.00018444941935483866,0.00018862922222222229],"640":[7.2307999999999999e-07,7.2310000000000001e-07,7.2311000000000007e-07,7.2317000000000004e-07,7.2335000000000003e-07,7.2358999999999998e-07,7.239700000000001e-07,7.2422000000000001e-07,7.2426000000000005e-07,7.2434999999999989e-07,7.2485999999999999e-07,7.2504999999999994e-07,7.2653999999999999e-07,7.2702999999999997e-07,7.2729000000000005e-07,7.5765000000000006e-07,7.5830000000000001e-07,7.5839000000000006e-07,7.5839000000000006e-07,7.5846999999999994e-07],"12800":[1.52223e-05,1.5236500000000001e-05,1.5248785714285713e-05,1.5257e-05,1.5299e-05,1.575411e-05,1.5787999999999999e-05,1.5826000000000001e-05,1.5855519999999999e-05,1.5883110000000001e-05,1.5908000000000001e-05,1.5908849999999999e-05,1.5947483870967743e-05,1.6004000000000001e-05,1.6004140000000001e-05,1.6177359999999999e-05,1.621641e-05,1.6360414141414141e-05,1.7825269999999998e-05,1.7876479999999999e-05],"262144":[0.00077884637499999994,0.00077955199999999987,0.00080368066666666705,0.00081124966666666664,0.0008122892500000003,0.00081667550000000017,0.00081749866666666648,0.00081789475000000026,0.00081818675000000008,0.00081874199999999991,0.00082023325000000027,0.00082173475,0.00082396925,0.00082419600000000035,0.0008251275,0.00082627066666666712,0.00082721757142857155,0.00083986437500000008,0.00085019871428571449,0.00087996800000000007],"589824":[0.0019741379999999998,0.0019864589999999999,0.0020261789999999999,0.0020462989999999997,0.00205872,0.0020884139999999994,0.0020900389999999997,0.0020906239999999993,0.0020973229999999999,0.0021077029999999998,0.0021245269999999998,0.0021284989999999998,0.0021906260000000002,0.0022120910000000002,0.0022319650000000011,0.0022596780000000002,0.0022886989999999999,0.002370217,0.0024317590000000008,0.0026150290000000009],"884736":[0.0037365840000000003,0.0038639120000000015,0.0039292879999999987,0.0039370050000000004,0.0039431529999999996,0.003980702,0.0039822979999999996,0.0039959890000000001,0.0040031059999999976,0.0040099760000000002,0.0040422259999999986,0.0040468909999999986,0.0040797450000000001,0.0041172859999999986,0.004158363,0.0041731809999999998,0.0042468839999999985,0.004293443000000001,0.0043655259999999998,0.0047312359999999998],"6144":[7.233e-06,7.2362600000000002e-06,7.2517499999999996e-06,7.2636300000000006e-06,7.2706666666666671e-06,7.27223e-06,7.2830000000000004e-06,7.2899999999999997e-06,7.30540625e-06,7.3395000000000006e-06,7.3404199999999998e-06,7.3687399999999997e-06,7.39353e-06,7.4441999999999998e-06,7.4724100000000005e-06,7.5138099999999998e-06,7.5771800000000004e-06,7.5814599999999999e-06,7.5896199999999999e-06,7.9366699999999993e-06],"1088":[1.22666e-06,1.2267100000000001e-06,1.2268799999999999e-06,1.2271100000000001e-06,1.22738e-06,1.2276900000000001e-06,1.22774e-06,1.2281299999999999e-06,1.2288500000000001e-06,1.2288899999999999e-06,1.2290900000000002e-06,1.2294500000000001e-06,1.2295200000000002e-06,1.2327300000000001e-06,1.2337299999999999e-06,1.23401e-06,1.2402999999999998e-06,1.24195e-06,1.2820299999999999e-06,1.3496600000000001e-06],"576":[6.5197000000000009e-07,6.5197999999999994e-07,6.5199e-07,6.5199e-07,6.5255e-07,6.5296999999999995e-07,6.5311999999999996e-07,6.5325000000000006e-07,6.5329e-07,6.5334e-07,6.5379000000000003e-07,6.5381000000000006e-07,6.5565999999999998e-07,6.5592000000000007e-07,6.5675e-07,6.8226999999999993e-07,6.8357999999999998e-07,6.8395000000000003e-07,6.8938999999999995e-07,7.1546999999999999e-07],"160":[1.8532000000000002e-07,1.8551e-07,1.8551e-07,1.8555000000000002e-07,1.8556e-07,1.8559999999999999e-07,1.8711000000000001e-07,1.8715e-07,1.8753000000000001e-07,1.9397000000000001e-07,1.9414000000000002e-07,1.9420000000000001e-07,1.9420999999999999e-07,1.9579999999999999e-07,1.9592000000000002e-07,1.9598000000000001e-07,1.9639e-07,1.9656000000000001e-07,2.0012000000000002e-07,2.2310000000000001e-07],"672":[7.5878999999999998e-07,7.5896999999999997e-07,7.5998000000000001e-07,7.6032999999999993e-07,7.6039999999999995e-07,7.6168999999999999e-07,7.6183000000000004e-07,7.6207999999999995e-07,7.6252000000000003e-07,7.6331999999999998e-07,7.6339000000000001e-07,7.6347999999999995e-07,7.639e-07,7.6397999999999999e-07,7.6403999999999995e-07,7.6441999999999996e-07,7.6470999999999992e-07,7.6774999999999998e-07,7.9416000000000001e-07,7.9678999999999998e-07],"8912896":[0.1164914895,0.11674280200000001,0.11723594,0.11728780599999999,0.117396948,0.11763323000000001,0.117762505,0.118112973,0.118141015,0.11819674249999999,0.118201029,0.1182701095,0.11837999300000002,0.11842627249999998,0.11849685799999998,0.11874982100000001,0.11888172800000001,0.118918145,0.118979717,0.11939380250000001],"100":[1.1853e-07,1.1854e-07,1.1854e-07,1.1854e-07,1.1855000000000001e-07,1.1857e-07,1.1857e-07,1.1858999999999999e-07,1.1858999999999999e-07,1.1864000000000001e-07,1.1865000000000001e-07,1.1871000000000001e-07,1.1872999999999999e-07,1.1874e-07,1.1875e-07,1.1876e-07,1.1876e-07,1.1994999999999999e-07,1.2034e-07,1.2072000000000001e-07],"507904":[0.001596973,0.001613256,0.001657543,0.0016776500000000006,0.0016847030000000005,0.001699725,0.0017216150000000006,0.0017228389999999999,0.0017317860000000001,0.001749168000000001,0.001756519,0.001782313,0.001787177,0.001788434666666667,0.0018113059999999999,0.001821859333333333,0.001823889,0.0019410779999999999,0.001960804,0.0020246979999999993],"3840":[4.4540674157303375e-06,4.4572999999999997e-06,4.4614399999999996e-06,4.4644599999999999e-06,4.46549e-06,4.4680600000000002e-06,4.4680799999999999e-06,4.4688100000000002e-06,4.4770300000000001e-06,4.4797399999999999e-06,4.5874999999999997e-06,4.6076700000000004e-06,4.6726299999999995e-06,4.6808299999999997e-06,4.6834900000000003e-06,4.7915799999999994e-06,4.9127499999999997e-06,4.9141851851851854e-06,5.0309899999999999e-06,5.2952100000000004e-06],"192":[2.2099999999999998e-07,2.2118e-07,2.2121999999999999e-07,2.2123e-07,2.2123e-07,2.2123e-07,2.2124000000000001e-07,2.2263e-07,2.2263999999999999e-07,2.2272999999999998e-07,2.2277999999999999e-07,2.2282999999999999e-07,2.2296000000000001e-07,2.2305999999999999e-07,2.2335e-07,2.2384000000000002e-07,2.2432000000000001e-07,2.3264999999999998e-07,2.3432e-07,2.4471999999999998e-07],"376832":[0.0011603625,0.0011719440000000001,0.001172846,0.0011730426,0.0011782369999999997,0.001200939,0.001203518,0.0012064180000000003,0.0012132518000000001,0.0012136180000000001,0.0012149579999999999,0.0012249995,0.0012270530000000001,0.001227208,0.0012284876666666666,0.0012318933333333333,0.00123659925,0.0012432085000000004,0.0012485405,0.0012658772],"98304":[0.00019064,0.00019499200000000001,0.00019541300000000002,0.00019888100000000001,0.00020332221428571431,0.00020363600000000001,0.000203659,0.00020415260000000002,0.00020581182352941179,0.000206193,0.00020654955555555552,0.00020731818749999994,0.00020847405882352946,0.00020916256249999999,0.00021347449999999985,0.00021534939999999996,0.0002177325,0.00021985111764705884,0.00022330381818181817,0.00023553930769230766],"5376":[6.2941785714285708e-06,6.31245e-06,6.3190800000000005e-06,6.3247499999999999e-06,6.334727272727273e-06,6.372211538461538e-06,6.46798e-06,6.4860600000000002e-06,6.4930999999999997e-06,6.5300700000000008e-06,6.5348100000000004e-06,6.5755100000000007e-06,6.5875500000000001e-06,6.60755e-06,6.6138999999999995e-06,6.6584666666666673e-06,6.6812700000000003e-06,6.6819299999999999e-06,6.815e-06,6.8706599999999999e-06],"94208":[0.00015943256521739132,0.00017131030303030304,0.00017422557142857142,0.00017576895454545454,0.0001760815,0.0001771800625,0.00017826799999999995,0.00017865900000000004,0.00017926732258064516,0.00018031844117647058,0.00018141311111111118,0.00018299599999999999,0.00018429066666666671,0.00018584782352941176,0.00018988146875,0.0001923001176470588,0.00019913665625000002,0.00020065799999999999,0.0002054679375,0.00021379564285714292],"81920":[0.00012451382352941177,0.0001248955625,0.000128701,0.00013205500000000001,0.00013299682758620689,0.00013358674468085102,0.00013373507407407411,0.0001358610714285714,0.00013687350000000001,0.00013940926666666667,0.00013949500000000001,0.00014022873333333332,0.00014307948837209299,0.00014347829166666667,0.00014561500000000001,0.00014820768000000005,0.00014874200000000007,0.00015116408,0.00015538419047619049,0.00016288334210526318],"3407872":[0.041445104500000003,0.041522716000000001,0.041563406999999997,0.041639448999999988,0.041759778999999997,0.041764508500000005,0.041792432000000004,0.041862864000000041,0.041880277,0.041936519500000012,0.041958047999999991,0.041964742499999978,0.041968649000000004,0.042031308999999996,0.042041976999999994,0.042052107999999991,0.0421582665,0.042253279500000004,0.042422291500000021,0.042475583999999997],"104":[1.2298000000000001e-07,1.2298999999999999e-07,1.23e-07,1.2304e-07,1.2319000000000001e-07,1.2320000000000002e-07,1.2320000000000002e-07,1.2321e-07,1.2321e-07,1.2321999999999999e-07,1.2459999999999999e-07,1.2466999999999999e-07,1.247e-07,1.2476000000000001e-07,1.2538999999999999e-07,1.2562999999999999e-07,1.2618999999999999e-07,1.2627000000000001e-07,1.2662e-07,1.7895e-07],"122880":[0.00029218100000000014,0.00029349400000000015,0.00029957599999999991,0.00030843799999999985,0.00030975799999999998,0.00031118999999999998,0.00031186527272727261,0.00031277427272727261,0.00031383142857142855,0.00031636399999999986,0.00031686147368421039,0.00031808599999999998,0.00031901100000000001,0.00032181964999999999,0.00032383415789473695,0.00032510957894736826,0.00032528990000000007,0.00032782800000000001,0.000332433947368421,0.00033273309090909101],"200":[2.3012e-07,2.3014999999999998e-07,2.3178999999999999e-07,2.3183000000000001e-07,2.3187e-07,2.3187e-07,2.3187e-07,2.3210999999999998e-07,2.3229e-07,2.3232000000000001e-07,2.3237999999999999e-07,2.3278e-07,2.3315999999999998e-07,2.3337e-07,2.3611000000000001e-07,2.4081e-07,2.4112999999999999e-07,2.4275999999999998e-07,2.4321000000000002e-07,2.5441000000000001e-07],"163840":[0.00045103999999999994,0.00046189057142857152,0.00046272833333333335,0.00046632523076923078,0.00046746485714285713,0.00046785376923076888,0.00046858935714285722,0.00046923199999999998,0.00047233776923076912,0.000473981,0.0004770660769230768,0.00047732023076923054,0.00048091050000000009,0.00048102833333333336,0.00048201215384615379,0.00048397484615384618,0.00048414699999999988,0.00048765400000000002,0.00049250861538461545,0.00050687871428571423],"4063232":[0.050291984500000012,0.050378009999999973,0.050439824499999973,0.0504985695,0.050502414000000009,0.050640929000000001,0.050879148999999999,0.050908856500000009,0.050960774,0.050961190000000003,0.050991003,0.051027783,0.051156955500000004,0.051225863000000003,0.051257862499999994,0.051676671,0.051690631000000001,0.052040432999999997,0.052087963000000001,0.05269816799999999],"5767168":[0.07318411900000002,0.073262323000000004,0.073578567499999997,0.073693622,0.07384793349999999,0.07391031549999999,0.073914727,0.073958037000000032,0.074048457000000026,0.074124557000000008,0.074163604000000008,0.074399300000000015,0.074422144999999967,0.074458226999999988,0.074465809500000008,0.074563265000000004,0.074783940999999993,0.074851723000000023,0.074976119000000008,0.075051818500000006],"12582912":[0.17047662550000001,0.17047816499999999,0.17059806,0.1710216,0.17146062749999999,0.17172650699999997,0.17182423299999999,0.17201212599999999,0.17204374099999997,0.17213832800000001,0.17228362699999999,0.17229085249999998,0.17231328200000001,0.17262182249999999,0.17299366099999999,0.173117882,0.1731814015,0.17411600499999999,0.17421133899999999,0.17438998000000006],"1600":[1.8156400000000001e-06,1.82344e-06,1.8241e-06,1.8258900000000001e-06,1.8279000000000001e-06,1.8289800000000001e-06,1.8337299999999999e-06,1.83527e-06,1.8360399999999999e-06,1.8362099999999999e-06,1.8366600000000001e-06,1.8372700000000002e-06,1.8388300000000001e-06,1.83981e-06,1.8402941176470588e-06,1.8442400000000001e-06,1.84633e-06,1.8481300000000001e-06,1.9144700000000001e-06,2.0071499999999999e-06],"136":[1.5866999999999998e-07,1.5868000000000002e-07,1.5885000000000002e-07,1.5977000000000001e-07,1.6042999999999999e-07,1.6044e-07,1.6047000000000001e-07,1.6047999999999999e-07,1.6053999999999998e-07,1.6056e-07,1.6061999999999999e-07,1.6066000000000001e-07,1.6092000000000001e-07,1.6096999999999999e-07,1.6098e-07,1.6098e-07,1.6171000000000001e-07,1.6262999999999999e-07,1.6324000000000002e-07,1.6438000000000002e-07],"232":[2.6666999999999999e-07,2.6688000000000002e-07,2.6754000000000003e-07,2.6757000000000001e-07,2.6761e-07,2.6763999999999998e-07,2.6778999999999999e-07,2.6792999999999999e-07,2.6814000000000002e-07,2.6838999999999998e-07,2.6855000000000001e-07,2.6873e-07,2.6880000000000002e-07,2.6883999999999996e-07,2.6893000000000001e-07,2.6901e-07,2.7153e-07,2.8012e-07,2.8027000000000001e-07,2.8118999999999999e-07],"7077888":[0.091065641000000003,0.091313592999999998,0.091352394499999962,0.091687411999999982,0.091861683,0.0918771845,0.091940080000000007,0.09215546549999995,0.092212861500000035,0.092258756999999997,0.092384987000000002,0.092451602500000049,0.092741617000000026,0.09277732050000001,0.093054164499999995,0.093090649999999969,0.093121306000000043,0.093398469000000012,0.09393860250000001,0.094356363000000026],"86016":[0.00013742929268292686,0.00013912399999999999,0.00014238595833333329,0.00014726584615384615,0.000147751,0.00014804900000000001,0.00015082299999999993,0.00015256237037037043,0.00015412100000000001,0.00015434557499999999,0.00015483561904761908,0.00015557713157894734,0.00015668075000000001,0.00016189202439024394,0.00016202979999999995,0.00016475699999999999,0.0001727198333333333,0.00017980405405405403,0.00018019500000000002,0.0001816383529411765],"31744":[4.1446999999999998e-05,4.1977791666666665e-05,4.2307304347826089e-05,4.2323239999999998e-05,4.2458610000000001e-05,4.2501780000000006e-05,4.2689230769230769e-05,4.312387e-05,4.3169615384615383e-05,4.3462833333333333e-05,4.3881339999999999e-05,4.3934930000000001e-05,4.4413454545454542e-05,4.4515700000000005e-05,4.4662052631578946e-05,4.5133368421052627e-05,4.5315520000000005e-05,4.5445709999999998e-05,4.5818600000000002e-05,4.5860538461538458e-05],"168":[1.9429e-07,1.9446999999999999e-07,1.9448000000000001e-07,1.9448000000000001e-07,1.9448000000000001e-07,1.9451000000000001e-07,1.9575000000000002e-07,1.9604999999999999e-07,1.9613999999999998e-07,1.9626000000000001e-07,1.9627e-07,1.9630999999999999e-07,1.9644999999999999e-07,1.9649999999999999e-07,2.0063000000000002e-07,2.0349e-07,2.0352000000000001e-07,2.0529000000000001e-07,2.0653000000000001e-07,2.1526999999999999e-07],"622592":[0.0021614799999999999,0.0022025730000000002,0.002210662,0.0022670529999999998,0.002272161,0.0022774345000000007,0.0022937360000000002,0.0023114785000000002,0.0023181579999999999,0.0023187379999999999,0.0023188270000000012,0.00234709,0.0023527750000000005,0.002356927,0.0023880910000000002,0.002437448,0.0024886790000000002,0.0025196180000000012,0.0025556590000000001,0.0026028314999999988],"108":[1.2744000000000001e-07,1.2751000000000001e-07,1.276e-07,1.2764e-07,1.2765000000000001e-07,1.2765000000000001e-07,1.2765000000000001e-07,1.2765000000000001e-07,1.2765999999999999e-07,1.2768000000000002e-07,1.2835999999999999e-07,1.2888999999999998e-07,1.2897e-07,1.2904e-07,1.2933999999999999e-07,1.2982000000000001e-07,1.2992000000000001e-07,1.3054e-07,1.744e-07,1.8699999999999999e-07],"327680":[0.00098384666666666656,0.00098907399999999994,0.00098950399999999977,0.00099336349999999988,0.00099857466666666665,0.0010281246666666666,0.0010337082,0.0010341895,0.0010426236666666669,0.0010444138333333334,0.001045837,0.0010459403999999999,0.0010473133333333336,0.001050748,0.0010579955000000001,0.0010620963333333334,0.001065283,0.0010660680000000001,0.0010736291999999998,0.0010765622000000004],"2176":[2.4632799999999996e-06,2.46515e-06,2.4652799999999998e-06,2.46791e-06,2.46897e-06,2.4693600000000002e-06,2.4698999999999998e-06,2.4707499999999996e-06,2.4709200000000001e-06,2.4731299999999996e-06,2.4742600000000003e-06,2.4744099999999998e-06,2.4746911764705882e-06,2.4767399999999998e-06,2.4781199999999997e-06,2.4800799999999996e-06,2.5771300000000003e-06,2.5846499999999999e-06,2.5852400000000001e-06,2.5968900000000002e-06],"3328":[3.8395700000000001e-06,3.8399400000000005e-06,3.8417799999999997e-06,3.8445600000000002e-06,3.8454100000000003e-06,3.8467599999999999e-06,3.8485399999999999e-06,3.8489300000000001e-06,3.8494699999999998e-06,3.8511500000000004e-06,3.8524300000000001e-06,3.8542399999999997e-06,4.0154599999997489e-06,4.0237799999999998e-06,4.0299399999999996e-06,4.0356599999999999e-06,4.0366666666666664e-06,4.1879500000000003e-06,4.5470099999999997e-06,4.55055e-06],"1":[3.7e-09,3.7e-09,3.7099999999999998e-09,3.7099999999999998e-09,3.7099999999999998e-09,3.7099999999999998e-09,3.72e-09,3.7300000000000001e-09,3.7800000000000006e-09,3.7899999999999995e-09,3.7899999999999995e-09,3.7899999999999995e-09,3.7899999999999995e-09,3.8599999999999995e-09,3.94e-09,3.9600000000000004e-09,3.9700000000000001e-09,4.0600000000000005e-09,4.3599999999999998e-09,4.6800000000000004e-09],"2":[4.8e-09,4.8e-09,4.8e-09,4.8e-09,4.8e-09,4.8e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,4.8100000000000006e-09,5.0300000000000002e-09,5.0300000000000002e-09,5.0300000000000002e-09,5.04e-09,5.28e-09],"3":[5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9400000000000006e-09,5.9500000000000003e-09,5.9500000000000003e-09,5.9500000000000003e-09,6.0600000000000002e-09,6.5199999999999998e-09,6.5199999999999998e-09],"4":[7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.9299999999999989e-09,8.2600000000000008e-09,8.2600000000000008e-09,9.6400000000000006e-09],"7424":[8.7776666666666673e-06,8.8440000000000004e-06,8.9118500000000001e-06,8.9181470588235299e-06,8.9309999999999997e-06,8.9323200000000006e-06,8.9488300000000002e-06,8.9610100000000001e-06,8.96343e-06,8.9691199999999999e-06,9.0130899999999995e-06,9.0138100000000007e-06,9.0793700000002535e-06,9.1248100000000001e-06,9.1286700000000008e-06,9.17789e-06,9.5531699999999999e-06,9.5848099999999991e-06,9.6333846153846162e-06,1.001563e-05],"5":[9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0200000000000007e-09,9.0300000000000005e-09,9.0300000000000005e-09,9.0300000000000005e-09,9.0300000000000005e-09,9.0300000000000005e-09,9.4300000000000007e-09,9.4300000000000007e-09,9.4400000000000005e-09,9.4500000000000002e-09,9.8500000000000005e-09,9.900000000000001e-09],"23552":[2.8391999999999999e-05,2.8415499999999999e-05,2.8566999999999999e-05,2.8755000000000002e-05,2.8949e-05,2.9252e-05,2.9451999999999999e-05,2.9560130000000001e-05,2.9628000000000002e-05,2.967927272727273e-05,2.9727000000000002e-05,2.9784499999999999e-05,2.9845219999999998e-05,2.9849434782608694e-05,3.0000890000000002e-05,3.0014849999999999e-05,3.0264149999999997e-05,3.02718e-05,3.0479729999999998e-05,3.1547790000000002e-05],"6":[9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9200000000000005e-09,9.9300000000000002e-09,9.9300000000000002e-09,9.9300000000000002e-09,1.0380000000000001e-08,1.0380000000000001e-08,1.0380000000000001e-08,1.089e-08],"61440":[8.5216000000000005e-05,8.5243999999999999e-05,8.7349999999999995e-05,8.8888999999999995e-05,8.9010000000000003e-05,8.9216999999999996e-05,8.9323107692307693e-05,8.9586754098360652e-05,8.9870753424657534e-05,9.0004567164179107e-05,9.0382561643835623e-05,9.1397999999999995e-05,9.1669000000000006e-05,9.2619073529411769e-05,9.2873105263157894e-05,9.3154246376811594e-05,9.3317479452054787e-05,9.348607407407407e-05,9.4517142857142853e-05,9.4569714285714285e-05],"491520":[0.0015699984999999999,0.0016053419999999996,0.00162115,0.0016326075000000005,0.0016351429999999999,0.0016398770000000001,0.001642375,0.001643994,0.001644885,0.0016517135000000001,0.0016518120000000003,0.0016615696666666669,0.001672034,0.001683784,0.0016904343333333331,0.0017077443333333331,0.0017362479999999993,0.0017771570000000001,0.0020303019999999999,0.0020907670000000008],"77824":[0.00011698850000000001,0.00011846133333333335,0.000123053,0.00012323469387755104,0.00012451399999999999,0.00012610703846153846,0.00012683766666666667,0.00012707431914893614,0.00012765672,0.0001284185769230769,0.00012907112500000001,0.00012954699999999996,0.00013127545833333334,0.00013171726923076932,0.00013287947619047618,0.00013420308163265303,0.00013436302439024398,0.00013436825925925927,0.00013604343902439025,0.00013873189999999999],"7":[1.124e-08,1.124e-08,1.124e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.125e-08,1.1760000000000001e-08,1.1769999999999999e-08,1.1769999999999999e-08,1.1769999999999999e-08,1.1769999999999999e-08,1.1769999999999999e-08,1.2909999999999999e-08,1.3140000000000001e-08],"8":[1.214e-08,1.214e-08,1.214e-08,1.214e-08,1.214e-08,1.215e-08,1.215e-08,1.215e-08,1.215e-08,1.215e-08,1.215e-08,1.215e-08,1.219e-08,1.2709999999999999e-08,1.2709999999999999e-08,1.2709999999999999e-08,1.2709999999999999e-08,1.2720000000000001e-08,1.288e-08,1.3329999999999999e-08],"208":[2.3904e-07,2.3906000000000002e-07,2.3910000000000002e-07,2.3939999999999999e-07,2.4028999999999999e-07,2.4046999999999998e-07,2.4083000000000002e-07,2.4121999999999999e-07,2.4189e-07,2.4213000000000001e-07,2.4241999999999997e-07,2.4275000000000003e-07,2.4335999999999998e-07,2.4573000000000002e-07,2.5213999999999998e-07,2.5236999999999998e-07,2.5250999999999998e-07,2.5361999999999996e-07,2.5433999999999999e-07,2.5538e-07],"9":[1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3469999999999999e-08,1.3480000000000001e-08,1.3480000000000001e-08,1.3480000000000001e-08,1.3480000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4109999999999999e-08,1.4780000000000001e-08,1.4780000000000001e-08],"73728":[0.000107265,0.000110569,0.000112009,0.00011451592307692312,0.00011460903846153845,0.00011540770370370356,0.00011544548275862067,0.00011560746875,0.0001158636,0.0001164926734693877,0.00011728303508771933,0.0001176027735849057,0.00011828847222222225,0.0001191352037037037,0.00011946524528301885,0.00012203907692307682,0.00012394870909090909,0.00012489958,0.00013332146808510634,0.00013647883673469384],"304":[3.4585000000000004e-07,3.4587000000000001e-07,3.4609e-07,3.4766999999999999e-07,3.4771999999999999e-07,3.4783000000000001e-07,3.4788000000000002e-07,3.4792999999999997e-07,3.4803999999999999e-07,3.4808000000000003e-07,3.4817000000000003e-07,3.4825000000000001e-07,3.4829999999999996e-07,3.4861e-07,3.4876999999999997e-07,3.4907000000000004e-07,3.5046000000000003e-07,3.798e-07,3.8177999999999997e-07,3.8197000000000002e-07],"400":[4.5500999999999994e-07,4.5577000000000001e-07,4.5579999999999999e-07,4.5586000000000001e-07,4.559e-07,4.5618999999999996e-07,4.5638000000000001e-07,4.5673999999999995e-07,4.5686999999999999e-07,4.5693e-07,4.5711000000000005e-07,4.5712000000000001e-07,4.5788999999999998e-07,4.5789999999999999e-07,4.5837999999999995e-07,4.5862000000000001e-07,4.5973999999999996e-07,4.7412000000000001e-07,4.7792000000000003e-07,4.8177999999999996e-07],"1310720":[0.0093812214999999949,0.0094409669999999998,0.0094701530000000003,0.0095093719999999968,0.009661636500000001,0.0097327000000000004,0.009770764999999999,0.0097932749999999989,0.0097993920000000005,0.0099151304999999992,0.0099663059999999994,0.0100959365,0.010118511,0.010151768,0.010226580000000001,0.010440801500000001,0.010606249000000009,0.011162195,0.0111741705,0.011682558000000003],"336":[3.8164999999999998e-07,3.8337999999999998e-07,3.8338999999999999e-07,3.8346000000000002e-07,3.8355000000000002e-07,3.8365000000000002e-07,3.8371000000000004e-07,3.8389000000000003e-07,3.8416000000000002e-07,3.8442999999999996e-07,3.8476999999999997e-07,3.8538999999999999e-07,3.8563000000000005e-07,3.8617000000000002e-07,3.862e-07,3.8661999999999995e-07,4.0154999999999999e-07,4.0204999999999998e-07,4.0269999999999997e-07,4.2101000000000004e-07],"3670016":[0.044890237,0.044923042499999996,0.04500941600000001,0.045029662999999998,0.045140209000000001,0.045173987999999998,0.045336001500000001,0.045402214000000003,0.045449642999999998,0.045460753,0.045462733999999991,0.045518963000000003,0.045586895999999995,0.0455870435,0.045674017999999997,0.045745832,0.046163739500000009,0.046273217999999998,0.046538657999999997,0.046778433999999987],"6656":[7.8521500000000007e-06,7.8562799999999999e-06,7.8588947368421064e-06,7.8660000000000006e-06,7.8707500000000008e-06,7.8760000000000005e-06,7.8924999999999994e-06,7.9684199999999995e-06,7.9842799999999994e-06,8.0203399999999995e-06,8.0210399999999994e-06,8.0798899999999996e-06,8.1057799999999998e-06,8.1085300000000008e-06,8.1303500000000009e-06,8.2207457627118648e-06,8.3161199999999996e-06,8.3918100000000006e-06,8.6276250000000003e-06,9.3284599999999995e-06],"15360":[1.832725e-05,1.8364222222222224e-05,1.8425999999999999e-05,1.8434600000000001e-05,1.9068169999999999e-05,1.9105879999999998e-05,1.9122309999999999e-05,1.9126479999999999e-05,1.9157999999999999e-05,1.91864e-05,1.9212630000000002e-05,1.9305270000000001e-05,1.935616e-05,1.9714670000000001e-05,1.996079e-05,1.9971530120481928e-05,2.0001250000000001e-05,2.037601e-05,2.1697779999999999e-05,2.1718639999999998e-05],"432":[4.8850000000000007e-07,4.8946999999999995e-07,4.9030999999999995e-07,4.904e-07,4.9132999999999994e-07,4.9139999999999997e-07,4.9187000000000002e-07,4.9196999999999992e-07,4.9208e-07,4.9210000000000002e-07,4.9217000000000005e-07,4.9252999999999992e-07,4.9255000000000005e-07,4.9283000000000005e-07,4.9355000000000002e-07,4.9411000000000002e-07,4.9444000000000003e-07,5.1496e-07,5.4042999999999992e-07,5.4153000000000001e-07],"950272":[0.0044573110000000003,0.0045676659999999997,0.004573691999999999,0.0045914620000000001,0.0046099440000000004,0.004627038,0.0046365390000000003,0.0046454640000000002,0.0046476379999999999,0.0046700379999999996,0.0046863269999999997,0.0047324900000000015,0.004773266,0.0047808140000000004,0.0048251659999999997,0.0048347680000000014,0.0048872209999999989,0.0050950370000000002,0.0051724180000000007,0.0057301990000000001],"655360":[0.002273897,0.0023933080000000002,0.0024187010000000001,0.0024213069999999984,0.0024651429999999999,0.0024754959999999998,0.0024776720000000002,0.0024800289999999999,0.002484928,0.0024874659999999998,0.0025042719999999997,0.0025067209999999995,0.0025181439999999999,0.0025296439999999993,0.0025422000000000001,0.002565417,0.0026080599999999993,0.0027815449999999999,0.0027847035000000001,0.0031014064999999999],"69632":[0.00010317885714285712,0.00010448259999999999,0.00010540299999999997,0.00010601696774193547,0.00010794978688524592,0.00010800783333333333,0.00010846453846153844,0.00010921063157894736,0.000109481,0.00010987800000000002,0.00011137856603773584,0.000111576,0.000112304275862069,0.00011290307547169806,0.00011391537735849055,0.00011563698245614037,0.00011691908333333338,0.00011871262962962963,0.00012309804444444444,0.00012590832075471694],"11264":[1.3391666666666667e-05,1.3392e-05,1.3395e-05,1.3397000000000001e-05,1.3792760416666666e-05,1.385068e-05,1.385957e-05,1.3916480000000002e-05,1.392723e-05,1.3929260000000001e-05,1.3955750000000001e-05,1.397799e-05,1.4011e-05,1.4025999999999999e-05,1.4026509999999999e-05,1.4029333333333333e-05,1.4054e-05,1.405776e-05,1.4223689189189189e-05,1.5507950000000001e-05],"2752512":[0.032464990999999999,0.032476496000000007,0.032632329000000002,0.032722464999999999,0.032763750000000001,0.03278264899999999,0.03293480850000001,0.032949286000000001,0.032956058500000003,0.03296919999999999,0.033008060499999999,0.033130952999999991,0.033131266000000013,0.033191871000000005,0.033198888999999995,0.033230315000000003,0.033271966,0.033372012499999999,0.033502357500000003,0.033703602000000013],"8126464":[0.10541500700000001,0.10552911700000001,0.10586079850000002,0.10621045649999999,0.10626766,0.1063513505,0.10676258,0.1071778405,0.10721952949999999,0.10738665149999999,0.10742750500000001,0.10744999299999999,0.10765545100000001,0.1077950845,0.107816177,0.107865136,0.10792452449999999,0.1080985985,0.1080987715,0.10826057],"27648":[3.5169999999999997e-05,3.532532e-05,3.5473060000000002e-05,3.6093010000000002e-05,3.6141060000000003e-05,3.6166910000000002e-05,3.6383e-05,3.6450643835616438e-05,3.6475240000000002e-05,3.6621140000000004e-05,3.6677200000000002e-05,3.6718100000000003e-05,3.6723820000000004e-05,3.6848160000000001e-05,3.6931599999999997e-05,3.7120999999999999e-05,3.7249980000000003e-05,3.7270799999999996e-05,3.8009129999999997e-05,3.8158019999999998e-05],"368":[4.1851000000000001e-07,4.1882000000000004e-07,4.1882000000000004e-07,4.1904999999999998e-07,4.192e-07,4.1940000000000001e-07,4.1956000000000003e-07,4.1959000000000001e-07,4.1959999999999997e-07,4.1986e-07,4.2014999999999996e-07,4.2014999999999996e-07,4.2021999999999999e-07,4.2024999999999997e-07,4.2027000000000004e-07,4.2114999999999998e-07,4.2141000000000001e-07,4.2152999999999999e-07,4.2294e-07,4.3986000000000002e-07],"65536":[9.3832000000000006e-05,9.6181235294117651e-05,9.6624250000000006e-05,9.7025671641791039e-05,9.813344444444444e-05,9.9049600000000008e-05,9.9154029850746271e-05,9.9417499999999995e-05,9.9505851851851865e-05,9.9838461538461545e-05,0.00010019,0.00010118037209302325,0.00010127765,0.00010159621875,0.00010210238461538465,0.00010241769642857143,0.00010323753333333336,0.00010377791935483871,0.00010434266666666668,0.00010729574999999999],"16252928":[0.22832482700000001,0.22953504949999998,0.22959202099999998,0.22959216399999999,0.229781553,0.22992894400000002,0.23022271850000001,0.2302851175,0.23152947750000002,0.23158584100000001,0.23162501999999999,0.23175169649999999,0.23201210150000001,0.23212674450000001,0.23233943000000001,0.232534342,0.232938748,0.23324572299999999,0.233328179,0.23385724499999999],"464":[5.2705999999999996e-07,5.2707000000000002e-07,5.2709000000000004e-07,5.2710999999999996e-07,5.2713999999999994e-07,5.2715000000000001e-07,5.2715999999999996e-07,5.2755999999999999e-07,5.2778000000000003e-07,5.2791000000000002e-07,5.2801999999999999e-07,5.2837999999999997e-07,5.2852000000000002e-07,5.2853999999999994e-07,5.2928000000000004e-07,5.5158999999999998e-07,5.5185000000000006e-07,5.5257999999999999e-07,5.7904000000000003e-07,5.7930000000000001e-07],"1015808":[0.0049976550000000019,0.0051168300000000002,0.0051281520000000004,0.005242816,0.0052627450000000001,0.0053149970000000001,0.0053694949999999976,0.0053882319999999997,0.0054702800000000027,0.0054737510000000024,0.0055784679999999996,0.005622218,0.0056588860000000001,0.0057601559999999998,0.0058721559999999973,0.0059002170000000001,0.005927611999999997,0.006048450000000003,0.0061620810000000024,0.0069829899999999971],"3072":[3.5176100000000003e-06,3.5198300000000001e-06,3.5235000000000002e-06,3.52613e-06,3.5292500000000001e-06,3.53015e-06,3.5321099999999999e-06,3.5363400000000002e-06,3.5364300000000001e-06,3.5365299999999999e-06,3.5366599999999997e-06,3.5385199999999998e-06,3.5402300000000004e-06,3.5414199999999998e-06,3.5418500000000002e-06,3.6891500000000001e-06,3.7037399999999996e-06,3.8050899999999999e-06,3.8669600000000002e-06,3.8774700000000002e-06],"110592":[0.000241625,0.00024542033333333331,0.000248058,0.00024876400000000001,0.0002511442142857143,0.00025428158333333327,0.00025603214285714284,0.00025814891666666665,0.00025815674999999998,0.00026057346153846148,0.00026275338461538469,0.0002653828461538462,0.00026546763636363634,0.00026549400000000002,0.000265569,0.00026611758333333337,0.00026654321739130434,0.00026711138461538462,0.00026770721428571434,0.00027932115384615388],"237568":[0.00070277162500000003,0.00070354366666666669,0.00070574462500000001,0.00070953949999999987,0.00071200600000000027,0.00073149112500000006,0.00073230750000000003,0.00073314366666666654,0.00073340774999999998,0.00073388649999999995,0.00073768255555555536,0.00074318687499999993,0.00074544049999999995,0.0007459385000000002,0.00074711187500000004,0.00074848274999999979,0.00074935675,0.00074993025000000008,0.00075444311111111124,0.00075792575000000004],"278528":[0.00082995399999999972,0.00084038800000000007,0.00084477271428571427,0.00086310200000000036,0.00086447599999999998,0.0008687520000000002,0.00086931733333333347,0.00087078666666666666,0.00087158633333333342,0.00087350871428571418,0.0008743613333333332,0.00087600466666666685,0.00087716933333333339,0.00088030000000000031,0.00088111500000000002,0.00088124099999999995,0.000881568,0.0008816335,0.00088582700000000049,0.00088800700000000001],"496":[5.5967999999999999e-07,5.6281e-07,5.6285000000000004e-07,5.6285000000000004e-07,5.6303999999999999e-07,5.6317999999999994e-07,5.6326000000000003e-07,5.6391999999999993e-07,5.6403999999999996e-07,5.6412000000000005e-07,5.6420999999999999e-07,5.6423000000000002e-07,5.6425000000000004e-07,5.6430000000000004e-07,5.6461000000000002e-07,5.6474000000000001e-07,5.6476999999999999e-07,5.6560000000000004e-07,5.8905e-07,5.8976000000000001e-07],"13107200":[0.17750698749999999,0.17755461750000001,0.17772989650000001,0.17782754100000001,0.17821550349999998,0.17831058,0.178522721,0.17892670699999999,0.179097019,0.17940504099999999,0.18018990699999998,0.18086462250000002,0.180905763,0.18091826500000002,0.18105116499999999,0.181795332,0.18210225000000002,0.182174221,0.1824108975,0.182548928],"9961472":[0.13149948650000001,0.13155555499999999,0.13178766350000001,0.13192230499999999,0.13204138600000001,0.1321513745,0.13235579750000001,0.1323903615,0.13268342299999999,0.13271035599999997,0.13321077200000001,0.13334582699999997,0.133373675,0.1334402905,0.13351597200000001,0.13356778599999999,0.13415726250000001,0.13459442099999999,0.13476661200000001,0.13560715249999999],"5888":[6.9348699999999999e-06,6.9446086956521741e-06,6.9823400000000003e-06,7.0019099999999997e-06,7.0487900000000003e-06,7.0707799999999996e-06,7.0975400000000005e-06,7.1013000000000001e-06,7.1844900000000006e-06,7.1888400000000008e-06,7.2003299999999999e-06,7.2471199999999993e-06,7.2578947368421049e-06,7.3600399999999992e-06,7.4941400000000002e-06,7.6111900000000002e-06,7.6178624999999994e-06,8.0010000000000001e-06,8.2041899999999995e-06,8.2052299999999994e-06],"11010048":[0.14613398150000001,0.146785254,0.14697249800000001,0.14705220349999998,0.14705322000000001,0.14725731249999999,0.14765434100000002,0.14801055900000004,0.14848346749999999,0.14856222799999999,0.148643152,0.14882139250000001,0.14892774450000001,0.14896878299999999,0.14963528500000001,0.14982984899999999,0.14987620900000001,0.15020491899999999,0.15049924549999999,0.15059203700000001],"1920":[2.17192e-06,2.17867e-06,2.1791e-06,2.1792799999999999e-06,2.1797099999999999e-06,2.18002e-06,2.1800899999999998e-06,2.1809800000000003e-06,2.1812899999999999e-06,2.1820099999999999e-06,2.18315e-06,2.1835299999999999e-06,2.1837700000000002e-06,2.1867600000000001e-06,2.1870200000000001e-06,2.1885100000000002e-06,2.1894600000000001e-06,2.20308e-06,2.2134700000000001e-06,2.2882299999999999e-06],"2490368":[0.028523047999999988,0.028704826999999999,0.028853641499999999,0.028960262000000007,0.029063796000000013,0.029102722499999994,0.029103097499999998,0.029118572000000009,0.029122392,0.0291272045,0.029176537999999974,0.029181528500000008,0.029237746000000009,0.0292417315,0.029301182999999998,0.02934823000000001,0.029515869,0.02953309149999999,0.0295469015,0.031853476000000006],"19456":[2.3309e-05,2.33184e-05,2.3323e-05,2.3323500000000001e-05,2.33462e-05,2.3368999999999999e-05,2.3629333333333334e-05,2.403782e-05,2.4103604166666667e-05,2.4147119999999999e-05,2.4419666666666666e-05,2.4422499999999999e-05,2.4439000000000001e-05,2.4511e-05,2.4554410000000001e-05,2.4694509999999999e-05,2.5113190000000001e-05,2.512397e-05,2.5164000000000002e-05,2.6972760000000001e-05],"57344":[7.8739999999999995e-05,7.9148999999999997e-05,7.9172999999999996e-05,7.9648999999999996e-05,8.2343175e-05,8.2621909090909085e-05,8.331322784810126e-05,8.3572822784810124e-05,8.3739084337349393e-05,8.3968291139240503e-05,8.4490766233766228e-05,8.4935274999999998e-05,8.5154715909090912e-05,8.5344641025641031e-05,8.5716671052631584e-05,8.5987972222222218e-05,8.6051653846153849e-05,8.6201320987654327e-05,8.8996810810810812e-05,9.815925352112676e-05],"1179648":[0.007075975,0.0073491700000000004,0.0073580850000000003,0.0073730130000000003,0.0074131299999999995,0.007452905000000001,0.0074617039999999996,0.007475415,0.007535506,0.0076731099999999995,0.0076900090000000003,0.0076944410000000006,0.0078497069999999992,0.0079289269999999971,0.0079290059999999971,0.0080522680000000013,0.0083525260000000025,0.0084958445000000004,0.009858467000000001,0.010096177],"4718592":[0.058956284000000025,0.059184499999999987,0.059342202000000024,0.059670815000000023,0.059737442500000015,0.059832912000000002,0.059840811000000015,0.059897964000000026,0.059905377000000003,0.0599985715,0.060024178999999997,0.060055813999999999,0.06012657450000003,0.060209331500000018,0.060296507999999985,0.060583772000000001,0.060669021000000004,0.060688776999999985,0.060711482500000004,0.060718177999999998],"360448":[0.001092197,0.0011186836000000003,0.0011207134000000001,0.001147793,0.0011523129999999999,0.0011550915,0.0011659050000000001,0.0011764950000000003,0.0011779865,0.0011798225,0.0011817962,0.001182675,0.001192589,0.0011929281999999996,0.00120529225,0.0012135456666666669,0.0012276233333333333,0.0012320290000000004,0.0013032905000000001,0.0013252069999999999],"1572864":[0.014027269,0.014046939499999999,0.0140619675,0.014127273500000001,0.0142901455,0.014299630999999985,0.014309695000000006,0.0143899335,0.0143969345,0.0144301195,0.0144915015,0.0145723165,0.014643122999999999,0.0146607565,0.014695224999999996,0.014850199,0.014862351499999999,0.015148682,0.015151626,0.016007963],"53248":[7.3025e-05,7.3100000000000001e-05,7.5416743589743596e-05,7.6092000000000003e-05,7.6231033333333322e-05,7.6276e-05,7.6542465753425017e-05,7.6759000000000001e-05,7.7159094117647064e-05,7.7297941860465111e-05,7.7455790697674419e-05,7.7634039473684218e-05,7.7646761904761905e-05,7.823017e-05,7.8266939759036146e-05,7.9111046511627905e-05,8.0048000000000003e-05,8.1473561797752806e-05,8.3642416666666661e-05,8.5049000000000005e-05],"3456":[3.9865199999999996e-06,3.9918800000000001e-06,3.9971799999999999e-06,3.9986500000000002e-06,4.0011700000000004e-06,4.0017000000000002e-06,4.0017299999999997e-06,4.0037899999999998e-06,4.0056500000000003e-06,4.0057906976744189e-06,4.0066739130434789e-06,4.00734e-06,4.0156799999999998e-06,4.1420100000000002e-06,4.1873333333333331e-06,4.19199e-06,4.1953599999999994e-06,4.1953899999999998e-06,4.3384800000000003e-06,5.0182099999999995e-06],"40960":[5.7024353846153843e-05,5.7095000000000001e-05,5.7113e-05,5.7160999999999997e-05,5.7365999999999999e-05,5.7988700000000003e-05,5.9241850000000003e-05,5.9249729999999998e-05,5.9437046875000003e-05,5.9715815384615384e-05,5.9761359999999997e-05,5.9772333333333337e-05,5.9961190000000004e-05,5.9966949999999993e-05,5.9987e-05,6.0450620000000002e-05,6.079815e-05,6.1340241935483873e-05,6.1577999999999999e-05,6.245077e-05],"4608":[5.3847300000000007e-06,5.38788e-06,5.3888799999999996e-06,5.3893799999999999e-06,5.3903800000000004e-06,5.3931900000000005e-06,5.4044499999999996e-06,5.4067472527472535e-06,5.4073900000000002e-06,5.4159300000000005e-06,5.4285499999999999e-06,5.4311100000000003e-06,5.4326899999999998e-06,5.4354880952380955e-06,5.5400899999999998e-06,5.5518099999999998e-06,5.59102e-06,5.8736e-06,5.9257799999999995e-06,6.3766699999999999e-06],"13824":[1.64655e-05,1.6500000000000001e-05,1.6538e-05,1.698663e-05,1.7048059999999998e-05,1.708069e-05,1.7127999999999999e-05,1.7130925373134328e-05,1.718186e-05,1.7201e-05,1.7222030000000001e-05,1.734693e-05,1.7347520000000001e-05,1.7389239999999999e-05,1.7419300000000001e-05,1.7467999999999999e-05,1.7779419999999999e-05,1.7943870000000001e-05,1.8907e-05,1.9355949999999999e-05],"819200":[0.003283897,0.003410508,0.003438540999999999,0.0035541430000000014,0.0035758599999999988,0.0035788449999999998,0.003585137,0.003613954,0.0036726080000000008,0.003675584,0.0037161590000000001,0.0037633440000000027,0.0037831639999999999,0.003787365999999999,0.0037900759999999999,0.003810872000000002,0.003821713,0.0039607889999999984,0.0042359759999999981,0.0048986499999999992],"983040":[0.004734645,0.0047444280000000002,0.0048384629999999986,0.0048918659999999999,0.0049039879999999998,0.0049124640000000001,0.0049709839999999995,0.0049773059999999999,0.0051201520000000002,0.0051433020000000006,0.0052151479999999976,0.0052276359999999999,0.0052358889999999979,0.0052385629999999999,0.0052616980000000004,0.0053206099999999982,0.0054059579999999902,0.0055619449999999996,0.0059080350000000025,0.0062762669999999977],"8704":[1.0313599999999999e-05,1.03202e-05,1.0414999999999999e-05,1.0594387096774194e-05,1.0619040000000001e-05,1.062794e-05,1.063673e-05,1.0686969999999999e-05,1.069962e-05,1.075569e-05,1.077976e-05,1.0815309999999999e-05,1.0848710000000001e-05,1.0853359999999999e-05,1.0869999999999999e-05,1.1212655172413794e-05,1.1376019999999999e-05,1.1380100000000001e-05,1.1624969999999999e-05,1.4306060000000001e-05],"120":[1.4080000000000002e-07,1.4080000000000002e-07,1.4082000000000001e-07,1.4082000000000001e-07,1.4082000000000001e-07,1.4100000000000001e-07,1.4100999999999999e-07,1.4100999999999999e-07,1.4100999999999999e-07,1.4100999999999999e-07,1.4102e-07,1.4102e-07,1.4105999999999999e-07,1.4201000000000001e-07,1.4208000000000001e-07,1.4275999999999999e-07,1.4391e-07,1.4417e-07,1.4966999999999999e-07,2.0441999999999997e-07],"1024":[1.1552199999999999e-06,1.1557099999999999e-06,1.1558200000000001e-06,1.15586e-06,1.1562500000000002e-06,1.15643e-06,1.1566000000000001e-06,1.15662e-06,1.1570300000000001e-06,1.15721e-06,1.1574300000000001e-06,1.1577599999999999e-06,1.15787e-06,1.15797e-06,1.1581199999999999e-06,1.2110199999999998e-06,1.2110299999999999e-06,1.2117600000000002e-06,1.2689799999999999e-06,1.26956e-06],"49152":[6.6815000000000003e-05,6.9478735849056602e-05,6.9950999999999995e-05,6.9955000000000004e-05,7.0035000000000003e-05,7.0295818181818185e-05,7.0465789473684204e-05,7.0832610000000004e-05,7.136744e-05,7.1549680000000009e-05,7.2250828571428571e-05,7.2316079999999996e-05,7.2378583333333328e-05,7.2568e-05,7.258795e-05,7.3399999999999995e-05,7.3442629999999996e-05,7.4959430000000001e-05,7.5683466666666668e-05,7.6296499999999997e-05],"524288":[0.0017115310000000001,0.0017209179999999994,0.0017649816666666669,0.0017653003333333334,0.001794267,0.001795231,0.0017993220000000001,0.001813793,0.0018170703333333336,0.0018330296666666669,0.001833969,0.0018346879999999992,0.0018399530000000001,0.0018431279999999999,0.001844961,0.0018912099999999995,0.001896687,0.0019298736666666667,0.0019299206666666673,0.0021673],"45056":[6.0714000000000002e-05,6.3553000000000006e-05,6.3563226415094343e-05,6.4148300000000004e-05,6.4441020000000003e-05,6.4848627450980401e-05,6.5192719999999991e-05,6.5315920000000004e-05,6.5479609756097557e-05,6.5480839999999994e-05,6.5782529999999998e-05,6.6217439999999997e-05,6.6354975609756104e-05,6.6441354166666666e-05,6.6500346938775509e-05,6.6657090000000002e-05,6.6755999999999996e-05,6.6936046511627907e-05,6.7979940000000006e-05,7.2095366666666668e-05],"229376":[0.00067968180000000018,0.00068029055555555561,0.00068552524999999974,0.00069159400000000002,0.00069289588888888872,0.00069892725000000021,0.00070045025000000001,0.0007017281111111114,0.00070175174999999963,0.00070246520000000038,0.00070305419999999979,0.00070346199999999997,0.00070738275000000004,0.00071076774999999999,0.00071251833333333336,0.00071283750000000019,0.00072127399999999994,0.0007344068,0.00078364374999999992,0.00091156199999999966],"2688":[3.0571599999999999e-06,3.0586785714285715e-06,3.0663000000000002e-06,3.0663100000000005e-06,3.0666800000000001e-06,3.0671300000000002e-06,3.0690999999999995e-06,3.0725199999999999e-06,3.0725799999999999e-06,3.0777099999999996e-06,3.0806900000000001e-06,3.0815200000000002e-06,3.0828300000000003e-06,3.08475e-06,3.0859399999999998e-06,3.0863400000000003e-06,3.1682200000000001e-06,3.18256e-06,3.1994800000000003e-06,3.6004700000000001e-06],"152":[1.7645000000000002e-07,1.7662e-07,1.7665000000000001e-07,1.7666e-07,1.7666e-07,1.7841000000000002e-07,1.7847000000000001e-07,1.7847000000000001e-07,1.7853999999999998e-07,1.7853999999999998e-07,1.7858e-07,1.7859999999999997e-07,1.7865e-07,1.7887000000000001e-07,1.7893999999999999e-07,1.7898999999999999e-07,1.7921e-07,1.8719000000000002e-07,2.1145e-07,2.9444999999999999e-07],"5120":[6.00093e-06,6.0063541666666664e-06,6.0096300000000004e-06,6.011337662337662e-06,6.0115199999999997e-06,6.0125300000000009e-06,6.0173099999999998e-06,6.0322692307692307e-06,6.0417600000000001e-06,6.0480899999999999e-06,6.0494000000000001e-06,6.1204200000000004e-06,6.12286e-06,6.1569399999999997e-06,6.2065600000000006e-06,6.2493200000000002e-06,6.3110000000000002e-06,6.3297199999999994e-06,6.3309599999999998e-06,6.5494299999999999e-06],"1507328":[0.012646451999999999,0.01271832,0.012796268,0.012998303500000002,0.013059962500000005,0.013106703000000001,0.013107260500000001,0.0131271615,0.013218473499999999,0.013256401000000001,0.013297758499999982,0.013337059,0.013394128999999996,0.013484275,0.013504885500000004,0.013556948500000004,0.0135625695,0.013633317000000001,0.0138369155,0.0141518905],"1216":[1.3713700000000001e-06,1.3715999999999999e-06,1.3716900000000001e-06,1.37218e-06,1.3731799999999999e-06,1.3732999999999998e-06,1.3739899999999998e-06,1.37402e-06,1.3762799999999999e-06,1.3766200000000002e-06,1.3766200000000002e-06,1.3778e-06,1.3783600000000002e-06,1.3788400000000001e-06,1.3790400000000001e-06,1.38071e-06,1.383494623655914e-06,1.3839200000000001e-06,1.5056400000000001e-06,1.51554e-06],"1966080":[0.020648103500000001,0.020853151,0.020951723499999995,0.020958141499999999,0.021022763,0.021072578500000001,0.021077539999999999,0.021112346000000011,0.0211260185,0.021130556499999998,0.021148327500000001,0.021252528999999999,0.021298162999999995,0.021300742500000008,0.021337573999999998,0.021357882000000002,0.021609635000000002,0.021676320000000002,0.021844805999999998,0.023885722999999998],"1900544":[0.019680691,0.019719272499999999,0.019834589999999999,0.019840027999999996,0.019860335999999999,0.019887617999999996,0.0199470915,0.019982497500000002,0.020026273500000018,0.020054548500000005,0.0200795005,0.020089363999999995,0.020096102999999994,0.020124126499999988,0.020202529,0.020370948,0.020376420499999999,0.020462589,0.020543008500000008,0.021246833999999999],"184":[2.1226e-07,2.1229e-07,2.1231e-07,2.1231999999999998e-07,2.1262000000000001e-07,2.1409999999999999e-07,2.1413e-07,2.1446e-07,2.145e-07,2.1460999999999999e-07,2.1460999999999999e-07,2.1463000000000001e-07,2.1491000000000001e-07,2.1529999999999998e-07,2.1551e-07,2.2333e-07,2.2417e-07,2.2419e-07,2.2446000000000001e-07,2.2679999999999999e-07],"7936":[9.3907499999999998e-06,9.4010212765957453e-06,9.4290000000000007e-06,9.4539999999999996e-06,9.4569999999999994e-06,9.5883499999999994e-06,9.6034199999999999e-06,9.6290700000000003e-06,9.6736900000000012e-06,9.7106800000000003e-06,9.7142500000000011e-06,9.7402500000000005e-06,9.7607681159420297e-06,9.7668900000000006e-06,9.7968900000000003e-06,9.8115299999999996e-06,9.8970099999999993e-06,1.009492e-05,1.0313458333333332e-05,1.1334419999999999e-05],"3801088":[0.046478439999999996,0.046576340000000001,0.046734110500000002,0.046788825499999999,0.04686829,0.04711681550000002,0.047174449,0.047225328999999996,0.047247681500000013,0.047256167000000002,0.047265245000000018,0.047285404500000003,0.047320477999999985,0.047342503000000001,0.047347868000000001,0.047372684499999998,0.047451288499999987,0.047571419000000004,0.048414455000000002,0.049477455999999989],"6815744":[0.087415145000000055,0.088028331999999987,0.088172253999999992,0.088234649499999984,0.088371126000000008,0.088423163999999999,0.088523508500000028,0.088597912500000042,0.088759142499999971,0.08884885950000003,0.088866624999999963,0.088988431000000007,0.089094842999999965,0.089178995000000025,0.0893037255,0.089479059500000027,0.089751785000000001,0.091063525999999992,0.09117261699999997,0.091549973999999992],"124":[1.4525000000000001e-07,1.4525999999999999e-07,1.4525999999999999e-07,1.4525999999999999e-07,1.4528000000000001e-07,1.4529e-07,1.4530000000000001e-07,1.4530000000000001e-07,1.4534e-07,1.4536e-07,1.4539999999999999e-07,1.4541e-07,1.4541e-07,1.4545999999999998e-07,1.4546999999999999e-07,1.4663000000000001e-07,1.4665999999999999e-07,1.4742999999999999e-07,1.4814999999999999e-07,1.4947999999999999e-07],"102400":[0.00020178500000000006,0.00021319437931034474,0.00021356958823529415,0.00021423180769230754,0.000214639,0.00021494255555555556,0.00021570228571428574,0.00021902417647058818,0.00021930810000000012,0.00021982276470588241,0.00022460150000000006,0.00022521625925925928,0.0002272220000000001,0.000227572,0.00022911058620689664,0.00023275674999999945,0.00024560700000000001,0.00024670838461538473,0.00025536069230769229,0.00025598162500000001],"311296":[0.00092923433333333308,0.00095448366666666643,0.00096403816666666676,0.00096622966666666673,0.00098319533333333345,0.00098332833333333327,0.00098487750000000006,0.00098787066666666703,0.00099013016666666689,0.00099067600000000001,0.00099342299999999979,0.00099522266666666635,0.00099934600000000035,0.0010003053333333335,0.0010036786666666668,0.0010080429999999999,0.0010086030000000001,0.0010265383333333332,0.0010656979999999999,0.0010941696666666664],"1408":[1.5898799999999999e-06,1.5916899999999999e-06,1.5957100000000001e-06,1.5960799999999999e-06,1.5972299999999999e-06,1.59926e-06,1.5994499999999998e-06,1.6021099999999999e-06,1.603144927536232e-06,1.60337e-06,1.60552e-06,1.6059299999999999e-06,1.6066199999999999e-06,1.6085000000000001e-06,1.6090599999999999e-06,1.61559e-06,1.61695e-06,1.61849e-06,1.62515e-06,1.7502222222222224e-06],"393216":[0.0012019156666666665,0.001214828,0.001219829,0.00122192,0.0012237991999999999,0.0012248707500000001,0.0012258043333333334,0.0012291705000000001,0.0012408689999999997,0.001244123,0.001248421,0.0012629749999999999,0.0012638235,0.0012718174999999999,0.00128318725,0.0012867294999999996,0.0012930424999999996,0.0013045184999999995,0.0013087818,0.0013131939999999999],"4352":[5.0748000000000001e-06,5.0761899999999999e-06,5.0804800000000002e-06,5.0831249999999997e-06,5.0864400000000004e-06,5.0883400000000003e-06,5.0922000000000001e-06,5.0938500000000004e-06,5.0961599999999993e-06,5.1087300000000003e-06,5.1157199999999997e-06,5.1568399999999997e-06,5.1873499999999996e-06,5.2011699999999999e-06,5.2148399999999999e-06,5.3139199999999998e-06,5.3238199999999995e-06,5.3326700000000002e-06,5.3534999999999997e-06,5.5831900000000003e-06],"6553600":[0.084059001999999994,0.084272346500000025,0.084326856000000006,0.08434274250000004,0.084690418999999975,0.085001582499999964,0.08504962499999999,0.085107239000000001,0.08514113299999998,0.085230771999999996,0.085301883000000023,0.085307265500000007,0.085477117500000005,0.085503562500000019,0.085613704999999957,0.085705184000000018,0.085716839499999975,0.086034856500000007,0.087315378499999985,0.087316619000000026],"20480":[2.4530499999999998e-05,2.4542999999999999e-05,2.4587999999999999e-05,2.5552600000000003e-05,2.5617760000000001e-05,2.5689666666666669e-05,2.5773580000000002e-05,2.5802000000000001e-05,2.5813422535211265e-05,2.5955299999999999e-05,2.6143490000000001e-05,2.6184810000000001e-05,2.6384770000000003e-05,2.6638730000000002e-05,2.6672530000000001e-05,2.7008999999999998e-05,2.7847999999999998e-05,2.7915999999999998e-05,2.828532e-05,2.855887e-05],"608":[6.8698999999999999e-07,6.8749000000000002e-07,6.8754999999999999e-07,6.8758999999999993e-07,6.8759999999999999e-07,6.8785000000000001e-07,6.8794999999999991e-07,6.8810999999999999e-07,6.8832999999999992e-07,6.8832999999999992e-07,6.8846999999999997e-07,6.8848000000000003e-07,6.8857999999999994e-07,6.8889999999999998e-07,6.8892e-07,6.9164000000000002e-07,6.9210999999999997e-07,7.1956999999999998e-07,7.2158999999999994e-07,7.2268999999999992e-07],"2228224":[0.0247326335,0.024892434000000001,0.025015084999999999,0.025052593499999998,0.025054425999999998,0.025101789500000006,0.025150514499999999,0.025175913000000001,0.025177102999999996,0.025200731000000004,0.025267581000000001,0.0253233205,0.025352869,0.025394741000000005,0.025450089999999998,0.025582967000000002,0.025698000999999998,0.0257105075,0.025801375999999997,0.0264371235],"36864":[4.8421999999999998e-05,5.051966666666667e-05,5.1061850000000003e-05,5.1406300000000003e-05,5.1653890000000003e-05,5.1774489130434787e-05,5.1968685393258432e-05,5.2012309999999997e-05,5.2025300000000005e-05,5.2071779999999997e-05,5.2235600000000005e-05,5.2497000000000002e-05,5.2695689999999997e-05,5.2865639999999993e-05,5.2925488636363636e-05,5.2973583333333334e-05,5.3274299999999999e-05,5.3495089999999995e-05,5.4280623376623374e-05,5.7169789999999995e-05],"704":[7.9450999999999993e-07,7.9549999999999994e-07,7.9594999999999998e-07,7.9597e-07,7.9632000000000003e-07,7.9657000000000004e-07,7.9668000000000001e-07,7.9709999999999996e-07,7.9731000000000004e-07,7.9739000000000002e-07,7.976e-07,7.9771000000000007e-07,7.9798e-07,7.9816999999999995e-07,7.9879999999999998e-07,7.9888999999999992e-07,7.9962000000000006e-07,7.9998000000000005e-07,8.3490000000000004e-07,8.3530999999999993e-07],"720896":[0.0027075529999999993,0.0029097899999999998,0.0029146109999999992,0.0029374099999999992,0.0029752020000000001,0.003013324999999999,0.0030320395,0.0030461315000000007,0.0030583609999999999,0.0030673735000000001,0.0031039149999999979,0.0031107920000000002,0.0031143045000000002,0.0031274355000000002,0.0032593490000000017,0.0032734665000000002,0.003338363,0.0034512870000000008,0.0035025659999999999,0.003787098],"800":[9.0139e-07,9.0413000000000004e-07,9.0414999999999995e-07,9.0454999999999998e-07,9.050799999999999e-07,9.0513999999999996e-07,9.0519000000000007e-07,9.0537000000000007e-07,9.0584000000000002e-07,9.0593999999999992e-07,9.0594999999999998e-07,9.0635000000000001e-07,9.0647000000000004e-07,9.0680000000000005e-07,9.0709e-07,9.0712999999999994e-07,9.0869999999999998e-07,9.4766999999999996e-07,9.9135000000000005e-07,1.0389999999999999e-06],"2621440":[0.030446191499999997,0.030597411499999998,0.030647485999999991,0.030653933500000001,0.030669584500000003,0.030764847499999998,0.030891109999999999,0.030900466000000005,0.030914417,0.030933468499999995,0.030944708500000001,0.030996965500000001,0.031046074,0.031053938499999996,0.031082719000000002,0.031119175999999998,0.031188742000000012,0.031232701999999939,0.031314366000000003,0.031320140000000003],"425984":[0.0013278889999999992,0.0013387225,0.0013460165,0.0013523504999999999,0.0013536695,0.0013736165,0.001373757,0.001382129,0.0013843320000000001,0.0013965704999999999,0.0013972945000000001,0.001407618,0.0014157320000000001,0.0014203995000000001,0.0014254884999999999,0.001429685,0.0014298359999999999,0.001441721,0.0014467289999999997,0.0014781437499999999],"32768":[4.4223e-05,4.4236149999999998e-05,4.4317000000000003e-05,4.4380681818181821e-05,4.4415941176470588e-05,4.4621610000000001e-05,4.4944280000000001e-05,4.5301089999999998e-05,4.5305636363636368e-05,4.5324000000000002e-05,4.5522660000000001e-05,4.5583600000000002e-05,4.5965470000000004e-05,4.6334030000000003e-05,4.7081459999999997e-05,4.7683509999999999e-05,4.7813489999999998e-05,4.8628200000000003e-05,4.887293e-05,5.1225089999999998e-05],"12058624":[0.16110983200000001,0.1613338845,0.1616021215,0.16186887850000001,0.16269140100000001,0.1635270445,0.1637439785,0.16394815300000001,0.16410134949999999,0.16422742100000001,0.16423716050000001,0.164277808,0.16452131549999999,0.16483463300000001,0.16486534,0.165254445,0.16525556299999999,0.165463474,0.166516317,0.16659921649999998],"128":[1.4966e-07,1.4969000000000001e-07,1.4969000000000001e-07,1.4970999999999998e-07,1.4973999999999999e-07,1.4982e-07,1.4983000000000001e-07,1.4985000000000001e-07,1.4987999999999999e-07,1.4990000000000001e-07,1.4990000000000001e-07,1.4991e-07,1.4991e-07,1.4994e-07,1.4996e-07,1.4997000000000001e-07,1.5036e-07,1.5204999999999999e-07,1.5668e-07,2.0582999999999998e-07],"180224":[0.00051451191666666645,0.00051512779999999994,0.00051713414285714282,0.00051733041666666654,0.00051868720000000017,0.00051872133333333336,0.00052106359999999998,0.0005312504166666667,0.00053162841666666669,0.0005356658,0.00053606749999999983,0.000536226,0.00053638100000000016,0.0005381797142857143,0.00054206499999999978,0.00054540281818181826,0.0005454459166666666,0.00054590499999999996,0.00054675666666666666,0.00055455120000000009],"224":[2.5685999999999999e-07,2.5689999999999998e-07,2.5693000000000001e-07,2.5769000000000003e-07,2.5809e-07,2.5871000000000002e-07,2.5871999999999998e-07,2.5877999999999999e-07,2.5884000000000001e-07,2.5902e-07,2.5950999999999997e-07,2.5970999999999999e-07,2.5992000000000001e-07,2.6019e-07,2.6092999999999999e-07,2.6887e-07,2.8199e-07,2.8411999999999998e-07,2.8537999999999998e-07,2.8659000000000003e-07],"736":[8.3041000000000009e-07,8.3083000000000004e-07,8.3211e-07,8.3299000000000005e-07,8.3333999999999997e-07,8.3343999999999998e-07,8.3380999999999992e-07,8.3386000000000003e-07,8.3429000000000004e-07,8.3431999999999992e-07,8.3437999999999998e-07,8.3470999999999999e-07,8.3512999999999993e-07,8.3549999999999998e-07,8.3582000000000003e-07,8.3596000000000008e-07,8.3602000000000004e-07,8.3689000000000002e-07,8.5801000000000004e-07,8.7377000000000002e-07],"320":[3.6384000000000001e-07,3.6384999999999997e-07,3.6385999999999998e-07,3.6388e-07,3.6519e-07,3.6562000000000001e-07,3.6563999999999998e-07,3.6580000000000001e-07,3.6613999999999997e-07,3.6681000000000004e-07,3.6685999999999999e-07,3.6689000000000002e-07,3.6711999999999997e-07,3.6724000000000005e-07,3.6729e-07,3.6767999999999997e-07,3.6820999999999999e-07,3.6825000000000003e-07,3.8501000000000003e-07,3.8507000000000005e-07],"557056":[0.0018470699999999999,0.0018488460000000001,0.0018741250000000001,0.001907075,0.001919644333333333,0.0019272779999999988,0.0019317660000000001,0.0019410075,0.0019468545,0.0019595774999999998,0.001965479,0.0019800870000000006,0.0019841339999999998,0.0020083225000000001,0.0020095759999999999,0.0020101229999999999,0.0020191269999999999,0.0020337810000000006,0.0020466810000000007,0.0020728603333333333],"832":[9.3880000000000002e-07,9.3921e-07,9.4073000000000003e-07,9.4141000000000006e-07,9.4163e-07,9.4231000000000003e-07,9.4245000000000008e-07,9.4265000000000009e-07,9.4334999999999993e-07,9.4351000000000001e-07,9.4379000000000001e-07,9.4435999999999997e-07,9.4458000000000001e-07,9.4460999999999999e-07,9.4471999999999995e-07,9.4488999999999999e-07,9.4524999999999997e-07,9.853300000000001e-07,9.8723999999999989e-07,1.1149999999999999e-06],"9437184":[0.12296549399999999,0.12419482749999999,0.124380451,0.124538158,0.12483651599999999,0.12497572799999999,0.1249985045,0.12518804500000003,0.12520485200000001,0.125461031,0.12562108999999999,0.125628393,0.12577046,0.125794451,0.12593663150000001,0.12600152000000001,0.126032745,0.12629055,0.12675660550000001,0.12714500300000001],"3584":[4.1497407407407407e-06,4.1505700000000001e-06,4.1513599999999995e-06,4.1530199999999996e-06,4.1560000000000005e-06,4.1593899999999997e-06,4.1603199999999995e-06,4.1670200000000006e-06,4.1687800000000001e-06,4.1708199999999997e-06,4.1821300000000006e-06,4.2682699999999999e-06,4.3396800000000004e-06,4.3534699999999995e-06,4.3559500000000002e-06,4.5198500000000004e-06,4.5277099999999997e-06,4.5602699999999998e-06,4.9225799999999995e-06,5.0268700000000005e-06],"6291456":[0.080505858,0.080663755500000003,0.080682782999999994,0.080716138999999992,0.080728589500000003,0.080800652999999972,0.080859899000000041,0.080883827000000005,0.081211529500000018,0.081433177000000023,0.081466605499999983,0.081549129499999998,0.0816035705,0.081696082500000003,0.081792284500000006,0.081829898999999998,0.081834799499999986,0.081988469000000008,0.082009007000000023,0.084106482000000024],"256":[2.9245e-07,2.9246739130434782e-07,2.9255999999999997e-07,2.9260000000000001e-07,2.9261999999999998e-07,2.9275000000000002e-07,2.9396999999999998e-07,2.9411999999999999e-07,2.9430999999999999e-07,2.9433999999999997e-07,2.9484000000000001e-07,2.9541000000000002e-07,2.9606000000000002e-07,2.9709000000000002e-07,2.9927999999999996e-07,3.0601000000000003e-07,3.0949e-07,3.0970999999999999e-07,3.1035999999999998e-07,3.2476e-07],"15204352":[0.209335828,0.21015296950000001,0.211211282,0.21164688949999999,0.21190753500000004,0.21201796899999997,0.212532689,0.21259906150000002,0.213187921,0.213361779,0.21338016700000001,0.21368535299999999,0.21399738200000001,0.21433555300000001,0.21452481649999999,0.21483978500000001,0.21545538049999999,0.21557638849999999,0.21627762500000003,0.21888485099999999],"28672":[3.5117000000000003e-05,3.5308000000000001e-05,3.6930200000000001e-05,3.6943919999999998e-05,3.7247196721311479e-05,3.7267349999999998e-05,3.7328700000000001e-05,3.7408499999999999e-05,3.7486359999999998e-05,3.7489e-05,3.758412e-05,3.7708860000000005e-05,3.7727949999999998e-05,3.7731290000000002e-05,3.8554100000000004e-05,3.8609999999999998e-05,3.8797000000000001e-05,3.9193399999999996e-05,3.9799999999999998e-05,4.0404330000000004e-05],"768":[8.6569000000000007e-07,8.6613000000000004e-07,8.6630000000000007e-07,8.6634999999999997e-07,8.6683999999999995e-07,8.6726999999999996e-07,8.6735000000000005e-07,8.6883999999999999e-07,8.6891999999999997e-07,8.6917999999999995e-07,8.6955999999999996e-07,8.6991999999999994e-07,8.7120999999999998e-07,8.7194000000000001e-07,8.7206000000000004e-07,8.7287000000000006e-07,8.7357000000000001e-07,9.1433000000000006e-07,9.5469000000000009e-07,1.0210000000000001e-06],"212992":[0.00062684060000000013,0.00062948911111111098,0.00063003824999999984,0.00063072819999999996,0.00063722599999999996,0.00064332019999999992,0.00064625480000000013,0.00064678640000000013,0.00064977419999999984,0.0006499702,0.00065061559999999988,0.00065093690000000005,0.0006584066666666668,0.00065858800000000021,0.00065865740000000002,0.00065970925000000005,0.00066355533333333329,0.00066905200000000027,0.00068307399999999999,0.00070067199999999984],"864":[9.7267000000000004e-07,9.7416000000000009e-07,9.7525999999999996e-07,9.7558999999999996e-07,9.7634999999999998e-07,9.7713000000000012e-07,9.7726000000000011e-07,9.7729999999999994e-07,9.7742000000000008e-07,9.7766999999999999e-07,9.7825999999999997e-07,9.7952000000000003e-07,9.7956999999999992e-07,9.7986999999999995e-07,9.799600000000001e-07,9.8031000000000002e-07,9.8239000000000005e-07,9.8270000000000014e-07,1.0211000000000001e-06,1.0211400000000001e-06],"352":[3.9920999999999999e-07,3.9943000000000002e-07,4.0116000000000003e-07,4.0124999999999997e-07,4.0129999999999997e-07,4.0132999999999995e-07,4.016e-07,4.0174e-07,4.0176000000000002e-07,4.0179000000000005e-07,4.0185000000000002e-07,4.0242999999999998e-07,4.0283000000000001e-07,4.0292000000000001e-07,4.0312999999999998e-07,4.0414000000000002e-07,4.0438000000000003e-07,4.0523999999999999e-07,4.4018999999999997e-07,4.4113000000000003e-07],"253952":[0.00075313975000000004,0.00076573125000000005,0.000767119875,0.0007703460000000002,0.00077180399999999996,0.00077192300000000021,0.00077595600000000017,0.00077696999999999998,0.00078231999999999976,0.00078826433333333316,0.0007900013333333334,0.00079318774999999982,0.00079435212500000006,0.00079620666666666668,0.00079828666666666658,0.00080411999999999997,0.00080460899999999975,0.00080498975000000003,0.00081950800000000026,0.00082444300000000001],"960":[1.0833700000000001e-06,1.08388e-06,1.08404e-06,1.0841299999999999e-06,1.08414e-06,1.08458e-06,1.0849200000000001e-06,1.08523e-06,1.08536e-06,1.0859000000000001e-06,1.08595e-06,1.0861799999999999e-06,1.08649e-06,1.08721e-06,1.0876899999999999e-06,1.13665e-06,1.13758e-06,1.1404600000000001e-06,1.19164e-06,1.2270000000000001e-06],"24576":[2.9768e-05,2.9818499999999999e-05,2.9994714285714284e-05,3.0986750000000003e-05,3.104551e-05,3.12221e-05,3.1259170000000005e-05,3.1372419999999999e-05,3.1393000000000003e-05,3.1611800000000001e-05,3.1637199999999996e-05,3.1645250000000003e-05,3.1662999999999998e-05,3.169063e-05,3.1706680000000005e-05,3.1741e-05,3.1810860000000001e-05,3.1829039999999999e-05,3.209175e-05,3.2343489999999999e-05],"7680":[9.0769999999999997e-06,9.0793076923076923e-06,9.1148333333333329e-06,9.2053399999999992e-06,9.2118500000000006e-06,9.2197000000000009e-06,9.2773000000000001e-06,9.2792799999999997e-06,9.3674888888888891e-06,9.3736199999999992e-06,9.414160000000001e-06,9.4411799999999989e-06,9.4563400000000007e-06,9.4789e-06,9.5012800000000003e-06,9.509059999999999e-06,9.5386799999999993e-06,9.7519999999999991e-06,1.004811e-05,1.0842239999999999e-05],"294912":[0.00088119200000000004,0.00090167049999999966,0.00090633766666666676,0.00090897199999999975,0.0009109023333333337,0.00092013750000000008,0.00092057583333333309,0.00092523983333333334,0.00093110699999999992,0.00093310383333333334,0.00093673499999999995,0.00094392966666666678,0.00094429699999999987,0.00094610133333333324,0.00095687050000000003,0.00095703699999999999,0.00096921133333333315,0.0009767580000000001,0.00098332999999999992,0.0010004938333333332],"1048576":[0.0053824490000000001,0.0055064009999999984,0.0056443480000000004,0.0056519180000000023,0.0056638469999999996,0.0056882290000000004,0.0056989280000000015,0.0058086320000000002,0.0058346319999999993,0.0058420150000000016,0.0059033210000000004,0.0059338330000000012,0.0059446010000000025,0.0059851959999999999,0.006011593,0.0060291049999999999,0.0062822530000000015,0.0063909689999999981,0.0066001825000000002,0.0067799360000000003],"10485760":[0.139077125,0.13920967200000001,0.13942050750000001,0.14077003199999999,0.14083564800000001,0.1408841465,0.14091516400000001,0.14097198599999999,0.141250083,0.14145598200000001,0.141489694,0.14163519299999999,0.141689065,0.14174766800000005,0.1419843415,0.14203331699999999,0.14228604500000003,0.14241168800000001,0.14309053100000002,0.14426279049999999],"344064":[0.001049997,0.0010517843333333336,0.0010594188,0.0010739600000000001,0.0010787193333333331,0.0010875499999999998,0.001089762,0.0010922546666666667,0.0010936240000000001,0.0010941463333333334,0.0010990323333333336,0.0011012842,0.0011027676666666669,0.0011084424,0.0011124990000000001,0.0011248993999999999,0.001125855,0.0011286204,0.0011941880000000001,0.0014381979999999999],"288":[3.2827000000000001e-07,3.2827000000000001e-07,3.2827999999999997e-07,3.2827999999999997e-07,3.2827999999999997e-07,3.2830000000000005e-07,3.2944999999999998e-07,3.2994999999999996e-07,3.3020999999999999e-07,3.3020999999999999e-07,3.3024000000000002e-07,3.3031999999999996e-07,3.3040999999999995e-07,3.3059000000000005e-07,3.4351999999999999e-07,3.4455e-07,3.4579000000000003e-07,3.4730999999999995e-07,3.5287000000000001e-07,3.6214000000000004e-07],"1152":[1.2983900000000001e-06,1.2987099999999998e-06,1.29894e-06,1.29927e-06,1.2993e-06,1.3007000000000001e-06,1.30075e-06,1.3008999999999999e-06,1.3011000000000001e-06,1.3025199999999999e-06,1.30266e-06,1.3027500000000001e-06,1.3048700000000002e-06,1.3059000000000001e-06,1.3075200000000001e-06,1.30796e-06,1.30809e-06,1.3113400000000001e-06,1.37431e-06,1.5371699999999999e-06],"384":[4.3504999999999997e-07,4.3513000000000001e-07,4.3677000000000001e-07,4.3702999999999999e-07,4.3708999999999995e-07,4.3711999999999999e-07,4.3797e-07,4.3802e-07,4.3817999999999997e-07,4.383e-07,4.3855000000000002e-07,4.3900000000000005e-07,4.3926999999999999e-07,4.3934000000000002e-07,4.3952000000000001e-07,4.5530000000000001e-07,4.5704000000000002e-07,4.5713000000000002e-07,4.7897999999999997e-07,7.3071999999999997e-07],"2304":[2.6085700000000003e-06,2.6094200000000001e-06,2.6111400000000001e-06,2.61181e-06,2.6120100000000004e-06,2.6121599999999999e-06,2.6139499999999998e-06,2.61557e-06,2.6158500000000001e-06,2.6169300000000003e-06,2.6172300000000001e-06,2.61844e-06,2.6193800000000002e-06,2.6210300000000004e-06,2.6215100000000001e-06,2.6230799999999998e-06,2.6266400000000002e-06,2.6301999999999998e-06,2.6320299999999999e-06,2.7321099999999999e-06],"896":[1.0082999999999999e-06,1.0093199999999999e-06,1.00943e-06,1.00966e-06,1.01085e-06,1.0119e-06,1.01203e-06,1.0122499999999999e-06,1.01259e-06,1.0129299999999998e-06,1.01377e-06,1.0137900000000001e-06,1.01441e-06,1.01572e-06,1.01578e-06,1.01595e-06,1.01598e-06,1.01655e-06,1.05795e-06,1.2025200000000001e-06],"480":[5.4197999999999993e-07,5.4476000000000002e-07,5.4504999999999997e-07,5.4507999999999995e-07,5.4518000000000007e-07,5.4524000000000003e-07,5.4567000000000004e-07,5.4570000000000002e-07,5.4582000000000005e-07,5.4606999999999997e-07,5.4614999999999995e-07,5.4645000000000008e-07,5.4645999999999993e-07,5.4651000000000004e-07,5.4827000000000003e-07,5.4839000000000006e-07,5.7034999999999997e-07,5.7065999999999995e-07,5.7077000000000002e-07,5.9830000000000006e-07],"1441792":[0.011234787499999999,0.0112463335,0.0116049455,0.0117773315,0.011814640499999999,0.0118191515,0.011822441999999999,0.012018527500000001,0.012034992,0.012114135500000015,0.012142986,0.012165418000000002,0.012198031,0.0124108195,0.012414203999999988,0.012499913,0.012955389499999997,0.013334149,0.013615192999999994,0.013916736000000004],"992":[1.1194700000000001e-06,1.1197000000000001e-06,1.1198699999999999e-06,1.12032e-06,1.1203300000000001e-06,1.1207299999999999e-06,1.12081e-06,1.1209299999999999e-06,1.1211299999999999e-06,1.1214600000000001e-06,1.12161e-06,1.1218e-06,1.12209e-06,1.1223800000000001e-06,1.1224e-06,1.12246e-06,1.1234900000000001e-06,1.12601e-06,1.1275799999999999e-06,1.468e-06],"3968":[4.6085400000000003e-06,4.6098899999999998e-06,4.61832e-06,4.62056e-06,4.6209199999999998e-06,4.6273499999999998e-06,4.6280800000000001e-06,4.6286e-06,4.6303999999999997e-06,4.6304099999999996e-06,4.6320099999999997e-06,4.6328800000000004e-06,4.6355399999999993e-06,4.7482600000000005e-06,4.8446300000000006e-06,4.8457699999999999e-06,4.8467900000000001e-06,4.8535100000000001e-06,4.8582700000000002e-06,5.4778300000000007e-06],"6400":[7.5361904761904762e-06,7.5362400000000002e-06,7.5529999999999995e-06,7.5548571428571423e-06,7.6429999999999995e-06,7.6891000000000006e-06,7.7487200000000006e-06,7.7788700000000006e-06,7.7961199999999995e-06,7.8194e-06,7.8572099999999989e-06,7.8886799999999998e-06,7.9856599999999994e-06,8.0085800000000002e-06,8.0243700000000002e-06,8.0487300000000001e-06,8.1404799999999997e-06,8.3569999999999998e-06,8.9510200000000009e-06,9.3656700000000004e-06],"1344":[1.51792e-06,1.51877e-06,1.5200799999999999e-06,1.52184e-06,1.52372e-06,1.5252799999999999e-06,1.5255499999999999e-06,1.5263599999999999e-06,1.5286699999999999e-06,1.5287800000000002e-06,1.5296999999999999e-06,1.5309e-06,1.53122e-06,1.5374299999999999e-06,1.5382199999999999e-06,1.5382424242424243e-06,1.5402800000000002e-06,1.5406900000000001e-06,1.54137e-06,1.67146e-06],"126976":[0.00031597639999999996,0.0003210561578947369,0.00032113629999999991,0.00032172005263157906,0.00032190400000000008,0.000322949,0.00032393099999999985,0.000324044,0.00032948757894736823,0.00033108930000000001,0.00033249544444444461,0.00033379433333333337,0.00033577855555555551,0.00033905545454545455,0.00034067172222222226,0.00034120633333333341,0.00034185084210526311,0.00034246726315789478,0.00034272011111111122,0.0003447934499999998],"2883584":[0.034192320499999998,0.0343952275,0.034403205999999999,0.034473618499999983,0.03450776299999999,0.034543004000000002,0.034570829499999976,0.034628268500000024,0.03469912,0.034769925,0.0347975165,0.034821476499999983,0.034851938499999999,0.034870457000000014,0.034907309999999983,0.034951277999999988,0.035017745000000003,0.03507574749999999,0.035173027500000002,0.035229815999999983],"753664":[0.0029744819999999996,0.003045103,0.0030634815,0.0030672009999999999,0.0031049740000000008,0.0031208570000000008,0.00312175,0.0031287155,0.0031378779999999993,0.0031394719999999999,0.003156453,0.0031719075,0.0031735050000000001,0.0031791094999999991,0.0032016269999999999,0.0032084879999999998,0.0032289085000000001,0.0032535235000000001,0.003265109,0.0032796275],"16384":[1.9908500000000001e-05,2.024892e-05,2.027105e-05,2.0302999999999999e-05,2.0326720000000001e-05,2.0339358974358973e-05,2.0344844155844158e-05,2.039253e-05,2.0413940000000001e-05,2.04765e-05,2.0501769999999999e-05,2.0516089999999998e-05,2.0529559999999998e-05,2.0538333333333333e-05,2.0556000000000001e-05,2.058252e-05,2.0689530000000001e-05,2.0835763636363636e-05,2.1569480000000003e-05,2.3318599999999997e-05],"131072":[0.00032818399999999987,0.00033658000000000001,0.000336778588235294,0.00033713599999999992,0.00034035669999999974,0.00034042244444444446,0.00034288005882352938,0.000343514625,0.0003480654545454546,0.00034937655555555564,0.00035036688235294116,0.00035159359999999986,0.00035172136842105261,0.00035414585714285717,0.00035423011111111112,0.0003544941666666667,0.00035517999999999986,0.00035598183333333339,0.00036169200000000015,0.0003677259375],"458752":[0.001431374,0.0014354439999999999,0.001437022,0.0014627360000000001,0.0014791920000000001,0.0014834169999999999,0.001503496,0.0015149133333333333,0.001517897,0.0015179429999999997,0.0015200650000000001,0.001528866,0.0015446815,0.0015544325000000001,0.001559015,0.001570641,0.0016606503333333334,0.0016758299999999997,0.0017242779999999999,0.0019121979999999999],"172032":[0.00048578361538461544,0.00048670171428571421,0.00049042749999999983,0.00049068992307692294,0.00049519800000000019,0.00049524049999999972,0.00049648599999999998,0.00049714162499999999,0.0004994839999999947,0.00050094750000000002,0.00050275208333333348,0.00050280676923076921,0.00050286850000000002,0.00050292240000000018,0.00050869138461538351,0.00050948154545454546,0.00051401516666666662,0.0005160309999999998,0.00051680550000000002,0.00051781400000000012],"12288":[1.4613208333333334e-05,1.4620581395348838e-05,1.4679e-05,1.4980499999999998e-05,1.5117139999999999e-05,1.513059e-05,1.516706e-05,1.51783e-05,1.5231999999999999e-05,1.5238999999999999e-05,1.5282e-05,1.5306420000000001e-05,1.53204e-05,1.535e-05,1.5362999999999998e-05,1.5373e-05,1.5635910000000001e-05,1.726473e-05,1.7328799999999999e-05,1.7780859999999998e-05],"14680064":[0.2021726325,0.20229874800000003,0.20314879499999999,0.20365650299999999,0.20388041849999999,0.20409882300000001,0.20425701099999999,0.20438258200000001,0.20447165099999998,0.204904009,0.20490460199999999,0.20518073399999998,0.20561763799999999,0.205855591,0.206029515,0.20612326850000001,0.20644034,0.20695493200000001,0.20752506700000001,0.20779791049999999],"1536":[1.7307e-06,1.734e-06,1.7423100000000001e-06,1.7509200000000002e-06,1.7514099999999999e-06,1.7525400000000002e-06,1.7531200000000001e-06,1.7554e-06,1.7569400000000001e-06,1.7574600000000001e-06,1.75764e-06,1.76154e-06,1.7623099999999999e-06,1.76322e-06,1.76365e-06,1.76466e-06,1.7655200000000002e-06,1.7719900000000001e-06,1.82264e-06,1.8498399999999999e-06],"25600":[3.1237333333333333e-05,3.1510999999999997e-05,3.1618000000000001e-05,3.2169400000000004e-05,3.2329490000000002e-05,3.2479333333333333e-05,3.2879219999999997e-05,3.2901000000000002e-05,3.3010959999999997e-05,3.3015259999999999e-05,3.3049000000000002e-05,3.3092790000000002e-05,3.3137499999999999e-05,3.3359872340425532e-05,3.3373930000000005e-05,3.3442300000000003e-05,3.3572000000000003e-05,3.4315240000000002e-05,3.6767999999999998e-05,4.0285733333333333e-05],"1835008":[0.018371363999999998,0.018633062999999998,0.018656917000000002,0.018774180000000001,0.01877705549999998,0.01878768099999999,0.0187988075,0.018820802499999994,0.0188463395,0.0189340975,0.018966994999999993,0.018974794999999999,0.019079613000000002,0.019127076999999999,0.019208113499999999,0.019213562,0.019233661999999999,0.019463906999999992,0.019473443,0.020837215000000006],"10752":[1.2773125e-05,1.27809e-05,1.2845e-05,1.2892e-05,1.315301e-05,1.318909e-05,1.3194070000000001e-05,1.32004e-05,1.3210520000000001e-05,1.3218660000000002e-05,1.325641e-05,1.3286680000000001e-05,1.3321640000000001e-05,1.3369040000000001e-05,1.3374545454545454e-05,1.3417304347826086e-05,1.3446e-05,1.346666e-05,1.351524e-05,1.4043140000000001e-05],"21504":[2.5882999999999999e-05,2.6639999999999999e-05,2.664433e-05,2.6716e-05,2.6730109999999997e-05,2.6786310344827586e-05,2.6864132075471696e-05,2.6891739999999998e-05,2.6943339999999999e-05,2.7001500000000002e-05,2.7149999999999999e-05,2.7287259999999999e-05,2.7316340909090912e-05,2.7509999999999999e-05,2.7584469999999998e-05,2.7653539999999998e-05,2.7733129999999999e-05,2.7784999999999999e-05,2.7937999999999999e-05,3.0619089999999999e-05],"7602176":[0.098456566999999995,0.098989039999999959,0.099034196500000005,0.099134264999999999,0.09926930199999999,0.099295891999999969,0.099447816000000022,0.099488185500000006,0.099622265000000002,0.099696067500000013,0.099901686000000003,0.1001875735,0.100220138,0.10035809950000001,0.10038473050000001,0.10045092,0.100472872,0.10050418849999999,0.10054803299999999,0.10091461400000001],"5632":[6.6143400000000006e-06,6.6159700000000003e-06,6.6243333333333337e-06,6.62897e-06,6.6308399999999995e-06,6.6653499999999996e-06,6.6817000000000008e-06,6.6921600000000007e-06,6.7253799999999995e-06,6.7358900000000003e-06,6.7389e-06,6.7424900000000004e-06,6.8088199999999996e-06,6.81523e-06,6.8450800000000002e-06,6.8527999999999998e-06,7.1395e-06,7.2433599999999997e-06,7.2860899999999997e-06,7.63998e-06],"10":[1.4330000000000002e-08,1.4330000000000002e-08,1.434e-08,1.434e-08,1.434e-08,1.434e-08,1.434e-08,1.434e-08,1.434e-08,1.4349999999999999e-08,1.4349999999999999e-08,1.5000000000000002e-08,1.501e-08,1.501e-08,1.501e-08,1.501e-08,1.501e-08,1.503e-08,1.503e-08,1.5039999999999998e-08],"3145728":[0.037968797000000012,0.0379967825,0.03799910799999999,0.038135473500000003,0.038245738500000015,0.038257147499999991,0.038323194500000012,0.038335664999999998,0.038337359500000001,0.0384057685,0.038568705000000002,0.038610239000000011,0.038637364,0.038662643499999989,0.0387627085,0.0388042735,0.038830723999999997,0.038837542500000002,0.038934960000000012,0.039418784999999998],"245760":[0.00073128900000000009,0.00073645037500000027,0.00074200350000000004,0.00074519199999999977,0.00074619766666666663,0.00074821825000000023,0.00075293050000000002,0.00075941824999999996,0.00076206050000000001,0.00076266699999999997,0.00076326374999999996,0.00076434600000000017,0.00076716833333333341,0.00077085274999999997,0.000776992,0.00077875199999999996,0.00078764024999999969,0.00079145275000000004,0.00079266571428571425,0.00080457649999999994],"1728":[1.96289e-06,1.9634200000000003e-06,1.9649700000000003e-06,1.9663333333333335e-06,1.9664699999999997e-06,1.9667600000000001e-06,1.96711e-06,1.9673299999999998e-06,1.9679799999999999e-06,1.97145e-06,1.97188e-06,1.9720400000000002e-06,1.9722299999999999e-06,1.9723506493506496e-06,1.9732800000000001e-06,1.9768700000000001e-06,1.9783600000000001e-06,1.9813700000000002e-06,1.98951e-06,1.9899799999999999e-06],"11":[1.5700000000000002e-08,1.5700000000000002e-08,1.5700000000000002e-08,1.5700000000000002e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.571e-08,1.644e-08,1.644e-08,1.644e-08,1.644e-08,1.7240000000000001e-08,2.1770000000000002e-08],"1114112":[0.006055548,0.0062855590000000005,0.0063870699999999973,0.0064178799999999982,0.0064183789999999975,0.0064521369999999984,0.00648433,0.0064893030000000018,0.0065080399999999997,0.0065530939999999998,0.0065734970000000002,0.0065932690000000014,0.0066206249999999998,0.0066481700000000001,0.0067206399999999999,0.0068529110000000032,0.0071380889999999985,0.007147105,0.0071525780000000023,0.0095352405000000001],"12":[1.7380000000000001e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.079e-08,2.1739999999999998e-08,2.175e-08,2.175e-08,2.175e-08,2.2890000000000002e-08],"7340032":[0.094721171999999965,0.094929124999999975,0.0950902265,0.095402658500000001,0.095480091999999975,0.095895908000000016,0.095994060999999992,0.09604721849999999,0.09619949199999997,0.096207916999999976,0.096306234000000018,0.096452435000000031,0.096564305000000003,0.096611797499999957,0.096728040999999959,0.096827526999999983,0.096881120500000001,0.096956215499999998,0.097938129999999998,0.10049375300000001],"7168":[8.4787500000000008e-06,8.4790104166666676e-06,8.4882000000000012e-06,8.5542500000000003e-06,8.5837599999999996e-06,8.5997199999999997e-06,8.6017900000000005e-06,8.62181e-06,8.62365e-06,8.6992899999999992e-06,8.7303000000000001e-06,8.7512099999999992e-06,8.7711699999999996e-06,8.7852500000000003e-06,8.9006599999999999e-06,9.0088400000000003e-06,9.2862264150943391e-06,9.3971428571428565e-06,1.013417e-05,1.028005e-05],"13":[1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7929999999999999e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.7949999999999999e-08,1.8760000000000001e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,2.0650000000000003e-08],"6029312":[0.076502057999999998,0.076515208500000001,0.076863654999999961,0.077080926000000008,0.077251923,0.077449723999999998,0.077512765000000025,0.077644763500000005,0.077907039499999997,0.077925195000000003,0.078044888499999993,0.078160761000000023,0.078190734499999998,0.078310287499999992,0.078310719000000001,0.078399236499999997,0.078404256500000005,0.078423327000000001,0.078952453000000006,0.079149419499999998],"14":[1.8819999999999999e-08,1.8819999999999999e-08,1.8819999999999999e-08,1.8819999999999999e-08,1.8819999999999999e-08,1.8819999999999999e-08,1.8819999999999999e-08,1.8830000000000001e-08,1.8830000000000001e-08,1.8830000000000001e-08,1.9700000000000001e-08,1.9700000000000001e-08,1.9700000000000001e-08,1.9700000000000001e-08,1.9709999999999999e-08,1.9709999999999999e-08,1.9709999999999999e-08,2.016e-08,2.147e-08,2.3059999999999999e-08],"3200":[3.6764099999999999e-06,3.67801e-06,3.6817300000000002e-06,3.6837599999999999e-06,3.6884000000000001e-06,3.6926100000000003e-06,3.6956400000000001e-06,3.6958048780487806e-06,3.6983300000000002e-06,3.6983600000000002e-06,3.704e-06,3.7093000000000002e-06,3.7156199999999998e-06,3.8677899999999998e-06,3.86881e-06,3.9679900000000001e-06,4.0273299999999999e-06,4.0442199999999999e-06,4.3345800000000003e-06,4.3569599999999997e-06],"20":[2.552e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5530000000000001e-08,2.5539999999999999e-08,2.5539999999999999e-08,2.667e-08,2.672e-08,2.672e-08,2.6840000000000001e-08,2.7980000000000003e-08,2.8439999999999999e-08],"204800":[0.0005967765000000002,0.00059818540000000002,0.00059959209090909105,0.0006041528,0.00060810000000000009,0.00060949979999999984,0.00061024950000000038,0.00061522249999999997,0.00061676999999999999,0.0006174885999999999,0.00062066839999999981,0.00062102290000000003,0.00062169663636363651,0.00062181880000000017,0.00062593449999999982,0.00062857950000000016,0.00062959759999999996,0.00062964569999999999,0.00063434819999999971,0.00063984240000000019],"15":[2.0150000000000002e-08,2.0179999999999999e-08,2.0179999999999999e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0190000000000001e-08,2.0200000000000002e-08,2.1129999999999998e-08,2.1129999999999998e-08,2.1129999999999998e-08,2.1139999999999999e-08,2.215e-08,2.215e-08],"13312":[1.5867750000000001e-05,1.5870666666666667e-05,1.5871000000000001e-05,1.5888666666666666e-05,1.5934999999999999e-05,1.6324910000000001e-05,1.6352149999999999e-05,1.637227e-05,1.6394650000000001e-05,1.646041e-05,1.6487e-05,1.6489589041095889e-05,1.6495979999999998e-05,1.6501459459459459e-05,1.6575374999999999e-05,1.6603e-05,1.6612139999999999e-05,1.6699369999999999e-05,1.702601e-05,1.7362300000000001e-05],"4980736":[0.062410362499999983,0.062425272500000004,0.06260639799999998,0.062770394500000021,0.063017036999999998,0.063063275999999974,0.063076205499999996,0.063100004500000001,0.063402826999999967,0.063436423500000033,0.063524459000000005,0.063559205000000021,0.063627191499999999,0.063677880000000034,0.063679444000000002,0.063708560999999997,0.063825594999999999,0.06413925450000002,0.06430714999999998,0.064812079499999967],"118784":[0.0002838460000000002,0.00028444600000000016,0.000284818,0.000285469,0.00029005109090909096,0.00029065704347826081,0.00029405291666666667,0.0002944914615384615,0.00029459478260869559,0.00029530481818181812,0.000296903,0.00029759900000000006,0.00029770166666666663,0.00029900499999999987,0.00029917345454545446,0.00030262370000000004,0.00030304050000000009,0.00030310250000000003,0.00030683009090909087,0.00030856550000000002],"51200":[6.9739000000000004e-05,6.9961000000000003e-05,7.1752e-05,7.2992999999999997e-05,7.3062499999999994e-05,7.3359029411764704e-05,7.3709179999999994e-05,7.3799735294117642e-05,7.3840700000000006e-05,7.4712779999999999e-05,7.4884064516129022e-05,7.5523878787878785e-05,7.654803333333334e-05,7.675970000000001e-05,7.6851916666666672e-05,7.6960275862068955e-05,7.701191666666667e-05,7.9128479999999998e-05,8.0176781249999995e-05,8.2479649999999999e-05],"16":[2.1080000000000001e-08,2.1080000000000001e-08,2.1080000000000001e-08,2.1080000000000001e-08,2.1080000000000001e-08,2.1080000000000001e-08,2.1089999999999999e-08,2.1089999999999999e-08,2.1089999999999999e-08,2.1089999999999999e-08,2.1110000000000002e-08,2.206e-08,2.206e-08,2.206e-08,2.2069999999999998e-08,2.2069999999999998e-08,2.2069999999999998e-08,2.2069999999999998e-08,2.4930000000000002e-08,2.5059999999999997e-08],"21":[2.6819999999999998e-08,2.6829999999999999e-08,2.6850000000000002e-08,2.6850000000000002e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6860000000000004e-08,2.6989999999999999e-08,2.8109999999999998e-08,2.8109999999999998e-08,2.8109999999999998e-08,2.8109999999999998e-08,2.8130000000000001e-08,3.6529999999999997e-08],"917504":[0.0040807830000000002,0.0041066590000000004,0.004177442,0.0042040610000000003,0.0042487840000000002,0.0042532169999999984,0.0043537590000000004,0.0043652479999999978,0.004366867,0.0043701950000000003,0.0044466160000000022,0.0044825199999999985,0.0044941149999999999,0.004497493,0.0045163460000000001,0.0045573220000000017,0.0045830789999999977,0.004591815,0.0046720190000000012,0.0046782840000000004],"22":[2.775e-08,2.775e-08,2.775e-08,2.775e-08,2.775e-08,2.775e-08,2.775e-08,2.775e-08,2.7760000000000002e-08,2.9040000000000001e-08,2.9040000000000001e-08,2.9050000000000002e-08,2.908e-08,2.9299999999999998e-08,2.936e-08,2.9419999999999998e-08,3.0070000000000004e-08,3.065e-08,3.1609999999999997e-08,3.1920000000000004e-08],"4864":[5.6921600000000001e-06,5.69435e-06,5.6968000000000002e-06,5.6974800000000004e-06,5.7026899999999998e-06,5.7054600000000004e-06,5.7057799999999999e-06,5.7117400000000001e-06,5.71669e-06,5.7325800000000003e-06,5.7385600000000002e-06,5.7439800000000007e-06,5.7473900000000004e-06,5.7656700000000001e-06,5.7678299999999996e-06,5.8390099999999993e-06,5.95326e-06,6.0066199999999999e-06,6.0103900000000002e-06,6.2015499999999991e-06],"17":[2.2400000000000002e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2419999999999998e-08,2.2419999999999998e-08,2.2419999999999998e-08,2.3420000000000001e-08,2.344e-08,2.3450000000000002e-08,2.3450000000000002e-08,2.3450000000000002e-08,2.3450000000000002e-08,2.3470000000000001e-08,2.3520000000000001e-08,2.3750000000000001e-08,2.4619999999999998e-08],"14848":[1.7727142857142858e-05,1.7739333333333335e-05,1.7743076923076923e-05,1.7776999999999999e-05,1.7838000000000001e-05,1.7940000000000001e-05,1.8301999999999999e-05,1.8309999999999999e-05,1.833495e-05,1.8352999999999999e-05,1.8455689999999999e-05,1.8488599999999998e-05,1.8497469999999998e-05,1.8562210526315788e-05,1.8567469999999999e-05,1.8578019999999999e-05,1.858671e-05,1.867849e-05,1.9478530000000002e-05,2.139606779661017e-05],"23":[2.9050000000000002e-08,2.908e-08,2.908e-08,2.908e-08,2.908e-08,2.908e-08,2.908e-08,2.9090000000000001e-08,2.9090000000000001e-08,2.9090000000000001e-08,2.9090000000000001e-08,2.9100000000000002e-08,2.9179999999999997e-08,3.044e-08,3.044e-08,3.044e-08,3.0449999999999998e-08,3.1580000000000002e-08,3.194e-08,3.414e-08],"786432":[0.003146799,0.0031769249999999984,0.0031968829999999998,0.0032027539999999999,0.0032593730000000007,0.0032689669999999998,0.0032726140000000001,0.0032774419999999998,0.003300805,0.0033060559999999995,0.0033080430000000001,0.0033341400000000006,0.0033649579999999999,0.00338536,0.0034077560000000001,0.0034214189999999998,0.0035018250000000001,0.0035071429999999999,0.0036815150000000007,0.0036948409999999986],"18":[2.33e-08,2.33e-08,2.33e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.3309999999999998e-08,2.4389999999999999e-08,2.4389999999999999e-08,2.4389999999999999e-08,2.4389999999999999e-08,2.44e-08],"1638400":[0.015040675,0.0151328335,0.015135029999999999,0.015235625499999999,0.015345891,0.0153990315,0.0154879545,0.015655747000000001,0.015748687499999994,0.015788402999999999,0.015792372500000006,0.0158310415,0.015851166,0.015853930499999995,0.0158589245,0.016020242000000001,0.0160533985,0.016332706499999999,0.017540624999999994,0.01859626],"7864320":[0.10179322800000001,0.10197384799999998,0.10203298700000002,0.1021892955,0.10219763549999999,0.10239384999999999,0.102402006,0.10250495,0.10257754550000001,0.102730535,0.102871333,0.10290431,0.103283101,0.10334151549999999,0.103369422,0.10360528350000001,0.103970568,0.104126914,0.1041475365,0.1043965555],"24":[2.9969999999999996e-08,2.9969999999999996e-08,2.9969999999999996e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9980000000000001e-08,2.9989999999999999e-08,3.1370000000000002e-08,3.138e-08,3.2409999999999997e-08,3.2749999999999999e-08,3.292e-08,3.299e-08,3.4389999999999999e-08,3.491e-08],"14155776":[0.19325172600000001,0.19440267750000001,0.19485706,0.19509617750000002,0.19539184549999999,0.19548510499999999,0.19549991799999999,0.19566785599999997,0.19660432,0.19667127350000002,0.19672766050000001,0.19701095099999999,0.19706382450000001,0.19719625299999999,0.19720347899999999,0.1974186875,0.19762995850000001,0.19772805049999997,0.19904513300000001,0.204613134],"19":[2.463e-08,2.463e-08,2.463e-08,2.463e-08,2.463e-08,2.463e-08,2.463e-08,2.463e-08,2.4640000000000001e-08,2.4640000000000001e-08,2.4640000000000001e-08,2.4640000000000001e-08,2.4640000000000001e-08,2.578e-08,2.578e-08,2.578e-08,2.578e-08,2.578e-08,2.5790000000000001e-08,2.817e-08],"30":[3.6640000000000003e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6650000000000001e-08,3.6669999999999997e-08,3.8349999999999996e-08,3.8349999999999996e-08,3.8360000000000001e-08,3.8360000000000001e-08,3.8360000000000001e-08,3.9299999999999995e-08,4.0000000000000001e-08,4.0219999999999999e-08],"25":[3.1259999999999997e-08,3.1270000000000001e-08,3.1270000000000001e-08,3.1289999999999998e-08,3.1300000000000002e-08,3.1300000000000002e-08,3.1300000000000002e-08,3.131e-08,3.131e-08,3.131e-08,3.131e-08,3.131e-08,3.131e-08,3.1319999999999999e-08,3.2760000000000004e-08,3.2770000000000002e-08,3.2770000000000002e-08,3.3979999999999997e-08,3.4709999999999998e-08,3.6699999999999998e-08],"31":[3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.7969999999999995e-08,3.798e-08,3.798e-08,3.798e-08,3.798e-08,3.798e-08,3.7989999999999998e-08,3.9740000000000004e-08,3.9740000000000004e-08,4.0000000000000001e-08,4.168e-08,4.4970000000000005e-08],"1280":[1.4415000000000001e-06,1.4417699999999999e-06,1.4427200000000001e-06,1.4445699999999999e-06,1.4463799999999999e-06,1.4477000000000001e-06,1.44854e-06,1.44883e-06,1.4492199999999999e-06,1.44972e-06,1.4511299999999999e-06,1.45154e-06,1.4520200000000002e-06,1.4534600000000001e-06,1.4563900000000001e-06,1.4575999999999998e-06,1.4576100000000001e-06,1.45892e-06,1.59154e-06,1.7187300000000001e-06],"26":[3.2189999999999999e-08,3.2189999999999999e-08,3.2189999999999999e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.2200000000000004e-08,3.3659999999999998e-08,3.3699999999999997e-08,3.508e-08,3.5310000000000003e-08,3.543e-08,3.8099999999999997e-08],"3932160":[0.04813386300000002,0.048483732999999994,0.048585091499999997,0.048645249999999987,0.048781170999999991,0.04880078199999998,0.048981439499999987,0.049009415000000001,0.04908086099999999,0.049109854000000001,0.049149224000000019,0.049173424,0.049356841000000012,0.049375581999999973,0.049449816000000001,0.049486034999999984,0.049546818000000013,0.049814599000000001,0.050176489000000025,0.050841475999999997],"2432":[2.7549399999999999e-06,2.7580800000000002e-06,2.7591999999999998e-06,2.7615900000000001e-06,2.7628699999999999e-06,2.76441e-06,2.7647400000000002e-06,2.7676200000000001e-06,2.7694599999999997e-06,2.7702000000000002e-06,2.77656e-06,2.7768700000000001e-06,2.7790800000000001e-06,2.7842900000000003e-06,2.7904500000000001e-06,2.7916399999999999e-06,2.79729e-06,2.8806699999999998e-06,2.8914099999999998e-06,2.8959800000000002e-06],"32":[3.8829999999999998e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8870000000000003e-08,3.8880000000000001e-08,3.8880000000000001e-08,3.8890000000000006e-08,4.0679999999999998e-08,4.0800000000000001e-08,4.2660000000000006e-08],"27":[3.3519999999999998e-08,3.3519999999999998e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3529999999999997e-08,3.3540000000000001e-08,3.442e-08,3.5090000000000005e-08,3.5090000000000005e-08,3.5090000000000005e-08,3.5090000000000005e-08,3.5299999999999998e-08,3.6040000000000004e-08,3.6770000000000004e-08,3.763e-08],"409600":[0.0012461200000000003,0.0012630460000000001,0.0013118070000000003,0.0013165214999999999,0.0013173640000000001,0.00131875,0.001322068,0.001331591,0.001336526,0.00134341,0.0013445029999999999,0.0013460395,0.001346119,0.0013550000000000001,0.0013567645000000001,0.0013579495,0.0013628310000000005,0.0013635890000000001,0.0014296212499999999,0.0016853460000000003]}},{"title":"Array subscript get, random offsets","results":{"28":[4.8550000000000001e-08,4.8590000000000007e-08,4.8599999999999998e-08,4.8609999999999997e-08,4.8709999999999997e-08,4.8709999999999997e-08,4.8740000000000005e-08,4.8769999999999999e-08,4.88e-08,4.8860000000000002e-08,4.887e-08,4.9119999999999999e-08,4.9219999999999993e-08,4.9959999999999999e-08,5.093e-08,5.0960000000000001e-08,5.1039999999999999e-08,5.264e-08,5.3349999999999998e-08,5.3499999999999996e-08],"34":[5.662e-08,5.8980000000000003e-08,5.9020000000000002e-08,5.9240000000000006e-08,5.9240000000000006e-08,5.9240000000000006e-08,5.9300000000000002e-08,5.9340000000000001e-08,5.9399999999999996e-08,5.9460000000000004e-08,5.9470000000000002e-08,5.9479999999999994e-08,5.9510000000000001e-08,5.9610000000000002e-08,5.962e-08,6.0380000000000002e-08,6.1029999999999998e-08,6.1879999999999996e-08,6.5370000000000009e-08,6.5449999999999994e-08],"29":[4.9530000000000001e-08,4.9690000000000004e-08,4.992e-08,4.9930000000000004e-08,4.9959999999999999e-08,4.9980000000000002e-08,4.9980000000000002e-08,4.9989898989898997e-08,4.999e-08,4.999e-08,5.0019999999999994e-08,5.0689999999999999e-08,5.1450000000000001e-08,5.2310000000000003e-08,5.2320000000000001e-08,5.2320000000000001e-08,5.2340000000000004e-08,5.2349999999999996e-08,5.4119999999999998e-08,5.4849999999999998e-08],"40":[6.3219999999999993e-08,6.3320000000000001e-08,6.3430000000000006e-08,6.3829999999999997e-08,6.3980000000000008e-08,6.6220000000000007e-08,6.6450000000000003e-08,6.6520000000000003e-08,6.6640000000000006e-08,6.6649999999999991e-08,6.6740000000000001e-08,6.6790000000000004e-08,6.6919999999999993e-08,6.6969999999999997e-08,6.6969999999999997e-08,6.6969999999999997e-08,6.6979999999999995e-08,6.7050000000000008e-08,6.7139999999999991e-08,7.107e-08],"17408":[2.1285500000000001e-05,2.1314222222222225e-05,2.132716129032258e-05,2.1382e-05,2.1684000000000001e-05,2.1758000000000001e-05,2.1846999999999999e-05,2.2048740000000001e-05,2.217311e-05,2.2214069999999999e-05,2.2250080000000001e-05,2.2288790000000002e-05,2.2294239999999997e-05,2.2311e-05,2.2357999999999998e-05,2.2452560000000003e-05,2.245324e-05,2.250633e-05,2.2608979999999998e-05,2.350941e-05],"1472":[1.66267e-06,1.66326e-06,1.6639500000000002e-06,1.6640000000000001e-06,1.6650700000000002e-06,1.6658999999999998e-06,1.6659100000000001e-06,1.6677000000000001e-06,1.6681299999999999e-06,1.6681500000000001e-06,1.6687399999999998e-06,1.6689499999999999e-06,1.6694799999999999e-06,1.6700699999999999e-06,1.6704999999999999e-06,1.6712699999999998e-06,1.674e-06,1.6753100000000001e-06,1.6757100000000002e-06,1.7510599999999998e-06],"112":[1.4135000000000001e-07,1.4151e-07,1.4252000000000001e-07,1.4258e-07,1.4511999999999999e-07,1.4608e-07,1.4887999999999999e-07,1.4899000000000001e-07,1.4961e-07,1.4968e-07,1.4987e-07,1.4999999999999999e-07,1.5068999999999998e-07,1.5081000000000001e-07,1.5099e-07,1.5099999999999999e-07,1.5120999999999999e-07,1.525e-07,1.5283e-07,1.5284000000000001e-07],"1376256":[0.0098555419999999967,0.010030790000000001,0.010134285999999999,0.010168638000000001,0.0102450115,0.010353112000000001,0.010401723999999998,0.010407419999999997,0.010430657499999999,0.010447356500000001,0.0105216115,0.010554530500000001,0.010565383999999997,0.010706166,0.010707356000000001,0.0108233555,0.010875605,0.0109166525,0.011043944,0.013267076000000003],"5242880":[0.060823919500000004,0.060941045499999992,0.060948624999999999,0.0609676865,0.060989147500000021,0.06104048849999999,0.061290844500000018,0.061427105999999988,0.061556742000000012,0.061589248999999999,0.061590171500000027,0.061657779999999975,0.061718696500000003,0.061746460999999996,0.061789227000000002,0.061857611,0.062305578,0.06245692899999998,0.0629155775,0.062925813999999969],"36":[5.6930000000000001e-08,5.753e-08,5.7550000000000002e-08,5.7930000000000003e-08,5.8430000000000001e-08,6.0580000000000004e-08,6.0839999999999994e-08,6.088e-08,6.0940000000000002e-08,6.1179999999999996e-08,6.1469999999999994e-08,6.1710000000000001e-08,6.1710000000000001e-08,6.1830000000000005e-08,6.346e-08,6.3510000000000004e-08,6.4480000000000006e-08,6.6790000000000004e-08,6.7109999999999997e-08,6.7360000000000002e-08],"42":[6.6150000000000007e-08,6.6259999999999999e-08,6.6300000000000005e-08,6.6370000000000005e-08,6.9009999999999994e-08,6.9090000000000005e-08,6.9139999999999996e-08,6.9160000000000005e-08,6.9219999999999994e-08,6.9329999999999999e-08,6.9329999999999999e-08,6.9530000000000001e-08,6.9600000000000001e-08,6.9979999999999995e-08,7.0489999999999991e-08,7.1319999999999993e-08,7.1400000000000004e-08,7.1550000000000002e-08,7.1779999999999998e-08,7.4089999999999997e-08],"11534336":[0.14324881149999999,0.143384707,0.14358805949999998,0.1438022065,0.14411488249999999,0.14420785850000001,0.14448214250000002,0.144536844,0.14500426999999999,0.14506270600000001,0.14537452100000001,0.14546995500000001,0.1457202165,0.14589630149999999,0.14605954900000001,0.1462975655,0.14645783499999998,0.146529933,0.14670424900000001,0.14698093949999999],"114688":[0.00024909219999999998,0.00025681879999999991,0.00025797466666666665,0.00025945200000000002,0.00026188933333333328,0.000262876,0.00026307854054054058,0.00026360673529411764,0.0002636561666666666,0.00026407266666666666,0.00026535231999999997,0.0002655840333333333,0.0002673264,0.00026783777142857146,0.00026929849999999991,0.0002700706363636364,0.00027081334285714281,0.00027434973333333331,0.00027681892857142848,0.00029707654545454553],"144":[1.7807999999999999e-07,1.7917000000000001e-07,1.7966000000000001e-07,1.7989999999999999e-07,1.8022999999999999e-07,1.8533000000000001e-07,1.8572e-07,1.8589999999999999e-07,1.8626999999999999e-07,1.8706999999999999e-07,1.8714000000000002e-07,1.8719000000000002e-07,1.8806e-07,1.8853999999999999e-07,1.8873999999999998e-07,1.8887e-07,1.8904e-07,1.8927e-07,1.8971e-07,1.9012000000000001e-07],"38":[6.1589999999999998e-08,6.3209999999999995e-08,6.3800000000000002e-08,6.3860000000000004e-08,6.388e-08,6.4770000000000004e-08,6.5030000000000007e-08,6.5100000000000007e-08,6.511999999999999e-08,6.514e-08,6.5159999999999996e-08,6.5250000000000005e-08,6.5260000000000003e-08,6.5309999999999994e-08,6.5459999999999992e-08,6.7000000000000004e-08,6.7630000000000004e-08,6.8e-08,6.9269999999999998e-08,7.1340000000000002e-08],"240":[2.8659000000000003e-07,2.8675e-07,2.8701999999999999e-07,2.8705000000000002e-07,2.8783e-07,2.8998000000000001e-07,2.9082000000000001e-07,2.9094999999999999e-07,2.9209999999999998e-07,2.9341999999999999e-07,2.9362e-07,2.9424999999999998e-07,2.9447000000000002e-07,2.9478e-07,2.9486999999999999e-07,2.9534374999999999e-07,2.9728999999999998e-07,3.0558000000000001e-07,3.0624999999999998e-07,3.1860999999999997e-07],"9216":[1.1046999999999999e-05,1.1101137931034483e-05,1.1167e-05,1.1215e-05,1.1367890000000001e-05,1.1382e-05,1.1386949999999999e-05,1.1390689999999999e-05,1.1403410000000001e-05,1.1405110000000001e-05,1.1406319999999999e-05,1.141801e-05,1.1516619999999999e-05,1.1613999999999999e-05,1.1646e-05,1.1676939999999999e-05,1.1892000000000001e-05,1.1976709999999999e-05,1.2603309999999999e-05,1.2697959999999998e-05],"44":[6.7179999999999997e-08,6.7379999999999999e-08,6.7819999999999995e-08,6.8029999999999994e-08,6.863e-08,7.0319999999999997e-08,7.0469999999999995e-08,7.0790000000000001e-08,7.1369999999999997e-08,7.163e-08,7.1639999999999998e-08,7.1760000000000002e-08,7.2010000000000008e-08,7.2150000000000007e-08,7.2790000000000005e-08,7.2860000000000005e-08,7.3469999999999995e-08,7.3720000000000001e-08,7.4859999999999997e-08,7.8159999999999993e-08],"1664":[1.8684800000000001e-06,1.8766900000000001e-06,1.8798099999999998e-06,1.8798900000000001e-06,1.8799600000000002e-06,1.8811399999999999e-06,1.88251e-06,1.8830400000000001e-06,1.8831499999999999e-06,1.8837399999999999e-06,1.88408e-06,1.8845400000000002e-06,1.8854599999999999e-06,1.8865099999999999e-06,1.8869099999999999e-06,1.8889500000000001e-06,1.8900199999999998e-06,1.8907900000000001e-06,2.06179e-06,2.22097e-06],"196608":[0.00052342549999999984,0.00052465133333333349,0.00052503550000000004,0.00052792900000000001,0.00053650400000000004,0.0005374823333333332,0.00053816242857142858,0.00054410366666666674,0.00054501061538461519,0.00054626407692307693,0.00054945593750000017,0.00055114299999999982,0.00055280792307692305,0.0005540270833333333,0.00055489593333333338,0.00055992199999999981,0.00056083414285714307,0.00056182884615384621,0.0005754864545454545,0.00057948519999999988],"155648":[0.00038827100000000004,0.00039524066666666669,0.00039729399999999997,0.00040348736842105263,0.00040405775000000008,0.00040703787499999999,0.00040893611111111102,0.00041143349999999996,0.00041349760869565196,0.00041402174999999997,0.00041618299999999998,0.00041621273913043492,0.00041847078947368412,0.00041853958823529402,0.00041949113636363634,0.00042009400000000009,0.00042317287500000001,0.00042394130434782607,0.00043557892307692305,0.00043778999999999997],"2816":[3.1835700000000003e-06,3.1844399999999998e-06,3.1862999999999999e-06,3.18684e-06,3.1903500000000003e-06,3.1905000000000002e-06,3.1925699999999997e-06,3.1927200000000001e-06,3.1928000000000002e-06,3.32979e-06,3.3326399999999999e-06,3.3388299999999997e-06,3.3446600000000001e-06,3.4501799999999999e-06,3.49425e-06,3.4943700000000004e-06,3.4943799999999998e-06,3.4951600000000002e-06,3.7601399999999996e-06,3.7664799999999997e-06],"50":[7.3319999999999997e-08,7.3370000000000001e-08,7.3710000000000003e-08,7.3729999999999999e-08,7.4019999999999997e-08,7.4259999999999991e-08,7.5759999999999998e-08,7.7400000000000005e-08,7.7610000000000005e-08,7.7910000000000001e-08,7.8010000000000008e-08,7.8170000000000004e-08,7.8269999999999999e-08,7.8639999999999995e-08,7.9259999999999996e-08,7.9379999999999987e-08,7.9809999999999998e-08,7.9840000000000006e-08,7.9969999999999994e-08,8.65e-08],"2359296":[0.0240991025,0.024107614999999992,0.024111251,0.024145613999999992,0.024166352999999995,0.0243076695,0.024347415000000008,0.024350180499999995,0.0243637235,0.024379142999999999,0.024404613000000016,0.024447482499999999,0.024464127499999998,0.024506254999999998,0.02462580100000001,0.0246476625,0.024732875999999994,0.024844645499999991,0.025518285000000002,0.026944892000000008],"46":[7.3179999999999998e-08,7.3659999999999999e-08,7.3749999999999995e-08,7.4000000000000001e-08,7.4509999999999997e-08,7.4560000000000001e-08,7.4589999999999995e-08,7.4639999999999999e-08,7.5030000000000004e-08,7.5079999999999995e-08,7.5100000000000004e-08,7.5279999999999996e-08,7.5489999999999996e-08,7.5629999999999996e-08,7.5629999999999996e-08,7.5639999999999994e-08,7.5650000000000006e-08,7.5670000000000002e-08,7.9249999999999998e-08,8.2319999999999999e-08],"176":[2.1297999999999999e-07,2.1422e-07,2.1437999999999999e-07,2.1462e-07,2.1521000000000001e-07,2.1586e-07,2.1838999999999999e-07,2.2075000000000001e-07,2.2099e-07,2.2191000000000001e-07,2.2422000000000001e-07,2.2452e-07,2.2458000000000002e-07,2.2468e-07,2.2484999999999998e-07,2.2490000000000001e-07,2.2916e-07,2.3118999999999999e-07,2.3377000000000001e-07,2.4562e-07],"52":[7.7309999999999995e-08,7.8880000000000002e-08,8.019999999999999e-08,8.0499999999999986e-08,8.0579999999999998e-08,8.0660000000000009e-08,8.1349999999999997e-08,8.1380000000000005e-08,8.1470000000000001e-08,8.1510000000000007e-08,8.1629999999999997e-08,8.1950000000000003e-08,8.1999999999999993e-08,8.2010000000000004e-08,8.2170000000000001e-08,8.3669999999999994e-08,8.6270000000000004e-08,8.6619999999999991e-08,8.8550000000000009e-08,9.4240000000000002e-08],"272":[3.2125999999999995e-07,3.2622000000000002e-07,3.2645000000000001e-07,3.2742e-07,3.2765999999999996e-07,3.2808000000000001e-07,3.2830999999999995e-07,3.2963999999999998e-07,3.3006000000000003e-07,3.3158999999999997e-07,3.3235999999999999e-07,3.3304999999999998e-07,3.3319999999999999e-07,3.3451999999999995e-07,3.3850000000000002e-07,3.4181999999999997e-07,3.4431000000000004e-07,3.4574999999999998e-07,3.5512000000000002e-07,3.8519000000000002e-07],"116":[1.4511999999999999e-07,1.458e-07,1.4602000000000001e-07,1.4604999999999999e-07,1.4649999999999999e-07,1.4684999999999999e-07,1.4858999999999998e-07,1.4892000000000001e-07,1.5134999999999999e-07,1.5214000000000001e-07,1.526e-07,1.5274e-07,1.5321999999999999e-07,1.5498e-07,1.5509999999999998e-07,1.5515000000000001e-07,1.5526999999999999e-07,1.5545000000000001e-07,1.5658000000000002e-07,1.5827e-07],"47104":[6.3146999999999997e-05,6.5560000000000002e-05,6.6089999999999999e-05,6.6377174603174602e-05,6.6415999999999996e-05,6.6553571428571437e-05,6.6735000000000004e-05,6.6882250000000005e-05,6.7266319999999998e-05,6.7324589999999995e-05,6.7658950000000007e-05,6.7848730000000002e-05,6.8128822222222215e-05,6.8268913580246912e-05,6.8792230000000004e-05,6.9028259999999995e-05,6.9385359999999999e-05,6.9744292682926833e-05,7.2352040000000004e-05,7.4496514285714288e-05],"6912":[8.2236363636363642e-06,8.2468899999999999e-06,8.35848e-06,8.3603199999999999e-06,8.3772199999999997e-06,8.3899999999999993e-06,8.3943500000000004e-06,8.4113399999999997e-06,8.4385099999999996e-06,8.4419999999999998e-06,8.4664099999999998e-06,8.4765400000000003e-06,8.4839000000000002e-06,8.4859999999999997e-06,8.5151400000000003e-06,8.572029999999999e-06,8.5920000000000001e-06,8.6045299999999991e-06,8.6091599999999994e-06,8.9858499999999997e-06],"1856":[2.0903699999999999e-06,2.0908899999999999e-06,2.0912599999999999e-06,2.0917000000000002e-06,2.09292e-06,2.09387e-06,2.0939899999999999e-06,2.0942100000000001e-06,2.09505e-06,2.0956599999999999e-06,2.0964299999999999e-06,2.0965000000000002e-06,2.0979299999999998e-06,2.0982800000000002e-06,2.0992600000000001e-06,2.10303e-06,2.1043900000000003e-06,2.1928899999999999e-06,2.1994999999999999e-06,2.2912000000000002e-06],"48":[7.1579999999999996e-08,7.1970000000000002e-08,7.2040000000000002e-08,7.2160000000000006e-08,7.2409999999999998e-08,7.3249999999999997e-08,7.4789999999999997e-08,7.484e-08,7.5209999999999997e-08,7.5549999999999998e-08,7.5569999999999994e-08,7.5660000000000004e-08,7.6830000000000007e-08,7.6830000000000007e-08,7.7589999999999995e-08,7.7680000000000005e-08,7.7690000000000003e-08,8.1120000000000001e-08,8.1380000000000005e-08,8.1820000000000001e-08],"2097152":[0.020311969000000006,0.020333036499999995,0.020412092,0.020571858999999998,0.020636580999999994,0.020636728,0.0207111725,0.020728622999999995,0.020760576499999992,0.020761824999999998,0.020903251000000005,0.021114517999999999,0.021272292999999998,0.021302281999999999,0.021329031000000002,0.021386314999999989,0.021816235,0.021933309000000005,0.021999953499999999,0.023170597000000008],"54":[7.7840000000000001e-08,7.875e-08,7.8769999999999997e-08,7.8930000000000006e-08,7.8979999999999997e-08,7.917e-08,7.9349999999999993e-08,7.9879999999999998e-08,8.2700000000000006e-08,8.2759999999999995e-08,8.2900000000000008e-08,8.2970000000000008e-08,8.3210000000000002e-08,8.3540000000000006e-08,8.3939999999999996e-08,8.4289999999999996e-08,8.4379999999999992e-08,8.5010000000000005e-08,8.8480000000000009e-08,9.0790000000000008e-08],"2031616":[0.019426330999999998,0.019605512499999998,0.019661881999999999,0.019706527999999994,0.019745607000000002,0.019802574999999999,0.019830206499999992,0.019850903499999996,0.019901560499999998,0.0199085965,0.019929109499999983,0.019937343,0.020003516999999998,0.020093208999999994,0.020292845,0.020393843499999998,0.020451876500000001,0.020801826999999995,0.021081478000000035,0.021923232500000008],"43008":[5.6990000000000002e-05,5.7015500000000003e-05,5.9547881355932204e-05,5.9608000000000003e-05,5.9700000000000001e-05,5.9771000000000001e-05,6.0647233333333338e-05,6.0655535714285711e-05,6.0697240000000002e-05,6.0851400000000005e-05,6.0926585365853655e-05,6.1007219780219781e-05,6.1065666666666667e-05,6.1079709999999998e-05,6.126553e-05,6.2102149999999993e-05,6.21195e-05,6.2314889999999995e-05,6.2457396551724145e-05,6.3479482352941179e-05],"60":[8.8170000000000001e-08,8.8179999999999986e-08,8.8519999999999988e-08,8.8769999999999994e-08,8.9299999999999986e-08,8.9959999999999993e-08,9.0019999999999995e-08,9.0040000000000004e-08,9.0049999999999989e-08,9.0049999999999989e-08,9.0100000000000006e-08,9.034e-08,9.0350000000000012e-08,9.0459999999999991e-08,9.1160000000000004e-08,9.1980000000000007e-08,9.2180000000000009e-08,9.4150000000000006e-08,9.4409999999999996e-08,9.5630000000000003e-08],"30720":[3.8471666666666666e-05,3.8670000000000001e-05,3.8832499999999998e-05,4.0275629999999993e-05,4.0282583333333329e-05,4.0462e-05,4.0543999999999997e-05,4.0756689999999995e-05,4.0860420000000001e-05,4.0936750000000001e-05,4.1889259999999996e-05,4.1914659999999998e-05,4.2432930000000007e-05,4.2449030000000002e-05,4.2453185185185181e-05,4.250044e-05,4.2533000000000001e-05,4.3673210000000001e-05,4.4221588235294115e-05,4.541425e-05],"56":[8.0660000000000009e-08,8.3469999999999992e-08,8.3659999999999996e-08,8.4999999999999994e-08,8.5150000000000005e-08,8.5949999999999999e-08,8.5969999999999995e-08,8.6119999999999993e-08,8.6190000000000006e-08,8.6549999999999991e-08,8.6649999999999998e-08,8.6670000000000008e-08,8.7499999999999996e-08,8.8660000000000001e-08,8.8739999999999999e-08,9.0470000000000002e-08,9.0559999999999998e-08,9.0670000000000004e-08,9.4779999999999992e-08,9.4939999999999989e-08],"62":[8.7110000000000004e-08,9.1330000000000011e-08,9.16e-08,9.1860000000000003e-08,9.1910000000000007e-08,9.1959999999999998e-08,9.2000000000000003e-08,9.2010000000000001e-08,9.2119999999999994e-08,9.2129999999999992e-08,9.2199999999999992e-08,9.2229999999999999e-08,9.2390000000000009e-08,9.2429999999999988e-08,9.2459999999999995e-08,9.2579999999999999e-08,9.273000000000001e-08,9.2750000000000007e-08,9.6180000000000005e-08,1.0356999999999999e-07],"58":[8.396999999999999e-08,8.3980000000000002e-08,8.4160000000000007e-08,8.6200000000000004e-08,8.6470000000000006e-08,8.6659999999999996e-08,8.8389999999999999e-08,8.8449999999999988e-08,8.8480000000000009e-08,8.8489999999999994e-08,8.8500000000000005e-08,8.8519999999999988e-08,8.885999999999999e-08,8.8969999999999995e-08,8.9129999999999991e-08,9.0950000000000004e-08,9.2399999999999994e-08,9.3070000000000012e-08,9.6760000000000001e-08,9.6930000000000008e-08],"3014656":[0.032538071999999987,0.032570919500000003,0.032596942499999997,0.032639231999999983,0.032645005499999998,0.032740894500000006,0.0327700015,0.032799825999999983,0.032837184499999998,0.032899441000000008,0.032905820499999988,0.032912807000000002,0.033049205999999998,0.033125353000000017,0.033293776499999997,0.033303528999999985,0.033328142000000005,0.033401712,0.033959768500000001,0.033966554500000017],"64":[9.0180000000000004e-08,9.3190000000000003e-08,9.364000000000001e-08,9.3649999999999995e-08,9.3690000000000001e-08,9.3690000000000001e-08,9.3699999999999999e-08,9.371000000000001e-08,9.3719999999999995e-08,9.3740000000000004e-08,9.3940000000000006e-08,9.418e-08,9.488e-08,9.4889999999999998e-08,9.5410000000000005e-08,9.6199999999999988e-08,9.795e-08,9.8209999999999991e-08,9.8260000000000008e-08,1.0020000000000001e-07],"8388608":[0.1010014285,0.101350735,0.1015478865,0.101561492,0.10156187500000002,0.10175327899999997,0.101827164,0.10203806,0.102078406,0.102112429,0.102273344,0.10232872950000001,0.10250980599999999,0.10259370449999999,0.1026416225,0.10265025700000002,0.10266950399999999,0.102691037,0.102729379,0.103194697],"29696":[3.7413999999999998e-05,3.7823e-05,3.8868282608695649e-05,3.8869219999999998e-05,3.8924049999999999e-05,3.8957e-05,3.8971999999999999e-05,3.9079999999999999e-05,3.908339534883721e-05,3.9198759999999999e-05,3.9217619999999997e-05,3.9295140000000005e-05,3.9384259999999999e-05,3.9759291666666666e-05,3.9876369999999994e-05,4.0525409999999997e-05,4.0543190476190479e-05,4.0559699999999997e-05,4.1087999999999997e-05,4.1183744897959188e-05],"216":[2.5783000000000003e-07,2.5788000000000003e-07,2.6268999999999998e-07,2.6397e-07,2.6627999999999997e-07,2.6670000000000003e-07,2.6715000000000001e-07,2.6728e-07,2.6778999999999999e-07,2.6811000000000004e-07,2.6871000000000003e-07,2.6930000000000001e-07,2.6940000000000002e-07,2.6958333333333333e-07,2.6982999999999998e-07,2.7002999999999999e-07,2.7039999999999999e-07,2.7656999999999999e-07,2.7911999999999997e-07,2.9382000000000002e-07],"106496":[0.00021155599999999998,0.00021877784210526328,0.000220769,0.00022638138888888886,0.00022759197435897431,0.00023383900000000006,0.00023478981081081078,0.00023541033333333337,0.00023732935294117647,0.0002375340000000001,0.00023778890909090903,0.00023800500000000006,0.00023812308108108111,0.0002404005,0.00024234818181818183,0.00024740600000000009,0.00024854864705882353,0.00025054899999999998,0.00025119944444444437,0.000256665],"72":[9.6379999999999993e-08,9.8439999999999987e-08,9.9680000000000003e-08,1.0014e-07,1.0016e-07,1.0207000000000001e-07,1.0217000000000001e-07,1.0235e-07,1.0238999999999999e-07,1.0241e-07,1.0254e-07,1.0268e-07,1.0288000000000001e-07,1.0343000000000001e-07,1.0421e-07,1.0523999999999999e-07,1.0633e-07,1.0693999999999999e-07,1.1207e-07,1.1229000000000001e-07],"442368":[0.001343892,0.0013524715,0.00136474775,0.001375439,0.0013774970000000003,0.001380757,0.0013827004999999999,0.0013846787499999999,0.0013852605000000001,0.0013896125000000001,0.0013908245000000003,0.001399338,0.00140155475,0.00140314375,0.0014046425,0.0014056964999999999,0.0014126220000000001,0.0014145717499999999,0.0014505815,0.001475395],"147456":[0.00036345800000000004,0.0003688435,0.000371257,0.00037424533333333342,0.00037439900000000003,0.00037583233333333342,0.00038048000000000004,0.00038161499999999997,0.00038207139999999986,0.00038248490000000003,0.00038309180000000012,0.0003839933529411764,0.00038551062499999993,0.0003868919999999999,0.00039157324999999996,0.0003926612608695653,0.00039702550000000008,0.00039812449999999998,0.00040101199999999996,0.00040232620000000012],"4456448":[0.050804971500000004,0.050914163499999998,0.051091327499999985,0.051246469500000003,0.051342903999999988,0.051458092999999983,0.051493832999999989,0.051620852999999987,0.052055022000000006,0.052264999999999985,0.052307614000000002,0.052471321500000001,0.052721317500000017,0.0529817385,0.053806548499999975,0.053913740000000022,0.054090110000000004,0.054686095000000004,0.054690913000000022,0.058128242000000017],"63488":[9.0773999999999995e-05,9.1650545454545455e-05,9.1958000000000003e-05,9.4018642857142851e-05,9.4029085714285716e-05,9.4620711538461532e-05,9.4621573333333325e-05,9.5549925925925928e-05,9.5562649999999996e-05,9.5784111111111105e-05,9.5960189189189186e-05,9.6108884615384615e-05,9.6130246376811588e-05,9.6248645161290322e-05,9.6279485714285718e-05,9.6687027397260273e-05,9.9306410256410252e-05,0.00010040990909090911,0.00010290188,0.00011121829090909093],"38912":[5.3261999999999999e-05,5.3299333333333333e-05,5.3605249999999996e-05,5.37539e-05,5.3897940000000001e-05,5.4062980000000006e-05,5.4117490000000004e-05,5.4271691358024699e-05,5.4344434210526313e-05,5.4760900000000006e-05,5.4788691358024687e-05,5.4818065789473678e-05,5.4856929999999995e-05,5.5120630000000004e-05,5.5187737499999999e-05,5.5249009999999993e-05,5.5579269230769234e-05,5.5715660000000003e-05,5.6614973333333335e-05,5.9605969999999996e-05],"68":[9.125e-08,9.4860000000000004e-08,9.6639999999999997e-08,9.8619999999999992e-08,9.9e-08,9.9019999999999996e-08,9.9150000000000011e-08,9.935e-08,9.9400000000000003e-08,9.9410000000000001e-08,9.9420000000000013e-08,9.9429999999999998e-08,9.9459999999999992e-08,9.9509999999999996e-08,9.9550000000000001e-08,9.9660000000000007e-08,1.0081e-07,1.0197999999999999e-07,1.0355e-07,1.0412e-07],"188416":[0.00048970200000000017,0.00049978475000000001,0.00050878999999999996,0.00051160570588235294,0.00051392892307692314,0.00051537400000000008,0.00051785763636363652,0.00052292399999999981,0.00052354849999999994,0.00052366749999999997,0.00052859024999999987,0.00052983939999999997,0.00053057394117647075,0.0005338649999999999,0.00053996640000000004,0.00054005600000000002,0.00054058625000000021,0.0005428636470588235,0.00054377584615384624,0.00057027018750000001],"248":[2.9248999999999999e-07,2.9686999999999998e-07,2.9843000000000001e-07,2.9920999999999999e-07,2.9957000000000003e-07,3.0053000000000001e-07,3.0190000000000002e-07,3.0209000000000003e-07,3.0213999999999998e-07,3.0219999999999999e-07,3.0241999999999998e-07,3.0256999999999999e-07,3.0437000000000002e-07,3.0451000000000002e-07,3.0511999999999997e-07,3.1516000000000002e-07,3.1566999999999997e-07,3.1617e-07,3.1767999999999997e-07,3.1996000000000001e-07],"80":[1.0428e-07,1.0689e-07,1.0699000000000001e-07,1.0739e-07,1.0763e-07,1.0782999999999999e-07,1.1171e-07,1.1328000000000001e-07,1.1338e-07,1.1389999999999999e-07,1.1392999999999999e-07,1.1410999999999999e-07,1.1529999999999999e-07,1.1572000000000001e-07,1.1592e-07,1.1689999999999999e-07,1.1785e-07,1.2119000000000002e-07,1.2634000000000001e-07,1.2837999999999999e-07],"2560":[2.8790400000000001e-06,2.8852899999999999e-06,2.88626e-06,2.8870399999999999e-06,2.88781e-06,2.88804e-06,2.88904e-06,2.8895499999999997e-06,2.8896800000000003e-06,2.88985e-06,2.88996e-06,2.8913300000000001e-06,2.8915000000000002e-06,2.8921499999999999e-06,2.89249e-06,2.8930500000000002e-06,2.89476e-06,2.8952900000000002e-06,2.89688e-06,2.90099e-06],"34816":[4.4603e-05,4.469725e-05,4.6176940000000004e-05,4.6440780000000003e-05,4.66676e-05,4.6795777777777779e-05,4.6989539999999997e-05,4.7664139999999999e-05,4.8016020000000004e-05,4.8116089999999998e-05,4.8375279999999996e-05,4.8717250000000005e-05,4.8759249999999996e-05,4.8817749999999995e-05,4.8940999999999998e-05,4.8953333333333338e-05,4.9986220000000001e-05,5.0372790000000006e-05,5.0493159999999997e-05,5.4063949999999999e-05],"3712":[4.2490399999999997e-06,4.2497000000000002e-06,4.24971e-06,4.2533000000000004e-06,4.2534599999999998e-06,4.25505e-06,4.2559400000000005e-06,4.25626e-06,4.2572399999999999e-06,4.2580199999999994e-06,4.2594100000000001e-06,4.2602700000000001e-06,4.2613199999999999e-06,4.2706000000000002e-06,4.4538958333333332e-06,4.6689999999999997e-06,4.6690300000000001e-06,4.68098e-06,4.6816499999999995e-06,5.0360300000000001e-06],"3538944":[0.038924182500000001,0.0389875425,0.039010550999999997,0.039073472499999998,0.039274962499999996,0.039300175,0.039329801499999997,0.039353345500000012,0.03943744549999998,0.0395876135,0.039595539999999999,0.03961584600000001,0.039688346500000013,0.039699468000000002,0.039786592499999981,0.039829871499999996,0.039831126000000008,0.039966347999999999,0.03996843999999998,0.041788376499999988],"76":[1.0224000000000001e-07,1.0370000000000001e-07,1.0494e-07,1.0508e-07,1.0572e-07,1.0583e-07,1.0614999999999999e-07,1.0791999999999999e-07,1.0834e-07,1.0834e-07,1.0835e-07,1.0835e-07,1.0843e-07,1.0844e-07,1.0848e-07,1.0869999999999999e-07,1.0872e-07,1.0910999999999999e-07,1.1286000000000001e-07,1.1835e-07],"4194304":[0.047359387000000003,0.047439599999999985,0.047455247999999998,0.047552003999999988,0.047650963500000004,0.047742134000000012,0.047809406500000005,0.04793191849999999,0.047961494,0.048118519000000012,0.048328375999999992,0.048337730499999988,0.04834492,0.048420059000000001,0.048821788499999977,0.0489668885,0.048970313999999973,0.049221017500000012,0.049249886500000013,0.0497546195],"851968":[0.003465966,0.003585969,0.003616886000000001,0.0036898109999999999,0.003693872,0.0037002149999999998,0.0037568279999999989,0.0037935990000000004,0.0038059039999999997,0.0038136530000000002,0.003818199,0.003832167,0.0038904219999999997,0.0039967840000000015,0.0040085369999999978,0.0040686259999999988,0.0041150690000000007,0.0043919390000000027,0.0053622779999999998,0.00598776],"4096":[4.7208100000000005e-06,4.7241100000000001e-06,4.7249700000000001e-06,4.7254900000000001e-06,4.7266099999999996e-06,4.7295899999999997e-06,4.7296600000000004e-06,4.7306699999999999e-06,4.73164e-06,4.7325200000000006e-06,4.7331100000000003e-06,4.7363300000000003e-06,4.7409393939393941e-06,4.8643500000000003e-06,4.8755000000000323e-06,4.9376499999999992e-06,4.9446699999999999e-06,4.9466022727272726e-06,4.9533300000000001e-06,4.9632599999999993e-06],"59392":[8.0908000000000005e-05,8.4564227272727275e-05,8.4708000000000003e-05,8.4815999999999996e-05,8.5160000000000005e-05,8.537613483146067e-05,8.5410413043478256e-05,8.5698999999999994e-05,8.5703264367816093e-05,8.5766965517241386e-05,8.6097063829787239e-05,8.6151884615384629e-05,8.7067806451612912e-05,8.7529950000000007e-05,8.7581788732394366e-05,8.8225065217391305e-05,8.8501038461538464e-05,8.9183499999999997e-05,8.9289971014492749e-05,9.0932760000000002e-05],"84":[1.1002e-07,1.1159999999999999e-07,1.1172000000000001e-07,1.1189999999999999e-07,1.1263999999999999e-07,1.1311000000000001e-07,1.1312e-07,1.1413e-07,1.1691999999999999e-07,1.182e-07,1.1835e-07,1.1858999999999999e-07,1.1878000000000001e-07,1.1902999999999999e-07,1.2164e-07,1.2184000000000001e-07,1.2264634146341463e-07,1.2267e-07,1.2300999999999999e-07,1.2379e-07],"3276800":[0.035759659999999999,0.035859944000000005,0.0358637765,0.035872716000000013,0.035883172500000018,0.035994430000000001,0.036012420000000003,0.036150355499999981,0.036187651500000001,0.036214659500000003,0.036258147000000004,0.036260269500000011,0.036349123999999997,0.036350913999999998,0.0364036295,0.036420832,0.036485854999999998,0.036513074999999999,0.036714764500000011,0.037557287499999994],"55296":[7.5130999999999996e-05,7.5301000000000003e-05,7.7692171428571426e-05,7.8431999999999997e-05,7.8838000000000006e-05,7.9170049999999993e-05,7.9741840425531909e-05,7.9806218749999995e-05,7.9871448275862063e-05,8.0189000000000001e-05,8.0363728260869567e-05,8.0927773195876295e-05,8.0958222222222225e-05,8.1545252525252532e-05,8.1724967741935489e-05,8.1785166666666664e-05,8.2244443181818183e-05,8.2668037037037041e-05,8.2714999999999997e-05,0.00010949828571428569],"688128":[0.0024275250000000007,0.0024644209999999992,0.0024734020000000126,0.00250016,0.0025441189999999992,0.0026682729999999997,0.002668433,0.0026685150000000002,0.0026871895000000002,0.0026874465000000002,0.0026997515,0.0027087565000000007,0.0027586405000000007,0.0027939465,0.0027962220000000001,0.0028009669999999993,0.0028257605000000002,0.0029951225,0.00312284,0.003776031],"8192":[9.8293333333333326e-06,9.8342727272727258e-06,9.8445000000000004e-06,9.8539999999999992e-06,9.9399999999999997e-06,1.0021089999999999e-05,1.00443e-05,1.0051170000000001e-05,1.0070400000000001e-05,1.0072289999999999e-05,1.0081999999999999e-05,1.00869e-05,1.0110209999999999e-05,1.0150000000000001e-05,1.0193080000000001e-05,1.0202360000000001e-05,1.032449e-05,1.077332e-05,1.0788729999999999e-05,1.095e-05],"10240":[1.2371653061224489e-05,1.2374999999999999e-05,1.2449999999999999e-05,1.256e-05,1.259e-05,1.2616120000000001e-05,1.2716260000000001e-05,1.2717309999999998e-05,1.2788229999999999e-05,1.2798589999999999e-05,1.2803897959183673e-05,1.2833370000000001e-05,1.28403e-05,1.2867410000000001e-05,1.295891304347826e-05,1.3368279999999999e-05,1.344773e-05,1.3573350000000001e-05,1.3579980000000001e-05,1.370156e-05],"15872":[1.9369999999999999e-05,1.9629000000000001e-05,1.9652000000000001e-05,1.9945999999999998e-05,2.009301e-05,2.0131590909090909e-05,2.0134290000000001e-05,2.013719e-05,2.016595e-05,2.018054e-05,2.0254880597014924e-05,2.025813e-05,2.0261730000000002e-05,2.0265999999999999e-05,2.0271577464788735e-05,2.0337943661971832e-05,2.057294e-05,2.0919649999999999e-05,2.1217520000000003e-05,2.3047275862068965e-05],"92":[1.1855000000000001e-07,1.1948000000000001e-07,1.2097999999999999e-07,1.2142000000000001e-07,1.2172000000000001e-07,1.2354000000000001e-07,1.2567000000000001e-07,1.2578000000000001e-07,1.2578999999999999e-07,1.2594e-07,1.2601e-07,1.2611999999999999e-07,1.2686000000000001e-07,1.2708e-07,1.2812000000000001e-07,1.2902e-07,1.2924000000000001e-07,1.3014e-07,1.3091999999999998e-07,1.3796e-07],"26624":[3.2991999999999999e-05,3.3224333333333333e-05,3.3417500000000003e-05,3.3773999999999999e-05,3.4197689999999999e-05,3.43618e-05,3.4755760000000001e-05,3.4757059999999997e-05,3.4832000000000001e-05,3.4841519999999996e-05,3.4855379999999997e-05,3.4997450000000002e-05,3.5005000000000001e-05,3.5148950000000002e-05,3.515474e-05,3.5157000000000002e-05,3.5321293333333334e-05,3.5520957746478878e-05,3.6117559999999998e-05,3.6793779999999999e-05],"1792":[2.01826e-06,2.0209700000000002e-06,2.02113e-06,2.0214599999999998e-06,2.0219800000000002e-06,2.02331e-06,2.0233800000000003e-06,2.02426e-06,2.0249700000000001e-06,2.0257099999999998e-06,2.02581e-06,2.0263899999999999e-06,2.0275200000000002e-06,2.0277999999999999e-06,2.0279999999999999e-06,2.0286200000000001e-06,2.0287300000000001e-06,2.03204e-06,2.0331000000000001e-06,2.0420300000000001e-06],"11776":[1.43075e-05,1.432e-05,1.4496e-05,1.4589320000000001e-05,1.463232e-05,1.4637999999999999e-05,1.4663899999999999e-05,1.4664125000000001e-05,1.472674e-05,1.4760629999999999e-05,1.4783319999999999e-05,1.482619e-05,1.487087e-05,1.487923e-05,1.505075e-05,1.5053230000000001e-05,1.5173e-05,1.5388479999999999e-05,1.547674e-05,1.575238e-05],"2944":[3.3274999999999999e-06,3.3287699999999998e-06,3.3297300000000001e-06,3.3320200000000002e-06,3.3333899999999999e-06,3.3337900000000003e-06,3.3368399999999998e-06,3.3374e-06,3.3377400000000001e-06,3.33967e-06,3.34039e-06,3.3406700000000001e-06,3.3421500000000003e-06,3.3449599999999999e-06,3.34992e-06,3.478375e-06,3.4814400000000001e-06,3.4848399999999999e-06,3.5024299999999997e-06,3.6553500000000001e-06],"88":[1.1606999999999999e-07,1.1871999999999999e-07,1.2008999999999999e-07,1.2062999999999999e-07,1.2167999999999999e-07,1.2238000000000001e-07,1.2256999999999999e-07,1.2259000000000001e-07,1.2276e-07,1.2277000000000001e-07,1.2283e-07,1.23e-07,1.2335e-07,1.2419999999999999e-07,1.2508999999999999e-07,1.2515000000000001e-07,1.2541999999999999e-07,1.2611999999999999e-07,1.2620999999999999e-07,1.3285e-07],"22528":[2.7772000000000001e-05,2.7832999999999999e-05,2.8388e-05,2.8493999999999999e-05,2.8532000000000001e-05,2.8537333333333332e-05,2.8699000000000001e-05,2.8898999999999999e-05,2.9034599999999998e-05,2.907449e-05,2.914776e-05,2.9159281250000001e-05,2.9161719999999997e-05,2.9187330000000003e-05,2.9340109999999998e-05,2.9500009999999999e-05,2.9565275862068966e-05,2.9787649999999999e-05,3.0460058823529411e-05,3.2867249999999999e-05],"1245184":[0.0075541990000000028,0.0076761769999999976,0.0077448675000000005,0.0078969600000000015,0.0079525115000000004,0.0080190959999999999,0.008252329999999997,0.0083027259999999981,0.0083255925000000029,0.0083279104999999798,0.0083755949999999996,0.0083860205000000007,0.0084222095000000032,0.0087174430000000001,0.0087549894999999992,0.008885041000000005,0.008919448,0.0090691495,0.0098487809999999974,0.011698129999999999],"15728640":[0.19775606100000001,0.19820628100000001,0.19858448500000001,0.198586018,0.19888044199999999,0.19892483999999999,0.19897386,0.1992616995,0.19931567550000001,0.19957511100000003,0.19986625400000002,0.19998462900000002,0.20012255800000001,0.20037825349999999,0.200567568,0.20084345249999999,0.200903742,0.20091236500000001,0.2009848705,0.20177137700000003],"96":[1.2346e-07,1.2365e-07,1.2398e-07,1.2541000000000001e-07,1.2606999999999999e-07,1.2709000000000001e-07,1.2834e-07,1.2928e-07,1.3152e-07,1.3152e-07,1.3304000000000001e-07,1.3329999999999998e-07,1.3346000000000001e-07,1.3367999999999999e-07,1.3387000000000002e-07,1.3424000000000002e-07,1.3427e-07,1.3605999999999999e-07,1.3687000000000001e-07,1.4013e-07],"1984":[2.2327400000000001e-06,2.2327499999999999e-06,2.2344600000000001e-06,2.2357400000000003e-06,2.2359499999999997e-06,2.2360400000000001e-06,2.23645e-06,2.2365600000000001e-06,2.2369299999999997e-06,2.23777e-06,2.2380499999999997e-06,2.2383100000000001e-06,2.2383199999999999e-06,2.2390099999999999e-06,2.2415999999999998e-06,2.2441499999999999e-06,2.2446000000000001e-06,2.2459100000000002e-06,2.3372100000000001e-06,2.3596300000000002e-06],"139264":[0.00034062749999999988,0.00034213525000000001,0.00034338900000000004,0.00034414035714285717,0.00034937559999999985,0.00034957899999999998,0.0003522496842105263,0.00035294118181818183,0.00035478855,0.00035680385714285723,0.00035827325000000002,0.00035841122222222239,0.00035881826666666673,0.00036168685185185165,0.00036407699999999987,0.00036568349999999996,0.00036797066666666666,0.00036831437500000014,0.00037278371428571419,0.00037294272222222215],"475136":[0.001423269,0.0014352225000000001,0.0014370425000000001,0.0014493490000000004,0.0014542525,0.001467297,0.0014793165,0.0014870269999999999,0.0015033449999999999,0.0015107364999999997,0.0015190564999999997,0.0015293136666666666,0.0015333115,0.0015404185000000002,0.0015548753333333332,0.0015595206666666668,0.0015678495,0.001592223,0.001775762,0.0020416729999999999],"13631488":[0.17022939500000001,0.170273275,0.17038664149999999,0.17051063350000001,0.170510786,0.17134318700000001,0.17136729000000001,0.17146148850000001,0.17155700700000001,0.17162897899999999,0.171642984,0.17180453200000001,0.17190190399999999,0.17234269899999999,0.17299023549999998,0.17323133700000001,0.17328849699999999,0.17379180899999999,0.17446460850000001,0.17536305099999999],"416":[4.7894000000000003e-07,4.7925999999999997e-07,4.8625e-07,4.8652000000000004e-07,4.8665000000000003e-07,4.8683999999999998e-07,4.8762999999999998e-07,4.8767000000000003e-07,4.8800999999999999e-07,4.8894999999999999e-07,4.8909000000000005e-07,4.8915000000000001e-07,4.8917999999999999e-07,4.8918999999999995e-07,4.8976999999999997e-07,4.8996000000000003e-07,4.9171000000000005e-07,5.0133000000000006e-07,5.1313999999999995e-07,5.3417999999999998e-07],"928":[1.0468599999999998e-06,1.0473900000000001e-06,1.0518799999999999e-06,1.0521000000000001e-06,1.05281e-06,1.0528699999999999e-06,1.05312e-06,1.0546700000000001e-06,1.0566200000000001e-06,1.0567599999999999e-06,1.0577399999999999e-06,1.05838e-06,1.0585400000000002e-06,1.05891e-06,1.0592899999999999e-06,1.06e-06,1.0607699999999999e-06,1.0608000000000001e-06,1.06089e-06,1.10328e-06],"512":[5.8273999999999999e-07,5.8352999999999998e-07,5.8585000000000007e-07,5.8656999999999994e-07,5.8739000000000002e-07,5.9019999999999998e-07,5.9090000000000003e-07,5.9375999999999999e-07,5.9454999999999999e-07,5.9462000000000001e-07,5.9481000000000007e-07,5.9559999999999996e-07,5.9590999999999994e-07,5.9643999999999996e-07,5.9694999999999996e-07,5.9848000000000005e-07,6.0013000000000007e-07,6.0447999999999997e-07,6.2147999999999998e-07,6.2450000000000001e-07],"18432":[2.2607666666666667e-05,2.2614375e-05,2.2960999999999999e-05,2.3005000000000001e-05,2.321e-05,2.3283999999999999e-05,2.3426489999999999e-05,2.3502610000000002e-05,2.3610310000000001e-05,2.3613860000000002e-05,2.3623000000000001e-05,2.3630166666666666e-05,2.3671439999999998e-05,2.3679363636363637e-05,2.3830840000000002e-05,2.3915550000000002e-05,2.3996879999999999e-05,2.4004410000000001e-05,2.4011399999999998e-05,2.6340444444444445e-05],"16777216":[0.21121441299999999,0.21154273899999998,0.211813789,0.211960223,0.21229867949999998,0.212687132,0.21271252199999999,0.21274485800000001,0.21349222499999998,0.21386825450000002,0.21397583050000002,0.21408348499999999,0.21416933899999999,0.21435763299999999,0.21436564350000001,0.2145446825,0.21526473099999999,0.215376288,0.21564618250000001,0.21977839599999999],"9728":[1.1718250000000001e-05,1.1721666666666667e-05,1.1728890625000001e-05,1.1747666666666668e-05,1.1756000000000001e-05,1.1990620000000001e-05,1.2014464646464647e-05,1.2019669999999999e-05,1.2043769999999999e-05,1.2057350000000001e-05,1.2088470000000001e-05,1.2114409999999999e-05,1.227693e-05,1.2321111111111112e-05,1.2333e-05,1.2375050000000001e-05,1.2532359999999999e-05,1.2689109999999999e-05,1.2871869999999999e-05,1.3886444444444445e-05],"1769472":[0.015438733500000006,0.015876244500000008,0.015902820000000002,0.0159326025,0.015970149999999999,0.015978615000000005,0.016005955499999999,0.01601280300000002,0.0160142785,0.016068320000000001,0.016121798,0.016169202000000001,0.016187486499999994,0.016264305999999999,0.016290021999999994,0.016391798500000006,0.016621641499999999,0.01686519949999999,0.016952564,0.017168256],"1703936":[0.014598937000000001,0.014829836000000004,0.0148625615,0.0150351085,0.0150807435,0.015095876000000008,0.015248042,0.0152516175,0.0152615995,0.0152675465,0.015383684999999999,0.0154313565,0.015559080499999994,0.015975400000000001,0.016057047500000005,0.016117613999999995,0.016149353999999998,0.016529496999999997,0.017523291,0.019100091499999999],"2048":[2.2985399999999999e-06,2.3030300000000002e-06,2.3033e-06,2.3034299999999998e-06,2.3037200000000002e-06,2.30428e-06,2.3068600000000001e-06,2.30712e-06,2.3072999999999999e-06,2.30896e-06,2.3099300000000001e-06,2.3100299999999999e-06,2.3118800000000001e-06,2.3134600000000001e-06,2.3135599999999999e-06,2.31542e-06,2.3162399999999998e-06,2.3230500000000001e-06,2.4176299999999999e-06,2.7331900000000001e-06],"14336":[1.7478000000000001e-05,1.7523000000000001e-05,1.7864e-05,1.7933228571428572e-05,1.7989999999999999e-05,1.8130770000000001e-05,1.8160410000000001e-05,1.816099e-05,1.8163089999999998e-05,1.8172720000000001e-05,1.8212440000000001e-05,1.8217461538461538e-05,1.8226820000000001e-05,1.8258650000000002e-05,1.8290722222222222e-05,1.8300541666666667e-05,1.8556219999999998e-05,1.8770349999999999e-05,1.9245e-05,2.068758e-05],"448":[5.144e-07,5.1676999999999999e-07,5.1802000000000008e-07,5.1851000000000006e-07,5.1910000000000004e-07,5.1959000000000001e-07,5.1996000000000006e-07,5.2183999999999997e-07,5.2226999999999998e-07,5.2296000000000007e-07,5.2299000000000005e-07,5.2361999999999997e-07,5.2384999999999997e-07,5.2444000000000006e-07,5.2610000000000003e-07,5.2793000000000004e-07,5.2818000000000006e-07,5.4825e-07,5.4926999999999999e-07,5.6700000000000003e-07],"5505024":[0.064100266500000003,0.064407476500000033,0.064450318000000034,0.064587863999999981,0.06465090900000002,0.064671033000000003,0.064675468,0.064822333999999981,0.064943932999999981,0.06495728000000002,0.06500242249999999,0.065008069000000002,0.06502493099999998,0.065056659499999975,0.065082925,0.065103167000000017,0.065134184000000039,0.065204159999999983,0.06528105200000002,0.065600535000000001],"544":[6.2261999999999989e-07,6.2264999999999998e-07,6.2315000000000002e-07,6.2354999999999994e-07,6.2363000000000003e-07,6.2756999999999995e-07,6.2805999999999992e-07,6.2877000000000004e-07,6.2962e-07,6.3163e-07,6.3212000000000008e-07,6.3232999999999995e-07,6.3241000000000004e-07,6.3306999999999994e-07,6.3373000000000005e-07,6.4931944444444442e-07,6.5774000000000001e-07,6.5774999999999997e-07,6.6359000000000003e-07,6.8105999999999999e-07],"221184":[0.00060168900000000009,0.00060295039999999991,0.00060796433333333328,0.00061028299999999998,0.0006115281,0.00061622584615384618,0.00061687950000000004,0.00061739583333333329,0.0006213140000000002,0.00062424339999999994,0.00062525266666666661,0.00063314325000000027,0.00063723199999999984,0.00063783049999999977,0.00063835239999999994,0.00063910200000000001,0.00064380480000000005,0.00064714133333333332,0.0006476342000000003,0.00064925933333333339],"90112":[0.00013652169999999996,0.00013890357142857141,0.0001409187857142857,0.00014279681818181819,0.00014529000000000001,0.00014837768421052628,0.00015106291304347824,0.00015217,0.00015535648076923074,0.00015900549999999999,0.00016106935294117646,0.00016395504761904759,0.00016487325000000004,0.00016678688095238096,0.0001686962631578947,0.000169051,0.00017297005555555559,0.00017724449999999999,0.00018079487499999999,0.00018334975000000001],"640":[7.2605000000000002e-07,7.2908000000000001e-07,7.2955999999999992e-07,7.3083999999999989e-07,7.3093000000000005e-07,7.3473999999999997e-07,7.3514e-07,7.3537e-07,7.3537e-07,7.3590000000000002e-07,7.3627000000000007e-07,7.3739999999999992e-07,7.3827999999999996e-07,7.3967999999999996e-07,7.3972000000000001e-07,7.4063000000000004e-07,7.4386000000000004e-07,7.6733999999999999e-07,7.7057e-07,7.7175999999999992e-07],"12800":[1.5567399999999999e-05,1.5577399999999998e-05,1.5577399999999998e-05,1.5580999999999999e-05,1.560475e-05,1.5633000000000001e-05,1.5843000000000001e-05,1.5854000000000001e-05,1.5909e-05,1.6041955056179775e-05,1.6117489999999999e-05,1.611988e-05,1.6131349999999999e-05,1.6210199999999999e-05,1.622053e-05,1.6266070000000001e-05,1.6293333333333332e-05,1.6371e-05,1.6887909999999999e-05,1.7084249999999998e-05],"262144":[0.00073444890000000005,0.00074110866666666684,0.00074507987499999992,0.00074967600000000001,0.00075556349999999996,0.00076707549999999994,0.00076753663636363613,0.00076956699999999997,0.00077310533333333333,0.00077424287500000026,0.00077504949999999983,0.00077549999999999993,0.00077588350000000017,0.00077741850000000005,0.00077903677777777804,0.00078221400000000004,0.000784766625,0.00078647500000000002,0.00078650133333333337,0.00078855087500000003],"589824":[0.001885898,0.001896799,0.0019052400000000003,0.0019431379999999999,0.0019559709999999999,0.00197576,0.0019981,0.0020005650000000002,0.0020057880000000001,0.0020069699999999998,0.0020161800000000002,0.0020602670000000006,0.0020827429999999997,0.0020893104999999998,0.0021535450000000006,0.0021726359999999995,0.0022893420000000002,0.002701396,0.0031568125000000008,0.0039045905000000001],"884736":[0.0037767309999999985,0.0038950999999999999,0.0039451160000000002,0.0039552879999999995,0.0039604369999999998,0.0039712339999999997,0.0039829349999999999,0.0040250059999999994,0.0041188090000000002,0.0041489739999999997,0.0041624280000000001,0.0041812899999999998,0.0041962249999999996,0.004198785,0.0042661309999999985,0.0043383639999999999,0.0043618530000000006,0.004415151,0.0045924149999999999,0.0058296849999999968],"6144":[7.2564700000000003e-06,7.2691100000000003e-06,7.2714054054054048e-06,7.2761896551724137e-06,7.2819999999999999e-06,7.2845000000000003e-06,7.401e-06,7.4096800000000007e-06,7.4097800000000001e-06,7.4109399999999999e-06,7.4447399999999995e-06,7.4458599999999999e-06,7.4490000000000002e-06,7.4743900000000001e-06,7.5500923076923072e-06,7.6097678571428565e-06,7.6106714285714278e-06,7.6107249999999999e-06,7.6117100000000002e-06,7.7775499999999998e-06],"1088":[1.2243300000000001e-06,1.2255299999999999e-06,1.22725e-06,1.2286923076923077e-06,1.2293199999999999e-06,1.2295499999999999e-06,1.2306999999999999e-06,1.23259e-06,1.2342e-06,1.2359000000000001e-06,1.2371999999999998e-06,1.2372199999999999e-06,1.2378700000000001e-06,1.2380599999999998e-06,1.2385999999999999e-06,1.2400900000000001e-06,1.2428600000000002e-06,1.24702e-06,1.28985e-06,1.2939200000000001e-06],"576":[6.5385999999999995e-07,6.5740000000000005e-07,6.5877000000000007e-07,6.6112999999999999e-07,6.6120000000000002e-07,6.6432000000000006e-07,6.6587000000000007e-07,6.6630000000000008e-07,6.6637999999999996e-07,6.6644999999999999e-07,6.6764999999999997e-07,6.6914000000000002e-07,6.6924000000000003e-07,6.6924999999999999e-07,6.6990999999999999e-07,6.7237499999999996e-07,6.9380000000000003e-07,6.9737e-07,6.9913000000000009e-07,6.9984e-07],"160":[1.9497999999999999e-07,1.9752000000000001e-07,1.9769999999999998e-07,2.0367999999999998e-07,2.043e-07,2.0432999999999998e-07,2.0449e-07,2.0460000000000002e-07,2.0500999999999998e-07,2.0619e-07,2.0633e-07,2.0645e-07,2.0763000000000001e-07,2.0827e-07,2.1313e-07,2.1413e-07,2.1585000000000002e-07,2.1619000000000001e-07,2.1637e-07,2.2427999999999999e-07],"672":[7.6315000000000005e-07,7.6681000000000007e-07,7.6816000000000007e-07,7.6919999999999998e-07,7.7094000000000005e-07,7.7095999999999996e-07,7.7126000000000009e-07,7.7288999999999998e-07,7.7296000000000001e-07,7.7303000000000003e-07,7.732399999999999e-07,7.7353000000000007e-07,7.7377999999999998e-07,7.7393e-07,7.7533e-07,7.7535999999999998e-07,7.7560999999999999e-07,7.7688999999999996e-07,8.0926000000000009e-07,8.1202985074626862e-07],"8912896":[0.10822824,0.1082978495,0.108540657,0.108567106,0.10857726099999999,0.1086206265,0.10865232599999999,0.10870369000000001,0.109135231,0.10929688699999995,0.10936551049999998,0.10941989100000001,0.10946342050000001,0.109518662,0.1095799905,0.109946747,0.11001188000000001,0.11001597000000002,0.11059632950000001,0.110621913],"100":[1.3171999999999999e-07,1.328125e-07,1.3343e-07,1.3374000000000001e-07,1.3558e-07,1.3567e-07,1.3575999999999999e-07,1.3591999999999999e-07,1.3603000000000001e-07,1.3672e-07,1.3723000000000002e-07,1.3771999999999999e-07,1.3771999999999999e-07,1.3784e-07,1.3791e-07,1.3841000000000001e-07,1.3855000000000001e-07,1.3885e-07,1.3922e-07,1.3986999999999999e-07],"507904":[0.0015433795000000003,0.0015678823333333334,0.0015682599999999997,0.0015913170000000005,0.001591388,0.001594303,0.001597516,0.0016020329999999999,0.0016032004999999999,0.0016033809999999999,0.0016167179999999996,0.0016553989999999997,0.0016697443333333333,0.0016943260000000001,0.001722637,0.001744102,0.0018961445,0.0019312190000000001,0.0020160360000000001,0.0023552883333333332],"3840":[4.3960800000000004e-06,4.4052900000000001e-06,4.4064700000000005e-06,4.4093299999999998e-06,4.4097399999999997e-06,4.4118699999999997e-06,4.4119699999999999e-06,4.4138300000000004e-06,4.4172499999999999e-06,4.4191599999999997e-06,4.4194500000000005e-06,4.6191000000000004e-06,4.6193200000000005e-06,4.6194600000000002e-06,4.6227499999999999e-06,4.6290399999999995e-06,4.8261299999999998e-06,4.8518900000000002e-06,4.8534599999999999e-06,5.1635799999999994e-06],"192":[2.2985000000000001e-07,2.3187e-07,2.3258999999999999e-07,2.3467e-07,2.3566999999999999e-07,2.3598e-07,2.3811000000000001e-07,2.3813999999999999e-07,2.3867000000000001e-07,2.3930999999999999e-07,2.4054000000000001e-07,2.4145999999999999e-07,2.4149999999999999e-07,2.4166000000000001e-07,2.4192000000000004e-07,2.4345999999999998e-07,2.4830999999999998e-07,2.5255000000000002e-07,2.5261999999999999e-07,2.6488999999999999e-07],"376832":[0.0010968776666666663,0.0011001206,0.0011050286666666668,0.001111978,0.001112507,0.0011144414,0.0011331164999999999,0.0011427185,0.0011500393333333332,0.0011516569999999997,0.0011532369999999999,0.001154553,0.0011548415000000004,0.001154909,0.0011619040000000001,0.0011622612,0.0011634552000000004,0.0011815535000000003,0.0011994682,0.0013327817499999999],"98304":[0.00016908590909090905,0.00017868800000000001,0.00018282079545454543,0.00018367262500000001,0.00018592504545454543,0.00018869205405405403,0.00019518815999999996,0.00019623288888888881,0.000197104,0.00019902005882352938,0.00020192463999999999,0.00020236342307692308,0.00020380173333333336,0.00020617162500000003,0.00020710959999999993,0.00021056524324324322,0.00021617979069767429,0.00021651771875,0.00021827542857142854,0.00023982337931034481],"5376":[6.3096500000000007e-06,6.3165499999999997e-06,6.3292000000000003e-06,6.3314500000000002e-06,6.4579999999999998e-06,6.4729399999999997e-06,6.4838099999999995e-06,6.5073500000000005e-06,6.5105800000000003e-06,6.5116800000000001e-06,6.5526699999999996e-06,6.5788599999999996e-06,6.5857199999999992e-06,6.5914200000000007e-06,6.5974200000000003e-06,6.6009599999999997e-06,6.61823e-06,6.6259200000000001e-06,6.7296200000000005e-06,6.9204599999999998e-06],"94208":[0.00015319211538461535,0.00015493276923076924,0.00015730005555555555,0.00015961475000000002,0.00017515099999999999,0.0001755863636363636,0.0001788927631578947,0.00018009655555555553,0.00018143518749999993,0.000182034,0.0001847748717948718,0.00018497244897959188,0.000186596,0.00018738742857142855,0.00018740733333333332,0.00019230308823529413,0.00019974324999999998,0.00019986289655172417,0.00020214333333333335,0.00020449660869565215],"81920":[0.000120309,0.00012035999999999998,0.00012252383050847455,0.000125003,0.00012828836065573773,0.0001301776923076923,0.00013031518032786886,0.00013227233898305079,0.00013476954761904776,0.00013634326785714288,0.00013636188888888889,0.00013958827272727274,0.000140147,0.00014168586363636366,0.00014330928000000001,0.0001450761052631579,0.0001474023333333333,0.00015019781818181817,0.00015042456862745087,0.00015276704166666664],"3407872":[0.037508731500000003,0.0375555245,0.037556904500000016,0.037768667499999999,0.037794175999999999,0.037814414000000011,0.037845199999999989,0.037920958500000004,0.037922331500000003,0.037924276,0.037934420000000038,0.037952603500000001,0.037986370499999998,0.038131274500000013,0.038134064499999988,0.038200413500000002,0.038249452999999996,0.03869442,0.038709360000000012,0.038792009999999995],"104":[1.318e-07,1.3305000000000002e-07,1.3625000000000002e-07,1.3714e-07,1.3872000000000001e-07,1.4011e-07,1.4039999999999999e-07,1.4112000000000001e-07,1.4119999999999999e-07,1.4196999999999999e-07,1.4233e-07,1.4238999999999999e-07,1.4240999999999999e-07,1.4252999999999999e-07,1.4280999999999999e-07,1.4287999999999999e-07,1.4402000000000002e-07,1.4646e-07,1.4969000000000001e-07,1.5012e-07],"122880":[0.0002843635,0.00028900050000000009,0.0002924050312499998,0.00029818142857143004,0.0002991544137931034,0.00030029804545454546,0.00030088182142857145,0.00030170800000000009,0.00030320249999999998,0.00030408976923076904,0.00030589457692307688,0.00030656728571428572,0.00030697600000000015,0.00030731213333333338,0.0003077567692307691,0.00030872400000000013,0.0003090618333333334,0.00031052900000000009,0.00031117416666666669,0.00032510837500000002],"200":[2.4056000000000003e-07,2.4390000000000001e-07,2.4630999999999999e-07,2.4720930232558137e-07,2.4740000000000001e-07,2.4761999999999999e-07,2.4769999999999997e-07,2.4932000000000001e-07,2.4957999999999999e-07,2.5059999999999998e-07,2.5068000000000002e-07,2.5071e-07,2.5071e-07,2.5086000000000001e-07,2.5106999999999998e-07,2.5130000000000003e-07,2.5228999999999999e-07,2.5913999999999998e-07,2.6199999999999999e-07,2.6287000000000002e-07],"163840":[0.0004275045,0.00043404216666666668,0.00043449117647058821,0.00043985749999999994,0.0004400501999999999,0.00044028433333333331,0.00044257900000000013,0.00044274987500000018,0.00044545047619047639,0.00044552250000000002,0.00044852875,0.00045066628571428574,0.00045290707142857151,0.0004537004374999999,0.00045400900000000001,0.00045634181250000003,0.00045835933333333325,0.00047170818181818187,0.00048486246666666665,0.00048577631578947356],"4063232":[0.045972236,0.045990266499999974,0.046031727500000022,0.046043082500000013,0.046123074,0.046164638000000001,0.046179187499999996,0.046197479999999999,0.046283291000000004,0.046314109999999999,0.046343815999999996,0.046458909999999999,0.046529574000000004,0.046563813999999995,0.04662274399999998,0.046690826000000012,0.04673026650000002,0.047033330000000019,0.047476415499999994,0.049347282499999999],"5767168":[0.067375781999999981,0.06762396900000002,0.06787848249999999,0.06791167250000002,0.067971274999999998,0.067986698000000012,0.068019396499999996,0.068174635499999997,0.068222445000000034,0.068271018500000002,0.068319769999999974,0.068372667999999998,0.06840660300000001,0.06845008800000002,0.06858148399999997,0.068588664999999965,0.06881680300000001,0.068865987999999961,0.068901920000000033,0.070477396999999997],"12582912":[0.15642637149999999,0.15670802,0.15731232049999999,0.15770922649999999,0.15773272999999999,0.15787420899999999,0.15800805449999999,0.15819039200000001,0.158210767,0.158214935,0.15848897749999999,0.15858308099999999,0.158621332,0.158687472,0.15871725800000003,0.15871772749999999,0.15887489499999999,0.15887775000000001,0.15911714699999999,0.15960472949999999],"1600":[1.8028299999999999e-06,1.80476e-06,1.8077800000000002e-06,1.8083600000000001e-06,1.8086400000000002e-06,1.8087142857142857e-06,1.8089000000000002e-06,1.8094199999999999e-06,1.8101400000000001e-06,1.8103999999999999e-06,1.8107099999999999e-06,1.8117500000000001e-06,1.8118499999999999e-06,1.81309e-06,1.8162099999999999e-06,1.81734e-06,1.8222000000000001e-06,1.8928999999999999e-06,1.897e-06,1.9019499999999998e-06],"136":[1.6906000000000001e-07,1.6934999999999999e-07,1.6935999999999998e-07,1.6951000000000001e-07,1.7022999999999998e-07,1.7282999999999999e-07,1.7614000000000001e-07,1.7688000000000001e-07,1.7688999999999999e-07,1.7742000000000001e-07,1.7747000000000001e-07,1.7795000000000003e-07,1.7795000000000003e-07,1.7815000000000002e-07,1.7835000000000001e-07,1.7884000000000001e-07,1.7893999999999999e-07,1.7910000000000001e-07,1.793e-07,1.8066e-07],"232":[2.7742999999999996e-07,2.8036e-07,2.8079999999999997e-07,2.8135999999999997e-07,2.8356999999999999e-07,2.8374999999999998e-07,2.8377000000000001e-07,2.8458999999999998e-07,2.8465e-07,2.8467000000000002e-07,2.8480000000000001e-07,2.8512e-07,2.8571999999999999e-07,2.8625000000000001e-07,2.8717e-07,2.8827999999999998e-07,2.9139000000000002e-07,2.9892000000000003e-07,3.0217000000000001e-07,3.0301999999999997e-07],"7077888":[0.084232914499999992,0.08442147049999997,0.084517599000000013,0.084544178499999997,0.084574324000000006,0.084642504000000007,0.084750671500000027,0.084768526999999982,0.084828688999999999,0.084843627000000005,0.0848579255,0.085127171000000001,0.085220655999999992,0.085392310999999999,0.085451131999999999,0.085523114000000025,0.085723205999999996,0.086011299500000041,0.086346015500000026,0.086689740000000001],"86016":[0.000125136,0.00013305899999999999,0.0001392876,0.00014079742105263155,0.000141224125,0.00014169562790697674,0.00014234063636363634,0.00014352250000000005,0.00014414223529411765,0.00014740216981132072,0.00014802459523809527,0.00015005509999999994,0.00015306766666666667,0.00015394543478260871,0.00015656892307692308,0.00016027602,0.00016268092857142858,0.000162824,0.00016325037931034486,0.00016447952380952384],"31744":[4.1624454545454546e-05,4.1645520000000001e-05,4.1804999999999997e-05,4.2185380000000003e-05,4.2481370000000001e-05,4.2544560000000003e-05,4.2554969999999993e-05,4.2618555555555557e-05,4.2674499999999999e-05,4.2869520000000002e-05,4.2964489999999998e-05,4.3159571428571431e-05,4.3218479999999998e-05,4.3272999999999997e-05,4.3426923076923079e-05,4.3439890000000003e-05,4.3701079999999999e-05,4.4186110000000001e-05,4.4242490000000001e-05,4.4385590909090908e-05],"168":[2.0392000000000002e-07,2.0407e-07,2.0563e-07,2.0608999999999999e-07,2.0608999999999999e-07,2.0625000000000001e-07,2.1208e-07,2.1215e-07,2.1381999999999999e-07,2.1409000000000001e-07,2.1423000000000001e-07,2.1478999999999998e-07,2.1514000000000001e-07,2.1523e-07,2.1552999999999997e-07,2.1574e-07,2.1637e-07,2.2282999999999999e-07,2.3448999999999998e-07,2.3574000000000002e-07],"622592":[0.0021230299999999988,0.0021430329999999999,0.0021454640000000001,0.0021757730000000002,0.0022019029999999998,0.0022120464999999998,0.0022166999999999998,0.002226104,0.0022432179999999991,0.0022593159999999995,0.0022826390000000004,0.0022869470000000001,0.002308179,0.002328676,0.002334483,0.002362533,0.0023859040000000008,0.002453003,0.0025339289999999999,0.0028321090000000002],"108":[1.3740999999999998e-07,1.3927999999999999e-07,1.4039999999999999e-07,1.4171000000000002e-07,1.4296e-07,1.4395000000000002e-07,1.4399000000000001e-07,1.4455999999999999e-07,1.4485e-07,1.4490000000000001e-07,1.4515e-07,1.4569999999999999e-07,1.4573e-07,1.4574000000000001e-07,1.4587e-07,1.4606e-07,1.4637999999999999e-07,1.4656000000000001e-07,1.4662e-07,1.4768999999999999e-07],"327680":[0.00094236542857142858,0.00094780228571428554,0.00095110616666666675,0.00095132140000000023,0.00096682449999999976,0.00098001699999999948,0.00098149666666666664,0.00098762749999999999,0.00098779666666666674,0.00098909083333333331,0.00098934628571428567,0.00099213366666666661,0.00099413033333333335,0.001000625,0.0010012173333333334,0.0010021866666666667,0.0010077390000000001,0.0010086401428571431,0.0010123371428571429,0.0010294413333333337],"2176":[2.4416200000000002e-06,2.4481100000000002e-06,2.4498899999999998e-06,2.4505399999999999e-06,2.4519000000000002e-06,2.4525000000000002e-06,2.4528400000000003e-06,2.4540599999999997e-06,2.4544900000000001e-06,2.4545699999999998e-06,2.4581400000000001e-06,2.4593400000000002e-06,2.4598300000000001e-06,2.4600799999999998e-06,2.4602000000000002e-06,2.4624100000000002e-06,2.4632099999999998e-06,2.46581e-06,2.5760699999999998e-06,2.6883000000000002e-06],"3328":[3.7767200000000003e-06,3.7871699999999999e-06,3.7871999999999999e-06,3.7874599999999999e-06,3.7882200000000001e-06,3.7894499999999998e-06,3.7911999999999998e-06,3.7920299999999998e-06,3.79242e-06,3.7932900000000003e-06,3.7942100000000003e-06,3.8013111111111109e-06,3.9620600000000003e-06,3.9621200000000003e-06,3.9650600000000001e-06,3.9652300000000002e-06,3.9757300000000003e-06,3.9794500000000005e-06,4.1670000000000001e-06,4.4692499999999996e-06],"1":[1.81e-08,1.81e-08,1.81e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8119999999999999e-08,1.894e-08,1.9870000000000002e-08,1.9870000000000002e-08,1.9870000000000002e-08,1.9870000000000002e-08,1.988e-08,2.2230000000000001e-08],"2":[1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.988e-08,1.988e-08,1.988e-08,1.988e-08,2.084e-08,2.084e-08],"3":[1.9889999999999998e-08,1.9889999999999998e-08,1.9889999999999998e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.99e-08,1.9910000000000001e-08,1.9910000000000001e-08,1.9910000000000001e-08,1.9910000000000001e-08,1.9910000000000001e-08,2.0829999999999999e-08,2.084e-08,2.182e-08],"4":[2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0770000000000003e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0779999999999998e-08,2.0829999999999999e-08,2.1220000000000001e-08,2.168e-08,2.1739999999999998e-08,2.175e-08],"7424":[8.8659999999999995e-06,9.0120600000000002e-06,9.017829999999999e-06,9.0293399999999995e-06,9.0344000000000011e-06,9.0457000000000005e-06,9.0609800000000004e-06,9.0991200000000004e-06,9.1224799999999998e-06,9.1327599999999989e-06,9.1481300000000001e-06,9.1508799999999994e-06,9.1563599999999999e-06,9.1637299999999987e-06,9.1759999999999999e-06,9.2721500000000007e-06,9.4050500000000007e-06,9.5622499999999998e-06,9.6317499999999997e-06,1.0514739999999999e-05],"5":[2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.166e-08,2.168e-08,2.2670000000000001e-08,2.2670000000000001e-08,2.2670000000000001e-08,2.2670000000000001e-08,2.2680000000000002e-08,2.3779999999999999e-08],"23552":[2.8995285714285712e-05,2.9012421052631579e-05,2.9044874999999999e-05,2.9062999999999999e-05,2.90714375e-05,2.9087000000000001e-05,2.9930999999999999e-05,3.0023374999999999e-05,3.0119939999999999e-05,3.0252629999999998e-05,3.025528e-05,3.030638e-05,3.0342842105263158e-05,3.0373439999999999e-05,3.0414589999999998e-05,3.0476600000000002e-05,3.0598059999999998e-05,3.0627019999999998e-05,3.0940080000000004e-05,3.2690300000000001e-05],"6":[2.2539999999999999e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.255e-08,2.2560000000000002e-08,2.2570000000000003e-08,2.3429999999999999e-08,2.36e-08,2.36e-08,2.3609999999999998e-08,2.3619999999999999e-08,2.475e-08],"61440":[8.4740999999999994e-05,8.7824586206896547e-05,8.8475959999999995e-05,8.8479384615384617e-05,8.8684173913043478e-05,8.8694000000000002e-05,8.9544999999999997e-05,8.9587999999999997e-05,8.9594144927536236e-05,8.9823222222222229e-05,8.9838783132530127e-05,8.9847402597402595e-05,9.021722727272727e-05,9.0910606060606061e-05,9.0982518987341767e-05,9.2228304347826101e-05,9.2546720930232563e-05,9.3193450000000005e-05,9.3700405405405414e-05,9.4135972222222222e-05],"491520":[0.0015076835000000001,0.0015175339999999999,0.0015243984999999999,0.001538759,0.001549253,0.0015574045,0.0015646355000000008,0.0015868829999999997,0.0015882000000000001,0.0015947090000000001,0.0015988689999999999,0.0016037495,0.0016086519999999999,0.0016157973333333336,0.0016225495,0.0016239494999999999,0.0016404519999999999,0.0016876410000000001,0.001981025,0.0023280170000000008],"77824":[0.00011717562295081965,0.000117577,0.00011823787692307682,0.00011842950000000001,0.00012036066129032254,0.0001204525,0.0001251421,0.00012525515686274508,0.0001261602222222222,0.00012675324074074072,0.00012860655172413797,0.0001286461346153846,0.00012869499999999999,0.00012900857142857141,0.00012933531372549017,0.00012982344444444443,0.00013275926315789471,0.00013656715789473684,0.00013963199999999999,0.0001650205],"7":[2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.344e-08,2.3450000000000002e-08,2.3470000000000001e-08,2.3489999999999997e-08,2.3560000000000001e-08,2.4530000000000002e-08,2.4530000000000002e-08,2.4530000000000002e-08,2.454e-08,2.4810000000000002e-08,2.8019999999999999e-08],"8":[2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4329999999999997e-08,2.4360000000000001e-08,2.4490000000000003e-08,2.5459999999999998e-08,2.5459999999999998e-08,2.5459999999999998e-08,2.5469999999999999e-08,2.578e-08,2.6699999999999998e-08,2.6699999999999998e-08],"208":[2.4894e-07,2.5003999999999998e-07,2.5122e-07,2.5125000000000003e-07,2.5410999999999999e-07,2.5645e-07,2.5664e-07,2.5732999999999999e-07,2.5757e-07,2.5758000000000001e-07,2.5774000000000003e-07,2.5830999999999999e-07,2.5996000000000001e-07,2.6978000000000002e-07,2.7021999999999999e-07,2.7039999999999999e-07,2.7074e-07,2.7197999999999998e-07,2.7252000000000001e-07,2.7994999999999996e-07],"9":[2.5210000000000002e-08,2.522e-08,2.522e-08,2.522e-08,2.522e-08,2.522e-08,2.522e-08,2.522e-08,2.522e-08,2.5229999999999998e-08,2.639e-08,2.639e-08,2.639e-08,2.639e-08,2.639e-08,2.639e-08,2.639e-08,2.639e-08,2.6400000000000001e-08,2.777e-08],"73728":[0.00011050181944444445,0.00011128659999999999,0.00011282406944444445,0.00011313133333333333,0.00011347788235294118,0.00011408600000000001,0.00011430803703703706,0.00011547447826086956,0.000116217,0.0001173321,0.0001177046875,0.000117978,0.00011994095454545455,0.0001241990769230769,0.0001252845777777778,0.00012773299999999996,0.000127739,0.0001304911,0.00013415399999999999,0.00014297074468085105],"304":[3.5596000000000002e-07,3.5890999999999998e-07,3.6123000000000001e-07,3.6164999999999996e-07,3.6205000000000004e-07,3.6220999999999996e-07,3.6250000000000002e-07,3.6394999999999997e-07,3.6449999999999996e-07,3.6503999999999999e-07,3.6530999999999998e-07,3.6537e-07,3.6551000000000005e-07,3.6572000000000002e-07,3.6670000000000002e-07,3.7056e-07,3.8071000000000003e-07,3.8121000000000001e-07,3.8352000000000004e-07,3.8714000000000001e-07],"400":[4.6393e-07,4.6438999999999999e-07,4.6572000000000002e-07,4.6704999999999999e-07,4.7005e-07,4.7025999999999998e-07,4.7033999999999996e-07,4.7057000000000001e-07,4.7095000000000002e-07,4.7188000000000001e-07,4.7206999999999996e-07,4.7240999999999998e-07,4.7290999999999996e-07,4.7334999999999999e-07,4.7379000000000001e-07,4.7450999999999998e-07,4.7548000000000002e-07,4.8966000000000001e-07,5.0462999999999999e-07,5.0969000000000001e-07],"1310720":[0.0086645520000000007,0.0086840830000000004,0.0089093944999999973,0.008913389499999997,0.0089454545,0.0092142939999999979,0.0093175499999999974,0.0093194330000000002,0.0093909219999999995,0.009398431500000002,0.0096025269999999961,0.0096031485000000003,0.0096183599999999994,0.0096403950000000047,0.0097023374999999999,0.0097232985000000015,0.0099919899999999992,0.010040259499999999,0.011469917499999999,0.012720850000000001],"336":[3.9077e-07,3.9607999999999998e-07,3.9663000000000003e-07,3.9701999999999999e-07,3.9779000000000002e-07,3.9872000000000001e-07,3.9881000000000001e-07,3.9938000000000002e-07,4.0074999999999999e-07,4.0091000000000001e-07,4.0228999999999998e-07,4.0338e-07,4.0431e-07,4.0604e-07,4.1288999999999999e-07,4.1656999999999998e-07,4.1724000000000005e-07,4.1977000000000001e-07,4.2317e-07,4.3253000000000002e-07],"3670016":[0.040632111499999998,0.040827153499999991,0.040859254500000004,0.040883357999999988,0.040910641499999997,0.040921306499999997,0.041011320999999983,0.041021923499999988,0.0410621465,0.0410874065,0.041088147499999991,0.041181365500000011,0.041208606999999987,0.041275925499999984,0.041294932999999999,0.04142419,0.041481467000000001,0.041705651499999996,0.041973391999999998,0.042691514999999999],"6656":[7.9181780821917807e-06,7.9219999999999997e-06,7.9340000000000006e-06,8.0282499999999989e-06,8.0550299999999987e-06,8.0646400000000001e-06,8.072e-06,8.0789200000000012e-06,8.0909700000000006e-06,8.1623399999999992e-06,8.1687700000000001e-06,8.1816499999999998e-06,8.1982599999999997e-06,8.2010199999999996e-06,8.2285099999999999e-06,8.2509999999999994e-06,8.2605199999999996e-06,8.4122099999999995e-06,8.6710599999999996e-06,9.1038299999999995e-06],"15360":[1.88155e-05,1.9066999999999999e-05,1.9117e-05,1.9185e-05,1.9516329545454545e-05,1.9527629999999998e-05,1.9591510000000001e-05,1.9596278350515465e-05,1.959644e-05,1.9645880000000003e-05,1.9827429999999998e-05,1.988059e-05,2.001717e-05,2.0023770000000001e-05,2.0115240000000003e-05,2.0118470000000002e-05,2.0247830000000002e-05,2.2260610000000002e-05,2.2403100000000002e-05,2.2617409999999999e-05],"432":[5.0024000000000004e-07,5.0233999999999998e-07,5.0309000000000004e-07,5.0355999999999999e-07,5.045e-07,5.0498000000000001e-07,5.0617948717948717e-07,5.0716000000000005e-07,5.0717999999999997e-07,5.0737000000000002e-07,5.0779000000000008e-07,5.0810000000000006e-07,5.0816000000000002e-07,5.0829999999999997e-07,5.0831000000000003e-07,5.1195000000000003e-07,5.2738999999999996e-07,5.2796000000000002e-07,5.2832000000000001e-07,5.2919444444444445e-07],"950272":[0.0041374469999999998,0.0043403979999999988,0.0043599820000000001,0.0043937620000000016,0.0044506809999999997,0.0044537050000000005,0.0044556419999999984,0.0044685259999999996,0.0045489169999999978,0.0045920200000000022,0.0046392309999999997,0.0046834319999999995,0.0047027129999999999,0.0047448899999999999,0.004782625999999999,0.0048485680000000001,0.0049074560000000001,0.0049691849999999992,0.0050511420000000015,0.0055921620000000003],"655360":[0.0022693270000000002,0.002306163,0.0023315839999999998,0.0023411619999999999,0.002355757,0.0023611459999999993,0.002365439,0.002381233,0.0024007955,0.0024094839999999999,0.0024270559999999999,0.0024430039999999995,0.0024596570000000009,0.0024876129999999988,0.0025114819999999998,0.0025483814999999999,0.0027351940000000007,0.002804244,0.0028306500000000001,0.0031036295000000007],"69632":[9.9610000000000003e-05,0.00010062739130434788,0.00010293834782608698,0.00010297084931506847,0.00010312899999999998,0.000104343,0.000105827,0.00010657997142857144,0.000106603,0.00010696007692307695,0.00010726431250000005,0.00010758820454545455,0.00010805283333333334,0.00011037405405405402,0.00011220295238095239,0.00011408483333333334,0.0001144405,0.000114945,0.000120357,0.00016309035483870964],"11264":[1.3626e-05,1.3664e-05,1.3688499999999999e-05,1.3934000000000001e-05,1.3987e-05,1.4070370000000001e-05,1.4072119999999998e-05,1.4092709999999999e-05,1.4107539999999999e-05,1.4117999999999999e-05,1.419664e-05,1.4229100000000001e-05,1.4234420289855073e-05,1.4275675675675678e-05,1.4282499999999999e-05,1.4329449999999999e-05,1.435109e-05,1.4517e-05,1.462404e-05,1.6139279999999998e-05],"2752512":[0.029090379,0.02924946149999999,0.029273285999999999,0.029321022999999984,0.02933345,0.029473891500000023,0.029498594500000013,0.029507856000000009,0.029513375000000008,0.029531032500000009,0.029534268499999988,0.029556501500000009,0.029569548499999987,0.0295757,0.029694158000000016,0.029697182999999988,0.029732976000000001,0.029761713500000002,0.029767888499999996,0.030077517999999998],"8126464":[0.097761594499999979,0.09794401350000001,0.09827319800000002,0.098299485999999978,0.0984325375,0.098434901000000005,0.098533693000000006,0.098543994999999995,0.098805705499999993,0.098912434499999993,0.09893280749999997,0.098993468000000001,0.099012916000000006,0.099055606500000032,0.099243320999999995,0.099283499499999997,0.099392097499999998,0.099573181999999996,0.099977094499999988,0.1047412095],"27648":[3.4282000000000001e-05,3.4302499999999999e-05,3.5469999999999998e-05,3.5818277777777778e-05,3.59315e-05,3.5950259999999998e-05,3.6012e-05,3.612e-05,3.62035e-05,3.6269230000000004e-05,3.6450169999999997e-05,3.6483750000000001e-05,3.6489109999999997e-05,3.6545200000000004e-05,3.681695714285714e-05,3.6820689999999997e-05,3.7081630769230772e-05,3.7106510000000002e-05,3.7606079999999998e-05,3.7636070000000002e-05],"368":[4.2407000000000001e-07,4.2435000000000001e-07,4.2850000000000001e-07,4.2871999999999999e-07,4.3312e-07,4.3354e-07,4.3390000000000004e-07,4.3487999999999999e-07,4.3494e-07,4.3574000000000001e-07,4.3603000000000002e-07,4.3659000000000002e-07,4.3676e-07,4.3680999999999995e-07,4.3691000000000001e-07,4.3708000000000005e-07,4.3788999999999996e-07,4.3825999999999996e-07,4.4110000000000005e-07,4.5814e-07],"65536":[9.1619999999999994e-05,9.3954608695652166e-05,9.4964049999999998e-05,9.5239777777777785e-05,9.5292563380281684e-05,9.5546323529411767e-05,9.5858818181818184e-05,9.6087985507246383e-05,9.6280402985074638e-05,9.6424111111111113e-05,9.6715971428571439e-05,9.7328227272727263e-05,9.8443810810810805e-05,9.8781384615384614e-05,9.994488888888889e-05,0.00010092,0.00010125646341463415,0.00010299622222222226,0.00010554837333333286,0.00010557815517241378],"16252928":[0.20552451799999999,0.20617912999999999,0.20619509899999999,0.2063381815,0.206448715,0.206504468,0.20673050999999998,0.20674828049999999,0.20706398500000001,0.20739324299999995,0.20760089500000001,0.20788277299999999,0.208035836,0.20805259200000001,0.20810480749999999,0.2081610945,0.20819162199999999,0.2082951035,0.208743757,0.20976262099999998],"464":[5.2893999999999997e-07,5.3483999999999999e-07,5.3819999999999999e-07,5.384e-07,5.3901000000000001e-07,5.3967000000000001e-07,5.3996999999999993e-07,5.4008999999999996e-07,5.4027000000000006e-07,5.4030000000000004e-07,5.4041000000000001e-07,5.4064999999999996e-07,5.4074000000000001e-07,5.4123999999999994e-07,5.4134000000000006e-07,5.4296666666666663e-07,5.4333000000000004e-07,5.4359999999999997e-07,5.5629000000000001e-07,5.8529999999999993e-07],"1015808":[0.0048051680000000003,0.004946293,0.0049684409999999997,0.0050570329999999998,0.0050732149999999998,0.0050855290000000001,0.0051690879999999996,0.005196506,0.0052292699999999994,0.0052816249999999999,0.005297093000000001,0.0054387380000000003,0.005448222,0.0054814999999999985,0.0055406489999999999,0.0055874769999999987,0.0057296139999999983,0.0057509420000000002,0.0058760889999999993,0.0060126950000000002],"3072":[3.4772100000000002e-06,3.4788499999999997e-06,3.4789899999999998e-06,3.47972e-06,3.4797300000000003e-06,3.4803699999999998e-06,3.4810199999999999e-06,3.4813800000000001e-06,3.4814600000000002e-06,3.4814999999999996e-06,3.4833800000000003e-06,3.4835600000000002e-06,3.4843700000000001e-06,3.4858199999999999e-06,3.4862000000000002e-06,3.4883300000000001e-06,3.6373050847457627e-06,3.6464305555555557e-06,3.8064099999999999e-06,3.8110200000000001e-06],"110592":[0.00022748200000000004,0.00023227500000000002,0.00023337475000000007,0.00023799863333333329,0.00023968196428571432,0.00024066274999999998,0.00024125966666666666,0.00024253819999999989,0.0002457735142857143,0.000247445,0.00024787284848484857,0.00024837687179487178,0.00024957274999999986,0.00025032428571428574,0.0002513625000000001,0.00025377900000000009,0.0002538820344827587,0.00025455288461538465,0.00025782166666666662,0.00028213548571428572],"237568":[0.00065047166666666655,0.00065599223076923097,0.00065614925000000016,0.00066970324999999966,0.0006704774545454545,0.00068771800000000014,0.00068847941666666675,0.00068920545454545469,0.00069287830000000028,0.00069495037500000008,0.00069623969999999999,0.0006962749166666666,0.00069746080000000028,0.0006978083636363636,0.00069782818181818166,0.00069848466666666662,0.0007047529999999998,0.00070858500000000018,0.00071870624999999981,0.0009290685999999999],"278528":[0.0007914819,0.00079155330000000006,0.00079180500000000024,0.00079285399999999995,0.00080751950000000042,0.00081440333333333316,0.00081635349999999998,0.0008166995,0.00081709733333333329,0.00081793000000000035,0.00081899577777777804,0.00082179866666666685,0.00082276166666666662,0.00082905450000000003,0.0008322214999999997,0.00083470471428571426,0.00083779087499999991,0.00083787537499999988,0.00083939833333333326,0.00084835399999999995],"496":[5.6830999999999998e-07,5.6960999999999998e-07,5.7219000000000004e-07,5.7333999999999992e-07,5.7429999999999995e-07,5.7534999999999992e-07,5.7566000000000001e-07,5.7624999999999999e-07,5.7655999999999997e-07,5.7657000000000003e-07,5.7668999999999996e-07,5.7797000000000003e-07,5.7897999999999996e-07,5.7967000000000005e-07,5.8014999999999996e-07,5.8026000000000004e-07,5.8131999999999997e-07,5.8390000000000003e-07,5.9890999999999995e-07,6.1119999999999997e-07],"13107200":[0.16291168449999999,0.16351156950000001,0.16376578050000001,0.16428520050000001,0.16436703899999999,0.16476764699999999,0.16494188700000001,0.16495922099999999,0.16544249100000002,0.16558295949999999,0.16563420399999995,0.1657964915,0.165906743,0.165921807,0.16599580799999999,0.16611567599999999,0.166292253,0.1665458115,0.166789455,0.1761073125],"9961472":[0.12343463049999998,0.12375077350000002,0.123804131,0.123840902,0.12384936000000002,0.123864575,0.1240099975,0.1240117865,0.1240193195,0.1241301105,0.1242107755,0.1242243485,0.1245051425,0.124719578,0.125345541,0.12541140049999999,0.12601302850000001,0.12639032550000001,0.12693542350000001,0.1269494545],"5888":[6.95014e-06,6.9537799999999997e-06,6.9576578947368418e-06,6.9590699999999996e-06,6.9594000000000007e-06,6.9602399999999993e-06,6.9605899999999992e-06,6.9640700000000004e-06,6.9642000000000002e-06,6.9715000000000001e-06,7.0850899999999994e-06,7.1202400000000003e-06,7.1352000000000007e-06,7.1866099999999998e-06,7.2604210526315779e-06,7.4002900000000003e-06,7.4108400000000005e-06,7.45711e-06,7.6227187500000003e-06,7.8539299999999999e-06],"11010048":[0.136540523,0.13667315799999999,0.13686004299999999,0.13689369849999999,0.13722064849999999,0.1377302195,0.1377471415,0.137835498,0.13794979499999999,0.13843739849999998,0.13850051600000002,0.13883423350000001,0.13886602050000002,0.13966449199999997,0.13984021250000001,0.14000043950000002,0.14017292249999999,0.1405401725,0.14101767649999999,0.14659124100000001],"1920":[2.1600000000000001e-06,2.1606800000000002e-06,2.16219e-06,2.1625399999999999e-06,2.1628799999999999e-06,2.1629799999999997e-06,2.16345e-06,2.1641000000000002e-06,2.16434e-06,2.1656999999999999e-06,2.1666300000000001e-06,2.16868e-06,2.1732100000000001e-06,2.17324e-06,2.17508e-06,2.1750899999999999e-06,2.1761900000000002e-06,2.1762100000000003e-06,2.17775e-06,2.3698000000000002e-06],"2490368":[0.025548935499999981,0.025560533999999989,0.025812126499999994,0.025863825999999999,0.025917653000000002,0.026034817000000009,0.026099846000000003,0.026113501000000001,0.02613720650000001,0.026138908000000006,0.026168096000000002,0.026186117000000002,0.026293544499999998,0.026336908999999999,0.026378317500000015,0.026387050499999998,0.026524738499999999,0.026556425500000001,0.026646962499999999,0.026704391000000004],"19456":[2.3864999999999999e-05,2.3906000000000001e-05,2.3913e-05,2.402e-05,2.4087000000000002e-05,2.4481000000000002e-05,2.4661999999999999e-05,2.4891741573033706e-05,2.4935853932584269e-05,2.4975999999999999e-05,2.4986000000000001e-05,2.5022333333333336e-05,2.504575e-05,2.521493e-05,2.5218870000000001e-05,2.5346825000000001e-05,2.5515249999999999e-05,2.569959e-05,2.5861000000000002e-05,2.5898090000000001e-05],"57344":[7.8151000000000004e-05,8.1199692307692314e-05,8.1307173913043471e-05,8.1615999999999999e-05,8.1864431818181812e-05,8.2007000000000003e-05,8.2172881720430106e-05,8.2240602941176464e-05,8.2555425531914892e-05,8.2707000000000006e-05,8.2827622448979592e-05,8.3346370370370371e-05,8.3497714285714279e-05,8.3824750000000001e-05,8.3934035714285722e-05,8.4285684210526313e-05,8.502827586206896e-05,8.9657860465116286e-05,9.3646583333333329e-05,9.7284987341772155e-05],"1179648":[0.006833787,0.0068450550000000001,0.0069198189999999981,0.0069199140000000018,0.0070119609999999997,0.007102518999999999,0.0071410190000000002,0.0071801759999999982,0.007319547,0.0073342400000000006,0.0074114470000000016,0.0074393989999999993,0.0074538369999999996,0.0074824149999999992,0.0075079285000000037,0.0075188999999999994,0.0075471209999999995,0.007547382,0.0077790859999999993,0.0078536089999999992],"4718592":[0.053821802000000016,0.053833529000000026,0.054232069500000014,0.054290719000000008,0.054536208500000002,0.054569955000000003,0.054586375999999978,0.054595154,0.054671360000000023,0.054815717,0.0548860485,0.054889677999999997,0.054908085999999988,0.054908672999999998,0.054988552499999996,0.055008732999999997,0.055069862000000004,0.055113422999999974,0.05511837399999997,0.060925876000000004],"360448":[0.0010290873333333335,0.0010361986666666666,0.0010674655,0.001067721666666667,0.0010843716666666663,0.0010865759999999999,0.0010956666666666667,0.0010983270000000001,0.00110005,0.0011025009999999999,0.0011032400000000001,0.001104051,0.0011060836666666666,0.0011103058000000003,0.0011147639999999999,0.0011159825000000001,0.0011222986000000001,0.0011323273333333334,0.0012161036666666664,0.00131311475],"1572864":[0.0126321855,0.012806732000000001,0.012816952499999996,0.0128711355,0.013020410500000001,0.013025153000000001,0.013106956999999997,0.0131460285,0.013242073,0.013242161000000006,0.013300692499999999,0.013332051000000003,0.013333238000000001,0.013406208000000003,0.013411765000000001,0.0134564995,0.013478024999999999,0.013657226999999997,0.014260139,0.014368909499999999],"53248":[7.2050000000000003e-05,7.4705681818181826e-05,7.5197482758620682e-05,7.5302000000000005e-05,7.5411499999999994e-05,7.6111752577319585e-05,7.640376470588235e-05,7.673775555555556e-05,7.6877029411764707e-05,7.7000489999999995e-05,7.7103854166666661e-05,7.7342036144578954e-05,7.7574474747474744e-05,7.760558823529412e-05,7.805933333333334e-05,7.8441909090909095e-05,7.8641019999999996e-05,7.9364935483870972e-05,7.9906499999999998e-05,8.7297787234042563e-05],"3456":[3.9371399999999994e-06,3.9386699999999997e-06,3.9415499999999996e-06,3.9417846153846147e-06,3.9422900000000005e-06,3.9427100000000002e-06,3.9429e-06,3.94468e-06,3.9453300000000006e-06,3.9478300000000001e-06,3.9501199999999994e-06,3.9525099999999997e-06,3.9570499999999997e-06,4.0666199999999999e-06,4.1118356164383563e-06,4.11658e-06,4.1210900000000004e-06,4.1235899999999999e-06,4.1337299999999995e-06,4.3106400000000001e-06],"40960":[5.4033000000000003e-05,5.4045000000000002e-05,5.6660000000000003e-05,5.6891333333333335e-05,5.7163619999999997e-05,5.7196120000000001e-05,5.7206440000000005e-05,5.7221349999999997e-05,5.7243659999999999e-05,5.7255900000000002e-05,5.7382500000000002e-05,5.7576859999999998e-05,5.7923705128205121e-05,5.813871e-05,5.8575548387096774e-05,5.8867553846153846e-05,5.9158294117647058e-05,5.9345999999999997e-05,5.93845e-05,5.9875420000000001e-05],"4608":[5.3559799999999995e-06,5.3577100000000002e-06,5.3591399999999995e-06,5.3598181818181818e-06,5.3601799999999994e-06,5.3602100000000006e-06,5.3616666666666664e-06,5.3626499999999994e-06,5.3645744680851069e-06,5.3646900000000006e-06,5.3685699999999993e-06,5.3713800000000002e-06,5.3735600000000003e-06,5.3870000000000003e-06,5.4718699999999997e-06,5.4753799999999996e-06,5.4894099999999993e-06,5.5112900000000002e-06,5.8791199999999999e-06,5.8942000000000003e-06],"13824":[1.6855e-05,1.6874000000000001e-05,1.6878e-05,1.6897000000000001e-05,1.6922000000000002e-05,1.7055288888888887e-05,1.7122e-05,1.7224367346938776e-05,1.7380270000000002e-05,1.7425220000000002e-05,1.743013e-05,1.745963e-05,1.7472860000000001e-05,1.750308e-05,1.7548040000000001e-05,1.7626999999999999e-05,1.7838000000000001e-05,1.7859719999999999e-05,1.8086969999999999e-05,1.8191629999999999e-05],"819200":[0.0032663140000000002,0.0033377339999999998,0.0034127490000000005,0.0034939530000000002,0.003495345,0.003497025,0.003505766,0.0035198319999999983,0.0035229359999999999,0.0035498679999999999,0.003585956,0.0036437270000000003,0.0036645179999999999,0.0036941080000000002,0.003697615,0.0037769879999999998,0.0037794359999999993,0.003818639,0.0039338409999999996,0.0039451179999999992],"983040":[0.0045154159999999987,0.0046001530000000009,0.0047009210000000003,0.0047209360000000002,0.0047859549999999997,0.004843769999999999,0.0048664479999999998,0.0048791309999999992,0.0048867960000000023,0.0049123479999999987,0.0049649270000000009,0.004976599,0.0050223539999999997,0.0050952529999999984,0.0050988529999999987,0.0052362790000000017,0.0052910069999999986,0.0053443319999999985,0.0058383490000000005,0.0062414329999999985],"8704":[1.0436e-05,1.0446399999999999e-05,1.0458666666666667e-05,1.0475999999999999e-05,1.063783e-05,1.065318e-05,1.0694e-05,1.06996e-05,1.0725039999999999e-05,1.0771000000000001e-05,1.08234e-05,1.085153e-05,1.088101e-05,1.0908989999999999e-05,1.0914509999999999e-05,1.094518e-05,1.1240049999999999e-05,1.13046e-05,1.137931e-05,1.2401100000000001e-05],"120":[1.4989e-07,1.5041000000000001e-07,1.5111000000000001e-07,1.5228000000000001e-07,1.5345999999999997e-07,1.5429000000000001e-07,1.5715e-07,1.5732000000000001e-07,1.5883999999999999e-07,1.5891000000000001e-07,1.5946e-07,1.5988999999999998e-07,1.6025e-07,1.6041000000000002e-07,1.6059000000000001e-07,1.606e-07,1.6081e-07,1.6152999999999999e-07,1.6164000000000001e-07,1.6714e-07],"1024":[1.15323e-06,1.1565099999999999e-06,1.15844e-06,1.15896e-06,1.1602600000000001e-06,1.1604299999999999e-06,1.1609e-06,1.1610500000000001e-06,1.1618499999999999e-06,1.16216e-06,1.16271e-06,1.1628999999999999e-06,1.1647499999999999e-06,1.1654399999999999e-06,1.1658900000000001e-06,1.1670400000000001e-06,1.1681700000000001e-06,1.2031600000000001e-06,1.2190699999999999e-06,1.2820299999999999e-06],"49152":[6.6021749999999995e-05,6.6148000000000004e-05,6.6333000000000003e-05,6.7935999999999995e-05,6.8975500000000004e-05,6.9764190000000005e-05,7.0132780487804877e-05,7.0318090000000006e-05,7.0410390243902431e-05,7.0584849999999992e-05,7.0591660000000008e-05,7.0975089999999997e-05,7.1085315789473687e-05,7.1423840000000002e-05,7.1504923076923084e-05,7.1720980392156859e-05,7.1963578947368428e-05,7.2602999999999996e-05,7.6683965517241378e-05,7.6734779411764703e-05],"524288":[0.001589133,0.0016292260000000005,0.0016482999999999995,0.0016557570000000001,0.0016687429999999997,0.001673264,0.0016879669999999999,0.001691726,0.0017082079999999993,0.001711265999999999,0.001738737,0.001744404,0.0017498980000000004,0.0017541170000000001,0.0017544303333333331,0.0017677200000000008,0.001830742,0.0019206709999999999,0.0019297130000000002,0.0019705395000000009],"45056":[6.2797000000000002e-05,6.2961999999999998e-05,6.3613314814814817e-05,6.3698384615384611e-05,6.4167799999999999e-05,6.4643037037037036e-05,6.4976641509433962e-05,6.5104750000000004e-05,6.5297225000000004e-05,6.5611629999999996e-05,6.5658699999999995e-05,6.5781874999999999e-05,6.6107385714285716e-05,6.6195680000000006e-05,6.6797170000000003e-05,6.6913129999999997e-05,6.7083735632183906e-05,6.7166880000000008e-05,6.7796699999999994e-05,6.9587629629629639e-05],"229376":[0.00063806900000000001,0.00064123049999999997,0.00064344933333333331,0.00064993500000000014,0.00065808999999999985,0.0006647592500000002,0.00066481433333333306,0.00066607335714285705,0.00066889500000000019,0.00067493399999999997,0.00067499899999999991,0.00067567899999999988,0.00067576266666666675,0.0006757847272727273,0.00067638660000000049,0.0006789557499999999,0.00068151500000000038,0.00068297175000000014,0.00068403699999999997,0.00068591316666666681],"2688":[3.0282399999999999e-06,3.0323900000000001e-06,3.0323900000000001e-06,3.0335300000000002e-06,3.0335699999999997e-06,3.0346199999999998e-06,3.0351400000000002e-06,3.0354499999999999e-06,3.0358600000000002e-06,3.0382100000000003e-06,3.0400199999999998e-06,3.0405900000000003e-06,3.0417099999999999e-06,3.0425000000000001e-06,3.0434899999999999e-06,3.0447499999999999e-06,3.0451099999999997e-06,3.1622800000000001e-06,3.168e-06,3.5965500000000003e-06],"152":[1.8847000000000002e-07,1.8892000000000003e-07,1.8939e-07,1.8953e-07,1.9106999999999998e-07,1.9247e-07,1.9334000000000001e-07,1.9411999999999999e-07,1.9422e-07,1.9448000000000001e-07,1.9581999999999999e-07,1.9672e-07,1.9743000000000001e-07,1.9752000000000001e-07,1.9772e-07,1.9777999999999999e-07,1.9780000000000001e-07,1.9786e-07,1.9796000000000001e-07,3.2361999999999998e-07],"5120":[5.9884499999999994e-06,5.9926800000000005e-06,5.9938199999999998e-06,5.9966666666666671e-06,5.99708e-06,5.9971000000000006e-06,5.9978699999999994e-06,5.9992699999999999e-06,6.0011500000000001e-06,6.0016599999999994e-06,6.0020099999999993e-06,6.0098499999999997e-06,6.0146666666666659e-06,6.1192699999999996e-06,6.1561199999999999e-06,6.2586399999999999e-06,6.2922800000000002e-06,6.5725600000000001e-06,6.5924799999999994e-06,7.1210000000000001e-06],"1507328":[0.0115590395,0.011729601499999997,0.011781689,0.011813714499999999,0.01203779,0.012085746,0.012154042,0.012171874499999997,0.012172296500000013,0.012204623,0.012243858,0.012260272000000001,0.012510607999999998,0.0125448195,0.012578871,0.012630802999999999,0.012669225000000001,0.012676629999999999,0.0154863225,0.016945201999999999],"1216":[1.3663900000000001e-06,1.3721499999999999e-06,1.37336e-06,1.37382e-06,1.3742380952380952e-06,1.37498e-06,1.3759199999999999e-06,1.3761099999999999e-06,1.37649e-06,1.3767099999999999e-06,1.3767299999999999e-06,1.3773799999999998e-06,1.37784e-06,1.3793700000000001e-06,1.3823700000000001e-06,1.38278e-06,1.38314e-06,1.3875000000000001e-06,1.4460899999999999e-06,1.4491250000000001e-06],"1966080":[0.018621565,0.018666042000000001,0.018687486,0.018728755499999999,0.018765996,0.018830519,0.018857905999999994,0.018862196000000008,0.018871423000000002,0.018943913999999999,0.0190187065,0.019097625999999999,0.019130557999999999,0.0192185515,0.019281024500000018,0.019334741999999999,0.019349770500000002,0.020027116000000001,0.020065668499999995,0.020268267999999999],"1900544":[0.017755087500000006,0.017833129,0.017842714499999992,0.017880205999999999,0.017883166499999999,0.017915736999999984,0.017936906000000009,0.0179477795,0.01800920399999999,0.018061558500000002,0.018100758500000005,0.018136109000000001,0.018287986999999999,0.018346848999999998,0.018435964499999992,0.0185106425,0.018515256000000001,0.018629868000000001,0.018676363999999994,0.018916910999999998],"184":[2.2758e-07,2.294e-07,2.3028999999999998e-07,2.3169999999999999e-07,2.3173e-07,2.3215e-07,2.3221000000000001e-07,2.3286000000000001e-07,2.3295999999999999e-07,2.3308000000000002e-07,2.3326000000000001e-07,2.3334e-07,2.3382000000000001e-07,2.3459000000000001e-07,2.3728000000000002e-07,2.3989000000000001e-07,2.4252000000000003e-07,2.4256999999999998e-07,2.4369999999999999e-07,2.4801000000000001e-07],"7936":[9.4790000000000002e-06,9.5070000000000006e-06,9.5489999999999995e-06,9.6665499999999998e-06,9.7469199999999995e-06,9.7474799999999997e-06,9.7653299999999999e-06,9.7680000000000003e-06,9.8239999999999995e-06,9.8827600000000002e-06,9.8924600000000012e-06,9.8978299999999991e-06,9.92499e-06,9.9269599999999989e-06,9.9384600000000004e-06,9.9750800000000007e-06,9.9840199999999993e-06,1.021961e-05,1.024285e-05,1.0243590000000001e-05],"3801088":[0.042095034999999989,0.042320363499999999,0.042415707500000024,0.04251340499999999,0.042539366500000023,0.042591327000000012,0.042758354500000005,0.042793137999999988,0.042825929999999998,0.042844115999999988,0.0428588305,0.042910763999999997,0.04295825499999998,0.043044232500000001,0.04312659000000002,0.043155639500000002,0.043267092999999993,0.044346866999999998,0.044769644500000004,0.045146227500000004],"6815744":[0.081193839500000003,0.081304533499999998,0.081320121000000023,0.081340336999999999,0.081409667999999977,0.081683742999999989,0.081754490999999999,0.081808538,0.081987759500000007,0.081995092999999977,0.08205982299999999,0.082097463000000023,0.082230984999999951,0.082279314499999978,0.082364151999999996,0.082373394999999988,0.082519643000000004,0.082596265500000002,0.082623137999999999,0.082751247],"124":[1.5447999999999999e-07,1.5580999999999999e-07,1.5599999999999999e-07,1.5641000000000001e-07,1.5767000000000001e-07,1.6028999999999999e-07,1.6124000000000001e-07,1.6161e-07,1.6217e-07,1.6245999999999999e-07,1.6434e-07,1.646e-07,1.6466000000000002e-07,1.6467999999999999e-07,1.6476e-07,1.6605000000000001e-07,1.6606999999999998e-07,1.6619999999999999e-07,1.6628e-07,1.7209999999999999e-07],"102400":[0.00018451399999999999,0.00019665125,0.00019693909756097558,0.000198469,0.00020177179411764702,0.00020346018181818183,0.00020714560000000001,0.00020832425,0.00021001085,0.00021178463636363628,0.0002119078947368421,0.00021194616666666671,0.00021317173684210527,0.00021350736842105266,0.00021614736363636356,0.00021880546153846145,0.00021890143902439022,0.00022540979999999998,0.0002291758,0.00023052961111111108],"311296":[0.00087760133333333336,0.00088955833333333352,0.00090976133333333319,0.00091848375000000047,0.00092206899999999997,0.0009224255,0.0009263646666666668,0.00092727499999999997,0.00092826566666666627,0.00093107299999999993,0.00093302033333333349,0.00093402249999999969,0.00093570542857142835,0.00093579783333333326,0.00094704999999999995,0.00095051550000000015,0.00095122314285714295,0.0009527773333333333,0.0009645734000000005,0.00098092999999999965],"1408":[1.5837599999999999e-06,1.5868e-06,1.5888799999999998e-06,1.5899100000000001e-06,1.5899999999999998e-06,1.5914799999999998e-06,1.59287e-06,1.5929099999999999e-06,1.59323e-06,1.5947899999999999e-06,1.5959200000000002e-06,1.5968300000000001e-06,1.59715e-06,1.59777e-06,1.59853e-06,1.6007200000000001e-06,1.6013099999999999e-06,1.6023599999999999e-06,1.60307e-06,1.6068000000000002e-06],"393216":[0.001133238,0.0011402375000000001,0.001153762,0.0011675903333333334,0.0011679916000000002,0.001168887,0.0011755046666666667,0.0011817323333333336,0.001186325,0.001191908,0.0012025355,0.0012037823333333334,0.0012098219999999999,0.0012133020000000001,0.001216696,0.0012187964,0.0012282662500000001,0.0012392220000000001,0.001242466,0.0012453605],"4352":[5.0407100000000006e-06,5.0435499999999993e-06,5.0451999999999996e-06,5.0464200000000002e-06,5.0470599999999992e-06,5.0474999999999995e-06,5.0489299999999996e-06,5.0533700000000002e-06,5.05545e-06,5.0580499999999998e-06,5.0590499999999994e-06,5.0603699999999995e-06,5.0668899999999999e-06,5.0684399999999999e-06,5.0695700000000002e-06,5.0813333333333334e-06,5.2423099999999996e-06,5.2906700000000005e-06,5.4091399999999998e-06,5.5272999999999996e-06],"6553600":[0.077726536499999999,0.077817168000000006,0.077874248499999993,0.077987039000000008,0.078082152000000044,0.078165180499999973,0.078195955499999997,0.078284220000000043,0.07854559450000001,0.078620589000000005,0.078659293500000005,0.078711598000000021,0.078738231000000006,0.07875846850000004,0.078769335999999995,0.078808064000000025,0.078991460500000013,0.079223040000000008,0.079370167999999977,0.081155515500000025],"20480":[2.5147000000000002e-05,2.5184000000000001e-05,2.5191999999999999e-05,2.5270999999999999e-05,2.5462000000000001e-05,2.5613999999999999e-05,2.5700000000000001e-05,2.5899000000000001e-05,2.5964000000000001e-05,2.6151000000000001e-05,2.6183921874999999e-05,2.6302999999999999e-05,2.6318499999999999e-05,2.6548999999999999e-05,2.6732700000000002e-05,2.698287e-05,2.7099460000000001e-05,2.7620549999999998e-05,2.7753559322033899e-05,2.7779900000000001e-05],"608":[6.9351999999999993e-07,6.9459999999999999e-07,6.9463999999999993e-07,6.9468999999999993e-07,6.9686999999999997e-07,6.9930000000000002e-07,6.9998000000000005e-07,7.0003000000000006e-07,7.0038999999999993e-07,7.0067999999999989e-07,7.0097000000000006e-07,7.0097000000000006e-07,7.0492000000000004e-07,7.0549e-07,7.0571000000000004e-07,7.0605000000000011e-07,7.0846000000000003e-07,7.2991999999999991e-07,7.3368000000000004e-07,7.3454999999999992e-07],"2228224":[0.022148409000000001,0.022180935499999999,0.022394805,0.022403132500000002,0.022404259500000002,0.022414390499999999,0.022418407999999994,0.022430078499999999,0.0224542935,0.022469060500000002,0.022508256499999997,0.022564738499999994,0.022599314499999999,0.022704031,0.022863501499999998,0.0231384655,0.023987413999999995,0.025015120000000002,0.025442707499999988,0.0269700865],"36864":[4.9563609195402301e-05,5.003135e-05,5.0144e-05,5.0175688888888893e-05,5.0540968421052633e-05,5.0697040000000002e-05,5.0872060000000001e-05,5.0975040000000002e-05,5.1064730000000001e-05,5.1310860000000001e-05,5.1486830000000005e-05,5.1622597826086962e-05,5.1818389999999998e-05,5.1988240000000001e-05,5.2023269999999998e-05,5.2082970000000001e-05,5.2421580000000005e-05,5.2451833333333332e-05,5.4311180722891569e-05,5.7212e-05],"704":[7.9536999999999995e-07,8.0006000000000003e-07,8.0031000000000005e-07,8.0108999999999998e-07,8.0365999999999998e-07,8.0416000000000002e-07,8.0419e-07,8.0425000000000007e-07,8.0518000000000001e-07,8.0624000000000005e-07,8.0730999999999994e-07,8.0739999999999999e-07,8.0739999999999999e-07,8.0826000000000001e-07,8.0964999999999995e-07,8.1068e-07,8.1091e-07,8.1106999999999997e-07,8.1130000000000007e-07,8.3516999999999998e-07],"720896":[0.002753536,0.0027722475,0.0027851585,0.0028037334999999998,0.002840444000000001,0.002843473,0.002861798,0.002870062,0.0029078034999999993,0.0029316059999999998,0.0029474829999999999,0.0029644740000000012,0.0029909855,0.0030079079999999997,0.0030116099999999988,0.0030171454999999995,0.0030437140000000007,0.003069202,0.0032788294999999989,0.003307595],"800":[8.9894000000000003e-07,9.0476000000000006e-07,9.0555000000000006e-07,9.0656999999999994e-07,9.0808000000000002e-07,9.0878999999999992e-07,9.1098999999999998e-07,9.1229000000000008e-07,9.1307999999999997e-07,9.1420000000000007e-07,9.1462999999999998e-07,9.1465999999999996e-07,9.1498e-07,9.1617999999999999e-07,9.1633999999999996e-07,9.1658999999999998e-07,9.1689999999999996e-07,9.1762999999999999e-07,9.6019000000000008e-07,9.6379999999999999e-07],"2621440":[0.0273360245,0.027474670499999999,0.027480770499999981,0.027489058,0.0275085435,0.027590792499999999,0.027600327500000001,0.0276109545,0.0276952195,0.027787415500000016,0.0278498075,0.027854032500000007,0.027856209,0.027902607999999995,0.027909910499999989,0.027998044999999999,0.028015265000000011,0.028022322500000002,0.028041039,0.028157668],"425984":[0.001234749,0.001244893,0.001253449,0.001270605,0.0012790144999999999,0.0012928264999999999,0.0012966015,0.0013083110000000004,0.001316331,0.0013344349999999999,0.001334668,0.001336533,0.001337888,0.00133887825,0.001350501,0.0013506360000000001,0.0013560025,0.0013621614999999999,0.0013652015000000001,0.0013776304999999997],"32768":[4.1344999999999998e-05,4.2338217391304346e-05,4.324183333333333e-05,4.3263999999999998e-05,4.3533169999999996e-05,4.3660299999999999e-05,4.3859639999999999e-05,4.4098089999999996e-05,4.411364e-05,4.4610099999999995e-05,4.4835368421052631e-05,4.4998679999999999e-05,4.5112235294117643e-05,4.5241989999999997e-05,4.5351320000000002e-05,4.536636842105263e-05,4.5391888888888886e-05,4.5587139999999999e-05,4.5727529999999994e-05,4.9048000000000002e-05],"12058624":[0.15017122100000002,0.15104078450000002,0.15106655450000001,0.15112249500000002,0.15119258050000001,0.15148560700000002,0.1515244255,0.15171686349999999,0.15205178050000001,0.15253927449999999,0.15298517299999997,0.15301653849999999,0.15307997249999999,0.1532565595,0.153282631,0.15341197099999998,0.15369985000000003,0.15372503300000001,0.15413841850000001,0.16231642199999999],"128":[1.5834e-07,1.6002e-07,1.606e-07,1.6191000000000003e-07,1.6217999999999999e-07,1.6218999999999997e-07,1.6274000000000001e-07,1.6514000000000001e-07,1.6578999999999998e-07,1.6654000000000001e-07,1.6805e-07,1.681e-07,1.6837000000000002e-07,1.6849e-07,1.6901999999999999e-07,1.6953999999999999e-07,1.7016999999999999e-07,1.7037999999999999e-07,1.7048e-07,1.7057e-07],"180224":[0.0004776309999999999,0.00048259349999999981,0.00048325100000000024,0.00048500966666666665,0.00049249666666666679,0.0004963280000000002,0.00049788333333333334,0.00049790021428571429,0.00050034649999999999,0.00050121233333333339,0.00050243593750000002,0.00050249529411764706,0.00050642912500000001,0.00050987800000000018,0.000510328,0.00051119220000000001,0.00051237520000000009,0.00051335474999999998,0.00051364706666666665,0.00053005700000000001],"224":[2.6828000000000002e-07,2.6866999999999998e-07,2.6883000000000001e-07,2.7112000000000001e-07,2.7337000000000002e-07,2.7374000000000001e-07,2.7441999999999999e-07,2.7463000000000002e-07,2.7472000000000001e-07,2.7532999999999996e-07,2.7543999999999998e-07,2.7589999999999998e-07,2.7688999999999999e-07,2.7752000000000001e-07,2.7795000000000002e-07,2.7984e-07,2.8736e-07,2.8885e-07,2.9011e-07,2.9112999999999999e-07],"736":[8.3261000000000004e-07,8.3290999999999996e-07,8.3380999999999992e-07,8.3578999999999994e-07,8.3822999999999996e-07,8.3988999999999993e-07,8.4065000000000005e-07,8.4074999999999995e-07,8.4098999999999991e-07,8.4229000000000001e-07,8.432600000000001e-07,8.4374000000000001e-07,8.4492000000000008e-07,8.4494999999999995e-07,8.4835999999999995e-07,8.4868e-07,8.4891999999999995e-07,8.5340000000000006e-07,8.7584999999999994e-07,8.8085999999999996e-07],"320":[3.7527999999999996e-07,3.7641000000000002e-07,3.7676000000000005e-07,3.7698999999999999e-07,3.7835e-07,3.7880999999999999e-07,3.7934000000000001e-07,3.7941999999999999e-07,3.7966999999999996e-07,3.8062000000000003e-07,3.8244999999999999e-07,3.8391e-07,3.8417999999999999e-07,3.8435000000000002e-07,3.8485999999999997e-07,3.8529999999999999e-07,3.8571000000000003e-07,3.8631999999999998e-07,3.9729999999999999e-07,4.0392000000000003e-07],"557056":[0.0017474839999999999,0.0017597305000000001,0.0017941770000000005,0.0017967199999999999,0.0017989389999999994,0.001845352,0.001864295,0.001871761,0.001875594,0.0018758495000000008,0.001880336,0.0018914185000000003,0.001917801,0.0019198155,0.00192373,0.001930785,0.0019602524999999993,0.0019688175,0.0020079590000000006,0.0021337424999999998],"832":[9.375299999999999e-07,9.4456999999999994e-07,9.4488999999999999e-07,9.4592999999999989e-07,9.4628000000000003e-07,9.4716999999999992e-07,9.4789e-07,9.485e-07,9.4864000000000006e-07,9.4908999999999998e-07,9.4914999999999995e-07,9.503100000000001e-07,9.5058999999999999e-07,9.5082999999999995e-07,9.5123000000000008e-07,9.5254000000000003e-07,9.5354999999999996e-07,9.5371000000000014e-07,9.5426000000000008e-07,1.04093e-06],"9437184":[0.11490649149999999,0.115519739,0.115582357,0.11569937700000001,0.115885192,0.11616312399999995,0.11619421200000001,0.11624426249999997,0.11625597999999999,0.116400961,0.1164671275,0.1166742905,0.1166784745,0.1167052445,0.116740328,0.116769578,0.116866461,0.116894347,0.117108897,0.11719262699999999],"3584":[4.0912300000000003e-06,4.09194e-06,4.0947299999999995e-06,4.0953333333333338e-06,4.09573e-06,4.0958599999999998e-06,4.09596e-06,4.0967400000000004e-06,4.0972200000000001e-06,4.0973499999999998e-06,4.0977260273972604e-06,4.0983199999999999e-06,4.1036e-06,4.1076299999999998e-06,4.2759e-06,4.2830600000000003e-06,4.2858099999999995e-06,4.2931200000000002e-06,4.49708e-06,4.83347e-06],"6291456":[0.074185702500000006,0.07436789849999996,0.074440488999999999,0.074448080999999972,0.074494166000000001,0.074526068500000001,0.074789136000000006,0.074920078000000015,0.075108955000000005,0.075158805500000037,0.075199719999999998,0.075229391499999992,0.075259884999999999,0.075297215000000001,0.075449017499999993,0.075463634000000002,0.075470836499999999,0.075490071500000006,0.076846107000000025,0.077428732],"256":[3.0198000000000001e-07,3.0298999999999999e-07,3.0435e-07,3.0467000000000004e-07,3.0725999999999996e-07,3.0863999999999999e-07,3.0961999999999999e-07,3.0968e-07,3.1124999999999998e-07,3.1137999999999997e-07,3.1159e-07,3.1201e-07,3.1252e-07,3.1272999999999997e-07,3.1388e-07,3.2475000000000005e-07,3.2654999999999997e-07,3.2793000000000005e-07,3.4257000000000003e-07,3.6013000000000004e-07],"15204352":[0.19059912499999998,0.19070108399999997,0.191479072,0.19182405450000001,0.19212030199999999,0.19213271900000001,0.1922829995,0.19275759949999999,0.19283707150000001,0.19317826099999999,0.193243742,0.193351464,0.1936514725,0.193675862,0.19374709800000001,0.19377808800000001,0.19392915099999999,0.19480899199999999,0.194838337,0.19510541849999999],"28672":[3.5843000000000002e-05,3.5920000000000002e-05,3.6467000000000002e-05,3.7192369999999998e-05,3.7280999999999998e-05,3.7405112903225802e-05,3.7425610000000004e-05,3.7439069999999997e-05,3.7460145454545453e-05,3.7503000000000003e-05,3.7536333333333335e-05,3.7672035087719298e-05,3.7783819999999997e-05,3.7865180000000003e-05,3.8125679999999998e-05,3.8188839999999999e-05,3.8256409999999996e-05,3.853195e-05,3.8988882352941173e-05,4.27584e-05],"768":[8.6643000000000006e-07,8.6885000000000005e-07,8.7194000000000001e-07,8.7382000000000003e-07,8.7440000000000005e-07,8.7487999999999996e-07,8.7527000000000003e-07,8.7649999999999999e-07,8.7718000000000002e-07,8.7836000000000009e-07,8.783799999999999e-07,8.7844999999999993e-07,8.7882999999999994e-07,8.7932000000000001e-07,8.8035999999999992e-07,8.8115000000000003e-07,8.8127000000000006e-07,8.8127999999999991e-07,8.8239000000000006e-07,9.2030999999999996e-07],"212992":[0.0005836245384615383,0.00058980300000000018,0.00059084999999999997,0.00059229200000000001,0.00059405150000000002,0.00060344475,0.00060987739999999969,0.00060999600000000002,0.00061620566666666674,0.00061690619999999982,0.00061770133333333328,0.00061791916666666656,0.00061827358333333326,0.00061840300000000001,0.00062237476923076923,0.00062781849999999999,0.00064031036363636359,0.00064350622222222246,0.00064471839999999999,0.00064980150000000004],"864":[9.7449999999999994e-07,9.7906999999999989e-07,9.8170000000000006e-07,9.8236000000000007e-07,9.8371000000000006e-07,9.8493999999999992e-07,9.8502000000000002e-07,9.8591000000000002e-07,9.8651000000000006e-07,9.8660999999999986e-07,9.8806000000000007e-07,9.8838999999999987e-07,9.8846999999999996e-07,9.8881000000000002e-07,9.8950000000000001e-07,9.898100000000001e-07,9.8998999999999999e-07,9.9083999999999994e-07,9.9178999999999991e-07,1.0296100000000001e-06],"352":[4.0927000000000001e-07,4.1058000000000001e-07,4.1121000000000004e-07,4.1124999999999998e-07,4.1341000000000005e-07,4.1483000000000002e-07,4.1538e-07,4.1539000000000002e-07,4.1594e-07,4.1603e-07,4.1609000000000002e-07,4.1654e-07,4.1711000000000001e-07,4.1782000000000002e-07,4.2047000000000001e-07,4.2234000000000001e-07,4.2303e-07,4.2440000000000002e-07,4.3679999999999999e-07,4.4005999999999998e-07],"253952":[0.00070537000000000009,0.00071521600000000007,0.00071681000000000023,0.00071973200000000027,0.00072045759999999996,0.00072343366666666653,0.00072358399999999988,0.00072710899999999987,0.00073716699999999994,0.00074164399999999985,0.0007439655555555552,0.00074979119999999994,0.00075375449999999999,0.00075454166666666682,0.00075870416666666671,0.00076040366666666663,0.00076087963636363638,0.00076701242857142842,0.000773315,0.00077973833333333336],"960":[1.08649e-06,1.0879e-06,1.08962e-06,1.08994e-06,1.09017e-06,1.09103e-06,1.0912499999999999e-06,1.0918099999999999e-06,1.0918699999999999e-06,1.09238e-06,1.09248e-06,1.0929199999999999e-06,1.093e-06,1.0945399999999999e-06,1.0952699999999999e-06,1.09729e-06,1.09861e-06,1.1344699999999999e-06,1.1866799999999999e-06,1.27999e-06],"24576":[3.0295818181818182e-05,3.0324999999999998e-05,3.0334777777777779e-05,3.0367750000000001e-05,3.1517490000000004e-05,3.1582060000000001e-05,3.1649809999999997e-05,3.1662999999999998e-05,3.1717000000000001e-05,3.1721750000000002e-05,3.1727444444444439e-05,3.1731874999999998e-05,3.1738749999999998e-05,3.1742499999999996e-05,3.1839340000000001e-05,3.1905629999999997e-05,3.2021939999999995e-05,3.2245610000000002e-05,3.2464450000000424e-05,3.2770249999999997e-05],"7680":[9.1748000000000007e-06,9.1756666666666658e-06,9.1783636363636362e-06,9.31682e-06,9.3171299999999997e-06,9.3420100000000004e-06,9.3560300000000003e-06,9.3599799999999988e-06,9.3797399999999987e-06,9.3824299999999989e-06,9.3991400000000006e-06,9.4059199999999989e-06,9.454173913043478e-06,9.4995100000000001e-06,9.50302e-06,9.7970599999999987e-06,9.9318200000000001e-06,9.95681e-06,1.0899950000000001e-05,1.0909e-05],"294912":[0.00080484399999999987,0.00082587349999999993,0.00083737025000000002,0.00084412024999999961,0.00084692375000000012,0.00086284333333333323,0.00086350699999999969,0.00086867000000000042,0.00086975300000000002,0.000872444,0.00087911299999999994,0.0008911973333333332,0.00089276899999999964,0.0008959543333333334,0.00089977275,0.00090373228571428575,0.000906688,0.00091548600000000008,0.00091914850000000023,0.00092149959999999998],"1048576":[0.0053294390000000001,0.0054085959999999999,0.0054217499999999986,0.0054322059999999993,0.0054915840000000007,0.0055931870000000012,0.0056738250000000169,0.0056798380000000013,0.0057503429999999998,0.0057759350000000003,0.0057833700000000004,0.005852678,0.005897771999999999,0.0058996640000000006,0.005941366,0.0062238480000000023,0.0062271240000000023,0.0064170489999999967,0.0073171630000000015,0.0084762880000000037],"10485760":[0.12942577700000002,0.12950031200000001,0.12981231250000003,0.13020504100000002,0.13061806649999999,0.13077395050000001,0.13107379,0.13114482750000001,0.13118513500000001,0.13162293950000001,0.131793196,0.1317938605,0.1318843895,0.132003802,0.13211625199999999,0.13223702199999998,0.13233700600000001,0.13248819649999999,0.13321497500000001,0.134207203],"344064":[0.00098551199999999959,0.00099392800000000004,0.00099801983333333306,0.00099915149999999994,0.00099948899999999946,0.0010082086666666666,0.0010195080000000001,0.0010202409999999999,0.0010261156666666669,0.001028693,0.0010374036666666666,0.0010409589999999999,0.0010433215,0.0010448985,0.001048546,0.001050921,0.0010526310000000001,0.0010534380000000007,0.0010714213999999996,0.0010825945999999999],"288":[3.3612000000000002e-07,3.3660999999999999e-07,3.3779000000000001e-07,3.3902000000000003e-07,3.3961000000000001e-07,3.4312000000000002e-07,3.4316000000000001e-07,3.4331000000000002e-07,3.4378999999999998e-07,3.4455999999999996e-07,3.4481999999999999e-07,3.4699000000000001e-07,3.4743999999999999e-07,3.4786999999999995e-07,3.4863999999999998e-07,3.5614000000000001e-07,3.6362999999999998e-07,3.6366999999999997e-07,3.7725000000000002e-07,4.0098999999999999e-07],"1152":[1.2969699999999998e-06,1.29749e-06,1.29841e-06,1.30085e-06,1.3018099999999998e-06,1.30226e-06,1.3025199999999999e-06,1.3036800000000002e-06,1.3043700000000002e-06,1.3051600000000002e-06,1.3052199999999999e-06,1.3055400000000001e-06,1.30569e-06,1.3069700000000002e-06,1.3071599999999999e-06,1.3079800000000001e-06,1.30955e-06,1.3110800000000001e-06,1.31116e-06,1.31153e-06],"384":[4.4495000000000002e-07,4.4691000000000002e-07,4.4793000000000001e-07,4.4879000000000004e-07,4.5003000000000001e-07,4.5080000000000004e-07,4.5209000000000002e-07,4.5303999999999999e-07,4.5373000000000003e-07,4.5410000000000002e-07,4.5417999999999995e-07,4.5451999999999997e-07,4.5457999999999998e-07,4.5535999999999997e-07,4.5680000000000001e-07,4.5738999999999999e-07,4.6452999999999999e-07,4.6752000000000005e-07,4.7635e-07,4.9855000000000008e-07],"2304":[2.5903900000000004e-06,2.5936699999999999e-06,2.5946200000000002e-06,2.59843e-06,2.5989999999999996e-06,2.59963e-06,2.60075e-06,2.6016000000000002e-06,2.6027000000000001e-06,2.6032099999999998e-06,2.6037599999999997e-06,2.6038299999999999e-06,2.6039299999999997e-06,2.6056600000000001e-06,2.60615e-06,2.6076199999999999e-06,2.61e-06,2.7175099999999997e-06,2.7232100000000003e-06,2.7260099999999997e-06],"896":[1.0028500000000001e-06,1.00574e-06,1.01263e-06,1.01779e-06,1.0178499999999999e-06,1.01803e-06,1.01862e-06,1.0199e-06,1.0212700000000001e-06,1.0215399999999999e-06,1.02185e-06,1.02228e-06,1.02248e-06,1.0233400000000001e-06,1.02439e-06,1.0249699999999999e-06,1.0271699999999999e-06,1.0701200000000001e-06,1.07064e-06,1.1232599999999999e-06],"480":[5.4529999999999999e-07,5.4644000000000001e-07,5.5084000000000003e-07,5.5301e-07,5.5346000000000003e-07,5.5581999999999996e-07,5.5754999999999996e-07,5.5797999999999997e-07,5.5827000000000004e-07,5.5855000000000004e-07,5.5917e-07,5.5917e-07,5.6088999999999994e-07,5.6125000000000003e-07,5.6159999999999995e-07,5.6282000000000006e-07,5.6292000000000007e-07,5.8357999999999999e-07,5.8675000000000004e-07,6.0331999999999993e-07],"1441792":[0.0107401105,0.0107814255,0.0108517215,0.010874106,0.010910484,0.0109759935,0.01102881,0.011059376499999999,0.0111457655,0.011190568999999999,0.0112219155,0.0112480095,0.011282928500000001,0.011286153,0.011331753999999996,0.011371192,0.011485795,0.011624532999999999,0.011906195,0.012105652500000001],"992":[1.11666e-06,1.1176299999999999e-06,1.12042e-06,1.1213800000000001e-06,1.12236e-06,1.12299e-06,1.1250499999999999e-06,1.12565e-06,1.1260699999999999e-06,1.1268035714285714e-06,1.1273200000000001e-06,1.1284099999999999e-06,1.1295200000000001e-06,1.1296e-06,1.1317700000000001e-06,1.1330199999999999e-06,1.1357800000000001e-06,1.1382e-06,1.16927e-06,1.17023e-06],"3968":[4.5583e-06,4.5604800000000001e-06,4.5661899999999997e-06,4.5674399999999999e-06,4.5692199999999999e-06,4.5710199999999996e-06,4.57243e-06,4.57243e-06,4.57404e-06,4.5748799999999995e-06,4.5753099999999999e-06,4.57536e-06,4.5760400000000002e-06,4.5795800000000005e-06,4.7338700000000001e-06,4.7756699999999995e-06,4.7891200000000002e-06,4.7905600000000001e-06,4.7950499999999999e-06,4.9225400000000001e-06],"6400":[7.5806400000000001e-06,7.5856400000000001e-06,7.5870399999999998e-06,7.5897666666666672e-06,7.5958125000000002e-06,7.59874e-06,7.6857199999999997e-06,7.6926100000000005e-06,7.7254999999999991e-06,7.7729999999999999e-06,7.8295199999999999e-06,7.8384699999999992e-06,7.8580100000000007e-06,7.8799700000000004e-06,7.9505600000000003e-06,7.9534200000000005e-06,8.0794299999999997e-06,8.3425100000000009e-06,8.9648200000000007e-06,9.0264299999999992e-06],"1344":[1.5178699999999999e-06,1.5192333333333334e-06,1.5194699999999998e-06,1.5206299999999999e-06,1.5216800000000001e-06,1.5220100000000001e-06,1.52286e-06,1.5241000000000002e-06,1.5242700000000002e-06,1.52461e-06,1.52497e-06,1.52519e-06,1.5264299999999999e-06,1.5268000000000001e-06,1.5273000000000002e-06,1.5284700000000001e-06,1.5288099999999999e-06,1.5289399999999999e-06,1.5290999999999999e-06,1.5313100000000001e-06],"126976":[0.00030106399999999998,0.00030235450000000002,0.0003029126666666666,0.00031235166666666669,0.00031364700000000012,0.00031425566666666663,0.0003149417741935482,0.00031517751724137916,0.00031590340909090907,0.00031720040000000004,0.00031838833333333339,0.00032000227999999991,0.00032015959999999997,0.00032016499999999991,0.00032055850000000015,0.00032167449999999999,0.00032217082142857142,0.00032241919230769229,0.00032288499999999986,0.00032301200000000002],"2883584":[0.0306166665,0.030722589500000015,0.0307268235,0.030804830999999998,0.030940726500000008,0.031028071499999994,0.031029881000000002,0.031056518999999998,0.031079843000000006,0.031211153999999998,0.0312114205,0.031212519500000001,0.0312449315,0.031299887000000005,0.031337827999999998,0.031375631000000001,0.031577805,0.031620482999999991,0.031743182000000002,0.031988190999999999],"753664":[0.0029181930000000012,0.0029381009999999994,0.0029517150000000002,0.0029651980000000001,0.0030043399999999999,0.0030118789999999999,0.0030216549999999998,0.0030557470000000002,0.0030669930000000001,0.0030677400000000002,0.0030864710000000008,0.0031277459999999998,0.0031624890000000001,0.0032044349999999985,0.0032321510000000004,0.0032707370000000001,0.0033331609999999998,0.0033808389999999988,0.0034243629999999984,0.0046968629999999999],"16384":[2.01305e-05,2.069153623188406e-05,2.0739624999999999e-05,2.0757380000000001e-05,2.0767910000000002e-05,2.0787688524590165e-05,2.0794490000000002e-05,2.08013e-05,2.0813449275362321e-05,2.0824869999999999e-05,2.0831399999999998e-05,2.0858650000000001e-05,2.0859860000000001e-05,2.0866890000000001e-05,2.0902590000000001e-05,2.0937500000000001e-05,2.0971e-05,2.1211340000000001e-05,2.126683e-05,2.3758333333333333e-05],"131072":[0.00031567280000000002,0.00031871996666666666,0.0003204472500000001,0.0003238715,0.00032401020689655166,0.00032606720000000016,0.00032657158620689661,0.00032870138461538461,0.00032970249999999998,0.00033181949999999981,0.0003342916,0.00033431380000000009,0.00033690462500000012,0.00033760799999999998,0.00033857033333333343,0.00034056514285714287,0.00034074666666666654,0.00034250363999999985,0.00034594071999999993,0.00035157366666666668],"458752":[0.0013439615,0.001349318,0.0013818929999999999,0.001385028,0.001387524,0.0014063857500000005,0.0014112923333333333,0.0014191500000000001,0.0014202552499999999,0.0014241855000000001,0.001445743,0.0014498200000000005,0.0014682854999999999,0.00146835,0.0014765450000000005,0.001485779,0.0015145310000000004,0.0015374289999999999,0.0015552950000000004,0.0016638529999999994],"172032":[0.00045483131249999999,0.00045754087500000001,0.00045983723529411752,0.0004599025,0.00046259824999999997,0.0004631133333333334,0.00046412899999999976,0.00046958516666666654,0.00047183631578947351,0.0004720123125,0.00047311676923076935,0.0004741655000000002,0.00047648193333333332,0.00047750074999999983,0.00047798287500000003,0.00047927199999999988,0.00048028585000000018,0.00048189100000000003,0.00048304175000000017,0.00049971728571428578],"12288":[1.491711111111111e-05,1.4922176470588236e-05,1.492246153846154e-05,1.4963999999999999e-05,1.4966e-05,1.538555e-05,1.5440339999999998e-05,1.5459090000000002e-05,1.5483029999999999e-05,1.5496860000000001e-05,1.554445e-05,1.5614669999999999e-05,1.5615823529411764e-05,1.5745320000000001e-05,1.5838709999999999e-05,1.5890230000000001e-05,1.5914999999999999e-05,1.6056999999999999e-05,1.6299409999999999e-05,1.6384430000000001e-05],"14680064":[0.18391644600000001,0.18405116299999999,0.18423935499999999,0.18426589800000001,0.1843448315,0.18436980650000001,0.18439655799999999,0.18491711999999999,0.18601406700000001,0.18601954900000001,0.18620456699999999,0.18634950900000002,0.18642742700000001,0.18645706149999999,0.186472471,0.18659748099999995,0.18665804599999999,0.18695506550000002,0.18734906300000001,0.18863328600000001],"1536":[1.73122e-06,1.73126e-06,1.7357299999999999e-06,1.7360599999999999e-06,1.7364499999999999e-06,1.7372799999999999e-06,1.7373399999999999e-06,1.7375600000000001e-06,1.73762e-06,1.7382199999999999e-06,1.7403099999999999e-06,1.7406100000000002e-06,1.7416499999999999e-06,1.7426000000000001e-06,1.7426400000000001e-06,1.74315e-06,1.74341e-06,1.7444e-06,1.7471724137931034e-06,1.7472599999999999e-06],"25600":[3.16235e-05,3.16515e-05,3.1683000000000001e-05,3.2740875000000002e-05,3.2818570000000002e-05,3.2854893617021276e-05,3.3101505263157892e-05,3.3123639999999999e-05,3.3131666666666667e-05,3.31505e-05,3.3331129999999999e-05,3.3537810000000003e-05,3.3622359999999996e-05,3.380491e-05,3.3836650000000004e-05,3.3945000000000001e-05,3.4303159999999998e-05,3.4332989999999997e-05,3.6843549999999997e-05,3.7870000000000002e-05],"1835008":[0.016611055,0.016764730500000009,0.016794183000000001,0.0169243055,0.016974794000000001,0.017012201499999994,0.0170126385,0.017061320500000001,0.017070466999999999,0.0170761855,0.017110165,0.017180708999999999,0.017200884499999999,0.017214311,0.0173413205,0.017352352500000001,0.0174082765,0.017536196,0.017802185000000002,0.018110496],"10752":[1.3005e-05,1.301807142857143e-05,1.3026777777777778e-05,1.3061000000000001e-05,1.3352119999999998e-05,1.3363069999999999e-05,1.3372930000000001e-05,1.338859e-05,1.341367e-05,1.3435070000000001e-05,1.3445009999999998e-05,1.3472340000000001e-05,1.348127e-05,1.348848e-05,1.3549809999999999e-05,1.36113e-05,1.36634e-05,1.4008320000000001e-05,1.402017e-05,1.411574e-05],"21504":[2.6472999999999999e-05,2.6489e-05,2.6784999999999999e-05,2.715553e-05,2.7308999999999999e-05,2.750376e-05,2.7584570000000001e-05,2.7669333333333333e-05,2.7710000000000001e-05,2.7718000000000001e-05,2.7725999999999998e-05,2.7764649999999504e-05,2.7810819999999999e-05,2.7942980000000002e-05,2.7994e-05,2.8100349999999999e-05,2.8963410000000002e-05,2.9023999999999999e-05,2.9138000000000001e-05,3.1504000000000002e-05],"7602176":[0.09129309599999999,0.091302704500000012,0.091580476500000008,0.091856519999999955,0.091899594500000042,0.092187945999999993,0.092192627999999971,0.092258489000000027,0.092285393999999993,0.092400133999999995,0.092537565000000002,0.092557214000000027,0.092694149999999961,0.092698458499999997,0.092797399499999961,0.092886375000000021,0.09288883699999996,0.092903495999999974,0.092977351999999999,0.093106126999999983],"5632":[6.6112299999999999e-06,6.6219900000000004e-06,6.6229099999999996e-06,6.6233799999999994e-06,6.6237200000000003e-06,6.6249300000000003e-06,6.63873e-06,6.6403100000000005e-06,6.6412857142857143e-06,6.6446300000000003e-06,6.7633799999999998e-06,6.7748199999999996e-06,6.7793100000000003e-06,6.8348400000000004e-06,6.9298400000000004e-06,6.9395000000000002e-06,6.9455942028985512e-06,6.9592999999999996e-06,7.2811700000000003e-06,7.8763900000000007e-06],"10":[2.6149999999999999e-08,2.6149999999999999e-08,2.6149999999999999e-08,2.6149999999999999e-08,2.6149999999999999e-08,2.6160000000000001e-08,2.6160000000000001e-08,2.6160000000000001e-08,2.6160000000000001e-08,2.6160000000000001e-08,2.6170000000000002e-08,2.7360000000000001e-08,2.7360000000000001e-08,2.7360000000000001e-08,2.7379999999999998e-08,2.7379999999999998e-08,2.7939999999999997e-08,2.871e-08,2.8749999999999999e-08,2.8789999999999998e-08],"3145728":[0.034256886,0.034300626000000001,0.034303930000000017,0.034367389499999998,0.034455417999999981,0.034466130999999983,0.0345542535,0.034554825499999983,0.034580125000000017,0.034589561999999983,0.0346441345,0.034674343500000024,0.034823933999999987,0.034849302999999998,0.035056509999999992,0.035177720499999975,0.035224963000000012,0.035277967,0.03533037499999999,0.035476225],"245760":[0.0006855454999999996,0.00069050919999999992,0.00069068866666666671,0.00070192699999999987,0.00070756750000000037,0.0007080433000000001,0.00070941850000000002,0.00071651350000000028,0.00071703350000000023,0.00072033477777777783,0.00072086300000000019,0.00072424300000000007,0.00072769485714285721,0.00073006230000000039,0.00073127649999999962,0.00073199090909090907,0.00073324887500000001,0.0007386160000000001,0.00075096699999999985,0.00076640524999999993],"1728":[1.9449100000000001e-06,1.9470800000000003e-06,1.9473899999999999e-06,1.9484799999999999e-06,1.9494099999999998e-06,1.9521299999999999e-06,1.9527100000000002e-06,1.9536400000000001e-06,1.9539099999999999e-06,1.95488e-06,1.9549800000000002e-06,1.95603e-06,1.958872340425532e-06,1.9588799999999999e-06,1.9589699999999998e-06,1.9596400000000001e-06,1.9596499999999999e-06,1.96367e-06,1.9649700000000003e-06,1.9653399999999999e-06],"11":[2.8949999999999998e-08,2.8979999999999999e-08,2.901e-08,2.9019999999999998e-08,2.9019999999999998e-08,2.9019999999999998e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.9029999999999999e-08,2.908e-08,2.9720000000000001e-08,3.0359999999999995e-08,3.037e-08,3.0379999999999998e-08,3.0540000000000001e-08,3.18e-08],"1114112":[0.0061457490000000024,0.0061579960000000006,0.0061749440000000025,0.006218744999999996,0.0063454330000000001,0.0063575840000000012,0.0063820079999999998,0.0064498729999999975,0.006466945,0.0065111219999999985,0.006540339,0.0066031759999999997,0.0066181160000000003,0.0066529319999999977,0.006674379999999998,0.0067016089999999999,0.0067926380000000036,0.0068711959999999978,0.0080219764999999964,0.0094136550000000017],"12":[2.8959999999999999e-08,2.9309999999999999e-08,2.9309999999999999e-08,2.932e-08,2.9349999999999998e-08,2.9349999999999998e-08,2.9370000000000001e-08,2.9380000000000002e-08,2.939e-08,2.939e-08,2.941e-08,2.9620000000000003e-08,2.9679999999999998e-08,2.969e-08,3.002e-08,3.072e-08,3.0740000000000003e-08,3.1270000000000001e-08,3.1389999999999999e-08,3.1599999999999998e-08],"7340032":[0.087660265000000043,0.087732480500000001,0.088120284999999993,0.088236394999999995,0.088288758499999995,0.0884608635,0.0888619935,0.088877828499999992,0.088987377999999992,0.088994484000000026,0.089007036499999997,0.089014924999999995,0.089157493500000004,0.089178867000000023,0.089310394500000001,0.089322692500000023,0.089420181000000015,0.089644343000000029,0.090856475500000006,0.092176871999999993],"7168":[8.5467900000000002e-06,8.5524999999999999e-06,8.5783333333333339e-06,8.6494500000000007e-06,8.6616300000000006e-06,8.7016399999999992e-06,8.7660000000000004e-06,8.7919999999999998e-06,8.8080499999999995e-06,8.8099300000000005e-06,8.8137199999999997e-06,8.8502999999999989e-06,8.8588000000000006e-06,8.8640000000000002e-06,8.9279899999999992e-06,9.2147699999999999e-06,9.2198499999999995e-06,9.3676699999999997e-06,9.3798800000000001e-06,9.6209999999999999e-06],"13":[3.0479999999999999e-08,3.079e-08,3.0809999999999996e-08,3.0820000000000001e-08,3.0879999999999996e-08,3.0899999999999999e-08,3.0960000000000001e-08,3.0990000000000002e-08,3.1020000000000002e-08,3.1039999999999999e-08,3.1200000000000001e-08,3.121e-08,3.1889999999999996e-08,3.2100000000000003e-08,3.215e-08,3.2390000000000001e-08,3.2670000000000001e-08,3.2670000000000001e-08,3.3750000000000001e-08,3.3939999999999998e-08],"6029312":[0.070619039499999994,0.070896406999999981,0.070942704500000023,0.071069719000000003,0.07115216399999999,0.071300910999999953,0.071316807999999968,0.071341376499999998,0.07137582499999999,0.071404966,0.07173102499999999,0.071750539000000002,0.071820899499999966,0.071906832000000004,0.071957864999999996,0.072108610000000031,0.072310915999999975,0.072381490000000021,0.0724732295,0.072804649000000027],"14":[3.1389999999999999e-08,3.1960000000000003e-08,3.1970000000000001e-08,3.1970000000000001e-08,3.1970000000000001e-08,3.1979999999999999e-08,3.1990000000000004e-08,3.201e-08,3.2019999999999998e-08,3.2770000000000002e-08,3.3009999999999996e-08,3.3029999999999999e-08,3.3080000000000002e-08,3.3459999999999997e-08,3.3459999999999997e-08,3.3470000000000001e-08,3.3500000000000002e-08,3.4270000000000002e-08,3.4289999999999998e-08,3.6260000000000002e-08],"3200":[3.62397e-06,3.6272499999999999e-06,3.62997e-06,3.63066e-06,3.6328000000000002e-06,3.6336199999999999e-06,3.6343699999999999e-06,3.6368000000000001e-06,3.6381700000000002e-06,3.6396699999999997e-06,3.63979e-06,3.64045e-06,3.6409399999999996e-06,3.6471900000000001e-06,3.65148e-06,3.8067500000000004e-06,3.8145300000000001e-06,3.82688e-06,3.9686200000000001e-06,4.29692e-06],"20":[3.8710000000000001e-08,3.8890000000000006e-08,3.9090000000000001e-08,3.9120000000000002e-08,3.9309999999999999e-08,3.9349999999999998e-08,3.941e-08,3.941e-08,3.9450000000000006e-08,3.9510000000000001e-08,3.9570000000000003e-08,3.9600000000000004e-08,3.9639999999999996e-08,3.9650000000000001e-08,3.9650000000000001e-08,3.9879999999999997e-08,4.0849999999999999e-08,4.1030000000000004e-08,4.1509999999999999e-08,4.1910000000000003e-08],"204800":[0.00055508225000000012,0.00055916466666666655,0.00055974913333333353,0.00056603235714285712,0.00056662349999999989,0.00056739279999999984,0.00056983100000000003,0.00057658533333333338,0.00057831364285714274,0.00057969750000000017,0.00058135199999999972,0.00058532235714285716,0.00058562066666666677,0.00058877966666666653,0.00058901799999999996,0.0005890623,0.0005957969999999998,0.00059661463636363613,0.0005987732,0.00060287324999999984],"15":[3.2910000000000002e-08,3.3050000000000001e-08,3.3249999999999997e-08,3.3379999999999998e-08,3.3379999999999998e-08,3.3400000000000001e-08,3.3400000000000001e-08,3.3400000000000001e-08,3.3409999999999999e-08,3.344e-08,3.3449999999999998e-08,3.372e-08,3.3769999999999997e-08,3.3799999999999998e-08,3.4660000000000001e-08,3.4790000000000002e-08,3.4929999999999996e-08,3.4949999999999999e-08,3.4960000000000003e-08,3.6739999999999997e-08],"13312":[1.6214000000000001e-05,1.6217499999999998e-05,1.6219499999999999e-05,1.6245000000000001e-05,1.6248000000000001e-05,1.6388e-05,1.6469000000000001e-05,1.6634e-05,1.6719300000000001e-05,1.681232e-05,1.681794e-05,1.6843499999999999e-05,1.6850814285714286e-05,1.6884550000000001e-05,1.6935500000000001e-05,1.6964410714285714e-05,1.6968409999999999e-05,1.6974999999999999e-05,1.7164999999999999e-05,1.754361e-05],"4980736":[0.0573156945,0.057324963499999979,0.057411951000000003,0.057638452,0.057951696000000011,0.058011271500000003,0.058096963999999987,0.058103627999999997,0.058118758499999978,0.058154918,0.058176292500000004,0.058352407499999995,0.058368963999999988,0.05871307399999999,0.059094482000000004,0.059140619999999998,0.0594758695,0.05973632999999999,0.060258249999999978,0.060548458000000027],"118784":[0.00026741485714285712,0.00027397049999999991,0.00027515512500000001,0.0002757512222222222,0.00028025809090909094,0.00028059385714285717,0.00028191324999999999,0.00028267016666666664,0.00028279066666666664,0.000283396,0.00028364192857142863,0.00028460192592592588,0.00028528189655172416,0.00028663494736842104,0.00028966109375000014,0.00028980333333333342,0.00029243120000000007,0.00029418290909090909,0.00029521190909090924,0.00029627845833333333],"51200":[6.9283999999999996e-05,7.1381382978723401e-05,7.1811910000000003e-05,7.2213999999999997e-05,7.2274000000000006e-05,7.2354000000000006e-05,7.2473247311827954e-05,7.2635791208791218e-05,7.264033333333333e-05,7.2837540229885058e-05,7.3352820000000002e-05,7.3530549999999993e-05,7.4086397590361454e-05,7.422808823529412e-05,7.4246757575757586e-05,7.4831864864864867e-05,7.549159e-05,7.5704000000000006e-05,7.5937142857142851e-05,8.0062486842105265e-05],"16":[3.4049999999999997e-08,3.4270000000000002e-08,3.4329999999999997e-08,3.435e-08,3.4359999999999998e-08,3.4359999999999998e-08,3.4369999999999996e-08,3.4389999999999999e-08,3.4389999999999999e-08,3.4410000000000002e-08,3.449e-08,3.5729999999999996e-08,3.5950000000000001e-08,3.5980000000000002e-08,3.5999999999999998e-08,3.5999999999999998e-08,3.6049999999999995e-08,3.6090000000000001e-08,3.6099999999999999e-08,3.721e-08],"21":[3.9139999999999998e-08,3.9149999999999997e-08,3.9160000000000001e-08,3.9179999999999997e-08,3.9179999999999997e-08,3.9179999999999997e-08,3.92e-08,3.92e-08,3.9210000000000005e-08,3.9230000000000001e-08,3.9299999999999995e-08,3.9419999999999998e-08,3.9430000000000003e-08,3.9440000000000001e-08,3.9510000000000001e-08,4.0960000000000004e-08,4.0980000000000007e-08,4.1210000000000003e-08,4.1239999999999997e-08,4.1269999999999998e-08],"917504":[0.0041607409999999999,0.0041936180000000014,0.0042326790000000013,0.0042641350000000022,0.0042644840000000024,0.0042720059999999983,0.0042728950000000022,0.0042807110000000004,0.0042822759999999998,0.0042941740000000004,0.0042966370000000016,0.0043084410000000014,0.0043246689999999997,0.004341241,0.004349836000000001,0.0043608900000000009,0.0043663550000000006,0.004395737000000002,0.0045986630000000002,0.0046918680000000009],"22":[3.9319999999999997e-08,3.9929999999999994e-08,4.0019999999999997e-08,4.0119999999999998e-08,4.0180000000000006e-08,4.0189999999999998e-08,4.0189999999999998e-08,4.0189999999999998e-08,4.0199999999999996e-08,4.0199999999999996e-08,4.0199999999999996e-08,4.0210000000000001e-08,4.0800000000000001e-08,4.1629999999999996e-08,4.2060000000000001e-08,4.2060000000000001e-08,4.2069999999999999e-08,4.2440000000000002e-08,4.332e-08,4.4599999999999996e-08],"4864":[5.6733900000000007e-06,5.6781699999999997e-06,5.67907e-06,5.6813500000000002e-06,5.6827499999999999e-06,5.6828e-06,5.6845483870967742e-06,5.68533e-06,5.6886699999999999e-06,5.6895600000000003e-06,5.6957199999999992e-06,5.7017600000000008e-06,5.8131500000000004e-06,5.8504699999999997e-06,5.8612699999999997e-06,5.8678699999999998e-06,5.9229400000000008e-06,5.9733900000000004e-06,6.1332900000000004e-06,6.23911e-06],"17":[3.4960000000000003e-08,3.4989999999999998e-08,3.5000000000000002e-08,3.5030000000000003e-08,3.5030000000000003e-08,3.5040000000000001e-08,3.5040000000000001e-08,3.5040000000000001e-08,3.5040000000000001e-08,3.5059999999999998e-08,3.508e-08,3.6210000000000005e-08,3.6249999999999997e-08,3.6490000000000004e-08,3.6529999999999997e-08,3.6580000000000001e-08,3.662e-08,3.6640000000000003e-08,3.6659999999999999e-08,3.9040000000000004e-08],"14848":[1.8097928571428574e-05,1.8135777777777779e-05,1.8138444444444445e-05,1.8236999999999998e-05,1.8457e-05,1.8541000000000001e-05,1.8612000000000001e-05,1.8624619999999999e-05,1.86767e-05,1.8765347826086957e-05,1.883798e-05,1.887915e-05,1.890423e-05,1.8918409999999999e-05,1.8948299999999999e-05,1.8984500000000001e-05,1.9043409999999999e-05,1.9156729999999998e-05,1.9894829999999997e-05,1.9933324999999999e-05],"23":[4.1169999999999997e-08,4.2499999999999997e-08,4.2499999999999997e-08,4.2499999999999997e-08,4.252e-08,4.2529999999999998e-08,4.2550000000000001e-08,4.2660000000000006e-08,4.2679999999999996e-08,4.2769999999999999e-08,4.3050000000000005e-08,4.3280000000000001e-08,4.3730000000000002e-08,4.4179999999999996e-08,4.4190000000000001e-08,4.4199999999999999e-08,4.4649999999999993e-08,4.4669999999999996e-08,4.5430000000000004e-08,4.5440000000000002e-08],"786432":[0.0031348120000000007,0.0031408650000000009,0.0031420370000000012,0.003165055,0.0032439330000000001,0.0032801599999999998,0.0032893320000000003,0.0033046009999999995,0.0033626909999999988,0.00338318,0.003410600000000001,0.0034373540000000001,0.0034614790000000021,0.003464422,0.0034837369999999998,0.0034880889999999998,0.0035151599999999989,0.0035225149999999982,0.0036079519999999998,0.0036363899999999998],"18":[3.5689999999999997e-08,3.5740000000000001e-08,3.578e-08,3.5789999999999998e-08,3.5829999999999997e-08,3.6400000000000002e-08,3.6449999999999999e-08,3.655e-08,3.6580000000000001e-08,3.6580000000000001e-08,3.6600000000000003e-08,3.6600000000000003e-08,3.6600000000000003e-08,3.6610000000000002e-08,3.7310000000000001e-08,3.7469999999999997e-08,3.805e-08,3.8110000000000002e-08,3.8310000000000004e-08,3.8330000000000006e-08],"1638400":[0.013877078500000001,0.014051300500000008,0.014092450500000006,0.014104516999999988,0.014125255499999994,0.014125431000000004,0.014136213,0.014153367,0.014224269500000001,0.014310666,0.014370190500000001,0.014460095000000001,0.014549333500000006,0.0145976995,0.014854902499999999,0.01507556,0.0153924965,0.015833893000000009,0.015873480999999995,0.017426271],"7864320":[0.094587740000000017,0.094592643999999976,0.094625802999999981,0.094648478499999994,0.094840727,0.094882153499999983,0.094980383000000043,0.09500803599999999,0.095051779000000031,0.095056999000000003,0.095060920000000007,0.095175917000000027,0.095320771999999998,0.09543668800000002,0.095597113500000039,0.095953188000000036,0.095954528000000011,0.095984659999999999,0.096114474499999977,0.096712280500000011],"24":[4.2200000000000001e-08,4.2919999999999997e-08,4.3719999999999997e-08,4.381e-08,4.3859999999999997e-08,4.4039999999999996e-08,4.4039999999999996e-08,4.4059999999999999e-08,4.4100000000000004e-08,4.4109999999999996e-08,4.4199999999999999e-08,4.4199999999999999e-08,4.4429999999999995e-08,4.5460000000000005e-08,4.573e-08,4.6119999999999999e-08,4.6129999999999997e-08,4.6160000000000004e-08,4.629e-08,4.9019999999999998e-08],"14155776":[0.17724847799999999,0.17736040650000001,0.17786598450000002,0.17792098349999999,0.17806413099999999,0.17814480500000002,0.17818355299999999,0.17855288699999999,0.178976041,0.17922280899999998,0.17944852449999998,0.17956578000000001,0.17966065749999999,0.17967974549999999,0.1799336295,0.18013132200000001,0.18026319099999999,0.18039393650000002,0.180964386,0.18142500499999997],"19":[3.6780000000000002e-08,3.7539999999999997e-08,3.756e-08,3.7639999999999998e-08,3.7649999999999996e-08,3.7669999999999999e-08,3.7709999999999998e-08,3.7720000000000003e-08,3.7739999999999999e-08,3.7940000000000001e-08,3.8139999999999996e-08,3.8210000000000003e-08,3.8320000000000002e-08,3.8330000000000006e-08,3.8569999999999994e-08,3.9419999999999998e-08,3.9530000000000004e-08,3.9539999999999995e-08,3.9570000000000003e-08,3.9709999999999996e-08],"30":[4.8489999999999999e-08,4.8500000000000004e-08,5.0459999999999997e-08,5.086e-08,5.0900000000000006e-08,5.1189999999999997e-08,5.1309999999999994e-08,5.1309999999999994e-08,5.1429999999999998e-08,5.1549999999999995e-08,5.1599999999999999e-08,5.1599999999999999e-08,5.1620000000000002e-08,5.3499999999999996e-08,5.369e-08,5.369e-08,5.3729999999999999e-08,5.3750000000000002e-08,5.3860000000000001e-08,5.6609999999999995e-08],"25":[4.5130000000000001e-08,4.5249999999999998e-08,4.5290000000000004e-08,4.5290000000000004e-08,4.5319999999999998e-08,4.5329999999999996e-08,4.5340000000000001e-08,4.5340000000000001e-08,4.5340000000000001e-08,4.5360000000000004e-08,4.5580000000000002e-08,4.5639999999999997e-08,4.5859999999999995e-08,4.6110000000000007e-08,4.7319999999999996e-08,4.7380000000000005e-08,4.7380000000000005e-08,4.7700000000000004e-08,4.8720000000000002e-08,5.1919999999999998e-08],"31":[4.8489999999999999e-08,4.8489999999999999e-08,4.852e-08,4.852e-08,4.8539999999999997e-08,4.8559999999999999e-08,4.8609999999999997e-08,4.8609999999999997e-08,4.8669999999999998e-08,4.8699999999999999e-08,4.8699999999999999e-08,4.8740000000000005e-08,5.0340000000000006e-08,5.086e-08,5.0919999999999995e-08,5.264e-08,5.3159999999999994e-08,5.3229999999999994e-08,5.3659999999999999e-08,5.4529999999999999e-08],"1280":[1.44316e-06,1.4435399999999999e-06,1.4438700000000001e-06,1.4443299999999999e-06,1.4470299999999998e-06,1.44728e-06,1.4472899999999998e-06,1.44788e-06,1.4496699999999999e-06,1.44972e-06,1.4503899999999998e-06,1.4504300000000001e-06,1.4519100000000001e-06,1.4524699999999999e-06,1.4527999999999999e-06,1.4532299999999999e-06,1.4539199999999999e-06,1.45536e-06,1.4579400000000001e-06,1.5878699999999999e-06],"26":[4.5260000000000003e-08,4.6000000000000002e-08,4.601e-08,4.6029999999999996e-08,4.6029999999999996e-08,4.6059999999999997e-08,4.6070000000000002e-08,4.608e-08,4.6090000000000004e-08,4.6170000000000002e-08,4.6210000000000002e-08,4.6240000000000002e-08,4.6250000000000001e-08,4.6250000000000001e-08,4.6730000000000002e-08,4.7280000000000004e-08,4.8160000000000002e-08,4.828e-08,4.8420000000000006e-08,5.0699999999999997e-08],"3932160":[0.04390419349999998,0.04395548400000001,0.044019936500000009,0.044120487,0.044151673999999988,0.044234047000000012,0.044279931999999987,0.044414975500000002,0.044460589500000001,0.044492860000000002,0.044522856,0.044654852000000002,0.044672021499999992,0.044689003000000019,0.044738139999999996,0.044912633,0.044935497500000018,0.045171722499999997,0.04527279700000001,0.045416133499999997],"2432":[2.7355599999999999e-06,2.73607e-06,2.7364499999999999e-06,2.7377499999999997e-06,2.73805e-06,2.7380599999999998e-06,2.7385400000000004e-06,2.7395799999999999e-06,2.7416199999999998e-06,2.7419299999999999e-06,2.7444200000000001e-06,2.7450899999999999e-06,2.7461599999999998e-06,2.7469400000000002e-06,2.7470900000000001e-06,2.7489099999999999e-06,2.74988e-06,2.7531700000000002e-06,2.75743e-06,3.2412700000000002e-06],"32":[4.9370000000000005e-08,4.9459999999999994e-08,4.9470000000000006e-08,4.9470000000000006e-08,4.9470000000000006e-08,4.9470000000000006e-08,4.9479999999999997e-08,4.9479999999999997e-08,4.9479999999999997e-08,4.9479999999999997e-08,4.9479999999999997e-08,4.9479999999999997e-08,4.9490000000000002e-08,4.9490000000000002e-08,4.9509999999999998e-08,4.9509999999999998e-08,5.1780000000000004e-08,5.229e-08,5.4299999999999997e-08,5.5180000000000002e-08],"27":[4.6129999999999997e-08,4.6129999999999997e-08,4.6129999999999997e-08,4.6129999999999997e-08,4.6129999999999997e-08,4.6129999999999997e-08,4.6140000000000002e-08,4.6140000000000002e-08,4.6140000000000002e-08,4.6140000000000002e-08,4.6170000000000002e-08,4.7239999999999998e-08,4.7260000000000001e-08,4.765e-08,4.828e-08,4.828e-08,4.8289999999999998e-08,4.8289999999999998e-08,4.8910000000000006e-08,4.9180000000000001e-08],"409600":[0.0012042308,0.0012107857499999999,0.0012236689999999995,0.0012310159999999999,0.0012326475000000001,0.0012381100000000002,0.0012387165000000001,0.0012494266000000001,0.0012515135000000005,0.0012571085,0.0012635805,0.001271508,0.0012733619999999997,0.0012782220000000001,0.0012806339999999999,0.001282526,0.0013027275,0.00131624125,0.0013196524999999995,0.001327103]}},{"title":"Deque subscript get, random offsets (discontiguous)","results":{"28":[6.0170000000000002e-08,6.0189999999999998e-08,6.0199999999999996e-08,6.0349999999999994e-08,6.0360000000000006e-08,6.0590000000000002e-08,6.0590000000000002e-08,6.0609999999999998e-08,6.0609999999999998e-08,6.0619999999999996e-08,6.0630000000000008e-08,6.0679999999999998e-08,6.1970000000000005e-08,6.2960000000000003e-08,6.3510000000000004e-08,6.3980000000000008e-08,6.6520000000000003e-08,6.6530000000000001e-08,6.6539999999999999e-08,6.6579999999999991e-08],"34":[7.4830000000000002e-08,7.4830000000000002e-08,7.484e-08,7.484e-08,7.4849999999999999e-08,7.4859999999999997e-08,7.4869999999999995e-08,7.4880000000000006e-08,7.4890000000000004e-08,7.4900000000000002e-08,7.5040000000000002e-08,7.5079999999999995e-08,7.5290000000000008e-08,7.5290000000000008e-08,7.5290000000000008e-08,7.5290000000000008e-08,7.5310000000000004e-08,7.533e-08,7.5339999999999998e-08,7.8409999999999999e-08],"29":[6.1980000000000003e-08,6.2149999999999997e-08,6.2160000000000009e-08,6.2169999999999994e-08,6.2340000000000001e-08,6.2369999999999995e-08,6.2419999999999999e-08,6.2600000000000005e-08,6.2649999999999995e-08,6.2750000000000003e-08,6.2809999999999991e-08,6.2940000000000006e-08,6.2999999999999995e-08,6.3090000000000004e-08,6.5040000000000005e-08,6.5089999999999996e-08,6.5579999999999996e-08,6.5970000000000001e-08,6.8449999999999994e-08,6.8460000000000006e-08],"40":[8.5510000000000003e-08,8.5520000000000001e-08,8.5520000000000001e-08,8.5520000000000001e-08,8.5529999999999999e-08,8.5529999999999999e-08,8.5529999999999999e-08,8.5529999999999999e-08,8.5529999999999999e-08,8.5539999999999997e-08,8.5569999999999991e-08,8.5569999999999991e-08,8.5809999999999999e-08,8.596000000000001e-08,8.5979999999999993e-08,8.5979999999999993e-08,8.5979999999999993e-08,8.6000000000000002e-08,8.6039999999999995e-08,9.001000000000001e-08],"17408":[3.1093999999999997e-05,3.1129e-05,3.2362659574468081e-05,3.2376795918367349e-05,3.2381120879120882e-05,3.2443139999999997e-05,3.2488539999999995e-05,3.2498669999999999e-05,3.2549000000000003e-05,3.2549999999999998e-05,3.2561999999999998e-05,3.279655e-05,3.2808760000000001e-05,3.2977750000000005e-05,3.2978690000000003e-05,3.3187170000000004e-05,3.3202399999999999e-05,3.322208e-05,3.3960079999999999e-05,3.4122999999999998e-05],"1472":[2.6421099999999999e-06,2.6434800000000001e-06,2.6435800000000003e-06,2.6439299999999998e-06,2.6439499999999999e-06,2.64397e-06,2.6440699999999998e-06,2.6441399999999996e-06,2.6442200000000002e-06,2.6442200000000002e-06,2.6444800000000001e-06,2.6459600000000003e-06,2.64633e-06,2.6463399999999998e-06,2.6472699999999996e-06,2.64756e-06,2.6569299999999999e-06,2.6581499999999997e-06,2.6585500000000002e-06,2.7668700000000002e-06],"112":[2.1379000000000001e-07,2.138e-07,2.1382999999999998e-07,2.1387e-07,2.1387999999999998e-07,2.1393000000000001e-07,2.1395999999999999e-07,2.1399e-07,2.1407000000000001e-07,2.1425e-07,2.1425e-07,2.1426000000000001e-07,2.1426000000000001e-07,2.1427e-07,2.1427e-07,2.1429000000000002e-07,2.1429000000000002e-07,2.1432e-07,2.1435000000000001e-07,2.2432000000000001e-07],"1376256":[0.010260762500000003,0.010381618,0.010437809000000001,0.010476986000000002,0.0106702755,0.010745298,0.0108786935,0.010888336,0.010935288500000005,0.010980264999999999,0.010984813999999999,0.011036019999999999,0.0110444805,0.011329729,0.011502322000000001,0.0115046705,0.01175168,0.0118776425,0.012067117,0.014721722],"5242880":[0.064104319000000007,0.064524485000000034,0.064548627499999983,0.064595939500000005,0.064936969500000025,0.065472649499999966,0.06557935199999998,0.065699302500000001,0.065810755999999998,0.065894071500000012,0.066139353499999998,0.066174551999999998,0.066273132499999998,0.0664214365,0.066719436999999979,0.066838656999999996,0.067663259000000003,0.067851279,0.068311074499999999,0.068514243499999974],"36":[7.8400000000000001e-08,7.8400000000000001e-08,7.8400000000000001e-08,7.8409999999999999e-08,7.8409999999999999e-08,7.842000000000001e-08,7.842000000000001e-08,7.842000000000001e-08,7.842000000000001e-08,7.8439999999999993e-08,7.8439999999999993e-08,7.8450000000000004e-08,7.8830000000000012e-08,7.8839999999999997e-08,7.8849999999999995e-08,7.8849999999999995e-08,7.8860000000000006e-08,7.8900000000000012e-08,8.0499999999999986e-08,8.8599999999999999e-08],"42":[8.906999999999999e-08,8.9080000000000001e-08,8.9080000000000001e-08,8.9090000000000012e-08,8.9090000000000012e-08,8.9090000000000012e-08,8.9099999999999997e-08,8.9099999999999997e-08,8.9099999999999997e-08,8.9120000000000007e-08,8.9129999999999991e-08,8.9339999999999991e-08,8.9519999999999997e-08,8.9519999999999997e-08,8.9519999999999997e-08,8.9519999999999997e-08,8.9539999999999993e-08,8.9550000000000004e-08,8.9579999999999999e-08,9.3659999999999993e-08],"11534336":[0.14735422000000001,0.14762486050000001,0.14821707949999999,0.14835943600000001,0.14847158699999999,0.149620696,0.14985684599999999,0.14991610899999999,0.14997341050000002,0.15046217000000001,0.15047039100000001,0.151603612,0.15167238899999999,0.15215106950000001,0.15309938400000001,0.153331625,0.15448034999999999,0.1562809245,0.165436575,0.16766276250000001],"114688":[0.0002921205,0.00029333319999999991,0.00029644299999999991,0.00029663506666666661,0.00029849875,0.00030196899999999991,0.00030463638709677407,0.0003054868,0.00030657900000000007,0.00030664864516129035,0.00030665199999999998,0.00030720575862068972,0.00030854362962962962,0.0003133443103448276,0.00031338379999999993,0.00031475200000000001,0.00031536860714285705,0.00031602958620689662,0.00031624059999999996,0.00033885216666666669],"144":[2.7090000000000002e-07,2.7090000000000002e-07,2.7090999999999998e-07,2.7091999999999999e-07,2.7093999999999996e-07,2.7095000000000003e-07,2.7097e-07,2.7098999999999997e-07,2.7100999999999999e-07,2.7103000000000001e-07,2.7104000000000002e-07,2.7113000000000002e-07,2.7132999999999998e-07,2.7133999999999999e-07,2.7133999999999999e-07,2.7137999999999999e-07,2.7137999999999999e-07,2.7139e-07,2.7141000000000002e-07,2.7144999999999996e-07],"38":[8.1950000000000003e-08,8.1960000000000014e-08,8.1960000000000014e-08,8.1960000000000014e-08,8.1979999999999997e-08,8.1990000000000008e-08,8.1999999999999993e-08,8.2010000000000004e-08,8.2010000000000004e-08,8.2080000000000004e-08,8.2420000000000006e-08,8.2430000000000004e-08,8.2439999999999989e-08,8.2439999999999989e-08,8.2459999999999999e-08,8.2490000000000006e-08,8.252e-08,8.5920000000000004e-08,8.6260000000000006e-08,8.9970000000000004e-08],"240":[4.4187999999999998e-07,4.4212000000000004e-07,4.4221000000000004e-07,4.4230999999999999e-07,4.4230999999999999e-07,4.4232000000000001e-07,4.4232000000000001e-07,4.4233000000000002e-07,4.4233000000000002e-07,4.4233000000000002e-07,4.4233000000000002e-07,4.4233999999999998e-07,4.4234999999999999e-07,4.4239000000000003e-07,4.4240000000000004e-07,4.4240000000000004e-07,4.629e-07,4.6291000000000001e-07,4.8510999999999998e-07,4.8548999999999999e-07],"9216":[1.6486000000000001e-05,1.6492000000000001e-05,1.6492999999999999e-05,1.6955909999999999e-05,1.7015270000000001e-05,1.7056510000000002e-05,1.70773e-05,1.7095639999999999e-05,1.7139950000000002e-05,1.716337e-05,1.7223159999999999e-05,1.7231911111111112e-05,1.7255169999999998e-05,1.7260349999999998e-05,1.7261500000000001e-05,1.7535659999999999e-05,1.7545620000000002e-05,1.782186e-05,1.8061249999999999e-05,1.9484760000000001e-05],"44":[9.262999999999999e-08,9.2640000000000001e-08,9.2640000000000001e-08,9.2640000000000001e-08,9.2649999999999999e-08,9.2649999999999999e-08,9.266000000000001e-08,9.2690000000000005e-08,9.2710000000000001e-08,9.2780000000000001e-08,9.3079999999999997e-08,9.3089999999999995e-08,9.3100000000000006e-08,9.3100000000000006e-08,9.3109999999999991e-08,9.3120000000000003e-08,9.3149999999999997e-08,9.3160000000000008e-08,9.3179999999999991e-08,9.748000000000001e-08],"1664":[2.9861699999999999e-06,2.9862100000000002e-06,2.9862100000000002e-06,2.9862699999999997e-06,2.98628e-06,2.9863300000000001e-06,2.9878499999999997e-06,2.98935e-06,2.9900300000000002e-06,2.9921999999999999e-06,2.9933899999999997e-06,2.9940499999999997e-06,2.9948399999999999e-06,2.9962199999999999e-06,2.9963400000000003e-06,2.9977200000000002e-06,3.0093500000000002e-06,3.0119499999999996e-06,3.2780299999999998e-06,3.5340399999999998e-06],"196608":[0.00057965100000000004,0.000584496,0.0005850471333333333,0.00058753899999999999,0.00058885346153846095,0.00059305600000000001,0.00059328885714285721,0.00059820299999999973,0.00060145999999999973,0.00060294449999999996,0.00060714850000000002,0.0006085105714285716,0.00061203099999999975,0.00061258758333333318,0.00061930671428571426,0.00061949093750000004,0.00062308476923076935,0.00062730533333333358,0.00062834499999999999,0.00063141],"155648":[0.00043995633333333335,0.0004430975,0.00044444447368421051,0.00044530766666666657,0.00045007450000000002,0.00045011199999999991,0.00045019066666666669,0.00045221328571428315,0.00045674800000000004,0.00045752945000000002,0.00045978366666666655,0.00046386350000000002,0.00046794504999999996,0.00046832016666666668,0.00046836099999999993,0.00047153405263157907,0.00047355689473684216,0.00047579524999999997,0.00047618074999999997,0.00047760000000000006],"2816":[5.04109e-06,5.0414000000000006e-06,5.0414700000000004e-06,5.0460399999999999e-06,5.0534500000000007e-06,5.0719999999999999e-06,5.1607499999999997e-06,5.1800900000000007e-06,5.1841899999999996e-06,5.1881400000000006e-06,5.2774500000000006e-06,5.2946299999999997e-06,5.3956100000000003e-06,5.4001699999999992e-06,5.4456199999999997e-06,5.49936e-06,5.5329800000000005e-06,5.5370999999999999e-06,5.96974e-06,5.9716700000000004e-06],"50":[1.0332e-07,1.0332e-07,1.0332e-07,1.0332e-07,1.0332999999999999e-07,1.0334e-07,1.0338e-07,1.0339e-07,1.0353e-07,1.0354e-07,1.0375e-07,1.0377000000000001e-07,1.0377000000000001e-07,1.0377000000000001e-07,1.0377999999999999e-07,1.0379e-07,1.0384999999999999e-07,1.0861e-07,1.0862e-07,1.1344e-07],"2359296":[0.026333092999999995,0.026591395000000007,0.026624137999999999,0.026742938500000001,0.026750678999999999,0.026754743500000001,0.027009862499999999,0.027065737499999999,0.0271962395,0.027208595000000002,0.0272422025,0.027325863999999998,0.027371237,0.027395449999999998,0.027395562000000002,0.027423014500000002,0.027661699000000001,0.027742072499999999,0.028012061499999998,0.02864384200000001],"46":[9.6190000000000003e-08,9.6199999999999988e-08,9.6199999999999988e-08,9.6209999999999999e-08,9.6209999999999999e-08,9.6209999999999999e-08,9.6250000000000005e-08,9.6270000000000001e-08,9.6270000000000001e-08,9.6270000000000001e-08,9.6449999999999993e-08,9.6629999999999999e-08,9.6639999999999997e-08,9.6649999999999995e-08,9.6690000000000001e-08,9.6690000000000001e-08,9.9270000000000002e-08,1.0096e-07,1.0117e-07,1.0117e-07],"176":[3.2800999999999998e-07,3.2800999999999998e-07,3.2800999999999998e-07,3.2842999999999998e-07,3.2842999999999998e-07,3.2842999999999998e-07,3.2843999999999999e-07,3.2843999999999999e-07,3.2843999999999999e-07,3.2845000000000001e-07,3.2845000000000001e-07,3.2846999999999998e-07,3.2846999999999998e-07,3.2846999999999998e-07,3.2848999999999995e-07,3.291e-07,3.3646000000000004e-07,3.4369000000000003e-07,3.4375000000000004e-07,3.4395000000000001e-07],"52":[1.0686999999999999e-07,1.0688e-07,1.0688e-07,1.0689e-07,1.0689e-07,1.0689e-07,1.0689e-07,1.0691e-07,1.0692000000000001e-07,1.0692000000000001e-07,1.0693000000000001e-07,1.0704e-07,1.0733000000000001e-07,1.0733000000000001e-07,1.0733999999999999e-07,1.0739e-07,1.0739e-07,1.1206000000000001e-07,1.1235e-07,1.3173999999999999e-07],"272":[4.9890999999999996e-07,4.9892999999999998e-07,4.9895999999999996e-07,4.9904000000000005e-07,4.9932000000000005e-07,4.9932000000000005e-07,4.9932000000000005e-07,4.9933000000000001e-07,4.9933999999999997e-07,4.9933999999999997e-07,4.9935000000000003e-07,4.9935999999999999e-07,4.9935999999999999e-07,4.9936999999999995e-07,4.9940000000000004e-07,4.9960000000000005e-07,5.2257999999999996e-07,5.2285e-07,5.4761999999999998e-07,5.9095999999999999e-07],"116":[2.2092000000000002e-07,2.2093000000000001e-07,2.2093999999999999e-07,2.2095e-07,2.2095999999999999e-07,2.2104999999999998e-07,2.2109e-07,2.2109999999999999e-07,2.2137000000000003e-07,2.2137000000000003e-07,2.2138000000000001e-07,2.2138000000000001e-07,2.2138000000000001e-07,2.2140000000000001e-07,2.2141e-07,2.2143000000000002e-07,2.2144999999999999e-07,2.2146e-07,2.3127000000000001e-07,2.3172000000000001e-07],"47104":[8.4553000000000002e-05,8.6681222222222224e-05,8.8084999999999994e-05,8.8717443298969077e-05,8.8796247422680415e-05,8.8851312500000005e-05,8.8901500000000003e-05,8.9103049999999994e-05,8.9645292929292923e-05,8.9804894736842108e-05,9.0189322580645165e-05,9.0474612244897956e-05,9.0969250000000007e-05,9.0969573033707863e-05,9.164824691358024e-05,9.1901168421052617e-05,9.23212e-05,9.2422000000000004e-05,9.2975764705882354e-05,9.3967202247191003e-05],"6912":[1.2365228571428572e-05,1.263906e-05,1.2650120000000001e-05,1.267438e-05,1.268558e-05,1.2707050000000001e-05,1.2709139999999999e-05,1.2719649999999999e-05,1.275262e-05,1.2762540000000001e-05,1.2767539999999999e-05,1.2776529999999999e-05,1.281422e-05,1.287561e-05,1.2900059999999999e-05,1.2956020000000001e-05,1.3054989130434783e-05,1.3369589999999999e-05,1.340563e-05,1.4631525641025639e-05],"1856":[3.3266399999999999e-06,3.3275100000000002e-06,3.3282500000000003e-06,3.3283699999999998e-06,3.32853e-06,3.3286799999999999e-06,3.3294200000000004e-06,3.3302400000000002e-06,3.3302899999999998e-06,3.3304899999999999e-06,3.3308600000000003e-06,3.3326500000000002e-06,3.3332199999999998e-06,3.3358552631578947e-06,3.3397800000000001e-06,3.3404199999999999e-06,3.3410700000000001e-06,3.3418899999999999e-06,3.3492100000000003e-06,3.6528699999999998e-06],"48":[9.9750000000000003e-08,9.9750000000000003e-08,9.9760000000000001e-08,9.9760000000000001e-08,9.9760000000000001e-08,9.9760000000000001e-08,9.9769999999999999e-08,9.9769999999999999e-08,9.9790000000000009e-08,9.9809999999999992e-08,9.9809999999999992e-08,9.9919999999999997e-08,9.9930000000000009e-08,1.0021999999999999e-07,1.0023e-07,1.0025e-07,1.0027000000000001e-07,1.003e-07,1.0237000000000001e-07,1.0448000000000001e-07],"2097152":[0.022227334500000008,0.022382171499999999,0.02259973500000001,0.022606630999999999,0.022745325,0.022761183499999997,0.022918793,0.022927517500000001,0.022977474499999977,0.023016909999999998,0.023018878,0.023028027,0.0230478275,0.023199017500000002,0.023284592,0.023600949,0.023807164500000005,0.0244631485,0.025421405500000001,0.026743290499999996],"54":[1.1044e-07,1.1044e-07,1.1045e-07,1.1045e-07,1.1047999999999999e-07,1.1049000000000001e-07,1.1049999999999999e-07,1.1090000000000001e-07,1.1090000000000001e-07,1.1090999999999999e-07,1.1092e-07,1.1092e-07,1.1094000000000001e-07,1.1095e-07,1.1095e-07,1.1096e-07,1.1561e-07,1.1606999999999999e-07,1.1606999999999999e-07,1.2825e-07],"2031616":[0.0212889975,0.021789925499999998,0.0218555005,0.021941933,0.02194850399999999,0.021995122500000002,0.022008702499999998,0.0220463025,0.022122676500000001,0.0221368695,0.022183250499999998,0.022208079500000002,0.022304792000000004,0.022506552999999992,0.022611984000000002,0.022622634999999999,0.022840098999999999,0.023734700500000001,0.023974740000000001,0.02453447999999999],"43008":[8.0269888888888886e-05,8.0681142857142859e-05,8.0788300000000007e-05,8.1217189999999991e-05,8.1510330000000007e-05,8.1802047619047622e-05,8.2423900000000002e-05,8.2722647058823526e-05,8.2836545454545454e-05,8.3022889999999987e-05,8.3086599999999998e-05,8.3193339999999998e-05,8.3421159090909093e-05,8.3478049999999993e-05,8.3744770000000003e-05,8.4206550000000011e-05,8.4753520000000002e-05,8.508777528089888e-05,8.5185187500000001e-05,8.6141642857142858e-05],"60":[1.2112000000000002e-07,1.2113e-07,1.2113e-07,1.2115e-07,1.2116000000000001e-07,1.212e-07,1.2158000000000001e-07,1.2158000000000001e-07,1.2158999999999999e-07,1.2158999999999999e-07,1.2158999999999999e-07,1.2158999999999999e-07,1.2158999999999999e-07,1.2158999999999999e-07,1.2165000000000001e-07,1.2165999999999999e-07,1.2680999999999998e-07,1.2725e-07,1.3344000000000001e-07,1.4773000000000001e-07],"30720":[5.48355e-05,5.7236130434782616e-05,5.7389999999999998e-05,5.7396333333333331e-05,5.8315249999999997e-05,5.8641999999999999e-05,5.8679898550724642e-05,5.8707000000000006e-05,5.8869428571428571e-05,5.9028789999999999e-05,5.9106159999999997e-05,5.9545720000000003e-05,5.9741799999999998e-05,5.9792136363636365e-05,5.9907500000000002e-05,6.0350219999999998e-05,6.0870289999999998e-05,6.1076650000000001e-05,6.1449080000000006e-05,6.3342199999999991e-05],"56":[1.1399999999999999e-07,1.1399999999999999e-07,1.1401e-07,1.1401e-07,1.1402e-07,1.1402e-07,1.1402e-07,1.1405000000000001e-07,1.1412000000000001e-07,1.1445e-07,1.1446000000000001e-07,1.1446000000000001e-07,1.1447000000000001e-07,1.1447999999999999e-07,1.1978e-07,1.1978e-07,1.1978e-07,1.1984000000000002e-07,1.2562999999999999e-07,1.2568e-07],"62":[1.2469000000000001e-07,1.2469000000000001e-07,1.247e-07,1.247e-07,1.2471000000000001e-07,1.2471000000000001e-07,1.2473999999999999e-07,1.2477e-07,1.2478000000000001e-07,1.2483000000000001e-07,1.2514000000000002e-07,1.2514000000000002e-07,1.2514000000000002e-07,1.2514000000000002e-07,1.2519e-07,1.2520999999999999e-07,1.2695999999999999e-07,1.2736e-07,1.3050000000000001e-07,1.3084e-07],"58":[1.1756e-07,1.1757e-07,1.1757e-07,1.1758e-07,1.1758e-07,1.1762e-07,1.1764e-07,1.1801999999999999e-07,1.1801999999999999e-07,1.1803000000000001e-07,1.1803000000000001e-07,1.1803000000000001e-07,1.1805e-07,1.1805e-07,1.1807000000000001e-07,1.1808e-07,1.1808e-07,1.1810000000000001e-07,1.2368999999999999e-07,1.2965e-07],"3014656":[0.035284029500000015,0.03535041500000001,0.03541153549999998,0.035455095000000013,0.035488543999999976,0.035730235999999999,0.035865706999999983,0.035865978,0.035919990999999998,0.035924536,0.035999344499999988,0.036233294000000013,0.036251262499999999,0.036266501499999999,0.036316612999999998,0.036387650000000007,0.036522225500000012,0.036835205499999996,0.037332958499999999,0.037558256500000012],"64":[1.2825e-07,1.2826000000000001e-07,1.2826000000000001e-07,1.2827e-07,1.2830999999999999e-07,1.2848e-07,1.2851999999999999e-07,1.2869e-07,1.2870000000000001e-07,1.2870000000000001e-07,1.2870000000000001e-07,1.2870000000000001e-07,1.2873000000000002e-07,1.2873000000000002e-07,1.2873000000000002e-07,1.2874e-07,1.2874999999999998e-07,1.2888e-07,1.2940999999999999e-07,1.3472999999999999e-07],"8388608":[0.10601281799999999,0.10649231100000001,0.106724814,0.10675820849999999,0.1068105,0.10710874350000001,0.1071448295,0.1071782525,0.10741839800000003,0.107444314,0.10745587700000001,0.10771513000000001,0.1077186195,0.108494995,0.108772279,0.10880869650000002,0.1090935155,0.10915498999999999,0.1096128025,0.11045086599999999],"29696":[5.2998000000000003e-05,5.3003000000000001e-05,5.3003500000000002e-05,5.3010999999999998e-05,5.5150240000000002e-05,5.532590540540541e-05,5.5488000000000001e-05,5.5498000000000003e-05,5.5502589999999999e-05,5.5525629999999998e-05,5.5848987179487187e-05,5.5998400000000002e-05,5.60951948051948e-05,5.6225249999999995e-05,5.6761700000000002e-05,5.6816790000000001e-05,5.7700219999999995e-05,5.7862879999999996e-05,5.8091071428571421e-05,5.8934515625000002e-05],"216":[3.9916000000000004e-07,3.9918e-07,3.9953999999999999e-07,3.9957999999999998e-07,3.9958999999999999e-07,3.9958999999999999e-07,3.9958999999999999e-07,3.9958999999999999e-07,3.9959999999999995e-07,3.9961000000000002e-07,3.9961000000000002e-07,3.9962000000000003e-07,3.9962999999999999e-07,3.9966000000000002e-07,3.9966999999999998e-07,3.9971000000000002e-07,4.1801000000000002e-07,4.1817000000000004e-07,4.1818e-07,4.3835999999999996e-07],"106496":[0.00025485850000000001,0.00025730833333333336,0.00025893999999999998,0.00026083969696969709,0.00026575803030303027,0.00027156700000000001,0.00027230167647058833,0.00027384412121212121,0.00027492,0.00027838200000000014,0.00027857206250000001,0.00028062999999999987,0.00028082299999999987,0.000280862,0.00028094266666666659,0.00028253224999999987,0.00028421800000000014,0.00028600297058823537,0.00031630759259259261,0.00031762199999999993],"72":[1.4250000000000001e-07,1.4250000000000001e-07,1.4250000000000001e-07,1.4250000000000001e-07,1.4251e-07,1.4252000000000001e-07,1.4252999999999999e-07,1.4254e-07,1.4254999999999999e-07,1.4256e-07,1.4260000000000002e-07,1.4289e-07,1.4293e-07,1.4294999999999999e-07,1.4294999999999999e-07,1.4297000000000002e-07,1.43e-07,1.43e-07,1.4915000000000001e-07,1.4971999999999999e-07],"442368":[0.0013998820000000001,0.0014056534999999999,0.001413428,0.001450958,0.001451408,0.001451611,0.001466455,0.0014712869999999999,0.00147697775,0.001486937,0.0014898399999999997,0.0014953760000000001,0.0014973814999999996,0.0015012629999999999,0.00151637,0.001544952,0.0015454952499999999,0.0015540860000000001,0.00156271025,0.00156649],"147456":[0.00040691000000000002,0.000419462,0.00042012238095238112,0.0004212175,0.00042341478260869589,0.00042374904761904777,0.00042394513636363643,0.00042570070000000002,0.00042631600000000004,0.00042728725000000002,0.00043063110526315779,0.00043099399999999997,0.00043111480952380944,0.00043356700000000015,0.00043365565000000024,0.00043415238095238117,0.00043786414285714294,0.00043825580952380945,0.00044040499999999989,0.00044110999999999987],"4456448":[0.054773970499999977,0.054865370499999996,0.055030056500000021,0.055061998000000001,0.055138880999999987,0.055417147999999972,0.055520301500000001,0.055604518000000026,0.055697061000000027,0.055938933499999996,0.056047835499999997,0.05606508499999998,0.056178992000000004,0.056200072999999996,0.056329885999999996,0.056510345499999982,0.056670835499999996,0.056806877000000019,0.0568603175,0.05716440300000003],"63488":[0.000113625,0.00011699639999999995,0.0001186185,0.000118832,0.00011962549999999997,0.00012061627272727269,0.00012121692647058824,0.00012133542647058824,0.00012140149253731342,0.00012155235714285712,0.00012310361538461545,0.00012338535384615382,0.00012401262903225806,0.00012441691549295778,0.00012473416666666668,0.00012515199999999998,0.00012593670491803331,0.00012834701538461533,0.00013547345454545455,0.00014809693442622947],"38912":[7.2658180000000007e-05,7.3003900000000001e-05,7.3367099999999998e-05,7.4228433333333336e-05,7.4380630000000006e-05,7.4540620000000004e-05,7.4644280000000005e-05,7.4675460000000004e-05,7.473914e-05,7.4800468749999999e-05,7.5171270000000008e-05,7.5224589999999997e-05,7.5290950000000005e-05,7.530541e-05,7.5563809999999997e-05,7.5840819999999995e-05,7.6240862068965517e-05,7.6815777777777786e-05,7.780919e-05,8.3069e-05],"68":[1.3537999999999999e-07,1.3539e-07,1.3539e-07,1.3539e-07,1.3540000000000001e-07,1.3540999999999999e-07,1.3542e-07,1.3543000000000002e-07,1.3544e-07,1.3545000000000001e-07,1.3584e-07,1.3584e-07,1.3584999999999999e-07,1.3586e-07,1.3587000000000001e-07,1.3588e-07,1.3589000000000001e-07,1.3596999999999999e-07,1.3899e-07,1.4217000000000001e-07],"188416":[0.00055048300000000027,0.00055171699999999996,0.0005553936666666667,0.00056448759999999979,0.00057373526666666653,0.0005751049999999998,0.00057618199999999995,0.00057728500000000008,0.00057778033333333312,0.00057865819999999998,0.0005792200000000003,0.00057963699999999971,0.00057983050000000021,0.00058527699999999982,0.0005873209999999997,0.00058752493333333344,0.00059403364285714284,0.00059557326666666668,0.0006065941428571428,0.00061291380000000014],"248":[4.5613e-07,4.5614000000000001e-07,4.5614000000000001e-07,4.5614000000000001e-07,4.5624000000000001e-07,4.5655999999999995e-07,4.5657000000000002e-07,4.5657000000000002e-07,4.5657000000000002e-07,4.5658000000000003e-07,4.566e-07,4.566e-07,4.566e-07,4.5664000000000004e-07,4.5667999999999998e-07,4.7752e-07,4.7781000000000007e-07,4.7782999999999998e-07,4.7788999999999995e-07,5.0088999999999998e-07],"80":[1.5676999999999999e-07,1.5678e-07,1.5696e-07,1.5696999999999998e-07,1.5696999999999998e-07,1.5719999999999998e-07,1.5719999999999998e-07,1.5721000000000002e-07,1.5721000000000002e-07,1.5721000000000002e-07,1.5721000000000002e-07,1.5722e-07,1.5722999999999999e-07,1.5724999999999998e-07,1.5727e-07,1.5729e-07,1.5732999999999999e-07,1.5832e-07,1.5897e-07,1.7255999999999998e-07],"2560":[4.5826900000000003e-06,4.5828399999999998e-06,4.5838299999999996e-06,4.5846600000000001e-06,4.5846699999999999e-06,4.5847599999999995e-06,4.5847631578947368e-06,4.58478e-06,4.5848100000000004e-06,4.5848800000000002e-06,4.5850199999999999e-06,4.5854899999999997e-06,4.5866700000000001e-06,4.5867399999999999e-06,4.5883599999999997e-06,4.5886999999999998e-06,4.5886999999999998e-06,4.5888899999999995e-06,4.7043699999999998e-06,4.7960899999999998e-06],"34816":[6.5069999999999999e-05,6.5104000000000006e-05,6.512e-05,6.5257173913043474e-05,6.5452562499999998e-05,6.562353191489362e-05,6.6129740000000001e-05,6.6167459999999997e-05,6.6299469387754112e-05,6.6327390000000004e-05,6.6716620000000006e-05,6.7266326086956526e-05,6.7441419999999996e-05,6.7816212765957443e-05,6.8011413043478269e-05,6.8648219999999999e-05,6.9088068181818183e-05,7.1360940000000006e-05,7.1381020000000001e-05,7.3740500000000003e-05],"3712":[6.6403000000000006e-06,6.6423800000000004e-06,6.6531299999999994e-06,6.6534117647058821e-06,6.6540000000000002e-06,6.65625e-06,6.6614999999999997e-06,6.7679100000000007e-06,6.7756900000000003e-06,6.81356e-06,6.8428300000000003e-06,6.8716999999999998e-06,6.8758100000000002e-06,6.9388700000000002e-06,6.9398099999999999e-06,6.9492600000000003e-06,7.0627699999999991e-06,7.1416399999999998e-06,7.2036900000000003e-06,7.7794799999999992e-06],"3538944":[0.042170690500000003,0.042295074499999981,0.042741413499999999,0.042868445499999998,0.042874948499999996,0.042919905999999994,0.043018192999999996,0.043356983499999995,0.043540528500000002,0.043575529000000002,0.043685636,0.043689705000000009,0.043802789500000001,0.043808055499999998,0.043820262999999998,0.043873885499999987,0.043899842499999994,0.043904484000000008,0.044254637999999992,0.04437578499999998],"76":[1.4963e-07,1.4963e-07,1.4963e-07,1.4963e-07,1.4963e-07,1.4963e-07,1.4963999999999998e-07,1.4966999999999999e-07,1.4968e-07,1.4977e-07,1.4984e-07,1.5006000000000001e-07,1.5006999999999999e-07,1.5006999999999999e-07,1.5008e-07,1.5008e-07,1.5008e-07,1.5013000000000001e-07,1.5013999999999999e-07,1.5709000000000001e-07],"4194304":[0.051416279499999981,0.051653787500000027,0.051654847999999996,0.05169253,0.051788192999999996,0.051793817000000006,0.051907604500000003,0.052128229000000005,0.052214212500000003,0.052224902000000004,0.052245558000000004,0.052264748,0.0523826415,0.052488990499999999,0.052550137999999989,0.052618009500000007,0.052619165499999988,0.0527968875,0.053023881500000002,0.054101726000000003],"851968":[0.003610884,0.0036583219999999994,0.0037273759999999997,0.0037725099999999998,0.003842416,0.003873207,0.0038967699999999995,0.0038991030000000001,0.0039108120000000014,0.0039264230000000001,0.0039488199999999987,0.0039579059999999998,0.0039638259999999984,0.0039813029999999985,0.0040320779999999997,0.0040412429999999999,0.0040650020000000016,0.0041254439999999998,0.0042449590000000004,0.0068405530000000018],"4096":[7.3247700000000002e-06,7.3332400000000006e-06,7.3334285714285719e-06,7.3529999999999997e-06,7.3610000000000003e-06,7.3719999999999999e-06,7.3860000000000001e-06,7.4357799999999995e-06,7.4553100000000003e-06,7.5148499999999997e-06,7.5205400000000005e-06,7.5694900000000003e-06,7.5891699999999997e-06,7.5971700000000003e-06,7.6559999999999992e-06,7.6670967741935472e-06,7.6681599999999994e-06,7.6727000000000002e-06,7.6734838709677424e-06,8.5210000000000002e-06],"59392":[0.000111128,0.00011153942857142855,0.00011187443749999999,0.0001125082,0.00011266190277777776,0.00011267123529411761,0.00011280363636363634,0.0001129807323943662,0.00011330705333333336,0.00011364635714285712,0.00011461546153846152,0.00011473007692307687,0.00011502342465753394,0.00011514913636363636,0.00011613461111111112,0.00011659069863013696,0.000116895375,0.0001171163,0.00011725501369863018,0.00011839704838709672],"84":[1.6387e-07,1.6388999999999999e-07,1.6392000000000003e-07,1.6393000000000001e-07,1.6394e-07,1.6395000000000001e-07,1.6399e-07,1.6409000000000001e-07,1.6411000000000001e-07,1.6432e-07,1.6432999999999999e-07,1.6432999999999999e-07,1.6435000000000001e-07,1.6435000000000001e-07,1.6435000000000001e-07,1.6435000000000001e-07,1.6436e-07,1.6436e-07,1.6843999999999999e-07,1.8043000000000001e-07],"3276800":[0.038658042000000004,0.03897867,0.039103898999999998,0.039117615000000015,0.039367548999999981,0.03937109200000001,0.039525282500000002,0.039570866000000003,0.039613411500000001,0.0396354945,0.039674777000000022,0.039752687999999974,0.039867824000000003,0.040002167999999991,0.040083085500000004,0.040086241000000009,0.040144458000000001,0.040289715499999997,0.040317850000000002,0.041042588000000012],"55296":[9.8930000000000003e-05,0.0001018582857142857,0.00010211730769230768,0.00010309523076923078,0.00010400234567901231,0.00010400670491803279,0.00010407457894736842,0.00010415500000000001,0.0001045189,0.00010507129113924052,0.00010551604938271604,0.00010552777777777776,0.00010683124691358021,0.00010728329870129877,0.00010740723188405795,0.00010769193421052632,0.00010817424096385545,0.00010841027777777775,0.0001092094444444444,0.00011218057142857144],"688128":[0.0025726450000000001,0.0026467599999999989,0.002761065,0.0027711395000000008,0.002784197,0.0027887434999999995,0.0027969024999999993,0.0028168779999999992,0.0028538365,0.0028633465000000007,0.0028663650000000001,0.00289785,0.002898660999999999,0.0029203499999999999,0.0029287185,0.0029450460000000002,0.0029948085,0.0032697754999999997,0.0034870629999999994,0.003901556],"8192":[1.46675e-05,1.500823e-05,1.508552e-05,1.5099709999999999e-05,1.510289e-05,1.510424e-05,1.5134119999999999e-05,1.5158859999999999e-05,1.5175080000000002e-05,1.518472e-05,1.518704e-05,1.5195390000000001e-05,1.52346e-05,1.5265469999999999e-05,1.5322117647058823e-05,1.546594e-05,1.5528733333333333e-05,1.5555579999999999e-05,1.5665400000000001e-05,1.5911199999999998e-05],"10240":[1.8294153846153846e-05,1.8297000000000001e-05,1.8297599999999999e-05,1.8304166666666667e-05,1.8315e-05,1.891125e-05,1.8942049999999999e-05,1.8976118279569891e-05,1.8992779999999997e-05,1.9063210000000001e-05,1.9065589999999998e-05,1.9070190000000002e-05,1.9083259999999998e-05,1.9088480000000001e-05,1.9102489999999998e-05,1.9189960000000002e-05,1.9190000000000001e-05,1.928991e-05,1.9333778947368419e-05,2.1338479999999998e-05],"15872":[2.833386956521739e-05,2.8344519999999997e-05,2.8362999999999999e-05,2.8402e-05,2.944258e-05,2.9457939999999997e-05,2.9520620000000001e-05,2.9524249999999998e-05,2.9584690000000001e-05,2.9651666666666666e-05,2.9664829999999996e-05,2.9687799999999997e-05,2.9691000000000001e-05,2.9694999999999999e-05,2.9753820000000001e-05,3.0045229999999997e-05,3.0459979999999998e-05,3.083385e-05,3.1264440000000001e-05,3.36479e-05],"92":[1.7812999999999999e-07,1.7815000000000002e-07,1.7815000000000002e-07,1.7816999999999999e-07,1.7816999999999999e-07,1.7819999999999999e-07,1.7819999999999999e-07,1.7835000000000001e-07,1.7858e-07,1.7858e-07,1.7858999999999999e-07,1.7858999999999999e-07,1.7858999999999999e-07,1.7859999999999997e-07,1.7859999999999997e-07,1.7861000000000001e-07,1.7861000000000001e-07,1.7875000000000001e-07,1.8647e-07,1.8703e-07],"26624":[4.7511e-05,4.7512999999999997e-05,4.7546000000000002e-05,4.9727666666666668e-05,4.97455e-05,4.9747000000000003e-05,4.9761333333333327e-05,4.9774999999999997e-05,4.9811000000000001e-05,5.0045586956521736e-05,5.0098900000000002e-05,5.029919e-05,5.03142e-05,5.0355979999999996e-05,5.079233e-05,5.093317e-05,5.0960379999999999e-05,5.1114779999999999e-05,5.1818769999999997e-05,5.1894329411764706e-05],"1792":[3.2127199999999999e-06,3.2134600000000004e-06,3.2140400000000003e-06,3.2142800000000002e-06,3.2142999999999999e-06,3.2143100000000001e-06,3.2143200000000004e-06,3.2143700000000001e-06,3.21438e-06,3.21438e-06,3.2143999999999997e-06,3.2163399999999999e-06,3.2163500000000001e-06,3.2179799999999998e-06,3.2208200000000003e-06,3.2259600000000003e-06,3.2271200000000001e-06,3.2286299999999999e-06,3.3556900000000001e-06,3.3793499999999997e-06],"11776":[2.1046499999999999e-05,2.1778420000000003e-05,2.1822967741935485e-05,2.18351e-05,2.1837434782608697e-05,2.1862740000000003e-05,2.1869150000000001e-05,2.190014e-05,2.1949479999999999e-05,2.2062e-05,2.2072000000000001e-05,2.2243060000000001e-05,2.2290520000000001e-05,2.2305710000000003e-05,2.234655e-05,2.2382200000000001e-05,2.2635569999999998e-05,2.274422e-05,2.3087033333333334e-05,2.4913729999999997e-05],"2944":[5.2693700000000003e-06,5.2697400000000008e-06,5.2697499999999998e-06,5.2698400000000002e-06,5.2700499999999996e-06,5.2701799999999994e-06,5.2702399999999994e-06,5.2706086956521737e-06,5.2711499999999995e-06,5.2714400000000003e-06,5.2717599999999998e-06,5.2746599999999994e-06,5.2755100000000004e-06,5.27646e-06,5.4535200000000001e-06,5.5188399999999998e-06,5.5194800000000006e-06,5.5271400000000002e-06,5.6309199999999994e-06,5.7877399999999999e-06],"88":[1.7099999999999998e-07,1.7099999999999998e-07,1.7102999999999999e-07,1.7102999999999999e-07,1.7104999999999999e-07,1.7112000000000001e-07,1.7116000000000001e-07,1.7118e-07,1.7144999999999999e-07,1.7144999999999999e-07,1.7147000000000001e-07,1.7147000000000001e-07,1.7148e-07,1.7149000000000001e-07,1.7152000000000002e-07,1.7152000000000002e-07,1.7153e-07,1.7153999999999999e-07,1.7156000000000001e-07,2.0440999999999999e-07],"22528":[4.0253000000000002e-05,4.1480366666666663e-05,4.1670849999999998e-05,4.1687670000000002e-05,4.1852810000000001e-05,4.1860499999999997e-05,4.1884720000000004e-05,4.1914150000000003e-05,4.1914589999999999e-05,4.1956010000000004e-05,4.2229700000000007e-05,4.2321160000000001e-05,4.2330850000000001e-05,4.235999e-05,4.2593519999999999e-05,4.2676700000000004e-05,4.3127380000000002e-05,4.4141999999999999e-05,4.4816823529411764e-05,4.6252419999999999e-05],"1245184":[0.0079654149999999792,0.008135013,0.008233782999999998,0.0082812269999999986,0.0084522225000000038,0.0085334334999999963,0.0086332449999999977,0.0086407150000000002,0.0086442599999999974,0.008799922499999998,0.0088119410000000002,0.0088686899999999968,0.0091907060000000016,0.0092760324999999998,0.0092847650000000004,0.0093844115000000002,0.0095051005000000004,0.0095517775000000006,0.0096509515000000046,0.01046033],"15728640":[0.20569716399999999,0.20662203600000001,0.20669589250000001,0.2076218655,0.20813968350000001,0.208326713,0.20928425849999999,0.2100385115,0.21060501349999999,0.21080753899999999,0.21097805349999998,0.21107868549999997,0.21119117900000001,0.2112254985,0.211438866,0.21268250250000001,0.22602565299999999,0.2273947895,0.230789876,0.23129107100000001],"96":[1.8528e-07,1.8528e-07,1.8528e-07,1.8529000000000001e-07,1.8533999999999999e-07,1.8538999999999999e-07,1.8546000000000002e-07,1.8570999999999999e-07,1.8572e-07,1.8572e-07,1.8572e-07,1.8573000000000001e-07,1.8573999999999999e-07,1.8576999999999998e-07,1.8578000000000001e-07,1.8584999999999999e-07,1.9436000000000003e-07,1.9436000000000003e-07,1.9438e-07,1.9438e-07],"1984":[3.5564299999999999e-06,3.55648e-06,3.55648e-06,3.5564899999999999e-06,3.55651e-06,3.5575100000000001e-06,3.5581900000000002e-06,3.5582300000000001e-06,3.5584300000000001e-06,3.5586800000000002e-06,3.5596299999999997e-06,3.5621600000000001e-06,3.5621999999999995e-06,3.5624599999999999e-06,3.5625899999999997e-06,3.5651999999999998e-06,3.5669899999999996e-06,3.5757999999999997e-06,3.5819500000000001e-06,3.7287899999999999e-06],"139264":[0.00038251000000000002,0.00038526949999999999,0.00038704899999999999,0.00038728100000000001,0.000391226,0.00039266099999999988,0.00039367136000000014,0.0003949089130434783,0.00039507265217391302,0.00039598300000000009,0.00040039600000000002,0.00040588131818181816,0.00040753145454545454,0.0004105135,0.00041180399999999988,0.00041334809090909114,0.0004143024000000001,0.0004143590000000001,0.00042276369565217393,0.0004312250000000002],"475136":[0.001508803,0.0015362675,0.0015396399999999999,0.0015530775000000001,0.0015633719999999999,0.001568882,0.0015750294999999994,0.00157557475,0.001576315,0.001591985,0.0016127095000000005,0.0016135610000000001,0.0016272109999999999,0.0016329865000000005,0.0016340700000000007,0.0016418370000000002,0.0016576435,0.0016619926666666667,0.0017000849999999994,0.0017042525],"13631488":[0.175639716,0.17647803949999999,0.1779591365,0.178882766,0.17904422349999999,0.17910347500000001,0.17958019749999998,0.1796031045,0.179812469,0.18066650000000001,0.18079597650000001,0.18133274999999999,0.18168913149999999,0.18169694450000001,0.18230328099999998,0.183195626,0.18350656050000003,0.18542665550000001,0.19452365099999999,0.194786237],"416":[7.5575999999999999e-07,7.5593000000000002e-07,7.5593000000000002e-07,7.5593000000000002e-07,7.5593999999999998e-07,7.5593999999999998e-07,7.5593999999999998e-07,7.5593999999999998e-07,7.5594999999999994e-07,7.5594999999999994e-07,7.5594999999999994e-07,7.5594999999999994e-07,7.5594999999999994e-07,7.5596e-07,7.5596e-07,7.5596e-07,7.5598000000000002e-07,7.9088e-07,7.9118999999999998e-07,8.9528000000000001e-07],"928":[1.66968e-06,1.6698999999999999e-06,1.66992e-06,1.6699400000000001e-06,1.6699400000000001e-06,1.66998e-06,1.66999e-06,1.6699999999999999e-06,1.6700100000000002e-06,1.67002e-06,1.6700299999999999e-06,1.6700699999999999e-06,1.6700699999999999e-06,1.67012e-06,1.6795899999999999e-06,1.6801399999999998e-06,1.6831300000000002e-06,1.7474799999999999e-06,1.7592199999999999e-06,1.8328699999999999e-06],"512":[9.2671999999999998e-07,9.2676999999999998e-07,9.2691999999999999e-07,9.2702999999999996e-07,9.2711000000000005e-07,9.2712000000000001e-07,9.2712000000000001e-07,9.2712000000000001e-07,9.2713000000000007e-07,9.2713000000000007e-07,9.2715999999999995e-07,9.2717000000000001e-07,9.2717000000000001e-07,9.272000000000001e-07,9.2722999999999997e-07,9.2724000000000004e-07,9.339399999999999e-07,9.7030999999999991e-07,9.7034999999999995e-07,1.01766e-06],"18432":[3.2907333333333329e-05,3.2916500000000002e-05,3.4125689999999997e-05,3.4155439999999998e-05,3.426754e-05,3.4441499999999999e-05,3.4450499999999998e-05,3.4490570000000003e-05,3.4491449999999997e-05,3.4497340000000002e-05,3.4686089743589743e-05,3.4720039999999996e-05,3.4806752941176467e-05,3.4820029999999997e-05,3.4969480000000003e-05,3.4997589999999998e-05,3.5193e-05,3.5507379999999997e-05,3.5671720000000001e-05,3.9002250000000001e-05],"16777216":[0.21995418750000001,0.2202699155,0.2221488375,0.2222843125,0.22277769550000001,0.22334105599999998,0.223508334,0.22401773000000003,0.224019934,0.22405100100000003,0.22407992500000001,0.224972599,0.2250853095,0.2253016075,0.225563601,0.22575839449999999,0.22657917999999999,0.22670334349999999,0.24385319799999999,0.2457488045],"9728":[1.7398000000000002e-05,1.7399666666666665e-05,1.7416999999999999e-05,1.7417500000000001e-05,1.7439999999999999e-05,1.807128e-05,1.810132e-05,1.8185370000000002e-05,1.8203379999999998e-05,1.8219670000000002e-05,1.8240000000000002e-05,1.829006e-05,1.8349309999999998e-05,1.8432810000000001e-05,1.8559469999999999e-05,1.8655740000000001e-05,1.905181e-05,1.90813e-05,1.9100374999999999e-05,2.0584240000000001e-05],"1769472":[0.017152026499999994,0.017352527999999999,0.017352906500000001,0.017488583999999991,0.017550962,0.017606382,0.017609326000000008,0.01761462250000001,0.017687215999999999,0.017702053500000009,0.0177468125,0.017770846,0.017877885499999996,0.017939205499999999,0.0179683585,0.018161927499999998,0.018295459999999982,0.018407633500000006,0.018484591500000001,0.019178140999999999],"1703936":[0.0161008305,0.016161600000000005,0.016207621000000002,0.016277471000000005,0.016324644999999999,0.0163607305,0.016382671000000001,0.016392829499999997,0.016537818999999999,0.016737545999999999,0.016789252499999997,0.0169093235,0.016999034500000003,0.017254101499999994,0.017398390999999992,0.01765982,0.017906891000000001,0.018116794000000002,0.018269404499999992,0.018706794000000002],"2048":[3.6685800000000002e-06,3.6692099999999998e-06,3.6698e-06,3.6703099999999997e-06,3.67052e-06,3.6707500000000004e-06,3.6709900000000002e-06,3.6710300000000001e-06,3.6722300000000002e-06,3.6724300000000002e-06,3.6724600000000002e-06,3.6729099999999999e-06,3.6733200000000002e-06,3.67431e-06,3.67632e-06,3.6769500000000004e-06,3.8437000000000001e-06,3.85106e-06,4.0303799999999999e-06,4.34591e-06],"14336":[2.56205e-05,2.5641000000000001e-05,2.6356719999999999e-05,2.6515415384615386e-05,2.670608e-05,2.6725849999999998e-05,2.6759052631578948e-05,2.681742e-05,2.6838e-05,2.695715e-05,2.7011880000000003e-05,2.7119380000000002e-05,2.7194359999999999e-05,2.7317819999999999e-05,2.7404270000000002e-05,2.7491000000000002e-05,2.7968018867924527e-05,2.8088339999999999e-05,2.8215500000000001e-05,3.0096569999999997e-05],"448":[8.1279000000000001e-07,8.1294999999999998e-07,8.1294999999999998e-07,8.1294999999999998e-07,8.1294999999999998e-07,8.1296000000000005e-07,8.1296000000000005e-07,8.1297000000000001e-07,8.1298000000000007e-07,8.1298999999999992e-07,8.1298999999999992e-07,8.1300999999999995e-07,8.1300999999999995e-07,8.1307000000000001e-07,8.1910999999999998e-07,8.1979999999999997e-07,8.2060999999999999e-07,8.5081999999999999e-07,8.5086000000000004e-07,8.5096000000000004e-07],"5505024":[0.067781578000000023,0.06815093400000001,0.068530358999999999,0.068602143499999976,0.068621046000000047,0.068701028000000025,0.068863438999999999,0.068983903499999971,0.069179333999999953,0.069186816999999998,0.069282972499999984,0.069466464000000033,0.069489283499999971,0.069582851500000001,0.069741749000000047,0.06977227900000002,0.06980633,0.070066310000000034,0.070103867,0.070862210500000009],"544":[9.8371000000000006e-07,9.8371000000000006e-07,9.8378999999999994e-07,9.8378999999999994e-07,9.8413999999999986e-07,9.8413999999999986e-07,9.8414999999999993e-07,9.8414999999999993e-07,9.8414999999999993e-07,9.8415999999999999e-07,9.8415999999999999e-07,9.8415999999999999e-07,9.8415999999999999e-07,9.8418000000000012e-07,9.8420999999999989e-07,1.02969e-06,1.02986e-06,1.0298699999999999e-06,1.0298699999999999e-06,1.02988e-06],"221184":[0.00065964318181818183,0.00066250575000000012,0.00067107100000000019,0.00067972699999999998,0.00068000391666666671,0.00068423500000000038,0.00068620454545454583,0.00068738700000000002,0.00068802000000000002,0.00068878661538461527,0.00068886633333333316,0.000689355,0.00069438100000000021,0.00069584969999999971,0.00069608000000000029,0.00070011141666666645,0.0007045182500000002,0.00070687100000000019,0.00071054699999999996,0.00072059033333333328],"90112":[0.00017428425,0.00017468833333333337,0.00017507182926829271,0.0001753875555555556,0.00018136562500000001,0.00018514175000000001,0.00018822390909090908,0.00019673600000000001,0.0001970601666666667,0.00019783055555555557,0.00020189890697674414,0.00020291390697674416,0.0002036165,0.00020498233333333333,0.00020935957499999998,0.00020976261904761913,0.00021215042857142854,0.000212838,0.00021521060000000001,0.00023664266666666668],"640":[1.15468e-06,1.1547199999999998e-06,1.1547299999999999e-06,1.15477e-06,1.15508e-06,1.1550899999999999e-06,1.1550899999999999e-06,1.1551e-06,1.1551e-06,1.1551e-06,1.1551e-06,1.15511e-06,1.15511e-06,1.15514e-06,1.1551599999999999e-06,1.1551800000000001e-06,1.15521e-06,1.16199e-06,1.2084200000000001e-06,1.20891e-06],"12800":[2.2850750000000001e-05,2.2861500000000001e-05,2.3566710000000325e-05,2.3736499999999999e-05,2.3821590000000002e-05,2.3828370000000002e-05,2.3867150000000001e-05,2.3871190000000002e-05,2.3878219999999999e-05,2.3891989999999997e-05,2.3906040000000001e-05,2.3923249999999998e-05,2.3936949999999998e-05,2.3939666666666667e-05,2.3955999999999999e-05,2.3961899999999998e-05,2.41806e-05,2.4222929999999997e-05,2.504803e-05,2.5093720930232557e-05],"262144":[0.00080518500000000025,0.00081115699999999963,0.00081315500000000008,0.00081566355555555555,0.00081602349999999998,0.00081969200000000001,0.00082424350000000028,0.00082764888888888866,0.00083340399999999972,0.00083616622222222224,0.00083621300000000004,0.00083929949999999968,0.00084016666666666669,0.000843941125,0.00084935922222222212,0.00084949537500000004,0.00085293299999999962,0.00085721979999999994,0.00090686399999999996,0.0010188460000000001],"589824":[0.0020389309999999999,0.002047058,0.0020527609999999993,0.0021585200000000001,0.0021611429999999999,0.0021639839999999999,0.002166276,0.0021669319999999999,0.0021723239999999998,0.0021811619999999999,0.0022042979999999986,0.002218388,0.0022898769999999992,0.002303879,0.0023297020000000008,0.00234951,0.0023644760000000012,0.0024095779999999999,0.0036874074999999999,0.0040928305000000002],"884736":[0.0037921740000000002,0.0039428470000000011,0.0040502840000000003,0.0040514750000000014,0.004061116,0.0040658479999999986,0.0041088229999999993,0.0041689729999999994,0.0041692279999999988,0.0042594899999999977,0.004263991,0.0042767350000000003,0.0042898020000000014,0.0043005739999999997,0.0043129779999999986,0.0043473969999999985,0.0043517440000000003,0.0044572800000000018,0.0053110740000000007,0.0055321630000000023],"6144":[1.0988563636363636e-05,1.0992000000000001e-05,1.10025e-05,1.1002666666666667e-05,1.1005000000000001e-05,1.10225e-05,1.1211839999999999e-05,1.1220970000000001e-05,1.1270729999999999e-05,1.128462e-05,1.129341e-05,1.1335749999999999e-05,1.136013e-05,1.136543e-05,1.1490815789473683e-05,1.1494610000000001e-05,1.1498051282051282e-05,1.171432e-05,1.180319e-05,1.190216e-05],"1088":[1.9559300000000002e-06,1.9560099999999998e-06,1.9561199999999999e-06,1.95614e-06,1.95617e-06,1.9561799999999999e-06,1.9561900000000002e-06,1.9562e-06,1.9562e-06,1.9562099999999999e-06,1.9562099999999999e-06,1.95623e-06,1.9562999999999998e-06,1.9563100000000001e-06,1.9563100000000001e-06,1.9625799999999999e-06,1.9630499999999998e-06,1.9665300000000001e-06,1.9749700000000002e-06,2.14691e-06],"576":[1.0406499999999999e-06,1.0406700000000001e-06,1.0406700000000001e-06,1.04073e-06,1.0410400000000001e-06,1.0410799999999999e-06,1.0410799999999999e-06,1.04109e-06,1.0411000000000001e-06,1.0411100000000001e-06,1.04112e-06,1.04116e-06,1.04116e-06,1.0411700000000001e-06,1.04629e-06,1.05137e-06,1.0894699999999999e-06,1.0896900000000001e-06,1.0899999999999999e-06,1.1426599999999998e-06],"160":[2.9945e-07,2.9946000000000001e-07,2.9947000000000002e-07,2.9956000000000002e-07,2.9989999999999998e-07,2.9989999999999998e-07,2.9989999999999998e-07,2.9990999999999999e-07,2.9990999999999999e-07,2.9992e-07,2.9993000000000001e-07,2.9994000000000002e-07,2.9997000000000001e-07,2.9997000000000001e-07,2.9998000000000002e-07,2.9999999999999999e-07,3.1388e-07,3.1393999999999996e-07,3.2870999999999998e-07,3.2876000000000004e-07],"672":[1.21173e-06,1.2117600000000002e-06,1.2118e-06,1.2118e-06,1.2121499999999999e-06,1.2121499999999999e-06,1.2121499999999999e-06,1.2121499999999999e-06,1.21217e-06,1.2121800000000001e-06,1.2121900000000002e-06,1.2121900000000002e-06,1.2121900000000002e-06,1.2122e-06,1.21223e-06,1.2123199999999999e-06,1.21233e-06,1.2158099999999999e-06,1.26866e-06,1.2691100000000001e-06],"8912896":[0.1126878335,0.11355208,0.1135662925,0.11399267899999999,0.1140172325,0.11413327199999999,0.11419913600000001,0.11438762500000001,0.1148120435,0.11496047199999999,0.11498549399999999,0.115057228,0.11510839899999997,0.115140827,0.115199222,0.11549564950000001,0.115749531,0.11605539600000001,0.1168644215,0.122215797],"100":[1.9239999999999998e-07,1.9241000000000001e-07,1.9245000000000001e-07,1.9261999999999999e-07,1.9283000000000001e-07,1.9286000000000002e-07,1.9286000000000002e-07,1.9286000000000002e-07,1.9286000000000002e-07,1.9286000000000002e-07,1.9287000000000001e-07,1.9287000000000001e-07,1.9287000000000001e-07,1.9287999999999999e-07,1.9287999999999999e-07,1.9289e-07,1.9291e-07,1.9292999999999999e-07,1.9293999999999998e-07,2.1124e-07],"507904":[0.001643011,0.001655505,0.00165833,0.0017001269999999996,0.001719422,0.0017274319999999999,0.0017347969999999993,0.0017375720000000008,0.0017408549999999999,0.0017436140000000005,0.00175679,0.0017874590000000006,0.001837265,0.0018480196666666663,0.0018811029999999999,0.001919867,0.0019366406666666669,0.0020271999999999994,0.0026376456666666668,0.0029298315000000001],"3840":[6.8667100000000005e-06,6.8686200000000003e-06,6.8687299999999995e-06,6.8688299999999998e-06,6.8740499999999999e-06,6.8752099999999997e-06,6.8797700000000002e-06,6.8848888888888894e-06,6.9868700000000004e-06,7.0040200000000007e-06,7.1238400000000006e-06,7.1325200000000004e-06,7.1885600000000007e-06,7.1900000000000006e-06,7.2040799999999996e-06,7.3482299999999998e-06,7.5417199999999999e-06,7.5484300000000008e-06,8.1314100000000005e-06,8.1363799999999992e-06],"192":[3.5643999999999998e-07,3.5644999999999999e-07,3.5647000000000001e-07,3.5648000000000003e-07,3.5648999999999998e-07,3.5651000000000001e-07,3.5652999999999998e-07,3.5688e-07,3.5689000000000001e-07,3.5689000000000001e-07,3.5689000000000001e-07,3.5689999999999997e-07,3.5690999999999998e-07,3.5695000000000003e-07,3.5697e-07,3.5702e-07,3.7348000000000003e-07,3.7348000000000003e-07,3.735e-07,3.9117999999999999e-07],"376832":[0.0011703445,0.0011723839999999996,0.0011800475,0.0011906074999999999,0.0011923813333333329,0.0012013344,0.0012053566000000001,0.0012124786000000001,0.0012197925000000001,0.001224157,0.0012266524999999997,0.0012292760000000001,0.0012382635,0.0012401979999999999,0.0012492999999999998,0.00126121,0.0012776619999999999,0.0012846227999999999,0.0012928730000000004,0.0013078619999999995],"98304":[0.00021638255555555554,0.0002165916842105261,0.00021749157142857139,0.00022458300000000007,0.00022698042857142859,0.00022740271428571424,0.00022809833333333325,0.00023002066666666664,0.0002305858999999999,0.00023284949999999999,0.00023442076470588241,0.00023824533333333337,0.00023897449999999999,0.00023954299999999997,0.00024010500000000001,0.00024121399999999988,0.00024687966666666662,0.00025069273529411764,0.0002508016875,0.00025952466666666677],"5376":[9.6112000000000004e-06,9.6267708333333332e-06,9.6360000000000006e-06,9.6579999999999997e-06,9.7696000000000004e-06,9.7824699999999995e-06,9.7944299999999993e-06,9.802949999999999e-06,9.8452999999999987e-06,9.9013000000000012e-06,9.9052499999999997e-06,9.9318800000000009e-06,9.9390299999999996e-06,9.9637799999999997e-06,9.9733900000000011e-06,9.9823600000000001e-06,1.001345e-05,1.002527e-05,1.021529e-05,1.0548689999999999e-05],"94208":[0.00019062242857142858,0.00019361355555555553,0.00019400314285714291,0.00019803114285714293,0.000199982,0.00020329811111111104,0.00020391633333333332,0.00020742817073170723,0.00021598857142857142,0.00022064327027027019,0.00022133216666666661,0.0002224665384615384,0.00022261871428571424,0.00022326275000000002,0.00022493599999999996,0.00022763772499999899,0.00023302065000000002,0.00023559335897435892,0.00023615733333333329,0.0002416111282051284],"81920":[0.00014693399999999999,0.00015716505555555556,0.00015906749999999994,0.00016021900000000005,0.0001605016603773585,0.00016124859574468084,0.00016158977777777774,0.00016182694117647048,0.00016203744444444446,0.00016228672727272732,0.00016664803999999998,0.0001669891041666667,0.00016878428571428573,0.0001689602,0.00017057997826086958,0.00017135857142857141,0.000172373,0.00017648963636363629,0.00019497231578947372,0.00019913361363636367],"3407872":[0.0405968695,0.040631919000000002,0.040687707500000003,0.041081745999999988,0.041143762,0.041170520999999995,0.041197906999999999,0.041274013500000012,0.041388495999999997,0.041438095000000015,0.041441688000000011,0.041485259499999996,0.041763183000000002,0.041769938999999985,0.04191260149999998,0.04196383599999999,0.042244500499999997,0.042328862499999981,0.042443436500000001,0.043104993000000001],"104":[1.9952e-07,1.9954e-07,1.9954e-07,1.9955000000000001e-07,1.9955000000000001e-07,1.9955000000000001e-07,1.9955999999999999e-07,1.9956999999999998e-07,1.9956999999999998e-07,1.9959e-07,1.9961999999999998e-07,1.9970999999999998e-07,1.9996999999999998e-07,1.9999000000000001e-07,1.9999000000000001e-07,1.9999000000000001e-07,2.0001999999999999e-07,2.0001999999999999e-07,2.0004999999999999e-07,2.093e-07],"122880":[0.00032782349999999994,0.00032896733333333332,0.00033207359259259257,0.00033306899999999986,0.00033535333333333331,0.000341734,0.00034325592592592588,0.00034339970370370369,0.00034554299999999991,0.00034627751999999985,0.00034769166666666671,0.0003478065000000001,0.00034848011111111117,0.00034874546428571428,0.00034926062962962947,0.00035037844444444445,0.00035503666666666678,0.00035642550000000001,0.00036106000000000007,0.00036193169230769225],"200":[3.7068999999999999e-07,3.7075000000000001e-07,3.7076999999999998e-07,3.7092000000000004e-07,3.7112e-07,3.7112e-07,3.7113000000000002e-07,3.7113000000000002e-07,3.7113000000000002e-07,3.7113000000000002e-07,3.7113999999999997e-07,3.7113999999999997e-07,3.7113999999999997e-07,3.7114999999999998e-07,3.7116e-07,3.7116999999999995e-07,3.7119000000000003e-07,3.7121e-07,3.8837000000000003e-07,3.8842999999999999e-07],"163840":[0.00047676800000000014,0.00047985700000000004,0.00048846899999999973,0.0004903435263157892,0.00049409077777777771,0.0004981728333333334,0.00049825399999999984,0.00049835141176470573,0.00049925921052631583,0.0004999146842105263,0.00050031699999999991,0.00050213500000000002,0.00050286000000000016,0.00050431718750000001,0.0005074162500000002,0.00050898405555555568,0.00052030700000000002,0.0005216388823529412,0.00053120166666666678,0.00054073200000000004],"4063232":[0.0487835135,0.048893979500000011,0.049308151499999994,0.0495367065,0.050059396499999999,0.05013893149999997,0.050170005999999989,0.050304236000000002,0.050351049500000009,0.05046248250000003,0.0506892985,0.0507464475,0.050758395499999998,0.050824865500000004,0.0509326295,0.050962575499999996,0.050971759499999991,0.051072306499999998,0.051364766500000013,0.052742363000000014],"5767168":[0.070795690999999966,0.07198562,0.07207463900000001,0.072300840000000005,0.072314240499999974,0.072342997499999992,0.072541117499999946,0.072690724999999998,0.072775947500000007,0.072906002999999997,0.073444418500000025,0.073467188999999974,0.073527775999999975,0.073672467999999949,0.073672979,0.073727988500000008,0.073783653499999977,0.073889304000000017,0.07393155150000004,0.073998895999999967],"12582912":[0.16076317350000002,0.16237868700000002,0.1635549285,0.16388830700000001,0.16392506150000002,0.16394149699999999,0.16407332599999999,0.16430346300000001,0.16431384500000001,0.16493553899999999,0.165061443,0.16581906900000001,0.16635188299999998,0.16703019350000001,0.16754427999999999,0.16870936,0.16893983500000001,0.17750474799999999,0.17781938550000001,0.17926437200000001],"1600":[2.8721299999999996e-06,2.8721399999999998e-06,2.8721399999999998e-06,2.8721600000000004e-06,2.8721600000000004e-06,2.8721999999999998e-06,2.8721999999999998e-06,2.8722699999999996e-06,2.8724099999999997e-06,2.8737100000000004e-06,2.8739999999999999e-06,2.87428e-06,2.8761400000000001e-06,2.8763299999999999e-06,2.8779700000000002e-06,3.0053700000000001e-06,3.0057499999999996e-06,3.0068500000000003e-06,3.0085700000000003e-06,3.1696600000000001e-06],"136":[2.5661000000000002e-07,2.5661999999999998e-07,2.5661999999999998e-07,2.5662999999999999e-07,2.5662999999999999e-07,2.5666999999999998e-07,2.5671999999999999e-07,2.5674000000000001e-07,2.5678e-07,2.5679000000000001e-07,2.5681999999999999e-07,2.5684999999999997e-07,2.5685999999999999e-07,2.5706e-07,2.5706e-07,2.5707000000000001e-07,2.5707999999999997e-07,2.5708999999999998e-07,2.5712999999999997e-07,2.6904999999999999e-07],"232":[4.2762999999999997e-07,4.2762999999999997e-07,4.2763999999999998e-07,4.2765999999999995e-07,4.2806000000000004e-07,4.2806999999999999e-07,4.2808000000000001e-07,4.2808000000000001e-07,4.2808000000000001e-07,4.2809000000000002e-07,4.2809000000000002e-07,4.2809999999999998e-07,4.2810999999999999e-07,4.2812999999999996e-07,4.2812999999999996e-07,4.2817e-07,4.2818000000000001e-07,4.4797000000000001e-07,4.4798000000000002e-07,4.6932999999999998e-07],"7077888":[0.088112609000000008,0.088195931499999977,0.088551458,0.08862788499999999,0.08874092550000004,0.088980004500000001,0.089746990000000054,0.089787771999999974,0.089820643000000006,0.089893523499999975,0.0899943775,0.090295257999999975,0.090302562499999975,0.0907676345,0.091198853000000038,0.091247647499999973,0.091285607500000004,0.091445895500000027,0.091514466999999974,0.091534235000000019],"86016":[0.00016225000000000001,0.00016780858823529414,0.00016824774468085103,0.00016938808333333337,0.00017052877777777773,0.00017084012765957438,0.00017354979166666663,0.00017584385714285714,0.00017712604255319141,0.00017891300000000005,0.00017895112499999999,0.000184852,0.00018543476190476202,0.00018654220930232549,0.00018868522222222233,0.00019893885714285706,0.000203776,0.00020502725000000002,0.00020505450000000004,0.00020770144444444459],"31744":[6.0278010000000002e-05,6.0328999999999998e-05,6.0489419999999999e-05,6.0754010000000002e-05,6.0761169999999995e-05,6.0911010000000001e-05,6.1050540000000004e-05,6.1124980000000007e-05,6.1141099999999996e-05,6.1144930000000007e-05,6.1637429999999996e-05,6.1640189999999999e-05,6.1697319999999998e-05,6.1748700000000001e-05,6.1750979999999997e-05,6.2102039999999999e-05,6.2127019999999998e-05,6.2181875000000007e-05,6.2476449999999994e-05,6.3270700000000004e-05],"168":[3.1374e-07,3.1375999999999997e-07,3.1377000000000004e-07,3.1418000000000002e-07,3.1418000000000002e-07,3.1418000000000002e-07,3.1418999999999998e-07,3.1418999999999998e-07,3.1418999999999998e-07,3.1418999999999998e-07,3.1419999999999999e-07,3.1421000000000001e-07,3.1421000000000001e-07,3.1421000000000001e-07,3.1421000000000001e-07,3.1423000000000003e-07,3.1425e-07,3.2880999999999999e-07,3.2880999999999999e-07,3.4431000000000004e-07],"622592":[0.0022419859999999992,0.0022746120000000001,0.0022765139999999999,0.0022766639999999999,0.002297,0.00231687,0.0023241310000000005,0.002329177,0.0023315979999999998,0.0023474400000000001,0.0023549979999999988,0.002358415,0.0023859149999999993,0.002410822,0.0024203999999999988,0.0024458549999999998,0.0024750170000000008,0.0024983519999999993,0.002529608,0.0025760800000000001],"108":[2.0667000000000001e-07,2.0669999999999999e-07,2.0671e-07,2.0671e-07,2.0672000000000001e-07,2.0673e-07,2.0675000000000002e-07,2.0676000000000001e-07,2.0678e-07,2.0678999999999999e-07,2.0678999999999999e-07,2.0687999999999998e-07,2.0709999999999999e-07,2.0710999999999998e-07,2.0710999999999998e-07,2.0712000000000002e-07,2.0712000000000002e-07,2.0713e-07,2.0713999999999999e-07,2.0718000000000001e-07],"327680":[0.00099959799999999998,0.0010019403333333334,0.0010146086666666665,0.0010371885714285714,0.0010464886666666667,0.0010492710000000005,0.0010497919999999997,0.0010538735,0.0010592819999999999,0.0010641720000000006,0.0010699220000000001,0.0010706075000000001,0.0010717246666666663,0.0010723385000000001,0.0010749844999999999,0.0010767414999999999,0.0010777918333333414,0.0010825736666666666,0.0010825833333333334,0.001083136],"2176":[3.89735e-06,3.8975499999999996e-06,3.8984700000000005e-06,3.8985899999999995e-06,3.8987000000000005e-06,3.8987599999999996e-06,3.8990999999999997e-06,3.9005199999999999e-06,3.9005899999999997e-06,3.9006200000000001e-06,3.9007700000000004e-06,3.9035799999999996e-06,3.9044600000000002e-06,3.9084100000000004e-06,3.9108200000000004e-06,3.9120700000000006e-06,4.0659499999999996e-06,4.0791499999999997e-06,4.1910299999999998e-06,4.2809899999999995e-06],"3328":[5.9550700000000004e-06,5.9557700000000002e-06,5.9594400000000003e-06,5.9611964285714279e-06,5.9624099999999997e-06,6.0846499999999994e-06,6.1030100000000005e-06,6.1373600000000005e-06,6.1447699999999996e-06,6.1856599999999997e-06,6.2299899999999998e-06,6.23187e-06,6.2408999999999998e-06,6.2462499999999997e-06,6.3824499999999993e-06,6.3946200000000003e-06,6.4491400000000001e-06,6.5403699999999997e-06,6.5569399999999993e-06,6.9775299999999992e-06],"1":[1.7430000000000001e-08,1.7430000000000001e-08,1.7430000000000001e-08,1.7430000000000001e-08,1.7430000000000001e-08,1.7430000000000001e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.824e-08,1.8250000000000001e-08,1.913e-08,1.9139999999999998e-08,1.9139999999999998e-08,1.9139999999999998e-08,1.9630000000000001e-08,1.9640000000000002e-08],"2":[1.8980000000000002e-08,1.8980000000000002e-08,1.8980000000000002e-08,1.8980000000000002e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.899e-08,1.9870000000000002e-08,1.9870000000000002e-08,1.988e-08,1.988e-08,1.988e-08,2.084e-08],"3":[2.0169999999999998e-08,2.0219999999999998e-08,2.0240000000000001e-08,2.0249999999999999e-08,2.0260000000000001e-08,2.0260000000000001e-08,2.0269999999999999e-08,2.0269999999999999e-08,2.0269999999999999e-08,2.0269999999999999e-08,2.0269999999999999e-08,2.028e-08,2.028e-08,2.028e-08,2.028e-08,2.0289999999999998e-08,2.0310000000000001e-08,2.1200000000000001e-08,2.1220000000000001e-08,2.1249999999999998e-08],"4":[2.1579999999999999e-08,2.159e-08,2.1600000000000002e-08,2.1600000000000002e-08,2.1619999999999998e-08,2.1619999999999998e-08,2.1619999999999998e-08,2.1629999999999999e-08,2.1629999999999999e-08,2.1629999999999999e-08,2.1629999999999999e-08,2.1640000000000001e-08,2.1640000000000001e-08,2.1640000000000001e-08,2.1640000000000001e-08,2.1640000000000001e-08,2.1730000000000003e-08,2.2630000000000001e-08,2.2630000000000001e-08,2.456e-08],"7424":[1.3281833333333334e-05,1.3284999999999999e-05,1.366788e-05,1.368083e-05,1.368291e-05,1.3717600000000001e-05,1.371984e-05,1.3731579999999999e-05,1.37412e-05,1.377949e-05,1.3805099999999999e-05,1.38201e-05,1.3868760000000001e-05,1.3916829999999999e-05,1.406924e-05,1.4275019999999999e-05,1.445191e-05,1.4478780000000001e-05,1.4517469999999999e-05,1.5724909090909092e-05],"5":[2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.2989999999999999e-08,2.3000000000000001e-08,2.3000000000000001e-08,2.3000000000000001e-08,2.3000000000000001e-08,2.3010000000000002e-08,2.4059999999999998e-08,2.4059999999999998e-08,2.4059999999999998e-08,2.407e-08,2.524e-08,2.5440000000000001e-08],"23552":[4.2020999999999996e-05,4.2039999999999997e-05,4.2048000000000001e-05,4.2058999999999998e-05,4.2063e-05,4.2076999999999997e-05,4.2089999999999999e-05,4.3844219999999997e-05,4.3993789473684211e-05,4.4021640000000002e-05,4.4075230000000003e-05,4.4162000000000002e-05,4.4239070000000006e-05,4.4499700000000004e-05,4.476119e-05,4.4811149999999999e-05,4.4947690000000003e-05,4.5489650000000002e-05,4.669462e-05,4.840391e-05],"6":[2.3899999999999999e-08,2.398e-08,2.4010000000000001e-08,2.4010000000000001e-08,2.4030000000000001e-08,2.4030000000000001e-08,2.4040000000000002e-08,2.4049999999999997e-08,2.407e-08,2.412e-08,2.4310000000000001e-08,2.4310000000000001e-08,2.4310000000000001e-08,2.4310000000000001e-08,2.4320000000000002e-08,2.5040000000000001e-08,2.5250000000000001e-08,2.5450000000000003e-08,2.6379999999999999e-08,2.6840000000000001e-08],"61440":[0.00011445063157894731,0.00011473333333333331,0.0001147596,0.00011554125,0.00011650250000000005,0.00011651559375,0.00011684909722222221,0.00011707425714285714,0.00011725746153846152,0.0001172740666666667,0.00011829195454545454,0.000118497,0.00011850530985915495,0.00011897244285714284,0.0001190218,0.00012082833333333335,0.00012131239705882358,0.00012389566666666667,0.00012739805882352938,0.00013016325454545457],"491520":[0.0016023470000000005,0.001616347,0.001632978,0.0016460870000000003,0.0016642614999999999,0.0016658599999999999,0.0016665510000000001,0.0016690909999999997,0.001674184,0.0016799550000000003,0.001681901,0.0016859514999999999,0.0016954489999999999,0.001697048,0.0016970829999999998,0.0017023800000000005,0.001736645,0.001751659,0.0017750723333333335,0.001780256],"77824":[0.00014800349999999999,0.00015067750909090904,0.00015208723214285715,0.00015245369999999998,0.00015281635294117648,0.0001536393333333333,0.00015470881249999999,0.0001547818936170213,0.00015547802083333334,0.00015689391666666666,0.00015802595999999999,0.0001621586666666667,0.00016220355555555558,0.00016314649999999993,0.00016316287755102041,0.00016762919999999999,0.00017150314285714293,0.00017812369565217394,0.00017866959999999994,0.00020394895238095241],"7":[2.4920000000000001e-08,2.494e-08,2.4970000000000001e-08,2.5000000000000002e-08,2.5009999999999997e-08,2.5210000000000002e-08,2.5650000000000001e-08,2.5650000000000001e-08,2.5659999999999999e-08,2.5659999999999999e-08,2.5670000000000001e-08,2.5679999999999999e-08,2.6829999999999999e-08,2.6840000000000001e-08,2.6850000000000002e-08,2.688e-08,2.693e-08,2.7420000000000003e-08,2.8139999999999999e-08,2.824e-08],"8":[2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.6989999999999999e-08,2.7e-08,2.7e-08,2.7e-08,2.7640000000000001e-08,2.8250000000000002e-08,2.8250000000000002e-08,2.8250000000000002e-08,2.8260000000000003e-08,2.8260000000000003e-08,2.9639999999999999e-08,2.9650000000000001e-08],"208":[3.8492999999999999e-07,3.8513999999999997e-07,3.8513999999999997e-07,3.8513999999999997e-07,3.8532999999999997e-07,3.8535000000000005e-07,3.8535000000000005e-07,3.8535000000000005e-07,3.8536e-07,3.8537000000000002e-07,3.8537000000000002e-07,3.8537000000000002e-07,3.8537000000000002e-07,4.0286e-07,4.0287999999999997e-07,4.0288999999999998e-07,4.0325999999999997e-07,4.0325999999999997e-07,4.2308999999999996e-07,4.3033000000000002e-07],"9":[2.8320000000000001e-08,2.8320000000000001e-08,2.8320000000000001e-08,2.8320000000000001e-08,2.8320000000000001e-08,2.833e-08,2.833e-08,2.8770000000000002e-08,2.9639999999999999e-08,2.9639999999999999e-08,2.9650000000000001e-08,2.9650000000000001e-08,2.9650000000000001e-08,2.9650000000000001e-08,2.9650000000000001e-08,2.9650000000000001e-08,2.9650000000000001e-08,3.0000000000000004e-08,3.0540000000000001e-08,3.1120000000000003e-08],"73728":[0.00013504200000000001,0.00013972861904762042,0.00013992399999999993,0.00014007947058823533,0.00014108,0.00014225199999999999,0.00014329263636363634,0.00014340589090909087,0.000144532625,0.00014506615384615387,0.00014549728571428572,0.00014589308474576267,0.00014721623636363635,0.00014987063636363635,0.00015050325,0.00015130187499999995,0.00015170159259259223,0.00015803219607843136,0.000161504375,0.00017860020408163267],"304":[5.5596000000000001e-07,5.5598999999999999e-07,5.5601000000000001e-07,5.5601000000000001e-07,5.5621999999999999e-07,5.5627999999999995e-07,5.5637999999999996e-07,5.5639999999999998e-07,5.5640999999999994e-07,5.5642e-07,5.5643000000000007e-07,5.5646000000000005e-07,5.5646000000000005e-07,5.5652000000000001e-07,5.5675999999999996e-07,5.5687999999999999e-07,5.8189999999999999e-07,5.8233e-07,5.8233999999999996e-07,5.8294999999999996e-07],"400":[7.2702000000000001e-07,7.2706000000000005e-07,7.2706999999999991e-07,7.2713999999999993e-07,7.2713999999999993e-07,7.2715e-07,7.2744999999999991e-07,7.2744999999999991e-07,7.2744999999999991e-07,7.2745999999999998e-07,7.2748e-07,7.2748e-07,7.2748e-07,7.2749000000000006e-07,7.2758000000000001e-07,7.3301999999999993e-07,7.9796000000000009e-07,7.9820999999999989e-07,7.9841999999999997e-07,8.610000000000001e-07],"1310720":[0.0091715630000000006,0.0092511949999999933,0.0092614315000000003,0.0094065775000000008,0.0094312910000000048,0.0095090344999999993,0.0095473725000000034,0.0095521245000000001,0.0096421980000000046,0.0097534334999999951,0.0098164110000000006,0.0098226305000000003,0.010051991,0.010158410500000001,0.0101785165,0.010202097,0.010207437,0.010579397000000001,0.0108103405,0.014733784],"336":[6.1305e-07,6.1307000000000002e-07,6.1315999999999997e-07,6.1317999999999999e-07,6.1334000000000006e-07,6.1340999999999999e-07,6.1348999999999997e-07,6.1348999999999997e-07,6.1350000000000003e-07,6.1350000000000003e-07,6.1350000000000003e-07,6.1350999999999999e-07,6.1350999999999999e-07,6.1352000000000006e-07,6.1352000000000006e-07,6.1361e-07,6.1363000000000002e-07,6.2027999999999999e-07,6.4171999999999995e-07,6.4209999999999996e-07],"3670016":[0.044082914500000001,0.044324892000000012,0.0443998855,0.044433974000000001,0.044476040999999987,0.044503758499999983,0.044623660000000002,0.04463686,0.04469627399999998,0.04495998549999998,0.045026697000000004,0.045051760500000003,0.045360527000000019,0.045460222000000008,0.045551354999999988,0.045578407000000001,0.045633357000000013,0.045778313499999987,0.045858572,0.046497683999999997],"6656":[1.19e-05,1.1913333333333333e-05,1.1917666666666668e-05,1.1920000000000001e-05,1.1922333333333333e-05,1.215791e-05,1.2205940000000001e-05,1.221131e-05,1.223739e-05,1.2239569999999998e-05,1.225853e-05,1.230377e-05,1.2328529999999999e-05,1.2332689999999999e-05,1.238007e-05,1.239816e-05,1.2430280000000001e-05,1.2473289999999999e-05,1.2896e-05,1.401259e-05],"15360":[2.7477000000000001e-05,2.8188675675675673e-05,2.8376199999999998e-05,2.839115e-05,2.8435340000000001e-05,2.8443307692307694e-05,2.8507700000000002e-05,2.8584750000000001e-05,2.8687926829268293e-05,2.882739e-05,2.8962839999999999e-05,2.9117959999999999e-05,2.9218310000000002e-05,2.9252050000000001e-05,2.9275799999999998e-05,3.0050910000000001e-05,3.0286820000000001e-05,3.248733333333333e-05,3.2514333333333335e-05,3.2531530000000001e-05],"432":[7.8400999999999999e-07,7.8403000000000001e-07,7.8436000000000002e-07,7.8444e-07,7.8444e-07,7.8444999999999996e-07,7.8444999999999996e-07,7.8444999999999996e-07,7.8444999999999996e-07,7.8446000000000002e-07,7.8446000000000002e-07,7.8446999999999998e-07,7.8448000000000005e-07,7.844899999999999e-07,7.8451000000000003e-07,7.8451000000000003e-07,7.8451999999999999e-07,7.8453000000000005e-07,8.2096999999999997e-07,8.2127999999999995e-07],"950272":[0.0042156090000000004,0.0043903650000000002,0.0045337160000000001,0.0045951869999999997,0.0046362749999999996,0.0046618529999999997,0.0047363829999999985,0.0047526410000000002,0.004789675000000001,0.0048406129999999988,0.0048878519999999998,0.0049466970000000016,0.0049503680000000001,0.0049559119999999998,0.0050509699999999992,0.0050668359999999999,0.0050863340000000014,0.0051049879999999995,0.0056388210000000013,0.0059158589999999999],"655360":[0.0024031069999999998,0.0024261559999999996,0.0024481080000000001,0.0024553959999999994,0.0024591909999999999,0.0024604879999999998,0.0024777329999999998,0.002490543,0.002490791,0.0025127589999999998,0.002519870999999999,0.0025208210000000008,0.0025296340000000002,0.0025506000000000001,0.0026285420000000002,0.002634558,0.0028120570000000002,0.002854975,0.0029498915000000002,0.003595778],"69632":[0.00012648499999999999,0.00013072535714285716,0.00013183566666666668,0.00013439349180327878,0.00013476431034482761,0.0001367923442622951,0.00013700461818181816,0.000137274,0.00013734838461538463,0.00013762588135593227,0.0001383024705882353,0.0001383715833333333,0.00014163027118644066,0.00014547582456140353,0.00014844827586206895,0.00014864124999999995,0.0001493902857142857,0.00015216950909090906,0.00015475580000000005,0.00018664969999999999],"11264":[2.0137999999999999e-05,2.0152666666666668e-05,2.0952929999999999e-05,2.0954989999999998e-05,2.098249e-05,2.1031750000000001e-05,2.1065960000000002e-05,2.1070999999999999e-05,2.1075149999999998e-05,2.1084e-05,2.1144909999999999e-05,2.1147859999999998e-05,2.1316290000000001e-05,2.1419719999999999e-05,2.149418e-05,2.1627500000000003e-05,2.1640244897959184e-05,2.173717e-05,2.2012630000000002e-05,2.2573139999999998e-05],"2752512":[0.031798834500000012,0.03180186950000001,0.032152970999999989,0.032181032000000012,0.032239674500000016,0.032291306500000012,0.032306406500000016,0.032345401500000016,0.032363394499999976,0.032366430000000002,0.032615119000000012,0.03261539950000001,0.03267920349999999,0.03274596350000001,0.032844324000000001,0.03288189150000001,0.033140734500000005,0.033273451500000002,0.033407433000000028,0.034251568500000017],"8126464":[0.1022795155,0.10312045349999999,0.10330213399999999,0.103621911,0.10389849449999999,0.103935901,0.10395525849999998,0.10417343950000002,0.10419946150000001,0.10423383250000001,0.1043720905,0.10438053899999999,0.10499443999999999,0.10516676799999999,0.105340538,0.1054032405,0.10541310500000001,0.10554645949999999,0.10581074899999998,0.11217799049999999],"27648":[4.9391000000000002e-05,5.1307249999999999e-05,5.1656500000000003e-05,5.1657999999999999e-05,5.1725961038961035e-05,5.1737438202247189e-05,5.1794410000000001e-05,5.1882799999999997e-05,5.2106260000000003e-05,5.2177079999999997e-05,5.2313448275862067e-05,5.2380419999999999e-05,5.2502260000000004e-05,5.2559229999999999e-05,5.258492e-05,5.2955959999999996e-05,5.3124083333333332e-05,5.3190090000000004e-05,5.3274580000000005e-05,5.3850988095238098e-05],"368":[6.7008000000000003e-07,6.7009999999999995e-07,6.7025000000000006e-07,6.7051000000000004e-07,6.7051999999999989e-07,6.7051999999999989e-07,6.7051999999999989e-07,6.7052999999999996e-07,6.7052999999999996e-07,6.7054000000000002e-07,6.7054999999999998e-07,6.7054999999999998e-07,6.7057e-07,6.7059999999999998e-07,6.7059999999999998e-07,6.7077999999999998e-07,6.771900000000001e-07,7.0124999999999996e-07,7.3537999999999996e-07,7.3587000000000004e-07],"65536":[0.0001218266,0.0001226539090909091,0.00012269599999999999,0.00012304499999999996,0.00012326146153846153,0.00012344599999999998,0.00012385764705882357,0.00012466676562500001,0.00012541434328358202,0.000126212984375,0.00012654569999999996,0.00012820106060606058,0.00012840938095238092,0.0001287390303030303,0.00012889176470588234,0.00013065450000000002,0.00013119968518518518,0.00013322829508196715,0.00013697715384615385,0.0001454850000000001],"16252928":[0.21196136399999999,0.21404301450000002,0.21464384600000003,0.2147381475,0.215108142,0.21525943549999998,0.21544733700000002,0.21569823900000001,0.21608466749999999,0.21633870899999999,0.21807371599999997,0.21866498849999999,0.2187170115,0.21873651150000001,0.21946301500000001,0.21980514300000001,0.23197553949999999,0.23405611799999998,0.2369472295,0.2415176215],"464":[8.4105999999999994e-07,8.4112e-07,8.4146000000000007e-07,8.4147000000000003e-07,8.4147999999999999e-07,8.4147999999999999e-07,8.4147999999999999e-07,8.4147999999999999e-07,8.4147999999999999e-07,8.4147999999999999e-07,8.4148999999999995e-07,8.4148999999999995e-07,8.4148999999999995e-07,8.4148999999999995e-07,8.4152000000000003e-07,8.415300000000001e-07,8.8069999999999999e-07,8.8072999999999997e-07,9.2371e-07,9.2383999999999999e-07],"1015808":[0.005292621,0.0053369349999999984,0.0053457799999999996,0.0054386589999999976,0.0054839259999999983,0.00551309,0.0055462990000000011,0.005548674,0.005613814,0.0056296590000000004,0.0056754040000000019,0.0057011350000000004,0.0057275719999999976,0.005791888000000002,0.0058035229999999789,0.0058835899999999984,0.0060507190000000004,0.0060955419999999998,0.0062577230000000015,0.0072864769999999995],"3072":[5.4970599999999992e-06,5.4979899999999999e-06,5.49804e-06,5.4981699999999997e-06,5.49821e-06,5.5008800000000004e-06,5.5018099999999994e-06,5.5033800000000008e-06,5.5035399999999993e-06,5.5080699999999994e-06,5.5088599999999996e-06,5.5115899999999992e-06,5.5126199999999992e-06,5.6139499999999998e-06,5.6726100000000004e-06,5.67792e-06,5.6831600000000007e-06,5.8891799999999997e-06,6.0353100000000003e-06,6.0354300000000003e-06],"110592":[0.00026242099999999999,0.00027694166666666675,0.00027778625,0.00028450099999999999,0.00028459250000000002,0.00028465262962962961,0.00028746649999999996,0.00028795766666666668,0.0002883534193548386,0.00029056000000000009,0.00029075199999999992,0.0002930505666666666,0.00029316493749999999,0.00029345,0.00029414699999999992,0.0002965879666666667,0.00029818259999999991,0.00030145550000000001,0.00030413928571428571,0.00031011649999999988],"237568":[0.00071655799999999963,0.00071674399999999974,0.00073671019999999976,0.00073734936363636342,0.000739243,0.00074194199999999999,0.00074677199999999993,0.00074933319999999999,0.00075639499999999998,0.00075699610000000005,0.00075762327272727286,0.00075819660000000003,0.00075928759999999986,0.00076126777777777799,0.00076221200000000007,0.0007640889999999997,0.0007656211,0.0007674412500000003,0.00077072236363636391,0.00078658000000000005],"278528":[0.00084812287499999995,0.00085605657142857146,0.0008594955,0.00087862024999999964,0.0008814545,0.00088428750000000037,0.000884445375,0.00088640414285714292,0.00089355599999999999,0.00089503050000000006,0.00089646750000000003,0.00089689549999999994,0.00089836500000000025,0.00090866199999999997,0.00091063837499999988,0.00091104099999999959,0.00091280300000000001,0.00091549700000000003,0.0009174675,0.00092211512499999998],"496":[8.9808999999999996e-07,8.9812000000000005e-07,8.9815999999999999e-07,8.9815999999999999e-07,8.9854999999999996e-07,8.9856000000000002e-07,8.9856000000000002e-07,8.9856000000000002e-07,8.9857000000000008e-07,8.9857000000000008e-07,8.9858000000000004e-07,8.985899999999999e-07,8.985899999999999e-07,8.9863000000000005e-07,8.9864999999999996e-07,8.9865999999999992e-07,8.9925000000000001e-07,9.4042999999999991e-07,9.4048999999999997e-07,9.4049999999999993e-07],"13107200":[0.16779205899999999,0.1682185215,0.17082234899999998,0.170994429,0.1717550175,0.171790269,0.17204840100000002,0.17209295349999998,0.172115566,0.17213054850000001,0.17238592450000001,0.1724440575,0.17255086749999998,0.17275237099999999,0.17397021500000001,0.17432908699999999,0.17451385250000001,0.182678437,0.18663790199999999,0.18703452199999998],"9961472":[0.12725792699999999,0.12742118899999999,0.1275401675,0.12784276300000003,0.12809442200000001,0.12811439250000001,0.129173661,0.12927456799999998,0.12967200950000002,0.12979353099999999,0.1300678445,0.13022413100000002,0.13029893349999999,0.1304076525,0.130498262,0.13115883849999999,0.1318947365,0.133395495,0.13810117399999999,0.14146783399999999],"5888":[1.0524600000000001e-05,1.05505e-05,1.0555333333333332e-05,1.074392e-05,1.077903e-05,1.081395e-05,1.087759e-05,1.0885e-05,1.0885330000000001e-05,1.089127e-05,1.0908179999999999e-05,1.0980519999999999e-05,1.0981090000000002e-05,1.1015470000000001e-05,1.1028999999999999e-05,1.1038e-05,1.1071e-05,1.1232110000000001e-05,1.153998e-05,1.24686e-05],"11010048":[0.141575645,0.14164916050000001,0.14176203500000001,0.14205586100000001,0.14213914699999999,0.14254494549999999,0.14269237700000004,0.14284430100000001,0.14298317000000005,0.143004352,0.1430176255,0.14370774450000001,0.14371950950000001,0.14396400200000001,0.14417870399999999,0.14421536299999999,0.14429867499999999,0.14454799199999999,0.1461671655,0.15883191899999999],"1920":[3.4404900000000001e-06,3.4405999999999997e-06,3.4408900000000001e-06,3.4420300000000002e-06,3.4422899999999998e-06,3.4425399999999999e-06,3.4425399999999999e-06,3.4425699999999999e-06,3.4425900000000004e-06,3.4426900000000002e-06,3.4441400000000005e-06,3.4444199999999997e-06,3.4444800000000001e-06,3.44592e-06,3.4494700000000002e-06,3.4500299999999996e-06,3.4564699999999999e-06,3.4572800000000002e-06,3.6062699999999997e-06,3.6160899999999997e-06],"2490368":[0.028156344999999999,0.028187998499999999,0.028326492500000001,0.028565015500000002,0.028572172999999999,0.0286272825,0.0290062045,0.029022817999999988,0.029035574499999987,0.029066546499999991,0.029078640499999996,0.029084455999999998,0.029109864000000006,0.029292973999999999,0.029333717000000016,0.029395077000000002,0.029468576,0.029575768499999999,0.030039275000000011,0.030509841000000003],"19456":[3.474333333333333e-05,3.4771999999999998e-05,3.61479e-05,3.619932835820896e-05,3.6237740000000003e-05,3.6374500000000002e-05,3.6375000000000003e-05,3.6384999999999998e-05,3.6498049999999999e-05,3.6536989999999999e-05,3.671011e-05,3.6847709999999997e-05,3.6889820000000002e-05,3.6890839999999999e-05,3.7176140000000001e-05,3.7184439999999999e-05,3.7200450000000001e-05,3.7816550000000003e-05,3.834055e-05,3.8358709999999996e-05],"57344":[0.000102583,0.000107248,0.000107342,0.00010771347368421051,0.00010810083783783786,0.00010816921428571428,0.00010857179220779219,0.00010950422727272726,0.00010959271428571432,0.0001097232125,0.0001100985625,0.00011048515384615384,0.00011057017857142855,0.00011090205063291141,0.00011165391304347828,0.0001120513648648649,0.000112650417721519,0.00011571928571428569,0.00012481455882352939,0.00013873799999999996],"1179648":[0.0066359369999999997,0.0070183510000000043,0.007023080000000001,0.0071647289999999999,0.0071836679999999998,0.0072046660000000028,0.0072950000000000003,0.007338370999999998,0.0073522590000000025,0.0073762339999999997,0.0074302730000000029,0.0074995899999999978,0.007511172,0.0076434669999999993,0.0076899235000000028,0.0077429259999999998,0.0081631200000000029,0.0083264285,0.0084514694999999994,0.0091601215],"4718592":[0.057279842999999997,0.057836330000000012,0.058098005499999973,0.058334690500000022,0.058404763999999998,0.058404807999999989,0.058426523499999973,0.05865559599999999,0.058708323,0.058731202000000003,0.058966963999999997,0.059138382499999996,0.059321890499999988,0.059430059,0.059472075999999999,0.059521263999999997,0.05971154,0.06003109999999999,0.060269735999999983,0.060911040999999985],"360448":[0.0011267355,0.0011280976,0.0011420549999999999,0.0011504945000000003,0.0011530785,0.00115598,0.0011570593999999999,0.0011749245000000001,0.0011830859999999999,0.0011840680000000001,0.0011867549999999998,0.001191720333333333,0.001194383,0.001196541,0.001204678,0.0012104029999999999,0.001217597,0.0012179235999999999,0.0012192795000000001,0.001318512],"1572864":[0.013866482499999999,0.013989076499999999,0.0140960615,0.014224058500000008,0.014233769,0.014243885,0.014362274499999999,0.014446973,0.014459406499999994,0.0144939575,0.0145362875,0.014544381,0.014553662,0.014591723000000001,0.014719651,0.0147385165,0.0149020905,0.015314719000000001,0.015362414,0.016012308999999995],"53248":[9.9585000000000003e-05,9.9587999999999996e-05,9.9662720000000005e-05,0.00010045745783132528,0.00010052464556962025,0.00010057461538461546,0.00010086616867469882,0.0001009523125,0.00010111151807228917,0.00010148955555555558,0.00010185333333333335,0.0001024459166666667,0.00010250592307692312,0.0001044026,0.00010610990909090909,0.00010689299999999997,0.00010744055952380952,0.00010905244444444444,0.00010984801282051281,0.00012622166153846153],"3456":[6.1831899999999997e-06,6.1833099999999996e-06,6.1835099999999992e-06,6.1836400000000007e-06,6.1839399999999996e-06,6.1873299999999996e-06,6.1951500000000003e-06,6.2123500000000008e-06,6.3048499999999994e-06,6.3155599999999999e-06,6.3187300000000006e-06,6.3457099999999999e-06,6.3479099999999997e-06,6.3700199999999997e-06,6.4425300000000001e-06,6.4756299999999999e-06,6.6137599999999998e-06,6.7218699999999996e-06,6.7891100000000006e-06,6.79702e-06],"40960":[7.6535032608695649e-05,7.6575000000000005e-05,7.6605000000000003e-05,7.7613800000000006e-05,7.7880639999999997e-05,7.7917592592592597e-05,7.9122913043478259e-05,7.9252400000000007e-05,7.9268089999999993e-05,7.930333333333333e-05,7.9412920000000015e-05,7.9427660000000002e-05,7.9449342857142868e-05,7.9519819999999999e-05,7.9576959999999998e-05,7.9811375000000005e-05,7.9865454545454548e-05,8.0284809523809524e-05,8.0401069999999996e-05,8.0617469999999996e-05],"4608":[8.2402100000000002e-06,8.2403076923076924e-06,8.241083333333333e-06,8.2475500000000003e-06,8.2494999999999995e-06,8.2519999999999999e-06,8.2556000000000011e-06,8.4133700000000011e-06,8.413780000000001e-06,8.4419600000000004e-06,8.4447999999999992e-06,8.4457900000000007e-06,8.4464700000000008e-06,8.4792500000000002e-06,8.4931399999999995e-06,8.5876599999999997e-06,8.5993500000000009e-06,8.6113400000000011e-06,9.0030500000000001e-06,9.0667200000000005e-06],"13824":[2.4689999999999999e-05,2.4695500000000001e-05,2.4712666666666668e-05,2.4769999999999998e-05,2.545017e-05,2.5544828571428572e-05,2.5561540000000002e-05,2.5708539999999999e-05,2.575229e-05,2.5772460000000002e-05,2.5839399999999999e-05,2.5857e-05,2.5874e-05,2.5914860000000002e-05,2.600603e-05,2.606996e-05,2.6080640000000002e-05,2.609214e-05,2.625047e-05,2.6382079999999998e-05],"819200":[0.0035173960000000016,0.0035603280000000002,0.0035713990000000007,0.0035787709999999988,0.0035830529999999984,0.0036082000000000002,0.003636972,0.0036440219999999989,0.003662935,0.003706277,0.003716689,0.0037261,0.0037633010000000001,0.003776831,0.0037992440000000002,0.0038491989999999998,0.0038594099999999998,0.0039328160000000004,0.0040202090000000003,0.0041443799999999996],"983040":[0.004792447,0.004955437,0.0049620640000000004,0.0050221900000000002,0.0050495310000000003,0.0050519469999999993,0.0050558119999999998,0.0051137729999999977,0.0051243139999999996,0.005149293000000001,0.0052021720000000014,0.0052155490000000016,0.005215707,0.005228805999999999,0.0052794139999999979,0.0052871009999999998,0.0053266849999999977,0.0053610180000000021,0.0057357239999999976,0.0058934619999999978],"8704":[1.5574500000000001e-05,1.5574500000000001e-05,1.5627000000000001e-05,1.5999549999999998e-05,1.6075040000000001e-05,1.610773e-05,1.6114340206185565e-05,1.6119239999999999e-05,1.6208649999999999e-05,1.623239e-05,1.6274010000000001e-05,1.629075e-05,1.6302749999999999e-05,1.6356119999999999e-05,1.685984e-05,1.6933059999999999e-05,1.7040959999999999e-05,1.7072109999999999e-05,1.7072804347826085e-05,1.7090499999999998e-05],"120":[2.2806000000000002e-07,2.2807999999999999e-07,2.2807999999999999e-07,2.2807999999999999e-07,2.2809000000000003e-07,2.2809000000000003e-07,2.2810000000000001e-07,2.2811e-07,2.2818e-07,2.2819000000000001e-07,2.2826000000000001e-07,2.2836999999999997e-07,2.2850999999999997e-07,2.2852000000000001e-07,2.2852000000000001e-07,2.2853e-07,2.2853999999999998e-07,2.2856e-07,2.2856e-07,2.2861999999999999e-07],"1024":[1.84158e-06,1.84162e-06,1.8416299999999998e-06,1.8416400000000001e-06,1.84165e-06,1.84165e-06,1.84166e-06,1.84166e-06,1.84168e-06,1.84168e-06,1.8416999999999999e-06,1.84175e-06,1.84188e-06,1.84189e-06,1.8419199999999998e-06,1.84959e-06,1.8553333333333332e-06,1.92731e-06,2.1808999999999997e-06,2.1810299999999999e-06],"49152":[8.7830000000000004e-05,9.1231500000000002e-05,9.1385666666666661e-05,9.1866499999999999e-05,9.235484269662921e-05,9.3020266666666668e-05,9.3685195652173928e-05,9.377674358974359e-05,9.3984465909090903e-05,9.4194536842105343e-05,9.5085000000000002e-05,9.5111604651162789e-05,9.5235888888888892e-05,9.5265619565217385e-05,9.5526912087912094e-05,9.5622230769230765e-05,9.7409728395061716e-05,9.8454037037037042e-05,0.0001047785,0.000105748],"524288":[0.0017847289999999999,0.001788595,0.0017941809999999999,0.001816577,0.0018175770000000001,0.0018258980000000001,0.00182894,0.0018297769999999999,0.001837499,0.0018487,0.0018630459999999995,0.0018672890000000005,0.0018713060000000001,0.0018854379999999997,0.001896771,0.0019290240000000001,0.001934648,0.0019529326666666669,0.0019873250000000007,0.002010656],"45056":[8.0523000000000001e-05,8.3288736842105255e-05,8.3573700000000002e-05,8.4196000000000005e-05,8.4677780000000003e-05,8.4785124999999997e-05,8.4880720000000132e-05,8.4926444444444443e-05,8.585634615384616e-05,8.602766e-05,8.6287588235294129e-05,8.6344579999999999e-05,8.6546645833333327e-05,8.6701571428571435e-05,8.7575090000000007e-05,8.800883333333333e-05,8.8266105263157889e-05,8.8338999999999996e-05,8.8617545454545445e-05,8.9682705882352935e-05],"229376":[0.00069694774999999988,0.00070405450000000003,0.00070414550000000016,0.0007069245,0.00070859863636363611,0.00071063000000000029,0.00071693399999999991,0.00072186419999999997,0.00072204058333333321,0.00072272350000000026,0.0007239336666666667,0.00072710749999999979,0.00072860249999999991,0.00073205763636363642,0.00073239600000000028,0.00073408500000000031,0.00074323954545454528,0.00074678618181818176,0.00074768299999999996,0.00075108644444444456],"2688":[4.8108900000000001e-06,4.8110299999999997e-06,4.8120800000000004e-06,4.81256e-06,4.8128899999999994e-06,4.81291e-06,4.81291e-06,4.8129200000000007e-06,4.8129200000000007e-06,4.8129299999999997e-06,4.8129299999999997e-06,4.8129400000000004e-06,4.8129500000000002e-06,4.8129600000000001e-06,4.8129600000000001e-06,4.8158200000000003e-06,4.8193499999999999e-06,4.9679700000000001e-06,5.03667e-06,5.0388181818181819e-06],"152":[2.8521e-07,2.8521e-07,2.8522000000000001e-07,2.8527000000000001e-07,2.8527999999999997e-07,2.8538999999999999e-07,2.8538999999999999e-07,2.8547999999999999e-07,2.8560999999999997e-07,2.8560999999999997e-07,2.8560999999999997e-07,2.8560999999999997e-07,2.8561999999999999e-07,2.8561999999999999e-07,2.8561999999999999e-07,2.8564999999999997e-07,2.8566000000000003e-07,2.8573e-07,2.9845999999999999e-07,5.4787999999999995e-07],"5120":[9.1636666666666666e-06,9.1686666666666674e-06,9.1703333333333344e-06,9.1755000000000005e-06,9.1785000000000003e-06,9.2907799999999995e-06,9.3875600000000003e-06,9.4114000000000011e-06,9.4233900000000013e-06,9.464700000000001e-06,9.4902551020408155e-06,9.4909499999999993e-06,9.4950199999999994e-06,9.5158199999999993e-06,9.5462000000000002e-06,9.6360000000000006e-06,9.65413e-06,1.0046709999999999e-05,1.0056909999999999e-05,1.084231e-05],"1507328":[0.011962111499999999,0.012525817,0.012592818,0.01271183,0.0128065205,0.0130206995,0.013029879999999999,0.0130637455,0.013081608999999999,0.013258048,0.0133419305,0.013406162499999999,0.013562869,0.013753419500000006,0.013978490500000001,0.014252834499999978,0.01478087,0.01483895,0.014955039999999999,0.015388480499999999],"1216":[2.1849500000000001e-06,2.1850099999999997e-06,2.1850400000000001e-06,2.1850400000000001e-06,2.1850700000000001e-06,2.1850700000000001e-06,2.1850900000000002e-06,2.1850900000000002e-06,2.1851099999999999e-06,2.1851200000000002e-06,2.18522e-06,2.1853199999999998e-06,2.1853999999999999e-06,2.18625e-06,2.1866999999999997e-06,2.18789e-06,2.1880800000000001e-06,2.1967099999999999e-06,2.2878484848484848e-06,2.5332499999999998e-06],"1966080":[0.020396055499999996,0.0204293025,0.0205613555,0.020564878999999998,0.020628048,0.0206522765,0.020699512,0.020730090499999996,0.020770582499999999,0.020976913,0.0210361035,0.021095428500000006,0.02116264499999998,0.0212704755,0.021330341499999999,0.021358292499999987,0.021401029500000002,0.021423095,0.021458310500000001,0.021522205999999988],"1900544":[0.019493246499999999,0.019532994500000001,0.019547895500000002,0.019570478999999998,0.019701765500000006,0.0197136685,0.019874279499999998,0.0199873585,0.020009182,0.0200294455,0.020035362000000001,0.0200644455,0.0200788015,0.020086699,0.02010793,0.020342539499999993,0.021344520499999999,0.021809835499999996,0.022991061,0.024108431999999999],"184":[3.4232000000000001e-07,3.4245e-07,3.4248999999999999e-07,3.4266000000000003e-07,3.4266000000000003e-07,3.4266000000000003e-07,3.4267000000000004e-07,3.4267000000000004e-07,3.4267000000000004e-07,3.4267000000000004e-07,3.4267000000000004e-07,3.4270999999999998e-07,3.4273e-07,3.4278e-07,3.4990999999999999e-07,3.5820000000000002e-07,3.5821999999999999e-07,3.5858000000000003e-07,3.5859999999999999e-07,3.5890999999999998e-07],"7936":[1.4194e-05,1.4226999999999999e-05,1.4545800000000001e-05,1.456906e-05,1.4592892857142857e-05,1.4648370000000002e-05,1.4649979999999999e-05,1.4662430000000001e-05,1.4713890000000001e-05,1.474105e-05,1.4747359999999999e-05,1.4777939999999999e-05,1.47998e-05,1.483234e-05,1.4848242424242423e-05,1.486865e-05,1.489805e-05,1.5232629999999999e-05,1.5608469999999999e-05,1.5614696969696969e-05],"3801088":[0.045970698499999997,0.046113846,0.046272984999999982,0.046357455000000013,0.04640656700000001,0.046411533499999998,0.046419343500000002,0.046419590000000018,0.046513769500000003,0.046600140999999998,0.046618219000000016,0.046774588999999991,0.046820880500000002,0.046967686000000002,0.047050619000000002,0.047182118499999988,0.047714075999999987,0.047921427000000009,0.048311674499999999,0.048602504000000019],"6815744":[0.085048029999999955,0.085223642500000002,0.0854664745,0.085630254000000003,0.085934127499999999,0.085939152500000004,0.086001887499999999,0.086334453499999991,0.086406856500000045,0.086563596999999992,0.086680192500000003,0.087079903000000028,0.087647074999999963,0.087697609500000023,0.088001087499999964,0.0880220065,0.088045422999999998,0.088089764999999959,0.088184856499999992,0.088790336999999969],"124":[2.3519999999999999e-07,2.3519999999999999e-07,2.3521e-07,2.3521999999999998e-07,2.3523000000000002e-07,2.3523000000000002e-07,2.3524000000000001e-07,2.3530999999999998e-07,2.3537e-07,2.3544e-07,2.3546000000000002e-07,2.3565e-07,2.3566000000000001e-07,2.3566999999999999e-07,2.3566999999999999e-07,2.3567999999999998e-07,2.3567999999999998e-07,2.357e-07,2.4663000000000003e-07,2.5879e-07],"102400":[0.00023531861111111114,0.00023587640000000002,0.00023596233333333336,0.00023604642857142857,0.00024535084848484854,0.00024536783783783787,0.00024584094594594591,0.000246109,0.00024967408823529415,0.00025091983333333328,0.00025577714285714289,0.00025604394444444449,0.00025723479411764719,0.00025820927777777774,0.00025848637142857143,0.00025921599999999999,0.00026193199999999999,0.00026706949999999999,0.00026776776470588241,0.00026861022222222214],"311296":[0.00096787857142857127,0.00097199699999999994,0.0009726971428571428,0.00098559399999999979,0.001005107857142857,0.0010075156666666666,0.0010082984999999999,0.0010094940000000001,0.001010241,0.0010107640000000004,0.001014842142857143,0.0010149325,0.0010165549999999999,0.0010195409999999999,0.0010301188571428571,0.0010342035,0.001035527857142857,0.0010361460000000004,0.0010386884285714284,0.0010502585],"1408":[2.5283100000000003e-06,2.5289799999999997e-06,2.5295200000000002e-06,2.5300000000000003e-06,2.5300000000000003e-06,2.5300399999999998e-06,2.5300600000000003e-06,2.5300600000000003e-06,2.53011e-06,2.5301199999999998e-06,2.5301999999999999e-06,2.53209e-06,2.5321399999999997e-06,2.5324400000000004e-06,2.5364599999999999e-06,2.5407400000000003e-06,2.5423100000000001e-06,2.5429499999999999e-06,2.6511403508771932e-06,2.6742900000000001e-06],"393216":[0.0012086165,0.0012276450000000001,0.001248894,0.0012645199999999999,0.0012707452499999999,0.0012820119999999999,0.0012834929999999999,0.001284713,0.0012854055000000001,0.001289133,0.0012893424999999997,0.0012901994999999999,0.0012991125,0.0013012519999999999,0.0013044801999999999,0.0013154585,0.0013240715,0.001330555,0.0013458295000000004,0.00136671025],"4352":[7.7826800000000012e-06,7.7893699999999999e-06,7.8035000000000008e-06,7.8077499999999999e-06,7.8390000000000007e-06,7.8862699999999989e-06,7.9214599999999992e-06,7.9251400000000008e-06,7.9255000000000006e-06,7.9453e-06,7.9482800000000001e-06,7.9627299999999996e-06,7.9794800000000007e-06,8.0016100000000005e-06,8.027190000000001e-06,8.0615999999999992e-06,8.1585432098765438e-06,8.5109000000000001e-06,8.5468299999999996e-06,8.5473799999999991e-06],"6553600":[0.081664144500000008,0.082386943000000004,0.082429874,0.082444313500000005,0.082444408000000038,0.082542475000000018,0.08256815050000002,0.082697965499999998,0.082814314,0.08295615399999999,0.083154057999999975,0.083462823499999991,0.083470712000000002,0.083819217000000029,0.083916553000000005,0.083993318499999997,0.084509762500000002,0.084705151500000006,0.084806110500000045,0.085625821500000004],"20480":[3.65495e-05,3.6567333333333331e-05,3.6575500000000002e-05,3.6583666666666667e-05,3.6588000000000003e-05,3.6588000000000003e-05,3.8281529999999998e-05,3.8303999999999998e-05,3.8432120000000002e-05,3.8535599999999997e-05,3.8882209999999999e-05,3.8968179999999996e-05,3.9145720000000002e-05,3.9259230000000007e-05,3.9310020408163266e-05,3.9350705882352937e-05,3.9398215686274509e-05,3.9495200000000001e-05,3.9507159999999997e-05,4.0177909999999994e-05],"608":[1.0976099999999999e-06,1.09782e-06,1.0978300000000001e-06,1.0978300000000001e-06,1.0980600000000001e-06,1.0980600000000001e-06,1.0980699999999999e-06,1.09808e-06,1.09808e-06,1.09808e-06,1.09808e-06,1.09808e-06,1.09808e-06,1.0980900000000001e-06,1.09812e-06,1.09814e-06,1.1052799999999999e-06,1.14917e-06,1.1495299999999999e-06,1.20545e-06],"2228224":[0.024143731500000008,0.0245517045,0.024688859,0.024787616000000005,0.02480755849999999,0.024847800999999992,0.024871747500000006,0.024957378999999991,0.025046791000000002,0.025074636000000004,0.025095228000000015,0.02513525099999999,0.025175101499999998,0.025354439999999999,0.025405763500000001,0.0254078355,0.025430773,0.025464531000000002,0.025609676000000005,0.026276832999999999],"36864":[6.8863999999999997e-05,6.9516409999999991e-05,6.9687009999999999e-05,7.0361731707317077e-05,7.0717950000000006e-05,7.0764440000000006e-05,7.1059890000000007e-05,7.1369220000000002e-05,7.1542e-05,7.1604052631578946e-05,7.173372727272727e-05,7.1818850000000001e-05,7.1914973684210519e-05,7.191891666666667e-05,7.2044190000000003e-05,7.2316486486486488e-05,7.3437809999999997e-05,7.3524874999999996e-05,7.5709566666666664e-05,7.8286961538461539e-05],"704":[1.26906e-06,1.2693799999999999e-06,1.2693799999999999e-06,1.2693799999999999e-06,1.2693900000000002e-06,1.2693900000000002e-06,1.2693900000000002e-06,1.2694000000000001e-06,1.2694000000000001e-06,1.2694099999999999e-06,1.2694099999999999e-06,1.26942e-06,1.2694299999999998e-06,1.2694400000000001e-06,1.26945e-06,1.26948e-06,1.26948e-06,1.2766599999999999e-06,1.2783599999999999e-06,1.3284000000000001e-06],"720896":[0.0028909514999999998,0.0029183195000000001,0.0029349670000000006,0.0029540009999999995,0.0030275294999999999,0.0030319785,0.0030324689999999999,0.0030396750000000008,0.0030409759999999999,0.0030788070000000002,0.0030922095,0.0031113465000000007,0.0031122720000000001,0.0031183355,0.0031355285,0.0031820559999999982,0.003229455,0.0032553669999999995,0.0032860865000000003,0.0033253935],"800":[1.44083e-06,1.44092e-06,1.44096e-06,1.44096e-06,1.44096e-06,1.44096e-06,1.44096e-06,1.4409700000000001e-06,1.4410200000000002e-06,1.44103e-06,1.44103e-06,1.4410900000000002e-06,1.4411000000000001e-06,1.4411000000000001e-06,1.44112e-06,1.4475100000000002e-06,1.4475999999999999e-06,1.5079700000000002e-06,1.5083199999999999e-06,1.5163000000000002e-06],"2621440":[0.029980952999999998,0.0300020865,0.030050531499999998,0.030171639,0.030461165000000002,0.030488346499999996,0.030506952,0.030668845,0.030669301500000013,0.030896456500000002,0.030914049499999985,0.030950975000000002,0.031072686999999998,0.031093778999999998,0.031173293000000001,0.031284132999999992,0.031299603999999995,0.0314876885,0.031545056000000002,0.031682983999999983],"425984":[0.0013492910000000001,0.00135122,0.0013653630000000001,0.0013768935000000001,0.0013818929999999999,0.0013828100000000004,0.0013879895,0.001393013,0.0013942225,0.0014003609999999999,0.0014106679999999999,0.0014168290000000001,0.0014220884999999999,0.0014229214999999999,0.0014259882500000001,0.0014351907500000001,0.0014471215,0.0014574214999999997,0.0014713700000000001,0.0014793410000000001],"32768":[6.229496296296296e-05,6.2303946428571435e-05,6.2386809999999998e-05,6.2387120000000006e-05,6.2683270000000001e-05,6.2719799999999995e-05,6.3233327272727279e-05,6.347740999999999e-05,6.351416e-05,6.3911740000000003e-05,6.3975490000000004e-05,6.3984018181818182e-05,6.4096750000000003e-05,6.4171632653061225e-05,6.4377080000000003e-05,6.468592307692308e-05,6.5649389999999995e-05,6.5960069767441863e-05,6.6190000000000002e-05,6.9258999999999995e-05],"12058624":[0.155793706,0.15699233600000001,0.1572224515,0.15758914500000001,0.15771222299999998,0.15777827150000001,0.157919849,0.1582253495,0.15838267,0.15861293600000001,0.158749214,0.15900610300000001,0.15903207950000001,0.159229814,0.15925170350000001,0.15934255,0.159435298,0.159531804,0.16016264450000001,0.170390074],"128":[2.4233999999999998e-07,2.4233999999999998e-07,2.4233999999999998e-07,2.4235e-07,2.4235e-07,2.4236000000000001e-07,2.4236000000000001e-07,2.4236999999999997e-07,2.4238000000000003e-07,2.4241000000000001e-07,2.4245e-07,2.4247999999999998e-07,2.4278000000000001e-07,2.4280000000000003e-07,2.4280999999999999e-07,2.4280999999999999e-07,2.4280999999999999e-07,2.4280999999999999e-07,2.4282e-07,2.4283000000000001e-07],"180224":[0.00053738150000000003,0.000537858,0.0005383301764705882,0.00053950412500000015,0.00054470741176470563,0.00054652150000000029,0.00054658599999999973,0.00054659299999999984,0.00054815372222222171,0.00055420138461538461,0.00055478233333333335,0.00055560337500000002,0.00055625075000000003,0.00055862700000000002,0.00056004250000000002,0.00056545050000000028,0.00057007106666666656,0.00057043982352941182,0.00057927249999999999,0.00059039164285714285],"224":[4.1339999999999998e-07,4.1341000000000005e-07,4.1344000000000003e-07,4.1359000000000004e-07,4.1362000000000002e-07,4.1381999999999998e-07,4.1382999999999999e-07,4.1382999999999999e-07,4.1384000000000001e-07,4.1384000000000001e-07,4.1384999999999996e-07,4.1384999999999996e-07,4.1384999999999996e-07,4.1385999999999997e-07,4.1388e-07,4.1412000000000001e-07,4.2562999999999998e-07,4.3308000000000001e-07,4.3361000000000003e-07,4.5368999999999998e-07],"736":[1.3259400000000001e-06,1.32608e-06,1.3265400000000002e-06,1.3265400000000002e-06,1.3265600000000001e-06,1.3265699999999999e-06,1.3265699999999999e-06,1.3265999999999999e-06,1.3265999999999999e-06,1.32661e-06,1.3266200000000001e-06,1.3266200000000001e-06,1.3266200000000001e-06,1.3266299999999999e-06,1.3266499999999998e-06,1.32668e-06,1.3330500000000001e-06,1.3880099999999999e-06,1.38832e-06,1.3886200000000001e-06],"320":[5.8449999999999997e-07,5.8452e-07,5.8454999999999998e-07,5.8455999999999994e-07,5.8459999999999998e-07,5.8472999999999997e-07,5.8495000000000001e-07,5.8495000000000001e-07,5.8495000000000001e-07,5.8495000000000001e-07,5.8495999999999997e-07,5.8497000000000003e-07,5.8497000000000003e-07,5.8500000000000001e-07,5.8500000000000001e-07,5.8500000000000001e-07,5.8500999999999997e-07,5.8500999999999997e-07,6.1173999999999994e-07,6.1221e-07],"557056":[0.0018570309999999999,0.001897431,0.0019336550000000001,0.00193491,0.0019349439999999999,0.0019479746666666666,0.0019606290000000002,0.0019611099999999998,0.0019613510000000001,0.0019753190000000001,0.0019816960000000002,0.0020003,0.0020003809999999999,0.0020014259999999984,0.0020023620000000002,0.0020243890000000006,0.0020732529999999989,0.0021021690000000001,0.0021518329999999993,0.00225077],"832":[1.4981700000000001e-06,1.49818e-06,1.4981999999999999e-06,1.4981999999999999e-06,1.49821e-06,1.49821e-06,1.49822e-06,1.49822e-06,1.49822e-06,1.49822e-06,1.49822e-06,1.4982299999999999e-06,1.4982400000000002e-06,1.4982400000000002e-06,1.4982400000000002e-06,1.49825e-06,1.49825e-06,1.4983499999999998e-06,1.5039900000000001e-06,1.56806e-06],"9437184":[0.120639132,0.121627871,0.12216476599999999,0.12218496099999999,0.12239667599999998,0.122639149,0.1229264175,0.123127071,0.12346351749999999,0.1236639465,0.123906932,0.124170667,0.1243509875,0.124429621,0.124718114,0.12507974899999999,0.12525285650000001,0.125565327,0.12571597299999998,0.1263590805],"3584":[6.4117199999999997e-06,6.4119000000000004e-06,6.4119499999999997e-06,6.4121700000000006e-06,6.4127599999999996e-06,6.4167300000000003e-06,6.4171099999999998e-06,6.4184299999999998e-06,6.4244099999999997e-06,6.4289999999999998e-06,6.4344300000000002e-06,6.4409999999999998e-06,6.5924900000000001e-06,6.7101300000000008e-06,6.7101400000000006e-06,6.7159000000000004e-06,6.7181299999999997e-06,6.9128799999999998e-06,6.9326600000000003e-06,7.2369999999999995e-06],"6291456":[0.07814127999999998,0.078177395499999996,0.078242366500000007,0.078591122000000027,0.078857205499999999,0.07894404549999999,0.078983212499999997,0.079012502000000012,0.079014609499999972,0.079064380500000003,0.079340290500000007,0.07945265700000001,0.079777357499999993,0.079788730000000016,0.079873405999999994,0.079921600000000009,0.080535392000000025,0.080822138500000001,0.080851872499999963,0.081090630999999996],"256":[4.7039000000000002e-07,4.7039000000000002e-07,4.7039999999999998e-07,4.7052999999999997e-07,4.7082000000000003e-07,4.7083000000000004e-07,4.7083000000000004e-07,4.7084e-07,4.7084e-07,4.7084e-07,4.7085000000000001e-07,4.7086000000000002e-07,4.7086000000000002e-07,4.7086000000000002e-07,4.7089999999999996e-07,4.9228999999999997e-07,4.9273000000000005e-07,4.9281000000000003e-07,5.1679999999999997e-07,5.2468999999999997e-07],"15204352":[0.19761615799999999,0.20030726850000002,0.20048520149999999,0.2007624975,0.20094010600000001,0.20109683550000002,0.201666384,0.20174294500000001,0.20186991800000001,0.20194242749999999,0.20205588600000002,0.20242415250000001,0.2027701935,0.20319847050000001,0.203217811,0.20451770749999998,0.20474738849999999,0.205263847,0.20619150149999999,0.216303726],"28672":[5.1168000000000002e-05,5.1171500000000003e-05,5.3395287500000003e-05,5.34662e-05,5.3644922077922077e-05,5.3675160000000001e-05,5.3946329113924049e-05,5.4113900000000004e-05,5.4343469999999997e-05,5.438817e-05,5.4393379999999999e-05,5.4642975609756098e-05,5.5256039999999997e-05,5.5333650000000005e-05,5.5989974358974359e-05,5.6153580000000003e-05,5.6199000000000002e-05,5.6372799999999997e-05,6.0679118644067796e-05,6.083011e-05],"768":[1.3833699999999998e-06,1.3833899999999999e-06,1.3834000000000002e-06,1.38371e-06,1.3837300000000002e-06,1.38377e-06,1.38377e-06,1.38377e-06,1.3837800000000001e-06,1.3838000000000002e-06,1.3838100000000001e-06,1.38383e-06,1.3838500000000001e-06,1.3840200000000001e-06,1.38977e-06,1.39092e-06,1.39171e-06,1.4476300000000001e-06,1.44811e-06,1.5529899999999999e-06],"212992":[0.0006299280000000003,0.00063209449999999967,0.00065144599999999997,0.00065345707692307704,0.00065738849999999991,0.0006588923846153849,0.00066505199999999985,0.00066527733333333308,0.00066791925000000019,0.00067229838461538446,0.00068221166666666681,0.00068584100000000008,0.00068897263636363642,0.00069022427272727265,0.0006909718333333334,0.00069236633333333319,0.00069448381818181827,0.00069913866666666683,0.00070816718181818171,0.00074738336363636387],"864":[1.55518e-06,1.5552400000000002e-06,1.5552900000000001e-06,1.55544e-06,1.5554899999999999e-06,1.5555000000000002e-06,1.55551e-06,1.55551e-06,1.5555199999999999e-06,1.5555300000000002e-06,1.55554e-06,1.5555500000000001e-06,1.5555500000000001e-06,1.5555500000000001e-06,1.5555699999999998e-06,1.5556e-06,1.5556200000000001e-06,1.5556599999999999e-06,1.5671100000000001e-06,1.62795e-06],"352":[6.4165000000000003e-07,6.4183999999999998e-07,6.4204999999999996e-07,6.4204999999999996e-07,6.4206000000000002e-07,6.4206000000000002e-07,6.4206000000000002e-07,6.4207000000000008e-07,6.4207000000000008e-07,6.4207000000000008e-07,6.4207000000000008e-07,6.4207000000000008e-07,6.4207000000000008e-07,6.4213000000000005e-07,6.4214e-07,6.5005999999999999e-07,6.7143000000000002e-07,6.7187999999999995e-07,6.8015000000000007e-07,7.046e-07],"253952":[0.00075581750000000005,0.000766842,0.00078317800000000004,0.00079080077777777776,0.0007984340000000001,0.00080018470000000025,0.00080307969999999997,0.00080453133333333352,0.00080549799999999998,0.00080996550000000023,0.00081028180000000032,0.00081234009999999986,0.00081243500000000002,0.00081310209999999983,0.00081478599999999996,0.00081771744444444439,0.00081828522222222205,0.00082429040000000001,0.00082672362500000002,0.00083346699999999985],"960":[1.7267899999999999e-06,1.7270499999999998e-06,1.7271199999999999e-06,1.7271300000000001e-06,1.7271300000000001e-06,1.72714e-06,1.7271499999999998e-06,1.72717e-06,1.72718e-06,1.7271899999999999e-06,1.7272300000000001e-06,1.7272500000000001e-06,1.7273299999999999e-06,1.7273500000000001e-06,1.7273599999999999e-06,1.7273599999999999e-06,1.73333e-06,1.8075400000000001e-06,1.8090500000000001e-06,1.8962300000000001e-06],"24576":[4.3886888888888886e-05,4.3915000000000002e-05,4.4872416666666664e-05,4.559685e-05,4.559771e-05,4.5861290000000007e-05,4.5889500000000002e-05,4.5938888888888886e-05,4.5951169999999999e-05,4.6159520000000006e-05,4.61914e-05,4.640277e-05,4.6408980000000001e-05,4.6856510000000002e-05,4.6944109999999997e-05,4.6973428571428575e-05,4.7065750000000002e-05,4.7294370000000004e-05,4.7363739999999998e-05,4.9061229999999999e-05],"7680":[1.3757000000000001e-05,1.4082210000000001e-05,1.4084509999999999e-05,1.4153e-05,1.4186229999999999e-05,1.42009e-05,1.4210530000000001e-05,1.422425e-05,1.4238179487179488e-05,1.4260819999999999e-05,1.4298389999999999e-05,1.4301990000000001e-05,1.430811e-05,1.43208e-05,1.4369899999999999e-05,1.4465630000000001e-05,1.4543259999999999e-05,1.4782930000000001e-05,1.5073147058823528e-05,1.511009090909091e-05],"294912":[0.00090826975,0.00091431700000000021,0.00091759399999999966,0.00092905949999999983,0.00093278950000000044,0.00093488049999999997,0.00093523533333333324,0.00093707799999999939,0.00093743250000000026,0.00093876237499999958,0.00095156899999999966,0.00095808899999999596,0.00096172128571428569,0.00096644371428571444,0.00096964799999999971,0.00096990300000000004,0.00097378142857142851,0.000976483,0.0009849119999999999,0.00099028800000000019],"1048576":[0.0054579769999999984,0.0054989980000000015,0.0056032219999999997,0.0057011640000000008,0.0057424759999999981,0.0057830140000000013,0.0058613990000000015,0.0058717309999999998,0.0059343389999999977,0.0059414910000000001,0.0059520599999999977,0.0059739200000000024,0.0059745370000000003,0.006091567,0.006222755,0.0062575419999999996,0.0062782009999999989,0.0063010819999999995,0.006322622,0.0063992710000000024],"10485760":[0.13433176199999997,0.13450966,0.13514111500000001,0.13525349,0.13570526999999999,0.13588792550000001,0.1360184915,0.136463319,0.13660025349999999,0.13662690299999999,0.13673669999999999,0.13697722600000001,0.137126366,0.13716964500000001,0.1373221885,0.13737259900000001,0.13765099850000001,0.13773833199999999,0.13775954100000001,0.150300829],"344064":[0.0010526490000000162,0.0010574965,0.0010719269999999999,0.0010789669999999999,0.0010846969999999995,0.001089976333333333,0.00110378,0.0011050475,0.0011126235,0.0011144276666666664,0.00111809,0.0011208934999999999,0.0011225669999999999,0.0011230145,0.0011303280000000001,0.001134688,0.0011431875999999999,0.0011463839999999999,0.0011580123333333333,0.001177282],"288":[5.2740000000000002e-07,5.2740999999999998e-07,5.2740999999999998e-07,5.2741999999999994e-07,5.2744000000000007e-07,5.2744000000000007e-07,5.2747000000000005e-07,5.2748000000000001e-07,5.2763999999999998e-07,5.2772000000000007e-07,5.2786000000000002e-07,5.2786999999999997e-07,5.2790000000000006e-07,5.2794e-07,5.2794e-07,5.5247000000000002e-07,5.525e-07,5.525e-07,5.5250999999999996e-07,5.7894999999999998e-07],"1152":[2.0704600000000001e-06,2.0704699999999999e-06,2.0704699999999999e-06,2.0704900000000001e-06,2.0705100000000002e-06,2.0705300000000003e-06,2.0705300000000003e-06,2.07055e-06,2.0705599999999999e-06,2.0705699999999997e-06,2.0705699999999997e-06,2.07061e-06,2.0706699999999999e-06,2.0707299999999999e-06,2.07081e-06,2.07087e-06,2.0709500000000001e-06,2.0710800000000003e-06,2.08247e-06,2.17988e-06],"384":[6.9876000000000004e-07,6.9883999999999992e-07,6.9886000000000005e-07,6.9897000000000002e-07,6.9897999999999998e-07,6.9897999999999998e-07,6.9897999999999998e-07,6.9899000000000004e-07,6.9899000000000004e-07,6.9899000000000004e-07,6.9901999999999992e-07,6.9902999999999998e-07,6.9904000000000004e-07,6.9937000000000005e-07,7.0580000000000009e-07,7.3104000000000001e-07,7.3151000000000007e-07,7.4420999999999997e-07,7.6716e-07,8.2717000000000001e-07],"2304":[4.12663e-06,4.1266956521739134e-06,4.1266999999999998e-06,4.1267499999999999e-06,4.1270100000000003e-06,4.1285999999999997e-06,4.1286699999999996e-06,4.1287099999999998e-06,4.1287900000000003e-06,4.1288000000000002e-06,4.12881e-06,4.1307600000000001e-06,4.1338500000000002e-06,4.1339100000000002e-06,4.2601200000000006e-06,4.3194499999999998e-06,4.3205567010309279e-06,4.3206199999999995e-06,4.3243300000000007e-06,4.3243899999999998e-06],"896":[1.6124199999999999e-06,1.61276e-06,1.61276e-06,1.61276e-06,1.6127799999999999e-06,1.6128e-06,1.6128099999999999e-06,1.61282e-06,1.61282e-06,1.61282e-06,1.6128499999999999e-06,1.6128599999999998e-06,1.6128700000000001e-06,1.6129499999999999e-06,1.6139900000000001e-06,1.6232e-06,1.62347e-06,1.7695899999999999e-06,1.77007e-06,1.9094899999999998e-06],"480":[8.6957000000000002e-07,8.6957000000000002e-07,8.7000000000000003e-07,8.7000000000000003e-07,8.7000000000000003e-07,8.7000000000000003e-07,8.7000999999999999e-07,8.7000999999999999e-07,8.7000999999999999e-07,8.7002000000000006e-07,8.7002000000000006e-07,8.7002999999999991e-07,8.7002999999999991e-07,8.7006e-07,8.7009000000000008e-07,8.7009999999999994e-07,9.1019000000000003e-07,9.1052999999999999e-07,9.1053999999999995e-07,9.1063999999999995e-07],"1441792":[0.011360648000000003,0.011465903499999999,0.011546058,0.011583205500000001,0.011600748000000001,0.011747555999999999,0.0117604175,0.0117799315,0.0118082745,0.011823744000000001,0.011990002499999999,0.012106149,0.012109605000000027,0.0122143145,0.012254636500000001,0.012427751499999999,0.0127377145,0.013208397,0.013314035,0.014274954999999995],"992":[1.7838700000000002e-06,1.7840799999999999e-06,1.7841899999999999e-06,1.7842300000000002e-06,1.7843100000000001e-06,1.78433e-06,1.78433e-06,1.78437e-06,1.78439e-06,1.7844200000000001e-06,1.7844200000000001e-06,1.7844200000000001e-06,1.7844399999999999e-06,1.78446e-06,1.7845799999999999e-06,1.78469e-06,1.7957699999999998e-06,1.8673100000000002e-06,1.8728399999999999e-06,1.9648899999999997e-06],"3968":[7.0975100000000001e-06,7.09763e-06,7.1038300000000001e-06,7.1060555555555556e-06,7.1101900000000003e-06,7.1108399999999992e-06,7.1122222222222231e-06,7.1143333333333332e-06,7.1146666666666673e-06,7.1184999999999997e-06,7.2101400000000001e-06,7.2141600000000001e-06,7.2440000000000004e-06,7.2817799999999998e-06,7.3359900000000007e-06,7.3386000000000003e-06,7.4279499999999998e-06,7.4377500000000001e-06,7.4409999999999996e-06,7.6737799999999996e-06],"6400":[1.14388e-05,1.1448588235294118e-05,1.1449250000000001e-05,1.145390909090909e-05,1.1455000000000001e-05,1.164629e-05,1.1708199999999999e-05,1.1710449999999999e-05,1.1752010000000001e-05,1.1755710000000001e-05,1.1809520000000001e-05,1.1809990000000001e-05,1.188511e-05,1.1910759999999998e-05,1.1915929999999999e-05,1.1945910000000001e-05,1.1995e-05,1.2566210000000001e-05,1.2569650000000001e-05,1.2576e-05],"1344":[2.4134800000000001e-06,2.4138499999999998e-06,2.41412e-06,2.4148000000000002e-06,2.4150800000000003e-06,2.41567e-06,2.4157099999999999e-06,2.4157099999999999e-06,2.4158100000000001e-06,2.4159100000000003e-06,2.4159999999999998e-06,2.4160300000000002e-06,2.4174400000000002e-06,2.41754e-06,2.4187700000000001e-06,2.4241499999999999e-06,2.4260800000000002e-06,2.4291800000000003e-06,2.4393300000000001e-06,2.64914e-06],"126976":[0.00034739800000000001,0.00034763900000000001,0.00034856500000000001,0.00035018400000000002,0.00035079499999999999,0.00035210800000000001,0.00035355500000000019,0.0003552082400000001,0.00035530619230769234,0.00035632299999999986,0.00035998552000000004,0.00036084607692307691,0.00036137633333333349,0.00036190458333333327,0.0003661759999999999,0.00036628499999999989,0.00036726427999999998,0.00036856166666666653,0.00037345920833333336,0.00037963333333333336],"2883584":[0.033530778999999997,0.033651253500000013,0.033851971000000002,0.033994640499999992,0.03402768099999999,0.034091735999999991,0.03414406049999999,0.034154631999999976,0.034157921000000001,0.034258471999999998,0.034287922999999991,0.034466484999999998,0.034475937999999998,0.034552385499999998,0.034741045000000012,0.034757694500000026,0.03481089250000001,0.035040717000000013,0.03512771100000002,0.035176211499999999],"753664":[0.0030437340000000006,0.0030566670000000008,0.0030669289999999999,0.0031203089999999999,0.0031391055000000016,0.0031398959999999988,0.0031749819999999998,0.0031804329999999999,0.003200105999999999,0.003206890999999999,0.0032244315,0.0032367780000000001,0.0032384139999999998,0.0033409949999999994,0.0033674360000000001,0.0033833514999999986,0.0034142274999999999,0.0034841359999999988,0.0035277669999999998,0.0061663990000000004],"16384":[2.9244562499999999e-05,3.0441333333333333e-05,3.047933e-05,3.0514529999999999e-05,3.0561490000000001e-05,3.0587969999999997e-05,3.0608666666666664e-05,3.0628166666666666e-05,3.0653569999999999e-05,3.1008260000000003e-05,3.1063570000000003e-05,3.1069090000000003e-05,3.1241229999999997e-05,3.1246070000000004e-05,3.146086e-05,3.1467629999999999e-05,3.1573540000000001e-05,3.2102125000000001e-05,3.2125500000000003e-05,3.2148499999999999e-05],"131072":[0.00035780331818181809,0.00036503324999999999,0.000366299,0.00036894750000000001,0.00036911795652173906,0.00037027708695652176,0.00037133475999999996,0.00037255000000000003,0.0003726819600000001,0.00037309450000000004,0.000374204,0.00037421882608695649,0.00037438866666666661,0.00037457300000000012,0.00037664312000000019,0.00037910895652173922,0.00038322304166666662,0.00038541775000000003,0.00039479963636363636,0.00042249678947368425],"458752":[0.0014806560000000001,0.0014849054999999994,0.0014859279999999999,0.001489913,0.001502504,0.0015089490000000001,0.0015223720000000001,0.0015326089999999997,0.0015362679999999999,0.00154600375,0.0015639860000000003,0.0015735840000000001,0.001573779,0.0015796345000000007,0.0016127170000000001,0.001643736,0.0016452870000000001,0.0017029689999999999,0.0017554579999999992,0.0022189430000000001],"172032":[0.00050222976470588236,0.00050764099999999997,0.00051002841176470582,0.00051161700000000002,0.00051552911111111123,0.00051713900000000001,0.00051741933333333335,0.00051839099999999988,0.00051882688235294116,0.00051892650000000002,0.00051998249999999995,0.00052106127777777785,0.00052276088235294108,0.00052763570588235304,0.0005278355,0.00053544782352941186,0.00054066288235294128,0.0005442049375,0.0005558213750000002,0.00055896962499999998],"12288":[2.19404375e-05,2.1942846153846156e-05,2.2002999999999999e-05,2.2631333333333331e-05,2.2672593750000002e-05,2.278006e-05,2.2804349999999998e-05,2.2823050000000002e-05,2.2843000000000001e-05,2.2923919999999997e-05,2.293461e-05,2.2970199999999999e-05,2.2981368421052633e-05,2.3008999999999999e-05,2.3078533333333333e-05,2.3240779999999998e-05,2.3611620000000001e-05,2.3890909999999999e-05,2.398628e-05,2.4528440476190478e-05],"14680064":[0.1910720115,0.19176131149999998,0.1926685185,0.192940377,0.19306324949999998,0.19318739600000001,0.19335523800000001,0.19354759299999999,0.194172386,0.19433807950000001,0.19435444800000001,0.19440057350000001,0.19468512100000002,0.19479123400000001,0.19489192350000001,0.195005395,0.19548469099999999,0.19598104050000001,0.19661215799999998,0.19823146850000001],"1536":[2.7575599999999998e-06,2.7579400000000001e-06,2.75795e-06,2.7580399999999999e-06,2.75809e-06,2.75812e-06,2.7581600000000003e-06,2.75818e-06,2.7581900000000003e-06,2.75824e-06,2.7583099999999998e-06,2.7584400000000004e-06,2.7586300000000001e-06,2.7597500000000001e-06,2.7602600000000002e-06,2.7610100000000002e-06,2.7635700000000001e-06,2.7656000000000003e-06,2.7794e-06,2.7801699999999997e-06],"25600":[4.5688333333333328e-05,4.5715333333333333e-05,4.5719000000000001e-05,4.7198479999999997e-05,4.7812000000000002e-05,4.78266e-05,4.7828666666666665e-05,4.7832000000000006e-05,4.7912230000000001e-05,4.7951888888888889e-05,4.8121860000000001e-05,4.83363e-05,4.8662909090909094e-05,4.9006529999999994e-05,4.9231450000000001e-05,4.9455439999999997e-05,5.0186999999999999e-05,5.077634e-05,5.4125000000000001e-05,5.4143e-05],"1835008":[0.018189288000000001,0.018501092,0.018513503000000001,0.018517292499999987,0.018540224000000001,0.018550529499999999,0.018567917,0.018663909999999999,0.018670207000000001,0.018765746999999992,0.018874253000000001,0.019130858000000001,0.019360218000000002,0.019419742,0.019489221000000008,0.0196064125,0.019606538,0.0196199305,0.019840403499999999,0.021442032499999999],"10752":[1.9230500000000002e-05,1.9256e-05,1.9830020000000003e-05,1.9837180000000002e-05,1.9908159999999997e-05,1.9923430000000002e-05,1.9952049999999998e-05,1.9956300000000001e-05,1.9959890000000001e-05,1.9968189999999999e-05,1.9991088607594937e-05,1.9991789999999997e-05,2.0046869999999997e-05,2.0048890000000003e-05,2.0049780000000001e-05,2.005073e-05,2.0054920000000001e-05,2.0151000000000001e-05,2.0303309999999997e-05,2.054683e-05],"21504":[3.8399000000000003e-05,3.8407500000000001e-05,3.8420000000000001e-05,3.84255e-05,3.8436000000000003e-05,3.9811888888888889e-05,3.9945240000000001e-05,4.0060979999999993e-05,4.0136264705882352e-05,4.0349189999999996e-05,4.054147727272727e-05,4.064052e-05,4.0711119999999999e-05,4.0949109999999998e-05,4.0965100000000005e-05,4.1162769999999996e-05,4.1696859999999994e-05,4.1849330000000001e-05,4.2123545454545453e-05,4.5483909999999994e-05],"7602176":[0.095147917499999998,0.095405246499999999,0.095868518999999999,0.096059323999999974,0.09651188749999999,0.09687873100000001,0.096890551000000019,0.096911176999999987,0.096954419999999999,0.09696611749999999,0.097231128,0.097252326499999958,0.097319707000000005,0.09746587050000001,0.097513475999999974,0.097720070999999992,0.097897659499999998,0.097931758000000035,0.098412606999999999,0.09875773750000004],"5632":[1.0068612903225806e-05,1.0071000000000001e-05,1.0081814814814815e-05,1.020309e-05,1.03188e-05,1.033333e-05,1.0390680000000001e-05,1.039173e-05,1.0406329999999999e-05,1.042067e-05,1.0429409999999999e-05,1.0437529999999998e-05,1.0488380000000001e-05,1.051633e-05,1.052631e-05,1.0541140000000001e-05,1.0562690000000001e-05,1.081479e-05,1.1063410000000001e-05,1.1096e-05],"10":[2.9650000000000001e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9660000000000002e-08,2.9679999999999998e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1060000000000002e-08,3.2550000000000004e-08],"3145728":[0.037387636000000002,0.037513987000000013,0.037691145000000002,0.037692012999999996,0.037732591500000003,0.037867050999999999,0.038031062500000004,0.0380562755,0.038077132499999999,0.038173226000000018,0.038213663000000002,0.038287837000000012,0.038349826500000003,0.038395936999999998,0.038481767,0.0385643445,0.038714893,0.0390869805,0.039214315499999999,0.039234882999999998],"245760":[0.00074891430000000015,0.00074993549999999992,0.00075498500000000033,0.00076622350000000007,0.00076631100000000031,0.00076737400000000003,0.00076802199999999993,0.00077074300000000017,0.00077425680000000024,0.00077478100000000021,0.00078068600000000005,0.000784477,0.0007880824999999998,0.0007892699999999999,0.00078954100000000005,0.00079143949999999996,0.00079224800000000006,0.00079674549999999981,0.00080335069999999968,0.00082715777777777786],"1728":[3.0983999999999998e-06,3.0986300000000003e-06,3.1001200000000003e-06,3.1002200000000001e-06,3.10023e-06,3.1002699999999998e-06,3.1003100000000001e-06,3.1003299999999998e-06,3.1004200000000001e-06,3.1004800000000001e-06,3.1007499999999999e-06,3.1012699999999999e-06,3.1088600000000002e-06,3.1090900000000002e-06,3.1117100000000001e-06,3.1121000000000002e-06,3.1125100000000001e-06,3.1193399999999998e-06,3.1240400000000003e-06,3.4048900000000004e-06],"11":[3.0990000000000002e-08,3.0990000000000002e-08,3.0990000000000002e-08,3.0990000000000002e-08,3.1e-08,3.1e-08,3.1e-08,3.1e-08,3.1e-08,3.1e-08,3.1e-08,3.1039999999999999e-08,3.1039999999999999e-08,3.1049999999999997e-08,3.1089999999999996e-08,3.2440000000000005e-08,3.2440000000000005e-08,3.2440000000000005e-08,3.2490000000000002e-08,3.365e-08],"1114112":[0.0056374319999999995,0.0061841659999999996,0.0062084169999999991,0.0062587900000000002,0.0063104740000000017,0.0063194590000000012,0.0063207580000000001,0.0063683560000000004,0.0064062980000000021,0.0066492620000000004,0.0066729809999999997,0.0067108340000000015,0.0067739790000000012,0.0067800840000000013,0.0068024439999999995,0.0068403330000000023,0.0068920769999999982,0.0073871620000000001,0.0081722814999999997,0.0088939680000000004],"12":[3.2329999999999999e-08,3.2329999999999999e-08,3.2339999999999997e-08,3.2339999999999997e-08,3.2339999999999997e-08,3.2339999999999997e-08,3.2339999999999997e-08,3.2339999999999997e-08,3.2350000000000002e-08,3.2350000000000002e-08,3.236e-08,3.2380000000000003e-08,3.2380000000000003e-08,3.2390000000000001e-08,3.2420000000000002e-08,3.3840000000000004e-08,3.3850000000000002e-08,3.3880000000000003e-08,3.5590000000000003e-08,3.5659999999999996e-08],"7340032":[0.0916243375,0.091667806500000032,0.091735593500000004,0.09257500199999999,0.09324466900000003,0.093358661000000023,0.093432725000000022,0.093508952000000006,0.093921306500000024,0.093937349499999989,0.093950701499999956,0.094096526000000041,0.094096885999999963,0.094452268499999992,0.094853316999999993,0.094905045500000007,0.095012656000000001,0.095155956,0.095473842499999975,0.098238976500000005],"7168":[1.28125e-05,1.281904e-05,1.3110210000000001e-05,1.3151619999999999e-05,1.315567e-05,1.317178e-05,1.3207069999999999e-05,1.322571e-05,1.328332e-05,1.3293879999999998e-05,1.3350250000000001e-05,1.3443559999999998e-05,1.346964e-05,1.3562929999999999e-05,1.379104e-05,1.381893e-05,1.381964e-05,1.410702e-05,1.516056862745098e-05,1.517656e-05],"13":[3.3670000000000003e-08,3.3670000000000003e-08,3.3670000000000003e-08,3.3680000000000001e-08,3.3689999999999999e-08,3.372e-08,3.372e-08,3.3729999999999998e-08,3.3729999999999998e-08,3.3960000000000001e-08,3.3969999999999999e-08,3.4109999999999999e-08,3.4120000000000004e-08,3.5250000000000001e-08,3.5530000000000001e-08,3.5560000000000002e-08,3.571e-08,3.641e-08,3.6960000000000001e-08,3.8089999999999999e-08],"6029312":[0.074530926500000039,0.074571974499999999,0.074787668499999974,0.075229068499999996,0.075301808000000039,0.075683327000000022,0.075728445499999977,0.076129021499999963,0.076314209000000036,0.076381796999999974,0.076549685999999992,0.076723786500000002,0.076805265999999969,0.077052884500000002,0.077126422,0.077129298000000041,0.077166327499999993,0.077536695999999974,0.077635854500000018,0.078033857499999998],"14":[3.5229999999999998e-08,3.5229999999999998e-08,3.5240000000000003e-08,3.5240000000000003e-08,3.5240000000000003e-08,3.529e-08,3.5329999999999999e-08,3.5399999999999999e-08,3.5679999999999999e-08,3.5689999999999997e-08,3.5689999999999997e-08,3.6120000000000002e-08,3.6880000000000003e-08,3.7330000000000004e-08,3.7330000000000004e-08,3.7330000000000004e-08,3.735e-08,3.7359999999999998e-08,3.7369999999999996e-08,3.9009999999999997e-08],"3200":[5.7253000000000001e-06,5.7265799999999998e-06,5.7266499999999996e-06,5.7266499999999996e-06,5.7267099999999996e-06,5.7269299999999997e-06,5.7282800000000002e-06,5.7286100000000004e-06,5.7293399999999998e-06,5.7302700000000004e-06,5.7322400000000002e-06,5.73863e-06,5.7473333333333326e-06,5.74822e-06,5.9913100000000004e-06,5.9929300000000002e-06,6.1185400000000002e-06,6.1667499999999999e-06,6.2850099999999998e-06,6.5721000000000001e-06],"20":[4.5909999999999999e-08,4.5909999999999999e-08,4.5909999999999999e-08,4.5909999999999999e-08,4.5979999999999999e-08,4.6349999999999995e-08,4.6349999999999995e-08,4.636e-08,4.636e-08,4.636e-08,4.6369999999999998e-08,4.639e-08,4.6410000000000003e-08,4.6410000000000003e-08,4.6410000000000003e-08,4.8400000000000003e-08,4.8500000000000004e-08,4.8509999999999996e-08,4.8509999999999996e-08,4.8570000000000004e-08],"204800":[0.0006080455384615388,0.00061283299999999969,0.00061718599999999982,0.00062233949999999981,0.00062426700000000018,0.00062713899999999997,0.00063130853846153862,0.00063267353846153832,0.00063435766666666653,0.00063548149999999998,0.00063599866666666656,0.00063964633333333327,0.00064234450000000027,0.00064261966666666662,0.00064650861538461551,0.00065041950000000002,0.00065052876923076919,0.0006543726666666666,0.00065583699999999983,0.00066187461538461578],"15":[3.7450000000000001e-08,3.7450000000000001e-08,3.7450000000000001e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7459999999999999e-08,3.7469999999999997e-08,3.7520000000000001e-08,3.9190000000000002e-08,3.92e-08,3.92e-08,3.92e-08,3.9210000000000005e-08,3.9219999999999996e-08,3.9239999999999999e-08,4.112e-08],"13312":[2.3756600000000002e-05,2.3785666666666668e-05,2.3793000000000001e-05,2.4615399999999998e-05,2.4641289999999997e-05,2.4742879999999998e-05,2.4814840000000001e-05,2.482228e-05,2.4823070000000001e-05,2.4871999999999998e-05,2.48915e-05,2.4963000000000001e-05,2.5030178947368421e-05,2.5183240000000003e-05,2.5219100000000001e-05,2.532477e-05,2.5531159999999998e-05,2.5608050000000003e-05,2.6034943661971828e-05,2.6089400000000001e-05],"4980736":[0.060771252499999998,0.060827257000000023,0.060911926000000019,0.061185228000000022,0.061388545499999989,0.06170026700000001,0.061754357500000023,0.061868259500000002,0.062036875500000019,0.062472939999999991,0.06254855400000002,0.06271442150000002,0.062875323499999997,0.062878534,0.06289923750000001,0.062979459500000001,0.063198694,0.0634139445,0.064272292499999981,0.064943108499999999],"118784":[0.00030076000000000001,0.00030682719999999993,0.00030804833333333327,0.00031316350000000005,0.00031370510344827588,0.00031376,0.0003143645000000002,0.00031602068965517241,0.000319034,0.00032008866666666664,0.00032587149999999999,0.00032670999999999991,0.00032933933333333332,0.00033024731034482757,0.00033058600000000001,0.00033142699999999992,0.00033225888,0.0003334061379310345,0.00033479125,0.00033502682142857153],"51200":[9.1549e-05,9.512042857142856e-05,9.5437333333333335e-05,9.5735000000000004e-05,9.6218149999999989e-05,9.6238416666666673e-05,9.7127500000000001e-05,9.7321885057471266e-05,9.7593255813953475e-05,9.7627922222222219e-05,9.7729226190476192e-05,9.7787915662650592e-05,9.9623952380952386e-05,0.0001001677294117647,0.00010016852222222223,0.00010034306666666668,0.00010075632530120481,0.00010090683132530113,0.00010219454651162788,0.00010284693506493509],"16":[3.8809999999999995e-08,3.8890000000000006e-08,3.9099999999999999e-08,3.9139999999999998e-08,3.9190000000000002e-08,3.9239999999999999e-08,3.9239999999999999e-08,3.9239999999999999e-08,3.9239999999999999e-08,3.9239999999999999e-08,3.9440000000000001e-08,4.07e-08,4.084e-08,4.1059999999999998e-08,4.1059999999999998e-08,4.1069999999999997e-08,4.1069999999999997e-08,4.1069999999999997e-08,4.1130000000000005e-08,4.2459999999999998e-08],"21":[4.8090000000000002e-08,4.8099999999999994e-08,4.8189999999999997e-08,4.8189999999999997e-08,4.8199999999999995e-08,4.8330000000000003e-08,4.8359999999999998e-08,4.8359999999999998e-08,4.8359999999999998e-08,4.8359999999999998e-08,4.8359999999999998e-08,4.8369999999999996e-08,4.8410000000000001e-08,4.8410000000000001e-08,5.0180000000000003e-08,5.0180000000000003e-08,5.0420000000000004e-08,5.0610000000000001e-08,5.0689999999999999e-08,5.3070000000000005e-08],"917504":[0.0041665319999999997,0.0041842219999999996,0.0042506129999999986,0.0043685909999999998,0.0043880540000000023,0.004390428,0.0044371159999999996,0.0044777650000000007,0.0045006119999999985,0.0045099070000000022,0.0045157089999999997,0.00451936,0.004545678,0.0045494520000000024,0.0047475169999999832,0.0047672600000000023,0.0047895590000000023,0.0048074249999999997,0.0048242890000000024,0.0052214290000000014],"22":[4.9470000000000006e-08,4.9490000000000002e-08,4.9579999999999998e-08,4.9700000000000002e-08,4.9899999999999997e-08,4.9930000000000004e-08,4.9940000000000002e-08,4.9959999999999999e-08,4.9969999999999997e-08,5.0000000000000004e-08,5.0039999999999997e-08,5.0050000000000001e-08,5.0080000000000002e-08,5.0090000000000001e-08,5.0409999999999999e-08,5.2270000000000004e-08,5.229e-08,5.2329999999999999e-08,5.2439999999999998e-08,5.2469999999999999e-08],"4864":[8.701484848484849e-06,8.7104599999999996e-06,8.7350000000000002e-06,8.7469999999999994e-06,8.755e-06,8.8242999999999995e-06,8.8579599999999995e-06,8.9095399999999994e-06,8.9195300000000003e-06,8.9344000000000004e-06,8.9421300000000007e-06,8.9720699999999996e-06,8.9738800000000009e-06,9.0304900000000003e-06,9.0321100000000002e-06,9.1912600000000002e-06,9.4077600000000005e-06,9.4304299999999991e-06,9.5593157894736851e-06,9.6427100000000007e-06],"17":[4.0899999999999996e-08,4.0940000000000001e-08,4.1019999999999999e-08,4.1019999999999999e-08,4.1080000000000001e-08,4.112e-08,4.1130000000000005e-08,4.1289999999999995e-08,4.147e-08,4.147e-08,4.1479999999999998e-08,4.2919999999999997e-08,4.2919999999999997e-08,4.2930000000000001e-08,4.3170000000000002e-08,4.3220000000000006e-08,4.3479999999999996e-08,4.4800000000000004e-08,4.5190000000000003e-08,4.6569999999999999e-08],"14848":[2.6511499999999999e-05,2.6531499999999998e-05,2.6543999999999999e-05,2.7248379999999997e-05,2.7627444444444445e-05,2.76588e-05,2.7672717948717945e-05,2.7726863636363638e-05,2.7747351851851854e-05,2.775029e-05,2.7910429999999998e-05,2.7920029999999999e-05,2.8011120000000002e-05,2.8229759999999999e-05,2.8359729999999998e-05,2.8366149999999999e-05,2.8691020000000002e-05,2.8891432432432431e-05,2.9079119999999999e-05,2.9287530000000002e-05],"23":[5.1690000000000002e-08,5.1699999999999993e-08,5.1699999999999993e-08,5.1710000000000004e-08,5.1710000000000004e-08,5.1710000000000004e-08,5.1710000000000004e-08,5.1710000000000004e-08,5.1719999999999996e-08,5.1719999999999996e-08,5.1719999999999996e-08,5.1739999999999999e-08,5.1800000000000001e-08,5.1860000000000002e-08,5.1919999999999998e-08,5.2299999999999998e-08,5.4119999999999998e-08,5.4469999999999997e-08,5.4569999999999998e-08,5.6750000000000002e-08],"786432":[0.0031979670000000003,0.003311081,0.0033127090000000014,0.003317034,0.0033220710000000002,0.0033440600000000007,0.0033528020000000006,0.0033606719999999999,0.00337528,0.0034205540000000001,0.0034282829999999999,0.0034366679999999991,0.00346401,0.0035737029999999988,0.0035945169999999998,0.0035979110000000014,0.0036159309999999984,0.003707264,0.0037470839999999999,0.003810632],"18":[4.238e-08,4.238e-08,4.2810000000000004e-08,4.2810000000000004e-08,4.2810000000000004e-08,4.2810000000000004e-08,4.2819999999999996e-08,4.2819999999999996e-08,4.2849999999999997e-08,4.2860000000000001e-08,4.2880000000000004e-08,4.2969999999999994e-08,4.3469999999999998e-08,4.3469999999999998e-08,4.4379999999999998e-08,4.4530000000000002e-08,4.4800000000000004e-08,4.4839999999999997e-08,4.6999999999999997e-08,4.8790000000000002e-08],"1638400":[0.014667500999999999,0.0148123235,0.0150665925,0.015130992999999999,0.0152028445,0.015326329499999996,0.015364735499999999,0.015368884000000027,0.0153730715,0.015429700500000001,0.015734226,0.015830981500000001,0.0158623445,0.0160000665,0.016260898000000003,0.016373657999999999,0.016426331999999995,0.016441018000000002,0.017312255000000012,0.019732068999999998],"7864320":[0.098776235500000004,0.098881490000000016,0.098945546500000009,0.099281091499999974,0.099331262499999975,0.099474062500000002,0.099633973000000015,0.099822689499999992,0.099937099499999987,0.100162028,0.1002370185,0.1005724895,0.10081860049999999,0.101590561,0.101693758,0.1017349335,0.102310809,0.10237861350000001,0.10330998,0.10347506300000001],"24":[5.3040000000000004e-08,5.3099999999999999e-08,5.3099999999999999e-08,5.32e-08,5.3310000000000006e-08,5.3360000000000003e-08,5.3460000000000004e-08,5.3469999999999995e-08,5.3469999999999995e-08,5.348e-08,5.348e-08,5.348e-08,5.3519999999999999e-08,5.3940000000000005e-08,5.4849999999999998e-08,5.5949999999999995e-08,5.6020000000000001e-08,5.6020000000000001e-08,5.6020000000000001e-08,5.6430000000000003e-08],"14155776":[0.18339752100000001,0.1837861965,0.18383068899999999,0.18460956950000001,0.18477941649999999,0.18580054300000001,0.18603085799999999,0.18609285450000002,0.18687576299999997,0.187041982,0.18728022450000001,0.18741852749999999,0.18800966250000001,0.18830073549999998,0.1883663055,0.1888766905,0.18977435749999999,0.19019279850000001,0.20256095800000001,0.207297853],"19":[4.4490000000000003e-08,4.4570000000000001e-08,4.4570000000000001e-08,4.4570000000000001e-08,4.4580000000000006e-08,4.4580000000000006e-08,4.4589999999999998e-08,4.4730000000000004e-08,4.4800000000000004e-08,4.4800000000000004e-08,4.4989999999999995e-08,4.517e-08,4.5249999999999998e-08,4.6709999999999999e-08,4.6840000000000001e-08,4.688e-08,4.688e-08,4.6890000000000005e-08,4.6940000000000002e-08,4.7360000000000002e-08],"30":[6.369000000000001e-08,6.3699999999999995e-08,6.3730000000000002e-08,6.374e-08,6.3940000000000002e-08,6.3940000000000002e-08,6.3999999999999991e-08,6.4010000000000002e-08,6.4140000000000004e-08,6.4140000000000004e-08,6.4150000000000002e-08,6.4150000000000002e-08,6.4150000000000002e-08,6.416e-08,6.4200000000000006e-08,6.465e-08,6.6660000000000003e-08,6.6679999999999999e-08,6.7129999999999993e-08,7.0710000000000003e-08],"25":[5.4820000000000004e-08,5.4870000000000001e-08,5.505e-08,5.5079999999999994e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5470000000000006e-08,5.5559999999999996e-08,5.5700000000000002e-08,5.5709999999999994e-08,5.5860000000000005e-08,5.7959999999999998e-08,5.805e-08,5.8299999999999999e-08,5.9240000000000006e-08],"31":[6.5849999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5919999999999997e-08,6.5930000000000009e-08,6.5930000000000009e-08,6.5939999999999994e-08,6.5960000000000003e-08,6.5989999999999997e-08,6.6100000000000003e-08,6.6370000000000005e-08,6.8989999999999998e-08,6.8999999999999996e-08,6.8999999999999996e-08,6.9009999999999994e-08,7.2359999999999994e-08],"1280":[2.29937e-06,2.2994700000000002e-06,2.2994899999999999e-06,2.29954e-06,2.2996400000000002e-06,2.2996599999999999e-06,2.2997600000000002e-06,2.29977e-06,2.2998399999999998e-06,2.3002e-06,2.3006699999999999e-06,2.3014700000001388e-06,2.3018900000000001e-06,2.3032299999999998e-06,2.3135599999999999e-06,2.3141200000000001e-06,2.3145699999999998e-06,2.52405e-06,2.5242700000000001e-06,2.72277e-06],"26":[5.7019999999999997e-08,5.7019999999999997e-08,5.7019999999999997e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.7030000000000002e-08,5.704e-08,5.704e-08,5.704e-08,5.7089999999999997e-08,5.711e-08,5.7130000000000003e-08,5.9670000000000004e-08,5.9680000000000002e-08,5.9750000000000002e-08,6.1080000000000002e-08],"3932160":[0.047207036000000001,0.047524733499999985,0.047568350499999981,0.047646672500000001,0.047690957499999999,0.047812211,0.0478309175,0.047874062500000002,0.047961869999999997,0.047984949000000006,0.048068516500000012,0.0481372615,0.048159153500000003,0.048202417999999997,0.048419839999999978,0.048582142499999981,0.048785695999999996,0.048871329000000019,0.048932131500000003,0.049549812499999998],"2432":[4.3546699999999996e-06,4.3551500000000001e-06,4.3565800000000002e-06,4.3565999999999999e-06,4.3566200000000005e-06,4.3566900000000003e-06,4.3568100000000002e-06,4.3572700000000002e-06,4.3573700000000004e-06,4.3596300000000001e-06,4.3597599999999999e-06,4.3601199999999997e-06,4.3602000000000002e-06,4.3608200000000004e-06,4.3611800000000001e-06,4.5572899999999997e-06,4.5599199999999999e-06,4.5631499999999997e-06,4.7812400000000003e-06,5.1407899999999993e-06],"32":[7.1270000000000002e-08,7.1270000000000002e-08,7.1270000000000002e-08,7.128e-08,7.130000000000001e-08,7.130000000000001e-08,7.130000000000001e-08,7.1319999999999993e-08,7.1330000000000004e-08,7.1530000000000006e-08,7.1709999999999998e-08,7.1719999999999996e-08,7.1740000000000006e-08,7.1740000000000006e-08,7.1760000000000002e-08,7.2359999999999994e-08,7.4620000000000002e-08,7.5059999999999998e-08,7.5639999999999994e-08,7.5740000000000002e-08],"27":[5.8810000000000002e-08,5.8810000000000002e-08,5.8810000000000002e-08,5.882e-08,5.882e-08,5.882e-08,5.8830000000000005e-08,5.8900000000000005e-08,5.8939999999999997e-08,5.8990000000000001e-08,5.903e-08,5.9109999999999998e-08,5.9190000000000003e-08,6.0170000000000002e-08,6.0819999999999998e-08,6.1600000000000009e-08,6.1750000000000007e-08,6.1789999999999999e-08,6.2830000000000001e-08,6.5859999999999995e-08],"409600":[0.0013052294999999997,0.001323832,0.0013251565,0.0013309295,0.0013337070000000002,0.001343279,0.0013468115,0.0013477820000000001,0.0013555279999999999,0.0013556010000000001,0.0013560421999999999,0.0013563115,0.00137619,0.0013852814999999999,0.0013903595,0.0013951529999999995,0.001397347,0.0013983940000000001,0.001408016,0.0014125742500000001]}},{"title":"std::deque push_front","results":{"28":[1.8615000000000001e-07,1.8695999999999997e-07,1.8753000000000001e-07,1.8768999999999998e-07,1.8779000000000002e-07,1.8808999999999999e-07,1.8836e-07,1.8861000000000002e-07,1.8885e-07,1.938e-07,1.948e-07,1.9483999999999999e-07,1.9582999999999997e-07,1.9604999999999999e-07,1.9707e-07,1.9791999999999999e-07,1.9847e-07,2.0068000000000002e-07,2.0091000000000002e-07,2.0886999999999999e-07],"34":[2.0015e-07,2.0029999999999999e-07,2.0097000000000001e-07,2.0142000000000001e-07,2.0247000000000001e-07,2.0338000000000001e-07,2.0349999999999999e-07,2.0369000000000002e-07,2.0587999999999999e-07,2.0638000000000003e-07,2.0747999999999998e-07,2.079e-07,2.0801999999999998e-07,2.0874e-07,2.0908000000000002e-07,2.0924000000000001e-07,2.1135e-07,2.1787999999999999e-07,2.2025999999999999e-07,2.2734999999999998e-07],"29":[1.8747e-07,1.8859e-07,1.8904999999999999e-07,1.8913e-07,1.8922e-07,1.8930999999999999e-07,1.8933999999999997e-07,1.8969e-07,1.8976e-07,1.9021999999999999e-07,1.9086e-07,1.9100999999999999e-07,1.9300000000000002e-07,1.9735999999999999e-07,1.9839000000000002e-07,2.0020999999999999e-07,2.0086000000000001e-07,2.0244999999999999e-07,2.0267e-07,2.1096e-07],"40":[2.1285999999999999e-07,2.132e-07,2.1398000000000001e-07,2.1398000000000001e-07,2.1399999999999998e-07,2.1430999999999999e-07,2.1776999999999997e-07,2.1857e-07,2.1892999999999999e-07,2.1911999999999999e-07,2.1929e-07,2.1957999999999998e-07,2.1980999999999998e-07,2.202e-07,2.2029e-07,2.2059999999999998e-07,2.2382999999999999e-07,2.3025000000000001e-07,2.3068e-07,2.3311e-07],"17408":[4.5275999999999998e-05,4.722884e-05,4.7855999999999997e-05,4.8899000000000001e-05,4.9227549999999999e-05,4.9228000000000004e-05,4.9532051020408167e-05,4.9634010101010102e-05,4.9810425531914893e-05,4.9905490000000005e-05,4.9929309999999997e-05,5.0192632653061222e-05,5.0231938775510203e-05,5.0656369999999996e-05,5.0684730000000002e-05,5.0825799999999997e-05,5.0947259999999996e-05,5.1151620000000001e-05,5.1390290000000001e-05,5.4360000000000001e-05],"1472":[4.0478000000000004e-06,4.0524999999999997e-06,4.0565699999999999e-06,4.0821399999999997e-06,4.08459e-06,4.0947500000000001e-06,4.1149999999999996e-06,4.1189999999999999e-06,4.1289000000000004e-06,4.1388099999999999e-06,4.1390600000000005e-06,4.1398599999999997e-06,4.1496699999999999e-06,4.1610000000000005e-06,4.1734699999999995e-06,4.1765900000000001e-06,4.1892131147540977e-06,4.20066e-06,4.2604799999999996e-06,4.2817099999999999e-06],"112":[3.7959000000000003e-07,3.7978000000000003e-07,3.7988000000000004e-07,3.7997999999999999e-07,3.8018000000000001e-07,3.8022999999999996e-07,3.8025000000000003e-07,3.8047999999999998e-07,3.8048999999999999e-07,3.8098000000000001e-07,3.8145000000000002e-07,3.8152000000000004e-07,3.8173999999999998e-07,3.8183999999999998e-07,3.8293e-07,3.9334e-07,3.9700999999999998e-07,4.0314e-07,4.5807999999999998e-07,4.6062e-07],"1376256":[0.004435780000000002,0.0050578949999999998,0.0069444180000000034,0.0070267820000000049,0.0070395830000000003,0.007054935,0.0070614189999999976,0.0070792709999999964,0.00714446,0.0071509879999999996,0.007167891,0.0071701180000000014,0.0071983419999999965,0.0072902519999999988,0.0072956899999999979,0.0073723510000000044,0.0074093449999999995,0.0075397599999999995,0.0077371839999999994,0.0078518350000000032],"5242880":[0.027737738000000001,0.028510155999999988,0.02992623500000003,0.030526245,0.030601753999999991,0.030736956500000006,0.03100511600000001,0.031081371,0.031136566000000011,0.031164438500000002,0.03125294499999999,0.031633069,0.031672737999999999,0.03168858900000001,0.03176466,0.032021352500000003,0.032099659000000016,0.032614259,0.032963826500000001,0.034171323000000017],"36":[2.0386999999999999e-07,2.0449e-07,2.0549e-07,2.0733999999999998e-07,2.0741e-07,2.0806999999999998e-07,2.0846999999999999e-07,2.0883999999999998e-07,2.0979e-07,2.1010999999999999e-07,2.1030999999999998e-07,2.1121e-07,2.1163e-07,2.1256000000000002e-07,2.1287000000000003e-07,2.1303e-07,2.1331e-07,2.1355e-07,2.1562000000000002e-07,2.1698e-07],"42":[2.1791e-07,2.1796e-07,2.1818000000000001e-07,2.1862999999999999e-07,2.1889999999999998e-07,2.1900000000000002e-07,2.1917999999999998e-07,2.1988000000000001e-07,2.2075000000000001e-07,2.2275000000000001e-07,2.2286e-07,2.2308999999999999e-07,2.2365999999999998e-07,2.2407000000000002e-07,2.2441000000000001e-07,2.2447999999999998e-07,2.2489e-07,2.2784000000000001e-07,2.2790999999999998e-07,2.3396000000000001e-07],"11534336":[0.061880434999999998,0.062021033500000003,0.062152936999999998,0.062621400999999979,0.062649592000000004,0.062886782999999974,0.063733135999999996,0.064004603500000035,0.06452596200000002,0.06474010500000002,0.06478402300000001,0.065253276999999998,0.065349704999999966,0.065829131999999999,0.06595066400000002,0.066233926000000026,0.067835574499999982,0.06796138600000004,0.07893733499999997,0.079455789999999998],"114688":[0.000296738,0.00031787966666666661,0.00031881599999999998,0.00032044100000000014,0.00032155900000000002,0.000323104,0.0003249499999999999,0.0003252620000000001,0.000326578,0.00032703314285714285,0.00032993349999999998,0.00033083400000000001,0.0003313575714285714,0.00033140851724137928,0.00033149022222222227,0.00033282686206896557,0.00033360699999999987,0.00033612471428571427,0.00033932444444444442,0.00037130923076923082],"144":[4.5084999999999999e-07,4.5092999999999998e-07,4.5167000000000002e-07,4.5176000000000002e-07,4.5176999999999997e-07,4.5193e-07,4.5260999999999997e-07,4.5266999999999999e-07,4.5279999999999998e-07,4.5296999999999996e-07,4.5312999999999998e-07,4.5321000000000002e-07,4.5357e-07,4.5371000000000006e-07,4.5371999999999996e-07,4.5471999999999998e-07,4.5476999999999999e-07,4.5544999999999997e-07,4.5633999999999997e-07,4.7246999999999994e-07],"38":[2.0948999999999998e-07,2.0964000000000002e-07,2.1016e-07,2.1146000000000002e-07,2.1273e-07,2.1325999999999999e-07,2.1429000000000002e-07,2.1563000000000001e-07,2.1565999999999999e-07,2.1579e-07,2.1619000000000001e-07,2.1656999999999999e-07,2.1673000000000001e-07,2.1677e-07,2.1682000000000001e-07,2.1957e-07,2.2011999999999999e-07,2.2685999999999998e-07,2.3600000000000002e-07,2.4709999999999998e-07],"240":[6.6593000000000003e-07,6.6618999999999991e-07,6.6623000000000006e-07,6.6648000000000008e-07,6.6737999999999993e-07,6.6755999999999992e-07,6.6758000000000005e-07,6.6793999999999993e-07,6.6863999999999998e-07,6.6896999999999988e-07,6.6930999999999995e-07,6.7027999999999994e-07,6.7051999999999989e-07,6.7494000000000003e-07,6.9695000000000006e-07,6.9728999999999991e-07,6.9888000000000007e-07,6.9980000000000006e-07,7.0012999999999996e-07,7.5305999999999999e-07],"9216":[2.5378999999999999e-05,2.5565809999999999e-05,2.5610999999999999e-05,2.5661250000000001e-05,2.5778257142857144e-05,2.5841509999999997e-05,2.5885159999999998e-05,2.5903419999999998e-05,2.6041567164179103e-05,2.6090760000000002e-05,2.624746e-05,2.6279950000000002e-05,2.6294844155844157e-05,2.6321749999999999e-05,2.6574e-05,2.6733126984126982e-05,2.6784999999999999e-05,2.6790669999999999e-05,2.9508676470588234e-05,2.9524999999999999e-05],"44":[2.2183000000000002e-07,2.2198999999999999e-07,2.2234000000000002e-07,2.2305999999999999e-07,2.2373000000000001e-07,2.2430000000000002e-07,2.2493999999999997e-07,2.2742000000000001e-07,2.2751999999999999e-07,2.2789000000000001e-07,2.2799999999999998e-07,2.2881999999999998e-07,2.2966000000000001e-07,2.3005e-07,2.3039000000000001e-07,2.3190000000000001e-07,2.3232999999999999e-07,2.3237999999999999e-07,2.3523000000000002e-07,2.4987e-07],"1664":[4.4690400000000002e-06,4.5093000000000002e-06,4.5177e-06,4.52562e-06,4.5289500000000001e-06,4.5460000000000002e-06,4.5513200000000005e-06,4.5583899999999996e-06,4.5654299999999999e-06,4.5993799999999998e-06,4.61545e-06,4.66312e-06,4.67794e-06,4.6967799999999999e-06,4.7064415584415588e-06,4.73118e-06,4.7383300000000004e-06,4.7940000000000002e-06,4.7948899999999998e-06,4.9800699999999996e-06],"196608":[0.00051963999999999982,0.00052089699999999998,0.00054401799999999974,0.0005511190000000003,0.00055241800000000027,0.00056030956250000029,0.00056173300000000002,0.00056173599999999996,0.0005622201875,0.00056492899999999993,0.0005665606249999998,0.00056833282352941183,0.00057022558823529418,0.00057286542857142855,0.00057454337499999986,0.00058035388235294129,0.00058074750000000023,0.0005903578124999998,0.00059555537500000002,0.00061249693333333328],"155648":[0.00041357400000000005,0.00042301699999999982,0.000427859,0.00042874500000000002,0.00043634900000000021,0.00043759000000000002,0.000439214,0.000439565,0.000441462,0.00044437299999999997,0.0004450111363636363,0.00044576661111111104,0.000447522,0.00044779200000000013,0.00044874354545454555,0.00044943272727272733,0.00045187100000000023,0.00045414852380952356,0.00045454999999999991,0.00045826438095238097],"2816":[7.5340000000000002e-06,7.7245600000000011e-06,7.8998399999999996e-06,7.9557300000000012e-06,7.99613e-06,8.0474599999999993e-06,8.0724400000000003e-06,8.0837000000000002e-06,8.1042799999999999e-06,8.1301500000000004e-06,8.1501199999999998e-06,8.1529999999999997e-06,8.3168499999999998e-06,8.383989999999999e-06,8.3883700000000005e-06,8.4891199999999995e-06,8.5279500000000002e-06,8.5507900000000005e-06,8.6100700000000004e-06,9.1702200000000004e-06],"50":[2.3551e-07,2.3558e-07,2.3565e-07,2.3717e-07,2.3983e-07,2.4014000000000003e-07,2.4083999999999998e-07,2.4087000000000001e-07,2.4181999999999998e-07,2.4252000000000003e-07,2.4255000000000001e-07,2.4264999999999997e-07,2.431e-07,2.4349999999999998e-07,2.4446000000000001e-07,2.4578000000000002e-07,2.4698999999999996e-07,2.4838e-07,2.5443999999999999e-07,2.5767e-07],"2359296":[0.011347784999999999,0.012998947,0.013018511,0.013030252500000001,0.013194224500000001,0.013232592,0.013261770000000001,0.013301749999999996,0.013378042,0.013422927499999997,0.013424706,0.013428625,0.013551193,0.013593743,0.0136138875,0.0136230885,0.013692997,0.0140522185,0.014910402,0.015873726499999994],"46":[2.2600000000000001e-07,2.2625e-07,2.2735999999999999e-07,2.2744999999999999e-07,2.3068999999999998e-07,2.3101e-07,2.3209000000000001e-07,2.3313e-07,2.3393e-07,2.3407e-07,2.3423e-07,2.3447000000000001e-07,2.3533999999999999e-07,2.3535e-07,2.3808999999999998e-07,2.3813999999999999e-07,2.3935999999999999e-07,2.3937000000000001e-07,2.4313999999999999e-07,2.5842000000000001e-07],"176":[5.2343999999999998e-07,5.2359999999999995e-07,5.2376000000000003e-07,5.2386999999999999e-07,5.2450000000000002e-07,5.2497999999999993e-07,5.2526000000000003e-07,5.2564000000000004e-07,5.2572000000000003e-07,5.2587999999999999e-07,5.2595999999999998e-07,5.2633000000000003e-07,5.2733e-07,5.2786999999999997e-07,5.2811999999999999e-07,5.2895999999999999e-07,5.4635999999999992e-07,5.4893999999999999e-07,5.8424999999999995e-07,6.1211999999999995e-07],"52":[2.3980999999999997e-07,2.4021e-07,2.4060377358490563e-07,2.4073000000000001e-07,2.4172999999999998e-07,2.4204999999999997e-07,2.4266999999999999e-07,2.4301e-07,2.4782e-07,2.4808999999999999e-07,2.4859999999999999e-07,2.4873000000000003e-07,2.4876000000000001e-07,2.4898e-07,2.4922999999999996e-07,2.4945e-07,2.5248e-07,2.5403000000000001e-07,2.6129999999999999e-07,2.7676e-07],"272":[9.0317999999999997e-07,9.2002e-07,9.2435999999999995e-07,9.2760999999999998e-07,9.2873000000000008e-07,9.2935000000000005e-07,9.3025999999999997e-07,9.3054999999999993e-07,9.3245000000000007e-07,9.3564000000000003e-07,9.3629999999999993e-07,9.3829999999999998e-07,9.3987999999999997e-07,9.4592999999999989e-07,9.5966999999999991e-07,9.6669999999999999e-07,1.00643e-06,1.01408e-06,1.08049e-06,1.20275e-06],"116":[3.8846000000000003e-07,3.8856000000000003e-07,3.8878999999999998e-07,3.8883000000000002e-07,3.8906000000000002e-07,3.8953999999999998e-07,3.8958999999999998e-07,3.8977999999999999e-07,3.9023000000000002e-07,3.9024999999999999e-07,3.9066000000000003e-07,3.9196000000000002e-07,3.9253999999999999e-07,3.9589999999999999e-07,4.0359999999999999e-07,4.0887999999999999e-07,4.6866000000000002e-07,4.7132000000000001e-07,4.7302999999999999e-07,4.7927999999999999e-07],"47104":[0.000125091,0.00012765825000000001,0.000129278,0.00012941924999999998,0.00012954500000000003,0.0001313718888888889,0.000132643,0.00013320661428571431,0.00013407099999999998,0.00013465599999999995,0.00013468200000000006,0.000134766,0.00013495300000000005,0.00013508578260869563,0.00013705944444444444,0.00013807401587301589,0.00013889618750000004,0.00013992855000000002,0.00014086909374999996,0.00014112745454545453],"6912":[1.8288499999999999e-05,1.8708499999999999e-05,1.8720333333333334e-05,1.880475e-05,1.9363799999999999e-05,1.9484570000000001e-05,1.9556e-05,1.957227e-05,1.9687139999999999e-05,1.980683e-05,1.984736e-05,1.9901430000000001e-05,1.9961000000000001e-05,1.9993423076923077e-05,2.0052e-05,2.0123509999999999e-05,2.0140689999999998e-05,2.0538650000000004e-05,2.0549339999999999e-05,2.0594649999999998e-05],"1856":[5.1865899999999998e-06,5.1920000000000004e-06,5.20857e-06,5.2194399999999998e-06,5.23413e-06,5.2405099999999999e-06,5.2880699999999998e-06,5.2884000000000001e-06,5.2920899999999998e-06,5.3005499999999996e-06,5.3028600000000003e-06,5.31149e-06,5.3178399999999996e-06,5.3184300000000002e-06,5.3263799999999998e-06,5.3628699999999995e-06,5.3638983050847462e-06,5.3663900000000001e-06,5.3700999999999996e-06,5.5640800000000001e-06],"48":[2.3084000000000002e-07,2.3127000000000001e-07,2.3142999999999998e-07,2.3197000000000001e-07,2.3209999999999999e-07,2.3251999999999999e-07,2.3257000000000002e-07,2.3304e-07,2.3771999999999999e-07,2.3808e-07,2.3815000000000002e-07,2.3886000000000001e-07,2.3896000000000002e-07,2.3955e-07,2.3993000000000001e-07,2.4069000000000002e-07,2.4298000000000002e-07,2.4298999999999998e-07,2.4324e-07,2.4876000000000001e-07],"2097152":[0.0089358720000000044,0.0093663309999999968,0.012082931999999994,0.012184180000000003,0.012202784999999997,0.012264968999999999,0.012284038000000001,0.012298117500000001,0.012319251999999999,0.012353929500000001,0.012363476,0.01239228,0.012392547,0.012488742000000001,0.012605548999999999,0.012607337499999999,0.0127189235,0.012742433000000003,0.012958978500000001,0.013120813],"54":[2.4531000000000002e-07,2.4559999999999998e-07,2.4609e-07,2.4834000000000001e-07,2.4882999999999999e-07,2.4965000000000002e-07,2.5059999999999998e-07,2.5068999999999998e-07,2.5125000000000003e-07,2.5172999999999999e-07,2.5199999999999998e-07,2.5211e-07,2.5258e-07,2.5337e-07,2.5432999999999998e-07,2.5643999999999999e-07,2.5703999999999998e-07,2.6077000000000002e-07,2.6342000000000001e-07,2.6665000000000002e-07],"2031616":[0.0088069410000000004,0.008913664,0.0089710580000000005,0.008997113999999997,0.0089990290000000004,0.0090315449999999985,0.0090331290000000061,0.0090594180000000031,0.0090704040000000007,0.0090837910000000008,0.0091045699999999976,0.0091070990000000039,0.0091156340000000027,0.0091453850000000024,0.0092295390000000001,0.0092310819999999981,0.0093650049999999992,0.0094118990000000013,0.0094226699999999993,0.010264132],"43008":[0.00011686200000000002,0.00011808583333333331,0.00011906900000000001,0.000119073,0.00011988633333333334,0.00012123445569620253,0.00012286622666666668,0.00012296299999999997,0.00012335221794871791,0.00012340499999999999,0.00012359981690140845,0.00012410361038961038,0.00012416399999999999,0.00012442600000000002,0.00012501634374999997,0.00012720327999999999,0.00012747414473684209,0.00012782599999999999,0.000128427,0.00012862638666666666],"60":[2.5788999999999999e-07,2.5894999999999997e-07,2.5902e-07,2.5989999999999999e-07,2.6089e-07,2.6162000000000004e-07,2.6187e-07,2.6217999999999998e-07,2.6271999999999996e-07,2.6343999999999998e-07,2.6357999999999998e-07,2.6423999999999999e-07,2.6460999999999999e-07,2.6510000000000001e-07,2.6511999999999998e-07,2.6791000000000002e-07,2.6823000000000001e-07,2.7075999999999997e-07,2.7604999999999999e-07,2.7673000000000002e-07],"30720":[8.3231583333333328e-05,8.4271999999999995e-05,8.4977999999999999e-05,8.6466999999999997e-05,8.6675454545454545e-05,8.7266645833333333e-05,8.7943916666666667e-05,8.7993999999999998e-05,8.8258649999999999e-05,8.9024833333333335e-05,8.9140000000000004e-05,8.9210500000000002e-05,8.9604999999999993e-05,8.9851449999999995e-05,8.9967666666666669e-05,9.0215569999999988e-05,9.2625209999999989e-05,9.3057499999999995e-05,9.4729059999999998e-05,9.6792500000000012e-05],"56":[2.487e-07,2.5100999999999997e-07,2.5316999999999998e-07,2.5319000000000001e-07,2.5414999999999998e-07,2.5446000000000002e-07,2.5447999999999999e-07,2.5469999999999997e-07,2.5507000000000002e-07,2.5594e-07,2.5622999999999996e-07,2.5625999999999999e-07,2.5687e-07,2.5961000000000003e-07,2.6057000000000001e-07,2.6190999999999999e-07,2.6370999999999997e-07,2.6636999999999997e-07,2.7472999999999997e-07,2.7996000000000003e-07],"62":[2.6282999999999998e-07,2.6313e-07,2.6343999999999998e-07,2.6369e-07,2.6402e-07,2.643e-07,2.6692000000000001e-07,2.6832000000000001e-07,2.7019999999999997e-07,2.7024000000000002e-07,2.7107e-07,2.7121e-07,2.7123999999999999e-07,2.7155999999999998e-07,2.7268999999999999e-07,2.7315999999999999e-07,2.7466e-07,2.7467000000000001e-07,2.8300999999999999e-07,2.8389999999999999e-07],"58":[2.5405999999999999e-07,2.5418000000000002e-07,2.5473000000000001e-07,2.5480999999999999e-07,2.5576999999999997e-07,2.5689000000000002e-07,2.5730000000000001e-07,2.5753e-07,2.5828000000000001e-07,2.5888e-07,2.5891999999999999e-07,2.5905999999999999e-07,2.5914999999999999e-07,2.5963e-07,2.5977e-07,2.6001999999999997e-07,2.6361000000000002e-07,2.6874999999999997e-07,2.739746835443038e-07,2.8809999999999999e-07],"3014656":[0.014918024,0.0149782135,0.015047391,0.015100951499999998,0.0151155395,0.015118595,0.015125168,0.015206580500000006,0.015214373,0.015220417999999999,0.015250455999999999,0.0152675265,0.0153148095,0.015318411000000001,0.015346500499999999,0.015369416,0.015812623500000001,0.01588111,0.017112118999999978,0.017252522499999999],"64":[2.6719e-07,2.6795999999999997e-07,2.6809000000000001e-07,2.6812676056338031e-07,2.6828000000000002e-07,2.7077999999999999e-07,2.7080000000000002e-07,2.7151999999999999e-07,2.7233e-07,2.7234999999999997e-07,2.7284e-07,2.7310999999999999e-07,2.7401e-07,2.7412000000000002e-07,2.7681e-07,2.7684000000000004e-07,2.7823999999999998e-07,2.791111111111111e-07,2.8127999999999999e-07,2.8573e-07],"8388608":[0.044468587499999997,0.045389500500000013,0.045674730999999989,0.045738862499999998,0.045839238499999997,0.046148989000000001,0.046522244000000011,0.046554581999999997,0.046611184999999986,0.046654629999999996,0.046779827999999996,0.047260842000000011,0.047424149999999984,0.047640074500000004,0.047812844,0.048108263499999984,0.048429422499999999,0.049164418500000001,0.0493305245,0.057563078000000004],"29696":[7.9585999999999993e-05,8.0852000000000004e-05,8.1188999999999998e-05,8.1301529411764712e-05,8.1459999999999996e-05,8.24782105263158e-05,8.2549479999999991e-05,8.2836222222222223e-05,8.300197e-05,8.3182000000000004e-05,8.3612444444444448e-05,8.4459080000000005e-05,8.4497176470588238e-05,8.4587099999999988e-05,8.4607187499999994e-05,8.4737939999999997e-05,8.4852999999999995e-05,8.5112835164835165e-05,8.5569484848484298e-05,8.6585090000000005e-05],"216":[6.1302000000000002e-07,6.1330000000000002e-07,6.1354999999999993e-07,6.1395000000000007e-07,6.1464999999999991e-07,6.1500000000000004e-07,6.1544000000000001e-07,6.1628000000000001e-07,6.1735000000000001e-07,6.1736000000000007e-07,6.1758e-07,6.1777000000000006e-07,6.1859999999999989e-07,6.197700000000001e-07,6.4137000000000003e-07,6.4168000000000001e-07,6.4233000000000006e-07,6.428800000000001e-07,6.7372999999999999e-07,6.9589999999999998e-07],"106496":[0.00028655599999999999,0.00028920599999999986,0.00029475699999999998,0.00029524833333333334,0.00029558500000000001,0.00029713500000000002,0.00029761266666666664,0.00029833700000000014,0.00029928216666666663,0.00029948900000000001,0.00030131899999999998,0.00030210700000000008,0.0003029426666666667,0.00030554582142857149,0.00030654316129032273,0.00030722977419354825,0.00030784213333333326,0.00031263500000000002,0.00031465099999999988,0.00031771239999999992],"72":[2.8475000000000001e-07,2.8504000000000002e-07,2.8541999999999997e-07,2.8557999999999999e-07,2.8583999999999997e-07,2.8655999999999999e-07,2.8744000000000004e-07,2.8863000000000001e-07,2.9002e-07,2.9017999999999997e-07,2.9035e-07,2.9050000000000001e-07,2.9051999999999998e-07,2.9059000000000001e-07,2.9060000000000002e-07,2.9060999999999998e-07,2.9111999999999998e-07,2.932e-07,2.9813999999999999e-07,2.9858999999999998e-07],"442368":[0.001232637,0.0012420999999999999,0.0012594780000000001,0.0012631555714285713,0.0012652765714285714,0.00126677,0.001269795,0.0012734159999999999,0.0012754579999999997,0.001276746142857143,0.001278317,0.001278695,0.0012806628571428572,0.0012926039999999995,0.001310744,0.001320407428571429,0.0013255019999999997,0.0013345737142857145,0.0013444379999999994,0.0014401860000000006],"147456":[0.00040456499999999996,0.00040847400000000014,0.0004092469999999999,0.00040979299999999998,0.00041277800000000004,0.00041591000000000008,0.00042011163636363635,0.00042134699999999987,0.00042237300000000003,0.00042351900000000013,0.00042510286956521737,0.00042670199999999999,0.00042993890476190498,0.00043302,0.00043633736363636366,0.00043636899999999998,0.00043823559090909085,0.00043883700000000019,0.00044913385714285723,0.00046976099999999996],"4456448":[0.022535312999999994,0.02446371,0.025229027999999994,0.025460929,0.025528032999999999,0.025640583000000002,0.0256477645,0.025736523000000001,0.025869904999999999,0.025873398499999971,0.025941057,0.025950444500000003,0.0262813535,0.026315392999999999,0.026448775999999945,0.026631386000000028,0.027355603999999999,0.027612526500000002,0.027689408500000002,0.027910898],"63488":[0.00017112299999999997,0.00017159399999999996,0.000174933,0.00017505400000000001,0.00017619900000000001,0.000177013625,0.00017791133333333337,0.00017793600000000001,0.00017846499999999999,0.00017896612244897966,0.00017897766666666673,0.000179459,0.00018095243396226417,0.00018342900000000001,0.0001847236086956521,0.000185475,0.00018588843750000001,0.000186274,0.00019126599999999999,0.00019487900000000002],"38912":[0.00010534119999999997,0.000107672,0.000108113,0.00010861014285714287,0.000109776,0.000110324,0.00011048494186046509,0.000111129,0.000111196,0.00011136,0.00011167076623376623,0.00011169831578947367,0.000112773,0.00011321739999999994,0.00011328619999999997,0.00011413996153846154,0.00011420866666666664,0.00011426068674698794,0.00011440547674418608,0.00012567013888888892],"68":[2.7594000000000002e-07,2.7647000000000004e-07,2.7670999999999999e-07,2.7688999999999999e-07,2.7723e-07,2.7728000000000001e-07,2.7730999999999999e-07,2.7781999999999998e-07,2.7852999999999999e-07,2.8065999999999997e-07,2.8146999999999999e-07,2.8223913043478258e-07,2.8229000000000002e-07,2.8229000000000002e-07,2.8319000000000004e-07,2.8333999999999999e-07,2.8373999999999997e-07,2.8382999999999997e-07,2.8537000000000002e-07,2.8583000000000001e-07],"188416":[0.00051523299999999982,0.00051880800000000016,0.00052353100000000004,0.00052384000000000003,0.00053061299999999998,0.00053149800000000004,0.00053945499999999999,0.00054008300000000001,0.00054254300000000004,0.00054376999999999974,0.00054524970588235304,0.00054872700000000016,0.00055041400000000015,0.00055355340000000006,0.00055561376470588232,0.00055636711764705876,0.00055780194117647044,0.00056166370588235301,0.00057092594117647065,0.00057127499999999999],"248":[6.8388999999999997e-07,6.8412999999999992e-07,6.852299999999999e-07,6.8547000000000006e-07,6.8570000000000006e-07,6.8585999999999992e-07,6.8604999999999998e-07,6.8646000000000007e-07,6.8659999999999991e-07,6.8665999999999998e-07,6.8851999999999997e-07,6.8886000000000004e-07,6.8892e-07,6.8902000000000001e-07,7.155700000000001e-07,7.1640999999999999e-07,7.1680999999999992e-07,7.1966999999999998e-07,7.5893000000000003e-07,8.0477999999999998e-07],"80":[3.0216e-07,3.0250000000000002e-07,3.0274999999999998e-07,3.0298999999999999e-07,3.0361999999999996e-07,3.0401999999999999e-07,3.0455000000000001e-07,3.0482e-07,3.0713999999999998e-07,3.0759999999999998e-07,3.0785542168674696e-07,3.0812000000000004e-07,3.0829000000000002e-07,3.0849000000000003e-07,3.0913000000000002e-07,3.0922000000000001e-07,3.0936999999999997e-07,3.0992999999999997e-07,3.1800000000000002e-07,3.4191999999999998e-07],"2560":[6.8824999999999997e-06,7.0376666666666661e-06,7.1023199999999995e-06,7.1812199999999997e-06,7.1846900000000002e-06,7.2043599999999997e-06,7.2052399999999995e-06,7.2214999999999994e-06,7.2222699999999999e-06,7.2293399999999998e-06,7.2344999999999999e-06,7.2941399999999996e-06,7.3007400000000005e-06,7.3094700000000005e-06,7.3343599999999994e-06,7.3511099999999997e-06,7.3556999999999997e-06,7.39422e-06,7.4280300000000003e-06,7.5719899999999998e-06],"34816":[9.5222000000000004e-05,9.5557999999999995e-05,9.57055e-05,9.6365000000000003e-05,9.7355750000000004e-05,9.8389277777777772e-05,9.8505635416666677e-05,9.8955549450549448e-05,9.9032375000000002e-05,9.9089749999999998e-05,9.9735270833333333e-05,0.000100072,0.00010012033333333333,0.00010050646938775507,0.00010097636956521735,0.00010123386813186813,0.00010157266666666668,0.00010286005263157895,0.0001033766,0.0001035124390243902],"3712":[9.7170000000000003e-06,9.7399999999999999e-06,9.8109999999999997e-06,9.91e-06,1.0427349999999999e-05,1.0442631578947369e-05,1.0459849999999999e-05,1.0478419999999999e-05,1.0485250000000001e-05,1.049974e-05,1.06245e-05,1.0640770000000001e-05,1.0665830000000001e-05,1.0771000000000001e-05,1.1007569999999999e-05,1.10691e-05,1.1163150000000002e-05,1.1180260000000001e-05,1.1336140000000001e-05,1.21179e-05],"3538944":[0.018589158500000001,0.019318315999999999,0.019687921000000001,0.019759783,0.01983342300000001,0.019876972,0.019889526999999994,0.0198991845,0.0199111685,0.019918624499999999,0.019968999000000001,0.020004178000000001,0.020089766000000002,0.020106609000000001,0.020138589499999998,0.020619760000000004,0.020633289499999999,0.020710986000000001,0.021056587999999994,0.021725338],"76":[2.9321000000000002e-07,2.9378999999999999e-07,2.9386999999999997e-07,2.9424000000000002e-07,2.9444000000000003e-07,2.9479999999999997e-07,2.9520454545454548e-07,2.9572e-07,2.9626999999999999e-07,2.9671999999999997e-07,2.9924000000000002e-07,2.9931e-07,2.9934999999999999e-07,2.9941999999999996e-07,2.9971000000000003e-07,3.0043e-07,3.0128000000000001e-07,3.0133000000000001e-07,3.0389e-07,3.1453e-07],"4194304":[0.023501262000000005,0.024189229999999999,0.024248433,0.024514964,0.024557964500000001,0.024593277000000018,0.024658737999999993,0.024680904499999993,0.024767894000000006,0.024811281499999997,0.0248114275,0.0249662285,0.025123167999999994,0.025221327999999998,0.025274368499999998,0.025396431000000004,0.025598932999999997,0.02687509300000001,0.027184778999999999,0.0278573035],"851968":[0.0024379250000000001,0.0024471750000000007,0.002463509,0.0024702176666666666,0.002478612666666667,0.002487515,0.0024909136666666667,0.0025013079999999998,0.002506589,0.0025068143333333327,0.0025157006666666668,0.0025180676666666669,0.0025254956666666672,0.0025467616666666666,0.0025514800000000005,0.0025519073333333331,0.0025695913333333331,0.0025820676666666663,0.0025846416666666671,0.0028147209999999988],"4096":[1.148099e-05,1.15e-05,1.155228e-05,1.1626250000000001e-05,1.1651000000000001e-05,1.1686789999999999e-05,1.171979e-05,1.1725150000000001e-05,1.1753219999999999e-05,1.1820890000000002e-05,1.1866719999999999e-05,1.1887499999999999e-05,1.1923777777777778e-05,1.1991799999999999e-05,1.2022142857142856e-05,1.2040839999999999e-05,1.2301178947368421e-05,1.2530359999999998e-05,1.2536e-05,1.3365910000000001e-05],"59392":[0.00015992799999999999,0.00016316200000000006,0.00016329000000000002,0.00016857231707317072,0.00016873800000000001,0.00016923899999999998,0.00016937200000000004,0.0001694030000000001,0.00016947701886792455,0.00016978969811320762,0.00017060155555555559,0.00017165400000000003,0.000171953,0.000172571,0.0001727571754385964,0.00017300053488372095,0.00017562030909090907,0.0001759094,0.00017614399999999999,0.00018153900000000001],"84":[3.1168e-07,3.1180000000000003e-07,3.1193999999999997e-07,3.1199999999999999e-07,3.1223000000000004e-07,3.1279000000000004e-07,3.1322000000000005e-07,3.1327e-07,3.1572000000000002e-07,3.1617e-07,3.1647999999999999e-07,3.1680999999999999e-07,3.1731999999999999e-07,3.1748999999999997e-07,3.1751999999999995e-07,3.1803e-07,3.2243999999999997e-07,3.2431000000000002e-07,3.3094999999999998e-07,3.3297000000000005e-07],"3276800":[0.0185850075,0.018621863999999998,0.018631000000000002,0.018679768999999999,0.018826990500000002,0.018926468000000002,0.018933206500000001,0.018983205999999999,0.019001727500000006,0.01902765,0.0190605015,0.019425673499999997,0.019444678999999999,0.019466295000000002,0.019479670500000001,0.019536471999999999,0.019618125,0.019813098999999994,0.019874084,0.020068938000000001],"55296":[0.00014729400000000002,0.00014830600000000001,0.000148419,0.00014989299999999996,0.00015057100000000001,0.00015144259999999994,0.0001529705,0.00015416,0.00015417560000000001,0.00015597699999999999,0.00015670499999999998,0.00015752716666666666,0.00015796735999999999,0.00015943866071428569,0.00015976357377049183,0.0001604678979591837,0.0001628740172413793,0.00016291616981132072,0.00016321725000000004,0.00016776553448275862],"688128":[0.001896612999999999,0.0019530105,0.0019846759999999999,0.001986397999999999,0.0019994182500000001,0.0020033920000000005,0.0020036189999999995,0.0020070807500000001,0.0020197030000000007,0.0020264692499999994,0.0020274150000000003,0.0020368560000000001,0.0020452167499999999,0.0020475907499999998,0.0020487265,0.0020679639999999998,0.0020719319999999999,0.0021898439999999998,0.0022071130000000001,0.00231998925],"8192":[2.1463000000000001e-05,2.1475e-05,2.1766000000000001e-05,2.2574148148148149e-05,2.263762e-05,2.2926440000000001e-05,2.3140489999999999e-05,2.3197439999999999e-05,2.3211739999999999e-05,2.3221470000000002e-05,2.3328789999999999e-05,2.3399060000000002e-05,2.3429910000000001e-05,2.3626789999999998e-05,2.3683999999999999e-05,2.373056e-05,2.4004159999999997e-05,2.4080999999999999e-05,2.4183249999999999e-05,2.4975119999999999e-05],"10240":[2.6550000000000002e-05,2.7036e-05,2.7287000000000001e-05,2.8163575757575759e-05,2.8215999999999999e-05,2.85825e-05,2.8582742857142856e-05,2.8664659999999997e-05,2.8956670000000001e-05,2.901075e-05,2.910316e-05,2.9120129032258066e-05,2.921034e-05,2.9245299999999999e-05,2.9306e-05,2.9313619999999998e-05,2.9357906250000001e-05,2.9585000000000002e-05,3.0111562499999999e-05,3.014127e-05],"15872":[4.1196000000000003e-05,4.22575e-05,4.3371105263157893e-05,4.4066789473684209e-05,4.4289000000000002e-05,4.4503736842105266e-05,4.4508000000000001e-05,4.4792779999999994e-05,4.4829833333333329e-05,4.5202705882352941e-05,4.5411059999999993e-05,4.5735410000000003e-05,4.5902629999999999e-05,4.6019000000000001e-05,4.6063980000000003e-05,4.6180730000000005e-05,4.6188799999999994e-05,4.629447e-05,4.6386999999999995e-05,4.6949571428571427e-05],"92":[3.2842000000000003e-07,3.2935000000000002e-07,3.2938999999999996e-07,3.2990000000000001e-07,3.3022000000000005e-07,3.3028999999999998e-07,3.3037000000000001e-07,3.3038999999999998e-07,3.3083999999999996e-07,3.319e-07,3.3244000000000003e-07,3.3259999999999995e-07,3.3368999999999997e-07,3.4480999999999998e-07,3.4639999999999998e-07,3.4975000000000002e-07,3.4976999999999999e-07,3.5018999999999999e-07,3.6292999999999998e-07,3.6770000000000004e-07],"26624":[6.7706000000000005e-05,6.7996000000000004e-05,6.8628999999999996e-05,7.1564500000000002e-05,7.1872999999999994e-05,7.1872999999999994e-05,7.1941500000000002e-05,7.2540999999999995e-05,7.4046161290322585e-05,7.5167560000000006e-05,7.5196529999999999e-05,7.5304919999999993e-05,7.5570070000000001e-05,7.5852580000000005e-05,7.5859659999999999e-05,7.6502520000000003e-05,7.6538999999999993e-05,7.6555440000000005e-05,7.6772499999999997e-05,7.8919960000000007e-05],"1792":[4.7748235294117644e-06,4.7954599999999998e-06,4.7991200000000001e-06,4.8089800000000003e-06,4.8650300000000004e-06,4.8697299999999997e-06,4.8721249999999995e-06,4.8809000000000001e-06,4.8949400000000006e-06,4.9023399999999999e-06,4.9263800000000003e-06,4.9369199999999998e-06,4.9522200000000003e-06,4.9523500000000001e-06,4.9588900000000002e-06,4.9720799999999997e-06,4.9899999999999997e-06,5.0077100000000002e-06,5.0919299999999999e-06,5.1530700000000003e-06],"11776":[3.0818999999999997e-05,3.0831999999999999e-05,3.1432e-05,3.2387e-05,3.2458e-05,3.2634140000000003e-05,3.2853074468085106e-05,3.2876666666666663e-05,3.2916000000000001e-05,3.3181500000000001e-05,3.3395655555555554e-05,3.3552710000000002e-05,3.3614e-05,3.3734130000000002e-05,3.3855376470588238e-05,3.388648e-05,3.4453579999999997e-05,3.4942739999999996e-05,3.5043320000000005e-05,3.6091999999999999e-05],"2944":[7.8599999999999993e-06,7.875e-06,8.1113499999999999e-06,8.1745600000000002e-06,8.1777999999999999e-06,8.1799399999999988e-06,8.1919800000000008e-06,8.2303800000000003e-06,8.2950700000000009e-06,8.3662499999999997e-06,8.372269999999999e-06,8.426300000000001e-06,8.4677000000000003e-06,8.5099800000000001e-06,8.5299100000000001e-06,8.6709099999999993e-06,8.79888e-06,8.8951099999999996e-06,8.9298500000000006e-06,8.9344000000000004e-06],"88":[3.2054000000000004e-07,3.2072000000000003e-07,3.2104000000000002e-07,3.2141999999999998e-07,3.2172000000000005e-07,3.2206000000000001e-07,3.2218000000000004e-07,3.2252000000000001e-07,3.2252127659574472e-07,3.227e-07,3.2284e-07,3.2338000000000003e-07,3.2435999999999997e-07,3.2487000000000002e-07,3.2567000000000003e-07,3.3588999999999997e-07,3.3588999999999997e-07,3.3608000000000003e-07,3.3637000000000004e-07,3.5168999999999999e-07],"22528":[5.8644000000000003e-05,5.9490000000000001e-05,6.0899000000000001e-05,6.1115e-05,6.1746000000000001e-05,6.2212999999999995e-05,6.2365666666666672e-05,6.2440999999999994e-05,6.2725790000000008e-05,6.2967249999999999e-05,6.2975860000000005e-05,6.3434590000000003e-05,6.360207547169811e-05,6.3746641509433962e-05,6.4870999999999996e-05,6.5226839999999993e-05,6.5342969999999999e-05,6.563301960784314e-05,6.5753431372549029e-05,6.7241212765957443e-05],"1245184":[0.0065308370000000003,0.0065670190000000003,0.006598675,0.00661811,0.0066186369999999984,0.0066315580000000001,0.0066459130000000033,0.0066462970000000007,0.0066820589999999997,0.0067277169999999968,0.0067719319999999996,0.006774085,0.0067988950000000018,0.0068234529999999984,0.0068410749999999994,0.0068614790000000011,0.0069633260000000041,0.0071226689999999999,0.0073036239999999999,0.0074466690000000004],"15728640":[0.082320597999999981,0.082727242500000006,0.082974969500000051,0.083043172999999998,0.083535530999999996,0.084281434000000016,0.085446853000000031,0.085577634999999957,0.089154945500000013,0.089737801000000006,0.090151064000000003,0.09018038099999999,0.091151780000000002,0.09263485149999999,0.093373103499999985,0.094317430500000007,0.1014945725,0.10361474699999999,0.107931889,0.1124638585],"96":[3.4369999999999999e-07,3.4409999999999996e-07,3.4428999999999997e-07,3.4437999999999996e-07,3.4455e-07,3.4461000000000001e-07,3.4462000000000002e-07,3.4469e-07,3.4480999999999998e-07,3.4507000000000001e-07,3.4560000000000002e-07,3.4601000000000001e-07,3.4620999999999997e-07,3.4681999999999998e-07,3.4736000000000001e-07,3.4737999999999998e-07,3.4872000000000002e-07,3.5936999999999997e-07,3.6047999999999996e-07,3.7879000000000002e-07],"1984":[5.4651200000000001e-06,5.507e-06,5.5203442622950819e-06,5.5235900000000001e-06,5.5341299999999996e-06,5.53428e-06,5.53468e-06,5.5518400000000002e-06,5.5576099999999998e-06,5.5717699999999993e-06,5.6064600000000002e-06,5.665e-06,5.6745500000000006e-06,5.67832e-06,5.6822199999999993e-06,5.7098599999999999e-06,5.77458e-06,5.7924200000000004e-06,5.8662099999999997e-06,5.8862499999999998e-06],"139264":[0.00038255,0.00038535749999999986,0.00038691400000000003,0.000389009,0.00039027699999999991,0.00039100449999999993,0.00039385599999999999,0.00039642300000000008,0.00039648,0.00039716999999999997,0.00039832991666666667,0.00040083499999999999,0.00040111200000000002,0.000401899,0.00040281121739130438,0.00040461699999999991,0.00040704399999999996,0.000420615,0.00043884700000000002,0.00044924200000000003],"475136":[0.001282619,0.0012874290000000001,0.001318888,0.001321418,0.0013217050000000005,0.0013287623333333334,0.0013379314285714289,0.0013473020000000003,0.001352874,0.0013659915714285713,0.0013680275000000001,0.001377545,0.0013785368571428572,0.0013812941428571429,0.0013833560000000003,0.001384439857142857,0.0013910000000000001,0.0013914938333333331,0.001395489,0.0014057520000000001],"13631488":[0.070809854000000019,0.072984606000000007,0.07371912500000001,0.073761500000000008,0.073799817999999975,0.074749759000000027,0.074967787999999994,0.075474486999999993,0.076286994000000025,0.076816215999999965,0.077544687999999987,0.077861555999999971,0.0779143375,0.080859262000000001,0.081394982000000005,0.082311049500000052,0.083185834,0.083391450999999991,0.096888532499999985,0.10070339699999997],"416":[1.2530599999999999e-06,1.2643666666666667e-06,1.26484e-06,1.26494e-06,1.2661700000000001e-06,1.2679200000000001e-06,1.2683799999999999e-06,1.26893e-06,1.2693200000000002e-06,1.2700869565217391e-06,1.27153e-06,1.2764300000000002e-06,1.2765199999999999e-06,1.2772700000000001e-06,1.27825e-06,1.2829900000000002e-06,1.3483300000000001e-06,1.3895899999999999e-06,1.4102799999999999e-06,1.4996500000000001e-06],"928":[2.6751428571428571e-06,2.6782800000000001e-06,2.67875e-06,2.6787600000000003e-06,2.6835900000000002e-06,2.6846200000000002e-06,2.6915e-06,2.6915499999999997e-06,2.6959299999999999e-06,2.70936e-06,2.7150100000000001e-06,2.7197e-06,2.7305999999999997e-06,2.76174e-06,2.7838100000000002e-06,2.78862e-06,2.7939000000000001e-06,2.8210000000000002e-06,2.8501200000000002e-06,2.8990800000000002e-06],"512":[1.4528699999999999e-06,1.4529500000000002e-06,1.4541399999999998e-06,1.46389e-06,1.48254e-06,1.4830799999999999e-06,1.48474e-06,1.48501e-06,1.4864500000000002e-06,1.4874899999999999e-06,1.48915e-06,1.49212e-06,1.4925399999999999e-06,1.4959000000000002e-06,1.4995199999999999e-06,1.5528e-06,1.5797300000000001e-06,1.6013199999999999e-06,1.630625e-06,1.7577599999999999e-06],"18432":[5.1796662921348319e-05,5.1975290000000003e-05,5.2107000000000001e-05,5.2247229999999999e-05,5.2289035294117652e-05,5.2404999999999997e-05,5.2738999999999998e-05,5.2987190000000006e-05,5.301781e-05,5.3074649999999998e-05,5.3175640000000002e-05,5.3183176470588233e-05,5.3253749999999998e-05,5.3328500000000003e-05,5.3347022988505748e-05,5.3561420000000007e-05,5.3716433734939754e-05,5.4734539999999999e-05,5.4873999999999997e-05,5.8846238095238091e-05],"16777216":[0.087985710999999994,0.088349311999999958,0.088518869,0.089037818499999977,0.089747038000000001,0.089749188000000008,0.090003481999999996,0.090410951999999975,0.09046357549999999,0.090824559499999999,0.092418624999999976,0.094674040000000001,0.0947950865,0.097029255500000036,0.097251635999999961,0.10220591,0.10397105650000001,0.10596501799999999,0.11523397699999999,0.120337474],"9728":[2.6784999999999999e-05,2.6993999999999999e-05,2.7071040000000002e-05,2.7240939999999998e-05,2.7257e-05,2.736645e-05,2.738341e-05,2.7384110000000002e-05,2.7441999999999999e-05,2.7456070000000001e-05,2.7495999999999999e-05,2.7626460000000001e-05,2.7761452380952381e-05,2.7963049999999996e-05,2.8010000000000001e-05,2.8137439999999999e-05,2.8311e-05,2.8550039999999999e-05,2.8718329999999998e-05,3.0179419999999999e-05],"1769472":[0.0079770340000000026,0.0081214300000000007,0.0081797399999999996,0.0082002630000000028,0.0082669809999999996,0.0082768609999999999,0.0082882279999999999,0.0082956359999999986,0.0083083459999999977,0.0083333769999999995,0.0083337790000000012,0.0083597159999999997,0.0083887149999999997,0.0083969270000000002,0.008465549999999997,0.0086049660000000004,0.0086455689999999988,0.0086540100000000002,0.0086699099999999994,0.0087019560000000003],"1703936":[0.0078015689999999995,0.0078280369999999995,0.0078374909999999985,0.0078770619999999972,0.0078925470000000032,0.0079601209999999971,0.0080233969999999981,0.0080769049999999971,0.0081097219999999998,0.0081586600000000016,0.0081679319999999993,0.0081711919999999973,0.0081794610000000007,0.0081888619999999999,0.0081936119999999977,0.0082087510000000002,0.0083834500000000006,0.0084536255000000043,0.0084770560000000002,0.0087818589999999995],"2048":[5.5482499999999998e-06,5.6119999999999998e-06,5.6325300000000003e-06,5.6881300000000002e-06,5.6881800000000003e-06,5.6934300000000008e-06,5.7590000000000003e-06,5.7694299999999997e-06,5.7906099999999999e-06,5.8428500000000003e-06,5.8438100000000006e-06,5.9294399999999998e-06,6.0075499999999998e-06,6.0535199999999994e-06,6.0893299999999999e-06,6.1381599999999997e-06,6.1981666666666668e-06,6.19856e-06,6.2492199999999999e-06,6.5335999999999996e-06],"14336":[3.7391999999999997e-05,3.8578000000000002e-05,3.8926e-05,3.9229613636363639e-05,3.9258000000000003e-05,3.9388000000000003e-05,3.9814290000000002e-05,3.9863153846153849e-05,4.0147020000000002e-05,4.0285929999999995e-05,4.0468520000000002e-05,4.0632849999999998e-05,4.0665570000000004e-05,4.0999879999999999e-05,4.1222070000000004e-05,4.1658759999999999e-05,4.1751999999999996e-05,4.2052999999999999e-05,4.3802349999999996e-05,4.4171500000000002e-05],"448":[1.32493e-06,1.3313100000000001e-06,1.3356300000000002e-06,1.33774e-06,1.3380799999999998e-06,1.33876e-06,1.3390900000000002e-06,1.3395499999999999e-06,1.3395799999999999e-06,1.3428400000000001e-06,1.34532e-06,1.3456000000000001e-06,1.35284e-06,1.36661e-06,1.3684600000000001e-06,1.38074e-06,1.3902399999999999e-06,1.4155400000000001e-06,1.4198999999999999e-06,1.4220500000000002e-06],"5505024":[0.0306256905,0.03126312349999999,0.031294124499999999,0.031295189000000001,0.031512153000000001,0.03154199349999999,0.031589095999999983,0.031718951000000009,0.031738464500000001,0.03192524649999999,0.03195899549999999,0.032004343000000011,0.032004751999999984,0.03201597199999999,0.032019304500000012,0.032394766000000005,0.03249321949999999,0.032552333999999988,0.032583691000000012,0.034748062500000017],"544":[1.52606e-06,1.52951e-06,1.53135e-06,1.53146e-06,1.5326500000000001e-06,1.5416e-06,1.5527e-06,1.55383e-06,1.5555199999999999e-06,1.5556200000000001e-06,1.5575900000000001e-06,1.5619099999999999e-06,1.5826399999999999e-06,1.5893600000000001e-06,1.60041e-06,1.6010199999999999e-06,1.6043e-06,1.6049099999999999e-06,1.6089599999999999e-06,1.61204e-06],"221184":[0.00059354099999999984,0.00061441000000000013,0.00062219199999999993,0.00062539926666666662,0.00062708333333333344,0.0006284609285714314,0.00062911800000000002,0.00063482999999999996,0.0006390899999999996,0.00064077128571428583,0.0006430184999999996,0.00064525006666666675,0.00064525607142857148,0.00064553571428571427,0.00064626199999999999,0.00064887171428571432,0.00065171392857142868,0.00065258099999999984,0.00066344928571428576,0.00067007557142857136],"90112":[0.00023510999999999996,0.00023846499999999999,0.00024719299999999994,0.00025088599999999997,0.00025219549999999999,0.00025357,0.00025454900000000002,0.000257633,0.00025801802702702704,0.00025821070588235288,0.00025850436842105262,0.00025859199999999998,0.000258996,0.00025902688888888886,0.00025950700000000008,0.00026056640000000003,0.00026178077777777787,0.00026684262499999999,0.00026858505555555571,0.00027063049999999985],"640":[1.74262e-06,1.7662647058823531e-06,1.76842e-06,1.77115e-06,1.77336e-06,1.77386e-06,1.77422e-06,1.7746999999999999e-06,1.77632e-06,1.77725e-06,1.7859599999999999e-06,1.7901799999999999e-06,1.7979599999999999e-06,1.8490800000000001e-06,1.8507600000000001e-06,1.8515500000000001e-06,1.85273e-06,1.8543600000000001e-06,1.85796e-06,1.9113400000000001e-06],"12800":[3.4639333333333332e-05,3.4733000000000001e-05,3.4777000000000003e-05,3.5146750000000004e-05,3.5420313432835821e-05,3.5574030000000004e-05,3.5701100000000003e-05,3.5797619999999999e-05,3.5946630000000001e-05,3.6209559999999997e-05,3.6254999999999998e-05,3.638338e-05,3.6389310000000001e-05,3.6436500000000003e-05,3.650676056338028e-05,3.6551799999999998e-05,3.6996970000000003e-05,3.7024129999999999e-05,3.726156e-05,3.7412430000000003e-05],"262144":[0.00070083099999999996,0.00073412899999999981,0.00073559561538461536,0.00073986899999999999,0.00074027999999999995,0.000740283,0.00074224100000000015,0.00074412014285714281,0.00074553300000002043,0.00075027684615384623,0.00075040100000000026,0.00075945599999999982,0.0007619715833333332,0.0007646852727272726,0.0007682349,0.00077047200000000034,0.00077817399999999997,0.00078248999999999994,0.00084022154545454507,0.00084877899999999981],"589824":[0.001670571,0.00168424,0.0016861070000000005,0.0016935780000000001,0.0016989242000000008,0.0017017066000000001,0.001708834,0.0017096752,0.0017125622,0.0017125949999999995,0.0017197522,0.0017318260000000001,0.0017324917999999995,0.0017439479999999991,0.0017441516,0.0017517419999999999,0.0017577496000000005,0.0017578840000000001,0.001761929,0.001783186],"884736":[0.0025096529999999997,0.002528330666666666,0.0025298696666666664,0.002574448,0.0025782730000000012,0.002582455,0.0025916816666666669,0.0025953036666666674,0.0026043209999999989,0.0026085863333333331,0.002614861,0.0026251760000000008,0.002635386,0.0026387134999999989,0.0026435883333333333,0.002647225,0.002654806,0.0026979166666666666,0.0027163079999999997,0.0027206875],"6144":[1.6039e-05,1.6154000000000002e-05,1.6362e-05,1.6898732394366196e-05,1.6998560000000001e-05,1.7191739999999999e-05,1.724299e-05,1.7361720000000002e-05,1.7481551020408166e-05,1.748225e-05,1.749092e-05,1.7524405405405406e-05,1.7567e-05,1.7583970000000001e-05,1.7672698113207548e-05,1.777503e-05,1.7875276595744681e-05,1.794768e-05,1.8133509999999999e-05,1.8274000000000002e-05],"1088":[3.0321379310344825e-06,3.0324899999999999e-06,3.04776e-06,3.0493499999999999e-06,3.0599600000000001e-06,3.07975e-06,3.0934899999999998e-06,3.0962699999999999e-06,3.0967700000000002e-06,3.1117599999999997e-06,3.1134999999999999e-06,3.1197299999999999e-06,3.1216099999999997e-06,3.1227199999999999e-06,3.1262899999999998e-06,3.13219e-06,3.1544285714285714e-06,3.1703299999999999e-06,3.19723e-06,3.27052e-06],"576":[1.59824e-06,1.6014299999999998e-06,1.61908e-06,1.62514e-06,1.6268399999999999e-06,1.63081e-06,1.6314500000000001e-06,1.6363900000000001e-06,1.6364900000000001e-06,1.6385400000000001e-06,1.6400500000000001e-06,1.64742e-06,1.6746400000000001e-06,1.7015899999999999e-06,1.7076600000000001e-06,1.7160600000000001e-06,1.7220100000000001e-06,1.7230699999999999e-06,1.7387300000000002e-06,1.7961100000000001e-06],"160":[4.8737e-07,4.8749999999999999e-07,4.8836999999999997e-07,4.8866000000000004e-07,4.8866999999999999e-07,4.8976000000000001e-07,4.8988000000000004e-07,4.9036000000000006e-07,4.9051000000000007e-07,4.9097499999999999e-07,4.9340000000000001e-07,5.0984999999999998e-07,5.1017999999999998e-07,5.1109000000000001e-07,5.1134999999999998e-07,5.1157999999999998e-07,5.1241999999999998e-07,5.3619999999999994e-07,5.3659999999999997e-07,5.6258999999999996e-07],"672":[1.8127400000000001e-06,1.8133999999999999e-06,1.8138400000000002e-06,1.8158399999999999e-06,1.8216000000000001e-06,1.8364400000000002e-06,1.8414000000000001e-06,1.8435e-06,1.8442299999999998e-06,1.8446099999999999e-06,1.8461e-06,1.86198e-06,1.8632100000000001e-06,1.8675899999999999e-06,1.86962e-06,1.9029100000000001e-06,1.9050800000000001e-06,1.91898e-06,1.9347099999999997e-06,2.0194399999999999e-06],"8912896":[0.04669902950000001,0.046701743000000011,0.0467600065,0.046894168000000021,0.046975708499999977,0.047204919999999997,0.047424343000000001,0.047454209000000018,0.047564720000000019,0.047589166500000016,0.047650548000000001,0.047935365000000001,0.048103549499999981,0.048636037999999999,0.04887262349999999,0.049259053000000011,0.0494238735,0.051416152,0.051483017499999985,0.060688451000000018],"100":[3.5232999999999998e-07,3.5260999999999998e-07,3.5274999999999998e-07,3.5293999999999998e-07,3.5378999999999999e-07,3.5426999999999996e-07,3.5429999999999999e-07,3.5497999999999997e-07,3.5512000000000002e-07,3.5513999999999999e-07,3.552e-07,3.5524e-07,3.5593000000000004e-07,3.5599999999999996e-07,3.5605000000000002e-07,3.5713999999999998e-07,3.5738000000000004e-07,3.7021999999999999e-07,3.7144999999999995e-07,3.8865999999999999e-07],"507904":[0.001389234,0.0014404995,0.0014419788333333333,0.0014448631666666664,0.0014654928333333334,0.0014676685000000003,0.001470374,0.0014726610000000001,0.0014782918333333334,0.001478983166666666,0.0014907030000000001,0.001492941,0.001496086,0.0014972318333333335,0.0015005183333333329,0.001502843,0.0015049358333333335,0.0015068913333333336,0.001526215333333333,0.0015932213333333337],"3840":[1.00375e-05,1.0548910000000001e-05,1.0563e-05,1.0587666666666667e-05,1.067422e-05,1.0718360000000001e-05,1.0767540000000001e-05,1.081044e-05,1.0832649999999999e-05,1.0964545454545455e-05,1.10405e-05,1.1095359999999999e-05,1.1200579999999999e-05,1.1229899999999999e-05,1.127898e-05,1.1321669999999998e-05,1.145135e-05,1.1863539999999999e-05,1.2077e-05,1.2128019999999999e-05],"192":[5.5861e-07,5.5871e-07,5.5903000000000005e-07,5.5995000000000003e-07,5.6026999999999997e-07,5.6034e-07,5.6039999999999996e-07,5.6059000000000002e-07,5.6276999999999995e-07,5.6280000000000004e-07,5.6288000000000002e-07,5.6293000000000003e-07,5.6326999999999999e-07,5.6384000000000005e-07,5.6408999999999996e-07,5.8553999999999999e-07,5.8604000000000003e-07,5.8770999999999996e-07,5.8991999999999998e-07,6.1341999999999994e-07],"376832":[0.0010525549999999995,0.001068189,0.0010697345000000001,0.0010764814444444441,0.0010769760000000001,0.0010798119999999999,0.0010815318888888887,0.0010893725555555559,0.0010908156249999999,0.0010952944444444443,0.001096756375,0.0011024668749999998,0.0011043143333333335,0.00110457,0.001107266,0.0011079465,0.00110927025,0.00111792975,0.0011265035,0.0012205024285714284],"98304":[0.00025747600000000013,0.00026295999999999991,0.000269473,0.00026978400000000002,0.000272568,0.00027424299999999992,0.00027500150000000009,0.00027709540000000002,0.00027862900000000002,0.00027875948571428575,0.00028007999999999999,0.00028050500000000001,0.00028134299999999998,0.00028160499999999998,0.00028200594117647063,0.00028202499999999998,0.00028430299999999986,0.00028695800000000008,0.00028759677419354829,0.00030160500000000015],"5376":[1.4164e-05,1.4297000000000001e-05,1.439462162162162e-05,1.4627972222222222e-05,1.489e-05,1.4898009999999999e-05,1.4902000000000001e-05,1.5010349999999999e-05,1.5113530000000001e-05,1.514643e-05,1.518167e-05,1.5279449999999998e-05,1.5281639999999999e-05,1.530491e-05,1.542899e-05,1.54333e-05,1.5603579999999999e-05,1.563197e-05,1.5749000000000001e-05,1.6076e-05],"94208":[0.00024583100000000001,0.0002564899999999999,0.00025872799999999995,0.00026336000000000013,0.00026480299999999998,0.00026481474999999987,0.00026660743749999985,0.00026701000000000009,0.00026801266666666673,0.00026802841666666668,0.00026855261764705885,0.00026908499999999991,0.0002692853333333334,0.00027023677777777782,0.00027218400000000008,0.00027442299999999993,0.00027567272727272726,0.00027686322857142852,0.000287624,0.00031042654838709668],"81920":[0.0002165755,0.00021936500000000009,0.00021997,0.00022924499999999996,0.00022927249999999999,0.00023012999999999999,0.00023043431707317079,0.000234279,0.00023439666666666658,0.00023484600000000001,0.00023557999999999999,0.00023707599999999999,0.0002372144358974359,0.000237531,0.00023763700000000002,0.000238106,0.00023828400000000001,0.00023864133333333337,0.00024146404878048767,0.00024187347500000001],"3407872":[0.017589273999999995,0.017962812500000001,0.019095241000000002,0.019113263999999998,0.019147912,0.019378820000000001,0.019411024500000002,0.019454029499999994,0.019478955999999999,0.019519984000000001,0.019526630499999999,0.019530172499999998,0.0195457445,0.019813251,0.020028695000000006,0.020089820000000001,0.020131755500000001,0.020183571500000001,0.020318913000000001,0.0240374805],"104":[3.6180000000000002e-07,3.6204000000000003e-07,3.6215e-07,3.6217000000000002e-07,3.6226000000000002e-07,3.6229999999999996e-07,3.6245000000000002e-07,3.6245999999999998e-07,3.6251999999999999e-07,3.6279999999999999e-07,3.6283999999999999e-07,3.636e-07,3.6584e-07,3.6601999999999999e-07,3.6941999999999998e-07,3.7957e-07,3.8121000000000001e-07,3.8130000000000001e-07,4.4206999999999999e-07,4.4271999999999998e-07],"122880":[0.00033407800000000002,0.00033522800000000002,0.00034012199999999989,0.00034289199999999991,0.00034467100000000012,0.000348148,0.00034851099999999986,0.00035048699999999991,0.00035100100000000009,0.0003510202500000001,0.00035124949999999999,0.00035145266666666679,0.0003529405,0.0003536650740740741,0.0003557954999999999,0.00035975734615384625,0.00036145240740740735,0.00036326462962962965,0.00036496687499999985,0.00036831400000000001],"200":[5.7624999999999999e-07,5.7650000000000001e-07,5.7657000000000003e-07,5.7751000000000004e-07,5.7752e-07,5.7812000000000004e-07,5.7848999999999999e-07,5.7851999999999997e-07,5.7858000000000004e-07,5.7874999999999996e-07,5.7902000000000001e-07,5.7930000000000001e-07,5.7948999999999996e-07,5.7960999999999999e-07,5.7964000000000007e-07,5.7967000000000005e-07,5.8095999999999998e-07,6.0470999999999997e-07,6.0938000000000002e-07,6.5504000000000002e-07],"163840":[0.00044700300000000018,0.00045100499999999998,0.00045722999999999998,0.00045973899999999997,0.000461201,0.00046246699999999999,0.00046470999999999996,0.0004657583333333333,0.00046872199999999981,0.000471912,0.00047455699999999975,0.000476594,0.0004794663,0.00048085673333333345,0.00048225199999999985,0.00048237294444444437,0.00048242099999999997,0.00048398666666666669,0.00049525450000000026,0.00051410283333333333],"4063232":[0.020212863999999997,0.020570830999999998,0.020849867000000001,0.021039687999999994,0.021050842,0.0210848075,0.021088493999999999,0.021187523,0.021273894499999998,0.021288995000000005,0.0213209805,0.02144829899999999,0.021502949499999986,0.021529528999999999,0.021601633999999998,0.021809303999999998,0.02206441,0.022368746000000002,0.0226031475,0.0226179515],"5767168":[0.030643419000000015,0.0319882035,0.032248700000000012,0.032248852500000015,0.03241984500000001,0.03244839749999999,0.032519819000000019,0.032549868999999988,0.032669015999999981,0.032694662999999999,0.032751132499999988,0.032988588999999999,0.033105866000000005,0.033301818500000024,0.033636041999999998,0.033924109500000001,0.0339922395,0.03424500350000001,0.034545019500000017,0.036096614000000013],"12582912":[0.065312512000000003,0.065829114999999966,0.066287221499999965,0.066458700999999981,0.066617906000000032,0.066832164999999999,0.067660132499999984,0.067926189999999997,0.068051757000000018,0.069319206999999966,0.069612837999999996,0.071499967499999997,0.071910612500000012,0.072441166000000001,0.072575061999999996,0.074316365000000023,0.075333087499999979,0.07971258599999996,0.086903475999999993,0.090803856999999974],"1600":[4.3512099999999998e-06,4.3558200000000004e-06,4.3615200000000002e-06,4.3643700000000005e-06,4.36906e-06,4.3895899999999996e-06,4.4042400000000004e-06,4.4213700000000002e-06,4.4282199999999999e-06,4.4329200000000001e-06,4.4614299999999997e-06,4.4790800000000003e-06,4.4807000000000001e-06,4.4812500000000005e-06,4.5226200000000002e-06,4.5577499999999997e-06,4.6290000000000001e-06,4.6350700000000003e-06,4.6391999999999996e-06,4.6647499999999997e-06],"136":[4.3263000000000003e-07,4.3377999999999996e-07,4.3383000000000001e-07,4.3399000000000004e-07,4.3408999999999999e-07,4.3473000000000003e-07,4.3482000000000003e-07,4.3482999999999998e-07,4.3498000000000005e-07,4.3585999999999999e-07,4.3612999999999998e-07,4.3659999999999998e-07,4.3841000000000002e-07,4.3870999999999999e-07,4.5502000000000001e-07,4.6310999999999997e-07,4.7574e-07,5.1449000000000005e-07,5.3886e-07,7.6746000000000002e-07],"232":[6.4790999999999993e-07,6.4844999999999991e-07,6.4942e-07,6.4986000000000008e-07,6.5067999999999995e-07,6.525999999999999e-07,6.5260999999999997e-07,6.529600000000001e-07,6.5354000000000001e-07,6.5364999999999998e-07,6.5387000000000002e-07,6.5487999999999995e-07,6.8024999999999997e-07,6.8039000000000002e-07,6.8065999999999996e-07,6.8242000000000005e-07,7.1353999999999997e-07,7.3218000000000004e-07,7.5729999999999993e-07,7.6642e-07],"7077888":[0.038560188000000002,0.038647806,0.038813892000000003,0.038887433999999999,0.039031191999999999,0.039091208500000016,0.039143771000000015,0.039317693000000001,0.039318231500000009,0.039379976999999997,0.039394720000000001,0.039407145999999997,0.039439072499999991,0.039441997500000013,0.039552658999999997,0.040149610999999988,0.040546118999999992,0.041982581999999997,0.042049263000000003,0.042534484000000004],"86016":[0.000223756,0.000236426,0.00023947200000000004,0.00023964199999999998,0.00024106999999999997,0.000243384,0.00024370700000000004,0.00024530400000000001,0.00024536799999999999,0.00024557058974358971,0.0002460998,0.00024729999999999999,0.00024877200000000008,0.00025243648648648638,0.00025296999999999999,0.00025386168421052632,0.00025404434210526315,0.00025868100000000008,0.00025986230555555555,0.00026635499999999991],"31744":[8.5657333333333331e-05,8.6303800000000005e-05,8.6532400000000005e-05,8.9176000000000001e-05,8.9809857142857146e-05,9.0373375000000003e-05,9.0480285714285728e-05,9.0803999999999993e-05,9.0860999999999996e-05,9.1092739130434783e-05,9.1161499999999998e-05,9.1332571428571425e-05,9.1589219999999995e-05,9.2290333333333333e-05,9.2323839999999995e-05,9.2842195652173909e-05,9.3243960000000001e-05,9.3805000000000001e-05,9.4156440000000001e-05,9.4611806122448991e-05],"168":[5.0437000000000001e-07,5.0442999999999997e-07,5.0451000000000006e-07,5.0493999999999997e-07,5.0637000000000005e-07,5.0680000000000006e-07,5.0691000000000003e-07,5.0758999999999995e-07,5.0793999999999998e-07,5.0800000000000005e-07,5.0822999999999994e-07,5.0896999999999993e-07,5.0931e-07,5.1002000000000001e-07,5.1044999999999992e-07,5.1261999999999999e-07,5.2931999999999998e-07,5.3112999999999997e-07,5.3122000000000001e-07,5.3400999999999995e-07],"622592":[0.001770871,0.0017751334000000001,0.0017846618000000008,0.0017904029999999999,0.0018008301999999994,0.001802405,0.0018028337999999998,0.0018050290000000001,0.0018081678000000001,0.0018098328,0.0018113439999999999,0.001816612,0.0018234276000000001,0.0018252506000000009,0.0018316366,0.0018341135999999998,0.0018360586000000004,0.0018383549999999999,0.0018750389999999998,0.001923541],"108":[3.7042e-07,3.7067000000000002e-07,3.7072000000000003e-07,3.7110999999999999e-07,3.7129000000000004e-07,3.7132999999999998e-07,3.7146000000000002e-07,3.7146000000000002e-07,3.7160000000000002e-07,3.7184999999999998e-07,3.7187999999999997e-07,3.7266e-07,3.7326999999999995e-07,3.7348000000000003e-07,3.7360999999999997e-07,3.7361999999999998e-07,3.7399999999999999e-07,3.8953999999999998e-07,3.9045000000000001e-07,4.5605999999999997e-07],"327680":[0.000892682,0.000903479,0.0009365389999999999,0.00093743050000000033,0.0009378539999999999,0.00093845309999999983,0.00094006199999999997,0.00094469200000000012,0.00094758319999999985,0.00094791189999999994,0.00094858699999999965,0.00094875900000000008,0.00095615469999999999,0.00095667600000000005,0.00095801888888888864,0.00096073719999999999,0.00096707380000000032,0.00098233733333333339,0.001000470444444444,0.0010102730000000001],"2176":[5.8866507936507936e-06,5.9444299999999998e-06,5.9681000000000005e-06,5.9889999999999997e-06,6.0080699999999997e-06,6.0138599999999999e-06,6.0210999999999998e-06,6.0347199999999997e-06,6.07887e-06,6.0941700000000005e-06,6.1099600000000005e-06,6.1181199999999996e-06,6.12384e-06,6.1756200000000003e-06,6.2378699999999996e-06,6.2553200000000006e-06,6.2620000000000004e-06,6.3013399999999995e-06,6.3535299999999998e-06,6.6220000000000003e-06],"3328":[8.8459999999999997e-06,9.0506666666666662e-06,9.2144700000000009e-06,9.2247826086956527e-06,9.2345700000000009e-06,9.3604299999999998e-06,9.4065000000000005e-06,9.4154507042253521e-06,9.4180000000000003e-06,9.4664699999999995e-06,9.4808999999999993e-06,9.4890000000000001e-06,9.5842300000000009e-06,9.825330000000001e-06,9.8501900000000003e-06,9.9857e-06,1.014967e-05,1.0373e-05,1.0591000000000001e-05,1.062775e-05],"1":[1.2199e-07,1.2202999999999999e-07,1.2211e-07,1.2211e-07,1.2249999999999999e-07,1.2291999999999999e-07,1.2318e-07,1.2321999999999999e-07,1.2603e-07,1.2604999999999999e-07,1.2606999999999999e-07,1.2767e-07,1.2772999999999999e-07,1.2848e-07,1.2901000000000002e-07,1.3433000000000001e-07,1.3441e-07,1.3489000000000001e-07,1.3491000000000001e-07,1.3493999999999999e-07],"2":[1.2574000000000001e-07,1.2585000000000001e-07,1.2592999999999999e-07,1.2597000000000001e-07,1.2613999999999999e-07,1.2646000000000001e-07,1.265e-07,1.265e-07,1.2650999999999999e-07,1.2660000000000001e-07,1.2687e-07,1.2695000000000001e-07,1.2914e-07,1.3003000000000001e-07,1.3006000000000001e-07,1.3139000000000001e-07,1.3154e-07,1.3260999999999999e-07,1.3529000000000002e-07,1.3565e-07],"3":[1.2745000000000002e-07,1.2746999999999999e-07,1.2753999999999999e-07,1.2768000000000002e-07,1.2769e-07,1.2782000000000002e-07,1.2784000000000001e-07,1.2795e-07,1.2795e-07,1.2797e-07,1.283e-07,1.2842999999999999e-07,1.2844e-07,1.2853999999999999e-07,1.2858999999999999e-07,1.2933999999999999e-07,1.339e-07,1.3425999999999999e-07,1.3437e-07,1.3448999999999998e-07],"4":[1.2949999999999999e-07,1.2986e-07,1.3003999999999999e-07,1.3010999999999999e-07,1.3012e-07,1.303e-07,1.3033e-07,1.3033999999999999e-07,1.3038000000000001e-07,1.3038999999999999e-07,1.3040999999999999e-07,1.3079e-07,1.3079e-07,1.3082999999999999e-07,1.3111000000000001e-07,1.3427999999999998e-07,1.3491999999999999e-07,1.3638999999999999e-07,1.3645999999999999e-07,1.4051999999999999e-07],"7424":[1.948e-05,1.9502000000000001e-05,2.0108499999999999e-05,2.0239500000000002e-05,2.0290000000000001e-05,2.0361999999999999e-05,2.0364999999999999e-05,2.047375e-05,2.0538529999999999e-05,2.0624000000000001e-05,2.0675789999999999e-05,2.0698000000000001e-05,2.0762829999999999e-05,2.084895e-05,2.1028909999999999e-05,2.1294980000000001e-05,2.1332264705882351e-05,2.1381000000000001e-05,2.143504e-05,2.1772403846153849e-05],"5":[1.311e-07,1.3157999999999999e-07,1.3169000000000001e-07,1.3173e-07,1.3173999999999999e-07,1.3178000000000001e-07,1.321e-07,1.3210999999999998e-07,1.3210999999999998e-07,1.3213999999999999e-07,1.3224999999999998e-07,1.3262999999999999e-07,1.3273e-07,1.3773e-07,1.3822e-07,1.3825000000000001e-07,1.3850999999999999e-07,1.3890000000000001e-07,1.4504999999999999e-07,1.4557e-07],"23552":[6.1359999999999995e-05,6.2409999999999994e-05,6.4046000000000003e-05,6.4369000000000007e-05,6.4540000000000002e-05,6.4808999999999996e-05,6.502944444444444e-05,6.5544480000000001e-05,6.5977999999999997e-05,6.6316999999999995e-05,6.6573000000000001e-05,6.6686000000000005e-05,6.6958049999999995e-05,6.7082369565217383e-05,6.7201700000000004e-05,6.7712240000000008e-05,6.7881416666666674e-05,6.8039309999999998e-05,6.8512840909090906e-05,6.9118979999999999e-05],"6":[1.3278e-07,1.3321000000000001e-07,1.3322e-07,1.3329999999999998e-07,1.3346999999999999e-07,1.3358000000000001e-07,1.3367999999999999e-07,1.3367999999999999e-07,1.3377000000000001e-07,1.3381000000000001e-07,1.3410000000000002e-07,1.3411e-07,1.3418e-07,1.3506000000000002e-07,1.3672e-07,1.3936e-07,1.4035000000000001e-07,1.4035000000000001e-07,1.4391e-07,1.4704e-07],"61440":[0.000165434,0.0001681962,0.00017125799999999995,0.000171726,0.00017175750000000001,0.00017211599999999999,0.000172423,0.0001741458181818182,0.00017450499999999998,0.00017529101851851853,0.00017615610909090912,0.00017686346428571429,0.00017731267272727273,0.00017739600000000002,0.00018000499999999995,0.00018060307843137258,0.00018076799999999996,0.000181621,0.00018298769230769236,0.00018495585416666664],"491520":[0.0013802699999999992,0.001394822,0.0013959751666666668,0.0014032066666666671,0.001408095,0.0014156991666666669,0.0014210253333333336,0.0014229818333333336,0.0014240140000000001,0.0014306416666666668,0.0014379671666666666,0.0014379711666666667,0.0014425051666666633,0.0014447989999999999,0.0014474548333333333,0.0014600081666666671,0.0014676313333333334,0.0014698623333333333,0.0015832209999999999,0.0016359530000000001],"77824":[0.000205202,0.000206617,0.000210762,0.00021077500000000001,0.000213711,0.00021593,0.00021627699999999991,0.00021658999999999993,0.000217386,0.00021996300000000002,0.000219979,0.00022217599999999998,0.00022225900000000012,0.000225968,0.00022781,0.00022873719444444453,0.00022990182926829267,0.00023348474999999999,0.000235861,0.00024166300000000009],"7":[1.3465999999999999e-07,1.3500999999999999e-07,1.3507999999999999e-07,1.3511e-07,1.3514e-07,1.3516999999999999e-07,1.3546e-07,1.3549e-07,1.3557000000000002e-07,1.3559000000000001e-07,1.3575000000000001e-07,1.3616e-07,1.3618000000000002e-07,1.367e-07,1.3883000000000001e-07,1.4140000000000001e-07,1.4146e-07,1.4196999999999999e-07,1.4266000000000001e-07,1.4317e-07],"8":[1.3706000000000001e-07,1.3712e-07,1.3717999999999999e-07,1.3726999999999998e-07,1.3729000000000001e-07,1.3754999999999998e-07,1.3764999999999999e-07,1.3771000000000001e-07,1.3782e-07,1.4109e-07,1.4112000000000001e-07,1.4149999999999999e-07,1.4352999999999999e-07,1.4355000000000001e-07,1.4406000000000001e-07,1.4413999999999999e-07,1.4474000000000001e-07,1.4522999999999998e-07,1.4921e-07,1.6306000000000001e-07],"208":[5.9475e-07,5.9487000000000003e-07,5.9549999999999995e-07,5.9577999999999995e-07,5.9699999999999996e-07,5.9854999999999997e-07,5.9892000000000002e-07,5.9979e-07,6.0325000000000001e-07,6.2089999999999995e-07,6.2157999999999998e-07,6.2310000000000001e-07,6.2327000000000005e-07,6.2334000000000007e-07,6.2419000000000003e-07,6.2529000000000001e-07,6.2702999999999997e-07,6.2743999999999996e-07,6.5283999999999996e-07,6.5392000000000002e-07],"9":[1.3883999999999999e-07,1.3895999999999999e-07,1.3941e-07,1.3951999999999999e-07,1.3953000000000001e-07,1.3960000000000001e-07,1.3961000000000002e-07,1.4250000000000001e-07,1.4251e-07,1.4334000000000001e-07,1.434e-07,1.4534e-07,1.4553999999999999e-07,1.4571e-07,1.4600000000000001e-07,1.4606999999999998e-07,1.4633000000000001e-07,1.466e-07,1.5347000000000001e-07,1.5376e-07],"73728":[0.00020110400000000005,0.000202017,0.00020924600000000001,0.0002105563571428571,0.00021232799999999999,0.00021251899999999999,0.00021267500000000001,0.00021337755555555547,0.00021398709302325583,0.00021455353488372095,0.00021474413043478255,0.00021590014285714283,0.000216648,0.00021709474999999991,0.00021787224444444445,0.00021960277272727274,0.000220962,0.0002218695813953488,0.00023512045,0.000238410512195122],"304":[1.00073e-06,1.0017099999999999e-06,1.00195e-06,1.00419e-06,1.0108899999999999e-06,1.01118e-06,1.01374e-06,1.0139600000000001e-06,1.0145599999999999e-06,1.0146199999999999e-06,1.01609e-06,1.0175799999999999e-06,1.01773e-06,1.02304e-06,1.0245699999999999e-06,1.04866e-06,1.0582700000000001e-06,1.06359e-06,1.07017e-06,1.1394499999999999e-06],"400":[1.2083299999999999e-06,1.2274399999999999e-06,1.22828e-06,1.2284299999999999e-06,1.2285200000000001e-06,1.2288300000000002e-06,1.2289199999999999e-06,1.2289500000000001e-06,1.2300399999999999e-06,1.23029e-06,1.2310500000000001e-06,1.2328000000000001e-06,1.2333400000000002e-06,1.2377800000000001e-06,1.2390000000000001e-06,1.2443999999999999e-06,1.2574099999999999e-06,1.30151e-06,1.3193199999999999e-06,1.35711e-06],"1310720":[0.0066305619999999996,0.0067467490000000033,0.0067722959999999598,0.006811332000000005,0.0068124500000000003,0.0068981449999999996,0.006913359,0.006934338,0.0069470819999999977,0.0069759780000000025,0.0069763130000000031,0.0069893730000000027,0.0070238569999999997,0.0070682269999999981,0.007089223000000003,0.0070958029999999978,0.007105587,0.007137666,0.0071702619999999967,0.007253364],"336":[1.0718800000000001e-06,1.0751600000000001e-06,1.0757600000000001e-06,1.07742e-06,1.0775799999999999e-06,1.0791800000000001e-06,1.08108e-06,1.08293e-06,1.0865300000000001e-06,1.0871200000000001e-06,1.08853e-06,1.09196e-06,1.0922700000000001e-06,1.0933499999999999e-06,1.0969499999999999e-06,1.1141400000000001e-06,1.13109e-06,1.1611900000000001e-06,1.2068400000000001e-06,1.22405e-06],"3670016":[0.017331840000000001,0.020025404,0.020066411999999999,0.020094710500000001,0.020099558,0.020179183999999999,0.020241189999999999,0.020318520500000003,0.020352351000000005,0.020355557,0.020386704999999998,0.020404761,0.020466228999999999,0.020623253999999994,0.02064071,0.020668668499999994,0.0206739635,0.020912066999999999,0.020966902999999999,0.021244593000000006],"6656":[1.73355e-05,1.7348000000000001e-05,1.7478000000000001e-05,1.7668000000000001e-05,1.8085e-05,1.8312999999999999e-05,1.8558649999999999e-05,1.8648080000000001e-05,1.8690149999999999e-05,1.8695599999999998e-05,1.8737333333333334e-05,1.8769600000000001e-05,1.8813019999999999e-05,1.8878090000000001e-05,1.9041170000000001e-05,1.9129819999999999e-05,1.9449750000000001e-05,1.9730479999999999e-05,2.0751569230769232e-05,2.0937519999999999e-05],"15360":[4.0163000000000002e-05,4.0228000000000002e-05,4.0441000000000001e-05,4.1298000000000003e-05,4.1581000000000001e-05,4.2496000000000001e-05,4.3081999999999998e-05,4.3260030000000005e-05,4.3293e-05,4.3334760000000001e-05,4.3382330000000002e-05,4.3930000000000001e-05,4.4096320000000001e-05,4.4126290000000004e-05,4.4132600000000005e-05,4.4417090000000005e-05,4.5067129999999996e-05,4.654196e-05,4.7732285714285716e-05,4.9588559999999999e-05],"432":[1.29327e-06,1.2945394736842105e-06,1.2993600000000002e-06,1.3000500000000002e-06,1.3002700000000001e-06,1.3013900000000001e-06,1.3040299999999999e-06,1.3050200000000001e-06,1.3057400000000001e-06,1.3092400000000001e-06,1.3110400000000001e-06,1.3111099999999999e-06,1.31422e-06,1.3359499999999999e-06,1.3636400000000002e-06,1.3809099999999998e-06,1.39309e-06,1.42152e-06,1.43213e-06,1.43632e-06],"950272":[0.002726792,0.002727756,0.0027296220000000001,0.0027433096666666674,0.0027463610000000001,0.0027521913333333333,0.0027633473333333325,0.0027647319999999998,0.0027898466666666667,0.0027910213333333339,0.0027943030000000002,0.0028027900000000003,0.0028050919999999999,0.0028165046666666664,0.0028282810000000002,0.0028368766666666662,0.0028616373333333334,0.0028686099999999993,0.0029041563333333338,0.0029404425000000012],"655360":[0.0018133510000000002,0.001870589,0.001872458,0.0018725270000000001,0.0018743890000000034,0.0018748404000000015,0.0018880197999999993,0.0018902679999999999,0.0019035096,0.00190807,0.0019110334000000001,0.001912078,0.0019227339999999999,0.0019464573999999999,0.0019578712500000002,0.0019611666000000001,0.0019830327500000001,0.00198331375,0.0019943999999999999,0.0019992582500000002],"69632":[0.000190454,0.00019381200000000002,0.00019551600000000002,0.00019588333333333337,0.00019773799999999998,0.00020068900000000007,0.00020094334693877559,0.00020123438775510207,0.00020141745833333327,0.000203439,0.00020372535416666673,0.000205394159090909,0.00020577779999999998,0.00020646521428571425,0.00020875899999999998,0.000209533,0.00021493599999999994,0.0002181645,0.00021982992857142854,0.00022147121428571425],"11264":[3.0433000000000002e-05,3.1143916666666668e-05,3.1210230000000004e-05,3.1288619999999999e-05,3.136032e-05,3.1663209999999999e-05,3.1678740000000002e-05,3.1826999999999999e-05,3.236918e-05,3.2514000000000001e-05,3.2720739999999996e-05,3.2736780219780222e-05,3.2767e-05,3.2955313131313134e-05,3.2992189999999998e-05,3.3096858585858588e-05,3.3263999999999999e-05,3.350885567010309e-05,3.4999000000000002e-05,3.5073790000000002e-05],"2752512":[0.0131458935,0.013992900499999999,0.014166505000000001,0.0141916735,0.014312350499999998,0.014404646,0.014407059,0.014447120500000004,0.014495376000000001,0.014592791000000004,0.014598650000000001,0.014645004999999997,0.014647044000000057,0.014669356,0.014673106999999999,0.014692836500000001,0.014695665,0.014745863500000006,0.015034086,0.015283386999999999],"8126464":[0.042945528999999982,0.042971006999999978,0.043065837000000003,0.043261688999999999,0.043322090000000014,0.043433666500000016,0.04345147999999998,0.043480082999999989,0.043570285,0.04376731950000002,0.043909658999999997,0.043967393,0.044073531999999985,0.044286167000000008,0.044660620999999998,0.044753972999999989,0.045289657999999997,0.045574414000000001,0.045997638,0.053202982499999996],"27648":[7.0786999999999998e-05,7.4188000000000002e-05,7.5808000000000003e-05,7.5922999999999998e-05,7.6685000000000002e-05,7.7322600000000004e-05,7.7353153846153837e-05,7.7359461538461532e-05,7.7762517241379304e-05,7.7773240000000006e-05,7.7805846153846159e-05,7.7855185185185185e-05,7.7885000000000004e-05,7.8081846153846155e-05,7.931914e-05,8.0317714285714286e-05,8.0642999999999993e-05,8.0838000000000001e-05,8.0909354838709679e-05,8.1861476190476192e-05],"368":[1.1559100000000001e-06,1.1559400000000001e-06,1.1566700000000001e-06,1.1568300000000001e-06,1.15698e-06,1.15744e-06,1.15836e-06,1.15837e-06,1.15896e-06,1.15926e-06,1.16038e-06,1.1607500000000001e-06,1.16166e-06,1.16331e-06,1.16404e-06,1.17916e-06,1.1920200000000001e-06,1.2137300000000001e-06,1.2651599999999999e-06,1.27182e-06],"65536":[0.00017462899999999998,0.00017544175000000001,0.000181113,0.000183143,0.000183248,0.00018331719230769232,0.00018475233333333326,0.000185279,0.0001863433529411765,0.00018673800000000001,0.00018676199999999998,0.00018701150000000006,0.00018838485714285712,0.00018852086274509812,0.00019018490384615383,0.00019281474509803966,0.00019327837254901956,0.00019348499999999997,0.0001942627999999999,0.00019635152],"16252928":[0.083782267499999993,0.084981167999999996,0.08505095700000001,0.08625293199999999,0.086356453,0.086407386000000003,0.086410096499999978,0.086570488000000001,0.086975708000000027,0.087138541999999986,0.087850535999999993,0.088178333000000025,0.090326585500000028,0.091194677500000002,0.094665300999999966,0.096806801000000026,0.10530727350000001,0.10726281799999998,0.11320593000000001,0.11497403699999997],"464":[1.3645399999999999e-06,1.3651099999999999e-06,1.3657999999999999e-06,1.3713300000000001e-06,1.3721200000000001e-06,1.3730099999999999e-06,1.3754100000000001e-06,1.37573e-06,1.376e-06,1.3784400000000001e-06,1.3806071428571427e-06,1.3814400000000001e-06,1.3815799999999999e-06,1.3822300000000001e-06,1.3823399999999999e-06,1.3957400000000001e-06,1.4352799999999999e-06,1.4572399999999998e-06,1.4975899999999998e-06,1.52237e-06],"1015808":[0.0029024950000000002,0.0029244294999999998,0.0029609110000000001,0.0029630923333333328,0.0029655419999999998,0.0029732109999999999,0.0029844823333333324,0.002985634,0.0029887113333333338,0.0030085509999999999,0.0030184735,0.003035247,0.0030381329999999993,0.0030461666666666666,0.0030510079999999996,0.0030826579999999998,0.0030863939999999997,0.0030872599999999988,0.0030944926666666671,0.0031090970000000008],"3072":[8.3180000000000007e-06,8.3466400000000001e-06,8.4859600000000003e-06,8.4995999999999991e-06,8.566150000000001e-06,8.6203999999999997e-06,8.6207659574468088e-06,8.6381200000000009e-06,8.6537699999999996e-06,8.7182900000000002e-06,8.7352999999999992e-06,8.7479699999999995e-06,8.750989999999999e-06,8.7511034482758614e-06,8.831610000000001e-06,8.84891e-06,8.9205999999999989e-06,8.9460000000000004e-06,9.1610900000000004e-06,9.31154e-06],"110592":[0.000288898,0.0002980970000000001,0.00030007100000000001,0.00030613849999999992,0.00030951500000000001,0.000310313,0.000310389,0.000311374,0.00031279700000000007,0.00031366813793103445,0.00031367029629629631,0.000314049,0.00031544799999999986,0.00031721525925925927,0.00031922400000000001,0.00032058796666666669,0.00032191970000000001,0.00032295017241379317,0.00032671134482758639,0.00033859664285714283],"237568":[0.00065493599999999984,0.00065694800000000008,0.00066402299999999991,0.00066900900000000003,0.00066912899999999997,0.00067850199999999999,0.00067973600000000001,0.00068185299999999984,0.00068378199999999975,0.00068518799999999999,0.00068649835714285708,0.00068724999999999982,0.00068725671428571415,0.00068759500000000026,0.00068891999999999998,0.00068893000000000025,0.00068993328571428556,0.00069034299999999973,0.00069098328571428583,0.00069755642857142867],"278528":[0.00078332899999999993,0.000784112,0.000787238,0.00079246299999999987,0.00079433399999999962,0.00079537533333333302,0.00079791616666666687,0.000798772,0.00079985699999999996,0.00080134836363636333,0.00080372725000000015,0.00080551027272727257,0.00080811983333333294,0.00081041581818181818,0.00081223966666666651,0.00081616490909090908,0.00082124872727272686,0.00082169936363636381,0.00084518799999999997,0.00089844000000000002],"496":[1.44194e-06,1.4422999999999999e-06,1.44557e-06,1.44583e-06,1.44695e-06,1.4488100000000001e-06,1.44929e-06,1.452e-06,1.4525300000000001e-06,1.45437e-06,1.4548700000000001e-06,1.4624700000000002e-06,1.5009600000000001e-06,1.5160200000000001e-06,1.5199699999999999e-06,1.5281e-06,1.5332500000000001e-06,1.53692e-06,1.55043e-06,1.5526599999999999e-06],"13107200":[0.067381452000000008,0.067676504999999998,0.067824784000000027,0.068083768000000003,0.0687803575,0.068799001999999998,0.068965353500000035,0.069703599999999977,0.069986943499999968,0.071181839999999996,0.072718007999999973,0.073080410999999998,0.073678078499999994,0.074323084999999997,0.074477776500000037,0.074549544499999995,0.075042083500000037,0.079968279999999961,0.087333524499999954,0.092429941000000002],"9961472":[0.052882353,0.053808676,0.053867859000000018,0.053982819999999987,0.054071751000000015,0.054178220499999999,0.054373219000000028,0.054759867999999989,0.05500514799999999,0.055028360999999984,0.055446702,0.055523588499999985,0.055980590000000011,0.056182299000000026,0.056347584499999971,0.0567710165,0.056983061999999973,0.057495733,0.0608750625,0.066877279999999983],"5888":[1.5574500000000001e-05,1.5675666666666666e-05,1.5826000000000001e-05,1.6117499999999999e-05,1.6265059999999998e-05,1.629656e-05,1.63683e-05,1.643276e-05,1.656163e-05,1.6599939999999999e-05,1.68889e-05,1.7029750000000001e-05,1.7034999999999999e-05,1.703729e-05,1.7279399999999999e-05,1.7374700000000002e-05,1.73911e-05,1.7499219999999998e-05,1.809918e-05,1.8607509999999998e-05],"11010048":[0.058154079500000011,0.05890396650000003,0.059015989499999998,0.059535231000000001,0.059912042999999984,0.059961867999999988,0.0599848755,0.0600011435,0.060210364000000002,0.060612047999999974,0.060631630000000013,0.061156708000000004,0.062186419999999999,0.06233733850000002,0.062701492999999983,0.063009682999999997,0.063023633999999967,0.064251052499999989,0.06437916199999999,0.071115761499999999],"1920":[5.2728699999999995e-06,5.293e-06,5.2956666666666666e-06,5.3239499999999992e-06,5.3243400000000003e-06,5.3396300000000001e-06,5.37697e-06,5.3817999999999999e-06,5.3904400000000004e-06,5.4102000000000003e-06,5.4149199999999993e-06,5.4201699999999998e-06,5.4574699999999994e-06,5.4639700000000001e-06,5.4892899999999994e-06,5.5018999999999998e-06,5.5309999999999992e-06,5.6275200000000005e-06,5.6316000000000004e-06,5.6885499999999991e-06],"2490368":[0.0132300465,0.013243277500000001,0.0132954545,0.0133346695,0.013528962,0.013536239,0.013567411499999996,0.013673407,0.013709352999999994,0.0137109525,0.01376901,0.013823426999999999,0.013898281,0.013952008,0.013971357,0.014042912000000001,0.014121308000000004,0.014159657000000001,0.014484311499999994,0.014528704999999998],"19456":[5.2008000000000001e-05,5.3207000000000001e-05,5.3829000000000002e-05,5.4621219999999999e-05,5.5084999999999999e-05,5.5084999999999999e-05,5.5106649999999995e-05,5.5110530000000002e-05,5.5306000000000002e-05,5.5369160000000002e-05,5.5403750000000003e-05,5.5989000000000002e-05,5.6143480000000001e-05,5.6399618421052628e-05,5.6409055555555559e-05,5.6496920000000006e-05,5.6740389999999996e-05,5.6984893333333328e-05,5.7214620000000001e-05,6.0514160000000001e-05],"57344":[0.00015125199999999999,0.000155525,0.00015655199999999996,0.000158968,0.00015924799999999999,0.0001593055,0.0001607015,0.00016138666666666671,0.00016178171666666666,0.00016230422413793106,0.00016232077049180331,0.0001625838,0.00016277273076923082,0.000162881,0.000163201,0.00016351549999999999,0.00016448756666666661,0.00016906124561403464,0.0001706737586206895,0.000188684],"1179648":[0.0038337750000000002,0.0063275440000000001,0.0063292780000000024,0.0063581419999999998,0.0063751650000000003,0.0064114000000000003,0.0064471069999999988,0.0064656640000000003,0.0064705729999999986,0.0064742600000000008,0.0064750789999999973,0.006480558,0.0064957340000000004,0.0065112069999999998,0.0065730460000000017,0.0065959790000000018,0.0066697090000000002,0.0067926449999999999,0.0070175680000000035,0.0072960060000000007],"4718592":[0.025206061499999998,0.0257257415,0.025769750500000001,0.026012814000000002,0.0260535065,0.026183109500000006,0.026377885,0.026426181,0.026459266000000002,0.026485244000000002,0.026529066,0.026792860499999994,0.026797501000000001,0.026886757000000001,0.026910219999999995,0.02694017700000001,0.027415463000000001,0.027527300999999987,0.027622588,0.0289812105],"360448":[0.0010110077777777779,0.0010130250000000001,0.001015459,0.0010182100000000001,0.001023028,0.001030123,0.0010380839999999999,0.0010468163333333333,0.001049864,0.0010508155,0.001053481,0.001057170875,0.001063266,0.0010731450000000006,0.0010739160000000001,0.0010760123333333335,0.0010763165555555557,0.0010824875,0.0010880948749999999,0.001110443375],"1572864":[0.0073865719999999992,0.0074910809999999993,0.007542204000000002,0.0075812410000000007,0.0076239310000000005,0.0076523909999999997,0.0077003279999999976,0.007725451999999999,0.0077548370000000005,0.0077718190000000019,0.0077787730000000027,0.007781764,0.007825851,0.0078390400000000002,0.0078881780000000009,0.0079909240000000017,0.008032619999999999,0.0081183319999999989,0.0081864189999999969,0.0082433990000000019],"53248":[0.00014122200000000001,0.00014830731481481479,0.00014956136923076921,0.00014956218749999996,0.00014964080769230766,0.00015092831249999999,0.00015109462068965514,0.00015128172580645166,0.00015155570000000002,0.0001525992499999999,0.00015284283870967746,0.00015352431250000001,0.00015358200000000006,0.00015397029508196718,0.00015429314285714287,0.00015454616666666672,0.00015509073333333333,0.00015584306349206354,0.00015702399999999999,0.0001614498181818182],"3456":[9.2116666666666668e-06,9.4793333333333343e-06,9.4856600000000003e-06,9.7166499999999995e-06,9.7184400000000011e-06,9.73724e-06,9.7484999999999999e-06,9.7952700000000005e-06,9.7991500000000009e-06,9.8888499999999993e-06,1.0006999999999999e-05,1.002205e-05,1.0038270000000001e-05,1.0122000000000001e-05,1.028274e-05,1.0349969999999999e-05,1.0398840000000001e-05,1.047027e-05,1.049405e-05,1.0507649999999999e-05],"40960":[0.000109752,0.000111246,0.0001130915,0.00011468688888888888,0.00011545485714285712,0.000115593,0.000116555,0.00011723439130434782,0.000117438,0.0001177825,0.00011804818292682929,0.00011837500000000003,0.00011842798765432094,0.00011848226190476195,0.00011864821739130432,0.00012008710389610395,0.0001204112,0.00012057106410256414,0.000121167,0.00012205251851851863],"4608":[1.2310000000000001e-05,1.243475e-05,1.2877999999999999e-05,1.2960409999999999e-05,1.2996999999999999e-05,1.3026e-05,1.303501e-05,1.3043469999999999e-05,1.308147e-05,1.3082890000000001e-05,1.3135740000000001e-05,1.316769e-05,1.3172080000000001e-05,1.3196130000000001e-05,1.3270960000000001e-05,1.3341980000000001e-05,1.3383390000000001e-05,1.3633650000000001e-05,1.3745500000000001e-05,1.3759e-05],"13824":[3.6089e-05,3.7693e-05,3.7737000000000001e-05,3.7761e-05,3.8109999999999999e-05,3.8179000000000002e-05,3.8269000000000002e-05,3.8278999999999997e-05,3.8331780000000003e-05,3.8668360000000001e-05,3.9066367346938772e-05,3.9102649999999997e-05,3.9133869999999999e-05,3.914753e-05,3.9890413043478258e-05,3.9926999999999999e-05,4.0194669999999994e-05,4.0216039999999999e-05,4.0998609999999998e-05,4.1828539999999997e-05],"819200":[0.0023342840000000007,0.0023522340000000008,0.0023596260000000001,0.0023650543333333324,0.0023745933333333335,0.002376052,0.0023827092500000001,0.0023880640000000001,0.0023914345000000002,0.0023966317499999994,0.0024032035000000002,0.002412229000000001,0.002414149,0.0024296862499999993,0.0024390309999999999,0.0024605410000000014,0.0024806846666666667,0.0025161236666666662,0.0025462746666666666,0.0025895580000000001],"983040":[0.0027635939999999999,0.0028404620000000002,0.0028581533333333332,0.0028598216666666657,0.0028725253333333331,0.0028880310000000001,0.0028934019999999993,0.0028939619999999999,0.0028951069999999996,0.002909200333333333,0.0029203533333333337,0.0029212609999999992,0.0029418915,0.0029507243333333328,0.0029512016666666668,0.0029523329999999997,0.0029660776666666673,0.0029843413333333329,0.0030089843333333329,0.0033044650000000017],"8704":[2.2792499999999999e-05,2.2906999999999999e-05,2.4088999999999999e-05,2.4401789999999997e-05,2.4443e-05,2.4495595505617977e-05,2.4546720000000001e-05,2.4699470000000001e-05,2.4768049999999997e-05,2.4955069767441858e-05,2.4957479999999998e-05,2.5058239999999999e-05,2.5203500000000004e-05,2.5207920000000001e-05,2.5276349999999997e-05,2.5280929999999999e-05,2.5877139999999999e-05,2.5985219999999998e-05,2.6185750000000003e-05,2.6566179999999998e-05],"120":[3.9755999999999997e-07,3.9777999999999995e-07,3.9783000000000001e-07,3.9806000000000001e-07,3.9814000000000004e-07,3.9826000000000002e-07,3.9854000000000002e-07,3.9932999999999996e-07,3.9956999999999997e-07,4.0000000000000003e-07,4.0024000000000004e-07,4.0040999999999997e-07,4.0120000000000002e-07,4.0148999999999998e-07,4.0209000000000002e-07,4.1089e-07,4.1628999999999998e-07,4.1748e-07,4.1902e-07,4.2137000000000002e-07],"1024":[2.8785714285714283e-06,2.8859499999999999e-06,2.88933e-06,2.9062100000000001e-06,2.9131600000000001e-06,2.9256899999999999e-06,2.9326999999999999e-06,2.9422699999999998e-06,2.9434500000000002e-06,2.9450000000000002e-06,2.9503700000000002e-06,2.9698099999999998e-06,2.9711000000000002e-06,2.9716399999999999e-06,3.0320999999999997e-06,3.0424199999999996e-06,3.0705400000000003e-06,3.1619299999999997e-06,3.18015e-06,3.4850000000000001e-06],"49152":[0.000134332,0.000137544,0.00013760000000000001,0.000137832,0.00013835147692307687,0.00013857999999999999,0.00013870036363636365,0.00013871484507042253,0.00013872261016949152,0.000138987,0.00013914484057971017,0.0001394875,0.00014016038235294121,0.00014052762121212123,0.00014080900000000004,0.0001439065,0.0001444132857142857,0.00014551159701492529,0.00015453596610169492,0.00015829610344827587],"524288":[0.0014981774999999991,0.0015006533333333332,0.0015022496666666667,0.0015088736666666667,0.0015095170000000002,0.001515305,0.0015194238333333338,0.0015194519999999999,0.0015194944999999999,0.0015205385000000003,0.0015218778333333336,0.0015245028333333336,0.0015261643333333336,0.0015355581666666668,0.0015363384999999999,0.0015458090000000009,0.0015620491666666664,0.001562178,0.0015919256666666666,0.0017423709999999999],"45056":[0.00012000283333333335,0.000121068,0.00012341725000000005,0.00012442100000000005,0.00012535725000000002,0.00012616,0.00012634000000000001,0.00012739212162162162,0.00012796522666666668,0.00012837950000000001,0.00012872524324324323,0.00012894447142857142,0.00012971267123287669,0.00013015352083333337,0.0001319436666666667,0.00013209867142857141,0.00013423099999999993,0.000134325,0.000134609,0.00013557060273972603],"229376":[0.00061345100000000021,0.00063727900000000004,0.00064723000000000016,0.00064801099999999977,0.00065093299999999959,0.00065107800000000025,0.00065712799999999966,0.00066289384615384589,0.00066433150000000016,0.00066519599999999963,0.00066817216666666666,0.00067015378571428556,0.00067080585714285714,0.00067212578571428561,0.0006732289999999998,0.00067332721428571432,0.00067651228571428555,0.00068023833333333327,0.00069139628571428572,0.00070142000000000002],"2688":[7.2357799999999997e-06,7.3321800000000002e-06,7.37837e-06,7.4032499999999998e-06,7.4156590909090913e-06,7.4885600000000003e-06,7.4898100000000005e-06,7.5290000000000003e-06,7.5462700000000005e-06,7.5569999999999998e-06,7.5806400000000001e-06,7.5879099999999997e-06,7.5889999999999997e-06,7.5997499999999995e-06,7.6741099999999989e-06,7.75261e-06,7.8028400000000003e-06,7.8701799999999999e-06,8.0245000000000008e-06,8.1494500000000004e-06],"152":[4.6885000000000002e-07,4.6888e-07,4.6916999999999996e-07,4.6928000000000003e-07,4.693e-07,4.6940000000000001e-07,4.6960999999999998e-07,4.6974999999999998e-07,4.6992000000000002e-07,4.7046000000000005e-07,4.7052999999999997e-07,4.7079e-07,4.7119000000000003e-07,4.7135e-07,4.7188000000000001e-07,4.7211000000000001e-07,4.7509e-07,4.9156000000000004e-07,4.9391999999999997e-07,8.7028999999999999e-07],"5120":[1.4237909090909091e-05,1.426505e-05,1.42991e-05,1.4386000000000001e-05,1.4397e-05,1.4430860000000002e-05,1.443246e-05,1.451005e-05,1.457802e-05,1.4619e-05,1.4629499999999999e-05,1.46613e-05,1.473829e-05,1.479239e-05,1.4813590000000001e-05,1.4843040000000001e-05,1.484714e-05,1.487134e-05,1.515232e-05,1.6468149999999999e-05],"1507328":[0.0047168230000000002,0.0048943110000000001,0.0072083719999999993,0.0072669649999999976,0.0073250259999999984,0.0073471279999999996,0.0074138619999999976,0.007452239000000002,0.007495079,0.0075536269999999977,0.0076096030000000021,0.0076222780000000006,0.0076264150000000001,0.007629332,0.0076419009999999996,0.0076530910000000008,0.0077005089999999995,0.007863895999999997,0.0079192180000000022,0.0081444119999999984],"1216":[3.3043333333333333e-06,3.3400000000000002e-06,3.34332e-06,3.3527699999999999e-06,3.35687e-06,3.3693800000000002e-06,3.37255e-06,3.3773400000000001e-06,3.3812099999999998e-06,3.3884699999999998e-06,3.3905599999999999e-06,3.3963100000000003e-06,3.4027500000000002e-06,3.4081699999999998e-06,3.4163508771929825e-06,3.4289700000000001e-06,3.4445199999999999e-06,3.5279099999999996e-06,3.5771e-06,3.7782300000000001e-06],"1966080":[0.0087477639999999999,0.0087810329999999971,0.0087962700000000036,0.008801365000000002,0.0088058519999999994,0.0088331910000000007,0.0088630220000000051,0.0088718100000000025,0.0088846440000000006,0.0088858349999999999,0.0088922230000000047,0.0089154860000000037,0.0089206660000000007,0.008945705,0.0089623840000000003,0.0090085180000000036,0.0090231419999999996,0.009029404000000003,0.0092021219999999966,0.009264787],"1900544":[0.0084531470000000046,0.0085964849999999992,0.0086002500000000003,0.0086024730000000028,0.0086035839999999975,0.0086145119999999995,0.0086513980000000028,0.0086619499999999999,0.0086729099999999955,0.0087462990000000025,0.008753818,0.0087824890000000062,0.0087870660000000014,0.0088285159999999981,0.0089271290000000007,0.0089782609999999995,0.0090174950000000004,0.0090661359999999937,0.0090905489999999999,0.009097394],"184":[5.4005000000000002e-07,5.4107000000000001e-07,5.4184999999999995e-07,5.4186000000000001e-07,5.4214999999999997e-07,5.4219000000000001e-07,5.4242000000000001e-07,5.4277999999999999e-07,5.4341000000000002e-07,5.4363000000000006e-07,5.4385999999999995e-07,5.4558999999999995e-07,5.4662999999999997e-07,5.4703999999999995e-07,5.6700000000000003e-07,5.6718999999999999e-07,5.7008000000000003e-07,5.7107000000000004e-07,5.7227000000000003e-07,6.1667000000000008e-07],"7936":[2.1452285714285717e-05,2.1869999999999999e-05,2.1892320000000002e-05,2.1913079999999997e-05,2.1956000000000001e-05,2.2174009999999999e-05,2.231211e-05,2.2410339999999997e-05,2.251867e-05,2.2712814814814815e-05,2.2789000000000002e-05,2.2841999999999999e-05,2.2843970000000001e-05,2.2887430000000003e-05,2.3015230000000002e-05,2.3094919999999999e-05,2.3114469999999998e-05,2.3199260000000001e-05,2.4348289999999998e-05,2.4635999999999999e-05],"3801088":[0.017875082,0.020285448000000001,0.020347691000000001,0.020360095000000002,0.020369841,0.0203885665,0.020404768,0.020442148,0.020473573000000002,0.020549694,0.020559564000000002,0.020655113999999992,0.020763556999999995,0.020936992500000001,0.020969767,0.021016337,0.02104586700000001,0.0212544325,0.0212689,0.022373032999999994],"6815744":[0.036803451500000001,0.037525761000000012,0.03759346899999999,0.037734914500000015,0.037837944000000005,0.037869792499999985,0.038205553500000003,0.038212330000000003,0.038229832499999998,0.038663667999999998,0.038805240000000012,0.038884535999999997,0.039032794000000003,0.039133676999999999,0.039487383500000008,0.040233265000000004,0.04102843049999999,0.041198202999999989,0.041478166000000004,0.041930111999999978],"124":[4.0611999999999999e-07,4.0676923076923074e-07,4.0680999999999997e-07,4.0695000000000003e-07,4.0713000000000002e-07,4.0721e-07,4.0727999999999998e-07,4.0731000000000001e-07,4.0772e-07,4.0781999999999996e-07,4.0786e-07,4.0793000000000003e-07,4.0809e-07,4.0861e-07,4.1127e-07,4.1427000000000002e-07,4.2539000000000003e-07,4.2625e-07,4.3009000000000001e-07,4.4718000000000001e-07],"102400":[0.00027618099999999991,0.00027869800000000002,0.00027965999999999999,0.00027997199999999981,0.00028001099999999988,0.00028308100000000002,0.00028417599999999986,0.00028460900000000001,0.0002858400000000001,0.00028913000000000002,0.00028944300000000001,0.00029126649999999983,0.00029244681250000014,0.00029285299999999993,0.000294503,0.00029548696969696966,0.00030101664516129036,0.00030225299999999999,0.00030399315624999999,0.00030601284375000014],"311296":[0.00087190499999999975,0.00088142270000000043,0.00088228699999999983,0.00088607400000000004,0.00088844818181818227,0.00089451272727272715,0.00089665100000000005,0.00089974299999999994,0.0009022381249999998,0.00090308160000000001,0.00091025440000000002,0.00091470980000000026,0.00091650370000000007,0.0009171454999999997,0.00091884780000000004,0.00092053739999999951,0.00092853100000000013,0.00096045400000000002,0.0010129346666666668,0.001017635],"1408":[3.8919999999999993e-06,3.8993600000000001e-06,3.9068000000000004e-06,3.9102173913043478e-06,3.9238399999999999e-06,3.9258099999999996e-06,3.93819e-06,3.9409499999999999e-06,3.9626400000000002e-06,3.9666000000000003e-06,3.9735000000000002e-06,3.9751499999999995e-06,3.9824199999999999e-06,4.0138499999999997e-06,4.0158099999999996e-06,4.0274100000000005e-06,4.0609999999999997e-06,4.0685500000000002e-06,4.0807900000000001e-06,4.0972399999999998e-06],"393216":[0.001094205,0.0011069070000000001,0.001111285125,0.0011210759999999999,0.0011279092500000006,0.00112819425,0.001130983625,0.0011334540000000001,0.0011338264999999996,0.001141896625,0.0011423325,0.001143877,0.0011441405714285716,0.0011442288749999999,0.0011468618750000001,0.001149347,0.0011532971249999953,0.001153587,0.0011656895714285717,0.0011658409999999999],"4352":[1.208764e-05,1.2136e-05,1.2172450000000001e-05,1.223361e-05,1.224317e-05,1.2255666666666667e-05,1.2268380000000001e-05,1.2304333333333332e-05,1.2359520000000001e-05,1.2402459999999999e-05,1.243889e-05,1.245773e-05,1.2467870000000001e-05,1.2530539999999999e-05,1.25816e-05,1.2616480000000001e-05,1.3062379999999999e-05,1.3100636363636363e-05,1.326233e-05,1.3310463917525773e-05],"6553600":[0.036257182999999998,0.036738185,0.037107643500000002,0.037199926500000001,0.037406695000000004,0.037504788999999997,0.037527586000000002,0.037601520000000006,0.037684941,0.037841673999999999,0.038059559999999978,0.038084652999999996,0.038292771999999996,0.038302789000000004,0.038303749499999998,0.038669604500000003,0.039093588999999998,0.039184974999999997,0.042087123000000004,0.0432711255],"20480":[5.6144999999999999e-05,5.6274499999999998e-05,5.6471000000000002e-05,5.6651130434782607e-05,5.6849999999999999e-05,5.7281701492537313e-05,5.7288759999999997e-05,5.75455e-05,5.7563529999999994e-05,5.77555e-05,5.8308144927536224e-05,5.8403079999999995e-05,5.8629999999999999e-05,5.8712652173913042e-05,5.8951920634920632e-05,5.896758e-05,5.9132719999999999e-05,5.999039e-05,6.0127289999999995e-05,6.2246724137931029e-05],"608":[1.6686100000000001e-06,1.67256e-06,1.6742380952380953e-06,1.67707e-06,1.68063e-06,1.6882099999999998e-06,1.6955900000000001e-06,1.6970399999999998e-06,1.69776e-06,1.6991599999999999e-06,1.7007700000000001e-06,1.70118e-06,1.70572e-06,1.7076099999999998e-06,1.76894e-06,1.77049e-06,1.7770000000000001e-06,1.7777200000000001e-06,1.7943333333333333e-06,2.0122899999999999e-06],"2228224":[0.011067117,0.012553978999999993,0.0125598025,0.012627488000000003,0.012706792999999999,0.012776832,0.012873648,0.012922421999999999,0.0129437185,0.012958661999999999,0.012961532,0.013084713500000003,0.013135032,0.013161020000000004,0.013220296999999997,0.013276554999999999,0.013379408000000001,0.013571746499999999,0.01430201,0.014846042],"36864":[9.9689e-05,0.000100734,0.00010179383333333331,0.000102453,0.00010294975,0.00010430206666666667,0.000104344,0.00010563099999999999,0.00010602125,0.00010681,0.00010689816867469877,0.00010736792592592592,0.00010759206521739127,0.0001076142747252747,0.00010844693023255819,0.00010909913333333335,0.00010933201136363638,0.000109787,0.00011152967415730338,0.00011882753333333335],"704":[1.89196e-06,1.9025800000000001e-06,1.9140499999999999e-06,1.9146799999999999e-06,1.9159799999999998e-06,1.9161300000000002e-06,1.91726e-06,1.9182499999999998e-06,1.9186666666666665e-06,1.9236399999999999e-06,1.9250799999999999e-06,1.9283700000000001e-06,1.9321999999999999e-06,1.94374e-06,1.9770000000000003e-06,1.9822700000000001e-06,2.00025e-06,2.0087899999999999e-06,2.01335e-06,2.03385e-06],"720896":[0.0020492129999999989,0.0020690604999999999,0.00207656475,0.0020914559999999998,0.0020943462500000003,0.0020970109999999998,0.0020999589999999993,0.0021015307500000012,0.0021035597500000001,0.002104318999999999,0.002109657,0.0021183072500000001,0.0021244042499999989,0.0021310299999999999,0.00213550875,0.0021384144999999988,0.0021544700000000008,0.0022422085,0.0022743259999999993,0.0024344890000000002],"800":[2.3696829268292686e-06,2.3832299999999999e-06,2.3870900000000001e-06,2.3937999999999998e-06,2.3939999999999999e-06,2.3955499999999999e-06,2.3985200000000001e-06,2.4086800000000002e-06,2.4135799999999999e-06,2.418e-06,2.4184400000000003e-06,2.4260900000000001e-06,2.4330100000000001e-06,2.4457000000000001e-06,2.4556799999999999e-06,2.4748800000000001e-06,2.4954600000000002e-06,2.5264999999999999e-06,2.5270999999999999e-06,2.5386300000000001e-06],"2621440":[0.013555922,0.013725365999999999,0.013871968,0.01394156,0.013967153999999999,0.014008952999999999,0.014017027,0.014078611,0.014091109499999999,0.014115511000000001,0.014155033000000001,0.014227786000000001,0.014276531,0.014283064,0.0143522245,0.0144038555,0.014466534999999994,0.014553363,0.014634956500000001,0.014725693999999994],"425984":[0.00114346,0.0011663299999999997,0.0011702400000000001,0.0011705469999999999,0.0011817749999999999,0.0011987090000000001,0.001203915625,0.0012071569999999999,0.001213032,0.0012307014285714286,0.0012311869999999999,0.0012344305000000001,0.0012497462857142855,0.001250088857142857,0.0012518080000000001,0.001254979,0.0012596740000000001,0.0012607978,0.0012672199999999999,0.0012876304285714285],"32768":[8.5496999999999998e-05,8.6433000000000004e-05,8.9502749999999996e-05,8.9603000000000003e-05,9.0713100000000004e-05,9.1419e-05,9.2781000000000005e-05,9.3526066666666652e-05,9.3632052083333334e-05,9.4375840000000008e-05,9.4640350000000013e-05,9.521233333333333e-05,9.555408333333333e-05,9.594520618556701e-05,9.6021206896552023e-05,9.6390000000000004e-05,9.7272766666666675e-05,9.7957749999999996e-05,9.9153049999999994e-05,9.9846000000000006e-05],"12058624":[0.063066109999999995,0.06318,0.063396034500000004,0.063524161499999982,0.06379638600000001,0.063816763500000012,0.063947190000000001,0.063947567999999982,0.06422239099999999,0.064319005000000012,0.065318628000000017,0.065328417999999971,0.065475769999999989,0.066818443000000033,0.068512957999999999,0.069863475999999966,0.070502302500000016,0.070704642000000012,0.079225148500000037,0.086960956999999992],"128":[4.1486999999999996e-07,4.1526999999999999e-07,4.1536999999999999e-07,4.1547e-07,4.1548000000000001e-07,4.1606000000000003e-07,4.1610000000000003e-07,4.1644000000000004e-07,4.1682e-07,4.1684999999999998e-07,4.1690000000000003e-07,4.1709000000000004e-07,4.1712000000000002e-07,4.1744000000000001e-07,4.1767000000000001e-07,4.1813e-07,4.1847000000000001e-07,4.1971000000000004e-07,4.2058000000000002e-07,4.3622999999999998e-07],"180224":[0.00049601099999999998,0.00049823599999999999,0.00050095199999999993,0.00050587800000000019,0.0005106100000000001,0.00051180699999999976,0.00051273915789473658,0.00051365799999999974,0.00051407449999999973,0.00051528694444444431,0.00051764747368421066,0.00051785589473684213,0.00051940278947368431,0.00052212599999999982,0.00052340199999999985,0.00052619216666666656,0.00053380700000000018,0.00053811972222222212,0.00053870911111111126,0.00055907964705882349],"224":[6.2959999999999997e-07,6.3061999999999997e-07,6.3097999999999995e-07,6.3213999999999999e-07,6.3231999999999999e-07,6.3382999999999995e-07,6.3459000000000007e-07,6.3473999999999998e-07,6.348599999999999e-07,6.3542000000000001e-07,6.3576000000000008e-07,6.3577999999999989e-07,6.3628999999999999e-07,6.3707000000000003e-07,6.6212999999999996e-07,6.6470999999999992e-07,6.9230999999999998e-07,7.1236999999999997e-07,7.4579999999999992e-07,7.5514999999999998e-07],"736":[1.9570500000000002e-06,1.9586899999999997e-06,1.9632199999999998e-06,1.9640499999999999e-06,1.96568e-06,1.9659399999999999e-06,1.9676399999999999e-06,1.9826899999999998e-06,1.9941199999999998e-06,1.9987500000000001e-06,1.9998400000000002e-06,1.9999600000000001e-06,2.0045e-06,2.0150000000000002e-06,2.0242800000000001e-06,2.0547899999999999e-06,2.0563800000000002e-06,2.06794e-06,2.07819e-06,2.07977e-06],"320":[1.03664e-06,1.03908e-06,1.04053e-06,1.0419199999999998e-06,1.0440999999999999e-06,1.0443600000000001e-06,1.0461499999999999e-06,1.04639e-06,1.04879e-06,1.0500000000000001e-06,1.0505299999999999e-06,1.05117e-06,1.0621e-06,1.06758e-06,1.07018e-06,1.08698e-06,1.09485e-06,1.09588e-06,1.1198125000000001e-06,1.1246899999999999e-06],"557056":[0.0015413779999999999,0.0015634120000000001,0.0015716009999999999,0.0015776659999999995,0.001586336,0.0015883132000000001,0.0015890559999999991,0.0015932450000000001,0.0015934509999999999,0.001598328,0.0016050820000000001,0.0016087075999999996,0.00161163,0.0016134315,0.0016234629999999999,0.0016336839999999998,0.0016650879999999997,0.0016792932,0.0016796300000000001,0.0016826750000000009],"832":[2.4366300000000001e-06,2.4424900000000001e-06,2.4586099999999999e-06,2.47799e-06,2.4804500000000001e-06,2.4900399999999997e-06,2.4921900000000002e-06,2.4929900000000002e-06,2.4986300000000001e-06,2.5010000000000003e-06,2.5220000000000002e-06,2.5227399999999998e-06,2.5290300000000002e-06,2.5315500000000004e-06,2.5482199999999997e-06,2.5496299999999997e-06,2.5869199999999999e-06,2.6413499999999997e-06,2.6543200000000003e-06,2.95202e-06],"9437184":[0.0516480385,0.052100350000000017,0.052130441000000007,0.052164892000000004,0.052305593999999997,0.05236403299999999,0.052548334499999981,0.05257978,0.052920897500000022,0.053346399000000003,0.0533819315,0.053773214,0.054074528000000031,0.05416567800000003,0.054731054000000001,0.055456351000000001,0.058720913,0.058965399000000016,0.060479753000000004,0.0693151615],"3584":[9.5429999999999999e-06,9.8810000000000008e-06,9.9329999999999996e-06,9.9489700000000004e-06,9.9723099999999984e-06,1.0042950000000002e-05,1.0120789999999999e-05,1.015338e-05,1.045254e-05,1.050124e-05,1.050764e-05,1.0600810000000001e-05,1.060385e-05,1.0671e-05,1.0686999999999999e-05,1.077e-05,1.078704e-05,1.081477e-05,1.1427972972972972e-05,1.15434e-05],"6291456":[0.035402925999999994,0.03577789,0.035900362000000012,0.035930772999999999,0.036021281500000002,0.036234626000000013,0.036309993999999998,0.03650511,0.036580284000000018,0.036673557499999974,0.036848297999999988,0.036859989499999996,0.036973865500000001,0.037172715000000002,0.037485808999999981,0.037662476,0.038198620999999988,0.038505518500000002,0.038989119000000003,0.041701256000000013],"256":[7.0154000000000002e-07,7.0218999999999996e-07,7.0279999999999997e-07,7.0283000000000005e-07,7.0340999999999997e-07,7.043200000000001e-07,7.0501999999999994e-07,7.0543999999999989e-07,7.0549e-07,7.0681000000000001e-07,7.0699999999999996e-07,7.0784999999999992e-07,7.3651000000000002e-07,7.365899999999999e-07,7.7057e-07,7.7128000000000001e-07,7.7235e-07,7.8049999999999998e-07,7.8411999999999996e-07,8.3241999999999999e-07],"15204352":[0.079244799000000005,0.0796422725,0.080876527500000003,0.081371665999999968,0.082234324500000039,0.082522766999999997,0.082553228500000006,0.082587648999999999,0.08269215299999999,0.083565388500000032,0.084451651000000003,0.085028201000000025,0.085385610999999972,0.086455464999999995,0.088363516999999961,0.089651196000000002,0.096963362499999997,0.09704321099999999,0.1054541715,0.10827202649999999],"28672":[7.4882000000000006e-05,7.8113000000000002e-05,7.9237428571428563e-05,7.9504428571428579e-05,8.0248545454545458e-05,8.0513049999999996e-05,8.0530000000000003e-05,8.0976636363636365e-05,8.1386470000000002e-05,8.1391999999999996e-05,8.1809919999999999e-05,8.1837860000000002e-05,8.1917670000000015e-05,8.2066105263157887e-05,8.2358899999999995e-05,8.2859139999999997e-05,8.349903000000001e-05,8.4481819999999996e-05,9.023881818181818e-05,9.0371900000000286e-05],"768":[2.0333499999999998e-06,2.03474e-06,2.0513300000000001e-06,2.0520800000000001e-06,2.0570899999999999e-06,2.0601699999999998e-06,2.0638199999999997e-06,2.0644099999999999e-06,2.0652299999999997e-06,2.0683199999999999e-06,2.0697599999999998e-06,2.0707299999999999e-06,2.0713700000000002e-06,2.0723399999999999e-06,2.1256800000000001e-06,2.14266e-06,2.1426699999999998e-06,2.18769e-06,2.2000900000000001e-06,2.2089600000000001e-06],"212992":[0.000570435,0.00059124100000000027,0.00060256100000000026,0.00061043800000000004,0.00061070218749999998,0.00061312878571428574,0.000613644,0.00061367043749999996,0.00061490120000000001,0.00061592299999999999,0.00061713225000000003,0.00061854113333333332,0.0006219219999999999,0.00062399873333333336,0.00063421400000000002,0.00063524785714285715,0.0006366230714285714,0.0006599661666666668,0.000660668,0.00067253550000000021],"864":[2.4993636363636363e-06,2.5111899999999999e-06,2.5188400000000002e-06,2.5268000000000001e-06,2.5291199999999998e-06,2.55156e-06,2.5540800000000001e-06,2.5547299999999998e-06,2.5615599999999999e-06,2.5673399999999998e-06,2.5725400000000002e-06,2.6145900000000001e-06,2.6250909090909091e-06,2.6326399999999998e-06,2.63372e-06,2.6373500000000003e-06,2.6500200000000002e-06,2.6802899999999997e-06,2.6922100000000001e-06,2.7000100000000003e-06],"352":[1.11969e-06,1.12039e-06,1.122e-06,1.12311e-06,1.12318e-06,1.1248799999999999e-06,1.12566e-06,1.1257099999999999e-06,1.1265299999999999e-06,1.1288888888888889e-06,1.1306099999999999e-06,1.13198e-06,1.14209e-06,1.1421400000000001e-06,1.1501499999999999e-06,1.15244e-06,1.17504e-06,1.1766300000000001e-06,1.1791799999999999e-06,1.2343099999999998e-06],"253952":[0.0007037730000000002,0.00070928699999999996,0.000717002,0.00071870300000000022,0.00072167100000000012,0.00072436808333333305,0.00072567499999999995,0.00072590699999999992,0.00072868899999999992,0.00072908838461538449,0.00072924300000000008,0.00073027358333333328,0.00073186423076923026,0.00073327199999999966,0.00073523299999999985,0.00073684500000000008,0.00074567975,0.00074725723076923063,0.00075223149999999997,0.00075995899999999994],"960":[2.7025e-06,2.7304300000000001e-06,2.7516099999999999e-06,2.7597500000000001e-06,2.76079e-06,2.7834700000000001e-06,2.7923999999999997e-06,2.8021600000000002e-06,2.8084200000000002e-06,2.80987e-06,2.8118299999999999e-06,2.82156e-06,2.8479599999999998e-06,2.8533333333333333e-06,2.8621499999999998e-06,2.92129e-06,2.9820600000000004e-06,2.9972000000000003e-06,3.0415e-06,3.2933899999999998e-06],"24576":[6.3299000000000005e-05,6.3686499999999994e-05,6.7125000000000005e-05,6.7615999999999998e-05,6.7780000000000005e-05,6.8043720000000009e-05,6.8131953488372095e-05,6.8417000000000006e-05,6.8786960000000001e-05,6.8881999999999995e-05,6.8904560000000002e-05,6.9079330000000003e-05,6.9580059999999999e-05,6.9680650000000002e-05,6.9706699999999994e-05,6.9742090000000085e-05,6.9747020000000552e-05,6.9919785714285713e-05,7.0729000000000007e-05,7.1140079999999992e-05],"7680":[2.0730999999999999e-05,2.1098e-05,2.1281239130434782e-05,2.1366404761904761e-05,2.1532619999999999e-05,2.1613840000000002e-05,2.170002e-05,2.177508e-05,2.1886750000000002e-05,2.1950680000000002e-05,2.196082e-05,2.2280860000000003e-05,2.2284879999999999e-05,2.2341240000000002e-05,2.241478e-05,2.2476129999999999e-05,2.2539919999999999e-05,2.2685919999999997e-05,2.3084239999999998e-05,2.3190559999999998e-05],"294912":[0.00080325899999999996,0.00082282800000000006,0.00082980399999999963,0.00083268600000000002,0.00084840990909090894,0.00085030899999999994,0.00085050100000000003,0.00085129254545454527,0.00085506799999999995,0.00086097281818181862,0.00086186045454545476,0.00086290218181818228,0.0008672328181818182,0.00087066490909090927,0.000872442181818182,0.00087272250000000021,0.00087556254545454566,0.00087649027272727257,0.00087821863636363632,0.00089652800000000006],"1048576":[0.00590451,0.0059227299999999984,0.0059835349999999973,0.0060292750000000023,0.006039080000000004,0.0060408140000000003,0.0060695719999999988,0.0060818900000000021,0.0060973519999999986,0.0061042330000000014,0.0061128409999999999,0.0061327809999999986,0.0061637090000000016,0.0061871109999999986,0.0061947469999999987,0.0062151130000000021,0.0062981400000000024,0.0063090080000000022,0.0063930939999999993,0.0065484750000000006],"10485760":[0.056031180999999972,0.056584580999999981,0.056873127000000002,0.057286027500000003,0.057557769000000002,0.057599729000000002,0.057630023000000016,0.058007261500000032,0.058076919000000019,0.058702739999999996,0.05902419099999999,0.059836555,0.06031049099999998,0.060580750000000003,0.061658632999999984,0.062890632000000002,0.065709742999999987,0.067276342000000003,0.06950624850000002,0.071445326499999975],"344064":[0.00092794100000000005,0.00094877399999999978,0.0009680820000000001,0.00097055577777777795,0.00097277699999999997,0.000973288,0.00097672800000000006,0.00097693688888888879,0.00098848100000000047,0.00098901399999999943,0.0009903091428571432,0.001001711,0.001004479,0.0010051045555555557,0.0010058620000000004,0.0010101885555555564,0.00101275,0.0010267553333333334,0.0010277119999999999,0.0011203477499999999],"288":[9.6272000000000003e-07,9.6470000000000006e-07,9.6565000000000002e-07,9.6635000000000007e-07,9.6771999999999999e-07,9.7273e-07,9.7304000000000009e-07,9.8002000000000006e-07,9.8189000000000001e-07,9.8555000000000003e-07,9.8609000000000012e-07,9.8776000000000005e-07,9.9821999999999995e-07,1.0071799999999999e-06,1.0119499999999999e-06,1.0385600000000001e-06,1.0499300000000001e-06,1.05611e-06,1.1090600000000001e-06,1.1687699999999999e-06],"1152":[3.1737699999999996e-06,3.1737799999999999e-06,3.1770000000000002e-06,3.2059299999999996e-06,3.2230600000000003e-06,3.2310500000000002e-06,3.2337799999999997e-06,3.2374699999999999e-06,3.2379400000000002e-06,3.2396100000000001e-06,3.2603699999999998e-06,3.2622899999999998e-06,3.2800899999999999e-06,3.2845099999999999e-06,3.2847300000000001e-06,3.2885100000000002e-06,3.3221200000000001e-06,3.3254e-06,3.3308399999999998e-06,3.38734e-06],"384":[1.19237e-06,1.19322e-06,1.19369e-06,1.1937999999999999e-06,1.1947500000000001e-06,1.19504e-06,1.1954199999999999e-06,1.19701e-06,1.1979100000000001e-06,1.2006800000000001e-06,1.20103e-06,1.2019999999999999e-06,1.2058200000000001e-06,1.24798e-06,1.2495000000000001e-06,1.2499399999999999e-06,1.25051e-06,1.2537099999999998e-06,1.2686199999999999e-06,1.3111399999999999e-06],"2304":[6.212e-06,6.2145000000000004e-06,6.2553999999999994e-06,6.2815400000000002e-06,6.3029399999999997e-06,6.3560000000000006e-06,6.4005099999999998e-06,6.4241099999999999e-06,6.4293700000000002e-06,6.4306499999999992e-06,6.511e-06,6.5128600000000005e-06,6.5221599999999997e-06,6.5311700000000007e-06,6.5312700000000001e-06,6.5356500000000007e-06,6.5728099999999998e-06,6.6440700000000001e-06,6.6580879120879127e-06,6.8872599999999999e-06],"896":[2.5960769230769231e-06,2.6080700000000001e-06,2.6106e-06,2.61586e-06,2.6236300000000002e-06,2.6282200000000002e-06,2.6329100000000001e-06,2.6379700000000004e-06,2.6384800000000001e-06,2.6503699999999997e-06,2.6674000000000001e-06,2.6852499999999998e-06,2.6903099999999997e-06,2.7080799999999998e-06,2.70847e-06,2.7193200000000001e-06,2.7447799999999998e-06,2.8503200000000002e-06,3.0578900000000001e-06,3.08354e-06],"480":[1.4003799999999998e-06,1.40225e-06,1.4085899999999999e-06,1.4087299999999999e-06,1.4098299999999998e-06,1.4103100000000001e-06,1.4105399999999999e-06,1.4120199999999999e-06,1.4123799999999999e-06,1.41319e-06,1.4156499999999999e-06,1.4196299999999999e-06,1.4321900000000002e-06,1.4776e-06,1.4795199999999999e-06,1.4819200000000001e-06,1.4936899999999999e-06,1.4942199999999999e-06,1.4994899999999999e-06,1.52131e-06],"1441792":[0.006957793000000002,0.0071871720000000012,0.0071876650000000002,0.0072115080000000002,0.0072294600000000018,0.0072551250000000029,0.0072624619999999999,0.0072932369999999993,0.0073602680000000005,0.0073631900000000004,0.0074153889999999997,0.0074294029999999968,0.007456731999999998,0.0074655520000000003,0.0074657569999999982,0.0074878380000000036,0.007538309,0.007635317,0.0077135529999999997,0.0078686250000000006],"992":[2.78184e-06,2.7950099999999998e-06,2.7966e-06,2.7976500000000002e-06,2.8282300000000003e-06,2.8389099999999999e-06,2.841e-06,2.8410899999999999e-06,2.84419e-06,2.8516200000000001e-06,2.8529700000000001e-06,2.8665800000000001e-06,2.8675100000000004e-06,2.8833400000000002e-06,2.8938000000000001e-06,2.8966899999999999e-06,2.9000000000000002e-06,2.9397500000000001e-06,3.0290900000000001e-06,3.1049999999999999e-06],"3968":[1.0916666666666668e-05,1.0972666666666666e-05,1.1023135135135135e-05,1.119482e-05,1.1220080000000002e-05,1.1222859999999999e-05,1.1228650000000284e-05,1.1266080000000001e-05,1.128886e-05,1.134817e-05,1.135347e-05,1.1420666666666666e-05,1.1441409999999999e-05,1.155676e-05,1.1641329999999999e-05,1.1674210000000002e-05,1.1677e-05,1.169301e-05,1.1792020000000001e-05,1.1816e-05],"6400":[1.68655e-05,1.6914000000000001e-05,1.7189181818181819e-05,1.790565e-05,1.7922962962962962e-05,1.7972010000000001e-05,1.8067330000000001e-05,1.8087059999999999e-05,1.8332790000000001e-05,1.8343814814814816e-05,1.8497925925925928e-05,1.8537390000000002e-05,1.8584e-05,1.8686559999999999e-05,1.8745666666666666e-05,1.877381e-05,1.8872340000000002e-05,1.899141e-05,1.938624e-05,2.031e-05],"1344":[3.7371900000000001e-06,3.7720800000000001e-06,3.7763800000000003e-06,3.7775200000000004e-06,3.7780700000000003e-06,3.7788600000000001e-06,3.7852100000000001e-06,3.7852799999999999e-06,3.7962000000000002e-06,3.7988500000000001e-06,3.8140199999999999e-06,3.8150699999999997e-06,3.8242700000000004e-06,3.8285100000000006e-06,3.8397799999999995e-06,3.8746499999999994e-06,3.87995e-06,3.8827300000000005e-06,3.89787e-06,4.1642200000000004e-06],"126976":[0.000326495,0.00034179299999999985,0.000350014,0.000351257,0.00035218000000000011,0.00035350399999999998,0.00035470966666666673,0.00035996800000000001,0.00036110600000000004,0.00036110800000000007,0.00036292699999999998,0.00036509387999999999,0.00036516700000000001,0.0003651981666666667,0.00036548800000000002,0.00036570869565217396,0.000367287,0.00036880669565217395,0.00037144930769230771,0.00037325123076923083],"2883584":[0.013875841999999996,0.014372975,0.0146074455,0.014612149999999999,0.01462916,0.014849079999999997,0.0148637435,0.014924827999999996,0.015013746999999999,0.015050516,0.0150718355,0.015098634,0.015124845,0.015195486499999994,0.0152461835,0.015348012499999999,0.015394459499999999,0.015601074499999992,0.015878039,0.016171557],"753664":[0.0021761974999999997,0.0021792345000000001,0.002183066,0.00219395175,0.0021979795000000002,0.0022011175,0.0022070850000000001,0.0022095370000000001,0.0022153967500000002,0.0022171665000000002,0.0022270322500000002,0.0022344037499999999,0.0022380797500000001,0.002238178,0.002239012749999999,0.0022426160000000002,0.002256166,0.002265254,0.0023002265,0.0023666927499999997],"16384":[4.4053e-05,4.4511555555555554e-05,4.4549000000000003e-05,4.5357166666666673e-05,4.5406166666666666e-05,4.5430200000000004e-05,4.5445620000000006e-05,4.5547010000000004e-05,4.5549230769230772e-05,4.5681874999999999e-05,4.5812509999999996e-05,4.5915609999999999e-05,4.5943071428571429e-05,4.6271330000000001e-05,4.6356999999999997e-05,4.6882571428571429e-05,4.7354539999999998e-05,4.79872e-05,4.898821e-05,4.9079379999999995e-05],"131072":[0.00035992799999999992,0.00036398699999999992,0.00036619800000000014,0.000366471,0.00036696999999999994,0.00037325473076923083,0.00037505699999999993,0.0003753029090909091,0.00037602791666666675,0.00037665500000000015,0.00037831000000000003,0.00037923699999999988,0.00037984209090909094,0.00038009843999999861,0.00038055534615384612,0.00038186045833333329,0.00038562300000000009,0.00038575800000000004,0.00038747604000000004,0.00038957768000000026],"458752":[0.0012949329999999994,0.0012971582857142856,0.0013079998571428569,0.001313182,0.0013134681428571429,0.001315688,0.001317347,0.0013199147142857143,0.0013212740000000001,0.001323397,0.0013274089999999999,0.0013279699999999999,0.0013362370000000001,0.001343084142857143,0.0013477548571428572,0.0013497720000000004,0.0013541079999999997,0.0013648250000000001,0.0013740657142857142,0.001384281],"172032":[0.00046193699999999983,0.00046845199999999995,0.00046921699999999996,0.00047961200000000003,0.00048186099999999993,0.00048778657894736838,0.00048941399999999997,0.00049304800000000005,0.00049502715789473666,0.00049648026315789477,0.0004981940000000002,0.00050076999999999999,0.00050156821052631576,0.0005024041578947367,0.00050607199999999988,0.00050782772222222211,0.00051032599999999997,0.00051674633333333359,0.00052014999999999993,0.000523122],"12288":[3.2014999999999998e-05,3.2082999999999998e-05,3.2456000000000002e-05,3.3890999999999998e-05,3.3923e-05,3.4034379999999999e-05,3.4088000000000003e-05,3.4089170000000003e-05,3.4156000000000003e-05,3.4283519999999999e-05,3.4451550000000004e-05,3.446283e-05,3.4585049999999998e-05,3.4713499999999999e-05,3.481164e-05,3.4820119047619048e-05,3.5024980000000003e-05,3.5169000000000002e-05,3.6700151515151517e-05,3.736484375e-05],"14680064":[0.077970009000000007,0.077970482000000008,0.078714002000000005,0.078815463000000002,0.079918861000000008,0.08004101399999998,0.08017242899999999,0.081917983,0.081951369999999996,0.084733120500000036,0.084802265000000043,0.085377274999999975,0.085971756999999996,0.086241164999999995,0.087271107000000001,0.087859898500000005,0.098330334999999963,0.098345072000000006,0.098922852500000005,0.10610182899999999],"1536":[4.1930399999999998e-06,4.1938999999999998e-06,4.1972100000000001e-06,4.2154750000000005e-06,4.22484e-06,4.2289999999999997e-06,4.2347899999999998e-06,4.2351599999999994e-06,4.2364900000000002e-06,4.2411899999999995e-06,4.2581800000000005e-06,4.2795700000000001e-06,4.2921799999999996e-06,4.3091400000000002e-06,4.3199900000000003e-06,4.3511599999999997e-06,4.3513600000000001e-06,4.3828300000000002e-06,4.408e-06,4.4355300000000005e-06],"25600":[6.7033999999999995e-05,7.0237971428571425e-05,7.0738520000000009e-05,7.1320764705882481e-05,7.1837999999999999e-05,7.2290000000000001e-05,7.2303000000000002e-05,7.2639999999999996e-05,7.2724899999999999e-05,7.2928000000000004e-05,7.3168919999999998e-05,7.3263411764705875e-05,7.3675010000000003e-05,7.3708600000000008e-05,7.4482419999999998e-05,7.5389419354838702e-05,7.5643979999999995e-05,7.6037800000000006e-05,7.9975249999999996e-05,8.2842990000000006e-05],"1835008":[0.008292308,0.0082950479999999993,0.0083189279999999997,0.008339779000000002,0.0084112480000000048,0.008441713,0.0084453549999999964,0.0084795630000000007,0.008485645,0.0085029330000000007,0.0085049730000000025,0.0085178440000000001,0.0085316879999999973,0.0085774500000000021,0.0086262839999999997,0.0087776190000000004,0.0087787200000000003,0.0087985649999999995,0.0088041830000000001,0.0089089140000000004],"10752":[2.9425999999999999e-05,2.9556999999999998e-05,2.9795636363636365e-05,2.979715e-05,3.0090830000000002e-05,3.0097583333333331e-05,3.0143479999999999e-05,3.0148599999999998e-05,3.0153010000000002e-05,3.0243079999999997e-05,3.027504e-05,3.0358999999999999e-05,3.0765777777777778e-05,3.0805210000000002e-05,3.0814420000000002e-05,3.1097560000000002e-05,3.1364249999999997e-05,3.136566666666667e-05,3.1656499999999998e-05,3.17812e-05],"21504":[5.5340000000000002e-05,5.7707999999999997e-05,5.8530999999999999e-05,5.9779920634920632e-05,5.9966526315789475e-05,6.0010999999999999e-05,6.0457933333333336e-05,6.084097e-05,6.1019655172413792e-05,6.1207549999999996e-05,6.1414737704918032e-05,6.1505230000000004e-05,6.1540870967741936e-05,6.1903653846153849e-05,6.2236000000000005e-05,6.2482040000000005e-05,6.2650140000000001e-05,6.269496610169492e-05,6.2923890909090906e-05,6.3265889999999993e-05],"7602176":[0.041659193500000004,0.041730320000000001,0.041732098500000002,0.0418325695,0.041924514999999996,0.042079666500000001,0.042090586999999978,0.042272031000000002,0.042297934999999974,0.04232286150000001,0.042549084000000029,0.042718424000000019,0.042916253999999994,0.042930028499999988,0.043585479500000003,0.043936359000000001,0.044031350999999982,0.044205377500000004,0.044620838000000003,0.045063835000000003],"5632":[1.48445e-05,1.4892000000000001e-05,1.5249333333333335e-05,1.5511545454545454e-05,1.557211e-05,1.5772250000000001e-05,1.5844769999999999e-05,1.5846450000000001e-05,1.5910470000000001e-05,1.593279e-05,1.5943e-05,1.5952659999999998e-05,1.595908e-05,1.6032450000000003e-05,1.6538080000000002e-05,1.658295e-05,1.6714370000000002e-05,1.702437e-05,1.7185810000000001e-05,1.7277219999999999e-05],"10":[1.4023999999999999e-07,1.4066000000000002e-07,1.4107000000000001e-07,1.4137e-07,1.4137e-07,1.4153e-07,1.4167e-07,1.4182999999999999e-07,1.4265e-07,1.4467000000000001e-07,1.4476999999999999e-07,1.4485e-07,1.4732999999999998e-07,1.4759000000000001e-07,1.4763999999999999e-07,1.4812999999999999e-07,1.4821999999999999e-07,1.4845999999999999e-07,1.522e-07,1.5353e-07],"3145728":[0.016816045000000009,0.018155802999999998,0.018357486999999999,0.018395545000000006,0.018443068999999999,0.018572281,0.018653006,0.018678653,0.018724868999999998,0.018752343000000001,0.018860136,0.018981107000000004,0.0191867085,0.0191881185,0.019228351000000008,0.019454448500000006,0.0194568135,0.019561796999999999,0.020020765999999992,0.021528700499999998],"245760":[0.00066645399999999981,0.00067495100000000002,0.00067674,0.00067747399999999985,0.00068566600000000003,0.00069419499999999999,0.00069636600000000013,0.00069643958333333333,0.00069716800000000029,0.00069918999999999971,0.00070315266666666682,0.00070693374999999969,0.00070794,0.00071798299999999962,0.00072246692307692377,0.00072308092307692324,0.00072662546153846159,0.00073050130769230766,0.00073312553846153854,0.000749262],"1728":[4.5626000000000002e-06,4.6279000000000002e-06,4.6628099999999995e-06,4.6665399999999995e-06,4.6829999999999999e-06,4.6892099999999998e-06,4.6924799999999998e-06,4.7132400000000003e-06,4.7284600000000003e-06,4.7289100000000004e-06,4.7451999999999999e-06,4.7535100000000002e-06,4.7544300000000001e-06,4.7726700000000005e-06,4.7891699999999994e-06,4.8836400000000004e-06,4.9479399999999999e-06,4.9876900000000007e-06,5.0276800000000005e-06,5.242e-06],"11":[1.427e-07,1.4317e-07,1.4331e-07,1.4338e-07,1.4338999999999999e-07,1.4341000000000001e-07,1.4341000000000001e-07,1.4359999999999999e-07,1.4369000000000001e-07,1.4392000000000001e-07,1.4403999999999998e-07,1.4420999999999999e-07,1.4436e-07,1.4496666666666666e-07,1.4814999999999999e-07,1.5021000000000002e-07,1.5024e-07,1.5109000000000001e-07,1.5109000000000001e-07,1.519e-07],"1114112":[0.0038391949999999988,0.004796898,0.0061224399999999998,0.006139182,0.0062262819999999997,0.006227949,0.0062628670000000001,0.0062760999999999997,0.0062952170000000031,0.0063449449999999977,0.0063969739999999997,0.0064011440000000001,0.0064041370000000016,0.006423230000000002,0.0064321989999999996,0.0064618380000000001,0.0065537440000000002,0.0065869859999999987,0.0066160740000000022,0.0066382110000000006],"12":[1.4429e-07,1.4471e-07,1.4473e-07,1.4473e-07,1.4475e-07,1.4490000000000001e-07,1.4501999999999998e-07,1.4574000000000001e-07,1.4586000000000001e-07,1.459e-07,1.4592e-07,1.4731000000000001e-07,1.4873000000000001e-07,1.4889000000000001e-07,1.4943000000000001e-07,1.5184000000000001e-07,1.5237000000000001e-07,1.5308999999999998e-07,1.5325999999999998e-07,1.5356999999999999e-07],"7340032":[0.040261763000000013,0.040404593999999988,0.040458002999999999,0.040576840000000003,0.040835515000000003,0.041003064499999999,0.041140002999999981,0.041232490000000004,0.041280022,0.041280953500000016,0.041384011499999998,0.041470701999999998,0.041475196999999991,0.041787357499999997,0.042073082000000019,0.042833630000000025,0.043090343500000003,0.044754666499999998,0.044878979999999999,0.046304024499999999],"7168":[1.8760999999999999e-05,1.9242999999999999e-05,1.9666499999999999e-05,1.9791000000000001e-05,1.9823e-05,1.9871530000000003e-05,1.9966025e-05,2.0022812500000002e-05,2.0089320000000002e-05,2.0145833333333333e-05,2.0167140845070424e-05,2.0240861538461536e-05,2.0305229999999999e-05,2.0729000000000001e-05,2.096376923076923e-05,2.1239879999999998e-05,2.1451555555555557e-05,2.194232e-05,2.2238e-05,2.3023210000000001e-05],"13":[1.4623999999999999e-07,1.469e-07,1.4697e-07,1.4698000000000001e-07,1.4732e-07,1.4738000000000001e-07,1.4803000000000001e-07,1.4992000000000001e-07,1.5065000000000002e-07,1.5071e-07,1.5072000000000002e-07,1.5085e-07,1.5106e-07,1.5153999999999999e-07,1.5387000000000001e-07,1.5429000000000001e-07,1.547e-07,1.5480000000000001e-07,1.5481999999999998e-07,1.5488000000000002e-07],"6029312":[0.033068246000000009,0.033096894500000008,0.03318864400000001,0.033212409499999998,0.033355285500000012,0.033411625,0.033424402999999998,0.033484341000000001,0.033550774999999998,0.033589475000000001,0.033614758500000008,0.033691172999999991,0.033818504499999999,0.033828025000000012,0.03382900099999999,0.03448888499999999,0.034586566499999992,0.03460357599999999,0.034639758999999999,0.038063885999999998],"14":[1.4922999999999999e-07,1.4931e-07,1.4931e-07,1.4945e-07,1.4970999999999998e-07,1.4971999999999999e-07,1.5011000000000001e-07,1.5117e-07,1.5131e-07,1.5308999999999998e-07,1.5412000000000001e-07,1.5449999999999999e-07,1.5605e-07,1.5633e-07,1.5636999999999999e-07,1.5724e-07,1.5736999999999999e-07,1.606e-07,1.6469e-07,1.7707999999999999e-07],"3200":[8.49e-06,8.6576666666666667e-06,9.0602100000000008e-06,9.0765899999999998e-06,9.2456899999999996e-06,9.2552700000000006e-06,9.2605799999999993e-06,9.2790299999999991e-06,9.3100200000000004e-06,9.3691600000000006e-06,9.3698800000000001e-06,9.4229999999999994e-06,9.4333750000000001e-06,9.4510199999999995e-06,9.4552299999999993e-06,9.5881599999999997e-06,9.6043099999999995e-06,9.6500000000000008e-06,9.7631599999999989e-06,1.01771e-05],"20":[1.6249999999999998e-07,1.6290000000000001e-07,1.6300999999999998e-07,1.6327999999999999e-07,1.6329e-07,1.6371999999999999e-07,1.6396999999999998e-07,1.6409000000000001e-07,1.6430999999999999e-07,1.6436999999999998e-07,1.6467e-07,1.6513e-07,1.6622000000000002e-07,1.6721000000000003e-07,1.6750000000000001e-07,1.6782999999999999e-07,1.7002000000000001e-07,1.7078000000000002e-07,1.7141e-07,1.7203000000000001e-07],"204800":[0.00056179999999999999,0.00057684499999999998,0.000579559,0.00058354999999999974,0.00058428380000000017,0.00058754300000000027,0.00058810000000000004,0.00058876800000000015,0.00059168156250000007,0.0005917027500000002,0.00059351237500000016,0.00059623406666666672,0.00059906081250000001,0.00059973962499999995,0.00061201135714285715,0.00061353746666666651,0.00061407156250000003,0.00061563428571428567,0.00061593941666666669,0.00063592],"15":[1.5131e-07,1.5141e-07,1.5143e-07,1.5147000000000002e-07,1.5162e-07,1.5167999999999999e-07,1.5237999999999999e-07,1.5257e-07,1.5262999999999998e-07,1.5264000000000002e-07,1.5327e-07,1.5456e-07,1.5865999999999999e-07,1.5894000000000002e-07,1.5895e-07,1.5932e-07,1.6306000000000001e-07,1.6317999999999998e-07,1.6320000000000001e-07,1.67e-07],"13312":[3.4563000000000001e-05,3.5338500000000001e-05,3.5735000000000003e-05,3.6152999999999998e-05,3.6375000000000003e-05,3.6765163636363633e-05,3.6831569999999999e-05,3.7033499999999997e-05,3.7051000000000002e-05,3.7295710000000003e-05,3.7329960000000001e-05,3.7389070000000002e-05,3.7649459999999996e-05,3.7708030000000001e-05,3.7830467741935484e-05,3.7909869999999999e-05,3.8163709999999996e-05,3.837309e-05,3.8788999999999997e-05,3.9420872340425534e-05],"4980736":[0.026548473,0.026685528999999993,0.026804023,0.026858265499999999,0.02692806,0.02696245299999999,0.026962872499999992,0.027016651000000013,0.027062858999999995,0.027185634,0.02722575,0.027387398,0.027401607000000001,0.027441014,0.0275286145,0.02766766,0.027689690499999992,0.027691561,0.027998717999999988,0.029677939],"118784":[0.00030664099999999991,0.00031967750000000015,0.00032147300000000002,0.00032195650000000015,0.00032524500000000016,0.00032612549999999998,0.00032905599999999999,0.00033096000000000021,0.00033120600000000001,0.00033368600000000014,0.00034027900000000013,0.00034093250000000002,0.0003450863214285714,0.00034543917857142854,0.00034650766666666672,0.00034700583333333328,0.000350665,0.0003515173333333334,0.00035786748148148141,0.00035888842307692313],"51200":[0.0001359295,0.00013813833333333335,0.00013871100000000008,0.00014006200000000007,0.00014021849999999999,0.00014062766666666663,0.00014328499999999999,0.00014578514285714286,0.000146157,0.00014634200000000004,0.00014708200000000001,0.00014726488235294118,0.00014742590476190471,0.00014768121428571429,0.00014869094915254233,0.00014979553225806454,0.00015003816129032253,0.00015024595454545458,0.00015044024193548383,0.00015167855384615308],"16":[1.5335000000000001e-07,1.5366000000000001e-07,1.5370000000000001e-07,1.5438000000000001e-07,1.5461000000000001e-07,1.5517000000000001e-07,1.5563e-07,1.5636999999999999e-07,1.5736999999999999e-07,1.5869999999999999e-07,1.6090999999999998e-07,1.6102e-07,1.6126999999999999e-07,1.6146000000000002e-07,1.6184e-07,1.6220000000000001e-07,1.6283999999999999e-07,1.6560999999999999e-07,1.6567e-07,1.6572999999999999e-07],"21":[1.6473999999999998e-07,1.6478999999999998e-07,1.6497000000000003e-07,1.6499e-07,1.6503000000000002e-07,1.6504999999999999e-07,1.6554000000000001e-07,1.6612000000000001e-07,1.6651999999999998e-07,1.6660999999999998e-07,1.6722000000000001e-07,1.6871999999999999e-07,1.6945000000000003e-07,1.6962999999999999e-07,1.6962999999999999e-07,1.6991000000000002e-07,1.7311000000000002e-07,1.7347619047619047e-07,1.7559e-07,1.8185e-07],"917504":[0.0026447989999999998,0.0026515530000000001,0.0026559820000000003,0.0026737109999999996,0.002674423,0.002697802,0.002699636,0.002705132666666667,0.002710896,0.002711668,0.0027245570000000007,0.0027469406666666661,0.0027488269999999993,0.0027565789999999999,0.0027672906666666671,0.0027686759999999999,0.0027751290000000003,0.002781725000000001,0.0028028769999999992,0.002952798],"22":[1.6649e-07,1.6670999999999999e-07,1.6777e-07,1.6782e-07,1.6875e-07,1.6903e-07,1.6971e-07,1.7095000000000001e-07,1.7141e-07,1.7295e-07,1.7643e-07,1.7692e-07,1.7716999999999999e-07,1.7783e-07,1.7859999999999997e-07,1.7966999999999999e-07,1.8076000000000001e-07,1.8091e-07,1.8187e-07,1.8244000000000001e-07],"4864":[1.2918999999999999e-05,1.3039e-05,1.3501499999999999e-05,1.3505e-05,1.3519300000000001e-05,1.353084e-05,1.3572079999999999e-05,1.3680500000000001e-05,1.3699100000000001e-05,1.376777e-05,1.380407e-05,1.3857e-05,1.389636e-05,1.4126e-05,1.4137150000000001e-05,1.4247459999999999e-05,1.4329499999999999e-05,1.4523120000000001e-05,1.4587859999999999e-05,1.556436e-05],"17":[1.5511000000000002e-07,1.5573999999999999e-07,1.5591e-07,1.5645999999999999e-07,1.5664999999999999e-07,1.5690000000000001e-07,1.5696999999999998e-07,1.5719999999999998e-07,1.5727999999999999e-07,1.5732000000000001e-07,1.5841999999999999e-07,1.6038000000000001e-07,1.6039e-07,1.6310000000000002e-07,1.6331999999999998e-07,1.6339000000000001e-07,1.6350999999999999e-07,1.6353999999999999e-07,1.6388999999999999e-07,1.6983999999999999e-07],"14848":[4.0678128205128201e-05,4.0878999999999999e-05,4.0946089999999997e-05,4.1346935483870971e-05,4.1588999999999998e-05,4.1592081081081083e-05,4.1631000000000002e-05,4.1733000000000002e-05,4.2004879999999993e-05,4.2066333333333334e-05,4.2108482758620688e-05,4.2238989999999999e-05,4.2519159999999995e-05,4.2661699999999998e-05,4.2863279999999999e-05,4.3188931034482753e-05,4.3209570000000005e-05,4.3750239999999996e-05,4.4057000000000002e-05,4.4646459999999997e-05],"23":[1.6871000000000001e-07,1.6969999999999999e-07,1.7016999999999999e-07,1.7139e-07,1.7184000000000001e-07,1.7207999999999999e-07,1.7258999999999999e-07,1.7428999999999998e-07,1.7477e-07,1.7506999999999999e-07,1.7594000000000003e-07,1.7679000000000001e-07,1.7759000000000002e-07,1.7816e-07,1.7866000000000001e-07,1.7952999999999999e-07,1.8096e-07,1.8383e-07,1.8504000000000002e-07,1.8932999999999999e-07],"786432":[0.0022481395000000016,0.0022608659999999998,0.0022612969999999998,0.0022702256666666662,0.0022750617499999988,0.0022845490000000012,0.0022982013333333333,0.0023071670000000006,0.0023130552500000004,0.0023167170000000007,0.0023174299999999997,0.00232810675,0.0023281455,0.0023468137500000001,0.0023485819999999992,0.002348621,0.0023515910000000001,0.00236949025,0.0023814939999999988,0.002405005],"18":[1.5818999999999999e-07,1.5827e-07,1.5849000000000001e-07,1.5862000000000003e-07,1.5869e-07,1.5872000000000001e-07,1.5882000000000002e-07,1.5914000000000001e-07,1.5925e-07,1.6001000000000001e-07,1.6037e-07,1.6047000000000001e-07,1.6084999999999999e-07,1.6665e-07,1.6702e-07,1.6742999999999998e-07,1.6764000000000001e-07,1.7039999999999999e-07,1.7442e-07,1.7459e-07],"1638400":[0.0054604610000000015,0.007512068000000002,0.0076873999999999996,0.0078393079999999997,0.0078985740000000002,0.0079136619999999967,0.0079598519999999982,0.0080037789999999973,0.0080067319999999973,0.0080185530000000029,0.0080386230000000034,0.0080536290000000031,0.0080678540000000028,0.00808708,0.0081120149999999967,0.008277319,0.0082774849999999994,0.0083873699999999982,0.0084469339999999997,0.0086363869999999988],"7864320":[0.041797311999999996,0.0422654165,0.042404524000000006,0.042646293000000002,0.04272794299999999,0.042735295,0.0428138645,0.04283856699999998,0.043211686999999985,0.043312744,0.043384031500000003,0.043762268,0.044000300999999999,0.044181395999999984,0.044869834000000011,0.045073229499999999,0.046077084000000004,0.046616230500000001,0.046632522999999981,0.046913187000000002],"24":[1.7150999999999998e-07,1.7184999999999999e-07,1.7275999999999999e-07,1.7282999999999999e-07,1.7363999999999999e-07,1.7385000000000001e-07,1.7449e-07,1.7452e-07,1.7506999999999999e-07,1.7529e-07,1.7543999999999999e-07,1.7583000000000001e-07,1.8204999999999999e-07,1.8283e-07,1.8303000000000002e-07,1.8406e-07,1.8422000000000002e-07,1.843e-07,1.8671999999999999e-07,1.8678000000000001e-07],"14155776":[0.073646754000000023,0.073849957000000022,0.074558049000000029,0.075369864499999981,0.075908934999999997,0.077225589999999969,0.077358873999999994,0.077920871000000003,0.078295829999999997,0.078530860000000008,0.078901379999999993,0.080197786999999993,0.080326492999999971,0.080565592000000005,0.08207488800000004,0.082770065999999962,0.086435814499999972,0.09020876949999998,0.095309966000000051,0.10002773500000001],"19":[1.6010000000000001e-07,1.6090999999999998e-07,1.6093999999999998e-07,1.6129000000000001e-07,1.6164000000000001e-07,1.6188000000000002e-07,1.6237000000000002e-07,1.6252e-07,1.6262000000000001e-07,1.6356000000000002e-07,1.6366e-07,1.6469999999999999e-07,1.6767000000000002e-07,1.6844999999999998e-07,1.6866999999999999e-07,1.6923000000000001e-07,1.6982000000000002e-07,1.7062999999999999e-07,1.7272e-07,1.7702000000000001e-07],"30":[1.9013e-07,1.9099000000000002e-07,1.9214e-07,1.9426999999999998e-07,1.9449999999999997e-07,1.9506e-07,1.9528000000000001e-07,1.9792999999999997e-07,1.9873000000000001e-07,1.9913000000000001e-07,1.9922000000000001e-07,1.9942e-07,1.9987999999999999e-07,2.0030999999999997e-07,2.008e-07,2.0091000000000002e-07,2.0333000000000001e-07,2.0351e-07,2.0907000000000001e-07,2.0961000000000001e-07],"25":[1.8082e-07,1.8084000000000002e-07,1.8217e-07,1.8268181818181819e-07,1.8274000000000001e-07,1.8284999999999997e-07,1.8286000000000001e-07,1.8309999999999999e-07,1.8414000000000001e-07,1.8637000000000002e-07,1.8760000000000001e-07,1.8957000000000002e-07,1.9069e-07,1.9128e-07,1.9133999999999999e-07,1.9222999999999999e-07,1.9243999999999999e-07,1.9403e-07,1.9422e-07,1.9905999999999998e-07],"31":[1.9231000000000001e-07,1.9273999999999999e-07,1.9436000000000003e-07,1.9964999999999999e-07,2.0045e-07,2.0068000000000002e-07,2.0127e-07,2.0157999999999998e-07,2.0188999999999999e-07,2.0234e-07,2.0248999999999998e-07,2.0261000000000001e-07,2.0328e-07,2.0397000000000002e-07,2.0398e-07,2.0416e-07,2.0423e-07,2.0424999999999999e-07,2.0673e-07,2.1168e-07],"1280":[3.4729500000000004e-06,3.4925800000000001e-06,3.4964000000000001e-06,3.5260000000000002e-06,3.5315e-06,3.5444699999999997e-06,3.5479799999999996e-06,3.5487700000000002e-06,3.5588200000000003e-06,3.55961e-06,3.5877700000000002e-06,3.59344e-06,3.60912e-06,3.6188000000000004e-06,3.6270299999999997e-06,3.664e-06,3.7407500000000001e-06,3.8358300000000002e-06,3.8363e-06,3.9030599999999997e-06],"26":[1.8287e-07,1.829e-07,1.8295000000000001e-07,1.8323999999999999e-07,1.8332e-07,1.8518181818181819e-07,1.8549e-07,1.8694999999999999e-07,1.8748148148148149e-07,1.8843e-07,1.8941e-07,1.8964e-07,1.9063000000000001e-07,1.9074999999999998e-07,1.9160999999999998e-07,1.9205999999999999e-07,1.9239999999999998e-07,1.9249000000000002e-07,1.9519000000000002e-07,2.0066999999999998e-07],"3932160":[0.018087229999999999,0.018395651000000006,0.020419643499999991,0.020844598499999978,0.020849122500000004,0.020859745999999957,0.021043208000000001,0.021117012000000008,0.0211594035,0.021213923000000006,0.021215597999999999,0.021243037999999988,0.0212872175,0.021597221,0.021622577,0.021696226000000002,0.021855097,0.02203901350000001,0.022635837000000002,0.022668608],"2432":[6.6383299999999992e-06,6.6470000000000001e-06,6.6660899999999997e-06,6.6875833333333334e-06,6.7809999999999991e-06,6.7886300000000001e-06,6.8518400000000005e-06,6.8539100000000004e-06,6.8562200000000002e-06,6.8575899999999995e-06,6.8579899999999995e-06,6.8934099999999998e-06,6.9234999999999999e-06,6.9860600000000005e-06,7.0523799999999999e-06,7.0935400000000002e-06,7.2127100000000003e-06,7.3376200000000004e-06,7.4729600000000009e-06,7.9489600000000002e-06],"32":[1.9593000000000001e-07,1.9612000000000001e-07,1.9680000000000002e-07,1.9690999999999998e-07,1.9873000000000001e-07,1.9928999999999998e-07,1.9956999999999998e-07,2.0185999999999998e-07,2.0274e-07,2.0295e-07,2.0353999999999998e-07,2.0441999999999997e-07,2.0452999999999999e-07,2.0502000000000002e-07,2.0511000000000001e-07,2.0520000000000001e-07,2.0557000000000001e-07,2.0601e-07,2.0613999999999999e-07,2.0701999999999998e-07],"27":[1.8445000000000001e-07,1.8470999999999999e-07,1.8481000000000002e-07,1.8533999999999999e-07,1.8680000000000001e-07,1.8857e-07,1.8953e-07,1.8992999999999998e-07,1.9143749999999998e-07,1.9179999999999998e-07,1.9199000000000001e-07,1.9272000000000002e-07,1.9306000000000001e-07,1.9313999999999999e-07,1.9357000000000001e-07,1.9414000000000002e-07,1.9516000000000001e-07,1.9649000000000001e-07,1.9677999999999999e-07,2.0148999999999999e-07],"409600":[0.0010946369999999999,0.0011226320000000001,0.001154628875,0.001156773,0.0011619899999999999,0.0011688860000000001,0.00117426425,0.0011760231249999999,0.0011835490000000001,0.001183656625,0.0011883170000000001,0.0011887587499999999,0.00118884575,0.00119206825,0.0011991135000000001,0.0012020111999999999,0.0012098806249999999,0.0012192044285714288,0.0012445544285714285,0.001254788142857143]}},{"title":"Array prepend, reserving capacity","results":{"28":[2.5622999999999996e-07,2.5675999999999998e-07,2.5680000000000002e-07,2.5687e-07,2.5935e-07,2.6631999999999997e-07,2.6885999999999999e-07,2.6899000000000003e-07,2.6967000000000001e-07,2.7183000000000002e-07,2.7322000000000001e-07,2.7396e-07,3.5067e-07,3.5086000000000001e-07,3.5091000000000001e-07,3.6443000000000004e-07,3.6591000000000003e-07,3.6811999999999999e-07,3.6833999999999998e-07,3.96e-07],"2432":[0.000211623,0.000211716,0.00021209749999999994,0.00021342325,0.00021476502325581395,0.00021840099999999993,0.00021892782222222222,0.0002198663555555556,0.0002205798292682927,0.00022139806976744186,0.0002214398409090909,0.00022231049999999999,0.00022326928947368423,0.00022536342105263169,0.00022596366666666662,0.00022793857575757574,0.00022845927906976743,0.00023010077777777782,0.00023443270000000002,0.00024036265853658538],"29":[2.6128000000000002e-07,2.6137999999999998e-07,2.6165000000000002e-07,2.6271e-07,2.6366999999999998e-07,2.6409999999999999e-07,2.6418000000000003e-07,2.6523e-07,2.6546e-07,2.7474000000000004e-07,2.7562999999999999e-07,2.7749000000000003e-07,2.8059e-07,2.8737000000000001e-07,2.8787e-07,3.0394000000000001e-07,3.5426999999999996e-07,3.6414000000000003e-07,3.6443000000000004e-07,3.8117000000000002e-07],"704":[1.9243710000000001e-05,1.9299869999999999e-05,1.9348200000000002e-05,1.9552340000000002e-05,1.9632140000000001e-05,1.9818337078651686e-05,1.9944810000000003e-05,2.0029789999999999e-05,2.0617569999999999e-05,2.0945e-05,2.0992000000000002e-05,2.1719709999999999e-05,2.1727830000000001e-05,2.1753279999999999e-05,2.1772785714285715e-05,2.1813629999999999e-05,2.185026e-05,2.282642e-05,2.2829190000000001e-05,2.3124480000000001e-05],"54":[3.9948999999999999e-07,4.0266999999999999e-07,4.0959e-07,4.1115000000000003e-07,4.1866999999999998e-07,4.2200000000000005e-07,4.235e-07,4.2376999999999999e-07,4.2465000000000003e-07,4.383e-07,4.4790999999999999e-07,4.5423000000000001e-07,4.5845999999999999e-07,4.7818000000000001e-07,6.4221999999999999e-07,6.4299000000000007e-07,6.4947e-07,6.5639000000000002e-07,6.6513999999999993e-07,7.0512000000000006e-07],"640":[1.5618333333333333e-05,1.5638399999999999e-05,1.5661333333333335e-05,1.5832e-05,1.610992307692308e-05,1.6215809999999999e-05,1.6319246753246753e-05,1.6372199999999999e-05,1.6407000000000001e-05,1.6637859999999999e-05,1.6854180000000001e-05,1.6863459999999999e-05,1.7737217391304349e-05,1.7741666666666666e-05,1.848732e-05,1.8501290000000001e-05,1.8552249999999998e-05,1.8588710000000001e-05,1.869616e-05,1.9885369999999999e-05],"7424":[0.002498896,0.0025238356666666666,0.0025326069999999988,0.0025387756666666672,0.0025436006666666672,0.002546113,0.0025469876666666677,0.0025543860000000001,0.0025552486666666672,0.002561664,0.0025623906666666662,0.0025866716666666668,0.0025876063333333333,0.0025935540000000001,0.0026199729999999998,0.0026420443333333341,0.0026485863333333332,0.0026493470000000002,0.0026600690000000001,0.0026638690000000001],"80":[5.9788e-07,6.0485000000000002e-07,6.0661e-07,6.1721000000000006e-07,6.1745000000000001e-07,6.2409000000000003e-07,6.3798000000000005e-07,6.5345999999999992e-07,6.6655999999999995e-07,9.6613000000000014e-07,9.6631000000000003e-07,9.6682999999999998e-07,9.6721999999999995e-07,9.6799000000000003e-07,9.6826999999999992e-07,9.7883000000000004e-07,9.8464999999999997e-07,9.8536000000000008e-07,9.935999999999999e-07,9.9531999999999994e-07],"1792":[0.00011106500000000001,0.000111086,0.00011129299999999998,0.00011454866666666663,0.00011644617105263159,0.00011777370833333331,0.00012017511428571428,0.00012078794029850755,0.000122161,0.00012226055555555556,0.00012235817647058823,0.00012318757142857142,0.00012378506944444445,0.00012426644736842105,0.000125234,0.00012526453731343285,0.0001256071733333333,0.00012768099999999999,0.00012802076388888892,0.00013130500000000007],"12800":[0.0079520099999999989,0.0079665499999999993,0.0079907730000000031,0.0080189410000000051,0.0080198769999999999,0.008022286,0.0080413669999999972,0.0080453879999999971,0.0080502309999999997,0.0080510640000000001,0.0080928930000000003,0.0081020550000000004,0.0081026359999999999,0.0081558280000000004,0.0082319000000000003,0.0082506660000000002,0.0082638629999999998,0.0083105459999999985,0.0083427759999999997,0.0084746130000000024],"22528":[0.025321897499999989,0.025473613999999999,0.025474992000000002,0.025547800999999998,0.025551269999999994,0.025555425,0.025575268000000002,0.025582231,0.025656462500000012,0.025665298,0.025704440499999998,0.0257336905,0.025751336,0.025866067499999989,0.025906085499999999,0.025993942000000003,0.026184696,0.0262144105,0.026434139500000002,0.026493627000000002],"480":[9.1996666666666676e-06,9.3517800000000011e-06,9.3682399999999989e-06,9.3755500000000004e-06,9.38586e-06,9.4735699999999998e-06,9.47706e-06,9.4774166666666668e-06,9.5529896907216496e-06,9.5542200000000005e-06,9.5609500000000003e-06,9.5787800000000008e-06,9.817750000000001e-06,1.0075150000000001e-05,1.0097129999999999e-05,1.0955169491525425e-05,1.1183939999999999e-05,1.132353e-05,1.1458055555555556e-05,1.1554160000000001e-05],"544":[1.15628e-05,1.1644166666666666e-05,1.1806079545454545e-05,1.1870171874999999e-05,1.192643e-05,1.192752e-05,1.1939080000000001e-05,1.203813e-05,1.2043729999999998e-05,1.248072e-05,1.26402e-05,1.3450999999999999e-05,1.3468e-05,1.3864719999999999e-05,1.391244e-05,1.39901e-05,1.403294e-05,1.430418e-05,1.4690459999999998e-05,1.4907849999999998e-05],"608":[1.4290999999999999e-05,1.44295e-05,1.4588094339622641e-05,1.467121e-05,1.4685650000000001e-05,1.47533e-05,1.4973999999999999e-05,1.507543e-05,1.5397830000000002e-05,1.5509210000000001e-05,1.6000560000000001e-05,1.624e-05,1.678903e-05,1.6813279999999999e-05,1.6830139999999999e-05,1.6927510000000001e-05,1.6959779999999998e-05,1.7251989999999999e-05,1.7739640000000001e-05,1.7906000000000001e-05],"56":[4.1875999999999997e-07,4.1909000000000003e-07,4.3341999999999997e-07,4.3356000000000003e-07,4.3736000000000005e-07,4.4802000000000001e-07,4.4811000000000001e-07,4.4827000000000003e-07,4.5092000000000002e-07,4.5717000000000001e-07,4.5797999999999998e-07,4.9732999999999997e-07,6.6161999999999996e-07,6.6946999999999992e-07,6.6959999999999991e-07,6.6985999999999999e-07,6.7297000000000008e-07,6.8022999999999994e-07,6.9659000000000007e-07,7.0676999999999997e-07],"464":[8.6300000000000004e-06,8.6553783783783775e-06,8.7175299999999995e-06,8.7892299999999992e-06,8.7915300000000009e-06,8.8110200000000006e-06,8.8283899999999993e-06,8.8475499999999997e-06,8.9195800000000004e-06,8.9809999999999992e-06,9.0430100000000003e-06,9.1039999999999996e-06,9.33101e-06,9.5266774193548383e-06,1.0377333333333333e-05,1.0416e-05,1.0617350000000001e-05,1.068645e-05,1.080421e-05,1.1176289999999999e-05],"18432":[0.016938904499999997,0.016992492500000001,0.017009083000000005,0.0170107605,0.017039211499999991,0.017040446000000008,0.017041149500000005,0.017083225,0.0170908525,0.0171345215,0.017144590499999994,0.017194497,0.0172196885,0.017255957999999995,0.017323859,0.017351733500000001,0.017446161999999994,0.017823160000000001,0.018911776500000001,0.019287136],"58":[4.3094999999999998e-07,4.4784999999999998e-07,4.4854000000000002e-07,4.5469999999999996e-07,4.5822999999999999e-07,4.6999000000000004e-07,4.7935000000000001e-07,4.8021000000000004e-07,4.8299999999999997e-07,4.8344000000000005e-07,4.8487999999999998e-07,4.9088000000000001e-07,4.9615999999999996e-07,6.9500999999999997e-07,6.9738000000000007e-07,6.9795999999999998e-07,7.1087999999999992e-07,7.2558999999999992e-07,7.6039999999999995e-07,7.7584999999999995e-07],"1984":[0.000140968,0.00014187250000000006,0.00014216599999999999,0.00014282800000000001,0.00014307975384615399,0.00014537280000000001,0.00014564719354838662,0.00014600439999999998,0.00014694100000000001,0.0001482458,0.00014831533333333337,0.00014836233333333332,0.00014890079999999996,0.00015079293442622952,0.00015180520000000001,0.00015247963793103448,0.00015292236065573775,0.00015415947619047614,0.00015515621153846154,0.000159407],"448":[8.0985365853658544e-06,8.1370000000000002e-06,8.1519999999999992e-06,8.157e-06,8.1689333333333324e-06,8.2340000000000011e-06,8.2528899999999995e-06,8.2762799999999993e-06,8.2918300000000012e-06,8.3427900000000001e-06,8.3492800000000001e-06,8.6675999999999998e-06,8.7780199999999993e-06,9.8139999999999995e-06,9.8349999999999999e-06,1.009693e-05,1.012998e-05,1.0147550000000001e-05,1.0162470000000001e-05,1.042854e-05],"384":[6.1296249999999998e-06,6.1862899999999997e-06,6.1948999999999998e-06,6.2243800000000004e-06,6.2613749999999998e-06,6.3832699999999991e-06,6.6125600000000006e-06,6.6358499999999993e-06,6.7702400000000003e-06,6.82258e-06,7.2427299999999997e-06,7.7096666666666667e-06,7.8561900000000004e-06,7.8709600000000003e-06,7.9271200000000004e-06,7.9409399999999999e-06,8.0113500000000008e-06,8.0187300000000004e-06,8.03214e-06,8.0789200000000012e-06],"4352":[0.00066650100000000012,0.00066782799999999998,0.000673421,0.00068365014285714284,0.00068585100000000002,0.00068885500000000004,0.00069693099999999981,0.00069753907692307702,0.00069947569230769248,0.00070159135714285717,0.0007065993846153846,0.00070805899999999982,0.00070878600000000042,0.00070965923076923094,0.00071040261538461529,0.00071682423076923003,0.00072093923076923096,0.00072309900000000027,0.0007250805384615385,0.000776868],"84":[6.3170999999999998e-07,6.3182000000000006e-07,6.4005999999999998e-07,6.4804999999999998e-07,6.5260999999999997e-07,6.5439999999999993e-07,6.582e-07,6.5822999999999999e-07,6.5897999999999994e-07,6.7815999999999998e-07,6.8682000000000006e-07,7.1060000000000002e-07,7.4119000000000003e-07,1.02897e-06,1.0303699999999999e-06,1.0327699999999999e-06,1.0357399999999999e-06,1.03994e-06,1.0479e-06,1.0548100000000001e-06],"36864":[0.069306317500000034,0.069337054999999967,0.06937855699999998,0.069564150000000019,0.06984024699999998,0.069852121500000003,0.070201936000000034,0.070219638000000001,0.070228910000000033,0.070246998500000019,0.07032956999999998,0.070470811499999966,0.07070779150000002,0.07075023950000002,0.071193407,0.071254763499999998,0.071310323499999967,0.072165957000000017,0.072625256999999999,0.077920416000000006],"368":[5.7277300000000006e-06,5.7357199999999997e-06,5.7467899999999999e-06,5.7712099999999998e-06,5.7925399999999994e-06,5.7991399999999995e-06,5.9097100000000002e-06,6.0367600000000001e-06,6.0829799999999995e-06,6.1192199999999995e-06,6.2500900000000007e-06,6.7138099999999998e-06,7.2001384615384618e-06,7.3123600000000002e-06,7.3136900000000001e-06,7.3706799999999999e-06,7.3933500000000001e-06,7.4345499999999998e-06,7.4531100000000005e-06,7.5498076923076928e-06],"2816":[0.00028645696875000007,0.00029064949999999998,0.0002943510937500001,0.00029658164285714282,0.00029723325000000089,0.00029808699999999999,0.00029946154545454535,0.00029993616129032267,0.00030095711111111117,0.00030113018749999989,0.00030398034375000001,0.00030676499999999986,0.00030765841379310339,0.00030772300000000009,0.00031115353333333333,0.00031399806666666666,0.00031618313333333324,0.00031754200000000008,0.00031815051612903226,0.00032102106666666671],"288":[3.6776499999999998e-06,3.6986e-06,3.7206799999999997e-06,3.7247499999999998e-06,3.7507899999999999e-06,3.7624199999999999e-06,3.7925600000000001e-06,3.8066399999999999e-06,3.92716e-06,3.9334299999999999e-06,3.95209e-06,3.9580300000000005e-06,4.0976299999999999e-06,4.1251100000000004e-06,4.1645099999999995e-06,4.9817399999999995e-06,4.9820799999999996e-06,4.9823461538461535e-06,4.98751e-06,5.16119e-06],"110592":[0.62667405399999998,0.62730061749999999,0.62891808900000001,0.63047826000000007,0.63060096649999997,0.63075008600000004,0.63195616600000004,0.63349620499999992,0.63438348,0.637469073,0.64209835699999995,0.64680955350000002,0.64714081150000002,0.64772620549999993,0.64775547500000008,0.64790328100000005,0.64986574050000001,0.65060326999999996,0.65900900500000004,0.66907429200000001],"14336":[0.010109145,0.0101176485,0.010143588,0.010162082499999999,0.010211005,0.010249535000000001,0.0102622485,0.010278736,0.010313735500000001,0.010319179,0.010342951,0.0103478435,0.010352308000000001,0.010381024499999999,0.010396212,0.010480334500000004,0.010501541499999996,0.010503655000000001,0.010607006,0.01081003],"88":[6.6679000000000006e-07,6.6977000000000005e-07,6.7484999999999998e-07,6.7797999999999999e-07,6.8437999999999994e-07,6.8621000000000005e-07,6.8688000000000002e-07,6.8909000000000004e-07,6.9010999999999992e-07,7.0178999999999993e-07,7.0322999999999998e-07,7.3343000000000002e-07,8.1693000000000005e-07,9.5871000000000009e-07,1.07739e-06,1.0774400000000001e-06,1.0943000000000001e-06,1.0948600000000001e-06,1.09522e-06,1.1031099999999999e-06],"1088":[4.3821818181818181e-05,4.4192749999999998e-05,4.4194179999999996e-05,4.4910400000000003e-05,4.4968420000000003e-05,4.5019850000000002e-05,4.5606499999999998e-05,4.5612999999999998e-05,4.5626999999999995e-05,4.5642333333333335e-05,4.5851570000000005e-05,4.5856760000000002e-05,4.6569000000000001e-05,4.771666666666667e-05,4.7739000000000005e-05,4.8201059999999999e-05,4.8630690000000001e-05,4.9611232323232324e-05,4.9848010101010097e-05,5.0388910000000002e-05],"1280":[5.9850469387755096e-05,5.9909560000000004e-05,6.0075032786885244e-05,6.0396222222222227e-05,6.1561377049180332e-05,6.1686786885245906e-05,6.1706000000000009e-05,6.1716000000000003e-05,6.1794500000000006e-05,6.2024050000000005e-05,6.2113110000000001e-05,6.4629999999999996e-05,6.5103640000000007e-05,6.5571137254901956e-05,6.6381400000000001e-05,6.6383102040816326e-05,6.6663632653061227e-05,6.6801279999999992e-05,6.7748000000000003e-05,7.0878019999999996e-05],"32768":[0.054524903,0.054926812000000012,0.0550791905,0.055108440999999973,0.055138809999999996,0.055222106,0.055223046500000025,0.055228200999999998,0.055262610000000011,0.055343980000000001,0.055407302000000033,0.055614232999999992,0.056019227500000011,0.05612636150000002,0.056206904000000023,0.056554865999999981,0.056656346000000003,0.056735475,0.05675520450000001,0.056811519500000005],"832":[2.5673999999999998e-05,2.616794e-05,2.6239340000000001e-05,2.6243885714285714e-05,2.6341476190476191e-05,2.6556919999999998e-05,2.6568809999999999e-05,2.657323e-05,2.6608619999999999e-05,2.6832999999999999e-05,2.7593570000000001e-05,2.7865639999999999e-05,2.7906120000000002e-05,2.8078000000000001e-05,2.928478e-05,2.9447919999999998e-05,2.9796160000000002e-05,2.980733e-05,2.980941e-05,3.0060999999999999e-05],"9728":[0.0044327865000000017,0.0044865929999999997,0.0044964209999999996,0.004511246,0.0045127399999999986,0.0045367199999999984,0.0045597279999999999,0.0045721629999999989,0.0045867920000000062,0.0045969904999999993,0.0046174020000000022,0.0046527159999999994,0.0046577575,0.0046626270000000025,0.0046760759999999986,0.0046901349999999998,0.0046928899999999999,0.004709698,0.0047756819999999998,0.0048682049999999996],"1472":[7.5652e-05,7.5723000000000007e-05,7.83716e-05,7.8859120000000007e-05,7.9287000000000002e-05,8.0066083333333332e-05,8.0160000000000005e-05,8.0568050000000009e-05,8.120239e-05,8.1741659999999994e-05,8.2023979999999998e-05,8.2318389999999994e-05,8.3570749999999999e-05,8.4339923076923078e-05,8.4579562500000007e-05,8.5364390000000005e-05,8.5453071428571442e-05,8.6575861111111118e-05,8.6938169999999998e-05,8.7519109999999994e-05],"672":[1.7522310000000001e-05,1.7792190000000002e-05,1.7817289999999999e-05,1.782273e-05,1.7878290000000001e-05,1.8090820000000001e-05,1.8097e-05,1.85762e-05,1.8725190000000001e-05,1.877739e-05,2.010295e-05,2.0138990000000001e-05,2.016509e-05,2.030873e-05,2.0495850000000001e-05,2.050915e-05,2.06917e-05,2.0786020000000002e-05,2.1001250000000002e-05,2.174181e-05],"736":[2.0238499999999999e-05,2.0764774193548387e-05,2.0905440000000001e-05,2.0972739999999999e-05,2.1009869999999998e-05,2.1017810000000001e-05,2.1146366666666668e-05,2.131164e-05,2.1596639999999999e-05,2.193637e-05,2.2236049999999999e-05,2.3430080000000003e-05,2.3442210000000001e-05,2.3617590000000002e-05,2.3633636363636362e-05,2.3728100000000001e-05,2.3875169999999999e-05,2.4097139999999999e-05,2.4306639999999998e-05,2.4818029999999997e-05],"28672":[0.041419523999999999,0.041497811000000003,0.041513973999999988,0.041596430000000004,0.041603918499999996,0.041676148999999996,0.041750990000000002,0.041755530500000013,0.041882491000000001,0.042038254999999997,0.042089388999999977,0.042164937999999999,0.042333140000000019,0.042443266,0.042488631499999999,0.042505803000000002,0.04285216,0.043217744000000009,0.044685859000000001,0.04542549000000002],"147456":[1.2153300389999999,1.249845597,1.2598758274999999,1.272559056,1.2887912770000001,1.2935956580000001,1.2995762870000001,1.304115328,1.3109351650000001,1.3179693029999999,1.3206854694999999,1.337378876,1.3629240359999999,1.368026424,1.38472445,1.4736946799999999,1.5270362070000001,1.5976434959999999],"30720":[0.047809639000000001,0.047927686999999997,0.048208873999999999,0.048223730999999978,0.048293979000000022,0.048454629000000013,0.048502289000000004,0.048579265499999989,0.048630297000000003,0.04878098099999998,0.048824938000000019,0.048839625499999997,0.049000255,0.049050673000000003,0.049122513,0.049209450000000002,0.049263540999999994,0.04930843,0.049385814,0.051625567999999997],"2304":[0.000182051,0.00018500019999999998,0.00018903633333333328,0.00019019999999999999,0.00019078333333333333,0.000190872,0.000191323,0.00019706240425531918,0.00019731875,0.000197383,0.000197806,0.000197851,0.00019892524999999997,0.00019944599999999996,0.0002003145,0.0002005654375,0.000205415,0.00020550500000000006,0.00020573665957446821,0.000206916],"576":[1.2968e-05,1.3016111111111111e-05,1.3196460000000077e-05,1.3225039999999999e-05,1.3247650000000002e-05,1.325155e-05,1.333558e-05,1.35675e-05,1.3597819999999999e-05,1.3597850000000001e-05,1.3681416666666666e-05,1.372881e-05,1.4009750000000001e-05,1.413102e-05,1.423825e-05,1.425241e-05,1.5397449999999999e-05,1.5460090000000001e-05,1.5471770000000001e-05,1.564369e-05],"8192":[0.0031124690000000001,0.003126527,0.0031370759999999999,0.0031572030000000008,0.003162107333333334,0.0031651056666666664,0.0031743750000000001,0.0031746159999999995,0.0031800730000000011,0.0031838220000000002,0.0031949683333333334,0.003197907666666667,0.0032007896666666666,0.0032027866666666668,0.0032037003333333326,0.0032052719999999999,0.0032055793333333319,0.0032670133333333336,0.003293106666666666,0.0034824115000000001],"1664":[9.9913866666666672e-05,9.9986333333333335e-05,0.00010062499999999999,0.00010098649999999999,0.00010160475,0.0001038592857142857,0.00010543211764705883,0.00010731152325581394,0.0001075636976744186,0.00010807653488372093,0.00010827519230769229,0.00010852399999999999,0.00010868031034482759,0.0001101566222222222,0.00011026513793103448,0.00011054537209302322,0.00011114462650602408,0.00011122383333333333,0.00011282483333333334,0.00011877436249999999],"90112":[0.41212351000000003,0.41283418000000005,0.41309769699999999,0.41397610000000001,0.415618443,0.41588183400000001,0.41598078500000002,0.416404408,0.41640995599999997,0.41644222400000003,0.41693391499999999,0.41782109899999997,0.42094556049999998,0.42100009399999999,0.42126199799999997,0.42130576200000003,0.422088611,0.42441340900000002,0.42926533249999999,0.42967552799999997],"496":[9.7581000000000006e-06,9.859e-06,9.8612200000000011e-06,9.9021000000000013e-06,9.9798799999999994e-06,9.9802100000000005e-06,1.003452e-05,1.005712e-05,1.006007e-05,1.0129819999999999e-05,1.0239733333333335e-05,1.035919e-05,1.037193e-05,1.070832e-05,1.1884590000000001e-05,1.1956200000000001e-05,1.2012360000000001e-05,1.20925e-05,1.233144e-05,1.2362429999999999e-05],"6656":[0.0019548170000000002,0.0019593589999999999,0.001962302,0.00196465675,0.0019648199999999999,0.0019753927499999999,0.0019769512500000001,0.0019846910000000002,0.001987773,0.0019981350000000007,0.0020118797499999999,0.0020136899999999998,0.0020141885000000007,0.0020149540000000002,0.0020335349999999995,0.0020508397500000005,0.0020611600000000002,0.0020737252499999992,0.0021757745000000007,0.0021967665000000003],"24576":[0.030352186999999985,0.030403642999999998,0.030463271,0.03048443,0.030489749,0.030493283999999992,0.030535742000000012,0.030582789999999999,0.030600007999999991,0.030624142,0.030682484499999978,0.030698795000000001,0.030751113,0.030863824999999966,0.03098602,0.031031211999999992,0.031201204,0.0312059355,0.031431491500000013,0.031661824999999998],"30":[2.5984000000000003e-07,2.6479999999999999e-07,2.6596000000000003e-07,2.6617000000000001e-07,2.6628999999999998e-07,2.6889999999999998e-07,2.6987000000000002e-07,2.7393999999999998e-07,2.7999000000000001e-07,2.8185e-07,2.8248000000000003e-07,2.8285000000000002e-07,2.9626999999999999e-07,3.1319000000000001e-07,3.6662999999999999e-07,3.6683000000000001e-07,3.6909000000000003e-07,3.6974000000000003e-07,3.7743000000000001e-07,3.8172000000000001e-07],"1856":[0.00012475799999999999,0.00012489200000000001,0.0001258698,0.00012658708571428571,0.0001266278108108108,0.00012733847142857143,0.0001285526081081081,0.00013041128571428574,0.000130448,0.00013050575000000001,0.00013056085714285712,0.00013065700000000003,0.00013102683333333332,0.00013186432352941174,0.00013356499999999999,0.00013417560294117688,0.00013654982089552232,0.00013691200000000005,0.0001370055,0.00013951994444444445],"163840":[1.6974126649999999,1.715467246,1.719577634,1.8040535765000001,1.8067140145,1.8105805749999999,1.8159274555,1.825939679,1.9024598580000001,1.9683802969999999,1.9811804710000001],"31":[2.7018e-07,2.7113000000000002e-07,2.7154000000000001e-07,2.7163e-07,2.8425000000000002e-07,2.8451e-07,2.8557999999999999e-07,2.8564000000000001e-07,2.8569000000000001e-07,3.0163999999999999e-07,3.0361999999999996e-07,3.777e-07,3.7838999999999999e-07,3.7904000000000004e-07,3.8303000000000001e-07,3.8344e-07,3.8453000000000002e-07,3.8879999999999999e-07,3.8929000000000001e-07,4.0258e-07],"9216":[0.0040095735000000004,0.0040169240000000007,0.004046277,0.0040578735000000015,0.0040638254999999998,0.0040718909999999994,0.0040891525000000001,0.0040903530000000006,0.0040907110000000012,0.0041011289999999985,0.0041053465000000008,0.0041370110000000003,0.0041417149999999998,0.0041432640000000007,0.0041441925000000003,0.004167095,0.0042120199999999986,0.0042178884999999984,0.0043091544999999997,0.0045321979999999986],"32":[2.7349e-07,2.7631000000000002e-07,2.7645000000000002e-07,2.7650999999999998e-07,2.7655999999999998e-07,2.7659999999999998e-07,2.7681e-07,2.8993e-07,2.9019999999999999e-07,2.9156e-07,2.9451000000000001e-07,2.9555000000000002e-07,2.9774000000000002e-07,3.0592000000000003e-07,3.0676999999999999e-07,3.8804000000000003e-07,3.9234999999999999e-07,3.9280999999999998e-07,3.9604000000000004e-07,3.9906000000000003e-07],"3584":[0.00044779299999999999,0.00046004190000000004,0.00046021940000000002,0.00046393050000000016,0.00046401395238095214,0.00046780840000000014,0.00046944157894736837,0.00047329300000000023,0.00047551099999999997,0.00047710415,0.00048086155000000004,0.00048342000000000003,0.00048533305000000019,0.0004960002999999998,0.00049965700000000003,0.00050520899999999974,0.00050822599999999997,0.0005107702631578948,0.0005329,0.00053825033333333315],"114688":[0.67343794599999995,0.67474142400000003,0.67931345300000001,0.67980515100000005,0.68302898499999998,0.68623867800000005,0.68829231999999996,0.68936069,0.68947452300000001,0.69592213000000003,0.6976675,0.70081370700000001,0.70152879800000001,0.70386107500000006,0.70513762499999999,0.70840225000000001,0.71272480849999997,0.7258886685,0.72615852250000001,0.84484424800000002],"960":[3.4513680555555554e-05,3.4771499999999997e-05,3.4871333333333333e-05,3.5532272727272723e-05,3.5947690000000001e-05,3.6594819999999999e-05,3.6887480000000001e-05,3.7795727272727277e-05,3.7849590000000004e-05,3.8009229999999997e-05,3.8110240000000003e-05,3.8526879999999997e-05,3.8539708333333331e-05,3.8798403846153842e-05,3.8920410000000002e-05,3.8952819999999999e-05,3.9505310000000003e-05,4.0048400000000001e-05,4.1421829999999999e-05,4.1976515151515148e-05],"17408":[0.015042492999999999,0.015061837,0.015076968,0.01509227,0.015105314999999999,0.015146600999999999,0.0151861375,0.015219887,0.0152260165,0.015229942999999996,0.0152493205,0.015271545000000001,0.015273205,0.01532728,0.015343095000000001,0.015371207,0.01540331,0.0155205845,0.015601087,0.01736731],"77824":[0.308199432,0.30919817350000001,0.31105225999999997,0.31124051699999999,0.31142955650000004,0.31228270499999999,0.31248059449999999,0.31310284300000002,0.31340132999999998,0.31353817950000001,0.31380285250000001,0.31409104900000001,0.31449671899999998,0.31475483999999998,0.3148302,0.31827748700000003,0.31967760449999999,0.32127208400000001,0.32251784,0.32356001449999999],"34":[2.8518999999999997e-07,2.8626999999999998e-07,2.9117999999999999e-07,2.9125999999999998e-07,2.9139999999999998e-07,2.9932000000000001e-07,3.0067e-07,3.0269999999999998e-07,3.0354000000000003e-07,3.0452999999999999e-07,3.1544000000000002e-07,3.2042999999999996e-07,3.5576e-07,4.0991e-07,4.1071e-07,4.1124999999999998e-07,4.1477000000000005e-07,4.1526999999999999e-07,4.3020999999999999e-07,4.3131999999999997e-07],"10752":[0.0055071180000000001,0.0055151059999999997,0.0055277019999999998,0.0055287979999999997,0.0055427650000000007,0.0055807039999999988,0.0055864630000000016,0.005591469,0.0056111780000000023,0.005626168,0.0056294299999999978,0.0056307300000000022,0.005671967,0.0056880410000000013,0.0056939480000000025,0.005710667,0.005727294,0.0058067310000000016,0.0058124829999999985,0.005926153],"864":[2.72275e-05,2.7305500000000001e-05,2.8201170000000002e-05,2.8547999999999998e-05,2.857887e-05,2.8672220000000001e-05,2.9139220000000002e-05,2.9699019999999999e-05,2.9766170000000001e-05,2.9867043478260868e-05,3.0454500000000001e-05,3.1299959999999999e-05,3.1370444444444449e-05,3.1402000000000002e-05,3.1412499999999998e-05,3.1417000000000001e-05,3.141825e-05,3.1428299999999999e-05,3.1438222222222218e-05,3.1577030000000001e-05],"928":[3.1206749999999997e-05,3.2317560000000001e-05,3.2552380000000002e-05,3.2562189999999997e-05,3.2614333333333337e-05,3.2711969999999999e-05,3.2733782608695649e-05,3.3046570000000001e-05,3.3464186046511628e-05,3.3593490000000002e-05,3.3846847058823529e-05,3.4101333333333332e-05,3.5646750000000002e-05,3.5667499999999997e-05,3.5729999999999998e-05,3.5759519999999997e-05,3.6392884057971014e-05,3.6856049999999998e-05,3.7093828125000003e-05,3.7433130000000001e-05],"60":[4.4372000000000001e-07,4.4552000000000003e-07,4.4888000000000003e-07,4.4974e-07,4.4993000000000001e-07,4.6013999999999999e-07,4.6050999999999999e-07,4.6269000000000002e-07,4.6512999999999998e-07,4.6718999999999999e-07,4.7381999999999999e-07,5.0744000000000005e-07,6.9443000000000006e-07,7.1934000000000009e-07,7.1987e-07,7.2289000000000004e-07,7.2312999999999999e-07,7.2336000000000009e-07,7.4363000000000005e-07,7.6741000000000001e-07],"1152":[4.9270210000000002e-05,4.9458500000000001e-05,4.9845000000000001e-05,5.0083649999999999e-05,5.0174110000000005e-05,5.0798090000000003e-05,5.1344258064516129e-05,5.2906130000000007e-05,5.3073979999999999e-05,5.3106499999999997e-05,5.3159999999999999e-05,5.3165259740259747e-05,5.3304299999999997e-05,5.4067459999999994e-05,5.4162339999999998e-05,5.4358490000000004e-05,5.4415619999999996e-05,5.4464359999999997e-05,5.5195987499999994e-05,5.9839145161290317e-05],"40960":[0.085393243499999993,0.08558875199999999,0.085813469999999975,0.085819861999999997,0.08613212499999999,0.08613494599999999,0.086186568999999991,0.086215947500000001,0.086237481999999976,0.086251184000000036,0.086260080999999961,0.086349084999999964,0.087016144000000004,0.087034291,0.087200834999999977,0.087638459000000002,0.0878087325,0.088059850000000023,0.088637034000000031,0.089498465000000027],"36":[2.9648000000000002e-07,2.9680000000000001e-07,2.9726999999999996e-07,2.9783000000000001e-07,2.9803999999999999e-07,3.0232000000000002e-07,3.1201e-07,3.1215e-07,3.122e-07,3.1535000000000003e-07,3.1761000000000005e-07,3.1766e-07,4.3375999999999999e-07,4.3492999999999999e-07,4.3501999999999999e-07,4.3553999999999994e-07,4.3674000000000003e-07,4.3678999999999998e-07,4.4958999999999999e-07,4.5290000000000004e-07],"6144":[0.0015775400000000001,0.0016179599999999999,0.001623516,0.001624419,0.0016295599999999999,0.0016476852000000004,0.0016500499999999995,0.0016530574,0.0016556090000000006,0.0016613892000000008,0.0016644493999999992,0.0016687371999999996,0.0016805624000000006,0.00168677,0.001697179,0.0017015654000000001,0.0017049790000000001,0.0017060736,0.0017359470000000009,0.001805549],"4608":[0.00077024000000000005,0.00077924600000000037,0.00078243000000000008,0.00078261900000000002,0.00078323899999999981,0.00078802600000000016,0.00079681200000000004,0.00079717399999999999,0.00079835545454545482,0.00080081341666666682,0.00080139500000000021,0.0008089299999999997,0.00080971958333333344,0.00081076100000000034,0.00081382272727272725,0.00081505,0.00083287381818181769,0.00083387800000000003,0.00083391300000000015,0.00084229850000000007],"768":[2.1903999999999999e-05,2.2669600000000001e-05,2.2724280000000001e-05,2.27821e-05,2.2791479999999999e-05,2.2919045454545454e-05,2.3012229999999998e-05,2.330764e-05,2.387053e-05,2.4431e-05,2.5432760000000002e-05,2.551981e-05,2.5571189999999999e-05,2.558403e-05,2.5604000000000001e-05,2.5703820000000001e-05,2.5973289999999997e-05,2.6012790000000002e-05,2.6053970000000003e-05,2.6324410000000002e-05],"62":[4.5375e-07,4.5787000000000001e-07,4.6081999999999997e-07,4.6267000000000005e-07,4.6508999999999999e-07,4.7714e-07,4.7769000000000004e-07,4.8106999999999995e-07,4.8470999999999995e-07,4.9206000000000008e-07,5.2076000000000001e-07,7.0234000000000008e-07,7.2091000000000001e-07,7.3934e-07,7.4016000000000008e-07,7.4768999999999999e-07,7.4791999999999999e-07,7.5322999999999992e-07,7.5904e-07,7.6013000000000002e-07],"16384":[0.01332757,0.013336427499999998,0.013354899999999999,0.0133686625,0.013403997500000001,0.0134051385,0.0134067605,0.013428850000000001,0.013446535000000001,0.013454796,0.013473653,0.0135013805,0.0135314435,0.013613442,0.0136343295,0.013673124,0.013696142,0.013740269499999999,0.013842815999999999,0.013947484],"38":[3.0188999999999996e-07,3.0673000000000005e-07,3.0861000000000001e-07,3.0909999999999998e-07,3.1096000000000003e-07,3.1377999999999994e-07,3.1822e-07,3.2688000000000003e-07,3.2793000000000005e-07,3.2975999999999996e-07,3.5512000000000002e-07,3.5682999999999995e-07,4.5618000000000005e-07,4.5763e-07,4.5782999999999996e-07,4.6267000000000005e-07,4.6292999999999998e-07,4.6416e-07,4.6535000000000002e-07,4.7058000000000002e-07],"3968":[0.0005334179999999998,0.00054249099999999998,0.00054492899999999999,0.00055432700000000018,0.0005700989999999998,0.00057011999999999981,0.0005728466249999999,0.00057923299999999996,0.0005797850000000002,0.00058179212499999996,0.00058405181250000015,0.00058446920000000029,0.00058773737499999998,0.00058858999999999973,0.00059008699999999977,0.00059360699999999969,0.00059483000000000018,0.00059608466666666673,0.00059655842857142853,0.00059719475000000004],"131072":[0.89034683400000003,0.89551526599999998,0.89576776999999996,0.90816222999999996,0.92250572100000006,0.93100590750000001,0.94610697899999996,0.94983263200000001,0.95348153700000005,0.95471944200000003,0.96891591600000004,0.98091753699999995,0.98198543950000006,0.98280787999999997,0.98737230949999999,1.0069254050000001,1.016750815,1.044934714,1.5358363614999999],"1344":[6.3575e-05,6.6386779999999998e-05,6.64395e-05,6.8745039999999996e-05,6.8846624999999994e-05,6.9357853658536594e-05,6.949236999999999e-05,7.0605393939393942e-05,7.0692540540540544e-05,7.0704027777777778e-05,7.0784999999999994e-05,7.0852000000000005e-05,7.1101899999999991e-05,7.1257428571428575e-05,7.1658379999999997e-05,7.1801499999999993e-05,7.238221e-05,7.4070689999999995e-05,7.5331125000000003e-05,7.5515769999999997e-05],"73728":[0.27683888849999999,0.276933437,0.2798348095,0.281001371,0.28180794799999997,0.28184940650000001,0.28190491600000001,0.28255770550000003,0.282587229,0.28259261800000002,0.28303777600000002,0.28323283999999999,0.28325513400000002,0.28356796449999999,0.28395814600000002,0.28472673199999998,0.28626410000000002,0.28961040850000003,0.2908031505,0.29158434649999998],"64":[4.6838000000000002e-07,4.6996000000000001e-07,4.7029000000000001e-07,4.7830000000000004e-07,4.7859e-07,4.7917000000000002e-07,4.7945999999999998e-07,4.7993000000000004e-07,4.8176000000000005e-07,4.8783999999999995e-07,4.8928999999999996e-07,4.8953000000000002e-07,5.0264000000000001e-07,5.2352000000000007e-07,7.6165000000000005e-07,7.6832000000000004e-07,7.6863000000000002e-07,7.8204999999999999e-07,7.8619000000000003e-07,7.9622000000000002e-07],"118784":[0.72295464300000001,0.72470874500000004,0.72503926600000002,0.72516743700000008,0.72692624849999998,0.72935154599999996,0.73433650400000006,0.73593018900000007,0.73933735199999995,0.74117648550000004,0.74138482449999998,0.74488293999999999,0.74920008900000001,0.749223325,0.75078946300000005,0.76803300600000002,0.7735222075,0.77537057600000003,0.79100806700000004,1.3772045580000001],"3072":[0.00033036999999999986,0.00033118999999999998,0.00033588899999999975,0.00033622200000000001,0.00033748399999999998,0.00034078199999999998,0.00034227275999999991,0.00034587560714285719,0.00034676684615384613,0.00034681011111111122,0.00034714680769230784,0.00034842837037037041,0.0003516787857142857,0.00035239199999999987,0.00035284699999999999,0.00035320521428571422,0.00035436703703703719,0.00035869199999999992,0.00036254199999999999,0.00036495945833333335],"1":[1.0268e-07,1.0271e-07,1.0272e-07,1.0281000000000001e-07,1.0306e-07,1.0309000000000001e-07,1.0321e-07,1.0326000000000001e-07,1.0327e-07,1.0439e-07,1.0472e-07,1.0478e-07,1.0478e-07,1.0488e-07,1.0725e-07,1.0759e-07,1.0932e-07,1.0955e-07,1.1246e-07,1.1326e-07],"1536":[8.2107000000000005e-05,8.4775052631578946e-05,8.5582785714285716e-05,8.6290058139534882e-05,8.7073840000000002e-05,8.7138868131868128e-05,8.7157750000000004e-05,8.7719384615384617e-05,9.0462625000000012e-05,9.0964500000000013e-05,9.0991999999999999e-05,9.1832068965517255e-05,9.3165166666666667e-05,9.3427133333333332e-05,9.3503499999999997e-05,9.3885300000000007e-05,9.4335000000000011e-05,9.4826074468085103e-05,9.5359282828282827e-05,9.5486e-05],"2":[1.0484e-07,1.0484e-07,1.0526999999999999e-07,1.0540999999999999e-07,1.0543000000000001e-07,1.0544999999999999e-07,1.0550000000000001e-07,1.0555e-07,1.0574999999999999e-07,1.0633e-07,1.0638999999999999e-07,1.0683e-07,1.0693000000000001e-07,1.0971000000000001e-07,1.0971000000000001e-07,1.0973e-07,1.0992000000000001e-07,1.1029e-07,1.1212999999999999e-07,1.1518999999999999e-07],"92":[7.0841999999999999e-07,7.1310999999999996e-07,7.2289000000000004e-07,7.2750000000000002e-07,7.2842999999999997e-07,7.3005e-07,7.3356999999999997e-07,7.6670999999999996e-07,7.6885999999999991e-07,7.7348999999999992e-07,7.9870000000000008e-07,8.104499999999999e-07,1.1370700000000001e-06,1.1400000000000001e-06,1.1468500000000001e-06,1.14826e-06,1.1532700000000001e-06,1.15837e-06,1.2015799999999999e-06,1.2785300000000001e-06],"3":[1.0731e-07,1.0733000000000001e-07,1.0734999999999999e-07,1.0737e-07,1.0775e-07,1.0784e-07,1.0786e-07,1.0791e-07,1.08e-07,1.0802e-07,1.0955e-07,1.0958999999999999e-07,1.0962e-07,1.1040999999999999e-07,1.1155e-07,1.1257999999999999e-07,1.1284999999999999e-07,1.142e-07,1.1464000000000001e-07,1.2769999999999999e-07],"69632":[0.24856034399999999,0.24908780950000001,0.25038123899999998,0.25045389600000001,0.250665156,0.251062493,0.25142065950000003,0.2515263425,0.25165601500000001,0.2516798985,0.252310064,0.25261142599999997,0.25341175849999997,0.25350457800000004,0.25356484899999998,0.25460655999999998,0.25599349500000002,0.2567180355,0.259097562,0.26069699299999999],"4":[1.1014000000000001e-07,1.1017e-07,1.1040999999999999e-07,1.1053000000000001e-07,1.1054999999999999e-07,1.1087000000000001e-07,1.1092e-07,1.1095e-07,1.1103000000000001e-07,1.126e-07,1.1263999999999999e-07,1.1267e-07,1.1270000000000001e-07,1.1271999999999999e-07,1.1406999999999999e-07,1.1604e-07,1.1673e-07,1.1785e-07,1.1794999999999999e-07,1.2089000000000002e-07],"68":[5.0269000000000001e-07,5.0383000000000003e-07,5.0961999999999998e-07,5.1038999999999995e-07,5.1699000000000003e-07,5.2033e-07,5.2698000000000008e-07,5.3559000000000005e-07,5.5280999999999999e-07,8.1655000000000004e-07,8.1678000000000004e-07,8.1811999999999997e-07,8.1879000000000004e-07,8.1918999999999997e-07,8.1981999999999999e-07,8.2651999999999997e-07,8.3142999999999997e-07,8.3474999999999993e-07,8.4060000000000005e-07,8.5435999999999998e-07],"5888":[0.001452379,0.001465147,0.0014678851666666665,0.0014707310000000001,0.0014881695000000001,0.001488896,0.0014929523333333332,0.0014967591666666664,0.0014987791666666666,0.0015033045,0.0015058979999999999,0.0015068356666666667,0.0015070139999999999,0.001510195,0.0015129778333333327,0.0015368883333333333,0.0015414693333333331,0.0015566016666666669,0.0015677950000000003,0.0015766490000000001],"5":[1.1342000000000001e-07,1.1348000000000001e-07,1.1348999999999999e-07,1.1352000000000001e-07,1.1374e-07,1.1379e-07,1.1415e-07,1.1525e-07,1.1566999999999999e-07,1.1571e-07,1.1578e-07,1.1583000000000001e-07,1.1589e-07,1.1744e-07,1.1895999999999999e-07,1.1920999999999999e-07,1.1929e-07,1.2113999999999998e-07,1.2298999999999999e-07,1.2501000000000001e-07],"12288":[0.0072496569999999996,0.0072786169999999994,0.0073612149999999999,0.007361846,0.007378819,0.0073799900000000003,0.0074023629999999995,0.0074193029999999995,0.0074225790000000003,0.0074247810000000001,0.0074320279999999976,0.0074524259999999998,0.0074792559999999992,0.0075048349999999996,0.0075113259999999987,0.0075132329999999994,0.007595798,0.0076156109999999996,0.0076839860000000012,0.0076913440000000027],"27648":[0.038362096499999984,0.038530793000000001,0.038622395000000004,0.038632369,0.038671819999999996,0.038722362999999989,0.038739007000000027,0.038788470000000019,0.038884644499999996,0.038886162000000002,0.038928094000000003,0.039030037000000004,0.03905157799999999,0.039060142000000013,0.039066162000000001,0.039084786500000003,0.0391413345,0.039301012000000003,0.039479005999999997,0.039547001000000012],"6":[1.1675e-07,1.1681e-07,1.1682999999999999e-07,1.1708e-07,1.1715e-07,1.1716e-07,1.1718000000000001e-07,1.1745e-07,1.1837000000000001e-07,1.1851999999999999e-07,1.1856e-07,1.1884e-07,1.1885999999999999e-07,1.1899999999999999e-07,1.2211e-07,1.2216e-07,1.2269e-07,1.2277999999999999e-07,1.2283e-07,1.2851999999999999e-07],"7":[1.1980999999999999e-07,1.2006e-07,1.2011999999999999e-07,1.2015e-07,1.2018000000000001e-07,1.2021000000000002e-07,1.2028000000000002e-07,1.2059e-07,1.2067000000000001e-07,1.2087e-07,1.2101e-07,1.2204e-07,1.2234e-07,1.2241e-07,1.2279e-07,1.2573e-07,1.2575999999999998e-07,1.2632000000000001e-07,1.3186000000000002e-07,1.3251000000000001e-07],"1920":[0.00013335674999999996,0.00013390594029850749,0.00013417568421052634,0.0001351021818181818,0.0001354208,0.000139231,0.0001392582,0.000139309,0.00013987428571428571,0.00014062514925373133,0.00014092413636363637,0.00014149899999999993,0.00014159899999999993,0.00014166872131147543,0.00014363572881355934,0.00014391392424242426,0.00014486892647058827,0.00014513357142857141,0.00014584483333333334,0.000147553],"1728":[0.000103657,0.00010929245454545456,0.00011009808235294121,0.0001111281081081081,0.00011178799999999999,0.000111804,0.00011297728947368417,0.00011412689999999999,0.00011461940740740742,0.00011474430588235296,0.00011582957746478875,0.00011586975,0.00011590915,0.00011645128235294119,0.0001166259240506329,0.00011732590140845075,0.00011769599999999999,0.00011885458024691357,0.00011902598648648647,0.00012090886585365854],"6912":[0.0021403990000000007,0.0021466199999999993,0.0021578197500000001,0.0021604964999999998,0.0021637430000000001,0.002165312,0.0021684722499999993,0.0021689370000000006,0.0021794697499999999,0.0021813540000000008,0.0021829379999999993,0.0021889715000000002,0.0021936217499999998,0.0022067105000000008,0.0022259565,0.0022285364999999994,0.0022371517500000002,0.0022446832499999998,0.0022629620000000012,0.0023927764999999998],"8":[1.2436999999999999e-07,1.2438000000000001e-07,1.2438000000000001e-07,1.2443999999999999e-07,1.2454e-07,1.2484e-07,1.2603e-07,1.2632999999999999e-07,1.2663000000000002e-07,1.2667999999999999e-07,1.2672000000000001e-07,1.2672000000000001e-07,1.2683999999999999e-07,1.3014e-07,1.3035e-07,1.3065e-07,1.3081000000000002e-07,1.3246000000000001e-07,1.3719e-07,1.4739999999999998e-07],"992":[3.5398500000000003e-05,3.6455909999999998e-05,3.7374489999999999e-05,3.7391100000000002e-05,3.7602129999999999e-05,3.8097729999999995e-05,3.8410736842105262e-05,3.8479999999999997e-05,3.9878e-05,4.0128333333333333e-05,4.0146770000000005e-05,4.0357658536585364e-05,4.1125600000000005e-05,4.1372680000000003e-05,4.149585e-05,4.1632999999999999e-05,4.1974630000000005e-05,4.2062970000000005e-05,4.2184199999999995e-05,4.246043e-05],"9":[1.2865999999999999e-07,1.2877999999999999e-07,1.2891000000000001e-07,1.2896000000000001e-07,1.2911e-07,1.2921e-07,1.2954999999999999e-07,1.2972e-07,1.3098999999999998e-07,1.3111000000000001e-07,1.3374999999999999e-07,1.3461000000000001e-07,1.3476e-07,1.3502999999999999e-07,1.3511e-07,1.3522000000000002e-07,1.3529000000000002e-07,1.3703e-07,1.3719e-07,1.4259000000000001e-07],"96":[7.4110999999999994e-07,7.4320000000000004e-07,7.5185000000000005e-07,7.5629e-07,7.6677999999999999e-07,7.7509000000000004e-07,7.7681000000000009e-07,7.9621000000000006e-07,8.2045000000000002e-07,8.4468999999999998e-07,1.1898800000000001e-06,1.1899e-06,1.1912900000000001e-06,1.2019600000000001e-06,1.2093400000000001e-06,1.21118e-06,1.2112899999999999e-06,1.22439e-06,1.2658e-06,1.27786e-06],"47104":[0.1128644815,0.11287957400000004,0.11287957850000002,0.1128799325,0.11320984750000002,0.113341214,0.11355335,0.1136228395,0.1142975175,0.11431953,0.11474185200000001,0.11476757450000002,0.11487599499999999,0.114939813,0.114941683,0.115011295,0.11516820649999999,0.1159003735,0.11655172599999999,0.120027749],"3456":[0.00041379599999999997,0.000413843,0.00042596799999999998,0.00043372699999999991,0.00043536199999999974,0.00043848300000000004,0.000439376,0.00043954915000000001,0.00044023400000000001,0.000441049,0.00044177409999999996,0.00044452199999999982,0.0004446295909090908,0.00044662836363636361,0.00044717247058823534,0.00044771471428571433,0.00045777352380952356,0.00046222499999999997,0.00046298690476190469,0.00046440199999999994],"10240":[0.0049831059999999976,0.0050075900000000019,0.0050177190000000003,0.0050334240000000016,0.0050334580000000002,0.0050366719999999999,0.0050375709999999985,0.005045387000000001,0.0050572350000000002,0.0050592390000000001,0.0050697349999999997,0.0050716309999999983,0.0050721439999999989,0.0050871809999999996,0.0050955799999999997,0.0051047649999999998,0.0051723530000000002,0.0051857680000000003,0.0052002809999999976,0.0052311680000000004],"25600":[0.032935471000000008,0.032973017,0.033067129000000001,0.033102109999999997,0.033104580499999987,0.033163144500000005,0.033194434500000002,0.033255597999999983,0.033277458999999988,0.033424148000000001,0.033438510500000011,0.033469324000000002,0.03347377,0.033506921000000002,0.0336073515,0.033701459000000017,0.033866634999999992,0.03395301949999998,0.033973680999999999,0.034237517500000002],"65536":[0.218628926,0.21864840099999999,0.21914352549999999,0.2192536155,0.219350456,0.21991769299999997,0.21997545900000001,0.21999028449999999,0.22016190250000001,0.22020913650000001,0.220348136,0.221596555,0.2223829215,0.22333957300000001,0.22363083249999999,0.22371418450000002,0.225644926,0.226304599,0.2267180885,0.22816296999999999],"896":[2.9155000000000001e-05,3.0059910000000001e-05,3.0485333333333334e-05,3.0508909090909092e-05,3.0774029999999996e-05,3.0830363636363637e-05,3.1060189999999997e-05,3.1071680000000001e-05,3.1583569999999998e-05,3.1992999999999997e-05,3.2047e-05,3.2050249999999997e-05,3.3251999999999999e-05,3.3486263736263735e-05,3.3885479999999998e-05,3.3942510000000003e-05,3.3970439999999999e-05,3.4450570000000003e-05,3.4503333333333332e-05,3.7881059999999996e-05],"13824":[0.0093412119999999963,0.0093445839999999995,0.0093446450000000004,0.0093667750000000008,0.0094123100000000036,0.0094748819999999952,0.0094914999999999965,0.0094962940000000006,0.0095194330000000042,0.0095234499999999993,0.0095267040000000039,0.0095290800000000005,0.0095643589999999997,0.0095737610000000001,0.0096319850000000044,0.0096448600000000051,0.0096679790000000019,0.0096754180000000051,0.0097292330000000003,0.009782250999999997],"3840":[0.00050894199999999997,0.00051152499999999998,0.000512883,0.00052023199999999981,0.00052935311111111086,0.00053142300000000016,0.00053310599999999999,0.00053396200000000002,0.00053553500000000018,0.00054188852941176467,0.00054333650000000001,0.00054565800000000019,0.000546727,0.0005486359999999997,0.00055071799999999974,0.00055223700000000002,0.00056896900000000022,0.00057302787500000001,0.00058886400000000003,0.00059203799999999981],"1024":[3.7537999999999999e-05,3.7568999999999999e-05,3.7784999999999998e-05,3.8802420000000001e-05,3.9023019999999997e-05,3.958062e-05,3.9640128205128208e-05,4.0684680000000006e-05,4.1794590000000001e-05,4.2700000000000001e-05,4.2722999999999997e-05,4.2724e-05,4.2948039999999999e-05,4.3014931034482757e-05,4.3152566666666671e-05,4.363415e-05,4.407344e-05,4.4644000000000001e-05,4.5140739999999996e-05,4.7673239999999999e-05],"43008":[0.09395676499999997,0.094203344000000008,0.094298726999999999,0.094811819499999964,0.094878139,0.094881383,0.094961654499999965,0.094993868999999981,0.095012508500000009,0.09501917,0.095210372000000001,0.095361709499999961,0.095520296000000005,0.095577108499999994,0.09567313899999999,0.09604388400000001,0.097041311499999977,0.097602074999999996,0.097829741499999984,0.098926751000000007],"100":[7.8612999999999996e-07,7.8990000000000005e-07,7.9230999999999998e-07,8.0734782608695655e-07,8.081599999999999e-07,8.1583999999999993e-07,8.2008999999999993e-07,8.2497999999999991e-07,8.2929999999999994e-07,8.3285e-07,8.3361000000000001e-07,8.3658000000000004e-07,8.3669000000000001e-07,8.6097000000000001e-07,1.25233e-06,1.2587300000000001e-06,1.26369e-06,1.2727300000000001e-06,1.27384e-06,1.27674e-06],"5376":[0.0011614360000000001,0.0011710149999999999,0.0011725559999999999,0.00117785,0.0011791460000000005,0.001181816,0.001182941625,0.0011833401250000001,0.0011950509999999999,0.0011975620000000001,0.001207241,0.001210285,0.001210362375,0.001214997,0.0012182,0.0012207518571428571,0.0012219215000000001,0.001225723,0.0012312810000000003,0.001253641],"19456":[0.0188635295,0.01888598500000005,0.018942197500000001,0.018947453,0.018989981,0.019007451000000002,0.019039611500000001,0.019041096,0.019144175499999999,0.019157386000000005,0.019159731500000009,0.019160670000000005,0.019241583,0.019248844000000008,0.019263651,0.019385550999999994,0.019408253,0.019422927,0.019853724,0.019879252],"21504":[0.0231008615,0.023131863999999995,0.0232188425,0.0232288605,0.023275797500000001,0.023323849999999986,0.023355980000000002,0.023358689999999998,0.023378416999999999,0.023419472,0.023450288,0.023515978999999999,0.02358569700000001,0.023625444000000002,0.023665381999999999,0.023723525000000002,0.023744826,0.023820648,0.024018533999999998,0.025034419000000002],"10":[1.3353999999999999e-07,1.3356000000000001e-07,1.3397999999999999e-07,1.3409e-07,1.3411e-07,1.3489000000000001e-07,1.35e-07,1.3511e-07,1.3519000000000001e-07,1.3535e-07,1.3682999999999999e-07,1.3701999999999999e-07,1.371e-07,1.4021999999999999e-07,1.4023000000000001e-07,1.4030999999999999e-07,1.4046999999999999e-07,1.4082000000000001e-07,1.4137e-07,1.4460000000000001e-07],"81920":[0.34232582600000006,0.34256651999999999,0.34263329300000001,0.34264625700000001,0.34322348400000002,0.34328494700000001,0.34411735399999999,0.3441617985,0.34699320850000004,0.34772251999999998,0.34833558600000003,0.348453022,0.34850653799999998,0.35022914150000001,0.35040902200000001,0.35070244,0.35280697800000005,0.35394747999999998,0.35498418700000001,0.35506002749999999],"1216":[5.5660629999999996e-05,5.5705129999999998e-05,5.5923486486486484e-05,5.5928450000000002e-05,5.6110999999999999e-05,5.7259340000000005e-05,5.8007090000000002e-05,5.8158983870967744e-05,5.8713828125000003e-05,5.872e-05,5.8733999999999997e-05,5.8814319999999998e-05,5.8817578124999997e-05,5.8891070000000001e-05,5.8956560000000001e-05,5.9482010000000005e-05,5.9957515151515144e-05,6.1806199999999998e-05,6.2151500000000003e-05,6.3443780000000009e-05],"11":[1.3911000000000001e-07,1.3922e-07,1.3925999999999999e-07,1.3972999999999999e-07,1.4023000000000001e-07,1.4035000000000001e-07,1.4049999999999999e-07,1.4058000000000001e-07,1.4088e-07,1.4105000000000001e-07,1.4107999999999999e-07,1.4158999999999999e-07,1.4639e-07,1.4647000000000001e-07,1.4657999999999998e-07,1.4691000000000001e-07,1.4708000000000002e-07,1.4747999999999999e-07,1.476e-07,1.508e-07],"6400":[0.0017846520000000001,0.0017883113999999996,0.001789431,0.0018017636000000007,0.0018165078,0.001818737,0.0018195639999999992,0.0018260728,0.0018285700000000003,0.0018347363999999995,0.0018367049999999999,0.0018367129999999992,0.0018371260000000001,0.0018591604,0.001862818,0.001867365,0.0018714810000000006,0.0018806909999999999,0.0018929820000000001,0.0020996342500000007],"12":[1.4536e-07,1.4542000000000001e-07,1.4555e-07,1.4574000000000001e-07,1.4581000000000001e-07,1.4619000000000001e-07,1.4642999999999999e-07,1.4649000000000001e-07,1.4651999999999999e-07,1.4679999999999999e-07,1.469e-07,1.4731000000000001e-07,1.4924e-07,1.5248e-07,1.5267e-07,1.5362999999999998e-07,1.5407e-07,1.5498999999999999e-07,1.6217e-07,1.7469000000000001e-07],"57344":[0.1665629555,0.16697341499999999,0.16701534200000001,0.1671577045,0.16757617250000001,0.16758262950000002,0.16758584600000004,0.16767311900000001,0.16803944700000001,0.16820836550000001,0.168315196,0.16878132099999998,0.16880308699999999,0.16883685549999999,0.16918073499999997,0.16932927,0.17104021699999999,0.17143793149999997,0.17288147649999999,0.174288833],"13":[1.5068999999999998e-07,1.5167999999999999e-07,1.5197999999999999e-07,1.5209999999999999e-07,1.5211999999999999e-07,1.5232e-07,1.5262999999999998e-07,1.5631999999999999e-07,1.5634000000000001e-07,1.5792999999999999e-07,1.585e-07,1.5866999999999998e-07,1.5954000000000001e-07,1.5981000000000003e-07,1.6016999999999998e-07,1.6198999999999998e-07,1.6364e-07,1.6583999999999998e-07,1.6677999999999999e-07,1.8022000000000001e-07],"1408":[7.3489558823529403e-05,7.3696999999999996e-05,7.373309e-05,7.3786000000000001e-05,7.4483949999999997e-05,7.5518350000000002e-05,7.6079300000000009e-05,7.7212999999999994e-05,7.7237000000000006e-05,7.7307115384615393e-05,7.7610630000000001e-05,7.7827520000000008e-05,7.8005510000000005e-05,7.9272399999999997e-05,7.9350652173913673e-05,7.9434749999999997e-05,8.0642999999999993e-05,8.101636000000001e-05,8.2041666666666664e-05,8.2581149999999998e-05],"1600":[9.386966666666666e-05,9.4180444444444433e-05,9.4850704081632652e-05,9.5070845360824754e-05,9.5881329896907222e-05,9.5891069999999999e-05,9.6205030612244894e-05,9.8142187500000006e-05,9.834335632183909e-05,9.8354000000000001e-05,9.8356999999999994e-05,9.9599999999999995e-05,9.974647777777778e-05,9.9800098591549299e-05,0.0001000361875,0.000101968125,0.000102736,0.00010318866666666668,0.0001036475,0.00010573242857142857],"14":[1.5549e-07,1.5692e-07,1.5699e-07,1.5727e-07,1.5828000000000001e-07,1.5851000000000001e-07,1.6075000000000001e-07,1.6251000000000002e-07,1.6263999999999998e-07,1.6314999999999998e-07,1.6396999999999998e-07,1.6521999999999999e-07,1.6531000000000002e-07,1.6553e-07,1.6656e-07,1.6702e-07,1.6939999999999999e-07,1.7007000000000001e-07,1.7010000000000002e-07,1.7067000000000001e-07],"200":[1.9995000000000001e-06,2.0038499999999999e-06,2.0311600000000003e-06,2.0373700000000002e-06,2.0510899999999999e-06,2.0534680851063832e-06,2.0611666666666669e-06,2.07199e-06,2.0789499999999998e-06,2.1019600000000001e-06,2.1163200000000001e-06,2.1188899999999999e-06,2.1707000000000002e-06,2.2427300000000001e-06,2.9843600000000003e-06,2.9862100000000002e-06,2.9865499999999998e-06,2.9922299999999999e-06,3.1200100000000001e-06,3.1284500000000001e-06],"20480":[0.020974905000000002,0.021075248500000008,0.021084228999999999,0.021120759999999999,0.021122694000000011,0.021147470000000005,0.021199695000000001,0.021222491,0.021233951000000001,0.021265627000000002,0.021335296,0.021556387,0.021571608500000002,0.021609961,0.021625782500000006,0.021648325500000006,0.021730280500000001,0.021741573,0.021790932000000006,0.021843267999999999],"139264":[1.0148540619999999,1.01692329,1.0310345380000001,1.042716983,1.0536446180000001,1.091243797,1.092657848,1.095638015,1.097363906,1.1003258659999999,1.1208521085000001,1.1254048759999999,1.1282552345000001,1.1309396709999999,1.131793874,1.1847164050000001,1.237634114,1.241866841],"15":[1.5983e-07,1.6061000000000001e-07,1.6133e-07,1.6137000000000002e-07,1.6141000000000001e-07,1.6741000000000001e-07,1.6918999999999999e-07,1.6982000000000002e-07,1.7025000000000001e-07,1.7455000000000001e-07,1.7568e-07,1.7659000000000002e-07,1.7703999999999998e-07,1.7958e-07,1.8289000000000002e-07,1.8295000000000001e-07,1.8519000000000001e-07,1.8527000000000002e-07,1.8553999999999998e-07,1.9232000000000002e-07],"40":[3.1909999999999999e-07,3.1957e-07,3.1974000000000003e-07,3.2658e-07,3.2681e-07,3.3417999999999999e-07,3.3809000000000003e-07,3.4001000000000004e-07,3.4077e-07,3.4934999999999999e-07,3.5824999999999997e-07,4.7704999999999995e-07,4.8217999999999999e-07,4.8356999999999993e-07,4.8804999999999993e-07,4.8850000000000007e-07,4.8856000000000003e-07,4.9653000000000001e-07,4.9734000000000003e-07,5.1157000000000002e-07],"120":[9.913599999999999e-07,9.9785999999999996e-07,9.9927999999999999e-07,1.00679e-06,1.094e-06,1.4629800000000001e-06,1.5487600000000001e-06,1.5491300000000001e-06,1.5495500000000001e-06,1.5503800000000001e-06,1.5527e-06,1.56345e-06,1.5656700000000001e-06,1.5706400000000001e-06,1.5758e-06,1.5786199999999999e-06,1.5787799999999999e-06,1.5859599999999999e-06,1.5941499999999998e-06,1.6892000000000001e-06],"112":[9.0358999999999995e-07,9.0719999999999997e-07,9.1267999999999994e-07,9.1684999999999995e-07,9.1891999999999992e-07,9.2187000000000004e-07,9.5328000000000002e-07,1.03166e-06,1.4270299999999998e-06,1.4299799999999999e-06,1.4413100000000001e-06,1.4417659574468084e-06,1.4423499999999998e-06,1.4472899999999998e-06,1.45249e-06,1.4525399999999999e-06,1.4531000000000001e-06,1.4534199999999998e-06,1.45397e-06,1.51222e-06],"16":[1.6453e-07,1.6458999999999999e-07,1.6852999999999999e-07,1.6863000000000002e-07,1.6912999999999998e-07,1.7132e-07,1.7152000000000002e-07,1.7186999999999999e-07,1.7317999999999999e-07,1.7367000000000002e-07,1.7509000000000001e-07,1.8876999999999999e-07,1.8999e-07,1.9163e-07,1.9315000000000001e-07,1.9411999999999999e-07,1.9547000000000002e-07,1.9785000000000001e-07,2.0059e-07,2.0156000000000001e-07],"104":[8.2156000000000006e-07,8.2910000000000003e-07,8.2965000000000007e-07,8.3012000000000002e-07,8.3249000000000001e-07,8.4633999999999999e-07,8.652000000000001e-07,8.8727000000000008e-07,8.9497000000000003e-07,9.1381999999999996e-07,9.5392000000000001e-07,1.3072900000000001e-06,1.3079400000000001e-06,1.3213499999999999e-06,1.32836e-06,1.33294e-06,1.3335199999999999e-06,1.3359600000000002e-06,1.4685e-06,1.6395900000000001e-06],"17":[1.6875e-07,1.6875e-07,1.6903e-07,1.6909000000000001e-07,1.6922000000000003e-07,1.6983999999999999e-07,1.7051000000000001e-07,1.7220000000000002e-07,1.7664e-07,1.7748999999999998e-07,1.7938999999999999e-07,1.9402000000000001e-07,1.9519000000000002e-07,1.9529e-07,1.9588e-07,1.9842e-07,2.0108000000000002e-07,2.0443000000000001e-07,2.1007999999999999e-07,2.1010000000000001e-07],"42":[3.2917999999999999e-07,3.2959000000000003e-07,3.2968000000000002e-07,3.2991000000000002e-07,3.3117999999999998e-07,3.3244999999999999e-07,3.3440999999999999e-07,3.3898999999999999e-07,3.5297999999999998e-07,3.6735000000000002e-07,4.9714000000000002e-07,5.0223999999999998e-07,5.0250000000000006e-07,5.0479000000000006e-07,5.0620999999999998e-07,5.0630999999999999e-07,5.0653999999999998e-07,5.0737000000000002e-07,5.074e-07,5.0750000000000001e-07],"7680":[0.002676945,0.0026828373333333331,0.0027086716666666661,0.0027120310000000002,0.002715271,0.002717831,0.0027214879999999998,0.0027280220000000001,0.002746017666666668,0.002752867,0.0027611933333333339,0.0027676026666666677,0.002771735,0.0027724586666666661,0.0028016910000000011,0.0028045789999999998,0.0028117166666666673,0.0028463220000000001,0.0029218246666666671,0.0030283239999999998],"53248":[0.14428859499999999,0.14440919099999999,0.14452570300000001,0.144564893,0.1445909755,0.144681484,0.144714552,0.14473813899999999,0.14495440500000001,0.14501790749999999,0.1451099495,0.14523360399999999,0.14528993300000004,0.14529587900000002,0.14532896849999999,0.14570849,0.14639901999999999,0.147452896,0.14761147299999999,0.15678801149999999],"18":[1.7285000000000002e-07,1.7291e-07,1.7455000000000001e-07,1.7465999999999998e-07,1.7578999999999999e-07,1.7621999999999997e-07,1.8063999999999998e-07,1.814e-07,1.8203e-07,1.8207000000000002e-07,1.8213e-07,2.0324000000000001e-07,2.0599000000000001e-07,2.0604000000000001e-07,2.0902999999999999e-07,2.1002e-07,2.1047e-07,2.1149999999999998e-07,2.1983e-07,2.2417e-07],"13312":[0.0086344990000000003,0.0086689820000000004,0.0086733389999999952,0.0086751550000000004,0.0086839249999999969,0.0086874929999999993,0.0086874980000000018,0.0087011440000000027,0.0087040209999999993,0.0087044399999999973,0.0087533569999999998,0.0087648149999999952,0.0087913030000000038,0.0087923169999999957,0.0088041669999999964,0.0088643909999999992,0.0088908069999999971,0.0088957180000000004,0.0090440739999999992,0.0090752690000000004],"3328":[0.00038536000000000001,0.00038578700000000001,0.00039071499999999998,0.000394108,0.00040227062500000014,0.000404833,0.00040544300000000012,0.00040845500000000001,0.00041091608695652173,0.00041139250000000002,0.00041433400000000003,0.00041479800000000008,0.00041531936363636368,0.00041775638095238111,0.00041826317391304346,0.00042159647619047626,0.0004256490476190476,0.00042710408695652172,0.00043009950000000004,0.00045523299999999987],"19":[1.7688000000000001e-07,1.772e-07,1.7734999999999998e-07,1.7784999999999999e-07,1.7881e-07,1.7931000000000001e-07,1.8105999999999998e-07,1.8530999999999998e-07,1.8766999999999999e-07,1.8843434343434344e-07,1.885e-07,2.1868000000000002e-07,2.1871999999999999e-07,2.1911000000000001e-07,2.198e-07,2.2174000000000003e-07,2.2711999999999998e-07,2.2737e-07,2.2775000000000001e-07,2.3013000000000001e-07],"44":[3.4119000000000005e-07,3.4150999999999999e-07,3.417e-07,3.4276999999999999e-07,3.4294000000000003e-07,3.4295000000000004e-07,3.4306e-07,3.4372000000000001e-07,3.4378999999999998e-07,3.5099e-07,3.5690999999999998e-07,3.5812000000000003e-07,3.6370000000000001e-07,3.7342000000000002e-07,5.2592000000000004e-07,5.2717999999999999e-07,5.2743000000000001e-07,5.2809000000000001e-07,5.2979000000000003e-07,5.2994000000000005e-07],"29696":[0.044467017999999997,0.044526495000000013,0.044572671999999987,0.044600650000000019,0.044620416500000017,0.0447802915,0.044782120000000009,0.044844971000000004,0.044872386999999972,0.044937152500000022,0.044959684,0.04498735299999998,0.045244257999999989,0.045299011,0.045519522999999999,0.045613459999999981,0.045656369000000002,0.046001159999999999,0.046287679999999998,0.0467643165],"31744":[0.05103849349999999,0.05134376249999998,0.051454295999999997,0.051552757999999997,0.051614095500000026,0.051666884999999996,0.051812502999999996,0.051849020999999974,0.051931953499999996,0.051934596,0.051950966000000001,0.051976494000000019,0.052006425499999995,0.052088505,0.052123417999999998,0.052126424500000004,0.052656478499999992,0.053047658499999997,0.053283155000000006,0.053307392500000016],"2688":[0.000247858,0.0002584445000000001,0.00026052333333333335,0.00026306000000000002,0.00026345999999999992,0.000263603,0.00026482649999999986,0.00026682633333333328,0.00026759,0.00026788975000000014,0.00026855668571428568,0.00026988899999999999,0.0002709248571428572,0.000272558,0.00027262940000000001,0.00027360366666666673,0.00027407521212121212,0.00027852002941176478,0.00028515800000000009,0.00028743411764705896],"46":[3.5109e-07,3.5303999999999999e-07,3.5320000000000001e-07,3.5389999999999996e-07,3.5476999999999999e-07,3.5566e-07,3.6378000000000005e-07,3.6848999999999999e-07,3.6852173913043479e-07,3.7357000000000003e-07,3.7660999999999998e-07,3.9096e-07,4.2152999999999999e-07,5.4688999999999994e-07,5.4748999999999999e-07,5.4751999999999997e-07,5.4878999999999998e-07,5.5458000000000003e-07,5.5485999999999993e-07,5.6219999999999999e-07],"49152":[0.12258314100000001,0.12282354600000001,0.12283638600000001,0.1228782585,0.12293794650000001,0.1231460305,0.123431135,0.123452621,0.12362519700000001,0.12378945500000001,0.12399918,0.124505216,0.124524098,0.12452705200000003,0.1247511915,0.12502475800000001,0.12522451900000001,0.12553593599999999,0.12648124199999999,0.13312611099999999],"51200":[0.13284967149999999,0.13351176000000001,0.13351752450000001,0.13421118800000001,0.13426226699999999,0.13427446300000001,0.134490373,0.13471819700000001,0.13475215700000001,0.13480444899999999,0.13505093500000001,0.13508256099999999,0.13511620050000001,0.135177563,0.135262402,0.13556232200000001,0.135604314,0.13642840299999998,0.13709767950000001,0.13729638799999999],"72":[5.3371999999999999e-07,5.3528125000000005e-07,5.3996000000000008e-07,5.4285000000000002e-07,5.5188000000000004e-07,5.5680000000000001e-07,5.6924000000000003e-07,5.7012999999999993e-07,8.5974000000000005e-07,8.6144999999999992e-07,8.6254000000000005e-07,8.7314999999999995e-07,8.7537000000000004e-07,8.7820999999999997e-07,8.7824000000000006e-07,8.7842000000000005e-07,8.8125000000000003e-07,8.8937000000000003e-07,8.949e-07,1.0817799999999998e-06],"3712":[0.00047635700000000001,0.00048646599999999996,0.00048844100000000005,0.00049711699999999983,0.000499104,0.0004991331052631578,0.00050010199999999988,0.000500819,0.00050089768421052627,0.000502134,0.00050324171428571432,0.00050859699999999985,0.00051088268421052617,0.00051152100000000002,0.00051483200000000001,0.00051927972222222201,0.00052205399999999999,0.00052513099999999997,0.00053141699999999996,0.00055637000000000004],"124":[9.8961000000000008e-07,9.9514999999999991e-07,9.9665000000000002e-07,9.9751000000000004e-07,1.0004e-06,1.04418e-06,1.0472399999999999e-06,1.17849e-06,1.58878e-06,1.58933e-06,1.5896100000000001e-06,1.59019e-06,1.5912399999999999e-06,1.5917299999999999e-06,1.5919099999999998e-06,1.5929200000000002e-06,1.5929499999999999e-06,1.5933700000000001e-06,1.59362e-06,1.5945099999999998e-06],"8704":[0.0035432580000000014,0.0035559800000000011,0.0035586419999999994,0.0035586820000000018,0.0035893600000000011,0.0035987379999999915,0.0036167680000000002,0.0036614314999999995,0.0036633205,0.0036690530000000011,0.0036754685,0.0036884449999999998,0.0037022115000000001,0.0037053009999999998,0.0037130729999999986,0.0037194560000000003,0.0037297315000000011,0.0037304590000000011,0.0037810025000000009,0.003809205],"106496":[0.57921220650000005,0.58056208949999999,0.58332401700000003,0.58356547700000005,0.58408131650000006,0.58698939800000005,0.58890514949999995,0.58897244599999998,0.58978883699999995,0.58983834999999996,0.59168764600000001,0.59398714500000005,0.59511063750000004,0.59934459800000006,0.59948064850000005,0.6018800165,0.60382602900000004,0.60629998799999996,0.607218488,0.64032676749999995],"48":[3.6464000000000001e-07,3.6537e-07,3.6585999999999997e-07,3.6609000000000002e-07,3.7753999999999998e-07,3.7814000000000002e-07,3.7897000000000001e-07,3.8309999999999998e-07,3.8608000000000003e-07,3.9774000000000001e-07,4.1554999999999999e-07,5.6874999999999995e-07,5.7439e-07,5.7446000000000002e-07,5.7982999999999992e-07,5.8045999999999994e-07,5.8851000000000002e-07,5.8962000000000006e-07,5.9116000000000001e-07,7.1628999999999996e-07],"116":[9.367700000000001e-07,9.411699999999999e-07,9.4568999999999994e-07,9.4631999999999997e-07,9.4903999999999998e-07,9.5527e-07,9.9639000000000004e-07,1.0323399999999999e-06,1.49169e-06,1.49439e-06,1.49465e-06,1.4950099999999999e-06,1.502e-06,1.5044599999999999e-06,1.50603e-06,1.50929e-06,1.51505e-06,1.5175099999999999e-06,1.5175299999999999e-06,1.86897e-06],"108":[8.6198000000000005e-07,8.6262999999999999e-07,8.6551000000000008e-07,8.6686000000000007e-07,8.7385000000000001e-07,8.7670999999999997e-07,8.8260999999999999e-07,8.8729e-07,9.0926000000000008e-07,9.3364999999999995e-07,1.3696899999999999e-06,1.3727e-06,1.3795800000000002e-06,1.38014e-06,1.38087e-06,1.3810600000000002e-06,1.39236e-06,1.39503e-06,1.4004600000000001e-06,1.7055799999999999e-06],"15872":[0.012452979999999999,0.012465287,0.012472389,0.012524117,0.012536411000000003,0.0125535865,0.012567417000000001,0.012577982,0.01257864,0.012611569,0.0126181105,0.012631676,0.012671008500000001,0.012701577,0.012819654,0.012836196000000005,0.012842563999999997,0.012891620500000006,0.012950485500000001,0.013055068499999999],"400":[6.6764299999999997e-06,6.6770499999999999e-06,6.6778499999999991e-06,6.6821666666666659e-06,6.6942399999999996e-06,6.7107199999999997e-06,6.7114699999999996e-06,6.7843899999999999e-06,6.8015399999999994e-06,7.2845400000000006e-06,7.3802199999999998e-06,8.2194400000000007e-06,8.2397500000000002e-06,8.3822700000000006e-06,8.4213000000000002e-06,8.4709799999999993e-06,8.4979299999999991e-06,8.5651599999999995e-06,8.6610000000000006e-06,9.0333500000000005e-06],"320":[4.4146899999999996e-06,4.4322499999999998e-06,4.4399399999999999e-06,4.4671400000000002e-06,4.4915299999999997e-06,4.4924200000000001e-06,4.4945899999999994e-06,4.5093333333333336e-06,4.51925e-06,4.5209299999999998e-06,4.5347099999999998e-06,4.5402600000000001e-06,4.6605999999999999e-06,4.6732499999999997e-06,4.6744200000000002e-06,4.76719e-06,4.7821899999999999e-06,5.8257999999999993e-06,5.8381299999999996e-06,6.1039600000000001e-06],"102400":[0.53989951700000005,0.54070625900000002,0.54088494649999996,0.54256288399999997,0.54287730699999992,0.54347875499999998,0.54348386699999995,0.54478152400000002,0.54493798100000002,0.54591372299999996,0.54613412750000001,0.54669628100000001,0.549242114,0.55164735600000003,0.55182397000000005,0.55262724500000004,0.55631463699999995,0.55741045299999992,0.56228004899999995,0.57629306999999996],"76":[5.6927000000000001e-07,5.7024999999999996e-07,5.7516000000000008e-07,5.7856000000000001e-07,5.8363999999999995e-07,5.9826999999999997e-07,6.1507999999999992e-07,6.1613999999999996e-07,6.3015999999999997e-07,6.7717000000000007e-07,8.7665999999999996e-07,9.1892999999999998e-07,9.1914000000000006e-07,9.2243000000000004e-07,9.2360000000000004e-07,9.3195000000000003e-07,9.3912000000000006e-07,9.4011999999999992e-07,9.4182000000000005e-07,9.4580000000000001e-07],"240":[2.7322599999999998e-06,2.7443500000000002e-06,2.7605700000000003e-06,2.7670899999999999e-06,2.8000399999999997e-06,2.8191799999999999e-06,2.8359000000000002e-06,2.9244999999999997e-06,2.9465200000000002e-06,3.0065200000000001e-06,3.82849e-06,3.8353299999999999e-06,3.8361200000000001e-06,3.8409900000000003e-06,3.84187e-06,3.8433400000000004e-06,3.8460799999999998e-06,3.8494699999999998e-06,4.0236200000000005e-06,4.0308800000000001e-06],"304":[4.0922400000000007e-06,4.1070400000000001e-06,4.1073599999999996e-06,4.1142700000000002e-06,4.1160900000000004e-06,4.1316200000000001e-06,4.1338699999999999e-06,4.1411300000000004e-06,4.1416499999999996e-06,4.1449099999999998e-06,4.2192799999999999e-06,4.2863099999999998e-06,4.3033299999999995e-06,4.3141900000000003e-06,5.40976e-06,5.4103800000000002e-06,5.50131e-06,5.57454e-06,5.6650799999999996e-06,5.8702299999999997e-06],"45056":[0.103056912,0.10335699399999999,0.1036949325,0.103804773,0.1041986285,0.104234779,0.10427028300000001,0.1042851385,0.104340273,0.10439975,0.104425832,0.10444015700000001,0.10459926899999999,0.1047149,0.10529508499999995,0.10542172,0.10583578599999999,0.106737229,0.1110312155,0.11168447400000001],"232":[2.61537e-06,2.6211799999999999e-06,2.63912e-06,2.6566399999999999e-06,2.65908e-06,2.6601800000000003e-06,2.6605799999999999e-06,2.678e-06,2.6866299999999998e-06,2.7144600000000002e-06,2.7395499999999999e-06,2.78351e-06,2.8800700000000002e-06,2.9404799999999999e-06,3.6531299999999998e-06,3.65438e-06,3.6600399999999999e-06,3.6601100000000002e-06,3.8290999999999995e-06,3.8348499999999994e-06],"5632":[0.001264212,0.0013187070000000001,0.0013249759999999994,0.0013293000000000005,0.001334348,0.0013354255714285715,0.0013483577142857145,0.0013504346666666669,0.0013542657142857147,0.0013558297142857144,0.0013566737142857144,0.001360944,0.00136458,0.0013674472857142855,0.0013758284285714287,0.0013860709999999994,0.001396879285714286,0.0014200511666666664,0.0014319394999999999,0.0014870299999999999],"160":[1.42738e-06,1.4278199999999998e-06,1.449e-06,1.4522299999999998e-06,1.4569e-06,1.45918e-06,1.46497e-06,1.4732708333333332e-06,1.50681e-06,1.5214499999999998e-06,1.60153e-06,1.63401e-06,2.2119699999999998e-06,2.2124799999999999e-06,2.2146700000000002e-06,2.2198000000000003e-06,2.2238199999999999e-06,2.3182999999999999e-06,2.3199800000000001e-06,2.4307899999999998e-06],"224":[2.4674599999999998e-06,2.4683900000000001e-06,2.4844299999999999e-06,2.4894700000000001e-06,2.4970899999999999e-06,2.5032982456140351e-06,2.50412e-06,2.5232000000000003e-06,2.52497e-06,2.5303100000000004e-06,2.5355799999999998e-06,2.55561e-06,2.55736e-06,2.6423300000000001e-06,2.7140200000000003e-06,3.4850000000000001e-06,3.48966e-06,3.4921800000000001e-06,3.4921899999999999e-06,3.4932300000000003e-06],"23552":[0.027888168499999998,0.027922237500000002,0.027971431000000001,0.027990358,0.028015153500000008,0.028056033500000001,0.028100325000000002,0.028100805499999992,0.028151285999999998,0.028213261,0.028298582999999999,0.0283016135,0.028318187000000012,0.028356717,0.028410181499999999,0.028411054500000015,0.0285369405,0.028602236,0.028907125499999999,0.0289519125],"152":[1.3116399999999999e-06,1.3122000000000001e-06,1.3499200000000001e-06,1.3512800000000002e-06,1.35138e-06,1.3626000000000001e-06,1.39068e-06,1.4086599999999999e-06,1.4111000000000001e-06,1.5616999999999998e-06,2.0682e-06,2.06917e-06,2.0704399999999999e-06,2.0716900000000001e-06,2.0717700000000002e-06,2.0733900000000001e-06,2.07368e-06,2.0738299999999999e-06,2.0803499999999999e-06,2.1677538461538461e-06],"216":[2.3340500000000001e-06,2.3480600000003182e-06,2.3584285714285717e-06,2.3683799999999999e-06,2.3697299999999999e-06,2.37745e-06,2.3835800000000002e-06,2.3871800000000001e-06,2.4016400000000003e-06,2.41096e-06,2.43503e-06,2.4401300000000001e-06,2.4737199999999998e-06,2.52836e-06,2.5488000000000001e-06,2.5732499999999999e-06,2.6127899999999999e-06,3.30693e-06,3.3182300000000002e-06,3.3246000000000003e-06],"38912":[0.07695377149999999,0.07731660600000001,0.077400484499999977,0.077480084000000005,0.077501476999999999,0.077667475,0.077680825500000009,0.077687012,0.077962035999999971,0.078187842000000007,0.078197551500000004,0.078243245000000003,0.078264519000000005,0.078316520000000001,0.078763941500000004,0.078831035999999993,0.079064411999999987,0.079073197000000012,0.080036246000000005,0.082476308499999984],"144":[1.21734e-06,1.22222e-06,1.2295700000000001e-06,1.2709900000000001e-06,1.2739699999999998e-06,1.2741900000000002e-06,1.2897999999999999e-06,1.9305e-06,1.9307899999999999e-06,1.93188e-06,1.9325000000000001e-06,1.9327499999999998e-06,1.9328500000000001e-06,1.9332200000000001e-06,1.9332200000000001e-06,1.9335300000000002e-06,1.9339600000000002e-06,1.9874400000000001e-06,2.0223600000000001e-06,2.0231499999999998e-06],"208":[2.2047727272727271e-06,2.2147799999999998e-06,2.2154799999999997e-06,2.2338000000000001e-06,2.2844300000000001e-06,2.3235000000000003e-06,2.3317399999999999e-06,2.3929999999999998e-06,2.4024000000000001e-06,2.5648100000000003e-06,2.58114e-06,3.14049e-06,3.1499799999999998e-06,3.1509799999999999e-06,3.1523400000000001e-06,3.1560300000000003e-06,3.1606100000000001e-06,3.2880799999999998e-06,3.2972600000000003e-06,3.2983799999999999e-06],"7168":[0.0023006716666666665,0.0023075039999999989,0.0023158670000000001,0.002322565,0.0023233849999999994,0.0023532420000000006,0.0023548512500000001,0.0023641690000000002,0.0023644550000000001,0.0023775669999999993,0.0023870724999999998,0.0023897339999999997,0.0024006019999999999,0.0024077260000000002,0.0024171304999999988,0.0024470876666666678,0.0024666459999999999,0.0024829960000000008,0.0026062813333333329,0.0026521043333333329],"136":[1.11728e-06,1.1195882352941176e-06,1.12611e-06,1.17735e-06,1.79342e-06,1.7944900000000001e-06,1.7946200000000001e-06,1.7948500000000001e-06,1.7963799999999999e-06,1.7964300000000001e-06,1.79666e-06,1.79691e-06,1.7982499999999999e-06,1.7985e-06,1.7990512820512821e-06,1.8068100000000001e-06,1.8700000000000001e-06,1.8772899999999999e-06,1.8792999999999999e-06,1.8805100000000001e-06],"2176":[0.00017048600000000002,0.00017172287500000007,0.00017185120000000001,0.000173833,0.00017385366666666677,0.00017526404444444442,0.00017632505454545457,0.0001767272000000001,0.00017676500000000001,0.00017709550000000001,0.00017714900000000006,0.00017724166666666669,0.00017751100000000004,0.0001788909999999999,0.00017918254901960786,0.000179548,0.00018080028571428576,0.00018332785714285713,0.0001850860754716982,0.00018830958000000002],"11776":[0.0067251749999999999,0.0067254249999999984,0.0067289279999999977,0.0067333989999999958,0.0067429780000000019,0.006750448,0.0067524539999999997,0.0067834779999999999,0.006813365,0.0068242200000000015,0.0068275639999999969,0.0068278670000000031,0.0068309,0.0068915169999999998,0.0069116070000000002,0.0069221269999999975,0.006978139000000003,0.0070352999999999969,0.0070763040000000029,0.0071729069999999975],"128":[1.0285600000000002e-06,1.03029e-06,1.03502e-06,1.03875e-06,1.0885100000000001e-06,1.0889799999999999e-06,1.66162e-06,1.6628100000000001e-06,1.6628599999999999e-06,1.66422e-06,1.66451e-06,1.6646599999999999e-06,1.6647600000000001e-06,1.6647699999999999e-06,1.6650000000000002e-06,1.6662e-06,1.66653e-06,1.6666399999999999e-06,1.66673e-06,1.68942e-06],"63488":[0.20473809300000001,0.20476713700000004,0.20485115700000001,0.20493584400000001,0.20509293000000001,0.20515887099999999,0.20520320450000001,0.20561632000000002,0.20582648599999998,0.20620506599999999,0.206523709,0.20679674849999999,0.20780395900000001,0.2078061585,0.20808365699999998,0.208359823,0.20850078299999997,0.21133054400000001,0.21213251350000001,0.216389792],"98304":[0.49293160200000002,0.493056877,0.49421299899999999,0.49474781849999999,0.49506167000000001,0.49613520449999998,0.49630762699999997,0.49825874199999998,0.49873452350000003,0.498920052,0.50298265200000003,0.50412200600000001,0.50623199200000002,0.50671504000000001,0.50741356199999998,0.51246071299999996,0.51453475100000001,0.52138728599999995,0.52143077500000001,0.54610957449999997],"122880":[0.77602840299999998,0.77960764599999999,0.78711069199999995,0.79374396000000003,0.79506522750000008,0.79652155250000001,0.79911888600000003,0.80132261999999999,0.80466345449999999,0.80625238399999999,0.80648348400000003,0.80720460150000006,0.80897628199999994,0.82070830299999997,0.82398020650000003,0.82515621399999994,0.82585605699999998,0.89297204800000007,0.91278899499999999],"3200":[0.000364767,0.000365566,0.000374194,0.000374707,0.000375089,0.000377186,0.00037967083999999987,0.00038007524999999999,0.00038020548000000003,0.00038024460000000011,0.00038055504347826085,0.00038361900000000008,0.00038776056000000016,0.00038917634782608703,0.00039043511999999997,0.00039049684,0.00039333199999999998,0.00040248500000000001,0.00041206200000000004,0.000416074],"59392":[0.17950219000000001,0.17957131300000001,0.17992794000000001,0.17999237499999998,0.180067437,0.18032648000000001,0.18038183999999999,0.180446622,0.18070154500000002,0.18073804700000001,0.18096130799999999,0.18104019299999999,0.18115457800000001,0.18145938649999999,0.18186978399999998,0.1821513085,0.182929702,0.18350272000000001,0.18359835199999999,0.18535767450000001],"155648":[1.401820018,1.413711191,1.414177934,1.4524166919999999,1.4718785715,1.5145276270000001,1.5148032759999999,1.523227369,1.53135344,1.5475536569999999,1.554380742,1.5644420409999999,1.564785753,1.565564161,1.600086074,1.6522000459999999],"61440":[0.19193938999999999,0.1920242295,0.192037719,0.1925649485,0.192743043,0.19295115500000001,0.19299944599999999,0.19311157800000001,0.19318202900000003,0.193212259,0.19329381349999999,0.193428765,0.193521163,0.19428585200000001,0.194459519,0.19519193600000001,0.19551678700000003,0.1965013615,0.199889397,0.20156584799999999],"2560":[0.00023426,0.000234424,0.00023457805000000001,0.00023582899999999998,0.00023692066666666672,0.000237817,0.00023870899999999998,0.00023999200000000007,0.000240962,0.0002414978536585366,0.00024183599999999988,0.00024257400000000001,0.00024262700000000009,0.000242725,0.00024558775675675667,0.00024568600000000001,0.00024612412499999995,0.00025023299999999999,0.00025093635897435897,0.00025157471794871785],"34816":[0.061369280999999977,0.06138429699999999,0.06203757900000003,0.06203844,0.062111281500000004,0.0622502905,0.06234938200000003,0.062357959000000004,0.06239261950000001,0.062470667000000001,0.06250995849999999,0.062765719000000011,0.062832179000000016,0.062884802000000004,0.063218278000000031,0.063278000000000001,0.063332037999999979,0.063472629500000002,0.064270727999999999,0.065418456],"4096":[0.00059767900000000027,0.000606187,0.00061126900000000001,0.00061345300000000024,0.00061385818750000001,0.00061505106666666658,0.00061585806666666671,0.00061921226666666678,0.000620544,0.00062191699999999961,0.00062208133333333329,0.00062273671428571427,0.00062541133333333314,0.00062748953333333329,0.00063375466666666679,0.00063553500000000011,0.00063739299999999999,0.0006408181428571427,0.00064767833333333332,0.00068011242857142691],"94208":[0.45274250100000002,0.45326635199999998,0.45374102299999997,0.45418901700000003,0.45457797200000005,0.45475827349999998,0.45500038500000001,0.456385559,0.45701989050000003,0.45778400899999999,0.45881543899999999,0.45899972099999997,0.45991213549999999,0.46398542199999998,0.46410279900000001,0.46754786850000002,0.46858053550000001,0.46934703799999999,0.47238845800000001,0.47686282499999999],"5120":[0.001035364,0.0010477710000000003,0.0010580245555555554,0.0010584462222222224,0.0010586398888888884,0.001060505,0.0010612880000000001,0.0010623850000000001,0.0010651337777777777,0.001065863,0.0010703086666666666,0.001072677,0.0010737869999999999,0.0010788768888888886,0.0010821672222222226,0.0010848646249999993,0.001090887,0.0011095405,0.001111815625,0.0011842139999999994],"55296":[0.155493981,0.15559004599999998,0.15587234800000005,0.15591229200000001,0.15599586899999995,0.15613575399999999,0.15624550100000001,0.15630630700000001,0.15636261900000001,0.15642347699999998,0.156435249,0.15645326300000001,0.156618383,0.15667666999999999,0.15668441899999999,0.157480115,0.15748263600000001,0.15808018800000001,0.158888376,0.161334317],"512":[1.0341299999999999e-05,1.0344e-05,1.0357666666666666e-05,1.066848e-05,1.0671569999999999e-05,1.0702150000000001e-05,1.0719449999999999e-05,1.072789e-05,1.076556e-05,1.0829959999999999e-05,1.1190790000000001e-05,1.13463e-05,1.1356190000000001e-05,1.1384e-05,1.1868619999999998e-05,1.2177e-05,1.2638549999999999e-05,1.2693780000000001e-05,1.2704339999999999e-05,1.296643e-05],"15360":[0.0116783705,0.0117294975,0.0117316125,0.011733026000000004,0.0117466115,0.011753728,0.0117656845,0.011784882,0.0118416045,0.011843908,0.011861092,0.011863864,0.0118706525,0.0119154725,0.011972768999999998,0.0120106495,0.012063443,0.012153263500000001,0.012173024000000001,0.013328943999999999],"432":[7.5909999999999998e-06,7.6568571428571432e-06,7.7262499999999991e-06,7.7538500000000003e-06,7.7617799999999994e-06,7.7884600000000006e-06,7.8067600000000001e-06,7.85105e-06,7.9135699999999995e-06,7.9341199999999988e-06,7.9383600000000007e-06,8.006340000000001e-06,8.035520000000001e-06,8.4476500000000003e-06,9.0457499999999989e-06,9.5818000000000003e-06,9.6248700000000012e-06,9.7009200000000003e-06,9.747e-06,9.9593899999999992e-06],"20":[1.8154e-07,1.8218000000000001e-07,1.8246000000000001e-07,1.8267000000000001e-07,1.8297e-07,1.8326000000000001e-07,1.8371e-07,1.8372999999999999e-07,1.8470999999999999e-07,1.8649999999999998e-07,1.9067e-07,1.9103000000000001e-07,1.9215999999999999e-07,1.9392000000000001e-07,2.2781e-07,2.2787000000000001e-07,2.2966999999999999e-07,2.3074999999999997e-07,2.3146999999999999e-07,2.3938999999999998e-07],"2944":[0.00030387700000000009,0.000305631,0.00030869999999999991,0.00031441909677419356,0.0003170968666666666,0.00031806399999999985,0.00031861500000000001,0.00031985899999999987,0.00031990400000000009,0.00032127809999999991,0.000322133,0.00032269850000000001,0.000323851,0.00032400300000000001,0.00032418900000000001,0.000324684,0.00032604599999999997,0.00032636282758620688,0.0003400439999999999,0.00034269900000000002],"352":[5.2412099999999997e-06,5.2815000000000002e-06,5.2982000000000004e-06,5.3108799999999997e-06,5.3202643678160922e-06,5.3239800000000005e-06,5.3561400000000005e-06,5.3564400000000003e-06,5.3623299999999999e-06,5.36824e-06,5.36996e-06,5.4121499999999995e-06,5.5898099999999993e-06,5.7568099999999995e-06,5.7577799999999996e-06,6.2231555555555552e-06,6.2766899999999997e-06,6.7324699999999999e-06,6.8644099999999997e-06,6.9179699999999993e-06],"416":[7.1048799999999998e-06,7.1265100000000001e-06,7.14961e-06,7.1672999999999991e-06,7.17511e-06,7.1860900000000007e-06,7.2097299999999993e-06,7.3030899999999997e-06,7.3134800000000007e-06,7.3154700000000001e-06,7.3661911764705878e-06,7.4364200000000002e-06,7.6000799999999997e-06,7.8598399999999999e-06,8.3479500000000003e-06,8.7243787878787891e-06,9.0718000000000001e-06,9.1053700000000005e-06,9.1336699999999999e-06,9.4437900000000003e-06],"21":[1.8655000000000001e-07,1.8669000000000001e-07,1.8694000000000001e-07,1.8706000000000001e-07,1.8708e-07,1.8790999999999999e-07,1.8881999999999999e-07,1.9448000000000001e-07,1.9598000000000001e-07,1.9627e-07,2.0557000000000001e-07,2.3575e-07,2.3764e-07,2.3767999999999999e-07,2.3802999999999999e-07,2.3865999999999999e-07,2.3991999999999999e-07,2.4106000000000002e-07,2.4578999999999998e-07,2.4910000000000003e-07],"7936":[0.002923606,0.0029285749999999988,0.002932343,0.0029342376666666725,0.0029360150000000002,0.002936078,0.0029401169999999999,0.0029439449999999999,0.0029480159999999986,0.0029695706666666671,0.002970033,0.0029725179999999999,0.0030269576666666666,0.0030318259999999992,0.0030330813333333327,0.003033633,0.0030413320000000012,0.0030618240000000007,0.0033660305000000001,0.0035816809999999998],"272":[3.3289999999999998e-06,3.3407499999999997e-06,3.36465e-06,3.3667299999999999e-06,3.3939499999999999e-06,3.405e-06,3.4349100000000002e-06,3.44736e-06,3.4804600000000001e-06,3.49402e-06,3.560333333333333e-06,3.58204e-06,3.6103600000000004e-06,3.6869600000000002e-06,3.7228899999999997e-06,3.7889800000000004e-06,4.5759800000000002e-06,4.5876199999999996e-06,4.5986700000000001e-06,4.6020000000000002e-06],"336":[4.80619e-06,4.8167599999999999e-06,4.8274100000000004e-06,4.8405800000000002e-06,4.8794100000000001e-06,4.8818100000000003e-06,4.9043499999999999e-06,4.9149600000000001e-06,4.9207400000000004e-06,4.9335700000000001e-06,4.9571200000000001e-06,5.0444100000000002e-06,5.0752600000000001e-06,5.1487099999999994e-06,5.3455600000000007e-06,6.2797000000000002e-06,6.2860399999999999e-06,6.2882837837837839e-06,6.4316600000000004e-06,6.8930333333333333e-06],"22":[1.9088999999999998e-07,1.9145000000000001e-07,1.9179999999999998e-07,1.9227000000000001e-07,1.9266999999999999e-07,1.9268e-07,1.9275999999999999e-07,1.9287000000000001e-07,1.9986000000000002e-07,2.0078e-07,2.0081000000000001e-07,2.0234e-07,2.047e-07,2.4509999999999999e-07,2.4689000000000001e-07,2.4815000000000001e-07,2.4867000000000002e-07,2.5026999999999998e-07,2.523e-07,2.5316999999999998e-07],"192":[1.868846153846154e-06,1.8855200000000001e-06,1.8899900000000001e-06,1.8955999999999999e-06,1.90615e-06,1.9216299999999999e-06,1.9278399999999998e-06,1.93084e-06,1.93245e-06,1.9327837837837838e-06,1.9361e-06,1.9363999999999998e-06,1.9676800000000001e-06,1.9865899999999999e-06,2.0857600000000002e-06,2.8188200000000001e-06,2.8243400000000005e-06,2.8279000000000001e-06,2.8291299999999997e-06,2.8532000000000001e-06],"256":[3.03004e-06,3.0743399999999998e-06,3.0830899999999999e-06,3.0872599999999998e-06,3.0997799999999998e-06,3.1030555555555556e-06,3.11608e-06,3.1191100000000002e-06,3.1231100000000001e-06,3.12788e-06,3.1322700000000001e-06,3.13604e-06,3.1401600000000002e-06,3.27078e-06,3.3718000000000001e-06,3.4129700000000002e-06,4.2030600000000002e-06,4.2088500000000004e-06,4.2263300000000001e-06,4.9443200000000008e-06],"23":[1.9553999999999999e-07,1.9564000000000002e-07,1.9581999999999999e-07,1.9598000000000001e-07,1.9695e-07,1.9695999999999998e-07,1.9768999999999999e-07,1.9789999999999999e-07,1.9813000000000001e-07,1.9830000000000002e-07,1.9938999999999999e-07,2.0421999999999999e-07,2.0482e-07,2.0525000000000001e-07,2.0630000000000001e-07,2.5618000000000001e-07,2.5633000000000002e-07,2.5819000000000001e-07,2.5841e-07,2.6056e-07],"184":[1.76255e-06,1.7667e-06,1.7740000000000001e-06,1.7877700000000001e-06,1.7907000000000001e-06,1.7950900000000001e-06,1.8016799999999999e-06,1.8061e-06,1.81718e-06,1.8785199999999998e-06,1.8971e-06,1.9039400000000001e-06,1.9091999999999999e-06,1.9444100000000002e-06,1.9724473684210527e-06,2.6602199999999997e-06,2.6653499999999998e-06,2.66887e-06,2.6722099999999999e-06,2.6737899999999999e-06],"248":[2.8917899999999997e-06,2.9048000000000001e-06,2.9365899999999997e-06,2.94418e-06,2.94438e-06,2.9519499999999997e-06,2.95239e-06,2.9559099999999998e-06,2.9563e-06,2.95733e-06,2.9769300000000002e-06,2.9820600000000004e-06,3.0330800000000001e-06,3.1690400000000003e-06,4.0181700000000004e-06,4.0195999999999996e-06,4.0248500000000001e-06,4.0303333333333336e-06,4.03347e-06,4.2043700000000004e-06],"11264":[0.0060566639999999981,0.0060750880000000019,0.0061000380000000003,0.0061782190000000004,0.0061789819999999978,0.0062011000000000002,0.0062023350000000015,0.0062124699999999977,0.0062196219999999984,0.0062228050000000023,0.0062305469999999995,0.0062419850000000002,0.0062636930000000007,0.006281845999999998,0.0063530280000000019,0.0064891409999999986,0.006492655,0.0066161830000000003,0.006851584,0.0069359240000000013],"176":[1.6396600000000001e-06,1.6437e-06,1.66748e-06,1.6755700000000001e-06,1.6829200000000001e-06,1.69417e-06,1.6970799999999999e-06,1.70345e-06,1.7073899999999999e-06,1.7096900000000001e-06,1.7220100000000001e-06,1.72631e-06,1.73466e-06,1.78594e-06,1.84301e-06,2.50935e-06,2.5111699999999998e-06,2.51325e-06,2.5136599999999999e-06,2.5168000000000002e-06],"24":[1.9992999999999999e-07,2.0060000000000001e-07,2.0106e-07,2.0111999999999999e-07,2.0120999999999999e-07,2.0131000000000002e-07,2.015e-07,2.1044999999999998e-07,2.1079e-07,2.1124e-07,2.1185000000000001e-07,2.6525999999999998e-07,2.6652000000000003e-07,2.6860999999999997e-07,2.6893000000000001e-07,2.7543000000000003e-07,2.7617000000000002e-07,2.7636000000000002e-07,2.7709e-07,2.7805999999999999e-07],"26624":[0.035691751000000008,0.035751173999999976,0.0358097655,0.035818381000000017,0.035841262499999998,0.035891118499999999,0.035937948499999983,0.035947084999999976,0.035955544500000013,0.03598908499999999,0.036022661999999983,0.036036781000000004,0.036165926000000001,0.036283766000000002,0.036567105000000003,0.036584294000000003,0.036668557000000004,0.036759667000000003,0.037006186999999996,0.037060765000000016],"168":[1.5255699999999999e-06,1.56924e-06,1.57672e-06,1.57877e-06,1.57883e-06,1.6001000000000001e-06,1.60242e-06,1.6155999999999998e-06,1.6307299999999999e-06,1.6429599999999999e-06,1.6459100000000001e-06,1.65236e-06,1.6528399999999999e-06,1.6929900000000001e-06,1.7312e-06,2.35508e-06,2.3592000000000002e-06,2.36065e-06,2.3615900000000001e-06,2.4693600000000002e-06],"126976":[0.82481969850000003,0.82616672099999999,0.82756405399999999,0.83331495799999999,0.83621195149999994,0.83678583699999998,0.84044471500000006,0.85116389199999998,0.85843321000000006,0.87477931149999999,0.87988616399999997,0.88506242199999996,0.89732813300000003,0.90314123950000003,0.90878845399999997,0.91505594599999995,0.93397496449999995,0.95687825150000005,1.0451575195],"25":[2.0437000000000002e-07,2.0463e-07,2.047e-07,2.0563e-07,2.0641999999999999e-07,2.0650999999999999e-07,2.0730999999999999e-07,2.0764e-07,2.0820999999999998e-07,2.1327999999999999e-07,2.1437000000000001e-07,2.1722999999999999e-07,2.1793999999999998e-07,2.1891000000000002e-07,2.7744000000000003e-07,2.7790999999999998e-07,2.7813000000000002e-07,2.7957999999999997e-07,2.8421999999999999e-07,2.8476000000000002e-07],"50":[3.7290999999999997e-07,3.7845e-07,3.7870000000000002e-07,3.8127000000000003e-07,3.8763000000000004e-07,3.9144999999999997e-07,3.9487000000000004e-07,3.9539e-07,4.009e-07,4.2066000000000001e-07,5.8782000000000003e-07,5.9467000000000002e-07,5.9490999999999997e-07,5.9696999999999998e-07,5.9716999999999999e-07,6.0075999999999999e-07,6.1244e-07,6.1525000000000006e-07,6.1600000000000012e-07,6.5381000000000006e-07],"4864":[0.00089143299999999996,0.000902446,0.00090932700000000003,0.00091327400000000005,0.00092309820000000019,0.00092545699999999997,0.00092760040000000046,0.00092887100000000006,0.00093295300000000004,0.00093357900000000003,0.00093576300000000026,0.00093592199999999984,0.00094132420000000007,0.00094624420000000121,0.00094704639999999992,0.00095223189999999976,0.00095427619999999996,0.00097941550000000014,0.00098295499999999998,0.0010120603333333331],"2048":[0.00015112,0.000151655,0.00015268399999999999,0.00015395900000000001,0.0001561024,0.000157715,0.00015778058064516132,0.00015782644444444445,0.00015849475,0.000158615,0.000159023,0.000159116,0.000159715,0.00016033505263157895,0.0001620147142857143,0.00016280211111111115,0.000162979,0.00016315375510204082,0.00016318873684210538,0.00016441818333333332],"14848":[0.010892383,0.010923601999999999,0.010927539,0.010943963000000001,0.010945509000000001,0.010947548999999994,0.0109705975,0.010977437,0.011001788,0.011006976999999999,0.0110401995,0.011073528500000001,0.0110927735,0.011100739,0.011245271999999999,0.011272928,0.011279525,0.0113663885,0.011379243000000001,0.012418618499999997],"26":[2.0769e-07,2.0783e-07,2.0855e-07,2.0911999999999998e-07,2.1229999999999999e-07,2.1238e-07,2.1453e-07,2.2116e-07,2.2150999999999998e-07,2.2272999999999998e-07,2.3061000000000002e-07,2.8612999999999998e-07,2.8655999999999999e-07,2.8867e-07,2.924e-07,2.9308000000000003e-07,2.9345000000000002e-07,2.9400000000000001e-07,2.9433999999999997e-07,3.0722999999999998e-07],"86016":[0.37692035699999998,0.37758203950000002,0.37786286700000005,0.3778915705,0.37812424500000003,0.37848019799999999,0.37912511449999997,0.37978248650000002,0.3802573105,0.38034787399999997,0.38109408249999999,0.38311849749999999,0.383177353,0.38328030200000002,0.38333431549999997,0.38349557550000002,0.38607610000000003,0.38721352250000002,0.38781830249999999,0.39036543600000001],"27":[2.4634999999999998e-07,2.488e-07,2.5081000000000001e-07,2.5162999999999998e-07,2.5190000000000003e-07,2.5209999999999999e-07,2.523e-07,2.5240000000000001e-07,2.5409000000000002e-07,2.6361000000000002e-07,2.6370999999999997e-07,2.6444999999999996e-07,2.7905e-07,3.3702999999999999e-07,3.3962999999999998e-07,3.4163999999999998e-07,3.4198e-07,3.5385000000000001e-07,3.5803000000000004e-07,3.5840999999999999e-07],"800":[2.3648000000000001e-05,2.440915e-05,2.4573039999999999e-05,2.461576e-05,2.4812333333333336e-05,2.4922479999999999e-05,2.496642e-05,2.5007869999999999e-05,2.5143069999999998e-05,2.5147549999999999e-05,2.5559430000000003e-05,2.6268e-05,2.7416749999999998e-05,2.74392e-05,2.7481999999999999e-05,2.7568867924528303e-05,2.7572e-05,2.783959e-05,2.7853650000000001e-05,2.8542250000000003e-05],"52":[3.8884000000000003e-07,3.9415999999999998e-07,3.9648999999999997e-07,4.0583000000000003e-07,4.0681999999999999e-07,4.1195000000000003e-07,4.3006000000000003e-07,4.3300999999999998e-07,4.3741e-07,4.4300999999999999e-07,4.4975999999999997e-07,4.8408000000000003e-07,6.2013000000000009e-07,6.222400000000001e-07,6.2448999999999995e-07,6.2516999999999998e-07,6.3392999999999996e-07,6.363900000000001e-07,6.3689999999999999e-07,6.4275000000000001e-07]}},{"title":"Deque prepend, reserving capacity","results":{"28":[2.9115000000000001e-07,2.9633000000000001e-07,2.9645000000000004e-07,2.9668000000000003e-07,2.9716e-07,2.9773000000000001e-07,2.9782e-07,2.9796e-07,2.9816999999999998e-07,3.0039000000000001e-07,3.1054999999999998e-07,3.1081999999999997e-07,3.1084999999999995e-07,3.1115000000000003e-07,3.1301999999999998e-07,3.1398000000000001e-07,3.1470000000000003e-07,3.1845e-07,3.2851000000000002e-07,3.4980000000000002e-07],"34":[3.1805999999999998e-07,3.1836e-07,3.1923999999999999e-07,3.1964000000000002e-07,3.1986000000000001e-07,3.1991000000000001e-07,3.2014000000000001e-07,3.2039000000000003e-07,3.2089999999999997e-07,3.2141999999999998e-07,3.3255e-07,3.3551999999999998e-07,3.3606999999999996e-07,3.3704000000000001e-07,3.3728000000000001e-07,3.3828000000000004e-07,3.3984e-07,3.4215999999999999e-07,3.5095999999999996e-07,3.5125000000000003e-07],"29":[2.9366e-07,3.0006e-07,3.0037999999999999e-07,3.0065000000000004e-07,3.0068000000000002e-07,3.0083999999999999e-07,3.0163999999999999e-07,3.0176999999999998e-07,3.0180000000000002e-07,3.0181000000000003e-07,3.0185999999999998e-07,3.1464999999999998e-07,3.1492999999999998e-07,3.1528e-07,3.1563000000000003e-07,3.171e-07,3.1712999999999998e-07,3.1834000000000003e-07,3.1897000000000006e-07,3.3149999999999997e-07],"40":[3.4239000000000004e-07,3.4268e-07,3.4285999999999999e-07,3.4295000000000004e-07,3.4316000000000001e-07,3.4371e-07,3.4377000000000001e-07,3.4378999999999998e-07,3.4396000000000002e-07,3.4443999999999998e-07,3.4486000000000003e-07,3.4547999999999999e-07,3.4597000000000002e-07,3.5731249999999998e-07,3.5908000000000001e-07,3.5980999999999999e-07,3.6001999999999996e-07,3.6087999999999999e-07,3.6510000000000001e-07,3.7612000000000001e-07],"17408":[6.7561499999999993e-05,6.8235e-05,6.8361951219512193e-05,6.9004999999999994e-05,6.9025349999999995e-05,6.9536190000000006e-05,6.9907300000000001e-05,6.9945999999999997e-05,6.997983333333333e-05,6.9994541666666674e-05,7.0005999999999993e-05,7.0376999999999994e-05,7.0982390000000006e-05,7.1018000000000003e-05,7.1292120000000003e-05,7.160248999999999e-05,7.2241260000000006e-05,7.3495749999999998e-05,7.3835857142857153e-05,7.9469999999999996e-05],"1472":[5.6221600000000007e-06,5.7810000000000002e-06,5.8049358974358969e-06,5.8133700000000006e-06,5.8177299999999998e-06,5.8207799999999997e-06,5.8226999999999993e-06,5.8259000000000004e-06,5.8292399999999994e-06,5.8327000000000001e-06,5.8394999999999997e-06,5.8499399999999999e-06,5.8772200000000008e-06,5.8892000000000003e-06,5.8913699999999996e-06,5.8931499999999996e-06,6.01655e-06,6.0759300000000001e-06,6.2741999999999992e-06,6.3630900000000003e-06],"112":[6.1249e-07,6.1503000000000002e-07,6.1539999999999997e-07,6.1587999999999998e-07,6.1595000000000001e-07,6.1606000000000008e-07,6.1635000000000004e-07,6.1635999999999999e-07,6.1643999999999998e-07,6.1660000000000006e-07,6.1674999999999996e-07,6.1682999999999995e-07,6.1705999999999994e-07,6.1813000000000004e-07,6.1869000000000004e-07,6.192100000000001e-07,6.3019000000000006e-07,6.3380999999999993e-07,6.3411999999999991e-07,6.7108999999999996e-07],"1376256":[0.0072821535000000019,0.0073295809999999999,0.0074017744999999996,0.007504503,0.0075180019999999985,0.0075518794999999998,0.0076250104999999995,0.0077064055000000018,0.0077186564999999997,0.0077239065000000006,0.0077258505,0.0077648075,0.0077894884999999995,0.0078151604999999996,0.0078544074999999988,0.0079531260000000048,0.007965268999999997,0.0084725390000000046,0.0086867899999999981,0.0087478780000000006],"5242880":[0.029769670500000001,0.029851227000000015,0.029881663000000013,0.030091053,0.030138501500000008,0.030312680500000001,0.030399514499999992,0.030408043000000006,0.030491776500000001,0.030565751499999995,0.030666924000000002,0.030754900499999998,0.030815381499999999,0.030922027000000012,0.030983674999999999,0.031112412499999999,0.031282432500000006,0.031859944500000001,0.035114708999999987,0.035714659999999995],"36":[3.2595999999999999e-07,3.2678999999999998e-07,3.2709e-07,3.2723e-07,3.2731000000000004e-07,3.2777999999999999e-07,3.2799999999999997e-07,3.2835e-07,3.2837999999999998e-07,3.2841000000000001e-07,3.3080000000000002e-07,3.4318999999999999e-07,3.4382999999999998e-07,3.4400999999999997e-07,3.4421000000000004e-07,3.4462999999999998e-07,3.4560000000000002e-07,3.4745e-07,3.4775999999999999e-07,3.6034000000000001e-07],"42":[3.4938000000000002e-07,3.4967999999999999e-07,3.4973e-07,3.4985999999999998e-07,3.4992e-07,3.5009999999999999e-07,3.5037999999999999e-07,3.5064000000000002e-07,3.5070000000000004e-07,3.5101999999999998e-07,3.5114999999999996e-07,3.5137e-07,3.5154000000000004e-07,3.5177999999999999e-07,3.5255000000000002e-07,3.5294999999999999e-07,3.6638999999999999e-07,3.6685999999999999e-07,3.6748999999999996e-07,3.7110000000000003e-07],"11534336":[0.073568594000000001,0.073579600499999995,0.0739391675,0.074892649999999977,0.075086571500000032,0.075621829000000002,0.075701733499999979,0.075739282499999977,0.076137153000000013,0.076246337000000025,0.076461713000000014,0.076539021999999998,0.076857268000000006,0.076901516500000003,0.076966883,0.077004522999999978,0.07707625500000001,0.077085982999999997,0.077274061000000005,0.078425533000000006],"114688":[0.000450569,0.000452256,0.00046336400000000013,0.00047137600000000024,0.00047321500000000003,0.00047703999999999986,0.00047776134999999979,0.00047821966666666669,0.00048064099999999997,0.00048337859999999979,0.00048479799999999999,0.00048480000000000018,0.00048558199999999986,0.00048628699999999985,0.00049473047368421054,0.00049576600000000002,0.00049653099999999982,0.00050228164705882355,0.0005042971578947368,0.00051148199999999974],"144":[6.9998000000000005e-07,7.018e-07,7.0200000000000001e-07,7.0238999999999998e-07,7.0248999999999999e-07,7.0256999999999997e-07,7.0276000000000003e-07,7.0485999999999997e-07,7.0501999999999994e-07,7.0528999999999998e-07,7.0561000000000003e-07,7.0587999999999997e-07,7.0630000000000002e-07,7.0638999999999996e-07,7.066100000000001e-07,7.0676000000000001e-07,7.0815000000000005e-07,7.085200000000001e-07,7.3068000000000003e-07,7.3992000000000002e-07],"38":[3.3370000000000003e-07,3.3471000000000001e-07,3.3481000000000002e-07,3.3485999999999997e-07,3.3518000000000001e-07,3.3531999999999996e-07,3.3532999999999997e-07,3.3536000000000001e-07,3.3536000000000001e-07,3.3547000000000003e-07,3.3601e-07,3.3606000000000001e-07,3.3622999999999999e-07,3.4690000000000002e-07,3.5107000000000003e-07,3.5108000000000004e-07,3.5190000000000002e-07,3.5321999999999998e-07,3.6921000000000001e-07,3.8949000000000003e-07],"240":[1.06567e-06,1.0657e-06,1.0665399999999999e-06,1.06797e-06,1.06893e-06,1.0696399999999999e-06,1.07133e-06,1.0718800000000001e-06,1.0724400000000001e-06,1.07245e-06,1.07255e-06,1.0733e-06,1.07344e-06,1.07387e-06,1.07486e-06,1.1153900000000001e-06,1.11695e-06,1.1228399999999999e-06,1.12588e-06,1.1759499999999999e-06],"9216":[3.5509500000000003e-05,3.5513000000000004e-05,3.5762985915492957e-05,3.6326299999999998e-05,3.6559e-05,3.7024819672131151e-05,3.7277270000000001e-05,3.73005e-05,3.7308999999999998e-05,3.7417160000000002e-05,3.7471849999999999e-05,3.7512039999999999e-05,3.797381e-05,3.800278e-05,3.809006e-05,3.8116288888888891e-05,3.8815929999999998e-05,3.8856215686274507e-05,3.9364803921568629e-05,4.1709324324324324e-05],"44":[3.5685999999999998e-07,3.5742999999999999e-07,3.5763999999999997e-07,3.5778000000000002e-07,3.5794000000000004e-07,3.5797000000000002e-07,3.5805000000000001e-07,3.5811000000000002e-07,3.5833000000000001e-07,3.5835999999999999e-07,3.5852999999999997e-07,3.5894000000000001e-07,3.5907e-07,3.5966000000000003e-07,3.5973000000000001e-07,3.5982e-07,3.6325000000000003e-07,3.7384000000000002e-07,3.7819999999999999e-07,3.7933e-07],"1664":[6.3808400000000002e-06,6.5065399999999997e-06,6.5391499999999999e-06,6.5647299999999996e-06,6.5679899999999998e-06,6.5803300000000007e-06,6.5829500000000002e-06,6.5834999999999997e-06,6.6133900000000002e-06,6.6151899999999999e-06,6.6264099999999996e-06,6.6357000000000007e-06,6.6448299999999999e-06,6.7148599999999996e-06,6.7150399999999995e-06,6.7226400000000001e-06,6.7698699999999998e-06,6.8095899999999993e-06,7.0936299999999997e-06,7.7389999999999999e-06],"196608":[0.00081318700000000026,0.00082351490909090901,0.00082571399999999996,0.00082878699999999988,0.00083367027272727274,0.00083367059999999956,0.00083400399999999963,0.00083453399999999995,0.00084390318181818173,0.00084629509090909107,0.00085101899999999973,0.00085125390909090905,0.00085607399999999953,0.00085614127272727288,0.00085964445454545456,0.0010276020000000001,0.0010698439999999999,0.0010752272222222226,0.001083409125,0.0010965149999999997],"155648":[0.00063273119999999994,0.00064947500000001046,0.00065054099999999981,0.00065117550000000032,0.00065189300000000039,0.00066898871428571437,0.00066971484615384628,0.00067214538461538454,0.00067230700000000003,0.00067232299999999984,0.00067516514285714021,0.00067641864285714287,0.00067715692857142856,0.00068139921428571424,0.00068149307142857131,0.00068194299999999996,0.00068586446153846153,0.00068770553846153842,0.00071709176923076914,0.00076479549999999982],"2816":[1.1037e-05,1.1226050000000001e-05,1.1288550000000001e-05,1.131188e-05,1.1373430000000001e-05,1.140776e-05,1.1416270000000001e-05,1.143266e-05,1.146537e-05,1.146792e-05,1.1488530000000001e-05,1.150334e-05,1.15695e-05,1.1649860000000001e-05,1.1671850000000001e-05,1.168371e-05,1.1793900000000001e-05,1.20097e-05,1.2040009999999999e-05,1.2295330000000001e-05],"50":[3.7750000000000004e-07,3.8070000000000001e-07,3.8074000000000001e-07,3.8087000000000005e-07,3.8096000000000004e-07,3.8169000000000003e-07,3.819e-07,3.8204999999999996e-07,3.8221999999999999e-07,3.8244000000000003e-07,3.8393999999999998e-07,3.9719999999999998e-07,3.9748999999999999e-07,3.9812999999999998e-07,3.9816000000000001e-07,4.0118e-07,4.0160999999999995e-07,4.0244000000000005e-07,4.0522000000000002e-07,4.4419999999999997e-07],"2359296":[0.01280569,0.012868349499999997,0.013087615,0.0131331865,0.013136554999999999,0.013148132,0.013168865,0.013258298,0.013293844000000004,0.0133177435,0.013351716999999999,0.013381703999999998,0.013405538999999999,0.013437367,0.013534534500000001,0.013668316,0.0136867525,0.013696410500000006,0.014151107,0.0142588925],"46":[3.6486999999999996e-07,3.6495999999999995e-07,3.6543000000000001e-07,3.6551000000000005e-07,3.6615000000000003e-07,3.6622999999999996e-07,3.6683000000000001e-07,3.6702999999999997e-07,3.671e-07,3.6726000000000002e-07,3.6767999999999997e-07,3.8051000000000001e-07,3.8182999999999997e-07,3.8188000000000003e-07,3.8344e-07,3.8393000000000002e-07,3.8449999999999998e-07,3.8720999999999998e-07,3.8856999999999999e-07,4.0068999999999997e-07],"176":[8.2098999999999999e-07,8.2139999999999998e-07,8.2223000000000002e-07,8.2306999999999992e-07,8.2426000000000005e-07,8.2446000000000007e-07,8.2447000000000002e-07,8.2466999999999993e-07,8.2485999999999999e-07,8.2596000000000007e-07,8.2614000000000006e-07,8.2650000000000005e-07,8.2682000000000009e-07,8.2690697674418597e-07,8.2796000000000001e-07,8.2844999999999998e-07,8.5908000000000004e-07,8.6142000000000005e-07,8.6239999999999999e-07,9.0475806451612897e-07],"52":[3.8343000000000004e-07,3.8791000000000004e-07,3.8822000000000002e-07,3.8862e-07,3.8887999999999997e-07,3.8888999999999998e-07,3.8943000000000001e-07,3.8971999999999997e-07,3.8998e-07,3.9017999999999996e-07,3.9020000000000004e-07,4.0438000000000003e-07,4.0565000000000004e-07,4.0571999999999996e-07,4.0606999999999998e-07,4.0629000000000002e-07,4.0798999999999999e-07,4.1071e-07,4.2698999999999999e-07,4.4452000000000001e-07],"272":[1.1793100000000001e-06,1.1834200000000001e-06,1.1848100000000001e-06,1.1873099999999999e-06,1.1883600000000001e-06,1.1887000000000002e-06,1.1890500000000001e-06,1.1894499999999999e-06,1.1915499999999998e-06,1.19184e-06,1.19193e-06,1.1939300000000001e-06,1.1945199999999999e-06,1.1952e-06,1.1956700000000001e-06,1.1974200000000001e-06,1.2405e-06,1.2964100000000001e-06,1.3078800000000001e-06,1.30875e-06],"116":[6.2814000000000001e-07,6.2860999999999996e-07,6.2870999999999997e-07,6.3132999999999998e-07,6.3137000000000002e-07,6.3152999999999999e-07,6.3216999999999998e-07,6.3218000000000004e-07,6.3256000000000005e-07,6.3297999999999999e-07,6.3313999999999996e-07,6.3320999999999999e-07,6.3455999999999999e-07,6.3503999999999989e-07,6.3544999999999999e-07,6.3577999999999989e-07,6.3602000000000005e-07,6.4743000000000002e-07,6.6668999999999994e-07,6.8877999999999995e-07],"47104":[0.00018452879999999999,0.00018679800000000001,0.00018926049999999999,0.00019307499999999996,0.00019326900000000001,0.00019337915555555553,0.00019363100000000002,0.00019379104444444448,0.000193895,0.00019440925999999998,0.00019444101999999998,0.00019486970212765961,0.00019531550000000006,0.00019593272916666664,0.00019609777083333334,0.00019644418,0.00019990323404255316,0.00020002824489795916,0.00020050266666666667,0.00020413668085106376],"6912":[2.7438710000000003e-05,2.7448872727272725e-05,2.7529790000000001e-05,2.7632860000000002e-05,2.7701480000000001e-05,2.771449e-05,2.7730999999999999e-05,2.7787160000000001e-05,2.7793000000000003e-05,2.7871689999999999e-05,2.7922000000000001e-05,2.794654e-05,2.7965020000000002e-05,2.8019000000000001e-05,2.8070769999999997e-05,2.8408069999999998e-05,2.9233739999999997e-05,2.934755e-05,2.9386999999999998e-05,2.9997309999999999e-05],"1856":[7.0970500000000001e-06,7.1209199999999996e-06,7.1856999999999997e-06,7.2377499999999994e-06,7.2463800000000001e-06,7.3007499999999995e-06,7.3182738095238103e-06,7.3411899999999994e-06,7.3662900000000002e-06,7.3663600000000001e-06,7.41392e-06,7.4330700000000005e-06,7.4886500000000007e-06,7.5136699999999993e-06,7.5148499999999997e-06,7.5339299999999995e-06,7.5997300000000007e-06,7.6837599999999998e-06,7.6911899999999995e-06,7.77501e-06],"48":[3.7212999999999998e-07,3.7267000000000001e-07,3.7287999999999999e-07,3.7305999999999998e-07,3.7305999999999998e-07,3.7313000000000001e-07,3.7370999999999998e-07,3.7416000000000001e-07,3.7419999999999995e-07,3.7419999999999995e-07,3.7479999999999999e-07,3.7577999999999999e-07,3.7612000000000001e-07,3.8853e-07,3.8952000000000001e-07,3.8998e-07,3.9047000000000003e-07,3.9080999999999999e-07,3.9131000000000003e-07,3.9221000000000004e-07],"2097152":[0.011274278,0.011557683500000001,0.011619791000000001,0.0116207245,0.011712861499999994,0.011720781,0.0117210805,0.0117469315,0.011865602499999999,0.011889110999999999,0.0119395795,0.0120283105,0.012042450499999999,0.012100892,0.0121279145,0.01224768,0.012752081,0.013105534,0.013270521,0.0164813935],"54":[3.9236e-07,3.9428999999999997e-07,3.9463999999999999e-07,3.9601999999999997e-07,3.9657000000000001e-07,3.9690000000000001e-07,3.9698e-07,3.9703e-07,3.9706999999999999e-07,3.9744186046511629e-07,4.1204000000000003e-07,4.1265999999999999e-07,4.1304000000000005e-07,4.1409999999999998e-07,4.1428999999999999e-07,4.1569999999999994e-07,4.1906e-07,4.3518000000000001e-07,4.5238000000000003e-07,4.5764999999999997e-07],"2031616":[0.010912531499999999,0.010930383,0.010941246,0.010975,0.011082716000000001,0.011145433500000001,0.011199459,0.011291127499999994,0.011324134,0.011350298,0.011367772,0.011426583000000001,0.0115123555,0.011529826,0.011536743,0.0116420215,0.011668965,0.011745264,0.0119182895,0.012096902],"43008":[0.00016890499999999993,0.00016988299999999996,0.00017042400000000005,0.0001725299411764706,0.000172611,0.00017264900000000006,0.00017319000000000001,0.00017345875000000002,0.00017698780357142859,0.00017710089090909091,0.00017736100000000001,0.00017762099999999996,0.00017802900000000004,0.00017809146296296296,0.00017994800000000003,0.00018033986538461527,0.0001804055,0.0001806768,0.00018541875471698115,0.000190397],"60":[4.1699000000000003e-07,4.1772000000000001e-07,4.1867999999999999e-07,4.1899000000000002e-07,4.1921000000000001e-07,4.1945000000000001e-07,4.1946999999999998e-07,4.1956999999999999e-07,4.1999000000000004e-07,4.2039999999999998e-07,4.3560999999999997e-07,4.3565000000000001e-07,4.3657e-07,4.3697999999999999e-07,4.3714000000000001e-07,4.3903999999999999e-07,4.3995000000000002e-07,4.4653000000000002e-07,4.5599e-07,4.6034e-07],"30720":[0.000113911,0.0001180055,0.00012173900000000001,0.00012179400000000001,0.000123177,0.00012357499999999995,0.00012582192957746478,0.00012687817567567567,0.00012713157142857145,0.00012731299999999994,0.00012742799999999999,0.00012883031999999999,0.00012885069736842111,0.00012901050000000002,0.00012930484507042256,0.00012940456578947369,0.00012991914285714288,0.00012999166666666668,0.0001386542,0.000139973],"56":[4.0207000000000005e-07,4.0305999999999996e-07,4.0317000000000003e-07,4.0318000000000004e-07,4.0385000000000001e-07,4.0395999999999997e-07,4.0445000000000005e-07,4.0488999999999997e-07,4.0595000000000001e-07,4.0694000000000002e-07,4.2121e-07,4.2286999999999997e-07,4.2293000000000004e-07,4.2353999999999999e-07,4.2407000000000001e-07,4.2579999999999996e-07,4.2653e-07,4.2728999999999996e-07,4.3013999999999996e-07,4.5763999999999996e-07],"62":[4.2499e-07,4.2509e-07,4.2608999999999997e-07,4.2633000000000003e-07,4.2664999999999997e-07,4.2683999999999998e-07,4.2708999999999999e-07,4.2725999999999998e-07,4.2738000000000001e-07,4.2738000000000001e-07,4.2860000000000001e-07,4.2873e-07,4.2938999999999996e-07,4.4306e-07,4.4406999999999998e-07,4.4468999999999999e-07,4.4474999999999996e-07,4.4479e-07,4.4624e-07,5.0776999999999995e-07],"58":[4.1106000000000003e-07,4.1125999999999999e-07,4.1129999999999998e-07,4.1132000000000001e-07,4.1147999999999998e-07,4.1155999999999996e-07,4.1162999999999999e-07,4.1189999999999998e-07,4.1236000000000002e-07,4.1339999999999998e-07,4.1398000000000001e-07,4.1493999999999998e-07,4.2685000000000004e-07,4.2799000000000001e-07,4.2982000000000002e-07,4.3029999999999998e-07,4.3210000000000001e-07,4.3265e-07,4.3574000000000001e-07,4.4475999999999997e-07],"3014656":[0.0164478755,0.016629508500000004,0.016658648000000005,0.016812030499999995,0.016826271,0.016935235999999999,0.016949693500000005,0.01708250750000001,0.017116844499999999,0.017133343000000006,0.017176277999999989,0.017427316999999991,0.017492481000000001,0.0175972135,0.017734682500000001,0.017737331000000005,0.017780226499999999,0.017824547,0.018759892,0.019473617999999998],"64":[4.3289000000000001e-07,4.3358e-07,4.3459999999999999e-07,4.3464999999999999e-07,4.3483999999999999e-07,4.3513999999999996e-07,4.3526000000000005e-07,4.3538999999999998e-07,4.3576999999999999e-07,4.3631707317073172e-07,4.3679999999999999e-07,4.3708000000000005e-07,4.4079999999999998e-07,4.4709000000000002e-07,4.5138000000000001e-07,4.5145000000000004e-07,4.5283000000000001e-07,4.5428000000000002e-07,4.5445000000000005e-07,4.5511e-07],"8388608":[0.047811720499999995,0.047981353500000004,0.0480295315,0.0483484125,0.048537120500000003,0.048731108000000016,0.048892957000000008,0.048938942499999999,0.049069875000000013,0.049253387999999995,0.049320087499999998,0.049443860999999999,0.049768236500000021,0.049855293000000009,0.049908072000000012,0.049911519500000008,0.049935027,0.0500892275,0.050180776999999996,0.050853231499999985],"29696":[0.000114113,0.000114181,0.00012089078947368418,0.00012109725,0.00012294141666666666,0.00012324643999999995,0.00012337994117647059,0.00012389733333333864,0.00012425785714285717,0.00012486165753424652,0.00012518941891891895,0.00012583221428571429,0.00012585017567567566,0.00012594808823529415,0.00012620133823529415,0.00012635663636363634,0.00012663716216216217,0.00012743634246575349,0.00012858645070422536,0.00013460920895522389],"216":[9.7207e-07,9.7287999999999991e-07,9.7567000000000005e-07,9.7596000000000001e-07,9.7603999999999989e-07,9.7623999999999991e-07,9.7699999999999992e-07,9.7713000000000012e-07,9.7729999999999994e-07,9.7794000000000003e-07,9.813100000000001e-07,9.8219000000000004e-07,9.8257000000000015e-07,9.8678999999999996e-07,1.0219599999999999e-06,1.0221900000000001e-06,1.02307e-06,1.0234100000000001e-06,1.07169e-06,1.0782599999999999e-06],"106496":[0.00041309300000000006,0.000432452,0.0004367613333333334,0.00044135350000000013,0.00044257680952380961,0.000442867,0.00044810929999999975,0.00044851149999999997,0.00044904,0.00045361100000000003,0.00045664147619047635,0.00045695833333333336,0.00045771633333333337,0.00045816478947368423,0.00045924366666666666,0.00045967499999999999,0.00046074983333333337,0.0004676350000000001,0.00046945963157894749,0.00050454131578947384],"72":[4.6110999999999998e-07,4.6384e-07,4.6385999999999997e-07,4.6390999999999998e-07,4.6452999999999999e-07,4.6493999999999998e-07,4.6511000000000001e-07,4.6525000000000001e-07,4.6549999999999998e-07,4.6551999999999995e-07,4.6572000000000002e-07,4.6636e-07,4.6818e-07,4.6882000000000004e-07,4.7008000000000004e-07,4.8024999999999998e-07,4.8060999999999996e-07,4.8136000000000002e-07,4.8418000000000004e-07,4.8678000000000002e-07],"442368":[0.0018146903999999998,0.00184143,0.0018477614,0.0018524848,0.001877238,0.001877241,0.001883605,0.0018871016000000002,0.0018906182,0.0018951368,0.0018963279999999999,0.0019068306,0.0019134220000000001,0.0019144272000000001,0.0019193454,0.0019309219999999998,0.0019316833999999995,0.0024631796666666666,0.0025063466666666668,0.0025878110000000002],"147456":[0.00058623400000000004,0.00061693300000000028,0.00062298399999999982,0.00062358080000000015,0.000624696,0.00062481099999999996,0.00062515100000000001,0.00062542073333333331,0.00062591633333333317,0.00062604799999999971,0.00062841100000000027,0.0006288046666666667,0.00063052106666666664,0.00063344393333333328,0.00063511286666666656,0.0006397731999999998,0.00064402493333333335,0.00064679006666666671,0.0006487884999999996,0.00065595299999999981],"4456448":[0.019466106,0.019906282500000011,0.020462517999999999,0.020627083000000001,0.024480966999999999,0.025183126,0.025760806000000004,0.0257896055,0.025889558999999996,0.026046991000000002,0.0261294465,0.026129994,0.026148547500000001,0.026180711000000002,0.026214106500000008,0.026364537,0.026515971999999999,0.0265841195,0.026852030000000006,0.028631687999999988],"63488":[0.00024923999999999991,0.00025423166666666669,0.00025442150000000002,0.00025496200000000002,0.00025595749999999992,0.00025610900000000002,0.000257791,0.00025795487999999997,0.00025942200000000009,0.00026026427777777784,0.00026076400000000008,0.00026130180000000008,0.00026178034285714283,0.00026326054054054057,0.00026529400000000001,0.00026945224999999986,0.00027341400000000009,0.00027348114285714279,0.00027779093750000008,0.00031262499999999986],"38912":[0.00014921375000000005,0.000153466,0.00015418700000000007,0.00015440700000000001,0.00015625200000000001,0.000156472,0.000158293,0.00015881706451612902,0.00015893518867924472,0.00016011292857142859,0.00016054200000000001,0.00016097,0.00016160394915254241,0.00016270191379310343,0.00016284671929824566,0.00016315374576271184,0.00016366400000000005,0.00016384480000000001,0.00016400146666666662,0.00017184200000000001],"68":[4.4696000000000003e-07,4.4777999999999995e-07,4.4839000000000001e-07,4.4863000000000001e-07,4.4877999999999997e-07,4.4879000000000004e-07,4.4911999999999999e-07,4.4932999999999996e-07,4.4958999999999999e-07,4.4972999999999999e-07,4.4987999999999995e-07,4.5009000000000003e-07,4.5139000000000002e-07,4.5145999999999999e-07,4.5319e-07,4.6406000000000004e-07,4.6419999999999999e-07,4.6585999999999996e-07,4.6629999999999999e-07,4.6740999999999997e-07],"188416":[0.0007379149999999998,0.00076524100000000005,0.00077645399999999999,0.00078162860000000002,0.00078978291666666667,0.00079118266666666705,0.00079132175000000003,0.00079319699999999983,0.00080086800000000004,0.00080301691666666687,0.00080422581818181808,0.00080863899999999967,0.00080967800000000009,0.00081150633333333341,0.00081237999999999992,0.00081307291666666648,0.00082754500000000006,0.000830688,0.0008324805454545456,0.00083622536363636376],"248":[1.09163e-06,1.0959e-06,1.09739e-06,1.09755e-06,1.09775e-06,1.09781e-06,1.09781e-06,1.09791e-06,1.09828e-06,1.09917e-06,1.0993200000000001e-06,1.10095e-06,1.10101e-06,1.1051199999999999e-06,1.10662e-06,1.1450799999999999e-06,1.1503100000000001e-06,1.1509400000000001e-06,1.1564400000000001e-06,1.20923e-06],"80":[4.9220999999999999e-07,4.9230000000000003e-07,4.9292999999999995e-07,4.9309999999999999e-07,4.9358e-07,4.9390000000000005e-07,4.9396999999999997e-07,4.9508000000000001e-07,4.9545000000000006e-07,4.9554e-07,4.9561999999999999e-07,4.9582e-07,4.9693000000000004e-07,4.9872000000000001e-07,4.9997999999999995e-07,5.0849000000000002e-07,5.0976000000000003e-07,5.1488000000000002e-07,5.2094e-07,5.6684999999999992e-07],"2560":[9.9706099999999997e-06,9.9794999999999999e-06,1.0077e-05,1.0092689655172413e-05,1.0094109999999999e-05,1.011346e-05,1.01579e-05,1.0182979999999999e-05,1.022637e-05,1.024264e-05,1.026019e-05,1.0306359999999999e-05,1.034112e-05,1.038258e-05,1.038406e-05,1.0405939999999999e-05,1.0471714285714286e-05,1.052098e-05,1.0792460000000001e-05,1.0870360000000001e-05],"34816":[0.00013721566666666669,0.000137272,0.00014095872727272723,0.00014103307142857141,0.00014143825,0.0001419299682539683,0.00014218500000000005,0.00014254924637681159,0.00014326706666666672,0.00014340474545454545,0.00014356900000000005,0.00014381024637681158,0.00014433933333333329,0.00014505449230769234,0.00014583278787878791,0.00014633100000000001,0.00014656750000000004,0.00014669585714285714,0.00014683900000000001,0.00014689249999999996],"3712":[1.3917000000000001e-05,1.3934000000000001e-05,1.4285e-05,1.4343230769230769e-05,1.4430000000000001e-05,1.4435633333333333e-05,1.484099e-05,1.485385e-05,1.490219e-05,1.490611e-05,1.4932610000000001e-05,1.4937119999999999e-05,1.4965060000000001e-05,1.505717e-05,1.5064300000000001e-05,1.5076550000000001e-05,1.5206e-05,1.52301e-05,1.5280379999999999e-05,1.5580889999999998e-05],"3538944":[0.0191352295,0.019294924500000001,0.019572528999999998,0.019732613999999999,0.019841932999999999,0.020198157500000001,0.020201465500000002,0.020216481500000001,0.020247190999999994,0.020316928000000001,0.020377591,0.020520661000000013,0.020571236,0.020665282,0.020687412499999999,0.020700792999999999,0.020808845499999999,0.0210346595,0.021082014,0.021450220499999999],"76":[4.7179999999999998e-07,4.7271999999999996e-07,4.7724999999999996e-07,4.7827000000000006e-07,4.7843999999999999e-07,4.7902999999999997e-07,4.7923999999999994e-07,4.7932000000000003e-07,4.8001999999999998e-07,4.8025999999999993e-07,4.8039000000000003e-07,4.8042000000000001e-07,4.8047999999999997e-07,4.8263000000000003e-07,4.8310999999999994e-07,4.9541000000000001e-07,4.9781999999999994e-07,4.9821999999999997e-07,4.9898999999999994e-07,5.0396999999999998e-07],"4194304":[0.022709897499999993,0.022787339,0.023673897000000006,0.023733312500000006,0.0238999895,0.02407977,0.024141026999999999,0.024166937999999999,0.024232064500000001,0.024360589500000002,0.024382967999999998,0.024472081999999999,0.024485027500000006,0.024619115,0.024774863500000004,0.024803406,0.024896590999999999,0.025046021000000009,0.0251847605,0.025372051],"851968":[0.0034671050000000007,0.003474183,0.003572595,0.0036197044999999998,0.0036361940000000001,0.0036753534999999999,0.0036884904999999997,0.0037047449999999997,0.0037060860000000017,0.003712524,0.0037269410000000001,0.0037927169999999997,0.0037956590000000011,0.0038398454999999999,0.003883601,0.0038962509999999986,0.004010759,0.004568328,0.0046755270000000014,0.0047618469999999996],"4096":[1.5834000000000001e-05,1.587825e-05,1.5892e-05,1.5928999999999999e-05,1.6008070000000001e-05,1.631545e-05,1.647117e-05,1.6502140000000002e-05,1.659718e-05,1.6617999999999999e-05,1.6622328571428574e-05,1.6653209999999999e-05,1.66616e-05,1.6853959999999999e-05,1.6907960000000002e-05,1.6929260000000001e-05,1.7096590000000001e-05,1.72784e-05,1.7359540000000002e-05,1.8404560000000001e-05],"59392":[0.00022844900000000009,0.000235441,0.00023769766666666665,0.00023857840000000001,0.00023989399999999999,0.00024125812820512821,0.00024293788888888899,0.00024303114285714283,0.00024311475000000004,0.00024395210256410258,0.00024461900000000001,0.000244959,0.00024524927777777784,0.00024596710810810812,0.00024648947222222233,0.00024876716666666669,0.0002487686,0.00024973400000000005,0.00025406500000000004,0.00025454933333333334],"84":[5.0620000000000002e-07,5.0849999999999998e-07,5.0854000000000003e-07,5.087e-07,5.0976999999999999e-07,5.0997000000000001e-07,5.102e-07,5.1035000000000001e-07,5.1065000000000004e-07,5.1082000000000007e-07,5.1104e-07,5.1139000000000003e-07,5.1233000000000004e-07,5.1261999999999999e-07,5.1345999999999999e-07,5.1465999999999998e-07,5.2529000000000001e-07,5.3425000000000001e-07,5.3746e-07,5.6190999999999993e-07],"3276800":[0.019637633999999998,0.020057946,0.020288025499999994,0.020313411,0.020486696000000002,0.020591269000000002,0.020608751000000002,0.020829694499999999,0.021000046000000005,0.021004034999999997,0.021030371499999999,0.02128373250000001,0.021311617000000001,0.021562293999999989,0.021808943500000001,0.021894943,0.0219226805,0.022151209999999998,0.022274986,0.022315223999999998],"55296":[0.00021223499999999999,0.000212699,0.00021716727906976745,0.000217178,0.000217832,0.00021866500000000005,0.000220192,0.000221874,0.000222086,0.00022233299999999999,0.00022332260000000002,0.00022467599999999996,0.00022726776744186046,0.00022927999999999984,0.00022939299999999996,0.0002300621219512195,0.00023437348717948709,0.00023731685000000002,0.00023958331707317075,0.00024137426829268292],"688128":[0.0029387706666666662,0.0029462749999999999,0.0029551403333333338,0.0029657200000000002,0.0029716529999999999,0.0029801923333333167,0.0029867240000000001,0.0029994536666666663,0.0030074670000000006,0.0030137189999999998,0.0030138096666666677,0.0032309129999999998,0.003304422,0.0038154540000000002,0.0038660420000000001,0.0038823740000000009,0.0039622224999999994,0.0040042154999999991,0.0040434939999999999,0.0047253580000000016],"8192":[3.1767000000000003e-05,3.280022e-05,3.2892247191011234e-05,3.2913000000000001e-05,3.2998640000000002e-05,3.2999e-05,3.3061000000000001e-05,3.3088050000000002e-05,3.3105199999999996e-05,3.3135500000000001e-05,3.3304720000000001e-05,3.3412140000000001e-05,3.3549279999999999e-05,3.3577000000000001e-05,3.3656209999999999e-05,3.3887419999999998e-05,3.3933100000000002e-05,3.4146880000000002e-05,3.4470159999999998e-05,3.4678638888888885e-05],"10240":[3.9461088888888892e-05,3.9483500000000002e-05,3.9511999999999997e-05,3.9523000000000001e-05,3.9526000000000001e-05,3.9529e-05,3.9595000000000003e-05,4.0461469999999997e-05,4.0839e-05,4.0852000000000001e-05,4.0970129999999998e-05,4.1350999999999998e-05,4.1486099999999996e-05,4.1812575757575756e-05,4.2020870000000001e-05,4.2034779999999998e-05,4.2420437499999997e-05,4.2919e-05,4.2963219999999997e-05,4.4253434782608697e-05],"15872":[6.2416999999999995e-05,6.2477999999999994e-05,6.304723529411764e-05,6.3801930000000005e-05,6.3954999999999993e-05,6.3966000000000004e-05,6.4190079999999999e-05,6.4198789999999999e-05,6.4305839999999993e-05,6.444039e-05,6.4513650000000002e-05,6.4609439999999994e-05,6.4656250000000003e-05,6.4822599999999998e-05,6.5084339999999999e-05,6.5177810000000005e-05,6.5436000000000002e-05,6.6927999999999993e-05,6.727449e-05,6.7473539473684213e-05],"92":[5.3669000000000002e-07,5.3773000000000004e-07,5.3903000000000003e-07,5.397e-07,5.397e-07,5.3971000000000006e-07,5.4069000000000001e-07,5.4089999999999998e-07,5.4105999999999995e-07,5.4115e-07,5.4150000000000002e-07,5.4295000000000003e-07,5.4313999999999998e-07,5.4321e-07,5.5410000000000002e-07,5.5688888888888881e-07,5.5693999999999996e-07,5.6324999999999996e-07,5.6662999999999999e-07,5.8584000000000001e-07],"26624":[0.00010213875,0.000102261,0.00010315939999999998,0.000104199,0.00010449917647058823,0.00010474700000000001,0.000105448,0.000107061,0.0001084676043956044,0.00010877678651685398,0.0001092,0.00010935286585365851,0.00010995,0.000110006,0.00011011061038961038,0.00011028736781609197,0.000110398,0.00011101968604651162,0.0001123245,0.00011309694936708858],"1792":[6.8871000000000005e-06,6.8999800000000003e-06,6.9229999999999996e-06,6.9229999999999996e-06,7.0019699999999996e-06,7.0574285714285715e-06,7.0659399999999998e-06,7.0668571428571438e-06,7.0692900000000004e-06,7.0743333333333336e-06,7.08155e-06,7.0925199999999991e-06,7.0925399999999997e-06,7.1007100000000003e-06,7.1790000000000002e-06,7.1835499999999992e-06,7.2019499999999997e-06,7.2233099999999998e-06,7.2278800000000002e-06,7.4295899999999993e-06],"11776":[4.5871049999999999e-05,4.6105e-05,4.6326000000000003e-05,4.6445e-05,4.6570999999999998e-05,4.6671300000000002e-05,4.7029e-05,4.7042339999999998e-05,4.7168e-05,4.7463500000000004e-05,4.7471142857142863e-05,4.7481000000000002e-05,4.7502e-05,4.7521999999999997e-05,4.7956889999999994e-05,4.8726000000000001e-05,5.0030302325581392e-05,5.034752e-05,5.2682000000000001e-05,5.3358367816091955e-05],"2944":[1.1465695652173915e-05,1.1501529411764707e-05,1.151448e-05,1.16065e-05,1.1740666666666668e-05,1.1805920000000001e-05,1.184119000000039e-05,1.1858397435897436e-05,1.1879239999999999e-05,1.200762244897959e-05,1.201506e-05,1.2024169999999999e-05,1.204753e-05,1.208373e-05,1.2135329999999999e-05,1.2371909999999998e-05,1.2501561403508772e-05,1.2534086419753085e-05,1.2587539999999999e-05,1.2640366197183097e-05],"88":[5.2281000000000006e-07,5.2404999999999998e-07,5.2407999999999997e-07,5.2412999999999997e-07,5.2486e-07,5.2491999999999996e-07,5.2559999999999999e-07,5.2575999999999996e-07,5.2580999999999997e-07,5.2587000000000004e-07,5.2592000000000004e-07,5.2658000000000005e-07,5.2681000000000004e-07,5.2738999999999996e-07,5.2809999999999997e-07,5.2964000000000002e-07,5.3996000000000008e-07,5.4571999999999994e-07,5.5538999999999995e-07,5.7752e-07],"22528":[8.3616999999999996e-05,8.7251538461538455e-05,8.8719000000000002e-05,9.0497100000000005e-05,9.0533000000000009e-05,9.0593571428571417e-05,9.075285714285714e-05,9.0949110000000007e-05,9.1076868686868688e-05,9.1235666666666658e-05,9.1316560000000003e-05,9.2201571428571433e-05,9.2206669999999997e-05,9.2471010000000004e-05,9.2619000000000002e-05,9.3263000000000005e-05,9.3808599999999995e-05,9.4186999999999998e-05,9.5013000000000007e-05,9.6286999999999995e-05],"1245184":[0.0065780384999999985,0.0067637515000000033,0.006779958,0.0067967929999999954,0.0068122625000000018,0.0068440255000000033,0.0069250960000000004,0.0069372975,0.0070181455000000031,0.0070243269999999969,0.0070306510000000032,0.00709627,0.0071224700000000031,0.0071786535000000025,0.0071883900000000002,0.007205436,0.0072079459999999998,0.0073601824999999978,0.0073657589999999995,0.0077728190000000003],"15728640":[0.088518970000000002,0.089855563499999985,0.090014917999999999,0.090289795000000006,0.091181249499999978,0.091534939999999995,0.09166645599999998,0.09170568649999998,0.092020878,0.092181097500000003,0.092317319999999994,0.092537252,0.09254767550000001,0.092872216500000021,0.093455923000000024,0.093678996,0.093809692,0.09480912150000001,0.094893206499999994,0.094953584999999965],"96":[5.5252000000000003e-07,5.5354000000000002e-07,5.5489000000000001e-07,5.5509999999999999e-07,5.5570000000000003e-07,5.5609e-07,5.5616000000000002e-07,5.5637999999999996e-07,5.5647999999999996e-07,5.5649000000000003e-07,5.5677999999999999e-07,5.5779000000000002e-07,5.581e-07,5.5817000000000003e-07,5.6657999999999998e-07,5.7224000000000005e-07,5.8183000000000007e-07,5.8513e-07,6.0997999999999996e-07,6.1065999999999999e-07],"1984":[7.7808399999999995e-06,7.821999999999999e-06,7.8554375000000003e-06,7.8650199999999998e-06,7.8738999999999993e-06,7.8769999999999993e-06,7.8784999999999992e-06,7.90837e-06,7.9296699999999992e-06,7.9303999999999995e-06,7.9921400000000004e-06,8.0002699999999999e-06,8.0164600000000008e-06,8.0305399999999999e-06,8.0306099999999997e-06,8.0650899999999994e-06,8.1276099999999989e-06,8.2385300000000012e-06,8.3200899999999995e-06,8.6178082191780821e-06],"139264":[0.0005538705000000001,0.00056327500000000002,0.0005758785,0.00057929306666666658,0.00058286155555555583,0.00058324668749999979,0.00058550633333333334,0.00058801878571428578,0.00059368174999999981,0.00059409812500000009,0.00060083880000000019,0.00060528888888888898,0.00060852900000000001,0.00060955093333333341,0.00061309599999999982,0.00061486519999999999,0.00061616600000000002,0.00061639425000000001,0.00062027899999999984,0.00063225399999999985],"475136":[0.0019431750000000001,0.0020061957499999993,0.0020081879999999997,0.0020102610000000002,0.00201597525,0.0020183849999999997,0.0020203929999999997,0.0020254310000000003,0.0020369629999999993,0.002057589250000001,0.0020583737499999997,0.0020687550000000007,0.0020774300000000008,0.0020950629999999999,0.0021034250000000003,0.0021142089999999988,0.0025644409999999998,0.0025743316666666663,0.0026278933333333337,0.0028563989999999999],"13631488":[0.078122923999999996,0.078838240000000018,0.079070949000000001,0.079434320500000002,0.0795857175,0.079613144999999969,0.079765100000000005,0.079849775999999956,0.079960028499999974,0.0800116565,0.080049346999999993,0.080062364499999997,0.080088621500000026,0.0803298385,0.080819388500000006,0.080905444500000007,0.081112824,0.081177067000000019,0.081262704999999963,0.083575273500000033],"416":[1.6983900000000001e-06,1.7053500000000001e-06,1.7126599999999999e-06,1.73393e-06,1.73657e-06,1.74509e-06,1.74572e-06,1.7464600000000001e-06,1.7465899999999999e-06,1.7478799999999999e-06,1.7513699999999999e-06,1.75148e-06,1.75158e-06,1.7537400000000001e-06,1.75728e-06,1.77787e-06,1.78295e-06,1.7966999999999999e-06,1.8160100000000001e-06,1.97458e-06],"928":[3.5890625e-06,3.6005999999999999e-06,3.6068299999999999e-06,3.6169799999999997e-06,3.71233e-06,3.7149999999999996e-06,3.7200399999999998e-06,3.7234799999999999e-06,3.7244100000000001e-06,3.7260199999999997e-06,3.7292299999999998e-06,3.7309700000000004e-06,3.7346299999999998e-06,3.7678899999999997e-06,3.8028299999999998e-06,3.8925399999999998e-06,3.8947400000000004e-06,3.9028799999999998e-06,4.0777300000000003e-06,4.0787999999999998e-06],"512":[2.0671000000000001e-06,2.0811299999999998e-06,2.1093300000000003e-06,2.1110000000000002e-06,2.11228e-06,2.1129300000000001e-06,2.1132200000000001e-06,2.1134100000000002e-06,2.1137499999999999e-06,2.1143600000000002e-06,2.1153599999999999e-06,2.11923e-06,2.1210399999999999e-06,2.1248e-06,2.2128800000000003e-06,2.2240899999999997e-06,2.2503599999999998e-06,2.2515599999999999e-06,2.3105200000000003e-06,2.4729899999999996e-06],"18432":[7.0889999999999994e-05,7.0919000000000003e-05,7.2643000000000002e-05,7.2653999999999999e-05,7.2845636363636358e-05,7.3019e-05,7.3176999999999994e-05,7.3530999999999998e-05,7.3772903225806456e-05,7.41655e-05,7.5056949999999993e-05,7.5323229999999999e-05,7.5471266666666677e-05,7.5512249999999995e-05,7.5805999999999999e-05,7.6130233333333332e-05,7.8194115384615386e-05,7.916609e-05,8.0531652173913051e-05,8.1914119999999997e-05],"16777216":[0.096721281999999992,0.097033620000000001,0.097172898500000007,0.097362828000000012,0.097451343499999982,0.097541387499999993,0.09756251699999996,0.097837805999999999,0.099115135499999979,0.099267721500000017,0.099286987499999993,0.099623544000000008,0.099693390500000006,0.100066556,0.10022436999999999,0.10105106949999998,0.1013203495,0.10135954799999999,0.101654535,0.1020261875],"9728":[3.6167000000000001e-05,3.7675689655172415e-05,3.7976999999999999e-05,3.8445116279069769e-05,3.865159e-05,3.8661000000000001e-05,3.8728826086956523e-05,3.8764999999999999e-05,3.8996567567567567e-05,3.9125160000000007e-05,3.9314870000000003e-05,3.9332999999999998e-05,3.9344999999999997e-05,4.0208550000000003e-05,4.0403558139534887e-05,4.052318604651163e-05,4.0633149999999999e-05,4.0658430000000006e-05,4.0693324324324326e-05,4.1328140000000004e-05],"1769472":[0.009595165499999999,0.0096967139999999969,0.0097114575000000029,0.0097450185000000026,0.0097499605,0.0097645419999999958,0.0098153389999999993,0.0098160415000000008,0.0098537224999999968,0.0098949584999999986,0.0099094969999999963,0.0099144304999999999,0.009992239,0.0100008465,0.010019354499999999,0.010073778,0.010150413,0.010162794500000001,0.01037948,0.0104309715],"1703936":[0.0071672934999999997,0.0072257855000000008,0.007227718000000001,0.007268120999999998,0.0072911224999999994,0.0073557824999999997,0.0075068720000000004,0.0075230235000000008,0.0075329595000000003,0.007536676,0.0075610219999999728,0.0075746229999999999,0.0075831544999999971,0.007583291500000003,0.0076143519999999996,0.0076802060000000002,0.0077003534999999998,0.0095949255000000021,0.0096747235000000011,0.0097404944999999968],"2048":[8.0543787878787871e-06,8.0555199999999991e-06,8.0557300000000002e-06,8.0594999999999997e-06,8.0839999999999992e-06,8.0900000000000005e-06,8.1484700000000013e-06,8.1525399999999997e-06,8.1637600000000003e-06,8.1844299999999995e-06,8.2340400000000005e-06,8.2527699999999996e-06,8.2613300000000004e-06,8.3254199999999996e-06,8.39621e-06,8.4016999999999995e-06,8.4063400000000006e-06,8.4254200000000004e-06,8.4368095238095248e-06,8.4621399999999992e-06],"14336":[5.5662999999999999e-05,5.6264999999999997e-05,5.6421700000000002e-05,5.6643e-05,5.7738000000000002e-05,5.7740015151515153e-05,5.7888640000000003e-05,5.8200253521126759e-05,5.8351730000000001e-05,5.8849449999999996e-05,5.8860120000000004e-05,5.8900999999999997e-05,5.9015999999999999e-05,5.9023929999999998e-05,5.9150000000000001e-05,5.9262000000000003e-05,5.9785859374999999e-05,6.0404550000000004e-05,6.0551570000000003e-05,6.1451999999999994e-05],"448":[1.81154e-06,1.81781e-06,1.82221e-06,1.8438199999999999e-06,1.858e-06,1.8583000000000001e-06,1.86587e-06,1.8684300000000002e-06,1.8684782608695652e-06,1.86999e-06,1.87025e-06,1.8731999999999999e-06,1.87467e-06,1.87499e-06,1.87717e-06,1.8796800000000001e-06,1.8876599999999999e-06,1.9157999999999999e-06,1.95442e-06,1.96479e-06],"5505024":[0.030780511499999979,0.031177966000000008,0.031189071499999999,0.031282453000000002,0.031326772499999996,0.031640482999999983,0.031729804,0.031869266999999979,0.03198285599999999,0.0320650845,0.032230315499999988,0.032257195000000002,0.032447429,0.032525617000000014,0.032603884500000006,0.032841338000000012,0.032939946499999997,0.034039153000000009,0.034723433999999984,0.035545673999999999],"544":[2.17896e-06,2.1866400000000002e-06,2.1944900000000001e-06,2.2229200000000001e-06,2.2259499999999998e-06,2.2336399999999999e-06,2.2339400000000002e-06,2.2396699999999999e-06,2.23978e-06,2.23984e-06,2.24067e-06,2.2432100000000002e-06,2.26195e-06,2.2651900000000001e-06,2.27746e-06,2.2850000000000001e-06,2.2890500000000001e-06,2.3381600000000001e-06,2.3485699999999999e-06,2.3803100000000002e-06],"221184":[0.00088992800000000012,0.00092284600000000028,0.00092801899999999976,0.00094236260000000007,0.0009434221111111116,0.0009436560000000004,0.00094547999999999995,0.00094558700000000001,0.000947325777777778,0.00094970309999999958,0.00095217266666666679,0.00095972309999999993,0.00096080899999999997,0.0009611887777777777,0.00096443966666666695,0.00096821910000000001,0.00098996477777777759,0.00099799799999999994,0.0011279299999999996,0.0012457262857142855],"90112":[0.00035436150000000015,0.00035492400000000001,0.00036165399999999999,0.00036637028,0.00036866466666666658,0.00037130438461538499,0.00037421200000000001,0.000376401,0.000376456,0.00037746600000000002,0.0003774859999999999,0.00037899581818181806,0.00037926219230769234,0.00037992180000000003,0.00038279199999999996,0.00038341695652173912,0.00039042688000000004,0.00039193599999999996,0.00039884916666666674,0.00041208800000000002],"640":[2.5906470588235295e-06,2.6026666666666667e-06,2.6099599999999997e-06,2.6117000000000003e-06,2.6119299999999999e-06,2.6123100000000002e-06,2.6145500000000002e-06,2.6145999999999999e-06,2.6150499999999996e-06,2.6152299999999999e-06,2.6164999999999999e-06,2.6206500000000001e-06,2.6250100000000001e-06,2.6252941176470589e-06,2.6496199999999997e-06,2.6704899999999998e-06,2.7320000000000003e-06,2.7583300000000003e-06,2.7602600000000002e-06,2.79103e-06],"12800":[4.9163999999999999e-05,4.9185499999999999e-05,4.9740000000000001e-05,5.0777950000000004e-05,5.1026209302325582e-05,5.1217000000000001e-05,5.1561238636363637e-05,5.1582000000000002e-05,5.1774769999999996e-05,5.18068e-05,5.1973879999999999e-05,5.2109390000000006e-05,5.2427278481012655e-05,5.2696430000000001e-05,5.3117873563218391e-05,5.3291730000000006e-05,5.3443320000000005e-05,5.3579987499999994e-05,5.4007800000000002e-05,5.5895429999999996e-05],"262144":[0.0010571020000000001,0.0010571129999999999,0.001076277,0.001093412,0.001093578,0.0011085819999999999,0.0011098853749999999,0.0011121174999999997,0.00111394425,0.001114778125,0.0011191340000000001,0.0011344025,0.001141736,0.0011425072500000006,0.0011491906,0.0011743816250000001,0.001230758,0.0014266649999999995,0.0014286363333333334,0.0014509306666666665],"589824":[0.0024395810000000001,0.0024661613333333329,0.0024966479999999984,0.002504726000000001,0.0025196089999999999,0.0025203146666666668,0.0025313513333333334,0.0025432759999999993,0.002577740666666667,0.0025790933333333338,0.0025843383333333343,0.002586629,0.002766176999999999,0.0032369894999999989,0.003259812,0.0032802423333333323,0.0032809583333333328,0.0033029235000000003,0.0033579305,0.0036141245],"884736":[0.003766240499999999,0.0037677980000000002,0.0037970060000000012,0.0037986649999999997,0.003831386,0.0038329345000000003,0.0038456634999999998,0.003875645,0.0038965369999999998,0.0038996025,0.0039215860000000003,0.003933013,0.0039549679999999997,0.0039966340000000006,0.00480577,0.004839487,0.004943631999999999,0.0050315620000000016,0.0051317450000000001,0.0051814290000000004],"6144":[2.3721199999999999e-05,2.3791666666666668e-05,2.3836e-05,2.3866000000000002e-05,2.3914499999999999e-05,2.4465390000000001e-05,2.4670329999999999e-05,2.4759740000000002e-05,2.4781140000000002e-05,2.4853499999999998e-05,2.4864000000000001e-05,2.4966639999999999e-05,2.5046606382978725e-05,2.5242649999999998e-05,2.5335000000000001e-05,2.536187000000023e-05,2.5395e-05,2.562603e-05,2.5967999999999999e-05,2.6046000000000001e-05],"1088":[4.2128999999999999e-06,4.3185700000000001e-06,4.3240000000000004e-06,4.3291899999997604e-06,4.3294200000000001e-06,4.3300299999999996e-06,4.3305100000000001e-06,4.33448e-06,4.3367700000000002e-06,4.3384499999999999e-06,4.3408400000000003e-06,4.3408799999999997e-06,4.3431900000000003e-06,4.3579100000000001e-06,4.3609699999999999e-06,4.3615599999999996e-06,4.3676099999999993e-06,4.3799000000000002e-06,4.3971499999999999e-06,4.60856e-06],"576":[2.2958600000000001e-06,2.3066099999999999e-06,2.3097099999999999e-06,2.3105600000000001e-06,2.34761e-06,2.3558100000000002e-06,2.3566700000000003e-06,2.3611300000000001e-06,2.3616599999999999e-06,2.36194e-06,2.3702199999999999e-06,2.37251e-06,2.3815200000000001e-06,2.38647e-06,2.3873899999999999e-06,2.4289599999999997e-06,2.45105e-06,2.45593e-06,2.50217e-06,2.53129e-06],"160":[7.590899999999999e-07,7.5976000000000007e-07,7.6039999999999995e-07,7.6316999999999997e-07,7.6328000000000004e-07,7.6342999999999995e-07,7.6360999999999994e-07,7.6389000000000005e-07,7.6408e-07,7.6436999999999996e-07,7.6457000000000008e-07,7.6509999999999999e-07,7.6528999999999994e-07,7.6571999999999995e-07,7.6662999999999998e-07,7.6733000000000003e-07,7.9181000000000005e-07,8.0285999999999992e-07,8.0373000000000001e-07,8.1869000000000003e-07],"672":[2.6640300000000002e-06,2.71246e-06,2.7184099999999999e-06,2.7334e-06,2.7339200000000003e-06,2.7346800000000001e-06,2.7363000000000004e-06,2.7379000000000001e-06,2.7384700000000001e-06,2.7390299999999999e-06,2.7394099999999998e-06,2.74198e-06,2.7449300000000002e-06,2.7481400000000003e-06,2.75396e-06,2.7555800000000002e-06,2.8524500000000001e-06,2.86799e-06,2.8767634408602154e-06,2.9041400000000001e-06],"8912896":[0.050341193499999992,0.050369648499999996,0.050425993499999988,0.050944161499999988,0.050978542499999988,0.051063609499999996,0.051282118000000008,0.051359571,0.051546827999999989,0.05162264900000002,0.052244179500000008,0.05236223349999998,0.052995320999999984,0.053108274999999969,0.053121561500000004,0.053479562000000001,0.053685276500000004,0.053757926999999997,0.054559260500000019,0.05660780150000002],"100":[5.679e-07,5.6899999999999997e-07,5.7110000000000003e-07,5.7136e-07,5.7136999999999996e-07,5.7151999999999997e-07,5.7167999999999994e-07,5.7212000000000002e-07,5.7248999999999996e-07,5.7280000000000005e-07,5.7301999999999998e-07,5.7309999999999996e-07,5.736e-07,5.8532000000000006e-07,5.8586999999999999e-07,5.8660000000000002e-07,5.8813000000000001e-07,5.8882999999999996e-07,6.2621999999999995e-07,6.2816000000000003e-07],"507904":[0.0020717599999999997,0.0021031464999999999,0.002108249,0.00213010625,0.002139237999999999,0.002162148,0.0021631477499999999,0.002166131,0.0021693260000000001,0.0021815755,0.0021915989999999998,0.0021944825000000008,0.002206740249999999,0.00222544325,0.0022536729999999999,0.0025656569999999998,0.002608202,0.0027236450000000002,0.0027846023333333329,0.0028356429999999988],"3840":[1.4406333333333333e-05,1.48903e-05,1.4890896551724139e-05,1.4918666666666668e-05,1.4979904761904762e-05,1.4986e-05,1.5105349999999999e-05,1.533329e-05,1.5362020000000001e-05,1.549234e-05,1.56125e-05,1.5622250000000001e-05,1.5635200000000002e-05,1.5956599999999999e-05,1.6085700000000001e-05,1.6229899999999999e-05,1.6389159999999999e-05,1.642079e-05,1.739947e-05,1.7500960000000001e-05],"192":[8.8177999999999995e-07,8.8336000000000004e-07,8.8362999999999998e-07,8.8406999999999995e-07,8.8473000000000006e-07,8.8498000000000008e-07,8.8520999999999997e-07,8.8590000000000006e-07,8.8623999999999992e-07,8.8653999999999994e-07,8.867799999999999e-07,8.8832999999999991e-07,8.8980999999999989e-07,8.9010000000000006e-07,9.2633000000000001e-07,9.2961999999999998e-07,9.3394999999999997e-07,9.3851999999999991e-07,9.6377000000000001e-07,9.7001000000000009e-07],"376832":[0.001522504,0.0015415660000000001,0.0015642776666666667,0.001573163,0.001580726,0.0015895518333333334,0.0015951418333333331,0.0016033029999999993,0.001609229,0.001619281,0.001619468,0.0016212998333333332,0.0016445159999999999,0.001699051,0.0018441900000000001,0.0019687110000000002,0.0020150650000000008,0.0020152310000000001,0.002016225,0.0022550259999999998],"98304":[0.0004062730869565217,0.0004074971999999999,0.0004089646956521741,0.00041278999999999996,0.00041322786956521736,0.00041464471428571362,0.000414693,0.00041714199999999996,0.0004197397727272726,0.00042473904347826085,0.00042785652380952413,0.00043173447826086963,0.00043225499999999999,0.00043296816666666663,0.00043329785714285715,0.00043708981818181818,0.00044042942105263145,0.00044087209523809506,0.00044243409090909082,0.00046606872222222217],"5376":[2.0792999999999999e-05,2.0828000000000001e-05,2.0852e-05,2.1138600000000001e-05,2.1384479999999997e-05,2.143332558139535e-05,2.1444e-05,2.1560210000000001e-05,2.159162e-05,2.1605679999999997e-05,2.1642689999999998e-05,2.1643069999999997e-05,2.1644549999999999e-05,2.1669699999999997e-05,2.1688100000000003e-05,2.175e-05,2.2039840000000001e-05,2.2303110000000001e-05,2.2340720000000002e-05,2.2790814814814816e-05],"94208":[0.00037259199999999999,0.00038116974999999998,0.00038119800000000002,0.00038347100000000003,0.00038438700000000003,0.00038928078260869561,0.00039228699999999995,0.00039262599999999998,0.00039545800000000001,0.00039708900000000005,0.00040134549999999985,0.00040218815000000004,0.00040242716666666659,0.00040330125000000004,0.00040353154166666659,0.00040737565217391299,0.00041083299999999993,0.00041749400000000002,0.00042172595238095228,0.00042203761904761926],"81920":[0.00032673799999999992,0.0003282710000000001,0.00032832199999999998,0.00033259300000000006,0.00033405100000000003,0.00033831496428571425,0.000339007,0.00033931079166666663,0.00034003219230769227,0.00034190300000000001,0.0003419815,0.00034248057142857144,0.00034301199999999991,0.00034504246153846169,0.00034603900000000008,0.00034671949999999995,0.00034730199999999991,0.0003523479285714286,0.00035722559090909089,0.00035927499999999988],"3407872":[0.018620932,0.018762636000000006,0.019038305999999998,0.019154495000000004,0.019158093000000001,0.019279643499999999,0.019289503999999992,0.01936186849999999,0.019386578999999998,0.019553942499999998,0.019615331499999999,0.0197335615,0.0197441545,0.019768175500000002,0.019926299500000001,0.020124386999999997,0.02032352450000002,0.020377958000000005,0.020500495000000001,0.021089704500000001],"104":[5.8409999999999994e-07,5.8533000000000001e-07,5.8539000000000008e-07,5.8548000000000003e-07,5.8655000000000002e-07,5.8655999999999998e-07,5.8671999999999995e-07,5.8687000000000007e-07,5.8765999999999996e-07,5.8772000000000002e-07,5.8783999999999995e-07,5.8832000000000007e-07,5.8836000000000001e-07,5.9514285714285704e-07,5.9948000000000002e-07,6.0042000000000003e-07,6.0499999999999992e-07,6.1514999999999995e-07,6.1664999999999995e-07,6.4069e-07],"122880":[0.000477286,0.00049455400000000002,0.00050542950000000023,0.00050573033333333329,0.00050778099999999979,0.00051200478947368417,0.00051789200000000016,0.00052144400000000003,0.00052589800000000001,0.00052652638888888847,0.00053036288235294141,0.00053402431249999997,0.00053416599999999998,0.000534553,0.00053749117647058833,0.00053964362500000024,0.00054423070588235293,0.00054561599999999996,0.00054747155555555566,0.00054862623529411771],"200":[9.1020999999999994e-07,9.1101999999999996e-07,9.1220999999999999e-07,9.1565999999999993e-07,9.1570000000000008e-07,9.1571428571428564e-07,9.1622999999999999e-07,9.1668000000000003e-07,9.1707999999999995e-07,9.1747999999999998e-07,9.1754000000000005e-07,9.1761000000000008e-07,9.1770000000000002e-07,9.1965000000000006e-07,9.2064000000000007e-07,9.2369999999999994e-07,9.5459999999999993e-07,9.5594000000000008e-07,9.6084000000000002e-07,9.6543999999999994e-07],"163840":[0.00067065399999999991,0.00067339500000000003,0.00068316699999999982,0.00068378299999999977,0.000686387,0.00068987699999999987,0.00068997500000000001,0.00069313607692307708,0.00069790492307692333,0.00069875199999999997,0.00069997600000000027,0.00070205500000000004,0.00070522692307692283,0.00070609330769230748,0.00071036084615384615,0.00071509799999999973,0.00071715830769230791,0.00072121007692307708,0.00072671453846153843,0.00075705983333333336],"4063232":[0.021968886999999999,0.022174462999999998,0.022318001000000001,0.022647716499999991,0.022966935000000008,0.023028591999999994,0.023099781999999989,0.023178942000000001,0.023198126999999999,0.02322712,0.023405955999999995,0.0234731665,0.023483702000000002,0.023590172999999999,0.023697399500000001,0.024026025499999999,0.024137021499999998,0.025239514000000001,0.025321483999999998,0.025333658500000002],"5767168":[0.03241163850000002,0.032589232999999995,0.03267875499999999,0.03276315199999999,0.032802730499999988,0.03293321049999999,0.032977621499999998,0.033024250000000019,0.0333473195,0.033941254499999976,0.033981409000000011,0.034027924499999987,0.034039873999999998,0.034065368499999991,0.034073111000000024,0.034141380500000006,0.034256986000000017,0.03481930200000001,0.036731938999999998,0.038342742000000006],"12582912":[0.078116622499999996,0.079443713499999971,0.079610451499999971,0.079744208999999996,0.079799671999999974,0.079826167999999975,0.080026590500000008,0.080160525999999996,0.080422889999999997,0.080627899999999975,0.080732094000000004,0.080955565000000007,0.081168805999999982,0.081244730000000001,0.081717126000000001,0.081791540499999996,0.082283623,0.082519235499999982,0.083267777999999973,0.085086541500000001],"1600":[6.2751500000000004e-06,6.2824799999999999e-06,6.2970227272727276e-06,6.3059799999999997e-06,6.3181499999999998e-06,6.3247100000000005e-06,6.35369e-06,6.3627300000000005e-06,6.3687457627118637e-06,6.3837499999999997e-06,6.4464800000000003e-06,6.4545599999999997e-06,6.4915399999999999e-06,6.4957499999999996e-06,6.5068199999999998e-06,6.51077e-06,6.5316400000000005e-06,6.5423399999999994e-06,6.6600833333333333e-06,6.9907800000000003e-06],"136":[6.6980999999999999e-07,6.6982000000000005e-07,6.7090000000000001e-07,6.7209000000000003e-07,6.7216000000000006e-07,6.7323000000000005e-07,6.7402000000000005e-07,6.7409000000000008e-07,6.7515000000000011e-07,6.7535999999999998e-07,6.7582000000000008e-07,6.7588000000000004e-07,6.7669000000000006e-07,6.7675000000000002e-07,6.7701999999999996e-07,6.7981e-07,7.0645000000000003e-07,7.0658000000000002e-07,7.0719999999999998e-07,1.29024e-06],"232":[1.03312e-06,1.0345500000000001e-06,1.03558e-06,1.03595e-06,1.0359999999999999e-06,1.0373100000000001e-06,1.0378800000000001e-06,1.0382099999999999e-06,1.0386600000000001e-06,1.03882e-06,1.0397500000000001e-06,1.04027e-06,1.0408799999999999e-06,1.04152e-06,1.04402e-06,1.04441e-06,1.04511e-06,1.0887099999999999e-06,1.0891000000000001e-06,1.0891300000000001e-06],"7077888":[0.040296133999999997,0.040447648999999988,0.0405493595,0.040590077499999981,0.040828030000000008,0.041039817499999999,0.041091487999999982,0.041096907000000002,0.041107202000000009,0.041300985499999998,0.041315608999999989,0.041402807500000041,0.041506709500000009,0.041568522000000004,0.041704791000000012,0.041746955500000002,0.04195889000000002,0.042045992499999997,0.042066761500000015,0.042069473999999996],"86016":[0.00034192199999999998,0.00034530699999999988,0.00034600799999999997,0.00034938199999999992,0.00034943000000000002,0.00035180399999999999,0.00035389599999999987,0.00035440680769230777,0.00035449800000000007,0.000356521,0.0003580469999999999,0.00035965900000000002,0.00036037500000000002,0.00036059800000000006,0.00036123861538461534,0.00036584360000000002,0.00036763015384615384,0.00037192999999999997,0.0003723758695652174,0.00037255800000000005],"31744":[0.000124902,0.00012541199999999993,0.00012560499999999999,0.00012684679999999999,0.00012744700000000001,0.00012824360000000001,0.0001290284,0.00012913459210526316,0.00013019440789473685,0.00013037430136986309,0.00013045900000000001,0.00013077557746478874,0.00013176482666666666,0.0001330291506849315,0.0001335675,0.0001337896,0.00013380014285714286,0.00013502419444444446,0.00013540681944444448,0.00013850000000000001],"168":[7.9001999999999998e-07,7.9072999999999988e-07,7.9113999999999998e-07,7.9189000000000003e-07,7.9263000000000002e-07,7.9370999999999998e-07,7.9449000000000002e-07,7.9510000000000002e-07,7.9661999999999994e-07,7.9765999999999996e-07,8.2812999999999994e-07,8.2882999999999999e-07,8.2891000000000008e-07,8.3120000000000008e-07,8.3193000000000001e-07,8.3530999999999993e-07,8.3738e-07,8.6990999999999999e-07,8.7120999999999998e-07,8.7311000000000001e-07],"622592":[0.0025548973333333336,0.0025628813333333335,0.0025834029999999997,0.002640936,0.0026503620000000007,0.0026517733333333332,0.002654067,0.0026550833333333335,0.002669659,0.0026864616666666674,0.0026979450000000006,0.0026991093333333335,0.0026999606666666667,0.0027109520000000008,0.0027205910000000001,0.0032656450000000002,0.0033304705,0.0034166270000000011,0.0034646335000000001,0.0037259389999999984],"108":[5.9889000000000004e-07,5.9964999999999995e-07,6.0037999999999998e-07,6.0073999999999996e-07,6.0090000000000004e-07,6.0098000000000003e-07,6.0127999999999994e-07,6.0173999999999993e-07,6.0226999999999995e-07,6.0243999999999999e-07,6.0250000000000005e-07,6.0288000000000006e-07,6.0470999999999997e-07,6.0643999999999997e-07,6.0717e-07,6.1689000000000001e-07,6.1734000000000005e-07,6.1983000000000007e-07,6.3064000000000009e-07,6.5687999999999999e-07],"327680":[0.0013435911666666667,0.0013627604999999997,0.0013800049999999999,0.001386738,0.0013909969999999999,0.0013916270000000003,0.0013960719999999999,0.0014039623333333335,0.0014041750000000001,0.0014049503333333339,0.001417527,0.0014188918571428572,0.0014201089999999999,0.0014202263333333331,0.0014313556666666666,0.0014543426666666667,0.001662171,0.0018688004,0.001879482,0.001887073],"2176":[8.3784999999999995e-06,8.5244999999999994e-06,8.5584999999999995e-06,8.5831499999999993e-06,8.5885099999999999e-06,8.6407699999999999e-06,8.6596000000000009e-06,8.6603699999999989e-06,8.6697399999999988e-06,8.7161600000000002e-06,8.7182200000000004e-06,8.7375900000000001e-06,8.7535899999999997e-06,8.7667799999999991e-06,8.7972400000000005e-06,8.9191900000000002e-06,8.9481100000000006e-06,9.0915999999999995e-06,9.0978999999999997e-06,9.1681299999999999e-06],"3328":[1.2999e-05,1.3059e-05,1.3296960000000001e-05,1.3368449999999999e-05,1.3461530000000002e-05,1.3491519999999999e-05,1.34925e-05,1.3530000000000001e-05,1.3559310000000001e-05,1.3586080000000001e-05,1.3722809999999999e-05,1.3736e-05,1.3829070000000001e-05,1.386815306122449e-05,1.3906249999999999e-05,1.4026240000000001e-05,1.4077099999999999e-05,1.4083609999999999e-05,1.4090050000000001e-05,1.4190529999999999e-05],"1":[1.5495999999999998e-07,1.5505e-07,1.5525000000000002e-07,1.5545000000000001e-07,1.5568999999999999e-07,1.5577999999999998e-07,1.5580999999999999e-07,1.5584e-07,1.5585000000000001e-07,1.5590000000000001e-07,1.5617e-07,1.5662000000000001e-07,1.5783e-07,1.6306000000000001e-07,1.6325999999999999e-07,1.6343e-07,1.638e-07,1.6487999999999998e-07,1.7130000000000001e-07,1.7323e-07],"2":[1.5836e-07,1.5869999999999999e-07,1.5883e-07,1.5892e-07,1.5900000000000001e-07,1.5902999999999999e-07,1.5914000000000001e-07,1.5919000000000001e-07,1.5941e-07,1.5993999999999999e-07,1.6096000000000001e-07,1.6120000000000001e-07,1.6201000000000001e-07,1.6591000000000001e-07,1.6609e-07,1.6623e-07,1.6633000000000001e-07,1.6642999999999999e-07,1.6819e-07,1.6929999999999999e-07],"3":[1.6088e-07,1.6152000000000001e-07,1.6180000000000001e-07,1.6205000000000003e-07,1.621e-07,1.6217999999999999e-07,1.6217999999999999e-07,1.6220000000000001e-07,1.6220999999999999e-07,1.6226e-07,1.6229999999999999e-07,1.624e-07,1.6353000000000001e-07,1.6381000000000001e-07,1.6578999999999998e-07,1.6903999999999998e-07,1.6915e-07,1.6925000000000001e-07,1.6966999999999998e-07,1.7048999999999999e-07],"4":[1.6486000000000001e-07,1.6487999999999998e-07,1.6498000000000001e-07,1.6500000000000001e-07,1.6512000000000001e-07,1.6518e-07,1.6521999999999999e-07,1.6521999999999999e-07,1.6523e-07,1.6528999999999999e-07,1.6535000000000001e-07,1.6541e-07,1.6551999999999999e-07,1.6585000000000002e-07,1.6609999999999999e-07,1.6782999999999999e-07,1.6888000000000001e-07,1.73e-07,1.7321e-07,1.7592e-07],"7424":[2.8722999999999999e-05,2.9079879999999998e-05,2.9099019999999998e-05,2.9172439999999998e-05,2.9669e-05,2.9957176470588232e-05,2.9957570000000001e-05,2.997684e-05,3.0008190476190479e-05,3.0013166666666669e-05,3.0017000000000001e-05,3.0044999999999998e-05,3.0295840000000002e-05,3.0655479999999997e-05,3.0732000000000003e-05,3.096656e-05,3.1339583333333337e-05,3.1448069999999999e-05,3.146241176470588e-05,3.1792319999999999e-05],"5":[1.6742e-07,1.6779e-07,1.6787999999999999e-07,1.6807999999999998e-07,1.6828e-07,1.6829999999999999e-07,1.6864999999999999e-07,1.6866e-07,1.6971e-07,1.698e-07,1.7005000000000002e-07,1.7416000000000002e-07,1.7564999999999999e-07,1.7583000000000001e-07,1.7699e-07,1.7700999999999999e-07,1.7828000000000001e-07,1.8173e-07,1.8456999999999999e-07,1.8465999999999999e-07],"23552":[9.0320000000000003e-05,9.0480000000000001e-05,9.0500000000000004e-05,9.1531000000000002e-05,9.1958499999999997e-05,9.2222571428571425e-05,9.2245999999999997e-05,9.2497000000000006e-05,9.2719428571428567e-05,9.2930999999999995e-05,9.4079999999999994e-05,9.4521447058823526e-05,9.4777000000000004e-05,9.5956367346938784e-05,9.6470458333333339e-05,9.6776829787234038e-05,9.7713000000000004e-05,9.8375913580246927e-05,9.8689836734693878e-05,9.9262800000000001e-05],"6":[1.7113999999999998e-07,1.7115000000000002e-07,1.7125999999999999e-07,1.7142999999999999e-07,1.7146000000000003e-07,1.7167e-07,1.7267e-07,1.7275000000000001e-07,1.7309e-07,1.7316000000000002e-07,1.7394000000000001e-07,1.7493999999999998e-07,1.7898000000000001e-07,1.7935e-07,1.7945999999999999e-07,1.7951000000000002e-07,1.7957000000000001e-07,1.8008999999999999e-07,1.8112e-07,1.8983e-07],"61440":[0.00024091,0.00024306000000000002,0.00024383599999999996,0.00024831566666666668,0.00024855199999999987,0.00024986305263157891,0.0002500145128205129,0.00025133528205128206,0.00025159100000000001,0.00025279492307692309,0.00025319035135135131,0.00025479623076923072,0.00025514892307692308,0.00025546300000000015,0.00025564556756756747,0.00025684186111111113,0.00025833399999999998,0.00026407833333333332,0.00026426535135135135,0.00027861541176470601],"491520":[0.0020514234999999999,0.0020861579999999998,0.002088683,0.0020992299999999997,0.0021057282500000002,0.0021302860000000008,0.002130575,0.0021342345000000002,0.0021590160000000006,0.0021609575,0.0021701204999999999,0.0021867790000000002,0.0022204464999999998,0.0023616037499999995,0.0025907996666666667,0.0026610676666666668,0.0027038710000000009,0.0027254533333333332,0.0028220296666666665,0.0028875250000000002],"77824":[0.00030949999999999999,0.00031225099999999988,0.00031526699999999999,0.00031537599999999986,0.0003160900000000001,0.00031612899999999985,0.0003171170645161291,0.00032264799999999992,0.000322808,0.00032387890000000008,0.00032395899999999991,0.00032449784615384613,0.00032599000000000007,0.00032662375000000005,0.0003277030000000001,0.00032793303571428573,0.00032827449999999988,0.00032837596666666663,0.00032945624137931042,0.00033359286206896554],"7":[1.7305999999999999e-07,1.7371000000000001e-07,1.7394000000000001e-07,1.7396999999999999e-07,1.7401000000000001e-07,1.7407000000000002e-07,1.7445e-07,1.7455000000000001e-07,1.7455000000000001e-07,1.7468e-07,1.7515e-07,1.7594000000000003e-07,1.7629e-07,1.7665000000000001e-07,1.7702000000000001e-07,1.8171e-07,1.8246000000000001e-07,1.8414000000000001e-07,1.9062000000000002e-07,1.9186e-07],"8":[1.7716999999999999e-07,1.7730999999999999e-07,1.7733000000000001e-07,1.7791999999999999e-07,1.7867999999999998e-07,1.7881e-07,1.7924000000000001e-07,1.7938000000000001e-07,1.7980999999999999e-07,1.8014999999999998e-07,1.8513000000000002e-07,1.8527000000000002e-07,1.8597000000000002e-07,1.8649e-07,1.8768e-07,1.9224999999999999e-07,1.9438e-07,1.9443999999999999e-07,1.9525e-07,2.0998999999999999e-07],"208":[9.4269999999999999e-07,9.4486e-07,9.4717999999999999e-07,9.4779999999999995e-07,9.4954999999999998e-07,9.5179000000000008e-07,9.5197000000000007e-07,9.5290000000000002e-07,9.5349999999999996e-07,9.8424999999999994e-07,9.8991999999999996e-07,9.9148000000000003e-07,9.9288999999999999e-07,9.9366000000000007e-07,9.9507999999999988e-07,9.9584999999999996e-07,9.963000000000001e-07,1.0343799999999999e-06,1.0368499999999999e-06,1.04804e-06],"9":[1.7979e-07,1.8005e-07,1.8012e-07,1.8021e-07,1.8036999999999999e-07,1.8060999999999997e-07,1.8087e-07,1.8150999999999999e-07,1.8229e-07,1.8260000000000001e-07,1.8276e-07,1.8349000000000001e-07,1.8414000000000001e-07,1.8853000000000001e-07,1.8881000000000001e-07,1.8909000000000001e-07,1.8935000000000001e-07,1.8946e-07,1.8989000000000001e-07,2.0166999999999998e-07],"73728":[0.00028715750000002393,0.00029279399999999998,0.00029295200000000002,0.00029749999999999991,0.00029829800000000001,0.00030074496666666667,0.00030205070967741931,0.00030212922580645171,0.00030286182758620689,0.00030512210000000004,0.00030640449999999998,0.00030653399999999991,0.00030757500000000014,0.00030807896774193546,0.00031122399999999986,0.0003128640666666667,0.00031383173333333333,0.00031496056666666675,0.00031532499999999998,0.00032025249999999999],"304":[1.2940099999999999e-06,1.2963e-06,1.2968699999999998e-06,1.30256e-06,1.31076e-06,1.3108199999999999e-06,1.3114999999999999e-06,1.3132000000000002e-06,1.3140800000000001e-06,1.3147500000000002e-06,1.3147699999999999e-06,1.3162499999999999e-06,1.31802e-06,1.32764e-06,1.36783e-06,1.372e-06,1.37382e-06,1.37415e-06,1.37849e-06,1.3837599999999999e-06],"400":[1.6429800000000001e-06,1.6747800000000001e-06,1.6781399999999999e-06,1.6784300000000001e-06,1.6792500000000001e-06,1.6797e-06,1.6800400000000001e-06,1.6808599999999998e-06,1.6809999999999999e-06,1.6829099999999999e-06,1.68534e-06,1.6858199999999999e-06,1.68635e-06,1.69018e-06,1.7013900000000001e-06,1.7264599999999999e-06,1.7644800000000001e-06,1.76776e-06,1.7719299999999999e-06,1.84413e-06],"1310720":[0.0069985665000000001,0.0070857045000000032,0.007090505500000008,0.0071112584999999976,0.0071227684999999961,0.0071455709999999981,0.0072000634999999993,0.0072336915000000019,0.0072550195000000055,0.0072664344999999993,0.0072855305000000007,0.007340188999999997,0.0073509085000000004,0.0074107980000000032,0.0074333899999999998,0.0074750655000000001,0.0075229019999999997,0.0076295285000000032,0.0081701659999999995,0.008804776999999998],"336":[1.4119600000000002e-06,1.4192100000000002e-06,1.4321500000000001e-06,1.4327099999999999e-06,1.4348200000000001e-06,1.4358099999999999e-06,1.4368599999999999e-06,1.4382699999999999e-06,1.43852e-06,1.43937e-06,1.4407700000000001e-06,1.4408499999999999e-06,1.44125e-06,1.4423300000000001e-06,1.4451599999999999e-06,1.50197e-06,1.50276e-06,1.5040600000000001e-06,1.5068300000000001e-06,1.5077600000000002e-06],"3670016":[0.020058046,0.020414257499999981,0.020520301499999994,0.020535081,0.020562979499999998,0.020606599500000003,0.020622551999999999,0.020769515000000002,0.020856933500000004,0.0210460315,0.021072585499999998,0.021105890499999995,0.0211182725,0.021136428999999998,0.021175212500000002,0.0212359425,0.021428656499999973,0.0216012475,0.021838454,0.02213362100000001],"6656":[2.56915e-05,2.5743666666666669e-05,2.6009499999999999e-05,2.6069617647058824e-05,2.6503118644067796e-05,2.6575539999999999e-05,2.6633000000000001e-05,2.6642e-05,2.6664800000000003e-05,2.6702758064516128e-05,2.6807179999999998e-05,2.6926129999999998e-05,2.6959000000000001e-05,2.7129319999999999e-05,2.7277089999999999e-05,2.7808429999999998e-05,2.7899779999999999e-05,2.8027930000000002e-05,2.9699079999999997e-05,3.0415559999999998e-05],"15360":[5.8211000000000002e-05,6.0375999999999999e-05,6.0631999999999998e-05,6.0699120000000004e-05,6.1094999999999997e-05,6.1181930000000007e-05,6.1626149999999993e-05,6.1779241379310344e-05,6.1853999999999994e-05,6.2610870000000005e-05,6.2651508771929826e-05,6.2971166666666664e-05,6.3096469999999999e-05,6.3102000000000007e-05,6.3329109999999997e-05,6.3423346153846153e-05,6.3537060000000003e-05,6.3813357142857152e-05,6.3984648148148151e-05,6.9998020000000004e-05],"432":[1.7572099999999999e-06,1.7584900000000001e-06,1.77033e-06,1.79573e-06,1.79856e-06,1.8017799999999999e-06,1.8049000000000001e-06,1.8049999999999999e-06,1.8052500000000002e-06,1.8055799999999998e-06,1.8058199999999998e-06,1.8076299999999998e-06,1.8076999999999999e-06,1.8106099999999999e-06,1.8139799999999998e-06,1.8201558441558442e-06,1.8288599999999999e-06,1.9011000000000001e-06,1.9867500000000001e-06,1.99218e-06],"950272":[0.0039046904999999999,0.0039579875000000002,0.0039731520000000006,0.00402178,0.004033427,0.0040601120000000003,0.0040708044999999988,0.0040792599999999995,0.00408501,0.0041189190000000004,0.0041234129999999985,0.0041458440000000001,0.0041791180000000008,0.0042894355,0.0053005019999999995,0.0053233280000000004,0.005326735,0.0053624509999999981,0.0054176599999999986,0.0054532700000000014],"655360":[0.0026763109999999989,0.002692828,0.0026930779999999998,0.0027192000000000002,0.0027237613333333335,0.0027334399999999993,0.002745662666666667,0.0027932753333333332,0.002794936,0.0027993696666666662,0.0028225333333333335,0.0028457070000000007,0.0028786943333333321,0.0029485443333333327,0.0034054149999999993,0.003568215,0.0035958975,0.0038021220000000015,0.003810061500000001,0.003830497],"69632":[0.00027962100000000013,0.00028250599999999981,0.00028768199999999999,0.00028871799999999998,0.00028913293548387092,0.00028941172727272723,0.00028995388235294106,0.0002913325,0.0002914800000000001,0.00029260506060606046,0.00029275299999999998,0.00029297946874999999,0.0002939496071428572,0.00029522000000000001,0.00029695393548387095,0.00029697803225806459,0.00029786838709677419,0.00030471234374999999,0.00030879750000000009,0.00031912186206896565],"11264":[4.3220100000000003e-05,4.3444823529411764e-05,4.3825333333333335e-05,4.4268222222222222e-05,4.4592000000000003e-05,4.4613000000000001e-05,4.5294066666666664e-05,4.5356533333333332e-05,4.5625450000000002e-05,4.5688153846153848e-05,4.5796999999999995e-05,4.6519860000000006e-05,4.6742299999999995e-05,4.6757789999999994e-05,4.6812299999999999e-05,4.6848560000000001e-05,4.7570500000000001e-05,4.8303999999999997e-05,4.8769666666666668e-05,5.1531069999999997e-05],"2752512":[0.014975552499999998,0.0150379525,0.015095016999999999,0.015308302499999999,0.015354185500000003,0.015403448,0.015437583999999999,0.0154789695,0.015612544499999995,0.0156217645,0.015623808499999999,0.015646466499999994,0.015670756000000001,0.015698622000000006,0.015713876000000009,0.015815683000000004,0.016111692,0.016132624499999994,0.017594739000000009,0.018111549500000001],"8126464":[0.045569341499999999,0.046827951999999999,0.046966777500000015,0.04718206199999999,0.047244309500000005,0.047320236000000002,0.047353256999999996,0.047387407000000006,0.047455847000000002,0.047472888499999991,0.047605622,0.047945435999999994,0.048267654,0.048451236500000015,0.048664088500000001,0.048947044999999981,0.049067684,0.049164776,0.049466106500000009,0.049651851999999996],"27648":[0.000105275,0.000108059,0.000108083,0.000108359,0.00010924,0.00011022899999999999,0.0001109235,0.0001110635,0.000111109,0.00011273934090909091,0.00011277626506024101,0.00011331046590909093,0.000113497,0.00011356845977011493,0.000114157421686747,0.000114385,0.00011573572839506173,0.0001164,0.00011739885915492956,0.0001189624383561644],"368":[1.5230699999999999e-06,1.5593499999999999e-06,1.5596800000000002e-06,1.5598700000000001e-06,1.5605200000000001e-06,1.5615e-06,1.5615e-06,1.56282e-06,1.5641e-06,1.56555e-06,1.5661900000000001e-06,1.5673e-06,1.5686000000000001e-06,1.57049e-06,1.6284700000000002e-06,1.6404800000000001e-06,1.64205e-06,1.64327e-06,1.6974700000000001e-06,1.7060299999999998e-06],"65536":[0.00026545099999999999,0.0002666104,0.00026667866666666665,0.0002707229333333333,0.000272854,0.00027354200000000005,0.00027534022857142855,0.00027579582352941178,0.00027612399999999999,0.00027662848484848483,0.00027675200000000001,0.00027737699999999998,0.00027745628125,0.00027783943750000009,0.00027953200000000014,0.00028143267647058828,0.00028216575757575757,0.00028335000000000008,0.000288244,0.00028996839393939384],"16252928":[0.091915837499999958,0.092897177499999997,0.093057589999999996,0.09317669050000002,0.093837585500000015,0.093877152499999977,0.093953638499999992,0.094511798500000008,0.094543653000000033,0.094903101500000031,0.095068861500000004,0.095085139000000013,0.095526413000000004,0.096221807999999992,0.096288956000000037,0.096568577499999961,0.096581284500000003,0.096763106500000015,0.096939035000000007,0.097793761500000007],"464":[1.87265e-06,1.8853199999999999e-06,1.9168099999999999e-06,1.9236300000000001e-06,1.9238999999999999e-06,1.9262399999999997e-06,1.9285600000000002e-06,1.9300499999999998e-06,1.9307899999999999e-06,1.9315999999999999e-06,1.9344000000000001e-06,1.9346099999999999e-06,1.9347700000000001e-06,1.9359999999999998e-06,1.9366799999999999e-06,1.9381900000000001e-06,1.9406199999999998e-06,1.9949599999999997e-06,2.0034499999999999e-06,2.01556e-06],"1015808":[0.0041559789999999997,0.0042551120000000001,0.0043080720000000013,0.0043093860000000001,0.0043294760000000022,0.0043491614999999996,0.0044018029999999984,0.0044390294999999986,0.0044454580000000011,0.0044658145,0.0044670635,0.0044884129999999984,0.0044929830000000025,0.0045248809999999988,0.0045718884999999976,0.0054114709999999993,0.0055131959999999997,0.0056613840000000002,0.0057976569999999986,0.0060034269999999978],"3072":[1.1865666666666665e-05,1.1977999999999999e-05,1.198912987012987e-05,1.2007999999999999e-05,1.2235580000000001e-05,1.23021e-05,1.230473e-05,1.2316919999999999e-05,1.2360898305084745e-05,1.2381680000000001e-05,1.239266e-05,1.2403600000000001e-05,1.2413330000000001e-05,1.2453900000000001e-05,1.2496730000000001e-05,1.2507060000000002e-05,1.258971e-05,1.266638e-05,1.2732819999999999e-05,1.2923329999999999e-05],"110592":[0.00042951900000000006,0.00044288899999999997,0.0004439866666666667,0.00045139300000000018,0.00045539485714285715,0.00045776999999999998,0.000460667,0.00046332399999999988,0.00046385799999999999,0.00046602629999999997,0.0004663969999999998,0.00046844650000000003,0.00047175934999999999,0.000471867,0.00047882159999999998,0.00048336494736842098,0.00048338580000000019,0.00048688600000000001,0.00048895684210526283,0.00050945455555555534],"237568":[0.00096329530000000029,0.00097126100000000039,0.00099909299999999994,0.00099990455555555536,0.001003279375,0.0010081860000000001,0.0010105343333333334,0.0010117262222222219,0.0010136133333333336,0.0010147697777777775,0.0010158423333333337,0.001019397555555556,0.0010210199999999999,0.0010229518888888892,0.0010239404444444444,0.0010258277777777777,0.0010276123333333334,0.0010432208888888886,0.001268122,0.0013440587142857143],"278528":[0.0011447895,0.0011819517500000001,0.001187305,0.00119681,0.0011968160000000005,0.0011978197142857145,0.00119840425,0.0011986989999999999,0.0012013347500000001,0.0012082099999999999,0.0012108226666666662,0.0012116310000000001,0.0012138089999999999,0.0012215415,0.0012345885714285711,0.0013229577142857144,0.0014841283333333331,0.0015382589999999997,0.0015536385000000004,0.0015681983333333334],"496":[1.9901199999999999e-06,2.04465e-06,2.0448100000000002e-06,2.0453499999999998e-06,2.0480999999999999e-06,2.0519799999999999e-06,2.05223e-06,2.0556400000000001e-06,2.05766e-06,2.0582800000000001e-06,2.0602300000000002e-06,2.0633100000000001e-06,2.0655099999999998e-06,2.0658199999999999e-06,2.0666700000000001e-06,2.06794e-06,2.0775700000000003e-06,2.1044600000000001e-06,2.1398799999999999e-06,2.1799999999999999e-06],"13107200":[0.080415331999999992,0.08065599850000002,0.081183189999999988,0.081905734000000022,0.082151186500000001,0.08220200250000001,0.082298897000000051,0.082537103000000001,0.083319339999999992,0.083464969999999999,0.083689821999999942,0.08392313550000001,0.083924611999999996,0.083950813000000013,0.084189869000000001,0.084574126000000027,0.084625953000000004,0.085018247999999977,0.085271538000000049,0.086229430999999995],"9961472":[0.057120267500000002,0.058327470499999999,0.066475877999999988,0.066528001000000003,0.066801517000000005,0.067024881499999966,0.067086196000000028,0.067465884000000004,0.06771748750000002,0.067942730000000021,0.068240475999999967,0.068447065999999973,0.068628579999999967,0.068805534000000029,0.068861040499999998,0.06958009200000001,0.069755689999999981,0.069900094999999968,0.07014013500000002,0.071093043999999966],"5888":[2.2832540000000001e-05,2.2890179999999998e-05,2.289039e-05,2.3341429999999999e-05,2.3527560000000002e-05,2.353678e-05,2.3558730000000001e-05,2.3576949999999998e-05,2.3652e-05,2.3765809999999999e-05,2.37957e-05,2.3889259999999999e-05,2.3949969999999997e-05,2.4032999999999998e-05,2.4246705263157897e-05,2.4299833333333334e-05,2.4408830000000001e-05,2.4674480000000001e-05,2.4882590000000001e-05,2.5662720000000002e-05],"11010048":[0.071298924999999971,0.07186766,0.07203457300000006,0.072205649000000011,0.072290384999999985,0.072331059000000003,0.073093403000000001,0.073677499000000007,0.073775020999999996,0.07387479000000001,0.074044424000000025,0.074236580999999996,0.074245349500000002,0.07436097500000001,0.074580382499999959,0.074888392999999998,0.075005817500000002,0.075118204000000022,0.075166030999999994,0.075510825999999989],"1920":[7.5509400000000002e-06,7.5681800000000001e-06,7.6255000000000001e-06,7.6587899999999996e-06,7.7048600000000003e-06,7.7158800000000004e-06,7.7320399999999992e-06,7.7376099999999993e-06,7.75341e-06,7.7609099999999995e-06,7.77966e-06,7.7811400000000002e-06,7.7822600000000006e-06,7.8768999999999991e-06,7.8916299999999995e-06,7.9405100000000003e-06,7.9466900000000007e-06,7.9549166666666657e-06,7.9680000000000006e-06,8.0035800000000011e-06],"2490368":[0.013262899,0.013403455,0.013571129500000001,0.013611844500000001,0.013654395500000003,0.013659259,0.0138974315,0.013928536,0.013931954999999999,0.013953694000000008,0.014086132500000001,0.014090706499999999,0.0141020105,0.014160322999999999,0.014312179999999999,0.0145590055,0.014603494999999999,0.0150483405,0.015075021499999994,0.015343354500000014],"19456":[7.4556999999999998e-05,7.4797999999999998e-05,7.4881000000000004e-05,7.6112049999999996e-05,7.6157999999999998e-05,7.8063000000000001e-05,7.8095499999999998e-05,7.8249208333333335e-05,7.8333999999999999e-05,7.846343e-05,7.8742689999999993e-05,7.8868695652173918e-05,7.9171920000000001e-05,7.9373889999999995e-05,7.9768086956521735e-05,8.0110819999999993e-05,8.0606217391304347e-05,8.0834000000000006e-05,8.1535909090909089e-05,8.1855670000000001e-05],"57344":[0.00022137950000000002,0.00022313200000000002,0.00022333000000000002,0.00022924792105263159,0.00022947150000000001,0.000230409,0.00023107250000000003,0.0002314599999999999,0.000234062,0.00023556525,0.0002358330476190475,0.00023608800000000002,0.00023687715384615384,0.000236912775,0.000237103125,0.00023713275675675679,0.00023722934210526308,0.00023877500000000002,0.00024242999999999999,0.00024337099999999998],"1179648":[0.0051366219999999987,0.0057084435000000003,0.0061321409999999989,0.0063384789999999984,0.0064128889999999997,0.0064505369999999975,0.0064537675000000032,0.0064635150000000004,0.0064713974999999783,0.006504513,0.0065268645,0.0065369550000000023,0.006555617500000002,0.0066329205000000002,0.0066489605000000004,0.0066502055000000017,0.006651005500000003,0.006842117,0.0070674350000000021,0.0074296205000000002],"4718592":[0.026463908500000011,0.0267456285,0.0267960065,0.026813972999999998,0.0269036785,0.027081846499999996,0.027109128,0.027325008500000005,0.0273687915,0.027391667000000008,0.027521797000000008,0.027527473,0.027533348499999999,0.027804641000000008,0.027842137999999999,0.027894417999999983,0.027957362499999999,0.028391272000000013,0.0286680515,0.028705810999999998],"360448":[0.0015087378333333329,0.0015205423333333333,0.0015372369999999999,0.0015419936666666667,0.0015424341666666669,0.0015444384999999999,0.0015485663333333339,0.0015521186666666669,0.001555973,0.0015562694999999996,0.0015686984999999994,0.0015767031666666671,0.0016034718333333333,0.0016041813333333335,0.0016079934,0.001913049,0.0019917945,0.0020321697500000008,0.0020362575000000003,0.002170057],"1572864":[0.0085151559999999994,0.0085588285000000007,0.0086163309999999996,0.0086419005000000007,0.0086851669999999971,0.0086855165000000022,0.0087125450000000004,0.0087313374999999985,0.0087525834999999975,0.0087566450000000004,0.0089241700000000004,0.0089494644999999953,0.0089554985000000007,0.0089869054999999996,0.0090323279999999992,0.0090385324999999982,0.0092379415000000027,0.0094150930000000046,0.0094751174999999997,0.010441432],"53248":[0.000201554,0.00020654900000000004,0.000209574,0.00021136700000000001,0.00021277700000000001,0.00021304913636363646,0.00021486499999999998,0.00021599100000000001,0.0002165635,0.00021860807142857146,0.00021878228571428577,0.00021904700000000007,0.00022169899999999998,0.000221929,0.00022225152272727271,0.00022226165853658552,0.00022399546511627904,0.00022404065789473687,0.00022496304761904766,0.00022546999999999991],"3456":[1.3002999999999999e-05,1.3663069999999999e-05,1.376375e-05,1.3842297872340426e-05,1.3880909999999999e-05,1.391508e-05,1.3922570000000001e-05,1.400802e-05,1.403e-05,1.407663e-05,1.4091477611940299e-05,1.4099979999999999e-05,1.418545e-05,1.4248909999999999e-05,1.428275e-05,1.43989e-05,1.448101e-05,1.4615430000000001e-05,1.4637920000000001e-05,1.4654510000000001e-05],"40960":[0.00015728850000000001,0.00016177449999999993,0.000161917,0.000162251,0.000162344,0.00016246200000000007,0.00016315333333333335,0.000164556,0.00016475999999999996,0.0001649155,0.00016512099999999995,0.00016523028571428574,0.00016762233898305086,0.00016916719642857139,0.00016938050000000007,0.0001694196041666667,0.00017019443396226416,0.00017033586538461542,0.00017054700000000001,0.0001724595],"4608":[1.73e-05,1.8509970000000002e-05,1.8569720000000001e-05,1.8589580000000001e-05,1.86131e-05,1.8643310000000002e-05,1.866319e-05,1.8686830000000001e-05,1.8783759999999999e-05,1.886161e-05,1.887745e-05,1.891102e-05,1.8953e-05,1.9005380000000001e-05,1.922103e-05,1.9324450000000001e-05,1.9330260000000001e-05,1.9337499999999999e-05,1.962651e-05,2.0437082191780821e-05],"13824":[5.3205999999999998e-05,5.3267999999999999e-05,5.4746000000000001e-05,5.4898980000000003e-05,5.5158454545454542e-05,5.5188000000000001e-05,5.5318609999999997e-05,5.559299e-05,5.5681315068493157e-05,5.5683500000000003e-05,5.5733000000000003e-05,5.590048684210518e-05,5.6440509999999997e-05,5.6972239999999992e-05,5.7108580000000003e-05,5.7127447761194032e-05,5.7279648648648653e-05,5.780152e-05,5.8170794117647055e-05,5.8365459999999999e-05],"819200":[0.0033396190000000011,0.0033953580000000002,0.0034525235,0.0034862719999999999,0.0035146069999999986,0.0035262395000000002,0.003532244999999999,0.0035480809999999989,0.0035560015000000002,0.0035684434999999986,0.003590033000000002,0.0036043729999999997,0.003616953,0.003642764000000001,0.003646565,0.004430392,0.0044713550000000006,0.0045850450000000003,0.004727317,0.004732633],"983040":[0.0040532885000000001,0.0041983569999999998,0.004199174,0.0042306429999999992,0.0042411149999999984,0.0042623544999999992,0.0042778264999999999,0.0042792790000000022,0.0042902640000000002,0.0042922689999999996,0.0043527110000000022,0.0043671845000000003,0.0045361050000000003,0.0053003259999999993,0.0053282720000000002,0.0054038569999999998,0.0054388049999999997,0.0055479330000000032,0.0055919165000000003,0.0056398374999999997],"8704":[3.3565666666666669e-05,3.4399e-05,3.4554030000000004e-05,3.4821669999999997e-05,3.4961858974358974e-05,3.4998690140845072e-05,3.5085820000000004e-05,3.5098999999999997e-05,3.5170999999999999e-05,3.5223089999999998e-05,3.5300399999999998e-05,3.5374270000000002e-05,3.5558549999999999e-05,3.6306000000000001e-05,3.640043e-05,3.6646914893617023e-05,3.6774019999999999e-05,3.6797e-05,3.770986e-05,3.7812193548387098e-05],"120":[6.4350999999999992e-07,6.4562999999999999e-07,6.4616000000000001e-07,6.4700000000000001e-07,6.4741999999999996e-07,6.4765999999999991e-07,6.4769e-07,6.4772999999999994e-07,6.4826000000000006e-07,6.4942e-07,6.4950999999999994e-07,6.5017000000000006e-07,6.5026999999999996e-07,6.5203000000000005e-07,6.6026999999999997e-07,6.6169999999999995e-07,6.6235999999999996e-07,6.6285999999999999e-07,6.6609999999999996e-07,7.1054000000000006e-07],"1024":[4.0102600000000001e-06,4.0208800000000002e-06,4.0787499999999997e-06,4.0834800000000002e-06,4.0853100000000004e-06,4.0892199999999994e-06,4.0896300000000002e-06,4.0917600000000001e-06,4.0971500000000002e-06,4.0974099999999998e-06,4.0977100000000004e-06,4.09906e-06,4.1064999999999996e-06,4.1082199999999996e-06,4.1669300000000003e-06,4.2430400000000001e-06,4.2999999999999995e-06,4.4661999999999997e-06,4.5246199999999995e-06,4.8170699999999996e-06],"49152":[0.00018866650000000002,0.00018921899999999996,0.000190671,0.00019284283333333331,0.000193227,0.00019742299999999996,0.00019765900000000007,0.00019814563636363631,0.00019894438297872333,0.00019986124999999991,0.00020239568085106378,0.00020252100000000005,0.00020265212765957445,0.00020395566666666669,0.0002042716956521739,0.00020501835555555549,0.00020540112765957447,0.000206918,0.0002081183333333333,0.00021060804761904758],"524288":[0.0021491434999999998,0.0022009589999999989,0.0022117770000000007,0.0022223297499999991,0.0022328987500000001,0.00223770175,0.0022422279999999998,0.0022537627499999999,0.0022549789999999998,0.0022599550000000001,0.0022773760000000002,0.0022925050000000002,0.0023192417500000001,0.0027608540000000005,0.0028223879999999995,0.0028267129999999989,0.0028511403333333334,0.0029848020000000008,0.0031379863333333329,0.003203117000000001],"45056":[0.000173055,0.000173129,0.00017472400000000007,0.00017496850000000004,0.00017776675,0.00017893849999999997,0.00018259980000000001,0.00018316590000000001,0.00018425610416666666,0.00018465148936170207,0.00018480172340425532,0.00018527800000000001,0.00018588900000000001,0.0001860258039215687,0.000186116,0.00018650266666666673,0.0001875,0.00018990000000000001,0.00018997733333333332,0.0001955514130434783],"229376":[0.00093466350000000003,0.00094050399999999999,0.00095161619999999982,0.00095951020000000008,0.00096789999999999962,0.00096876500000000023,0.00097167666666666663,0.00098207677777777764,0.00098271133333333342,0.00098813999999999977,0.00098852644444444434,0.00099582855555555537,0.00099941699999999962,0.0010137736666666667,0.0010193936666666663,0.001028387,0.0010868962222222226,0.001187731,0.001245239,0.001245465857142857],"2688":[1.04765e-05,1.0487666666666666e-05,1.0505e-05,1.063671e-05,1.0664369999999999e-05,1.067485e-05,1.069779e-05,1.0724919999999999e-05,1.0742720000000001e-05,1.0760689999999999e-05,1.082405e-05,1.082524e-05,1.090616e-05,1.091198e-05,1.0921559999999999e-05,1.092183e-05,1.0996490000000002e-05,1.1030989999999999e-05,1.104696e-05,1.108215e-05],"152":[7.2702000000000001e-07,7.3039000000000007e-07,7.3068000000000003e-07,7.3176000000000009e-07,7.321900000000001e-07,7.3285e-07,7.3382999999999995e-07,7.3474999999999993e-07,7.3502777777777775e-07,7.3509e-07,7.3519000000000001e-07,7.3537e-07,7.3539000000000002e-07,7.3618999999999998e-07,7.3621000000000011e-07,7.3640999999999991e-07,7.3658000000000005e-07,7.7107999999999999e-07,7.9888000000000007e-07,8.6855999999999999e-07],"5120":[1.9632000000000001e-05,1.9882999999999999e-05,2.029242e-05,2.0521990000000004e-05,2.0616999999999999e-05,2.0618730000000002e-05,2.0662e-05,2.066694e-05,2.0825750000000003e-05,2.0864257575757576e-05,2.0878200000000003e-05,2.092742e-05,2.1002439999999997e-05,2.1288999999999999e-05,2.156087e-05,2.1624769999999998e-05,2.1735749999999999e-05,2.1769960000000001e-05,2.1779840000000001e-05,2.3122009999999997e-05],"1507328":[0.0081086004999999985,0.0081265605000000012,0.0081788065,0.008194592500000002,0.0083168655000000029,0.0083570129999999999,0.0083607785000000007,0.0083689915000000007,0.008370031,0.0083914985000000004,0.0084493109999999993,0.0084961515000000001,0.0084977720000000007,0.0085217444999999992,0.0086798204999999993,0.0086822965000000005,0.0088326120000000001,0.0088690730000000034,0.0089789209999999973,0.009595577000000001],"1216":[4.8118799999999999e-06,4.8207799999999999e-06,4.82158e-06,4.8236299999999994e-06,4.8284299999999998e-06,4.8321764705882352e-06,4.8326199999999998e-06,4.8328333333333331e-06,4.8341e-06,4.8344900000000002e-06,4.8403400000000003e-06,4.8467900000000001e-06,4.8554199999999998e-06,4.86276e-06,4.8699499999999998e-06,4.87304e-06,4.8814399999999998e-06,4.9701499999999993e-06,5.0348000000000005e-06,5.5261100000000002e-06],"1966080":[0.010739703,0.0108475975,0.010866012500000004,0.010897032499999999,0.0109759325,0.010997064499999997,0.011002406000000001,0.011020492,0.011051251,0.0110587855,0.011068111,0.0110954365,0.011115046999999999,0.011139794999999999,0.0111679415,0.011240058000000001,0.0112837235,0.0112978335,0.011406073000000001,0.0116226985],"1900544":[0.0102886035,0.0104267605,0.010555436999999997,0.0106634995,0.010676879,0.010679569999999996,0.010700465500000001,0.010713561,0.0107159765,0.0107616485,0.010762183,0.010766771999999999,0.0107925,0.010796089,0.010823022,0.0108338815,0.0109508685,0.010978735,0.0111643005,0.011503957],"184":[8.5131999999999992e-07,8.5352999999999994e-07,8.5367999999999995e-07,8.5369000000000002e-07,8.5379999999999998e-07,8.5545999999999996e-07,8.5644999999999997e-07,8.5705999999999997e-07,8.5722000000000005e-07,8.5741e-07,8.5769999999999996e-07,8.5771000000000002e-07,8.5797000000000011e-07,8.5810999999999995e-07,8.5812000000000001e-07,8.9493000000000009e-07,8.9772999999999998e-07,9.0085000000000002e-07,9.3534000000000001e-07,9.3559000000000003e-07],"7936":[3.0518333333333336e-05,3.070125e-05,3.1233489999999998e-05,3.1353589999999997e-05,3.167629e-05,3.1920759999999998e-05,3.193957e-05,3.1941309999999999e-05,3.2068910000000001e-05,3.2551000000000001e-05,3.2607829999999998e-05,3.2764159999999998e-05,3.3000590000000003e-05,3.3003950000000001e-05,3.308026e-05,3.3198206185567009e-05,3.3478759999999999e-05,3.3548150000000002e-05,3.4089199999999999e-05,3.5588099999999999e-05],"3801088":[0.020813265500000008,0.020840750999999987,0.021008231500000002,0.021215853499999986,0.021235843500000001,0.021387181000000002,0.021440628999999996,0.021532243,0.021542828999999993,0.021567039499999999,0.0216494385,0.021809296499999999,0.021925169000000001,0.022007996000000002,0.022030775999999998,0.022063387,0.022100506000000002,0.022155909999999994,0.023074191500000001,0.023312120000000002],"6815744":[0.038015608499999999,0.0384077445,0.03843183800000001,0.038664469,0.038929699500000026,0.039175404499999997,0.039336418999999997,0.039400515000000004,0.039518792999999997,0.039668372,0.03977162900000001,0.039819346500000019,0.04001656,0.040102553500000013,0.040917390499999998,0.0414333785,0.041559669,0.041604302000000003,0.041801346000000003,0.042304831500000022],"124":[6.2261000000000004e-07,6.2482000000000006e-07,6.2527999999999995e-07,6.2564999999999999e-07,6.2781999999999997e-07,6.2814000000000001e-07,6.283699999999999e-07,6.285e-07,6.2872000000000003e-07,6.2928999999999989e-07,6.2935000000000006e-07,6.3003000000000009e-07,6.3019000000000006e-07,6.3117000000000001e-07,6.3156000000000008e-07,6.3238000000000006e-07,6.5004000000000007e-07,6.5419999999999992e-07,6.7791000000000007e-07,6.8892e-07],"102400":[0.00040421700000000001,0.000406754,0.00041349400000000004,0.00041704600000000002,0.000422901,0.00042581900000000002,0.00042958336363636341,0.00043210823809523814,0.00043521804545454548,0.00043595281818181806,0.00043811849999999999,0.00044193828571428579,0.00044214099999999979,0.00044398700000000002,0.00044778938095238111,0.00044800566666666666,0.00045287855555555559,0.00045463138095238107,0.00045601290476190499,0.00048216700000000003],"311296":[0.0012725099999999999,0.0012895485714285713,0.001301749,0.0013069710000000001,0.0013177390000000001,0.0013245170000000001,0.001327314,0.001334603,0.001336619,0.00133734,0.0013433728333333333,0.0013461769999999994,0.0013691402857142856,0.0013769920000000001,0.001471328,0.0016444299999999999,0.00164575925,0.0016591780000000001,0.0016822758000000001,0.0018091980000000001],"1408":[5.3896800000000005e-06,5.5667300000000008e-06,5.5737399999999999e-06,5.5833700000000002e-06,5.5838299999999994e-06,5.5863199999999999e-06,5.5865000000000006e-06,5.59137e-06,5.5957900000000008e-06,5.6012699999999997e-06,5.6129499999999993e-06,5.616769230769231e-06,5.6185299999999992e-06,5.6310400000000002e-06,5.6334400000000004e-06,5.69228e-06,5.8050299999999999e-06,5.8764699999999992e-06,5.9199000000000007e-06,6.5123899999999998e-06],"393216":[0.001606573,0.0016428059999999995,0.001646092,0.001653119,0.0016552741999999996,0.0016622017999999999,0.0016684299999999996,0.0016692352000000001,0.0016831002000000004,0.0016833190000000008,0.0016872970000000008,0.0016889470000000001,0.0017053586000000006,0.0017096568,0.0017162309999999999,0.0017251672,0.00205159125,0.0021322064999999995,0.002168536,0.0021826237499999999],"4352":[1.6322000000000001e-05,1.6448857142857145e-05,1.6872222222222222e-05,1.6898e-05,1.6952e-05,1.7060875e-05,1.7145875e-05,1.7233820000000002e-05,1.730798e-05,1.7431322033898303e-05,1.749843e-05,1.7606390000000001e-05,1.7739500000000002e-05,1.7802119999999998e-05,1.7819669999999999e-05,1.783479e-05,1.8077950000000002e-05,1.8510589999999998e-05,1.8694639999999998e-05,1.9256666666666665e-05],"6553600":[0.037854992499999997,0.038104776,0.03818380300000003,0.038262384499999996,0.038283372999999996,0.038403128500000015,0.038462760999999998,0.038502267999999978,0.038513581000000026,0.0386671185,0.038872753000000003,0.038898532999999999,0.039144002999999997,0.039217164999999998,0.039432141500000004,0.039934127,0.040110499000000022,0.040525609500000018,0.042561592499999988,0.042972117000000011],"20480":[7.8727999999999996e-05,8.1106000000000006e-05,8.1343110000000005e-05,8.1473350000000008e-05,8.1540666666666663e-05,8.1620999999999997e-05,8.1651989999999996e-05,8.2237000000000006e-05,8.2374999999999997e-05,8.2547999999999996e-05,8.2759647058823526e-05,8.2805740000000408e-05,8.2825619999999997e-05,8.3136666666666666e-05,8.3400290000000001e-05,8.4773039999999999e-05,8.5121642857142844e-05,8.5205309999999989e-05,8.5349870000000006e-05,8.856921e-05],"608":[2.4327800000000001e-06,2.46854e-06,2.4751100000000001e-06,2.4812000000000001e-06,2.4842799999999995e-06,2.4873899999999998e-06,2.4886800000000003e-06,2.4923499999999999e-06,2.4935299999999999e-06,2.4981500000000004e-06,2.4982099999999999e-06,2.5005099999999999e-06,2.5064500000000004e-06,2.5463699999999999e-06,2.5517999999999999e-06,2.6112399999999999e-06,2.6464799999999999e-06,2.6480699999999997e-06,2.6709900000000001e-06,2.6903899999999998e-06],"2228224":[0.011992266,0.0121658745,0.012272975,0.0122812115,0.012325684,0.012374348,0.0123976365,0.0124063705,0.012421758,0.012424422500000001,0.012454486000000001,0.012593976999999998,0.012594217,0.012650012,0.012704776499999997,0.0127050585,0.012746697499999998,0.013014320500000001,0.013609162999999999,0.014294025],"36864":[0.00014149400000000001,0.00014695040000000002,0.00014803199999999993,0.00014815525,0.00014825,0.00015137503389830504,0.00015154625000000005,0.00015154986153846157,0.00015156143749999997,0.00015212066666666667,0.0001524215,0.0001527226065573771,0.00015272700000000004,0.00015282499999999999,0.00015325869354838715,0.00015331442622950827,0.00015468163157894736,0.00015481100000000001,0.00015481488235294117,0.00015539299999999995],"704":[2.7687700000000001e-06,2.7719300000000001e-06,2.7795700000000001e-06,2.7815200000000001e-06,2.8460200000000001e-06,2.8480500000000002e-06,2.8536000000000001e-06,2.85493e-06,2.8579099999999996e-06,2.8593700000000001e-06,2.8629600000000001e-06,2.86498e-06,2.8656999999999999e-06,2.8713300000000003e-06,2.8889099999999998e-06,2.9045299999999999e-06,2.90903e-06,2.92313e-06,2.9237441860465115e-06,2.98938e-06],"720896":[0.0029533653333333335,0.0030380730000000001,0.0030491759999999998,0.0030597206666666665,0.0030627930000000007,0.0030635979999999998,0.0030950519999999992,0.0031232879999999997,0.003125570333333333,0.0031440006666666673,0.0031442750000000297,0.0031494509999999989,0.0031852249999999999,0.0032957399999999993,0.0038731690000000001,0.0039425630000000022,0.0040097789999999998,0.0040508210000000013,0.0040639349999999994,0.0041750319999999969],"800":[3.2048599999999998e-06,3.2128799999999996e-06,3.2202400000000004e-06,3.2212000000000002e-06,3.22311e-06,3.2233900000000001e-06,3.2275700000000003e-06,3.2300500000000001e-06,3.23063e-06,3.2334300000000002e-06,3.2347900000000001e-06,3.2349800000000002e-06,3.2372000000000001e-06,3.23965e-06,3.2446400000000001e-06,3.2600100000000004e-06,3.28195e-06,3.3796299999999998e-06,3.4478299999999998e-06,3.5379e-06],"2621440":[0.014078167499999999,0.014399907999999999,0.014403932499999999,0.0145074105,0.014512618999999999,0.0145764615,0.014711318000000001,0.014746384500000001,0.014766362,0.0148610405,0.0148685035,0.014903775499999999,0.0150609705,0.015150465,0.0152052195,0.015254103,0.0153564575,0.015457476499999994,0.0170486145,0.017441288999999999],"425984":[0.0017729479999999999,0.0017751266000000001,0.001785497,0.0018000217999999991,0.001808348,0.001813119,0.0018171766,0.001818802999999999,0.0018198788000000001,0.0018204274,0.0018213260000000003,0.0018362643333333332,0.001839114,0.0018430967999999999,0.001904322,0.0019101726000000005,0.0022493230000000001,0.002289274,0.0023515873333333328,0.0024123060000000008],"32768":[0.00012895222222222223,0.00012906200000000005,0.00012934600000000007,0.000129751,0.00012989716666666671,0.000132905,0.00013397637142857142,0.00013434387671232875,0.00013455055555555543,0.000135365,0.00013546338571428571,0.00013563474626865672,0.00013579,0.00013591882191780816,0.0001360190615384615,0.00013752921428571434,0.00013798394285714286,0.00013813266666666668,0.0001422877,0.0001446358474576271],"12058624":[0.075121834000000026,0.0758708565,0.076363063999999994,0.07687806149999997,0.077408987999999984,0.077416363000000016,0.077747392999999956,0.07804692299999999,0.078166201000000046,0.07820906400000005,0.078469661999999996,0.078554937000000033,0.078594111999999994,0.07903205399999999,0.079043252999999994,0.079424464,0.07975088050000001,0.079759601999999985,0.080931500000000003,0.081170569500000025],"128":[6.4061999999999998e-07,6.413499999999999e-07,6.4220000000000007e-07,6.4275000000000001e-07,6.4285999999999997e-07,6.4337000000000008e-07,6.4391000000000005e-07,6.4415000000000001e-07,6.4463999999999998e-07,6.4465000000000005e-07,6.4466e-07,6.4486000000000002e-07,6.4486000000000002e-07,6.4506999999999999e-07,6.4523000000000007e-07,6.4564000000000006e-07,6.4572000000000004e-07,6.4575000000000002e-07,6.4636999999999998e-07,7.0310999999999995e-07],"180224":[0.00073642599999999999,0.0007364810000000002,0.00073874600000000009,0.00075645474999999998,0.00075798007692307674,0.00075961663636363612,0.00075968000000000032,0.00076034600000000007,0.00076723924999999994,0.00076996658333333321,0.00077355100000000025,0.00077394149999999995,0.00077649441666666674,0.00077747958333333343,0.00078025916666666652,0.000780841,0.00078088875000000002,0.00078528308333333308,0.00080090033333333338,0.001167415],"224":[1.00265e-06,1.0045399999999999e-06,1.0055600000000001e-06,1.0065400000000001e-06,1.00696e-06,1.0070699999999999e-06,1.00847e-06,1.00857e-06,1.0086e-06,1.0095399999999999e-06,1.01039e-06,1.0106399999999999e-06,1.0106600000000001e-06,1.01138e-06,1.0115600000000001e-06,1.0117199999999999e-06,1.01193e-06,1.05838e-06,1.0584900000000001e-06,1.1022499999999999e-06],"736":[2.8846400000000001e-06,2.8941699999999998e-06,2.93416e-06,2.9376199999999998e-06,2.9682857142857145e-06,2.9725699999999997e-06,2.97689e-06,2.9769499999999999e-06,2.9790199999999999e-06,2.9899700000000002e-06,2.99087e-06,2.9931199999999999e-06,2.9944099999999999e-06,2.9978600000000003e-06,2.9984299999999999e-06,3.0006199999999998e-06,3.0733099999999997e-06,3.10181e-06,3.1632500000000002e-06,3.19347e-06],"320":[1.3468900000000001e-06,1.3484000000000001e-06,1.35047e-06,1.35119e-06,1.3518300000000001e-06,1.36795e-06,1.3680699999999999e-06,1.3708899999999998e-06,1.37376e-06,1.3747999999999999e-06,1.3757099999999999e-06,1.3761700000000001e-06,1.37847e-06,1.3798299999999999e-06,1.3825600000000001e-06,1.3837499999999999e-06,1.4329699999999999e-06,1.4376300000000002e-06,1.45015e-06,1.47492e-06],"557056":[0.002311217,0.0023386400000000008,0.0023620290000000007,0.0023645469999999998,0.0023776305000000001,0.0023868260000000007,0.0024002965000000007,0.0024110219999999992,0.0024173989999999998,0.0024212456666666666,0.0024257809999999988,0.0024660720000000001,0.0024674896666666661,0.0024736239999999998,0.0024835389999999995,0.0030123673333333329,0.0030584415,0.0031104056666666669,0.0031796699999999999,0.0031837340000000006],"832":[3.2910099999999998e-06,3.33763e-06,3.3418299999999999e-06,3.3440500000000002e-06,3.3443900000000003e-06,3.3468899999999998e-06,3.3471399999999999e-06,3.3518499999999999e-06,3.3522800000000004e-06,3.3550000000000001e-06,3.3552799999999997e-06,3.3597499999999999e-06,3.35986e-06,3.3632300000000002e-06,3.3743999999999998e-06,3.3845499999999996e-06,3.4222700000000003e-06,3.5253900000000003e-06,3.6751799999999999e-06,3.8625400000000001e-06],"9437184":[0.053289752000000003,0.053504397500000002,0.053938503499999978,0.054388324499999974,0.054420023500000025,0.054511537499999999,0.054588929000000029,0.055030887000000014,0.055085643499999982,0.055091659499999966,0.05518424650000002,0.055375830000000001,0.055394112999999988,0.055466479500000013,0.056181524500000003,0.056499253999999985,0.056503500000000019,0.056619050000000004,0.057333795999999972,0.057722280000000015],"3584":[1.3482999999999999e-05,1.3782923076923076e-05,1.3920666666666665e-05,1.4002000000000001e-05,1.410445e-05,1.4273999999999999e-05,1.4425959999999999e-05,1.443864e-05,1.4497e-05,1.4497589999999999e-05,1.4552576923076924e-05,1.4811531914893615e-05,1.4867509999999999e-05,1.492434e-05,1.5005769999999999e-05,1.508194e-05,1.5086559999999999e-05,1.518508e-05,1.5979199999999998e-05,1.6736300000000001e-05],"6291456":[0.0354990715,0.035745142000000001,0.035783531,0.035902022999999998,0.035993131999999983,0.036116645499999996,0.036168473499999999,0.036356769499999997,0.036479257999999987,0.036589665,0.037069890000000001,0.037112258500000009,0.037124349500000001,0.037209194000000015,0.037485840999999999,0.037533749999999998,0.037750395000000006,0.039063922500000001,0.039453791500000002,0.040417313999999996],"256":[1.1234999999999999e-06,1.1245800000000001e-06,1.12576e-06,1.1258099999999999e-06,1.1287599999999998e-06,1.1293000000000001e-06,1.12935e-06,1.1299500000000001e-06,1.13036e-06,1.1310700000000001e-06,1.1313099999999999e-06,1.1319600000000001e-06,1.1319999999999999e-06,1.13462e-06,1.1436499999999998e-06,1.14414e-06,1.1822399999999999e-06,1.2398500000000001e-06,1.2427599999999999e-06,1.2484200000000001e-06],"15204352":[0.087145570500000005,0.087222401999999963,0.087588424999999998,0.08786516250000001,0.087899149999999995,0.088503481500000022,0.088580902500000003,0.088655394999999998,0.088714217499999998,0.088742138000000012,0.088791997500000025,0.089340045500000007,0.089750201999999973,0.090042345500000037,0.090951053500000018,0.0911039035,0.091194373000000023,0.091870515999999985,0.09189853899999996,0.09195772050000002],"28672":[0.00011124825000000001,0.000113121,0.000113268,0.00011523725,0.00011640632530120481,0.00011641950000000005,0.000116526,0.00011702007142857141,0.0001176889642857143,0.00011800736708860758,0.00011852875,0.00011909999999999999,0.00011983499999999999,0.000120822,0.00012211818181818182,0.00012215404054054057,0.00012353665822784809,0.00012845116438356166,0.00012925310958904109,0.00014285244927536225],"768":[3.0313799999999998e-06,3.0367499999999998e-06,3.0995900000000001e-06,3.1056900000000003e-06,3.1057600000000001e-06,3.1061599999999998e-06,3.1068500000000002e-06,3.1072800000000002e-06,3.1100700000000001e-06,3.1129100000000002e-06,3.1156172839506174e-06,3.1220700000000002e-06,3.1244399999999999e-06,3.1333000000000001e-06,3.1336599999999999e-06,3.1725800000000002e-06,3.2227599999999996e-06,3.27253e-06,3.2952100000000001e-06,3.65274e-06],"212992":[0.0008904280000000004,0.00089304500000000008,0.00089661599999999971,0.00089724300000000004,0.00089888000000000001,0.00090088800000000008,0.00090220799999999961,0.00090675949999999999,0.00090734909999999993,0.00091115100000000002,0.00091247000000000008,0.00091484889999999977,0.0009182789,0.00092736490000000038,0.00093125099999999959,0.000943011,0.00098242499999999966,0.0011712926666666665,0.0011792244999999997,0.0013587624999999996],"864":[3.3776800000000002e-06,3.4644500000000003e-06,3.4646700000000001e-06,3.4710399999999997e-06,3.4714700000000002e-06,3.4736699999999999e-06,3.4773900000000001e-06,3.4786700000000003e-06,3.48047e-06,3.4834399999999998e-06,3.48455e-06,3.4872299999999998e-06,3.4898999999999998e-06,3.5130000000000001e-06,3.5248300000000001e-06,3.5321700000000003e-06,3.6209600000000003e-06,3.6226100000000001e-06,3.6432000000000001e-06,3.65955e-06],"352":[1.47351e-06,1.47806e-06,1.4951600000000001e-06,1.4961500000000001e-06,1.4964899999999999e-06,1.4967e-06,1.4968499999999999e-06,1.4970799999999999e-06,1.50002e-06,1.5000699999999999e-06,1.5004999999999999e-06,1.50099e-06,1.50118e-06,1.5019900000000001e-06,1.5075800000000001e-06,1.56503e-06,1.6270499999999999e-06,1.64604e-06,1.74955e-06,1.77138e-06],"253952":[0.0010506529999999999,0.0010636575000000001,0.0010652139999999999,0.0010675160000000001,0.0010739765000000001,0.0010798906250000001,0.001079942375,0.0010832369999999999,0.001086304,0.0010878836666666665,0.0010885176249999999,0.0010929147777777775,0.0010938818749999999,0.001094019444444444,0.00110942675,0.0011118361250000001,0.001123521375,0.0011309754999999999,0.0011552751428571431,0.0013036950000000001],"960":[3.7110000000000001e-06,3.8316599999999998e-06,3.8332200000000005e-06,3.8362599999999998e-06,3.84147e-06,3.8450999999999998e-06,3.8470300000000002e-06,3.84819e-06,3.8487999999999995e-06,3.8498e-06,3.85037e-06,3.85181e-06,3.8624999999999999e-06,3.8661299999999997e-06,3.9680500000000001e-06,3.9980499999999998e-06,4.0225099999999999e-06,4.0400000000000003e-06,4.0448800000000003e-06,4.0569199999999998e-06],"24576":[9.4302166666666666e-05,9.4429666666666668e-05,9.6249999999999995e-05,9.7042888888888883e-05,9.7293000000000005e-05,9.8117414893617017e-05,9.8624721649484551e-05,9.8725499999999995e-05,9.8935000000000001e-05,9.9209031250000002e-05,9.9382161290322574e-05,0.00010003937113402066,0.00010023027586206898,0.00010078249999999999,0.00010136019354838708,0.00010236036263736262,0.000103565,0.000103631,0.00010544714285714286,0.00010599391397849464],"7680":[2.9424000000000002e-05,2.9450000000000001e-05,2.96256e-05,3.0082636363636364e-05,3.0363545454545457e-05,3.0670000000000003e-05,3.0749720000000003e-05,3.0766999999999999e-05,3.0908400000000004e-05,3.0959823529411764e-05,3.0983545454545454e-05,3.1015e-05,3.1017850000000003e-05,3.1054250000000002e-05,3.1560719999999999e-05,3.1691581632653057e-05,3.1825690000000002e-05,3.1874549999999998e-05,3.2478879999999997e-05,3.2562499999999999e-05],"294912":[0.0012304445,0.0012398559999999999,0.001247862,0.001249652,0.0012522919999999999,0.0012539529999999999,0.00125629,0.0012587807142857145,0.0012638641428571434,0.001268638857142857,0.0012746489999999994,0.001275314,0.0012768104285714283,0.0012852289999999999,0.0012982220000000006,0.0013007725714285717,0.0013046620000000001,0.0015721889999999999,0.0015756088333333338,0.001704133],"1048576":[0.0044455949999999984,0.0044675969999999994,0.0044833059999999994,0.0044961900000000015,0.0045178390000000001,0.0045268420000000031,0.0045329809999999976,0.0045395209999999978,0.0045469639999999997,0.0045725619999999996,0.0045890409999999994,0.0046051909999999998,0.0046420770000000023,0.0046509080000000013,0.0046608169999999994,0.0046677979999999973,0.0046705259999999986,0.0046864599999999999,0.0047298489999999969,0.004732221],"10485760":[0.06830715200000001,0.068350954000000033,0.068940670499999995,0.069128624,0.069147664000000025,0.069483729999999966,0.069657300000000005,0.069739543500000001,0.070516378000000018,0.070622553500000046,0.070686649000000032,0.070701016000000033,0.070816448000000004,0.070951917999999975,0.07184341850000002,0.071917269000000034,0.071948232000000001,0.07260701700000001,0.072887287499999995,0.07317370450000002],"344064":[0.0014299418333333337,0.0014361085000000001,0.0014565176666666668,0.0014603136666666665,0.0014723610000000004,0.0014803323333333336,0.0014810770000000001,0.0014837726666666665,0.0014851446666666666,0.001488114166666667,0.0014927261666666664,0.0015052453333333335,0.001530259,0.001566048,0.0018156449999999998,0.0018681092,0.0019027720000000001,0.0019139097499999997,0.0019178859999999999,0.0021731097499999999],"288":[1.2409100000000001e-06,1.2443699999999999e-06,1.2486499999999999e-06,1.24929e-06,1.24965e-06,1.25071e-06,1.25203e-06,1.25239e-06,1.2531299999999999e-06,1.2560300000000001e-06,1.2560600000000001e-06,1.25704e-06,1.3015600000000001e-06,1.3051400000000001e-06,1.30618e-06,1.3118599999999998e-06,1.3133799999999999e-06,1.3135600000000002e-06,1.3189500000000001e-06,1.3690900000000001e-06],"1152":[4.5075699999999994e-06,4.5552500000000001e-06,4.5757391304347832e-06,4.5769400000000004e-06,4.5805599999999996e-06,4.58076e-06,4.58093e-06,4.5826400000000002e-06,4.5833700000000005e-06,4.5836100000000003e-06,4.5839299999999998e-06,4.5875200000000003e-06,4.5901999999999997e-06,4.5950699999999999e-06,4.6182400000000004e-06,4.6330200000000001e-06,4.7194099999999999e-06,4.7853200000000003e-06,4.7921799999999999e-06,5.4155299999999996e-06],"384":[1.59681e-06,1.61025e-06,1.61345e-06,1.6191999999999999e-06,1.6201799999999998e-06,1.62089e-06,1.6212600000000002e-06,1.6212600000000002e-06,1.62268e-06,1.6229499999999999e-06,1.6235300000000002e-06,1.62373e-06,1.62399e-06,1.6254900000000001e-06,1.6263399999999998e-06,1.6339999999999999e-06,1.6972199999999999e-06,1.7492699999999999e-06,1.7514099999999999e-06,1.9135499999999997e-06],"2304":[9.0021333333333332e-06,9.0050799999999998e-06,9.0359999999999995e-06,9.041068965517242e-06,9.0520000000000007e-06,9.0913799999999993e-06,9.1153900000000002e-06,9.1344399999999996e-06,9.1609900000000002e-06,9.1708800000000009e-06,9.1748000000000007e-06,9.1780999999999994e-06,9.2133899999999999e-06,9.2412799999999994e-06,9.3180999999999998e-06,9.3410400000000003e-06,9.3450499999999996e-06,9.4142899999999999e-06,9.4920800000000004e-06,9.7765799999999992e-06],"896":[3.5854700000000002e-06,3.5941e-06,3.5962e-06,3.5963800000000003e-06,3.5966899999999999e-06,3.5974800000000002e-06,3.5991899999999999e-06,3.6009699999999999e-06,3.6009799999999998e-06,3.60237e-06,3.60398e-06,3.6063000000000001e-06,3.6084499999999997e-06,3.63465e-06,3.7239800000000001e-06,3.72959e-06,3.7489599999999998e-06,3.8307777777777778e-06,3.9821000000000004e-06,4.2411199999999996e-06],"480":[1.9338500000000001e-06,1.9356300000000001e-06,1.93874e-06,1.9435300000000001e-06,1.9768100000000001e-06,1.98974e-06,1.9928000000000002e-06,1.9942899999999998e-06,1.99511e-06,1.9964651162790698e-06,1.9975299999999999e-06,1.9984799999999999e-06,2.0008699999999998e-06,2.0035e-06,2.00597e-06,2.0357900000000002e-06,2.0499699999999999e-06,2.08451e-06,2.0914100000000003e-06,2.0971499999999999e-06],"1441792":[0.0062097285,0.0062623915000000014,0.0062913705000000016,0.0063017579999999976,0.0077821515000000008,0.0078470069999999996,0.0079512880000000008,0.0079568,0.0079799930000000012,0.0079847049999999999,0.0079940590000000013,0.0080288419999999996,0.0080338205000000003,0.0080665750000000029,0.0080844555000000005,0.0080930034999999994,0.0082888490000000026,0.0083719759999999997,0.0086085950000000001,0.00906473],"992":[3.8496200000000001e-06,3.9349899999999997e-06,3.9608571428571425e-06,3.9647899999999999e-06,3.9648900000000001e-06,3.9657e-06,3.9725200000000002e-06,3.9742299999999996e-06,3.9743199999999999e-06,3.9763200000000001e-06,3.9880800000000003e-06,3.9929999999999997e-06,4.0108199999999995e-06,4.0393599999999996e-06,4.0483700000000005e-06,4.1316499999999997e-06,4.1434500000000001e-06,4.1506999999999999e-06,4.1582499999999995e-06,4.1649999999999999e-06],"3968":[1.48385e-05,1.53946e-05,1.5437000000000001e-05,1.54535e-05,1.5500999999999999e-05,1.5803409999999999e-05,1.5830099999999999e-05,1.588682e-05,1.595846e-05,1.5983929292929293e-05,1.6036069999999998e-05,1.6037320000000001e-05,1.607866e-05,1.6131870000000002e-05,1.616507e-05,1.6308e-05,1.6426620000000001e-05,1.6835260000000002e-05,1.6947706666666666e-05,1.7010349999999999e-05],"6400":[2.4655500000000001e-05,2.4700000000000001e-05,2.4720333333333331e-05,2.4756000000000002e-05,2.4875000000000002e-05,2.558266153846154e-05,2.5605839999999997e-05,2.5626309859154931e-05,2.5630499999999998e-05,2.5653999999999999e-05,2.56824e-05,2.5725671641791044e-05,2.581143e-05,2.5902849999999999e-05,2.5947990000000002e-05,2.5958779999999998e-05,2.6036369999999998e-05,2.6310999999999999e-05,2.7000330000000002e-05,2.8802110000000001e-05],"1344":[5.1803400000000004e-06,5.2128399999999997e-06,5.2939298245614033e-06,5.3101199999999999e-06,5.3162500000000001e-06,5.3171200000000009e-06,5.3194299999999998e-06,5.3219300000000002e-06,5.3302500000000003e-06,5.3336799999999997e-06,5.3443499999999999e-06,5.3477200000000002e-06,5.34877e-06,5.3514100000000008e-06,5.3563899999999994e-06,5.3750799999999999e-06,5.3840599999999996e-06,5.4117399999999996e-06,5.4600399999999997e-06,5.5068000000000004e-06],"126976":[0.00052619366666666664,0.00052652016666666674,0.0005282836111111112,0.00052866749999999998,0.00052872699999999978,0.00052973600000000027,0.0005362180000000002,0.00053633699999999979,0.0005363379999999997,0.00053889599999999997,0.00054030899999999988,0.00054186500000000021,0.0005418758235294118,0.0005434065625,0.00054366383333333333,0.0005447194444444444,0.00054615194117647056,0.00054932600000000015,0.00055680700000000031,0.00058942293749999998],"2883584":[0.015711313999999976,0.015789783000000009,0.0158210755,0.015861710500000001,0.015993401499999997,0.016117320499999994,0.016149173999999988,0.016150512499999999,0.016212420999999994,0.016215696999999994,0.016295695000000002,0.016397775,0.016439885500000001,0.016518869999999998,0.0167138545,0.016771754999999999,0.016847385499999999,0.017114538499999991,0.017642815500000009,0.01913375149999999],"753664":[0.0031272704999999999,0.0031572330000000002,0.0031988413333333332,0.0032222570000000005,0.0032299159999999993,0.0032383859999999993,0.003242725000000001,0.0032530039999999994,0.0032575209999999855,0.003288959000000001,0.0032902014999999993,0.0033030645000000003,0.0034441279999999986,0.0041248685,0.0041541915000000004,0.0041871309999999985,0.0042357424999999987,0.0042693899999999996,0.0042810290000000004,0.0042950074999999997],"16384":[6.2860999999999993e-05,6.4571936170212764e-05,6.4879e-05,6.5131999999999999e-05,6.5281000000000001e-05,6.5380299999999995e-05,6.5392800000000002e-05,6.5768787234042546e-05,6.6105599999999993e-05,6.6292770000000008e-05,6.6511081632653058e-05,6.6756579999999996e-05,6.7117050000000005e-05,6.7226280000000002e-05,6.731517e-05,6.7700829999999996e-05,6.8036999999999999e-05,6.8776229999999996e-05,6.8921e-05,6.9473499999999998e-05],"131072":[0.00050841700000000027,0.00054069600000000002,0.0005439774999999998,0.00054724358823529402,0.00055103629411764699,0.00055520799999999996,0.00055613876470588224,0.00056038400000000003,0.00056103946666666651,0.00056327118749999996,0.00056460899999999999,0.00056601366666666673,0.00056667346666666653,0.00057346768749999999,0.0005782420000000003,0.00057872837500000016,0.00058139031249999972,0.00058449286666666675,0.00060095466666666676,0.00060611625000000027],"458752":[0.0018625779999999991,0.0018739079999999999,0.0019070708000000001,0.0019117488000000005,0.001935546,0.001944793,0.00195301175,0.0019539409999999998,0.0019637859999999999,0.0019671110000000001,0.00198279225,0.0019888319999999998,0.001996954,0.0020143499999999998,0.0020935479999999998,0.0024360469999999998,0.0025060913333333342,0.0025887603333333334,0.0026129206666666675,0.002658035],"172032":[0.00068969300000000001,0.00071483699999999996,0.00071645400000000027,0.00071949999999999998,0.00072649976923076906,0.00073342081818181823,0.00073477899999999986,0.00073577720000000003,0.00073637399999999993,0.00073841999999999983,0.00074263415384615374,0.00074288699999999991,0.00074317191666666677,0.0007446909999999998,0.00074577390909090892,0.00075220483333333324,0.00075795823076923053,0.0007654779166666667,0.00077149508333333326,0.00077891124999999984],"12288":[4.6912000000000001e-05,4.7047199999999999e-05,4.7774500000000001e-05,4.8010000000000003e-05,4.8352000000000001e-05,4.8973080000000006e-05,4.9285960000000006e-05,4.9531999999999999e-05,4.957424e-05,5.0032439999999995e-05,5.0118480000000003e-05,5.0319386363636367e-05,5.0509939999999998e-05,5.0819708333333329e-05,5.1073869999999997e-05,5.1096320000000002e-05,5.1248510638297869e-05,5.1938999999999999e-05,5.2076490000000001e-05,5.2309545454545453e-05],"14680064":[0.083156405500000002,0.08342956950000005,0.084470863000000007,0.084991760499999985,0.085085213000000021,0.085585848499999992,0.085882130000000001,0.0860939805,0.086120496499999977,0.086157227499999975,0.086453321999999999,0.086577484499999996,0.086724767499999994,0.086815111,0.087182102499999997,0.087595646499999999,0.088171606999999971,0.088529577499999984,0.089181035999999977,0.089830547000000066],"1536":[6.0311000000000006e-06,6.0467900000000004e-06,6.0599199999999999e-06,6.0609999999999992e-06,6.0624099999999996e-06,6.0645600000000001e-06,6.0649300000000006e-06,6.0669299999999999e-06,6.0674600000000005e-06,6.0743200000000001e-06,6.0842500000000002e-06,6.08771e-06,6.1031799999999997e-06,6.1067894736842103e-06,6.1217000000000002e-06,6.1249999999999998e-06,6.1981400000000003e-06,6.2111499999999998e-06,6.2666399999999997e-06,6.5207700000000008e-06],"25600":[9.8271333333333342e-05,9.9186249999999999e-05,9.9395999999999995e-05,0.00010035399999999995,0.000100626,0.000100747,0.00010132638461538464,0.00010229391666666666,0.00010259599999999996,0.00010270883333333336,0.00010290266666666663,0.00010329847619047617,0.0001039125,0.00010486063636363636,0.00010532,0.00010560936708860758,0.00010564976623376622,0.000106555,0.000106574,0.00010774249999999999],"1835008":[0.0099562135,0.010008548000000003,0.010085528999999999,0.010125322000000001,0.010162393,0.0102275015,0.010259641,0.010271527499999999,0.010298327999999999,0.010324122,0.010344962499999999,0.010372041,0.010376845499999999,0.01039056,0.0104503055,0.0105734825,0.0105843255,0.010729904,0.010733724,0.010963589499999997],"10752":[4.1399999999999997e-05,4.1400999999999999e-05,4.1499999999999999e-05,4.2589999999999997e-05,4.2775999999999998e-05,4.2830470000000001e-05,4.2881583333333336e-05,4.3382480000000005e-05,4.3597899999999998e-05,4.3681600000000005e-05,4.3753129999999995e-05,4.3822929999999999e-05,4.3894999999999999e-05,4.3905478260869561e-05,4.3922954545454544e-05,4.4084550000000005e-05,4.4134761904761905e-05,4.4211329999999997e-05,4.4643450000000004e-05,4.7874000000000003e-05],"21504":[8.4197999999999996e-05,8.4219000000000001e-05,8.4504846153846157e-05,8.4828999999999997e-05,8.5004846153846156e-05,8.5393214285714282e-05,8.5519999999999994e-05,8.5599000000000005e-05,8.5896999999999994e-05,8.6318999999999998e-05,8.6386999999999998e-05,8.6398333333333329e-05,8.6934692307692312e-05,8.8794669999999997e-05,8.940918000000001e-05,8.9471500000000006e-05,9.0596874999999998e-05,9.1047500000000005e-05,9.8340786516853921e-05,0.000102357130952381],"7602176":[0.04288080200000001,0.042895848,0.043140242000000009,0.043297583000000001,0.04351064999999997,0.043974802,0.044405854000000015,0.044537681500000002,0.044548854499999999,0.044591586500000009,0.044681286000000001,0.044733431500000018,0.044973787000000001,0.045050147999999998,0.045133651500000004,0.04533301700000001,0.045742562,0.0464408475,0.046802417000000006,0.046997864499999972],"5632":[2.1768392857142859e-05,2.1797000000000002e-05,2.1861999999999998e-05,2.2006621621621621e-05,2.2625181818181819e-05,2.270292e-05,2.2781913043478261e-05,2.2855466666666668e-05,2.2866000000000001e-05,2.2907320000000001e-05,2.2909999999999999e-05,2.2966649999999998e-05,2.3001269999999997e-05,2.3011680000000001e-05,2.3035800000000001e-05,2.3087739999999999e-05,2.3258459999999998e-05,2.343595e-05,2.3884749999999999e-05,2.3992999999999999e-05],"10":[1.8313e-07,1.8314000000000001e-07,1.8364e-07,1.8365999999999999e-07,1.8371e-07,1.8397e-07,1.8425e-07,1.8437999999999999e-07,1.8456999999999999e-07,1.8515000000000001e-07,1.8539999999999998e-07,1.8559999999999999e-07,1.8593999999999998e-07,1.9213000000000001e-07,1.9232000000000002e-07,1.9243999999999999e-07,1.9273000000000001e-07,1.9275e-07,1.9341999999999999e-07,1.9369999999999999e-07],"3145728":[0.017366946500000001,0.017448078999999988,0.017453868500000004,0.017568561,0.017749507500000001,0.0177611435,0.017870078999999994,0.017877031999999994,0.017899109,0.017940697499999991,0.0181473695,0.018230184999999999,0.018281446,0.018311532500000002,0.018342867499999999,0.01838965250000002,0.018823728000000001,0.018842352999999996,0.019760972000000005,0.020161641500000001],"245760":[0.001014149,0.0010321010000000001,0.001043008,0.001045671,0.0010457139999999999,0.0010463711111111113,0.0010473872222222223,0.0010478130000000001,0.0010500236666666665,0.0010531878888888886,0.0010536657777777774,0.0010560776666666664,0.001071128,0.00107566775,0.0010814638888888887,0.0010876149999999999,0.0010888217500000001,0.001093513,0.00126168,0.0013139922857142859],"1728":[6.6248100000000004e-06,6.7954500000000003e-06,6.7957900000000004e-06,6.8072399999999992e-06,6.8122622950819675e-06,6.8131199999999997e-06,6.8196200000000004e-06,6.8226300000000001e-06,6.8270500000000001e-06,6.8399999999999997e-06,6.8478400000000002e-06,6.8528899999999994e-06,6.8800800000000007e-06,6.8806800000000003e-06,6.9095999999999999e-06,6.9245500000000005e-06,7.0326399999999996e-06,7.0439600000000004e-06,7.1142499999999997e-06,7.1257500000000003e-06],"11":[1.8680000000000001e-07,1.8683000000000001e-07,1.8685999999999999e-07,1.8708e-07,1.8731999999999999e-07,1.8780999999999999e-07,1.8789e-07,1.8913999999999999e-07,1.8929000000000002e-07,1.8932e-07,1.8980000000000002e-07,1.9396e-07,1.9589000000000002e-07,1.9595999999999999e-07,1.9598000000000001e-07,1.9618e-07,1.9627999999999998e-07,1.9660000000000003e-07,1.9716e-07,2.0034000000000001e-07],"1114112":[0.0046001819999999987,0.0046619580000000008,0.0046644040000000031,0.0046895699999999997,0.0048088209999999996,0.0048195519999999969,0.0048211809999999999,0.0048291790000000012,0.0048692060000000001,0.0049122330000000002,0.0049178829999999563,0.0049232809999999998,0.0049893060000000032,0.0050374090000000014,0.005120851,0.0059778690000000002,0.0061009159999999996,0.006103196,0.0063373350000000021,0.0066496990000000002],"12":[1.9051999999999999e-07,1.9055e-07,1.9091000000000001e-07,1.9119999999999999e-07,1.9125e-07,1.9147999999999999e-07,1.9163e-07,1.9228999999999998e-07,1.9250000000000001e-07,1.9275999999999999e-07,1.9298999999999998e-07,1.9324999999999999e-07,1.9432000000000001e-07,1.9966000000000003e-07,1.9975e-07,1.9989000000000003e-07,2.0092999999999999e-07,2.0367e-07,2.0953e-07,2.1480000000000002e-07],"7340032":[0.041628729999999989,0.041832748999999989,0.041875152499999999,0.041893523499999988,0.042029127499999999,0.042110247499999996,0.042111514500000009,0.042340893499999997,0.042700719499999998,0.042840450499999988,0.0428531895,0.0429130265,0.042961863499999989,0.0430240925,0.043231362000000009,0.043382764500000004,0.04342829749999999,0.043750397000000003,0.04403729499999999,0.044437282000000002],"7168":[2.66945e-05,2.8301783783783785e-05,2.8536630000000064e-05,2.857277142857143e-05,2.862314e-05,2.8648968749999999e-05,2.8763019999999997e-05,2.8955909999999999e-05,2.9142299999999997e-05,2.9272885714285715e-05,2.9389039999999999e-05,2.9389179999999998e-05,2.9563789999999999e-05,2.9629999999999999e-05,3.0064129999999998e-05,3.0142010000000001e-05,3.0258041666666666e-05,3.0471200000000001e-05,3.160858e-05,3.2722499999999997e-05],"13":[1.9945999999999999e-07,1.9996e-07,2.0007999999999998e-07,2.0009000000000001e-07,2.0024e-07,2.0049000000000002e-07,2.0052999999999998e-07,2.0055999999999999e-07,2.0069000000000001e-07,2.0111000000000001e-07,2.0120999999999999e-07,2.0219000000000001e-07,2.0247000000000001e-07,2.0845000000000002e-07,2.0897999999999998e-07,2.0914000000000001e-07,2.0922000000000002e-07,2.1052000000000001e-07,2.1912999999999998e-07,2.1976999999999999e-07],"6029312":[0.034051933500000006,0.034215068000000001,0.034226404500000002,0.03437964800000002,0.034470329000000001,0.034602288500000002,0.034623314999999988,0.034741973999999988,0.0350989435,0.035153122500000009,0.035216923499999997,0.035405793500000018,0.03545493999999999,0.035508791000000005,0.035587643000000002,0.035689278999999983,0.036044389000000003,0.036204588500000003,0.039258876999999998,0.039858513999999998],"14":[2.0310000000000001e-07,2.0312999999999999e-07,2.0332000000000002e-07,2.0344e-07,2.0367e-07,2.037e-07,2.0378000000000002e-07,2.0407e-07,2.0424999999999999e-07,2.0426e-07,2.0587999999999999e-07,2.0613999999999999e-07,2.1152e-07,2.1266e-07,2.1288000000000001e-07,2.1339000000000001e-07,2.1347000000000002e-07,2.1364999999999998e-07,2.1545000000000001e-07,2.2697e-07],"3200":[1.2468564102564104e-05,1.2487740740740741e-05,1.285062e-05,1.2858889999999999e-05,1.287603e-05,1.295696e-05,1.2982359999999998e-05,1.29825e-05,1.3032310344827587e-05,1.305247e-05,1.3154280000000001e-05,1.3191660000000002e-05,1.3218399999999999e-05,1.338667e-05,1.343871e-05,1.3504479999999999e-05,1.3585699999999999e-05,1.3631610000000001e-05,1.46095e-05,1.4702372881355932e-05],"20":[2.2623000000000001e-07,2.2634999999999999e-07,2.2646999999999999e-07,2.2657e-07,2.2662e-07,2.2664e-07,2.2671999999999998e-07,2.2685999999999998e-07,2.2704000000000003e-07,2.2705000000000001e-07,2.2719000000000001e-07,2.2755000000000002e-07,2.2968e-07,2.3020000000000001e-07,2.3640999999999998e-07,2.3680999999999999e-07,2.3720999999999999e-07,2.3759e-07,2.3765000000000001e-07,2.3816999999999999e-07],"204800":[0.000829077,0.00083651500000000002,0.00084128685714285713,0.00085040972727272739,0.00085517100000000006,0.000860573,0.00086686754545454536,0.00087061772727272725,0.00087081845454545464,0.00087245709090909079,0.000875715,0.00087703639999999979,0.000880012,0.00089280850000000042,0.00089584680000000055,0.00089635819999999995,0.000901909,0.00090365089999999996,0.001058043,0.00110042575],"15":[2.0685e-07,2.0730999999999999e-07,2.0733999999999998e-07,2.0744999999999999e-07,2.075e-07,2.0769e-07,2.0800000000000001e-07,2.0803000000000002e-07,2.0811e-07,2.0899000000000002e-07,2.0931000000000001e-07,2.0936000000000002e-07,2.1007e-07,2.1313e-07,2.1713000000000001e-07,2.1724999999999999e-07,2.1724999999999999e-07,2.1736999999999999e-07,2.1741000000000001e-07,2.1742999999999998e-07],"13312":[5.1113999999999999e-05,5.1153999999999998e-05,5.1795000000000001e-05,5.2238999999999999e-05,5.2938e-05,5.3239915662650605e-05,5.3248999999999998e-05,5.3319139999999999e-05,5.336087654320988e-05,5.3588499999999997e-05,5.3607990000000005e-05,5.3647999999999999e-05,5.401466666666667e-05,5.4225879999999997e-05,5.4274479999999995e-05,5.4490370370370374e-05,5.4960480000000002e-05,5.5043189999999994e-05,5.5522109999999996e-05,5.5678350000000002e-05],"4980736":[0.028102692000000002,0.028153668499999996,0.028182711499999992,0.028189470000000001,0.028247626999999987,0.028269132000000002,0.028334143999999999,0.028377572,0.028406136500000002,0.028967165,0.028975929000000001,0.029029163,0.029245265499999996,0.029274487500000002,0.029351606000000009,0.029456385000000002,0.029508489500000012,0.029550044500000001,0.029567182500000001,0.030070390499999988],"118784":[0.000460743,0.00048484724999999976,0.000493699,0.00049972299999999999,0.00050312149999999999,0.00050320699999999998,0.00050535721052631579,0.00050628299999999984,0.00050667500000000016,0.00051074856250000003,0.0005118207368421052,0.00051191457894736838,0.00051192929411764706,0.00051536542105263172,0.00051615166666666692,0.00051725600000000001,0.00051853185714285726,0.00052096900000000003,0.00053081000000000016,0.00053364783333333305],"51200":[0.00019880599999999999,0.00020167925,0.000201802,0.00020274799999999999,0.00020563999999999999,0.000205823,0.00020589799999999999,0.00020662959523809512,0.00020703200000000001,0.00020795400000000005,0.00020958046511627921,0.0002100615,0.00021153,0.00021191922727272725,0.00021415100000000002,0.00021626799999999993,0.00021659872727272734,0.00021791900000000001,0.00022481699999999999,0.00024172594736842105],"16":[2.1112999999999999e-07,2.1133e-07,2.1166e-07,2.1174000000000002e-07,2.1183000000000001e-07,2.1198e-07,2.1325999999999999e-07,2.1325999999999999e-07,2.1408e-07,2.1498000000000001e-07,2.1997e-07,2.209e-07,2.2090999999999998e-07,2.2106000000000002e-07,2.2116e-07,2.2121000000000001e-07,2.2143000000000002e-07,2.2174000000000003e-07,2.2209999999999998e-07,2.2231999999999999e-07],"21":[2.2895e-07,2.3005e-07,2.3057999999999999e-07,2.3102000000000001e-07,2.3159e-07,2.3169000000000001e-07,2.3181000000000001e-07,2.3204999999999999e-07,2.3209000000000001e-07,2.3232999999999999e-07,2.3271000000000002e-07,2.3297999999999999e-07,2.3328000000000001e-07,2.3388999999999999e-07,2.4107999999999999e-07,2.4121000000000003e-07,2.4126999999999999e-07,2.4138000000000001e-07,2.4139000000000002e-07,2.5265999999999999e-07],"917504":[0.0038236199999999998,0.0038973740000000008,0.0039265819999999996,0.0039352609999999998,0.0039585290000000006,0.0039653520000000001,0.0039875394999999998,0.0039975459999999985,0.00401549,0.0040267354999999989,0.0040359530000000001,0.004075238499999999,0.0040798104999999986,0.0041288525000000003,0.0048905389999999976,0.0049470790000000001,0.0050499840000000004,0.0051243840000000001,0.0051989180000000003,0.0052344610000000001],"22":[2.3356000000000001e-07,2.3416e-07,2.3428e-07,2.3434567901234566e-07,2.3439e-07,2.3447999999999999e-07,2.3453999999999998e-07,2.3465999999999998e-07,2.3472000000000003e-07,2.3475999999999999e-07,2.3509000000000002e-07,2.3533e-07,2.3544999999999998e-07,2.3589999999999999e-07,2.3659000000000003e-07,2.3851999999999999e-07,2.4511e-07,2.4570999999999999e-07,2.4614000000000001e-07,2.4685000000000002e-07],"4864":[1.8927229999999999e-05,1.9082820000000001e-05,1.9460229999999999e-05,1.9471697368421053e-05,1.9476088235294116e-05,1.9496450000000002e-05,1.9526321428571428e-05,1.9568e-05,1.9642479999999999e-05,1.9644430000000003e-05,1.9645909999999998e-05,1.9658459999999999e-05,1.9698333333333334e-05,1.9746999999999999e-05,1.980019e-05,1.9877110000000001e-05,2.0114649999999999e-05,2.0139400000000002e-05,2.0576630000000001e-05,2.070232911392405e-05],"17":[2.1460999999999999e-07,2.1472000000000001e-07,2.1505999999999999e-07,2.1508000000000002e-07,2.1523999999999999e-07,2.1537999999999999e-07,2.1546999999999998e-07,2.1548000000000002e-07,2.1551e-07,2.1581e-07,2.1715999999999999e-07,2.1727000000000001e-07,2.1732000000000002e-07,2.1833e-07,2.2456999999999998e-07,2.2501e-07,2.2507999999999997e-07,2.252e-07,2.2670000000000001e-07,2.2697e-07],"14848":[5.7161999999999999e-05,5.7219000000000002e-05,5.7931140000000001e-05,5.8292999999999999e-05,5.8496352941176471e-05,5.8584e-05,5.9290873015873016e-05,5.9522311475409833e-05,5.9639119402985074e-05,5.9693130000000002e-05,6.0062700000000003e-05,6.0238437500000002e-05,6.030753e-05,6.051976e-05,6.0678010000000005e-05,6.072637e-05,6.2557000000000004e-05,6.2782999999999998e-05,6.3140999999999997e-05,6.6056220000000008e-05],"23":[2.3654e-07,2.3745e-07,2.3791999999999998e-07,2.3795999999999999e-07,2.3798000000000002e-07,2.3804999999999999e-07,2.3869000000000003e-07,2.3876999999999996e-07,2.3885e-07,2.3888999999999999e-07,2.3907999999999999e-07,2.3910999999999998e-07,2.3920999999999998e-07,2.3938000000000002e-07,2.4044e-07,2.4051000000000003e-07,2.4896999999999999e-07,2.4929999999999999e-07,2.5062e-07,2.508e-07],"786432":[0.0032750240000000005,0.0032822185000000018,0.0033858725,0.0034289890000000012,0.0034477789999999989,0.0034478020000000011,0.003448058500000001,0.0035447645000000008,0.003553349999999999,0.0041918149999999998,0.0042243809999999975,0.0042380435000000001,0.0042599865000000018,0.0042837064999999997,0.0044470599999999983,0.0044793494999999985,0.0045057199999999986,0.0045324535000000003,0.0046084539999999997,0.0047135670000000001],"18":[2.1871e-07,2.1874000000000001e-07,2.1905000000000002e-07,2.1914000000000002e-07,2.1925999999999999e-07,2.1926999999999998e-07,2.1939999999999999e-07,2.1987000000000002e-07,2.1993000000000001e-07,2.2076999999999998e-07,2.2081999999999999e-07,2.2082999999999997e-07,2.2123e-07,2.2127e-07,2.2160000000000003e-07,2.2858e-07,2.2938000000000001e-07,2.2962000000000001e-07,2.3011000000000001e-07,2.3023999999999998e-07],"1638400":[0.008716719000000003,0.0087531435000000012,0.0087738175000000029,0.008902570000000002,0.0089196209999999956,0.0089527414999999964,0.008986015,0.009102691999999999,0.0091388755000000026,0.0091486939999999971,0.0092507894999999934,0.009296869999999997,0.0093479869999999986,0.0094463055000000001,0.0096094644999999979,0.009614824499999999,0.0096879799999999953,0.009897551000000001,0.010215149499999996,0.010237263],"7864320":[0.044469410000000001,0.04453782299999999,0.044622020999999998,0.04496661250000001,0.0449959625,0.045456966500000001,0.045637794500000002,0.045796465499999994,0.045812485999999999,0.045900947499999997,0.04595720800000002,0.046232792000000009,0.046421411000000003,0.046687727500000012,0.047012604999999985,0.047339404500000001,0.047436744500000003,0.047517118499999997,0.048037767999999988,0.048266159500000003],"24":[2.4060999999999998e-07,2.4131999999999999e-07,2.4163999999999999e-07,2.4180000000000001e-07,2.4181999999999998e-07,2.4184e-07,2.4232000000000002e-07,2.4232000000000002e-07,2.4233999999999998e-07,2.4233999999999998e-07,2.4306000000000001e-07,2.4340000000000002e-07,2.4344000000000001e-07,2.4419000000000002e-07,2.4437000000000001e-07,2.5232000000000003e-07,2.5296999999999997e-07,2.5349999999999999e-07,2.5359999999999999e-07,2.5386000000000002e-07],"14155776":[0.079755229500000024,0.080125198500000008,0.080240447499999978,0.080587899000000005,0.0806155385,0.081040600500000032,0.081228036500000003,0.081344521000000003,0.081562989499999988,0.081826214500000008,0.082002572999999995,0.082383748499999992,0.082468984499999995,0.082762685000000002,0.082849840500000008,0.08291163300000004,0.083349214499999991,0.083386314000000003,0.085162685500000029,0.088882743],"19":[2.2231999999999999e-07,2.2242e-07,2.2277e-07,2.2283999999999998e-07,2.2286e-07,2.2342999999999998e-07,2.2344000000000002e-07,2.2429000000000001e-07,2.2461e-07,2.2573e-07,2.258e-07,2.2606e-07,2.3258000000000001e-07,2.3323999999999999e-07,2.3369e-07,2.3373000000000002e-07,2.3407999999999999e-07,2.3578000000000001e-07,2.3589999999999999e-07,2.4522999999999998e-07],"30":[2.9766999999999999e-07,3.0391999999999998e-07,3.0412e-07,3.0414999999999998e-07,3.0472826086956518e-07,3.0508999999999999e-07,3.0522999999999999e-07,3.0549000000000002e-07,3.0562999999999996e-07,3.0564000000000003e-07,3.0601000000000003e-07,3.0638000000000002e-07,3.1837000000000001e-07,3.1878999999999996e-07,3.2054000000000004e-07,3.2113999999999998e-07,3.2135000000000006e-07,3.2259999999999999e-07,3.2280999999999996e-07,3.3856000000000004e-07],"25":[2.4479999999999997e-07,2.4508000000000002e-07,2.4536999999999998e-07,2.4593999999999999e-07,2.4596000000000001e-07,2.4606000000000002e-07,2.4620000000000002e-07,2.4624999999999997e-07,2.4633000000000001e-07,2.4656000000000001e-07,2.4663999999999999e-07,2.4689999999999997e-07,2.4705999999999999e-07,2.4707e-07,2.4761999999999999e-07,2.4807000000000002e-07,2.5690999999999999e-07,2.5726999999999997e-07,2.5788000000000003e-07,2.586e-07],"31":[3.0769000000000002e-07,3.0788999999999999e-07,3.0806999999999998e-07,3.0815999999999997e-07,3.0852000000000001e-07,3.0892999999999995e-07,3.0909999999999998e-07,3.0939000000000005e-07,3.0944e-07,3.0951000000000002e-07,3.1081999999999997e-07,3.2255000000000004e-07,3.2441999999999999e-07,3.2469999999999999e-07,3.2484000000000004e-07,3.2546000000000006e-07,3.2558000000000003e-07,3.2646999999999998e-07,3.2767000000000002e-07,3.4392999999999998e-07],"1280":[4.9081099999999995e-06,4.9191699999999999e-06,4.9567199999999992e-06,5.0556818181818186e-06,5.0667500000000002e-06,5.0708700000000005e-06,5.0733699999999992e-06,5.0767200000000006e-06,5.0796666666666664e-06,5.0884499999999995e-06,5.1024800000000001e-06,5.1124299999999999e-06,5.1251300000000007e-06,5.1252100000000004e-06,5.1267499999999997e-06,5.1377799999999996e-06,5.1658300000000001e-06,5.2940200000000002e-06,5.5734299999999994e-06,6.0422899999999999e-06],"26":[2.8843e-07,2.8865999999999999e-07,2.8906999999999998e-07,2.8942000000000001e-07,2.8948000000000002e-07,2.9002e-07,2.9028000000000003e-07,2.9047000000000003e-07,2.9050000000000001e-07,2.9052999999999999e-07,2.9086e-07,3.0317999999999999e-07,3.0380000000000001e-07,3.0488999999999997e-07,3.0519e-07,3.0731000000000002e-07,3.0732999999999999e-07,3.0926e-07,3.1058000000000002e-07,3.2133999999999999e-07],"3932160":[0.021424402500000002,0.021633616000000001,0.021999922500000001,0.022049336000000003,0.022618660499999992,0.022705385500000001,0.022903566,0.022925399500000009,0.022986317000000006,0.023082219000000008,0.023425090000000006,0.023458483999999998,0.023758123000000006,0.02393447000000001,0.023997932,0.024180127499999989,0.024472529999999999,0.0245687765,0.024638457499999999,0.024687577000000002],"2432":[9.3432500000000007e-06,9.4396599999999993e-06,9.5025700000000007e-06,9.5241578947368434e-06,9.5436666666666664e-06,9.5444999999999998e-06,9.5784999999999999e-06,9.5826666666666672e-06,9.6056e-06,9.628e-06,9.661259999999999e-06,9.7732900000000011e-06,9.8062100000000018e-06,9.8228000000000002e-06,9.8498800000000006e-06,9.85113e-06,9.8573499999999997e-06,9.9615299999999998e-06,1.0021719999999999e-05,1.0199709999999999e-05],"32":[3.1096999999999998e-07,3.1130000000000004e-07,3.1195000000000004e-07,3.1223000000000004e-07,3.1229e-07,3.1232000000000003e-07,3.1238999999999995e-07,3.1241000000000003e-07,3.1260000000000003e-07,3.1262e-07,3.1264999999999998e-07,3.1313000000000005e-07,3.1316000000000003e-07,3.2901999999999996e-07,3.2950999999999999e-07,3.3003999999999996e-07,3.3278000000000005e-07,3.4397999999999999e-07,3.4783000000000001e-07,3.4847e-07],"27":[2.8636999999999999e-07,2.9114e-07,2.9266999999999999e-07,2.9283000000000001e-07,2.9301e-07,2.9381000000000001e-07,2.9411999999999999e-07,2.9416000000000003e-07,2.9439999999999999e-07,2.9444000000000003e-07,2.9453999999999999e-07,2.9470999999999997e-07,2.9488e-07,2.9619000000000001e-07,3.0645000000000005e-07,3.0671999999999998e-07,3.0688999999999996e-07,3.0768000000000001e-07,3.0796999999999997e-07,3.0954999999999996e-07],"409600":[0.001727283,0.001730232,0.0017383082000000001,0.0017404153999999999,0.0017508762,0.0017514600000000005,0.0017533765999999992,0.001757273,0.001757396,0.001758969400000001,0.001767827,0.0017713715999999997,0.0017812212,0.0017860602,0.0018102329999999992,0.0021418153333333328,0.0021732040000000002,0.0022693750000000001,0.002282765,0.0023005870000000011]}},{"title":"std::unordered_map successful find","results":{"28":[4.9340000000000001e-07,4.9818000000000003e-07,4.9854000000000002e-07,5.0147e-07,5.0561000000000004e-07,5.0963000000000004e-07,5.1338000000000001e-07,5.1419999999999999e-07,5.1643999999999998e-07,5.2438999999999995e-07,5.2738e-07,5.2865999999999997e-07,5.3114000000000003e-07,5.3117000000000001e-07,5.4420000000000002e-07,5.4423e-07,5.4438999999999997e-07,5.4468000000000003e-07,5.5667000000000002e-07,5.9848000000000005e-07],"34":[6.3016999999999993e-07,6.3205000000000005e-07,6.4168000000000001e-07,6.4359999999999997e-07,6.4718e-07,6.4900000000000005e-07,6.5061000000000003e-07,6.5098999999999993e-07,6.5505000000000009e-07,6.5766999999999999e-07,6.5868999999999998e-07,6.6189999999999996e-07,6.6454999999999995e-07,6.6537000000000003e-07,6.6679000000000006e-07,6.708e-07,6.7830000000000003e-07,6.8650000000000001e-07,7.0196000000000007e-07,7.2035999999999997e-07],"29":[5.1508000000000003e-07,5.2466999999999995e-07,5.2944000000000001e-07,5.3430000000000001e-07,5.3566999999999993e-07,5.3875000000000003e-07,5.4219999999999997e-07,5.4326000000000001e-07,5.4746000000000001e-07,5.4759999999999995e-07,5.4825e-07,5.5260999999999997e-07,5.5458000000000003e-07,5.5489000000000001e-07,5.5626000000000003e-07,5.6737999999999994e-07,5.7463000000000006e-07,5.9200999999999997e-07,5.9571999999999999e-07,6.4822999999999998e-07],"40":[7.4033000000000001e-07,7.5127999999999999e-07,7.5280999999999998e-07,7.5634000000000001e-07,7.5929000000000002e-07,7.6088999999999993e-07,7.6301e-07,7.6903000000000005e-07,7.6970000000000002e-07,7.7143000000000002e-07,7.7267000000000005e-07,7.7817000000000004e-07,7.8535000000000003e-07,7.8766666666666669e-07,7.9103999999999997e-07,7.9400000000000004e-07,7.9759000000000004e-07,8.0955000000000005e-07,8.1205000000000002e-07,8.2228999999999999e-07],"17408":[0.00047153900000000015,0.00049160300000000018,0.00049667099999999996,0.00050026900000000002,0.00050121300000000014,0.00050480084210526304,0.00051003400000000003,0.00051231966666666644,0.00051238900000000003,0.00051508200000000004,0.00051601672222222213,0.00052311199999999984,0.00052729600000000001,0.00053066955555555544,0.00053165799999999996,0.00054025399999999999,0.00054334400000000029,0.000548118,0.00055550611764705886,0.00055916347058823537],"1472":[3.7270000000000001e-05,3.735e-05,3.8537000000000001e-05,3.9020000000000002e-05,3.9051000000000003e-05,3.9131000000000002e-05,3.9931685714285715e-05,3.9983953488372092e-05,4.0221600000000001e-05,4.0304720930232557e-05,4.0370220000000003e-05,4.0603239999999994e-05,4.0635600000000001e-05,4.1177610000000004e-05,4.1523569999999995e-05,4.1684999999999998e-05,4.2298000000000001e-05,4.2694000000000002e-05,4.3334000000000002e-05,4.3671229999999998e-05],"112":[2.0317400000000002e-06,2.05651e-06,2.0823700000000002e-06,2.0837099999999999e-06,2.1107e-06,2.1108800000000003e-06,2.11489e-06,2.1206000000000001e-06,2.12161e-06,2.1525900000000001e-06,2.1564199999999999e-06,2.1570799999999999e-06,2.1631000000000001e-06,2.1658300000000001e-06,2.16698e-06,2.2074100000000001e-06,2.2113400000000002e-06,2.2130400000000001e-06,2.2275400000000001e-06,2.2282699999999999e-06],"1376256":[0.345749898,0.35023879800000002,0.35252090699999999,0.35796639149999998,0.35918005800000002,0.36066999550000001,0.36386044949999996,0.36525311199999999,0.36654861049999998,0.37034831099999999,0.37460430600000005,0.381278118,0.381477658,0.387688955,0.38898757150000002,0.38902528749999998,0.38937727799999999,0.39458766999999995,0.39479708050000001,0.39928755199999999],"5242880":[1.4770258869999999,1.4912669365,1.5180974700000001,1.5567069075,1.5618984949999999,1.570466331,1.570504833,1.579511544,1.5897572659999999,1.5959211904999999,1.605627838,1.6080134509999999,1.6104157429999999,1.6116261549999999,1.618150797,1.619222454,1.6245207719999999,1.6483890164999999,1.6498152230000001,1.6907039240000001],"36":[6.5035000000000005e-07,6.5518000000000007e-07,6.5983e-07,6.6328000000000005e-07,6.7393e-07,6.7426e-07,6.7795999999999996e-07,6.7932000000000002e-07,6.8226999999999993e-07,6.8556999999999996e-07,6.8578000000000004e-07,6.9174000000000003e-07,6.9533000000000002e-07,6.962e-07,7.0952999999999992e-07,7.1694999999999997e-07,7.1712999999999996e-07,7.1903000000000011e-07,7.1916999999999995e-07,7.2847000000000001e-07],"42":[7.8648999999999994e-07,8.0426999999999999e-07,8.0828000000000004e-07,8.1606000000000007e-07,8.1866999999999991e-07,8.2027999999999998e-07,8.2261000000000003e-07,8.2374999999999995e-07,8.2482000000000005e-07,8.2535999999999992e-07,8.2610000000000002e-07,8.3077000000000007e-07,8.3167999999999999e-07,8.3706000000000006e-07,8.4474000000000009e-07,8.4561000000000007e-07,8.4938999999999991e-07,8.512282608695651e-07,8.5346000000000002e-07,8.8803999999999995e-07],"11534336":[3.5155528390000002,3.5389286279999999,3.588149724,3.6476363200000002,3.6807554420000002,3.6955379659999998,3.6973419980000002,3.7084494810000002,3.7103293929999999,3.7283277799999999,3.731509392,3.7665276840000002,3.7741818739999999,3.7906179820000001,3.8289745355,3.8534472829999999,3.8645835129999999,3.896028549,3.8984998200000001,3.919199941],"114688":[0.0070441119999999965,0.0070951920000000002,0.0071739660000000021,0.0072081279999999994,0.0079135239999999999,0.0079353919999999994,0.007972448,0.0080198774999999996,0.0081220560000000008,0.0082032160000000045,0.0082169110000000004,0.0082651980000000014,0.008286659,0.008365168000000001,0.0085940390000000064,0.0090334400000000002,0.0097610609999999997,0.0099901379999999956,0.0101783,0.0148174065],"144":[2.8454700000000001e-06,2.8507699999999999e-06,2.85984e-06,2.8609700000000002e-06,2.86285e-06,2.8683000000000001e-06,2.8769199999999996e-06,2.8828700000000004e-06,2.8996600000000001e-06,2.9077999999999999e-06,2.9150600000000004e-06,2.9186000000000003e-06,2.9226300000000002e-06,2.9424e-06,2.9459100000000003e-06,2.9485499999999999e-06,2.95251e-06,2.99739e-06,3.0069999999999998e-06,4.6428700000000005e-06],"38":[6.9816e-07,7.1075000000000003e-07,7.1241000000000001e-07,7.1458000000000009e-07,7.1460999999999996e-07,7.1590999999999996e-07,7.1979999999999997e-07,7.2264999999999998e-07,7.2284000000000003e-07,7.2386999999999998e-07,7.2619000000000007e-07,7.2659999999999996e-07,7.2923000000000003e-07,7.2942999999999993e-07,7.3876999999999994e-07,7.4275e-07,7.5389000000000004e-07,7.6453999999999999e-07,7.6656000000000006e-07,8.1353999999999996e-07],"240":[4.5876300000000003e-06,4.6448500000000001e-06,4.6836700000000002e-06,4.73273e-06,4.7438799999999999e-06,4.7630400000000002e-06,4.7748000000000004e-06,4.7768099999999996e-06,4.8080499999999996e-06,4.80889e-06,4.8235700000000003e-06,4.8281600000000004e-06,4.8476099999999998e-06,4.9063793103448278e-06,5.0039999999999999e-06,5.0428599999999994e-06,5.0622500000000005e-06,5.244076923076923e-06,5.3224999999999994e-06,5.5515500000000002e-06],"9216":[0.0002476039999999999,0.000256331,0.00025787799999999991,0.00025827900000000004,0.00025874999999999992,0.00025971099999999998,0.00026201533333333342,0.00026299694285714288,0.00026351,0.00026681200000000001,0.000267297,0.00026776399999999998,0.00026819799999999998,0.00026821745945945948,0.00026847137837837838,0.00027358328571428577,0.00027370018749999999,0.00027411867647058837,0.00027560900000000012,0.00027666799999999999],"44":[8.2485999999999999e-07,8.3114000000000002e-07,8.4326999999999995e-07,8.5049000000000009e-07,8.5228999999999991e-07,8.5583673469387751e-07,8.5598000000000002e-07,8.6459999999999995e-07,8.6542999999999999e-07,8.6612000000000008e-07,8.681e-07,8.7092999999999998e-07,8.7465000000000007e-07,8.764505494505495e-07,8.7871000000000001e-07,8.8026999999999998e-07,8.8821999999999994e-07,8.9351000000000006e-07,8.9419999999999995e-07,8.9883999999999991e-07],"1664":[3.7825333333333332e-05,3.8688e-05,3.8844999999999998e-05,3.9240999999999999e-05,3.926e-05,3.929691e-05,3.9388000000000003e-05,3.9641999999999998e-05,3.9748229999999995e-05,3.9933050000000002e-05,4.0001170000000004e-05,4.0091049999999996e-05,4.0713999999999997e-05,4.0845509999999994e-05,4.1032020000000004e-05,4.1486000000000002e-05,4.1831450000000004e-05,4.2954000000000002e-05,4.359957e-05,4.387836e-05],"196608":[0.015307559,0.015688062500000006,0.01584029,0.016066748499999992,0.016171545000000002,0.016758758000000006,0.017127989999999999,0.0172001785,0.017207436999999999,0.017326703000000009,0.017349584999999994,0.0175871685,0.017604920499999999,0.017769871,0.018026536499999999,0.018576760000000001,0.018764041999999998,0.019031263499999999,0.020251729,0.023375109499999998],"155648":[0.0106320055,0.010716812499999999,0.010988056,0.0110519955,0.011104342499999999,0.0111778095,0.0117646165,0.011942992000000001,0.012218879,0.012246979999999999,0.012303400000000001,0.012465935000000001,0.0124694575,0.01255766,0.012923698000000001,0.014232195,0.01646653,0.017181031499999999,0.021797767000000006,0.028169656999999994],"2816":[7.6899999999999999e-05,7.7622999999999999e-05,7.8410000000000003e-05,7.9264000000000005e-05,8.0476352941176481e-05,8.0963000000000004e-05,8.1086899999999998e-05,8.1602999999999998e-05,8.245217647058824e-05,8.2918999999999997e-05,8.2932549999999996e-05,8.3001659999999992e-05,8.414230999999999e-05,8.4957692307692314e-05,8.5193733333333344e-05,8.5598069999999994e-05,8.6005690000000008e-05,8.9321560000000006e-05,8.9433181818181817e-05,0.00010007850505050501],"50":[8.5735999999999989e-07,8.5921999999999999e-07,8.6180000000000005e-07,8.6578999999999997e-07,8.6843999999999996e-07,8.7639999999999999e-07,8.7898000000000005e-07,8.831399999999999e-07,8.8404000000000007e-07,8.8421e-07,8.9524999999999992e-07,9.1653000000000002e-07,9.1842999999999995e-07,9.2601000000000007e-07,9.3460000000000002e-07,9.4916666666666665e-07,9.6405999999999997e-07,1.0000204081632653e-06,1.0305599999999999e-06,1.03394e-06],"2359296":[0.61391255050000004,0.61963256099999997,0.62300006050000001,0.6244466675,0.62990883100000006,0.63058500499999992,0.63233258599999997,0.64419810550000001,0.64833310899999996,0.65721927749999998,0.65795068450000005,0.68187143400000005,0.68355078250000001,0.68499014499999999,0.68816754050000006,0.69001751099999997,0.6977826815,0.70944572400000006,0.7116341545,0.71270523000000008],"46":[8.8920999999999995e-07,8.9110999999999999e-07,8.9237000000000004e-07,8.9960999999999999e-07,9.1261000000000002e-07,9.1893999999999994e-07,9.2325999999999997e-07,9.2437999999999997e-07,9.2695999999999993e-07,9.308400000000001e-07,9.3371000000000001e-07,9.3876999999999993e-07,9.4030999999999998e-07,9.4351999999999997e-07,9.4462000000000005e-07,9.5183999999999998e-07,9.5662e-07,9.6020000000000014e-07,1.0469999999999999e-06,1.105e-06],"176":[3.5976699999999999e-06,3.6245599999999997e-06,3.6249600000000002e-06,3.6529500000000003e-06,3.6551e-06,3.6815600000000002e-06,3.6844935064935064e-06,3.7050400000000004e-06,3.71618e-06,3.7196200000000001e-06,3.7238400000000001e-06,3.72927e-06,3.7323599999999998e-06,3.7330000000000001e-06,3.7778099999999999e-06,3.8189491525423734e-06,3.8627500000000004e-06,3.8670800000000001e-06,3.8774299999999999e-06,3.93193e-06],"52":[8.9672000000000005e-07,9.0404999999999995e-07,9.0770000000000001e-07,9.1004999999999997e-07,9.1017e-07,9.1734999999999999e-07,9.1915000000000002e-07,9.3773000000000002e-07,9.3967e-07,9.4656999999999999e-07,9.5969000000000004e-07,9.600299999999999e-07,9.6112000000000013e-07,9.665199999999999e-07,9.694199999999999e-07,9.7426999999999995e-07,9.7749999999999996e-07,9.9373999999999995e-07,1.0197e-06,1.1605500000000001e-06],"272":[5.3720200000000001e-06,5.375133333333333e-06,5.4295799999999999e-06,5.44732e-06,5.4886599999999994e-06,5.5045099999999994e-06,5.5552300000000002e-06,5.5695199999999995e-06,5.5715699999999997e-06,5.6234399999999996e-06,5.69693e-06,5.7358974358974353e-06,5.7932299999999994e-06,5.8631000000000007e-06,5.8645100000000002e-06,5.89755e-06,5.913e-06,5.9439599999999999e-06,6.2500700000000001e-06,6.2978000000000001e-06],"116":[2.1376999999999999e-06,2.1458600000000002e-06,2.1481400000000001e-06,2.1565399999999999e-06,2.18743e-06,2.2251000000000001e-06,2.2266666666666668e-06,2.2269649122807019e-06,2.2352000000000002e-06,2.2504300000000001e-06,2.2613299999999998e-06,2.2765900000000001e-06,2.2904499999999998e-06,2.2906900000000001e-06,2.2937899999999997e-06,2.29773e-06,2.3006e-06,2.3172800000000001e-06,2.3422199999999999e-06,2.4087699999999997e-06],"47104":[0.0025339853333333335,0.0025646426666666665,0.0025901640000000003,0.0025922036666666667,0.0025983860000000007,0.0026123616666666673,0.002626073,0.0026726370000000011,0.0026796873333333323,0.0027269243333333327,0.0027437653333333332,0.0027890693333333326,0.002789471,0.0028032359999999989,0.0028062093333333328,0.0028266439999999993,0.0028330153333333335,0.0028784040000000002,0.0029019200000000001,0.0029889035],"6912":[0.00016707699999999999,0.00016875599999999999,0.000168801,0.000171306,0.000174828,0.00017504,0.00017580783333333335,0.000179092,0.000179791,0.00018083899999999999,0.00018152199999999999,0.0001815265,0.00018215557142857143,0.00018271375,0.00018348,0.00018423300000000001,0.00018494358490566039,0.00018548960416666667,0.00018754830434782613,0.00019919599999999995],"1856":[4.3579999999999999e-05,4.4172000000000003e-05,4.4320000000000003e-05,4.4846999999999999e-05,4.5547000000000003e-05,4.6064460000000003e-05,4.6131239999999999e-05,4.640374e-05,4.6501459999999999e-05,4.660551e-05,4.6644999999999998e-05,4.6666219999999999e-05,4.6832569999999994e-05,4.7448789999999998e-05,4.7655999999999999e-05,4.7738110000000004e-05,4.7775999999999998e-05,4.8026999999999999e-05,4.8476999999999997e-05,4.9098000000000003e-05],"48":[8.3335999999999999e-07,8.3735999999999998e-07,8.3992999999999998e-07,8.4180999999999999e-07,8.4263000000000007e-07,8.4674999999999998e-07,8.4697000000000002e-07,8.4903999999999998e-07,8.5491999999999998e-07,8.7087000000000002e-07,8.7596000000000002e-07,8.8504000000000004e-07,8.8898000000000006e-07,8.9456999999999989e-07,9.0112999999999992e-07,9.0149999999999997e-07,9.0859000000000001e-07,9.2671999999999998e-07,9.2726999999999991e-07,9.2806999999999997e-07],"2097152":[0.52830450699999998,0.53548323399999997,0.53892812400000001,0.54094096999999997,0.54655694300000002,0.5475168225,0.54766536050000003,0.55170445800000001,0.55810610350000001,0.56353290700000003,0.56678310450000002,0.56977737799999995,0.58533758599999997,0.58616008850000001,0.59357736300000008,0.59573199399999999,0.59630443700000002,0.60739821449999998,0.62846073300000005,0.62940628300000001],"54":[9.6595000000000004e-07,9.7169000000000009e-07,9.7848999999999997e-07,9.8322999999999994e-07,9.8793000000000009e-07,9.9105000000000002e-07,9.9567000000000007e-07,9.9669000000000007e-07,9.9748999999999991e-07,9.9975000000000004e-07,1.00827e-06,1.0087200000000001e-06,1.0174e-06,1.0196899999999999e-06,1.02194e-06,1.0226200000000001e-06,1.0410699999999999e-06,1.04639e-06,1.06444e-06,1.13998e-06],"2031616":[0.51705390699999998,0.51775649899999998,0.52119568799999993,0.52273683950000005,0.52282079699999995,0.530813961,0.5355383735,0.53627500800000005,0.53867970899999995,0.54326943500000002,0.55705358599999999,0.55874992099999998,0.55883462399999995,0.560250001,0.56096533199999998,0.56224518700000004,0.56465238600000001,0.56612633200000007,0.59470674099999998,0.60518573350000004],"43008":[0.0022301177500000002,0.0022546415000000005,0.0022584422500000001,0.002269025,0.0022894232500000008,0.0022971867500000001,0.0023108604999999998,0.0023291379999999988,0.0023404700000000007,0.0023838640000000003,0.0023906567499999989,0.002395875,0.00241130725,0.0024577596666666666,0.0024703499999999996,0.0024788589999999999,0.0024893533333333337,0.0025052779999999988,0.0025176860000000003,0.002652321],"60":[1.0768800000000001e-06,1.08191e-06,1.11261e-06,1.11512e-06,1.1171799999999999e-06,1.1197399999999999e-06,1.12157e-06,1.1226999999999999e-06,1.12305e-06,1.1256000000000001e-06,1.1442500000000001e-06,1.1528e-06,1.15517e-06,1.16262e-06,1.1640800000000001e-06,1.1641799999999999e-06,1.16812e-06,1.1819000000000001e-06,1.21341e-06,1.2392499999999998e-06],"30720":[0.001280296,0.001290377857142857,0.0012964654285714287,0.001318313,0.001320533,0.0013481685714285712,0.0013961189999999999,0.001403273,0.00141259,0.0014128833333333338,0.0014177878333333333,0.0014201995,0.0014480726666666662,0.0014483183333333332,0.0014502504999999999,0.0014559251666666664,0.0014684463333333336,0.0014715189999999997,0.0014832339999999999,0.001494252],"56":[9.9742999999999995e-07,1.0113599999999999e-06,1.01427e-06,1.0187099999999999e-06,1.0267400000000001e-06,1.0307299999999999e-06,1.0315800000000001e-06,1.0334200000000001e-06,1.0392900000000001e-06,1.03977e-06,1.04784e-06,1.0499400000000001e-06,1.0500000000000001e-06,1.0515400000000001e-06,1.0553700000000001e-06,1.0572199999999999e-06,1.06223e-06,1.0657499999999999e-06,1.0689e-06,1.0903199999999999e-06],"62":[1.14658e-06,1.14783e-06,1.14881e-06,1.1596400000000001e-06,1.15978e-06,1.1695416666666665e-06,1.17905e-06,1.18264e-06,1.18832e-06,1.19101e-06,1.19122e-06,1.1970900000000001e-06,1.1988700000000001e-06,1.19952e-06,1.2015400000000001e-06,1.21569e-06,1.21799e-06,1.2205657894736842e-06,1.2559800000000002e-06,1.54477e-06],"58":[1.0480599999999999e-06,1.05212e-06,1.06994e-06,1.0700999999999999e-06,1.0780000000000001e-06,1.07811e-06,1.0949600000000001e-06,1.0974300000000001e-06,1.09808e-06,1.1019599999999999e-06,1.10316e-06,1.1049199999999999e-06,1.1206300000000001e-06,1.12987e-06,1.13248e-06,1.13659e-06,1.1407200000000001e-06,1.1672e-06,1.16749e-06,1.19002e-06],"3014656":[0.82468820300000001,0.82514344400000006,0.82719727799999998,0.82723268500000002,0.84294914249999997,0.85125100200000003,0.86239315350000001,0.86482073299999995,0.867467718,0.87924176399999998,0.88464525049999998,0.88711202099999997,0.89780806400000002,0.89818400549999999,0.89852127000000004,0.90721702699999995,0.91145779500000002,0.92882374150000002,0.92934415550000005,0.98437647549999996],"64":[1.1596400000000001e-06,1.16825e-06,1.17468e-06,1.1875799999999999e-06,1.20176e-06,1.2089090909090909e-06,1.2089500000000001e-06,1.2097e-06,1.21227e-06,1.21619e-06,1.21727e-06,1.22132e-06,1.2242000000000001e-06,1.22996e-06,1.2308999999999999e-06,1.2509199999999999e-06,1.2535700000000002e-06,1.26059e-06,1.26069e-06,1.3187799999999998e-06],"8388608":[2.3908858020000001,2.4310061689999998,2.4577428604999998,2.4935408410000002,2.5202807835000001,2.5243423935,2.5402016110000001,2.5417309774999999,2.5466028129999998,2.5630421440000002,2.5635965595000001,2.5639015464999999,2.569529567,2.6134452225000002,2.6134785185,2.6339142375,2.6373227359999998,2.6577469515000001,2.693834861,2.7072397700000002],"29696":[0.001226914,0.0012463590000000001,0.001250894,0.0012894855714285715,0.001290264,0.001290858,0.00130368,0.0013159550000000006,0.0013192710000000001,0.001322075,0.0013774360000000005,0.0014094560000000001,0.0014216420000000003,0.0014383336666666663,0.0014625579999999997,0.0014762779999999995,0.001518262,0.0015306039999999999,0.0015381589999999997,0.001704449],"216":[4.1012299999999994e-06,4.1170699999999995e-06,4.1257777777777784e-06,4.2214615384615383e-06,4.2344999999999999e-06,4.24632e-06,4.2500500000000001e-06,4.2538199999999995e-06,4.2602100000000002e-06,4.2981399999999998e-06,4.3001900000000001e-06,4.3019299999999998e-06,4.3076000000000001e-06,4.35401e-06,4.3569200000000003e-06,4.3843599999999996e-06,4.38715e-06,4.5387500000000004e-06,4.7075454545454547e-06,4.7309900000000003e-06],"106496":[0.0066580719999999993,0.0066707750000000038,0.006728066000000003,0.0067463499999999999,0.006752041999999998,0.0067532420000000022,0.006800207,0.0070199250000000032,0.0072031259999999998,0.0072399689999999971,0.0072680180000000028,0.0072694080000000024,0.0073004990000000002,0.0073153619999999963,0.0073451480000000053,0.0074411660000000017,0.0076397519999999971,0.0077881540000000003,0.0077993539999999997,0.0078435529999999996],"72":[1.3082499999999999e-06,1.3244900000000001e-06,1.32829e-06,1.3365499999999999e-06,1.35959e-06,1.3612300000000002e-06,1.3635700000000002e-06,1.3639199999999999e-06,1.3776199999999999e-06,1.3793333333333333e-06,1.3842300000000002e-06,1.40588e-06,1.40725e-06,1.4077400000000001e-06,1.41543e-06,1.4296600000000002e-06,1.4323100000000001e-06,1.43309e-06,1.4407999999999998e-06,1.4421000000000001e-06],"442368":[0.075113257999999974,0.075236370999999996,0.07726899999999999,0.077981990000000029,0.078384857999999974,0.079632636499999992,0.080205701000000018,0.083707388999999952,0.084121748999999996,0.085728437500000004,0.086869009999999997,0.087019446,0.088880848999999998,0.090554667000000005,0.090751216500000037,0.090820796000000037,0.091525272000000005,0.092496458999999948,0.09875601649999996,0.107733712],"147456":[0.0098957884999999971,0.0099431694999999997,0.0099488725000000024,0.0099962240000000032,0.010160975000000001,0.0102427605,0.010958094999999998,0.0110293535,0.011123389500000028,0.011206097,0.011439152500000001,0.011509715,0.0115709535,0.011578208,0.011580679999999999,0.011676001,0.011871801999999997,0.012455948,0.013438448,0.0150027895],"4456448":[1.2389808769999999,1.2542244419999999,1.2613392050000001,1.264035555,1.2680490129999999,1.2762032620000001,1.2769209209999999,1.2857942305000001,1.2962100395,1.297403101,1.3074473389999999,1.3132124860000001,1.319753073,1.3213369269999999,1.3404477749999999,1.3486727590000001,1.355487978,1.3730978409999999,1.3926319300000001,1.4256032699999999],"63488":[0.003585095500000001,0.0036757145000000007,0.0037027590000000012,0.0037147974999999986,0.0037330605,0.0037334669999999999,0.0037543115000000017,0.0038645369999999999,0.003933878,0.0039375639999999993,0.0039822594999999999,0.0039822774999999999,0.0040763774999999997,0.0041075784999999986,0.0041131645000000005,0.0041354149999999999,0.0041450895,0.0041611685000000004,0.0043263709999999999,0.0067289050000000003],"38912":[0.0019017050000000001,0.001922158,0.0019423020000000006,0.001943885,0.001956438,0.0019572079999999998,0.0019638384,0.0020154079999999998,0.0020616767499999997,0.0020690834999999999,0.0020843200000000002,0.0020957742500000006,0.0021041410000000012,0.002126518,0.00213441375,0.0021419120000000015,0.0021610849999999992,0.0021612440000000001,0.0021677027500000001,0.0021832614999999994],"68":[1.2581399999999999e-06,1.26837e-06,1.2758499999999998e-06,1.2790600000000001e-06,1.2818299999999999e-06,1.28797e-06,1.294e-06,1.29422e-06,1.2970700000000001e-06,1.3123571428571428e-06,1.3169500000000002e-06,1.3178500000000002e-06,1.3243799999999998e-06,1.32697e-06,1.32905e-06,1.3292600000000001e-06,1.33277e-06,1.3441800000000001e-06,1.34608e-06,1.37286e-06],"188416":[0.014062863,0.014148958500000003,0.014718045500000004,0.014966475,0.015157001999999998,0.015250729999999999,0.015585368,0.015661441999999994,0.015876421999999994,0.015911178000000005,0.016137223500000002,0.016312963,0.0164144645,0.016779352499999994,0.016986439999999995,0.0170095855,0.017166736500000009,0.017433214999999995,0.017514473499999999,0.018017863499999998],"248":[4.7921599999999994e-06,4.8461428571428572e-06,4.8684899999999994e-06,4.8711900000000002e-06,4.9367613636363636e-06,4.9678299999999997e-06,4.9896499999999997e-06,5.02053e-06,5.0257899999999995e-06,5.0367200000000001e-06,5.0417500000000005e-06,5.0505700000000008e-06,5.0938999999999996e-06,5.1506200000000008e-06,5.1763199999999996e-06,5.1929199999999996e-06,5.1992399999999995e-06,5.3105399999999996e-06,5.3365200000000002e-06,5.60452e-06],"80":[1.51412e-06,1.52688e-06,1.53053e-06,1.53287e-06,1.5335500000000001e-06,1.5394e-06,1.54163e-06,1.54588e-06,1.5593499999999999e-06,1.5647600000000002e-06,1.56489e-06,1.57247e-06,1.5831200000000001e-06,1.58433e-06,1.59257e-06,1.5933200000000002e-06,1.6001200000000001e-06,1.6015100000000001e-06,1.6056499999999998e-06,1.61072e-06],"2560":[6.7819999999999998e-05,7.0314999999999993e-05,7.0458779999999996e-05,7.0627375000000006e-05,7.1621051282051275e-05,7.1711000000000005e-05,7.1967999999999999e-05,7.2360000000000005e-05,7.2772363636363629e-05,7.3083000000000005e-05,7.3370099999999991e-05,7.3590000000000005e-05,7.3836580000000002e-05,7.4160950000000007e-05,7.4284589999999996e-05,7.4294429999999993e-05,7.4702970000000004e-05,7.4817450000000003e-05,7.6286517241379306e-05,7.6445899999999999e-05],"34816":[0.001601473,0.0016052919999999999,0.001605701,0.0016087972,0.0016148899999999995,0.0016178111999999999,0.001620635,0.001624615,0.0016482319999999999,0.0016690951999999998,0.001690553,0.0017123969999999996,0.0017379746000000004,0.001738432,0.0017542100000000004,0.0017692076000000007,0.001769364,0.0017710628,0.0017717120000000004,0.0017753089999999999],"3712":[9.2029999999999998e-05,9.4718999999999999e-05,9.5092000000000004e-05,9.5106999999999996e-05,9.5123000000000004e-05,9.5512000000000003e-05,9.5536142857142865e-05,9.6000080000000008e-05,9.6263999999999999e-05,9.7011877551020413e-05,9.7015999999999994e-05,9.7642585858585858e-05,9.7863999999999997e-05,9.8232428571428567e-05,9.8590000000000003e-05,9.9329999999999999e-05,0.00010092413402061853,0.0001017116666666667,0.00010342330208333337,0.000107642],"3538944":[0.93257913299999995,0.95086990400000004,0.96166582050000005,0.97430839899999999,0.97989225000000002,0.98100856300000006,0.98962505499999998,0.991321958,0.99384602700000002,1.0003538245000001,1.0031799905000001,1.0045039259999999,1.0060281659999999,1.0067929200000001,1.0281888655,1.0322105404999999,1.043576429,1.057627885,1.060349446,1.0736039829999999],"76":[1.4091900000000001e-06,1.4183399999999999e-06,1.4365999999999999e-06,1.4420700000000002e-06,1.4511900000000001e-06,1.45239e-06,1.4587700000000001e-06,1.46428e-06,1.46587e-06,1.4780699999999999e-06,1.4850599999999999e-06,1.4851099999999998e-06,1.4928900000000001e-06,1.4929599999999999e-06,1.4952100000000002e-06,1.4993499999999999e-06,1.4995000000000002e-06,1.50583e-06,1.5653299999999998e-06,1.5767299999999999e-06],"4194304":[1.1475768849999999,1.158346782,1.164069757,1.1746632745000001,1.1911889439999999,1.1914922319999999,1.1918832834999999,1.197284789,1.212657713,1.212734132,1.216911265,1.229026634,1.2396852695,1.2399685890000001,1.2440101700000001,1.244512174,1.2670855825,1.271582475,1.288957702,1.319468796],"851968":[0.18523210700000001,0.187964566,0.193093295,0.19497335199999999,0.19764286,0.19825011100000001,0.1991344505,0.19956653399999999,0.200050277,0.201103482,0.20189193449999998,0.20478449400000001,0.20657124800000004,0.21784053349999999,0.21889514600000004,0.219036385,0.22117326800000001,0.222678978,0.22510002299999998,0.23337406350000001],"4096":[0.000102719,0.00010419,0.00010443799999999999,0.000105603,0.00010723200000000003,0.00010748337499999999,0.000107775,0.00010793600000000003,0.000108496,0.00010928400000000001,0.00011080499999999999,0.00011115852499999997,0.00011238478205128204,0.000113423,0.000114471,0.00011546331325301205,0.0001154812,0.000115766,0.000116187,0.00011621900000000001],"59392":[0.0032775159999999985,0.0033778045,0.0033784645,0.003385898,0.0034048044999999984,0.0034227834999999984,0.0034626729999999986,0.0034831750000000002,0.0036198285,0.0036460334999999996,0.0036701905,0.0036823159999999988,0.0037412220000000011,0.0037552634999999989,0.0037710125,0.0037925764999999999,0.0037928475,0.0037943514999999998,0.0038127965,0.0038773240000000001],"84":[1.56272e-06,1.6198300000000001e-06,1.6208400000000001e-06,1.6230300000000002e-06,1.6281699999999999e-06,1.63559e-06,1.6542799999999999e-06,1.66159e-06,1.67133e-06,1.6765599999999999e-06,1.6822800000000001e-06,1.6824e-06,1.6846081081081082e-06,1.68633e-06,1.6867164179104478e-06,1.69868e-06,1.7079599999999999e-06,1.72039e-06,1.83138e-06,1.83474e-06],"3276800":[0.90394039599999998,0.93111549000000005,0.94487306500000001,0.95352534349999996,0.96003196199999996,0.96589343250000004,0.97117392899999999,0.97458122400000002,0.97864906500000004,0.97949558199999998,0.98064024500000002,0.98226202699999998,0.98521724399999999,0.99245332200000003,1.0070733860000001,1.0072966999999999,1.0305303029999999,1.036844817,1.054773768,1.0631641805000001],"55296":[0.0030090403333333337,0.0030628103333333332,0.0030945683333333334,0.0031009900000000001,0.0031321236666666677,0.0031660596666666665,0.0031716740000000002,0.0033010730000000007,0.0033014569999999998,0.003302293,0.0033445740000000008,0.0033621744999999979,0.0033959665,0.0034070909999999988,0.0034171955000000002,0.0034506209999999983,0.0034832035,0.0034843499999999998,0.0035287090000000001,0.0035623315000000008],"688128":[0.14252051700000001,0.143296901,0.144872905,0.14695812699999999,0.14714576200000001,0.15179353900000001,0.15179969399999999,0.15233576700000001,0.154412835,0.15554127449999999,0.15843454900000001,0.15899221399999999,0.16186251800000001,0.16259556400000003,0.16383476699999999,0.16460018300000001,0.16476854299999999,0.17029930299999996,0.17037449599999999,0.18067451900000001],"8192":[0.00020952200000000004,0.00021658800000000012,0.00021881099999999991,0.000219836,0.00022033099999999991,0.00022048099999999994,0.00022062200000000002,0.000223196,0.00022532680952380945,0.00022647500000000002,0.00022719800000000002,0.00022801433333333323,0.00023154299999999999,0.000233365,0.00023447157142857138,0.00023459499999999999,0.00023485687804878052,0.0002361118,0.00024985525641025642,0.00026066999999999996],"10240":[0.00029277099999999999,0.00029335800000000002,0.00029337499999999991,0.000296287,0.00029652600000000019,0.000298432,0.000298793,0.00030054300000000001,0.00030198249999999996,0.00030370166666666672,0.00030481816129032267,0.00030509899999999992,0.00030689200000000002,0.0003115273870967742,0.00031260900000000004,0.00031301409677419361,0.00032025046428571432,0.0003252256000000001,0.00032549500000000008,0.00034977499999999998],"15872":[0.00042001300000000001,0.0004321005000000001,0.00043512099999999996,0.00044140100000000001,0.000441466,0.00044162099999999979,0.00044346140909090902,0.00044469699999999997,0.00044642600000000004,0.0004472150000000001,0.00045147671428571431,0.00045348099999999983,0.00045349699999999986,0.00045770199999999994,0.00045828299999999998,0.00045915399999999997,0.00045921652380952367,0.0004795585,0.00049382199999999988,0.00049560299999999973],"92":[1.74678e-06,1.7850000000000001e-06,1.81734e-06,1.8207499999999999e-06,1.8309599999999999e-06,1.8455599999999999e-06,1.8487500000000001e-06,1.8589600000000001e-06,1.8635799999999999e-06,1.8681200000000001e-06,1.8684800000000001e-06,1.8760000000000001e-06,1.87638e-06,1.8872699999999999e-06,1.8882900000000001e-06,1.90032e-06,1.90299e-06,1.9057199999999999e-06,1.9234800000000002e-06,2.05984e-06],"26624":[0.00096391400000000007,0.00097619500000000001,0.00097749300000000007,0.000979885,0.00098444600000000037,0.00099116400000000032,0.00099576200000000008,0.001004561,0.0010051671111111112,0.0010087850000000001,0.0010094136666666666,0.0010268725555555554,0.0010305220000000001,0.0010363060000000003,0.001041664444444444,0.0010435139999999999,0.001084696,0.001094619,0.001144415,0.001148799875],"1792":[4.1581000000000001e-05,4.2426999999999999e-05,4.2577999999999998e-05,4.2737000000000001e-05,4.2947319999999996e-05,4.3124950000000001e-05,4.3143999999999999e-05,4.3378129999999999e-05,4.3392000000000001e-05,4.3754874999999995e-05,4.3757210000000002e-05,4.3925960000000003e-05,4.400661e-05,4.4144136363636362e-05,4.4570000000000002e-05,4.4677639999999997e-05,4.4788130000000001e-05,4.5538785714285711e-05,4.6569330000000004e-05,4.7051949999999999e-05],"11776":[0.00035501800000000002,0.00035795100000000002,0.000359413,0.00036043099999999992,0.00036166926923076931,0.000362109,0.00036344600000000002,0.00036788330769230772,0.00037215603846153854,0.00037373699999999996,0.0003738452,0.00037436073076923079,0.00037807995833333334,0.000381703,0.00038275848,0.00038492944000000003,0.00039382100000000004,0.00039468800000000014,0.0004033175,0.00041199599999999998],"2944":[8.1268999999999997e-05,8.1911999999999998e-05,8.2194000000000006e-05,8.3255000000000002e-05,8.4196999999999994e-05,8.4544083333333326e-05,8.5729999999999994e-05,8.6518000000000001e-05,8.6802181818181808e-05,8.7040571428571419e-05,8.8191199999999997e-05,8.8812160000000014e-05,8.9549999999999995e-05,8.9932142857142855e-05,9.0088999999999998e-05,9.1153e-05,9.1561e-05,9.1840515151515143e-05,9.2744179999999991e-05,9.3208999999999995e-05],"88":[1.6750399999999999e-06,1.6836999999999999e-06,1.72566e-06,1.7350699999999999e-06,1.7351599999999999e-06,1.7358500000000001e-06,1.7404899999999998e-06,1.74823e-06,1.7533199999999999e-06,1.7549600000000001e-06,1.7694799999999998e-06,1.77287e-06,1.7833899999999999e-06,1.79194e-06,1.79745e-06,1.80005e-06,1.8034285714285713e-06,1.8179099999999998e-06,1.82795e-06,1.85892e-06],"22528":[0.00070325100000000001,0.00074452299999999997,0.00074515846153846153,0.00074831600000000006,0.0007734086666666667,0.00078473483333333337,0.00078645514285714292,0.00078769883333333309,0.00078773799999999996,0.00078820799999999999,0.00080665008333333319,0.00081013118181818178,0.00081022016666666664,0.00081346800000000003,0.0008136030000000002,0.00081868500000000042,0.00083605300000000012,0.00083899600000000006,0.00083962145454545469,0.00084265745454545457],"1245184":[0.29581857150000002,0.302619894,0.30385496200000001,0.304417414,0.30682427200000001,0.30815115100000001,0.308724267,0.31516127100000002,0.31842441300000002,0.31920809250000004,0.32272959299999998,0.33033278999999999,0.333063938,0.33344426599999999,0.33632597650000001,0.33775137649999998,0.345581429,0.35344514300000002,0.36262501199999997,0.36398065149999997],"15728640":[4.7031443150000003,4.779514185,4.7946318469999998,4.7997793839999998,4.8686088659999998,4.8751581560000004,4.9766131549999999,4.9973099349999996,5.0112250700000001,5.0236386059999996,5.0349506860000002,5.0444062885000003,5.0884284565,5.0886200710000002,5.1017329330000001,5.1058404590000004,5.1111366790000003,5.1632296824999999,5.2063238084999997,5.2956772040000004],"96":[1.84528e-06,1.8841699999999999e-06,1.8917900000000002e-06,1.9003e-06,1.9140900000000002e-06,1.91904e-06,1.9192300000000002e-06,1.92593e-06,1.9281300000000002e-06,1.93084e-06,1.9328100000000002e-06,1.9380599999999999e-06,1.9444299999999999e-06,1.9478900000000002e-06,1.9602000000000003e-06,1.9883999999999999e-06,2.0020099999999999e-06,2.029e-06,2.03112e-06,2.1179399999999999e-06],"1984":[4.7098000000000002e-05,4.8009000000000001e-05,4.8482000000000001e-05,4.8600999999999998e-05,4.9565999999999999e-05,4.9846999999999999e-05,5.0006999999999997e-05,5.0018000000000001e-05,5.0058000000000001e-05,5.0068999999999998e-05,5.0414000000000002e-05,5.0705489999999997e-05,5.0744949999999999e-05,5.0934999999999999e-05,5.1407550000000002e-05,5.1422539325842703e-05,5.1650999999999997e-05,5.2049999999999998e-05,5.2312070000000001e-05,5.3059239999999998e-05],"139264":[0.0093000499999999972,0.0093219014999999968,0.009374626500000002,0.009475863499999999,0.009813558,0.010067847500000001,0.010336443000000004,0.010443569,0.010693462000000001,0.010758087499999998,0.011453255000000004,0.011480841,0.012433811000000001,0.012949128000000001,0.01295237,0.013199194000000001,0.014035800500000001,0.015968852499999998,0.021541018500000002,0.023511912999999995],"475136":[0.083339777000000004,0.084095224999999996,0.085502033000000005,0.085705276999999996,0.087241885000000005,0.08768333399999996,0.089055055000000008,0.089575589999999997,0.089590192500000027,0.090335246000000008,0.091271353499999999,0.09129539099999999,0.094225142499999998,0.099123609000000029,0.099283466000000001,0.099885569000000007,0.10011819800000001,0.102082778,0.102124146,0.10332894300000001],"13631488":[4.0728963470000004,4.1778586415000003,4.2119997299999996,4.2165353655000004,4.2244480099999997,4.2274941740000003,4.2343675305000001,4.2595750380000004,4.2633905785000001,4.266209022,4.3236050800000001,4.3246564840000001,4.3259277689999998,4.3520708944999997,4.3575573370000003,4.3669285000000002,4.3868768060000001,4.4415265474999996,4.4417548010000001,4.601458783],"416":[8.176923076923076e-06,8.2322777777777779e-06,8.3298299999999998e-06,8.4215599999999997e-06,8.4247400000000003e-06,8.4478400000000001e-06,8.4883599999999988e-06,8.4887000000000006e-06,8.5008500000000001e-06,8.5216600000000007e-06,8.5384600000000002e-06,8.545319999999999e-06,8.6617500000000005e-06,8.7023300000000001e-06,8.7159400000000001e-06,8.7429599999999997e-06,9.3720299999999998e-06,9.6460000000000005e-06,9.6533999999999998e-06,9.6729300000000006e-06],"928":[1.9837e-05,1.9842000000000001e-05,2.0055999999999999e-05,2.0564289999999998e-05,2.0760000000000001e-05,2.0811000000000001e-05,2.1155210000000001e-05,2.1162133333333332e-05,2.1236000000000001e-05,2.1447990000000001e-05,2.14595e-05,2.1520189999999997e-05,2.1559330000000001e-05,2.156e-05,2.1610520000000001e-05,2.1968700000000002e-05,2.2180177777777777e-05,2.2941530000000003e-05,2.4144320000000003e-05,2.5374333333333335e-05],"512":[1.0776e-05,1.0803e-05,1.0903999999999999e-05,1.0987010000000001e-05,1.0991229999999999e-05,1.0991849999999999e-05,1.1096030000000001e-05,1.114005e-05,1.11469e-05,1.1158319999999999e-05,1.120744e-05,1.1255569999999999e-05,1.1332530000000001e-05,1.137337e-05,1.1425e-05,1.1858920000000001e-05,1.1933149999999999e-05,1.214326e-05,1.2685e-05,1.2686869999999998e-05],"18432":[0.0005451808235294118,0.00054659400000000029,0.00055257541176470591,0.0005544155,0.00055728699999999963,0.00056084405882352939,0.00056698299999999985,0.00056705876470588223,0.00057695399999999997,0.00058250318749999996,0.00058328700000000026,0.00058775899999999998,0.00059452831249999982,0.00059486000000000001,0.00059578193750000025,0.00060346893333333338,0.0006096316875000002,0.00061731737499999973,0.000635686,0.00065070586666666672],"16777216":[5.2363178450000003,5.2399719859999996,5.2771149644999999,5.3519983885000002,5.3673896804999996,5.3749207449999998,5.3887876879999999,5.3949087819999999,5.4016097595000003,5.4028217539999996,5.4032795680000003,5.4358593079999995,5.4404791095,5.4447024480000001,5.4496341265000003,5.4688403675000004,5.4873642064999997,5.5597609319999997,5.5736761305,5.61147141],"9728":[0.00026472600000000001,0.00026884666666666669,0.00027626699999999991,0.000276772,0.000277392,0.00027826700000000001,0.00027878799999999992,0.000279141,0.00028067200000000015,0.00028167599999999991,0.00028198619354838703,0.00028532848484848488,0.00028624199999999997,0.00028898299999999998,0.00028927900000000014,0.00029050000000000007,0.00029090533333333337,0.00029353778124999999,0.00029970600000000001,0.00030683490625000009],"1769472":[0.43970917900000001,0.4411377085,0.44508545899999996,0.44560369399999999,0.44641281899999996,0.45317648999999999,0.46068437000000001,0.460816999,0.46174075599999997,0.46302072700000002,0.46735626299999999,0.47599975300000003,0.47738747650000002,0.47789580100000001,0.47804745699999995,0.48286083400000002,0.48521788900000001,0.4902204355,0.49050618700000004,0.51795268900000002],"1703936":[0.42255068499999998,0.42290234599999998,0.42307397299999999,0.42591926199999997,0.43371078800000001,0.44584175650000002,0.446936061,0.45604837999999998,0.46165638200000003,0.46325477700000001,0.46503984300000001,0.46539418649999997,0.46925781700000002,0.46949837300000002,0.47795924400000001,0.47852990699999998,0.49295160399999999,0.49330168000000002,0.49800116750000001,0.50215969199999999],"2048":[4.9774999999999997e-05,5.0052000000000001e-05,5.0597999999999999e-05,5.1576999999999998e-05,5.2067999999999997e-05,5.2130650000000002e-05,5.2181000000000001e-05,5.2274000000000001e-05,5.2753280000000001e-05,5.2779999999999999e-05,5.2799000000000001e-05,5.3021199999999993e-05,5.3911974683544303e-05,5.3954920000000002e-05,5.435543e-05,5.4535902439024393e-05,5.4748009999999999e-05,5.5129e-05,5.6066609999999997e-05,5.616914e-05],"14336":[0.00036767199999999988,0.000377451,0.00038121300000000015,0.00038123000000000003,0.00038128000000000001,0.00038249099999999999,0.000388654,0.00039008100000000002,0.00039088300000000002,0.00039548650000000002,0.00039922999999999998,0.00040127930434782607,0.00040169899999999999,0.00040248000000000004,0.0004045107916666667,0.00040499000000000004,0.0004062315652173914,0.00041930300000000005,0.00042126460869565212,0.00042509091304347832],"448":[9.0270000000000001e-06,9.075809523809525e-06,9.1356799999999999e-06,9.1379999999999996e-06,9.1598552631578939e-06,9.2607500000000011e-06,9.277429999999999e-06,9.30229e-06,9.3368199999999998e-06,9.4723200000000005e-06,9.4976599999999995e-06,9.5821600000000001e-06,9.6129999999999993e-06,9.7691700000000009e-06,9.8167000000000004e-06,9.9355399999999994e-06,1.0084740000000001e-05,1.0228945945945946e-05,1.0383969999999999e-05,1.0558090000000001e-05],"5505024":[1.5762147230000001,1.5918788959999999,1.5934400660000001,1.614157198,1.6165227120000001,1.6166080795,1.616735443,1.6250720805000001,1.6502298870000001,1.667303405,1.671860219,1.6782479335,1.69054565,1.6978594519999999,1.7076372100000001,1.7186596835000001,1.7200570694999999,1.7244352525,1.7462873495,1.819636523],"544":[1.1613571428571428e-05,1.1684440000000001e-05,1.1835648936170212e-05,1.184699e-05,1.1920749999999999e-05,1.192332e-05,1.2041610000000001e-05,1.205264e-05,1.2094899999999998e-05,1.2108570000000001e-05,1.216113e-05,1.237925e-05,1.243681e-05,1.252634e-05,1.2608593023255814e-05,1.27824e-05,1.2854780000000001e-05,1.289193e-05,1.3315e-05,1.374621e-05],"221184":[0.01966207,0.020341456000000001,0.020576769500000001,0.020885825,0.021106205500000006,0.021585788000000002,0.021796428,0.0220583115,0.022112057499999987,0.022226317000000002,0.022291188999999999,0.022361391500000001,0.0225590635,0.023508177000000009,0.024444791,0.025240326,0.026144247000000009,0.028680145000000001,0.029991475,0.030578134999999989],"90112":[0.0057371460000000003,0.0058181090000000001,0.0058297410000000011,0.0058359699999999976,0.0058518680000000014,0.0058813470000000003,0.0059596809999999979,0.0060372080000000014,0.0061985639999999976,0.0062418129999999997,0.0062735760000000003,0.0062976250000000029,0.006359614999999999,0.006421144000000001,0.0064455430000000006,0.0064591539999999999,0.006464376,0.0064978030000000016,0.0065107429999999977,0.0065117359999999989],"640":[1.411e-05,1.46157e-05,1.474253e-05,1.475359375e-05,1.4761469999999999e-05,1.478137e-05,1.4832770000000001e-05,1.5029839999999999e-05,1.5128839999999999e-05,1.5129119999999999e-05,1.5274080000000002e-05,1.552106e-05,1.55306e-05,1.5637030000000002e-05,1.5713409999999998e-05,1.5736666666666665e-05,1.5739070000000001e-05,1.6476619999999999e-05,1.694e-05,1.7102959999999999e-05],"12800":[0.00040094000000000013,0.00040238599999999997,0.00040429300000000001,0.00040463800000000002,0.00040542900000000001,0.00040888441666666659,0.00040949599999999997,0.00041033200000000023,0.0004139800000000001,0.00041688808695652165,0.00041862413636363662,0.00041970627272727278,0.00042051595652173909,0.00042356409090909072,0.00042923800000000003,0.00043505568181818178,0.000438047,0.00043861000000000003,0.00044449500000000015,0.00044696480952380958],"262144":[0.025962436999999998,0.026530702499999996,0.026638532499999999,0.026927395999999999,0.02693442599999999,0.027647074000000011,0.027865182999999995,0.029120258,0.03014951300000001,0.030238810500000001,0.03048575450000001,0.030550675999999999,0.030720832,0.030942697000000002,0.031011637999999998,0.031590780999999998,0.031916712,0.032904627999999991,0.033521662000000001,0.035484082],"589824":[0.11441974150000001,0.114947545,0.115940058,0.119947451,0.1205243285,0.1223050435,0.1226003175,0.12634885200000001,0.12697497499999999,0.12968703049999999,0.13092768099999999,0.13305486799999999,0.133208039,0.13499170499999999,0.1350150775,0.13720209249999998,0.138764467,0.138773124,0.139394878,0.14111795050000001],"884736":[0.19878910150000001,0.19970633400000001,0.20002839800000005,0.20126564299999999,0.20256973650000001,0.20638066799999999,0.207294072,0.2113050605,0.21137745200000002,0.21253387500000001,0.21451138350000001,0.22683958999999998,0.23129527,0.23265269200000005,0.23318726100000001,0.23409854200000002,0.23507727049999999,0.23743299550000002,0.23946877650000001,0.23972986800000001],"6144":[0.00017574849999999997,0.00018010199999999999,0.00018045600000000001,0.00018104033333333331,0.00018435899999999999,0.00018764299999999998,0.00018800000000000002,0.000188529,0.000188658,0.00018940499999999999,0.00018964199999999998,0.000190273,0.00019081185714285714,0.00019177900000000002,0.00019241899999999999,0.000194964,0.00019533212765957447,0.00019646366666666663,0.00020842000000000001,0.00021796599999999991],"1088":[2.4284500000000001e-05,2.4911089999999999e-05,2.491702e-05,2.5026999999999999e-05,2.5338e-05,2.5523500000000001e-05,2.55389e-05,2.5733540540540539e-05,2.5812379999999999e-05,2.6274999999999998e-05,2.6579809999999996e-05,2.6901899999999997e-05,2.6956034482758622e-05,2.6975589999999999e-05,2.7118999999999999e-05,2.7469000000000001e-05,2.8164e-05,2.8296000000000001e-05,2.981943e-05,2.9980599999999999e-05],"576":[1.270707e-05,1.276104e-05,1.28374e-05,1.284045e-05,1.2853100000000001e-05,1.2898049999999999e-05,1.2905700000000001e-05,1.296114e-05,1.301985e-05,1.3026400000000001e-05,1.3089209302325583e-05,1.3107880000000001e-05,1.316616e-05,1.3491790000000001e-05,1.3643500000000001e-05,1.36469e-05,1.3866950000000001e-05,1.417494e-05,1.4550990000000001e-05,1.5578040000000002e-05],"160":[3.2008900000000003e-06,3.2373999999999997e-06,3.2451099999999999e-06,3.2472e-06,3.2587799999999999e-06,3.26162e-06,3.2927299999999998e-06,3.2954285714285714e-06,3.3027083333333335e-06,3.3134800000000004e-06,3.3242299999999998e-06,3.3917300000000001e-06,3.4080200000000004e-06,3.41465e-06,3.4513000000000003e-06,3.4769999999999999e-06,3.4884400000000002e-06,3.4917200000000001e-06,3.5291800000000003e-06,3.5833399999999999e-06],"672":[1.5243619047619048e-05,1.5451589999999999e-05,1.5520390000000001e-05,1.5520999999999999e-05,1.5665469999999999e-05,1.5766939999999999e-05,1.5809929999999998e-05,1.5819189999999999e-05,1.5995200000000002e-05,1.6117739999999999e-05,1.611867e-05,1.6133659999999998e-05,1.6261666666666667e-05,1.6546499999999998e-05,1.6699182795698924e-05,1.67158e-05,1.6761879999999998e-05,1.7231639999999999e-05,1.780611e-05,1.837912e-05],"8912896":[2.6650623329999998,2.6855310829999999,2.7305699539999999,2.7450544319999999,2.7489595974999999,2.7530253395000002,2.753436217,2.7573696664999998,2.7671722545000002,2.7786089679999999,2.7837585869999999,2.7850607620000001,2.7933069530000001,2.8285196925,2.8315548399999999,2.8436802600000002,2.8448307394999999,2.8487978040000002,2.8745032310000003,2.8823721299999998],"100":[1.7976099999999998e-06,1.7982199999999999e-06,1.8219100000000001e-06,1.8243099999999999e-06,1.8358400000000001e-06,1.8399e-06,1.8412499999999999e-06,1.8456000000000002e-06,1.84669e-06,1.8527100000000001e-06,1.86553e-06,1.8812599999999998e-06,1.8950400000000001e-06,1.92645e-06,1.9380299999999999e-06,1.9411299999999999e-06,1.9425800000000001e-06,1.9467700000000002e-06,1.95066e-06,1.9581399999999998e-06],"507904":[0.092467942999999997,0.093830914000000015,0.095038919999999971,0.095155233499999992,0.095324001999999977,0.099871513999999967,0.10002804999999999,0.10153136299999999,0.102188574,0.103460355,0.10425765200000001,0.10589691900000001,0.10853354749999999,0.1088839665,0.109141931,0.110211514,0.11061478900000001,0.11132220100000001,0.11308696999999999,0.1197693515],"3840":[9.7559999999999994e-05,9.8613749999999998e-05,9.8782499999999998e-05,0.00010111798947368418,0.00010134450000000005,0.00010165099999999998,0.000102279,0.000103299,0.00010338394680851066,0.00010355849999999999,0.00010390826315789474,0.00010395702105263157,0.000103973,0.000104527,0.000104765,0.00010492632941176469,0.00010594932258064515,0.000115392,0.000115611,0.000116631],"192":[4.0177200000000002e-06,4.0290099999999997e-06,4.0437099999999998e-06,4.0561500000000001e-06,4.0641300000000002e-06,4.0722000000000006e-06,4.0867399999999996e-06,4.0869120879120877e-06,4.0891999999999997e-06,4.0953200000000001e-06,4.1203600000000001e-06,4.1212699999999994e-06,4.15902e-06,4.1883500000000003e-06,4.2703809523809524e-06,4.29129e-06,4.2936599999999998e-06,4.3615300000000001e-06,4.3720599999999998e-06,4.3928100000000004e-06],"376832":[0.053866585000000002,0.055920628999999999,0.05596110750000001,0.0562458495,0.056503697000000019,0.056862090999999983,0.058132124,0.058830705999999976,0.06059778200000001,0.061209509999999988,0.06165022849999998,0.061799417000000023,0.062241226000000004,0.062438076999999981,0.062546183000000047,0.064552208,0.064760386000000003,0.066445246999999957,0.073147636000000002,0.074739883499999993],"98304":[0.0065714010000000002,0.00663111,0.0068170130000000054,0.0070429810000000011,0.0071789980000000033,0.007237332,0.007362007000000002,0.0075378240000000029,0.007653946,0.0080524819999999997,0.0086571524999999976,0.0087475435000000101,0.0087691135,0.0088890245000000003,0.0090019280000000028,0.0091947374999999977,0.0094994504999999993,0.0096928600000000063,0.0099686259999999995,0.013010092000000001],"5376":[0.00014682549999999996,0.00014874700000000007,0.00014906999999999993,0.00014920499999999996,0.00015082499999999999,0.00015300400000000001,0.00015341619999999996,0.00015415620000000003,0.00015673399999999998,0.00015791500000000006,0.000158391,0.0001587842857142857,0.00015884700000000005,0.00015963299999999995,0.00016156426666666667,0.00016167265573770493,0.00016235700000000002,0.00016277126785714286,0.00016787598305084743,0.000182175],"94208":[0.006029001,0.0061406909999999993,0.0062086469999999986,0.0062673750000000004,0.006331092,0.0066890199999999986,0.0067458270000000002,0.0067858749999999968,0.0067984109999999999,0.006817834,0.0068239059999999959,0.006825762,0.0068540350000000014,0.0068634760000000003,0.0068837619999999973,0.0068980890000000013,0.0069667889999999967,0.0074682715,0.008826444999999997,0.012914005500000001],"81920":[0.0049146529999999997,0.0049985969999999987,0.005009365,0.0050200979999999989,0.0050805799999999995,0.0050834909999999999,0.0050884450000000013,0.0051189649999999996,0.0052088449999999984,0.0052562359999999992,0.0053301919999999984,0.0054889709999999996,0.0056341909999999985,0.0056653369999999969,0.0056672249999999997,0.0056878700000000003,0.0056897720000000001,0.0057138880000000003,0.0057245289999999982,0.0057641769999999997],"3407872":[0.90554470149999999,0.91212558799999999,0.91381487699999997,0.91685381600000004,0.93120468600000006,0.94592619300000003,0.94807936699999995,0.95646410500000001,0.96095134900000001,0.96688836700000003,0.96701251300000002,0.968556003,0.97208540200000004,0.97250076499999993,0.97741261449999994,0.98325901950000005,0.99062154599999996,0.99290797500000005,0.99415822750000005,1.0519342505],"104":[1.8574899999999999e-06,1.89783e-06,1.90092e-06,1.9195899999999999e-06,1.9274099999999998e-06,1.9305599999999999e-06,1.9309500000000001e-06,1.9419800000000001e-06,1.9695100000000002e-06,1.9713200000000002e-06,1.97257e-06,1.9818499999999999e-06,2.0080500000000002e-06,2.0099199999999997e-06,2.0287199999999999e-06,2.0304999999999999e-06,2.0331799999999997e-06,2.04011e-06,2.0704799999999998e-06,2.0778400000000001e-06],"122880":[0.0077227830000000022,0.0078692100000000015,0.007930866,0.0079901639999999993,0.0080309229999999988,0.0080441439999999996,0.008058959000000001,0.008070968000000003,0.008151396,0.0082117900000000001,0.0083000090000000006,0.0085808110000000007,0.0086332619999999992,0.0086666260000000002,0.0088221200000000444,0.0089639969999999961,0.0090387289999999971,0.0092012180000000006,0.0092024849999999998,0.0095039779999999997],"200":[3.7770700000000002e-06,3.8008300000000001e-06,3.8118300000000001e-06,3.8315000000000005e-06,3.8350499999999998e-06,3.8372399999999997e-06,3.8448400000000003e-06,3.8456900000000004e-06,3.8532499999999999e-06,3.8690000000000006e-06,3.8817399999999999e-06,3.9651100000000002e-06,3.9953300000000001e-06,3.9985299999999995e-06,4.0101410256410252e-06,4.0338999999999996e-06,4.1493700000000001e-06,4.1542199999999997e-06,4.2202400000000001e-06,4.4159399999999998e-06],"163840":[0.011473975500000004,0.011767579,0.011896756,0.0119834765,0.012017778,0.012108995500000001,0.012163721000000001,0.012206198500000003,0.012235929500000001,0.012661506999999999,0.012804586,0.012943241499999999,0.0130768125,0.013150374500000001,0.0131860565,0.013272963,0.0133732205,0.013687105500000001,0.013973283,0.0143755155],"4063232":[1.0842743109999999,1.095005499,1.1138155059999999,1.1165035409999999,1.116810581,1.1222080700000001,1.145806468,1.1470862930000001,1.150410213,1.154279957,1.1590123415,1.163444916,1.1678902879999999,1.193248471,1.203027112,1.2102883664999999,1.2202673225,1.2484452505000001,1.27590461,1.2968882719999999],"5767168":[1.6657332760000001,1.668069472,1.6857628390000001,1.68696998,1.689074832,1.710490512,1.7332034949999999,1.755245027,1.755298802,1.757360628,1.7597871920000001,1.761380065,1.7622116800000001,1.7899371529999999,1.7949431069999999,1.7954397639999999,1.795690877,1.806999808,1.8425511084999999,1.9604864420000001],"12582912":[3.9155414089999998,3.939430475,3.9572694510000002,3.975861069,4.0543297279999999,4.1044334505000002,4.1088090919999996,4.1192717710000002,4.1193207679999997,4.1207856134999998,4.1224689339999996,4.1332139615000001,4.1440924509999997,4.1508390469999998,4.2218971600000001,4.2295169530000001,4.2640121640000004,4.2873332130000001,4.3054219160000002,4.3174967579999999],"1600":[3.5998999999999999e-05,3.6192999999999997e-05,3.6875000000000002e-05,3.7132999999999998e-05,3.7141000000000002e-05,3.7498280701754388e-05,3.7571999999999999e-05,3.7581885245901639e-05,3.7604990000000003e-05,3.7609540000000002e-05,3.7639999999999999e-05,3.7798650000000004e-05,3.8864215686274504e-05,3.8974999999999999e-05,3.9097319999999997e-05,3.9245160000000006e-05,3.9368e-05,4.0031999999999999e-05,4.2406059999999998e-05,4.2893019999999999e-05],"136":[2.5720799999999998e-06,2.6368300000000003e-06,2.6427999999999999e-06,2.6608399999999998e-06,2.6933399999999999e-06,2.70939e-06,2.7102300000000003e-06,2.7162399999999998e-06,2.72823e-06,2.7296000000000001e-06,2.7383900000000001e-06,2.7393499999999999e-06,2.7890700000000001e-06,2.7897900000000001e-06,2.8028999999999999e-06,2.8203400000000002e-06,2.84304e-06,2.8533600000002488e-06,2.8623800000000002e-06,4.6541099999999999e-06],"232":[4.4138800000000005e-06,4.4234800000000004e-06,4.4377599999999998e-06,4.47537e-06,4.48404e-06,4.5177900000000003e-06,4.5297e-06,4.5395909090909092e-06,4.5432699999999998e-06,4.543571428571428e-06,4.5488499999999997e-06,4.5689200000000001e-06,4.5995200000000003e-06,4.6001400000000005e-06,4.62981e-06,4.6400200000000002e-06,4.64836e-06,4.7865400000000001e-06,4.8482499999999997e-06,5.0026199999999999e-06],"7077888":[2.0067092080000002,2.018349492,2.028141266,2.0298215759999998,2.034310149,2.0400818799999998,2.0702765484999999,2.0713530764999999,2.1025804835000002,2.1320415929999998,2.1495055729999999,2.1744070290000002,2.1828509165000001,2.199849553,2.2162290604999999,2.2247464020000001,2.2290709729999998,2.2316443955,2.2379955064999999,2.2471140634999998],"86016":[0.0052784939999999999,0.0052865890000000004,0.0053550810000000393,0.0054179050000000024,0.005437959,0.0054550730000000004,0.0054674650000000003,0.0054698569999999981,0.0054800559999999996,0.0055162130000000007,0.00552142,0.0055453890000000004,0.0055648399999999997,0.0058006170000000001,0.0058340299999999996,0.0058614889999999975,0.006004213999999999,0.0060656240000000004,0.0061346159999999999,0.0062197819999999984],"31744":[0.0013671458333333335,0.0013694318571428571,0.001371146,0.0013742209999999999,0.0013807601666666663,0.001383462,0.0013964450000000003,0.0014122145714285711,0.0014263953333333332,0.001462461,0.0014749383333333339,0.0014818339999999996,0.0014867968333333334,0.0015099436666666665,0.001512439333333337,0.001515817,0.0015237430000000001,0.0015491796666666669,0.0015738286,0.0016027431666666664],"168":[3.4171000000000003e-06,3.4632812499999999e-06,3.4956400000000003e-06,3.4969899999999999e-06,3.5106599999999999e-06,3.5505200000000003e-06,3.5622500000000001e-06,3.5657400000000003e-06,3.56903e-06,3.57908e-06,3.5950400000000001e-06,3.6423899999999998e-06,3.7060100000000005e-06,3.7189599999999996e-06,3.7209299999999998e-06,3.7336299999999997e-06,3.7602399999999998e-06,3.8766835443037978e-06,3.9500499999999996e-06,4.1229699999999998e-06],"622592":[0.124540321,0.12826083999999999,0.128428501,0.13176379299999999,0.13195252900000001,0.13312149100000001,0.13362579800000002,0.13554572049999999,0.13762392599999995,0.14346478300000001,0.144951949,0.14540290899999997,0.14549710099999999,0.14597724000000001,0.1466453835,0.14672113599999997,0.14760832600000001,0.15049664399999996,0.15356122950000001,0.16057955300000001],"108":[1.9658100000000002e-06,1.9746199999999998e-06,1.9752900000000001e-06,1.9783600000000001e-06,1.9871699999999998e-06,2.0211400000000003e-06,2.0222299999999999e-06,2.0419599999999998e-06,2.0470099999999999e-06,2.05226e-06,2.0544500000000003e-06,2.0553699999999999e-06,2.0815400000000001e-06,2.0856999999999998e-06,2.08798e-06,2.09849e-06,2.1004499999999999e-06,2.1008100000000001e-06,2.1230899999999998e-06,2.1429100000000001e-06],"327680":[0.040337720000000014,0.042295748500000015,0.043117193499999998,0.043152597000000001,0.043362419499999999,0.044288380500000002,0.045774311999999998,0.046096051999999998,0.046242760000000029,0.047007739999999999,0.047511814499999999,0.048217197999999996,0.0486674645,0.048738246500000013,0.048895007999999997,0.049012494000000004,0.05107266349999999,0.051517470999999995,0.053347284000000016,0.055996760999999985],"2176":[5.4039999999999998e-05,5.5874000000000001e-05,5.6224999999999998e-05,5.633875e-05,5.6889499999999998e-05,5.7071000000000003e-05,5.7290000000000002e-05,5.7544000000000003e-05,5.7578000000000003e-05,5.7634072463768111e-05,5.7985390000000002e-05,5.8015552238805967e-05,5.8351289999999997e-05,5.8916999999999999e-05,5.9132999999999998e-05,6.0255660000000004e-05,6.04345625e-05,6.1011999999999998e-05,6.105847999999999e-05,6.1941540000000006e-05],"3328":[7.8881000000000006e-05,8.0117999999999994e-05,8.0327999999999994e-05,8.1551000000000006e-05,8.3101812499999995e-05,8.3309941176470579e-05,8.3329000000000001e-05,8.3787714285714292e-05,8.3967777777777788e-05,8.5139949999999998e-05,8.5304739999999993e-05,8.5798500000000002e-05,8.6845499999999994e-05,8.7054833333333325e-05,8.7754860000000006e-05,8.7797499999999994e-05,8.8024776595744685e-05,8.8324454545454542e-05,9.0209428571428579e-05,9.0688999999999999e-05],"1":[1.2509999999999999e-08,1.2509999999999999e-08,1.2529999999999999e-08,1.26e-08,1.261e-08,1.261e-08,1.2640000000000001e-08,1.2640000000000001e-08,1.2660000000000001e-08,1.2669999999999999e-08,1.268e-08,1.269e-08,1.2709999999999999e-08,1.276e-08,1.324e-08,1.3289999999999999e-08,1.3329999999999999e-08,1.336e-08,1.3740000000000001e-08,1.3829999999999999e-08],"2":[2.2520000000000002e-08,2.2529999999999997e-08,2.2529999999999997e-08,2.255e-08,2.255e-08,2.2570000000000003e-08,2.2579999999999998e-08,2.2579999999999998e-08,2.2579999999999998e-08,2.2589999999999999e-08,2.2589999999999999e-08,2.2610000000000002e-08,2.2610000000000002e-08,2.2630000000000001e-08,2.3479999999999999e-08,2.3570000000000002e-08,2.36e-08,2.36e-08,2.4729999999999997e-08,2.4770000000000003e-08],"3":[5.0590000000000005e-08,5.0669999999999996e-08,5.0679999999999995e-08,5.072e-08,5.0759999999999999e-08,5.0799999999999998e-08,5.0820000000000001e-08,5.0820000000000001e-08,5.3079999999999996e-08,5.3239999999999999e-08,5.6559999999999998e-08,5.6580000000000001e-08,5.6670000000000004e-08,5.6679999999999995e-08,5.7329999999999998e-08,5.7359999999999999e-08,5.9230000000000002e-08,5.9950000000000004e-08,6.0199999999999996e-08,6.0199999999999996e-08],"4":[7.17e-08,7.2289999999999994e-08,7.2349999999999996e-08,7.2370000000000005e-08,7.2409999999999998e-08,7.2899999999999998e-08,7.3029999999999999e-08,7.3039999999999998e-08,7.3059999999999994e-08,7.3069999999999992e-08,7.3160000000000001e-08,7.3169999999999999e-08,7.3179999999999998e-08,7.3200000000000007e-08,7.3239999999999999e-08,7.328999999999999e-08,7.3449999999999999e-08,7.3629999999999992e-08,7.5769999999999996e-08,7.6590000000000013e-08],"7424":[0.000185563,0.000190428,0.0001918825,0.000196985,0.000197274,0.00019770700000000001,0.00019811775,0.00019947161224489796,0.000200111,0.00020032219999999994,0.000202726,0.000202893,0.000202914,0.000204596,0.00020561599999999991,0.00020851657446808509,0.00020864517021276603,0.00020885661702127662,0.0002104271818181817,0.000211394],"5":[8.7979999999999998e-08,8.8109999999999986e-08,8.8129999999999996e-08,8.8140000000000007e-08,8.8179999999999986e-08,8.8340000000000009e-08,8.8640000000000005e-08,8.8769999999999994e-08,8.8780000000000005e-08,8.8899999999999995e-08,8.8910000000000007e-08,8.9019999999999999e-08,9.2099999999999998e-08,9.2159999999999999e-08,9.2299999999999999e-08,9.2520000000000011e-08,9.3070000000000012e-08,9.3070000000000012e-08,9.7119999999999999e-08,9.7589999999999989e-08],"23552":[0.00080710000000000016,0.00081441109090909093,0.00082053699999999987,0.00082944500000000005,0.00084705259999999993,0.00085071454545454538,0.00085083900000000015,0.00086120600000000032,0.00086197109090909081,0.00086526759999999996,0.00086920466666666669,0.00088200399999999982,0.00088464399999999975,0.00088753270000000003,0.00089433500000000023,0.00089754220000000005,0.00089780199999999995,0.00090304899999999974,0.0009172083999999999,0.00091954999999999956],"6":[1.0390000000000001e-07,1.0391e-07,1.0457e-07,1.0461000000000001e-07,1.0489000000000001e-07,1.0953e-07,1.0962e-07,1.0981e-07,1.1022e-07,1.1024e-07,1.1026999999999999e-07,1.1134999999999999e-07,1.114e-07,1.1168999999999999e-07,1.1388e-07,1.15e-07,1.1536999999999999e-07,1.1655999999999999e-07,1.1724e-07,1.2099e-07],"61440":[0.0033958854999999988,0.0034595889999999999,0.0035541659999999997,0.0035578395000000012,0.003560747,0.0035963555,0.0036235334999999988,0.0037915140000000002,0.0038187504999999998,0.0038226455000000014,0.0038389245000000002,0.003883960000000001,0.0038932055,0.0039001334999999998,0.0039197099999999999,0.0039330344999999999,0.0039652544999999985,0.0039904170000000004,0.0039923670000000001,0.0040177549999999996],"491520":[0.089017573999999974,0.089382404999999956,0.090442881000000003,0.091022838999999994,0.091196932500000008,0.091897859000000026,0.092521640999999974,0.094556030999999999,0.09827681399999999,0.099740864000000026,0.100077546,0.10106931800000001,0.101653782,0.105758651,0.10629854399999999,0.107979856,0.108645164,0.1109069,0.110927108,0.11150726800000001],"77824":[0.0047589485000000004,0.0047746949999999998,0.0048191079999999999,0.00483118,0.0048370220000000016,0.004877485499999998,0.0048789129999999995,0.0048789760000000001,0.0049194949999999986,0.0049985470000000008,0.0050215860000000024,0.0050781710000000002,0.005163511,0.0051837559999999986,0.0051842190000000012,0.0051869560000000004,0.005288799000000002,0.0053236669999999989,0.0053786959999999997,0.0054400769999999989],"7":[1.2599999999999999e-07,1.2602000000000001e-07,1.2606999999999999e-07,1.2716999999999999e-07,1.2765999999999999e-07,1.2834e-07,1.3353000000000001e-07,1.3356000000000001e-07,1.3360000000000001e-07,1.3764999999999999e-07,1.3777999999999998e-07,1.3792999999999999e-07,1.3794999999999999e-07,1.3836e-07,1.3882e-07,1.3943e-07,1.3947000000000002e-07,1.4252000000000001e-07,1.4438e-07,1.4588999999999999e-07],"8":[1.4820000000000002e-07,1.483e-07,1.4841000000000002e-07,1.5001e-07,1.5011000000000001e-07,1.5349000000000001e-07,1.536e-07,1.5379999999999999e-07,1.5424999999999999e-07,1.5492000000000001e-07,1.5508999999999999e-07,1.5511000000000002e-07,1.5515000000000001e-07,1.5724999999999998e-07,1.5746999999999999e-07,1.5747999999999998e-07,1.607e-07,1.6072000000000003e-07,1.6942000000000002e-07,1.7787000000000002e-07],"208":[3.9417400000000001e-06,3.9705925925925927e-06,3.9772400000000001e-06,3.9917499999999995e-06,4.0106000000000002e-06,4.0134600000000004e-06,4.0363099999999996e-06,4.1016400000000001e-06,4.1199600000000001e-06,4.1930299999999999e-06,4.2105099999999996e-06,4.2177399999999997e-06,4.3528799999999997e-06,4.3973500000000003e-06,4.40978e-06,4.4133900000000001e-06,4.4571699999999999e-06,4.4890099999999996e-06,4.6239700000000006e-06,4.6512800000000001e-06],"9":[1.6388000000000001e-07,1.6404999999999999e-07,1.6408e-07,1.6588e-07,1.6591999999999999e-07,1.66e-07,1.6602e-07,1.6860000000000001e-07,1.6934999999999999e-07,1.6934999999999999e-07,1.7064000000000002e-07,1.709e-07,1.7104999999999999e-07,1.7169000000000002e-07,1.7373000000000001e-07,1.7651000000000001e-07,1.7662e-07,1.7863000000000001e-07,1.7980999999999999e-07,1.8208e-07],"73728":[0.0044526100000000001,0.0044992154999999997,0.0045015370000000016,0.0045371034999999987,0.0045387275000000017,0.0045463710000000004,0.0045916720000000006,0.0046495835000000003,0.0046837810000000014,0.0046899459999999987,0.0047937729999999977,0.0048316210000000004,0.0048447840000000004,0.004883727,0.0049125710000000001,0.0049906639999999997,0.0050236479999999986,0.005049558,0.0050730609999999976,0.0051325350000000014],"304":[6.1881900000000005e-06,6.2251600000000007e-06,6.241e-06,6.3413599999999997e-06,6.3992699999999995e-06,6.4640000000000003e-06,6.4796199999999995e-06,6.4826100000000003e-06,6.5145500000000002e-06,6.5171700000000005e-06,6.6314300000000001e-06,6.6731099999999995e-06,6.6821599999999999e-06,6.7263900000000007e-06,6.8451099999999998e-06,6.8885599999999993e-06,6.9852399999999999e-06,7.0679499999999998e-06,7.2269200000000008e-06,7.7780799999999996e-06],"400":[7.80453e-06,7.9819000000000006e-06,8.0298750000000008e-06,8.0637299999999991e-06,8.0703800000000001e-06,8.0977500000000005e-06,8.1731999999999999e-06,8.241379999999999e-06,8.3103181818181818e-06,8.3125600000000013e-06,8.3815400000000004e-06,8.4891300000000002e-06,8.6334999999999996e-06,8.700430000000001e-06,8.7176111111111116e-06,8.7469999999999994e-06,8.9003100000000008e-06,8.9815399999999997e-06,9.0903500000000001e-06,9.1902200000000002e-06],"1310720":[0.32317712399999998,0.32351156149999999,0.32495830449999996,0.32517391849999999,0.32531520150000004,0.33032777899999999,0.33604572999999999,0.33939564350000001,0.34216076900000003,0.34570175999999997,0.35894574749999997,0.36240277900000001,0.36373089749999998,0.36401559300000003,0.37151791849999999,0.37222792100000002,0.37282757899999996,0.374032957,0.37644612500000002,0.38713805649999999],"336":[7.1636024096385545e-06,7.1958899999999993e-06,7.2298800000000003e-06,7.2334099999999999e-06,7.2354199999999999e-06,7.2561200000000004e-06,7.2737999999999997e-06,7.3591100000000003e-06,7.4003600000000001e-06,7.4204900000000005e-06,7.4675399999999995e-06,7.5666899999999992e-06,7.5932999999999998e-06,7.6251300000000005e-06,7.654349999999999e-06,7.8985200000000004e-06,7.9058399999999992e-06,7.9759999999999995e-06,8.3350000000000007e-06,8.39139e-06],"3670016":[0.97937304449999996,0.98046545600000001,0.99666623450000003,1.0001698649999999,1.000329034,1.0246971574999999,1.0257561554999999,1.0393520955,1.0506569635,1.0518457875,1.057235012,1.064162174,1.0643299385,1.0748341729999999,1.0783885099999999,1.081252664,1.0947439034999999,1.1134042385,1.1547801145000001,1.2660369120000001],"6656":[0.00015993100000000001,0.00016121000000000001,0.00016614400000000001,0.000166696,0.00016877166666666668,0.00016955099999999994,0.0001695900862068965,0.00017136094545454542,0.00017215170909090909,0.00017251900000000007,0.00017370738596491226,0.00017451574999999999,0.00017452631481481486,0.00017694499999999994,0.0001776533636363637,0.000177954,0.00017839399999999999,0.00017855364705882351,0.00019544499999999998,0.00020089414285714285],"15360":[0.00039835199999999998,0.00040826800000000015,0.000411946,0.00041450699999999989,0.00041820599999999996,0.00041826300000000004,0.00042591499999999996,0.00042615895454545439,0.00042813599999999997,0.0004328772857142858,0.00043563209090909089,0.00043771499999999998,0.00043777399999999999,0.00043900599999999987,0.00044036981818181811,0.00044393599999999997,0.00044630485000000003,0.0004559722380952381,0.00046886900000000007,0.00053421099999999982],"432":[8.7269523809523802e-06,8.7700000000000007e-06,8.782333333333334e-06,8.8085799999999993e-06,8.8192000000000002e-06,8.8292000000000001e-06,8.8529800000000001e-06,8.9238499999999993e-06,8.938229999999999e-06,8.9655000000000008e-06,8.9735199999999994e-06,9.0255999999999988e-06,9.0277800000000005e-06,9.2295799999999991e-06,9.3037899999999999e-06,9.6124999999999999e-06,9.8922900000000011e-06,9.9240000000000002e-06,9.9933444444444437e-06,1.0382449999999999e-05],"950272":[0.214821277,0.21548230700000004,0.21867015000000001,0.219044348,0.21966099100000003,0.22078900800000001,0.222924438,0.223183293,0.22343808700000001,0.224059915,0.22542430799999999,0.23244371350000001,0.23417671800000001,0.23581498400000001,0.23600665399999998,0.23665148899999999,0.24184710700000001,0.24205961300000001,0.24714693400000001,0.26614359900000001],"655360":[0.13329708200000001,0.1367715015,0.13706499899999999,0.13828797100000001,0.13905000749999999,0.140798959,0.141228827,0.1416560315,0.14423613199999996,0.14797667649999999,0.15487564049999999,0.156010555,0.15645377900000002,0.15660807499999996,0.15667229599999999,0.15793036699999999,0.15821220950000001,0.165098089,0.1680069545,0.17507588900000001],"69632":[0.0040743065000000012,0.0041076059999999998,0.0041181429999999977,0.0042066450000000002,0.0042071519999999996,0.0042463275,0.0044010535,0.0045073515000000003,0.0045386970000000013,0.0045720355000000001,0.0045766360000000002,0.0045793505,0.0045983439999999999,0.0046187389999999984,0.0046478830000000002,0.0046881455000000001,0.0047280050000000004,0.0047782549999999977,0.0048108600000000001,0.0048228190000000008],"11264":[0.000327091,0.00033315500000000002,0.00033608999999999999,0.00033915099999999988,0.00033941,0.00034279599999999998,0.00034638859259259261,0.00034708571428571436,0.00034979199999999992,0.00034998500000000009,0.00035074164285714291,0.000357096,0.00035724575999999996,0.00035826848,0.00036097899999999988,0.00036185549999999996,0.00036579691999999984,0.0003674285,0.000368871,0.00039292599999999993],"2752512":[0.72740432100000008,0.73610978949999994,0.75222404199999993,0.75943278250000001,0.76692180450000003,0.77358016949999997,0.78067610199999993,0.78523480050000005,0.78905362050000005,0.78952164599999997,0.79067094399999993,0.79354815400000001,0.79749880200000001,0.81360049950000002,0.815069987,0.81695855299999998,0.82422817050000008,0.84145131200000001,0.84817854849999996,0.87540433500000003],"8126464":[2.3726619210000002,2.3798858799999998,2.3939597959999999,2.4459007549999998,2.4530457920000002,2.455478083,2.4768827099999999,2.481364385,2.5011391165000001,2.5088604124999998,2.5160986900000002,2.527520875,2.5317713849999999,2.532013273,2.5446031824999999,2.5560875395,2.5798119559999999,2.5847016780000001,2.6054311815000002,2.6084436855000002],"27648":[0.0010365650000000001,0.001042096,0.001052232,0.001062994,0.0010829961111111111,0.0010848218750000001,0.0010850464444444445,0.0010879488888888885,0.0010947638750000003,0.0010976913333333334,0.0011275092500000001,0.00113617275,0.0011527402500000003,0.0011590579999999999,0.0011625729999999996,0.001163493875,0.0011659583749999999,0.001179299375,0.0011804820000000001,0.001186089],"368":[7.96414e-06,8.0886599999999999e-06,8.2160000000000006e-06,8.2845500000000002e-06,8.3034500000000009e-06,8.3129700000000011e-06,8.3222999999999999e-06,8.381035714285714e-06,8.4622800000000006e-06,8.5019999999999992e-06,8.5033600000000012e-06,8.5616900000000007e-06,8.569559999999999e-06,8.6788000000000007e-06,8.7668500000000006e-06,8.8289200000000008e-06,8.9260700000000004e-06,8.9854500000000005e-06,9.0558000000000006e-06,9.4126000000000003e-06],"65536":[0.0038700885,0.0039141884999999987,0.0040115479999999993,0.004030955000000001,0.0042113565,0.0042434690000000014,0.0042921319999999997,0.0043371919999999984,0.0043735785000000001,0.0043925639999999998,0.0044758180000000003,0.0044997810000000004,0.0045023319999999986,0.0046445810000000001,0.0050273699999999998,0.0053851174999999998,0.0055488430000000012,0.0056445555000000014,0.0060792114999999999,0.0063684190000000002],"16252928":[4.8549995910000003,4.934799709,5.0459411840000001,5.0768775835,5.1006694179999998,5.1040941709999998,5.1770290020000003,5.1821408550000001,5.1840493070000004,5.1859104699999996,5.1861337245000003,5.1931207554999999,5.2019671729999999,5.2040795155000001,5.2065213110000004,5.2220981310000001,5.2925331824999997,5.3441928980000002,5.3846649800000002,5.5445991010000002],"464":[9.4588095238095245e-06,9.5929999999999995e-06,9.5953499999999995e-06,9.6160000000000008e-06,9.6920899999999992e-06,9.7664100000000009e-06,9.7701399999999993e-06,9.8522600000000011e-06,9.8576500000000004e-06,9.9606129032258078e-06,9.9616900000000008e-06,9.9944000000000004e-06,1.0050709999999999e-05,1.0113e-05,1.0151520000000001e-05,1.024184e-05,1.0385e-05,1.061768e-05,1.0662999999999999e-05,1.1172549999999999e-05],"1015808":[0.23285524699999999,0.234360349,0.23681453099999999,0.23701951600000004,0.24542584999999995,0.24689850099999999,0.24924937149999998,0.24947611049999999,0.252152349,0.25684821999999996,0.26163297149999998,0.26354829549999997,0.26472734349999999,0.27058268299999999,0.27173158600000002,0.27353036050000001,0.28058868250000002,0.282012015,0.28310779850000001,0.28513289200000003],"3072":[8.7180000000000002e-05,8.7306999999999996e-05,8.9908333333333341e-05,9.0200777777777781e-05,9.1057999999999995e-05,9.1640999999999999e-05,9.2002160000000002e-05,9.2064099999999998e-05,9.2304000000000003e-05,9.2667849999999991e-05,9.3506666666666677e-05,9.3638e-05,9.4238499999999996e-05,9.5014166666666669e-05,9.5050999999999995e-05,9.5645699999999991e-05,9.6128153846153846e-05,9.6712999999999994e-05,9.8172999999999997e-05,9.825303092783505e-05],"110592":[0.0066974140000000005,0.0067384800000000007,0.0067885100000000002,0.0068844570000000053,0.0068926450000000002,0.0069327619999999968,0.0069631279999999973,0.0069714600000000031,0.0070564430000000008,0.0072153730000000024,0.0074777160000000006,0.0075384629999999996,0.0075696290000000031,0.007628386,0.0077000850000000006,0.0078547979999999996,0.0078738359999999986,0.007956309,0.0079976349999999995,0.0080878819999999994],"237568":[0.022249788,0.022640489999999999,0.023018437499999989,0.02309861500000001,0.024002956999999998,0.024673808999999998,0.025412227999999992,0.025584828,0.025667577,0.026209957999999995,0.026732120000000005,0.026859361500000001,0.027500301999999987,0.027513140000000002,0.0276837765,0.027751439999999999,0.028922282000000011,0.030657021,0.030680558000000007,0.033664495000000003],"278528":[0.02926378349999998,0.02952484700000001,0.030888109,0.031041317000000002,0.031287750499999989,0.0315476705,0.0319033435,0.032467227000000001,0.033416295000000006,0.03395836599999999,0.034018396499999985,0.034768818999999999,0.034993960999999997,0.035344063999999994,0.035358054999999999,0.035531912499999999,0.035850107999999992,0.037628497000000004,0.038137126,0.038754292999999981],"496":[1.036561e-05,1.0461470000000001e-05,1.0477620000000001e-05,1.0485999999999999e-05,1.0493333333333332e-05,1.0510666666666667e-05,1.057953e-05,1.0583e-05,1.0826239999999999e-05,1.0834720000000001e-05,1.084964e-05,1.086555e-05,1.089161e-05,1.0999729999999999e-05,1.1138420000000001e-05,1.131223e-05,1.171572e-05,1.1821069999999999e-05,1.2004999999999999e-05,1.2125829999999999e-05],"13107200":[4.0676672030000001,4.112733682,4.2044724340000004,4.241895489,4.2864397030000001,4.3231668030000003,4.3271934529999996,4.3317980660000002,4.3484950580000001,4.3552460909999997,4.3709577309999998,4.3969431524999996,4.408867774,4.4337892019999998,4.4350135140000004,4.4570263849999998,4.4645001310000003,4.5342934269999997,4.5533665509999999,4.5755394530000002],"9961472":[3.0288342954999998,3.0295683525000001,3.0680156379999999,3.0751627830000001,3.0776899960000001,3.085344004,3.1061561210000002,3.1236931170000002,3.1487515909999999,3.1673212275,3.1795343009999999,3.1797783819999998,3.1934587080000001,3.1944396510000002,3.2095193860000002,3.2192707729999999,3.2805935740000001,3.2942451949999998,3.317933408,3.3896604925],"5888":[0.00016552900000000003,0.000169016,0.00017050300000000007,0.0001769712857142857,0.0001771387857142857,0.00017803099999999999,0.00017911199999999999,0.0001792365,0.0001805266415094339,0.000180719,0.00018094500000000001,0.00018101799999999994,0.000182442,0.00018252900000000001,0.00018409642307692302,0.00018497017307692309,0.00018506047916666662,0.00018749437500000001,0.00018788309615384613,0.00018853073999999998],"11010048":[3.3655622379999999,3.3769996359999999,3.3963594289999999,3.4237842600000001,3.4337215605,3.4689232690000003,3.489327528,3.5163812129999998,3.518286743,3.5305277180000001,3.5517202559999999,3.5569280879999998,3.5606479224999998,3.5719216569999999,3.5768272620000001,3.5773187200000001,3.577373766,3.5776869625000001,3.6109838559999998,3.7145358824999999],"1920":[4.6783000000000003e-05,4.6860999999999997e-05,4.6999999999999997e-05,4.7119000000000001e-05,4.7126000000000002e-05,4.7790999999999997e-05,4.7795610000000001e-05,4.8139000000000001e-05,4.8258489999999998e-05,4.8263389999999995e-05,4.8299459999999998e-05,4.8439999999999997e-05,4.8536440000000001e-05,4.8634000000000002e-05,4.8652000000000001e-05,4.8656479166666668e-05,4.8734360000000003e-05,4.9291789999999994e-05,5.0132019999999995e-05,5.3374000000000001e-05],"2490368":[0.65480095100000002,0.657305213,0.65996671200000001,0.66235074799999993,0.66565382650000005,0.66879787599999996,0.68710370600000004,0.68711668250000002,0.69151448100000001,0.69578874999999996,0.70037732600000002,0.70592123299999998,0.71022474000000002,0.71315687799999994,0.71347464599999999,0.72228249649999998,0.72403533149999999,0.73449338499999994,0.73812864150000002,0.74016141400000002],"19456":[0.0005846446874999998,0.00059300200000000003,0.00059543293749999985,0.00059656981250000003,0.0005982619999999998,0.00059964799999999983,0.00061597399999999982,0.00061766200000000027,0.00062132393333333338,0.00062333600000000027,0.00062344600000000016,0.00062472299999999999,0.00062856999999999984,0.00063372571428571447,0.00063981646666666655,0.00064385400000000034,0.00064713399999999973,0.00064937714285714292,0.00065035113333333327,0.00066666921428571422],"57344":[0.0031420783333333327,0.0032220833333333329,0.0032227336666666656,0.0032352666666666668,0.0032623370000000006,0.0034444180000000012,0.0035283315000000002,0.0035417359999999989,0.0035449879999999989,0.003576643,0.003578501,0.003587875999999999,0.0035959895000000006,0.003610299,0.003679575,0.0036874454999999999,0.0037132824999999993,0.0037209629999999999,0.0037338790000000003,0.0037426865],"1179648":[0.28279883299999997,0.28721617100000002,0.28730670699999999,0.28787676849999999,0.29054136250000001,0.29518487400000004,0.29587210549999998,0.30922153549999998,0.30995193199999999,0.31306945400000002,0.315413997,0.31713475700000004,0.31789806200000004,0.32108513,0.32140201400000001,0.32197431700000001,0.32636186099999998,0.32841092150000001,0.344696746,0.34513996749999998],"4718592":[1.303098616,1.3102098595,1.3340629509999999,1.3360886920000001,1.3502325035,1.352882922,1.3659998209999999,1.3741229660000001,1.376298145,1.389847566,1.390751595,1.412791076,1.4203982369999999,1.421461461,1.4231843420000001,1.4415696124999999,1.452119385,1.4584187074999999,1.4864609740000001,1.486810398],"360448":[0.051253864500000003,0.051872221500000003,0.0519154135,0.053271906000000001,0.05424567349999998,0.054399765999999981,0.055744467999999991,0.056482005999999974,0.057012916999999996,0.057686873,0.058336898999999998,0.058781693499999996,0.05890843400000001,0.059506680999999985,0.061204933000000003,0.063976792000000005,0.064480102000000011,0.064784002499999965,0.065390978000000002,0.067524917000000004],"1572864":[0.40455246700000003,0.40516587900000001,0.40622233900000004,0.40850669449999999,0.415083009,0.41840782999999998,0.42032939499999999,0.422097887,0.42605643999999998,0.42620098150000002,0.42820343599999999,0.43370382699999999,0.43731304500000001,0.43895686,0.43912435800000005,0.44792106300000001,0.45048608000000001,0.454732303,0.471364862,0.47415183299999997],"53248":[0.0028168759999999998,0.0028724136666666662,0.0028909669999999999,0.0029028576666666672,0.002914194000000001,0.0029184890000000007,0.0029207840000000001,0.0029233659999999993,0.0029446780000000001,0.0031092849999999998,0.0031826706666666662,0.0032207100000000008,0.0032370126666666672,0.003242857,0.003250164333333333,0.0032614204999999994,0.0032662299999999993,0.0032753315,0.0033172229999999998,0.0033517544999999995],"3456":[8.2268000000000006e-05,8.2758999999999998e-05,8.3771999999999997e-05,8.5112999999999996e-05,8.5180999999999996e-05,8.5946999999999996e-05,8.6533000000000007e-05,8.6787310000000002e-05,8.6965545454545455e-05,8.8782000000000005e-05,8.9180666666666665e-05,8.927611111111112e-05,8.948658762886598e-05,9.0275530000000009e-05,9.0912571428571426e-05,9.1648000000000001e-05,9.1896750000000001e-05,9.2043749999999998e-05,9.2753428571428574e-05,9.4889031914893626e-05],"40960":[0.0020530132500000001,0.0020750217499999998,0.0020933885,0.0020955997500000005,0.0020971634999999997,0.002100008,0.0021150542500000002,0.0021567720000000008,0.0021614302499999992,0.0021709945,0.0021810892500000005,0.002218865,0.0022351545000000002,0.0022405437499999998,0.0022445545000000008,0.0022619129999999991,0.0022782534999999998,0.0023004117499999992,0.0023024040000000001,0.0023483937500000003],"4608":[0.000120834,0.000121871,0.000123063,0.00012367000000000001,0.00012414700000000004,0.000124678,0.0001251364,0.00012817200000000005,0.00012910148000000004,0.0001296146,0.00012968100000000001,0.00013096671052631581,0.00013144099999999999,0.00013233,0.00013298431944444442,0.00013438374193548383,0.00013441490410958905,0.00013478638356164387,0.00013516900000000003,0.00014586210294117649],"13824":[0.00036238000000000015,0.00036259600000000002,0.000363159,0.00036651133333333329,0.00036816400000000009,0.0003684230000000001,0.0003704999999999999,0.00037193700000000003,0.0003724505599999999,0.00037313636000000001,0.00037650200000000002,0.0003794209999999999,0.0003810496923076923,0.00038529468181818188,0.00038589458333333326,0.00038591025000000003,0.00038691600000000001,0.00038771400000000005,0.00039023399999999999,0.00039442444000000007],"819200":[0.18204205500000001,0.18444848999999999,0.18472841500000001,0.186080727,0.18803204600000001,0.19269287899999998,0.19307091400000001,0.194653771,0.19543421399999999,0.19653843100000001,0.19733504099999999,0.197640172,0.19921164099999999,0.206844264,0.20895113400000001,0.21010946899999999,0.21495343700000002,0.21514343899999999,0.21966052250000001,0.21972161749999999],"983040":[0.22179443200000001,0.222437628,0.227618285,0.23074613299999999,0.23292575500000001,0.23324204000000001,0.23391770499999998,0.23462409799999995,0.235169568,0.2357014815,0.25388483750000002,0.25681458600000001,0.25984570400000001,0.26380195900000003,0.26522799699999999,0.26565291400000002,0.266056719,0.2683017285,0.26989741899999997,0.27507696650000002],"8704":[0.00023473300000000007,0.00023614799999999999,0.00023830099999999995,0.00024032400000000001,0.00024042833333333342,0.0002469366842105263,0.00024704341025641035,0.00024843,0.0002488420000000001,0.000251184,0.00025189234210526315,0.00025238700000000002,0.0002532590000000002,0.00025566147368421047,0.000258724,0.00025891839473684208,0.00025981889189189187,0.00026070105714285719,0.0002620869189189189,0.00026255499999999998],"120":[2.2464300000000002e-06,2.25411e-06,2.2650599999999999e-06,2.2735100000000002e-06,2.27479e-06,2.29598e-06,2.31022e-06,2.3115199999999999e-06,2.3251800000000001e-06,2.3260799999999999e-06,2.3339899999999997e-06,2.3550900000000003e-06,2.36941e-06,2.3713399999999999e-06,2.3903300000000002e-06,2.39195e-06,2.41059e-06,2.4230899999999999e-06,2.5199499999999999e-06,2.7717200000000002e-06],"1024":[2.2179272727272727e-05,2.2233666666666667e-05,2.2540000000000001e-05,2.2984039999999998e-05,2.3426999999999998e-05,2.3588199999999999e-05,2.3618e-05,2.3649333333333334e-05,2.3790499999999999e-05,2.4249749999999999e-05,2.4656760000000001e-05,2.467033333333333e-05,2.4793440000000002e-05,2.4848999999999999e-05,2.4887269999999999e-05,2.5371959999999998e-05,2.6369000000000001e-05,2.6610539999999998e-05,2.6889999999999998e-05,2.8024399999999999e-05],"49152":[0.0027326675,0.002737195,0.0027389460000000012,0.0027758519999999988,0.0027864256666666671,0.0028068859999999993,0.0028094753333333341,0.0028132776666666671,0.002823652666666667,0.0028938370000000002,0.0029229156666666666,0.0029462200000000011,0.0029768913333333329,0.0029822993333333335,0.0030109833333333328,0.0030324056666666665,0.0030472646666666668,0.0030546590000000004,0.0030777580000000008,0.0030945506666666669],"524288":[0.097168881999999998,0.097790470000000004,0.098329695499999994,0.098444776000000039,0.099660103000000042,0.101585261,0.103645296,0.10752133,0.10767505500000001,0.11193903400000001,0.113415406,0.113983995,0.115291186,0.115601893,0.11590703949999998,0.11830179600000001,0.119747307,0.121871005,0.123409267,0.13742709950000001],"45056":[0.0023435299999999999,0.00238670375,0.0023889095,0.0023933642499999993,0.0024153937500000005,0.0024499209999999999,0.002455306,0.0024588672499999999,0.0025065616666666672,0.0025145133333333335,0.0025620793333333324,0.0025639633333333334,0.0025690733333333334,0.0025695130000000016,0.0025815386666666663,0.0026109623333333332,0.0026509896666666666,0.0026600043333333324,0.0026714456666666665,0.0027019526666666673],"229376":[0.020682341999999999,0.021542663,0.023251548,0.023432413999999957,0.023451638,0.023615532500000001,0.023918877999999998,0.024326010000000009,0.024706740499999998,0.025313479500000007,0.02573983199999999,0.0258155365,0.025827116000000001,0.026082489,0.026108136000000004,0.026679769000000002,0.027422244000000002,0.027869771499999994,0.029720378999999998,0.035396792000000024],"2688":[7.1775999999999999e-05,7.2076000000000006e-05,7.3269999999999995e-05,7.3728999999999998e-05,7.3959000000000001e-05,7.4547000000000003e-05,7.4586680000000001e-05,7.5455000000000002e-05,7.56921e-05,7.5842999999999999e-05,7.5894214285714283e-05,7.6283000000000001e-05,7.6619000000000006e-05,7.731208e-05,7.7496000000000005e-05,7.8113409090909086e-05,7.8830052631578948e-05,7.8959289999999994e-05,7.9092100000000001e-05,8.1288684210526315e-05],"152":[3.0036400000000002e-06,3.0051299999999998e-06,3.0266700000000002e-06,3.0389900000000002e-06,3.0559800000000003e-06,3.0591499999999998e-06,3.0607699999999996e-06,3.0757e-06,3.09882e-06,3.1031199999999997e-06,3.1042800000000004e-06,3.1318600000000002e-06,3.1351399999999997e-06,3.1719400000000003e-06,3.1941400000000003e-06,3.2131044776119405e-06,3.23887e-06,3.25668e-06,3.3834499999999998e-06,3.4011999999999997e-06],"5120":[0.00014248,0.00014431371428571429,0.000144745,0.00014505525,0.00014548099999999996,0.00014553866666666668,0.000146675,0.000146921,0.00014718000000000001,0.00014803866666666666,0.00014916199999999999,0.00014950935483870969,0.00014978799999999996,0.0001505980169491525,0.000152418,0.00015317129999999995,0.00015387199999999999,0.000156009,0.00015612299999999996,0.00015772736065573773],"1507328":[0.38776594800000003,0.39178964500000002,0.392230943,0.39461073000000002,0.39465245049999997,0.39942927099999997,0.40829961199999998,0.41050352200000001,0.41050465599999997,0.41085681600000001,0.41153781550000001,0.41839212199999998,0.4200563075,0.42199264199999997,0.42542366399999998,0.42555427000000001,0.44137204400000002,0.44482940400000004,0.44932544949999997,0.45173097800000001],"1216":[2.832e-05,2.8736185185185187e-05,2.8948000000000001e-05,2.9028999999999999e-05,2.9065829999999997e-05,2.9949000000000001e-05,3.0314000000000001e-05,3.0672e-05,3.08354e-05,3.095e-05,3.1601309999999999e-05,3.1641379999999997e-05,3.1755111111111113e-05,3.1948e-05,3.2331333333333333e-05,3.2867999999999998e-05,3.3793e-05,3.4561000000000003e-05,3.460522e-05,3.5013135802469135e-05],"1966080":[0.49175036999999999,0.49851505000000002,0.50160558500000008,0.50424253100000005,0.50520740399999997,0.50530671999999999,0.513081275,0.51411408700000005,0.51798319749999999,0.51861373099999997,0.51876258600000003,0.5320903615,0.53311848100000003,0.53376277500000002,0.53764735249999995,0.53852625200000004,0.54882563899999992,0.54930956850000001,0.55653032899999999,0.58474227000000001],"1900544":[0.47427918949999998,0.47664580099999998,0.480777862,0.48541783550000001,0.497166041,0.500741255,0.51590007149999995,0.51634162100000003,0.51706064100000004,0.52248822900000003,0.52288626199999999,0.52690947750000006,0.52959334300000005,0.53143709949999995,0.53396774550000004,0.53843639899999995,0.54036933200000004,0.54238105049999996,0.54804860700000002,0.54958501800000004],"184":[3.7917499999999997e-06,3.8162e-06,3.8227299999999994e-06,3.89075e-06,3.9090400000000004e-06,3.9105999999999995e-06,3.9142999999999999e-06,3.9300399999999999e-06,3.9591300000000003e-06,3.9715500000000001e-06,3.9763999999999997e-06,4.0287299999999996e-06,4.0365500000000003e-06,4.0366700000000003e-06,4.0510900000000002e-06,4.0922800000000001e-06,4.1122307692307694e-06,4.2307699999999998e-06,4.3124800000000001e-06,4.4841599999999999e-06],"7936":[0.00019860400000000007,0.00020207000000000002,0.00020611499999999999,0.00021008379999999999,0.00021114200000000002,0.00021218963636363632,0.00021554404444444454,0.00021583568888888885,0.000217166,0.0002187364,0.00022012299999999994,0.00022065099999999993,0.00022265365116279069,0.00022346068292682921,0.00022391676744186055,0.00022412550000000002,0.00022515799999999991,0.00022608619512195119,0.00023245299999999992,0.00024396159999999999],"3801088":[1.0249268540000001,1.025724855,1.0290334480000001,1.0332844299999999,1.0404689869999999,1.0514179985000001,1.0768535240000001,1.0788217120000001,1.0926035755000001,1.106682538,1.108020448,1.11340683,1.1159855055000001,1.1185904565,1.120635348,1.1240994120000001,1.1297428460000001,1.1333106159999999,1.1402941065000001,1.1541104959999999],"6815744":[1.8959357370000001,1.9536032560000001,1.9628684620000001,1.9861848440000001,1.9969083860000001,2.0064916655,2.0111248575,2.0229180040000001,2.0385000404999998,2.0460485104999999,2.0772249614999998,2.0820631060000001,2.085934483,2.0907116055000001,2.0930876525,2.099186891,2.100153921,2.106069873,2.124148505,2.1759868734999999],"124":[2.3559500000000003e-06,2.3563800000000003e-06,2.3582599999999997e-06,2.3754900000000001e-06,2.38302e-06,2.3961300000000002e-06,2.4028799999999998e-06,2.4264600000000001e-06,2.4416599999999996e-06,2.4500599999999998e-06,2.4596900000000001e-06,2.4677899999999996e-06,2.4725099999999999e-06,2.4814800000000002e-06,2.4897699999999999e-06,2.5054000000000002e-06,2.5745699999999999e-06,2.6014000000000002e-06,2.8628717948717948e-06,2.9070000000000003e-06],"102400":[0.006723779,0.006849474000000003,0.0069130529999999997,0.0069336179999999999,0.0069378459999999975,0.0070053590000000001,0.007028898000000003,0.0070322399999999978,0.0074523880000000025,0.0075007730000000005,0.0075264080000000035,0.0075353009999999995,0.0075777610000000006,0.0076745090000000004,0.007719292,0.0077210380000000021,0.0077670029999999998,0.0077684220000000023,0.0077749480000000011,0.0078244169999999967],"311296":[0.036598056000000004,0.040124375000000004,0.040432290499999989,0.040760160000000004,0.041172591000000001,0.041844812000000002,0.042188598000000001,0.042567235999999994,0.043851662,0.043962885999999986,0.044057368,0.044393713000000001,0.0444026675,0.0449018625,0.045044986500000009,0.04520845200000001,0.045861161999999997,0.046249562000000001,0.0481435495,0.049104824000000012],"1408":[3.4997999999999999e-05,3.6332499999999998e-05,3.66855e-05,3.6905e-05,3.695759322033898e-05,3.7383322033898304e-05,3.7480710000000003e-05,3.7571999999999999e-05,3.7577999999999998e-05,3.7754199999999998e-05,3.7806389830508474e-05,3.7933299999999998e-05,3.799852e-05,3.89325e-05,3.9335190000000002e-05,3.9367459999999996e-05,4.0725450000000005e-05,4.0887418604651163e-05,4.11482e-05,4.283404e-05],"393216":[0.059675577,0.060871728,0.062439983999999962,0.063719918999999972,0.063876059000000013,0.06437068700000001,0.065476273999999973,0.066142225000000027,0.06627941499999998,0.067035602,0.067141965500000025,0.067718828999999967,0.067778319999999975,0.068420190500000019,0.068455773999999997,0.069112067999999999,0.069463292999999982,0.069933157499999968,0.077234042000000003,0.081258701500000002],"4352":[0.000111731,0.000116024,0.00011656500000000001,0.000117422,0.00011877275000000006,0.000119017,0.000119413,0.000119990125,0.00012012161842105266,0.00012027285714285714,0.00012059525,0.000120674,0.00012077999999999999,0.00012085,0.00012129122222222219,0.0001213223291139241,0.00012187499999999999,0.00012300984810126585,0.00012531,0.00013448600000000001],"6553600":[1.945796402,1.9802199890000001,2.0523468419999999,2.0610848960000001,2.069493816,2.0699710835,2.0701186360000001,2.0772103149999999,2.100031456,2.1012403750000002,2.129438699,2.1300925364999999,2.1409186120000001,2.143950464,2.1457275254999999,2.1547539960000002,2.1580835459999999,2.1938054619999998,2.2244684115000002,2.2310709955000001],"20480":[0.00063387399999999998,0.00064000192307692313,0.00064574800000000013,0.00066367742857142834,0.00066725949999999986,0.00066912500000000001,0.00067867878571428568,0.00068091400000000002,0.00068189335714285721,0.00068417499999999976,0.00068860307692307705,0.00068866099999999992,0.00068972900000000004,0.0006906677142857143,0.00069194199999999997,0.00069630171428571432,0.00071366992307692306,0.00071703216666666706,0.000722359,0.000732757],"608":[1.3652779999999999e-05,1.3688330000000001e-05,1.3710459999999999e-05,1.3789570000000001e-05,1.3819660000000001e-05,1.3861999999999999e-05,1.394307e-05,1.3952229999999999e-05,1.4028160000000001e-05,1.412663e-05,1.413102e-05,1.4448069999999999e-05,1.4514160000000001e-05,1.4751470000000001e-05,1.4773000000000001e-05,1.5118760000000001e-05,1.5336350000000001e-05,1.5439510000000001e-05,1.5478219999999998e-05,1.5763190000000001e-05],"2228224":[0.57320167700000002,0.57933970499999998,0.58302120099999999,0.59362972899999999,0.59378020899999995,0.60854339999999996,0.61094597400000006,0.62107670199999998,0.63474080399999999,0.639625569,0.64409477800000003,0.64472433900000004,0.64889753100000003,0.64928532500000002,0.65338423800000001,0.65358641750000002,0.65845851150000001,0.65920235400000005,0.65925957349999997,0.67136116700000004],"36864":[0.0017558832,0.0017926964,0.0018023494000000001,0.0018030142,0.0018077919999999986,0.001807857,0.0018122706000000001,0.0018298258,0.0018310668,0.0018746693999999995,0.0018994675999999999,0.0019262885999999999,0.0019312510000000001,0.0019320163999999994,0.0019353892000000001,0.0019445755999999998,0.0019691330000000001,0.0019708999999999998,0.001971502,0.0019733659999999998],"704":[1.6328e-05,1.6569899999999999e-05,1.6606e-05,1.666402e-05,1.6787780000000001e-05,1.6817970000000002e-05,1.6854579999999998e-05,1.686441935483871e-05,1.690841e-05,1.7039671428571427e-05,1.7102899999999998e-05,1.7187999999999999e-05,1.7238999999999999e-05,1.7258039999999999e-05,1.7270410000000001e-05,1.7278999999999998e-05,1.7977789999999999e-05,1.8169049999999998e-05,1.8567220000000002e-05,1.964603e-05],"720896":[0.153019987,0.153606988,0.154423544,0.1547469095,0.15552615050000002,0.15686161000000001,0.16409679899999999,0.167395869,0.169321259,0.16964006100000001,0.17637385,0.17681134050000002,0.17732489300000001,0.178830036,0.17928346049999999,0.17974042100000001,0.18016842,0.18076434000000002,0.18289385699999999,0.18957220799999999],"800":[1.6574000000000001e-05,1.658683870967742e-05,1.6694999999999999e-05,1.6787759999999999e-05,1.6821e-05,1.7046360655737706e-05,1.7174420000000001e-05,1.7186199999999998e-05,1.7234140000000001e-05,1.7380999999999998e-05,1.7392289999999999e-05,1.7435190000000001e-05,1.7736069999999999e-05,1.7804000000000001e-05,1.7868610000000001e-05,1.809632e-05,1.8221000000000001e-05,1.9432e-05,1.9584000000000001e-05,2.0216320000000003e-05],"2621440":[0.69368648999999993,0.69712087099999998,0.69904690150000004,0.70087792250000003,0.70622751499999992,0.71593942600000005,0.72115704699999994,0.72163007699999993,0.72552454099999997,0.73839502999999995,0.74806793449999998,0.74906151450000003,0.75012256099999997,0.75089488599999998,0.75180330799999995,0.754832736,0.76373308149999997,0.77144647599999994,0.77404884549999997,0.79364239300000006],"425984":[0.072453577000000019,0.072813041500000023,0.073366319999999999,0.073971541000000002,0.07402127,0.07511933400000001,0.07615487700000001,0.076170177500000005,0.078273387999999999,0.079486672999999994,0.079851146000000053,0.081422474999999994,0.082404498500000006,0.082809765999999979,0.084340665999999995,0.084417340000000007,0.084881104000000013,0.086108745,0.088112048000000026,0.089087934000000008],"32768":[0.0014243649999999999,0.0014453656666666664,0.00145418,0.0014854773333333334,0.001489616,0.0014942123333333331,0.0015098499999999996,0.001521323,0.0015222720000000001,0.0015435,0.0015709936666666667,0.0015733400000000001,0.0015748328333333333,0.001579481,0.0015942525000000006,0.0015960733333333331,0.0016137223333333333,0.001618875400000008,0.0016209029999999995,0.0016255986666666663],"12058624":[3.8353585364999998,3.8572351454999998,3.860690001,3.878740627,3.8790257385000002,3.879452541,3.8848322925000001,3.9118282149999999,3.9177140334999998,3.9377707580000001,3.9589127569999998,3.9780179124999999,3.9948964939999998,4.0191678665000001,4.0292747950000001,4.03545891,4.0487903694999998,4.0995304074999996,4.1450144179999997,4.1845306640000004],"128":[2.4415400000000001e-06,2.4655499999999996e-06,2.4854700000000002e-06,2.51782e-06,2.5195399999999996e-06,2.5214900000000001e-06,2.5277999999999998e-06,2.5381100000000002e-06,2.5402299999999998e-06,2.5676900000000001e-06,2.57046e-06,2.5828999999999999e-06,2.5950199999999998e-06,2.59708e-06,2.6110199999999998e-06,2.62798e-06,2.6318599999999999e-06,2.6501700000000001e-06,2.69411e-06,2.7432799999999999e-06],"180224":[0.013997626499999999,0.014103830000000001,0.014356874,0.0144268595,0.014610399,0.014660783,0.014924058,0.014972777,0.015104173,0.015142736,0.015162203499999999,0.015270446,0.015362823500000006,0.015441808500000005,0.015453107000000013,0.015530938999999999,0.015545666,0.015549241,0.016019189999999999,0.016665620000000003],"224":[4.1838700000000003e-06,4.2561499999999999e-06,4.3045500000000001e-06,4.3192500000000002e-06,4.3444700000000001e-06,4.3566099999999998e-06,4.3624599999999999e-06,4.3673800000000002e-06,4.3930000000000001e-06,4.3948599999999998e-06,4.4532399999999994e-06,4.4645999999999996e-06,4.4663199999999996e-06,4.4793999999999998e-06,4.4930199999999997e-06,4.5299999999999998e-06,4.5891200000000004e-06,4.5981000000000001e-06,4.8219400000000006e-06,5.0749299999999999e-06],"736":[1.71795e-05,1.725137e-05,1.7282470000000001e-05,1.7685140000000001e-05,1.7908105263157896e-05,1.7927039999999999e-05,1.800871e-05,1.8047130000000001e-05,1.8077450000000001e-05,1.8268679999999999e-05,1.8284e-05,1.8406279999999999e-05,1.8666269999999999e-05,1.8772940000000001e-05,1.8889444444444445e-05,1.9088779999999998e-05,1.9186099999999999e-05,1.9297139999999998e-05,2.0306729729729729e-05,2.0945e-05],"320":[6.59629e-06,6.6478900000000005e-06,6.7220933333333327e-06,6.7746666666666671e-06,6.8017900000000008e-06,6.8077299999999996e-06,6.8183600000000004e-06,6.8616200000000002e-06,6.8700909090909091e-06,6.8742200000000007e-06,6.8765799999999998e-06,6.9039199999999998e-06,6.9142400000000009e-06,6.9955699999999992e-06,7.0740099999999994e-06,7.1025899999999997e-06,7.4160299999999994e-06,7.7293400000000001e-06,7.8167999999999994e-06,8.1327000000000009e-06],"557056":[0.10587897,0.109118457,0.110031804,0.112124899,0.11238803250000001,0.11352459099999999,0.11559372700000003,0.116379108,0.116843537,0.11971884899999996,0.12280669,0.12424302299999999,0.12470949899999995,0.12650492899999999,0.12911111850000001,0.12919197299999999,0.12963875599999999,0.131519839,0.13317702999999997,0.13397788649999998],"832":[1.7669709999999999e-05,1.7669999999999999e-05,1.7674990000000002e-05,1.7734219999999998e-05,1.7802999999999999e-05,1.7858000000000001e-05,1.7861999999999999e-05,1.8136999999999999e-05,1.8259809999999998e-05,1.831757e-05,1.835021e-05,1.8419490000000001e-05,1.8467330000000001e-05,1.8467440000000002e-05,1.856825e-05,1.8701429999999999e-05,1.9011520000000001e-05,1.910078e-05,2.0211560000000002e-05,2.0401e-05],"9437184":[2.8013703169999999,2.8321894949999997,2.8514630059999999,2.852836693,2.8814444359999998,2.9061775980000002,2.9116036830000001,2.9121313660000001,2.9619469614999998,2.9685324839999998,2.9813323110000001,2.9821928535,2.999012306,3.008822442,3.0227214170000001,3.0245965670000001,3.0477338120000002,3.0742620399999998,3.0760132599999999,3.0915069179999999],"3584":[8.8157000000000003e-05,8.9071000000000002e-05,9.0766999999999993e-05,9.0808000000000002e-05,9.1542500000000007e-05,9.1995000000000003e-05,9.3214999999999994e-05,9.3432719999999992e-05,9.3487999999999997e-05,9.3819000000000004e-05,9.4219869999999993e-05,9.4892529999999995e-05,9.5464368421052637e-05,9.7684749999999993e-05,9.7977000000000001e-05,9.7989919999999996e-05,9.8556999999999998e-05,9.8812000000000002e-05,0.000100683,0.00010647729032258065],"6291456":[1.896319619,1.9188956370000001,1.928895748,1.9329077610000001,1.9388629639999999,1.942401585,1.9431260345000001,1.9431506940000001,1.9494631665,1.9502343875000001,1.952113285,1.9655404329999999,1.9661236479999999,1.9685147510000001,1.9703040359999999,2.0116871949999999,2.0761236350000001,2.0888570509999997,2.1134659650000001,2.1168198089999999],"256":[4.9922599999999994e-06,5.0458199999999997e-06,5.0959099999999996e-06,5.0979200000000005e-06,5.1259999999999997e-06,5.1464000000000004e-06,5.1854999999999997e-06,5.19427e-06,5.2114776119402982e-06,5.2977799999999998e-06,5.3075699999999994e-06,5.3130699999999996e-06,5.4196500000000007e-06,5.4200099999999996e-06,5.4879999999999998e-06,5.5094900000000005e-06,5.5144600000000001e-06,5.8176899999999995e-06,5.9699399999999996e-06,6.16232e-06],"15204352":[4.7213368180000002,4.7371433175000002,4.7406215354999999,4.749813541,4.7704338694999997,4.7897543220000003,4.8191599275000003,4.833596225,4.8464404979999998,4.8560535070000004,4.8621459790000001,4.8632366549999997,4.8722221499999998,4.8807182999999998,4.8837093310000004,4.9322061680000004,4.9374327725000002,4.9404762345000002,4.968719664,4.9719430889999998],"28672":[0.001135908625,0.0011454697499999999,0.0011600510000000001,0.0011710746249999999,0.0011776990000000004,0.0011826788750000001,0.0011875535,0.0011892670000000001,0.0012212869999999995,0.0012298579999999999,0.0012586839999999999,0.0012685184285714287,0.0012790077142857143,0.0012838277142857141,0.0012900372857142855,0.0012932798571428572,0.001299962,0.0013070811428571426,0.0013303289999999999,0.0014308732000000001],"768":[1.8321833333333331e-05,1.8796060000000002e-05,1.8982820000000002e-05,1.9220289999999999e-05,1.9232590000000002e-05,1.925643e-05,1.937926e-05,1.9418129999999998e-05,1.9457800000000002e-05,1.9752219999999998e-05,1.984834e-05,2.0025440000000003e-05,2.0265130000000002e-05,2.063755e-05,2.0913000000000001e-05,2.0938789999999999e-05,2.128151e-05,2.1909e-05,2.1993102564102564e-05,2.228639e-05],"212992":[0.017408742999999994,0.018873750000000002,0.019460909999999998,0.019679639500000002,0.019883647000000004,0.020143666500000011,0.020492590000000001,0.020634121999999998,0.020719444,0.021241689999999987,0.021691057500000006,0.021880163000000001,0.021888190000000002,0.021893096500000007,0.022619111000000004,0.023488742999999999,0.024641875000000001,0.026444487999999999,0.027661048000000001,0.038328127000000003],"864":[1.7681814814814815e-05,1.7856e-05,1.8213999999999999e-05,1.8260000000000001e-05,1.833336e-05,1.8379259999999999e-05,1.8583000000000001e-05,1.8762625000000001e-05,1.8828e-05,1.920432e-05,1.9313734693877553e-05,1.9340720000000001e-05,1.9340929999999998e-05,1.9596e-05,1.9658999999999999e-05,1.9667999999999999e-05,1.9894829999999997e-05,2.0396575342465753e-05,2.0441e-05,2.1559000000000001e-05],"352":[7.4766999999999999e-06,7.5099615384615391e-06,7.5625e-06,7.6151899999999997e-06,7.7495199999999989e-06,7.7810000000000005e-06,7.7925500000000005e-06,7.8261400000000006e-06,7.8647899999999989e-06,7.8744299999999991e-06,7.9487000000000007e-06,8.0515900000000003e-06,8.0857900000000007e-06,8.2639799999999994e-06,8.2877899999999998e-06,8.3381666666666658e-06,8.3474500000000009e-06,8.3591400000000004e-06,8.7065099999999994e-06,9.003280000000001e-06],"253952":[0.024551614500000006,0.024867201000000002,0.025200858,0.025286853999999997,0.025548886,0.026961838999999998,0.026975663,0.027190531,0.027719992999999998,0.028425304500000009,0.028494815999999999,0.02933213099999999,0.0294308785,0.0294907765,0.029875407,0.030057631000000022,0.030791686000000002,0.032187179000000017,0.033425650000000008,0.036285958],"960":[2.1154000000000001e-05,2.1208000000000001e-05,2.1224030000000001e-05,2.1236089999999997e-05,2.137e-05,2.1687000000000001e-05,2.2176470000000001e-05,2.2312610000000001e-05,2.2353999999999996e-05,2.2410999999999999e-05,2.2430409999999999e-05,2.2568580645161291e-05,2.2873199999999996e-05,2.2894889999999999e-05,2.2957999999999999e-05,2.3091900000000002e-05,2.3591072164948454e-05,2.3672609999999998e-05,2.4202999999999998e-05,2.463253e-05],"24576":[0.00084650899999999996,0.00086958809999999995,0.00087648781818181853,0.00089806459999999962,0.00090530679999999955,0.00091501800000000008,0.00091652569999999998,0.0009174831,0.00091920859999999969,0.00091933200000000035,0.0009345349999999999,0.00093815830000000024,0.00093827988888888869,0.00094460322222222231,0.000945132,0.00095144144444444438,0.00095839166666666681,0.00096973969999999997,0.00097066300000000008,0.00099968299999999991],"7680":[0.00019167700000000004,0.000191993,0.00019311799999999999,0.00020425400000000001,0.00020442760000000001,0.00020578991666666673,0.000206541,0.000207622,0.00020869875000000009,0.00020926499999999998,0.0002104245,0.000212664,0.00021293200000000004,0.00021417700000000002,0.00021420595555555547,0.00021471106666666662,0.000219060925,0.00022016111111111117,0.00022092999999999999,0.00022143099999999988],"294912":[0.033666552000000002,0.033692438999999998,0.035052799000000009,0.035577420999999998,0.035730101,0.036566157999999988,0.036971052500000004,0.037147567000000013,0.038570360999999997,0.038816118500000003,0.039846797999999996,0.039864607999999989,0.040339556999999998,0.041317317999999992,0.04210978700000001,0.042238852,0.042734956500000018,0.042937539999999996,0.0430172505,0.044152329999999997],"1048576":[0.23868938200000001,0.241972296,0.2452829195,0.246685404,0.246759118,0.24677457699999999,0.247172647,0.2518124055,0.252310704,0.25579861500000001,0.25582746899999997,0.25686748799999998,0.26503110099999999,0.27015701250000002,0.2771323275,0.28478466199999997,0.286186049,0.288383414,0.29151150149999999,0.30194459699999998],"10485760":[3.2096054779999998,3.2503428049999998,3.251407645,3.272176194,3.2806312950000001,3.2991133669999999,3.3186468054999998,3.346948147,3.3655063140000001,3.3693960779999999,3.3703073990000001,3.3895394345000001,3.3991506870000001,3.4004874350000001,3.4056349790000002,3.4112921505,3.4123135475000002,3.4182980450000002,3.4414820819999998,3.4656619004999998],"344064":[0.045850577500000003,0.047648999499999997,0.047788553499999997,0.048021452000000006,0.05062976650000002,0.050758139000000001,0.050946364500000008,0.052370444000000002,0.053336087500000004,0.053576082999999997,0.053682555999999992,0.054411440499999998,0.055854272999999996,0.055873040999999991,0.0560172455,0.056055969999999997,0.057300481,0.057874356500000015,0.060732662,0.062423082000000005],"288":[5.7765050505050502e-06,5.8498100000000002e-06,5.87067e-06,5.8773999999999998e-06,5.9649400000000005e-06,6.0317400000000005e-06,6.1719799999999998e-06,6.1819999999999994e-06,6.1879100000000004e-06,6.2132899999999996e-06,6.22113e-06,6.2477599999999995e-06,6.2614300000000003e-06,6.2706800000000002e-06,6.2956399999999997e-06,6.3932099999999999e-06,6.5298300000000001e-06,6.5451100000000001e-06,6.6521799999999999e-06,7.2106400000000003e-06],"1152":[2.6866e-05,2.698185e-05,2.6995000000000002e-05,2.7036e-05,2.7311079999999999e-05,2.757692307692308e-05,2.7639000000000001e-05,2.7732155172413792e-05,2.8216389999999999e-05,2.8649999999999998e-05,2.8723088235294121e-05,2.9297000000000001e-05,2.9390000000000002e-05,2.9477222222222221e-05,2.9721499999999997e-05,2.9725000000000001e-05,3.0560066666666666e-05,3.1869219999999998e-05,3.2057670000000001e-05,3.2568999999999999e-05],"384":[8.3238461538461527e-06,8.3924200000000009e-06,8.4609799999999994e-06,8.5445999999999995e-06,8.6433400000000002e-06,8.6868999999999998e-06,8.7019700000000003e-06,8.7454999999999995e-06,8.8170500000000006e-06,8.8556700000000002e-06,8.8886199999999996e-06,8.9924399999999999e-06,9.3161100000000012e-06,9.3523333333333336e-06,9.3589999999999997e-06,9.4367200000000003e-06,9.4660100000000012e-06,9.4947400000000002e-06,9.6630399999999999e-06,9.8619999999999998e-06],"2304":[5.8276999999999998e-05,5.8653999999999998e-05,5.9209999999999997e-05,5.9787000000000002e-05,6.0164999999999997e-05,6.0248999999999999e-05,6.0550000000000001e-05,6.1583999999999999e-05,6.1785101694915258e-05,6.2077690000000003e-05,6.2170660714285715e-05,6.2343999999999998e-05,6.2454090000000002e-05,6.3103999999999998e-05,6.3137000000000002e-05,6.3625591836734692e-05,6.4354230000000003e-05,6.5011999999999994e-05,6.5121069999999993e-05,6.608439e-05],"896":[1.9239999999999999e-05,1.927509e-05,1.9321179999999999e-05,1.9593269999999999e-05,1.9870780000000002e-05,2.0051969999999998e-05,2.0069990000000002e-05,2.0103892857142855e-05,2.0166110000000001e-05,2.0272379999999998e-05,2.033e-05,2.051239e-05,2.0514e-05,2.0601450000000002e-05,2.0679520000000002e-05,2.0790320000000001e-05,2.1098e-05,2.1138020000000001e-05,2.2274170000000002e-05,2.2783068965517242e-05],"480":[1.004e-05,1.0084390000000001e-05,1.009559e-05,1.0133699999999999e-05,1.0149870000000227e-05,1.018132e-05,1.024714e-05,1.0263790000000001e-05,1.034129e-05,1.036815e-05,1.038684e-05,1.0401919999999999e-05,1.069001e-05,1.0826020000000001e-05,1.0979340000000001e-05,1.12975e-05,1.1328149999999999e-05,1.1354e-05,1.1511200000000001e-05,1.1723180000000002e-05],"1441792":[0.36346959400000001,0.36693184999999995,0.368819326,0.37137042099999995,0.38187497199999998,0.38473978200000003,0.38684831200000003,0.38980895900000001,0.39130770500000001,0.3914295015,0.39456087750000002,0.39614728499999996,0.39892115150000002,0.41503520500000002,0.41828717800000004,0.41910890350000002,0.42300494300000002,0.42477152699999998,0.42670328499999999,0.42760870049999999],"992":[2.1364499999999998e-05,2.2161690000000001e-05,2.2324770000000001e-05,2.2544999999999998e-05,2.2691859999999999e-05,2.27641875e-05,2.2792249999999998e-05,2.3e-05,2.3145470000000002e-05,2.336392e-05,2.3400999999999998e-05,2.3435539999999999e-05,2.3470999999999999e-05,2.3568780000000002e-05,2.3654000000000001e-05,2.3682333333333332e-05,2.3732430000000002e-05,2.4190549999999998e-05,2.564486e-05,2.589967e-05],"3968":[0.00010173700000000001,0.000102421,0.00010292400000000003,0.00010299433333333333,0.00010331633333333335,0.000103501,0.00010402,0.00010508799999999999,0.00010521633333333332,0.00010630472043010753,0.000107094,0.00010724573333333336,0.00010746343820224716,0.00010800499999999999,0.000108276,0.000108417,0.00010854470786516852,0.000110367,0.00011064203370786516,0.000111531],"6400":[0.000187412,0.00019183900000000002,0.00019191500000000002,0.00019232549999999998,0.000192528,0.00019358100000000002,0.00019366399999999999,0.00019451400000000002,0.00019573542857142861,0.00019840299999999999,0.00019844,0.00020199000000000006,0.00020478299999999997,0.00020481000000000001,0.00020726099999999998,0.00020883128888888889,0.00020888100000000001,0.00020938800000000002,0.00021075399999999998,0.000229072],"1344":[3.3454999999999997e-05,3.4416210526315792e-05,3.4518499999999998e-05,3.4705000000000001e-05,3.5354909999999997e-05,3.536378e-05,3.5554679487179486e-05,3.5633000000000003e-05,3.5834000000000003e-05,3.5944469999999999e-05,3.6156589999999998e-05,3.6488739130434782e-05,3.6616499999999997e-05,3.6769634920634921e-05,3.7101590000000003e-05,3.7808999999999997e-05,3.7923000000000003e-05,3.8791280000000001e-05,3.8970000000000001e-05,3.91145e-05],"126976":[0.008125106,0.0081294699999999998,0.0081382340000000029,0.0082776019999999985,0.0083118759999999993,0.0083467220000000043,0.0083478259999999992,0.0086268549999999992,0.009019379000000001,0.009092366000000001,0.0093263809999999982,0.0093517180000000037,0.009381094000000003,0.0094362319999999993,0.009445228,0.0094793709999999951,0.0094832050000000032,0.010053566999999999,0.010425689,0.011804572499999999],"2883584":[0.77929066699999994,0.79093803200000001,0.79855177799999999,0.80008498000000006,0.80039335999999994,0.80124495200000001,0.80357128649999998,0.81633145750000002,0.81658613099999999,0.84041028299999998,0.84375106499999997,0.84926539999999995,0.84938984100000003,0.85429833199999994,0.85709993849999999,0.86000132100000004,0.8660429315,0.88117589750000003,0.89660737300000004,0.89883906099999999],"753664":[0.16273168399999999,0.1642372845,0.16637884,0.16659892849999999,0.169085182,0.16948680999999999,0.16956433700000001,0.171348321,0.17179823999999999,0.171839516,0.172814785,0.17516516400000001,0.18166347399999999,0.18773383499999999,0.192929561,0.19466524099999999,0.19605681250000001,0.19694780000000001,0.197278605,0.199584173],"16384":[0.00044133699999999998,0.00045633300000000001,0.00045771600000000021,0.00046143905000000003,0.00046394399999999999,0.00046767199999999987,0.00046880700000000001,0.00046891890476190475,0.00047220300000000003,0.00047298400000000019,0.000480357,0.00048074315789473711,0.00048675599999999992,0.00049073815000000016,0.0004971864736842105,0.0004983645294117647,0.00050018768421052615,0.00051214100000000003,0.00051584027777777782,0.00051685299999999995],"131072":[0.0083645969999999997,0.0085939099999999997,0.0086627000000000006,0.0086825380000000001,0.0087154330000000051,0.008718888999999997,0.0087368480000000037,0.008777254,0.0088657980000000046,0.0094733930000000001,0.0095706620000000006,0.0097357060000000002,0.0099135154999999992,0.0099165099999999999,0.010062445,0.010607515500000001,0.011026642999999999,0.0114659985,0.0117624785,0.013201776],"458752":[0.081222267000000029,0.082107507000000024,0.083097917999999993,0.084513963000000025,0.086287678999999992,0.086488509999999977,0.087121654999999992,0.088010523500000007,0.088472982499999978,0.089679030999999992,0.0909243,0.091872813000000025,0.092039214999999994,0.093557114000000038,0.093716294500000047,0.094614115999999998,0.095008811999999998,0.097923895999999983,0.10056148299999999,0.101971714],"172032":[0.012258493000000001,0.012674612,0.0127761405,0.012828981499999998,0.013721537000000001,0.013935592,0.014152228999999994,0.014331406499999999,0.014521167,0.014637426,0.014666900500000028,0.014740095,0.0147484035,0.014779748000000001,0.015265294,0.015558549,0.015696394999999995,0.015764439499999998,0.016916991499999999,0.018346368500000002],"12288":[0.00038080500000000001,0.00038082600000000002,0.00038242499999999998,0.00038697899999999991,0.00038919875000000004,0.00039355066666666664,0.0003948006666666667,0.00039687799999999998,0.00039723300000000004,0.000398429,0.00039957479166666655,0.00040227300000000003,0.00040255726086956526,0.00040463300000000016,0.00040510299999999997,0.000407384,0.00040831368181818193,0.00040879373913043482,0.00041492699999999983,0.00043289100000000003],"14680064":[4.4293397160000003,4.4389276310000003,4.4952344379999998,4.5287173449999996,4.5456315490000003,4.5467294034999997,4.5562717250000002,4.5655754460000004,4.5800474839999996,4.6018875369999996,4.6085274119999999,4.6396772400000001,4.6600740250000001,4.6662933965000004,4.6838068320000001,4.6975615524999998,4.7391757925000002,4.7402654904999997,4.7725065375,4.7979077735000004],"1536":[3.9804e-05,4.0305999999999997e-05,4.1038000000000002e-05,4.1068000000000001e-05,4.1308645161290322e-05,4.1914971428571426e-05,4.2510330000000007e-05,4.2823e-05,4.2886999999999998e-05,4.2912749999999997e-05,4.3275999999999997e-05,4.3535999999999998e-05,4.3783959999999997e-05,4.4302318181818184e-05,4.4473380000000005e-05,4.4576579999999995e-05,4.5283379999999999e-05,4.5909750000000002e-05,4.6764539999999999e-05,4.9213430000000001e-05],"25600":[0.00093982433333333307,0.00094119800000000008,0.00094122850000000007,0.00094336800000000031,0.00094804599999999981,0.00095255300000000008,0.00096365222222222192,0.00096603800000000001,0.00097090019999999976,0.00097257500000000015,0.0009894560000000001,0.001000433555555556,0.0010037330000000001,0.0010161371111111115,0.0010286728888888887,0.001030815,0.0010310773333333334,0.0010614069999999999,0.0010649502222222224,0.0010687660000000001],"1835008":[0.45885959399999998,0.45981969899999997,0.46528488600000001,0.46576828749999999,0.46629208099999997,0.46713655599999998,0.46852177800000006,0.46931978800000002,0.470384986,0.47938014350000002,0.48856722200000002,0.48950413599999998,0.49243108800000002,0.49942772300000005,0.50252872800000004,0.50397700349999996,0.50893161949999999,0.51747210499999996,0.52372521599999999,0.53568275499999995],"10752":[0.00030249999999999998,0.00030561199999999992,0.00031607500000000013,0.000316693,0.00031986217241379301,0.00032009300000000003,0.00032140241935483871,0.00032243900000000005,0.00032399253333333333,0.00032440999999999986,0.00032492473076923086,0.00032641035714285713,0.0003273947777777779,0.00032763300000000008,0.00033168937037037036,0.00033338389655172433,0.0003363380689655171,0.0003496286538461537,0.00034983900000000006,0.00035761199999999988],"21504":[0.00068134835714285719,0.00068316542857142846,0.00068368500000000028,0.000684438,0.00068833399999999997,0.00070910107692307692,0.00071322899999999979,0.0007183333333333333,0.00072312699999999995,0.00073298299999999999,0.00074066600000000007,0.00075064553846153836,0.00075565799999999976,0.00076522316666666668,0.0007759554166666666,0.00077700883333333326,0.00077828883333333325,0.00078733300000000009,0.00079556400000000002,0.00084331100000000023],"7602176":[2.2238050490000001,2.2536976025,2.2616116115000002,2.2670450839999998,2.2776126584999998,2.2800305910000001,2.287383207,2.3254320915000002,2.3281214960000001,2.3415901520000002,2.3461710689999999,2.347388966,2.3495093740000002,2.3586065920000001,2.3803359044999999,2.4032721475000001,2.420199346,2.4269988059999998,2.4380004500000001,2.4751367475000001],"5632":[0.00015631600000000004,0.000157935,0.00015832899999999999,0.00016140033333333334,0.00016204000000000004,0.00016354799999999999,0.00016447099999999999,0.000166775,0.000168519,0.00016864399999999997,0.00016928000000000001,0.00017030600000000001,0.00017067489090909083,0.000170996,0.00017178300000000001,0.00017193977192982455,0.00017279,0.00017306099999999999,0.0001788907592592593,0.00018466900000000002],"10":[1.7960000000000002e-07,1.7968e-07,1.7972999999999998e-07,1.7980999999999999e-07,1.8169999999999999e-07,1.8201e-07,1.8342000000000001e-07,1.8502e-07,1.8505999999999999e-07,1.8521e-07,1.8628e-07,1.8640999999999999e-07,1.8661999999999999e-07,1.867e-07,1.8691000000000002e-07,1.9012000000000001e-07,1.9168999999999999e-07,1.9355000000000001e-07,1.9455000000000001e-07,1.9922999999999999e-07],"3145728":[0.85568656949999999,0.88068372049999999,0.90971256150000002,0.92702366049999996,0.92816242000000004,0.92837654800000002,0.93869486000000002,0.94284166150000004,0.96286785450000001,0.96342195500000005,0.97091213399999998,0.97420539500000003,0.98197196600000003,0.98263784450000002,0.98449484799999998,0.98911166299999997,0.99100801900000002,0.99434235599999998,1.0032634380000001,1.007730373],"245760":[0.023339255999999992,0.023976327499999998,0.024383382999999998,0.024402203000000001,0.024916977999999996,0.025313955500000002,0.025642441499999995,0.026134091000000005,0.026347625,0.026357945000000004,0.0264576745,0.026825664500000002,0.0274599765,0.027485170499999996,0.027912223999999985,0.027951696000000026,0.028655996999999999,0.029315317,0.0298863555,0.031380222999999999],"1728":[3.9261999999999998e-05,3.9545999999999997e-05,3.9700000000000003e-05,4.0080999999999998e-05,4.0560263157894738e-05,4.0611000000000001e-05,4.1236999999999998e-05,4.1417500000000001e-05,4.1591999999999998e-05,4.1612033333333327e-05,4.1763878787878783e-05,4.1808310000000005e-05,4.1866000000000002e-05,4.1900594594594598e-05,4.2565880000000004e-05,4.2925e-05,4.3277535714285709e-05,4.3442979999999996e-05,4.3521333333333333e-05,4.492876e-05],"11":[2.0480999999999999e-07,2.0557999999999999e-07,2.0729e-07,2.075e-07,2.0914999999999999e-07,2.0942999999999999e-07,2.1721e-07,2.1736999999999999e-07,2.1764999999999999e-07,2.1781000000000002e-07,2.1803e-07,2.1847e-07,2.1861999999999998e-07,2.1885999999999999e-07,2.1911999999999999e-07,2.1946000000000001e-07,2.2764000000000002e-07,2.2764000000000002e-07,2.2883000000000002e-07,2.2924000000000001e-07],"1114112":[0.26652395750000002,0.26696503199999999,0.26840983750000003,0.27354372199999999,0.27560427900000001,0.278068702,0.28181888150000001,0.283025898,0.28986349249999999,0.29089105599999998,0.29477378599999998,0.2969000665,0.29795608900000004,0.30122834850000002,0.30242197199999998,0.30614293300000001,0.30663180449999999,0.30983270799999996,0.31610615799999997,0.32133481149999998],"12":[2.1457000000000002e-07,2.1663e-07,2.167e-07,2.1675000000000001e-07,2.1801999999999999e-07,2.1804000000000001e-07,2.181e-07,2.1831000000000003e-07,2.1838e-07,2.2275000000000001e-07,2.2656000000000001e-07,2.2664e-07,2.2685e-07,2.2735999999999999e-07,2.2815000000000001e-07,2.2821999999999999e-07,2.2823000000000003e-07,2.3095000000000001e-07,2.3104000000000001e-07,2.3272000000000001e-07],"7340032":[2.0877598769999999,2.1483609695000001,2.1561712879999999,2.1671592959999999,2.1698399290000001,2.1729599070000001,2.1841187070000001,2.2006993809999997,2.2020446565,2.2082530889999998,2.2165816999999999,2.225584231,2.2261348724999999,2.2275154129999999,2.2334117729999998,2.234168259,2.2534307165,2.2810371639999998,2.3170924959999999,2.3371784954999999],"7168":[0.000175797,0.00017689500000000007,0.000181903,0.00018216799999999997,0.000183893,0.00018850900000000006,0.00018962799999999995,0.00019141237499999998,0.00019340984313725491,0.00019373700000000001,0.00019388612,0.00019448474468085103,0.00019521634090909095,0.00019826894000000002,0.00019927810416666666,0.000200189,0.0002012946666666667,0.000212878,0.00021470145652173917,0.00021798599999999996],"13":[2.3027000000000001e-07,2.3243e-07,2.3264e-07,2.3288999999999999e-07,2.3365999999999999e-07,2.3365999999999999e-07,2.3399000000000002e-07,2.3419999999999999e-07,2.3455000000000002e-07,2.4331000000000003e-07,2.4359999999999998e-07,2.4462999999999999e-07,2.4485999999999998e-07,2.4498000000000001e-07,2.4513000000000003e-07,2.4782e-07,2.4881999999999997e-07,2.4890999999999997e-07,2.4901000000000003e-07,2.5664e-07],"6029312":[1.7613272980000001,1.819626706,1.823265168,1.840849011,1.8464735055000001,1.8536435820000001,1.8581396379999999,1.8642947190000001,1.8673924255000001,1.8963931565000001,1.8973268270000001,1.9038041859999999,1.9189095810000001,1.9324201455000001,1.9418712675000001,1.9486240399999999,1.952834814,1.963663366,1.9673789209999999,2.0055843659999999],"14":[2.4816999999999998e-07,2.5012000000000002e-07,2.5095000000000001e-07,2.5227999999999998e-07,2.5391000000000003e-07,2.5457999999999999e-07,2.5464000000000001e-07,2.5483000000000001e-07,2.5508999999999999e-07,2.5698000000000002e-07,2.5706e-07,2.5979999999999998e-07,2.5986e-07,2.6126e-07,2.6511999999999998e-07,2.6529999999999997e-07,2.6903000000000002e-07,2.7237e-07,2.7374000000000001e-07,2.7578e-07],"3200":[9.0620999999999999e-05,9.3654764705882365e-05,9.5239000000000001e-05,9.5642000000000003e-05,9.5667000000000004e-05,9.6189999999999999e-05,9.6229333333333337e-05,9.7434000000000003e-05,9.7624809523809517e-05,9.7905999999999994e-05,9.9557377551020418e-05,9.9638131313131305e-05,0.000101092,0.00010151461702127659,0.00010178753125,0.0001018715,0.000102031,0.00010281,0.000105623,0.00011155674418604655],"20":[3.5593000000000004e-07,3.5610000000000002e-07,3.5644999999999999e-07,3.5846e-07,3.7014e-07,3.7450999999999998e-07,3.7839999999999995e-07,3.8377999999999996e-07,3.8408000000000004e-07,3.8457999999999997e-07,3.8513000000000001e-07,3.8600000000000004e-07,3.8606999999999996e-07,3.8646999999999999e-07,3.8687999999999998e-07,3.8726000000000004e-07,3.9262999999999999e-07,3.9306e-07,3.9320000000000005e-07,3.9379999999999999e-07],"204800":[0.016440761500000001,0.016479980499999995,0.016597846499999999,0.016638101999999995,0.017061741999999987,0.017428032,0.017476151999999995,0.017658118,0.018052261999999999,0.018058153,0.018427860500000001,0.018465825000000002,0.018719309999999999,0.018730199499999985,0.019019804499999998,0.019155870499999998,0.0195899675,0.0196023255,0.019683396999999998,0.022994074999999999],"15":[2.6398999999999997e-07,2.6407000000000001e-07,2.6478000000000002e-07,2.6539000000000002e-07,2.7055e-07,2.7065e-07,2.7067999999999999e-07,2.7072999999999999e-07,2.7109999999999999e-07,2.7238000000000001e-07,2.7296000000000003e-07,2.7419e-07,2.7636999999999998e-07,2.7809999999999998e-07,2.8285000000000002e-07,2.8303000000000001e-07,2.8435000000000003e-07,2.8513999999999997e-07,2.9215000000000003e-07,2.9395000000000001e-07],"13312":[0.00032876950000000003,0.00033275699999999982,0.00034353399999999999,0.000345779,0.00034623400000000011,0.00034624100000000001,0.00034635500000000001,0.00035278000000000002,0.000352827,0.00035368499999999985,0.0003554819999999999,0.0003577290000000001,0.00036169699999999996,0.0003621632307692308,0.00036245,0.00036411700000000001,0.000365511,0.00036743499999999999,0.00037628750000000001,0.00037747699999999992],"4980736":[1.4021164699999999,1.402454911,1.4067879620000001,1.4118203995,1.428177789,1.4445550705000001,1.4487864525,1.4562455329999999,1.4675040720000001,1.4685011240000001,1.4713480919999999,1.4769273485000001,1.4778371049999999,1.485632565,1.5115519545,1.5137205725,1.521210017,1.541389957,1.5598829869999999,1.579378792],"118784":[0.0074366340000000001,0.0074888609999999994,0.0075897219999999975,0.0076092119999999997,0.0080607400000000003,0.0085798049999999994,0.0086585619999999999,0.0086611050000000005,0.0087365159999999963,0.0091595594999999957,0.0093630620000000001,0.010049249,0.010157476,0.010400849,0.010426035,0.011188385,0.011740987499999999,0.012185712499999998,0.013271719499999998,0.013590328],"51200":[0.002879132,0.0029200280000000012,0.0029236350000000013,0.0029775979999999997,0.0029812363333333331,0.002982384666666667,0.0030670050000000011,0.003123828999999999,0.0031528109999999984,0.0031831669999999998,0.0031835379999999996,0.0032105620000000001,0.003223252666666667,0.0032301816666666663,0.0032302349999999993,0.003244406,0.003247022,0.0032500899999999998,0.003283430999999999,0.0035223350000000001],"16":[2.8116999999999997e-07,2.9026000000000001e-07,2.9252999999999999e-07,2.9282e-07,2.9312999999999998e-07,2.9439999999999999e-07,2.9442999999999997e-07,2.9488999999999996e-07,2.981e-07,2.9818000000000004e-07,2.9887999999999999e-07,2.9998000000000002e-07,3.0029e-07,3.0121999999999999e-07,3.0559000000000003e-07,3.1215e-07,3.1451000000000003e-07,3.1727000000000003e-07,3.2524999999999998e-07,3.2827000000000001e-07],"21":[3.8336000000000001e-07,3.8412999999999999e-07,3.9094999999999999e-07,3.9957999999999998e-07,3.9969000000000005e-07,3.9993999999999997e-07,4.0116000000000003e-07,4.0128e-07,4.0168999999999999e-07,4.0251999999999998e-07,4.0970999999999998e-07,4.1006000000000001e-07,4.1248999999999996e-07,4.1418999999999998e-07,4.1595999999999997e-07,4.1702999999999997e-07,4.1874e-07,4.1888e-07,4.1986e-07,4.2407999999999997e-07],"917504":[0.20679640399999999,0.210657864,0.21219307100000001,0.21276573300000001,0.21282100600000001,0.21487503299999999,0.21995413050000001,0.223891269,0.22627562700000001,0.228246957,0.23447568099999999,0.23726941700000001,0.23888789399999999,0.24101491550000001,0.24213103899999999,0.24292217449999998,0.243651913,0.24413187949999998,0.24550869,0.24737001850000001],"22":[3.9890000000000001e-07,3.9895999999999997e-07,4.0809999999999996e-07,4.0848000000000002e-07,4.1117e-07,4.1387000000000004e-07,4.1560999999999995e-07,4.1746999999999999e-07,4.1758999999999997e-07,4.1761000000000004e-07,4.1804e-07,4.1823000000000001e-07,4.1884000000000001e-07,4.2528999999999997e-07,4.2712000000000003e-07,4.2925000000000001e-07,4.3039999999999999e-07,4.3266999999999997e-07,4.3560999999999997e-07,4.3986000000000002e-07],"4864":[0.00012962500000000005,0.000129791,0.00013111500000000001,0.00013154199999999995,0.00013522300000000007,0.00013605299999999999,0.00013772200000000001,0.000137761,0.000137866,0.00013832100000000001,0.00013843799999999992,0.00013985899999999999,0.00014100942857142858,0.00014199265671641792,0.0001424865,0.00014262500000000001,0.00014306100000000005,0.00014515482258064519,0.00014539699999999999,0.00014874466666666669],"17":[3.0209999999999999e-07,3.0431e-07,3.1145e-07,3.1235000000000001e-07,3.1287000000000002e-07,3.1593e-07,3.1699999999999999e-07,3.1847999999999998e-07,3.2668000000000001e-07,3.2728e-07,3.2988000000000004e-07,3.3056999999999997e-07,3.3221999999999999e-07,3.3229999999999998e-07,3.3255e-07,3.3365999999999998e-07,3.3886e-07,3.4471000000000002e-07,3.4583999999999998e-07,3.4777000000000005e-07],"14848":[0.000380388,0.00038671099999999992,0.00039227100000000003,0.00039437966666666674,0.000397802,0.00039890599999999998,0.00040148099999999997,0.00040163300000000004,0.0004133421739130435,0.00041535947826086984,0.00041691382608695642,0.00041907304347826087,0.00042040800000000004,0.0004246146363636364,0.00042537100000000002,0.00042696300000000015,0.00043760395238095226,0.00043786877272727263,0.00044902399999999996,0.00046323799999999982],"23":[4.1446000000000002e-07,4.2574000000000005e-07,4.2673999999999997e-07,4.2851000000000002e-07,4.3097e-07,4.3186e-07,4.3730999999999999e-07,4.3763000000000003e-07,4.3800000000000003e-07,4.4108999999999999e-07,4.4112000000000002e-07,4.4134000000000001e-07,4.4317999999999998e-07,4.4489000000000001e-07,4.4644999999999998e-07,4.5047999999999999e-07,4.5559000000000002e-07,4.5676000000000002e-07,4.5880000000000001e-07,4.6171999999999998e-07],"786432":[0.17010276699999999,0.17303834600000001,0.173132439,0.17884823999999999,0.184773889,0.18806039499999999,0.18911049799999999,0.1907247245,0.19258368149999999,0.1978919355,0.198894498,0.201232988,0.202062834,0.203935322,0.204854275,0.21009554999999999,0.210243032,0.21171722450000002,0.21460342900000001,0.22170744650000002],"18":[3.1495999999999996e-07,3.1775e-07,3.1782999999999998e-07,3.2322000000000001e-07,3.2740999999999999e-07,3.2839000000000004e-07,3.3234000000000002e-07,3.3253999999999999e-07,3.4395000000000001e-07,3.4622999999999994e-07,3.5182000000000004e-07,3.5268999999999996e-07,3.5284999999999999e-07,3.5412e-07,3.5521000000000002e-07,3.5564000000000003e-07,3.5855999999999995e-07,3.7122999999999997e-07,3.7203999999999999e-07,3.8726999999999995e-07],"1638400":[0.42389147799999999,0.42895028999999996,0.43715724049999999,0.43833259200000002,0.44438481000000002,0.44490946199999998,0.44726846799999997,0.45361424649999998,0.45509580999999999,0.45571461950000003,0.457770287,0.4614364165,0.46165187899999999,0.46338016500000001,0.46419730650000002,0.47417404600000002,0.487202996,0.4936484035,0.50662404000000005,0.5074382355],"7864320":[2.295845683,2.3154581479999998,2.3441218665000001,2.35595249,2.3620932049999999,2.3676510190000002,2.3745284120000001,2.3761299325,2.378829251,2.392333501,2.3943796910000001,2.3948404485000001,2.4085081239999999,2.4127278690000002,2.4285558219999999,2.4771552364999998,2.503428086,2.5228372569999999,2.524178075,2.5277553400000001],"24":[4.2116999999999995e-07,4.2410999999999995e-07,4.2531000000000004e-07,4.2544999999999999e-07,4.2934000000000001e-07,4.3072999999999999e-07,4.3149000000000001e-07,4.3373000000000001e-07,4.3510000000000002e-07,4.3649999999999997e-07,4.3872999999999996e-07,4.4052999999999999e-07,4.4065789473684207e-07,4.4261999999999998e-07,4.5457000000000003e-07,4.5865999999999995e-07,4.6242999999999999e-07,4.6332000000000005e-07,4.6393e-07,4.6455999999999997e-07],"14155776":[4.3891425310000001,4.3988081470000004,4.4093199759999999,4.4207537370000001,4.4239769935000002,4.4257142324999998,4.4343920959999998,4.4642894569999996,4.5094218415,4.5150081399999999,4.5205847754999997,4.5372627175,4.5389311624999999,4.5461346550000004,4.5728305569999996,4.5738651629999998,4.5741296980000001,4.5870547840000002,4.6215712130000002,4.6674861889999999],"19":[3.3611000000000001e-07,3.4218999999999997e-07,3.4598000000000003e-07,3.4771000000000003e-07,3.4968999999999995e-07,3.5095999999999996e-07,3.5109e-07,3.6346e-07,3.6668999999999996e-07,3.6836e-07,3.6888000000000006e-07,3.7040999999999999e-07,3.7043999999999997e-07,3.7061999999999997e-07,3.7070999999999996e-07,3.7768000000000003e-07,3.7821000000000005e-07,3.8140999999999997e-07,3.8184999999999999e-07,3.8563000000000005e-07],"30":[5.3372999999999995e-07,5.4112000000000002e-07,5.4852000000000004e-07,5.4931000000000004e-07,5.5828999999999995e-07,5.6275000000000003e-07,5.6592000000000008e-07,5.6617999999999995e-07,5.6619999999999997e-07,5.6868000000000003e-07,5.7068000000000008e-07,5.7278000000000002e-07,5.7569230769230766e-07,5.7825999999999999e-07,5.8381999999999994e-07,5.8790000000000002e-07,5.8953000000000001e-07,6.1440999999999995e-07,6.1608e-07,6.2960999999999993e-07],"25":[4.3510000000000002e-07,4.3802e-07,4.4818999999999999e-07,4.5214999999999998e-07,4.5236000000000001e-07,4.5331999999999999e-07,4.5568000000000001e-07,4.5624000000000001e-07,4.5649000000000003e-07,4.5894000000000001e-07,4.6372000000000003e-07,4.6372999999999998e-07,4.6405000000000003e-07,4.6706999999999996e-07,4.6772000000000001e-07,4.7112e-07,4.7371999999999998e-07,4.756e-07,4.8149999999999996e-07,4.8769000000000005e-07],"31":[5.5497e-07,5.6436000000000001e-07,5.8091999999999994e-07,5.8202000000000002e-07,5.8217000000000003e-07,5.8276923076923078e-07,5.8573000000000004e-07,5.8610999999999995e-07,5.8691000000000001e-07,5.8780999999999997e-07,5.8861000000000003e-07,5.8909000000000004e-07,5.9223e-07,6.0108000000000003e-07,6.0144000000000002e-07,6.0501999999999995e-07,6.0923000000000001e-07,6.1409999999999997e-07,6.4083000000000005e-07,6.5388999999999993e-07],"1280":[3.1423000000000001e-05,3.1782999999999997e-05,3.2047e-05,3.2090170000000005e-05,3.2132499999999998e-05,3.2213333333333332e-05,3.2233333333333335e-05,3.2312440000000002e-05,3.2317000000000002e-05,3.2336999999999999e-05,3.2439489999999999e-05,3.2887369999999997e-05,3.3219360465116281e-05,3.4467110000000001e-05,3.4714735632183912e-05,3.5121150000000002e-05,3.556177e-05,3.5759000000000001e-05,3.6239999999999999e-05,3.7469160000000001e-05],"26":[4.5924000000000003e-07,4.6366000000000001e-07,4.6408000000000001e-07,4.6475999999999999e-07,4.6934999999999995e-07,4.7010000000000001e-07,4.7021000000000003e-07,4.7188999999999997e-07,4.7836e-07,4.8103999999999997e-07,4.8238000000000001e-07,4.8543000000000003e-07,4.9487000000000004e-07,4.9818999999999999e-07,5.0063e-07,5.0640000000000003e-07,5.1017999999999998e-07,5.1236000000000002e-07,5.1867999999999998e-07,5.4685e-07],"3932160":[1.0742639350000001,1.0775670264999999,1.0830742449999999,1.1035929900000001,1.1351871094999999,1.1368277295,1.138183629,1.144057229,1.1504350274999999,1.151668629,1.1545052485,1.155424904,1.1581917500000001,1.1607662445,1.172592192,1.175525283,1.1930034940000001,1.213663867,1.2247527494999999,1.2461602125],"2432":[6.3757000000000006e-05,6.3833999999999999e-05,6.3844999999999996e-05,6.4645000000000002e-05,6.5443280000000009e-05,6.5880095238095228e-05,6.6328644444444443e-05,6.6343500000000006e-05,6.6378999999999996e-05,6.7110795454545453e-05,6.7596949999999993e-05,6.7713124999999996e-05,6.7809651162790695e-05,6.835449000000001e-05,6.8647300000000003e-05,6.8746772727272735e-05,6.9943000000000004e-05,7.0171089999999996e-05,7.0704520000000002e-05,7.149705e-05],"32":[5.7276e-07,5.9749000000000004e-07,5.9775000000000002e-07,5.9795999999999999e-07,6.0116000000000002e-07,6.0314000000000004e-07,6.0317000000000002e-07,6.0418000000000005e-07,6.111899999999999e-07,6.1529e-07,6.1544999999999997e-07,6.1763999999999996e-07,6.1781999999999996e-07,6.2738999999999996e-07,6.2862999999999999e-07,6.3838999999999993e-07,6.3935000000000007e-07,6.6928999999999993e-07,6.7405999999999999e-07,6.7563000000000002e-07],"27":[4.6940000000000001e-07,4.8266999999999997e-07,4.8627999999999998e-07,4.8793e-07,4.9172000000000001e-07,4.9314999999999999e-07,4.9376e-07,4.9442e-07,4.9719000000000002e-07,4.9897000000000003e-07,4.9997e-07,5.0172999999999998e-07,5.0470000000000001e-07,5.0557999999999995e-07,5.1353000000000002e-07,5.2000999999999996e-07,5.2066999999999996e-07,5.2822e-07,5.3672999999999996e-07,5.3837000000000002e-07],"409600":[0.062449302999999998,0.063306287500000002,0.063644299000000001,0.064264238000000001,0.065184059000000003,0.067261424,0.070288620499999982,0.070975407000000004,0.071501420000000024,0.072398809999999994,0.072677008000000001,0.073138236500000037,0.073605411000000037,0.074345550499999996,0.075097237500000011,0.076167494000000002,0.07850902550000001,0.079473028000000001,0.083085050000000008,0.085437959999999993]}},{"title":"Dictionary subscript, successful lookups","results":{"28":[2.7477000000000002e-07,2.7489e-07,2.7664999999999998e-07,2.7873000000000001e-07,2.8006999999999999e-07,2.8019000000000002e-07,2.8061999999999998e-07,2.8149999999999997e-07,2.8275000000000001e-07,2.8596e-07,2.8762999999999999e-07,2.882e-07,2.8836000000000002e-07,2.8844000000000001e-07,2.8895e-07,2.9051999999999998e-07,2.9755000000000001e-07,2.9780999999999999e-07,2.9789999999999999e-07,3.1193999999999997e-07],"34":[3.3324999999999994e-07,3.3349e-07,3.3395999999999995e-07,3.3433999999999996e-07,3.3460999999999995e-07,3.3630999999999997e-07,3.3745000000000005e-07,3.3864000000000002e-07,3.3883000000000002e-07,3.3942e-07,3.4245999999999996e-07,3.4303000000000002e-07,3.4520999999999995e-07,3.4582000000000001e-07,3.4799999999999999e-07,3.5120999999999998e-07,3.5329000000000001e-07,3.5604e-07,3.5880000000000001e-07,3.6802999999999999e-07],"29":[2.8398999999999999e-07,2.8477999999999999e-07,2.8510999999999999e-07,2.8523000000000002e-07,2.8550000000000001e-07,2.8597000000000001e-07,2.8668999999999998e-07,2.8776999999999999e-07,2.8799999999999998e-07,2.9245e-07,2.9321000000000002e-07,2.9420999999999999e-07,3.0053000000000001e-07,3.0067e-07,3.0258e-07,3.0289999999999999e-07,3.0730000000000001e-07,3.0753e-07,3.0825999999999998e-07,3.2927999999999999e-07],"40":[3.8939000000000002e-07,3.9252999999999998e-07,3.9425000000000003e-07,3.9626000000000003e-07,3.9626999999999999e-07,3.9661e-07,3.9858999999999997e-07,4.0067e-07,4.0117000000000004e-07,4.0292000000000001e-07,4.0342e-07,4.0568999999999998e-07,4.0574999999999999e-07,4.0625999999999999e-07,4.0881999999999998e-07,4.1549999999999998e-07,4.1946999999999998e-07,4.3391e-07,4.3442999999999995e-07,4.5466999999999998e-07],"17408":[0.00026574300000000014,0.00026664199999999999,0.0002670599999999999,0.00026847200000000007,0.00027019899999999994,0.000271356,0.00027184699999999987,0.00027375049999999991,0.000278318,0.00027841999999999998,0.00027915299999999987,0.00028158299999999991,0.00028179700000000019,0.00028249000000000015,0.00028279100000000001,0.0002828070000000001,0.00028337800000000004,0.00028415999999999999,0.00028933857575757583,0.00029166684848484857],"1472":[2.1077499999999999e-05,2.1111000000000002e-05,2.139465e-05,2.1489999999999999e-05,2.1760719999999998e-05,2.1810430000000003e-05,2.1854000000000001e-05,2.1882680000000002e-05,2.1918394736842106e-05,2.2056e-05,2.210578e-05,2.2160570000000001e-05,2.2170990000000001e-05,2.2236109999999999e-05,2.2241600000000001e-05,2.249155e-05,2.2523589999999998e-05,2.27822e-05,2.3547759999999999e-05,2.4592889999999999e-05],"112":[1.14245e-06,1.1436499999999998e-06,1.1485000000000001e-06,1.1538099999999999e-06,1.15586e-06,1.16103e-06,1.164e-06,1.1663300000000001e-06,1.1683700000000001e-06,1.1691199999999999e-06,1.17323e-06,1.1768699999999999e-06,1.18156e-06,1.2013400000000001e-06,1.20189e-06,1.20225e-06,1.20926e-06,1.21839e-06,1.2208600000000002e-06,1.2286799999999999e-06],"1376256":[0.093464011,0.093611670999999994,0.093874606999999999,0.094230213499999993,0.094460890500000033,0.094524086999999951,0.095321470999999991,0.096076067499999945,0.096356056999999995,0.096576021999999997,0.096602769999999977,0.09695919499999997,0.097056851999999985,0.097832775999999996,0.09807157100000001,0.098245644500000007,0.098831603000000004,0.1002139145,0.100898697,0.10112805699999999],"5242880":[0.40120713699999999,0.40440274399999998,0.40552527900000002,0.40649175199999998,0.40722177199999998,0.40916841900000001,0.41172743350000002,0.41249752200000001,0.41336397000000002,0.41508624550000001,0.41627525200000004,0.41639724900000002,0.41678654500000001,0.41682317000000002,0.417980717,0.422706111,0.42343086699999999,0.42399912200000001,0.42681958599999997,0.42719024350000001],"36":[3.5329000000000001e-07,3.5342999999999996e-07,3.5630999999999999e-07,3.5721000000000001e-07,3.5846e-07,3.5874000000000005e-07,3.5949e-07,3.6178e-07,3.6192999999999996e-07,3.6208000000000002e-07,3.6262e-07,3.6276000000000005e-07,3.6285000000000005e-07,3.6347000000000001e-07,3.6544000000000002e-07,3.6547e-07,3.6554999999999999e-07,3.7468000000000002e-07,3.7617000000000001e-07,3.819e-07],"42":[4.1494999999999999e-07,4.1536999999999999e-07,4.1569999999999994e-07,4.172e-07,4.1764000000000003e-07,4.1878e-07,4.1888999999999996e-07,4.2112e-07,4.2222000000000003e-07,4.2305999999999998e-07,4.2544999999999999e-07,4.2654000000000001e-07,4.2752000000000001e-07,4.2773999999999999e-07,4.2818999999999997e-07,4.2971e-07,4.3464999999999999e-07,4.3482000000000003e-07,4.3590000000000003e-07,4.4783999999999997e-07],"11534336":[1.0008814859999999,1.0124886575000001,1.018834558,1.0197215449999999,1.0199702319999999,1.0231127069999999,1.0262337800000001,1.026522698,1.027626519,1.032154676,1.035917454,1.0365890975000001,1.0377342359999999,1.0384739199999999,1.04508654,1.0455579835,1.0511942325000001,1.052973036,1.0566890775,1.0568146055000001],"114688":[0.0024914270000000001,0.0025247216666666665,0.002563535,0.0025885583333333339,0.0025890876666666666,0.0026100169999999988,0.0026253629999999995,0.002628947,0.0026316690000000005,0.002637609,0.002638994333333334,0.002658556666666667,0.0026591830000000012,0.0026613599999999998,0.0026703726666666662,0.0026806270000000005,0.0027013466666666671,0.0027403906666666673,0.002750433,0.003045645],"144":[1.4658100000000001e-06,1.48599e-06,1.4993e-06,1.5012900000000001e-06,1.5033200000000002e-06,1.50612e-06,1.50651e-06,1.51143e-06,1.5150100000000002e-06,1.5184999999999999e-06,1.5208100000000002e-06,1.5227599999999998e-06,1.5312299999999998e-06,1.5358799999999999e-06,1.54239e-06,1.5547999999999999e-06,1.5614500000000001e-06,1.56324e-06,1.5727100000000001e-06,2.66264e-06],"38":[3.7432999999999999e-07,3.7488999999999999e-07,3.7518999999999996e-07,3.7632999999999998e-07,3.7992999999999999e-07,3.8142000000000004e-07,3.8193999999999999e-07,3.8206000000000002e-07,3.8265e-07,3.8295999999999998e-07,3.8300999999999999e-07,3.8429000000000001e-07,3.8454999999999999e-07,3.8576999999999999e-07,3.8583000000000001e-07,3.861e-07,3.8915999999999997e-07,3.8964999999999995e-07,3.9257000000000003e-07,3.9508999999999997e-07],"240":[2.5752200000000001e-06,2.5929166666666669e-06,2.5930400000000002e-06,2.6009399999999998e-06,2.6058333333333331e-06,2.6086399999999997e-06,2.6148000000000004e-06,2.6162800000000001e-06,2.61741e-06,2.6246700000000001e-06,2.6354900000000002e-06,2.64219e-06,2.6477899999999996e-06,2.6766099999999998e-06,2.6859399999999998e-06,2.7005199999999999e-06,2.7818199999999999e-06,2.7912199999999998e-06,2.8594399999999999e-06,2.8651099999999997e-06],"9216":[0.00013946400000000001,0.00014127600000000008,0.00014290399999999999,0.000147002,0.000147109,0.0001472445,0.00014725200000000001,0.00014734045312500004,0.00014785633846153847,0.00014788017187499999,0.000148109,0.00014820799999999999,0.000149796,0.00015007070312499999,0.00015171687500000001,0.00015344066666666666,0.0001542259999999999,0.00015468,0.000155167109375,0.00016175537288135595],"44":[4.3256e-07,4.3704e-07,4.3711999999999999e-07,4.3713e-07,4.3746e-07,4.3751999999999996e-07,4.3795000000000003e-07,4.4087e-07,4.4243000000000003e-07,4.4280000000000002e-07,4.4348000000000005e-07,4.4482999999999999e-07,4.4496000000000004e-07,4.4902999999999999e-07,4.5609999999999996e-07,4.5808999999999999e-07,4.5877999999999998e-07,4.6088999999999999e-07,4.7627000000000002e-07,5.3202000000000007e-07],"1664":[2.0390999999999998e-05,2.0568220588235293e-05,2.0613000000000001e-05,2.0875560000000001e-05,2.0941890000000003e-05,2.1272249999999999e-05,2.1321959999999997e-05,2.1322810000000003e-05,2.1352000000000002e-05,2.143838e-05,2.1560500000000001e-05,2.1589769999999999e-05,2.1648759999999999e-05,2.1667409999999999e-05,2.1753269999999998e-05,2.1769469999999997e-05,2.1871640000000002e-05,2.2131920000000002e-05,2.2247520000000001e-05,2.3800779999999999e-05],"196608":[0.0054612110000000014,0.0055705419999999986,0.005574453,0.0055756209999999994,0.0055877780000000007,0.0056275650000000028,0.005644647,0.005653295,0.0056652349999999976,0.0056760669999999999,0.0056864840000000003,0.0057037589999999984,0.0057174530000000017,0.0057288410000000001,0.0057419819999999988,0.0057768030000000022,0.0058345549999999999,0.0059810740000000012,0.0060279119999999981,0.0060898440000000014],"155648":[0.0038583800000000002,0.003864719,0.0038698140000000005,0.0038989839999999999,0.0039182000000000002,0.0039526054999999985,0.0039609650000000003,0.0039842020000000009,0.0039932360000000016,0.0039985955000000004,0.0040006784999999994,0.0040011995000000002,0.0040130699999999997,0.0040151895000000003,0.0040290884999999981,0.0040562544999999993,0.0041084289999999985,0.0041423099999999989,0.004197437,0.0055794540000000002],"2816":[4.3526714285714285e-05,4.397642857142857e-05,4.4444999999999999e-05,4.4752000000000001e-05,4.5204000000000003e-05,4.5489799999999999e-05,4.5517489999999998e-05,4.5677333333333337e-05,4.5810750000000002e-05,4.6093979999999995e-05,4.6220999999999997e-05,4.6716350000000002e-05,4.6765940000000002e-05,4.7593666666666665e-05,4.7811750000000005e-05,4.8297999999999997e-05,4.8471999999999999e-05,4.8481720000000002e-05,4.9076409999999997e-05,5.3604999999999999e-05],"50":[4.8959999999999994e-07,4.9872000000000001e-07,4.9879999999999999e-07,4.9938000000000002e-07,5.0039000000000005e-07,5.0040000000000001e-07,5.0050000000000001e-07,5.0241999999999997e-07,5.0324000000000005e-07,5.0373999999999998e-07,5.0488999999999996e-07,5.0986000000000004e-07,5.1160999999999996e-07,5.1254000000000001e-07,5.1320999999999997e-07,5.1666000000000002e-07,5.1696000000000004e-07,5.2582000000000003e-07,5.8409999999999994e-07,6.1606000000000008e-07],"2359296":[0.16541594100000001,0.16688444699999999,0.16728384800000001,0.16779786399999999,0.168465277,0.16890195350000001,0.16891920899999999,0.16938096599999999,0.17036810899999999,0.17095344350000002,0.17137587400000001,0.17164388699999999,0.1730846445,0.17364195299999999,0.1737205335,0.173824908,0.17395653699999999,0.175280142,0.17614298449999999,0.17812089950000001],"46":[4.5352999999999996e-07,4.5375e-07,4.5636999999999995e-07,4.5976000000000004e-07,4.6016999999999997e-07,4.6032999999999999e-07,4.6034e-07,4.6307000000000003e-07,4.6424999999999999e-07,4.6443000000000004e-07,4.6639999999999999e-07,4.6897e-07,4.7059999999999999e-07,4.7131e-07,4.7431000000000002e-07,4.7766000000000006e-07,4.7846999999999997e-07,4.8218999999999995e-07,4.8497000000000003e-07,5.1338000000000001e-07],"176":[1.8197299999999999e-06,1.8250699999999999e-06,1.8259200000000001e-06,1.83127e-06,1.84155e-06,1.8475600000000001e-06,1.8513700000000002e-06,1.87324e-06,1.8748100000000001e-06,1.8766e-06,1.88181e-06,1.88264e-06,1.8835100000000001e-06,1.8844700000000001e-06,1.8851200000000001e-06,1.9075599999999999e-06,1.9233600000000003e-06,1.92536e-06,1.9578900000000001e-06,1.9796700000000003e-06],"52":[5.1124000000000002e-07,5.1216999999999996e-07,5.1630000000000004e-07,5.1865999999999996e-07,5.2142999999999998e-07,5.2425e-07,5.2483999999999998e-07,5.2783000000000004e-07,5.2809999999999997e-07,5.2853999999999994e-07,5.3269000000000004e-07,5.3318000000000001e-07,5.3389999999999998e-07,5.3664999999999998e-07,5.4736e-07,5.4982000000000004e-07,5.4985999999999998e-07,5.5400000000000001e-07,5.6691999999999994e-07,6.2542e-07],"272":[2.9291499999999997e-06,2.9489600000000002e-06,2.9581499999999998e-06,2.9640700000000002e-06,2.9653400000000001e-06,2.9667700000000001e-06,2.97453e-06,2.9888199999999998e-06,2.9942699999999999e-06,3.0188900000000002e-06,3.0197399999999999e-06,3.0438200000000001e-06,3.05095e-06,3.06129e-06,3.08837e-06,3.0895100000000001e-06,3.1150100000000001e-06,3.1719700000000003e-06,3.2338799999999999e-06,3.2455000000000001e-06],"116":[1.20379e-06,1.2074700000000001e-06,1.21002e-06,1.2142200000000001e-06,1.2153700000000001e-06,1.21898e-06,1.22011e-06,1.2260900000000001e-06,1.2262100000000001e-06,1.2271100000000001e-06,1.23151e-06,1.23295e-06,1.234e-06,1.2360699999999999e-06,1.2467000000000001e-06,1.25219e-06,1.2610000000000001e-06,1.29192e-06,1.2937899999999999e-06,1.3491999999999999e-06],"47104":[0.00096801811111111127,0.00097735620000000004,0.00098112320000000005,0.00098324200000000006,0.00099252700000000043,0.00099404899999999989,0.0010045639999999999,0.0010046796666666666,0.0010052189999999999,0.001006276,0.0010074586666666667,0.0010164882222222222,0.0010203354444444446,0.0010289506666666666,0.0010415769999999999,0.0010467530000000003,0.00104866225,0.0010791069999999999,0.0011338889999999999,0.0011380989999999994],"6912":[9.1563000000000004e-05,9.4794000000000001e-05,9.51646e-05,9.6477999999999993e-05,9.6484500000000001e-05,9.6591500000000005e-05,9.7026000000000002e-05,9.7208561224489796e-05,9.7398999999999994e-05,9.7589809999999993e-05,9.7749000000000002e-05,9.8363999999999995e-05,9.8738000000000002e-05,9.9734750000000003e-05,0.0001004769659090909,0.00010149083870967738,0.00010153089887640443,0.00010228035416666667,0.000102389,0.00010845404494382023],"1856":[2.2970666666666663e-05,2.3312999999999999e-05,2.3411e-05,2.3541999999999999e-05,2.3573500000000001e-05,2.419179e-05,2.446863e-05,2.4502170000000002e-05,2.464953e-05,2.469088e-05,2.4697551020408163e-05,2.4714499999999999e-05,2.4749220000000002e-05,2.4795989999999997e-05,2.5022619999999998e-05,2.5052350000000001e-05,2.5066e-05,2.5375319999999999e-05,2.5447289999999999e-05,2.5561000000000001e-05],"48":[4.7777999999999998e-07,4.7815999999999999e-07,4.7840000000000005e-07,4.8010000000000007e-07,4.8220000000000002e-07,4.8254999999999994e-07,4.8276999999999997e-07,4.8606000000000005e-07,4.8646999999999993e-07,4.8683000000000003e-07,4.8793e-07,4.8949999999999993e-07,4.9208e-07,4.9523000000000002e-07,4.9685000000000006e-07,5.0187999999999999e-07,5.0228999999999998e-07,5.2267000000000001e-07,5.2691000000000005e-07,5.5725000000000004e-07],"2097152":[0.14052120900000001,0.14086575200000001,0.14091466999999999,0.14193155299999999,0.14208894050000001,0.142280664,0.14232262400000001,0.14260683399999999,0.14287011350000001,0.14292492000000001,0.14385406449999999,0.14414006500000001,0.144517385,0.144703313,0.14571945400000003,0.14576890149999999,0.14599657150000001,0.14656266000000001,0.147044591,0.149067004],"54":[5.3209999999999995e-07,5.3312000000000005e-07,5.3578e-07,5.3841000000000007e-07,5.3875000000000003e-07,5.4216999999999999e-07,5.4389999999999999e-07,5.5022000000000007e-07,5.5210999999999993e-07,5.5340999999999992e-07,5.5435000000000004e-07,5.5439999999999994e-07,5.5514999999999999e-07,5.5558999999999996e-07,5.5845000000000003e-07,5.6767e-07,5.6902e-07,5.7436000000000002e-07,5.9184000000000004e-07,5.9951e-07],"2031616":[0.13558236900000001,0.13592820500000002,0.13608239799999999,0.13681779999999999,0.13721541800000001,0.13801601199999999,0.13809096000000001,0.13836939000000001,0.1383781,0.13905070450000001,0.13995906799999999,0.14011390099999999,0.140150315,0.14051539000000002,0.14052313550000001,0.14141227049999999,0.14192590999999999,0.14210220400000001,0.14288920299999999,0.14418883599999999],"43008":[0.00082379000000000024,0.000832334,0.00084707299999999994,0.00084857800000000022,0.00085677354545454537,0.00085701500000000003,0.00086101100000000007,0.00086233609999999993,0.00086577836363636363,0.00087162299999999997,0.00087174427272727309,0.00088051063636363641,0.00088100899999999998,0.0008873093000000004,0.00088913227272727213,0.0008906459,0.00089432899999999959,0.00089987022222222238,0.00091902619999999994,0.0010019930000000001],"60":[5.9060000000000001e-07,6.0131999999999999e-07,6.0442000000000001e-07,6.06e-07,6.0775999999999998e-07,6.0915999999999998e-07,6.151900000000001e-07,6.1612000000000004e-07,6.1615000000000002e-07,6.1637999999999991e-07,6.1646e-07,6.1694999999999998e-07,6.2046999999999994e-07,6.2328000000000001e-07,6.2881999999999994e-07,6.2972999999999996e-07,6.3023e-07,6.3322000000000005e-07,6.3845e-07,6.608199999999999e-07],"30720":[0.00052681799999999986,0.00053103700000000015,0.00053566599999999996,0.00053825699999999999,0.00054157699999999979,0.00054213135294117667,0.00054427299999999996,0.00054785411764705872,0.00055280100000000001,0.00055674000000000001,0.00055689499999999974,0.00055890200000000001,0.00055914129411764699,0.00056205799999999972,0.00056306082352941176,0.00056527864705882352,0.00056833600000000001,0.00056979650000000008,0.00059129750000000002,0.00060539512500000004],"56":[5.5235999999999995e-07,5.5262000000000003e-07,5.5992000000000005e-07,5.6011999999999996e-07,5.6431e-07,5.6483000000000006e-07,5.6709999999999994e-07,5.7398999999999997e-07,5.7627000000000001e-07,5.7685000000000003e-07,5.7827000000000006e-07,5.7924000000000004e-07,5.8564e-07,5.9016000000000004e-07,5.9179999999999999e-07,5.9248999999999998e-07,5.9370000000000003e-07,5.9382000000000006e-07,5.9481999999999992e-07,5.9500000000000002e-07],"62":[6.1142999999999996e-07,6.1902000000000005e-07,6.1952000000000008e-07,6.1999000000000003e-07,6.2107999999999995e-07,6.2463e-07,6.2926000000000001e-07,6.299000000000001e-07,6.3030000000000003e-07,6.3681000000000005e-07,6.3845999999999996e-07,6.3953000000000006e-07,6.4097999999999996e-07,6.4116999999999991e-07,6.4447000000000005e-07,6.5850999999999999e-07,6.6326000000000002e-07,6.7103999999999995e-07,6.8238999999999996e-07,7.5778000000000005e-07],"58":[5.7889000000000002e-07,5.7960000000000003e-07,5.8065e-07,5.8640000000000001e-07,5.8671999999999995e-07,5.8793e-07,5.8793999999999996e-07,5.8895999999999995e-07,5.8913999999999994e-07,5.8930000000000002e-07,5.9139e-07,5.9411999999999998e-07,5.9597000000000001e-07,6.0183999999999994e-07,6.0250000000000005e-07,6.0307000000000001e-07,6.0324000000000005e-07,6.1925000000000004e-07,6.3203999999999999e-07,6.8089000000000006e-07],"3014656":[0.2437232285,0.24441893949999999,0.24469771500000004,0.24564701900000002,0.245983906,0.248070974,0.24812104800000001,0.248146741,0.24921035400000002,0.250180876,0.25018624849999999,0.250255479,0.25181264000000003,0.25196972699999998,0.25230032999999996,0.25249285099999996,0.25263019149999999,0.25277303600000001,0.25367039000000002,0.2541673485],"64":[6.3389999999999998e-07,6.3397000000000001e-07,6.4028000000000001e-07,6.4201000000000002e-07,6.4349e-07,6.4363999999999991e-07,6.5010000000000003e-07,6.5011999999999995e-07,6.5104999999999989e-07,6.5363000000000006e-07,6.5569999999999992e-07,6.5574000000000007e-07,6.6158999999999998e-07,6.7039000000000012e-07,6.8701000000000001e-07,6.873200000000001e-07,6.9749999999999999e-07,7.0309999999999999e-07,7.0883999999999993e-07,7.1177999999999999e-07],"8388608":[0.62523628600000003,0.63112038000000004,0.63129968550000004,0.632047095,0.63246486199999996,0.63415149300000007,0.63422950199999995,0.63643145849999994,0.64081414000000003,0.64142255800000003,0.64182385249999996,0.644473242,0.64621106400000006,0.64676951500000002,0.65041983849999996,0.65094659499999996,0.65179949500000001,0.65185184900000004,0.65330281800000001,0.65737712599999998],"29696":[0.00049293400000000021,0.00049534900000000018,0.00051319499999999982,0.00051434199999999999,0.00051654499999999998,0.00052541911764705882,0.00052896633333333345,0.000529602,0.00053160799999999971,0.000532384,0.00053606200000000024,0.00054764149999999992,0.0005496180000000002,0.0005504236666666665,0.00056562150000000005,0.0005761421764705879,0.0005857140000000002,0.0006116740000000002,0.00061207899999999997,0.00067090792857142851],"216":[2.2804900000000002e-06,2.3135200000000001e-06,2.31373e-06,2.3156599999999999e-06,2.31855e-06,2.32214e-06,2.3223800000000003e-06,2.33196e-06,2.3366599999999997e-06,2.3417899999999999e-06,2.3464399999999999e-06,2.3565899999999997e-06,2.3671499999999999e-06,2.3690999999999999e-06,2.3717600000000001e-06,2.40097e-06,2.40895e-06,2.4566600000000003e-06,2.5286299999999998e-06,2.5362857142857146e-06],"106496":[0.0022715276666666665,0.0023244519999999999,0.0023326240000000002,0.0023367897499999993,0.0023394070000000008,0.0023443360000000002,0.0023566486666666666,0.0023572845,0.0023589769999999999,0.002359392000000001,0.0023738080000000007,0.002380208,0.0023808733333333327,0.0024306943333333329,0.0024821356666666666,0.002504114,0.0025312613333333335,0.0025351763333333333,0.0026924239999999988,0.0028928870000000002],"72":[7.1674999999999996e-07,7.2328e-07,7.2669e-07,7.2768000000000002e-07,7.2848000000000008e-07,7.3e-07,7.318299999999999e-07,7.3241000000000003e-07,7.3250000000000008e-07,7.3254999999999998e-07,7.3555999999999995e-07,7.4031999999999995e-07,7.4511999999999999e-07,7.4528000000000007e-07,7.4919000000000011e-07,7.5026999999999995e-07,7.5109000000000004e-07,7.6089999999999999e-07,7.6248999999999994e-07,7.9297999999999994e-07],"442368":[0.018776408000000005,0.018972422000000006,0.019218387,0.019337122999999998,0.019445870000000007,0.019492387999999999,0.019605279999999999,0.0196769745,0.019812717000000001,0.019825542999999998,0.019856989999999998,0.019929127999999997,0.019937679999999999,0.020212476,0.020497454999999998,0.020806122,0.020831137499999999,0.020983597999999999,0.020986044499999999,0.021566268999999999],"147456":[0.0035291109999999993,0.0035645050000000012,0.0035877115000000001,0.0035884854999999999,0.003604272999999999,0.0036223604999999839,0.0036259820000000011,0.0036324129999999997,0.0036561080000000017,0.0036575089999999998,0.00366972,0.0037003679999999999,0.003712499000000001,0.0037256330000000003,0.003735117,0.0037351950000000002,0.0037650829999999998,0.0037687800000000007,0.0038088890000000015,0.0038394639999999986],"4456448":[0.31741164350000001,0.32127638800000002,0.32173458850000003,0.32220321149999998,0.32279298300000003,0.3233399065,0.32458210100000001,0.32480568399999998,0.32548213399999998,0.32584587100000001,0.32596402349999998,0.32634149499999998,0.32688787499999999,0.32700610299999999,0.32756899699999997,0.32770597849999999,0.32781772850000002,0.32837658550000004,0.32885454800000002,0.33294041299999999],"63488":[0.0013397510000000001,0.0013410399999999999,0.0013526767142857143,0.0013537587142857144,0.001356782,0.0013577679999999999,0.0013615821428571433,0.0013620679999999999,0.001375093,0.0013814614285714288,0.0013819017142857142,0.0013850224285714291,0.0013909755714285716,0.0013931601428571431,0.0013936612857142854,0.0013995240000000001,0.001404737333333333,0.001426068,0.0014296731666666668,0.001453984],"38912":[0.00072807899999999997,0.00073048799999999995,0.00073697499999999996,0.00073780315384615346,0.00074541700000000006,0.00074854691666666683,0.00074886700000000007,0.00074998300000000007,0.00075013363636363653,0.00075158100000000008,0.00075705774999999993,0.00076149500000000005,0.00076376799999999996,0.00076768339999999961,0.00077021399999999975,0.00077047183333333322,0.00077310141666666677,0.00077490599999999979,0.00077638883333333325,0.00079687150000000016],"68":[6.8051000000000005e-07,6.8305000000000007e-07,6.8599000000000002e-07,6.8619999999999999e-07,6.8668000000000001e-07,6.8862000000000009e-07,6.9187999999999997e-07,6.9367000000000004e-07,6.9469999999999999e-07,6.9664000000000008e-07,6.9738000000000007e-07,7.0045999999999996e-07,7.0166000000000005e-07,7.0386e-07,7.0599000000000004e-07,7.0900000000000001e-07,7.1269999999999997e-07,7.1307999999999998e-07,7.1803000000000003e-07,7.3427999999999998e-07],"188416":[0.0050408299999999996,0.0050527520000000024,0.0051322070000000015,0.0052051730000000004,0.005216076,0.0052238910000000005,0.0052581069999999971,0.0052621999999999999,0.0052949859999999998,0.0052963120000000018,0.0053442409999999996,0.0053571180000000019,0.0053602099999999998,0.005361854000000001,0.0053642159999999998,0.0053665569999999984,0.0053690170000000002,0.0053929859999999998,0.005411997,0.0054241290000000015],"248":[2.61991e-06,2.6756399999999997e-06,2.6827499999999999e-06,2.6868799999999999e-06,2.7104100000000002e-06,2.7128299999999997e-06,2.7142900000000001e-06,2.7251599999999999e-06,2.72533e-06,2.7431800000000001e-06,2.75129e-06,2.75594e-06,2.7611299999999997e-06,2.7760000000000002e-06,2.7864300000000001e-06,2.7879700000000003e-06,2.7993499999999997e-06,2.8295199999999999e-06,2.8626299999999999e-06,2.9493299999999998e-06],"80":[7.8987999999999992e-07,7.9100000000000003e-07,8.0426999999999999e-07,8.0771000000000008e-07,8.0846000000000003e-07,8.1070999999999998e-07,8.1099000000000009e-07,8.1386000000000001e-07,8.1649000000000008e-07,8.1660000000000005e-07,8.1813999999999999e-07,8.2294999999999999e-07,8.2829577464788734e-07,8.2935000000000005e-07,8.4275e-07,8.4409999999999999e-07,8.506899999999999e-07,8.5085000000000008e-07,8.7622999999999995e-07,9.1014000000000002e-07],"2560":[3.6440999999999999e-05,3.6823000000000003e-05,3.7187000000000002e-05,3.8387750000000002e-05,3.8410110000000001e-05,3.8737299999999999e-05,3.877054e-05,3.8803780000000001e-05,3.8901489999999999e-05,3.9057860000000001e-05,3.9165080000000001e-05,3.9171000000000002e-05,3.9178999999999999e-05,3.9202729999999999e-05,3.9294559999999999e-05,3.9348419999999999e-05,3.9378659574468083e-05,3.945449019607843e-05,4.0084259999999996e-05,4.0366830000000003e-05],"34816":[0.00061688300000000025,0.00062935999999999982,0.0006294735333333333,0.00063094600000000007,0.0006414351333333334,0.0006432450000000004,0.00064374966666666674,0.00064494200000000013,0.00064918799999999998,0.00065306713333333332,0.00065339533333333324,0.00065611185714285704,0.00065681699999999997,0.00065933000000000018,0.00066620342857142843,0.00066756407142857155,0.00067013100000000024,0.00067177678571428575,0.00067574764285714272,0.00067580792857142857],"3712":[5.120744680851064e-05,5.1309e-05,5.1396000000000001e-05,5.1653333333333329e-05,5.1830499999999998e-05,5.1992059999999997e-05,5.2182999999999998e-05,5.245977e-05,5.2929500000000002e-05,5.3315511627906979e-05,5.3473160000000006e-05,5.3545611764705879e-05,5.364695e-05,5.3688658823529414e-05,5.3752214285714284e-05,5.3935299999999998e-05,5.393804e-05,5.3947099999999997e-05,5.5069109999999998e-05,5.6023000000000002e-05],"3538944":[0.235637919,0.23796202299999999,0.23820606750000001,0.23871467899999999,0.238757259,0.238963331,0.23911706899999999,0.23955253899999995,0.23989582000000001,0.240026615,0.2401286145,0.24036326299999999,0.24203924399999999,0.24354989849999997,0.24365885100000001,0.24372789800000005,0.24425048299999996,0.245771189,0.24611807099999999,0.24686660299999999],"76":[7.5787e-07,7.6285000000000003e-07,7.6344999999999997e-07,7.6629000000000001e-07,7.6858000000000002e-07,7.7038000000000005e-07,7.7049000000000001e-07,7.7713999999999998e-07,7.7731000000000002e-07,7.7788999999999993e-07,7.7840999999999999e-07,7.7993999999999998e-07,7.8044999999999998e-07,7.8192e-07,7.8240999999999998e-07,7.8912999999999997e-07,7.8922000000000002e-07,7.8943999999999995e-07,7.8956999999999994e-07,8.0118999999999999e-07],"4194304":[0.29342868700000002,0.29404881599999999,0.295507148,0.29555546500000002,0.29584690450000001,0.29638833050000002,0.29656297500000001,0.29691878800000004,0.29722364000000001,0.298432315,0.29867251900000003,0.29939998400000001,0.29995693649999999,0.30022473,0.30094306599999998,0.30232809049999998,0.30255111150000003,0.30414461799999998,0.30806004949999999,0.30892493399999998],"851968":[0.049383059999999993,0.04945372,0.049817600000000004,0.050121473,0.050145567999999988,0.050160621000000002,0.050390892999999992,0.050456087999999996,0.050483414999999997,0.051038746000000003,0.051122922999999987,0.051137558,0.051268762000000002,0.051608772000000004,0.051905053999999992,0.052171347,0.0527677675,0.053324144500000004,0.053451025500000013,0.0558519585],"4096":[5.5933000000000001e-05,5.8621596774193545e-05,5.8662999999999997e-05,5.8709999999999999e-05,5.8850000000000001e-05,5.9004333333333334e-05,5.998384126984127e-05,6.0714059999999999e-05,6.0761000000000003e-05,6.1288301587301587e-05,6.167508e-05,6.1940570000000006e-05,6.2000000000000003e-05,6.209411e-05,6.2152769999999997e-05,6.284598e-05,6.3049929999999996e-05,6.3509999999999993e-05,6.4602099999999996e-05,6.746077272727272e-05],"59392":[0.001220945,0.001227737,0.0012306584285714287,0.0012393268571428569,0.001244684,0.0012454084285714287,0.0012483088571428572,0.0012522150000000001,0.0012548255714285713,0.0012575921428571429,0.0012580175714285713,0.0012635979999999999,0.0012637675714285712,0.0012704947142857142,0.0012759480000000001,0.0012762785714285716,0.001276674,0.0012818572857142857,0.0012833982857142856,0.0013176598571428572],"84":[8.3427000000000002e-07,8.3890999999999999e-07,8.411699999999999e-07,8.4239000000000001e-07,8.4460999999999999e-07,8.4672999999999996e-07,8.4912000000000008e-07,8.5606000000000011e-07,8.6284000000000007e-07,8.6414000000000006e-07,8.6762999999999994e-07,8.7858999999999998e-07,8.8003000000000003e-07,8.8036999999999999e-07,8.8444999999999996e-07,8.9698999999999999e-07,8.9913999999999994e-07,9.1255999999999991e-07,9.3844000000000003e-07,9.7646000000000005e-07],"3276800":[0.21418011100000001,0.21436016799999999,0.21452081000000001,0.21487388800000001,0.2155987285,0.21766929300000001,0.21821587949999999,0.21830770699999999,0.21982700799999999,0.21994275900000004,0.22029851,0.220849514,0.2217758705,0.22208932300000001,0.222685522,0.22376656900000003,0.22494597650000001,0.22532011499999999,0.22640495199999999,0.2276556445],"55296":[0.001108595,0.001126494,0.001127716,0.0011323065,0.001135140875,0.0011355430000000004,0.001138349125,0.0011392570000000001,0.0011465219999999999,0.001150941375,0.00115168775,0.001157457,0.001158888875,0.0011702421250000001,0.0011724109999999999,0.0011758555000000001,0.00118363275,0.00118882275,0.001193211,0.001194145],"688128":[0.034298654999999983,0.03454724800000001,0.034654942499999994,0.035079438999999983,0.035376129000000013,0.035600745499999975,0.035700334,0.036054568500000016,0.036197704000000004,0.036245184,0.036598133999999997,0.037339026000000004,0.037464679000000001,0.037500789,0.037604222999999999,0.037786702999999991,0.038623652000000015,0.038767816999999996,0.040138263000000021,0.040537843000000004],"8192":[0.000118031,0.00011874699999999999,0.00011898799999999997,0.000119523,0.000119778,0.00012004928571428572,0.00012047199999999997,0.00012184999999999995,0.000122698,0.00012340566666666666,0.00012452778947368422,0.00012524821428571429,0.00012544099999999995,0.000126656,0.00012799081578947365,0.0001284825394736842,0.00012892022368421051,0.000129352,0.00013051708620689657,0.00013133],"10240":[0.00016346500000000001,0.0001636889999999999,0.00016533300000000001,0.00016703966666666663,0.0001677645,0.00016936700000000007,0.000170225,0.00017132263636363636,0.00017141087719298236,0.00017178900000000005,0.00017234999999999999,0.00017303799999999998,0.00017320200000000001,0.00017694499999999994,0.00017695581818181824,0.00017714770909090904,0.00017738156363636366,0.00017860952727272728,0.00018024099999999996,0.00019160768000000002],"15872":[0.00023360200000000002,0.00023791175,0.00024283400000000001,0.0002442694,0.00024458200000000002,0.00024468999999999999,0.00024523826315789473,0.00024677666666666668,0.00024705299999999995,0.00024710500000000001,0.00024876423684210534,0.00024878600000000008,0.00024931900000000002,0.00025400569696969698,0.00025442200000000008,0.00025506233333333334,0.00025550278947368332,0.00025976199999999986,0.00026382099999999986,0.000268199],"92":[9.2929000000000008e-07,9.2931999999999996e-07,9.2996000000000005e-07,9.3177000000000004e-07,9.4413999999999993e-07,9.4433999999999994e-07,9.5309000000000007e-07,9.5569230769230772e-07,9.5581999999999994e-07,9.5874999999999993e-07,9.6733000000000002e-07,9.6875999999999989e-07,9.7229999999999999e-07,9.7850999999999989e-07,9.9131e-07,9.9390999999999998e-07,9.9696000000000011e-07,1.0088800000000001e-06,1.0368900000000001e-06,1.07977e-06],"26624":[0.000424409,0.00043032943478260864,0.00043498300000000017,0.00043693733333333341,0.0004387359999999999,0.00044037599999999997,0.00044155640909090911,0.00044178499999999993,0.00044229440909090891,0.00044579300000000032,0.000448255,0.00045349963157894756,0.00045411599999999996,0.00045474570000000002,0.0004549841904761905,0.00046452599999999999,0.00046600100000000018,0.00046813199999999974,0.00046844699999999998,0.0004820065],"1792":[2.2107818181818181e-05,2.218725e-05,2.220321739130435e-05,2.2915269999999999e-05,2.2934370000000003e-05,2.315266e-05,2.330779e-05,2.332019e-05,2.3350620000000001e-05,2.3366419999999998e-05,2.3471000000000003e-05,2.3540810000000001e-05,2.3554719999999998e-05,2.3576370000000001e-05,2.368232e-05,2.3794360824742267e-05,2.380713e-05,2.3926699999999999e-05,2.401055e-05,2.401651e-05],"11776":[0.00020038333333333337,0.00020297000000000002,0.00020401099999999998,0.000205584,0.000209061,0.00021116799999999999,0.000211561,0.00021171849999999985,0.00021190099999999996,0.00021300300000000002,0.00021339900000000002,0.000214308,0.00021466000000000006,0.0002151802,0.0002156099500000001,0.00021566099999999994,0.0002161415,0.00021836366666666668,0.000222943,0.00024441300000000007],"2944":[4.6739000000000001e-05,4.8940666666666671e-05,4.897e-05,4.9039999999999998e-05,4.9154849999999996e-05,4.9185499999999999e-05,4.9591e-05,4.9625e-05,4.9876083333333332e-05,5.0614912087912088e-05,5.0627780000000002e-05,5.064247e-05,5.0718240000000001e-05,5.0916250000000002e-05,5.1260261363636368e-05,5.1406882978723397e-05,5.1520000000000001e-05,5.2036976470588233e-05,5.2959896551724136e-05,5.3504000000000001e-05],"88":[8.8548999999999997e-07,8.8584e-07,8.9398999999999997e-07,8.9625999999999995e-07,8.9890999999999994e-07,8.9957999999999991e-07,9.0081999999999994e-07,9.0156999999999999e-07,9.0272999999999993e-07,9.0618999999999994e-07,9.0828999999999999e-07,9.1267999999999994e-07,9.1592999999999997e-07,9.1898999999999995e-07,9.2643999999999998e-07,9.4029000000000006e-07,9.4172000000000004e-07,9.6293999999999997e-07,9.7672999999999988e-07,9.7896000000000003e-07],"22528":[0.0003892919999999999,0.000394201,0.00039743499999999996,0.000400908,0.00040394999999999998,0.00040578400000000002,0.00040674,0.00041007100000000002,0.000410975,0.00041320899999999999,0.00041369734782608687,0.0004151619999999999,0.00041806156521739151,0.0004193544285714286,0.000420598,0.00042357243478260878,0.00042759599999999998,0.00043431459090909091,0.00043526109090909117,0.00044068477272727268],"1245184":[0.080623150000000005,0.080993121000000001,0.081263888000000006,0.081453400000000009,0.081898278000000005,0.083095437499999994,0.083097369000000004,0.083224429500000002,0.083327797499999995,0.083669475999999993,0.083762659999999975,0.083819696999999999,0.084082776000000053,0.084413395999999974,0.08461830749999999,0.08482681849999997,0.085145508499999994,0.085539926000000044,0.086682034000000005,0.087230421000000002],"15728640":[1.2043174839999999,1.2090330250000001,1.2211229349999999,1.2223469465000001,1.2260199919999999,1.2275305730000001,1.2289474985,1.2294302615000001,1.2295366210000001,1.2318090690000001,1.2318628060000001,1.2331647050000001,1.2338032895,1.2341164984999999,1.2353930765000001,1.2355210255,1.2358103444999999,1.2375343029999999,1.243985865,1.248252417],"96":[9.6187000000000008e-07,9.6760000000000006e-07,9.7764999999999986e-07,9.7946000000000006e-07,9.8011999999999986e-07,9.8236000000000007e-07,9.8566999999999996e-07,9.8740000000000007e-07,9.9958999999999986e-07,1.0004599999999999e-06,1.0004800000000001e-06,1.0021000000000001e-06,1.0040800000000001e-06,1.02092e-06,1.0216099999999999e-06,1.0311899999999999e-06,1.0315200000000001e-06,1.0387600000000001e-06,1.07532e-06,1.0852899999999999e-06],"1984":[2.5548999999999999e-05,2.5894000000000003e-05,2.6092999999999999e-05,2.6371220000000001e-05,2.6620862068965518e-05,2.6665949999999998e-05,2.6692814814814814e-05,2.6717970000000002e-05,2.6751539999999999e-05,2.6927629999999998e-05,2.7049150000000002e-05,2.7051660000000001e-05,2.708472e-05,2.7097689999999999e-05,2.710323e-05,2.7287959999999998e-05,2.7336000000000001e-05,2.7445469999999998e-05,2.7927189999999998e-05,2.8220000000000001e-05],"139264":[0.0033112949999999988,0.0033132889999999983,0.0033372065000000007,0.0033392274999999999,0.0033431110000000002,0.0033431820000000001,0.0033474015,0.0033577284999999992,0.0033612544999999999,0.0033637459999999982,0.0033792754999999986,0.0033793730000000002,0.0033935335,0.0034198409999999999,0.0034216680000000014,0.0034563065000000016,0.0034702969999999998,0.0034755180000000012,0.0039356560000000001,0.0054880750000000002],"475136":[0.020894776,0.020934267499999999,0.021135266999999999,0.021218463999999999,0.021494881,0.021569404,0.021788097999999999,0.021813849999999996,0.021838212999999995,0.021931625,0.021989362999999998,0.022026845999999999,0.022138245000000011,0.022235204500000001,0.022378720000000001,0.02256036149999999,0.022567287000000005,0.023349611500000002,0.024676297999999992,0.026090044999999996],"13631488":[1.0194797120000001,1.023987856,1.0241554509999999,1.0277280504999999,1.0296970889999999,1.0325015420000001,1.0343082834999999,1.035640903,1.0358556215000001,1.041909271,1.042205874,1.042543861,1.0427358069999999,1.0430053484999999,1.0454173225000001,1.0458228675000001,1.0485111090000001,1.049315051,1.0501392860000001,1.056959516],"416":[4.4976699999999997e-06,4.6029699999999994e-06,4.6248500000000003e-06,4.6452500000000001e-06,4.6518999999999995e-06,4.65623e-06,4.6727399999999996e-06,4.7049999999999998e-06,4.7121199999999999e-06,4.7201900000000003e-06,4.7206299999999997e-06,4.7236400000000002e-06,4.7571300000000001e-06,4.7683099999999996e-06,4.7931099999999998e-06,4.80211e-06,4.8063899999999996e-06,4.8187699999999999e-06,4.8542500000000002e-06,5.5121600000000001e-06],"928":[1.0938666666666666e-05,1.0984333333333334e-05,1.109416129032258e-05,1.1112e-05,1.1144999999999999e-05,1.1286214285714285e-05,1.1330279999999999e-05,1.1347300000000001e-05,1.1356890000000001e-05,1.1373150000000001e-05,1.1389999999999999e-05,1.1481869999999999e-05,1.1487419999999999e-05,1.1526139999999999e-05,1.1588429999999999e-05,1.1682769999999999e-05,1.171819e-05,1.208241e-05,1.2141739999999999e-05,1.3201809999999999e-05],"512":[5.8184800000000006e-06,5.8269000000000001e-06,5.8535200000000005e-06,5.9355900000000005e-06,5.9453200000000002e-06,5.9824999999999999e-06,5.9846499999999995e-06,6.0587499999999994e-06,6.0623899999999999e-06,6.0927857142857144e-06,6.1024100000000001e-06,6.1109499999999995e-06,6.1247799999999997e-06,6.1379500000000002e-06,6.2419699999999993e-06,6.2602700000000005e-06,6.2618400000000002e-06,6.3178400000000001e-06,6.5154500000000004e-06,7.0070322580645159e-06],"18432":[0.00028801800000000002,0.0002895629999999999,0.00029333700000000001,0.00029449200000000009,0.00030235,0.00030375000000000009,0.0003047546129032258,0.00030599300000000001,0.00030661499999999999,0.00030744600000000001,0.00030837366666666661,0.0003086360000000001,0.00030982903225806462,0.00031018700000000007,0.000311098,0.00031759099999999999,0.00031889800000000002,0.00031914670967741934,0.00034518300000000015,0.00034755099999999998],"16777216":[1.3099514329999999,1.3107493994999999,1.31129341,1.3118424049999999,1.3199750109999999,1.322951352,1.3249621684999999,1.32821736,1.3290887339999999,1.3348617030000001,1.3409098005,1.3411142045,1.3416220915000001,1.3426040079999999,1.3450067030000001,1.3464653934999999,1.3475290719999999,1.3482092990000001,1.352455333,1.3598356924999999],"9728":[0.00015077599999999998,0.00015512100000000001,0.00015723732203389829,0.00015887883870967741,0.0001590905,0.000159285,0.000159617,0.00015972999999999999,0.000160123,0.0001604496666666667,0.00016118791525423734,0.00016189445762711865,0.00016345029090909091,0.00016348600000000001,0.00016383979999999999,0.00016508548333333335,0.00016680522033898307,0.00016691949056603776,0.00016735506896551719,0.00016801299999999998],"1769472":[0.114025213,0.114625502,0.114819937,0.1148351885,0.115051167,0.115681066,0.115820593,0.115864625,0.11594130499999999,0.11596287,0.116323238,0.116341483,0.11723130399999999,0.11728586900000004,0.117434025,0.117441974,0.11759294100000001,0.11780605500000001,0.118111887,0.119119273],"1703936":[0.109588994,0.110454991,0.110666945,0.110723669,0.11081532199999999,0.1111659315,0.111169688,0.11126343299999997,0.1112677425,0.111339549,0.11142844400000002,0.11158105699999998,0.111632433,0.111947907,0.11234676649999997,0.11299130000000002,0.11328941250000001,0.1144659735,0.11456034199999998,0.1147613435],"2048":[2.6428499999999999e-05,2.6693e-05,2.67565e-05,2.7126000000000001e-05,2.7362e-05,2.7484348837209305e-05,2.7655480000000002e-05,2.7807370000000002e-05,2.7919820000000001e-05,2.8191159999999999e-05,2.8293189999999998e-05,2.8362000000000001e-05,2.8430939999999999e-05,2.8461879999999998e-05,2.846351e-05,2.8734600000000001e-05,2.8863780000000002e-05,2.8956530000000002e-05,2.938238e-05,2.9655260000000001e-05],"14336":[0.000202649,0.000202964,0.0002039605,0.00020490299999999993,0.00020575000000000012,0.000206133,0.00020631499999999994,0.00020633900000000004,0.00021013849999999994,0.00021442799999999993,0.000215121,0.00021522699999999999,0.00021534900000000001,0.00021608,0.000216868,0.000217517,0.00022084200000000012,0.000224887,0.00022955974418604647,0.00023296084210526306],"448":[4.90526e-06,4.9463999999999998e-06,4.9601899999999997e-06,5.0114799999999997e-06,5.0859300000000003e-06,5.0918600000000001e-06,5.1042999999999996e-06,5.1065899999999997e-06,5.1207500000000001e-06,5.14476e-06,5.1532300000000005e-06,5.1590000000000001e-06,5.1651699999999997e-06,5.17187e-06,5.1821600000000007e-06,5.2007400000000003e-06,5.2386500000000002e-06,5.2796500000000003e-06,5.2907627118644066e-06,5.2981500000000003e-06],"5505024":[0.43434394199999998,0.439444793,0.44073086350000001,0.44186482650000003,0.44380482300000001,0.44418748800000002,0.44510403700000001,0.445333068,0.44556889099999997,0.446003229,0.44648320949999998,0.44720843900000001,0.44747621449999997,0.45058817499999998,0.45069524500000002,0.45085818799999999,0.45093925999999995,0.45300633299999998,0.45406837900000002,0.45676228149999998],"544":[6.1668089887640449e-06,6.1956000000000004e-06,6.2601100000000003e-06,6.3110600000000002e-06,6.3186299999999995e-06,6.3870699999999998e-06,6.4250000000000003e-06,6.4372699999999998e-06,6.4665700000000005e-06,6.5076999999999995e-06,6.509517241379311e-06,6.5385599999999993e-06,6.61783e-06,6.6310900000000009e-06,6.6755000000000007e-06,6.6790800000000004e-06,6.69077e-06,6.69226e-06,6.7000000000000002e-06,6.8181199999999997e-06],"221184":[0.0056743190000000015,0.0056767659999999998,0.0057558940000000001,0.0057565339999999998,0.0057747470000000002,0.0058587769999999999,0.0058860709999999997,0.0058905290000000003,0.0059738809999999986,0.0060196870000000001,0.0060471600000000002,0.0060630070000000022,0.0060884709999999998,0.0062396910000000003,0.0063425519999999987,0.006401782,0.0066068429999999985,0.007096497000000002,0.0083702785000000033,0.011250933999999999],"90112":[0.0021860590000000002,0.0022026459999999999,0.0022057260000000012,0.0022165094999999999,0.0022270735000000002,0.0022326950000000007,0.002235356,0.00223596325,0.0022392639999999999,0.0022518234999999993,0.0022584997499999998,0.0022626447500000008,0.0022693595,0.0022724127500000002,0.0022776385,0.0022851049999999999,0.0022975672500000002,0.0022994237499999988,0.0023040422499999999,0.0023472102499999987],"640":[7.5129999999999999e-06,7.5336299999999997e-06,7.6915900000000003e-06,7.6994999999999997e-06,7.8236799999999996e-06,7.8237999999999995e-06,7.8566800000000008e-06,7.8628800000000009e-06,7.8766000000000001e-06,7.8790185185185179e-06,7.9518799999999995e-06,7.987349999999999e-06,8.0241600000000008e-06,8.0572800000000002e-06,8.0693333333333325e-06,8.0940799999999996e-06,8.1142999999999995e-06,8.1720000000000007e-06,8.4139999999999994e-06,8.4503900000000006e-06],"12800":[0.00017182625000000001,0.00017334299999999998,0.00017485300000000004,0.00017861325,0.000181003,0.00018177099999999998,0.000182521,0.000182747,0.00018284230188679243,0.00018292700000000002,0.00018310700000000006,0.00018431400000000004,0.00018459312765957444,0.00018534399999999999,0.00018736409615384615,0.00018777284615384616,0.00018960099999999994,0.00019062900000000002,0.00019081492156862741,0.00019247400000000004],"262144":[0.0068999270000000001,0.0071097139999999979,0.0071244689999999996,0.0071593610000000004,0.0072006910000000004,0.0072150209999999977,0.0072195969999999995,0.007220939,0.0072758860000000005,0.007312369,0.007350054,0.0073664580000000037,0.0073983529999999981,0.0074328550000000004,0.0074695680000000011,0.0074824390000000005,0.0075183980000000008,0.0078785860000000034,0.0079405730000000029,0.0083797320000000008],"589824":[0.027780523999999984,0.028072988,0.028334464,0.028483254999999996,0.02850288599999995,0.028503871,0.028826706000000001,0.029176193999999999,0.029200181000000002,0.029310196,0.029389199999999994,0.029851290499999995,0.029868857999999998,0.029924539,0.030248557999999998,0.030366017999999988,0.030444857999999998,0.031204703,0.03126910699999999,0.031498086000000002],"884736":[0.051620900000000011,0.052170216999999998,0.052316514000000001,0.052382098000000002,0.052547394000000011,0.052689242000000011,0.052805802000000013,0.052931184999999978,0.053059933000000004,0.05310533499999999,0.053137179,0.053479267000000011,0.053560162000000008,0.053795332000000015,0.054202258500000003,0.054369217000000011,0.055275516499999997,0.055780515499999996,0.05598280600000001,0.062293276000000029],"6144":[0.00010676,0.000106832,0.000108416,0.000109160625,0.00011091000000000001,0.000111655,0.000112186,0.00011265688888888893,0.00011290875641025637,0.00011358442857142855,0.00011359221176470587,0.00011363361904761908,0.0001139724,0.00011597199999999999,0.00011646603529411764,0.00011658326190476187,0.00011689200000000003,0.000117056,0.0001190218888888889,0.000126425],"1088":[1.3341e-05,1.358e-05,1.3587249999999999e-05,1.3637600000000001e-05,1.3835130000000001e-05,1.3952560000000001e-05,1.398182e-05,1.4035300000000001e-05,1.404563e-05,1.404625e-05,1.4082109999999999e-05,1.4100680000000001e-05,1.417988e-05,1.418393e-05,1.418667e-05,1.418978e-05,1.421277e-05,1.4352609999999999e-05,1.470857e-05,1.472148e-05],"576":[6.5776299999999999e-06,6.65068e-06,6.7051600000000004e-06,6.8740999999999991e-06,6.8797042253521124e-06,6.8824600000000003e-06,6.8911099999999998e-06,6.92487e-06,6.9273599999999997e-06,6.9554700000000002e-06,6.9585399999999998e-06,6.9612999999999997e-06,7.0244e-06,7.0501500000000006e-06,7.1193900000000001e-06,7.1552400000000008e-06,7.2108499999999997e-06,7.3247099999999994e-06,7.3583700000000002e-06,7.6586699999999996e-06],"160":[1.61975e-06,1.63428e-06,1.64079e-06,1.6527100000000001e-06,1.6739399999999998e-06,1.6776399999999999e-06,1.67865e-06,1.6819599999999999e-06,1.6837699999999999e-06,1.69058e-06,1.69719e-06,1.69865e-06,1.7033700000000001e-06,1.7052800000000001e-06,1.7097299999999999e-06,1.72929e-06,1.7337222222222222e-06,1.7456199999999998e-06,1.7536200000000002e-06,1.88388e-06],"672":[8.2146666666666661e-06,8.2292700000000006e-06,8.2719999999999997e-06,8.2960199999999996e-06,8.3100199999999998e-06,8.316600000000001e-06,8.3619300000000008e-06,8.4099999999999991e-06,8.4589800000000001e-06,8.4594099999999997e-06,8.469260000000001e-06,8.4828600000000003e-06,8.4989999999999994e-06,8.5445600000000001e-06,8.5600400000000005e-06,8.6683499999999998e-06,8.7146800000000001e-06,8.7485400000000004e-06,8.7619800000000004e-06,9.068029999999999e-06],"8912896":[0.68287312200000005,0.68349537299999996,0.68721914949999996,0.68803352500000003,0.68964784950000002,0.69123406100000007,0.69374451999999998,0.69497254799999997,0.6956173765,0.69811894050000001,0.69895231499999999,0.70021068099999995,0.70120900149999998,0.70134838150000001,0.70160532500000006,0.705775614,0.70697137499999996,0.70890470900000002,0.71393594999999999,0.71494270549999994],"100":[1.0117800000000001e-06,1.0280899999999999e-06,1.02933e-06,1.0296100000000001e-06,1.0311e-06,1.03249e-06,1.0343272727272727e-06,1.0407e-06,1.04398e-06,1.0473924050632911e-06,1.05216e-06,1.0651800000000001e-06,1.06728e-06,1.0700999999999999e-06,1.0818499999999999e-06,1.0831099999999999e-06,1.0965899999999999e-06,1.0988800000000001e-06,1.1068600000000001e-06,1.1445799999999999e-06],"507904":[0.022338924,0.022743851000000002,0.022746580999999998,0.022831437,0.023059605,0.023281855000000001,0.023382362,0.023725624000000001,0.023739666,0.023877501000000002,0.023944126999999999,0.023954887000000005,0.024008225000000001,0.024212932,0.024401567000000006,0.024560549500000001,0.024626673500000001,0.024694984,0.024755082000000001,0.027594995000000004],"3840":[5.1105666666666668e-05,5.1502999999999998e-05,5.1820000000000002e-05,5.3621500000000002e-05,5.3646240000000004e-05,5.4036999999999998e-05,5.4423649350649352e-05,5.4660662337662345e-05,5.4859974025974024e-05,5.4863e-05,5.4878260000000003e-05,5.4960199999999996e-05,5.5089359999999999e-05,5.5273766233766233e-05,5.5301725000000001e-05,5.5862880000000002e-05,5.6435232876712323e-05,5.6838743243243244e-05,5.7315000000000003e-05,6.2586e-05],"192":[2.0008800000000001e-06,2.0199899999999999e-06,2.0270299999999998e-06,2.0415099999999997e-06,2.0603750000000002e-06,2.0605500000000001e-06,2.0606400000000001e-06,2.0764500000000003e-06,2.0787799999999998e-06,2.0951399999999999e-06,2.10702e-06,2.1112299999999998e-06,2.11923e-06,2.1837700000000002e-06,2.1890000000000001e-06,2.1907099999999999e-06,2.2048e-06,2.2105000000000003e-06,2.2337700000000001e-06,2.2583500000000002e-06],"376832":[0.012143065500000001,0.0122015665,0.012344946000000001,0.012403290000000001,0.012403459,0.012428363,0.012429273500000004,0.012467653,0.012502636000000003,0.01257231,0.012617119999999999,0.012638205,0.012696763,0.012783206,0.01282437,0.012863600999999999,0.012891181,0.012891659,0.013168220499999999,0.013509410500000004],"98304":[0.0025595000000000001,0.0025865893333333334,0.0025874206666666676,0.0025929096666666616,0.0025967290000000012,0.002603387,0.0026151520000000012,0.002629101,0.0026347853333333329,0.0026414993333333347,0.0026438063333333326,0.0026501716666666665,0.0026699226666666675,0.0026818646666666667,0.0026849976666666669,0.0027195330000000001,0.0027274350000000011,0.0027369406666666661,0.002830169,0.002844752333333333],"5376":[8.7828e-05,8.7919999999999998e-05,8.8165909090909085e-05,8.8226999999999994e-05,8.8419090909090905e-05,8.9112799999999998e-05,8.9414390000000008e-05,8.9492000000000003e-05,8.9697599999999993e-05,8.9979111111111116e-05,9.0087999999999995e-05,9.0301000000000002e-05,9.1307733333333333e-05,9.132e-05,9.1496779999999993e-05,9.154904999999999e-05,9.1810000000000004e-05,9.3294999999999994e-05,9.4586400000000006e-05,0.00010165366666666667],"94208":[0.0023011060000000002,0.0023558200000000007,0.0023562329999999992,0.002378579,0.002386633,0.0024038890000000002,0.002404785,0.0024055170000000007,0.002412711499999999,0.00241304325,0.0024144624999999998,0.00241974025,0.0024299674999999992,0.0024319470000000011,0.0024473390000000006,0.0024658499999999995,0.0024665829999999992,0.002473729,0.0024764840000000002,0.0024995149999999999],"81920":[0.001885147,0.001898107,0.0019123486000000001,0.00191312475,0.001931218,0.001933698,0.0019421706,0.0019479403999999999,0.0019533600000000003,0.001956321,0.001961609,0.0019620251999999993,0.0019763287499999999,0.00197905575,0.001989748,0.002007469,0.0020130012499999998,0.0020136675,0.0020161292499999996,0.0020407909999999993],"3407872":[0.22534042400000001,0.225486408,0.2255986545,0.22617421800000001,0.22659523500000001,0.22669699400000001,0.226897978,0.22845897100000001,0.22869455799999999,0.22931400349999997,0.231190384,0.23228949499999996,0.23233990299999999,0.23269496750000002,0.232698408,0.233253825,0.23394680200000001,0.23400579399999999,0.23608073200000002,0.23646673700000001],"104":[1.05084e-06,1.0535500000000001e-06,1.0545200000000002e-06,1.07143e-06,1.0750400000000001e-06,1.0818900000000001e-06,1.0894300000000001e-06,1.0909800000000001e-06,1.09215e-06,1.0932799999999998e-06,1.09489e-06,1.1050800000000001e-06,1.10598e-06,1.11301e-06,1.11336e-06,1.1191875e-06,1.1240500000000001e-06,1.1419100000000001e-06,1.15821e-06,1.1864e-06],"122880":[0.0027679106666666665,0.0028124516666666673,0.002819205,0.002821713,0.0028328876666666668,0.0028436236666666672,0.0028440936666666665,0.0028505106666666669,0.002875464333333333,0.0028785359999999992,0.0028983303333333333,0.0028992646666666667,0.0029041329999999993,0.0029084829999999999,0.0029397346666666675,0.0029527903333333339,0.0029530159999999988,0.0029546513333333336,0.0029792393333333334,0.0030676856666666677],"200":[2.0927700000000001e-06,2.1099399999999997e-06,2.1221999999999998e-06,2.1266199999999998e-06,2.1397e-06,2.1526463414634145e-06,2.15736e-06,2.1645000000000002e-06,2.1704399999999998e-06,2.1799099999999999e-06,2.1821400000000001e-06,2.18493e-06,2.1976599999999999e-06,2.2125500000000001e-06,2.2153000000000002e-06,2.2222099999999999e-06,2.2395100000000002e-06,2.2970900000000001e-06,2.38256e-06,2.38635e-06],"163840":[0.0041325965000000003,0.0041326015000000002,0.0041928815000000013,0.0041949515000000003,0.0041990539999999989,0.0042335810000000001,0.0042342884999999999,0.0042538385,0.0042584990000000024,0.0042841465000000006,0.0042856395000000023,0.0042882985,0.0043069010000000001,0.0043358749999999977,0.0043389169999999994,0.0043399110000000001,0.0043650059999999985,0.0043652689999999997,0.0044212749999999997,0.0044933320000000018],"4063232":[0.27936661600000001,0.281843597,0.282231907,0.28224799700000003,0.28420908499999997,0.28422159800000002,0.28508012199999999,0.28541100850000001,0.28658058799999997,0.287335385,0.28741780950000001,0.28858495649999999,0.28960068100000003,0.29088516799999997,0.29172196849999998,0.29172992799999997,0.29200176,0.29300845650000001,0.29605634199999997,0.29882093949999999],"5767168":[0.47552950500000002,0.4758289195,0.47673473099999997,0.47941410600000001,0.47944371699999999,0.48067915100000003,0.48081093800000002,0.48273368449999998,0.48277439799999999,0.482820586,0.48314409050000001,0.48435408299999999,0.48561916900000002,0.48737463450000001,0.48855492099999998,0.49235158699999998,0.49643608500000003,0.49796576999999997,0.49838455749999999,0.498386463],"12582912":[1.1802414685,1.1872185100000001,1.1887135259999999,1.1898794989999999,1.1950133630000002,1.197503194,1.1992225590000001,1.203615082,1.206578836,1.209348131,1.2102165165000001,1.2109590370000001,1.2111607740000001,1.2145926409999999,1.217426796,1.2192594080000001,1.2252139040000001,1.2254751310000001,1.2271583905000001,1.2314151680000001],"1600":[1.9261000000000001e-05,1.9275000000000001e-05,1.9448749999999999e-05,1.9754666666666666e-05,1.9813000000000002e-05,1.9819795180722891e-05,2.010323e-05,2.0118330000000002e-05,2.0145139999999997e-05,2.0173909999999997e-05,2.0199000000000001e-05,2.0214949999999999e-05,2.0287340000000001e-05,2.048856e-05,2.0496099999999998e-05,2.0642439999999997e-05,2.0753910000000002e-05,2.1090999999999998e-05,2.1747559999999999e-05,2.3323260000000001e-05],"136":[1.3578299999999999e-06,1.3935099999999999e-06,1.40037e-06,1.40387e-06,1.4086500000000001e-06,1.41237e-06,1.41784e-06,1.4187100000000001e-06,1.4230899999999999e-06,1.4297000000000001e-06,1.4304600000000001e-06,1.4373500000000001e-06,1.4383799999999999e-06,1.4414500000000002e-06,1.4555099999999999e-06,1.46039e-06,1.4715600000000002e-06,1.5013599999999999e-06,1.53376e-06,2.4524099999999999e-06],"232":[2.45645e-06,2.4716799999999999e-06,2.4820799999999998e-06,2.5059200000000001e-06,2.5063e-06,2.5073499999999998e-06,2.5145400000000001e-06,2.5161299999999999e-06,2.5166099999999996e-06,2.5225e-06,2.5305800000000003e-06,2.5308600000000004e-06,2.54283e-06,2.5521099999999999e-06,2.5604300000000001e-06,2.5622200000000003e-06,2.6477500000000002e-06,2.7115800000000003e-06,2.73822e-06,2.8269100000000003e-06],"7077888":[0.504337339,0.50645149499999997,0.50916515699999998,0.51206551600000005,0.51212706299999999,0.51354705899999997,0.51366295149999996,0.51372412899999997,0.514733569,0.51485620899999995,0.515056399,0.51512757149999999,0.51605080700000006,0.52121010999999995,0.52149455199999994,0.52333184850000003,0.52411173900000008,0.52474618250000005,0.52855761700000004,0.52881863699999998],"86016":[0.002026833,0.0020529429999999998,0.0020554390000000001,0.00206330675,0.002066722,0.0020668542499999993,0.0020684002500000001,0.0020713299999999997,0.0020751629999999992,0.0020773452499999994,0.0020855852499999999,0.0020874819999999999,0.0020887089999999998,0.0020976040000000003,0.0020999600000000001,0.0021121530000000016,0.00212300725,0.0021413185000000007,0.0021493300000000001,0.0021736809999999998],"31744":[0.00054208488235294155,0.00055376999999999976,0.00055671382352941189,0.000560933,0.00056191599999999987,0.00056303700000000028,0.00056445550000000001,0.00056474400000000016,0.00056542329411764702,0.00056616000000000023,0.00056643599999999981,0.00057255100000000003,0.00057273299999999997,0.00057569964705882378,0.00057702473333333349,0.00058097843749999999,0.0005862464375,0.00058699299999999974,0.00058845025,0.00063368699999999997],"168":[1.7607899999999999e-06,1.7650899999999998e-06,1.7721999999999999e-06,1.7804100000000002e-06,1.78864e-06,1.7962800000000001e-06,1.7964200000000002e-06,1.80025e-06,1.80163e-06,1.8075400000000001e-06,1.81747e-06,1.82409e-06,1.8352099999999999e-06,1.83879e-06,1.8491400000000001e-06,1.8628699999999998e-06,1.8652799999999998e-06,1.9026000000000002e-06,1.9252300000000002e-06,1.9338999999999998e-06],"622592":[0.029821225999999999,0.030322152000000002,0.030418925999999992,0.030456042999999999,0.03049267000000001,0.030732372499999994,0.0308316015,0.030849336000000012,0.030855657000000002,0.030979523000000002,0.030993066,0.031062772999999998,0.031513328499999979,0.031623379,0.032130473,0.03218575399999999,0.033049135,0.033095448,0.03325211899999999,0.045102172499999996],"108":[1.1061099999999999e-06,1.1095999999999999e-06,1.10998e-06,1.1121699999999999e-06,1.1157600000000001e-06,1.1191100000000001e-06,1.11949e-06,1.1229099999999999e-06,1.1259700000000001e-06,1.13056e-06,1.13821e-06,1.14107e-06,1.1425700000000001e-06,1.1453300000000001e-06,1.1521600000000001e-06,1.1527900000000001e-06,1.1541599999999998e-06,1.16967e-06,1.2183400000000001e-06,1.24577e-06],"327680":[0.0094887040000000041,0.0097122230000000025,0.0097232249999999951,0.0097428014999999986,0.0099440840000000006,0.0099587660000000008,0.01001109,0.010048149499999999,0.010070256,0.010114100000000001,0.010201973,0.010320749000000001,0.010324999499999996,0.010365850999999997,0.010483145500000004,0.0105009645,0.010544597499999999,0.0108878455,0.010962936500000003,0.011366656000000001],"2176":[2.9150923076923075e-05,2.9311000000000001e-05,2.9502999999999999e-05,3.022714e-05,3.034687e-05,3.0495420000000001e-05,3.0561047619047622e-05,3.0615009999999998e-05,3.0701880000000004e-05,3.0781390000000002e-05,3.093159e-05,3.09343e-05,3.0974090000000005e-05,3.0993539999999997e-05,3.1006219999999996e-05,3.1281000000000001e-05,3.144973e-05,3.1816809999999997e-05,3.255787e-05,3.2657999999999998e-05],"3328":[4.2354333333333335e-05,4.2370000000000003e-05,4.2639999999999998e-05,4.3226187499999999e-05,4.3391199999999999e-05,4.3591588235294123e-05,4.3956904761904757e-05,4.4032999999999997e-05,4.4136684210526315e-05,4.4836999999999998e-05,4.4875812499999999e-05,4.5615120000000004e-05,4.5640999999999999e-05,4.5659960000000004e-05,4.5664999999999997e-05,4.5744629999999998e-05,4.6384420000000004e-05,4.6682360000000003e-05,4.6959799999999997e-05,4.8016090000000002e-05],"1":[1.2369999999999999e-08,1.2369999999999999e-08,1.262e-08,1.262e-08,1.263e-08,1.263e-08,1.263e-08,1.2640000000000001e-08,1.2649999999999999e-08,1.2660000000000001e-08,1.2669999999999999e-08,1.269e-08,1.27e-08,1.3209999999999999e-08,1.323e-08,1.3260000000000001e-08,1.3549999999999999e-08,1.3570000000000002e-08,1.39e-08,1.3909999999999998e-08],"2":[2.1929999999999999e-08,2.222e-08,2.222e-08,2.2239999999999999e-08,2.2249999999999997e-08,2.2259999999999999e-08,2.2280000000000002e-08,2.2280000000000002e-08,2.2280000000000002e-08,2.2290000000000003e-08,2.2290000000000003e-08,2.2330000000000002e-08,2.2379999999999999e-08,2.2419999999999998e-08,2.2699999999999998e-08,2.274e-08,2.2769999999999998e-08,2.2790000000000001e-08,2.33e-08,2.4410000000000002e-08],"3":[3.1690000000000001e-08,3.1699999999999999e-08,3.1719999999999996e-08,3.173e-08,3.1739999999999998e-08,3.1779999999999997e-08,3.2140000000000002e-08,3.2279999999999995e-08,3.2350000000000002e-08,3.2600000000000001e-08,3.2630000000000002e-08,3.3150000000000002e-08,3.3269999999999999e-08,3.3289999999999996e-08,3.3339999999999999e-08,3.3739999999999996e-08,3.3780000000000002e-08,3.3899999999999999e-08,3.4319999999999999e-08,3.5140000000000002e-08],"4":[4.1250000000000002e-08,4.133e-08,4.1740000000000002e-08,4.175e-08,4.1789999999999999e-08,4.1799999999999997e-08,4.1829999999999998e-08,4.1840000000000003e-08,4.1860000000000006e-08,4.1869999999999997e-08,4.1910000000000003e-08,4.2160000000000002e-08,4.2189999999999996e-08,4.224e-08,4.2300000000000002e-08,4.2400000000000002e-08,4.3469999999999998e-08,4.3780000000000006e-08,4.3800000000000002e-08,4.5279999999999999e-08],"7424":[0.00010228624999999999,0.00010438899999999998,0.00010441399999999998,0.000104949,0.00010639289999999999,0.00010689414285714291,0.00010698468817204297,0.00010705899999999999,0.0001072385,0.000107353,0.00010767850617283952,0.00010771188888888887,0.000107833,0.00010790000000000005,0.00010887475,0.000108909,0.000110136,0.00011132400000000003,0.00011162268965517238,0.00011475241463414633],"5":[5.1690000000000002e-08,5.1710000000000004e-08,5.1719999999999996e-08,5.1809999999999999e-08,5.1869999999999994e-08,5.1959999999999997e-08,5.2340000000000004e-08,5.2449999999999997e-08,5.2469999999999999e-08,5.2870000000000003e-08,5.3029999999999999e-08,5.3469999999999995e-08,5.3639999999999996e-08,5.376e-08,5.3959999999999995e-08,5.4100000000000001e-08,5.4269999999999996e-08,5.5350000000000003e-08,5.575e-08,5.6849999999999996e-08],"23552":[0.00042288199999999997,0.00042723199999999977,0.00043424500000000004,0.00043816700000000016,0.00043882600000000012,0.000439135,0.00044061400000000009,0.00044134300000000002,0.00044278199999999996,0.00044318200000000003,0.00044515199999999987,0.00044738699999999977,0.00044801610000000001,0.00045019242857142854,0.00045133799999999991,0.00045263400000000004,0.00045354061904761894,0.00045719080952380954,0.00045766699999999998,0.00045820585714285712],"6":[6.032e-08,6.1129999999999992e-08,6.1859999999999999e-08,6.1890000000000007e-08,6.2240000000000007e-08,6.2390000000000005e-08,6.2859999999999995e-08,6.313000000000001e-08,6.3329999999999999e-08,6.3520000000000002e-08,6.3709999999999993e-08,6.3749999999999998e-08,6.3790000000000004e-08,6.409e-08,6.4739999999999996e-08,6.4850000000000002e-08,6.5e-08,6.5379999999999994e-08,6.5810000000000005e-08,6.9390000000000001e-08],"61440":[0.0012664372857142856,0.0012765369999999999,0.0012943698571428572,0.0013046681428571429,0.0013046820000000002,0.0013060960000000001,0.0013082909999999994,0.001308575,0.001311705,0.0013122685714285712,0.001314115,0.0013143110000000005,0.0013187218571428566,0.0013252770000000001,0.0013267789999999997,0.00134806166666666,0.0013485330000000001,0.001352297857142857,0.0013613938571428571,0.0013776115714285715],"491520":[0.021772147000000002,0.021791027000000004,0.022049665,0.022102854999999998,0.022404406999999998,0.022623067,0.022644650000000009,0.022645861,0.022760474999999995,0.022883764000000001,0.022961403000000054,0.023098285,0.023146104000000008,0.023253388,0.023497766999999999,0.02350318500000001,0.024402412999999994,0.025572488999999986,0.0255740325,0.025670317000000005],"77824":[0.0017772420000000005,0.0017836100000000001,0.001786131,0.001786356,0.001791212000000001,0.0017914415999999999,0.00179459,0.0017978779999999999,0.001807906,0.0018084484000000002,0.0018208954,0.0018229556,0.0018294279999999993,0.0018310402,0.001833463,0.0018339328000000002,0.0018471098000000005,0.0018478990000000001,0.0018703431999999999,0.0019102660000000001],"7":[6.9520000000000003e-08,6.9689999999999997e-08,6.9699999999999995e-08,7.0510000000000001e-08,7.0780000000000002e-08,7.0780000000000002e-08,7.0819999999999995e-08,7.0850000000000002e-08,7.1e-08,7.1369999999999997e-08,7.1740000000000006e-08,7.2059999999999998e-08,7.2349999999999996e-08,7.2699999999999996e-08,7.3039999999999998e-08,7.3080000000000003e-08,7.3160000000000001e-08,7.3819999999999995e-08,7.3959999999999995e-08,7.484e-08],"8":[7.9430000000000004e-08,7.9449999999999987e-08,7.9879999999999998e-08,8.0029999999999996e-08,8.0120000000000005e-08,8.0120000000000005e-08,8.012999999999999e-08,8.0169999999999996e-08,8.033999999999999e-08,8.0569999999999986e-08,8.0620000000000003e-08,8.1070000000000011e-08,8.128000000000001e-08,8.1699999999999997e-08,8.364e-08,8.3790000000000011e-08,8.4570000000000009e-08,8.4810000000000003e-08,8.512000000000001e-08,8.7509999999999994e-08],"208":[2.1862299999999999e-06,2.2219000000000003e-06,2.2385300000000002e-06,2.2412700000000001e-06,2.2440800000000001e-06,2.2677600000000003e-06,2.2777799999999999e-06,2.2798199999999999e-06,2.3173299999999998e-06,2.3624500000000001e-06,2.3796000000000001e-06,2.3820100000000001e-06,2.3912500000000002e-06,2.3985999999999998e-06,2.4004899999999999e-06,2.4390300000000003e-06,2.4416599999999996e-06,2.4658500000000003e-06,2.4815900000000002e-06,2.4841799999999997e-06],"9":[8.8959999999999997e-08,8.9550000000000004e-08,9.013e-08,9.0219999999999997e-08,9.0420000000000012e-08,9.0450000000000006e-08,9.0779999999999996e-08,9.0920000000000009e-08,9.118e-08,9.1220000000000006e-08,9.1560000000000007e-08,9.2789999999999999e-08,9.2969999999999991e-08,9.3810000000000004e-08,9.4050000000000012e-08,9.5040000000000009e-08,9.5119999999999994e-08,9.5410000000000005e-08,9.6020000000000009e-08,9.6250000000000005e-08],"73728":[0.0016258405000000001,0.0016325811999999991,0.0016390229999999999,0.0016657010000000003,0.0016728659999999998,0.001677139,0.0016774333999999996,0.001687161,0.0016878525999999999,0.0016966972000000003,0.0017005729999999999,0.0017090920000000002,0.0017189386000000001,0.0017210013999999999,0.0017256533999999997,0.0017440996,0.0017478860000000001,0.0017498397999999992,0.0018121629999999999,0.0018512049999999994],"304":[3.2099354838709676e-06,3.2727800000000001e-06,3.2851100000000004e-06,3.2877699999999997e-06,3.32382e-06,3.3279299999999999e-06,3.36701e-06,3.3869500000000002e-06,3.3957399999999998e-06,3.4022199999999999e-06,3.4056199999999998e-06,3.4066111111111111e-06,3.4102500000000001e-06,3.4554300000000004e-06,3.4683000000000003e-06,3.4776500000000001e-06,3.4854500000000002e-06,3.5022900000000001e-06,3.5207100000000003e-06,3.7069799999999997e-06],"400":[4.3596699999999995e-06,4.4071099999999996e-06,4.4181400000000004e-06,4.4187099999999996e-06,4.4228399999999997e-06,4.4345399999999999e-06,4.4420500000000001e-06,4.4472399999999998e-06,4.4494699999999999e-06,4.48364e-06,4.49461e-06,4.5014200000000003e-06,4.5864499999999999e-06,4.60477e-06,4.6442899999999999e-06,4.7035099999999998e-06,4.7450500000000004e-06,4.8844600000000002e-06,4.9085000000000005e-06,5.3558399999999999e-06],"1310720":[0.086017671999999976,0.086253234000000026,0.086696875000000007,0.087319451000000006,0.087745163999999959,0.088137861000000026,0.089212688000000012,0.089778382500000004,0.089912365999999994,0.090304467499999957,0.090377228000000032,0.090408675000000049,0.090430098,0.090514330000000004,0.090683905500000009,0.090954904000000031,0.091346887499999987,0.093596432000000007,0.093785804500000028,0.094709863000000019],"336":[3.68186e-06,3.6845299999999996e-06,3.6946800000000003e-06,3.6975400000000004e-06,3.7003500000000001e-06,3.7008800000000003e-06,3.7065399999999998e-06,3.7081400000000004e-06,3.7250000000000003e-06,3.7303800000000002e-06,3.7419500000000002e-06,3.7535599999999997e-06,3.7638700000000001e-06,3.7928799999999996e-06,3.8058200000000002e-06,3.8224e-06,3.8908999999999995e-06,4.0046700000000004e-06,4.0894444444444442e-06,4.14185e-06],"3670016":[0.2485162655,0.24995072900000001,0.25028455599999999,0.25069845800000001,0.25086622949999998,0.25165188299999997,0.25271227699999999,0.25279161900000002,0.25295171500000002,0.25340584799999999,0.25434487,0.25512889399999999,0.25552114449999996,0.25555951199999999,0.25584577350000004,0.25652438049999998,0.25659019100000002,0.25688403650000002,0.25919399100000001,0.26208128200000003],"6656":[8.8084000000000006e-05,8.8135999999999998e-05,8.8725000000000002e-05,8.9041000000000003e-05,8.9529000000000003e-05,8.9543000000000006e-05,8.9579000000000004e-05,8.9751000000000002e-05,9.1518555555555566e-05,9.2222333333333347e-05,9.2505500000000004e-05,9.2565330000000002e-05,9.2911869999999999e-05,9.3428333333333335e-05,9.3644489583333333e-05,9.414053e-05,9.5394666666666656e-05,9.5454337349397587e-05,9.6095999999999996e-05,9.6169500000000001e-05],"15360":[0.000221898,0.00022346700000000006,0.00022391199999999999,0.00022650200000000003,0.000227121,0.00023286199999999999,0.000233236,0.00023402699999999999,0.00023423000000000007,0.00023488099999999999,0.00023507899999999994,0.00023766600000000001,0.00024000700000000003,0.00024236807692307695,0.00024318200000000007,0.00024414,0.00024506257894736834,0.00024573900000000014,0.00024902466666666667,0.00026573942857142853],"432":[4.7382700000000005e-06,4.7488499999999994e-06,4.8051199999999997e-06,4.8105238095238096e-06,4.8259499999999999e-06,4.8574100000000001e-06,4.8609999999999997e-06,4.8665699999999997e-06,4.9039699999999996e-06,4.9191800000000006e-06,4.9195300000000005e-06,4.9222199999999998e-06,4.9401399999999998e-06,4.9718800000000001e-06,4.9853600000000003e-06,5.0019400000000006e-06,5.0230099999999999e-06,5.2566600000000006e-06,5.3655700000000004e-06,5.7621699999999992e-06],"950272":[0.056167821,0.056225301000000019,0.056553237999999985,0.056824529499999998,0.056911825000000013,0.056939058000000028,0.057115598999999961,0.057264457999999983,0.057378831500000005,0.057520007999999991,0.057541904000000019,0.057591694000000013,0.057832364000000004,0.05821800399999999,0.058280135499999997,0.058981085999999981,0.059101824000000004,0.059843871999999979,0.060363036000000002,0.0630529175],"655360":[0.032388713999999999,0.032936967999999997,0.03311287999999999,0.033408994499999983,0.033486623,0.033813021499999998,0.033952900000000001,0.033956409999999992,0.034079421499999998,0.03409922,0.034117328999999988,0.034404770500000001,0.034473980000000001,0.034614743500000017,0.03469733500000001,0.035396123000000002,0.035922991000000001,0.036054441499999999,0.036259654500000002,0.037376700999999998],"69632":[0.0015126001666666666,0.001527165,0.0015507603333333336,0.0015518960000000001,0.001554021,0.0015589041999999995,0.0015632571666666668,0.0015635150000000001,0.0015659953999999994,0.0015693410000000001,0.001572288,0.0015725248333333338,0.0015901841666666669,0.0015914393333333332,0.0016044354000000001,0.0016113451666666667,0.0016268250000000001,0.0016433173333333336,0.001752237,0.0017682800000000001],"11264":[0.00018918,0.000189588,0.000190951,0.00019175799999999999,0.00019433349999999999,0.0001961116666666667,0.00019722999999999998,0.000197362,0.00019898800000000004,0.00019960730612244895,0.00019960999999999989,0.00019981099999999999,0.00019997999999999999,0.00020161920833333327,0.00020372599999999999,0.00020536295833333335,0.000209297,0.00020978331914893615,0.00021290028888888888,0.00022748260465116281],"2752512":[0.20803594549999999,0.208458273,0.20917787299999999,0.21132199400000001,0.21313836200000003,0.213329352,0.21461654400000002,0.21473278700000001,0.21519888600000001,0.216548038,0.21704783850000001,0.21724228000000001,0.2178432045,0.217894116,0.219032061,0.21944041049999999,0.219735081,0.220437877,0.22166770599999999,0.22322509750000002],"8126464":[0.60086154599999997,0.60333484599999998,0.60729620699999998,0.60841765699999995,0.6096778115,0.60982725000000004,0.61132309799999995,0.61196021700000003,0.61277172800000002,0.61395811,0.61449796349999997,0.61519241749999998,0.61528997200000002,0.615950251,0.61662410950000002,0.61943985349999997,0.61979085699999992,0.62196716799999996,0.6283701035,0.62864379999999997],"27648":[0.00044408199999999999,0.00044920354999999999,0.00044939300000000003,0.000454225,0.00045759199999999999,0.00045861400000000015,0.00045979900000000016,0.00046090999999999998,0.00046405580952380964,0.00046406800000000004,0.00046976600000000004,0.00047112099999999996,0.00047559400000000019,0.00047850219999999997,0.00047947965,0.00048149500000000002,0.0004821103,0.00048440104999999999,0.000485126,0.0004853627],"368":[4.0598000000000005e-06,4.0860200000000001e-06,4.1267599999999998e-06,4.1316800000000001e-06,4.1713799999999999e-06,4.1770599999999999e-06,4.1883899999999997e-06,4.2037500000000002e-06,4.2125099999999998e-06,4.2170999999999998e-06,4.2192299999999998e-06,4.2243571428571435e-06,4.2683100000000001e-06,4.3105999999999999e-06,4.3367399999999997e-06,4.3554200000000004e-06,4.3873399999999997e-06,4.4136981132075468e-06,4.5266e-06,4.8774000000000001e-06],"65536":[0.0014302588333333333,0.0014376075,0.0014511650000000001,0.0014535911666666661,0.0014548441666666664,0.0014573446666666661,0.0014731196666666669,0.0014763764999999999,0.0014811218333333335,0.0014901349999999999,0.0014903201666666666,0.0014911550000000001,0.0014924126666666666,0.0015018360000000003,0.001508805,0.0015539203333333335,0.0015659485000000001,0.001590511,0.0016016078,0.0016472692000000003],"16252928":[1.2627396850000001,1.2638267224999999,1.2690776029999999,1.27133428,1.2719268225,1.2749479960000001,1.276149902,1.278044621,1.2802002539999999,1.28045429,1.28075797,1.2868036700000001,1.2908057930000001,1.2913490670000001,1.2933387780000001,1.2961278890000001,1.300207372,1.30074712,1.3011905934999999,1.3028573409999999],"464":[5.17767e-06,5.21862e-06,5.2916300000000007e-06,5.3117599999999994e-06,5.3196300000000003e-06,5.32114e-06,5.3519699999999993e-06,5.3554999999999998e-06,5.3620700000000003e-06,5.390157894736842e-06,5.3960700000000003e-06,5.4078999999999995e-06,5.42521e-06,5.4394199999999997e-06,5.4503899999999997e-06,5.4795099999999997e-06,5.5090000000000001e-06,5.5250799999999993e-06,5.5447000000000005e-06,5.5910000000000003e-06],"1015808":[0.060655238,0.061575844000000025,0.061651213999999996,0.06209036250000001,0.062183170999999968,0.0623344235,0.062344432000000019,0.062388440999999982,0.062482842000000004,0.062505949000000019,0.06308558849999997,0.063161802000000017,0.063245628000000026,0.063469365999999999,0.063774154,0.063798011999999973,0.065337066999999999,0.065488461999999997,0.065545065,0.065706399999999998],"3072":[5.0154000000000001e-05,5.2296999999999998e-05,5.2324999999999998e-05,5.2423999999999998e-05,5.2456000000000001e-05,5.3137840000000001e-05,5.3652000000000001e-05,5.3659000000000002e-05,5.377085e-05,5.3866000000000002e-05,5.4057072289156629e-05,5.4116000000000002e-05,5.418678e-05,5.4235261904761901e-05,5.4238493975903616e-05,5.4323974025974027e-05,5.4738250000000001e-05,5.5131303797468354e-05,5.5441079999999999e-05,5.6428868421052628e-05],"110592":[0.0023837859999999997,0.0024178535000000008,0.0024179690000000011,0.0024242460000000001,0.0024273560000000007,0.00243127675,0.0024314079999999999,0.0024388966666666666,0.0024679903333333338,0.0024800703333333336,0.0024875540000000008,0.002495266333333333,0.0024971313333333337,0.002509407,0.0025114466666666668,0.0025233843333333328,0.0025339576666666671,0.0025610186666666667,0.002573303333333333,0.0025999059999999999],"237568":[0.0061537430000000014,0.0061670650000000028,0.0062501190000000028,0.0062766830000000008,0.0063686039999999999,0.0064080630000000003,0.0064156700000000001,0.0064686990000000014,0.0065090170000000015,0.006517246,0.0065967440000000016,0.0066414290000000016,0.006647979,0.0066497709999999988,0.0066618669999999975,0.0067622440000000032,0.006777918,0.0067889549999999967,0.0068157070000000059,0.0073581919999999995],"278528":[0.007586611,0.0076248430000000035,0.0077812409999999995,0.007810567,0.0078583730000000036,0.0078804180000000001,0.0078989799999999999,0.0079248449999999998,0.0079621420000000002,0.0080100880000000003,0.0080439150000000004,0.0080712170000000003,0.0081139619999999971,0.0081189550000000006,0.0081489070000000004,0.0082229830000000032,0.008247204999999997,0.0097623855000000034,0.0151513515,0.015690193000000002],"496":[5.5770545454545451e-06,5.6318899999999995e-06,5.6406200000000004e-06,5.6690100000000001e-06,5.68108e-06,5.6869900000000001e-06,5.6899523809523803e-06,5.7516000000000001e-06,5.7813899999999995e-06,5.7975294117647056e-06,5.7990300000000003e-06,5.8406599999999996e-06,5.8817099999999998e-06,5.9036099999999995e-06,5.9688999999999997e-06,5.9960799999999995e-06,6.0449399999999998e-06,6.1378300000000003e-06,6.1579500000000001e-06,6.4392400000000004e-06],"13107200":[0.97238981749999998,0.97511315649999997,0.97804922800000005,0.98068748699999997,0.98156796349999997,0.98193216999999999,0.9863476645,0.98837381300000005,0.98880623400000001,0.99222494000000006,0.99236080400000004,0.99440690499999995,0.99483849049999995,0.99597735600000004,1.0005850805000001,1.000665597,1.000693024,1.00127371,1.0034000750000001,1.0036077459999999],"9961472":[0.79690041649999999,0.79761563899999999,0.79986714150000005,0.80314129300000003,0.80649240899999997,0.80779783549999995,0.81148926750000006,0.81334825799999999,0.8136603885,0.81543483399999994,0.81799609049999999,0.81910775349999998,0.82299812049999999,0.82452681399999994,0.82502544,0.82583890650000003,0.82608907799999998,0.82816497199999994,0.82826364250000006,0.83147427299999999],"5888":[0.00010066200000000002,0.000100781,0.00010097100000000001,0.00010216625,0.0001029235,0.000104257,0.000104421,0.00010456299999999997,0.000104962,0.000105052,0.00010547700000000001,0.000105738,0.00010579938095238103,0.000105832,0.00010588532530120479,0.00010593499999999997,0.00010640979775280901,0.00010652,0.00010932366666666664,0.000109895],"11010048":[0.94255181399999999,0.94420494850000003,0.94562877000000001,0.94595430199999997,0.94667257199999999,0.95262113100000001,0.955110142,0.95633849149999994,0.95753450699999998,0.95875000700000002,0.95985211650000002,0.95987657650000002,0.96340274199999998,0.96466885499999999,0.96470826600000004,0.96900503500000001,0.97084568650000003,0.97483889950000002,0.97612793450000002,0.98035853900000003],"1920":[2.4405000000000001e-05,2.4406999999999999e-05,2.4422499999999999e-05,2.4443999999999998e-05,2.4530999999999999e-05,2.4589000000000001e-05,2.4817999999999999e-05,2.5382880000000003e-05,2.5596930000000001e-05,2.5599809999999999e-05,2.5667999999999999e-05,2.5683599999999999e-05,2.5721310000000001e-05,2.5723000000000001e-05,2.6034000000000002e-05,2.6043000000000001e-05,2.6116770000000002e-05,2.6160300000000001e-05,2.630026e-05,2.6759869999999999e-05],"2490368":[0.17833067599999999,0.18001049399999999,0.180246776,0.18114082949999999,0.18165218,0.18195798399999999,0.18246732500000001,0.18294692400000001,0.18375575599999999,0.18426402600000003,0.184342635,0.18434945149999998,0.18459614050000001,0.1849963215,0.18614350549999997,0.18615242399999998,0.18622086999999998,0.18644372799999998,0.18740670999999998,0.18847280899999996],"19456":[0.00031134700000000012,0.00031422899999999991,0.00031701500000000008,0.00031974599999999998,0.0003245949999999999,0.00032776100000000014,0.00032835900000000002,0.0003300659999999999,0.00033016700000000003,0.00033320032142857134,0.00033363400000000002,0.00033419058620689655,0.000338098,0.00033856471428571436,0.00033963457142857135,0.00034029396296296282,0.00034422671428571428,0.00034520530769230768,0.00034605000000000009,0.00034645199999999986],"57344":[0.0011592623749999999,0.0011849109999999999,0.00118870825,0.0011925911250000002,0.0011945917500000001,0.001198661,0.0012054075000000001,0.0012087784285714285,0.0012108715714285714,0.0012125734999999999,0.0012213875000000002,0.0012300079999999999,0.0012329000000000001,0.001236234857142857,0.0012424941428571432,0.0012440994285714286,0.0012470773750000001,0.001258618142857143,0.0012665061428571429,0.0012754518571428566],"1179648":[0.073327034999999999,0.074649995499999983,0.075281130999999973,0.075319382000000018,0.075633051999999992,0.075706213000000008,0.075940622999999999,0.076377137000000039,0.076620015,0.077120782999999998,0.07741475149999999,0.077741525999999964,0.077839163000000003,0.078725033,0.07936121799999997,0.079826354500000002,0.080259889000000001,0.080760704000000003,0.082502137000000003,0.082849858999999998],"4718592":[0.34017734999999999,0.34478010199999998,0.34586322599999997,0.3484005845,0.3505237645,0.35282508400000001,0.35391624799999999,0.35491213199999999,0.35530958800000001,0.35564666899999997,0.35581779499999999,0.35620366999999997,0.357087035,0.35757924949999997,0.35875072899999999,0.35881447300000002,0.36062729100000002,0.360882643,0.3609494385,0.36452317899999997],"360448":[0.011287662,0.011330671,0.0115430315,0.011655147000000003,0.011659533999999997,0.01170744,0.011712086,0.011712134000000001,0.011763478000000001,0.01178567,0.011793486000000001,0.011876380000000002,0.011954698999999996,0.011972027,0.012038221,0.012220373,0.012370243999999997,0.012616123,0.0127425275,0.013563038999999999],"1572864":[0.1154323795,0.11577117200000001,0.116707324,0.116708664,0.117487736,0.11758645700000001,0.11836469300000001,0.11841868799999999,0.11904242,0.119192747,0.120697188,0.120937656,0.12105445200000001,0.12125147349999998,0.1212960605,0.12146618300000001,0.12230871399999999,0.123009639,0.123473926,0.12408340800000001],"53248":[0.0010568040000000004,0.0010622784444444444,0.001067127,0.0010708307777777776,0.001073645,0.0010761189999999999,0.0010779865555555555,0.001079006375,0.0010822693750000001,0.001091631,0.0010917756249999996,0.0010936869999999999,0.0010939204999999999,0.0011104609999999999,0.001111269875,0.0011161897500000001,0.001119093125,0.0011253159999999999,0.0011287585000000005,0.0011398958750000001],"3456":[4.5019666666666672e-05,4.60894e-05,4.6440999999999998e-05,4.6520999999999997e-05,4.65408e-05,4.6682499999999999e-05,4.6707714285714288e-05,4.6748e-05,4.6752000000000002e-05,4.6771999999999999e-05,4.7548285714285719e-05,4.7633900000000005e-05,4.8062259999999999e-05,4.8254120000000004e-05,4.8794944444444445e-05,4.8847090909090905e-05,4.9402352272727277e-05,4.9631159999999997e-05,4.9700869999999995e-05,5.2386160000000001e-05],"40960":[0.00077379999999999994,0.00077785499999999993,0.00077963299999999995,0.00078323499999999996,0.00079396800000000015,0.00079526199999999992,0.00079758299999999993,0.000798214,0.00080197500000000024,0.00080287800000000014,0.00080495433333333324,0.00081202799999999969,0.00081825758333333343,0.00081876881818181873,0.0008254716363636363,0.000829001,0.00083992299999999958,0.00084681899999999974,0.00085434600000000008,0.00087914099999999995],"4608":[6.7546999999999996e-05,6.7742000000000003e-05,6.9224e-05,7.0052680000000006e-05,7.0523820000000005e-05,7.1028050000000002e-05,7.1188999999999999e-05,7.1570676470588239e-05,7.221075e-05,7.2519000000000001e-05,7.2759879999999993e-05,7.2917510000000002e-05,7.3032050000000005e-05,7.3208730000000005e-05,7.3892230000000006e-05,7.4025941176470578e-05,7.4208999999999994e-05,7.4280949999999999e-05,7.4421620000000001e-05,7.8651550000000001e-05],"13824":[0.00019462700000000006,0.00019465799999999998,0.00019472900000000001,0.00019511800000000007,0.00019532799999999998,0.00020227299999999999,0.00020240900000000002,0.0002031315306122449,0.00020352002127659564,0.000203539,0.000204217,0.00020599352083333403,0.000206467,0.00020740479999999998,0.00020791400000000002,0.00021027395555555558,0.00021122604444444439,0.00021369486956521752,0.00021459499999999999,0.00021531599999999998],"819200":[0.046923449000000013,0.047008291000000001,0.047274295000000008,0.047596028999999998,0.047669940000000008,0.04778036900000001,0.048080987999999998,0.048103131,0.048115498,0.048168969999999998,0.048244420000000003,0.048255434,0.04831506599999999,0.048349323500000006,0.048479415000000026,0.048806490000000001,0.049436744000000019,0.04972650599999999,0.050421298499999989,0.051663972000000002],"983040":[0.058607184,0.058676860000000053,0.058694355000000017,0.059281436999999979,0.059690835000000067,0.059729130000000019,0.059972113000000049,0.060018517,0.060045723999999967,0.060385834000000013,0.060442082000000022,0.060892301000000003,0.061038117999999975,0.06118101049999998,0.061348604999999945,0.062000194000000022,0.062171919000000006,0.062747322499999994,0.06315934450000002,0.063290265500000026],"8704":[0.00012711074999999998,0.00012764799999999995,0.00012817899999999999,0.000134253,0.00013490399999999995,0.00013546600000000005,0.00013584775342465757,0.00013590205714285715,0.00013610866666666666,0.00013626299999999997,0.00013635899999999999,0.00013644808450704221,0.00013654933823529413,0.00013848058571428571,0.00013923764285714285,0.00014092299999999999,0.00014125839999999996,0.000142898,0.00014851,0.00015178000000000001],"120":[1.21091e-06,1.22877e-06,1.2297700000000001e-06,1.2445399999999999e-06,1.2566800000000001e-06,1.25799e-06,1.258576923076923e-06,1.2611299999999999e-06,1.26909e-06,1.2699700000000001e-06,1.27255e-06,1.2733300000000001e-06,1.2738899999997778e-06,1.2817500000000001e-06,1.2924299999999999e-06,1.2930099999999998e-06,1.2966499999999999e-06,1.29798e-06,1.3132599999999999e-06,1.38519e-06],"1024":[1.2510333333333333e-05,1.253375e-05,1.2588e-05,1.2721390000000001e-05,1.2727730000000001e-05,1.2851670000000001e-05,1.288537e-05,1.2937510000000002e-05,1.294075e-05,1.2977869999999999e-05,1.2994409999999999e-05,1.302617e-05,1.3080739999999999e-05,1.3104010000000001e-05,1.3124250000000001e-05,1.3192230000000001e-05,1.320123e-05,1.32227e-05,1.337778e-05,1.395493e-05],"49152":[0.001029079,0.0010308399999999999,0.0010332698888888883,0.0010542953333333336,0.0010561659999999999,0.001057697,0.0010646296666666662,0.001064784,0.0010649869999999999,0.001068128,0.0010702935555555555,0.001076326125,0.001079326125,0.0010832588888888891,0.0010834479999999999,0.0010943329999999999,0.0010970666249999999,0.0010978667777777776,0.0011182415,0.001219181142857143],"524288":[0.023773205999999998,0.024159335999999976,0.024238821000000001,0.024400258000000001,0.024531197000000001,0.024597052000000001,0.024610574999999999,0.0247794585,0.024793432000000001,0.024866591,0.024884244999999999,0.024910972,0.024950528,0.025638167,0.025674903000000006,0.026110877999999994,0.027139063000000001,0.027923740000000002,0.029091885500000008,0.037006042499999989],"45056":[0.00089245100000000005,0.00089911700000000028,0.00089963700000000001,0.0009077941000000001,0.00090932800000000005,0.00090948580000000008,0.00090997260000000042,0.00091100800000000026,0.00091496899999999964,0.00091714200000000035,0.00092305799999999971,0.00093543399999999996,0.0009358115,0.00094026300000000021,0.0009451091,0.00094535609999999955,0.00095061699999999996,0.000951928,0.00096440190000000002,0.000987108],"229376":[0.0059330579999999997,0.0059541379999999994,0.006092405999999999,0.0060979160000000001,0.006130506,0.0061540959999999978,0.0061795610000000001,0.006215799000000001,0.006222506,0.0062291840000000022,0.0062729509999999988,0.0062826699999999997,0.0063439590000000014,0.0063960299999999996,0.0064257030000000022,0.00650623,0.0066498399999999989,0.0067048089999999973,0.0073171369999999996,0.012316046000000002],"2688":[3.9588000000000001e-05,3.9638000000000002e-05,4.0108000000000003e-05,4.0620000000000001e-05,4.0709763157894741e-05,4.0898e-05,4.1603428571428571e-05,4.2324000000000003e-05,4.2379724137931037e-05,4.2400220000000002e-05,4.2557389999999999e-05,4.2659217391304352e-05,4.2814790000000001e-05,4.2864800000000003e-05,4.2948999999999998e-05,4.2958699999999999e-05,4.298545e-05,4.3154549999999998e-05,4.3230040000000001e-05,4.3652200000000002e-05],"152":[1.5440300000000001e-06,1.5627100000000002e-06,1.5630999999999999e-06,1.56687e-06,1.5687700000000001e-06,1.5850547945205479e-06,1.5919299999999999e-06,1.59194e-06,1.5926499999999999e-06,1.5932799999999999e-06,1.5947300000000001e-06,1.6042199999999999e-06,1.6082100000000002e-06,1.6134699999999999e-06,1.6213400000000001e-06,1.6379099999999999e-06,1.63888e-06,1.6475800000000002e-06,1.7075200000000001e-06,1.74941e-06],"5120":[7.8789999999999996e-05,8.0771000000000003e-05,8.1165e-05,8.1500000000000002e-05,8.1620999999999997e-05,8.2185411764705882e-05,8.2269100000000001e-05,8.3491833333333333e-05,8.4824e-05,8.5180140000000004e-05,8.5239000000000002e-05,8.5731539999999993e-05,8.6335000000000006e-05,8.6463459999999994e-05,8.6606846153846145e-05,8.6695999999999998e-05,8.6765309999999995e-05,8.730100000000001e-05,8.7682079999999997e-05,8.8083539999999987e-05],"1507328":[0.10834998150000003,0.1089447185,0.109254607,0.10933462999999999,0.110094767,0.110185696,0.110660619,0.110807538,0.111078229,0.11115542299999998,0.111233915,0.111376064,0.111460002,0.11181499299999997,0.11225592199999999,0.112397204,0.11324477500000001,0.114716911,0.11544090550000002,0.12073020399999999],"1216":[1.5408166666666666e-05,1.5701499999999999e-05,1.6094142857142855e-05,1.621423e-05,1.6243710000000002e-05,1.634896511627907e-05,1.6349139999999998e-05,1.636548e-05,1.638171e-05,1.6405719999999999e-05,1.642971e-05,1.6449819999999998e-05,1.652359493670886e-05,1.656096e-05,1.65705e-05,1.657627e-05,1.6606999999999999e-05,1.6608110000000002e-05,1.6962119999999999e-05,1.8877000000000002e-05],"1966080":[0.130041829,0.13056256099999999,0.13085939799999999,0.13093133900000001,0.13215194,0.13234874499999999,0.132369232,0.13259159100000001,0.13280204900000001,0.132826519,0.13284762550000001,0.13289890900000001,0.13300077799999999,0.133225551,0.133274541,0.13355725600000001,0.133579002,0.134479025,0.13467631099999999,0.13567369100000001],"1900544":[0.124451545,0.125126773,0.12529622100000001,0.12576751350000001,0.12648891100000001,0.126518619,0.126668999,0.126926756,0.127691681,0.12784739449999999,0.12796737999999999,0.12821123349999999,0.1282552585,0.128269727,0.12869340400000001,0.12873789600000002,0.12894754,0.1294801035,0.13009132300000001,0.13083676550000001],"184":[1.90099e-06,1.91723e-06,1.9209900000000001e-06,1.9253699999999998e-06,1.9483400000000003e-06,1.952217391304348e-06,1.9532600000000002e-06,1.96387e-06,1.9683400000000001e-06,1.9778699999999998e-06,1.98463e-06,1.9937500000000002e-06,2.01111e-06,2.0223800000000002e-06,2.0272400000000001e-06,2.03201e-06,2.0340299999999999e-06,2.0759100000000002e-06,2.0965499999999999e-06,2.1284700000000001e-06],"7936":[0.000112539,0.0001132205,0.0001138,0.00011436499999999999,0.000116705,0.000116733,0.000117322,0.00011752,0.00011761849999999999,0.00011814200000000001,0.00011818,0.000118632,0.00011920084337349399,0.00012025077215189879,0.00012107193506493506,0.000121107,0.00012436867499999999,0.00012447926250000005,0.0001250465189873417,0.00013852799999999999],"3801088":[0.25891197199999999,0.25894926900000004,0.25923538400000001,0.25957656800000001,0.26043065200000004,0.26134104050000001,0.26165643999999999,0.26272435700000002,0.26301314050000002,0.26441552200000001,0.26503335249999999,0.26602579450000002,0.267166599,0.2673474965,0.26746860100000003,0.26760661899999999,0.26830823500000001,0.27003692749999997,0.271907224,0.27350940800000001],"6815744":[0.48597116750000002,0.48766601700000001,0.488366458,0.48899538349999999,0.49040209200000001,0.49134961300000002,0.491373481,0.49192939700000005,0.49279937299999999,0.49302745299999995,0.4934975915,0.494733066,0.49595117,0.49746826599999999,0.49979469200000004,0.50199712949999997,0.50284437599999998,0.50351187649999996,0.50558650500000002,0.505898352],"124":[1.2629100000000001e-06,1.2700999999999999e-06,1.2742600000000002e-06,1.29024e-06,1.3070999999999999e-06,1.3139099999999999e-06,1.31603e-06,1.3196099999999999e-06,1.31996e-06,1.3254e-06,1.3254599999999998e-06,1.3270500000000001e-06,1.3282100000000001e-06,1.32981e-06,1.3425500000000002e-06,1.3432900000000001e-06,1.3698399999999998e-06,1.4041999999999998e-06,1.4314e-06,1.47137e-06],"102400":[0.0021908707499999993,0.0022068579999999999,0.0022213552499999998,0.0022274715000000001,0.0022371080000000002,0.002237977500000001,0.002244069,0.0022471635000000001,0.0022607312500000001,0.0022726222499999996,0.0022742567499999988,0.0022757959999999992,0.00227911075,0.0022815417499999998,0.002283088,0.002306075250000008,0.0023107272500000006,0.0023503463333333328,0.002490183,0.0028444450000000001],"311296":[0.0088757840000000029,0.0091986110000000006,0.0092367170000000037,0.0092536990000000006,0.0093307819999999993,0.0093360470000000001,0.0093587760000000027,0.009390532,0.009395744000000001,0.0094085819999999969,0.009433689999999998,0.0094461634999999967,0.0095840439999999999,0.0095968535000000039,0.0096818390000000028,0.0096879519999999997,0.0097901705000000006,0.0099640484999999994,0.010183129000000004,0.010209920500000001],"1408":[1.9624e-05,1.9695999999999999e-05,1.9922999999999999e-05,2.0006000000000001e-05,2.0177e-05,2.0412709999999999e-05,2.0527109999999999e-05,2.0598719999999998e-05,2.0647999999999999e-05,2.0670957142857143e-05,2.0762929999999999e-05,2.0867580000000002e-05,2.0952530000000002e-05,2.103779e-05,2.1086459999999999e-05,2.1365809999999999e-05,2.141862e-05,2.156e-05,2.162557e-05,2.1826269999999999e-05],"393216":[0.012945172,0.0130352105,0.0132741575,0.013301901,0.013318459,0.013399038,0.013424792,0.013437187999999999,0.013453386999999992,0.013488535000000024,0.013682465,0.013723325,0.013801320000000001,0.0139272405,0.013931056000000006,0.014000664999999999,0.014060256,0.0144375045,0.017015791499999999,0.020213641000000011],"4352":[6.0909999999999998e-05,6.1787999999999999e-05,6.2421000000000004e-05,6.3969999999999999e-05,6.4758000000000006e-05,6.5167320000000003e-05,6.5211500000000004e-05,6.5298219999999999e-05,6.5331850000000007e-05,6.5579289999999997e-05,6.5717960000000007e-05,6.6751181818181819e-05,6.6865897959183672e-05,6.7225940000000006e-05,6.7230999999999994e-05,6.7677999999999998e-05,6.780434e-05,6.7808195652173904e-05,6.8345999999999999e-05,7.4665000000000004e-05],"6553600":[0.45977048500000001,0.45988885599999996,0.46457141550000003,0.46535075949999999,0.46551246299999999,0.4675682095,0.46833563899999997,0.46965409499999999,0.469974895,0.47008665799999999,0.47283119299999998,0.47318453599999999,0.47663240099999998,0.47719149900000002,0.47741329399999999,0.47905356499999996,0.47919786099999995,0.4801200115,0.48014954600000004,0.48417861099999998],"20480":[0.000338339,0.00033880899999999976,0.00033921,0.00035306400000000005,0.00035542800000000013,0.00035579999999999987,0.00035683399999999999,0.000357365,0.00035831673076923084,0.00036076415384615382,0.000361152,0.00036319499999999997,0.00036380707407407409,0.00036397599999999996,0.00036518433333333338,0.00036775600000000001,0.00037246734615384622,0.00037589703846153857,0.00037696099999999998,0.00039042043999999997],"608":[7.04967e-06,7.1494200000000002e-06,7.2088999999999997e-06,7.2374459459459457e-06,7.3524047619047615e-06,7.35643e-06,7.3756899999999997e-06,7.3780399999999998e-06,7.3888499999999996e-06,7.4057799999999998e-06,7.4639699999999996e-06,7.4774800000000003e-06,7.4942000000000002e-06,7.5650100000000003e-06,7.6438800000000001e-06,7.6635300000000008e-06,7.7482899999999993e-06,7.8032100000000008e-06,7.8287199999999998e-06,7.9533478260869566e-06],"2228224":[0.15237162100000001,0.15243880399999998,0.15448868199999999,0.1548880305,0.15673283700000001,0.15674307899999995,0.15707207549999999,0.15715317400000001,0.15716185099999999,0.157351833,0.15752007400000001,0.15753259350000001,0.1577265145,0.15796027100000001,0.15804803700000003,0.15808135300000001,0.158345602,0.15855068050000001,0.15943385900000001,0.16011465150000001],"36864":[0.00066871400000000027,0.00067827300000000007,0.00068237764285714281,0.00068465600000000018,0.00068806200000000014,0.00068914299999999992,0.00069372500000000029,0.00069891199999999999,0.00069904099999999996,0.00070299299999999996,0.00070562499999999998,0.00070596561538461536,0.00071255699999999973,0.00071716107692307697,0.00071899415384615373,0.00072400246153846138,0.00072821469230769222,0.00074450169230769214,0.0007848610000000002,0.00079842400000000005],"704":[8.5242500000000006e-06,8.7130810810810813e-06,8.7469999999999994e-06,8.7967454545454553e-06,8.8040000000000007e-06,8.8051600000000006e-06,8.8481200000000006e-06,8.89422e-06,8.9170499999999996e-06,9.0469999999999999e-06,9.0837299999999995e-06,9.1026199999999996e-06,9.1361052631578944e-06,9.1450899999999992e-06,9.2110800000000009e-06,9.2456666666666669e-06,9.3120833333333335e-06,9.3625700000000004e-06,9.4140500000000001e-06,9.5588499999999991e-06],"720896":[0.037218664000000012,0.037698343999999981,0.037750732999999981,0.037963882499999997,0.038638635999999997,0.038903846999999998,0.038910822999999997,0.039174094499999999,0.039225875,0.039372366499999999,0.039453611,0.039464416000000016,0.03951859199999997,0.041140293000000022,0.041646180499999998,0.041932741000000016,0.041942226999999999,0.043136522999999996,0.046065398,0.046411777500000015],"800":[9.133448275862069e-06,9.3193599999999998e-06,9.3786666666666671e-06,9.399019999999999e-06,9.4157300000000007e-06,9.4651299999999989e-06,9.4728100000000009e-06,9.5329100000000005e-06,9.561269999999999e-06,9.67653e-06,9.6900299999999991e-06,9.7139800000000008e-06,9.7617099999999991e-06,9.7781299999999992e-06,9.7865399999999996e-06,9.8574499999999983e-06,9.8613099999999989e-06,9.952780000000001e-06,9.9556499999999984e-06,1.0366666666666665e-05],"2621440":[0.191694113,0.193437045,0.19344368549999999,0.19509933300000001,0.19540281300000001,0.195704668,0.19712677149999999,0.197246017,0.19755394300000001,0.19840524600000001,0.19894609500000004,0.1990660215,0.19915012700000001,0.19919458999999995,0.20061462199999999,0.20091559850000001,0.20223809400000003,0.20418484049999999,0.20475078349999998,0.20533396399999998],"425984":[0.018008198,0.018191971000000001,0.018320587999999999,0.018704428000000002,0.018854596000000001,0.018872207000000002,0.018989291999999998,0.019005273999999992,0.019010714000000001,0.019073178999999992,0.019086222999999999,0.019153487,0.019274333000000001,0.019339479999999999,0.019342487999999998,0.019641235999999999,0.019734122999999999,0.019750631000000001,0.01980264,0.019886910000000001],"32768":[0.00056755,0.00057189099999999983,0.00058463550000000019,0.00058563699999999996,0.00058582700000000003,0.00059065681249999996,0.00059270299999999998,0.00059554837500000013,0.00059803699999999972,0.00059924512500000025,0.00060441999999999983,0.00061186740000000002,0.00061285553333333327,0.00061402406666666667,0.00061445662500000009,0.00061642199999999983,0.00061944699999999975,0.00062830500000000012,0.00063067540000000017,0.00063394479999999995],"12058624":[1.0952987519999999,1.0961674160000001,1.1017423239999999,1.1028612575000001,1.1033726050000001,1.107710296,1.1082860750000001,1.1096191019999999,1.1127684520000001,1.1131505234999999,1.1161421570000001,1.1178005485,1.1226596385000001,1.1229963919999999,1.1264186460000001,1.1319660195000001,1.135273507,1.136277883,1.1384321955000001,1.1395452045000001],"128":[1.2972700000000001e-06,1.2988499999999999e-06,1.3061000000000001e-06,1.31314e-06,1.3132599999999999e-06,1.3134099999999998e-06,1.31568e-06,1.3356599999999999e-06,1.3391100000000001e-06,1.3421499999999999e-06,1.3444499999999999e-06,1.3483300000000001e-06,1.3492899999999999e-06,1.3557500000000001e-06,1.36961e-06,1.37227e-06,1.3818000000000001e-06,1.38898e-06,1.3892900000000001e-06,1.4092200000000001e-06],"180224":[0.0048529840000000003,0.004873200999999998,0.0048867830000000004,0.0048908459999999999,0.0048983109999999998,0.0049346109999999985,0.004947763,0.0049503100000000003,0.0049524870000000002,0.0049560809999999985,0.004971339,0.0049836280000000004,0.0049885099999999998,0.004991681999999999,0.0050126829999999978,0.005016993,0.0050307049999999999,0.0050344250000000004,0.0051391659999999971,0.005168382],"224":[2.3959000000000002e-06,2.39741e-06,2.4140666666666669e-06,2.42236e-06,2.4246099999999999e-06,2.4294099999999998e-06,2.4311899999999998e-06,2.4430900000000001e-06,2.4502100000000001e-06,2.4508400000000002e-06,2.4513499999999998e-06,2.4953399999999999e-06,2.5048300000000001e-06,2.5078299999999999e-06,2.5116899999999997e-06,2.5126800000000004e-06,2.5153300000000003e-06,2.6760899999999998e-06,2.8341300000000001e-06,2.9055399999999998e-06],"736":[9.1101249999999994e-06,9.5202400000000002e-06,9.6032699999999996e-06,9.6108999999999997e-06,9.6356300000000001e-06,9.6462799999999997e-06,9.798129999999999e-06,9.8190000000000003e-06,9.827819999999999e-06,9.8742400000000005e-06,9.8926700000000006e-06,9.9150599999999999e-06,9.9281099999999997e-06,9.967190000000001e-06,9.9778199999999993e-06,1.0006e-05,1.0031650000000001e-05,1.0132999999999999e-05,1.017062e-05,1.0200029999999999e-05],"320":[3.4465899999999999e-06,3.4999300000000001e-06,3.5002299999999999e-06,3.5342799999999996e-06,3.5357900000000002e-06,3.5408899999999996e-06,3.5439100000000003e-06,3.55723e-06,3.5606700000000001e-06,3.5676299999999999e-06,3.58181e-06,3.5853499999999999e-06,3.6207099999999998e-06,3.6301200000000003e-06,3.64947e-06,3.6569499999999998e-06,3.6575900000000001e-06,3.7231200000000001e-06,3.8879000000000005e-06,4.1842999999999999e-06],"557056":[0.026119567,0.026332769999999998,0.026422391,0.026706296000000001,0.026777266000000004,0.026923505,0.026993712,0.027025248999999994,0.027041924000000002,0.0272396835,0.027269880999999989,0.027470592500000002,0.027800095,0.027994209999999999,0.028189743999999999,0.02847075,0.028485929,0.029268196,0.029816819000000001,0.030435727999999988],"832":[9.4630000000000007e-06,9.8051100000000011e-06,9.8079999999999999e-06,9.8158800000000006e-06,9.8253900000000001e-06,9.8277799999999996e-06,9.8555000000000008e-06,9.9009599999999995e-06,9.9231600000000007e-06,9.9313700000000008e-06,9.9337199999999991e-06,9.9459299999999995e-06,9.9707999999999995e-06,9.9817499999999998e-06,1.0072390000000001e-05,1.018173e-05,1.01852e-05,1.0420169999999999e-05,1.0765410000000001e-05,1.1105170000000001e-05],"9437184":[0.7442495495,0.74494678550000004,0.74742618599999999,0.74997365250000003,0.75223530350000001,0.75392503999999994,0.75419138799999996,0.75459421299999996,0.75613865300000005,0.75626529350000005,0.75862547849999995,0.75998670099999999,0.76117881899999995,0.76192785149999998,0.76253556249999999,0.76269103900000002,0.76292172749999998,0.76402609799999999,0.77205799850000001,0.7911937],"3584":[4.6789999999999998e-05,4.8285000000000003e-05,4.9747999999999999e-05,5.0022000000000003e-05,5.0168987341772154e-05,5.0450279999999999e-05,5.0517460000000003e-05,5.0749679999999998e-05,5.0760510416666671e-05,5.0953780219780213e-05,5.1066287234042556e-05,5.1117107526881718e-05,5.1161820000000003e-05,5.1902421686746989e-05,5.2014749999999999e-05,5.2070000000000001e-05,5.2233009999999993e-05,5.2666078651685391e-05,5.478084210526316e-05,5.5070532467532468e-05],"6291456":[0.55497450100000001,0.55601947200000001,0.55676150000000002,0.55696733899999995,0.56009136599999998,0.56185298400000006,0.56373634500000003,0.56395926100000004,0.56680924799999999,0.56797620199999999,0.570208983,0.57092905699999996,0.57127912250000001,0.57200003700000002,0.57258374600000006,0.57329750000000002,0.57348505849999998,0.57806052500000005,0.57932652699999998,0.58280219900000008],"256":[2.6692699999999996e-06,2.7211099999999999e-06,2.7495384615384616e-06,2.7662900000000002e-06,2.7666099999999998e-06,2.77257e-06,2.8113699999999999e-06,2.8183599999999997e-06,2.8289999999999999e-06,2.8319499999999996e-06,2.8323900000000003e-06,2.8419699999999997e-06,2.8565500000000002e-06,2.8644999999999998e-06,2.8982299999999996e-06,2.9109699999999998e-06,2.9651800000000003e-06,3.04147e-06,3.0662700000000002e-06,3.2380100000000004e-06],"15204352":[1.1535099445000001,1.1650327665,1.1667332699999999,1.1667637625,1.1682685479999999,1.1688445679999999,1.1704540910000001,1.172877344,1.1746708350000001,1.1771394055,1.1775770269999999,1.1776175124999999,1.181950751,1.1856663175,1.1880600299999999,1.192824179,1.1939221165,1.1947741279999999,1.1977975810000001,1.2001659975000001],"28672":[0.0004711705000000002,0.00047128699999999981,0.000476226,0.00048128500000000002,0.00048144750000000004,0.00048861599999999988,0.00049500815789473669,0.00049691600000000002,0.000497789,0.00049845300000000016,0.00050080194736842074,0.0005013979999999998,0.00050258800000000021,0.00050427899999999984,0.00050434882352941182,0.00050495900000000003,0.00050570315789473671,0.0005166875,0.00051751994736842094,0.00052979400000000032],"768":[1.0224240000000001e-05,1.0239e-05,1.0276866666666666e-05,1.030259e-05,1.05166e-05,1.0572240000000001e-05,1.058467e-05,1.0588509999999999e-05,1.0588920000000001e-05,1.06625e-05,1.0688e-05,1.070832e-05,1.077455e-05,1.077871e-05,1.083412e-05,1.085124e-05,1.0871e-05,1.091023e-05,1.0931359999999999e-05,1.1380310000000001e-05],"212992":[0.0053616529999999983,0.0054198440000000001,0.0054383369999999971,0.0054513870000000002,0.0055254359999999999,0.0055436509999999984,0.0055575549999999996,0.0055615349999999977,0.0055934169999999981,0.0056980579999999989,0.0057305640000000022,0.00576298,0.0057997380000000022,0.0058433030000000019,0.0058600480000000022,0.005904935,0.0061523259999999988,0.0062061999999999968,0.0064497400000000024,0.0084018519999999996],"864":[9.91e-06,1.0118469999999999e-05,1.0270880000000001e-05,1.0354419999999998e-05,1.035825e-05,1.0365333333333334e-05,1.0369710000000001e-05,1.0417999999999999e-05,1.049037e-05,1.0521949999999998e-05,1.0541229999999999e-05,1.056111e-05,1.057854e-05,1.0642439999999999e-05,1.064748e-05,1.0688e-05,1.0709149999999999e-05,1.0755820000000001e-05,1.080271e-05,1.0879299999999999e-05],"352":[3.8212199999999996e-06,3.9352799999999997e-06,3.9498199999999996e-06,3.9628999999999998e-06,3.9709800000000001e-06,3.97667e-06,4.00039e-06,4.005765625e-06,4.0278800000000003e-06,4.0311299999999998e-06,4.0602700000000003e-06,4.0840199999999999e-06,4.0844299999999998e-06,4.0856600000000003e-06,4.0897099999999998e-06,4.1379400000000001e-06,4.1809900000000004e-06,4.2957799999999999e-06,4.3086900000000001e-06,4.6966500000000002e-06],"253952":[0.0066960730000000012,0.0068443480000000027,0.0068643609999999968,0.0068666370000000001,0.0068772519999999978,0.0069577990000000032,0.0069588310000000013,0.0069706660000000004,0.006979669,0.006997952,0.0070102189999999998,0.0071847600000000001,0.0072281149999999985,0.0072845290000000005,0.007287773,0.0073141600000000001,0.0073415519999999986,0.0074019080000000004,0.008838547999999993,0.010422836],"960":[1.1651459999999999e-05,1.17255e-05,1.179706e-05,1.1800969999999999e-05,1.1838240000000001e-05,1.1841000000000001e-05,1.1861639999999999e-05,1.202479e-05,1.2050120000000001e-05,1.2067619999999999e-05,1.208586e-05,1.208621e-05,1.209706e-05,1.2204390000000001e-05,1.2211139999999998e-05,1.2239200000000001e-05,1.2315180000000001e-05,1.239567e-05,1.240412e-05,1.2415224489795917e-05],"24576":[0.00044919799999999972,0.00045284000000000004,0.00045553100000000001,0.00046114999999999974,0.00046725499999999992,0.0004719851,0.00047300400000000012,0.000473864,0.00047715300000000002,0.00047719699999999979,0.000477403,0.00048135924999999997,0.00048154299999999997,0.00048198520000000011,0.00048402965000000025,0.000484251,0.00048565735000000019,0.00048572105000000023,0.00049706724999999999,0.00049851957894736835],"7680":[0.000106871,0.00010755300000000001,0.000108348,0.00010849360000000001,0.000108645,0.000109691,0.000110043,0.00011108,0.000111121,0.000111427875,0.00011174487500000001,0.00011243099999999999,0.0001128095,0.000113368,0.000115221,0.00011594793975903614,0.00011798600000000001,0.000118256,0.00011943325609756097,0.0001209],"294912":[0.0082492199999999981,0.00826146,0.0082968859999999998,0.0084121219999999993,0.0085893529999999992,0.0085926900000000001,0.0087229759999999969,0.0087327299999999993,0.0087547609999999998,0.0087655980000000029,0.0087899140000000063,0.008800113,0.0088021700000000033,0.0089337760000000026,0.0089669310000000026,0.0090701689999999995,0.0095233950000000005,0.0096077550000000008,0.010444543000000004,0.0104549775],"1048576":[0.062630961999999998,0.063526896999999999,0.063541483999999968,0.064021546999999998,0.064147773000000033,0.064317548999999988,0.06444664550000001,0.064907113000000002,0.065207736000000002,0.065566121000000005,0.065700197499999974,0.065781114000000002,0.06586225200000001,0.065870975999999998,0.06715631150000001,0.067980422999999998,0.067981192999999968,0.070214683999999999,0.072142682,0.072759239000000003],"10485760":[0.86568158900000003,0.86741633650000005,0.86871597600000006,0.86917854049999999,0.87365544350000002,0.87446930899999997,0.87467550599999999,0.87602448099999997,0.88261071550000003,0.88824244699999999,0.8888007805,0.88929980799999997,0.88981829999999995,0.89110027000000003,0.89141621250000003,0.89208129200000008,0.89212591799999996,0.89523776450000003,0.90075179950000006,0.90652990999999994],"344064":[0.010605162,0.010744228,0.010765594,0.010768040999999999,0.010792807,0.0108001955,0.010912566,0.011054576999999999,0.011087909,0.01109275,0.011104414999999994,0.0112104875,0.011272112000000001,0.011347827499999999,0.012113452,0.0122074465,0.013061807,0.013203616,0.017225214999999999,0.018295000499999999],"288":[3.08544e-06,3.0900399999999999e-06,3.1036100000000001e-06,3.1320099999999997e-06,3.16217e-06,3.1695099999999997e-06,3.1851299999999998e-06,3.19775e-06,3.2042600000000001e-06,3.2046000000000002e-06,3.213493670886076e-06,3.2163100000000003e-06,3.2323e-06,3.2610899999999997e-06,3.2837300000000004e-06,3.3028700000000002e-06,3.3053599999999999e-06,3.3809999999999999e-06,3.40543e-06,3.5568800000000001e-06],"1152":[1.4328000000000001e-05,1.4494176470588234e-05,1.4957410000000001e-05,1.497007e-05,1.4983130000000001e-05,1.4990050000000001e-05,1.503262e-05,1.5066770000000001e-05,1.512078e-05,1.5142160000000001e-05,1.515459e-05,1.519261e-05,1.520101e-05,1.5248349999999999e-05,1.5339809999999999e-05,1.5361899999999999e-05,1.5758999999999999e-05,1.5770899999999998e-05,1.5773279999999999e-05,1.7492478260869565e-05],"384":[4.1950800000000002e-06,4.2385000000000002e-06,4.3485500000000001e-06,4.3561200000000002e-06,4.3600000000000006e-06,4.3601399999999994e-06,4.3913800000000003e-06,4.4386899999999997e-06,4.4535900000000002e-06,4.4650399999999999e-06,4.5198599999999994e-06,4.5736499999999998e-06,4.6380500000000004e-06,4.6605099999999995e-06,4.6780299999999995e-06,4.7097799999999997e-06,4.7356400000000003e-06,4.9599699999999995e-06,4.9638899999999993e-06,5.0153899999999996e-06],"2304":[3.1714999999999997e-05,3.1751000000000001e-05,3.1860000000000003e-05,3.1981250000000001e-05,3.2932119999999997e-05,3.3012056179775277e-05,3.3084080000000003e-05,3.3117582417582419e-05,3.3228239999999997e-05,3.3398709999999997e-05,3.3457960000000001e-05,3.3465460000000004e-05,3.3472720000000004e-05,3.3578999999999998e-05,3.3747000000000001e-05,3.4149749999999999e-05,3.430165e-05,3.4312582278481012e-05,3.4489549999999999e-05,3.5417753246753243e-05],"896":[1.0542499999999999e-05,1.0635000000000001e-05,1.065971e-05,1.0745399999999999e-05,1.076125e-05,1.079165e-05,1.095455e-05,1.104498e-05,1.1056869999999999e-05,1.109115e-05,1.110661e-05,1.11246e-05,1.116313e-05,1.12673e-05,1.1321099999999999e-05,1.136105e-05,1.1427830000000001e-05,1.162546e-05,1.1726830000000001e-05,1.2554689655172414e-05],"480":[5.3657600000000001e-06,5.4218000000000003e-06,5.4229400000000005e-06,5.4842300000000003e-06,5.4869599999999999e-06,5.4963600000000002e-06,5.4987600000000004e-06,5.5714999999999999e-06,5.5726825396825403e-06,5.5848299999999999e-06,5.6350499999999995e-06,5.6467400000000008e-06,5.6494399999999999e-06,5.66925e-06,5.6730900000000001e-06,5.6739400000000003e-06,5.8080952380952381e-06,5.8267400000000007e-06,5.8401399999999996e-06,5.9177299999999997e-06],"1441792":[0.10046778000000001,0.10051832099999999,0.100760602,0.100922637,0.101028322,0.10103970600000001,0.10110897749999997,0.1017615565,0.102071839,0.10224744400000001,0.1035941955,0.10471188100000001,0.10523071849999999,0.10540930699999999,0.1059088935,0.10602257,0.10638168399999998,0.1072515175,0.11028908649999999,0.11142094750000001],"992":[1.1924500000000001e-05,1.2102666666666667e-05,1.2148949999999998e-05,1.2243379999999999e-05,1.225916e-05,1.233518e-05,1.2344120000000001e-05,1.242523e-05,1.2442333333333333e-05,1.2464729999999998e-05,1.2473609999999999e-05,1.2485580000000002e-05,1.248704e-05,1.25022e-05,1.2509450000000001e-05,1.251966e-05,1.2736379999999999e-05,1.274959e-05,1.2794180000000001e-05,1.2806429999999999e-05],"3968":[5.4713999999999998e-05,5.5950250000000002e-05,5.6059e-05,5.6079999999999998e-05,5.6116000000000003e-05,5.6124e-05,5.6233999999999997e-05,5.7169000000000001e-05,5.7210521126760562e-05,5.739623e-05,5.7834019999999997e-05,5.7871550000000007e-05,5.8472928571428569e-05,5.8474676470588235e-05,5.8668990000000003e-05,5.8933565217391553e-05,5.9002000000000002e-05,5.9045549999999999e-05,5.9241600000000006e-05,6.408799e-05],"6400":[8.3868000000000004e-05,8.4154076923076925e-05,8.4628000000000004e-05,8.5678000000000002e-05,8.6398999999999997e-05,8.7819166666666668e-05,8.7905999999999995e-05,8.808474999999999e-05,8.8348000000000002e-05,8.8457999999999999e-05,8.8869419999999995e-05,8.8895999999999997e-05,8.93916e-05,8.9585440000000007e-05,8.992553e-05,8.9958999999999997e-05,9.0409444444444444e-05,9.0883875000000004e-05,9.1817000000000005e-05,0.000102963],"1344":[1.8192166666666668e-05,1.8795333333333333e-05,1.8817e-05,1.8827630000000001e-05,1.9021360000000001e-05,1.9055410000000001e-05,1.90723e-05,1.9142000000000001e-05,1.9199469999999999e-05,1.9212499999999999e-05,1.9222e-05,1.9292509999999999e-05,1.9307790000000001e-05,1.9312970000000001e-05,1.9353428571428572e-05,1.9354299999999999e-05,1.9478420000000001e-05,1.9497494736842104e-05,1.9552299999999999e-05,2.0067869999999999e-05],"126976":[0.0029034036666666669,0.0029215700000000009,0.002932400999999999,0.0029385463333333342,0.002944574000000001,0.0029610683333333339,0.0029713246666666663,0.0029789633333333343,0.002980384,0.0029882420000000003,0.002990164,0.0030003993333333331,0.0030173440000000008,0.003018317,0.0030239973333333328,0.0030492263333333335,0.0030527866666666672,0.0030536810000000008,0.0031295449999999988,0.0032813154999999997],"2883584":[0.22294123800000001,0.22427509899999998,0.22483707900000005,0.22516341249999999,0.22528577399999999,0.22656281,0.22723874799999999,0.22835995100000001,0.22842726000000002,0.22966439499999999,0.23010033050000001,0.231291949,0.23351764,0.23354289900000003,0.23368108799999998,0.23391738950000002,0.23566254450000002,0.2384456855,0.23844774600000002,0.24162817],"753664":[0.039429828,0.040073308999999981,0.040139157000000002,0.040491341,0.040898528999999996,0.040906618999999998,0.041131393999999988,0.041493206000000019,0.041638408000000002,0.041700797000000005,0.041718297000000001,0.041871416999999987,0.041984581,0.042370231500000008,0.042386243500000004,0.042463469000000018,0.043198488,0.043357862999999996,0.043895732999999992,0.049166684500000002],"16384":[0.00024390700000000002,0.00024502299999999992,0.00024583900000000003,0.00024786200000000001,0.00024791,0.00024802200000000003,0.00024898699999999999,0.00025465150000000001,0.000259898,0.0002603185,0.00026036736111111113,0.00026192000000000001,0.00026243499999999999,0.00026262148648648656,0.00026317702777777776,0.00026561961111111108,0.00026718183783783786,0.00027171138888888908,0.00027178461111111105,0.00027239275000000014],"131072":[0.0030474146666666668,0.0030796736666666665,0.0030877753333333332,0.0030972300000000007,0.003099039,0.0031038393333333325,0.0031069219999999998,0.0031153489999999995,0.0031284060000000002,0.0031311073333333329,0.0031351930000000001,0.0031618466666666666,0.003183307666666667,0.0031899846666666662,0.0031937953333333333,0.0032150120000000006,0.0032985659999999984,0.0033245625000000016,0.0033415840000000016,0.0035504880000000001],"458752":[0.020232258999999999,0.020436097,0.020522732000000002,0.020551758999999992,0.020616923000000002,0.020667469000000001,0.020738514,0.020805802000000002,0.020823005999999998,0.020883707000000005,0.020888818,0.021168751999999999,0.021328885499999999,0.021439769999999969,0.021443021,0.021608169,0.021800686,0.021863637499999998,0.021926992000000006,0.027050867499999999],"172032":[0.0044446395,0.0045227085,0.004543287,0.0045483199999999998,0.0045511814999999976,0.0045553455000000003,0.0045592709999999967,0.0045747615000000033,0.0046161845000000012,0.0046198280000000003,0.0046550860000000001,0.0046560450000000019,0.0046614995000000001,0.0046746955000000001,0.004687852000000001,0.0047053990000000016,0.0047071589999999998,0.0047103270000000003,0.004726058,0.0049200859999999997],"12288":[0.000215835,0.00021648066666666663,0.00021674800000000011,0.000217932,0.000218199,0.0002249915,0.00022582166666666663,0.00022694350000000002,0.00022768699999999991,0.000229461,0.00023015700000000001,0.00023290469047619052,0.00023357911904761902,0.00023497200000000004,0.00023669604878048768,0.00023834019512195123,0.00023847626829268291,0.00023861349999999997,0.00023898180487804877,0.00024006613157894738],"14680064":[1.104485299,1.113684339,1.1144609235,1.1179540830000001,1.120321576,1.1258708719999999,1.1277139675000001,1.1288373789999999,1.13072039,1.1321875260000001,1.1331515889999999,1.1333434040000001,1.135486279,1.1404243110000001,1.14075511,1.145335918,1.146533051,1.151600655,1.1542791220000002,1.1577282170000001],"1536":[2.274175e-05,2.276457142857143e-05,2.2826333333333335e-05,2.2867545454545456e-05,2.3028833333333336e-05,2.3192000000000001e-05,2.3442210000000001e-05,2.3639059999999999e-05,2.3713570000000001e-05,2.392603e-05,2.3961559999999998e-05,2.3992459999999998e-05,2.4107499999999999e-05,2.4172999999999997e-05,2.4218050000000001e-05,2.4447200000000002e-05,2.451197e-05,2.4774409999999999e-05,2.4814270000000002e-05,2.5366839999999999e-05],"25600":[0.00038640099999999998,0.00039511,0.00039728000000000002,0.00040229350000000003,0.00040742099999999999,0.00040773099999999988,0.000420357,0.000421211,0.000423717,0.00042465199999999986,0.00042474799999999997,0.00043091699999999985,0.00043500177272727287,0.00043553999999999999,0.00043705009523809532,0.000442636,0.0004437327619047619,0.00044589,0.000457706,0.00045811642857142862],"1835008":[0.118644637,0.119345336,0.119640042,0.120386119,0.120551059,0.12069107699999999,0.120727889,0.120972144,0.12123930400000001,0.12174795099999999,0.12222996,0.12255839,0.12326427,0.1232772135,0.123549754,0.12361817999999999,0.12400322799999999,0.124425651,0.1247461505,0.12565484599999999],"10752":[0.00017370999999999991,0.00017501299999999996,0.00017617199999999999,0.00017765200000000001,0.00018308200000000005,0.00018362599999999999,0.00018387300000000006,0.000184267,0.000184537,0.00018508200000000001,0.00018526274,0.0001855429411764706,0.000186102,0.00018712898039215694,0.00018801420000000001,0.00018961623529411775,0.00019082276470588238,0.00019614900000000001,0.00019927764444444446,0.000199817],"21504":[0.00036131599999999998,0.000361541,0.0003668744999999999,0.00036747600000000004,0.00038045,0.00038372028000000001,0.00038394375000000002,0.00038583599999999997,0.00038885500000000002,0.00039210566666666666,0.00039264520833333318,0.00039462249999999986,0.00039491441666666667,0.00039636633333333348,0.00039747524999999998,0.00039998599999999991,0.0004006295833333333,0.00040409800000000003,0.000443879,0.00045386299999999999],"7602176":[0.54923713100000005,0.55139151199999992,0.55478128199999999,0.55774458399999993,0.55897815100000003,0.55937495800000003,0.56021564699999993,0.56150627750000004,0.56244153299999999,0.56263242599999996,0.56464802300000005,0.56601662899999994,0.56689915550000003,0.56696250500000001,0.56710675199999994,0.56823611549999997,0.57075277749999997,0.57349253899999997,0.57413484799999992,0.57790925449999997],"5632":[9.1904750000000005e-05,9.2887999999999996e-05,9.332116666666667e-05,9.3553000000000004e-05,9.4310999999999999e-05,9.46915e-05,9.4700333333333332e-05,9.5048538461538462e-05,9.5622499999999995e-05,9.6094000000000005e-05,9.6310000000000005e-05,9.7510000000000007e-05,9.7672999999999998e-05,9.7807999999999996e-05,9.8002190000000001e-05,9.8270200000000007e-05,9.9235604166666668e-05,9.9315999999999996e-05,9.9805484536082478e-05,0.000102062],"10":[9.851e-08,9.9809999999999992e-08,9.9899999999999988e-08,1.0021999999999999e-07,1.0042e-07,1.0048e-07,1.009e-07,1.0142e-07,1.0186e-07,1.0373999999999999e-07,1.0389e-07,1.0389e-07,1.0390000000000001e-07,1.0393e-07,1.048e-07,1.0491e-07,1.0516999999999999e-07,1.0566000000000001e-07,1.0678000000000001e-07,1.0697e-07],"3145728":[0.26118597100000002,0.26158878100000005,0.26222556400000002,0.26262002899999998,0.26267433849999999,0.263982526,0.26415671899999998,0.26417081399999998,0.26524017300000002,0.26627984199999999,0.26689485200000002,0.26693538999999999,0.26748013349999999,0.267788623,0.26845088900000003,0.26965929500000002,0.27054116900000003,0.27081311549999998,0.27161078999999999,0.27726695400000001],"245760":[0.0065026039999999978,0.0065080190000000012,0.0065396280000000013,0.0065396510000000022,0.006576798,0.0065838750000000029,0.0066859200000000032,0.0067063669999999978,0.0067142190000000004,0.0067766509999999973,0.0068042499999999978,0.0068817009999999996,0.0068825919999999999,0.006912194,0.0069484600000000035,0.0070576290000000028,0.0070932950000000021,0.0072583389999999999,0.007355515,0.0079189040000000009],"1728":[2.1007000000000001e-05,2.1271500000000001e-05,2.1639999999999999e-05,2.1676965517241378e-05,2.17746e-05,2.1878570000000002e-05,2.1937227272727273e-05,2.212468e-05,2.2148329999999998e-05,2.2154530000000001e-05,2.2166540000000001e-05,2.2386030303030303e-05,2.2387567567567567e-05,2.2399419999999999e-05,2.2437510000000001e-05,2.2623999999999999e-05,2.2710050000000001e-05,2.2799470000000002e-05,2.2877489999999998e-05,2.290294e-05],"11":[1.0907999999999999e-07,1.1032e-07,1.1035000000000001e-07,1.1068e-07,1.1089e-07,1.1108e-07,1.1133e-07,1.1202999999999999e-07,1.1296e-07,1.1417999999999999e-07,1.1442e-07,1.1474000000000001e-07,1.1493e-07,1.1511999999999999e-07,1.1607999999999999e-07,1.17e-07,1.1709e-07,1.1767999999999999e-07,1.1817000000000001e-07,1.1834e-07],"1114112":[0.068565965000000034,0.069372921500000004,0.069668197500000001,0.070112509999999989,0.070120712000000002,0.07036709200000002,0.070698201500000002,0.070892488999999975,0.070926289000000003,0.071027488,0.071422195999999952,0.071609119999999998,0.07167702300000002,0.072335555999999995,0.072337892000000029,0.072984900500000005,0.073011515999999999,0.074532561499999997,0.076127100000000017,0.077341914999999997],"12":[1.1943999999999999e-07,1.2048e-07,1.2052e-07,1.2053000000000001e-07,1.2135000000000001e-07,1.2357000000000001e-07,1.2382999999999999e-07,1.2433e-07,1.2468e-07,1.2477e-07,1.2490000000000001e-07,1.2506999999999999e-07,1.2508999999999999e-07,1.2683999999999999e-07,1.2718999999999999e-07,1.2722e-07,1.2805000000000001e-07,1.2944e-07,1.3022000000000001e-07,1.3468000000000001e-07],"7340032":[0.52967788449999997,0.53355823199999997,0.53377249299999996,0.53434465399999997,0.53447450500000004,0.53448040699999999,0.53456475199999998,0.53474943400000008,0.53972019150000006,0.54028881650000005,0.54169368399999995,0.54239240999999994,0.54280639799999997,0.54360426049999999,0.54374142599999997,0.54423675699999996,0.54879652099999998,0.54910629499999997,0.55551485,0.557349019],"7168":[9.7266e-05,9.7295999999999998e-05,9.9078000000000002e-05,0.000100694,0.00010150899999999999,0.000102475,0.000102556,0.000103606,0.00010382362499999999,0.00010435076190476191,0.00010447785263157897,0.00010481041052631582,0.000105102,0.000105559,0.00010781828260869567,0.00010786899999999995,0.0001084065,0.00011589700000000001,0.000116926,0.00012012599999999999],"13":[1.2827e-07,1.2835000000000001e-07,1.2842999999999999e-07,1.2844e-07,1.2853999999999999e-07,1.2884000000000001e-07,1.2894000000000002e-07,1.2956999999999999e-07,1.297e-07,1.3023e-07,1.3098e-07,1.325e-07,1.3311000000000001e-07,1.3395000000000001e-07,1.3431000000000002e-07,1.3444e-07,1.3456999999999999e-07,1.3563e-07,1.3843e-07,1.5393e-07],"6029312":[0.515042043,0.51574092250000003,0.51780815099999999,0.520951779,0.52112367800000003,0.52323447000000001,0.52506332150000001,0.526498091,0.52788695500000005,0.52844597950000005,0.52888240149999999,0.52895015850000004,0.53143112400000003,0.53192948799999995,0.53232910300000003,0.53374884300000003,0.53555048900000002,0.53560287500000003,0.536008186,0.53769033799999999],"14":[1.3776000000000001e-07,1.3778999999999999e-07,1.3866e-07,1.3883000000000001e-07,1.3883999999999999e-07,1.3890000000000001e-07,1.3897999999999999e-07,1.3913999999999999e-07,1.3920999999999999e-07,1.4097e-07,1.4226999999999999e-07,1.4389999999999998e-07,1.4507000000000001e-07,1.4525999999999999e-07,1.4661000000000001e-07,1.4868999999999999e-07,1.494e-07,1.5296000000000001e-07,1.5726000000000002e-07,1.613e-07],"3200":[4.0895000000000001e-05,4.1399310000000003e-05,4.1852940000000003e-05,4.2185999999999999e-05,4.2191935483870967e-05,4.225886666666667e-05,4.2350312499999998e-05,4.2395159999999994e-05,4.312697e-05,4.325502e-05,4.3267000000000004e-05,4.3361900000000002e-05,4.3368790000000003e-05,4.3595020000000007e-05,4.3699319999999998e-05,4.392785e-05,4.4072190000000007e-05,4.4229600000000001e-05,4.4962999999999996e-05,4.7644500000000001e-05],"20":[1.9725e-07,1.9746999999999998e-07,1.9763e-07,1.9865e-07,1.9873000000000001e-07,1.9893e-07,1.9918000000000001e-07,1.9919999999999998e-07,2.0013999999999999e-07,2.0037000000000001e-07,2.0046000000000001e-07,2.0101e-07,2.0142000000000001e-07,2.0480000000000001e-07,2.0765999999999999e-07,2.0811e-07,2.1641000000000002e-07,2.1687000000000001e-07,2.1857e-07,2.2591000000000002e-07],"204800":[0.0049402440000000016,0.0050551669999999993,0.005217719,0.0052496659999999992,0.0052653380000000014,0.0052678219999999984,0.005274,0.0053098809999999981,0.0053198469999999999,0.0053351079999999999,0.0053893789999999997,0.0053952090000000006,0.0054123090000000023,0.005478709,0.0058433790000000018,0.0059486210000000003,0.0061543000000000014,0.0062557930000000008,0.0067373280000000034,0.0069517859999999997],"15":[1.4772e-07,1.4781e-07,1.4807e-07,1.4863e-07,1.4908000000000001e-07,1.4919e-07,1.4959e-07,1.4966999999999999e-07,1.5057e-07,1.5090000000000001e-07,1.5111999999999999e-07,1.5472999999999998e-07,1.5515000000000001e-07,1.5549999999999998e-07,1.5580000000000001e-07,1.5616000000000002e-07,1.5661000000000002e-07,1.5733999999999998e-07,1.5866999999999998e-07,1.6612999999999999e-07],"13312":[0.000180645,0.00018320700000000006,0.00018612699999999999,0.00018616500000000002,0.00018664849999999999,0.000187102,0.00018716177777777771,0.00018851099999999998,0.000191418,0.00019255272549019604,0.00019362900000000001,0.0001950026666666667,0.00019512499999999999,0.00019567900000000004,0.00019574249999999995,0.00020062539583333333,0.00020091800000000002,0.00020154474999999999,0.00020402968085106384,0.00021043921276595745],"4980736":[0.37048262399999998,0.37653037750000001,0.37667198999999996,0.37970628200000001,0.37978735399999997,0.38077720399999998,0.38142541299999999,0.38314466200000002,0.38323849799999998,0.38356549649999999,0.38403505700000001,0.38443157999999999,0.38513933,0.38568299900000003,0.38635110350000001,0.3879733045,0.38861185600000003,0.39037561900000001,0.39112933599999999,0.39183261400000002],"118784":[0.0026428276666666667,0.0026593646666666663,0.002675087,0.0026831370000000004,0.0027050186666666663,0.0027191343333333334,0.0027388033333333333,0.0027583360000000001,0.0027598379999999997,0.0027845073333333339,0.0028118026666666676,0.0028187306666666661,0.0028275926666666662,0.0028623249999999998,0.0028641043333333337,0.0028782013333333335,0.0028853069999999993,0.002915024,0.0030407759999999989,0.003555627],"51200":[0.00099386299999999999,0.0010091471111111107,0.001013726,0.0010169810000000001,0.0010261720000000001,0.0010270343333333334,0.0010305555555555558,0.001036258111111112,0.001043406,0.0010440847777777775,0.0010442926666666668,0.001046251111111111,0.0010463019999999994,0.0010483613750000001,0.0010507539999999999,0.0010525255555555555,0.0010538513333333333,0.0010643829999999999,0.0010975819999999999,0.00110994375],"16":[1.5668999999999998e-07,1.5776e-07,1.5812000000000002e-07,1.5823000000000001e-07,1.5909999999999999e-07,1.5937e-07,1.5939e-07,1.6019999999999999e-07,1.6461000000000002e-07,1.6569e-07,1.66e-07,1.6605000000000001e-07,1.6612999999999999e-07,1.6618e-07,1.6656999999999999e-07,1.6667000000000002e-07,1.6833e-07,1.6838999999999999e-07,1.7778000000000002e-07,1.8322e-07],"21":[2.0835999999999999e-07,2.0939999999999998e-07,2.1005999999999999e-07,2.1083000000000002e-07,2.1123000000000002e-07,2.1160000000000002e-07,2.1184e-07,2.1225000000000001e-07,2.1234000000000001e-07,2.1252e-07,2.1304999999999999e-07,2.1370000000000001e-07,2.1743999999999999e-07,2.1843999999999999e-07,2.185e-07,2.1916000000000001e-07,2.2221e-07,2.2263e-07,2.3017999999999999e-07,2.3988e-07],"917504":[0.05461684,0.054671727000000003,0.054748907000000013,0.054750791,0.05476226700000001,0.054965936999999999,0.054987355000000002,0.055042673999999958,0.055392567999999996,0.055618923000000001,0.05569094699999997,0.055988969,0.05602004,0.0560302165,0.056252935999999996,0.05626146000000002,0.056775769999999982,0.057003994500000023,0.057852967500000019,0.058909903999999999],"22":[2.1506999999999998e-07,2.1582000000000001e-07,2.1672e-07,2.1800000000000002e-07,2.1835999999999998e-07,2.1931999999999998e-07,2.199e-07,2.2078000000000002e-07,2.2240000000000001e-07,2.2382999999999999e-07,2.2446000000000001e-07,2.2623999999999999e-07,2.2765e-07,2.2826000000000001e-07,2.293e-07,2.3152000000000002e-07,2.3264999999999998e-07,2.3740999999999998e-07,2.3785e-07,2.5344999999999998e-07],"4864":[7.2795999999999999e-05,7.3466000000000004e-05,7.3782000000000006e-05,7.4238000000000003e-05,7.4290999999999997e-05,7.4379000000000001e-05,7.5859000000000007e-05,7.6630428571428579e-05,7.6974260000000003e-05,7.7131370000000003e-05,7.7462019999999999e-05,7.7495304347826091e-05,7.8588679999999994e-05,7.8604339999999992e-05,7.9156916666666671e-05,7.9216449999999999e-05,7.9271791666666664e-05,7.9468999999999994e-05,7.9940666666666665e-05,8.1017272727272732e-05],"17":[1.677e-07,1.6787999999999999e-07,1.6815999999999999e-07,1.6866999999999999e-07,1.6874000000000001e-07,1.6884e-07,1.6903999999999998e-07,1.7087000000000002e-07,1.7309999999999998e-07,1.7350000000000001e-07,1.7363999999999999e-07,1.7515999999999999e-07,1.7676e-07,1.7694999999999998e-07,1.7733000000000001e-07,1.7870999999999999e-07,1.7876999999999998e-07,1.8006000000000001e-07,1.8738e-07,1.9264999999999999e-07],"14848":[0.00021239800000000001,0.00021366400000000007,0.00021474849999999994,0.00021627900000000005,0.000216939,0.00022122899999999992,0.00022271999999999995,0.00022450197368421057,0.00022528000000000001,0.00022531299999999999,0.00022537557142857139,0.000226445,0.00022661300000000002,0.00022781906976744186,0.000231859,0.000234813,0.00023489299999999999,0.00023705643589743585,0.00024112141025641032,0.00025611600000000013],"23":[2.2751999999999999e-07,2.2792000000000002e-07,2.2994000000000001e-07,2.3040999999999998e-07,2.3061000000000002e-07,2.3087e-07,2.3166000000000002e-07,2.3283999999999999e-07,2.3292e-07,2.3537e-07,2.3597000000000001e-07,2.3738e-07,2.3757999999999999e-07,2.3768999999999998e-07,2.4000000000000003e-07,2.4021e-07,2.4142e-07,2.4176000000000002e-07,2.5151000000000001e-07,2.5778999999999998e-07],"786432":[0.042891335999999988,0.042917727000000003,0.043944054999999996,0.04404194799999999,0.044101983999999976,0.044271008000000001,0.044350661,0.044402038000000012,0.044630204,0.045027026999999997,0.045450827000000013,0.046037636999999999,0.04679243000000001,0.047039802999999998,0.047447499000000004,0.04823264700000001,0.049207329000000008,0.049603894000000023,0.049907486000000001,0.051180321500000001],"18":[1.7713000000000003e-07,1.7742999999999999e-07,1.7744000000000001e-07,1.7761000000000001e-07,1.7788e-07,1.7875000000000001e-07,1.7881e-07,1.7931999999999999e-07,1.8036000000000001e-07,1.8167000000000001e-07,1.8301e-07,1.8308000000000002e-07,1.8433000000000001e-07,1.8465e-07,1.8498000000000001e-07,1.8580999999999999e-07,1.8731999999999999e-07,1.8775e-07,1.9147999999999999e-07,1.9247e-07],"1638400":[0.1052448845,0.10550709799999999,0.105602433,0.105765759,0.105949842,0.106834384,0.106872553,0.106896611,0.1071731475,0.107221988,0.10732989699999999,0.10755624599999999,0.107625912,0.107723127,0.10788093,0.10794941199999999,0.108023487,0.108138332,0.11004462700000001,0.110785681],"7864320":[0.57771382000000004,0.57828952600000005,0.57980971400000003,0.58187228700000004,0.58438658499999996,0.58439312700000001,0.58467640399999998,0.58613423050000002,0.58689561800000001,0.58749773750000001,0.59070058199999997,0.59123239699999997,0.5921846985,0.59365194600000004,0.59447056799999998,0.59476534299999995,0.595634581,0.59593540850000004,0.59680758099999998,0.59932035449999999],"24":[2.3689e-07,2.4158000000000002e-07,2.4255999999999997e-07,2.4257999999999999e-07,2.4386000000000001e-07,2.4474999999999996e-07,2.4478e-07,2.4517000000000002e-07,2.4674e-07,2.4700999999999999e-07,2.5031999999999998e-07,2.5053000000000001e-07,2.5086999999999997e-07,2.5208000000000002e-07,2.5227000000000002e-07,2.5371000000000001e-07,2.5480999999999999e-07,2.5632000000000001e-07,2.565e-07,2.5843000000000002e-07],"14155776":[1.0675632859999999,1.0708293764999999,1.072737858,1.077282847,1.0780575670000001,1.0788800519999999,1.0797603775,1.081012772,1.0847071445000001,1.0852949445,1.0877708589999999,1.0881535505,1.0890579895000001,1.0911221055,1.0911426835,1.0916603199999999,1.0958931199999999,1.097202214,1.1060608599999999,1.112920414],"19":[1.8638999999999999e-07,1.8731999999999999e-07,1.8777999999999998e-07,1.8868999999999998e-07,1.8870000000000002e-07,1.9100999999999999e-07,1.9132e-07,1.9160999999999998e-07,1.9242e-07,1.9245999999999999e-07,1.9417e-07,1.9457e-07,1.9553999999999999e-07,1.9694000000000002e-07,1.9789999999999999e-07,2.0043999999999999e-07,2.0528e-07,2.0655999999999999e-07,2.1101999999999999e-07,2.1563999999999999e-07],"30":[2.9276999999999999e-07,2.9354999999999998e-07,2.9394e-07,2.9400999999999997e-07,2.9458999999999999e-07,2.9531000000000002e-07,2.9532999999999998e-07,2.9698e-07,2.9702e-07,2.9749e-07,2.9858999999999998e-07,3.0065999999999999e-07,3.0399000000000001e-07,3.0564000000000003e-07,3.0630000000000004e-07,3.0842e-07,3.0851e-07,3.0874000000000005e-07,3.0892000000000004e-07,3.3606000000000001e-07],"25":[2.4437000000000001e-07,2.4460000000000001e-07,2.4825000000000002e-07,2.5051000000000004e-07,2.515e-07,2.5222000000000002e-07,2.5226000000000001e-07,2.5320000000000002e-07,2.5365e-07,2.5429999999999999e-07,2.5502000000000002e-07,2.5513000000000004e-07,2.5543e-07,2.5638000000000002e-07,2.5638999999999998e-07,2.5690999999999999e-07,2.5846e-07,2.6028e-07,2.6472e-07,2.6675000000000003e-07],"31":[3.0311000000000002e-07,3.0497999999999997e-07,3.0564000000000003e-07,3.0762e-07,3.0896999999999999e-07,3.0960000000000002e-07,3.1213000000000003e-07,3.1303999999999995e-07,3.1311999999999999e-07,3.1335999999999999e-07,3.1380000000000002e-07,3.1483000000000002e-07,3.1553000000000002e-07,3.1569000000000004e-07,3.1835000000000004e-07,3.2179999999999998e-07,3.2339000000000004e-07,3.2415e-07,3.2941999999999999e-07,3.3742000000000001e-07],"1280":[1.6994500000000001e-05,1.7032064516129031e-05,1.7116222222222222e-05,1.7123333333333333e-05,1.7232999999999999e-05,1.7247787878787879e-05,1.73307e-05,1.7345439024390244e-05,1.7463389999999999e-05,1.7482241379310348e-05,1.7682530000000001e-05,1.7755389999999999e-05,1.7755589999999999e-05,1.792415e-05,1.7995790000000001e-05,1.8128650000000001e-05,1.820031e-05,1.836019e-05,1.8498599999999999e-05,1.896449e-05],"26":[2.5349999999999999e-07,2.5390000000000002e-07,2.5497000000000001e-07,2.579e-07,2.5813e-07,2.5949e-07,2.6057000000000001e-07,2.6094000000000001e-07,2.6179000000000002e-07,2.6225999999999997e-07,2.6297999999999999e-07,2.6333999999999997e-07,2.6341e-07,2.6563999999999999e-07,2.6675999999999999e-07,2.6740999999999998e-07,2.7070000000000001e-07,2.7259999999999999e-07,2.7682000000000001e-07,2.9037000000000003e-07],"3932160":[0.2668138095,0.26720764799999996,0.26884593699999998,0.26917898350000002,0.27084709299999998,0.27220773549999999,0.2733321185,0.27394774700000002,0.27398730100000002,0.275371802,0.2754716035,0.27551364700000003,0.27575150400000004,0.27575561399999998,0.27581189699999997,0.27636041,0.27654698900000002,0.27730881200000002,0.277676115,0.287767192],"2432":[3.4709000000000003e-05,3.4820500000000003e-05,3.578e-05,3.5797999999999998e-05,3.5995999999999999e-05,3.6083069999999998e-05,3.6120820000000003e-05,3.617422807017544e-05,3.6362000000000002e-05,3.6383e-05,3.6395130000000002e-05,3.6537179999999998e-05,3.6715999999999999e-05,3.696418e-05,3.7058060000000001e-05,3.7299029999999999e-05,3.7520700000000001e-05,3.7585e-05,3.7697857142857141e-05,3.8528449999999999e-05],"32":[3.1302999999999999e-07,3.1456999999999999e-07,3.1501000000000001e-07,3.1825000000000003e-07,3.192e-07,3.1922999999999998e-07,3.2072000000000003e-07,3.2175000000000003e-07,3.2282000000000003e-07,3.2301000000000003e-07,3.2375000000000002e-07,3.2379999999999997e-07,3.2397999999999997e-07,3.2753999999999998e-07,3.2898999999999998e-07,3.2999000000000001e-07,3.3253000000000003e-07,3.3433000000000006e-07,3.3819000000000004e-07,3.4897999999999999e-07],"27":[2.6479999999999999e-07,2.6594000000000001e-07,2.6756e-07,2.6775e-07,2.6804999999999997e-07,2.6842000000000002e-07,2.6890999999999999e-07,2.7001000000000002e-07,2.7328999999999998e-07,2.7341000000000001e-07,2.7368999999999996e-07,2.7476000000000001e-07,2.7552999999999998e-07,2.7579000000000001e-07,2.7693999999999999e-07,2.7777999999999999e-07,2.7804000000000002e-07,2.8317999999999997e-07,2.8599999999999999e-07,2.8849000000000001e-07],"409600":[0.017242905999999992,0.017619232000000006,0.017657391000000001,0.017707713,0.017724204000000021,0.017743907,0.017768147000000005,0.017808391999999999,0.017855463500000009,0.017900049000000001,0.017964079500000001,0.018234864,0.018456061000000006,0.018473314499999994,0.018755612000000005,0.019150955000000001,0.019157215999999998,0.019373280999999999,0.024068131,0.024184397]}},{"title":"OrderedDictionary subscript, successful lookups","results":{"28":[4.9697999999999994e-07,5.4098000000000007e-07],"34":[6.1457000000000003e-07,6.695800000000001e-07],"29":[5.3361999999999998e-07,5.5702000000000005e-07],"40":[7.7179e-07,8.6028999999999998e-07],"17408":[0.00047193099999999992,0.0005476603333333331],"1472":[4.2268399999999997e-05,4.5041480000000004e-05],"112":[2.0381099999999999e-06,2.0534375000000002e-06],"1376256":[0.22981168799999999,0.26778537499999999],"5242880":[1.0533272469999999,1.0608562694999999],"36":[6.6847999999999991e-07,6.8831999999999996e-07],"42":[8.0352000000000004e-07,9.3191999999999994e-07],"11534336":[2.6142648820000001,2.6418093324999998],"114688":[0.0048660539999999999,0.0048671245000000002],"144":[2.8453466666666668e-06,2.9844300000000002e-06],"38":[7.0640999999999998e-07,7.6225999999999994e-07],"240":[4.5547800000000003e-06,5.0784599999999995e-06],"9216":[0.00025883200000000002,0.00027156900000000004],"44":[8.7786000000000005e-07,1.00827e-06],"1664":[3.6735669999999999e-05,3.7286970000000002e-05],"196608":[0.012311692500000002,0.01246535],"155648":[0.007699428999999999,0.0077214699999999994],"2816":[8.0539681818181811e-05,8.6701999999999998e-05],"50":[9.4338000000000002e-07,9.5161999999999994e-07],"2359296":[0.40826227949999999,0.43156463950000001],"46":[9.1879000000000004e-07,1.0011399999999999e-06],"176":[3.7940100000000003e-06,4.0671800000000001e-06],"52":[9.2825000000000007e-07,9.768300000000001e-07],"272":[5.35859e-06,5.8413400000000006e-06],"116":[2.2779300000000002e-06,2.27941e-06],"47104":[0.0017461586,0.0017549468000000001],"6912":[0.00017302636842105265,0.00017478515789473684],"1856":[4.0212000000000001e-05,4.1265090000000005e-05],"48":[1.0014799999999999e-06,1.0687499999999999e-06],"2097152":[0.33738843499999999,0.33750116949999998],"54":[9.9724e-07,1.0327699999999999e-06],"2031616":[0.32009796299999999,0.3270030545],"43008":[0.0014306360000000001,0.001537828],"60":[1.1584e-06,1.18469e-06],"30720":[0.00084919930000000002,0.00089169977777777776],"56":[9.8983000000000002e-07,1.08444e-06],"62":[1.14364e-06,1.2672599999999999e-06],"58":[1.1077399999999998e-06,1.12318e-06],"3014656":[0.61790984250000003,0.61842136000000003],"64":[1.1956e-06,1.3334400000000001e-06],"8388608":[1.520739547,1.5460503215000001],"29696":[0.00080675008333333346,0.00080911100000000005],"216":[4.1131000000000005e-06,4.1556999999999999e-06],"106496":[0.0043189175,0.0044441180000000004],"72":[1.4156499999999999e-06,1.5275799999999999e-06],"442368":[0.027122377999999996,0.035048304500000009],"147456":[0.0074776900000000004,0.007485996],"4456448":[0.79525171299999997,0.83650818299999996],"63488":[0.002298774,0.0023827730000000004],"38912":[0.001189475,0.0012673532857142861],"68":[1.2821499999999999e-06,1.3435899999999999e-06],"188416":[0.011860912999999999,0.012610436499999999],"248":[4.7540700000000004e-06,5.1998900000000001e-06],"80":[1.5760099999999999e-06,1.6559499999999998e-06],"2560":[7.0225110000000007e-05,7.9171894736842103e-05],"34816":[0.0009984043333333332,0.001054606],"3712":[8.9324000000000001e-05,9.0755833333333323e-05],"3538944":[0.57175549800000003,0.57565617749999998],"76":[1.50582e-06,1.5975200000000001e-06],"4194304":[0.72830019899999998,0.73626390100000005],"851968":[0.09751262049999998,0.119426991],"4096":[0.00010267890361445784,0.000111789],"59392":[0.0019988789999999998,0.0021083317500000002],"84":[1.7065857142857143e-06,1.7542100000000001e-06],"3276800":[0.50438632500000002,0.52256993500000004],"55296":[0.0017591946000000008,0.0019285749999999996],"688128":[0.069058638500000019,0.095005166999999988],"8192":[0.00022660599999999999,0.00022966269767441864],"10240":[0.00029131299999999997,0.00030568000000000001],"15872":[0.00042599400000000001,0.00044433500000000002],"92":[1.9813800000000001e-06,2.0931136363636362e-06],"26624":[0.00067248199999999996,0.00070339199999999973],"1792":[3.9949330000000003e-05,4.1386080000000005e-05],"11776":[0.00040457004166666668,0.000407315],"2944":[8.747355555555556e-05,9.0127450000000004e-05],"88":[1.82686e-06,1.9287599999999998e-06],"22528":[0.00073902400000000013,0.00077643699999999994],"1245184":[0.18275049500000001,0.23325153900000001],"15728640":[2.9556755049999999,3.0045141100000001],"96":[1.9677199999999999e-06,2.06639e-06],"1984":[4.56786e-05,4.7620999999999997e-05],"139264":[0.0064035249999999985,0.0066612930000000004],"475136":[0.030861448,0.045263014999999997],"13631488":[2.5407980100000001,2.6005680079999998],"416":[8.3081900000000005e-06,8.3180200000000004e-06],"928":[1.9416670000000001e-05,2.048576e-05],"512":[1.103442e-05,1.11447e-05],"18432":[0.00055259000000000016,0.00060152666666666665],"16777216":[3.2794611709999999],"9728":[0.00028906770588235295,0.00029688670000000008],"1769472":[0.25353151099999999,0.27983412699999999],"1703936":[0.24321703,0.249318813],"2048":[4.5914399999999995e-05,4.7801060000000003e-05],"14336":[0.00035165399999999996,0.00037954195833333332],"448":[8.9858699999999994e-06,9.0634000000000003e-06],"5505024":[1.1606408450000001,1.1660742104999999],"544":[1.1558689999999999e-05,1.1958750000000001e-05],"221184":[0.010095082,0.010341438999999999],"90112":[0.0042271079999999994,0.004581899500000001],"640":[1.5040909999999999e-05,1.572477e-05],"12800":[0.0003134255,0.00032784240000000009],"262144":[0.013000939999999997,0.013122021000000001],"589824":[0.04827826150000001,0.078561501000000006],"884736":[0.105872297,0.12794489949999999],"6144":[0.00020498699999999995,0.00021189726086956522],"1088":[2.5131999999999999e-05,2.5341539999999997e-05],"576":[1.2413450000000001e-05,1.3484460000000002e-05],"160":[3.0728999999999998e-06,3.5580099999999999e-06],"672":[1.6018180000000001e-05,1.731239e-05],"8912896":[1.681860927,1.688315996],"100":[1.8406600000000002e-06,1.91778e-06],"507904":[0.0354642155,0.057570896999999989],"3840":[9.1757999999999998e-05,9.8053999999999993e-05],"192":[4.1117900000000003e-06,4.5475000000000001e-06],"376832":[0.024355038999999995,0.029147898499999984],"98304":[0.005183244,0.0054409430000000002],"5376":[0.0001628135,0.00017284599999999999],"94208":[0.004632774000000001,0.0048503844999999999],"81920":[0.003599161,0.0036212095],"3407872":[0.53950585699999998,0.56014508100000004],"104":[1.9095799999999998e-06,1.9381900000000001e-06],"122880":[0.0052023440000000011,0.0054531909999999996],"200":[3.7950199999999998e-06,3.82763e-06],"163840":[0.0086127209999999985,0.0087616369999999992],"4063232":[0.69297765,0.70660962199999999],"5767168":[1.2500554820000001,1.27081468],"12582912":[3.1097753385,3.1817015780000002],"1600":[3.2301500000000002e-05,3.4845626506024098e-05],"136":[2.72139e-06,2.8039100000000002e-06],"232":[4.4496499999999998e-06,4.4707096774193547e-06],"7077888":[1.1780779605,1.2436929425000001],"86016":[0.0039927414999999999,0.004128484],"31744":[0.0008791789999999999,0.000915963],"168":[3.4274799999999997e-06,3.9598600000000006e-06],"622592":[0.056560576000000008,0.088853214999999999],"108":[1.9280100000000003e-06,2.08138e-06],"327680":[0.018558236499999999,0.021365360999999999],"2176":[5.2695570000000002e-05,5.5187237500000005e-05],"3328":[7.4710999999999997e-05,7.6623000000000001e-05],"1":[4.5699999999999997e-09,4.7800000000000005e-09],"2":[6.1300000000000001e-09,6.1300000000000001e-09],"3":[7.910000000000001e-09,8.2900000000000001e-09],"4":[1.008e-08,1.014e-08],"7424":[0.00017845599999999996,0.00020711337777777776],"5":[1.324e-08,1.325e-08],"23552":[0.00080790399999999991,0.00084880600000000002],"6":[1.6660000000000002e-08,1.6800000000000002e-08],"61440":[0.0021552049999999999,0.00240647],"491520":[0.038069182999999993,0.056308462999999996],"77824":[0.0033385620000000006,0.003462106],"7":[2.014e-08,2.0409999999999999e-08],"8":[2.4810000000000002e-08,2.5819999999999999e-08],"208":[3.9348900000000004e-06,4.0039799999999996e-06],"9":[2.929e-08,2.9299999999999998e-08],"73728":[0.0029787156666666666,0.003302097999999999],"304":[6.8330099999999995e-06,7.3018000000000001e-06],"400":[7.7175263157894729e-06,8.2196399999999995e-06],"1310720":[0.2068001095,0.24860257999999999],"336":[7.4698299999999996e-06,8.0875599999999992e-06],"3670016":[0.59161031900000005,0.60633701500000003],"6656":[0.000161053,0.00016385299999999999],"15360":[0.00038632900000000003,0.00042139852380952372],"432":[8.2211600000000008e-06,9.1995000000000006e-06],"950272":[0.117332861,0.137450723],"655360":[0.06331445350000002,0.093074766500000017],"69632":[0.0027647169999999999,0.0030874210000000003],"11264":[0.00035586100000000001,0.00039065756000000002],"2752512":[0.53298109199999999,0.56038031900000007],"8126464":[1.4640891645,1.4702913849999999],"27648":[0.000746095,0.00076169861538461533],"368":[8.9073333333333337e-06,8.969e-06],"65536":[0.0024252682499999998,0.0025024183333333333],"16252928":[3.1427838355],"464":[9.6200799999999999e-06,1.0011379999999999e-05],"1015808":[0.12548197,0.15233348899999999],"3072":[9.6031538461538462e-05,0.000103027],"110592":[0.0046893554999999998,0.0047378379999999994],"237568":[0.011115663999999999,0.011333924],"278528":[0.0144860515,0.014803369],"496":[9.8798300000000002e-06,1.0616333333333334e-05],"13107200":[2.4087967324999999,2.459248541],"9961472":[2.0059486299999998,2.0376004475],"5888":[0.00018396922222222231,0.00020025922448979591],"11010048":[2.3741883929999998,2.4022783140000001],"1920":[4.312639e-05,4.3162640000000002e-05],"2490368":[0.43388506599999999,0.44883008299999999],"19456":[0.00056129699999999988,0.00060998006666666675],"57344":[0.0019739280000000002,0.0020189812499999999],"1179648":[0.17196609299999999,0.1974597065],"4718592":[0.8856247465,0.90785757],"360448":[0.023487600500000001,0.023555041000000002],"1572864":[0.29654840900000001,0.311598025],"53248":[0.0017118180000000004,0.0017205900000000004],"3456":[8.0504e-05,8.1303000000000004e-05],"40960":[0.0013156272857142858,0.001322712],"4608":[0.00012390775000000002,0.00012852799999999999],"13824":[0.00033489899999999994,0.00036006859259259257],"819200":[0.0892475395,0.105793345],"983040":[0.12476099750000003,0.15459151900000001],"8704":[0.000234386,0.00024874599999999999],"120":[2.2744499999999999e-06,2.2824999999999997e-06],"1024":[2.2411319999999998e-05,2.3437140000000002e-05],"49152":[0.0019572227500000003,0.0020426224999999998],"524288":[0.037387911999999988,0.053781146500000009],"45056":[0.001553072,0.0016165886000000008],"229376":[0.010693036,0.01102380800000002],"2688":[7.5840999999999994e-05,9.5995493827160497e-05],"152":[3.0921200000000001e-06,3.3000899999999997e-06],"5120":[0.00014803450000000002,0.000149841],"1507328":[0.26695115949999998,0.32285293999999998],"1216":[2.8694160000000001e-05,3.1577250000000003e-05],"1966080":[0.30525037999999999,0.321615506],"1900544":[0.28597815100000001,0.28679000450000003],"184":[3.7301400000000003e-06,4.3386399999999997e-06],"7936":[0.00019586000000000001,0.00020853695348837208],"3801088":[0.62917282149999998,0.63383410800000006],"6815744":[1.1245589819999999,1.1784492735000001],"124":[2.4020399999999999e-06,2.5063800000000001e-06],"102400":[0.0040273770000000004,0.0040953594999999995],"311296":[0.017679928000000001,0.017988786999999999],"1408":[3.9918469999999999e-05,4.0635569999999999e-05],"393216":[0.027370133500000005,0.032880643500000001],"4352":[0.00011206249999999999,0.00011819290123456789],"6553600":[1.074535437,1.1114817429999999],"20480":[0.00064511500000000003,0.000690656],"608":[1.42232e-05,1.4477409090909089e-05],"2228224":[0.36366721000000002,0.373819236],"36864":[0.001055411,0.0011787429999999999],"704":[1.6996636363636365e-05,1.7881310000000002e-05],"720896":[0.075870600499999996,0.1088048625],"800":[1.6090060606060606e-05,1.6292870000000002e-05],"2621440":[0.49198523100000002,0.49943771400000003],"425984":[0.024067371999999983,0.031060643499999995],"32768":[0.00091241199999999992,0.00096102700000000004],"12058624":[2.8611995614999999,2.954617227],"128":[2.5295300000000001e-06,2.5463200000000002e-06],"180224":[0.0100554765,0.010363779],"224":[4.3042399999999996e-06,4.3111111111111115e-06],"736":[1.8607400000000001e-05,1.94104e-05],"320":[7.3891799999999998e-06,7.44999e-06],"557056":[0.043181340499999991,0.068431761999999965],"832":[1.710888e-05,1.745057e-05],"9437184":[1.852787424,1.8826569559999999],"3584":[8.7526727272727273e-05,8.9188727272727271e-05],"6291456":[1.515299776,1.5499571194999999],"256":[4.9282700000000003e-06,5.4147699999999998e-06],"15204352":[2.8150803980000001,2.9220717550000002],"28672":[0.00077968200000000007,0.00080128999999999986],"768":[2.1065279999999998e-05,2.2969370000000002e-05],"212992":[0.0090967530000000026,0.010075572],"864":[1.7632279999999999e-05,1.927315e-05],"352":[7.8606666666666657e-06,9.3942699999999987e-06],"253952":[0.012612373999999999,0.012626512500000001],"960":[2.0662649999999998e-05,2.21224e-05],"24576":[0.00089451900000000009,0.00091275900000000018],"7680":[0.000187269,0.00022182000000000001],"294912":[0.016200334,0.0175732335],"1048576":[0.137005609,0.17451415399999998],"10485760":[2.200522318,2.2534647940000001],"344064":[0.020022744500000002,0.0229150285],"288":[5.8394999999999997e-06,6.0874700000000002e-06],"1152":[2.6441889999999998e-05,2.6696379999999999e-05],"384":[8.9558300000000003e-06,9.5090199999999996e-06],"2304":[5.683258108108108e-05,6.0810600000000004e-05],"896":[1.812819e-05,1.8944999999999999e-05],"480":[1.0161689999999999e-05,1.0331190000000001e-05],"1441792":[0.25079831949999998,0.296295168],"992":[2.177664e-05,2.3923289999999998e-05],"3968":[9.8944712765957441e-05,0.00010334422340425528],"6400":[0.00015245578461538467,0.00015822224999999999],"1344":[3.4945846153846153e-05,3.4962000000000002e-05],"126976":[0.0055520020000000003,0.0055978380000000008],"2883584":[0.58229572949999997,0.606646193],"753664":[0.084335053000000007,0.1284153015],"16384":[0.00043777399999999999,0.00047311400000000006],"131072":[0.0059966259999999997,0.0063037869999999999],"458752":[0.028213591499999996,0.047426265000000002],"172032":[0.0092068400000000026,0.0096436850000000025],"12288":[0.00042279999999999998,0.0004598090000000001],"14680064":[2.6712750175000002,2.7411230629999999],"1536":[4.543176923076923e-05,4.8115999999999998e-05],"25600":[0.00064694400000000021,0.00066813085714285709],"1835008":[0.26811172900000002,0.274281565],"10752":[0.00031418099999999997,0.00031687800000000004],"21504":[0.00068077800000000016,0.00072873899999999995],"7602176":[1.3344319155,1.3419358209999999],"5632":[0.00016770999999999998,0.00017383425000000002],"10":[3.449e-08,3.4779999999999998e-08],"3145728":[0.68205468999999996,0.68966835999999998],"245760":[0.0121452325,0.012183382999999999],"1728":[3.7151836363636364e-05,3.9019880000000001e-05],"11":[3.9510000000000001e-08,3.9960000000000002e-08],"1114112":[0.154567545,0.17840631400000001],"12":[4.5979999999999999e-08,4.6519999999999996e-08],"7340032":[1.23534945,1.243623556],"7168":[0.00017541701851851859,0.00019567394000000001],"13":[5.2310000000000003e-08,5.2980000000000002e-08],"6029312":[1.3719936230000001,1.3808753120000001],"14":[5.9510000000000001e-08,5.9529999999999998e-08],"3200":[7.0320000000000004e-05,7.312288571428571e-05],"20":[3.4788000000000002e-07,4.3019000000000002e-07],"204800":[0.0091418080000000013,0.0092073090000000003],"15":[6.6870000000000003e-08,7.3399999999999996e-08],"13312":[0.00032728,0.00035107271428571425],"4980736":[0.98155790300000001,0.982422464],"118784":[0.0051833109999999995,0.0053211199999999995],"51200":[0.0015748169999999998,0.0017645750000000009],"16":[2.9648999999999998e-07,3.0408000000000001e-07],"21":[3.8101e-07,4.3840000000000001e-07],"917504":[0.107832631,0.13641767399999999],"22":[4.3533999999999998e-07,4.5495999999999999e-07],"4864":[0.00014036849999999999,0.00014046100000000001],"17":[3.0894000000000001e-07,3.2132999999999998e-07],"14848":[0.00039044320000000004,0.00040112200000000001],"23":[4.4202999999999994e-07,4.7674999999999998e-07],"786432":[0.09200765100000001,0.13049840200000001],"18":[3.0717999999999998e-07,3.3143e-07],"1638400":[0.233159279,0.23637350700000001],"7864320":[1.3793652199999999,1.406848608],"24":[4.8688000000000003e-07,5.4524000000000003e-07],"14155776":[2.5548252209999998,6.9184359449999997],"19":[3.2375000000000002e-07,3.6141e-07],"30":[5.2534000000000002e-07,5.7184000000000002e-07],"25":[4.2731000000000003e-07,4.7038000000000001e-07],"31":[5.4165000000000004e-07,5.5565999999999999e-07],"1280":[3.2819740000000003e-05,3.4115440476190476e-05],"26":[4.6025000000000001e-07,4.9085999999999999e-07],"3932160":[0.668726351,0.67451727700000008],"2432":[6.9048674999999993e-05,7.1834050000000007e-05],"32":[5.6799000000000005e-07,6.5655999999999994e-07],"27":[4.8317e-07,5.0915999999999999e-07],"409600":[0.022136705499999999,0.025123174500000001]}},{"title":"std::unordered_set insert, reserving capacity","results":{"28":[3.1030800000000003e-06,3.3636299999999998e-06,3.4577200000000001e-06,3.4749699999999998e-06,3.4767799999999998e-06,3.5034100000000001e-06,3.5050599999999999e-06,3.5633300000000002e-06,3.6049099999999998e-06,3.6262900000000001e-06,3.68031e-06,3.6978700000000002e-06,3.69803e-06,3.6984500000000001e-06,3.7162000000000001e-06,3.7583000000000001e-06,3.7769900000000002e-06,3.8226700000000003e-06,4.14449e-06,4.2031399999999999e-06],"34":[3.8359400000000002e-06,3.94089e-06,4.1235483870967742e-06,4.1637100000000003e-06,4.19182e-06,4.2903299999999998e-06,4.2921300000000004e-06,4.3021800000000004e-06,4.3238400000000003e-06,4.3379800000000001e-06,4.3642800000000002e-06,4.3698800000000006e-06,4.3730899999999998e-06,4.3981600000000003e-06,4.4460000000000003e-06,4.4491499999999996e-06,4.4737899999999996e-06,4.4875499999999999e-06,4.5568300000000006e-06,4.6002100000000003e-06],"29":[3.22971e-06,3.2800199999999996e-06,3.4804642857142858e-06,3.5462399999999999e-06,3.5765900000000003e-06,3.5988900000000001e-06,3.6041200000000001e-06,3.61725e-06,3.6412299999999999e-06,3.66644e-06,3.7166600000000001e-06,3.74449e-06,3.7792000000000002e-06,3.7859800000000001e-06,3.8047800000000003e-06,3.8554899999999999e-06,3.8992200000000004e-06,3.9491400000000003e-06,3.9550000000000002e-06,3.9951899999999996e-06],"40":[4.53918e-06,4.5393799999999996e-06,4.8512100000000001e-06,5.0274599999999995e-06,5.0430499999999999e-06,5.0784299999999999e-06,5.1108900000000006e-06,5.1313599999999994e-06,5.1486900000000005e-06,5.1626000000000003e-06,5.19065e-06,5.2048000000000005e-06,5.2568899999999997e-06,5.2723099999999993e-06,5.3208900000000003e-06,5.3834300000000004e-06,5.3985700000000007e-06,5.4271299999999997e-06,5.46869e-06,5.5616400000000005e-06],"17408":[0.0024525230000000012,0.0024568430000000002,0.0024987970000000001,0.002499102,0.0025120209999999993,0.0025140829999999994,0.0025220313333333333,0.0025270620000000001,0.0025358350000000002,0.0025422300000000155,0.0025423859999999998,0.0025500650000000002,0.0025610609999999999,0.0025824040000000008,0.0026047089999999989,0.002610547,0.0026140160000000007,0.00263729,0.0026879286666666668,0.0027142240000000003],"1472":[0.00020398500000000001,0.00020543665217391305,0.00020563499999999994,0.000205925,0.00020595999999998654,0.00020713602380952384,0.00020827077777777766,0.00020865508510638301,0.00020974984444444437,0.00021004197872340425,0.00021304911111111107,0.00021311904651162791,0.000213923,0.00021458065217391304,0.000217331,0.00021766815909090914,0.000217696,0.00021794700000000002,0.00021870892682926838,0.000220046],"112":[1.338275e-05,1.4239999999999999e-05,1.4284000000000001e-05,1.4587339999999999e-05,1.460621e-05,1.4606999999999999e-05,1.4611330000000001e-05,1.4650010000000001e-05,1.47155e-05,1.4732919999999999e-05,1.4877e-05,1.488514e-05,1.4991270000000001e-05,1.5022220000000001e-05,1.5257399999999999e-05,1.525996e-05,1.5424559999999999e-05,1.5509180000000003e-05,1.5582559999999999e-05,1.5672280000000001e-05],"1376256":[0.53727310400000006,0.53771475599999996,0.53782980400000002,0.54334834399999998,0.54691296649999999,0.550761579,0.55404851899999996,0.55874183700000002,0.56006492100000005,0.56187587100000003,0.56294497050000003,0.56336720899999992,0.56363416300000002,0.56384085800000006,0.56685259899999996,0.56798875000000004,0.57154585599999996,0.57407195,0.5826189195,0.58986507599999993],"5242880":[2.571716672,2.5747533159999998,2.580590527,2.5814535689999998,2.5877696459999999,2.5899138614999999,2.5907711130000002,2.59493975,2.5994300799999999,2.6014003080000001,2.6042881499999999,2.60644103,2.60819394,2.608245084,2.6130653724999999,2.621704813,2.6262939494999999,2.6295499119999999,2.6301411085000002,2.6358562289999998],"36":[4.0727899999999995e-06,4.2284199999999997e-06,4.36797e-06,4.4259500000000004e-06,4.4791341463414636e-06,4.48651e-06,4.4869400000000004e-06,4.5896500000000002e-06,4.6182600000000001e-06,4.6307200000000001e-06,4.6482599999999998e-06,4.6915599999999999e-06,4.7233199999999999e-06,4.7251200000000004e-06,4.7567800000000002e-06,4.7737000000000006e-06,4.8317199999999995e-06,4.8324499999999998e-06,4.8346799999999999e-06,4.9620800000000006e-06],"42":[4.8280899999999997e-06,5.0284199999999997e-06,5.2777399999999997e-06,5.2815399999999996e-06,5.3160200000001992e-06,5.3288100000000004e-06,5.3307999999999999e-06,5.3804999999999996e-06,5.4091818181818179e-06,5.4149999999999998e-06,5.4500113636363642e-06,5.4516700000000003e-06,5.4583799999999996e-06,5.4595500000000001e-06,5.5268199999999999e-06,5.5533499999999999e-06,5.6057399999999998e-06,5.64162e-06,5.8859900000000002e-06,5.8989999999999998e-06],"11534336":[6.0569996714999998,6.0611375054999996,6.0623037670000004,6.0678991025000002,6.0700695304999996,6.0708518075000004,6.0750517124999996,6.0763538690000001,6.0774744040000002,6.0861901784999999,6.0941096180000001,6.0946593870000001,6.0993611110000003,6.1016788330000002,6.1044574779999996,6.1065409190000004,6.1100155125000004,6.1141675885,6.115773527,6.1243241384999996],"114688":[0.02242951850000002,0.022448105499999989,0.0225220395,0.0225364425,0.022709402,0.022747976,0.022750053500000002,0.022756166500000001,0.022867265500000001,0.0229610115,0.023008111500000004,0.023079697999999999,0.023228996500000001,0.023280989999999991,0.023293349999999997,0.023715543999999998,0.023924868999999998,0.0239344485,0.024233881500000002,0.027151968999999998],"144":[1.6443000000000002e-05,1.7989e-05,1.8400600000000001e-05,1.8536749999999998e-05,1.8548320000000001e-05,1.8568666666666667e-05,1.8603249999999998e-05,1.9028249999999999e-05,1.905811e-05,1.9136000000000001e-05,1.9145309999999998e-05,1.92206e-05,1.9326069999999999e-05,1.933098e-05,1.9434341463414633e-05,1.9594660000000001e-05,1.9694280000000001e-05,2.0007369999999999e-05,2.027319e-05,4.263325e-05],"38":[4.3068699999999998e-06,4.3109800000000002e-06,4.5261300000000002e-06,4.6344699999999999e-06,4.7821666666666672e-06,4.7997699999999998e-06,4.8019700000000004e-06,4.8096399999999999e-06,4.8156000000000001e-06,4.8333900000000003e-06,4.8353699999999999e-06,4.8679600000000004e-06,4.8742199999999996e-06,4.8902699999999992e-06,4.9021799999999997e-06,5.0594899999999997e-06,5.15573e-06,5.2910800000000003e-06,5.3122499999999998e-06,5.3891599999999997e-06],"240":[3.0360000000000001e-05,3.1038666666666665e-05,3.1813500000000003e-05,3.240064948453608e-05,3.2604779999999995e-05,3.2805329999999998e-05,3.3269999999999998e-05,3.3339680000000001e-05,3.3426728395061729e-05,3.3470464285714288e-05,3.3726059999999999e-05,3.3780392857142859e-05,3.3865829999999999e-05,3.3866750000000002e-05,3.4316696629213484e-05,3.4321849999999997e-05,3.46555e-05,3.4871869999999999e-05,3.5676878378378376e-05,3.594545e-05],"9216":[0.001277329,0.0012811789999999999,0.001290252,0.0012937340000000006,0.001297933,0.001303331,0.001315149,0.001319293,0.0013194179999999999,0.0013290629999999997,0.0013390170000000003,0.0013448211428571429,0.0013458999999999999,0.0013550189999999998,0.0013610570000000002,0.0013622030000000067,0.0013808358333333331,0.0013870879999999999,0.0013960380000000001,0.0014142333333333336],"44":[4.9831300000000002e-06,5.2165999999999993e-06,5.5265100000000002e-06,5.5978099999999999e-06,5.5992499999999998e-06,5.6316986301369865e-06,5.6414699999999997e-06,5.6637500000000006e-06,5.7002699999999999e-06,5.7071900000000003e-06,5.7092099999999993e-06,5.7179699999999997e-06,5.7771000000000001e-06,5.7905800000000004e-06,5.8437200000000002e-06,5.8732699999999998e-06,5.8789599999999997e-06,5.9712100000000004e-06,6.0034e-06,6.05193e-06],"1664":[0.00022721833333333338,0.00022780700000000006,0.00022957299999999998,0.00023192566666666671,0.0002339047692307692,0.00023402300000000001,0.00023425099999999999,0.00023634200000000001,0.00023644950000000002,0.00023917799999999997,0.00023982100000000001,0.00024041591176470587,0.00024045799999999998,0.00024050480487804879,0.00024168200000000006,0.00024423428947368419,0.00024810355000000009,0.00024876500000000002,0.00025105700000000001,0.00025280599999999995],"196608":[0.042363440499999988,0.042406350500000002,0.0430600145,0.043069237500000003,0.043459246,0.043632009000000013,0.043800802,0.043825892999999984,0.044275211999999987,0.044303799500000005,0.044901550000000012,0.044947081,0.044994944500000002,0.045326113000000001,0.045465116,0.045833259000000008,0.045971519999999988,0.046097140999999994,0.046226569000000002,0.047300990999999987],"155648":[0.03188957550000001,0.032328006499999999,0.032622489499999983,0.03290219250000001,0.033293305500000002,0.0335572435,0.03357267600000001,0.033685134499999998,0.033717847499999988,0.034033438000000013,0.034343669,0.03435605650000001,0.03453104600000001,0.034961133999999998,0.035197717000000024,0.036274538000000002,0.036961809499999998,0.037397179999999988,0.040130884499999998,0.045790045999999987],"2816":[0.00038064000000000001,0.00038187699999999992,0.00039699100000000002,0.00039913400000000004,0.00040329999999999994,0.00040375766666666645,0.00040527599999999988,0.00040625900000000023,0.00040859699999999996,0.00041164090909090901,0.00041171109999999997,0.0004122869999999999,0.00041611400000000014,0.00041841581818181808,0.00041842100000000009,0.00041904586956521741,0.00042269999999999997,0.00042625199999999996,0.0004337385000000002,0.00044700242857142867],"50":[5.6143100000000005e-06,5.6760999999999997e-06,6.2152100000000001e-06,6.2867900000000007e-06,6.3177399999999999e-06,6.3315500000000004e-06,6.3882600000000001e-06,6.3917900000000005e-06,6.4404000000000002e-06,6.45713e-06,6.4734900000000001e-06,6.5264100000000006e-06,6.6064e-06,6.6467499999999995e-06,6.6518800000000001e-06,6.8047299999999998e-06,6.8151142857142853e-06,6.9623899999999998e-06,7.0155699999999998e-06,7.4310599999999996e-06],"2359296":[1.0441015419999999,1.048964579,1.0492933529999999,1.0498853420000001,1.0556588760000001,1.056091055,1.06145921,1.0664618429999999,1.071558534,1.0738533729999999,1.0761447129999999,1.0777953250000001,1.082267219,1.0827798015000001,1.0884148490000001,1.093060682,1.0948609364999999,1.099533605,1.0997663449999999,1.1098049384999999],"46":[5.2096300000000005e-06,5.3615300000000007e-06,5.7128500000000007e-06,5.73352e-06,5.8012799999999993e-06,5.8255899999999999e-06,5.8267499999999997e-06,5.9115000000000001e-06,5.9679032258064518e-06,6.0425500000000003e-06,6.0462700000000005e-06,6.0691399999999995e-06,6.1311799999999993e-06,6.1382099999999998e-06,6.1668e-06,6.3736700000000001e-06,6.3914899999999999e-06,6.4062300000000002e-06,6.8863099999999995e-06,6.9759999999999998e-06],"176":[2.2385419999999999e-05,2.298e-05,2.3252700000000002e-05,2.3610839999999997e-05,2.36675e-05,2.3729469999999998e-05,2.374175e-05,2.3766420000000001e-05,2.4005680000000002e-05,2.4105999999999999e-05,2.4114999999999999e-05,2.4234470000000001e-05,2.4235311827956988e-05,2.4378089999999999e-05,2.4506319999999997e-05,2.4651999999999997e-05,2.5100460000000002e-05,2.5257619999999998e-05,2.5547730000000001e-05,2.6970499999999999e-05],"52":[5.8058700000000002e-06,6.37207e-06,6.4843400000000002e-06,6.4977700000000003e-06,6.4992200000000001e-06,6.5173684210526323e-06,6.5648300000000006e-06,6.6769999999999998e-06,6.6820499999999998e-06,6.7343333333333335e-06,6.7911500000000002e-06,6.8017200000000002e-06,6.8199999999999999e-06,7.0262499999999999e-06,7.08218e-06,7.0826900000000001e-06,7.1689599999999992e-06,7.2061700000000002e-06,7.5231894736842108e-06,7.5581300000000001e-06],"272":[3.5589999999999996e-05,3.6790030000000001e-05,3.7307982456140354e-05,3.7439040000000001e-05,3.7707769999999996e-05,3.8022360000000001e-05,3.8102999999999998e-05,3.8311170000000005e-05,3.8609780000000003e-05,3.874273e-05,3.8760149999999999e-05,3.8878300000000003e-05,3.9074009999999993e-05,3.910291111111111e-05,3.9264500000000003e-05,3.935793e-05,3.9417511111111116e-05,3.9768000000000003e-05,3.9915e-05,4.0046889999999997e-05],"116":[1.3305220000000001e-05,1.4316000000000002e-05,1.4743049999999999e-05,1.484286e-05,1.4891e-05,1.490962e-05,1.4940680000000001e-05,1.4972e-05,1.5229944444444445e-05,1.5247159999999999e-05,1.5372090909090908e-05,1.562112e-05,1.5762709999999998e-05,1.5768320000000001e-05,1.599062e-05,1.6040950000000001e-05,1.6045790000000001e-05,1.622174e-05,1.6430160000000001e-05,1.8132280000000001e-05],"47104":[0.0074560820000000002,0.0076014059999999998,0.0076205910000000003,0.0076405559999999997,0.0076779640000000007,0.0077603849999999999,0.007789457000000004,0.0078058559999999999,0.0078103870000000002,0.0078193360000000014,0.0078258540000000019,0.0078326650000000008,0.0078403200000000031,0.0078774499999999994,0.0078920500000000029,0.0079516880000000002,0.0080299290000000016,0.0080770070000000006,0.0081042519999999976,0.0093812080000000003],"6912":[0.00095784399999999969,0.00098778400000000023,0.00099059466666666677,0.00099674999999999981,0.00099746999999999965,0.00099784299999999999,0.0010006877777777776,0.0010008630000000001,0.001011519,0.0010203364444444443,0.0010204115555555557,0.0010209653333333331,0.0010210567777777775,0.0010217030000000001,0.0010292571111111112,0.0010304138888888887,0.001030586,0.0010383359999999999,0.0010467689999999999,0.0010490510000000001],"1856":[0.00025045999999999998,0.000251666,0.00025253199999999987,0.00025621500000000001,0.000260387,0.00026090105405405405,0.00026142899999999998,0.00026717477777777785,0.0002677692702702702,0.00026963611111111105,0.00027118900000000002,0.000272031,0.00027204991428571421,0.00027332565714285721,0.00027380124999999998,0.00027514999999999994,0.00027788565714285723,0.00028243188571428569,0.00028333015151515143,0.00029202321875000013],"48":[5.3953900000000002e-06,5.4660099999999997e-06,5.8286700000000002e-06,5.8405100000000001e-06,5.8965099999999992e-06,5.8995500000000001e-06,5.9379999999999997e-06,6.0306100000000002e-06,6.1382307692307691e-06,6.1629999999999993e-06,6.2202000000000002e-06,6.2237100000000001e-06,6.2274099999999997e-06,6.2413499999999991e-06,6.3655600000000003e-06,6.37925e-06,6.3909299999999996e-06,6.40182e-06,6.4504444444444441e-06,6.9626799999999997e-06],"2097152":[0.87764171499999999,0.88509671099999998,0.8868399535,0.88755708099999997,0.88973774400000005,0.89217499550000001,0.8942851275,0.89662836749999997,0.89701818300000002,0.89755331650000003,0.90243736799999996,0.90539691899999997,0.9065609805,0.90789003450000005,0.90947167949999996,0.91133910400000007,0.91499553200000006,0.922839509,0.92907876249999999,0.93788784299999994],"54":[6.0958636363636373e-06,6.7434300000000001e-06,6.798e-06,6.808136842105263e-06,6.8461800000000001e-06,6.9070000000000001e-06,6.9233333333333337e-06,6.9663600000000005e-06,6.9829999999999999e-06,7.0996700000000004e-06,7.2045899999999997e-06,7.2550500000000001e-06,7.3175200000000004e-06,7.3195900000000003e-06,7.3846899999999999e-06,7.4274100000000001e-06,7.5100000000000001e-06,7.5206399999999999e-06,7.5264999999999999e-06,7.6112499999999993e-06],"2031616":[0.86852881400000004,0.87361676600000004,0.87710224199999998,0.87798321899999998,0.87868128000000001,0.88435679850000004,0.88614943599999996,0.88696313400000004,0.89196535499999996,0.89486642699999996,0.90137260699999999,0.90707479000000002,0.90781808350000004,0.90814412150000001,0.90942594850000003,0.92022070050000004,0.92315992950000003,0.92501463650000004,0.92616545549999996,0.93734374549999999],"43008":[0.006688673,0.0068744790000000028,0.0069295730000000031,0.0069625609999999965,0.006974010000000001,0.0069876139999999962,0.0070082630000000033,0.0070101370000000022,0.0070188170000000018,0.0070735119999999997,0.0071297579999999999,0.0071412709999999976,0.0071868650000000023,0.007190263000000004,0.0072241980000000029,0.0072264350000000007,0.0072507579999999978,0.0072881890000000005,0.0073350719999999998,0.0073886719999999972],"60":[6.7723600000000003e-06,7.1517499999999998e-06,7.5680299999999998e-06,7.6260000000000003e-06,7.6357799999999993e-06,7.6869799999999997e-06,7.7731399999999996e-06,7.7793399999999996e-06,7.8508499999999995e-06,7.8893200000000006e-06,7.910849999999999e-06,7.9216000000000005e-06,7.9246000000000003e-06,7.93266e-06,7.9641200000000002e-06,8.1128499999999998e-06,8.1915899999999989e-06,8.3840869565217389e-06,8.392029999999999e-06,8.5063500000000003e-06],"30720":[0.0045618069999999993,0.0046081975000000002,0.0046280434999999998,0.0046729344999999999,0.0047199134999999998,0.0047418215,0.004750181,0.0047939750000000015,0.0047961900000000014,0.004805223,0.0048141884999999985,0.0048376459999999975,0.0048620850000000004,0.0048670439999999983,0.004895674,0.0049159120000000014,0.0049371780000000004,0.0049619490000000002,0.0051364050000000019,0.0051379949999999985],"56":[6.2833099999999995e-06,7.0422058823529409e-06,7.0704999999999995e-06,7.1727900000000003e-06,7.2073700000000002e-06,7.2295900000000004e-06,7.2427400000000004e-06,7.2436500000000005e-06,7.2665299999999994e-06,7.31674e-06,7.3759699999999998e-06,7.3943499999999998e-06,7.3991e-06,7.5019300000000005e-06,7.5082700000000002e-06,7.5429999999999996e-06,7.6587899999999996e-06,7.6930099999999997e-06,7.7389999999999999e-06,7.7577799999999991e-06],"62":[6.9823099999999999e-06,7.4153299999999995e-06,7.656800000000001e-06,7.8222000000000011e-06,7.8269999999999998e-06,7.8454666666666663e-06,8.0070200000000011e-06,8.017789999999999e-06,8.0649400000000007e-06,8.0776999999999989e-06,8.1322899999999993e-06,8.1492800000000004e-06,8.2126800000000005e-06,8.2834200000000007e-06,8.3379899999999998e-06,8.4278900000000004e-06,8.4474199999999995e-06,8.4866900000000006e-06,8.7684200000000003e-06,9.2278100000000007e-06],"58":[6.6275600000000005e-06,7.1792700000000005e-06,7.2862700000000005e-06,7.3821900000000004e-06,7.5445999999999997e-06,7.5812299999999999e-06,7.6253559322033892e-06,7.6689399999999998e-06,7.685444444444445e-06,7.712e-06,7.7684699999999998e-06,7.7740100000000011e-06,7.7811000000000008e-06,7.7919099999999997e-06,7.8564699999999997e-06,7.9523000000000001e-06,7.9586000000000003e-06,8.0139830508474573e-06,8.0250000000000002e-06,8.1254399999999996e-06],"3014656":[1.3894151975,1.398913799,1.405079505,1.407531659,1.412361762,1.4133398429999999,1.4178073499999999,1.4178796069999999,1.4197164760000001,1.4207161555000001,1.4245588075,1.4300478779999999,1.4310655925,1.433904619,1.435061696,1.435809374,1.440410974,1.4421761205000001,1.4592498869999999,1.5330604395],"64":[6.3034200000000002e-06,7.03445e-06,7.0877400000000002e-06,7.1246000000000004e-06,7.1585599999999993e-06,7.1830200000000002e-06,7.2827700000000004e-06,7.2988904109589042e-06,7.3341300000000002e-06,7.3637599999999994e-06,7.3729600000000001e-06,7.4692400000000007e-06,7.4983600000000007e-06,7.5187900000000001e-06,7.5296300000000003e-06,7.5465499999999998e-06,7.5555800000000004e-06,7.6913200000000001e-06,7.9849700000000002e-06,8.5695899999999994e-06],"8388608":[4.1532132319999997,4.1575780570000003,4.1729643369999998,4.1739859639999999,4.1840043910000002,4.1879545279999997,4.1914093355000004,4.1914198169999999,4.1932853884999997,4.1933171964999998,4.1938176829999998,4.1946246824999998,4.1991444759999998,4.1991926490000004,4.2009053569999999,4.2041997704999998,4.2190629160000004,4.2218844319999995,4.2311538139999998,4.2432916179999998],"29696":[0.0043001950000000014,0.0043938509999999998,0.0045453120000000001,0.0045831604999999999,0.0045899850000000004,0.0045994019999999998,0.0046147124999999997,0.0046475260000000034,0.0046477629999999983,0.0046494099999999997,0.0046568259999999976,0.0046928909999999976,0.0047387620000000014,0.004792641999999998,0.0049255509999999968,0.0049342140000000001,0.0049931710000000002,0.0050314360000000002,0.0052271979999999997,0.0054020659999999996],"216":[2.7509500000000001e-05,2.8819599999999998e-05,2.9065599999999998e-05,2.9497947368421056e-05,2.9869349999999999e-05,2.9873999999999999e-05,2.9884820000000004e-05,2.9927709999999999e-05,3.0012740740740739e-05,3.0013029999999997e-05,3.0128249999999997e-05,3.01695e-05,3.0254166666666669e-05,3.0789569999999999e-05,3.0822928571428568e-05,3.1256420000000003e-05,3.1257599999999997e-05,3.1378550000000001e-05,3.1394730000000002e-05,3.191982e-05],"106496":[0.020582126499999999,0.020813506500000002,0.020838468499999992,0.020847460000000002,0.020860113999999999,0.020880267500000001,0.020899699000000001,0.021006658500000004,0.021135589999999999,0.021151001499999999,0.021262979500000001,0.021548650999999999,0.021617469,0.021681813499999994,0.021728146,0.021758344000000002,0.021769196000000001,0.021781098999999998,0.022335540000000008,0.023861584999999998],"72":[8.2951900000000008e-06,8.6934444444444445e-06,9.0134299999999995e-06,9.0610000000000002e-06,9.0776299999999997e-06,9.0852900000000002e-06,9.111329999999999e-06,9.1300833333333342e-06,9.2658099999999993e-06,9.3229199999999998e-06,9.3893300000000004e-06,9.3998799999999999e-06,9.4014999999999997e-06,9.5176300000000006e-06,9.5278500000000006e-06,9.5410900000000002e-06,9.5514899999999992e-06,9.7998199999999986e-06,9.8616700000000004e-06,1.02602e-05],"442368":[0.11848328,0.11852592550000002,0.119655567,0.12159997900000002,0.122231704,0.1231305665,0.12387155,0.12423569600000001,0.12473959150000002,0.12513138300000001,0.126722688,0.12693392449999999,0.12697884449999999,0.12871842150000001,0.12909703950000001,0.130324421,0.13174766400000004,0.132574205,0.13505981900000003,0.13678489899999999],"147456":[0.030092195000000006,0.03010827399999999,0.030114845000000001,0.030165038500000001,0.030324548999999999,0.030367485999999999,0.030491530999999999,0.030645235999999985,0.030697897999999991,0.030769516,0.030986522999999998,0.03100584,0.0310617615,0.0310896695,0.0314966775,0.031543204999999963,0.031752554000000002,0.031877976500000002,0.032657754999999997,0.036724329999999986],"4456448":[2.1523371595,2.1554155205000001,2.1643119340000001,2.167083769,2.170060189,2.1780849670000002,2.1801863865,2.1818483799999999,2.1822825020000001,2.1858237444999999,2.1858308129999999,2.1870780590000001,2.1891797495,2.1896259825,2.1911769639999998,2.1942652659999999,2.1969287309999999,2.2212492469999998,2.221526549,2.2275102004999998],"63488":[0.011076111999999997,0.011085184,0.0111187495,0.0111755855,0.0112109475,0.011219693500000001,0.011239685000000006,0.011242186499999999,0.011245410000000001,0.01126783,0.0112799215,0.0112815055,0.0113975485,0.011462591999999997,0.0114873375,0.0116129515,0.01162442,0.011732976499999999,0.011753595,0.012325120999999994],"38912":[0.0059301730000000021,0.00594291,0.005953716999999999,0.0062046139999999972,0.0062256360000000014,0.0062398170000000008,0.0062528100000000001,0.0062579840000000012,0.0062660769999999975,0.0063092670000000003,0.006338977,0.0063437620000000002,0.0063846990000000024,0.0064015030000000002,0.0064137630000000011,0.0064511350000000019,0.0064563780000000031,0.0064780219999999982,0.0065663540000000008,0.006601389],"68":[7.7879100000000011e-06,8.4530300000000006e-06,8.6238399999999998e-06,8.6993800000000004e-06,8.7596666666666668e-06,8.8155999999999991e-06,8.83547e-06,8.8645800000000001e-06,8.8694399999999996e-06,8.8836299999999995e-06,8.9157799999999989e-06,9.0019999999999995e-06,9.0403499999999989e-06,9.0497099999999998e-06,9.1578400000000001e-06,9.3561800000000006e-06,9.3756599999999996e-06,9.4049200000000001e-06,9.5043199999999995e-06,9.8243399999999995e-06],"188416":[0.039997263000000019,0.040323137999999994,0.040528246000000004,0.040972685500000001,0.041230555500000002,0.0417292555,0.042154770000000022,0.042193030999999992,0.042309770999999982,0.042336765499999998,0.042426100500000015,0.042618661999999988,0.042769929999999998,0.043022283000000008,0.043132317999999996,0.04347334500000001,0.043966062,0.0440063095,0.044116988499999989,0.044379928999999999],"248":[3.2876999999999997e-05,3.2956000000000001e-05,3.2977919999999996e-05,3.3093000000000003e-05,3.3140869999999998e-05,3.3605500000000002e-05,3.4106756097560973e-05,3.4279020000000003e-05,3.4407699999999999e-05,3.4764790000000002e-05,3.4793160000000001e-05,3.5011069999999999e-05,3.5154999999999998e-05,3.5260340000000001e-05,3.5770818181818186e-05,3.5782180000000003e-05,3.5807267605633804e-05,3.586612e-05,3.7527680000000171e-05,3.7620129999999998e-05],"80":[9.7711200000000001e-06,1.0203999999999999e-05,1.0279200000000001e-05,1.0300109999999999e-05,1.0306153846153845e-05,1.034357e-05,1.0399333333333334e-05,1.0457380000000001e-05,1.052856e-05,1.053456e-05,1.0591509999999999e-05,1.0640499999999999e-05,1.0684329999999999e-05,1.072486e-05,1.0732020000000001e-05,1.0877603448275862e-05,1.098743e-05,1.114898e-05,1.1342480000000001e-05,1.14484e-05],"2560":[0.00034343699999999998,0.00034731999999999981,0.00034766800000000009,0.00035276599999999985,0.00035292749999999996,0.00035669050000000012,0.00035794800000000002,0.00036329199999999998,0.00036333399999999999,0.0003636370000000001,0.00036783599999999997,0.00036893000000000017,0.00036904408000000002,0.00037874400000000003,0.00038019299999999997,0.00038072900000000001,0.00038322874999999993,0.00038331199999999996,0.00039427777272727269,0.00039657400000000007],"34816":[0.0053602510000000016,0.005380943,0.0054318669999999991,0.0054357769999999984,0.0054420949999999966,0.0054423609999999997,0.0054832080000000016,0.0054832259999999999,0.0054903530000000016,0.0054908240000000001,0.0055074810000000007,0.0055084940000000009,0.0055168470000000001,0.0055231830000000001,0.0055501040000000001,0.0056181760000000008,0.0056703600000000002,0.0057036809999999978,0.0057647540000000021,0.0062267129999999966],"3712":[0.00051582800000000018,0.00052249200000000016,0.00052257600000000029,0.00052815476470588246,0.00053045988888888887,0.00053168900000000001,0.00053184600000000021,0.00053389247058823527,0.0005350500588235294,0.00053611350000000002,0.00053947999999999984,0.00054175999999999996,0.00054623200000000001,0.00054986900000000003,0.00055619417647058812,0.00055941999999999993,0.00056017899999999984,0.00056258306666666662,0.00058866062499999996,0.00059668399999999989],"3538944":[1.6718021255,1.6753431160000001,1.678914756,1.6859820430000001,1.6864605109999999,1.6902391944999999,1.6911984040000001,1.6914955595000001,1.6916545544999999,1.6928978644999999,1.6942172979999999,1.6965728389999999,1.6991981680000001,1.7012141089999999,1.7020169430000001,1.7085986310000001,1.712478605,1.7149368310000002,1.716508465,1.7477254310000001],"76":[8.7178100000000005e-06,9.6392900000000003e-06,9.781e-06,9.7865000000000002e-06,9.8532700000000006e-06,9.8608799999999993e-06,9.86813e-06,9.8900000000000002e-06,9.8973799999999998e-06,9.9148372093023257e-06,9.9210000000000004e-06,9.9616100000000003e-06,1.0036e-05,1.011012e-05,1.012248e-05,1.012529e-05,1.0334e-05,1.0334109999999999e-05,1.0654089999999999e-05,1.0813050000000001e-05],"4194304":[1.9459199700000001,1.956518972,1.9581979439999999,1.9598216310000001,1.9605522955000001,1.9639800595000001,1.9652167,1.9666868845000001,1.9687817759999999,1.9730068860000001,1.9737064284999999,1.9738103334999999,1.9755636594999999,1.977040997,1.9799421685,1.9864592175,1.989108554,1.9951802279999999,2.0138584984999999,2.0455667339999999],"851968":[0.29140147900000002,0.29362581199999999,0.29375894349999998,0.29749725650000003,0.29811935849999999,0.30112887900000002,0.30274920799999999,0.30376732400000001,0.30728166800000001,0.30737659049999999,0.30847002099999998,0.3101701435,0.31043849349999997,0.31704417200000001,0.31851285699999998,0.31865643500000002,0.318778593,0.3275313285,0.33579841199999999,0.35267541800000002],"4096":[0.00050135399999999997,0.00051907699999999995,0.0005202169999999999,0.000522179,0.00052587700000000001,0.00052846000000000002,0.000529877,0.00053373061111111121,0.00053736288888888871,0.00053785170588235289,0.00053862133333333335,0.00054176199999999999,0.00054351166666666653,0.00054488699999999976,0.00054802399999999971,0.0005487290000000004,0.00055415599999999966,0.00055689405882352932,0.0005594754705882353,0.00059115193749999999],"59392":[0.010018312499999999,0.010167658,0.0102004065,0.010233408999999995,0.010269486,0.0103223345,0.0103331615,0.0103667945,0.010393266499999994,0.010405442500000004,0.010410951,0.010418819999999999,0.010428969,0.0105417875,0.010556523,0.010596524999999999,0.010609588,0.010620708,0.010656451000000001,0.0107070215],"84":[9.7611700000000003e-06,1.0637592105263157e-05,1.07415e-05,1.0790250000000001e-05,1.0838040000000001e-05,1.0948076923076923e-05,1.0960290000000002e-05,1.099971e-05,1.1049099999999999e-05,1.111709e-05,1.117134e-05,1.118717e-05,1.130711e-05,1.1426730000000001e-05,1.1569999999999999e-05,1.157597e-05,1.1736819999999999e-05,1.1989940000000001e-05,1.262734375e-05,1.281117e-05],"3276800":[1.5395643164999999,1.539835973,1.5399310175000001,1.5442698450000001,1.544865009,1.546643293,1.5489677485,1.5501951384999999,1.5528234864999999,1.553984222,1.5545576059999999,1.560195403,1.5617847064999999,1.5628852449999999,1.564494225,1.5652268085000001,1.5659043770000001,1.5682886575000001,1.5964103000000001,1.6289076805],"55296":[0.0090955580000000001,0.009285092,0.009320620999999996,0.0093256199999999963,0.0093437499999999996,0.0093805989999999999,0.0094371339999999998,0.009480937,0.0094951569999999954,0.0095218145000000032,0.0095233699999999963,0.0095868990000000012,0.0095977330000000007,0.0096214580000000029,0.0096571845000000007,0.0096761579999999955,0.009697008,0.0097200180000000004,0.0099649079999999963,0.010366314],"688128":[0.214168527,0.2181401415,0.22088110100000002,0.22103848000000001,0.22470440699999999,0.225963213,0.22650350699999999,0.22853728499999998,0.228773054,0.23240308700000001,0.23249315349999999,0.232515692,0.23598915000000001,0.23646288500000001,0.23817867849999999,0.23821273700000001,0.2408926005,0.24109188949999999,0.24266913800000001,0.25334969099999999],"8192":[0.0010281590000000001,0.0010372600000000001,0.001039311,0.001042692,0.00104685,0.0010481849999999999,0.001049035,0.0010563763333333331,0.0010591848750000003,0.0010661253333333336,0.001071319,0.001071598,0.001078528,0.0010831231111111113,0.0010835217777777776,0.0010840909999999999,0.0011234295,0.001126145875,0.0011322035,0.0011428648749999999],"10240":[0.0014305069999999999,0.0014479570000000002,0.0014589471666666669,0.001468373,0.0014778110000000005,0.0014820536666666664,0.001487684,0.001489766,0.001492869,0.0014929771666666665,0.0014973320000000001,0.001504465,0.0015119968333333334,0.001522554,0.0015233079999999997,0.0015334035,0.0015532318,0.0015701738333333333,0.0016465126666666669,0.0016493968333333331],"15872":[0.0022726449999999998,0.0022832620000000016,0.002299546,0.0023006655000000001,0.0023023310000000012,0.002307668000000001,0.0023160407500000002,0.0023274922499999999,0.00232838275,0.0023435336666666673,0.0023444322500000008,0.0023450602500000002,0.0023516685000000001,0.0023581560000000001,0.002367545,0.0023819319999999998,0.0023864450000000001,0.0023956810000000002,0.0024907293333333328,0.0025974396666666672],"92":[1.046933e-05,1.1360590909090908e-05,1.1505000000000001e-05,1.1614727272727272e-05,1.1647999999999999e-05,1.1685428571428572e-05,1.17342e-05,1.1813979999999999e-05,1.1846500000000001e-05,1.1882559999999999e-05,1.1889470000000002e-05,1.1918160000000001e-05,1.218412e-05,1.23405e-05,1.2369329999999999e-05,1.2436039999999999e-05,1.2690150000000001e-05,1.2829560000000001e-05,1.289639e-05,1.378714e-05],"26624":[0.0037979350000000001,0.0038287459999999996,0.0038531639999999983,0.0038929110000000002,0.003902745,0.0039191240000000013,0.0040119050000000005,0.0040494120000000005,0.0040745599999999996,0.0040779419999999985,0.0040859360000000001,0.004101358000000002,0.0041040350000000015,0.0041340085000000004,0.0041704175000000007,0.0042037759999999976,0.0042304699999999983,0.0042624240000000025,0.0043139064999999999,0.0044063344999999993],"1792":[0.000240036,0.00024574199999999991,0.00024938900000000009,0.0002494140000000001,0.00025038650000000002,0.0002555279411764706,0.00025683699999999989,0.000256889,0.00025815166666666667,0.00026057399999999991,0.0002605765,0.00026088347368421062,0.00026125155882352933,0.0002621096666666667,0.0002630391388888889,0.0002635990000000001,0.00026406266666666661,0.00026443044444444432,0.00026649400000000009,0.000270943],"11776":[0.0016813729999999999,0.0016827992000000007,0.0016842210000000003,0.0016962505999999992,0.0016984815999999993,0.0017044999999999999,0.0017063366000000008,0.0017141330000000001,0.0017175762,0.00171802,0.0017199183999999999,0.001720346,0.0017350125000000001,0.0017374952,0.0017480511999999997,0.0017543446000000001,0.0017632737999999999,0.0017696249999999999,0.001829109,0.0019556069999999998],"2944":[0.00039280199999999993,0.00039483200000000002,0.00040990599999999997,0.00041168500000000007,0.00041363700000000001,0.000416883,0.00041832399999999997,0.00042143399999999988,0.00042174500000000001,0.00042589,0.00042782786956521745,0.00042947699999999999,0.00043265160869565219,0.00043382300000000001,0.00043936149999999983,0.00044019545454545455,0.00044058559090909088,0.00044735542857142843,0.000465883,0.00047376699999999983],"88":[1.046102e-05,1.1205607142857144e-05,1.1235e-05,1.1414070000000001e-05,1.1419990000000002e-05,1.148285e-05,1.150465e-05,1.153119e-05,1.1548e-05,1.161673e-05,1.1685529999999999e-05,1.1736459999999999e-05,1.1805609999999998e-05,1.180803e-05,1.1821360000000001e-05,1.1831459999999999e-05,1.209851e-05,1.2337400000000002e-05,1.233891e-05,1.3410850000000001e-05],"22528":[0.003230489,0.003243740666666666,0.0032495095,0.003252348,0.0032631393333333327,0.00326501,0.003269288,0.0033050854999999999,0.0033091495000000014,0.003321283,0.0033626575,0.003372197,0.0033792659999999988,0.0033838745,0.0033848185000000001,0.0033994070000000001,0.0034178205,0.003462976,0.0034751249999999999,0.003535803499999999],"1245184":[0.47258137500000003,0.48246489199999998,0.48736741649999998,0.489301129,0.49057806900000001,0.49069089600000004,0.492443564,0.493222455,0.49591989800000003,0.50044189350000001,0.50071590899999996,0.50170414299999999,0.50505956699999999,0.51629213549999997,0.51830597450000004,0.51905922100000002,0.51999770349999996,0.52135367799999999,0.52200514350000005,0.52523422649999996],"15728640":[8.4062488814999998,8.4289694690000001,8.4293289349999991,8.4297950830000001,8.4298616370000001,8.4316801869999995,8.4320699900000005,8.4340396354999996,8.4342971319999993,8.4567741610000002,8.4592105310000001,8.4595600780000009,8.4605725515000003,8.4668434614999999,8.4685938239999992,8.4696133029999991,8.4742257804999994,8.4897173089999995,8.4983206915,8.5010847849999998],"96":[1.1227040000000001e-05,1.2146940000000002e-05,1.2193499999999999e-05,1.2268299999999999e-05,1.2325400000000001e-05,1.2453640000000002e-05,1.2506419999999999e-05,1.2666389999999999e-05,1.2686476190476191e-05,1.273337e-05,1.2745470588235295e-05,1.2799000000000001e-05,1.295407e-05,1.298604e-05,1.3003050000000001e-05,1.3261460000000001e-05,1.339954e-05,1.3416439999999999e-05,1.343595e-05,1.366906e-05],"1984":[0.0002662600000000001,0.00026834999999999999,0.00026847500000000006,0.00026964800000000004,0.00027218799999999998,0.00027619599999999998,0.00027779836363636364,0.0002790135,0.00027918666666666659,0.00028077049999999991,0.00028173100000000002,0.00028391100000000014,0.00028451650000000002,0.0002845746666666667,0.0002858659999999998,0.00028796173529411763,0.00029333900000000015,0.00029466999999999986,0.0003003201612903227,0.00030864196551724137],"139264":[0.028231656000000001,0.0283343455,0.0283787125,0.028900052500000006,0.029064931999999998,0.029100396000000001,0.0291360575,0.029385926999999999,0.029394409999999999,0.029400509500000005,0.029655493999999987,0.029707596999999985,0.029784165499999994,0.029830376999999998,0.029961575000000001,0.030466667999999985,0.0305085155,0.030648050500000013,0.0309903965,0.03255941150000001],"475136":[0.12998669500000001,0.13048717500000001,0.13224481499999999,0.134399888,0.1349102955,0.13536120900000004,0.1358770655,0.13613774899999997,0.13628628149999999,0.13770137299999999,0.13898360800000001,0.139613875,0.13981407300000001,0.140992283,0.1413395965,0.14248143099999999,0.14306063250000001,0.146293116,0.14703455400000001,0.14723414700000001],"13631488":[7.2442564034999997,7.2466864080000004,7.2481022429999999,7.2504097625000004,7.2514714160000002,7.2592553100000003,7.2619707020000002,7.2658397089999998,7.2666262975000002,7.2693806335,7.2756943585,7.2780847499999997,7.2790772534999997,7.2800951014999997,7.2807861364999997,7.2831098164999997,7.2865698800000001,7.2880728079999999,7.2904294304999997,7.2975728770000003],"416":[5.6850382352941178e-05,5.7119e-05,5.7160306451612901e-05,5.7833790000000001e-05,5.8103000000000003e-05,5.815992e-05,5.8403200000000004e-05,5.8409980000000003e-05,5.8585219999999997e-05,5.8851870000000003e-05,5.8864147058823531e-05,5.9138090000000002e-05,5.9718333333333334e-05,5.9799109374999998e-05,5.9969790000000002e-05,6.0012980000000002e-05,6.0085720000000001e-05,6.1709319999999997e-05,6.2657689655172414e-05,6.4930666666666672e-05],"928":[0.00012396299999999999,0.00012793436363636365,0.00012829200000000004,0.00012882900000000004,0.000129071,0.00013021700000000004,0.00013142700000000001,0.00013198300000000001,0.000132896,0.000132979,0.00013422704054054052,0.00013433336619718313,0.000134874,0.00013570206249999999,0.00013649733333333334,0.0001371942,0.000138007,0.00013857999999999999,0.00014013892424242423,0.00014469989090909092],"512":[5.7732999999999998e-05,6.0751999999999997e-05,6.0971000000000003e-05,6.1222000000000004e-05,6.1439000000000006e-05,6.2038000000000005e-05,6.2869999999999999e-05,6.3528000000000006e-05,6.3742458333333337e-05,6.4139000000000004e-05,6.5668404255319143e-05,6.6037330000000001e-05,6.6285900000000002e-05,6.7069000000000004e-05,6.7237717391304354e-05,6.7465042553191485e-05,6.7600000000000003e-05,6.826523e-05,6.8526430000000004e-05,6.8674688888888886e-05],"18432":[0.0026323459999999998,0.0026366999999999992,0.0026621373333333329,0.002684671,0.0026876310000000002,0.0026996076666666669,0.002700473666666666,0.002703376,0.0027092066666666672,0.0027126356666666664,0.0027198606666666669,0.0027417053333333328,0.0027429579999999998,0.0027481620000000002,0.0027516223333333327,0.0027781650000000013,0.0028430910000000011,0.0028611163333333339,0.0029862759999999999,0.0030968720000000005],"16777216":[8.7604524870000002,8.7699736159999997,8.7754662880000005,8.7888115859999996,8.7982464834999998,8.7993783914999995,8.8010342245000004,8.8035349575000001,8.8081676009999992,8.8098921059999995,8.8162041210000002,8.8231680150000003,8.8234627400000001,8.8238988159999998,8.8246716579999998,8.8250315434999997,8.8253996504999996,8.8361731320000008,8.8577451089999997,9.1268027355000001],"9728":[0.001367762,0.001373965,0.001374838,0.0013781570000000003,0.0013844320000000001,0.001385559,0.0013904780000000001,0.0013949723333333333,0.0014041420000000002,0.001409799,0.001410059,0.0014121641666666671,0.001417976,0.0014236028333333337,0.0014392896666666668,0.0014477579999999999,0.001450254,0.0014569198333333334,0.0015128704999999997,0.0015259486666666664],"1769472":[0.72651085700000007,0.74199853100000002,0.74312688700000007,0.74425761400000001,0.74443579000000004,0.74698585100000003,0.75191759899999999,0.75924006300000002,0.75978214799999999,0.76018115399999997,0.76118002750000002,0.76187891149999998,0.76246911800000006,0.76450128549999996,0.76493777950000008,0.77089988999999992,0.78076692800000003,0.78164320499999995,0.78515214499999997,0.81839814300000002],"1703936":[0.70467718499999998,0.71016223249999999,0.71037538249999999,0.71201894600000004,0.71289561899999998,0.71445242549999999,0.7164090045,0.71648721999999998,0.72574030050000005,0.72578183149999997,0.72690183050000001,0.72773028350000002,0.72866500000000001,0.73129741550000005,0.73445752050000002,0.73534187350000002,0.74566087699999994,0.74585932649999998,0.74620449700000002,0.77135830249999993],"2048":[0.000246832,0.00024920000000000009,0.00025420600000000004,0.00025507500000000001,0.000255123,0.00025670500000000003,0.00025908533333333331,0.00026136000000000009,0.00026335199999999995,0.00026713932352941176,0.0002697009999999999,0.0002714495,0.00027151975,0.00027742499999999998,0.00027763820588235297,0.00027936162857142852,0.0002814999999999999,0.00028244300000000001,0.00028297100000000013,0.00028394600000000009],"14336":[0.0020172249999999988,0.0020417159999999998,0.002051275,0.0020569389999999998,0.0020701170000000002,0.0020782120000000003,0.0020800635000000007,0.0020822220000000008,0.0020835189999999998,0.002084299,0.0020923409999999997,0.0020944260000000004,0.0021001029999999999,0.0021069679999999999,0.0021270729999999989,0.0021385584999999998,0.0021415680000000012,0.0021437202499999999,0.0021538975000000007,0.00216669775],"448":[5.8072999999999998e-05,5.9324999999999999e-05,6.0601120000000006e-05,6.1369000000000001e-05,6.1562868852459019e-05,6.1924803571428581e-05,6.2389125000000004e-05,6.2416829999999997e-05,6.2835982758620689e-05,6.3288069999999999e-05,6.3387836363636369e-05,6.3559392156862748e-05,6.3589380000000003e-05,6.3906880000000002e-05,6.416413e-05,6.5472499999999994e-05,6.6624859999999997e-05,6.7211124999999993e-05,6.7630230000000004e-05,6.8099899999999995e-05],"5505024":[2.7106756779999999,2.7154366185000001,2.721217502,2.7215439579999998,2.7286523009999999,2.7366597989999999,2.7384246535000001,2.7414494385000001,2.7418131020000001,2.7488852659999998,2.7518581549999999,2.7525322120000002,2.7531472949999998,2.7532635394999998,2.7567882199999998,2.7604515410000001,2.7618982710000002,2.7643053394999999,2.7652290984999999,2.7675763739999999],"544":[7.1732999999999999e-05,7.3361521739130433e-05,7.3504000000000006e-05,7.3841e-05,7.3906999999999996e-05,7.4538999999999999e-05,7.4678999999999994e-05,7.5762269230769227e-05,7.5913899999999998e-05,7.5993391304347827e-05,7.6401580000000002e-05,7.6415869999999999e-05,7.6435080000000001e-05,7.6597541666666665e-05,7.7442730000000005e-05,7.7649030000000004e-05,7.8007115384615383e-05,7.8645810000000006e-05,8.0628770000000001e-05,8.0839130434782607e-05],"221184":[0.048208613499999997,0.049209725500000003,0.049601032999999996,0.050314287999999999,0.050355435999999996,0.0505731055,0.050643352500000002,0.050753709500000001,0.051132377999999999,0.051248706499999998,0.051943779000000023,0.052028352999999992,0.05223129,0.052957321999999987,0.053235080999999997,0.053449257,0.054124645000000027,0.054741169000000013,0.0549183185,0.055060955999999994],"90112":[0.016647780499999983,0.016761613000000002,0.016940143499999991,0.017085376000000006,0.017093314500000008,0.017118129999999999,0.017140219499999991,0.017151858500000013,0.017225559000000001,0.017248625,0.017289713999999994,0.017376253000000001,0.017389448999999994,0.017393641499999991,0.01742554,0.017467554999999996,0.017589558000000009,0.017604954999999999,0.017731675000000009,0.017818593000000001],"640":[8.6297461538461533e-05,8.6756760000000007e-05,8.6961750000000008e-05,8.7151444444444456e-05,8.8141000000000009e-05,8.9689339999999998e-05,9.0096571428571439e-05,9.0493000000000002e-05,9.0639559999999996e-05,9.1110739999999998e-05,9.2159666666666664e-05,9.227606e-05,9.2409139999999999e-05,9.2868000000000006e-05,9.3065100000000011e-05,9.3113499999999995e-05,9.4642937500000001e-05,9.4969000000000005e-05,9.6604000000000012e-05,0.0001003725],"12800":[0.001791911,0.001797157,0.0018236209999999999,0.001833346,0.0018481651999999998,0.0018556712,0.0018627169999999998,0.0018635660000000001,0.0018685134,0.0018725700000000001,0.001880479,0.0018942663999999998,0.0018947290000000002,0.0018947970000000001,0.0018969829999999992,0.0018986768,0.0019027509999999998,0.0019240994,0.0019464899999999999,0.0019621],"262144":[0.055967714499999988,0.056221304,0.056237276499999989,0.056545672999999998,0.056601765499999998,0.056763386000000013,0.058234665500000025,0.058390515500000018,0.058431695999999977,0.058847195999999977,0.05901696,0.059891541499999999,0.059985582000000003,0.061365917000000013,0.061485193,0.06149999599999998,0.061521330499999992,0.061658497,0.062505451000000017,0.062874682999999987],"589824":[0.17267677200000001,0.178153071,0.181221938,0.18190331400000001,0.18278766799999999,0.18451574900000001,0.18518658899999996,0.18565787099999997,0.18583097400000004,0.18615132600000001,0.18663079799999999,0.1876161895,0.18933302200000002,0.19162530850000001,0.193718643,0.1970451225,0.19721506699999999,0.197369033,0.19744825299999999,0.197795629],"884736":[0.30516191300000001,0.30521469299999998,0.30533781700000001,0.31102867249999999,0.31118533700000001,0.31617990550000002,0.31646974,0.31658368599999998,0.31704880549999997,0.32187156650000004,0.32501455600000001,0.32671278599999998,0.32730005049999999,0.32839512749999999,0.32846817249999999,0.33077084300000004,0.33338267199999999,0.33950095349999998,0.34645111299999998,0.34860035700000003],"6144":[0.00083169799999999986,0.00087071000000000002,0.00087151100000000049,0.000874971,0.00087592799999999999,0.00088230600000000024,0.0008842600000000001,0.00088889269999999998,0.00089570209090909119,0.00090008709090909117,0.00090196699999999972,0.00090725360000000021,0.00091149690000000001,0.000915956,0.00092021899999999968,0.00092882299999999995,0.00093444200000000006,0.00096883019999999959,0.00097296140000000008,0.00098553466666666668],"1088":[0.00014503699999999999,0.00014750981818181815,0.0001513702,0.0001523070000000001,0.0001523966,0.00015347599999999999,0.00015355742857142856,0.00015617991071428572,0.00015733524999999999,0.000157973,0.0001580885,0.00015872548387096768,0.00015874433333333334,0.00015889799999999993,0.000159297,0.00016129299999999991,0.00016203663934426224,0.00016209226666666666,0.00016457,0.00017387000000000007],"576":[7.7971481481481478e-05,7.8626714285714278e-05,7.9660999999999995e-05,8.0381349999999999e-05,8.0393000000000001e-05,8.0666209999999991e-05,8.092865e-05,8.1348999999999997e-05,8.1537650000002013e-05,8.1592250000000005e-05,8.2254770000000002e-05,8.2319999999999998e-05,8.2628411764705892e-05,8.2704849999999991e-05,8.315758823529411e-05,8.3179789473684218e-05,8.3569369999999998e-05,8.4565042553191494e-05,8.7140071428571441e-05,8.8850166666666665e-05],"160":[2.0226380000000002e-05,2.0282999999999999e-05,2.118336111111111e-05,2.1269444444444442e-05,2.1345408163265308e-05,2.138535e-05,2.1435499999999998e-05,2.1515e-05,2.1691160000000001e-05,2.1706519999999998e-05,2.170738e-05,2.176085e-05,2.1773189999999999e-05,2.1848000000000002e-05,2.1906999999999999e-05,2.229898e-05,2.2564799999999998e-05,2.274525e-05,2.2827e-05,2.4203190000000002e-05],"672":[8.8562999999999999e-05,9.0160285714285717e-05,9.0554400000000002e-05,9.0879333333333343e-05,9.1156000000000006e-05,9.1542571428571438e-05,9.3988999999999997e-05,9.4655857142857147e-05,9.5255571428571421e-05,9.5697857142857141e-05,9.5760000000000005e-05,9.5904478260869569e-05,9.6099136842105263e-05,9.6460648936170216e-05,9.772137373737374e-05,9.8349533333333324e-05,9.8497122448979588e-05,0.000100413,0.00010098370588235294,0.00010275362499999999],"8912896":[4.5852726390000003,4.5857128710000001,4.586259933,4.5886302749999999,4.5913261409999997,4.5920882650000001,4.5945023020000004,4.5999482780000003,4.602508426,4.6025636299999997,4.6032395744999999,4.6055433639999999,4.6092096380000003,4.6139029980000004,4.6159903580000003,4.6167662775,4.6173915350000003,4.6275311949999995,4.6364477419999996,4.6459120635],"100":[1.164137e-05,1.2804e-05,1.286694e-05,1.2876249999999999e-05,1.3012810000000001e-05,1.3154429999999999e-05,1.319403e-05,1.3229330000000001e-05,1.327399e-05,1.3354630000000001e-05,1.345545e-05,1.3514429999999999e-05,1.363e-05,1.3631780000000001e-05,1.367337e-05,1.3706630434782607e-05,1.3713950000000001e-05,1.3935139999999999e-05,1.3940980000000001e-05,1.4407409999999999e-05],"507904":[0.142240854,0.14440880049999999,0.145700837,0.14583697800000001,0.14667436449999999,0.14799068400000001,0.15006313600000001,0.15040155499999999,0.15046822000000001,0.15062399700000001,0.15104389600000001,0.151840472,0.15202290700000001,0.15205528400000001,0.15691813900000001,0.15798727000000001,0.15813054600000001,0.16118732899999999,0.162494679,0.16324534899999998],"3840":[0.00051770500000000003,0.0005350750000000002,0.00053656599999999982,0.00053877700000000027,0.0005403430000000002,0.00054273699999999984,0.000544737,0.00054666399999999998,0.00055001399999999982,0.00055702876470588216,0.00055839882352941208,0.00056155435294117663,0.0005615771764705881,0.00056165760000000001,0.00056878406249999999,0.0005697263529411765,0.000574546,0.00057572429411764702,0.00057705899999999999,0.00059711050000000004],"192":[2.4386949999999999e-05,2.4974499999999999e-05,2.5156000000000001e-05,2.5328540000000003e-05,2.5706169999999999e-05,2.5860029999999998e-05,2.6346640000000002e-05,2.6375510000000003e-05,2.6424e-05,2.6648479999999999e-05,2.6662230000000002e-05,2.6764760000000002e-05,2.7266539999999997e-05,2.7295430000000002e-05,2.7434239999999998e-05,2.7608739999999998e-05,2.7707510000000003e-05,2.783161e-05,2.8143822222222224e-05,2.8284170000000001e-05],"376832":[0.094993756999999998,0.096345566999999993,0.097091826000000006,0.098641456999999974,0.098704256500000004,0.09901278849999999,0.09944526699999999,0.099478643000000005,0.100246698,0.10106425099999999,0.101134152,0.101355084,0.101410194,0.101668938,0.101890812,0.1023820045,0.10250443549999999,0.10384232999999998,0.1049199925,0.10840881800000002],"98304":[0.018352753499999999,0.018983009000000002,0.0190268655,0.0190651035,0.019193325000000001,0.019246211499999992,0.019417891999999999,0.019501569,0.019582466,0.019601459999999998,0.019641707000000001,0.019702522,0.019775003000000006,0.019780041999999998,0.019796097500000009,0.020069186999999992,0.020075283000000006,0.0204891975,0.020862186500000001,0.022150466000000001],"5376":[0.00073404699999999993,0.000745165,0.000753662,0.00076510999999999994,0.00076929700000000006,0.000770863,0.000771416666666667,0.00077388750000000007,0.000774065,0.00077577363636363605,0.00078033483333333348,0.00078686658333333335,0.00078858675000000012,0.00079357199999999988,0.00079542008333333331,0.00079890199999999999,0.00079907858333333318,0.00080842399999999997,0.00082018318181818176,0.00086777000000000013],"94208":[0.017737616000000008,0.017813641499999987,0.017855707999999991,0.017866068000000006,0.0179823715,0.017989480499999995,0.017998790000000008,0.018024538500000003,0.018082784999999997,0.0181668145,0.018240644,0.0183812735,0.018431673000000006,0.018471701,0.018532362,0.018589511999999999,0.018592338999999999,0.018710708999999999,0.019321317499999994,0.0196600005],"81920":[0.014925957,0.014981916,0.0150356985,0.0150652775,0.0150691295,0.015089877,0.0151063445,0.015198112,0.015244416,0.0152913615,0.015404203,0.015415045,0.0154337945,0.015436917999999999,0.015443116999999996,0.015500392,0.0156069,0.015635978999999994,0.015641083,0.015800808],"3407872":[1.6126056215,1.613106605,1.6131945750000001,1.6158762085,1.6165706135,1.6182161605000001,1.6218697070000001,1.6224955605,1.6233947049999999,1.6257201475,1.6257531700000001,1.6275743359999999,1.6279663955000001,1.628096411,1.6284618865,1.6309442510000001,1.635082929,1.641516408,1.6509233205,1.6926445750000001],"104":[1.256026e-05,1.3186166666666666e-05,1.3210555555555556e-05,1.3464420000000001e-05,1.3621440000000001e-05,1.3671589999999999e-05,1.3679999999999999e-05,1.37075e-05,1.371754e-05,1.37728e-05,1.3907699999999999e-05,1.391525e-05,1.3946230000000001e-05,1.41695e-05,1.41857e-05,1.4204e-05,1.4412509999999999e-05,1.4606e-05,1.471536e-05,1.4800999999999999e-05],"122880":[0.0238577245,0.024217256,0.024262245499999995,0.0246225835,0.024751870499999998,0.024758566000000006,0.024791215000000002,0.024850555999999999,0.024916238,0.024972695,0.025047350499999999,0.025201438999999999,0.025332150000000008,0.025390752000000016,0.025530877,0.0256343505,0.025654022000000005,0.025715188999999999,0.026270208999999996,0.027495543000000001],"200":[2.5306000000000001e-05,2.6098850000000002e-05,2.6239333333333335e-05,2.6613017241379312e-05,2.6728519230769229e-05,2.673484e-05,2.6822109999999999e-05,2.70915e-05,2.7140000000000001e-05,2.7309280000000002e-05,2.7616910000000001e-05,2.7644430000000001e-05,2.7821519999999999e-05,2.78658e-05,2.7919970000000002e-05,2.8026819999999999e-05,2.8576360000000004e-05,2.8762610000000002e-05,2.9373263157894738e-05,3.0887979999999998e-05],"163840":[0.0339692095,0.034446388000000001,0.034608258000000017,0.034782136499999998,0.034821645500000026,0.035010438000000019,0.035146267000000023,0.035420711499999993,0.035440985500000001,0.035457468999999998,0.035715359500000002,0.035772232000000001,0.036056457,0.036185039000000002,0.036259594499999999,0.036327235999999985,0.037204139000000004,0.037209993999999982,0.037431422999999998,0.039179917000000002],"4063232":[1.9349704080000001,1.9511658110000001,1.9570919680000001,1.9595554500000001,1.9633159574999999,1.9639753259999999,1.9657907990000001,1.9659480025,1.9667845155000001,1.9690794935,1.9701933439999999,1.9710764654999999,1.9754427160000001,1.9779967190000001,1.981232587,1.9815417,1.9942543214999999,2.0307540385,2.0317421900000001,2.0744695515],"5767168":[2.8492781200000001,2.8603615885,2.8696593560000001,2.8708592830000002,2.8736920489999997,2.8767856350000001,2.877656537,2.8787161239999999,2.8801939855000001,2.8802307069999999,2.8802667304999998,2.8805109899999999,2.8813371380000001,2.8840199430000002,2.884074144,2.884372312,2.9028936934999998,2.9078876564999998,2.9178912690000001,2.9207534895],"12582912":[6.6328806755,6.6453021215000003,6.6573787334999999,6.6739086544999999,6.6750390639999999,6.6754992240000002,6.6756767320000003,6.6775732495,6.6777052745000001,6.6780062579999999,6.6828510574999997,6.6832948859999997,6.6863123089999998,6.688968246,6.6900432910000003,6.7002998869999999,6.7248573509999998,6.7261811314999997,6.7504847139999997,6.9251714015000001],"1600":[0.000215916,0.00021714799999999999,0.00021997599999999998,0.000220029,0.00022269299999999999,0.00022410099999999993,0.00022596302380952391,0.00022824300000000002,0.00022868000000000007,0.00023065016666666666,0.0002306911,0.000231141,0.000231265,0.000233329,0.00023361563414634143,0.000234625,0.00023602015384615362,0.000236214,0.00023667,0.00025035900000000002],"136":[1.5401999999999999e-05,1.73e-05,1.7584e-05,1.7713000000000001e-05,1.7747000000000001e-05,1.7909600000000002e-05,1.7943490000000001e-05,1.7984600000000001e-05,1.8101199999999999e-05,1.8115970000000002e-05,1.8116409999999999e-05,1.8165709999999999e-05,1.8284320000000002e-05,1.832977e-05,1.8379290000000001e-05,1.8894949999999998e-05,1.902454e-05,1.9405679999999998e-05,1.9934219999999998e-05,3.7283999999999997e-05],"232":[3.0485333333333334e-05,3.1300999999999997e-05,3.1489499999999997e-05,3.1541999999999997e-05,3.1807909999999998e-05,3.1879142857142861e-05,3.2024860000000003e-05,3.2042000000000003e-05,3.2094380000000001e-05,3.22355e-05,3.2783719999999997e-05,3.3015000000000002e-05,3.3080090000000001e-05,3.3142710000000004e-05,3.3567510000000001e-05,3.3567891304347825e-05,3.3661999999999997e-05,3.3950540000000002e-05,3.44265e-05,3.5592900000000003e-05],"7077888":[3.5702300259999999,3.5817093514999998,3.5822070185000001,3.5828732815,3.5858240600000002,3.5871419704999998,3.5893128425,3.5959419509999999,3.5959618244999998,3.6034145440000001,3.6049936444999999,3.6090046125000002,3.6102638819999999,3.6127541340000002,3.6140888840000001,3.6141223925000001,3.6309617319999998,3.6317225130000002,3.6584033480000002,3.7214600359999999],"86016":[0.015786413499999985,0.015884705999999995,0.015928988499999998,0.015986832999999999,0.015996720499999999,0.016097882000000001,0.0160980085,0.016105172500000004,0.0161492055,0.016167710500000005,0.01617215,0.016194416999999999,0.016195564999999999,0.016200476999999998,0.016228465500000004,0.016281676500000012,0.016333364,0.016642945500000002,0.017831992999999994,0.01830611],"31744":[0.0048032070000000003,0.0048096879999999986,0.0048196754999999996,0.0048521370000000012,0.0048694380000000002,0.004910386000000001,0.0049219995000000004,0.0049689689999999984,0.004987405000000002,0.0049920280000000008,0.0050161530000000006,0.0050175619999999997,0.005077308,0.0050780860000000016,0.0050985130000000007,0.0051366910000000023,0.0051927279999999998,0.0052592960000000018,0.0053952949999999996,0.0054999980000000016],"168":[2.1462923076923077e-05,2.1583500000000001e-05,2.1616670000000001e-05,2.1860000000000001e-05,2.2204750000000001e-05,2.2216779999999999e-05,2.2226379310344829e-05,2.240316e-05,2.248593e-05,2.2655660000000001e-05,2.270645e-05,2.2809729999999998e-05,2.327108e-05,2.334906e-05,2.347265e-05,2.347736e-05,2.381585e-05,2.4074333333333334e-05,2.4582139999999999e-05,2.4722160000000003e-05],"622592":[0.18652560600000001,0.18694519300000001,0.18757381400000001,0.18928057200000001,0.19047839750000001,0.19103724,0.19514704699999999,0.19775308799999999,0.19855436000000004,0.20026576500000001,0.200583874,0.20155636800000001,0.206838358,0.2071724975,0.207322333,0.20844884850000001,0.20883139350000002,0.21032427849999999,0.21083457799999999,0.21638200600000002],"108":[1.282953e-05,1.3457666666666667e-05,1.3534333333333332e-05,1.396513e-05,1.3994859999999999e-05,1.419621e-05,1.420146e-05,1.432361e-05,1.4329e-05,1.4344370000000001e-05,1.4493250000000001e-05,1.4538299999999999e-05,1.45515e-05,1.4595890000000001e-05,1.468024e-05,1.4921520000000001e-05,1.493533e-05,1.495371e-05,1.5033170000000002e-05,1.518343e-05],"327680":[0.079558055000000016,0.08092580399999999,0.082469960000000037,0.082649072000000004,0.083880671999999976,0.083916228000000023,0.083955215999999985,0.083974825999999975,0.08399247,0.084235678500000036,0.084737781999999998,0.08530177550000001,0.086532336999999987,0.086825357500000006,0.088133763999999976,0.088500203999999999,0.091974589000000009,0.092007976999999991,0.09282465199999998,0.099521416999999945],"2176":[0.000299578,0.00030016199999999998,0.00030254799999999998,0.00030306199999999999,0.000305469,0.000306175,0.0003079274838709677,0.00030867600000000002,0.00030911600000000001,0.0003109303666666666,0.000311112,0.00031309290322580643,0.00031824699999999991,0.00032036100000000002,0.000320732,0.000321193,0.00032210814814814814,0.00032906799999999996,0.00033024779999999999,0.00033147599999999998],"3328":[0.000455241,0.000464964,0.00046735899999999998,0.00048040399999999998,0.00048154494736842094,0.00048271085000000025,0.00048424599999999997,0.00048467794999999998,0.00048561749999999999,0.000486854,0.00048702164999999998,0.00048845830000000009,0.0004908515,0.00049120839999999984,0.00049540299999999973,0.00049598999999999986,0.00050098599999999992,0.00050302852631578944,0.00050980421052631577,0.00051028052631578945],"1":[1.5557000000000001e-07,1.5568e-07,1.5613000000000001e-07,1.5804e-07,1.5813e-07,1.5882000000000002e-07,1.5892e-07,1.5897999999999998e-07,1.5900999999999999e-07,1.5908000000000002e-07,1.5939e-07,1.6095000000000002e-07,1.6339000000000001e-07,1.6422999999999998e-07,1.6637e-07,1.6651e-07,1.7193e-07,1.7428999999999998e-07,1.7851e-07,1.8484999999999999e-07],"2":[2.5184000000000001e-07,2.5192e-07,2.5277000000000001e-07,2.5287000000000001e-07,2.5289000000000004e-07,2.5298000000000003e-07,2.5319000000000001e-07,2.5363999999999999e-07,2.5426e-07,2.5502999999999997e-07,2.5516999999999997e-07,2.5534999999999997e-07,2.6596999999999999e-07,2.7253000000000002e-07,2.7539999999999999e-07,2.7578e-07,2.7709e-07,2.7761000000000001e-07,2.7928e-07,3.0250999999999997e-07],"3":[3.8924999999999997e-07,3.9106999999999997e-07,3.9357000000000005e-07,4.1032000000000004e-07,4.1055999999999999e-07,4.1305000000000001e-07,4.1860999999999996e-07,4.2754999999999999e-07,4.2778999999999999e-07,4.2913000000000003e-07,4.3061000000000002e-07,4.3074e-07,4.3281000000000002e-07,4.3476000000000001e-07,4.5411999999999999e-07,4.5998000000000002e-07,4.6484999999999998e-07,4.6502999999999998e-07,4.6533000000000005e-07,4.6904999999999998e-07],"4":[4.4119000000000005e-07,4.4317999999999998e-07,4.4359000000000002e-07,4.4817999999999998e-07,4.8258000000000002e-07,4.8405000000000005e-07,4.8569999999999996e-07,4.8607999999999997e-07,4.8610999999999995e-07,4.8818000000000002e-07,4.9047000000000002e-07,5.0442000000000001e-07,5.0837999999999995e-07,5.1177999999999999e-07,5.1289999999999999e-07,5.2211000000000001e-07,5.3002000000000003e-07,5.3468999999999998e-07,5.3756999999999996e-07,5.4822000000000002e-07],"7424":[0.0010377019999999999,0.001046471,0.0010500920000000001,0.001060411,0.001063968,0.001064249,0.0010705096666666666,0.0010714539999999999,0.001072064,0.0010734347499999999,0.0010747176666666665,0.0010875492222222223,0.0010906680000000001,0.001091428,0.0010918332222222223,0.001093627,0.0010940022222222226,0.0011016330000000001,0.0011045557499999999,0.001206873],"5":[6.1289000000000003e-07,6.2610999999999999e-07,6.4276000000000007e-07,6.4494e-07,6.4593999999999997e-07,6.4853999999999996e-07,6.4858999999999996e-07,6.5061000000000003e-07,6.5224999999999998e-07,6.5333000000000004e-07,6.5621000000000002e-07,6.8828000000000002e-07,6.8879000000000002e-07,6.896100000000001e-07,6.9544999999999994e-07,7.0950000000000005e-07,7.2666000000000002e-07,7.5089999999999998e-07,7.5785999999999993e-07,7.7263999999999996e-07],"23552":[0.0033543550000000011,0.0034269859999999999,0.003450000999999999,0.0034506565,0.0034745975,0.0034768029999999992,0.0034769750000000002,0.0034775435000000006,0.003481764,0.0035108240000000005,0.0035342625,0.0035365279999999984,0.003564635,0.0035828225,0.003601188,0.003619984000000001,0.0036536749999999986,0.0037225994999999998,0.003766288,0.003774225],"6":[7.1891000000000008e-07,7.2900999999999999e-07,7.4247999999999996e-07,7.4870999999999999e-07,7.5412000000000003e-07,7.6192000000000009e-07,7.709e-07,7.8552000000000006e-07,7.8745999999999993e-07,7.9227999999999989e-07,7.9333999999999993e-07,7.9599999999999998e-07,8.0080000000000002e-07,8.1500000000000003e-07,8.2619000000000007e-07,8.4895000000000004e-07,8.5555000000000001e-07,8.5581000000000009e-07,8.5764e-07,8.9838000000000003e-07],"61440":[0.010469164999999999,0.010520962,0.010591135,0.0106482,0.0106704915,0.010718980500000001,0.0107524505,0.010804643000000003,0.010892644,0.0109100825,0.010928463500000003,0.0110315975,0.0110341555,0.011047046,0.011067244,0.011117489499999999,0.0111544765,0.0111745145,0.0111745925,0.011279957],"491520":[0.1360545085,0.13606275599999995,0.13709782349999999,0.13749666099999999,0.13860421249999999,0.13947062999999998,0.13969067900000001,0.14251580550000001,0.14268134500000001,0.14524615399999999,0.14586695,0.14655267999999999,0.14998162500000001,0.150957534,0.15314702599999999,0.15347080299999999,0.155273519,0.15576111400000001,0.16041844899999999,0.16135774999999999],"77824":[0.01400852,0.014105332500000015,0.014308688,0.0143143705,0.014329347500000001,0.0143450555,0.014480762500000004,0.014545309499999992,0.014560687499999999,0.01460231,0.01463967,0.0146764875,0.0147079095,0.0147604125,0.014782196000000006,0.014930567,0.0149331255,0.014979051,0.015361469000000006,0.015751933000000003],"7":[8.2261000000000003e-07,8.3302999999999999e-07,8.3418000000000008e-07,8.6644000000000002e-07,8.7337999999999995e-07,8.8230000000000001e-07,8.9802000000000004e-07,9.1014000000000002e-07,9.1773e-07,9.2215999999999999e-07,9.2582000000000001e-07,9.2614999999999991e-07,9.3791999999999997e-07,9.4813000000000006e-07,9.4982999999999998e-07,9.5152000000000004e-07,9.6267999999999999e-07,9.7329e-07,9.9527000000000004e-07,1.02972e-06],"8":[8.3488999999999998e-07,8.6189e-07,8.6701999999999994e-07,8.6842000000000004e-07,8.7981999999999995e-07,8.8141999999999996e-07,8.8958999999999996e-07,9.0636000000000008e-07,9.2423999999999992e-07,9.4491000000000001e-07,9.6099999999999999e-07,9.7600000000000006e-07,9.8079999999999999e-07,9.8153000000000003e-07,9.9199999999999999e-07,9.9518999999999995e-07,1.01306e-06,1.01908e-06,1.02073e-06,1.03381e-06],"208":[2.7061000000000001e-05,2.7432499999999999e-05,2.7546023809523807e-05,2.7728280000000002e-05,2.844592e-05,2.8525780000000003e-05,2.8821000000000001e-05,2.9325140000000001e-05,2.9347439999999999e-05,2.9775819999999998e-05,2.9794119999999998e-05,2.9958319999999999e-05,3.0073529999999998e-05,3.0196239999999997e-05,3.0602000000000003e-05,3.0692580000000004e-05,3.0963000000000002e-05,3.1681090909090908e-05,3.2086750000000002e-05,3.2908289999999997e-05],"9":[1.0559900000000001e-06,1.0796100000000001e-06,1.0862099999999999e-06,1.0965800000000001e-06,1.10635e-06,1.12078e-06,1.1404600000000001e-06,1.1458999999999999e-06,1.1574699999999999e-06,1.1843400000000001e-06,1.18881e-06,1.19178e-06,1.19829e-06,1.20109e-06,1.20614e-06,1.2136999999999999e-06,1.2489e-06,1.28124e-06,1.3273899999999999e-06,1.3981099999999999e-06],"73728":[0.013273147000000002,0.013301024,0.01334628850000002,0.013417799499999999,0.013488883,0.0135652745,0.013594461,0.013647795000000023,0.013695998000000004,0.013711863999999995,0.013713142000000001,0.01373979,0.0137579955,0.013760707,0.013858411499999996,0.0139169515,0.0141470065,0.014313064,0.015053103,0.0151978845],"304":[3.9767000000000001e-05,4.1039195121951221e-05,4.1211083333333332e-05,4.1445851851851848e-05,4.1646454545454547e-05,4.1726e-05,4.1935239999999994e-05,4.2222000000000003e-05,4.2282708333333333e-05,4.2312440000000001e-05,4.2588e-05,4.2779819999999995e-05,4.310062e-05,4.3203879999999993e-05,4.3434700000000006e-05,4.352305e-05,4.374691e-05,4.3932520000000001e-05,4.4390659999999999e-05,4.6267000000000003e-05],"400":[5.2490500000000002e-05,5.3118999999999997e-05,5.32745e-05,5.3956000000000003e-05,5.4144000000000002e-05,5.5193499999999999e-05,5.56915e-05,5.6215220000000005e-05,5.6554592105263163e-05,5.6892597014925368e-05,5.733463e-05,5.7336999999999997e-05,5.7345465753424652e-05,5.8389410000000001e-05,5.8446000000000003e-05,5.9451169999999995e-05,6.0356999999999998e-05,6.1966500000000004e-05,6.1985999999999999e-05,6.3470298245614038e-05],"1310720":[0.50325486799999997,0.50472419300000004,0.51368564400000005,0.51730264950000004,0.51958168999999998,0.52228903950000005,0.52234420599999998,0.522765759,0.52363126799999993,0.52492001799999999,0.53044198600000003,0.53077833649999995,0.53086935899999999,0.53132615549999995,0.53314649749999998,0.53397973499999996,0.54614813900000003,0.54693064550000003,0.55710752600000002,0.56608442400000003],"336":[4.4252000000000003e-05,4.477976470588235e-05,4.4937083333333337e-05,4.5851444444444449e-05,4.5935090909090904e-05,4.6232449999999998e-05,4.63245e-05,4.6715100000000003e-05,4.6728142857142854e-05,4.6730545454545458e-05,4.7056399999999999e-05,4.7200380000000002e-05,4.7571009999999996e-05,4.7707329999999998e-05,4.7709e-05,4.7721569999999999e-05,4.7836359999999999e-05,4.8246494736842109e-05,4.966821875e-05,5.1582499999999996e-05],"3670016":[1.729722701,1.7410397070000001,1.7416885520000001,1.7420946595,1.7425206470000001,1.7449167720000001,1.7472691679999999,1.748047981,1.7522373629999999,1.7535803114999999,1.7544222460000001,1.7576807320000001,1.7601237425,1.7604563705,1.766370843,1.7684309439999999,1.771521728,1.7734638110000001,1.783395912,1.8298084269999999],"6656":[0.00092116799999999999,0.00093143800000000025,0.00093291199999999993,0.00093989999999999992,0.000943438,0.00094588300000000001,0.00094659500000000005,0.00095167799999999953,0.00095304800000000007,0.00095404799999999955,0.00095777233333333312,0.00096698677777777814,0.00097049019999999959,0.00097095540000000004,0.00098374899999999947,0.00098380199999999998,0.00098677755555555543,0.00098775070000000037,0.0010125989999999999,0.0010359989999999999],"15360":[0.0021647329999999994,0.0021662170000000002,0.00220536075,0.0022070269999999999,0.0022112220000000001,0.0022112989999999999,0.0022160450000000007,0.0022166009999999995,0.0022178277500000004,0.0022203869999999999,0.0022231,0.0022419272499999998,0.0022543067499999998,0.0022560799999999989,0.002278993,0.0022811700000000008,0.0022890090000000007,0.00229336725,0.002294188,0.0023476340000000012],"432":[5.6487000000000003e-05,5.8190499999999998e-05,5.8872000000000001e-05,5.9528669999999996e-05,5.9673410000000004e-05,6.0585403225806454e-05,6.0631718749999997e-05,6.0709640000000002e-05,6.0738049180327874e-05,6.1529020000000001e-05,6.1751298245614036e-05,6.2307053571428569e-05,6.2458499999999998e-05,6.2650999999999994e-05,6.2807409999999998e-05,6.3044250000000005e-05,6.3576000000000003e-05,6.4815471698113209e-05,6.5691980000000006e-05,6.6549560000000001e-05],"950272":[0.32941386499999997,0.33518081199999999,0.34417503300000002,0.345612751,0.34956224149999998,0.35084665399999998,0.35131748600000001,0.35478377799999999,0.35568618399999996,0.35668376299999999,0.35702774700000001,0.36050297649999996,0.36306664249999998,0.36324434999999999,0.36389065599999998,0.36512930200000004,0.365315432,0.37402258050000003,0.39140907000000003,0.3919010705],"655360":[0.20382061400000001,0.20386349400000001,0.20520752,0.20641700800000001,0.209425256,0.21060959750000002,0.2106675435,0.21082326200000001,0.212053141,0.21287912499999995,0.21714407650000001,0.21766240999999997,0.21923357199999999,0.221274213,0.22215072,0.22217271699999999,0.22474373,0.22503480999999997,0.22542304600000002,0.2291425755],"69632":[0.012208413999999997,0.012481276499999996,0.012666031999999999,0.012721046000000017,0.012739476,0.012743322,0.012778612999999999,0.012816978,0.012846528999999999,0.012851302,0.012915237499999999,0.013021016,0.013057423,0.013136315000000001,0.013153452,0.013204837000000001,0.013243734,0.013267265,0.014850601999999999,0.015086632000000006],"11264":[0.001588643,0.0016036689999999996,0.0016078671999999999,0.0016119139999999994,0.001617474,0.0016246268000000002,0.0016262049999999999,0.0016266360000000001,0.0016343,0.0016364033333333334,0.001636684,0.001653833,0.001655323,0.0016728015999999996,0.0016877866000000001,0.001690263,0.0017209790000000005,0.00172813,0.0017690992,0.0017813929999999992],"2752512":[1.2414642709999999,1.2557440070000001,1.256799556,1.2638301924999999,1.2672623009999999,1.267963677,1.2690780070000001,1.2698435990000001,1.271649459,1.2727351630000001,1.2767935879999999,1.2809441930000001,1.2828185670000001,1.2853038919999999,1.2888829314999999,1.2947944794999999,1.29611386,1.3044477649999999,1.3096573789999999,1.3168428190000001],"8126464":[4.1195502169999996,4.157543531,4.1575521750000002,4.1577696435,4.1586332544999998,4.1603379484999996,4.1605405529999997,4.1612694250000004,4.1619056649999999,4.1624348849999997,4.1691767244999998,4.1720768939999999,4.1755483099999999,4.1797495705000003,4.185928015,4.1866698339999999,4.1867645370000002,4.2345534110000003,4.2613266970000003,4.3480502065],"27648":[0.0040136275000000003,0.0040486554999999997,0.0040547769999999999,0.0040696665000000019,0.004090504,0.0041201939999999998,0.004128393499999999,0.0041326255000000015,0.0041735380000000001,0.0041769210000000001,0.0041885080000000014,0.0042476305000000002,0.004261656,0.0042699040000000023,0.0043184750000000004,0.0043303479999999986,0.0043382270000000018,0.0043422284999999981,0.0043608605,0.0043868034999999996],"368":[4.8602400000000001e-05,4.9280000000000003e-05,4.9859240000000001e-05,5.0707427083333333e-05,5.1262479999999998e-05,5.1709000000000002e-05,5.1761244444444444e-05,5.1989009999999994e-05,5.2308240000000005e-05,5.2328797619047617e-05,5.2674790000000005e-05,5.292695e-05,5.3590929999999998e-05,5.3971149999999999e-05,5.3993219999999998e-05,5.5273874999999998e-05,5.6159763157894737e-05,5.7493550000000005e-05,5.7627579999999996e-05,5.8507702127659576e-05],"65536":[0.0105963805,0.010732201,0.010797763,0.0108480485,0.010860516000000001,0.010875064,0.010885917,0.0109380615,0.010952044499999999,0.0109613505,0.010998471000000003,0.011074947000000005,0.011119159999999999,0.011122643999999996,0.0111867015,0.011310449,0.0114025455,0.011459774000000001,0.011709279,0.01171288],"16252928":[8.6837033140000006,8.7108922784999994,8.7194826044999996,8.7241367249999993,8.7248363664999999,8.7326074340000002,8.7332877814999996,8.7337864434999997,8.7394664705,8.7486844295000008,8.7557613629999995,8.7639540425,8.7643616649999991,8.767494568,8.7726477640000002,8.7744232189999991,8.7883608454999997,8.8063817934999999,8.8261875609999993,8.9688539365000004],"464":[6.0069999999999999e-05,6.0694999999999994e-05,6.1289499999999997e-05,6.1371000000000006e-05,6.2764666666666666e-05,6.3959000000000002e-05,6.4027000000000002e-05,6.4653674418604654e-05,6.5410117647058828e-05,6.5424272727272734e-05,6.5658260000000005e-05,6.5786999999999999e-05,6.5793520000000008e-05,6.5839249999999995e-05,6.5930000000000001e-05,6.6291179999999992e-05,6.6536230000000004e-05,6.7082456521739132e-05,6.9540449999999992e-05,6.969491000000001e-05],"1015808":[0.35967044399999998,0.36525053400000002,0.36644724400000001,0.36852821499999999,0.37304126900000001,0.37732092900000003,0.38188474800000005,0.38239068499999995,0.38375741200000002,0.38855881450000002,0.39267284499999999,0.39286955400000001,0.39287390150000001,0.39424366799999999,0.39435843100000001,0.39699698300000003,0.39702362600000002,0.39808440099999998,0.398513744,0.41919177200000002],"3072":[0.00043072449999999996,0.00043324599999999982,0.00043386499999999997,0.00043702709090909074,0.00043845599999999999,0.00044095652380952353,0.00044316366666666675,0.00044344499999999994,0.0004459100909090909,0.00044618399999999997,0.00045106295238095233,0.00045158957142857147,0.000458904,0.00046218019047619045,0.0004643715,0.00046660514999999998,0.00046662809523809494,0.00047014400000000003,0.00049858400000000005,0.00051265521052631566],"110592":[0.021322372500000002,0.021354493999999995,0.021573647500000001,0.021672043499999998,0.021699107000000002,0.021839313999999995,0.021839888499999998,0.021945156,0.021982343499999991,0.021990185000000002,0.022031053999999991,0.022031743999999995,0.022050315000000001,0.022113710499999994,0.022194387999999999,0.022514806500000002,0.022562510500000001,0.022565239500000001,0.022698055000000002,0.022947803999999995],"237568":[0.054498718499999974,0.054945584499999998,0.055019650999999982,0.055148337499999998,0.055321051999999996,0.055522698000000002,0.0556534635,0.055676254999999987,0.055810444000000001,0.056239198499999997,0.056247371000000004,0.056300580999999982,0.056782092999999964,0.056968149999999981,0.057369331999999974,0.058190407,0.058681358500000003,0.05869640949999997,0.058739251000000027,0.059844545999999998],"278528":[0.06384609849999999,0.064300898499999967,0.06572037750000001,0.06592452,0.066257252000000016,0.066736908000000011,0.06764571400000001,0.067805478000000002,0.067836524499999967,0.068240230000000027,0.069405709999999968,0.069645524,0.069739186999999966,0.069807161000000034,0.069816248999999997,0.070222865499999967,0.070365755000000002,0.071043074999999997,0.071312227000000034,0.07719262399999996],"496":[6.61245e-05,6.6241000000000005e-05,6.7815e-05,6.8378000000000002e-05,6.8472000000000004e-05,6.8892000000000004e-05,6.9068729999999994e-05,6.9085999999999996e-05,6.9423499999999997e-05,6.9519680000000003e-05,7.0227742857142868e-05,7.0320911764705881e-05,7.0521390243902444e-05,7.1192128205128214e-05,7.1242179487179493e-05,7.1434920000000004e-05,7.1505049999999991e-05,7.156969e-05,7.2021569999999993e-05,7.6333309999999997e-05],"13107200":[6.9268334544999997,6.9365315389999997,6.9418867909999999,6.9443754225000003,6.9445066219999996,6.9504726704999999,6.9521739394999997,6.9560994955000002,6.9594510544999997,6.9602320100000004,6.9651752734999999,6.9660781964999998,6.9796239670000002,6.9807940535000004,6.9877888070000003,7.0084217654999996,7.0132623025000003,7.0759171260000002,7.1206513405000003,7.3890410869999998],"9961472":[5.1757959324999998,5.183681644,5.1859694264999998,5.1879520074999999,5.1902562484999999,5.1926107605,5.1931520659999997,5.2034745684999999,5.2080984680000002,5.2098598310000002,5.2130290500000003,5.2204514895000003,5.2232250980000003,5.2248356060000001,5.2298783120000003,5.2339691154999999,5.2374582224999999,5.2442034675000002,5.2526929715000001,5.3240773309999998],"5888":[0.000800741,0.0008089000000000002,0.00083057300000000003,0.0008375520000000003,0.00084378400000000042,0.00084704809090909122,0.00084846172727272707,0.00085051245454545172,0.00085273236363636357,0.00085395818181818197,0.00085728963636363638,0.00085759872727272717,0.00085813999999999997,0.00086842863636363656,0.00087044499999999986,0.00087345149999999943,0.00088109318181818182,0.0008834662727272728,0.0008864655000000003,0.00089076899999999981],"11010048":[5.7528773429999998,5.7662504090000004,5.7668822305000003,5.7748644235000004,5.7765426279999996,5.7834971524999998,5.7843273494999998,5.7844692525000001,5.7850369490000002,5.792732386,5.7953583105000002,5.8005083339999999,5.8161986880000001,5.8227604345000001,5.8326112365,5.8354531314999996,5.8365513150000004,5.8387463315000003,5.8496036870000001,5.9671786019999997],"1920":[0.00025798900000000013,0.00025806000000000001,0.0002630629999999999,0.00026338099999999987,0.000264343,0.00026696799999999986,0.00026851799999999998,0.00027025411764705892,0.00027106799999999985,0.00027135700000000001,0.00027225980000000001,0.00027631525714285715,0.00027980297142857137,0.000282976,0.00028428399999999999,0.00028584312121212121,0.00028656314705882349,0.00029585984375000003,0.00030023689655172419,0.000313553],"2490368":[1.1142753445,1.1192970120000001,1.1247320249999999,1.125571176,1.128314641,1.1285693370000001,1.1349075639999999,1.1371144234999999,1.137258077,1.1379029469999999,1.142536886,1.1440671609999999,1.1455049005,1.1460355154999999,1.1470724919999999,1.151522838,1.1542713,1.1572274144999999,1.1574771225,1.1603685399999999],"19456":[0.002724977,0.0027490739999999998,0.002754963,0.0028046340000000012,0.002806584,0.0028144483333333338,0.0028169553333333335,0.0028260676666666661,0.0028412213333333333,0.0028424209999999999,0.0028485799999999999,0.002864766333333334,0.0028685769999999998,0.0028902033333333336,0.0029010976666666677,0.0029061790000000009,0.0029277779999999998,0.0029454306666666674,0.0029462920000000005,0.0029530450000000005],"57344":[0.0097098500000000008,0.0097693680000000005,0.009795995,0.0098240339999999954,0.0098334400000000006,0.0099073714999999996,0.0099108984999999959,0.0099234055000000047,0.010003576,0.010007265,0.010020446500000006,0.010049803,0.010080299499999997,0.010081801999999999,0.0100911405,0.010178584500000001,0.010292999000000001,0.010403003000000004,0.010481197500000001,0.011137945],"1179648":[0.43684765800000003,0.44966548899999997,0.44991880500000003,0.45425579249999998,0.45883404300000002,0.45911407500000001,0.459706738,0.46057030500000001,0.46171078900000001,0.46212848950000002,0.46224373899999999,0.46258279549999998,0.46452073299999996,0.46511746100000001,0.47713664700000002,0.49011598750000002,0.49050157599999999,0.49197180200000001,0.49674895650000001,0.50165269400000001],"4718592":[2.2783074340000002,2.2927112224999999,2.2997484290000001,2.3011636979999999,2.3021640584999998,2.3049131345,2.3050694030000001,2.3061574739999999,2.3083545860000001,2.3156373119999998,2.3205701594999999,2.3217421594999998,2.3246971580000002,2.3262332815,2.3265704820000002,2.3276125570000001,2.3301761084999999,2.335582686,2.3462125205,2.3732925279999999],"360448":[0.090325611500000028,0.092880614,0.093004135000000002,0.094522758499999998,0.094717275500000003,0.094771280000000041,0.095393763000000006,0.095450541,0.096010846999999983,0.096757309499999999,0.096865465000000039,0.097065627999999973,0.097118650500000042,0.097457861000000007,0.098451622499999975,0.099083866500000006,0.099425946999999973,0.10030354900000001,0.101590789,0.103321121],"1572864":[0.63466487799999993,0.637773963,0.64428814999999995,0.64679937899999995,0.64861627350000006,0.65404483300000005,0.65651957650000003,0.65797909199999993,0.65818606699999993,0.65853354549999998,0.65930148899999996,0.65987934699999995,0.66032742300000002,0.66238342000000006,0.66685019450000005,0.667007142,0.67244805299999999,0.68508315250000007,0.69143191549999994,0.69227991200000005],"53248":[0.0088019840000000005,0.0089041309999999992,0.0089074480000000001,0.0089290309999999987,0.0089452380000000029,0.0089812290000000003,0.0089837360000000026,0.0089891099999999998,0.0089922880000000063,0.0090064810000000002,0.009027607,0.0091001079999999974,0.0091309800000000003,0.0091801309999999994,0.0091825729999999994,0.0091963040000000024,0.0092022990000000006,0.0092520139999999994,0.009415251000000003,0.0096321729999999973],"3456":[0.00047063000000000009,0.0004910670000000002,0.00049114199999999997,0.00049134931578947386,0.00049401799999999993,0.00049715255000000002,0.00049831177777777771,0.00049876400000000006,0.00049995010526315798,0.0005000880000000002,0.00050028599999999996,0.000500908,0.00050448500000000005,0.00051010547368421052,0.00051056599999999984,0.00051150484210526288,0.00051557600000000001,0.00051579638888888876,0.00052590563157894747,0.00052811772222222217],"40960":[0.0062417810000000001,0.0063155829999999996,0.0063212209999999993,0.0064757869999999985,0.0065686550000000014,0.006577065,0.006577711,0.0066013080000000002,0.0066232540000000003,0.0066279379999999999,0.0066457180000000001,0.0066832880000000008,0.006687653,0.0066887450000000003,0.0066952009999999996,0.006700498,0.0068570019999999966,0.006861976000000004,0.0068661620000000003,0.0070102339999999997],"4608":[0.00062446400000000003,0.00064429699999999973,0.00064781000000000018,0.00065452800000000003,0.00065991400000000038,0.00066289035714285714,0.00066389635714285715,0.00066695207142857145,0.00067001442857142859,0.00067206723076923081,0.00067279814285714306,0.00067569307142857139,0.00067703921428571433,0.000679384,0.00068432699999999987,0.00068486100000000004,0.00068570799999999972,0.00068868257142857159,0.00069895600000000003,0.00071448684615384628],"13824":[0.0019302409999999999,0.001941096,0.0019711660000000008,0.0019870220000000002,0.0019957005000000002,0.0019969699999999998,0.0020025620000000003,0.0020026839999999998,0.0020046,0.0020090849999999999,0.0020209029999999992,0.0020271859999999998,0.0020291299999999996,0.0020416585000000002,0.0020567420000000012,0.0020607970000000001,0.0020642684999999999,0.0020651282500000001,0.00209789375,0.0021324135000000011],"819200":[0.27443306299999998,0.27491852900000002,0.27531791750000001,0.27708013599999998,0.28054686299999998,0.28513585000000002,0.28624028000000001,0.28628500199999996,0.29007803099999996,0.29187273050000001,0.29283703699999997,0.29300196449999999,0.295355437,0.29586799200000002,0.29910190599999997,0.29992896800000002,0.3017277035,0.30270891750000001,0.30312617149999999,0.309695369],"983040":[0.34963446549999999,0.34993772000000001,0.35306478450000001,0.35955031049999997,0.36243893799999999,0.36267387000000001,0.363733376,0.36608810400000003,0.36872078800000002,0.36897483249999996,0.3703080265,0.37237018599999999,0.37375223599999996,0.375773262,0.37587177599999999,0.37653809199999999,0.379092822,0.38296988200000004,0.39954352100000001,0.40429367900000002],"8704":[0.0012144999999999999,0.0012325420000000001,0.0012336950000000004,0.001249018,0.0012567659999999999,0.001259488,0.0012636655000000001,0.001263943,0.0012704578571428571,0.001271186714285714,0.0012823049999999996,0.001288967,0.0012899230000000001,0.001292257,0.0013062087142857142,0.0013069310000000001,0.0013073744285714288,0.001309728,0.0013344495714285715,0.0013526322857142854],"120":[1.398937e-05,1.49745e-05,1.536254e-05,1.5385320000000001e-05,1.54504e-05,1.551815e-05,1.5526e-05,1.554876e-05,1.5701928571428572e-05,1.6046125e-05,1.6221659999999998e-05,1.6254209999999998e-05,1.6399e-05,1.6408670000000002e-05,1.6469290000000001e-05,1.6615569999999999e-05,1.6657999999999999e-05,1.7349479999999999e-05,1.8299530000000002e-05,1.8550319999999999e-05],"1024":[0.00012114933333333332,0.00012492200000000005,0.000125251,0.00012725766666666667,0.00012726950000000001,0.000127279,0.00012993366666666666,0.00013027500000000001,0.000131135,0.00013182034722222222,0.00013186600000000001,0.00013290700000000006,0.00013386999999999999,0.0001353088,0.0001360639178082192,0.00013670744117647054,0.00013815627142857144,0.00013902940845070423,0.00014131700000000004,0.00014732450000000001],"49152":[0.0079961879999999996,0.0080116800000000002,0.0080443299999999988,0.0080873090000000009,0.0081096570000000028,0.008143418999999999,0.0081885999999999973,0.0082261380000000026,0.0082318549999999997,0.0082629180000000028,0.0082760999999999998,0.0082769280000000028,0.0082945139999999994,0.0083410989999999994,0.0083531980000000026,0.0083867660000000004,0.0084533029999999971,0.0084674069999999997,0.0086126470000000045,0.0088478010000000006],"524288":[0.14154333650000001,0.14229726200000001,0.142746277,0.14463947999999999,0.14794509,0.148241439,0.14859823699999999,0.14914318900000001,0.14922972500000001,0.14938192699999997,0.149992501,0.15114427650000001,0.151237918,0.15658361949999999,0.15687374900000001,0.1569179745,0.15710457450000001,0.161585427,0.161767983,0.166812407],"45056":[0.0072365190000000038,0.0072505950000000003,0.0073035699999999997,0.0073186409999999981,0.0073781580000000044,0.0073807959999999994,0.007401113,0.0074100200000000007,0.0074155879999999981,0.0074262660000000008,0.0074361000000000036,0.0074520990000000011,0.007468695,0.007478931999999998,0.007495257,0.0074974309999999962,0.007520222,0.0075492990000000006,0.0076507010000000002,0.0077424689999999992],"229376":[0.050634788,0.051057551499999999,0.051226985999999988,0.051923674499999996,0.052517972499999996,0.052525864500000005,0.052743032000000002,0.052957078999999997,0.053625885500000026,0.053670084,0.053712467,0.054342737000000016,0.054408047000000029,0.055428505499999989,0.0556437215,0.05566599349999999,0.055721294000000011,0.055866992000000004,0.056493550000000003,0.056534033999999997],"2688":[0.00036032450000000004,0.00037616599999999999,0.00037673199999999996,0.0003779535,0.00037886199999999994,0.00038199799999999998,0.00038261171999999998,0.00038333932000000003,0.00038510900000000002,0.00038581016000000001,0.00038693004000000001,0.00038739899999999997,0.00039017199999999988,0.00039037395833333338,0.00039481099999999996,0.0003958330399999999,0.00039860421739130439,0.00040142650000000004,0.00040540108695652169,0.00042611299999999999],"152":[1.8508e-05,1.9262e-05,1.9488e-05,1.9731666666666666e-05,2.0084019230769232e-05,2.0123999999999999e-05,2.0271537313432835e-05,2.0282740000000001e-05,2.0328913043478262e-05,2.0345200000000003e-05,2.050372e-05,2.0750310000000001e-05,2.0886999999999998e-05,2.0893499999999999e-05,2.1020330000000001e-05,2.1216049999999998e-05,2.1367629999999997e-05,2.1582879999999998e-05,2.1801749999999998e-05,2.231525e-05],"5120":[0.00069420500000000004,0.00070136899999999986,0.00071338499999999997,0.00071651800000000019,0.00072278899999999994,0.00072293399999999984,0.00072358199999999996,0.00072539130769230776,0.00073005738461538478,0.00073354900000000001,0.00074410600000000024,0.00074930199999999987,0.00074966315384615372,0.00075133199999999995,0.00075184308333333305,0.00075418684615384654,0.00075505933333333325,0.00075566499999999998,0.00075907100000000027,0.00077094050000000008],"1507328":[0.60615821599999997,0.61107457799999998,0.61143981250000001,0.61257350399999999,0.61553151449999999,0.62159037849999998,0.62422733099999994,0.62489015449999996,0.62904325900000002,0.62981279499999998,0.63461652600000007,0.635283916,0.63963226799999995,0.64734015999999994,0.651851548,0.65472685399999997,0.65627465800000007,0.66117674250000003,0.66745609750000001,0.67610208900000002],"1216":[0.00016507500000000001,0.00016544900000000005,0.00016753199999999999,0.00016854700000000001,0.00016925575,0.00017073900000000007,0.00017103299999999996,0.00017321700000000003,0.00017525200000000001,0.000175525,0.00017597070909090913,0.0001785150000000001,0.00017882974999999999,0.0001789279245283019,0.00018192192592592592,0.00018256523076923091,0.00018353890740740742,0.00018599572549019607,0.00018852000000000002,0.00019130623076923068],"1966080":[0.83496642399999998,0.83859780649999993,0.84098410199999996,0.84234075799999997,0.84513367149999996,0.84829640500000003,0.855556345,0.85917515199999994,0.86440862200000002,0.87060584050000001,0.87858079449999993,0.87945316200000001,0.88071298850000002,0.88293932450000001,0.88780161450000006,0.88805273900000004,0.88967028999999997,0.89333780100000004,0.89678866049999995,0.89679431399999998],"1900544":[0.80493682749999995,0.80496171849999998,0.81028821900000003,0.81040706650000005,0.81074916299999999,0.81109006449999999,0.81344999299999998,0.81933760599999994,0.82854088149999994,0.82948835500000007,0.83143178100000004,0.83232726099999998,0.83360301749999999,0.83417914400000004,0.83799755300000001,0.84089744850000003,0.84093427850000002,0.85207854999999999,0.856247274,0.85658907949999996],"184":[2.4033333333333336e-05,2.464076e-05,2.4672949999999999e-05,2.4870740000000002e-05,2.4871493975903614e-05,2.5186269999999998e-05,2.5301833333333332e-05,2.5336045977011494e-05,2.5464220000000001e-05,2.55386e-05,2.5704790000000001e-05,2.5900027777777778e-05,2.6089199999999997e-05,2.6175220000000001e-05,2.6189857142857142e-05,2.6271749999999998e-05,2.6357876923076921e-05,2.6492299999999997e-05,2.6650499999999998e-05,2.7761109999999998e-05],"7936":[0.0011101189999999999,0.001125486,0.0011257889999999999,0.0011280559999999999,0.001138502,0.001139346625,0.001141272,0.001156123,0.0011654985,0.0011675737500000001,0.0011719009999999999,0.001173006125,0.0011753684999999999,0.001175784375,0.00117708225,0.0011804691250000005,0.0011905310000000005,0.0012041948571428569,0.001222311,0.0012666312857142858],"3801088":[1.805269088,1.808230875,1.8120882629999999,1.8193617115,1.8223559465000001,1.823363515,1.8274189654999999,1.8278150280000001,1.8283158264999999,1.8305774905000001,1.8337524169999999,1.833953164,1.8356759490000001,1.837042928,1.837464325,1.840208155,1.8467154299999999,1.8827360535,1.8901211120000001,1.8933442110000001],"6815744":[3.43229088,3.4343368540000001,3.4403025825000002,3.4464772144999998,3.447367903,3.4480788869999999,3.4486598979999998,3.4534100835000001,3.4565181315000002,3.4595928740000002,3.4607236430000001,3.4634974920000001,3.4647044600000001,3.4671329059999998,3.4719733525000001,3.4721554559999999,3.4785718459999999,3.4837737889999998,3.4959104664999998,3.5586973915],"124":[1.4177829999999999e-05,1.5787380000000003e-05,1.5917540000000001e-05,1.6064390000000001e-05,1.61625e-05,1.6351999999999999e-05,1.6408279999999999e-05,1.6453939999999998e-05,1.6622239999999998e-05,1.6632319999999998e-05,1.6933049999999999e-05,1.7053559999999999e-05,1.707681e-05,1.7298140000000002e-05,1.731322e-05,1.73398e-05,1.7516750000000001e-05,1.7891166666666669e-05,1.9850820000000001e-05,2.0165790000000002e-05],"102400":[0.019810189499999999,0.019923246999999998,0.019983103999999998,0.020115983,0.0201887995,0.020189691999999999,0.020211280999999998,0.0203266855,0.020338115,0.0204420495,0.0205095135,0.020510463999999999,0.020565198999999999,0.0205686645,0.020651573999999999,0.020848835499999999,0.020925465000000001,0.021048717000000002,0.021080106000000001,0.021350497],"311296":[0.075213240000000015,0.075867791500000004,0.076005832000000023,0.076316584500000006,0.077319018000000003,0.077785689000000005,0.078089796000000031,0.078322380999999996,0.078586942999999992,0.078817345999999969,0.079107928500000008,0.079616899000000033,0.079703975999999968,0.079923801500000002,0.080342432000000005,0.080772159000000024,0.081179882000000023,0.081840070000000001,0.082097975000000004,0.087278927500000006],"1408":[0.00019439850000000001,0.00019551799999999999,0.0001959180625,0.00019675900000000007,0.000197061,0.00019725725,0.000198097,0.000199178,0.00020007973469387757,0.00020111865217391304,0.00020244799999999998,0.000202771,0.00020437609302325588,0.00020440352173913039,0.0002045494,0.000204885,0.00020859166666666664,0.000209006,0.00021095553191489367,0.00021588784782608701],"393216":[0.101710143,0.10210249,0.10259117449999999,0.104170474,0.104331884,0.105230082,0.10572532900000001,0.106318446,0.106670185,0.10695742799999997,0.10725807800000001,0.107590716,0.10768016499999999,0.111973262,0.1120638155,0.112693114,0.11286767,0.113077161,0.113560696,0.12681505100000001],"4352":[0.00060803949999999973,0.000611992,0.0006152340000000002,0.00061752766666666663,0.00062033699999999978,0.00062157,0.00062233500000000034,0.00062498099999999982,0.00062553399999999996,0.00062706446666666656,0.00063174306666666669,0.00063267885714285725,0.00063316259999999982,0.00063465486666666683,0.00064218866666666677,0.00064380299999999998,0.00064517800000000027,0.00064861699999999999,0.00065690460000000003,0.00068753499999999997],"6553600":[3.2889294270000002,3.2899863160000002,3.2945132835000002,3.2988679369999998,3.3022315980000001,3.3045809190000002,3.3077700029999999,3.3116355395000001,3.3142157590000001,3.3160675030000002,3.319616269,3.3234489119999999,3.3241176430000001,3.3260202639999998,3.3385062685000002,3.3404789369999999,3.3464361650000001,3.3480254299999999,3.353496791,3.3906294030000002],"20480":[0.0028739499999999984,0.0029046190000000011,0.0029509059999999988,0.0029739010000000001,0.0029755849999999989,0.0029834233333333338,0.0029896546666666668,0.0029955649999999999,0.0029985240000000015,0.0030034529999999992,0.0030241386666666663,0.0030338040000000002,0.0030375980000000007,0.0030907259999999998,0.0030964833333333329,0.0030974166666666672,0.0031275480000000008,0.0031281746666666672,0.0031838093333333333,0.003940959],"608":[8.0442e-05,8.0513000000000007e-05,8.1650000000000006e-05,8.2632352941176465e-05,8.2807999999999997e-05,8.4376210526315788e-05,8.4592395833333334e-05,8.501386e-05,8.5244769230769237e-05,8.5929755319148938e-05,8.593018181818182e-05,8.7394680000000004e-05,8.7835000000000002e-05,8.7844110000000002e-05,8.8151111111111106e-05,8.9224666666666666e-05,8.9616229166666658e-05,8.9936250000000005e-05,9.0412589999999988e-05,9.3583423913043491e-05],"2228224":[0.96764049600000002,0.97724286699999996,0.98337782399999996,0.99094527750000005,0.99100484700000002,0.99482359750000005,0.99596277899999996,0.99653146400000003,0.99978101100000005,1.003366341,1.003750664,1.0041993380000001,1.0058606349999999,1.0063211540000001,1.0086407315000001,1.0119082395000001,1.0247758419999999,1.026110659,1.030078552,1.0321645269999999],"36864":[0.005581384,0.0055837600000000001,0.0056660480000000017,0.0058092630000000003,0.0058510990000000002,0.0058543199999999997,0.0058686819999999983,0.0059071260000000004,0.0059092670000000002,0.0059171050000000024,0.0059478230000000005,0.005947909000000003,0.0059764699999999968,0.0059969610000000003,0.0060508159999999988,0.0061070650000000001,0.0061231080000000004,0.0061248249999999987,0.0061680140000000012,0.006211121],"704":[9.1270500000000006e-05,9.3422000000000001e-05,9.5179999999999993e-05,9.6683999999999998e-05,9.8167999999999999e-05,9.9454e-05,9.9508999999999999e-05,9.9994101010101005e-05,0.000100052,0.00010055596938775505,0.00010098061538461548,0.00010110229411764709,0.000102123,0.00010214582417582426,0.00010222373333333336,0.00010252240625000001,0.00010276982417582419,0.000103025,0.00010314949999999999,0.00010330031868131868],"720896":[0.23115354499999999,0.23389173399999996,0.23608596749999999,0.2383994395,0.23882069,0.24191812300000001,0.24309394950000002,0.243608464,0.24722122099999999,0.24789022999999999,0.249767088,0.25149903800000001,0.252441735,0.25296878699999997,0.25394606399999997,0.25723267250000004,0.26105200699999997,0.261348845,0.26184276699999998,0.26305620349999997],"800":[0.000104613,0.00010785174999999995,0.000108028,0.000109959,0.000110164,0.000110337,0.000111921,0.00011212078205128204,0.00011401200000000001,0.000114132,0.00011492948192771083,0.00011539364285714286,0.00011559483333333333,0.00011598104938271608,0.00011608521333333332,0.00011618459523809529,0.0001167336923076923,0.00011926349999999997,0.000122021,0.00012347162820512821],"2621440":[1.1758209989999999,1.178611005,1.1807783330000001,1.1865801540000001,1.18841168,1.189721703,1.1909924395,1.1939372109999999,1.195172087,1.19801884,1.2079960494999999,1.2091394795000001,1.2115700235,1.2126299935,1.215615511,1.2203154199999999,1.220619868,1.2240466944999999,1.2267695034999999,1.2337688815000001],"425984":[0.111345111,0.111745122,0.112042013,0.11284161099999999,0.115639931,0.116907847,0.118711739,0.11879085700000003,0.118838576,0.11908883949999999,0.12040798599999999,0.12047559400000001,0.121294649,0.121338853,0.122027331,0.124411022,0.12576477200000002,0.125943429,0.12770558949999999,0.12889078800000001],"32768":[0.0045686455000000211,0.0046113150000000004,0.0046133629999999997,0.00463343,0.0046539400000000014,0.0047017120000000011,0.0047114844999999999,0.0047426099999999987,0.0047921034999999996,0.0047995190000000004,0.0048224440000000004,0.0048413524999999999,0.004849875,0.0048556199999999997,0.0048711959999999986,0.0049105989999999999,0.0049115419999999988,0.004925479,0.0050063069999999998,0.005022856],"12058624":[6.3487829895000001,6.3575168634999999,6.3612167314999999,6.3672741485,6.3696759224999999,6.370073831,6.3709171009999999,6.3724122599999999,6.3744306789999996,6.3781141344999996,6.3788787165,6.3804645205000003,6.3830504154999996,6.3933780420000001,6.3984277374999996,6.4016533799999999,6.4177479515,6.4246799645000001,6.5582443535000001,6.6036088734999998],"128":[1.315461e-05,1.4323e-05,1.47015e-05,1.471665625e-05,1.487538e-05,1.5064500000000001e-05,1.5107619999999999e-05,1.5164250000000001e-05,1.518578e-05,1.52208e-05,1.5325110000000001e-05,1.5358780000000001e-05,1.537905e-05,1.5415929999999998e-05,1.5509333333333334e-05,1.5559689999999999e-05,1.5642129999999999e-05,1.57935e-05,1.60746e-05,1.6277399999999998e-05],"180224":[0.037896441000000003,0.0381508765,0.038531789500000004,0.038604731999999996,0.038920173999999988,0.03919565799999998,0.039762977499999998,0.040360528999999992,0.040490626000000009,0.040509865999999999,0.040766527499999997,0.04087602999999998,0.041068985999999988,0.041180508999999997,0.041354843500000002,0.041464756500000012,0.04153239999999999,0.0416936205,0.042124501499999988,0.042624250999999988],"224":[2.9527999999999999e-05,2.9989999999999999e-05,3.076818e-05,3.1287659999999999e-05,3.1429639999999997e-05,3.1489819999999999e-05,3.1562369999999999e-05,3.1865562500000003e-05,3.206889e-05,3.2073299999999997e-05,3.2127929999999996e-05,3.213234e-05,3.2146e-05,3.2430720000000002e-05,3.2467369999999998e-05,3.2541359999999997e-05,3.2706000000000002e-05,3.3193666666666667e-05,3.5211925000000003e-05,3.5291099999999998e-05],"736":[9.8525999999999998e-05,0.00010119026041666662,0.000101569,0.00010165099999999998,0.000102082,0.000102435,0.000103194,0.00010324333333333331,0.00010477079347826087,0.000105068,0.00010570347872340422,0.00010572975,0.000105739,0.00010576212643678157,0.000106897,0.0001070885,0.00010840642857142858,0.00010848488888888887,0.00010992666666666667,0.00011452109090909093],"320":[4.1726e-05,4.2771889999999995e-05,4.3832000000000003e-05,4.3918359999999993e-05,4.398436363636364e-05,4.430882e-05,4.4433610000000002e-05,4.457957e-05,4.4813949999999998e-05,4.4839000000000002e-05,4.5313410000000006e-05,4.5411329999999999e-05,4.5651100000000001e-05,4.5817910000000001e-05,4.5825083333333333e-05,4.5972089999999999e-05,4.6379090909090908e-05,4.7446125000000001e-05,4.9828430000000001e-05,5.0168528735632186e-05],"557056":[0.159985297,0.161046561,0.16153287899999999,0.16363171199999998,0.167955771,0.170102539,0.170156049,0.17081526750000001,0.17119638400000001,0.17208904650000001,0.17349254050000001,0.17387981999999999,0.17648301699999999,0.17744462,0.1782588115,0.17863362599999999,0.18189169300000002,0.18671718949999999,0.1888511215,0.19068220250000001],"832":[0.000112192,0.000112426,0.00011346799999999999,0.000115767,0.000115852,0.00011627938823529412,0.00011706766666666666,0.000117193,0.0001174206153846154,0.000117975125,0.00011809431578947368,0.00011817784999999995,0.0001193325,0.00011952716666666667,0.00012008899999999998,0.0001210267368421052,0.0001211814,0.00012206633333333334,0.00012848299999999996,0.00013121283333333335],"9437184":[4.8684133725000001,4.8694104600000001,4.8770560180000002,4.8775453540000004,4.8800489220000003,4.8856682879999997,4.8885351484999999,4.8896606079999998,4.8910147290000001,4.891714501,4.8981846149999999,4.903858155,4.9039637049999998,4.9070643010000001,4.9076146630000004,4.9081008485000002,4.9135782969999999,4.9259811899999999,4.9296334760000002,4.9704331039999996],"3584":[0.00048225600000000003,0.0005014739999999998,0.00050506599999999998,0.00050974466666666644,0.00051889377777777782,0.00052022199999999998,0.00052191611111111107,0.00052579166666666681,0.00052698422222222216,0.00052883500000000029,0.0005292511111111112,0.00053015244444444467,0.000533293,0.00053882599999999985,0.00053924138888888874,0.0005404573333333331,0.0005410611666666667,0.00054728250000000002,0.00054814922222222212,0.00058311194117647051],"6291456":[3.127900892,3.1417066920000001,3.1579741934999999,3.1598695650000002,3.1601257440000001,3.1612253945000002,3.161843958,3.1625130845,3.164414303,3.1686656604999999,3.1716266324999998,3.1730910015,3.17314549,3.173237656,3.1807998225,3.1873677809999998,3.1912385689999998,3.1942533100000001,3.2304590645000002,3.2885582329999998],"256":[3.0152249999999999e-05,3.0256999999999998e-05,3.11355e-05,3.1491000000000001e-05,3.1500999999999995e-05,3.1514250000000001e-05,3.1612000000000002e-05,3.179196e-05,3.19171e-05,3.2027999999999999e-05,3.2236059999999998e-05,3.259826e-05,3.2821380000000003e-05,3.2928079999999999e-05,3.3219800000000003e-05,3.3253430000000005e-05,3.3528989999999996e-05,3.4876519999999999e-05,3.538857e-05,3.6241139999999997e-05],"15204352":[8.0971208899999993,8.1111901935000006,8.1287988594999998,8.1359059365000004,8.1517980160000008,8.1561641675000001,8.1588839390000008,8.1592631430000004,8.1651786830000006,8.1698047455000005,8.1717367900000006,8.172999313,8.1741975290000006,8.1758444775000001,8.1869149649999997,8.1919546180000005,8.1980662449999997,8.2011113620000007,8.2124579529999995,8.2460767765000007],"28672":[0.0042425249999999987,0.0042606849999999984,0.004290159,0.0042970524999999997,0.0043399490000000001,0.004376853499999998,0.0043781720000000014,0.0043868729999999977,0.0044140479999999985,0.0044348670000000003,0.0044831129999999986,0.0044880980000000003,0.0044905330000000005,0.0045219509999999997,0.0045271334999999998,0.0045410965000000046,0.0045562659999999981,0.0045860639999999999,0.0045994849999999986,0.0046353929999999998],"768":[0.000102369,0.00010237466666666666,0.000105027,0.000105228,0.000107159,0.000107316,0.000108068,0.00010814349999999999,0.000108655,0.0001090426666666667,0.00010917116666666668,0.000109193,0.00010969242222222224,0.00011119400000000001,0.00011164499999999999,0.0001134266375,0.00011473437647058823,0.00011582332530120484,0.000117732,0.00012553399999999998],"212992":[0.046121579500000009,0.046270226500000004,0.046777835999999996,0.046890664499999998,0.04723205200000001,0.048364986999999998,0.048389152500000004,0.048655224499999997,0.0491876885,0.050261619,0.050451272000000005,0.050528795000000001,0.050650802500000022,0.051298956,0.051593074500000002,0.051736150500000001,0.05193979,0.052321281500000018,0.052617710999999998,0.052959438000000011],"864":[0.000115122,0.000119702,0.00011983499999999999,0.000120277,0.000120455,0.00012057149315068492,0.00012122499999999995,0.00012239999999999999,0.00012261600000000001,0.00012263899999999996,0.00012284000000000001,0.000123094,0.00012372818987341767,0.00012443502857142859,0.00012470800000000001,0.000125019,0.00012645309459459459,0.00013004099999999996,0.00013054899999999999,0.00013285399999999999],"352":[4.6748e-05,4.7763659999999995e-05,4.8275519999999997e-05,4.8327500000000001e-05,4.8695795918367347e-05,4.8776000000000002e-05,4.9290730000000001e-05,4.9387140000000003e-05,4.9701409999999999e-05,4.9713279999999996e-05,5.0216999999999997e-05,5.0474889999999999e-05,5.0497410000000003e-05,5.1271629999999994e-05,5.1389417582417584e-05,5.1398109999999999e-05,5.183954e-05,5.4883999999999998e-05,5.5140653333333327e-05,5.6175080000000002e-05],"253952":[0.05855719999999999,0.058763297499999999,0.058908547999999984,0.059482938500000027,0.059538559999999997,0.059888390499999999,0.060084667000000001,0.0602111065,0.060702601000000002,0.060751433000000001,0.061211965,0.06148819299999999,0.061835363500000004,0.06193654799999998,0.062424513500000001,0.062552442999999985,0.062586006,0.062819356500000006,0.063635890000000001,0.064633705499999985],"960":[0.000133595,0.00013374433333333333,0.00013377500000000004,0.00013434000000000007,0.000135072,0.00013612233333333329,0.00013631299999999999,0.00013642,0.00013669000000000005,0.00013838055555555551,0.000140302,0.00014043933333333334,0.00014056950000000001,0.00014067513432835821,0.00014078637681159416,0.0001425055,0.00014304648437500001,0.000143924,0.00014441547692307694,0.0001452384423076923],"24576":[0.003486365,0.0035687814999999998,0.0035698934999999982,0.0035968280000000519,0.003596943,0.0035981114999999999,0.0036043334999999997,0.0036347520000000002,0.0036366624999999999,0.0036483229999999993,0.0036551889999999997,0.0037026584999999986,0.0037257919999999999,0.0037431580000000021,0.0037459259999999975,0.0037501595,0.0037693969999999999,0.0037776139999999999,0.0038009190000000011,0.004081225],"7680":[0.001073269,0.0010783919999999994,0.001088087,0.001093498,0.0010948069999999999,0.001103784,0.001106079,0.00110660525,0.0011089062500000001,0.001112126,0.001121419,0.0011224659999999995,0.0011322106250000001,0.0011383373749999999,0.0011385648749999999,0.0011413411250000001,0.0011464330000000001,0.001156815125,0.0011609750000000001,0.0011731770000000001],"294912":[0.068778330999999998,0.069376139500000017,0.070651512,0.071827535499999998,0.072058515000000004,0.072877313999999999,0.072910506,0.072964063999999995,0.073308698000000005,0.073512494500000025,0.07400653900000001,0.074297857999999994,0.074656170000000036,0.07489840349999996,0.074918039000000033,0.075011966499999999,0.076175592,0.076358905000000005,0.076372761999999997,0.079780615999999971],"1048576":[0.366470666,0.36748305100000001,0.37092225200000001,0.37136486700000004,0.378280475,0.37910747150000002,0.3829906515,0.38458450199999999,0.38570174000000002,0.38619705900000001,0.38648170549999999,0.38771701999999997,0.3896975755,0.39177007200000002,0.39429110099999998,0.39767284749999998,0.39819970900000001,0.40168178599999999,0.40577977199999998,0.42155340899999999],"10485760":[5.4870214989999999,5.4899867679999996,5.4915079010000003,5.492387055,5.4935431064999998,5.4975048534999997,5.5043528205000003,5.5073902019999998,5.5082130439999997,5.51159993,5.5134676464999997,5.5143221405,5.5203382384999999,5.5215372704999997,5.5220997685000004,5.5225238545000002,5.5401514120000002,5.5621327269999998,5.5678031040000002,5.5765880194999999],"344064":[0.086072774499999977,0.086096031999999989,0.087249073000000024,0.0888493915,0.089081489,0.08921984949999999,0.08931635800000004,0.089456628999999982,0.089462881999999994,0.089779265499999997,0.090152819500000023,0.090297939999999993,0.090629211499999973,0.090802291000000007,0.091111886999999961,0.092731361500000026,0.093210352999999996,0.094083745999999982,0.094958212,0.096358008499999995],"288":[3.9150489795918365e-05,3.9342279999999996e-05,3.9523649999999999e-05,3.9759725e-05,3.9960999999999999e-05,4.0228399999999996e-05,4.0314839999999998e-05,4.0461075000000003e-05,4.0463160000000006e-05,4.0513779999999997e-05,4.086351e-05,4.109182e-05,4.1167487804878048e-05,4.1659000000000002e-05,4.1728169999999996e-05,4.2271000000000002e-05,4.3191829999999997e-05,4.3432990000000002e-05,4.5684380000000005e-05,4.6775779999999999e-05],"1152":[0.0001541639999999999,0.00015590799999999999,0.00015932499999999996,0.00015987400000000001,0.00015999099999999995,0.00016018,0.0001602005,0.000160261,0.00016130099999999998,0.00016189199999999999,0.00016356035185185184,0.00016496099999999998,0.00016677799999999999,0.00016762939999999995,0.00016893949999999993,0.00017228299999999994,0.00017252015789473684,0.00017309999999999995,0.00017413178181818184,0.00017834525],"384":[5.0511499999999999e-05,5.0736999999999999e-05,5.1332000000000003e-05,5.1839000000000003e-05,5.3566739999999999e-05,5.3662000000000002e-05,5.3875999999999997e-05,5.4313549999999998e-05,5.484437974683545e-05,5.5010412499999995e-05,5.5117481481481483e-05,5.5442060000000006e-05,5.5742999999999998e-05,5.5851360000000003e-05,5.5892370000000005e-05,5.5910268656716419e-05,5.6245000000000001e-05,5.6356942028985505e-05,5.6960471428571422e-05,5.9314380000000001e-05],"2304":[0.00032012799999999987,0.00032231499999999999,0.00032394699999999999,0.0003247482857142857,0.00032512749999999993,0.00032539999999999999,0.00032894479999999991,0.00033101300000000001,0.00033229400000000001,0.00033291196551724138,0.00033351649999999991,0.00033365365517241377,0.00033423200000000001,0.000336664827586207,0.00033740779310344838,0.00033819393103448267,0.00034059450000000012,0.00034065800000000008,0.00034338499999999998,0.00034373146428571416],"896":[0.000121338,0.00012329000000000002,0.00012576525333333333,0.00012585799999999999,0.000126902,0.00012697175000000001,0.00012697951515151513,0.0001269838,0.00012705400000000001,0.000127226,0.00012751200000000001,0.00012826100000000001,0.00012876841891891895,0.0001287715,0.00012900302702702709,0.0001291633,0.00012960033333333333,0.00013025291780821921,0.00013120933333333329,0.000135451],"480":[6.1438499999999998e-05,6.3299999999999994e-05,6.3548999999999998e-05,6.517266666666666e-05,6.5205999999999999e-05,6.5259500000000001e-05,6.5333360000000004e-05,6.5794719999999997e-05,6.6439999999999994e-05,6.7627777777777779e-05,6.8139249999999996e-05,6.8359479999999994e-05,6.8466239999999995e-05,6.8660960000000009e-05,6.8751800000000008e-05,6.9154930232558147e-05,6.9892452380952388e-05,7.0165804878048776e-05,7.0199890000000005e-05,7.2507147058823536e-05],"1441792":[0.56730138699999999,0.57256545449999996,0.57390469550000001,0.57488681600000002,0.57730856699999999,0.58171203000000005,0.58317102999999992,0.58822005700000002,0.58908909249999997,0.58967603400000002,0.59187480999999997,0.594187786,0.59824036299999994,0.60025866299999997,0.61179357499999998,0.61187928150000004,0.6154058,0.61816412850000002,0.61978839900000005,0.63514347800000004],"992":[0.000133137,0.00013595933333333327,0.00013676299999999995,0.00013988974999999999,0.00013993300000000002,0.00014040033333333337,0.00014094999999999998,0.00014170449999999999,0.00014178604285714288,0.0001441070634920635,0.00014460299999999993,0.00014544706779661014,0.00014578890909090904,0.000147491,0.0001478807,0.00014808400000000001,0.00015005559322033894,0.00015254266666666667,0.00015340799999999998,0.00015540166666666669],"3968":[0.0005331769999999998,0.00053438899999999981,0.00053497099999999997,0.00054309199999999979,0.00054695799999999984,0.000550301,0.00055212200000000027,0.00055696900000000004,0.00056186300000000001,0.00056700999999999984,0.00056734299999999999,0.00057706999999999973,0.00058280075,0.00058729374999999984,0.00059569806250000016,0.00059576319999999987,0.00059594606666666674,0.0005989918125,0.00061525693749999962,0.00067313714285714287],"6400":[0.00090933259999999966,0.00091149000000000004,0.00091408899999999955,0.00091538399999999999,0.00091926200000000001,0.00092343760000000003,0.00092347090000000044,0.00092998000000000006,0.00093240490000000005,0.00094363600000000008,0.00094935600000000037,0.00095004680000000034,0.00095698089999999983,0.00095761000000000002,0.00095822399999999992,0.00096688999999999998,0.00096842299999999972,0.00097294299999999977,0.00097397200000000003,0.001074504],"1344":[0.0001818035,0.00018210000000000001,0.00018310099999999999,0.00018369099999999996,0.00018388555555555556,0.000184931,0.00018684099999999998,0.00018732700000000002,0.00018918220000000002,0.000190092,0.00019038951020408166,0.00019140546000000002,0.00019209300000000001,0.000194265,0.00019510886666666664,0.00019730400000000001,0.00020128099999999999,0.00020360047916666673,0.00020364451063829787,0.00020441900000000001],"126976":[0.025043663000000001,0.025225378999999999,0.02535014,0.025399764999999998,0.025464987500000001,0.025639323499999998,0.025758333499999998,0.025918432999999998,0.025977789500000008,0.025994415,0.026062558999999996,0.026075212,0.026272757000000001,0.026370605000000002,0.026425240000000006,0.0264491975,0.026511464500000026,0.026595971499999999,0.02737504,0.030180507999999995],"2883584":[1.3160549825000001,1.330611824,1.334720232,1.3349290739999999,1.3364532115000001,1.3383074050000001,1.33973265,1.3399660330000001,1.3450990405000001,1.3455074545000001,1.3509978725,1.3519762829999999,1.355385863,1.3619926680000001,1.3666067435,1.3687087474999999,1.3710661584999999,1.3757238144999999,1.380957065,1.381818497],"753664":[0.2444299855,0.24613784550000001,0.24724577599999997,0.25314951400000002,0.25568197500000001,0.25575871300000003,0.25662453800000001,0.25667003399999999,0.25733058399999997,0.25816960999999999,0.25902996750000001,0.26019718400000003,0.26136089699999998,0.26354326350000001,0.26482721749999999,0.26529394549999996,0.27013749100000001,0.27133024700000002,0.27137815599999998,0.28429120600000002],"16384":[0.0020730649999999998,0.002089492000000001,0.0020895900000000001,0.0020942689999999993,0.0021097870000000001,0.002125337000000001,0.0021342290000000005,0.0021364204999999989,0.0021526375,0.0021547709999999998,0.0021564379999999992,0.0021682009999999998,0.0021734520000000002,0.0021746807500000014,0.002200385,0.0022010427500000007,0.0022122794999999999,0.0022556464999999998,0.0022859327499999988,0.0023083190000000001],"131072":[0.023793181,0.023958894000000001,0.024152289,0.024332593499999992,0.024696510499999998,0.0248891745,0.024919003999999995,0.024924707000000008,0.024934902499999998,0.024951079500000001,0.025006197000000008,0.025315519000000002,0.0255421615,0.025635427499999992,0.025774225500000005,0.026026537000000006,0.026569375999999999,0.026909477999999994,0.027548972999999987,0.028005793999999973],"458752":[0.123559551,0.12602824500000001,0.12687641799999999,0.130806913,0.13151891599999999,0.13155700449999999,0.132022694,0.13209928500000001,0.13232628799999999,0.13298707450000002,0.13456077499999999,0.134590338,0.13559457999999999,0.13592632299999999,0.13595291600000001,0.13623418700000001,0.13686654600000001,0.13919640799999999,0.1413871625,0.14307025300000001],"172032":[0.035893952999999992,0.036474444000000009,0.036823977000000001,0.036879264500000002,0.037139382999999998,0.037556183,0.037661270999999996,0.037682676499999998,0.037952587000000003,0.038010451000000015,0.038046379499999998,0.038096871499999997,0.038132355999999999,0.038193808500000002,0.038347681000000002,0.038388360999999996,0.038842980999999999,0.039292170000000001,0.040004438999999996,0.043721269],"12288":[0.001725477,0.0017510264000000001,0.001758374,0.00176469,0.0017680999999999999,0.001776075,0.0017763060000000005,0.0017768806000000009,0.0017893671999999999,0.001793944,0.0017954620000000001,0.001795722,0.001797636,0.0018073694000000002,0.001810732,0.0018168324000000006,0.0018186863999999994,0.001823316,0.0018740434000000001,0.0019185078000000001],"14680064":[7.8123506249999997,7.8271778215000003,7.8462627920000001,7.8473525364999999,7.848951145,7.8581428205000003,7.858591573,7.8640347205000003,7.8666118584999998,7.8674967455000004,7.8694195809999998,7.8862667499999999,7.8866761050000003,7.8868973560000004,7.8876170730000004,7.8900356890000003,7.8943846249999998,7.8977830055,7.9080085345000004,7.9082186534999996],"1536":[0.00020096599999999999,0.000206605,0.00020687,0.00021001599999999999,0.000212227,0.00021338299999999999,0.00021358400000000001,0.00021397000000000001,0.000214203,0.00021500999999999999,0.00021555975,0.00021645410869565218,0.00021932136363636367,0.0002203909999999999,0.00022204733333333328,0.000222433275,0.00022333000000000002,0.00022835400000000014,0.00022962052380952385,0.00023006306976744187],"25600":[0.003720068,0.0037358959999999998,0.003738421,0.0037384790000000003,0.0037437830000000018,0.0037741534999999977,0.0037782570000000001,0.0038032699999999988,0.003843501,0.0038456040000000003,0.0038472745000000001,0.00385009,0.0038694140000000003,0.0038862430000000002,0.0039302219999999997,0.0039384154999999978,0.003943205,0.0040240034999999997,0.0040827149999999998,0.0041871325000000003],"1835008":[0.769706895,0.77178217199999999,0.77469224850000007,0.77903642699999998,0.78176146899999999,0.78646548699999996,0.78706286999999997,0.78898273799999996,0.79097697600000005,0.79318032699999996,0.79965366100000002,0.80144267250000001,0.804216139,0.8048279545,0.80512353849999996,0.80587793200000002,0.81358268,0.81729862399999997,0.81879764099999996,0.82484108299999992],"10752":[0.0015039890000000001,0.0015290780000000001,0.0015295089999999994,0.001533001,0.0015441315000000006,0.001546499,0.0015481086666666662,0.0015520109999999994,0.0015541229999999999,0.0015559720000000005,0.0015581883333333332,0.0015603193333333335,0.0015639059999999999,0.001569964666666666,0.0015896978333333333,0.001595183,0.001598758166666667,0.0016443760000000006,0.0016556392000000001,0.0017473547999999988],"21504":[0.0030719223333333335,0.0030732453333333332,0.0031012779999999998,0.0031237879999999997,0.003140594,0.0031429406666666666,0.0031460446666666661,0.0031521349999999991,0.0031529283333333337,0.0031594003333333337,0.003163346,0.0031842343333333321,0.003186875,0.003197709,0.0032223349999999998,0.00325582,0.0032996504999999996,0.0033306540000000002,0.0033999720000000002,0.0037960389999999998],"7602176":[3.8563509460000001,3.8585700484999998,3.8589086930000001,3.8731270860000002,3.8742819774999999,3.8764255759999999,3.8776211224999999,3.8805553420000001,3.882717821,3.8832660570000002,3.8845431060000002,3.8878581739999998,3.8880237394999999,3.8888407725,3.8919075670000001,3.8927206475,3.9027442844999998,3.9089508495,3.9464158380000001,3.9542241599999999],"5632":[0.00078183099999999987,0.00078416800000000002,0.00079122200000000006,0.00079198499999999993,0.00079211600000000004,0.00079288100000000016,0.00079409100000000002,0.00080034509090909107,0.00080140799999999998,0.00080144800000000007,0.00081023150000000019,0.000810237,0.00081354100000000009,0.00081717400000000005,0.00082411790909090908,0.00083708990909090906,0.00084478772727272745,0.0008544728181818183,0.00085632372727272705,0.00090896810000000005],"10":[1.1487000000000001e-06,1.1541699999999999e-06,1.2209699999999998e-06,1.22268e-06,1.22705e-06,1.2335300000000001e-06,1.2428899999999999e-06,1.2569799999999999e-06,1.2619899999999999e-06,1.2936600000000002e-06,1.3144700000000001e-06,1.3165799999999999e-06,1.32018e-06,1.3231600000000001e-06,1.3266600000000001e-06,1.33544e-06,1.3515000000000001e-06,1.3662999999999999e-06,1.4103100000000001e-06,1.4803700000000001e-06],"3145728":[1.4767531715,1.478301203,1.4799627184999999,1.4906307489999999,1.4906364415,1.4911955720000001,1.4916835795000001,1.4916912364999999,1.4961688795000001,1.4966686115000001,1.4982962769999999,1.4984979439999999,1.4985986554999999,1.506824707,1.509669215,1.5109048979999999,1.5153700030000001,1.527550057,1.5306647500000001,1.5414060505],"245760":[0.055213593500000033,0.056686358499999964,0.056923751000000002,0.057354463999999994,0.057363380000000019,0.057591052500000003,0.057608131999999965,0.057921678500000004,0.058114906000000001,0.058326626499999999,0.058532526500000001,0.058541794500000001,0.05862038150000002,0.058720707000000018,0.058969681500000003,0.0594555695,0.059983127000000004,0.06003905900000002,0.060785363500000002,0.061623439500000002],"1728":[0.00022672900000000009,0.00023345700000000001,0.00023884399999999999,0.000243539,0.00024384599999999998,0.00024668200000000002,0.00024786599999999985,0.00024795110000000009,0.00024989053846153849,0.00025085165789473691,0.00025131915384615382,0.000252613,0.0002537634999999999,0.00025679300000000001,0.000257223,0.00025868294594594596,0.00026212680000000001,0.00026257900000000009,0.00026915499999999998,0.00027529669444444451],"11":[1.2599e-06,1.2893299999999999e-06,1.30082e-06,1.32296e-06,1.3387300000000002e-06,1.36215e-06,1.3642799999999999e-06,1.4084199999999998e-06,1.41757e-06,1.42643e-06,1.42676e-06,1.4413399999999999e-06,1.44754e-06,1.4531900000000001e-06,1.45914e-06,1.4666000000000001e-06,1.5181299999999999e-06,1.5182999999999999e-06,1.5960700000000001e-06,1.61615e-06],"1114112":[0.40983000700000005,0.41667048900000003,0.41874477799999998,0.41946151500000001,0.42263126200000001,0.42823296900000002,0.42848805550000002,0.42924441699999999,0.429313793,0.42969412000000001,0.43069220000000003,0.43072212300000001,0.43449575000000001,0.43633187600000001,0.43702693799999998,0.44478090100000001,0.44723794649999998,0.45762866899999999,0.46404842150000003,0.48063770500000003],"12":[1.37e-06,1.37491e-06,1.3906699999999999e-06,1.4034099999999998e-06,1.4205199999999999e-06,1.4764300000000002e-06,1.49123e-06,1.5017700000000002e-06,1.5440300000000001e-06,1.5558200000000001e-06,1.56067e-06,1.5771900000000001e-06,1.5784199999999999e-06,1.5845e-06,1.5910000000000001e-06,1.5939000000000001e-06,1.6247599999999998e-06,1.6389300000000001e-06,1.6408199999999999e-06,1.7147899999999998e-06],"7340032":[3.7233941970000002,3.7318871900000001,3.7322443089999999,3.7339832445000001,3.7341293690000001,3.734383174,3.7357709730000002,3.7401250385,3.7406635989999999,3.7412670179999998,3.742549468,3.7461895740000002,3.7481557240000001,3.7520737290000001,3.7563232310000001,3.7629668015000002,3.7679394999999998,3.776250101,3.8005230459999999,3.8688156239999998],"7168":[0.00099580099999999993,0.0010104541111111112,0.001017946,0.001027168,0.001028365222222222,0.001035508125,0.0010394764444444443,0.0010412310000000003,0.0010458139999999995,0.001055315,0.0010558306666666665,0.0010563617777777775,0.00105956775,0.001068229,0.0010696670000000001,0.0010706784444444444,0.0010717972222222224,0.001077113,0.0010802164444444445,0.0011612560000000001],"13":[1.4535700000000002e-06,1.525e-06,1.5480999999999998e-06,1.5990000000000001e-06,1.62594e-06,1.63421e-06,1.64e-06,1.6435199999999999e-06,1.6627300000000002e-06,1.6649199999999998e-06,1.6749e-06,1.69627e-06,1.6967600000000002e-06,1.7077800000000001e-06,1.7118000000000001e-06,1.71703e-06,1.7176999999999999e-06,1.7774500000000002e-06,1.8832699999999998e-06,1.90813e-06],"6029312":[2.9910933609999999,2.9921588025000001,3.0016858389999999,3.0019123009999999,3.0089158385000001,3.009050937,3.0118432209999999,3.012137729,3.0269957810000001,3.0292924609999998,3.032999856,3.0331028215,3.0345750300000001,3.0378957149999999,3.041157879,3.0413263210000001,3.0533748620000001,3.0568350899999999,3.0981597660000002,3.1018324215000002],"14":[1.5919600000000001e-06,1.59385e-06,1.63246e-06,1.6605400000000001e-06,1.6914199999999999e-06,1.7454100000000001e-06,1.7575699999999999e-06,1.76038e-06,1.7792099999999999e-06,1.8031599999999999e-06,1.8049599999999998e-06,1.82142e-06,1.8295900000000002e-06,1.8311299999999999e-06,1.8372599999999999e-06,1.8390299999999999e-06,1.8444300000000001e-06,1.84534e-06,1.9013799999999998e-06,1.9639200000000001e-06],"3200":[0.00044539699999999999,0.00044633800000000001,0.000447797,0.00045150700000000003,0.00045535000000000004,0.00046538309523809496,0.00046544273684210534,0.00046664857142857146,0.00046736620000000021,0.0004674375999999999,0.00046775605000000012,0.00046851649999999988,0.00046933099999999981,0.00047098990476190466,0.00047182352631578914,0.000478233,0.00048022599999999983,0.00049302999999999999,0.00051570036842105247,0.00051823957894736833],"20":[2.3017899999999999e-06,2.3097800000000002e-06,2.3918199999999998e-06,2.4118299999999999e-06,2.4169600000000001e-06,2.4204499999999998e-06,2.4813700000000001e-06,2.51314e-06,2.5196200000000001e-06,2.5268000000000001e-06,2.5614900000000001e-06,2.5644600000000003e-06,2.6081200000000002e-06,2.6146299999999999e-06,2.6289100000000002e-06,2.6301200000000002e-06,2.6534900000000002e-06,2.7410999999999999e-06,2.7420199999999999e-06,2.8856e-06],"204800":[0.044270676499999995,0.044281807999999999,0.044434230499999998,0.04466385400000001,0.044984353999999997,0.045554812,0.0459138085,0.046099983499999997,0.046578394000000023,0.046604430499999995,0.046641148,0.04723972299999999,0.047755284999999981,0.047818213499999998,0.048128314999999998,0.0486088795,0.048625822499999971,0.049385610999999996,0.050438789999999997,0.057708865000000012],"15":[1.6998499999999999e-06,1.7512399999999999e-06,1.7546000000000001e-06,1.8750200000000002e-06,1.8777e-06,1.8804e-06,1.91844e-06,1.9213999999999999e-06,1.9363500000000001e-06,1.9428700000000001e-06,1.9432600000000003e-06,1.9835600000000001e-06,1.9863399999999998e-06,2.0007499999999999e-06,2.0102700000000001e-06,2.0372023809523809e-06,2.0390299999999999e-06,2.0619399999999999e-06,2.0959999999999999e-06,2.1380519480519482e-06],"13312":[0.001879464,0.0018849910000000001,0.0019054147500000001,0.0019127020000000001,0.0019146110000000001,0.00192159275,0.0019218498000000001,0.0019228413999999999,0.001928094,0.0019310589999999999,0.001936042,0.0019426179999999995,0.0019441790000000001,0.0019483126,0.0019630579999999993,0.001988292,0.0020019090000000001,0.002009261,0.0020100790000000001,0.0020330830000000002],"4980736":[2.4328178524999999,2.4392700015000002,2.4398790579999998,2.4414674070000002,2.4443645119999999,2.4544313170000001,2.4569274655000002,2.459183323,2.4636074109999999,2.4642898904999999,2.4673016825,2.4707086110000001,2.4739773769999998,2.474124652,2.4755492275000002,2.475731423,2.4760487740000001,2.4760549305000001,2.4894692854999998,2.5324704365000001],"118784":[0.022934854000000001,0.023731943500000002,0.023765328000000002,0.023807199500000004,0.023839502000000002,0.0239149715,0.023954576000000002,0.02408366,0.0240926435,0.024248916000000002,0.024302794499999992,0.024364826499999999,0.024379325,0.024828477999999994,0.024835745499999999,0.0248709025,0.025043568499999991,0.025369410999999998,0.025962277499999999,0.027354738],"51200":[0.0083834980000000031,0.0084720230000000039,0.0085146480000000049,0.008516718000000003,0.0085568420000000003,0.0085701409999999999,0.0085889030000000002,0.0086162009999999987,0.0086549439999999995,0.0086597449999999999,0.0086993489999999968,0.0087080000000000005,0.0087717170000000035,0.0087897920000000046,0.0088510659999999994,0.0088629850000000003,0.0089278889999999979,0.0089873490000000004,0.009072821,0.0091077720000000001],"16":[1.6197999999999999e-06,1.62311e-06,1.6291e-06,1.7115500000000002e-06,1.78446e-06,1.7903799999999999e-06,1.8021700000000001e-06,1.8418300000000001e-06,1.84267e-06,1.8604099999999999e-06,1.8665e-06,1.8864700000000001e-06,1.8880599999999999e-06,1.8903299999999999e-06,1.8962499999999998e-06,1.9350999999999999e-06,1.9416923076923077e-06,1.95591e-06,2.0270299999999998e-06,2.0457300000000001e-06],"21":[2.3820100000000001e-06,2.3847499999999999e-06,2.47592e-06,2.5653200000000004e-06,2.5816800000000001e-06,2.6021099999999999e-06,2.6112000000000001e-06,2.6475799999999997e-06,2.6530299999999998e-06,2.6588399999999997e-06,2.67642e-06,2.67711e-06,2.7475399999999998e-06,2.7558200000000001e-06,2.7682800000000001e-06,2.7707200000000001e-06,2.7851200000000004e-06,2.8378900000000001e-06,2.8923799999999999e-06,3.1431200000000002e-06],"917504":[0.31770189999999998,0.32126476700000001,0.32314796400000001,0.32775244549999999,0.32893204399999998,0.32954333600000002,0.330098487,0.33026446500000001,0.33090786799999999,0.33249997099999995,0.334956702,0.335799393,0.33782963999999999,0.33810337400000001,0.33954170700000003,0.34537151100000002,0.34830123950000003,0.35217694799999999,0.364695665,0.37201549300000003],"22":[2.4962999999999997e-06,2.5816400000000002e-06,2.6229399999999997e-06,2.70026e-06,2.7193500000000001e-06,2.7305400000000002e-06,2.74221e-06,2.74813e-06,2.77199e-06,2.7898200000000001e-06,2.80631e-06,2.8351800000000003e-06,2.8656200000000003e-06,2.8878800000000002e-06,2.8918699999999998e-06,2.9697499999999998e-06,2.98565e-06,3.02829e-06,3.0404999999999999e-06,3.08702e-06],"4864":[0.00067381399999999968,0.00067515000000000001,0.00068645000000000023,0.00068722300000000004,0.00068900600000000004,0.00069263000000000029,0.00069308599999999998,0.00069423769230769229,0.00069730469230769223,0.00069757199999999993,0.0007010355384615384,0.00070286541666666645,0.00071119,0.00071300600000000019,0.00071586476923076923,0.00071776199999999983,0.00072074600000000008,0.00072279238461538478,0.00072624899999999977,0.000741364],"17":[1.9416900000000001e-06,1.9505799999999999e-06,1.9899499999999999e-06,2.12095e-06,2.1336000000000002e-06,2.1402799999999999e-06,2.1436600000000001e-06,2.1570300000000003e-06,2.1597299999999998e-06,2.1848899999999998e-06,2.2000300000000001e-06,2.2282000000000001e-06,2.2429899999999997e-06,2.2548899999999999e-06,2.2606e-06,2.2668399999999999e-06,2.28742e-06,2.3683499999999999e-06,2.3752900000000001e-06,2.4670699999999997e-06],"14848":[0.002101215,0.0021188599999999989,0.0021217860000000001,0.0021226650000000001,0.002127248,0.0021291040000000006,0.0021301469999999998,0.0021375542500000001,0.0021458570000000001,0.002147389,0.0021651560000000001,0.0021700292499999998,0.0021716797500000002,0.0021717245,0.0021805309999999999,0.0021961777499999993,0.0022065967499999999,0.0022078739999999999,0.0022107049999999999,0.002244055999999999],"23":[2.5849100000000003e-06,2.6894499999999997e-06,2.8362399999999999e-06,2.8604900000000001e-06,2.8875882352941177e-06,2.8942600000000001e-06,2.89737e-06,2.8992999999999999e-06,2.9052800000000002e-06,2.9507200000000001e-06,2.9627100000000003e-06,2.99225e-06,2.9996999999999998e-06,3.0028999999999997e-06,3.0547199999999999e-06,3.0961299999999999e-06,3.1013900000000002e-06,3.1846e-06,3.3407199999999998e-06,3.4000399999999999e-06],"786432":[0.259626568,0.26218989999999998,0.26863339200000003,0.26944768399999997,0.27046963000000002,0.27049564599999998,0.271019171,0.2710494725,0.27169773200000003,0.27253106399999999,0.2738128245,0.27494637300000002,0.27572976199999999,0.28029065799999997,0.28076818199999998,0.28688556249999997,0.28700543899999997,0.29323871699999998,0.29487398050000002,0.30227385950000002],"18":[2.0470199999999998e-06,2.0510999999999997e-06,2.12718e-06,2.14832e-06,2.2321799999999999e-06,2.23435e-06,2.2529399999999999e-06,2.2570199999999999e-06,2.2603799999999999e-06,2.2686799999999999e-06,2.3236099999999999e-06,2.3493200000000002e-06,2.3497300000000001e-06,2.35801e-06,2.3628000000000001e-06,2.3655800000000001e-06,2.36668e-06,2.39583e-06,2.4882900000000001e-06,2.4884899999999997e-06],"1638400":[0.67109954000000005,0.67826741299999993,0.68069950150000003,0.68097470150000006,0.68227279900000004,0.68536213800000001,0.68569581400000001,0.69007624999999995,0.69102184550000001,0.69120273599999993,0.69320270299999998,0.693733665,0.69730317600000002,0.69805717199999995,0.69896203400000001,0.70267513500000001,0.70728414250000005,0.71603906399999995,0.7207442235,0.73072188400000004],"7864320":[3.99980651,4.0095597270000001,4.0140354775000002,4.0167444989999996,4.0197414504999998,4.0209017905,4.0210902989999999,4.0265274230000001,4.0274046634999996,4.0286526499999997,4.0310730709999998,4.0332871450000001,4.0339613060000001,4.035691774,4.0365673759999998,4.0379398120000003,4.0425722930000001,4.0440341450000004,4.0523626000000004,4.1382093720000004],"24":[2.6862244897959179e-06,2.8730200000000004e-06,2.95136e-06,2.9697799999999998e-06,2.9724200000000002e-06,2.9749399999999999e-06,2.9983100000000004e-06,3.0526799999999999e-06,3.0653900000000001e-06,3.0693200000000001e-06,3.0846399999999999e-06,3.10913e-06,3.13058e-06,3.1806199999999998e-06,3.2079899999999998e-06,3.2499399999999998e-06,3.2505799999999997e-06,3.29622e-06,3.35021e-06,3.3503599999999999e-06],"14155776":[7.5204846845000004,7.5400595790000002,7.5421491329999997,7.5436772410000001,7.5444359810000003,7.5549799875000003,7.5565331699999998,7.5573578340000003,7.5614352365000004,7.5679397115000002,7.5716350945000004,7.5741861779999997,7.5747107480000002,7.5772807340000004,7.5916026710000004,7.5921524859999998,7.5976591019999997,7.6077104100000001,7.6231419625000001,7.7634569254999999],"19":[2.2009100000000002e-06,2.2085499999999998e-06,2.3046200000000001e-06,2.3339100000000001e-06,2.34549e-06,2.3665200000000003e-06,2.3685799999999999e-06,2.3869e-06,2.4002100000000002e-06,2.4094000000000002e-06,2.41085e-06,2.4808500000000001e-06,2.5043500000000004e-06,2.51963e-06,2.5223500000000001e-06,2.5317900000000002e-06,2.5366199999999997e-06,2.5593300000000002e-06,2.6874299999999999e-06,2.8651960784313724e-06],"30":[3.37341e-06,3.41445e-06,3.5090000000000002e-06,3.56814e-06,3.7218600000000001e-06,3.76063e-06,3.7881600000000002e-06,3.8103300000000002e-06,3.85876e-06,3.8740999999999999e-06,3.8834900000000003e-06,3.9098899999999998e-06,3.9506799999999996e-06,3.9680400000000002e-06,3.9701000000000003e-06,3.9901199999999998e-06,3.9929399999999998e-06,4.1177399999999998e-06,4.2161000000000002e-06,4.2522300000000001e-06],"25":[2.8184699999999998e-06,2.8370300000000001e-06,2.8451799999999998e-06,3.01683e-06,3.0700299999999998e-06,3.07527e-06,3.0978199999999999e-06,3.1005499999999999e-06,3.1043200000000002e-06,3.1150499999999999e-06,3.1364499999999998e-06,3.1543199999999997e-06,3.1912899999999996e-06,3.2440600000000002e-06,3.2494499999999999e-06,3.2913799999999998e-06,3.5376000000000002e-06,3.5558099999999998e-06,3.6639199999999999e-06,3.68562e-06],"31":[3.5286800000000001e-06,3.5512400000000002e-06,3.6702700000000003e-06,3.6884000000000001e-06,3.8854199999999998e-06,3.90229e-06,3.9117600000000001e-06,3.9178800000000005e-06,3.9411399999999997e-06,3.9499799999999997e-06,3.96886e-06,4.0025500000000003e-06,4.0323700000000002e-06,4.03347e-06,4.0429799999999995e-06,4.0500789473684207e-06,4.2288200000000006e-06,4.3271599999999996e-06,4.3438199999999995e-06,4.4726000000000002e-06],"1280":[0.00017517180000000006,0.00017723833333333337,0.00017787020000000004,0.00017796200000000001,0.00017818400000000004,0.00017828700000000001,0.00017982,0.00018041299999999998,0.00018204400000000002,0.00018554976923076919,0.000185873,0.00018620399999999998,0.00018674428846153848,0.00018765319999999999,0.00018798900000000001,0.0001892414807692307,0.00019250839999999998,0.00019471091999999991,0.00019573188000000002,0.000197992],"26":[2.9374499999999997e-06,2.9465399999999999e-06,3.0913500000000001e-06,3.0942300000000004e-06,3.1255299999999995e-06,3.1610900000000003e-06,3.1792099999999998e-06,3.2106499999999999e-06,3.21774e-06,3.2645599999999998e-06,3.2923799999999999e-06,3.3142500000000001e-06,3.3429299999999998e-06,3.3545599999999998e-06,3.3907200000000001e-06,3.4166300000000004e-06,3.4381249999999998e-06,3.4672099999999999e-06,3.5521000000000003e-06,3.8892e-06],"3932160":[1.8774286805,1.877714111,1.8822936160000001,1.8834996614999999,1.883581948,1.8944882525,1.895157556,1.895598428,1.8977307624999999,1.8980431405,1.9038484105,1.9077834505,1.9080936589999999,1.912662833,1.9145170524999999,1.9213845165000001,1.9214842219999999,1.9238836454999999,1.960973496,1.9899553544999999],"2432":[0.00032644799999999991,0.00033121099999999998,0.00033196199999999999,0.00034408399999999998,0.00034734699999999991,0.00034866500000000001,0.00034963300000000002,0.00035014099999999999,0.00035018799999999981,0.00035320611111111109,0.00035539499999999989,0.00035604344444444436,0.00035655000000000013,0.00035657840740740732,0.00035751999999999995,0.0003578854074074074,0.00036540829629629643,0.0003725924230769245,0.00038699300000000008,0.00039214499999999999],"32":[3.1539300000000004e-06,3.1671200000000003e-06,3.4526199999999999e-06,3.4680000000000001e-06,3.4707999999999999e-06,3.5194000000000001e-06,3.5242000000000001e-06,3.5292400000000003e-06,3.57159e-06,3.5781600000000001e-06,3.6479999999999996e-06,3.7126100000000001e-06,3.7189000000000001e-06,3.7213600000000002e-06,3.7871900000000001e-06,3.8827000000000001e-06,3.91849e-06,3.9882799999999999e-06,4.0704800000000005e-06,4.1308000000000003e-06],"27":[3.0403246753246751e-06,3.2081700000000001e-06,3.3137599999999997e-06,3.3527200000000002e-06,3.3682200000000003e-06,3.3821699999999996e-06,3.3886099999999999e-06,3.4008200000000002e-06,3.42404e-06,3.4259250000000002e-06,3.4641e-06,3.4822199999999996e-06,3.5004899999999999e-06,3.5300000000000001e-06,3.5489499999999997e-06,3.5823333333333334e-06,3.5889399999999999e-06,3.60312e-06,3.6357900000000001e-06,3.6395999999999998e-06],"409600":[0.1069595595,0.10771533599999999,0.10811211,0.1081384785,0.108612323,0.109029402,0.111248347,0.11147841999999999,0.1131004955,0.11324894100000001,0.113430555,0.114981182,0.11510115,0.117184749,0.117350909,0.11749807600000001,0.11769344700000001,0.118249559,0.12092815699999999,0.12247464600000001]}},{"title":"Set insert, reserving capacity","results":{"28":[6.2345000000000004e-07,6.2345000000000004e-07,6.2376999999999998e-07,6.2408000000000007e-07,6.2748e-07,6.2855999999999996e-07,6.3091999999999999e-07,6.3389000000000002e-07,6.3979000000000004e-07,6.4743000000000002e-07,6.4759999999999995e-07,6.5169135802469136e-07,6.6591000000000001e-07,6.7830999999999999e-07,6.8015000000000007e-07,6.8089000000000006e-07,6.9430000000000007e-07,6.9823999999999998e-07,7.1606000000000007e-07,7.2051000000000009e-07],"34":[6.9075999999999997e-07,6.9223e-07,7.1018000000000008e-07,7.2394999999999997e-07,7.2675000000000007e-07,7.3252e-07,7.3496000000000001e-07,7.3591999999999994e-07,7.3910000000000005e-07,7.4287999999999999e-07,7.4863999999999996e-07,7.5062999999999994e-07,7.5358000000000006e-07,7.5639999999999997e-07,7.5657999999999996e-07,7.6102000000000002e-07,7.6129000000000006e-07,7.6266000000000008e-07,7.8227999999999999e-07,7.8906000000000005e-07],"29":[6.3510999999999992e-07,6.3651000000000003e-07,6.3873e-07,6.4103000000000007e-07,6.4392000000000001e-07,6.4738000000000002e-07,6.5561000000000009e-07,6.5852000000000005e-07,6.6383999999999994e-07,6.6897999999999995e-07,6.7005000000000005e-07,6.7321000000000003e-07,6.7449e-07,6.7732999999999994e-07,6.7847000000000007e-07,6.7869e-07,6.8581999999999998e-07,6.8916000000000006e-07,6.9176000000000005e-07,7.3417000000000002e-07],"40":[7.8527536231884058e-07,7.9324000000000003e-07,8.0108000000000002e-07,8.1305999999999995e-07,8.1714000000000002e-07,8.2979999999999998e-07,8.3036999999999994e-07,8.3335999999999999e-07,8.3618000000000001e-07,8.3663000000000005e-07,8.428e-07,8.4478000000000002e-07,8.5443000000000001e-07,8.5774e-07,8.6007000000000005e-07,8.6074000000000002e-07,8.7161000000000001e-07,8.758900000000001e-07,9.0055e-07,1.0048699999999999e-06],"17408":[0.00033491499999999997,0.00033672300000000004,0.00033702,0.000338449,0.000338759,0.00034507796428571438,0.00034810499999999981,0.00034860800000000003,0.000348857,0.00035003711111111118,0.00035009128571428575,0.00035363295652173909,0.000354015,0.00035806599999999987,0.000358215,0.00035903788888888886,0.0003595105714285714,0.00036091981481481481,0.00036177329629629622,0.00036336777777777791],"1472":[2.8600999999999999e-05,2.8856e-05,2.8952e-05,2.8997e-05,2.9179999999999998e-05,2.9686550000000001e-05,2.9899e-05,2.9925189999999999e-05,3.0002770000000001e-05,3.0065700000000003e-05,3.0359150000000002e-05,3.0359969999999999e-05,3.0460259999999998e-05,3.0533539999999998e-05,3.0545320000000002e-05,3.0614200000000002e-05,3.0717799999999999e-05,3.0727272727272724e-05,3.0942894736842108e-05,3.1967919999999997e-05],"112":[1.8784399999999999e-06,1.9097399999999999e-06,1.9142299999999998e-06,1.9373699999999999e-06,1.9533399999999998e-06,1.9538899999999998e-06,1.9592000000000002e-06,1.9679100000000001e-06,1.9692600000000001e-06,1.9706799999999999e-06,1.9710600000000002e-06,1.9740799999999997e-06,1.9863899999999999e-06,1.9955600000000002e-06,2.0036000000000002e-06,2.01263e-06,2.0222700000000001e-06,2.0349900000000001e-06,2.0474000000000001e-06,2.0496700000000001e-06],"1376256":[0.045560130499999997,0.045637142499999984,0.045662688999999999,0.045908863499999994,0.04593137499999999,0.046075560500000001,0.046503289500000003,0.046596819000000018,0.046647373999999998,0.047490624000000016,0.047655091000000011,0.048397068499999987,0.0488212955,0.04936882799999999,0.050351685,0.051373103999999989,0.052780839499999996,0.053273642999999996,0.053453653499999997,0.053955012999999996],"5242880":[0.284354365,0.28605632999999997,0.286947648,0.28799200599999997,0.28840675800000004,0.289316409,0.289699027,0.28970391049999999,0.28987731,0.28987917400000002,0.28991998399999996,0.29004832450000001,0.29006536250000003,0.29337968399999997,0.29521605249999999,0.29537352900000002,0.296972348,0.29727192099999999,0.30013921050000003,0.30407617050000002],"36":[7.354199999999999e-07,7.3998000000000009e-07,7.5229999999999998e-07,7.5332000000000008e-07,7.5679999999999989e-07,7.6039999999999995e-07,7.6392999999999999e-07,7.6816000000000007e-07,7.7309e-07,7.7496000000000005e-07,7.7584999999999995e-07,7.7705000000000004e-07,7.8053000000000007e-07,7.8573999999999999e-07,7.8576000000000002e-07,7.8800000000000002e-07,7.9273000000000003e-07,7.9455000000000008e-07,7.9944000000000007e-07,8.0055000000000001e-07],"42":[8.3183999999999996e-07,8.4577999999999999e-07,8.5580000000000003e-07,8.5646999999999999e-07,8.6481000000000003e-07,8.6521999999999991e-07,8.6751000000000002e-07,8.6919999999999997e-07,8.7021999999999997e-07,8.7077000000000011e-07,8.7158999999999998e-07,8.7372000000000002e-07,8.8006000000000001e-07,8.8832000000000006e-07,8.9032999999999995e-07,8.9308999999999991e-07,8.9833999999999998e-07,9.0025999999999994e-07,9.0833000000000003e-07,9.2139999999999998e-07],"11534336":[0.74376391450000001,0.7455692545,0.7457840805,0.74725760249999995,0.7480331375,0.74931520350000003,0.75069586350000006,0.75116235549999999,0.75208132049999998,0.75294991,0.753084215,0.753465257,0.75585587350000005,0.75698353149999997,0.75766096650000003,0.75771905100000003,0.75921575799999996,0.76334511500000002,0.77323249199999999,0.80021770400000003],"114688":[0.0022813767500000004,0.0023097249999999995,0.0023280887499999999,0.00233550975,0.0023436626666666666,0.0023503174999999999,0.0023530370000000001,0.0023624532499999999,0.0023734734999999998,0.0023820070000000002,0.002387377,0.0023928220000000002,0.002406732,0.0024120049999999992,0.0024845370000000011,0.0025719900000000006,0.0025816620000000002,0.0026383126666666666,0.0028515099999999998,0.0029224419999999995],"144":[2.43342e-06,2.4454599999999999e-06,2.4474799999999997e-06,2.4669999999999998e-06,2.47747e-06,2.4894700000000001e-06,2.5094499999999997e-06,2.5172999999999996e-06,2.52224e-06,2.5254100000000003e-06,2.5397499999999997e-06,2.5613200000000001e-06,2.56141e-06,2.5902500000000003e-06,2.6282099999999999e-06,2.62996e-06,2.6363899999999996e-06,2.6904099999999995e-06,2.739448717948718e-06,4.4162799999999998e-06],"38":[7.4590000000000003e-07,7.7175999999999992e-07,7.8220999999999996e-07,7.8430000000000005e-07,7.8612999999999996e-07,7.9167999999999995e-07,7.9171000000000004e-07,7.9250999999999999e-07,7.9437999999999994e-07,7.9523000000000001e-07,7.9897000000000001e-07,8.0019999999999998e-07,8.0515999999999999e-07,8.1008999999999992e-07,8.1024000000000003e-07,8.1078000000000001e-07,8.178600000000001e-07,8.197899999999999e-07,8.562400000000001e-07,8.8035999999999992e-07],"240":[4.0178799999999996e-06,4.0756700000000002e-06,4.07844e-06,4.0814200000000001e-06,4.0834300000000001e-06,4.0900099999999997e-06,4.1202599999999999e-06,4.1212600000000004e-06,4.1320000000000004e-06,4.1362999999999997e-06,4.1486899999999999e-06,4.1908300000000002e-06,4.2012900000000001e-06,4.2098400000000002e-06,4.2308600000000002e-06,4.2354199999999998e-06,4.2721300000000005e-06,4.3168599999999999e-06,4.4835399999999998e-06,4.5490599999999999e-06],"9216":[0.000180108,0.000181242,0.000181452,0.000182685,0.00018365700000000002,0.00018485000000000002,0.000187694,0.00018829348936170212,0.00018922200000000001,0.00019044629999999998,0.0001916155,0.00019238777083333333,0.00019293767391304349,0.00019301600000000001,0.00019332166666666668,0.0001938493333333333,0.00019471608163265311,0.00019714113043478256,0.00019852000000000007,0.00021784773333333334],"44":[8.5735999999999989e-07,8.6229000000000003e-07,8.6665999999999995e-07,8.8552000000000006e-07,8.9423000000000003e-07,8.9787000000000003e-07,9.0182999999999997e-07,9.0210999999999997e-07,9.0230999999999998e-07,9.0490000000000001e-07,9.0710000000000007e-07,9.0964000000000009e-07,9.2199000000000007e-07,9.3757000000000005e-07,9.3888000000000011e-07,9.4545999999999994e-07,9.5140000000000012e-07,9.7972000000000004e-07,1.02567e-06,1.0472699999999999e-06],"1664":[2.7698000000000001e-05,2.8025999999999999e-05,2.8331e-05,2.8591756097560976e-05,2.8986e-05,2.905482e-05,2.9278279999999999e-05,2.9314879999999998e-05,2.9439000000000001e-05,2.9479999999999999e-05,2.952578e-05,2.9607479999999999e-05,2.9847680000000001e-05,2.988045e-05,2.9894909999999998e-05,3.0076000000000001e-05,3.00906e-05,3.0628800000000001e-05,3.0763999999999999e-05,3.1413916666666671e-05],"196608":[0.0047218720000000002,0.0047270905000000012,0.0047478884999999976,0.004765287,0.0047706505000000001,0.0047794270000000002,0.0047808945000000023,0.0048057260000000024,0.0048211619999999986,0.0048465009999999979,0.0048624109999999996,0.0048745350000000002,0.0049431609999999997,0.0050494670000000002,0.0051980349999999976,0.005266616,0.0054170430000000016,0.00562131,0.005711954,0.0058031060000000006],"155648":[0.0034635590000000002,0.0034991220000000012,0.0035055384999999988,0.0035113890000000002,0.0035466984999999998,0.003554701,0.0035736035,0.0035797625,0.003580782999999998,0.003583836,0.003611338,0.0036349300000000015,0.0037041649999999997,0.0037463639999999999,0.0038082675000000012,0.0038374170000000001,0.00387609,0.0038879750000000018,0.0039228484999999993,0.0042661134999999999],"2816":[5.7967280000000002e-05,5.836901515151515e-05,5.88125e-05,5.9404235294117648e-05,5.9739045454545454e-05,5.9744710000000005e-05,5.9913e-05,6.0320369999999997e-05,6.0545770000000004e-05,6.0607290322580651e-05,6.0784630000000003e-05,6.0943470000000001e-05,6.1130140350877194e-05,6.1193482142857142e-05,6.1193609999999997e-05,6.1287520000000007e-05,6.1290160000000002e-05,6.1634469999999992e-05,6.2264578947368425e-05,6.7163041666666666e-05],"50":[9.0070000000000001e-07,9.2256000000000002e-07,9.2668000000000004e-07,9.3035999999999997e-07,9.3324000000000006e-07,9.3452000000000003e-07,9.4442999999999999e-07,9.5105000000000009e-07,9.5260999999999995e-07,9.5481000000000001e-07,9.5709000000000006e-07,9.5768000000000004e-07,9.599300000000001e-07,9.6079999999999997e-07,9.6440999999999989e-07,9.6483000000000004e-07,9.7214285714285709e-07,9.7495000000000008e-07,9.752499999999999e-07,1.0205499999999999e-06],"2359296":[0.10306566,0.10314045199999999,0.10344824599999999,0.1035699435,0.103913559,0.1039281265,0.1042415305,0.10439069199999999,0.1052875375,0.10587880299999999,0.1067078155,0.1076159015,0.10784629900000001,0.108114768,0.10814178299999999,0.10817251949999999,0.11130177300000001,0.11136219949999999,0.11390674000000001,0.11428677850000002],"46":[8.781800000000001e-07,9.1015999999999994e-07,9.1226999999999995e-07,9.1249000000000009e-07,9.1491999999999994e-07,9.2167999999999998e-07,9.2175000000000001e-07,9.2562e-07,9.3274000000000003e-07,9.4006999999999992e-07,9.4374000000000001e-07,9.5847999999999988e-07,9.640499999999999e-07,9.6501999999999999e-07,9.6793000000000007e-07,9.8461000000000013e-07,1.01727e-06,1.0217600000000001e-06,1.0431500000000001e-06,1.07374e-06],"176":[2.9906000000000002e-06,3.0193499999999997e-06,3.0433000000000002e-06,3.0548599999999999e-06,3.0645500000000002e-06,3.0751399999999998e-06,3.0810100000000001e-06,3.0886699999999998e-06,3.1386400000000002e-06,3.1531400000000002e-06,3.1564400000000002e-06,3.16111e-06,3.1667499999999998e-06,3.2200300000000001e-06,3.2318699999999999e-06,3.2501699999999998e-06,3.2598499999999998e-06,3.33071e-06,3.35627e-06,3.6568899999999998e-06],"52":[9.3627000000000006e-07,9.5275999999999996e-07,9.6909999999999996e-07,9.6988999999999996e-07,9.7698e-07,9.7709999999999993e-07,9.7768000000000006e-07,9.7817000000000003e-07,9.8413999999999986e-07,9.8789000000000004e-07,9.8859999999999995e-07,9.8912999999999996e-07,9.9316999999999989e-07,9.9607999999999996e-07,9.9744000000000002e-07,1.00495e-06,1.01767e-06,1.0264500000000001e-06,1.0269799999999999e-06,1.1150300000000001e-06],"272":[4.6676699999999998e-06,4.6781299999999997e-06,4.7095899999999999e-06,4.7123499999999999e-06,4.7193188405797098e-06,4.7364799999999998e-06,4.7374933333333331e-06,4.74284e-06,4.7621200000000002e-06,4.77575e-06,4.7902600000000003e-06,4.7919800000000003e-06,4.8299500000000002e-06,4.8844000000000002e-06,4.9027399999999999e-06,4.9178899999999993e-06,4.9424299999999999e-06,4.9544599999999995e-06,4.9692300000000002e-06,5.0663799999999998e-06],"116":[1.9722299999999999e-06,1.99847e-06,2.00206e-06,2.0023900000000002e-06,2.0030999999999999e-06,2.02015e-06,2.0219300000000001e-06,2.03741e-06,2.03813e-06,2.0506300000000003e-06,2.06403e-06,2.0648699999999999e-06,2.0676399999999997e-06,2.0840400000000001e-06,2.08675e-06,2.08896e-06,2.0898400000000001e-06,2.0968e-06,2.1076299999999999e-06,2.1514700000000001e-06],"47104":[0.0010224750000000001,0.001035659,0.001037804,0.0010391689999999999,0.0010461158888888885,0.001046372875,0.0010499909999999997,0.001053479,0.0010536572222222226,0.00105404,0.0010549934444444447,0.0010599671111111114,0.00106959375,0.0010805328750000001,0.001082862,0.0010855902222222224,0.0010882345555555558,0.0010984054444444444,0.001111822375,0.0011739193750000001],"6912":[0.00011984233333333333,0.000123683,0.00012554950000000004,0.000125971,0.00012626,0.00012693436764705883,0.00012774098648648646,0.00012787000000000003,0.00012822828947368421,0.00012882035384615388,0.00012926461842105254,0.00012938109589041093,0.0001303330447761195,0.00013042683333333333,0.0001311595,0.000131197,0.000131786,0.00013210700000000001,0.00013403627027027025,0.00013428325000000005],"1856":[3.3445629999999999e-05,3.3566280000000003e-05,3.3602560439560436e-05,3.3664449999999999e-05,3.3701860000000001e-05,3.3728610000000002e-05,3.397443e-05,3.3981850000000004e-05,3.3994149999999997e-05,3.402033333333333e-05,3.4193989999999998e-05,3.4299379999999998e-05,3.4362540000000005e-05,3.4591290000000001e-05,3.4624020000000001e-05,3.5002649999999999e-05,3.5163769999999995e-05,3.5229480000000004e-05,3.5444000000000001e-05,3.822024e-05],"48":[9.5983000000000009e-07,9.6197000000000008e-07,9.6585000000000004e-07,9.7339000000000001e-07,9.7686000000000008e-07,9.7979999999999992e-07,9.7992999999999991e-07,9.8018999999999989e-07,9.8166000000000002e-07,9.8227000000000013e-07,9.8519000000000005e-07,9.8639999999999999e-07,9.8708999999999998e-07,1.0051599999999999e-06,1.0096500000000002e-06,1.0338299999999999e-06,1.0454499999999999e-06,1.07798e-06,1.1344699999999999e-06,1.15484e-06],"2097152":[0.085961421999999982,0.08607914450000001,0.086982374999999973,0.087308283,0.087348711999999967,0.087846261000000023,0.088069733999999997,0.088566023999999993,0.089073029999999956,0.089197301000000007,0.089399281999999997,0.090103373,0.09012382999999996,0.090337018499999963,0.090338956500000012,0.090878233000000003,0.091026133499999953,0.09428816399999998,0.095970526,0.096445718],"54":[9.7508000000000007e-07,9.7766999999999999e-07,9.8091999999999992e-07,9.8334000000000002e-07,9.8952999999999999e-07,9.9139000000000009e-07,1.0039699999999999e-06,1.0053600000000001e-06,1.0054499999999998e-06,1.00887e-06,1.0171299999999999e-06,1.0176200000000001e-06,1.0196000000000002e-06,1.0228599999999999e-06,1.0229499999999999e-06,1.0258e-06,1.0337599999999999e-06,1.0361600000000001e-06,1.0626199999999999e-06,1.1230000000000001e-06],"2031616":[0.083518307999999999,0.083560990999999959,0.084213235999999997,0.084588797499999993,0.085301747000000039,0.085306373500000005,0.085361434999999999,0.085521530500000026,0.085610890999999995,0.085833998999999994,0.085976802999999963,0.086066072000000007,0.087532553000000027,0.087929236999999993,0.08986754000000001,0.09003405450000003,0.090613813500000001,0.09067944700000001,0.09208711750000001,0.092910809000000025],"43008":[0.00092160199999999999,0.00092328800000000019,0.00093207919999999957,0.00093282999999999973,0.00093371899999999974,0.00093663350000000004,0.00094041169999999996,0.00094310220000000042,0.00094591740000000003,0.00094671300000000007,0.00094726039999999993,0.00095013299999999992,0.00095085269999999977,0.00095336669999999957,0.00095838344444444429,0.0009590849,0.00096606969999999998,0.00098390010000000004,0.00098594100000000038,0.0010506179999999999],"60":[1.0865399999999999e-06,1.0896296296296296e-06,1.09439e-06,1.1013999999999999e-06,1.1037600000000001e-06,1.1065600000000001e-06,1.1073899999999999e-06,1.10919e-06,1.1101800000000001e-06,1.1123999999999999e-06,1.1229099999999999e-06,1.1234600000000001e-06,1.12568e-06,1.14157e-06,1.1575999999999999e-06,1.15863e-06,1.1597099999999999e-06,1.1794999999999999e-06,1.1841800000000001e-06,1.2015799999999999e-06],"30720":[0.00057669100000000005,0.00058372300000000018,0.00058478100000000004,0.00058804099999999987,0.00059022399999999987,0.00059290318749999978,0.00059334226666666679,0.00059487199999999998,0.00059498000000000038,0.00059822800000000034,0.00060534533333333291,0.00060564556249999963,0.00060675766666666673,0.00060979373333333326,0.00061134653333333347,0.00061353999999999998,0.00061554899999999974,0.00062104866666666655,0.00062565146666666654,0.00062602099999999972],"56":[1.00261e-06,1.01321e-06,1.03266e-06,1.0353799999999999e-06,1.0433800000000001e-06,1.0444300000000001e-06,1.0465799999999999e-06,1.05526e-06,1.0567899999999999e-06,1.0570100000000001e-06,1.05928e-06,1.0595900000000001e-06,1.0673600000000001e-06,1.0690000000000001e-06,1.07176e-06,1.07268e-06,1.0743e-06,1.08346e-06,1.1088400000000001e-06,1.1578899999999999e-06],"62":[1.1099299999999999e-06,1.11073e-06,1.13014e-06,1.1314444444444445e-06,1.1323599999999999e-06,1.1374299999999999e-06,1.1441800000000001e-06,1.1514999999999999e-06,1.15464e-06,1.15623e-06,1.1591e-06,1.1620400000000001e-06,1.17023e-06,1.1762700000000001e-06,1.1786199999999999e-06,1.1801600000000001e-06,1.1848000000000001e-06,1.1964999999999999e-06,1.2226500000000001e-06,1.3746599999999999e-06],"58":[1.0103000000000001e-06,1.0356000000000001e-06,1.03737e-06,1.0444399999999999e-06,1.0475900000000001e-06,1.0752000000000001e-06,1.07743e-06,1.0803400000000001e-06,1.0840900000000001e-06,1.08738e-06,1.0883e-06,1.0916000000000001e-06,1.09334e-06,1.0965100000000001e-06,1.1057699999999999e-06,1.1064324324324324e-06,1.1089000000000001e-06,1.1171700000000001e-06,1.12796e-06,1.20195e-06],"3014656":[0.14747407699999998,0.14837310050000002,0.14865394700000001,0.14868703899999999,0.149311687,0.15050492900000001,0.15060469700000001,0.15082250350000001,0.150901586,0.15148264,0.1515074025,0.15175687099999999,0.152309533,0.15273114099999999,0.15357267150000001,0.15455947199999998,0.15511212599999999,0.15533203500000001,0.155620812,0.171835456],"64":[1.1179300000000001e-06,1.12394e-06,1.1388400000000001e-06,1.1454000000000001e-06,1.16008e-06,1.1609199999999999e-06,1.16348e-06,1.1689899999999999e-06,1.1772899999999999e-06,1.18828e-06,1.19309e-06,1.1970900000000001e-06,1.1981400000000001e-06,1.2005e-06,1.2069e-06,1.2099799999999999e-06,1.21061e-06,1.2302299999999999e-06,1.2524799999999999e-06,1.2764e-06],"8388608":[0.47229057250000001,0.47579094350000001,0.47941653350000002,0.47966185100000003,0.479679199,0.48101977200000001,0.4825668675,0.48273634399999998,0.48289535649999998,0.48314560400000001,0.48415455600000001,0.4842248535,0.48423907150000001,0.48532715949999999,0.49076590949999999,0.49120324100000001,0.491770971,0.49290699700000001,0.49601614100000002,0.49703754700000002],"29696":[0.000553241,0.00055827000000000003,0.00056433200000000018,0.00056726499999999996,0.00056765411764705877,0.00057033837500000011,0.00057131206666666669,0.00057637437499999996,0.00058646499999999977,0.00059027040000000019,0.00059260699999999999,0.0005930669375,0.00059699153333333339,0.00060285225000000016,0.00060766999999999982,0.00061020760000000029,0.00062087699999999971,0.00063265660000000009,0.00063336100000000004,0.00064494899999999991],"216":[3.5861052631578946e-06,3.62575e-06,3.6600699999999999e-06,3.6630700000000001e-06,3.6634200000000001e-06,3.66681e-06,3.6699900000000002e-06,3.6790700000000001e-06,3.6808700000000002e-06,3.6970100000000002e-06,3.7115500000000001e-06,3.7310899999999999e-06,3.76135e-06,3.7651500000000003e-06,3.7950000000000001e-06,3.8055400000000001e-06,3.83986e-06,3.8453499999999995e-06,3.86088e-06,3.9959299999999997e-06],"106496":[0.0020858499999999993,0.0020924497500000002,0.0021130260000000005,0.0021161955000000001,0.0021263620000000001,0.00213132475,0.0021456997500000001,0.0021459262500000001,0.0021656742500000001,0.0021669767499999998,0.00219851225,0.0022061562500000002,0.0022298159999999999,0.0022424199999999993,0.0023670722500000012,0.0024057006666666674,0.0024103353333333336,0.0024654820000000002,0.0024758366666666671,0.0027635256666666674],"72":[1.2394299999999999e-06,1.2621200000000001e-06,1.2904100000000002e-06,1.2946100000000001e-06,1.2947800000000002e-06,1.3008599999999999e-06,1.3109800000000001e-06,1.31189e-06,1.31363e-06,1.31386e-06,1.31406e-06,1.3269200000000001e-06,1.32734e-06,1.3332500000000001e-06,1.3435599999999999e-06,1.3490699999999999e-06,1.3564800000000001e-06,1.3617400000000001e-06,1.36746e-06,1.3708200000000002e-06],"442368":[0.0097748160000000021,0.0098276824999999988,0.0098507390000000007,0.0099064824999999992,0.0099127699999999996,0.0099638244999999993,0.0099950019999999959,0.01004884,0.010050933499999999,0.0100699615,0.010114624000000001,0.010119586,0.010130801,0.010147318000000002,0.0101812385,0.0102659035,0.010369962,0.010397504,0.012023533500000001,0.0124480015],"147456":[0.0031785044999999993,0.0031825859999999998,0.003184489,0.0031883655,0.0031904955,0.0032123540000000006,0.0032305140000000012,0.0032307360000000001,0.003238084,0.0032652620000000001,0.0032845179999999993,0.0033070759999999991,0.0033529039999999994,0.0033940819999999988,0.0034927735,0.0035245085000000002,0.003532131,0.0035619360000000017,0.0036253195000000003,0.0038756634999999998],"4456448":[0.21692842199999995,0.217255328,0.21725664,0.21764127799999999,0.22006656699999999,0.22162338100000001,0.222047254,0.22236469049999999,0.22322287799999996,0.22418257699999999,0.22427514949999999,0.22506513849999998,0.22638471700000001,0.22642931899999996,0.2266743615,0.22827924150000001,0.23325793550000001,0.23700984450000001,0.237596102,0.24331414950000002],"63488":[0.0012573420000000003,0.0012645342857142854,0.001264631,0.0012681585714285713,0.0012703342857142857,0.001277039,0.0012774287142857141,0.0012774782857142859,0.0012788902857142855,0.001290348,0.001292643,0.0012934944285714284,0.0013003181428571427,0.0013067657142857142,0.001319007857142857,0.001324857,0.0013268759999999996,0.0013417442857142855,0.0013729811666666667,0.0014677939999999995],"38912":[0.0007998730000000001,0.0008040749999999998,0.00080557199999999984,0.00080895499999999977,0.00081115499999999982,0.00081605472727272715,0.00082197481818181792,0.00082523800000000006,0.00083279899999999974,0.00083560200000000007,0.00083941863636363657,0.00084299027272727279,0.00084732718181818186,0.00084796545454545477,0.00084838509090909091,0.00085058681818181838,0.00085481199999999993,0.00085517199999999986,0.00085817700000000022,0.00086231318181818222],"68":[1.21991e-06,1.2290399999999998e-06,1.23321e-06,1.2352099999999999e-06,1.2385400000000001e-06,1.2410000000000001e-06,1.24254e-06,1.2433400000000001e-06,1.2541599999999999e-06,1.25582e-06,1.2578000000000001e-06,1.2586399999999999e-06,1.2636078431372547e-06,1.26609e-06,1.2688900000000002e-06,1.2746499999999999e-06,1.2869300000000001e-06,1.2871299999999999e-06,1.2949099999999999e-06,1.29551e-06],"188416":[0.0044800555000000016,0.0044915275000000001,0.0045496764999999996,0.0045523395000000005,0.0045549969999999999,0.0045678134999999984,0.0045816025000000003,0.0045890059999999996,0.0045899549999999997,0.0046006060000000001,0.0046170754999999997,0.0046303044999999998,0.004632499,0.0047946400000000002,0.004800622,0.0048217440000000011,0.004842313,0.0048663909999999977,0.004910307,0.0049733770000000036],"248":[4.2077142857142855e-06,4.2194800000000003e-06,4.2272700000000006e-06,4.2435699999999999e-06,4.25672e-06,4.2733600000000002e-06,4.2819100000000003e-06,4.2883600000000001e-06,4.3027820512820517e-06,4.3029699999999997e-06,4.3209999999999998e-06,4.3254699999999999e-06,4.33046e-06,4.3425700000000002e-06,4.3451000000000001e-06,4.34649e-06,4.4443800000000005e-06,4.4535100000000005e-06,4.5131500000000001e-06,4.6480299999999998e-06],"80":[1.4098e-06,1.4102400000000001e-06,1.4196200000000001e-06,1.4287499999999999e-06,1.4318999999999998e-06,1.44017e-06,1.4547599999999998e-06,1.4578599999999998e-06,1.4808599999999998e-06,1.4843600000000001e-06,1.4856499999999999e-06,1.50573e-06,1.5060000000000001e-06,1.50605e-06,1.5090899999999998e-06,1.5139199999999999e-06,1.5170499999999999e-06,1.5194000000000002e-06,1.548e-06,1.58228e-06],"2560":[4.9172000000000003e-05,4.9367999999999999e-05,5.0084999999999999e-05,5.0125600000000007e-05,5.0868000000000002e-05,5.0960808988764047e-05,5.1205033707865169e-05,5.1583569999999996e-05,5.1762759999999996e-05,5.1962999999999997e-05,5.2322380000000004e-05,5.250869e-05,5.28782530120482e-05,5.3027800000000001e-05,5.3210030000000003e-05,5.3909000000000002e-05,5.4100809999999996e-05,5.4115060975609754e-05,5.4598999999999997e-05,6.1549960000000003e-05],"34816":[0.00067697000000000037,0.000694822,0.00070160100000000026,0.00070606,0.00070608569230769225,0.00071224485714285724,0.0007127469999999999,0.00071523269230769208,0.00071702223076923065,0.00071806761538461519,0.00071945123076923062,0.0007210224615384614,0.0007229230000000001,0.00072877246153846167,0.00072897699999999979,0.0007295936153846154,0.00073000307692307708,0.00073145515384615369,0.00074325330769230754,0.00081204499999999995],"3712":[6.51415e-05,6.7772499999999995e-05,6.806077777777778e-05,6.8164536585365855e-05,6.8779499999999994e-05,6.8916868421052627e-05,6.8964190476190483e-05,6.9044099999999992e-05,6.950006976744186e-05,6.9586559999999993e-05,6.9705850000000003e-05,6.9891650000000004e-05,6.9919214285714287e-05,6.9965319999999994e-05,7.1010714285714289e-05,7.1143819999999996e-05,7.1443411764705883e-05,7.1765159999999999e-05,7.6611210000000003e-05,7.9498539999999987e-05],"3538944":[0.160242316,0.16035942749999998,0.16046480900000001,0.160541818,0.160605004,0.1609633245,0.16243443999999996,0.16261695400000001,0.162671651,0.163037934,0.16405814799999999,0.16417971249999999,0.16418405950000001,0.16542053649999999,0.16604070900000001,0.16639780700000001,0.166877519,0.17096463350000002,0.17217757349999999,0.17571486550000001],"76":[1.34321e-06,1.3483399999999999e-06,1.3647400000000001e-06,1.3766300000000001e-06,1.37701e-06,1.37715e-06,1.378034090909091e-06,1.39748e-06,1.3980100000000001e-06,1.39985e-06,1.4001000000000002e-06,1.4013499999999999e-06,1.4025900000000001e-06,1.41345e-06,1.4169000000000001e-06,1.42993e-06,1.4404199999999999e-06,1.45242e-06,1.4809299999999999e-06,1.5268299999999999e-06],"4194304":[0.19922901500000001,0.20206171649999999,0.20217744500000001,0.20297467349999998,0.203725296,0.203870301,0.2040461865,0.20461333050000002,0.20461715699999999,0.20493425400000001,0.20517580099999999,0.20629428750000001,0.20689291100000001,0.20793968799999996,0.20842616799999999,0.208640568,0.20952973799999999,0.21295889000000001,0.21483593100000001,0.224113801],"851968":[0.021944120000000011,0.021970893499999998,0.022338973500000005,0.0223399385,0.022465613499999999,0.022627935999999998,0.022927698,0.023051091000000006,0.023157463,0.023211511000000001,0.023506120499999998,0.024184180499999992,0.024299262500000002,0.025142882999999994,0.025690124000000002,0.025932113999999989,0.026119354499999997,0.027437991500000002,0.027831455999999994,0.029924369999999999],"4096":[7.7368217391304348e-05,7.7416999999999994e-05,7.7535999999999998e-05,7.7589999999999994e-05,7.777107999999999e-05,7.8110999999999998e-05,7.8256000000000004e-05,7.8300999999999995e-05,7.8747333333333331e-05,7.8884850000000004e-05,7.9079000000000006e-05,7.9202999999999994e-05,7.9393000000000004e-05,7.9462319999999988e-05,7.9492000000000004e-05,7.9675119999999993e-05,8.0105190000000006e-05,8.1279045454545461e-05,8.2272000000000001e-05,8.2413780000000012e-05],"59392":[0.0011258080000000001,0.0011427338749999999,0.0011434919999999999,0.0011554318750000001,0.0011587297499999999,0.0011601253750000004,0.0011631079999999999,0.001165915,0.0011659729999999994,0.0011740098750000001,0.0011743038571428569,0.0011828455,0.0011831419999999999,0.001186421,0.0011873459999999999,0.0011989030000000001,0.001200303,0.0012015318571428567,0.0012090737142857147,0.0012529465714285711],"84":[1.46452e-06,1.4782700000000001e-06,1.4990899999999999e-06,1.4995100000000001e-06,1.5013900000000001e-06,1.5215000000000002e-06,1.5227099999999999e-06,1.5258000000000001e-06,1.5265900000000001e-06,1.53524e-06,1.53762e-06,1.5487300000000001e-06,1.55429e-06,1.5697500000000001e-06,1.5921199999999999e-06,1.6556099999999999e-06,1.7823900000000002e-06,1.7830900000000001e-06,1.7873199999999999e-06,1.8483200000000001e-06],"3276800":[0.14267692400000001,0.143759425,0.14450133900000001,0.14468110699999998,0.14569485200000001,0.14571488599999999,0.14612302999999999,0.146448836,0.14648577299999999,0.146491068,0.14730132400000001,0.148139509,0.14873634499999999,0.14896226000000001,0.14900490899999999,0.14910721099999999,0.14954499700000001,0.15270150499999999,0.15582946650000001,0.15936467250000003],"55296":[0.0010499420000000001,0.001050933,0.0010519729999999999,0.0010567641111111112,0.0010597600000000001,0.001067374875,0.0010687229999999999,0.0010704047500000005,0.0010712275555555552,0.001075262,0.0010774299999999999,0.0010777919999999999,0.0010819291250000001,0.0010820012500000001,0.001098482,0.001101618,0.001113330125,0.0011236619999999999,0.001123848,0.0012275470000000001],"688128":[0.0174089365,0.0175901155,0.017714820499999999,0.017777241999999999,0.017816326,0.017855477000000002,0.017938659500000006,0.018011422500000009,0.01802627,0.018056916999999999,0.018099980499999994,0.018270795999999999,0.018335612500000001,0.018429705499999994,0.01851802650000001,0.0189226955,0.019320633,0.0195916005,0.019620603,0.022817452999999994],"8192":[0.000153502,0.00015472199999999999,0.00015481612500000005,0.000155103,0.0001559965,0.00015625200000000001,0.00015650700000000001,0.00015667200000000001,0.000157143,0.000157341,0.00015892928301886795,0.000159023,0.0001597497068965517,0.00016034799999999999,0.00016080949999999999,0.00016112058620689658,0.00016145566666666666,0.00016440199999999999,0.000165026,0.00016516214035087722],"10240":[0.0002025645,0.00020583,0.00020681699999999998,0.00020766900000000001,0.00020775200000000001,0.000208042,0.000211399,0.00021629445,0.00021653686956521739,0.00021681000000000001,0.00021699379545454543,0.00021738481818181819,0.00021790899999999999,0.000217977,0.00021892299999999994,0.000219714,0.00021998904651162783,0.00022621665116279071,0.000240361,0.00024132017499999998],"15872":[0.00028969600000000015,0.00028999200000000009,0.00030145675000000001,0.00030449400000000015,0.00030803562068965523,0.00030853799999999986,0.00030925199999999999,0.0003097869999999999,0.00031073200000000009,0.00031232616129032265,0.00031284770967741926,0.00031646816666666667,0.00031672500000000007,0.000319654,0.000320353,0.00032498646666666666,0.00033110600000000001,0.000335922,0.00033977278571428575,0.00035185199999999994],"92":[1.61089e-06,1.6257500000000001e-06,1.62653e-06,1.6289e-06,1.63368e-06,1.6337000000000001e-06,1.63414e-06,1.64172e-06,1.6502699999999999e-06,1.6522999999999998e-06,1.6630500000000001e-06,1.6665399999999999e-06,1.6781099999999999e-06,1.6834400000000001e-06,1.6846900000000001e-06,1.68557e-06,1.6945099999999999e-06,1.7060299999999998e-06,1.7064099999999999e-06,1.7796399999999999e-06],"26624":[0.0004727079999999998,0.000476732,0.00047965699999999998,0.00048631847368421058,0.00049074000000000003,0.00049093099999999979,0.00049101665000000016,0.00049119099999999998,0.00049352800000000024,0.00049364461111111116,0.00049567529999999999,0.00049588699999999998,0.0004969265882352941,0.00049799600000000001,0.00050026436842105261,0.0005041729999999998,0.00051163955555555537,0.000514212,0.000514969,0.00053324555555555556],"1792":[3.0177999999999998e-05,3.0443999999999999e-05,3.0848749999999998e-05,3.1540093023255812e-05,3.1653399999999997e-05,3.1919837209302329e-05,3.2014660000000001e-05,3.2327499999999998e-05,3.2412000000000001e-05,3.2497019999999999e-05,3.2762782608695652e-05,3.2877840000000002e-05,3.2942499999999998e-05,3.3236099999999998e-05,3.3294022988505749e-05,3.3318572916666665e-05,3.3392999999999997e-05,3.3428943181818182e-05,3.3941333333333333e-05,3.3962480000000004e-05],"11776":[0.00024773200000000002,0.00024847599999999992,0.00024965399999999998,0.0002504190000000001,0.00025102799999999993,0.00025482599999999999,0.00025689450000000003,0.00025742266666666668,0.00025950099999999998,0.00026110099999999991,0.00026159299999999996,0.00026185,0.00026188999999999992,0.0002625367368421053,0.00026266000000000001,0.0002628510571428571,0.00026524999999999986,0.00026835282857142861,0.00027302219444444431,0.00028807894117647062],"2944":[5.9731999999999997e-05,6.1144500000000004e-05,6.2990540000000002e-05,6.3248795454545455e-05,6.3946580000000001e-05,6.4018872727272729e-05,6.413972222222223e-05,6.4144277777777777e-05,6.4215579999999994e-05,6.4410000000000002e-05,6.4526519999999994e-05,6.4746839999999998e-05,6.4842479999999993e-05,6.5093090000000001e-05,6.5530469999999997e-05,6.5578420000000004e-05,6.6275939999999996e-05,6.6402910000000002e-05,6.6966170212765956e-05,7.0491292682926831e-05],"88":[1.5472199999999999e-06,1.56601e-06,1.5672799999999999e-06,1.57164e-06,1.5760099999999999e-06,1.58252e-06,1.5837499999999999e-06,1.59181e-06,1.60245e-06,1.6151428571428571e-06,1.62883e-06,1.6317099999999998e-06,1.64047e-06,1.6407800000000001e-06,1.6428800000000001e-06,1.6475900000000001e-06,1.6739899999999999e-06,1.69607e-06,1.7180599999999999e-06,1.8615099999999999e-06],"22528":[0.00046809199999999998,0.00047285900000000028,0.00047661400000000004,0.000483074,0.000484372,0.000487116,0.00048822252631578936,0.00048987526315789475,0.00049173700000000001,0.00049402000000000018,0.00049538673684210535,0.00049574005263157905,0.00049792099999999991,0.00049797600000000023,0.00050036700000000004,0.00050169231578947354,0.00050177568421052644,0.00050603305263157892,0.00051354657894736784,0.00052182215789473669],"1245184":[0.039072862999999999,0.039129489000000003,0.039202358999999985,0.039318270000000002,0.039622301000000013,0.039702850999999997,0.040207031000000004,0.040354326999999982,0.0404384115,0.040714192000000003,0.040922521499999989,0.041614852000000029,0.041798124499999985,0.044410702999999996,0.045284807999999989,0.046081614,0.04612488250000002,0.046712644000000018,0.048203032,0.048777516],"15728640":[0.94817181949999996,0.95255939199999995,0.95334532299999997,0.95630441600000005,0.956851173,0.95833602699999998,0.960328301,0.96095334450000003,0.96128173650000004,0.96358305600000005,0.9644238825,0.97245627550000002,0.97714955999999997,0.98033757649999997,0.98645081950000002,0.98897047049999998,0.99161264449999997,1.0104234185000001,1.024457382,1.066323862],"96":[1.6492500000000001e-06,1.66926e-06,1.68705e-06,1.6894399999999999e-06,1.7051100000000001e-06,1.7074200000000001e-06,1.7207299999999999e-06,1.7291999999999999e-06,1.7330000000000002e-06,1.7367399999999999e-06,1.7391e-06,1.74355e-06,1.7652100000000001e-06,1.7740099999999999e-06,1.77718e-06,1.7902400000000001e-06,1.8066100000000001e-06,1.81804e-06,1.8480600000000001e-06,1.86181e-06],"1984":[3.4582000000000002e-05,3.5463999999999998e-05,3.5950632352941175e-05,3.6358150000000004e-05,3.6447874999999999e-05,3.6461000000000002e-05,3.6486134328358206e-05,3.6497110000000001e-05,3.6685900000000001e-05,3.6981966101694918e-05,3.7053425925925923e-05,3.7108969999999998e-05,3.7110979999999996e-05,3.7218739999999999e-05,3.7304949999999999e-05,3.7531560000000002e-05,3.7545999999999996e-05,3.7917080000000002e-05,3.8021390000000001e-05,4.084985e-05],"139264":[0.0029713533333333335,0.0029972283333333338,0.0030161646666666663,0.0030235133333333343,0.0030279316666666665,0.003029136,0.0030309960000000002,0.0030358380000000008,0.0030429283333333335,0.0030474670000000003,0.0030756190000000008,0.0031051149999999999,0.0031187546666666668,0.003128030999999999,0.0031571370000000008,0.0032501980000000001,0.0032737464999999999,0.0033859275000000001,0.0034463025000000002,0.0037029039999999991],"475136":[0.010700694,0.010770485,0.010793916000000001,0.010834131000000025,0.0108531085,0.010937327,0.010959031499999997,0.01097008100000002,0.010971708,0.010975528,0.010985057499999997,0.011107685000000001,0.011117856000000001,0.0111412345,0.011181127499999999,0.011200205,0.0113145925,0.011336414,0.011470847499999999,0.011574250999999999],"13631488":[0.76355803600000005,0.76737227200000002,0.77917415749999996,0.78034130200000007,0.78402171249999997,0.78567674850000002,0.78620447900000001,0.790289676,0.79233401850000007,0.80170782200000001,0.80354770249999996,0.80356202099999996,0.8054914285,0.81085717000000002,0.81175087850000005,0.814692639,0.81771488800000003,0.81848292850000004,0.821558232,0.83175089499999999],"416":[6.8832400000000007e-06,6.9352300000000005e-06,7.0207200000000001e-06,7.0532699999999995e-06,7.070769230769231e-06,7.0912e-06,7.1197299999999993e-06,7.2725500000000004e-06,7.3739200000000004e-06,7.3753200000000009e-06,7.3812699999999995e-06,7.39692e-06,7.4030899999999996e-06,7.4297500000000003e-06,7.4301199999999999e-06,7.47101e-06,7.4889399999999998e-06,7.7633200000000004e-06,8.1724900000000011e-06,8.4124900000000005e-06],"928":[1.61535e-05,1.6263089999999999e-05,1.627414e-05,1.6393490000000001e-05,1.641528e-05,1.6440910000000001e-05,1.653607e-05,1.655844e-05,1.6669819999999999e-05,1.6670629629629631e-05,1.6805439999999999e-05,1.6830219999999998e-05,1.6880000000000001e-05,1.6947240000000002e-05,1.6962489999999998e-05,1.6985209999999999e-05,1.7232409999999999e-05,1.7257069999999999e-05,1.7529803921568629e-05,1.7858000000000001e-05],"512":[8.7602173913043471e-06,8.7972424242424242e-06,8.9539999999999993e-06,9.0647499999999999e-06,9.1069400000000003e-06,9.1147999999999995e-06,9.1565699999999993e-06,9.1791800000000004e-06,9.2063181818181814e-06,9.2689300000000007e-06,9.3504299999999999e-06,9.3621199999999994e-06,9.3777407407407405e-06,9.4548800000000002e-06,9.53312e-06,9.6458100000000007e-06,9.6882699999999997e-06,9.7423300000000003e-06,9.8299499999999989e-06,9.8933299999999993e-06],"18432":[0.000363665,0.00036384600000000003,0.00036680100000000004,0.00037124100000000002,0.00037205699999999997,0.00037321400000000008,0.00037488170833333326,0.00037673300000000008,0.00037683399999999999,0.00037838700000000016,0.00037875699999999997,0.0003789650000000001,0.00037909970833333327,0.00038180547826086953,0.00038428524000000001,0.00038520252173913038,0.000387539,0.00039542952000000002,0.00040994600000000012,0.00042457765217391289],"16777216":[1.0076535950000001,1.0167413810000001,1.0262324764999999,1.0273306025,1.0300533590000001,1.031268219,1.0321106879999999,1.0359597599999999,1.0382074290000001,1.038723896,1.0422447005,1.0438392624999999,1.0475197485000001,1.0480858135,1.0519266009999999,1.0520348770000001,1.0591100035000001,1.081870179,1.1047686605,1.1759908985],"9728":[0.00019058399999999999,0.00019366500000000009,0.00019478950000000002,0.00019511599999999998,0.00019586500000000001,0.0001976255,0.00019805349999999994,0.00019875750000000002,0.0002001487142857143,0.00020044516326530619,0.0002008,0.00020300954347826083,0.00020323500000000002,0.000203962,0.00020431300000000002,0.00020686026086956513,0.00020884504255319148,0.0002112649130434783,0.00021301300000000002,0.00021525399999999993],"1769472":[0.067595928999999999,0.069310143000000018,0.06954446849999997,0.069605928499999997,0.069792543499999998,0.070309584499999953,0.070317109999999988,0.070506260999999973,0.070796524999999999,0.070815211000000031,0.070911230500000033,0.071064737500000003,0.072126153499999984,0.072480140499999998,0.073622592000000014,0.074299340500000005,0.074414110000000006,0.076414598,0.076963465500000022,0.077790927500000023],"1703936":[0.064582238,0.065152599500000033,0.065195165999999999,0.06549278599999997,0.066195817500000004,0.066373916500000019,0.066488910999999984,0.066863082000000004,0.067548191499999979,0.067724481499999961,0.067976435499999988,0.068538185499999987,0.069124435499999998,0.069275476999999988,0.06931175349999999,0.070032786000000041,0.070754681999999999,0.072227164499999996,0.073119547500000007,0.075982301000000002],"2048":[3.6507000000000001e-05,3.6850999999999997e-05,3.7117999999999999e-05,3.7355859649122805e-05,3.7802999999999997e-05,3.7946121951219514e-05,3.8010409999999998e-05,3.8058490000000001e-05,3.8075055555555555e-05,3.8132e-05,3.8419080000000005e-05,3.8545559999999996e-05,3.8647599999999999e-05,3.8868029999999997e-05,3.9020999999999998e-05,3.9082580000000003e-05,3.9362340000000004e-05,4.0001729166666668e-05,4.0288759999999997e-05,4.0310702127659573e-05],"14336":[0.000253601,0.00025372899999999996,0.00026003350000000002,0.00026074300000000002,0.00026104200000000012,0.00026204100000000002,0.00026265299999999995,0.00026370299999999984,0.00026638835714285712,0.000266746,0.00026848255882352929,0.00026967808333333332,0.00027068000000000014,0.00027190952777777778,0.00027402949999999991,0.00027747200000000007,0.00027807102857142866,0.00027881100000000001,0.00027996999999999994,0.00028853850000000014],"448":[7.5365476190476191e-06,7.537e-06,7.5370199999999997e-06,7.5647333333333332e-06,7.5887599999999998e-06,7.6309399999999995e-06,7.6775714285714289e-06,7.6982300000000007e-06,7.7284200000000001e-06,7.7733800000000011e-06,7.8436599999999997e-06,7.9081599999999988e-06,7.9679299999999991e-06,8.0734999999999999e-06,8.1016599999999996e-06,8.1099000000000001e-06,8.1105499999999998e-06,8.1810800000000006e-06,8.3347899999999995e-06,8.4015900000000003e-06],"5505024":[0.30586692900000001,0.30785467049999998,0.30800051449999999,0.30923620299999999,0.30950826100000001,0.30991365849999997,0.31041620950000004,0.31053974000000001,0.31120923700000003,0.31153271649999997,0.31263837150000001,0.31472842649999999,0.31489195650000001,0.31537849400000001,0.31653562699999999,0.31730177599999998,0.31756319099999997,0.31797617449999999,0.31860414199999998,0.32825654599999998],"544":[9.4601100000000001e-06,9.468569999999999e-06,9.5774799999999997e-06,9.5950000000000005e-06,9.6390000000000004e-06,9.6463333333333329e-06,9.732649999999999e-06,9.7436699999999992e-06,9.8090099999999994e-06,9.8319300000000002e-06,9.8430500000000006e-06,9.9054099999999991e-06,1.0023849999999999e-05,1.0045209999999999e-05,1.0132400000000001e-05,1.014894e-05,1.0227999999999999e-05,1.027605e-05,1.0416789999999999e-05,1.0636499999999999e-05],"221184":[0.0045373914999999997,0.0045772460000000001,0.0045912140000000014,0.0046137185000000016,0.0046329679999999986,0.0046499215000000002,0.0046926770000000019,0.0047198069999999986,0.0047199165,0.004790234,0.0050167340000000001,0.0051163959999999996,0.0052569519999999996,0.005272070999999998,0.0052942019999999996,0.0053364480000000023,0.0053895840000000011,0.0053942399999999998,0.0055047519999999999,0.005752671],"90112":[0.0019990477500000008,0.0020018725000000002,0.00201197675,0.0020144200000000003,0.0020159639999999999,0.0020277249999999998,0.00202981975,0.002032463,0.0020357963333333335,0.0020409892499999999,0.0020427157500000001,0.0020441227499999998,0.0020627567499999994,0.0020770580000000001,0.0020807865,0.0020841099999999997,0.0020932860000000002,0.0021299560000000001,0.0021442140000000006,0.0022174339999999999],"640":[1.1323621621621622e-05,1.1546736842105263e-05,1.1612519999999999e-05,1.1670666666666668e-05,1.1672699999999999e-05,1.1751010000000001e-05,1.1771444444444444e-05,1.179839e-05,1.1882049999999999e-05,1.1986729999999999e-05,1.2018680000000001e-05,1.2107800000000001e-05,1.2108340425531914e-05,1.2203669999999999e-05,1.2230859999999999e-05,1.2276889999999999e-05,1.2300700000000001e-05,1.2347409999999999e-05,1.2421e-05,1.2903789999999999e-05],"12800":[0.0002194965000000001,0.00022720179999999998,0.000228641,0.00022875399999999999,0.00022919149999999999,0.000229502,0.00022964799999999999,0.00023013800000000001,0.00023019066666666666,0.0002310263,0.00023331183333333326,0.00023414119047619031,0.00023547135000000002,0.000235923725,0.00023599433333333338,0.00023654720512820501,0.00023838192499999996,0.00024088410256410255,0.00024235700000000006,0.00024964703030303035],"262144":[0.0056408299999999977,0.0056794250000000001,0.0056992890000000006,0.0057093249999999986,0.005726021999999999,0.005730092,0.0057457759999999984,0.0057594650000000001,0.0057626880000000002,0.0057664700000000001,0.0057958020000000001,0.0058448230000000025,0.0058814639999999986,0.006142598,0.0062296310000000002,0.0062469350000000003,0.0062640639999999997,0.0066642709999999994,0.006771165,0.0070362480000000201],"589824":[0.014386075999999998,0.0143952245,0.014411413,0.0144993555,0.014583884,0.014636385,0.014732378499999999,0.014756001499999996,0.014810466999999999,0.014943303999999996,0.0149893905,0.015027618,0.0151090845,0.0151802445,0.015190407499999999,0.015651957500000001,0.016182965000000001,0.017066149999999999,0.018055660000000001,0.018284733000000001],"884736":[0.023024057000000004,0.023123732000000001,0.023278027999999999,0.023293455000000012,0.023443038500000006,0.023576852999999995,0.023697367,0.0237028785,0.023968859999999998,0.024151125499999999,0.024191794500000002,0.025048243500000001,0.026295212000000002,0.026636752499999999,0.027292406500000012,0.027715266499999992,0.0292074025,0.030437339000000018,0.030810096000000009,0.032095726000000012],"6144":[0.00012922199999999999,0.000129741,0.00013151299999999993,0.00013174114285714286,0.00013275560000000001,0.00013389400000000004,0.0001345570000000001,0.00013527,0.000135983,0.00013632300000000004,0.00013667099999999997,0.00013757728169014089,0.00013773572463768123,0.00013824600000000002,0.00013882400000000001,0.00013969349999999999,0.00014193700000000007,0.00015102837500000004,0.000152237,0.00015253899999999993],"1088":[1.931e-05,1.9894e-05,1.9939750000000002e-05,2.005156e-05,2.0092989999999998e-05,2.0120780000000001e-05,2.0127489999999999e-05,2.0174e-05,2.0239999999999999e-05,2.0274700000000001e-05,2.0337773333333333e-05,2.0343729999999998e-05,2.0420907894736842e-05,2.0680859999999998e-05,2.086217e-05,2.094258e-05,2.1363960000000001e-05,2.1394516666666667e-05,2.1524019999999997e-05,2.3106200000000002e-05],"576":[1.0059833333333333e-05,1.0231750000000001e-05,1.0334020000000001e-05,1.0369489999999999e-05,1.0433930000000001e-05,1.0435579999999999e-05,1.048463e-05,1.054391e-05,1.055462e-05,1.0573150000000001e-05,1.0577000000000001e-05,1.060874e-05,1.062463e-05,1.0641400000000001e-05,1.087204e-05,1.0909750000000002e-05,1.113506e-05,1.125362e-05,1.131825e-05,1.2079969999999999e-05],"160":[2.74764e-06,2.7601500000000002e-06,2.7827800000000001e-06,2.7870299999999997e-06,2.7946600000000003e-06,2.7985100000000002e-06,2.8134600000000004e-06,2.81748e-06,2.8209899999999999e-06,2.8239799999999999e-06,2.83006e-06,2.8391874999999998e-06,2.8395999999999999e-06,2.8402800000000004e-06,2.8599700000000002e-06,2.88927e-06,2.8936699999999999e-06,2.9220599999999997e-06,2.9935999999999996e-06,3.0105600000000002e-06],"672":[1.2041999999999999e-05,1.2189500000000001e-05,1.2306999999999999e-05,1.2343420000000001e-05,1.2527269999999999e-05,1.2554129999999999e-05,1.26943e-05,1.2752070000000001e-05,1.27655e-05,1.2768149999999999e-05,1.2847869999999999e-05,1.286484e-05,1.2872859999999999e-05,1.2887969999999999e-05,1.2901270000000001e-05,1.297238e-05,1.3011839999999999e-05,1.3171669999999999e-05,1.3221909999999999e-05,1.352657e-05],"8912896":[0.51699558749999996,0.51745481849999997,0.51757961949999998,0.51803740300000001,0.51879698299999999,0.52274641200000005,0.52283550050000005,0.52343861749999998,0.52494924549999999,0.52507088700000004,0.527185558,0.52959614799999999,0.530754689,0.53113613599999998,0.53183658499999997,0.53214145400000001,0.53230873300000003,0.53610293099999995,0.53973201149999994,0.546779974],"100":[1.70227e-06,1.70941e-06,1.7107200000000001e-06,1.7162199999999999e-06,1.74108e-06,1.74721e-06,1.7667599999999999e-06,1.7675699999999998e-06,1.7755900000000001e-06,1.77916e-06,1.78703e-06,1.7893299999999999e-06,1.7895000000000002e-06,1.78999e-06,1.7979500000000001e-06,1.8086600000000001e-06,1.8094100000000001e-06,1.8259099999999998e-06,1.8442099999999999e-06,1.9274500000000001e-06],"507904":[0.0118251925,0.011829325999999999,0.011893013500000004,0.011898641999999999,0.011935340499999999,0.01195389,0.011976169,0.012027292,0.0120345685,0.012092623,0.012104878999999999,0.012169694999999998,0.0122141495,0.012215033,0.012255713,0.012280778500000001,0.012422289999999999,0.0132178035,0.01360016,0.013727864500000001],"3840":[6.7621999999999997e-05,6.7732999999999997e-05,6.8643e-05,7.0704999999999995e-05,7.1347999999999995e-05,7.1637000000000005e-05,7.1866000000000006e-05,7.1920314285714291e-05,7.2388749999999997e-05,7.280783e-05,7.2906794117647057e-05,7.3009639999999996e-05,7.3059379999999992e-05,7.3270999999999997e-05,7.3391848484848478e-05,7.3993090000000001e-05,7.5269000000000001e-05,7.5363709999999999e-05,7.6139299999999991e-05,8.1371000000000004e-05],"192":[3.33591e-06,3.3745957446808511e-06,3.3826800000000001e-06,3.4000099999999999e-06,3.4142899999999998e-06,3.4188499999999999e-06,3.4196999999999996e-06,3.4275599999999998e-06,3.4313799999999997e-06,3.45046e-06,3.4632800000000002e-06,3.4757400000000003e-06,3.4904222222222221e-06,3.5226500000000001e-06,3.52857e-06,3.5374600000000002e-06,3.5884100000000001e-06,3.65174e-06,3.7740099999999996e-06,3.8429000000000001e-06],"376832":[0.009197130000000003,0.009239246999999999,0.0092456150000000004,0.0092600649999999996,0.0094075110000000038,0.009408910000000003,0.0094379220000000048,0.0094489479999999952,0.0096013069999999999,0.009602030000000001,0.0096635815000000007,0.0098438659999999997,0.009915384499999999,0.010009654,0.010107039,0.010159897500000001,0.010241007,0.010301419000000001,0.010405718499999998,0.011779018],"98304":[0.0022844780000000008,0.0022936219999999999,0.0022985180000000003,0.0023038679999999993,0.0023056805000000002,0.0023086390000000004,0.0023144350000000001,0.0023151159999999999,0.0023163295,0.0023213265,0.0023344715,0.00234055125,0.0023516545000000001,0.0023545620000000006,0.0023648429999999993,0.0023784825000000001,0.0023896760000000007,0.0023939250000000007,0.00244315125,0.0025129689999999999],"5376":[0.000108928,0.00011018833333333329,0.00011040944444444443,0.00011050799999999997,0.00011122291250000001,0.00011146775000000001,0.000111632,0.00011213666666666669,0.00011226950000000004,0.00011243533333333336,0.000114425,0.00011454265000000001,0.00011457730232558138,0.00011527569512195121,0.0001156646049382717,0.00011830875,0.00011978508641975309,0.000120596,0.00012679250000000001,0.00012721676388888887],"94208":[0.0021162489999999989,0.0021214755,0.0021297457499999998,0.0021304170000000003,0.0021343224999999999,0.00215912,0.0021601642499999999,0.0021602909999999999,0.00216176075,0.00217067575,0.002173894,0.0021803812499999998,0.0021804132499999998,0.0021813542499999998,0.0022148929999999999,0.0022179109999999999,0.0022361035000000007,0.0022394585000000016,0.0022482960000000099,0.0022832237500000001],"81920":[0.0017703922,0.0017791386,0.0017813459999999992,0.001782384599999999,0.0017831722,0.0017873358,0.0017880090000000001,0.0017880210000000001,0.0017892042,0.0017915528000000008,0.0017951924000000001,0.0018071253999999998,0.001810362,0.0018144758000000008,0.0018146511999999997,0.0018285810000000006,0.0018295765999999998,0.0018615355999999999,0.0018707939999999998,0.001885046],"3407872":[0.149364569,0.14954176499999999,0.150266963,0.15200904500000001,0.152913825,0.15361002699999998,0.15376993799999999,0.15487240999999999,0.15496855700000001,0.15506087499999999,0.15550912400000005,0.15672276499999999,0.156807374,0.1571974495,0.157551039,0.15820365,0.16149587200000001,0.16564953900000001,0.1678912515,0.16859051050000001],"104":[1.7415900000000001e-06,1.7773600000000001e-06,1.7857300000000001e-06,1.8027000000000001e-06,1.8038099999999998e-06,1.8056699999999999e-06,1.8111700000000001e-06,1.81494e-06,1.81951e-06,1.8209199999999999e-06,1.82663e-06,1.8299200000000002e-06,1.83341e-06,1.8429800000000001e-06,1.8525499999999999e-06,1.85401e-06,1.8689199999999999e-06,1.8878899999999999e-06,1.8976700000000001e-06,2.0149599999999999e-06],"122880":[0.002504432,0.0025347426666666672,0.0025369146666666667,0.0025389293333333324,0.0025497703333333334,0.0025502246666666661,0.0025569016666666666,0.002571064666666666,0.0025747626666666667,0.0025878243333333339,0.0025925370000000002,0.0026184153333333338,0.002627884,0.0026358280000000002,0.0027230293333333328,0.0028134586666666668,0.0028437429999999997,0.0028516736666666662,0.002869478,0.0029124029999999996],"200":[3.3181500000000002e-06,3.3370300000000004e-06,3.3459800000000001e-06,3.3505399999999998e-06,3.3536299999999999e-06,3.3868100000000002e-06,3.3918599999999998e-06,3.3971000000000001e-06,3.4107799999999999e-06,3.4309199999999998e-06,3.44664e-06,3.4690300000000001e-06,3.4717599999999997e-06,3.4809799999999997e-06,3.5030599999999997e-06,3.5337900000000001e-06,3.5370300000000002e-06,3.6112700000000001e-06,3.6999899999999999e-06,3.98052e-06],"163840":[0.003723446,0.0037251770000000005,0.0037404129999999993,0.0037614720000000027,0.0037621429999999999,0.003763508,0.0037832564999999998,0.0038432824999999988,0.0038492115000000001,0.003885585,0.0039176540000000004,0.0039474869999999978,0.0039477100000000001,0.0039612164999999998,0.0040859930000000004,0.004102807,0.0041143544999999986,0.0041690909999999998,0.004208542,0.0042651110000000002],"4063232":[0.19293528800000001,0.19486440099999999,0.19497145100000002,0.19500203299999999,0.195212726,0.19614599199999999,0.19638374650000001,0.19804809600000001,0.198094351,0.1983228605,0.19832727,0.19877028199999999,0.19883836399999999,0.19905743200000001,0.19952473700000001,0.20004548600000005,0.20045511800000004,0.206292326,0.20952571650000001,0.213647004],"5767168":[0.32597014150000003,0.328660018,0.33181494899999997,0.33261626350000001,0.3330280585,0.333326862,0.33333487000000001,0.333342203,0.33388176850000001,0.33419385099999999,0.33427671400000003,0.3347120965,0.33476892400000002,0.33572002099999998,0.33668695300000001,0.33943019349999998,0.34518410049999998,0.34654169800000001,0.348975747,0.34997162999999998],"12582912":[0.84085202100000001,0.85131296550000002,0.85205570200000003,0.8525455005,0.85428512200000006,0.85436626700000007,0.85636640900000005,0.85752293850000005,0.8578121205,0.85952941950000006,0.86039987849999999,0.86123116499999997,0.86279893699999999,0.86284970599999999,0.86350493699999997,0.86423092850000005,0.86452489399999999,0.87020991699999994,0.87638628299999999,0.88520912200000001],"1600":[2.703e-05,2.7042e-05,2.7131000000000002e-05,2.7229999999999998e-05,2.793627e-05,2.7999500000000002e-05,2.811164e-05,2.812709e-05,2.8204139999999999e-05,2.8242240000000002e-05,2.8243999999999999e-05,2.8281524999999999e-05,2.830857e-05,2.8334447368421049e-05,2.834923076923077e-05,2.8402400000000001e-05,2.874733e-05,2.8802799999999998e-05,2.900077e-05,2.9407305555555557e-05],"136":[2.3312499999999999e-06,2.3643200000000001e-06,2.3688699999999999e-06,2.3836599999999999e-06,2.3932599999999998e-06,2.4002100000000002e-06,2.402e-06,2.4042199999999999e-06,2.4078200000000002e-06,2.4170100000000002e-06,2.42736e-06,2.4281500000000002e-06,2.4385099999999999e-06,2.4517900000000001e-06,2.4677899999999996e-06,2.4914599999999999e-06,2.4971299999999998e-06,2.5096399999999999e-06,2.5301499999999998e-06,4.3599499999999997e-06],"232":[3.8847000000000003e-06,3.8885000000000001e-06,3.9045999999999999e-06,3.9123900000000002e-06,3.93371e-06,3.9365100000000002e-06,3.9479100000000006e-06,3.97202e-06,3.9962400000000002e-06,4.0202499999999993e-06,4.0239499999999998e-06,4.0364799999999997e-06,4.0395500000000001e-06,4.05116e-06,4.0801000000000001e-06,4.0898139534883716e-06,4.0978899999999995e-06,4.1670099999999999e-06,4.2757040816326534e-06,4.3137200000000004e-06],"7077888":[0.37702614449999999,0.37914017249999998,0.381694019,0.38287457200000002,0.388486371,0.38876046650000001,0.3893455965,0.38974729949999998,0.39076981399999999,0.39123456950000002,0.39241422100000001,0.39260150599999999,0.393118356,0.393164556,0.39367563649999998,0.39404347950000002,0.3957638175,0.39705355799999997,0.40893395450000003,0.40925618050000001],"86016":[0.001887101,0.0019005044000000009,0.001900983399999999,0.0019047790000000001,0.0019048676,0.0019102349999999997,0.0019126123999999999,0.0019168598000000002,0.0019181541999999997,0.0019198476000000006,0.0019230765999999999,0.0019239736,0.0019243707500000002,0.0019255708,0.0019332829999999998,0.0019349903999999999,0.0019523886,0.0019700255,0.0020650110000000011,0.0021614375000000002],"31744":[0.00058781799999999972,0.00059269100000000001,0.00059617199999999996,0.000596175,0.00059734999999999996,0.00060084699999999962,0.0006039569999999998,0.00061747799999999997,0.00061855446666666668,0.00062382900000000001,0.00062737366666666661,0.00063005713333333358,0.00063183399999999974,0.00063243700000000002,0.00063794328571428565,0.00064474999999999971,0.00064650000000000016,0.0006493534,0.000657473,0.00069423978571428577],"168":[2.8695199999999999e-06,2.90507e-06,2.9254099999999998e-06,2.9599599999999998e-06,2.9629999999999998e-06,2.9869899999999997e-06,2.9927600000000001e-06,2.9965e-06,3.0041499999999999e-06,3.0075e-06,3.0141999999999999e-06,3.0143699999999999e-06,3.0382199999999997e-06,3.0474599999999998e-06,3.0606399999999998e-06,3.0622699999999999e-06,3.07852e-06,3.0795300000000003e-06,3.0890500000000001e-06,3.2059200000000002e-06],"622592":[0.015365693,0.015442223999999999,0.0155207075,0.015628358500000009,0.0156965825,0.015700281,0.015742001500000009,0.0157607515,0.015902438499999994,0.015909593499999999,0.015935414500000005,0.015968900500000001,0.016040166000000005,0.016074950000000001,0.016079949499999989,0.016231196,0.0163092255,0.016678311999999994,0.017730600500000009,0.018039840499999998],"108":[1.83427e-06,1.8428600000000001e-06,1.8630099999999998e-06,1.8653499999999999e-06,1.8670500000000002e-06,1.8790899999999999e-06,1.87925e-06,1.8992900000000001e-06,1.9040300000000001e-06,1.9052033898305085e-06,1.906e-06,1.910506329113924e-06,1.9107600000000002e-06,1.9118399999999999e-06,1.9135499999999997e-06,1.9199700000000003e-06,1.9220899999999999e-06,1.9227299999999998e-06,1.9349899999999998e-06,1.9597099999999999e-06],"327680":[0.007615887,0.007651433,0.007661686999999996,0.0076684370000000002,0.007674803,0.0076940370000000008,0.0077148949999999977,0.0077326030000000002,0.0077335360000000035,0.0077433099999999989,0.0078346059999999992,0.0078524030000000026,0.007892718,0.0081293019999999997,0.0084052949999999967,0.0084306369999999995,0.0084569689999999999,0.0086224500000000003,0.0089341540000000032,0.0090096815],"2176":[3.9168999999999997e-05,4.0545039999999995e-05,4.0704054054054054e-05,4.1029323529411767e-05,4.1197625000000002e-05,4.1298999999999999e-05,4.1448900000000002e-05,4.1606588235294114e-05,4.1623459999999996e-05,4.168967e-05,4.1851285714285716e-05,4.1960859999999997e-05,4.1997718749999999e-05,4.2079040000000004e-05,4.2282939999999997e-05,4.2398039999999999e-05,4.2763569999999996e-05,4.3020639999999941e-05,4.3489419999999999e-05,4.3973000000000001e-05],"3328":[5.7036500000000002e-05,5.7460999999999998e-05,5.8965000000000002e-05,5.9160999999999998e-05,5.9217999999999994e-05,5.9434967741935483e-05,5.9510709999999993e-05,5.9643049180327872e-05,6.0343109999999996e-05,6.0409579999999997e-05,6.0833310344827587e-05,6.1000910000000001e-05,6.1418030000000003e-05,6.1851724137931043e-05,6.1944389830508465e-05,6.1971769999999993e-05,6.2059779999999997e-05,6.2291859999999996e-05,6.2507899999999998e-05,6.3873000000000003e-05],"1":[1.6985999999999999e-07,1.7007000000000001e-07,1.7020999999999999e-07,1.7048e-07,1.7087000000000002e-07,1.7088000000000001e-07,1.7095000000000001e-07,1.7107999999999999e-07,1.7129000000000002e-07,1.7189000000000001e-07,1.7212000000000001e-07,1.7217000000000001e-07,1.7583000000000001e-07,1.7767999999999999e-07,1.7986999999999998e-07,1.7999000000000001e-07,1.8053000000000002e-07,1.8706000000000001e-07,1.8760000000000001e-07,2.0264000000000002e-07],"2":[1.8322e-07,1.8355e-07,1.8425999999999998e-07,1.8434999999999998e-07,1.8473000000000001e-07,1.8488999999999998e-07,1.8493999999999999e-07,1.8504000000000002e-07,1.8508999999999997e-07,1.8519999999999999e-07,1.8523e-07,1.8536000000000001e-07,1.8539999999999998e-07,1.8544999999999998e-07,1.8558e-07,1.8603000000000001e-07,1.8698999999999998e-07,1.8725000000000001e-07,1.9219e-07,1.9420000000000001e-07],"3":[1.9779000000000003e-07,1.9792999999999997e-07,1.9847e-07,1.9882e-07,1.9914e-07,1.9930000000000002e-07,1.9954e-07,1.9958000000000002e-07,1.9976999999999999e-07,2.0022e-07,2.0068000000000002e-07,2.0092e-07,2.0095000000000001e-07,2.0101e-07,2.0102000000000001e-07,2.0134e-07,2.0241000000000002e-07,2.0665999999999997e-07,2.0902999999999999e-07,2.0916e-07],"4":[2.1094999999999999e-07,2.1201e-07,2.1270000000000002e-07,2.1282999999999998e-07,2.1322e-07,2.1381000000000001e-07,2.1387999999999998e-07,2.1404999999999999e-07,2.1420000000000003e-07,2.1486000000000001e-07,2.1498000000000001e-07,2.1505999999999999e-07,2.1581e-07,2.1596000000000001e-07,2.1690000000000002e-07,2.1818000000000001e-07,2.2200999999999999e-07,2.2487e-07,2.2566e-07,2.2693999999999999e-07],"7424":[0.0001320065,0.00013387699999999999,0.00013725599999999999,0.000137594,0.00013811500000000004,0.00013813200000000001,0.00013935233333333335,0.00013938833333333338,0.00014088775000000003,0.00014268755223880599,0.00014281060606060608,0.00014292299999999999,0.00014319929850746272,0.0001434900289855073,0.0001439972878787879,0.00014460631147540987,0.00014519855555555553,0.00014578166666666666,0.00014876599999999999,0.00016171300000000007],"5":[2.2611e-07,2.262e-07,2.2692e-07,2.2753e-07,2.2792000000000002e-07,2.2840000000000001e-07,2.2869000000000002e-07,2.2912e-07,2.2945999999999999e-07,2.2959000000000001e-07,2.2974000000000002e-07,2.3051999999999998e-07,2.3062999999999999e-07,2.3648000000000001e-07,2.3765000000000001e-07,2.3765000000000001e-07,2.3906999999999998e-07,2.4283000000000001e-07,2.4890999999999997e-07,2.501e-07],"23552":[0.0004978430000000002,0.00049912399999999988,0.00050298300000000003,0.0005184390000000001,0.00051882199999999984,0.00051926099999999981,0.00052176800000000004,0.00052189599999999999,0.00052374699999999997,0.00052435100000000027,0.000525532,0.00052661299999999999,0.00052686627777777785,0.00052821400000000016,0.0005282329999999997,0.00052917016666666672,0.00053328449999999971,0.00053425816666666682,0.00054416499999999999,0.00054870152941176472],"6":[2.4111999999999998e-07,2.4139999999999998e-07,2.4178000000000004e-07,2.4199999999999997e-07,2.4203e-07,2.4260000000000002e-07,2.4375e-07,2.4400000000000001e-07,2.4442999999999997e-07,2.4474999999999996e-07,2.4630999999999999e-07,2.5120000000000003e-07,2.5199000000000002e-07,2.5208000000000002e-07,2.5363999999999999e-07,2.5497999999999997e-07,2.5529e-07,2.5852000000000001e-07,2.6296000000000002e-07,2.6478000000000002e-07],"61440":[0.001188534,0.001196758,0.0011972860000000001,0.0012036449999999999,0.00120725,0.0012196132857142856,0.00121977125,0.001220284125,0.0012211548750000001,0.0012225028571428572,0.001229309142857143,0.0012332249999999997,0.0012338430000000001,0.0012351900000000004,0.0012387450000000005,0.0012439375714285712,0.0012475160000000004,0.0012479365714285714,0.0012572162857142854,0.001270642],"491520":[0.01109477,0.011126615999999995,0.011248853999999997,0.011254591,0.011324036000000001,0.011371346000000001,0.01148535,0.011492795,0.0115588685,0.011616936,0.011618447,0.011643869499999997,0.0116956145,0.011729755500000001,0.01178764,0.0117983575,0.011825175,0.012015049999999996,0.012170529500000001,0.015034569000000001],"77824":[0.0016477082,0.0016503190000000001,0.0016575312000000001,0.0016765943999999997,0.0016802933999999999,0.0016813295999999992,0.001681664,0.0016866619999999991,0.001693375199999999,0.0017034213999999992,0.0017050137999999999,0.001712468,0.0017156398,0.0017294856,0.0017458342000000009,0.0017515045999999999,0.0017566564,0.001781419,0.001783015,0.0018904362000000002],"7":[2.5330999999999998e-07,2.5384e-07,2.5469999999999997e-07,2.5476000000000004e-07,2.5569999999999999e-07,2.5576000000000001e-07,2.5590000000000001e-07,2.5619999999999998e-07,2.5647999999999998e-07,2.5661999999999998e-07,2.5665000000000001e-07,2.5820000000000002e-07,2.5842000000000001e-07,2.6540999999999999e-07,2.6650000000000001e-07,2.6763999999999998e-07,2.7202000000000002e-07,2.8089000000000002e-07,2.8711999999999999e-07,2.9858000000000002e-07],"8":[2.6894000000000002e-07,2.6959000000000002e-07,2.6996000000000002e-07,2.7212999999999999e-07,2.7333000000000003e-07,2.7351000000000002e-07,2.7469999999999999e-07,2.8093000000000001e-07,2.8146000000000003e-07,2.8153999999999997e-07,2.8174000000000003e-07,2.8202999999999999e-07,2.8298000000000001e-07,2.8313999999999998e-07,2.8331000000000001e-07,2.8536000000000001e-07,2.8554e-07,2.9569999999999998e-07,3.0151999999999996e-07,3.0385000000000001e-07],"208":[3.4378299999999999e-06,3.47903e-06,3.4984000000000003e-06,3.50798e-06,3.5120099999999999e-06,3.5308600000000001e-06,3.5600900000000002e-06,3.60349e-06,3.6162199999999999e-06,3.6466400000000002e-06,3.6540299999999996e-06,3.6643100000000001e-06,3.6973199999999999e-06,3.7265799999999999e-06,3.7548699999999998e-06,3.7620200000000003e-06,3.7755500000000002e-06,3.8574300000000001e-06,4.0729000000000004e-06,4.1621200000000001e-06],"9":[2.84e-07,2.8456e-07,2.8471000000000001e-07,2.8498e-07,2.8543000000000004e-07,2.8620000000000001e-07,2.9537999999999999e-07,2.9684e-07,2.9821999999999998e-07,2.9862999999999997e-07,3.0016000000000001e-07,3.0116999999999999e-07,3.0533e-07,3.0712000000000001e-07,3.0929999999999994e-07,3.0936999999999997e-07,3.1250000000000003e-07,3.1301999999999998e-07,3.1554000000000003e-07,3.2335999999999995e-07],"73728":[0.0015170285000000001,0.0015467130000000001,0.0015518683333333332,0.001564127,0.0015666318333333335,0.0015691170000000005,0.0015731090000000001,0.001578412,0.00158679,0.0015921695999999992,0.0015932790000000006,0.001593608,0.00159782,0.0016049290000000008,0.001615661,0.0016248053333333336,0.0016356063333333331,0.0016616998,0.0016681031999999994,0.0017626670000000001],"304":[5.1385454545454544e-06,5.1692000000000004e-06,5.2366999999999993e-06,5.2836200000000002e-06,5.2891799999999996e-06,5.3146800000000004e-06,5.3148100000000002e-06,5.3200899999999994e-06,5.3586300000000002e-06,5.3696699999999992e-06,5.3725599999999998e-06,5.3786000000000005e-06,5.3848199999999994e-06,5.4015900000000002e-06,5.4921500000000004e-06,5.4971100000000001e-06,5.5754800000000005e-06,5.6067099999999999e-06,5.6278199999999994e-06,5.9123199999999998e-06],"400":[6.4595900000000001e-06,6.5894800000000005e-06,6.59882e-06,6.6356599999999996e-06,6.6458500000000001e-06,6.6489599999999999e-06,6.7016666666666672e-06,6.7235500000000002e-06,6.7484599999999996e-06,6.8759999999999999e-06,6.9057199999999995e-06,6.9473999999999998e-06,6.9498148148148149e-06,6.9762899999999997e-06,6.9932999999999996e-06,7.16816e-06,7.2582600000000002e-06,7.4436799999999999e-06,7.6236800000000007e-06,7.9334285714285713e-06],"1310720":[0.041160864000000019,0.041993178000000006,0.0420812255,0.042333540500000003,0.043223146000000004,0.043375649000000002,0.043423138,0.043431224999999997,0.043506912499999988,0.043875410999999996,0.044217476999999984,0.044513814500000012,0.046289998500000012,0.047308404000000012,0.047872884999999997,0.048287927500000029,0.048809033500000001,0.049200834999999998,0.049412932999999999,0.050883355999999991],"336":[5.8421578947368421e-06,5.8505490196078437e-06,5.8771199999999997e-06,5.8958399999999998e-06,5.9209599999999995e-06,5.9225200000000002e-06,5.9289399999999995e-06,5.9563799999999997e-06,6.0217500000000004e-06,6.07686e-06,6.1205299999999997e-06,6.1441800000000007e-06,6.1498e-06,6.21171e-06,6.2155e-06,6.2190099999999999e-06,6.3319299999999999e-06,6.4206e-06,6.4241500000000001e-06,6.6107199999999998e-06],"3670016":[0.16468718900000001,0.16749937250000002,0.16777797699999999,0.167978037,0.16885787999999999,0.1691315525,0.16920515,0.16963045799999998,0.16966090199999995,0.16987486900000001,0.169976184,0.17026250100000001,0.17055303999999999,0.17066410100000001,0.1708080085,0.17177588399999999,0.17299465,0.17335235299999999,0.18809224999999999,0.19292626199999999],"6656":[0.0001152015,0.000117024,0.000119312,0.00011979633333333334,0.00012029025000000001,0.0001204115,0.00012091699999999997,0.000121082,0.00012133533333333335,0.00012167307894736846,0.00012236443750000001,0.00012323799999999999,0.00012368824528301886,0.00012410039999999995,0.00012485099999999999,0.00012612229333333331,0.00012615799999999999,0.00012623000000000004,0.00013280998245614038,0.00013464033333333332],"15360":[0.00027663400000000016,0.00028530800000000001,0.000289921,0.00028997099999999998,0.000290933,0.00029143999999999985,0.00029415912121212123,0.00029602432258064523,0.00029625351515151515,0.000297664,0.00029798430303030311,0.00029811287499999998,0.00029826613333333335,0.00029938348387096762,0.00029953020689655176,0.00029967500000000001,0.000300618,0.00030243784848484853,0.00030831670000000002,0.00033046900000000001],"432":[7.3119999999999996e-06,7.31697e-06,7.3815999999999998e-06,7.3846899999999999e-06,7.4334444444444447e-06,7.4645400000000005e-06,7.4751900000000002e-06,7.4862200000000001e-06,7.5081599999999993e-06,7.5086700000000002e-06,7.5511999999999998e-06,7.5811900000000005e-06,7.6078299999999998e-06,7.6169400000000001e-06,7.6545699999999991e-06,7.6596700000000001e-06,7.7190000000000001e-06,7.8585100000000001e-06,7.8913500000000003e-06,8.0548299999999999e-06],"950272":[0.026007427,0.026091763,0.026331840499999998,0.026340086499999991,0.026385843499999999,0.026617577999999992,0.026859748000000006,0.02710034649999999,0.027228585499999992,0.027432916000000012,0.027443848999999999,0.027770638,0.028023172499999999,0.028698611499999999,0.030109383999999989,0.030559383500000002,0.030991384,0.032085281,0.032578081500000002,0.034009150000000002],"655360":[0.0163905315,0.0164856255,0.016504014500000001,0.016702139000000008,0.016780917499999999,0.016890290499999999,0.016909489,0.016942921500000003,0.016961511499999991,0.016985713,0.017017926999999999,0.017107981500000001,0.017240370000000001,0.017361186000000011,0.017402083499999992,0.018536117999999997,0.018848381000000001,0.021088045499999999,0.02158143249999999,0.022569452],"69632":[0.0014462365,0.0014529251666666669,0.0014606373333333335,0.0014636854999999999,0.001466523,0.0014764988333333335,0.0014780928333333332,0.0014876201666666664,0.0014898274999999999,0.0014921175,0.0015033176666666664,0.0015083618333333331,0.0015225508333333332,0.0015337483333333335,0.001565325,0.0015815679999999781,0.00158226,0.0016316590000000001,0.0016812589999999996,0.0018259997500000007],"11264":[0.00023468499999999997,0.00023665200000000001,0.00023804299999999993,0.00024085650000000005,0.000241537,0.000243055,0.00024338699999999999,0.00024386159459459456,0.00024551134999999992,0.00024580019999999992,0.000246071,0.000246226,0.00024776305263157891,0.0002501468947368421,0.00025087916216216214,0.00025277899999999996,0.00025830239473684208,0.00026022226315789473,0.00026278200000000009,0.00026483928571428568],"2752512":[0.1288829125,0.1296847545,0.130401091,0.1304321635,0.13060411750000001,0.13115592500000001,0.131243675,0.131459301,0.131494903,0.13156314999999999,0.132073107,0.13212535800000003,0.1334529065,0.13456918200000001,0.13514730250000001,0.13561356099999999,0.13599996349999999,0.136014042,0.13613801399999997,0.140599743],"8126464":[0.45414417899999998,0.4562809585,0.45693799699999998,0.45764558449999998,0.46084672300000001,0.461845389,0.46245687200000002,0.46283110700000002,0.4629062665,0.46393842400000002,0.46411106950000003,0.46449079399999998,0.46892078700000001,0.47174830350000002,0.47201210399999999,0.47639441449999997,0.47699815400000001,0.478979612,0.483432682,0.48959807649999998],"27648":[0.00049987600000000001,0.00050236900000000012,0.00050347300000000016,0.00051325272222222231,0.00051536016666666666,0.00051799400000000014,0.00051931999999999998,0.00052108600000000003,0.00052174127777777782,0.00052219799999999998,0.00052251199999999982,0.00052753100000000003,0.00052842761111111098,0.00052888122222222232,0.00052979600000000002,0.00053092899999999997,0.00053167550000000018,0.00053195500000000019,0.0005339328888888888,0.00053437372222222234],"368":[6.2584800000000006e-06,6.4673900000000003e-06,6.5176500000000002e-06,6.5638199999999994e-06,6.5937700000000007e-06,6.6270900000000006e-06,6.6641400000000005e-06,6.6689199999999995e-06,6.7132599999999995e-06,6.7358200000000005e-06,6.7923500000000003e-06,6.8355300000000004e-06,6.8898600000000005e-06,6.89615e-06,6.9030899999999993e-06,6.9212799999999996e-06,6.9215300000000001e-06,7.1091999999999996e-06,7.5381700000000005e-06,7.7316099999999997e-06],"65536":[0.0013123660000000001,0.001325721,0.001326116,0.0013298349999999997,0.0013339701666666664,0.0013358785714285711,0.0013536104999999996,0.0013546405714285714,0.001354977,0.0013709732857142859,0.0013716160000000004,0.0013722355,0.0013729789999999996,0.0013734252857142853,0.0013740242857142857,0.0013800002857142857,0.0013987697142857146,0.0014139323333333333,0.0014179904285714288,0.0014781225000000001],"16252928":[0.96079676300000005,0.97663998100000005,0.97952602450000004,0.980187523,0.98126941400000001,0.98158753200000004,0.98670986350000001,0.987117048,0.99138949350000005,0.99262135750000002,0.99827059350000003,0.99846522650000002,0.99882642150000001,1.0014957545000001,1.0020801909999999,1.0108335799999999,1.0169790955,1.0279466909999999,1.0575858920000001,1.1611229414999999],"464":[7.91394e-06,7.9235438596491224e-06,7.94748e-06,7.9553300000000003e-06,7.9667500000000013e-06,8.0274700000000002e-06,8.0318699999999997e-06,8.0732799999999997e-06,8.1018999999999995e-06,8.1124099999999995e-06,8.1445499999999998e-06,8.1533700000000002e-06,8.22822e-06,8.25992e-06,8.2605600000000007e-06,8.2807199999999999e-06,8.28479e-06,8.3285714285714282e-06,8.4965000000000007e-06,8.7840399999999987e-06],"1015808":[0.028116452,0.028442158999999988,0.02866318499999999,0.028774197999999994,0.028885193,0.028937869500000001,0.028954847999999998,0.029002861500000005,0.029047802000000001,0.029117207999999995,0.029267656,0.029271822499999989,0.029473739500000002,0.029708252000000011,0.032448217500000001,0.03296164750000001,0.033846492999999984,0.033953301500000019,0.034165215000000013,0.035825023999999997],"3072":[6.4226000000000005e-05,6.5289638297872339e-05,6.5387000000000003e-05,6.6130000000000006e-05,6.6149000000000007e-05,6.6235000000000005e-05,6.6297999999999994e-05,6.6723452380952378e-05,6.7658787234042557e-05,6.8378000000000002e-05,6.9060980000000007e-05,6.946773809523809e-05,6.9485809523809521e-05,6.9591268292682929e-05,6.9783000000000006e-05,6.9900000000000005e-05,7.0154999999999995e-05,7.2977944444444447e-05,7.4437900000000001e-05,7.7187310344827587e-05],"110592":[0.0021986565,0.0022057547500000012,0.0022083677499999989,0.0022333180000000002,0.00224674425,0.0022490963333333335,0.0022517482499999999,0.0022547477500000001,0.0022578512500000007,0.00226728075,0.0022704617500000001,0.00227190875,0.0022776335,0.0022790602499999993,0.0024686846666666664,0.0025074933333333327,0.0025105833333333334,0.0025457806666666673,0.0025700606666666671,0.0026643333333333324],"237568":[0.0048866389999999999,0.0048891909999999985,0.0049910409999999999,0.0050606599999999998,0.0050630170000000013,0.0050843860000000015,0.0050948040000000014,0.0050960570000000002,0.0051300809999999999,0.0051543660000000022,0.0051578360000000007,0.0055340290000000002,0.0056078550000000001,0.005643716,0.0056460699999999996,0.0056786519999999976,0.0056990910000000016,0.005723995,0.0057377569999999987,0.0058229180000000024],"278528":[0.0060051050000000019,0.0061234500000000025,0.0061473089999999984,0.0061836309999999985,0.0062136190000000018,0.0062416800000000029,0.0062428480000000005,0.0062763929999999999,0.0062873749999999996,0.0062983309999999999,0.0063007740000000003,0.0063049690000000023,0.0065410530000000024,0.0067818059999999987,0.006841705,0.0069353059999999996,0.0070444209999999978,0.0071490170000000023,0.0071609490000000024,0.0081376560000000001],"496":[8.3380799999999993e-06,8.5805000000000003e-06,8.6042300000000001e-06,8.6880000000000005e-06,8.6940599999999992e-06,8.7126363636363641e-06,8.7628800000000007e-06,8.7882100000000007e-06,8.8239799999999992e-06,8.8780300000000008e-06,8.8971600000000007e-06,8.9071199999999995e-06,8.9258299999999989e-06,8.9431200000000005e-06,8.9529500000000004e-06,8.9545399999999998e-06,9.0320999999999995e-06,9.0862199999999992e-06,9.2256399999999996e-06,9.2701700000000011e-06],"13107200":[0.73897217000000004,0.73987135300000006,0.74096737349999997,0.74130644000000001,0.74893227500000004,0.754485234,0.75818085899999998,0.75894796799999997,0.76315694300000003,0.76357216800000005,0.765420039,0.76956420850000007,0.7709250795,0.77695559650000001,0.77719963400000003,0.78267677999999996,0.78883560649999995,0.83307935300000002,0.91619991950000002,0.92025449300000006],"9961472":[0.59529497300000001,0.59567484250000002,0.59686311749999998,0.60178162899999998,0.60210222349999998,0.60422720350000003,0.60511753350000008,0.60560080049999998,0.60568567200000001,0.60748009250000001,0.60753165799999997,0.6102451055,0.61615548799999997,0.61914189649999996,0.62798011350000005,0.63244713750000003,0.63267041149999992,0.63448583999999997,0.63583677199999999,0.63632153250000001],"5888":[0.00012390799999999999,0.00012486600000000001,0.00012524299999999998,0.000125258,0.00012740833333333332,0.00012773222222222221,0.00012830958441558446,0.00013020224657534247,0.00013035999999999999,0.00013058771232876714,0.000131137,0.00013143484210526314,0.00013152596,0.00013153399999999999,0.00013156600000000001,0.00013182555405405407,0.000132619,0.0001331606666666667,0.00013349834782608701,0.00013376663513513508],"11010048":[0.69188739300000002,0.69389358599999995,0.69610278049999996,0.69754594650000001,0.69981093500000002,0.70116170799999999,0.70119489400000001,0.70287001199999999,0.70357256550000002,0.70367684499999994,0.70420943950000003,0.70504426100000006,0.70752634250000002,0.70878974750000001,0.70953690250000001,0.70995027399999999,0.71007454150000004,0.71879729250000002,0.72562337799999999,0.7292030075],"1920":[3.3234000000000001e-05,3.3341333333333332e-05,3.4690000000000002e-05,3.5012999999999998e-05,3.5159e-05,3.5222702702702703e-05,3.5250550000000001e-05,3.5262706666666666e-05,3.5271739999999999e-05,3.5310920000000002e-05,3.5334000000000004e-05,3.5820720000000002e-05,3.5989180000000003e-05,3.6225600000000001e-05,3.6373964912280704e-05,3.6472369999999998e-05,3.6599839999999998e-05,3.6650444444444446e-05,3.6659370000000001e-05,3.7135499999999997e-05],"2490368":[0.110048008,0.1102942885,0.110441699,0.111389956,0.11178342199999999,0.11260354449999999,0.113833725,0.11435925,0.11505510200000001,0.115773485,0.1163798045,0.118371744,0.1184309715,0.1192196375,0.120798379,0.12172907350000001,0.122982405,0.12408128400000001,0.125070506,0.12914311750000002],"19456":[0.00038245800000000002,0.0003832145,0.00038932499999999994,0.00038933000000000012,0.00039813350000000007,0.00039828699999999994,0.00039985500000000001,0.00040432534782608703,0.0004045966666666666,0.00040571199999999991,0.00040712400000000003,0.00040786970833333344,0.00040895947826086968,0.00040931812499999987,0.00041425199999999983,0.00041473139130434792,0.00041475399999999998,0.00041713000000000009,0.00042372786956521735,0.00042718599999999997],"57344":[0.001097347,0.0011103485000000001,0.0011161229999999999,0.0011220870000000001,0.001122592375,0.0011232657500000001,0.0011282179999999998,0.0011299805,0.0011327643750000001,0.0011331953750000005,0.001136389375,0.00113992,0.001140157625,0.001140838625,0.0011449078750000001,0.0011534330000000001,0.001165722125,0.0011730587499999996,0.0011839988749999999,0.0012171496249999999],"1179648":[0.036072771999999996,0.0361833685,0.036371526000000001,0.036815565000000015,0.037023784500000004,0.03708582249999999,0.037148217000000004,0.037220168499999998,0.037300667999999988,0.03754834299999997,0.037616858999999989,0.0392106755,0.039254723499999998,0.039544719999999998,0.039723267999999999,0.040293561999999991,0.041384552000000005,0.042341832999999988,0.044181213499999997,0.047127130000000017],"4718592":[0.24317562500000001,0.24402323949999999,0.24624043600000001,0.246593335,0.24700297800000001,0.24733009500000003,0.24823632800000001,0.24837073650000002,0.24914807250000001,0.24942527349999999,0.24948813949999998,0.25119473850000001,0.25137806600000001,0.25139345199999996,0.25145685350000002,0.25215303950000001,0.252571359,0.2554278975,0.25758880849999999,0.26133401249999999],"360448":[0.0085279220000000003,0.0086111819999999967,0.0086122184999999993,0.0086377899999999976,0.0087375159999999973,0.0087811950000000003,0.0087997790000000006,0.0088178619999999992,0.0089563749999999973,0.0089577139999999951,0.0089594040000000007,0.0091210139999999985,0.0092620350000000001,0.0093371405000000005,0.0093618160000000002,0.0093713630000000006,0.0097353350000000029,0.010200109000000004,0.010516298,0.0114922515],"1572864":[0.055074334999999988,0.056585749500000004,0.0567606025,0.057582084999999984,0.057756834,0.057807666000000001,0.058575990999999973,0.058933317499999992,0.059074863500000005,0.060294439499999998,0.060535307500000003,0.060815306999999999,0.061386007499999985,0.061606657499999981,0.061947328499999989,0.062856244000000033,0.0633282545,0.063845697000000021,0.064231730000000001,0.070623463999999997],"53248":[0.00099722977777777738,0.0010002188888888885,0.0010016523333333336,0.0010026145555555555,0.0010060655555555555,0.001008380444444444,0.0010107233333333334,0.0010116039999999999,0.0010118183333333334,0.0010122444444444448,0.0010158208571428569,0.0010186773333333333,0.0010336866666666666,0.0010460032222222222,0.0010460281111111113,0.0010476860000000001,0.001049190111111111,0.0010541593333333332,0.001068051,0.0010774200000000004],"3456":[5.9731999999999997e-05,6.2119999999999995e-05,6.2211499999999999e-05,6.2981563636363641e-05,6.3227999999999998e-05,6.3491654545454545e-05,6.3560249999999998e-05,6.3652409999999995e-05,6.3809230000000001e-05,6.4140130000000001e-05,6.4219509433962262e-05,6.4568120000000004e-05,6.4668803921568623e-05,6.4789609999999994e-05,6.4861820000000004e-05,6.5104000000000006e-05,6.5685029999999994e-05,6.6946210000000007e-05,6.7091844444444436e-05,6.8114999999999994e-05],"40960":[0.00084793499999999996,0.0008561030000000002,0.00085772499999999994,0.00085999500000000033,0.00086128400000000003,0.00086377999999999997,0.00086987200000000005,0.00087050800000000041,0.00087389399999999973,0.00088268889999999973,0.00088401962499999999,0.00088471363636363624,0.00088515118181818164,0.00089112899999999973,0.00089162444444444472,0.00089349799999999951,0.00089532299999999995,0.00090368849999999999,0.00090461959999999994,0.00093322570000000001],"4608":[8.89435e-05,9.0332000000000002e-05,9.0588999999999996e-05,9.1133500000000004e-05,9.1213999999999998e-05,9.2205714285714292e-05,9.2493333333333331e-05,9.3085163043478262e-05,9.3086399999999997e-05,9.3290412371134021e-05,9.3909908045977005e-05,9.3917889999999997e-05,9.4246200000000006e-05,9.5234000000000003e-05,9.5405081632652676e-05,9.5635000000000002e-05,9.5978163265306122e-05,9.6039999999999995e-05,9.6390693877551029e-05,9.7635819999999999e-05],"13824":[0.00024072650000000001,0.00024268950000000001,0.00025014999999999998,0.00025169600000000009,0.00025192600000000008,0.00025258499999999994,0.00025444900000000002,0.00025608307894736855,0.00025620513513513509,0.00025671908333333327,0.00025686313157894736,0.00025748524242424242,0.00025880794594594593,0.00026170536363636363,0.00026319361111111115,0.000265534,0.00026714290322580648,0.00026928011111111109,0.00027389302941176468,0.000278738],"819200":[0.020786258000000002,0.020809732500000004,0.0210378975,0.021261689,0.021445828,0.021508156,0.021552865500000001,0.021613132,0.021665117500000011,0.021715855499999999,0.021753655,0.021951952,0.024375933999999998,0.0248278935,0.025072260000000002,0.025785454999999992,0.025801194,0.026065748999999999,0.026455947,0.026742519500000006],"983040":[0.027377613000000002,0.02742555,0.027716829999999998,0.027910592999999984,0.028170476,0.028518558999999992,0.028742152999999993,0.029495940000000009,0.029583983999999952,0.029675946499999994,0.029900249,0.03128086800000001,0.03167718550000001,0.031692109000000017,0.031983155000000041,0.032081722999999993,0.032389596,0.03278033100000001,0.0337345665,0.034604465000000015],"8704":[0.00016253350000000009,0.000166971,0.00016827299999999998,0.00016876599999999999,0.00016931385714285711,0.00017034050000000006,0.00017038666666666663,0.00017071099999999999,0.00017084924999999994,0.0001722455,0.00017261912280701759,0.000176121,0.00017635600000000004,0.00017689194339622644,0.0001776199642857143,0.00017811479245283019,0.00018032699999999998,0.00018292074074074071,0.00018385800000000001,0.000192046],"120":[2.0251399999999997e-06,2.0802e-06,2.0870099999999999e-06,2.1023299999999997e-06,2.1053599999999999e-06,2.10547e-06,2.1083899999999997e-06,2.1109800000000001e-06,2.1241799999999998e-06,2.1287399999999999e-06,2.1345500000000002e-06,2.1382199999999998e-06,2.1435900000000003e-06,2.1475300000000002e-06,2.15377e-06,2.1552999999999999e-06,2.16644e-06,2.20693e-06,2.2209499999999999e-06,2.2255699999999999e-06],"1024":[1.7785333333333334e-05,1.82685e-05,1.8501159999999999e-05,1.8547759999999999e-05,1.8611660000000001e-05,1.8637359999999999e-05,1.8702000000000002e-05,1.8742290000000001e-05,1.8852969999999998e-05,1.8859700000000002e-05,1.891266e-05,1.891383e-05,1.9196199999999998e-05,1.9204670000000001e-05,1.9255000000000001e-05,1.9363000000000001e-05,1.9667690000000001e-05,1.9688244897959183e-05,1.9710189999999999e-05,2.1215453125000001e-05],"49152":[0.0010986569999999998,0.001101091,0.0011028450000000001,0.00110694125,0.001111417,0.0011116799999999999,0.0011170869999999999,0.001117105,0.001118106,0.001119935125,0.0011216329999999999,0.0011243333749999999,0.0011260929999999999,0.0011323935000000004,0.0011394906250000001,0.0011451426250000001,0.0011470899999999999,0.0011561616250000003,0.0011579551249999999,0.0011608650000000001],"524288":[0.012241868,0.0123101445,0.012421182999999999,0.012430179500000001,0.012438629,0.012499695,0.012522499000000001,0.012584696000000001,0.012597450499999999,0.012657204999999999,0.012668513500000001,0.0127121905,0.012889369499999997,0.012902515999999999,0.012981272,0.013040063500000004,0.013129921499999999,0.013297915,0.013695655000000024,0.014355329999999999],"45056":[0.00092971999999999998,0.00096803899999999953,0.00097361699999999976,0.00097996299999999993,0.00098576922222222223,0.00098689277777777779,0.00098710200000000055,0.00099125433333333316,0.00099583644444444452,0.00099607199999999976,0.00099728544444444467,0.00099801250000000033,0.0010003939999999995,0.0010017125555555554,0.001004343,0.0010130041111111115,0.0010185249999999997,0.0010210382222222225,0.0010231162222222221,0.0010448759999999997],"229376":[0.0046992120000000012,0.0047777490000000021,0.0047938620000000003,0.0048280349999999996,0.0048532159999999987,0.0048651950000000001,0.0048711849999999984,0.0049846809999999995,0.0049942900000000002,0.0050803749999999998,0.0052419840000000016,0.0054405700000000022,0.0054754449999999998,0.0054831040000000008,0.0054868479999999999,0.0054883589999999999,0.0055172580000000014,0.005532248,0.0058990290000000001,0.0066846299999999996],"2688":[5.2269499999999998e-05,5.2513333333333338e-05,5.2670999999999998e-05,5.2805e-05,5.3792999999999998e-05,5.4657000000000002e-05,5.4774600000000002e-05,5.4967730000000001e-05,5.4989330000000001e-05,5.5297100000000003e-05,5.5306540000000006e-05,5.5426000000000001e-05,5.5467333333333337e-05,5.6166719999999993e-05,5.6390329999999996e-05,5.6489914285714284e-05,5.6837306666666668e-05,5.7015026666666673e-05,5.8043309859154929e-05,5.8199300000000004e-05],"152":[2.6155333333333336e-06,2.6541699999999999e-06,2.6817799999999998e-06,2.6868799999999999e-06,2.6884700000000002e-06,2.69325e-06,2.6971200000000001e-06,2.70577e-06,2.7122099999999999e-06,2.71763e-06,2.7280200000000001e-06,2.7358599999999997e-06,2.7600299999999998e-06,2.7814799999999998e-06,2.8141400000000001e-06,2.8144599999999996e-06,2.8354800000000001e-06,2.8429099999999998e-06,2.8641600000000002e-06,3.1298200000000002e-06],"5120":[0.000103667,0.000104152,0.0001041965,0.000104808,0.00010485299999999999,0.00010515640217391305,0.000105577,0.00010596248275862068,0.00010610837777777775,0.00010627145569620257,0.00010702120454545455,0.0001070954782608696,0.00010760814130434785,0.00010803975,0.00010811606521739132,0.00010828637209302325,0.00010906763218390806,0.00011010378823529412,0.00011080065168539324,0.00011092299999999999],"1507328":[0.051723546499999981,0.052170059499999998,0.05218580500000003,0.052204168000000016,0.05287282950000001,0.053202978499999998,0.053326435999999998,0.053431807000000012,0.053650172499999982,0.053678099999999972,0.053727044999999973,0.053748376,0.053788374500000014,0.054446117000000002,0.054502822999999999,0.054603065999999978,0.055083807999999977,0.056966375,0.06232043449999998,0.065106095000000003],"1216":[2.2135000000000001e-05,2.2309894736842104e-05,2.2818270000000003e-05,2.3095879999999999e-05,2.3474499999999997e-05,2.352298e-05,2.3538989999999999e-05,2.3611029999999997e-05,2.3655400000000001e-05,2.3681950000000001e-05,2.3754689999999997e-05,2.3778530000000002e-05,2.38715e-05,2.3905624999999999e-05,2.3956170000000001e-05,2.3956250000000003e-05,2.398726e-05,2.411986e-05,2.422554e-05,2.4683629999999997e-05],"1966080":[0.077418448000000001,0.078630102000000007,0.079065189000000008,0.079550941999999999,0.080015974999999989,0.080544459999999984,0.080858740499999998,0.080906565999999971,0.081029086000000028,0.08116122349999999,0.081286060499999979,0.081414873999999998,0.081648486499999992,0.082173437500000029,0.083148850999999996,0.084071020999999996,0.084236322000000002,0.087265571,0.088095050000000036,0.091052107500000007],"1900544":[0.074380388999999963,0.074943154000000026,0.075418560999999995,0.075457738999999996,0.07616056849999997,0.07647966149999999,0.077086703000000006,0.077145678000000023,0.077210007000000025,0.078464746500000029,0.078788601999999999,0.080893001499999992,0.081349313500000006,0.081447339499999993,0.081448804499999972,0.08181228550000004,0.083053279000000008,0.08311567099999996,0.084187455999999966,0.085509237000000002],"184":[3.1714700000000001e-06,3.1827699999999999e-06,3.1981400000000002e-06,3.2286666666666667e-06,3.24367e-06,3.2559400000000003e-06,3.2571199999999998e-06,3.2724000000000002e-06,3.3056300000000001e-06,3.3082400000000002e-06,3.3236300000000002e-06,3.3723899999999998e-06,3.3738199999999999e-06,3.4090100000000002e-06,3.4211300000000001e-06,3.4574200000000003e-06,3.4670099999999999e-06,3.5048399999999997e-06,3.5213200000000002e-06,3.7802600000000002e-06],"7936":[0.00014774919999999993,0.000147804,0.00014829200000000001,0.00014862300000000013,0.000149426,0.000150359,0.00015106657812499999,0.00015138450000000007,0.00015186299999999999,0.00015232646153846157,0.00015251799999999992,0.00015258600000000007,0.00015390768852459018,0.00015427399999999998,0.000157787,0.00015786814285714286,0.000158472,0.00015911399999999999,0.00016184825,0.00016207225000000001],"3801088":[0.17328105900000002,0.17557194000000001,0.17657227900000005,0.17659316899999999,0.176854656,0.17718003800000001,0.17758059400000001,0.17763256599999999,0.17876974300000001,0.17897231599999999,0.17905491400000001,0.17912499649999999,0.179137032,0.17938081149999999,0.18053181149999997,0.181027354,0.181437922,0.18563569499999999,0.1910778645,0.20042452599999999],"6815744":[0.35863253649999999,0.36411242499999996,0.36555419300000003,0.36744668850000001,0.368100127,0.36833725100000003,0.36939872900000004,0.3696776645,0.37080734949999999,0.3708296385,0.37125098950000002,0.37187123649999998,0.37322945099999999,0.37673798549999998,0.37802825750000002,0.37907192150000002,0.38202598199999999,0.38246598249999997,0.38673820250000002,0.38996767999999998],"124":[2.1085900000000002e-06,2.1406299999999999e-06,2.1451200000000001e-06,2.14513e-06,2.14685e-06,2.1525499999999998e-06,2.1677500000000001e-06,2.1759599999999997e-06,2.1785399999999998e-06,2.1799399999999999e-06,2.1808999999999997e-06,2.1861600000000001e-06,2.19082e-06,2.2068599999999997e-06,2.2139300000000001e-06,2.2194900000000002e-06,2.2200599999999999e-06,2.2490500000000001e-06,2.26425e-06,2.5792399999999996e-06],"102400":[0.0019881690000000001,0.0019888427499999998,0.0020013145000000007,0.002027780250000001,0.002035311000000011,0.0020611104999999998,0.0020768527499999993,0.00207729875,0.0020774389999999999,0.0020834120000000002,0.00209147875,0.0020925310000000003,0.0020972334999999993,0.002231299,0.0023129319999999993,0.0023165572500000002,0.0023177140000000002,0.0023529364999999992,0.0023941473333333333,0.0024317723333333336],"311296":[0.0070977929999999998,0.0071274290000000002,0.0071287899999999986,0.007146716,0.007159276,0.0072297630000000002,0.007252451,0.0072557420000000008,0.0072967709999999979,0.0073926749999999996,0.0074741779999999997,0.0075353129999999992,0.0076136879999999987,0.0076894879999999995,0.0079780490000000009,0.0079965680000000008,0.0080121240000000007,0.0080360039999999994,0.0080821560000000018,0.0081201240000000011],"1408":[2.7766620000000001e-05,2.788881e-05,2.7939599999999999e-05,2.7976770000000001e-05,2.8041790697674417e-05,2.8063939999999997e-05,2.8222139999999998e-05,2.8235130000000002e-05,2.824784e-05,2.842760975609756e-05,2.8525579999999999e-05,2.860759e-05,2.8626696969696969e-05,2.8643069999999998e-05,2.8922610000000001e-05,2.9133079999999999e-05,2.9372119999999998e-05,2.9378809999999998e-05,2.9934190476190473e-05,3.0003272727272729e-05],"393216":[0.009659483,0.0097215865000000005,0.0097635309999999954,0.0098289675000000007,0.0098438315000000005,0.0098832934999999976,0.0099245430000000044,0.0099514400000000006,0.0099587175000000003,0.0099616440000000004,0.010067783,0.0101673215,0.010376445499999994,0.010570339,0.0106457125,0.010733658,0.0107458195,0.010792007499999978,0.0108625745,0.01459413],"4352":[7.9900000000000004e-05,8.2863666666666664e-05,8.4192124999999998e-05,8.4415866666666666e-05,8.4746000000000005e-05,8.4788928571428573e-05,8.5325079999999992e-05,8.5409933333333344e-05,8.5869359999999999e-05,8.5994750000000002e-05,8.640001e-05,8.6462740000000011e-05,8.6487600000000002e-05,8.7275170000000006e-05,8.7499999999999999e-05,8.7609520000000003e-05,8.8157583333333341e-05,8.8193010000000001e-05,8.8591000000000006e-05,9.5821600000000004e-05],"6553600":[0.33765187050000001,0.34613438949999997,0.346308422,0.34827518800000001,0.35099106250000001,0.35148682949999999,0.35326632499999999,0.35365423400000001,0.35371370600000002,0.35499082500000001,0.35572208599999999,0.356998655,0.35728278050000001,0.35741718700000003,0.35840449200000002,0.36054602250000001,0.36134068600000002,0.36294215699999999,0.36326088400000001,0.36763791550000002],"20480":[0.00040726399999999996,0.00042600890476190474,0.00042741899999999974,0.000428238,0.000429684,0.00043178385714285711,0.00043261099999999985,0.00043262733333333315,0.00043333399999999979,0.00043513999999999998,0.00043568154545454551,0.00043576613636363629,0.00043797747619047625,0.0004404728571428572,0.00044225472727272717,0.00044343618181818189,0.00044345171428571432,0.00044904099999999996,0.00045787152380952369,0.00047999220000000001],"608":[1.0689999999999999e-05,1.0706929999999999e-05,1.0994760000000001e-05,1.1003395833333333e-05,1.1008e-05,1.1062454545454546e-05,1.1078209999999999e-05,1.110302e-05,1.11085e-05,1.1169820000000001e-05,1.1266169999999999e-05,1.133226e-05,1.1334150000000001e-05,1.1345210000000002e-05,1.1411889999999999e-05,1.1471789999999998e-05,1.1853899999999998e-05,1.2279100000000001e-05,1.2302299999999999e-05,1.235407e-05],"2228224":[0.093744438999999985,0.093941502999999982,0.094008794999999992,0.094448665000000001,0.095100106999999962,0.095302154,0.096411956500000007,0.09698509750000002,0.097567414000000005,0.098343334000000004,0.098940608499999999,0.099558181500000023,0.099840140999999993,0.10124488999999998,0.10139972,0.101581755,0.102443906,0.10281814449999999,0.10396388600000001,0.10545094350000001],"36864":[0.00074218999999999999,0.00075053700000000023,0.00075190300000000016,0.00075222100000000029,0.00075547533333333351,0.00075620233333333346,0.00075742699999999986,0.00075829100000000013,0.000758978,0.00076251450000000022,0.00076409399999999988,0.0007768166666666668,0.00078125975000000012,0.00078224774999999995,0.00078346083333333347,0.00078537499999999994,0.00078761600000000021,0.00078977699999999997,0.00079747700000000021,0.00080215366666666653],"704":[1.2792000000000001e-05,1.27935e-05,1.2797783783783782e-05,1.3139666666666667e-05,1.3146428571428572e-05,1.3184636363636363e-05,1.3224692307692308e-05,1.3265629999999999e-05,1.3363999999999999e-05,1.3405089999999999e-05,1.3430300000000001e-05,1.3573960000000001e-05,1.3672242105263157e-05,1.3883269999999999e-05,1.4043837499999999e-05,1.4123600000000001e-05,1.4174450000000001e-05,1.4212100000000001e-05,1.4283666666666667e-05,1.4382000000000001e-05],"720896":[0.018811704500000002,0.0189029935,0.018965243,0.0191320395,0.019142342,0.01917924,0.019231174,0.019298435499999999,0.019370034000000001,0.0195823335,0.019629031000000002,0.019730900500000002,0.019854473000000001,0.019919111,0.020156108999999998,0.020284353500000001,0.020938248,0.0210639325,0.022357793499999994,0.022405181],"800":[1.3327714285714287e-05,1.34964e-05,1.3504333333333334e-05,1.388338e-05,1.3941470000000002e-05,1.395317e-05,1.4004180000000001e-05,1.4004860000000001e-05,1.401657e-05,1.4037889999999999e-05,1.4109070000000001e-05,1.4111666666666667e-05,1.4124050000000001e-05,1.4161576470588235e-05,1.4185079999999999e-05,1.422332e-05,1.4383594202898551e-05,1.4484030000000001e-05,1.5520359999999999e-05,1.5823000000000001e-05],"2621440":[0.11811057799999999,0.12103824000000001,0.12147258499999999,0.12149229350000001,0.122294338,0.122699393,0.122851294,0.122954462,0.12331637100000004,0.1255258645,0.12621615749999998,0.12711515800000001,0.12711709099999999,0.12717278300000001,0.12751774599999999,0.12825264600000003,0.12842947699999999,0.1285836095,0.12981593050000001,0.12998520050000001],"425984":[0.0092632329999999992,0.0093072769999999957,0.0093317139999999996,0.0093559005000000001,0.0094063790000000046,0.0094424955000000001,0.0095104350000000046,0.0095309255000000006,0.009589486999999999,0.009603609500000004,0.009604425500000003,0.0096170985000000007,0.0096181595000000043,0.0096556330000000003,0.0097138829999999961,0.0097284235000000031,0.0097711234999999994,0.0097855575,0.009876722499999999,0.010126045],"32768":[0.00064922000000000016,0.00064954999999999982,0.00065120640000000001,0.00065435099999999996,0.00065499699999999972,0.00065843935714285742,0.00065893121428571447,0.0006633291999999999,0.00066381921428571413,0.00066859700000000048,0.00066974600000000025,0.00067003792857142869,0.00067170614285714278,0.00067555992857142846,0.00067604557142857146,0.00068054735714285727,0.00068342421428571425,0.00068806200000000014,0.00068984299999999999,0.00069389200000000031],"12058624":[0.78646335150000002,0.78663070700000004,0.79385611099999998,0.79609592650000005,0.797483151,0.79895906299999997,0.80134017000000002,0.80152504550000003,0.80250492900000003,0.80369354999999998,0.80371641049999998,0.80390006250000001,0.80572723150000003,0.80610640600000005,0.80633010849999998,0.80796581899999997,0.81055228850000005,0.81203671399999999,0.832123367,0.83791920650000007],"128":[2.1661299999999999e-06,2.1985299999999998e-06,2.2160099999999999e-06,2.22192e-06,2.24561e-06,2.2469099999999999e-06,2.2480100000000002e-06,2.2498999999999998e-06,2.25181e-06,2.2537300000000001e-06,2.25704e-06,2.2804100000000001e-06,2.2826e-06,2.2900600000000001e-06,2.29061e-06,2.2979200000000002e-06,2.30092e-06,2.3101600000000001e-06,2.31921e-06,2.3324299999999999e-06],"180224":[0.0042288165000000004,0.0042354565,0.0042630694999999984,0.0042642059999999996,0.004268778,0.0042951459999999997,0.0042989554999999999,0.0043060749999999995,0.0043363374999999997,0.0043470604999999978,0.0043806145000000003,0.0043941259999999999,0.0043951145,0.0044188130000000023,0.0044991544999999997,0.0045764030000000015,0.004604046500000002,0.0047011099999999997,0.00477714,0.0050524720000000006],"224":[3.6746700000000002e-06,3.7077200000000002e-06,3.7777721518987341e-06,3.79785e-06,3.8086400000000001e-06,3.8193500000000001e-06,3.8398699999999999e-06,3.8475500000000001e-06,3.8482456140350878e-06,3.85026e-06,3.8680399999999995e-06,3.8807099999999998e-06,3.9009000000000002e-06,3.9207846153846152e-06,3.9879100000000002e-06,4.0243300000000001e-06,4.0309300000000002e-06,4.1465199999999997e-06,4.1690000000000002e-06,4.50104e-06],"736":[1.4006769999999999e-05,1.4025543859649124e-05,1.403793e-05,1.4116619999999999e-05,1.4153246575342467e-05,1.4154599999999998e-05,1.4182089999999999e-05,1.4234269999999998e-05,1.4240399999999998e-05,1.4251159999999999e-05,1.4346599999999999e-05,1.4424590000000002e-05,1.463449e-05,1.4687369999999999e-05,1.4721420000000001e-05,1.4784310000000001e-05,1.4867030000000001e-05,1.488058e-05,1.488368e-05,1.5360950000000001e-05],"320":[5.5319600000000003e-06,5.5841500000000006e-06,5.6011428571428576e-06,5.614e-06,5.626e-06,5.6435100000000001e-06,5.6501399999999997e-06,5.6617099999999994e-06,5.7181428571428575e-06,5.7415199999999997e-06,5.7422099999999997e-06,5.80439e-06,5.8098700000000005e-06,5.85252e-06,5.8941976744186046e-06,5.9811176470588226e-06,6.0510500000000003e-06,6.4334899999999996e-06,6.5833799999999998e-06,6.7207300000000003e-06],"557056":[0.013365751,0.013398219499999999,0.013411075,0.013438922000000001,0.0134611405,0.013479848500000002,0.013692626999999995,0.013712421000000006,0.0137407395,0.013797791,0.013798939999999999,0.013823803500000001,0.0138352315,0.013907962000000001,0.013962067,0.014088122,0.014189677999999994,0.014241953999999992,0.014298043,0.014488533],"832":[1.4188e-05,1.4265666666666666e-05,1.4367230000000001e-05,1.4409119999999999e-05,1.442669e-05,1.443897e-05,1.4479020000000001e-05,1.4667709999999999e-05,1.468579e-05,1.470077e-05,1.4701099999999999e-05,1.4793169999999999e-05,1.4811780000000001e-05,1.485385e-05,1.4870790000000001e-05,1.4912000000000001e-05,1.5088440000000001e-05,1.5135450000000001e-05,1.522647e-05,1.5263989999999997e-05],"9437184":[0.55629030400000001,0.55826203799999996,0.55861103599999995,0.55922624750000005,0.56142652999999998,0.56341235899999997,0.56476347800000004,0.56477512549999997,0.56509034400000002,0.5656826385,0.5693672165,0.57139514049999995,0.57148562650000001,0.57289356749999998,0.57337606900000004,0.57479996,0.57546587250000003,0.57910166350000003,0.58221833700000003,0.58227519800000005],"3584":[6.1699999999999995e-05,6.1837500000000006e-05,6.4765755102040812e-05,6.6072139999999997e-05,6.6129000000000003e-05,6.6237448979591837e-05,6.7338434782608704e-05,6.7459434782608698e-05,6.7554709999999993e-05,6.7991673913043486e-05,6.8139999999999995e-05,6.8256099999999999e-05,6.8547479999999999e-05,6.8659454545454547e-05,6.9289730000000004e-05,6.9452738095238085e-05,6.9544700000000005e-05,6.9730319999999993e-05,6.9801879999999999e-05,7.3614093749999995e-05],"6291456":[0.37716729850000003,0.37755688650000002,0.3779382235,0.37816860949999997,0.379945058,0.38025707200000003,0.38051663499999999,0.38338135800000001,0.384018792,0.3840603125,0.38416441600000001,0.3846929825,0.38507289249999999,0.38564805550000003,0.386077002,0.38733636900000001,0.39043530949999999,0.39151578349999999,0.39589924300000001,0.39659913000000002],"256":[4.4097899999999998e-06,4.4391399999999998e-06,4.47146e-06,4.4995199999999996e-06,4.5105500000000004e-06,4.515e-06,4.5620800000000002e-06,4.56382e-06,4.5772699999999998e-06,4.58725e-06,4.5884599999999999e-06,4.6336699999999998e-06,4.6361399999999998e-06,4.6520300000000001e-06,4.6540800000000003e-06,4.7328599999999998e-06,4.7717800000000001e-06,4.8753300000000001e-06,5.1376300000000001e-06,5.1983200000000004e-06],"15204352":[0.897971992,0.90019321099999994,0.90325280149999998,0.9069006355,0.91665305649999995,0.91759065400000006,0.91932409049999997,0.92298196649999997,0.92438857299999999,0.92727799850000003,0.93169957800000003,0.94021245549999999,0.94037685100000001,0.94315327900000001,0.94391602549999998,0.94931021699999996,0.95002425999999995,0.95577947900000004,0.95940666399999996,0.97658636099999996],"28672":[0.00052653400000000016,0.00053528900000000021,0.000537624,0.00054010499999999982,0.00054223587500000004,0.00054607966666666663,0.000546328,0.00054649900000000009,0.00054679299999999974,0.00054796400000000007,0.00054922983333333347,0.00055093599999999992,0.00055197452941176475,0.00055916600000000016,0.00056085262500000003,0.00056395717647058827,0.00056726964705882332,0.0005675654117647059,0.00056833941176470594,0.0005773955882352941],"768":[1.4246999999999999e-05,1.436e-05,1.4462e-05,1.46729e-05,1.4781020000000001e-05,1.47835e-05,1.4839192307692307e-05,1.490436e-05,1.5054897435897436e-05,1.509902e-05,1.5152209999999999e-05,1.5221970000000001e-05,1.530578e-05,1.5311999999999998e-05,1.5426699999999999e-05,1.5494260869565215e-05,1.5541660000000001e-05,1.5543260000000001e-05,1.6110333333333334e-05,1.6206359999999998e-05],"212992":[0.0042976779999999975,0.0043454165000000001,0.0043933060000000022,0.0044000124999999998,0.0044039365000000021,0.0044191434999999984,0.0044527170000000001,0.0044553845000000003,0.0044920179999999987,0.0045256999999999997,0.0045961275000000008,0.0046000805000000001,0.0046922100000000005,0.0050053300000000023,0.0050451339999999997,0.0050564970000000001,0.0051170759999999999,0.0051176639999999975,0.0053441780000000015,0.0058169820000000001],"864":[1.4652e-05,1.4805e-05,1.4844428571428572e-05,1.5165910000000001e-05,1.5184980000000001e-05,1.5239970000000001e-05,1.5273830000000001e-05,1.5324509999999999e-05,1.5348519999999999e-05,1.5361059999999998e-05,1.5393999999999999e-05,1.541276e-05,1.543228e-05,1.5506210000000001e-05,1.552402e-05,1.553219387755102e-05,1.5570580000000002e-05,1.5652149999999999e-05,1.576293e-05,1.579867e-05],"352":[6.1180599999999997e-06,6.1628300000000001e-06,6.237934782608695e-06,6.2901929824561396e-06,6.2902300000000008e-06,6.2980399999999999e-06,6.3545699999999997e-06,6.3924399999999994e-06,6.4263749999999999e-06,6.44438e-06,6.48251e-06,6.5145500000000002e-06,6.5691299999999999e-06,6.6142299999999997e-06,6.6266899999999997e-06,6.7235066666666669e-06,6.9295000000000003e-06,7.3095400000000003e-06,7.3764800000000007e-06,7.4819999999999997e-06],"253952":[0.0054033809999999996,0.0054097450000000023,0.0054839419999999986,0.0055067409999999999,0.0055073850000000018,0.0055091530000000001,0.005602554,0.0056070350000000015,0.0056333030000000027,0.0056932739999999999,0.0057199959999999512,0.0059550009999999997,0.006050568000000001,0.0060730130000000012,0.0060907849999999996,0.0060909100000000006,0.0061122829999999996,0.0061933190000000009,0.006200246999999999,0.0066489190000000014],"960":[1.6629666666666668e-05,1.6763265306122451e-05,1.6852000000000001e-05,1.712825e-05,1.7220779999999998e-05,1.7226649999999999e-05,1.7283509999999999e-05,1.7323e-05,1.7360959999999999e-05,1.7366120000000001e-05,1.738073e-05,1.739236e-05,1.7436450000000001e-05,1.7459409999999998e-05,1.7498499999999999e-05,1.7578590000000001e-05,1.774931e-05,1.78267e-05,1.7837800000000001e-05,1.7871510000000001e-05],"24576":[0.00052802800000000026,0.00052892300000000015,0.000530876,0.00054186000000000002,0.00054877780000000002,0.00055040199999999986,0.00055208000000000004,0.00055245471428571431,0.00055383394117647052,0.00055687499999999997,0.00056141594117647053,0.00056183729411764694,0.00056208499999999982,0.00056249452941176472,0.00056344893749999997,0.00056514311764705881,0.00056537335294117659,0.00056663829411764696,0.00056816700000000017,0.00060848866666666666],"7680":[0.00013782599999999996,0.000142509,0.000142752,0.00014295399999999999,0.00014423700000000005,0.00014608733333333333,0.00014621959090909087,0.00014666665625,0.00014785999999999996,0.00014834200000000004,0.00014852868253968315,0.00014863174626865671,0.00014967534920634927,0.0001497415873015873,0.00015020799999999996,0.000150822,0.0001511855,0.0001528991111111111,0.00015421737288135595,0.00015820300000000004],"294912":[0.0066208819999999972,0.0066549399999999998,0.0066671880000000001,0.0066745219999999978,0.0066941019999999987,0.0067169279999999996,0.0067308380000000029,0.0067454009999999998,0.006745613999999997,0.006769499,0.006788138,0.0068008670000000021,0.0068549319999999985,0.0068718709999999973,0.007214916,0.0072229990000000008,0.0073398459999999997,0.007454469,0.0076808029999999999,0.0083011409999999997],"1048576":[0.029597386,0.030102598000000001,0.030582618999999998,0.031082890000000002,0.031231937499999994,0.03179353699999999,0.032015619000000002,0.032357934500000012,0.032386190499999981,0.032746682499999999,0.032916143999999994,0.03327754799999999,0.033455697,0.033675518499999987,0.033931107499999981,0.034077926500000001,0.034256364999999983,0.035714335999999992,0.037387273999999998,0.041013017999999998],"10485760":[0.64629196649999998,0.65050864200000003,0.65107931600000002,0.65198319100000002,0.65390407049999999,0.65402705049999998,0.65469222100000002,0.65470444650000004,0.65556170550000004,0.65643915400000008,0.65742173449999997,0.65791958900000003,0.66280686799999999,0.6631092475,0.6632660145,0.66502169450000004,0.66527919199999996,0.66779389900000008,0.66816797500000003,0.71035746799999999],"344064":[0.0080921559999999997,0.0081309590000000018,0.0081883069999999971,0.0082119540000000022,0.0082365800000000003,0.008287476999999998,0.0083096504999999998,0.0083272349999999988,0.008379333999999997,0.008439001000000005,0.0085866999999999992,0.0086251479999999957,0.008746027,0.0088729759999999977,0.008972453,0.0090344469999999993,0.009149125000000001,0.0093731294999999971,0.0096716574999999982,0.010118041000000003],"288":[4.88556e-06,4.8907599999999996e-06,4.9253500000000002e-06,4.9678899999999996e-06,4.9893300000000002e-06,5.0562800000000005e-06,5.0565500000000007e-06,5.0718899999999998e-06,5.1149900000000003e-06,5.1515700000000004e-06,5.1699799999999999e-06,5.1752500000000001e-06,5.1782300000000002e-06,5.2278000000000002e-06,5.2738899999999997e-06,5.2836399999999999e-06,5.3499999999999996e-06,5.8788799999999992e-06,5.9280200000000004e-06,5.9388699999999996e-06],"1152":[2.0628000000000003e-05,2.0988e-05,2.1097499999999999e-05,2.1109999999999999e-05,2.1611159999999998e-05,2.1676666666666669e-05,2.1895370000000002e-05,2.1920999999999999e-05,2.2005333333333331e-05,2.2138069999999999e-05,2.2158999999999999e-05,2.2199440000000002e-05,2.223384e-05,2.2338280000000001e-05,2.2699069999999999e-05,2.2738659999999997e-05,2.3238949999999999e-05,2.3279680000000002e-05,2.340557e-05,2.4432099999999999e-05],"384":[6.5853768115942033e-06,6.733125e-06,6.8363699999999999e-06,6.8655900000000001e-06,6.9007777777777772e-06,7.0190300000000005e-06,7.0202600000000001e-06,7.0266599999999997e-06,7.0378499999999999e-06,7.0646282051282059e-06,7.0826600000000006e-06,7.1126100000000002e-06,7.1230000000000002e-06,7.1874400000000003e-06,7.1876999999999998e-06,7.27677e-06,7.3344899999999991e-06,7.3499300000000001e-06,7.4283400000000008e-06,7.6721999999999992e-06],"2304":[4.2784999999999998e-05,4.3212346153846153e-05,4.3987399999999998e-05,4.4212000000000003e-05,4.4368826086956523e-05,4.4378888888888887e-05,4.4482730000000002e-05,4.4529569999999992e-05,4.4619290000000001e-05,4.475266e-05,4.4813636363636366e-05,4.4839000000000002e-05,4.5271119999999996e-05,4.5341479999999998e-05,4.5418569999999997e-05,4.5517760000000004e-05,4.561331e-05,4.57866e-05,4.6451219999999995e-05,4.6519339999999996e-05],"896":[1.5336666666666668e-05,1.5634189999999999e-05,1.5663666666666667e-05,1.56681e-05,1.586662e-05,1.5896739999999999e-05,1.5937740000000001e-05,1.5946809999999999e-05,1.5987530000000001e-05,1.5991e-05,1.5991270000000002e-05,1.6034049999999999e-05,1.6048359999999998e-05,1.60697e-05,1.6123549999999999e-05,1.6193999999999998e-05,1.63528e-05,1.6730440000000001e-05,1.6751129999999998e-05,1.676655e-05],"480":[8.1717800000000006e-06,8.2032307692307688e-06,8.2609999999999993e-06,8.3021999999999999e-06,8.3249500000000007e-06,8.351520000000001e-06,8.4097599999999993e-06,8.4778500000000005e-06,8.4800000000000001e-06,8.4910200000000002e-06,8.5213499999999993e-06,8.5274999999999992e-06,8.5851300000000006e-06,8.5946799999999995e-06,8.6236899999999994e-06,8.6252e-06,8.6463999999999991e-06,8.8531199999999997e-06,9.1481800000000002e-06,9.2141300000000008e-06],"1441792":[0.048640172999999988,0.049106183499999997,0.049161586,0.049203703000000001,0.049247784000000003,0.049266719,0.049601992000000004,0.049769975500000001,0.050040998000000003,0.050946167000000007,0.050966782000000002,0.051108789000000009,0.051321216000000003,0.052744784000000003,0.054099273000000003,0.0553283475,0.055514050500000002,0.056321080999999981,0.058773602000000001,0.061583368499999992],"992":[1.7133999999999999e-05,1.7210999999999998e-05,1.7368999999999999e-05,1.7386043478260871e-05,1.7618500000000001e-05,1.792076e-05,1.8037789999999998e-05,1.8123779999999999e-05,1.8163809999999998e-05,1.8197299999999999e-05,1.828318e-05,1.8334829999999998e-05,1.8338769999999999e-05,1.838077e-05,1.843822e-05,1.851871e-05,1.8669010000000001e-05,1.8753180000000001e-05,1.8821464285714287e-05,2.0666149999999999e-05],"3968":[7.0744499999999993e-05,7.0760999999999996e-05,7.0875000000000002e-05,7.4547000000000003e-05,7.4915999999999999e-05,7.5647240000000006e-05,7.6438440000000006e-05,7.6988035714285725e-05,7.6990178571428565e-05,7.7006519999999997e-05,7.7147369999999997e-05,7.7363889999999992e-05,7.7471000000000004e-05,7.7847319999999997e-05,7.8178320000000005e-05,7.8264930000000006e-05,7.8330384615384616e-05,7.9140159999999989e-05,7.9688347826086957e-05,8.3384294117647053e-05],"6400":[0.000110636,0.00011267700000000001,0.000113503,0.00011419266666666666,0.00011438131764705882,0.000114944,0.0001150075,0.00011565858333333332,0.0001157535,0.00011707908974358972,0.00011762356626506027,0.00011780496428571425,0.00011862900000000001,0.00011871843589743589,0.000119084,0.00011985,0.00012042199999999999,0.00012059375,0.000120685,0.00012382579452054795],"1344":[2.5248500000000001e-05,2.6051906249999999e-05,2.6111289999999998e-05,2.6226969999999999e-05,2.6690509999999999e-05,2.6745010000000003e-05,2.6834689999999998e-05,2.69e-05,2.6944000000000002e-05,2.6978810000000001e-05,2.6995499999999999e-05,2.7129929999999998e-05,2.7222000000000001e-05,2.7242719999999997e-05,2.7271639999999998e-05,2.7387199999999998e-05,2.7436850000000001e-05,2.8089209999999999e-05,2.816836e-05,2.84559e-05],"126976":[0.0026580700000000002,0.0026582986666666671,0.0026583863333333336,0.0026587376666666672,0.0026667583333333336,0.0026682506666666672,0.002700220000000001,0.0027043916666666667,0.002707210666666667,0.0027074833333333333,0.0027116786666666671,0.0027121609999999998,0.0027149946666666668,0.0027332433333333334,0.0027375579999999993,0.0029364973333333333,0.0029492849999999998,0.0029720266666666668,0.0030062566666666669,0.0032433360000000007],"2883584":[0.13748724800000001,0.138275274,0.13885876599999999,0.139824371,0.14027387450000001,0.14142812499999999,0.141433065,0.141482886,0.14170970299999999,0.14184898600000001,0.14218660999999999,0.142418299,0.14365204600000001,0.143740374,0.144435336,0.14578716999999999,0.14586323000000001,0.149967772,0.1511206175,0.1572997045],"753664":[0.019746839499999998,0.020167304,0.020261900000000006,0.020279901000000003,0.020323531499999999,0.020355009,0.020411161000000001,0.020419641999999998,0.020430839499999999,0.020520692,0.020522611500000003,0.020614882500000001,0.020664439,0.020942254,0.020956038999999996,0.021019824500000003,0.022835817499999998,0.024959739000000002,0.025981263500000001,0.026813429999999999],"16384":[0.00030401099999999986,0.00030904066666666665,0.00030945300000000001,0.00030951399999999999,0.000310957,0.00031305012500000009,0.00031709000000000002,0.00031734999999999999,0.000318039,0.0003203848,0.00032116800000000015,0.000323321,0.00032422025000000004,0.00032516964285714278,0.00032661099999999998,0.0003275869999999999,0.00033219674999999992,0.00033395575862068969,0.00033983400000000012,0.000342312],"131072":[0.0027603569999999989,0.0027716673333333338,0.0027728803333333342,0.0027770616666666676,0.0027851579999999998,0.0027923836666666657,0.0028234129999999994,0.0028382073333333329,0.0028424036666666657,0.0028506013333333318,0.0028577666666666666,0.0028784259999999999,0.00289362,0.002974661,0.0030005420000000006,0.0030181270000000002,0.0030300925,0.0030448834999999988,0.0033233710000000007,0.0035309989999999999],"458752":[0.010252649499999999,0.010320576500000001,0.0105033865,0.0105179425,0.010518537499999996,0.010553096499999999,0.0105757525,0.0105770945,0.010582194,0.0105912995,0.0106136905,0.010657456000000001,0.0106642535,0.010675934,0.010678591000000001,0.0106957765,0.010880023500000002,0.010908437,0.010955118999999999,0.010960164],"172032":[0.0039211794999999983,0.0039653100000000014,0.0039939729999999996,0.0040106385000000001,0.004028238,0.0040421789999999999,0.0040475365000000015,0.0040611750000000002,0.0040618140000000004,0.0041132019999999981,0.0041610624999999998,0.0041708634999999984,0.0041841449999999985,0.0041889444999999997,0.0043204819999999996,0.0043569065000000004,0.0043846149999999997,0.0043848490000000014,0.0045855840000000019,0.0049147919999999986],"12288":[0.00026153900000000009,0.00026172800000000013,0.00026208900000000007,0.00026446033333333332,0.000265407,0.00026783599999999987,0.000272682,0.00027403322857142857,0.000274741,0.00027506167647058826,0.000276001,0.00027623477142857145,0.0002769400000000001,0.00027914840625000001,0.00028097099999999998,0.00028290094117647057,0.00028392899999999998,0.00028569636363636364,0.00028673676470588238,0.00028765399999999993],"14680064":[0.85959019149999993,0.86025439400000003,0.86272459400000001,0.86570919999999996,0.86781117900000004,0.87166951849999996,0.87657682700000006,0.87843834900000006,0.87892118699999999,0.87909621999999998,0.88195373399999999,0.88392746700000002,0.89060682049999995,0.8939858235,0.89459874499999992,0.89971099050000003,0.90307118350000004,0.90988992400000002,0.91887504149999999,0.92566750500000006],"1536":[3.0735799999999998e-05,3.1804770000000002e-05,3.1945e-05,3.1961030000000003e-05,3.2092019999999998e-05,3.2161520000000002e-05,3.2214079999999999e-05,3.2238789999999851e-05,3.2268250000000001e-05,3.2449340000000004e-05,3.248174e-05,3.2512999999999999e-05,3.262636e-05,3.2924240000000002e-05,3.3078540000000001e-05,3.3104590000000001e-05,3.3171271739130436e-05,3.3355220000000004e-05,3.4009320000000001e-05,3.4195819999999997e-05],"25600":[0.000440605,0.000442705,0.00045908400000000012,0.00045909400000000001,0.00046196400000000004,0.00046465100000000022,0.00046497699999999994,0.00046858414285714286,0.00046897749999999993,0.00047018199999999998,0.00047211484999999979,0.00047470100000000001,0.00047522599999999987,0.00047693610526315785,0.00047759795000000001,0.00047941025000000002,0.00048365226315789467,0.00048604999999999986,0.0004878900000000001,0.00049738800000000019],"1835008":[0.071202245999999983,0.071802974000000033,0.072592745,0.073017734000000001,0.073051340999999978,0.074040794500000007,0.0744892365,0.074947023500000001,0.075382428499999973,0.076107018499999998,0.076200826499999971,0.076332912500000016,0.076927465,0.076998703000000002,0.077538336499999999,0.077909240000000018,0.07797946900000001,0.07820903450000001,0.07984536099999999,0.082633861000000003],"10752":[0.000216763,0.00021855599999999988,0.0002187565,0.00021935799999999987,0.000221027,0.00022224700000000002,0.00022763900000000002,0.00022787250000000001,0.00022944299999999991,0.00022967019512195125,0.000230048,0.00023099399999999999,0.00023113441860465124,0.00023221599999999999,0.0002340193846153847,0.00023534200000000001,0.00023694166666666668,0.00023943733333333335,0.000243086,0.00024332500000000002],"21504":[0.00044014800000000012,0.00045799999999999997,0.000461676,0.00046257957142857152,0.00046266999999999993,0.00046287900000000024,0.00046365009523809537,0.00046463900000000004,0.00046499699999999998,0.00046503380000000022,0.00046518700000000004,0.00046723849999999987,0.00046728165000000022,0.00047339010526315786,0.00047375890000000021,0.00047830599999999985,0.0004783155,0.00048044845000000001,0.0005220750000000001,0.00054134777777777791],"7602176":[0.41579337449999998,0.41616818099999997,0.41896795100000001,0.42083317349999999,0.42154967650000003,0.42187074950000003,0.42208821099999999,0.422390084,0.42282827300000003,0.42441108150000001,0.42593268200000001,0.42801431349999997,0.42804316200000003,0.42917580599999999,0.43151148,0.431909665,0.43271978649999998,0.43961157899999997,0.44066981300000002,0.44248907100000001],"5632":[0.00011386966666666666,0.000116425,0.00011709000000000001,0.000117728875,0.000118279,0.00011881066666666665,0.00011962,0.00012166568831168836,0.000121989,0.000122223,0.00012294812987012987,0.00012315961764705881,0.00012318717948717946,0.000123208,0.00012324499999999999,0.00012469272463768114,0.0001250809736842105,0.00012532989610389617,0.00012571300000000001,0.00013593550000000001],"10":[2.9845999999999999e-07,2.9980000000000002e-07,3.0046999999999999e-07,3.0069999999999999e-07,3.0227999999999998e-07,3.0543e-07,3.0706e-07,3.1005e-07,3.1156999999999998e-07,3.1169000000000001e-07,3.1169000000000001e-07,3.1391999999999999e-07,3.1822e-07,3.1827e-07,3.1884999999999997e-07,3.2178000000000001e-07,3.2697999999999998e-07,3.2880999999999999e-07,3.3052999999999998e-07,3.3234000000000002e-07],"3145728":[0.157319027,0.15825974700000001,0.15895538000000001,0.15977421050000001,0.1606100405,0.160733127,0.16179924849999999,0.16189082700000001,0.16245976400000001,0.16267714950000001,0.162905086,0.1645790865,0.16551844299999999,0.16733891400000001,0.16800903499999997,0.16978795399999999,0.16997188499999999,0.17263094849999999,0.17286138649999999,0.176192497],"245760":[0.00516286,0.0052031150000000003,0.0052111620000000001,0.0052269650000000001,0.0052273289999999976,0.0052302760000000016,0.0052319569999999998,0.0052319569999999998,0.0052421280000000004,0.0052583580000000003,0.0052870109999999994,0.005325744000000002,0.0057231900000000004,0.0057957749999999978,0.0058887360000000003,0.0059971130000000001,0.0059978030000000012,0.0059997749999999997,0.0060071560000000022,0.006759376999999997],"1728":[2.9091500000000001e-05,2.9615583333333331e-05,2.9736000000000001e-05,2.977108333333333e-05,3.024090909090909e-05,3.0714579999999998e-05,3.0802200000000001e-05,3.0852190000000002e-05,3.0853389999999998e-05,3.0919469999999999e-05,3.0976979999999997e-05,3.1002857142857145e-05,3.1019319999999998e-05,3.106711e-05,3.126414e-05,3.1448090000000001e-05,3.1455519999999999e-05,3.1775469999999999e-05,3.2502333333333336e-05,3.2537560000000002e-05],"11":[3.1300999999999997e-07,3.1315000000000002e-07,3.1361000000000001e-07,3.1506000000000002e-07,3.1622999999999997e-07,3.1696000000000005e-07,3.1703999999999999e-07,3.1749999999999998e-07,3.1776000000000001e-07,3.2253999999999998e-07,3.2599999999999998e-07,3.2698999999999999e-07,3.2802999999999995e-07,3.3033000000000002e-07,3.3884999999999999e-07,3.4444999999999999e-07,3.4542000000000003e-07,3.4777000000000005e-07,3.7084e-07,3.7688000000000002e-07],"1114112":[0.032684699999999983,0.033119382500000003,0.033180409000000001,0.033428272000000009,0.033780799,0.033808729499999982,0.034212561500000002,0.034242906500000017,0.034361560499999999,0.034490129500000001,0.034734932500000003,0.035214869500000009,0.036620347499999997,0.037270692000000015,0.037776646000000004,0.037984925500000002,0.038055008500000001,0.039456990000000004,0.040006364000000003,0.040438099500000019],"12":[3.2960000000000004e-07,3.3009000000000001e-07,3.3405999999999996e-07,3.3445999999999999e-07,3.3661999999999995e-07,3.3726999999999995e-07,3.4097999999999997e-07,3.4102000000000002e-07,3.4196000000000003e-07,3.4298999999999998e-07,3.4480000000000002e-07,3.4498000000000001e-07,3.4766999999999999e-07,3.5030000000000001e-07,3.5308000000000004e-07,3.5494999999999999e-07,3.5908999999999997e-07,3.6115000000000003e-07,3.6891000000000004e-07,3.8967000000000002e-07],"7340032":[0.39286849000000001,0.3977434675,0.39845225649999999,0.39939298049999999,0.4003427275,0.40048007400000002,0.40115712250000002,0.40124979199999999,0.40217570899999999,0.40433139499999998,0.40487527550000002,0.4054729735,0.40724341900000005,0.407449907,0.40841639099999999,0.40991726550000002,0.410762815,0.41316075949999997,0.41354715600000003,0.41472178900000001],"7168":[0.000124683,0.00012515199999999998,0.000127401,0.000128892,0.000130624,0.00013136066666666671,0.00013180399999999999,0.00013181466666666668,0.00013229960000000004,0.00013324122222222218,0.00013493273913043482,0.00013551990277777773,0.00013592999999999995,0.00013729000000000004,0.00013747980597014924,0.00013759489855072465,0.0001376280000000001,0.00013853299999999996,0.00013955373529411764,0.00013984800000000001],"13":[3.7938999999999996e-07,3.8974000000000005e-07,3.9015999999999999e-07,3.9060999999999998e-07,3.96e-07,3.9694000000000001e-07,3.9975000000000002e-07,4.0643999999999998e-07,4.0699999999999998e-07,4.0712000000000001e-07,4.0779999999999999e-07,4.0997000000000001e-07,4.1068000000000002e-07,4.1325000000000002e-07,4.2067000000000002e-07,4.2524999999999997e-07,4.2877000000000005e-07,4.3020999999999999e-07,4.3277999999999999e-07,4.4922e-07],"6029312":[0.35137935549999999,0.35162020449999998,0.35217884700000002,0.35345753349999998,0.35389080299999998,0.35449336050000002,0.35888762949999997,0.35952412249999999,0.3600143435,0.36054256699999998,0.36178853050000004,0.36201579649999999,0.36237556849999997,0.36249574949999996,0.36422437899999999,0.36515265549999998,0.36610643200000004,0.3665185715,0.36850543749999998,0.370331454],"14":[3.9355999999999999e-07,4.023e-07,4.0288999999999998e-07,4.0392999999999999e-07,4.0565999999999999e-07,4.0673000000000004e-07,4.0880999999999997e-07,4.0891999999999999e-07,4.1486e-07,4.2289e-07,4.2597e-07,4.2899999999999999e-07,4.2925000000000001e-07,4.2945833333333332e-07,4.3083e-07,4.3976000000000001e-07,4.4320999999999996e-07,4.4387000000000002e-07,4.4691000000000002e-07,4.6551000000000004e-07],"3200":[5.6521999999999999e-05,5.7093769999999997e-05,5.7361809999999998e-05,5.7621300000000003e-05,5.7748380000000003e-05,5.7867409999999995e-05,5.7914180000000007e-05,5.8042320000000006e-05,5.8083749999999638e-05,5.8285716417910444e-05,5.8453199999999998e-05,5.8454930000000004e-05,5.8463120000000001e-05,5.8915490000000001e-05,5.9015104477611936e-05,5.9367388059701495e-05,6.0126666666666661e-05,6.0623749999999997e-05,6.1272619999999995e-05,6.2393574074074069e-05],"20":[4.8752000000000001e-07,4.9298999999999992e-07,4.9407999999999993e-07,4.9442e-07,4.9643999999999996e-07,4.9981999999999999e-07,5.0561000000000004e-07,5.0867999999999997e-07,5.1223000000000003e-07,5.1368000000000003e-07,5.1735999999999997e-07,5.1813000000000005e-07,5.1910000000000004e-07,5.2364999999999995e-07,5.2366000000000002e-07,5.2455000000000002e-07,5.2839999999999999e-07,5.3356000000000002e-07,5.4639000000000001e-07,5.5135999999999998e-07],"204800":[0.0041261229999999998,0.0041390680000000001,0.00413964,0.0041705459999999998,0.0042045680000000005,0.0042053660000000003,0.0042198840000000001,0.0042205580000000001,0.0042306570000000031,0.0043081699999999983,0.00433315,0.0043648965000000024,0.0043945974999999998,0.0047340759999999985,0.004746948,0.004772498,0.0048576009999999996,0.0050616679999999983,0.0050641489999999996,0.0061013870000000015],"15":[4.1558999999999998e-07,4.1739999999999997e-07,4.1799e-07,4.1869999999999996e-07,4.2052000000000001e-07,4.2084e-07,4.3124000000000004e-07,4.3420000000000001e-07,4.3539999999999999e-07,4.3590000000000003e-07,4.4332000000000003e-07,4.4348000000000005e-07,4.4731e-07,4.4901999999999998e-07,4.5731000000000001e-07,4.5856999999999996e-07,4.5974999999999997e-07,4.6083999999999999e-07,4.6211999999999996e-07,4.6708000000000002e-07],"13312":[0.00022963550000000007,0.00023705200000000002,0.00023967925,0.00023970799999999999,0.00024047033333333333,0.00024059800000000002,0.000240642,0.00024131508333333335,0.000241971,0.00024329399999999994,0.00024480949999999992,0.00024512839473684206,0.00024668074999999992,0.00024700618918918919,0.00024853855263157892,0.00025046613157894731,0.00025261433333333345,0.00025272599999999988,0.000254324,0.00025446294594594593],"4980736":[0.25798798649999999,0.26140910299999998,0.26178556949999998,0.26270054100000001,0.26295165200000004,0.26359452699999997,0.26514817299999999,0.2657401875,0.26586344449999999,0.26589622499999999,0.26674122150000001,0.26815433550000001,0.26958305049999998,0.27002706999999998,0.27118453850000002,0.27138181900000002,0.27138521399999999,0.27493561700000002,0.27775994900000001,0.28041699149999999],"118784":[0.0024250459999999993,0.0024378299999999998,0.002443621,0.0024524149999999999,0.0024720639999999995,0.0024820799999999998,0.0024913653333333324,0.0024917556666666672,0.002497651,0.0025041849999999999,0.0025299443333333328,0.0025308343333333332,0.0025375756666666666,0.0025401876666666674,0.0026773879999999993,0.0027454586666666668,0.0027475960000000002,0.0028449906666666671,0.0028570196666666665,0.0028574170000000105],"51200":[0.00093027699999999997,0.00094314900000000044,0.00094565900000000006,0.00095722270000000065,0.00095750999999999996,0.00095992190000000006,0.00096838600000000044,0.00096858440000000023,0.00097557170000000008,0.00098087099999999948,0.00098240029999999948,0.00098368888888888863,0.00098811100000000028,0.00099313622222222233,0.00099959155555555575,0.0010003346666666668,0.0010049638888888887,0.0010126337777777775,0.0010253001111111112,0.001036885],"16":[4.3560999999999997e-07,4.3819999999999999e-07,4.4392999999999998e-07,4.4799000000000003e-07,4.4984000000000001e-07,4.5209000000000002e-07,4.5278000000000001e-07,4.5531000000000002e-07,4.6133000000000002e-07,4.616e-07,4.6175999999999997e-07,4.6288999999999998e-07,4.6384e-07,4.6498000000000003e-07,4.7304000000000001e-07,4.7341e-07,4.7586000000000003e-07,4.7749999999999998e-07,4.8123000000000003e-07,4.8166000000000004e-07],"21":[5.0343999999999996e-07,5.0967999999999994e-07,5.1030000000000001e-07,5.1196999999999994e-07,5.1437999999999998e-07,5.1465000000000002e-07,5.1870999999999996e-07,5.1882000000000004e-07,5.2331999999999995e-07,5.3466e-07,5.3486000000000001e-07,5.3537000000000001e-07,5.3671000000000005e-07,5.3891e-07,5.4062962962962963e-07,5.4305999999999999e-07,5.4715999999999998e-07,5.4790999999999993e-07,5.6237999999999998e-07,5.6289999999999994e-07],"917504":[0.024633551,0.024813516000000001,0.024849659500000006,0.024982272,0.025150691499999999,0.025437218000000001,0.025895992,0.025902607500000008,0.025982794,0.028038455,0.028436692499999999,0.029222635,0.02944781099999999,0.029549302,0.029974657500000002,0.029999384,0.032355947500000017,0.0325574,0.032979666000000026,0.034622839499999988],"22":[5.2766999999999996e-07,5.3002999999999999e-07,5.3050000000000005e-07,5.3336000000000001e-07,5.3364999999999996e-07,5.3776999999999998e-07,5.3847000000000003e-07,5.3926000000000003e-07,5.4168000000000002e-07,5.4521000000000005e-07,5.4537999999999998e-07,5.4603999999999998e-07,5.4692999999999999e-07,5.4756000000000001e-07,5.5255000000000001e-07,5.6828999999999996e-07,5.7072000000000002e-07,5.7217999999999998e-07,5.7769999999999999e-07,5.9837999999999994e-07],"4864":[9.3358999999999998e-05,9.5666545454545451e-05,9.6175000000000007e-05,9.6690571428571423e-05,9.6960999999999995e-05,9.7023999999999998e-05,9.7378000000000002e-05,9.7731774193548398e-05,9.8397333333333334e-05,9.9571229166666667e-05,0.00010028131313131314,0.0001002875806451613,0.00010087770967741935,0.0001009639777777778,0.00010165650549450547,0.00010187533333333332,0.00010189899999999999,0.00010212390476190473,0.0001030499789473684,0.0001030897],"17":[4.3306999999999995e-07,4.4340000000000001e-07,4.4595000000000005e-07,4.4771999999999999e-07,4.4790000000000003e-07,4.5050999999999998e-07,4.5067e-07,4.5182000000000003e-07,4.5207999999999996e-07,4.5502000000000001e-07,4.6463e-07,4.6715000000000005e-07,4.6959000000000001e-07,4.8579000000000001e-07,4.9034999999999999e-07,4.9185e-07,4.9396000000000001e-07,4.9803000000000002e-07,4.9964999999999995e-07,5.0335000000000002e-07],"14848":[0.00026636649999999982,0.00026702200000000001,0.00027433733333333341,0.00027533099999999986,0.00027533700000000001,0.00027715999999999998,0.00027861900000000002,0.00027916520000000002,0.00027924503125,0.00027943890909090907,0.00028003012903225804,0.00028288276470588236,0.00028488999999999999,0.00028531330000000003,0.0002860906176470589,0.00028609600000000001,0.00028832248484848475,0.00028955806060606073,0.00029179,0.00029288099999999983],"23":[5.3384999999999998e-07,5.3619999999999994e-07,5.3669000000000002e-07,5.3714000000000006e-07,5.4311999999999996e-07,5.4427000000000004e-07,5.4483000000000004e-07,5.4766000000000002e-07,5.5278999999999996e-07,5.5820000000000001e-07,5.6369000000000004e-07,5.6408999999999996e-07,5.6512000000000002e-07,5.7018000000000004e-07,5.7097000000000004e-07,5.7484999999999999e-07,5.7488000000000008e-07,5.8108999999999997e-07,5.9904000000000005e-07,6.3427999999999999e-07],"786432":[0.0213518405,0.021430757500000001,0.021449839000000005,0.021451939,0.0214688515,0.021474579000000001,0.021516721999999995,0.021814128500000002,0.0218409725,0.02199384649999999,0.022000137000000003,0.022045187500000004,0.022047559000000001,0.0220793195,0.022082716499999995,0.022271004,0.022306461,0.022824426000000002,0.024258234,0.032833584999999998],"18":[4.5327999999999999e-07,4.6551999999999995e-07,4.6969999999999998e-07,4.7382999999999995e-07,4.7729999999999997e-07,4.8121000000000001e-07,4.82e-07,4.8233000000000001e-07,4.8251e-07,4.8264999999999994e-07,4.8300999999999993e-07,4.8515000000000003e-07,4.8566999999999998e-07,4.8747000000000001e-07,4.8966000000000001e-07,4.8996000000000003e-07,4.9390000000000005e-07,4.9425999999999993e-07,5.0315999999999996e-07,5.1310000000000001e-07],"1638400":[0.061918464000000006,0.061941492000000001,0.062512679000000002,0.062646607500000021,0.063046269000000016,0.063156814000000033,0.063201154999999981,0.063201818000000021,0.063271195999999974,0.063473265500000001,0.063764628999999989,0.064189162500000022,0.065268779999999998,0.065371394999999999,0.065452547000000028,0.066220520000000005,0.066721461499999996,0.068893864000000041,0.069024574000000061,0.069304973000000034],"7864320":[0.42947358299999999,0.43080975649999997,0.43686007049999998,0.43893243500000001,0.43945495600000001,0.44011537499999998,0.44123617250000002,0.44382901800000002,0.4438881455,0.447017795,0.44760262849999999,0.44763977199999999,0.4478222825,0.44977831200000001,0.4498231385,0.45083143149999999,0.45270354699999998,0.456703998,0.45781759950000001,0.46661285250000001],"24":[5.5899999999999996e-07,5.6088999999999994e-07,5.6314e-07,5.6328000000000005e-07,5.6588000000000004e-07,5.6677000000000004e-07,5.6708999999999998e-07,5.6850000000000004e-07,5.7008000000000003e-07,5.7047999999999996e-07,5.7176000000000003e-07,5.7283999999999999e-07,5.8121e-07,5.8292999999999994e-07,5.8454999999999998e-07,5.9969999999999995e-07,6.0169000000000004e-07,6.2365000000000006e-07,6.2628000000000002e-07,7.018e-07],"14155776":[0.81436990900000006,0.81531784500000004,0.81755215250000002,0.82069666450000001,0.82117497950000007,0.82423704549999999,0.82503580600000004,0.82619466899999994,0.82942052550000001,0.83560017600000003,0.83937587699999994,0.844591549,0.84659998700000005,0.8469732445,0.85105855649999995,0.85884651850000004,0.86201119849999996,0.88511678900000001,0.94342657100000005,0.969145759],"19":[4.7521000000000003e-07,4.8046000000000006e-07,4.8063999999999994e-07,4.8324000000000003e-07,4.8449000000000002e-07,4.8956999999999996e-07,4.9023999999999992e-07,4.9182999999999998e-07,4.9192999999999999e-07,4.9477000000000003e-07,4.9737000000000001e-07,5.0686000000000003e-07,5.0810000000000006e-07,5.0941000000000001e-07,5.1419999999999999e-07,5.1452999999999999e-07,5.2552000000000001e-07,5.2666000000000003e-07,5.3257000000000001e-07,5.3860000000000002e-07],"30":[6.4657e-07,6.4938999999999991e-07,6.5374000000000003e-07,6.5415999999999998e-07,6.5529000000000004e-07,6.6072e-07,6.7130000000000004e-07,6.7496999999999991e-07,6.7588000000000004e-07,6.7706e-07,6.8090999999999997e-07,6.8186000000000005e-07,7.0166000000000005e-07,7.0864000000000002e-07,7.1444000000000004e-07,7.1624000000000007e-07,7.4616999999999996e-07,7.5017000000000005e-07,7.5224000000000002e-07,7.5450000000000004e-07],"25":[5.7077999999999998e-07,5.7439e-07,5.7519000000000006e-07,5.7578000000000004e-07,5.7594999999999997e-07,5.7815999999999998e-07,5.8724000000000001e-07,5.8983999999999999e-07,5.9307e-07,5.9755e-07,6.0137999999999995e-07,6.0437999999999996e-07,6.0554999999999997e-07,6.0564000000000002e-07,6.0671000000000001e-07,6.111899999999999e-07,6.2879000000000006e-07,6.3145000000000011e-07,6.3340000000000005e-07,6.6688999999999996e-07],"31":[6.4573999999999996e-07,6.5895999999999991e-07,6.6588999999999999e-07,6.6746000000000002e-07,6.6802000000000002e-07,6.6973999999999996e-07,6.7675000000000002e-07,6.852299999999999e-07,6.8879000000000002e-07,6.9312e-07,6.9410526315789476e-07,6.9475e-07,7.0238000000000002e-07,7.0256000000000001e-07,7.0470999999999996e-07,7.1404000000000001e-07,7.2174000000000006e-07,7.2596999999999993e-07,7.2638999999999998e-07,7.5199999999999996e-07],"1280":[2.3541e-05,2.4129249999999999e-05,2.4147000000000001e-05,2.4728870000000001e-05,2.4811999999999999e-05,2.4834560975609758e-05,2.4852307692307694e-05,2.5028705128205128e-05,2.5045860759493672e-05,2.5166670000000002e-05,2.522103e-05,2.5419354430379748e-05,2.552247e-05,2.5665910000000002e-05,2.5675703703703704e-05,2.5714876712328767e-05,2.579515e-05,2.605269014084507e-05,2.6576260000000002e-05,2.6895312500000001e-05],"26":[5.7108999999999996e-07,5.8928999999999995e-07,5.9410000000000006e-07,5.9623999999999994e-07,5.9889000000000004e-07,5.9974e-07,6.0390000000000005e-07,6.0711000000000004e-07,6.0945000000000005e-07,6.1107999999999994e-07,6.113699999999999e-07,6.1611000000000008e-07,6.1738999999999995e-07,6.2157999999999998e-07,6.2197000000000006e-07,6.2806999999999999e-07,6.2870999999999997e-07,6.3057000000000007e-07,6.3213999999999999e-07,6.4436000000000009e-07],"3932160":[0.183689516,0.18526041600000001,0.1855551765,0.18584508550000001,0.18630197599999998,0.18658804400000001,0.18669225899999997,0.18692629400000005,0.18792977,0.18879936,0.18992325099999996,0.190551478,0.19087412650000002,0.19140877550000002,0.19162002850000001,0.192067298,0.19479980199999999,0.19539605249999997,0.2035415575,0.20735336199999999],"2432":[4.5572999999999999e-05,4.6165000000000003e-05,4.6963730000000001e-05,4.7358679999999996e-05,4.7630999999999998e-05,4.7826969999999999e-05,4.8128770000000004e-05,4.8342999999999994e-05,4.8724666666666664e-05,4.8739869999999995e-05,4.9084268041237114e-05,4.9319469999999999e-05,4.9441560000000002e-05,4.9749190000000001e-05,4.9996679999999994e-05,5.0257119999999998e-05,5.0761385416666671e-05,5.0914000000000001e-05,5.164428395061728e-05,5.3642120000000001e-05],"32":[6.7696999999999995e-07,6.8330000000000009e-07,6.8399999999999993e-07,6.9805999999999999e-07,7.0222000000000005e-07,7.0685999999999991e-07,7.0742999999999998e-07,7.0800000000000004e-07,7.0908999999999995e-07,7.0981000000000003e-07,7.1103999999999999e-07,7.1213000000000001e-07,7.1635000000000003e-07,7.2363999999999999e-07,7.2893999999999996e-07,7.2998999999999993e-07,7.4165000000000003e-07,7.5361999999999999e-07,7.6196000000000003e-07,7.7108999999999995e-07],"27":[5.8462999999999996e-07,5.9688999999999999e-07,6.0546000000000002e-07,6.0999000000000002e-07,6.1921999999999996e-07,6.1961000000000003e-07,6.2183e-07,6.2218000000000003e-07,6.2218999999999999e-07,6.2766e-07,6.2997999999999998e-07,6.3126999999999991e-07,6.4058000000000004e-07,6.4394999999999999e-07,6.5568999999999996e-07,6.5850000000000003e-07,6.6131999999999994e-07,6.6302000000000007e-07,6.7113000000000011e-07,6.8287000000000008e-07],"409600":[0.0087894660000000045,0.0087937109999999992,0.0088610579999999998,0.0088854730000000048,0.0089608239999999974,0.0089895050000000001,0.0089937320000000008,0.0090024759999999988,0.0090528209999999974,0.0091375550000000003,0.0091476749999999992,0.0091604310000000001,0.0091924794999999997,0.0092013080000000053,0.009396593,0.0094224829999999954,0.0097328650000000003,0.0103078465,0.0104735925,0.011411929499999977]}},{"title":"OrderedSet append, reserving capacity","results":{"28":[1.56269e-06,1.6059200000000001e-06],"34":[1.9394200000000001e-06,1.97168e-06],"29":[1.5789800000000001e-06,1.6191400000000001e-06],"40":[2.1121300000000001e-06,2.3411100000000002e-06],"17408":[0.00087557999999999993,0.000937936],"1472":[8.1746430000000003e-05,8.3040000000000005e-05],"112":[5.2455299999999996e-06,5.5016899999999995e-06],"1376256":[0.13837392400000001,0.22280273249999999],"5242880":[0.916466899,0.92042268500000002],"36":[1.9238399999999999e-06,2.12267e-06],"42":[2.3431799999999997e-06,2.5001899999999999e-06],"11534336":[2.1736565909999999,2.1774761140000001],"114688":[0.0058977439999999808,0.006151218],"144":[7.2566600000000001e-06,7.4204399999999995e-06],"38":[2.0886599999999998e-06,2.2816700000000001e-06],"240":[1.144694e-05,1.1511900000000001e-05],"9216":[0.00049036399999999997,0.00049487700000000001],"44":[2.3249699999999998e-06,2.6656599999999999e-06],"1664":[7.9572000000000003e-05,8.0514000000000009e-05],"196608":[0.013564663500000001,0.014576658000000003],"155648":[0.0094021190000000004,0.0095934730000000017],"2816":[0.00015162461290322589,0.00015296528571428572],"50":[2.5392900000000001e-06,2.83925e-06],"2359296":[0.3055486335,0.30969183450000004],"46":[2.4697899999999998e-06,2.7482800000000003e-06],"176":[8.5878699999999991e-06,9.6266666666666671e-06],"52":[2.6617100000000001e-06,2.7621299999999998e-06],"272":[1.2990919999999999e-05,1.3519833333333332e-05],"116":[5.4305099999999998e-06,5.5773800000000005e-06],"47104":[0.0025748486666666661,0.0026373746666666664],"6912":[0.00035282599999999999,0.00035592400000000003],"1856":[8.8970636363636371e-05,9.2678200000000376e-05],"48":[2.61675e-06,2.6541599999999997e-06],"2097152":[0.256715949,0.25784777400000003],"54":[2.7283100000000001e-06,2.8606999999999996e-06],"2031616":[0.22382248199999999,0.24209815400000001],"43008":[0.0022955517499999994,0.0023039584999999994],"60":[3.0638600000000002e-06,3.17802e-06],"30720":[0.0015340110000000001,0.0017204640000000001],"56":[2.81978e-06,3.0093249999999998e-06],"62":[3.0768800000000004e-06,3.16263e-06],"58":[2.9269700000000001e-06,3.0818399999999997e-06],"3014656":[0.48349672500000002,0.51774585200000001],"64":[3.2383200000000001e-06,3.44546e-06],"8388608":[1.38422578,1.389437571],"29696":[0.0013906259999999998,0.0015003641666666667],"216":[1.0443690000000001e-05,1.0464660000000001e-05],"106496":[0.0055377580000000003,0.0055447450000000011],"72":[3.5969799999999999e-06,3.80046e-06],"442368":[0.0277353155,0.030705048499999998],"147456":[0.0084727190000000018,0.008788222],"4456448":[0.67230858900000001,0.67622217200000001],"63488":[0.0032107620000000003,0.0034601359999999999],"38912":[0.001976238,0.0020646060000000005],"68":[3.4832400000000002e-06,3.5877499999999997e-06],"188416":[0.012631211999999999,0.014257628999999999],"248":[1.2234859999999999e-05,1.262665e-05],"80":[4.20009e-06,4.4969600000000001e-06],"2560":[0.000130393,0.00013783266666666665],"34816":[0.0017282040000000005,0.001774926],"3712":[0.00018104000000000001,0.00018664098076923076],"3538944":[0.49259473799999998,0.49668496399999995],"76":[3.8611000000000002e-06,4.2398200000000002e-06],"4194304":[0.59814851400000002,0.60033528299999994],"851968":[0.06241689100000003,0.099730025999999999],"4096":[0.00021307971428571431,0.00021409354347826085],"59392":[0.0029968120000000006,0.0034622874999999998],"84":[4.3683399999999996e-06,4.4463499999999994e-06],"3276800":[0.44366689349999999,0.45169957599999999],"55296":[0.0026873743333333333,0.002758333],"688128":[0.050640777999999997,0.072637011000000001],"8192":[0.00041921356521739143,0.00042168799999999992],"10240":[0.0005416243529411766,0.00059523287499999998],"15872":[0.00075593199999999996,0.0008451185454545452],"92":[5.0015400000000006e-06,5.2503200000000001e-06],"26624":[0.0012680521428571428,0.0013236250000000001],"1792":[8.642075510204082e-05,8.7057625e-05],"11776":[0.00065149799999999992,0.00066180199999999996],"2944":[0.00016240999999999998,0.00017596200000000005],"88":[4.6661600000000001e-06,4.8094000000000001e-06],"22528":[0.0012452267142857142,0.0012808780000000003],"1245184":[0.1154328,0.16588314200000001],"15728640":[2.6474707565000002,2.6984385485],"96":[5.2696600000000003e-06,5.46266e-06],"1984":[9.5499000000000002e-05,0.000102641],"139264":[0.0077097940000000007,0.0081191050000000015],"475136":[0.031191390000000003,0.039661971000000004],"13631488":[2.2436828934999999,2.2995890495000002],"416":[1.9616e-05,2.3442999999999999e-05],"928":[4.5526764705882354e-05,4.7815999999999998e-05],"512":[2.4847000000000001e-05,2.7590030000000001e-05],"18432":[0.00097090911111111147,0.0010586899999999999],"16777216":[2.9339610110000001],"9728":[0.00051092894736842081,0.00052488899999999974],"1769472":[0.20031802300000001,0.21882276099999998],"1703936":[0.18839864750000002,0.20144856450000001],"2048":[0.00010339775,0.00010517666304347823],"14336":[0.000695146,0.00071121199999999991],"448":[2.1456740000000004e-05,2.2066680000000002e-05],"5505024":[0.95125590900000001,0.9548025],"544":[2.7654210000000001e-05,2.7776099999999997e-05],"221184":[0.013217681,0.0135031905],"90112":[0.0052020920000000002,0.0056183840000000318],"640":[3.2973150000000001e-05,3.3031273684210524e-05],"12800":[0.00062568766666666663,0.00063120993333333334],"262144":[0.016483876500000001,0.017823861],"589824":[0.041519251,0.061493144],"884736":[0.068041041999999996,0.102384945],"6144":[0.00032606900000000012,0.00034009900000000007],"1088":[5.4717719512195123e-05,5.4994000000000002e-05],"576":[2.9872000000000001e-05,3.1754000000000001e-05],"160":[8.1014399999999995e-06,8.595519999999999e-06],"672":[3.4594410000000003e-05,3.4947906666666667e-05],"8912896":[1.4730671065000001,1.4945200350000001],"100":[4.7770000000000002e-06,5.0029899999999995e-06],"507904":[0.034656335000000017,0.046058992999999999],"3840":[0.000189051,0.00019281390196078426],"192":[9.7785400000000007e-06,1.0198239999999999e-05],"376832":[0.026560531000000005,0.029778966],"98304":[0.0058347749999999995,0.0059488550000000012],"5376":[0.00029642716666666662,0.00029838827272727269],"94208":[0.0054482490000000005,0.0056565280000000009],"81920":[0.0044099930000000009,0.004564261],"3407872":[0.46517466350000003,0.48073270700000004],"104":[4.8278099999999996e-06,5.1423699999999997e-06],"122880":[0.0064552280000000004,0.006909999],"200":[9.5031200000000002e-06,9.5379599999999997e-06],"163840":[0.0099719940000000014,0.010087383],"4063232":[0.59934769399999999,0.60997654899999998],"5767168":[1.0359259905,1.0456910635000001],"12582912":[2.5671913274999998,4.6586747370000001],"1600":[7.7190133333333331e-05,7.9179799999999997e-05],"136":[6.55258e-06,7.1495399999999993e-06],"232":[1.0765950000000002e-05,1.091006e-05],"7077888":[1.0914518664999999,1.1807627300000001],"86016":[0.0048042710000000006,0.0051689270000000011],"31744":[0.001517514,0.0016145538000000008],"168":[8.302700000000001e-06,9.5233999999999993e-06],"622592":[0.043506318000000002,0.051677589000000003],"108":[5.0183300000000003e-06,5.25676e-06],"327680":[0.0216873065,0.023562013999999999],"2176":[0.00010273422222222225,0.00011212944303797467],"3328":[0.00015777199999999998,0.00018169200000000004],"1":[2.3552999999999999e-07,2.3853000000000001e-07],"2":[2.4092000000000002e-07,2.5067000000000001e-07],"3":[2.7310000000000003e-07,2.7361000000000003e-07],"4":[2.5391999999999999e-07,2.8648000000000001e-07],"7424":[0.00037458100000000002,0.00038129199999999998],"5":[2.8118000000000003e-07,2.8220999999999998e-07],"23552":[0.0013498557142857142,0.0013717810000000003],"6":[2.8883000000000003e-07,2.8923e-07],"61440":[0.003087439,0.003157782],"491520":[0.033162513000000005,0.042465449999999995],"77824":[0.004118540999999999,0.0048767375000000005],"7":[2.7049999999999999e-07,2.974e-07],"8":[2.7957000000000001e-07,3.1139000000000004e-07],"208":[9.9086500000000004e-06,9.9237699999999993e-06],"9":[3.1215e-07,3.1449999999999996e-07],"73728":[0.0039258290000000005,0.0039617020000000001],"304":[1.4432e-05,1.6326543209876544e-05],"400":[2.0475999999999998e-05,2.2384096774193549e-05],"1310720":[0.12865498200000003,0.18402805699999999],"336":[1.6574799999999999e-05,1.861925e-05],"3670016":[0.52200635500000003,0.54297555350000004],"6656":[0.00031349000000000004,0.00032197850000000006],"15360":[0.00076019899999999981,0.00079922500000000009],"432":[2.1228200000000001e-05,2.3305069999999999e-05],"950272":[0.073087083000000011,0.11465036100000001],"655360":[0.048273436999999988,0.06628176500000002],"69632":[0.0035665229999999994,0.0037580875],"11264":[0.00061198259999999994,0.00065449385714285726],"2752512":[0.38246425299999998,0.3851241225],"8126464":[1.3152116905,1.3411844825000001],"27648":[0.0013268948571428568,0.0013836600000000001],"368":[2.0195199999999999e-05,2.024083e-05],"65536":[0.0034551130000000001,0.0035495369999999997],"16252928":[2.7458041729999998,2.7845635519999998],"464":[2.2253339999999999e-05,2.3189190000000001e-05],"1015808":[0.083216072000000002,0.13218870150000001],"3072":[0.00017894494339622645,0.00017937852727272727],"110592":[0.0057718309999999998,0.0062477000000000001],"237568":[0.014648325,0.016066150999999973],"278528":[0.017317579999999999,0.020094207000000003],"496":[2.4655319999999999e-05,2.834e-05],"13107200":[2.1148466904999998,2.1902009480000002],"9961472":[1.7961117520000001,1.8493577015],"5888":[0.00032201999999999996,0.00033970499999999999],"11010048":[2.0168048125000002,2.0556813329999999],"1920":[9.2970870000000006e-05,0.00010780340449438204],"2490368":[0.32485070199999999,0.35303553450000003],"19456":[0.00098515500000000015,0.0010479028888888886],"57344":[0.0028554509999999997,0.0029459960000000002],"1179648":[0.114511408,0.14627715799999996],"4718592":[0.71810697199999995,0.76465254049999998],"360448":[0.025133877999999991,0.025274151000000002],"1572864":[0.178880758,0.19670813100000001],"53248":[0.0025491940000000003,0.002742174],"3456":[0.00016474099999999999,0.000167863],"40960":[0.0021811622500000011,0.0021843925],"4608":[0.00023611867499999999,0.000247370125],"13824":[0.00068009671428571428,0.00070839200000000018],"819200":[0.060277541000000004,0.08178199600000001],"983040":[0.078788926999999981,0.11964664899999999],"8704":[0.00043447800000000013,0.00045484699999999987],"120":[5.5684699999999997e-06,5.6502500000000007e-06],"1024":[5.124691e-05,5.2468421686746983e-05],"49152":[0.0027234209999999997,0.0028700280000000002],"524288":[0.035001480999999994,0.051729272999999999],"45056":[0.0024319379999999994,0.002536459],"229376":[0.014101729,0.015869612000000005],"2688":[0.00013744149999999998,0.00016270099999999999],"152":[7.4497699999999998e-06,7.9420900000000007e-06],"5120":[0.00027283099999999996,0.00028202399999999997],"1507328":[0.15640166,0.25034541100000002],"1216":[6.3260339622641507e-05,6.3866000000000001e-05],"1966080":[0.2277085855,0.25527124400000001],"1900544":[0.21143829850000001,0.27474403400000003],"184":[9.5462400000000013e-06,1.0175789999999999e-05],"7936":[0.00040268179166666674,0.00040605299999999997],"3801088":[0.53932186300000007,0.57620142050000001],"6815744":[1.0905985364999999,1.137038188],"124":[5.9940199999999994e-06,6.8858400000000005e-06],"102400":[0.005345687,0.0053762080000000004],"311296":[0.020719362000000002,0.021908595499999999],"1408":[7.7244590909090913e-05,7.7318320000000003e-05],"393216":[0.028978038500000004,0.033878796000000017],"4352":[0.000219531,0.00022716220930232557],"6553600":[1.022872698,1.1119954445],"20480":[0.0011338494999999997,0.001143003875],"608":[3.0971160000000003e-05,3.5759000000000001e-05],"2228224":[0.27885740049999996,0.28451407549999996],"36864":[0.001932872,0.001950972],"704":[3.6016984615384615e-05,3.704682e-05],"720896":[0.054105375999999997,0.071246461999999983],"800":[3.5914500000000003e-05,3.7005999999999998e-05],"2621440":[0.35539976400000001,0.39060117649999998],"425984":[0.028191866499999996,0.030849986500000003],"32768":[0.0016036939999999997,0.001700392],"12058624":[2.3487833829999998,2.4087081100000001],"128":[6.1961600000000007e-06,6.4830599999999996e-06],"180224":[0.011218655500000001,0.011635026999999997],"224":[1.0595484848484848e-05,1.081984e-05],"736":[3.8107030000000002e-05,3.9310810000000004e-05],"320":[1.615383950617284e-05,1.6929999999999999e-05],"557056":[0.036918035499999995,0.045392353500000003],"832":[4.0975722222222219e-05,4.1760449999999998e-05],"9437184":[1.6460151999999999,1.7247385625],"3584":[0.00018047909803921568,0.00019053400000000007],"6291456":[1.23629407,1.2843229285],"256":[1.1831000000000001e-05,1.28875e-05],"15204352":[2.5375671679999998,2.631277356],"28672":[0.0013894628333333335,0.001531662],"768":[4.0182000000000003e-05,4.4117210000000006e-05],"212992":[0.012940058000000004,0.013008441499999999],"864":[4.3501892857142857e-05,4.4095999999999999e-05],"352":[1.8433290000000001e-05,1.9220666666666667e-05],"253952":[0.0151582035,0.017116466],"960":[4.6799700000000005e-05,4.6812499999999999e-05],"24576":[0.001457198,0.0014660798333333337],"7680":[0.00037949799999999998,0.000391777],"294912":[0.018274761,0.023624958000000001],"1048576":[0.085868664999999983,0.13330423550000001],"10485760":[1.844103407,1.9112696520000001],"344064":[0.023699909999999998,0.028148413000000001],"288":[1.4154e-05,1.4516790000000001e-05],"1152":[5.961368e-05,6.0751500000000003e-05],"384":[2.0360130000000001e-05,2.1005310000000001e-05],"2304":[0.00011946267469879518,0.00012256376543209874],"896":[4.3948310000000001e-05,4.8422499999999999e-05],"480":[2.286579e-05,2.537713e-05],"1441792":[0.14693011950000001,0.223185511],"992":[4.5708999999999999e-05,4.9963999999999998e-05],"3968":[0.00018477000000000001,0.00020489],"6400":[0.00030221300000000002,0.000323362],"1344":[6.7794999999999997e-05,7.2026010000000005e-05],"126976":[0.0067827749999999996,0.0069932620000000001],"2883584":[0.428892367,0.46843309100000002],"753664":[0.058895653000000006,0.077706333000000002],"16384":[0.00081031954545454535,0.00086678699999999972],"131072":[0.0071646369999999997,0.0075371930000000002],"458752":[0.029504427,0.053058063999999995],"172032":[0.010562358000000001,0.011208267000000001],"12288":[0.00069880069230769215,0.00074490858333333321],"14680064":[2.4473831549999998,5.064683123],"1536":[8.7551620000000005e-05,8.922842857142857e-05],"25600":[0.0012161139999999999,0.0012393674285714285],"1835008":[0.19089863400000001,0.20579697549999998],"10752":[0.00058997543749999984,0.00060168599999999993],"21504":[0.0011848623750000003,0.001259455],"7602176":[1.160142276,1.1751491985],"5632":[0.00030428400000000004,0.00031520699999999997],"10":[3.3130999999999997e-07,3.4041000000000002e-07],"3145728":[0.50727082099999998,0.56119051799999997],"245760":[0.014658618999999984,0.015162768],"1728":[8.4010000000000004e-05,9.6357849462365601e-05],"11":[3.0682000000000004e-07,3.0952999999999999e-07],"1114112":[0.093533274499999985,0.14023390250000001],"12":[3.1768999999999998e-07,3.1786999999999997e-07],"7340032":[1.1398588940000001,1.234583365],"7168":[0.00033676425000000012,0.0003649886666666667],"13":[3.4532000000000002e-07,3.8074999999999997e-07],"6029312":[1.1298197885000001,1.1690868590000001],"14":[3.3732999999999996e-07,3.8695999999999997e-07],"3200":[0.00015335239682539683,0.00017032133333333329],"20":[1.1076100000000001e-06,1.2608399999999999e-06],"204800":[0.0119541935,0.012108825],"15":[3.5492e-07,3.7563999999999999e-07],"13312":[0.00063476449999999985,0.00063526700000000001],"4980736":[0.81940666000000006,0.82639328649999999],"118784":[0.0063612919999999993,0.006550481999999999],"51200":[0.0024145440000000002,0.002616494],"16":[9.3656000000000002e-07,1.0472399999999999e-06],"21":[1.1657900000000001e-06,1.3842300000000002e-06],"917504":[0.071522819000000001,0.109690257],"22":[1.2213799999999999e-06,1.3145299999999998e-06],"4864":[0.00024892599999999995,0.00026799984848484846],"17":[1.00768e-06,1.06177e-06],"14848":[0.00070168100000000011,0.00073558100000000002],"23":[1.4432200000000001e-06,1.50691e-06],"786432":[0.064604132499999994,0.084059356500000043],"18":[1.0944799999999999e-06,1.1040599999999999e-06],"1638400":[0.16937105199999999,0.199088442],"7864320":[1.2607096275,1.2684398219999999],"24":[1.35465e-06,1.4430800000000001e-06],"14155776":[2.3289796455,2.415558506],"19":[1.0541899999999999e-06,1.19269e-06],"30":[1.66547e-06,1.6973800000000001e-06],"25":[1.4656200000000001e-06,1.4657142857142858e-06],"31":[1.70547e-06,1.72753e-06],"1280":[6.6468880952380951e-05,6.6773469999999998e-05],"26":[1.4766900000000001e-06,1.5211299999999999e-06],"3932160":[0.56024349549999997,0.58797389349999996],"2432":[0.00011789224999999999,0.00012305899999999996],"32":[1.75518e-06,1.8626800000000001e-06],"27":[1.4852800000000001e-06,1.5452799999999999e-06],"409600":[0.026201952000000001,0.027353991000000001]}},{"title":"std::unordered_map insert, reserving capacity","results":{"28":[3.10224e-06,3.2318600000000001e-06,3.4540900000000002e-06,3.4922000000000002e-06,3.5139900000000003e-06,3.5191299999999999e-06,3.5206056338028172e-06,3.5241299999999998e-06,3.5860999999999999e-06,3.64568e-06,3.6686200000000005e-06,3.6789400000000003e-06,3.70478e-06,3.7076299999999999e-06,3.7676499999999998e-06,3.7769700000000004e-06,3.7899299999999999e-06,3.79633e-06,3.9865199999999996e-06,4.2612599999999999e-06],"34":[3.8306799999999999e-06,3.8512399999999999e-06,3.9931599999999999e-06,4.0633300000000001e-06,4.1947799999999995e-06,4.28038e-06,4.3458500000000001e-06,4.35091e-06,4.3522800000000001e-06,4.3820800000000002e-06,4.3849999999999995e-06,4.3872199999999998e-06,4.4062000000000003e-06,4.4270699999999999e-06,4.4821499999999999e-06,4.5220900000000004e-06,4.53378e-06,4.5376700000000002e-06,4.5625400000000002e-06,4.6125600000000003e-06],"29":[3.3067500000000001e-06,3.3371900000000001e-06,3.39047e-06,3.5762800000000003e-06,3.6084099999999999e-06,3.6370300000000001e-06,3.66911e-06,3.67092e-06,3.7002799999999998e-06,3.7706599999999999e-06,3.8359899999999995e-06,3.8424899999999994e-06,3.8554736842105262e-06,3.9054599999999999e-06,3.9176399999999998e-06,3.9436599999999998e-06,4.0641800000000003e-06,4.0836799999999998e-06,4.1670000000000001e-06,4.4805000000000006e-06],"40":[4.53573e-06,4.5815500000000002e-06,4.8793900000000004e-06,5.0536299999999998e-06,5.0632200000000006e-06,5.1049099999999999e-06,5.1147599999999995e-06,5.1268699999999996e-06,5.1361400000000001e-06,5.1394500000000004e-06,5.2164999999999999e-06,5.2429500000000003e-06,5.26618e-06,5.2927000000000002e-06,5.3033800000000002e-06,5.3354100000000005e-06,5.3460600000000001e-06,5.4269047619047619e-06,5.4735299999999998e-06,5.54996e-06],"17408":[0.002476734,0.002478212,0.0024908463333333328,0.0024914866666666665,0.0025215759999999998,0.0025228029999999992,0.0025319166666666663,0.0025377010000000011,0.0025419743333333334,0.0025526780000000001,0.0025573463333333343,0.0025684190000000002,0.0025715153333333335,0.002587925,0.0026044516666666666,0.002608179,0.0026089993333333339,0.0026342150000000001,0.002639027,0.0027004869999999992],"1472":[0.000199729,0.00020082300000000007,0.00020088000000000001,0.000202492,0.000204954,0.000206319,0.00020655833333333334,0.000207486,0.00020795900000000002,0.00020898646666666658,0.00020947300000000009,0.0002100545,0.00021145956410256414,0.000215532,0.0002162396,0.00021633965116279081,0.000216391,0.00021676099999999991,0.00021697283720930233,0.000220363],"112":[1.3317240000000001e-05,1.4336e-05,1.4387500000000001e-05,1.4717e-05,1.471969e-05,1.481501e-05,1.487574e-05,1.4924e-05,1.5071846153846155e-05,1.5235050000000001e-05,1.5240040000000001e-05,1.531347e-05,1.5345e-05,1.5370069999999998e-05,1.5485770000000001e-05,1.5505720000000001e-05,1.5523220000000002e-05,1.5933489999999998e-05,1.621132e-05,1.6466779999999998e-05],"1376256":[0.55133549999999998,0.55452347549999992,0.55539698900000001,0.56478888100000002,0.56608109049999999,0.57007570799999996,0.57164924399999995,0.57248671650000005,0.57248830849999999,0.57316849950000004,0.57402801049999996,0.57444143650000001,0.57526476500000001,0.57716481399999997,0.57927760849999999,0.58124195200000006,0.58254135600000001,0.594134155,0.59608000500000002,0.6023985945],"5242880":[2.6312201475000001,2.6359490409999999,2.6411247935,2.6412741249999998,2.6479549284999999,2.6480421944999999,2.648337857,2.6518872120000001,2.6519221265000001,2.6539221,2.6551568400000001,2.6565384879999998,2.6605878430000001,2.6608189365000001,2.6649706580000001,2.6660362609999999,2.6667759124999999,2.6683471509999999,2.668874057,2.6690852559999998],"36":[4.0835999999999993e-06,4.2079500000000001e-06,4.2447300000000006e-06,4.4470500000000001e-06,4.5045499999999999e-06,4.5053200000000004e-06,4.5106699999999995e-06,4.5760199999999996e-06,4.6505199999999995e-06,4.6774400000000006e-06,4.67788e-06,4.6887399999999999e-06,4.6982899999999997e-06,4.7303000000000003e-06,4.7908333333333333e-06,4.8076785714285716e-06,4.8375400000000001e-06,4.8746899999999994e-06,4.98676e-06,5.4884499999999999e-06],"42":[4.8508999999999996e-06,5.0250500000000003e-06,5.1107300000000004e-06,5.3227300000000003e-06,5.3439047619047621e-06,5.35003e-06,5.37157e-06,5.37226e-06,5.4288399999999998e-06,5.43285e-06,5.436421052631579e-06,5.4730999999999993e-06,5.4967700000000001e-06,5.4993900000000004e-06,5.50688e-06,5.51969e-06,5.5248000000000009e-06,5.6216899999999992e-06,5.7247076923076923e-06,5.8815600000000003e-06],"11534336":[6.1784240050000001,6.1801327070000003,6.1819384920000005,6.1866144529999998,6.1924754210000001,6.192531035,6.1944328229999996,6.1959611975,6.1997892429999997,6.2058576429999999,6.2083145589999997,6.2086689245000004,6.2138427710000004,6.2142974715000001,6.2177624915000003,6.2239974159999996,6.2289330705000001,6.2292920519999999,6.2300065949999999,6.2565103999999998],"114688":[0.022498147,0.022505642499999999,0.022615692999999999,0.0227363735,0.0228761205,0.022905771499999998,0.023071931,0.023083485000000001,0.0231162595,0.023130189500000002,0.023180174500000001,0.023231648000000001,0.023328040499999998,0.023558260000000001,0.023649255000000001,0.0237975775,0.024551498500000001,0.024835435999999999,0.025237506,0.027523751500000016],"144":[1.7104365079365082e-05,1.8408666666666669e-05,1.8521400000000002e-05,1.8562374999999999e-05,1.857266e-05,1.8631499999999999e-05,1.889435e-05,1.9059420000000001e-05,1.9215499999999999e-05,1.9286770000000001e-05,1.93595e-05,1.9456149999999998e-05,1.9488e-05,1.9544089999999997e-05,1.9618790000000002e-05,1.963314e-05,1.9673999999999998e-05,2.0037290000000001e-05,2.0249090909090909e-05,4.2380766666666666e-05],"38":[4.3334699999999997e-06,4.5550700000000002e-06,4.55888e-06,4.6799699999999997e-06,4.8185200000000002e-06,4.8794999999999996e-06,4.8987704918032788e-06,4.9247399999999999e-06,4.9281599999999994e-06,4.9634199999999995e-06,4.9834100000000003e-06,5.0167799999999994e-06,5.0473559322033895e-06,5.0498399999999997e-06,5.0986100000000005e-06,5.1038899999999997e-06,5.1093600000000003e-06,5.1986100000000004e-06,5.2614500000000003e-06,5.2775699999999997e-06],"240":[3.0367833333333334e-05,3.2140259999999998e-05,3.2209339999999999e-05,3.2481000000000003e-05,3.2685000000000003e-05,3.2806989999999999e-05,3.2827999999999998e-05,3.3037149999999999e-05,3.3090000000000003e-05,3.3143799999999999e-05,3.3324000000000001e-05,3.3504460000000001e-05,3.3565729999999998e-05,3.3770776470588235e-05,3.3806231707317071e-05,3.4054784090909093e-05,3.4544150000000004e-05,3.4659610000000003e-05,3.541894520547945e-05,3.5636890000000004e-05],"9216":[0.001263248,0.0012909589999999999,0.00130091,0.001303572,0.001305147,0.001306733,0.0013268928333333336,0.001329027,0.0013380417142857142,0.001342265,0.001366113142857143,0.001371562,0.0013766726666666665,0.0013777189999999999,0.00138171,0.001384695,0.001421079,0.001433066,0.0014355745,0.001490819],"44":[4.99848e-06,5.0883000000000001e-06,5.4197699999999998e-06,5.5311100000000001e-06,5.5367816091954026e-06,5.60963e-06,5.6390800000000002e-06,5.6490833333333331e-06,5.6566666666666662e-06,5.6748700000000001e-06,5.6810599999999994e-06,5.6812200000000005e-06,5.6840000000000001e-06,5.7779499999999995e-06,5.77981e-06,5.8726299999999999e-06,5.9137000000000007e-06,5.9990700000000003e-06,6.0259333333333336e-06,6.6362500000000002e-06],"1664":[0.00022048200000000001,0.00022162200000000004,0.00022381199999999988,0.00022581199999999999,0.000228039,0.0002326195,0.00023348035714285714,0.00023490387500000004,0.00023545733333333335,0.00023603099999999999,0.00023894618421052625,0.000239285,0.000240113,0.00024027518918918919,0.00024342599999999998,0.00024519445945945942,0.000247304,0.00025623699999999993,0.00025692988888888885,0.0002614218055555556],"196608":[0.042259438999999996,0.042584623500000002,0.042764954000000001,0.043179722000000018,0.04353728199999999,0.043673788499999991,0.044493052999999998,0.044535829500000013,0.044551275999999987,0.044683790500000001,0.045092798000000003,0.045580155500000004,0.046159183499999985,0.046370354000000003,0.046416287000000001,0.046899849,0.046950958499999994,0.047107627999999999,0.047439194999999997,0.048356022000000012],"155648":[0.0322345515,0.033128665500000001,0.033291395500000001,0.033542130000000003,0.033555216499999985,0.033566295500000023,0.033670511,0.033702600499999999,0.033743575499999998,0.033774752999999998,0.033977703999999984,0.034222768000000001,0.034299968,0.034745123000000017,0.034872053,0.035410010999999998,0.03562570000000001,0.03571799749999998,0.038472454000000003,0.050038390499999995],"2816":[0.00037675699999999992,0.000395144,0.00039629999999999988,0.00039676199999999999,0.000398277,0.00039901800000000001,0.00040350629166666671,0.00040369958333333328,0.000406410125,0.00040941363636363639,0.00040967249999999998,0.00041170400000000004,0.00041401000000000008,0.00041731695652173903,0.00041845295454545465,0.000419665,0.00042121730434782606,0.0004247670000000001,0.00043007243478260872,0.00044429440909090918],"50":[5.6237118644067798e-06,6.2210000000000002e-06,6.2678400000000006e-06,6.2764900000000001e-06,6.4029799999999998e-06,6.4187699999999999e-06,6.4319400000000005e-06,6.5426899999999994e-06,6.5474600000000002e-06,6.6113749999999999e-06,6.6260099999999996e-06,6.6566499999999992e-06,6.6877500000000005e-06,6.7088699999999999e-06,6.73241e-06,6.7421299999999998e-06,6.8560227272727277e-06,6.87915e-06,6.9984099999999996e-06,7.5361499999999998e-06],"2359296":[1.0710782459999999,1.0815077555000001,1.082908736,1.0856707720000001,1.089153839,1.091625987,1.0936183820000001,1.0942855840000001,1.0958855249999999,1.096337042,1.0966580335,1.0971882770000001,1.0996875415,1.1042013420000001,1.104359147,1.10459284,1.1050511105,1.1066910084999999,1.1148141579999999,1.1251836980000001],"46":[5.2499199999999992e-06,5.3712599999999995e-06,5.7152300000000003e-06,5.7475399999999999e-06,5.7643333333333334e-06,5.8239299999999998e-06,5.8476666666666674e-06,5.8972199999999998e-06,5.9613299999999996e-06,6.0009099999999994e-06,6.1024999999999996e-06,6.1465000000000004e-06,6.2317299999999995e-06,6.2763300000000008e-06,6.3349200000000007e-06,6.4148700000000006e-06,6.4326099999999999e-06,6.4393100000000002e-06,6.4752899999999998e-06,6.5169999999999996e-06],"176":[2.2729142857142859e-05,2.2785280000000002e-05,2.3351299999999998e-05,2.360754e-05,2.3630710000000001e-05,2.3758660000000001e-05,2.3931529999999998e-05,2.4001069999999998e-05,2.4037489795918366e-05,2.418495e-05,2.441341e-05,2.4520459999999997e-05,2.4551360000000001e-05,2.4605959999999998e-05,2.4729341176470586e-05,2.5152859999999998e-05,2.5305660000000001e-05,2.560278e-05,2.5656129999999999e-05,2.829733e-05],"52":[5.8315e-06,6.3830699999999995e-06,6.5027100000000003e-06,6.5268378378378374e-06,6.5691999999999997e-06,6.7120000000000003e-06,6.8188000000000007e-06,6.8488000000000004e-06,6.8521299999999996e-06,6.8995172413793106e-06,6.9371700000000007e-06,6.9619500000000003e-06,6.9781111111111116e-06,6.9782000000000004e-06,7.0182899999999995e-06,7.1127300000000001e-06,7.1263599999999998e-06,7.3542200000000004e-06,7.41966e-06,7.5206999999999998e-06],"272":[3.5896000000000003e-05,3.7026339999999998e-05,3.7739349999999996e-05,3.7805000000000001e-05,3.7852390000000003e-05,3.7951999999999998e-05,3.813772e-05,3.8145999999999997e-05,3.8173999999999997e-05,3.8226568965517247e-05,3.8360569999999998e-05,3.851219e-05,3.8574369999999999e-05,3.8669569999999998e-05,3.89077e-05,3.8946089999999996e-05,3.9313905660377362e-05,3.9343509803921571e-05,3.9582380000000001e-05,4.0609900000000006e-05],"116":[1.3106870000000001e-05,1.47818e-05,1.480949e-05,1.4907649999999999e-05,1.4939440000000001e-05,1.495744e-05,1.4967647058823529e-05,1.5053790000000001e-05,1.509e-05,1.52724e-05,1.5609960000000002e-05,1.5726330000000001e-05,1.5791040000000001e-05,1.5905629999999998e-05,1.6107160000000001e-05,1.62863e-05,1.630271e-05,1.6343659999999998e-05,1.6797639999999999e-05,1.798077e-05],"47104":[0.007529338,0.0076078100000000022,0.0076423330000000038,0.0076444240000000012,0.0077052800000000001,0.0077239279999999997,0.0077784110000000007,0.0077864140000000002,0.0078039430000000007,0.0078149509999999988,0.0078234280000000003,0.0078313399999999974,0.007832119000000002,0.0078869940000000326,0.007910696,0.0079416309999999993,0.0079434930000000011,0.0079557139999999991,0.0081459750000000032,0.00832221],"6912":[0.00096891100000000003,0.00097827299999999999,0.0009848420000000001,0.00098638811111111157,0.00099226300000000017,0.001000737,0.001004621,0.0010080003333333334,0.0010091647777777776,0.0010116344444444443,0.0010119204444444443,0.0010129024444444446,0.0010202399999999999,0.0010225098888888887,0.0010262560000000001,0.0010323575555555556,0.001033354,0.0010359361111111115,0.0010489204444444444,0.0010863560000000003],"1856":[0.00024450049999999999,0.00025532400000000002,0.00025662950000000009,0.00026012400000000009,0.000260232,0.00026029299999999998,0.00026146700000000014,0.000261496,0.00026202766666666666,0.00026365600000000002,0.000263792,0.00026430999999999991,0.00026547299999999985,0.00026747086111111103,0.00027030412903225804,0.00028093123529411763,0.00028110265714285709,0.00028127648571428569,0.00029159196969696959,0.00029296666666666672],"48":[5.4082399999999996e-06,5.5548800000000003e-06,5.7930000000000003e-06,5.8344000000000004e-06,5.9176200000000004e-06,5.9189899999999997e-06,6.04004e-06,6.1786100000000003e-06,6.2111899999999992e-06,6.2171999999999995e-06,6.2193700000000006e-06,6.2206399999999996e-06,6.2580299999999996e-06,6.3387599999999999e-06,6.37942e-06,6.4488299999999995e-06,6.4616129032258071e-06,6.4893636363636371e-06,6.5726700000000002e-06,6.6647300000000003e-06],"2097152":[0.89499334699999999,0.900292804,0.90586468050000002,0.91140539599999992,0.91161594000000001,0.91350312500000008,0.91457419249999994,0.91484872900000003,0.91850833349999994,0.91870812899999998,0.92155002900000005,0.92176719200000001,0.92208511800000004,0.92262222999999999,0.92345931400000003,0.925179003,0.92778344950000002,0.93225335050000002,0.93816742600000003,0.94714607549999996],"54":[6.0924999999999997e-06,6.67779e-06,6.8650000000000003e-06,6.8748799999999995e-06,6.9196666666666666e-06,6.9876400000000001e-06,7.0209599999999999e-06,7.0360000000000001e-06,7.0419000000000003e-06,7.1723700000000006e-06,7.2835970149253729e-06,7.3038799999999999e-06,7.32501e-06,7.3292900000000004e-06,7.3863300000000003e-06,7.4393599999999992e-06,7.4495100000000003e-06,7.5265142857142858e-06,7.5924900000000007e-06,7.8151799999999996e-06],"2031616":[0.90360073750000003,0.90787359649999999,0.91411949100000001,0.91625014999999999,0.91634069750000002,0.91642606550000005,0.91715689349999996,0.91730847599999998,0.91835104700000003,0.91866735099999997,0.92188877349999998,0.92272428200000001,0.92435681400000003,0.92463218800000002,0.92923006399999997,0.92997397999999998,0.93001256600000004,0.93063209749999998,0.93220485750000004,0.93401340649999998],"43008":[0.0067505269999999966,0.0068739389999999999,0.0069331769999999987,0.0069400759999999981,0.0069488799999999976,0.0069608500000000002,0.006983688,0.0070192010000000001,0.0070207250000000028,0.0070315380000000021,0.0070326369999999996,0.0070354269999999969,0.007075507,0.0070783650000000014,0.0071058240000000019,0.0071582369999999996,0.0071931360000000027,0.0073059040000000002,0.0075726769999999973,0.007592082],"60":[6.7627999999999999e-06,7.1569999999999994e-06,7.6350900000000001e-06,7.6793699999999993e-06,7.7388181818181823e-06,7.7485099999999994e-06,7.7633300000000011e-06,7.7709100000000011e-06,7.7739599999999993e-06,7.8417499999999999e-06,7.876250000000001e-06,7.8820599999999992e-06,8.0700200000000004e-06,8.0907500000000004e-06,8.162850000000001e-06,8.1869600000000003e-06,8.20042e-06,8.2556999999999996e-06,8.3812000000000003e-06,8.598310000000001e-06],"30720":[0.0046399474999999999,0.004663487,0.0046765749999999997,0.0046854949999999996,0.0046914499999999998,0.0047002729999999996,0.0047240140000000003,0.0047325909999999987,0.0047831429999999984,0.0047865379999999982,0.0048259380000000001,0.0048266940000000012,0.0048603419999999984,0.0048744780000000007,0.0049021515000000002,0.0049271560000000002,0.004947716999999999,0.0049606759999999981,0.004983988,0.0050240340000000019],"56":[6.3038300000000001e-06,7.0810800000000001e-06,7.1984200000000001e-06,7.2400299999999997e-06,7.2475700000000003e-06,7.2513299999999999e-06,7.2733899999999998e-06,7.2913e-06,7.2959999999999993e-06,7.3544299999999998e-06,7.3789300000000002e-06,7.3845300000000006e-06,7.3976699999999999e-06,7.4275100000000003e-06,7.5491700000000001e-06,7.5673299999999999e-06,7.7560599999999991e-06,7.7726923076923083e-06,7.7901999999999987e-06,7.8350000000000004e-06],"62":[6.9860999999999999e-06,7.396e-06,7.8816400000000003e-06,7.9483800000000003e-06,8.0026500000000004e-06,8.0435399999999996e-06,8.0617600000000002e-06,8.0675799999999991e-06,8.0940000000000008e-06,8.1251900000000007e-06,8.1360800000000002e-06,8.1546666666666666e-06,8.1674400000000002e-06,8.1879399999999994e-06,8.2454999999999992e-06,8.3376100000000003e-06,8.3870299999999999e-06,8.6471700000000004e-06,8.7214299999999996e-06,9.70232e-06],"58":[6.7556500000000003e-06,7.0275000000000001e-06,7.4950000000000002e-06,7.5206999999999998e-06,7.5711500000000003e-06,7.6002399999999999e-06,7.6362699999999996e-06,7.6843700000000001e-06,7.7161799999999994e-06,7.7530500000000002e-06,7.7778124999999995e-06,7.8117400000000012e-06,7.8348199999999996e-06,7.8507999999999994e-06,7.9528499999999996e-06,8.0051500000000008e-06,8.0145333333333343e-06,8.0472499999999999e-06,8.1957450980392168e-06,8.3128200000000008e-06],"3014656":[1.4186115859999999,1.4192353010000001,1.4202000340000001,1.42059665,1.4238508750000001,1.4259835125,1.429214999,1.429625607,1.4339031504999999,1.434815068,1.4356078855000001,1.437400666,1.4382471965000001,1.4385458770000001,1.4416655810000001,1.4434271299999999,1.443628014,1.447962258,1.4741523990000001,1.490031479],"64":[6.4749199999999993e-06,6.8449999999999997e-06,6.9498400000000002e-06,7.1694300000000007e-06,7.2418799999999995e-06,7.3324000000000003e-06,7.3455199999999999e-06,7.3701599999999999e-06,7.4374300000000006e-06,7.4387100000000003e-06,7.5871200000000003e-06,7.6305199999999989e-06,7.6542099999999993e-06,7.6630700000000008e-06,7.6743899999999999e-06,7.6830799999999996e-06,7.7054444444444448e-06,7.9699600000000005e-06,8.11513e-06,8.7450699999999999e-06],"8388608":[4.2636266799999998,4.2642318939999999,4.2672319410000004,4.2682052050000001,4.2737973970000001,4.2760075100000003,4.2774860280000002,4.2798361099999997,4.2808816490000003,4.2811057019999996,4.28253108,4.2869981084999997,4.2872174635000002,4.2890258790000004,4.2910703295000001,4.2936830520000004,4.2976131134999997,4.3102171494999997,4.3107287154999998,4.3588564730000003],"29696":[0.0043461720000000006,0.0043857620000000014,0.0044121205,0.0044650280000000002,0.004501746,0.0045450904999999996,0.0045532620000000015,0.0045770124999999998,0.0045817874999999992,0.004585184,0.004623900999999998,0.0046303449999999984,0.0046628655000000001,0.0046634419999999985,0.0046862100000000014,0.0047352754999999986,0.0048205645,0.0048525310000000019,0.0048528570000000004,0.0049166679999999999],"216":[2.7746000000000002e-05,2.7801999999999999e-05,2.8360999999999998e-05,2.8681860000000001e-05,2.8885379999999998e-05,2.9107719999999997e-05,2.9391370000000002e-05,2.9664999999999998e-05,3.0121439999999999e-05,3.0226379999999998e-05,3.0237810000000001e-05,3.0378219999999998e-05,3.0593772727272729e-05,3.0739631578947369e-05,3.092123e-05,3.1031000000000002e-05,3.1071499999999995e-05,3.1702181818181817e-05,3.1737480000000004e-05,3.194103e-05],"106496":[0.020662398000000009,0.020737433000000031,0.020820895499999999,0.020923377999999999,0.020943966500000015,0.021001199500000005,0.021009170000000021,0.0210862915,0.02112903,0.021133595500000001,0.0213658145,0.021404279500000005,0.021413457000000021,0.021469811499999998,0.021554221500000002,0.021621723499999995,0.021697742499999999,0.0220254145,0.022086485000000006,0.022367782500000009],"72":[8.1689200000000004e-06,9.1354200000000004e-06,9.1412600000000006e-06,9.163999999999999e-06,9.2298499999999994e-06,9.2578199999999994e-06,9.3144699999999999e-06,9.3257500000000013e-06,9.4380899999999996e-06,9.5599999999999999e-06,9.5895599999999994e-06,9.5951799999999995e-06,9.6078400000000008e-06,9.6740099999999999e-06,9.6790799999999988e-06,9.7075800000000003e-06,9.74143e-06,9.8325100000000002e-06,9.9221600000000002e-06,9.9328799999999997e-06],"442368":[0.120355859,0.12284047799999998,0.12382154099999999,0.125671437,0.12573063849999999,0.12745071699999999,0.12803576899999999,0.12805464,0.12903902049999999,0.129172545,0.1298278615,0.13128171850000001,0.13349489000000003,0.13366815000000001,0.133762309,0.13439884499999999,0.13705520700000001,0.137386965,0.14047330799999999,0.141146788],"147456":[0.029672938500000006,0.030196654,0.030315735,0.030360925,0.03037863,0.030556826500000002,0.030761244,0.030773672999999991,0.030932238999999973,0.031015563499999999,0.031180862,0.031390451,0.03142789,0.03145208549999999,0.031658872000000012,0.031671623999999989,0.031730731999999998,0.0323559385,0.033234909999999993,0.034600473],"4456448":[2.196694436,2.2006788429999999,2.2025093519999999,2.2034543430000002,2.2048256245000002,2.2079606539999999,2.2084838185,2.2098575194999999,2.2101752994999999,2.2110646979999999,2.211138482,2.218779016,2.224211538,2.2272238584999999,2.2350899100000001,2.2367616250000002,2.23978725,2.2403174560000001,2.2623681590000002,2.2796570525000002],"63488":[0.010987199499999999,0.011028626999999997,0.0110461165,0.011183522500000001,0.011204239,0.011207913999999999,0.011239938,0.011242874999999999,0.011327779500000001,0.011367938999999997,0.011439131499999977,0.011521011500000001,0.0115380415,0.011593431,0.0116245355,0.0116620565,0.011703953999999999,0.01177603,0.011841786,0.0125568715],"38912":[0.0059312030000000003,0.0059780700000000003,0.0060605290000000011,0.0061680880000000004,0.0062104430000000013,0.0062113089999999999,0.0062528550000000016,0.0062905119999999998,0.0062922589999999997,0.0062957259999999998,0.0063088300000000014,0.006322383,0.0063385920000000014,0.0063481609999999997,0.0063509879999999993,0.0063777639999999967,0.0064330310000000031,0.0064656999999999996,0.0065443239999999998,0.0065880519999999996],"68":[7.8310899999999996e-06,8.5290000000000008e-06,8.6079699999999992e-06,8.61515e-06,8.6192500000000005e-06,8.6214399999999996e-06,8.6847500000000002e-06,8.9025199999999996e-06,8.9095199999999997e-06,8.9392900000000003e-06,8.9608900000000002e-06,9.0787599999999991e-06,9.1014799999999995e-06,9.1619999999999997e-06,9.3165600000000005e-06,9.3759400000000006e-06,9.4902307692307685e-06,9.6222200000000005e-06,9.7614100000000001e-06,1.0758875e-05],"188416":[0.040745471999999991,0.041219537500000014,0.041457208500000023,0.041788745000000002,0.041898740499999976,0.042057707,0.042236695499999991,0.042302197999999999,0.042422090499999995,0.042556749000000005,0.042696064999999998,0.043056047,0.043093943000000003,0.043114419500000008,0.043166040999999981,0.043757965499999996,0.043916097999999987,0.044096394999999997,0.04488343600000002,0.04493193600000002],"248":[3.2601999999999997e-05,3.2972999999999998e-05,3.303425e-05,3.3079e-05,3.3393399999999998e-05,3.4149000000000001e-05,3.4225380000000005e-05,3.4358280487804876e-05,3.4429189999999998e-05,3.4536999999999998e-05,3.4649500000000001e-05,3.4766769999999998e-05,3.49426e-05,3.496953e-05,3.5553409999999998e-05,3.5577449999999999e-05,3.6918010000000002e-05,3.6945179999999999e-05,3.749762e-05,3.7755576271186437e-05],"80":[9.9368400000000006e-06,1.0263e-05,1.0280500000000001e-05,1.0369330000000001e-05,1.0402759999999999e-05,1.0413e-05,1.044663e-05,1.0455666666666667e-05,1.054725e-05,1.0634739999999999e-05,1.0674890000000001e-05,1.067737e-05,1.069188e-05,1.0760640000000001e-05,1.082279e-05,1.098605e-05,1.10095e-05,1.1256160000000001e-05,1.1409320000000001e-05,1.192912e-05],"2560":[0.000357361,0.000360794,0.000360828,0.00036121899999999997,0.000361679,0.000361844,0.00036327316000000012,0.00036466600000000004,0.00037085363999999992,0.00037104199999999998,0.0003710605,0.00037289692307692311,0.00037412099999999994,0.00037444966666666676,0.00037472380769230766,0.00037598257692307693,0.00037955539999999998,0.00039596104347826088,0.00039640199999999996,0.0004200462608695653],"34816":[0.0052209809999999978,0.005331382,0.0053554610000000023,0.0054259879999999996,0.0054586290000000004,0.005471404,0.0054878100000000001,0.0055075219999999991,0.005516328,0.0055182069999999989,0.005527349,0.0055643200000000002,0.0055713250000000002,0.0055871250000000001,0.0056065769999999997,0.0056302890000000019,0.0056311410000000018,0.0056545090000000003,0.0057908360000000015,0.006545258],"3712":[0.00051274999999999997,0.00051537400000000008,0.00052467800000000032,0.0005256369999999997,0.00052746399999999973,0.00053489200000000003,0.00053559600000000016,0.00053661961111111116,0.00054139761111111125,0.00054204429411764711,0.00054280164285714293,0.000544806,0.00054507876470588211,0.00054762794444444417,0.00055059024999999998,0.000556402,0.00055719011764705881,0.00056863399999999972,0.00059390099999999998,0.00059464631250000038],"3538944":[1.700076261,1.7031590269999999,1.7061223830000001,1.7102312689999999,1.7110980579999999,1.711548099,1.7127979209999999,1.7231022105,1.7237688714999999,1.7241966904999999,1.7277689455,1.7299223539999999,1.735242832,1.7388728604999999,1.7398300920000001,1.7447842185,1.7491688409999999,1.7551766744999999,1.7809015265000001,1.7903270659999999],"76":[8.7483500000000007e-06,9.6663333333333344e-06,9.9078333333333337e-06,9.916499999999999e-06,9.9640499999999982e-06,9.9669699999999992e-06,1.0013000000000001e-05,1.0035133333333333e-05,1.0071100000000001e-05,1.0095219999999999e-05,1.0121450000000001e-05,1.016248e-05,1.0211490000000001e-05,1.0227960000000002e-05,1.024291e-05,1.043029e-05,1.053677e-05,1.0560000000000001e-05,1.1558420000000001e-05,1.468884e-05],"4194304":[1.9777720329999999,2.0048466325000001,2.0049107725000002,2.0122435955000002,2.0146065119999998,2.0170096200000001,2.019709765,2.0212750515,2.0248659760000001,2.0272421404999998,2.0296226415,2.0321036444999998,2.0359112134999999,2.0366789760000001,2.0383088059999999,2.041090316,2.0415242254999999,2.0442950369999999,2.0851340129999998,2.097571973],"851968":[0.29439537500000001,0.29867940500000001,0.298932645,0.30215351099999999,0.30318188499999998,0.3071547255,0.307227892,0.30820019999999998,0.30820169800000002,0.30839059899999999,0.31048240100000002,0.31411674550000002,0.32001905400000002,0.32064010500000001,0.32332637600000003,0.32372830549999998,0.33242555699999998,0.33791191399999998,0.34138489999999999,0.38989424049999999],"4096":[0.00051256199999999961,0.00052003299999999982,0.00052011600000000026,0.0005202099999999999,0.00052251899999999961,0.00052258600000000001,0.00052549750000000016,0.00052583999999999986,0.00052592638888888888,0.00052788999999999983,0.00052905599999999997,0.00053001488888888859,0.00053797300000000029,0.00054015400000000026,0.00054364152941176473,0.00054412029411764684,0.00054907999999999997,0.00054925699999999983,0.000550948,0.00058582199999999973],"59392":[0.010249455500000001,0.010255024999999999,0.0102722955,0.010288978000000001,0.010316446,0.010326331999999997,0.010335992,0.010337532999999999,0.010347754000000001,0.010392297999999999,0.0104042605,0.010425197000000001,0.010451253000000001,0.010454072,0.010466825500000002,0.010500736999999982,0.010507377,0.010572337000000001,0.010870467999999999,0.010876515],"84":[9.7815699999999993e-06,1.0723999999999999e-05,1.0754000000000001e-05,1.087684e-05,1.0893265306122449e-05,1.09035e-05,1.1205049999999999e-05,1.126978e-05,1.1270900000000001e-05,1.1272e-05,1.147854e-05,1.154747e-05,1.15532e-05,1.1560500000000001e-05,1.182481e-05,1.1931039999999999e-05,1.1994429999999999e-05,1.2543025316455695e-05,1.257973e-05,1.2901369999999999e-05],"3276800":[1.5613424499999999,1.563103546,1.5689565729999999,1.5704626830000001,1.5722395515000001,1.572459525,1.573103178,1.5739914564999999,1.5761846305,1.5789040670000001,1.579063468,1.5808734250000001,1.5811520109999999,1.5853674375,1.588143869,1.5890356104999999,1.5996212974999999,1.6064559144999999,1.6218520089999999,1.6525954414999999],"55296":[0.0093374919999999993,0.0093567919999999992,0.009374352999999995,0.009384080000000003,0.0093861810000000004,0.009446798000000001,0.0094576190000000039,0.0094652459999999949,0.0094910670000000006,0.0095108020000000005,0.0095180480000000046,0.009541618,0.0095624500000000036,0.0095692640000000079,0.009581619999999999,0.0096177730000000031,0.009866171,0.010073251,0.010100338,0.010405417],"688128":[0.22017483600000001,0.22305026550000001,0.22382632800000002,0.22551132099999999,0.226369863,0.22970068599999999,0.22972223800000002,0.231854052,0.23335926400000001,0.23392721399999999,0.23419283699999999,0.2370154025,0.237298859,0.239572014,0.246968203,0.24763077499999997,0.25053615499999998,0.25371705950000001,0.25736499999999995,0.26242300000000002],"8192":[0.001035322,0.0010385570000000001,0.0010403249999999999,0.0010420260000000004,0.00104532,0.001047978,0.00106741,0.00107013425,0.0010715167777777764,0.001073629,0.0010780253333333334,0.0010798778888888886,0.0010800337777777779,0.0010866023750000001,0.001102259,0.001102865,0.001103865625,0.0011080369999999999,0.001124255,0.001135109],"10240":[0.00143261,0.0014459309999999995,0.0014649820000000005,0.001465238,0.001472037,0.0014832976666666667,0.001491184,0.001491834,0.001492822,0.0014932840000000005,0.0014991015,0.0015015835000000001,0.0015023103333333333,0.0015091801666666665,0.0015137273333333335,0.0015185178333333336,0.0015455366666666669,0.001562127,0.00158063,0.0016083949999999992],"15872":[0.0022574589999999999,0.0022636567499999998,0.0022706425,0.0022788129999999998,0.0022944187499999999,0.0023048797500000002,0.0023050760000000001,0.00230883,0.0023105614999999998,0.002310823,0.0023151554999999999,0.0023235260000000002,0.0023334752500000005,0.0023394157499999992,0.0023674299999999998,0.0023699609999999999,0.0024402110000000003,0.0024545852499999999,0.0025006413333333332,0.002612360666666667],"92":[1.050957e-05,1.13750625e-05,1.1551e-05,1.1722000000000001e-05,1.1732e-05,1.178493e-05,1.1817200000000001e-05,1.1845580000000001e-05,1.192756e-05,1.205954e-05,1.210231e-05,1.2145809999999999e-05,1.2196399999999999e-05,1.2355020000000001e-05,1.23705e-05,1.2422679999999999e-05,1.242713e-05,1.2482499999999999e-05,1.2947959999999999e-05,1.2948110000000001e-05],"26624":[0.003871415,0.0038798169999999998,0.0038817089999999997,0.0038928979999999997,0.0039051959999999984,0.0039184039999999986,0.0039296775000000009,0.0040339425000000002,0.0040574390000000004,0.0040885499999999998,0.0040944054999999995,0.0041085279999999984,0.0041368749999999999,0.0041929174999999997,0.0041935900000000014,0.0042524360000000001,0.004271515,0.004332593,0.0043437874999999997,0.0043653265000000016],"1792":[0.00024271700000000001,0.000243601,0.00024751799999999996,0.00025111513513513518,0.00025156999999999995,0.00025167653846153837,0.00025277699999999993,0.00025443800000000011,0.000255085,0.000258163,0.00026173099999999986,0.00026181337837837833,0.00026253845714285719,0.00026378466666666662,0.00026390449999999998,0.000266855972972973,0.00026769400000000002,0.00027142344444444448,0.00027884666666666661,0.00028107528571428582],"11776":[0.001649661,0.0016521120000000003,0.001656317,0.001664109,0.0016669999999999994,0.0016961552,0.00170371525,0.0017243387999999996,0.001725531,0.0017273403999999999,0.0017391543999999988,0.0017506049999999999,0.0017575568,0.00175898,0.0017695620000000001,0.0017718040000000001,0.001773609,0.0018079734,0.001817103,0.0019450979999999999],"2944":[0.000408417,0.00041461199999999997,0.00041467500000000004,0.00041583000000000001,0.00041624199999999999,0.00041868299999999999,0.00042210086363636339,0.000424368,0.00042491421739130437,0.00042590029999999999,0.0004259004090909092,0.00042748299999999988,0.00042958299999999977,0.00043116999999999998,0.00043191800000000016,0.00043550527272727288,0.00043736099999999999,0.00044506600000000004,0.00046436165000000011,0.000476952],"88":[1.030294e-05,1.1157307692307693e-05,1.13315e-05,1.137122e-05,1.1416999999999999e-05,1.1524e-05,1.159313e-05,1.165532e-05,1.1753060000000002e-05,1.18669e-05,1.187453e-05,1.1909869999999999e-05,1.1950149999999999e-05,1.204029e-05,1.2055000000000001e-05,1.209112e-05,1.221891e-05,1.2337900000000001e-05,1.284473e-05,1.325e-05],"22528":[0.003134459,0.0031542930000000012,0.0031758224999999989,0.0032301540000000011,0.0032586950000000016,0.0032783400000000002,0.0032889010000000012,0.003291223666666667,0.0033079055,0.0033091130000000002,0.003319869,0.0033472249999999997,0.0033607190000000025,0.0033621915000000002,0.0033670919999999977,0.003373909,0.0034823060000000001,0.0034829990000000014,0.0035753169999999989,0.0036254499999999997],"1245184":[0.48106315599999999,0.49057172850000003,0.49394144550000002,0.49515237099999998,0.49709912099999998,0.50241456500000004,0.50648940899999995,0.51240576400000004,0.512593097,0.51292620050000004,0.51534589799999997,0.5198057935,0.52430318600000003,0.52845862300000002,0.52874963649999995,0.52978226900000003,0.53578773950000003,0.53632539550000002,0.53802737749999996,0.55633355900000003],"15728640":[8.576345559,8.5841777100000005,8.5843855564999991,8.5882634254999992,8.5947222244999999,8.6002934404999998,8.6022094594999992,8.6145880864999995,8.6159718900000009,8.6194989520000007,8.6289565474999996,8.6356033029999999,8.6360159759999995,8.6379965740000006,8.641091393,8.6468525985000007,8.6679203625000003,8.6865715454999997,8.7202729884999997,8.8260188424999999],"96":[1.08325e-05,1.221342e-05,1.2325439999999998e-05,1.2384565217391303e-05,1.2384999999999999e-05,1.2433833333333333e-05,1.2439860000000002e-05,1.251941e-05,1.279149e-05,1.2843150000000001e-05,1.2849389999999999e-05,1.287885e-05,1.2938509999999999e-05,1.2946579999999999e-05,1.316657e-05,1.3180080000000001e-05,1.3269079999999998e-05,1.339576e-05,1.3540920000000001e-05,1.369068e-05],"1984":[0.000266743,0.00026942100000000016,0.00027240099999999991,0.00027414600000000001,0.000277812,0.00027881499999999991,0.00027959100000000015,0.00028080994285714287,0.00028229200000000007,0.00028301199999999991,0.0002839664705882354,0.000285992,0.00028832200000000009,0.00028993633333333345,0.00029128100000000001,0.00029511700000000001,0.00029592863636363636,0.00029662899999999986,0.00029776374999999992,0.00031963929629629629],"139264":[0.028438884500000004,0.028956914,0.029096011999999984,0.029144036499999998,0.029380714500000009,0.029574349,0.029727914000000001,0.029749749999999998,0.02977696199999999,0.029892133999999994,0.029897188500000012,0.030052672000000002,0.03039310650000001,0.030474728,0.03062428,0.030661493999999991,0.030890797000000008,0.030891968000000002,0.031368194500000002,0.031593917499999999],"475136":[0.1348353005,0.135483928,0.136608971,0.137242749,0.13900760100000001,0.13991576350000001,0.14019730999999999,0.140218965,0.14167930150000002,0.14174761599999999,0.14192197100000001,0.14214077999999997,0.14370596599999999,0.14406066100000001,0.145968298,0.14826111600000003,0.14856771199999999,0.14924279299999998,0.151243884,0.152320236],"13631488":[7.3498819189999995,7.3700225220000002,7.3719861125000001,7.3752027145000003,7.3755507099999997,7.3798073840000002,7.3927869030000002,7.3938903734999997,7.3940328009999998,7.3976567009999998,7.3983492699999998,7.4034965919999998,7.4044291119999999,7.4103972569999996,7.4237665259999996,7.4319422389999996,7.4340367250000003,7.4435486290000004,7.4445595830000002,7.469666846],"416":[5.6949e-05,5.7529328767123285e-05,5.7812236111111113e-05,5.8044999999999997e-05,5.8155000000000001e-05,5.8175040000000001e-05,5.8236753623188407e-05,5.8398610000000001e-05,5.8513988235294114e-05,5.8564669999999996e-05,5.8569149999999998e-05,5.8678000000000003e-05,5.9337223880597015e-05,5.9399580000000005e-05,5.95574e-05,6.0083369999999999e-05,6.0259769230769231e-05,6.3021220000000007e-05,6.3839559999999995e-05,6.4227870370370374e-05],"928":[0.0001232502,0.00012342249999999999,0.00012484200000000001,0.00012894062500000002,0.00012931500000000002,0.00013050350684931512,0.00013240252000000001,0.000133113,0.00013316767796610172,0.00013337327692307686,0.00013343299999999999,0.00013407099999999998,0.00013418499999999999,0.00013459,0.000134833,0.0001354308,0.00013676456923076923,0.00013734350000000001,0.000139371,0.00014167588571428576],"512":[5.8068e-05,6.0526000000000003e-05,6.0590666666666662e-05,6.0910666666666673e-05,6.2382e-05,6.3214058823529416e-05,6.3349666666666661e-05,6.3954000000000005e-05,6.4738050000000006e-05,6.4846789999999996e-05,6.5132270000000004e-05,6.5681254901960782e-05,6.599974e-05,6.602414e-05,6.6093000000000006e-05,6.6350309999999995e-05,6.6796950000000001e-05,6.7178719999999996e-05,6.7281999999999997e-05,6.9043429999999999e-05],"18432":[0.0026198039999999999,0.002632238666666667,0.0026352909999999988,0.0026385296666666669,0.0026403079999999996,0.0026473170000000002,0.0026666800000000011,0.0026671500000000009,0.0026877760000000007,0.0027111193333333328,0.0027222533333333336,0.0027398509999999993,0.0027422610000000002,0.0027467463333333332,0.0027471709999999992,0.0027521973333333319,0.0027556573333333326,0.0028402499999999999,0.0028444933333333332,0.0031912356666666669],"16777216":[8.9357005765000004,8.9393619520000005,8.9441721160000007,8.9494045969999991,8.9546921914999995,8.9621462694999998,8.9653512309999996,8.9669925305000007,8.9685028829999993,8.9806648634999995,8.9855959550000009,8.9860598520000003,9.0000951740000001,9.0040482439999998,9.0106404779999991,9.011017914,9.0121860379999994,9.0139595139999997,9.0225468244999991,9.1996220374999993],"9728":[0.001324738,0.0013565860000000003,0.001366931,0.001373942,0.0013760420000000001,0.001379033,0.001380771,0.001385659,0.0014008999999999996,0.001419881,0.001420073,0.0014264566666666672,0.001446775,0.0014489908333333338,0.0014497628333333336,0.0014508244999999992,0.0014601535,0.0014724933333333328,0.0015129450000000006,0.0015725300000000008],"1769472":[0.75367983999999999,0.75922993250000004,0.76343252699999997,0.76621056300000001,0.76733860300000001,0.77013514500000002,0.77839471599999999,0.77848269549999993,0.77882925699999994,0.77941734900000004,0.78205333099999996,0.79078535250000004,0.79272951700000005,0.79301752199999997,0.79486259400000003,0.79717456399999997,0.79794751149999998,0.80529602049999993,0.81326325399999999,0.82851804250000005],"1703936":[0.71498176800000002,0.71975208450000006,0.72030456249999997,0.72223882699999997,0.72360118750000002,0.72963801350000002,0.735988584,0.738595526,0.74656372400000004,0.7510786425,0.75352930500000004,0.75446070399999998,0.75986229949999995,0.76131587749999996,0.76452429,0.76731739300000001,0.76769231100000002,0.774748875,0.77656262499999995,0.79188437300000003],"2048":[0.00024807799999999999,0.00025635733333333335,0.00025735100000000001,0.00025744199999999998,0.00025757233333333334,0.00026093900000000007,0.00026197288888888889,0.00026403400000000001,0.00026438982857142866,0.00026487900000000015,0.0002651556111111112,0.00026591133333333334,0.00026658000000000009,0.00026741233333333334,0.00026827675,0.00027213500000000001,0.00028134797142857152,0.0002819055,0.00028293461764705892,0.0002914590000000001],"14336":[0.0020350680000000001,0.00204186075,0.0020527799999999993,0.0020589039999999999,0.0020600849999999997,0.0020700689999999999,0.0020720394999999996,0.0020752969999999998,0.0020928737499999999,0.002092876,0.0020947040000000002,0.002096952,0.0021033262499999998,0.0021038362499999999,0.002114444,0.0021182745,0.0021235729999999993,0.00212831,0.0021371007499999999,0.0021616472499999999],"448":[5.9008000000000002e-05,6.0195000000000002e-05,6.0363046875e-05,6.0522000000000001e-05,6.0887000000000002e-05,6.2738999999999997e-05,6.2934054545454542e-05,6.3219105263157896e-05,6.3492779999999995e-05,6.3767850000000006e-05,6.3787889999999999e-05,6.3905000000000006e-05,6.4005999999999997e-05,6.4592530000000004e-05,6.4740999999999996e-05,6.4973110000000011e-05,6.5021899999999995e-05,6.5085930000000002e-05,6.6553559999999996e-05,6.7965000000000004e-05],"5505024":[2.7807340009999999,2.7820573070000001,2.783407478,2.7846490065,2.7859276890000002,2.789265442,2.7919321720000001,2.7921996519999999,2.7925533919999999,2.7940883730000001,2.7970335149999999,2.8021475320000002,2.8025229175000002,2.8027175154999999,2.8119681695000001,2.812280281,2.8135457024999999,2.8265918380000001,2.8346158379999999,2.8352385419999999],"544":[7.1946999999999994e-05,7.4015000000000002e-05,7.4436000000000004e-05,7.4534129032258065e-05,7.5050535714285725e-05,7.6156999999999996e-05,7.6401269999999994e-05,7.6435369999999995e-05,7.6608807692307699e-05,7.6892999999999997e-05,7.7073840909090908e-05,7.7182999999999996e-05,7.7518559999999997e-05,7.7771749999999996e-05,7.8172538461538456e-05,7.8784340000000007e-05,7.8969429999999999e-05,7.9162979999999999e-05,8.0148875000000006e-05,8.058714999999999e-05],"221184":[0.048892843000000019,0.049541613999999998,0.050329067999999991,0.050546305999999999,0.051562509999999992,0.051719148999999999,0.051832102999999997,0.05187638600000001,0.052774220999999996,0.053060824999999999,0.053285157499999992,0.053354752500000012,0.053754394500000011,0.054010261999999996,0.05420244099999999,0.054273262499999975,0.054398734500000004,0.054465255999999997,0.05502406750000001,0.056739996000000001],"90112":[0.016842932000000001,0.016972622999999999,0.0170058095,0.017067082500000007,0.017080766000000001,0.017141648999999995,0.017193918999999992,0.017215894499999988,0.017282470000000001,0.01734832,0.017365931499999994,0.017405271999999999,0.0174210375,0.0174943875,0.017512106500000006,0.017570028999999994,0.017940747999999999,0.017969659500000006,0.018327869,0.01883112],"640":[8.5838183673469379e-05,8.6421000000000005e-05,8.6434999999999995e-05,8.6559571428571422e-05,8.7357999999999999e-05,8.8233124999999996e-05,8.8432999999999998e-05,8.9818e-05,9.1718999999999994e-05,9.2105220000000002e-05,9.2395149999999996e-05,9.2398059999999996e-05,9.2456759999999996e-05,9.2591429999999998e-05,9.2981270000000002e-05,9.4493999999999993e-05,9.4802750000000003e-05,9.5717219999999994e-05,9.6782989690721651e-05,9.7092199999999999e-05],"12800":[0.0018085309999999999,0.001819977,0.0018223739999999999,0.001828655,0.0018294611999999995,0.0018440686000000001,0.001847212,0.0018568999999999999,0.001858391,0.0018616514000000001,0.0018673639999999998,0.0018727349999999993,0.0018822688000000008,0.0018830784,0.0018870640000000001,0.0018899240000000001,0.001891151,0.0019235188,0.0019279528,0.0019310310000000004],"262144":[0.05673382699999998,0.05677664800000002,0.05721597249999999,0.057496689499999996,0.057726611999999997,0.058429150500000027,0.059248007000000012,0.059394194999999983,0.060106292999999977,0.060512011499999983,0.061075299,0.061701565000000014,0.061720367000000012,0.061735665999999981,0.061816979000000029,0.062107208000000004,0.064154202499999965,0.064781447000000034,0.065670681999999966,0.067420091500000029],"589824":[0.179176578,0.17951394200000004,0.17978249600000001,0.1807867675,0.18373958600000001,0.18630919750000002,0.18714721300000003,0.187384622,0.1875710545,0.19084965650000002,0.19096195299999999,0.192332743,0.19459499899999999,0.196687417,0.19741946700000002,0.199636602,0.20238356399999999,0.2025873275,0.204199668,0.20514489850000001],"884736":[0.30812577499999999,0.30997254299999999,0.31951616849999998,0.31975785999999995,0.32074930999999995,0.32075155,0.32307317999999996,0.32373590699999999,0.3254775265,0.32898322400000002,0.33129709949999997,0.33174747100000002,0.3331146915,0.33346522699999998,0.33827444400000001,0.34291947900000003,0.343010233,0.34500224700000004,0.35027142100000003,0.36204315649999996],"6144":[0.00086924399999999992,0.00087158299999999978,0.000878387,0.00087924300000000004,0.00088475699999999958,0.00088650409090909111,0.00088896640000000007,0.00089039200000000005,0.00089125699999999979,0.00089341800000000032,0.00089573409090909115,0.00089636199999999972,0.0008970250909090911,0.00089941100000000035,0.00091355600000000005,0.00091563300000000044,0.00092283100000000037,0.00094148699999999975,0.00098723860000000008,0.00099714399999999972],"1088":[0.00014255675000000005,0.000145845,0.00014728499999999996,0.00014869900000000005,0.000148753,0.00015117428571428571,0.00015341399999999999,0.0001559915,0.00015643814999999998,0.00015652316666666673,0.00015772,0.00015785506557377047,0.00015908095081967216,0.00015953135593220344,0.000159588,0.000159691,0.00016216900000000004,0.000163301,0.000167954,0.00017862800000000001],"576":[7.7877e-05,7.8572000000000006e-05,7.9594999999999999e-05,7.9713369999999999e-05,8.013184e-05,8.064663636363636e-05,8.0898045454545127e-05,8.1306052631578942e-05,8.1509874999999995e-05,8.1857810000000002e-05,8.1981650000000005e-05,8.2074499999999995e-05,8.3120941176470585e-05,8.3203800000000011e-05,8.3545722222222227e-05,8.4096000000000003e-05,8.4949812499999995e-05,8.5047372093023264e-05,8.5239329999999998e-05,8.6391758241758233e-05],"160":[1.9957450000000003e-05,2.02635e-05,2.0565999999999999e-05,2.103687e-05,2.1055000000000001e-05,2.1483480000000001e-05,2.149544e-05,2.152411320754717e-05,2.1547559999999997e-05,2.1737969999999999e-05,2.178966e-05,2.1796609999999998e-05,2.1919430000000001e-05,2.1977070000000001e-05,2.2078279999999997e-05,2.2361839999999999e-05,2.241828e-05,2.2466909999999997e-05,2.290551e-05,2.3568333333333333e-05],"672":[9.0329999999999997e-05,9.1717846153846144e-05,9.2231479999999998e-05,9.2264549999999994e-05,9.2557333333333336e-05,9.2794122448979592e-05,9.3552000000000001e-05,9.3655999999999999e-05,9.4336833333333328e-05,9.4704000000000007e-05,9.5108500000000006e-05,9.6052999999999997e-05,9.6211000000000004e-05,9.6723197368421061e-05,9.7192000000000001e-05,9.7237857142857143e-05,9.8263400000000005e-05,9.9717587628865985e-05,0.00010013688421052639,0.00010039099999999999],"8912896":[4.6752110089999999,4.6837374399999998,4.6894382444999998,4.690084358,4.6912615549999996,4.6926343069999996,4.6958926979999998,4.7011277839999996,4.7036933369999998,4.7043604165000001,4.7049896479999997,4.7071837439999999,4.7111621340000003,4.7133906230000004,4.7146942950000001,4.7159414379999998,4.7265821929999996,4.7289047440000003,4.736251888,4.7481910489999999],"100":[1.174703e-05,1.3032709999999999e-05,1.3076e-05,1.318801e-05,1.3227000000000001e-05,1.3275170000000001e-05,1.328841e-05,1.3296749999999999e-05,1.3469989999999999e-05,1.3618320000000001e-05,1.36532e-05,1.369212e-05,1.3732379999999999e-05,1.379082e-05,1.3839119999999999e-05,1.3848666666666667e-05,1.406471e-05,1.4197859999999999e-05,1.425897e-05,1.433951e-05],"507904":[0.14717951000000001,0.14785846350000001,0.1479296135,0.14829834,0.14904280149999999,0.152396482,0.15297091500000004,0.15389745099999996,0.15425161549999999,0.15487568900000001,0.15606662199999999,0.15754001400000001,0.15787645650000001,0.158808012,0.15920830450000001,0.16512285099999999,0.16526211800000001,0.16644078300000001,0.169916176,0.1733100085],"3840":[0.000523749,0.00053882400000000003,0.000542513,0.0005435809999999998,0.00054482899999999982,0.00054527000000000004,0.00055195450000000029,0.00055254099999999993,0.00055703388235294122,0.00055910347058823486,0.00056010658823529413,0.00056190700000000016,0.00056630350000000027,0.00056639517647058828,0.0005685699999999999,0.0005691791764705882,0.00056942699999999974,0.00057426275000000012,0.00057555599999999996,0.00061851413333333344],"192":[2.4853000000000001e-05,2.4958999999999999e-05,2.506057e-05,2.5182999999999999e-05,2.5506309999999997e-05,2.5615000000000001e-05,2.5801029999999998e-05,2.6471929999999998e-05,2.6672810000000001e-05,2.6780000000000001e-05,2.6804310000000001e-05,2.6996930000000001e-05,2.7135979999999998e-05,2.7162100000000002e-05,2.717113e-05,2.734878e-05,2.7481333333333334e-05,2.7712928571428572e-05,2.7889282608695652e-05,2.9824509999999999e-05],"376832":[0.097969164999999997,0.099171732999999998,0.101384431,0.10151809150000002,0.1017586395,0.1019908895,0.10348509,0.10358848900000001,0.10366486050000001,0.103839362,0.1050464575,0.105057051,0.10534864799999999,0.10545339500000001,0.1059098945,0.105966538,0.1069488555,0.108149365,0.10837313849999999,0.108392211],"98304":[0.01859141900000005,0.019314487000000002,0.019399803,0.019417135000000002,0.019418846,0.01954218000000001,0.0195451515,0.019572568999999998,0.019575325499999994,0.019665347,0.019700451000000001,0.019731041499999998,0.019804004,0.019805101499999995,0.019880873,0.019958750500000001,0.01999737,0.020098940500000002,0.020170538999999994,0.020340423],"5376":[0.00073860100000000008,0.00075104200000000016,0.00075451399999999975,0.000755232,0.00075938100000000016,0.00076058058333333309,0.00076293000000000031,0.00076645300000000006,0.00077398249999999973,0.0007766949166666667,0.00078116299999999997,0.00078217858333333326,0.00078410750000000042,0.00079500425000000007,0.00079990499999999974,0.00080277300000000001,0.00080582500000000025,0.00080822000000000034,0.00081795341666666651,0.00088507645454545471],"94208":[0.017894107999999999,0.017914665499999999,0.01794191500000001,0.0179678315,0.018044650000000002,0.0180725565,0.018089711000000001,0.018210061500000006,0.018214083000000002,0.018271700000000002,0.018271873500000001,0.0183211395,0.018458189,0.018544727,0.018652736,0.0186817505,0.018690007000000002,0.019135655000000001,0.0191813355,0.019210283999999998],"81920":[0.014978165,0.015039640000000021,0.015096916,0.015144396999999973,0.015162548,0.015185713999999999,0.01522453,0.015262420000000004,0.015378173,0.015399948,0.0154252765,0.015436394000000003,0.015454452,0.015524488499999999,0.015647946500000006,0.015693868,0.0157306275,0.015793295500000006,0.016290291999999991,0.016564921999999999],"3407872":[1.629819015,1.640096663,1.640641239,1.6422046345000001,1.6429951739999999,1.6468027169999999,1.6485187455000001,1.6490225064999999,1.6504541939999999,1.6534556999999999,1.6535995754999999,1.6586180905000001,1.6592000659999999,1.6600858110000001,1.6629908580000001,1.664068095,1.6662108265,1.6750515065,1.6948455469999999,1.7089340515],"104":[1.2181351351351351e-05,1.3170545454545454e-05,1.3380000000000001e-05,1.343801e-05,1.3448999999999999e-05,1.3576734177215189e-05,1.3614999999999999e-05,1.3708e-05,1.375932e-05,1.3760949999999999e-05,1.4028590000000001e-05,1.416629e-05,1.4182488636363636e-05,1.4381144927536233e-05,1.447416e-05,1.454976e-05,1.460936e-05,1.4638699999999999e-05,1.4702050000000001e-05,1.4769869999999999e-05],"122880":[0.024225240000000002,0.024377675499999994,0.024438016999999999,0.024469657999999998,0.024483512000000002,0.024556419499999999,0.024767381500000001,0.0248302075,0.0248576545,0.0248775995,0.0250630095,0.025366643000000001,0.025448324000000001,0.02550287,0.025625994000000006,0.025744115000000001,0.025876719999999999,0.025881538999999999,0.026220327500000001,0.026863768999999999],"200":[2.5644e-05,2.6318000000000001e-05,2.65045e-05,2.6531000000000001e-05,2.683699e-05,2.7159689999999999e-05,2.733943e-05,2.7398489999999998e-05,2.7592530000000003e-05,2.772564e-05,2.7743759999999997e-05,2.7820490196078432e-05,2.7970149999999999e-05,2.8178230000000003e-05,2.8398199999999999e-05,2.841803e-05,2.8550179999999998e-05,2.8901759999999999e-05,2.9197040000000001e-05,3.035016666666667e-05],"163840":[0.034412786500000007,0.03448859,0.034550536500000006,0.035044690500000017,0.035238058500000002,0.035281997500000002,0.035568052500000009,0.0355883725,0.035703202500000017,0.035779405,0.0358765115,0.036022118999999998,0.036237257999999981,0.036374361000000001,0.036628082999999985,0.036718054999999999,0.036970139999999999,0.037201508000000001,0.038646930000000003,0.040411476000000002],"4063232":[1.995752406,1.9976913704999999,2.0011396795,2.0037118734999999,2.0063677850000001,2.0065208165000001,2.0071948375000002,2.0086217359999998,2.0091459390000002,2.0108234244999998,2.0168648125000002,2.01902195,2.0190299815000001,2.0199161540000001,2.0249802629999998,2.027822048,2.0423708999999999,2.0602982084999999,2.0611814220000002,2.1005239410000001],"5767168":[2.9172300055,2.9219921690000001,2.9309510680000002,2.9319058629999999,2.9338243550000001,2.9341216769999998,2.937629764,2.938128888,2.9388494889999999,2.9421865039999999,2.943203064,2.9482940229999999,2.9483907949999999,2.9485932744999999,2.9514446634999998,2.960874778,2.9622279929999999,2.9650983984999999,2.9949961140000001,3.0479470970000002],"12582912":[6.7659665230000003,6.7819420225,6.7922521700000003,6.7934239055000001,6.7958844154999998,6.7981566845000003,6.8011016414999999,6.8014218885000002,6.8018295445000003,6.8061577770000001,6.8071858880000002,6.8092582344999997,6.8122770690000003,6.8240147589999998,6.8244569315000003,6.8568285659999999,6.8618383359999999,6.8626069120000004,6.8642822785000002,6.9309452169999997],"1600":[0.00021234799999999993,0.00021254799999999998,0.00021338599999999993,0.00021627299999999998,0.00021808399999999998,0.000218175,0.00022153299999999989,0.00022192699999999988,0.00022309000000000001,0.000225572,0.00022587966666666662,0.00022659614285714286,0.00022667799999999999,0.00022689700000000007,0.00022703300000000002,0.00023247079487179493,0.00023442845,0.00023477207499999998,0.00023479500000000002,0.00024446605128205129],"136":[1.7218e-05,1.7224e-05,1.8024249999999999e-05,1.8059399999999999e-05,1.8181839999999999e-05,1.8234919999999999e-05,1.826516e-05,1.838843e-05,1.844615e-05,1.8456150000000001e-05,1.8479209999999998e-05,1.8507571428571427e-05,1.8508999999999998e-05,1.8511289999999999e-05,1.8588624999999999e-05,1.8813930000000002e-05,1.9052410000000001e-05,1.9260819999999998e-05,1.9470000000000002e-05,3.775005e-05],"232":[3.0698999999999999e-05,3.1121000000000002e-05,3.1334230000000004e-05,3.1377333333333335e-05,3.1483200000000004e-05,3.1662629999999999e-05,3.1943149999999999e-05,3.2085500000000003e-05,3.2239329999999997e-05,3.2551333333333335e-05,3.2560397849462366e-05,3.2759899999999998e-05,3.2769650000000002e-05,3.281107e-05,3.3043790000000003e-05,3.3317160000000004e-05,3.3515700000000002e-05,3.3992999999999998e-05,3.4271269999999996e-05,3.475062e-05],"7077888":[3.6402914979999998,3.6462841254999998,3.6466388570000001,3.6497725179999998,3.6535742710000001,3.6612784894999999,3.6653434570000001,3.6700418859999999,3.671054947,3.6719464085000002,3.6736725374999999,3.6797469679999999,3.6888455430000002,3.6899278794999999,3.690460147,3.6910288800000002,3.695856917,3.697962865,3.7029014240000002,3.8468653769999999],"86016":[0.015898154499999987,0.015921661,0.016000254999999998,0.0160252055,0.016027788500000008,0.016077644499999995,0.016086738999999999,0.016138254999999997,0.016187018000000004,0.0162071165,0.0162406145,0.016244976500000001,0.0162716135,0.016351758500000001,0.016437511999999994,0.016538925500000023,0.016790767499999994,0.017271349999999994,0.017890984499999991,0.018454334999999995],"31744":[0.0047345399999999998,0.0047563000000000006,0.0047664209999999999,0.0047897270000000006,0.0048308344999999997,0.0048310810000000001,0.0049256880000000001,0.0049270590000000019,0.0049331260000000004,0.004934067000000002,0.0049363269999999999,0.0049672709999999997,0.0049722400000000002,0.005083654,0.0050950000000000014,0.0051038569999999981,0.0051436720000000002,0.0051663510000000004,0.0051835359999999999,0.005251431],"168":[2.0923166666666666e-05,2.1608500000000002e-05,2.16495e-05,2.1880999999999999e-05,2.2455449999999999e-05,2.254096e-05,2.2614250000000001e-05,2.2803490000000002e-05,2.2969470000000002e-05,2.299036e-05,2.3076459999999999e-05,2.3083411764705882e-05,2.3396400000000002e-05,2.3435339999999998e-05,2.3449181818181816e-05,2.3681599999999997e-05,2.3813929999999998e-05,2.3858939999999999e-05,2.4056899999999997e-05,2.5570520000000003e-05],"622592":[0.19223189399999996,0.19583397999999999,0.19700070650000001,0.19718679249999999,0.19869321600000001,0.20034016700000001,0.20244610299999999,0.204267953,0.20615169,0.20622291700000001,0.2071318925,0.20845832650000001,0.20996044699999999,0.21041611399999999,0.21088345799999997,0.21223709299999999,0.21244558250000001,0.218485506,0.22259905099999999,0.22432003549999999],"108":[1.2949579999999999e-05,1.3497800000000001e-05,1.37465e-05,1.4000209999999999e-05,1.40488e-05,1.4199192307692308e-05,1.446321e-05,1.450043e-05,1.4539119999999999e-05,1.4611190000000001e-05,1.4623830000000001e-05,1.4648219999999999e-05,1.4709409999999999e-05,1.4790440000000001e-05,1.4810900000000001e-05,1.4956e-05,1.5036299999999999e-05,1.504322e-05,1.5161739999999999e-05,1.5170629999999999e-05],"327680":[0.081134160999999982,0.082420387999999997,0.082661160999999997,0.083702708000000001,0.084482752999999994,0.084537558000000013,0.084989694500000004,0.085396853999999994,0.085485098000000037,0.085576675500000005,0.085626507000000032,0.086120584,0.086981225000000023,0.087261625000000037,0.08855907399999996,0.08856013800000001,0.088865264999999971,0.089698263,0.090524507000000004,0.095694100000000032],"2176":[0.00028748499999999998,0.00029984500000000014,0.00030438299999999998,0.00030609300000000001,0.00030680699999999998,0.0003092991,0.00030942400000000009,0.00030958400000000001,0.00031205674193548392,0.000313405,0.00031450199999999998,0.00031451750000000011,0.00031570349999999998,0.00031606400000000002,0.00031682800000000001,0.00031856263333333336,0.00032106300000000001,0.00032256399999999985,0.00032280199999999996,0.000322904],"3328":[0.000469047,0.00046974900000000005,0.00047019800000000012,0.00047793865000000035,0.00047806555555555562,0.00047862720000000004,0.00048014163157894735,0.00048126199999999982,0.000482113,0.00048451424999999999,0.00048556499999999987,0.00048892552631578943,0.0004895453500000001,0.00049202615000000017,0.0004924599999999999,0.00049375900000000008,0.00049522999999999982,0.00049945300000000018,0.0005026649999999998,0.00050285027777777788],"1":[1.55e-07,1.5531999999999999e-07,1.5546999999999998e-07,1.5554999999999999e-07,1.5733999999999998e-07,1.5767000000000001e-07,1.5848000000000003e-07,1.5858999999999999e-07,1.5862000000000003e-07,1.5865999999999999e-07,1.5872999999999999e-07,1.5879999999999999e-07,1.6019000000000001e-07,1.6560999999999999e-07,1.6569e-07,1.6612999999999999e-07,1.6940999999999998e-07,1.7125e-07,1.8079000000000002e-07,1.8475999999999999e-07],"2":[2.5198000000000001e-07,2.5264000000000002e-07,2.5286e-07,2.5296999999999997e-07,2.5367999999999998e-07,2.5515000000000001e-07,2.5545000000000003e-07,2.5557e-07,2.5619000000000002e-07,2.6008999999999999e-07,2.6393000000000001e-07,2.6627000000000001e-07,2.7214e-07,2.7425000000000001e-07,2.7715000000000002e-07,2.7723e-07,2.7758000000000003e-07,2.7789000000000001e-07,2.7986000000000002e-07,3.0605999999999998e-07],"3":[3.9634000000000001e-07,3.9687000000000003e-07,4.1427000000000002e-07,4.1433999999999999e-07,4.1657999999999999e-07,4.1669999999999997e-07,4.2056e-07,4.3336000000000001e-07,4.3366999999999999e-07,4.3412999999999998e-07,4.3674999999999999e-07,4.3807e-07,4.3893000000000003e-07,4.4419999999999997e-07,4.6227999999999998e-07,4.6865e-07,4.7093e-07,4.7231999999999998e-07,4.7439e-07,4.7497999999999998e-07],"4":[4.4482999999999999e-07,4.4528999999999999e-07,4.4575999999999999e-07,4.4944999999999999e-07,4.8635999999999997e-07,4.8788e-07,4.8795000000000002e-07,4.9034000000000004e-07,4.9078e-07,4.9175999999999995e-07,4.9569000000000001e-07,5.0850999999999994e-07,5.1491e-07,5.3520999999999993e-07,5.3903000000000003e-07,5.3909999999999995e-07,5.4272000000000003e-07,5.5001999999999994e-07,5.7003999999999999e-07,5.7645999999999996e-07],"7424":[0.001048085,0.0010494230000000001,0.001050004,0.0010539220000000001,0.0010557329999999999,0.0010579135000000001,0.001058804,0.0010687706666666669,0.0010750219999999999,0.0010797000000000001,0.001080957,0.0010812204444444443,0.001089923,0.0010941115,0.0010948189999999999,0.001102699,0.001103242625,0.0011084810000000001,0.0011629864999999999,0.0012661707142857142],"5":[6.1954e-07,6.2787999999999993e-07,6.5077e-07,6.5135000000000002e-07,6.5333000000000004e-07,6.5343000000000005e-07,6.5922999999999995e-07,6.6087999999999997e-07,6.6470999999999992e-07,6.8521000000000009e-07,6.9331000000000006e-07,6.9765999999999996e-07,6.9889999999999999e-07,7.0523000000000002e-07,7.0638999999999996e-07,7.1136000000000004e-07,7.2570999999999995e-07,7.2743e-07,7.4936999999999999e-07,7.6290000000000004e-07],"23552":[0.0033363949999999998,0.0034249525000000008,0.0034300300000000006,0.0034586899999999991,0.0034697655000000007,0.003472759000000001,0.0034776015,0.0034837599999999989,0.0034912739999999999,0.003491868,0.003495831,0.003501749000000001,0.0035169540000000001,0.0035385449999999993,0.0035458180000000018,0.0035850579999999999,0.0036173709999999999,0.0036884300000000004,0.0037247349999999999,0.0037751],"6":[7.2490000000000004e-07,7.4213000000000004e-07,7.5865000000000003e-07,7.5982000000000004e-07,7.6130000000000002e-07,7.6933000000000007e-07,7.7737999999999994e-07,7.7999999999999994e-07,7.8154999999999995e-07,7.9670999999999999e-07,7.9882e-07,8.0398999999999999e-07,8.0538999999999999e-07,8.054400000000001e-07,8.1069999999999992e-07,8.244e-07,8.3539000000000002e-07,8.6278e-07,8.6526000000000006e-07,9.0550999999999991e-07],"61440":[0.0104302305,0.010546834,0.010682345000000001,0.010721748500000001,0.0107421015,0.010756101000000001,0.010804250999999997,0.010821372500000001,0.010824171,0.010832216,0.0108636815,0.010866475,0.010878835,0.010926913,0.010955702999999999,0.010960880500000001,0.010974181999999999,0.0111482145,0.011243586,0.011270376],"491520":[0.14056612900000001,0.14074659,0.1407538455,0.14109310050000001,0.14192134449999999,0.14212670899999999,0.14441830650000001,0.14751148650000001,0.14776849550000001,0.148129701,0.14861552,0.15045109800000001,0.15047406299999999,0.15148804299999999,0.15212071799999999,0.153633461,0.15661222999999999,0.15930144700000001,0.161145644,0.1641531275],"77824":[0.013861442,0.014324739499999999,0.014376488000000015,0.014403145500000006,0.014434098999999995,0.014454488,0.014477147500000001,0.014523053499999999,0.0145630985,0.014642536000000001,0.0146841965,0.014708852499999998,0.014719468499999999,0.014756943999999999,0.015027416,0.0150798305,0.0151936745,0.015265515,0.01549538,0.0155465325],"7":[8.2812999999999994e-07,8.4321999999999995e-07,8.7255000000000001e-07,8.8850000000000005e-07,8.8994999999999995e-07,8.9668999999999996e-07,9.0377000000000005e-07,9.3328999999999996e-07,9.3348000000000002e-07,9.3452000000000003e-07,9.3654999999999995e-07,9.4343999999999998e-07,9.4981000000000006e-07,9.5983000000000009e-07,9.6839000000000006e-07,9.7185000000000006e-07,9.7410000000000013e-07,1.0042399999999999e-06,1.0242300000000001e-06,1.0323499999999999e-06],"8":[8.4251000000000004e-07,8.6743000000000003e-07,8.7405999999999998e-07,8.8578000000000003e-07,8.8772999999999997e-07,8.8975999999999999e-07,9.1258000000000004e-07,9.2935000000000005e-07,9.3333999999999997e-07,9.516799999999999e-07,9.5410999999999996e-07,9.7034999999999995e-07,9.8105999999999997e-07,1.0031600000000001e-06,1.0229599999999999e-06,1.0247900000000001e-06,1.02653e-06,1.02982e-06,1.04237e-06,1.05447e-06],"208":[2.7011333333333333e-05,2.7050999999999999e-05,2.7546e-05,2.7915e-05,2.8279149999999998e-05,2.8316499999999999e-05,2.8522729999999999e-05,2.8597919999999997e-05,2.862978947368421e-05,2.8828899999999998e-05,2.9722000000000001e-05,2.9882129032258063e-05,3.000512e-05,3.0204649999999999e-05,3.0254660000000001e-05,3.0640920000000001e-05,3.0920000000000002e-05,3.1347390000000003e-05,3.2069410000000002e-05,3.2273000000000001e-05],"9":[1.06619e-06,1.06771e-06,1.10352e-06,1.1185299999999999e-06,1.13258e-06,1.14358e-06,1.15053e-06,1.1646400000000001e-06,1.1673e-06,1.1956700000000001e-06,1.2008200000000001e-06,1.20258e-06,1.20389e-06,1.2045999999999999e-06,1.2067400000000001e-06,1.21575e-06,1.2307299999999999e-06,1.2593599999999999e-06,1.29666e-06,1.3437299999999999e-06],"73728":[0.013284839,0.013328723000000004,0.013424618500000004,0.013534747499999999,0.013552375,0.0135930285,0.013659279,0.0136770065,0.013735308,0.013749407999999999,0.013752537,0.013756763,0.013766918499999994,0.013772382,0.013814488999999999,0.013872898999999999,0.0139526545,0.0139885875,0.014084057000000001,0.014184777500000001],"304":[3.9338000000000002e-05,3.9993000000000001e-05,4.0410000000000001e-05,4.0686000000000003e-05,4.0991125000000003e-05,4.151813e-05,4.1525236842105267e-05,4.1774699999999998e-05,4.1954379999999998e-05,4.1999439999999999e-05,4.2139850000000003e-05,4.2413809999999998e-05,4.2830999999999997e-05,4.2922259999999998e-05,4.3103000000000004e-05,4.3377291666666664e-05,4.3435419999999996e-05,4.3966919999999995e-05,4.4066476190476192e-05,4.5935980000000001e-05],"400":[5.1286000000000003e-05,5.2534000000000002e-05,5.5102000000000002e-05,5.5171370000000003e-05,5.5173999999999997e-05,5.5605e-05,5.5662999999999999e-05,5.5815243243243242e-05,5.5849320000000002e-05,5.6858519999999999e-05,5.70913e-05,5.7459779999999994e-05,5.7617939999999999e-05,5.8074585714285714e-05,5.8865859999999999e-05,5.9393520000000001e-05,5.9828416666666668e-05,6.0513999999999997e-05,6.2863678571428578e-05,6.3182659999999998e-05],"1310720":[0.521882442,0.52468574700000004,0.52648559299999997,0.53642568600000007,0.53873614400000003,0.53883565,0.53980693400000002,0.54047576750000004,0.54094004100000004,0.54128362400000007,0.54189010100000001,0.54316270850000004,0.54564853850000006,0.54622671,0.55722192299999995,0.55853659099999997,0.55981489900000003,0.56857282450000002,0.57131879600000002,0.57616391300000003],"336":[4.4212699999999998e-05,4.4943933333333335e-05,4.5621999999999998e-05,4.57744e-05,4.6136e-05,4.65037e-05,4.657092e-05,4.6756666666666666e-05,4.6800829999999996e-05,4.7051410000000002e-05,4.7192939999999996e-05,4.7302000000000002e-05,4.7689159999999995e-05,4.7715500000000001e-05,4.7788060000000001e-05,4.9100333333333328e-05,4.9611070000000001e-05,4.9695950000000003e-05,5.0436000000000003e-05,5.2892951807228913e-05],"3670016":[1.78392554,1.795419981,1.7975484945,1.799047603,1.799259382,1.8028009615,1.8036544329999999,1.8045488525,1.8054568989999999,1.8083683994999999,1.808879769,1.810055212,1.810218095,1.8119599264999999,1.8237233559999999,1.8239904565,1.829248738,1.8555762625000001,1.855918959,1.8701339495],"6656":[0.000898273,0.00092133100000000006,0.00093300299999999996,0.00093962800000000029,0.00094152299999999999,0.00094837000000000025,0.00095345299999999994,0.00095745399999999994,0.00096308580000000008,0.00096515720000000008,0.00096844222222222209,0.00097179022222222233,0.00097794722222222224,0.00097961033333333327,0.00097997899999999996,0.00098181000000000006,0.00099354300000000038,0.00099455600000000039,0.001004137,0.0010626665],"15360":[0.002183548,0.0021855149999999999,0.0022108229999999998,0.0022193999999999998,0.0022283192499999993,0.0022293770000000011,0.0022352129999999989,0.0022436119999999999,0.00224363475,0.0022528217499999991,0.0022663037499999999,0.0022837070000000007,0.002284640000000001,0.00228940175,0.0023260160000000002,0.0023429589999999995,0.0023540620000000005,0.0023875124999999998,0.0023989240000000002,0.0024339890000000001],"432":[5.6121e-05,5.7027999999999997e-05,5.8068e-05,5.8257000000000001e-05,5.8369000000000003e-05,5.8408500000000002e-05,5.9456999999999997e-05,5.9781070175438596e-05,6.0267460000000003e-05,6.0281000000000001e-05,6.0665229999999999e-05,6.0798950000000002e-05,6.0865290000000001e-05,6.1186999999999995e-05,6.1728066666666669e-05,6.186493e-05,6.1944000000000002e-05,6.316506e-05,6.3354055555555548e-05,6.5402666666666663e-05],"950272":[0.34012980199999998,0.343911723,0.34450250300000002,0.34539042600000003,0.35192692999999997,0.35921925599999999,0.36045293649999999,0.361012477,0.36171539799999997,0.36213535600000002,0.36399119800000002,0.36538553000000001,0.36907647399999999,0.3713828575,0.37541806700000002,0.37748503249999998,0.37940622950000003,0.39079668649999999,0.3912360875,0.39878112799999998],"655360":[0.20514754999999996,0.209182122,0.20978728899999999,0.21721957250000001,0.22042263449999999,0.22069605,0.22083122799999999,0.220988131,0.22226093099999999,0.222566299,0.223755289,0.22471619899999995,0.228280239,0.22842517099999998,0.23169233300000003,0.2320019015,0.23333146049999998,0.23406066850000001,0.23872889749999998,0.23954603000000002],"69632":[0.0122207805,0.012510441000000001,0.012576848999999996,0.012635716999999999,0.012649017,0.012651952999999999,0.0127149345,0.012761376499999999,0.012763248500000001,0.0127651455,0.012799323999999996,0.0128013615,0.012818788000000001,0.012947522999999999,0.012953923500000002,0.0129671965,0.012967939999999994,0.013074876499999999,0.013170975,0.014889842],"11264":[0.001563537,0.001564158,0.001573156,0.0015916039999999999,0.0015918780000000001,0.0016067640000000001,0.0016092979999999999,0.0016138093999999998,0.0016176576666666667,0.0016221809999999997,0.0016236380000000002,0.001624311,0.0016313003999999995,0.0016314648000000005,0.0016326240000000005,0.0016350850000000001,0.001662518,0.0016652429999999998,0.0017060096000000007,0.001712856],"2752512":[1.2682133545000001,1.273879926,1.2783040720000001,1.278840668,1.287117471,1.2904756045000001,1.2919814674999999,1.2922084140000001,1.2924064945,1.2985283439999999,1.2994092820000001,1.29943597,1.3018541099999998,1.3049677370000001,1.307325233,1.3090337084999999,1.3195935539999999,1.3257056440000001,1.3277929915,1.350598183],"8126464":[4.229691184,4.2297150080000003,4.2364379459999997,4.2387130920000002,4.2504812684999997,4.2518396960000002,4.2570561979999999,4.2619710279999996,4.2634242980000003,4.2643265489999997,4.2671605364999996,4.2690400029999997,4.2710080660000003,4.2735522980000002,4.2741892850000003,4.2763438130000004,4.2764116955000002,4.2912831919999999,4.3113785760000001,4.4617365189999996],"27648":[0.0039685569999999984,0.0040356309999999996,0.0040459505000000002,0.0040487974999999995,0.0040967120000000006,0.0041250140000000015,0.0041703419999999996,0.0041735899999999996,0.0041769379999999998,0.0041995860000000017,0.0042273829999999978,0.0042605025000000008,0.0042608870000000005,0.0042719819999999997,0.0042779465000000001,0.0042910904999999997,0.0043122634999999982,0.0043415860000000023,0.0043735129999999999,0.0045011934999999977],"368":[4.9580999999999998e-05,5.0609180000000002e-05,5.0612999999999998e-05,5.0617e-05,5.0695280000000001e-05,5.0998000000000002e-05,5.1053000000000001e-05,5.1171202247191008e-05,5.1309e-05,5.1745940000000005e-05,5.2318314606741574e-05,5.2399669999999997e-05,5.2605999999999997e-05,5.3451349999999998e-05,5.3664749999999998e-05,5.4167939999999996e-05,5.5884439999999999e-05,5.6767e-05,5.6895640000000001e-05,5.8298318181818183e-05],"65536":[0.010677349499999999,0.0107239515,0.010906423,0.01092943,0.0109319055,0.010947020999999998,0.010962613999999999,0.010981096000000004,0.011045697,0.0110562925,0.0111263215,0.0111318115,0.01113536,0.0112597145,0.011442284,0.011444929,0.011491125,0.011552827,0.011628627999999978,0.012626204],"16252928":[8.8680789069999992,8.8759901049999996,8.8843196854999995,8.8950162400000004,8.9029123395000003,8.9116192479999992,8.9150922784999995,8.9190115399999996,8.9211558059999998,8.9216288025000008,8.9257167205000005,8.9298499020000008,8.9368364244999992,8.9376305229999993,8.9377910620000005,8.9388347515,8.9393735905000007,8.9501057660000001,9.0441109669999999,9.0612287130000002],"464":[6.0037000000000001e-05,6.2199999999999994e-05,6.3223490909090912e-05,6.3651953488372097e-05,6.3755970000000002e-05,6.383692e-05,6.4046000000000003e-05,6.4121000000000005e-05,6.4632640000000005e-05,6.4667650000000001e-05,6.5410630000000002e-05,6.6672312499999999e-05,6.6815000000000003e-05,6.6942999999999999e-05,6.8283063829787237e-05,6.9082780000000001e-05,6.9258795454545447e-05,6.9734580000000007e-05,7.0023000000000004e-05,7.0281679999999994e-05],"1015808":[0.36530473899999999,0.36837406700000003,0.37472401999999999,0.37991569250000001,0.38031607099999998,0.38331895300000002,0.38817752700000002,0.39010975199999998,0.39051730699999998,0.39141266200000002,0.39212041800000003,0.39523443899999999,0.39552138650000002,0.39970090200000002,0.40345262300000001,0.40834540499999999,0.41158642000000001,0.41323150799999997,0.41895418400000001,0.434844852],"3072":[0.00041463700000000009,0.00042373300000000003,0.00042556825000000001,0.00043612036363636366,0.00044139199999999998,0.0004440458636363635,0.00044569842857142852,0.00044744680952380942,0.00044985900000000004,0.00045227745,0.00045278800000000014,0.00045903099999999983,0.00046032800000000003,0.00046050599999999996,0.00046157261904761893,0.00046557325000000014,0.00047535504999999986,0.00047703399999999999,0.000493664,0.00050429189473684215],"110592":[0.021536538000000001,0.021648429,0.021695113499999995,0.021939551000000002,0.021957558999999998,0.021983007500000002,0.022105972999999998,0.022140541,0.022179459499999998,0.022255658000000001,0.022356747999999999,0.022369159999999999,0.022379160000000002,0.022630199,0.022662624499999999,0.022795288,0.023026589,0.023627135,0.023780377499999998,0.025168722000000011],"237568":[0.054359304500000004,0.054771358499999999,0.054808817500000016,0.05587073699999999,0.056037566999999996,0.056097263000000022,0.056204153999999985,0.056262275,0.056735808500000019,0.05729774200000002,0.057373925499999999,0.057583801500000018,0.057999349000000019,0.058049448500000003,0.058571696499999978,0.058998700000000029,0.059553553999999988,0.060138463499999996,0.060569934999999984,0.062287805000000009],"278528":[0.06555672899999998,0.066610032,0.067870687999999998,0.068109410499999967,0.06920975,0.069517548999999998,0.070074154,0.070279041,0.070592782000000034,0.070872246,0.070926934999999983,0.07103495999999998,0.071250894999999967,0.071653130999999953,0.072066403000000015,0.073412638999999974,0.073998685999999994,0.076019893999999963,0.078626955999999998,0.081822131499999992],"496":[6.5467000000000002e-05,6.5732e-05,6.6450000000000002e-05,6.6884000000000005e-05,6.7444e-05,6.8158999999999996e-05,6.8273000000000002e-05,6.8473000000000007e-05,6.9326560975609749e-05,6.9551166666666672e-05,6.968082e-05,6.985019512195122e-05,6.9856000000000003e-05,6.9938999999999996e-05,7.100149e-05,7.1204825000000001e-05,7.1402179487179478e-05,7.2275999999999997e-05,7.2965649999999995e-05,7.6546249999999999e-05],"13107200":[7.0456840190000003,7.06565654,7.0681071559999999,7.0729608945000004,7.0746069350000003,7.0760331220000001,7.0826569929999996,7.0849066369999996,7.0857477150000001,7.0957044439999999,7.0966604440000003,7.0992003180000003,7.1019018965000003,7.104568327,7.1065218269999999,7.1180872385000002,7.1249014185000004,7.1259088894999998,7.1410657280000001,7.1788370994999999],"9961472":[5.2662593229999999,5.2800427269999997,5.2957140870000003,5.2976404280000002,5.2981804310000005,5.299634696,5.3005994019999996,5.3007925575000003,5.3008293894999996,5.3014624040000005,5.3040630159999997,5.3057393284999996,5.3061262224999997,5.3078932994999999,5.3090785809999996,5.3167338414999996,5.316964027,5.3213688939999999,5.3553699495,5.4149552019999998],"5888":[0.00083049300000000007,0.00083199399999999996,0.00083571481818181807,0.00083621018181818192,0.00083692027272727306,0.00083775600000000005,0.00083904399999999951,0.00083991799999999994,0.00084255700000000007,0.00084510909090909116,0.00084697190909090896,0.00084767100000000014,0.00085211100000000034,0.00085959181818181867,0.00086042363636363618,0.00086066127272727293,0.0008658602727272726,0.0008776056363636361,0.00088223800000000025,0.00088450745454545475],"11010048":[5.8671337775000003,5.8680521060000004,5.8763385934999999,5.8864490370000002,5.8875301090000001,5.8936411409999998,5.8953080905000004,5.8970669825000002,5.9042095510000001,5.9046122104999998,5.9048764604999997,5.9054661465000002,5.9150047399999997,5.9170308479999996,5.9178434055000002,5.9192856259999997,5.9252676040000001,5.9315432100000001,6.0347917210000004,6.0424850455000003],"1920":[0.0002548090000000001,0.00026689599999999987,0.00026768700000000001,0.00026931400000000015,0.00026985800000000004,0.00027168138888888894,0.00027206300000000001,0.00027287675000000001,0.00027330385714285715,0.00027381500000000006,0.00027452040000000002,0.00027534800000000002,0.00027893651428571419,0.00027959400000000014,0.00028008470588235295,0.000280198,0.00028054799999999998,0.00028237614705882332,0.00028787799999999998,0.00029339999999999998],"2490368":[1.13598968,1.1412384520000001,1.1428285199999999,1.1435230569999999,1.14617477,1.147624296,1.1482437329999999,1.1526267445,1.1533875385000001,1.1544138945,1.1561276440000001,1.1660959470000001,1.1680271165,1.1714104335,1.1768602180000001,1.1793117184999999,1.1845347070000001,1.1852526624999999,1.1941428905,1.1949838165],"19456":[0.0027647323333333334,0.0027823513333333333,0.0027907979999999993,0.002798459000000001,0.0028152200000000011,0.0028202029999999999,0.002821229333333332,0.0028213800000000009,0.0028423866666666669,0.0028424120000000003,0.0028465693333333329,0.0028726393333333329,0.0028806629999999995,0.0028958066666666662,0.0028984470000000067,0.0029137816666666662,0.0029353349999999999,0.002999414000000001,0.0030084779999999998,0.0032616976666666672],"57344":[0.0096476500000000007,0.0096800400000000043,0.0097080179999999953,0.0097651939999999996,0.0098947649999999998,0.0099254224999999995,0.0099509840000000047,0.0099723640000000044,0.0099796450000000005,0.0099863074999999996,0.010006722500000006,0.010024922,0.010029724,0.010035683,0.010039408,0.0101266645,0.010417974,0.010454919999999998,0.0106871185,0.011274613000000005],"1179648":[0.45635786099999998,0.459626335,0.45983803249999999,0.46037343100000006,0.46469296799999998,0.46758514800000001,0.468999428,0.47059847700000002,0.47064863699999998,0.472196748,0.47402532200000003,0.47557784000000003,0.477100105,0.47823805050000001,0.48645378700000003,0.48816610999999999,0.49344072249999998,0.49784208900000004,0.499297408,0.51472552599999999],"4718592":[2.3552800309999999,2.3582108110000002,2.3589989550000001,2.359870318,2.3609072129999999,2.3614892360000002,2.3622535435000001,2.362797112,2.3646633320000001,2.3659280064999999,2.366014641,2.3714792409999998,2.3726464040000002,2.3735905509999999,2.3748536864999998,2.374982208,2.3766771599999998,2.3786218335,2.4008440449999999,2.402444585],"360448":[0.093656173499999995,0.093949199999999955,0.094634269999999993,0.096259804500000004,0.096981167500000007,0.097227567999999973,0.098366448999999995,0.098391551999999965,0.098618765000000039,0.098631242999999993,0.098684298000000018,0.100500108,0.100526221,0.101132553,0.102379764,0.1041869465,0.105334803,0.1061857215,0.10675343949999999,0.109449355],"1572864":[0.65229585300000004,0.65417831999999998,0.65588976199999993,0.65699664599999996,0.65860085800000001,0.66059841799999997,0.67702424449999998,0.68097122650000008,0.68620534700000002,0.68702430550000004,0.68988860299999999,0.69011649050000001,0.69533763199999998,0.69551093799999997,0.69737477049999996,0.70369761200000003,0.70702628000000001,0.72017721599999995,0.72184289899999998,0.84356450350000001],"53248":[0.0088106409999999993,0.0088587190000000045,0.0089227680000000028,0.0089296779999999999,0.0089304530000000031,0.0089552260000000002,0.0089552959999999945,0.0089699429999999993,0.0089747440000000032,0.009018878000000001,0.0090342519999999961,0.0090592530000000032,0.0090700980000000056,0.0090802110000000012,0.0091180819999999961,0.0091780750000000008,0.0093032380000000036,0.0093251640000000004,0.009337194,0.0093410550000000026],"3456":[0.000470848,0.00048059299999999997,0.00049242263157894741,0.00049316745000000024,0.00049372847368421016,0.0004940126111111111,0.00049446547368421048,0.00049459500000000002,0.00049497699999999996,0.00050603900000000001,0.00050611200000000008,0.00050755599999999994,0.00051060357894736844,0.00051238399999999973,0.0005135207222222223,0.00052213200000000002,0.00052244800000000023,0.00052455799999999984,0.00052661429411764702,0.00053648488888888876],"40960":[0.006311190000000003,0.0063263259999999984,0.0063285630000000006,0.0063471370000000001,0.0065404949999999977,0.0065462619999999989,0.0065496819999999985,0.0065602970000000014,0.0065979659999999994,0.0066064660000000001,0.0066235310000000002,0.0066311079999999984,0.0066401149999999994,0.006657075000000001,0.006683184,0.0067284340000000002,0.00681994,0.006872838,0.006935437,0.0069374269999999986],"4608":[0.00063772899999999986,0.00064139000000000004,0.00064508600000000001,0.00065121814285714285,0.00065141299999999999,0.00066031900000000003,0.00066283335714285711,0.00066643535714285712,0.00066887935714285722,0.00066908357142857157,0.00066915799999999999,0.00067243214285714293,0.00067388235714285739,0.00067524307692307702,0.00067700300000000002,0.00068130285714285697,0.00068440557142857136,0.00068618857142857136,0.00068747078571428544,0.00072967161538461532],"13824":[0.0019608690000000001,0.001971534,0.0019894450000000003,0.0019924069999999999,0.0019982660000000007,0.0020062332500000008,0.0020092760000000008,0.00201184,0.0020146459999999993,0.0020351050000000002,0.0020376699999999992,0.0020506302499999998,0.002053061499999999,0.0020584660000000001,0.0020602939999999998,0.00206256775,0.00208326,0.0020884430000000002,0.0021115712500000008,0.002217948],"819200":[0.281404918,0.28172325999999998,0.284777273,0.28736083999999995,0.29490137999999999,0.29528264700000001,0.29536804900000002,0.29637305000000003,0.29644556799999999,0.29674853150000002,0.29680229199999997,0.30354603800000002,0.30458075299999998,0.305867787,0.30768814700000002,0.30792529200000002,0.30889800699999997,0.309893211,0.31136216699999997,0.31150826500000001],"983040":[0.359898738,0.36148319149999997,0.36461456950000004,0.36598763200000001,0.37571738599999999,0.376627881,0.38075207599999999,0.38174593400000001,0.38179159499999998,0.38220995150000003,0.38241989749999999,0.3859359825,0.38597800500000001,0.38815665850000003,0.39336764000000002,0.39678360499999998,0.40084335800000004,0.40512702,0.405641374,0.40668537500000002],"8704":[0.0012375444285714285,0.001242438,0.0012460189999999997,0.0012480520000000001,0.001249488,0.001258709,0.0012593979999999999,0.0012628439999999999,0.0012663388571428568,0.0012670807142857144,0.0012678169999999999,0.0012699220000000006,0.0012715299999999999,0.0012719700000000001,0.0012726979999999996,0.0012731049999999999,0.0012869491428571433,0.001296672,0.0013281219999999999,0.0013709435714285715],"120":[1.460195e-05,1.544628e-05,1.55385e-05,1.55568e-05,1.5581420000000001e-05,1.570264e-05,1.5941249999999999e-05,1.5967499999999999e-05,1.599822e-05,1.6111000000000002e-05,1.6314060000000001e-05,1.6326429999999999e-05,1.6461e-05,1.647024e-05,1.6495390000000001e-05,1.6501510000000002e-05,1.65738e-05,1.696407e-05,1.7591770000000001e-05,1.850926e-05],"1024":[0.00012163399999999999,0.000125563,0.000125649,0.000130078,0.00013016299999999998,0.00013023000000000001,0.00013080900000000001,0.00013127208333333333,0.00013197224999999998,0.00013208649999999999,0.00013240500000000007,0.00013323600000000001,0.00013362399999999999,0.00013477063888888891,0.000135881,0.00013726706944444444,0.00014102197058823532,0.00014228015873015882,0.000145346,0.00014981312121212115],"49152":[0.0080546309999999961,0.008094937,0.0081043509999999992,0.0081071279999999999,0.0081524919999999973,0.0081759649999999986,0.0081935549999999999,0.0081972320000000005,0.0082164089999999992,0.0082312040000000024,0.0082392509999999995,0.008274585999999997,0.0082834750000000019,0.0082849209999999972,0.0082913319999999985,0.0083409500000000032,0.0083459460000000034,0.0083724999999999963,0.0085330100000000006,0.0086822440000000022],"524288":[0.14438247400000001,0.145910383,0.146437664,0.14864284049999998,0.150615586,0.15093835,0.15565949200000001,0.15606573500000001,0.156841864,0.15726835149999999,0.15732141600000005,0.16127864149999999,0.16169157449999999,0.16208723799999999,0.16241319399999998,0.16317340700000005,0.16489421300000001,0.1657494605,0.16588120200000001,0.16739309050000001],"45056":[0.0071222430000000003,0.007156280000000001,0.0072546550000000005,0.0073089990000000018,0.0073239730000000001,0.0073302940000000037,0.0073365870000000003,0.007343591999999996,0.0073692660000000037,0.007396299000000002,0.0074535040000000023,0.0074656569999999979,0.0074671499999999971,0.0074679290000000008,0.0074930819999999999,0.0074984269999999993,0.007535362999999998,0.0075804189999999997,0.0075843149999999995,0.0080056630000000014],"229376":[0.051554028499999981,0.051652267000000009,0.0519467625,0.052882129,0.053146025,0.053316165000000026,0.053333999,0.053433458499999996,0.0534351905,0.0535408655,0.0539541885,0.055606322,0.055814132000000002,0.055946811000000027,0.055946887000000022,0.056850332000000003,0.0572687115,0.057484030999999977,0.057913678499999989,0.060430602499999986],"2688":[0.00037705699999999998,0.00037772500000000003,0.00038039599999999997,0.00038042600000000001,0.00038108,0.00038224800000000007,0.00038321999999999998,0.00038376400000000009,0.00039009203999999998,0.00039010872000000017,0.00039032800000000001,0.00039233550000000001,0.00039463600000000002,0.000396859,0.0004021161304347826,0.00040427799999999999,0.00040794078260869587,0.00040934386956521741,0.00041016920833333338,0.00041319243478260884],"152":[1.8890359999999998e-05,1.9483e-05,2.025246e-05,2.0390999999999998e-05,2.0693329999999999e-05,2.0895029999999998e-05,2.1040099999999999e-05,2.124174e-05,2.14855e-05,2.1486000000000001e-05,2.1504869999999999e-05,2.1577640000000001e-05,2.1711999999999998e-05,2.2068379999999999e-05,2.214521e-05,2.2221652173913042e-05,2.2317990000000001e-05,2.2345740000000001e-05,2.2429110000000003e-05,2.3218409999999998e-05],"5120":[0.00069016800000000023,0.00069214600000000004,0.00070846899999999998,0.00072561200000000005,0.00072630100000000005,0.0007267189999999998,0.0007279579999999998,0.00072933916666666676,0.00073693692307692327,0.00073701441666666669,0.00073760899999999996,0.00073825300000000013,0.00074220700000000004,0.00074290199999999993,0.0007440529230769231,0.00074771230769230782,0.00075096315384615391,0.00075706358333333323,0.00076388399999999994,0.0007988305454545454],"1507328":[0.61538050899999996,0.61820977799999999,0.62510464700000001,0.62977127199999994,0.63269130000000007,0.63922288599999999,0.6412560075,0.64796732400000001,0.64817591499999994,0.64918281899999997,0.64957557399999999,0.65006961549999998,0.65135985350000003,0.651401699,0.656548558,0.65747237199999997,0.66608405149999994,0.66676361200000001,0.66770071349999993,0.66836045150000001],"1216":[0.00016314000000000004,0.00016877299999999996,0.000170328,0.00017055289285714288,0.00017156878000000001,0.00017190600000000007,0.00017205927272727275,0.00017257700000000001,0.00017266299999999993,0.000172893,0.00017521998181818183,0.00017524700000000001,0.00017536299999999997,0.00017586933333333337,0.00017661541071428572,0.0001786,0.00018090666666666666,0.0001811886,0.000185572,0.000185821],"1966080":[0.86638301399999995,0.87810263499999996,0.8792308445,0.88156152399999999,0.88394882299999999,0.88638919599999999,0.88671255250000003,0.8887790525,0.88979221949999998,0.89041408700000002,0.89063115000000004,0.89769319000000003,0.89795789349999999,0.90004094050000005,0.90089556000000004,0.901636773,0.90441203800000003,0.90951249999999995,0.91064970749999996,1.0137355589999999],"1900544":[0.82341812400000003,0.82435948599999997,0.82882602549999995,0.84289237799999994,0.85119274200000006,0.85362492899999998,0.85569726300000004,0.85610604550000002,0.857318358,0.85777283000000004,0.85948710299999997,0.85977210000000004,0.86185397349999993,0.86297917599999996,0.86299802000000003,0.86545668850000002,0.86804707850000007,0.87611539599999999,0.87692660550000001,0.88185350100000004],"184":[2.3141250000000001e-05,2.4073000000000001e-05,2.435472e-05,2.4361019999999997e-05,2.4648950000000001e-05,2.46995e-05,2.4996179999999998e-05,2.5046249999999998e-05,2.5340012500000002e-05,2.5364039999999999e-05,2.5411840000000002e-05,2.5559802469135802e-05,2.5800640000000001e-05,2.582978e-05,2.6010333333333334e-05,2.606819696969697e-05,2.6175870000000003e-05,2.6597e-05,2.674395e-05,2.7028339999999999e-05],"7936":[0.00112571,0.0011308080000000001,0.001131878,0.0011335200000000001,0.0011361710000000001,0.0011370273750000001,0.0011438010000000005,0.0011479890000000001,0.00115318825,0.0011559439999999999,0.001158448625,0.0011635969999999999,0.001170265,0.001173566375,0.001187397,0.0011896460000000001,0.001204131375,0.0012066591250000005,0.001210041125,0.00127976],"3801088":[1.860074853,1.860467758,1.866357842,1.8672519329999999,1.8685301409999999,1.8688262655000001,1.8715990775,1.8731772965,1.8762774934999999,1.8787488429999999,1.8842328779999999,1.8889704315,1.889429502,1.8907984259999999,1.8925680039999999,1.8970492305,1.900503168,1.918735114,1.9492568610000001,1.9630543600000001],"6815744":[3.4998663109999999,3.5141362045000002,3.514981417,3.5178243155,3.5190461869999998,3.519869285,3.5217498460000001,3.5242504669999999,3.5254297600000002,3.527339344,3.5284238535000001,3.5296665630000001,3.530879133,3.5341840824999999,3.5354615224999999,3.5389432869999999,3.5395322629999999,3.5405122804999998,3.5456200175000001,3.607528485],"124":[1.423941e-05,1.5862000000000002e-05,1.608724e-05,1.611833e-05,1.622552e-05,1.6294999999999999e-05,1.6422e-05,1.6446000000000001e-05,1.645e-05,1.6483839999999999e-05,1.6520540000000002e-05,1.6656000000000001e-05,1.665908e-05,1.6676000000000001e-05,1.6839439999999999e-05,1.6852356164383563e-05,1.6968219999999999e-05,1.7316159999999999e-05,1.748181e-05,1.7867029999999999e-05],"102400":[0.019939433999999999,0.020028272,0.020029209499999999,0.02012358899999999,0.020157889499999998,0.020218625,0.020219715999999995,0.0202237145,0.020372482500000004,0.02037407749999999,0.020375958500000006,0.020386844000000001,0.020387830999999999,0.020410630499999999,0.020600053,0.0206842125,0.020704828500000001,0.0210725085,0.021531342000000002,0.021581201000000001],"311296":[0.076339953000000002,0.076660667000000002,0.076730780999999998,0.077030778000000008,0.077493232999999981,0.079547053999999992,0.080910090500000004,0.081135857999999991,0.081256564000000003,0.081293522500000007,0.081306403499999971,0.081381014000000002,0.081812069500000056,0.08218424299999999,0.08383280500000001,0.084246911999999979,0.084404711500000007,0.084722922500000006,0.084828602000000003,0.088788250500000027],"1408":[0.000189667,0.000197314,0.00019787036170212767,0.000198106,0.00019812399999999999,0.00019831650000000004,0.00019923825,0.00019960400000000001,0.0002017,0.00020197375,0.0002026385,0.00020595971739130435,0.00020606000000000002,0.00020691199999999999,0.00020831650000000001,0.00020874734782608701,0.0002116864347826087,0.00021203804347826087,0.00021279300000000002,0.00021585821739130432],"393216":[0.10380425400000004,0.10391497399999999,0.104088421,0.105224255,0.105240836,0.105492594,0.107452984,0.10821531700000001,0.10832336200000001,0.108698986,0.1090856615,0.11010521299999998,0.110568113,0.111370415,0.11309198600000001,0.115663342,0.1166535575,0.1170482665,0.11777129,0.125759171],"4352":[0.00058748800000000027,0.00060514,0.00061381499999999998,0.00061439100000000005,0.00061458500000000028,0.00061844200000000008,0.00062013346666666661,0.0006233730000000002,0.00062709786666666667,0.00063157019999999977,0.00063195800000000039,0.00063303299999999997,0.00063425933333333324,0.00063824126666666662,0.00064401740000000012,0.00064437053333333356,0.00064635246666666668,0.00064669699999999979,0.00065429733333333324,0.00069941800000000004],"6553600":[3.355351261,3.3571610070000002,3.3617008464999998,3.3672072934999999,3.3712793720000001,3.3712935339999999,3.3721662659999998,3.3788844294999998,3.3805241905000001,3.3856257795000002,3.3858265520000002,3.3858530425,3.388013876,3.3891439029999999,3.3891643485,3.3910594139999999,3.3943874059999999,3.3982100219999998,3.4179780685000001,3.4800677714999999],"20480":[0.0029039773333333335,0.0029115740000000001,0.0029575345000000001,0.002962539000000001,0.0029652760000000002,0.0029980810000000005,0.0030062883333333329,0.0030149116666666653,0.0030221506666666675,0.0030364040000000008,0.0030382323333333324,0.0030476746666666665,0.0030721500000000001,0.003074242,0.0030911000000000011,0.0030925023333333327,0.0031300129999999996,0.0031404809999999984,0.003221757,0.0033672190000000012],"608":[8.0772000000000005e-05,8.2988070000000004e-05,8.3095000000000003e-05,8.4204437499999996e-05,8.4516950000000001e-05,8.5240333333333324e-05,8.5471646464646458e-05,8.5471888888888895e-05,8.569726666666667e-05,8.6316469999999997e-05,8.6589999999999996e-05,8.6809000000000002e-05,8.7037490000000007e-05,8.7793999999999993e-05,8.8362399999999993e-05,8.8550583333333322e-05,8.9191247422680414e-05,8.9221999999999994e-05,9.2234189999999998e-05,9.7693031578947358e-05],"2228224":[1.003554061,1.0063934375000001,1.0075586780000001,1.0083807915,1.010749839,1.0114007700000001,1.0164299050000001,1.0187586550000001,1.018913907,1.0205226285,1.0241468440000001,1.0246290570000001,1.0262394889999999,1.0292704239999999,1.0300685039999999,1.040471057,1.0430971415000001,1.048677885,1.0538119990000001,1.0573343850000001],"36864":[0.0055663459999999998,0.0056228820000000001,0.0056294139999999993,0.0057429439999999998,0.005765905,0.0058395119999999998,0.0058753189999999978,0.0058925569999999997,0.0059036869999999977,0.0059206099999999998,0.0059284669999999998,0.0059289360000000001,0.0059456270000000002,0.0059556259999999986,0.0060143079999999977,0.0060260310000000003,0.0060331569999999982,0.0060357030000000016,0.0060809709999999984,0.006114848],"704":[9.0954500000000005e-05,9.3642999999999998e-05,9.5789000000000001e-05,9.6321000000000002e-05,9.6793999999999995e-05,9.7213999999999995e-05,9.7659010416666669e-05,9.7942000000000005e-05,9.9327000000000006e-05,0.00010051091304347826,0.000100851,0.00010096,0.000101006,0.0001016,0.000101872,0.00010229,0.00010238178205128211,0.000104041,0.000104732,0.0001054015],"720896":[0.235166403,0.23587641400000001,0.23598673250000002,0.23709656800000001,0.238883871,0.2455093955,0.245976417,0.24825335700000001,0.249929981,0.25034656399999999,0.25042981600000003,0.25142065800000002,0.25365162600000002,0.25413390499999999,0.26232886799999999,0.262935103,0.26466311649999996,0.27012079499999997,0.27125497500000001,0.27961862049999997],"800":[0.00010671299999999999,0.00010902400000000003,0.000109373,0.00011025,0.00011034200000000004,0.00011166538666666666,0.0001116765,0.0001118357469879518,0.0001119065,0.00011443299999999997,0.00011445700000000003,0.00011548980232558141,0.00011637303125,0.000116832,0.0001176234,0.00011832566666666664,0.00011999739506172839,0.00012111026829268294,0.0001242580519480519,0.0001273305],"2621440":[1.218227299,1.221102785,1.2219493104999999,1.222241914,1.225522701,1.2274224139999999,1.2288423645,1.2307563095,1.231671548,1.233526034,1.235531693,1.2399789325000001,1.2403742205000001,1.2418237240000001,1.2437294845,1.2471216700000001,1.2511614559999999,1.2513428035,1.2567639765,1.272539361],"425984":[0.11554926,0.116136741,0.116251967,0.117472544,0.11789126449999998,0.11921427499999999,0.1221184345,0.122194732,0.122531474,0.122716302,0.123199922,0.1236951395,0.124307615,0.12462734,0.12475534150000001,0.12502183350000001,0.12838955399999999,0.12911757400000001,0.12974496199999996,0.13005738150000001],"32768":[0.0045795280000000011,0.0046293889999999985,0.0046427485000000001,0.0046622790000000001,0.0046662099999999996,0.0046778000000000002,0.004691794,0.0046985759999999977,0.0047011080000000025,0.0047453170000000015,0.0047625039999999981,0.0048032370000000001,0.0048291465,0.0048370079999999985,0.0048377130000000004,0.0049025140000000002,0.0049084574999999995,0.0049148879999999975,0.0050277290000000033,0.0051860709999999996],"12058624":[6.4703472499999997,6.4725587784999998,6.4757917679999997,6.4758118659999999,6.4860718395000001,6.4874791370000002,6.4951653570000003,6.4952717849999999,6.4954067179999999,6.4982158434999997,6.4988435305000003,6.4998101730000002,6.5003840650000004,6.5162244175000001,6.5179047529999998,6.5214877969999998,6.5252297940000004,6.5318422444999999,6.5385386324999999,6.5512231019999998],"128":[1.3375550000000001e-05,1.4370315789473684e-05,1.4753294117647059e-05,1.489373e-05,1.5029889999999999e-05,1.504991e-05,1.5146517241379311e-05,1.5170249999999999e-05,1.5259000000000001e-05,1.540559e-05,1.5422660000000001e-05,1.550575e-05,1.5635399999999999e-05,1.5674310000000001e-05,1.5775159999999998e-05,1.5848879999999999e-05,1.5866599999999998e-05,1.601037e-05,1.6028909999999999e-05,1.6452044444444443e-05],"180224":[0.037435442500000013,0.039207425499999997,0.039211416999999998,0.039273946000000011,0.039329430999999984,0.039662410500000002,0.039692386500000003,0.039884557000000001,0.0399326245,0.039979103999999988,0.040158012,0.040322195499999991,0.040792971999999997,0.04097953800000001,0.041008247499999997,0.041032053000000006,0.041081884000000013,0.041606929000000001,0.042082937000000001,0.042669806500000004],"224":[2.92504375e-05,3.0226428571428571e-05,3.0382705882352944e-05,3.0953727272727271e-05,3.100638e-05,3.1092500000000001e-05,3.1200220000000001e-05,3.1221830000000002e-05,3.1320830000000002e-05,3.1338680000000004e-05,3.1603909999999998e-05,3.1671859999999995e-05,3.1958839999999999e-05,3.2007239999999997e-05,3.2277709999999998e-05,3.3195899999999998e-05,3.3362779999999997e-05,3.3523960000000004e-05,3.5175520000000004e-05,3.6054340000000001e-05],"736":[9.9245999999999991e-05,9.9745000000000001e-05,0.000100814,0.000101897,0.00010329280232558139,0.0001035849263157895,0.00010374061111111102,0.000104227,0.000104597,0.00010502727659574469,0.00010560700000000001,0.00010569997560975607,0.00010680561538461534,0.0001070695,0.000108274,0.00010828555681818184,0.00010896854945054942,0.00011081473033707864,0.000110940275,0.00011923050666666668],"320":[4.2054500000000002e-05,4.2067000000000002e-05,4.3565559999999999e-05,4.3665999999999998e-05,4.3903999999999998e-05,4.4029000000000001e-05,4.4261999999999997e-05,4.4308499999999998e-05,4.4818070000000002e-05,4.5108850000000001e-05,4.5359950000000003e-05,4.5470809999999999e-05,4.5534720000000004e-05,4.5551240000000001e-05,4.5993709999999994e-05,4.611217e-05,4.8525929999999998e-05,4.9261310000000003e-05,4.9469902173913046e-05,5.1186359999999999e-05],"557056":[0.16564989399999999,0.16768641849999999,0.17477000000000001,0.17490877399999999,0.17533307300000001,0.17558890799999999,0.17577835600000002,0.17623118400000001,0.17660037000000001,0.17768445399999999,0.17773203949999999,0.17773860799999996,0.17928802799999999,0.18045524499999999,0.181412191,0.18152584300000002,0.183766131,0.18478680049999999,0.18570223,0.18823405200000001],"832":[0.000111352,0.000113801,0.00011417340000000006,0.00011419200000000001,0.00011486599999999999,0.00011639233333333334,0.00011645979999999999,0.000116538,0.000117516,0.000117632,0.00011812991666666668,0.00011816174999999995,0.00011863200000000003,0.00011959786440677963,0.000119852,0.00012196,0.00012205112987012992,0.00012298100000000001,0.00012548321333333336,0.00012687260256410258],"9437184":[4.9724136940000001,4.973293602,4.9806394010000004,4.9863700115,4.9865193589999999,4.9890249285000001,4.9917535439999998,4.9917744810000002,4.9924807209999997,4.9995803155000003,5.00198622,5.0053690765000001,5.0067595069999999,5.0099952505000003,5.0131712154999999,5.0137256004999999,5.015978789,5.0249764270000004,5.0659226635000003,5.0679349800000004],"3584":[0.000483559,0.00048486700000000021,0.00050651600000000004,0.00050698211111111109,0.00051113700000000027,0.00051596600000000008,0.00052263099999999996,0.00052290961111111105,0.00052331100000000037,0.00052903622222222227,0.00052943900000000025,0.00053224999999999985,0.00053285783333333319,0.00053290599999999998,0.00053374200000000003,0.00053744194444444522,0.00055047727777777773,0.00055428558823529409,0.00055893200000000016,0.00056119749999999978],"6291456":[3.2102218164999998,3.212549938,3.2176470020000001,3.2179487199999999,3.2238850459999999,3.224390047,3.2249584360000001,3.2263289794999999,3.2281184574999999,3.2282864770000002,3.2331832265,3.2353942170000001,3.2376869225,3.23842505,3.2394229210000001,3.2409060104999998,3.2458941590000001,3.2519856420000002,3.3102724569999999,3.322393006],"256":[3.0071999999999999e-05,3.0510833333333333e-05,3.0879e-05,3.1467999999999998e-05,3.1543080000000005e-05,3.1755999999999999e-05,3.2101000000000003e-05,3.2274000000000003e-05,3.2500899999999999e-05,3.2785660000000004e-05,3.2841500000000001e-05,3.2906252631578945e-05,3.3018031914893615e-05,3.3042739999999997e-05,3.311524e-05,3.3129990000000002e-05,3.3261250000000003e-05,3.3401269999999999e-05,3.369266666666667e-05,3.4555660000000002e-05],"15204352":[8.2893148540000006,8.2897549339999994,8.2914807469999996,8.2927449094999997,8.2954349530000009,8.3001031770000004,8.3077218155000008,8.3142969294999993,8.3216037939999996,8.3266050269999994,8.3288915125000003,8.329926919,8.3311679630000004,8.3391196455000003,8.3434432125000004,8.3524322074999997,8.3531213095000005,8.3532521365000001,8.3679036389999997,8.3879573619999999],"28672":[0.0042521024999999978,0.0042773780000000001,0.0043060095000000001,0.0043065255,0.004325477000000002,0.0043265565000000002,0.004358425,0.0043592850000000001,0.0043724879999999999,0.0044347365000000014,0.0044557290000000003,0.0044662104999999997,0.0044802425000000021,0.0044831395000000003,0.0045375254999999986,0.0045476530000000013,0.0045684365000000001,0.0045846420000000016,0.0045922310000000004,0.0046120789999999998],"768":[9.9495999999999997e-05,0.000102118,0.00010324600000000001,0.000104572,0.000104714,0.000106199,0.00010696552873563216,0.00010845782417582419,0.00010956976744186046,0.00010972649999999997,0.00011134019512195122,0.00011321750574712648,0.00011358000000000003,0.00011370757317073172,0.00011397766666666666,0.00011465266666666667,0.000114733,0.00011495877380952376,0.00011607121621621626,0.00011694900000000001],"212992":[0.046752128499999997,0.047202873999999999,0.047319563499999988,0.04847402499999999,0.048512126999999974,0.048555542999999993,0.048808285,0.049534007000000012,0.050428555,0.050816053999999999,0.050828603999999999,0.051450552999999996,0.051490874500000006,0.052636001000000009,0.052749135000000003,0.052938408000000013,0.053093583,0.053170196000000003,0.057998161000000013,0.058489951999999998],"864":[0.00011279585714285712,0.00011427374999999999,0.000115486,0.000116898,0.00011879133333333333,0.000119535,0.0001203944,0.000121229125,0.00012245306249999993,0.00012296072500000001,0.00012307300000000007,0.000124146,0.0001242277027027027,0.00012444000000000002,0.00012477120779220781,0.000124807,0.00012508000000000002,0.00012770128571428573,0.00013272199999999999,0.00013892943283582083],"352":[4.6825000000000007e-05,4.7668809999999994e-05,4.8093000000000002e-05,4.8303999999999997e-05,4.8483999999999999e-05,4.8955129999999997e-05,4.9088719999999998e-05,4.9438759999999996e-05,4.9442826530612248e-05,4.9461e-05,4.982503e-05,4.9970629213483146e-05,5.0106180851063831e-05,5.0192270000000002e-05,5.0276040000000001e-05,5.0683999999999998e-05,5.0770187500000006e-05,5.1617042857142854e-05,5.163641e-05,5.3181275000000004e-05],"253952":[0.058310996500000004,0.05887189700000002,0.059136288500000002,0.059638367499999997,0.059828152000000002,0.060144202500000007,0.060225759999999996,0.0608562635,0.0610631305,0.061665438000000017,0.06169578099999997,0.061885468499999999,0.062420069500000022,0.062740569999999996,0.062758482000000004,0.063020491499999998,0.063029075500000004,0.063873118500000034,0.064804574000000004,0.06666490550000001],"960":[0.00013340799999999995,0.00013370299999999999,0.00013520899999999999,0.00013625399999999999,0.00013719733333333336,0.00013721958823529408,0.00013727100000000001,0.00013754524999999999,0.00013828666666666669,0.00013853100000000006,0.00013865500000000006,0.000139264,0.00013994999999999999,0.00014020700000000005,0.00014069499999999995,0.00014264399999999993,0.00014264900000000001,0.0001451271249999999,0.00014638913846153851,0.00014687500000000001],"24576":[0.003515158,0.0035661025,0.0035700545000000002,0.003584162000000001,0.0035871645000000001,0.0036285154999999999,0.0036317484999999995,0.0036409655000000001,0.003642471,0.003646809999999999,0.0036819449999999998,0.0036864559999999998,0.0036938054999999998,0.0036952550000000006,0.0037081045,0.003737902,0.003804155,0.003890456,0.0039393449999999986,0.0041921099999999998],"7680":[0.0010692729999999999,0.001071921,0.0010723359999999999,0.0010750829999999999,0.001077029,0.001080407,0.0010888480000000001,0.001092715,0.0011079060000000003,0.0011108769999999999,0.0011231222499999993,0.001126271625,0.0011302642500000001,0.0011331010000000001,0.0011386860000000003,0.001139341625,0.0011535516249999999,0.0011562731250000006,0.00116075425,0.0012467799999999999],"294912":[0.070398993000000035,0.071145154000000016,0.072357321500000057,0.074216876999999987,0.074676917000000037,0.07478988999999997,0.07484724299999998,0.074950801000000039,0.075375237999999997,0.07540707499999999,0.07547567899999999,0.076136017,0.076395557500000003,0.076557144500000021,0.076745921500000008,0.076763123999999988,0.07819102800000001,0.07824377099999999,0.079059022999999992,0.08183721699999999],"1048576":[0.37767597050000001,0.37811324299999999,0.37930419799999998,0.38180815099999998,0.39059021100000002,0.39101088049999999,0.39241812399999998,0.39370223449999997,0.39381008100000003,0.39386039099999998,0.39527571800000005,0.39748578499999998,0.399568115,0.40138190400000001,0.40146149349999999,0.41213502300000004,0.41246025549999998,0.42342708750000002,0.42650470350000003,0.45847855450000002],"10485760":[5.566172516,5.5909784169999996,5.5937883375000004,5.5973499740000001,5.5975483495000002,5.5990937069999998,5.5999511499999999,5.6057417059999999,5.6075953035000001,5.6081692065000004,5.6135988379999997,5.6167792419999998,5.6178155644999999,5.6188264940000003,5.6232185504999999,5.6266741444999999,5.6424697359999998,5.6547566070000004,5.6558183959999999,5.7484332924999997],"344064":[0.087164457999999986,0.089491960999999981,0.089999546000000041,0.090391684999999972,0.090851424,0.091510473000000009,0.091536889499999996,0.091933217499999956,0.092515825000000024,0.092646073500000023,0.093169148000000021,0.09376869000000003,0.095050372000000008,0.09609061100000002,0.097118613000000006,0.097348686500000017,0.097475755000000025,0.09862731600000002,0.098656889999999997,0.099048147000000003],"288":[3.7476499999999999e-05,3.8220999999999999e-05,3.8498000000000003e-05,3.8964590000000002e-05,3.9289999999999998e-05,3.9295499999999997e-05,3.9782690476190478e-05,4.0568235294117647e-05,4.0589390000000001e-05,4.0698280000000002e-05,4.0717560000000002e-05,4.0886610000000003e-05,4.1401529999999995e-05,4.1570929999999994e-05,4.1824499999999999e-05,4.1848490000000004e-05,4.2080080000000003e-05,4.3080000000000001e-05,4.3973000000000001e-05,4.4813580000000006e-05],"1152":[0.00015287100000000001,0.000158023,0.00015979199999999999,0.00016356999999999993,0.00016362749999999999,0.00016395299999999994,0.00016429873684210521,0.0001644148035714286,0.000165167,0.000165341,0.00016577674999999995,0.00017063650000000003,0.00017095468421052633,0.00017246000000000001,0.00017246500000000001,0.00017446285454545454,0.00017562332075471692,0.00017636794642857142,0.000185102,0.000185747],"384":[5.1714e-05,5.2145188235294122e-05,5.2621770114942523e-05,5.3226179487179481e-05,5.336236e-05,5.3499999999999999e-05,5.3850000000000001e-05,5.4586149999999999e-05,5.4709259999999999e-05,5.4783e-05,5.4873000000000001e-05,5.5367899999999996e-05,5.554e-05,5.5622999999999999e-05,5.5810205479452453e-05,5.6033300000000004e-05,5.6055849999999996e-05,5.6837783783783784e-05,5.8406074626865671e-05,6.0203859999999999e-05],"2304":[0.00030681599999999996,0.00031235699999999998,0.00031383400000000014,0.000321782,0.00032202799999999992,0.0003284872857142857,0.00032857982758620688,0.00032876300000000009,0.00032976931034482752,0.00033088700000000009,0.0003314783103448277,0.0003333006551724138,0.00033510144444444449,0.00033839699999999999,0.00033999550000000012,0.00034097799999999992,0.00034106200000000016,0.00034379699999999996,0.000343803,0.0003687509999999999],"896":[0.000120443,0.0001219115,0.00012414299999999995,0.00012442360810810811,0.0001244935,0.00012452700000000001,0.000124652,0.00012595715384615386,0.00012618800000000001,0.00012631,0.00012648299999999999,0.00012652272,0.00012752553846153846,0.00012754150000000001,0.000129336,0.00012951954666666666,0.00013191441333333334,0.00013221142253521125,0.00013257098630136983,0.00013628499999999999],"480":[6.2026000000000006e-05,6.3008499999999998e-05,6.5662999999999998e-05,6.5698819999999997e-05,6.6567000000000001e-05,6.6633999999999999e-05,6.6741909999999999e-05,6.6850430000000002e-05,6.6951914893617018e-05,6.7037020000000003e-05,6.7574870000000007e-05,6.7644499999999999e-05,6.8675849999999994e-05,6.8874022727272719e-05,6.8931379999999994e-05,6.9318000000000003e-05,7.0753740000000003e-05,7.0819190000000001e-05,7.0955939999999999e-05,7.4469999999999997e-05],"1441792":[0.59175211300000008,0.59207184749999997,0.59257441150000001,0.596617285,0.60045884400000005,0.60069735200000007,0.60375924199999997,0.60391103899999998,0.60483429799999999,0.60907344200000002,0.60992775300000002,0.61121373850000005,0.61163952399999999,0.61566902049999994,0.62050973999999992,0.62262981399999995,0.62448412600000003,0.63147805049999994,0.63457727600000002,0.65801103950000006],"992":[0.00013535000000000001,0.000136186,0.0001367686666666667,0.000136828,0.00013895199999999999,0.00014031687142857142,0.00014041299999999999,0.00014145999999999999,0.00014148719117647058,0.00014317181967213113,0.00014485075000000001,0.00014568840425531921,0.00014723411940298505,0.000147291046875,0.00014772401785714291,0.00014832372727272729,0.00014945783333333336,0.00015010625862068962,0.00015012513636363637,0.000155818],"3968":[0.000528094,0.00055506000000000012,0.00055687100000000002,0.0005595540000000003,0.00056079300000000019,0.00056179299999999999,0.00056274299999999999,0.00056296029411764706,0.00056709149999999999,0.00057321087499999997,0.00057325799999999999,0.00057510662500000003,0.0005799426666666666,0.0005818267647058823,0.00058224399999999999,0.00058277900000000007,0.00058359118749999996,0.00058527288235294132,0.00058575586666666669,0.00059326000000000018],"6400":[0.000882766,0.00088966800000000003,0.00090037299999999967,0.00090331700000000005,0.0009034850000000001,0.00090920699999999977,0.00091796100000000067,0.00091956630000000002,0.00092425000000000005,0.00092513460000000008,0.00092663299999999995,0.00092679099999999994,0.00092771890000000032,0.00093747999999999976,0.00093958819999999973,0.00095759069999999961,0.00096063055555555574,0.00096916419999999964,0.00097479079999999963,0.0010010966666666667],"1344":[0.00017689799999999999,0.00018023566666666675,0.000181072,0.00018165299999999999,0.00018243900000000003,0.00018396499999999999,0.000187274,0.00018832613207547168,0.00018836499999999999,0.00019141324489795915,0.00019283433333333328,0.00019436259183673471,0.000194814,0.000195501,0.00019722104347826087,0.000197992,0.00020031266666666663,0.00020056000000000002,0.00020323474999999993,0.00020542020833333335],"126976":[0.025212483000000001,0.0253801845,0.0255509545,0.0255978215,0.025714914500000002,0.025730119000000006,0.025881363000000001,0.026055894999999996,0.026056780500000008,0.026104914999999996,0.026139499,0.026286558500000001,0.026453584999999995,0.026591788500000001,0.026630683500000009,0.026764333000000001,0.026797572499999988,0.026923145500000002,0.027516196999999964,0.027933232999999991],"2883584":[1.3423125654999999,1.345390241,1.350951842,1.3548000600000001,1.359694307,1.3606181995,1.360674911,1.3624434715,1.3636072515,1.366497208,1.3691316145000001,1.3707120719999999,1.3727894775,1.3743693880000001,1.3751290519999999,1.378973132,1.3802702140000001,1.3849025669999999,1.404946713,1.4289906800000001],"753664":[0.253931721,0.25597033800000002,0.25769199799999998,0.25846431850000001,0.26324540099999999,0.26355527899999998,0.26552778849999997,0.26669357250000003,0.26866612950000002,0.26937553199999997,0.270029136,0.27285061099999997,0.274181438,0.27425033249999997,0.27644982699999998,0.27671357800000002,0.27896121299999999,0.282895165,0.28545122300000003,0.28979016599999996],"16384":[0.0021001750000000001,0.0021070469999999999,0.0021177330000000001,0.0021187322500000002,0.0021191140000000005,0.0021219157500000012,0.0021259290000000012,0.0021314345000000008,0.0021401160000000001,0.0021570060000000004,0.00215840075,0.0021635489999999999,0.0021749739999999992,0.0021752255,0.0021755959999999993,0.0021892697500000002,0.002211364,0.0022308097499999994,0.0022757799999999998,0.0022901354999999993],"131072":[0.023888684,0.024147827,0.024414890999999998,0.0244910565,0.024499324999999999,0.024966006499999999,0.025138694999999999,0.025264930000000019,0.025276191,0.025543529999999998,0.025569748,0.025619384000000002,0.025733756,0.025893063500000001,0.026021938000000001,0.026142566499999999,0.026214277000000001,0.026285382500000003,0.026749185500000001,0.027171828500000012],"458752":[0.12895627500000001,0.13318594550000001,0.133296097,0.134194335,0.13434317000000001,0.13515062,0.13543366999999995,0.135480089,0.13569895300000001,0.13579216449999998,0.1359755265,0.13640247799999999,0.13774847200000001,0.13921773400000004,0.13993048899999999,0.14072331300000002,0.14087512150000001,0.14239185850000002,0.14275242499999999,0.15032247650000002],"172032":[0.036275863499999998,0.036675343999999999,0.036836484500000002,0.037520303499999998,0.037631983500000007,0.037876979999999991,0.037941082500000008,0.037985604999999999,0.0381105755,0.038305141000000008,0.038404816000000001,0.038420596500000015,0.038442826500000013,0.038488291000000022,0.038606397000000001,0.038615271,0.039353492500000004,0.039503776999999997,0.0397099115,0.044668952000000005],"12288":[0.001736727,0.0017523910000000001,0.0017533799999999999,0.001760115,0.0017739198000000008,0.0017965186000000011,0.001799400400000001,0.0017994579999999999,0.0018000393999999999,0.0018101180000000001,0.001814728,0.001815283,0.0018158651999999997,0.0018345178,0.0018374845000000001,0.0018415790000000001,0.0018439234000000005,0.0018479622000000002,0.0018540207999999999,0.0018638970000000002],"14680064":[7.968949394,7.9863171570000002,7.9878100935000003,7.9937272735000002,7.9989694519999999,8.0097449019999996,8.0117707055,8.0128834980000008,8.0129858345000002,8.0233013564999993,8.0248282730000007,8.0293142460000002,8.0303654729999998,8.0308907069999993,8.0360382784999995,8.0375281805000007,8.0392428200000001,8.0402334685000003,8.041643079,8.0464209839999992],"1536":[0.000204577,0.00020561099999999991,0.00020767799999999993,0.000213227,0.00021357799999999991,0.000213601,0.00021493263043478265,0.000214952,0.00021656900000000001,0.000217789,0.00021789307500000001,0.00021900399999999999,0.00021933037142857141,0.00021945370000000012,0.00022121680952380952,0.0002225247045454546,0.00022353129999999992,0.00022585576190476179,0.00023373502380952385,0.00024124453846153851],"25600":[0.0036796020000000014,0.0036911499999999998,0.003705897000000001,0.0037660790000000012,0.003770738,0.0037767580000000003,0.003790893,0.0038332840000000002,0.003839173,0.00383965,0.0038525879999999997,0.0038541485000000001,0.0038615820000000001,0.003894401,0.0039123034999999995,0.0039224710000000003,0.0040216160000000004,0.0040351839999999998,0.0040932380000000025,0.0041533874999999994],"1835008":[0.78942783750000001,0.78978899349999998,0.79102536649999999,0.80138910600000002,0.80227472600000005,0.80251217900000005,0.81261559049999998,0.81263144899999995,0.81513558399999997,0.81859121300000004,0.81935308750000002,0.81970440700000002,0.82605992250000004,0.82990740900000004,0.83018541349999997,0.83773011800000008,0.83887634049999993,0.84076074450000005,0.84190315650000003,0.84295514900000001],"10752":[0.00151161,0.001519128,0.0015366500000000001,0.0015369440000000006,0.001543177,0.0015489200000000001,0.0015493829999999997,0.001554647833333333,0.0015551395,0.0015604460000000001,0.0015609139999999996,0.0015680566666666667,0.0015747440000000001,0.0015748790000000006,0.001584317,0.0015856666666666664,0.001592694,0.001624952,0.001652737,0.0016588281999999996],"21504":[0.0030288109999999997,0.0031172789999999988,0.0031173436666666666,0.0031250323333333338,0.0031417569999999998,0.003143631,0.003146795,0.003149733,0.0031570503333333334,0.0031746546666666666,0.0031889559999999997,0.0032012526666666671,0.0032040789999999999,0.0032120756666666672,0.00323099,0.0032338534999999994,0.0032354373333333326,0.0032502973333333337,0.003279466999999999,0.0034788199999999992],"7602176":[3.9414016744999998,3.942434038,3.9463601105000001,3.9467596045,3.9476480765000002,3.9545940384999998,3.959809425,3.9610525550000002,3.9633152924999999,3.9647367529999999,3.9665246970000001,3.9734723199999999,3.9750235224999999,3.9786700115000002,3.9825750759999998,3.9828716019999999,3.9903277199999998,3.9914073160000001,4.0098669259999999,4.0575085069999997],"5632":[0.00076770499999999993,0.00077491500000000004,0.000783747,0.00078616999999999956,0.00078800699999999997,0.00079001600000000037,0.00079231799999999986,0.000797057,0.00079935,0.00080207133333333339,0.000802635,0.00080349399999999976,0.00080530799999999991,0.00080601999999999996,0.00081926399999999978,0.00082267199999999966,0.00084258599999999999,0.00085465490909090894,0.00090177900000000066,0.00091043500000000002],"10":[1.1620400000000001e-06,1.1751599999999999e-06,1.2147100000000001e-06,1.2307799999999998e-06,1.2385400000000001e-06,1.2515500000000001e-06,1.2799499999999999e-06,1.3116099999999999e-06,1.3192600000000002e-06,1.3241599999999999e-06,1.3312299999999998e-06,1.3315899999999998e-06,1.3327400000000002e-06,1.33304e-06,1.3560100000000001e-06,1.37714e-06,1.37932e-06,1.42336e-06,1.4258399999999998e-06,1.4906000000000002e-06],"3145728":[1.489829391,1.490657433,1.4945818850000001,1.4955220819999999,1.4957751589999999,1.4973568669999999,1.4978369389999999,1.502270403,1.5028432789999999,1.5052782,1.5071960405,1.5074326345,1.5077583295000001,1.5122906635,1.5174388485000001,1.5182048875,1.5206381124999999,1.5214136195000001,1.5688181864999999,1.5763067550000001],"245760":[0.0559081315,0.056238122000000001,0.057411986999999998,0.058182786500000014,0.058248917500000018,0.058743193999999999,0.058772332999999996,0.059315296000000003,0.059359676,0.05994843900000002,0.060125885999999996,0.0605703925,0.060644600499999979,0.060835666499999996,0.060850413999999999,0.061185035499999985,0.061533744999999973,0.063312796000000018,0.064960673999999996,0.066247102500000016],"1728":[0.00023318699999999999,0.00023827700000000001,0.00023979200000000001,0.000241874,0.00024296782051282058,0.00024384800000000001,0.00024572051282051289,0.00024699397435897435,0.00024732900000000002,0.00024830557142857144,0.00025065999999999999,0.00025086900000000003,0.00025293657894736828,0.00025294015789473678,0.00025664089473684205,0.00025699700000000002,0.00025701799999999992,0.00025827480000000002,0.00026234256756756748,0.00026601091891891894],"11":[1.2682e-06,1.27696e-06,1.3168846153846155e-06,1.333e-06,1.34869e-06,1.3633199999999998e-06,1.39942e-06,1.42985e-06,1.4310000000000001e-06,1.4403199999999999e-06,1.4439100000000001e-06,1.4521099999999999e-06,1.46023e-06,1.4614300000000001e-06,1.4711499999999999e-06,1.47436e-06,1.4801699999999998e-06,1.4900199999999998e-06,1.52477e-06,1.6053399999999999e-06],"1114112":[0.42070084149999998,0.42124378200000001,0.43473224599999999,0.43485173199999999,0.43548716500000001,0.4385118905,0.43986285200000003,0.44034164949999999,0.44044986600000002,0.44082185500000004,0.44142466699999999,0.44551054499999998,0.44767206850000002,0.44791217900000002,0.452699254,0.45330189099999996,0.46135299149999998,0.46307740100000006,0.46363596000000001,0.4640353425],"12":[1.3863899999999999e-06,1.39533e-06,1.40963e-06,1.4319699999999998e-06,1.44629e-06,1.47706e-06,1.48873e-06,1.5133099999999998e-06,1.51624e-06,1.55442e-06,1.57204e-06,1.5777599999999999e-06,1.58976e-06,1.59428e-06,1.6066899999999999e-06,1.6440799999999999e-06,1.65031e-06,1.66755e-06,1.69192e-06,1.7269599999999999e-06],"7340032":[3.79101401,3.8059283100000001,3.8081425124999999,3.8088063750000001,3.8103422034999999,3.8129367279999999,3.8130957954999998,3.8139117479999998,3.8150224449999999,3.8213935339999998,3.8217748739999999,3.8250747005000001,3.8268807000000002,3.8278840810000001,3.8304356854999999,3.8334157690000001,3.8407675695000001,3.846309159,3.8540944619999999,3.893535188],"7168":[0.0010082539999999997,0.0010109839999999999,0.0010157570000000002,0.0010219746666666667,0.0010248123333333288,0.001025827,0.001032074,0.0010386647777777781,0.0010417386666666669,0.0010445006666666662,0.001047381,0.0010485539999999997,0.001048556,0.0010534920000000001,0.0010603693333333334,0.0010667646666666663,0.0010747040000000001,0.0010752770000000006,0.001086341,0.0011939633749999995],"13":[1.4637100000000001e-06,1.5197299999999998e-06,1.5389e-06,1.6113200000000001e-06,1.6420599999999999e-06,1.6502300000000001e-06,1.67032e-06,1.67447e-06,1.6801500000000001e-06,1.6924400000000001e-06,1.70576e-06,1.7065599999999998e-06,1.7094600000000001e-06,1.7224499999999999e-06,1.7276199999999999e-06,1.7336500000000001e-06,1.7688999999999999e-06,1.796e-06,1.8270100000000001e-06,1.8586300000000001e-06],"6029312":[3.055492718,3.0593893649999999,3.0683382534999999,3.0715339720000001,3.0743645329999998,3.0743954859999998,3.0816580619999998,3.082956324,3.0834726794999998,3.085490144,3.0856002569999998,3.0872421459999999,3.0911465515000001,3.091456081,3.0937463479999998,3.0942291640000001,3.1124426215000001,3.1316621205000001,3.1542802719999998,3.1731162620000002],"14":[1.6051999999999999e-06,1.61187e-06,1.6232200000000001e-06,1.6326499999999999e-06,1.7204699999999999e-06,1.7629599999999998e-06,1.7685600000000001e-06,1.7778900000000001e-06,1.7788600000000002e-06,1.79306e-06,1.8082399999999999e-06,1.8420900000000001e-06,1.8516899999999999e-06,1.8525400000000001e-06,1.8592300000000001e-06,1.8868499999999998e-06,1.9051499999999999e-06,1.92794e-06,1.9797299999999998e-06,2.0863700000000001e-06],"3200":[0.00042822699999999988,0.00045499200000000015,0.00045514500000000001,0.000456308,0.00045713466666666658,0.00046517833333333344,0.0004658147619047621,0.00046599400000000012,0.00046926273684210526,0.00047039200000000003,0.00047049684999999985,0.000471068,0.0004711387142857142,0.00047415800000000002,0.00047567200000000001,0.00047746109999999997,0.00047936499999999983,0.00048356321052631589,0.00049146900000000024,0.00050778900000000003],"20":[2.2994500000000001e-06,2.29977e-06,2.32984e-06,2.4207100000000002e-06,2.4227000000000001e-06,2.43132e-06,2.5028399999999998e-06,2.5393699999999998e-06,2.5425399999999996e-06,2.5772799999999997e-06,2.5906399999999996e-06,2.6088100000000002e-06,2.6395900000000003e-06,2.64446e-06,2.6648653846153846e-06,2.6765300000000001e-06,2.7405700000000001e-06,2.7674e-06,2.7683700000000001e-06,2.810527027027027e-06],"204800":[0.044734925499999988,0.0452731865,0.045319209000000013,0.0454141895,0.045553557000000001,0.045600995999999991,0.046178681999999992,0.046942610000000003,0.047159561999999988,0.047278779499999979,0.047294944000000019,0.047418540499999988,0.04807139400000001,0.048133194000000004,0.049039235,0.049539927000000004,0.050026420999999988,0.051824604499999982,0.051924119000000005,0.05773112100000001],"15":[1.7101599999999999e-06,1.7591400000000001e-06,1.8277099999999999e-06,1.886e-06,1.8969400000001803e-06,1.9034000000000001e-06,1.9228100000000003e-06,1.9296000000000001e-06,1.9415099999999998e-06,1.9588599999999997e-06,1.9603799999999998e-06,1.9822100000000001e-06,2.00373e-06,2.0066999999999998e-06,2.0090499999999998e-06,2.01378e-06,2.0467700000000001e-06,2.0646399999999999e-06,2.0857499999999999e-06,2.1039899999999998e-06],"13312":[0.0018711539999999999,0.001885804,0.001892712,0.001909291,0.0019246004,0.00193359,0.0019350782000000001,0.0019557807500000008,0.00195969,0.0019685060000000001,0.0019727780000000001,0.0019736655999999992,0.0019765055000000001,0.0019776095000000001,0.0019785625000000007,0.0019929735000000001,0.0020039332500000001,0.0020151987500000002,0.0020468560000000005,0.0020856249999999998],"4980736":[2.4871335925000002,2.4878248565000001,2.4918035550000002,2.4977345340000001,2.498062295,2.4989487750000001,2.4996866670000002,2.5017004145000001,2.5018510355000001,2.5027382084999998,2.5057915369999999,2.5077327199999999,2.5088931489999999,2.5089724520000001,2.5107580569999999,2.5134080640000001,2.5225219349999999,2.5226477740000002,2.5318175780000001,2.599471222],"118784":[0.023609046499999998,0.023728332000000001,0.023994178500000001,0.024041395,0.024102135,0.024279158000000002,0.024323211000000004,0.024355693000000001,0.024461776500000001,0.024608214,0.024887093499999992,0.024982322000000008,0.02498798,0.025096349,0.0252032305,0.025347507000000002,0.025439215999999997,0.025451823500000005,0.025942699,0.029534302999999984],"51200":[0.0083629540000000023,0.008490894000000004,0.008493452999999998,0.0085302139999999995,0.0085424719999999937,0.0085852159999999979,0.0086121679999999999,0.008622320999999997,0.008629355,0.0086442519999999981,0.0086771609999999992,0.0087036170000000003,0.0087060950000000005,0.0087231970000000002,0.0087402650000000005,0.0087726140000000067,0.0087974320000000043,0.0088974709999999953,0.0090148229999999999,0.0091145859999999992],"16":[1.63252e-06,1.63631e-06,1.6821e-06,1.7181999999999999e-06,1.79276e-06,1.7980800000000001e-06,1.8133400000000001e-06,1.82005e-06,1.85029e-06,1.8603648648648649e-06,1.8610299999999998e-06,1.87559e-06,1.9121100000000001e-06,1.9142599999999998e-06,1.92283e-06,1.9386500000000001e-06,1.9611800000000003e-06,2.0014099999999999e-06,2.0503699999999999e-06,2.0551855670103093e-06],"21":[2.3978799999999998e-06,2.4530199999999998e-06,2.4890900000000002e-06,2.58473e-06,2.6250400000000001e-06,2.6454499999999998e-06,2.6603333333333336e-06,2.6638100000000001e-06,2.6719800000000003e-06,2.69075e-06,2.7244800000000002e-06,2.7424100000000001e-06,2.7683299999999998e-06,2.77122e-06,2.7845900000000001e-06,2.8495200000000001e-06,2.89608e-06,2.8985900000000002e-06,2.9020599999999999e-06,3.1205500000000001e-06],"917504":[0.32480998900000002,0.33012142200000005,0.33253256399999997,0.33405557499999999,0.33443212099999997,0.3370426285,0.33970771999999999,0.341248253,0.34280853150000001,0.34318175299999998,0.343906139,0.346833314,0.35001843499999996,0.35209541500000002,0.35367511899999998,0.35815738949999998,0.35861822900000001,0.36532527300000001,0.3744818875,0.38213348000000003],"22":[2.5098600000000001e-06,2.6104699999999998e-06,2.7171600000000002e-06,2.7565000000000002e-06,2.7595099999999999e-06,2.76639e-06,2.7727499999999998e-06,2.783151515151515e-06,2.82449e-06,2.8335699999999999e-06,2.8508888888888887e-06,2.9094e-06,2.9098699999999999e-06,2.9143000000000002e-06,2.9324400000000003e-06,2.9718000000000001e-06,3.0073800000000001e-06,3.0338300000000001e-06,3.0844899999999996e-06,3.09061e-06],"4864":[0.00066327400000000026,0.00068553199999999998,0.00068657500000000025,0.00068782700000000001,0.00069067600000000009,0.00069696200000000008,0.00069818999999999979,0.00069844833333333354,0.000699043,0.00070082438461538431,0.0007042499999999998,0.00070887230769230787,0.00070999950000000017,0.00071288849999999991,0.00071503792307692324,0.00071630061538461545,0.00072472161538461566,0.00072698053846153839,0.00073749316666666689,0.00074315484615384674],"17":[1.9517599999999998e-06,1.9650000000000002e-06,1.99583e-06,2.1333899999999999e-06,2.14855e-06,2.1535000000000002e-06,2.1605599999999999e-06,2.16072e-06,2.1983799999999999e-06,2.2032200000000001e-06,2.22031e-06,2.2338800000000002e-06,2.2408199999999999e-06,2.25477e-06,2.2816100000000002e-06,2.2845400000000002e-06,2.2878100000000002e-06,2.4238500000000001e-06,2.5111699999999998e-06,2.5196899999999999e-06],"14848":[0.0021023110000000004,0.0021114860000000001,0.0021152849999999993,0.0021247607500000007,0.0021314569999999998,0.0021360487499999998,0.002136289,0.0021477519999999993,0.0021576270000000001,0.0021661060000000001,0.0021727265,0.002183014,0.0021987980000000001,0.00220207,0.00221560475,0.0022349920000000007,0.0022516229999999999,0.0022759829999999992,0.0024006370000000002,0.0024440066666666666],"23":[2.5985500000000003e-06,2.6329000000000002e-06,2.8331100000000003e-06,2.8657200000000001e-06,2.87707e-06,2.8842000000000003e-06,2.9135899999999997e-06,2.9692400000000001e-06,2.98536e-06,3.0035699999999999e-06,3.0149199999999998e-06,3.0281999999999997e-06,3.0508100000000004e-06,3.06106e-06,3.0941299999999997e-06,3.1131699999999997e-06,3.1525900000000003e-06,3.18784e-06,3.20085e-06,3.2025499999999999e-06],"786432":[0.26787058050000001,0.26869532350000003,0.27091305799999998,0.27120454999999999,0.27502433700000001,0.27512737349999999,0.278211129,0.27864816100000001,0.27903354899999999,0.28054302799999997,0.28239786750000001,0.28267968799999998,0.28697317,0.28819270899999999,0.29450896849999997,0.29581957000000003,0.296725136,0.29811611399999999,0.30514698950000002,0.30936839299999996],"18":[2.0656900000000001e-06,2.0824499999999999e-06,2.1289400000000003e-06,2.1824799999999997e-06,2.2056600000000001e-06,2.2439899999999998e-06,2.2506399999999999e-06,2.2834500000000001e-06,2.3130000000000001e-06,2.31585e-06,2.3434000000000003e-06,2.3691399999999997e-06,2.3720899999999998e-06,2.37725e-06,2.39218e-06,2.4047999999999998e-06,2.41599e-06,2.4914400000000002e-06,2.4986799999999998e-06,2.4988799999999998e-06],"1638400":[0.68128712300000005,0.68787225000000007,0.69754729900000001,0.698497496,0.70059422049999998,0.70653089699999994,0.71138661049999996,0.71219410449999998,0.71248309899999995,0.71287128550000001,0.71385067749999997,0.715637525,0.71752132800000001,0.72472923,0.72957319450000002,0.73025872749999998,0.73610676949999998,0.74003961100000004,0.74570995849999999,0.76661351550000001],"7864320":[4.0853982950000001,4.0895474890000001,4.0940751290000001,4.1078922264999997,4.1105438545000004,4.1119054960000003,4.1127353815000003,4.1127943634999999,4.1131210295000002,4.1151542404999999,4.1167520770000001,4.1184687909999997,4.1217592190000003,4.1270932914999996,4.1272225814999999,4.1355517470000001,4.1383292660000004,4.1419599624999996,4.1714596879999997,4.1808671110000004],"24":[2.6967700000000002e-06,2.8552799999999999e-06,2.8762200000000002e-06,2.9645499999999998e-06,2.9771900000000002e-06,2.9887899999999998e-06,2.9985899999999997e-06,3.0227900000000002e-06,3.0482638888888891e-06,3.0755099999999999e-06,3.1311200000000001e-06,3.1472699999999999e-06,3.1561126760563378e-06,3.1762000000000002e-06,3.1942800000000004e-06,3.2414800000000001e-06,3.2524800000000001e-06,3.3341599999999999e-06,3.36267e-06,3.36276e-06],"14155776":[7.6428804790000004,7.6669506055000003,7.6802837630000003,7.6830471899999999,7.6845454789999996,7.684958355,7.6957314810000002,7.7075435485000003,7.7091758219999997,7.7106897610000003,7.7125609549999998,7.7128566879999996,7.7198502949999996,7.7277850370000003,7.7285236800000003,7.7354342230000004,7.7356513070000004,7.7388731144999996,7.7587547585000003,7.9070061110000003],"19":[2.2103300000000002e-06,2.23174e-06,2.3174999999999998e-06,2.36605e-06,2.4156000000000002e-06,2.4303499999999999e-06,2.4322300000000002e-06,2.43316e-06,2.4415100000000001e-06,2.4721500000000001e-06,2.4816099999999999e-06,2.4832499999999999e-06,2.4927599999999998e-06,2.5077800000000002e-06,2.53476e-06,2.5474100000000002e-06,2.5480499999999997e-06,2.5836699999999999e-06,2.6805900000000004e-06,2.69948e-06],"30":[3.3818800000000001e-06,3.4319699999999999e-06,3.4647800000000001e-06,3.5770399999999996e-06,3.7402199999999999e-06,3.7744900000000002e-06,3.8075799999999996e-06,3.8329500000000003e-06,3.8853300000000003e-06,3.9052100000000002e-06,3.9851899999999997e-06,3.9892777777777781e-06,3.9918499999999997e-06,3.9942300000000002e-06,4.0314500000000002e-06,4.03508e-06,4.0466500000000005e-06,4.0746699999999997e-06,4.1244400000000001e-06,4.2519400000000002e-06],"25":[2.82173e-06,2.84413e-06,2.8530100000000003e-06,2.9828699999999999e-06,3.0334800000000001e-06,3.0883999999999999e-06,3.10347e-06,3.1135599999999999e-06,3.1277900000000001e-06,3.1325099999999999e-06,3.1419999999999997e-06,3.1547299999999996e-06,3.2071200000000003e-06,3.2616999999999996e-06,3.2688599999999999e-06,3.3037300000000002e-06,3.3550000000000001e-06,3.4392e-06,3.5451900000000001e-06,3.5501800000000002e-06],"31":[3.57285e-06,3.7127999999999998e-06,3.8724999999999998e-06,3.9186299999999996e-06,3.9265800000000001e-06,3.9279699999999999e-06,3.9648700000000004e-06,3.9654199999999999e-06,3.97242e-06,3.9892400000000001e-06,4.0007600000000005e-06,4.0432999999999999e-06,4.0625600000000005e-06,4.0681547619047625e-06,4.0727200000000005e-06,4.0884300000000001e-06,4.1769900000000001e-06,4.2478799999999999e-06,4.2918299999999997e-06,4.5998600000000004e-06],"1280":[0.00017687400000000001,0.0001776255,0.00017822849999999993,0.00017854571428571424,0.00017902900000000006,0.00018015500000000001,0.00018048700000000006,0.0001805249,0.000182511,0.00018288400000000007,0.00018357099999999994,0.00018385796153846154,0.00018540079245283014,0.00018825796000000009,0.00018838699999999998,0.00018923706122448973,0.00018954396153846148,0.00019229299999999998,0.00019435680851063834,0.00019745016666666663],"26":[2.9853399999999999e-06,3.0884700000000002e-06,3.1069399999999997e-06,3.10919e-06,3.2109800000000001e-06,3.2265299999999999e-06,3.2355300000000002e-06,3.25722e-06,3.2823700000000001e-06,3.3451299999999999e-06,3.3519099999999999e-06,3.3534899999999999e-06,3.413368421052632e-06,3.4249500000000001e-06,3.4366600000000002e-06,3.46729e-06,3.4742499999999998e-06,3.4939500000000002e-06,3.4942000000000004e-06,3.5269799999999997e-06],"3932160":[1.909277696,1.9139323395000001,1.920066676,1.9236938195,1.9239168934999999,1.924113269,1.9282238330000001,1.9300211899999999,1.9327340975,1.9335316634999999,1.935537276,1.9359829550000001,1.9405153255000001,1.943442098,1.946971078,1.9475952354999999,1.9600512765,1.9791808044999999,1.986577139,2.0222761550000001],"2432":[0.00032616649999999981,0.000328537,0.00033988600000000002,0.00034211000000000012,0.00034276899999999998,0.00034301400000000005,0.00034463499999999993,0.0003448250000000001,0.00034736914285714293,0.00035157099999999996,0.000353137,0.00035361629629629632,0.00035401825000000014,0.00035698050000000002,0.00035900500000000002,0.00035951800000000013,0.00036301516666666669,0.000365958,0.00038607600000000001,0.00039199100000000006],"32":[3.1739900000000002e-06,3.2026100000000003e-06,3.47582e-06,3.5486199999999999e-06,3.5488300000000002e-06,3.5652999999999996e-06,3.61139e-06,3.6745000000000001e-06,3.7074299999999998e-06,3.7143000000000002e-06,3.7366100000000002e-06,3.7648599999999999e-06,3.7683099999999998e-06,3.8181052631578946e-06,3.8455300000000003e-06,3.8488500000000004e-06,3.9099999999999998e-06,3.9103599999999996e-06,3.9194799999999998e-06,3.93744e-06],"27":[3.0533699999999999e-06,3.2207399999999998e-06,3.22971e-06,3.3287500000000001e-06,3.3358699999999997e-06,3.3768500000000001e-06,3.3981999999999999e-06,3.4049200000000003e-06,3.4096805555555558e-06,3.4837391304347825e-06,3.5034200000000003e-06,3.5113899999999997e-06,3.62207e-06,3.6379799999999996e-06,3.6453199999999998e-06,3.6801500000000002e-06,3.7035416666666665e-06,3.7105900000000002e-06,3.7673600000000003e-06,3.8353333333333329e-06],"409600":[0.1101810375,0.11096565600000002,0.11151452899999997,0.1115576425,0.114659645,0.11500447699999999,0.1154225125,0.11615447099999998,0.11660414400000001,0.117144345,0.11781209300000001,0.1184652215,0.119014685,0.119283662,0.12202057350000001,0.12255263499999999,0.123999027,0.12500769649999999,0.126499371,0.12998923800000001]}},{"title":"Dictionary subscript, insert, reserving capacity","results":{"28":[5.5369999999999999e-07,5.6001999999999995e-07,5.6842000000000006e-07,5.7812000000000004e-07,5.8026999999999999e-07,5.8102000000000005e-07,5.8271000000000001e-07,5.8271999999999997e-07,5.8396999999999995e-07,5.8716999999999998e-07,5.9199000000000005e-07,5.9481000000000007e-07,5.9587999999999996e-07,5.9843000000000005e-07,6.0387000000000007e-07,6.0666999999999997e-07,6.1284000000000003e-07,6.2150999999999996e-07,6.3106000000000004e-07,6.8233e-07],"34":[6.3992999999999999e-07,6.4298e-07,6.5392000000000002e-07,6.5741999999999997e-07,6.5827000000000003e-07,6.6173999999999989e-07,6.6436999999999996e-07,6.6608108108108101e-07,6.6624000000000002e-07,6.6655999999999995e-07,6.6718999999999998e-07,6.7144000000000009e-07,6.7285000000000005e-07,6.7497999999999997e-07,6.7946000000000008e-07,6.8377000000000004e-07,6.8550000000000004e-07,6.8874999999999997e-07,6.8997000000000008e-07,6.9396999999999996e-07],"29":[5.6627e-07,5.6680999999999998e-07,5.6896999999999999e-07,5.8526999999999995e-07,5.8691999999999996e-07,5.9054000000000005e-07,5.9322999999999997e-07,5.9597000000000001e-07,5.9679999999999994e-07,5.9991999999999999e-07,6.0353999999999996e-07,6.0575999999999994e-07,6.0788000000000001e-07,6.1074999999999993e-07,6.1213000000000002e-07,6.1790000000000005e-07,6.2066999999999996e-07,6.2404999999999998e-07,6.5364999999999998e-07,6.6701999999999995e-07],"40":[7.1984999999999998e-07,7.3776999999999997e-07,7.3840999999999995e-07,7.3986000000000006e-07,7.4065000000000006e-07,7.4351999999999998e-07,7.4395999999999995e-07,7.4567000000000003e-07,7.4609000000000009e-07,7.4640000000000007e-07,7.487600000000001e-07,7.5221000000000004e-07,7.5265999999999996e-07,7.619899999999999e-07,7.6340000000000007e-07,7.6807000000000002e-07,7.7197e-07,7.7602999999999994e-07,7.7681000000000009e-07,7.9652000000000004e-07],"17408":[0.00030908800000000001,0.00031422966666666655,0.00031513833333333339,0.00032219000000000008,0.00032322200000000002,0.00032374366666666668,0.00032398650000000007,0.00032410100000000014,0.00032506335714285717,0.00032661070370370373,0.00032755607142857151,0.00032968582142857146,0.00033323351724137923,0.00033754778571428573,0.00033765875862068961,0.00033796199999999987,0.00033816389285714287,0.00034039600000000019,0.00034183660714285713,0.00037077884615384604],"1472":[2.6192049999999999e-05,2.6223079999999998e-05,2.6400363636363637e-05,2.6436580000000002e-05,2.6757810000000001e-05,2.6822970000000002e-05,2.6922059999999998e-05,2.694345e-05,2.6943965517241376e-05,2.7068947368421052e-05,2.7142860000000001e-05,2.7164580000000003e-05,2.7232819999999999e-05,2.7238969999999999e-05,2.7302730000000001e-05,2.7402999999999998e-05,2.750837e-05,2.7891639999999998e-05,2.7919936170212763e-05,2.8193649999999997e-05],"112":[1.74932e-06,1.7719400000000002e-06,1.8001700000000002e-06,1.80449e-06,1.8047500000000002e-06,1.80664e-06,1.81168e-06,1.8170270270270272e-06,1.8170299999999999e-06,1.8250100000000002e-06,1.8259e-06,1.8341999999999999e-06,1.8528300000000001e-06,1.8638699999999999e-06,1.8733000000000001e-06,1.8746799999999999e-06,1.8806e-06,1.8810399999999999e-06,1.9226e-06,1.94101e-06],"1376256":[0.055633747500000011,0.056395397,0.058738934,0.061922711499999984,0.063530186000000002,0.063845029999999997,0.06413529950000002,0.064201920999999967,0.064449373500000004,0.064523713999999996,0.064731398999999981,0.06490662749999998,0.066376542000000011,0.066630265999999966,0.067000364999999978,0.067075814500000025,0.067145566500000003,0.067179184999999975,0.067662810000000004,0.071515702],"5242880":[0.31142980450000002,0.31223396599999997,0.31255151449999996,0.31283551949999999,0.3139679715,0.31429265550000002,0.31461490349999999,0.31481079499999998,0.31535263299999999,0.317592918,0.31793126849999997,0.318323258,0.31937506999999998,0.32013056299999998,0.32076133150000002,0.32182747649999999,0.32253857850000001,0.32285628599999999,0.32455143149999999,0.32710133850000001],"36":[6.7428999999999998e-07,6.8010999999999991e-07,6.8078999999999994e-07,6.8386999999999994e-07,6.8665999999999998e-07,6.8698999999999999e-07,6.8820999999999999e-07,6.8920999999999996e-07,6.9061999999999992e-07,6.9356000000000008e-07,6.9739000000000003e-07,6.9770000000000001e-07,7.0524000000000009e-07,7.0755999999999996e-07,7.0786999999999995e-07,7.0928000000000001e-07,7.1092000000000007e-07,7.1254000000000011e-07,7.2198000000000001e-07,7.5154999999999992e-07],"42":[7.4293e-07,7.4505000000000007e-07,7.5043999999999999e-07,7.5971999999999992e-07,7.6122000000000004e-07,7.6185000000000006e-07,7.6409000000000006e-07,7.6631999999999989e-07,7.671100000000001e-07,7.7608000000000005e-07,7.7680000000000002e-07,7.8492999999999998e-07,7.8675999999999999e-07,7.9095000000000003e-07,7.9118000000000002e-07,7.9276999999999997e-07,7.936300000000001e-07,7.9695000000000005e-07,8.1877000000000002e-07,8.5361000000000003e-07],"11534336":[0.77199178099999999,0.77786379800000005,0.78134072700000001,0.785031005,0.78634769049999997,0.78754121450000003,0.78761177800000004,0.78826928149999997,0.79146128399999993,0.79276637299999997,0.79519614199999999,0.79708445000000006,0.80219685399999996,0.80262283050000005,0.80391136899999993,0.80443893300000002,0.80465898899999999,0.80623598200000002,0.81011803849999997,0.81147062849999996],"114688":[0.0022292057500000002,0.002248959,0.0022720510000000002,0.0022721653333333328,0.0022735839999999999,0.0022780995000000002,0.0022807607500000002,0.0022940209999999998,0.00230022975,0.0023030765,0.0023145230000000002,0.0024977829999999999,0.0027535823333333328,0.0027785839999999989,0.0028523565000000001,0.0028545859999999997,0.0028641030000000002,0.0028781106666666673,0.0029398789999999998,0.0031780470000000007],"144":[2.2664199999999997e-06,2.2672300000000001e-06,2.2889600000000002e-06,2.3029999999999998e-06,2.3184799999999998e-06,2.3199500000000001e-06,2.3231799999999999e-06,2.3247500000000001e-06,2.3460857142857143e-06,2.3462999999999999e-06,2.3479200000000001e-06,2.3564e-06,2.3617899999999997e-06,2.4018800000000001e-06,2.4067899999999997e-06,2.4344699999999997e-06,2.4476699999999999e-06,2.5034599999999996e-06,2.7953899999999997e-06,4.2755500000000001e-06],"38":[6.8707000000000008e-07,6.9773999999999995e-07,7.0648000000000001e-07,7.0685000000000006e-07,7.0840000000000007e-07,7.1601999999999992e-07,7.1989999999999998e-07,7.2302999999999998e-07,7.2702999999999997e-07,7.2939e-07,7.3185999999999999e-07,7.329499999999999e-07,7.3427000000000002e-07,7.3445000000000002e-07,7.4171999999999995e-07,7.4216999999999998e-07,7.4505000000000007e-07,7.4730000000000003e-07,7.5067000000000009e-07,7.5354999999999997e-07],"240":[3.69352e-06,3.7276799999999998e-06,3.76184e-06,3.7651153846153848e-06,3.7698899999999998e-06,3.77809e-06,3.7831100000000001e-06,3.7851099999999998e-06,3.8037999999999999e-06,3.81683e-06,3.81792e-06,3.8318100000000002e-06,3.83504e-06,3.8554699999999994e-06,3.90453e-06,3.9380300000000006e-06,3.9680909090909088e-06,4.0186400000000002e-06,4.2014400000000004e-06,4.3066428571428575e-06],"9216":[0.00016377400000000005,0.00016858288888888887,0.00017017199999999993,0.000170426,0.00017104799999999992,0.00017116599999999999,0.0001713985,0.000171559,0.00017444499999999999,0.00017565214285714288,0.0001761016,0.0001784492,0.00017888100000000001,0.00017944976086956525,0.00018063399999999999,0.0001809162,0.0001820243333333333,0.0001833832,0.00019251511627906972,0.00019453833333333328],"44":[7.7195999999999993e-07,7.9004e-07,7.9670999999999999e-07,7.9714e-07,7.9772999999999998e-07,7.9877999999999996e-07,8.0041000000000006e-07,8.0213e-07,8.0546999999999997e-07,8.0612999999999998e-07,8.1174000000000004e-07,8.1628999999999996e-07,8.1724000000000003e-07,8.1928999999999997e-07,8.2538000000000005e-07,8.2954999999999996e-07,8.2997000000000001e-07,8.4559000000000004e-07,8.4809999999999998e-07,8.7162000000000007e-07],"1664":[2.5837500000000001e-05,2.5965999999999998e-05,2.6023000000000001e-05,2.6435413793103447e-05,2.6630500000000002e-05,2.6648e-05,2.6655479999999998e-05,2.666098e-05,2.6889040000000002e-05,2.694166e-05,2.6975982456140352e-05,2.7192400000000001e-05,2.7323540000000003e-05,2.7343810000000001e-05,2.7420810000000001e-05,2.759782e-05,2.7883169999999999e-05,2.7890570000000002e-05,2.793017e-05,2.7941709999999998e-05],"196608":[0.004567476,0.00457881,0.0045871599999999998,0.004618060999999998,0.0046554219999999993,0.0046649174999999999,0.0046699589999999996,0.0046873879999999998,0.0047484429999999998,0.0047556540000000024,0.0047589644999999998,0.004771824,0.0047930690000000014,0.0048741920000000003,0.005058763,0.0052494619999999981,0.0053019289999999978,0.0053200390000000004,0.0053386110000000001,0.0058174459999999996],"155648":[0.0033306249999999994,0.0034014420000000002,0.0034171270000000016,0.0034240289999999999,0.003430664500000001,0.0034498395000000007,0.0034599800000000001,0.0034687845000000014,0.0034701370000000007,0.0035190729999999989,0.0035284980000000001,0.0039420949999999996,0.0039566439999999996,0.0039734620000000005,0.0040474495000000013,0.0040684164999999998,0.004210625,0.0043308019999999999,0.0044146910000000001,0.0045084029999999985],"2816":[5.0587999999999997e-05,5.2558500000000002e-05,5.2865083333333333e-05,5.3335802325581397e-05,5.3557843373493969e-05,5.3742449999999999e-05,5.3782938271604937e-05,5.4057310000000002e-05,5.45237375e-05,5.4711240000000002e-05,5.4750140000000006e-05,5.4790909090909094e-05,5.5055610000000003e-05,5.5480499999999998e-05,5.5576579999999998e-05,5.5586230000000002e-05,5.5635820000000002e-05,5.5689000000000002e-05,5.5772000000000001e-05,5.7709569999999998e-05],"50":[8.4855000000000001e-07,8.5518000000000006e-07,8.5685e-07,8.6680000000000001e-07,8.7249000000000005e-07,8.7615999999999993e-07,8.7997999999999992e-07,8.8245000000000002e-07,8.8293000000000003e-07,8.8294999999999995e-07,8.8877999999999994e-07,9.0227000000000005e-07,9.0595999999999994e-07,9.0916999999999993e-07,9.1282999999999995e-07,9.2147999999999996e-07,9.4532999999999996e-07,9.6000000000000013e-07,9.6420000000000002e-07,1.08659e-06],"2359296":[0.119404392,0.11973664299999998,0.120165727,0.12016735100000001,0.120531614,0.120619344,0.121540071,0.1217146415,0.122163592,0.122581076,0.12290018799999999,0.123255743,0.123466481,0.12425229700000001,0.124517208,0.12489892900000001,0.12559749200000003,0.12598595600000001,0.12725999900000001,0.12915554949999999],"46":[8.0655000000000003e-07,8.1808000000000003e-07,8.2001000000000005e-07,8.2742999999999999e-07,8.2921e-07,8.3084999999999995e-07,8.3478000000000001e-07,8.4718999999999995e-07,8.4901000000000011e-07,8.5214000000000001e-07,8.5356999999999999e-07,8.5378999999999992e-07,8.5522e-07,8.5572000000000004e-07,8.5608000000000003e-07,8.5985999999999997e-07,8.7079999999999999e-07,8.7339000000000001e-07,8.8210999999999995e-07,9.4030999999999998e-07],"176":[2.7575299999999998e-06,2.77837e-06,2.7848999999999998e-06,2.7854799999999997e-06,2.7919000000000003e-06,2.8294500000000001e-06,2.82997e-06,2.8326399999999996e-06,2.8415599999999998e-06,2.8575200000000003e-06,2.85783e-06,2.8586099999999999e-06,2.85978e-06,2.87038e-06,2.8810199999999997e-06,2.89829e-06,2.9029099999999996e-06,2.9140900000000003e-06,2.9315500000000003e-06,3.0034599999999999e-06],"52":[9.0537000000000007e-07,9.0569000000000011e-07,9.1264e-07,9.1938999999999998e-07,9.2528000000000004e-07,9.2529999999999995e-07,9.2831999999999999e-07,9.3564999999999999e-07,9.4078000000000004e-07,9.4269999999999999e-07,9.497500000000001e-07,9.5203000000000004e-07,9.5429999999999991e-07,9.5696000000000007e-07,9.585800000000001e-07,9.6458000000000013e-07,9.6766000000000002e-07,9.6932999999999996e-07,9.7598999999999999e-07,1.00521e-06],"272":[4.2256599999999998e-06,4.2593900000000004e-06,4.2776299999999999e-06,4.298017241379311e-06,4.3032800000000002e-06,4.3193700000000001e-06,4.3242799999999997e-06,4.3342300000000003e-06,4.3383099999999995e-06,4.3424000000000001e-06,4.3429200000000001e-06,4.3436299999999998e-06,4.3562599999999999e-06,4.3832099999999997e-06,4.4260099999999995e-06,4.4294999999999997e-06,4.4597900000000002e-06,4.4606052631578948e-06,4.5032700000000002e-06,4.8015200000000002e-06],"116":[1.7782799999999999e-06,1.8104699999999999e-06,1.8540579710144928e-06,1.85592e-06,1.8608099999999999e-06,1.8685599999999999e-06,1.88148e-06,1.88653e-06,1.88745e-06,1.90744e-06,1.9099500000000002e-06,1.91459e-06,1.91967e-06,1.9232200000000002e-06,1.9303899999999999e-06,1.9312600000000002e-06,1.94078e-06,1.9623400000000001e-06,1.9681100000000001e-06,2.0363299999999999e-06],"47104":[0.00098758699999999984,0.00099947399999999976,0.0010013192222222225,0.001007743777777777,0.0010092130000000001,0.0010164255555555554,0.0010182630000000004,0.001020647,0.001024067,0.0010260168888888885,0.001026629,0.001029992,0.0010324942222222221,0.0010337535555555559,0.0010411818888888887,0.0010418069999999998,0.0010419282222222219,0.001044509888888889,0.0010461294444444439,0.00113568325],"6912":[0.00011401,0.000114765,0.00011497040000000001,0.00011523777777777779,0.000115287,0.00011562600000000001,0.00011660636842105263,0.00011680648780487805,0.00011680846268656713,0.00011703006172839503,0.00011725031168831168,0.00011745756410256418,0.000118396,0.000119397,0.00011952483783783785,0.00011982066666666664,0.00011995879487179486,0.00012052505263157895,0.000120884625,0.00012169774683544305],"1856":[2.9258571428571429e-05,2.9889608695652172e-05,3.0348290000000001e-05,3.0367799999999997e-05,3.051497e-05,3.0546000000000002e-05,3.0553166666666664e-05,3.0698999999999999e-05,3.079734e-05,3.0806840000000001e-05,3.089788e-05,3.0985799999999997e-05,3.1104420000000001e-05,3.1119140000000001e-05,3.1132749999999998e-05,3.1139670000000001e-05,3.124525e-05,3.1272819999999998e-05,3.1312249999999998e-05,3.1373230000000002e-05],"48":[8.3348000000000002e-07,8.4422999999999998e-07,8.5176e-07,8.5580000000000003e-07,8.6739999999999995e-07,8.7451000000000001e-07,8.7503999999999993e-07,8.781800000000001e-07,8.8053000000000006e-07,8.8548000000000012e-07,8.8764999999999998e-07,8.8950999999999998e-07,8.9047000000000001e-07,8.9109000000000007e-07,8.9194999999999999e-07,8.9594000000000001e-07,8.9988000000000003e-07,9.0912999999999999e-07,9.4697000000000002e-07,9.6939999999999999e-07],"2097152":[0.1030794565,0.103862658,0.10456469600000001,0.104909158,0.105318603,0.10576403349999999,0.107020084,0.107622908,0.1077786125,0.108495194,0.108523859,0.10855690899999999,0.10893552550000001,0.10918128199999999,0.10926338200000001,0.109524286,0.10964558400000002,0.109773224,0.11093613350000001,0.1115227235],"54":[9.1150999999999993e-07,9.2633999999999997e-07,9.3077000000000007e-07,9.3628999999999998e-07,9.3807000000000009e-07,9.4759999999999994e-07,9.4926999999999998e-07,9.5007999999999999e-07,9.5140000000000001e-07,9.5320408163265306e-07,9.6001999999999983e-07,9.6993e-07,9.7122999999999989e-07,9.8054000000000002e-07,9.900099999999999e-07,9.9413999999999998e-07,1.0174499999999999e-06,1.02115e-06,1.03756e-06,1.05891e-06],"2031616":[0.098986078000000019,0.099534036999999992,0.10043901399999999,0.1004996595,0.10064732699999999,0.100706722,0.101268363,0.101405229,0.101455191,0.101658234,0.101678672,0.102033255,0.10215661349999999,0.102924377,0.1031336065,0.103468913,0.10388853450000002,0.103993168,0.105867487,0.10674835049999998],"43008":[0.00088185600000000031,0.00088513700000000003,0.00088610900000000005,0.00089743600000000005,0.00089864619999999976,0.00089887699999999997,0.00090153060000000042,0.00090192129999999997,0.0009058524000000002,0.00090590699999999942,0.00090921399999999966,0.000909862,0.00091256370000000005,0.00092087069999999965,0.00092384569999999966,0.00092437319999999978,0.00092466970000000016,0.0009342920000000003,0.00095376790000000042,0.00101972],"60":[1.00212e-06,1.0069399999999999e-06,1.01875e-06,1.0328299999999999e-06,1.03377e-06,1.0365200000000001e-06,1.04919e-06,1.0520700000000001e-06,1.0529700000000001e-06,1.05525e-06,1.06289e-06,1.06355e-06,1.06448e-06,1.06573e-06,1.06837e-06,1.0745499999999999e-06,1.07881e-06,1.08681e-06,1.09275e-06,1.1133799999999999e-06],"30720":[0.00052979200000000028,0.000548724,0.00055196349999999999,0.00055473400000000009,0.00055594399999999973,0.00056242799999994841,0.00056332099999999998,0.00056531099999999998,0.00056779699999999977,0.00056805899999999999,0.000568473,0.0005711804375,0.00057121514285714292,0.0005763079411764706,0.00057635599999999977,0.00057913525000000002,0.00058020053333333334,0.00058146093749999984,0.00058887300000000017,0.00059198200000000001],"56":[9.5541000000000006e-07,9.6275000000000001e-07,9.7464e-07,9.7995000000000004e-07,9.8206000000000005e-07,9.8820999999999998e-07,9.8955000000000012e-07,9.9745000000000008e-07,9.9804999999999991e-07,9.9996999999999997e-07,1.00221e-06,1.0068499999999999e-06,1.01352e-06,1.0149799999999999e-06,1.01809e-06,1.0204099999999999e-06,1.0279900000000001e-06,1.0496000000000001e-06,1.05868e-06,1.14338e-06],"62":[1.0364999999999999e-06,1.04889e-06,1.0496699999999999e-06,1.06521e-06,1.06701e-06,1.0716e-06,1.0733500000000001e-06,1.0735599999999999e-06,1.07373e-06,1.0791500000000001e-06,1.0809000000000001e-06,1.0823800000000001e-06,1.0843199999999999e-06,1.0975400000000001e-06,1.1008600000000001e-06,1.1043e-06,1.1125299999999999e-06,1.12496e-06,1.17237e-06,1.2642600000000001e-06],"58":[9.7896000000000003e-07,9.8566999999999996e-07,9.8899000000000012e-07,9.9386999999999994e-07,9.9926999999999992e-07,1.0027200000000001e-06,1.0124800000000001e-06,1.01328e-06,1.01364e-06,1.01882e-06,1.0227899999999999e-06,1.0246999999999999e-06,1.02903e-06,1.0369899999999999e-06,1.04096e-06,1.0416699999999999e-06,1.0499599999999999e-06,1.0520799999999999e-06,1.0546400000000001e-06,1.1448800000000001e-06],"3014656":[0.17169941050000001,0.17262039800000001,0.17317610450000001,0.17333848900000001,0.173419402,0.17398061250000002,0.17432638650000001,0.17547195500000001,0.17551657400000001,0.17585540150000001,0.17620517099999999,0.177142628,0.177521179,0.17769115099999999,0.1779539695,0.1779556195,0.17960452499999999,0.179828302,0.18157594399999999,0.18301816500000001],"64":[1.0525400000000001e-06,1.05753e-06,1.0657199999999999e-06,1.0803400000000001e-06,1.0843999999999999e-06,1.0920699999999999e-06,1.09469e-06,1.10421e-06,1.10625e-06,1.11113e-06,1.1137499999999999e-06,1.11759e-06,1.1190100000000001e-06,1.11993e-06,1.1351899999999999e-06,1.1432899999999999e-06,1.1465200000000001e-06,1.16169e-06,1.16249e-06,1.1664117647058824e-06],"8388608":[0.50502522999999999,0.50992753749999997,0.51587586100000005,0.51589310399999999,0.51605383999999999,0.51612821050000002,0.5174352995,0.51856971900000004,0.51891942499999999,0.52127586299999995,0.52159345999999995,0.522814208,0.52378377399999998,0.5242420955,0.52634505350000005,0.52699226850000003,0.53023596100000003,0.53171684200000002,0.53571644350000003,0.54007487499999995],"29696":[0.00052096949999999988,0.000524107,0.00052704199999999959,0.00052865199999999979,0.00053862188235294112,0.00053896749999999996,0.00054213211764705862,0.0005447805000000002,0.00054848674999999998,0.00055556625000000004,0.0005561599374999998,0.0005586082,0.000559113588235294,0.00055949529411764693,0.00055950837499999981,0.00055996000000000019,0.00056377150000000019,0.00057917600000000015,0.00061586500000000027,0.0006263242],"216":[3.3342000000000002e-06,3.3489499999999999e-06,3.3593400000000004e-06,3.3696099999999997e-06,3.3735900000000003e-06,3.3877100000000005e-06,3.3898000000000001e-06,3.3957099999999998e-06,3.3989699999999996e-06,3.4046599999999999e-06,3.4087000000000001e-06,3.4088299999999999e-06,3.4179399999999998e-06,3.4355300000000004e-06,3.4552200000000001e-06,3.47958e-06,3.4804600000000001e-06,3.5035500000000001e-06,3.56826e-06,3.5753599999999998e-06],"106496":[0.0019766330000000002,0.0020220232500000007,0.0020406374999999998,0.0020496300000000002,0.00205201325,0.0020551515,0.0020615252499999997,0.0020644075,0.0020651527500000007,0.0020863589999999999,0.0021071772499999999,0.0021238570000000007,0.0021441084999999998,0.0025809496666666662,0.002591487,0.0026409229999999999,0.0026707803333333334,0.0027052776666666666,0.0027221659999999998,0.0027791093333333328],"72":[1.18713e-06,1.21832e-06,1.22455e-06,1.2255499999999999e-06,1.2305199999999998e-06,1.2376499999999999e-06,1.2416000000000001e-06,1.2483199999999999e-06,1.25177e-06,1.2550100000000001e-06,1.25536e-06,1.2558400000000002e-06,1.2581699999999999e-06,1.2677368421052633e-06,1.28988e-06,1.2901599999999999e-06,1.29093e-06,1.2961200000000001e-06,1.3051499999999999e-06,1.3250100000000001e-06],"442368":[0.010843680500000001,0.010988261499999999,0.011113879,0.011166075500000001,0.0112031085,0.01142,0.012623608499999999,0.012656240000000004,0.012736938499999999,0.012777876000000004,0.0130887765,0.013534084499999988,0.013621284499999997,0.014012711000000006,0.014373265499999999,0.015600156,0.015819205499999999,0.016518837999999997,0.016722505499999991,0.017056041500000001],"147456":[0.003054153999999999,0.003078154,0.0030892909999999997,0.0030921750000000008,0.0031165089999999999,0.0031186680000000011,0.003121717,0.0031299933333333329,0.0031331173333333331,0.0031867470000000002,0.0031935320000000002,0.0032151605000000005,0.0036535600000000001,0.0037746345,0.0038247285000000001,0.0038616699999999989,0.0038882795000000003,0.0038890229999999993,0.0039947245000000004,0.004001793],"4456448":[0.24702369800000001,0.24796792000000001,0.24970404149999997,0.250515932,0.25155684649999999,0.25169178149999999,0.25197173150000002,0.25313307899999998,0.25373389200000002,0.25382599500000003,0.25402931150000002,0.25413922049999998,0.2546540195,0.25525365100000003,0.255992477,0.2562901735,0.25677312899999999,0.25925051700000001,0.26104784199999997,0.2643417575],"63488":[0.0012029760000000001,0.001217891,0.001231333,0.0012354629999999996,0.0012396024285714288,0.0012448021428571429,0.0012482717142857139,0.0012488298571428573,0.0012525125714285715,0.0012576351428571432,0.0012669927142857141,0.0012676672857142861,0.0012696418333333331,0.0012743215714285713,0.001280002857142857,0.0012971472857142858,0.001488159,0.0015169130000000004,0.0015274100000000003,0.0016091628],"38912":[0.00073241600000000006,0.00076924516666666679,0.00077139933333333324,0.00077780872727272745,0.00077950600000000023,0.00078185963636363625,0.00078435149999999993,0.00078669500000000023,0.00078748649999999996,0.0007925377500000001,0.0007968700999999998,0.00079737241666666685,0.00079752420000000004,0.00079881200000000009,0.00080293299999999992,0.00080302866666666676,0.00080452799999999999,0.00080490800000000001,0.000818569,0.00082754845454545455],"68":[1.1241899999999999e-06,1.12881e-06,1.13096e-06,1.1477700000000001e-06,1.15396e-06,1.1542700000000001e-06,1.1574999999999999e-06,1.16169e-06,1.16821e-06,1.18436e-06,1.18482e-06,1.18834e-06,1.19125e-06,1.1985999999999998e-06,1.2011100000000001e-06,1.20472e-06,1.2052900000000001e-06,1.21789e-06,1.2341800000000001e-06,1.2627600000000002e-06],"188416":[0.0043173530000000003,0.0043249295000000014,0.0043408125000000018,0.0043750639999999997,0.0043885665000000032,0.0043914080000000003,0.0044064320000000001,0.0044196255000000023,0.0044224174999999985,0.0044371305000000015,0.0045124080000000016,0.0045480824999999999,0.0047591890000000022,0.0049469459999999998,0.0049924380000000001,0.0049990629999999998,0.0050696170000000002,0.0052069730000000002,0.0053251350000000017,0.0057092790000000003],"248":[3.8090700000000001e-06,3.8148299999999999e-06,3.8180799999999994e-06,3.8261700000000003e-06,3.8496999999999998e-06,3.87237e-06,3.8914599999999997e-06,3.8970600000000001e-06,3.9013199999999999e-06,3.9289099999999996e-06,3.9298799999999997e-06,3.93974e-06,3.95915e-06,4.0141399999999997e-06,4.02899e-06,4.1271899999999994e-06,4.1579999999999998e-06,4.1948500000000002e-06,4.2869499999999997e-06,4.5598799999999996e-06],"80":[1.3140400000000001e-06,1.3197799999999999e-06,1.3234900000000001e-06,1.3366699999999999e-06,1.3375900000000001e-06,1.3489000000000001e-06,1.3499399999999998e-06,1.35105e-06,1.3514000000000001e-06,1.3538400000000001e-06,1.3556399999999998e-06,1.36875e-06,1.37073e-06,1.37243e-06,1.3726499999999999e-06,1.38252e-06,1.38921e-06,1.39437e-06,1.3980399999999998e-06,1.4012500000000001e-06],"2560":[4.3958285714285715e-05,4.5093249999999994e-05,4.56548125e-05,4.5729714285714285e-05,4.5803999999999997e-05,4.5941454545454545e-05,4.6042999999999999e-05,4.6159380000000003e-05,4.6217999999999997e-05,4.639405e-05,4.6412181818181816e-05,4.671332e-05,4.6763070000000004e-05,4.6797448979591833e-05,4.7072249999999996e-05,4.7273539999999997e-05,4.7846609999999998e-05,4.7861379999999994e-05,4.8067250000000003e-05,5.274e-05],"34816":[0.00062568699999999999,0.00065407699999999998,0.00066364700000000028,0.00066629800000000017,0.000667754,0.00067355961538461545,0.00067597499999999999,0.00067815399999999982,0.0006798765,0.00068096715384615379,0.00068406399999999996,0.00068442349999999971,0.00068658476923076943,0.00068670764285714279,0.0006867765714285714,0.00069445530769230769,0.00069501492857142839,0.00070104769230769218,0.00072774100000000006,0.00081860000000000006],"3712":[6.1643999999999995e-05,6.1786827586206888e-05,6.1790000000000003e-05,6.248743999999999e-05,6.2754879999999996e-05,6.3229137254901957e-05,6.3717929999999997e-05,6.3750030000000454e-05,6.3796520000000006e-05,6.380379e-05,6.3952384615384612e-05,6.4012720000000006e-05,6.4072600000000007e-05,6.4328754716981129e-05,6.4627640000000007e-05,6.4988500000000003e-05,6.5605790000000007e-05,6.6902039999999993e-05,7.0036649999999996e-05,7.1862379999999997e-05],"3538944":[0.18259439300000002,0.18543871249999999,0.18577975399999999,0.18682441799999999,0.18690275699999997,0.18724331399999999,0.18756471499999999,0.18795685549999999,0.18802612599999999,0.188068603,0.18863348399999999,0.18896911899999999,0.18938113749999999,0.19023623350000002,0.19079027700000001,0.19088945700000001,0.192465835,0.19351320100000002,0.19423924300000001,0.19799547349999999],"76":[1.26982e-06,1.27252e-06,1.2752999999999999e-06,1.2776000000000001e-06,1.2789799999999998e-06,1.2812199999999998e-06,1.2869699999999999e-06,1.2871299999999999e-06,1.2873600000000001e-06,1.2912399999999999e-06,1.29653e-06,1.3157500000000001e-06,1.3171400000000001e-06,1.3189199999999999e-06,1.32118e-06,1.3323900000000001e-06,1.3468500000000001e-06,1.3514399999999999e-06,1.3954100000000001e-06,1.49261e-06],"4194304":[0.22456369400000001,0.22647629850000001,0.22832732350000001,0.22883951350000001,0.22925097850000001,0.23035169599999999,0.23040159800000001,0.23049530150000003,0.23168949049999998,0.232539143,0.23302212,0.23349724699999999,0.2336303025,0.23475610499999999,0.23496619499999999,0.23610612600000003,0.23786232800000001,0.238492705,0.24041692100000001,0.24349900400000002],"851968":[0.026604131999999992,0.027100486,0.029710462999999999,0.035206451999999999,0.035376375000000002,0.035490555999999999,0.035699307499999999,0.035731055000000012,0.035752481000000016,0.035829696999999987,0.035954783999999983,0.036462187,0.036473071000000003,0.0364750535,0.036547000500000003,0.036915872499999988,0.037755848999999994,0.038156232500000012,0.038363432000000003,0.039287771499999999],"4096":[6.7150000000000006e-05,6.7743999999999994e-05,6.8678999999999998e-05,7.0526999999999997e-05,7.1104000000000002e-05,7.1312290000000004e-05,7.233862e-05,7.2357705882352948e-05,7.2422089999999998e-05,7.2500916666666659e-05,7.3000480000000005e-05,7.3087079999999992e-05,7.3439169999999998e-05,7.3815139999999993e-05,7.3948147540983612e-05,7.4039e-05,7.4092799999999996e-05,7.4257980000000005e-05,7.5068469999999999e-05,7.6709241379310352e-05],"59392":[0.0011174038750000001,0.001118946875,0.0011233818750000005,0.001132424375,0.001135582,0.0011399909999999999,0.0011405215,0.0011411770000000004,0.00114423825,0.001148479,0.0011498839999999999,0.0011625144285714287,0.0011637046249999999,0.001168414428571429,0.001178206375,0.0014196340000000001,0.0014391586666666664,0.0014456929999999996,0.0014788124999999999,0.0014927920000000002],"84":[1.3803399999999998e-06,1.38842e-06,1.3929700000000001e-06,1.39335e-06,1.41988e-06,1.4274599999999998e-06,1.4291e-06,1.4334100000000002e-06,1.43744e-06,1.43747e-06,1.43803e-06,1.43984e-06,1.4500000000000001e-06,1.4566199999999999e-06,1.4571100000000001e-06,1.4591899999999999e-06,1.46083e-06,1.4867999999999999e-06,1.51156e-06,1.6004e-06],"3276800":[0.16802320399999998,0.16803851049999999,0.16821566900000001,0.16913873300000001,0.16992598850000001,0.17199146700000001,0.172019119,0.17213347000000001,0.17299983599999999,0.173517271,0.17450434100000001,0.174806986,0.17485015749999999,0.17521247200000001,0.17613586250000002,0.17677875300000001,0.1770788385,0.17843572899999999,0.17898768349999999,0.18077222949999999],"55296":[0.001020679111111111,0.0010217819999999999,0.001022153,0.0010231938888888893,0.001028258875,0.00103367,0.0010367451111111111,0.0010410792222222223,0.0010487058888888892,0.0010568744444444445,0.001065194,0.0010664685555555557,0.0010671909999999999,0.0010708397499999999,0.0011068479999999999,0.0012058380000000003,0.0013220040000000003,0.001331067,0.0013649411428571425,0.0014154027500000005],"688128":[0.020073067999999999,0.020605461499999995,0.020696369499999999,0.020826144500000005,0.02084881249999998,0.020854991,0.021059227999999982,0.021864754,0.022020685000000002,0.022448742000000008,0.022470451000000002,0.022769939999999995,0.022834705,0.023643662499999999,0.024228348,0.024736599500000005,0.025605319500000001,0.02572724500000001,0.027029802999999998,0.027578723000000006],"8192":[0.0001442565,0.00014529400000000002,0.00014549960000000001,0.00014554220000000001,0.00014608724999999996,0.00014741,0.000147486,0.00014838446551724139,0.00014879145762711863,0.00014912532758620684,0.00014924961403508768,0.00014955329508196718,0.00015079159999999999,0.000151352,0.00015219075384615389,0.0001525845,0.0001534366,0.0001539731666666667,0.0001540275283018868,0.00016081326666666666],"10240":[0.000188789,0.0001909375,0.000197505,0.00019762033333333334,0.00019876866666666666,0.00019956499999999999,0.00020173171111111105,0.00020208282608695651,0.00020222609523809515,0.00020283741304347817,0.00020360654166666674,0.00020495671739130427,0.00020496216666666668,0.00020524858695652174,0.00020708129787234036,0.00020721624444444453,0.00020736184444444442,0.00020742193478260864,0.00020858700000000001,0.0002103265],"15872":[0.00026982200000000002,0.00028360616666666663,0.00028432000000000002,0.0002853,0.00028583038235294124,0.00028693849999999999,0.00028755869230769223,0.0002876053333333334,0.0002884199999999999,0.00029130599999999991,0.00029159199999999991,0.00029187576666666665,0.0002936864193548387,0.00029455799999999999,0.00029496200000000001,0.00029524753571428576,0.00029679700000000001,0.00030181699999999991,0.00033559600000000007,0.00034060400000000005],"92":[1.4767799999999999e-06,1.48689e-06,1.51512e-06,1.52065e-06,1.5226500000000002e-06,1.5291699999999999e-06,1.53904e-06,1.5452799999999999e-06,1.55485e-06,1.55646e-06,1.5564699999999999e-06,1.5635399999999998e-06,1.56394e-06,1.5687599999999999e-06,1.57027e-06,1.5720099999999998e-06,1.57253e-06,1.5823099999999999e-06,1.59619e-06,1.64653e-06],"26624":[0.00044037299999999998,0.00045637999999999999,0.00045754200000000002,0.00045830699999999965,0.00045863855000000001,0.00046067304999999979,0.00046320600000000002,0.00046372500000000001,0.00046380235000000004,0.0004647096842105264,0.00046648494736842094,0.00046759199999999986,0.000470662,0.00047179900000000001,0.00047355042857142855,0.00047516427777777776,0.00047603424999999989,0.00047986645000000017,0.000485427875,0.00049145447058823526],"1792":[2.817e-05,2.832e-05,2.9201217391304347e-05,2.9222810000000002e-05,2.9237599999999999e-05,2.928401e-05,2.9349833333333331e-05,2.936e-05,2.9383e-05,2.9401299999999999e-05,2.9454179999999999e-05,2.9461272727272726e-05,2.9527740000000001e-05,2.9544179999999999e-05,2.9591819999999998e-05,2.9844149999999998e-05,3.011298e-05,3.0122009999999998e-05,3.024481e-05,3.0511809999999999e-05],"11776":[0.00023995079999999998,0.00024082120000000002,0.000241084,0.00024198872222222202,0.00024271234210526319,0.000242816,0.00024318149999999998,0.00024516000000000002,0.00024524520588235294,0.00024530697368421045,0.0002491553333333333,0.00025071343589743583,0.00025279799999999999,0.00025302700000000002,0.00025347792307692306,0.0002536137307692308,0.0002546782432432433,0.0002551669166666667,0.00025593894594594591,0.00027452463636363638],"2944":[5.4372000000000001e-05,5.5403399999999999e-05,5.5685020000000001e-05,5.5813999999999998e-05,5.586698666666666e-05,5.6618529999999995e-05,5.6796000000000003e-05,5.679896e-05,5.7476492537313428e-05,5.7937597014925369e-05,5.7954010000000002e-05,5.8264759999999995e-05,5.8363826086956521e-05,5.8442671428571427e-05,5.923e-05,5.9324360000000001e-05,5.9370750000000001e-05,5.9568029999999998e-05,6.0693170000000002e-05,6.2766052631578947e-05],"88":[1.4106599999999998e-06,1.44587e-06,1.44969e-06,1.4541599999999999e-06,1.4609399999999999e-06,1.46326e-06,1.4705900000000001e-06,1.4716999999999998e-06,1.4742600000000002e-06,1.4784600000000001e-06,1.48118e-06,1.49015e-06,1.50187e-06,1.5067300000000001e-06,1.5117300000000001e-06,1.5287300000000001e-06,1.5421700000000001e-06,1.5598399999999999e-06,1.5746000000000001e-06,1.6790300000000001e-06],"22528":[0.00043882899999999996,0.00044534000000000012,0.00045272999999999998,0.00045488800000000024,0.00046067899999999997,0.00046096199999999998,0.000462447,0.00046412899999999976,0.00047003699999999997,0.00047061300000000004,0.00047140822222222205,0.00047142933333333325,0.00047462270000000003,0.00047509930000000003,0.00047575900000000019,0.0004786062222222222,0.000481397,0.00048392195,0.00048780394736842089,0.00049350999999999996],"1245184":[0.048663428499999994,0.049153127999999997,0.051376230499999995,0.05518640549999998,0.055252556499999959,0.055304772500000002,0.055551423000000003,0.05599985900000002,0.056449122000000004,0.056816517999999996,0.056986100999999997,0.057056451500000029,0.057559717999999968,0.0579728485,0.058400516499999999,0.058447501499999999,0.058986783499999987,0.05911061400000002,0.059516703999999997,0.059818191999999971],"15728640":[1.266097195,1.2776284284999999,1.2791566985,1.2845511625000001,1.2846998009999999,1.2858743555000001,1.2866717160000001,1.2878574665,1.288578271,1.293790309,1.2963575620000001,1.30091829,1.3028116175,1.3030528324999999,1.3033651085,1.3109911835000001,1.3141569234999999,1.3177547535,1.331177147,1.4607846714999999],"96":[1.5538699999999999e-06,1.5583200000000001e-06,1.57016e-06,1.57164e-06,1.5829700000000002e-06,1.5880000000000001e-06,1.5890300000000001e-06,1.5924099999999998e-06,1.60808e-06,1.60891e-06,1.6116700000000002e-06,1.6138999999999999e-06,1.61461e-06,1.6184200000000002e-06,1.6197800000000002e-06,1.6242399999999999e-06,1.62949e-06,1.63355e-06,1.6589699999999999e-06,1.6601100000000001e-06],"1984":[3.174866666666667e-05,3.1928000000000003e-05,3.1936999999999996e-05,3.2778590000000004e-05,3.2850648936170214e-05,3.3202459999999997e-05,3.3294280000000003e-05,3.34685e-05,3.3469425287356324e-05,3.3514979999999999e-05,3.3670333333333335e-05,3.3694910000000002e-05,3.3753030000000002e-05,3.3789964285714284e-05,3.390721e-05,3.3909660000000002e-05,3.3945020000000003e-05,3.4266400000000001e-05,3.4336840000000002e-05,3.5328579999999998e-05],"139264":[0.0028676313333333334,0.0028801509999999983,0.0028863499999999998,0.0029017450000000011,0.0029148196666666671,0.0029171003333333333,0.0029476970000000013,0.0029581233333333327,0.0029997106666666668,0.0030316754999999999,0.0032570339999999998,0.0033038044999999993,0.0035453195000000014,0.0036154950000000011,0.003633926,0.0036444115000000012,0.0036473770000000003,0.0036629590000000004,0.0037050390000000002,0.0037839264999999997],"475136":[0.01171761,0.011722066,0.0120110975,0.012120071,0.012335303000000001,0.0123482735,0.012545718500000001,0.012788552,0.014077316000000001,0.014089333000000001,0.014136351,0.014316098000000005,0.014822461,0.015069506,0.016112173000000004,0.016654152500000002,0.017259843,0.017891629499999999,0.0179027925,0.021344494500000009],"13631488":[1.081384702,1.0926717454999999,1.098106783,1.1123037915,1.1134646264999999,1.1154682460000001,1.115930214,1.1160836620000001,1.1167832039999999,1.120380232,1.1215909655,1.1243767215,1.1244208735000001,1.1286479764999999,1.1390317835000001,1.141233672,1.1446407105,1.1455664320000001,1.177812243,1.289023241],"416":[6.2682500000000005e-06,6.3042700000000004e-06,6.3281800000000001e-06,6.4156666666666668e-06,6.4276899999999996e-06,6.4539090909090916e-06,6.4600400000000002e-06,6.4775700000000001e-06,6.4809199999999998e-06,6.5691851851851856e-06,6.5898400000000003e-06,6.6196199999999998e-06,6.668181818181818e-06,6.6731099999999995e-06,6.7031500000000004e-06,6.7043500000000004e-06,6.7905200000000002e-06,6.8069199999999997e-06,7.3347500000000004e-06,7.5105000000000003e-06],"928":[1.4629086956521739e-05,1.4738e-05,1.478224e-05,1.4958560000000176e-05,1.496692e-05,1.4986660000000001e-05,1.5024769999999998e-05,1.5072369999999999e-05,1.5194010000000001e-05,1.5211500000000002e-05,1.5227499999999999e-05,1.527671e-05,1.5282699999999999e-05,1.529144e-05,1.5293687500000001e-05,1.5451090000000001e-05,1.5657620000000002e-05,1.6114571428571428e-05,1.6460249999999999e-05,1.7220370967741935e-05],"512":[7.9889117647058823e-06,8.0354700000000008e-06,8.0620000000000001e-06,8.0660000000000004e-06,8.1117999999999991e-06,8.2019000000000002e-06,8.2142399999999995e-06,8.2288900000000011e-06,8.2692700000000002e-06,8.2720535714285718e-06,8.3115199999999997e-06,8.3203099999999996e-06,8.320349999999999e-06,8.3337999999999997e-06,8.3465399999999999e-06,8.4671200000000003e-06,8.5342399999999998e-06,8.767510000000001e-06,8.7889800000000003e-06,8.8227499999999995e-06],"18432":[0.00033103150000000014,0.00034514699999999997,0.00034550449999999996,0.00034716074999999999,0.00034733350000000002,0.00034848100000000004,0.000350527,0.0003528309999999999,0.00035460543999999984,0.00035535234615384617,0.00036169934615384614,0.00036401881481481477,0.00036477119230769229,0.00036497900000000008,0.00036509433333333326,0.00036589774074074073,0.00036624022222222217,0.00036785023076923073,0.00037285338461538466,0.000389649],"16777216":[1.3624867114999999,1.3627387930000001,1.3682747955000001,1.3718522200000001,1.37533295,1.3754258775000001,1.3756753159999999,1.3822018405000001,1.3826147684999999,1.3849564955,1.385854041,1.3863370184999999,1.3886838395000001,1.3892831000000001,1.3915754890000001,1.3972299355,1.4057568540000001,1.4058028899999999,1.410765482,1.5215182110000001],"9728":[0.00017653699999999999,0.00017790066666666666,0.000184227,0.00018424699999999999,0.00018456900000000001,0.00018483970454545457,0.000185148,0.000185615,0.00018650599999999999,0.00018729393333333331,0.00018797224999999993,0.00018838583333333331,0.00018950879999999991,0.00018992447916666664,0.00019160824999999999,0.00019401500000000002,0.00019530479591836717,0.00019845316666666665,0.0002100165,0.00021307645],"1769472":[0.083573320999999992,0.083904379000000043,0.084190562999999996,0.084781703,0.08495430450000005,0.08511454199999996,0.085383070500000005,0.085476179000000013,0.08549406050000001,0.085591588000000024,0.086282030499999995,0.0864141135,0.086425578000000003,0.086815458499999984,0.08686742850000001,0.087360984000000003,0.087828009999999956,0.08902289699999999,0.090545751999999993,0.092587920500000004],"1703936":[0.079498594999999977,0.079768565,0.080814525499999998,0.080886834499999963,0.080898228499999975,0.08145545100000004,0.081512078000000002,0.082029730499999981,0.08206570500000003,0.082341750999999963,0.082376295000000016,0.08246605650000001,0.082489971000000037,0.082787106999999999,0.082966974000000027,0.083382023499999958,0.083634338000000003,0.083942765000000003,0.084281381999999974,0.084385930999999997],"2048":[3.2645999999999999e-05,3.2773800000000001e-05,3.2873999999999997e-05,3.3470000000000003e-05,3.3477666666666666e-05,3.4290489999999999e-05,3.439114e-05,3.4557999999999997e-05,3.4715914634146343e-05,3.4795120000000003e-05,3.4810420000000003e-05,3.497748e-05,3.5144359999999999e-05,3.5186874999999998e-05,3.5270179999999998e-05,3.527573e-05,3.5732819999999999e-05,3.5986540540540541e-05,3.6089013513513509e-05,3.8199596491228066e-05],"14336":[0.00024642799999999998,0.00024656299999999999,0.000247328,0.00024769333333333327,0.0002478708571428571,0.00024840958333333335,0.00024857846428571426,0.00024934533333333337,0.00025035600000000008,0.00025081399999999992,0.0002533314324324325,0.00025359105555555555,0.00025365908333333334,0.00025370864705882346,0.00025402935999999999,0.00025536897368421047,0.00025539167567567567,0.00025777599999999993,0.00025924000000000005,0.00025949499999999994],"448":[6.7709599999999998e-06,6.9107619047619051e-06,6.9211800000000002e-06,6.9424099999999997e-06,6.9440199999999996e-06,6.9758400000000005e-06,6.99442e-06,6.9989800000000005e-06,7.0136099999999999e-06,7.05921e-06,7.0727699999999999e-06,7.1125699999999999e-06,7.16776e-06,7.1972599999999994e-06,7.2164500000000002e-06,7.3074299999999993e-06,7.3413299999999999e-06,7.5588200000000001e-06,7.6111799999999995e-06,7.7580700000000008e-06],"5505024":[0.33067356449999996,0.33511267750000001,0.336590426,0.3377637885,0.33836942250000002,0.338527778,0.33915342500000001,0.33944961800000001,0.3397792355,0.3399887875,0.34035895500000002,0.34144625049999999,0.34362851249999998,0.34363131000000002,0.34420653499999998,0.34463737750000001,0.34498371150000001,0.34597610400000001,0.34597929900000002,0.34680580150000001],"544":[8.4305500000000001e-06,8.4774949494949484e-06,8.6248099999999998e-06,8.6392199999999999e-06,8.6500000000000002e-06,8.6523199999999999e-06,8.6964000000000003e-06,8.7156300000000004e-06,8.7505600000000011e-06,8.7621800000000009e-06,8.7844300000000005e-06,8.8024999999999992e-06,8.8170599999999996e-06,8.8883600000000001e-06,8.9008499999999997e-06,9.0021600000000006e-06,9.0526599999999995e-06,9.2759200000000001e-06,9.3849500000000007e-06,9.4571999999999998e-06],"221184":[0.0044550660000000014,0.0045160779999999998,0.0045216020000000013,0.0045418709999999977,0.0045865470000000016,0.004609831,0.0046188240000000023,0.0046311,0.0046576319999999992,0.0046789210000000008,0.0046999030000000009,0.0047058379999999986,0.0047249960000000004,0.0047313299999999997,0.004734355,0.0047616289999999999,0.0048078240000000013,0.0048154550000000015,0.0049350870000000003,0.005130066],"90112":[0.0019369279999999997,0.0019516899999999994,0.0019662461999999993,0.0019781825000000004,0.0019801157500000002,0.001985835,0.0019964977500000008,0.0020067525000000007,0.00201128625,0.0020210614999999995,0.0020227000000000001,0.0020276904999999993,0.0020285114999999995,0.0020358435,0.0020369660000000003,0.0020383699999999999,0.0022108510000000007,0.0022587304999999998,0.0022762045000000002,0.0023864865000000008],"640":[1.0033833333333334e-05,1.0079454545454545e-05,1.0228428571428572e-05,1.0265070000000001e-05,1.0291600000000002e-05,1.029547e-05,1.0306309999999999e-05,1.0349142857142857e-05,1.0387580000000001e-05,1.0430080000000001e-05,1.0575280000000001e-05,1.0613440000000197e-05,1.071243e-05,1.0729150537634408e-05,1.075152e-05,1.0871499999999999e-05,1.093322e-05,1.0975950000000001e-05,1.0989849999999999e-05,1.1199120000000001e-05],"12800":[0.00020328333333333336,0.00020919566666666661,0.000211196,0.00021165424999999993,0.00021244000000000002,0.00021362034090909092,0.0002148721136363637,0.00021522909090909088,0.00021546717500000001,0.00021635760465116283,0.00021665966666666671,0.000217143025,0.00021741915384615386,0.00021808657894736833,0.00022244909523809519,0.0002227081621621621,0.00022279370731707323,0.00022358300000000002,0.000223971,0.00022701955263157897],"262144":[0.0055316799999999998,0.0055823829999999998,0.0056403350000000015,0.0056788130000000004,0.0056821530000000006,0.0056857420000000023,0.0056861300000000002,0.0057333109999999996,0.0057538859999999989,0.0057552929999999999,0.0057715939999999997,0.0057932090000000006,0.0058150800000000002,0.0058245569999999993,0.005825162,0.005828583,0.0058750729999999998,0.0058871409999999994,0.0059595199999999977,0.0063988989999999996],"589824":[0.016085239499999994,0.016223928499999991,0.016382783000000001,0.016451713499999999,0.016456657,0.016465160999999999,0.0165167235,0.016699144000000006,0.0174929505,0.018087431000000008,0.018464231500000001,0.018533622499999999,0.0187555875,0.01878905199999999,0.018790705499999998,0.021605316499999999,0.022590830499999992,0.022778963499999999,0.026086855000000009,0.027471387999999992],"884736":[0.028358477,0.028905231,0.029360030999999998,0.03677971649999999,0.037002112500000003,0.037026245499999985,0.037140474999999992,0.037580454500000013,0.0377195715,0.038126511500000002,0.038453024500000002,0.038716244500000004,0.0387501445,0.038943454500000016,0.039048154999999987,0.039132532999999997,0.039206693500000001,0.039260335,0.039270951000000012,0.03947307600000001],"6144":[0.00012089100000000001,0.00012326500000000001,0.00012502799999999998,0.00012543,0.00012596149999999999,0.00012635645000000001,0.00012697349333333336,0.00012704449999999999,0.00012707280263157895,0.00013033235999999993,0.000130476,0.000130505,0.00013231966666666669,0.00013288945205479458,0.00013330810769230771,0.00013342866666666669,0.00013392083098591549,0.00013452939999999996,0.00014396300000000004,0.00014599632812500001],"1088":[1.7518000000000001e-05,1.7748581395348836e-05,1.7791531914893617e-05,1.7863690000000002e-05,1.787325e-05,1.8042699999999999e-05,1.8061370000000001e-05,1.8184319999999999e-05,1.8241740000000001e-05,1.8248579999999999e-05,1.825858e-05,1.8271009999999999e-05,1.8306880000000001e-05,1.8357799999999999e-05,1.8384299999999999e-05,1.8497380000000002e-05,1.856961e-05,1.8671280000000001e-05,1.9060266666666668e-05,2.0347310000000002e-05],"576":[8.8942599999999994e-06,9.1154615384615375e-06,9.1212100000000007e-06,9.2878421052631587e-06,9.3112800000000004e-06,9.3355400000000001e-06,9.3361000000000003e-06,9.3430000000000002e-06,9.3616399999999997e-06,9.3699600000000007e-06,9.3924099999999991e-06,9.4768399999999999e-06,9.5028300000000003e-06,9.5089999999999999e-06,9.6181599999999994e-06,9.6587900000000007e-06,9.6763099999999999e-06,9.6909900000000002e-06,9.928389999999999e-06,1.0067929999999999e-05],"160":[2.4914400000000002e-06,2.4980800000000001e-06,2.5328699999999999e-06,2.5413699999999999e-06,2.54444e-06,2.5634300000000003e-06,2.5637300000000001e-06,2.5642999999999997e-06,2.5668799999999998e-06,2.59004e-06,2.5937499999999999e-06,2.6014899999999997e-06,2.6067333333333329e-06,2.6379399999999996e-06,2.6436599999999999e-06,2.64604e-06,2.6622199999999998e-06,2.6669699999999996e-06,2.6853499999999996e-06,2.7592900000000001e-06],"672":[1.0757589999999999e-05,1.103579e-05,1.1048180000000001e-05,1.1121849999999999e-05,1.1140029999999999e-05,1.1155150000000001e-05,1.1163709999999999e-05,1.1168050000000001e-05,1.1177299999999999e-05,1.1261820000000001e-05,1.1275689999999999e-05,1.130051e-05,1.1309894736842104e-05,1.1334780000000001e-05,1.142404e-05,1.1488309999999999e-05,1.149143e-05,1.1523139999999999e-05,1.152811e-05,1.1676160000000001e-05],"8912896":[0.54387683099999995,0.54901858550000004,0.55118322149999999,0.55482251400000004,0.55537052349999994,0.55721030500000002,0.55948528949999998,0.56075686599999996,0.56080997600000004,0.56089431550000002,0.56123393099999996,0.56147735649999997,0.56236373299999998,0.562452218,0.56639573700000001,0.56693744749999997,0.56901753099999997,0.57208755300000003,0.57386699600000002,0.58640354699999997],"100":[1.5720500000000001e-06,1.5833000000000002e-06,1.59247e-06,1.60433e-06,1.6060799999999998e-06,1.6128400000000001e-06,1.6228000000000002e-06,1.6303100000000002e-06,1.6328333333333333e-06,1.6360999999999999e-06,1.6374599999999999e-06,1.6453500000000001e-06,1.6594500000000001e-06,1.6613199999999998e-06,1.66376e-06,1.6689600000000002e-06,1.67302e-06,1.6733000000000001e-06,1.7003700000000001e-06,1.7347700000000001e-06],"507904":[0.012496773000000001,0.013122400499999992,0.0133708435,0.013419,0.013729132999999999,0.014019688000000006,0.014043904499999978,0.0150265005,0.0151117665,0.015225733,0.015262360000000003,0.015295541500000006,0.0153777125,0.015407759,0.015549034,0.018554464499999999,0.019297233500000011,0.019504676000000002,0.019506394,0.0208862205],"3840":[6.2069999999999994e-05,6.3993978723404251e-05,6.4372e-05,6.4596104166666669e-05,6.5028434782608694e-05,6.516040909090909e-05,6.5227000000000004e-05,6.5728069999999996e-05,6.6230297872340435e-05,6.6330641025641026e-05,6.6429777777777781e-05,6.6460897959183665e-05,6.6644870000000001e-05,6.7137530000000001e-05,6.7528934782608695e-05,6.7595065217391308e-05,6.7870670000000005e-05,6.820711e-05,6.8925779999999995e-05,7.3096449999999997e-05],"192":[2.9826999999999998e-06,2.9899199999999997e-06,3.01138e-06,3.0148700000000002e-06,3.0231899999999998e-06,3.03375e-06,3.0398600000000001e-06,3.0401799999999996e-06,3.0783333333333332e-06,3.07869e-06,3.0939599999999997e-06,3.1259899999999999e-06,3.1489729729729728e-06,3.1535500000000001e-06,3.2424999999999999e-06,3.2512900000000003e-06,3.2676899999999998e-06,3.3626000000000002e-06,3.4336099999999999e-06,3.6244999999999998e-06],"376832":[0.0091103419999999935,0.0091413379999999954,0.0091898819999999999,0.009217251999999997,0.0092423180000000028,0.0092498279999999964,0.0092679430000000007,0.0092875940000000014,0.0093061770000000005,0.0093230589999999981,0.0093269540000000036,0.0093551350000000005,0.0093692180000000003,0.0094131625000000024,0.0094491634999999997,0.0094650980000000016,0.0095935489999999964,0.009625434499999995,0.0096465940000000014,0.0097611715000000005],"98304":[0.0022392500000000008,0.0022474165000000009,0.0022508642499999999,0.0022589835000000002,0.0022610687500000002,0.0022765592499999995,0.0022766457499999999,0.00228065075,0.0022837226666666669,0.0022909163333333332,0.0022993510000000007,0.0023042130000000011,0.0023049724999999999,0.0023464720000000001,0.0023633040000000001,0.002499107,0.0025539169999999993,0.0026321166666666662,0.0026357176666666668,0.0027724376666666672],"5376":[9.7684999999999997e-05,9.8416000000000001e-05,9.8890999999999999e-05,0.00010103233333333334,0.00010289900000000001,0.00010342188888888891,0.00010373901098901104,0.000103807,0.000104493,0.00010466054945054942,0.000105037,0.000105662025974026,0.00010621009782608697,0.000106877,0.00010733549411764707,0.00010739692682926829,0.000107728,0.00010905378749999994,0.00011197913095238092,0.00011551179999999997],"94208":[0.0021046694999999989,0.00211308125,0.00211363,0.0021322564999999992,0.0021332794999999998,0.0021378400000000002,0.0021410032500000001,0.0021452527500000007,0.0021476069999999989,0.0021771875000000012,0.0021790214999999986,0.002183843,0.0022143779999999999,0.0023452069999999998,0.0023958647499999998,0.0024823666666666661,0.002482569,0.0024888412499999993,0.0025280853333333334,0.002640267],"81920":[0.0017126040000000006,0.001716732800000001,0.0017461444,0.0017474168000000008,0.0017494822,0.0017502559999999991,0.0017534970000000001,0.0017552585999999989,0.0017686128,0.0017753412,0.0017793225999999988,0.001810374,0.0018357613999999995,0.0019778885000000007,0.0020276732500000001,0.0020326612500000001,0.0020673892499999992,0.0020879445000000002,0.00210865675,0.0021233885000000001],"3407872":[0.17835277799999999,0.17910300600000001,0.17920293949999999,0.18081024299999998,0.18101050499999999,0.18160174800000001,0.182158349,0.18217896449999998,0.18229952250000001,0.182469624,0.18272840499999998,0.18278836849999999,0.18286933,0.18314163850000001,0.183318019,0.1833233765,0.18435855750000002,0.18480258199999999,0.18495523899999999,0.18554009799999999],"104":[1.6312499999999998e-06,1.6384599999999998e-06,1.67377e-06,1.6772200000000001e-06,1.68938e-06,1.69324e-06,1.6938899999999999e-06,1.69426e-06,1.7025199999999999e-06,1.7034999999999999e-06,1.7035999999999999e-06,1.7147000000000001e-06,1.7167100000000001e-06,1.7174799999999999e-06,1.7192800000000001e-06,1.74085e-06,1.7536099999999999e-06,1.75663e-06,1.7658699999999999e-06,1.8268799999999999e-06],"122880":[0.0023895320000000002,0.0024308340000000002,0.0024530870000000009,0.0024617126666666672,0.0024744216666666668,0.0025059126666666662,0.0025081956666666671,0.0025171170000000001,0.0026343736666666674,0.0027383709999999999,0.002958656,0.0029891475000000012,0.003004149999999998,0.0030411013333333336,0.0030464140000000008,0.0031558923333333336,0.0031743320000000006,0.0031877905,0.0032368129999999994,0.0032976359999999996],"200":[3.0684999999999999e-06,3.1118800000000001e-06,3.1125499999999995e-06,3.1161200000000002e-06,3.1257500000000001e-06,3.1261499999999997e-06,3.1296299999999996e-06,3.13213e-06,3.1439999999999999e-06,3.1523599999999998e-06,3.1576444444444445e-06,3.1690199999999998e-06,3.2385200000000001e-06,3.2530099999999999e-06,3.26581e-06,3.2660000000000002e-06,3.2979199999999999e-06,3.3642999999999997e-06,3.4568300000000001e-06,3.6674400000000001e-06],"163840":[0.0035594069999999979,0.0035616145,0.0035638759999999992,0.0036130344999999995,0.0036416984999999998,0.0036509235000000001,0.003677362,0.003683857,0.0037052624999999997,0.0037118329999999999,0.0037457329999999998,0.003761553999999999,0.0037849855,0.003797450999999999,0.0041689450000000003,0.0042204354999999987,0.0042710895000000002,0.0043726224999999985,0.004475138,0.0045223520000000003],"4063232":[0.21665912099999995,0.21793395900000001,0.21834219599999999,0.220191518,0.22020156199999999,0.22041907500000002,0.220545671,0.22079215050000001,0.22142868800000001,0.22284767999999999,0.22300966499999997,0.223062861,0.22349993849999999,0.22366352699999997,0.22443664749999997,0.22536930450000001,0.22543212400000001,0.22639753099999999,0.22691918699999999,0.23451438999999999],"5767168":[0.35202910300000001,0.355653842,0.35913804900000001,0.35914708649999999,0.359350014,0.36024549700000003,0.36086152449999997,0.36171232949999998,0.36226747549999999,0.36283934400000001,0.36513295950000002,0.36579221849999999,0.36610134500000002,0.36681074199999997,0.36692501449999998,0.36771311149999997,0.368815328,0.37095665950000001,0.37184849649999996,0.37256932149999999],"12582912":[0.87966698850000002,0.88802034500000004,0.89226037999999996,0.89677975450000003,0.89807564849999999,0.90083793899999998,0.90214920899999995,0.90651712500000003,0.90763042199999999,0.90795798900000002,0.90817378049999997,0.90900995650000005,0.90911784350000002,0.90964527549999996,0.9100178055,0.91492330499999996,0.91619062549999997,0.91686668199999999,0.92682366049999998,0.94910513350000003],"1600":[2.4671000000000001e-05,2.4811999999999999e-05,2.5007e-05,2.5541000000000002e-05,2.5733179999999998e-05,2.5849666666666667e-05,2.585819696969697e-05,2.5870449999999999e-05,2.588374e-05,2.6064999999999999e-05,2.6074770000000001e-05,2.6157757575757576e-05,2.6161239999999999e-05,2.6216249999999998e-05,2.6263520000000002e-05,2.6324980000000002e-05,2.6342610000000002e-05,2.6824859999999998e-05,2.7001640000000002e-05,2.7052699999999999e-05],"136":[2.1377700000000001e-06,2.1402799999999999e-06,2.1458100000000001e-06,2.1524200000000001e-06,2.1570100000000001e-06,2.1570227272727271e-06,2.1707900000000002e-06,2.1727200000000001e-06,2.1799499999999998e-06,2.1870599999999999e-06,2.1980400000000002e-06,2.2037799999999998e-06,2.2044799999999997e-06,2.2095499999999999e-06,2.2217900000000002e-06,2.2261900000000001e-06,2.2429300000000001e-06,2.2490599999999999e-06,2.2935300000000001e-06,4.1708500000000001e-06],"232":[3.57506e-06,3.6160300000000002e-06,3.6197900000000002e-06,3.63115e-06,3.6329999999999998e-06,3.6357499999999999e-06,3.6626699999999997e-06,3.6672499999999999e-06,3.6709600000000003e-06,3.6729500000000001e-06,3.67563e-06,3.68393e-06,3.7052800000000002e-06,3.7254600000000003e-06,3.7404600000000002e-06,3.74814e-06,3.7554199999999998e-06,3.80994e-06,3.8275499999999995e-06,4.0072857142857137e-06],"7077888":[0.40502945849999999,0.41651549999999998,0.41829603199999998,0.41937487849999999,0.4211352095,0.42158340550000001,0.421811357,0.42218342800000003,0.42272523400000001,0.4232205845,0.42539215549999998,0.42783193800000002,0.42784840099999999,0.42885719150000001,0.42946381,0.43180849850000003,0.43327051150000001,0.433969991,0.43824087099999998,0.52061440299999995],"86016":[0.001834949,0.0018513174,0.0018608640000000007,0.0018613697999999991,0.0018648777999999999,0.001872393,0.0018798078000000014,0.001889408,0.0018919082000000008,0.0018982949999999999,0.0019007067999999995,0.0019213961999999998,0.0019244366000000005,0.0019500902500000001,0.0019773572500000002,0.0020284447500000008,0.0021247430000000001,0.0022108452499999998,0.0022763189999999993,0.0025676409999999994],"31744":[0.00055424600000000021,0.00057338100000000019,0.00057710400000000038,0.00058439573333333343,0.00058774825,0.00058830299999999998,0.00059602099999999975,0.00059707,0.00059815233333333328,0.00059859981250000045,0.00060143049999999997,0.00060466774999999996,0.00060547546666666664,0.00060568599999999992,0.00060575862500000018,0.00060836899999999988,0.00060940700000000029,0.00062342750000000003,0.00062967908333333347,0.00063306006666666672],"168":[2.62014e-06,2.62456e-06,2.66169e-06,2.6682499999999998e-06,2.6951499999999999e-06,2.6952800000000001e-06,2.6992400000000002e-06,2.70554e-06,2.70956e-06,2.71324e-06,2.7165499999999999e-06,2.7271300000000001e-06,2.7393199999999999e-06,2.74738e-06,2.7715200000000002e-06,2.7814400000000004e-06,2.7883399999999999e-06,2.8225499999999998e-06,3.0124600000000001e-06,3.1935600000000004e-06],"622592":[0.017162974500000001,0.017449740999999991,0.017608431500000001,0.0177287985,0.017875404499999994,0.017966622000000008,0.018013600000000001,0.018046621999999998,0.018456059,0.019721871500000009,0.019745218500000002,0.019859208499999999,0.020030894,0.020134707499999998,0.021590718000000002,0.022561913499999999,0.023115897,0.023394230499999995,0.0235645295,0.02388993],"108":[1.6671700000000001e-06,1.7042700000000002e-06,1.7085e-06,1.71824e-06,1.7206099999999999e-06,1.7289000000000001e-06,1.74052e-06,1.7488099999999999e-06,1.75343e-06,1.7566799999999999e-06,1.7567700000000001e-06,1.76894e-06,1.76928e-06,1.7809600000000001e-06,1.7846499999999999e-06,1.7857399999999999e-06,1.7871454545454546e-06,1.79399e-06,1.8015100000000001e-06,1.8018099999999999e-06],"327680":[0.0075099250000000006,0.007557065,0.0076245469999999997,0.0076406170000000006,0.0076520059999999977,0.007671883,0.0076769730000000019,0.007677672,0.00772224,0.0077387689999999995,0.0078011999999999995,0.0078250730000000001,0.0078425440000000034,0.0078683819999999984,0.0079503530000000003,0.007966809,0.0079676540000000011,0.0080950480000000005,0.0081132779999999981,0.0088406530000000004],"2176":[3.5547999999999999e-05,3.5692000000000003e-05,3.6941090000000004e-05,3.7110339999999999e-05,3.7169389999999996e-05,3.7183066666666666e-05,3.7191770000000003e-05,3.7247699999999999e-05,3.7338169999999999e-05,3.7340630000000002e-05,3.7425999999999997e-05,3.744628e-05,3.7524999999999997e-05,3.7557500000000001e-05,3.8029383333333335e-05,3.811485e-05,3.8308018181818186e-05,3.8385969999999999e-05,3.8489179999999996e-05,3.853254e-05],"3328":[5.2096000000000004e-05,5.4629333333333336e-05,5.4769926829268291e-05,5.4937120000000001e-05,5.5020333333333339e-05,5.5167790000000003e-05,5.5186999999999999e-05,5.5420465753424653e-05,5.5574919999999997e-05,5.6018889999999999e-05,5.6130729999999996e-05,5.6426276315789475e-05,5.6427552631578954e-05,5.6786000000000001e-05,5.6965684931506851e-05,5.701619178082192e-05,5.7259999999999997e-05,5.7295736111111118e-05,5.7377590000000004e-05,5.8824941176470585e-05],"1":[1.7991999999999999e-07,1.8066e-07,1.8084000000000002e-07,1.8087e-07,1.8101e-07,1.8105e-07,1.8127000000000001e-07,1.8150999999999999e-07,1.8187e-07,1.8199e-07,1.8204000000000001e-07,1.8252e-07,1.8425e-07,1.8432e-07,1.8884000000000002e-07,1.8902999999999999e-07,1.8915000000000002e-07,1.9042000000000001e-07,1.9128999999999999e-07,1.9850000000000001e-07],"2":[1.9319e-07,1.9338999999999999e-07,1.9351000000000002e-07,1.9366e-07,1.9369000000000001e-07,1.9375999999999998e-07,1.9406000000000001e-07,1.941e-07,1.9420000000000001e-07,1.9457999999999999e-07,1.9476999999999999e-07,1.9479000000000001e-07,1.9527e-07,1.9536e-07,1.9641e-07,1.9911999999999997e-07,2.0239999999999999e-07,2.0270000000000001e-07,2.0435999999999998e-07,2.0443000000000001e-07],"3":[2.0678e-07,2.0751999999999999e-07,2.0760000000000001e-07,2.0774000000000001e-07,2.0799e-07,2.0811999999999999e-07,2.0818999999999999e-07,2.0820999999999998e-07,2.0832999999999999e-07,2.0851000000000001e-07,2.0860999999999999e-07,2.0863000000000001e-07,2.0873000000000002e-07,2.0919999999999999e-07,2.0925e-07,2.0927000000000002e-07,2.1004000000000002e-07,2.1100000000000002e-07,2.1663e-07,2.1742999999999998e-07],"4":[2.1969e-07,2.2081999999999999e-07,2.2095e-07,2.2112000000000001e-07,2.2158999999999999e-07,2.2169e-07,2.2212000000000001e-07,2.2235999999999999e-07,2.2255999999999998e-07,2.2262000000000002e-07,2.2303999999999999e-07,2.2350999999999999e-07,2.2396999999999999e-07,2.2490000000000001e-07,2.2678e-07,2.2678e-07,2.2772e-07,2.3089e-07,2.3264e-07,2.4410999999999998e-07],"7424":[0.00012376299999999999,0.00012537616666666667,0.00012597366197183096,0.00012659823943661971,0.00012719878947368429,0.00012726150724637681,0.00012748561538461538,0.00012820705479452054,0.000128257,0.00012838559154929575,0.00012870546666666666,0.00012908283333333331,0.00012928789552238803,0.00012943997297297296,0.00012952174324324322,0.00012979848387096771,0.00012990849295774643,0.00013148316666666666,0.00013617321538461535,0.00014397660000000002],"5":[2.3456e-07,2.3493e-07,2.3544999999999998e-07,2.3552999999999999e-07,2.3596e-07,2.3598e-07,2.3663999999999998e-07,2.3671000000000001e-07,2.3703e-07,2.3722999999999999e-07,2.3798000000000002e-07,2.3838000000000002e-07,2.3864000000000002e-07,2.3888999999999999e-07,2.4437999999999997e-07,2.4560999999999999e-07,2.4703999999999997e-07,2.5123999999999997e-07,2.5428000000000002e-07,2.6109000000000002e-07],"23552":[0.00047061599999999993,0.00048035800000000001,0.00048330599999999986,0.00048379499999999986,0.00048903599999999988,0.00049147100000000005,0.000494718,0.00049893384210526292,0.00049904099999999987,0.00049932831578947384,0.00049996838888888881,0.00050082994736842096,0.00050090638888888894,0.00050192926315789481,0.00050298183333333333,0.00050374515789473678,0.00050501147368421065,0.00051000700000000004,0.00051167600000000019,0.00051333011764705865],"6":[2.4732999999999998e-07,2.48e-07,2.4814e-07,2.4839999999999997e-07,2.4903e-07,2.4922999999999996e-07,2.4979000000000002e-07,2.5021999999999997e-07,2.5048e-07,2.5171000000000002e-07,2.5264999999999998e-07,2.5287000000000001e-07,2.5324000000000001e-07,2.5972e-07,2.6081000000000002e-07,2.6137999999999998e-07,2.614e-07,2.6227000000000003e-07,2.6356999999999997e-07,2.6364e-07],"61440":[0.0011378150000000001,0.001149127,0.001164083,0.001170188,0.0011733943749999999,0.0011839996249999999,0.001189364857142857,0.001194899625,0.0011993835,0.0012033689999999999,0.0012041410000000004,0.001207107,0.00121781525,0.0012197660000000002,0.0012307285714285713,0.0012406754285714289,0.0014277254999999999,0.001476001,0.0014832801666666664,0.0015001609999999999],"491520":[0.01240720649999999,0.012569221,0.012774319000000001,0.012829582000000001,0.012843677500000001,0.013044005500000001,0.013088512,0.01383291,0.014452692499999994,0.014455148500000001,0.014742077000000001,0.014900308000000001,0.0149263865,0.015407466,0.016618881000000005,0.017150766499999991,0.017689902,0.018584970000000006,0.018849355499999991,0.019030368999999998],"77824":[0.00161802,0.0016323157999999995,0.0016347238000000007,0.0016433725999999999,0.0016484890000000008,0.0016549828333333328,0.0016604473333333334,0.0016660802,0.0016952947999999992,0.0016956125999999991,0.0017131362000000004,0.0017506244,0.0018020416000000001,0.0018162079999999997,0.0018278770000000008,0.0018487379999999995,0.0018966969999999999,0.0019333660000000002,0.0019760592499999999,0.0019777549999999999],"7":[3.0386999999999998e-07,3.0412999999999996e-07,3.0475999999999998e-07,3.0945454545454544e-07,3.1017999999999999e-07,3.1730000000000002e-07,3.1735000000000002e-07,3.1745999999999999e-07,3.1845e-07,3.2039000000000003e-07,3.2048000000000002e-07,3.2096999999999999e-07,3.2110999999999999e-07,3.2128999999999999e-07,3.2132000000000002e-07,3.2156999999999999e-07,3.2284e-07,3.2564e-07,3.3522999999999997e-07,3.3557999999999999e-07],"8":[3.1951999999999999e-07,3.1954000000000001e-07,3.1969999999999998e-07,3.2156000000000003e-07,3.2776000000000002e-07,3.2822000000000001e-07,3.3132000000000003e-07,3.3188000000000003e-07,3.3235000000000003e-07,3.3258999999999999e-07,3.3271000000000002e-07,3.3343000000000004e-07,3.3499000000000001e-07,3.3525000000000004e-07,3.3536000000000001e-07,3.3840000000000001e-07,3.3883000000000002e-07,3.4060999999999998e-07,3.4662000000000002e-07,3.4945e-07],"208":[3.20789e-06,3.2166799999999999e-06,3.2186900000000003e-06,3.2495757575757578e-06,3.2579899999999997e-06,3.2800499999999996e-06,3.28109e-06,3.2962399999999997e-06,3.2987299999999998e-06,3.3399200000000001e-06,3.3702999999999997e-06,3.3757500000000002e-06,3.4219100000000001e-06,3.4356700000000004e-06,3.4915625000000001e-06,3.5219999999999999e-06,3.5477000000000004e-06,3.5589999999999997e-06,3.6012700000000002e-06,3.8126900000000001e-06],"9":[3.3053999999999999e-07,3.3068000000000005e-07,3.3179000000000003e-07,3.3391e-07,3.3542999999999998e-07,3.3554e-07,3.4131999999999999e-07,3.4157000000000001e-07,3.4231e-07,3.4299999999999999e-07,3.4493999999999996e-07,3.4873999999999998e-07,3.4934999999999999e-07,3.5147000000000001e-07,3.5242999999999999e-07,3.5796000000000001e-07,3.5923999999999998e-07,3.5961999999999999e-07,3.5975000000000003e-07,3.6184999999999997e-07],"73728":[0.0014912916666666668,0.0015129793333333336,0.0015299125,0.0015316640000000001,0.0015349439999999997,0.0015389524999999999,0.0015390133333333337,0.0015459948333333335,0.001546263,0.0015658494000000006,0.0015674914000000004,0.0016020488333333333,0.0016181514999999997,0.0016364209999999997,0.0017603720000000007,0.001775233,0.0017752834999999992,0.001822302,0.0018536537999999999,0.0018743219999999999],"304":[4.6720499999999996e-06,4.7211200000000001e-06,4.7512200000000001e-06,4.7790299999999999e-06,4.7960899999999998e-06,4.8107599999999995e-06,4.8118399999999997e-06,4.81285e-06,4.8148e-06,4.8190199999999996e-06,4.8311199999999999e-06,4.8566000000000002e-06,4.8588099999999998e-06,4.88941e-06,4.9225900000000002e-06,4.9678500000000002e-06,4.9740699999999991e-06,5.0360599999999997e-06,5.0961899999999997e-06,5.2826299999999996e-06],"400":[6.0769800000000007e-06,6.11907e-06,6.1345299999999999e-06,6.145966101694915e-06,6.1527399999999998e-06,6.1932600000000002e-06,6.2344799999999996e-06,6.24123e-06,6.2604000000000002e-06,6.28e-06,6.2987799999999992e-06,6.3040899999999996e-06,6.3392999999999996e-06,6.3982899999999995e-06,6.43823e-06,6.4606500000000006e-06,6.5342199999999998e-06,6.78019e-06,7.2027499999999998e-06,7.27924e-06],"1310720":[0.051024340000000001,0.052340098999999987,0.055721491000000026,0.059649269000000019,0.060046099500000026,0.060402381500000026,0.060535425499999997,0.060732258500000004,0.061442372000000002,0.061449017500000001,0.061929213000000004,0.06195155099999998,0.062068415000000002,0.062256827000000001,0.062656178000000035,0.062700384499999998,0.063128561,0.063739452000000002,0.063752435499999982,0.063884827000000019],"336":[5.2392900000000001e-06,5.2617e-06,5.2659300000000002e-06,5.278888888888889e-06,5.2854300000000007e-06,5.2859200000000002e-06,5.33705e-06,5.3373999999999999e-06,5.3536599999999998e-06,5.412e-06,5.4684e-06,5.5004999999999993e-06,5.5029299999999998e-06,5.51274e-06,5.6418799999999996e-06,5.6543999999999996e-06,5.6595599999999997e-06,5.7372100000000006e-06,5.8881600000000004e-06,6.1589700000000003e-06],"3670016":[0.19198084500000001,0.19210167300000003,0.19233307999999999,0.19257333800000001,0.19266767100000001,0.1929719765,0.19426370900000001,0.194396656,0.19443460700000001,0.19511558300000001,0.195330368,0.19577111650000001,0.19621618149999998,0.19878913749999999,0.19911655299999997,0.19929567249999999,0.199603799,0.20061272299999999,0.20214602300000001,0.20949709299999997],"6656":[0.000105356,0.00010847942857142861,0.00010866242857142856,0.000109486,0.00010978995238095234,0.00011000299999999997,0.000110691,0.0001107435,0.00011248667857142857,0.00011267980303030303,0.00011296280246913574,0.00011342786419753078,0.00011373581081081082,0.00011489107142857143,0.00011493181481481481,0.000115888,0.00011609188157894734,0.00011637845783132529,0.00011658032467532467,0.00012320222222222222],"15360":[0.00025887499999999999,0.00025887933333333332,0.00027190509374999986,0.00027304756250000014,0.00027355186666666662,0.00027374566666666674,0.00027409560000000001,0.0002749810000000001,0.00027704550000000002,0.00027760749999999987,0.00027801768571428541,0.0002790053333333334,0.0002804274848484848,0.00028049875,0.00028094669696969693,0.000282732,0.00028430383333333335,0.00028480803030303027,0.00028993547058823527,0.00032689399999999994],"432":[6.5883499999999994e-06,6.6590930232558142e-06,6.6939200000000001e-06,6.7170499999999995e-06,6.7206600000000005e-06,6.7284699999999996e-06,6.7294700000000001e-06,6.74975e-06,6.7580000000000003e-06,6.7736499999999999e-06,6.7837900000000003e-06,6.7970000000000003e-06,6.9406999999999995e-06,6.9908700000000007e-06,7.0192200000000002e-06,7.0503799999999997e-06,7.0988900000000001e-06,7.2869700000000003e-06,7.3643263157894743e-06,7.3911899999999998e-06],"950272":[0.0310269185,0.031579483500000005,0.034819767999999987,0.039765998000000004,0.039806995499999998,0.039984722,0.040242017500000019,0.040426476000000003,0.040830911499999997,0.041055392499999996,0.041427372000000004,0.041637525999999994,0.041711993999999988,0.041737094999999988,0.042085020000000001,0.042462740499999999,0.042477783999999998,0.042530993000000003,0.042646729500000001,0.044008499999999999],"655360":[0.018611152499999999,0.018875428999999992,0.0193904435,0.019423030500000001,0.019429663999999996,0.0195753935,0.019610235,0.020066979999999991,0.0203648895,0.020584794,0.021056773000000001,0.021143466999999999,0.021193102500000002,0.021330712999999994,0.0217931045,0.024037810499999999,0.024310111499999999,0.024702478,0.025074165000000002,0.025909354499999999],"69632":[0.0013865556666666668,0.001392553833333333,0.001418891,0.0014191230000000004,0.0014228986666666669,0.0014277081666666668,0.0014334183333333333,0.0014341721666666668,0.001436026,0.0014500143333333331,0.0014505408333333331,0.001459215,0.0014606711666666666,0.0015302525000000001,0.001590087,0.0016206840000000001,0.0016987453999999993,0.0016995696000000008,0.0017136569999999999,0.001843024],"11264":[0.00021628699999999998,0.000224801,0.00022493125,0.000227314,0.00022798800000000001,0.00022800549999999999,0.00022839299999999999,0.00022895055000000014,0.00022951625000000001,0.0002312003333333333,0.00023144511627906975,0.00023180799999999993,0.00023206633333333328,0.00023211719999999999,0.000232614447368421,0.00023404909523809517,0.00023694283333333338,0.000237989,0.00023838308333333337,0.00024252679999999999],"2752512":[0.147537686,0.14932738000000001,0.15008207849999999,0.15014900199999998,0.150791494,0.15111327499999999,0.15114318199999999,0.151144324,0.15141070200000001,0.15231563949999999,0.15290737400000001,0.15335078099999999,0.15405664899999999,0.15451903150000001,0.15601588049999998,0.15711325249999999,0.15739962699999999,0.16030965699999999,0.16101297749999999,0.16275623550000001],"8126464":[0.48435735600000002,0.49199069849999999,0.492371377,0.49501487100000002,0.49521056699999999,0.49752002899999997,0.49778938849999999,0.4986528985,0.50005320799999997,0.50206962349999995,0.50445744150000005,0.50586368650000002,0.50607425299999997,0.50897757700000001,0.51013016749999995,0.51284241549999998,0.51412080599999999,0.517582604,0.52757450100000003,0.56258663900000005],"27648":[0.00046191499999999997,0.00046328200000000003,0.00047744509999999972,0.00048301699999999997,0.000484909,0.00048535199999999982,0.000486066,0.00048873799999999985,0.00048905972222222215,0.00049039200000000008,0.00049090805263157908,0.00049249800000000018,0.00049483887500000046,0.00049486849999999993,0.00049619221052631579,0.00049719294736842094,0.00049926255555555554,0.00050035873684210524,0.0005006436666666668,0.00052136900000000004],"368":[5.8006799999999997e-06,5.8277199999999998e-06,5.8449100000000004e-06,5.8873499999999996e-06,5.9179199999999994e-06,5.9234599999999999e-06,5.9288899999999994e-06,5.9358399999999994e-06,5.9538999999999999e-06,5.9783e-06,5.9842300000000006e-06,5.9854299999999999e-06,6.03625e-06,6.1194500000000003e-06,6.16571e-06,6.1777999999999995e-06,6.3405499999999998e-06,6.3510900000000002e-06,6.3708899999999996e-06,6.8873333333333335e-06],"65536":[0.0012755970000000001,0.0012775739999999999,0.0012857434285714286,0.0012911537142857147,0.0012963211666666666,0.001302788,0.0013041833333333336,0.0013133810000000002,0.001314918,0.0013191515714285711,0.0013218662857142854,0.0013229527142857142,0.0014292213333333336,0.001543598,0.0015701210000000001,0.0015940178333333336,0.0015972395,0.0016693612500000006,0.0018759249999999999,0.0025673939999999998],"16252928":[1.3048890845000001,1.3082645319999999,1.31335186,1.3185752500000001,1.3221884075000001,1.3327904165,1.3335581004999999,1.3388923035,1.3405899100000001,1.3440897089999999,1.347676697,1.3504601430000001,1.351701864,1.3532895735000001,1.3580142235000001,1.3618170695,1.3637483910000001,1.3833611505000001,1.399639665,1.4040955804999999],"464":[7.1580300000000003e-06,7.1649799999999995e-06,7.1905799999999997e-06,7.2140699999999997e-06,7.2577899999999995e-06,7.3005099999999997e-06,7.3182599999999996e-06,7.3252941176470592e-06,7.4652400000000004e-06,7.5035100000000001e-06,7.5044599999999996e-06,7.5188999999999993e-06,7.5218900000000001e-06,7.5521699999999999e-06,7.5933299999999993e-06,7.6007099999999998e-06,7.6583099999999999e-06,7.679083333333334e-06,7.8496899999999997e-06,8.0535199999999998e-06],"1015808":[0.035421437,0.036534570499999988,0.036629958000000004,0.042268855500000001,0.043352345,0.043863646999999978,0.04417152349999999,0.044425686000000013,0.044451194499999999,0.044830787999999996,0.045117518499999988,0.045473717000000011,0.045587443999999998,0.04585279300000001,0.046056493999999996,0.046374716999999996,0.046402881,0.046639099999999996,0.047388097499999997,0.054788842000000004],"3072":[5.9014666666666669e-05,5.9075096774193544e-05,6.0304019999999999e-05,6.0377340000000005e-05,6.0643129999999998e-05,6.0696999999999998e-05,6.0754597014925372e-05,6.0915789999999996e-05,6.1008245901639345e-05,6.1060919354838706e-05,6.1194440000000001e-05,6.1359779661016947e-05,6.1969000000000002e-05,6.2899741379310341e-05,6.2899920000000005e-05,6.3194456140350878e-05,6.3360981132075462e-05,6.4107927272727272e-05,6.7341000000000005e-05,6.7461999999999999e-05],"110592":[0.0021123870000000012,0.00212086825,0.0021239280000000002,0.002127851,0.0021398950000000002,0.002141605,0.0021618807500000002,0.002171213,0.0021748679999999999,0.0021824664999999998,0.00219309975,0.0022153205,0.0022241410000000002,0.002480271,0.0026377983333333338,0.0027157673333333332,0.0027365423333333334,0.0027491123333333333,0.0028406320000000001,0.0032203153333333332],"237568":[0.0049509900000000015,0.0049591349999999999,0.004990932,0.004991811000000004,0.0049960459999999996,0.0050041479999999991,0.0050066639999999983,0.0050235039999999998,0.0050474500000000002,0.0050511449999999999,0.0050616259999999988,0.0050680740000000023,0.0050939309999999995,0.0051255610000000024,0.0051472500000000008,0.0051560779999999997,0.0051622739999999997,0.0051801590000000019,0.0051839859999999998,0.0052257809999999997],"278528":[0.0061230480000000016,0.0061421640000000003,0.0062104020000000003,0.0062160540000000004,0.0062216809999999989,0.0062251309999999992,0.0062431040000000011,0.0062436519999999997,0.0062487650000000016,0.006263935,0.0062694249999999977,0.0063374530000000016,0.0063439099999999986,0.0063815930000000005,0.0064307040000000006,0.0064802710000000001,0.0065309780000000015,0.006572077,0.0070480540000000024,0.0073757459999999999],"496":[7.6427399999999999e-06,7.6508470588235294e-06,7.6591111111111115e-06,7.7659999999999998e-06,7.7902200000000001e-06,7.8240500000000001e-06,7.8667600000000012e-06,7.8860000000000004e-06,7.9060000000000002e-06,7.9584699999999997e-06,7.981489999999999e-06,7.9938899999999991e-06,8.0585099999999999e-06,8.0637799999999992e-06,8.1313200000000009e-06,8.1397299999999997e-06,8.1398100000000003e-06,8.17802e-06,8.2893399999999998e-06,8.5169999999999999e-06],"13107200":[1.0600045119999999,1.062277103,1.069885226,1.077309061,1.079938547,1.0810424155,1.0839963109999999,1.086063679,1.08864275,1.090613595,1.0906198645,1.0938634715,1.0975957635,1.0988740159999999,1.102508158,1.1042014010000001,1.1076931720000001,1.1099093255000001,1.1114064100000001,1.145920834],"9961472":[0.63792881999999995,0.63850478150000001,0.63927969149999997,0.64114751999999997,0.64220576750000002,0.64561808450000002,0.64603107949999994,0.64836931600000003,0.648685603,0.65024323100000003,0.65377732700000002,0.65416754499999996,0.65477199350000004,0.65635125049999998,0.656509338,0.6565953685,0.659536134,0.66091668449999996,0.66149971149999998,0.67835311249999997],"5888":[0.0001167955,0.0001172185,0.00011745830000000005,0.00011775200000000001,0.00011805466666666667,0.00011869070886075948,0.00011887863157894737,0.00011894022972972974,0.000119117,0.00011969270422535214,0.000120006,0.00012002116666666666,0.0001205592375,0.00012079856451612906,0.00012081112345679015,0.00012084793150684932,0.00012157274999999999,0.00012261688405797096,0.00012462373684210524,0.0001256671447368421],"11010048":[0.73216004049999994,0.73394965199999995,0.73600070449999999,0.73850175200000001,0.74261647750000004,0.74421404950000003,0.74508534749999999,0.74519149600000001,0.74616497250000002,0.75001925349999998,0.75024691600000004,0.75154464300000001,0.75328502850000001,0.75405660900000004,0.75463839300000002,0.75737148450000003,0.76242232799999998,0.76923984600000006,0.76998648800000002,0.77236395099999999],"1920":[3.0380666666666669e-05,3.0904624999999997e-05,3.1434579999999997e-05,3.1435700000000001e-05,3.1497360000000005e-05,3.1719179999999998e-05,3.1822259999999999e-05,3.1894499999999998e-05,3.1945469999999999e-05,3.1960340206185569e-05,3.2019e-05,3.2050350000000004e-05,3.2082249999999999e-05,3.240424e-05,3.2458120000000002e-05,3.2686439999999995e-05,3.3098060000000005e-05,3.3506030000000003e-05,3.4160738636363639e-05,3.452404e-05],"2490368":[0.12901116700000001,0.12929512700000001,0.13007756300000001,0.13049009700000003,0.1323078325,0.132800958,0.13329518200000001,0.13389482799999997,0.1344309095,0.13462698149999999,0.13513279,0.135617973,0.13586058949999999,0.13626159099999999,0.13717800799999999,0.1377334325,0.13802707850000001,0.1383322075,0.13918519550000003,0.1401093705],"19456":[0.000358422,0.00035973599999999993,0.00036166899999999996,0.00036184100000000001,0.000362784,0.00036286599999999999,0.00037271400000000012,0.00037527300000000008,0.00037993066666666664,0.00038133542307692306,0.00038160431999999998,0.00038312888461538463,0.0003840210833333333,0.00038422045833333337,0.00038782970833333341,0.00039094567999999936,0.00039330652000000004,0.00040078669565217398,0.00040526225000000001,0.00043017936363636347],"57344":[0.001027345,0.0010408799999999999,0.001063813,0.0010723701111111114,0.0010761500000000001,0.0010796360000000001,0.001086072,0.001089060375,0.0010902206249999999,0.001095129,0.0011123762500000001,0.001118748625,0.00114374425,0.0011858049999999994,0.0013170587500000001,0.0013252975714285714,0.0013768008000000003,0.0014337970000000001,0.0014439488333333333,0.0014527051666666665],"1179648":[0.043494782499999989,0.0440685465,0.044456258000000012,0.051706144000000023,0.051863697,0.052026961500000003,0.052162263,0.0523369635,0.052586299000000003,0.052603813500000006,0.053083866,0.053221295999999987,0.053242702499999996,0.053705042000000015,0.054132687499999999,0.0545520195,0.054682199499999959,0.055521002,0.056100372499999974,0.056283068499999998],"4718592":[0.27071888999999999,0.27099402049999999,0.27237690599999997,0.27312682599999999,0.27313488000000002,0.2733236725,0.274105661,0.27451830199999999,0.27481491800000002,0.27483228100000001,0.27503072699999997,0.27567408100000002,0.27583388149999999,0.27655072600000002,0.27662434299999999,0.27723569800000003,0.27971285600000001,0.28143984499999997,0.28399896800000002,0.29904002800000001],"360448":[0.0086948279999999965,0.0087382299999999996,0.0087635980000000061,0.0087702479999999996,0.008773630000000001,0.0087879730000000045,0.0088043489999999978,0.0088106680000000041,0.0088216950000000009,0.0088407599999999996,0.0088486299999999997,0.0089309690000000004,0.0089310399999999977,0.0089597069999999973,0.0089617469999999956,0.0089721899999999979,0.009170501000000001,0.0091909639999999994,0.009254341000000001,0.0094205309999999993],"1572864":[0.06725574500000002,0.069392644500000003,0.069615936999999975,0.074671336000000005,0.075236523,0.075372853000000004,0.075419211000000055,0.076004857999999981,0.077159752000000026,0.077901095000000017,0.078138424499999998,0.078444582999999971,0.0788327895,0.078883107999999993,0.079198224999999997,0.079236724500000008,0.07936770100000004,0.08024443799999996,0.082816686,0.091397586500000003],"53248":[0.00096291599999999997,0.00096715375000000026,0.00096885700000000005,0.00098026100000000007,0.0009832273333333333,0.00098325600000000006,0.00098805188888888892,0.00099173977777777768,0.00099820400000000037,0.0010003787777777776,0.0010005155,0.0010051748888888887,0.0010052173333333332,0.0010096832222222221,0.0010149925555555553,0.0010171585000000002,0.0012735727142857145,0.0013067387142857143,0.0013079091428571429,0.0013244609999999999],"3456":[5.6978999999999998e-05,5.7450599999999995e-05,5.7776464788732401e-05,5.7867705882352936e-05,5.8171280000000002e-05,5.8472339999999995e-05,5.8999449275362317e-05,5.9180292307692312e-05,5.9217117647058828e-05,5.9414369999999996e-05,5.946169e-05,5.9492031746031746e-05,6.0013000000000003e-05,6.0636952380952381e-05,6.0742280000000001e-05,6.0900529999999999e-05,6.1025549999999997e-05,6.1150029999999998e-05,6.1462560000000001e-05,6.5047288461538458e-05],"40960":[0.00080124799999999985,0.00083864900000000001,0.00084311490909090916,0.00084351445454545462,0.00084465063636363633,0.00084694154545454561,0.00084728699999999974,0.00084883818181818191,0.00085403899999999947,0.00085432036363636363,0.00085449981818181786,0.00085757290909090815,0.00085974369999999997,0.00086141918181818181,0.00086246854545454516,0.00086373636363636357,0.0008694560909090907,0.00087402999999999992,0.00087737463636363647,0.00091029469999999999],"4608":[8.1665631578947369e-05,8.1742000000000004e-05,8.1788999999999999e-05,8.2558058823529413e-05,8.2731058823529413e-05,8.2769642857142851e-05,8.3059999999999994e-05,8.399827000000001e-05,8.4091730000000002e-05,8.4533384615384611e-05,8.4946180000000009e-05,8.504311428571428e-05,8.5672585106382984e-05,8.585e-05,8.6168140000000002e-05,8.6310066666666659e-05,8.6447354166666664e-05,8.6700000000000007e-05,8.6946090909090915e-05,8.8883545454545459e-05],"13824":[0.00022321750000000006,0.00022397400000000005,0.00022974600000000002,0.00023394,0.00023432599999999998,0.00023590516666666673,0.00023723550000000001,0.00023945669999999995,0.00023998100000000001,0.00024034423684210528,0.00024073246666666664,0.00024184392105263165,0.00024184825000000002,0.00024244720000000003,0.00024248647368421044,0.00024328455555555577,0.00024423207499999991,0.00024616962500000002,0.00026298429411764714,0.00026478266666666667],"819200":[0.024692338499999994,0.025953530499999999,0.026204517,0.034261165000000017,0.034281533000000017,0.034405378,0.034533124999999998,0.034638280999999993,0.034951077499999983,0.035074920999999981,0.035203581999999976,0.035486549500000006,0.035501513000000026,0.035549650999999995,0.035568388500000006,0.035775930999999997,0.035823361499999998,0.036048797,0.036385444999999995,0.036874296000000001],"983040":[0.032945225000000002,0.033841877999999985,0.034050759,0.041661210999999997,0.041988881999999998,0.042088883000000001,0.042327990000000017,0.042388340499999996,0.042521511999999997,0.042988538,0.04312319099999995,0.043427814999999981,0.043435915000000026,0.043462026000000001,0.043558140000000023,0.04358252150000002,0.043999500999999996,0.0448329955,0.046126985000000002,0.0476188185],"8704":[0.00014970199999999996,0.000150137,0.00015227720000000005,0.00015655160000000001,0.00015846100000000001,0.000158639,0.00015896200000000007,0.0001592408225806452,0.00016000578571428569,0.00016022479999999999,0.0001614273166666667,0.00016243782142857141,0.00016315599999999999,0.00016350326666666668,0.00016512099999999995,0.00016574433333333335,0.00016646449999999996,0.00016703722641509428,0.00016734545614035084,0.000172943],"120":[1.9134499999999999e-06,1.9201399999999999e-06,1.9226999999999998e-06,1.9533800000000001e-06,1.95488e-06,1.95709e-06,1.9577400000000002e-06,1.9588599999999997e-06,1.9589699999999998e-06,1.95953e-06,1.9649e-06,1.96723e-06,1.9735400000000001e-06,1.9748900000000001e-06,1.99523e-06,2.00123e-06,2.0168099999999998e-06,2.0259999999999997e-06,2.0299700000000001e-06,2.05582e-06],"1024":[1.6410666666666665e-05,1.654164e-05,1.6562941176470589e-05,1.6654840000000001e-05,1.665836e-05,1.6663850000000001e-05,1.679983e-05,1.6904520000000002e-05,1.6907910000000002e-05,1.69752e-05,1.69814e-05,1.6988390000000001e-05,1.7118749999999999e-05,1.7138982758620692e-05,1.7139160000000001e-05,1.7175450000000002e-05,1.764643e-05,1.784486e-05,1.797732e-05,1.8197129999999998e-05],"49152":[0.0010557560000000001,0.0010622630000000004,0.001068128,0.0010726240000000001,0.0010737590000000001,0.001074459,0.0010768196666666667,0.0010808080000000004,0.0010827913749999999,0.0010836579999999999,0.0010875275,0.0010888957500000001,0.0010890989999999996,0.0010933575,0.0010984285,0.001102259,0.0011130490000000001,0.001115104875,0.001148197625,0.001158266],"524288":[0.013636908999999999,0.0139083895,0.0139086995,0.013956748999999999,0.01491952,0.0155338165,0.015798038,0.015909389999999999,0.015959596499999999,0.016138206499999995,0.016587185000000001,0.018157872500000002,0.0183647805,0.018471088,0.0187570185,0.019341682500000002,0.019528150000000001,0.020344591000000002,0.020657836499999999,0.022265170000000004],"45056":[0.00091037700000000008,0.00092285999999999996,0.00092858699999999982,0.00093993199999999955,0.00094415055555555538,0.00094721199999999969,0.00094998400000000007,0.000951949,0.00095433740000000001,0.00095780999999999969,0.0009584431111111111,0.00096339879999999959,0.00096358155555555558,0.00096608611111111153,0.00096673500000000014,0.00096983829999999999,0.00097223440000000023,0.0009736368,0.00097891377777777761,0.0010089299999999999],"229376":[0.0046657110000000003,0.0047942800000000023,0.0047970820000000003,0.0048071290000000003,0.0048369009999999985,0.0048425020000000003,0.0048462520000000023,0.0048722319999999998,0.0048760219999999998,0.0048973589999999996,0.0049118720000000003,0.0049162929999999978,0.004946471,0.0049492330000000025,0.004983147999999998,0.0049867080000000003,0.004998288,0.005085618000000001,0.0050875310000000019,0.005497989],"2688":[4.7262999999999998e-05,4.9403333333333328e-05,4.9687560000000006e-05,4.9730769230769231e-05,4.9740399999999996e-05,4.9974500000000001e-05,5.0306839999999994e-05,5.0318309999999996e-05,5.0526269999999996e-05,5.0539260416666664e-05,5.0550252873563217e-05,5.0808980000000006e-05,5.1050629999999997e-05,5.1484222222222222e-05,5.1504511363636358e-05,5.1671e-05,5.1874666666666673e-05,5.1980050505050507e-05,5.2607759999999999e-05,5.3147951807228917e-05],"152":[2.3937200000000002e-06,2.4446299999999998e-06,2.4470500000000001e-06,2.4530000000000001e-06,2.462734375e-06,2.5021499999999998e-06,2.51012e-06,2.5496999999999999e-06,2.5509699999999998e-06,2.55604e-06,2.5657099999999997e-06,2.5861399999999999e-06,2.5949300000000003e-06,2.6333200000000004e-06,2.6350199999999999e-06,2.6602499999999996e-06,2.6736199999999998e-06,2.6749899999999999e-06,2.7199800000000001e-06,2.7218700000000002e-06],"5120":[9.2306999999999996e-05,9.4485833333333329e-05,9.480853846153845e-05,9.5063000000000008e-05,9.6058199999999995e-05,9.6117076923076932e-05,9.6168000000000005e-05,9.6571249999999998e-05,9.6708749999999995e-05,9.7758505154639169e-05,9.8232374999999996e-05,9.8740999999999995e-05,9.9410031249999996e-05,9.9457536082474222e-05,0.00010008630769230771,0.00010062709782608695,0.00010093,0.00010153321052631581,0.0001023862608695652,0.00010280397802197802],"1507328":[0.063267649999999981,0.065021776000000003,0.06651971449999998,0.071282687999999997,0.071451916000000032,0.071964604000000015,0.072385112500000001,0.072747982500000002,0.07299180249999998,0.07319615799999997,0.073628279000000005,0.07371685850000001,0.073862124500000001,0.073969304499999972,0.074129890000000004,0.074171714999999999,0.074221300000000004,0.074277519,0.07446721399999999,0.076006929999999973],"1216":[1.9670666666666664e-05,2.0473433333333333e-05,2.0603333333333337e-05,2.0646454545454544e-05,2.0672260000000003e-05,2.0674669999999998e-05,2.0692000000000001e-05,2.0723176470588239e-05,2.0726540000000002e-05,2.0745859999999998e-05,2.0776970588235294e-05,2.083932e-05,2.0880750000000002e-05,2.0881316666666666e-05,2.0885390000000001e-05,2.102133e-05,2.1029479999999998e-05,2.1086170000000003e-05,2.111384e-05,2.1728884615384612e-05],"1966080":[0.094530356999999982,0.094776384999999977,0.095116773500000001,0.096619846999999995,0.097348835999999994,0.097953756999999975,0.098362046000000036,0.09837762900000005,0.098715568000000004,0.09876717699999997,0.099005005000000007,0.09901448149999996,0.099182945999999994,0.099336580999999993,0.099547749000000005,0.099728689000000037,0.10099718100000001,0.1016632705,0.101785083,0.10257026900000001],"1900544":[0.091586397999999986,0.092482677499999999,0.092855234000000023,0.093021249,0.093133340999999994,0.093139468000000003,0.093161129499999995,0.09333642999999997,0.09364230250000001,0.093826008000000002,0.094041274499999994,0.094527834999999949,0.094554302500000034,0.0951202295,0.095334498000000031,0.095904757499999993,0.096240185500000006,0.09750848949999999,0.098239905500000016,0.101945973],"184":[2.88726e-06,2.9076900000000003e-06,2.9184099999999997e-06,2.9300000000000003e-06,2.9330799999999998e-06,2.9397500000000001e-06,2.9537600000000002e-06,2.95506e-06,2.9579200000000002e-06,2.9648100000000002e-06,2.9668699999999999e-06,2.9741400000000003e-06,2.9868392857142856e-06,2.99403e-06,2.9986100000000002e-06,2.99966e-06,3.0503699999999996e-06,3.0879799999999998e-06,3.1353300000000003e-06,3.28522972972973e-06],"7936":[0.00013384374999999996,0.00013818741666666673,0.00013878099999999996,0.00013893133333333334,0.000139247,0.00013994494366197183,0.00014051100000000001,0.00014200287272727271,0.00014206470769230766,0.000142774,0.0001430383050847458,0.00014370771212121207,0.00014381049253731339,0.00014385824999999999,0.000144078890625,0.00014528685714285713,0.0001469238,0.00014998833333333331,0.00015019566666666669,0.00015721016071428568],"3801088":[0.19927537350000002,0.20123398300000001,0.20238118899999999,0.202397877,0.20369770400000001,0.20373947949999999,0.20382238550000001,0.20446166199999999,0.204623109,0.20564816000000002,0.20582631950000002,0.20651670150000001,0.206691342,0.2068320125,0.20916212049999999,0.20946961200000003,0.20947572749999999,0.21278656300000001,0.21506624999999999,0.21637833499999998],"6815744":[0.391648789,0.39414218049999999,0.39616967349999999,0.39650366949999999,0.39720810449999999,0.39787814100000002,0.39933751200000001,0.39952401799999998,0.3999636895,0.40020036650000002,0.4047184305,0.4050029195,0.40679560949999999,0.40776941099999997,0.40906379100000001,0.41226162599999999,0.41236797250000001,0.414189743,0.42509920400000001,0.42581105949999998],"124":[1.9783299999999997e-06,1.97929e-06,1.9819e-06,1.9916800000000002e-06,1.99388e-06,1.9939699999999999e-06,1.9952200000000001e-06,2.0021899999999998e-06,2.00252e-06,2.0044099999999997e-06,2.0055499999999998e-06,2.0105399999999999e-06,2.01395e-06,2.03316e-06,2.0424300000000001e-06,2.0439099999999999e-06,2.0521800000000003e-06,2.05654e-06,2.0726300000000003e-06,2.0884799999999999e-06],"102400":[0.0018911094999999999,0.0019198610000000001,0.0019209527500000001,0.0019315670000000004,0.0019639487500000006,0.0019853437500000001,0.0019962489999999994,0.0019963275000000002,0.00199712875,0.0020072587500000005,0.00202447,0.0020437160000000001,0.0024821956666666672,0.0025125950000000007,0.0025172439999999992,0.0025333673333333326,0.0025335100000000001,0.0025887283333333334,0.0026201090000000002,0.0027654666666666662],"311296":[0.0071275029999999977,0.007150882999999995,0.0071516499999999998,0.0071688559999999969,0.0071774899999999999,0.0071907399999999984,0.0072053380000000004,0.0072080310000000019,0.0072266629999999995,0.0072700840000000004,0.0072862130000000049,0.007297355000000001,0.007316609,0.0073270760000000001,0.0073488319999999996,0.0073519780000000003,0.0073539580000000007,0.0073845959999999976,0.0074558670000000006,0.0074999439999999997],"1408":[2.3636666666666667e-05,2.3825500000000001e-05,2.3852499999999999e-05,2.43445e-05,2.4763029999999999e-05,2.4899999999999999e-05,2.5059840000000003e-05,2.507007e-05,2.5083639999999998e-05,2.513554e-05,2.5324300000000001e-05,2.5356889999999997e-05,2.5361129999999999e-05,2.5391689999999999e-05,2.5483070000000001e-05,2.549095e-05,2.5643234567901234e-05,2.5839399999999999e-05,2.5860269999999998e-05,2.6172547945205481e-05],"393216":[0.0098244809999999995,0.0098265315000000027,0.0098693210000000003,0.0099241630000000032,0.0099277475000000004,0.0099351674999999997,0.0099458380000000002,0.0099602309999999999,0.0099813425000000004,0.0099861504999999972,0.010002727999999999,0.010010679,0.010017120500000001,0.010018091999999994,0.010025799,0.0100419155,0.010070629000000001,0.010137769999999999,0.010614789999999999,0.010828873000000001],"4352":[7.3407999999999999e-05,7.5488181818181814e-05,7.6281450000000001e-05,7.6689999999999999e-05,7.6826078947368417e-05,7.6862999999999999e-05,7.7011285714285413e-05,7.7060120000000006e-05,7.7195490000000002e-05,7.7355999999999996e-05,7.7395291666666662e-05,7.7405153846153843e-05,7.7633439999999997e-05,7.7670710000000002e-05,7.7775780000000007e-05,7.7984499999999998e-05,7.8312509999999987e-05,7.8973389999999991e-05,7.9993629629629621e-05,8.1222000000000003e-05],"6553600":[0.37470837749999997,0.37507356650000001,0.37833482600000001,0.37937493249999998,0.379740778,0.38106783700000002,0.38145711300000001,0.3846556035,0.38466625700000001,0.38579991650000001,0.38595479300000002,0.38682633399999999,0.38690469900000002,0.38763585249999999,0.39012215449999998,0.39567974299999997,0.39573277950000002,0.39635457549999997,0.3978302185,0.40937754700000001],"20480":[0.00039697300000000001,0.00039750999999999995,0.00040154999999999998,0.000401858,0.00040272400000000003,0.00040782550000000012,0.00040831099999999991,0.00040937308333333338,0.00041042695454545443,0.00041212771428571421,0.00041224949999999996,0.00041459999999999989,0.00041721400000000006,0.00041775734782608699,0.00041780386363636355,0.00041952291304347869,0.00042033995652173903,0.00042163565217391314,0.00045613800000000003,0.00046986],"608":[9.5780000000000005e-06,9.594e-06,9.628e-06,9.7233599999999997e-06,9.7241794871794869e-06,9.7415300000000002e-06,9.74901e-06,9.7676199999999992e-06,9.7853571428571432e-06,9.8001600000000004e-06,9.8905900000000008e-06,9.9157700000000004e-06,9.9288799999999994e-06,9.9710199999999996e-06,1.0225e-05,1.0254829999999999e-05,1.040375e-05,1.0566110000000001e-05,1.0931940000000001e-05,1.105614e-05],"2228224":[0.11087725749999999,0.1127090275,0.112981658,0.11307838800000003,0.113299677,0.1133548835,0.113506577,0.1137400855,0.114235673,0.114325603,0.1143634,0.114532208,0.115462554,0.11575774649999999,0.11610050399999999,0.116572042,0.117501641,0.117687899,0.117837889,0.11785140500000001],"36864":[0.00069911799999999998,0.00070145300000000021,0.00070581449999999987,0.00071780800000000033,0.00071899846153846152,0.00072123616666666668,0.00072321274999999992,0.00072817500000000007,0.00072883575000000042,0.00073245699999999994,0.0007326615384615385,0.00073740146153846147,0.00073863449999999979,0.00073980899999999991,0.00074360623076923115,0.00074850027272727255,0.00075222583333333347,0.00075982749999999966,0.00077184491666666666,0.00080205058333333336],"704":[1.1327e-05,1.134788888888889e-05,1.1493266666666667e-05,1.1514349999999999e-05,1.164416e-05,1.1675120000000001e-05,1.169025e-05,1.1691979999999999e-05,1.1712000000000001e-05,1.1775480000000001e-05,1.19495e-05,1.199402e-05,1.1998169999999999e-05,1.207187e-05,1.207894e-05,1.2082489999999999e-05,1.20903e-05,1.219477e-05,1.2301e-05,1.241654e-05],"720896":[0.021181423500000001,0.021661318999999998,0.021850998,0.021951613500000001,0.0221454315,0.02222815899999999,0.022259697999999998,0.022610158999999998,0.023677697500000008,0.023920569500000002,0.024064504,0.02427694,0.025157305000000001,0.025965932000000008,0.026496230499999988,0.02735217550000001,0.027504064000000012,0.027781703500000011,0.027910691000000005,0.030021807500000004],"800":[1.2135403508771929e-05,1.24417e-05,1.2512330000000001e-05,1.2513820000000002e-05,1.2604700000000001e-05,1.2620159999999999e-05,1.2709404255319147e-05,1.2737409999999998e-05,1.273927e-05,1.275686e-05,1.276787e-05,1.2779939999999999e-05,1.2796779999999999e-05,1.2816999999999999e-05,1.2887333333333335e-05,1.2920159999999999e-05,1.3235479999999999e-05,1.327123e-05,1.433143e-05,1.4581222222222221e-05],"2621440":[0.137301378,0.13855721300000001,0.140230244,0.14170840849999999,0.141720135,0.14205013599999999,0.14218180899999999,0.14241246299999999,0.14349647600000001,0.14367436450000001,0.14427194799999998,0.14437827,0.14440974550000002,0.144650527,0.14492575799999999,0.1456255585,0.14571321199999998,0.14671297350000001,0.1469728995,0.15107112750000001],"425984":[0.0104601105,0.010580471000000003,0.010613052499999994,0.010768959,0.0108328955,0.010967977,0.011264973999999999,0.0119694945,0.012103039499999999,0.0122016925,0.0122474205,0.012332852,0.012621284999999999,0.012672104999999994,0.0127775535,0.0154356375,0.015552346,0.016172860000000001,0.0163796685,0.016388611000000004],"32768":[0.00060011449999999985,0.00060434600000000018,0.0006160061333333333,0.00061607435714285726,0.00061617313333333333,0.00062752699999999979,0.00063279099999999995,0.00063562900000000029,0.00063577846666666661,0.00063646907142857136,0.00063705953333333327,0.00063721300000000019,0.00063870099999999998,0.00063975035714285719,0.00064172599999999969,0.00064206393333333337,0.0006435309999999997,0.00066089600000000001,0.0006750399999999998,0.00070297899999999984],"12058624":[0.83191232449999997,0.83605293950000004,0.83763865400000004,0.83772963,0.84222075900000004,0.84318463200000004,0.84340375000000001,0.84508992950000006,0.84662792050000002,0.84716883499999995,0.84917284800000004,0.8491825435,0.85163495,0.85434810299999997,0.85443087399999995,0.8548909415,0.85509910249999999,0.85665352149999996,0.857929002,0.85925478050000004],"128":[2.0046499999999999e-06,2.0167000000000001e-06,2.0363900000000003e-06,2.0449199999999998e-06,2.0454299999999999e-06,2.0528800000000002e-06,2.07196e-06,2.0735199999999998e-06,2.07581e-06,2.0789199999999998e-06,2.0796599999999999e-06,2.0831499999999997e-06,2.0861600000000002e-06,2.0888199999999999e-06,2.09453e-06,2.0952100000000001e-06,2.1042999999999999e-06,2.1082100000000003e-06,2.12816e-06,2.1322000000000001e-06],"180224":[0.0039994955000000002,0.0040963714999999986,0.0041075199999999982,0.0041080994999999985,0.0041092175000000015,0.0041142664999999998,0.0041338429999999999,0.0042047895000000002,0.004259568499999998,0.0043350640000000013,0.0044028779999999998,0.0044214815000000003,0.0044337610000000022,0.0046283449999999973,0.0046900050000000023,0.0046954809999999996,0.0047111570000000023,0.0047887140000000012,0.0048784565000000004,0.0049514949999999985],"224":[3.3975500000000002e-06,3.3976299999999999e-06,3.4216399999999998e-06,3.4219799999999999e-06,3.45428e-06,3.4712600000000003e-06,3.5080499999999998e-06,3.5150900000000002e-06,3.5159999999999999e-06,3.5381799999999997e-06,3.5400500000000001e-06,3.5484200000000003e-06,3.5675799999999998e-06,3.5705300000000004e-06,3.5745299999999998e-06,3.7314100000000002e-06,3.7606400000000003e-06,3.8548300000000003e-06,4.1048899999999996e-06,4.1346999999999996e-06],"736":[1.2093333333333333e-05,1.2119249999999999e-05,1.2132079999999999e-05,1.2282009999999999e-05,1.2308209876543211e-05,1.2399629999999999e-05,1.247997e-05,1.2533500000000001e-05,1.2551210000000002e-05,1.258519e-05,1.2600910000000001e-05,1.2608059999999999e-05,1.26712e-05,1.2694410000000001e-05,1.2750603773584905e-05,1.2751310000000002e-05,1.2953489999999998e-05,1.3125019999999999e-05,1.3440478260869564e-05,1.4144734042553192e-05],"320":[4.9688300000000002e-06,4.9690199999999999e-06,5.0221800000000003e-06,5.0394318181818186e-06,5.0509999999999996e-06,5.0717899999999996e-06,5.0814999999999995e-06,5.0979400000000002e-06,5.1003333333333335e-06,5.1467100000000001e-06,5.1744900000000003e-06,5.1862200000000001e-06,5.2215400000000002e-06,5.2556200000000007e-06,5.2786800000000003e-06,5.2845599999999999e-06,5.35922e-06,5.5578899999999999e-06,5.8752699999999999e-06,5.9417199999999999e-06],"557056":[0.014801090499999999,0.0150506445,0.015106831500000001,0.0152853105,0.015458431,0.015618763000000008,0.015660999500000005,0.015806414999999997,0.016157686500000001,0.016572959999999994,0.017069140999999999,0.017131760500000006,0.017162996999999999,0.017217488999999992,0.02056104000000001,0.020570205500000001,0.020928741000000001,0.021255434,0.021326534000000001,0.023707431000000008],"832":[1.2588999999999999e-05,1.2815136363636364e-05,1.292175e-05,1.296e-05,1.302135e-05,1.3033829999999999e-05,1.3255969999999999e-05,1.3269410000000001e-05,1.3271478260869564e-05,1.334921e-05,1.3374050000000001e-05,1.3378570000000001e-05,1.340668e-05,1.3442049999999999e-05,1.3495829999999999e-05,1.3516000000000001e-05,1.352796e-05,1.358726e-05,1.368585e-05,1.4119160000000001e-05],"9437184":[0.58754762550000006,0.59394321700000008,0.59513335999999994,0.60014843500000004,0.60062983650000001,0.60123019749999995,0.60328692699999997,0.60340223700000006,0.60367567700000002,0.60447058850000002,0.60638204249999994,0.6070649065,0.60862393650000002,0.61246059799999997,0.61326187799999998,0.61335569499999998,0.61550856349999994,0.61580966400000003,0.62020723550000001,0.64186534750000002],"3584":[5.7178e-05,5.9411709677419353e-05,5.9668921875000001e-05,6.0176530000000004e-05,6.027256e-05,6.0323369999999997e-05,6.0510706896551726e-05,6.0723720000000004e-05,6.1179740000000003e-05,6.146570689655172e-05,6.1688940000000008e-05,6.2188882352941181e-05,6.2496999999999995e-05,6.257520689655172e-05,6.2687999999999993e-05,6.2825948275862072e-05,6.2872220000000006e-05,6.3201345454545456e-05,6.7888202702702711e-05,7.0655720000000003e-05],"6291456":[0.40459896899999997,0.40696517050000003,0.407551575,0.40935492299999998,0.40982149899999998,0.41037448850000002,0.41039117000000003,0.41150570749999998,0.4127331045,0.41286132050000002,0.41301383749999998,0.41401330949999998,0.4163187605,0.41723340600000003,0.41838743950000001,0.42047977400000003,0.42084658399999997,0.4250643845,0.42845738700000002,0.432670681],"256":[3.9125999999999996e-06,4.0182199999999996e-06,4.0294900000000003e-06,4.0409599999999997e-06,4.0494900000000001e-06,4.0660731707317075e-06,4.0773599999999999e-06,4.0822399999999999e-06,4.0865499999999999e-06,4.0865900000000001e-06,4.1035699999999996e-06,4.1436499999999997e-06,4.2272599999999999e-06,4.2547899999999996e-06,4.2879699999999999e-06,4.3544999999999996e-06,4.3852300000000004e-06,4.4151666666666671e-06,4.4402888888888891e-06,4.4551400000000002e-06],"15204352":[1.2061873935,1.2343376225,1.2461739685,1.2479437660000001,1.2481654474999999,1.2503190225,1.2524865300000001,1.2542194314999999,1.2545073695,1.2570974275,1.258182197,1.2596557719999999,1.2601671544999999,1.2663548984999999,1.2764674785000001,1.277196024,1.2793997154999999,1.2795139115,1.2811889235,1.299048628],"28672":[0.00048080699999999987,0.00050367100000000002,0.00050410400000000001,0.00051337799999999999,0.00051377711111111096,0.00051466363157894729,0.00051496466666666656,0.00051614744444444458,0.00051818800000000016,0.00051887950000000004,0.00052282229411764706,0.00052292899999999989,0.00052359066666666663,0.00052374400000000003,0.00052655416666666662,0.000526572,0.00052666699999999998,0.00052908500000000021,0.00053753899999999996,0.0005474189375000003],"768":[1.2674333333333333e-05,1.2797352941176471e-05,1.2904999999999999e-05,1.29194e-05,1.294386e-05,1.298108e-05,1.3008e-05,1.301779e-05,1.3058749999999999e-05,1.31325e-05,1.318374e-05,1.3276019999999999e-05,1.34116e-05,1.3475390000000001e-05,1.3502521739130436e-05,1.362533e-05,1.3653450000000001e-05,1.3760779999999999e-05,1.378441e-05,1.453838e-05],"212992":[0.0043108395000000001,0.0043593165,0.0043721680000000001,0.0044018214999999982,0.0044107405000000004,0.0044369974999999996,0.0044508504999999999,0.0045006704999999998,0.0045659955000000012,0.0045768190000000002,0.0045977694999999996,0.0046120359999999999,0.0046224305,0.0046244840000000025,0.0046522865,0.0046661340000000006,0.0047385429999999996,0.0047576579999999997,0.0049367710000000004,0.0051402870000000021],"864":[1.3279749999999999e-05,1.3396e-05,1.3682119999999999e-05,1.3687793478260871e-05,1.370452e-05,1.3743999999999999e-05,1.381542e-05,1.3848791208791208e-05,1.3880836956521738e-05,1.388865e-05,1.3894790000000001e-05,1.3928359999999999e-05,1.3974029999999999e-05,1.4006979999999998e-05,1.4012013513513514e-05,1.4134970000000001e-05,1.430043e-05,1.4390666666666666e-05,1.446084e-05,1.4550209999999999e-05],"352":[5.4336800000000005e-06,5.4847299999999997e-06,5.5190800000000005e-06,5.5233400000000004e-06,5.5442299999999998e-06,5.5665699999999998e-06,5.5974699999999998e-06,5.6013333333333335e-06,5.6147399999999992e-06,5.6279500000000009e-06,5.6324999999999999e-06,5.6392499999999994e-06,5.6518823529411768e-06,5.6707866666666671e-06,5.6795999999999998e-06,5.6954100000000004e-06,5.7073499999999997e-06,5.7656099999999993e-06,5.9612800000000003e-06,6.0345999999999998e-06],"253952":[0.0053575019999999984,0.0053672050000000025,0.0054255689999999999,0.0054360519999999985,0.0054473559999999996,0.0054656639999999994,0.0054816780000000011,0.0054963269999999988,0.0055005260000000004,0.0055480780000000023,0.0055561719999999998,0.0055565609999999998,0.005566845,0.0055819059999999993,0.0055819509999999999,0.0056459250000000004,0.0056556289999999997,0.0056633050000000004,0.0057103309999999999,0.0061791049999999998],"960":[1.5303529999999999e-05,1.5444840000000001e-05,1.5454889999999999e-05,1.546522e-05,1.5477299999999998e-05,1.552804e-05,1.559869e-05,1.5607399999999999e-05,1.565401e-05,1.566132e-05,1.5708840000000001e-05,1.5808109999999999e-05,1.5813800000000001e-05,1.5818640000000001e-05,1.5832999999999999e-05,1.5845970000000002e-05,1.5891757894736842e-05,1.619641e-05,1.6334636363636363e-05,1.6353680000000001e-05],"24576":[0.00051221100000000015,0.00051609300000000002,0.00051792100000000018,0.000519087,0.00051943200000000001,0.00052429688888888887,0.00052470499999999998,0.00052472399999999996,0.0005259623333333332,0.00052787699999999973,0.00052993399999999992,0.00053173900000000004,0.00053324999999999998,0.00053374666666666673,0.00053577500000000027,0.00053638900000000018,0.00053959933333333336,0.00054132541666666672,0.00054699588235294124,0.00060289100000000004],"7680":[0.00013091000000000001,0.00013112899999999996,0.000131972,0.000132416,0.00013247733333333333,0.00013290325,0.0001331658,0.00013421671428571433,0.000134277,0.00013441516417910443,0.00013480585714285715,0.00013487724999999999,0.000136678359375,0.00013683452941176466,0.00013803136363636364,0.00013833899999999999,0.00013885516666666667,0.00013939298507462686,0.000140223,0.00014165914285714284],"294912":[0.006568410000000002,0.0066023269999999998,0.006689943000000002,0.006710896,0.0067331230000000032,0.0067366610000000023,0.0067474509999999972,0.0067745269999999998,0.0067854930000000018,0.006788054,0.0068173880000000032,0.0068367409999999986,0.0068415130000000031,0.0068494410000000004,0.0068699390000000003,0.0068972249999999999,0.0068999319999999975,0.006926003,0.0069819540000000003,0.0072272930000000001],"1048576":[0.0385799,0.039120832000000001,0.04148251,0.044841205999999988,0.045043187999999998,0.045565522499999997,0.045673689500000003,0.045867705000000022,0.0461609355,0.046222469000000002,0.046372690999999994,0.046543327999999988,0.046935848000000002,0.046982533,0.047193057999999996,0.047676411500000009,0.047680072000000004,0.048004195,0.048103017000000012,0.051321488999999998],"10485760":[0.67621554000000006,0.68433013749999994,0.68522755050000006,0.68947198850000002,0.69203838049999999,0.69588831650000005,0.69650921099999996,0.69671235099999995,0.70121922049999996,0.70137175149999997,0.70309649500000004,0.70348620750000002,0.70497104999999993,0.70547592699999995,0.70620291700000004,0.71032332500000006,0.71189427999999999,0.71677309850000004,0.72197378400000001,0.7308713215],"344064":[0.0079725660000000004,0.0081253459999999968,0.0081849220000000007,0.0082271609999999967,0.0082366780000000007,0.0082856640000000016,0.0082911429999999973,0.008301479000000004,0.0083242200000000002,0.0083402009999999967,0.0083527269999999973,0.008404112,0.0084574579999999924,0.0084593709999999968,0.0085356660000000008,0.0085474920000000003,0.0087645090000000002,0.0095964094999999999,0.0096092215000000043,0.010008074],"288":[4.4044499999999998e-06,4.4068900000000003e-06,4.4735399999999999e-06,4.5147900000000005e-06,4.5357200000000002e-06,4.5654999999999997e-06,4.5724100000000003e-06,4.5946666666666668e-06,4.5980800000000004e-06,4.6066400000000003e-06,4.6194399999999996e-06,4.6245200000000001e-06,4.6281499999999999e-06,4.6423999999999998e-06,4.7295899999999997e-06,4.7429900000000003e-06,4.8332699999999996e-06,4.9527800000000005e-06,5.0555600000000001e-06,5.1169699999999999e-06],"1152":[1.8559e-05,1.859625e-05,1.8635250000000001e-05,1.8643000000000001e-05,1.905786e-05,1.920578e-05,1.922442e-05,1.9281659793814433e-05,1.9313510000000001e-05,1.9321e-05,1.9356620000000002e-05,1.9465494736842105e-05,1.9481230000000001e-05,1.9563170000000001e-05,1.960264e-05,1.9697529999999998e-05,1.9851e-05,1.9981499999999998e-05,2.1607767441860466e-05,2.174758e-05],"384":[6.0639999999999999e-06,6.11614e-06,6.1396100000000003e-06,6.13963e-06,6.1611799999999999e-06,6.2186999999999994e-06,6.2324999999999992e-06,6.2423855421686748e-06,6.2724600000000003e-06,6.30866e-06,6.3573600000000001e-06,6.39343e-06,6.4180499999999995e-06,6.4213699999999996e-06,6.5321200000000002e-06,6.57969e-06,6.6326600000000006e-06,6.6965099999999992e-06,6.7138676470588233e-06,7.1829000000000003e-06],"2304":[3.8516999999999997e-05,3.9596720000000001e-05,3.9725704545454546e-05,3.9886299999999998e-05,3.9903000000000001e-05,4.0013579999999998e-05,4.0206039999999997e-05,4.0215e-05,4.0233589743589744e-05,4.034286e-05,4.0411000000000003e-05,4.0491138888888891e-05,4.0525919999999999e-05,4.0574139999999998e-05,4.0679977272727276e-05,4.0896099999999996e-05,4.0924519999999999e-05,4.1155769999999994e-05,4.1928929999999993e-05,4.5259260000000006e-05],"896":[1.3811e-05,1.3990333333333334e-05,1.3991999999999999e-05,1.4079824175824176e-05,1.424394e-05,1.4275970000000001e-05,1.428621e-05,1.4351710000000001e-05,1.4398040000000001e-05,1.4431839999999999e-05,1.4565735849056603e-05,1.4566000000000001e-05,1.456843e-05,1.458384e-05,1.4603149999999999e-05,1.4672839999999999e-05,1.4717720000000001e-05,1.4956559999999999e-05,1.497946e-05,1.511166e-05],"480":[7.4120900000000007e-06,7.4870000000000005e-06,7.5209699999999992e-06,7.5633199999999998e-06,7.5943299999999998e-06,7.5958700000000008e-06,7.6346400000000008e-06,7.6425000000000001e-06,7.6876200000000004e-06,7.6940000000000012e-06,7.7183099999999993e-06,7.7298600000000009e-06,7.75835e-06,7.7614899999999994e-06,7.7787099999999996e-06,7.8795714285714279e-06,7.9575499999999997e-06,8.1298999999999999e-06,8.4402000000000009e-06,8.5334099999999993e-06],"1441792":[0.059151663,0.059845527500000009,0.06371325899999998,0.066159561000000006,0.067710029999999977,0.068167560499999974,0.068319749500000027,0.068601561000000033,0.068872519000000049,0.068885468000000019,0.06889466750000002,0.070376857500000001,0.070409174000000033,0.07060551050000001,0.071069263999999965,0.071125325000000003,0.071739094500000031,0.072398819999999975,0.07353130300000002,0.078478830999999999],"992":[1.5506875000000001e-05,1.5701499999999999e-05,1.5740333333333332e-05,1.5741533333333335e-05,1.5766749999999999e-05,1.5890719999999998e-05,1.6096699999999998e-05,1.613363e-05,1.616434e-05,1.6300369999999999e-05,1.6405230000000002e-05,1.6414429999999999e-05,1.648162e-05,1.6499700000000001e-05,1.6534109999999999e-05,1.6700479999999999e-05,1.6747000000000001e-05,1.723355e-05,1.7353830000000002e-05,1.8709700000000001e-05],"3968":[6.8020390000000003e-05,6.8072829999999999e-05,6.8113000000000003e-05,6.8182111111111108e-05,6.8784769999999997e-05,6.9155470000000003e-05,6.9371900000000006e-05,6.9377340000000007e-05,6.945295238095238e-05,6.9553269999999995e-05,6.9582095238095228e-05,6.9873519999999996e-05,7.0324414634146339e-05,7.0355359999999998e-05,7.047721951219512e-05,7.0743575000000003e-05,7.0813289999999994e-05,7.0951039999999995e-05,7.1165459459459452e-05,7.3479199999999993e-05],"6400":[0.000101284,0.00010362199999999996,0.000103673875,0.00010407171590909089,0.0001041328,0.00010441715189873416,0.00010570957142857144,0.00010594533333333332,0.00010595616666666665,0.00010614285714285713,0.0001065818,0.00010716295238095241,0.00010813241176470586,0.00010837245121951226,0.000108619,0.000109419,0.00010982168235294122,0.00010983056470588235,0.00011000005405405402,0.00011018409999999994],"1344":[2.2561999999999998e-05,2.2693176470588235e-05,2.303593e-05,2.3293580000000002e-05,2.3298009999999997e-05,2.3512649999999999e-05,2.3550399999999997e-05,2.3590239999999999e-05,2.3771750000000002e-05,2.3808240000000003e-05,2.3833600000000002e-05,2.3867649999999998e-05,2.3895169999999999e-05,2.3907009999999997e-05,2.3949319999999999e-05,2.4149950000000001e-05,2.4174190000000002e-05,2.4529719999999998e-05,2.4578749999999999e-05,2.4648550000000003e-05],"126976":[0.0025506649999999993,0.0025606653333333329,0.0025739260000000007,0.0025767443333333329,0.0025784366666666671,0.0025855373333333329,0.0025885866666666667,0.0025962216666666664,0.0026076290000000002,0.0026169083333333334,0.0026185790000000002,0.0026228413333333348,0.0026738623333333331,0.0027074530000000007,0.0030861529999999999,0.0031319240000000003,0.0031524785,0.0033055420000000003,0.0033229914999999993,0.0033602750000000002],"2883584":[0.15637544749999999,0.15913940799999998,0.15975499900000001,0.16145959300000001,0.16160022800000001,0.16182123100000001,0.162224913,0.1622263055,0.16372671950000001,0.1637752485,0.164002067,0.1640256715,0.16410382800000001,0.16420391049999999,0.16426016299999999,0.16464915550000001,0.16536669649999999,0.167829907,0.16897929449999999,0.169254768],"753664":[0.023403381500000001,0.023469367999999997,0.023898046999999999,0.024053896000000002,0.024241681499999994,0.024338666499999998,0.024744752999999991,0.0248162125,0.024892368999999998,0.025120898499999999,0.025318828500000001,0.025702220500000001,0.026052292499999984,0.026385817999999998,0.027932237500000002,0.029249516499999996,0.029260973000000006,0.0294758995,0.029518967,0.0298583995],"16384":[0.00028142400000000001,0.00028273699999999992,0.00029558760000000008,0.00029763275000000013,0.00029883900000000002,0.00030023799999999998,0.00030077183870967736,0.00030140336666666676,0.00030162784615384453,0.00030294690624999991,0.0003036009375,0.00030384466666666664,0.00030389209999999998,0.0003039764375,0.00030724731250000002,0.00030776006451612901,0.00030843074999999998,0.00030868900000000012,0.00031060933333333331,0.0003145151],"131072":[0.0026044639999999999,0.0026454353333333338,0.002662584,0.0026768635,0.0026802613333333329,0.002682024666666667,0.002692872333333333,0.0027029150000000002,0.0027192430000000001,0.0027285536666666653,0.0027477309999999998,0.0027502646666666677,0.0030873809999999993,0.0032462704999999996,0.003283471,0.0032898609999999994,0.0032958485000000011,0.0033490270000000001,0.0034734759999999988,0.003478688499999999],"458752":[0.011272850000000001,0.0113886775,0.011567473999999998,0.011594415,0.0116102055,0.011620341000000001,0.011677953,0.0117884735,0.011958961000000001,0.013172875000000001,0.0133541145,0.0133879915,0.0135185845,0.0136289025,0.01387365,0.016170009000000003,0.016388626,0.017102255,0.017824264999999999,0.018008843],"172032":[0.0038597584999999998,0.0038620715000000005,0.0038628284999999993,0.003867594000000002,0.0038959955000000004,0.0038984474999999999,0.0039077865000000014,0.0039403814999999986,0.0039406284999999996,0.0039649815,0.0039695655000000002,0.0039881599999999993,0.0040491829999999996,0.0043635324999999996,0.0044798625,0.0044975940000000023,0.0046164264999999996,0.0046521675000000002,0.0047009425000000002,0.0048941099999999993],"12288":[0.00024738199999999998,0.00024759433333333334,0.00025124749999999991,0.000252754,0.000253384,0.0002550827500000001,0.00025574042857142858,0.00025710799999999998,0.00025821400000000005,0.00025931050000000002,0.00026032972,0.00026195872972972973,0.00026250699999999999,0.00026570048571428575,0.0002661087,0.00026676235483870961,0.00026685520000000005,0.00026734399999999998,0.00026969799999999991,0.00027023367647058824],"14680064":[1.1802537584999999,1.1878669035,1.1909722170000001,1.1925768269999999,1.1936065949999999,1.1947187690000001,1.1957063050000001,1.1983252865,1.2027085829999999,1.2031715105,1.204031335,1.2055644700000001,1.207094592,1.214852702,1.2201792304999999,1.2300470484999999,1.2338609199999999,1.233874095,1.2345002190000001,1.2569092369999999],"1536":[2.6421999999999999e-05,2.7311e-05,2.7583673469387754e-05,2.7826550000000002e-05,2.7923162162162164e-05,2.8028e-05,2.8051270270270271e-05,2.8275840000000001e-05,2.8312875e-05,2.8407106382978725e-05,2.8424159999999999e-05,2.8430000000000001e-05,2.8437579999999999e-05,2.8516750000000001e-05,2.8534499999999999e-05,2.8594720000000001e-05,2.8620999999999999e-05,2.8691e-05,2.9039640000000002e-05,2.9246519999999997e-05],"25600":[0.00042688366666666661,0.00042949400000000015,0.00043333,0.00043397500000000018,0.00043508000000000002,0.00043516000000000014,0.00043788763636363635,0.0004386569090909091,0.00043893600000000001,0.00044047500000000018,0.00044207399999999977,0.00044307300000000015,0.00044356777272727265,0.000443879,0.00045493038095238111,0.00045538466666666667,0.00045576242857142842,0.00045661205000000003,0.00045954550000000001,0.00046659957142857156],"1835008":[0.087124836499999997,0.08825788150000001,0.089048595000000008,0.089057501000000025,0.089249476500000008,0.089386227499999998,0.089507006,0.090456165999999977,0.090715146999999996,0.090737993000000003,0.091338135999999986,0.09172640700000001,0.091941266000000008,0.092138749499999992,0.092275030500000035,0.092669986999999995,0.093039711500000011,0.093312202499999997,0.094672240500000032,0.096887828499999995],"10752":[0.00020383200000000001,0.00020566400000000007,0.000206694,0.0002113359999999999,0.0002123305,0.00021291800000000001,0.00021399099999999991,0.00021456687499999994,0.000214639,0.00021472918181818175,0.00021502899999999999,0.00021713200000000001,0.0002176832,0.00021840613636363635,0.00021996640909090906,0.00022048634999999989,0.00022177200000000002,0.00022216845238095246,0.00022508400000000002,0.00022571700000000001],"21504":[0.00042008349999999981,0.0004203059999999999,0.00042905899999999997,0.00042966599999999999,0.00043166766666666675,0.00043676754545454537,0.00043818566666666654,0.00043874849999999999,0.00043978347368421063,0.0004400683181818183,0.0004408446818181818,0.00044144799999999999,0.00044148399999999996,0.00044371540909090917,0.0004442463333333334,0.00044715686363636358,0.00044887919047619049,0.00044893299999999999,0.000452418,0.00048235799999999984],"7602176":[0.44599759,0.44745572499999997,0.4501724775,0.4507274845,0.45229441650000002,0.45266429349999998,0.45280938700000001,0.45494536549999998,0.45625451150000002,0.45708647400000002,0.45847154200000001,0.4604644115,0.46325017099999999,0.46372884999999997,0.463728947,0.46424711549999997,0.46439722300000003,0.47019559,0.473563438,0.50372947999999995],"5632":[0.000109953,0.000110883,0.000111629,0.00011165955555555559,0.00011195821176470588,0.00011261663529411765,0.000113142,0.00011355261538461546,0.00011358060000000001,0.00011429587500000004,0.00011498,0.00011544170588235294,0.00011547089024390247,0.00011596881395348838,0.00011681390909090914,0.0001168933875,0.000118885,0.00012316534285714285,0.00012368900000000001,0.00012416799999999997],"10":[3.4409999999999996e-07,3.4975999999999998e-07,3.5422e-07,3.5529e-07,3.5606999999999998e-07,3.5670000000000001e-07,3.5750000000000002e-07,3.5824999999999997e-07,3.5862999999999998e-07,3.6140000000000005e-07,3.6257999999999996e-07,3.6365999999999996e-07,3.6528e-07,3.6627000000000001e-07,3.6727000000000003e-07,3.6952999999999995e-07,3.7036000000000004e-07,3.7124999999999999e-07,3.7320000000000003e-07,3.7469999999999999e-07],"3145728":[0.1832373045,0.18400813900000001,0.184190669,0.18502867150000002,0.18550676899999999,0.18560304550000001,0.18565136900000001,0.1872916355,0.18751143200000001,0.18764567700000001,0.18771629649999999,0.18809033850000001,0.18816035850000001,0.18906259850000001,0.189558738,0.18972396399999999,0.18984912700000001,0.18986801449999999,0.194663316,0.1949252105],"245760":[0.0050579990000000023,0.0051845270000000013,0.005188209,0.0052115360000000001,0.0052391090000000013,0.0052573609999999977,0.0052706069999999975,0.0052782259999999987,0.0052921740000000011,0.0053164869999999999,0.0053300739999999997,0.0053468760000000004,0.0053557830000000011,0.005358275,0.0053594269999999982,0.005396770999999999,0.0054846309999999985,0.0054987080000000006,0.005501728,0.0058385369999999995],"1728":[2.6971e-05,2.7488669999999998e-05,2.7857950000000003e-05,2.7862510638297873e-05,2.7875750000000002e-05,2.795002e-05,2.8019999999999999e-05,2.8058010000000002e-05,2.8081897959183672e-05,2.8136699999999998e-05,2.8227049999999999e-05,2.838635e-05,2.8508240000000002e-05,2.8555e-05,2.8802210000000001e-05,2.8817640000000003e-05,2.8913650000000001e-05,2.8915176470588237e-05,2.8966416666666664e-05,2.897738e-05],"11":[3.6096999999999998e-07,3.6130000000000004e-07,3.6192e-07,3.6291000000000001e-07,3.6419999999999999e-07,3.6654e-07,3.6915999999999995e-07,3.7015999999999997e-07,3.7149e-07,3.7719999999999996e-07,3.7827999999999997e-07,3.8074000000000001e-07,3.8077999999999995e-07,3.8347999999999999e-07,3.8417000000000003e-07,3.8667000000000001e-07,3.8674000000000003e-07,3.904e-07,3.9663999999999998e-07,4.0291e-07],"1114112":[0.040220772000000002,0.041156446999999999,0.046094868000000011,0.048197495,0.048236895500000002,0.048800213999999988,0.049169345999999989,0.0491760605,0.0492589545,0.049365345999999997,0.049528890000000013,0.049979894500000004,0.050159926000000001,0.050657240000000013,0.050942439500000013,0.051080446999999987,0.051224212999999998,0.0513347605,0.051463755999999992,0.051547204500000013],"12":[3.7808000000000001e-07,3.7836000000000001e-07,3.8055e-07,3.8321999999999996e-07,3.8505999999999998e-07,3.8555000000000001e-07,3.8785000000000002e-07,3.8811e-07,3.8846000000000003e-07,3.9108999999999999e-07,3.9116000000000002e-07,3.9126999999999998e-07,3.9643000000000001e-07,4.0056999999999999e-07,4.0070000000000003e-07,4.0439999999999999e-07,4.0868999999999999e-07,4.0969000000000001e-07,4.1816000000000003e-07,4.3575999999999998e-07],"7340032":[0.42838024600000002,0.42991548750000003,0.43066624949999999,0.43630072749999999,0.43751841000000002,0.43897197900000001,0.43948229449999998,0.43957664549999997,0.43958177500000001,0.439852403,0.44052345749999999,0.44086421749999999,0.44130565150000001,0.44157930099999998,0.44241995700000003,0.442758859,0.44829432299999999,0.44888821000000001,0.44991030900000001,0.45029980450000001],"7168":[0.000114986,0.00011552979999999999,0.000117229375,0.00011832113333333331,0.00011922009999999999,0.00012003799999999996,0.000121795,0.00012222847297297296,0.00012354555844155843,0.000123571,0.00012369249999999999,0.00012378399999999999,0.00012540400000000002,0.000125406,0.00012557900000000001,0.00012625779452054794,0.00012688820000000001,0.00012694250000000001,0.00012734231168831165,0.000140500492063492],"13":[3.8312999999999996e-07,3.8752999999999998e-07,3.9023999999999998e-07,3.9542999999999999e-07,3.9550000000000001e-07,3.9593999999999998e-07,3.9727000000000001e-07,3.9962999999999999e-07,4.0441999999999996e-07,4.0863999999999999e-07,4.1274999999999999e-07,4.1465999999999998e-07,4.1589e-07,4.1591000000000002e-07,4.1603e-07,4.2120000000000004e-07,4.2889999999999998e-07,4.3000999999999997e-07,4.3405e-07,4.3421999999999998e-07],"6029312":[0.3792921595,0.3825174965,0.38272323650000001,0.38438509700000001,0.38468161950000002,0.384966376,0.3854793695,0.38737755950000002,0.38840802400000002,0.3888602545,0.388867248,0.39052163950000002,0.39138843499999998,0.39235293399999999,0.39239672749999999,0.392882122,0.39351172000000001,0.39366099999999998,0.39542975850000001,0.400137458],"14":[3.9799000000000003e-07,3.9895999999999997e-07,3.9974e-07,4.0684000000000001e-07,4.0862000000000002e-07,4.0985999999999999e-07,4.0988999999999997e-07,4.1405000000000003e-07,4.1626e-07,4.2240624999999998e-07,4.2280999999999996e-07,4.2628999999999999e-07,4.2753000000000002e-07,4.2775000000000006e-07,4.2959000000000002e-07,4.3180000000000004e-07,4.3354e-07,4.3612999999999998e-07,4.5062000000000005e-07,4.5682758620689651e-07],"3200":[5.1712500000000003e-05,5.2042000000000001e-05,5.215e-05,5.2370500000000003e-05,5.2449133333333332e-05,5.2795416666666663e-05,5.3453179999999997e-05,5.3561670000000004e-05,5.3626292682926829e-05,5.3645089999999998e-05,5.3851809999999999e-05,5.3863265060240964e-05,5.4087765432098766e-05,5.4481089743589739e-05,5.4540999999999998e-05,5.45605e-05,5.4717666666666666e-05,5.5013329999999999e-05,5.5325475000000002e-05,5.832373015873016e-05],"20":[4.9086999999999995e-07,4.9212000000000004e-07,4.9268000000000004e-07,4.9317000000000001e-07,4.946e-07,4.9460999999999995e-07,4.9668000000000002e-07,4.9802000000000006e-07,5.0105000000000006e-07,5.0511e-07,5.1058999999999997e-07,5.1193999999999996e-07,5.1245999999999992e-07,5.1456000000000008e-07,5.1570999999999995e-07,5.2215000000000005e-07,5.2226999999999998e-07,5.2303999999999995e-07,5.2735999999999998e-07,5.3249999999999998e-07],"204800":[0.0041384129999999979,0.0041412464999999749,0.004142298,0.0041496884999999983,0.00416534,0.0041824585000000015,0.0041842335000000013,0.0042264145000000027,0.0042324490000000027,0.0042512755000000003,0.0042761259999999999,0.0042772914999999996,0.0042825499999999996,0.0043013040000000015,0.0043166725000000003,0.004318256500000001,0.0043287955000000031,0.0043301069999999997,0.0043818655000000001,0.0047957330000000017],"15":[4.1637000000000002e-07,4.1869e-07,4.2023e-07,4.2361999999999998e-07,4.2460999999999999e-07,4.2824000000000003e-07,4.3775000000000001e-07,4.3961e-07,4.4107999999999998e-07,4.4181000000000001e-07,4.4258000000000004e-07,4.4311000000000005e-07,4.4558999999999996e-07,4.4811000000000001e-07,4.4833000000000004e-07,4.5721e-07,4.5943999999999999e-07,4.6279999999999999e-07,4.6737999999999999e-07,4.8875999999999994e-07],"13312":[0.00021467599999999996,0.00021909571428571422,0.000221726,0.00022350349999999999,0.00022406150000000004,0.00022434713636363632,0.000224575,0.00022482816666666668,0.00022505099999999998,0.00022556475,0.00022737873170731708,0.00022753630952380939,0.00022771672499999999,0.00022881166666666666,0.00022906060465116275,0.00023389144999999998,0.00023394116216216213,0.00023486576315789469,0.00023697591428571428,0.00024085879999999988],"4980736":[0.29075209199999996,0.29158326700000003,0.2928503965,0.29286263499999998,0.29314055300000003,0.29463353749999999,0.29465618500000001,0.29517587950000002,0.29520484250000001,0.29551003399999998,0.2961048295,0.29630461749999998,0.296577861,0.29734724800000001,0.29805024499999999,0.2982118695,0.30019843499999999,0.30215517749999998,0.30257414250000003,0.30571863199999999],"118784":[0.0023018379999999988,0.0023198719999999989,0.002324642,0.002329107,0.0023340699999999984,0.0023581435000000002,0.0023994606666666671,0.0024087500000000007,0.0024236673333333332,0.0025460616666666664,0.0028943659999999989,0.0029423410000000002,0.0029436560000000002,0.0029884303333333325,0.0029943180000000002,0.0029959473333333328,0.0030307963333333328,0.0030853173333333333,0.0031945673333333329,0.0032274514999999998],"51200":[0.00091500200000000005,0.00091802599999999995,0.00091862400000000037,0.00093073839999999945,0.00093311499999999999,0.00094001160000000002,0.0009427140999999997,0.00094390800000000003,0.00094775490000000018,0.0009517245999999997,0.00096729333333333352,0.00096841600000000005,0.00097316800000000028,0.0010069385555555557,0.0010231630000000001,0.0011799880000000001,0.0011900771428571429,0.0012337627142857141,0.0012470817142857141,0.001283871],"16":[4.2436999999999998e-07,4.2842000000000002e-07,4.3338999999999999e-07,4.3721999999999999e-07,4.3739999999999999e-07,4.3807999999999996e-07,4.3933e-07,4.4115e-07,4.4576999999999995e-07,4.5101000000000001e-07,4.5432999999999997e-07,4.5476999999999999e-07,4.5495999999999999e-07,4.5543e-07,4.5831999999999999e-07,4.5998000000000002e-07,4.6103000000000005e-07,4.7203000000000003e-07,4.7313e-07,4.8130000000000005e-07],"21":[5.0373999999999998e-07,5.0475000000000002e-07,5.0719000000000003e-07,5.0740999999999996e-07,5.0807000000000008e-07,5.1188999999999996e-07,5.1485999999999999e-07,5.1923000000000002e-07,5.2305999999999997e-07,5.2740000000000002e-07,5.2750999999999999e-07,5.2797999999999994e-07,5.3022000000000005e-07,5.3519999999999997e-07,5.3926000000000003e-07,5.4258999999999994e-07,5.4393749999999997e-07,5.4649999999999998e-07,5.4756999999999997e-07,5.5649000000000003e-07],"917504":[0.030147339500000002,0.030749521000000002,0.033615092499999999,0.038063576000000002,0.038189676500000012,0.038406069000000001,0.038440101000000004,0.038698303999999996,0.039030976999999988,0.03912400650000001,0.039236205499999996,0.039260071000000007,0.039515191999999998,0.039894154500000001,0.0399593845,0.040514288999999974,0.040783139999999996,0.040788572000000002,0.0409630125,0.041794268500000002],"22":[5.2155000000000001e-07,5.2194999999999993e-07,5.2638999999999999e-07,5.2659999999999996e-07,5.2682999999999996e-07,5.2886999999999994e-07,5.3005000000000001e-07,5.3684999999999999e-07,5.3727000000000005e-07,5.4051000000000001e-07,5.4175000000000004e-07,5.4186999999999997e-07,5.4700999999999997e-07,5.5506000000000005e-07,5.5547000000000004e-07,5.5606999999999998e-07,5.5710999999999999e-07,5.7718000000000004e-07,5.9846999999999998e-07,6.1395000000000007e-07],"4864":[8.5348999999999999e-05,8.8216333333333331e-05,8.9587291666666657e-05,8.9784571428571432e-05,9.0009240000000002e-05,9.0011111111111119e-05,9.0260000000000007e-05,9.0604724137931044e-05,9.0624030000000007e-05,9.0834285714285718e-05,9.0978999999999997e-05,9.1012999999999991e-05,9.1060637362637358e-05,9.1136125000000005e-05,9.1149360000000002e-05,9.1493499999999994e-05,9.171342857142857e-05,9.1786755813953489e-05,9.1819999999999998e-05,9.2393833333333336e-05],"17":[4.4533000000000003e-07,4.4824000000000005e-07,4.4955e-07,4.4986999999999999e-07,4.5061000000000004e-07,4.5089000000000004e-07,4.5145000000000004e-07,4.5163000000000003e-07,4.5241000000000001e-07,4.5588999999999999e-07,4.5643999999999998e-07,4.6230999999999996e-07,4.6484999999999998e-07,4.6687999999999996e-07,4.7119000000000003e-07,4.7240999999999998e-07,4.7764000000000003e-07,4.8281999999999998e-07,4.8592e-07,4.8769000000000005e-07],"14848":[0.00024959550000000009,0.00025363400000000009,0.0002574125,0.00025898650000000012,0.00025922249999999999,0.00026022416666666672,0.000260976,0.00026183127027027032,0.00026259334285714278,0.00026319400000000001,0.00026462233333333327,0.00026464942857142856,0.00026575661764705885,0.00026875813888888896,0.00027006108571428565,0.00027208820588235292,0.00027297313888888892,0.00027625300000000001,0.00028299131428571428,0.00029788675000000001],"23":[5.2772000000000007e-07,5.3020000000000002e-07,5.3048000000000002e-07,5.3272000000000002e-07,5.3552000000000002e-07,5.3588999999999996e-07,5.3674000000000003e-07,5.4494000000000001e-07,5.4868999999999997e-07,5.5118999999999995e-07,5.5227999999999997e-07,5.5313999999999999e-07,5.5364000000000003e-07,5.5420000000000003e-07,5.7245000000000002e-07,5.7288999999999999e-07,5.7481000000000005e-07,5.8023000000000005e-07,5.9848000000000005e-07,6.281700000000001e-07],"786432":[0.024764762999999999,0.024856778,0.024938160500000001,0.025209844000000002,0.025315898,0.025412961000000001,0.025441025499999992,0.025479688,0.025791716999999992,0.026777925500000004,0.027310241000000002,0.027652068500000009,0.027690832500000002,0.027791296500000017,0.029999286,0.030470445000000002,0.030569328,0.031781760499999985,0.033947742500000024,0.035476575500000024],"18":[4.5442999999999997e-07,4.5516000000000001e-07,4.5845999999999999e-07,4.6483000000000001e-07,4.6516000000000002e-07,4.6645e-07,4.6785e-07,4.7272999999999997e-07,4.7912000000000002e-07,4.7940000000000002e-07,4.8133000000000004e-07,4.8483999999999994e-07,4.8578000000000005e-07,4.8663999999999997e-07,4.8907999999999998e-07,4.895714285714286e-07,4.9187000000000002e-07,4.9561999999999999e-07,4.9913999999999996e-07,5.0404000000000001e-07],"1638400":[0.076949192499999958,0.077252040499999994,0.07726697400000003,0.077400502499999996,0.077862731000000004,0.077877129000000003,0.077952611000000005,0.077981823999999964,0.078111851499999996,0.078246290000000024,0.078284869000000007,0.078684919500000006,0.078832975,0.079079378999999977,0.079229466999999998,0.079465819500000021,0.079478494499999996,0.080500039500000023,0.081588089499999975,0.083379613500000033],"7864320":[0.46968886399999998,0.47159490850000002,0.47521714949999999,0.47568065749999999,0.477497595,0.47889101350000002,0.47950501200000001,0.47952022999999999,0.48113238149999998,0.48272278899999999,0.4842553335,0.48480000099999998,0.4850927545,0.48510687000000002,0.48510918450000001,0.48765200050000002,0.48887863250000002,0.50032153299999993,0.51449671100000005,0.58651119350000003],"24":[5.4522000000000001e-07,5.4769999999999996e-07,5.5189999999999996e-07,5.5232999999999997e-07,5.5397000000000003e-07,5.5634000000000002e-07,5.5746000000000002e-07,5.5859999999999993e-07,5.6184999999999997e-07,5.6209999999999998e-07,5.6230999999999996e-07,5.6726999999999997e-07,5.7566999999999997e-07,5.7831e-07,5.8515151515151515e-07,5.8790999999999998e-07,5.8895999999999995e-07,5.8924000000000005e-07,5.9125000000000006e-07,6.1287999999999997e-07],"14155776":[1.098372618,1.1049997334999999,1.1508784890000001,1.152952014,1.158971553,1.1609562090000001,1.1627591719999999,1.171203553,1.1714313505,1.1714852245,1.1743879294999999,1.1777367175,1.1782554315,1.1797976345000001,1.1846908199999999,1.187271647,1.1886594395000001,1.189432338,1.1897006729999999,1.3052907300000001],"19":[4.7077999999999998e-07,4.7596000000000003e-07,4.7908000000000008e-07,4.7971e-07,4.7971999999999996e-07,4.815357142857143e-07,4.8286000000000002e-07,4.8426000000000002e-07,4.8680000000000004e-07,4.9093999999999997e-07,4.9210999999999998e-07,4.9376999999999995e-07,4.9633999999999996e-07,4.9676999999999997e-07,5.0021000000000006e-07,5.0595e-07,5.0702999999999995e-07,5.1069999999999993e-07,5.1277000000000001e-07,5.3331e-07],"30":[5.7978999999999998e-07,5.8871999999999999e-07,5.9174999999999999e-07,5.9340000000000001e-07,5.9841999999999998e-07,6.0129000000000001e-07,6.0350999999999998e-07,6.0661e-07,6.0712999999999996e-07,6.0735e-07,6.0918000000000001e-07,6.1475000000000002e-07,6.1508999999999998e-07,6.241699999999999e-07,6.2969999999999998e-07,6.3748999999999997e-07,6.4296999999999994e-07,6.4578e-07,6.5305000000000004e-07,6.5960999999999996e-07],"25":[5.1010999999999995e-07,5.1129999999999998e-07,5.1277000000000001e-07,5.1513999999999999e-07,5.1610000000000002e-07,5.2275999999999995e-07,5.2429000000000004e-07,5.2776999999999997e-07,5.3139000000000005e-07,5.3386000000000004e-07,5.3439000000000006e-07,5.3539999999999999e-07,5.3588e-07,5.3597000000000005e-07,5.3802999999999995e-07,5.4487999999999994e-07,5.5121000000000008e-07,5.6627999999999996e-07,5.7580000000000006e-07,5.7880999999999993e-07],"31":[5.9139e-07,5.9276999999999998e-07,5.9531999999999996e-07,6.0800000000000004e-07,6.1209000000000008e-07,6.1301000000000006e-07,6.1414000000000002e-07,6.1707999999999996e-07,6.1829999999999997e-07,6.2681000000000004e-07,6.2883e-07,6.2997999999999998e-07,6.3012999999999999e-07,6.3676000000000005e-07,6.4491000000000002e-07,6.4777000000000009e-07,6.5051000000000002e-07,6.5134000000000006e-07,6.5652000000000001e-07,6.6194999999999997e-07],"1280":[2.1123000000000001e-05,2.1464500000000001e-05,2.1627000000000001e-05,2.1657289999999999e-05,2.1879080000000001e-05,2.2003220000000001e-05,2.2013490000000001e-05,2.202873e-05,2.2071374999999998e-05,2.2110517241379312e-05,2.2121999999999999e-05,2.2157819999999998e-05,2.2183400000000002e-05,2.2280999999999999e-05,2.239057e-05,2.2537989999999999e-05,2.2590947368421052e-05,2.2751999999999998e-05,2.3092689999999999e-05,2.3180059999999999e-05],"26":[5.2867000000000003e-07,5.2913999999999999e-07,5.3245999999999994e-07,5.3295999999999998e-07,5.3628999999999999e-07,5.3796999999999999e-07,5.3921999999999998e-07,5.3956000000000005e-07,5.4285999999999998e-07,5.4747000000000007e-07,5.4898000000000004e-07,5.4980999999999997e-07,5.5145999999999999e-07,5.5170000000000005e-07,5.5242999999999998e-07,5.5576999999999995e-07,5.5698e-07,5.6998000000000003e-07,5.7372000000000003e-07,5.7968000000000001e-07],"3932160":[0.20621137249999999,0.21081332799999999,0.213106515,0.21349491849999999,0.21412602400000003,0.21439543849999998,0.21536712899999999,0.21570153950000001,0.21573419199999999,0.21605645749999999,0.2162202305,0.2162821935,0.21665387750000001,0.21671286649999999,0.216944004,0.217086474,0.217231854,0.21848607049999999,0.21865545250000001,0.2313935775],"2432":[4.0819999999999999e-05,4.1878000000000001e-05,4.2308729999999999e-05,4.2567630000000004e-05,4.260709e-05,4.2799000000000001e-05,4.2959807692307689e-05,4.3041000000000003e-05,4.3092e-05,4.3195380000000002e-05,4.3318449999999999e-05,4.3377230769230766e-05,4.3694550000000003e-05,4.3757272727272726e-05,4.408564e-05,4.4328238095238098e-05,4.4521939999999994e-05,4.5332823529411764e-05,4.8208499999999998e-05,4.8929869999999998e-05],"32":[6.0585999999999995e-07,6.0909000000000006e-07,6.1055000000000002e-07,6.1098000000000004e-07,6.1142999999999996e-07,6.1478e-07,6.2044000000000007e-07,6.2127999999999996e-07,6.2639999999999994e-07,6.3018e-07,6.3748000000000001e-07,6.3888999999999997e-07,6.3987999999999998e-07,6.4275000000000001e-07,6.4595000000000004e-07,6.5134000000000006e-07,6.5911999999999999e-07,6.5980000000000002e-07,6.6825000000000002e-07,6.7324999999999997e-07],"27":[5.3937999999999995e-07,5.4705999999999998e-07,5.4833999999999995e-07,5.5143000000000001e-07,5.5198000000000005e-07,5.5229000000000003e-07,5.5504999999999998e-07,5.5713000000000001e-07,5.6456999999999998e-07,5.6465000000000007e-07,5.7438000000000004e-07,5.7497999999999998e-07,5.7617e-07,5.7633999999999993e-07,5.7825000000000003e-07,5.8698000000000003e-07,5.9136999999999998e-07,5.9207999999999999e-07,5.9799999999999993e-07,6.0032999999999998e-07],"409600":[0.0094793529999999994,0.0095934880000000007,0.009728760999999999,0.0098520410000000024,0.0099227959999999959,0.010230880500000001,0.010372002,0.010818433000000001,0.010959078000000001,0.0111966735,0.011364658999999999,0.0117120895,0.011774715,0.011792687499999999,0.011819913500000001,0.015035261499999999,0.015467043,0.015909933000000001,0.01604909899999999,0.016998245000000006]}},{"title":"OrderedDictionary subscript, append, reserving capacity","results":{"28":[1.7781800000000001e-06,1.8624000000000002e-06],"34":[2.10194e-06,2.3249200000000001e-06],"29":[1.9070900000000001e-06,1.9188600000000001e-06],"40":[2.4482300000000001e-06,2.6872099999999997e-06],"17408":[0.0010241579999999998,0.00109749175],"1472":[8.9411010000000002e-05,9.3434593023255827e-05],"112":[6.1155300000000006e-06,6.1966666666666669e-06],"1376256":[0.17242951049999999,0.245529],"5242880":[1.001895102,1.0162176114999999],"36":[2.3007299999999998e-06,2.3372900000000002e-06],"42":[2.5872599999999999e-06,2.6575600000000004e-06],"11534336":[2.401464893,2.4615744359999998],"114688":[0.007254941,0.0073465530000000005],"144":[7.938800000000001e-06,8.4095499999999998e-06],"38":[2.33687e-06,2.5123799999999997e-06],"240":[1.3742999999999999e-05,1.39868e-05],"9216":[0.00052044100000000007,0.00055645631249999993],"44":[2.7592346938775509e-06,2.8279899999999996e-06],"1664":[9.2825210000000008e-05,9.3610848484848482e-05],"196608":[0.016045999999999998,0.017327221],"155648":[0.010879265000000001,0.011523447499999999],"2816":[0.000168481,0.000169118],"50":[2.8996399999999996e-06,2.9389299999999999e-06],"2359296":[0.33850108700000003,0.38068756450000002],"46":[2.7962499999999997e-06,3.3422900000000003e-06],"176":[1.022554e-05,1.0755500000000001e-05],"52":[3.0514799999999998e-06,3.1030000000000002e-06],"272":[1.4883240000000001e-05,1.5930666666666666e-05],"116":[6.4534599999999999e-06,6.5164499999999992e-06],"47104":[0.0030536080000000002,0.0031247920000000004],"6912":[0.000362247,0.00039292599999999993],"1856":[0.000103397,0.00010552931182795701],"48":[3.0730800000000001e-06,3.1888904109589042e-06],"2097152":[0.29153161900000002,0.30499761950000004],"54":[3.14738e-06,3.1955999999999999e-06],"2031616":[0.263187214,0.28059634600000005],"43008":[0.0026137113333333335,0.0027935633333333342],"60":[3.5346500000000001e-06,3.5607199999999998e-06],"30720":[0.0017592270000000004,0.0018464199999999997],"56":[3.2283000000000001e-06,3.3181999999999998e-06],"62":[3.4532900000000002e-06,3.6548499999999998e-06],"58":[3.4077100000000003e-06,3.4868399999999996e-06],"3014656":[0.52878279400000006,0.56240339849999998],"64":[3.6400799999999995e-06,4.0691700000000004e-06],"8388608":[1.552642681,1.5711348969999999],"29696":[0.0016956103999999999,0.0016960240000000008],"216":[1.1333083333333333e-05,1.146663e-05],"106496":[0.0066328089999999991,0.0071665359999999985],"72":[4.0702499999999997e-06,4.2930199999999999e-06],"442368":[0.037440202000000006,0.058554565999999995],"147456":[0.010884483,0.010987984000000003],"4456448":[0.78223278149999997,0.79460624199999996],"63488":[0.0036561229999999994,0.0037662099999999999],"38912":[0.002283733,0.0023032670000000003],"68":[3.8791400000000001e-06,4.1617700000000001e-06],"188416":[0.014344592499999999,0.015820789999999998],"248":[1.382e-05,1.4094290000000001e-05],"80":[4.9177599999999995e-06,5.0004200000000001e-06],"2560":[0.00014331000000000001,0.00015574799999999999],"34816":[0.0019941640000000001,0.0020644127499999999],"3712":[0.00020455700000000001,0.000206486],"3538944":[0.56935192400000001,0.59869537650000004],"76":[4.3980699999999999e-06,4.6099100000000004e-06],"4194304":[0.71873115499999995,0.74312962599999999],"851968":[0.093676552999999996,0.1189224505],"4096":[0.00022766972093023256,0.00025262343243243252],"59392":[0.0034770789999999997,0.0035696285000000006],"84":[4.8913099999999999e-06,4.89642e-06],"3276800":[0.51615956650000006,0.52917404000000001],"55296":[0.003150866,0.0032982900000000002],"688128":[0.065471975000000002,0.086152548999999995],"8192":[0.00047612300000000001,0.00048257900000000002],"10240":[0.00061401200000000004,0.00063418242857142862],"15872":[0.00086625699999999983,0.00094242600000000001],"92":[5.8689900000000002e-06,5.9111299999999996e-06],"26624":[0.0014175220000000003,0.001533735],"1792":[0.00010002292307692308,0.00010208210526315789],"11776":[0.00074044399999999982,0.000772268],"2944":[0.0001808305,0.00018989900000000002],"88":[5.2234799999999995e-06,5.6984699999999993e-06],"22528":[0.0014186470000000003,0.0014971210000000003],"1245184":[0.14396727200000001,0.1887982265],"15728640":[2.9535872455000001,3.0263207319999998],"96":[5.6614999999999999e-06,5.7904699999999995e-06],"1984":[0.000110209,0.00011243766666666666],"139264":[0.0097703485000000014,0.010124979499999997],"475136":[0.0415140975,0.049126192999999985],"13631488":[2.4989084214999999,2.6047931520000001],"416":[2.3169879999999998e-05,2.3294500000000002e-05],"928":[5.0306500000000004e-05,5.2406000000000006e-05],"512":[2.8003559999999998e-05,2.9335270000000001e-05],"18432":[0.001094456625,0.0011192102499999999],"16777216":[3.2337886724999998],"9728":[0.00053613800000000002,0.00059658300000000003],"1769472":[0.23285484300000001,0.250606198],"1703936":[0.22378878000000002,0.23084173099999999],"2048":[0.000111211,0.00011376478571428572],"14336":[0.00077690600000000017,0.00081150600000000025],"448":[2.4369250000000001e-05,2.532749e-05],"5505024":[1.0774707594999999,1.1074987265],"544":[3.1421799999999998e-05,3.2938999999999998e-05],"221184":[0.016205801999999998,0.017389297500000001],"90112":[0.0061041529999999993,0.0061892579999999996],"640":[3.66055e-05,3.7815000000000003e-05],"12800":[0.000707444,0.00072350699999999986],"262144":[0.0205686655,0.021794989499999966],"589824":[0.053197349999999997,0.067502941499999997],"884736":[0.089060558000000012,0.11624232499999999],"6144":[0.00039426900000000004,0.000424468],"1088":[6.1015296296296293e-05,6.3424090000000001e-05],"576":[3.3012999999999997e-05,3.3720190476190473e-05],"160":[8.4453333333333337e-06,9.8963299999999991e-06],"672":[3.8976085106382981e-05,3.960735e-05],"8912896":[1.6699237550000001,1.7451768045],"100":[5.3542599999999995e-06,5.3813200000000002e-06],"507904":[0.045043865999999995,0.054177584499999987],"3840":[0.00022176349999999994,0.00022487486486486483],"192":[1.1348179999999999e-05,1.176142e-05],"376832":[0.0361388375,0.036461017999999998],"98304":[0.006770908,0.006888885],"5376":[0.00033057220689655176,0.00033363393103448275],"94208":[0.0064342969999999985,0.0067199909999999998],"81920":[0.0051240319999999989,0.0053994519999999973],"3407872":[0.54037325300000005,0.61338159950000004],"104":[5.5336299999999994e-06,5.83661e-06],"122880":[0.0077438999999999997,0.0083049059999999973],"200":[1.0753349999999999e-05,1.0994170000000002e-05],"163840":[0.012090587,0.012732581999999997],"4063232":[0.67701684900000003,0.68448555499999997],"5767168":[1.1696627235000001,1.183304162],"12582912":[2.8251210465000001,2.9073464250000001],"1600":[8.5047214285714282e-05,8.8150272727272733e-05],"136":[7.5323899999999994e-06,7.8076249999999996e-06],"232":[1.256232e-05,1.342489e-05],"7077888":[1.2513681114999999,1.326159737],"86016":[0.0054893299999999997,0.0059842949999999989],"31744":[0.0017708790000000002,0.001841376],"168":[9.140833333333334e-06,1.015817e-05],"622592":[0.058448682499999995,0.077070817],"108":[5.72858e-06,5.7698500000000003e-06],"327680":[0.028864372999999999,0.029178417000000002],"2176":[0.00012751900000000001,0.00012785199999999999],"3328":[0.00017944900000000004,0.00018905900000000005],"1":[3.2266000000000001e-07,3.4610000000000001e-07],"2":[3.4324e-07,3.4413e-07],"3":[3.6579000000000005e-07,3.6801000000000002e-07],"4":[3.6389000000000001e-07,3.6662999999999999e-07],"7424":[0.00041384778260869574,0.00043728914285714294],"5":[3.7246000000000004e-07,3.8337999999999998e-07],"23552":[0.001514919,0.0015676429999999999],"6":[3.9935000000000004e-07,4.0842e-07],"61440":[0.00359085,0.0039306984999999996],"491520":[0.045310886500000001,0.051700679000000006],"77824":[0.0048028390000000006,0.005201665999999998],"7":[3.9526000000000001e-07,4.2514000000000001e-07],"8":[4.2731000000000003e-07,4.5423999999999997e-07],"208":[1.1291870000000001e-05,1.1316160000000001e-05],"9":[4.4937000000000001e-07,4.6527999999999999e-07],"73728":[0.0044983245000000003,0.0047384000000000003],"304":[1.783392e-05,1.8002149999999998e-05],"400":[2.1320919999999999e-05,2.1849777777777778e-05],"1310720":[0.154498306,0.23361564600000001],"336":[1.995121e-05,2.046413253012048e-05],"3670016":[0.59314424200000004,0.60973254650000008],"6656":[0.000358494,0.00038198424],"15360":[0.00087597999999999984,0.00090286499999999955],"432":[2.2354999999999999e-05,2.3074e-05],"950272":[0.098452050000000041,0.14234569599999999],"655360":[0.060899182000000017,0.090414851500000018],"69632":[0.004191081000000001,0.0045882430000000005],"11264":[0.00070085799999999973,0.00072361346153846143],"2752512":[0.44409248000000001,0.4760786025],"8126464":[1.4866706995000001,1.504039774],"27648":[0.0015542500000000001,0.001565702],"368":[2.1083499999999999e-05,2.2645579999999997e-05],"65536":[0.0039409315000000006,0.0041622050000000004],"16252928":[3.1007848865000001],"464":[2.5455809999999998e-05,2.6129999999999999e-05],"1015808":[0.106505408,0.15964163799999997],"3072":[0.0001921475,0.0001950814347826087],"110592":[0.0068801499999999998,0.0069387769999999984],"237568":[0.017369614999999998,0.020540628999999998],"278528":[0.021370561999999999,0.028865094000000001],"496":[2.6888985294117648e-05,2.9391740000000001e-05],"13107200":[2.3892479309999999,2.4511459095000001],"9961472":[1.9253252335,1.95174772],"5888":[0.00036819400000000002,0.00039953500000000002],"11010048":[2.2318705255000002,2.2457620390000002],"1920":[0.000103293,0.00010445060000000002],"2490368":[0.37914111350000002,0.4240976615],"19456":[0.0011254429999999998,0.001226481],"57344":[0.0034137585,0.0036079044999999992],"1179648":[0.13331666200000003,0.1910882965],"4718592":[0.8626892155,0.88067083099999999],"360448":[0.031589334500000003,0.032330960499999992],"1572864":[0.21678851199999999,0.25504752399999997],"53248":[0.0030866220000000007,0.0032197989999999998],"3456":[0.00018727292452830189,0.000194983],"40960":[0.00246988625,0.0025245700000000003],"4608":[0.00027223999999999998,0.000286846],"13824":[0.00077524763636363655,0.00081658341666666673],"819200":[0.078231002999999993,0.11608194249999999],"983040":[0.101140062,0.14507834550000001],"8704":[0.00050199100000000003,0.00051533200000000007],"120":[6.5826000000000003e-06,6.6762099999999996e-06],"1024":[5.4543000000000003e-05,5.7794117647058825e-05],"49152":[0.003130776,0.0032911629999999997],"524288":[0.046748442000000008,0.057485523500000003],"45056":[0.0028714049999999996,0.0028746146666666673],"229376":[0.017500317999999997,0.018659500999999998],"2688":[0.000152268,0.00019534788888888888],"152":[8.78682e-06,8.9667100000000008e-06],"5120":[0.00030208703125000002,0.00031571400000000003],"1507328":[0.1984646145,0.29612818200000002],"1216":[7.0810999999999997e-05,7.8870120000000004e-05],"1966080":[0.27509735999999996,0.285106419],"1900544":[0.25314827150000002,0.26025997000000001],"184":[1.0302740000000002e-05,1.113198e-05],"7936":[0.00044323099999999993,0.00045312759999999999],"3801088":[0.61399062999999998,0.61852172549999995],"6815744":[1.1885322125,1.274676184],"124":[6.99138e-06,7.1830500000000006e-06],"102400":[0.0065161919999999996,0.0065365130000000025],"311296":[0.028294757,0.029462223999999999],"1408":[8.6021230769230773e-05,8.9093999999999998e-05],"393216":[0.036892431000000003,0.039319236],"4352":[0.00024448299999999998,0.00026669600000000002],"6553600":[1.152033672,1.2177392390000001],"20480":[0.0012546579999999999,0.001263854],"608":[3.5570400000000001e-05,3.7747000000000003e-05],"2228224":[0.32182120349999999,0.32817649100000001],"36864":[0.0021153110000000004,0.0022031640000000001],"704":[4.0662368421052629e-05,4.3328560000000001e-05],"720896":[0.072195665000000006,0.10282464299999999],"800":[4.0562000000000002e-05,4.422416e-05],"2621440":[0.40423349200000003,0.42725496600000001],"425984":[0.0357957645,0.041470145999999999],"32768":[0.0018604820000000001,0.0019587557999999998],"12058624":[2.6088914340000002,2.6802458895000001],"128":[6.98598e-06,7.3450200000000005e-06],"180224":[0.0132426465,0.015102451999999999],"224":[1.1895e-05,1.2198370000000001e-05],"736":[4.4624499999999999e-05,4.8015659999999999e-05],"320":[1.8495729999999999e-05,2.1041110000000002e-05],"557056":[0.049612589999999998,0.058383885999999996],"832":[4.5191799999999996e-05,4.5428310000000001e-05],"9437184":[1.8426622080000001,1.9064976634999999],"3584":[0.00020032199999999996,0.00020596700000000004],"6291456":[1.3734063894999999,1.3760743280000001],"256":[1.3890747474747475e-05,1.4627030000000001e-05],"15204352":[2.8626302259999998,2.8737472840000002],"28672":[0.0015923281666666671,0.0016515492000000003],"768":[4.4166300000000004e-05,4.9807320000000001e-05],"212992":[0.016571242,0.017599337999999999],"864":[4.3520999999999999e-05,4.798875e-05],"352":[2.0240990000000001e-05,2.1837800000000003e-05],"253952":[0.020089203,0.020907806500000001],"960":[5.2751330000000006e-05,5.4889000000000003e-05],"24576":[0.0016269890000000001,0.001643406],"7680":[0.00043534722727272727,0.00044993634999999991],"294912":[0.025301707,0.026419765499999998],"1048576":[0.11680858550000001,0.14834091050000001],"10485760":[2.0777281035000001,2.181397349],"344064":[0.029454689999999999,0.032871749000000013],"288":[1.5719560000000002e-05,1.6672547945205481e-05],"1152":[6.6988770000000003e-05,6.9868970000000003e-05],"384":[2.2259000000000002e-05,2.4054500000000002e-05],"2304":[0.00012376633333333335,0.000129832],"896":[4.539266666666667e-05,5.0658350000000006e-05],"480":[2.6238659999999997e-05,2.6593530000000001e-05],"1441792":[0.179881809,0.26084114749999998],"992":[5.5474260000000002e-05,5.8207e-05],"3968":[0.00022007667441860463,0.00022037699999999998],"6400":[0.00036029566666666665,0.00039862300000000002],"1344":[7.7076727272727276e-05,8.1242619999999995e-05],"126976":[0.0081370880000000024,0.008196295000000001],"2883584":[0.50074183750000001,0.562433144],"753664":[0.076414801000000004,0.1072767615],"16384":[0.00094509300000000015,0.00098616700000000003],"131072":[0.0085054450000000004,0.0092168250000000014],"458752":[0.038836919999999997,0.050364995000000003],"172032":[0.013753036,0.014325328999999994],"12288":[0.00078418500000000007,0.00083972799999999998],"14680064":[2.729157496,2.835933442],"1536":[9.3804999999999987e-05,0.00010169408163265305],"25600":[0.001415071,0.001429937],"1835008":[0.25076960699999995,0.259538983],"10752":[0.00064926099999999983,0.00067342635714285704],"21504":[0.0013088569999999999,0.0013795350000000001],"7602176":[1.3656548315000001,1.3812161279999999],"5632":[0.00034336399999999981,0.00035748699999999997],"10":[4.5959523809523811e-07,4.616e-07],"3145728":[0.58149028000000003,0.59957166000000006],"245760":[0.018782068999999998,0.019133267000000002],"1728":[8.8535199999999992e-05,9.6943199999999997e-05],"11":[4.7203000000000003e-07,4.8576999999999999e-07],"1114112":[0.12248292299999999,0.16218834100000001],"12":[4.9732000000000001e-07,5.0144000000000002e-07],"7340032":[1.2733573200000001,1.3403125140000001],"7168":[0.00039703599999999992,0.00041090500000000015],"13":[5.0825000000000007e-07,5.1384e-07],"6029312":[1.254014918,1.2596997415],"14":[5.3926999999999998e-07,5.4043999999999999e-07],"3200":[0.00016627833333333336,0.0001806191568627451],"20":[1.4567200000000001e-06,1.47493e-06],"204800":[0.014452673499999999,0.0154599505],"15":[5.6440000000000005e-07,6.2457608695652168e-07],"13312":[0.00073518400000000005,0.00076496366666666676],"4980736":[0.92825021949999997,0.98574237249999996],"118784":[0.0075439719999999986,0.0090319200000000006],"51200":[0.0029516266666666673,0.003035303],"16":[1.2390400000000002e-06,1.3071900000000001e-06],"21":[1.4903599999999999e-06,1.5563799999999999e-06],"917504":[0.091733730000000013,0.134117394],"22":[1.5548100000000002e-06,1.6399500000000001e-06],"4864":[0.00029296772727272727,0.00029413399999999999],"17":[1.2973400000000001e-06,1.3373700000000001e-06],"14848":[0.00082927299999999995,0.00093891579999999997],"23":[1.6120800000000001e-06,1.7146699999999999e-06],"786432":[0.091467538000000029,0.122975314],"18":[1.3512699999999999e-06,1.4440099999999999e-06],"1638400":[0.21304135799999999,0.23935057900000001],"7864320":[1.4353385400000001,1.4548557695],"24":[1.7092400000000001e-06,1.7300500000000001e-06],"14155776":[2.6642768349999999,4.7504112059999999],"19":[1.4006899999999999e-06,1.4349199999999999e-06],"30":[1.88998e-06,1.9034100000000001e-06],"25":[1.72167e-06,1.7482099999999999e-06],"31":[1.9424000000000002e-06,2.16081e-06],"1280":[7.4312000000000003e-05,7.8827999999999998e-05],"26":[1.67759e-06,1.78526e-06],"3932160":[0.65752485299999996,0.68654367699999996],"2432":[0.00013704799999999999,0.00014348175],"32":[2.0662900000000002e-06,2.07193e-06],"27":[1.73297e-06,1.73656e-06],"409600":[0.033226759000000002,0.039367439500000004]}},{"title":"std::unordered_set successful find","results":{"28":[5.0086e-07,5.0640999999999999e-07,5.0747000000000003e-07,5.1119000000000001e-07,5.2818000000000006e-07,5.3002000000000003e-07,5.3254999999999999e-07,5.3858999999999995e-07,5.5583999999999998e-07,5.6793999999999994e-07,5.7265999999999999e-07,6.2187000000000005e-07],"34":[6.3567999999999999e-07,6.3684999999999999e-07,6.4557999999999999e-07,6.5593999999999998e-07,6.5647e-07,6.6006e-07,6.6068000000000006e-07,6.6522000000000002e-07,6.7000000000000004e-07,6.8201000000000006e-07,6.8439e-07,7.0719000000000002e-07],"29":[5.3260999999999995e-07,5.3738999999999997e-07,5.4698999999999995e-07,5.4769e-07,5.5949000000000004e-07,5.6288000000000002e-07,5.6293999999999998e-07,5.7192999999999996e-07,5.8044999999999999e-07,5.9991000000000003e-07,6.0795000000000004e-07,6.3547999999999997e-07],"40":[7.6474e-07,7.6822000000000003e-07,7.6860000000000004e-07,7.7082000000000002e-07,7.8996000000000001e-07,7.9610000000000009e-07,8.2210000000000004e-07,8.2536999999999999e-07,8.2652999999999992e-07,8.3023999999999995e-07,8.3672999999999995e-07,8.5568e-07],"17408":[0.00049856449999999991,0.0005004600000000001,0.00051620968421052635,0.00051960861111111111,0.00052539770588235315,0.0005335975555555559,0.00053982500000000018,0.00055131099999999986,0.00055627699999999988,0.00056983399999999997,0.00058243500000000018,0.00059370500000000014],"1472":[3.7784999999999998e-05,3.9561000000000003e-05,4.0007382978723406e-05,4.1486149999999999e-05,4.2377370370370377e-05,4.2674920000000002e-05,4.3209449999999997e-05,4.3377880000000002e-05,4.344875e-05,4.3454000000000001e-05,4.4370999999999999e-05,4.4864129999999998e-05],"112":[2.07055e-06,2.1046199999999998e-06,2.16434e-06,2.2146899999999999e-06,2.2558571428571427e-06,2.2758699999999997e-06,2.2823000000000002e-06,2.28248e-06,2.2921500000000002e-06,2.3184399999999999e-06,2.3641500000000001e-06,2.4651899999999999e-06],"1376256":[0.34472976799999999,0.36477965950000002,0.36816455599999998,0.37804067800000002,0.384782228,0.40675000950000001,0.41206682350000001,0.41458562999999998,0.415745692,0.42493626800000001],"5242880":[1.545579826,1.557784544,1.562706919,1.60812467,1.6548109735000001,1.6553424395],"36":[6.8747e-07,6.8898000000000007e-07,6.9041000000000005e-07,6.9365999999999998e-07,6.976499999999999e-07,6.9849e-07,7.001200000000001e-07,7.0858999999999991e-07,7.0966000000000002e-07,7.2771e-07,7.2792000000000008e-07,7.3076000000000001e-07],"42":[7.9852999999999994e-07,8.1480999999999998e-07,8.1719999999999999e-07,8.3077000000000007e-07,8.3169000000000006e-07,8.329499999999999e-07,8.3671999999999999e-07,8.5079000000000001e-07,8.6748000000000004e-07,8.7658000000000008e-07,8.7911999999999989e-07,8.8781000000000006e-07],"11534336":[3.7042722879999999,3.7344670679999998,3.7490960439999998,3.764384052,3.7766247934999999,3.7967241199999999],"114688":[0.0072503290000000024,0.007368365,0.0074951100000000019,0.007575376,0.0075996475000000008,0.0082071159999999987,0.0082182000000000002,0.0083287020000000003,0.0084237639999999968,0.0091310139999999963,0.0091547750000000004,0.017110034999999999],"144":[2.7895300000000001e-06,2.9008099999999997e-06,2.9111000000000004e-06,2.92141e-06,2.9312857142857146e-06,3.0156800000000001e-06,3.0526199999999999e-06,3.0552399999999998e-06,3.1064899999999995e-06,3.1529699999999997e-06,3.17992e-06,3.3391200000000001e-06],"38":[7.1601999999999992e-07,7.2075000000000004e-07,7.2235000000000006e-07,7.2441000000000007e-07,7.2997999999999998e-07,7.3485000000000005e-07,7.5501999999999999e-07,7.7896000000000003e-07,7.846700000000001e-07,7.9276999999999997e-07,8.0790000000000003e-07,8.1328000000000009e-07],"240":[4.6884599999999998e-06,4.7993846153846147e-06,4.8369999999999996e-06,4.8645600000000006e-06,4.8695000000000006e-06,4.9289200000000001e-06,5.0050000000000004e-06,5.0646000000000006e-06,5.1639199999999995e-06,5.1704399999999999e-06,5.1731800000000002e-06,5.4999600000000004e-06],"9216":[0.00024315900000000009,0.00025210150000000008,0.00025334399999999986,0.00025647066666666671,0.00026029299999999998,0.0002625739999999999,0.00026348816129032266,0.00027223699999999993,0.00028623566666666667,0.00028656006060606064,0.00028893449999999998,0.0003047590000000001],"44":[8.2210999999999999e-07,8.3600999999999998e-07,8.4193999999999998e-07,8.5488999999999989e-07,8.8017999999999993e-07,8.8245999999999998e-07,8.9140000000000005e-07,9.0551999999999997e-07,9.245e-07,9.2837999999999995e-07,9.3120000000000008e-07,9.7893000000000004e-07],"1664":[3.8005500000000001e-05,3.8583e-05,3.9596068181818181e-05,4.0414789999999997e-05,4.1414172413793109e-05,4.1564899999999999e-05,4.1736000000000002e-05,4.2370000000000003e-05,4.3040000000000001e-05,4.3525000000000001e-05,4.4045509999999998e-05,4.5691666666666668e-05],"196608":[0.016772705999999991,0.016780765499999999,0.017815675500000006,0.017885263999999991,0.018708700000000002,0.019197486499999999,0.019207180500000001,0.020225642999999998,0.020387678999999999,0.020450243,0.022810237000000001,0.024571788000000001],"155648":[0.011019040499999999,0.011084730500000002,0.0113371325,0.011404573999999997,0.011441221499999998,0.011783468,0.012077415499999999,0.012430592000000001,0.0125492385,0.012744482000000001,0.016974816,0.020492076500000001],"2816":[7.6434999999999996e-05,7.6818999999999998e-05,7.9363999999999994e-05,8.0000368421052638e-05,8.1434000000000007e-05,8.2701000000000007e-05,8.2888530000000006e-05,8.3358999999999999e-05,8.3386133333333324e-05,8.4134529411764703e-05,8.5159000000000002e-05,8.5927380000000005e-05],"50":[8.7505999999999995e-07,8.8460000000000007e-07,8.9698999999999999e-07,9.3948000000000005e-07,9.4518000000000005e-07,9.5828000000000008e-07,9.5898999999999999e-07,1.0069438202247191e-06,1.01819e-06,1.0249183673469387e-06,1.05805e-06,1.0654500000000001e-06],"2359296":[0.64576719900000001,0.66063017199999996,0.69032719200000003,0.69087827199999996,0.70296471399999994,0.83454103449999995],"46":[8.7692000000000005e-07,9.2598999999999994e-07,9.3196999999999995e-07,9.3301999999999992e-07,9.3641999999999996e-07,9.3784999999999994e-07,9.4483999999999998e-07,9.5861999999999994e-07,9.6622999999999994e-07,9.8772000000000001e-07,1.0040967741935485e-06,1.02063e-06],"176":[3.6132e-06,3.6432999999999999e-06,3.7190600000000003e-06,3.72436e-06,3.7408199999999995e-06,3.7492500000000001e-06,3.7797099999999998e-06,3.8077100000000003e-06,3.8287700000000001e-06,3.8294799999999998e-06,3.8493499999999998e-06,3.8655100000000004e-06],"52":[9.7396000000000007e-07,9.9240000000000002e-07,9.9788999999999994e-07,1.00248e-06,1.0241399999999999e-06,1.03042e-06,1.0330000000000001e-06,1.0501600000000001e-06,1.0509e-06,1.0636099999999999e-06,1.1204299999999999e-06,1.14463e-06],"272":[5.4413900000000003e-06,5.4814571428571428e-06,5.5043300000000004e-06,5.6750599999999998e-06,5.7259999999999999e-06,5.9131699999999992e-06,5.9132800000000001e-06,5.9830000000000001e-06,5.9869500000000003e-06,6.05239e-06,6.1970707070707078e-06,6.6833099999999999e-06],"116":[2.1895299999999999e-06,2.2040769230769233e-06,2.2259999999999999e-06,2.2284799999999998e-06,2.3147099999999999e-06,2.3222500000000001e-06,2.3327999999999999e-06,2.3530600000000001e-06,2.36789e-06,2.3726699999999998e-06,2.3849100000000001e-06,2.4235799999999998e-06],"47104":[0.0025505806666666665,0.002588309,0.0026081340000000002,0.0026313010000000008,0.0026508783333333333,0.0026868446666666666,0.002689206,0.0028771706666666673,0.0028841263333333322,0.0029042729999999998,0.0029284140000000007,0.0029932679999999994],"6912":[0.00016981599999999993,0.000172611,0.000174229,0.000178987,0.00018049599999999999,0.000181886,0.00018189011999999999,0.0001860163018867924,0.00018628541509433966,0.00018669566666666668,0.00019242166000000009,0.00019793964583333335],"1856":[4.3234e-05,4.4465800000000004e-05,4.6364000000000005e-05,4.6743999999999998e-05,4.6850800000000002e-05,4.7349439999999994e-05,4.7587170000000002e-05,4.7598609999999996e-05,4.8524333333333332e-05,4.8831541666666667e-05,5.0113870588235291e-05,5.1920279999999997e-05],"48":[8.6675999999999996e-07,8.6778000000000006e-07,8.7166000000000001e-07,8.9558999999999999e-07,9.2033999999999994e-07,9.2385000000000006e-07,9.2982999999999996e-07,9.3539000000000001e-07,9.3867000000000003e-07,9.5429999999999991e-07,9.7343999999999991e-07,9.8711999999999996e-07],"2097152":[0.56338633500000002,0.5709569645,0.57902199499999996,0.58473885199999998,0.58611061450000002,0.60371045000000001,0.61933500649999995,0.62741934750000006],"54":[9.6954000000000004e-07,1.01243e-06,1.0292199999999999e-06,1.0421200000000001e-06,1.04465e-06,1.0485899999999999e-06,1.07657e-06,1.0918300000000001e-06,1.0936100000000001e-06,1.1031300000000001e-06,1.11646e-06,1.12328e-06],"2031616":[0.56018784600000004,0.56105080600000001,0.57117257700000001,0.57435769250000002,0.57945240649999996,0.58107414700000004,0.58578851099999996,0.59098276299999997,0.68430263049999995],"43008":[0.0022663099999999997,0.0022741987499999999,0.00228440875,0.0022879335,0.0023291675000000002,0.0023430319999999988,0.00244779,0.0024511890000000008,0.00245488,0.0024907226666666671,0.0025174466666666668,0.0026547466666666667],"60":[1.1276100000000001e-06,1.1593000000000001e-06,1.1646699999999999e-06,1.16815e-06,1.1688200000000001e-06,1.1812100000000001e-06,1.2107600000000001e-06,1.2112000000000002e-06,1.2192699999999999e-06,1.2346800000000001e-06,1.2777200000000002e-06,1.3523199999999999e-06],"30720":[0.0013742889999999999,0.00137561,0.0013853820000000003,0.0013969519999999999,0.0014180845,0.0014229364285714284,0.001439945,0.001440279,0.0014540310000000006,0.0014671490000000001,0.0014783670000000004,0.001502385],"56":[1.04583e-06,1.0543399999999998e-06,1.05697e-06,1.0648499999999999e-06,1.07301e-06,1.07693e-06,1.08668e-06,1.0958500000000001e-06,1.1166700000000001e-06,1.1195099999999999e-06,1.1779899999999999e-06,1.19883e-06],"62":[1.17998e-06,1.18288e-06,1.2052999999999999e-06,1.2132400000000001e-06,1.2403300000000002e-06,1.24168e-06,1.24784e-06,1.2608799999999999e-06,1.27363e-06,1.28813e-06,1.3031100000000001e-06,1.3186500000000001e-06],"58":[1.0967199999999999e-06,1.10463e-06,1.1081199999999999e-06,1.1167699999999999e-06,1.12628e-06,1.1454699999999999e-06,1.1561499999999999e-06,1.1686000000000001e-06,1.1718599999999999e-06,1.1761099999999999e-06,1.2038100000000001e-06,1.2930500000000001e-06],"3014656":[0.86863226999999998,0.90049477899999997,0.91886604199999999,0.92670871899999996,0.95073920000000001,0.95989980699999999],"64":[1.1930999999999999e-06,1.20333e-06,1.2314e-06,1.24139e-06,1.2633699999999999e-06,1.2646200000000001e-06,1.2727800000000002e-06,1.30036e-06,1.32216e-06,1.3254700000000001e-06,1.3456000000000001e-06,1.3632200000000001e-06],"8388608":[2.4864234679999999,2.5163222395,2.5211679220000001,2.6048000079999998,2.6281191939999999,2.71966777],"29696":[0.0012321490000000151,0.001279229,0.001296043,0.0013096342857142856,0.0013235371428571428,0.0013237017142857144,0.0013303260000000006,0.0013433245714285715,0.0013444349999999999,0.001365584,0.001372346,0.001384080666666667],"216":[4.1249299999999997e-06,4.1745100000000003e-06,4.2052900000000004e-06,4.3953900000000004e-06,4.4404599999999998e-06,4.4587600000000001e-06,4.4739100000000003e-06,4.5081899999999996e-06,4.55164e-06,4.5794800000000002e-06,4.6706200000000004e-06,4.8421199999999995e-06],"106496":[0.0065066569999999713,0.0066479590000000002,0.0066609110000000003,0.0067032810000000002,0.0067066249999999964,0.0068305480000000014,0.0069242890000000001,0.0069411509999999996,0.0071669560000000004,0.0073033969999999979,0.0074466480000000019,0.0075235079999999999],"72":[1.35711e-06,1.3817399999999999e-06,1.39026e-06,1.39349e-06,1.40624e-06,1.4539899999999999e-06,1.4625200000000001e-06,1.51037e-06,1.5188800000000001e-06,1.5237000000000001e-06,1.52668e-06,1.5422799999999999e-06],"442368":[0.081521505999999994,0.08174662399999999,0.085186310999999973,0.086621667500000027,0.088916185999999994,0.090127111999999995,0.094712612500000029,0.101148322,0.1017311635,0.101929244,0.106071259,0.10674153],"147456":[0.010293416,0.0104699895,0.0106167725,0.010624356499999998,0.011159355000000001,0.011436332,0.011648517000000001,0.011673235000000001,0.0120450885,0.0120708985,0.012867079,0.015397492],"4456448":[1.3155361409999999,1.3282635759999999,1.3295225589999999,1.3508180699999999,1.3567456280000001,1.3600596125],"63488":[0.003655457,0.0037228969999999985,0.0037289439999999988,0.0037332709999999998,0.0037404259999999981,0.0037976959999999997,0.0038752834999999999,0.0040519650000000003,0.00412635,0.0041686904999999998,0.0042013045000000001,0.0042171750000000001],"38912":[0.0019224000000000001,0.0019836016,0.00199422025,0.0020049097499999996,0.0020705775000000003,0.002092493,0.0021149852500000005,0.0021186352500000005,0.00212532,0.00218506,0.0022460814999999998,0.0025873286666666662],"68":[1.28856e-06,1.29897e-06,1.3119299999999999e-06,1.3417799999999999e-06,1.36407e-06,1.3741400000000002e-06,1.3793700000000001e-06,1.40297e-06,1.4093499999999999e-06,1.4194199999999998e-06,1.4230599999999999e-06,1.4482424242424241e-06],"188416":[0.015194616499999997,0.0152174045,0.016140110499999999,0.016311226499999994,0.016604783000000005,0.0168761895,0.017450808500000001,0.017561439999999998,0.019716631499999998,0.021859070500000001,0.022758645000000001,0.024093297],"248":[4.8920699999999997e-06,4.9691000000000004e-06,5.0436250000000004e-06,5.0703000000000004e-06,5.1405699999999991e-06,5.2789999999999998e-06,5.314319444444444e-06,5.31741e-06,5.3314299999999999e-06,5.4582399999999999e-06,5.5001400000000003e-06,5.7515342465753427e-06],"80":[1.57517e-06,1.5922700000000002e-06,1.59454e-06,1.6870300000000001e-06,1.69953e-06,1.7066100000000002e-06,1.7157599999999999e-06,1.7217500000000001e-06,1.72184e-06,1.7435899999999999e-06,1.8307800000000002e-06,1.9274500000000001e-06],"2560":[6.6520999999999995e-05,6.7910000000000005e-05,7.0871999999999995e-05,7.2677999999999998e-05,7.2857611111111107e-05,7.4055510000000003e-05,7.4553000000000003e-05,7.4558e-05,7.638043e-05,7.6445269999999996e-05,7.8691319999999991e-05,7.9665799999999992e-05],"34816":[0.0015949479999999999,0.00171222,0.0017163425999999996,0.0017248857999999992,0.0017477824000000006,0.0017562325999999999,0.0017958051999999991,0.001798809,0.0018290396,0.0018492700000000001,0.001924343,0.0025364229999999999],"3712":[9.1047571428571437e-05,9.22360909090909e-05,9.6329269999999997e-05,9.6850999999999998e-05,9.8643999999999999e-05,9.8807000000000005e-05,9.9048510204081624e-05,9.9058430232558129e-05,9.9873800000000013e-05,0.00010336912500000001,0.000106705,0.00010820204395604397],"3538944":[0.98272832850000003,0.99427530500000005,1.008619121,1.0265421324999999,1.0556782330000001,1.1140496790000001],"76":[1.47232e-06,1.4852899999999999e-06,1.5124600000000001e-06,1.51267e-06,1.5267600000000001e-06,1.54743e-06,1.54769e-06,1.56131e-06,1.5619799999999999e-06,1.58383e-06,1.6722100000000001e-06,1.7673100000000001e-06],"4194304":[1.181672024,1.1841386460000001,1.237074421,1.2484426795000001,1.2573993025000001,1.2693911309999999],"851968":[0.20090053899999999,0.20383229899999999,0.21106804099999998,0.21537895500000004,0.21686995000000001,0.21986650699999999,0.22173477699999999,0.22474974949999998,0.23918187950000003,0.240936487],"4096":[0.00010738899999999998,0.00010971959090909089,0.00010989071111111112,0.00011254099999999999,0.00011353699999999999,0.000113559,0.00011391522222222224,0.00011527033333333333,0.00011548300000000003,0.000115665,0.00011895012195121949,0.000123645875],"59392":[0.003428623,0.00343772,0.0034756284999999999,0.0035044609999999982,0.0035056014999999981,0.0035113845000000012,0.0036165639999999983,0.003698809,0.0037083789999999999,0.0039120770000000017,0.0040343940000000019,0.0044391635],"84":[1.65028e-06,1.6791999999999999e-06,1.6792500000000001e-06,1.6882e-06,1.6975399999999999e-06,1.7006099999999999e-06,1.7183600000000001e-06,1.7631400000000002e-06,1.7856900000000001e-06,1.8124899999999999e-06,1.8133099999999999e-06,1.9920499999999998e-06],"3276800":[0.98615908100000005,0.99851490300000001,1.0002261480000001,1.010650856,1.0315519120000001,1.0603840684999999],"55296":[0.0029831693333333344,0.0031384376666666672,0.003158985,0.003181101999999999,0.0032730049999999998,0.0032953305000000001,0.0033639809999999998,0.003398599,0.003429236,0.0034474129999999999,0.003507451,0.003529211],"688128":[0.15322424800000001,0.15392376299999999,0.155268349,0.156157669,0.16228029599999999,0.16442845900000003,0.16993181099999999,0.181773246,0.18957402400000001,0.18998800199999999,0.19033046449999999],"8192":[0.00021541799999999994,0.000216145,0.000220008,0.000225553,0.00022634310000000011,0.00022636099999999987,0.000227634,0.00023024800000000001,0.00023457949999999999,0.00023637063414634147,0.00024644199999999998,0.00025087200000000002],"10240":[0.000292816,0.00029333400000000002,0.00030107233333333326,0.00030586400000000015,0.00030863700000000001,0.00031770913333333331,0.000319279,0.00032096346666666669,0.00032259765517241371,0.00032286199999999993,0.00032504399999999992,0.00032594625],"15872":[0.000440109,0.000441734,0.000444361,0.00044711109523809495,0.00045779800000000004,0.00045837657142857159,0.0004597165,0.00049222800000000004,0.00049761100000000002,0.00051118399999999981,0.00051133736842105273,0.00051314799999999984],"92":[1.8517199999999999e-06,1.8570300000000002e-06,1.9265299999999997e-06,1.9410599999999997e-06,1.9433499999999998e-06,1.9514099999999999e-06,1.9727600000000001e-06,1.99778e-06,2.0463100000000001e-06,2.0538292682926829e-06,2.0753700000000001e-06,2.1815900000000001e-06],"26624":[0.00100424,0.001006254,0.0010216191111111115,0.0010309852222222223,0.0010583740000000004,0.001072618,0.0010727686666666667,0.001089116,0.0010940306249999994,0.0011022079999999999,0.001126953,0.00113218525],"1792":[4.3290000000000001e-05,4.379747e-05,4.3992999999999997e-05,4.420537000000002e-05,4.4610000000000001e-05,4.5196910000000002e-05,4.5812000000000001e-05,4.5848666666666667e-05,4.6177333333333329e-05,4.6603060000000005e-05,4.9212800000000004e-05,4.9917379999999996e-05],"11776":[0.00034529600000000014,0.00036353399999999999,0.00037318749999999998,0.00037458199999999993,0.00037953099999999995,0.00038689949999999986,0.00038728131999999987,0.00038872900000000004,0.00039181399999999999,0.00039560999999999996,0.00040259266666666671,0.00041004499999999994],"2944":[8.3763687499999995e-05,8.3950999999999996e-05,8.4656999999999999e-05,8.6421999999999994e-05,8.8252399999999995e-05,8.8276249999999997e-05,8.8277100000000002e-05,8.8550660000000003e-05,8.8781000000000003e-05,9.0826308510638302e-05,9.1318999999999998e-05,9.553677319587629e-05],"88":[1.7423499999999999e-06,1.7521699999999999e-06,1.78057e-06,1.8161800000000002e-06,1.8223800000000002e-06,1.83117e-06,1.8476600000000001e-06,1.86933e-06,1.8917500000000001e-06,1.9274899999999999e-06,2.0795500000000003e-06,2.08939e-06],"22528":[0.00073415408333333306,0.00074600099999999983,0.00077413699999999994,0.0007925446666666667,0.00079612699999999999,0.00081926700000000026,0.00082137500000000006,0.00082186566666666661,0.00082191600000000001,0.00085396800000000041,0.00085787781818181847,0.000942419],"1245184":[0.33367369699999999,0.33491513899999997,0.33620672699999998,0.34452306399999999,0.34947958000000001,0.35240426700000005,0.360754566,0.365262949,0.37138724400000001,0.37273961500000002],"15728640":[4.9256895180000004,4.9432319040000001,5.0015637364999996,5.1035278100000001,5.1461223535,5.3828558280000003],"96":[1.9336700000000002e-06,1.95795e-06,1.9871800000000001e-06,2.0190799999999997e-06,2.01935e-06,2.0383500000000001e-06,2.0557699999999999e-06,2.0589600000000003e-06,2.0693799999999999e-06,2.08341975308642e-06,2.0984000000000001e-06,2.1552999999999999e-06],"1984":[5.0487709999999995e-05,5.0546e-05,5.0643999999999998e-05,5.1713410000000006e-05,5.2030000000000002e-05,5.2266999999999999e-05,5.2364999999999998e-05,5.3189980000000003e-05,5.3302489999999993e-05,5.3670150000000003e-05,5.4237590000000003e-05,5.6140039999999997e-05],"139264":[0.0091052569999999968,0.0094760549999999971,0.0095139370000000001,0.0095342040000000027,0.0098319280000000002,0.0098986214999999995,0.010199343999999999,0.01093065599999999,0.011167488,0.0115405605,0.016635995000000001,0.018497199999999998],"475136":[0.087472356000000001,0.092625115999999993,0.095964481000000004,0.096980132999999996,0.10054236,0.1005848555,0.1018773645,0.10210543549999999,0.10649934950000001,0.10744988900000001,0.12726143649999999],"13631488":[4.1991048429999998,4.2074764660000001,4.2907082340000002,4.324063014,4.3527849549999997,4.5216739769999998],"416":[8.3136249999999995e-06,8.3711399999999996e-06,8.3793499999999997e-06,8.4892400000000011e-06,8.4989200000000006e-06,8.5093500000000001e-06,8.6735799999999997e-06,8.8592300000000002e-06,8.8947199999999994e-06,8.9649399999999989e-06,8.9827999999999998e-06,9.2641600000000008e-06],"928":[2.012e-05,2.030123e-05,2.0306499999999999e-05,2.107799e-05,2.1452999999999999e-05,2.1636978723404256e-05,2.231477e-05,2.2357e-05,2.2457670000000001e-05,2.257331e-05,2.2591000000000001e-05,2.2953869999999998e-05],"512":[1.0628129999999999e-05,1.0995000000000001e-05,1.1070870000000001e-05,1.1124520000000001e-05,1.116836e-05,1.137861e-05,1.1414000000000001e-05,1.1470769230769231e-05,1.1499920000000001e-05,1.1528471698113209e-05,1.1636789999999999e-05,1.2440533333333334e-05],"18432":[0.00054230582352941185,0.00055450599999999997,0.000562985,0.00056569387499999968,0.00057281870588235301,0.00058171799999999973,0.00058206999999999996,0.00058485099999999973,0.00059048399999999984,0.00059665499999999997,0.0006271286,0.00077069600000000008],"16777216":[5.3902331100000005,5.3926585710000001,5.4234374000000001,5.4976464854999998,5.5877207310000001,5.7216709540000004],"9728":[0.00026241099999999999,0.000286874,0.00028853200000000009,0.00028989,0.00029025279411764703,0.00029650048484848487,0.00029695162499999999,0.00030151987499999985,0.00030361400000000017,0.00030957115624999994,0.00031138066666666663,0.00033194633333333328],"1769472":[0.47980513850000001,0.48070871799999998,0.48248142199999999,0.484743702,0.48567891200000002,0.50420233150000004,0.50634181099999997,0.51275667749999998,0.52105217100000001],"1703936":[0.44614342499999998,0.44708800299999996,0.45524958199999999,0.45744421899999999,0.46010480399999998,0.46128607499999996,0.46664143250000001,0.48346616799999997,0.489159338,0.51381011249999997],"2048":[5.1416000000000004e-05,5.1962000000000002e-05,5.2424940000000003e-05,5.3177999999999998e-05,5.3241000000000001e-05,5.4333499999999997e-05,5.4714140000000001e-05,5.480285e-05,5.5535999999999998e-05,5.6637175675675674e-05,5.7024310000000003e-05,5.7051e-05],"14336":[0.000364757,0.00036591999999999999,0.00038121900000000002,0.00038801731999999996,0.00039694887499999991,0.00040293600000000001,0.00040303100000000004,0.00040423504347826078,0.000407477,0.00040918091304347826,0.00041723200000000002,0.00041841900000000001],"448":[8.7762200000000005e-06,8.9605555555555546e-06,9.2289999999999992e-06,9.2318461538461549e-06,9.2408999999999999e-06,9.2709999999999998e-06,9.4029999999999996e-06,9.4924999999999993e-06,9.6699999999999989e-06,9.7185899999999997e-06,9.7319099999999998e-06,9.8625099999999999e-06],"5505024":[1.6441202065,1.6566037309999999,1.6833418265,1.691838084,1.709496653,1.7108981270000001],"544":[1.1009000000000001e-05,1.1293058823529411e-05,1.15543e-05,1.17162e-05,1.1768499999999999e-05,1.180319e-05,1.2046e-05,1.210609e-05,1.2178379999999999e-05,1.2271440000000002e-05,1.2449899999999999e-05,1.353887e-05],"221184":[0.021492898,0.021963981,0.023737123500000006,0.023840113,0.027899251999999992,0.028984494,0.029263093,0.030924594999999999,0.038043788000000002,0.039356971000000004,0.045478784500000008,0.052295785500000004],"90112":[0.0057950300000000022,0.0058434649999999999,0.005847845,0.005899881,0.0059005050000000003,0.0059508400000000015,0.0061976610000000019,0.0062890229999999978,0.0063530080000000003,0.0065411590000000004,0.0068029660000000032,0.0068730399999999995],"640":[1.4038e-05,1.429779e-05,1.440137e-05,1.4436e-05,1.445437e-05,1.4686009999999999e-05,1.474054e-05,1.4938469999999999e-05,1.5066500000000001e-05,1.5235520000000001e-05,1.524289e-05,1.5303569999999998e-05],"12800":[0.00038833000000000004,0.0004123086666666666,0.00041534799999999985,0.00041746704347826096,0.00041849399999999999,0.00042150530434782789,0.00042213800000000018,0.00042476814285714279,0.00043658131818181809,0.00043975500000000001,0.00044808733333333338,0.00045089300000000022],"262144":[0.031830568500000017,0.036955204999999998,0.037023017999999998,0.037411704000000004,0.042797557,0.04651011300000002,0.047184378999999999,0.047195022499999996,0.048590622999999999,0.052518637,0.059773731500000003,0.060814140999999974],"589824":[0.13437914200000001,0.138972665,0.13964201700000001,0.14291336299999999,0.14567771800000001,0.14912212,0.15206431899999995,0.16172118050000001,0.165636705,0.16604719500000001,0.16757422799999999],"884736":[0.2134836135,0.21379750600000003,0.217583842,0.21787230399999999,0.21971886400000001,0.21992447600000001,0.22500970849999999,0.23167740549999999,0.23258210100000001,0.24802316599999999],"6144":[0.0001757000000000001,0.000182356,0.00018345499999999996,0.000186608,0.000190402,0.00019226400000000001,0.00019372199999999999,0.000195205,0.0001956516666666667,0.00019622900000000002,0.00019876399999999998,0.000199559],"1088":[2.5099349999999999e-05,2.5895179999999998e-05,2.7135999999999999e-05,2.7158659999999999e-05,2.7188972972972974e-05,2.7654e-05,2.8152509999999999e-05,2.8385999999999999e-05,2.8420709999999998e-05,2.8603069999999999e-05,3.0117e-05,3.0570999999999996e-05],"576":[1.2489129999999999e-05,1.2569460000000001e-05,1.296434e-05,1.302215e-05,1.302486e-05,1.3024862068965518e-05,1.307387e-05,1.319224e-05,1.3210460000000001e-05,1.3226500000000001e-05,1.3239263157894737e-05,1.373672e-05],"160":[3.2190675675675676e-06,3.26196e-06,3.28166e-06,3.3829700000000001e-06,3.3956299999999997e-06,3.4682700000000003e-06,3.4728200000000002e-06,3.4954400000000003e-06,3.50324e-06,3.5126500000000002e-06,3.5301299999999999e-06,3.60025e-06],"672":[1.4866636363636363e-05,1.5367469999999999e-05,1.5400839999999999e-05,1.5422695652173912e-05,1.5545459999999999e-05,1.5789119999999999e-05,1.5891309999999999e-05,1.6005209999999998e-05,1.6128714285714285e-05,1.619515e-05,1.6277e-05,1.6460960000000001e-05],"8912896":[2.7464088334999999,2.7868587124999999,2.8476837079999999,2.8532399470000001,2.867963048,2.8803286689999998],"100":[1.8551900000000002e-06,1.8846999999999999e-06,1.8907e-06,1.90187e-06,1.9576999999999999e-06,1.96154e-06,1.9705699999999998e-06,1.98506e-06,2.0021899999999998e-06,2.0435399999999998e-06,2.08511e-06,2.1296700000000001e-06],"507904":[0.10850639649999999,0.110636842,0.11474402,0.11590140850000002,0.12176522100000001,0.122559313,0.12589521749999999,0.12810470700000001,0.129965725,0.13462185100000001,0.13543960299999999],"3840":[9.5198000000000006e-05,9.9031999999999996e-05,9.9758000000000003e-05,9.9883293478260864e-05,0.00010123570103092786,0.000103199,0.00010412399999999999,0.00010433299999999999,0.00010568760000000006,0.00010630599999999998,0.00010730599999999994,0.00011515000000000003],"192":[4.0238600000000003e-06,4.1044400000000003e-06,4.1213699999999996e-06,4.138e-06,4.1858100000000005e-06,4.2161500000000003e-06,4.23093e-06,4.2456599999999996e-06,4.2729399999999996e-06,4.3719800000000001e-06,4.5157400000000001e-06,4.6140799999999999e-06],"376832":[0.060989455499999998,0.064099713499999975,0.066396234999999998,0.069012400000000002,0.070206622999999996,0.075488629000000002,0.07553154749999999,0.076365769999999999,0.08527896500000004,0.086771157500000001,0.090525766999999993,0.094036292500000035],"98304":[0.0065822790000000016,0.0066103180000000013,0.0066483540000000022,0.0067511249999999984,0.0068352930000000018,0.0070642860000000003,0.007249531,0.0072810399999999982,0.0072854269999999971,0.0073016219999999981,0.0073746480000000001,0.0074991349999999997],"5376":[0.000149825,0.00015244799999999999,0.00015312399999999993,0.000153845,0.0001587292499999999,0.00016003266666666667,0.000161869,0.00016381500000000007,0.00016409000000000001,0.00016434999999999996,0.00016524199999999999,0.00016623899999999996],"94208":[0.0059814659999999987,0.0060882800000000015,0.0063383329999999998,0.0064641639999999988,0.0065798880000000034,0.0066890719999999999,0.0067163609999999997,0.006727607,0.006728426,0.0068651709999999989,0.0069414869999999979,0.0069734900000000015],"81920":[0.0051630799999999996,0.0052358609999999996,0.0052436550000000024,0.0052480260000000003,0.005488471,0.0055495780000000012,0.005552376999999999,0.0055524159999999993,0.0057183490000000002,0.0057693250000000014,0.0057709609999999998,0.005816084],"3407872":[0.96601907300000001,0.97054916800000002,0.97709114600000002,0.99646686449999999,1.00746369,1.011581568],"104":[1.96576e-06,1.9757800000000001e-06,2.0142799999999998e-06,2.0480000000000001e-06,2.0574500000000001e-06,2.0617300000000001e-06,2.0661899999999999e-06,2.0812300000000001e-06,2.1086100000000003e-06,2.1140399999999998e-06,2.1174299999999998e-06,2.21715e-06],"122880":[0.0076313809999999996,0.008324841000000003,0.0084875410000000047,0.008494929,0.0085184609999999945,0.0087395819999999992,0.0089330099999999999,0.0089365980000000005,0.0089470179999999993,0.009070120999999997,0.0091461154999999995,0.009248727],"200":[3.7276600000000001e-06,3.81287e-06,3.9185400000000001e-06,3.9603799999999997e-06,4.0467800000000002e-06,4.0606800000000002e-06,4.06311e-06,4.0757058823529414e-06,4.0910499999999996e-06,4.10492e-06,4.16764e-06,4.5324200000000006e-06],"163840":[0.0117098145,0.012243667,0.012292522,0.012669532000000001,0.0130263055,0.013199453,0.0135242795,0.014514361999999999,0.015664659000000001,0.016320911,0.016749765500000013,0.017377907000000001],"4063232":[1.1329873610000001,1.166029108,1.1875009295000001,1.200782405,1.2178569130000001,1.2461855390000001],"5767168":[1.7433874505,1.753191086,1.7918910960000001,1.8239661380000001,1.840015867,2.0478700365],"12582912":[4.008506476,4.0500147999999996,4.1056131090000001,4.1265481299999998,4.1968209380000001,4.2125588455000003],"1600":[3.6090333333333329e-05,3.7855000000000003e-05,3.7855999999999998e-05,3.8006000000000002e-05,3.8142999999999997e-05,3.8364000000000001e-05,3.8744e-05,3.9081500000000002e-05,3.9543740000000002e-05,4.0677999999999999e-05,4.1589945945945941e-05,4.3093850000000001e-05],"136":[2.6611899999999998e-06,2.6687400000000002e-06,2.6808600000000002e-06,2.7325000000000001e-06,2.77581e-06,2.7837899999999997e-06,2.7943199999999998e-06,2.8034900000000001e-06,2.8313900000000003e-06,2.8443799999999997e-06,2.86627e-06,3.1749600000000003e-06],"232":[4.6140000000000002e-06,4.6890000000000003e-06,4.6981199999999997e-06,4.7647500000000004e-06,4.8051399999999994e-06,4.9322899999999995e-06,4.9489499999999994e-06,5.0066800000000001e-06,5.0409999999999997e-06,5.0767800000000005e-06,5.1674900000000002e-06,5.2533299999999997e-06],"7077888":[2.0327802985000001,2.0691000805000002,2.1283371930000001,2.1309983680000002,2.1482266389999998,2.2043338575],"86016":[0.0053874020000000003,0.0053908030000000551,0.005435175999999999,0.0055237359999999996,0.0056243019999999994,0.0058215919999999996,0.0058633439999999995,0.0059028680000000012,0.0061027430000000016,0.006168111999999999,0.0064323049999999975,0.0065881550000000001],"31744":[0.0014208745000000005,0.0014379134999999992,0.0014420979999999999,0.001477864,0.001496771,0.001497359,0.0015113861666666668,0.001525719,0.00153068,0.0015335119999999999,0.0015444479999999999,0.0015719900000000001],"168":[3.4212100000000002e-06,3.4293899999999999e-06,3.48251e-06,3.4889499999999999e-06,3.5832600000000002e-06,3.6079400000000001e-06,3.6285499999999998e-06,3.6367700000000001e-06,3.65125e-06,3.6562100000000001e-06,3.70848e-06,3.7804499999999999e-06],"622592":[0.13704535649999999,0.13851475099999999,0.14221016950000001,0.15187027750000001,0.15226946399999999,0.15313024399999997,0.15526178299999999,0.15544939999999999,0.16823841649999999,0.16915176650000002,0.17748330900000001],"108":[2.0514200000000001e-06,2.0517600000000002e-06,2.0687499999999999e-06,2.0790100000000002e-06,2.1170100000000001e-06,2.1217999999999997e-06,2.1302e-06,2.1378999999999999e-06,2.1415900000000001e-06,2.1436499999999998e-06,2.1537400000000001e-06,2.1945299999999999e-06],"327680":[0.051178623499999999,0.053776127000000021,0.054902839500000002,0.058375453000000001,0.06011888700000001,0.06016225400000004,0.060308466999999998,0.062709766,0.06378123350000002,0.06745543800000002,0.070027443999999966,0.072510390000000008],"2176":[5.5309000000000002e-05,5.6743480000000002e-05,5.6834499999999999e-05,5.7247999999999998e-05,5.7565999999999997e-05,5.766436e-05,5.7735999999999997e-05,5.7797999999999998e-05,5.9020000000000001e-05,5.9072150000000003e-05,5.9755650000000004e-05,6.0539821428571434e-05],"3328":[7.9963999999999995e-05,8.3767499999999994e-05,8.4122437500000005e-05,8.4884876404494382e-05,8.7310259999999994e-05,8.7886999999999994e-05,8.8405999999999993e-05,8.8719329999999998e-05,9.0365999999999995e-05,9.1069540000000002e-05,9.1486729999999995e-05,0.00010092740217391306],"1":[1.2589999999999999e-08,1.2649999999999999e-08,1.2720000000000001e-08,1.281e-08,1.3189999999999999e-08,1.3209999999999999e-08,1.322e-08,1.3319999999999999e-08,1.3459999999999999e-08,1.3809999999999999e-08,1.3889999999999999e-08,1.6770000000000001e-08],"2":[2.2560000000000002e-08,2.2610000000000002e-08,2.2630000000000001e-08,2.2699999999999998e-08,2.367e-08,2.3690000000000002e-08,2.3800000000000001e-08,2.4810000000000002e-08,2.4810000000000002e-08,2.4839999999999999e-08,2.679e-08,2.6819999999999998e-08],"3":[5.0769999999999997e-08,5.0909999999999997e-08,5.3050000000000002e-08,5.313e-08,5.3190000000000002e-08,5.5740000000000001e-08,5.6069999999999998e-08,5.6090000000000001e-08,5.6449999999999999e-08,5.7030000000000002e-08,5.9649999999999995e-08,5.9810000000000004e-08],"4":[7.2320000000000002e-08,7.2420000000000009e-08,7.2429999999999994e-08,7.3130000000000007e-08,7.3350000000000005e-08,7.575e-08,7.5759999999999998e-08,7.6580000000000001e-08,7.6629999999999992e-08,7.966e-08,8.0369999999999998e-08,8.7680000000000002e-08],"7424":[0.00019668999999999988,0.00019927900000000004,0.00019972969387755104,0.00020282899999999999,0.00020641999999999999,0.00020776735555555554,0.00020799299999999999,0.00021082464444444445,0.00021170999999999999,0.00021587200000000006,0.00022289900000000006,0.00022412686363636365],"5":[8.8500000000000005e-08,9.3409999999999987e-08,9.4080000000000006e-08,9.8889999999999994e-08,9.9839999999999999e-08,9.9960000000000003e-08,1.0071000000000001e-07,1.0457e-07,1.0510999999999999e-07,1.0522e-07,1.1929e-07,1.2108e-07],"23552":[0.00080243054545454538,0.00085833936363636371,0.00086234199999999999,0.00087078636363636366,0.00087452390909090909,0.00087709774999999957,0.00089028100000000025,0.00089737600000000008,0.00090154010000000008,0.00090708400000000006,0.00091372699999999992,0.00092580399999999991],"6":[9.8209999999999991e-08,9.8389999999999996e-08,1.0315000000000001e-07,1.0329000000000001e-07,1.0338e-07,1.0428e-07,1.0843e-07,1.1074e-07,1.1483e-07,1.1668000000000001e-07,1.2429999999999999e-07,1.2765000000000001e-07],"61440":[0.0035224215000000001,0.0035541040000000002,0.0035812999999999999,0.003608549,0.0036398009999999989,0.003692725,0.0038596235000000001,0.0039353039999999997,0.0039635440000000003,0.0039653710000000005,0.0040856694999999998,0.0045342335000000018],"491520":[0.095971835500000019,0.100563218,0.10064056899999996,0.10081332700000001,0.1088763095,0.1175497325,0.118767662,0.120789468,0.12464112249999998,0.128021886,0.13560491799999999],"77824":[0.0047313955,0.0047607559999999988,0.0048187820000000024,0.0048564309999999987,0.004882702,0.0052796099999999997,0.0053509530000000003,0.0053873030000000013,0.005392463000000001,0.0054035869999999996,0.0058017399999999997,0.0059531520000000015],"7":[1.1953000000000001e-07,1.1967000000000001e-07,1.2055999999999999e-07,1.2067999999999999e-07,1.2524999999999999e-07,1.2590999999999999e-07,1.2604999999999999e-07,1.2604999999999999e-07,1.2645e-07,1.3236e-07,1.3336999999999998e-07,1.4384e-07],"8":[1.3533000000000001e-07,1.357e-07,1.3589000000000001e-07,1.3619e-07,1.4151999999999999e-07,1.4171000000000002e-07,1.4209999999999998e-07,1.4249e-07,1.4287999999999999e-07,1.5365e-07,1.5534000000000001e-07,1.5789000000000002e-07],"208":[3.9946900000000002e-06,4.0310699999999998e-06,4.1327100000000001e-06,4.1493000000000002e-06,4.1769900000000001e-06,4.1996600000000004e-06,4.2103000000000002e-06,4.3170700000000002e-06,4.45297e-06,4.4762800000000001e-06,4.4894100000000004e-06,4.5936299999999999e-06],"9":[1.5123000000000001e-07,1.5136e-07,1.5213e-07,1.5799e-07,1.5818999999999999e-07,1.5829999999999998e-07,1.5916e-07,1.5917000000000002e-07,1.6537e-07,1.6957999999999999e-07,1.7846000000000002e-07,1.8259e-07],"73728":[0.0045339329999999987,0.0045370115000000003,0.0045740539999999984,0.004575272,0.0046543660000000001,0.0046620565000000001,0.0048836749999999996,0.0050293449999999984,0.0050342499999999997,0.0051037140000000014,0.0054472110000000004,0.0080761319999999998],"304":[6.2628499999999997e-06,6.3620000000000002e-06,6.5103678160919544e-06,6.5118900000000004e-06,6.6220600000000003e-06,6.7776500000000002e-06,6.7930799999999997e-06,6.8927899999999996e-06,6.9016600000000001e-06,7.0391400000000003e-06,7.0688200000000005e-06,7.1418700000000006e-06],"400":[7.6773399999999996e-06,7.8711699999999997e-06,8.0565100000000006e-06,8.06149e-06,8.1817900000000012e-06,8.2765400000000006e-06,8.3686699999999996e-06,8.5258000000000006e-06,8.5320700000000005e-06,8.6268800000000007e-06,8.6484099999999991e-06,8.7438428571428572e-06],"1310720":[0.343042442,0.34877698200000001,0.35461694649999997,0.35509921499999997,0.36554394749999997,0.37328831150000003,0.37918541,0.3838482855,0.40624926900000002,0.41071359499999999],"336":[6.9212099999999998e-06,7.3486399999999997e-06,7.3956666666666668e-06,7.4002599999999999e-06,7.4344500000000005e-06,7.4654500000000007e-06,7.5063099999999995e-06,7.6111063829787232e-06,7.646019999999999e-06,7.6517800000000005e-06,7.8539400000000006e-06,8.5744500000000006e-06],"3670016":[0.99083548799999999,1.0557591770000001,1.0691380829999999,1.0754915039999999,1.0938185419999999,1.0953720419999999],"6656":[0.00016370799999999999,0.00016438099999999996,0.00016759200000000002,0.00017250300000000001,0.00017265299999999999,0.00017385600000000001,0.000173909,0.00017495600000000001,0.000176074,0.000178803,0.00018147979245283018,0.0001821258],"15360":[0.00040192800000000002,0.00041311899999999999,0.00041474099999999999,0.0004299432000000003,0.00043205499999999993,0.00043664028571428569,0.00043796199999999997,0.0004435432857142858,0.00046101399999999972,0.00046615300000000013,0.00047394099999999997,0.00047441289999999978],"432":[8.6615636363636363e-06,8.6936000000000009e-06,8.7542600000000008e-06,8.8518099999999995e-06,8.8633333333333337e-06,9.0539499999999999e-06,9.1022700000000005e-06,9.1699500000000002e-06,9.2856400000000008e-06,9.3434600000000002e-06,9.3726099999999997e-06,9.5324799999999992e-06],"950272":[0.2336618795,0.238752303,0.24460701800000001,0.245548455,0.246643575,0.25634119700000002,0.257428186,0.26245528600000001,0.26642075999999998,0.28031494999999995],"655360":[0.148933907,0.15209763849999999,0.15361788400000001,0.15545560850000001,0.16013607749999997,0.16099877000000001,0.16235167850000001,0.166924295,0.16953149300000001,0.17354782699999999,0.17747918300000001],"69632":[0.0042142734999999999,0.0042267184999999997,0.0042453179999999997,0.0042816555000000003,0.0043017790000000004,0.0043392255000000001,0.0043430959999999977,0.0043450765000000004,0.0043667719999999997,0.0045553919999999984,0.0047264025000000017,0.0049992840000000014],"11264":[0.00033813814814814813,0.00034252599999999995,0.00034967549999999998,0.00034994099999999988,0.00035926799999999999,0.00036249970833333335,0.00036536553846153814,0.00037048099999999992,0.00037373699999999996,0.00037495412,0.00037576654166666652,0.00039173796000000003],"2752512":[0.77926860900000006,0.79856147799999999,0.82086508450000006,0.83833743650000003,0.84550343150000007,0.86532899799999996],"8126464":[2.4690508169999998,2.4696595009999998,2.4791485120000001,2.4961526429999998,2.5171300104999998,2.6254356240000001],"27648":[0.0010881221111111114,0.0010892130000000003,0.001104545,0.0011235430000000001,0.00114993525,0.0011519710000000001,0.0011543982500000001,0.0011751778750000001,0.0011780179999999999,0.0011840449999999999,0.0011967880000000001,0.0012305406250000001],"368":[7.8724999999999996e-06,7.9200487804878045e-06,8.0753300000000008e-06,8.3558700000000003e-06,8.418279999999999e-06,8.5849699999999996e-06,8.6566900000000006e-06,8.723290000000001e-06,8.8269899999999997e-06,8.8393300000000006e-06,9.0211052631578946e-06,9.5310000000000007e-06],"65536":[0.0038335175,0.0038876649999999998,0.0038983134999999989,0.0038988434999999997,0.0039055180000000002,0.0039195710000000002,0.0040502595000000002,0.0042476605000000001,0.0042797539999999985,0.0043026894999999999,0.0043594835000000023,0.004510440000000001],"16252928":[5.0510378490000001,5.1390111024999996,5.1403526399999997,5.3346681089999999,5.3447444065000003,5.4124453859999999],"464":[9.2635333333333337e-06,9.5428299999999999e-06,9.6653888888888884e-06,9.6890800000000004e-06,9.8126399999999993e-06,9.8234743589743594e-06,9.8709999999999992e-06,9.9357799999999993e-06,1.0053219999999999e-05,1.0210999999999999e-05,1.034875e-05,1.0903300000000001e-05],"1015808":[0.246484235,0.25930409199999999,0.26315522400000002,0.27056319099999998,0.27411658,0.2748436145,0.278308,0.27988685800000002,0.28425569899999997,0.28935934949999997],"3072":[8.7639000000000006e-05,8.7823571428571429e-05,8.9477250000000001e-05,9.1559090000000002e-05,9.2460999999999994e-05,9.2462857142857136e-05,9.430835714285715e-05,9.4723999999999996e-05,9.4879399999999998e-05,9.5093000000000006e-05,9.8095897959183683e-05,0.000103861],"110592":[0.0067823949999999992,0.006830381,0.0069488520000000002,0.0069599189999999976,0.0069862780000000003,0.0071752180000000023,0.0075136249999999977,0.007749349,0.0078262489999999952,0.0078690940000000001,0.0083496960000000002,0.011276531999999999],"237568":[0.024460140000000002,0.026463064000000001,0.030427147999999998,0.03084143,0.032370533999999992,0.035283061000000018,0.03535189950000002,0.040863860500000002,0.044408835000000001,0.048166634,0.048641767999999988,0.048981762999999998],"278528":[0.033283965000000013,0.04207067099999999,0.045777677999999995,0.046058795999999999,0.047750572000000005,0.047829807999999988,0.048578494,0.048795531500000003,0.04907772199999999,0.052203738,0.055722301999999925,0.063835151000000021],"496":[1.0107470000000001e-05,1.0152999999999999e-05,1.0224750000000001e-05,1.0603369999999999e-05,1.0858639999999999e-05,1.09035e-05,1.0913509999999999e-05,1.0957639999999999e-05,1.0971e-05,1.116525e-05,1.120298e-05,1.1265568627450979e-05],"13107200":[4.2011193330000003,4.2238884649999999,4.2809319659999998,4.3588255489999996,4.4264635060000002,4.4337769439999999],"9961472":[3.0279120389999998,3.0910962854999999,3.1369106790000001,3.1847045249999999,3.1940888759999999,3.2145760535000001],"5888":[0.000167252,0.00017444299999999996,0.00017507800000000001,0.00017736100000000001,0.0001785575849056604,0.000183389,0.00018378200000000001,0.0001843029245283018,0.0001844599999999999,0.00018510400000000001,0.00018538471698113212,0.00020201799999999999],"11010048":[3.2975751300000002,3.404121875,3.4468151379999998,3.5070002110000003,3.5408304875000001,3.60496098],"1920":[4.5938e-05,4.8489999999999998e-05,4.969486597938144e-05,5.0103153061224493e-05,5.0182459999999993e-05,5.0281999999999997e-05,5.0531129999999997e-05,5.0567769999999998e-05,5.0844000000000003e-05,5.0896000000000002e-05,5.2485530000000006e-05,5.4214279999999999e-05],"2490368":[0.68743112849999999,0.70281129399999998,0.73036550700000002,0.74277538899999995,0.75082508449999996,0.75181922550000002],"19456":[0.00056921200000000004,0.00060030599999999999,0.00060565400000000028,0.00061149646666666668,0.00061165900000000018,0.0006249309999999999,0.00063121724999999997,0.00063804413333333335,0.00063886499999999996,0.000639191,0.00066625899999999978,0.00067414242857142853],"57344":[0.0031861609999999999,0.003271787,0.0035261679999999997,0.0035430014999999981,0.003569123,0.0035917559999999989,0.003612339,0.0036518550000000003,0.003656917,0.0036605309999999981,0.0037711050000000012,0.003860961],"1179648":[0.30059417899999996,0.30444973400000003,0.31994172700000001,0.32350445300000003,0.32425736900000002,0.33145715399999998,0.33616919049999999,0.33634023400000002,0.33800156199999998,0.34508045799999998],"4718592":[1.342034087,1.3637030994999999,1.369551465,1.4009690720000001,1.4070629795,1.4248005545],"360448":[0.055096308999999996,0.064644377000000003,0.067731590999999966,0.068594744999999957,0.068721368500000019,0.068830577000000004,0.069995948499999974,0.072931951499999967,0.076798953000000017,0.080310276,0.080758619500000003,0.08806850699999999],"1572864":[0.40558194800000003,0.42459594350000002,0.42859261500000001,0.436012756,0.44672479999999998,0.45291700299999998,0.46901984299999999,0.47131959499999998,0.47493071549999999,0.48046255999999998],"53248":[0.002925956,0.002928094,0.0029855340000000002,0.0029950509999999994,0.0030238486666666667,0.0030572340000000011,0.0030820640000000002,0.0032012593333333324,0.003250494,0.0033031800000000002,0.0034540995000000006,0.0034568344999999999],"3456":[8.3398000000000003e-05,8.7035071428571428e-05,8.7945916666666658e-05,8.8143e-05,8.8343000000000004e-05,8.8880000000000003e-05,9.2256340000000002e-05,9.232275e-05,9.3377373737373742e-05,9.4496666666666666e-05,9.5718119565217394e-05,0.000100992],"40960":[0.0020885022499999998,0.0021225385000000008,0.0021322495000000016,0.0021589549999999993,0.0021653302500000008,0.0022633379999999989,0.002273022,0.002288675,0.0022890277500000008,0.0022946557500000001,0.0023127255,0.0026296383333333333],"4608":[0.00012025499999999999,0.00012758799999999996,0.00012908599999999999,0.00013007333333333332,0.00013055027868852457,0.00013360800000000001,0.000134401,0.000136067,0.00013807874999999999,0.0001400755857142857,0.00014220616417910442,0.00015226515217391304],"13824":[0.00036429399999999998,0.00037201428000000001,0.00037604045833333337,0.00037621424,0.00038663096000000007,0.00038862499999999997,0.000389439,0.00039227716666666665,0.00039816599999999998,0.00040254799999999997,0.00041220799999999985,0.00042589304347826086],"819200":[0.204399419,0.21436912499999999,0.21622086700000001,0.22000105149999999,0.22430707699999999,0.22448762799999999,0.22735645699999996,0.22841422450000001,0.22852124899999998,0.258671918],"983040":[0.23108061800000002,0.23771044450000001,0.25732952650000002,0.26209047350000003,0.2661205505,0.272013012,0.27321973199999999,0.27371007999999997,0.28305278499999997,0.28322164299999997],"8704":[0.00022782,0.00023517966666666666,0.00023728900000000007,0.00024497899999999993,0.00024498599999999999,0.00024646999999999994,0.000255116,0.0002557520000000001,0.00025744299999999999,0.00025780900000000007,0.0002619840000000001,0.00028298400000000001],"120":[2.3136000000000002e-06,2.3536199999999999e-06,2.3570700000000003e-06,2.37274e-06,2.4211699999999998e-06,2.4456210526315792e-06,2.4639399999999997e-06,2.4853600000000001e-06,2.4992025316455697e-06,2.5341399999999998e-06,2.5681499999999997e-06,2.5748900000000003e-06],"1024":[2.4111e-05,2.4119000000000001e-05,2.4474999999999999e-05,2.5071000000000001e-05,2.5082899999999997e-05,2.5086999999999999e-05,2.5456390000000002e-05,2.5547529999999998e-05,2.6072500000000002e-05,2.617142e-05,2.6391860000000001e-05,2.7105305084745761e-05],"49152":[0.002758052,0.0027673076666666664,0.0027699183333333333,0.0027755926666666675,0.0027982719999999988,0.0028540546666666671,0.002876988,0.0028853426666666671,0.0029317273333333326,0.0029779290000000007,0.0030114056666666672,0.0030570809999999993],"524288":[0.10957604899999999,0.11382113599999999,0.117444039,0.11988452049999998,0.12425731800000001,0.12644175799999999,0.13416534550000001,0.13669973999999999,0.13777043550000001,0.14537352649999999,0.14985340799999999],"45056":[0.0024367709999999995,0.0024556729999999998,0.0024595572500000001,0.0024957386666666671,0.0025218336666666665,0.0025252349999999998,0.0025412966666666669,0.0025669500000000001,0.0026279433333333334,0.0026288609999999997,0.0027075776666666673,0.0027408789999999999],"229376":[0.023189196000000002,0.023733401499999997,0.028431867,0.028624185999999989,0.031063003999999988,0.036032328999999988,0.042545092,0.044404444000000001,0.045058953000000013,0.047165190999999981,0.052273122999999998,0.060927019000000013],"2688":[7.5538259999999999e-05,7.5815000000000005e-05,7.6735249999999993e-05,7.7041888888888883e-05,7.7758999999999999e-05,7.7960875000000006e-05,7.797875999999999e-05,7.8578999999999994e-05,7.9295458333333328e-05,8.0587999999999995e-05,8.3209055555555554e-05,8.5124634920634928e-05],"152":[3.05086e-06,3.1121199999999999e-06,3.1127900000000002e-06,3.1933900000000004e-06,3.22684e-06,3.23014e-06,3.2628099999999998e-06,3.2651300000000003e-06,3.26854e-06,3.3271400000000001e-06,3.3595599999999997e-06,3.4251500000000001e-06],"5120":[0.00014807700000000001,0.00015107,0.00015138200000000001,0.00015196514285714292,0.00015268899999999999,0.00015313099999999998,0.00015315200000000001,0.00015358800000000005,0.000154618,0.00015474899999999995,0.00015650435,0.00015654500000000001],"1507328":[0.39822975399999999,0.405358987,0.40878278400000001,0.410212521,0.42092932399999999,0.42299589299999996,0.42542525899999994,0.42648876149999998,0.46964155800000001,0.47480742999999997],"1216":[3.0407666666666663e-05,3.0837999999999998e-05,3.1208889999999998e-05,3.1248999999999998e-05,3.141669e-05,3.1736000000000002e-05,3.2240571428571429e-05,3.2734119999999997e-05,3.3013769999999997e-05,3.31131e-05,3.3220499999999998e-05,3.3351030000000002e-05],"1966080":[0.51855532650000002,0.525679016,0.53700399099999996,0.54350599899999996,0.54901175999999996,0.55318815649999997,0.56301903099999995,0.56361193100000007,0.56886789250000003],"1900544":[0.51903338899999996,0.52110694000000002,0.53132501899999995,0.53795341600000002,0.539071737,0.54113498449999997,0.546147457,0.55677893349999996,0.55774094699999999],"184":[3.7985999999999999e-06,3.8326299999999999e-06,3.8557199999999999e-06,4.0012199999999996e-06,4.0454100000000001e-06,4.0541400000000001e-06,4.0611e-06,4.0696099999999998e-06,4.0879000000000003e-06,4.1129399999999995e-06,4.1173999999999997e-06,4.2358600000000001e-06],"7936":[0.00020049799999999999,0.00020185799999999999,0.00021020899999999999,0.00021467099999999991,0.00021505800000000001,0.000217135,0.000218531,0.0002202140000000001,0.00022123258536585363,0.00022614721951219504,0.00022630799999999999,0.00024059],"3801088":[1.0655441830000001,1.0815741619999999,1.0942171654999999,1.1108417305,1.1655321919999999,1.185591109],"6815744":[2.0105786999999999,2.0118243709999999,2.0487997189999998,2.087908536,2.0887612199999999,2.1316453885],"124":[2.3772299999999999e-06,2.4128399999999998e-06,2.4203750000000001e-06,2.4784400000000001e-06,2.4785299999999996e-06,2.5250799999999996e-06,2.5915699999999999e-06,2.6260100000000002e-06,2.6387699999999996e-06,2.6725600000000002e-06,2.7199199999999997e-06,2.7945099999999999e-06],"102400":[0.0069273589999999967,0.0069427580000000003,0.0069989790000000007,0.007344344,0.0074343830000000001,0.0074827500000000007,0.0074837610000000028,0.0074861440000000001,0.0076669569999999994,0.0076943599999999999,0.0077926750000000006,0.0078869879999999993],"311296":[0.047360386999999997,0.050284067000000009,0.050591743000000002,0.051062127500000019,0.053882186500000026,0.0609236955,0.061065773000000004,0.061853167000000008,0.062096742999999975,0.064876743000000001,0.06663721049999996,0.071202833999999965],"1408":[3.6325000000000002e-05,3.866311e-05,3.8787620000000003e-05,3.9024799999999999e-05,3.9463833333333333e-05,3.9526000000000001e-05,3.9891000000000001e-05,4.0262719999999998e-05,4.1399000000000001e-05,4.1742090000000001e-05,4.2912875000000005e-05,4.4556176470588236e-05],"393216":[0.072730135000000001,0.074046691499999998,0.074349117999999992,0.076029135999999969,0.079136943500000001,0.083413324999999983,0.083698991,0.084112633000000006,0.085963606999999997,0.088895236000000002,0.09092475199999997,0.09809255450000004],"4352":[0.000115627,0.00011638600000000003,0.000116765,0.000117366,0.000118013,0.00011856456451612911,0.00011951900000000001,0.00012118200000000006,0.00012278200000000005,0.00012548100000000001,0.00012648600000000001,0.000137062],"6553600":[2.0370280109999999,2.0516436320000002,2.1134372435,2.1267218400000001,2.1912501015000001,2.364640799],"20480":[0.00061368800000000004,0.00064911000000000027,0.00065862799999999997,0.00066530357142857135,0.00067737357142857156,0.00068948800000000004,0.00070231700000000026,0.00071053184615384624,0.00071473584615384619,0.00071903007692307691,0.00073294699999999996,0.00073986800000000008],"608":[1.3191e-05,1.3205e-05,1.3336929292929293e-05,1.3676354166666666e-05,1.379768e-05,1.3804519999999999e-05,1.3913459999999999e-05,1.4180530000000001e-05,1.418868e-05,1.421035e-05,1.4326720000000001e-05,1.44545e-05],"2228224":[0.60830956800000002,0.62237988700000002,0.62256545399999996,0.638667765,0.64248862650000005,0.64816652350000004],"36864":[0.0017967374000000009,0.0018031218000000009,0.0018177470000000002,0.0018339786,0.0018862639999999999,0.0019061218000000046,0.001947336,0.0019550585999999993,0.0019796917999999998,0.00199084375,0.0020648592499999999,0.0022687099999999993],"704":[1.5696999999999999e-05,1.5925990000000002e-05,1.6440710000000001e-05,1.6534838235294118e-05,1.6705486842105265e-05,1.6841631578947368e-05,1.6887810000000002e-05,1.7025100000000001e-05,1.7102160000000001e-05,1.724246e-05,1.7343500000000001e-05,1.7592e-05],"720896":[0.16022462800000001,0.16555629799999999,0.166333803,0.17368722850000001,0.17558174600000001,0.175997558,0.17749293250000001,0.17948169,0.18352756000000001,0.18793117200000001,0.20900406699999999],"800":[1.6691e-05,1.7079e-05,1.7269999999999999e-05,1.7429533333333333e-05,1.7490419999999999e-05,1.7584020000000001e-05,1.80212e-05,1.804867e-05,1.8212580000000001e-05,1.8399409999999999e-05,1.8568739130434784e-05,1.8688000000000001e-05],"2621440":[0.739412929,0.74582095599999998,0.75102444700000004,0.77840306400000003,0.79635133449999995,0.82297072900000001],"425984":[0.079183426500000015,0.08196537750000002,0.083387138,0.085952951,0.088187052999999987,0.092830183999999982,0.093359151000000001,0.09755536250000002,0.098431971000000007,0.09870364199999998,0.1001468125,0.10159894749999999],"32768":[0.0015249339999999999,0.001528789166666667,0.0015658710000000004,0.0015700529999999996,0.0015873786666666663,0.0015989190000000001,0.001604837,0.001610871,0.0016157789999999999,0.001633626,0.0017117720000000009,0.0021696889999999998],"12058624":[3.8314408979999999,3.876186423,3.9144290829999999,4.0063851640000001,4.0296816020000001,4.0364617489999999],"128":[2.42641e-06,2.52448e-06,2.5347399999999999e-06,2.5397499999999997e-06,2.5458000000000003e-06,2.6663300000000002e-06,2.6808199999999999e-06,2.6923700000000003e-06,2.7159000000000001e-06,2.7363599999999999e-06,2.7649800000000001e-06,2.8045899999999999e-06],"180224":[0.0139117105,0.013947216,0.013958755999999999,0.0154127955,0.015718267499999997,0.015837432500000005,0.016152922,0.016957679999999999,0.017013789499999994,0.017701317999999994,0.019491790999999998,0.019930386000000005],"224":[4.3606666666666662e-06,4.5333899999999998e-06,4.54073e-06,4.5567599999999999e-06,4.5695699999999999e-06,4.6218200000000001e-06,4.6895300000000001e-06,4.7325099999999999e-06,4.8285100000000003e-06,4.9183199999999997e-06,4.9890400000000003e-06,5.1824300000000001e-06],"736":[1.6691500000000001e-05,1.6961869999999999e-05,1.7232549999999998e-05,1.7289260000000001e-05,1.7395829999999999e-05,1.7531919999999999e-05,1.8050000000000002e-05,1.8163099999999999e-05,1.8277250000000002e-05,1.8378460000000001e-05,1.845085e-05,1.845536e-05],"320":[6.6662299999999994e-06,6.6717700000000007e-06,6.8497700000000005e-06,6.8968800000000003e-06,6.95399e-06,7.0118600000000003e-06,7.0357700000000001e-06,7.3018599999999992e-06,7.4108100000000001e-06,7.4681800000000002e-06,7.5452500000000003e-06,7.6040000000000004e-06],"557056":[0.116245055,0.12123571900000002,0.1276004825,0.12814155699999999,0.13657591599999999,0.13847796800000001,0.14018913999999999,0.1458709165,0.1480911875,0.153980479,0.15628694100000001],"832":[1.7641774999999999e-05,1.8082999999999999e-05,1.8562570000000002e-05,1.8649709999999999e-05,1.8720399999999998e-05,1.875313e-05,1.8789379999999999e-05,1.8885999999999998e-05,1.9100895833333333e-05,1.9123999999999999e-05,1.9318999999999999e-05,1.9726499999999998e-05],"9437184":[2.837243585,2.8905205700000001,2.9410563270000001,2.9694642375,2.9917520264999999,3.1313293980000001],"3584":[8.6155666666666672e-05,8.7424999999999997e-05,9.0173000000000006e-05,9.1881999999999999e-05,9.2119000000000004e-05,9.2409622222222208e-05,9.4505800000000006e-05,9.5156540000000006e-05,9.6675000000000005e-05,9.8195000000000004e-05,9.841042222222222e-05,0.00010623699999999999],"6291456":[1.923035662,1.930099743,1.949683842,1.952610621,1.960137808,1.9760485825],"256":[5.2373299999999994e-06,5.3253300000000001e-06,5.3436200000000005e-06,5.3644399999999992e-06,5.4080700000000004e-06,5.4087999999999998e-06,5.41344e-06,5.4686999999999998e-06,5.5436666666666666e-06,5.5893999999999994e-06,5.6284600000000001e-06,5.9405199999999998e-06],"15204352":[4.7252858509999998,4.8913326340000003,4.9377522340000004,4.9485570379999997,5.0032001499999996,5.0657243349999996],"28672":[0.001151378375,0.0011533610000000001,0.0011943499999999996,0.0012135853333333339,0.001222421,0.0012355280000000001,0.0012489862857142857,0.001251374,0.0012565898571428571,0.0012648498571428571,0.0013167019999999999,0.0013259635714285714],"768":[1.8645539999999999e-05,1.8798000000000002e-05,1.8855090000000001e-05,1.893799e-05,1.9043709999999999e-05,1.9361548780487805e-05,1.9482250000000001e-05,1.9978259999999999e-05,2.002579e-05,2.0119159999999999e-05,2.0879380000000001e-05,2.1127919999999999e-05],"212992":[0.020175561999999998,0.022249685000000002,0.022304289000000001,0.025578225500000006,0.025708107000000001,0.028598171500000002,0.031203228999999999,0.032612335999999999,0.034619366499999998,0.035181779000000024,0.038737298499999996,0.044564220000000015],"864":[1.8471e-05,1.8694989999999999e-05,1.8985960000000001e-05,1.9290880000000001e-05,1.9441679999999999e-05,1.97118e-05,1.9831999999999999e-05,1.995e-05,2.0007260000000001e-05,2.013447e-05,2.0171000000000001e-05,2.0361e-05],"352":[7.3374166666666661e-06,7.6955400000000005e-06,7.8700099999999999e-06,8.0025e-06,8.0059436619718303e-06,8.0577999999999993e-06,8.0815099999999995e-06,8.1012999999999998e-06,8.2462900000000003e-06,8.2766899999999992e-06,8.4781900000000006e-06,8.492750000000001e-06],"253952":[0.03342477499999999,0.033957663000000013,0.034647549500000006,0.035891503000000012,0.038601870999999996,0.040108056999999989,0.041845267000000005,0.043916145000000011,0.045139957000000015,0.048988799999999999,0.050863267000000011,0.066270628499999998],"960":[2.0791499999999999e-05,2.1743666666666666e-05,2.2334999999999999e-05,2.2364540000000002e-05,2.2714129999999999e-05,2.3351166666666664e-05,2.3458789999999999e-05,2.3462764705882354e-05,2.3603174418604652e-05,2.37495e-05,2.4014000000000001e-05,2.4266962499999997e-05],"24576":[0.00089218100000000025,0.00090382199999999998,0.00092344469999999985,0.00093318519999999931,0.00094000000000000008,0.00094179099999999966,0.00094694439999999972,0.00094740129999999604,0.0009581984999999999,0.00097009020000000045,0.00098519111111111082,0.00099443200000000039],"7680":[0.00019238300000000002,0.00019382699999999999,0.000204532,0.00020737650000000004,0.00020953550000000001,0.00021242,0.000212656,0.00021317599999999998,0.00021400973170731711,0.00021783499999999994,0.00022639200000000001,0.00023551799999999994],"294912":[0.0385503315,0.043192434500000002,0.045208577999999999,0.046787314999999996,0.048434257999999987,0.050690395000000013,0.051958857000000004,0.058749999000000018,0.061094209999999996,0.063215206999999982,0.065514326000000012,0.068479038500000047],"1048576":[0.26034621099999999,0.26091860700000002,0.26421696500000003,0.26644701400000004,0.27686659400000002,0.28383374300000003,0.28444312849999998,0.28807070099999998,0.30852175999999998,0.32840840100000002],"10485760":[3.2544081839999999,3.2677304779999998,3.2697258075,3.3331285815,3.4355603889999999,3.4440678204999999],"344064":[0.052162446000000015,0.059526393499999997,0.061237390999999988,0.062721710999999986,0.064362960499999997,0.064541781000000034,0.064943538999999967,0.06835767199999998,0.068562181,0.075721640500000006,0.078945850000000012,0.08265414950000001],"288":[6.0905599999999995e-06,6.1083333333333339e-06,6.1942400000000002e-06,6.2524700000000003e-06,6.2822099999999996e-06,6.3271900000000003e-06,6.3648000000000005e-06,6.37276e-06,6.5417100000000003e-06,6.5736400000000003e-06,6.6352399999999999e-06,8.7651300000000006e-06],"1152":[2.8325000000000001e-05,2.8922520000000001e-05,2.9280000000000001e-05,2.9649149999999997e-05,3.0088000000000001e-05,3.0216250000000001e-05,3.041579e-05,3.0439339999999998e-05,3.0890450000000002e-05,3.1106250000000001e-05,3.1234169999999998e-05,3.1513999999999997e-05],"384":[8.3446666666666665e-06,8.6179500000000011e-06,8.6850099999999997e-06,8.7225899999999994e-06,8.8359499999999997e-06,8.9347600000000002e-06,8.9778900000000002e-06,9.0216199999999999e-06,9.0564000000000002e-06,9.1430399999999998e-06,9.3432799999999994e-06,9.4071100000000008e-06],"2304":[5.9531999999999999e-05,6.0649534482758618e-05,6.1221000000000002e-05,6.2117000000000002e-05,6.3121235294117653e-05,6.3872000000000001e-05,6.4115999999999994e-05,6.4303219999999999e-05,6.4678000000000007e-05,6.4988999999999997e-05,6.7083839999999999e-05,6.9448049999999993e-05],"896":[1.9262999999999998e-05,1.9513309999999999e-05,2.026418e-05,2.0649700000000003e-05,2.069184e-05,2.076947e-05,2.089816e-05,2.0922999999999999e-05,2.10855e-05,2.1134000000000001e-05,2.130693e-05,2.266306e-05],"480":[9.8172800000000003e-06,9.9655600000000005e-06,1.011126e-05,1.016687e-05,1.03713e-05,1.0399109999999999e-05,1.053788e-05,1.0601429999999999e-05,1.0842169999999999e-05,1.0853333333333333e-05,1.1007140000000001e-05,1.1494980000000001e-05],"1441792":[0.38360280600000002,0.40625402300000002,0.40734986499999998,0.41047369550000001,0.41331562900000002,0.41492295000000001,0.41999148399999997,0.42264407450000002,0.42680277499999997,0.46573867499999999],"992":[2.1437499999999999e-05,2.2889000000000001e-05,2.2976000000000002e-05,2.330179e-05,2.3728030000000003e-05,2.4244e-05,2.4791069999999998e-05,2.4840219999999998e-05,2.4856119999999999e-05,2.496031e-05,2.5137e-05,2.536085e-05],"3968":[9.7722333333333331e-05,0.00010088709090909091,0.000100954,0.000101939,0.000106747,0.0001079169230769231,0.000108569,0.0001100875,0.00011058833333333334,0.00011093654545454546,0.000111941,0.00011766419277108435],"6400":[0.0001928105,0.00019730299999999994,0.00019733833333333332,0.00019840299999999999,0.00020406777083333333,0.00020449999999999998,0.00020520684444444451,0.00020762218750000001,0.00020802599999999991,0.000208533,0.00021101373170731713,0.00021290397727272725],"1344":[3.4609e-05,3.4643429999999996e-05,3.5423999999999998e-05,3.6716659999999998e-05,3.6727999999999998e-05,3.6912000000000002e-05,3.7389350000000001e-05,3.787995e-05,3.791928e-05,3.8804000000000003e-05,3.9301999999999997e-05,4.0525129999999998e-05],"126976":[0.007989108,0.0082464270000000006,0.0085157870000000004,0.0085595310000000004,0.0086109229999999995,0.0090503880000000012,0.0095250000000000005,0.0098174294999999936,0.0101578525,0.010269916,0.0105273665,0.015400038999999999],"2883584":[0.85502019600000001,0.8568507085,0.85956220699999997,0.86891598049999996,0.87200566800000001,0.87638916099999997],"753664":[0.17136698100000003,0.17644320099999999,0.1769965755,0.17811647900000005,0.18004299750000002,0.199009881,0.20588867850000001,0.20811329149999999,0.21452507700000001,0.21543664400000001,0.226982029],"16384":[0.00045416,0.00045775300000000014,0.0004635475000000002,0.00046389139999999983,0.000472094,0.00047362644999999993,0.00048590868421052635,0.00048726300000000004,0.00049165199999999987,0.00049663216666666669,0.00052071416666666661,0.00055625900000000014],"131072":[0.0083264670000000006,0.008773365,0.0088153990000000033,0.0088331780000000006,0.0094143070000000002,0.0094892964999999992,0.0097596340000000153,0.009829763,0.009888539,0.010163825999999996,0.010265577,0.015658368999999998],"458752":[0.089398930000000001,0.089555179999999998,0.0925132335,0.092650250000000003,0.094304614000000037,0.096705643000000022,0.101802025,0.1046482285,0.10617652499999999,0.10948298099999999,0.110802382,0.11468001950000001],"172032":[0.012563096499999999,0.012840266999999999,0.0137317345,0.013844512,0.0141488675,0.014519276999999997,0.014613461499999999,0.0150378445,0.015171284,0.015528337499999999,0.018861808000000008,0.027056679],"12288":[0.00039146020833333338,0.0003946419999999999,0.00039813316666666664,0.000400078,0.00040251000000000002,0.00040538100000000007,0.00040979999999999999,0.00041078700000000002,0.00041166966666666651,0.00041740560869565218,0.00042399691304347822,0.000444747],"14680064":[4.6106284735000003,4.671897296,4.7548753469999996,4.777720779,4.8029181830000001,4.9198003139999997],"1536":[4.1349e-05,4.1353000000000002e-05,4.3708000000000002e-05,4.4027169999999995e-05,4.4118259999999998e-05,4.4192142857142856e-05,4.4794444444444448e-05,4.6221680000000004e-05,4.6969960000000003e-05,4.8436890000000003e-05,4.8741870000000006e-05,5.0222249999999998e-05],"25600":[0.00097111988888888871,0.00098191233333333331,0.000997375,0.0010022938888888885,0.0010051752222222225,0.001022933,0.0010469630000000004,0.0010572657777777775,0.0010602739999999999,0.0010612835000000001,0.00107384975,0.001107079],"1835008":[0.486773342,0.49304356700000002,0.50465521400000002,0.51335676350000004,0.51558301100000004,0.51643222700000002,0.53621457449999999,0.54706605699999999,0.54814993649999999],"10752":[0.00031752349999999996,0.00033125099999999985,0.00033202399999999999,0.00033463900000000002,0.00033886146428571418,0.00033922974999999996,0.00034023260714285709,0.00034071714285714282,0.000343906,0.00034541953571428578,0.00035566726923076918,0.00037394269230769234],"21504":[0.00068260399999999963,0.00070996699999999993,0.00072742200000000003,0.00073455500000000034,0.00073665315384615379,0.00073746830769230763,0.00074919500000000003,0.00076689800000000002,0.00077060608333333336,0.000772557,0.00078281000000000032,0.00084427709090909107],"7602176":[2.201614186,2.2693520129999998,2.3001515179999998,2.3226688195,2.335589513,2.3959442740000001],"5632":[0.00015552899999999995,0.000160044,0.00016445900000000007,0.000166498,0.00016903466666666665,0.00017022039285714285,0.00017029831578947366,0.00017379,0.00017416,0.00017710533928571432,0.00017876909615384615,0.00018036799999999998],"10":[1.7881e-07,1.7929000000000001e-07,1.8243000000000003e-07,1.8626999999999999e-07,1.8777999999999998e-07,1.8839999999999999e-07,1.8994000000000002e-07,1.9083e-07,1.9177999999999999e-07,1.9673999999999997e-07,1.9718e-07,2.0270999999999999e-07],"3145728":[0.91133338050000001,0.91771899999999995,0.94783494599999996,0.96308351550000004,0.96344119549999996,0.99229029899999999],"245760":[0.0311913755,0.032959625000000034,0.03303994599999998,0.036481430000000002,0.036870753999999999,0.037792030499999997,0.037801551000000003,0.041158455500000003,0.04158681500000002,0.042440317999999998,0.050414255999999977,0.056339707999999988],"1728":[3.9795500000000002e-05,3.9839999999999998e-05,4.1628999999999997e-05,4.1999178571428568e-05,4.2065239999999994e-05,4.2855000000000002e-05,4.3595350000000003e-05,4.4165439999999998e-05,4.4449550000000005e-05,4.4461e-05,4.6744760000000004e-05,4.7830000000000001e-05],"11":[2.0098999999999998e-07,2.0109000000000001e-07,2.0165000000000001e-07,2.0486999999999998e-07,2.0732999999999999e-07,2.0755999999999999e-07,2.1215e-07,2.1427999999999998e-07,2.1705e-07,2.1889e-07,2.276e-07,2.3871e-07],"1114112":[0.2849854725,0.29371143199999999,0.29416208399999999,0.29644297600000002,0.30536602700000004,0.30763668300000002,0.31028529900000001,0.31509215000000002,0.325079285,0.32649018950000003],"12":[1.984e-07,2.0873000000000002e-07,2.1047999999999999e-07,2.1087000000000001e-07,2.1455999999999998e-07,2.1860000000000001e-07,2.2255999999999998e-07,2.2298e-07,2.2322000000000001e-07,2.3076000000000001e-07,2.3195999999999999e-07,2.3223999999999999e-07],"7340032":[2.112066768,2.2270208039999999,2.2281255170000001,2.2592121404999999,2.2684494549999998,2.3151311520000002],"7168":[0.00017737100000000001,0.000183155,0.00018920285714285715,0.00018946739215686272,0.00019273549999999998,0.00019276933333333337,0.00019674650000000007,0.00020238640425531917,0.00020459093749999996,0.00020630423404255317,0.00020659200000000002,0.000214926],"13":[2.2634999999999999e-07,2.2641e-07,2.2692e-07,2.3221000000000001e-07,2.3252999999999998e-07,2.3318e-07,2.3495000000000002e-07,2.3801000000000002e-07,2.3835000000000001e-07,2.4596000000000001e-07,2.4867000000000002e-07,2.5365e-07],"6029312":[1.7677696140000001,1.8683201760000001,1.9182595199999999,1.9195195759999999,1.9238946770000001,1.9285226664999999],"14":[2.3802000000000001e-07,2.4871000000000001e-07,2.5746000000000003e-07,2.5921e-07,2.5950000000000001e-07,2.5953e-07,2.6128000000000002e-07,2.6216000000000001e-07,2.6587000000000004e-07,2.6894999999999998e-07,2.7155000000000002e-07,2.7164000000000002e-07],"3200":[9.0945000000000004e-05,9.2344999999999998e-05,9.4889999999999994e-05,9.5313e-05,9.5933000000000005e-05,9.8841714285714287e-05,9.9162999999999999e-05,0.00010003537499999999,0.000101277,0.00010137973863636365,0.00010362196739130433,0.000108955],"20":[3.6572999999999998e-07,3.6620999999999999e-07,3.7546999999999996e-07,3.7889999999999998e-07,3.8285999999999998e-07,3.8432954545454545e-07,3.8520999999999999e-07,3.8529000000000003e-07,3.9168999999999998e-07,3.995e-07,4.2557000000000002e-07,4.4209000000000001e-07],"204800":[0.017671050000000001,0.0181190315,0.018400023000000001,0.019479549999999998,0.019829265500000002,0.020234990500000001,0.021758471500000001,0.021848970000000002,0.024863912999999998,0.027452248000000002,0.027907119000000001,0.038113622],"15":[2.6800999999999998e-07,2.7188999999999998e-07,2.7389000000000003e-07,2.7430999999999997e-07,2.7511000000000003e-07,2.7571000000000003e-07,2.8024999999999998e-07,2.8402000000000002e-07,2.8515999999999999e-07,2.9317999999999998e-07,2.9892000000000003e-07,2.9918999999999997e-07],"13312":[0.000351904,0.000353677,0.00035432300000000014,0.00035647452380952393,0.00036302299999999997,0.00036308199999999998,0.00037686800000000009,0.00037760800000000003,0.00037791632000000003,0.00037853726923076949,0.00037985300000000004,0.00040212154166666657],"4980736":[1.4345166490000001,1.4487171299999999,1.4862278390000001,1.4943199985,1.4945636680000001,1.5090121485000001],"118784":[0.0073832100000000012,0.0074459300000000016,0.0074637499999999999,0.0075121940000000024,0.0077408630000000006,0.0077607009999999992,0.0079955189999999995,0.0080475260000000028,0.0081966059999999952,0.0085370870000000005,0.008553818000000003,0.0085885200000000005],"51200":[0.0028966729999999998,0.002900484,0.0029236209999999995,0.0029400193333333335,0.0029737063333333336,0.002975919,0.0029764729999999994,0.0030001529999999998,0.0030072883333333343,0.0030463319999999988,0.003195163,0.0031990320000000001],"16":[2.9002e-07,2.9014000000000003e-07,2.9116000000000002e-07,2.9568000000000001e-07,2.9601999999999997e-07,2.9815000000000001e-07,3.0331999999999999e-07,3.0707999999999997e-07,3.0966000000000003e-07,3.1369e-07,3.1950999999999998e-07,3.2046e-07],"21":[3.8160000000000003e-07,3.8188000000000003e-07,3.8206000000000002e-07,3.9622000000000004e-07,3.9976999999999999e-07,4.0639999999999999e-07,4.1059000000000003e-07,4.1106000000000003e-07,4.2434e-07,4.3631999999999998e-07,4.5000999999999999e-07,4.5880000000000001e-07],"917504":[0.21556856699999999,0.21690662249999998,0.22109705899999998,0.22328527050000002,0.22558992150000001,0.22662481750000002,0.23062295899999996,0.23573011599999999,0.24456323600000002,0.27011942500000002],"22":[4.1226000000000001e-07,4.1274999999999999e-07,4.2221000000000002e-07,4.2521000000000003e-07,4.2586000000000003e-07,4.2586000000000003e-07,4.2609999999999998e-07,4.3449999999999998e-07,4.4295000000000003e-07,4.5515e-07,4.6937000000000003e-07,4.9386e-07],"4864":[0.000131636,0.00013207600000000001,0.000134177,0.000136725,0.00014013047619047624,0.00014215492753623187,0.00014304199999999999,0.00014321547540983609,0.00014661200000000001,0.00014830242857142859,0.00015539549999999999,0.000155914],"17":[3.0595000000000001e-07,3.1426000000000001e-07,3.1576999999999997e-07,3.1656999999999998e-07,3.1977000000000001e-07,3.1980000000000004e-07,3.2015999999999998e-07,3.2121e-07,3.3486999999999998e-07,3.3550999999999996e-07,3.3809000000000003e-07,3.3856999999999999e-07],"14848":[0.00039980300000000012,0.00040125999999999996,0.00041059995652173908,0.00041385469565217395,0.0004165317826086955,0.00041782099999999997,0.00041948500000000009,0.00043658554545454554,0.00043894595238095225,0.0004430933333333333,0.00045586480952380964,0.00047797300000000013],"23":[4.2175000000000003e-07,4.3198000000000003e-07,4.3942e-07,4.3943000000000001e-07,4.4154999999999998e-07,4.4182999999999998e-07,4.488e-07,4.5105000000000001e-07,4.6298000000000003e-07,4.7450999999999998e-07,4.8390000000000004e-07,5.1564000000000003e-07],"786432":[0.19508924500000002,0.19553060750000001,0.197975289,0.20300330899999999,0.20897444300000001,0.21630321949999998,0.21755665099999999,0.223289079,0.2248099335,0.22967481300000001,0.23430836499999999],"18":[3.2787000000000004e-07,3.2826e-07,3.2846999999999998e-07,3.3105000000000004e-07,3.4276000000000003e-07,3.4353000000000001e-07,3.4499999999999998e-07,3.5126999999999999e-07,3.5378999999999999e-07,3.5577999999999997e-07,3.6670000000000002e-07,3.6837000000000001e-07],"1638400":[0.44624972800000001,0.4757751945,0.47602127500000002,0.47680446100000001,0.47681295299999998,0.4809460955,0.48232627550000001,0.48734180500000002,0.50233781450000003,0.51364279300000004],"7864320":[2.3598524489999999,2.3826835389999999,2.4565268339999999,2.463538346,2.4638808289999998,2.484377378],"24":[4.2880999999999999e-07,4.3383000000000001e-07,4.3786999999999999e-07,4.3939000000000002e-07,4.4715999999999999e-07,4.5037999999999999e-07,4.5357e-07,4.5693e-07,4.6588000000000004e-07,4.7287000000000002e-07,4.7386000000000004e-07,4.9058999999999995e-07],"14155776":[4.3958948529999997,4.4352402414999998,4.4694674179999998,4.4790032249999996,4.5796499309999996,4.6274092475000002],"19":[3.5024000000000004e-07,3.5049999999999997e-07,3.5255000000000002e-07,3.5273000000000001e-07,3.5358000000000002e-07,3.5441000000000001e-07,3.6455000000000002e-07,3.6646000000000001e-07,3.6892e-07,3.8019999999999998e-07,3.9079000000000002e-07,4.1006000000000001e-07],"30":[5.5061999999999999e-07,5.7189000000000002e-07,5.7581000000000002e-07,5.8102000000000005e-07,5.8186000000000005e-07,5.8434e-07,5.9454999999999999e-07,5.9607999999999997e-07,6.0201999999999993e-07,6.0813000000000003e-07,6.2230999999999991e-07,6.5858000000000001e-07],"25":[4.4978999999999995e-07,4.5586000000000001e-07,4.5621000000000003e-07,4.6144999999999999e-07,4.6363000000000003e-07,4.6703999999999998e-07,4.6879e-07,4.7196e-07,4.7827000000000006e-07,4.8388000000000002e-07,4.9033000000000008e-07,5.1623999999999997e-07],"31":[5.7975000000000004e-07,5.9192000000000002e-07,5.9548000000000004e-07,5.9861000000000004e-07,6.0025999999999995e-07,6.0366999999999995e-07,6.0449999999999999e-07,6.0612000000000003e-07,6.2367999999999993e-07,6.2867999999999999e-07,6.3032000000000005e-07,6.3948999999999991e-07],"1280":[3.1767000000000003e-05,3.2630469999999997e-05,3.3729149999999999e-05,3.3965489999999998e-05,3.3992000000000003e-05,3.4571499999999999e-05,3.4647000000000002e-05,3.4821789999999999e-05,3.5291426829268291e-05,3.6727999999999998e-05,3.751555e-05,3.7639000000000003e-05],"26":[4.6292999999999998e-07,4.6805000000000001e-07,4.8811999999999995e-07,4.8869000000000002e-07,4.8894000000000004e-07,4.8965000000000005e-07,4.9414e-07,4.9805000000000004e-07,5.0289000000000003e-07,5.0401000000000002e-07,5.1037000000000004e-07,5.2540999999999994e-07],"3932160":[1.0901379529999999,1.134799154,1.1524872100000001,1.1583259800000001,1.165845759,1.1735707099999999],"2432":[6.4393520833333335e-05,6.5358999999999995e-05,6.5825666666666669e-05,6.6565999999999999e-05,6.7057921052631576e-05,6.8504439999999997e-05,6.8549999999999999e-05,6.8596389999999992e-05,6.9320510000000002e-05,6.9326000000000007e-05,6.9358500000000003e-05,7.3190520000000005e-05],"32":[5.9029000000000003e-07,6.0913e-07,6.1325000000000002e-07,6.1920000000000004e-07,6.257000000000001e-07,6.3021999999999994e-07,6.3033000000000001e-07,6.3355999999999991e-07,6.337399999999999e-07,6.4606999999999996e-07,6.6625999999999993e-07,6.7164999999999996e-07],"27":[4.8238999999999997e-07,5.0903999999999996e-07,5.1226000000000001e-07,5.1693999999999992e-07,5.1852000000000001e-07,5.2124999999999999e-07,5.2148999999999994e-07,5.2602000000000005e-07,5.3214999999999996e-07,5.3595999999999999e-07,5.3824000000000003e-07,5.4822999999999998e-07],"409600":[0.071260968999999966,0.072880354000000008,0.074794025,0.075103012999999996,0.075460009000000008,0.077112888000000004,0.080660635999999994,0.081366538500000002,0.083371498000000016,0.085601951000000037,0.090061821,0.10148684199999999]}},{"title":"Set successful contains","results":{"28":[2.3535e-07,2.4133e-07,2.4500999999999999e-07,2.4848999999999997e-07,2.4901000000000003e-07,2.5060999999999999e-07,2.5092999999999998e-07,2.5326000000000003e-07,2.5507999999999998e-07,2.5965999999999998e-07,2.6240000000000002e-07],"34":[2.8677999999999998e-07,2.8783e-07,2.8985999999999998e-07,2.9922e-07,2.9933999999999998e-07,2.9933999999999998e-07,3.0194000000000002e-07,3.0221e-07,3.0501e-07,3.0529e-07,3.1084999999999995e-07],"29":[2.4603000000000004e-07,2.4803999999999999e-07,2.5592000000000003e-07,2.5829000000000002e-07,2.6026000000000003e-07,2.6026999999999999e-07,2.6591999999999999e-07,2.6800999999999998e-07,2.7033000000000001e-07,2.7405e-07,2.7513e-07],"40":[3.4431000000000004e-07,3.4835000000000002e-07,3.5305e-07,3.5955999999999997e-07,3.5988000000000002e-07,3.664e-07,3.6755000000000003e-07,3.6792999999999999e-07,3.6853000000000003e-07,3.7756999999999996e-07,3.7799999999999997e-07],"17408":[0.000221132,0.00023247200000000001,0.00024003963414634147,0.00024382915000000009,0.00024508214999999998,0.00024521300000000009,0.00024573299999999999,0.00025114150000000009,0.00026374664864864861,0.00026762686486486487,0.00027247602777777787],"1472":[1.6374666666666668e-05,1.6666999999999998e-05,1.6988000000000001e-05,1.7285000000000001e-05,1.7901840000000001e-05,1.7938999999999999e-05,1.8000740000000001e-05,1.8168959999999999e-05,1.894085e-05,1.9115800000000001e-05,1.9302285714285716e-05],"112":[9.4030999999999998e-07,9.5650999999999993e-07,9.5883000000000002e-07,9.6255e-07,9.8223999999999993e-07,9.9402439024390239e-07,9.9454000000000001e-07,9.9556e-07,1.00692e-06,1.03493e-06,1.0378100000000001e-06],"1376256":[0.060228525000000019,0.064762444000000002,0.065561467000000012,0.066481946,0.066518946999999967,0.070271556999999998,0.0705517165,0.078353948000000007,0.078930075999999974,0.084276661999999974],"5242880":[0.34650010199999998,0.34687625799999999,0.34707910199999997,0.34720869700000001,0.34737473149999998,0.35344745200000005],"36":[3.0354000000000003e-07,3.0972e-07,3.1038999999999996e-07,3.1134999999999999e-07,3.1659999999999996e-07,3.1720999999999997e-07,3.2312e-07,3.248e-07,3.2830999999999995e-07,3.3349e-07,3.4275000000000002e-07],"42":[3.6263999999999997e-07,3.6744000000000001e-07,3.7425000000000001e-07,3.7637999999999999e-07,3.7691999999999996e-07,3.7781000000000002e-07,3.8121000000000001e-07,3.8309999999999998e-07,3.8668000000000002e-07,3.9346999999999999e-07,4.1127e-07],"11534336":[0.83253703099999998,0.84388420100000006,0.84898044849999998,0.84930148900000002,0.85399989899999995,0.85951901899999994],"114688":[0.0020439535,0.0020481310000000003,0.0020701077500000003,0.0020844430000000009,0.002093854,0.0020957397499999993,0.0021278344999999992,0.0021289837500000006,0.0021835847499999993,0.0022075142499999993,0.0022727110000000002],"144":[1.2243599999999998e-06,1.2365900000000001e-06,1.2454900000000001e-06,1.2636700000000001e-06,1.2789589041095891e-06,1.2825e-06,1.2932800000000001e-06,1.3008999999999999e-06,1.30384e-06,1.35754e-06,1.4613600000000001e-06],"38":[3.1996999999999997e-07,3.2250999999999999e-07,3.2975999999999996e-07,3.4054999999999996e-07,3.4091999999999996e-07,3.4435999999999999e-07,3.4953999999999999e-07,3.5132999999999996e-07,3.5519000000000005e-07,3.5862999999999998e-07,3.6251000000000003e-07],"240":[2.02383e-06,2.0574500000000001e-06,2.06323e-06,2.06607e-06,2.1373099999999997e-06,2.1408299999999999e-06,2.14763e-06,2.14941e-06,2.1530400000000002e-06,2.1617399999999998e-06,2.2387299999999998e-06],"9216":[0.000115714,0.000120049,0.00012054166666666666,0.00012134900000000001,0.00012810499999999999,0.00012813014473684209,0.00013048667567567567,0.00013189199999999999,0.00013323300000000007,0.00013323800000000001,0.000133254],"44":[3.7012999999999999e-07,3.8191000000000001e-07,3.8704e-07,3.9124e-07,3.9797000000000001e-07,4.0109e-07,4.0126999999999999e-07,4.0815999999999997e-07,4.0818999999999995e-07,4.1248e-07,4.1300000000000001e-07],"1664":[1.5871000000000001e-05,1.6609500000000001e-05,1.6690830000000002e-05,1.7110940000000002e-05,1.7358670000000002e-05,1.7401160000000003e-05,1.7527759999999999e-05,1.7557607142857143e-05,1.7598e-05,1.8801449999999999e-05,1.899364e-05],"196608":[0.004582376,0.0046089455000000003,0.0046309665,0.0046740500000000008,0.0047090830000000011,0.0047381259999999996,0.0047435900000000015,0.0047873265000000012,0.004830811,0.0048380589999999996,0.0050440319999999986],"155648":[0.0031017520000000002,0.0031388470000000002,0.003150211,0.003177245,0.0032147170000000002,0.0032229163333333337,0.0032232749999999998,0.0032247753333333336,0.003232009000000001,0.003463032,0.0036349654999999989],"2816":[3.5187e-05,3.7172000000000003e-05,3.75045e-05,3.7728821428571432e-05,3.8617500000000001e-05,3.8653360000000002e-05,3.8855e-05,3.9372227272727271e-05,3.9917950000000003e-05,3.9956990000000003e-05,4.0179950000000001e-05],"50":[4.1911e-07,4.2163000000000005e-07,4.2165000000000002e-07,4.2742e-07,4.383e-07,4.4168999999999998e-07,4.4370999999999999e-07,4.4466999999999997e-07,4.6078000000000003e-07,4.6239e-07,4.6381000000000002e-07],"2359296":[0.13376972949999999,0.13493408700000001,0.13864456400000003,0.13927103199999999,0.14342664350000001,0.144818005],"46":[4.0574000000000003e-07,4.0831000000000003e-07,4.0987e-07,4.1375999999999997e-07,4.1418999999999998e-07,4.1665000000000002e-07,4.2626000000000001e-07,4.3402000000000002e-07,4.3603000000000002e-07,4.3803000000000001e-07,4.5428000000000002e-07],"176":[1.5273000000000002e-06,1.5647499999999999e-06,1.6009e-06,1.60488e-06,1.60578e-06,1.61032e-06,1.6131500000000002e-06,1.6264400000000001e-06,1.6592599999999999e-06,1.6919299999999998e-06,1.69541e-06],"52":[4.3583000000000001e-07,4.4337999999999999e-07,4.4502e-07,4.5216000000000005e-07,4.5872999999999998e-07,4.6077000000000002e-07,4.6106999999999999e-07,4.7588e-07,4.7770999999999995e-07,4.7782999999999998e-07,4.8307999999999996e-07],"272":[2.3230099999999999e-06,2.3302199999999999e-06,2.3599499999999997e-06,2.36889e-06,2.4355300000000002e-06,2.4485899999999999e-06,2.4989400000000002e-06,2.5074899999999999e-06,2.527835164835165e-06,2.57973e-06,2.5807500000000002e-06],"116":[9.8245999999999987e-07,9.9089000000000005e-07,9.9454000000000001e-07,9.9881999999999999e-07,1.01503e-06,1.01878e-06,1.02613e-06,1.04431e-06,1.04589e-06,1.04741e-06,1.09146e-06],"47104":[0.00077941400000000008,0.00081427500000000005,0.00081622725000000018,0.00081929600000000028,0.0008224905,0.00082276199999999978,0.00083414200000000017,0.000835088,0.00083824599999999996,0.00085844999999999997,0.00085960999999999969],"6912":[7.5226000000000001e-05,7.8081e-05,7.8155624999999996e-05,8.0066240000000005e-05,8.1417526315789464e-05,8.1712555555555559e-05,8.2175999999999994e-05,8.3305105263157894e-05,8.4170941176470583e-05,8.4677615384615379e-05,8.680824999999999e-05],"1856":[1.859901e-05,1.9157e-05,1.963288775510204e-05,1.9799000000000001e-05,2.017971e-05,2.0205000000000001e-05,2.0220999999999998e-05,2.0463650000000002e-05,2.0600369999999998e-05,2.134656e-05,2.1499192307692308e-05],"48":[4.2e-07,4.2579e-07,4.3083e-07,4.3193999999999999e-07,4.3483999999999999e-07,4.4105e-07,4.4130000000000001e-07,4.4597000000000002e-07,4.6338000000000001e-07,4.7620999999999995e-07,4.9230000000000003e-07],"2097152":[0.1143026815,0.11709272799999999,0.11820270250000001,0.119490806,0.120085804,0.12038291800000001,0.12070186300000001,0.12210947649999999],"54":[4.5195999999999998e-07,4.5362999999999997e-07,4.5476000000000003e-07,4.5950000000000001e-07,4.7095999999999998e-07,4.7101999999999999e-07,4.7230000000000001e-07,4.7623999999999998e-07,4.7627000000000002e-07,4.9824999999999995e-07,6.4811000000000005e-07],"2031616":[0.11120158400000001,0.113423415,0.1135090285,0.113552947,0.113852548,0.11417372050000001,0.11555209499999999,0.11990598800000001,0.123693083],"43008":[0.00069431099999999997,0.00069746646153846152,0.00069792378571428555,0.0007116389999999998,0.00071195099999999984,0.00071694800000000013,0.000723805,0.00073638653846153849,0.00073855241666666662,0.00073912738461538469,0.00078173199999999993],"60":[5.0969000000000001e-07,5.1178999999999995e-07,5.2610999999999999e-07,5.2651999999999998e-07,5.3062999999999993e-07,5.3094000000000001e-07,5.3453999999999997e-07,5.3587000000000005e-07,5.5158999999999998e-07,5.5252000000000003e-07,5.5965999999999997e-07],"30720":[0.00040601600000000004,0.00041426704347826088,0.00041676895652173907,0.00041850900000000007,0.00042308960869565212,0.000423242,0.00042383500000000001,0.00042571199999999997,0.00043726700000000003,0.0004556400000000001,0.00047584899999999998],"56":[4.6909000000000003e-07,4.7192000000000001e-07,4.7914000000000004e-07,4.8894999999999999e-07,4.9012999999999996e-07,4.9266999999999998e-07,4.9418000000000005e-07,4.9495999999999998e-07,4.9848000000000005e-07,5.2132000000000001e-07,5.6184000000000001e-07],"62":[5.1753999999999996e-07,5.2542e-07,5.4074000000000001e-07,5.4673000000000008e-07,5.4799000000000003e-07,5.5107999999999998e-07,5.5212e-07,5.7121999999999995e-07,5.7509000000000005e-07,5.8021000000000003e-07,5.8141000000000002e-07],"58":[4.8631000000000007e-07,4.9116999999999997e-07,4.9452000000000001e-07,4.9524999999999994e-07,5.1058000000000001e-07,5.1233999999999999e-07,5.1590000000000001e-07,5.2073000000000003e-07,5.2936000000000002e-07,5.3425999999999997e-07,6.9207000000000003e-07],"3014656":[0.185562423,0.18662863950000003,0.18806756899999999,0.19828984299999997,0.20035683400000001,0.20680683100000002],"64":[5.4038999999999998e-07,5.4370999999999994e-07,5.5792999999999997e-07,5.6823999999999996e-07,5.6873000000000004e-07,5.7138999999999998e-07,5.7395999999999999e-07,5.7472999999999996e-07,5.7528e-07,5.8899000000000004e-07,5.9837999999999994e-07],"8388608":[0.52845458649999999,0.54441595600000003,0.54462295149999995,0.54584910399999997,0.54656292499999992,0.54702514899999999],"29696":[0.00036456799999999996,0.00038537099999999997,0.00038692300000000001,0.00039882900000000001,0.0003994235416666668,0.00040215300000000004,0.000404406,0.00040442299999999984,0.00041714671428571426,0.00043316199999999996,0.00043792681818181814],"216":[1.83223e-06,1.8363700000000001e-06,1.8539599999999999e-06,1.8770100000000001e-06,1.92323e-06,1.9356309523809524e-06,1.96473e-06,1.9690500000000002e-06,1.9731199999999999e-06,1.9779090909090907e-06,1.9974999999999999e-06],"106496":[0.00187719275,0.0018812049999999999,0.0018839,0.0019026892,0.0019036344000000008,0.0019110163999999999,0.0019288110000000001,0.001947477999999999,0.0020026924999999997,0.00201756125,0.00223949875],"72":[6.0963000000000004e-07,6.2055999999999999e-07,6.2839999999999999e-07,6.3559999999999989e-07,6.3817e-07,6.3919999999999995e-07,6.4177999999999991e-07,6.5120000000000001e-07,6.6876000000000001e-07,6.7076000000000006e-07,6.8076000000000007e-07],"442368":[0.010420852999999999,0.010464415499999999,0.0107589,0.010765177500000001,0.010815995,0.011081701000000006,0.01119524,0.011577354,0.011795887999999999,0.012290041999999998,0.013756628],"147456":[0.0028931313333333329,0.0029113840000000008,0.002929259,0.002937715,0.0029757603333333332,0.0030048549999999999,0.003015812000000001,0.0030491809999999998,0.0030500130000000016,0.003104927333333334,0.0031094900000000016],"4456448":[0.27569856599999998,0.27677206249999997,0.27857535150000001,0.27907495449999997,0.28068041799999999,0.28091005299999999],"63488":[0.00096509699999999983,0.00098139100000000008,0.00099503822222222235,0.001002675,0.0010077713333333333,0.0010272707777777778,0.0010379999999999996,0.0010437199999999999,0.0010446990000000001,0.0010468285555555554,0.001084760375],"38912":[0.00058272700000000001,0.00059281193749999999,0.00059615492857142862,0.00060293100000000002,0.0006084469999999997,0.00060952999999999962,0.00061253725,0.00061288131249999974,0.00062150453333333338,0.00064567499999999996,0.00066891209090909093],"68":[5.7637000000000002e-07,5.7917000000000002e-07,5.8158000000000005e-07,5.8377000000000005e-07,5.9459999999999999e-07,5.9894000000000004e-07,5.9985000000000007e-07,6.0561999999999999e-07,6.1123000000000005e-07,6.3537e-07,6.4363999999999991e-07],"188416":[0.0043261215000000002,0.0043416419999999997,0.0043634145000000001,0.0043684829999999985,0.004382965,0.0043925294999999989,0.004411051,0.0044465145000000001,0.0045018550000000017,0.0046264050000000018,0.0046652220000000001],"248":[2.1243299999999997e-06,2.1642599999999999e-06,2.19765e-06,2.2233899999999999e-06,2.25026e-06,2.2544285714285715e-06,2.2639700000000003e-06,2.2664699999999998e-06,2.2681599999999999e-06,2.3513100000000001e-06,2.35689e-06],"80":[6.9091000000000009e-07,7.0728000000000007e-07,7.0789000000000007e-07,7.1029000000000004e-07,7.1433000000000007e-07,7.1792999999999992e-07,7.2232999999999993e-07,7.5252000000000002e-07,7.6031000000000001e-07,7.6679000000000005e-07,7.7828e-07],"2560":[2.9821249999999998e-05,3.0783600000000001e-05,3.2511666666666662e-05,3.2533580000000002e-05,3.2844250000000003e-05,3.291453e-05,3.3569070000000001e-05,3.3611666666666669e-05,3.3961579999999995e-05,3.4475423529411762e-05,3.4924098765432098e-05],"34816":[0.00048649899999999977,0.00050355210526315788,0.00050358926315789471,0.00050676699999999998,0.00050783000000000002,0.00050947399999999999,0.00051091400000000012,0.00051322399999999984,0.00052751499999999989,0.00058124900000000015,0.00059720425000000003],"3712":[4.1093624999999997e-05,4.1346e-05,4.1681699999999998e-05,4.1972550000000002e-05,4.2525899999999999e-05,4.2611733333333331e-05,4.2743357142857145e-05,4.3043000000000001e-05,4.3475900000000002e-05,4.4482181818181813e-05,4.5014310000000001e-05],"3538944":[0.206054292,0.20814917299999999,0.20896320149999997,0.21191134,0.21202669099999999,0.24710496800000004],"76":[6.4561999999999993e-07,6.5563e-07,6.5924000000000002e-07,6.6428999999999997e-07,6.7212999999999997e-07,6.7548000000000001e-07,6.7710000000000005e-07,6.7737000000000009e-07,6.917199999999999e-07,7.0945000000000004e-07,7.2651000000000001e-07],"4194304":[0.2553632985,0.25702353700000002,0.25765163949999997,0.25767749350000002,0.25829774750000001,0.26757812749999998],"851968":[0.035583612000000001,0.036575147000000002,0.036844839000000004,0.037663557,0.038048490999999997,0.038771979999999998,0.039314037999999996,0.039703231000000019,0.039986871,0.040604516],"4096":[4.49645e-05,4.6545199999999996e-05,4.8572999999999997e-05,5.0099000000000003e-05,5.018731e-05,5.0538279999999995e-05,5.0644516483516483e-05,5.0968070000000002e-05,5.1350730000000005e-05,5.1540244444444447e-05,5.2394159090909094e-05],"59392":[0.00088862109999999995,0.00088882300000000007,0.0009161992999999997,0.00091835050000000002,0.00092305539999999969,0.00092756000000000002,0.00092757029999999995,0.00094553377777777754,0.00094599000000000039,0.00097078166666666674,0.0010112061250000001],"84":[7.2391999999999999e-07,7.2978000000000007e-07,7.3250000000000008e-07,7.5153000000000001e-07,7.5407999999999999e-07,7.6143000000000001e-07,7.7008999999999998e-07,7.7701999999999995e-07,7.8576000000000002e-07,7.9603000000000007e-07,8.1393999999999999e-07],"3276800":[0.18931912699999998,0.19048942699999999,0.19536335199999999,0.19608513849999998,0.19670609050000001,0.19899854950000001],"55296":[0.00076411600000000023,0.00080872572727272733,0.00081413533333333339,0.00081975900000000009,0.00082436800000000002,0.00082575609090909077,0.00083752100000000025,0.00083898063636363618,0.00084446899999999982,0.00084907372727272695,0.00089251999999999995],"688128":[0.018570196000000004,0.01893847999999999,0.019035962999999996,0.019726789000000022,0.020253929,0.020266942,0.020270488499999999,0.020716176999999999,0.021691178999999998,0.022401819999999999],"8192":[0.0001051555,0.00010535733333333334,0.000105362,0.000105973,0.00010649952380952375,0.00010652266666666666,0.00010679299999999999,0.0001069687142857143,0.00010974,0.000111428,0.000115171],"10240":[0.000141934,0.00014328600000000001,0.00014980701515151517,0.00015091600000000004,0.00015233099999999999,0.000153051,0.00015370785714285712,0.0001550546875,0.000157095,0.00016140320689655169,0.00017097799999999999],"15872":[0.00020358599999999996,0.00020414814285714292,0.00020718352173913039,0.00020737256521739136,0.0002089125319148936,0.00020917236956521749,0.000212399,0.00021407986046511625,0.00021593800000000002,0.00022133934146341465,0.00022825556097560976],"92":[8.2632000000000006e-07,8.3096000000000002e-07,8.364099999999999e-07,8.4e-07,8.4728999999999996e-07,8.5786999999999999e-07,8.5883000000000002e-07,8.9655999999999998e-07,9.0966000000000001e-07,9.6602999999999992e-07,9.7554999999999992e-07],"26624":[0.00032426599999999992,0.00032761900000000002,0.00033162321428571425,0.000337258,0.00034326099999999992,0.00034360866666666666,0.00034471161538461532,0.0003466129999999999,0.00034947087499999986,0.00034984700000000014,0.00037362099999999987],"1792":[1.8187899999999999e-05,1.8216740000000001e-05,1.8432909999999998e-05,1.8460600000000001e-05,1.8567590000000001e-05,1.9076159999999999e-05,1.917565e-05,1.9307989999999998e-05,1.969073e-05,2.0356570000000002e-05,2.0536892857142856e-05],"11776":[0.00018316900000000001,0.00018399749999999999,0.00018620913333333339,0.00019147533333333335,0.00019344328,0.00019454938775510209,0.00019602199999999999,0.00019646400000000001,0.00019797283999999999,0.00019938199999999998,0.00020318865217391303],"2944":[3.7276e-05,3.8093999999999998e-05,3.9237999999999999e-05,3.9857060000000006e-05,4.0351444444444444e-05,4.1059000000000001e-05,4.1851624999999999e-05,4.2019049999999995e-05,4.2853279999999997e-05,4.311863e-05,4.4310559999999999e-05],"88":[7.5826000000000007e-07,7.6811999999999992e-07,7.7917000000000011e-07,7.9161999999999999e-07,7.9306000000000004e-07,7.9660000000000003e-07,8.157699999999999e-07,8.1675999999999991e-07,8.3099000000000001e-07,8.5074000000000001e-07,8.5135000000000001e-07],"22528":[0.00033941,0.00036574369230769232,0.00037050465384615394,0.00037096900000000002,0.00037201600000000002,0.00037322700000000001,0.000374063,0.00037644700000000002,0.00038055046153846154,0.00039614837500000005,0.00040103399999999987],"1245184":[0.054555319999999997,0.057227399499999998,0.060445996000000002,0.060637569999999988,0.061658635000000017,0.06170553400000002,0.061951237000000013,0.062114349999999985,0.06218578800000002,0.062313597499999998],"15728640":[1.0516376919999999,1.0527522819999999,1.0544602734999999,1.0556087679999999,1.0599454589999999,1.0677858505],"96":[8.3467000000000005e-07,8.5241000000000005e-07,8.6852000000000005e-07,8.9625999999999995e-07,9.0278000000000004e-07,9.0528999999999998e-07,9.1772000000000004e-07,9.2169000000000004e-07,9.3737000000000004e-07,9.4242999999999995e-07,9.4674999999999998e-07],"1984":[2.0766000000000001e-05,2.079766e-05,2.1080980000000002e-05,2.13422e-05,2.1654800000000001e-05,2.1711410000000001e-05,2.1721000000000001e-05,2.175295e-05,2.1939000000000001e-05,2.2517390000000002e-05,2.3394333333333334e-05],"139264":[0.0026448799999999988,0.002705556,0.002708993000000002,0.0027400423333333334,0.002767057666666667,0.0027851729999999997,0.0027876059999999989,0.002804165999999999,0.002822523,0.0028250986666666666,0.002922759],"475136":[0.011445532,0.011449571999999967,0.011457051999999999,0.011683857000000001,0.011786738,0.011811495,0.011874542,0.012138012,0.012218138999999999,0.012599078,0.0150673505],"13631488":[0.88546156649999996,0.88647356799999999,0.89160020600000001,0.89294163999999998,0.897250039,0.94177589250000004],"416":[3.6616499999999999e-06,3.7369799999999998e-06,3.76164e-06,3.7852600000000002e-06,3.7860599999999998e-06,3.7953700000000001e-06,3.9325699999999999e-06,3.9448699999999997e-06,4.0008300000000003e-06,4.0176899999999998e-06,4.0293900000000001e-06],"928":[8.5399999999999996e-06,8.77367e-06,8.7860000000000002e-06,8.8103600000000001e-06,8.9031400000000006e-06,8.9584500000000006e-06,9.0244999999999997e-06,9.2023300000000004e-06,9.3468199999999997e-06,9.3705299999999999e-06,9.6317499999999997e-06],"512":[4.5373700000000004e-06,4.5969400000000002e-06,4.6656599999999998e-06,4.69534e-06,4.7373100000000002e-06,4.7437899999999995e-06,4.7523333333333328e-06,4.8146600000000004e-06,4.9450099999999991e-06,5.0201800000000001e-06,5.3310499999999996e-06],"18432":[0.00025093833333333335,0.00025473299999999988,0.00025480650000000006,0.00026555924324324332,0.00026774966666666671,0.00026857849999999996,0.0002711833611111111,0.00027226699999999992,0.00028281929411764698,0.00028703099999999998,0.00029298300000000002],"16777216":[1.1367211699999999,1.1385923490000001,1.1388510250000001,1.1417989995,1.1418541815000001,1.1545034505],"9728":[0.00013249,0.00013867750000000006,0.00014010299999999993,0.00014036333333333333,0.0001406111875,0.000141865,0.00014216411764705886,0.00014390022058823529,0.00014429660606060605,0.00014526775000000004,0.000152621],"1769472":[0.094856121000000002,0.096966985000000006,0.097042930000000041,0.098704213000000013,0.098725812499999996,0.099875188000000004,0.099910940999999975,0.1012770285,0.102327471],"1703936":[0.091368256499999995,0.092029414000000004,0.092347415999999988,0.093549313999999995,0.09411908300000002,0.094312619999999972,0.094478651999999969,0.09463114099999996,0.09589980250000002,0.096086611000000016],"2048":[2.1030999999999999e-05,2.1739999999999999e-05,2.2605333333333335e-05,2.2663e-05,2.2691590000000001e-05,2.2997124999999999e-05,2.3116830000000001e-05,2.3240062499999999e-05,2.3627629999999999e-05,2.3777630000000003e-05,2.4936530000000003e-05],"14336":[0.00016747300000000007,0.00017337450000000005,0.00017538300000000001,0.00017734062962962961,0.00018297427777777772,0.000184544,0.000184575,0.00018614873999999999,0.00018650599999999999,0.00018699070000000002,0.00019325028888888887],"448":[3.9728484848484843e-06,3.9995399999999998e-06,4.0774199999999998e-06,4.1341900000000003e-06,4.2491000000000005e-06,4.2585799999999996e-06,4.2912000000000005e-06,4.2974700000000004e-06,4.3021200000000004e-06,4.3100299999999998e-06,4.3102903225806448e-06],"5505024":[0.37093099549999997,0.374190154,0.37474613899999998,0.37726925,0.37764811450000002,0.37824814900000003],"544":[4.8285999999999998e-06,4.8924799999999996e-06,4.9371500000000007e-06,4.9788000000000005e-06,5.0832799999999996e-06,5.0944599999999998e-06,5.1020000000000004e-06,5.1409800000000007e-06,5.2620699999999996e-06,5.3550600000000004e-06,5.5448599999999998e-06],"221184":[0.0044020169999999985,0.0045315749999999995,0.0046108209999999976,0.0046226274999999969,0.0047074259999999998,0.0047449429999999997,0.0049058279999999975,0.0050216659999999984,0.0052646240000000007,0.005433729,0.0067096480000000012],"90112":[0.0016654209999999996,0.0016735114000000055,0.0016840049999999999,0.0016865879999999993,0.0016955526000000005,0.0016955838000000001,0.0017145107999999999,0.0017176189999999997,0.0017590756000000006,0.0017744606,0.0019664427499999993],"640":[5.8786199999999996e-06,5.9483100000000001e-06,6.1544099999999997e-06,6.2734599999999999e-06,6.3327200000000001e-06,6.3423299999999998e-06,6.3776999999999999e-06,6.3830099999999996e-06,6.4717100000000001e-06,6.5102400000000002e-06,6.5155800000000002e-06],"12800":[0.00014208099999999996,0.00014738200000000007,0.00015023375000000001,0.00015222799999999999,0.00015457400000000001,0.000155339,0.00015579800000000004,0.000156861,0.0001583,0.00015933308064516129,0.000159452],"262144":[0.005493543,0.0055566669999999995,0.0055898000000000024,0.0056325850000000007,0.0056611119999999977,0.0056808750000000002,0.0057816040000000001,0.0057936540000000014,0.0059734809999999984,0.0059920309999999992,0.006122711999999998],"589824":[0.016059438500000005,0.016706105499999999,0.016886906,0.017440796999999991,0.01837252,0.018530572999999998,0.0186726285,0.020138674500000002,0.022158271,0.022474015999999999],"884736":[0.037610036499999999,0.038276671499999998,0.038874213000000019,0.039209284999999997,0.039343222000000004,0.039644375500000009,0.039729838000000003,0.042669292000000011,0.042903877999999986,0.043696259000000008],"6144":[9.4536166666666665e-05,9.5838e-05,9.6328000000000003e-05,9.7876999999999998e-05,9.9067187500000002e-05,9.9073000000000005e-05,0.000100859,0.00010090538947368419,0.000102744375,0.00010332599999999998,0.000107669],"1088":[1.0616220000000398e-05,1.07028e-05,1.0714310000000001e-05,1.079472e-05,1.1099899999999999e-05,1.128813e-05,1.1334450000000001e-05,1.1338319999999999e-05,1.1480435483870968e-05,1.152087e-05,1.1739750000000001e-05],"576":[5.2386600000000001e-06,5.3825599999999997e-06,5.4028599999999993e-06,5.4566900000000008e-06,5.4659700000000003e-06,5.5574042553191487e-06,5.5818000000000005e-06,5.5969999999999999e-06,5.6935300000000002e-06,5.8302300000000001e-06,6.17168e-06],"160":[1.3665e-06,1.3679999999999999e-06,1.4172600000000001e-06,1.42983e-06,1.44043e-06,1.4480200000000001e-06,1.45826e-06,1.4682e-06,1.47789e-06,1.48366e-06,1.4910100000000001e-06],"672":[6.1542300000000007e-06,6.1953500000000007e-06,6.3162799999999994e-06,6.3912105263157893e-06,6.4208800000000001e-06,6.4255200000000003e-06,6.5178600000000005e-06,6.5901100000000005e-06,6.6102700000000005e-06,6.7555700000000006e-06,6.7700800000000001e-06],"8912896":[0.58131557550000001,0.58312005999999994,0.58766815000000006,0.58821999899999999,0.58923748799999998,0.59322503250000003],"100":[8.3473999999999997e-07,8.4351999999999997e-07,8.4371999999999999e-07,8.6284000000000007e-07,8.7069000000000002e-07,8.7952999999999999e-07,8.801099999999999e-07,9.0714000000000001e-07,9.1822000000000008e-07,9.304799999999999e-07,9.3699000000000003e-07],"507904":[0.012010142,0.012662197,0.013218738000000002,0.0146559815,0.015010134999999999,0.015043956000000001,0.015161168499999999,0.016193996000000006,0.017206943999999995,0.019018554999999999],"3840":[4.1328222222222226e-05,4.3843454545454546e-05,4.4766789999999999e-05,4.4923699999999998e-05,4.4997609999999998e-05,4.5161428571428573e-05,4.5189669999999997e-05,4.5457409999999997e-05,4.5592071428571432e-05,4.6096990000000002e-05,4.93065e-05],"192":[1.72167e-06,1.79109e-06,1.7921500000000001e-06,1.79912e-06,1.8009999999999998e-06,1.8181100000000001e-06,1.8326200000000002e-06,1.8581700000000001e-06,1.90712e-06,1.9124600000000001e-06,1.9294500000000002e-06],"376832":[0.0094188670000000009,0.0094318549999999994,0.0094646130000000037,0.0094862350000000008,0.009568568000000003,0.0096440859999999996,0.0096632350000000027,0.0096979124999999992,0.0097020959999999969,0.0098509465000000008,0.010223625],"98304":[0.0019222639999999993,0.001924165,0.0019266960000000007,0.0019316650000000002,0.0019503542000000001,0.0019783485000000002,0.001983627,0.0019859229999999992,0.0019894489999999999,0.0019953270000000007,0.00201841],"5376":[7.6524699999999996e-05,7.7182999999999996e-05,7.723751851851852e-05,7.727605e-05,7.7660769230769236e-05,7.7724607142857152e-05,7.9052095238095244e-05,7.9701652173913047e-05,8.1283020000000002e-05,8.171050000000001e-05,8.3050180000000012e-05],"94208":[0.00175662,0.0017658319999999991,0.0017925121999999999,0.0017960624000000001,0.0018035310000000001,0.0018163260000000001,0.0018316809999999999,0.001869037,0.0018711308,0.0018817512000000002,0.00197177875],"81920":[0.0014098399999999994,0.0014291919999999999,0.001448291,0.0014689488333333336,0.001469746833333333,0.001474958,0.001480493,0.001492319,0.0015060030000000001,0.0015138826666666666,0.0015414931666666667],"3407872":[0.19717272699999999,0.199487943,0.19951632050000001,0.20018701,0.20120048400000001,0.20370511699999999],"104":[8.7591999999999997e-07,8.8552000000000006e-07,8.8858999999999999e-07,9.0034000000000003e-07,9.0754000000000004e-07,9.1908e-07,9.5458000000000002e-07,9.5577999999999989e-07,9.5595999999999999e-07,9.6154000000000007e-07,9.7986999999999995e-07],"122880":[0.002202936,0.0022298805000000002,0.0022299779999999992,0.00225731375,0.0022793172500000002,0.0022851999999999998,0.0022973242499999998,0.0023049185000000002,0.00230702725,0.0023904810000000007,0.0024782922499999999],"200":[1.68971e-06,1.7013999999999999e-06,1.72332e-06,1.7355499999999998e-06,1.7670500000000001e-06,1.77112e-06,1.7834999999999999e-06,1.8326700000000001e-06,1.86106e-06,1.8949400000000001e-06,2.0044199999999999e-06],"163840":[0.0033561849999999998,0.0034170759999999989,0.003427902,0.0034458029999999986,0.0034720649999999999,0.0035159559999999998,0.0035226199999999993,0.0035695610000000002,0.0035868365000000001,0.003654994,0.0041396430000000001],"4063232":[0.24641338400000001,0.24792571099999999,0.24875479,0.24918579900000001,0.25404391199999998,0.2555694745],"5767168":[0.39722926549999998,0.399244237,0.40087880100000001,0.40162748199999998,0.40444080999999998,0.40626921900000001],"12582912":[0.95471665100000003,0.96645011150000004,0.96888876700000004,0.97034801550000005,0.97388092299999995,0.97853897150000002],"1600":[1.5818750000000002e-05,1.5980990000000001e-05,1.6018140000000001e-05,1.6237020000000002e-05,1.6289029999999998e-05,1.6629999999999998e-05,1.6762333333333334e-05,1.6903749999999999e-05,1.7896660000000002e-05,1.7917000000000001e-05,1.793219e-05],"136":[1.14568e-06,1.1468500000000001e-06,1.1478099999999999e-06,1.1598600000000001e-06,1.20192e-06,1.2119499999999999e-06,1.2123199999999999e-06,1.2202899999999999e-06,1.2258800000000001e-06,1.2652e-06,1.2746099999999999e-06],"232":[1.9612599999999999e-06,1.9849100000000001e-06,2.0074e-06,2.0729999999999999e-06,2.08178e-06,2.10711e-06,2.1118799999999999e-06,2.13795e-06,2.1698400000000002e-06,2.1874800000000001e-06,2.1941100000000002e-06],"7077888":[0.43647988900000001,0.44035673200000003,0.44209480750000002,0.44446648,0.446931888,0.45277944399999998],"86016":[0.0014926900000000001,0.0015108820000000001,0.0015517090000000005,0.0015620134999999999,0.0015642131666666662,0.0015699469999999999,0.0015988361666666665,0.0016116780000000001,0.0016200769999999997,0.0016248559999999987,0.0016757567999999994],"31744":[0.00041820900000000012,0.00042208600000000001,0.00042238099999999999,0.00043618781818181818,0.00043998400000000003,0.00044234677272727267,0.00044268936363636366,0.00044436300000000003,0.00046956100000000001,0.00047152269230769261,0.00047784200000000002],"168":[1.4532799999999998e-06,1.4656900000000001e-06,1.4772400000000001e-06,1.5091000000000001e-06,1.5183600000000001e-06,1.5206599999999999e-06,1.5296999999999999e-06,1.53636e-06,1.5403399999999999e-06,1.5616100000000001e-06,1.6106099999999999e-06],"622592":[0.016562011500000001,0.017790153,0.018518877999999999,0.018779133,0.018960889500000001,0.02000149,0.020181773,0.020200155000000004,0.022652650499999982,0.024424973999999995],"108":[9.0551999999999997e-07,9.0688999999999999e-07,9.1808000000000003e-07,9.2302999999999997e-07,9.5125e-07,9.5413000000000009e-07,9.5495999999999992e-07,9.562099999999999e-07,9.5692000000000002e-07,9.8532000000000004e-07,1.0033199999999999e-06],"327680":[0.0074926350000000001,0.0075199849999999999,0.007551243,0.0076158069999999727,0.007635775,0.007643408,0.0077231130000000037,0.0077875710000000001,0.0078481019999999992,0.0079580940000000006,0.0079864470000000007],"2176":[2.3859139999999999e-05,2.4235879999999998e-05,2.4463976190476194e-05,2.4564999999999999e-05,2.4761643678160918e-05,2.4814177215189876e-05,2.483202e-05,2.4972494117647058e-05,2.5092999999999998e-05,2.5225039999999999e-05,2.5683739999999999e-05],"3328":[3.482075e-05,3.5546000000000002e-05,3.6395927536231889e-05,3.6579020000000005e-05,3.6755000000000003e-05,3.6950999999999999e-05,3.7035500000000001e-05,3.7262170000000002e-05,3.7276840000000005e-05,3.8180010000000004e-05,4.0995329999999999e-05],"1":[1.0740000000000001e-08,1.075e-08,1.076e-08,1.125e-08,1.1260000000000001e-08,1.1260000000000001e-08,1.139e-08,1.165e-08,1.178e-08,1.179e-08,1.1829999999999999e-08],"2":[1.8889999999999999e-08,1.892e-08,1.892e-08,1.9609999999999998e-08,1.9769999999999998e-08,1.9779999999999999e-08,1.9800000000000002e-08,1.9810000000000003e-08,2.0650000000000003e-08,2.0689999999999999e-08,2.0729999999999998e-08],"3":[2.6960000000000001e-08,2.7719999999999999e-08,2.8260000000000003e-08,2.8290000000000001e-08,2.8609999999999999e-08,2.9239999999999999e-08,2.9309999999999999e-08,2.953e-08,2.955e-08,3.0979999999999997e-08,3.1900000000000001e-08],"4":[3.5969999999999997e-08,3.634e-08,3.6370000000000001e-08,3.683e-08,3.7960000000000004e-08,3.8099999999999997e-08,3.8110000000000002e-08,3.8390000000000002e-08,3.8730000000000003e-08,3.882e-08,3.9790000000000001e-08],"7424":[8.7282759999999994e-05,8.8150600000000003e-05,9.0429900000000006e-05,9.0902000000000005e-05,9.1549e-05,9.3008222222222233e-05,9.3243030000000004e-05,9.4831020000000002e-05,9.5105000000000005e-05,0.00010028045263157896,0.000100478],"5":[4.4429999999999995e-08,4.4490000000000003e-08,4.4649999999999993e-08,4.5200000000000001e-08,4.6659999999999996e-08,4.7779999999999995e-08,4.8119999999999997e-08,4.8300000000000002e-08,4.8669999999999998e-08,4.8930000000000002e-08,5.0039999999999997e-08],"23552":[0.000363834,0.00037956200000000006,0.00037972600000000004,0.00038326745833333332,0.0003917969583333334,0.00039600999999999986,0.00039662600000000002,0.00039988900000000006,0.00040335500000000004,0.00040756899999999999,0.00043700586363636351],"6":[5.2519999999999996e-08,5.2530000000000001e-08,5.2830000000000004e-08,5.3569999999999996e-08,5.4029999999999995e-08,5.421e-08,5.5350000000000003e-08,5.7420000000000001e-08,5.8670000000000002e-08,6.0730000000000002e-08,6.4550000000000006e-08],"61440":[0.00089657000000000018,0.00092560600000000037,0.00092610700000000002,0.00093207000000000012,0.00094907919999999998,0.00096598339999999971,0.00096712959999999994,0.00096974810000000045,0.0010027390000000001,0.0010032086666666665,0.00105536],"491520":[0.0116344985,0.011715114,0.012428633499999999,0.01256528,0.0126427695,0.012898342,0.0131052155,0.013840009,0.014750688500000001,0.017203781499999991],"77824":[0.001297851,0.0013239160000000001,0.0013315125714285707,0.001344853,0.0013471201428571426,0.0013560564285714288,0.00135968,0.001371829,0.0013839779999999999,0.0014170097142857147,0.0014587783333333336],"7":[5.9470000000000002e-08,6.0639999999999992e-08,6.1490000000000003e-08,6.1999999999999999e-08,6.2209999999999999e-08,6.2410000000000001e-08,6.3479999999999997e-08,6.3619999999999997e-08,6.4969999999999992e-08,6.6590000000000003e-08,6.6720000000000005e-08],"8":[6.8659999999999994e-08,6.888999999999999e-08,6.9709999999999994e-08,7.0469999999999995e-08,7.1369999999999997e-08,7.1949999999999992e-08,7.2180000000000002e-08,7.219e-08,7.2219999999999994e-08,7.247e-08,8.28e-08],"208":[1.7548100000000002e-06,1.7616499999999999e-06,1.7655300000000001e-06,1.7819600000000002e-06,1.84771e-06,1.84976e-06,1.8669800000000002e-06,1.86787e-06,1.94101e-06,1.9643800000000001e-06,2.0786700000000001e-06],"9":[7.5520000000000004e-08,7.7109999999999994e-08,7.7639999999999999e-08,7.7729999999999995e-08,7.8979999999999997e-08,7.8979999999999997e-08,7.9179999999999998e-08,8.1829999999999999e-08,8.1859999999999993e-08,8.3599999999999994e-08,8.4409999999999999e-08],"73728":[0.0012169400000000001,0.001229069,0.0012331177142857145,0.001245793,0.0012524812857142857,0.0012537402857142857,0.00126862,0.001274446,0.0013202467142857139,0.0013270442857142854,0.0013347104285714288],"304":[2.6061900000000003e-06,2.6209600000000001e-06,2.6476899999999998e-06,2.7736099999999999e-06,2.7799299999999998e-06,2.7952400000000002e-06,2.8011600000000001e-06,2.8012700000000002e-06,2.83537e-06,2.8669299999999996e-06,2.94306e-06],"400":[3.4751200000000001e-06,3.4955199999999999e-06,3.5263900000000004e-06,3.5470699999999999e-06,3.5946181818181818e-06,3.6324699999999995e-06,3.6740100000000002e-06,3.7036000000000004e-06,3.7958499999999998e-06,3.82866e-06,3.8722799999999996e-06],"1310720":[0.05989704400000001,0.061886048999999999,0.062629201999999981,0.063720264000000013,0.064828740999999981,0.065426844000000012,0.06569612800000002,0.066117408499999988,0.068491773000000006,0.0731896405],"336":[2.9415999999999999e-06,2.9549399999999997e-06,2.9626400000000001e-06,3.0149999999999999e-06,3.0836600000000004e-06,3.1000500000000001e-06,3.1510799999999997e-06,3.2074799999999997e-06,3.20875e-06,3.22196e-06,3.4740800000000002e-06],"3670016":[0.21595502899999999,0.21603160599999999,0.2171314,0.217430821,0.21966332450000001,0.22945526199999999],"6656":[7.2632999999999994e-05,7.3424999999999996e-05,7.4171000000000005e-05,7.6024070000000007e-05,7.7515000000000006e-05,7.8638565217391311e-05,7.8643169999999997e-05,7.8689000000000005e-05,7.8913730769230767e-05,7.9552029999999989e-05,8.2463209999999987e-05],"15360":[0.00019217420000000002,0.00019327345098039218,0.00019374599999999998,0.00019939680000000002,0.0002001511836734695,0.0002004363555555555,0.00020195099999999996,0.000202874,0.00020307300000000001,0.000203854,0.00020516025],"432":[3.7058900000000001e-06,3.7500800000000002e-06,3.78869e-06,3.8876299999999994e-06,3.9755967741935479e-06,3.9858e-06,4.0120833333333334e-06,4.1077300000000001e-06,4.1157100000000001e-06,4.1666199999999998e-06,4.2182100000000004e-06],"950272":[0.038232219999999997,0.039249024,0.040211585000000008,0.041063327999999989,0.042019088499999996,0.0465283155,0.048496436500000004,0.049907167000000002,0.051194285999999999,0.05173510349999999],"655360":[0.018494295000000001,0.0189106395,0.019432908000000006,0.019701086999999999,0.020660236000000005,0.020664649,0.022020981999999995,0.023951053499999989,0.024425225000000002,0.027810376000000008],"69632":[0.0011326514285714287,0.0011424650000000001,0.001145526,0.0011583980000000004,0.00116079925,0.001162130625,0.001166563,0.001167459,0.001184336125,0.001185061875,0.001185222625],"11264":[0.00016251299999999993,0.000166594,0.00017334199999999999,0.00017428099999999995,0.000174914,0.000177314,0.00017852275000000001,0.000182905,0.00018416099999999999,0.000184196,0.0001896814],"2752512":[0.16413568000000001,0.164803742,0.16497320500000001,0.17111325799999999,0.17464009,0.17497343600000001],"8126464":[0.50805415399999998,0.51971621349999997,0.52479834600000008,0.52994663499999994,0.5304325205,0.53077445099999998],"27648":[0.00032922499999999999,0.00033018399999999991,0.00034319,0.00035903414814814809,0.00035974800000000001,0.000360539,0.00036243199999999988,0.00036296700000000001,0.00036566699999999997,0.00039473524999999982,0.00040365699999999987],"368":[3.242e-06,3.28258e-06,3.3201799999999999e-06,3.3573400000000003e-06,3.43225e-06,3.4692199999999999e-06,3.5214000000000003e-06,3.5413000000000003e-06,3.6167200000000002e-06,3.6297899999999997e-06,3.6840199999999999e-06],"65536":[0.0010008689999999997,0.001040617,0.0010418735555555556,0.00104422,0.0010481532222222224,0.0010597970000000001,0.001066492,0.0010700521111111103,0.0010755460000000001,0.0010832260000000001,0.0010886280000000003],"16252928":[1.0908432699999999,1.0949217149999999,1.0966726755,1.098423881,1.1041674189999999,1.1211769355000001],"464":[4.0481224489795914e-06,4.1088100000000002e-06,4.1548699999999994e-06,4.1918899999999998e-06,4.2508099999999999e-06,4.3729400000000004e-06,4.4387999999999998e-06,4.4539300000000002e-06,4.4970399999999997e-06,4.5287700000000002e-06,4.5382199999999997e-06],"1015808":[0.045814446500000001,0.047442682999999999,0.048214215999999997,0.04886981,0.049047904500000003,0.049207516000000007,0.049716884999999982,0.051095942000000019,0.052503227999999999,0.052871138999999998],"3072":[4.1360999999999999e-05,4.2348000000000002e-05,4.3424764705882353e-05,4.3977520000000005e-05,4.5089249999999999e-05,4.5209700000000002e-05,4.5534785714285709e-05,4.6668800000000003e-05,4.7003599999999998e-05,4.7648875000000002e-05,4.7947170000000005e-05],"110592":[0.0018734450000000003,0.001911938,0.001921416,0.0019228629999999999,0.001934648,0.001940284,0.00200007675,0.0020175135,0.0020532519999999993,0.0021145389999999995,0.0022399849999999999],"237568":[0.0047964070000000017,0.0048650969999999997,0.0048667210000000001,0.0050306249999999986,0.005207756,0.0053227029999999998,0.0053251599999999998,0.0054490450000000039,0.0055773530000000002,0.0059577630000000013,0.0060704949999999978],"278528":[0.0059193349999999978,0.0060089839999999985,0.006049470999999999,0.0061538909999999999,0.0062315209999999985,0.0062828320000000003,0.0064594219999999977,0.0065097189999999997,0.0065250119999999993,0.006957263,0.0075413639999999992],"496":[4.4334799999999994e-06,4.4788500000000003e-06,4.5531399999999999e-06,4.6434999999999997e-06,4.64721e-06,4.656e-06,4.7068800000000001e-06,4.7105400000000003e-06,4.7713899999999999e-06,4.7909799999999998e-06,4.8280899999999997e-06],"13107200":[0.8536377705,0.85433867350000003,0.85599955599999999,0.85620398850000001,0.85732898550000003,0.86445619149999997],"9961472":[0.67747265249999999,0.67852857700000002,0.68019786699999996,0.68189863699999997,0.685778891,0.68666566849999999],"5888":[8.4178999999999995e-05,8.9920120000000001e-05,9.0415449999999998e-05,9.0533428571428558e-05,9.087455555555555e-05,9.1428272727272738e-05,9.21052e-05,9.2279000000000002e-05,9.4028000000000002e-05,9.5452627659574482e-05,9.6657849999999998e-05],"11010048":[0.77304512999999997,0.78333489200000006,0.78683799450000003,0.78789780300000001,0.78819826400000004,0.79482160800000001],"1920":[1.879225e-05,2.0679405405405402e-05,2.0737096774193549e-05,2.0824089999999999e-05,2.0830839999999997e-05,2.1041000000000001e-05,2.1106409999999999e-05,2.1815210000000001e-05,2.220865e-05,2.2347750000000003e-05,2.2822340000000003e-05],"2490368":[0.14195152,0.14425982400000001,0.14561647599999999,0.14656117599999996,0.15024362450000001,0.15213284399999999],"19456":[0.00027749299999999986,0.00028061999999999998,0.000284023,0.0002882146666666666,0.00029058470588235298,0.00029074669696969689,0.00029416099999999992,0.00029517666666666666,0.00031162493548387096,0.00031639899999999998,0.00031715199999999991],"57344":[0.00084319399999999969,0.0008483210000000003,0.00085082000000000007,0.00085483299999999994,0.00086908500000000034,0.00087244299999999998,0.00087658718181818189,0.00088455199999999993,0.00089777299999999993,0.00090011750000000004,0.000913147],"1179648":[0.050530671999999999,0.050742328000000003,0.051979083000000002,0.055626185000000015,0.057784063000000017,0.058407994000000019,0.060946979000000033,0.061094325000000026,0.063850542999999996,0.070602623000000003],"4718592":[0.29954862300000001,0.30031663600000003,0.30165228700000002,0.30206004050000002,0.30212520500000001,0.31408350000000002],"360448":[0.0087806640000000005,0.0088047950000000007,0.0088933940000000041,0.0089619580000000008,0.0089853379999999955,0.0089870490000000004,0.0090516019999999954,0.0091698560000000005,0.0092547999999999971,0.0092812380000000007,0.00928819],"1572864":[0.074429390999999984,0.077925030499999992,0.077989997000000005,0.078255117999999971,0.079310105499999992,0.08095887899999997,0.085496269,0.086661471999999976,0.089103456499999997,0.090075959000000011],"53248":[0.00074013699999999998,0.00076186100000000007,0.000763833,0.00076501233333333318,0.00077026899999999997,0.0007722446666666667,0.0007902153333333333,0.00079087691666666676,0.00079321800000000005,0.00079554841666666686,0.00082584800000000001],"3456":[3.5790666666666669e-05,3.7495471698113206e-05,3.7579120000000002e-05,3.867328e-05,3.8742210000000004e-05,3.8800829999999998e-05,3.8867079999999998e-05,3.9183660000000006e-05,4.021867e-05,4.0352869565217388e-05,4.3330649999999998e-05],"40960":[0.00062239400000000029,0.00062683900000000013,0.00063540386666666681,0.00064587914285714281,0.00065335653333333335,0.00066148299999999982,0.00066560099999999982,0.00066583400000000002,0.00067401399999999991,0.00067740699999999977,0.000694912],"4608":[5.4583750000000001e-05,5.5822333333333336e-05,6.0541739999999999e-05,6.0824470000000005e-05,6.1097492063492059e-05,6.1471999999999997e-05,6.1581849999999997e-05,6.1728827586206896e-05,6.3738289999999999e-05,6.472951020408163e-05,6.6608395833333338e-05],"13824":[0.00016277999999999993,0.00016494099999999994,0.00016499599999999996,0.00016947389090909087,0.00017353173076923071,0.00017471399999999999,0.00017500300000000007,0.00017505299999999994,0.00017545625,0.00018227694230769226,0.00018367464150943389],"819200":[0.034674268999999987,0.035862505000000024,0.035959882999999998,0.036483477,0.036539664999999999,0.037168282499999997,0.037718800999999996,0.038584857,0.038652231000000002,0.040390384999999987],"983040":[0.04094439900000002,0.041615025,0.045916599000000009,0.046913694000000013,0.048095304999999984,0.048563341999999982,0.051264266500000009,0.053126461,0.055489955999999986,0.057128777999999977],"8704":[0.0001138630909090909,0.000114648,0.0001150883442622951,0.00011619894117647058,0.0001162313125,0.000118467,0.00011921471232876715,0.00012157245,0.00012199800000000001,0.00012343198684210526,0.00012943200000000004],"120":[1.01545e-06,1.0166900000000001e-06,1.0172899999999999e-06,1.0221999999999999e-06,1.05321e-06,1.0637099999999999e-06,1.0685099999999999e-06,1.07654e-06,1.07841e-06,1.08128e-06,1.0920300000000001e-06],"1024":[9.65597e-06,1.000987e-05,1.0126250000000002e-05,1.0202e-05,1.033391e-05,1.0334859999999999e-05,1.0377920000000001e-05,1.0537219999999999e-05,1.0670210000000001e-05,1.0828199999999999e-05,1.1072460000000002e-05],"49152":[0.00083923000000000005,0.00087471372727272701,0.0008791955454545454,0.00088272654545454526,0.00088305399999999998,0.00088377309090909126,0.0008901079999999997,0.00089306000000000021,0.00089662000000000021,0.00090847489999999992,0.0009279818000000002],"524288":[0.013865851,0.014396748000000001,0.014782953,0.0150059645,0.015957833999999997,0.017471273000000006,0.017601123,0.017988473000000001,0.020838754000000015,0.020922381],"45056":[0.00073027499999999996,0.00075748200000000008,0.00075893430769230778,0.00077255299999999993,0.00077499600000000024,0.00077931600000000006,0.0007810139999999998,0.00078257700000000023,0.00079080300000000019,0.00080628100000000005,0.00080979199999999993],"229376":[0.0044926270000000025,0.0045810120000000024,0.0046799699999999986,0.0047020680000000002,0.004710194,0.0048138770000000029,0.0048192490000000011,0.0048304869999999996,0.0048645590000000001,0.0050467460000000004,0.0057954980000000014],"2688":[3.1701e-05,3.3651666666666668e-05,3.3991e-05,3.3992309999999469e-05,3.4394789999999997e-05,3.4736000000000001e-05,3.5234999999999997e-05,3.5637701298701299e-05,3.5710999999999997e-05,3.650746e-05,3.7300620000000001e-05],"152":[1.28899e-06,1.3003000000000001e-06,1.3009100000000002e-06,1.3330300000000002e-06,1.37105e-06,1.3827699999999999e-06,1.3832600000000001e-06,1.3872600000000002e-06,1.3984400000000001e-06,1.3990699999999999e-06,1.41191e-06],"5120":[6.5208499999999997e-05,6.9845000000000006e-05,7.1575800000000007e-05,7.2716e-05,7.2802810810810811e-05,7.2858660000000005e-05,7.3154375000000004e-05,7.4019045454545452e-05,7.4582060000000003e-05,7.5235939999999992e-05,7.61185e-05],"1507328":[0.073093865000000008,0.074235582999999994,0.074723864000000001,0.07546667700000001,0.075590374500000029,0.076016188999999998,0.077530894000000003,0.080474779999999996,0.085180447999999992,0.090810291999999987],"1216":[1.2320169999999999e-05,1.2546e-05,1.26544e-05,1.2839307692307692e-05,1.2859519999999999e-05,1.296241e-05,1.2979436363636364e-05,1.3120460000000001e-05,1.3206590000000001e-05,1.3323888888888889e-05,1.3368833333333333e-05],"1966080":[0.107242218,0.10745128499999999,0.1077313355,0.110635258,0.111538862,0.11253192999999995,0.1130360015,0.11595937899999997,0.1161888515],"1900544":[0.10114084700000001,0.10513518450000001,0.10566898600000001,0.106656426,0.106679944,0.1078778375,0.10890751250000003,0.1097766285,0.1135006305],"184":[1.61836e-06,1.6401799999999999e-06,1.64633e-06,1.6741600000000002e-06,1.7012900000000001e-06,1.7014600000000001e-06,1.7164099999999998e-06,1.7293000000000001e-06,1.7853699999999999e-06,1.8010500000000001e-06,1.82542e-06],"7936":[9.6200999999999996e-05,9.7485666666666661e-05,9.7975400000000011e-05,9.9695e-05,0.000100448,0.000102227,0.00010226577777777777,0.000102842,0.00010330770238095241,0.000103541,0.00010366217894736841],"3801088":[0.22505275850000001,0.22507452999999999,0.226402889,0.22717086349999999,0.229750175,0.23200907800000001],"6815744":[0.42080383850000003,0.42416488900000004,0.4250701295,0.42567172149999999,0.42778766000000001,0.44053029199999999],"124":[1.0499599999999999e-06,1.05061e-06,1.0606099999999999e-06,1.06096e-06,1.09416e-06,1.1038300000000001e-06,1.1200300000000001e-06,1.12087e-06,1.1292599999999999e-06,1.1401700000000001e-06,1.15003e-06],"102400":[0.0017622229999999996,0.0017817476,0.0017966041999999999,0.0018021879999999993,0.0018143774000000002,0.0018271769999999999,0.001827448,0.0018382765999999998,0.0018451799999999997,0.0018488129999999995,0.001851833],"311296":[0.0069829150000000036,0.0069868029999999998,0.007055936000000004,0.007180891,0.007197688000000005,0.0072974019999999997,0.0073404149999999977,0.0073532049999999998,0.0073708490000000014,0.0076624899999999992,0.0077298319999999972],"1408":[1.6002322580645162e-05,1.602045e-05,1.6246e-05,1.6383821052631579e-05,1.6533279999999998e-05,1.6546309999999998e-05,1.666131e-05,1.7692910000000002e-05,1.771811e-05,1.7784730000000001e-05,1.798885714285714e-05],"393216":[0.0099527774999999992,0.010065889999999999,0.010113243500000002,0.010170957499999999,0.010177426,0.010291326999999999,0.01038472,0.010387868,0.0105343005,0.010819118499999999,0.01156681],"4352":[4.90685e-05,5.3594030000000004e-05,5.4818499999999997e-05,5.5019999999999998e-05,5.5156559999999997e-05,5.5260769230769234e-05,5.5353999999999999e-05,5.5432626666666666e-05,5.7005170000000006e-05,5.8138515624999998e-05,6.2201289999999989e-05],"6553600":[0.40314571500000002,0.40458008499999998,0.40519472350000002,0.40526704099999999,0.40560090100000001,0.42603819900000001],"20480":[0.00028849300000000002,0.00030825500000000001,0.00030991999999999999,0.00031622600000000002,0.00031653300000000008,0.00031746299999999998,0.00031807500000000002,0.00031919199999999999,0.00032688599999999992,0.00033540962068965522,0.00033718635714285718],"608":[5.5254600000000005e-06,5.6349199999999997e-06,5.6942999999999998e-06,5.7286900000000009e-06,5.7332399999999998e-06,5.8047000000000005e-06,5.8248666666666674e-06,5.9338700000000005e-06,6.0684199999999999e-06,6.0907799999999996e-06,6.1593499999999997e-06],"2228224":[0.12518080400000001,0.126343445,0.126684512,0.127492192,0.12770494300000002,0.12847511900000003,0.13015981600000001,0.13381599249999998],"36864":[0.00053263599999999974,0.00053976099999999971,0.00055324147058823526,0.000556567,0.00055783105882352933,0.000563322,0.00057409568750000002,0.00057889780000000015,0.00057920599999999975,0.00060218974999999998,0.00060708500000000037],"704":[6.84659e-06,6.9159607843137253e-06,6.9316199999999995e-06,6.9736578947368413e-06,7.06047e-06,7.2137099999999991e-06,7.2138599999999994e-06,7.2593899999999996e-06,7.3258100000000009e-06,7.3803499999999996e-06,7.3929999999999994e-06],"720896":[0.020293675000000004,0.020345434500000002,0.020783835000000001,0.020931127000000001,0.020953988,0.021785974,0.022004625999999999,0.02200676,0.022123918999999999,0.034231874499999995],"800":[7.2235200000000001e-06,7.3543100000000007e-06,7.3849400000000005e-06,7.4937900000000003e-06,7.6444200000000006e-06,7.670580000000001e-06,7.76668e-06,7.8024400000000011e-06,7.827142857142858e-06,7.8497599999999995e-06,8.6031300000000011e-06],"2621440":[0.14861614200000001,0.15729971500000001,0.157856997,0.16142735999999999,0.162050799,0.16865291800000001],"425984":[0.0098839060000000031,0.010369027999999999,0.010372063000000001,0.010534715,0.010683900500000001,0.010918291,0.011742625,0.012246489499999999,0.012553059,0.0128292515,0.013724693499999999],"32768":[0.00045164223809523817,0.00046006780952380962,0.00046339600000000003,0.00046455000000000004,0.00046523799999999987,0.00046611499999999991,0.0004729945500000001,0.00048344333333333322,0.0004943564444444443,0.00049861000000000003,0.00051697100000000018],"12058624":[0.89687685799999994,0.89924159550000005,0.90263033449999996,0.90513672099999998,0.90643030599999996,0.91156685650000002],"128":[1.07966e-06,1.0888999999999999e-06,1.1026400000000001e-06,1.1274800000000001e-06,1.13244e-06,1.1401000000000001e-06,1.1419199999999999e-06,1.1488699999999999e-06,1.1765999999999999e-06,1.18552e-06,1.1976600000000002e-06],"180224":[0.0039829865000000015,0.004014087999999999,0.0040461479999999985,0.0040526974999999998,0.0040952919999999986,0.0041054289999999998,0.0041312909999999996,0.0041358795,0.0041950100000000016,0.0043085450000000004,0.0043482354999999978],"224":[1.9576500000000002e-06,1.9658636363636362e-06,1.98371e-06,2.0067300000000002e-06,2.01013e-06,2.0259021739130436e-06,2.0261500000000001e-06,2.0513000000000002e-06,2.0804399999999999e-06,2.1005555555555554e-06,2.1338800000000003e-06],"736":[7.1278333333333332e-06,7.2908599999999997e-06,7.3258999999999996e-06,7.3900000000000004e-06,7.4100975609756101e-06,7.4285000000000001e-06,7.4670666666666666e-06,7.5865199999999998e-06,7.6632352941176479e-06,7.7710599999999998e-06,7.8475900000000002e-06],"320":[2.8420000000000001e-06,2.8522900000000004e-06,2.8853300000000001e-06,2.9071499999999998e-06,2.9673600000000003e-06,2.9685483870967743e-06,3.0767199999999998e-06,3.0836899999999999e-06,3.09219e-06,3.1156899999999998e-06,3.1325000000000001e-06],"557056":[0.014985131,0.0161313415,0.016255703999999999,0.0170326365,0.017905693,0.018152465,0.019691920000000002,0.019772735,0.021740408500000002,0.031294217999999999],"832":[7.7563900000000001e-06,7.8028299999999996e-06,7.8877200000000004e-06,7.9994300000000004e-06,8.1348599999999996e-06,8.2548299999999997e-06,8.2637599999999993e-06,8.3213299999999998e-06,8.3502699999999999e-06,8.40408e-06,8.9332600000000003e-06],"9437184":[0.62792124399999993,0.63122524800000002,0.63712095599999996,0.64355886499999992,0.64449681299999995,0.65463732499999994],"3584":[3.9286000000000003e-05,4.0784539999999998e-05,4.0802268292682924e-05,4.0961999999999998e-05,4.0986549999999995e-05,4.1105020000000002e-05,4.1412920000000006e-05,4.155464e-05,4.1640000000000001e-05,4.1852423076923083e-05,4.3131640000000002e-05],"6291456":[0.45391955849999999,0.45415206900000005,0.45798088399999998,0.45858741800000002,0.46264144400000001,0.47252152949999998],"256":[2.1759799999999999e-06,2.1839e-06,2.2844600000000001e-06,2.2864799999999999e-06,2.28843e-06,2.3245299999999999e-06,2.3860999999999999e-06,2.3956899999999999e-06,2.4028799999999998e-06,2.4234e-06,2.4461249999999998e-06],"15204352":[1.0115246305000001,1.0117873209999999,1.0195533189999999,1.021871475,1.0282100199999999,1.0314930185],"28672":[0.0003603490000000001,0.00036064000000000002,0.00036744999999999996,0.00037101746153846138,0.00037315108695652174,0.00037885500000000004,0.000380109,0.0003817540000000001,0.00039221775999999999,0.00040063147826086953,0.00041786378260869571],"768":[7.5823500000000003e-06,7.7339523809523814e-06,7.8455400000000008e-06,7.8779999999999998e-06,7.9800199999999995e-06,8.0351599999999995e-06,8.1531100000000006e-06,8.2242222222222211e-06,8.3040200000000002e-06,8.3337199999999992e-06,8.6199099999999993e-06],"212992":[0.0041919804999999977,0.0042301984999999999,0.0042391180000000018,0.0042442134999999982,0.004370345999999998,0.0043911139999999998,0.0046086970000000001,0.0046113159999999999,0.0048439999999999985,0.0051367679999999982,0.0052071009999999996],"864":[7.8665800000000005e-06,7.8970000000000008e-06,7.9163499999999992e-06,8.0559100000000009e-06,8.0709900000000005e-06,8.3446199999999994e-06,8.36267e-06,8.3913846153846152e-06,8.5444400000000001e-06,8.5465300000000007e-06,8.8080700000000009e-06],"352":[3.16783e-06,3.19468e-06,3.2399399999999999e-06,3.34639e-06,3.35914e-06,3.3622300000000002e-06,3.36425e-06,3.4141999999999999e-06,3.4166800000000001e-06,3.4347400000000002e-06,3.4669999999999996e-06],"253952":[0.0052089900000000001,0.0053257590000000011,0.0053276040000000014,0.005433645,0.0055190790000000014,0.0055475399999999975,0.0058477960000000015,0.0059765880000000014,0.0063081370000000001,0.0064060669999999997,0.007371028],"960":[9.1401000000000008e-06,9.2620899999999999e-06,9.3745499999999999e-06,9.3913400000000004e-06,9.5443000000000011e-06,9.5674999999999995e-06,9.59216e-06,9.6862700000000004e-06,9.8020500000000005e-06,9.8044100000000012e-06,9.8601599999999998e-06],"24576":[0.00040692500000000009,0.00041035300000000013,0.00041304299999999993,0.00041520917391304351,0.0004214360869565216,0.00042839699999999996,0.00043141300000000012,0.000431722,0.00043226000000000001,0.00044127995454545428,0.00046442879999999997],"7680":[8.8395999999999999e-05,9.0756999999999999e-05,9.1365000000000004e-05,9.3708888888888891e-05,9.5100692307692315e-05,9.5374500000000006e-05,9.6704666666666669e-05,9.7007000000000001e-05,9.7298071428571421e-05,0.00010679337634408605,0.000107778],"294912":[0.0063088659999999989,0.0063874190000000001,0.0065913289999999999,0.0066397379999999975,0.0069614150000000003,0.0069891990000000015,0.0071250200000000001,0.0072676950000000002,0.0073105589999999995,0.0079133220000000004,0.010744381000000001],"1048576":[0.043556835999999988,0.045485953999999981,0.045743740000000019,0.046464277999999998,0.04666918099999999,0.047561722000000001,0.049152217499999991,0.049667049000000019,0.055506274000000001,0.055540582000000019],"10485760":[0.72310091450000002,0.73322798,0.73581843599999996,0.73667801799999999,0.73957228549999998,0.75424833400000002],"344064":[0.0081558259999999997,0.0082404769999999995,0.0082585309999999995,0.0082634539999999999,0.0083830899999999993,0.0084187970000000022,0.0086639079999999997,0.0086810980000000034,0.0086994749999999999,0.0089371640000000044,0.0089793300000000006],"288":[2.4955399999999999e-06,2.4968e-06,2.50857e-06,2.5779299999999999e-06,2.6076899999999998e-06,2.6477999999999999e-06,2.71872e-06,2.7315699999999998e-06,2.7622600000000004e-06,2.8132e-06,3.0604999999999998e-06],"1152":[1.144607e-05,1.2074e-05,1.208967e-05,1.2142690000000001e-05,1.2193250000000001e-05,1.222477e-05,1.2366285714285713e-05,1.2409789999999999e-05,1.2525e-05,1.2608999999999999e-05,1.269477e-05],"384":[3.45207e-06,3.4710100000000002e-06,3.5286899999999999e-06,3.5489700000000003e-06,3.6311299999999998e-06,3.6408099999999998e-06,3.6538500000000002e-06,3.6563500000000002e-06,3.7145899999999997e-06,3.8534399999999997e-06,3.9286900000000003e-06],"2304":[2.6888390000000001e-05,2.697953e-05,2.7024000000000001e-05,2.7081333333333331e-05,2.7331550000000001e-05,2.7619189999999997e-05,2.7732050000000002e-05,2.8046149999999999e-05,2.8261710000000002e-05,2.8288800000000003e-05,2.8512190000000001e-05],"896":[8.6091899999999998e-06,8.6988500000000006e-06,8.781410000000001e-06,8.8240900000000001e-06,8.8257400000000003e-06,8.8276500000000001e-06,8.8447899999999997e-06,8.85436e-06,8.8787599999999993e-06,8.9443500000000002e-06,9.0012100000000002e-06],"480":[4.1509999999999997e-06,4.2246600000000001e-06,4.4002199999999995e-06,4.4191300000000002e-06,4.4318599999999996e-06,4.4356200000000001e-06,4.4738000000000003e-06,4.5120299999999997e-06,4.6347699999999997e-06,4.6403500000000004e-06,5.0701500000000001e-06],"1441792":[0.065758836000000001,0.06700563499999998,0.075369024000000007,0.075508796999999989,0.075803257999999998,0.075828014000000027,0.075836330000000007,0.077422866000000007,0.079940562999999992,0.081461263499999992],"992":[9.3885e-06,9.5724e-06,9.5967900000000003e-06,9.6637800000000008e-06,9.8155000000000011e-06,9.9651100000000012e-06,1.0188964285714286e-05,1.0205410256410256e-05,1.031047e-05,1.0802170000000001e-05,1.0841666666666666e-05],"3968":[4.3789999999999999e-05,4.4064333333333331e-05,4.4665875e-05,4.5024999999999997e-05,4.5045333333333334e-05,4.5931166666666665e-05,4.6339850000000003e-05,4.7603000000000005e-05,4.8280820000000002e-05,4.9039999999999998e-05,4.9833780000000002e-05],"6400":[7.0232000000000001e-05,7.0401000000000006e-05,7.0503454545454538e-05,7.0833000000000004e-05,7.278556e-05,7.4590010000000003e-05,7.5037968749999998e-05,7.524608000000001e-05,7.5859999999999995e-05,7.6798249999999739e-05,7.9239999999999993e-05],"1344":[1.4287000000000001e-05,1.4578159999999999e-05,1.4912949999999999e-05,1.5032240000000001e-05,1.518873e-05,1.5359999999999999e-05,1.5371579999999999e-05,1.559967e-05,1.5663129999999998e-05,1.650459e-05,1.668781e-05],"126976":[0.0023153434999999998,0.0023200539999999998,0.0023267159999999999,0.0023476779999999993,0.0023699904999999995,0.0023829312499999999,0.0024074637500000008,0.0024087520000000001,0.0024134730000000002,0.0024700920000000001,0.0024873180000000001],"2883584":[0.175944349,0.1816793655,0.18205913200000001,0.18375081500000001,0.186052999,0.18983792300000002],"753664":[0.021095841000000001,0.021813871999999963,0.0226761085,0.022812414,0.023499402999999992,0.024607742499999981,0.027034908999999996,0.027169641000000001,0.029918293000000002,0.032273270499999986],"16384":[0.00020616725,0.00020904999999999999,0.00021266899999999991,0.00021386899999999999,0.00021807673333333334,0.000220864,0.000223196,0.000224379,0.00022438956818181819,0.000228264,0.00024028599999999987],"131072":[0.00242727,0.0024640909999999999,0.0024684397499999998,0.002481446,0.00249695,0.0025067843333333329,0.0025211549999999993,0.0025387589999999998,0.002542012000000001,0.0025580079999999988,0.0026509800000000007],"458752":[0.010859194499999999,0.010867053,0.011028724,0.011058281999999999,0.011278130000000001,0.011407308500000001,0.011853035,0.011873273,0.01248957,0.014574564,0.021791072000000002],"172032":[0.0036669369999999999,0.0036734159999999997,0.0037032040000000003,0.0037434389999999999,0.0037529779999999997,0.0037817269999999999,0.0038568719999999999,0.0038858450000000002,0.003909437,0.0039506704999999996,0.004053315],"12288":[0.000188097,0.00020096799999999999,0.00020525653333333332,0.000206188,0.00020747486956521725,0.000208581,0.00020879693478260863,0.000210285,0.00021066793548387097,0.00021518636585365859,0.00021616425],"14680064":[0.96429347600000004,0.96618635500000005,0.96842924900000005,0.97294051150000005,0.97587006249999997,0.97754710600000005],"1536":[1.7816941176470588e-05,1.8974428571428571e-05,1.9160450000000001e-05,1.957691e-05,1.994409e-05,2.005306e-05,2.056131e-05,2.0565e-05,2.0720930000000002e-05,2.13345e-05,2.2054570000000002e-05],"25600":[0.00029964599999999998,0.00030695500000000009,0.00030992200000000013,0.00031407499999999998,0.00032016499999999991,0.00032191871428571427,0.000322243,0.00032230599999999985,0.00032607699999999981,0.00033072800000000002,0.00034945940000000002],"1835008":[0.097744958499999993,0.10022489399999999,0.10091051099999999,0.102152306,0.10374008999999999,0.104514939,0.10485559,0.1059302745,0.10644440400000001],"10752":[0.00015755899999999999,0.00015910383333333334,0.00016079399999999999,0.0001608124482758621,0.0001635190000000001,0.00016473799999999999,0.00016641799999999994,0.00016782761016949162,0.00016999199999999999,0.00017040099999999996,0.00017711200000000005],"21504":[0.000314662,0.00032723299999999991,0.0003309220000000001,0.00033155911538461553,0.0003382905,0.000341317,0.0003418899999999998,0.00034657599999999992,0.00036330457692307697,0.00036743099999999993,0.00037226407692307688],"7602176":[0.47702020499999997,0.47814612499999998,0.479004983,0.48313894000000002,0.48678710949999998,0.4875590125],"5632":[7.9148249999999999e-05,8.0174999999999997e-05,8.4085307692307701e-05,8.4563999999999999e-05,8.4845775510204087e-05,8.4978840000000003e-05,8.5179812499999998e-05,8.5373599999999999e-05,8.5535857142857139e-05,8.7210240000000003e-05,8.7802249999999988e-05],"10":[8.6670000000000008e-08,8.7229999999999994e-08,8.734e-08,8.8160000000000003e-08,8.9570000000000014e-08,8.9999999999999999e-08,9.0929999999999994e-08,9.2159999999999999e-08,9.3340000000000014e-08,9.4709999999999992e-08,9.548999999999999e-08],"3145728":[0.19822565149999999,0.20262267549999999,0.20346279350000002,0.20744650000000001,0.21119884799999999,0.21779763999999999],"245760":[0.0049607280000000002,0.0050313850000000011,0.0050873710000000003,0.0051014229999999982,0.0051599999999999997,0.0051653199999999993,0.0051750939999999999,0.0053447909999999989,0.0054222909999999992,0.0055516250000000001,0.0056352109999999976],"1728":[1.6739e-05,1.7179750000000001e-05,1.7208830000000002e-05,1.7775333333333332e-05,1.7884859999999999e-05,1.8149040000000001e-05,1.8208439999999999e-05,1.8305350000000003e-05,1.8320590000000001e-05,1.8403279999999999e-05,2.0727929999999997e-05],"11":[9.474e-08,9.5529999999999996e-08,9.7300000000000004e-08,9.8260000000000008e-08,9.8300000000000013e-08,9.8570000000000002e-08,9.8949999999999996e-08,1.0021e-07,1.0056e-07,1.011e-07,1.0825999999999999e-07],"1114112":[0.048451729000000013,0.048783307999999997,0.04889916100000001,0.050588920999999995,0.0513789755,0.053674982000000003,0.055828221999999997,0.057312638999999999,0.060094777000000002,0.066103786499999997],"12":[1.0231999999999999e-07,1.038e-07,1.0525000000000001e-07,1.0734999999999999e-07,1.0746e-07,1.081e-07,1.0950000000000001e-07,1.1087000000000001e-07,1.1168999999999999e-07,1.1171e-07,1.2321999999999999e-07],"7340032":[0.46074435349999998,0.460856922,0.46120006899999999,0.461738062,0.46322849799999999,0.47435976800000001],"7168":[8.3220999999999995e-05,8.3701735294117643e-05,8.6044999999999994e-05,8.6506714285714291e-05,8.6558999999999996e-05,8.7003846153846148e-05,8.7070770000000005e-05,8.7436999999999996e-05,8.836583333333334e-05,9.2677999999999996e-05,9.309249999999999e-05],"13":[1.0917e-07,1.0924e-07,1.1052e-07,1.1100999999999999e-07,1.1226e-07,1.1229000000000001e-07,1.1469e-07,1.1919000000000001e-07,1.2116000000000001e-07,1.2140000000000002e-07,1.2272e-07],"6029312":[0.42260415400000001,0.42261109100000005,0.43047568400000003,0.430934015,0.43942621800000004,0.47323348900000001],"14":[1.1728e-07,1.1844999999999999e-07,1.1849e-07,1.1933e-07,1.1943999999999999e-07,1.1978999999999999e-07,1.2396999999999999e-07,1.2653999999999999e-07,1.276e-07,1.3017999999999999e-07,1.3114e-07],"3200":[3.3041000000000004e-05,3.3128659999999997e-05,3.3756e-05,3.5045970000000001e-05,3.5059459999999996e-05,3.5099666666666665e-05,3.5114285714285716e-05,3.5259599999999997e-05,3.5654329999999997e-05,3.7782250000000002e-05,3.8681389999999998e-05],"20":[1.7281e-07,1.7368e-07,1.7694999999999998e-07,1.7757999999999998e-07,1.7788e-07,1.8068999999999999e-07,1.8164e-07,1.8226000000000002e-07,1.8360999999999999e-07,1.878e-07,1.9008000000000002e-07],"204800":[0.0039471295000000003,0.0039758145,0.0040138805000000015,0.0040461044999999998,0.0040700419999999994,0.0040770840000000008,0.0041243600000000014,0.0041470180000000006,0.0042763259999999987,0.0042797264999999982,0.0043218680000000004],"15":[1.2657e-07,1.2701e-07,1.2709999999999999e-07,1.2748999999999999e-07,1.2891000000000001e-07,1.2940999999999999e-07,1.3213000000000001e-07,1.3370000000000001e-07,1.3388999999999999e-07,1.3451e-07,1.4004e-07],"13312":[0.00015382900000000005,0.00015514349999999996,0.00015810300000000001,0.00015892199999999995,0.00015945599999999996,0.00016190599999999999,0.00016415058333333336,0.000165852,0.00016672405454545454,0.000167054,0.0001672294],"4980736":[0.323308074,0.32349728200000005,0.32421259000000002,0.32437894,0.32767987100000001,0.32990365900000002],"118784":[0.0020732390000000002,0.0021041645000000001,0.0021116329999999999,0.0021360197500000008,0.00215486275,0.0021563107500000003,0.0021602849999999988,0.0021688397500000001,0.0021846187500000002,0.002260841,0.0022646740000000004],"51200":[0.00071291399999999971,0.00071471900000000027,0.00072515899999999996,0.00073432599999999999,0.00073531774999999991,0.000735387,0.00073962238461538457,0.0007487681666666665,0.00075099149999999974,0.00076575799999999996,0.00077421533333333324],"16":[1.3537e-07,1.3628e-07,1.3675e-07,1.3742e-07,1.4044000000000001e-07,1.4167e-07,1.4364000000000001e-07,1.4386000000000002e-07,1.4821999999999999e-07,1.5129e-07,1.5302e-07],"21":[1.8045e-07,1.8122999999999999e-07,1.8552000000000001e-07,1.8576999999999998e-07,1.8760000000000001e-07,1.878e-07,1.8946999999999999e-07,1.9150000000000001e-07,1.9188e-07,1.92e-07,1.9289e-07],"917504":[0.037283535999999985,0.037914518999999987,0.038358235000000004,0.038390506000000012,0.038992270000000009,0.040297123000000004,0.040523593999999996,0.040645754999999992,0.043248560999999998,0.044963413000000001],"22":[1.8983e-07,1.9126000000000001e-07,1.9146e-07,1.9343000000000001e-07,1.9350000000000001e-07,1.9361999999999998e-07,1.9544999999999999e-07,1.9864000000000001e-07,2.0102000000000001e-07,2.1348999999999999e-07,2.2193e-07],"4864":[6.4099989999999999e-05,6.4669169999999999e-05,6.5083309999999995e-05,6.6161816326530616e-05,6.6289159999999999e-05,6.6397999999999997e-05,6.663297727272727e-05,6.7479949999999994e-05,6.7688720000000003e-05,6.8225550000000003e-05,7.3496228571428565e-05],"17":[1.4273000000000001e-07,1.4349e-07,1.4426999999999998e-07,1.4622e-07,1.4733999999999999e-07,1.4961e-07,1.5306e-07,1.5454000000000001e-07,1.5458999999999998e-07,1.5536999999999999e-07,1.6381000000000001e-07],"14848":[0.0001798825,0.00018161999999999999,0.00018277009803921573,0.00018479400000000001,0.00018667,0.0001867638,0.00018767499999999999,0.0001893815,0.00018939982692307695,0.00019494299999999999,0.00020910500000000001],"23":[1.9451000000000001e-07,1.9786e-07,1.9823999999999998e-07,2.0514999999999998e-07,2.0571999999999999e-07,2.0813e-07,2.1092000000000001e-07,2.1213999999999999e-07,2.1313e-07,2.1402000000000001e-07,2.3647e-07],"786432":[0.02305188,0.023281860000000001,0.023929841,0.024357075000000002,0.024966328999999992,0.026426129,0.026839057999999992,0.0274571615,0.0279477835,0.034525920000000002],"18":[1.5199e-07,1.5255999999999998e-07,1.5379e-07,1.5424000000000001e-07,1.5693000000000002e-07,1.5752e-07,1.6147999999999999e-07,1.6224e-07,1.6231e-07,1.681e-07,1.8204000000000001e-07],"1638400":[0.085049338000000016,0.085140756999999984,0.086188620500000007,0.088867003999999986,0.089676627000000023,0.08982599400000002,0.090081636999999992,0.0920757715,0.092113698999999993,0.093570351999999996],"7864320":[0.49579360300000003,0.50113387799999998,0.50138732750000004,0.50187687000000003,0.50465054599999992,0.51036575449999999],"24":[2.0517999999999999e-07,2.0579000000000002e-07,2.1359999999999998e-07,2.2116e-07,2.2294000000000001e-07,2.244e-07,2.2707000000000001e-07,2.2812000000000001e-07,2.2842e-07,2.304e-07,2.3521999999999998e-07],"14155776":[0.92332010749999993,0.92652426899999996,0.93076750450000001,0.93089249249999995,0.93833361650000002,0.94838841500000004],"19":[1.6133999999999999e-07,1.6158999999999998e-07,1.6432e-07,1.6696999999999999e-07,1.6744000000000002e-07,1.6815999999999999e-07,1.7062e-07,1.7186e-07,1.7223e-07,1.7748999999999998e-07,1.8050000000000001e-07],"30":[2.5522000000000003e-07,2.5638999999999998e-07,2.5726999999999997e-07,2.6515000000000002e-07,2.6642000000000003e-07,2.6862000000000003e-07,2.7153e-07,2.7827999999999997e-07,2.7871000000000004e-07,2.8051999999999997e-07,2.8312000000000001e-07],"25":[2.1220000000000001e-07,2.1381999999999999e-07,2.1596999999999999e-07,2.1624999999999999e-07,2.1631999999999999e-07,2.178e-07,2.1983e-07,2.2047000000000001e-07,2.2167999999999998e-07,2.2795e-07,2.3059999999999999e-07],"31":[2.6220999999999996e-07,2.6344999999999999e-07,2.7051e-07,2.7189999999999999e-07,2.7201000000000001e-07,2.7377e-07,2.7461e-07,2.7613000000000002e-07,2.7902999999999998e-07,2.8453000000000002e-07,2.8887999999999998e-07],"1280":[1.348291e-05,1.354813e-05,1.367037e-05,1.391249e-05,1.4029629999999999e-05,1.4036138461538461e-05,1.421565e-05,1.4383546874999999e-05,1.4679700000000001e-05,1.489894e-05,1.496667e-05],"26":[2.1486000000000001e-07,2.2081999999999999e-07,2.2265e-07,2.2458000000000002e-07,2.2891e-07,2.2979000000000002e-07,2.3003999999999999e-07,2.3028999999999998e-07,2.3044000000000002e-07,2.3166000000000002e-07,2.4120000000000002e-07],"3932160":[0.23437410400000003,0.23601983400000001,0.23796900899999995,0.23948480049999998,0.24054900550000002,0.24116907000000001],"2432":[2.7608999999999999e-05,2.7971e-05,2.8135000000000001e-05,2.8721000000000002e-05,2.872776e-05,2.9992e-05,3.025097e-05,3.0628879999999999e-05,3.2541470000000005e-05,3.2585990000000002e-05,3.2604519999999997e-05],"32":[2.6983999999999999e-07,2.6992999999999998e-07,2.7860000000000002e-07,2.8238999999999998e-07,2.8276999999999998e-07,2.8296000000000004e-07,2.8370999999999999e-07,2.8569999999999997e-07,2.8718000000000001e-07,2.8873999999999998e-07,2.9642e-07],"27":[2.2399000000000001e-07,2.2756000000000001e-07,2.3064999999999999e-07,2.3573000000000001e-07,2.3708e-07,2.4124000000000001e-07,2.4165e-07,2.4375e-07,2.4465000000000001e-07,2.4553e-07,2.5216e-07],"409600":[0.009227599999999999,0.0095346199999999971,0.0096848149999999994,0.0097744044999999932,0.010035373000000011,0.010060566,0.010156979,0.010440133000000001,0.011477351,0.012037643000000001,0.014448931]}},{"title":"OrderedSet successful contains","results":{"28":[4.8943999999999997e-07,5.1996000000000006e-07],"34":[6.1175000000000001e-07,6.582e-07],"29":[5.0528000000000004e-07,5.2373000000000004e-07],"40":[7.6142000000000005e-07,8.5062000000000008e-07],"17408":[0.00044958900000000008,0.00049233999999999986],"1472":[4.0877000000000002e-05,4.4917359999999995e-05],"112":[2.06412e-06,2.1511699999999999e-06],"1376256":[0.16068612600000001,0.214812592],"5242880":[0.88248452649999998,0.88808547049999997],"36":[6.5221000000000004e-07,7.0510000000000003e-07],"42":[7.9423000000000004e-07,8.3241000000000003e-07],"11534336":[2.154178736,2.1672689030000001],"114688":[0.003983159,0.0043451045000000004],"144":[2.9323000000000003e-06,2.9508799999999999e-06],"38":[6.9925000000000002e-07,7.2221999999999996e-07],"240":[4.4524699999999997e-06,4.5192200000000004e-06],"9216":[0.00024195299999999997,0.00026888500000000001],"44":[8.6469e-07,9.1878000000000008e-07],"1664":[3.6027369999999998e-05,3.6622272727272728e-05],"196608":[0.011069908999999999,0.011194042],"155648":[0.0068003100000000012,0.0068455059999999986],"2816":[7.8578999999999994e-05,8.5284479999999998e-05],"50":[8.8894999999999998e-07,9.787099999999999e-07],"2359296":[0.32228834899999997,0.32259127399999998],"46":[9.0457999999999996e-07,9.8494999999999999e-07],"176":[4.0050300000000002e-06,4.2585799999999996e-06],"52":[9.6582999999999991e-07,1.0007199999999999e-06],"272":[5.2558100000000004e-06,5.8016399999999999e-06],"116":[2.15937e-06,2.1781599999999999e-06],"47104":[0.0016410891666666671,0.0016767445999999991],"6912":[0.00015860399999999999,0.00018991899999999998],"1856":[4.1011190000000004e-05,4.3022870000000002e-05],"48":[9.8516000000000007e-07,1.10305e-06],"2097152":[0.26211340250000004,0.26989898000000001],"54":[9.6972999999999999e-07,1.01829e-06],"2031616":[0.24357292100000005,0.25820922200000002],"43008":[0.00137787,0.0014521353333333338],"60":[1.09545e-06,1.1643500000000001e-06],"30720":[0.00080971858333333342,0.000846078],"56":[1.0521100000000001e-06,1.0692300000000001e-06],"62":[1.1611599999999999e-06,1.1824600000000001e-06],"58":[1.10302e-06,1.1072900000000001e-06],"3014656":[0.51103748100000002,0.54583590800000004],"64":[1.2015699999999999e-06,1.2204500000000001e-06],"8388608":[1.3125058300000001,1.3264299990000001],"29696":[0.00077036699999999999,0.00080377499999999995],"216":[4.1059699999999998e-06,4.25965e-06],"106496":[0.003584318,0.003789836],"72":[1.3712699999999999e-06,1.59734e-06],"442368":[0.019664686000000001,0.020611927999999995],"147456":[0.0062380159999999999,0.0063423799999999999],"4456448":[0.67015226900000002,0.70218692500000002],"63488":[0.001891497,0.0020033555000000002],"38912":[0.001213191,0.0012713219999999996],"68":[1.3044299999999999e-06,1.3233400000000001e-06],"188416":[0.0095978409999999993,0.010138789],"248":[4.9283800000000004e-06,5.19082e-06],"80":[1.63878e-06,1.8298100000000001e-06],"2560":[6.6953539999999991e-05,7.1792720000000003e-05],"34816":[0.00097107399999999994,0.001006273],"3712":[8.5006066666666659e-05,9.0319e-05],"3538944":[0.49478685300000003,0.49794474300000002],"76":[1.43869e-06,1.6892799999999999e-06],"4194304":[0.61865826700000004,0.62560732800000007],"851968":[0.059810010999999996,0.096439498999999998],"4096":[0.00010466988888888891,0.00010672554216867465],"59392":[0.0016574439999999999,0.0017000454000000009],"84":[1.7237400000000002e-06,1.8382500000000001e-06],"3276800":[0.445185516,0.46053181100000001],"55296":[0.0014578410000000001,0.001577955],"688128":[0.042568079000000002,0.065188782000000015],"8192":[0.00020876600000000004,0.00022162200000000004],"10240":[0.00030259090625,0.00032985010344827585],"15872":[0.00042510291304347829,0.00043052100000000001],"92":[2.07334e-06,2.1644899999999999e-06],"26624":[0.000655841,0.00067577100000000003],"1792":[3.9725259999999994e-05,4.2016809999999995e-05],"11776":[0.00038976750000000007,0.00040892100000000002],"2944":[9.0147000000000003e-05,9.34154e-05],"88":[1.9033599999999998e-06,2.0065799999999999e-06],"22528":[0.00072660230769230785,0.00075213591666666664],"1245184":[0.1217144625,0.1846951335],"15728640":[2.5683320379999999,2.6015259180000001],"96":[1.95112e-06,2.30692e-06],"1984":[4.2524000000000001e-05,4.6702059999999999e-05],"139264":[0.0057886860000000004,0.005822972],"475136":[0.022496038999999995,0.029362337000000016],"13631488":[2.0923317715,2.1802092035],"416":[8.1694399999999995e-06,8.1918400000000012e-06],"928":[1.9117310000000001e-05,2.0256364864864864e-05],"512":[1.0405329999999999e-05,1.123519e-05],"18432":[0.00052788911111111122,0.00054115299999999973],"16777216":[2.8258759444999999],"9728":[0.00026326599999999996,0.00028534000000000003],"1769472":[0.20736990799999999,0.22273182399999999],"1703936":[0.195682674,0.22479190299999996],"2048":[4.592822e-05,4.9295570000000001e-05],"14336":[0.00036430369230769241,0.00036500199999999996],"448":[8.6199999999999988e-06,9.4886299999999996e-06],"5505024":[0.94888353250000002,0.96859037699999995],"544":[1.1354166666666667e-05,1.1998340000000001e-05],"221184":[0.0089761179999999999,0.0096980764999999997],"90112":[0.003349499000000001,0.0034168599999999999],"640":[1.4978e-05,1.6178590000000001e-05],"12800":[0.000295894,0.00030221700000000002],"262144":[0.011896147500000001,0.012260359],"589824":[0.030862115000000006,0.045937063],"884736":[0.071185454999999981,0.109730959],"6144":[0.00021646385714285712,0.00021867848888888894],"1088":[2.4703339999999997e-05,2.6128632352941177e-05],"576":[1.2622740000000001e-05,1.298834e-05],"160":[3.3154459459459462e-06,3.3909499999999997e-06],"672":[1.639764e-05,1.6791959999999998e-05],"8912896":[1.441688847,1.534050836],"100":[1.7697599999999999e-06,1.8421699999999999e-06],"507904":[0.024904352000000001,0.036322938000000006],"3840":[9.5996750000000005e-05,9.6229011111111112e-05],"192":[4.4065400000000003e-06,4.4247799999999998e-06],"376832":[0.022027367000000003,0.022056119999999999],"98304":[0.0041937384999999995,0.0042038469999999993],"5376":[0.00015765499999999998,0.00016795300000000004],"94208":[0.0037041909999999999,0.0038305370000000006],"81920":[0.0028652830000000002,0.0030711509999999998],"3407872":[0.47100826099999998,0.47698772899999997],"104":[1.8897000000000001e-06,1.96022e-06],"122880":[0.0047889835000000007,0.0047990610000000003],"200":[3.67471e-06,3.93911e-06],"163840":[0.007521744999999999,0.0076577800000000003],"4063232":[0.60035961249999992,0.60552437000000003],"5767168":[1.030783478,1.030801056],"12582912":[2.58985303,2.7753438099999999],"1600":[3.2950439999999998e-05,3.5163220000000004e-05],"136":[2.7035e-06,2.7504500000000001e-06],"232":[4.3001900000000001e-06,4.5609800000000003e-06],"7077888":[1.0379105449999999,1.1038148459999999],"86016":[0.0030901149999999987,0.0031796046666666676],"31744":[0.00081447699999999987,0.00087164700000000003],"168":[3.4421400000000003e-06,4.2888100000000002e-06],"622592":[0.037667678500000003,0.050325653499999998],"108":[1.9000500000000001e-06,1.9776099999999998e-06],"327680":[0.016928761000000001,0.017559862999999992],"2176":[5.1215799999999998e-05,5.2187670329670332e-05],"3328":[7.2243000000000006e-05,8.1364750000000001e-05],"1":[1.913e-08,2.1080000000000001e-08],"2":[3.4800000000000001e-08,3.4960000000000003e-08],"3":[5.0810000000000003e-08,5.5870000000000003e-08],"4":[6.6819999999999999e-08,6.6950000000000001e-08],"7424":[0.00019780459574468085,0.00020447],"5":[8.2849999999999991e-08,8.2879999999999998e-08],"23552":[0.00077891499999999992,0.00084484145454545437],"6":[1.0083e-07,1.0393e-07],"61440":[0.0019069144000000004,0.0019359410000000001],"491520":[0.023024680499999998,0.033549751500000002],"77824":[0.0026617109999999993,0.0026839869999999997],"7":[1.149e-07,1.1493e-07],"8":[1.3204999999999999e-07,1.5979999999999999e-07],"208":[3.9259099999999998e-06,4.1572199999999995e-06],"9":[1.5313e-07,1.5415000000000001e-07],"73728":[0.0024163739999999998,0.0025816520000000003],"304":[6.2645500000000009e-06,7.3745699999999993e-06],"400":[7.5854500000000004e-06,7.80918e-06],"1310720":[0.14141129399999999,0.18284591250000001],"336":[7.1366200000000001e-06,8.2491800000000009e-06],"3670016":[0.51586142300000004,0.52118074950000004],"6656":[0.00015029320000000003,0.0001608484],"15360":[0.00040691033333333334,0.00041222999999999997],"432":[8.6340099999999997e-06,9.1180800000000003e-06],"950272":[0.072032964000000033,0.10931840800000001],"655360":[0.038752693000000005,0.0626799195],"69632":[0.0020628090000000005,0.0022682069999999999],"11264":[0.00035801440740740738,0.00040133999999999992],"2752512":[0.41870466200000001,0.42339451500000003],"8126464":[1.268106476,1.285174466],"27648":[0.00068915199999999984,0.00071869807692307678],"368":[9.3350212765957446e-06,9.4066666666666675e-06],"65536":[0.0018663239999999997,0.0020318872500000003],"16252928":[2.6850088825,2.7075668175000001],"464":[9.4639999999999995e-06,9.4804300000000003e-06],"1015808":[0.085281678,0.120096782],"3072":[9.6677999999999998e-05,9.6827142857142849e-05],"110592":[0.0039441375000000001,0.0039698839999999999],"237568":[0.01030437,0.010610325],"278528":[0.012522541,0.013180856499999999],"496":[1.038941e-05,1.100799e-05],"13107200":[1.9774496070000001,2.0782398259999999],"9961472":[1.7067435280000001,1.762806034],"5888":[0.00017886099999999999,0.00019588100000000004],"11010048":[1.9715779755,2.0131581249999999],"1920":[4.1824760000000004e-05,4.2274800000000004e-05],"2490368":[0.35233484900000001,0.35585300800000003],"19456":[0.000543656,0.0005805719999999999],"57344":[0.001561219,0.001622559],"1179648":[0.1076868,0.1593651525],"4718592":[0.73369176450000007,0.74906236250000002],"360448":[0.019784968,0.019857089000000001],"1572864":[0.206988282,0.240864456],"53248":[0.0014205475,0.001441164166666667],"3456":[7.8073509999999991e-05,8.4412570000000003e-05],"40960":[0.001263005,0.0012647800000000001],"4608":[0.00011858700000000004,0.00012856864864864865],"13824":[0.00035590899999999996,0.000357661],"819200":[0.054216309500000004,0.093484828000000034],"983040":[0.0758644235,0.11059052849999999],"8704":[0.00022828892682926825,0.00024500199999999997],"120":[2.2600100000000002e-06,2.3229799999999999e-06],"1024":[2.1804999999999999e-05,2.2669710000000002e-05],"49152":[0.0017181099999999997,0.0018590254],"524288":[0.025518493,0.065280827],"45056":[0.0015109853333333337,0.0015896658333333334],"229376":[0.0094435509999999979,0.010447443000000001],"2688":[7.5630366666666667e-05,7.7371630000000005e-05],"152":[3.1551099999999999e-06,3.19723e-06],"5120":[0.000146279,0.00014870003278688522],"1507328":[0.17860435399999999,0.24115836700000001],"1216":[3.047051e-05,3.1964799999999996e-05],"1966080":[0.25264990399999998,0.26222083149999997],"1900544":[0.23925746949999999,0.25163262450000001],"184":[3.9443600000000005e-06,4.1971899999999995e-06],"7936":[0.00020595738636363642,0.000209602],"3801088":[0.54111209100000002,0.54423378200000005],"6815744":[1.0276452229999999,1.0407121054999999],"124":[2.4210000000000002e-06,2.75878e-06],"102400":[0.0034885184999999992,0.0036989090000000002],"311296":[0.015588532,0.015704442999999995],"1408":[3.4814000000000002e-05,4.3873250000000002e-05],"393216":[0.024440792499999996,0.024779773999999994],"4352":[0.00010855500000000001,0.000110723],"6553600":[0.96415786650000002,0.99865236199999996],"20480":[0.00058761900000000038,0.000598998],"608":[1.3942338235294117e-05,1.4864320000000001e-05],"2228224":[0.29182233000000002,0.2961683665],"36864":[0.0010775120000000001,0.0011622049999999999],"704":[1.6416e-05,1.8021944444444443e-05],"720896":[0.046973181999999995,0.064082584000000012],"800":[1.574898e-05,1.6953440000000002e-05],"2621440":[0.3791051755,0.396198877],"425984":[0.018969913000000001,0.020362807],"32768":[0.00087111699999999992,0.00098617679999999969],"12058624":[2.3344753090000001,2.3727321020000001],"128":[2.4122500000000001e-06,2.6045600000000002e-06],"180224":[0.008797155999999997,0.00922802],"224":[4.07609e-06,4.3988799999999998e-06],"736":[1.7726866666666668e-05,2.0036333333333333e-05],"320":[6.8179999999999998e-06,7.0208200000000003e-06],"557056":[0.0288972155,0.036214384000000002],"832":[1.6311830000000001e-05,1.782791e-05],"9437184":[1.6174950425000001,1.6213660674999999],"3584":[8.2938687500000002e-05,9.0419000000000003e-05],"6291456":[1.2458935550000001,1.2560381519999999],"256":[4.9623888888888887e-06,5.0900000000000004e-06],"15204352":[2.4528253640000002,2.5203606225000001],"28672":[0.00074771600000000005,0.0007528490000000001],"768":[2.0939999999999999e-05,2.3193e-05],"212992":[0.0086215569999999984,0.008682394999999999],"864":[1.7597200000000002e-05,1.825625e-05],"352":[7.9691899999999992e-06,8.2981799999999999e-06],"253952":[0.0112407415,0.011870916],"960":[2.0140790000000001e-05,2.2366069999999997e-05],"24576":[0.00085270499999999993,0.00091727469999999985],"7680":[0.000190817,0.000202473],"294912":[0.014117630000000001,0.014363220000000001],"1048576":[0.092637411499999961,0.124512158],"10485760":[1.8157596220000001,1.8342416420000001],"344064":[0.017632080000000001,0.019125205999999999],"288":[5.7785800000000003e-06,6.14256e-06],"1152":[2.7240310000000001e-05,2.9397e-05],"384":[8.8595299999999992e-06,9.8673299999999999e-06],"2304":[5.807497142857142e-05,5.8975499999999998e-05],"896":[1.7719509999999999e-05,1.8335333333333334e-05],"480":[9.6163333333333331e-06,1.069723e-05],"1441792":[0.16624802750000001,0.226522579],"992":[2.1431000000000002e-05,2.2654419999999999e-05],"3968":[9.3796799999999996e-05,9.9011499999999999e-05],"6400":[0.0001475397611940299,0.000155947],"1344":[3.3979790000000002e-05,3.7690467741935482e-05],"126976":[0.0046522230000000005,0.0048937590000000001],"2883584":[0.456726248,0.47697149],"753664":[0.051434265,0.08540621100000001],"16384":[0.00043591999999999996,0.00046644587499999993],"131072":[0.0051636400000000006,0.0052894480000000004],"458752":[0.021130202000000004,0.035192101000000017],"172032":[0.0082760669999999998,0.0086134180000000012],"12288":[0.00042308982608695641,0.00044946199999999997],"14680064":[2.308115382,6.3007822745000004],"1536":[4.6629999999999999e-05,5.2588479999999998e-05],"25600":[0.00064168860000000016,0.00066009113333333343],"1835008":[0.20862919699999999,0.22732997399999999],"10752":[0.00030916899999999998,0.00034697496428571427],"21504":[0.00065354600000000018,0.00069340000000000027],"7602176":[1.1368538669999999,1.1492220440000001],"5632":[0.00017249717543859651,0.00018415199999999998],"10":[1.7547e-07,1.8592000000000001e-07],"3145728":[0.552388349,0.56205254399999993],"245760":[0.010625604,0.010842619],"1728":[3.888213e-05,4.185221e-05],"11":[1.8379000000000001e-07,1.8629999999999999e-07],"1114112":[0.11455044850000001,0.154451528],"12":[2.114e-07,2.1437999999999999e-07],"7340032":[1.1370287215000001,1.15473004],"7168":[0.00016502900000000005,0.00018202366666666668],"13":[2.1756e-07,2.2506e-07],"6029312":[1.1227132980000001,1.1523622659999999],"14":[2.5975000000000003e-07,2.7072999999999999e-07],"3200":[6.7618675675675677e-05,7.2177999999999999e-05],"20":[3.4078000000000001e-07,3.9928000000000001e-07],"204800":[0.0082203389999999984,0.0082507889999999997],"15":[2.5981e-07,2.8975000000000001e-07],"13312":[0.00032539400000000001,0.0003274366],"4980736":[0.79944623599999998,0.80669655299999998],"118784":[0.0042038170000000003,0.0046369410000000003],"51200":[0.001339226,0.001360109],"16":[3.1755999999999999e-07,3.3810000000000004e-07],"21":[3.7416000000000001e-07,5.2691000000000005e-07],"917504":[0.067281558000000033,0.111429113],"22":[4.1115999999999998e-07,4.4052999999999999e-07],"4864":[0.00012703200000000001,0.00013611600000000001],"17":[3.1707000000000002e-07,3.3661999999999995e-07],"14848":[0.00037561699999999996,0.0003887994999999999],"23":[4.7454999999999997e-07,5.7467e-07],"786432":[0.057614140999999994,0.074569282000000001],"18":[3.3143e-07,3.4745e-07],"1638400":[0.18726553700000001,0.18935512600000004],"7864320":[1.2101132130000001,1.216304941],"24":[4.5522999999999998e-07,4.7558000000000003e-07],"14155776":[2.2003353785000002,2.2345693359999999],"19":[3.2161999999999999e-07,4.1615000000000003e-07],"30":[5.2000999999999996e-07,5.3827999999999997e-07],"25":[4.5259e-07,4.7388000000000001e-07],"31":[5.6787000000000002e-07,5.9153000000000006e-07],"1280":[3.2140449999999998e-05,3.3461955056179775e-05],"26":[4.5313999999999999e-07,4.8751000000000006e-07],"3932160":[0.56406690400000004,0.57399912249999996],"2432":[6.4357999999999996e-05,6.4764999999999994e-05],"32":[5.5586e-07,5.6105000000000001e-07],"27":[4.6973000000000001e-07,5.0409999999999997e-07],"409600":[0.017346756499999998,0.018240491499999997]}},{"title":"OrderedSet init from range","results":{"28":[7.6998000000000002e-07,7.8650000000000001e-07],"34":[9.2926999999999996e-07,1.0113899999999999e-06],"29":[8.2977e-07,8.3857999999999998e-07],"40":[1.11594e-06,1.1851099999999999e-06],"17408":[0.00054242362499999999,0.00058982781249999991],"1472":[4.8443278350515465e-05,5.4908209876543204e-05],"112":[2.8312428571428572e-06,2.8587300000000002e-06],"1376256":[0.067462414499999984,0.094179767999999997],"5242880":[0.48497119200000005,0.50103028999999999],"36":[9.7166999999999997e-07,1.03621e-06],"42":[1.1525499999999999e-06,1.19773e-06],"11534336":[1.3123496180000001,1.3727646805],"114688":[0.0034306764999999994,0.003840946],"144":[3.8146764705882352e-06,3.93009e-06],"38":[1.07383e-06,1.29327e-06],"240":[5.6095000000000002e-06,5.7626200000000002e-06],"9216":[0.00029984400000000001,0.00031079083870967742],"44":[1.2113333333333334e-06,1.3207900000000001e-06],"1664":[4.3992069999999993e-05,4.4219409090909089e-05],"196608":[0.0080151170000000004,0.0084027259999999975],"155648":[0.005345433000000001,0.0056569650000000008],"2816":[9.3614000000000002e-05,9.4455270000000008e-05],"50":[1.3219e-06,1.46274e-06],"2359296":[0.13538119050000003,0.13688229599999999],"46":[1.2851e-06,1.4677900000000001e-06],"176":[5.1244699999999994e-06,5.3112299999999996e-06],"52":[1.3607701149425287e-06,1.3718599999999999e-06],"272":[6.7074599999999995e-06,7.3878099999999997e-06],"116":[2.9184375e-06,2.97887e-06],"47104":[0.0017408026,0.001755059],"6912":[0.00020107400000000003,0.00020376199999999999],"1856":[4.6393500000000002e-05,5.5809450000000005e-05],"48":[1.3867900000000002e-06,1.5033478260869563e-06],"2097152":[0.11194260299999997,0.11764862549999999],"54":[1.35566e-06,1.4172499999999999e-06],"2031616":[0.10889382,0.11480750200000001],"43008":[0.0014756560000000001,0.0015769548333333335],"60":[1.5282400000000001e-06,1.5670699999999998e-06],"30720":[0.00088919200000000013,0.0009157439999999998],"56":[1.46678e-06,1.4700699999999999e-06],"62":[1.6237099999999999e-06,1.7693200000000001e-06],"58":[1.49268e-06,1.5197400000000001e-06],"3014656":[0.211669255,0.26693819899999999],"64":[1.7593499999999999e-06,1.798e-06],"8388608":[0.92287180499999999,0.94746109450000005],"29696":[0.00084370599999999995,0.00088754536363636375],"216":[5.1443599999999991e-06,5.1771699999999998e-06],"106496":[0.0031615130000000003,0.0032204493333333334],"72":[1.89104e-06,2.1105500000000001e-06],"442368":[0.016783105499999999,0.017043474999999995],"147456":[0.0050143639999999986,0.0053184880000000006],"4456448":[0.40129056600000002,0.46274422399999998],"63488":[0.001930569,0.0020179669999999999],"38912":[0.0013488017142857143,0.001393439142857143],"68":[1.8456700000000002e-06,1.8664999999999998e-06],"188416":[0.007463586999999999,0.0077995140000000004],"248":[5.8575499999999995e-06,6.0927500000000002e-06],"80":[2.1893699999999998e-06,2.3916999999999999e-06],"2560":[7.9509571428571427e-05,8.3700690000000009e-05],"34816":[0.00105178,0.0010791755555555557],"3712":[9.9675999999999999e-05,0.0001009845],"3538944":[0.32259615250000001,0.32543059600000002],"76":[1.9906099999999999e-06,2.0410099999999999e-06],"4194304":[0.38690298150000002,0.43584900449999997],"851968":[0.034493583000000001,0.046739427],"4096":[0.00011521994117647056,0.00012409333333333333],"59392":[0.0017771879999999996,0.0018463139999999999],"84":[2.4711153846153845e-06,2.6454000000000001e-06],"3276800":[0.28318288699999999,0.283306591],"55296":[0.0016515452,0.0017133743999999992],"688128":[0.030427734999999994,0.033032066000000006],"8192":[0.00025100200000000001,0.00025267900000000001],"10240":[0.00033607150000000002,0.000357547],"15872":[0.00047071878947368425,0.00049107600000000012],"92":[2.6313699999999999e-06,2.8209899999999999e-06],"26624":[0.00074832469230769519,0.00078639300000000014],"1792":[4.5854749999999997e-05,4.7046333333333331e-05],"11776":[0.00042856049999999998,0.00044632199999999997],"2944":[0.00010844999999999999,0.00011113],"88":[2.5761799999999999e-06,2.69601e-06],"22528":[0.0007961969999999999,0.000846429],"1245184":[0.057967380499999985,0.068663393499999989],"15728640":[1.81968609,1.8949694104999999],"96":[2.9090399999999998e-06,3.0450399999999999e-06],"1984":[5.2815500000000003e-05,6.035054e-05],"139264":[0.0046704470000000003,0.0047504925],"475136":[0.018100382500000005,0.019358447000000001],"13631488":[1.5589668885000001,1.622144461],"416":[1.003139e-05,1.0198959999999999e-05],"928":[2.3200550000000003e-05,2.4527666666666669e-05],"512":[1.318771e-05,1.361765e-05],"18432":[0.00058166199999999993,0.00060316300000000009],"16777216":[1.998212919],"9728":[0.0003208122800000002,0.00032708113333333331],"1769472":[0.093169008499999997,0.1089768435],"1703936":[0.087011118000000012,0.099564434999999979],"2048":[5.4097999999999996e-05,5.8551209999999997e-05],"14336":[0.00041740668181818199,0.00051095899999999985],"448":[1.0713666666666667e-05,1.1220314285714286e-05],"5505024":[0.52283119199999994,0.61902257000000005],"544":[1.4473e-05,1.479859e-05],"221184":[0.0073515469999999999,0.0073687790000000006],"90112":[0.0033606295000000001,0.003531588],"640":[1.8012600000000001e-05,1.929543e-05],"12800":[0.00033450199999999998,0.00035648923076923085],"262144":[0.0091594390000000001,0.0093612599999999997],"589824":[0.024334390500000001,0.0296156835],"884736":[0.035536377000000001,0.042937573],"6144":[0.00022730566666666661,0.00024460050000000004],"1088":[2.9790989999999999e-05,3.14876e-05],"576":[1.5094999999999999e-05,1.5603510000000001e-05],"160":[4.48226e-06,4.5017999999999998e-06],"672":[2.0083666666666669e-05,2.0203920000000003e-05],"8912896":[0.98559860850000003,1.1160782410000001],"100":[2.4682399999999998e-06,2.6567899999999999e-06],"507904":[0.019892277,0.025374877000000001],"3840":[0.00010966003333333337,0.000111808],"192":[5.7480300000000003e-06,5.8613399999999995e-06],"376832":[0.016102102,0.017344719500000001],"98304":[0.0039227014999999995,0.0039677499999999999],"5376":[0.000176183,0.00019267291304347824],"94208":[0.0036128235,0.0036447935000000001],"81920":[0.0028276983333333327,0.0029277939999999992],"3407872":[0.29204833699999999,0.31373071699999999],"104":[2.5925799999999998e-06,2.6611099999999997e-06],"122880":[0.0038634189999999999,0.0041028210000000004],"200":[4.6561000000000002e-06,4.7447800000000002e-06],"163840":[0.0058480060000000002,0.0061282740000000004],"4063232":[0.36048719800000001,0.37689505800000001],"5767168":[0.60088082750000005,0.61513434050000004],"12582912":[1.4976332745000001,2.6749422300000001],"1600":[3.9496480000000002e-05,4.2883000000000003e-05],"136":[3.51378e-06,3.5665000000000001e-06],"232":[5.4260899999999997e-06,5.5369499999999996e-06],"7077888":[0.74876969299999996,0.83963004250000006],"86016":[0.0030163476666666671,0.0031179909999999996],"31744":[0.00093204949999999985,0.000967649],"168":[4.5944499999999997e-06,4.7190000000000001e-06],"622592":[0.025731964,0.029892328000000003],"108":[2.6766899999999999e-06,2.8982399999999999e-06],"327680":[0.0127775665,0.0132563475],"2176":[6.2312419999999998e-05,6.3178999999999999e-05],"3328":[8.5516461538461542e-05,9.6191000000000001e-05],"1":[1.9670000000000001e-07,2.0390999999999998e-07],"2":[2.1322999999999998e-07,2.5340000000000003e-07],"3":[2.3638999999999999e-07,2.8734999999999999e-07],"4":[2.5515000000000001e-07,3.0188999999999996e-07],"7424":[0.00020647439999999995,0.00021868945454545457],"5":[2.7184999999999999e-07,2.973e-07],"23552":[0.00085606499999999993,0.0009236276999999998],"6":[2.9668999999999999e-07,3.2221000000000002e-07],"61440":[0.0019697741999999997,0.0020813749999999999],"491520":[0.019670174000000002,0.020288235000000002],"77824":[0.0026310546666666666,0.0027807459999999997],"7":[3.4014999999999999e-07,3.4403000000000004e-07],"8":[3.4217e-07,3.8433000000000005e-07],"208":[4.8852700000000001e-06,5.1295599999999997e-06],"9":[3.6650000000000001e-07,3.8309000000000002e-07],"73728":[0.0024801069999999996,0.0027727869999999996],"304":[7.97407e-06,8.3537142857142853e-06],"400":[9.3870000000000001e-06,1.0216979999999999e-05],"1310720":[0.061580771500000006,0.070346912000000011],"336":[8.8784699999999994e-06,1.0494309999999999e-05],"3670016":[0.320179041,0.33564970100000002],"6656":[0.00017868000000000002,0.00019071492307692303],"15360":[0.00046628700000000002,0.00047976257894736824],"432":[1.0048000000000001e-05,1.0230846153846153e-05],"950272":[0.039549919500000003,0.048116393],"655360":[0.0289881185,0.034094932500000008],"69632":[0.0022947265000000001,0.0023177905000000003],"11264":[0.0004046270416666666,0.000457885],"2752512":[0.16999804099999999,0.19859312299999998],"8126464":[0.91459546999999997,0.91489373500000004],"27648":[0.00078176708333333312,0.00083164245454545439],"368":[1.097e-05,1.297178e-05],"65536":[0.0020492722499999999,0.0020822990000000001],"16252928":[1.8900754,1.9310719270000001],"464":[1.1503799999999998e-05,1.2041879999999999e-05],"1015808":[0.043450678,0.050783533999999998],"3072":[0.000110713,0.00011806198809523818],"110592":[0.0034107595000000004,0.003679103],"237568":[0.0081215490000000022,0.0081928480000000008],"278528":[0.0097059319999999987,0.010458604],"496":[1.2079000000000001e-05,1.3193169999999999e-05],"13107200":[1.4931900954999999,1.5873714885000001],"9961472":[1.1403333120000001,1.2342754085000001],"5888":[0.00021100199999999998,0.00022592099999999997],"11010048":[1.2391904380000001,1.328037921],"1920":[5.2119142857142857e-05,5.3279429999999999e-05],"2490368":[0.14921364100000001,0.19723800800000002],"19456":[0.00063399799999999998,0.00063891171428571438],"57344":[0.0017236809999999999,0.0017674584000000001],"1179648":[0.053264628999999994,0.065268529500000033],"4718592":[0.44125283599999998,0.46118466899999999],"360448":[0.014667423000000004,0.014798964],"1572864":[0.083638295499999987,0.093164065500000004],"53248":[0.0016177213333333335,0.0016211980000000001],"3456":[9.2149000000000002e-05,0.000100981],"40960":[0.001375544,0.0014079034285714286],"4608":[0.00014686527272727272,0.00015094179999999998],"13824":[0.00040509831818181814,0.000421906],"819200":[0.033303221000000001,0.041494285499999992],"983040":[0.0409840115,0.048785623],"8704":[0.00026111199999999992,0.0002623407272727273],"120":[3.1084500000000003e-06,3.1451599999999997e-06],"1024":[2.6937179999999999e-05,2.7650418181818182e-05],"49152":[0.0019195799999999999,0.0020216154999999998],"524288":[0.021175764,0.025826513999999995],"45056":[0.0016048003999999997,0.0017636247999999999],"229376":[0.0075413069999999997,0.0079645009999999988],"2688":[8.4197999999999996e-05,9.1458210000000005e-05],"152":[3.9634199999999997e-06,4.0594999999999998e-06],"5120":[0.00017113020000000001,0.00017903071428571429],"1507328":[0.077331096500000002,0.107048742],"1216":[3.6792999999999998e-05,3.6904770000000004e-05],"1966080":[0.10403884250000001,0.10865472299999999],"1900544":[0.10276903900000001,0.123830735],"184":[5.0927399999999998e-06,6.2001299999999997e-06],"7936":[0.00023059099999999999,0.00024036778048780477],"3801088":[0.32135534300000002,0.35444318200000002],"6815744":[0.72362187,0.80108478399999994],"124":[3.1821899999999999e-06,3.2918e-06],"102400":[0.0030378720000000005,0.0031332066666666667],"311296":[0.0120339795,0.012470752],"1408":[4.3626480000000005e-05,4.5493479999999999e-05],"393216":[0.017317345000000001,0.017510931],"4352":[0.00012888399999999998,0.00013619058333333331],"6553600":[0.71787624949999995,0.77961226350000001],"20480":[0.00068654099999999993,0.00071032646153846159],"608":[1.6375499999999999e-05,1.809134e-05],"2228224":[0.12905191999999999,0.13642072599999999],"36864":[0.001160302875,0.001218521],"704":[2.0696180000000002e-05,2.2053459999999999e-05],"720896":[0.033837607999999984,0.034639207999999991],"800":[1.8980890243902438e-05,1.9579933333333332e-05],"2621440":[0.1572740665,0.18004943700000001],"425984":[0.015895261000000001,0.0163745865],"32768":[0.00097135288888888891,0.001021288],"12058624":[1.3892360985000001,1.512505786],"128":[3.12432e-06,3.2720900000000001e-06],"180224":[0.006721651999999999,0.0070997869999999989],"224":[5.1515199999999994e-06,5.3176499999999998e-06],"736":[2.2138269999999999e-05,2.500395e-05],"320":[8.6412699999999993e-06,8.7890600000000009e-06],"557056":[0.0225619845,0.023994587500000001],"832":[2.0160199999999997e-05,2.19291e-05],"9437184":[1.092058993,1.1804378710000001],"3584":[9.5400000000000001e-05,0.00010274560000000002],"6291456":[0.69544250949999997,0.72273757949999995],"256":[6.0992399999999994e-06,6.4531799999999998e-06],"15204352":[1.7471916635,1.8694397730000001],"28672":[0.00082088600000000016,0.00085600699999999999],"768":[2.3784000000000001e-05,2.7490950000000001e-05],"212992":[0.006956931999999999,0.0069986910000000013],"864":[2.0869e-05,2.1723030000000001e-05],"352":[1.0091779999999999e-05,1.0176300000000001e-05],"253952":[0.0087820910000000005,0.0089969390000000007],"960":[2.4363409999999999e-05,2.5899699999999999e-05],"24576":[0.0009590270000000001,0.00099821300000000018],"7680":[0.00022371362790697672,0.000230583],"294912":[0.010769393,0.010789298499999999],"1048576":[0.044185152000000019,0.053930487000000006],"10485760":[1.1769126415,1.190336544],"344064":[0.0136446715,0.014106502999999998],"288":[7.3542300000000002e-06,7.9429699999999996e-06],"1152":[3.2273629999999997e-05,3.2931490000000001e-05],"384":[1.1894979999999999e-05,1.265522e-05],"2304":[6.7188760000000007e-05,7.0003440000000004e-05],"896":[2.2155999999999999e-05,2.4638999999999999e-05],"480":[1.1620999999999999e-05,1.271457e-05],"1441792":[0.072659662999999999,0.097503579499999993],"992":[2.4851e-05,2.7167879310344829e-05],"3968":[0.00010413500000000002,0.000118768375],"6400":[0.00017545541176470586,0.00018064214814814816],"1344":[4.0170999999999999e-05,4.1205819999999999e-05],"126976":[0.0040041819999999994,0.0041754629999999999],"2883584":[0.183484814,0.2359418955],"753664":[0.03544162800000001,0.041799948999999996],"16384":[0.00051455799999999992,0.00051884799999999992],"131072":[0.0042858625000000003,0.0046720330000000008],"458752":[0.017260815999999991,0.028058247000000001],"172032":[0.0065079999999999999,0.0066045730000000025],"12288":[0.00047349949999999979,0.00049172699999999996],"14680064":[1.6901814719999999,2.9084255859999999],"1536":[5.6492000000000001e-05,6.6470340000000002e-05],"25600":[0.000657411,0.00073503453846153846],"1835008":[0.093907823000000015,0.097640630000000006],"10752":[0.00036273300000000007,0.00037836800000000002],"21504":[0.00074712900000000002,0.0007991182499999999],"7602176":[0.78010489699999996,0.79107743099999994],"5632":[0.00019182779999999997,0.000207667],"10":[4.2020000000000002e-07,4.6940999999999997e-07],"3145728":[0.228250486,0.24350812599999999],"245760":[0.008305261999999999,0.0084965580000000013],"1728":[4.4836870000000002e-05,4.6830659999999996e-05],"11":[4.1687999999999996e-07,4.2992999999999999e-07],"1114112":[0.048790950999999985,0.05810281199999999],"12":[4.3244999999999998e-07,4.8631000000000007e-07],"7340032":[0.76600533900000001,0.86672707500000001],"7168":[0.00020181099999999996,0.00020274910638297893],"13":[4.6741999999999999e-07,4.7169000000000001e-07],"6029312":[0.64063891299999998,0.65297895699999997],"14":[4.7899999999999999e-07,5.2318999999999996e-07],"3200":[8.2835850000000008e-05,9.0427999999999995e-05],"20":[6.3109999999999998e-07,6.571600000000001e-07],"204800":[0.0067022000000000002,0.0067056309999999992],"15":[5.0906999999999994e-07,5.3517999999999995e-07],"13312":[0.00036648200000000001,0.00037880499999999996],"4980736":[0.45787839299999999,0.50097768099999995],"118784":[0.0036225679999999996,0.0043358204999999995],"51200":[0.001458572,0.0014741643333333336],"16":[5.6064000000000002e-07,5.8899000000000004e-07],"21":[6.5135000000000002e-07,7.3632000000000007e-07],"917504":[0.038108959999999997,0.062588990999999997],"22":[7.0140000000000007e-07,7.2558999999999992e-07],"4864":[0.00015422999999999996,0.00016260100000000001],"17":[5.7311999999999999e-07,5.8966999999999996e-07],"14848":[0.0004362914090909091,0.00044693799999999991],"23":[7.5228999999999992e-07,7.5302000000000006e-07],"786432":[0.037268862,0.044926262999999994],"18":[5.9498e-07,5.9917000000000004e-07],"1638400":[0.088948445000000001,0.11209228300000001],"7864320":[0.87648070200000006,0.88218412349999997],"24":[7.7896000000000003e-07,1.0166599999999999e-06],"14155776":[1.6412200000000001,1.7128238179999999],"19":[6.1310999999999996e-07,6.1445000000000011e-07],"30":[8.0410975609756102e-07,8.0586000000000004e-07],"25":[7.5392999999999998e-07,8.0123999999999989e-07],"31":[8.5945999999999994e-07,9.0126000000000001e-07],"1280":[3.8591540000000001e-05,4.0753929999999998e-05],"26":[7.129199999999999e-07,7.3112e-07],"3932160":[0.33270796200000002,0.37335367750000004],"2432":[7.0529081081081087e-05,7.7612217391304341e-05],"32":[8.5414000000000005e-07,9.1381999999999996e-07],"27":[7.7447000000000008e-07,7.9406e-07],"409600":[0.014808873,0.015623143000000001]}},{"title":"OrderedSet init from unsafe buffer","results":{"28":[7.3353999999999999e-07,7.9275000000000005e-07],"34":[9.0970999999999991e-07,9.4271000000000006e-07],"29":[7.7795999999999996e-07,8.4913636363636361e-07],"40":[1.11593e-06,1.1389268292682926e-06],"17408":[0.00051536900000000001,0.00053945600000000001],"1472":[4.6751849999999999e-05,5.3410979999999999e-05],"112":[2.64897e-06,2.7859700000000001e-06],"1376256":[0.10464958000000001,0.16501612099999999],"5242880":[0.71851051300000002,0.73654803499999999],"36":[9.3681000000000004e-07,1.0141600000000001e-06],"42":[1.1056999999999998e-06,1.18614e-06],"11534336":[1.8745631999999999,1.954506474],"114688":[0.0035618900000000003,0.0038534325000000001],"144":[3.5380499999999999e-06,3.68723e-06],"38":[1.01134e-06,1.0539199999999999e-06],"240":[5.3573888888888892e-06,5.5208300000000001e-06],"9216":[0.00029338000000000004,0.00029464199999999996],"44":[1.2140909090909092e-06,1.2876800000000001e-06],"1664":[4.1607216216216219e-05,4.2669049999999998e-05],"196608":[0.0090941499999999988,0.0097315329999999988],"155648":[0.0057123690000000001,0.0060009659999999999],"2816":[9.0978710000000004e-05,9.5273156250000007e-05],"50":[1.2003e-06,1.26632e-06],"2359296":[0.22118385600000001,0.234616307],"46":[1.2913799999999999e-06,1.3924499999999999e-06],"176":[4.4769500000000004e-06,5.1672500000000004e-06],"52":[1.2319e-06,1.31838e-06],"272":[6.3094199999999998e-06,6.7863900000000001e-06],"116":[2.7117499999999999e-06,2.8541599999999999e-06],"47104":[0.0016408479999999999,0.001661474],"6912":[0.00018715600000000001,0.00019668449999999996],"1856":[4.4899125e-05,5.3576600000000005e-05],"48":[1.3826800000000002e-06,1.5985700000000001e-06],"2097152":[0.176243697,0.18837542900000001],"54":[1.29933e-06,1.3782399999999998e-06],"2031616":[0.16217746899999999,0.1679063855],"43008":[0.0014352806666666667,0.001489076],"60":[1.4591300000000001e-06,1.5228099999999999e-06],"30720":[0.00087807100000000023,0.0008840530000000001],"56":[1.3745900000000001e-06,1.4498899999999998e-06],"62":[1.6599099999999998e-06,1.71733e-06],"58":[1.43674e-06,1.4776071428571428e-06],"3014656":[0.38564318600000003,0.451875148],"64":[1.5751799999999998e-06,1.6288500000000001e-06],"8388608":[1.1476978149999999,1.1597783835],"29696":[0.00081115799999999997,0.00087271463636363639],"216":[5.0268000000000007e-06,5.2197299999999997e-06],"106496":[0.0032577413333333338,0.00332132],"72":[1.7342700000000001e-06,1.9277000000000002e-06],"442368":[0.01772341249999998,0.019968833499999998],"147456":[0.0054565719999999981,0.0080655230000000015],"4456448":[0.54578678899999999,0.55154712250000004],"63488":[0.0019794877499999999,0.0020335070000000004],"38912":[0.0012615829999999999,0.0012712539999999999],"68":[1.6651299999999999e-06,1.8958899999999999e-06],"188416":[0.0082763769999999997,0.0086406759999999999],"248":[5.6285999999999998e-06,5.8373799999999997e-06],"80":[2.0463600000000002e-06,2.2699000000000001e-06],"2560":[7.7626479999999998e-05,8.0592000000000004e-05],"34816":[0.0010312779999999998,0.0010593574444444447],"3712":[9.8972e-05,0.000101838],"3538944":[0.39468959850000002,0.40060810499999999],"76":[1.88419e-06,2.0704600000000001e-06],"4194304":[0.49112238650000001,0.51262735100000001],"851968":[0.042853950999999994,0.06819892700000002],"4096":[0.0001114564,0.000121432],"59392":[0.0017504685999999998,0.0018014104],"84":[2.2016599999999998e-06,2.23645e-06],"3276800":[0.34958111200000003,0.358081806],"55296":[0.001537131,0.001590705],"688128":[0.0360271245,0.049370949500000004],"8192":[0.00024347800000000002,0.00025065500000000002],"10240":[0.00032489900000000002,0.00034642400000000002],"15872":[0.000451767,0.00049834931578947371],"92":[2.6665499999999999e-06,2.9457399999999999e-06],"26624":[0.00070749300000000001,0.00074104199999999992],"1792":[4.5086076923076919e-05,4.6918e-05],"11776":[0.000412321,0.00043530899999999993],"2944":[0.00010001802105263162,0.000105852],"88":[2.41567e-06,2.6763999999999999e-06],"22528":[0.00076006800000000003,0.00081231200000000015],"1245184":[0.081338909499999973,0.120835262],"15728640":[2.2559716839999999,2.3307181975],"96":[2.90096e-06,3.2133299999999998e-06],"1984":[5.2445900000000006e-05,5.4146500000000001e-05],"139264":[0.0050178849999999997,0.0050354790000000007],"475136":[0.019674089999999998,0.0225172285],"13631488":[1.856001185,1.917227623],"416":[9.4824999999999994e-06,9.8899300000000004e-06],"928":[2.2168280000000001e-05,2.3727090000000001e-05],"512":[1.2661210000000001e-05,1.3251510000000001e-05],"18432":[0.00056085399999999974,0.000633641],"16777216":[2.475170952],"9728":[0.00030114399999999999,0.00031373399999999981],"1769472":[0.1421485985,0.1592221915],"1703936":[0.13137592300000001,0.18805332299999999],"2048":[5.2624999999999998e-05,5.617011e-05],"14336":[0.00040594391304347944,0.000414418],"448":[1.0121e-05,1.065906e-05],"5505024":[0.794088723,0.82478784249999992],"544":[1.381025e-05,1.3883529999999999e-05],"221184":[0.0080434040000000005,0.0085932709999999978],"90112":[0.0033809249999999999,0.0033972390000000007],"640":[1.6079e-05,1.8544410000000002e-05],"12800":[0.00034333266666666665,0.00034655799999999979],"262144":[0.010436001,0.010956074],"589824":[0.026912682,0.035521280000000002],"884736":[0.042849613499999994,0.058786606000000033],"6144":[0.000227555,0.00023107099999999996],"1088":[2.95021e-05,3.0089880000000003e-05],"576":[1.4735e-05,1.5296709999999999e-05],"160":[4.0248299999999995e-06,4.3456299999999999e-06],"672":[1.9155719999999998e-05,1.9459119999999999e-05],"8912896":[1.254005627,1.3903072949999999],"100":[2.3673600000000001e-06,2.6209200000000003e-06],"507904":[0.021738463999999999,0.029157982500000002],"3840":[0.000106609,0.00011018575],"192":[5.2408999999999992e-06,5.4560800000000005e-06],"376832":[0.018905169499999999,0.019240992999999994],"98304":[0.0039551434999999992,0.0040596989999999999],"5376":[0.00017239499999999996,0.00018258675],"94208":[0.0035657889999999998,0.0036216585],"81920":[0.0027586826666666665,0.0029763300000000001],"3407872":[0.36992571549999997,0.386250922],"104":[2.5141100000000001e-06,2.5545000000000003e-06],"122880":[0.0040151129999999998,0.0041821779999999999],"200":[4.5134199999999996e-06,4.8924299999999995e-06],"163840":[0.006322182,0.0065292780000000012],"4063232":[0.47297528049999998,0.481202876],"5767168":[0.89267258999999999,0.89549680649999996],"12582912":[2.2805980945000002,4.3361638249999999],"1600":[3.88980625e-05,4.0958809999999999e-05],"136":[3.4063000000000003e-06,3.4876400000000001e-06],"232":[5.1494500000000003e-06,5.2513400000000003e-06],"7077888":[0.895802133,0.98992820599999998],"86016":[0.0030184260000000003,0.0031311779999999997],"31744":[0.00091134949999999973,0.00095800699999999998],"168":[4.21232e-06,4.5741099999999998e-06],"622592":[0.029145411999999999,0.039733107999999996],"108":[2.4978799999999997e-06,2.5971300000000001e-06],"327680":[0.014699884999999999,0.015324715000000003],"2176":[5.9462500000000002e-05,6.2048872727272732e-05],"3328":[8.7326290000000004e-05,9.3294999999999994e-05],"1":[1.9729000000000001e-07,2.2180000000000001e-07],"2":[2.3574000000000002e-07,2.4231e-07],"3":[2.3104000000000001e-07,2.8280999999999998e-07],"4":[2.7614999999999999e-07,2.8361999999999999e-07],"7424":[0.00020029500000000002,0.00021520300000000002],"5":[2.7142999999999999e-07,3.1207999999999997e-07],"23552":[0.00086144045454545487,0.00087901399999999979],"6":[2.9199000000000001e-07,3.3272999999999999e-07],"61440":[0.0019655799999999998,0.0020763697500000003],"491520":[0.020403063000000003,0.025572197000000008],"77824":[0.0025836089999999997,0.002660248],"7":[3.3043000000000003e-07,3.4611999999999998e-07],"8":[3.3730999999999999e-07,3.8575999999999998e-07],"208":[4.7651700000000002e-06,4.7900099999999997e-06],"9":[3.7453999999999996e-07,3.7548000000000002e-07],"73728":[0.002338194,0.0029390286666666665],"304":[7.6470100000000005e-06,8.6827200000000004e-06],"400":[9.1422499999999987e-06,9.2376299999999998e-06],"1310720":[0.090626934000000006,0.12561153350000001],"336":[8.4208700000000006e-06,1.0086260000000001e-05],"3670016":[0.41188256899999998,0.42806747449999999],"6656":[0.00017264299999999999,0.00017832633333333329],"15360":[0.00044649090476190463,0.00045635599999999994],"432":[9.8819999999999996e-06,1.0012e-05],"950272":[0.047900410500000004,0.06900218800000002],"655360":[0.032453049499999984,0.042762038000000002],"69632":[0.0021347879999999994,0.0022452572500000004],"11264":[0.00036288799999999996,0.00044942699999999991],"2752512":[0.30100308399999998,0.32999841200000002],"8126464":[1.1411720745,1.1553833339999999],"27648":[0.00076062308333333327,0.00077629900000000004],"368":[1.1542309999999999e-05,1.177665e-05],"65536":[0.0019806592499999999,0.0020524414999999996],"16252928":[2.3475127379999998,2.3757679215],"464":[1.0718666666666668e-05,1.1355880000000001e-05],"1015808":[0.05702389900000001,0.078667739],"3072":[0.00011254680000000002,0.000116657],"110592":[0.0034531190000000002,0.0035205405000000001],"237568":[0.0090435919999999996,0.0091269650000000008],"278528":[0.010843091000000001,0.013146839],"496":[1.1749000000000001e-05,1.2708229999999998e-05],"13107200":[1.7730535000000001,1.8175426379999999],"9961472":[1.4912554570000001,1.58314391],"5888":[0.00020640099999999999,0.000217161],"11010048":[1.7210058605,1.844922247],"1920":[4.8490833333333327e-05,4.9797699999999999e-05],"2490368":[0.24687311849999999,0.25217329900000002],"19456":[0.00061457700000000027,0.00061787599999999973],"57344":[0.0017050092,0.0017128849999999995],"1179648":[0.075567634999999994,0.10789566799999994],"4718592":[0.59597306900000002,0.65723300799999995],"360448":[0.017178479,0.017377374499999997],"1572864":[0.14521931399999999,0.15030928499999996],"53248":[0.0015351200000000001,0.0015579630000000001],"3456":[8.5991999999999999e-05,9.2666666666666665e-05],"40960":[0.0013042380000000001,0.0013223620000000001],"4608":[0.00013477779999999999,0.0001384495],"13824":[0.0004028490000000001,0.00042752899999999995],"819200":[0.039839290499999999,0.06126301899999996],"983040":[0.053799220999999994,0.072918287999999998],"8704":[0.00026104667567567564,0.00027379388888888891],"120":[2.9390800000000002e-06,2.9737500000000001e-06],"1024":[2.6606869565217391e-05,2.7229279999999999e-05],"49152":[0.0018092729999999997,0.0018975400000000001],"524288":[0.022845630499999998,0.028590722999999995],"45056":[0.0015416869999999999,0.001717269],"229376":[0.0082698789999999991,0.009733228],"2688":[8.5000259259259263e-05,8.6277857142857153e-05],"152":[3.9658500000000003e-06,4.1129300000000004e-06],"5120":[0.000164115,0.00017395900000000003],"1507328":[0.12584217049999999,0.204680846],"1216":[3.5449150000000003e-05,3.5537056338028171e-05],"1966080":[0.15622991999999999,0.18914788599999999],"1900544":[0.155377985,0.18675172150000002],"184":[4.7679100000000004e-06,5.7732099999999999e-06],"7936":[0.00022265000000000002,0.000233425],"3801088":[0.43749265700000001,0.44534110799999999],"6815744":[0.868153591,0.93935688500000003],"124":[3.10626e-06,3.1461700000000001e-06],"102400":[0.003102387333333333,0.003172584],"311296":[0.013425774,0.014182803500000002],"1408":[3.9971000000000001e-05,4.5182190000000002e-05],"393216":[0.020878555,0.020882988999999998],"4352":[0.00012252399999999999,0.00012687255128205127],"6553600":[0.85600584450000006,0.90355055100000004],"20480":[0.00066022899999999992,0.00066492500000000002],"608":[1.5956000000000001e-05,1.6685e-05],"2228224":[0.199826748,0.21563106300000001],"36864":[0.0011650323750000001,0.0012763309999999999],"704":[2.0145499999999999e-05,2.1209500000000001e-05],"720896":[0.037557528500000006,0.04742619],"800":[1.8506970000000002e-05,1.9006979999999998e-05],"2621440":[0.27997092899999998,0.303143524],"425984":[0.017786960000000001,0.0199662915],"32768":[0.00094386699999999982,0.0010077459999999999],"12058624":[2.0366825450000001,2.1568023620000001],"128":[2.9732000000000002e-06,3.1162099999999998e-06],"180224":[0.0076896499999999993,0.0079289950000000012],"224":[5.0544399999999997e-06,5.1881599999999995e-06],"736":[2.152915e-05,2.329258e-05],"320":[8.4739700000000001e-06,8.4870000000000002e-06],"557056":[0.025281172000000001,0.031076968999999999],"832":[1.9794600000000002e-05,2.1018529999999997e-05],"9437184":[1.389511232,1.4784906499999999],"3584":[9.5190197802197813e-05,0.000106541],"6291456":[1.085179447,1.096725146],"256":[5.7551399999999996e-06,6.4503599999999999e-06],"15204352":[2.1777963045000002,2.255450427],"28672":[0.00079423991666666659,0.00083638227272727283],"768":[2.2764499999999999e-05,2.4073000000000001e-05],"212992":[0.007622094999999998,0.0078527949999999992],"864":[2.0548799999999999e-05,2.0566080000000001e-05],"352":[9.5978300000000002e-06,9.7945700000000007e-06],"253952":[0.0099829380000000002,0.0100974345],"960":[2.356415e-05,2.4850666666666666e-05],"24576":[0.00093588709999999997,0.000983949111111111],"7680":[0.00020426400000000001,0.00022583561538461533],"294912":[0.012299608,0.014155075499999999],"1048576":[0.058003020500000016,0.080061267000000019],"10485760":[1.5866291079999999,1.595972312],"344064":[0.015676372500000001,0.016212035],"288":[6.9607999999999995e-06,7.2180000000000002e-06],"1152":[3.231967e-05,3.2512999999999999e-05],"384":[1.1468673469387755e-05,1.1557839999999999e-05],"2304":[6.44805e-05,6.5754779999999995e-05],"896":[2.0950880000000002e-05,2.2163500000000002e-05],"480":[1.1160499999999999e-05,1.220354e-05],"1441792":[0.11644331400000001,0.16169326449999999],"992":[2.4609699999999999e-05,2.5864640000000002e-05],"3968":[0.000102446,0.00011362900000000001],"6400":[0.000164532,0.00017621500000000002],"1344":[3.8717989999999997e-05,4.1634249999999999e-05],"126976":[0.0041090684999999993,0.0045195000000000001],"2883584":[0.34613917999999999,0.37699348900000001],"753664":[0.042873557499999979,0.058539675999999985],"16384":[0.00051143,0.00052693744444444446],"131072":[0.0043728194999999989,0.0043779639999999998],"458752":[0.0186431255,0.026345932999999998],"172032":[0.0069989220000000003,0.0071617759999999999],"12288":[0.00046082800000000009,0.00047765759999999775],"14680064":[2.0175162659999999,3.74562054],"1536":[5.061180898876404e-05,6.3390470000000007e-05],"25600":[0.00068401499999999984,0.00071580492307692285],"1835008":[0.13917947999999999,0.154598078],"10752":[0.00036483800000000003,0.00037411511538461539],"21504":[0.00074107084615384592,0.00077334800000000009],"7602176":[0.96558021900000002,0.99058199849999995],"5632":[0.00019193999999999998,0.0002037525],"10":[3.9747999999999998e-07,4.4264999999999996e-07],"3145728":[0.416845625,0.49130103000000003],"245760":[0.0093845459999999971,0.0097260910000000009],"1728":[4.3351630000000002e-05,4.5153040000000002e-05],"11":[3.8501999999999999e-07,4.2206000000000001e-07],"1114112":[0.065260318499999997,0.090533152000000006],"12":[4.5321999999999998e-07,4.7960999999999999e-07],"7340032":[0.95046950600000002,1.0320798579999999],"7168":[0.0001924716511627907,0.00019704],"13":[4.6196000000000004e-07,4.8408000000000003e-07],"6029312":[0.96141427599999996,0.99266099350000003],"14":[4.8504000000000006e-07,5.2562000000000002e-07],"3200":[8.1541779999999998e-05,8.8736583333333323e-05],"20":[5.6431999999999996e-07,6.2502000000000007e-07],"204800":[0.0071468030000000002,0.0074742139999999981],"15":[5.2371999999999998e-07,5.5340000000000007e-07],"13312":[0.00033911,0.00036216561538461535],"4980736":[0.66151023100000006,0.69110224549999999],"118784":[0.003763769000000001,0.0044120259999999986],"51200":[0.0013954239999999997,0.0014495770000000001],"16":[5.2256000000000004e-07,5.7057000000000001e-07],"21":[6.4754999999999995e-07,7.0991000000000004e-07],"917504":[0.046043232000000003,0.075110377500000006],"22":[6.8395999999999999e-07,7.2857999999999998e-07],"4864":[0.00014156600000000003,0.00015956545161290321],"17":[5.7787999999999998e-07,5.8034000000000002e-07],"14848":[0.00041427499999999986,0.0004324202608695653],"23":[6.8390000000000003e-07,7.1765000000000002e-07],"786432":[0.046322555000000001,0.070547255000000003],"18":[6.0250000000000005e-07,6.5150999999999999e-07],"1638400":[0.12369176699999999,0.13507402499999999],"7864320":[1.0535575719999999,1.0724080405],"24":[7.3193000000000002e-07,8.6077e-07],"14155776":[1.9432247869999999,1.9882749319999999],"19":[5.3875999999999999e-07,5.7678000000000001e-07],"30":[7.7675000000000002e-07,8.4901000000000011e-07],"25":[7.2048e-07,7.7660000000000001e-07],"31":[7.9396e-07,8.6818999999999994e-07],"1280":[3.711872727272727e-05,3.7188150000000001e-05],"26":[6.9881000000000005e-07,7.1889000000000005e-07],"3932160":[0.44893860800000002,0.47411813000000003],"2432":[7.2383000000000001e-05,7.6914980000000003e-05],"32":[8.3801999999999998e-07,9.5192000000000007e-07],"27":[7.7892999999999995e-07,7.8244000000000006e-07],"409600":[0.016004346000000003,0.016926760000000002]}},{"title":"OrderedSet init(uncheckedUniqueElements:) from range","results":{"28":[7.7189999999999997e-07,7.7395000000000002e-07],"34":[9.2763999999999996e-07,9.7891999999999998e-07],"29":[7.8785e-07,8.7923000000000007e-07],"40":[1.1157600000000001e-06,1.1259399999999999e-06],"17408":[0.00053728199999999982,0.00055849600000000001],"1472":[4.8110625000000002e-05,5.3044000000000002e-05],"112":[2.7662900000000002e-06,2.9005800000000001e-06],"1376256":[0.067850340999999967,0.094920982500000001],"5242880":[0.51425348650000002,0.52836358250000004],"36":[9.7145000000000003e-07,1.0535641025641025e-06],"42":[1.15274e-06,1.2512499999999999e-06],"11534336":[1.3454078604999999,1.4241454689999999],"114688":[0.003448652,0.0036725195000000001],"144":[3.8030900000000002e-06,3.8248799999999999e-06],"38":[1.1339400000000001e-06,1.1588199999999999e-06],"240":[5.6205000000000007e-06,5.7919600000000004e-06],"9216":[0.000302384,0.00030579799999999992],"44":[1.2087200000000001e-06,1.3436700000000002e-06],"1664":[4.1432766666666667e-05,4.4122375000000001e-05],"196608":[0.0080779300000000005,0.008481174000000001],"155648":[0.0054763670000000011,0.0056689980000000006],"2816":[9.1286142857142856e-05,9.5899749999999996e-05],"50":[1.3129499999999999e-06,1.31927e-06],"2359296":[0.14271095950000001,0.1456453295],"46":[1.2827699999999998e-06,1.4654199999999999e-06],"176":[4.6806799999999994e-06,5.5312499999999998e-06],"52":[1.4163700000000001e-06,1.4236199999999999e-06],"272":[6.7469300000000001e-06,7.3559799999999998e-06],"116":[2.8502300000000002e-06,2.9980099999999998e-06],"47104":[0.00169615,0.00177001],"6912":[0.00019652300000000002,0.00021924499999999999],"1856":[4.9841979999999993e-05,5.0430347368421052e-05],"48":[1.3862e-06,1.4577200000000002e-06],"2097152":[0.1048191515,0.11683307900000001],"54":[1.3869100000000001e-06,1.5070000000000001e-06],"2031616":[0.102460618,0.109530365],"43008":[0.0014947021666666667,0.0015515350000000002],"60":[1.6207099999999999e-06,1.6863699999999999e-06],"30720":[0.00087249300000000001,0.00092982279999999991],"56":[1.5039599999999999e-06,1.5799100000000002e-06],"62":[1.6069399999999999e-06,1.7384799999999998e-06],"58":[1.50359e-06,1.6145200000000001e-06],"3014656":[0.21167036,0.2670651765],"64":[1.6632800000000001e-06,1.7210700000000002e-06],"8388608":[0.89990621549999994,0.93229383300000002],"29696":[0.00086403509090909078,0.00089408199999999982],"216":[5.0784299999999999e-06,5.3816000000000003e-06],"106496":[0.0031694049999999993,0.0032714404999999993],"72":[1.86844e-06,2.0227199999999998e-06],"442368":[0.0164492205,0.017365841],"147456":[0.00497095,0.0071715630000000006],"4456448":[0.40438285400000001,0.40857760249999997],"63488":[0.0018962849999999997,0.0020427799999999997],"38912":[0.0012823370000000001,0.001307597142857143],"68":[1.7631400000000002e-06,2.01174e-06],"188416":[0.007453828,0.0077289509999999995],"248":[6.0810499999999991e-06,6.1120099999999999e-06],"80":[2.2757105263157895e-06,2.37113e-06],"2560":[8.2283329999999994e-05,8.5841079999999999e-05],"34816":[0.001049716,0.0010597887777777774],"3712":[0.00010099463917525773,0.000106133],"3538944":[0.31724942099999998,0.34528917399999998],"76":[1.97929e-06,2.3426499999999999e-06],"4194304":[0.36604390349999999,0.37515849200000001],"851968":[0.034389845999999953,0.044400315000000003],"4096":[0.000112302,0.00012446933333333334],"59392":[0.0017842187999999991,0.0017983252000000009],"84":[2.2429600000000001e-06,2.3416299999999997e-06],"3276800":[0.28028566849999997,0.29169790449999999],"55296":[0.0016425934000000003,0.0017243738000000002],"688128":[0.030454360999999996,0.033822463999999983],"8192":[0.00025122499999999999,0.00025270689743589741],"10240":[0.0003211270000000001,0.000346922],"15872":[0.00044883500000000002,0.00052024617647058818],"92":[2.7278500000000001e-06,2.7966599999999996e-06],"26624":[0.0007245410000000001,0.00073234600000000015],"1792":[4.4101999999999999e-05,4.8752666666666665e-05],"11776":[0.00043380100000000004,0.00043674400000000003],"2944":[0.000103014,0.00010894444444444443],"88":[2.5663699999999997e-06,2.7284699999999998e-06],"22528":[0.00081622990909090902,0.00086866810000000021],"1245184":[0.057638951000000008,0.070718563999999984],"15728640":[1.8275933689999999,1.890438882],"96":[2.6942790697674419e-06,3.0240199999999999e-06],"1984":[5.3476309523809524e-05,5.5899809999999997e-05],"139264":[0.0047394620000000007,0.0048012419999999998],"475136":[0.018387094,0.018545988000000003],"13631488":[1.5513382505,1.614528009],"416":[9.8709999999999992e-06,9.9847600000000003e-06],"928":[2.3726329999999999e-05,2.471409e-05],"512":[1.295475e-05,1.3679919999999999e-05],"18432":[0.00057599400000000003,0.00060239000000000007],"16777216":[2.0064988100000001],"9728":[0.00030753099999999999,0.00032277500000000013],"1769472":[0.094743806999999985,0.103552686],"1703936":[0.089689009999999972,0.110631118],"2048":[5.4975570000000001e-05,5.7671260000000002e-05],"14336":[0.00041815078260869568,0.00043738700000000002],"448":[1.0921970000000001e-05,1.109089e-05],"5505024":[0.54092960899999998,0.56590731699999997],"544":[1.46444e-05,1.5063459459459461e-05],"221184":[0.007368376999999998,0.0076218230000000024],"90112":[0.0033222359999999992,0.0034426890000000001],"640":[1.746123e-05,1.9577999999999998e-05],"12800":[0.00033775600000000004,0.000351715],"262144":[0.0091006349999999993,0.011177532],"589824":[0.02413568,0.030113789000000002],"884736":[0.035327793500000024,0.042889584000000001],"6144":[0.00022838400000000001,0.00023977499999999996],"1088":[2.9801810000000001e-05,3.1289969999999998e-05],"576":[1.4666e-05,1.5907888888888888e-05],"160":[4.5033800000000002e-06,4.6748200000000002e-06],"672":[1.9824690000000003e-05,2.029057e-05],"8912896":[0.98457422149999996,1.119784895],"100":[2.4064299999999999e-06,2.6146900000000003e-06],"507904":[0.019918805499999997,0.021399336499999998],"3840":[0.000104286,0.00011189269047619051],"192":[5.5627699999999999e-06,5.5699300000000002e-06],"376832":[0.0161335305,0.016141613499999999],"98304":[0.0038867890000000003,0.0040461289999999999],"5376":[0.00017857700000000002,0.000190829],"94208":[0.0035828499999999998,0.0036297],"81920":[0.0028478470000000006,0.0029127429999999998],"3407872":[0.29315711150000001,0.31946094999999997],"104":[2.6395700000000001e-06,2.8229800000000002e-06],"122880":[0.0039138369999999999,0.0040062574999999998],"200":[4.6466900000000001e-06,4.9650599999999999e-06],"163840":[0.0059131979999999997,0.0061962409999999999],"4063232":[0.34853354800000003,0.38217564549999999],"5767168":[0.57270151199999997,0.62089223449999997],"12582912":[1.4740842345,2.6385628140000001],"1600":[3.9656452380952381e-05,4.0110500000000002e-05],"136":[3.5566100000000002e-06,3.5614000000000003e-06],"232":[5.3593499999999998e-06,5.6293999999999998e-06],"7077888":[0.74756391300000002,0.84160698700000003],"86016":[0.0030226793333333335,0.0030597979999999999],"31744":[0.00092921189999999997,0.0009674423000000001],"168":[4.3733333333333335e-06,4.4853400000000003e-06],"622592":[0.025944929500000002,0.03153736850000001],"108":[2.77871e-06,2.7911599999999998e-06],"327680":[0.012732136999999999,0.013061062],"2176":[6.0931000000000003e-05,6.4583549999999999e-05],"3328":[8.8199e-05,9.777359375e-05],"1":[1.9667e-07,2.2153e-07],"2":[2.1862999999999999e-07,2.4231e-07],"3":[2.3708999999999999e-07,3.0031000000000002e-07],"4":[2.7211000000000002e-07,2.9153999999999998e-07],"7424":[0.00022027,0.00022081788571428574],"5":[2.7688999999999999e-07,3.122e-07],"23552":[0.00087983200000000021,0.00094012099999996014],"6":[2.9703999999999997e-07,3.3669999999999999e-07],"61440":[0.001897754,0.0019328535],"491520":[0.0187209955,0.021122962000000002],"77824":[0.0025868889999999998,0.0027048529999999997],"7":[3.3618000000000004e-07,3.4017000000000001e-07],"8":[3.7121e-07,3.8632999999999999e-07],"208":[4.8775999999999997e-06,4.9592099999999997e-06],"9":[3.7488999999999999e-07,3.8250999999999995e-07],"73728":[0.0023588230000000003,0.0026338029999999997],"304":[7.9738199999999995e-06,8.9369599999999999e-06],"400":[9.4419500000000003e-06,9.9603499999999986e-06],"1310720":[0.06219152800000001,0.074177018000000011],"336":[8.7993299999999993e-06,1.0542399999999999e-05],"3670016":[0.32873068799999999,0.33511006500000001],"6656":[0.00017211,0.00018625133333333328],"15360":[0.00045333800000000002,0.00048347500000000003],"432":[1.0489679999999999e-05,1.0564439999999999e-05],"950272":[0.038397838499999996,0.048713859500000005],"655360":[0.027953217000000009,0.032848869999999995],"69632":[0.0022660104999999995,0.0022835479999999998],"11264":[0.00039341849999999999,0.00044691999999999985],"2752512":[0.174372902,0.19678693050000001],"8126464":[0.89145252249999996,0.90484740900000005],"27648":[0.00075075199999999993,0.00080216399999999996],"368":[1.191136e-05,1.212818e-05],"65536":[0.0019867629999999999,0.0020766305000000001],"16252928":[1.9045495535000001,1.927205083],"464":[1.146637e-05,1.1822650000000001e-05],"1015808":[0.043728494,0.057649649999999997],"3072":[0.00012001379268292684,0.00012275799999999999],"110592":[0.003353591,0.0034262659999999994],"237568":[0.0079073919999999992,0.0082133940000000006],"278528":[0.0098545979999999957,0.010434801],"496":[1.21225e-05,1.2685e-05],"13107200":[1.4892965675000001,1.5741816150000001],"9961472":[1.1777985209999999,1.23959123],"5888":[0.000201313,0.000226982],"11010048":[1.237478391,1.3606792400000001],"1920":[5.1646230000000002e-05,5.2129209999999996e-05],"2490368":[0.14650228600000001,0.17238236200000001],"19456":[0.0006430633333333333,0.00068801478571428576],"57344":[0.0017151060000000003,0.0017613070000000002],"1179648":[0.054535836999999997,0.069367704500000016],"4718592":[0.43917753599999998,0.47636242299999998],"360448":[0.014646816999999998,0.014703596999999999],"1572864":[0.084283181999999998,0.094796848999999989],"53248":[0.0015086089999999999,0.0015895849999999999],"3456":[8.7819999999999996e-05,9.8478000000000001e-05],"40960":[0.001335613,0.001343248],"4608":[0.000137551,0.00014441593220338982],"13824":[0.00038759550000000003,0.00040576399999999997],"819200":[0.033131004000000006,0.042024823500000003],"983040":[0.040963220500000022,0.049429746499999996],"8704":[0.00026996999999999991,0.0002819136],"120":[3.0998899999999999e-06,3.1451599999999997e-06],"1024":[2.7672000000000002e-05,2.7982913043478264e-05],"49152":[0.0019071750000000001,0.0019141],"524288":[0.0206947325,0.023600092],"45056":[0.0016314474,0.001646011],"229376":[0.0074302200000000013,0.0081569369999999995],"2688":[9.0122099999999996e-05,9.0277666666666658e-05],"152":[4.0388899999999997e-06,4.0416600000000004e-06],"5120":[0.000162239,0.00016652400000000006],"1507328":[0.077370034000000004,0.10247616799999998],"1216":[3.5130000000000004e-05,3.7581599999999999e-05],"1966080":[0.102319223,0.113222006],"1900544":[0.10916535199999999,0.1094955765],"184":[5.0699100000000002e-06,5.6966600000000006e-06],"7936":[0.00022899900000000005,0.000238287],"3801088":[0.32703781600000004,0.35758526000000002],"6815744":[0.72282931399999995,0.80040751899999996],"124":[3.1639700000000001e-06,3.2629999999999999e-06],"102400":[0.003088464,0.003090958],"311296":[0.011865154500000001,0.0123657],"1408":[4.1732e-05,4.3752842105263163e-05],"393216":[0.017060958999999997,0.018994985999999998],"4352":[0.00013061,0.00013110300000000001],"6553600":[0.708229475,0.77265830699999993],"20480":[0.00065809600000000016,0.00068180499999999963],"608":[1.6415000000000001e-05,1.8213890000000001e-05],"2228224":[0.121939328,0.1280083635],"36864":[0.0011694337142857144,0.0012931819999999999],"704":[1.9910666666666666e-05,2.24144e-05],"720896":[0.032474357999999995,0.038468448500000002],"800":[1.9012999999999999e-05,1.9532139999999998e-05],"2621440":[0.161474918,0.18391022400000001],"425984":[0.016338771999999998,0.016884311000000003],"32768":[0.00099721399999999996,0.0010262928888888888],"12058624":[1.392431432,1.457221484],"128":[3.1569600000000002e-06,3.2895199999999997e-06],"180224":[0.0068509290000000013,0.0071309019999999989],"224":[5.1486800000000007e-06,5.6074100000000006e-06],"736":[2.2541999999999999e-05,2.4899129999999999e-05],"320":[8.6743333333333344e-06,9.1758900000000007e-06],"557056":[0.022574656999999995,0.025131374000000001],"832":[1.9918000000000001e-05,2.0472260000000001e-05],"9437184":[1.1112748100000001,1.175626683],"3584":[9.1525000000000002e-05,0.00010216772727272727],"6291456":[0.68546440600000003,0.76913701099999998],"256":[6.1886299999999999e-06,6.58457e-06],"15204352":[1.7616036065,1.9630065525],"28672":[0.00080827699999999993,0.00084493699999999981],"768":[2.4485666666666665e-05,2.5041e-05],"212992":[0.0069054430000000016,0.006911956999999999],"864":[2.1593979166666664e-05,2.21316e-05],"352":[9.8160000000000005e-06,1.009768e-05],"253952":[0.0089099350000000008,0.0093036789999999987],"960":[2.4498749999999996e-05,2.5989000000000001e-05],"24576":[0.00098168999999999991,0.0010266071111111111],"7680":[0.00021683299999999999,0.000219991],"294912":[0.010652662,0.011038651],"1048576":[0.043841482500000001,0.055000650000000005],"10485760":[1.1650848540000001,1.250822796],"344064":[0.013636702000000001,0.014010725],"288":[7.3032200000000004e-06,7.8399299999999997e-06],"1152":[3.2783749999999999e-05,3.3836659999999998e-05],"384":[1.189594e-05,1.4236000000000001e-05],"2304":[6.5203000000000006e-05,6.9089488372093026e-05],"896":[2.285731e-05,2.339453e-05],"480":[1.15495e-05,1.2527370000000001e-05],"1441792":[0.073108753000000012,0.089880291000000001],"992":[2.6673724137931036e-05,2.7265799999999999e-05],"3968":[0.00011584796202531648,0.000119984],"6400":[0.00017120700000000002,0.00017759999999999998],"1344":[4.0227720000000003e-05,4.3215079999999998e-05],"126976":[0.0040086509999999985,0.0042460740000000007],"2883584":[0.20068641800000001,0.21374410099999999],"753664":[0.035143286500000002,0.04090929849999999],"16384":[0.00051406399999999973,0.00052181700000000016],"131072":[0.0043923459999999992,0.004444412],"458752":[0.017309502000000001,0.020225317],"172032":[0.0063739860000000008,0.0066007319999999998],"12288":[0.00046913259999999991,0.00050707455555555571],"14680064":[1.6916894465000001,2.8887879700000001],"1536":[5.4561249999999999e-05,5.8566340000000005e-05],"25600":[0.00070015623076922725,0.00075320108333333329],"1835008":[0.093441043000000015,0.1002438945],"10752":[0.00036198099999999999,0.00040692137499999999],"21504":[0.00076170899999999995,0.00080179999999999987],"7602176":[0.782572033,0.82107348899999999],"5632":[0.0001984452857142857,0.00021855661363636369],"10":[4.0148000000000002e-07,4.1382999999999999e-07],"3145728":[0.209659968,0.24779958299999999],"245760":[0.0083083459999999977,0.0084884599999999998],"1728":[4.5172159999999998e-05,4.8894000000000003e-05],"11":[3.9378000000000002e-07,4.1572000000000002e-07],"1114112":[0.048955084500000003,0.059480353499999992],"12":[4.2276000000000001e-07,4.4666999999999996e-07],"7340032":[0.77764170249999998,0.87178786249999995],"7168":[0.00018903149999999999,0.00019874150000000001],"13":[4.6530999999999998e-07,4.679e-07],"6029312":[0.62577570700000007,0.63189556650000001],"14":[4.7767000000000001e-07,5.2302999999999999e-07],"3200":[8.2576170000000002e-05,8.7296769999999999e-05],"20":[5.8746000000000005e-07,7.1338e-07],"204800":[0.0065842310000000003,0.0067085869999999994],"15":[5.1378000000000004e-07,5.3580000000000002e-07],"13312":[0.00036090500000000012,0.00037346599999999998],"4980736":[0.48550180999999998,0.49219960799999996],"118784":[0.0035729069999999993,0.0040871355000000002],"51200":[0.0014998610000000003,0.0015234259999999944],"16":[5.8894999999999999e-07,6.0733999999999993e-07],"21":[6.5138e-07,6.8603846153846154e-07],"917504":[0.037168089000000015,0.048743949999999994],"22":[7.2342000000000005e-07,8.0490000000000001e-07],"4864":[0.00015252399999999999,0.000164594],"17":[5.7321999999999999e-07,5.9235999999999999e-07],"14848":[0.00044121024999999991,0.00044864499999999996],"23":[8.7853000000000002e-07,9.4067999999999992e-07],"786432":[0.037577369499999999,0.042646561000000006],"18":[6.0765999999999998e-07,6.7734e-07],"1638400":[0.09268029500000001,0.11057399699999998],"7864320":[0.86780086050000005,0.908332853],"24":[7.6811999999999992e-07,7.7767e-07],"14155776":[1.6367135355,1.6904372955],"19":[5.5858999999999997e-07,6.3834000000000004e-07],"30":[8.4038999999999997e-07,8.4728999999999996e-07],"25":[7.5224999999999998e-07,8.4527e-07],"31":[8.4392e-07,9.0095000000000003e-07],"1280":[3.8059000000000003e-05,3.9122809999999998e-05],"26":[7.0773999999999996e-07,7.1384999999999995e-07],"3932160":[0.33661965599999999,0.40716253800000002],"2432":[7.4901000000000007e-05,7.6930464285714282e-05],"32":[8.5371000000000004e-07,9.0383000000000001e-07],"27":[7.5608999999999999e-07,7.6105e-07],"409600":[0.014873295,0.015269713000000001]}},{"title":"OrderedSet random-access offset lookups","results":{"28":[4.5569999999999997e-08,4.5569999999999997e-08],"34":[5.334e-08,5.6330000000000002e-08],"29":[4.6580000000000004e-08,4.6580000000000004e-08],"40":[6.0070000000000008e-08,6.6139999999999995e-08],"17408":[2.2119470000000002e-05,2.3178949999999999e-05],"1472":[1.6970099999999999e-06,1.70234e-06],"112":[1.4177e-07,1.4320000000000001e-07],"1376256":[0.0094257779999999992,0.012495880000000015],"5242880":[0.061807204000000004,0.063501192499999998],"36":[5.5579999999999999e-08,5.8289999999999995e-08],"42":[6.2260000000000003e-08,6.5169999999999994e-08],"11534336":[0.14217075700000001,0.1428153915],"114688":[0.00024986657142857135,0.00027103399999999997],"144":[1.8222e-07,1.8635999999999998e-07],"38":[6.0489999999999994e-08,6.3399999999999999e-08],"240":[2.8764e-07,3.0042857142857141e-07],"9216":[1.181091e-05,1.222756e-05],"44":[6.6220000000000007e-08,7.0620000000000006e-08],"1664":[1.9181999999999997e-06,2.00933e-06],"196608":[0.00056145066666666665,0.0005715239999999999],"155648":[0.0004025220000000001,0.00041888685000000001],"2816":[3.2481699999999997e-06,3.25162e-06],"50":[7.2699999999999996e-08,7.4460000000000006e-08],"2359296":[0.024029841499999996,0.024085629000000004],"46":[6.9299999999999992e-08,6.9859999999999992e-08],"176":[2.1231e-07,2.2765999999999999e-07],"52":[7.4060000000000003e-08,7.5100000000000004e-08],"272":[3.2641999999999998e-07,3.4644999999999998e-07],"116":[1.4740999999999999e-07,1.4749999999999999e-07],"47104":[6.2792999999999993e-05,7.0451024390243901e-05],"6912":[8.9718000000000011e-06,9.81127e-06],"1856":[2.1403700000000003e-06,2.1478500000000001e-06],"48":[7.205e-08,7.2759999999999998e-08],"2097152":[0.0198071025,0.020409379999999998],"54":[7.5810000000000002e-08,7.8979999999999997e-08],"2031616":[0.018941108500000001,0.020232828000000001],"43008":[5.9459000000000001e-05,6.2381500000000006e-05],"60":[8.2349999999999993e-08,8.2369999999999989e-08],"30720":[4.0623279999999993e-05,4.0732429999999999e-05],"56":[7.7719999999999997e-08,7.7859999999999997e-08],"62":[8.4460000000000003e-08,8.8850000000000005e-08],"58":[8.012999999999999e-08,8.2689999999999995e-08],"3014656":[0.032926011999999998,0.033307629999999998],"64":[8.7499999999999996e-08,9.157999999999999e-08],"8388608":[0.1012177655,0.102500549],"29696":[3.7475000000000003e-05,4.1263259999999999e-05],"216":[2.6174999999999997e-07,2.6250999999999999e-07],"106496":[0.00022920897435897434,0.00023742899999999999],"72":[9.7820000000000012e-08,1.0021e-07],"442368":[0.0013754939999999999,0.0013900479999999998],"147456":[0.00038513883333333331,0.00038688199999999996],"4456448":[0.050361492000000022,0.050457545999999999],"63488":[9.4210439560439555e-05,9.7742222222222219e-05],"38912":[5.3276999999999998e-05,5.5398000000000001e-05],"68":[9.5570000000000001e-08,9.8039999999999996e-08],"188416":[0.00052297988888888884,0.00053127033333333329],"248":[3.0970999999999999e-07,3.1243e-07],"80":[1.0649999999999999e-07,1.1901e-07],"2560":[2.9463299999999996e-06,3.2271099999999998e-06],"34816":[4.5300999999999999e-05,4.8511600000000005e-05],"3712":[4.32242e-06,4.54647e-06],"3538944":[0.039315156500000004,0.040119915999999999],"76":[1.0188e-07,1.0487e-07],"4194304":[0.047158882999999999,0.048417142999999996],"851968":[0.0038055369999999999,0.0044883180000000007],"4096":[4.7962299999999995e-06,5.2627700000000003e-06],"59392":[8.0896999999999995e-05,8.4373961538461537e-05],"84":[1.1182999999999999e-07,1.1671e-07],"3276800":[0.036061990000000002,0.036091317999999997],"55296":[8.0655940000000004e-05,8.9625450000000001e-05],"688128":[0.0029601293333333333,0.0037242834999999994],"8192":[1.0094030000000001e-05,1.0582e-05],"10240":[1.361973e-05,1.3629840000000001e-05],"15872":[2.0518080000000001e-05,2.100345e-05],"92":[1.1946000000000001e-07,1.2473999999999999e-07],"26624":[3.4922000000000002e-05,3.5407500000000003e-05],"1792":[2.0754999999999999e-06,2.1649000000000002e-06],"11776":[1.4935e-05,1.561342e-05],"2944":[3.5477300000000003e-06,3.5588699999999999e-06],"88":[1.1609e-07,1.2038e-07],"22528":[2.9352e-05,3.1049649999999998e-05],"1245184":[0.007791915,0.0097017835],"15728640":[0.1973586675,0.21600024200000001],"96":[1.2307e-07,1.2487999999999999e-07],"1984":[2.2824e-06,2.3949499999999998e-06],"139264":[0.0003660143,0.00036664659090909085],"475136":[0.00152407,0.0015305050000000001],"13631488":[0.171061877,0.17399183800000001],"416":[4.8915000000000001e-07,4.9189000000000005e-07],"928":[1.07459e-06,1.1231111111111111e-06],"512":[5.9739000000000003e-07,6.5756999999999998e-07],"18432":[2.3623269999999999e-05,2.5267089999999997e-05],"16777216":[0.21466921049999999],"9728":[1.199418e-05,1.2305e-05],"1769472":[0.015866123000000003,0.018213558000000015],"1703936":[0.014373259999999999,0.015550874500000001],"2048":[2.3513000000000003e-06,2.3555600000000001e-06],"14336":[1.7469653846153847e-05,1.7554000000000002e-05],"448":[5.2297999999999999e-07,5.2593999999999996e-07],"5505024":[0.064629114000000001,0.064803440999999989],"544":[6.6427999999999991e-07,6.6471999999999999e-07],"221184":[0.00061425340000000007,0.0006307655000000001],"90112":[0.00014875400000000002,0.00017684989361702123],"640":[7.4532999999999996e-07,7.8233999999999995e-07],"12800":[1.575e-05,1.633085e-05],"262144":[0.00074354549999999992,0.00075239049999999998],"589824":[0.0023645366666666672,0.0026036600000000068],"884736":[0.0041123540000000004,0.0041786940000000002],"6144":[7.60184e-06,7.6320400000000002e-06],"1088":[1.2529500000000002e-06,1.31225e-06],"576":[6.7085e-07,7.0477999999999999e-07],"160":[1.9947e-07,2.1166999999999999e-07],"672":[7.7820000000000002e-07,7.9072000000000003e-07],"8912896":[0.1094884015,0.11727050500000002],"100":[1.2830999999999999e-07,1.2851e-07],"507904":[0.0016282200000000001,0.0021275320000000001],"3840":[4.4754999999999998e-06,4.8908100000000005e-06],"192":[2.3608999999999999e-07,2.4471999999999998e-07],"376832":[0.0011149719999999999,0.0011268059999999999],"98304":[0.00019085516666666666,0.00019910394871794872],"5376":[6.3679499999999997e-06,6.99293e-06],"94208":[0.00019660509523809514,0.00019920353488372096],"81920":[0.000136902,0.00014097706818181819],"3407872":[0.038174365000000036,0.038184251500000002],"104":[1.3220999999999999e-07,1.3238e-07],"122880":[0.0003023174,0.00030819088000000002],"200":[2.4264000000000001e-07,2.4413e-07],"163840":[0.00043483877777777768,0.000450407],"4063232":[0.046028555999999998,0.046095266500000009],"5767168":[0.067500573999999952,0.067822577499999967],"12582912":[0.1572477165,0.3412970045],"1600":[1.84916e-06,1.9396699999999998e-06],"136":[1.6986999999999997e-07,1.7808999999999998e-07],"232":[2.7831000000000001e-07,2.9199000000000001e-07],"7077888":[0.08509852900000002,0.0887703205],"86016":[0.00013453299999999999,0.00016053799999999409],"31744":[4.1884000000000001e-05,4.3577749999999998e-05],"168":[2.0466999999999999e-07,2.2826000000000001e-07],"622592":[0.002203703,0.002642695],"108":[1.3885e-07,1.3969e-07],"327680":[0.000959606,0.001039310857142857],"2176":[2.4975499999999999e-06,2.5009700000000003e-06],"3328":[3.8593749999999998e-06,4.0419199999999999e-06],"1":[1.6549999999999999e-08,1.7310000000000001e-08],"2":[1.7439999999999999e-08,1.7460000000000002e-08],"3":[1.8329999999999999e-08,2.0109999999999999e-08],"4":[1.9209999999999998e-08,1.9209999999999998e-08],"7424":[9.6952899999999995e-06,1.0581239999999999e-05],"5":[2.0099999999999998e-08,2.0109999999999999e-08],"23552":[3.0374894736842106e-05,3.0851e-05],"6":[2.0990000000000001e-08,2.0999999999999999e-08],"61440":[9.546942857142858e-05,9.6251430107526889e-05],"491520":[0.001481113,0.0021121736666666674],"77824":[0.00012033577777777779,0.00013719962903225807],"7":[2.1880000000000001e-08,2.1880000000000001e-08],"8":[2.2769999999999998e-08,2.2769999999999998e-08],"208":[2.4783999999999997e-07,2.5216e-07],"9":[2.3659999999999998e-08,2.367e-08],"73728":[0.000104218,0.00011812269230769234],"304":[3.6257e-07,3.7723e-07],"400":[4.6808000000000005e-07,4.7157000000000003e-07],"1310720":[0.0084886270000000003,0.010849400999999984],"336":[3.9854999999999998e-07,4.1867999999999999e-07],"3670016":[0.040846325500000003,0.041430830499999995],"6656":[7.9784999999999999e-06,8.2689999999999999e-06],"15360":[2.0632879999999999e-05,2.1121089999999999e-05],"432":[5.0592000000000002e-07,5.3061999999999997e-07],"950272":[0.0043438419999999988,0.0046516779999999994],"655360":[0.0026549526666666667,0.0029118720000000002],"69632":[0.0001077037,0.0001118412],"11264":[1.407703e-05,1.6365710000000002e-05],"2752512":[0.029093319499999999,0.030118568000000002],"8126464":[0.098981776999999993,0.10027460000000001],"27648":[3.5671068493150683e-05,3.7691000000000002e-05],"368":[4.3402999999999998e-07,4.5103999999999999e-07],"65536":[9.422360000000001e-05,9.9476133333333328e-05],"16252928":[0.20542095799999999,0.20665190649999998],"464":[5.4387000000000001e-07,5.7148999999999999e-07],"1015808":[0.005143781,0.0057990570000000519],"3072":[3.54336e-06,3.55625e-06],"110592":[0.000243644,0.00025483428571428568],"237568":[0.00068748876923076956,0.0006990678999999997],"278528":[0.00076288899999999978,0.00083993000000000023],"496":[5.8009e-07,6.0571000000000004e-07],"13107200":[0.16481971499999998,0.16865037899999999],"9961472":[0.1235744715,0.126226639],"5888":[7.2393700000000001e-06,7.6371100000000008e-06],"11010048":[0.1366612915,0.13769895250000003],"1920":[2.2055100000000002e-06,2.21428e-06],"2490368":[0.025734030999999997,0.025881743999999995],"19456":[2.4219999999999999e-05,2.5638150000000001e-05],"57344":[8.6997759999999993e-05,9.0744666666666665e-05],"1179648":[0.0073582559999999988,0.0095344055000000007],"4718592":[0.055115918,0.055178084499999988],"360448":[0.001088927,0.0011018381428571429],"1572864":[0.012782045000000001,0.014350655],"53248":[7.6384000000000006e-05,7.9749369999999997e-05],"3456":[4.01699e-06,4.4095799999999995e-06],"40960":[5.6131780000000002e-05,5.9065599999999999e-05],"4608":[5.4191500000000005e-06,5.7149299999999997e-06],"13824":[1.82731e-05,1.830178e-05],"819200":[0.0036121705000000002,0.0039953879999999999],"983040":[0.0047799009999999996,0.0048776979999999998],"8704":[1.1000184210526317e-05,1.1052e-05],"120":[1.5106999999999999e-07,1.5197e-07],"1024":[1.1876400000000001e-06,1.2986900000000001e-06],"49152":[7.0311109999999992e-05,7.3899419999999994e-05],"524288":[0.001646284,0.0021996213333333329],"45056":[6.3899000000000006e-05,6.7524899999999994e-05],"229376":[0.00065665899999999998,0.00069136175000000008],"2688":[3.0892700000000002e-06,3.35618e-06],"152":[1.8745e-07,1.9865e-07],"5120":[6.0624599999999997e-06,6.3849999999999999e-06],"1507328":[0.011687744,0.013776030999999998],"1216":[1.40901e-06,1.46007e-06],"1966080":[0.018281833499999997,0.0189901835],"1900544":[0.017783254500000005,0.018264935499999999],"184":[2.2234000000000002e-07,2.4518999999999999e-07],"7936":[1.0027692307692308e-05,1.04824e-05],"3801088":[0.042227205000000004,0.044035506999999995],"6815744":[0.08427986400000001,0.088394288000000015],"124":[1.5648000000000001e-07,1.6701000000000001e-07],"102400":[0.00020807720000000002,0.00022974399999999999],"311296":[0.00089545400000000006,0.00091378999999999994],"1408":[1.6167300000000001e-06,1.6280999999999999e-06],"393216":[0.0012248129999999999,0.0015553680000000001],"4352":[5.1168299999999994e-06,5.3638000000000002e-06],"6553600":[0.079946619499999996,0.081472303499999982],"20480":[2.5126999999999998e-05,2.6509e-05],"608":[7.0575999999999994e-07,7.451700000000001e-07],"2228224":[0.022049361,0.022232283500000002],"36864":[4.7932000000000001e-05,5.3610999999999999e-05],"704":[8.1317999999999998e-07,8.1353000000000001e-07],"720896":[0.0028081169999999997,0.0038245384999999999],"800":[9.1813999999999999e-07,9.2967999999999994e-07],"2621440":[0.027219133500000003,0.028101488000000015],"425984":[0.0013181619999999999,0.0013794353333333334],"32768":[4.2537000000000003e-05,4.2941000000000001e-05],"12058624":[0.15033064900000004,0.15220916400000001],"128":[1.617e-07,1.7869000000000002e-07],"180224":[0.00049724400000000009,0.00050990066666666651],"224":[2.6749999999999998e-07,2.6808e-07],"736":[8.5461e-07,8.6025000000000004e-07],"320":[3.7817e-07,3.9855999999999999e-07],"557056":[0.0019224024999999999,0.0026898266666666665],"832":[9.558799999999999e-07,9.6352000000000009e-07],"9437184":[0.1164229405,0.121003472],"3584":[4.1655600000000001e-06,4.5825599999999997e-06],"6291456":[0.075368322000000015,0.075966467999999995],"256":[3.1038999999999996e-07,3.3738000000000002e-07],"15204352":[0.19109984599999999,0.21171931799999999],"28672":[3.7883000000000003e-05,3.9353000000000001e-05],"768":[8.8813999999999996e-07,9.3512999999999993e-07],"212992":[0.0005805053333333332,0.00058507600000000013],"864":[1.0006499999999999e-06,1.04365e-06],"352":[4.1637999999999997e-07,4.3846000000000002e-07],"253952":[0.00072941430000000005,0.00073961072727272731],"960":[1.10586e-06,1.16387e-06],"24576":[3.3505560000000004e-05,3.3584999999999998e-05],"7680":[9.4128799999999996e-06,9.6319699999999999e-06],"294912":[0.00084872499999999983,0.0008984790000000001],"1048576":[0.005411936,0.005446925],"10485760":[0.12809495100000001,0.12872066400000001],"344064":[0.0010457209999999999,0.0010552130000000002],"288":[3.4542000000000003e-07,3.6069999999999999e-07],"1152":[1.3290399999999999e-06,1.45927e-06],"384":[4.5153000000000002e-07,4.5260999999999997e-07],"2304":[2.6524900000000002e-06,2.7699899999999999e-06],"896":[1.03578e-06,1.08875e-06],"480":[5.6116999999999994e-07,5.8671999999999995e-07],"1441792":[0.010931263,0.012538119],"992":[1.1458600000000001e-06,1.19875e-06],"3968":[4.63779e-06,5.0798800000000006e-06],"6400":[7.6514999999999995e-06,8.3124800000000008e-06],"1344":[1.5516999999999999e-06,1.62255e-06],"126976":[0.00030053520000000001,0.00031405659999999999],"2883584":[0.030526509,0.03126500950000001],"753664":[0.0033518215000000002,0.0038867544999999998],"16384":[2.1863960000000003e-05,2.2245149999999998e-05],"131072":[0.00032708516666666665,0.00033497983333333328],"458752":[0.0014495229999999999,0.0016835730000000001],"172032":[0.000456401,0.00046346435294117652],"12288":[1.5354370000000001e-05,1.6829956521739132e-05],"14680064":[0.18341218500000001,0.37625935799999999],"1536":[1.8622899999999999e-06,1.9542799999999999e-06],"25600":[3.3396200000000004e-05,3.4606749999999999e-05],"1835008":[0.015886061,0.016696371000000005],"10752":[1.3492659999999999e-05,1.4330639999999999e-05],"21504":[2.6800000000000001e-05,2.9071510000000002e-05],"7602176":[0.090920259500000003,0.091526771499999993],"5632":[6.6932799999999994e-06,7.3884000000000003e-06],"10":[2.4579999999999999e-08,2.5720000000000001e-08],"3145728":[0.033879403500000002,0.034236202],"245760":[0.00071316066666666676,0.00071640716666666676],"1728":[1.9975599999999999e-06,2.3526800000000002e-06],"11":[2.5469999999999999e-08,2.6659999999999999e-08],"1114112":[0.0061279819999999997,0.0079031399999999995],"12":[2.6359999999999999e-08,2.6370000000000001e-08],"7340032":[0.088930809499999999,0.092152378499999993],"7168":[8.8326599999999999e-06,9.0374400000000003e-06],"13":[2.7450000000000001e-08,2.7480000000000002e-08],"6029312":[0.071391300000000033,0.071512143],"14":[2.8579999999999999e-08,2.8579999999999999e-08],"3200":[3.6993399999999997e-06,3.8748199999999994e-06],"20":[3.5310000000000003e-08,3.8029999999999997e-08],"204800":[0.0005435355,0.00057659833333333337],"15":[3.002e-08,3.002e-08],"13312":[1.6373999999999999e-05,1.7206059999999998e-05],"4980736":[0.058302260499999981,0.058388709000000004],"118784":[0.00027034236666666667,0.00030304074999999996],"51200":[7.3927929999999996e-05,7.8375999999999996e-05],"16":[3.124e-08,3.428e-08],"21":[3.8059999999999998e-08,3.9790000000000001e-08],"917504":[0.0045185890000000008,0.0065126960000000001],"22":[3.847e-08,4.259e-08],"4864":[5.7551290322580643e-06,6.0342100000000005e-06],"17":[3.25e-08,3.4020000000000003e-08],"14848":[1.8121000000000001e-05,1.8923679999999998e-05],"23":[4.0070000000000001e-08,4.2259999999999996e-08],"786432":[0.0033610204999999999,0.0035301309999999997],"18":[3.3269999999999999e-08,3.5769999999999995e-08],"1638400":[0.013743792500000001,0.014310061000000002],"7864320":[0.09517035800000001,0.096509127],"24":[4.1130000000000005e-08,4.3050000000000005e-08],"14155776":[0.17876950000000003,0.179089164],"19":[3.4900000000000001e-08,3.6960000000000001e-08],"30":[4.807e-08,4.8170000000000001e-08],"25":[4.2499999999999997e-08,4.4719999999999999e-08],"31":[4.901e-08,4.9159999999999998e-08],"1280":[1.46531e-06,1.4797200000000001e-06],"26":[4.3239999999999995e-08,4.3290000000000006e-08],"3932160":[0.044391766499999999,0.04493395549999999],"2432":[2.7963100000000001e-06,2.92847e-06],"32":[4.9959999999999999e-08,5.0039999999999997e-08],"27":[4.4669999999999996e-08,4.4819999999999994e-08],"409600":[0.0012360205,0.001262811]}},{"title":"OrderedSet sequential iteration","results":{"28":[5.414e-08,5.4529999999999999e-08],"34":[6.7809999999999996e-08,7.0729999999999999e-08],"29":[5.5460000000000002e-08,5.5479999999999998e-08],"40":[7.0330000000000008e-08,7.3889999999999995e-08],"17408":[1.95745e-05,2.0126640000000001e-05],"1472":[1.5718899999999999e-06,1.5767400000000001e-06],"112":[1.4496e-07,1.4784000000000001e-07],"1376256":[0.001697304,0.0018307949999999996],"5242880":[0.0068116059999999996,0.0069217239999999998],"36":[6.9030000000000003e-08,7.3169999999999999e-08],"42":[7.2579999999999992e-08,7.9680000000000009e-08],"11534336":[0.015300642499999999,0.015307488999999999],"114688":[0.00012792900000000001,0.00013636600000000002],"144":[1.7865e-07,1.8902000000000001e-07],"38":[7.4630000000000001e-08,7.491e-08],"240":[2.7929999999999997e-07,2.9234999999999999e-07],"9216":[1.0242289999999999e-05,1.0694770000000001e-05],"44":[7.4359999999999999e-08,7.8059999999999999e-08],"1664":[1.77853e-06,1.85937e-06],"196608":[0.000212394,0.00022971099999999993],"155648":[0.00018326900000000001,0.00019446631249999999],"2816":[2.9908400000000001e-06,3.0037999999999999e-06],"50":[8.0539999999999992e-08,8.6440000000000012e-08],"2359296":[0.0030605363333333336,0.0031221729999999998],"46":[7.624e-08,7.9820000000000009e-08],"176":[2.1208999999999999e-07,2.2303000000000001e-07],"52":[8.2310000000000001e-08,8.2430000000000004e-08],"272":[3.1372999999999999e-07,3.2688000000000003e-07],"116":[1.4969000000000001e-07,1.4975e-07],"47104":[4.9901000000000002e-05,5.4619666666666668e-05],"6912":[7.4309999999999997e-06,8.7704600000000007e-06],"1856":[1.98291e-06,1.9861100000000002e-06],"48":[7.8040000000000003e-08,8.1720000000000006e-08],"2097152":[0.0026366866666666664,0.0026935129999999994],"54":[8.5210000000000007e-08,8.6859999999999998e-08],"2031616":[0.0025033063333333339,0.0026310613333333332],"43008":[4.5544599999999998e-05,4.9039874999999996e-05],"60":[9.0599999999999991e-08,9.0680000000000002e-08],"30720":[3.2416000000000003e-05,3.3199250000000002e-05],"56":[8.6900000000000004e-08,8.9140000000000003e-08],"62":[9.2509999999999999e-08,9.2609999999999993e-08],"58":[8.8820000000000011e-08,8.8829999999999995e-08],"3014656":[0.0039480629999999999,0.0039982580000000002],"64":[9.5410000000000005e-08,9.9979999999999999e-08],"8388608":[0.010904539499999999,0.0112652675],"29696":[3.2999599999999995e-05,3.4547e-05],"216":[2.5428999999999998e-07,2.6571000000000001e-07],"106496":[0.00012113118918918921,0.000122292],"72":[1.0334e-07,1.0775e-07],"442368":[0.00049740400000000012,0.00052790641176470585],"147456":[0.00016654253571428572,0.000174935],"4456448":[0.0057347930000000002,0.0057899370000000002],"63488":[7.3251999999999996e-05,7.8403629999999991e-05],"38912":[4.5153538461538459e-05,4.5819000000000003e-05],"68":[1.0414e-07,1.0423e-07],"188416":[0.00021043400000000001,0.00021885428888888887],"248":[3.0034e-07,3.0034e-07],"80":[1.1218e-07,1.2448000000000001e-07],"2560":[2.7328600000000003e-06,2.9790000000000002e-06],"34816":[3.6950999999999999e-05,3.8424999999999999e-05],"3712":[3.9697499999999996e-06,4.1180399999999996e-06],"3538944":[0.0046127620000000012,0.0046155139999999994],"76":[1.0716999999999999e-07,1.1222000000000001e-07],"4194304":[0.0054840680000000008,0.0054993309999999997],"851968":[0.00096463374999999994,0.001067321],"4096":[4.64526e-06,4.8069100000000004e-06],"59392":[6.3157999999999994e-05,6.8435869999999998e-05],"84":[1.1586000000000001e-07,1.2130000000000001e-07],"3276800":[0.0042522020000000009,0.0043204909999999819],"55296":[6.1353999999999996e-05,6.4172999999999997e-05],"688128":[0.00076615800000000007,0.00085159718181818177],"8192":[8.9469999999999992e-06,9.5914799999999999e-06],"10240":[1.120752e-05,1.201043e-05],"15872":[1.6986999999999998e-05,1.887111e-05],"92":[1.2461e-07,1.3689e-07],"26624":[2.8045999999999999e-05,3.0706230000000003e-05],"1792":[1.9129699999999997e-06,1.99936e-06],"11776":[1.3192e-05,1.3368530000000001e-05],"2944":[3.14523e-06,3.2745499999999998e-06],"88":[1.1992e-07,1.2858999999999999e-07],"22528":[2.4789999999999998e-05,2.6429999999999999e-05],"1245184":[0.001423386,0.0015231673333333333],"15728640":[0.020825165999999999,0.021012933000000008],"96":[1.2864000000000002e-07,1.2867e-07],"1984":[2.1221500000000001e-06,2.2140599999999999e-06],"139264":[0.00015813199999999993,0.00016256874999999999],"475136":[0.00052592299999999997,0.0005433250000000001],"13631488":[0.017916888999999991,0.019410169999999997],"416":[4.6304000000000005e-07,4.6594999999999996e-07],"928":[1.0012400000000001e-06,1.04942e-06],"512":[5.6507999999999998e-07,5.9187000000000002e-07],"18432":[1.9885999999999999e-05,2.1731179999999998e-05],"16777216":[0.022777357000000002],"9728":[1.067115e-05,1.1024e-05],"1769472":[0.0021863310000000001,0.0023400057500000005],"1703936":[0.0022120474999999997,0.0022532935000000006],"2048":[2.1838900000000001e-06,2.1986699999999998e-06],"14336":[1.5663280000000002e-05,1.604123e-05],"448":[5.0063e-07,5.0149999999999998e-07],"5505024":[0.0071283519999999975,0.0072870300000000016],"544":[5.9958000000000003e-07,6.2592000000000004e-07],"221184":[0.00024893099999999992,0.000253681611111111],"90112":[9.9773999999999997e-05,0.00010804793333333333],"640":[6.9788e-07,7.3057000000000006e-07],"12800":[1.4005000000000001e-05,1.416312857142857e-05],"262144":[0.00028255200000000004,0.00030514462499999987],"589824":[0.00066543214285714309,0.00072950281818181823],"884736":[0.001017049625,0.0011236289999999999],"6144":[6.8807099999999999e-06,6.9005000000000003e-06],"1088":[1.17389e-06,1.2267699999999999e-06],"576":[6.3346000000000001e-07,6.6118999999999995e-07],"160":[1.9536e-07,2.0460000000000002e-07],"672":[7.3211000000000001e-07,7.3677000000000011e-07],"8912896":[0.011711566,0.0122630715],"100":[1.3260000000000001e-07,1.3563999999999999e-07],"507904":[0.0005780331176470588,0.00061707426666666662],"3840":[4.1052400000000004e-06,4.1158200000000002e-06],"192":[2.2863e-07,2.2928000000000003e-07],"376832":[0.00041790000000000002,0.00043692418181818187],"98304":[0.000109393,0.00011461],"5376":[5.7942299999999999e-06,6.24261e-06],"94208":[0.00010649914457831325,0.00010980399999999998],"81920":[9.2387750000000007e-05,9.4662999999999998e-05],"3407872":[0.0044201029999999999,0.0046395455000000007],"104":[1.3693e-07,1.3694999999999999e-07],"122880":[0.0001334652,0.00013710799999999999],"200":[2.3748000000000001e-07,2.375e-07],"163840":[0.0001911584,0.00019168096078431377],"4063232":[0.005322004,0.0054154680000000014],"5767168":[0.0074991769999999984,0.0078145339999999997],"12582912":[0.01643871000000002,0.032577936000000002],"1600":[1.7106200000000001e-06,1.79263e-06],"136":[1.7088999999999999e-07,1.7791999999999999e-07],"232":[2.7049000000000004e-07,2.7125e-07],"7077888":[0.0092980609999999998,0.0096051959999999999],"86016":[9.5260999999999995e-05,0.000103371],"31744":[3.3767999999999999e-05,3.5364000000000002e-05],"168":[2.0381e-07,2.2390000000000001e-07],"622592":[0.00071764950000000028,0.000736537],"108":[1.4087000000000002e-07,1.4128999999999999e-07],"327680":[0.00038348599999999999,0.00038496300000000005],"2176":[2.3137899999999999e-06,2.31663e-06],"3328":[3.5364499999999998e-06,3.8081399999999998e-06],"1":[2.8739999999999998e-08,3.1459999999999998e-08],"2":[2.9629999999999998e-08,2.9650000000000001e-08],"3":[3.0269999999999999e-08,3.323e-08],"4":[3.1170000000000001e-08,3.1179999999999999e-08],"7424":[8.7520299999999989e-06,8.7531194029850739e-06],"5":[3.1860000000000002e-08,3.2969999999999997e-08],"23552":[2.4978e-05,2.8243999999999999e-05],"6":[3.2749999999999999e-08,3.386e-08],"61440":[6.8285000000000001e-05,7.7606555555555554e-05],"491520":[0.00055757300000000012,0.00059967100000000008],"77824":[8.5514272727272726e-05,9.1181999999999995e-05],"7":[3.2460000000000001e-08,3.2550000000000004e-08],"8":[3.4259999999999997e-08,3.4739999999999999e-08],"208":[2.4618e-07,2.4702e-07],"9":[3.323e-08,3.323e-08],"73728":[8.2778499999999994e-05,8.694206e-05],"304":[3.4814000000000005e-07,3.6279999999999999e-07],"400":[4.4682999999999998e-07,4.4941999999999996e-07],"1310720":[0.001501959,0.0016693277999999996],"336":[3.8094999999999998e-07,4.1631999999999996e-07],"3670016":[0.0048159380000000005,0.0049044730000000003],"6656":[7.1339399999999998e-06,7.6510500000000002e-06],"15360":[1.7939519999999998e-05,1.8136300000000001e-05],"432":[4.8144999999999996e-07,4.8347999999999999e-07],"950272":[0.0010579469999999998,0.0012476294285714284],"655360":[0.00076324883333333334,0.00080810336363636398],"69632":[7.8022999999999995e-05,7.9810999999999999e-05],"11264":[1.1931e-05,1.367638e-05],"2752512":[0.003561977,0.0036151620000000003],"8126464":[0.010789344999999999,0.010857904],"27648":[3.0521960000000001e-05,3.2630350000000002e-05],"368":[4.1427000000000002e-07,4.5330000000000002e-07],"65536":[7.2804000000000003e-05,7.3708000000000006e-05],"16252928":[0.021394042500000002,0.021597309000000002],"464":[5.1434000000000004e-07,5.3858e-07],"1015808":[0.0011844730000000001,0.0012395278571428572],"3072":[3.2769199999999996e-06,3.4230499999999998e-06],"110592":[0.00011839500000000001,0.00012758250000000001],"237568":[0.00025642666666666667,0.00027990600000000001],"278528":[0.0003111959032258066,0.00031375000000000001],"496":[5.4860000000000003e-07,5.7590000000000007e-07],"13107200":[0.017141847000000005,0.017952958999999998],"9961472":[0.013333276999999999,0.014317912],"5888":[6.3264799999999998e-06,6.7285e-06],"11010048":[0.014346207999999999,0.014474598],"1920":[2.0464699999999998e-06,2.0483099999999998e-06],"2490368":[0.0031769103333333334,0.0032154740000000003],"19456":[2.139344e-05,2.2154000000000002e-05],"57344":[6.3440000000000002e-05,6.3819999999999995e-05],"1179648":[0.0014675293333333333,0.0015313303333333403],"4718592":[0.006199671999999999,0.0062823590000000012],"360448":[0.000385604,0.00041709330434782607],"1572864":[0.00193819375,0.0020292315],"53248":[5.6518999999999999e-05,6.2248555555555557e-05],"3456":[3.6688100000000002e-06,4.0295499999999994e-06],"40960":[4.3300999999999998e-05,4.5754699999999997e-05],"4608":[4.9982599999999998e-06,5.1953999999999994e-06],"13824":[1.614483e-05,1.6242480000000001e-05],"819200":[0.00093368199999999991,0.0010097346666666669],"983040":[0.0011512130000000003,0.001213696285714286],"8704":[9.2820000000000002e-06,9.6317600000000004e-06],"120":[1.5395999999999998e-07,1.5591999999999998e-07],"1024":[1.10117e-06,1.15293e-06],"49152":[5.421767105263158e-05,5.6978000000000002e-05],"524288":[0.00059892650000000001,0.00071835769230769249],"45056":[5.2017729999999997e-05,5.6512919999999994e-05],"229376":[0.00025779911111111105,0.00026508550000000004],"2688":[2.8677399999999999e-06,3.1215600000000001e-06],"152":[1.8771999999999999e-07,1.9557954545454543e-07],"5120":[5.7897000000000007e-06,5.7952500000000001e-06],"1507328":[0.0019068358,0.0020094477500000002],"1216":[1.36416e-06,1.36726e-06],"1966080":[0.002442006,0.0025126446666666655],"1900544":[0.002345546,0.0025229633333333336],"184":[2.2268000000000001e-07,2.3122999999999999e-07],"7936":[9.0647800000000003e-06,9.0802099999999989e-06],"3801088":[0.0048608749999999997,0.0051414620000000003],"6815744":[0.0095599680000000003,0.0095873610000000008],"124":[1.5758000000000001e-07,1.8661e-07],"102400":[0.00011694299999999997,0.00012536790624999999],"311296":[0.00034659399999999993,0.00036036],"1408":[1.5051800000000001e-06,1.50955e-06],"393216":[0.00045508899999999999,0.000458181],"4352":[4.6740499999999997e-06,4.6788299999999996e-06],"6553600":[0.0087319719999999993,0.0092990190000000021],"20480":[2.2881999999999999e-05,2.3575599999999998e-05],"608":[6.6470000000000007e-07,6.9839999999999995e-07],"2228224":[0.0028307086666666667,0.002868294],"36864":[4.1103000000000003e-05,4.2673000000000003e-05],"704":[7.6697000000000004e-07,7.684799999999999e-07],"720896":[0.00082154909090909089,0.00087774836363636378],"800":[8.6634999999999997e-07,8.7348000000000006e-07],"2621440":[0.0033587004999999998,0.0034843370000000005],"425984":[0.000488011,0.00049487900000000004],"32768":[3.6080550000000005e-05,3.8228720000000004e-05],"12058624":[0.015754064000000005,0.016000174499999999],"128":[1.6269999999999999e-07,1.7024000000000002e-07],"180224":[0.00020128600000000001,0.00021099700000000001],"224":[2.6276000000000001e-07,2.6444e-07],"736":[7.9744999999999998e-07,8.0018999999999991e-07],"320":[3.6213000000000003e-07,3.8024000000000002e-07],"557056":[0.00062659439999999999,0.00064595600000000016],"832":[9.0013999999999991e-07,9.883299999999999e-07],"9437184":[0.013198757,0.015576648],"3584":[3.8180599999999997e-06,4.1845000000000003e-06],"6291456":[0.0081995800000000015,0.0083131859999999967],"256":[2.9825000000000001e-07,3.0909999999999998e-07],"15204352":[0.019833703999999997,0.021730317999999995],"28672":[3.1810280000000001e-05,3.3878419999999999e-05],"768":[8.3554999999999999e-07,8.7471000000000003e-07],"212992":[0.0002400621463414634,0.00024418094736842105],"864":[9.3839999999999999e-07,9.3852999999999997e-07],"352":[3.9857999999999996e-07,4.1475999999999999e-07],"253952":[0.00028480600000000002,0.00029404159375],"960":[1.0408699999999999e-06,1.0861399999999999e-06],"24576":[2.7296000000000001e-05,2.7365999999999999e-05],"7680":[8.4813800000000001e-06,9.0667299999999995e-06],"294912":[0.0003171640000000001,0.00033286900000000001],"1048576":[0.0012138471428571429,0.001241402],"10485760":[0.01356361,0.0140768205],"344064":[0.00039260900000000009,0.00040021000000000007],"288":[3.3108000000000002e-07,3.4486000000000003e-07],"1152":[1.23991e-06,1.4632299999999998e-06],"384":[4.3112999999999997e-07,4.3146000000000003e-07],"2304":[2.4700800000000002e-06,2.5683500000000002e-06],"896":[1.01335e-06,1.01411e-06],"480":[5.3063999999999999e-07,5.5685000000000001e-07],"1441792":[0.0017968086000000009,0.0018130048000000003],"992":[1.0727300000000001e-06,1.1180900000000001e-06],"3968":[4.2803899999999999e-06,4.4515800000000002e-06],"6400":[7.0078800000000006e-06,7.5630600000000002e-06],"1344":[1.4356500000000002e-06,1.44435e-06],"126976":[0.000141085,0.00014243700000000001],"2883584":[0.0037202899999999998,0.0037935445],"753664":[0.00085399872727272698,0.00094939300000000009],"16384":[1.8313666666666667e-05,1.898415e-05],"131072":[0.00014746399999999998,0.00015575000000000002],"458752":[0.00050086399999999974,0.00059837415384615385],"172032":[0.00018435700000000006,0.00020089666666666664],"12288":[1.3452080000000001e-05,1.379775e-05],"14680064":[0.019295162999999997,0.040376501500000002],"1536":[1.8003900000000001e-06,1.9413699999999998e-06],"25600":[2.8104789999999998e-05,2.9867000000000001e-05],"1835008":[0.0022519422500000001,0.00229761625],"10752":[1.185712e-05,1.254567e-05],"21504":[2.368528e-05,2.4973e-05],"7602176":[0.0095034980000000026,0.0098935989999999994],"5632":[6.0749299999999996e-06,6.6587899999999998e-06],"10":[3.4109999999999999e-08,3.4120000000000004e-08],"3145728":[0.0040773724999999999,0.0041494699999999989],"245760":[0.00027768000000000004,0.00028473952941176475],"1728":[1.8464299999999998e-06,2.17956e-06],"11":[3.5650000000000005e-08,3.5679999999999999e-08],"1114112":[0.00127447,0.0014236429999999994],"12":[3.6559999999999998e-08,3.6569999999999996e-08],"7340032":[0.0097167360000000001,0.010240835],"7168":[7.6979999999999998e-06,8.0710999999999997e-06],"13":[3.7890000000000004e-08,3.7900000000000002e-08],"6029312":[0.0079486540000000012,0.0081576910000000016],"14":[3.934e-08,3.941e-08],"3200":[3.4326299999999999e-06,3.7374899999999999e-06],"20":[4.545e-08,4.758e-08],"204800":[0.00022917200000000001,0.00023219400000000002],"15":[4.0989999999999998e-08,4.1069999999999997e-08],"13312":[1.469393e-05,1.475837e-05],"4980736":[0.0065435720000000001,0.0067600209999999997],"118784":[0.00013514321917808221,0.00015336822413793106],"51200":[5.6993999999999997e-05,5.8998e-05],"16":[4.1450000000000004e-08,4.381e-08],"21":[4.6369999999999998e-08,4.8810000000000005e-08],"917504":[0.0010309937500000001,0.001151016625],"22":[4.765e-08,4.9880000000000001e-08],"4864":[5.2226666666666666e-06,5.4880599999999998e-06],"17":[4.2640000000000003e-08,4.4719999999999999e-08],"14848":[1.5733e-05,1.5826999999999999e-05],"23":[4.8970000000000001e-08,5.1270000000000002e-08],"786432":[0.00088015700000000001,0.00092145400000000004],"18":[4.3630000000000001e-08,4.5669999999999998e-08],"1638400":[0.0020302592499999994,0.0020348390000000001],"7864320":[0.0105822295,0.010637789999999998],"24":[4.9869999999999996e-08,5.2180000000000001e-08],"14155776":[0.018360335999999998,0.019310344],"19":[4.4560000000000003e-08,4.6689999999999997e-08],"30":[5.6710000000000003e-08,5.7009999999999999e-08],"25":[5.0810000000000003e-08,5.32e-08],"31":[5.7080000000000006e-08,5.7540000000000004e-08],"1280":[1.3730400000000001e-06,1.5043000000000001e-06],"26":[5.1699999999999993e-08,5.1699999999999993e-08],"3932160":[0.0050870070000000002,0.0051991560000000008],"2432":[2.6036599999999999e-06,2.7127299999999999e-06],"32":[5.8340000000000005e-08,5.8500000000000001e-08],"27":[5.3120000000000002e-08,5.6679999999999995e-08],"409600":[0.00046386950000000001,0.00047377115]}},{"title":"OrderedSet unsuccessful contains","results":{"28":[4.9714999999999998e-07,5.0158000000000007e-07],"34":[7.3064000000000009e-07,7.5883000000000003e-07],"29":[5.1852999999999997e-07,5.6120999999999998e-07],"40":[9.5147000000000004e-07,1.2654100000000001e-06],"17408":[0.00062329099999999999,0.00066256500000000016],"1472":[7.2713009999999994e-05,8.5471187500000005e-05],"112":[2.1432300000000001e-06,2.2782100000000003e-06],"1376256":[0.21061598399999998,0.32233059549999998],"5242880":[1.2256991319999999,1.2386061850000001],"36":[7.9256e-07,8.3531999999999999e-07],"42":[1.0331699999999999e-06,1.2576623376623377e-06],"11534336":[3.5024289209999999,3.5246403669999999],"114688":[0.0042691229999999997,0.0045428720000000016],"144":[3.1965900000000002e-06,3.6536400000000003e-06],"38":[8.7548e-07,1.2958899999999999e-06],"240":[4.9017299999999996e-06,5.3153800000000003e-06],"9216":[0.00034930999999999981,0.00039079665217391297],"44":[1.1980199999999999e-06,1.37448e-06],"1664":[4.0123526315789476e-05,4.1925999999999998e-05],"196608":[0.0188926635,0.019974284500000002],"155648":[0.0085242760000000008,0.008528173],"2816":[0.00012119,0.00014606212499999999],"50":[9.2281000000000004e-07,9.7242999999999998e-07],"2359296":[0.38547391650000001,0.39250241800000002],"46":[1.28019e-06,1.82185e-06],"176":[5.1865199999999999e-06,5.8323099999999999e-06],"52":[1.05572e-06,1.09465e-06],"272":[6.0360700000000001e-06,6.3641999999999991e-06],"116":[2.1649499999999999e-06,2.23335e-06],"47104":[0.0026094406666666669,0.0026816896666666664],"6912":[0.00020426899999999998,0.00023050300000000001],"1856":[5.1086140000000001e-05,5.5871766233766229e-05],"48":[1.4985700000000002e-06,3.87892e-06],"2097152":[0.27872567250000002,0.295955943],"54":[1.1564400000000001e-06,1.1977800000000001e-06],"2031616":[0.25553890099999998,0.27942899399999999],"43008":[0.001958834,0.0020035249999999999],"60":[1.2242099999999999e-06,1.35026e-06],"30720":[0.0010009717777777775,0.0010602789999999999],"56":[1.0650900000000001e-06,1.2136700000000001e-06],"62":[1.1596300000000001e-06,1.3329199999999999e-06],"58":[1.12588e-06,1.3115399999999999e-06],"3014656":[0.88682387950000008,0.95387238799999996],"64":[1.3392100000000001e-06,1.3548200000000001e-06],"8388608":[1.5269141835,1.5426666959999999],"29696":[0.00092344600000000029,0.00095145049999999958],"216":[4.2938899999999998e-06,4.8999099999999993e-06],"106496":[0.0037264645000000007,0.0038825374999999994],"72":[1.65799e-06,2.05622e-06],"442368":[0.020959887999999999,0.025122730999999999],"147456":[0.0075060920000000007,0.0076639999999999998],"4456448":[0.79667335800000005,0.81738011700000002],"63488":[0.0023248259999999999,0.0024704767499999997],"38912":[0.001615593,0.001708542],"68":[1.46184e-06,1.6637400000000001e-06],"188416":[0.015438831,0.016364030000000009],"248":[5.3606200000000005e-06,6.0633e-06],"80":[2.2597900000000001e-06,2.5576599999999998e-06],"2560":[0.00010614879120879122,0.00011183426136363635],"34816":[0.001235007,0.0012613730000000001],"3712":[0.00010810653488372093,0.000119813],"3538944":[0.50965866650000002,0.52394836],"76":[1.9753200000000001e-06,2.14639e-06],"4194304":[0.69263149950000003,0.70150164399999992],"851968":[0.06466095199999998,0.098034226000000016],"4096":[0.00013098300000000002,0.00014244082857142862],"59392":[0.002029819,0.0020898437499999997],"84":[2.6296099999999996e-06,2.9028099999999998e-06],"3276800":[0.44364213499999999,0.45556897000000002],"55296":[0.001782573,0.0017923088000000001],"688128":[0.059058289,0.092205704999999999],"8192":[0.00027749999999999997,0.00029524199999999998],"10240":[0.00041662300000000008,0.00044948266666666666],"15872":[0.00053282161111111131,0.00059510300000000015],"92":[3.40322e-06,3.8566000000000005e-06],"26624":[0.00076593616666666673,0.00080097499999999999],"1792":[4.8327369999999999e-05,5.1153999999999998e-05],"11776":[0.00067144399999999999,0.00071106423076923095],"2944":[0.00016802538181818176,0.00017321068421052629],"88":[3.1002399999999998e-06,3.8322399999999998e-06],"22528":[0.0011503939999999997,0.0012227816250000001],"1245184":[0.151777418,0.22819261399999999],"15728640":[2.9284354879999999,2.9737898829999998],"96":[3.45431e-06,4.0444199999999995e-06],"1984":[5.8787230000000001e-05,6.1771000000000002e-05],"139264":[0.0067044850000000013,0.0067505300000000002],"475136":[0.025723187500000001,0.031553958999999999],"13631488":[2.2300365850000001,2.2742975379999999],"416":[8.8355599999999995e-06,8.8388900000000003e-06],"928":[2.313575e-05,2.3175952380952382e-05],"512":[1.2662820000000002e-05,1.302023e-05],"18432":[0.00070475600000000018,0.00073700600000000001],"16777216":[3.2555169240000001],"9728":[0.0003670180000000001,0.00042952663636363638],"1769472":[0.20398014449999999,0.21849714650000002],"1703936":[0.19346040349999999,0.22513769249999999],"2048":[6.3581899999999995e-05,6.5025910000000004e-05],"14336":[0.00042595799999999999,0.00045047980952380953],"448":[9.5000000000000005e-06,1.006101e-05],"5505024":[1.3967352445000001,1.459530722],"544":[1.483556e-05,1.490189e-05],"221184":[0.0093511139999999989,0.010209044],"90112":[0.0051933680000000003,0.0053257870000000002],"640":[2.166258e-05,2.2414510000000001e-05],"12800":[0.00034290300000000003,0.00036718500000000002],"262144":[0.013290936,0.013750159],"589824":[0.037230072000000003,0.055474324500000005],"884736":[0.068744839000000016,0.103565215],"6144":[0.00040717541666666668,0.00043311100000000002],"1088":[3.3730918604651164e-05,3.4644519999999998e-05],"576":[1.604031e-05,1.6491929999999999e-05],"160":[4.2387499999999999e-06,4.8528700000000002e-06],"672":[2.3981999999999998e-05,2.607481e-05],"8912896":[1.7296087959999999,1.8660181760000001],"100":[1.83098e-06,1.86113e-06],"507904":[0.027067030999999998,0.040362661000000001],"3840":[0.00011657449999999999,0.0001179198],"192":[8.1315952380952388e-06,8.6943199999999988e-06],"376832":[0.035394213999999986,0.035563182999999998],"98304":[0.0074122790000000008,0.0077941349999999989],"5376":[0.00024588499999999999,0.00025710342105263152],"94208":[0.0061436679999999997,0.0062913559999999997],"81920":[0.0039320664999999994,0.0042355464999999995],"3407872":[0.47662389000000005,0.483921245],"104":[1.8991400000000002e-06,2.20848e-06],"122880":[0.0050872830000000015,0.0051511890000000005],"200":[3.87892e-06,3.9112300000000003e-06],"163840":[0.0099071180000000012,0.010118491],"4063232":[0.65053031500000003,0.67062193149999993],"5767168":[1.6656613920000001,1.6897791325],"12582912":[5.0671547260000001,10.694950104],"1600":[3.7871350000000001e-05,3.8764499999999998e-05],"136":[2.9271700000000001e-06,3.3726300000000001e-06],"232":[4.7730599999999998e-06,5.0877500000000005e-06],"7077888":[1.126499199,1.195347006],"86016":[0.0045204430000000007,0.0045660369999999994],"31744":[0.001016484,0.0010928946666666664],"168":[5.1352222222222224e-06,8.9585900000000002e-06],"622592":[0.042839024000000003,0.06570459599999999],"108":[2.0597399999999998e-06,2.11357e-06],"327680":[0.021975609,0.022998306],"2176":[6.6184000000000002e-05,7.3787000000000004e-05],"3328":[9.3722590000000009e-05,9.7180578947368414e-05],"1":[1.845e-08,1.9429999999999999e-08],"2":[3.2689999999999997e-08,3.4230000000000003e-08],"3":[5.1819999999999997e-08,5.1860000000000002e-08],"4":[6.2410000000000001e-08,6.6640000000000006e-08],"7424":[0.00024189049999999998,0.00024270199999999997],"5":[7.8380000000000004e-08,8.1569999999999995e-08],"23552":[0.001378085,0.0014069188571428572],"6":[9.6520000000000007e-08,1.0125999999999999e-07],"61440":[0.0022587950000000001,0.0022607510000000001],"491520":[0.025422224,0.037860129000000006],"77824":[0.0034584570000000003,0.0035175525000000008],"7":[1.1117999999999999e-07,1.2464999999999999e-07],"8":[1.2204999999999998e-07,1.5013999999999999e-07],"208":[4.0939599999999998e-06,4.35694e-06],"9":[1.4996e-07,1.7926999999999999e-07],"73728":[0.0031403659999999995,0.0034521065000000005],"304":[8.1767099999999998e-06,9.280510000000001e-06],"400":[7.7848299999999991e-06,8.7272800000000006e-06],"1310720":[0.1744908235,0.2444450635],"336":[1.091379e-05,1.4005359374999999e-05],"3670016":[0.53611462450000003,0.55869997199999999],"6656":[0.000183017,0.00020393008888888891],"15360":[0.000537314,0.00054558023529411779],"432":[9.18765e-06,9.4024e-06],"950272":[0.0717919115,0.10666418],"655360":[0.051199037000000003,0.079608056999999996],"69632":[0.0028464493333333332,0.002850694333333334],"11264":[0.00059619100000000004,0.00063646099999999973],"2752512":[0.59395041699999995,0.64245374550000001],"8126464":[1.4499417130000001,1.4667992965000001],"27648":[0.00081608418181818194,0.00084919527272727291],"368":[1.6777581081081082e-05,1.7159999999999998e-05],"65536":[0.0023601049999999999,0.0024817946666666666],"16252928":[3.1265838509999999,3.168823927],"464":[1.019488e-05,1.0601000000000001e-05],"1015808":[0.087369750500000024,0.12807055000000001],"3072":[0.000183788,0.00021141613953488367],"110592":[0.0042218800000000008,0.0043204359999999987],"237568":[0.011020425,0.0117075115],"278528":[0.014855807,0.015246688999999997],"496":[1.1327e-05,1.2556769999999999e-05],"13107200":[2.076658739,2.131756362],"9961472":[2.2755986570000002,2.3496868700000002],"5888":[0.00031578800000000006,0.00033024313793103441],"11010048":[2.9820555230000001,3.0636942624999999],"1920":[5.5087000000000003e-05,5.5268e-05],"2490368":[0.43932934699999998,0.48692306750000003],"19456":[0.00079943399999999991,0.00083945199999999986],"57344":[0.0019164577999999997,0.0019981675000000005],"1179648":[0.126527534,0.19600731999999998],"4718592":[0.91453646150000001,0.93782295650000003],"360448":[0.029298477,0.029610531000000002],"1572864":[0.3780897735,0.45400579600000002],"53248":[0.0016810388,0.0017503059999999997],"3456":[0.000100671,0.00010207232558139539],"40960":[0.0017770092,0.001798759],"4608":[0.00016469599999999993,0.00017521765454545454],"13824":[0.00043352199999999988,0.00043731800000000002],"819200":[0.0543594835,0.0883964785],"983040":[0.079286640999999991,0.11769888449999999],"8704":[0.00031363239999999991,0.00032706876666666664],"120":[2.5138899999999999e-06,2.6697999999999998e-06],"1024":[2.7163000000000001e-05,2.9202135135135137e-05],"49152":[0.0031539100000000002,0.003175556],"524288":[0.029920251500000005,0.048032317499999984],"45056":[0.0023087032499999999,0.0026468250000000007],"229376":[0.0099920355000000013,0.010896332],"2688":[0.0001216535,0.00012273736708860757],"152":[3.7463200000000002e-06,4.4603600000000003e-06],"5120":[0.00020597599999999999,0.00021798577777777775],"1507328":[0.29802316200000001,0.41075889999999998],"1216":[3.9790999999999999e-05,4.8685749999999997e-05],"1966080":[0.24606445800000001,0.26111831349999998],"1900544":[0.24262041099999998,0.26426279750000004],"184":[6.4331200000000008e-06,7.8448199999999995e-06],"7936":[0.00027413099999999994,0.00027419400000000007],"3801088":[0.58218554099999997,0.58340707000000003],"6815744":[1.072698073,1.1146051809999999],"124":[2.4883499999999996e-06,2.9481428571428569e-06],"102400":[0.0035722014999999994,0.0035854759999999998],"311296":[0.019728499,0.019984063],"1408":[6.2754571428571429e-05,8.401255555555556e-05],"393216":[0.042659905499999998,0.044139614000000001],"4352":[0.00015008203174603178,0.00015547853225806452],"6553600":[0.99431215100000003,1.0573262830000001],"20480":[0.00093023199999999991,0.00094784959999999994],"608":[2.0011939759036142e-05,2.0201659999999997e-05],"2228224":[0.33704468399999998,0.34360084200000002],"36864":[0.001345288,0.0016367245000000002],"704":[2.792963e-05,3.1543650000000004e-05],"720896":[0.070234876500000001,0.093706273000000034],"800":[1.79733e-05,1.830386e-05],"2621440":[0.51890360700000004,0.55602899800000005],"425984":[0.020261404,0.022814247000000003],"32768":[0.0011178288749999997,0.0011450310000000001],"12058624":[4.0800757455000003,4.2494254290000004],"128":[2.87414e-06,3.0808000000000002e-06],"180224":[0.013007988,0.0138729165],"224":[4.4070100000000002e-06,4.7951111111111115e-06],"736":[3.2942589999999998e-05,3.5901219999999996e-05],"320":[1.0030370000000001e-05,1.0125999999999999e-05],"557056":[0.037980223,0.042102194999999995],"832":[1.901601e-05,1.9376429999999998e-05],"9437184":[2.0262330789999998,2.0942752379999998],"3584":[0.000105802,0.0001081446],"6291456":[2.4478633150000002,2.5514697220000002],"256":[5.4649300000000004e-06,5.9731499999999997e-06],"15204352":[2.7679078530000001,2.803038822],"28672":[0.00090167081818181801,0.00093288880000000005],"768":[3.9863440000000005e-05,4.1421999999999997e-05],"212992":[0.0087731179999999999,0.0089286390000000004],"864":[2.0424940000000001e-05,2.0480753424657536e-05],"352":[1.1595e-05,1.2808640000000001e-05],"253952":[0.012211639,0.012917228500000003],"960":[2.620582e-05,2.699435e-05],"24576":[0.0015359729999999999,0.0017588876],"7680":[0.000246288,0.00025475608333333326],"294912":[0.016831555999999998,0.017267227],"1048576":[0.094394485,0.13564118050000001],"10485760":[2.561806598,2.580152617],"344064":[0.0248920085,0.025822362999999994],"288":[7.0531600000000002e-06,7.54803e-06],"1152":[3.8878999999999998e-05,3.9957060000000001e-05],"384":[1.6533506329113923e-05,1.7564275000000002e-05],"2304":[8.2031499999999995e-05,8.2089999999999995e-05],"896":[2.1420919999999998e-05,2.1437489999999999e-05],"480":[1.114232e-05,1.1383719999999999e-05],"1441792":[0.2529637065,0.34916928749999998],"992":[2.7224080000000001e-05,2.7411079999999998e-05],"3968":[0.00012795800000000001,0.00013324000000000002],"6400":[0.00017796700000000001,0.00018541525],"1344":[5.1434000000000003e-05,5.9735999999999999e-05],"126976":[0.005181387,0.0054494240000000013],"2883584":[0.73301332149999998,0.76872717550000003],"753664":[0.082668964000000025,0.13643446100000001],"16384":[0.00053804099999999984,0.00059299781249999984],"131072":[0.005877185,0.0058916039999999991],"458752":[0.0224717535,0.039902542999999992],"172032":[0.011532088999999999,0.0118517555],"12288":[0.00079466258333333348,0.00087834500000000021],"14680064":[2.541002073,4.8582597634999996],"1536":[8.8640299999999999e-05,9.6455473684210519e-05],"25600":[0.00069603000000000004,0.000762077],"1835008":[0.2162353135,0.2260993315],"10752":[0.00050460589473684211,0.00052735616666666678],"21504":[0.0010103429999999999,0.0010899079999999999],"7602176":[1.230446304,1.2658934335000001],"5632":[0.00026895599999999999,0.00029260000000000001],"10":[1.6762999999999997e-07,1.9224999999999999e-07],"3145728":[1.0649124910000001,1.125725971],"245760":[0.011550342,0.012707402],"1728":[4.4582049999999998e-05,5.0654130000000002e-05],"11":[2.1832000000000001e-07,2.223e-07],"1114112":[0.11275222999999999,0.17487933100000003],"12":[2.0253999999999999e-07,2.4938000000000003e-07],"7340032":[1.222472201,1.2615954490000001],"7168":[0.0002181908888888889,0.00022687099999999996],"13":[2.2924000000000001e-07,2.3739999999999999e-07],"6029312":[2.0109299840000001,2.0210218150000001],"14":[2.9887000000000003e-07,3.0966999999999999e-07],"3200":[8.8690999999999995e-05,9.1255999999999995e-05],"20":[4.0324999999999996e-07,6.1297000000000002e-07],"204800":[0.0082457730000000014,0.0083355350000000016],"15":[2.8602000000000002e-07,2.9756000000000003e-07],"13312":[0.00038651200000000004,0.00039792240909090909],"4980736":[1.070498752,1.0957864829999999],"118784":[0.0045565444999999998,0.0050185520000000016],"51200":[0.0015613351666666664,0.001667078],"16":[3.4663999999999999e-07,3.6727999999999999e-07],"21":[4.8996000000000003e-07,5.7021999999999998e-07],"917504":[0.069053844999999989,0.11617572299999999],"22":[5.3651000000000003e-07,7.5848e-07],"4864":[0.00018886900000000001,0.00019883133333333338],"17":[3.3395e-07,4.0024999999999995e-07],"14848":[0.00044382800000000012,0.00047597070000000001],"23":[6.2730000000000001e-07,1.0557699999999999e-06],"786432":[0.10167567,0.13394743849999999],"18":[3.2502000000000003e-07,4.7121e-07],"1638400":[0.181185401,0.19098931399999999],"7864320":[1.3711580219999999,1.3795824249999999],"24":[6.5868000000000002e-07,7.2544000000000002e-07],"14155776":[2.3873721379999999,2.4054037180000001],"19":[3.7658e-07,4.1346e-07],"30":[5.8504000000000006e-07,7.695e-07],"25":[4.4545000000000001e-07,4.9317000000000001e-07],"31":[6.1556000000000004e-07,6.9697999999999993e-07],"1280":[4.7095999999999998e-05,4.7306950000000003e-05],"26":[4.5785000000000004e-07,4.6426e-07],"3932160":[0.61479930350000001,0.66319614999999998],"2432":[9.4760249999999998e-05,0.000104855875],"32":[6.3252999999999996e-07,6.7199000000000002e-07],"27":[4.7609999999999998e-07,5.7456000000000003e-07],"409600":[0.017755464000000002,0.019518392499999999]}},{"title":"OrderedSet random swaps","results":{"28":[1.2219999999999999e-06,1.3e-06],"34":[1.635e-06,1.6980000000000001e-06],"29":[1.28e-06,1.283e-06],"40":[1.81e-06,2.0600000000000002e-06],"17408":[0.00097519699999999991,0.0010426809999999999],"1472":[9.3048999999999996e-05,9.6260000000000003e-05],"112":[5.3329999999999996e-06,5.4419999999999997e-06],"1376256":[0.19280140700000001,0.266391814],"5242880":[1.185692615,1.199762566],"36":[1.77e-06,1.8020000000000001e-06],"42":[2.092e-06,2.3149999999999999e-06],"11534336":[2.8248252140000001,2.829428643],"114688":[0.007786061999999999,0.0078714269999999985],"144":[6.9759999999999998e-06,7.542e-06],"38":[1.883e-06,2.0250000000000001e-06],"240":[1.0662999999999999e-05,1.1905e-05],"9216":[0.00055656300000000004,0.00061061199999999996],"44":[1.9870000000000002e-06,2.3460000000000001e-06],"1664":[8.3708999999999994e-05,8.4618999999999997e-05],"196608":[0.016889507000000005,0.020539023],"155648":[0.012128221,0.012196558],"2816":[0.00017185399999999998,0.00018344500000000002],"50":[2.2670000000000001e-06,2.576e-06],"2359296":[0.42583453199999999,0.42751688100000002],"46":[2.1670000000000002e-06,2.2290000000000002e-06],"176":[9.4380000000000001e-06,9.7389999999999994e-06],"52":[2.3020000000000002e-06,2.323e-06],"272":[1.3403e-05,1.5174000000000001e-05],"116":[5.6160000000000001e-06,5.6380000000000001e-06],"47104":[0.0030946709999999994,0.003247509],"6912":[0.00034774600000000001,0.00041173999999999985],"1856":[9.6781999999999996e-05,0.000106031],"48":[2.3989999999999998e-06,2.5730000000000002e-06],"2097152":[0.35593623299999999,0.37233775199999997],"54":[2.4600000000000002e-06,2.5000000000000002e-06],"2031616":[0.33765336099999999,0.355650723],"43008":[0.0026797650000000006,0.0027899490000000008],"60":[2.8040000000000002e-06,2.8959999999999999e-06],"30720":[0.0016801260000000001,0.0016909730000000001],"56":[2.6390000000000001e-06,2.7269999999999999e-06],"62":[2.7930000000000002e-06,3.2720000000000002e-06],"58":[2.481e-06,2.8049999999999998e-06],"3014656":[0.59314074400000005,0.66445908200000003],"64":[3.0910000000000001e-06,3.3289999999999998e-06],"8388608":[1.9482676329999999,1.9786478139999999],"29696":[0.001591674,0.001653102],"216":[1.0142999999999999e-05,1.0617e-05],"106496":[0.0069782940000000003,0.0071562630000000004],"72":[3.3500000000000001e-06,3.8659999999999999e-06],"442368":[0.035986035999999999,0.041806686999999995],"147456":[0.010950808999999999,0.011388547000000001],"4456448":[0.93801410299999999,0.98311964299999999],"63488":[0.0038340840000000002,0.0038849599999999998],"38912":[0.0023531939999999999,0.0024296819999999998],"68":[3.2150000000000001e-06,3.5240000000000001e-06],"188416":[0.015635658,0.016450217],"248":[1.2875e-05,1.3560000000000001e-05],"80":[3.8510000000000001e-06,3.873e-06],"2560":[0.00014116699999999999,0.000157288],"34816":[0.001975002,0.0020533679999999999],"3712":[0.00019910199999999999,0.00020080099999999996],"3538944":[0.72803127199999995,0.73743663500000001],"76":[3.3749999999999999e-06,4.8400000000000002e-06],"4194304":[0.87954470600000001,0.91351512899999998],"851968":[0.096822101999999965,0.145947997],"4096":[0.000225851,0.00025400200000000013],"59392":[0.0034047389999999995,0.0035763829999999998],"84":[3.907e-06,4.8359999999999999e-06],"3276800":[0.66308556699999999,0.67425502199999998],"55296":[0.003074776,0.0032089739999999999],"688128":[0.070028833999999998,0.10243804700000003],"8192":[0.00045238800000000002,0.00047901399999999999],"10240":[0.00061546100000000009,0.00066102999999999973],"15872":[0.00087887899999999994,0.00095713100000000017],"92":[4.9799999999999998e-06,5.0930000000000002e-06],"26624":[0.0013899840000000001,0.001436685],"1792":[9.5342999999999998e-05,9.8540000000000002e-05],"11776":[0.00077617300000000001,0.00078292800000000023],"2944":[0.00019244299999999999,0.000193041],"88":[4.5569999999999997e-06,4.8539999999999996e-06],"22528":[0.0014728159999999998,0.0015103009999999999],"1245184":[0.169952833,0.242897326],"15728640":[3.8727374449999998,3.956625469],"96":[4.7160000000000002e-06,5.976e-06],"1984":[0.000100101,0.00010019799999999999],"139264":[0.010289322,0.010428616],"475136":[0.039761425000000003,0.053280335999999998],"13631488":[3.3121014459999998,3.3743054040000002],"416":[1.9283000000000002e-05,2.0149e-05],"928":[4.5958999999999998e-05,4.6193999999999999e-05],"512":[2.6265999999999999e-05,2.9266000000000001e-05],"18432":[0.001090412,0.0011418630000000001],"16777216":[4.2389437560000003],"9728":[0.00059307199999999983,0.0006510960000000001],"1769472":[0.296521853,0.329010582],"1703936":[0.28564400499999998,0.29582218199999999],"2048":[0.000104867,0.000116622],"14336":[0.00077416000000000008,0.00079679899999999994],"448":[2.1895e-05,2.3076000000000001e-05],"5505024":[1.236193361,1.274963866],"544":[2.6699999999999998e-05,3.3000000000000003e-05],"221184":[0.016578306000000001,0.018654275000000005],"90112":[0.0064791190000000002,0.0064805559999999984],"640":[3.6473000000000001e-05,3.6504999999999997e-05],"12800":[0.00064193999999999992,0.00066762799999999997],"262144":[0.020809492999999995,0.021590702999999996],"589824":[0.053415440000000002,0.077353960999999999],"884736":[0.099567858000000023,0.152362845],"6144":[0.00040830399999999996,0.00041555300000000004],"1088":[6.1645999999999999e-05,6.1959999999999996e-05],"576":[3.1374000000000001e-05,3.1600000000000002e-05],"160":[7.9249999999999995e-06,8.1079999999999993e-06],"672":[3.6378999999999998e-05,3.9008000000000003e-05],"8912896":[2.08489529,2.174023697],"100":[4.4959999999999998e-06,5.0069999999999997e-06],"507904":[0.044560257999999991,0.062296746],"3840":[0.00019764199999999999,0.00022219700000000001],"192":[1.116e-05,1.1267000000000001e-05],"376832":[0.034963506000000005,0.038507767000000012],"98304":[0.0074382770000000001,0.0075582730000000016],"5376":[0.00031441200000000002,0.00036231800000000004],"94208":[0.0069047749999999993,0.0071684669999999995],"81920":[0.0054617330000000007,0.0057564630000000007],"3407872":[0.68967539099999997,0.717880505],"104":[4.87e-06,5.006e-06],"122880":[0.0085738559999999995,0.008800024],"200":[9.4930000000000004e-06,1.0155e-05],"163840":[0.012728955,0.012955553],"4063232":[0.85958187499999994,0.86042144899999995],"5767168":[1.3341337179999999,1.3757938329999999],"12582912":[3.146316873,7.1562016049999997],"1600":[8.051e-05,8.3739000000000006e-05],"136":[6.6420000000000001e-06,6.8020000000000003e-06],"232":[1.0814e-05,1.1388e-05],"7077888":[1.598828304,1.7137487820000001],"86016":[0.0059388010000000005,0.0060865859999999997],"31744":[0.0017819839999999999,0.001826558],"168":[7.9929999999999995e-06,1.0495e-05],"622592":[0.058760707999999995,0.08646781499999999],"108":[4.6469999999999997e-06,5.147e-06],"327680":[0.028226973999999998,0.030547416000000004],"2176":[0.000113272,0.000116054],"3328":[0.00016925099999999998,0.000180693],"1":[3.5000000000000002e-08,3.8000000000000003e-08],"2":[3.7e-08,4.1999999999999999e-08],"3":[1.2100000000000001e-07,1.4100000000000001e-07],"4":[1.8300000000000001e-07,1.85e-07],"7424":[0.00038127100000000003,0.00039875199999999988],"5":[2.0200000000000001e-07,2.2399999999999999e-07],"23552":[0.0015578829999999999,0.001696929],"6":[2.6399999999999998e-07,2.8599999999999999e-07],"61440":[0.003621244,0.0038160250000000007],"491520":[0.041200471000000002,0.060287653999999989],"77824":[0.0050370949999999992,0.005248158000000001],"7":[3.0699999999999998e-07,3.1600000000000002e-07],"8":[2.9900000000000002e-07,3.5999999999999999e-07],"208":[9.5300000000000002e-06,1.0355e-05],"9":[3.6199999999999999e-07,3.9900000000000001e-07],"73728":[0.004620753,0.0048324040000000002],"304":[1.5979999999999999e-05,1.9358e-05],"400":[1.897e-05,2.1801999999999999e-05],"1310720":[0.180539013,0.25328372999999998],"336":[1.7720999999999999e-05,2.0217e-05],"3670016":[0.74524929200000001,0.77573728900000005],"6656":[0.00033372100000000004,0.00036355000000000008],"15360":[0.00083548900000000002,0.00089592100000000004],"432":[2.0585999999999999e-05,2.1909999999999999e-05],"950272":[0.111618968,0.149769024],"655360":[0.064621092999999991,0.090726614000000011],"69632":[0.0043734050000000012,0.004396255],"11264":[0.00069515000000000006,0.00082295900000000006],"2752512":[0.52367333500000002,0.52735338700000001],"8126464":[1.8922731339999999,1.8987809],"27648":[0.001455418,0.0015230829999999997],"368":[2.1569999999999998e-05,2.2217000000000001e-05],"65536":[0.0039070170000000005,0.0040407690000000005],"16252928":[4.0003103600000003,4.0142978459999998],"464":[2.4012e-05,2.5772999999999999e-05],"1015808":[0.127307802,0.188144635],"3072":[0.00019625599999999999,0.00020197999999999999],"110592":[0.0074163709999999997,0.0075256359999999996],"237568":[0.018388247999999999,0.020351773],"278528":[0.022460574000000004,0.022772519000000005],"496":[2.5378999999999999e-05,2.6704999999999999e-05],"13107200":[3.1680130320000002,3.2534238489999998],"9961472":[2.4210147989999999,2.533317974],"5888":[0.00036164699999999993,0.00039935400000000004],"11010048":[2.6756854209999998,2.7723625169999999],"1920":[9.9888000000000003e-05,0.000103341],"2490368":[0.45180811300000001,0.47231237999999998],"19456":[0.0011654040000000001,0.001186367],"57344":[0.0033190009999999994,0.003414116],"1179648":[0.15414986899999999,0.218321772],"4718592":[1.011585841,1.0434862359999999],"360448":[0.03238655,0.032637445000000001],"1572864":[0.23720297899999998,0.2796594],"53248":[0.0029828890000000003,0.0031232129999999988],"3456":[0.00017351399999999999,0.00020434399999999997],"40960":[0.002475381,0.002576573999999999],"4608":[0.00025667499999999999,0.000277574],"13824":[0.00077073399999999981,0.00077225999999999987],"819200":[0.095114359999999995,0.133057024],"983040":[0.11872531799999997,0.15692452200000001],"8704":[0.00048413699999999994,0.00049595300000000015],"120":[5.5500000000000002e-06,6.0920000000000003e-06],"1024":[5.0847999999999998e-05,5.2964999999999999e-05],"49152":[0.0033064830000000003,0.0036479959999999997],"524288":[0.046185308000000001,0.064518073999999981],"45056":[0.0029095829999999994,0.0030358120000000006],"229376":[0.017445914,0.018567381000000001],"2688":[0.00016674500000000002,0.00017243900000000003],"152":[7.7829999999999999e-06,8.3610000000000001e-06],"5120":[0.000298363,0.00032142100000000001],"1507328":[0.22826211100000005,0.28952882700000004],"1216":[6.7665999999999999e-05,7.1106999999999995e-05],"1966080":[0.327574647,0.337033625],"1900544":[0.32485391399999997,0.33126654799999999],"184":[1.0199e-05,1.0329000000000001e-05],"7936":[0.000454463,0.00046076099999999996],"3801088":[0.787868181,0.79369689600000004],"6815744":[1.5434024630000001,1.635937237],"124":[6.5710000000000003e-06,7.002e-06],"102400":[0.0065941819999999988,0.0067858469999999994],"311296":[0.026387615,0.028918277999999999],"1408":[8.2706000000000004e-05,8.7511999999999998e-05],"393216":[0.038358653999999992,0.038795199000000002],"4352":[0.000231878,0.00025848400000000007],"6553600":[1.5049755839999999,1.5828849119999999],"20480":[0.0012515619999999999,0.001284781],"608":[3.5849000000000002e-05,3.7567000000000001e-05],"2228224":[0.39568669499999998,0.40151093299999996],"36864":[0.0022262829999999999,0.0023997879999999995],"704":[3.9793999999999999e-05,4.3102000000000002e-05],"720896":[0.074510669000000002,0.09370447699999998],"800":[4.0326e-05,4.1823999999999998e-05],"2621440":[0.48824202799999999,0.52575883099999998],"425984":[0.035022546000000002,0.039111992999999998],"32768":[0.0018352889999999999,0.0019031299999999998],"12058624":[2.9717369520000001,3.0508252709999999],"128":[6.1199999999999999e-06,6.4840000000000001e-06],"180224":[0.014665691999999999,0.015624766999999998],"224":[1.0635999999999999e-05,1.0789e-05],"736":[4.1887000000000001e-05,4.4965000000000001e-05],"320":[1.7450999999999999e-05,1.7547e-05],"557056":[0.049279197999999996,0.06398016099999998],"832":[4.1940000000000002e-05,4.3665000000000003e-05],"9437184":[2.2263818400000002,2.270474632],"3584":[0.00019784700000000005,0.000197923],"6291456":[1.5026665889999999,1.5260703090000001],"256":[1.1603000000000001e-05,1.2916e-05],"15204352":[3.7451874950000001,3.89201971],"28672":[0.001594924,0.0016486579999999997],"768":[4.6910000000000003e-05,5.0937999999999999e-05],"212992":[0.015802673999999999,0.015995733000000005],"864":[4.2553999999999999e-05,4.4666000000000002e-05],"352":[1.9069999999999999e-05,2.2458000000000001e-05],"253952":[0.020031837,0.020642226],"960":[4.7095999999999998e-05,5.3050999999999997e-05],"24576":[0.001676276,0.001762993],"7680":[0.00039686000000000002,0.00043749199999999999],"294912":[0.024817895999999999,0.024930002],"1048576":[0.129483191,0.168643723],"10485760":[2.498487854,2.5780054859999999],"344064":[0.03030097,0.032415989000000006],"288":[1.4810999999999999e-05,1.6966e-05],"1152":[7.2364e-05,7.2447999999999995e-05],"384":[2.2739e-05,2.2942000000000002e-05],"2304":[0.00012897000000000001,0.00013780000000000002],"896":[4.6180000000000002e-05,4.6649e-05],"480":[2.3964999999999998e-05,2.6537e-05],"1441792":[0.206083077,0.29454535500000001],"992":[5.0859000000000002e-05,5.5225000000000001e-05],"3968":[0.00021314900000000007,0.00022731099999999995],"6400":[0.00032989400000000001,0.00033033900000000008],"1344":[7.4957999999999996e-05,8.1334000000000004e-05],"126976":[0.0088366509999999992,0.009114802],"2883584":[0.54663134400000002,0.59825257899999995],"753664":[0.079677069000000045,0.11789820099999999],"16384":[0.00097243199999999996,0.00098245999999999989],"131072":[0.009376151000000001,0.0095862970000000006],"458752":[0.038683009000000004,0.057002362999999945],"172032":[0.013830864999999998,0.014389268],"12288":[0.00079480100000000014,0.00087710099999999992],"14680064":[3.6000683439999999,8.9626485250000005],"1536":[0.000110223,0.000111252],"25600":[0.001363076,0.001381249],"1835008":[0.29689170100000001,0.31290864100000004],"10752":[0.00066769399999999993,0.000692977],"21504":[0.0013420070000000001,0.0014409570000000001],"7602176":[1.6741906690000001,1.7348472500000001],"5632":[0.00034840500000000009,0.00035585199999999998],"10":[4.2899999999999999e-07,4.3599999999999999e-07],"3145728":[0.61704568100000001,0.66807011700000007],"245760":[0.019268239,0.019286889999999998],"1728":[8.2925999999999999e-05,9.8492000000000005e-05],"11":[4.7999999999999996e-07,4.8800000000000003e-07],"1114112":[0.144683322,0.20582971799999999],"12":[5.3399999999999999e-07,5.6000000000000004e-07],"7340032":[1.686185233,1.7843546180000001],"7168":[0.00036382800000000007,0.00036695800000000007],"13":[5.6499999999999999e-07,5.9699999999999996e-07],"6029312":[1.433164361,1.439785619],"14":[6.3300000000000002e-07,6.6199999999999997e-07],"3200":[0.00016099300000000001,0.00018660199999999999],"20":[7.9100000000000003e-07,9.6099999999999999e-07],"204800":[0.015118988999999996,0.015274787],"15":[6.4499999999999997e-07,7.3600000000000003e-07],"13312":[0.00067974100000000009,0.00070337100000000016],"4980736":[1.1059467759999999,1.1075915009999999],"118784":[0.0080171259999999994,0.0086014730000000018],"51200":[0.0027956029999999998,0.002999814],"16":[7.2500000000000005e-07,8.3300000000000001e-07],"21":[9.9399999999999993e-07,1.0860000000000001e-06],"917504":[0.107836507,0.16080945999999999],"22":[9.3500000000000005e-07,1.105e-06],"4864":[0.00029587500000000002,0.00030555299999999997],"17":[6.3399999999999999e-07,8.5700000000000001e-07],"14848":[0.00079292400000000008,0.00080098000000000007],"23":[1.034e-06,1.305e-06],"786432":[0.085160088999999994,0.11580667],"18":[7.5300000000000003e-07,9.5900000000000005e-07],"1638400":[0.269741866,0.275545861],"7864320":[1.816413625,1.8313960030000001],"24":[1.102e-06,1.203e-06],"14155776":[3.4505811940000002,3.560010127],"19":[7.6300000000000004e-07,8.5799999999999998e-07],"30":[1.232e-06,1.367e-06],"25":[1.172e-06,1.251e-06],"31":[1.392e-06,1.497e-06],"1280":[7.2841000000000003e-05,7.6268999999999998e-05],"26":[1.249e-06,1.296e-06],"3932160":[0.81181515999999998,0.85485861699999999],"2432":[0.000146985,0.000160581],"32":[1.2550000000000001e-06,1.435e-06],"27":[1.144e-06,1.505e-06],"409600":[0.032130500999999992,0.035102131000000002]}},{"title":"OrderedSet partitioning around middle","results":{"28":[4.01e-07,4.4799999999999999e-07],"34":[4.8699999999999995e-07,5.51e-07],"29":[4.51e-07,5.44e-07],"40":[5.0800000000000005e-07,5.1900000000000003e-07],"17408":[0.00030152199999999998,0.00030322500000000001],"1472":[2.4890999999999999e-05,2.8119e-05],"112":[1.401e-06,1.4950000000000001e-06],"1376256":[0.037489861999999999,0.045578239999999978],"5242880":[0.226735459,0.23288120999999995],"36":[5.51e-07,6.3600000000000003e-07],"42":[6.3799999999999997e-07,7.5499999999999997e-07],"11534336":[0.54884747299999992,0.56235027999999998],"114688":[0.0020990559999999998,0.0021491470000000001],"144":[1.623e-06,1.781e-06],"38":[4.2899999999999999e-07,6.3499999999999996e-07],"240":[2.6860000000000002e-06,2.898e-06],"9216":[0.00018080199999999998,0.00018410399999999998],"44":[6.2399999999999998e-07,6.7899999999999998e-07],"1664":[2.3558e-05,2.5426999999999999e-05],"196608":[0.0043174040000000012,0.0045905630000000006],"155648":[0.0031288349999999999,0.003731519],"2816":[4.8436999999999997e-05,5.2840000000000002e-05],"50":[6.9599999999999999e-07,8.0500000000000002e-07],"2359296":[0.076368544999999996,0.076874028000000011],"46":[5.8800000000000002e-07,6.2799999999999996e-07],"176":[2.295e-06,2.3240000000000001e-06],"52":[5.0399999999999996e-07,5.2600000000000002e-07],"272":[3.365e-06,4.1060000000000002e-06],"116":[1.3379999999999999e-06,1.531e-06],"47104":[0.00090285199999999999,0.00090751600000000003],"6912":[0.000117633,0.000131543],"1856":[2.9193e-05,3.1027e-05],"48":[6.7299999999999995e-07,6.7599999999999997e-07],"2097152":[0.062919399000000001,0.066741475999999994],"54":[6.7599999999999997e-07,8.1699999999999997e-07],"2031616":[0.059694363,0.064880332000000013],"43008":[0.00079744100000000008,0.00084652300000000007],"60":[7.3200000000000004e-07,8.9999999999999996e-07],"30720":[0.00052259500000000016,0.00053494999999999997],"56":[7.8100000000000002e-07,8.1299999999999999e-07],"62":[7.0200000000000001e-07,9.9999999999999995e-07],"58":[5.2900000000000004e-07,8.1699999999999997e-07],"3014656":[0.109929632,0.133858907],"64":[8.2600000000000001e-07,9.4499999999999995e-07],"8388608":[0.36255958300000002,0.3642282],"29696":[0.00049145300000000009,0.00050727999999999993],"216":[2.5380000000000001e-06,2.689e-06],"106496":[0.001877788,0.001922783],"72":[8.54e-07,1.128e-06],"442368":[0.0090578010000000007,0.009513615999999999],"147456":[0.0028492650000000001,0.0030246600000000002],"4456448":[0.1755178,0.185417779],"63488":[0.001113513,0.001172548],"38912":[0.00068424000000000013,0.00072779300000000002],"68":[8.8800000000000001e-07,9.7300000000000004e-07],"188416":[0.0039876699999999996,0.0042349200000000014],"248":[2.8729999999999999e-06,3.264e-06],"80":[1.004e-06,1.238e-06],"2560":[4.5339000000000001e-05,4.5547999999999998e-05],"34816":[0.000606469,0.000614925],"3712":[5.6767e-05,6.4963999999999997e-05],"3538944":[0.135412597,0.136449397],"76":[9.1800000000000004e-07,1.0380000000000001e-06],"4194304":[0.16550772599999999,0.16807760699999999],"851968":[0.020595201,0.024769308],"4096":[6.8814999999999998e-05,7.8827999999999998e-05],"59392":[0.0010102889999999997,0.0010187310000000002],"84":[1.1060000000000001e-06,1.2410000000000001e-06],"3276800":[0.123145448,0.1245121],"55296":[0.00095083800000000007,0.00097473600000000003],"688128":[0.016371954000000001,0.019304948999999998],"8192":[0.000138152,0.00014878],"10240":[0.000178285,0.00021733700000000001],"15872":[0.00025937699999999998,0.000283441],"92":[1.0759999999999999e-06,1.1769999999999999e-06],"26624":[0.000415089,0.00044635599999999991],"1792":[2.6942000000000001e-05,2.9011000000000001e-05],"11776":[0.00022486700000000004,0.00022664499999999998],"2944":[5.9385999999999997e-05,5.9731999999999997e-05],"88":[1.1969999999999999e-06,1.2869999999999999e-06],"22528":[0.00043308400000000008,0.00045710800000000002],"1245184":[0.032846303,0.04078302000000001],"15728640":[0.69380385599999994,0.71906252599999998],"96":[1.3430000000000001e-06,1.857e-06],"1984":[3.1931000000000003e-05,3.2947000000000002e-05],"139264":[0.002693146,0.0027421340000000007],"475136":[0.0099083090000000006,0.011087189000000001],"13631488":[0.58765178000000007,0.60338901199999995],"416":[4.1659999999999996e-06,4.989e-06],"928":[1.1766000000000001e-05,1.2775000000000001e-05],"512":[6.5509999999999996e-06,7.7470000000000005e-06],"18432":[0.00032867900000000002,0.00033961400000000002],"16777216":[0.75700679299999996],"9728":[0.000169698,0.000183752],"1769472":[0.054033902000000002,0.058510742000000018],"1703936":[0.050826707999999998,0.055712522],"2048":[3.2005999999999998e-05,3.4730999999999997e-05],"14336":[0.00022989700000000001,0.000239731],"448":[5.1590000000000001e-06,6.28e-06],"5505024":[0.236940859,0.25027812999999999],"544":[7.1230000000000002e-06,8.1659999999999994e-06],"221184":[0.0041949489999999999,0.004639181],"90112":[0.0017909,0.001927507],"640":[9.3160000000000003e-06,9.7690000000000008e-06],"12800":[0.00019998600000000001,0.00020649700000000001],"262144":[0.0052369040000000014,0.0054364290000000004],"589824":[0.013140848,0.015311198],"884736":[0.021315167000000003,0.027631759999999995],"6144":[0.00011592300000000001,0.00012447700000000003],"1088":[1.7068e-05,1.7580000000000001e-05],"576":[7.9899999999999997e-06,8.5839999999999995e-06],"160":[2.0449999999999999e-06,2.1660000000000001e-06],"672":[9.5840000000000001e-06,1.0227000000000001e-05],"8912896":[0.39695868400000001,0.40262050400000005],"100":[1.1969999999999999e-06,1.4100000000000001e-06],"507904":[0.010822990999999997,0.012712661],"3840":[6.3657000000000004e-05,6.7148000000000002e-05],"192":[2.4109999999999999e-06,2.5739999999999998e-06],"376832":[0.008729667,0.0091210980000000028],"98304":[0.0020875289999999999,0.00211831],"5376":[9.3580999999999997e-05,0.00010652],"94208":[0.0019162110000000003,0.0019185070000000005],"81920":[0.0015525229999999997,0.001658168],"3407872":[0.13025431000000001,0.130361062],"104":[1.3689999999999999e-06,1.372e-06],"122880":[0.0022681250000000002,0.002358944],"200":[2.1550000000000001e-06,2.2749999999999998e-06],"163840":[0.0032638719999999997,0.0034104250000000003],"4063232":[0.15776236599999999,0.16383441700000001],"5767168":[0.25856048700000001,0.26261178200000002],"12582912":[0.62505949500000002,1.2424560229999999],"1600":[2.3085999999999999e-05,2.3149000000000001e-05],"136":[1.6559999999999999e-06,1.823e-06],"232":[2.3580000000000001e-06,2.605e-06],"7077888":[0.29606545200000001,0.31735541700000003],"86016":[0.001682357,0.0017089989999999997],"31744":[0.00052370599999999987,0.00055862700000000002],"168":[1.6869999999999999e-06,2.2220000000000001e-06],"622592":[0.014217221,0.016774868999999998],"108":[1.221e-06,1.5570000000000001e-06],"327680":[0.007071408999999999,0.0073382069999999994],"2176":[3.5370999999999997e-05,3.5756999999999997e-05],"3328":[4.8893000000000001e-05,6.2241000000000003e-05],"1":[1.1000000000000001e-07,1.1600000000000001e-07],"2":[1.11e-07,1.1600000000000001e-07],"3":[1.3300000000000001e-07,2.0100000000000001e-07],"4":[1.6299999999999999e-07,1.8099999999999999e-07],"7424":[0.000121334,0.00012787200000000001],"5":[1.43e-07,1.5699999999999999e-07],"23552":[0.00044321400000000004,0.00048998499999999996],"6":[1.8799999999999999e-07,1.99e-07],"61440":[0.0010977560000000001,0.001112949],"491520":[0.010212842,0.011390094],"77824":[0.001513293,0.001532619],"7":[1.9299999999999999e-07,2.34e-07],"8":[1.8699999999999999e-07,1.97e-07],"208":[2.0650000000000001e-06,2.5440000000000001e-06],"9":[1.5099999999999999e-07,2.3999999999999998e-07],"73728":[0.0013907400000000001,0.0014068799999999997],"304":[3.8700000000000002e-06,4.7129999999999996e-06],"400":[4.3800000000000004e-06,5.2410000000000003e-06],"1310720":[0.035559871,0.044792167000000008],"336":[4.1659999999999996e-06,4.9019999999999998e-06],"3670016":[0.138573852,0.144084772],"6656":[0.00010126,0.000103138],"15360":[0.00025361099999999999,0.00026194599999999999],"432":[5.665e-06,5.75e-06],"950272":[0.022783465999999999,0.027412148000000025],"655360":[0.015265889999999999,0.017965737999999995],"69632":[0.00127035,0.00127045],"11264":[0.00022367,0.00025383599999999996],"2752512":[0.093456330999999976,0.093707386999999989],"8126464":[0.35276954100000002,0.35284007499999998],"27648":[0.00043306400000000009,0.00047217400000000001],"368":[4.6759999999999998e-06,5.6080000000000003e-06],"65536":[0.0011429470000000001,0.001160936],"16252928":[0.72268585299999999,0.73741041900000004],"464":[5.8429999999999998e-06,6.8859999999999998e-06],"1015808":[0.025549090999999996,0.03205363700000001],"3072":[5.5949000000000003e-05,5.9162e-05],"110592":[0.0019404170000000003,0.0020092260000000002],"237568":[0.0046455429999999994,0.00485076],"278528":[0.005721121,0.0068157930000000005],"496":[6.3829999999999997e-06,6.5910000000000001e-06],"13107200":[0.55678092699999993,0.57845111900000001],"9961472":[0.47034905399999999,0.49224957200000002],"5888":[0.000110152,0.000121373],"11010048":[0.51812835199999996,0.54482705099999995],"1920":[2.7988999999999999e-05,2.8881e-05],"2490368":[0.083679847000000002,0.090876564000000007],"19456":[0.00033793099999999992,0.0003609930000000001],"57344":[0.00097901199999999981,0.001023393],"1179648":[0.031628581000000017,0.038876767999999999],"4718592":[0.192195741,0.19269998199999999],"360448":[0.0080315350000000028,0.0080959649999999984],"1572864":[0.044839319000000002,0.047377034999999998],"53248":[0.00086801500000000008,0.00094714699999999996],"3456":[5.4750999999999998e-05,5.7059999999999999e-05],"40960":[0.0007371229999999999,0.00074444099999999998],"4608":[7.9516000000000002e-05,8.0749999999999998e-05],"13824":[0.00022845400000000003,0.000240406],"819200":[0.019730346000000003,0.023859182],"983040":[0.024289082,0.028380667999999998],"8704":[0.00014433,0.00014672399999999999],"120":[1.375e-06,1.6139999999999999e-06],"1024":[1.4749999999999999e-05,1.5421e-05],"49152":[0.000975519,0.0010331700000000004],"524288":[0.011294452999999999,0.013161203],"45056":[0.000855071,0.00094937200000000008],"229376":[0.0044236849999999984,0.0046936979999999996],"2688":[4.9076999999999998e-05,5.1955e-05],"152":[1.8479999999999999e-06,2.2189999999999998e-06],"5120":[9.1734e-05,0.000108218],"1507328":[0.042088972999999995,0.054587869999999997],"1216":[1.7802999999999999e-05,2.0805000000000002e-05],"1966080":[0.058496164999999975,0.061630713999999996],"1900544":[0.059334970000000001,0.062216476],"184":[2.5909999999999998e-06,2.6869999999999999e-06],"7936":[0.000132426,0.000140309],"3801088":[0.14445733999999999,0.14670899500000001],"6815744":[0.28094256499999998,0.30150777200000001],"124":[1.4959999999999999e-06,1.5269999999999999e-06],"102400":[0.001778246,0.001789892],"311296":[0.0065948279999999996,0.0068065480000000008],"1408":[2.4009999999999999e-05,2.4436000000000001e-05],"393216":[0.0092310410000000006,0.0094693549999999987],"4352":[7.2432e-05,7.8469999999999999e-05],"6553600":[0.27110859700000001,0.29175934199999998],"20480":[0.00036347100000000003,0.00038389400000000002],"608":[9.465e-06,1.0414999999999999e-05],"2228224":[0.06979703499999998,0.071075738999999999],"36864":[0.00067884800000000012,0.00068137799999999963],"704":[1.0757000000000001e-05,1.0934000000000001e-05],"720896":[0.017448655,0.018971357000000001],"800":[1.0054000000000001e-05,1.0947999999999999e-05],"2621440":[0.086713723999999992,0.08901853400000001],"425984":[0.0087248029999999997,0.0092055809999999974],"32768":[0.00053232400000000003,0.00058286099999999973],"12058624":[0.58885395000000007,0.615080772],"128":[1.3540000000000001e-06,1.699e-06],"180224":[0.0038374990000000012,0.0038956209999999997],"224":[2.5600000000000001e-06,2.6800000000000002e-06],"736":[1.1093e-05,1.1372000000000001e-05],"320":[3.9899999999999999e-06,4.4000000000000002e-06],"557056":[0.012193233,0.013481387000000003],"832":[1.1165999999999999e-05,1.1549000000000001e-05],"9437184":[0.42708377199999997,0.43302349600000001],"3584":[5.7957000000000001e-05,6.1381000000000001e-05],"6291456":[0.29637151699999997,0.32639639300000001],"256":[2.6539999999999999e-06,3.162e-06],"15204352":[0.67744332800000007,0.69663565100000002],"28672":[0.00048179199999999998,0.00049475699999999997],"768":[1.314e-05,1.3603e-05],"212992":[0.0040684220000000004,0.0040963520000000002],"864":[1.0725e-05,1.2129e-05],"352":[4.8119999999999998e-06,5.8499999999999999e-06],"253952":[0.0050123160000000002,0.0051870270000000012],"960":[1.3012e-05,1.4028e-05],"24576":[0.00049432600000000001,0.00053255700000000002],"7680":[0.000125833,0.00013599100000000002],"294912":[0.006283686000000001,0.0062945369999999985],"1048576":[0.026365803,0.031723815000000002],"10485760":[0.47949306899999999,0.492295076],"344064":[0.0075523700000000001,0.0078563360000000002],"288":[3.3189999999999999e-06,3.7400000000000002e-06],"1152":[1.9678e-05,2.0492e-05],"384":[6.0120000000000002e-06,6.1319999999999999e-06],"2304":[3.7166999999999998e-05,3.9685999999999999e-05],"896":[1.1975e-05,1.2785e-05],"480":[6.5560000000000004e-06,6.6089999999999997e-06],"1441792":[0.040642914000000002,0.052269334000000001],"992":[1.4769999999999999e-05,1.5167999999999999e-05],"3968":[6.1532000000000007e-05,7.0259999999999995e-05],"6400":[0.00010925399999999999,0.000116229],"1344":[2.2575e-05,2.3176e-05],"126976":[0.0023218710000000005,0.0023662739999999998],"2883584":[0.097873828000000024,0.10622556900000001],"753664":[0.018782594999999999,0.022011277999999995],"16384":[0.000294111,0.00030213699999999996],"131072":[0.0025237710000000002,0.002542707],"458752":[0.0094633239999999987,0.011485179999999999],"172032":[0.003478507,0.003645625],"12288":[0.00024072699999999999,0.00026551400000000001],"14680064":[0.63284654699999998,1.6396659929999999],"1536":[2.8413999999999999e-05,2.8688999999999999e-05],"25600":[0.00041699500000000003,0.000419403],"1835008":[0.053255701999999995,0.055873317000000013],"10752":[0.000192022,0.00021429000000000001],"21504":[0.00042734100000000003,0.000431643],"7602176":[0.31095609000000002,0.31761133799999997],"5632":[0.00010265899999999998,0.000112965],"10":[2.3699999999999999e-07,2.7799999999999997e-07],"3145728":[0.110330066,0.124685412],"245760":[0.0049058330000000001,0.0050455919999999859],"1728":[2.3325000000000001e-05,3.0626000000000001e-05],"11":[2.2700000000000001e-07,2.6399999999999998e-07],"1114112":[0.028557760999999966,0.036127534000000003],"12":[2.4400000000000001e-07,2.7599999999999998e-07],"7340032":[0.32116436000000004,0.32768330499999998],"7168":[0.000111863,0.000115306],"13":[1.9000000000000001e-07,2.36e-07],"6029312":[0.27677428599999998,0.28294663799999997],"14":[2.2700000000000001e-07,2.9900000000000002e-07],"3200":[4.8401e-05,5.6752999999999997e-05],"20":[2.4299999999999999e-07,2.7599999999999998e-07],"204800":[0.0038144199999999998,0.003927458],"15":[2.1899999999999999e-07,2.7799999999999997e-07],"13312":[0.00020739600000000005,0.000220017],"4980736":[0.20517244600000001,0.20902542299999999],"118784":[0.0021383360000000002,0.0022879739999999999],"51200":[0.00084978100000000019,0.00089469500000000004],"16":[1.98e-07,3.4200000000000002e-07],"21":[3.9499999999999998e-07,4.6400000000000003e-07],"917504":[0.022535902,0.028371272999999995],"22":[2.6600000000000003e-07,4.6400000000000003e-07],"4864":[8.1757999999999999e-05,8.8991000000000002e-05],"17":[2.4600000000000001e-07,2.6399999999999998e-07],"14848":[0.000239177,0.000249459],"23":[3.4499999999999998e-07,4.08e-07],"786432":[0.020241924000000001,0.021760788999999996],"18":[2.48e-07,3.8799999999999998e-07],"1638400":[0.049691524000000001,0.056174596],"7864320":[0.33434912100000003,0.33562191000000002],"24":[4.01e-07,4.4900000000000001e-07],"14155776":[0.60913224099999996,0.63041037899999997],"19":[2.9999999999999999e-07,3.5699999999999998e-07],"30":[3.7399999999999999e-07,4.01e-07],"25":[4.0699999999999998e-07,4.27e-07],"31":[5.2499999999999995e-07,5.3900000000000005e-07],"1280":[2.0114000000000001e-05,2.1741000000000001e-05],"26":[4.3300000000000003e-07,4.4099999999999999e-07],"3932160":[0.15137652800000001,0.15848626099999999],"2432":[4.5147e-05,4.8514999999999999e-05],"32":[4.4099999999999999e-07,6.2200000000000004e-07],"27":[3.7300000000000002e-07,4.6400000000000003e-07],"409600":[0.0083842159999999999,0.0084718699999999994]}},{"title":"OrderedSet sort","results":{"28":[9.4799999999999997e-07,1.057e-06],"34":[1.2890000000000001e-06,1.3009999999999999e-06],"29":[1.0189999999999999e-06,1.0640000000000001e-06],"40":[1.511e-06,1.562e-06],"17408":[0.001365233,0.0014360920000000004],"1472":[0.00010690499999999999,0.00011592899999999999],"112":[5.7130000000000002e-06,5.7860000000000002e-06],"1376256":[0.167411167,0.189617434],"5242880":[0.94223647700000002,0.95436686400000004],"36":[1.398e-06,1.4649999999999999e-06],"42":[1.61e-06,1.6750000000000001e-06],"11534336":[2.2766669780000002,2.2989702489999999],"114688":[0.010654767000000001,0.010957433000000001],"144":[7.0430000000000002e-06,7.7870000000000002e-06],"38":[1.469e-06,1.5689999999999999e-06],"240":[1.3918e-05,1.4004e-05],"9216":[0.00074418999999999983,0.00075782400000000004],"44":[1.6729999999999999e-06,2.0999999999999998e-06],"1664":[0.000106735,0.000117259],"196608":[0.020227104000000003,0.021801863999999994],"155648":[0.014942209,0.015647932999999999],"2816":[0.00021883000000000002,0.000221719],"50":[1.9250000000000002e-06,2.3810000000000002e-06],"2359296":[0.32017435,0.32147682399999999],"46":[1.8649999999999999e-06,2.1509999999999998e-06],"176":[1.0509000000000001e-05,1.0679999999999999e-05],"52":[1.7689999999999999e-06,2.0509999999999999e-06],"272":[1.5150000000000001e-05,1.6790999999999999e-05],"116":[6.1330000000000004e-06,6.4509999999999997e-06],"47104":[0.004375716,0.0044265479999999998],"6912":[0.00049983899999999997,0.00055881300000000002],"1856":[0.000135069,0.00013645900000000002],"48":[1.9570000000000001e-06,1.9829999999999999e-06],"2097152":[0.266629053,0.28073487400000002],"54":[2.119e-06,2.295e-06],"2031616":[0.26708199500000002,0.283696012],"43008":[0.0037714109999999997,0.0038586240000000006],"60":[2.6340000000000001e-06,2.723e-06],"30720":[0.0025779699999999997,0.00266453],"56":[2.1749999999999999e-06,2.3970000000000001e-06],"62":[2.4760000000000001e-06,3.19e-06],"58":[2.2350000000000002e-06,2.548e-06],"3014656":[0.44947848899999998,0.54582535300000001],"64":[3.0630000000000002e-06,3.1990000000000002e-06],"8388608":[1.6048814280000001,1.608345659],"29696":[0.002470683,0.0025260780000000002],"216":[1.2490999999999999e-05,1.2663000000000001e-05],"106496":[0.0097663899999999981,0.010248136999999999],"72":[3.3560000000000001e-06,3.7160000000000001e-06],"442368":[0.047781194000000006,0.051165574000000005],"147456":[0.013790568,0.014383392],"4456448":[0.75103753900000003,0.77052569700000006],"63488":[0.0058489430000000005,0.0059884059999999999],"38912":[0.0032754139999999999,0.0035068550000000006],"68":[3.2540000000000001e-06,3.6490000000000001e-06],"188416":[0.019205311999999999,0.019955214000000002],"248":[1.5468000000000002e-05,1.6045e-05],"80":[3.8630000000000001e-06,3.9559999999999999e-06],"2560":[0.00018786200000000004,0.00019301400000000003],"34816":[0.002821011,0.0028789480000000001],"3712":[0.00025927899999999995,0.00026161700000000001],"3538944":[0.59101745999999999,0.5981031],"76":[3.4249999999999998e-06,4.3189999999999996e-06],"4194304":[0.69944298700000007,0.70462944999999999],"851968":[0.097953294999999996,0.118706587],"4096":[0.00029641599999999998,0.000301954],"59392":[0.005365838999999999,0.0054564900000000005],"84":[4.1969999999999998e-06,4.5009999999999998e-06],"3276800":[0.54435256899999995,0.54437240200000003],"55296":[0.0048616609999999998,0.0050006819999999993],"688128":[0.078454050000000011,0.086813117999999995],"8192":[0.00060540399999999992,0.00064216200000000027],"10240":[0.00081722100000000024,0.00084792899999999987],"15872":[0.0013411250000000003,0.001373633],"92":[5.0300000000000001e-06,5.1229999999999999e-06],"26624":[0.0021390789999999999,0.002213596],"1792":[0.000116605,0.00013148600000000002],"11776":[0.00097104099999999996,0.000998215],"2944":[0.00024008800000000001,0.00025916600000000002],"88":[4.8250000000000004e-06,4.8350000000000003e-06],"22528":[0.0019159089999999997,0.002001713],"1245184":[0.14854521800000001,0.16801233099999999],"15728640":[3.2446361079999999,3.3525349809999998],"96":[5.5459999999999999e-06,5.8869999999999997e-06],"1984":[0.00014817000000000004,0.00016031900000000002],"139264":[0.013191036,0.013627165],"475136":[0.052428667000000005,0.05494740599999999],"13631488":[2.7305214499999999,2.832701208],"416":[2.2812000000000001e-05,2.4615999999999999e-05],"928":[5.9902999999999999e-05,6.1597e-05],"512":[3.0757999999999999e-05,3.3173000000000002e-05],"18432":[0.0014665069999999999,0.001547423],"16777216":[3.424445526],"9728":[0.00072083900000000003,0.00079467600000000002],"1769472":[0.23679250600000001,0.24280992500000001],"1703936":[0.222969058,0.247469566],"2048":[0.00013596999999999996,0.000144795],"14336":[0.0011251219999999997,0.001141602],"448":[2.8283999999999999e-05,2.9706e-05],"5505024":[0.96701482999999999,1.0093609729999999],"544":[3.345e-05,3.7889999999999998e-05],"221184":[0.022135423999999997,0.023038645],"90112":[0.0087594709999999996,0.0089554350000000012],"640":[4.1686e-05,4.1755999999999998e-05],"12800":[0.00095284700000000005,0.0010187079999999999],"262144":[0.025839770000000001,0.026595247000000009],"589824":[0.064945802999999996,0.069103160999999982],"884736":[0.10372123,0.117676477],"6144":[0.00049598299999999997,0.00049791500000000003],"1088":[7.3479000000000006e-05,7.3936000000000005e-05],"576":[3.6022999999999997e-05,3.6334000000000001e-05],"160":[8.3659999999999992e-06,8.7120000000000006e-06],"672":[4.1482e-05,4.4288e-05],"8912896":[1.73206971,1.8129870210000001],"100":[4.955e-06,5.4020000000000001e-06],"507904":[0.056939207000000013,0.062017593999999954],"3840":[0.00028981599999999992,0.00029336299999999999],"192":[1.1695000000000001e-05,1.2098e-05],"376832":[0.041156065000000006,0.042709812],"98304":[0.0097222350000000009,0.0099827320000000011],"5376":[0.00041175100000000002,0.00043619000000000004],"94208":[0.0090534779999999985,0.0094320459999999978],"81920":[0.0076435550000000007,0.0079980260000000001],"3407872":[0.56290014799999999,0.57911319699999997],"104":[5.0989999999999998e-06,5.1599999999999997e-06],"122880":[0.011782364,0.012079854999999976],"200":[1.0804e-05,1.0883000000000001e-05],"163840":[0.015936091999999999,0.016318537000000001],"4063232":[0.70642925999999995,0.70701998399999999],"5767168":[1.0474518530000001,1.0511772619999999],"12582912":[2.5420188019999999,4.1840447449999996],"1600":[0.000106234,0.00011259],"136":[6.7139999999999996e-06,6.9249999999999998e-06],"232":[1.2203e-05,1.358e-05],"7077888":[1.3443237770000001,1.468879166],"86016":[0.0080268749999999993,0.0082134040000000005],"31744":[0.0027149560000000001,0.002829481],"168":[8.7450000000000001e-06,1.0006999999999999e-05],"622592":[0.069358594999999967,0.074711085999999996],"108":[5.0710000000000002e-06,5.468e-06],"327680":[0.034068380999999995,0.035531683999999994],"2176":[0.000140836,0.00015246699999999999],"3328":[0.00023092799999999995,0.00026758199999999999],"1":[1.36e-07,1.4600000000000001e-07],"2":[1.5800000000000001e-07,1.6500000000000001e-07],"3":[2.1500000000000001e-07,2.3200000000000001e-07],"4":[2.2499999999999999e-07,2.3900000000000001e-07],"7424":[0.00060152400000000009,0.00060593300000000001],"5":[2.22e-07,2.4499999999999998e-07],"23552":[0.002097383,0.0021383460000000002],"6":[2.4299999999999999e-07,2.7000000000000001e-07],"61440":[0.0055614709999999993,0.0057493219999999994],"491520":[0.054322347,0.057881780000000008],"77824":[0.006988280999999999,0.0072671720000000006],"7":[2.8299999999999998e-07,2.96e-07],"8":[2.8700000000000002e-07,3.2399999999999999e-07],"208":[1.1497e-05,1.183e-05],"9":[3.15e-07,3.3500000000000002e-07],"73728":[0.0066208119999999994,0.0068154500000000007],"304":[1.7365999999999999e-05,1.9083999999999999e-05],"400":[2.2044000000000001e-05,2.5812e-05],"1310720":[0.15742208399999999,0.17800322499999999],"336":[1.9860999999999998e-05,2.26e-05],"3670016":[0.61213282099999999,0.63238451099999993],"6656":[0.00047414800000000003,0.00049637399999999973],"15360":[0.0012708960000000001,0.001309649],"432":[2.7053999999999999e-05,2.7121e-05],"950272":[0.112201915,0.129956446],"655360":[0.07311339,0.080643235999999993],"69632":[0.0060879600000000016,0.0060963299999999996],"11264":[0.00093942500000000003,0.0010583389999999999],"2752512":[0.38464948099999996,0.38710731500000001],"8126464":[1.5877611009999999,1.60128479],"27648":[0.002247565,0.0023722609999999996],"368":[2.3875000000000001e-05,2.4414e-05],"65536":[0.0056324400000000007,0.0059177989999999996],"16252928":[3.3417479989999999,3.4095627419999999],"464":[2.9913e-05,3.0188e-05],"1015808":[0.12160456,0.14121592099999999],"3072":[0.00023559499999999996,0.00024807700000000003],"110592":[0.010252868,0.010882017000000003],"237568":[0.024206647000000005,0.025898864000000001],"278528":[0.027871159999999996,0.029110548],"496":[3.1652999999999997e-05,3.5182999999999998e-05],"13107200":[2.6159871180000001,2.6908830859999999],"9961472":[2.0164937809999999,2.1136221810000002],"5888":[0.00044846799999999994,0.00049534000000000004],"11010048":[2.149811551,2.2352379290000002],"1920":[0.00013081399999999998,0.000141161],"2490368":[0.33992879999999998,0.36306488599999998],"19456":[0.0015548719999999999,0.001614751],"57344":[0.0050355849999999995,0.0052349959999999996],"1179648":[0.13856173099999999,0.1609939],"4718592":[0.81074351600000005,0.83324172699999999],"360448":[0.038405119000000001,0.039114297000000006],"1572864":[0.19706415499999999,0.210788056],"53248":[0.0046023459999999985,0.0048010909999999995],"3456":[0.00023814600000000001,0.00025371200000000001],"40960":[0.0036032199999999999,0.0036292330000000004],"4608":[0.000327521,0.00033826499999999997],"13824":[0.001124622,0.001137377],"819200":[0.094001345,0.107730929],"983040":[0.11768493100000001,0.12692593499999999],"8704":[0.00064765800000000007,0.00066033899999999991],"120":[6.3219999999999998e-06,7.0310000000000001e-06],"1024":[6.3861000000000004e-05,6.7230999999999994e-05],"49152":[0.0045322449999999999,0.0048139970000000004],"524288":[0.056616446000000001,0.062047596000000003],"45056":[0.0039509599999999999,0.0041772620000000002],"229376":[0.023095491000000003,0.024553546000000002],"2688":[0.00018890999999999998,0.00020726999999999999],"152":[8.3659999999999992e-06,8.9870000000000005e-06],"5120":[0.00037836100000000007,0.000404416],"1507328":[0.18603008200000001,0.22328190000000001],"1216":[7.8821999999999999e-05,8.5581999999999995e-05],"1966080":[0.26615766299999999,0.27039110500000002],"1900544":[0.25931051500000002,0.28344522500000002],"184":[1.0669000000000001e-05,1.0805000000000001e-05],"7936":[0.00062278500000000016,0.00065246399999999952],"3801088":[0.64658287800000003,0.65306435699999998],"6815744":[1.2799977390000001,1.397901796],"124":[6.8730000000000001e-06,7.4959999999999999e-06],"102400":[0.0093221130000000017,0.0093645980000000052],"311296":[0.03229882299999999,0.033728205999999983],"1408":[9.3820000000000006e-05,0.00010892599999999999],"393216":[0.043649697000000001,0.044428120000000001],"4352":[0.00031328300000000003,0.00032592799999999991],"6553600":[1.2521215370000001,1.346396334],"20480":[0.001718605,0.001751182],"608":[3.9685999999999999e-05,4.3939000000000001e-05],"2228224":[0.29655794600000002,0.29725180500000004],"36864":[0.003040133,0.0032484390000000001],"704":[4.7030999999999997e-05,4.9861999999999998e-05],"720896":[0.083938275000000007,0.08791238400000001],"800":[4.6715999999999998e-05,5.6301999999999997e-05],"2621440":[0.364799241,0.41682159699999999],"425984":[0.045788246999999963,0.048646089000000003],"32768":[0.0026675750000000006,0.0027665090000000003],"12058624":[2.4007670729999999,2.5076355389999998],"128":[5.8769999999999998e-06,6.5529999999999998e-06],"180224":[0.017951452,0.018693576],"224":[1.2315e-05,1.2828e-05],"736":[4.9969000000000002e-05,5.1984000000000002e-05],"320":[1.8630999999999998e-05,1.9077999999999999e-05],"557056":[0.060199823,0.06321824600000002],"832":[5.5034999999999997e-05,5.5417999999999997e-05],"9437184":[1.8694481009999999,1.9847479459999999],"3584":[0.00025840500000000007,0.00026875299999999994],"6291456":[1.165445208,1.252050017],"256":[1.2839e-05,1.3957999999999999e-05],"15204352":[3.1104060279999999,3.2925974849999999],"28672":[0.0023428139999999995,0.0024933010000000003],"768":[5.3872000000000002e-05,5.5516000000000002e-05],"212992":[0.020955352,0.021492648999999996],"864":[5.2135000000000001e-05,5.7772000000000002e-05],"352":[2.0783000000000001e-05,2.4871e-05],"253952":[0.026235811999999997,0.027211311999999998],"960":[6.8060999999999998e-05,7.1730000000000006e-05],"24576":[0.0022558949999999999,0.0023014700000000003],"7680":[0.00058337700000000027,0.00062881500000000012],"294912":[0.029728780999999999,0.030682822000000005],"1048576":[0.120284981,0.13791051300000001],"10485760":[2.0506424029999999,2.06224885],"344064":[0.036171788000000003,0.037834581999999992],"288":[1.5783000000000001e-05,1.7980000000000001e-05],"1152":[7.8722999999999998e-05,7.9306000000000003e-05],"384":[2.5235000000000001e-05,2.5542e-05],"2304":[0.00015542400000000001,0.00016705299999999999],"896":[5.9935000000000001e-05,5.9945000000000003e-05],"480":[2.991e-05,3.0681e-05],"1441792":[0.17592921,0.210467026],"992":[6.4541000000000004e-05,7.6378999999999995e-05],"3968":[0.00028580200000000004,0.00031261700000000001],"6400":[0.000469037,0.00049321],"1344":[9.2495000000000001e-05,9.5284000000000005e-05],"126976":[0.012273618,0.012557588],"2883584":[0.41218090400000001,0.44358501699999997],"753664":[0.089059825999999995,0.093970423000000025],"16384":[0.0013234,0.0013347960000000001],"131072":[0.012172274,0.012395777],"458752":[0.049957519000000013,0.057238891],"172032":[0.017085788999999997,0.017592298000000003],"12288":[0.001022547,0.0011332710000000001],"14680064":[2.9972889459999998,5.2507288499999998],"1536":[0.000119502,0.000119591],"25600":[0.002131291,0.0021501150000000002],"1835008":[0.23894227800000001,0.24893862700000002],"10752":[0.00083304900000000009,0.00095969299999999996],"21504":[0.001820777,0.002066483],"7602176":[1.408242741,1.460732699],"5632":[0.0004500079999999999,0.000461903],"10":[3.7899999999999999e-07,3.8299999999999998e-07],"3145728":[0.45515616800000003,0.49683471800000001],"245760":[0.024996713,0.026167395999999999],"1728":[0.00011812300000000001,0.00013357700000000001],"11":[3.8000000000000001e-07,3.8700000000000001e-07],"1114112":[0.12985544399999999,0.15166787300000001],"12":[4.1600000000000002e-07,4.2e-07],"7340032":[1.453874833,1.533345596],"7168":[0.00052375900000000027,0.00054862800000000011],"13":[4.5699999999999998e-07,4.5999999999999999e-07],"6029312":[1.127506385,1.1329473450000001],"14":[4.5499999999999998e-07,6.1900000000000002e-07],"3200":[0.000222914,0.00025426999999999996],"20":[6.6300000000000005e-07,7.5600000000000005e-07],"204800":[0.020106671999999996,0.020144217999999998],"15":[4.9800000000000004e-07,5.6400000000000002e-07],"13312":[0.0010145880000000003,0.001025925],"4980736":[0.849467682,0.89110661199999996],"118784":[0.011174916999999999,0.011824718],"51200":[0.0043500090000000002,0.0045812539999999999],"16":[6.13e-07,6.5799999999999999e-07],"21":[7.5000000000000002e-07,9.0299999999999997e-07],"917504":[0.108590455,0.128211186],"22":[7.5499999999999997e-07,8.7599999999999996e-07],"4864":[0.000353133,0.00037032699999999989],"17":[5.9400000000000005e-07,6.3799999999999997e-07],"14848":[0.0011747960000000001,0.001196943],"23":[8.7599999999999996e-07,8.8000000000000004e-07],"786432":[0.093516580999999974,0.098368541999999976],"18":[6.37e-07,7.0299999999999998e-07],"1638400":[0.21614170499999999,0.225071827],"7864320":[1.5479751689999999,1.5631884949999999],"24":[8.3300000000000001e-07,9.5999999999999991e-07],"14155776":[2.8654772849999999,2.9616375640000001],"19":[6.7400000000000003e-07,7.2099999999999996e-07],"30":[1.0070000000000001e-06,1.018e-06],"25":[9.6099999999999999e-07,9.7600000000000006e-07],"31":[1.147e-06,1.147e-06],"1280":[8.3135999999999998e-05,9.2876999999999999e-05],"26":[8.85e-07,9.9199999999999999e-07],"3932160":[0.66523276399999998,0.73869393400000005],"2432":[0.000167085,0.00018018900000000001],"32":[1.113e-06,1.175e-06],"27":[9.5000000000000001e-07,1.0780000000000001e-06],"409600":[0.043878959000000002,0.044516157999999972]}},{"title":"OrderedSet append","results":{"28":[2.7745899999999998e-06,2.9815000000000002e-06],"34":[3.3145000000000002e-06,3.5249599999999999e-06],"29":[2.8361599999999998e-06,2.87497e-06],"40":[3.6145399999999997e-06,4.1287500000000001e-06],"17408":[0.001734312,0.0018259070000000003],"1472":[0.000136174,0.00014278427272727273],"112":[1.178772e-05,1.2417690000000001e-05],"1376256":[0.22430067850000002,0.28288328299999999],"5242880":[1.4761008150000001,1.4800073709999999],"36":[3.25866e-06,3.5488600000000002e-06],"42":[3.6548800000000002e-06,3.8731818181818185e-06],"11534336":[3.6068012500000002,3.7569936080000002],"114688":[0.013300013500000003,0.013464439],"144":[1.375224e-05,1.4487320000000001e-05],"38":[3.5824705882352944e-06,3.7796200000000003e-06],"240":[2.3433059999999998e-05,2.392937e-05],"9216":[0.00095149799999999995,0.00097179350000000005],"44":[3.7594299999999999e-06,4.1330899999999996e-06],"1664":[0.00018632674509803915,0.00020033044680851068],"196608":[0.020644618999999999,0.021653882999999995],"155648":[0.016986593000000001,0.017396077499999999],"2816":[0.00026187900000000002,0.00026387300000000013],"50":[5.2328400000000004e-06,5.7858599999999997e-06],"2359296":[0.500602086,0.508878151],"46":[4.0339599999999996e-06,4.30278e-06],"176":[1.4821990000000001e-05,1.592082e-05],"52":[5.3901399999999997e-06,5.47903e-06],"272":[2.50365e-05,2.6531499999999998e-05],"116":[1.1801730000000001e-05,1.18044e-05],"47104":[0.0044247484999999998,0.0044765209999999998],"6912":[0.00079607499999999993,0.00080457300000000005],"1856":[0.00019640600000000002,0.00020670215217391302],"48":[4.0630900000000003e-06,4.3476000000000005e-06],"2097152":[0.42240237600000002,0.45410688049999998],"54":[5.5167699999999999e-06,5.56001e-06],"2031616":[0.396187817,0.43028752999999997],"43008":[0.00414008,0.0042353249999999999],"60":[5.9390400000000005e-06,6.2039500000000001e-06],"30720":[0.0032966409999999995,0.0036054199999999994],"56":[5.6290200000000004e-06,5.7376666666666667e-06],"62":[6.2055199999999998e-06,6.3126666666666672e-06],"58":[5.7197599999999996e-06,5.8000000000000004e-06],"3014656":[0.68850290000000003,0.74986913649999998],"64":[6.3794100000000001e-06,6.5314599999999998e-06],"8388608":[2.9011474060000002,2.9426127709999998],"29696":[0.0032339136666666665,0.0033537074999999993],"216":[2.231536e-05,2.2376999999999999e-05],"106496":[0.012913268,0.013044508999999999],"72":[6.6536600000000001e-06,7.5000000000000002e-06],"442368":[0.065624554000000029,0.076235648999999989],"147456":[0.015871812499999999,0.016815044000000005],"4456448":[1.24928163,1.280880032],"63488":[0.0068098480000000003,0.0071255619999999993],"38912":[0.0038387115,0.004102868],"68":[6.6720833333333333e-06,7.0021000000000003e-06],"188416":[0.0198235745,0.023867082500000004],"248":[2.5328019999999997e-05,2.5534999999999999e-05],"80":[7.4124700000000002e-06,7.9768199999999993e-06],"2560":[0.000245527,0.00025286500000000001],"34816":[0.0034670870000000006,0.0037065500000000003],"3712":[0.00040835925000000004,0.00041780291304347828],"3538944":[1.0261612265,1.0446474875],"76":[6.7686666666666658e-06,7.6289166666666666e-06],"4194304":[1.1427157505000001,1.189029356],"851968":[0.13846699749999999,0.19362814249999999],"4096":[0.00042709331818181816,0.00043787399999999999],"59392":[0.0064337109999999999,0.0068919970000000013],"84":[7.3419999999999993e-06,8.0965200000000009e-06],"3276800":[0.99252025899999996,1.0016128575000001],"55296":[0.0063910149999999999,0.006541031000000001],"688128":[0.088270109999999999,0.11057881],"8192":[0.00082383699999999979,0.00090623990909090919],"10240":[0.0009624150000000001,0.0010285300000000002],"15872":[0.00168026,0.0017489959999999998],"92":[8.2844400000000009e-06,9.3802100000000011e-06],"26624":[0.0030773233333333339,0.0031235779999999997],"1792":[0.00019634082222222225,0.00020031010204081746],"11776":[0.001108884625,0.0011323290000000001],"2944":[0.00025963800000000002,0.00028656213333333328],"88":[7.489942857142858e-06,8.4414899999999997e-06],"22528":[0.002076367,0.002186393],"1245184":[0.19346502399999999,0.24245445400000001],"15728640":[6.0621485405,6.2793900369999998],"96":[8.4734299999999996e-06,8.6684200000000013e-06],"1984":[0.000199772,0.000214687],"139264":[0.015059301999999997,0.015856619500000002],"475136":[0.065379389999999996,0.070495450999999973],"13631488":[5.7085942845000002,5.9071527599999998],"416":[4.6682010000000005e-05,4.9829e-05],"928":[9.3925000000000006e-05,0.00010101382105263161],"512":[5.349551162790698e-05,5.7040810810810808e-05],"18432":[0.0018263361999999999,0.0019799047499999998],"16777216":[6.4862824139999997],"9728":[0.00096013200000000004,0.0010441418888888887],"1769472":[0.40517033199999997,0.40575573650000002],"1703936":[0.361408018,0.39831716299999997],"2048":[0.000213563,0.00022041887500000011],"14336":[0.001584727,0.001597474],"448":[4.5328199999999997e-05,5.179508e-05],"5505024":[1.4969997479999999,1.5201842555],"544":[5.3361629999999996e-05,5.5465097222222228e-05],"221184":[0.028982503999999999,0.030714572999999995],"90112":[0.009024064,0.0092747060000000006],"640":[5.9850619047619045e-05,6.0567765625000002e-05],"12800":[0.001481347,0.0015088971666666667],"262144":[0.032246239000000024,0.035642332999999991],"589824":[0.078540956500000009,0.096039358000000019],"884736":[0.149651601,0.185572504],"6144":[0.00054303900000000004,0.00058009400000000007],"1088":[0.000104789,0.00010974199999999999],"576":[5.4703432835820897e-05,5.5747619999999996e-05],"160":[1.399108695652174e-05,1.482305e-05],"672":[6.1228000000000004e-05,6.2751490000000356e-05],"8912896":[2.9948738260000001,3.1064781445],"100":[1.0672359374999999e-05,1.1131000000000001e-05],"507904":[0.070598327000000016,0.083702400499999996],"3840":[0.0003984355,0.00040743034782608691],"192":[1.689137e-05,1.7126000000000002e-05],"376832":[0.0438978145,0.047333661999999985],"98304":[0.0095013219999999995,0.0095282290000000026],"5376":[0.00050800744444444456,0.0005292425625],"94208":[0.0091020059999999993,0.0093367100000000015],"81920":[0.0082114279999999998,0.0083410949999999998],"3407872":[1.0022680639999999,1.0485981105],"104":[1.090408e-05,1.11012e-05],"122880":[0.013908926,0.014678596],"200":[2.1766820000000001e-05,2.260518e-05],"163840":[0.017431613499999991,0.017788025000000002],"4063232":[1.1405865719999999,1.1531197719999999],"5767168":[1.6099525585000001,1.7178811045],"12582912":[4.0498247239999996,7.8508066760000004],"1600":[0.0001827444807692307,0.00019222999999999997],"136":[1.3325900000000001e-05,1.37505e-05],"232":[2.2993520000000001e-05,2.4028437499999998e-05],"7077888":[2.5622281155,2.928817912],"86016":[0.0085663809999999979,0.0087036069999999986],"31744":[0.0032680949999999999,0.0035492935],"168":[1.3817333333333334e-05,1.6575e-05],"622592":[0.080687439500000013,0.098526231999999977],"108":[1.127978e-05,1.2454829999999998e-05],"327680":[0.037630916,0.041111088000000004],"2176":[0.000206639,0.000229817],"3328":[0.00037604346153846148,0.00039802122727272736],"1":[2.6585999999999997e-07,2.8979e-07],"2":[3.2999000000000001e-07,3.3161000000000004e-07],"3":[4.6629999999999999e-07,5.1745000000000002e-07],"4":[5.0597999999999998e-07,5.4990999999999998e-07],"7424":[0.0008350731818181818,0.000846801],"5":[6.9702000000000008e-07,7.1427999999999996e-07],"23552":[0.0022061922499999999,0.0022712779999999994],"6":[7.3671000000000004e-07,7.8841e-07],"61440":[0.0068319359999999985,0.006886408000000001],"491520":[0.06833334499999999,0.082902085],"77824":[0.0078916030000000005,0.0082066119999999985],"7":[8.136600000000001e-07,8.3463999999999996e-07],"8":[8.7824999999999991e-07,8.8141999999999996e-07],"208":[2.2642190000000001e-05,2.2970960000000001e-05],"9":[9.9098999999999985e-07,1.0151799999999999e-06],"73728":[0.0075978510000000001,0.0077990820000000006],"304":[2.7121e-05,2.9814793103448275e-05],"400":[4.5466660000000007e-05,4.977039e-05],"1310720":[0.21903870550000001,0.28197396050000001],"336":[2.9492810000000001e-05,3.3221549999999997e-05],"3670016":[1.0353899055,1.0879663150000001],"6656":[0.00077058208333333352,0.00078589600000000012],"15360":[0.0016823128000000003,0.0017251672],"432":[4.7113790000000002e-05,5.0223499999999998e-05],"950272":[0.15029933600000001,0.209180956],"655360":[0.085243495999999988,0.11026269950000001],"69632":[0.0072479909999999996,0.007472145999999999],"11264":[0.0010536697777777776,0.0012353049999999999],"2752512":[0.56861675050000005,0.57653651350000001],"8126464":[2.7719508835000002,2.8796918649999999],"27648":[0.0031667216666666663,0.0032602289999999999],"368":[3.1982079999999999e-05,3.2920525773195878e-05],"65536":[0.0068411619999999996,0.0072501480000000005],"16252928":[6.1702966830000001,6.289449254],"464":[4.7107739999999999e-05,4.9466079999999996e-05],"1015808":[0.16115534749999999,0.21598854950000002],"3072":[0.00029161299999999992,0.00029910290909090909],"110592":[0.013245951000000001,0.013952311],"237568":[0.030249423500000001,0.033132046000000005],"278528":[0.033135072000000002,0.036260205999999996],"496":[4.8368081632653059e-05,5.0698333333333336e-05],"13107200":[5.5467215230000004,5.883254258],"9961472":[3.3836222115000001,3.6150387595],"5888":[0.00052035199999999986,0.00056529600000000007],"11010048":[3.4813487465000001,3.5694113939999998],"1920":[0.00020905527906976744,0.00020949628888888887],"2490368":[0.52283482800000003,0.56511663499999998],"19456":[0.0019232125999999999,0.001930855],"57344":[0.0064553860000000022,0.0067150119999999994],"1179648":[0.19250656099999999,0.24442285699999999],"4718592":[1.317664189,1.3292969724999999],"360448":[0.042487884000000004,0.044588122499999994],"1572864":[0.25729925999999997,0.30814162499999997],"53248":[0.0061864720000000002,0.0063628419999999988],"3456":[0.00038855699999999999,0.00041156900000000008],"40960":[0.0039481730000000001,0.0041873324999999999],"4608":[0.00044227599999999996,0.00045327399999999993],"13824":[0.0016027676666666667,0.0016121250000000001],"819200":[0.13875900050000001,0.17425856149999999],"983040":[0.15351420850000003,0.22443204900000002],"8704":[0.00085096199999999992,0.00090287659999999993],"120":[1.1693500000000001e-05,1.212018e-05],"1024":[0.0001032755,0.0001090744444444444],"49152":[0.0046858870000000014,0.0047379340000000009],"524288":[0.071387935999999999,0.095690315999999984],"45056":[0.0042288050000000004,0.0045677764999999997],"229376":[0.028917737999999998,0.031042217999999955],"2688":[0.00026184900000000003,0.000268075],"152":[1.3690448979591836e-05,1.4041823529411765e-05],"5120":[0.00049759900000000004,0.00051627533333333344],"1507328":[0.2430185675,0.33910848449999997],"1216":[0.000112894625,0.00012267969620253166],"1966080":[0.40979799299999997,0.43520819199999999],"1900544":[0.40986953799999998,0.46344421400000002],"184":[1.5547969999999999e-05,1.6665999999999999e-05],"7936":[0.00085813230000000005,0.0008780595],"3801088":[1.0882095920000001,1.1160834055],"6815744":[2.649796158,2.8751521604999999],"124":[1.1844666666666667e-05,1.36213e-05],"102400":[0.012748371999999999,0.013330326],"311296":[0.036674667000000001,0.038700385999999996],"1408":[0.00012808200000000001,0.000136014],"393216":[0.045329827000000003,0.049183279000000003],"4352":[0.00043470704761904765,0.000472139],"6553600":[2.5327090050000001,2.9156332935],"20480":[0.0020474529999999999,0.0020523902499999997],"608":[5.5807999999999998e-05,6.3469017543859647e-05],"2228224":[0.45440686749999998,0.46847750799999999],"36864":[0.0036605509999999993,0.003861873],"704":[6.4341359999999998e-05,6.5358140000000003e-05],"720896":[0.094798353000000016,0.12661215300000001],"800":[8.352e-05,9.0409846153846149e-05],"2621440":[0.54015982149999997,0.60525613899999997],"425984":[0.063328778000000002,0.067095687000000015],"32768":[0.0034237569999999995,0.0036620375000000005],"12058624":[3.8223619775,3.9701969090000002],"128":[1.1974990000000001e-05,1.357798e-05],"180224":[0.018716927499999998,0.020250741499999995],"224":[2.3086069999999997e-05,2.3639944444444446e-05],"736":[6.623376e-05,6.9088369999999999e-05],"320":[3.0158239999999998e-05,3.029426e-05],"557056":[0.073280385000000003,0.084454367000000002],"832":[9.4882820000000007e-05,9.6099000000000003e-05],"9437184":[3.1500813624999999,3.4995751154999999],"3584":[0.00038776800000000003,0.00041030500000000002],"6291456":[1.8510857940000001,1.9853477209999999],"256":[2.4883199999999999e-05,2.4916690000000001e-05],"15204352":[5.9734418659999999,6.430939865],"28672":[0.003243161,0.0032835900000000003],"768":[6.7962009999999998e-05,7.4163729999999998e-05],"212992":[0.028225852000000003,0.0289369095],"864":[9.1428999999999995e-05,9.4055000000000007e-05],"352":[3.2007e-05,3.2818336734693877e-05],"253952":[0.030450142999999995,0.03214214700000001],"960":[9.8014866666666669e-05,0.00010638433333333335],"24576":[0.0023787277499999998,0.0024367670000000003],"7680":[0.00081615345454545446,0.00084506009090909114],"294912":[0.033995257500000001,0.035551581500000005],"1048576":[0.16091423499999999,0.22482193950000001],"10485760":[3.2821742875000002,3.3653579109999998],"344064":[0.039193864000000009,0.043845009000000004],"288":[2.6607490000000002e-05,2.7725e-05],"1152":[0.000114552,0.000120671],"384":[3.4854470000000001e-05,3.782426e-05],"2304":[0.000229173,0.000232535],"896":[9.5141142857142852e-05,9.8618333333333331e-05],"480":[4.8701489361702128e-05,5.3979639999999997e-05],"1441792":[0.2361761805,0.31153536299999995],"992":[0.000100412,0.00010111399999999999],"3968":[0.00041545034782608699,0.00043823572727272737],"6400":[0.00075437400000000004,0.00075799199999999998],"1344":[0.00012525975342465756,0.00013227000000000001],"126976":[0.0142684565,0.014421049],"2883584":[0.60676714300000001,0.68144826449999996],"753664":[0.096789488000000021,0.1157506365],"16384":[0.0017619876,0.0017986529999999997],"131072":[0.0147185175,0.016374641000000002],"458752":[0.067451508499999965,0.090211419000000001],"172032":[0.018145348999999998,0.020332205500000002],"12288":[0.0011493856250000003,0.0012226132857142853],"14680064":[5.8527396569999999,11.619266139],"1536":[0.00014182510294117649,0.00015000666666666667],"25600":[0.003123327,0.003127078666666666],"1835008":[0.37773872399999997,0.421349796],"10752":[0.0010151617777777778,0.0010723310000000006],"21504":[0.0020473402499999998,0.0022592154999999995],"7602176":[2.5337749724999998,2.667052134],"5632":[0.00049692699999999998,0.00054698000000000008],"10":[1.1023400000000001e-06,1.13567e-06],"3145728":[0.69414868949999997,0.74657093600000002],"245760":[0.030613581000000001,0.031284304999999998],"1728":[0.000196357,0.00022295999999999999],"11":[1.10048e-06,1.1562799999999999e-06],"1114112":[0.176221244,0.24491240299999995],"12":[1.2071399999999999e-06,1.2311500000000001e-06],"7340032":[2.5934700739999998,2.9973832680000001],"7168":[0.00078583399999999979,0.00080316908333333324],"13":[1.22189e-06,1.2556899999999998e-06],"6029312":[1.7110793895,1.7696543375],"14":[1.2819299999999999e-06,1.3698900000000002e-06],"3200":[0.00036967899999999998,0.00041809199999999995],"20":[1.72013e-06,1.7744300000000001e-06],"204800":[0.027276963000000005,0.027674436],"15":[1.3519899999999999e-06,1.3564800000000001e-06],"13312":[0.001511442,0.0015210996666666667],"4980736":[1.3716551240000001,1.4154276960000001],"118784":[0.013916227999999999,0.014266710000000019],"51200":[0.0061546420000000001,0.0062265849999999998],"16":[1.36091e-06,1.5138499999999999e-06],"21":[1.7621700000000001e-06,1.87206e-06],"917504":[0.15035707100000001,0.19268971300000001],"22":[1.7991599999999998e-06,1.8952337662337662e-06],"4864":[0.00046867000000000002,0.00049747300000000012],"17":[1.5712600000000001e-06,1.5732100000000001e-06],"14848":[0.0016069179999999999,0.0016296548000000004],"23":[1.9075500000000001e-06,1.9566200000000002e-06],"786432":[0.10214981249999999,0.1239556065],"18":[1.63295e-06,1.68075e-06],"1638400":[0.35403574399999999,0.37420604299999999],"7864320":[2.8142543600000001,2.8288374735000001],"24":[1.96163e-06,2.14384e-06],"14155776":[5.7725516275000004,6.1132220090000002],"19":[1.66821e-06,1.6765700000000002e-06],"30":[2.91285e-06,2.9394399999999996e-06],"25":[2.6230500000000002e-06,2.7863999999999997e-06],"31":[2.8701900000000002e-06,2.90627e-06],"1280":[0.00011855133333333332,0.00012426240506329111],"26":[2.7599900000000004e-06,2.7929200000000001e-06],"3932160":[1.080972788,1.2322768850000001],"2432":[0.000235806,0.00024383652631578952],"32":[2.9206700000000003e-06,2.96026e-06],"27":[2.7651500000000001e-06,3.0797599999999999e-06],"409600":[0.062648116000000004,0.06282545149999999]}},{"title":"OrderedSet prepend","results":{"28":[3.202e-06,3.3513100000000003e-06],"2432":[0.00049414616666666679,0.0004992723157894735],"29":[3.1710199999999999e-06,3.4097199999999999e-06],"704":[8.6510799999999998e-05,8.8196999999999996e-05],"54":[6.3680900000000002e-06,6.80437e-06],"640":[8.4885650000000003e-05,8.7726846153846148e-05],"7424":[0.0034730955,0.0035376409999999998],"80":[8.3443124999999999e-06,8.7721000000000003e-06],"1792":[0.00033946560714285721,0.00034929900000000002],"12800":[0.0096255850000000007,0.0097985769999999993],"22528":[0.028150784499999998,0.029396866000000001],"480":[6.5363307692307699e-05,6.7344536585365859e-05],"544":[7.0102000000000001e-05,7.4096333333333338e-05],"608":[8.0609789473684207e-05,8.3862312500000003e-05],"56":[6.3609299999999999e-06,6.7884799999999998e-06],"464":[6.3264219999999998e-05,6.3279499999999996e-05],"18432":[0.0192805505,0.020782826000000001],"58":[6.3974699999999998e-06,6.7707400000005528e-06],"1984":[0.00036802800000000012,0.00038720099999999994],"448":[6.0646660000000001e-05,6.1056409836065577e-05],"384":[4.4835777777777777e-05,4.9388500000000003e-05],"4352":[0.0011529609999999999,0.0012464170000000001],"84":[8.7730299999999992e-06,9.1148600000000003e-06],"36864":[0.074141171999999977,0.078102344000000018],"368":[4.116524e-05,4.312639e-05],"2816":[0.00058439099999999986,0.00059969737499999997],"288":[3.3817669999999998e-05,3.4606120000000002e-05],"110592":[0.64839793800000001,0.67160983799999996],"14336":[0.011856613000000016,0.0120818425],"88":[8.9759285714285719e-06,9.673149999999999e-06],"1088":[0.00017091916071428577,0.00017400200000000001],"1280":[0.000196529,0.00020408999999999995],"32768":[0.059073292499999999,0.060991650000000008],"832":[0.00013166410447761198,0.00013232737333333333],"9728":[0.0055606710000000005,0.0059391920000000003],"1472":[0.00023813300000000002,0.00025682199999999987],"672":[8.5500363636363633e-05,9.1779499999999998e-05],"736":[9.5117927835051537e-05,9.82690947368421e-05],"28672":[0.045214408999999997,0.047486222499999994],"147456":[1.2849498930000001,1.3967497579999999],"30720":[0.051827884000000005,0.057024746500000015],"2304":[0.00044240099999999998,0.00046011719047619039],"576":[7.9544509999999991e-05,7.956924e-05],"8192":[0.00409451,0.0042675879999999984],"1664":[0.00030398632258064515,0.00032020699999999998],"90112":[0.42722315500000002,0.44186989900000001],"496":[6.6703346938775507e-05,6.6882239130434774e-05],"6656":[0.0027437480000000003,0.0028661579999999997],"24576":[0.033095764999999999,0.034959006000000001],"30":[3.2365600000000002e-06,3.4340000000000001e-06],"1856":[0.00034811300000000005,0.0003580902307692308],"163840":[1.803530914],"31":[3.2107199999999997e-06,3.3212500000000002e-06],"9216":[0.00504733,0.0054120189999999997],"32":[3.4668399999999998e-06,3.6980200000000001e-06],"3584":[0.00091411111111111098,0.00096342240000000005],"114688":[0.69163199600000003,0.71182267899999996],"960":[0.00015173132307692307,0.00015532999999999996],"17408":[0.017382557,0.018486572],"77824":[0.319552738,0.33650969600000002],"34":[3.69949e-06,3.7112799999999998e-06],"10752":[0.006735675,0.0070486889999999995],"864":[0.00013928699999999998,0.0001454375],"928":[0.00013806700000000002,0.000148486],"60":[6.5950000000000004e-06,6.7413200000000007e-06],"1152":[0.00018000966666666666,0.00018436200000000003],"40960":[0.090360122999999987,0.092240649499999994],"36":[3.6530900000000004e-06,4.0227499999999997e-06],"6144":[0.0023034329999999997,0.0023384664999999997],"4608":[0.001331683142857143,0.001372086],"768":[9.7050000000000001e-05,0.000111022],"62":[7.0814100000000004e-06,7.27677e-06],"16384":[0.0153416135,0.016157431],"38":[4.0331200000000001e-06,4.0491799999999996e-06],"3968":[0.0010674321111111115,0.001081285],"131072":[0.91180609800000001,0.972098766],"1344":[0.00020463389583333331,0.00021605979069767438],"73728":[0.28795932150000003,0.29548822149999998],"64":[7.1069499999999998e-06,7.49777e-06],"118784":[0.74160978099999997,0.80685488599999999],"3072":[0.00066385800000000003,0.00068018053846153823],"1":[2.5067000000000001e-07,2.5190999999999998e-07],"1536":[0.000240838,0.00025221999999999999],"2":[3.2784999999999996e-07,3.4044e-07],"92":[9.9443300000000011e-06,1.0342960000000001e-05],"3":[5.3160000000000002e-07,5.5961999999999992e-07],"69632":[0.25721075900000001,0.26373639849999997],"4":[5.5466999999999998e-07,6.2106000000000003e-07],"68":[7.9178200000000004e-06,7.9884900000000008e-06],"5888":[0.0021220900000000001,0.0022249470000000001],"5":[7.9373e-07,8.3238000000000005e-07],"12288":[0.0085939840000000024,0.0090029709999999985],"27648":[0.042926257999999995,0.044444622999999996],"6":[8.4043999999999997e-07,8.4451999999999994e-07],"7":[9.4941000000000003e-07,9.6560999999999998e-07],"1920":[0.000360484,0.00036254257692307684],"1728":[0.00032494199999999994,0.00037414404166666651],"6912":[0.0030946839999999995,0.0031583416666666662],"8":[1.0193999999999999e-06,1.03242e-06],"992":[0.00015092225000000003,0.00015568399999999998],"9":[1.18831e-06,1.2381400000000001e-06],"96":[9.7193599999999994e-06,9.9138099999999989e-06],"47104":[0.1192715055,0.12139689400000001],"3456":[0.000852413,0.00089301700000000007],"10240":[0.0061081680000000006,0.0066474689999999987],"25600":[0.036773701000000006,0.037924923999999992],"65536":[0.22711115999999998,0.233694239],"896":[0.00013900490140845073,0.00014611999999999999],"13824":[0.011075191,0.0116183195],"3840":[0.00096171400000000002,0.00098929300000000003],"1024":[0.00015653600000000001,0.00015916300000000001],"43008":[0.099155907999999973,0.104501812],"100":[1.2384249999999999e-05,1.354355e-05],"5376":[0.0017697586000000008,0.0018791914],"19456":[0.021126804999999999,0.021746340000000003],"21504":[0.0258723345,0.026869275499999994],"10":[1.2790300000000001e-06,1.33399e-06],"81920":[0.35381492399999998,0.36322938849999997],"1216":[0.00019387200000000002,0.00019786700000000006],"11":[1.3328499999999999e-06,1.3471100000000001e-06],"6400":[0.0026512806666666665,0.0029356453333333329],"12":[1.4057899999999999e-06,1.4631400000000001e-06],"57344":[0.17517800650000001,0.18429146199999999],"13":[1.42792e-06,1.4351699999999998e-06],"1408":[0.0002157425,0.000220108],"1600":[0.0002960610333333333,0.00030918850000000002],"14":[1.49097e-06,1.52964e-06],"200":[2.577307e-05,2.6308e-05],"20480":[0.023647983000000001,0.024740500000000006],"139264":[1.1090141419999999,1.129537996],"15":[1.5719999999999999e-06,1.5887599999999999e-06],"40":[4.1611799999999995e-06,4.36636e-06],"120":[1.427108e-05,1.457499e-05],"112":[1.3203749999999999e-05,1.3794680000000001e-05],"16":[1.6296099999999999e-06,1.7828000000000001e-06],"104":[1.2645e-05,1.324491e-05],"17":[1.8293100000000001e-06,1.8438400000000001e-06],"42":[4.4950000000000002e-06,4.5103400000000001e-06],"7680":[0.003612891,0.0036912759999999994],"53248":[0.15184299600000001,0.158115757],"18":[1.86642e-06,1.8819999999999999e-06],"13312":[0.0104606565,0.010519393],"3328":[0.00082426700000000006,0.00085309899999999985],"19":[1.9135399999999998e-06,2.0030900000000001e-06],"44":[4.58059e-06,4.7237000000000002e-06],"29696":[0.048785165999999991,0.050127124999999995],"31744":[0.055295667999999999,0.057373699],"2688":[0.00053875699999999984,0.00054398300000000027],"46":[4.4940600000000005e-06,4.6529200000000005e-06],"49152":[0.12929404,0.13840898200000001],"51200":[0.14137234600000001,0.14537133299999999],"72":[7.7302400000000004e-06,8.0402999999999999e-06],"3712":[0.00094139100000000008,0.00098362100000000006],"124":[1.5006279999999999e-05,1.571246e-05],"8704":[0.0045639470000000005,0.0046913190000000002],"106496":[0.59443232499999998,0.61825067299999992],"48":[4.8071000000000001e-06,5.0891800000000006e-06],"116":[1.412045e-05,1.480769e-05],"108":[1.3036e-05,1.3602428571428571e-05],"15872":[0.014320303,0.015451364],"400":[5.782298591549296e-05,5.8335000000000003e-05],"320":[3.764195e-05,4.0297120000000006e-05],"102400":[0.55156521250000001,0.56295105400000001],"76":[8.0466299999999989e-06,8.804642105263158e-06],"240":[2.91855e-05,2.9334559999999999e-05],"304":[3.4315430000000002e-05,3.8566770000000003e-05],"45056":[0.108670264,0.1162582665],"232":[2.9254720000000001e-05,3.0537289999999996e-05],"5632":[0.0018871019999999999,0.0021633869999999884],"160":[1.7629259999999998e-05,1.7815000000000001e-05],"224":[2.7010000000000001e-05,2.788876e-05],"23552":[0.030522477499999999,0.031762101000000001],"152":[1.6819129999999998e-05,1.6824e-05],"216":[2.5921000000000001e-05,2.7285260000000002e-05],"38912":[0.082835412999999997,0.084827095999999977],"144":[1.6480499999999999e-05,1.657897e-05],"208":[2.6804580000000003e-05,2.7501560000000002e-05],"7168":[0.0032718545,0.0035158110000000006],"136":[1.5447840000000001e-05,1.6098690000000002e-05],"2176":[0.0004135007826086957,0.00044070399999999999],"11776":[0.0080671190000000011,0.008187220999999998],"128":[1.384913e-05,1.513672e-05],"63488":[0.2168031675,0.22683944499999997],"98304":[0.50455800200000001,0.51818866350000004],"122880":[0.80689261000000001,0.86097537999999996],"3200":[0.00080115166666666691,0.00084794799999999995],"59392":[0.18795185449999999,0.19603381050000002],"155648":[1.5358503780000001,1.6137566374999999],"61440":[0.201655903,0.21052822900000001],"2560":[0.00050175199999999995,0.00053846244444444432],"34816":[0.06568060299999999,0.067744401999999954],"4096":[0.00110783325,0.001130233],"94208":[0.46416261149999999,0.4796468015],"5120":[0.0016333588333333337,0.0016694566000000001],"55296":[0.16358212900000002,0.16805084599999998],"512":[7.0027578947368425e-05,7.5379280000000004e-05],"15360":[0.013642036999999999,0.014357060500000001],"432":[6.0881190000000002e-05,6.7036208333333332e-05],"20":[2.0076699999999999e-06,2.0464699999999998e-06],"2944":[0.00062387786666666671,0.00064673684615384629],"352":[4.227492592592592e-05,4.3201430000000005e-05],"416":[5.7826666666666666e-05,6.5659750000000001e-05],"21":[2.03833e-06,2.16753e-06],"7936":[0.0038882495,0.0040696610000000005],"272":[3.3278819999999999e-05,3.3773660000000002e-05],"336":[3.782306779661017e-05,4.0598714285714289e-05],"22":[2.1152600000000001e-06,2.2003899999999999e-06],"192":[2.0511346666666667e-05,2.1071570000000001e-05],"256":[3.1583330000000002e-05,3.1978499999999999e-05],"23":[2.2159100000000001e-06,2.32079e-06],"184":[1.9642810000000002e-05,1.9730479999999999e-05],"248":[3.0449142857142856e-05,3.187642e-05],"11264":[0.0072791829999999998,0.007749184000000001],"176":[1.7607850000000001e-05,1.9026319999999999e-05],"24":[2.31327e-06,2.6036400000000002e-06],"26624":[0.039771320999999998,0.040954678500000001],"168":[1.7114360000000001e-05,1.9906239999999999e-05],"126976":[0.88161722399999998,0.91624873600000001],"25":[2.8891899999999999e-06,3.2016100000000003e-06],"50":[6.0369600000000006e-06,6.6379399999999998e-06],"4864":[0.001453588,0.001515803],"2048":[0.00037878850000000003,0.00040476425000000003],"14848":[0.012852327,0.012906316499999997],"26":[2.94458e-06,3.1742400000000003e-06],"86016":[0.38733432600000001,0.396643568],"27":[3.1543499999999997e-06,3.4206400000000002e-06],"800":[0.00011751100000000001,0.000121354],"52":[6.0426000000000004e-06,6.3467700000000004e-06]}},{"title":"OrderedSet prepend, reserving capacity","results":{"28":[1.9856399999999999e-06,2.04172e-06],"2432":[0.000367845,0.00037755500000000001],"29":[1.9641200000000001e-06,2.0868000000000001e-06],"704":[5.9269499999999999e-05,6.3522181818181814e-05],"54":[3.4322999999999997e-06,3.6215599999999999e-06],"640":[5.7782750000000002e-05,5.9449940000000004e-05],"7424":[0.0030523893333333336,0.0031250445000000002],"80":[5.4610399999999993e-06,5.6450952380952381e-06],"1792":[0.00022774999999999995,0.00023581700000000006],"12800":[0.0087833319999999979,0.0088057300000000012],"22528":[0.027016715,0.028273311499999999],"480":[3.86945e-05,4.0008300000000001e-05],"544":[4.5333429999999997e-05,4.6305660000000003e-05],"608":[5.24775e-05,5.455846e-05],"56":[3.5990821917808224e-06,3.7984100000000002e-06],"464":[3.7035800000000002e-05,3.7205250000000004e-05],"18432":[0.018301333999999999,0.020177695000000002],"58":[3.6762999999999999e-06,3.6830499999999998e-06],"1984":[0.0002571412222222223,0.00027082699999999996],"448":[3.3992180000000002e-05,3.4329460000000001e-05],"384":[2.9749333333333333e-05,3.2347130000000003e-05],"4352":[0.00097534630000000008,0.00098495099999999997],"84":[5.6317200000000004e-06,5.8410500000000006e-06],"36864":[0.072192942999999982,0.075721442],"368":[2.7900999999999999e-05,2.970842e-05],"2816":[0.00046254450000000007,0.00050059863157894745],"288":[2.165832e-05,2.1767999999999999e-05],"110592":[0.63609570250000003,0.66223064900000006],"14336":[0.011027337,0.011209133],"88":[6.0809499999999998e-06,6.2727236842105258e-06],"1088":[0.000112101,0.00011577812987012988],"1280":[0.000136639,0.0001395142112676056],"32768":[0.056978777999999952,0.059203182],"832":[7.5316999999999997e-05,7.7151576923076919e-05],"9728":[0.0050758360000000002,0.0053163410000000005],"1472":[0.000182413,0.00018386706122448983],"672":[5.9166999999999998e-05,5.9567230769230765e-05],"736":[6.9108534883720923e-05,7.3595279999999995e-05],"28672":[0.043139411000000003,0.04556897],"147456":[1.3335436094999999,1.343474096],"30720":[0.049855442,0.050980355999999991],"2304":[0.00033406641379310335,0.00034564399999999993],"576":[4.9240688172043008e-05,5.0893744680851064e-05],"8192":[0.0036368120000000006,0.0038786305000000007],"1664":[0.00019377866666666672,0.00020396600000000001],"90112":[0.42502506799999995,0.45070580850000003],"496":[3.9359153846153841e-05,4.1707610000000001e-05],"6656":[0.00236359,0.0024557570000000003],"24576":[0.03237580000000001,0.034574964999999999],"30":[2.0147900000000003e-06,2.1612199999999999e-06],"1856":[0.0002301805,0.00024071500000000002],"31":[2.0768499999999999e-06,2.08049e-06],"9216":[0.0047241750000000006,0.0050150200000000002],"32":[2.2974900000000002e-06,2.3926899999999997e-06],"3584":[0.00071050499999999973,0.00072861599999999996],"114688":[0.68411577800000001,0.73825597799999998],"960":[9.6618499999999997e-05,0.00010259664705882353],"17408":[0.016516218999999999,0.017229061],"77824":[0.31524224899999997,0.32332153949999998],"34":[2.3475800000000001e-06,2.39514e-06],"10752":[0.006233349,0.0066785459999999987],"864":[7.8329679999999995e-05,8.0234173913043476e-05],"928":[8.5020999999999998e-05,8.8315129999999993e-05],"60":[3.8470300000000002e-06,4.0747000000000001e-06],"1152":[0.00012317099999999999,0.00012593120253164553],"40960":[0.088143404999999994,0.089869636000000003],"36":[2.3796699999999999e-06,2.64805e-06],"6144":[0.0020438589999999999,0.0021127580000000002],"4608":[0.00110575,0.0011271278750000003],"768":[7.0517000000000003e-05,7.9116999999999995e-05],"62":[4.2384200000000005e-06,4.2728699999999998e-06],"16384":[0.014378016,0.015269809000000001],"38":[2.6387857142857145e-06,2.7748999999999999e-06],"3968":[0.00079949136363636369,0.00085678999999999996],"131072":[0.97576340149999996,0.97997133000000003],"1344":[0.00014723399999999997,0.000153387],"73728":[0.284002584,0.28872350499999999],"64":[4.0680700000000005e-06,4.36963e-06],"118784":[0.75799414450000002,0.79936982150000002],"3072":[0.00055579699999999991,0.0005718530000000001],"1":[2.2809000000000003e-07,2.4088000000000002e-07],"1536":[0.00018748694339622645,0.00020365099999999995],"2":[2.4210999999999999e-07,2.4358999999999997e-07],"92":[6.8173300000000003e-06,6.8454699999999995e-06],"3":[2.8727e-07,3.0685000000000002e-07],"69632":[0.25207779499999999,0.25719340000000002],"4":[2.7866999999999999e-07,3.1334999999999998e-07],"68":[4.6454800000000001e-06,4.6786428571428567e-06],"5888":[0.0019061818000000001,0.0020783417500000005],"5":[3.1547000000000001e-07,3.1764999999999999e-07],"12288":[0.0081230199999999999,0.0084579709999999999],"27648":[0.040788055500000003,0.042444772000000006],"6":[3.3531e-07,3.3531999999999996e-07],"7":[3.2691000000000001e-07,3.5386999999999998e-07],"1920":[0.00025236099999999994,0.00025419376315789473],"1728":[0.00022293000000000001,0.00023383099999999996],"6912":[0.0025693606666666664,0.0026544819999999997],"8":[3.4752000000000003e-07,3.8114000000000004e-07],"992":[9.9108e-05,0.000102979],"9":[3.8645000000000002e-07,3.9496000000000004e-07],"96":[6.9271034482758625e-06,7.29848e-06],"47104":[0.116206424,0.118150334],"3456":[0.00063783599999999992,0.00063990599999999998],"10240":[0.0056437990000000014,0.0059680539999999987],"25600":[0.035027724500000017,0.035747017999999998],"65536":[0.22246506399999999,0.23478028750000002],"896":[8.4562999999999997e-05,8.7689999999999996e-05],"13824":[0.010164706500000001,0.011539525],"3840":[0.00077557216666666678,0.00078978100000000014],"1024":[0.00010458691578947371,0.0001066647666666667],"43008":[0.097823470500000023,0.103526796],"100":[6.6852352941176464e-06,6.7185300000000005e-06],"5376":[0.0015208210000000003,0.0016256650000000001],"19456":[0.020276120500000001,0.021480190999999999],"21504":[0.024764243999999998,0.0255813615],"10":[4.2371999999999999e-07,4.3454000000000003e-07],"81920":[0.34888577949999999,0.35777751950000003],"1216":[0.000132726,0.00014041684848484847],"11":[4.0911999999999995e-07,4.1316999999999999e-07],"6400":[0.0021961479999999998,0.0023754470000000001],"12":[4.3424999999999996e-07,4.3436000000000003e-07],"57344":[0.17152409950000003,0.179154961],"13":[4.8349000000000005e-07,5.0955000000000006e-07],"1408":[0.00016102299999999999,0.00017133577586206887],"1600":[0.00018013,0.00020152400000000007],"14":[5.0370000000000004e-07,5.2865000000000001e-07],"200":[1.4485349999999998e-05,1.4825359999999999e-05],"20480":[0.022509826,0.023409767000000001],"139264":[1.1115402329999999,1.1357014109999999],"15":[5.0661999999999997e-07,5.2671999999999999e-07],"40":[2.7914699999999999e-06,2.8718299999999997e-06],"120":[8.0541699999999995e-06,8.0694899999999989e-06],"112":[7.0378709677419359e-06,7.6298400000000005e-06],"16":[1.18014e-06,1.29776e-06],"104":[6.4172000000000002e-06,6.6963199999999994e-06],"17":[1.19427e-06,1.2300099999999999e-06],"42":[2.9348200000000004e-06,3.0533399999999999e-06],"7680":[0.003224668,0.0032445393333333334],"53248":[0.14733111400000001,0.15581585399999998],"18":[1.2983299999999999e-06,1.3000699999999999e-06],"13312":[0.0094788540000000018,0.010185300999999999],"3328":[0.00060166099999999986,0.00062659573333333338],"19":[1.2953500000000002e-06,1.4056100000000002e-06],"44":[3.1352000000000001e-06,3.2357600000000002e-06],"29696":[0.046709039000000008,0.047580892499999992],"31744":[0.052958652500000002,0.056441019500000009],"2688":[0.0004348004545454545,0.00045627800000000007],"46":[3.2463099999999996e-06,3.37186e-06],"49152":[0.12955546699999998,0.13245253800000001],"51200":[0.13734135,0.139869099],"72":[4.7574200000000001e-06,4.8828999999999994e-06],"3712":[0.0007156930000000001,0.00075740899999999969],"124":[8.6487246376811595e-06,9.1761199999999998e-06],"8704":[0.0041111920000000005,0.0041761089999999999],"106496":[0.58998397400000002,0.62004571200000003],"48":[3.4728800000000001e-06,3.5325399999999999e-06],"116":[7.4928333333333331e-06,7.9197600000000006e-06],"108":[7.2806399999999996e-06,7.3030899999999997e-06],"15872":[0.013652601,0.015365548999999997],"400":[2.9508333333333333e-05,3.0995999999999999e-05],"320":[2.6364999999999999e-05,2.6417680000000001e-05],"102400":[0.54287666599999995,0.56372045599999998],"76":[5.0617166666666669e-06,5.1560400000000005e-06],"240":[1.6597640000000001e-05,1.7829230000000001e-05],"304":[2.2734e-05,2.320027e-05],"45056":[0.10610889,0.11213644950000001],"232":[1.665007e-05,1.6895261538461539e-05],"5632":[0.0017366216,0.0018769677999999998],"160":[1.0906150000000001e-05,1.150615e-05],"224":[1.44685e-05,1.4857930000000001e-05],"23552":[0.02974079900000004,0.030950124000000002],"152":[1.048134e-05,1.0993019999999999e-05],"216":[1.5510750000000001e-05,1.6277500000000001e-05],"38912":[0.081501789999999991,0.082759692000000024],"144":[9.7148900000000001e-06,1.0459392857142856e-05],"208":[1.378383908045977e-05,1.5353599999999998e-05],"7168":[0.0027877933333333338,0.0028550083333333345],"136":[9.2233799999999991e-06,9.7711700000000002e-06],"2176":[0.00030679299999999992,0.00030838299999999996],"11776":[0.0076241690000000001,0.0077638339999999998],"128":[7.9626199999999987e-06,8.4409900000000003e-06],"63488":[0.20947537199999999,0.2193541755],"98304":[0.50046236749999995,0.51392988399999995],"122880":[0.80543667200000002,0.86201019800000001],"3200":[0.00056273541176470585,0.00060347600000000003],"59392":[0.182998365,0.19521917799999999],"155648":[1.6255613209999999,1.6787977789999999],"61440":[0.19867410100000005,0.20109444400000001],"2560":[0.00039382800000000004,0.000400863],"34816":[0.06413835499999998,0.064978196999999988],"4096":[0.00087442139999999982,0.00089853600000000013],"94208":[0.46593622950000002,0.4724874255],"5120":[0.0014031364285714285,0.001445708],"55296":[0.15957977800000001,0.16416751800000001],"512":[4.1640949999999993e-05,4.2376000000000002e-05],"15360":[0.012642861,0.013234002],"432":[3.3827699999999995e-05,3.4466820000000001e-05],"20":[1.3749899999999999e-06,1.41919e-06],"2944":[0.00049820500000000005,0.00050788933333333324],"352":[2.8102719999999999e-05,2.867816e-05],"416":[3.0470375e-05,3.3833289999999999e-05],"21":[1.4707199999999999e-06,1.4977100000000001e-06],"7936":[0.0034892355,0.003698088],"272":[1.9652829999999998e-05,2.010643e-05],"336":[2.4486978260869564e-05,2.7555909999999999e-05],"22":[1.5571428571428572e-06,1.68979e-06],"192":[1.374714e-05,1.468145e-05],"256":[1.8233999999999999e-05,1.8500999999999998e-05],"23":[1.6422900000000001e-06,1.6585399999999999e-06],"184":[1.3223639999999999e-05,1.3480110000000001e-05],"248":[1.760382e-05,1.8123037037037038e-05],"11264":[0.0068992899999999998,0.007381702999999999],"176":[1.187904e-05,1.2654929999999998e-05],"24":[1.6616800000000002e-06,1.78216e-06],"26624":[0.037516817000000001,0.040346091500000014],"168":[1.127728e-05,1.3057949999999999e-05],"126976":[0.85688129950000003,0.92919408400000003],"25":[1.7763999999999998e-06,1.8363000000000001e-06],"50":[3.3143499999999999e-06,3.4266100000000002e-06],"4864":[0.001214243,0.001275022],"2048":[0.00026008000000000004,0.00027262500000000014],"14848":[0.011984824,0.011989774999999999],"26":[1.79698e-06,1.8996e-06],"86016":[0.382536818,0.40178976449999998],"27":[1.9698599999999997e-06,1.9808300000000001e-06],"800":[7.1920000000000003e-05,7.2762000000000006e-05],"52":[3.3130699999999997e-06,3.4943700000000004e-06]}},{"title":"OrderedSet random insertions, reserving capacity","results":{"28":[4.9989999999999999e-06,5.1320000000000002e-06],"2432":[0.025728468000000004,0.027342440000000003],"29":[3.8670000000000004e-06,4.7700000000000001e-06],"704":[0.002176388,0.0021845699999999998],"54":[1.2197e-05,1.6171000000000002e-05],"640":[0.001780333,0.001786534],"7424":[0.23186369500000001,0.24289202100000001],"80":[2.7517000000000001e-05,3.7389999999999999e-05],"1792":[0.012998737,0.013604772999999997],"12800":[0.67953671900000001,0.69429375500000001],"480":[0.00091167800000000018,0.00098362200000000019],"544":[0.001227517,0.0012607919999999999],"608":[0.0015968790000000001,0.001633205],"56":[1.4902000000000001e-05,1.5885000000000001e-05],"464":[0.00084936400000000002,0.00090743500000000006],"58":[1.5362999999999998e-05,1.6603999999999999e-05],"1984":[0.016136465000000003,0.016339529999999998],"448":[0.00076958600000000016,0.00079700600000000006],"384":[0.00063843000000000005,0.00065457999999999988],"4352":[0.080457496000000003,0.083904581999999991],"84":[3.2443000000000001e-05,4.1292999999999999e-05],"368":[0.00060638399999999996,0.00065623399999999979],"2816":[0.035794560000000017,0.039067784000000008],"288":[0.00034555399999999998,0.00037394899999999994],"14336":[0.86877176700000003,0.93453423499999999],"88":[3.6952000000000001e-05,3.8964000000000002e-05],"1088":[0.0048831479999999995,0.0050930390000000006],"1280":[0.0072573440000000015,0.007343899000000001],"832":[0.002662148,0.0026993770000000002],"9728":[0.43285554699999995,0.46140907499999995],"1472":[0.010043787,0.010777102],"672":[0.0019932819999999999,0.001993599],"736":[0.0025262409999999994,0.0025455720000000003],"2304":[0.022633165,0.022710840999999999],"576":[0.0014038920000000001,0.001409656],"8192":[0.29177136100000001,0.30628336299999998],"1664":[0.010893089,0.011471886000000002],"496":[0.00094369699999999996,0.0010450350000000001],"6656":[0.18291006500000001,0.18522149099999996],"30":[4.4170000000000002e-06,5.9379999999999997e-06],"1856":[0.01357066,0.014418691000000001],"31":[4.4689999999999999e-06,4.8930000000000004e-06],"9216":[0.38074465499999999,0.406124337],"32":[5.5670000000000002e-06,7.2429999999999999e-06],"3584":[0.052762219999999992,0.053296648999999995],"960":[0.0037461270000000006,0.0039919740000000006],"34":[6.9179999999999997e-06,6.9399999999999996e-06],"10752":[0.55276957400000004,0.59485374800000002],"864":[0.0029706949999999998,0.003109896],"928":[0.003436967,0.003442329],"60":[1.7107000000000001e-05,1.8218000000000001e-05],"1152":[0.0055143579999999987,0.0059779350000000011],"36":[6.584e-06,6.9129999999999997e-06],"6144":[0.19003334199999999,0.195823949],"4608":[0.093016345,0.096670857999999998],"768":[0.0028366509999999999,0.0028780580000000002],"62":[1.6490999999999998e-05,2.1917e-05],"38":[7.1930000000000004e-06,7.2280000000000001e-06],"3968":[0.065405431,0.069552788999999962],"1344":[0.0079975099999999993,0.008305995],"64":[1.685e-05,2.0956000000000001e-05],"3072":[0.046771343,0.048731655000000006],"1":[4.9999999999999998e-08,5.2000000000000002e-08],"1536":[0.010823741,0.011651699],"2":[6.4000000000000004e-08,6.7000000000000004e-08],"92":[3.9400000000000002e-05,4.1520999999999998e-05],"3":[8.0000000000000002e-08,9.0999999999999994e-08],"4":[9.9999999999999995e-08,9.9999999999999995e-08],"68":[1.8603000000000001e-05,2.2498e-05],"5888":[0.168721867,0.17952132800000001],"5":[1.11e-07,1.14e-07],"12288":[0.76662378399999997,0.79932445900000004],"6":[1.29e-07,1.55e-07],"7":[1.4700000000000001e-07,1.54e-07],"1920":[0.014661925000000001,0.015024449],"1728":[0.012147973000000003,0.012699736999999999],"6912":[0.20217058600000001,0.20854351199999999],"8":[1.6500000000000001e-07,1.7599999999999999e-07],"992":[0.0041031610000000001,0.0041645429999999997],"9":[1.9000000000000001e-07,1.99e-07],"96":[3.9626999999999999e-05,4.6045999999999999e-05],"3456":[0.049032737,0.051033355999999995],"10240":[0.50083109299999995,0.522391524],"896":[0.00317351,0.0034044569999999996],"13824":[0.81045577000000002,0.81262445500000002],"3840":[0.060975501999999994,0.062823519999999994],"1024":[0.0041597960000000003,0.0043895159999999996],"100":[4.0759000000000001e-05,4.4070000000000003e-05],"5376":[0.13447001,0.13777267200000001],"10":[2.17e-07,2.1899999999999999e-07],"1216":[0.0062544690000000003,0.0067123529999999999],"11":[2.1400000000000001e-07,2.1799999999999999e-07],"6400":[0.167980933,0.173649468],"12":[2.53e-07,2.65e-07],"13":[2.6199999999999999e-07,2.8599999999999999e-07],"1408":[0.0088865869999999996,0.0097894600000000033],"1600":[0.010024012000000001,0.011097432000000001],"14":[2.96e-07,3.1399999999999998e-07],"200":[0.000169798,0.000171857],"15":[3.1100000000000002e-07,3.15e-07],"40":[8.7919999999999998e-06,9.0240000000000003e-06],"120":[6.3145999999999995e-05,6.7242000000000004e-05],"112":[5.3134999999999999e-05,5.6580999999999999e-05],"16":[1.6610000000000001e-06,1.843e-06],"104":[4.6162999999999998e-05,5.1711e-05],"17":[1.9580000000000001e-06,2.4099999999999998e-06],"42":[8.8459999999999997e-06,1.0053e-05],"7680":[0.24988627399999999,0.25666145600000001],"18":[2.1749999999999999e-06,2.345e-06],"13312":[0.75211537699999997,0.76739638200000004],"3328":[0.043958271,0.047587288999999991],"19":[2.2929999999999999e-06,2.8930000000000001e-06],"44":[9.7839999999999998e-06,1.0424999999999999e-05],"2688":[0.033677517999999976,0.033788252999999976],"46":[1.2992e-05,1.3359e-05],"72":[2.0619999999999999e-05,2.7277e-05],"3712":[0.056974344999999996,0.057326547000000005],"124":[6.7434000000000005e-05,6.7485999999999997e-05],"8704":[0.33615469599999998,0.34311802899999999],"48":[1.2656999999999999e-05,1.3675999999999999e-05],"116":[5.3888999999999999e-05,5.5021000000000001e-05],"108":[5.1631000000000001e-05,5.1647999999999997e-05],"400":[0.00063414400000000011,0.00063770599999999982],"320":[0.00043961800000000002,0.00044899300000000007],"76":[2.8807999999999999e-05,3.0571999999999998e-05],"240":[0.00023878699999999999,0.000247989],"304":[0.000391061,0.00039853399999999998],"232":[0.00021726300000000004,0.00023185099999999999],"5632":[0.153055741,0.16117289200000001],"160":[0.00011650399999996179,0.00012623800000000001],"224":[0.00020262499999999998,0.00020655099999999999],"152":[9.8533e-05,0.000104133],"216":[0.00017255700000000002,0.00019011599999999997],"144":[8.7917000000000005e-05,9.3653999999999995e-05],"208":[0.00016572599999999999,0.00016612999999999998],"7168":[0.21707071999999999,0.22019424100000001],"136":[7.8285e-05,8.3405999999999994e-05],"2176":[0.019549034999999999,0.019865307000000002],"11776":[0.69556283699999999,0.70691622099999996],"128":[7.4731e-05,8.0223999999999996e-05],"3200":[0.040991802000000008,0.043106777999999998],"2560":[0.028679315,0.030757066],"4096":[0.071509287000000046,0.07266778900000001],"5120":[0.1222187,0.13013876399999999],"512":[0.001093522,0.001144134],"15360":[1.0248306140000001,1.0653628639999999],"432":[0.00071484499999999987,0.00072107900000000001],"20":[2.1950000000000002e-06,2.497e-06],"2944":[0.040628422000000004,0.040822487000000005],"352":[0.00054687699999999998,0.00054968499999999963],"416":[0.00069316100000000019,0.0007133450000000001],"21":[2.367e-06,2.9399999999999998e-06],"7936":[0.26730508399999997,0.272670362],"272":[0.00030960100000000001,0.000320969],"336":[0.00049558899999999984,0.00051045099999999998],"22":[2.5560000000000002e-06,2.8849999999999999e-06],"192":[0.00016186399999999998,0.00017118399999999998],"256":[0.00027249399999999997,0.000283114],"23":[3.0529999999999998e-06,3.3349999999999998e-06],"184":[0.00015667400000000001,0.00016706099999999998],"248":[0.00025091700000000002,0.00027897000000000002],"11264":[0.63010213900000001,0.64958451900000003],"176":[0.00013992399999999998,0.00015836600000000001],"24":[3.8739999999999997e-06,4.0790000000000002e-06],"168":[0.00013574999999999997,0.000166167],"25":[3.8190000000000002e-06,3.839e-06],"50":[1.1535000000000001e-05,1.3947999999999999e-05],"4864":[0.105856177,0.11246443],"2048":[0.017201965,0.017717956999999999],"14848":[0.95507614699999999,0.96298428300000005],"26":[4.0040000000000001e-06,4.0239999999999999e-06],"27":[4.9400000000000001e-06,4.9660000000000004e-06],"800":[0.0024850200000000001,0.0026575979999999997],"52":[1.2204e-05,1.4076999999999999e-05]}},{"title":"OrderedSet remove","results":{"28":[3.3569999999999998e-06,4.1670000000000001e-06],"2432":[0.024435684000000003,0.02643541700000001],"29":[3.2499999999999998e-06,3.5439999999999999e-06],"704":[0.0021088820000000003,0.0021569720000000001],"54":[1.3653e-05,1.3971000000000001e-05],"640":[0.0017769680000000003,0.001803825],"7424":[0.22347813499999999,0.240941932],"80":[2.7651e-05,3.4909000000000001e-05],"1792":[0.012781645999999999,0.012820814],"12800":[0.66974701199999997,0.67458053500000004],"480":[0.000898239,0.000973536],"544":[0.0011948939999999997,0.00119994],"608":[0.001559108,0.001597719],"56":[1.3378e-05,1.5597999999999999e-05],"464":[0.00091313899999999999,0.00094619699999999997],"58":[1.5764e-05,1.5832e-05],"1984":[0.015028579,0.015652139000000002],"448":[0.000789524,0.00082694799999999988],"384":[0.00065054499999999988,0.00067655099999999974],"4352":[0.077126923999999999,0.079630760000000037],"84":[3.7354000000000002e-05,4.0014e-05],"368":[0.00060669100000000002,0.00061636500000000001],"2816":[0.036723836999999995,0.037714813999999999],"288":[0.00031139500000000001,0.00041029499999999992],"14336":[0.85201370700000001,0.87490339000000006],"88":[4.0975e-05,4.1933e-05],"1088":[0.004772249000000001,0.0048083749999999993],"1280":[0.0069027630000000019,0.0071145080000000003],"832":[0.0025820829999999998,0.0027710859999999994],"9728":[0.42362524600000001,0.42970097800000001],"1472":[0.010450276,0.010572328000000001],"672":[0.001914603,0.0019814490000000001],"736":[0.0024240920000000001,0.0025736829999999998],"2304":[0.022032527,0.022159033000000002],"576":[0.0012944850000000002,0.001415616],"8192":[0.27413407400000001,0.290997222],"1664":[0.010540343000000001,0.011234181000000001],"496":[0.00099478299999999995,0.00099858200000000003],"6656":[0.17666782,0.18130537899999999],"30":[3.5939999999999998e-06,3.7680000000000002e-06],"1856":[0.013229922,0.013311135],"31":[3.6729999999999998e-06,3.6990000000000001e-06],"9216":[0.36661239400000001,0.38173989200000003],"32":[3.9260000000000002e-06,4.1860000000000002e-06],"3584":[0.050410042000000009,0.050742248999999996],"960":[0.0036326520000000001,0.003797871],"34":[4.9400000000000001e-06,6.0140000000000004e-06],"10752":[0.53385236300000005,0.55054066699999993],"864":[0.002930836,0.0030241909999999994],"928":[0.0033700509999999998,0.00348424],"60":[1.5532e-05,1.8323999999999999e-05],"1152":[0.0051488230000000003,0.0054234800000000005],"36":[5.993e-06,6.1999999999999999e-06],"6144":[0.18113005400000001,0.19151706099999999],"4608":[0.087664632000000006,0.09248229999999999],"768":[0.0028643150000000005,0.0029864690000000007],"62":[2.0112999999999999e-05,2.1772000000000001e-05],"38":[5.5099999999999998e-06,7.8499999999999994e-06],"3968":[0.062559581000000031,0.065553007999999996],"1344":[0.007626107,0.0081353730000000013],"64":[1.5064e-05,1.9046999999999999e-05],"3072":[0.045533086,0.045850182000000003],"1":[1.66e-07,1.7800000000000001e-07],"1536":[0.011302017000000001,0.011356840999999999],"2":[1.73e-07,1.8300000000000001e-07],"92":[4.6832999999999997e-05,5.1118000000000001e-05],"3":[1.9000000000000001e-07,2.05e-07],"4":[2.1299999999999999e-07,2.1400000000000001e-07],"68":[2.0347e-05,2.2935999999999999e-05],"5888":[0.16367306199999998,0.16733616400000001],"5":[1.99e-07,1.99e-07],"12288":[0.74819355799999998,0.77361145399999998],"6":[2.2000000000000001e-07,2.2700000000000001e-07],"7":[2.1400000000000001e-07,2.1500000000000001e-07],"1920":[0.01429801,0.014540169],"1728":[0.011536860999999957,0.012062782999999999],"6912":[0.19231833700000001,0.20096001799999996],"8":[2.2600000000000001e-07,2.35e-07],"992":[0.0039382940000000002,0.0041693429999999998],"9":[3.4799999999999999e-07,3.5199999999999998e-07],"96":[4.1619000000000003e-05,4.3751000000000002e-05],"3456":[0.047574753999999997,0.048645381000000001],"10240":[0.47962359200000004,0.51150021099999998],"896":[0.0029552950000000001,0.0032338710000000006],"13824":[0.784056015,0.79191012299999997],"3840":[0.059173048999999998,0.061279996999999996],"1024":[0.0041868389999999995,0.0042766120000000008],"100":[4.4249999999999998e-05,4.7964999999999999e-05],"5376":[0.13037486300000001,0.13285330299999998],"10":[4.6899999999999998e-07,5.4899999999999995e-07],"1216":[0.006177554,0.0064185980000000002],"11":[5.5199999999999997e-07,6.4499999999999997e-07],"6400":[0.165290518,0.171771744],"12":[7.1500000000000004e-07,8.4300000000000002e-07],"13":[9.2099999999999995e-07,9.47e-07],"1408":[0.0090824930000000005,0.0091316810000000026],"1600":[0.0095886139999999988,0.010291941000000002],"14":[1.1379999999999999e-06,1.319e-06],"200":[0.000168586,0.000183112],"15":[1.2130000000000001e-06,1.468e-06],"40":[6.7360000000000004e-06,8.4069999999999993e-06],"120":[6.4274000000000002e-05,7.7494e-05],"112":[5.9623000000000002e-05,6.0374000000000002e-05],"16":[1.584e-06,1.64e-06],"104":[5.0628999999999999e-05,5.5906999999999999e-05],"17":[1.1999999999999999e-06,1.9420000000000002e-06],"42":[7.5809999999999999e-06,9.5100000000000004e-06],"7680":[0.238637879,0.25135527499999999],"18":[1.7039999999999999e-06,1.9659999999999999e-06],"13312":[0.716967138,0.760036516],"3328":[0.043197579999999999,0.047379727000000003],"19":[1.951e-06,3.095e-06],"44":[8.7870000000000007e-06,1.1e-05],"2688":[0.031374895,0.033245779000000017],"46":[9.9830000000000008e-06,1.2904e-05],"72":[2.0313999999999999e-05,2.6448000000000002e-05],"3712":[0.055173804,0.055463287999999999],"124":[7.2384000000000004e-05,7.4204999999999999e-05],"8704":[0.32052403899999998,0.33163437400000001],"48":[1.0431000000000001e-05,1.2986000000000001e-05],"116":[5.6536000000000002e-05,6.3064000000000005e-05],"108":[4.9431999999999997e-05,5.0210000000000002e-05],"15872":[1.0586867170000001],"400":[0.00062482100000000001,0.00072136800000000023],"320":[0.00045531599999999999,0.00046689999999999996],"76":[2.8418000000000001e-05,3.2021999999999999e-05],"240":[0.00022257900000000001,0.00025925900000000002],"304":[0.000387532,0.00038965400000000002],"232":[0.00020907,0.00022027799999999997],"5632":[0.14779102599999999,0.15315843400000001],"160":[0.000121086,0.00012509200000000004],"224":[0.000213635,0.00022743699999999998],"152":[0.000101872,0.00011614500000000001],"216":[0.00019664000000000001,0.00020416],"144":[8.8012999999999999e-05,0.00010614399999999999],"208":[0.00017214699999999999,0.00018139800000000001],"7168":[0.20594114900000005,0.21081229700000004],"136":[8.5706999999999998e-05,8.5711000000000007e-05],"2176":[0.019046023999999995,0.019115132],"11776":[0.68400007799999996,0.70765344299999999],"128":[7.3578000000000006e-05,7.6707999999999998e-05],"3200":[0.039605500000000002,0.041943940999999998],"2560":[0.027073593,0.030264868],"4096":[0.066362753999999996,0.069848021999999996],"5120":[0.116534389,0.12129778099999999],"512":[0.0010424880000000001,0.001107486],"15360":[0.98692302700000001,1.0171742560000001],"432":[0.000705213,0.00077198100000000003],"20":[2.1900000000000002e-06,3.0929999999999999e-06],"2944":[0.04094445,0.041318737000000001],"352":[0.000544551,0.00058206700000000002],"416":[0.00068051699999999973,0.00069087199999999982],"21":[2.4569999999999999e-06,3.6270000000000002e-06],"7936":[0.25716599600000001,0.265830497],"272":[0.00031155999999999995,0.00032840099999999998],"336":[0.00052032599999999999,0.00055630300000000007],"22":[2.5940000000000001e-06,2.8990000000000001e-06],"192":[0.00018774499999999999,0.00019269900000000001],"256":[0.00027188599999999994,0.00027597599999999999],"23":[3.0450000000000001e-06,3.0709999999999999e-06],"184":[0.00016057999999999998,0.00018082999999999999],"248":[0.00026805299999999998,0.00027979999999999997],"11264":[0.59974075399999993,0.61383921399999997],"176":[0.00013955099999999997,0.00014948500000000001],"24":[3.242e-06,3.9219999999999999e-06],"168":[0.000149228,0.000177076],"25":[2.2249999999999999e-06,2.565e-06],"50":[1.2673999999999999e-05,1.2777e-05],"4864":[0.10426033,0.10662885900000001],"2048":[0.015990674,0.016924363000000001],"14848":[0.92782346199999999,0.95697921500000005],"26":[2.6919999999999998e-06,2.8119999999999999e-06],"27":[2.2630000000000002e-06,3.0199999999999999e-06],"800":[0.0024087190000000001,0.0025071589999999997],"52":[1.2561999999999999e-05,1.3186e-05]}},{"title":"OrderedSet removeLast","results":{"28":[1.0139999999999999e-06,1.3090000000000001e-06],"34":[1.5740000000000001e-06,1.6869999999999999e-06],"29":[1.1000000000000001e-06,1.19e-06],"40":[2.215e-06,2.2630000000000002e-06],"17408":[0.0023081900000000003,0.0023887840000000001],"1472":[0.00019282999999999998,0.000204558],"112":[1.0379e-05,1.1117999999999999e-05],"1376256":[0.26964832399999999,0.36644237199999996],"5242880":[1.4877309030000001,1.509334414],"36":[1.8929999999999999e-06,2.0430000000000002e-06],"42":[2.356e-06,3.1700000000000001e-06],"11534336":[3.7038544579999999,3.9663631719999999],"114688":[0.016150206,0.017147706000000002],"144":[1.3896999999999999e-05,1.451e-05],"38":[1.7519999999999999e-06,2.1129999999999999e-06],"240":[2.5060999999999999e-05,2.9638e-05],"9216":[0.001172965,0.001176833],"44":[2.6570000000000001e-06,2.881e-06],"1664":[0.00020750900000000004,0.00022154299999999999],"196608":[0.030908721,0.033048300000000003],"155648":[0.021795063,0.022253629],"2816":[0.00035553099999999997,0.000380873],"50":[3.3730000000000001e-06,3.6279999999999998e-06],"2359296":[0.52000668100000003,0.52027000699999992],"46":[2.9289999999999998e-06,3.3359999999999999e-06],"176":[1.7878999999999999e-05,1.8261e-05],"52":[3.737e-06,4.8389999999999997e-06],"272":[2.8581999999999998e-05,2.8940000000000001e-05],"116":[1.0488e-05,1.1609e-05],"47104":[0.0065439809999999999,0.0065500939999999994],"6912":[0.00086038199999999981,0.00093981000000000012],"1856":[0.000229562,0.000240943],"48":[3.0989999999999999e-06,3.6689999999999999e-06],"2097152":[0.42475839800000004,0.46063814600000003],"54":[4.2440000000000004e-06,4.2549999999999999e-06],"2031616":[0.402681872,0.43035447100000002],"43008":[0.0057145439999999994,0.0060600279999999994],"60":[4.5510000000000001e-06,4.6280000000000004e-06],"30720":[0.0039564140000000001,0.004056222],"56":[4.189e-06,4.4259999999999996e-06],"62":[4.617e-06,5.5709999999999997e-06],"58":[4.4610000000000001e-06,4.5820000000000003e-06],"3014656":[0.80341267699999996,0.89879299999999995],"64":[4.8169999999999998e-06,5.48e-06],"8388608":[2.4983195579999999,2.5796437819999998],"29696":[0.0038525080000000001,0.003950711],"216":[2.2823000000000002e-05,2.3836999999999999e-05],"106496":[0.015121973,0.015428875],"72":[5.4029999999999998e-06,6.1399999999999997e-06],"442368":[0.069146705000000003,0.073469269000000018],"147456":[0.020193704,0.022793714],"4456448":[1.1375176220000001,1.1578268],"63488":[0.00830585,0.0086527400000000008],"38912":[0.0050283229999999995,0.0052258320000000006],"68":[4.9529999999999998e-06,5.879e-06],"188416":[0.028414406,0.032576499999999994],"248":[2.7138e-05,2.8870999999999999e-05],"80":[6.9820000000000002e-06,7.622e-06],"2560":[0.000304636,0.00031230099999999996],"34816":[0.0044225749999999998,0.0046181169999999997],"3712":[0.000457,0.00046246699999999999],"3538944":[0.880125826,0.91854677200000001],"76":[6.2670000000000003e-06,6.8940000000000004e-06],"4194304":[1.056775813,1.085421414],"851968":[0.1504163,0.18069105699999999],"4096":[0.00050294999999999973,0.00052887599999999996],"59392":[0.0077306119999999996,0.0085756169999999989],"84":[7.5900000000000002e-06,8.4300000000000006e-06],"3276800":[0.81630376399999993,0.82925563599999996],"55296":[0.0073503610000000014,0.0073656169999999997],"688128":[0.113678128,0.14980464499999999],"8192":[0.0010193089999999999,0.001106147],"10240":[0.001291033,0.0013881360000000001],"15872":[0.0021318419999999997,0.0021421260000000003],"92":[8.9120000000000004e-06,1.0171e-05],"26624":[0.0034992490000000007,0.0035581090000000003],"1792":[0.00021296799999999996,0.000249542],"11776":[0.0016356000000000003,0.0016734709999999999],"2944":[0.00036353699999999999,0.00041610099999999999],"88":[7.9100000000000005e-06,9.1509999999999993e-06],"22528":[0.0031103559999999995,0.0031699640000000008],"1245184":[0.23070981500000001,0.28541111499999999],"15728640":[5.1990133949999997,5.4730322310000004],"96":[8.7749999999999998e-06,1.0298e-05],"1984":[0.00024983900000000002,0.00025365099999999992],"139264":[0.019267821000000004,0.019598938999999999],"475136":[0.073296494000000031,0.083147192999999994],"13631488":[4.6242422229999995,4.7129747919999998],"416":[4.8010000000000003e-05,4.9069000000000001e-05],"928":[0.000113074,0.000115337],"512":[6.0359999999999998e-05,6.0863000000000003e-05],"18432":[0.0023961060000000007,0.00266958],"16777216":[5.6020212049999998],"9728":[0.0012393370000000001,0.0013188290000000001],"1769472":[0.369550926,0.37797866400000002],"1703936":[0.34274481699999998,0.35853457499999997],"2048":[0.00024179599999999999,0.00028081699999999994],"14336":[0.0018659080000000001,0.0018778969999999999],"448":[4.8622000000000003e-05,5.4249000000000002e-05],"5505024":[1.5624597759999999,1.588683847],"544":[6.0946999999999998e-05,6.7657000000000006e-05],"221184":[0.031980478,0.033884075],"90112":[0.01258768,0.013031341],"640":[7.9606999999999999e-05,8.6558999999999996e-05],"12800":[0.001779568,0.0017906999999999999],"262144":[0.038109740000000003,0.040242902999999997],"589824":[0.091583322999999994,0.120275891],"884736":[0.15477776500000001,0.18912496500000001],"6144":[0.00086940399999999962,0.00088767799999999993],"1088":[0.00012557000000000003,0.00012861399999999999],"576":[6.3476e-05,7.7775999999999995e-05],"160":[1.6093999999999999e-05,1.7258999999999999e-05],"672":[7.6977999999999994e-05,8.6748000000000004e-05],"8912896":[2.7171887290000001,2.8143211949999998],"100":[9.0589999999999992e-06,9.2879999999999998e-06],"507904":[0.078844019999999987,0.095638694999999996],"3840":[0.00045793799999999991,0.00049785599999999997],"192":[2.1736e-05,2.1820000000000001e-05],"376832":[0.061361026999999999,0.068367947000000012],"98304":[0.015756469000000002,0.016732314000000005],"5376":[0.00072850499999999995,0.000729541],"94208":[0.013420812000000001,0.014134552999999999],"81920":[0.010950253,0.011291371999999999],"3407872":[0.84153803500000002,0.87266827999999996],"104":[9.8209999999999997e-06,1.0815000000000001e-05],"122880":[0.016752428,0.017091863999999995],"200":[2.0724e-05,2.4116000000000001e-05],"163840":[0.023723522,0.024221279000000002],"4063232":[1.0205897349999999,1.031935445],"5767168":[1.7122834769999999,1.7301611509999999],"12582912":[4.3336359599999996,7.9683630389999998],"1600":[0.000198381,0.00020451199999999996],"136":[1.2266000000000001e-05,1.4212999999999999e-05],"232":[2.4434e-05,2.5806e-05],"7077888":[2.1077817799999998,2.4718620140000001],"86016":[0.011807776000000001,0.012002417],"31744":[0.0040162819999999995,0.0043090130000000004],"168":[1.7606999999999999e-05,2.1501999999999998e-05],"622592":[0.099170291999999979,0.11706987999999996],"108":[9.2960000000000004e-06,9.3950000000000007e-06],"327680":[0.050135130999999986,0.053114039000000002],"2176":[0.00026699799999999995,0.00028510199999999997],"3328":[0.00041854299999999995,0.00048018000000000003],"1":[8.0000000000000002e-08,8.4999999999999994e-08],"2":[8.3000000000000002e-08,8.7999999999999994e-08],"3":[8.6000000000000002e-08,9.0999999999999994e-08],"4":[9.0999999999999994e-08,1.01e-07],"7424":[0.00094405900000000002,0.0010769600000000001],"5":[9.5000000000000004e-08,9.5999999999999999e-08],"23552":[0.0032664180000000001,0.0034186759999999998],"6":[9.6999999999999995e-08,1.1000000000000001e-07],"61440":[0.0082452849999999998,0.0082747490000000014],"491520":[0.075816421999999994,0.092264111999999981],"77824":[0.010578238,0.010581231999999999],"7":[1.06e-07,1.11e-07],"8":[1.08e-07,1.1600000000000001e-07],"208":[2.1661000000000001e-05,2.1987000000000001e-05],"9":[1.6e-07,2.1299999999999999e-07],"73728":[0.0097628290000000024,0.010209783],"304":[3.3628999999999999e-05,3.7561000000000002e-05],"400":[4.4876000000000002e-05,4.8841000000000002e-05],"1310720":[0.25418436500000002,0.31466234100000001],"336":[3.6060999999999999e-05,4.0197000000000002e-05],"3670016":[0.91035394699999994,0.95677873499999999],"6656":[0.00086027899999999993,0.00088863099999999997],"15360":[0.0020044770000000002,0.0021006109999999996],"432":[4.9279e-05,4.9679000000000003e-05],"950272":[0.16526492800000003,0.21571897500000004],"655360":[0.109354359,0.139015588],"69632":[0.0090668820000000001,0.0092402660000000005],"11264":[0.001480421,0.0015745710000000003],"2752512":[0.66558696799999995,0.67053160700000003],"8126464":[2.5216287990000001,2.596642868],"27648":[0.0037592429999999998,0.003770738],"368":[4.2080999999999999e-05,4.6714e-05],"65536":[0.0085282959999999977,0.0089300319999999992],"16252928":[5.3746193250000003,5.514348697],"464":[5.4926000000000002e-05,5.5810999999999998e-05],"1015808":[0.17763679399999999,0.23353285899999998],"3072":[0.00043094300000000015,0.00043234099999999999],"110592":[0.015361527,0.016837547000000001],"237568":[0.034350025000000006,0.038967351999999997],"278528":[0.040730301999999996,0.042792577000000005],"496":[5.6280999999999999e-05,5.9527000000000001e-05],"13107200":[4.448097228,4.8252204870000002],"9961472":[3.0723644910000001,3.4573283780000001],"5888":[0.0007660350000000002,0.00083061799999999998],"11010048":[3.4540393979999999,3.5613041660000002],"1920":[0.000235147,0.00025100799999999999],"2490368":[0.55159464599999997,0.59222032899999999],"19456":[0.0025690819999999994,0.0026238980000000004],"57344":[0.0075462000000000003,0.0083492389999999996],"1179648":[0.21702705899999999,0.269952315],"4718592":[1.2707588620000001,1.271689391],"360448":[0.056013937,0.058935830999999994],"1572864":[0.348083066,0.36917941300000001],"53248":[0.0073725369999999985,0.0074742160000000005],"3456":[0.00042233199999999993,0.00049481799999999984],"40960":[0.005273944,0.0054246060000000002],"4608":[0.00055853400000000007,0.00058295799999999996],"13824":[0.0017955499999999999,0.0018235720000000001],"819200":[0.14225675099999999,0.1683142],"983040":[0.17344132000000001,0.222018839],"8704":[0.0010932310000000005,0.001158884],"120":[1.1578e-05,1.1590000000000001e-05],"1024":[0.000116056,0.00012580600000000001],"49152":[0.0070297600000000003,0.0072100490000000005],"524288":[0.082197882999999958,0.106980533],"45056":[0.006066503,0.0062836890000000003],"229376":[0.033261790000000006,0.038014218000000002],"2688":[0.00034084000000000002,0.00039136600000000003],"152":[1.4073999999999999e-05,1.6234000000000001e-05],"5120":[0.00063058500000000002,0.00068721100000000007],"1507328":[0.31720732499999998,0.418481875],"1216":[0.00015014,0.00016532999999999999],"1966080":[0.40208427099999999,0.46628029400000004],"1900544":[0.38882055500000001,0.41842153199999998],"184":[1.791e-05,2.4341e-05],"7936":[0.0009649639999999999,0.0010142],"3801088":[0.95269912999999995,0.96612409700000002],"6815744":[2.049967944,2.3676152510000001],"124":[1.2266000000000001e-05,1.2709e-05],"102400":[0.014403681,0.015547113],"311296":[0.046502965,0.048998302000000007],"1408":[0.000170791,0.00017696700000000004],"393216":[0.064938640000000006,0.069543978000000034],"4352":[0.00053888599999999992,0.000567729],"6553600":[2.085638866,2.3886061930000002],"20480":[0.0026484879999999996,0.0027300459999999999],"608":[7.0743999999999999e-05,7.3281000000000005e-05],"2228224":[0.47810926799999998,0.48491647700000001],"36864":[0.0047626500000000002,0.0049657859999999998],"704":[8.2989000000000001e-05,8.9290999999999996e-05],"720896":[0.122011115,0.159279752],"800":[9.6576999999999994e-05,0.000101241],"2621440":[0.60727325199999993,0.67210263999999997],"425984":[0.066873768,0.073145235000000003],"32768":[0.0041779770000000011,0.004358476],"12058624":[4.0110780410000002,4.1620136419999998],"128":[1.198e-05,1.278e-05],"180224":[0.027108847000000002,0.027389701000000006],"224":[2.3691000000000001e-05,2.5088000000000001e-05],"736":[9.6281999999999997e-05,9.6361999999999997e-05],"320":[3.7267000000000001e-05,3.7425000000000002e-05],"557056":[0.086178356999999983,0.099784294000000023],"832":[0.00010045900000000001,0.000104812],"9437184":[2.8778273840000002,3.232451271],"3584":[0.00043410700000000009,0.00048116599999999999],"6291456":[2.031246522,2.058401779],"256":[2.7413e-05,2.8501999999999999e-05],"15204352":[5.0486867609999999,5.509593722],"28672":[0.0036455949999999993,0.003882141],"768":[9.4198999999999997e-05,0.000104422],"212992":[0.031793558,0.031845415000000044],"864":[0.000108272,0.000115296],"352":[4.1452999999999998e-05,4.3096000000000002e-05],"253952":[0.036556425000000004,0.038151876000000001],"960":[0.000110488,0.000121767],"24576":[0.0035142909999999992,0.003610912999999999],"7680":[0.00096243900000000005,0.0010168389999999999],"294912":[0.043247147999999999,0.044770119000000011],"1048576":[0.18470081399999999,0.24350589600000005],"10485760":[3.2760493290000001,3.347369236],"344064":[0.053992426000000003,0.054246937000000009],"288":[3.1022999999999998e-05,3.3609999999999998e-05],"1152":[0.00014239399999999998,0.000149223],"384":[4.5927999999999998e-05,5.1465999999999998e-05],"2304":[0.00027255900000000007,0.00029922799999999991],"896":[0.000107712,0.00011136100000000001],"480":[5.4521000000000002e-05,5.7096999999999999e-05],"1441792":[0.28873954600000001,0.37478720700000001],"992":[0.00012289000000000001,0.00012953799999999998],"3968":[0.00051155599999999992,0.00052319599999999997],"6400":[0.000834716,0.0008814789999999999],"1344":[0.00016116700000000001,0.00018280400000000001],"126976":[0.01732831,0.019593537000000001],"2883584":[0.71777196899999995,0.76839281700000006],"753664":[0.129959458,0.165222494],"16384":[0.0020727560000000007,0.00222857],"131072":[0.017911445000000008,0.019589371000000005],"458752":[0.071250796000000019,0.090062645000000011],"172032":[0.024864737999999997,0.02654403],"12288":[0.0017059080000000001,0.001909771],"14680064":[4.9324022000000003,9.4089644280000009],"1536":[0.000199488,0.00021630299999999999],"25600":[0.0033995259999999991,0.0035560379999999996],"1835008":[0.36026304100000001,0.37606212999999999],"10752":[0.001424872,0.0014366090000000001],"21504":[0.0028791339999999998,0.0030142040000000004],"7602176":[2.2003657040000002,2.288845899],"5632":[0.00074669800000000007,0.000774974],"10":[2.5499999999999999e-07,2.6100000000000002e-07],"3145728":[0.83479552099999998,0.90296950900000006],"245760":[0.035654775999999999,0.036122650000000006],"1728":[0.00020851300000000001,0.00022642799999999995],"11":[3.0400000000000002e-07,3.1699999999999999e-07],"1114112":[0.200714907,0.25314207],"12":[3.9200000000000002e-07,4.0499999999999999e-07],"7340032":[2.1939286230000001,2.5455784490000002],"7168":[0.00090702899999999984,0.00091172500000000006],"13":[4.8100000000000003e-07,5.3600000000000004e-07],"6029312":[1.8637664519999999,1.874934613],"14":[5.7800000000000001e-07,6.4899999999999995e-07],"3200":[0.00039376400000000011,0.00041013299999999992],"20":[1.0020000000000001e-06,1.158e-06],"204800":[0.029812746000000001,0.030525760000000002],"15":[6.2699999999999999e-07,6.9599999999999999e-07],"13312":[0.0017217530000000001,0.001802887],"4980736":[1.3600646919999999,1.372179788],"118784":[0.016324401000000002,0.017260347000000002],"51200":[0.0069318799999999988,0.0072401399999999991],"16":[7.2699999999999999e-07,7.8599999999999997e-07],"21":[1.296e-06,1.4759999999999999e-06],"917504":[0.15955936300000001,0.20230696000000001],"22":[1.319e-06,1.556e-06],"4864":[0.00061152800000000007,0.00062528099999999999],"17":[9.8100000000000001e-07,1.031e-06],"14848":[0.0019893549999999999,0.0020376789999999997],"23":[1.3459999999999999e-06,1.4759999999999999e-06],"786432":[0.14240564,0.181945044],"18":[7.7700000000000004e-07,9.5099999999999998e-07],"1638400":[0.33139154599999998,0.34206019799999998],"7864320":[2.3491214129999998,2.4101771090000002],"24":[1.4559999999999999e-06,1.5e-06],"14155776":[4.7455980450000004,4.9221966439999996],"19":[9.2800000000000005e-07,1.3909999999999999e-06],"30":[1.2130000000000001e-06,1.2419999999999999e-06],"25":[7.1500000000000004e-07,7.1900000000000002e-07],"31":[1.207e-06,1.3370000000000001e-06],"1280":[0.000164007,0.000176529],"26":[9.2200000000000002e-07,9.569999999999999e-07],"3932160":[0.97409209600000002,1.031816488],"2432":[0.00030666200000000013,0.00031598900000000019],"32":[1.342e-06,1.5579999999999999e-06],"27":[9.540000000000001e-07,9.9000000000000005e-07],"409600":[0.066143827000000002,0.06626800200000002]}},{"title":"OrderedSet removeFirst","results":{"28":[1.4980000000000001e-06,1.6169999999999999e-06],"2432":[0.00055260599999999997,0.00059740300000000004],"29":[1.5269999999999999e-06,1.584e-06],"704":[0.000125582,0.00013762099999999999],"54":[5.2970000000000003e-06,5.5230000000000003e-06],"640":[0.00012194,0.00012359599999999999],"7424":[0.0037156559999999999,0.004212726],"80":[9.4830000000000005e-06,1.0778000000000001e-05],"1792":[0.00038731099999999999,0.00040442199999999993],"12800":[0.010494405,0.010857281],"22528":[0.030051817999999998,0.031977453000000017],"480":[7.6079000000000001e-05,8.1815000000000002e-05],"544":[8.9313000000000004e-05,9.7031e-05],"608":[0.000108695,0.000114973],"56":[5.0379999999999999e-06,5.857e-06],"464":[7.8009999999999993e-05,8.0774999999999998e-05],"18432":[0.020360955999999999,0.022775554999999999],"58":[5.4739999999999996e-06,6.5690000000000001e-06],"1984":[0.00042284799999999997,0.000462523],"448":[6.8460999999999994e-05,7.1240000000000002e-05],"384":[6.7384000000000004e-05,6.9769000000000002e-05],"4352":[0.001226373,0.0012572410000000001],"84":[1.0479000000000001e-05,1.0719e-05],"36864":[0.075991195999999997,0.082174664000000008],"368":[6.2379999999999996e-05,6.8720000000000006e-05],"2816":[0.000696895,0.00071394899999999996],"288":[4.3383000000000001e-05,4.6408e-05],"110592":[0.65235275599999998,0.70503265599999998],"14336":[0.012787454,0.012883898999999999],"88":[1.1389000000000001e-05,1.1504e-05],"1088":[0.00020101,0.00021258599999999993],"1280":[0.00025972500000000004,0.00026491700000000004],"32768":[0.060416825,0.064918698999999996],"832":[0.000149686,0.000151655],"9728":[0.0062456930000000009,0.006399550999999999],"1472":[0.000332066,0.00035439499999999997],"672":[0.000114912,0.00012208600000000001],"736":[0.00014252699999999999,0.00014781000000000001],"28672":[0.04755759200000001,0.049629961],"147456":[1.4064887230000001,1.42717681],"30720":[0.055105234000000017,0.055398373000000001],"2304":[0.00052277300000000003,0.00055548000000000001],"576":[9.6373999999999996e-05,0.00010453100000000001],"8192":[0.004405473,0.0046919920000000007],"1664":[0.00035366999999999994,0.00037150300000000002],"90112":[0.44297338100000005,0.46991164800000002],"496":[7.8398000000000004e-05,8.0376000000000004e-05],"6656":[0.0029485569999999997,0.00314423],"24576":[0.036574928,0.037091104],"30":[1.5689999999999999e-06,1.6199999999999999e-06],"1856":[0.00037850300000000003,0.00040728900000000002],"31":[1.533e-06,1.6390000000000001e-06],"9216":[0.0056168750000000003,0.0058589479999999992],"32":[1.872e-06,2.0480000000000001e-06],"3584":[0.000880287,0.00089575099999999986],"114688":[0.71686356500000004,0.75569619300000002],"960":[0.00017322,0.000185186],"17408":[0.018811591999999995,0.019649285999999998],"77824":[0.33815057199999998,0.33857577300000002],"34":[2.266e-06,2.6579999999999998e-06],"10752":[0.0078889469999999986,0.0080005410000000034],"864":[0.00015896399999999999,0.00016103299999999996],"928":[0.00016536400000000001,0.00017850099999999996],"60":[5.7459999999999997e-06,6.1759999999999998e-06],"1152":[0.000206885,0.00025480900000000005],"40960":[0.092340414999999995,0.096189534000000021],"36":[2.3309999999999998e-06,2.6639999999999998e-06],"6144":[0.0026665970000000006,0.002751079],"4608":[0.0013840039999999999,0.00144374],"768":[0.00015689100000000004,0.000162218],"62":[6.3960000000000003e-06,6.7689999999999999e-06],"16384":[0.016462569,0.01762536],"38":[2.9830000000000001e-06,3.0599999999999999e-06],"3968":[0.0010243539999999999,0.001078191],"131072":[0.95961238100000001,1.0359230130000001],"1344":[0.00027805700000000001,0.00030469999999999998],"73728":[0.29908649300000001,0.30459619399999999],"64":[6.1229999999999997e-06,6.404e-06],"118784":[0.770433013,0.78524282899999998],"3072":[0.00078554500000000001,0.00085644200000000001],"1":[1.09e-07,1.18e-07],"1536":[0.00034375699999999998,0.00037126300000000004],"2":[1.14e-07,1.2100000000000001e-07],"92":[1.348e-05,1.3735e-05],"3":[1.15e-07,1.37e-07],"69632":[0.26736329599999997,0.27142597899999998],"4":[1.24e-07,1.29e-07],"68":[6.8090000000000004e-06,6.9160000000000004e-06],"5888":[0.0024070389999999997,0.0024544419999999998],"5":[1.37e-07,1.3799999999999999e-07],"12288":[0.0098405949999999989,0.010728223],"27648":[0.044103597000000001,0.04775095800000001],"6":[1.4999999999999999e-07,1.5200000000000001e-07],"7":[1.5099999999999999e-07,1.5200000000000001e-07],"1920":[0.00040276299999999999,0.00040833199999999997],"1728":[0.00035126599999999993,0.00038339599999999999],"6912":[0.0032043750000000002,0.0033721299999999997],"8":[1.6e-07,1.61e-07],"992":[0.000183976,0.00018886800000000002],"9":[2.4999999999999999e-07,2.6199999999999999e-07],"96":[1.1749000000000001e-05,1.2986000000000001e-05],"47104":[0.124197926,0.12654100499999998],"3456":[0.00087324199999999999,0.00098505900000000015],"10240":[0.0069227100000000012,0.0071102769999999999],"25600":[0.038320406000000008,0.040053447999999998],"65536":[0.23415044099999999,0.24845558400000001],"896":[0.00016185399999999999,0.000173668],"13824":[0.012217314,0.012232970000000001],"3840":[0.00097539900000000006,0.0010286710000000001],"1024":[0.00018391100000000001,0.00019799299999999999],"43008":[0.102265788,0.10701168800000005],"100":[1.1600000000000001e-05,1.1858999999999999e-05],"5376":[0.0019435189999999999,0.0020125029999999997],"19456":[0.023100496000000002,0.023864138],"21504":[0.027878073999999975,0.028518014000000001],"10":[3.3799999999999998e-07,3.9900000000000001e-07],"81920":[0.36665979599999998,0.37643391100000001],"1216":[0.00026816700000000004,0.00026902799999999993],"11":[3.84e-07,4.6100000000000001e-07],"6400":[0.0027478049999999999,0.002850867],"12":[5.4899999999999995e-07,6.1500000000000004e-07],"57344":[0.18055829599999995,0.19503051500000002],"13":[5.7700000000000004e-07,6.3300000000000002e-07],"1408":[0.000288151,0.00030022400000000009],"1600":[0.00032635199999999997,0.00034754599999999996],"14":[8.4399999999999999e-07,8.5300000000000003e-07],"200":[3.1331000000000002e-05,3.1965999999999999e-05],"20480":[0.025313937000000002,0.026824280999999998],"139264":[1.1208484169999999,1.2124616910000001],"15":[8.0200000000000001e-07,1.1489999999999999e-06],"40":[2.959e-06,3.2650000000000001e-06],"120":[1.5651e-05,1.6211000000000001e-05],"112":[1.3168e-05,1.4073999999999999e-05],"16":[1.074e-06,1.0890000000000001e-06],"104":[1.2130000000000001e-05,1.3261000000000001e-05],"17":[1.046e-06,1.1340000000000001e-06],"42":[3.2830000000000002e-06,3.3850000000000002e-06],"7680":[0.0038757849999999996,0.004179243],"53248":[0.15812968299999999,0.164552435],"18":[9.7100000000000011e-07,1.1829999999999999e-06],"13312":[0.011127442,0.011801463],"3328":[0.00083279399999999977,0.00088093800000000016],"19":[1.1620000000000001e-06,1.4580000000000001e-06],"44":[3.72e-06,5.1120000000000004e-06],"29696":[0.050978009000000005,0.051303961000000009],"31744":[0.056731132000000004,0.059575955],"2688":[0.00064736199999999996,0.0006916540000000001],"46":[3.7919999999999999e-06,4.228e-06],"49152":[0.134831702,0.14760072599999999],"51200":[0.14566073299999999,0.14898747700000001],"72":[7.2389999999999996e-06,8.9360000000000005e-06],"3712":[0.00094086600000000005,0.00097744900000000003],"124":[1.5699999999999999e-05,1.6081000000000001e-05],"8704":[0.0049903109999999999,0.0051758839999999995],"106496":[0.61295545299999998,0.65447321400000003],"48":[4.4519999999999999e-06,4.5630000000000002e-06],"116":[1.3746e-05,1.4763000000000001e-05],"108":[1.2655e-05,1.3178e-05],"15872":[0.016130183999999999,0.016453333000000004],"400":[6.1845000000000002e-05,6.2149000000000004e-05],"320":[4.9852999999999999e-05,5.2154000000000002e-05],"102400":[0.57042870400000001,0.60493207199999999],"76":[7.8499999999999994e-06,9.8770000000000005e-06],"240":[3.3679000000000001e-05,3.8722e-05],"304":[4.5877999999999997e-05,5.2743e-05],"45056":[0.113726545,0.118432776],"232":[3.3444e-05,3.3840000000000001e-05],"5632":[0.0021626799999999993,0.0022752370000000003],"160":[2.1705e-05,2.4046999999999999e-05],"224":[3.2141999999999998e-05,3.4377e-05],"23552":[0.03264124899999999,0.03496552499999999],"152":[1.8678e-05,2.2374e-05],"216":[3.1708999999999997e-05,3.2518999999999998e-05],"38912":[0.084673205000000001,0.089127747000000007],"144":[1.8498000000000001e-05,1.9831e-05],"208":[2.8467999999999999e-05,3.1877e-05],"7168":[0.0035045500000000008,0.0035178500000000003],"136":[1.6463000000000001e-05,1.8630999999999998e-05],"2176":[0.00046201599999999999,0.00046686599999999997],"11776":[0.0089605039999999993,0.0093685000000000001],"128":[1.5199e-05,1.6047999999999999e-05],"63488":[0.22106496,0.23475062799999999],"98304":[0.53302087300000001,0.54395818900000004],"122880":[0.83490215400000001,0.84290643600000004],"3200":[0.00077132599999999991,0.0008326360000000001],"59392":[0.19514115300000001,0.20728993200000001],"155648":[1.649620978,1.7061297849999999],"61440":[0.21032814499999999,0.21331985399999998],"2560":[0.00061903999999999974,0.00062799699999999982],"34816":[0.068063412000000004,0.069407512000000032],"4096":[0.0010870349999999999,0.001154623],"94208":[0.48556981099999996,0.51545888100000004],"5120":[0.001795601,0.0019615399999999999],"55296":[0.167526761,0.174308726],"512":[8.4345999999999995e-05,8.9650999999999999e-05],"15360":[0.014609381999999999,0.016395719],"432":[6.9265999999999997e-05,7.0417e-05],"20":[1.3459999999999999e-06,1.57e-06],"2944":[0.00074698499999999981,0.00077931399999999992],"352":[5.7062999999999999e-05,5.8278e-05],"416":[6.7558000000000006e-05,6.8663000000000003e-05],"21":[1.361e-06,1.705e-06],"7936":[0.0041367180000000002,0.004244584],"272":[3.8522999999999997e-05,4.0046999999999998e-05],"336":[5.3996999999999998e-05,5.7188000000000002e-05],"22":[1.734e-06,1.9099999999999999e-06],"192":[2.9411999999999999e-05,3.0470000000000001e-05],"256":[3.6263000000000002e-05,3.7011999999999997e-05],"23":[1.9759999999999998e-06,2.2069999999999998e-06],"184":[2.5805000000000001e-05,3.3031999999999998e-05],"248":[3.5083000000000003e-05,3.6536999999999999e-05],"11264":[0.0082631919999999991,0.008752513],"176":[2.2648999999999999e-05,2.6761e-05],"24":[2.1260000000000001e-06,2.7e-06],"26624":[0.041532961,0.041826536000000004],"168":[2.2708999999999999e-05,2.7614999999999999e-05],"126976":[0.88105535400000001,0.93320352699999998],"25":[1.141e-06,1.156e-06],"50":[4.69e-06,4.7029999999999997e-06],"4864":[0.0015745849999999999,0.0016192190000000003],"2048":[0.00045624800000000008,0.00052970300000000007],"14848":[0.014379276999999996,0.014385497000000001],"26":[1.1629999999999999e-06,1.517e-06],"86016":[0.40255299899999997,0.41267085100000001],"27":[1.33e-06,1.3400000000000001e-06],"800":[0.00013698200000000004,0.000149371],"52":[4.3109999999999999e-06,4.8219999999999997e-06]}},{"title":"OrderedSet union with Self (0% overlap)","results":{"28":[2.8194699999999999e-06,3.2198300000000001e-06],"34":[3.10241e-06,3.214048780487805e-06],"29":[2.9946099999999999e-06,3.1815299999999999e-06],"40":[3.4265600000000001e-06,3.6182153846153845e-06],"17408":[0.0018246596000000004,0.001825974],"1472":[0.00013250866666666665,0.0001381275],"112":[1.0895099999999998e-05,1.2401999999999999e-05],"1376256":[0.36072855300000001,0.47222013000000002],"5242880":[1.9801032055000001,1.9804541265],"36":[3.1761e-06,3.4385299999999998e-06],"42":[3.4593000000000001e-06,3.8994499999999996e-06],"11534336":[4.5284787135000002,4.7038707505000001],"114688":[0.0156004145,0.017322695999999999],"144":[1.3183999999999999e-05,1.379085e-05],"38":[3.77134e-06,3.8877699999999999e-06],"240":[2.4319039999999998e-05,2.4667220000000001e-05],"9216":[0.00092375200000000012,0.0009762890999999999],"44":[3.7471599999999996e-06,4.1195299999999997e-06],"1664":[0.0001865294,0.00019740900000000003],"196608":[0.025681345000000001,0.026819738000000003],"155648":[0.019339327,0.021192596000000001],"2816":[0.00025493200000000003,0.00027595144117647066],"50":[5.2627499999999997e-06,5.6706700000000002e-06],"2359296":[0.78816548600000003,0.78837749300000004],"46":[3.70555e-06,3.8317931034482756e-06],"176":[1.5560666666666665e-05,1.6141949999999999e-05],"52":[5.1884399999999996e-06,5.4880900000000002e-06],"272":[2.5387865853658536e-05,2.6475479999999999e-05],"116":[1.0848940000000002e-05,1.1864250000000001e-05],"47104":[0.0046160189999999999,0.0056182239999999998],"6912":[0.00079451799999999992,0.00083623900000000012],"1856":[0.000202871,0.00020843490909090912],"48":[4.0334399999999996e-06,4.3057300000000005e-06],"2097152":[0.70474102400000005,0.72099103799999997],"54":[5.3221299999999998e-06,5.9400900000000002e-06],"2031616":[0.6854158655,0.72217259],"43008":[0.0044389720000000002,0.0048417815000000013],"60":[5.6881100000000005e-06,5.7292199999999998e-06],"30720":[0.0034572305000000005,0.0035143000000000001],"56":[5.5679999999999999e-06,5.7987399999999995e-06],"62":[5.9293400000000004e-06,6.2281900000000001e-06],"58":[5.5400461538461541e-06,5.7236600000000005e-06],"3014656":[1.0088281320000001,1.1133286775],"64":[6.3040000000000001e-06,7.2353800000000005e-06],"8388608":[3.6031609644999998,3.6451115095],"29696":[0.0034248540000000006,0.0035401464999999998],"216":[2.217539e-05,2.2924669999999999e-05],"106496":[0.015128717999999996,0.017078456999999995],"72":[6.4564099999999996e-06,6.6326799999999995e-06],"442368":[0.080937868499999982,0.097193926999999999],"147456":[0.019352945,0.019495969499999995],"4456448":[1.724691346,1.7925973655],"63488":[0.007557256,0.0078762199999999997],"38912":[0.0040736554999999995,0.0041867009999999993],"68":[6.0697399999999999e-06,6.1224900000000004e-06],"188416":[0.023447665499999992,0.027341728499999988],"248":[2.504473e-05,2.573025e-05],"80":[6.9144400000000005e-06,7.3784000000000004e-06],"2560":[0.0002440845,0.00024783699999999999],"34816":[0.0037759250000000003,0.0037762569999999994],"3712":[0.00039963199999999992,0.00040934199999999993],"3538944":[1.5180311849999999,1.5346342515],"76":[6.7196900000000004e-06,7.0232799999999996e-06],"4194304":[1.6736947280000001,1.6929844955],"851968":[0.240444358,0.31196726350000004],"4096":[0.00043087119047619047,0.00047991050000000007],"59392":[0.0073090709999999977,0.0077534779999999994],"84":[7.3233100000000005e-06,7.5967999999999998e-06],"3276800":[1.4617295115,1.471602259],"55296":[0.0069325080000000013,0.0080309999999999999],"688128":[0.124662358,0.17613614350000001],"8192":[0.00084565645454545495,0.00092998199999999999],"10240":[0.0010387367777777777,0.001039129],"15872":[0.0017969989999999999,0.0018216587999999999],"92":[7.2734999999999999e-06,9.2866800000000007e-06],"26624":[0.0031308809999999999,0.0031913895000000004],"1792":[0.000184518,0.00019916000000000001],"11776":[0.001123447625,0.0011852745],"2944":[0.00027396805555555541,0.00028634027272727268],"88":[7.5438299999999992e-06,7.7496200000000009e-06],"22528":[0.0021965029999999994,0.0022342170000000001],"1245184":[0.32621123750000003,0.40356942400000001],"15728640":[7.2933554574999997,7.3356271589999995],"96":[7.4715299999999999e-06,8.0127499999999988e-06],"1984":[0.00020155799999999998,0.00021338099999999998],"139264":[0.018349848000000002,0.019826879999999998],"475136":[0.085807458000000003,0.135129268],"13631488":[6.8239450870000002,7.0462213394999997],"416":[4.3922999999999999e-05,4.482453e-05],"928":[9.7285000000000001e-05,9.8052000000000002e-05],"512":[5.2482359550561799e-05,5.3804614457831325e-05],"18432":[0.00183006925,0.0021314605000000006],"16777216":[7.5659504645000002],"9728":[0.000923503,0.0010046745555555557],"1769472":[0.65010278599999993,0.67427443099999995],"1703936":[0.63186647649999994,0.65491473950000001],"2048":[0.000219772,0.00024486210256410211],"14336":[0.001592074,0.0016013550000000005],"448":[4.5937859999999997e-05,5.0419419999999995e-05],"5505024":[2.012685802,2.1046769840000001],"544":[5.5626130000000001e-05,5.6060999999999997e-05],"221184":[0.033915803000000001,0.045130785999999999],"90112":[0.010579217,0.0111546145],"640":[6.0527033333333339e-05,6.1706029999999997e-05],"12800":[0.0015721539999999999,0.0015951485],"262144":[0.039423336499999996,0.039953374500000013],"589824":[0.1060157385,0.14405375100000001],"884736":[0.22785264099999999,0.33773743499999997],"6144":[0.00059017662499999998,0.00061450466666666662],"1088":[0.000110765,0.00011089014117647064],"576":[5.6412049999999998e-05,5.7823350000000003e-05],"160":[1.4254000000000001e-05,1.490937e-05],"672":[6.153043333333333e-05,6.3004419999999997e-05],"8912896":[3.7427492595,3.8077963779999999],"100":[1.023888e-05,1.119834e-05],"507904":[0.091535584999999989,0.13545789499999999],"3840":[0.00041199200000000008,0.00043306836363636353],"192":[1.638887e-05,1.6563707865168537e-05],"376832":[0.054434662000000002,0.066028475499999989],"98304":[0.0112200995,0.011400538],"5376":[0.00051139400000000019,0.00054880899999999993],"94208":[0.010605221,0.010970977999999998],"81920":[0.0092464330000000001,0.010770848500000003],"3407872":[1.4836547044999999,1.5212426795],"104":[1.064892e-05,1.0805229999999998e-05],"122880":[0.016729593500000001,0.018958816999999999],"200":[2.1178039999999999e-05,2.1576132075471699e-05],"163840":[0.020886106500000001,0.022123113],"4063232":[1.6384078204999999,1.6607212055],"5767168":[2.1262814950000002,2.1521303700000001],"12582912":[5.0419404964999996,9.793344158],"1600":[0.00018210700000000004,0.00019289699999999998],"136":[1.253532e-05,1.3263e-05],"232":[2.2994999999999999e-05,2.3315670000000002e-05],"7077888":[3.2774136435000001,3.4467354654999998],"86016":[0.0095834540000000017,0.011408169500000001],"31744":[0.003544644,0.0036200245000000005],"168":[1.4953000000000001e-05,1.6938120000000001e-05],"622592":[0.11252524,0.14607558000000001],"108":[1.0458153846153846e-05,1.0798470000000001e-05],"327680":[0.04709261700000001,0.055883272500000004],"2176":[0.00021577900000000001,0.00021866522222222223],"3328":[0.00038057799999999996,0.00045919042857142845],"1":[3.1162999999999999e-07,3.2589999999999997e-07],"2":[3.5574999999999999e-07,3.6684000000000002e-07],"3":[5.2842999999999997e-07,5.3483999999999999e-07],"4":[4.5058e-07,4.8826999999999996e-07],"7424":[0.00083039600000000006,0.00090132899999999987],"5":[6.3071000000000001e-07,6.4158999999999996e-07],"23552":[0.0022060595,0.0022808442499999996],"6":[5.2537999999999996e-07,5.6087000000000002e-07],"61440":[0.0074804149999999989,0.0076247580000000006],"491520":[0.093001365000000003,0.117663613],"77824":[0.009108629,0.0094020140000000002],"7":[6.9429000000000001e-07,7.1498000000000001e-07],"8":[6.3519000000000001e-07,6.8688000000000002e-07],"208":[2.1881548387096773e-05,2.2140039999999997e-05],"9":[8.4901999999999996e-07,8.5466999999999996e-07],"73728":[0.008472696,0.0086318669999999997],"304":[2.8003260000000001e-05,2.8649315789473685e-05],"400":[4.3071999999999997e-05,4.3610979999999998e-05],"1310720":[0.33241183000000002,0.4175907935],"336":[2.8915939999999998e-05,3.0781609999999997e-05],"3670016":[1.5495197315,1.5850487040000001],"6656":[0.00077382783333333316,0.00081375899999999984],"15360":[0.0017034124000000004,0.0017973705999999999],"432":[4.6022400000000002e-05,4.6535000000000001e-05],"950272":[0.25705267300000001,0.36482776500000003],"655360":[0.11900638600000001,0.17972462450000001],"69632":[0.0081702979999999994,0.0082161989999999987],"11264":[0.001056771,0.0010964270000000001],"2752512":[0.89970565400000002,0.94757419549999999],"8126464":[3.4857887394999998,3.5392688245000001],"27648":[0.0032960455000000007,0.0035147450000000005],"368":[3.0097e-05,3.2356529999999996e-05],"65536":[0.0077303279999999999,0.0088687440000000013],"16252928":[7.4292377729999997,7.476607768],"464":[4.8437740000000002e-05,4.8798670000000002e-05],"1015808":[0.26017949549999997,0.36975372750000002],"3072":[0.00028647869696969697,0.00030673450000000014],"110592":[0.015607597500000001,0.017326578000000002],"237568":[0.037058908500000008,0.042064740000000003],"278528":[0.040752640999999999,0.046451602999999987],"496":[4.7352666666666665e-05,5.0498999999999999e-05],"13107200":[6.7990770055,6.9143414815000002],"9961472":[4.1764679749999996,4.2323822260000004],"5888":[0.00055428999999999993,0.00056644699999999998],"11010048":[4.3130705989999996,4.4185630390000004],"1920":[0.00020269176086956518,0.0002053309583333333],"2490368":[0.82072523200000003,0.85090944199999996],"19456":[0.001862484,0.0020090367500000001],"57344":[0.0071146730000000002,0.0075085689999999997],"1179648":[0.30586743649999998,0.38932912600000003],"4718592":[1.8251428650000001,1.8256401325],"360448":[0.049883311999999992,0.054708780000000012],"1572864":[0.43280935249999997,0.43515218649999998],"53248":[0.0066475060000000001,0.007102344],"3456":[0.00039629200000000002,0.00040700100000000004],"40960":[0.0042289420000000003,0.0043134444999999993],"4608":[0.00046155833333333325,0.00048023579999999997],"13824":[0.0015863170000000003,0.0016160056666666665],"819200":[0.21597370900000001,0.30644032300000001],"983040":[0.24961291799999999,0.3567008565],"8704":[0.00087431079999999994,0.00094372449999999991],"120":[1.1399220000000001e-05,1.1441699999999999e-05],"1024":[9.9780999999999999e-05,0.0001027926666666667],"49152":[0.0049282270000000003,0.00537449],"524288":[0.09465459150000001,0.130586545],"45056":[0.0045582329999999992,0.0046659374999999999],"229376":[0.035403392999999991,0.0400267495],"2688":[0.00025102499999999999,0.00026286300000000001],"152":[1.409588e-05,1.4424990000000001e-05],"5120":[0.0005063748333333333,0.00052495361111111125],"1507328":[0.399600277,0.50507105249999995],"1216":[0.00011355850000000002,0.0001210812857142857],"1966080":[0.70208869299999999,0.77647360300000001],"1900544":[0.73309717499999993,0.75461724750000003],"184":[1.6208689999999999e-05,1.709861e-05],"7936":[0.00082467800000000002,0.00085007354545454526],"3801088":[1.5746525155,1.6552396060000001],"6815744":[3.20946043,3.4218872299999998],"124":[1.2242970000000001e-05,1.241e-05],"102400":[0.015111441,0.015842216000000003],"311296":[0.04490657700000001,0.0532008385],"1408":[0.00013058738888888888,0.00013330918333333334],"393216":[0.055800059999999999,0.061840931000000002],"4352":[0.00043803033333333343,0.00044678099999999994],"6553600":[3.2770384259999998,3.4289617360000002],"20480":[0.0019999277499999999,0.0021562727500000003],"608":[5.6452642857142859e-05,6.1021929999999995e-05],"2228224":[0.74345798399999996,0.75680106899999999],"36864":[0.0040031219999999996,0.0040060649999999996],"704":[6.3060799999999998e-05,6.6190620000000004e-05],"720896":[0.13400999799999999,0.19521256200000001],"800":[9.1816000000000003e-05,9.2872363636363643e-05],"2621440":[0.864673625,0.96274011400000004],"425984":[0.080550048999999999,0.101107564],"32768":[0.0035403785,0.0036443539999999998],"12058624":[4.7632299219999998,4.884239537],"128":[1.1889529999999999e-05,1.2624978260869565e-05],"180224":[0.022950848499999999,0.026209949],"224":[2.2022029999999999e-05,2.2932900000000002e-05],"736":[6.719098e-05,6.7222977272727276e-05],"320":[2.9499e-05,3.179679e-05],"557056":[0.097359473000000002,0.1225886315],"832":[9.2079680000000004e-05,9.4244555555555553e-05],"9437184":[3.9081265015,4.0787934039999998],"3584":[0.00039300800000000008,0.00041349999999999997],"6291456":[2.3519131570000003,2.3779719240000001],"256":[2.4988774999999999e-05,2.5140402298850577e-05],"15204352":[7.2206376560000001,7.3212265934999996],"28672":[0.0032302609999999995,0.0034139004999999994],"768":[7.1135000000000002e-05,8.0649859999999999e-05],"212992":[0.034171146499999999,0.035380911000000001],"864":[9.1477124999999994e-05,9.6820125e-05],"352":[3.2206760000000002e-05,3.2407690000000004e-05],"253952":[0.039400036999999999,0.041123517499999998],"960":[0.00010131571875,0.00010242809090909091],"24576":[0.0022654989999999998,0.00228036475],"7680":[0.00083088699999999999,0.00086293800000000005],"294912":[0.042642186500000012,0.04592230550000001],"1048576":[0.27836575600000002,0.374933566],"10485760":[4.1509207029999997,4.2545346689999999],"344064":[0.048719277999999998,0.051148436500000005],"288":[2.6672240000000001e-05,2.7547153846153847e-05],"1152":[0.00011188111904761901,0.00011641864634146342],"384":[3.4041267605633801e-05,3.5155879999999999e-05],"2304":[0.00022574800000000001,0.00024000743243243245],"896":[9.8158845360824749e-05,0.000100986],"480":[4.9112360000000005e-05,4.94426e-05],"1441792":[0.37911672299999999,0.483543057],"992":[0.0001018075,0.000107858],"3968":[0.00043605127272727269,0.00043646000000000006],"6400":[0.00072533199999999986,0.00077764499999999988],"1344":[0.00012192649999999998,0.00012676071428571427],"126976":[0.01649045,0.018094378000000001],"2883584":[0.93568841000000003,0.994179005],"753664":[0.143987955,0.194300901],"16384":[0.0017208640000000001,0.0017977863999999997],"131072":[0.0170947735,0.017788023],"458752":[0.084191625000000006,0.12249886300000001],"172032":[0.021462796499999999,0.0233047875],"12288":[0.0011561275,0.0012909107142857141],"14680064":[7.0969942069999998,14.167547517999999],"1536":[0.00013643375,0.00014221599999999999],"25600":[0.0031542013333333329,0.003272708],"1835008":[0.66278884100000002,0.66347744799999997],"10752":[0.001034936,0.0011166697500000003],"21504":[0.00206302,0.0020847735],"7602176":[3.3071012500000001,3.3551493025000001],"5632":[0.00054351499999999984,0.00056388400000000006],"10":[7.4245999999999994e-07,7.4700000000000001e-07],"3145728":[1.0627009955,1.0897115079999999],"245760":[0.037246819,0.044257641],"1728":[0.00018949200000000003,0.000205775],"11":[9.5631999999999998e-07,1.0101300000000001e-06],"1114112":[0.289766264,0.36945885299999998],"12":[9.2169000000000004e-07,9.4651999999999998e-07],"7340032":[3.3948654839999999,3.5417707840000001],"7168":[0.00081084899999999999,0.00081340400000000021],"13":[1.7258200000000002e-06,1.7787200000000001e-06],"6029312":[2.2086286400000001,2.2450248245000002],"14":[1.58479e-06,1.78983e-06],"3200":[0.00035101199999999999,0.00040868534782608699],"20":[1.8808799999999999e-06,2.0188399999999999e-06],"204800":[0.033252626499999993,0.03528910150000001],"15":[1.8357900000000002e-06,1.9468799999999998e-06],"13312":[0.0015469383333333337,0.0016362473999999999],"4980736":[1.9108921780000001,1.9375222965000001],"118784":[0.016813291000000001,0.017659247499999999],"51200":[0.006567476,0.007403616],"16":[1.8779100000000001e-06,1.8785699999999999e-06],"21":[2.25609e-06,2.3287100000000001e-06],"917504":[0.23579454600000005,0.32768043149999998],"22":[2.1010299999999999e-06,2.1351399999999999e-06],"4864":[0.00047948500000000009,0.00054336899999999993],"17":[1.9634999999999999e-06,1.9911000000000003e-06],"14848":[0.0018060682000000002,0.00185177],"23":[2.23349e-06,2.3082799999999999e-06],"786432":[0.158437298,0.2140115125],"18":[1.79793e-06,1.97814e-06],"1638400":[0.61303929599999996,0.66789181799999997],"7864320":[3.4539010000000001,3.4546736990000002],"24":[1.9954599999999999e-06,2.2230000000000001e-06],"14155776":[6.984179986,7.2742149779999998],"19":[2.0642499999999998e-06,2.26927e-06],"30":[2.9087499999999999e-06,2.9587299999999997e-06],"25":[2.9488399999999999e-06,3.0556099999999999e-06],"31":[3.0797300000000003e-06,3.1975700000000001e-06],"1280":[0.00012262905555555554,0.00012498199999999999],"26":[2.7085199999999997e-06,2.7540100000000001e-06],"3932160":[1.5957464940000001,1.690076734],"2432":[0.00025058392307692308,0.00025193299999999992],"32":[3.0441199999999999e-06,3.05569e-06],"27":[2.8979199999999999e-06,2.9539799999999999e-06],"409600":[0.085945955000000004,0.0944437375]}},{"title":"OrderedSet union with Self (25% overlap)","results":{"28":[2.6868299999999998e-06,2.9992499999999997e-06],"34":[2.7668700000000002e-06,2.9087878787878786e-06],"29":[2.80186e-06,2.8131000000000002e-06],"40":[3.1285799999999999e-06,3.2745199999999999e-06],"17408":[0.0016066889999999997,0.001773707],"1472":[0.00012205250666666666,0.00012247088607594936],"112":[1.006065e-05,1.142224e-05],"1376256":[0.32196417700000002,0.43196343500000001],"5242880":[1.8211564440000001,1.8794390510000001],"36":[2.9552000000000001e-06,3.4820400000000001e-06],"42":[3.0315600000000001e-06,3.4187200000000001e-06],"11534336":[4.1694864169999999,4.3791709250000004],"114688":[0.014778029999999998,0.016563384],"144":[1.2228250000000001e-05,1.2356439999999999e-05],"38":[3.0614399999999999e-06,3.3623800000000001e-06],"240":[2.1580673076923078e-05,2.2481999999999999e-05],"9216":[0.00084431372727272714,0.00087567000000000005],"44":[3.29309e-06,3.6530800000000001e-06],"1664":[8.985108000000001e-05,9.0179319999999987e-05],"196608":[0.022278479,0.025494747000000002],"155648":[0.0179466075,0.019403794000000002],"2816":[0.00023989600000000002,0.00024123302500000002],"50":[2.4398299999999999e-06,2.4764900000000001e-06],"2359296":[0.74213857399999994,0.746077086],"46":[3.2516299999999999e-06,3.5443600000000001e-06],"176":[1.3790740000000001e-05,1.4300666666666665e-05],"52":[2.5024200000000001e-06,2.7894299999999999e-06],"272":[2.280908e-05,2.4385000000000001e-05],"116":[9.6622769230769225e-06,1.1087000000000001e-05],"47104":[0.0041511790000000005,0.0046883360000000004],"6912":[0.00041992,0.00042384869565217388],"1856":[0.00018319300000000001,0.0001877006862745098],"48":[3.3960900000000001e-06,4.1437100000000005e-06],"2097152":[0.67431018199999992,0.701367611],"54":[2.4896599999999998e-06,3.0107499999999999e-06],"2031616":[0.63376685200000005,0.68223868799999998],"43008":[0.0041076250000000002,0.0041776750000000005],"60":[5.2756000000000008e-06,5.3075400000000007e-06],"30720":[0.003176037,0.0032791400000000007],"56":[5.2165899999999995e-06,5.2179399999999999e-06],"62":[5.6072299999999998e-06,5.7914500000000003e-06],"58":[5.1370899999999996e-06,5.2050299999999997e-06],"3014656":[0.90913539450000003,0.97711818449999999],"64":[5.7747099999999998e-06,5.8156145833333328e-06],"8388608":[3.4894026189999998,3.5085274040000001],"29696":[0.0032651850000000003,0.0032674729999999999],"216":[1.1346329999999999e-05,1.135897e-05],"106496":[0.00749207,0.0085597269999999996],"72":[5.8626100000000003e-06,5.9822800000000006e-06],"442368":[0.045317674000000009,0.057829238999999991],"147456":[0.017968384,0.018222649],"4456448":[1.64107219,1.663673878],"63488":[0.0069409739999999999,0.0073936480000000001],"38912":[0.0037797224999999999,0.0038038580000000002],"68":[5.3673299999999998e-06,5.6008100000000005e-06],"188416":[0.020901078999999999,0.024623889999999999],"248":[2.0842000000000001e-05,2.2938329999999999e-05],"80":[6.4086199999999996e-06,6.4234899999999997e-06],"2560":[0.00022278756818181928,0.00022605882926829266],"34816":[0.0033846699999999993,0.0034342770000000008],"3712":[0.0003749519999999999,0.00037702199999999997],"3538944":[0.81931841299999997,0.82104135600000006],"76":[6.2068699999999994e-06,6.26817e-06],"4194304":[1.5875133705,1.5977365855000001],"851968":[0.120722495,0.15786186499999999],"4096":[0.00039342000000000007,0.00043569150000000005],"59392":[0.006751835000000002,0.0075417700000000006],"84":[6.6594899999999997e-06,6.8928299999999999e-06],"3276800":[0.68818597250000002,0.69035802199999996],"55296":[0.0035614205000000002,0.0042991890000000001],"688128":[0.126359208,0.15770616700000001],"8192":[0.00077980500000000006,0.000812709],"10240":[0.00093435300000000007,0.00093517100000000005],"15872":[0.0016607677999999997,0.0016767844000000001],"92":[6.7851200000000002e-06,7.2186199999999995e-06],"26624":[0.0014985899999999997,0.0015320263333333339],"1792":[0.00016897699999999998,0.0001851108],"11776":[0.00096918899999999986,0.0010158260000000001],"2944":[0.00024365500000000004,0.00024536420000000005],"88":[6.5918000000000001e-06,6.7153000000000007e-06],"22528":[0.0019089332000000003,0.0019492240000000001],"1245184":[0.29703755100000001,0.377883462],"15728640":[7.0610909980000001,7.1229772185],"96":[6.74062e-06,6.8667142857142858e-06],"1984":[0.00018172699999999999,0.00018266500000000001],"139264":[0.016996533000000008,0.018524207999999983],"475136":[0.082716035000000007,0.12148577000000001],"13631488":[3.4112383529999999,3.4236089765000002],"416":[2.1545689999999999e-05,2.1599250000000002e-05],"928":[9.0632649999999987e-05,9.1483999999999993e-05],"512":[4.7960149999999999e-05,4.8279999999999999e-05],"18432":[0.0016840550000000003,0.0018923269999999999],"16777216":[7.3312338634999996],"9728":[0.00087358499999999996,0.00091507529999999945],"1769472":[0.36037280199999999,0.37447085999999996],"1703936":[0.32186200399999998,0.34357459899999998],"2048":[0.00020717000000000001,0.000213081],"14336":[0.0014885829999999997,0.0015018729999999999],"448":[4.1646343750000003e-05,4.6685409999999999e-05],"5505024":[1.895549054,1.905721974],"544":[5.030509e-05,5.0724580000000004e-05],"221184":[0.018239785500000001,0.024297351000000002],"90112":[0.0089012110000000009,0.0096810969999999996],"640":[5.1071500000000001e-05,5.3241249999999998e-05],"12800":[0.0006967490000000002,0.00072286399999999993],"262144":[0.036502550000000002,0.039169873000000001],"589824":[0.099852231,0.132717112],"884736":[0.13517268799999999,0.17112119050000002],"6144":[0.00048981000000000003,0.00052245184210526329],"1088":[9.791270833333332e-05,0.00010095899999999999],"576":[4.8130999999999997e-05,4.9231999999999999e-05],"160":[1.2702769230769231e-05,1.394438e-05],"672":[5.4059479999999998e-05,5.4089899999999999e-05],"8912896":[3.6281727369999999,3.6403358049999999],"100":[4.5890100000000003e-06,4.76053e-06],"507904":[0.091149566500000001,0.121239211],"3840":[0.00038489016000000005,0.00039742199999999998],"192":[1.364625e-05,1.398778e-05],"376832":[0.04909061,0.057819216999999999],"98304":[0.0097856225000000022,0.0102701715],"5376":[0.00047498199999999999,0.00048210957894736833],"94208":[0.0092382559999999968,0.010261314000000002],"81920":[0.0084390660000000003,0.008974447],"3407872":[0.73582929000000008,0.74811890049999996],"104":[4.8685000000000001e-06,5.0332899999999999e-06],"122880":[0.015644551,0.018843632499999999],"200":[9.9774999999999989e-06,1.0142110000000001e-05],"163840":[0.019485829,0.0205113315],"4063232":[1.6008316730000001,1.6239586715000001],"5767168":[1.958948304,1.971596168],"12582912":[4.3829316709999997,8.3100359869999991],"1600":[8.0264842105263155e-05,8.4221588235294125e-05],"136":[1.1543549999999999e-05,1.1917e-05],"232":[2.0941499999999999e-05,2.1343320000000001e-05],"7077888":[1.703274889,1.814814406],"86016":[0.0086085410000000008,0.010191992],"31744":[0.0032791550000000002,0.0033355669999999998],"168":[1.328601e-05,1.4410478873239435e-05],"622592":[0.10948153400000001,0.13302031599999997],"108":[5.0799999999999996e-06,5.2879200000000004e-06],"327680":[0.042451749000000004,0.0525209185],"2176":[0.000186668,0.0002148835],"3328":[0.00018440350000000001,0.00018805235999999999],"1":[1.0407e-07,1.0868e-07],"2":[3.2581999999999999e-07,3.4392999999999998e-07],"3":[4.8983000000000004e-07,5.3277999999999998e-07],"4":[4.2448e-07,4.4533000000000003e-07],"7424":[0.00078813991666666671,0.00085715100000000012],"5":[5.7851999999999997e-07,5.9350000000000001e-07],"23552":[0.0019803127500000002,0.0020453529999999993],"6":[4.7358000000000004e-07,5.0989999999999998e-07],"61440":[0.0070854940000000003,0.0072743759999999991],"491520":[0.088556316499999996,0.120965563],"77824":[0.0082721949999999995,0.0087614119999999997],"7":[6.4466e-07,6.6487e-07],"8":[5.9633999999999995e-07,6.0180999999999996e-07],"208":[1.0752666666666668e-05,1.094753e-05],"9":[7.1076999999999995e-07,7.216999999999999e-07],"73728":[0.0076544430000000012,0.0084417580000000006],"304":[2.50226e-05,2.564089e-05],"400":[1.975277e-05,2.0119552941176473e-05],"1310720":[0.30315124449999997,0.38879253850000001],"336":[2.563596e-05,2.7739999999999999e-05],"3670016":[1.504875631,1.5278633859999999],"6656":[0.00036124900000000001,0.00036831500000000003],"15360":[0.0015424169999999997,0.0015482766666666667],"432":[2.2261375000000002e-05,2.2461939999999999e-05],"950272":[0.231765463,0.33986448800000002],"655360":[0.111284969,0.15796214250000001],"69632":[0.0073280690000000013,0.0076975280000000004],"11264":[0.00094346499999999989,0.0010217],"2752512":[0.838173893,0.87344622599999999],"8126464":[3.3867063150000001,3.3977144670000001],"27648":[0.001632884,0.001735905],"368":[2.7424079999999999e-05,2.843813e-05],"65536":[0.0070371779999999998,0.0083426730000000018],"16252928":[7.129672759,7.2179194259999999],"464":[4.4512312500000002e-05,4.4807e-05],"1015808":[0.25114482500000002,0.330810997],"3072":[0.00024688299999999993,0.00025942800000000002],"110592":[0.0081946209999999992,0.0087794779999999985],"237568":[0.035414688,0.042092938000000003],"278528":[0.039964874999999997,0.042460256999999994],"496":[4.4540589999999998e-05,4.7361999999999998e-05],"13107200":[3.1073669774999999,3.1734858754999999],"9961472":[3.890270675,4.0083843750000003],"5888":[0.00045980199999999993,0.00052692805555555578],"11010048":[4.0077491199999997,4.0923267040000004],"1920":[0.00018758357142857144,0.0001944062765957447],"2490368":[0.791380741,0.80507523000000003],"19456":[0.0017186971999999987,0.0018124806],"57344":[0.0065052740000000001,0.006980745],"1179648":[0.3015498325,0.36111555900000003],"4718592":[1.7375946935,1.761716259],"360448":[0.046022795999999998,0.058722642000000012],"1572864":[0.36484631000000001,0.411615966],"53248":[0.0033339964999999998,0.0034458399999999995],"3456":[0.00018776900000000001,0.00020069200000000001],"40960":[0.0037919539999999993,0.0038323154999999999],"4608":[0.00041459845454545452,0.00043642600000000001],"13824":[0.00078991766666666676,0.00082777100000000004],"819200":[0.10952366700000001,0.14962550399999999],"983040":[0.25528651600000002,0.34510260799999998],"8704":[0.000774726,0.0007951806666666669],"120":[1.040273e-05,1.063459420289855e-05],"1024":[9.0370000000000004e-05,9.3622000000000006e-05],"49152":[0.0042944479999999993,0.0049648469999999997],"524288":[0.09078832249999999,0.138789838],"45056":[0.0040383629999999988,0.0041396180000000003],"229376":[0.034195060000000041,0.038765077000000002],"2688":[0.00021791900000000001,0.00023285966666666667],"152":[1.2179e-05,1.259627e-05],"5120":[0.00045778599999999985,0.00046232149999999997],"1507328":[0.352540729,0.44242625000000002],"1216":[9.8300000000000004e-05,0.000112297],"1966080":[0.65360390800000001,0.67337900249999993],"1900544":[0.66170806199999999,0.66756497000000004],"184":[1.423723e-05,1.4492919999999999e-05],"7936":[0.00077450741666666668,0.00078189558333333336],"3801088":[1.531488518,1.5593828599999999],"6815744":[1.585752354,1.7040838715],"124":[1.0972510000000001e-05,1.1655800000000001e-05],"102400":[0.0072243239999999998,0.0077182940000000005],"311296":[0.042020154000000004,0.048022159999999994],"1408":[0.000109381,0.00011586403750000003],"393216":[0.04888605300000004,0.054902329],"4352":[0.00041999600000000001,0.00042336273913043485],"6553600":[1.4870977599999999,1.565531242],"20480":[0.0018333431999999999,0.0019159749999999999],"608":[5.2388000000000001e-05,5.3358130000000002e-05],"2228224":[0.72785072499999992,0.73454604800000001],"36864":[0.0035291429999999998,0.0037142309999999997],"704":[5.4251654320987657e-05,5.5534500000000002e-05],"720896":[0.121398772,0.181532267],"800":[4.1274570000000004e-05,4.2134e-05],"2621440":[0.802658235,0.86812493999999996],"425984":[0.045382172999999991,0.07158371100000005],"32768":[0.003240503,0.0034667545],"12058624":[4.2894265085000001,4.2956207024999999],"128":[1.0855336956521738e-05,1.168378e-05],"180224":[0.021296292000000001,0.021894007],"224":[2.0851732394366197e-05,2.150323e-05],"736":[5.7418617647058822e-05,5.8403000000000003e-05],"320":[2.5919e-05,2.6025389999999999e-05],"557056":[0.09360319999999997,0.114426264],"832":[4.0692000000000003e-05,4.246954e-05],"9437184":[3.7574547919999999,3.8719729009999999],"3584":[0.000367225,0.00038215600000000003],"6291456":[2.0904184075000001,2.1245755310000001],"256":[2.2565179999999997e-05,2.292803e-05],"15204352":[6.9976553409999998,7.1749817580000004],"28672":[0.0030788350000000003,0.0032277493333333338],"768":[5.9540844827586207e-05,6.5360789999999999e-05],"212992":[0.018372549999999994,0.021182888],"864":[4.3343000000000002e-05,5.2169000000000001e-05],"352":[2.6814694915254237e-05,2.8575999999999999e-05],"253952":[0.037388202999999995,0.03976719699999999],"960":[9.0592499999999997e-05,9.4647265957446811e-05],"24576":[0.0019639329999999997,0.0020667274999999997],"7680":[0.000760156,0.00080750541666666669],"294912":[0.040068001999999998,0.045581550000000012],"1048576":[0.2505558175,0.35486568600000001],"10485760":[3.8846479165000001,3.9659990955],"344064":[0.045333357000000005,0.047348863000000005],"288":[2.3560669999999997e-05,2.4746210000000001e-05],"1152":[9.767748958333334e-05,0.00010371771428571426],"384":[2.9439000000000001e-05,2.9737329999999999e-05],"2304":[0.0002067643958333333,0.00021929499999999999],"896":[9.310116e-05,9.4726000000000001e-05],"480":[4.436103e-05,4.4928580000000001e-05],"1441792":[0.33757882500000003,0.432188825],"992":[9.3176000000000004e-05,9.5945000000000004e-05],"3968":[0.00039464420833333332,0.00039651150000000001],"6400":[0.00034156400000000009,0.00035501750000000007],"1344":[0.00011063083544303794,0.000113785],"126976":[0.015542825500000024,0.018352807000000002],"2883584":[0.86088271199999999,0.88691246999999995],"753664":[0.122302445,0.17398216350000001],"16384":[0.001609636,0.0016874616000000001],"131072":[0.016092542999999997,0.016226503],"458752":[0.084958909000000027,0.118533917],"172032":[0.019421415000000004,0.021012018],"12288":[0.0010115493333333332,0.0010461960000000001],"14680064":[6.9205202054999999,15.114178133499999],"1536":[0.00011687400000000002,0.00012322799999999999],"25600":[0.0014360431666666665,0.0014837909999999999],"1835008":[0.64692777899999998,0.73727074049999997],"10752":[0.00092012800000000009,0.00097039099999999992],"21504":[0.0018798375999999999,0.0019538619999999998],"7602176":[3.2912409770000002,3.3063836900000001],"5632":[0.00048600100000000007,0.0005045780000000001],"10":[6.2470000000000003e-07,6.6493000000000007e-07],"3145728":[0.92389374349999998,0.98890095499999997],"245760":[0.036398144,0.041949239500000006],"1728":[9.4609666666666656e-05,9.8674666666666666e-05],"11":[8.6450000000000005e-07,8.7427499999999999e-07],"1114112":[0.264099258,0.357928937],"12":[7.8341000000000005e-07,8.0235999999999999e-07],"7340032":[3.318067653,3.4365242105],"7168":[0.00075000072727272741,0.00075201499999999987],"13":[9.1374999999999993e-07,9.9159000000000011e-07],"6029312":[2.0199735109999999,2.0318645970000002],"14":[8.0055999999999996e-07,8.1916999999999994e-07],"3200":[0.00017160833333333328,0.00017523200000000005],"20":[1.7457931034482758e-06,1.95063e-06],"204800":[0.016120559499999999,0.017311156000000001],"15":[1.74977e-06,1.8101599999999998e-06],"13312":[0.00072745199999999996,0.00077767500000000002],"4980736":[1.7708954079999999,1.823377233],"118784":[0.016003712,0.017873755499999998],"51200":[0.0031099700000000001,0.0038028065000000008],"16":[1.60617e-06,1.80048e-06],"21":[2.04841e-06,2.2135399999999999e-06],"917504":[0.2285367875,0.31334636800000004],"22":[1.8447000000000001e-06,1.9113299999999998e-06],"4864":[0.00044374800000000005,0.0005004303125],"17":[1.7564699999999998e-06,1.8742599999999999e-06],"14848":[0.0016391725000000003,0.0016721359999999998],"23":[2.0319500000000001e-06,2.23757e-06],"786432":[0.13027640600000001,0.17164507000000001],"18":[1.6588529411764706e-06,1.9302499999999999e-06],"1638400":[0.29655251500000002,0.30143841599999999],"7864320":[3.3725094869999999,3.3783265569999998],"24":[1.7991599999999998e-06,1.8825e-06],"14155776":[3.7055187529999998,3.7966217325000002],"19":[1.89028e-06,1.9335300000000002e-06],"30":[2.71157e-06,2.7700499999999998e-06],"25":[1.45601e-06,1.5581899999999999e-06],"31":[2.84832e-06,2.9151699999999997e-06],"1280":[0.00010336299999999998,0.00011364100000000002],"26":[1.3471800000000001e-06,1.3882400000000002e-06],"3932160":[1.5596070584999999,1.6105586540000001],"2432":[0.0002194929777777778,0.00022723600000000002],"32":[2.8145399999999997e-06,2.8195700000000001e-06],"27":[1.51373e-06,1.6259600000000001e-06],"409600":[0.043053133,0.046295280000000008]}},{"title":"OrderedSet union with Self (50% overlap)","results":{"28":[1.24036e-06,1.3566500000000002e-06],"34":[2.5511799999999997e-06,3.2647600000000002e-06],"29":[1.3607499999999998e-06,1.3706800000000001e-06],"40":[2.8084099999999999e-06,3.0117899999999998e-06],"17408":[0.0015336869999999999,0.0015631709999999999],"1472":[0.000107676,0.00010946942857142854],"112":[4.2597400000000003e-06,4.5419999999999999e-06],"1376256":[0.29626027499999996,0.39612346549999999],"5242880":[1.7792536750000001,1.808039392],"36":[2.6367799999999998e-06,3.0881499999999998e-06],"42":[2.8518100000000002e-06,3.21314e-06],"11534336":[3.9469203479999999,4.3811673410000003],"114688":[0.0066454690000000011,0.010474816],"144":[1.0852270000000001e-05,1.1353750000000001e-05],"38":[2.7643500000000001e-06,3.0434700000000002e-06],"240":[9.7798500000000009e-06,1.0541166666666667e-05],"9216":[0.00077184141666666677,0.00081980750000000026],"44":[2.9345800000000001e-06,3.1340200000000001e-06],"1664":[6.6266000000000006e-05,6.9066627906976745e-05],"196608":[0.019565841,0.024687710499999998],"155648":[0.016750747,0.017483014000000009],"2816":[0.00020623200000000004,0.00022086627499999997],"50":[1.9189599999999999e-06,2.1398799999999999e-06],"2359296":[0.71435888800000003,0.72449695199999997],"46":[3.0369499999999998e-06,3.1163499999999998e-06],"176":[1.1783299999999999e-05,1.229089e-05],"52":[2.0364000000000001e-06,2.20294e-06],"272":[2.0337513157894739e-05,2.1931500000000002e-05],"116":[4.29577e-06,4.3558599999999998e-06],"47104":[0.0038012089999999998,0.0042135639999999995],"6912":[0.00032180099999999992,0.00032265899999999999],"1856":[7.8275099999999999e-05,8.0383863636363643e-05],"48":[2.9539699999999996e-06,3.27965e-06],"2097152":[0.393428469,0.40010428149999999],"54":[2.0594299999999997e-06,2.3928199999999999e-06],"2031616":[0.35848445800000001,0.37323198349999998],"43008":[0.0037005084999999992,0.003782676],"60":[2.39428e-06,2.6265099999999996e-06],"30720":[0.0014741330000000001,0.001562407],"56":[2.4333399999999999e-06,2.4376600000000001e-06],"62":[2.6421300000000001e-06,2.8913799999999998e-06],"58":[2.30135e-06,2.5259000000000002e-06],"3014656":[0.87620183900000004,0.9287875095],"64":[2.8978700000000003e-06,3.0866599999999998e-06],"8388608":[1.928033291,1.9528110380000001],"29696":[0.0014636989999999999,0.00147302],"216":[8.4908399999999995e-06,8.8225499999999991e-06],"106496":[0.0059236949999999997,0.006693966],"72":[5.1973999999999996e-06,5.6943300000000002e-06],"442368":[0.036446072000000003,0.050517572999999996],"147456":[0.016451464000000002,0.016972021],"4456448":[1.6151695369999999,1.6344885740000001],"63488":[0.0036142179999999998,0.0037728194999999999],"38912":[0.0034344705,0.003516061],"68":[4.90871e-06,5.1490000000000002e-06],"188416":[0.019741711000000002,0.023871844999999999],"248":[1.0247100000000001e-05,1.0514666666666668e-05],"80":[5.5555999999999998e-06,5.9526700000000002e-06],"2560":[0.00020318350000000002,0.0002074205],"34816":[0.00308407,0.0032529774999999995],"3712":[0.00015621399999999998,0.00016536799999999999],"3538944":[0.64751290799999994,0.654648181],"76":[5.5374700000000004e-06,5.7142000000000003e-06],"4194304":[0.899321437,0.92806249100000004],"851968":[0.099091796999999995,0.12999152550000001],"4096":[0.00018877299999999999,0.00021904063636363639],"59392":[0.0031821329999999993,0.0035679819999999995],"84":[5.7801800000000005e-06,5.9067900000000001e-06],"3276800":[0.57858324449999998,0.57980084399999998],"55296":[0.0027796909999999999,0.0034412229999999993],"688128":[0.10207406500000005,0.13508187099999999],"8192":[0.00038446999999999993,0.000416594],"10240":[0.00080528800000000003,0.000824312],"15872":[0.00077695716666666679,0.00081071100000000009],"92":[6.0276499999999998e-06,6.4489299999999998e-06],"26624":[0.0011398929999999999,0.00121500775],"1792":[7.5224428571428573e-05,8.5977300000000001e-05],"11776":[0.00086258263636363635,0.00093505470000000007],"2944":[0.000202089,0.000226352],"88":[5.6604300000000005e-06,6.1464500000000002e-06],"22528":[0.001701911,0.001776389],"1245184":[0.26444124600000002,0.38090433349999997],"15728640":[3.6046093790000002,3.6076026749999999],"96":[5.8165000000000001e-06,6.1047600000000001e-06],"1984":[8.9805179999999997e-05,9.2855999999999993e-05],"139264":[0.015778382000000001,0.017778476000000005],"475136":[0.041283841000000002,0.059097116999999977],"13631488":[2.7545466460000001,2.8543443394999999],"416":[1.591889e-05,1.6474486842105263e-05],"928":[3.9559959999999998e-05,4.3164099999999996e-05],"512":[2.5188430000000003e-05,2.5753030000000001e-05],"18432":[0.001524196,0.001684683],"16777216":[4.0676163870000002],"9728":[0.00076822000000000001,0.00080282599999999987],"1769472":[0.28127423299999998,0.296795535],"1703936":[0.26425604899999999,0.27124841],"2048":[0.00010541500000000001,0.000107321],"14336":[0.00062667300000000012,0.00064057300000000008],"448":[1.7837918918918919e-05,1.8766999999999998e-05],"5505024":[1.848579609,1.8803346830000001],"544":[4.3206600000000001e-05,4.5798970000000004e-05],"221184":[0.01437097,0.019214632000000002],"90112":[0.0080611330000000016,0.012448664],"640":[4.6536333333333337e-05,4.8519260000000005e-05],"12800":[0.00054507100000000016,0.00057235200000000004],"262144":[0.020171590999999996,0.023007478999999997],"589824":[0.090368621999999982,0.11946694400000001],"884736":[0.10546749499999999,0.13927690400000001],"6144":[0.00044714400000000001,0.00046772095238095223],"1088":[8.6013000000000005e-05,8.9337857142857141e-05],"576":[4.4119560000000001e-05,4.673773e-05],"160":[1.1374e-05,1.2563929999999999e-05],"672":[4.7170670000000004e-05,5.0489999999999999e-05],"8912896":[3.4615347839999999,3.537512306],"100":[3.7831499999999999e-06,4.1753333333333331e-06],"507904":[0.047692552999999992,0.070053453499999987],"3840":[0.00017204144444444441,0.00018794699999999999],"192":[1.1916540000000001e-05,1.2370829999999999e-05],"376832":[0.046318890999999994,0.052479184000000012],"98304":[0.0086421290000000019,0.0089650009999999985],"5376":[0.00042564000000000002,0.00043641827272727267],"94208":[0.0083001419999999999,0.0099925639999999989],"81920":[0.007517676,0.0082802919999999981],"3407872":[0.614081918,0.6223766315],"104":[3.77898e-06,3.8801100000000002e-06],"122880":[0.007841387,0.0083040449999999995],"200":[7.5484700000000003e-06,7.7721100000000004e-06],"163840":[0.018680542999999997,0.019317993999999998],"4063232":[0.84368509999999997,0.86619990800000002],"5767168":[1.8952492590000001,1.9119645970000001],"12582912":[4.1413800749999998,7.8148590550000003],"1600":[6.3055899999999994e-05,6.5557979166666662e-05],"136":[1.050538e-05,1.0896999999999999e-05],"232":[9.1586099999999997e-06,9.5309300000000009e-06],"7077888":[1.3941836249999999,1.464825112],"86016":[0.0077464030000000007,0.0089879050000000009],"31744":[0.001548829333333333,0.0016296855],"168":[1.1323266666666665e-05,1.174916e-05],"622592":[0.097205413000000004,0.12109402],"108":[3.9308700000000004e-06,4.0457799999999997e-06],"327680":[0.041514091499999996,0.04937058599999998],"2176":[0.00017799033333333332,0.00018156299999999998],"3328":[0.00013730211940298507,0.00013976900000000001],"1":[1.0404000000000001e-07,1.0879000000000001e-07],"2":[3.4224999999999998e-07,3.6355e-07],"3":[3.4126999999999998e-07,3.6674000000000001e-07],"4":[4.002e-07,4.2927999999999999e-07],"7424":[0.00033350999999999997,0.00038078733333333343],"5":[5.4982000000000004e-07,5.5788999999999992e-07],"23552":[0.0018031150000000003,0.001838747],"6":[4.6970999999999999e-07,4.8571000000000003e-07],"61440":[0.003395201,0.0035597069999999996],"491520":[0.045793782999999998,0.063322540999999982],"77824":[0.007437893000000001,0.0074817630000000006],"7":[5.9562999999999994e-07,6.1037999999999999e-07],"8":[5.2129000000000003e-07,5.2163999999999995e-07],"208":[7.8697899999999997e-06,8.568179999999999e-06],"9":[6.6530000000000001e-07,6.8950999999999998e-07],"73728":[0.0070721639999999919,0.0072769290000000014],"304":[2.2140680000000002e-05,2.318385e-05],"400":[1.4596000000000001e-05,1.5061300000000001e-05],"1310720":[0.27816274349999998,0.3611856745],"336":[2.3382870000000001e-05,2.4327390000000003e-05],"3670016":[0.70628679949999995,0.70648578699999998],"6656":[0.00028418682352941173,0.000305913],"15360":[0.00069575000000000008,0.00074117758333333333],"432":[1.6056999999999999e-05,1.7328000000000001e-05],"950272":[0.118944245,0.15460619799999997],"655360":[0.097694618000000025,0.138110921],"69632":[0.0068397100000000014,0.0070033700000000001],"11264":[0.00086501199999999986,0.00093891000000000005],"2752512":[0.79228144499999997,0.81849649199999996],"8126464":[1.8045951979999999,1.8502688700000001],"27648":[0.0012868331428571428,0.0013392424285714288],"368":[2.3822999999999999e-05,2.5316810000000002e-05],"65536":[0.0036466570000000002,0.0043680435],"16252928":[3.8184169049999999,3.8321734410000001],"464":[1.961309e-05,1.9897420000000002e-05],"1015808":[0.14092399999999999,0.18500676499999999],"3072":[0.00022581263636363641,0.00022983948837209306],"110592":[0.0063041619999999994,0.0072389749999999999],"237568":[0.016653498500000002,0.019387999],"278528":[0.037690521999999997,0.045973299000000009],"496":[2.0543999999999998e-05,2.2824509999999999e-05],"13107200":[2.5923428450000001,2.670560364],"9961472":[3.7337544954999999,3.8695258075000001],"5888":[0.00043074300000000009,0.00045326300000000003],"11010048":[3.8295259399999999,3.9380332080000002],"1920":[8.4054000000000005e-05,8.7946125000000003e-05],"2490368":[0.73026575300000007,0.807306721],"19456":[0.0015799150000000001,0.0016766320000000002],"57344":[0.0028915960000000002,0.0031387453333333337],"1179648":[0.26232832950000001,0.36379331149999999],"4718592":[1.7134028139999999,1.7601834199999999],"360448":[0.043999015000000002,0.053825683000000013],"1572864":[0.33030167450000003,0.3950129175],"53248":[0.0026224480000000003,0.0026913813333333332],"3456":[0.00014822491666666669,0.00015498899999999999],"40960":[0.00353484,0.003639803],"4608":[0.00038100499999999996,0.00040438599999999996],"13824":[0.00058976299999999998,0.00062137826666666652],"819200":[0.08984993799999999,0.1214356145],"983040":[0.1331612325,0.18005786500000001],"8704":[0.0007539977500000001,0.0008324160000000001],"120":[4.5214499999999997e-06,4.8105900000000003e-06],"1024":[4.680021e-05,4.9317999999999998e-05],"49152":[0.0039766774999999994,0.0042006109999999999],"524288":[0.049468527999999998,0.069740981499999966],"45056":[0.003731229,0.0039666610000000007],"229376":[0.016304294,0.019549220500000002],"2688":[0.00020625099999999996,0.00021345700000000001],"152":[1.0821e-05,1.1323930000000001e-05],"5120":[0.00039999400000000003,0.00040327100000000002],"1507328":[0.31979179899999999,0.43178819499999999],"1216":[9.3838000000000005e-05,9.7727920000000005e-05],"1966080":[0.33774028750000001,0.34256319300000004],"1900544":[0.32256121900000001,0.32650875099999999],"184":[1.2333139999999998e-05,1.2475250000000001e-05],"7936":[0.000357058,0.000370066],"3801088":[0.73019774299999995,0.750702494],"6815744":[1.3265558385,1.3973329729999999],"124":[5.0656100000000001e-06,5.7057699999999992e-06],"102400":[0.005703708,0.0063926059999999977],"311296":[0.039779752999999994,0.046142735499999997],"1408":[9.9182e-05,0.000100541],"393216":[0.045675967999999997,0.052210334999999997],"4352":[0.00037187588461538482,0.00037647246153846146],"6553600":[1.2528857215,1.319785341],"20480":[0.0016764083999999996,0.0017803652],"608":[4.3291000000000003e-05,4.8612571428571427e-05],"2228224":[0.68874342600000005,0.69959599800000005],"36864":[0.003321821,0.0034101399999999999],"704":[4.8031000000000001e-05,5.0743389999999999e-05],"720896":[0.10676848500000002,0.14780348999999998],"800":[3.0759999999999997e-05,3.1503372340425534e-05],"2621440":[0.75764853199999993,0.82908610299999996],"425984":[0.034680822,0.054591181000000003],"32768":[0.0016932645999999999,0.001799543],"12058624":[4.0571892900000002,4.0767099570000003],"128":[5.4336399999999994e-06,5.7692040816326536e-06],"180224":[0.018916363999999998,0.019506583000000001],"224":[8.4678000000000005e-06,9.5916699999999996e-06],"736":[5.0985000000000001e-05,5.1171238095238094e-05],"320":[2.2676000000000001e-05,2.3030920000000001e-05],"557056":[0.08826108000000002,0.104823852],"832":[3.263168e-05,3.5334793650793648e-05],"9437184":[3.6381698450000002,3.7571258489999999],"3584":[0.00014921100000000001,0.00016791000000000001],"6291456":[1.982802824,2.0367566885000001],"256":[1.062143e-05,1.1247710000000001e-05],"15204352":[3.3668195595000001,3.4218090399999999],"28672":[0.0012791250000000001,0.0014386820000000006],"768":[5.3656246753246751e-05,5.6244169014084506e-05],"212992":[0.014024745,0.014902577],"864":[3.29e-05,3.9436836734693881e-05],"352":[2.3842000000000003e-05,2.499e-05],"253952":[0.019685288999999998,0.022233377999999998],"960":[4.2048258064516128e-05,4.3485999999999997e-05],"24576":[0.0018361958000000002,0.0018936180000000001],"7680":[0.00036104611538461523,0.000376008],"294912":[0.037951779000000005,0.042980667],"1048576":[0.151788863,0.1992174665],"10485760":[3.764321577,3.7666490769999998],"344064":[0.042318432999999996,0.047969869000000005],"288":[2.0827388888888888e-05,2.1324000000000001e-05],"1152":[8.9339833333333335e-05,9.3927999999999999e-05],"384":[2.5486139240506328e-05,2.5887790123456789e-05],"2304":[0.00019707813999999998,0.00020563497916666664],"896":[3.907643e-05,4.0411459999999995e-05],"480":[2.0292240000000001e-05,2.0937460000000001e-05],"1441792":[0.31512040399999997,0.42813795900000001],"992":[4.3704e-05,4.7551429999999995e-05],"3968":[0.00018591266666666669,0.0001921673333333333],"6400":[0.000268757,0.00027093566666666668],"1344":[9.7583959595959596e-05,0.00010412752173913043],"126976":[0.0081124830000000002,0.010228774999999999],"2883584":[0.83003606949999997,0.8644520765],"753664":[0.11191733399999999,0.14200231200000002],"16384":[0.00081221499999999981,0.00085836236363636374],"131072":[0.0087147639999999998,0.0089976040000000011],"458752":[0.045808750500000009,0.060402220999999992],"172032":[0.018023304,0.019843036000000001],"12288":[0.00092723800000000015,0.00097974299999999993],"14680064":[3.1703676409999999,4.1440375574999999],"1536":[0.00010713,0.000107637],"25600":[0.0011142881250000001,0.0011897399999999999],"1835008":[0.29862558699999997,0.319021269],"10752":[0.00085689127272727298,0.00088847199999999985],"21504":[0.0016781179999999999,0.0017063479999999999],"7602176":[1.5707583729999999,1.5714911604999999],"5632":[0.00042258599999999997,0.00043855199999999993],"10":[5.8983999999999999e-07,5.9055e-07],"3145728":[0.87695823750000002,0.99240359899999997],"245760":[0.017993731999999991,0.022038828999999996],"1728":[7.2267530000000001e-05,7.5862270000000005e-05],"11":[7.7124000000000007e-07,8.0290999999999993e-07],"1114112":[0.23904022300000005,0.33098111899999999],"12":[6.6569000000000008e-07,6.8226999999999993e-07],"7340032":[1.500702049,1.5582038625000001],"7168":[0.00031877849999999998,0.00032967355172413778],"13":[7.9561999999999997e-07,8.0136999999999998e-07],"6029312":[1.9308026030000001,1.9607055739999999],"14":[7.0154999999999998e-07,7.7182999999999994e-07],"3200":[0.00013077999999999999,0.00013578700000000001],"20":[1.5897500000000001e-06,1.72616e-06],"204800":[0.013022127,0.013719121000000001],"15":[9.1163999999999992e-07,9.9156999999999998e-07],"13312":[0.00056994800000000013,0.00060445799999999988],"4980736":[1.721973894,1.762174361],"118784":[0.007164129,0.0073222219999999989],"51200":[0.0024567149999999999,0.0025259200000000001],"16":[8.5579000000000007e-07,9.0609000000000004e-07],"21":[1.84043e-06,1.9388500000000001e-06],"917504":[0.113129405,0.14712245500000001],"22":[1.7205399999999999e-06,1.74895e-06],"4864":[0.00038880499999999999,0.00043851000000000014],"17":[1.65456e-06,1.70233e-06],"14848":[0.00068534399999999973,0.00068881400000000005],"23":[1.8763300000000001e-06,1.9649882352941174e-06],"786432":[0.11614648599999999,0.17011256400000002],"18":[1.55507e-06,1.8851900000000001e-06],"1638400":[0.25193384400000002,0.26129977799999998],"7864320":[1.6971756284999999,1.701324273],"24":[1.559e-06,1.6926399999999999e-06],"14155776":[2.96375418,3.028993131],"19":[1.7098900000000001e-06,1.86623e-06],"30":[1.29324e-06,1.37981e-06],"25":[1.1819799999999999e-06,1.2309899999999999e-06],"31":[1.4533900000000001e-06,1.46296e-06],"1280":[9.4250000000000001e-05,9.993542222222223e-05],"26":[1.11884e-06,1.16516e-06],"3932160":[0.80646096150000002,0.80770108650000005],"2432":[0.000194811,0.00020783374418604654],"32":[1.3585100000000001e-06,1.4042399999999999e-06],"27":[1.34869e-06,1.3522200000000001e-06],"409600":[0.032604836999999998,0.042230374499999994]}},{"title":"OrderedSet union with Self (75% overlap)","results":{"28":[9.7063000000000006e-07,1.07018e-06],"34":[1.13617e-06,1.1763000000000001e-06],"29":[1.1425399999999999e-06,1.1524899999999999e-06],"40":[2.53459e-06,2.63096e-06],"17408":[0.00064823300000000001,0.00069297100000000034],"1472":[9.5491777777777768e-05,9.8398724489795917e-05],"112":[3.2970900000000003e-06,3.2999400000000002e-06],"1376256":[0.27354065900000002,0.38087688800000002],"5242880":[1.746039224,1.7548963639999999],"36":[1.2662499999999999e-06,1.4059899999999999e-06],"42":[2.49717e-06,2.8266800000000003e-06],"11534336":[3.8273117944999999,4.0865290935000003],"114688":[0.0052965809999999999,0.005847288],"144":[4.4682700000000005e-06,4.8828200000000006e-06],"38":[1.29047e-06,1.5973499999999998e-06],"240":[6.8377499999999999e-06,7.8303300000000006e-06],"9216":[0.00033688300000000006,0.00037707300000000007],"44":[2.62686e-06,2.70227e-06],"1664":[5.0470000000000003e-05,5.232551e-05],"196608":[0.018578286999999999,0.022168247000000002],"155648":[0.0093444669999999987,0.0095663269999999977],"2816":[0.000181235,0.00018469799999999999],"50":[1.5293600000000001e-06,1.5622999999999998e-06],"2359296":[0.40308388099999998,0.40327090500000001],"46":[2.6297199999999997e-06,2.9524299999999999e-06],"176":[1.0552929999999999e-05,1.112084e-05],"52":[1.65365e-06,1.68154e-06],"272":[8.2086199999999993e-06,9.4038600000000005e-06],"116":[3.2751299999999998e-06,3.2948299999999998e-06],"47104":[0.0034155039999999998,0.0037114190000000005],"6912":[0.00023009499999999996,0.000243308],"1856":[5.9364320000000005e-05,6.0714999999999997e-05],"48":[2.6203799999999998e-06,2.79468e-06],"2097152":[0.30547735450000002,0.31452597400000004],"54":[1.6842600000000001e-06,1.76085e-06],"2031616":[0.29047686900000003,0.29143370600000001],"43008":[0.0032211559999999993,0.0033922280000000006],"60":[1.8340899999999999e-06,1.9979e-06],"30720":[0.0011454659999999835,0.001174518],"56":[1.73406e-06,1.8098800000000001e-06],"62":[1.94293e-06,2.0322800000000003e-06],"58":[1.81793e-06,1.8373900000000001e-06],"3014656":[0.845375718,0.91452625300000001],"64":[2.1176700000000001e-06,2.1333170731707317e-06],"8388608":[1.5539852430000001,1.557371252],"29696":[0.001091837,0.0011013231249999999],"216":[6.2122700000000002e-06,6.2378300000000002e-06],"106496":[0.004847887999999999,0.0054561009999999997],"72":[2.41125e-06,2.5665300000000003e-06],"442368":[0.030050746999999999,0.042843286000000001],"147456":[0.0082199750000000009,0.0086717750000000014],"4456448":[0.79767008549999996,0.83094879249999998],"63488":[0.0026624096666666664,0.0029040446666666665],"38912":[0.0017421329999999994,0.0017423709999999999],"68":[2.14194e-06,2.15079e-06],"188416":[0.0184562315,0.022491939499999995],"248":[7.2700699999999997e-06,7.8383658536585375e-06],"80":[4.9447499999999995e-06,5.2091099999999997e-06],"2560":[0.00017524700000000001,0.000184019],"34816":[0.00138721,0.001456754],"3712":[0.000124122,0.00012707000000000001],"3538944":[0.57341602899999999,0.58576657899999995],"76":[2.5172799999999999e-06,2.6650000000000003e-06],"4194304":[0.71928302,0.72261454950000004],"851968":[0.088966828000000012,0.107518445],"4096":[0.000145327,0.0001606105999999999],"59392":[0.0024845239999999997,0.0025401899999999999],"84":[4.9788499999999998e-06,5.0671500000000003e-06],"3276800":[0.50761221899999998,0.50880268849999999],"55296":[0.0021800819999999994,0.0025473259999999999],"688128":[0.092728636000000003,0.1199702965],"8192":[0.00029669800000000002,0.00031119240000000009],"10240":[0.00073617699999999986,0.00077524199999999988],"15872":[0.00060593568750000001,0.00061987273333333334],"92":[5.3041000000000006e-06,5.4012299999999996e-06],"26624":[0.0008668739999999999,0.00093659799999999997],"1792":[5.5296421052631577e-05,5.808216129032258e-05],"11776":[0.00077881200000000004,0.00085406420000000015],"2944":[0.00019469299999999996,0.00019577199999999995],"88":[5.3041300000000002e-06,5.6849799999999992e-06],"22528":[0.001641794,0.0017478264],"1245184":[0.162808857,0.221747369],"15728640":[2.9637268150000002,3.0621525470000002],"96":[5.0352499999999998e-06,5.1650999999999999e-06],"1984":[6.502481999999921e-05,6.5078000000000003e-05],"139264":[0.007790272,0.007882133999999999],"475136":[0.035411603999999999,0.051291194000000005],"13631488":[2.4427028540000002,2.4770778070000001],"416":[1.1623060000000001e-05,1.2707079999999999e-05],"928":[2.8574000000000001e-05,2.9912238095238093e-05],"512":[1.6808239999999999e-05,1.718661e-05],"18432":[0.00073901199999999983,0.00075344999999999991],"16777216":[3.2575793595000002],"9728":[0.00037248000000000001,0.00039814199999999988],"1769472":[0.25102571750000002,0.25338277949999999],"1703936":[0.23105250050000001,0.23514723999999998],"2048":[6.4239000000000006e-05,7.7114925925925932e-05],"14336":[0.00048975800000000008,0.00050960016666666671],"448":[1.315924e-05,1.35976e-05],"5505024":[1.8031809189999999,1.8086218920000001],"544":[1.8558640000000002e-05,1.880712e-05],"221184":[0.011623321000000001,0.016989886000000003],"90112":[0.007295752,0.0082894609999999997],"640":[4.2981190000000007e-05,4.3411000000000002e-05],"12800":[0.000415017,0.00049775100000000027],"262144":[0.015645133000000002,0.016847180999999999],"589824":[0.050494505999999981,0.067001265000000004],"884736":[0.091391311999999988,0.115653561],"6144":[0.00038244899999999998,0.00041323500000000008],"1088":[3.7126370000000002e-05,3.7808590000000002e-05],"576":[2.0712590000000002e-05,2.091211e-05],"160":[9.7869999999999996e-06,1.081625e-05],"672":[4.348867e-05,4.3726000000000001e-05],"8912896":[1.6802815930000001,1.7390503675],"100":[2.8979400000000001e-06,2.9586599999999999e-06],"507904":[0.037867202000000003,0.05694930749999999],"3840":[0.000127069,0.0001425806666666667],"192":[1.0453680000000002e-05,1.059978e-05],"376832":[0.041559621000000005,0.046988711000000002],"98304":[0.0078369480000000016,0.0082387610000000007],"5376":[0.0003831140000000001,0.00038945199999999993],"94208":[0.0074516369999999997,0.0093148940000000006],"81920":[0.0069480199999999992,0.0070216689999999995],"3407872":[0.53774975200000008,0.54664852100000005],"104":[2.97735e-06,3.1347299999999998e-06],"122880":[0.0062191700000000004,0.0062760540000000005],"200":[5.4775399999999999e-06,5.5623300000000005e-06],"163840":[0.018913267499999997,0.020956195],"4063232":[0.69122404599999998,0.69494725099999999],"5767168":[1.857181867,1.8648509099999999],"12582912":[4.0228435960000004,8.0081464330000003],"1600":[4.7947329999999996e-05,5.0163864583333333e-05],"136":[4.2197499999999997e-06,4.4984699999999998e-06],"232":[7.0023800000000004e-06,7.0539999999999997e-06],"7077888":[1.2051975480000001,1.2786819330000001],"86016":[0.0071743120000000004,0.0078636829999999998],"31744":[0.0011875961250000001,0.0012494752857142859],"168":[9.9923972602739729e-06,1.0059941176470589e-05],"622592":[0.055448344999999996,0.06869903400000002],"108":[3.0888999999999998e-06,3.2098600000000001e-06],"327680":[0.036572453999999997,0.043405594000000006],"2176":[7.6490880000000002e-05,7.7127999999999997e-05],"3328":[0.000108461,0.00010863600000000002],"1":[1.0883e-07,1.0898e-07],"2":[1.2011000000000001e-07,1.2545999999999999e-07],"3":[1.3581e-07,1.3644e-07],"4":[3.7532e-07,3.8359999999999997e-07],"7424":[0.00024319200000000001,0.00028577782352941179],"5":[3.7218999999999995e-07,3.8391e-07],"23552":[0.001626953,0.001761187],"6":[4.1741999999999999e-07,4.3274e-07],"61440":[0.002672457,0.0027308599999999995],"491520":[0.036209328999999998,0.050142419000000035],"77824":[0.0038986935000000001,0.0039154034999999993],"7":[4.2600999999999999e-07,4.3018e-07],"8":[4.5500999999999994e-07,4.7884000000000002e-07],"208":[5.8481600000000008e-06,6.0636299999999994e-06],"9":[6.2323999999999996e-07,6.4652e-07],"73728":[0.0034233634999999998,0.0035882234999999999],"304":[9.7669999999999998e-06,1.1291170000000001e-05],"400":[1.137739e-05,1.1531833333333334e-05],"1310720":[0.26371805100000001,0.37632189300000002],"336":[2.0012000000000001e-05,2.1973480000000001e-05],"3670016":[0.60010012950000002,0.61325665149999997],"6656":[0.000207049,0.00023087725],"15360":[0.00054543500000000015,0.00054656825000000007],"432":[1.277434e-05,1.2775810000000001e-05],"950272":[0.098176866999999987,0.13723000199999999],"655360":[0.10288746250000003,0.12324869350000001],"69632":[0.0031245003333333337,0.0031967076666666676],"11264":[0.00078790200000000005,0.00080602199999999977],"2752512":[0.79595059400000001,0.80280492849999996],"8126464":[1.4595004645,1.5078020425000001],"27648":[0.00094134799999999984,0.00099260099999999986],"368":[2.1852625e-05,2.2766090000000001e-05],"65536":[0.0027946850000000003,0.0032263069999999999],"16252928":[3.0668093234999998,3.0843994370000001],"464":[1.429477e-05,1.4768590000000001e-05],"1015808":[0.11144923349999999,0.15687757699999999],"3072":[0.000201246,0.00020295126530612246],"110592":[0.0050862110000000002,0.0054402110000000004],"237568":[0.013595708,0.014727507000000001],"278528":[0.017510333000000003,0.0210539475],"496":[1.4425e-05,1.604239e-05],"13107200":[2.3043441675,2.3441499495000002],"9961472":[2.1194323210000001,2.2104473969999998],"5888":[0.00038237599999999997,0.00039638100000000001],"11010048":[3.7276335125000002,3.89746076],"1920":[6.1404259259259267e-05,6.2008000000000007e-05],"2490368":[0.44936253199999998,0.48024752700000001],"19456":[0.0008076130000000001,0.00085233400000000006],"57344":[0.0023321227499999999,0.0024285695],"1179648":[0.15072886799999999,0.20125098599999999],"4718592":[0.92194529250000001,0.93178908150000006],"360448":[0.040006093,0.047477855999999985],"1572864":[0.30788047099999999,0.353573258],"53248":[0.0020884160000000001,0.0021708862500000002],"3456":[0.000108541,0.00011709097333333332],"40960":[0.0033289515000000007,0.0034621730000000002],"4608":[0.00017607092727272726,0.00019065852],"13824":[0.000445928,0.0004761415999999999],"819200":[0.078335161,0.10712185800000001],"983040":[0.109398104,0.14626156000000001],"8704":[0.00031897099999999998,0.00034349795833333322],"120":[3.3362300000000003e-06,3.4618499999999997e-06],"1024":[3.2738999999999999e-05,3.3115000000000004e-05],"49152":[0.003538074,0.0039253044999999999],"524288":[0.039986685000000001,0.053455164499999999],"45056":[0.003406947,0.0035305669999999996],"229376":[0.012694843000000001,0.0160761655],"2688":[0.00019105210000000002,0.000195145],"152":[5.02949e-06,5.6566500000000003e-06],"5120":[0.000359916,0.00038639999999999996],"1507328":[0.28905235400000001,0.40196029799999999],"1216":[4.8355220000000002e-05,4.9561999999999997e-05],"1966080":[0.27213332200000001,0.28094306949999998],"1900544":[0.27203062500000003,0.27310158299999998],"184":[1.0736949999999999e-05,1.0979959999999999e-05],"7936":[0.00028083199999999996,0.00028357400000000009],"3801088":[0.62851024150000001,0.63213328400000002],"6815744":[1.165871785,1.2104784040000001],"124":[3.7223749999999997e-06,3.7836999999999999e-06],"102400":[0.0047208695000000005,0.0050052259999999998],"311296":[0.022567211,0.025358485],"1408":[8.4678499999999999e-05,9.2932100000000004e-05],"393216":[0.040057355999999995,0.05231500900000001],"4352":[0.000159629,0.000165854],"6553600":[1.1061546630000001,1.1733677689999999],"20480":[0.0015218603333333335,0.0015826710000000001],"608":[2.1018870000000001e-05,2.2369189999999999e-05],"2228224":[0.35286933050000002,0.37260077300000005],"36864":[0.0016270009999999999,0.0017783650000000001],"704":[4.1873172413793106e-05,4.4773e-05],"720896":[0.097703138999999994,0.144280037],"800":[2.3448999999999999e-05,2.463136e-05],"2621440":[0.74662127,0.78222936649999997],"425984":[0.030172579999999997,0.041650673999999999],"32768":[0.0012904382857142857,0.001306991],"12058624":[3.9449605929999998,3.9656053889999998],"128":[3.8954300000000004e-06,4.0575099999999995e-06],"180224":[0.01726925,0.018304473500000001],"224":[6.6169799999999998e-06,6.6635700000000005e-06],"736":[4.2119666666666669e-05,4.5147583333333338e-05],"320":[1.9675999999999999e-05,2.0637289999999999e-05],"557056":[0.043727392000000011,0.05570551],"832":[2.4514869999999999e-05,2.571126e-05],"9437184":[1.889266906,1.9686625659999999],"3584":[0.00011539100000000002,0.00012436500000000003],"6291456":[1.9664078810000001,2.0105142800000002],"256":[7.5495000000000003e-06,8.2720697674418608e-06],"15204352":[2.8534755629999999,2.9105283869999998],"28672":[0.0010285301111111114,0.0010817450000000003],"768":[4.5796269999999999e-05,4.9447999999999998e-05],"212992":[0.011609418,0.011950493999999997],"864":[2.46875e-05,2.8594820000000001e-05],"352":[2.1870669999999998e-05,2.2355277777777778e-05],"253952":[0.015885108500000005,0.018791538],"960":[3.0278890000000002e-05,3.0447857142857144e-05],"24576":[0.0016325129999999999,0.0017176066],"7680":[0.00026863800000000003,0.000276913],"294912":[0.020004110999999998,0.023470523],"1048576":[0.119043146,0.15767590100000001],"10485760":[3.6176913454999999,3.7172508409999998],"344064":[0.039828000000000002,0.042577355999999997],"288":[9.2459400000000001e-06,9.9694299999999985e-06],"1152":[3.9220000000000001e-05,4.3223875000000003e-05],"384":[2.1681499999999999e-05,2.2314371428571426e-05],"2304":[8.6382000000000001e-05,8.9147170000000004e-05],"896":[2.793913e-05,2.8818387096774195e-05],"480":[1.413734e-05,1.546265e-05],"1441792":[0.28532988250000002,0.4175944895],"992":[3.0812510000000004e-05,3.4141109999999998e-05],"3968":[0.00013704200000000001,0.000143177],"6400":[0.00020587949999999999,0.00021344000000000002],"1344":[8.7828460000000005e-05,9.5052999999999999e-05],"126976":[0.0067312209999999999,0.0078251060000000001],"2883584":[0.795538309,0.85157770799999999],"753664":[0.10673268299999999,0.14222843900000001],"16384":[0.000596333,0.00063777849999999993],"131072":[0.0066303849999999999,0.0093845289999999991],"458752":[0.035168572499999995,0.046603753500000004],"172032":[0.0167050355,0.018137337],"12288":[0.00080220499999999995,0.00085567],"14680064":[2.6833312770000002,3.4820144800000001],"1536":[9.1407000000000001e-05,0.00010106054255319147],"25600":[0.00083280500000000005,0.00090015699999999985],"1835008":[0.25340467900000002,0.28563872400000001],"10752":[0.00074835200000000009,0.00080019449999999925],"21504":[0.001556979,0.001589797],"7602176":[1.3281807400000001,1.34097124],"5632":[0.000397795,0.0004058580000000001],"10":[5.0211999999999995e-07,5.0864999999999999e-07],"3145728":[0.84838660900000007,0.92295962600000003],"245760":[0.0139572155,0.017184629999999999],"1728":[5.4107999999999998e-05,5.6975139999999999e-05],"11":[6.4148999999999996e-07,6.8268000000000002e-07],"1114112":[0.12583407599999999,0.19047403600000001],"12":[5.5915999999999993e-07,5.9103000000000002e-07],"7340032":[1.3003387319999999,1.340710753],"7168":[0.00025199400000000001,0.00025431899999999998],"13":[7.0727000000000001e-07,7.3782999999999993e-07],"6029312":[1.8929175125,1.9184485229999999],"14":[6.0200999999999998e-07,6.1164000000000004e-07],"3200":[0.00010367300000000001,0.00010457866304347825],"20":[1.46079e-06,1.5614099999999998e-06],"204800":[0.010969784,0.0112684165],"15":[7.7842000000000006e-07,8.4957000000000011e-07],"13312":[0.00044545900000000005,0.00045609300000000003],"4980736":[1.0104065345,1.0252923375],"118784":[0.0057498010000000006,0.0058715980000000004],"51200":[0.0019574530000000001,0.0020445010000000002],"16":[6.7046999999999999e-07,7.4483999999999999e-07],"21":[1.6995899999999999e-06,1.8550500000000001e-06],"917504":[0.094175852499999976,0.123714247],"22":[1.5537e-06,1.59151e-06],"4864":[0.00019744062,0.000200118],"17":[8.6588999999999998e-07,8.8743000000000005e-07],"14848":[0.00051807599999999991,0.00055105300000000013],"23":[1.6794600000000001e-06,1.75e-06],"786432":[0.101554612,0.14299978099999999],"18":[8.4827000000000001e-07,9.0212999999999999e-07],"1638400":[0.20999584499999999,0.22192273500000001],"7864320":[1.4236598199999999,1.434124819],"24":[1.44204e-06,1.4935099999999998e-06],"14155776":[2.5766701099999998,2.624624775],"19":[8.9765999999999995e-07,9.2163999999999993e-07],"30":[1.0146199999999999e-06,1.0637099999999999e-06],"25":[1.0186000000000001e-06,1.0266499999999999e-06],"31":[1.1845799999999999e-06,1.19444e-06],"1280":[8.1521999999999996e-05,8.5002359999999995e-05],"26":[8.8931999999999992e-07,8.9991000000000002e-07],"3932160":[0.65319721100000006,0.68401921399999999],"2432":[9.5912250000000003e-05,0.000100289],"32":[1.0923399999999999e-06,1.1090300000000001e-06],"27":[1.05213e-06,1.0695400000000001e-06],"409600":[0.028584348999999998,0.03188653100000001]}},{"title":"OrderedSet union with Self (100% overlap)","results":{"28":[5.7843000000000003e-07,5.9218999999999996e-07],"34":[6.9571000000000003e-07,7.1989000000000002e-07],"29":[5.9701999999999998e-07,6.0147e-07],"40":[8.2230000000000005e-07,9.2639999999999993e-07],"17408":[0.0004857719,0.00050482500000000009],"1472":[4.2236710000000002e-05,4.5005179999999999e-05],"112":[2.1144399999999999e-06,2.1661400000000002e-06],"1376256":[0.15264490749999998,0.20803471100000004],"5242880":[0.88581041900000002,0.88927413399999999],"36":[7.5080000000000008e-07,8.2385000000000006e-07],"42":[9.1202999999999999e-07,9.6134999999999991e-07],"11534336":[2.1348214195000002,2.1698812260000002],"114688":[0.0040579404999999992,0.0045976404999999981],"144":[2.8990199999999998e-06,3.1370999999999996e-06],"38":[8.1421000000000004e-07,8.766499999999999e-07],"240":[4.5597300000000001e-06,5.1523333333333332e-06],"9216":[0.00025611600000000013,0.00026542849999999996],"44":[9.3795999999999991e-07,1.0861000000000001e-06],"1664":[3.6688789999999999e-05,3.7083200000000004e-05],"196608":[0.010931441,0.011045966000000003],"155648":[0.0066977599999999997,0.0069413630000000007],"2816":[8.0627619999999988e-05,8.3003999999999993e-05],"50":[9.8512999999999988e-07,1.0349166666666667e-06],"2359296":[0.32313432650000001,0.33368464199999998],"46":[1.0008799999999999e-06,1.1567300000000001e-06],"176":[3.7593600000000001e-06,4.3336600000000003e-06],"52":[1.0488399999999999e-06,1.05802e-06],"272":[5.3810299999999994e-06,5.6805400000000003e-06],"116":[2.2594999999999997e-06,2.31022e-06],"47104":[0.0016158750000000003,0.001769512],"6912":[0.00016869899999999999,0.00017927389583333335],"1856":[4.094981e-05,4.1221940000000002e-05],"48":[1.03905e-06,1.1745900000000001e-06],"2097152":[0.26644168000000001,0.28195896399999998],"54":[1.04389e-06,1.10589e-06],"2031616":[0.2454926975,0.25288719800000004],"43008":[0.0013533029999999997,0.0014455029999999999],"60":[1.21671e-06,1.24046e-06],"30720":[0.00082837172727272745,0.00085353399999999987],"56":[1.12345e-06,1.1605299999999999e-06],"62":[1.3129499999999999e-06,1.34664e-06],"58":[1.11313e-06,1.1987399999999999e-06],"3014656":[0.5073296035,0.5478718185],"64":[1.30414e-06,1.38722e-06],"8388608":[1.3344713969999999,1.3369257335],"29696":[0.00078953066666666673,0.00079307733333333315],"216":[4.0750699999999998e-06,4.0810399999999998e-06],"106496":[0.0037094790000000003,0.0041051895000000001],"72":[1.46e-06,1.5164500000000001e-06],"442368":[0.0192746575,0.022813557500000005],"147456":[0.0062692670000000002,0.0065668180000000003],"4456448":[0.67983318999999998,0.698708353],"63488":[0.0019118486000000001,0.0019689060000000003],"38912":[0.001143121,0.0012064649999999999],"68":[1.3613500000000001e-06,1.4058300000000001e-06],"188416":[0.0101136,0.0103453555],"248":[4.7818699999999995e-06,5.2542999999999998e-06],"80":[1.6664699999999999e-06,1.8345500000000001e-06],"2560":[6.746143e-05,7.2629519999999994e-05],"34816":[0.0010050132222222223,0.0010156130000000001],"3712":[8.9800000000000001e-05,9.020309000000001e-05],"3538944":[0.48191959750000002,0.50214907600000003],"76":[1.49037e-06,1.6771799999999999e-06],"4194304":[0.620696107,0.62372314849999999],"851968":[0.067847821999999988,0.091755403499999985],"4096":[0.00010310804166666669,0.00010824539999999996],"59392":[0.0017069964,0.0018810879999999995],"84":[1.8337999999999999e-06,1.87157e-06],"3276800":[0.44510356449999999,0.44514207550000001],"55296":[0.0015053795,0.0016906821999999994],"688128":[0.041402494500000012,0.062091855999999987],"8192":[0.00021472599999999999,0.00022373],"10240":[0.00031483054838709668,0.000324953],"15872":[0.00043602399999999997,0.00045045352380952377],"92":[2.1792700000000001e-06,2.22743e-06],"26624":[0.000666528,0.00068613499999999994],"1792":[3.9179490000000006e-05,4.0594399999999999e-05],"11776":[0.00038445500000000007,0.00040976277272727267],"2944":[8.7348229999999994e-05,8.8706222222222219e-05],"88":[2.03896e-06,2.2127200000000001e-06],"22528":[0.00076970091666666662,0.00077217399999999993],"1245184":[0.1229736215,0.17535309399999999],"15728640":[2.5777099044999998,2.5987958569999998],"96":[2.1335800000000001e-06,2.3343600000000002e-06],"1984":[4.5855769230769231e-05,4.6541459999999999e-05],"139264":[0.0056145709999999996,0.0058920159999999999],"475136":[0.022313794500000001,0.033202607999999988],"13631488":[2.1160357895000002,2.1476910684999999],"416":[7.9029599999999993e-06,8.0975600000000008e-06],"928":[1.9500740000000001e-05,2.0772360000000002e-05],"512":[1.0947349999999999e-05,1.1124957142857143e-05],"18432":[0.00050433500000000007,0.00058569599999999992],"16777216":[2.7781409935000001],"9728":[0.00029492799999999997,0.00030604249999999998],"1769472":[0.210904484,0.216569024],"1703936":[0.19990809000000001,0.201301436],"2048":[4.9310450000000005e-05,5.3681689999999997e-05],"14336":[0.00034374199999999991,0.00037923019230769233],"448":[9.0042500000000011e-06,9.0600100000000004e-06],"5505024":[0.94841941900000004,0.97141813399999999],"544":[1.1973949999999999e-05,1.21035e-05],"221184":[0.0088100319999999989,0.0095659444999999978],"90112":[0.0034450130000000002,0.0037293979999999997],"640":[1.6500379310344826e-05,1.669177e-05],"12800":[0.00031167400000000007,0.00036557699999999991],"262144":[0.0117979855,0.011800254499999999],"589824":[0.031543870499999994,0.047165367500000006],"884736":[0.06851188200000001,0.094639665000000012],"6144":[0.000219714,0.00022125206818181817],"1088":[2.5147499999999999e-05,2.535199e-05],"576":[1.25995e-05,1.385858e-05],"160":[3.2911799999999998e-06,3.5426099999999996e-06],"672":[1.670456e-05,1.6964510000000001e-05],"8912896":[1.441480997,1.4579362905],"100":[1.9126900000000001e-06,1.9847037037037038e-06],"507904":[0.024862824499999998,0.035748381000000017],"3840":[9.077933333333334e-05,0.00010084099999999999],"192":[4.30904e-06,4.7041700000000002e-06],"376832":[0.022052932500000004,0.022348957999999999],"98304":[0.0042957595000000012,0.00443918],"5376":[0.0001528,0.000166582],"94208":[0.003800055000000001,0.0040166694999999994],"81920":[0.002818016,0.0028589653333333334],"3407872":[0.47544018450000003,0.47663201799999999],"104":[2.01748e-06,2.0880499999999999e-06],"122880":[0.0046815529999999998,0.0049465459999999996],"200":[3.7254600000000003e-06,3.7296299999999998e-06],"163840":[0.0077351370000000004,0.0084305139999999983],"4063232":[0.59603330700000001,0.60577219599999999],"5767168":[1.0353074360000001,1.0569659170000001],"12582912":[2.5686544900000001,5.6683209559999996],"1600":[3.4299879999999999e-05,3.466412e-05],"136":[2.9024600000000003e-06,2.9214799999999998e-06],"232":[4.4793800000000001e-06,4.5240399999999996e-06],"7077888":[1.0474041940000001,1.1060550775],"86016":[0.0031164573333333327,0.0032359159999999997],"31744":[0.00085983000000000001,0.00088122500000000002],"168":[3.500016393442623e-06,3.7449100000000002e-06],"622592":[0.038012652000000001,0.057112615000000012],"108":[2.0664300000000002e-06,2.1701199999999999e-06],"327680":[0.016285748000000003,0.016908837499999999],"2176":[5.2989710000000006e-05,5.5191000000000001e-05],"3328":[7.3520218749999994e-05,8.2411999999999996e-05],"1":[1.0395e-07,1.0451999999999999e-07],"2":[1.2008999999999999e-07,1.2547e-07],"3":[1.3647e-07,1.3654e-07],"4":[1.5174000000000001e-07,1.5187999999999998e-07],"7424":[0.00018408899999999999,0.00018828588461538466],"5":[1.6804000000000001e-07,1.6807e-07],"23552":[0.00080289999999999995,0.00083508490909090893],"6":[1.8397999999999998e-07,1.8515000000000001e-07],"61440":[0.0018523279999999999,0.0019168379999999995],"491520":[0.022249454999999994,0.028693406999999994],"77824":[0.0026612236666666662,0.002797286],"7":[2.0128000000000001e-07,2.0778e-07],"8":[2.2469999999999999e-07,2.2493999999999997e-07],"208":[3.9105900000000004e-06,3.9731600000000001e-06],"9":[2.4490000000000003e-07,2.6370000000000001e-07],"73728":[0.0024765430000000003,0.0025771270000000002],"304":[6.3297499999999998e-06,6.9814699999999996e-06],"400":[7.6426500000000004e-06,7.9933399999999996e-06],"1310720":[0.13826053299999999,0.18905540500000001],"336":[7.2039473684210529e-06,8.7417199999999994e-06],"3670016":[0.51453433849999997,0.53570717450000005],"6656":[0.000157997,0.00016953699999999999],"15360":[0.00039652900000000007,0.00039799400000000004],"432":[8.5928148148148142e-06,8.7071600000000008e-06],"950272":[0.071411714999999987,0.1093089055],"655360":[0.039966027000000001,0.058010611499999996],"69632":[0.0021260845,0.0021505779999999998],"11264":[0.000354831,0.00037880499999999996],"2752512":[0.43254587249999998,0.45488505349999997],"8126464":[1.2669736819999999,1.2916094805],"27648":[0.00073724308333333302,0.00075317600000000015],"368":[9.7716899999999993e-06,1.062112e-05],"65536":[0.001965535,0.0022868930000000003],"16252928":[2.682568882,2.6829327665],"464":[9.9211700000000004e-06,9.9644099999999997e-06],"1015808":[0.086725447499999997,0.12433793900000001],"3072":[0.00010064,0.000107209],"110592":[0.0039402110000000008,0.0040642990000000004],"237568":[0.010181315,0.0103855185],"278528":[0.012920957,0.013129280500000012],"496":[1.0036e-05,1.0604e-05],"13107200":[1.9877065730000001,2.0449307970000001],"9961472":[1.703407208,1.7647530790000001],"5888":[0.00019366399999999999,0.0002059130425531915],"11010048":[1.9626845180000001,1.989829055],"1920":[4.1486999999999998e-05,4.2836000000000001e-05],"2490368":[0.34981200800000001,0.36484594000000004],"19456":[0.00057173399999999996,0.0005810530000000001],"57344":[0.0015756139999999999,0.0016135165999999999],"1179648":[0.10774519249999998,0.16127814799999995],"4718592":[0.74191339200000006,0.79410052100000006],"360448":[0.019931049499999999,0.021323254999999999],"1572864":[0.204826487,0.22471732150000001],"53248":[0.0014290318333333334,0.001469869166666667],"3456":[8.1525639999999994e-05,8.4933060000000012e-05],"40960":[0.0013219032857142859,0.0013509779999999999],"4608":[0.00012239600000000001,0.00012694317105263158],"13824":[0.00033130300000000002,0.00035120966666666654],"819200":[0.054869741,0.0853527865],"983040":[0.081343214000000011,0.1144841855],"8704":[0.000233472,0.000258008],"120":[2.2541600000000001e-06,2.4404899999999999e-06],"1024":[2.288923e-05,2.3721150000000002e-05],"49152":[0.0017917186000000001,0.0019589059999999998],"524288":[0.025688937499999998,0.035903035999999999],"45056":[0.001573231666666667,0.0015924630000000001],"229376":[0.0096281130000000006,0.0104965645],"2688":[7.4750000000000001e-05,8.4218066666666666e-05],"152":[3.1103699999999999e-06,3.2132900000000004e-06],"5120":[0.00014968500000000001,0.00015177800000000001],"1507328":[0.189667059,0.25368301250000003],"1216":[3.0599819999999999e-05,3.08172e-05],"1966080":[0.23702986700000001,0.2410863865],"1900544":[0.23271032650000001,0.23532145600000001],"184":[3.9749700000000005e-06,4.6129999999999997e-06],"7936":[0.00020277200000000002,0.00020912009523809525],"3801088":[0.55123296749999995,0.56080564150000001],"6815744":[1.032058696,1.0448652780000001],"124":[2.39824e-06,2.5372200000000002e-06],"102400":[0.0034904345000000003,0.0035981819999999997],"311296":[0.015803398999999999,0.016008164500000005],"1408":[3.6700069999999996e-05,3.682945e-05],"393216":[0.022924650499999998,0.027682254],"4352":[0.00011115950000000002,0.00011297816666666666],"6553600":[0.95407324049999997,1.019335879],"20480":[0.00061700000000000004,0.00063980599999999993],"608":[1.4330689999999999e-05,1.4461800000000001e-05],"2228224":[0.29838986049999999,0.29924227000000003],"36864":[0.0011033829999999999,0.0011575976249999999],"704":[1.7368850000000002e-05,1.8493310000000002e-05],"720896":[0.046940586500000006,0.071950388000000004],"800":[1.6204270000000001e-05,1.6776549999999998e-05],"2621440":[0.38045556999999997,0.40258066399999998],"425984":[0.0191183555,0.029914426000000001],"32768":[0.00089056899999999969,0.00093859900000000003],"12058624":[2.3891436480000001,2.3973246100000001],"128":[2.61405e-06,2.6693799999999997e-06],"180224":[0.0090581890000000012,0.0091104900000000006],"224":[4.3320199999999999e-06,4.4831500000000004e-06],"736":[1.9123890000000001e-05,2.0575179999999998e-05],"320":[7.2971099999999998e-06,7.3657499999999997e-06],"557056":[0.027957721499999998,0.038413745000000006],"832":[1.6738154929577466e-05,1.7446819999999998e-05],"9437184":[1.5979920965000001,1.6261218980000001],"3584":[8.3003999999999993e-05,8.5625749999999992e-05],"6291456":[1.2518267519999999,1.2586773794999999],"256":[4.9371099999999996e-06,5.2254899999999995e-06],"15204352":[2.4437639564999998,2.5169114829999999],"28672":[0.00073470400000000009,0.00074800333333333328],"768":[2.1714579999999999e-05,2.4147499999999999e-05],"212992":[0.0087625019999999967,0.008831066000000002],"864":[1.7441830000000002e-05,1.8933666666666668e-05],"352":[8.1212028985507243e-06,8.4662700000000002e-06],"253952":[0.011615905000000001,0.012024569000000001],"960":[2.0499728571428572e-05,2.1895110000000001e-05],"24576":[0.000879082,0.00091046779999999993],"7680":[0.000193673,0.000202802],"294912":[0.0142856865,0.015140259499999999],"1048576":[0.090167905500000006,0.13177243599999999],"10485760":[1.8136654325000001,1.841809231],"344064":[0.0180602885,0.018811959],"288":[5.8315199999999997e-06,6.6129899999999993e-06],"1152":[2.6007830000000001e-05,2.9017600000000001e-05],"384":[9.5043899999999993e-06,9.5836200000000006e-06],"2304":[5.6392999999999994e-05,6.1653333333333335e-05],"896":[1.8002440000000002e-05,1.965262e-05],"480":[9.8326600000000005e-06,1.0378189999999999e-05],"1441792":[0.16386937900000001,0.23775185200000001],"992":[2.0859390000000002e-05,2.2500290000000001e-05],"3968":[9.6485333333333329e-05,0.00010201066666666665],"6400":[0.00014173033333333331,0.00015528800000000001],"1344":[3.4769630000000002e-05,3.7815370000000002e-05],"126976":[0.0050435749999999998,0.0054604960000000013],"2883584":[0.46609882349999998,0.48274071549999997],"753664":[0.051656597499999998,0.083067216999999999],"16384":[0.00042988900000000003,0.00047081347368421056],"131072":[0.005159290999999999,0.0051695619999999999],"458752":[0.0223264,0.029376310999999999],"172032":[0.0081778570000000002,0.0082458709999999984],"12288":[0.00043078049999999997,0.00044909300000000007],"14680064":[2.3198527215000002,2.5772451665],"1536":[4.5174739999999996e-05,5.0733042105263155e-05],"25600":[0.00061015699999999984,0.00063257526666666653],"1835008":[0.22801540100000001,0.25472143599999997],"10752":[0.00033026599999999996,0.00036072650000000008],"21504":[0.00069288500000000007,0.00072409653846153862],"7602176":[1.1407458340000001,1.1418686149999999],"5632":[0.0001706549649122807,0.00018417424074074069],"10":[2.4787000000000001e-07,2.6113000000000001e-07],"3145728":[0.54245248300000004,0.62648311599999995],"245760":[0.010863030499999999,0.011269016],"1728":[3.7865499999999999e-05,3.9313639999999999e-05],"11":[2.7546999999999996e-07,3.0349999999999998e-07],"1114112":[0.0987580765,0.15698082499999999],"12":[2.9060999999999998e-07,2.9629000000000001e-07],"7340032":[1.102173055,1.1585075],"7168":[0.00018168500000000001,0.00018225988679245283],"13":[3.0892999999999995e-07,3.1243e-07],"6029312":[1.1281709355,1.142212225],"14":[3.4292999999999996e-07,3.5400000000000002e-07],"3200":[7.1015999999999999e-05,7.1214600000000001e-05],"20":[4.2918999999999999e-07,5.1837999999999996e-07],"204800":[0.0082707839999999998,0.0084230720000000002],"15":[3.4993000000000001e-07,3.7403000000000002e-07],"13312":[0.00033281617241379309,0.00034183682758620696],"4980736":[0.79688184149999997,0.80634778399999996],"118784":[0.0044569559999999998,0.0045031369999999999],"51200":[0.0013470666666666664,0.0014594778333333332],"16":[3.8933000000000001e-07,4.0040000000000001e-07],"21":[4.6025000000000001e-07,4.8833000000000003e-07],"917504":[0.073148580500000004,0.10978879],"22":[4.9533999999999999e-07,5.8202999999999998e-07],"4864":[0.00013963849999999999,0.00014068269117647054],"17":[3.7722000000000004e-07,3.9657999999999997e-07],"14848":[0.00038055500000000003,0.00039859500000000001],"23":[5.2145999999999996e-07,5.6169e-07],"786432":[0.056788816500000026,0.085630208000000013],"18":[4.6603e-07,4.9586000000000005e-07],"1638400":[0.186423072,0.19220114150000001],"7864320":[1.2129869040000001,1.2166911105],"24":[5.9630000000000001e-07,6.3313999999999996e-07],"14155776":[2.2215200519999998,2.281063751],"19":[4.0154999999999999e-07,4.5517999999999998e-07],"30":[6.1200999999999999e-07,6.5784999999999998e-07],"25":[5.3926999999999998e-07,5.4066999999999998e-07],"31":[6.3809000000000002e-07,6.4084999999999997e-07],"1280":[3.1822590000000002e-05,3.2260050000000003e-05],"26":[5.3566999999999993e-07,5.4965e-07],"3932160":[0.56716522349999998,0.58239221200000002],"2432":[6.2978999999999995e-05,6.3640648148148156e-05],"32":[6.4426999999999993e-07,6.8003999999999999e-07],"27":[5.5213000000000006e-07,6.0808000000000003e-07],"409600":[0.018064447500000001,0.018366516499999996]}},{"title":"OrderedSet intersection with Self (0% overlap)","results":{"28":[6.5466999999999997e-07,6.6055000000000007e-07],"34":[8.2037000000000003e-07,8.4361000000000002e-07],"29":[6.0607999999999998e-07,6.1213999999999997e-07],"40":[1.0002800000000001e-06,1.1948500000000001e-06],"17408":[0.00067210000000000024,0.00067489885714285686],"1472":[7.7189100000000003e-05,8.7532980000000002e-05],"112":[2.2526100000000001e-06,2.4560899999999998e-06],"1376256":[0.20440128399999999,0.289046831],"5242880":[1.221730161,1.22599521],"36":[9.3249000000000001e-07,9.5423999999999995e-07],"42":[1.16048e-06,1.34298e-06],"11534336":[3.480785622,3.5674233179999999],"114688":[0.0042947610000000002,0.0046146155000000005],"144":[4.0421499999999999e-06,4.0951666666666668e-06],"38":[8.5847000000000004e-07,1.2279000000000001e-06],"240":[5.1263500000000005e-06,5.2271000000000003e-06],"9216":[0.00034114899999999996,0.00036898400000000004],"44":[1.2091199999999999e-06,1.30418e-06],"1664":[4.0649000000000003e-05,4.2252129032258065e-05],"196608":[0.019063098000000004,0.019210544],"155648":[0.0084708830000000002,0.0084843760000000018],"2816":[0.0001373275,0.00014649225],"50":[9.8072999999999997e-07,1.05312e-06],"2359296":[0.38866644500000003,0.39201164500000002],"46":[1.4773600000000002e-06,1.6222999999999999e-06],"176":[6.48142e-06,6.9373399999999999e-06],"52":[1.0725999999999999e-06,1.10744e-06],"272":[6.7686000000000007e-06,7.0466400000000007e-06],"116":[2.3486799999999999e-06,2.6052099999999999e-06],"47104":[0.0026257390000000002,0.0027838959999999997],"6912":[0.00021876299999999999,0.000221924],"1856":[5.148262365591398e-05,5.2900839999999996e-05],"48":[1.64096e-06,1.8796000000000002e-06],"2097152":[0.28219201999999999,0.29983177150000001],"54":[1.0481500000000001e-06,1.10239e-06],"2031616":[0.26052993299999999,0.27572508299999998],"43008":[0.0020253892499999997,0.0021000050000000003],"60":[1.2202899999999999e-06,1.2524399999999999e-06],"30720":[0.00097214000000000003,0.001066408],"56":[1.1405200000000001e-06,1.2132300000000001e-06],"62":[1.38871e-06,1.4017899999999998e-06],"58":[1.1655999999999999e-06,1.2753999999999999e-06],"3014656":[0.88215557649999998,0.94492690300000004],"64":[1.3265400000000002e-06,1.33715e-06],"8388608":[1.5478464359999999,1.557750084],"29696":[0.00092023099999999998,0.00095647500000000003],"216":[4.2379200000000002e-06,4.8705900000000006e-06],"106496":[0.0038913674999999995,0.0042287254999999998],"72":[1.62211e-06,2.3871699999999998e-06],"442368":[0.020450179499999995,0.023453119500000001],"147456":[0.0074410249999999987,0.0075868340000000006],"4456448":[0.81274805500000002,0.82429100099999997],"63488":[0.0022895739999999995,0.0024297170000000001],"38912":[0.0016121340000000001,0.0016925424000000001],"68":[1.45802e-06,1.7481699999999999e-06],"188416":[0.015783736999999999,0.016299878],"248":[5.3497199999999995e-06,5.6326578947368418e-06],"80":[2.4229300000000001e-06,2.5186300000000003e-06],"2560":[0.00010580636363636362,0.00011618200000000001],"34816":[0.0012635422857142859,0.001269453],"3712":[0.00011541599999999999,0.00011794299999999998],"3538944":[0.51271662650000005,0.528935979],"76":[2.26261e-06,2.3349599999999998e-06],"4194304":[0.70361657700000002,0.70830448800000001],"851968":[0.060198909499999988,0.092510993499999999],"4096":[0.000136775,0.00014337700000000003],"59392":[0.0020774309999999998,0.0021780020000000005],"84":[2.3487999999999999e-06,2.9613399999999998e-06],"3276800":[0.44848799100000003,0.45459282200000001],"55296":[0.0017560589999999997,0.001902862],"688128":[0.059184266500000041,0.084083115],"8192":[0.00028638900000000001,0.00029100017647058828],"10240":[0.000427873,0.00046228800000000004],"15872":[0.00056679499999999993,0.00056722499999999998],"92":[3.25803e-06,6.4393899999999999e-06],"26624":[0.00078499699999999995,0.00080441400000000015],"1792":[4.8260249999999999e-05,5.2937970000000005e-05],"11776":[0.0006608050000000002,0.00066797700000000037],"2944":[0.00015194349999999999,0.000160576],"88":[2.9975899999999996e-06,4.2102900000000003e-06],"22528":[0.001198864,0.0012616939999999998],"1245184":[0.15014503200000001,0.21819659599999999],"15728640":[2.9373049400000002,2.9573225685],"96":[4.6018300000000001e-06,7.3221699999999996e-06],"1984":[6.1365079999999998e-05,6.1899670000000004e-05],"139264":[0.0066492600000000015,0.0070452910000000004],"475136":[0.025061411499999998,0.035297305000000001],"13631488":[2.2811897700000001,2.3572904389999998],"416":[8.3816999999999997e-06,8.6387799999999996e-06],"928":[2.399186e-05,2.590514e-05],"512":[1.32043e-05,1.3330550000000001e-05],"18432":[0.00074264584615384621,0.00075240400000000003],"16777216":[3.3033063414999999],"9728":[0.00039168300000000004,0.00041002899999999996],"1769472":[0.21538997800000004,0.21698921299999999],"1703936":[0.19220657199999999,0.19374074399999999],"2048":[6.5387372549019604e-05,7.2256130000000003e-05],"14336":[0.00043973300000000004,0.00046952047619047639],"448":[9.3219999999999999e-06,1.0106850000000001e-05],"5505024":[1.4252180759999999,1.4275090930000001],"544":[1.53358e-05,1.585515e-05],"221184":[0.0093501720000000003,0.010604977],"90112":[0.0051732160000000004,0.0053798319999999993],"640":[2.3757060000000001e-05,2.547114e-05],"12800":[0.00035539799999999993,0.00042086499999999998],"262144":[0.013053944,0.0131396165],"589824":[0.038304660499999997,0.052080290000000008],"884736":[0.06509827,0.091134175000000012],"6144":[0.000381703,0.00038870400000000002],"1088":[3.4093269999999999e-05,3.4111679999999999e-05],"576":[1.6698629999999998e-05,1.9584219999999999e-05],"160":[5.2883400000000009e-06,5.3144999999999997e-06],"672":[2.639853e-05,2.6712830000000002e-05],"8912896":[1.7522024190000001,1.7536439860000002],"100":[1.9379600000000001e-06,1.9822000000000003e-06],"507904":[0.027862474500000001,0.039939327000000011],"3840":[0.000122581,0.00012672399999999999],"192":[6.7135999999999996e-06,7.8781100000000007e-06],"376832":[0.034969800999999995,0.035581869000000002],"98304":[0.0075937239999999987,0.0076860620000000004],"5376":[0.00025088499999999995,0.00025288699999999998],"94208":[0.0059856090000000011,0.0065709260000000004],"81920":[0.0038753025000000003,0.0042128345000000001],"3407872":[0.475911274,0.49204364299999998],"104":[2.0949000000000001e-06,2.1501699999999998e-06],"122880":[0.0051597819999999999,0.0052555290000000001],"200":[3.8247500000000001e-06,3.9787999999999999e-06],"163840":[0.010235233999999999,0.011224406000000003],"4063232":[0.66449166999999998,0.66498145100000006],"5767168":[1.6793973129999999,1.6807406789999999],"12582912":[5.1224859220000001,10.246333225500001],"1600":[3.9261000000000002e-05,3.960677e-05],"136":[3.2846400000000001e-06,3.3273999999999997e-06],"232":[4.8665599999999999e-06,5.545369863013699e-06],"7077888":[1.1188878769999999,1.198867321],"86016":[0.0045859529999999994,0.0047501219999999999],"31744":[0.0010280269999999999,0.001107846],"168":[6.2728700000000001e-06,6.7796399999999997e-06],"622592":[0.043836936,0.05684457150000001],"108":[2.0673600000000001e-06,2.1008600000000002e-06],"327680":[0.021290901500000001,0.023365199],"2176":[7.1567189189189191e-05,7.6201074074074075e-05],"3328":[9.3061666666666664e-05,9.8011168539325841e-05],"1":[7.5709999999999994e-08,7.9300000000000002e-08],"2":[8.9500000000000001e-08,8.9630000000000003e-08],"3":[1.0567000000000001e-07,1.059e-07],"4":[1.2074000000000001e-07,1.2209e-07],"7424":[0.000225746,0.00026029118918918911],"5":[1.3687999999999999e-07,1.4499999999999999e-07],"23552":[0.0013756197142857141,0.0014276269999999999],"6":[1.5526999999999999e-07,1.6047999999999999e-07],"61440":[0.0022004059999999998,0.0022942960000000004],"491520":[0.025288174,0.032943962],"77824":[0.0034766969999999999,0.0036390509999999995],"7":[1.7371000000000001e-07,1.8158000000000002e-07],"8":[1.8539999999999998e-07,1.9522999999999998e-07],"208":[3.96415e-06,4.3903300000000005e-06],"9":[2.0228000000000001e-07,2.0537999999999998e-07],"73728":[0.0030364009999999998,0.0031662553333333329],"304":[8.6228800000000004e-06,1.0676270000000001e-05],"400":[8.0333600000000006e-06,8.8701399999999994e-06],"1310720":[0.17633641300000003,0.25259822799999998],"336":[1.2371768115942029e-05,1.2386700000000001e-05],"3670016":[0.54168745299999999,0.56068827300000001],"6656":[0.000186689,0.00021808599999999993],"15360":[0.00050628999999999974,0.00050773400000000003],"432":[8.9330599999999998e-06,9.5466299999999998e-06],"950272":[0.07422016399999995,0.115371417],"655360":[0.050072605999999999,0.070199682000000013],"69632":[0.0028669610000000003,0.0029107866666666657],"11264":[0.00058454399999999999,0.00059058400000000001],"2752512":[0.61245382950000005,0.678998086],"8126464":[1.4422514070000001,1.4702559449999999],"27648":[0.00087577499999999997,0.0008837430000000002],"368":[1.4622260000000001e-05,1.5363539999999999e-05],"65536":[0.0024772582499999998,0.0029103124999999997],"16252928":[3.0703801300000002,3.0726976170000002],"464":[1.1003e-05,1.16708e-05],"1015808":[0.085004602999999998,0.12849719600000001],"3072":[0.00019410707843137257,0.00019496650000000001],"110592":[0.004069287999999999,0.004237007499999999],"237568":[0.010894988500000003,0.011114276000000003],"278528":[0.015192539999999999,0.01521633],"496":[1.171175e-05,1.1921e-05],"13107200":[2.1588029409999998,2.2543148455000002],"9961472":[2.2501661390000001,2.3512607879999998],"5888":[0.000307745,0.000327852],"11010048":[2.9544125189999999,3.0559203545],"1920":[5.3758849999999689e-05,5.62557808219178e-05],"2490368":[0.43950814700000002,0.47047715099999998],"19456":[0.00082319363636363611,0.00082327399999999992],"57344":[0.00188222,0.0019544810000000001],"1179648":[0.12849118700000001,0.19166797599999999],"4718592":[0.91876212199999996,0.96598791949999996],"360448":[0.02939156599999998,0.031199108499999999],"1572864":[0.35767643500000001,0.36770208450000003],"53248":[0.00168771,0.0017473200000000001],"3456":[0.0001014147608695652,0.00010640517441860462],"40960":[0.001775827,0.0018517829999999996],"4608":[0.00017632699999999997,0.00017937103703703707],"13824":[0.00041193999999999996,0.00041908200000000004],"819200":[0.054075384999999997,0.080665740999999999],"983040":[0.085816265000000003,0.11999486099999999],"8704":[0.00031943167741935489,0.00032209333333333334],"120":[2.5301803278688523e-06,2.6050900000000004e-06],"1024":[3.009913e-05,3.2050450000000004e-05],"49152":[0.0031746129999999997,0.0033449254999999996],"524288":[0.029311325999999999,0.038601213000000002],"45056":[0.0023020940000000002,0.0024839129999999995],"229376":[0.010179750499999999,0.010830243999999998],"2688":[0.00011313985714285715,0.000118996],"152":[4.0622300000000002e-06,4.7119800000000002e-06],"5120":[0.00020052699999999999,0.00021437499999999999],"1507328":[0.301540317,0.43387005150000002],"1216":[4.4704410000000006e-05,4.8627159999999998e-05],"1966080":[0.25270659499999998,0.25937970399999999],"1900544":[0.23922792599999998,0.24847771900000004],"184":[7.5120099999999993e-06,1.0151820000000001e-05],"7936":[0.000251418,0.00027312842857142854],"3801088":[0.57819226350000008,0.59125357599999995],"6815744":[1.087809357,1.1292861114999999],"124":[2.6875399999999999e-06,2.86202e-06],"102400":[0.0035945490000000011,0.003668064],"311296":[0.020205091999999997,0.020403426499999999],"1408":[6.3428770000000003e-05,6.7260220000000005e-05],"393216":[0.039862879500000004,0.044016882],"4352":[0.00015670598387096773,0.00015678],"6553600":[1.0028425459999999,1.0760778950000001],"20480":[0.00093520739999999999,0.00093850229999999958],"608":[1.9984319999999999e-05,2.1577329999999996e-05],"2228224":[0.33775917,0.33864599399999995],"36864":[0.001424809,0.0015630970000000001],"704":[2.8426889999999996e-05,2.8616629999999998e-05],"720896":[0.07546504200000001,0.1103339705],"800":[1.7973729999999999e-05,1.9049559999999999e-05],"2621440":[0.52477778350000004,0.53309838199999993],"425984":[0.019941699,0.028288957],"32768":[0.0011525979999999999,0.0011784620000000001],"12058624":[4.2208506159999999,4.2317776179999997],"128":[3.0395900000000002e-06,3.4394699999999999e-06],"180224":[0.0133998715,0.0136570605],"224":[4.6315499999999997e-06,4.6870899999999997e-06],"736":[3.0264666666666665e-05,3.4983156626506022e-05],"320":[1.0784679999999999e-05,1.1060919999999999e-05],"557056":[0.034118609500000001,0.056781660499999997],"832":[1.9887889999999999e-05,2.022998e-05],"9437184":[2.0142617519999999,2.0683625129999998],"3584":[0.00010793214130434786,0.00011153621176470589],"6291456":[2.4536628399999998,2.4943409674999999],"256":[5.5192700000000003e-06,6.3091899999999998e-06],"15204352":[2.7608424774999998,2.8093889519999999],"28672":[0.00092123349999999988,0.000936676],"768":[4.4717111111111115e-05,5.8393999999999997e-05],"212992":[0.009132514999999999,0.0091644399999999994],"864":[2.1141108695652173e-05,2.2038349999999999e-05],"352":[1.398085e-05,1.6569e-05],"253952":[0.012732953999999999,0.016612190999999995],"960":[2.5815890000000001e-05,2.6150177419354841e-05],"24576":[0.0016610469999999999,0.0017269917999999992],"7680":[0.00025505407894736839,0.00026754000000000003],"294912":[0.017214371000000003,0.018770665000000002],"1048576":[0.094076257499999996,0.13897997750000002],"10485760":[2.5346338130000001,2.570152271],"344064":[0.0259583725,0.026312255999999999],"288":[7.8974899999999995e-06,8.0907399999999997e-06],"1152":[3.7750000000000003e-05,3.9654060000000001e-05],"384":[2.1171879999999998e-05,2.1356517241379309e-05],"2304":[8.1002810000000011e-05,8.5837090909090909e-05],"896":[2.2378259999999999e-05,2.3784280000000001e-05],"480":[1.0964180000000001e-05,1.2184699999999999e-05],"1441792":[0.25121205699999999,0.36453812899999999],"992":[2.6551840000000002e-05,2.7798938775510207e-05],"3968":[0.00012564400000000001,0.000134401],"6400":[0.00018368,0.000191733],"1344":[5.4508666666666662e-05,5.6281394736842109e-05],"126976":[0.0054558289999999997,0.0056354409999999988],"2883584":[0.70092489899999999,0.77067734300000001],"753664":[0.083826097499999988,0.132315552],"16384":[0.00056650699999999984,0.00057768800000000003],"131072":[0.0057422810000000001,0.0060651160000000006],"458752":[0.023021521499999999,0.030434698500000003],"172032":[0.011413877499999999,0.0115327555],"12288":[0.00080191149999999983,0.0009478898000000001],"14680064":[2.599533825,2.8494258449999998],"1536":[8.7168000000000003e-05,9.6376e-05],"25600":[0.0007222149999999999,0.00073831999999999999],"1835008":[0.21558880899999999,0.24315406399999995],"10752":[0.00051170861111111098,0.00051740426315789474],"21504":[0.0010364529999999999,0.001069885],"7602176":[1.248458676,1.2642653385],"5632":[0.00027959000000000013,0.00029174500000000005],"10":[2.1565999999999999e-07,2.4499999999999998e-07],"3145728":[1.0476677575,1.1574992200000001],"245760":[0.012139423,0.012178688],"1728":[4.5640400000000004e-05,4.7606269999999996e-05],"11":[2.4433999999999998e-07,3.0232999999999998e-07],"1114112":[0.108675801,0.16622733100000001],"12":[2.5085e-07,2.5667999999999999e-07],"7340032":[1.1935731075,1.2712035100000001],"7168":[0.00023362027499999999,0.00024146560000000002],"13":[2.9661000000000001e-07,3.2102e-07],"6029312":[2.0064879250000001,2.0125970354999998],"14":[3.2969999999999999e-07,3.9094999999999999e-07],"3200":[8.7194000000000006e-05,9.1305833333333336e-05],"20":[4.6634000000000003e-07,5.1742000000000004e-07],"204800":[0.0082682999999999993,0.0091214440000000011],"15":[3.3508000000000001e-07,3.6193999999999997e-07],"13312":[0.00039171099999999999,0.00041607999999999999],"4980736":[1.0578357974999999,1.0759272630000001],"118784":[0.0047531869999999999,0.0048692185000000004],"51200":[0.0015214029999999997,0.0016809150000000003],"16":[3.7542000000000001e-07,4.2632000000000002e-07],"21":[6.0757999999999999e-07,8.4234999999999997e-07],"917504":[0.074378505999999983,0.107495538],"22":[6.6644999999999999e-07,7.6055000000000007e-07],"4864":[0.0001798475,0.00020443300000000001],"17":[4.0037000000000003e-07,4.3189000000000004e-07],"14848":[0.00050170500000000008,0.00050746400000000001],"23":[7.1918999999999997e-07,7.7510999999999996e-07],"786432":[0.10867310149999999,0.16445106649999999],"18":[5.2511000000000002e-07,6.0928000000000001e-07],"1638400":[0.1730592695,0.20286670500000001],"7864320":[1.3443037150000001,1.372629302],"24":[9.0683999999999999e-07,9.3964000000000002e-07],"14155776":[2.41481447,2.5210880695000002],"19":[4.3384999999999998e-07,4.3557000000000003e-07],"30":[6.2949000000000001e-07,6.4137000000000003e-07],"25":[5.1001000000000005e-07,5.2130999999999995e-07],"31":[6.6798999999999994e-07,6.8197000000000001e-07],"1280":[4.7757999999999999e-05,4.9543499999999998e-05],"26":[5.7291000000000001e-07,6.2147000000000002e-07],"3932160":[0.611533828,0.64392285199999999],"2432":[9.3518219999999997e-05,9.5899022727272725e-05],"32":[7.0599000000000004e-07,7.1773999999999997e-07],"27":[5.3301999999999994e-07,6.0080999999999999e-07],"409600":[0.018782561,0.019048946000000004]}},{"title":"OrderedSet intersection with Self (25% overlap)","results":{"28":[9.9024999999999996e-07,1.10351e-06],"34":[1.37467e-06,1.4285400000000002e-06],"29":[9.6141000000000008e-07,9.6550999999999997e-07],"40":[1.5888900000000001e-06,1.85233e-06],"17408":[0.0010336710000000001,0.0011044969999999999],"1472":[9.4799142857142861e-05,0.00011246133333333334],"112":[4.4378400000000004e-06,4.5159999999999996e-06],"1376256":[0.25126152400000001,0.36797754599999999],"5242880":[1.405313708,1.4055383940000001],"36":[1.4511200000000001e-06,1.6067499999999999e-06],"42":[1.6558299999999999e-06,2.0143599999999999e-06],"11534336":[3.8059510295000001,3.876723299],"114688":[0.0077712760000000006,0.0082775809999999957],"144":[6.0501999999999993e-06,6.7831700000000001e-06],"38":[1.4376499999999999e-06,1.7085399999999999e-06],"240":[1.0631180000000001e-05,1.069406e-05],"9216":[0.00054634300000000002,0.00056011600000000004],"44":[1.7649e-06,1.8071199999999999e-06],"1664":[8.8721000000000007e-05,9.039222e-05],"196608":[0.021714295500000001,0.022072580999999997],"155648":[0.012192080000000001,0.012467586499999999],"2816":[0.00017172199999999997,0.000179469],"50":[1.5313100000000001e-06,1.61922e-06],"2359296":[0.48877277749999998,0.4909130485],"46":[1.9991234567901234e-06,2.0219099999999999e-06],"176":[9.1286299999999997e-06,9.5646300000000003e-06],"52":[1.6307800000000002e-06,1.64587e-06],"272":[1.2542140000000001e-05,1.2617295774647887e-05],"116":[4.6033399999999999e-06,4.9230300000000005e-06],"47104":[0.0034008720000000005,0.0034578540000000007],"6912":[0.000377427,0.00041660800000000001],"1856":[9.9086733333333328e-05,0.000100237],"48":[2.0518500000000001e-06,2.6859500000000001e-06],"2097152":[0.37547078899999997,0.39538570399999995],"54":[1.70691e-06,1.7342000000000001e-06],"2031616":[0.35593982400000002,0.36732753499999998],"43008":[0.002792419,0.0030039703333333326],"60":[1.9300300000000001e-06,1.9416000000000002e-06],"30720":[0.0017858820000000004,0.001796661],"56":[1.7672099999999998e-06,1.7746099999999998e-06],"62":[2.3543399999999999e-06,2.5871500000000003e-06],"58":[1.8578e-06,1.8598200000000001e-06],"3014656":[0.93384830799999996,0.99946550550000002],"64":[2.3305882352941178e-06,2.4571599999999997e-06],"8388608":[2.0472270405000002,2.0748928680000001],"29696":[0.001716937,0.0017332584000000011],"216":[9.1540000000000008e-06,9.6008999999999998e-06],"106496":[0.0072511940000000007,0.0076494880000000003],"72":[2.6552500000000001e-06,2.9873499999999999e-06],"442368":[0.0372759675,0.046196556999999999],"147456":[0.011052468000000001,0.01136241],"4456448":[1.025501279,1.0346168899999999],"63488":[0.0039774159999999992,0.0042112420000000005],"38912":[0.002441393,0.00247737075],"68":[2.6051900000000002e-06,2.9517500000000002e-06],"188416":[0.019068591999999995,0.020094214500000002],"248":[1.0893199999999999e-05,1.1766970000000001e-05],"80":[2.9976699999999997e-06,3.8421400000000003e-06],"2560":[0.00015271340322580649,0.00016959599999999999],"34816":[0.0020983870000000002,0.00213292975],"3712":[0.00020398433333333337,0.00021130048780487802],"3538944":[0.707939125,0.73142499999999999],"76":[2.8960599999999998e-06,3.6278400000000001e-06],"4194304":[0.92317150000000003,0.92775803400000001],"851968":[0.101342059,0.14144090300000001],"4096":[0.00022698400000000001,0.00025896713157894737],"59392":[0.0037013179999999994,0.0038179199999999998],"84":[3.5668499999999996e-06,4.0403799999999998e-06],"3276800":[0.65517560900000005,0.67423691699999999],"55296":[0.003443336,0.003544401],"688128":[0.077073101999999991,0.112874843],"8192":[0.00047969200000000004,0.00049248300000000016],"10240":[0.00064123100000000003,0.00066044600000000008],"15872":[0.000937096,0.0010239973333333334],"92":[4.4724499999999998e-06,6.2885700000000007e-06],"26624":[0.0015365050000000001,0.0016293950000000001],"1792":[9.5734166666666662e-05,0.00010305465116279065],"11776":[0.00087043100000000018,0.00092623600000000009],"2944":[0.00019884999999999998,0.00019959900000000004],"88":[3.8892699999999998e-06,4.2388300000000004e-06],"22528":[0.001516583,0.0017661449999999996],"1245184":[0.20322586850000002,0.27073806750000001],"15728640":[4.0951318404999997,4.1546126584999996],"96":[6.2095399999999998e-06,7.4963199999999994e-06],"1984":[0.00010055266666666666,0.00011292179518072287],"139264":[0.010303636999999999,0.011501027],"475136":[0.042134838000000008,0.058442303500000001],"13631488":[3.4069798725,3.5263745150000001],"416":[1.7731e-05,1.8816933333333333e-05],"928":[4.7880499999999997e-05,4.9465510000000003e-05],"512":[2.3786760000000001e-05,2.393756e-05],"18432":[0.0011179715000000001,0.001152429],"16777216":[4.5309024610000002],"9728":[0.00059924099999999992,0.00063725900000000026],"1769472":[0.29498292000000004,0.32299785199999997],"1703936":[0.28246543600000001,0.28779319799999997],"2048":[0.00011166407142857145,0.00011355759999999997],"14336":[0.00083314736363636376,0.00084147300000000003],"448":[1.9770560000000001e-05,2.0158070000000001e-05],"5505024":[1.559040113,1.5926310969999999],"544":[2.7023149999999999e-05,2.7229999999999998e-05],"221184":[0.016702255500000002,0.019674182000000002],"90112":[0.0070558060000000004,0.0072824019999999986],"640":[3.0735333333333337e-05,3.5437500000000001e-05],"12800":[0.00072190500000000001,0.00074518200000000005],"262144":[0.020794082499999998,0.021186866000000002],"589824":[0.057208572499999985,0.0889182835],"884736":[0.10478106,0.148637625],"6144":[0.00047113599999999993,0.000479896],"1088":[5.5636333333333335e-05,5.7934249999999995e-05],"576":[2.9580000000000001e-05,3.3429430000000004e-05],"160":[7.5898499999999998e-06,8.3596666666666672e-06],"672":[3.5222320000000005e-05,3.7627379999999997e-05],"8912896":[2.2479254009999998,2.3023326050000001],"100":[3.9689100000000001e-06,4.3838571428571425e-06],"507904":[0.044977411000000009,0.071862295500000048],"3840":[0.00021254600000000001,0.00022319461363636356],"192":[1.167218e-05,1.287847e-05],"376832":[0.041586222499999999,0.0427047765],"98304":[0.0090149010000000005,0.0093329940000000007],"5376":[0.00034103699999999993,0.00035673903999999996],"94208":[0.0077736929999999999,0.0080668790000000025],"81920":[0.0056464250000000009,0.0058909240000000005],"3407872":[0.68241410700000005,0.69811960649999993],"104":[4.1687200000000001e-06,4.2708200000000004e-06],"122880":[0.008680274,0.0090882940000000002],"200":[8.5691900000000002e-06,8.9071199999999995e-06],"163840":[0.013880841,0.013888381],"4063232":[0.86780467900000002,0.90442867150000006],"5767168":[1.80883598,1.810288911],"12582912":[5.1431152100000004,10.204662293],"1600":[8.6325238095238103e-05,9.1683999999999998e-05],"136":[5.4990000000000002e-06,6.1204900000000002e-06],"232":[9.8003799999999988e-06,9.94555e-06],"7077888":[1.587939639,1.795208761],"86016":[0.0062954339999999999,0.0064876550000000002],"31744":[0.0018634749999999999,0.0019312027999999998],"168":[8.0888787878787882e-06,8.4556400000000002e-06],"622592":[0.063483535000000008,0.1062922665],"108":[4.4022400000000002e-06,4.5810700000000005e-06],"327680":[0.028642478500000002,0.033791842499999988],"2176":[0.000119955,0.00012818613157894736],"3328":[0.00018971634615384616,0.00019424419565217392],"1":[1.5877000000000001e-07,1.5968000000000001e-07],"2":[1.7725999999999999e-07,1.7732e-07],"3":[1.8787000000000003e-07,1.9133000000000001e-07],"4":[2.0388e-07,2.0503999999999999e-07],"7424":[0.00042595604545454552,0.00044772599999999996],"5":[2.2589999999999998e-07,2.2856e-07],"23552":[0.0017110720000000003,0.0018140726000000003],"6":[2.5394000000000001e-07,2.7290000000000002e-07],"61440":[0.0038505449999999995,0.004034438999999999],"491520":[0.042537375000000002,0.057745318999999996],"77824":[0.0051784260000000007,0.0052282090000000002],"7":[2.6155000000000001e-07,2.6693999999999998e-07],"8":[2.7322999999999997e-07,2.7565000000000001e-07],"208":[8.7883500000000003e-06,8.8264900000000003e-06],"9":[4.1492999999999997e-07,4.3478999999999999e-07],"73728":[0.0047580009999999996,0.0049470429999999999],"304":[1.390423e-05,1.49874e-05],"400":[1.8117e-05,1.8152249999999999e-05],"1310720":[0.222453083,0.30595515400000001],"336":[1.779779e-05,1.8409990000000001e-05],"3670016":[0.75643174099999999,0.762141662],"6656":[0.00038801800000000007,0.00042335423809523821],"15360":[0.00090983660000000001,0.00092479200000000013],"432":[1.8997000000000001e-05,1.9360763157894736e-05],"950272":[0.12448403600000001,0.16426969199999997],"655360":[0.069766434999999988,0.104374195],"69632":[0.0044701900000000006,0.0045217180000000001],"11264":[0.00076633399999999992,0.0007789585833333333],"2752512":[0.71222548399999996,0.78420241600000007],"8126464":[1.9447786600000001,1.9700788185],"27648":[0.0016709920000000007,0.0017135192],"368":[2.0322e-05,2.1138122807017542e-05],"65536":[0.0041154690000000001,0.0051636190000000012],"16252928":[4.2161578009999996,4.286946608],"464":[2.2030399999999998e-05,2.2592519999999999e-05],"1015808":[0.14242175900000001,0.206067786],"3072":[0.00023382399999999996,0.00024012650000000002],"110592":[0.0077952830000000001,0.0080371670000000013],"237568":[0.018831721000000003,0.019067497500000002],"278528":[0.0227267975,0.023985819499999998],"496":[2.269798e-05,2.3133538461538463e-05],"13107200":[3.2412265859999998,3.4936786939999998],"9961472":[2.8052766199999999,2.9129066159999999],"5888":[0.00041708200000000004,0.00042915975000000001],"11010048":[3.3647502760000001,3.4102971480000002],"1920":[9.836933333333334e-05,0.00010244283333333333],"2490368":[0.54484122000000001,0.57965317999999999],"19456":[0.0012047989999999999,0.001220795],"57344":[0.0034876959999999998,0.0036747990000000003],"1179648":[0.18583728900000002,0.25491624950000003],"4718592":[1.151411575,1.1604006044999999],"360448":[0.03615160299999999,0.040225646499999997],"1572864":[0.40352744699999998,0.41577571899999999],"53248":[0.0031905179999999998,0.0033602270000000004],"3456":[0.00019468407843137262,0.00020026179999999989],"40960":[0.002634899,0.0026561033333333335],"4608":[0.00026408475000000008,0.00027595099999999992],"13824":[0.00079109600000000014,0.00079847618181818172],"819200":[0.092451084999999988,0.14672612700000001],"983040":[0.13251041199999999,0.18372844150000001],"8704":[0.00051673357894736706,0.00053503199999999996],"120":[4.6920399999999995e-06,4.7446499999999995e-06],"1024":[5.1450499999999998e-05,5.7117820000000005e-05],"49152":[0.0040173780000000003,0.0042756599999999997],"524288":[0.048222889999999997,0.067159913499999987],"45056":[0.0031413366666666665,0.0031836329999999995],"229376":[0.017526536999999991,0.019644001000000001],"2688":[0.000165095,0.00017867500000000002],"152":[6.6485599999999999e-06,7.0527100000000001e-06],"5120":[0.00031381574074074088,0.0003236515],"1507328":[0.33310436300000001,0.45753637400000002],"1216":[6.5946333333333329e-05,7.4564020000000001e-05],"1966080":[0.34044033600000001,0.35212539300000001],"1900544":[0.33778565000000005,0.35998715599999997],"184":[9.0080400000000002e-06,1.1781999999999998e-05],"7936":[0.00045437899999999998,0.00047569538888888891],"3801088":[0.79492837500000002,0.82201327699999993],"6815744":[1.621485563,1.6972202095],"124":[4.8372299999999996e-06,5.3054199999999998e-06],"102400":[0.0069596770000000001,0.0072137220000000005],"311296":[0.027895457500000005,0.0290905025],"1408":[8.61065e-05,9.5792111111111109e-05],"393216":[0.045805301,0.056043262999999954],"4352":[0.00025568144736842107,0.00025695581081081081],"6553600":[1.4994688535,1.881526483],"20480":[0.0013253624285714288,0.0013367909999999999],"608":[2.9558219999999999e-05,3.3130545454545453e-05],"2228224":[0.42994875199999999,0.44147340099999999],"36864":[0.0022765824999999998,0.0023641620000000004],"704":[4.0720999999999999e-05,4.513179e-05],"720896":[0.098901834500000008,0.15811517999999999],"800":[4.1237759999999997e-05,4.1250069999999998e-05],"2621440":[0.61375334100000001,0.62394956899999998],"425984":[0.0354555535,0.044359971499999984],"32768":[0.001918293,0.0020145802499999992],"12058624":[4.3869139730000004,4.4714919929999999],"128":[5.0384300000000003e-06,5.5770000000000001e-06],"180224":[0.016348734,0.016826823500000004],"224":[9.5761499999999998e-06,1.0201040000000001e-05],"736":[4.4607059999999999e-05,4.9490680000000002e-05],"320":[1.530379e-05,1.64575e-05],"557056":[0.053500433,0.09273157949999998],"832":[4.1841889999999996e-05,4.3139509999999997e-05],"9437184":[2.4987912864999999,2.6255760745000001],"3584":[0.00019987849999999999,0.00020644566666666665],"6291456":[2.4829410665,2.4952664360000001],"256":[1.101216e-05,1.1641699999999999e-05],"15204352":[3.8971471135,4.190004858],"28672":[0.001657003,0.0017264329999999999],"768":[4.755692e-05,5.2363e-05],"212992":[0.016427148999999995,0.017422457000000002],"864":[4.3604309999999999e-05,4.5188219999999997e-05],"352":[2.0815936507936507e-05,2.0959333333333334e-05],"253952":[0.02026756,0.021554386000000005],"960":[4.7749669999999999e-05,4.9615130000000001e-05],"24576":[0.0019465420000000003,0.0020820420000000001],"7680":[0.00042485400000000001,0.00043541000000000012],"294912":[0.025003345500000003,0.026732516000000005],"1048576":[0.13844646099999999,0.19578549349999999],"10485760":[2.9822726159999999,3.0709938980000002],"344064":[0.033544329999999997,0.033564622499999995],"288":[1.2816058823529412e-05,1.2909699999999999e-05],"1152":[6.2072166666666672e-05,6.3585127272727278e-05],"384":[2.4043477777777777e-05,2.714376e-05],"2304":[0.00013631266666666667,0.00013984042857142858],"896":[4.2369e-05,4.7385929999999998e-05],"480":[2.167348e-05,2.3343750000000002e-05],"1441792":[0.290155143,0.38719837099999999],"992":[5.2189499999999999e-05,5.2515510000000003e-05],"3968":[0.00021992099999999996,0.00023415176190476187],"6400":[0.00036704400000000007,0.00037187880769230775],"1344":[7.8246500000000004e-05,8.1632510000000002e-05],"126976":[0.0090124889999999985,0.0093324140000000024],"2883584":[0.78960371500000004,0.84383315800000003],"753664":[0.10228034900000001,0.16015591200000001],"16384":[0.0009730880000000001,0.0010377254444444443],"131072":[0.0093013440000000031,0.010561839999999999],"458752":[0.039527580499999992,0.054534334000000018],"172032":[0.014799131,0.015235467499999999],"12288":[0.0009330120000000001,0.001040572],"14680064":[3.7178572839999999,7.1261893719999998],"1536":[0.00011393391764705877,0.00011927946153846158],"25600":[0.0014848259999999999,0.0015479991666666668],"1835008":[0.32130742200000001,0.36261717599999999],"10752":[0.00068191499999999984,0.00068967299999999991],"21504":[0.0014490100000000001,0.0014529521666666666],"7602176":[1.7558747809999999,1.767896924],"5632":[0.00037570275000000004,0.00039690099999999996],"10":[4.5441e-07,4.6681999999999999e-07],"3145728":[1.0708458359999999,1.127301375],"245760":[0.019761826500000003,0.020507873999999999],"1728":[9.6142757894736839e-05,9.8595571428571426e-05],"11":[4.9943999999999998e-07,5.1545999999999993e-07],"1114112":[0.157092538,0.22394793099999999],"12":[4.5724999999999999e-07,4.8106999999999995e-07],"7340032":[1.6762774045,1.6938731840000001],"7168":[0.00042280426086956514,0.00043465181818181807],"13":[5.0617000000000004e-07,5.7265000000000004e-07],"6029312":[2.0988399050000002,2.1000443930000001],"14":[5.3081999999999998e-07,5.4535e-07],"3200":[0.00017432,0.00019092867307692307],"20":[8.2948000000000004e-07,9.2503999999999998e-07],"204800":[0.015691551499999998,0.018503961999999999],"15":[5.4422000000000004e-07,5.5340999999999992e-07],"13312":[0.00072605399999999985,0.00081220200000000004],"4980736":[1.254571063,1.2719043915000001],"118784":[0.0083374590000000002,0.0084155890000000011],"51200":[0.003071842,0.0034564495000000001],"16":[5.9428000000000005e-07,5.9785000000000002e-07],"21":[9.2562e-07,1.0440399999999999e-06],"917504":[0.107918759,0.17123321850000001],"22":[9.8977999999999991e-07,1.0454800000000001e-06],"4864":[0.00029966900000000002,0.000305914125],"17":[7.7317000000000009e-07,8.9981999999999997e-07],"14848":[0.00086987345454545473,0.00096252079999999997],"23":[1.0013799999999999e-06,1.1156900000000001e-06],"786432":[0.1187672765,0.19042612950000001],"18":[7.8991000000000001e-07,9.6826000000000007e-07],"1638400":[0.26428043300000004,0.26905041900000004],"7864320":[1.8492759255,1.8560543085000001],"24":[1.16351e-06,1.26732e-06],"14155776":[3.60600495,3.8181831239999999],"19":[8.0686999999999997e-07,8.1289999999999998e-07],"30":[9.8199000000000002e-07,1.11581e-06],"25":[8.6746999999999997e-07,9.4287000000000002e-07],"31":[1.0519399999999999e-06,1.10183e-06],"1280":[7.2444085714285712e-05,7.2986700000000004e-05],"26":[9.4725000000000002e-07,9.7133999999999996e-07],"3932160":[0.83435159000000003,0.88471899750000005],"2432":[0.00014176600000000001,0.00014451699999999999],"32":[1.0980900000000001e-06,1.1074599999999999e-06],"27":[9.9757000000000001e-07,1.0016700000000001e-06],"409600":[0.03501840350000001,0.037299047999999987]}},{"title":"OrderedSet intersection with Self (50% overlap)","results":{"28":[1.2391699999999999e-06,1.3090000000000001e-06],"34":[1.8843300000000001e-06,2.0719800000000001e-06],"29":[1.1600699999999999e-06,1.2198200000000001e-06],"40":[2.1954499999999999e-06,2.3258700000000001e-06],"17408":[0.0013679581428571431,0.0015021127999999999],"1472":[0.000120944,0.00013099066666666663],"112":[7.1377899999999998e-06,7.2013299999999995e-06],"1376256":[0.30558096599999995,0.42648705450000002],"5242880":[1.6816142949999999,1.715743131],"36":[1.9362499999999999e-06,2.1761400000000001e-06],"42":[2.3711800000000001e-06,2.3852500000000002e-06],"11534336":[4.3612216310000003,4.5258665200000001],"114688":[0.010910666499999999,0.011725981999999999],"144":[8.7646499999999992e-06,9.7367199999999992e-06],"38":[2.0460599999999999e-06,2.2270399999999999e-06],"240":[1.5522019999999999e-05,1.5739800000000001e-05],"9216":[0.000682586,0.0007519060000000001],"44":[2.4038600000000001e-06,2.7196600000000001e-06],"1664":[0.00012358225000000001,0.00012829400000000002],"196608":[0.024496452500000002,0.024741359500000004],"155648":[0.0159291235,0.015943190499999999],"2816":[0.00022423900000000005,0.00022561099999999996],"50":[3.1782099999999998e-06,3.4498999999999998e-06],"2359296":[0.60138075000000002,0.60372851000000005],"46":[2.6701200000000002e-06,2.7315e-06],"176":[1.134925e-05,1.2001640000000002e-05],"52":[3.2334699999999996e-06,3.5212900000000002e-06],"272":[1.744999e-05,1.8567540000000001e-05],"116":[7.1371999999999992e-06,7.2640300000000007e-06],"47104":[0.0041361505000000005,0.0043479550000000006],"6912":[0.00056679449999999998,0.00058522700000000001],"1856":[0.00013714,0.000141569],"48":[2.6876599999999999e-06,3.1406099999999999e-06],"2097152":[0.48263293099999999,0.51563620349999995],"54":[3.3093199999999999e-06,3.3397700000000002e-06],"2031616":[0.46604523349999999,0.47999209549999999],"43008":[0.003542735,0.0036913129999999995],"60":[3.5719099999999999e-06,3.66779e-06],"30720":[0.0024391670000000003,0.0024865463333333328],"56":[3.3936200000000001e-06,3.4225400000000001e-06],"62":[3.7319000000000002e-06,4.0931900000000002e-06],"58":[3.4434299999999999e-06,3.47639e-06],"3014656":[1.007296113,1.0694862464999999],"64":[3.6516899999999998e-06,4.04197e-06],"8388608":[2.7098100365,2.775606061],"29696":[0.0024208075000000003,0.0024455749999999997],"216":[1.4178199999999999e-05,1.4190909999999999e-05],"106496":[0.0101977205,0.011173859],"72":[4.3987699999999997e-06,4.4704700000000002e-06],"442368":[0.053049389500000002,0.062929662999999997],"147456":[0.014472157000000003,0.014845891],"4456448":[1.297517306,1.304679331],"63488":[0.0054485619999999997,0.0055541569999999997],"38912":[0.003223297333333334,0.0032756509999999988],"68":[4.1896399999999999e-06,4.3505500000000002e-06],"188416":[0.0220786405,0.024849391000000002],"248":[1.563861e-05,1.7433459999999999e-05],"80":[4.7681600000000001e-06,5.0369399999999994e-06],"2560":[0.00019994846666666669,0.000206200875],"34816":[0.0028171400000000005,0.0028292336666666676],"3712":[0.00027909199999999999,0.000295643],"3538944":[0.97632524200000004,0.98826464300000005],"76":[4.4031700000000001e-06,4.7840899999999998e-06],"4194304":[1.1931524554999999,1.2092882975000001],"851968":[0.14000538100000004,0.20469019199999999],"4096":[0.00031724600000000009,0.0003493283571428571],"59392":[0.0051119440000000002,0.0054075439999999994],"84":[5.27198e-06,5.5735099999999999e-06],"3276800":[0.88543754450000001,0.89058410799999999],"55296":[0.004714897,0.0049069629999999986],"688128":[0.099848281999999983,0.13966171399999999],"8192":[0.00061432000000000001,0.00066145099999999997],"10240":[0.00082294163636363637,0.0008525090000000001],"15872":[0.0012511149999999999,0.001318622428571429],"92":[5.5162699999999996e-06,6.5050499999999997e-06],"26624":[0.002149055,0.0024348660000000004],"1792":[0.00013518740000000005,0.00013868799999999996],"11776":[0.001006524,0.001057922],"2944":[0.00023646933333333332,0.000243401],"88":[5.4447599999999997e-06,5.5594499999999998e-06],"22528":[0.001881136,0.0021323229999999998],"1245184":[0.25190485600000001,0.34592513450000001],"15728640":[5.5427141769999997,5.6915603585000003],"96":[5.8819299999999999e-06,7.4028999999999999e-06],"1984":[0.00015580950000000003,0.000156619125],"139264":[0.013989827,0.015641856999999999],"475136":[0.058361468499999992,0.096097057],"13631488":[4.8223981680000003,4.9704373049999999],"416":[2.8248580000000001e-05,2.82993488372093e-05],"928":[6.7788599999999997e-05,7.0805474999999997e-05],"512":[3.4980249999999998e-05,3.6113199999999998e-05],"18432":[0.0014909343333333329,0.0015657480000000001],"16777216":[6.0695106839999999],"9728":[0.00076655199999999999,0.00079725850000000008],"1769472":[0.41566732449999999,0.41626145050000002],"1703936":[0.39713628099999998,0.39784807599999999],"2048":[0.000150245,0.00015792000000000001],"14336":[0.0011577204999999998,0.001167267125],"448":[3.0541269999999996e-05,3.0988929999999999e-05],"5505024":[1.8160251709999999,1.858417083],"544":[3.7827609999999997e-05,3.8194179487179487e-05],"221184":[0.023018522,0.026575091000000006],"90112":[0.0085882690000000008,0.0091078529999999991],"640":[4.5818159999999998e-05,4.6740999999999999e-05],"12800":[0.0010754276666666666,0.001137964],"262144":[0.028228739000000003,0.028939453],"589824":[0.07659336550000001,0.1116578365],"884736":[0.15288917300000004,0.19766917750000002],"6144":[0.00053338300000000001,0.00056688500000000015],"1088":[8.0433130434782611e-05,8.2491349999999991e-05],"576":[4.1457129999999995e-05,4.3611444444444443e-05],"160":[9.7545499999999996e-06,9.8560800000000007e-06],"672":[4.7621419999999999e-05,5.1393970000000001e-05],"8912896":[2.9712023740000002,2.9948910995000002],"100":[6.2216699999999997e-06,6.5088500000000004e-06],"507904":[0.06447850799999999,0.096872278000000006],"3840":[0.00030155613333333333,0.00032086367741935488],"192":[1.391682e-05,1.4209489999999999e-05],"376832":[0.048510602000000021,0.053539910999999996],"98304":[0.010458916,0.010892182],"5376":[0.00043588854545454541,0.00044594100000000005],"94208":[0.0093613149999999985,0.010248014499999999],"81920":[0.0073238639999999994,0.0075796299999999995],"3407872":[0.93319304999999997,0.94729576999999998],"104":[6.3848700000000001e-06,6.5945900000000005e-06],"122880":[0.011761668000000003,0.012625086000000002],"200":[1.339719e-05,1.3702131313131313e-05],"163840":[0.017340221999999999,0.017572091500000001],"4063232":[1.137328731,1.1634484254999999],"5767168":[2.0164721029999999,2.0262956669999999],"12582912":[5.355168945,10.298854728],"1600":[0.00012669925352112678,0.00012822000000000002],"136":[8.1002631578947373e-06,8.6294999999999993e-06],"232":[1.532713e-05,1.5883360000000002e-05],"7077888":[2.2095563719999998,2.5087123834999998],"86016":[0.0079866730000000014,0.0084140320000000001],"31744":[0.0025377079999999996,0.0026246899999999998],"168":[1.1022481481481482e-05,1.1042e-05],"622592":[0.086168350000000005,0.12438698099999999],"108":[6.7246799999999996e-06,6.8325799999999999e-06],"327680":[0.036659642999999999,0.038822681000000005],"2176":[0.00016323481666666669,0.00017661400000000001],"3328":[0.00025783699999999986,0.00029432793939393936],"1":[1.5879999999999999e-07,1.6714e-07],"2":[1.7331999999999999e-07,1.8546000000000002e-07],"3":[1.9766000000000001e-07,2.0506000000000001e-07],"4":[2.0919000000000001e-07,2.1014e-07],"7424":[0.00059369731249999996,0.000612956],"5":[3.4820999999999997e-07,3.7430000000000001e-07],"23552":[0.00206668,0.0021696982500000006],"6":[3.7005999999999997e-07,3.9901000000000002e-07],"61440":[0.0052592610000000003,0.0056840969999999991],"491520":[0.058495881,0.0829964485],"77824":[0.0067819449999999976,0.0068815860000000003],"7":[3.8206000000000002e-07,3.8936999999999995e-07],"8":[4.0182000000000003e-07,4.3088e-07],"208":[1.4003e-05,1.4144590000000001e-05],"9":[5.9340999999999996e-07,5.9957000000000007e-07],"73728":[0.006253041,0.0065202150000000002],"304":[1.9264500000000002e-05,2.0693999999999999e-05],"400":[2.7729669999999998e-05,2.7844079999999999e-05],"1310720":[0.28821074749999998,0.37025241199999998],"336":[2.280719e-05,2.4802010000000001e-05],"3670016":[0.99777612400000004,1.0250274180000001],"6656":[0.00053332300000000015,0.000580365],"15360":[0.0011872789999999999,0.0012478157142857146],"432":[2.7605499999999999e-05,3.191343e-05],"950272":[0.17286398450000001,0.22573333000000001],"655360":[0.09093283000000002,0.132718478],"69632":[0.0060417150000000013,0.0063261060000000006],"11264":[0.0009293979999999999,0.00094011449999999999],"2752512":[0.81732713899999998,0.888264198],"8126464":[2.6006407734999999,2.6997552535000002],"27648":[0.0022724810000000002,0.0023390620000000007],"368":[2.5307765432098763e-05,2.7829000000000001e-05],"65536":[0.0056548870000000008,0.006409314000000001],"16252928":[5.7309285210000001,5.7618867439999999],"464":[3.0916700000000002e-05,3.1701571428571433e-05],"1015808":[0.19218128299999998,0.25550374399999998],"3072":[0.000255615,0.000269077],"110592":[0.01062864,0.011087262000000001],"237568":[0.025543613,0.026740616000000002],"278528":[0.0296391285,0.037363194000000002],"496":[3.1847500000000003e-05,3.4552799999999999e-05],"13107200":[4.6124970310000002,4.8689750465000001],"9961472":[3.5795316745000001,3.7016675800000001],"5888":[0.00049416199999999992,0.00052608600000000004],"11010048":[3.9561343944999998,4.007481071],"1920":[0.000141805,0.00015014281818181822],"2490368":[0.651682714,0.71015034499999996],"19456":[0.0015399459999999999,0.0016070146000000001],"57344":[0.0049046285,0.0050718149999999995],"1179648":[0.22204254000000001,0.31280589199999997],"4718592":[1.404304306,1.4557611724999999],"360448":[0.043612821999999996,0.050337945999999988],"1572864":[0.42762288949999999,0.44430432949999998],"53248":[0.0045602159999999989,0.0047794020000000003],"3456":[0.00027089948484848483,0.00028756799999999998],"40960":[0.003339954,0.0034428265000000001],"4608":[0.00035494437037037033,0.00036897300000000009],"13824":[0.0011110719999999998,0.0011197380000000001],"819200":[0.15783952849999999,0.18837943600000001],"983040":[0.17237387300000001,0.22652028099999999],"8704":[0.000666769,0.00066861600000000013],"120":[7.165166666666667e-06,7.6700999999999996e-06],"1024":[7.5398480000000005e-05,7.5671000000000001e-05],"49152":[0.0045135975,0.004736217],"524288":[0.069338441000000001,0.096916666000000012],"45056":[0.0039249809999999993,0.0041196590000000003],"229376":[0.024432585,0.027546717000000005],"2688":[0.00020892153333333332,0.00023023721951219515],"152":[8.7487142857142858e-06,9.4969300000000009e-06],"5120":[0.00040718699999999999,0.00042143700000000004],"1507328":[0.37629812299999998,0.48910904999999999],"1216":[9.5287129999999993e-05,9.76368e-05],"1966080":[0.44365793799999997,0.45246730899999998],"1900544":[0.44585737650000001,0.49405112600000001],"184":[1.3120600000000001e-05,1.490969e-05],"7936":[0.00062981400000000002,0.00063660599999999996],"3801088":[1.0522902380000001,1.0828634349999999],"6815744":[2.2615718354999998,2.3848192125000001],"124":[7.4547599999999999e-06,8.2498300000000006e-06],"102400":[0.0100190165,0.010369356],"311296":[0.035365502499999993,0.036782427500000006],"1408":[0.00010868783516483511,0.0001105575],"393216":[0.053262023999999998,0.067728206499999999],"4352":[0.00034518221428571431,0.00034899899999999996],"6553600":[2.131091284,2.4112710929999999],"20480":[0.00165446,0.001667815],"608":[4.0438999999999997e-05,4.4695100000000005e-05],"2228224":[0.55022106999999998,0.55279031850000004],"36864":[0.002999753,0.003323159],"704":[5.1282289999999994e-05,5.7367499999999996e-05],"720896":[0.1236029615,0.16797719700000002],"800":[5.8943000000000001e-05,6.2579982456140352e-05],"2621440":[0.72556161299999999,0.76249817149999999],"425984":[0.05141999949999998,0.063325917999999981],"32768":[0.0026352570000000002,0.0026962379999999997],"12058624":[4.8056961295000002,4.9179475989999997],"128":[7.5634599999999994e-06,8.0576900000000001e-06],"180224":[0.020089167499999998,0.020407096500000003],"224":[1.475793e-05,1.4970980000000001e-05],"736":[5.3924400000000002e-05,5.8149999999999997e-05],"320":[2.106293e-05,2.131323e-05],"557056":[0.073627679000000015,0.116661925],"832":[6.0197e-05,6.0396000000000002e-05],"9437184":[3.3431639290000001,3.4322826000000002],"3584":[0.00026591499999999998,0.000285142],"6291456":[2.5995067179999998,2.6030144009999998],"256":[1.631883157894737e-05,1.7091129999999998e-05],"15204352":[5.3543423140000002,5.6559467264999999],"28672":[0.0022874779999999999,0.0024443030000000001],"768":[6.2781500000000002e-05,6.6818270833333336e-05],"212992":[0.022974209000000002,0.023386155999999998],"864":[6.2258469999999991e-05,6.5696760000000002e-05],"352":[2.5173653846153846e-05,2.545941e-05],"253952":[0.027260108500000001,0.029534328500000005],"960":[6.8661329999999995e-05,7.2851119999999992e-05],"24576":[0.0023239659999999994,0.0023374077499999997],"7680":[0.00059906599999999999,0.00062372899999999973],"294912":[0.03378940300000001,0.034981197000000006],"1048576":[0.18581831100000001,0.25464660900000002],"10485760":[3.6706819390000001,3.7071644730000002],"344064":[0.045352337,0.053527357999999969],"288":[1.8547999999999999e-05,1.859146e-05],"1152":[8.3526660000000005e-05,8.6906214285714279e-05],"384":[2.8964460000000001e-05,2.9602389999999999e-05],"2304":[0.000174842,0.00018425730612244899],"896":[6.4289789999999995e-05,6.6130050000000009e-05],"480":[3.2019240000000003e-05,3.3609829545454548e-05],"1441792":[0.35810193099999998,0.45087682499999998],"992":[7.1637000000000005e-05,7.230045e-05],"3968":[0.00030513300000000002,0.00031497699999999998],"6400":[0.000494787,0.00057201599999999984],"1344":[0.00010377869230769234,0.00010467766666666667],"126976":[0.0123273545,0.013013844],"2883584":[0.86524389099999999,0.92236307949999996],"753664":[0.120838235,0.18559935550000001],"16384":[0.001293635,0.0013406709999999999],"131072":[0.012781799,0.013510537500000003],"458752":[0.057061093499999979,0.086702472000000003],"172032":[0.018308488000000005,0.018818309500000002],"12288":[0.001074492,0.0012400009999999999],"14680064":[5.1009768634999997,5.6079856299999999],"1536":[0.000130992,0.00013295899999999999],"25600":[0.0021591450000000003,0.0021880420000000003],"1835008":[0.399627711,0.41907638199999997],"10752":[0.00086997299999999991,0.00092101500000000007],"21504":[0.00183373,0.0018585120000000001],"7602176":[2.399516711,2.4130858915000002],"5632":[0.00044594999999999997,0.00047535700000000004],"10":[6.3412999999999997e-07,6.7319000000000001e-07],"3145728":[1.0992235429999999,1.212608361],"245760":[0.026117466999999998,0.027845264000000002],"1728":[0.00013698215384615384,0.00013704200000000001],"11":[6.4349e-07,7.069899999999999e-07],"1114112":[0.20801288200000001,0.3015459305],"12":[6.4797e-07,6.7815000000000002e-07],"7340032":[2.2816524925000001,2.3530758990000002],"7168":[0.00058718531249999999,0.00064182300000000013],"13":[7.0418000000000005e-07,7.0844000000000001e-07],"6029312":[2.267838282,2.2733958584999998],"14":[7.2936999999999997e-07,8.0846000000000003e-07],"3200":[0.00025522200000000004,0.000272303],"20":[9.8937000000000002e-07,1.1429000000000001e-06],"204800":[0.021851975499999999,0.0246734225],"15":[7.5166999999999995e-07,7.6767999999999995e-07],"13312":[0.001067945,0.0011127672500000001],"4980736":[1.5270482250000001,1.5852825635000001],"118784":[0.011528883,0.012134366000000001],"51200":[0.0044645680000000004,0.0046037414999999995],"16":[8.0110000000000005e-07,8.5119565217391302e-07],"21":[1.0401200000000001e-06,1.26145e-06],"917504":[0.16597917649999999,0.22195538699999995],"22":[1.0970099999999999e-06,1.3464299999999999e-06],"4864":[0.0003776095,0.00038979208000000003],"17":[9.5116000000000005e-07,1.0476999999999999e-06],"14848":[0.0012316303750000003,0.001271175],"23":[1.2001300000000001e-06,1.39718e-06],"786432":[0.14622079800000001,0.201132062],"18":[1.02973e-06,1.25815e-06],"1638400":[0.35295929199999998,0.36179004400000003],"7864320":[2.4837626300000002,2.541740415],"24":[1.13149e-06,1.2877500000000001e-06],"14155776":[4.9667066955000001,5.3061112460000004],"19":[9.7430999999999999e-07,1.0659799999999999e-06],"30":[1.2276400000000002e-06,1.2382399999999999e-06],"25":[1.0501600000000001e-06,1.1651699999999999e-06],"31":[1.61925e-06,1.6982400000000002e-06],"1280":[9.2987749999999994e-05,9.4348399999999999e-05],"26":[1.0900600000000001e-06,1.1906999999999999e-06],"3932160":[1.0717596620000001,1.1388973149999999],"2432":[0.00019063834042553192,0.00019539200000000002],"32":[1.7473099999999998e-06,1.7867800000000001e-06],"27":[1.1617700000000001e-06,1.1839899999999999e-06],"409600":[0.050580472000000001,0.061349210500000008]}},{"title":"OrderedSet intersection with Self (75% overlap)","results":{"28":[1.8353700000000001e-06,1.97346e-06],"34":[2.9179e-06,3.2820100000000004e-06],"29":[1.9283300000000002e-06,1.9972999999999999e-06],"40":[3.1202100000000001e-06,3.4996547619047623e-06],"17408":[0.001890774,0.0019775420000000005],"1472":[0.00014490533333333329,0.000152218],"112":[8.4527400000000007e-06,8.6644800000000001e-06],"1376256":[0.36331424899999998,0.50322716300000003],"5242880":[2.1078141490000002,2.334712444],"36":[3.0895800000000003e-06,3.2196099999999999e-06],"42":[3.4279900000000002e-06,3.9250100000000004e-06],"11534336":[5.2718118910000005,5.549484036],"114688":[0.0125158215,0.013463606999999999],"144":[1.2623739999999999e-05,1.355036e-05],"38":[3.0087400000000004e-06,3.22948e-06],"240":[1.81605e-05,1.8524333333333332e-05],"9216":[0.00095571099999999993,0.0010206149999999999],"44":[3.3753500000000002e-06,3.9365999999999997e-06],"1664":[0.00014284700000000001,0.00014571499999999998],"196608":[0.028529901,0.029932307000000002],"155648":[0.021174117000000003,0.02138607],"2816":[0.00027462400000000006,0.00029865999999999996],"50":[3.8806000000000006e-06,3.9875700000000002e-06],"2359296":[0.77630173499999999,0.7956240845],"46":[3.88805e-06,3.9187999999999996e-06],"176":[1.4466785714285714e-05,1.5347609999999999e-05],"52":[3.9292899999999999e-06,4.0390100000000005e-06],"272":[2.562251948051948e-05,2.8003809999999998e-05],"116":[8.5344999999999993e-06,8.9556699999999992e-06],"47104":[0.0050922470000000011,0.0052354760000000002],"6912":[0.00059061000000000009,0.0006480539999999998],"1856":[0.000159424,0.00016011200000000004],"48":[3.7338799999999998e-06,4.2921700000000006e-06],"2097152":[0.54994349799999998,0.58789250699999995],"54":[4.0350555555555557e-06,4.0696400000000002e-06],"2031616":[0.52486864099999997,0.57283339450000004],"43008":[0.0046368955,0.0048080309999999999],"60":[4.2957899999999997e-06,4.4946999999999995e-06],"30720":[0.0028184010000000003,0.0029666129999999995],"56":[3.88426e-06,4.1009299999999995e-06],"62":[4.4764500000000001e-06,4.8504899999999997e-06],"58":[4.1352400000000001e-06,4.1823333333333332e-06],"3014656":[1.1506892275,1.2389489739999999],"64":[4.4636699999999997e-06,4.9991000000000001e-06],"8388608":[3.0884777149999998,3.1875831130000001],"29696":[0.002752787,0.0028153900000000001],"216":[1.6550189999999999e-05,1.655031e-05],"106496":[0.011826595000000002,0.012925022],"72":[6.2836900000000006e-06,7.6164200000000002e-06],"442368":[0.06091704349999999,0.081336913000000025],"147456":[0.019605422500000001,0.019880875999999999],"4456448":[1.7276533555,1.782848448],"63488":[0.006294231,0.0064478239999999996],"38912":[0.0042906999999999997,0.0046149680000000005],"68":[6.00397e-06,6.0587699999999999e-06],"188416":[0.02650251,0.028137915000000003],"248":[1.7985000000000001e-05,2.0842000000000001e-05],"80":[6.7607599999999995e-06,7.8544200000000003e-06],"2560":[0.00025140200000000002,0.00029112099999999998],"34816":[0.0039419570000000003,0.0041378320000000001],"3712":[0.00032924899999999999,0.000343145],"3538944":[1.120489772,1.1516917764999999],"76":[6.4452699999999995e-06,7.1674799999999999e-06],"4194304":[1.3650559600000001,1.3826102310000001],"851968":[0.166738315,0.238771283],"4096":[0.00037059146153846161,0.00038526000000000001],"59392":[0.0059447319999999994,0.0060267519999999998],"84":[6.95887e-06,7.68001e-06],"3276800":[1.035002245,1.041156137],"55296":[0.0054002719999999994,0.0055890460000000012],"688128":[0.130344087,0.17100588999999999],"8192":[0.00076943841666666677,0.00077698766666666667],"10240":[0.0010649919999999998,0.0011123279999999999],"15872":[0.0014471449999999999,0.0015032309999999998],"92":[7.8294800000000005e-06,8.3419900000000001e-06],"26624":[0.0024904215000000002,0.0026648236666666656],"1792":[0.000156291,0.00016488900000000001],"11776":[0.0012664405714285713,0.0012798191428571432],"2944":[0.00028731200000000002,0.00030283600000000001],"88":[7.4355899999999997e-06,8.0239999999999997e-06],"22528":[0.0024598909999999996,0.0025100846666666668],"1245184":[0.32224003950000002,0.40006156100000001],"15728640":[6.3486603339999998,6.4266745539999999],"96":[8.0156666666666668e-06,8.2731599999999996e-06],"1984":[0.00016672900000000001,0.00017163699999999996],"139264":[0.0188683285,0.021930658000000002],"475136":[0.066702908000000019,0.103068796],"13631488":[5.4788533470000003,5.711358079],"416":[3.3855573033707867e-05,3.4364299999999999e-05],"928":[7.9651730000000011e-05,8.1868411764705892e-05],"512":[4.405707e-05,4.4761260000000005e-05],"18432":[0.0019803540000000001,0.0022341935000000004],"16777216":[6.8507735460000001],"9728":[0.0010085420000000001,0.0010795161111111114],"1769472":[0.47524359599999999,0.49213152999999998],"1703936":[0.462634027,0.46668162099999999],"2048":[0.00017936066666666666,0.00018703582352941179],"14336":[0.0012924549999999999,0.0013584787142857141],"448":[3.4860204819277107e-05,3.8896880000000002e-05],"5505024":[2.282361039,2.2882425560000001],"544":[5.3770149999999999e-05,5.5506810000000003e-05],"221184":[0.026697892000000001,0.0341648045],"90112":[0.010861134999999999,0.01181727],"640":[6.1597050000000003e-05,6.3467100000000001e-05],"12800":[0.0011771329999999999,0.0012756625714285712],"262144":[0.032988905999999998,0.035444074999999998],"589824":[0.106730273,0.14494162999999999],"884736":[0.18149727600000001,0.23568172200000001],"6144":[0.00065999528571428581,0.00066045899999999985],"1088":[0.00011319353086419752,0.000113701],"576":[5.9690530303030302e-05,6.1999000000000001e-05],"160":[1.3580249999999999e-05,1.4153741379310344e-05],"672":[6.4138000000000002e-05,6.5112989999999997e-05],"8912896":[4.0132267854999997,4.1603965924999997],"100":[7.3844400000000002e-06,7.5395800000000001e-06],"507904":[0.076384115000000002,0.100017524],"3840":[0.00034237039285714291,0.00035858],"192":[1.7439415094339621e-05,1.7846695652173912e-05],"376832":[0.058340142000000005,0.0675678205],"98304":[0.012509131999999997,0.012682306000000001],"5376":[0.00057539200000000009,0.00057766070588235303],"94208":[0.011577796499999999,0.012586812999999999],"81920":[0.0097367970000000002,0.010036607499999999],"3407872":[1.0738693130000001,1.0922868779999999],"104":[7.7136100000000008e-06,8.2760399999999995e-06],"122880":[0.013607859,0.0144453355],"200":[1.5467170000000001e-05,1.6013124999999999e-05],"163840":[0.0216838525,0.024386178999999997],"4063232":[1.3071494504999999,1.3530873969999999],"5767168":[2.443766069,2.46625761],"12582912":[6.0757613380000004,11.005705388499999],"1600":[0.00013610399999999998,0.00014282800000000001],"136":[1.202e-05,1.3149240000000001e-05],"232":[1.8414e-05,1.8763560000000002e-05],"7077888":[2.5509628819999999,2.89046381],"86016":[0.0104607155,0.011237855],"31744":[0.0028883809999999998,0.0030843909999999993],"168":[1.4967170000000001e-05,1.5295729999999999e-05],"622592":[0.111508713,0.16513259999999999],"108":[7.8677590361445787e-06,8.1676100000000002e-06],"327680":[0.04918426,0.051563212000000004],"2176":[0.00021934,0.00024405425000000001],"3328":[0.00029490700000000001,0.00032102029629629624],"1":[1.5889999999999997e-07,1.5984999999999999e-07],"2":[1.7822999999999998e-07,1.8144000000000002e-07],"3":[3.1869e-07,3.2150999999999997e-07],"4":[3.3365999999999998e-07,3.5560999999999999e-07],"7424":[0.00066886100000000019,0.00066936649999999986],"5":[3.8555000000000001e-07,3.8788e-07],"23552":[0.0025513630000000001,0.0026520406666666668],"6":[5.6898000000000006e-07,5.6998000000000003e-07],"61440":[0.0061040119999999998,0.0063367670000000001],"491520":[0.068083470500000021,0.0983046115],"77824":[0.0093350960000000011,0.0093443039999999995],"7":[5.5383999999999994e-07,5.8585000000000007e-07],"8":[6.0723999999999992e-07,6.0971000000000002e-07],"208":[1.6148770000000002e-05,1.6343270000000001e-05],"9":[6.0567999999999995e-07,6.2125999999999994e-07],"73728":[0.0086717800000000022,0.0090102959999999975],"304":[2.6491000000000001e-05,2.9004685714285716e-05],"400":[3.1384880000000004e-05,3.2369666666666663e-05],"1310720":[0.34663776099999999,0.4294204425],"336":[3.0437409999999998e-05,3.4848129999999998e-05],"3670016":[1.174915937,1.187111585],"6656":[0.00059512499999999963,0.0006389346428571427],"15360":[0.00140205,0.0014301310000000001],"432":[3.4355900000000001e-05,3.6323689999999998e-05],"950272":[0.193306173,0.26202690649999999],"655360":[0.11800600999999999,0.16408857999999998],"69632":[0.0082583520000000001,0.0084667819999999974],"11264":[0.0011856485,0.0012046667500000001],"2752512":[0.98680467400000005,1.1223747639999999],"8126464":[2.976352398,3.096238123],"27648":[0.0025875683333333333,0.002655742],"368":[3.3155580000000004e-05,3.6259552238805974e-05],"65536":[0.0064514129999999987,0.006989450999999999],"16252928":[6.5443353489999998,6.6630635959999998],"464":[3.3716e-05,3.8472949999999999e-05],"1015808":[0.21987705399999999,0.29869052699999998],"3072":[0.000309232,0.00033081444444444454],"110592":[0.012210337999999998,0.012728496500000016],"237568":[0.029288677500000006,0.03144410099999994],"278528":[0.04056964150000001,0.054857915],"496":[3.7073000000000002e-05,3.9385000000000003e-05],"13107200":[5.2760124494999996,5.5711480309999999],"9961472":[4.5470992204999998,4.8331200140000004],"5888":[0.00061621699999999996,0.00063328800000000008],"11010048":[4.87740434,5.1130452985000003],"1920":[0.00016964399999999999,0.00017475999999999999],"2490368":[0.82813311700000003,0.89833905800000002],"19456":[0.0021033047500000008,0.0021754334999999998],"57344":[0.0055541210000000004,0.0056970550000000012],"1179648":[0.30394500400000002,0.38311068500000001],"4718592":[1.8605168759999999,1.9013159495],"360448":[0.054122177,0.067181330499999997],"1572864":[0.47729805949999998,0.489882449],"53248":[0.0051342930000000007,0.005386339999999999],"3456":[0.000292861,0.00032026500000000002],"40960":[0.004525411,0.0045358554999999998],"4608":[0.00047780399999999997,0.00049546105263157899],"13824":[0.001240393,0.0013033604285714287],"819200":[0.16239110849999999,0.23132918099999999],"983040":[0.20202477099999999,0.270481582],"8704":[0.00091393900000000011,0.00098627079999999943],"120":[8.5595e-06,8.8290600000000005e-06],"1024":[8.1394e-05,8.9373e-05],"49152":[0.005571393,0.0058889819999999983],"524288":[0.076761606499999996,0.1102963745],"45056":[0.0048185140000000003,0.0052948780000000011],"229376":[0.028216498,0.030044884500000001],"2688":[0.00026921899999999996,0.0002880990000000001],"152":[1.2868619999999999e-05,1.3925500000000001e-05],"5120":[0.00052174050000000009,0.00055794799999999973],"1507328":[0.42869598799999997,0.55989171100000001],"1216":[0.000126752,0.00012795359420289857],"1966080":[0.521169145,0.54024304000000001],"1900544":[0.50279670200000004,0.517881182],"184":[1.6225059999999999e-05,1.9743170000000002e-05],"7936":[0.00070451200000000002,0.00074363100000000002],"3801088":[1.2040454125,1.2526949985],"6815744":[2.5535892370000002,2.7370488750000002],"124":[8.7152200000000006e-06,9.7438800000000003e-06],"102400":[0.011409822,0.012260804],"311296":[0.04637898,0.049154590999999997],"1408":[0.00014044599999999999,0.00014731424615384612],"393216":[0.061932020499999997,0.069488644999999988],"4352":[0.00048144757894736848,0.00049016400000000007],"6553600":[2.4415041839999998,2.7178819265],"20480":[0.0021859029999999995,0.00219907825],"608":[5.8157260000000004e-05,6.1508050847457627e-05],"2228224":[0.71950098600000001,0.72066175249999997],"36864":[0.0040507249999999998,0.0043495670000000004],"704":[6.5711999999999997e-05,7.1383473684210526e-05],"720896":[0.1453914385,0.189213414],"800":[6.7244590909090914e-05,7.0102088235294113e-05],"2621440":[0.88057961750000002,0.90861972899999999],"425984":[0.058616676,0.075759415000000024],"32768":[0.003083447,0.0031270253333333339],"12058624":[5.7223933999999996,5.8619133789999998],"128":[9.604488095238094e-06,1.0894120000000001e-05],"180224":[0.024556943999999997,0.025461332],"224":[1.669822e-05,1.678932e-05],"736":[7.1221539999999998e-05,7.3831099999999999e-05],"320":[3.0016178571428571e-05,3.0550214285714285e-05],"557056":[0.100628509,0.146718343],"832":[6.8502232558139537e-05,7.4140999999999994e-05],"9437184":[4.3536838849999997,4.5464479180000001],"3584":[0.00029602099999999999,0.00032557617857142853],"6291456":[2.8481700774999998,2.9088916400000002],"256":[1.9726494252873564e-05,2.052794e-05],"15204352":[6.078656864,6.4907222940000002],"28672":[0.0025989440000000002,0.002768296],"768":[7.6075750000000004e-05,7.7010423076923074e-05],"212992":[0.026870770000000006,0.0273963235],"864":[6.8953400000000003e-05,7.5321999999999995e-05],"352":[3.3303709999999998e-05,3.3306080000000001e-05],"253952":[0.031907732999999994,0.03280026149999999],"960":[8.3180539999999997e-05,8.653692857142857e-05],"24576":[0.002721078,0.0027355793333333329],"7680":[0.00068396100000000007,0.00068922000000000026],"294912":[0.043661338000000056,0.061209136500000004],"1048576":[0.22015231299999999,0.29059249300000001],"10485760":[4.6664546255000001,4.8190431655000001],"344064":[0.051744944000000015,0.053588497999999998],"288":[2.7192420000000002e-05,2.8086109999999999e-05],"1152":[0.00011721999999999999,0.00011792066666666666],"384":[3.4600000000000001e-05,3.4796999999999999e-05],"2304":[0.00024887949999999998,0.00025137100000000002],"896":[7.4422e-05,7.8998999999999994e-05],"480":[3.8371270000000001e-05,3.9708599999999995e-05],"1441792":[0.40885965000000002,0.52143235200000004],"992":[8.3801333333333327e-05,8.4223999999999999e-05],"3968":[0.00035114199999999998,0.000367053],"6400":[0.00058359929411764687,0.00064076613333333328],"1344":[0.00012963866666666665,0.000129985],"126976":[0.014676152,0.014884794],"2883584":[1.0396914374999999,1.101320646],"753664":[0.15151232000000003,0.22697109450000003],"16384":[0.0015196089999999999,0.0015822360000000001],"131072":[0.015121744000000001,0.015811525],"458752":[0.064470557000000012,0.093173114999999987],"172032":[0.022971230999999981,0.024011952999999999],"12288":[0.001372098,0.0014982248333333332],"14680064":[5.8954105400000003,11.586029527999999],"1536":[0.00015879520967741935,0.00016498625423728817],"25600":[0.0023351729999999998,0.0024196790000000001],"1835008":[0.48220564300000002,0.49006464399999999],"10752":[0.0011609349999999999,0.0011756785],"21504":[0.0022929152500000003,0.0023484790000000001],"7602176":[2.7313906729999999,2.7490850070000001],"5632":[0.00058699299999999974,0.00059927600000000004],"10":[6.5194e-07,6.7734999999999996e-07],"3145728":[1.2267810665000001,1.3035097185],"245760":[0.030168455,0.0323213875],"1728":[0.00014960800000000002,0.00015162000000000002],"11":[8.0517000000000006e-07,8.9216999999999992e-07],"1114112":[0.285897177,0.36800682699999998],"12":[8.2187000000000004e-07,8.4126000000000006e-07],"7340032":[2.6725291150000001,2.69988172],"7168":[0.00065284278571428578,0.00069349092307692312],"13":[9.1248000000000003e-07,9.1464000000000004e-07],"6029312":[2.6406293889999999,2.6406359340000001],"14":[8.9547000000000006e-07,9.2504999999999994e-07],"3200":[0.0002844779999999999,0.00029601599999999997],"20":[9.9161999999999988e-07,1.1135100000000001e-06],"204800":[0.024860109000000002,0.025301611000000002],"15":[9.1092000000000006e-07,9.3899000000000007e-07],"13312":[0.0012057820000000001,0.0012804692857142858],"4980736":[2.000661977,2.019112351],"118784":[0.013368825000000001,0.013474126999999999],"51200":[0.0051003310000000005,0.0051012469999999997],"16":[9.2643000000000002e-07,9.3954000000000001e-07],"21":[1.5544600000000001e-06,1.6910199999999999e-06],"917504":[0.181040912,0.26062917250000001],"22":[1.6360699999999999e-06,1.8363000000000001e-06],"4864":[0.00050854394736842088,0.00052811199999999985],"17":[9.9571999999999997e-07,1.0220900000000001e-06],"14848":[0.0013868160000000001,0.0014157779999999999],"23":[1.7369e-06,1.86138e-06],"786432":[0.16377872699999996,0.247433978],"18":[9.7574000000000008e-07,1.1395799999999999e-06],"1638400":[0.43064149699999998,0.45252311950000002],"7864320":[2.8528138030000001,2.9492227369999999],"24":[1.7075299999999999e-06,1.85207e-06],"14155776":[5.7026837710000002,5.9730523],"19":[9.7262000000000014e-07,1.1003700000000001e-06],"30":[2.0527300000000002e-06,2.1501e-06],"25":[1.68276e-06,1.74163e-06],"31":[2.11581e-06,2.1231999999999998e-06],"1280":[0.00013026500000000001,0.00013105706666666667],"26":[1.8069099999999999e-06,1.8598399999999998e-06],"3932160":[1.2671588,1.3230181670000001],"2432":[0.00025087758974358967,0.00025786400000000006],"32":[2.0757899999999998e-06,2.08758e-06],"27":[1.8553499999999999e-06,1.8565899999999999e-06],"409600":[0.063485978999999998,0.079272679499999985]}},{"title":"OrderedSet intersection with Self (100% overlap)","results":{"28":[2.8952100000000001e-06,3.0076000000000002e-06],"34":[3.2646599999999996e-06,3.6427900000000002e-06],"29":[2.8811000000000002e-06,2.9261700000000001e-06],"40":[3.73441e-06,4.0448200000000003e-06],"17408":[0.0020956149999999999,0.0023905879999999999],"1472":[0.000165196,0.00017502999999999998],"112":[1.2351000000000001e-05,1.246505e-05],"1376256":[0.43520293500000001,0.55653678799999995],"5242880":[2.3904189499999999,2.4170840414999999],"36":[3.5051000000000001e-06,3.6553699999999998e-06],"42":[3.9881599999999999e-06,4.0878799999999997e-06],"11534336":[5.7149307270000005,5.8837960799999998],"114688":[0.017658180499999995,0.018793227000000017],"144":[1.420953e-05,1.5418050000000001e-05],"38":[3.4683299999999999e-06,3.8848499999999997e-06],"240":[2.6030170000000002e-05,2.6898800000000001e-05],"9216":[0.001075226888888889,0.00111388],"44":[4.0152699999999999e-06,4.6116699999999998e-06],"1664":[0.000207352,0.00021272543478260871],"196608":[0.030907053,0.032855574000000005],"155648":[0.0235356665,0.0237000965],"2816":[0.00031774499999999992,0.0003422632962962964],"50":[5.3297200000000005e-06,5.6710000000000004e-06],"2359296":[0.88171665700000001,0.88513739000000002],"46":[4.2596200000000004e-06,4.7436153846153852e-06],"176":[1.7510569999999999e-05,1.7723750000000001e-05],"52":[5.604e-06,5.70888e-06],"272":[2.83894e-05,3.0482700000000002e-05],"116":[1.192079e-05,1.291116e-05],"47104":[0.005742825,0.0061747980000000013],"6912":[0.00088886854545454504,0.00095109470000000001],"1856":[0.00022277400000000002,0.00023176688095238101],"48":[4.2964099999999999e-06,5.0217299999999993e-06],"2097152":[0.74107070000000008,0.76412425100000003],"54":[5.7355999999999998e-06,5.9092699999999999e-06],"2031616":[0.72656522899999998,0.72950744349999996],"43008":[0.0052754619999999999,0.0057090550000000002],"60":[6.3372500000000002e-06,6.4403900000000004e-06],"30720":[0.0038071210000000001,0.0039878604999999999],"56":[5.7849333333333337e-06,5.9390799999999999e-06],"62":[6.0765700000000008e-06,6.9269300000000001e-06],"58":[5.9918299999999995e-06,6.2509100000000004e-06],"3014656":[1.2199079100000001,1.3720279305],"64":[6.3904499999999999e-06,6.8133999999999999e-06],"8388608":[4.174415443,4.3726589775000004],"29696":[0.0038517129999999997,0.0038647349999999998],"216":[2.3261e-05,2.3994250000000002e-05],"106496":[0.016383499000000003,0.017599504500000005],"72":[6.8807099999999999e-06,7.9969899999999991e-06],"442368":[0.088134356500000011,0.113739828],"147456":[0.022304713,0.022394910000000001],"4456448":[1.958674797,2.030777525],"63488":[0.0084739140000000008,0.0088392439999999996],"38912":[0.0047585545000000005,0.0048872695000000011],"68":[7.0145999999999997e-06,7.3953599999999993e-06],"188416":[0.02926492,0.031123380999999999],"248":[2.5677000000000002e-05,3.0244590909090912e-05],"80":[7.5940999999999998e-06,8.5010000000000004e-06],"2560":[0.000306075,0.00030622053125],"34816":[0.0042776689999999996,0.004412109],"3712":[0.00045492752380952363,0.0004732461904761903],"3538944":[1.5772352135000001,1.615908876],"76":[7.5569099999999994e-06,7.7948500000000004e-06],"4194304":[1.8581840894999999,1.899082218],"851968":[0.23982357000000001,0.32513394400000001],"4096":[0.00049152600000000016,0.00055410635294117646],"59392":[0.0082960380000000021,0.0085493339999999987],"84":[7.9016299999999994e-06,8.7422599999999999e-06],"3276800":[1.4661425210000001,1.4670174785000001],"55296":[0.0076816319999999981,0.0079031659999999997],"688128":[0.148021554,0.20403756300000001],"8192":[0.00093338199999999996,0.0010269599999999999],"10240":[0.001223972,0.00122710625],"15872":[0.0020155210000000002,0.0020422779999999994],"92":[8.8571300000000007e-06,1.0668500000000001e-05],"26624":[0.0034631074999999997,0.0036297580000000003],"1792":[0.00020936199999999999,0.000230533],"11776":[0.001391244,0.0014282420000000001],"2944":[0.00031787800000000001,0.00034036672413793114],"88":[8.5339999999999999e-06,9.0622999999999996e-06],"22528":[0.0026902090000000007,0.0027997719999999999],"1245184":[0.37216714249999999,0.46987269749999999],"15728640":[8.6253944419999993,8.7948637779999999],"96":[9.078060000000001e-06,9.3489100000000002e-06],"1984":[0.000234331,0.000235069],"139264":[0.020949754000000001,0.027410693999999996],"475136":[0.095252136000000043,0.145078017],"13631488":[7.7028059999999998,8.1021793740000003],"416":[4.8919350000000001e-05,5.1723764705882356e-05],"928":[0.0001069795,0.000107494],"512":[6.1667930000000002e-05,6.2245160000000009e-05],"18432":[0.0022218787499999997,0.0023966729999999998],"16777216":[9.3220241440000002],"9728":[0.00112363,0.0011882258571428567],"1769472":[0.65465511799999998,0.67400052399999999],"1703936":[0.61927211699999996,0.62700553999999997],"2048":[0.000238652,0.00025355357894736829],"14336":[0.0018506966,0.0018540992],"448":[5.3365030000000004e-05,5.3832999999999998e-05],"5505024":[2.4823789710000002,2.6156023350000002],"544":[6.1261083333333325e-05,6.3019000000000001e-05],"221184":[0.036697473000000001,0.041711264500000012],"90112":[0.012493767499999999,0.012824348000000003],"640":[6.4361000000000003e-05,7.1283000000000002e-05],"12800":[0.0017083139999999996,0.001771545],"262144":[0.044195723500000013,0.046701180000000002],"589824":[0.12519409149999999,0.16870500199999999],"884736":[0.24838806299999999,0.343295081],"6144":[0.00072999899999999995,0.00078528858333333311],"1088":[0.00012467699999999999,0.00012750400000000002],"576":[6.1592000000000003e-05,6.917343e-05],"160":[1.4859e-05,1.6140839999999999e-05],"672":[7.0830430000000001e-05,7.3476080000000005e-05],"8912896":[4.573896542,4.5959801709999999],"100":[1.138623e-05,1.1512727272727272e-05],"507904":[0.10338133450000001,0.14254983299999999],"3840":[0.00046127199999999988,0.00048846200000000016],"192":[1.9601069999999999e-05,1.9649049999999998e-05],"376832":[0.063618070999999998,0.073171428499999996],"98304":[0.013918022,0.014285536999999997],"5376":[0.00062495426666666644,0.0006521446],"94208":[0.0131814025,0.013647551000000003],"81920":[0.010985298000000001,0.011228187000000001],"3407872":[1.496123724,1.5768972859999999],"104":[1.1175999999999999e-05,1.1810419999999999e-05],"122880":[0.018938814999999998,0.019289019000000001],"200":[2.318652e-05,2.428511e-05],"163840":[0.024954604499999998,0.025558368500000001],"4063232":[1.778272581,1.8335160985000001],"5767168":[2.6541611820000002,2.6702195839999998],"12582912":[6.3913519734999999,11.540659744999999],"1600":[0.000203933,0.00021128950000000001],"136":[1.388815e-05,1.534239e-05],"232":[2.507137e-05,2.5494640000000001e-05],"7077888":[3.615443902,4.0180952735000002],"86016":[0.0115512275,0.013478796000000001],"31744":[0.0039383059999999991,0.0042751530000000003],"168":[1.7415979999999999e-05,1.7432921875000001e-05],"622592":[0.12839467800000001,0.19537953599999999],"108":[1.1552000000000001e-05,1.218956e-05],"327680":[0.05430478900000002,0.058960462499999998],"2176":[0.00025133000000000002,0.00026887600000000003],"3328":[0.00041765900000000002,0.00047327699999999992],"1":[1.6033999999999999e-07,1.645e-07],"2":[1.7842999999999999e-07,1.8215999999999998e-07],"3":[3.2164000000000001e-07,3.2201000000000001e-07],"4":[3.3639000000000001e-07,3.4047000000000003e-07],"7424":[0.00091917760000000007,0.0009667904444444445],"5":[5.3677000000000001e-07,5.5400999999999997e-07],"23552":[0.0028965743333333339,0.002943958],"6":[5.5810999999999996e-07,5.7719e-07],"61440":[0.008442204,0.0088432379999999998],"491520":[0.101608659,0.129444578],"77824":[0.010376224999999999,0.01078398],"7":[5.6413999999999997e-07,6.3292000000000003e-07],"8":[5.9462000000000001e-07,6.1725e-07],"208":[2.4487262626262627e-05,2.4570114942528735e-05],"9":[7.7123e-07,7.9289999999999996e-07],"73728":[0.0098925690000000004,0.010204910000000001],"304":[3.1211590000000004e-05,3.2209260000000001e-05],"400":[4.7850166666666665e-05,4.8810000000000002e-05],"1310720":[0.421152323,0.48320580899999999],"336":[3.3513560000000001e-05,3.9132625e-05],"3670016":[1.6215890609999999,1.6506099285],"6656":[0.00084327499999999988,0.00087992099999999998],"15360":[0.0019306129999999999,0.0019646804],"432":[5.0070212121212122e-05,5.6491079999999997e-05],"950272":[0.26723638399999999,0.36358476649999999],"655360":[0.13714004900000001,0.193577571],"69632":[0.0093020269999999992,0.0095067639999999974],"11264":[0.0012862189999999999,0.0013982130000000001],"2752512":[1.057922026,1.1461656220000001],"8126464":[4.1181251019999996,4.1950809839999996],"27648":[0.0036366339999999997,0.0037669514999999999],"368":[3.5998333333333331e-05,3.843354e-05],"65536":[0.0088743730000000014,0.010573634],"16252928":[8.8747079995,8.9794126520000006],"464":[5.2618519999999999e-05,5.764585e-05],"1015808":[0.29425448799999998,0.37864847899999998],"3072":[0.00036215229629629628,0.00037126123076923077],"110592":[0.0170013995,0.018321156999999998],"237568":[0.040219916999999994,0.047992539000000015],"278528":[0.047025464499999996,0.055847267000000013],"496":[5.5956089743589741e-05,5.6404526315789478e-05],"13107200":[7.4416441369999999,7.7207939845000002],"9961472":[5.0610134445000003,5.3842439215000004],"5888":[0.00065005599999999977,0.00070850199999999996],"11010048":[5.4726658959999996,5.5878830245],"1920":[0.00022669900000000005,0.00023729931707317068],"2490368":[0.94530222050000001,1.0027365404999999],"19456":[0.0023485810000000002,0.002390011],"57344":[0.0079102499999999989,0.007997311],"1179648":[0.34549237700000002,0.43435902599999998],"4718592":[2.1194212920000002,2.131555949],"360448":[0.059375119000000011,0.074913404500000003],"1572864":[0.50847171800000002,0.67781877050000006],"53248":[0.0073353330000000012,0.0081661059999999994],"3456":[0.00042709399999999999,0.00045987671428571436],"40960":[0.0050297320000000003,0.0051038300000000002],"4608":[0.00051650599999999991,0.00055083358823529405],"13824":[0.0017444400000000003,0.001748409],"819200":[0.23514927099999999,0.30942373000000001],"983040":[0.27274528899999995,0.358877854],"8704":[0.00102064,0.0010632676666666671],"120":[1.2870869999999999e-05,1.3252979999999999e-05],"1024":[0.000116475,0.000120272],"49152":[0.006145055,0.006359221],"524288":[0.10690480199999999,0.154787589],"45056":[0.0054258979999999993,0.0057108900000000006],"229376":[0.038553950999999996,0.042530151500000002],"2688":[0.00029985199999999987,0.00032049900000000002],"152":[1.4141000000000001e-05,1.57965e-05],"5120":[0.00062886153333333332,0.00062916299999999997],"1507328":[0.49926296000000003,0.63264529849999995],"1216":[0.00013594557142857145,0.00014356200000000005],"1966080":[0.68134792049999993,0.72337911450000003],"1900544":[0.65992867700000002,0.69246435699999997],"184":[1.8038529999999999e-05,2.0025820000000002e-05],"7936":[0.00098291399999999988,0.00098581600000000004],"3801088":[1.6856238880000001,1.7356892994999999],"6815744":[3.6615568239999998,3.8509969399999999],"124":[1.262792e-05,1.335185e-05],"102400":[0.016265106000000001,0.017718738500000001],"311296":[0.052482691499999998,0.061121022499999997],"1408":[0.00015999136666666665,0.00016233829508196721],"393216":[0.06930518350000002,0.081803569000000007],"4352":[0.00049766399999999998,0.00052953744444444431],"6553600":[3.4938747029999999,3.8492693349999998],"20480":[0.0024719999999999998,0.0024834129999999994],"608":[6.4462229999999996e-05,6.8443422222222227e-05],"2228224":[0.8350458395,0.83739183350000002],"36864":[0.0045164970000000004,0.0047427169999999996],"704":[7.759744e-05,8.0347419999999997e-05],"720896":[0.1582519255,0.22310573149999999],"800":[0.00010026120652173912,0.00010673],"2621440":[0.99920693199999999,1.0388240559999999],"425984":[0.0865358185,0.119103127],"32768":[0.0041164240000000005,0.004226746],"12058624":[6.2801198899999999,6.3933878360000005],"128":[1.33387e-05,1.3980880000000001e-05],"180224":[0.027413828000000001,0.028373966],"224":[2.4656869999999999e-05,2.571403e-05],"736":[8.1462642857142858e-05,8.3586882352941168e-05],"320":[3.2674250000000003e-05,3.4549450000000002e-05],"557056":[0.131687049,0.16952133999999999],"832":[0.00010124395918367345,0.00010236199999999998],"9437184":[4.9136817940000004,5.0579152570000003],"3584":[0.000441118,0.00044550959090909105],"6291456":[3.0160093410000002,3.0587608015000001],"256":[2.7419649999999998e-05,2.85657e-05],"15204352":[8.4043239229999998,8.7831068210000005],"28672":[0.0036811920000000007,0.0038603459999999997],"768":[8.4505999999999994e-05,8.6194692307692302e-05],"212992":[0.036396509,0.039807395000000009],"864":[0.000100788,0.00010933299999999998],"352":[3.7931349999999997e-05,3.8850480769230771e-05],"253952":[0.0441993865,0.046187059000000003],"960":[0.00011452680000000001,0.000122055],"24576":[0.0029593309999999995,0.0030800290000000002],"7680":[0.00093455800000000005,0.00098035200000000052],"294912":[0.049179785499999989,0.052222937999999997],"1048576":[0.29794131299999999,0.41257751399999998],"10485760":[5.1669305980000004,5.3409406739999996],"344064":[0.058321778499999991,0.068360575000000021],"288":[3.0148999999999999e-05,3.0249029999999997e-05],"1152":[0.00013083553947368425,0.000136715125],"384":[4.0586070000000473e-05,4.2019020000000007e-05],"2304":[0.00027260700000000007,0.00027263999999999999],"896":[0.000103367,0.000109975],"480":[5.4322260000000004e-05,5.6307999999999997e-05],"1441792":[0.446033346,0.60208138649999998],"992":[0.000113213,0.000116993],"3968":[0.00045454800000000004,0.00048940799999999999],"6400":[0.00084507254545454524,0.00091077580000000001],"1344":[0.00014039799999999999,0.00014518499999999999],"126976":[0.019142184,0.0210796205],"2883584":[1.119514769,1.2323779355],"753664":[0.16886345799999999,0.257991888],"16384":[0.0019818320000000002,0.0021046179999999999],"131072":[0.0200201835,0.020512094999999998],"458752":[0.094464110000000018,0.14266076050000001],"172032":[0.026200602999999996,0.028554527999999996],"12288":[0.0015403521666666662,0.0016477498000000001],"14680064":[8.2062330929999998,10.012166552],"1536":[0.0001735554000000001,0.00018628300000000001],"25600":[0.003355434,0.0034682555000000006],"1835008":[0.663925235,0.66922466699999994],"10752":[0.001255298,0.0013074505714285717],"21504":[0.0025821013333333339,0.0026797879999999998],"7602176":[3.7968806439999998,3.9118752670000001],"5632":[0.00067161,0.00067860700000000002],"10":[7.9634000000000005e-07,8.2597999999999999e-07],"3145728":[1.2704881805000001,1.3468975605],"245760":[0.040758067999999995,0.043873516000000008],"1728":[0.00021271499999999999,0.00022487625],"11":[8.3643000000000003e-07,8.6371000000000005e-07],"1114112":[0.32734192000000001,0.41811330899999999],"12":[8.7166000000000001e-07,8.9697999999999992e-07],"7340032":[3.69831054,3.7232807800000001],"7168":[0.00086857800000000006,0.0010135226666666663],"13":[8.9153000000000004e-07,9.1243999999999998e-07],"6029312":[2.8239291975,2.8290884620000001],"14":[9.2125000000000007e-07,9.5313000000000001e-07],"3200":[0.00040865699999999993,0.00042881695454545456],"20":[1.6831400000000001e-06,1.8570899999999999e-06],"204800":[0.035077835000000002,0.037816807500000008],"15":[9.1908e-07,9.4795000000000007e-07],"13312":[0.0016833589999999999,0.0018043150000000001],"4980736":[2.2067123089999998,2.2946995889999999],"118784":[0.018169845,0.0182769045],"51200":[0.0072835819999999985,0.0074645950000000001],"16":[1.43104e-06,1.5053800000000001e-06],"21":[1.72944e-06,1.9824099999999997e-06],"917504":[0.25328562449999997,0.35253604699999996],"22":[1.7706100000000001e-06,1.9377000000000001e-06],"4864":[0.00056949400000000003,0.00057989499999999987],"17":[1.6372599999999999e-06,1.67763e-06],"14848":[0.0019143709999999998,0.00194428175],"23":[1.9640300000000002e-06,1.9952166666666667e-06],"786432":[0.180452368,0.26658485700000001],"18":[1.6715100000000001e-06,1.7688299999999999e-06],"1638400":[0.59066444500000004,0.6250381075],"7864320":[3.9974634084999998,4.0233123009999998],"24":[1.9908699999999999e-06,2.0460200000000001e-06],"14155776":[7.908237529,8.5195736770000003],"19":[1.71475e-06,1.7459100000000002e-06],"30":[3.0142500000000004e-06,3.0742299999999997e-06],"25":[2.57703e-06,2.6933300000000001e-06],"31":[2.8951999999999998e-06,3.0221034482758617e-06],"1280":[0.00013963699999999999,0.00014401531249999999],"26":[2.7884399999999997e-06,2.8249999999999996e-06],"3932160":[1.7195067070000001,1.8526528385000001],"2432":[0.000279292,0.00029630266666666661],"32":[3.1325800000000002e-06,3.3003099999999998e-06],"27":[2.9828899999999996e-06,3.0450699999999999e-06],"409600":[0.084074500999999996,0.108959629]}},{"title":"OrderedSet symmetricDifference with Self (0% overlap)","results":{"28":[3.0355899999999999e-06,3.0578900000000001e-06],"34":[3.8477800000000001e-06,4.19549e-06],"29":[3.1251199999999997e-06,3.22707e-06],"40":[4.8834300000000001e-06,5.5698124999999996e-06],"17408":[0.0024955296666666661,0.0027474893333333333],"1472":[0.000275116,0.00028932066666666667],"112":[1.1348230000000001e-05,1.1916730000000001e-05],"1376256":[0.62741616099999997,0.89462053450000001],"5242880":[3.693293793,3.7144151320000001],"36":[3.9035500000000001e-06,4.2164e-06],"42":[5.4602199999999995e-06,5.6939599999999998e-06],"11534336":[9.9625004594999993,10.1919820525],"114688":[0.0182844905,0.019681137999999997],"144":[1.7396119999999999e-05,1.8990578947368422e-05],"38":[4.2771500000000002e-06,5.1072e-06],"240":[2.7026480000000001e-05,2.823931e-05],"9216":[0.0014059300000000001,0.0014416326666666665],"44":[5.8615000000000005e-06,5.9978800000000001e-06],"1664":[0.000199734,0.000207004],"196608":[0.0591316125,0.061434819999999987],"155648":[0.031251817000000001,0.032461177000000008],"2816":[0.00050567794736842097,0.0005270479999999999],"50":[4.8882500000000002e-06,5.3020199999999999e-06],"2359296":[1.2501254500000001,1.2696436360000001],"46":[6.3316100000000004e-06,6.5021299999999995e-06],"176":[2.5190099999999998e-05,2.7108269999999997e-05],"52":[5.2017894736842105e-06,5.4321899999999996e-06],"272":[3.3218333333333333e-05,3.3657110000000001e-05],"116":[1.2229240000000001e-05,1.237174e-05],"47104":[0.0093517510000000002,0.010057594999999999],"6912":[0.00085503600000000021,0.00092945829999999986],"1856":[0.00023851099999999998,0.00025118358974358972],"48":[7.0257100000000002e-06,8.5296700000000003e-06],"2097152":[0.98015773900000003,1.0084067080000001],"54":[5.5490699999999995e-06,5.6493333333333337e-06],"2031616":[0.91948271000000004,0.97285288400000003],"43008":[0.0076013890000000001,0.0078112500000000005],"60":[6.5516999999999995e-06,6.5549700000000004e-06],"30720":[0.0042999979999999993,0.0043034800000000002],"56":[5.7389599999999993e-06,5.8314900000000001e-06],"62":[6.4070599999999998e-06,7.2073099999999994e-06],"58":[5.9496199999999995e-06,6.23641e-06],"3014656":[2.4090392839999999,2.6777691899999998],"64":[6.9e-06,7.5953599999999999e-06],"8388608":[5.276021579,5.418737664],"29696":[0.0041155690000000012,0.0041909874999999999],"216":[2.2545040000000001e-05,2.3542229999999998e-05],"106496":[0.016291775000000001,0.017714805],"72":[8.0602100000000002e-06,9.0170199999999999e-06],"442368":[0.098321937000000012,0.115253986],"147456":[0.028223322999999995,0.028938811999999998],"4456448":[2.641533436,2.7689650989999999],"63488":[0.0096975640000000005,0.010082641999999999],"38912":[0.0062473609999999999,0.0064246769999999993],"68":[7.3528400000000004e-06,8.1891900000000004e-06],"188416":[0.049283677000000012,0.053109715000000016],"248":[2.6891000000000001e-05,2.892808e-05],"80":[1.0769740000000001e-05,1.18638e-05],"2560":[0.00040180700000000001,0.0004262780000000001],"34816":[0.005209832000000001,0.0052221609999999995],"3712":[0.00048130100000000006,0.000488596],"3538944":[1.8227048084999999,1.8629303989999999],"76":[9.46965e-06,9.9284900000000009e-06],"4194304":[2.354365907,2.4046989399999998],"851968":[0.24061936399999995,0.36467829499999999],"4096":[0.00054069299999999997,0.000587278],"59392":[0.0086051689999999993,0.0096883409999999996],"84":[1.1513429999999999e-05,1.2339110000000001e-05],"3276800":[1.6411123745,1.6697060084999999],"55296":[0.0079282310000000026,0.0080419230000000012],"688128":[0.206415336,0.33232767200000002],"8192":[0.0011197380000000001,0.0011937930000000001],"10240":[0.0017215773999999997,0.0019142479999999513],"15872":[0.0022819770000000001,0.0022862269999999996],"92":[1.6836380000000002e-05,1.694735e-05],"26624":[0.0034274220000000003,0.0036103570000000007],"1792":[0.00023219500000000001,0.00023357383333333332],"11776":[0.0022913010000000004,0.0024672910000000004],"2944":[0.00055899517647058821,0.00057460170588235289],"88":[1.3444130000000001e-05,1.4172360000000001e-05],"22528":[0.0042432949999999994,0.0043497740000000007],"1245184":[0.50097935199999999,0.66293652400000003],"15728640":[9.8239389419999998,9.9163458984999995],"96":[1.5647312499999999e-05,1.84355e-05],"1984":[0.00025151599999999997,0.00026596271428571425],"139264":[0.02572485,0.0306533545],"475136":[0.101422415,0.14455293450000001],"13631488":[8.013606308,8.2769022799999998],"416":[4.7335229999999996e-05,4.7338e-05],"928":[0.00011794423456790123,0.000118439],"512":[6.6134729999999998e-05,6.7267340000000002e-05],"18432":[0.0027957390000000006,0.0031418740000000007],"16777216":[11.073092114],"9728":[0.001538899,0.0016623220000000001],"1769472":[0.75973839200000004,0.79751908999999999],"1703936":[0.73406444500000001,0.74393299850000005],"2048":[0.00027234299999999998,0.00027600000000000004],"14336":[0.0018824713999999998,0.0018985480000000006],"448":[5.111309638554217e-05,5.3183500000000003e-05],"5505024":[4.1077422639999996,4.2507503260000004],"544":[7.2369650000000003e-05,7.3821749999999995e-05],"221184":[0.03876831,0.044848494000000003],"90112":[0.019361292999999995,0.019507555000000003],"640":[9.8533e-05,9.9671000000000002e-05],"12800":[0.0015788379999999997,0.0017025954],"262144":[0.052909249999999998,0.055069202999999955],"589824":[0.150912612,0.191781177],"884736":[0.26295841399999997,0.39556323799999998],"6144":[0.001344175,0.0014192093333333336],"1088":[0.00014906000000000004,0.00015417032258064516],"576":[8.1001439999999996e-05,8.7864142857142861e-05],"160":[2.1316999999999999e-05,2.263569e-05],"672":[0.00011062619999999998,0.00011155662337662337],"8912896":[5.7494791464999997,5.7837797389999999],"100":[1.007525e-05,1.047243e-05],"507904":[0.11715228600000005,0.15216028349999999],"3840":[0.00051081752631578934,0.000520375],"192":[3.4238609999999995e-05,3.4839760000000002e-05],"376832":[0.11417173,0.11773307199999999],"98304":[0.024568617499999997,0.024624795000000001],"5376":[0.00092779259999999986,0.00096910466666666679],"94208":[0.020690011000000001,0.022274000000000002],"81920":[0.015018755,0.015043405500000001],"3407872":[1.7408848484999999,1.7593520315],"104":[1.0329999999999999e-05,1.0896e-05],"122880":[0.020387104,0.021573908999999995],"200":[2.0532419999999998e-05,2.0722389999999999e-05],"163840":[0.034446266000000017,0.036540667999999998],"4063232":[2.2831124269999998,2.3577841739999998],"5767168":[4.7692169389999997,4.7841082100000003],"12582912":[13.5367111285,25.759655110000001],"1600":[0.00019705460000000002,0.00020150416666666663],"136":[1.544236e-05,1.5959310000000002e-05],"232":[2.4959769999999999e-05,2.6497010000000001e-05],"7077888":[3.9999186784999998,4.2579803204999997],"86016":[0.016440992999999997,0.018625719000000002],"31744":[0.0043723360000000001,0.0046066679999999995],"168":[2.2816e-05,2.4013989999999997e-05],"622592":[0.16712183799999999,0.23265216599999999],"108":[1.0717715909090908e-05,1.079e-05],"327680":[0.07796583800000001,0.085659615500000008],"2176":[0.00030966400000000002,0.00032206599999999992],"3328":[0.00041052766666666669,0.00042288100000000006],"1":[3.8583000000000001e-07,4.1250000000000002e-07],"2":[4.5021999999999996e-07,4.6692e-07],"3":[6.3068999999999999e-07,6.5728999999999998e-07],"4":[5.8927000000000003e-07,5.9866000000000004e-07],"7424":[0.0010002988888888884,0.001033494],"5":[7.5675e-07,8.0027000000000001e-07],"23552":[0.0047325205000000002,0.0048756259999999984],"6":[7.3784999999999995e-07,7.6445000000000005e-07],"61440":[0.0090063259999999985,0.009633071],"491520":[0.11107260400000001,0.14091425749999997],"77824":[0.013394134,0.014121599],"7":[9.2969999999999997e-07,9.2987e-07],"8":[8.9971e-07,9.0483999999999994e-07],"208":[2.114391304347826e-05,2.2309339999999999e-05],"9":[1.0687700000000001e-06,1.1310400000000001e-06],"73728":[0.012157882,0.012605563],"304":[4.1026914285714286e-05,4.4210990000000007e-05],"400":[4.2491999999999999e-05,4.275065e-05],"1310720":[0.57524655049999995,0.72667334000000006],"336":[4.9758666666666668e-05,6.1336199999999997e-05],"3670016":[1.906920664,1.966990639],"6656":[0.00083273145454545484,0.00090426809999999999],"15360":[0.0020778544999999998,0.0021221357500000003],"432":[4.5831000000000002e-05,5.3854101265822791e-05],"950272":[0.30832424899999999,0.44568835849999999],"655360":[0.179897206,0.244033367],"69632":[0.0111107145,0.011236065],"11264":[0.0021283170000000002,0.0021370215],"2752512":[1.7847804114999999,1.9364779130000001],"8126464":[4.9577797160000001,4.9861956489999999],"27648":[0.0036559275,0.0037836615],"368":[6.1812884615384617e-05,7.3788000000000006e-05],"65536":[0.010121577,0.012412015],"16252928":[10.4584035105,10.544056565],"464":[5.4827641975308642e-05,5.7098000000000001e-05],"1015808":[0.32541878400000002,0.484988419],"3072":[0.00063688900000000007,0.00066725878571428552],"110592":[0.017234016499999998,0.018473876],"237568":[0.044615233999999997,0.053387676499999995],"278528":[0.056525367999999999,0.065601953000000018],"496":[5.6217000000000001e-05,6.3250340000000003e-05],"13107200":[7.5838757589999997,7.8316653370000004],"9961472":[7.3469253920000002,7.4106053335000004],"5888":[0.001137178,0.0011990668750000003],"11010048":[8.761475527,8.8913732840000002],"1920":[0.00024098000000000001,0.0002520953076923077],"2490368":[1.4165373855000001,1.4995315755],"19456":[0.0030549423333333333,0.0030629840000000004],"57344":[0.0080830619999999985,0.0083530290000000014],"1179648":[0.45130585400000001,0.59353489800000003],"4718592":[2.9542326179999998,2.9735049779999998],"360448":[0.094754042999999982,0.109408411],"1572864":[0.97690734199999996,1.276160744],"53248":[0.0072961660000000015,0.0078030589999999985],"3456":[0.000444843,0.00045342085714285719],"40960":[0.0069501300000000005,0.0070553149999999978],"4608":[0.00067924299999999973,0.00068800800000000015],"13824":[0.0017722596,0.00190307],"819200":[0.22990588049999999,0.34791523349999998],"983040":[0.31131528600000002,0.46715733300000001],"8704":[0.001260791,0.001262591],"120":[1.2248420000000001e-05,1.28905e-05],"1024":[0.00013371211594202898,0.000142936],"49152":[0.011144374,0.011275077999999997],"524288":[0.12316650899999999,0.16095852299999999],"45056":[0.0084335669999999995,0.0089377420000000003],"229376":[0.042070344999999995,0.046758470000000003],"2688":[0.000448042,0.000480595],"152":[1.950305e-05,1.954733e-05],"5120":[0.00083757100000000017,0.00086721160000000042],"1507328":[0.82832356100000004,1.2127483960000001],"1216":[0.00018054,0.00019530757446808509],"1966080":[0.86070608749999999,0.91401374199999996],"1900544":[0.829200194,0.85685494399999995],"184":[3.0546545454545458e-05,3.1605e-05],"7936":[0.0010859630000000001,0.0011043285000000001],"3801088":[2.0351376869999998,2.1321525385000002],"6815744":[3.8658691635000002,3.9889702594999998],"124":[1.2997770000000001e-05,1.41515e-05],"102400":[0.01559963,0.017114030500000002],"311296":[0.070509402999999998,0.07865294149999999],"1408":[0.000237075,0.00025276294444444438],"393216":[0.13116804100000001,0.144441664],"4352":[0.000632491,0.0006342351428571427],"6553600":[3.6691608085,3.8960469870000001],"20480":[0.0034426069999999994,0.0036430240000000003],"608":[8.5829010752688176e-05,9.3256600000000004e-05],"2228224":[1.102624764,1.125558115],"36864":[0.0056549090000000005,0.0059158319999999985],"704":[0.00011337016666666667,0.000114938],"720896":[0.23367718849999999,0.31292151200000001],"800":[9.3880166666666663e-05,9.5519939999999989e-05],"2621440":[1.561716168,1.6474358119999999],"425984":[0.088297267999999998,0.10134346449999999],"32768":[0.004617337,0.0048513330000000011],"12058624":[11.7776073915,11.995570962],"128":[1.4427660000000001e-05,1.477635294117647e-05],"180224":[0.043818107000000002,0.045608231499999985],"224":[2.385213e-05,2.3917009999999999e-05],"736":[0.00013205500000000001,0.000141366],"320":[4.3714239999999998e-05,4.8479999999999997e-05],"557056":[0.13484794,0.197753974],"832":[9.6224000000000006e-05,9.9218126315789464e-05],"9437184":[6.4975577270000002,6.6687691840000003],"3584":[0.0004546550000000001,0.00046676895],"6291456":[6.6349979049999996,6.7126012485000004],"256":[2.9001280000000002e-05,3.0476639999999998e-05],"15204352":[9.3039960629999996,9.5567330500000001],"28672":[0.0038846029999999995,0.0040148979999999994],"768":[0.00015636600000000001,0.00015902112903225807],"212992":[0.038313197,0.042181290000000003],"864":[0.00010146225,0.0001053437142857143],"352":[5.8903333333333336e-05,5.9725999999999997e-05],"253952":[0.052498367000000011,0.053365094000000016],"960":[0.000123616,0.00012626666666666668],"24576":[0.0054738119999999998,0.0056758569999999986],"7680":[0.0010472847777777776,0.0010862930000000001],"294912":[0.063394935999999985,0.069193801999999999],"1048576":[0.361859394,0.51010259300000005],"10485760":[7.7519292535000002,7.9262680190000001],"344064":[0.087184971999999986,0.094082863500000016],"288":[3.6651869999999998e-05,3.6831e-05],"1152":[0.00016075399999999999,0.00016459099999999998],"384":[6.7602500000000002e-05,7.6311999999999997e-05],"2304":[0.00035326949999999998,0.0004200576666666668],"896":[0.00010665866666666665,0.000112309],"480":[5.772867e-05,6.0331000000000002e-05],"1441792":[0.71558179700000002,1.0566915244999999],"992":[0.00012346762499999998,0.000132237],"3968":[0.00054181605882352936,0.00054409599999999988],"6400":[0.00080450200000000002,0.000855849],"1344":[0.0002245917954545455,0.00023534992682926835],"126976":[0.0217390085,0.023540821],"2883584":[2.0130550039999999,2.167695846],"753664":[0.27237532050000002,0.38272560999999999],"16384":[0.0023486679999999999,0.0023890159999999999],"131072":[0.023005877000000001,0.023436004999999996],"458752":[0.097137716999999985,0.118900115],"172032":[0.0397025035,0.041472426],"12288":[0.0027257630000000017,0.0030300909999999995],"14680064":[8.8629601339999997,17.551987409500001],"1536":[0.000319468,0.00035017946428571431],"25600":[0.0031843750000000006,0.003307033],"1835008":[0.80628865249999992,0.81512932199999999],"10752":[0.001890192,0.0019377040000000002],"21504":[0.0037592225000000002,0.0038450949999999998],"7602176":[4.3772077420000004,4.4385785220000002],"5632":[0.001042437,0.0010485830000000003],"10":[1.0770100000000001e-06,1.2564799999999998e-06],"3145728":[2.7324379250000002,2.9776685899999999],"245760":[0.046534937999999998,0.050943694999999997],"1728":[0.00021518934146341466,0.000225873],"11":[1.34074e-06,1.421e-06],"1114112":[0.39288605100000001,0.54825578099999994],"12":[1.3392100000000001e-06,1.41616e-06],"7340032":[4.1876016915000003,4.2176682845000002],"7168":[0.00095201149999999996,0.0010688189999999999],"13":[1.5548900000000001e-06,1.68316e-06],"6029312":[5.516174243,5.5497043914999997],"14":[1.6037199999999999e-06,1.65085e-06],"3200":[0.00037086599999999997,0.00040520899999999996],"20":[2.3463899999999998e-06,2.8379500000000001e-06],"204800":[0.03501162699999999,0.037095379999999997],"15":[1.7835099999999998e-06,1.84224e-06],"13312":[0.0016676897999999992,0.0018350510000000003],"4980736":[3.278683204,3.3730164199999999],"118784":[0.0195815895,0.019670709000000001],"51200":[0.006891000999999999,0.0070923260000000004],"16":[1.85968e-06,2.0350126582278484e-06],"21":[2.68205e-06,2.8154200000000003e-06],"917504":[0.28604255299999998,0.42942753899999997],"22":[2.9507699999999998e-06,3.09417e-06],"4864":[0.0007588626923076922,0.00078009100000000033],"17":[2.1409799999999998e-06,2.2064799999999998e-06],"14848":[0.002028888,0.0020631812500000006],"23":[3.0862600000000002e-06,3.2812899999999995e-06],"786432":[0.29756569199999999,0.40821056849999998],"18":[2.38724e-06,2.3943000000000001e-06],"1638400":[0.67246531700000001,0.691369224],"7864320":[4.7055035749999998,4.7669482099999998],"24":[3.1613300000000001e-06,3.6596399999999999e-06],"14155776":[8.4534121039999999,8.7359484394999996],"19":[2.3137400000000002e-06,2.7447000000000002e-06],"30":[3.1044900000000002e-06,3.2548199999999999e-06],"25":[2.6494399999999998e-06,2.7636400000000004e-06],"31":[3.3675300000000004e-06,3.3986599999999999e-06],"1280":[0.0001973825,0.000202735],"26":[2.7580200000000002e-06,2.8901000000000001e-06],"3932160":[2.1392544450000002,2.2871869010000001],"2432":[0.000359806,0.00039409800000000012],"32":[3.3974299999999998e-06,3.5996799999999999e-06],"27":[2.9140699999999998e-06,3.1496464646464647e-06],"409600":[0.082290712999999988,0.1150296]}},{"title":"OrderedSet symmetricDifference with Self (25% overlap)","results":{"28":[2.8687299999999997e-06,3.0759999999999999e-06],"34":[3.5358800000000002e-06,3.5919299999999998e-06],"29":[2.8863181818181817e-06,2.8980100000000003e-06],"40":[4.3954100000000002e-06,4.6945700000000004e-06],"17408":[0.0022575967499999998,0.0025668033333333335],"1472":[0.00022376499999999998,0.00024878299999999998],"112":[1.1474050000000001e-05,1.1486823529411765e-05],"1376256":[0.5784244865,0.81071291099999998],"5242880":[3.2959198870000002,3.3422995095000001],"36":[3.64892e-06,4.0042099999999996e-06],"42":[4.3787600000000001e-06,5.3328800000000005e-06],"11534336":[8.7585631750000008,9.0274411019999992],"114688":[0.017629066999999991,0.018464086000000001],"144":[1.4718900000000001e-05,1.636078e-05],"38":[3.7408800000000003e-06,4.23409e-06],"240":[2.6195394366197182e-05,2.6884119999999997e-05],"9216":[0.0012299630000000001,0.0012756234285714286],"44":[4.8754100000000006e-06,5.4535882352941173e-06],"1664":[0.0001998799375,0.00020909000000000002],"196608":[0.051001107999999996,0.052464727500000009],"155648":[0.027738828,0.028385949000000001],"2816":[0.00043246699999999991,0.00043496795454545448],"50":[4.7377700000000002e-06,5.0529999999999997e-06],"2359296":[1.1613138285,1.1669621205],"46":[5.3758899999999998e-06,5.7814499999999995e-06],"176":[2.1382872340425535e-05,2.2398460000000003e-05],"52":[5.0692692307692307e-06,5.2313000000000002e-06],"272":[2.9101570000000001e-05,3.0220300000000003e-05],"116":[1.1681e-05,1.2604129999999999e-05],"47104":[0.0079645970000000003,0.0086337059999999997],"6912":[0.000873129272727273,0.00090881600000000012],"1856":[0.00024023730000000002,0.00024666400000000006],"48":[5.7845700000000001e-06,7.6255699999999999e-06],"2097152":[0.87666024200000003,1.011593433],"54":[5.3295999999999998e-06,5.4054199999999997e-06],"2031616":[0.78942760499999998,0.83156731699999997],"43008":[0.0067773740000000001,0.0069778089999999989],"60":[6.0094200000000001e-06,6.4749800000000001e-06],"30720":[0.0042130939999999997,0.0042643219999999992],"56":[5.3547200000000003e-06,5.8102800000000004e-06],"62":[6.5621899999999998e-06,7.1707900000000002e-06],"58":[5.7742872340425532e-06,5.8556299999999999e-06],"3014656":[2.0976215850000002,2.2979256719999999],"64":[6.8053400000000001e-06,7.6174600000000001e-06],"8388608":[4.9356819329999997,5.0273888084999996],"29696":[0.0039701219999999995,0.004017184],"216":[2.1877000000000001e-05,2.4285040000000002e-05],"106496":[0.015708014499999999,0.016607663999999994],"72":[7.1099999999999997e-06,7.7350100000000003e-06],"442368":[0.089235954999999992,0.097159164499999978],"147456":[0.025391932000000006,0.025418884999999995],"4456448":[2.428489538,2.512412356],"63488":[0.0096012239999999985,0.0098874134999999974],"38912":[0.0055727269999999995,0.0057262709999999981],"68":[6.7967099999999995e-06,7.6852200000000003e-06],"188416":[0.042247760000000002,0.047081487999999998],"248":[2.6799419999999998e-05,2.9715389999999999e-05],"80":[9.0856300000000003e-06,1.0645999999999999e-05],"2560":[0.00033086299999999998,0.00037670553846153851],"34816":[0.0046228959999999996,0.0049800000000000001],"3712":[0.000472008,0.00048543700000000002],"3538944":[1.623327937,1.6898269935000001],"76":[7.7418299999999997e-06,8.9621000000000001e-06],"4194304":[2.1712041609999999,2.4291135769999999],"851968":[0.2272503595,0.354715681],"4096":[0.00055510199999999992,0.00057904300000000001],"59392":[0.0084990079999999989,0.0090148680000000005],"84":[9.7888399999999996e-06,1.0315129999999999e-05],"3276800":[1.4966592840000001,1.5408626829999998],"55296":[0.0077405449999999997,0.0079206960000000048],"688128":[0.19416563749999999,0.26807666699999999],"8192":[0.0011557027142857139,0.0011842403750000001],"10240":[0.0014989603333333342,0.0016566969999999999],"15872":[0.0022432867500000002,0.0022732939999999999],"92":[1.317285e-05,1.3570050000000001e-05],"26624":[0.0033022925000000002,0.003561561],"1792":[0.00021447650000000007,0.00022979247619047603],"11776":[0.0019709506000000002,0.0020195825],"2944":[0.00047316000000000008,0.00050512115789473698],"88":[1.054328e-05,1.0754510000000001e-05],"22528":[0.0036515569999999997,0.0037669054999999998],"1245184":[0.45510040000000002,0.64341665100000001],"15728640":[9.2140577839999995,9.3220760939999998],"96":[1.326211111111111e-05,1.4459e-05],"1984":[0.00025483099999999996,0.00027476666666666666],"139264":[0.025375251499999994,0.028537869],"475136":[0.10129111,0.12831721500000001],"13631488":[7.4387152749999998,7.7619261384999998],"416":[4.4434999999999997e-05,4.6853090000000006e-05],"928":[0.00011223,0.0001206420273972603],"512":[6.5159000000000004e-05,6.5900600000000004e-05],"18432":[0.0024959813333333336,0.0026205726666666661],"16777216":[10.225718482],"9728":[0.0013276640000000001,0.0013650069999999997],"1769472":[0.68737885100000007,0.687617272],"1703936":[0.65000885200000003,0.66387532000000005],"2048":[0.00027467100000000004,0.00027525702777777785],"14336":[0.0018967673999999996,0.0019918170000000008],"448":[4.9607999999999997e-05,5.4725909999999998e-05],"5505024":[3.6677235834999999,3.7725991169999999],"544":[6.1393642857142857e-05,6.4662379999999998e-05],"221184":[0.037409904000000001,0.041692852000000002],"90112":[0.016033516999999997,0.016945033000000005],"640":[7.6587000000000004e-05,8.0310749999999993e-05],"12800":[0.001568385,0.0017361254],"262144":[0.051358382000000001,0.055038746999999985],"589824":[0.138404893,0.218615011],"884736":[0.24191552150000001,0.338258171],"6144":[0.0010862480000000002,0.0011047850000000001],"1088":[0.00013022700000000001,0.000134998],"576":[6.4896500000000005e-05,7.8665730769230765e-05],"160":[1.836e-05,1.9899169999999999e-05],"672":[8.9687772727272723e-05,9.3105666666666665e-05],"8912896":[5.3302920604999997,5.3801516940000003],"100":[9.5369100000000008e-06,9.5983275862068962e-06],"507904":[0.114440398,0.14524921499999999],"3840":[0.00050235500000000001,0.00053315716666666661],"192":[2.8317500000000001e-05,2.999635e-05],"376832":[0.101180405,0.105580535],"98304":[0.0204305485,0.021124878],"5376":[0.00079996500000000003,0.0008069669999999998],"94208":[0.017929558000000005,0.0190539635],"81920":[0.013118653499999999,0.0132264735],"3407872":[1.5952736544999999,1.628110129],"104":[1.015979e-05,1.0817209999999999e-05],"122880":[0.019836271000000003,0.020825291999999999],"200":[1.9479689999999998e-05,1.9950687500000001e-05],"163840":[0.030628671,0.030956413000000006],"4063232":[2.0698215429999998,2.0705705989999998],"5767168":[4.2321327240000004,4.2461549669999998],"12582912":[11.589773392,22.9315043605],"1600":[0.00019192150000000002,0.0001977421],"136":[1.3635900000000001e-05,1.4634190000000001e-05],"232":[2.3475000000000001e-05,2.4921299999999998e-05],"7077888":[3.756923827,3.9956607704999998],"86016":[0.0143416425,0.015859548499999997],"31744":[0.0044003419999999998,0.0046679574999999984],"168":[1.9406e-05,2.0930430000000001e-05],"622592":[0.16240159400000001,0.22005635700000004],"108":[1.0286399999999999e-05,1.1067509999999999e-05],"327680":[0.070030289000000009,0.07287344200000001],"2176":[0.00027509499999999999,0.00030128200000000005],"3328":[0.00041700377272727262,0.0004226719999999998],"1":[1.7427000000000001e-07,1.8351999999999999e-07],"2":[2.8615e-07,2.9070999999999999e-07],"3":[3.3121999999999997e-07,3.3694e-07],"4":[3.6971999999999995e-07,3.8290000000000002e-07],"7424":[0.00096263400000000008,0.0010239750000000001],"5":[4.0632e-07,4.158e-07],"23552":[0.003935590000000001,0.0041679529999999985],"6":[4.5293000000000002e-07,4.6771000000000005e-07],"61440":[0.0090320169999999998,0.0093365309999999986],"491520":[0.10811897099999999,0.13262650600000001],"77824":[0.012531364499999999,0.013007392],"7":[5.0714000000000003e-07,5.1195999999999999e-07],"8":[5.4428999999999996e-07,5.5380999999999995e-07],"208":[2.150822e-05,2.1941780000000003e-05],"9":[5.8518999999999996e-07,5.9230999999999999e-07],"73728":[0.010945603,0.011611988],"304":[3.46368e-05,3.70903e-05],"400":[4.1378000000000003e-05,4.2887389999999998e-05],"1310720":[0.48530075299999997,0.73296168099999992],"336":[4.2439807692307694e-05,4.8490927083333331e-05],"3670016":[1.7123176195000001,1.794802663],"6656":[0.00079804400000000003,0.00085753500000000009],"15360":[0.0020778872500000004,0.0020881909999999997],"432":[4.4673571428571423e-05,5.0202540229885062e-05],"950272":[0.27118599200000004,0.38659506300000002],"655360":[0.16899945799999999,0.22704555600000001],"69632":[0.0099940990000000011,0.0101986935],"11264":[0.0017790916,0.001803016],"2752512":[1.6244228075,1.7255416724999999],"8126464":[4.5891017334999997,4.619493404],"27648":[0.0035260449999999998,0.0036818460000000003],"368":[5.2637309523809528e-05,6.2271133333333334e-05],"65536":[0.0103086815,0.010801271000000001],"16252928":[9.7856124229999999,10.076295929500001],"464":[5.4069e-05,5.4754970000000005e-05],"1015808":[0.30997171150000002,0.39157040649999997],"3072":[0.00052345799999999997,0.00055912699999999997],"110592":[0.016701219,0.018233678],"237568":[0.042817979999999999,0.045229064999999999],"278528":[0.055965452000000006,0.059439851000000044],"496":[6.1031799999999994e-05,6.1108129999999994e-05],"13107200":[6.9745116810000001,7.2129881000000005],"9961472":[6.5691015149999998,6.7629875449999997],"5888":[0.00096197999999999997,0.00099692399999999994],"11010048":[7.8432664125000002,7.878342247],"1920":[0.000235861,0.00024555123684210517],"2490368":[1.2883725369999999,1.3616702005000001],"19456":[0.0026266359999999999,0.0027696179999999997],"57344":[0.0080104760000000007,0.0082233199999999992],"1179648":[0.39938130449999998,0.58932927499999999],"4718592":[2.666794978,2.8184067509999999],"360448":[0.083956925000000002,0.098081520500000005],"1572864":[0.87021190549999994,0.94742851350000001],"53248":[0.007228486000000001,0.0075738019999999993],"3456":[0.00045250766666666675,0.0004767083],"40960":[0.0060510099999999999,0.0061528299999999998],"4608":[0.00057756999999999991,0.00060857593333333323],"13824":[0.0017992360000000003,0.0020158820000000001],"819200":[0.21274801899999995,0.30340813],"983040":[0.27356457099999998,0.40603465999999999],"8704":[0.001125416,0.0011860589999999997],"120":[1.2006499999999999e-05,1.366092e-05],"1024":[0.00013880700000000001,0.00014386799999999999],"49152":[0.0092051290000000011,0.0097500699999999996],"524288":[0.118139165,0.149370485],"45056":[0.0072978109999999987,0.0079574209999999992],"229376":[0.040463488999999998,0.046593077000000011],"2688":[0.0003679,0.0003888745],"152":[1.6418400000000002e-05,1.776069e-05],"5120":[0.00071911230769230777,0.00075299000000000004],"1507328":[0.75247300699999997,1.0175757430000001],"1216":[0.000159431,0.00016380299999999996],"1966080":[0.78822751949999992,0.83788289150000006],"1900544":[0.71974806800000002,0.76183408500000005],"184":[2.5493443181818183e-05,2.566661e-05],"7936":[0.0010467850000000004,0.001151191],"3801088":[1.8496335625,1.9032037255000001],"6815744":[3.5767261239999999,3.7741030110000002],"124":[1.3295000000000001e-05,1.4609729999999999e-05],"102400":[0.014929326499999998,0.015767874000000001],"311296":[0.064869036000000019,0.069794393999999996],"1408":[0.00020848213043478254,0.000224279],"393216":[0.11299044499999999,0.11858589899999999],"4352":[0.00057078200000000004,0.00058339650000000009],"6553600":[3.395901528,3.665279355],"20480":[0.0030087933333333336,0.003036647],"608":[7.5696225806451623e-05,7.8260269230769229e-05],"2228224":[1.0143038535,1.0463946529999999],"36864":[0.0051402469999999997,0.0052673159999999993],"704":[0.000103102,0.00010815347777777771],"720896":[0.2149442345,0.29399182499999998],"800":[9.2921730000000011e-05,9.3851999999999995e-05],"2621440":[1.4246365145,1.4933041405],"425984":[0.085880833999999989,0.113747498],"32768":[0.0046095060000000002,0.0048415949999999998],"12058624":[9.9702081939999996,10.23852026],"128":[1.406469e-05,1.4188999999999999e-05],"180224":[0.037809326500000004,0.039094962999999996],"224":[2.337961e-05,2.4729970000000003e-05],"736":[0.00011235725,0.000115228],"320":[3.8816000000000002e-05,4.1151e-05],"557056":[0.124373418,0.18307494499999999],"832":[9.3305166666666662e-05,9.9275000000000001e-05],"9437184":[5.9852132454999998,6.1264529215000003],"3584":[0.00046140500000000007,0.00046233323809523818],"6291456":[5.6054084670000002,5.6888947705000001],"256":[3.0744999999999998e-05,3.1180029999999998e-05],"15204352":[8.7691245739999992,9.19034583],"28672":[0.0037521060000000003,0.0039260240000000002],"768":[0.0001233224696969697,0.000124139],"212992":[0.036813071000000003,0.045052638999999998],"864":[0.00010041866666666668,0.00010505239560439558],"352":[4.8996000000000003e-05,4.9112169999999998e-05],"253952":[0.048562130999999988,0.051304591999999996],"960":[0.000122741,0.00012835325],"24576":[0.0044367520000000004,0.0046189565000000002],"7680":[0.0010134669999999999,0.00106109],"294912":[0.064099521500000006,0.070959871999999979],"1048576":[0.30924806199999999,0.45156884400000002],"10485760":[6.9971878614999996,7.0795289260000001],"344064":[0.081427567999999992,0.084979835500000017],"288":[3.131295e-05,3.2234999999999999e-05],"1152":[0.000141896,0.00014904099999999998],"384":[5.8783999999999998e-05,6.2359219999999992e-05],"2304":[0.00030571806250000004,0.00032698500000000001],"896":[0.00010826383333333333,0.00011406619540229888],"480":[5.707154054054054e-05,5.8452500000000003e-05],"1441792":[0.66222056100000004,0.90860097799999995],"992":[0.000129832,0.00013127757352941177],"3968":[0.00054233699999999972,0.00056266723529411794],"6400":[0.00077221899999999999,0.00086298745454545472],"1344":[0.00019127100000000002,0.00019752716666666665],"126976":[0.020952080999999997,0.022139569999999997],"2883584":[1.7964393219999999,1.9390311689999999],"753664":[0.23711101700000004,0.31503983999999996],"16384":[0.0023221310000000003,0.0024167840000000004],"131072":[0.022323632,0.024521338],"458752":[0.094920642,0.1131760565],"172032":[0.034705689499999998,0.036474543999999998],"12288":[0.0022079560000000005,0.0024996230000000003],"14680064":[8.1588012370000005,16.650819787],"1536":[0.000267008,0.00028811761764705883],"25600":[0.0031407010000000001,0.0032782266666666672],"1835008":[0.70006707749999997,0.74087975800000005],"10752":[0.0016002450000000006,0.0016604724000000004],"21504":[0.003187081,0.0033338450000000006],"7602176":[4.0778363129999997,4.1292799880000004],"5632":[0.00086862100000000019,0.000908237],"10":[6.5082999999999996e-07,7.117e-07],"3145728":[2.3951171365000001,2.4334280929999998],"245760":[0.044974224,0.047677574],"1728":[0.00021328071428571423,0.00021739104444444446],"11":[1.30616e-06,1.3094699999999999e-06],"1114112":[0.37926738399999999,0.49482722600000001],"12":[1.3365499999999999e-06,1.3846099999999999e-06],"7340032":[3.8337101370000002,3.9180963645000002],"7168":[0.00093498639999999998,0.001010185],"13":[1.37823e-06,1.52013e-06],"6029312":[4.8102062634999996,4.8954007580000001],"14":[1.4971400000000001e-06,1.63407e-06],"3200":[0.00040027586363636355,0.00040513065217391315],"20":[2.0977100000000001e-06,2.3173000000000002e-06],"204800":[0.034292533,0.03586308800000005],"15":[1.7477200000000001e-06,1.8789999999999999e-06],"13312":[0.001714614000000001,0.001869648],"4980736":[2.9796887449999998,3.002699582],"118784":[0.018580557000000004,0.018872014499999999],"51200":[0.0068216000000000014,0.0071354029999999985],"16":[1.8150899999999999e-06,1.8622600000000001e-06],"21":[2.2643099999999999e-06,2.7529300000000003e-06],"917504":[0.24558245499999998,0.35412217800000001],"22":[2.4133100000000001e-06,2.7362499999999998e-06],"4864":[0.00062191799999999973,0.00067511899999999985],"17":[1.9330299999999999e-06,2.0195333333333333e-06],"14848":[0.002055374,0.002077738],"23":[2.6139199999999998e-06,2.7005100000000001e-06],"786432":[0.27611835800000001,0.35104922399999999],"18":[2.0406200000000001e-06,2.2602500000000001e-06],"1638400":[0.61065563099999998,0.66584817399999996],"7864320":[4.3497683110000001,4.5261085740000002],"24":[3.0844200000000002e-06,3.1687799999999999e-06],"14155776":[7.8817804765000004,8.4940392770000006],"19":[2.07222e-06,2.2679400000000002e-06],"30":[3.0211600000000001e-06,3.1825e-06],"25":[2.4528e-06,2.4672099999999997e-06],"31":[3.3203699999999996e-06,3.528833333333333e-06],"1280":[0.00016569800000000001,0.000172821],"26":[2.64733e-06,2.7284699999999998e-06],"3932160":[1.9092349239999999,2.0811310829999998],"2432":[0.00032637193333333325,0.000335836],"32":[3.3294900000000002e-06,3.6625099999999999e-06],"27":[2.7409100000000002e-06,2.8015100000000001e-06],"409600":[0.079408149000000011,0.102912244]}},{"title":"OrderedSet symmetricDifference with Self (50% overlap)","results":{"28":[2.3452200000000001e-06,2.38684e-06],"34":[2.8284600000000003e-06,3.1499000000000001e-06],"29":[2.3681799999999999e-06,2.4047500000000001e-06],"40":[3.45962e-06,3.6388045977011496e-06],"17408":[0.0018490819999999997,0.0019771060000000002],"1472":[0.00019061100000000001,0.00020567200000000001],"112":[8.4847500000000004e-06,8.8509000000000002e-06],"1376256":[0.46801938199999998,0.71725434700000001],"5242880":[2.8365434045,2.8829251939999998],"36":[2.9777100000000002e-06,3.2112400000000001e-06],"42":[3.7454499999999999e-06,3.9813899999999998e-06],"11534336":[7.2167740939999998,7.7651411589999997],"114688":[0.013850004000000027,0.014541538999999997],"144":[1.213025e-05,1.2904857142857143e-05],"38":[3.3457799999999997e-06,3.48001e-06],"240":[1.9632090000000001e-05,2.0890930000000002e-05],"9216":[0.00098927699999999999,0.0010404158888888894],"44":[3.9435600000000004e-06,4.6264999999999997e-06],"1664":[0.000155336,0.00015625099999999999],"196608":[0.039528670499999988,0.045919105999999994],"155648":[0.023636109999999995,0.024752966000000001],"2816":[0.00034957918518518504,0.00035995374074074071],"50":[3.88966e-06,4.0704500000000001e-06],"2359296":[0.97438947600000003,0.98471071850000003],"46":[4.3275800000000002e-06,4.4781299999999999e-06],"176":[1.7557919999999998e-05,1.796895e-05],"52":[4.03433e-06,4.0845000000000004e-06],"272":[2.3514479999999999e-05,2.4962034883720928e-05],"116":[9.1719999999999996e-06,9.6568000000000004e-06],"47104":[0.0064595300000000007,0.0067029809999999993],"6912":[0.00062889800000000013,0.00070902699999999999],"1856":[0.00018148060416666665,0.00018389099999999999],"48":[4.5359799999999997e-06,5.7779000000000002e-06],"2097152":[0.74904669499999998,0.99056820800000001],"54":[4.0897200000000005e-06,4.31111e-06],"2031616":[0.67074682299999999,0.788319989],"43008":[0.0055479189999999992,0.0057888870000000004],"60":[4.8847699999999998e-06,5.0330700000000006e-06],"30720":[0.0032353110000000003,0.0033575955000000003],"56":[4.3598500000000003e-06,4.3972199999999997e-06],"62":[5.1308600000000009e-06,5.2672933333333335e-06],"58":[4.5438800000000001e-06,4.6578900000000001e-06],"3014656":[1.6832723430000001,1.894337312],"64":[5.0709199999999997e-06,5.5218400000000005e-06],"8388608":[4.2777943260000004,4.3815283615],"29696":[0.0030763800000000001,0.0031875050000000002],"216":[1.6753e-05,1.6818000000000001e-05],"106496":[0.0125844805,0.013434961],"72":[6.1175300000000007e-06,6.3695099999999996e-06],"442368":[0.073250475000000009,0.082484771999999998],"147456":[0.021075308000000015,0.021227934],"4456448":[2.1107488820000002,2.1712037820000001],"63488":[0.0072829590000000003,0.0084514659999999995],"38912":[0.0046861109999999997,0.0048681339999999997],"68":[5.6154399999999999e-06,6.04584e-06],"188416":[0.035376336499999994,0.037817751500000003],"248":[2.0873979999999999e-05,2.1200999999999999e-05],"80":[7.6288099999999996e-06,8.8033799999999997e-06],"2560":[0.00029756190625000002,0.00031035700000000009],"34816":[0.0037783779999999989,0.003858879],"3712":[0.00035662600000000002,0.00036601807692307692],"3538944":[1.4912960614999999,1.5052605509999999],"76":[6.6984300000000005e-06,7.2088000000000003e-06],"4194304":[1.8794208809999999,2.003858148],"851968":[0.21298952400000001,0.29895014399999997],"4096":[0.00041765599999999992,0.00047189400000000005],"59392":[0.006776336,0.0069537420000000006],"84":[7.7534600000000001e-06,8.3347e-06],"3276800":[1.365456674,1.3726131850000001],"55296":[0.0058835880000000021,0.0061503579999999999],"688128":[0.15542078600000001,0.23879202300000002],"8192":[0.00083856999999999996,0.00087761000000000002],"10240":[0.001220502,0.0013761221428571428],"15872":[0.0016710744,0.0017151599999999996],"92":[9.0030600000000008e-06,1.020469e-05],"26624":[0.002545238,0.0026787070000000002],"1792":[0.0001710538448275862,0.000180757],"11776":[0.0016028010000000003,0.0017021908],"2944":[0.000379737,0.00039585999999999994],"88":[8.6449400000000003e-06,8.9735800000000002e-06],"22528":[0.0030256886666666667,0.0030882639999999999],"1245184":[0.40576812600000001,0.532153502],"15728640":[7.9553558430000004,8.0633126895],"96":[9.7104999999999996e-06,1.0556e-05],"1984":[0.00019441200000000001,0.00020253891666666669],"139264":[0.019840688500000002,0.025022192999999998],"475136":[0.0944456885,0.122651893],"13631488":[6.208025439,6.9413835754999997],"416":[3.3432890000000002e-05,3.5250759999999995e-05],"928":[8.2746111111111113e-05,8.7537933333333334e-05],"512":[4.3761800000000005e-05,4.7790899999999997e-05],"18432":[0.00206867475,0.0021514120000000001],"16777216":[8.8567054625000008],"9728":[0.0010989905000000004,0.00118085],"1769472":[0.60866740350000004,0.67166414099999994],"1703936":[0.55894414599999998,0.60551928399999999],"2048":[0.000204847,0.00020751984782608695],"14336":[0.0014122030000000003,0.0014627968333333335],"448":[3.7412694915254233e-05,3.938206666666667e-05],"5505024":[3.0889066894999999,3.1259176750000002],"544":[5.0337666666666664e-05,5.1383419354838709e-05],"221184":[0.030171663999999997,0.035157934999999994],"90112":[0.0133599745,0.014149574],"640":[6.5495666666666664e-05,6.8449418604651168e-05],"12800":[0.001236347125,0.001296342],"262144":[0.04155383,0.042546196500000008],"589824":[0.11526227999999999,0.16659360500000001],"884736":[0.22604811899999999,0.30395500349999999],"6144":[0.00092749040000000024,0.00093688600000000016],"1088":[0.000108378,0.000111285],"576":[5.3007000000000003e-05,6.2957459999999992e-05],"160":[1.429556e-05,1.6999090000000001e-05],"672":[7.354168e-05,7.8894740000000005e-05],"8912896":[4.5550158060000001,4.5985998810000002],"100":[7.3181099999999993e-06,7.9815999999999999e-06],"507904":[0.10267018449999998,0.12743186499999998],"3840":[0.00039126507999999986,0.000394225],"192":[2.3408333333333334e-05,2.5542790000000001e-05],"376832":[0.079304949,0.086147910999999994],"98304":[0.017325991000000002,0.017849979999999998],"5376":[0.000653844,0.00068514528571428563],"94208":[0.015200483000000004,0.015953927999999999],"81920":[0.010936363000000001,0.011041075000000001],"3407872":[1.403012347,1.4055489534999999],"104":[7.9517200000000002e-06,8.3257599999999997e-06],"122880":[0.015966135500000003,0.016599433],"200":[1.5408969999999999e-05,1.636336e-05],"163840":[0.025369197,0.027338656000000006],"4063232":[1.7412109839999999,1.8011448835000001],"5767168":[3.5584366620000001,3.6617441469999998],"12582912":[9.5515185964999993,19.560672660000002],"1600":[0.00014962733846153847,0.00015041251724137931],"136":[1.152192e-05,1.1938890000000001e-05],"232":[1.7605437499999998e-05,1.8987940000000001e-05],"7077888":[3.2850059410000001,3.523190477],"86016":[0.012126775000000001,0.012612105],"31744":[0.0032834509999999997,0.003468793],"168":[1.6410019999999998e-05,1.7697709999999999e-05],"622592":[0.1410334305,0.18042398199999998],"108":[8.1710000000000002e-06,8.450880000000001e-06],"327680":[0.058984563999999996,0.061712280000000008],"2176":[0.0002224083333333334,0.00025475482857142864],"3328":[0.00031500073333333336,0.00032218649999999998],"1":[1.7550999999999999e-07,1.7608000000000003e-07],"2":[2.8657e-07,2.8948999999999998e-07],"3":[3.2413999999999999e-07,3.2800999999999998e-07],"4":[3.6288000000000003e-07,3.7124999999999999e-07],"7424":[0.00072723761538461527,0.00076664418181818185],"5":[4.0137e-07,4.0339999999999997e-07],"23552":[0.0033272099999999997,0.0034583789999999997],"6":[4.5082000000000001e-07,4.6017999999999998e-07],"61440":[0.0070386040000000013,0.007159577999999998],"491520":[0.097644737499999995,0.104377408],"77824":[0.0101693115,0.011136905000000001],"7":[4.9006999999999999e-07,4.9187000000000002e-07],"8":[5.2500000000000006e-07,5.3229000000000001e-07],"208":[1.6456310000000001e-05,1.6708500000000001e-05],"9":[5.6802999999999999e-07,5.7333999999999992e-07],"73728":[0.0091378250000000022,0.010035025999999999],"304":[2.8102e-05,3.0281380952380955e-05],"400":[3.2107000000000003e-05,3.3674329999999999e-05],"1310720":[0.4343302,0.5929211405],"336":[3.4994570000000003e-05,4.0187360000000005e-05],"3670016":[1.520846755,1.622364454],"6656":[0.00064756315384615379,0.00065791785714285707],"15360":[0.0015613269999999999,0.0015664820000000003],"432":[3.6203589999999999e-05,3.798234e-05],"950272":[0.22929144400000001,0.34639284800000003],"655360":[0.14444218750000001,0.18105111199999999],"69632":[0.0083322190000000001,0.0098036339999999986],"11264":[0.0014421949999999998,0.0014975738333333336],"2752512":[1.3676983169999999,1.4277269619999999],"8126464":[3.7854878439999999,3.9375564975000001],"27648":[0.0028263109999999998,0.0028973496666666663],"368":[4.139085e-05,5.2066480000000006e-05],"65536":[0.0077672900000000005,0.0080236170000000002],"16252928":[8.2629151299999997,8.7999017044999999],"464":[3.9394999999999998e-05,4.0492806451612905e-05],"1015808":[0.272399742,0.35747510699999996],"3072":[0.00043732500000000002,0.00045949309523809508],"110592":[0.013272409000000002,0.015057728999999997],"237568":[0.035785395000000012,0.039261114999999965],"278528":[0.046714212499999998,0.053980444000000016],"496":[4.3322368421052627e-05,4.4498669999999999e-05],"13107200":[6.0133826460000002,6.7326831399999998],"9961472":[5.5958997799999999,6.002921787],"5888":[0.00077522399999999992,0.00083461600000000016],"11010048":[6.4512373849999998,6.7462605384999996],"1920":[0.00017876099999999999,0.00018697534042553193],"2490368":[1.0906650390000001,1.1379845989999999],"19456":[0.0022301359999999998,0.0023088965000000001],"57344":[0.0062050659999999995,0.0062579630000000009],"1179648":[0.32223410699999999,0.50838125850000004],"4718592":[2.3662412865000002,2.4624889130000001],"360448":[0.069575011000000034,0.082352307],"1572864":[0.73011411299999995,0.85747545599999997],"53248":[0.0056076599999999996,0.0059856280000000006],"3456":[0.000323414,0.00033728999999999996],"40960":[0.0050069090000000004,0.005137076],"4608":[0.0005013760000000001,0.00051159210526315773],"13824":[0.0013801948333333333,0.001437153],"819200":[0.20095429100000001,0.26110265700000002],"983040":[0.26083962699999996,0.36151598600000001],"8704":[0.00090201799999999987,0.00097460033333333332],"120":[9.8571700000000007e-06,1.0050999999999999e-05],"1024":[9.6175252631578952e-05,0.00010217916666666667],"49152":[0.0074735949999999978,0.007650274999999998],"524288":[0.101997828,0.15189900699999997],"45056":[0.0058649930000000006,0.0062975560000000002],"229376":[0.036452660000000019,0.037349772000000003],"2688":[0.00031366400000000007,0.00033193420689655158],"152":[1.2683529411764705e-05,1.3888620000000001e-05],"5120":[0.00060224087499999974,0.00063848513333333325],"1507328":[0.59804572050000004,0.82075214900000004],"1216":[0.00013335899999999997,0.00013486890140845074],"1966080":[0.68693250049999999,0.69706137999999995],"1900544":[0.61152599000000007,0.69144026700000005],"184":[2.0215060000000003e-05,2.0432929999999998e-05],"7936":[0.00080452799999999999,0.00084878900000000018],"3801088":[1.5401865539999999,1.706279229],"6815744":[3.1879027545,3.3855010559999998],"124":[1.0082820000000001e-05,1.0447349999999999e-05],"102400":[0.011916388999999998,0.012928076],"311296":[0.053278000000000006,0.058822255000000004],"1408":[0.00017148675,0.000185262],"393216":[0.089354234000000005,0.10018835299999995],"4352":[0.00044951699999999997,0.00046611860000000027],"6553600":[2.8803468699999999,3.235291176],"20480":[0.0024520879999999998,0.0024871709999999998],"608":[5.9997156250000001e-05,6.3025824561403518e-05],"2228224":[0.85400199799999998,0.89679463250000002],"36864":[0.0041477570000000002,0.0043012960000000005],"704":[7.9979875000000001e-05,8.8363220000000009e-05],"720896":[0.17955806499999999,0.24545206],"800":[6.9858999999999996e-05,7.1142394736842108e-05],"2621440":[1.1430726629999999,1.3249551739999998],"425984":[0.075877003999999998,0.09932075999999998],"32768":[0.0035370829999999999,0.0035682580000000004],"12058624":[8.3005631925000003,8.7600448330000003],"128":[1.0599730000000002e-05,1.080235e-05],"180224":[0.032052786,0.032667406999999996],"224":[1.8114189999999999e-05,1.8190150000000001e-05],"736":[9.2219629999999996e-05,9.6393163265306124e-05],"320":[3.1009529999999997e-05,3.3083999999999997e-05],"557056":[0.10621565600000001,0.15851589399999999],"832":[7.1019999999999994e-05,7.362635e-05],"9437184":[5.170475884,5.445997889],"3584":[0.00032735100000000003,0.00033313800000000008],"6291456":[4.657051279,4.7980758870000004],"256":[2.2179800000000001e-05,2.2801562499999999e-05],"15204352":[7.45990413,8.1596460215000004],"28672":[0.0028042690000000003,0.00303353],"768":[0.000103373,0.00011001715909090908],"212992":[0.028923957,0.03472843099999999],"864":[7.6620166666666669e-05,7.8113192307692302e-05],"352":[3.773e-05,4.2812989999999997e-05],"253952":[0.042870463000000004,0.043255292000000001],"960":[9.2259307692307694e-05,9.245415384615384e-05],"24576":[0.0037287870000000008,0.0038246529999999986],"7680":[0.00072997300000000019,0.0007768330000000001],"294912":[0.050378657,0.052924771999999995],"1048576":[0.28584662300000002,0.37813502799999998],"10485760":[6.047121111,6.1242223019999997],"344064":[0.06782970599999999,0.068270900000000009],"288":[2.5588558441558441e-05,2.7664859999999997e-05],"1152":[0.00011746799999999998,0.00012679800000000001],"384":[4.5858857142857146e-05,5.037706e-05],"2304":[0.00023569800000000003,0.00025086299999999999],"896":[7.9834569999999994e-05,8.2161430000000005e-05],"480":[4.2887633333333333e-05,4.3217999999999999e-05],"1441792":[0.55467105800000005,0.73951761100000002],"992":[9.2926270833333324e-05,9.6471333333333326e-05],"3968":[0.00039768099999999988,0.0004109615833333334],"6400":[0.00060445562500000027,0.000623801],"1344":[0.00016035433333333332,0.0001652891355932204],"126976":[0.017168795000000004,0.017246979499999999],"2883584":[1.493952234,1.6492025370000001],"753664":[0.20123383,0.25467630699999999],"16384":[0.0017623486000000004,0.0018690029999999999],"131072":[0.017995460499999998,0.018041091000000002],"458752":[0.078071373999999999,0.099846556000000003],"172032":[0.0287787875,0.030181184999999989],"12288":[0.0018189082000000002,0.002062253],"14680064":[7.1396286015000001,15.49451359],"1536":[0.00022109900000000005,0.000237173],"25600":[0.0024775764999999997,0.0025317760000000003],"1835008":[0.61795356349999997,0.74855464399999994],"10752":[0.0013303504285714289,0.0013377483333333333],"21504":[0.0027147220000000006,0.0027706579999999996],"7602176":[3.6994173259999998,3.7537432614999999],"5632":[0.00074223299999999991,0.00074970500000000003],"10":[6.1890999999999997e-07,6.6163999999999999e-07],"3145728":[1.9173533304999999,1.9651889085000001],"245760":[0.035160677000000008,0.036627672],"1728":[0.00016220044262295086,0.00016797599999999997],"11":[6.6540999999999997e-07,7.3236999999999999e-07],"1114112":[0.30001869399999997,0.40843561299999998],"12":[7.0803000000000002e-07,7.3104000000000001e-07],"7340032":[3.1339946869999999,3.553784217],"7168":[0.00070288100000000014,0.00074903600000000002],"13":[7.4483999999999999e-07,7.9400000000000004e-07],"6029312":[4.0244859780000004,4.0686082409999997],"14":[8.2331999999999994e-07,8.5524000000000003e-07],"3200":[0.00030561899999999992,0.00030735690000000004],"20":[1.78021e-06,1.9476300000000002e-06],"204800":[0.028006801000000005,0.028801582999999992],"15":[9.5206999999999997e-07,1.0345199999999999e-06],"13312":[0.0012890291428571429,0.0014304325000000001],"4980736":[2.4612885009999999,2.6329557559999999],"118784":[0.014975736,0.015141411],"51200":[0.0052999029999999999,0.0054934219999999995],"16":[1.51037e-06,1.5233099999999999e-06],"21":[1.87763e-06,2.1642100000000002e-06],"917504":[0.211199475,0.2921912585],"22":[2.0021799999999999e-06,2.2219599999999998e-06],"4864":[0.0005421540000000001,0.00057041999999999998],"17":[1.5293899999999999e-06,1.6152000000000002e-06],"14848":[0.0015668828333333337,0.001619613],"23":[2.1389800000000001e-06,2.2532400000000001e-06],"786432":[0.23554699600000001,0.31230299100000003],"18":[1.7527199999999999e-06,1.8262800000000001e-06],"1638400":[0.496776047,0.59800822599999992],"7864320":[3.7606728540000001,3.9296139244999999],"24":[2.3050999999999997e-06,2.4349600000000001e-06],"14155776":[6.7600480239999996,7.4576525939999998],"19":[1.69173e-06,1.9146899999999998e-06],"30":[2.3918999999999999e-06,2.4812000000000001e-06],"25":[2.0838100000000001e-06,2.1345999999999999e-06],"31":[2.4349799999999999e-06,2.5726600000000001e-06],"1280":[0.00014364180882352946,0.00014523700000000002],"26":[2.19004e-06,2.38779e-06],"3932160":[1.701434852,1.7532722629999999],"2432":[0.00028108234285714284,0.00028162599999999999],"32":[2.6483000000000001e-06,2.8112400000000001e-06],"27":[2.2167599999999998e-06,2.2567200000000001e-06],"409600":[0.065716632000000011,0.085449748500000006]}},{"title":"OrderedSet symmetricDifference with Self (75% overlap)","results":{"28":[1.35979e-06,1.3991000000000001e-06],"34":[2.2057299999999999e-06,2.36665e-06],"29":[1.3982499999999999e-06,1.4279299999999999e-06],"40":[2.8558099999999997e-06,2.9160900000000001e-06],"17408":[0.001439776,0.00149044],"1472":[0.00013940514285714286,0.00015372199999999999],"112":[6.7695199999999999e-06,6.81471e-06],"1376256":[0.41654839249999998,0.60538040000000004],"5242880":[2.2599104099999998,2.347119256],"36":[2.5037799999999999e-06,2.6435599999999997e-06],"42":[2.8209899999999999e-06,3.2149899999999999e-06],"11534336":[5.9411406485000002,6.1172874979999996],"114688":[0.011150881,0.011686218],"144":[9.4069699999999995e-06,1.0314230000000001e-05],"38":[2.4834299999999998e-06,2.6089100000000004e-06],"240":[1.579785e-05,1.5823889999999999e-05],"9216":[0.00075288199999999986,0.00078763508333333336],"44":[3.2051800000000001e-06,3.24295e-06],"1664":[0.00011490913157894737,0.000117119],"196608":[0.030200156999999998,0.034289038500000001],"155648":[0.019196015,0.019626724000000002],"2816":[0.00027319588571428577,0.00027615182857142862],"50":[3.0579700000000002e-06,3.3750599999999998e-06],"2359296":[0.78600470599999994,0.84086272100000004],"46":[3.3384199999999998e-06,3.5317800000000001e-06],"176":[1.2984550000000001e-05,1.3274780000000001e-05],"52":[3.1993800000000001e-06,3.2588099999999999e-06],"272":[1.7326999999999999e-05,1.9255010000000002e-05],"116":[6.9320099999999997e-06,7.8019374999999999e-06],"47104":[0.0049249210000000005,0.0051010259999999998],"6912":[0.00050227688888888878,0.00052132436842105266],"1856":[0.00012700799999999999,0.00014101899999999999],"48":[3.53925e-06,3.7227099999999998e-06],"2097152":[0.66951359200000005,0.72337839400000004],"54":[3.17512e-06,3.3962899999999997e-06],"2031616":[0.61151586950000003,0.7055415545],"43008":[0.0042061594999999998,0.0043784745],"60":[3.8103199999999999e-06,3.8915899999999994e-06],"30720":[0.0024590699999999998,0.002460664],"56":[3.5028199999999999e-06,3.6426299999999996e-06],"62":[3.9153000000000004e-06,4.0218899999999997e-06],"58":[3.4550999999999998e-06,3.6259299999999999e-06],"3014656":[1.456837342,1.5384947805],"64":[4.0686100000000002e-06,4.2610000000000004e-06],"8388608":[3.569479082,3.8105712359999999],"29696":[0.0023194539999999999,0.0023387885000000002],"216":[1.2863863636363637e-05,1.3651111111111111e-05],"106496":[0.010233234499999999,0.010848422999999999],"72":[4.7020500000000002e-06,4.73974e-06],"442368":[0.05969376500000001,0.071518810999999988],"147456":[0.017950762000000002,0.018063552],"4456448":[1.760132883,1.9179252645],"63488":[0.0055043319999999989,0.0061885800000000008],"38912":[0.003504774,0.0037044060000000004],"68":[4.2257500000000002e-06,4.6566100000000003e-06],"188416":[0.027577287499999992,0.031009454999999998],"248":[1.5328181818181817e-05,1.6800519999999876e-05],"80":[5.4089500000000001e-06,6.2154900000000002e-06],"2560":[0.00021567399999999998,0.00023146899999999999],"34816":[0.002939519666666667,0.003006664],"3712":[0.00027414299999999997,0.00028049252941176478],"3538944":[1.272373467,1.3941968014999999],"76":[5.02857e-06,5.5283999999999994e-06],"4194304":[1.5545250895,1.6638493560000001],"851968":[0.16242017349999999,0.25256634700000002],"4096":[0.00031500999999999995,0.00034399285185185191],"59392":[0.0051875510000000003,0.005306853000000002],"84":[5.7345300000000003e-06,5.9550599999999997e-06],"3276800":[1.0387083319999999,1.1072993335000001],"55296":[0.0046460799999999995,0.0050413390000000006],"688128":[0.13631144100000001,0.189900707],"8192":[0.00067120128571428574,0.00067359600000000037],"10240":[0.0009311812222222224,0.0010150964444444444],"15872":[0.001255721,0.0012839050000000001],"92":[6.7429199999999991e-06,7.3044799999999996e-06],"26624":[0.0020206054999999997,0.002053198],"1792":[0.00012872200000000001,0.000129426],"11776":[0.001195061125,0.0012623582857142859],"2944":[0.00027924800000000001,0.00028179300000000002],"88":[6.2438399999999997e-06,6.6514099999999994e-06],"22528":[0.0022577922500000001,0.0022819250000000002],"1245184":[0.34576992200000001,0.46146185950000002],"15728640":[7.2911432610000002,7.3568400580000004],"96":[6.9585299999999999e-06,7.4392400000000001e-06],"1984":[0.00014180799999999999,0.000146057],"139264":[0.016124414,0.01744735],"475136":[0.076250498999999999,0.094151179000000015],"13631488":[5.1850128099999999,6.2291070160000004],"416":[2.5527560000000003e-05,2.6404219999999998e-05],"928":[6.317130357142857e-05,6.8290086956521734e-05],"512":[3.6189439393939394e-05,3.6760188405797101e-05],"18432":[0.00152976,0.001604393],"16777216":[7.9107546839999996],"9728":[0.00083752570000000001,0.00090103999999999998],"1769472":[0.47582608999999998,0.5660044555],"1703936":[0.51200625,0.53516375849999998],"2048":[0.00015693712499999999,0.0001572814],"14336":[0.0010898783333333332,0.0011139309999999999],"448":[2.8343e-05,2.8521879999999997e-05],"5505024":[2.6179858820000002,2.6563024999999998],"544":[3.6001999999999999e-05,3.8561820000000002e-05],"221184":[0.024052351499999992,0.029503599999999998],"90112":[0.010130636,0.010653929000000003],"640":[5.090170731707317e-05,5.313521e-05],"12800":[0.00092444100000000002,0.0010066862222222219],"262144":[0.033490521000000002,0.034520719999999998],"589824":[0.106815772,0.1429465355],"884736":[0.20280479700000001,0.27071649949999999],"6144":[0.00061830500000000009,0.00065634800000000017],"1088":[8.2226839999999986e-05,8.3210169999999996e-05],"576":[4.2924039999999994e-05,4.7136999999999999e-05],"160":[1.0796500000000001e-05,1.240061e-05],"672":[5.3145e-05,5.5690310000000005e-05],"8912896":[3.73044055,3.8661022630000001],"100":[5.9263600000000003e-06,6.2851799999999999e-06],"507904":[0.078833268000000012,0.10706549899999999],"3840":[0.000288289,0.00028855499999999996],"192":[1.6586e-05,1.737841e-05],"376832":[0.062288276500000017,0.064525420999999999],"98304":[0.013026883,0.0150309715],"5376":[0.00049397725000000002,0.00050298900000000002],"94208":[0.011554591499999999,0.012365131999999997],"81920":[0.008223407999999998,0.0086580600000000039],"3407872":[1.2263833984999999,1.346513673],"104":[6.2340900000000003e-06,6.3094599999999992e-06],"122880":[0.012986067,0.012988817],"200":[1.2408790000000002e-05,1.2464769999999999e-05],"163840":[0.021222604999999999,0.021771047999999998],"4063232":[1.3795458229999999,1.52115029],"5767168":[2.8572546755000001,2.9618198725],"12582912":[7.2886240369999999,17.904250805],"1600":[0.0001062605,0.00011072466666666666],"136":[8.5870600000000001e-06,9.4401499999999997e-06],"232":[1.4429230000000001e-05,1.5470636363636363e-05],"7077888":[2.8522322225000001,3.0706321499999998],"86016":[0.0091766920000000002,0.010011865999999999],"31744":[0.0025342853333333339,0.0026357120000000001],"168":[1.1690590000000001e-05,1.255675e-05],"622592":[0.10326618500000001,0.15960461200000001],"108":[6.3666299999999997e-06,6.6579199999999999e-06],"327680":[0.045540320000000002,0.048457138000000004],"2176":[0.000169345,0.00018345775],"3328":[0.00024525399999999998,0.000249425],"1":[1.7518000000000001e-07,1.7596e-07],"2":[2.1106000000000001e-07,2.1605999999999999e-07],"3":[2.4760999999999998e-07,2.5091999999999997e-07],"4":[3.5908000000000001e-07,3.6121999999999995e-07],"7424":[0.00056908205882352943,0.000588504],"5":[3.9371e-07,4.0256000000000003e-07],"23552":[0.0025002690000000003,0.0025826926666666673],"6":[4.3884000000000003e-07,4.3893999999999999e-07],"61440":[0.005393244000000001,0.0054461759999999988],"491520":[0.079770601999999996,0.122711656],"77824":[0.0077001919999999989,0.0078942219999999994],"7":[4.6526999999999998e-07,4.9208e-07],"8":[5.1477000000000005e-07,5.3481000000000001e-07],"208":[1.234985e-05,1.305937e-05],"9":[5.5703999999999996e-07,5.6511000000000006e-07],"73728":[0.0070843330000000008,0.0077074199999999995],"304":[2.187713e-05,2.2699460000000002e-05],"400":[2.4650777777777777e-05,2.5230769230769232e-05],"1310720":[0.35983572000000003,0.49715014950000003],"336":[2.5303539999999999e-05,2.9660429999999997e-05],"3670016":[1.2996681475,1.3838572014999999],"6656":[0.00046136700000000012,0.00050833699999999998],"15360":[0.001163037,0.0012182429999999999],"432":[2.76415e-05,2.9584999999999999e-05],"950272":[0.18601467699999999,0.28955944649999998],"655360":[0.11734971399999999,0.18905849999999999],"69632":[0.0063687630000000021,0.0066466709999999998],"11264":[0.001066801,0.0010789770000000001],"2752512":[1.1216040155,1.226846334],"8126464":[3.3185166480000001,3.5239347959999998],"27648":[0.0021788642499999998,0.0021794097500000002],"368":[3.1565339999999997e-05,3.3925869999999998e-05],"65536":[0.005960435,0.0065602540000000015],"16252928":[7.3106804859999999,7.4788436674999996],"464":[2.8447000000000001e-05,3.0497999999999998e-05],"1015808":[0.24458684999999999,0.28209484200000001],"3072":[0.000317354,0.000321255],"110592":[0.0105900435,0.0121045605],"237568":[0.027382686,0.030786569],"278528":[0.035453489999999983,0.044991117499999997],"496":[3.2850968749999997e-05,3.2859810000000001e-05],"13107200":[5.2457708099999998,5.7974935749999998],"9961472":[4.931250597,5.2068886164999997],"5888":[0.00059070300000000004,0.00059213256249999991],"11010048":[5.3367031814999999,5.7934203445000003],"1920":[0.000137494,0.00014344600000000004],"2490368":[0.93455227299999999,0.98316834799999997],"19456":[0.0016943189999999997,0.0017720205999999989],"57344":[0.0048180419999999989,0.0049243299999999993],"1179648":[0.31190593999999999,0.42652688900000002],"4718592":[1.9807141545,1.9851716075000001],"360448":[0.058752069000000004,0.064799829000000003],"1572864":[0.63069822850000001,0.82904054049999998],"53248":[0.0043709704999999998,0.0045919385],"3456":[0.00024941500000000001,0.0002802997142857142],"40960":[0.0037655449999999995,0.0039031490000000003],"4608":[0.00035924999999999998,0.00039419675999999998],"13824":[0.0010484953333333336,0.001110074],"819200":[0.154470578,0.2224572105],"983040":[0.21874893749999999,0.30204437550000002],"8704":[0.00069708899999999991,0.00070266600000000012],"120":[7.4789999999999999e-06,7.7179100000000001e-06],"1024":[7.4474479999999999e-05,7.9728249999999997e-05],"49152":[0.0054648229999999997,0.0057740559999999996],"524288":[0.077063492999999997,0.12546349849999999],"45056":[0.0045217750000000004,0.004774749],"229376":[0.028167194,0.028674677000000003],"2688":[0.00022661799999999999,0.00024782999999999999],"152":[1.01263e-05,1.023505e-05],"5120":[0.00044823919999999998,0.00048519355000000146],"1507328":[0.47423818299999998,0.71890721199999996],"1216":[9.8046390000000003e-05,9.9282000000000003e-05],"1966080":[0.53293007700000006,0.614613454],"1900544":[0.55138026750000002,0.62665780000000004],"184":[1.397683e-05,1.5596069999999999e-05],"7936":[0.00059124500000000001,0.00063705299999999962],"3801088":[1.432481686,1.480803544],"6815744":[2.750359811,3.0591364099999998],"124":[7.4209099999999994e-06,8.2978571428571427e-06],"102400":[0.0095747530000000018,0.011276258499999999],"311296":[0.043329970999999988,0.048457612500000011],"1408":[0.000127949,0.00013250771014492753],"393216":[0.072855370999999988,0.082426666999999981],"4352":[0.00032830100000000008,0.00035680933333333324],"6553600":[2.5921834640000001,2.9834424154999999],"20480":[0.001890907,0.0019685800000000002],"608":[4.5797679999999996e-05,4.8054150000000001e-05],"2228224":[0.732647092,0.75940072999999997],"36864":[0.0031330499999999996,0.0032973640000000005],"704":[5.7681333333333333e-05,6.124585714285714e-05],"720896":[0.16360535850000002,0.22433589949999999],"800":[5.3071739999999998e-05,5.5738410000000002e-05],"2621440":[0.99182834399999997,1.128126199],"425984":[0.066913393999999987,0.085840425999999997],"32768":[0.002683899,0.0027602916666666665],"12058624":[6.6751224550000003,7.0572317189999998],"128":[7.9503099999999998e-06,8.6356400000000002e-06],"180224":[0.024673622999999999,0.026143957000000002],"224":[1.4118530000000001e-05,1.439619e-05],"736":[6.4935936170212776e-05,6.9727540000000002e-05],"320":[2.2064388888888889e-05,2.5202500000000001e-05],"557056":[0.086604843500000001,0.132352795],"832":[5.3316000000000002e-05,5.8580189999999998e-05],"9437184":[4.362618136,4.7920994854999996],"3584":[0.00026072400000000005,0.00026518499999999998],"6291456":[3.6350468450000002,3.6757843870000002],"256":[1.6814960000000001e-05,1.7390299999999998e-05],"15204352":[7.0130451960000002,7.3158831079999995],"28672":[0.00217141975,0.0023166439999999996],"768":[7.4681240000000002e-05,7.7434309999999999e-05],"212992":[0.023331935000000005,0.027818900000000001],"864":[5.6391499999999997e-05,5.7666657534246574e-05],"352":[2.8011e-05,2.9457869999999999e-05],"253952":[0.034318592500000002,0.0348598845],"960":[6.822706e-05,7.0305769230769236e-05],"24576":[0.0027429049999999995,0.0028021719999999995],"7680":[0.00057700900000000007,0.00060687299999999996],"294912":[0.037865704,0.044999986999999998],"1048576":[0.22857429300000001,0.32929430650000002],"10485760":[4.9094434419999997,5.3101929339999998],"344064":[0.053640028000000006,0.060789430999999991],"288":[1.9188999999999999e-05,2.075120588235294e-05],"1152":[8.6697649999999991e-05,9.3912499999999999e-05],"384":[3.2592724999999999e-05,3.4618340000000003e-05],"2304":[0.00017927699999999998,0.00019772099999999996],"896":[5.7933999999999998e-05,6.2544823529411768e-05],"480":[3.2008619999999998e-05,3.3248389999999998e-05],"1441792":[0.48337485800000002,0.65764489500000001],"992":[6.9300558139534892e-05,7.2275205882352936e-05],"3968":[0.00030100500000000002,0.00031721699999999995],"6400":[0.00046144300000000007,0.0004786800000000001],"1344":[0.000112322,0.00011774585000000001],"126976":[0.013664764499999999,0.013942988],"2883584":[1.2362695340000001,1.3901013375],"753664":[0.16330756199999999,0.21798184100000001],"16384":[0.001315742,0.0013820018333333332],"131072":[0.014055579,0.014071533000000002],"458752":[0.070242969500000002,0.090833760999999985],"172032":[0.022909345500000004,0.024437153],"12288":[0.0013385560000000001,0.001469988],"14680064":[6.3620553309999996,13.961559283],"1536":[0.00015110300000000003,0.00015642887931034479],"25600":[0.0019582309999999999,0.00201726475],"1835008":[0.57835645000000002,0.58368810599999998],"10752":[0.001002572,0.001054003],"21504":[0.0020528489999999998,0.0020637800000000003],"7602176":[3.0253345899999999,3.2105051599999999],"5632":[0.00054568599999999987,0.00056808500000000007],"10":[5.8775999999999996e-07,7.1007000000000011e-07],"3145728":[1.5163801335,1.5682079799999999],"245760":[0.0301858575,0.03203776400000001],"1728":[0.00012098784210526315,0.00013175399999999999],"11":[6.3371000000000003e-07,6.5277999999999989e-07],"1114112":[0.248372751,0.38697270100000003],"12":[6.8592999999999995e-07,6.9210000000000001e-07],"7340032":[2.9456476149999999,3.2004990929999999],"7168":[0.00054314499999999998,0.00055976300000000001],"13":[7.1703000000000006e-07,7.3827999999999996e-07],"6029312":[3.1590490695,3.2769457659999999],"14":[7.7031000000000002e-07,7.9192000000000001e-07],"3200":[0.000223926,0.00023568999999999999],"20":[1.0280899999999999e-06,1.226e-06],"204800":[0.023616210000000006,0.024872974500000006],"15":[9.1633333333333332e-07,9.7738000000000003e-07],"13312":[0.00097032900000000003,0.0010386310000000001],"4980736":[2.0675860909999999,2.308544522],"118784":[0.012361999,0.012840529999999999],"51200":[0.0040842669999999999,0.0042506599999999999],"16":[8.5290999999999998e-07,9.3480000000000003e-07],"21":[1.14245e-06,1.32839e-06],"917504":[0.179582671,0.26631427699999999],"22":[1.19039e-06,1.29459e-06],"4864":[0.00041235916666666674,0.00042514400000000002],"17":[8.9791999999999993e-07,1.0287800000000001e-06],"14848":[0.001185312,0.0011920567142857141],"23":[1.24471e-06,1.2778099999999999e-06],"786432":[0.18581459600000005,0.239952373],"18":[1.02178e-06,1.0485200000000001e-06],"1638400":[0.43199494399999999,0.50713060200000004],"7864320":[3.3510146175000002,3.3935242175],"24":[1.4567200000000001e-06,1.4749399999999999e-06],"14155776":[6.0156740659999999,6.8927129159999998],"19":[9.7064999999999997e-07,1.1237599999999999e-06],"30":[1.4394200000000001e-06,1.4952000000000001e-06],"25":[1.1877399999999999e-06,1.2196000000000001e-06],"31":[1.52358e-06,1.5306499999999999e-06],"1280":[0.00010710429670329668,0.00010749259999999999],"26":[1.2587199999999998e-06,1.2646700000000002e-06],"3932160":[1.361061801,1.523545755],"2432":[0.00020810833333333327,0.00021698575000000001],"32":[2.0714299999999997e-06,2.0771999999999998e-06],"27":[1.33531e-06,1.3724705882352941e-06],"409600":[0.061376392999999994,0.063956511999999979]}},{"title":"OrderedSet symmetricDifference with Self (100% overlap)","results":{"28":[1.26125e-06,1.2718699999999999e-06],"34":[1.4600600000000002e-06,1.5444090909090907e-06],"29":[1.25426e-06,1.29508e-06],"40":[1.8498799999999999e-06,1.8910599999999999e-06],"17408":[0.0010211186666666666,0.0011325366250000001],"1472":[8.9413999999999995e-05,9.3508333333333334e-05],"112":[4.6054500000000001e-06,4.6575599999999998e-06],"1376256":[0.395589413,0.51684525349999999],"5242880":[2.0352769560000001,2.1096463490000001],"36":[1.58779e-06,1.7508399999999999e-06],"42":[1.88507e-06,2.0682899999999999e-06],"11534336":[4.7767618269999996,5.0337763339999997],"114688":[0.0086460749999999996,0.0090139120000000024],"144":[6.4513399999999998e-06,6.8316099999999998e-06],"38":[1.68635e-06,1.7371311475409837e-06],"240":[1.070699e-05,1.085747e-05],"9216":[0.0005573300000000002,0.00056926700000000015],"44":[1.98084e-06,2.1020399999999998e-06],"1664":[7.4448000000000003e-05,7.9772599999999996e-05],"196608":[0.02268916,0.025243975499999998],"155648":[0.014748121499999999,0.014810117999999997],"2816":[0.00017070800000000002,0.00017511933333333335],"50":[2.0905500000000003e-06,2.31786e-06],"2359296":[0.68378134200000007,0.79288767250000003],"46":[2.07928e-06,2.1822099999999999e-06],"176":[8.5933499999999996e-06,8.7913300000000004e-06],"52":[2.21623e-06,2.22947e-06],"272":[1.267571e-05,1.3400389999999999e-05],"116":[4.9152400000000002e-06,5.4143333333333334e-06],"47104":[0.0034537090000000001,0.0034960429999999999],"6912":[0.00035648900000000004,0.00035774300000000005],"1856":[9.0111999999999994e-05,9.3790833333333337e-05],"48":[2.2493100000000001e-06,2.3992400000000001e-06],"2097152":[0.66668369299999997,0.84674826300000006],"54":[2.23674e-06,2.31384e-06],"2031616":[0.68913706900000005,0.69401779900000005],"43008":[0.0029198829999999999,0.0030866380000000001],"60":[2.5737600000000004e-06,2.6049700000000001e-06],"30720":[0.0016861460000000001,0.001717152],"56":[2.3811076923076922e-06,2.4269399999999998e-06],"62":[2.77199e-06,2.8027400000000001e-06],"58":[2.4335300000000001e-06,2.5244699999999997e-06],"3014656":[1.2320516880000001,1.2554671980000001],"64":[2.77136e-06,2.9295500000000002e-06],"8388608":[3.195015926,3.2696585040000001],"29696":[0.001671748,0.0016910387999999991],"216":[9.1356666666666662e-06,9.5259900000000009e-06],"106496":[0.0078258290000000029,0.0094167219999999989],"72":[3.2696500000000001e-06,3.3181699999999999e-06],"442368":[0.048693252000000006,0.065187469500000012],"147456":[0.013386841,0.014477433],"4456448":[1.659834944,1.6722708589999999],"63488":[0.0040875,0.0049437450000000003],"38912":[0.00252702,0.0026871836666666669],"68":[2.9457e-06,3.2598000000000001e-06],"188416":[0.021820837000000003,0.022213347500000001],"248":[1.1077000000000001e-05,1.1749999999999999e-05],"80":[3.55315e-06,3.8161100000000005e-06],"2560":[0.00014681700000000001,0.00015949000000000003],"34816":[0.0020530572500000004,0.0021118220000000002],"3712":[0.000183248,0.000185785],"3538944":[1.077687241,1.31655648],"76":[3.3845200000000001e-06,3.64637e-06],"4194304":[1.6350031189999998,1.781045864],"851968":[0.15002194250000001,0.22353092999999999],"4096":[0.00021244999999999996,0.00023151359999999996],"59392":[0.003839407,0.0041113440000000012],"84":[3.8530599999999993e-06,3.9605700000000003e-06],"3276800":[0.97204755700000001,1.0820646355000001],"55296":[0.0033664139999999994,0.0036677709999999994],"688128":[0.100377334,0.164619666],"8192":[0.00045437500000000008,0.00047349699999999997],"10240":[0.00065068900000000009,0.00072913599999999991],"15872":[0.00088181199999999983,0.00091870499999999991],"92":[4.47732e-06,5.4089800000000005e-06],"26624":[0.0013929259999999998,0.0014792941666666669],"1792":[8.5733571428571427e-05,8.9292500000000006e-05],"11776":[0.00080159172727272722,0.00085450100000000002],"2944":[0.00019273400000000002,0.00019748767346938772],"88":[4.5392000000000005e-06,4.6291600000000002e-06],"22528":[0.001516269,0.001598262],"1245184":[0.29240134400000001,0.36673953999999997],"15728640":[6.012364593,6.3062060515000002],"96":[4.6068999999999999e-06,4.94954e-06],"1984":[9.8945999999999998e-05,0.000102942],"139264":[0.012986013000000001,0.015138242999999999],"475136":[0.066571582000000018,0.086651893000000008],"13631488":[5.4542358589999997,5.6516719330000003],"416":[1.873487e-05,1.9298200000000001e-05],"928":[4.4246460000000001e-05,4.5525349999999999e-05],"512":[2.3220333333333332e-05,2.537137e-05],"18432":[0.001115871875,0.0011681817500000002],"16777216":[6.6883290310000003],"9728":[0.00058299299999999997,0.00060213131250000027],"1769472":[0.48025505800000001,0.49307587000000003],"1703936":[0.43157654000000001,0.45814819499999998],"2048":[0.00010452886419753089,0.00010542714285714287],"14336":[0.00077091000000000008,0.00083997063636363637],"448":[1.9823909999999999e-05,2.0281000000000001e-05],"5505024":[2.0116138609999998,2.1783375810000001],"544":[2.6582000000000001e-05,2.7320850000000001e-05],"221184":[0.019846946000000032,0.025906333],"90112":[0.007463431999999999,0.0080126480000000024],"640":[3.4353909999999997e-05,3.5058999999999998e-05],"12800":[0.00064990399999999998,0.00065640900000000038],"262144":[0.026763685999999998,0.027374317000000002],"589824":[0.092703486000000029,0.13546732249999999],"884736":[0.2016246055,0.273676849],"6144":[0.000458302,0.00045856200000000003],"1088":[5.5198999999999998e-05,5.7154999999999997e-05],"576":[2.7117499999999999e-05,3.277e-05],"160":[7.0602631578947371e-06,8.2840700000000005e-06],"672":[3.7154209999999998e-05,3.8550999999999997e-05],"8912896":[3.4024904970000001,3.6485333849999999],"100":[4.0686500000000004e-06,4.14495e-06],"507904":[0.058638403999999998,0.13930422100000001],"3840":[0.000203179,0.00021302700000000002],"192":[1.0724140000000001e-05,1.1057750000000001e-05],"376832":[0.047740872000000004,0.050414663999999998],"98304":[0.0089947239999999991,0.010093333499999999],"5376":[0.00033932799999999996,0.00034453699999999996],"94208":[0.0081977659999999987,0.0087147830000000003],"81920":[0.0061837119999999992,0.006311962],"3407872":[1.004684294,1.016545963],"104":[4.2150600000000003e-06,4.3279300000000001e-06],"122880":[0.010128375,0.010367336500000001],"200":[8.8139399999999998e-06,8.8931899999999991e-06],"163840":[0.0172413355,0.017629599500000002],"4063232":[1.4663987734999999,1.4789288490000001],"5767168":[2.4316144665000001,2.4754511524999998],"12582912":[5.9609020475000003,9.8664667280000007],"1600":[7.0884999999999996e-05,7.6378407407407404e-05],"136":[5.9163399999999998e-06,6.4440799999999993e-06],"232":[9.9378461538461546e-06,1.032655e-05],"7077888":[2.5308749105000001,2.713091216],"86016":[0.0067419649999999982,0.0069169240000000022],"31744":[0.0017956139999999992,0.001874005],"168":[7.6634545454545451e-06,8.8010699999999991e-06],"622592":[0.100064245,0.13076157099999999],"108":[4.408e-06,4.5395100000000002e-06],"327680":[0.035942373,0.038717151000000005],"2176":[0.00011134800000000001,0.0001148165],"3328":[0.00016704099999999999,0.00017017400000000001],"1":[1.7545e-07,1.7559e-07],"2":[2.1243999999999999e-07,2.2575999999999998e-07],"3":[2.4658999999999999e-07,2.5095000000000001e-07],"4":[2.8209000000000001e-07,2.8335000000000001e-07],"7424":[0.00039043200000000002,0.00041441600000000002],"5":[3.1794e-07,3.2784999999999996e-07],"23552":[0.0017127784,0.001871052],"6":[3.5438000000000003e-07,3.6313000000000005e-07],"61440":[0.003994788,0.0040796829999999997],"491520":[0.070729101500000002,0.106645514],"77824":[0.0057251009999999989,0.0080135899999999993],"7":[3.9661e-07,4.1262e-07],"8":[4.3201000000000002e-07,5.0207000000000005e-07],"208":[8.6174300000000003e-06,8.9636500000000001e-06],"9":[4.7238e-07,4.9072000000000004e-07],"73728":[0.0051932990000000002,0.0056111959999999997],"304":[1.4672750000000001e-05,1.5709000000000002e-05],"400":[1.7563590000000002e-05,1.8634639999999999e-05],"1310720":[0.36176683949999999,0.43384631600000001],"336":[1.7488629999999999e-05,1.9644469999999999e-05],"3670016":[1.214382801,1.2462206739999999],"6656":[0.00034094600000000007,0.000353233],"15360":[0.00084167681818181849,0.000915708],"432":[1.9574750000000001e-05,1.9723375e-05],"950272":[0.20975165400000001,0.26319159749999999],"655360":[0.104063394,0.15101275250000001],"69632":[0.0047232335,0.0048844690000000007],"11264":[0.00074820700000000008,0.00080301500000000002],"2752512":[0.95502714,1.0386281045000001],"8126464":[2.932412722,3.1481591254999999],"27648":[0.0015206693333333335,0.0015616363333333333],"368":[2.0291520000000002e-05,2.0734921875000001e-05],"65536":[0.004412745,0.0049646229999999996],"16252928":[6.3982217969999997,6.8523927809999998],"464":[2.1257550000000001e-05,2.1668612244897958e-05],"1015808":[0.23181238749999999,0.28012758100000001],"3072":[0.000205756,0.00021108000000000005],"110592":[0.008244735999999999,0.0091356960000000004],"237568":[0.022035746499999998,0.023561415999999998],"278528":[0.032231919000000012,0.03281394449999999],"496":[2.2954740000000002e-05,2.2983730000000204e-05],"13107200":[5.0765490370000004,5.4068400729999997],"9961472":[4.0239063310000001,4.2787223425000001],"5888":[0.00040170899999999999,0.000414986],"11010048":[4.2634447099999999,4.8114898110000004],"1920":[9.4140269999999995e-05,9.5333428571428566e-05],"2490368":[0.76930683200000005,0.82463615800000001],"19456":[0.001234871,0.0012553200000000001],"57344":[0.0034984219999999997,0.003574168],"1179648":[0.29260363950000001,0.37511585400000003],"4718592":[1.627127598,1.898003602],"360448":[0.047960583000000001,0.05452860100000001],"1572864":[0.47799112700000002,0.54750736099999997],"53248":[0.0030630913333333331,0.0033356240000000001],"3456":[0.00016845,0.00019939599999999999],"40960":[0.0027513120000000001,0.0029901039999999999],"4608":[0.00026761299999999999,0.00027349654545454538],"13824":[0.00070555699999999999,0.00076628600000000003],"819200":[0.13523072999999999,0.18859031300000001],"983040":[0.17792451500000001,0.30048998700000001],"8704":[0.00047041299999999998,0.00051885699999999996],"120":[5.3507000000000003e-06,6.1539600000000005e-06],"1024":[5.0608340000000004e-05,5.2341710000000001e-05],"49152":[0.0039069650000000001,0.0039338159999999997],"524288":[0.06379760399999998,0.11030699200000001],"45056":[0.0031391179999999998,0.003380993499999986],"229376":[0.023176386,0.025860642],"2688":[0.0001617418524590164,0.00018565199999999996],"152":[6.707394366197183e-06,7.2382200000000001e-06],"5120":[0.00029958800000000005,0.00033510899999999999],"1507328":[0.44105404799999998,0.61001832099999997],"1216":[6.4682000000000002e-05,6.4919926829268301e-05],"1966080":[0.52818114000000005,0.58817614699999998],"1900544":[0.57082925800000006,0.63932059000000008],"184":[8.9157300000000004e-06,9.6939300000000009e-06],"7936":[0.00042866900000000001,0.00045221300000000003],"3801088":[1.1886145130000001,1.3472330575],"6815744":[2.4344922200000001,2.7714979209999999],"124":[5.3826299999999995e-06,5.8347999999999996e-06],"102400":[0.0072931940000000011,0.0083250519999999995],"311296":[0.033556582000000008,0.035195485999999991],"1408":[8.4620800000000001e-05,8.481514285714287e-05],"393216":[0.057040884,0.058676838999999995],"4352":[0.00025016400000000004,0.00026079084210526318],"6553600":[2.298871186,2.5883089305000002],"20480":[0.0013196274285714289,0.0013634778571428572],"608":[3.0830430000000004e-05,3.2257400000000001e-05],"2228224":[0.75452422399999997,0.81315632699999996],"36864":[0.0022764170000000002,0.002386048],"704":[3.9588389999999995e-05,4.1537049999999996e-05],"720896":[0.13402771899999999,0.24201964200000001],"800":[3.5999389999999999e-05,3.6212689999999999e-05],"2621440":[0.85603593499999997,0.9428361515],"425984":[0.056987392999999997,0.092725609000000001],"32768":[0.0019101993999999997,0.001987436],"12058624":[5.3029273119999996,5.6996623279999996],"128":[5.6833700000000001e-06,5.7212400000000006e-06],"180224":[0.018979190999999999,0.0206476635],"224":[9.9481099999999995e-06,1.069715e-05],"736":[4.26656e-05,4.5687569999999997e-05],"320":[1.6074730000000003e-05,1.6755050000000001e-05],"557056":[0.070372687000000017,0.1248018555],"832":[3.7298000000000001e-05,3.7778760000000002e-05],"9437184":[3.7697702629999998,4.3442135119999996],"3584":[0.000176532,0.00018419400000000002],"6291456":[2.7089486369999998,2.8711852919999998],"256":[1.1328000000000001e-05,1.229442e-05],"15204352":[5.8823111629999998,6.3505600720000004],"28672":[0.0015605603333333335,0.0016317172],"768":[4.5512285714285714e-05,4.6095250000000002e-05],"212992":[0.018446495,0.019846782],"864":[3.9318479999999998e-05,4.1823509999999998e-05],"352":[1.8413000000000001e-05,1.9982020000000001e-05],"253952":[0.027128912999999998,0.0274468465],"960":[4.7411629999999994e-05,4.7734290000000001e-05],"24576":[0.001816436,0.0018175941999999997],"7680":[0.000412142,0.00041722431818181819],"294912":[0.032307797999999999,0.037674736],"1048576":[0.25248364499999998,0.30579244999999999],"10485760":[4.1734923469999998,4.2862347644999996],"344064":[0.045541855999999985,0.048426751499999997],"288":[1.3582519999999999e-05,1.4547e-05],"1152":[5.8634600000000003e-05,6.0441209677419354e-05],"384":[2.1787360000000001e-05,2.2204820000000003e-05],"2304":[0.0001263545,0.00014031888059701497],"896":[4.0540487804878049e-05,4.360209e-05],"480":[2.0886e-05,2.2348160000000001e-05],"1441792":[0.38662379550000003,0.59069044999999998],"992":[4.6372380000000002e-05,4.9243065934065935e-05],"3968":[0.000212301,0.00022364100000000004],"6400":[0.00032381099999999997,0.00033712789655172419],"1344":[7.9808029999999994e-05,8.3196684210526311e-05],"126976":[0.010344404,0.011297869],"2883584":[1.189341518,1.1913184290000001],"753664":[0.13466294400000001,0.17209430249999999],"16384":[0.00095469140000000005,0.00096909322222222248],"131072":[0.010924657000000001,0.011349323999999997],"458752":[0.066468733000000002,0.075016368],"172032":[0.018293513500000001,0.019738584],"12288":[0.00090784769999999984,0.00099936399999999998],"14680064":[5.7590252739999999,13.69206956],"1536":[0.00010244266666666665,0.000103738],"25600":[0.0013391400000000002,0.0014361883333333333],"1835008":[0.47587903799999998,0.5411382575],"10752":[0.00070678984615384619,0.000739243],"21504":[0.001429521,0.0014741391666666668],"7602176":[2.873704214,2.8790255920000001],"5632":[0.00038063588461538468,0.00039162213043478266],"10":[5.1254000000000001e-07,5.7647000000000003e-07],"3145728":[1.218452565,1.2324991125],"245760":[0.026833454999999996,0.034287530500000017],"1728":[8.0647347826086959e-05,8.5230565656565664e-05],"11":[5.4583999999999997e-07,5.8307999999999995e-07],"1114112":[0.22022388600000001,0.36911321900000005],"12":[5.7676999999999994e-07,5.8984999999999995e-07],"7340032":[2.6955027349999998,2.8928304599999999],"7168":[0.0003564930000000001,0.00042890199999999994],"13":[6.3387e-07,6.4943999999999992e-07],"6029312":[2.6447073049999998,2.6765934279999999],"14":[6.6668000000000009e-07,6.9075999999999997e-07],"3200":[0.000150946,0.000166966],"20":[9.0131999999999997e-07,1.04102e-06],"204800":[0.018076412,0.020211319499999998],"15":[7.5797999999999996e-07,7.8010999999999991e-07],"13312":[0.0006958385714285714,0.00077259416666666683],"4980736":[1.834124087,1.9311636395],"118784":[0.0095149300000000013,0.010160523000000001],"51200":[0.0029933149999999999,0.0030574183333333337],"16":[8.1594000000000004e-07,8.3652999999999993e-07],"21":[9.5400999999999995e-07,1.0848899999999999e-06],"917504":[0.19508919399999999,0.25225082799999998],"22":[1.02024e-06,1.1898800000000001e-06],"4864":[0.000289621,0.00029999399999999999],"17":[7.9887000000000001e-07,8.8213000000000008e-07],"14848":[0.00082700700000000005,0.00085062000000000017],"23":[1.0858699999999999e-06,1.1815999999999998e-06],"786432":[0.15041391250000002,0.23957761450000001],"18":[8.7339999999999997e-07,9.1342999999999999e-07],"1638400":[0.407568394,0.41179985800000002],"7864320":[2.7081539315000001,2.939105767],"24":[1.1797599999999999e-06,1.2699021739130433e-06],"14155776":[5.0949750829999996,6.0768149339999997],"19":[8.6014999999999993e-07,9.3017999999999998e-07],"30":[1.3032099999999999e-06,1.3076900000000001e-06],"25":[1.10204e-06,1.1251400000000001e-06],"31":[1.3433699999999999e-06,1.3615900000000002e-06],"1280":[7.0135000000000005e-05,7.1845449999999992e-05],"26":[1.1387899999999999e-06,1.21032e-06],"3932160":[1.3285183140000001,1.501792606],"2432":[0.00012971899999999998,0.00015217685483870965],"32":[1.3666500000000001e-06,1.3725200000000001e-06],"27":[1.1761099999999999e-06,1.2507600000000001e-06],"409600":[0.044940543499999999,0.053781785999999998]}},{"title":"OrderedSet subtracting Self (0% overlap)","results":{"28":[6.2389000000000001e-07,6.9403000000000003e-07],"34":[8.4672999999999996e-07,9.1040999999999996e-07],"29":[6.9702000000000008e-07,7.4375000000000008e-07],"40":[1.0671300000000001e-06,1.8148200000000001e-06],"17408":[0.00063549000000000016,0.000670584],"1472":[7.2797090909090912e-05,8.1326e-05],"112":[2.3354999999999999e-06,2.4706199999999998e-06],"1376256":[0.207387292,0.29675220299999999],"5242880":[1.204446989,1.2371811369999999],"36":[9.9132999999999992e-07,1.0416699999999999e-06],"42":[1.0523300000000001e-06,1.6907500000000001e-06],"11534336":[3.5765686164999999,3.6695852480000002],"114688":[0.0042795960000000001,0.004443939],"144":[3.4751900000000003e-06,4.1812700000000005e-06],"38":[9.409899999999999e-07,1.18117e-06],"240":[5.2125599999999996e-06,5.9397900000000004e-06],"9216":[0.00035079499999999999,0.00037020130769230768],"44":[1.3210199999999998e-06,1.50088e-06],"1664":[4.2787409999999997e-05,4.4465000000000002e-05],"196608":[0.018833384500000001,0.019359612499999995],"155648":[0.0084446869999999993,0.0086490329999999761],"2816":[0.00014118882812500002,0.000147818],"50":[1.0358599999999999e-06,1.1419700000000001e-06],"2359296":[0.38308779500000001,0.38349785199999997],"46":[1.33834e-06,1.38664e-06],"176":[6.4883000000000002e-06,8.0231299999999999e-06],"52":[1.0978699999999999e-06,1.12052e-06],"272":[6.3500000000000002e-06,7.0676199999999996e-06],"116":[2.4487700000000002e-06,2.4765900000000003e-06],"47104":[0.0026272780000000011,0.0026609390000000002],"6912":[0.000195804,0.00021664900000000005],"1856":[4.8560999999999998e-05,5.1344999999999997e-05],"48":[1.6128499999999999e-06,2.2988299999999999e-06],"2097152":[0.29427106450000001,0.36746203900000002],"54":[1.08203e-06,1.21101e-06],"2031616":[0.276370801,0.27940254850000001],"43008":[0.00203504025,0.0020751540000000001],"60":[1.31745e-06,1.37978e-06],"30720":[0.001014486,0.0010224189999999997],"56":[1.2310599999999999e-06,1.2501900000000001e-06],"62":[1.37432e-06,1.6861099999999999e-06],"58":[1.2393300000000001e-06,1.3392300000000002e-06],"3014656":[0.88934168000000002,0.950619294],"64":[1.4833099999999999e-06,1.7621400000000001e-06],"8388608":[1.5590817530000001,1.594095678],"29696":[0.000920301,0.00095771530000000014],"216":[4.5890800000000001e-06,4.6130699999999995e-06],"106496":[0.0037807560000000006,0.004093513],"72":[1.88507e-06,1.9845100000000001e-06],"442368":[0.0208515375,0.022922325],"147456":[0.0073531659999999995,0.0075415690000000006],"4456448":[0.78548287699999997,0.80242978050000002],"63488":[0.0022551595000000002,0.00267454],"38912":[0.0015539710000000001,0.0016671520000000003],"68":[1.5129499999999998e-06,1.5628099999999999e-06],"188416":[0.015791511500000001,0.015988815],"248":[5.451e-06,5.8821899999999995e-06],"80":[2.0444599999999998e-06,2.6224300000000001e-06],"2560":[0.00010336654255319153,0.000118906],"34816":[0.0012368571428571433,0.0012672859999999998],"3712":[0.00011507586046511629,0.00011699807228915667],"3538944":[0.50608168099999995,0.52979819849999998],"76":[2.0988300000000001e-06,2.5471899999999997e-06],"4194304":[0.70435069750000001,0.76052676699999999],"851968":[0.056264496500000004,0.093036025500000036],"4096":[0.00013611420547945206,0.000141197],"59392":[0.00206857175,0.002391883],"84":[2.2658e-06,3.01215e-06],"3276800":[0.44139063700000003,0.45418407750000001],"55296":[0.0017648598000000008,0.0020584819999999999],"688128":[0.058799632999999997,0.092683404499999997],"8192":[0.00026628900000000001,0.000290671],"10240":[0.00042038500000000012,0.00050383136842105261],"15872":[0.00055716399999999997,0.00055924799999999993],"92":[3.5415300000000003e-06,4.8749300000000001e-06],"26624":[0.00078436816666666682,0.000842112],"1792":[4.8835000000000003e-05,5.1485450000000004e-05],"11776":[0.00065372899999999992,0.00066961199999999977],"2944":[0.00016255732142857144,0.00018519705660377354],"88":[3.2241300000000002e-06,3.6031000000000003e-06],"22528":[0.001225098,0.0012306860000000001],"1245184":[0.15478412949999998,0.21024592],"15728640":[2.8671926600000002,2.8933440070000001],"96":[4.36119e-06,5.6420399999999998e-06],"1984":[5.7704742857142853e-05,5.8930661290322584e-05],"139264":[0.0066081440000000007,0.0066556309999999995],"475136":[0.0233108975,0.033555215499999999],"13631488":[2.2184877324999999,2.2689672019999998],"416":[9.09708e-06,9.1257199999999994e-06],"928":[2.3156999999999999e-05,2.474711e-05],"512":[1.328381e-05,1.3983019999999999e-05],"18432":[0.00072253369230769221,0.00075874100000000006],"16777216":[3.2585005369999998],"9728":[0.00040125934782608694,0.00040661500000000004],"1769472":[0.20765900500000001,0.22601441950000001],"1703936":[0.19398686300000001,0.20686761399999998],"2048":[5.9759999999999997e-05,6.4030759999999994e-05],"14336":[0.00044052700000000002,0.00044649499999999999],"448":[9.6150599999999994e-06,1.0015329999999999e-05],"5505024":[1.4308597510000001,1.433615095],"544":[1.5074470000000001e-05,1.5446409999999999e-05],"221184":[0.0093815180000000001,0.009741745999999999],"90112":[0.0051433959999999997,0.0057028919999999993],"640":[2.1987059999999999e-05,2.3496250000000001e-05],"12800":[0.00035209900000000003,0.00036538499999999992],"262144":[0.013143575000000001,0.0133367195],"589824":[0.038671415000000001,0.059813121999999996],"884736":[0.062836612,0.102695153],"6144":[0.00038366252173913042,0.000423483],"1088":[3.325279e-05,3.4451730000000003e-05],"576":[1.7120000000000002e-05,1.7371e-05],"160":[4.3165699999999999e-06,6.0473300000000001e-06],"672":[2.4597399999999999e-05,2.5275240000000001e-05],"8912896":[1.7429095560000001,1.746090074],"100":[1.9838700000000002e-06,2.0032600000000001e-06],"507904":[0.026331291,0.040263990999999999],"3840":[0.000118403,0.00012581510000000002],"192":[1.0590079999999999e-05,1.076155e-05],"376832":[0.034905005500000016,0.036035449999999997],"98304":[0.0074835019999999986,0.0076331230000000012],"5376":[0.0002366643333333333,0.00025883162857142863],"94208":[0.0061473199999999995,0.0068736069999999995],"81920":[0.0038537965000000002,0.0038838969999999999],"3407872":[0.47330358,0.49335605000000005],"104":[2.0273099999999999e-06,2.23203e-06],"122880":[0.0051230750000000004,0.0051745620000000006],"200":[4.0421599999999998e-06,4.1544100000000003e-06],"163840":[0.0097482179999999995,0.0097618010000000005],"4063232":[0.66200551500000004,0.69437504799999994],"5767168":[1.6817226265,1.689733159],"12582912":[5.3081669099999997,6.6739094440000004],"1600":[3.8552e-05,3.9730000000000001e-05],"136":[3.1575100000000001e-06,3.5626700000000002e-06],"232":[4.8723900000000003e-06,5.0129655172413801e-06],"7077888":[1.1179173490000001,1.191122247],"86016":[0.0046620485,0.0046709119999999993],"31744":[0.0011054600000000002,0.001109726625],"168":[5.1906100000000006e-06,6.3436700000000004e-06],"622592":[0.043308257500000009,0.067331724999999981],"108":[2.1609099999999998e-06,2.2469800000000001e-06],"327680":[0.021513207000000003,0.023288771999999999],"2176":[7.1526999999999995e-05,7.2309000000000002e-05],"3328":[9.4136397959183668e-05,9.4250000000000001e-05],"1":[1.2901000000000002e-07,1.4149000000000001e-07],"2":[1.4443999999999999e-07,1.5117e-07],"3":[1.5928000000000001e-07,1.6844999999999998e-07],"4":[1.7643e-07,1.7657999999999998e-07],"7424":[0.00023221562499999997,0.00024433299999999995],"5":[1.9081e-07,1.9612000000000001e-07],"23552":[0.0013978509999999999,0.001413877],"6":[2.0703000000000002e-07,2.1126e-07],"61440":[0.0021803310000000002,0.00225734],"491520":[0.025686450999999999,0.045997137],"77824":[0.003634824,0.0040329959999999996],"7":[2.2674e-07,2.3663999999999998e-07],"8":[2.4718000000000002e-07,2.7141999999999998e-07],"208":[4.2370799999999999e-06,4.3582799999999997e-06],"9":[2.5986e-07,2.8839e-07],"73728":[0.003050534000000001,0.0031161830000000002],"304":[8.8484900000000011e-06,1.1287039999999998e-05],"400":[8.4276000000000004e-06,8.6962899999999994e-06],"1310720":[0.17767044700000001,0.24292172150000002],"336":[1.08362e-05,1.548779e-05],"3670016":[0.54451324700000003,0.58688365499999995],"6656":[0.00019249,0.00020170758333333335],"15360":[0.00047780799999999998,0.00053860583333333327],"432":[9.5578000000000002e-06,9.6795799999999999e-06],"950272":[0.073231297000000001,0.10999526499999999],"655360":[0.051377105499999999,0.079155017999999994],"69632":[0.0027237916666666669,0.0028074136666666667],"11264":[0.00059601956249999996,0.00059900406249999984],"2752512":[0.62530138349999997,0.66555518700000005],"8126464":[1.4317152609999999,1.4556623609999999],"27648":[0.00086437800000000006,0.0008779503636363636],"368":[1.6380679999999999e-05,3.2756000000000003e-05],"65536":[0.002455086,0.0027079090000000005],"16252928":[3.0487918650000001,3.0748936929999999],"464":[1.0463e-05,1.1078672413793102e-05],"1015808":[0.09391819199999997,0.145931334],"3072":[0.00019617699999999999,0.00020045499999999999],"110592":[0.0040348164999999998,0.0043075300000000004],"237568":[0.010822798,0.011642539],"278528":[0.0151756145,0.015878120499999999],"496":[1.176892e-05,1.2323729999999999e-05],"13107200":[2.0949393729999999,2.140055426],"9961472":[2.2959961094999999,2.2963361655000001],"5888":[0.00032120899999999993,0.00037543112499999995],"11010048":[2.9585052549999999,3.0134839539999998],"1920":[5.6225393939393941e-05,5.6949315068493152e-05],"2490368":[0.46462325799999998,0.47323592349999999],"19456":[0.000800225,0.000836245],"57344":[0.001858045,0.0019654722500000001],"1179648":[0.13446345300000001,0.1859856315],"4718592":[0.93010650250000004,0.98384344099999999],"360448":[0.028686760999999995,0.030637415000000001],"1572864":[0.35955158949999999,0.37221189900000001],"53248":[0.0016650599999999999,0.001793132],"3456":[9.9468820000000007e-05,0.0001100422],"40960":[0.0017383239999999999,0.0018478921999999999],"4608":[0.00017073150000000004,0.000181814],"13824":[0.000412011,0.000479562],"819200":[0.061344460499999996,0.084281064999999988],"983040":[0.083952139999999995,0.120345806],"8704":[0.00030844600000000009,0.00032311531034482749],"120":[2.6730599999999996e-06,2.7300700000000004e-06],"1024":[2.7876099999999999e-05,2.967442e-05],"49152":[0.0032197929999999999,0.0032222534999999997],"524288":[0.029531790000000002,0.046022961000000029],"45056":[0.002290065,0.0023918390000000002],"229376":[0.010161017,0.010221368999999999],"2688":[0.00012260308641975307,0.00013881499999999998],"152":[3.9562000000000003e-06,4.3450099999999998e-06],"5120":[0.00020931000000000001,0.00022154231707317073],"1507328":[0.3016750775,0.43344856549999999],"1216":[4.2503399999999997e-05,4.4150869999999996e-05],"1966080":[0.25728100499999995,0.26975201700000001],"1900544":[0.23547578400000002,0.24162854600000006],"184":[6.4887299999999998e-06,8.9374899999999997e-06],"7936":[0.00024875799999999997,0.000273966],"3801088":[0.59263931599999997,0.60341317500000002],"6815744":[1.045909347,1.1226088505],"124":[2.8439200000000001e-06,2.98645e-06],"102400":[0.0035701744999999999,0.0037402909999999998],"311296":[0.018831873999999998,0.018934754999999998],"1408":[5.9829560000000005e-05,7.3189179999999992e-05],"393216":[0.041770664499999999,0.04283303849999999],"4352":[0.0001561752,0.00016129419672131145],"6553600":[1.0034049894999999,1.0927162909999999],"20480":[0.00090623899999999998,0.00094967350000000012],"608":[1.9190000000000001e-05,1.932366e-05],"2228224":[0.34180973999999997,0.36103688849999999],"36864":[0.001468097333333333,0.0014751020000000001],"704":[2.7345129999999999e-05,2.8756999999999999e-05],"720896":[0.069628695500000004,0.12977109349999999],"800":[1.792028e-05,1.97645e-05],"2621440":[0.51891942849999995,0.59096671150000002],"425984":[0.020011517999999999,0.029595653],"32768":[0.0011130411250000001,0.0011538010000000001],"12058624":[4.3314854250000003,4.5068476725000002],"128":[3.1391600000000001e-06,3.7513400000000002e-06],"180224":[0.0131538885,0.013505191],"224":[4.5729599999999998e-06,4.92927e-06],"736":[3.0184000000000001e-05,3.2500550000000002e-05],"320":[9.6450899999999995e-06,1.007883e-05],"557056":[0.032341651499999999,0.052771713000000074],"832":[1.962492e-05,1.9738450000000001e-05],"9437184":[2.0348258735,2.0669742000000002],"3584":[0.00010478,0.000112482],"6291456":[2.493051989,2.532310254],"256":[5.73306e-06,6.4245100000000008e-06],"15204352":[2.6969620270000001,2.7515567079999999],"28672":[0.00088321888888888889,0.00090112200000000008],"768":[4.1994545454545454e-05,4.3575769230769233e-05],"212992":[0.0087124300000000019,0.0093743330000000003],"864":[2.0896119999999999e-05,2.2220930000000001e-05],"352":[1.4586989999999999e-05,1.474366e-05],"253952":[0.0123652925,0.0129138115],"960":[2.6613019999999999e-05,2.6655249999999999e-05],"24576":[0.00153797,0.001672286],"7680":[0.00025036165789473679,0.00026424100000000002],"294912":[0.017009426000000001,0.017745056499999995],"1048576":[0.090856446999999993,0.1379612415],"10485760":[2.5124743559999998,2.6047649234999999],"344064":[0.025507149999999999,0.026566339000000001],"288":[7.2008700000000004e-06,8.7748899999999989e-06],"1152":[3.6107499999999999e-05,3.7015000000000004e-05],"384":[1.7229000000000001e-05,2.0446e-05],"2304":[8.628207142857143e-05,8.8429040000000006e-05],"896":[2.2342659999999999e-05,2.4306940000000002e-05],"480":[1.0903e-05,1.1653760000000001e-05],"1441792":[0.2722177475,0.37104444049999996],"992":[2.7320586956521736e-05,2.7463119999999999e-05],"3968":[0.00012537899999999998,0.00013022899999999999],"6400":[0.00017415600000000002,0.00018853399999999999],"1344":[5.5066200000000005e-05,6.3175122807017543e-05],"126976":[0.0054704549999999999,0.00573844],"2883584":[0.70954593700000002,0.75281853600000004],"753664":[0.086223258000000025,0.12134242550000002],"16384":[0.00057190449999999988,0.00059047799999999997],"131072":[0.0058231069999999984,0.0061508930000000002],"458752":[0.023901187500000001,0.026700484999999996],"172032":[0.011213681499999999,0.011364792],"12288":[0.00077067599999999998,0.00085680100000000013],"14680064":[2.5202881050000001,4.9917655935000003],"1536":[8.1199000000000006e-05,8.969557e-05],"25600":[0.00070081799999999997,0.00076000500000000001],"1835008":[0.205929731,0.22316775700000002],"10752":[0.000494236,0.00050253800000000007],"21504":[0.001025979,0.001038307888888889],"7602176":[1.2688463990000001,1.2814576355],"5632":[0.00028183,0.000288413],"10":[3.0604000000000001e-07,3.1408000000000002e-07],"3145728":[1.0508391930000001,1.060653941],"245760":[0.0116907,0.0123626165],"1728":[4.51225e-05,4.7830333333333335e-05],"11":[3.227e-07,3.3341999999999998e-07],"1114112":[0.110511201,0.17400663399999999],"12":[3.2357000000000003e-07,3.6137000000000001e-07],"7340032":[1.177709238,1.196800176],"7168":[0.0002190426666666675,0.00023287200000000002],"13":[3.5149999999999999e-07,3.9218999999999997e-07],"6029312":[2.0181013170000002,2.0259706120000001],"14":[3.5451000000000002e-07,4.1813e-07],"3200":[8.6724000000000005e-05,9.2766895833333335e-05],"20":[5.1877000000000003e-07,6.3880000000000003e-07],"204800":[0.0082139399999999994,0.011432451499999999],"15":[5.1968000000000006e-07,5.3161999999999994e-07],"13312":[0.00039411199999999996,0.00041225000000000002],"4980736":[1.0583968340000001,1.067733187],"118784":[0.0047703540000000001,0.0048288074999999998],"51200":[0.0015489084999999994,0.0016396068333333329],"16":[4.643e-07,5.3908000000000003e-07],"21":[6.0337000000000004e-07,1.0927899999999999e-06],"917504":[0.072766636499999995,0.11220820400000001],"22":[6.4853999999999996e-07,8.0017e-07],"4864":[0.00018641933333333333,0.00019709999999999997],"17":[4.4283999999999996e-07,4.6025000000000001e-07],"14848":[0.000472721,0.00050146389473684197],"23":[7.5244000000000003e-07,8.5389000000000003e-07],"786432":[0.1030624265,0.16551314900000003],"18":[4.9731000000000005e-07,5.0564999999999998e-07],"1638400":[0.17736835699999998,0.19897404099999999],"7864320":[1.3758837960000001,1.378269671],"24":[7.8179999999999997e-07,9.6031e-07],"14155776":[2.3791949409999997,2.4446668585000002],"19":[5.0102000000000008e-07,5.7418000000000002e-07],"30":[6.2529000000000001e-07,7.2203999999999997e-07],"25":[5.4465000000000005e-07,6.0032000000000002e-07],"31":[7.5179999999999994e-07,7.5774999999999997e-07],"1280":[4.3546807692307696e-05,5.0625858695652179e-05],"26":[5.7273000000000002e-07,6.5596000000000001e-07],"3932160":[0.61094105799999998,0.65487484799999995],"2432":[8.5464000000000007e-05,9.9464108695652178e-05],"32":[7.3998000000000009e-07,7.8256000000000009e-07],"27":[6.1848999999999992e-07,6.6189999999999996e-07],"409600":[0.018223861000000001,0.020389887999999998]}},{"title":"OrderedSet subtracting Self (25% overlap)","results":{"28":[1.55988e-06,1.66841e-06],"34":[1.9681599999999998e-06,1.9843499999999999e-06],"29":[1.5881300000000001e-06,1.64752e-06],"40":[2.6978899999999998e-06,2.9189699999999999e-06],"17408":[0.0011176735,0.0011659960000000003],"1472":[0.00011239900000000001,0.00012971378666666667],"112":[5.6269019607843133e-06,5.8530200000000002e-06],"1376256":[0.27252196100000003,0.39454756299999999],"5242880":[1.5694119575000001,1.6552875515000001],"36":[1.9119700000000001e-06,2.0122577319587628e-06],"42":[2.47483e-06,2.6629399999999998e-06],"11534336":[4.3360422610000002,4.6744673135000001],"114688":[0.0083100680000000003,0.0085882619999999993],"144":[7.6738499999999994e-06,8.4389399999999992e-06],"38":[2.0421299999999999e-06,2.1369100000000001e-06],"240":[1.3261000000000001e-05,1.3393999999999999e-05],"9216":[0.000589172,0.000623195],"44":[2.4965900000000001e-06,3.44199e-06],"1664":[9.0417399999999999e-05,9.8290874999999996e-05],"196608":[0.024204771,0.024525989999999998],"155648":[0.013255458999999997,0.013720679999999999],"2816":[0.00020489676086956525,0.00021861300000000002],"50":[2.4852777777777777e-06,2.5672899999999997e-06],"2359296":[0.51285007699999996,0.52976801849999999],"46":[2.6692199999999999e-06,2.9548500000000002e-06],"176":[1.0865528735632183e-05,1.1071460000000001e-05],"52":[2.6771800000000003e-06,2.7445000000000002e-06],"272":[1.3728889999999999e-05,1.4385249999999999e-05],"116":[5.9242e-06,5.9932200000000002e-06],"47104":[0.0038458260000000001,0.0039662359999999997],"6912":[0.00042635986363636356,0.00043631350000000008],"1856":[0.00011242999999999999,0.000115802],"48":[2.8997599999999999e-06,3.6686700000000001e-06],"2097152":[0.422046961,0.52442137749999995],"54":[2.7332399999999998e-06,2.8677200000000002e-06],"2031616":[0.36522269699999999,0.36821865599999998],"43008":[0.0032158489999999998,0.0035228905],"60":[3.1302100000000004e-06,3.2101100000000003e-06],"30720":[0.002081299,0.0021160275000000001],"56":[2.88324e-06,3.0133599999999996e-06],"62":[3.1268600000000002e-06,3.6473684210526318e-06],"58":[2.9905500000000001e-06,3.1662100000000001e-06],"3014656":[0.99727911599999997,1.1558097885],"64":[3.5561700000000004e-06,3.5752000000000001e-06],"8388608":[2.3250262080000001,2.4036133300000002],"29696":[0.0019277999999999999,0.0020173837499999998],"216":[1.1169140000000001e-05,1.172865e-05],"106496":[0.007414172000000001,0.0079881490000000034],"72":[3.7880169491525425e-06,4.4545000000000003e-06],"442368":[0.039079437999999994,0.0457272965],"147456":[0.011842377499999997,0.012237066999999999],"4456448":[1.1221231149999999,1.1312294185],"63488":[0.0045599550000000001,0.0052624240000000008],"38912":[0.0027285946666666672,0.0027514219999999999],"68":[3.3513999999999998e-06,4.1261799999999999e-06],"188416":[0.020940608000000003,0.021111993999999999],"248":[1.2874933333333333e-05,1.390025e-05],"80":[4.4736249999999999e-06,4.7074699999999998e-06],"2560":[0.00016345700000000002,0.000182003],"34816":[0.002185308,0.0023612964999999999],"3712":[0.00023327799999999996,0.00023892210526315792],"3538944":[0.758003922,0.788858053],"76":[3.9441400000000003e-06,4.61413e-06],"4194304":[0.98519760749999996,1.115602684],"851968":[0.106581237,0.13464678699999999],"4096":[0.00027486700000000004,0.00030912906451612899],"59392":[0.004095942,0.004269732],"84":[4.5063899999999999e-06,5.6327700000000001e-06],"3276800":[0.67816578300000008,0.73384505900000008],"55296":[0.0037055645000000003,0.0040507919999999992],"688128":[0.089548570999999993,0.12786418399999999],"8192":[0.00055787899999999984,0.00057878699999999988],"10240":[0.00071203100000000001,0.000742824],"15872":[0.001101905375,0.0011114851249999999],"92":[5.8182799999999993e-06,7.0641599999999998e-06],"26624":[0.0016192579999999997,0.0017053077999999999],"1792":[0.0001094780120481928,0.000111587],"11776":[0.00094845139999999992,0.0010405616666666665],"2944":[0.00022387499999999998,0.000242921],"88":[5.3832000000000004e-06,5.7712099999999998e-06],"22528":[0.001816327,0.001867554],"1245184":[0.22793086100000001,0.27840567599999999],"15728640":[4.4447531199999997,4.5763856714999998],"96":[5.8905800000000003e-06,6.4535799999999998e-06],"1984":[0.00012551556578947368,0.000130235],"139264":[0.011144404,0.011212616999999999],"475136":[0.04483777349999999,0.061359215000000002],"13631488":[3.6176642495000002,3.7531806080000001],"416":[2.0655000000000001e-05,2.136626e-05],"928":[5.4085999999999997e-05,5.6064019999999999e-05],"512":[3.0246000000000001e-05,3.1050799999999998e-05],"18432":[0.0011929529999999999,0.0013119877142857145],"16777216":[5.0416582419999996],"9728":[0.00064614099999999982,0.00066653742857142849],"1769472":[0.28938997999999999,0.292188169],"1703936":[0.29747509350000001,0.33924469400000001],"2048":[0.00012637100000000001,0.000134964],"14336":[0.00090655499999999964,0.00091489840000000006],"448":[2.3912780000000001e-05,2.4521690000000002e-05],"5505024":[1.8579072169999999,1.9027906655],"544":[2.979889e-05,3.1318059999999998e-05],"221184":[0.017343712000000001,0.018805124499999999],"90112":[0.007763619000000002,0.0085149240000000001],"640":[3.985e-05,3.9993829999999999e-05],"12800":[0.00076214300000000007,0.000806133],"262144":[0.023756927000000004,0.023911579499999995],"589824":[0.066080100499999989,0.089908379999999996],"884736":[0.1119110255,0.174608178],"6144":[0.00056679899999999999,0.00060430599999999988],"1088":[6.2720192307692309e-05,6.3156109999999997e-05],"576":[3.2415490000000001e-05,3.3330649999999999e-05],"160":[8.4809999999999989e-06,1.0584679999999999e-05],"672":[4.1932419354838714e-05,4.2802769230769232e-05],"8912896":[2.5281332340000002,2.5545206390000001],"100":[4.8905699999999998e-06,5.1856099999999998e-06],"507904":[0.049360320499999999,0.074762464000000001],"3840":[0.00024824233333333335,0.00026833236111111115],"192":[1.4391666666666666e-05,1.612996e-05],"376832":[0.046295952999999987,0.05216539299999999],"98304":[0.010282264000000001,0.010590651499999999],"5376":[0.000371085,0.00040600100000000002],"94208":[0.0087898920000000005,0.0095921670000000004],"81920":[0.0062462170000000001,0.006435082],"3407872":[0.68281800400000003,0.71258218100000004],"104":[5.0386999999999997e-06,5.6021900000000005e-06],"122880":[0.0099444605000000019,0.010054656],"200":[9.9836399999999998e-06,1.042564e-05],"163840":[0.014973973999999998,0.015086977999999997],"4063232":[0.96049069099999995,1.0146619210000001],"5767168":[2.0510909009999998,2.0877357965000001],"12582912":[6.0848500855000003,6.8988968210000001],"1600":[8.5915750000000005e-05,9.3786300000000007e-05],"136":[6.7848900000000002e-06,7.4361900000000002e-06],"232":[1.2354359999999999e-05,1.2568999999999999e-05],"7077888":[1.7757918500000001,1.9398036409999999],"86016":[0.0072944990000000003,0.0073070680000000016],"31744":[0.00226936125,0.002334816],"168":[9.6944605263157894e-06,1.129636e-05],"622592":[0.073541213000000008,0.093515794999999999],"108":[5.5414199999999997e-06,5.7209899999999992e-06],"327680":[0.032619879999999997,0.033992465000000006],"2176":[0.00013040449999999999,0.00014159992753623186],"3328":[0.00020052988888888894,0.00020676599999999999],"1":[8.1499999999999995e-08,8.4800000000000005e-08],"2":[2.1287000000000003e-07,2.2144999999999999e-07],"3":[2.3461000000000001e-07,2.4217e-07],"4":[2.5405000000000003e-07,2.5534999999999997e-07],"7424":[0.00048656175000000009,0.00051393278947368427],"5":[2.7406000000000001e-07,2.7707999999999999e-07],"23552":[0.0020029340000000001,0.0020933167500000001],"6":[2.9382999999999998e-07,2.9876000000000001e-07],"61440":[0.0043277199999999993,0.0044483344999999997],"491520":[0.047973024999999989,0.075043969000000016],"77824":[0.0057573580000000015,0.0066252359999999979],"7":[3.2458000000000001e-07,3.2975999999999996e-07],"8":[3.4059000000000001e-07,3.5530000000000001e-07],"208":[1.075995e-05,1.080019e-05],"9":[3.6158000000000004e-07,3.7149e-07],"73728":[0.0054594860000000004,0.0055528309999999994],"304":[1.627061e-05,1.652027e-05],"400":[2.004948e-05,2.0527280000000001e-05],"1310720":[0.23619948700000001,0.29566324399999999],"336":[2.0098333333333334e-05,2.1609333333333333e-05],"3670016":[0.80545331050000002,0.83896995699999999],"6656":[0.00039947400000000003,0.00040505522727272747],"15360":[0.0010354394444444445,0.0010602365555555555],"432":[2.1437000000000002e-05,2.4312616279069765e-05],"950272":[0.12631437400000001,0.16040813100000001],"655360":[0.078117326500000001,0.116371159],"69632":[0.004854672,0.0048553540000000001],"11264":[0.00087072899999999977,0.00088544109090909085],"2752512":[0.75899214199999998,0.820560599],"8126464":[2.1201263725000001,2.1968804940000002],"27648":[0.0017861794000000003,0.001793492],"368":[2.625734e-05,3.8325145833333334e-05],"65536":[0.0049627209999999998,0.0050844419999999998],"16252928":[4.6441570389999995,4.7927511049999998],"464":[2.5265169999999998e-05,2.7419609999999998e-05],"1015808":[0.14857093299999999,0.18821269700000001],"3072":[0.00027386268749999995,0.00028039299999999998],"110592":[0.0078645160000000002,0.0081514160000000016],"237568":[0.019629391,0.022457480499999995],"278528":[0.024036349000000002,0.027870194000000004],"496":[3.0059359999999999e-05,3.0738562499999998e-05],"13107200":[3.461271016,3.5947704150000002],"9961472":[3.1939030000000002,3.214006017],"5888":[0.000483463,0.00050725584210526298],"11010048":[3.704196885,3.9814617575],"1920":[0.000124051,0.00012418049315068491],"2490368":[0.59389222450000001,0.6107157875],"19456":[0.0013600802857142856,0.0013958240000000006],"57344":[0.0038076640000000001,0.0039509639999999995],"1179648":[0.19528029499999999,0.27073832099999995],"4718592":[1.2889838965,1.3491614620000001],"360448":[0.039764472000000002,0.043537051],"1572864":[0.40691408099999998,0.44357639799999998],"53248":[0.0034113465000000002,0.003581561],"3456":[0.00021270304444444442,0.00021476699999999999],"40960":[0.0029240526666666671,0.0029459109999999998],"4608":[0.00028351599999999999,0.000302973],"13824":[0.000860077,0.00095851700000000009],"819200":[0.096414349999999954,0.1245617955],"983040":[0.14376330900000001,0.1897985425],"8704":[0.00054634276470588228,0.00057325141176470576],"120":[6.49417e-06,6.6438900000000002e-06],"1024":[6.3612e-05,6.5061000000000006e-05],"49152":[0.0044069270000000006,0.004646443000000001],"524288":[0.052736251499999998,0.076120554499999993],"45056":[0.0034951265,0.00375246],"229376":[0.019021234000000001,0.019434872000000002],"2688":[0.00018590349999999997,0.00021223700000000002],"152":[7.9206666666666668e-06,7.9557499999999992e-06],"5120":[0.00036211300000000001,0.00036403299999999999],"1507328":[0.33919721600000002,0.47426169099999999],"1216":[7.4482700000000004e-05,7.6900800000000001e-05],"1966080":[0.35430750100000002,0.3624012935],"1900544":[0.33667571200000002,0.33764799950000002],"184":[1.166847e-05,1.5375490000000001e-05],"7936":[0.00052078200000000002,0.00052419999999999984],"3801088":[0.83709377299999999,0.840972363],"6815744":[1.7174586110000001,1.8403991749999999],"124":[6.2757100000000006e-06,7.4750100000000003e-06],"102400":[0.0071093449999999987,0.0075694060000000007],"311296":[0.029900744,0.030292436499999999],"1408":[9.7087000000000001e-05,0.000103634],"393216":[0.053609234999999998,0.057747231500000017],"4352":[0.00025138800000000001,0.00028804600000000014],"6553600":[1.5662581069999999,1.7640456819999999],"20480":[0.001521711,0.0015305540000000002],"608":[3.553e-05,3.6529480000000002e-05],"2228224":[0.47842651899999999,0.47919602150000001],"36864":[0.002602806,0.002733799666666667],"704":[4.7268999999999998e-05,4.7956839999999997e-05],"720896":[0.10046677599999999,0.17341454000000001],"800":[4.2820719999999996e-05,4.4160050000000001e-05],"2621440":[0.6362757,0.70579082850000008],"425984":[0.040810649999999997,0.055539057999999995],"32768":[0.0022516899999999998,0.002415319],"12058624":[5.0051769290000001,5.1500884530000004],"128":[6.7392199999999995e-06,7.7240099999999999e-06],"180224":[0.0182740695,0.0194802775],"224":[1.161573e-05,1.181675e-05],"736":[5.1935109890109887e-05,5.4427370370370372e-05],"320":[1.8653770000000002e-05,1.9399333333333332e-05],"557056":[0.064055018000000033,0.081229442999999998],"832":[4.4684466666666669e-05,4.624759e-05],"9437184":[2.9068955404999999,3.017545621],"3584":[0.00020813900000000003,0.000231101],"6291456":[2.7831336054999998,2.8064966514999998],"256":[1.416998e-05,1.481433e-05],"15204352":[4.2253959595000001,4.3969853939999997],"28672":[0.0018515453999999997,0.0019895010000000003],"768":[5.8140000000000002e-05,6.2075409999999993e-05],"212992":[0.016706723999999999,0.017385382499999998],"864":[4.4231999999999999e-05,4.948425e-05],"352":[2.3329769999999999e-05,2.3964666666666668e-05],"253952":[0.021918362,0.022696805],"960":[5.8856369999999999e-05,6.1609508196721304e-05],"24576":[0.0022937689999999998,0.002323781],"7680":[0.00048273099999999997,0.000532053],"294912":[0.027599005499999996,0.028293258499999981],"1048576":[0.15308160599999998,0.19741825299999999],"10485760":[3.4222106784999999,3.5344981440000001],"344064":[0.037056100999999994,0.039452211000000001],"288":[1.489141e-05,1.6409240000000001e-05],"1152":[6.7806990000000009e-05,7.1048000000000001e-05],"384":[2.7743280000000001e-05,2.8399660000000002e-05],"2304":[0.00015062433333333335,0.00015146100000000001],"896":[5.0404430000000004e-05,5.2132289999999995e-05],"480":[2.7923940000000002e-05,2.799022e-05],"1441792":[0.31511358550000002,0.42622977350000002],"992":[5.9493384615384613e-05,6.3937189999999994e-05],"3968":[0.00024818233333333327,0.00026973599999999997],"6400":[0.000382887,0.00040918200000000001],"1344":[8.5259777777777775e-05,0.00010169317204301077],"126976":[0.01045017,0.0104607425],"2883584":[0.8186670345,0.91518185249999995],"753664":[0.11573056000000004,0.141637967],"16384":[0.0011035189999999996,0.0012303477142857145],"131072":[0.010730073,0.01152794],"458752":[0.041633526000000004,0.052598832000000019],"172032":[0.016650110000000003,0.016891794000000009],"12288":[0.001089799,0.001215275],"14680064":[4.0288922280000001,8.0069160159999999],"1536":[0.00012403699999999999,0.00012994072602739732],"25600":[0.0015738618333333333,0.0016474439999999996],"1835008":[0.29730442800000001,0.30715528449999996],"10752":[0.00078634699999999996,0.00081707700000000004],"21504":[0.001642882,0.001809513],"7602176":[2.0023688430000002,2.0820619185],"5632":[0.00043827699999999994,0.00044452800000000013],"10":[4.0905000000000003e-07,4.1211e-07],"3145728":[1.1619014999999999,1.1652545425],"245760":[0.0211864945,0.022764647999999998],"1728":[9.8975333333333327e-05,0.000103539],"11":[4.5037000000000003e-07,4.9839999999999996e-07],"1114112":[0.17962596199999997,0.236229511],"12":[4.5695999999999998e-07,4.7432999999999999e-07],"7340032":[1.862036971,1.9413760355],"7168":[0.000446537,0.000482609],"13":[4.4748999999999999e-07,5.0236999999999996e-07],"6029312":[2.3277459079999998,2.4104035189999999],"14":[4.8869000000000002e-07,5.1569999999999999e-07],"3200":[0.00018518300000000001,0.000205355],"20":[6.7777999999999997e-07,7.8331000000000004e-07],"204800":[0.015902600499999999,0.019336794000000004],"15":[6.2075000000000005e-07,6.5245e-07],"13312":[0.000820538,0.00093826209999999985],"4980736":[1.450417222,1.4735492425000001],"118784":[0.0091327679999999994,0.00918859],"51200":[0.0032274039999999997,0.003427912999999999],"16":[5.9325e-07,6.1453999999999994e-07],"21":[7.1149999999999999e-07,9.6993e-07],"917504":[0.12272562350000001,0.17392031899999999],"22":[1.3606499999999998e-06,1.4834900000000002e-06],"4864":[0.0003195416666666666,0.00033603499999999994],"17":[5.9869000000000002e-07,6.1527999999999993e-07],"14848":[0.000955316,0.00099734499999999974],"23":[1.4447900000000001e-06,1.6870000000000001e-06],"786432":[0.12474748300000001,0.18300379350000001],"18":[6.4631999999999998e-07,8.2324000000000006e-07],"1638400":[0.26076073999999999,0.26947734950000002],"7864320":[2.0754993279999998,2.1347444060000003],"24":[1.5390799999999999e-06,1.62824e-06],"14155776":[3.8459425674999999,3.8973224069999999],"19":[6.4312000000000006e-07,7.310200000000001e-07],"30":[1.62749e-06,1.6390699999999999e-06],"25":[1.37827e-06,1.4038799999999999e-06],"31":[1.6686624999999999e-06,1.71047e-06],"1280":[7.7556000000000001e-05,8.3078999999999995e-05],"26":[1.4651599999999999e-06,1.4855e-06],"3932160":[0.84460517800000001,0.939045566],"2432":[0.00015858420000000001,0.00016403899999999999],"32":[1.7765799999999999e-06,1.9124199999999998e-06],"27":[1.4788900000000001e-06,1.57916e-06],"409600":[0.035016482999999994,0.043136658999999994]}},{"title":"OrderedSet subtracting Self (50% overlap)","results":{"28":[7.7868999999999999e-07,8.1999000000000003e-07],"34":[1.4600600000000002e-06,1.7609400000000002e-06],"29":[8.2484999999999992e-07,8.2994000000000003e-07],"40":[2.0215500000000002e-06,2.2236499999999999e-06],"17408":[0.00093756470000000045,0.00094539999999999989],"1472":[9.3406949494949482e-05,0.00010470525],"112":[4.4206000000000005e-06,4.4992199999999998e-06],"1376256":[0.25182215100000005,0.35564863400000002],"5242880":[1.302108781,1.392319627],"36":[1.7805899999999999e-06,1.7894800000000001e-06],"42":[1.9949799999999998e-06,2.15343e-06],"11534336":[3.8474614890000001,3.92607639],"114688":[0.0067284480000000006,0.0070685029999999994],"144":[6.3837400000000006e-06,6.9955799999999999e-06],"38":[1.7998699999999999e-06,1.8094000000000002e-06],"240":[9.995620000000001e-06,1.037542e-05],"9216":[0.00048212099999999996,0.00053240599999999992],"44":[2.2538399999999998e-06,2.9048700000000004e-06],"1664":[6.8164999999999995e-05,7.3342000000000004e-05],"196608":[0.020204670000000001,0.020957029999999998],"155648":[0.0114797705,0.011950469],"2816":[0.00018282251851851848,0.00018803799999999999],"50":[2.0821599999999999e-06,2.2157604166666666e-06],"2359296":[0.43724054950000002,0.46040253399999997],"46":[2.3079299999999999e-06,2.41889e-06],"176":[8.8653600000000004e-06,9.2112099999999999e-06],"52":[2.1676000000000002e-06,2.2091499999999998e-06],"272":[1.1222666666666665e-05,1.2287990000000001e-05],"116":[4.5866799999999999e-06,4.8930399999999998e-06],"47104":[0.0033102934999999995,0.0033555845000000002],"6912":[0.00033559700000000009,0.00034505199999999999],"1856":[8.2014411764705873e-05,8.7951545454545448e-05],"48":[2.4116400000000002e-06,2.7770499999999999e-06],"2097152":[0.41040246699999999,0.48873755349999998],"54":[2.3593500000000001e-06,2.3865299999999999e-06],"2031616":[0.34359880399999998,0.36772998999999995],"43008":[0.0026971960000000007,0.0030102319999999998],"60":[2.5334899999999997e-06,2.6570100000000004e-06],"30720":[0.0015205660000000001,0.0015552439999999997],"56":[2.3242999999999999e-06,2.4473799999999999e-06],"62":[2.6189800000000001e-06,2.81817e-06],"58":[2.5315800000000003e-06,2.6715199999999999e-06],"3014656":[0.84590528450000002,0.97097205850000001],"64":[2.7199499999999997e-06,2.8267800000000001e-06],"8388608":[2.0483230469999998,2.0628217040000001],"29696":[0.001444667,0.0015229989999999999],"216":[9.183620000000001e-06,9.30137e-06],"106496":[0.0060532629999999997,0.0065129420000000007],"72":[3.1752000000000001e-06,3.4792500000000002e-06],"442368":[0.034015138,0.045278536500000001],"147456":[0.010219714999999999,0.010735148999999996],"4456448":[0.96728812799999997,0.98597957349999998],"63488":[0.003460627,0.0041659400000000008],"38912":[0.0023229592500000002,0.0023499370000000007],"68":[2.8504000000000003e-06,3.2041300000000004e-06],"188416":[0.0174849285,0.017567596499999998],"248":[1.0093117647058824e-05,1.1130179999999999e-05],"80":[3.8328800000000005e-06,3.9716000000000002e-06],"2560":[0.00014211074999999999,0.00015864539622641513],"34816":[0.0019117020000000001,0.0019215139999999998],"3712":[0.00017863833333333333,0.00018266500000000001],"3538944":[0.65731372600000004,0.73331519599999995],"76":[3.3554000000000001e-06,3.4020100000000001e-06],"4194304":[0.88417470600000003,1.0014406179999999],"851968":[0.087447426999999994,0.13847609399999999],"4096":[0.00020433000000000002,0.00021922502564102568],"59392":[0.003254626,0.0035367475],"84":[4.1670699999999999e-06,4.2869000000000004e-06],"3276800":[0.58854967499999999,0.710931588],"55296":[0.0028364760000000001,0.0030711750000000002],"688128":[0.076136067500000001,0.10703315150000001],"8192":[0.00039925200000000001,0.00042892600000000005],"10240":[0.00060664900000000001,0.00063807246666666684],"15872":[0.00082500949999999987,0.00084374990909090886],"92":[4.7618699999999997e-06,5.7639400000000002e-06],"26624":[0.0013294800000000001,0.001375654],"1792":[7.5331000000000001e-05,8.5249420000000012e-05],"11776":[0.00080183209090909106,0.00083528536363636327],"2944":[0.00019674422222222226,0.00020196399999999995],"88":[4.6086299999999998e-06,5.2099000000000007e-06],"22528":[0.0015765328333333336,0.0015801716666666668],"1245184":[0.185568285,0.2475533285],"15728640":[4.137811074,4.1870868205000003],"96":[4.7432900000000001e-06,5.2301300000000005e-06],"1984":[8.6984000000000006e-05,9.2806833333333334e-05],"139264":[0.0096195169999999976,0.0096495330000000001],"475136":[0.035614542999999999,0.05749457849999999],"13631488":[3.1143586679999999,3.3829567405000001],"416":[1.6107749999999998e-05,1.6648849999999999e-05],"928":[4.0534050000000005e-05,4.2231290000000003e-05],"512":[2.351479e-05,2.3576222222222224e-05],"18432":[0.0010284417777777781,0.001070393],"16777216":[4.2883267400000005],"9728":[0.00055562700000000016,0.00057391147058823535],"1769472":[0.27211709699999997,0.2781576845],"1703936":[0.26552179349999999,0.32708218950000001],"2048":[9.6786200000000005e-05,0.00010075249999999999],"14336":[0.00067993999999999997,0.00069366199999999973],"448":[1.8432679999999999e-05,1.9002529999999998e-05],"5505024":[1.4646080379999999,1.6198050045000001],"544":[2.4519999999999999e-05,2.5736570000000001e-05],"221184":[0.014321255,0.016141887000000001],"90112":[0.0065645850000000004,0.0076703190000000001],"640":[3.2924456521739132e-05,3.3128079999999997e-05],"12800":[0.00058391600000000008,0.00062388599999999993],"262144":[0.019539303000000001,0.021301432000000002],"589824":[0.056697296000000022,0.085913240000000002],"884736":[0.1032013395,0.13821328350000001],"6144":[0.00043283299999999993,0.00048231350000000012],"1088":[5.190192e-05,5.2439067567567566e-05],"576":[2.8153999999999998e-05,2.8554000000000001e-05],"160":[7.1683300000000009e-06,8.6410900000000003e-06],"672":[3.5876639999999903e-05,3.7665040000000002e-05],"8912896":[2.2603342115,2.3584896949999998],"100":[3.8657799999999998e-06,4.0402300000000003e-06],"507904":[0.041745717500000001,0.062701492999999983],"3840":[0.00018518200000000002,0.00018697567924528304],"192":[1.0924019999999999e-05,1.322939e-05],"376832":[0.039153186999999992,0.039999057000000005],"98304":[0.0085513220000000018,0.0088490429999999974],"5376":[0.00030581400000000001,0.00032795799999999999],"94208":[0.0073911879999999999,0.007629785],"81920":[0.0053022190000000004,0.0053608250000000005],"3407872":[0.63163393300000004,0.66605203400000002],"104":[4.0504899999999997e-06,4.1020899999999994e-06],"122880":[0.0078482420000000018,0.0083107689999999991],"200":[7.8409199999999995e-06,8.2786099999999997e-06],"163840":[0.013131641499999996,0.013213577000000001],"4063232":[0.84727722250000004,0.89839169100000005],"5767168":[1.720542083,1.8716465074999999],"12582912":[4.7874669379999997,10.571551684499999],"1600":[6.3298000000000003e-05,6.992097560975609e-05],"136":[5.62514e-06,6.2925100000000002e-06],"232":[9.2202727272727263e-06,9.7654899999999992e-06],"7077888":[1.5273043205000001,1.7554881314999999],"86016":[0.0060916920000000001,0.0061413780000000012],"31744":[0.0016998866,0.0017101390000000001],"168":[8.1442045454545456e-06,8.9686900000000004e-06],"622592":[0.058326702000000029,0.07610177100000004],"108":[4.2255999999999998e-06,4.4654800000000001e-06],"327680":[0.027489885499999995,0.028053247],"2176":[0.00010401799999999999,0.0001154362823529412],"3328":[0.00014449600000000001,0.00017222625454545455],"1":[7.7919999999999999e-08,7.7929999999999997e-08],"2":[2.1201e-07,2.1284000000000002e-07],"3":[2.3167999999999999e-07,2.3479e-07],"4":[2.5255000000000002e-07,2.5289999999999999e-07],"7424":[0.0003769750000000001,0.00038172284615384613],"5":[2.6855999999999996e-07,2.6974999999999999e-07],"23552":[0.0017164088000000001,0.001726209],"6":[2.9111000000000002e-07,2.9490000000000003e-07],"61440":[0.0033167970000000007,0.003411875],"491520":[0.037688617000000008,0.063725427500000001],"77824":[0.0048389009999999996,0.0050851840000000004],"7":[3.1235999999999997e-07,3.1939e-07],"8":[3.2968000000000002e-07,3.3417999999999999e-07],"208":[8.3597099999999996e-06,8.4303400000000007e-06],"9":[3.5367000000000002e-07,3.6597000000000004e-07],"73728":[0.0043871645000000004,0.0045433729999999999],"304":[1.366306e-05,1.472662e-05],"400":[1.604782e-05,1.61162e-05],"1310720":[0.22744163900000003,0.26542991599999999],"336":[1.6633910000000001e-05,1.87614e-05],"3670016":[0.78571426,0.790909682],"6656":[0.00031004200000000006,0.00032239329999999997],"15360":[0.00080357108333333328,0.00083147445454545489],"432":[1.8032370000000002e-05,1.8600240000000001e-05],"950272":[0.11453305850000001,0.1520788025],"655360":[0.070616473999999999,0.098101853000000003],"69632":[0.0040025754999999993,0.0040864044999999998],"11264":[0.00069326799999999992,0.00076444691666666673],"2752512":[0.68665333149999996,0.72148626949999994],"8126464":[1.9262997630000001,1.9353298274999999],"27648":[0.0013257340000000001,0.0014265289999999999],"368":[2.2980549999999998e-05,3.0301e-05],"65536":[0.0038227679999999998,0.0038950134999999999],"16252928":[4.1203585855,4.2784991264999999],"464":[1.968419e-05,2.1462661538461538e-05],"1015808":[0.133063863,0.18304549549999999],"3072":[0.000212322,0.00023771800000000004],"110592":[0.006334859,0.006819613999999999],"237568":[0.016043349500000005,0.018456522499999999],"278528":[0.020913385999999999,0.022417670000000004],"496":[2.1030070000000002e-05,2.2252949999999998e-05],"13107200":[2.9212399279999999,3.2239139510000001],"9961472":[2.7699693750000001,2.8324759765],"5888":[0.00038559200000000003,0.00039404199999999994],"11010048":[3.2151759420000001,3.3787611645000002],"1920":[8.9964999999999997e-05,9.0039799999999998e-05],"2490368":[0.52084855249999995,0.53807349599999998],"19456":[0.0011217670000000003,0.0011532235],"57344":[0.0029715066666666672,0.003092776666666667],"1179648":[0.17453065500000001,0.21504376049999999],"4718592":[1.0888777110000001,1.2542708874999999],"360448":[0.034389408000000024,0.039782533500000009],"1572864":[0.35368422199999999,0.42778994400000003],"53248":[0.0026822653333333337,0.0028440199999999992],"3456":[0.00015787439999999999,0.00016700799999999998],"40960":[0.0025046339999999999,0.002544494],"4608":[0.00024457,0.000246736],"13824":[0.00067002199999999983,0.00071605200000000012],"819200":[0.082527848500000014,0.116070701],"983040":[0.13563066700000001,0.178921302],"8704":[0.00045405,0.00045921360000000008],"120":[4.75622e-06,4.7597826086956522e-06],"1024":[4.5846000000000001e-05,4.7348422680412374e-05],"49152":[0.0038342005,0.0038445349999999996],"524288":[0.044931317500000019,0.060861770000000003],"45056":[0.0029643270000000001,0.0032757959999999988],"229376":[0.016051299000000002,0.01659567],"2688":[0.00016418101754385968,0.00017945528301886789],"152":[6.7003299999999996e-06,7.1244782608695662e-06],"5120":[0.00028801599999999993,0.00030609300000000001],"1507328":[0.31575077200000001,0.402414991],"1216":[6.0585999999999999e-05,6.4689780000000004e-05],"1966080":[0.33519629750000002,0.34340558399999999],"1900544":[0.30221102700000002,0.31911568299999998],"184":[9.73971e-06,1.2531230000000002e-05],"7936":[0.00040536549999999999,0.00041293300000000004],"3801088":[0.7909127735,0.80863626399999999],"6815744":[1.64433458,1.6789166039999999],"124":[4.9872600000000003e-06,5.97566e-06],"102400":[0.005712796,0.006257388],"311296":[0.025592336,0.026617914000000003],"1408":[8.3634333333333326e-05,8.6714999999999999e-05],"393216":[0.043518047500000004,0.049518699500000006],"4352":[0.000211337,0.00024090549999999998],"6553600":[1.445523581,1.6202174395],"20480":[0.001209138,0.001254497],"608":[2.9876659999999999e-05,3.0694919999999998e-05],"2228224":[0.39297144299999998,0.39517368800000002],"36864":[0.0021747004999999996,0.002307262],"704":[3.8475759999999999e-05,3.9959330000000004e-05],"720896":[0.089225346500000011,0.141895941],"800":[3.2320500000000003e-05,3.3431113402061856e-05],"2621440":[0.56165552900000004,0.57532168399999994],"425984":[0.034178227500000005,0.053075348499999994],"32768":[0.0016927699999999997,0.0018232964],"12058624":[4.2724341629999998,4.2916226054999997],"128":[5.1858899999999999e-06,5.6369000000000002e-06],"180224":[0.016235678999999996,0.016528678500000001],"224":[8.7089200000000003e-06,9.10093e-06],"736":[4.1474000000000003e-05,4.2351589999999995e-05],"320":[1.5544249999999999e-05,1.662469e-05],"557056":[0.051350155000000022,0.08328543649999999],"832":[3.3114500000000003e-05,3.3735500000000003e-05],"9437184":[2.6803090850000002,2.7419087869999998],"3584":[0.00016865199999999998,0.00017550900000000004],"6291456":[2.2181522839999999,2.2988005965],"256":[1.0582500000000001e-05,1.1196990000000001e-05],"15204352":[3.64999407,4.0576974110000004],"28672":[0.0013624080000000001,0.001497621],"768":[4.9986872340425534e-05,5.2828999999999999e-05],"212992":[0.0136626805,0.0152601855],"864":[3.4161500000000001e-05,3.7074170000000003e-05],"352":[1.95911e-05,2.0005769999999999e-05],"253952":[0.017950105000000001,0.018975444000000001],"960":[4.4405620000000002e-05,4.5298639999999996e-05],"24576":[0.00178177,0.0019196068],"7680":[0.00037888800000000002,0.00039529099999999998],"294912":[0.024087261000000006,0.029213940000000004],"1048576":[0.148089897,0.17141879500000001],"10485760":[2.8191228960000001,3.1479575469999999],"344064":[0.030063726000000002,0.034138562499999983],"288":[1.2657140000000001e-05,1.373299e-05],"1152":[5.8783000000000003e-05,5.9056432835820901e-05],"384":[2.2331999999999999e-05,2.2595769999999999e-05],"2304":[0.00012465466249999996,0.0001348747857142857],"896":[3.7002224137931037e-05,3.8667020000000002e-05],"480":[1.9000666666666666e-05,2.0448659999999997e-05],"1441792":[0.28481338550000002,0.36899281849999999],"992":[4.5136170000000001e-05,4.6556692307692307e-05],"3968":[0.00019832199999999999,0.00020667795833333329],"6400":[0.00029838,0.00031226032258064521],"1344":[7.4044710000000007e-05,7.9440139999999995e-05],"126976":[0.0083633869999999999,0.0084124459999999988],"2883584":[0.70899631149999998,0.78338460600000004],"753664":[0.093027357000000005,0.12784733349999999],"16384":[0.00085964809090909088,0.00087940900000000005],"131072":[0.0088183880000000017,0.0090573790000000008],"458752":[0.036155142999999994,0.049425384000000003],"172032":[0.014582791000000003,0.014795032999999999],"12288":[0.000911811,0.00097580699999999987],"14680064":[3.4810056149999999,7.5552020359999998],"1536":[0.00010346417857142857,0.0001061],"25600":[0.0012132944285714287,0.001224073],"1835008":[0.27896743000000002,0.29462282149999997],"10752":[0.00067918300000000009,0.0006856719999999998],"21504":[0.0013184549999999998,0.001544157],"7602176":[1.6647585409999999,1.8504530349999999],"5632":[0.00036121600000000003,0.00037863454166666674],"10":[3.855e-07,4.2311999999999999e-07],"3145728":[0.98052780299999998,1.0028676605],"245760":[0.0177026445,0.019643698000000001],"1728":[7.5653400000000003e-05,7.9024807692307684e-05],"11":[3.8887999999999997e-07,4.1474000000000002e-07],"1114112":[0.163468581,0.22115418000000001],"12":[4.3401000000000001e-07,4.3971000000000001e-07],"7340032":[1.6071894735000001,1.666508858],"7168":[0.00034901499999999994,0.00036340800000000001],"13":[4.5812000000000003e-07,4.8754999999999999e-07],"6029312":[1.9079583709999999,1.9344892389999999],"14":[4.9174999999999999e-07,5.0889000000000005e-07],"3200":[0.00014785999999999996,0.0001482849],"20":[6.2799000000000011e-07,7.0258000000000004e-07],"204800":[0.013320140999999999,0.0136715035],"15":[5.0365000000000004e-07,5.8220999999999997e-07],"13312":[0.00059676100000000001,0.00071831999999999961],"4980736":[1.2120974259999999,1.254741535],"118784":[0.0072557959999999993,0.0075174790000000005],"51200":[0.0025451776666666663,0.0027044973333333324],"16":[5.5105e-07,5.7769999999999999e-07],"21":[6.9369999999999992e-07,9.4656999999999999e-07],"917504":[0.10986149100000001,0.171391187],"22":[7.3346999999999996e-07,8.5237999999999996e-07],"4864":[0.00026388366666666661,0.00026890800000000005],"17":[5.8505000000000001e-07,6.0260000000000006e-07],"14848":[0.00076101500000000009,0.00076249],"23":[7.7453999999999989e-07,9.1572e-07],"786432":[0.111393748,0.165879901],"18":[5.7451000000000003e-07,8.0609000000000004e-07],"1638400":[0.240240654,0.27192031300000002],"7864320":[1.7666012,1.8337312830000001],"24":[8.5456e-07,9.1905999999999997e-07],"14155776":[3.503230286,3.5811022079999999],"19":[6.0521999999999996e-07,6.0709000000000002e-07],"30":[8.3416000000000005e-07,8.6494000000000001e-07],"25":[7.1696999999999999e-07,7.2526000000000002e-07],"31":[8.7085999999999995e-07,8.7298000000000003e-07],"1280":[6.7801890000000005e-05,7.3572147058823526e-05],"26":[7.4707000000000003e-07,8.2073999999999998e-07],"3932160":[0.80326144899999996,0.81086764249999999],"2432":[0.000132383,0.000139321],"32":[1.45413e-06,1.4705100000000002e-06],"27":[7.6995000000000004e-07,7.7952000000000003e-07],"409600":[0.029355891000000005,0.041324337499999989]}},{"title":"OrderedSet subtracting Self (75% overlap)","results":{"28":[7.4662e-07,7.8336000000000005e-07],"34":[8.9642999999999999e-07,9.5504000000000001e-07],"29":[7.5305999999999999e-07,7.6211000000000004e-07],"40":[1.2056200000000001e-06,1.4451599999999999e-06],"17408":[0.00072259600000000005,0.00073218000000000003],"1472":[7.0953684210526313e-05,7.7871659999999992e-05],"112":[3.5232e-06,3.5252500000000003e-06],"1376256":[0.22205981799999999,0.31986326399999998],"5242880":[1.0909657340000001,1.3061809394999999],"36":[9.7436999999999996e-07,1.0432700000000001e-06],"42":[1.1949499999999999e-06,1.2521700000000001e-06],"11534336":[3.1284939619999999,3.3384904290000001],"114688":[0.0054308819999999997,0.0056371299999999997],"144":[4.75691e-06,5.2324900000000004e-06],"38":[1.04462e-06,1.1389500000000001e-06],"240":[7.5977699999999999e-06,7.6408199999999995e-06],"9216":[0.000385714,0.000404206],"44":[1.2482300000000002e-06,1.7693900000000001e-06],"1664":[5.4682230000000005e-05,5.5845666666666666e-05],"196608":[0.016134343999999991,0.016211260000000002],"155648":[0.0094791209999999983,0.010070121499999999],"2816":[0.00013171859722222219,0.00013644583333333334],"50":[1.20268e-06,1.2918200000000002e-06],"2359296":[0.38853023799999997,0.423485098],"46":[1.36525e-06,1.3830999999999999e-06],"176":[6.8205299999999997e-06,7.4467499999999995e-06],"52":[1.2934900000000001e-06,1.3511099999999999e-06],"272":[8.7800000000000006e-06,9.7991500000000009e-06],"116":[3.5330600000000003e-06,3.5719000000000001e-06],"47104":[0.0025287513333333332,0.0025405626666666669],"6912":[0.00025106400000000001,0.00026371000000000001],"1856":[6.4587260000000001e-05,6.7323000000000006e-05],"48":[1.40469e-06,1.5181299999999999e-06],"2097152":[0.36533528749999999,0.42532942099999999],"54":[1.2795100000000001e-06,1.3686199999999998e-06],"2031616":[0.30466184800000001,0.343487019],"43008":[0.0020842900000000004,0.00232958075],"60":[1.5305500000000001e-06,1.5582700000000002e-06],"30720":[0.0011880039999999999,0.0011903910000000001],"56":[1.4009e-06,1.4190300000000001e-06],"62":[1.5574900000000001e-06,1.6177300000000002e-06],"58":[1.4693599999999998e-06,1.59359e-06],"3014656":[0.73658520599999999,0.81094715649999993],"64":[2.19722e-06,2.2438235294117649e-06],"8388608":[1.7641630079999999,1.868341418],"29696":[0.0011654076249999997,0.0011889841250000001],"216":[6.6114099999999998e-06,6.9753299999999995e-06],"106496":[0.0049133759999999988,0.0052649759999999993],"72":[2.43896e-06,2.5134599999999999e-06],"442368":[0.0288739935,0.029041795500000002],"147456":[0.0083072059999999993,0.0090811969999999992],"4456448":[0.91494736450000003,0.91496741500000001],"63488":[0.002798844,0.0031247200000000001],"38912":[0.0017907719999999999,0.0017991249999999999],"68":[2.1981799999999998e-06,2.3992900000000002e-06],"188416":[0.013608488,0.0137899665],"248":[7.9118299999999998e-06,8.5513200000000003e-06],"80":[2.9852499999999999e-06,3.0907400000000002e-06],"2560":[0.000109553,0.0001148803108108108],"34816":[0.001458972,0.0014628600000000001],"3712":[0.00013540200000000007,0.00014036936764705882],"3538944":[0.56269521300000003,0.61182836500000004],"76":[2.7054999999999998e-06,2.8880600000000001e-06],"4194304":[0.77397799749999996,0.89451585499999997],"851968":[0.086334542,0.132669386],"4096":[0.000150039,0.00017319694545454544],"59392":[0.0025493183333333328,0.0028745239999999998],"84":[3.1519799999999999e-06,3.1791799999999999e-06],"3276800":[0.57245841249999996,0.65748963250000003],"55296":[0.0022521430000000003,0.0024690323333333335],"688128":[0.063854475500000021,0.093117182999999992],"8192":[0.00032070500000000001,0.00033747999999999987],"10240":[0.000461576,0.0004875234000000001],"15872":[0.00063504179999999987,0.00065891499999999993],"92":[3.7405e-06,4.1209699999999996e-06],"26624":[0.00098148366666666676,0.001017497],"1792":[5.7932e-05,6.3452660377358498e-05],"11776":[0.00059371499999999987,0.000630859],"2944":[0.00014597913333333333,0.00015109999999999999],"88":[3.4159300000000002e-06,3.76046e-06],"22528":[0.0011433070000000001,0.0012348459999999999],"1245184":[0.15692650850000001,0.23074836300000001],"15728640":[3.7347191670000002,4.0459572870000002],"96":[3.4548899999999999e-06,4.1580499999999999e-06],"1984":[6.6852499999999997e-05,7.0375560000000002e-05],"139264":[0.007802837,0.0080671560000000007],"475136":[0.0294654965,0.038149982000000006],"13631488":[2.6236927759999999,3.1671011980000001],"416":[1.294361e-05,1.3076979999999999e-05],"928":[3.097344e-05,3.2163666666666665e-05],"512":[1.8085840000000002e-05,1.82348e-05],"18432":[0.00079909545454545476,0.00084922199999999985],"16777216":[3.868923353],"9728":[0.000421779,0.00042772300000000019],"1769472":[0.2768372885,0.30268635900000002],"1703936":[0.230638961,0.28253220750000002],"2048":[7.5427779999999995e-05,7.5627827586206893e-05],"14336":[0.00054053300000000016,0.00056919705882352929],"448":[1.4347229999999999e-05,1.4726730000000001e-05],"5505024":[1.2352536999999999,1.364823713],"544":[1.9051980000000002e-05,1.9872056818181818e-05],"221184":[0.0121234615,0.013794603499999999],"90112":[0.0051660119999999993,0.006038387000000001],"640":[2.3426760000000001e-05,2.5176399999999998e-05],"12800":[0.00048509299999999997,0.000486155],"262144":[0.015428423,0.017011150000000003],"589824":[0.047375530999999985,0.075706522999999998],"884736":[0.098194007,0.14257591800000002],"6144":[0.00033770300000000007,0.0003781465],"1088":[3.9170653846153848e-05,4.0397039999999996e-05],"576":[1.88356e-05,2.1778709999999999e-05],"160":[5.3496200000000001e-06,6.71518e-06],"672":[2.5829329999999999e-05,2.8375950000000001e-05],"8912896":[1.84447122,2.0301869705],"100":[3.1344700000000002e-06,3.1416999999999999e-06],"507904":[0.035057242000000009,0.055413227500000009],"3840":[0.000146413,0.00015168352307692309],"192":[9.1981900000000004e-06,9.5165400000000005e-06],"376832":[0.031098383,0.03177894299999999],"98304":[0.0065949709999999998,0.006795489],"5376":[0.00023447300000000002,0.00025576400000000001],"94208":[0.0057215089999999988,0.0059721449999999999],"81920":[0.0042763159999999996,0.0042929735],"3407872":[0.59204687249999999,0.68080928900000004],"104":[3.1795199999999999e-06,3.3159699999999997e-06],"122880":[0.006497297,0.0066238519999999995],"200":[6.1454999999999999e-06,6.2149000000000004e-06],"163840":[0.010417547500000002,0.010865979],"4063232":[0.70133471000000003,0.70691853449999997],"5767168":[1.5606781255,1.5745177610000001],"12582912":[4.1917782065000004,5.9407635394999998],"1600":[5.2099449999999995e-05,5.5084889999999998e-05],"136":[4.3685200000000003e-06,4.6180499999999998e-06],"232":[7.2196700000000001e-06,7.3895700000000008e-06],"7077888":[1.3944372569999999,1.4877191885000001],"86016":[0.0047994395000000006,0.0049867709999999992],"31744":[0.00131777,0.0013599840000000003],"168":[6.2410327868852453e-06,6.9395128205128206e-06],"622592":[0.046845445999999999,0.077810828499999984],"108":[3.3659800000000003e-06,3.8150300000000003e-06],"327680":[0.022659416999999998,0.023210089],"2176":[8.2631619999999991e-05,8.4759999999999995e-05],"3328":[0.0001194478313253012,0.00013247544444444444],"1":[7.7849999999999986e-08,8.1540000000000001e-08],"2":[9.7100000000000003e-08,1.0152e-07],"3":[1.1378e-07,1.1612e-07],"4":[2.4931e-07,2.5059999999999998e-07],"7424":[0.00029410624242424239,0.00030125980645161296],"5":[2.6590000000000002e-07,2.6852999999999998e-07],"23552":[0.0012626737142857141,0.0013236284285714291],"6":[2.8370999999999999e-07,2.8503000000000001e-07],"61440":[0.0026615173333333331,0.0027917826666666668],"491520":[0.030691611000000001,0.063270998499999981],"77824":[0.0038859049999999998,0.0040539034999999991],"7":[3.0251999999999999e-07,3.2141999999999998e-07],"8":[3.3059000000000005e-07,3.4542999999999999e-07],"208":[6.4156200000000006e-06,6.5876100000000001e-06],"9":[3.4625999999999998e-07,3.5433999999999998e-07],"73728":[0.0034953370000000003,0.004096274999999999],"304":[1.0650530000000001e-05,1.1286219999999998e-05],"400":[1.2554899999999999e-05,1.2621550000000001e-05],"1310720":[0.19730576599999999,0.26480442000000004],"336":[1.2844119999999999e-05,1.6605979999999999e-05],"3670016":[0.60082216499999996,0.66582843849999995],"6656":[0.000225534,0.000242802],"15360":[0.0005956300000000001,0.00061014199999999993],"432":[1.4020309999999999e-05,1.482772e-05],"950272":[0.092832176500000002,0.12439903400000001],"655360":[0.056739806000000004,0.099110073999999992],"69632":[0.0031653296666666669,0.003301844999999999],"11264":[0.000555603,0.00057836699999999988],"2752512":[0.59517487599999996,0.67504112599999999],"8126464":[1.6967481119999999,1.701314999],"27648":[0.0010002640000000001,0.0010707845555555555],"368":[1.5893730000000002e-05,2.0591999999999999e-05],"65536":[0.0030379809999999995,0.0031020676666666672],"16252928":[3.6501307865000001,3.7600020710000002],"464":[1.5612619999999998e-05,1.6017270000000001e-05],"1015808":[0.12549992900000001,0.183941986],"3072":[0.000168882,0.00017332799999999999],"110592":[0.0052277790000000001,0.0058397749999999993],"237568":[0.0134989295,0.013902623499999999],"278528":[0.017798545000000002,0.01902440599999999],"496":[1.6481700000000002e-05,1.8949666666666666e-05],"13107200":[2.706111999,2.9367728505000001],"9961472":[2.3655103999999998,2.474372786],"5888":[0.000290947,0.00029188599999999999],"11010048":[2.6227429459999998,2.9046009750000001],"1920":[6.7834319999999997e-05,6.8107570000000003e-05],"2490368":[0.45246366400000004,0.51828903800000004],"19456":[0.00087162000000000003,0.00090215200000000014],"57344":[0.0023740455000000001,0.0025445230000000004],"1179648":[0.13554517449999998,0.19655538700000003],"4718592":[0.97709650049999996,1.0164674665],"360448":[0.0277517475,0.036099249],"1572864":[0.30937681699999997,0.34459760849999999],"53248":[0.0021772529999999997,0.002220419],"3456":[0.00012758441333333336,0.00014153399999999999],"40960":[0.0019365150000000002,0.0019583730000000002],"4608":[0.000186159,0.000190843],"13824":[0.00052594111111111124,0.0005432630000000001],"819200":[0.072198695999999993,0.1059319215],"983040":[0.1132216445,0.152046287],"8704":[0.00035462599999999998,0.00037088800000000004],"120":[3.6663199999999997e-06,4.0052500000000003e-06],"1024":[3.4482060000000004e-05,3.6545700000000005e-05],"49152":[0.0028549400000000011,0.002913746],"524288":[0.034998451,0.058983909500000001],"45056":[0.0022871982500000006,0.0024474452500000002],"229376":[0.0130456045,0.013785703999999999],"2688":[0.0001163875,0.00014024],"152":[4.9380400000000002e-06,5.0958799999999992e-06],"5120":[0.00022887499999999999,0.00025113666666666664],"1507328":[0.25000186800000002,0.355750175],"1216":[4.6422490000000004e-05,4.726158e-05],"1966080":[0.34205089599999999,0.35041841099999999],"1900544":[0.27610561750000001,0.32780856899999999],"184":[7.0445399999999995e-06,8.5890000000000003e-06],"7936":[0.000306361,0.00032003289655172423],"3801088":[0.64445430300000006,0.65590814499999994],"6815744":[1.3331628819999999,1.474752659],"124":[4.0036600000000001e-06,4.6227300000000002e-06],"102400":[0.0046621300000000004,0.0048146700000000001],"311296":[0.020906985999999999,0.023071820500000007],"1408":[6.1752699999999996e-05,6.6133030000000001e-05],"393216":[0.039323787999999998,0.039648071],"4352":[0.00017276699999999999,0.00017757599999999995],"6553600":[1.2500323820000001,1.4189778209999999],"20480":[0.00097381300000000013,0.00097916766666666694],"608":[2.2197160000000002e-05,2.307434e-05],"2228224":[0.37176037299999998,0.41122675149999999],"36864":[0.001635629,0.0018145220000000001],"704":[2.811746e-05,2.9210999999999999e-05],"720896":[0.070610384499999998,0.11042274000000001],"800":[2.3958e-05,2.4983509999999996e-05],"2621440":[0.47342606899999995,0.54601453099999997],"425984":[0.027886979999999999,0.041294501999999997],"32768":[0.0013691834285714283,0.0013803605714285713],"12058624":[3.4158498384999998,3.5222134280000001],"128":[4.2378700000000001e-06,4.6153699999999995e-06],"180224":[0.012617424,0.013276115],"224":[7.0149000000000004e-06,7.0892700000000005e-06],"736":[3.0839219999999996e-05,3.1336430000000002e-05],"320":[1.1708389999999999e-05,1.3723539999999999e-05],"557056":[0.041143809999999996,0.06747863400000001],"832":[2.6466879999999998e-05,2.8217979999999998e-05],"9437184":[2.2623859130000001,2.409789425],"3584":[0.000127887,0.00013732600000000001],"6291456":[1.8559077209999999,1.8881021575000001],"256":[8.3622799999999998e-06,8.783439999999999e-06],"15204352":[3.0881520500000001,3.6277448809999999],"28672":[0.001078704,0.001208471],"768":[3.7218257575757579e-05,4.1677000000000001e-05],"212992":[0.011342383500000001,0.013210731],"864":[2.7983420000000002e-05,2.9028080000000003e-05],"352":[1.4268020000000001e-05,1.4696279999999999e-05],"253952":[0.0148455385,0.016101239],"960":[3.3718089999999998e-05,3.3724050000000001e-05],"24576":[0.0014241421666666666,0.0014387788],"7680":[0.00029117800000000001,0.00030796600000000001],"294912":[0.02068563,0.025181770000000003],"1048576":[0.11172153350000003,0.16346065100000001],"10485760":[2.293280132,2.6738720075],"344064":[0.024590299999999992,0.0271682325],"288":[9.6275000000000006e-06,1.0526780000000001e-05],"1152":[4.4623400000000004e-05,4.6155357142857146e-05],"384":[1.5672879999999999e-05,1.6155999999999999e-05],"2304":[9.3221999999999996e-05,9.4328999999999998e-05],"896":[2.8336210000000002e-05,3.009884e-05],"480":[1.5216e-05,1.6254000000000001e-05],"1441792":[0.25173169400000001,0.314975383],"992":[3.4009639999999996e-05,3.50105e-05],"3968":[0.000151528,0.00015727499999999999],"6400":[0.000215062,0.00024941310256410259],"1344":[5.5988179999999999e-05,5.8122071428571428e-05],"126976":[0.0064115229999999997,0.00698863],"2883584":[0.61269984099999997,0.67285815250000003],"753664":[0.077643282000000008,0.12231254799999999],"16384":[0.00065941400000000009,0.00074678423076923045],"131072":[0.0070396009999999995,0.007079155000000001],"458752":[0.031803745499999994,0.034909236499999982],"172032":[0.0121036965,0.012348909],"12288":[0.000651799,0.00070845484615384628],"14680064":[3.3305324685,7.2987932129999997],"1536":[7.6642200000000003e-05,7.8306200000000006e-05],"25600":[0.00096104955555555561,0.00097946100000000005],"1835008":[0.26831199849999998,0.33795300750000001],"10752":[0.00051424200000000004,0.00053879949999999992],"21504":[0.0010347399999999999,0.0012006880000000001],"7602176":[1.6216292354999999,1.663094165],"5632":[0.00027467908333333335,0.00027885766666666662],"10":[3.6591999999999998e-07,4.2024000000000001e-07],"3145728":[0.77010246199999999,0.81633913749999998],"245760":[0.015263498,0.015294743499999999],"1728":[5.7170309999999998e-05,6.1183159999999998e-05],"11":[3.9174000000000004e-07,4.1698000000000002e-07],"1114112":[0.14884596699999997,0.19697883499999999],"12":[4.2336999999999996e-07,4.2726999999999999e-07],"7340032":[1.4433880750000001,1.6846917895],"7168":[0.00027052800000000002,0.00028843400000000001],"13":[4.2670000000000003e-07,4.4419999999999997e-07],"6029312":[1.567384471,1.570369946],"14":[4.5411000000000003e-07,4.6040000000000002e-07],"3200":[0.00010724039999999994,0.00011759708333333332],"20":[6.1655000000000005e-07,6.2522999999999994e-07],"204800":[0.011223366,0.011797318000000001],"15":[5.4109000000000004e-07,5.5611000000000002e-07],"13312":[0.000479486,0.00054770800000000027],"4980736":[1.1085854634999999,1.2234268880000001],"118784":[0.0062312970000000002,0.0064347730000000004],"51200":[0.0019928685000000002,0.0020240970000000003],"16":[5.3959000000000003e-07,5.8493999999999994e-07],"21":[6.6773999999999992e-07,8.1142e-07],"917504":[0.097867627499999998,0.14588541499999999],"22":[6.8810999999999999e-07,7.202e-07],"4864":[0.000210607,0.00021342966666666667],"17":[5.2096999999999999e-07,5.5639000000000002e-07],"14848":[0.0005642100000000001,0.00058919300000000012],"23":[7.2358000000000002e-07,7.6542000000000003e-07],"786432":[0.083204785999999975,0.13330845000000002],"18":[5.9918e-07,6.2374999999999996e-07],"1638400":[0.21671969899999999,0.22528858500000004],"7864320":[1.4717539390000001,1.5782687005],"24":[7.2242000000000009e-07,7.4313999999999997e-07],"14155776":[2.982236946,3.271700896],"19":[5.5522000000000002e-07,6.0348e-07],"30":[7.9284999999999996e-07,8.1310999999999995e-07],"25":[6.7258e-07,7.0463000000000008e-07],"31":[8.1242999999999992e-07,8.3506000000000001e-07],"1280":[4.9232260000000004e-05,5.5182098765432093e-05],"26":[7.2765000000000003e-07,7.3286000000000007e-07],"3932160":[0.76695733349999995,0.78550760899999994],"2432":[0.000102911,0.00010555633333333336],"32":[8.6162000000000006e-07,8.6318999999999999e-07],"27":[7.0885e-07,7.3423000000000008e-07],"409600":[0.0237045055,0.031863442000000006]}},{"title":"OrderedSet subtracting Self (100% overlap)","results":{"28":[5.9880999999999995e-07,6.0253000000000004e-07],"34":[7.3178000000000001e-07,7.7449999999999995e-07],"29":[6.3075000000000006e-07,6.3257999999999996e-07],"40":[9.1063999999999995e-07,9.4076999999999997e-07],"17408":[0.00051674000000000002,0.00057340706250000003],"1472":[4.3602880000000001e-05,4.5048040000000002e-05],"112":[2.3204400000000001e-06,2.4077700000000001e-06],"1376256":[0.16772637200000001,0.26059716599999999],"5242880":[1.1153910760000001,1.1444067680000001],"36":[8.0171000000000005e-07,8.3014000000000005e-07],"42":[9.4795000000000007e-07,1.0933e-06],"11534336":[2.5011848080000001,2.6135704190000002],"114688":[0.0043615705000000001,0.0045675509999999996],"144":[3.2818199999999998e-06,3.6170299999999998e-06],"38":[8.5888000000000003e-07,8.7367000000000001e-07],"240":[5.0468500000000006e-06,5.3791799999999995e-06],"9216":[0.00025915700000000004,0.00028667600000000003],"44":[9.9716999999999998e-07,1.1537999999999999e-06],"1664":[3.7289000000000002e-05,3.9644290000000002e-05],"196608":[0.011391808,0.011641649],"155648":[0.0074306340000000002,0.0080824299999999998],"2816":[8.3821999999999998e-05,8.8758505154639167e-05],"50":[1.0372799999999999e-06,1.13985e-06],"2359296":[0.3770571855,0.43591242499999999],"46":[1.06635e-06,1.09624e-06],"176":[4.1478000000000003e-06,4.5230499999999998e-06],"52":[1.0815999999999999e-06,1.1499800000000001e-06],"272":[6.0508100000000004e-06,6.6186100000000003e-06],"116":[2.4417999999999996e-06,2.5069799999999998e-06],"47104":[0.0017144340000000001,0.0017432443999999994],"6912":[0.00018243722916666671,0.0001864693333333333],"1856":[4.4210489999999999e-05,4.4359e-05],"48":[1.13033e-06,1.19958e-06],"2097152":[0.30123397400000002,0.30865165350000001],"54":[1.1072499999999999e-06,1.13781e-06],"2031616":[0.26132654300000002,0.26755943799999998],"43008":[0.0014149729999999999,0.0015141250000000001],"60":[1.21279e-06,1.2917399999999999e-06],"30720":[0.00083744000000000006,0.00086604063636363626],"56":[1.21463e-06,1.2213999999999999e-06],"62":[1.3670199999999999e-06,1.4062e-06],"58":[1.2424199999999999e-06,1.25694e-06],"3014656":[0.61236452249999995,0.67492996800000005],"64":[1.3696800000000001e-06,1.4201555555555556e-06],"8388608":[1.5167958210000001,1.5454502025000001],"29696":[0.00083818554545454543,0.00084169518181818176],"216":[4.5558099999999995e-06,4.5786699999999995e-06],"106496":[0.0039052120000000004,0.0046390945000000005],"72":[1.5626299999999999e-06,1.6295099999999999e-06],"442368":[0.024760321000000002,0.02549042],"147456":[0.006390385000000001,0.0071982359999999994],"4456448":[0.69548043199999998,0.75663691899999996],"63488":[0.0020112350000000001,0.0020641120000000003],"38912":[0.0012708297142857146,0.001349325],"68":[1.4719700000000001e-06,1.5465499999999998e-06],"188416":[0.0105416355,0.011562514999999999],"248":[5.2674199999999995e-06,5.68292e-06],"80":[1.8061299999999999e-06,1.82524e-06],"2560":[7.1728000000000002e-05,7.3479999999999994e-05],"34816":[0.001028246,0.001065903],"3712":[9.1397000000000006e-05,9.2229000000000001e-05],"3538944":[0.50919661699999996,0.65244468249999998],"76":[1.70523e-06,1.8005599999999999e-06],"4194304":[0.65310692799999992,0.71750066000000001],"851968":[0.087992143000000009,0.1138633895],"4096":[0.00010935633333333335,0.000113575],"59392":[0.0017660919999999999,0.0020652170000000003],"84":[1.9755700000000002e-06,1.9918300000000001e-06],"3276800":[0.55124532299999995,0.62908646800000001],"55296":[0.0016012458000000001,0.0016384298000000001],"688128":[0.047323282999999987,0.084696153499999982],"8192":[0.000217643,0.00024765476470588237],"10240":[0.00031688299999999995,0.00033066993103448271],"15872":[0.00044376399999999997,0.00047041499999999996],"92":[2.2810599999999998e-06,2.3678499999999997e-06],"26624":[0.00071516515384615373,0.00074543791666666656],"1792":[3.9462000000000003e-05,4.3926269999999998e-05],"11776":[0.00040086199999999993,0.0004320280000000001],"2944":[9.7283535353535357e-05,9.760420000000001e-05],"88":[2.0853799999999998e-06,2.1681700000000003e-06],"22528":[0.00080503324999999979,0.000806319],"1245184":[0.13353629349999999,0.20685543950000002],"15728640":[3.0034880620000002,3.1192065675],"96":[2.1703100000000001e-06,2.6284499999999998e-06],"1984":[4.8874945652173911e-05,4.9843968421052636e-05],"139264":[0.0059819000000000001,0.0066128359999999995],"475136":[0.023399772999999995,0.037234423000000003],"13631488":[2.8441948269999999,2.9932349459999998],"416":[8.7657499999999999e-06,9.0633599999999992e-06],"928":[2.0658000000000001e-05,2.2648880000000001e-05],"512":[1.1696333333333334e-05,1.263669e-05],"18432":[0.00056423505882352933,0.00063006099999999979],"16777216":[3.2816063245000002],"9728":[0.00029811740624999998,0.000314417],"1769472":[0.21890352399999999,0.22312820999999999],"1703936":[0.23988837149999998,0.26875729100000001],"2048":[5.0597999999999999e-05,5.0840743902439019e-05],"14336":[0.00038519199999999997,0.00038560478260869573],"448":[9.9703500000000002e-06,1.028054e-05],"5505024":[1.13779714,1.1498536150000001],"544":[1.306244e-05,1.3690119999999999e-05],"221184":[0.0098923659999999997,0.0119648245],"90112":[0.003648503,0.0038371905],"640":[1.658964197530864e-05,1.6804588235294117e-05],"12800":[0.00034102500000000001,0.00034644999999999999],"262144":[0.012394420999999999,0.014855021499999999],"589824":[0.032654308999999999,0.062686463999999997],"884736":[0.10763265300000002,0.12562247100000001],"6144":[0.00022521500000000002,0.00023166107499999989],"1088":[2.758073e-05,2.7672040000000001e-05],"576":[1.430305e-05,1.460093e-05],"160":[3.6239799999999998e-06,4.2643099999999998e-06],"672":[1.7063320000000001e-05,1.825834e-05],"8912896":[1.663567461,1.6687758619999999],"100":[2.0886199999999999e-06,2.1517399999999999e-06],"507904":[0.031863905499999998,0.052674955000000002],"3840":[9.6230857142857144e-05,0.000109654],"192":[5.0312857142857144e-06,5.42774e-06],"376832":[0.023207005999999999,0.0351784105],"98304":[0.0045350524999999992,0.0047909759999999989],"5376":[0.00017251499999999998,0.000178868],"94208":[0.0041129315,0.0041674120000000005],"81920":[0.0030051626666666672,0.0030998386666666665],"3407872":[0.48214234099999997,0.57445564400000004],"104":[2.16414e-06,2.1703000000000002e-06],"122880":[0.0050810990000000004,0.0053282080000000009],"200":[4.1117400000000002e-06,4.3239600000000002e-06],"163840":[0.0078438129999999998,0.0085814709999999985],"4063232":[0.62881275300000006,0.68883998400000002],"5767168":[1.1926787875,1.3154484769999999],"12582912":[3.0925076640000002,5.5295782219999996],"1600":[3.6484540000000002e-05,3.779917e-05],"136":[3.0509599999999998e-06,3.1109900000000001e-06],"232":[5.0054600000000004e-06,5.0308000000000002e-06],"7077888":[1.3975232310000001,1.4075373120000001],"86016":[0.0034720999999999997,0.0034955440000000006],"31744":[0.00095033100000000022,0.00096781040000000018],"168":[3.8717800000000002e-06,4.3915600000000002e-06],"622592":[0.036756357500000003,0.055795742000000002],"108":[2.23065e-06,2.2571399999999998e-06],"327680":[0.017917349999999999,0.018780066499999998],"2176":[5.5307186666666666e-05,5.7692140845070418e-05],"3328":[8.2256999999999995e-05,9.1739166666666671e-05],"1":[7.7589999999999995e-08,8.1199999999999999e-08],"2":[9.6870000000000006e-08,9.7100000000000003e-08],"3":[1.1465e-07,1.1511999999999999e-07],"4":[1.3196999999999998e-07,1.3404e-07],"7424":[0.000198042,0.000213783],"5":[1.4969000000000001e-07,1.5072000000000002e-07],"23552":[0.00087310980000000012,0.0008755010000000001],"6":[1.6807999999999998e-07,1.6850999999999999e-07],"61440":[0.001887103,0.002002176],"491520":[0.025202227000000001,0.054931069999999992],"77824":[0.0028007053333333337,0.0029752366666666663],"7":[1.8734000000000001e-07,1.8743999999999999e-07],"8":[2.1169000000000001e-07,2.1180999999999999e-07],"208":[4.3948199999999995e-06,4.4616900000000001e-06],"9":[2.2655e-07,2.2872999999999998e-07],"73728":[0.002517493,0.0026671629999999993],"304":[7.17896e-06,7.1956899999999997e-06],"400":[8.525660000000001e-06,8.5835299999999988e-06],"1310720":[0.14378201700000001,0.2368674295],"336":[8.6132099999999998e-06,9.44645e-06],"3670016":[0.61896812700000003,0.65317295399999997],"6656":[0.00016735,0.0001675275],"15360":[0.00041795500000000007,0.00042338800000000007],"432":[9.5358900000000006e-06,1.0860530000000001e-05],"950272":[0.080647636499999995,0.11056838300000005],"655360":[0.046978744999999995,0.071461602999999999],"69632":[0.0022998064999999999,0.0024036930000000001],"11264":[0.00037051900000000003,0.00037860855999999999],"2752512":[0.46530232100000002,0.60612956949999997],"8126464":[1.5150890930000001,1.6183866120000001],"27648":[0.00070155200000000003,0.00076811100000000003],"368":[1.048178e-05,1.1353139999999999e-05],"65536":[0.0021157414999999997,0.0022337387499999995],"16252928":[3.2134383949999998,3.2540381730000001],"464":[1.059816e-05,1.1124350000000001e-05],"1015808":[0.10579255100000001,0.17938728600000001],"3072":[0.000106673,0.00010929889473684212],"110592":[0.0041358554999999997,0.0045338990000000001],"237568":[0.010937041,0.011600955],"278528":[0.013904215000000001,0.014471378999999996],"496":[1.119807e-05,1.2304040000000001e-05],"13107200":[2.2918023860000001,2.581225178],"9961472":[1.9668717885,2.1020713579999999],"5888":[0.000204895,0.00020509083333333328],"11010048":[2.2954995490000001,2.436476098],"1920":[4.6722070000000002e-05,4.8000889999999996e-05],"2490368":[0.42685153300000001,0.48937961899999999],"19456":[0.00060523499999999997,0.00061342913333333328],"57344":[0.0017083750000000005,0.0017857598000000003],"1179648":[0.11481292749999999,0.179009063],"4718592":[0.80935124899999999,0.82893771900000002],"360448":[0.021477131,0.027680252000000006],"1572864":[0.25882507999999999,0.27719623599999998],"53248":[0.0015225187999999997,0.0015675705000000001],"3456":[8.7605159999999997e-05,0.000100787],"40960":[0.0013169360000000001,0.0013688785714285714],"4608":[0.00013049950000000002,0.00013189199999999999],"13824":[0.00034830500000000003,0.00038469199999999995],"819200":[0.064109044000000018,0.089619490999999996],"983040":[0.1078352435,0.13767702200000001],"8704":[0.00024947136842105264,0.000257571],"120":[2.4129400000000001e-06,2.65632e-06],"1024":[2.3152000000000001e-05,2.5992639999999999e-05],"49152":[0.0019171532500000001,0.0019663329999999998],"524288":[0.033615367,0.049498637000000005],"45056":[0.0015565820000000004,0.0016764919999999999],"229376":[0.011196691999999999,0.011662198],"2688":[7.8947653846153857e-05,8.4814166666666679e-05],"152":[3.4243e-06,3.6337700000000003e-06],"5120":[0.00015383200000000004,0.000154358],"1507328":[0.194429723,0.32868109200000001],"1216":[3.2180049999999997e-05,3.2360470000000001e-05],"1966080":[0.28065765799999998,0.3432997425],"1900544":[0.24405324100000003,0.28337550449999999],"184":[4.3945699999999998e-06,4.8207499999999995e-06],"7936":[0.00020787599999999999,0.00021565199999999993],"3801088":[0.61720771500000005,0.65810244699999998],"6815744":[1.0722268100000001,1.4075748539999999],"124":[2.7591200000000001e-06,3.01442e-06],"102400":[0.0037228165000000001,0.0038433955000000005],"311296":[0.016111406000000005,0.019278661999999998],"1408":[4.0278000000000003e-05,4.1939309999999994e-05],"393216":[0.025053963500000005,0.028221580999999996],"4352":[0.00011992699999999999,0.00012756200000000001],"6553600":[1.0757499859999999,1.2202036194999999],"20480":[0.0006374769999999999,0.0006926399999999999],"608":[1.4936931818181818e-05,1.502593e-05],"2228224":[0.30941677749999996,0.33693785399999998],"36864":[0.001090288,0.001169507],"704":[1.8519350000000001e-05,1.961377e-05],"720896":[0.053462201000000008,0.10422018850000001],"800":[1.7075000000000002e-05,1.7775250000000002e-05],"2621440":[0.43952194700000002,0.46336869450000001],"425984":[0.024506723999999997,0.038456236999999997],"32768":[0.00093372699999999997,0.0010059419999999999],"12058624":[2.8990915514999998,2.975688726],"128":[2.8752999999999998e-06,2.9329099999999998e-06],"180224":[0.0098066560000000004,0.0101763745],"224":[4.7482900000000001e-06,4.7850900000000003e-06],"736":[1.9566090000000002e-05,2.0211610000000002e-05],"320":[7.9369199999999999e-06,8.5443333333333339e-06],"557056":[0.036553088999999997,0.044868934000000006],"832":[1.791e-05,1.8434e-05],"9437184":[1.955103772,2.1506596189999998],"3584":[8.8545777777777771e-05,9.3855829999999992e-05],"6291456":[1.4326282379999999,1.475054294],"256":[5.4538600000000002e-06,6.0157099999999997e-06],"15204352":[2.776477571,3.2203326794999998],"28672":[0.00077869600000000027,0.00081598700000000001],"768":[2.201783e-05,2.37447e-05],"212992":[0.0091692579999999996,0.011288214499999998],"864":[1.8458076923076922e-05,1.9262999999999998e-05],"352":[9.1014000000000006e-06,9.4010399999999997e-06],"253952":[0.0119135965,0.013685197],"960":[2.3659500000000003e-05,2.3801489999999998e-05],"24576":[0.00092246890000000016,0.00095123899999999988],"7680":[0.00019878079999999997,0.00021565400000000002],"294912":[0.017353883000000004,0.019310681499999999],"1048576":[0.115144105,0.16219827000000001],"10485760":[2.023059205,2.210857141],"344064":[0.01887901450000001,0.027064538000000006],"288":[6.4620000000000001e-06,7.0439500000000005e-06],"1152":[2.7763000000000002e-05,2.9561809999999999e-05],"384":[1.0232939999999999e-05,1.0502e-05],"2304":[6.5283549999999989e-05,6.5283904761904765e-05],"896":[2.0974169999999998e-05,2.1171879999999998e-05],"480":[1.0529666666666667e-05,1.1336090000000001e-05],"1441792":[0.21980351549999999,0.26628445499999998],"992":[2.353262e-05,2.4178099999999998e-05],"3968":[0.00010817549999999998,0.00010883772839506176],"6400":[0.00016219100000000003,0.00017089199999999999],"1344":[3.6413440000000002e-05,3.8767829787234038e-05],"126976":[0.0052025680000000003,0.005657591],"2883584":[0.49611603199999998,0.55574567099999994],"753664":[0.067319248999999998,0.089338977999999999],"16384":[0.00044672399999999991,0.00049306100000000004],"131072":[0.005447309,0.0054493980000000011],"458752":[0.027452709500000005,0.046907889000000001],"172032":[0.0090769830000000003,0.0093403719999999996],"12288":[0.0004423129999999999,0.00046896999999999998],"14680064":[2.7190024555000001,6.8504026654999999],"1536":[4.6710857142857137e-05,4.9063870000000001e-05],"25600":[0.000669475,0.00069615499999999973],"1835008":[0.22881410099999999,0.2452115],"10752":[0.00035777299999999998,0.00036752099999999994],"21504":[0.00069248300000000003,0.00080989100000000008],"7602176":[1.2604033784999999,1.628649016],"5632":[0.000177596,0.00018790775],"10":[2.5217000000000001e-07,2.7684000000000004e-07],"3145728":[0.64132194200000003,0.66923357250000004],"245760":[0.011782833500000001,0.0129078975],"1728":[3.8121000000000003e-05,4.2615793103448276e-05],"11":[2.6502000000000003e-07,2.7088e-07],"1114112":[0.1241281625,0.16267844400000001],"12":[2.9086e-07,2.9362e-07],"7340032":[1.335462615,1.4937421479999999],"7168":[0.00017904300000000001,0.0001979545],"13":[3.0142000000000001e-07,3.0319e-07],"6029312":[1.3005445920000001,1.3141193849999999],"14":[3.1139999999999994e-07,3.2692999999999998e-07],"3200":[7.3560999999999996e-05,8.3024779999999997e-05],"20":[4.3825999999999996e-07,5.2370000000000006e-07],"204800":[0.0099471469999999999,0.010051919499999999],"15":[3.4746000000000002e-07,3.4789000000000003e-07],"13312":[0.00034529199999999992,0.00038857100000000004],"4980736":[0.950052173,1.0629348925],"118784":[0.0046458974999999993,0.0050218520000000011],"51200":[0.0013893130000000001,0.001470493],"16":[4.0034000000000005e-07,4.2467e-07],"21":[4.6447999999999999e-07,5.7187e-07],"917504":[0.088752570999999988,0.1318993],"22":[5.5863000000000002e-07,5.9986000000000003e-07],"4864":[0.00014696522727272726,0.00015330199999999999],"17":[3.9372000000000001e-07,4.1739000000000001e-07],"14848":[0.00041588986956521743,0.00041915047826086946],"23":[5.4790999999999993e-07,6.6998999999999998e-07],"786432":[0.061841822999999997,0.099730911999999991],"18":[4.0200000000000003e-07,4.2017000000000004e-07],"1638400":[0.24338149999999997,0.26834382300000004],"7864320":[1.3335958765,1.388492225],"24":[5.4914000000000001e-07,5.9587e-07],"14155776":[2.4963505979999998,3.0685546540000002],"19":[4.1223000000000003e-07,4.5819999999999996e-07],"30":[6.5143999999999996e-07,6.7787999999999998e-07],"25":[5.3971428571428577e-07,5.6363999999999993e-07],"31":[6.7405999999999999e-07,6.8732999999999995e-07],"1280":[3.4096e-05,3.519697e-05],"26":[5.5731999999999996e-07,5.5909999999999997e-07],"3932160":[0.719213773,0.76256674349999998],"2432":[6.9029000000000006e-05,6.9727000000000005e-05],"32":[6.7622999999999996e-07,7.2396000000000003e-07],"27":[5.7862999999999993e-07,6.3182999999999991e-07],"409600":[0.0189800855,0.023706910500000001]}},{"title":"OrderedSet union with Array (0% overlap)","results":{"28":[2.7651e-06,2.9067299999999996e-06],"34":[3.1455699999999996e-06,3.1953000000000001e-06],"29":[2.9556000000000001e-06,3.2521600000000001e-06],"40":[3.4290999999999999e-06,3.67098e-06],"17408":[0.0017266270000000001,0.0018181129999999997],"1472":[0.00013600399999999998,0.00014077624193548386],"112":[1.0890609999999999e-05,1.098838e-05],"1376256":[0.35375883899999999,0.47500707399999997],"5242880":[1.9728551315,1.9836887125],"36":[3.0486899999999999e-06,3.7629999999999998e-06],"42":[3.4493199999999999e-06,4.1315199999999999e-06],"11534336":[4.5357292224999997,4.6147214850000005],"114688":[0.015668551499999999,0.016229063500000005],"144":[1.33734e-05,1.410672e-05],"38":[3.4323900000000001e-06,3.6499500000000001e-06],"240":[2.4202030000000002e-05,2.423411e-05],"9216":[0.00091677499999999988,0.000957113],"44":[3.70791e-06,3.79934e-06],"1664":[0.00019713488372093021,0.00019722900000000007],"196608":[0.0237474095,0.024834519500000003],"155648":[0.019692482000000004,0.021057938500000001],"2816":[0.00024998399999999997,0.00028653490909090912],"50":[5.2333399999999998e-06,5.6749999999999999e-06],"2359296":[0.77193817200000003,0.79403561599999994],"46":[3.95421e-06,4.0932e-06],"176":[1.5579480000000001e-05,1.6089222222222219e-05],"52":[5.1806666666666668e-06,5.5761300000000003e-06],"272":[2.545976e-05,2.8043780000000003e-05],"116":[1.1167160000000001e-05,1.1509179999999998e-05],"47104":[0.0047529384999999997,0.0048790069999999994],"6912":[0.00076676200000000004,0.00083973800000000014],"1856":[0.00020037204081632654,0.00021654500000000001],"48":[4.0113e-06,4.1017400000000003e-06],"2097152":[0.73467103450000004,0.77580178849999992],"54":[5.6844500000000003e-06,6.4047599999999998e-06],"2031616":[0.70169495800000004,0.70354202199999993],"43008":[0.0043191089999999998,0.0046092215000000008],"60":[5.8001799999999994e-06,6.8748699999999996e-06],"30720":[0.0034439205000000002,0.0035179234999999998],"56":[5.5905799999999998e-06,5.8505099999999991e-06],"62":[5.6826800000000001e-06,5.9861882352941171e-06],"58":[5.6420299999999999e-06,5.8718700000000001e-06],"3014656":[1.018937153,1.0870381899999999],"64":[6.2644999999999999e-06,6.6998700000000004e-06],"8388608":[3.6232203914999999,3.6308825279999999],"29696":[0.0033661400000000001,0.0035476094999999999],"216":[2.2257230000000003e-05,2.3746689999999997e-05],"106496":[0.015055494499999999,0.016845871500000009],"72":[6.4869999999999999e-06,7.0560999999999992e-06],"442368":[0.083478937000000003,0.093505450999999962],"147456":[0.018352846500000002,0.019308761000000001],"4456448":[1.727462552,1.727838596],"63488":[0.0074203709999999994,0.0080414149999999997],"38912":[0.0041180690000000002,0.004483949000000001],"68":[6.2008799999999997e-06,6.3915200000000003e-06],"188416":[0.024480042,0.026089377],"248":[2.3051750000000002e-05,2.5975809999999997e-05],"80":[6.8309500000000002e-06,7.2782800000000006e-06],"2560":[0.00024649252500000014,0.00025354900000000005],"34816":[0.0036860400000000002,0.0037451295],"3712":[0.00039143700000000001,0.000401376],"3538944":[1.52919044,1.5413025345],"76":[6.9812600000000001e-06,7.3393600000000001e-06],"4194304":[1.653435164,1.7724737849999999],"851968":[0.220871964,0.32573538550000003],"4096":[0.00041572099999999997,0.00041913699999999998],"59392":[0.0071530439999999999,0.0075762149999999999],"84":[6.9724999999999997e-06,7.8819100000000006e-06],"3276800":[1.4426440775,1.4614106279999999],"55296":[0.0069044600000000029,0.007249442],"688128":[0.12503897,0.1594247835],"8192":[0.00084427600000000025,0.00089908172727272732],"10240":[0.0010362626666666668,0.0010524847777777775],"15872":[0.0016866920000000001,0.0017672409999999999],"92":[7.5662799999999993e-06,8.1141999999999993e-06],"26624":[0.003196777,0.0032493720000000004],"1792":[0.00018716199999999999,0.00020146939999999999],"11776":[0.001097546,0.001150519],"2944":[0.00025505999999999999,0.00026985400000000004],"88":[7.5560399999999996e-06,8.2646599999999996e-06],"22528":[0.0021539452499999999,0.0021747300000000006],"1245184":[0.32354977200000001,0.42407015349999999],"15728640":[7.2971798794999998,7.41069288],"96":[7.8503100000000007e-06,8.2290099999999993e-06],"1984":[0.00020891400000000007,0.00021009000000000002],"139264":[0.018353662,0.018697567999999998],"475136":[0.087692949999999992,0.11103244299999999],"13631488":[6.8657207040000001,7.050047395],"416":[4.3389870000000001e-05,4.5145660000000001e-05],"928":[9.6436999999999998e-05,9.782999999999999e-05],"512":[5.3627900000000002e-05,5.5719397435897438e-05],"18432":[0.0018344875999999999,0.001923351],"16777216":[7.5414231589999998],"9728":[0.00092695700000000017,0.00101716],"1769472":[0.64849791299999993,0.69199704849999999],"1703936":[0.63637995300000005,0.689397959],"2048":[0.00020221899999999996,0.0002114745],"14336":[0.0016024978333333336,0.0016469630000000002],"448":[4.8942333333333334e-05,4.9739663265306128e-05],"5505024":[2.0633942895000001,2.0752466799999998],"544":[5.5195297297297291e-05,5.6138999999999999e-05],"221184":[0.034113791999999976,0.038521495000000003],"90112":[0.0101223735,0.010486439],"640":[5.875206e-05,6.3708269999999999e-05],"12800":[0.001532481,0.001650295],"262144":[0.039663805500000003,0.040326406000000002],"589824":[0.1023084735,0.150987658],"884736":[0.237877751,0.33765618250000001],"6144":[0.00058236699999999998,0.00060647766666666676],"1088":[0.000104546,0.000114244],"576":[5.6541129999999995e-05,5.7560279999999997e-05],"160":[1.4239e-05,1.580109e-05],"672":[6.2272810000000005e-05,6.2974959999999996e-05],"8912896":[3.7133181089999998,3.7289380434999999],"100":[1.0375e-05,1.112222e-05],"507904":[0.090926906000000002,0.1718642175],"3840":[0.00039710200000000003,0.000442433],"192":[1.6516360000000001e-05,1.6923599999999998e-05],"376832":[0.054752087000000019,0.058869322499999988],"98304":[0.0111697575,0.01169593],"5376":[0.00053016499999999998,0.00053270638888888884],"94208":[0.01065846,0.010920491500000001],"81920":[0.0091142280000000003,0.0093413779999999957],"3407872":[1.4922361584999999,1.5117867045],"104":[1.0248729999999999e-05,1.1170089999999999e-05],"122880":[0.01684184900000002,0.018808416000000001],"200":[2.0885130000000003e-05,2.1344649999999999e-05],"163840":[0.020088189999999999,0.020291272499999995],"4063232":[1.6082091905,1.6360503435],"5767168":[2.1479122094999998,2.1654488165000001],"12582912":[5.0122196880000001,9.3547301125000004],"1600":[0.00018253100000000002,0.00019726391999999999],"136":[1.2888435897435896e-05,1.3146150000000001e-05],"232":[2.2073e-05,2.2360315789473685e-05],"7077888":[3.2510668229999999,3.4501249734999999],"86016":[0.0098082199999999977,0.010273789],"31744":[0.0035846045000000001,0.0036313090000000005],"168":[1.4765239999999998e-05,1.5442779999999999e-05],"622592":[0.113511288,0.149127958],"108":[1.0645489583333332e-05,1.09986e-05],"327680":[0.044292803499999991,0.050507800499999991],"2176":[0.00022155118604651156,0.00022412995454545461],"3328":[0.00038412199999999992,0.0004384325909090908],"1":[2.9035e-07,3.27e-07],"2":[3.2784000000000006e-07,3.5232999999999998e-07],"3":[5.1029000000000005e-07,5.1239999999999996e-07],"4":[4.1012000000000002e-07,4.3729000000000002e-07],"7424":[0.00079213699999999983,0.00083179399999999996],"5":[5.7311000000000003e-07,6.2712999999999998e-07],"23552":[0.0022464327500000001,0.00227604],"6":[4.9657000000000006e-07,5.1114999999999997e-07],"61440":[0.0075027389999999996,0.0077319709999999998],"491520":[0.090075925000000015,0.12866171900000001],"77824":[0.0089153509999999984,0.0090376079999999991],"7":[6.8548999999999998e-07,7.1628999999999996e-07],"8":[5.8477000000000001e-07,6.5339999999999996e-07],"208":[2.2092209999999999e-05,2.3164440000000001e-05],"9":[7.7445000000000006e-07,8.3811999999999999e-07],"73728":[0.0084066640000000012,0.0094686300000000022],"304":[2.9451749999999998e-05,2.9735270000000001e-05],"400":[4.4150190000000002e-05,4.7284129999999999e-05],"1310720":[0.33703662950000002,0.4274244405],"336":[2.9746958333333337e-05,3.4563999999999996e-05],"3670016":[1.5433494000000001,1.6159264170000001],"6656":[0.00073777799999999991,0.00084136845454545433],"15360":[0.0016885417999999992,0.0016918],"432":[4.5681285714285718e-05,5.0841406250000006e-05],"950272":[0.244360666,0.33211941900000003],"655360":[0.11712375899999999,0.16910916600000001],"69632":[0.0080337580000000002,0.0081515459999999991],"11264":[0.0010340589999999999,0.0011027893750000001],"2752512":[0.90092881700000005,0.96794222699999999],"8126464":[3.4854655399999999,3.555893577],"27648":[0.003277677666666666,0.0033098659999999994],"368":[3.1890439999999998e-05,3.5582389999999999e-05],"65536":[0.0077281769999999984,0.0080932789999999984],"16252928":[7.4049237545000004,7.4800181895],"464":[4.9121500000000001e-05,5.0166600000000002e-05],"1015808":[0.26575766849999999,0.36616637099999999],"3072":[0.00028509597058823529,0.00028522600000000002],"110592":[0.0152999825,0.016624170000000001],"237568":[0.036593632000000001,0.040641686000000003],"278528":[0.040586137499999994,0.049639527999999995],"496":[5.1516793478260872e-05,5.5037330000000005e-05],"13107200":[6.7438434379999999,6.8727904635000003],"9961472":[4.0179837469999997,4.1818775085000004],"5888":[0.00059739600000000004,0.00062044168749999997],"11010048":[4.3418074000000004,4.3973954500000003],"1920":[0.000196727,0.00019925799999999998],"2490368":[0.829475348,0.86214850499999995],"19456":[0.0018903150000000001,0.0019457592499999995],"57344":[0.0068902410000000001,0.008081917000000001],"1179648":[0.29571349999999996,0.39951100900000003],"4718592":[1.8078239035000001,1.8896010560000001],"360448":[0.050247591000000001,0.060312970999999979],"1572864":[0.45555833699999998,0.46485288000000002],"53248":[0.006992781,0.0070616089999999991],"3456":[0.00038579199999999998,0.00046446699999999993],"40960":[0.0042138775000000002,0.0042903159999999997],"4608":[0.00044361599999999987,0.00049282999999999998],"13824":[0.0015843579999999997,0.0017128371999999997],"819200":[0.228215431,0.30617816949999999],"983040":[0.26407907200000003,0.33375675400000004],"8704":[0.00086928600000000004,0.00093150200000000007],"120":[1.1044329999999999e-05,1.1610450000000002e-05],"1024":[0.00010129133333333332,0.00010649876666666666],"49152":[0.0050656350000000006,0.0051411410000000001],"524288":[0.092111253500000004,0.13745819549999999],"45056":[0.004532197,0.0045781504999999993],"229376":[0.036273640499999996,0.040850175000000002],"2688":[0.000245042,0.000280566],"152":[1.3880780000000001e-05,1.4204980000000001e-05],"5120":[0.0004739469999999999,0.00052791805882352954],"1507328":[0.39116707000000001,0.52331251999999995],"1216":[0.00011188280000000001,0.00011583119753086425],"1966080":[0.66051838550000008,0.68945107449999998],"1900544":[0.68475482300000001,0.6880061475],"184":[1.592547e-05,1.6904840000000001e-05],"7936":[0.0008452651818181816,0.00089100327272727297],"3801088":[1.5905735650000001,1.622044754],"6815744":[3.2366804330000001,3.4055759800000001],"124":[1.1542679999999999e-05,1.3456e-05],"102400":[0.0148528715,0.015799176999999994],"311296":[0.043815565000000001,0.049179399499999998],"1408":[0.000130071,0.00013013400000000001],"393216":[0.052875402000000002,0.06734182150000001],"4352":[0.000458887,0.00046013680952380952],"6553600":[3.2061521924999998,3.331690772],"20480":[0.0020088057499999998,0.0021240492499999997],"608":[5.4985999999999998e-05,5.9925e-05],"2228224":[0.76032784399999997,0.76684847999999994],"36864":[0.003767728499999999,0.00404924],"704":[6.1781999999999999e-05,6.4078666666666674e-05],"720896":[0.132996579,0.1927946425],"800":[8.7472000000000005e-05,9.3158999999999994e-05],"2621440":[0.87117713749999992,0.93162870099999995],"425984":[0.082556181500000006,0.12317877100000001],"32768":[0.0035253259999999996,0.0037059800000000011],"12058624":[4.7826050765000003,4.8093665704999999],"128":[1.1929989999999999e-05,1.254624e-05],"180224":[0.0223253455,0.022849276500000001],"224":[2.1744419999999999e-05,2.2319549999999999e-05],"736":[6.6191510204081637e-05,7.2496000000000005e-05],"320":[2.9522480000000003e-05,3.003191e-05],"557056":[0.1022272345,0.12809189200000001],"832":[9.3882999999999995e-05,9.5431624999999998e-05],"9437184":[3.8632689839999999,4.0561643675000001],"3584":[0.00039740899999999994,0.00041205859090909079],"6291456":[2.3656491900000001,2.3712848129999999],"256":[2.49776e-05,2.5396910000000001e-05],"15204352":[7.1945167225000004,7.332667142],"28672":[0.0032141359999999994,0.0034012000000000001],"768":[6.7134749999999996e-05,7.1727939999999998e-05],"212992":[0.033370095000000002,0.03576609900000001],"864":[9.3286000000000001e-05,9.7085797979797986e-05],"352":[3.2057800000000003e-05,3.2345521739130438e-05],"253952":[0.041374970500000004,0.041925547000000007],"960":[9.865480000000001e-05,0.0001008878],"24576":[0.0022647599999999998,0.0023425412499999999],"7680":[0.00081368100000000013,0.000875288],"294912":[0.044879318000000001,0.051684005499999998],"1048576":[0.26986291600000001,0.36194010899999995],"10485760":[4.1507292869999999,4.167689395],"344064":[0.047656463000000003,0.052364954999999991],"288":[2.696039e-05,3.0285320000000001e-05],"1152":[0.000112774,0.00011816479268292684],"384":[3.3448999999999998e-05,3.3530550000000004e-05],"2304":[0.00023021039024390239,0.00024650000000000008],"896":[0.00010007816326530613,0.000101549],"480":[4.7716000000000002e-05,4.8509800000000001e-05],"1441792":[0.38135887999999996,0.50520174549999997],"992":[0.00010102785057471264,0.00010720833333333333],"3968":[0.00042432199999999987,0.00045105819047619049],"6400":[0.00076011524999999999,0.00084686160000000017],"1344":[0.0001228898,0.00012423411842105267],"126976":[0.017274109500000003,0.017501159500000002],"2883584":[0.94179623749999997,0.99834856100000002],"753664":[0.14279979549999999,0.20955778550000001],"16384":[0.0017660729999999995,0.0018544099999999997],"131072":[0.017262560499999999,0.0206350545],"458752":[0.086849645500000017,0.14373830400000001],"172032":[0.021466133999999998,0.024099212000000002],"12288":[0.0012425660000000001,0.0012530668571428571],"14680064":[7.102225443,14.795498479000001],"1536":[0.00013194000000000001,0.00014772481355932208],"25600":[0.0031132150000000003,0.0033275085],"1835008":[0.63153678550000003,0.65823977099999997],"10752":[0.0009966119999999998,0.0010485863333333334],"21504":[0.0020862579999999997,0.0022763167500000005],"7602176":[3.325032454,3.3394827060000001],"5632":[0.00055456064705882346,0.00055871699999999992],"10":[7.2471999999999994e-07,8.1145999999999994e-07],"3145728":[1.036948781,1.0468332890000001],"245760":[0.036661484500000008,0.041656835499999989],"1728":[0.000180929,0.00019690433333333329],"11":[9.8764999999999998e-07,1.02949e-06],"1114112":[0.28540764699999999,0.36388110500000004],"12":[8.7319e-07,9.2322999999999999e-07],"7340032":[3.2764800269999999,3.3155022409999999],"7168":[0.000824339,0.00087907109999999975],"13":[1.9352799999999998e-06,1.9378400000000002e-06],"6029312":[2.2514657924999999,2.2555205075],"14":[1.5703e-06,1.77708e-06],"3200":[0.00035144899999999999,0.00039550399999999997],"20":[1.90882e-06,2.0279499999999998e-06],"204800":[0.033146752500000001,0.040716426999999999],"15":[1.8133000000000001e-06,2.0681600000000001e-06],"13312":[0.0015300708333333339,0.0016363129999999997],"4980736":[1.863251577,1.899300421],"118784":[0.016666155999999994,0.016675200000000001],"51200":[0.0065513310000000005,0.0072701129999999999],"16":[1.7132800000000001e-06,1.98773e-06],"21":[2.2529500000000002e-06,2.3736e-06],"917504":[0.24353069849999998,0.34722228199999999],"22":[2.07147e-06,2.2748437499999999e-06],"4864":[0.00048330630000000002,0.00050947199999999985],"17":[2.0000299999999999e-06,2.0426000000000001e-06],"14848":[0.0017029713999999999,0.001722854],"23":[2.3336500000000001e-06,2.4242e-06],"786432":[0.15342660050000001,0.21401227750000001],"18":[1.83589e-06,1.9410000000000001e-06],"1638400":[0.62187772200000002,0.65378047800000005],"7864320":[3.4360728420000002,3.4455687660000001],"24":[1.96657e-06,2.0806099999999999e-06],"14155776":[6.9512986090000002,7.1815734640000004],"19":[2.0811299999999998e-06,2.0904400000000002e-06],"30":[2.8809199999999999e-06,2.9664000000000001e-06],"25":[2.8844700000000001e-06,2.9361600000000001e-06],"31":[3.0915800000000001e-06,3.3106900000000001e-06],"1280":[0.000120679,0.00012068100000000001],"26":[2.8543299999999999e-06,2.8547299999999999e-06],"3932160":[1.598315588,1.6330460075],"2432":[0.00024907299999999999,0.00025328200000000002],"32":[3.0353399999999998e-06,3.11071e-06],"27":[2.94231e-06,2.948e-06],"409600":[0.077021098499999996,0.09215736699999999]}},{"title":"OrderedSet union with Array (25% overlap)","results":{"28":[2.5625e-06,2.7124099999999999e-06],"34":[2.8234700000000002e-06,3.0464300000000002e-06],"29":[2.6949899999999998e-06,2.7414699999999999e-06],"40":[3.1154099999999997e-06,3.7340700000000004e-06],"17408":[0.0015865040000000001,0.0016784206000000003],"1472":[0.000118507,0.00012280094666666669],"112":[1.000132e-05,1.0222479999999999e-05],"1376256":[0.31131638499999997,0.43480312100000001],"5242880":[1.839348757,1.8481599520000001],"36":[2.7786e-06,3.2974300000000004e-06],"42":[3.1022800000000002e-06,3.6327899999999999e-06],"11534336":[4.1202515960000001,4.3020799834999996],"114688":[0.014736203,0.015079911],"144":[1.1768089999999999e-05,1.2787740000000001e-05],"38":[3.3131000000000001e-06,3.3417499999999998e-06],"240":[2.1277999999999999e-05,2.1738310000000002e-05],"9216":[0.00084886100000000002,0.00085073145454545485],"44":[3.1661000000000001e-06,3.3578700000000001e-06],"1664":[9.3299279999999995e-05,9.7264715909090903e-05],"196608":[0.021201625000000002,0.022538796],"155648":[0.017941996499999998,0.018181607999999998],"2816":[0.000228929,0.00025704081578947367],"50":[2.441e-06,2.5175e-06],"2359296":[0.73851811600000006,0.81441863800000003],"46":[3.3456700000000004e-06,3.6927400000000001e-06],"176":[1.3157399999999999e-05,1.4653419999999999e-05],"52":[2.4457800000000002e-06,2.7305599999999999e-06],"272":[2.2657e-05,2.508640449438202e-05],"116":[1.035163e-05,1.0445389999999999e-05],"47104":[0.0041016000000000004,0.004351471],"6912":[0.00038509599999999997,0.00039288699999999991],"1856":[0.00017558,0.00018280748979591834],"48":[3.3678100000000005e-06,3.4824299999999999e-06],"2097152":[0.70408543700000004,0.76129085499999993],"54":[3.0263000000000001e-06,3.1992799999999999e-06],"2031616":[0.64069045099999999,0.68092484050000002],"43008":[0.003864134,0.0040425210000000003],"60":[5.3135200000000006e-06,6.4764599999999995e-06],"30720":[0.0032213430000000002,0.0032612829999999994],"56":[5.16521e-06,5.1815000000000003e-06],"62":[5.1667900000000004e-06,5.5160000000000002e-06],"58":[5.1965199999999998e-06,5.5208627450980388e-06],"3014656":[0.91286593400000005,0.978287562],"64":[5.64857e-06,5.9580666666666664e-06],"8388608":[3.4516262609999999,3.4943503785000001],"29696":[0.0030817600000000002,0.0031146300000000006],"216":[1.052025e-05,1.091825e-05],"106496":[0.007426373,0.0089925200000000004],"72":[5.7020000000000006e-06,6.2373999999999998e-06],"442368":[0.053902947999999992,0.057067934000000008],"147456":[0.017530135000000002,0.017952590499999997],"4456448":[1.6597976139999999,1.672203501],"63488":[0.0071905290000000011,0.0084624339999999996],"38912":[0.0036939639999999997,0.0038049960000000002],"68":[5.5797699999999999e-06,6.0350400000000001e-06],"188416":[0.020328911999999998,0.021398491999999998],"248":[2.1376999999999999e-05,2.319775e-05],"80":[6.2342899999999999e-06,6.3973600000000005e-06],"2560":[0.00020590999999999999,0.00023159999999999994],"34816":[0.003394439,0.0035908069999999992],"3712":[0.00036706200000000008,0.00037312800000000002],"3538944":[0.80270350099999999,0.81699195999999996],"76":[5.8372299999999993e-06,6.6866399999999999e-06],"4194304":[1.6103620570000001,1.7070077889999999],"851968":[0.117577315,0.16467665100000001],"4096":[0.00038557199999999999,0.0003992205416666667],"59392":[0.006757763,0.0074226100000000005],"84":[6.1625400000000001e-06,6.5770699999999997e-06],"3276800":[0.66436285299999998,0.69417961100000003],"55296":[0.0035605935000000005,0.003710039],"688128":[0.109068791,0.151020664],"8192":[0.0007958170000000001,0.00082008699999999973],"10240":[0.00090755999999999996,0.00091993289999999959],"15872":[0.0015324889999999999,0.0016435620000000005],"92":[6.6751799999999995e-06,7.1592799999999997e-06],"26624":[0.0014920740000000001,0.001588576],"1792":[0.000178414,0.00018603343396226413],"11776":[0.00098477959999999985,0.001035205],"2944":[0.00023622499999999998,0.00023756],"88":[6.5081499999999997e-06,7.16115e-06],"22528":[0.0019017800000000001,0.0019623849999999997],"1245184":[0.29336462499999999,0.393349218],"15728640":[7.0893546110000001,7.1452163449999997],"96":[6.4330000000000001e-06,6.8416900000000002e-06],"1984":[0.000180698,0.00019252599999999999],"139264":[0.016711504999999995,0.018594644],"475136":[0.083082320000000001,0.10251468699999999],"13631488":[3.3810342384999998,3.4759009915000001],"416":[2.062253e-05,2.1425779999999999e-05],"928":[8.7404999999999994e-05,8.9352833333333336e-05],"512":[4.9229864583333331e-05,4.9525579545454539e-05],"18432":[0.0017068486000000008,0.001734312],"16777216":[7.2835452150000002],"9728":[0.00086567199999999984,0.00089370509090909108],"1769472":[0.35633798000000005,0.35932636499999998],"1703936":[0.321060344,0.33802288899999999],"2048":[0.000191991,0.00019432726530612239],"14336":[0.0014744879999999999,0.001499692],"448":[4.526024e-05,4.8489999999999998e-05],"5505024":[1.912793143,1.9501022079999999],"544":[5.0174829787234046e-05,5.0310600000000006e-05],"221184":[0.018328622000000003,0.019901261999999999],"90112":[0.008882428999999999,0.0097633240000000003],"640":[5.0540150000000004e-05,5.2855829999999998e-05],"12800":[0.00068257599999999984,0.00071878199999999973],"262144":[0.039866628000000001,0.040520297999999989],"589824":[0.09488854699999999,0.14319701949999999],"884736":[0.13157735849999999,0.19750330199999999],"6144":[0.00051981900000000014,0.00052948299999999986],"1088":[9.7885714285714278e-05,0.000100321],"576":[4.8548999999999999e-05,5.1798359999999999e-05],"160":[1.2447557692307692e-05,1.40726e-05],"672":[5.4507460000000003e-05,5.4569999999999994e-05],"8912896":[3.5456181469999999,3.610985672],"100":[4.6131900000000003e-06,4.7153000000000004e-06],"507904":[0.085405413999999985,0.12670376999999999],"3840":[0.00038388616000000001,0.00042428299999999996],"192":[1.3640569999999999e-05,1.447181e-05],"376832":[0.046866114,0.052644325000000006],"98304":[0.0096487639999999989,0.010193934],"5376":[0.00046664000000000005,0.000472986],"94208":[0.0093112910000000011,0.010542757999999999],"81920":[0.0083799740000000018,0.0084217609999999998],"3407872":[0.74932144200000006,0.75590648699999996],"104":[4.77328e-06,5.2367600000000002e-06],"122880":[0.016257462,0.016320947999999995],"200":[9.5089199999999994e-06,9.7969600000000001e-06],"163840":[0.018759946,0.019368614999999999],"4063232":[1.5811028144999999,1.5926206365],"5767168":[1.983165437,2.03485016],"12582912":[4.4031130234999996,8.1900214560000002],"1600":[8.3295989999999996e-05,8.7939210000000001e-05],"136":[1.13965e-05,1.1770529999999999e-05],"232":[2.0558909999999998e-05,2.1143849999999999e-05],"7077888":[1.7065078044999999,1.8085015444999999],"86016":[0.0087196369999999988,0.0090996600000000007],"31744":[0.00339062,0.003460042],"168":[1.3078799999999999e-05,1.3461999999999999e-05],"622592":[0.108150757,0.139350687],"108":[5.26043e-06,5.4803700000000005e-06],"327680":[0.043435349000000005,0.044485432000000005],"2176":[0.00019655564,0.00020519997916666662],"3328":[0.00017685500000000001,0.000216338],"1":[8.5259999999999997e-08,9.1520000000000002e-08],"2":[3.2818999999999998e-07,3.3043999999999999e-07],"3":[4.8594000000000002e-07,5.0969999999999996e-07],"4":[4.1368000000000004e-07,4.1975999999999999e-07],"7424":[0.00073366700000000013,0.00080215958333333323],"5":[5.1961999999999999e-07,5.7749000000000002e-07],"23552":[0.0019667942499999999,0.0020207519999999998],"6":[4.6216e-07,4.8711000000000003e-07],"61440":[0.0067976129999999992,0.007064242000000001],"491520":[0.084771740000000012,0.113553512],"77824":[0.0078846539999999996,0.0081829220000000005],"7":[6.5698999999999996e-07,6.7022999999999993e-07],"8":[5.3186999999999996e-07,5.6125999999999998e-07],"208":[1.0510240000000001e-05,1.191275e-05],"9":[6.9301000000000004e-07,7.3096000000000003e-07],"73728":[0.0076055140000000007,0.0079212250000000005],"304":[2.5274339999999999e-05,2.6302300000000001e-05],"400":[1.914325e-05,2.2121350000000001e-05],"1310720":[0.304713346,0.39932725599999996],"336":[2.6137225352112676e-05,3.0252640000000002e-05],"3670016":[1.5097781324999999,1.5897814079999999],"6656":[0.00036588127999999999,0.0004157369999999999],"15360":[0.0015281579999999999,0.0015559760000000001],"432":[2.1893276595744679e-05,2.4322333333333333e-05],"950272":[0.23091255300000002,0.33936252950000001],"655360":[0.10464736500000001,0.16485608200000001],"69632":[0.007298372,0.0075876109999999993],"11264":[0.000942281,0.00094742299999999997],"2752512":[0.88445173899999996,0.89020080000000001],"8126464":[3.3747044960000001,3.4438857949999999],"27648":[0.0015841116666666661,0.0016052429999999999],"368":[2.743635e-05,2.7823340000000001e-05],"65536":[0.0071059339999999995,0.0080188570000000008],"16252928":[7.1622965734999999,7.2348440585000002],"464":[4.5263999999999999e-05,4.5808949999999998e-05],"1015808":[0.2484614765,0.35589446650000001],"3072":[0.00024627199999999996,0.00025036217142857138],"110592":[0.0078897040000000043,0.008719550999999999],"237568":[0.035851146,0.039617823999999996],"278528":[0.038439397,0.042274145999999985],"496":[4.7656130000000001e-05,4.9051999999999997e-05],"13107200":[3.1135473089999999,3.1720114600000002],"9961472":[3.7953964944999998,3.8801177834999998],"5888":[0.00051055199999999984,0.00055870311764705889],"11010048":[4.0083322020000001,4.1396251910000004],"1920":[0.000184525,0.000192420019607843],"2490368":[0.76432376800000001,0.81834707399999995],"19456":[0.0017431368,0.0018060223999999997],"57344":[0.0064904279999999995,0.0078722930000000007],"1179648":[0.27381319999999998,0.38022830900000004],"4718592":[1.7201822505,1.7453194990000001],"360448":[0.045020120000000011,0.056131499999999987],"1572864":[0.37209030500000001,0.43223327049999999],"53248":[0.0035026950000000001,0.0035299800000000007],"3456":[0.00018991599999999999,0.00024606284999999998],"40960":[0.0038049170000000001,0.0039999190000000002],"4608":[0.00040907499999999996,0.000441197],"13824":[0.00080891745454545437,0.00083137800000000002],"819200":[0.10728156200000005,0.15049553800000001],"983040":[0.23908190800000001,0.32049482099999999],"8704":[0.00081483163636363628,0.00084457899999999982],"120":[1.005026e-05,1.071444e-05],"1024":[8.6353000000000005e-05,0.0001013108202247191],"49152":[0.0042084960000000008,0.0048983389999999998],"524288":[0.086017831999999989,0.12648288999999999],"45056":[0.0039689020000000007,0.0041628240000000007],"229376":[0.033540554,0.044687778999999997],"2688":[0.00022641449999999999,0.000234527],"152":[1.223761e-05,1.2588639999999999e-05],"5120":[0.0004398619999999999,0.000458364],"1507328":[0.34424548900000002,0.46343625300000002],"1216":[9.9553e-05,0.00010326128571428571],"1966080":[0.62737804400000008,0.67167360700000001],"1900544":[0.64607083900000006,0.65651912449999994],"184":[1.4160839999999999e-05,1.420427e-05],"7936":[0.00078365233333333307,0.00080464100000000004],"3801088":[1.528732872,1.5582416320000001],"6815744":[1.596858101,1.6635377419999999],"124":[1.065574e-05,1.2468740000000001e-05],"102400":[0.006916186999999999,0.0075439219999999998],"311296":[0.042360198000000002,0.04516452],"1408":[0.00011236300000000001,0.000115752],"393216":[0.048838004999999997,0.058188388000000001],"4352":[0.00038114300000000002,0.00040987700000000001],"6553600":[1.476160854,1.5299317815],"20480":[0.0018606873999999999,0.0019234027999999997],"608":[5.0890999999999998e-05,5.2500693181818181e-05],"2228224":[0.73174997450000001,0.76045542499999996],"36864":[0.0034292480000000002,0.0038163734999999998],"704":[5.1668000000000001e-05,5.5844000000000003e-05],"720896":[0.116517022,0.164701607],"800":[4.1427999999999997e-05,4.4273000000000001e-05],"2621440":[0.78881840850000007,0.88095239299999994],"425984":[0.042913134999999991,0.062755972500000021],"32768":[0.0032967366666666665,0.0033704550000000005],"12058624":[4.2766743409999997,4.2822791410000001],"128":[1.0741769999999999e-05,1.1408010000000001e-05],"180224":[0.020418043,0.021368321000000003],"224":[1.9843e-05,2.0166889999999998e-05],"736":[5.3334000000000001e-05,5.7697559999999999e-05],"320":[2.569e-05,2.5918619999999997e-05],"557056":[0.093979369999999979,0.130544732],"832":[4.3713e-05,4.3858800000000001e-05],"9437184":[3.7665130950000001,3.8679938749999998],"3584":[0.000342312,0.00037586300000000004],"6291456":[2.1134750169999998,2.1271480450000002],"256":[2.2418870000000001e-05,2.3675125000000001e-05],"15204352":[6.9888137500000003,7.1672289869999997],"28672":[0.0030304970000000005,0.0032356170000000005],"768":[5.5835000000000003e-05,5.8497379999999999e-05],"212992":[0.016993026000000005,0.017590829999999995],"864":[4.3254600000000004e-05,4.6956999999999998e-05],"352":[2.7910775510204084e-05,2.8519880000000003e-05],"253952":[0.036016053000000006,0.038970729999999988],"960":[8.8331000000000005e-05,8.9715000000000004e-05],"24576":[0.0019531739999999994,0.001986827],"7680":[0.00077405699999999998,0.00080194649999999995],"294912":[0.042445088999999998,0.045518654000000006],"1048576":[0.24391685900000001,0.35016242400000003],"10485760":[3.8547956494999998,3.9915795885000001],"344064":[0.043882933999999998,0.051933053],"288":[2.2716312499999999e-05,2.4568049999999999e-05],"1152":[0.00010455211363636364,0.00010923276923076922],"384":[2.7344000000000001e-05,2.9010449999999999e-05],"2304":[0.00020649499999999995,0.000222699],"896":[9.0174700000000002e-05,9.1680000000000003e-05],"480":[4.5398000000000001e-05,4.5522000000000002e-05],"1441792":[0.33643735450000001,0.4533854645],"992":[9.4439750000000007e-05,9.7281142857142856e-05],"3968":[0.00039469600000000004,0.00040836099999999999],"6400":[0.000344946,0.00036018900000000002],"1344":[0.00010529211111111112,0.000107734],"126976":[0.016483667,0.017448304999999997],"2883584":[0.85759961000000007,0.92769120100000002],"753664":[0.13045144450000001,0.16988387500000002],"16384":[0.0016926518000000008,0.001744298],"131072":[0.016116594000000001,0.0178140205],"458752":[0.080996541000000005,0.1372019565],"172032":[0.020838477500000001,0.022159941999999998],"12288":[0.00098331899999999986,0.001054354],"14680064":[6.8989678850000002,13.456173548500001],"1536":[0.00011718899999999999,0.00012403088461538462],"25600":[0.0014645529999999999,0.0014706536666666665],"1835008":[0.62284744700000005,0.63893055799999998],"10752":[0.00093269709999999994,0.00094645520000000009],"21504":[0.001824034,0.001878156],"7602176":[3.2600992230000001,3.3320657919999999],"5632":[0.000478429,0.00054580035294117643],"10":[6.4011999999999994e-07,6.4858999999999996e-07],"3145728":[0.96893216400000004,0.98964439800000004],"245760":[0.035010856,0.040054007000000003],"1728":[9.3443000000000006e-05,0.00010803019999999999],"11":[8.5547000000000002e-07,9.3856000000000006e-07],"1114112":[0.263483829,0.34621581400000001],"12":[7.7231000000000006e-07,7.7860000000000005e-07],"7340032":[3.2028259559999999,3.2277989570000001],"7168":[0.00076837316666666683,0.00081827699999999985],"13":[9.5024000000000007e-07,9.6487000000000009e-07],"6029312":[2.0299445784999999,2.0688231309999998],"14":[8.1260000000000006e-07,9.1615000000000001e-07],"3200":[0.00016830625000000002,0.00018458796078431379],"20":[1.7412899999999999e-06,1.8818400000000002e-06],"204800":[0.015597652,0.019240531999999998],"15":[1.8102099999999999e-06,1.92794e-06],"13312":[0.00072974861538461523,0.00079393875000000004],"4980736":[1.7820299020000001,1.790628645],"118784":[0.015348713999999996,0.0158266915],"51200":[0.0031657690000000001,0.003286073],"16":[1.5587100000000001e-06,1.6992900000000001e-06],"21":[1.9813999999999998e-06,2.0520500000000001e-06],"917504":[0.22608568600000001,0.33023533199999999],"22":[1.9307192982456141e-06,1.9444699999999998e-06],"4864":[0.00043815042857142851,0.00045455500000000004],"17":[1.86675e-06,1.8830600000000002e-06],"14848":[0.0015539640000000001,0.001558175],"23":[2.1001999999999998e-06,2.18835e-06],"786432":[0.127458138,0.18495231300000001],"18":[1.7012000000000001e-06,1.85276e-06],"1638400":[0.29540390449999998,0.30730542699999996],"7864320":[3.3749709994999999,3.3750928999999998],"24":[1.7580300000000001e-06,1.9258979591836736e-06],"14155776":[3.7169842515,3.7537867500000002],"19":[1.8992499999999999e-06,1.9901400000000001e-06],"30":[2.6192899999999998e-06,2.6664499999999997e-06],"25":[1.4421900000000001e-06,1.47532e-06],"31":[2.86331e-06,3.0330972222222222e-06],"1280":[0.000103656,0.00010787471111111114],"26":[1.33597e-06,1.46286e-06],"3932160":[1.5486458490000001,1.575838488],"2432":[0.00022748200000000004,0.00024194392682926831],"32":[2.76935e-06,2.7885714285714283e-06],"27":[1.5520599999999999e-06,1.60617e-06],"409600":[0.043786764000000006,0.048422914999999997]}},{"title":"OrderedSet union with Array (50% overlap)","results":{"28":[1.19767e-06,1.2128399999999999e-06],"34":[2.5842600000000001e-06,2.8209500000000001e-06],"29":[1.36064e-06,1.4361500000000002e-06],"40":[2.7816800000000003e-06,3.3413200000000002e-06],"17408":[0.0014864209999999999,0.0015518730000000001],"1472":[0.00010544015384615381,0.0001065837],"112":[4.2234899999999996e-06,4.2400299999999996e-06],"1376256":[0.28671104600000002,0.400801464],"5242880":[1.785906923,1.8020986530000001],"36":[2.5779600000000003e-06,2.9910599999999998e-06],"42":[2.8036999999999999e-06,2.98401e-06],"11534336":[3.9409298344999999,4.0307561190000003],"114688":[0.0065539999999999999,0.0066574369999999996],"144":[1.0694570000000001e-05,1.168596e-05],"38":[2.7596199999999999e-06,2.8294300000000004e-06],"240":[9.3604999999999996e-06,9.5334900000000004e-06],"9216":[0.0007625869166666665,0.00079955600000000009],"44":[2.8801199999999999e-06,3.2092999999999999e-06],"1664":[6.913799e-05,7.5308049999999995e-05],"196608":[0.019211953,0.020305034999999999],"155648":[0.016492096000000001,0.016906219],"2816":[0.000203928,0.00023233329999999995],"50":[1.8865799999999999e-06,1.90075e-06],"2359296":[0.71475319500000001,0.72323949200000004],"46":[3.0238599999999997e-06,3.2121899999999996e-06],"176":[1.162205e-05,1.192625e-05],"52":[1.9791000000000002e-06,2.1563699999999998e-06],"272":[1.9425666666666666e-05,2.2955272727272724e-05],"116":[4.6201800000000005e-06,4.6779200000000003e-06],"47104":[0.0037903105,0.0039248909999999998],"6912":[0.00029413799999999999,0.000314514],"1856":[7.7014703703703712e-05,8.0451000000000006e-05],"48":[2.9333599999999999e-06,3.4457100000000002e-06],"2097152":[0.40385085100000001,0.42713444499999997],"54":[2.1792700000000001e-06,2.3496899999999999e-06],"2031616":[0.35437168499999999,0.37519528299999999],"43008":[0.003731163,0.0038067145000000003],"60":[2.5851999999999998e-06,2.6824699999999997e-06],"30720":[0.0014664579999999999,0.001467678],"56":[2.21793e-06,2.3870199999999999e-06],"62":[2.40249e-06,2.6372599999999999e-06],"58":[2.3423800000000001e-06,2.4858699999999998e-06],"3014656":[0.858212796,0.94087272700000002],"64":[2.785e-06,2.8726599999999998e-06],"8388608":[1.9353534415,1.9366924084999999],"29696":[0.0014223089999999999,0.001437523],"216":[8.1465700000000005e-06,8.3777100000000001e-06],"106496":[0.0058526060000000006,0.0062824969999999997],"72":[5.1679299999999997e-06,5.5702200000000002e-06],"442368":[0.037141309999999997,0.037746882999999988],"147456":[0.016071401999999999,0.016185823500000005],"4456448":[1.6168803034999999,1.6233651725],"63488":[0.0035076620000000008,0.0038654890000000006],"38912":[0.0034625520000000007,0.0036137004999999998],"68":[5.1057399999999995e-06,5.7083999999999994e-06],"188416":[0.018992040999999998,0.019667306000000002],"248":[9.8315813953488374e-06,1.062342e-05],"80":[5.6867599999999992e-06,5.7283400000000001e-06],"2560":[0.00020290999999999999,0.00020636565116279076],"34816":[0.0030495470000000005,0.0031415939999999997],"3712":[0.00016481000000000002,0.00016557900000000001],"3538944":[0.65326785949999999,0.65912757200000005],"76":[5.24803e-06,5.8401999999999996e-06],"4194304":[0.87997703400000005,0.97005587400000004],"851968":[0.090620734000000008,0.12845216400000001],"4096":[0.000195675,0.000205269],"59392":[0.0031349290000000007,0.003256564],"84":[5.4781299999999997e-06,5.6105900000000003e-06],"3276800":[0.57729031350000004,0.61060623449999996],"55296":[0.0028000033333333329,0.0028433959999999989],"688128":[0.097530305999999983,0.13266006299999999],"8192":[0.0003853045,0.00041418],"10240":[0.00077727000000000004,0.00080321899999999998],"15872":[0.00077821766666666663,0.00079394774999999996],"92":[5.8632799999999997e-06,6.9367500000000001e-06],"26624":[0.00119342075,0.0012327471428571432],"1792":[7.5226000000000001e-05,7.7211130434782607e-05],"11776":[0.00085474999999999993,0.00091934000000000004],"2944":[0.000200562,0.000212642],"88":[5.87182e-06,6.1759399999999999e-06],"22528":[0.001757829,0.001915129],"1245184":[0.28393025799999999,0.37930829900000002],"15728640":[3.5837556460000002,3.6011616785],"96":[5.6813299999999997e-06,6.5144699999999996e-06],"1984":[8.9234142857142856e-05,9.0698187500000001e-05],"139264":[0.016282083000000003,0.017769221000000009],"475136":[0.041214544000000006,0.048256972999999995],"13631488":[2.7698464889999999,2.8321214719999999],"416":[1.562504e-05,1.5806390000000001e-05],"928":[3.8143644067796611e-05,3.9811000000000002e-05],"512":[2.38175e-05,2.4531470000000002e-05],"18432":[0.0015468926666666665,0.0016012909999999999],"16777216":[4.0560349709999999],"9728":[0.00075360899999999981,0.0007827],"1769472":[0.278808108,0.29225719750000001],"1703936":[0.269348119,0.27056134599999998],"2048":[8.7793499999999999e-05,9.7423999999999994e-05],"14336":[0.00061451400000000003,0.00065006666666666657],"448":[1.84788e-05,1.9592862068965517e-05],"5505024":[1.866721115,1.8829801800000001],"544":[4.5261846153846161e-05,4.5816916666666662e-05],"221184":[0.014356273000000003,0.016302193999999999],"90112":[0.0080459669999999994,0.008656968000000001],"640":[4.5766333333333329e-05,4.7882899999999995e-05],"12800":[0.00056123652941176497,0.00057212347058823517],"262144":[0.021030994000000001,0.022673195],"589824":[0.091376233000000015,0.11794906600000001],"884736":[0.097837851999999989,0.14601402200000002],"6144":[0.00045705499999999994,0.00046271499999999994],"1088":[8.6390999999999993e-05,8.7251799999999997e-05],"576":[4.2873952380952382e-05,4.3480999999999999e-05],"160":[1.1114999999999999e-05,1.1557089999999999e-05],"672":[4.52985e-05,4.8138199999999999e-05],"8912896":[3.4479339270000002,3.5059456574999999],"100":[3.6816500000000001e-06,3.7605499999999999e-06],"507904":[0.046362646,0.074775029500000006],"3840":[0.00017843968627450987,0.000185844],"192":[1.1754869999999999e-05,1.2111e-05],"376832":[0.043957381000000004,0.048809802000000006],"98304":[0.0085527910000000006,0.0089533140000000004],"5376":[0.000415733,0.00042400099999999997],"94208":[0.0082122860000000009,0.0092615289999999992],"81920":[0.0074500419999999987,0.0076920120000000007],"3407872":[0.60994772500000005,0.61155046700000004],"104":[3.75299e-06,3.9555499999999998e-06],"122880":[0.0077448700000000009,0.008178765000000001],"200":[7.3347699999999992e-06,7.3823400000000007e-06],"163840":[0.018231801999999998,0.0184534825],"4063232":[0.85351745199999995,0.86478800899999997],"5767168":[1.909253767,1.915191308],"12582912":[4.1312371710000004,7.6903054774999999],"1600":[6.1518098039215678e-05,6.6188959999999997e-05],"136":[1.0021310000000001e-05,1.0906042553191489e-05],"232":[9.0559500000000009e-06,1.0480479999999999e-05],"7077888":[1.379048692,1.458153043],"86016":[0.0077963160000000002,0.0079517379999999999],"31744":[0.0015859420000000006,0.001603805],"168":[1.1781e-05,1.19907e-05],"622592":[0.092653126000000016,0.12640905599999999],"108":[3.9994500000000003e-06,4.0041399999999997e-06],"327680":[0.038457078999999998,0.042390041000000003],"2176":[0.00018092272727272726,0.00018641],"3328":[0.00013246699999999999,0.000146112],"1":[8.512000000000001e-08,9.1479999999999996e-08],"2":[3.2581999999999999e-07,3.2994000000000005e-07],"3":[3.4570000000000003e-07,3.4873999999999998e-07],"4":[3.8294999999999997e-07,3.8618000000000003e-07],"7424":[0.0003309141379310344,0.00036392025925925919],"5":[4.9436000000000004e-07,5.4836999999999993e-07],"23552":[0.0017484739999999992,0.001807585],"6":[4.2252e-07,4.3758999999999999e-07],"61440":[0.003155536,0.0034617865000000012],"491520":[0.043640992999999996,0.059625364],"77824":[0.0071883479999999998,0.0073684780000000004],"7":[5.8388999999999997e-07,6.2100000000000007e-07],"8":[4.9556999999999998e-07,5.0213000000000001e-07],"208":[7.8666199999999999e-06,8.1683333333333328e-06],"9":[6.5282000000000004e-07,6.8955000000000003e-07],"73728":[0.0070060470000000014,0.0076837599999999995],"304":[2.2240000000000001e-05,2.317203e-05],"400":[1.473475e-05,1.7133219999999999e-05],"1310720":[0.28315848300000002,0.3882657155],"336":[2.3201947368421054e-05,2.6598329999999998e-05],"3670016":[0.70447742800000002,0.71857734100000004],"6656":[0.00028950291176470597,0.00030677800000000001],"15360":[0.00071001999999999979,0.00074198223076923074],"432":[1.6670019999999999e-05,1.7297000000000001e-05],"950272":[0.12232849999999995,0.16727753599999995],"655360":[0.093460701999999979,0.14280248400000001],"69632":[0.006789542,0.0072186509999999995],"11264":[0.00088280436363636359,0.00088356609090909071],"2752512":[0.82468231000000003,0.85792653149999998],"8126464":[1.8159112215,1.8498506539999999],"27648":[0.0012499095714285711,0.001259979],"368":[2.4104249999999999e-05,2.4249010416666666e-05],"65536":[0.0037877119999999999,0.0040875399999999989],"16252928":[3.8011347510000002,3.8810448929999999],"464":[1.9400000000000001e-05,1.9559e-05],"1015808":[0.133945229,0.18360559800000001],"3072":[0.00021604275000000001,0.000232823],"110592":[0.0061089430000000021,0.0067227740000000008],"237568":[0.016909686,0.018201413],"278528":[0.037067661000000002,0.040992489],"496":[2.2695509999999997e-05,2.3045829999999998e-05],"13107200":[2.602975147,2.6718892625000001],"9961472":[3.6330038720000002,3.7424537545000001],"5888":[0.000447143,0.00047270470000000008],"11010048":[3.831184404,3.9325570129999998],"1920":[8.3046000000000004e-05,8.5309300000000013e-05],"2490368":[0.74524783000000006,0.83493939650000004],"19456":[0.00155649,0.0016742581999999999],"57344":[0.0029705659999999996,0.0032282209999999999],"1179648":[0.25870657850000001,0.35939198900000002],"4718592":[1.6873087840000001,1.7123268949999999],"360448":[0.042325184999999994,0.047530525000000004],"1572864":[0.321202987,0.34158880899999999],"53248":[0.0027027090000000002,0.0027841979999999999],"3456":[0.000147558,0.00016705766666666669],"40960":[0.0034730705000000001,0.0036467490000000012],"4608":[0.00038791892000000007,0.00040286258333333349],"13824":[0.0005785050000000001,0.0006241529999999999],"819200":[0.085283742999999995,0.122764369],"983040":[0.12736178100000001,0.17745910400000001],"8704":[0.000745296,0.0007785494166666669],"120":[4.4211100000000006e-06,4.6601499999999998e-06],"1024":[4.4255999999999998e-05,5.3373821428571422e-05],"49152":[0.0038471999999999994,0.0041440104999999989],"524288":[0.051866144000000003,0.072682370999999954],"45056":[0.0036483800000000005,0.0039671649999999999],"229376":[0.015557930499999997,0.018477348999999997],"2688":[0.00019954799999999999,0.00021846300000000004],"152":[1.08625e-05,1.1039666666666667e-05],"5120":[0.00039603499999999999,0.00042367499999999993],"1507328":[0.3257770565,0.44302378899999995],"1216":[8.9325000000000003e-05,9.1362857142857136e-05],"1966080":[0.32992962699999995,0.34804664099999999],"1900544":[0.31084667900000001,0.32214922299999998],"184":[1.2121309999999999e-05,1.2636068181818182e-05],"7936":[0.00034908200000000002,0.00037226999999999996],"3801088":[0.74740419800000002,0.75275151100000004],"6815744":[1.2877045030000001,1.3659391009999999],"124":[4.9962499999999998e-06,5.5749599999999997e-06],"102400":[0.0054799819999999987,0.0064004260000000007],"311296":[0.038212575000000006,0.042932722999999999],"1408":[0.000108602,0.000108707],"393216":[0.047728296500000003,0.049401930999999996],"4352":[0.00036869699999999997,0.00038261699999999992],"6553600":[1.238640432,1.2848033540000001],"20480":[0.00165938,0.0017146526000000003],"608":[4.6166669999999998e-05,4.7493000000000001e-05],"2228224":[0.70427242599999995,0.95635916249999997],"36864":[0.0031995230000000001,0.0035130420000000001],"704":[4.6689e-05,4.9255519999999998e-05],"720896":[0.10474823599999999,0.17345596099999999],"800":[3.0273600000000001e-05,3.0318e-05],"2621440":[0.78125182599999998,0.83826767349999998],"425984":[0.034281753000000012,0.049880575999999996],"32768":[0.0017178896,0.0017736582000000007],"12058624":[4.0176972930000003,4.0767908320000004],"128":[5.0208799999999999e-06,5.7629000000000003e-06],"180224":[0.0186477,0.019798866000000005],"224":[8.3724600000000005e-06,8.5646999999999995e-06],"736":[4.997968686868687e-05,5.0354273684210527e-05],"320":[2.2752480000000001e-05,2.4295e-05],"557056":[0.088661059,0.11426330699999999],"832":[3.1903666666666671e-05,3.4028830000000004e-05],"9437184":[3.561388182,3.7544090510000001],"3584":[0.00014634399999999997,0.000152542],"6291456":[1.982409664,2.0066986670000002],"256":[1.0372846153846155e-05,1.1618990000000001e-05],"15204352":[3.3643771139999998,3.4265770820000001],"28672":[0.001282998,0.0014095122857142855],"768":[5.0211666666666672e-05,5.0580850000000005e-05],"212992":[0.013401623,0.015383112000000001],"864":[3.3393999999999999e-05,3.5046850000000001e-05],"352":[2.5379449999999996e-05,2.570846666666667e-05],"253952":[0.018559615999999998,0.021266456],"960":[4.1054930000000001e-05,4.1375999999999998e-05],"24576":[0.0018400916000000003,0.0018868450000000003],"7680":[0.000338239,0.00037212634615384611],"294912":[0.037629002000000002,0.041351392000000001],"1048576":[0.14827848499999999,0.20454734799999999],"10485760":[3.725814293,3.7867727819999999],"344064":[0.041552278999999998,0.045066266000000001],"288":[2.0146999999999999e-05,2.110696e-05],"1152":[9.3869666666666674e-05,9.9222999999999995e-05],"384":[2.3588730000000002e-05,2.5899249999999998e-05],"2304":[0.00018758200000000002,0.000199948],"896":[3.5556000000000003e-05,3.9869000000000001e-05],"480":[2.0499000000000001e-05,2.0778e-05],"1441792":[0.30059277099999998,0.43284852200000001],"992":[4.3612000000000002e-05,4.5673999999999997e-05],"3968":[0.00018674094117647057,0.000191218],"6400":[0.00027145530303030309,0.00028212400000000002],"1344":[9.7246999999999999e-05,9.7815947368421041e-05],"126976":[0.0082294859999999994,0.0082524899999999995],"2883584":[0.80702987050000008,0.91909875899999993],"753664":[0.107669848,0.14788649400000001],"16384":[0.00083583600000000007,0.00084556099999999988],"131072":[0.0086127860000000007,0.0095257299999999996],"458752":[0.037895474999999998,0.060091472],"172032":[0.018046542500000002,0.021316148],"12288":[0.00087403199999999996,0.0010133920000000001],"14680064":[3.1507577250000001,3.3644810504999998],"1536":[0.000107673,0.00011122499999999999],"25600":[0.0011285613749999997,0.0011804097142857142],"1835008":[0.29907672499999999,0.31034656400000005],"10752":[0.0008013950000000001,0.00084580272727272727],"21504":[0.0016755819999999997,0.0018480760000000001],"7602176":[1.547705785,1.5867128939999999],"5632":[0.0004564232500000001,0.00047326099999999999],"10":[5.6828999999999996e-07,6.2445000000000001e-07],"3145728":[0.903638779,0.91808631799999996],"245760":[0.017605680999999998,0.01958391],"1728":[7.2477972222222221e-05,7.494175862068965e-05],"11":[7.8744000000000002e-07,7.8873000000000005e-07],"1114112":[0.25055003300000001,0.36678357249999999],"12":[6.4292000000000004e-07,6.4393999999999993e-07],"7340032":[1.438256169,1.477757792],"7168":[0.00032779033333333332,0.00032847900000000001],"13":[7.8807000000000004e-07,8.2812999999999994e-07],"6029312":[1.9615520175000001,1.9902397110000001],"14":[6.9703000000000004e-07,7.2219999999999994e-07],"3200":[0.0001350986666666667,0.00015102600000000001],"20":[1.5787200000000001e-06,1.7766400000000001e-06],"204800":[0.012644566999999999,0.017120837999999999],"15":[9.3449000000000005e-07,1.0263700000000001e-06],"13312":[0.000563556,0.00059812400000000001],"4980736":[1.7440016905,1.7593651035],"118784":[0.00715834,0.007167904000000001],"51200":[0.0026362216666666665,0.0026767749999999989],"16":[7.9171000000000004e-07,8.7896999999999999e-07],"21":[1.8522800000000001e-06,1.8719e-06],"917504":[0.116818933,0.16085165900000001],"22":[1.6963199999999999e-06,1.7653400000000001e-06],"4864":[0.00040359979166666656,0.00041899099999999996],"17":[1.6760000000000001e-06,1.84175e-06],"14848":[0.00068593599999999973,0.00070644800000000004],"23":[1.9313e-06,1.9500699999999998e-06],"786432":[0.11250255899999995,0.15301387050000001],"18":[1.5623500000000002e-06,1.66652e-06],"1638400":[0.24289918899999996,0.24329390300000001],"7864320":[1.678096499,1.6929915819999999],"24":[1.5338700000000001e-06,1.6449999999999999e-06],"14155776":[2.9740588080000001,2.9771602690000001],"19":[1.73738e-06,1.8380400000000001e-06],"30":[1.27911e-06,1.3248399999999998e-06],"25":[1.17246e-06,1.19197e-06],"31":[1.4766200000000001e-06,1.4861099999999999e-06],"1280":[9.493555913978494e-05,9.5775999999999999e-05],"26":[1.1101800000000001e-06,1.1375999999999999e-06],"3932160":[0.79977821250000003,0.80450204699999994],"2432":[0.00020350200000000002,0.00020353333333333334],"32":[1.3431599999999999e-06,1.3824300000000001e-06],"27":[1.28269e-06,1.31112e-06],"409600":[0.031804592,0.038596897999999998]}},{"title":"OrderedSet union with Array (75% overlap)","results":{"28":[9.4053000000000002e-07,9.600299999999999e-07],"34":[1.10997e-06,1.1114799999999999e-06],"29":[1.0904300000000002e-06,1.17122e-06],"40":[2.5006300000000002e-06,3.1508000000000004e-06],"17408":[0.00064669,0.00067212500000000009],"1472":[8.7996000000000002e-05,9.6574000000000001e-05],"112":[3.1647299999999999e-06,3.2608700000000004e-06],"1376256":[0.27183226100000002,0.38240136050000001],"5242880":[1.712257361,1.7565756299999999],"36":[1.17734e-06,1.21915e-06],"42":[2.6665800000000003e-06,2.6808099999999997e-06],"11534336":[3.8279855905,3.8825314340000001],"114688":[0.0052197540000000001,0.0053008409999999988],"144":[4.2945499999999994e-06,5.1081600000000002e-06],"38":[1.34022e-06,1.37757e-06],"240":[6.7844099999999996e-06,6.9835000000000001e-06],"9216":[0.000351632,0.00037665895652173919],"44":[2.5277200000000001e-06,2.74279e-06],"1664":[5.1040690476190478e-05,5.4210722891566266e-05],"196608":[0.018062533999999998,0.019432809000000002],"155648":[0.0090245240000000025,0.009167952],"2816":[0.0001899735,0.00019260300000000001],"50":[1.48725e-06,1.525e-06],"2359296":[0.39629036600000001,0.40771373500000002],"46":[2.60308e-06,2.8102105263157892e-06],"176":[1.0399509999999998e-05,1.11082e-05],"52":[1.62535e-06,1.6310700000000002e-06],"272":[7.9563333333333338e-06,8.9140699999999995e-06],"116":[3.36023e-06,3.3917199999999998e-06],"47104":[0.0034392400000000005,0.0035525125],"6912":[0.00021395,0.000243761],"1856":[5.4663999999999997e-05,5.9281969999999997e-05],"48":[2.5729700000000002e-06,2.8007000000000001e-06],"2097152":[0.31279339350000002,0.33056851500000001],"54":[1.54931e-06,1.6990899999999999e-06],"2031616":[0.286025323,0.29232132100000002],"43008":[0.0033434569999999998,0.0034576419999999995],"60":[1.7991000000000001e-06,1.9464800000000002e-06],"30720":[0.0010810520000000001,0.001125703875],"56":[1.7417899999999999e-06,1.7439199999999999e-06],"62":[1.86152e-06,1.9435200000000002e-06],"58":[1.7749300000000001e-06,1.85397e-06],"3014656":[0.83628265800000001,0.92486863249999995],"64":[2.0991612903225804e-06,2.188325581395349e-06],"8388608":[1.5268978689999999,1.5367502659999999],"29696":[0.0010899319999999998,0.0011188443750000002],"216":[6.0335399999999993e-06,6.3597999999999997e-06],"106496":[0.00490626,0.004924930000000001],"72":[2.2353e-06,2.3833200000000002e-06],"442368":[0.028699120000000002,0.035376472999999999],"147456":[0.0081022899999999998,0.0082148919999999997],"4456448":[0.79042790699999999,0.79951732450000002],"63488":[0.0026862663333333332,0.0029098686666666671],"38912":[0.0016670389999999999,0.0017372260000000001],"68":[2.1176100000000001e-06,2.16164e-06],"188416":[0.017227858000000002,0.019061735],"248":[7.1207500000000004e-06,7.6987499999999998e-06],"80":[4.9011200000000001e-06,5.2475899999999997e-06],"2560":[0.000174482,0.00018631],"34816":[0.00135465,0.0013941191428571433],"3712":[0.000118169,0.0001195954],"3538944":[0.56788571799999998,0.57138729700000002],"76":[2.35959e-06,2.7256199999999999e-06],"4194304":[0.72402349749999995,0.76083366600000002],"851968":[0.074091749999999998,0.116013584],"4096":[0.00014824158064516137,0.00014904099999999998],"59392":[0.0024769040000000003,0.0025499870000000001],"84":[4.9250000000000003e-06,4.9391818181818181e-06],"3276800":[0.50560547150000001,0.52285028700000002],"55296":[0.0022156464999999997,0.0022679172500000002],"688128":[0.091207838000000013,0.114665135],"8192":[0.00028685000000000001,0.0003137503],"10240":[0.00073140799999999991,0.00074207899999999987],"15872":[0.00055981999999999994,0.00058289311764705889],"92":[5.2413799999999998e-06,6.30728e-06],"26624":[0.00089854299999999991,0.00095070369999999992],"1792":[5.5614e-05,5.8326960000000003e-05],"11776":[0.00077357700000000001,0.00082467700000000001],"2944":[0.0001899866666666667,0.00020003851020408166],"88":[5.1602199999999999e-06,5.4257700000000002e-06],"22528":[0.0016568324000000001,0.0018678283999999997],"1245184":[0.15998580500000001,0.22459167099999999],"15728640":[2.9802031640000002,3.015660118],"96":[5.1350600000000008e-06,6.3065200000000002e-06],"1984":[6.3759641509433964e-05,6.5325000000000002e-05],"139264":[0.007550836,0.0080122459999999989],"475136":[0.032116023,0.049497340000000001],"13631488":[2.4337171254999999,2.4725917609999999],"416":[1.1675136363636363e-05,1.1862839999999999e-05],"928":[2.7037857142857141e-05,2.8346069999999997e-05],"512":[1.5791333333333332e-05,1.7079428571428573e-05],"18432":[0.00070335700000000027,0.00075098999999999999],"16777216":[3.2423482529999998],"9728":[0.00038529283999999997,0.00041244999999999986],"1769472":[0.24291183599999999,0.24998902200000001],"1703936":[0.22734732499999999,0.24948164099999998],"2048":[6.2756999999999996e-05,6.7196063829787225e-05],"14336":[0.00048004900000000002,0.00050044426315789484],"448":[1.412964e-05,1.4659e-05],"5505024":[1.7850618515000001,1.83102597],"544":[1.7677780000000001e-05,1.8970888888888889e-05],"221184":[0.011837131000000004,0.012760153999999996],"90112":[0.0073030990000000004,0.0079816179999999994],"640":[3.9836000000000003e-05,4.3162416666666662e-05],"12800":[0.00040964699999999996,0.00044002322727272711],"262144":[0.015194892999999998,0.018336938000000004],"589824":[0.046223914999999997,0.07544844550000003],"884736":[0.085698179000000013,0.126886737],"6144":[0.00041951100000000002,0.00042470799999999993],"1088":[3.6984540000000001e-05,3.7710000000000003e-05],"576":[1.8418289999999999e-05,1.9749059999999998e-05],"160":[9.5349999999999993e-06,1.003437e-05],"672":[4.0961000000000003e-05,4.3559863636363637e-05],"8912896":[1.700277915,1.7149819995],"100":[2.8704199999999998e-06,2.94857e-06],"507904":[0.035765224000000005,0.065062486000000003],"3840":[0.00013011900000000002,0.00014264100000000002],"192":[1.0192e-05,1.0781000000000001e-05],"376832":[0.040704529999999996,0.043494264000000005],"98304":[0.0077434390000000004,0.0080495890000000011],"5376":[0.00037259899999999999,0.0003857186],"94208":[0.0075036010000000012,0.0079368709999999981],"81920":[0.0068335720000000013,0.007006974],"3407872":[0.53811278899999992,0.54204693199999998],"104":[2.8837699999999998e-06,3.0102500000000001e-06],"122880":[0.0060612489999999995,0.0079344529999999993],"200":[5.4135100000000006e-06,5.4891399999999999e-06],"163840":[0.016679025,0.016852542000000005],"4063232":[0.67285377599999996,0.69403550800000002],"5767168":[1.875774963,1.8820788655],"12582912":[4.0561809679999996,7.622296747],"1600":[4.7235369999999996e-05,4.9233319999999996e-05],"136":[3.9089300000000004e-06,4.3526399999999999e-06],"232":[6.7444499999999994e-06,7.3523400000000002e-06],"7077888":[1.2002333620000001,1.2794335669999999],"86016":[0.0071662709999999992,0.007181886000000001],"31744":[0.0011945719999999996,0.0011950579999999999],"168":[1.0247249999999999e-05,1.0336779999999999e-05],"622592":[0.052038559000000005,0.070376688000000034],"108":[3.0373000000000001e-06,3.0676300000000001e-06],"327680":[0.036203272000000009,0.041820847000000001],"2176":[7.5255258064516124e-05,7.7712000000000004e-05],"3328":[0.000103409,0.00011735619999999999],"1":[8.5259999999999997e-08,9.146e-08],"2":[1.0056e-07,1.0325e-07],"3":[1.1653e-07,1.2013e-07],"4":[3.5162000000000002e-07,3.6013999999999999e-07],"7424":[0.00024664900000000004,0.00026434499999999992],"5":[3.5268000000000001e-07,3.7972999999999997e-07],"23552":[0.0016379509999999999,0.001681896],"6":[3.7332000000000001e-07,3.8344e-07],"61440":[0.0024256870000000002,0.0026751773333333331],"491520":[0.033755368000000001,0.047519577],"77824":[0.0037486249999999998,0.0037762070000000002],"7":[4.0587999999999998e-07,4.2864999999999996e-07],"8":[4.2773999999999999e-07,4.5115999999999997e-07],"208":[5.7802307692307685e-06,5.9667599999999999e-06],"9":[6.0215000000000003e-07,6.1185000000000002e-07],"73728":[0.0033198199999999998,0.00366513],"304":[1.001135e-05,1.0208652173913043e-05],"400":[1.1334299999999999e-05,1.207311e-05],"1310720":[0.25547820500000001,0.354942902],"336":[2.0330299999999997e-05,2.3467285714285717e-05],"3670016":[0.60529265300000001,0.62559028699999997],"6656":[0.00020210399999999999,0.00022831623255813952],"15360":[0.00053447049999999963,0.00055137994117647059],"432":[1.27607e-05,1.2769579999999999e-05],"950272":[0.09882634500000001,0.140069371],"655360":[0.086705928999999987,0.13458996999999995],"69632":[0.0030682129999999993,0.003208869],"11264":[0.00078374983333333315,0.00082441733333333319],"2752512":[0.833953889,0.8582358175],"8126464":[1.4663858775,1.4753938559999999],"27648":[0.0009280130000000001,0.00098837700000000014],"368":[2.1494959999999997e-05,2.183243e-05],"65536":[0.0028642536666666674,0.0030989563333333322],"16252928":[3.0866792384999999,3.1140455564999998],"464":[1.3874549999999999e-05,1.42248e-05],"1015808":[0.11657735600000002,0.14292064099999999],"3072":[0.00019193500000000001,0.00019586200000000004],"110592":[0.0049556880000000006,0.0054080019999999986],"237568":[0.0133672675,0.014666],"278528":[0.017669028,0.019170698999999999],"496":[1.6154829999999999e-05,1.6561379999999999e-05],"13107200":[2.3156931735000001,2.3686712559999998],"9961472":[2.061391585,2.1335692444999999],"5888":[0.00039218,0.00039487099999999993],"11010048":[3.7483002325000001,3.8375467580000002],"1920":[6.0680999999999997e-05,6.2155129999999999e-05],"2490368":[0.451391616,0.50649645200000004],"19456":[0.00078125199999999997,0.00081553750000000014],"57344":[0.0022325930000000002,0.0025540600000000004],"1179648":[0.13884041599999999,0.19899928],"4718592":[0.89513323599999994,0.89855981900000004],"360448":[0.039870415000000006,0.042761805],"1572864":[0.29920921449999999,0.30854309999999996],"53248":[0.0020005940000000001,0.0021368864999999999],"3456":[0.00011162100000000001,0.00014540199999999999],"40960":[0.003185911,0.0032548489999999998],"4608":[0.0001739247450980392,0.000175038],"13824":[0.00045137900000000002,0.00046235699999999988],"819200":[0.071721958000000002,0.11404497600000001],"983040":[0.10103998999999997,0.14626091799999996],"8704":[0.00030523200000000006,0.000319561],"120":[3.3484800000000001e-06,3.3942399999999999e-06],"1024":[3.0695750000000002e-05,3.7737899999999997e-05],"49152":[0.003546688499999999,0.003626752],"524288":[0.037984132999999989,0.055704154500000005],"45056":[0.0032128310000000002,0.003387237],"229376":[0.012254616000000003,0.014346185000000001],"2688":[0.00018057700000000004,0.00019185799999999999],"152":[4.8070799999999996e-06,5.171526315789473e-06],"5120":[0.00037374800000000003,0.000377568],"1507328":[0.28278985499999998,0.4117672805],"1216":[4.3369550000000002e-05,4.3615249999999999e-05],"1966080":[0.27122074900000004,0.28448254750000002],"1900544":[0.26967524999999998,0.27137655150000001],"184":[1.031923e-05,1.114482e-05],"7936":[0.00027350000000000003,0.00027630200000000013],"3801088":[0.62876992099999995,0.63093975150000003],"6815744":[1.1535844675,1.2126106719999998],"124":[3.6499099999999998e-06,3.8904899999999996e-06],"102400":[0.0044756990000000014,0.0047224549999999995],"311296":[0.022568557999999999,0.023206435499999997],"1408":[9.095079999999999e-05,0.000107334],"393216":[0.040364152,0.043755505],"4352":[0.00015617200000000002,0.00016361248333333331],"6553600":[1.1015632835,1.1427588550000001],"20480":[0.0015598488333333335,0.0015791099999999999],"608":[2.1898120000000001e-05,2.2303179999999999e-05],"2228224":[0.35561226499999998,0.39292923099999999],"36864":[0.0015136431666666664,0.0015664159999999999],"704":[4.283802e-05,4.5139999999999998e-05],"720896":[0.091605071999999996,0.12791469899999999],"800":[2.3371e-05,2.4598000000000001e-05],"2621440":[0.74488788900000003,0.79703111599999998],"425984":[0.027108308000000005,0.032544917],"32768":[0.0012699358571428569,0.0012898160000000001],"12058624":[3.9404951449999999,3.945047856],"128":[3.6567400000000003e-06,3.8872100000000005e-06],"180224":[0.017450161499999998,0.017773223000000001],"224":[6.3476799999999997e-06,6.4787600000000003e-06],"736":[4.33019e-05,4.4270990000000003e-05],"320":[1.9684277108433734e-05,2.2004000000000001e-05],"557056":[0.042216538999999997,0.058976576500000003],"832":[2.3479750000000002e-05,2.3597499999999999e-05],"9437184":[1.8634589610000001,1.9501199090000001],"3584":[0.00011134,0.00012118799999999998],"6291456":[2.0016572785000002,2.0137225415],"256":[7.2951900000000002e-06,8.4151300000000005e-06],"15204352":[2.8456839220000001,2.9331202649999999],"28672":[0.0010074650000000001,0.001057278],"768":[4.2830000000000002e-05,4.5384499999999999e-05],"212992":[0.0112117815,0.013416296000000003],"864":[2.5166700000000001e-05,2.6796422535211266e-05],"352":[2.1973050000000001e-05,2.2651999999999999e-05],"253952":[0.014562256000000001,0.017273004500000001],"960":[2.9567e-05,3.1354040000000001e-05],"24576":[0.0016233299999999999,0.001626967],"7680":[0.00026108499999999998,0.00027623600000000007],"294912":[0.019740882500000001,0.024327156999999995],"1048576":[0.10869568500000004,0.15837394599999999],"10485760":[3.6287512065,3.6364594315000001],"344064":[0.037961067000000001,0.040726799999999959],"288":[9.3069900000000001e-06,9.8447000000000008e-06],"1152":[4.0494999999999998e-05,4.4150708333333329e-05],"384":[2.1058333333333335e-05,2.1771049999999999e-05],"2304":[8.8352750000000009e-05,9.0480000000000001e-05],"896":[2.7104999999999999e-05,2.9238774193548388e-05],"480":[1.4922307692307692e-05,1.508287e-05],"1441792":[0.27521640800000002,0.40758656700000001],"992":[3.1269629999999998e-05,3.282425e-05],"3968":[0.00013318600000000001,0.000141101],"6400":[0.00020288078723404253,0.0002118965],"1344":[8.3097999999999996e-05,8.6506250000000005e-05],"126976":[0.0063316169999999995,0.0066245609999999993],"2883584":[0.805854446,0.88767508299999998],"753664":[0.097853993,0.13890275399999999],"16384":[0.00059956418749999981,0.00062688419999999993],"131072":[0.0065681059999999998,0.006911487],"458752":[0.031119707,0.054745310000000005],"172032":[0.016835307000000001,0.019638552],"12288":[0.00080073500000000001,0.00080413499999999988],"14680064":[2.6896266870000001,2.7805830715000002],"1536":[9.3104750000000007e-05,0.00010623876190476191],"25600":[0.00087529727272727276,0.00089725199999999997],"1835008":[0.25052242700000005,0.25578184300000001],"10752":[0.00076793,0.00079848099999999997],"21504":[0.001518571,0.0016751679999999999],"7602176":[1.3216857479999999,1.3348454940000001],"5632":[0.00039784316666666663,0.00045911700000000004],"10":[4.6255999999999998e-07,4.8559e-07],"3145728":[0.84445421799999998,0.84755436100000003],"245760":[0.015309055,0.015479916],"1728":[5.2476952941176473e-05,5.4345957746478874e-05],"11":[6.7665999999999997e-07,6.9468999999999993e-07],"1114112":[0.12323620000000002,0.18212196199999997],"12":[5.4705000000000002e-07,5.6731000000000002e-07],"7340032":[1.257738263,1.2680668690000001],"7168":[0.00024270330769230768,0.00025801700000000003],"13":[7.1490999999999999e-07,7.1911999999999994e-07],"6029312":[1.9306869879999999,1.9420223379999999],"14":[5.9435000000000008e-07,6.1216999999999996e-07],"3200":[0.00010005081052631578,0.00010319579999999999],"20":[1.4274556962025316e-06,1.57708e-06],"204800":[0.01026905,0.011244463999999996],"15":[7.0485000000000002e-07,7.9942000000000005e-07],"13312":[0.00043686899999999999,0.00045469999999999999],"4980736":[1.0088046369999999,1.0245858285],"118784":[0.0056893150000000003,0.0057448530000000012],"51200":[0.0018683720000000001,0.00201839675],"16":[6.5931000000000005e-07,7.1312999999999998e-07],"21":[1.6172899999999999e-06,1.6921699999999999e-06],"917504":[0.096510372999999983,0.1278916665],"22":[1.5567799999999999e-06,1.61853e-06],"4864":[0.00018861,0.00019932359183673479],"17":[7.9041000000000005e-07,9.3272e-07],"14848":[0.00050467300000000008,0.00052748499999999974],"23":[1.76796e-06,1.79484e-06],"786432":[0.101930756,0.14305050399999999],"18":[7.0892000000000002e-07,7.2037000000000004e-07],"1638400":[0.22027002500000001,0.23977400299999996],"7864320":[1.4061673324999999,1.4206716585000001],"24":[1.37514e-06,1.42445e-06],"14155776":[2.5498857849999998,2.6294381439999999],"19":[8.7191999999999999e-07,8.9927999999999999e-07],"30":[9.8342999999999996e-07,1.0115199999999999e-06],"25":[9.9981e-07,1.0739e-06],"31":[1.1416199999999999e-06,1.1719200000000001e-06],"1280":[8.1050000000000005e-05,9.0365999999999995e-05],"26":[8.5963000000000008e-07,9.1435999999999994e-07],"3932160":[0.63795379699999999,0.66802180499999997],"2432":[9.1625000000000005e-05,0.00010052000000000002],"32":[1.03697e-06,1.0636399999999999e-06],"27":[1.0300400000000001e-06,1.05911e-06],"409600":[0.027272994000000002,0.03430293100000005]}},{"title":"OrderedSet union with Array (100% overlap)","results":{"28":[5.5283999999999997e-07,5.9018000000000006e-07],"34":[6.6663999999999994e-07,6.8945000000000002e-07],"29":[5.7370999999999997e-07,6.229e-07],"40":[8.2873000000000009e-07,8.7676999999999993e-07],"17408":[0.00047636880000000002,0.00048023800000000002],"1472":[4.0311000000000001e-05,4.4650894736842106e-05],"112":[2.1317899999999998e-06,2.1957099999999999e-06],"1376256":[0.15010322449999999,0.20777110400000001],"5242880":[0.87351743999999998,0.890717859],"36":[7.1878999999999994e-07,7.7234000000000005e-07],"42":[8.6796000000000005e-07,9.9198999999999992e-07],"11534336":[2.1069567679999999,2.1923017059999999],"114688":[0.0040605290000000002,0.0041213360000000006],"144":[2.8576300000000004e-06,3.27701e-06],"38":[7.4965999999999995e-07,7.5965e-07],"240":[4.4360599999999995e-06,4.60787e-06],"9216":[0.00025362399999999998,0.00026504378378378382],"44":[9.0849999999999996e-07,9.3896999999999994e-07],"1664":[3.5307453333333335e-05,3.5875560000000003e-05],"196608":[0.010595878,0.010836598999999999],"155648":[0.0067165980000000024,0.0067400660000000003],"2816":[7.6857e-05,8.2024739999999997e-05],"50":[9.4193000000000002e-07,9.47e-07],"2359296":[0.3139054275,0.3310366085],"46":[9.6892999999999993e-07,1.03512e-06],"176":[3.67276e-06,4.2130299999999997e-06],"52":[1.0027500000000001e-06,1.0143800000000001e-06],"272":[5.2057375000000001e-06,5.9810699999999998e-06],"116":[2.1882999999999999e-06,2.2415999999999998e-06],"47104":[0.0015501010000000001,0.0017304144000000001],"6912":[0.0001679085789473684,0.00017018600000000001],"1856":[3.8325999999999999e-05,3.9272888888888886e-05],"48":[1.0114200000000001e-06,1.1616399999999999e-06],"2097152":[0.26453758799999999,0.28745474800000004],"54":[1.01273e-06,1.0364199999999999e-06],"2031616":[0.245007484,0.26047073100000001],"43008":[0.0013638845714285714,0.001389492],"60":[1.14779e-06,1.17523e-06],"30720":[0.00077057800000000028,0.00083129899999999997],"56":[1.09212e-06,1.1119300000000001e-06],"62":[1.2308299999999999e-06,1.2569200000000001e-06],"58":[1.1309700000000001e-06,1.14641e-06],"3014656":[0.51328006599999998,0.545340932],"64":[1.3194199999999999e-06,1.39085e-06],"8388608":[1.3106706319999999,1.327560265],"29696":[0.00075137399999999997,0.0007563810000000002],"216":[4.2636470588235299e-06,4.7919599999999998e-06],"106496":[0.0036190445000000003,0.0037304905000000001],"72":[1.4405e-06,1.5520000000000001e-06],"442368":[0.020562832,0.020765393],"147456":[0.0059643389999999999,0.0062120209999999999],"4456448":[0.66840274050000004,0.67132759199999992],"63488":[0.001849563,0.0018731443999999999],"38912":[0.0011412530000000001,0.0011894800000000001],"68":[1.3233700000000001e-06,1.3424411764705883e-06],"188416":[0.0094231470000000015,0.0094835759999999988],"248":[4.6513900000000002e-06,5.1132399999999999e-06],"80":[1.6238799999999999e-06,1.6428499999999999e-06],"2560":[6.7559847826086959e-05,6.8955999999999995e-05],"34816":[0.00096286579999999987,0.00099121400000000003],"3712":[8.3831000000000004e-05,8.8163079999999995e-05],"3538944":[0.48858727499999999,0.49761139300000001],"76":[1.5493700000000002e-06,1.6349800000000001e-06],"4194304":[0.62587110749999997,0.66590667399999992],"851968":[0.070675632999999988,0.096330696999999965],"4096":[9.3062399999999999e-05,9.7927666666666668e-05],"59392":[0.0016870752,0.0017506384],"84":[1.7409700000000002e-06,1.79543e-06],"3276800":[0.44156827999999998,0.47772310299999998],"55296":[0.0014633198333333336,0.0015288016666666667],"688128":[0.042670912000000005,0.055660044000000006],"8192":[0.00021080659999999995,0.00022733982926829267],"10240":[0.00028314700000000003,0.00030706756250000004],"15872":[0.00038446500000000001,0.00042856600000000002],"92":[2.1252e-06,2.8208799999999998e-06],"26624":[0.00061343200000000002,0.0006685553571428571],"1792":[3.783946e-05,3.9170619999999995e-05],"11776":[0.00037283300000000004,0.00040796686363636371],"2944":[8.4780125e-05,8.8471e-05],"88":[2.0005900000000001e-06,2.1658099999999999e-06],"22528":[0.0007599443846153846,0.00078594890909090885],"1245184":[0.12100486799999999,0.16421435600000001],"15728640":[2.570138891,2.5899927959999998],"96":[2.3292199999999998e-06,3.1933999999999998e-06],"1984":[4.260827586206897e-05,4.4826579999999994e-05],"139264":[0.0057654549999999992,0.0058340609999999998],"475136":[0.022057624999999997,0.027694696499999998],"13631488":[2.0952785635,2.156428751],"416":[7.895569999999999e-06,7.9676300000000001e-06],"928":[1.8258142857142857e-05,1.9451169999999999e-05],"512":[1.1095960000000001e-05,1.1370069999999999e-05],"18432":[0.00050884899999999991,0.00053688500000000007],"16777216":[2.8004258649999998],"9728":[0.0002761838529411765,0.00028155000000000004],"1769472":[0.20728891400000005,0.21357852699999999],"1703936":[0.197596261,0.20982143199999997],"2048":[4.3723999999999997e-05,4.5939830000000006e-05],"14336":[0.00034495700000000001,0.000347659],"448":[8.6277800000000009e-06,9.6304000000000002e-06],"5505024":[0.93950001400000005,0.96000232699999999],"544":[1.1234289999999999e-05,1.2092100000000001e-05],"221184":[0.0090291250000000007,0.0094161450000000008],"90112":[0.0034190279999999997,0.0036630179999999997],"640":[1.3821e-05,1.5415120000000002e-05],"12800":[0.00031199800000000002,0.00031441800000000001],"262144":[0.011549369,0.011881402499999997],"589824":[0.0310448805,0.051943323],"884736":[0.06307457499999998,0.10422542700000004],"6144":[0.00021265799999999996,0.000213437],"1088":[2.496501e-05,2.5185795698924732e-05],"576":[1.213382e-05,1.2352166666666667e-05],"160":[3.2831e-06,3.6764000000000001e-06],"672":[1.6144270000000002e-05,1.7096440000000001e-05],"8912896":[1.4216421829999999,1.4658081759999999],"100":[1.84179e-06,1.88942e-06],"507904":[0.024515752999999994,0.052413900999999985],"3840":[9.1827939999999998e-05,9.2596000000000006e-05],"192":[4.1827200000000003e-06,4.5888899999999995e-06],"376832":[0.021575285999999999,0.021586197999999994],"98304":[0.0041903690000000011,0.0043270449999999998],"5376":[0.00015011399999999999,0.00015632100000000001],"94208":[0.0036486370000000006,0.0041924689999999999],"81920":[0.0027483849999999999,0.0027959446666666666],"3407872":[0.46308912899999999,0.46568520699999999],"104":[1.9307399999999998e-06,1.96344e-06],"122880":[0.004743092,0.0050057190000000005],"200":[3.6427299999999998e-06,3.6447399999999999e-06],"163840":[0.0073903009999999993,0.0075383100000000012],"4063232":[0.59034122550000001,0.60050009999999998],"5767168":[1.0533065660000001,1.0997649635],"12582912":[2.54691512,5.5343446390000004],"1600":[3.2554666666666668e-05,3.3488059999999999e-05],"136":[2.6730699999999999e-06,2.69954e-06],"232":[4.40243e-06,4.9037600000000001e-06],"7077888":[1.0349484815000001,1.1020990934999999],"86016":[0.0030877329999999992,0.0032082570000000004],"31744":[0.00085986036363636348,0.00088209249999999986],"168":[3.42668e-06,3.8568699999999999e-06],"622592":[0.034609275500000002,0.044400649],"108":[2.0073100000000001e-06,2.01056e-06],"327680":[0.016434918499999999,0.017097783500000012],"2176":[5.1289000000000003e-05,5.1601479999999996e-05],"3328":[7.3778199999999998e-05,7.9883999999999996e-05],"1":[8.5290000000000005e-08,9.1330000000000011e-08],"2":[1.0054000000000001e-07,1.0389e-07],"3":[1.1651e-07,1.2405e-07],"4":[1.3227000000000001e-07,1.3344999999999999e-07],"7424":[0.00017938476363636371,0.000190578],"5":[1.4807e-07,1.5209000000000001e-07],"23552":[0.00079129890909090917,0.00081414999999999992],"6":[1.666e-07,1.6792000000000001e-07],"61440":[0.0017008336000000005,0.0018049610000000001],"491520":[0.023386340499999998,0.034099682999999992],"77824":[0.0025416840000000002,0.0026265896666666667],"7":[1.7952999999999999e-07,2.0690000000000001e-07],"8":[2.0307e-07,2.1217999999999998e-07],"208":[3.8536400000000001e-06,3.8615600000000002e-06],"9":[2.1198e-07,2.4604e-07],"73728":[0.0023587442500000002,0.0024401479999999996],"304":[6.4510800000000002e-06,6.6239000000000002e-06],"400":[7.7246799999999994e-06,7.7377500000000006e-06],"1310720":[0.135686427,0.1768616325],"336":[7.70614e-06,8.2202600000000005e-06],"3670016":[0.51830971950000004,0.542713687],"6656":[0.00015156879999999998,0.00016150100000000004],"15360":[0.00039435466666666661,0.000405752],"432":[7.9434199999999989e-06,8.8799600000000003e-06],"950272":[0.071286818000000002,0.117660456],"655360":[0.037262041000000003,0.061576465999999996],"69632":[0.0021189529999999998,0.0022829109999999999],"11264":[0.00035842996153846149,0.00036593599999999992],"2752512":[0.42596594899999995,0.443467677],"8126464":[1.2775102249999999,1.2845438465000001],"27648":[0.00066691700000000038,0.00071199761538461525],"368":[9.0335999999999994e-06,9.5722199999999993e-06],"65536":[0.001951723,0.0020257500000000002],"16252928":[2.6609947214999998,2.6934017830000001],"464":[9.2420599999999997e-06,9.7813700000000005e-06],"1015808":[0.082688209499999998,0.123712631],"3072":[9.7801999999999996e-05,0.000103],"110592":[0.0038400040000000002,0.0039540969999999993],"237568":[0.0099972265000000012,0.010662655],"278528":[0.012961303,0.0130732785],"496":[1.0023829999999999e-05,1.0604869999999999e-05],"13107200":[2.0054784794999998,2.0721737779999998],"9961472":[1.6611518255,1.7075723110000001],"5888":[0.00017303900000000005,0.00018403416666666665],"11010048":[1.963752647,2.0035026185000002],"1920":[4.0668799999999999e-05,4.1865e-05],"2490368":[0.34528537100000001,0.39645798599999998],"19456":[0.00053383799999999991,0.00055169300000000002],"57344":[0.0015973753333333334,0.0018498080000000001],"1179648":[0.111505881,0.158674025],"4718592":[0.73672185499999998,0.75053353700000003],"360448":[0.019503922,0.020405548000000003],"1572864":[0.21678658100000003,0.22073445650000001],"53248":[0.00135673,0.001464066],"3456":[7.9750304347826089e-05,9.3558151515151514e-05],"40960":[0.0012423088571428573,0.0013082421428571428],"4608":[0.00012135590123456791,0.000122516],"13824":[0.00033466639285714288,0.00034310317241379303],"819200":[0.057784560500000012,0.091587090999999995],"983040":[0.077359064499999991,0.121392633],"8704":[0.00022657599999999995,0.00022715000000000002],"120":[2.1767400000000001e-06,2.36444e-06],"1024":[2.1305e-05,2.510131e-05],"49152":[0.0017042260000000003,0.0019603760000000002],"524288":[0.02578635,0.037003338999999996],"45056":[0.0014591439999999997,0.0014756113333333331],"229376":[0.0094702269999999977,0.010602327],"2688":[7.1595421052631571e-05,7.5254062500000002e-05],"152":[3.04845e-06,3.2926699999999999e-06],"5120":[0.00013609700000000001,0.00014023799999999999],"1507328":[0.184086375,0.2493463575],"1216":[2.8089000000000002e-05,2.8343e-05],"1966080":[0.23183266899999999,0.24430521799999999],"1900544":[0.23701844,0.23936714949999999],"184":[3.9060999999999998e-06,4.5787699999999997e-06],"7936":[0.00019906599999999997,0.00020156743181818179],"3801088":[0.54364139300000003,0.55071106300000006],"6815744":[1.0012496209999999,1.0531454060000001],"124":[2.4306099999999999e-06,2.48037e-06],"102400":[0.0033875395000000003,0.0035001034999999994],"311296":[0.015031752000000001,0.015258208000000001],"1408":[3.7792e-05,3.7996500000000001e-05],"393216":[0.023093099999999998,0.024381794000000002],"4352":[0.000114262,0.000115875],"6553600":[0.96018971200000003,0.99032528399999997],"20480":[0.00062812706666666679,0.00063382992857142855],"608":[1.424692e-05,1.433293e-05],"2228224":[0.29640412299999996,0.31769797700000002],"36864":[0.00099636899999999999,0.0010801841111111113],"704":[1.6992820000000002e-05,1.728943e-05],"720896":[0.045333466500000003,0.064567066000000034],"800":[1.543374e-05,1.6354110000000001e-05],"2621440":[0.37729522100000001,0.41173972250000002],"425984":[0.019072825500000001,0.028870112000000014],"32768":[0.00086840300000000001,0.00090728899999999982],"12058624":[2.3382321369999999,2.3797871659999998],"128":[2.5715100000000001e-06,2.5760699999999998e-06],"180224":[0.0089057560000000008,0.0091266430000000003],"224":[4.3602899999999997e-06,4.99819e-06],"736":[1.8127970588235296e-05,1.8853849999999999e-05],"320":[6.8406399999999996e-06,7.0630099999999998e-06],"557056":[0.028133518999999996,0.037057763000000001],"832":[1.5826499999999998e-05,1.751740740740741e-05],"9437184":[1.5463877319999999,1.5634864049999999],"3584":[7.9387000000000004e-05,8.260699999999999e-05],"6291456":[1.2543678950000001,1.265428746],"256":[4.91709e-06,5.1080199999999998e-06],"15204352":[2.4562193900000002,2.501492383],"28672":[0.00066872500000000001,0.00077974000000000012],"768":[1.84665e-05,2.0522000000000001e-05],"212992":[0.0085052230000000027,0.0085432360000000009],"864":[1.6610084507042252e-05,1.8561340000000001e-05],"352":[8.1173299999999997e-06,9.5779899999999998e-06],"253952":[0.0111269565,0.011569227999999997],"960":[2.0521200000000003e-05,2.1331999999999998e-05],"24576":[0.000844694,0.00085546918181818158],"7680":[0.000185327,0.00019515999999999999],"294912":[0.0145868375,0.015280218],"1048576":[0.093503990499999995,0.13882520800000001],"10485760":[1.795615065,1.814104465],"344064":[0.017946973000000005,0.020505936499999995],"288":[5.6917899999999996e-06,5.8153500000000001e-06],"1152":[2.677712e-05,2.7424e-05],"384":[9.30304e-06,9.5714499999999996e-06],"2304":[5.6681999999999997e-05,6.0480070000000002e-05],"896":[1.7711169999999999e-05,1.8930740000000001e-05],"480":[9.6004000000000004e-06,9.9995899999999992e-06],"1441792":[0.168339346,0.22326086449999999],"992":[2.0925019999999998e-05,2.1857299999999998e-05],"3968":[9.2540333333333326e-05,9.8744505050505054e-05],"6400":[0.00014408850000000001,0.000147124],"1344":[3.3327709999999997e-05,3.4326599999999998e-05],"126976":[0.004909091,0.004917238],"2883584":[0.45297085799999998,0.48088501500000003],"753664":[0.050322514500000005,0.083782624],"16384":[0.00043287250000000001,0.00043898900000000004],"131072":[0.0049587420000000004,0.0051403880000000001],"458752":[0.0206831975,0.041734345999999978],"172032":[0.008149743000000001,0.0082050390000000008],"12288":[0.000405084,0.00044352199999999991],"14680064":[2.3259348664999999,2.4014560230000002],"1536":[4.3808909999999994e-05,5.050444e-05],"25600":[0.00060399200000000003,0.0006404370000000001],"1835008":[0.21466318200000001,0.21908974000000001],"10752":[0.00031691400000000001,0.00033434199999999995],"21504":[0.00067828642857142851,0.00073359015384615381],"7602176":[1.1281511559999999,1.1575598229999999],"5632":[0.000168336,0.00017554124999999998],"10":[2.3962999999999998e-07,2.4558000000000001e-07],"3145728":[0.54196995599999997,0.54260538950000003],"245760":[0.010628523500000002,0.010936761999999997],"1728":[3.5983260000000002e-05,3.6183499999999997e-05],"11":[2.7433e-07,2.8297e-07],"1114112":[0.098114808500000011,0.155326882],"12":[2.7361000000000003e-07,2.7569999999999996e-07],"7340032":[1.0763463285000001,1.0902874389999999],"7168":[0.000175176,0.00017558937500000005],"13":[3.0321999999999998e-07,3.1424000000000004e-07],"6029312":[1.1371987534999999,1.1402767009999999],"14":[3.0685000000000002e-07,3.3071999999999999e-07],"3200":[6.8956950000000007e-05,7.2045829999999996e-05],"20":[4.0587999999999998e-07,4.9351999999999994e-07],"204800":[0.0079194759999999999,0.0085036590000000002],"15":[3.2441999999999999e-07,3.2627999999999998e-07],"13312":[0.00029735550000000002,0.000342102],"4980736":[0.81502605500000003,0.816300413],"118784":[0.0043686790000000003,0.0044565389999999998],"51200":[0.0013253641428571433,0.0013481607142857145],"16":[3.5120999999999998e-07,3.7184999999999998e-07],"21":[4.4196999999999998e-07,4.9033000000000008e-07],"917504":[0.071999336499999997,0.101353335],"22":[5.1425999999999995e-07,5.4499000000000001e-07],"4864":[0.00013208766666666667,0.00013357166666666667],"17":[3.6770999999999995e-07,4.0065999999999999e-07],"14848":[0.00037836926923076912,0.00038355399999999998],"23":[4.9668000000000002e-07,6.328e-07],"786432":[0.067269730999999999,0.078958914000000019],"18":[3.9045999999999996e-07,4.2632000000000002e-07],"1638400":[0.18789101800000002,0.22730202250000001],"7864320":[1.2076265079999999,1.2139636700000001],"24":[5.4344e-07,5.4366000000000004e-07],"14155776":[2.2453373249999999,2.288631691],"19":[3.7490999999999996e-07,4.2877000000000005e-07],"30":[5.8935000000000002e-07,6.0143939393939388e-07],"25":[4.9496999999999994e-07,5.2006000000000007e-07],"31":[5.9793999999999997e-07,6.3942999999999995e-07],"1280":[3.0052e-05,3.3405000000000003e-05],"26":[5.2445000000000001e-07,5.4208000000000005e-07],"3932160":[0.56917337700000004,0.57581680049999995],"2432":[6.1486000000000001e-05,6.4393999999999994e-05],"32":[6.1840000000000008e-07,6.7869e-07],"27":[5.2342000000000006e-07,5.2751999999999995e-07],"409600":[0.01802668,0.018979026]}},{"title":"OrderedSet intersection with Array (0% overlap)","results":{"28":[6.0668000000000003e-07,6.9571000000000003e-07],"34":[7.7367000000000002e-07,8.1823000000000004e-07],"29":[6.7235000000000001e-07,8.0822000000000007e-07],"40":[1.04867e-06,1.11238e-06],"17408":[0.00066267935714285728,0.00067926600000000009],"1472":[7.5176866666666668e-05,8.1500428571428565e-05],"112":[2.2549000000000002e-06,2.3108200000000001e-06],"1376256":[0.19989052699999998,0.30030035599999999],"5242880":[1.2407640180000001,1.246511664],"36":[8.1918999999999997e-07,9.7609e-07],"42":[1.1265900000000001e-06,1.5002000000000001e-06],"11534336":[3.6065533680000001,3.7246127379999998],"114688":[0.0043128705000000005,0.0045552539999999999],"144":[3.44061e-06,4.6922599999999997e-06],"38":[9.4946999999999999e-07,1.2467700000000001e-06],"240":[4.9525000000000004e-06,5.3586400000000001e-06],"9216":[0.00033639999999999999,0.00037900900000000003],"44":[1.3804099999999998e-06,1.6462799999999999e-06],"1664":[4.1251000000000002e-05,4.2959799999999995e-05],"196608":[0.018890771000000001,0.019723751500000001],"155648":[0.0084584110000000007,0.0086204369999999982],"2816":[0.00013611500000000002,0.00014173128571428573],"50":[1.00567e-06,1.00825e-06],"2359296":[0.38844390000000001,0.40478774200000001],"46":[1.3898799999999999e-06,1.5422400000000001e-06],"176":[6.6388199999999996e-06,8.9947499999999989e-06],"52":[1.0300699999999999e-06,1.0910799999999999e-06],"272":[6.2893333333333335e-06,9.5688299999999993e-06],"116":[2.3898999999999998e-06,2.40091e-06],"47104":[0.0026992069999999999,0.002872789666666666],"6912":[0.00020984399999999999,0.000216262],"1856":[5.2941022727272728e-05,5.325319e-05],"48":[1.55886e-06,2.1866400000000002e-06],"2097152":[0.29747466900000002,0.3306473365],"54":[1.0478499999999998e-06,1.18242e-06],"2031616":[0.2649867185,0.2699684785],"43008":[0.0019968629999999998,0.0020914139999999993],"60":[1.35129e-06,1.4970700000000001e-06],"30720":[0.0010316367500000001,0.001039515],"56":[1.18733e-06,1.2209100000000001e-06],"62":[1.3975800000000001e-06,1.4014100000000001e-06],"58":[1.2505999999999999e-06,1.31132e-06],"3014656":[0.87482194800000002,0.96045926999999998],"64":[1.36104e-06,1.6332000000000001e-06],"8388608":[1.5271062040000001,1.554942118],"29696":[0.00091410099999999995,0.00092315300000000012],"216":[4.8286400000000001e-06,5.4928199999999999e-06],"106496":[0.0037868655000000001,0.0041146359999999996],"72":[1.78047e-06,1.8664100000000001e-06],"442368":[0.021358039999999998,0.022342628],"147456":[0.0074580049999999993,0.0075880770000000004],"4456448":[0.80213831200000008,0.84432770449999994],"63488":[0.0023659565,0.0024067999999999997],"38912":[0.001558774,0.0016374479999999997],"68":[1.4818899999999999e-06,1.95689e-06],"188416":[0.015191988,0.015992619],"248":[5.2768289473684213e-06,5.6677799999999996e-06],"80":[2.51216e-06,2.5890100000000004e-06],"2560":[0.000102235,0.00010955600000000002],"34816":[0.0012742000000000001,0.0012957094285714285],"3712":[0.00011673660294117647,0.00011923023880597017],"3538944":[0.51584314249999996,0.526192828],"76":[1.8269400000000001e-06,2.0742800000000001e-06],"4194304":[0.69917445200000006,0.74964992050000001],"851968":[0.060782170499999989,0.095268488000000012],"4096":[0.00013790350000000002,0.00014004280281690142],"59392":[0.0020853879999999997,0.0022556317499999997],"84":[2.3603699999999999e-06,2.7661300000000001e-06],"3276800":[0.45079793000000001,0.50473241199999996],"55296":[0.001792091,0.0018792529999999998],"688128":[0.059062561999999999,0.082546970999999997],"8192":[0.00028238588235294105,0.000298776],"10240":[0.00046798134999999992,0.000468689],"15872":[0.0005339530000000001,0.00056898599999999984],"92":[3.5828700000000001e-06,6.4629999999999998e-06],"26624":[0.0007942248333333336,0.00082162299999999995],"1792":[4.8403020202020196e-05,5.2416449999999999e-05],"11776":[0.0007219669999999999,0.00072493061538461538],"2944":[0.00015608000000000001,0.00017309187037037037],"88":[3.1321799999999997e-06,3.3895600000000003e-06],"22528":[0.00120837875,0.0012707451428571428],"1245184":[0.15036933650000001,0.21142688600000001],"15728640":[2.8927729809999998,2.9068610260000001],"96":[4.2269000000000001e-06,6.5470899999999997e-06],"1984":[6.0905110000000001e-05,6.1010063492063488e-05],"139264":[0.006843699,0.0068814879999999998],"475136":[0.024336482499999999,0.030711936000000002],"13631488":[2.2369108695,2.285054396],"416":[8.4810000000000006e-06,8.8703299999999991e-06],"928":[2.3824470000000003e-05,2.3966730000000001e-05],"512":[1.28173e-05,1.3734170000000001e-05],"18432":[0.00075005799999999984,0.00075186100000000004],"16777216":[3.2583835799999998],"9728":[0.00039924408333333344,0.0004214559999999999],"1769472":[0.20719786200000001,0.22157643499999999],"1703936":[0.19222977500000005,0.21446356849999998],"2048":[6.3639547169811324e-05,6.6577599999999998e-05],"14336":[0.00043466400000000008,0.00046095389473684207],"448":[9.9452200000000006e-06,1.0295849999999999e-05],"5505024":[1.4142705960000002,1.421478158],"544":[1.5233639999999999e-05,1.5441800000000002e-05],"221184":[0.0095799130000000007,0.010587305],"90112":[0.0052427070000000001,0.0056151430000000004],"640":[2.191264e-05,2.2671687500000001e-05],"12800":[0.00037218700000000001,0.0003856757391304349],"262144":[0.013181416999999996,0.013426533000000001],"589824":[0.038054615999999999,0.064528792000000001],"884736":[0.07017548400000001,0.11052899049999999],"6144":[0.00040617137499999995,0.00044412066666666675],"1088":[3.3844000000000003e-05,3.5116500000000002e-05],"576":[1.660716e-05,1.7865465116279071e-05],"160":[4.1434500000000001e-06,5.1386666666666662e-06],"672":[2.6303960000000002e-05,2.6798059999999997e-05],"8912896":[1.7423374455,1.8233301145],"100":[1.9530900000000001e-06,1.9638300000000001e-06],"507904":[0.027564248499999999,0.054562640499999995],"3840":[0.00012273349999999999,0.00012329344285714284],"192":[1.0501e-05,1.0544809999999998e-05],"376832":[0.034531204999999995,0.034854055000000002],"98304":[0.0078144919999999993,0.0078602020000000002],"5376":[0.00023985099999999996,0.00025507918421052635],"94208":[0.0061349569999999982,0.0065448890000000008],"81920":[0.0039396969999999998,0.0040713545000000007],"3407872":[0.48062397300000004,0.485515951],"104":[1.9781799999999998e-06,2.1864200000000001e-06],"122880":[0.005487708,0.0057129030000000001],"200":[3.9599e-06,3.9882100000000001e-06],"163840":[0.0096820220000000002,0.010275318],"4063232":[0.65883656000000002,0.66887664250000001],"5767168":[1.6907005150000001,1.756129866],"12582912":[5.3234787135000001,10.153399483999999],"1600":[3.9799850000000001e-05,4.1717000000000001e-05],"136":[3.1165199999999999e-06,3.4250100000000001e-06],"232":[4.8599900000000002e-06,5.3985899999999996e-06],"7077888":[1.128132787,1.2028774760000001],"86016":[0.0046170065000000005,0.0046681550000000002],"31744":[0.0010461610000000001,0.0011109519999999999],"168":[5.1860999999999994e-06,5.3211499999999999e-06],"622592":[0.044172951000000016,0.06332549400000001],"108":[2.1034999999999999e-06,2.1793200000000002e-06],"327680":[0.021708427999999995,0.023295968],"2176":[7.231245945945946e-05,7.6921560000000003e-05],"3328":[9.3992000000000004e-05,0.00010511275],"1":[1.0644000000000001e-07,1.1129e-07],"2":[1.2130999999999999e-07,1.2181999999999999e-07],"3":[1.3635999999999998e-07,1.3665e-07],"4":[1.5117e-07,1.5248e-07],"7424":[0.00022790900000000002,0.00023934],"5":[1.7019000000000002e-07,1.7076999999999999e-07],"23552":[0.0013814770000000001,0.0014526304999999998],"6":[1.8521e-07,1.8556999999999999e-07],"61440":[0.0021505732500000001,0.0022308829999999995],"491520":[0.0252927625,0.038348724000000008],"77824":[0.0034502364999999999,0.0036273909999999993],"7":[2.0531999999999999e-07,2.0750999999999998e-07],"8":[2.1481999999999999e-07,2.2527e-07],"208":[4.1607400000000001e-06,4.2083500000000001e-06],"9":[2.3654999999999998e-07,2.8024999999999998e-07],"73728":[0.0031385360000000017,0.0032555323333333338],"304":[9.0148399999999999e-06,1.0128900000000001e-05],"400":[8.0328599999999995e-06,8.4926499999999991e-06],"1310720":[0.1744583985,0.24251925099999999],"336":[1.120492e-05,1.2440990000000001e-05],"3670016":[0.55049619800000005,0.57813044400000002],"6656":[0.00019426099999999996,0.00019819762222222226],"15360":[0.00050174900000000001,0.00051478400000000001],"432":[9.1288199999999994e-06,9.5072900000000006e-06],"950272":[0.073934396999999999,0.12111150599999999],"655360":[0.0489936235,0.079513111999999997],"69632":[0.002867517,0.002910012],"11264":[0.0005749344666666665,0.00059259999999999998],"2752512":[0.63217695099999993,0.65553367200000001],"8126464":[1.4599305839999999,1.4672811809999999],"27648":[0.0008572512727272729,0.00088742300000000003],"368":[1.4212e-05,2.1391389999999999e-05],"65536":[0.0025412770000000002,0.0025529480000000002],"16252928":[3.0362875615,3.0738434565000001],"464":[1.1109426470588236e-05,1.1644209999999998e-05],"1015808":[0.087698764999999998,0.13028219099999999],"3072":[0.000184771,0.00021305],"110592":[0.0040654474999999995,0.0043462685000000001],"237568":[0.010983584999999966,0.012367365999999999],"278528":[0.015237284,0.015888928],"496":[1.220032e-05,1.288034e-05],"13107200":[2.0918133079999999,2.1474019019999999],"9961472":[2.197633841,2.2671422310000002],"5888":[0.00031794599999999999,0.00033722099999999996],"11010048":[2.9253689679999999,3.0150016805000002],"1920":[5.6089099999999998e-05,5.8426617647058823e-05],"2490368":[0.44887336849999998,0.51997371599999997],"19456":[0.00080395399999999974,0.00084909600000000003],"57344":[0.0019465477999999997,0.0022213665],"1179648":[0.13097729799999999,0.1946856475],"4718592":[0.91554895749999998,0.94210729149999994],"360448":[0.028725916000000008,0.03177843100000001],"1572864":[0.36478602599999999,0.49411540999999998],"53248":[0.0016784544000000002,0.001749778],"3456":[0.00010042199999999997,0.000117526],"40960":[0.0017719560000000003,0.0017845506],"4608":[0.00017513263157894736,0.00018423799999999998],"13824":[0.000408644,0.00044301300000000002],"819200":[0.055345245499999994,0.091552435000000015],"983040":[0.083323499999999995,0.13002453000000003],"8704":[0.00030041700000000003,0.00033144176666666665],"120":[2.4503500000000002e-06,2.8307300000000003e-06],"1024":[2.7069000000000001e-05,3.4830780000000004e-05],"49152":[0.0031307873333333326,0.0034623079999999999],"524288":[0.029589333500000002,0.0437304835],"45056":[0.0022843080000000001,0.0023115117500000001],"229376":[0.010073296499999995,0.0111791445],"2688":[0.000111906,0.000129581],"152":[3.9790600000000003e-06,4.3613500000000002e-06],"5120":[0.000223551,0.000223859],"1507328":[0.30570368599999997,0.42341578499999999],"1216":[4.0494999999999998e-05,4.364006e-05],"1966080":[0.26014783000000002,0.26145865599999996],"1900544":[0.23320887299999998,0.24496172799999999],"184":[6.5039799999999993e-06,8.4545199999999998e-06],"7936":[0.00025651300000000004,0.00027209599999999999],"3801088":[0.57952061099999996,0.59335589799999999],"6815744":[1.050961875,1.118776875],"124":[2.7185000000000003e-06,2.8051200000000002e-06],"102400":[0.0035520664999999993,0.0036933599999999997],"311296":[0.018647292999999999,0.0192271],"1408":[6.0956999999999999e-05,6.7787000000000007e-05],"393216":[0.041330912499999997,0.043991620999999995],"4352":[0.00016206700000000001,0.00016427599999999996],"6553600":[1.0141305970000001,1.0505930560000001],"20480":[0.00093277144444444435,0.00094922966666666632],"608":[1.9633999999999999e-05,2.1706030000000001e-05],"2228224":[0.33713210599999999,0.36805458599999996],"36864":[0.0013852479999999999,0.0014775629999999999],"704":[2.7000810000000001e-05,2.8290210000000003e-05],"720896":[0.068283380999999962,0.099895957999999979],"800":[1.7462999999999999e-05,1.8013860000000001e-05],"2621440":[0.51282236000000003,0.55636675400000002],"425984":[0.019928421999999994,0.034661872000000017],"32768":[0.0011900600000000002,0.001206470125],"12058624":[4.3586655810000003,4.3705889579999999],"128":[2.7005799999999999e-06,2.9008400000000001e-06],"180224":[0.013175092000000003,0.013373807999999992],"224":[4.7333000000000001e-06,5.3970000000000002e-06],"736":[3.2011850000000001e-05,3.2521509999999998e-05],"320":[9.8189900000000013e-06,1.0999130000000002e-05],"557056":[0.033638736000000002,0.043992433000000004],"832":[1.9798440000000003e-05,2.0046699999999999e-05],"9437184":[1.9709516650000001,1.97904777],"3584":[0.00010947701190476187,0.00010948200000000002],"6291456":[2.5607786479999999,2.5760683145000001],"256":[5.5786078431372549e-06,6.3621249999999997e-06],"15204352":[2.6986208,2.762468385],"28672":[0.00085768999999999982,0.0009378174],"768":[4.150021e-05,4.3343519999999997e-05],"212992":[0.0091250210000000144,0.0094192899999999986],"864":[2.0322990000000001e-05,2.2014119999999998e-05],"352":[1.4657540000000001e-05,1.6484999999999999e-05],"253952":[0.012392847,0.012574189999999999],"960":[2.5335999999999999e-05,2.7107659999999999e-05],"24576":[0.0016951870000000001,0.0016960518000000001],"7680":[0.00023795500000000003,0.00026547799999999998],"294912":[0.017251869,0.018252871],"1048576":[0.096633146999999975,0.14954242100000001],"10485760":[2.535193955,2.5801583880000001],"344064":[0.026046964500000002,0.026822882999999985],"288":[7.2749999999999998e-06,8.6680599999999998e-06],"1152":[3.7447000000000002e-05,3.7715259999999998e-05],"384":[1.5962739999999998e-05,2.0764462962962962e-05],"2304":[8.6173560000000002e-05,9.0945065934065937e-05],"896":[2.1421e-05,2.3275969999999997e-05],"480":[1.1028e-05,1.1403000000000001e-05],"1441792":[0.25425029999999998,0.34790581600000003],"992":[2.6312000000000002e-05,2.7153370000000001e-05],"3968":[0.00013144099999999999,0.00013179199999999999],"6400":[0.00017493900000000004,0.0001942465],"1344":[5.5062310000000004e-05,5.7726000000000003e-05],"126976":[0.0053555920000000002,0.0054499349999999986],"2883584":[0.71146170600000003,0.75509515699999996],"753664":[0.080753270000000002,0.133197447],"16384":[0.0005853660625,0.00059916600000000004],"131072":[0.0058073789999999997,0.0058233759999999999],"458752":[0.022704874,0.040075839500000002],"172032":[0.011277459,0.011532766],"12288":[0.00081739299999999992,0.00085625900000000006],"14680064":[2.5290894215000002,2.6479726430000001],"1536":[8.6530250000000004e-05,0.00010819839560439557],"25600":[0.00073091638461538465,0.00076552918181818186],"1835008":[0.21155192550000002,0.22303220700000001],"10752":[0.00051318999999999996,0.00052245999999999998],"21504":[0.0010304146666666664,0.00108734],"7602176":[1.264245257,1.2859553159999999],"5632":[0.00028776399999999998,0.0002901716060606062],"10":[2.7144999999999996e-07,2.8183000000000003e-07],"3145728":[1.0564093020000001,1.087976179],"245760":[0.0117069175,0.0120779175],"1728":[4.5641559999999997e-05,4.8134650000000002e-05],"11":[3.1192e-07,3.2430000000000001e-07],"1114112":[0.12077890000000002,0.170121459],"12":[3.1087000000000003e-07,3.3658000000000001e-07],"7340032":[1.1649192450000001,1.18983807],"7168":[0.00022678792682926836,0.00023264599999999998],"13":[3.3599999999999999e-07,3.6830999999999999e-07],"6029312":[2.023010969,2.0291358074999999],"14":[3.5982e-07,3.9396000000000002e-07],"3200":[8.7010339999999992e-05,9.3340780000000011e-05],"20":[4.9991999999999999e-07,5.1643000000000003e-07],"204800":[0.0082502269999999989,0.0086612619999999994],"15":[4.1190999999999999e-07,5.0918000000000001e-07],"13312":[0.0004026447083333333,0.000412108904761905],"4980736":[1.04699316,1.0689764385],"118784":[0.0048099229999999989,0.004857536],"51200":[0.0015506129999999997,0.0016066553333333338],"16":[4.0367000000000001e-07,4.0655000000000005e-07],"21":[5.6850000000000004e-07,5.7960000000000003e-07],"917504":[0.070417908500000001,0.103447073],"22":[6.2996000000000006e-07,7.8803e-07],"4864":[0.00019745299999999999,0.00021976450000000001],"17":[4.3495000000000001e-07,4.7599999999999997e-07],"14848":[0.00048144099999999999,0.0005038736315789474],"23":[7.2867000000000003e-07,8.436399999999999e-07],"786432":[0.105923946,0.16267064000000001],"18":[4.7005999999999996e-07,6.1513000000000003e-07],"1638400":[0.1789578775,0.21147687900000001],"7864320":[1.3577311715,1.3690119410000001],"24":[7.2623000000000001e-07,9.2926999999999996e-07],"14155776":[2.4081280629999999,2.4242451589999998],"19":[4.6662000000000003e-07,5.3010999999999997e-07],"30":[7.0847999999999995e-07,7.4885000000000004e-07],"25":[5.1696000000000004e-07,5.5051000000000002e-07],"31":[6.9581999999999999e-07,7.2416000000000005e-07],"1280":[4.8380439999999998e-05,5.3945659999999998e-05],"26":[5.5402999999999999e-07,6.1617000000000004e-07],"3932160":[0.61543647099999998,0.63203412199999998],"2432":[9.0803142857142854e-05,9.8260670103092791e-05],"32":[7.4602000000000006e-07,7.8327999999999996e-07],"27":[5.6310000000000006e-07,6.0047000000000003e-07],"409600":[0.018852366999999998,0.019868025000000004]}},{"title":"OrderedSet intersection with Array (25% overlap)","results":{"28":[7.3714000000000005e-07,7.4280000000000001e-07],"34":[9.1360000000000003e-07,9.3460000000000002e-07],"29":[7.8874000000000001e-07,8.8520999999999997e-07],"40":[1.1988700000000001e-06,1.2596800000000001e-06],"17408":[0.00078128499999999994,0.00083940399999999987],"1472":[8.7684545454545459e-05,9.0062999999999995e-05],"112":[3.326e-06,3.5121499999999999e-06],"1376256":[0.209006103,0.33616984100000002],"5242880":[1.255636099,1.270082484],"36":[9.5397999999999997e-07,1.0364299999999999e-06],"42":[1.2964500000000001e-06,1.5515599999999998e-06],"11534336":[3.624363899,3.8185840039999999],"114688":[0.0055911900000000002,0.0057039959999999985],"144":[4.9232499999999998e-06,5.9721199999999997e-06],"38":[1.07094e-06,1.1450799999999999e-06],"240":[7.2235000000000004e-06,7.6612000000000004e-06],"9216":[0.00042430199999999994,0.0004577833809523811],"44":[1.3272800000000001e-06,1.55913e-06],"1664":[5.8150169999999996e-05,6.0007699999999998e-05],"196608":[0.020046247,0.020125104999999997],"155648":[0.0099447774999999999,0.010029395],"2816":[0.00015342733870967745,0.00016613700000000001],"50":[1.1690299999999999e-06,1.16964e-06],"2359296":[0.40812648200000001,0.41429764950000003],"46":[1.46646e-06,1.7336900000000002e-06],"176":[7.5800599999999994e-06,9.3841099999999995e-06],"52":[1.20433e-06,1.2649e-06],"272":[8.7834999999999998e-06,1.1554600000000001e-05],"116":[3.5144300000000002e-06,3.56409e-06],"47104":[0.0030307329999999999,0.0030342069999999997],"6912":[0.00026757099999999998,0.00029430809090909082],"1856":[6.6723000000000005e-05,7.0005000000000005e-05],"48":[1.62617e-06,2.2103611111111114e-06],"2097152":[0.3340555295,0.38072019099999999],"54":[1.24738e-06,1.3552299999999999e-06],"2031616":[0.290795264,0.30306157700000003],"43008":[0.0023915020000000002,0.0024751210000000003],"60":[1.52447e-06,1.6039799999999999e-06],"30720":[0.001296667,0.0013136209999999998],"56":[1.3690900000000001e-06,1.41154e-06],"62":[2.1216900000000001e-06,2.1974599999999999e-06],"58":[1.4501400000000001e-06,1.50461e-06],"3014656":[0.87496210899999993,0.95151149300000004],"64":[2.1175000000000001e-06,2.3353299999999999e-06],"8388608":[1.684396518,1.7707668519999999],"29696":[0.001283270142857143,0.0012902271428571427],"216":[6.7602799999999998e-06,7.8779999999999998e-06],"106496":[0.0048617384999999997,0.0052861309999999995],"72":[2.5434800000000002e-06,2.7742000000000001e-06],"442368":[0.027428286,0.027457039999999999],"147456":[0.0087190410000000003,0.0092147430000000009],"4456448":[0.89708079799999996,0.91481815],"63488":[0.0029636570000000002,0.0031243613333333331],"38912":[0.001875696,0.0019611540000000001],"68":[2.2013500000000001e-06,2.7917399999999997e-06],"188416":[0.016104864999999999,0.017239227999999999],"248":[7.6254199999999996e-06,8.2175499999999989e-06],"80":[3.3739700000000002e-06,3.3950700000000003e-06],"2560":[0.00012360099999999998,0.00012915100000000004],"34816":[0.0015808825,0.0016080911666666667],"3712":[0.00014320499999999995,0.00014823029687499999],"3538944":[0.56751156300000005,0.59232666200000006],"76":[2.6586499999999999e-06,2.8697199999999999e-06],"4194304":[0.74597469199999999,0.81883742299999995],"851968":[0.072562423000000001,0.12651918550000002],"4096":[0.00017260599999999998,0.000173244],"59392":[0.0026545099999999997,0.002862439],"84":[3.1029e-06,3.58049e-06],"3276800":[0.54803702099999996,0.63770467650000007],"55296":[0.0023380279999999998,0.00241802225],"688128":[0.062249677999999996,0.094199332499999983],"8192":[0.00035110300000000007,0.000372331],"10240":[0.00050918199999999984,0.00053297499999999999],"15872":[0.00068731685714285722,0.00072333053846153881],"92":[4.3017599999999998e-06,6.7554099999999996e-06],"26624":[0.0010436010000000003,0.001062948],"1792":[6.4143814814814822e-05,6.5911959999999999e-05],"11776":[0.00076775958333333326,0.00079807641666666677],"2944":[0.00016882899999999998,0.00017881099999999997],"88":[3.9194799999999998e-06,4.1004800000000003e-06],"22528":[0.0013813370000000001,0.0014315625000000001],"1245184":[0.17257577199999999,0.23587677400000001],"15728640":[3.3309054095000001,3.4618382474999998],"96":[4.4450799999999995e-06,7.3749899999999998e-06],"1984":[7.663519e-05,7.9456124999999995e-05],"139264":[0.0078971719999999992,0.0082455419999999981],"475136":[0.030832935499999999,0.040131418500000002],"13631488":[2.625810773,2.7644138730000001],"416":[1.24635e-05,1.2810869999999999e-05],"928":[3.2492890000000001e-05,3.2668187499999996e-05],"512":[1.7779e-05,1.8058139999999999e-05],"18432":[0.00086997299999999991,0.00090984700000000009],"16777216":[3.7743282329999999],"9728":[0.00048011084210526303,0.00050091194736842106],"1769472":[0.23750854399999999,0.249276002],"1703936":[0.23656233500000001,0.247729486],"2048":[7.9999350000000002e-05,8.3550404040404037e-05],"14336":[0.00057297500000000009,0.00058331626666666679],"448":[1.439424e-05,1.4747090000000001e-05],"5505024":[1.4290649280000001,1.4398307429999999],"544":[2.0425669999999998e-05,2.0549710000000001e-05],"221184":[0.011956013999999999,0.013334732],"90112":[0.0058414210000000003,0.0061477349999999997],"640":[2.6809e-05,2.6878380000000002e-05],"12800":[0.00049023933333333333,0.00052642677777777771],"262144":[0.01611224,0.016921715],"589824":[0.043768755999999999,0.065411842999999997],"884736":[0.07573956300000001,0.12800245399999999],"6144":[0.00044883280952380956,0.00046442423809523825],"1088":[4.280877e-05,4.4595000000000002e-05],"576":[2.1667309999999999e-05,2.2713680000000001e-05],"160":[5.7939999999999999e-06,6.7490799999999998e-06],"672":[2.8836999999999999e-05,3.170381e-05],"8912896":[1.9572947380000001,1.999727408],"100":[3.0364400000000001e-06,3.1898499999999996e-06],"507904":[0.034828291999999976,0.052341737999999992],"3840":[0.000150994,0.00015785300000000004],"192":[1.0716079999999999e-05,1.2505960000000001e-05],"376832":[0.036411441000000003,0.037749313500000006],"98304":[0.0081381480000000013,0.008483636000000001],"5376":[0.00029047855882352944,0.00029636800000000003],"94208":[0.0068013299999999995,0.007253369],"81920":[0.0047305730000000001,0.0047491180000000001],"3407872":[0.5759126725,0.58285304849999997],"104":[3.0514700000000004e-06,3.2457999999999999e-06],"122880":[0.0070264529999999993,0.0070771089999999981],"200":[5.9410000000000004e-06,6.4734499999999998e-06],"163840":[0.0111314725,0.011880475],"4063232":[0.73422497200000003,0.75120752199999996],"5767168":[1.668168731,1.7091305864999999],"12582912":[5.1224712209999996,9.9076133039999998],"1600":[5.3121039999999998e-05,5.704141e-05],"136":[4.4346099999999997e-06,4.5951700000000001e-06],"232":[7.1560000000000006e-06,7.3015999999999997e-06],"7077888":[1.3371967549999999,1.4702266785],"86016":[0.0053000340000000012,0.0053101949999999993],"31744":[0.001377826,0.0013949349999999999],"168":[6.5822099999999993e-06,7.38905e-06],"622592":[0.052000475500000011,0.06901154399999998],"108":[3.3632352941176471e-06,3.4097199999999999e-06],"327680":[0.024176791999999996,0.025988268499999995],"2176":[8.8490800000000003e-05,9.363374e-05],"3328":[0.000124294,0.000143378],"1":[1.1783e-07,1.2340000000000001e-07],"2":[1.9890000000000001e-07,2.0004999999999999e-07],"3":[2.1409000000000001e-07,2.2140000000000001e-07],"4":[2.2975e-07,2.4652000000000001e-07],"7424":[0.00030130800000000002,0.00031496020689655163],"5":[2.5431000000000001e-07,2.5479999999999998e-07],"23552":[0.0015369983333333331,0.001620727],"6":[2.6643956043956043e-07,2.7015999999999998e-07],"61440":[0.00272069,0.0028221583333333335],"491520":[0.034070119500000016,0.048839189999999998],"77824":[0.0041951139999999989,0.0042384610000000007],"7":[2.9154999999999999e-07,2.9488999999999996e-07],"8":[3.1384000000000001e-07,3.1488000000000002e-07],"208":[6.3583200000000003e-06,6.5370499999999995e-06],"9":[3.2305000000000002e-07,3.2753999999999998e-07],"73728":[0.0037988419999999993,0.0039739690000000008],"304":[1.1366950000000001e-05,1.2568440000000001e-05],"400":[1.1955719999999999e-05,1.231459e-05],"1310720":[0.2069120965,0.25573306100000004],"336":[1.4539469696969697e-05,1.6896039999999998e-05],"3670016":[0.62905965850000001,0.65436318800000004],"6656":[0.00025358899999999992,0.00025380892307692306],"15360":[0.00063668199999999996,0.000647771],"432":[1.3493990000000001e-05,1.374208e-05],"950272":[0.086779124000000013,0.14323688500000001],"655360":[0.05547358099999998,0.071076421000000015],"69632":[0.003302602,0.0036582669999999998],"11264":[0.00063018299999999998,0.000672264],"2752512":[0.64807285400000003,0.66704912500000002],"8126464":[1.694711901,1.7021450334999999],"27648":[0.0010739200000000001,0.001122527625],"368":[1.8292130000000003e-05,2.2155720930232555e-05],"65536":[0.003151167666666667,0.0032394140000000008],"16252928":[3.4403584550000001,3.639572233],"464":[1.503257e-05,1.526761e-05],"1015808":[0.10257543800000002,0.15293063600000001],"3072":[0.00020322,0.000213167],"110592":[0.0052171250000000004,0.005625087],"237568":[0.0135144705,0.014473401],"278528":[0.018320018,0.018695756000000001],"496":[1.6715370000000001e-05,1.8150639999999998e-05],"13107200":[2.6422845700000002,2.7072923850000001],"9961472":[2.3851388115000001,2.5550320109999998],"5888":[0.00035725000000000004,0.00036640084615384612],"11010048":[3.1581551344999998,3.1827219835],"1920":[7.307542999999999e-05,7.3116722222222222e-05],"2490368":[0.469032852,0.51294113699999999],"19456":[0.0010006864444444478,0.0010014292222222225],"57344":[0.002459017,0.0028441220000000006],"1179648":[0.14715658300000001,0.19949001999999999],"4718592":[0.97956185699999998,0.99936666900000004],"360448":[0.0312894035,0.03392585699999999],"1572864":[0.36108910699999996,0.48725432749999997],"53248":[0.0021337062500000003,0.0022727910000000001],"3456":[0.00012521866666666666,0.00016339819607843136],"40960":[0.0021562449999999998,0.0022219314999999996],"4608":[0.00021174100000000002,0.00021643306666666663],"13824":[0.00054101799999999999,0.00054488099999999999],"819200":[0.070513434999999999,0.10705425],"983040":[0.101202159,0.142067692],"8704":[0.00039521204166666674,0.00040072700000000003],"120":[3.5904500000000001e-06,4.2663799999999998e-06],"1024":[3.6965589999999997e-05,4.3432e-05],"49152":[0.0033839199999999995,0.0036710670000000001],"524288":[0.037106611999999997,0.052704821999999998],"45056":[0.0026272176666666675,0.0027514816666666655],"229376":[0.0125919815,0.014156851],"2688":[0.00013275829999999999,0.00014910700000000002],"152":[5.3472800000000007e-06,5.5629200000000003e-06],"5120":[0.00026081599999999998,0.00026161610810810802],"1507328":[0.31414751299999999,0.424936698],"1216":[5.0062499999999997e-05,5.348635e-05],"1966080":[0.288467523,0.3002461475],"1900544":[0.29244014299999999,0.30229387499999999],"184":[8.1720299999999994e-06,9.4770099999999999e-06],"7936":[0.00032837400000000004,0.00034507681481481484],"3801088":[0.69283032300000003,0.69947835999999997],"6815744":[1.2930108645,1.3779535595000001],"124":[3.8916899999999997e-06,3.9982800000000006e-06],"102400":[0.0046272219999999994,0.004798854],"311296":[0.022204254,0.022929541500000001],"1408":[6.9948000000000002e-05,7.9256000000000001e-05],"393216":[0.042665162999999999,0.0448993315],"4352":[0.000188035,0.00020419493023255815],"6553600":[1.205915262,1.30374082],"20480":[0.0010853310000000001,0.0011844326249999999],"608":[2.4992270000000003e-05,2.6683649999999997e-05],"2228224":[0.38076381100000001,0.41203602299999997],"36864":[0.0017302906,0.001790774],"704":[3.0204346938775513e-05,3.3552333333333334e-05],"720896":[0.083082158000000003,0.1232222845],"800":[2.6351949999999998e-05,2.6718580000000001e-05],"2621440":[0.56654738100000002,0.58261728749999997],"425984":[0.026456889499999997,0.038293417999999996],"32768":[0.0014616628333333334,0.0014660179999999995],"12058624":[4.2341332295000003,4.3392579160000002],"128":[3.9852800000000001e-06,4.2094099999999997e-06],"180224":[0.014537725,0.015198603],"224":[6.6892399999999997e-06,7.9826200000000002e-06],"736":[3.6875999999999997e-05,4.0642320000000004e-05],"320":[1.2600090000000001e-05,1.3162e-05],"557056":[0.038903985999999995,0.052896692000000002],"832":[2.5043000000000001e-05,2.7469939999999999e-05],"9437184":[2.1220482330000001,2.168550588],"3584":[0.00014247525757575752,0.00014465000000000002],"6291456":[2.3923454325,2.4079724580000001],"256":[7.938196721311476e-06,9.1303499999999998e-06],"15204352":[3.131301825,3.3534209910000001],"28672":[0.0011534816249999999,0.0011807176250000003],"768":[4.4159300000000003e-05,4.7596000000000003e-05],"212992":[0.011724231,0.0117843125],"864":[2.7705899999999998e-05,3.1082166666666665e-05],"352":[1.723708e-05,1.8908310000000001e-05],"253952":[0.015060586000000039,0.015152907],"960":[3.4306246753246755e-05,3.633165e-05],"24576":[0.0017818666,0.001846189],"7680":[0.000313546,0.00031375799999999986],"294912":[0.020114378000000006,0.021254826000000001],"1048576":[0.109217332,0.17593555999999999],"10485760":[2.684253225,2.726953226],"344064":[0.029111850500000001,0.031899849500000001],"288":[1.0022519999999999e-05,1.1486820000000001e-05],"1152":[4.8113479999999998e-05,5.2034359999999995e-05],"384":[1.9404999999999998e-05,2.156508e-05],"2304":[0.000106368,0.00010960887640449437],"896":[3.052011e-05,3.0775289999999996e-05],"480":[1.5838650000000001e-05,1.6828240000000002e-05],"1441792":[0.25117851050000001,0.34643467449999998],"992":[3.5163120000000004e-05,3.6184759999999997e-05],"3968":[0.00016332599999999999,0.00017054900000000004],"6400":[0.00023873499999999998,0.00025432299999999998],"1344":[6.6415847826086958e-05,6.8622910000000004e-05],"126976":[0.0066020470000000015,0.0068458029999999993],"2883584":[0.70023358200000008,0.79062599150000001],"753664":[0.088462155000000015,0.1367321],"16384":[0.00074361100000000014,0.00077408391666666679],"131072":[0.0070420420000000001,0.0072418080000000006],"458752":[0.027346419,0.0550057355],"172032":[0.012658892,0.0130983935],"12288":[0.00087749500000000005,0.000911425],"14680064":[3.0349550394999998,3.4460760029999999],"1536":[9.9347999999999998e-05,0.00011667466233766238],"25600":[0.00098397200000000006,0.000999558],"1835008":[0.25304044949999999,0.26348095699999996],"10752":[0.00058152099999999999,0.00059658199999999991],"21504":[0.001232283,0.0012824240000000001],"7602176":[1.4989169710000001,1.5512131789999999],"5632":[0.00031608199999999992,0.00033405589655172418],"10":[3.5040000000000001e-07,3.6818000000000001e-07],"3145728":[0.97584581199999998,1.04107511],"245760":[0.01433163,0.015283906],"1728":[6.1328950000000005e-05,6.3748169999999999e-05],"11":[3.9777000000000005e-07,4.0091000000000001e-07],"1114112":[0.14119339049999999,0.22004270100000001],"12":[3.8912999999999999e-07,4.1456999999999999e-07],"7340032":[1.407378493,1.4785891360000001],"7168":[0.00028053900000000006,0.00029086124242424236],"13":[4.4913999999999996e-07,4.7054000000000003e-07],"6029312":[1.996656177,1.998184414],"14":[4.6480999999999999e-07,5.0282999999999996e-07],"3200":[0.00011573326829268294,0.00011751],"20":[5.7856000000000001e-07,6.2363999999999999e-07],"204800":[0.010715512,0.011305136],"15":[5.0436000000000005e-07,5.5640999999999994e-07],"13312":[0.00051752500000000002,0.00051842005555555572],"4980736":[1.1273202615,1.1333271970000001],"118784":[0.0059967900000000001,0.0060693079999999998],"51200":[0.0020557857500000001,0.0021053135000000003],"16":[5.3015999999999998e-07,5.4707000000000004e-07],"21":[6.3398000000000007e-07,6.7764999999999998e-07],"917504":[0.091271138500000043,0.12308495999999999],"22":[7.315800000000001e-07,8.1799999999999994e-07],"4864":[0.000226235,0.00024949856756756756],"17":[5.5010999999999999e-07,5.8502999999999999e-07],"14848":[0.00063511699999999993,0.00064132559999999976],"23":[7.6120999999999997e-07,1.1946499999999999e-06],"786432":[0.106685157,0.152759806],"18":[5.7058999999999992e-07,6.2996000000000006e-07],"1638400":[0.222223585,0.22251072199999999],"7864320":[1.5150700475000001,1.5997814690000001],"24":[9.5927000000000009e-07,9.6517999999999996e-07],"14155776":[2.9656337724999999,3.0430132799999998],"19":[5.5464e-07,6.2452000000000004e-07],"30":[8.2434000000000003e-07,8.5865999999999999e-07],"25":[6.5054e-07,6.9388999999999998e-07],"31":[8.1359999999999993e-07,8.1724000000000003e-07],"1280":[5.5886253731343282e-05,6.3256920000000002e-05],"26":[7.2711000000000006e-07,7.6299999999999994e-07],"3932160":[0.72285678050000002,0.72498950100000004],"2432":[0.00011458,0.00012586566666666666],"32":[8.4899999999999994e-07,8.7191000000000003e-07],"27":[6.9108000000000002e-07,6.9943000000000001e-07],"409600":[0.024418508500000002,0.025891314000000006]}},{"title":"OrderedSet intersection with Array (50% overlap)","results":{"28":[7.8634000000000004e-07,8.1431000000000004e-07],"34":[1.4306700000000001e-06,1.59471e-06],"29":[8.2236000000000001e-07,9.0393999999999998e-07],"40":[1.9232099999999999e-06,2.12698e-06],"17408":[0.00092122000000000005,0.00096007000000000004],"1472":[0.000100548,0.000102866],"112":[4.3374999999999996e-06,4.4751600000000005e-06],"1376256":[0.26632188099999998,0.32314941799999997],"5242880":[1.4144292155,1.4614346965],"36":[1.6451700000000002e-06,1.74506e-06],"42":[2.1359199999999999e-06,2.2927099999999999e-06],"11534336":[3.6592931119999998,3.7614227745000002],"114688":[0.0067128970000000007,0.0068719030000000004],"144":[6.25341e-06,6.8933600000000005e-06],"38":[1.77712e-06,1.9448100000000003e-06],"240":[9.5015000000000004e-06,9.7031700000000001e-06],"9216":[0.000477369,0.00053726916666666674],"44":[2.15268e-06,2.3293700000000001e-06],"1664":[7.1253699999999998e-05,7.2506916666666659e-05],"196608":[0.020903582,0.021620572000000005],"155648":[0.011575815500000001,0.011663727],"2816":[0.00017126700000000001,0.00017649700000000004],"50":[2.0162700000000001e-06,2.0316799999999998e-06],"2359296":[0.44118317800000001,0.46418976700000003],"46":[2.2880700000000002e-06,2.4565000000000001e-06],"176":[8.9229900000000001e-06,1.0552689999999999e-05],"52":[2.1476199999999997e-06,2.1566599999999998e-06],"272":[1.1016666666666666e-05,1.3588339999999999e-05],"116":[4.5263999999999996e-06,4.5779599999999998e-06],"47104":[0.0033406205,0.0035151590000000003],"6912":[0.00032307400000000002,0.00032908699999999999],"1856":[8.1735000000000003e-05,8.5542733333333337e-05],"48":[2.3896e-06,3.0238500000000003e-06],"2097152":[0.35398266099999998,0.43350192799999998],"54":[2.2624200000000003e-06,2.2672499999999998e-06],"2031616":[0.35703999850000001,0.36162708300000002],"43008":[0.0026886059999999996,0.0028033473333333326],"60":[2.5622499999999999e-06,2.64719e-06],"30720":[0.0015678866666666662,0.0015967000000000002],"56":[2.3578300000000001e-06,2.37142e-06],"62":[2.6412899999999997e-06,2.7579699999999997e-06],"58":[2.3325999999999999e-06,2.4982200000000002e-06],"3014656":[0.82740933750000001,0.94091749300000005],"64":[2.7905799999999999e-06,2.8094300000000001e-06],"8388608":[2.0181557225,2.0733732950000001],"29696":[0.0014825349999999997,0.0015350020000000002],"216":[8.7403333333333334e-06,1.009201e-05],"106496":[0.0060277030000000006,0.0066012630000000013],"72":[3.3222599999999997e-06,3.4309000000000001e-06],"442368":[0.03471080700000001,0.041404114499999999],"147456":[0.010449432,0.0108758815],"4456448":[0.97691092199999996,1.0537098865000001],"63488":[0.0035821160000000006,0.003604065],"38912":[0.0022237350000000001,0.0023716279999999998],"68":[2.8050900000000002e-06,3.0451600000000003e-06],"188416":[0.01776144,0.018016652500000001],"248":[1.0334166666666667e-05,1.0758510000000001e-05],"80":[3.7416800000000004e-06,4.16465e-06],"2560":[0.00014507987692307696,0.00015082599999999998],"34816":[0.0018966256000000001,0.0019129595999999999],"3712":[0.00017242900000000004,0.00018319501960784306],"3538944":[0.65967508400000008,0.71002741549999993],"76":[3.5342799999999996e-06,3.6448999999999996e-06],"4194304":[0.90557602299999995,0.94986562600000002],"851968":[0.083909361000000016,0.13309977949999999],"4096":[0.00020792,0.000212578],"59392":[0.0032050645000000003,0.0034402390000000003],"84":[3.7728399999999999e-06,4.1432499999999997e-06],"3276800":[0.59608536899999998,0.62918006199999998],"55296":[0.002853221,0.0029686489999999999],"688128":[0.069465842,0.096931979999999987],"8192":[0.00042950300000000008,0.0004585524761904763],"10240":[0.00061477500000000002,0.00061845400000000027],"15872":[0.00079370700000000005,0.00084092800000000012],"92":[5.0644999999999995e-06,7.6980100000000005e-06],"26624":[0.0012748100000000001,0.0013291197142857147],"1792":[7.8369999999999997e-05,8.1385999999999996e-05],"11776":[0.00085367654545454551,0.00086097999999999969],"2944":[0.00018674659999999999,0.000202093],"88":[4.4096400000000004e-06,4.7219200000000002e-06],"22528":[0.001455474,0.001585899],"1245184":[0.19267113200000002,0.2422630885],"15728640":[3.9318872345,4.1719503360000001],"96":[5.00261e-06,7.6989300000000005e-06],"1984":[9.3675210000000001e-05,9.5198999999999994e-05],"139264":[0.0095170439999999988,0.0098169399999999997],"475136":[0.039305539,0.046967372],"13631488":[3.2354351755000001,3.4300720679999999],"416":[1.5755000000000001e-05,1.6441400000000002e-05],"928":[4.1171999999999998e-05,4.1935352941176472e-05],"512":[2.247233e-05,2.366048e-05],"18432":[0.00104222,0.001063086],"16777216":[4.433155653],"9728":[0.00054913900000000003,0.00055557050000000008],"1769472":[0.277023884,0.30413385949999999],"1703936":[0.28364399600000001,0.30650839400000002],"2048":[9.6386697916666674e-05,0.00010403429347826089],"14336":[0.00065863300000000016,0.00068510799999999981],"448":[1.8248099999999999e-05,1.8305820000000002e-05],"5505024":[1.484480225,1.553678248],"544":[2.4718040000000002e-05,2.5150580000000001e-05],"221184":[0.014343838999999997,0.017097306999999999],"90112":[0.006526408,0.007042511999999999],"640":[3.248192e-05,3.3641569999999998e-05],"12800":[0.00060252162499999996,0.00061772800000000001],"262144":[0.019136165,0.019304821],"589824":[0.056914611999999996,0.077807335999999991],"884736":[0.09863121900000002,0.15282459800000001],"6144":[0.00046765461904761896,0.00047205585000000011],"1088":[5.32718e-05,5.4266210000000006e-05],"576":[2.6508499999999999e-05,2.7347159999999999e-05],"160":[7.24598e-06,8.0416900000000006e-06],"672":[3.6192000000000002e-05,3.6874159999999997e-05],"8912896":[2.2855341060000001,2.3539881199999999],"100":[3.8445500000000003e-06,4.1109199999999996e-06],"507904":[0.039911501000000002,0.077735138000000009],"3840":[0.00018979852941176524,0.000197636],"192":[1.1905e-05,1.3575e-05],"376832":[0.038558622000000001,0.039329161999999994],"98304":[0.008541418999999998,0.0088066599999999974],"5376":[0.00032717400000000001,0.00033116017857142853],"94208":[0.007355829999999999,0.0080179780000000003],"81920":[0.0052575139999999996,0.0054049349999999996],"3407872":[0.64462661399999999,0.69918248549999995],"104":[3.9943333333333334e-06,4.1836299999999996e-06],"122880":[0.0080032330000000002,0.0093438199999999992],"200":[7.8026799999999993e-06,8.3306499999999996e-06],"163840":[0.012629506,0.012773201],"4063232":[0.79800128800000003,0.83696010600000004],"5767168":[1.7131374560000001,1.7919377949999999],"12582912":[4.8369109290000001,9.8042041320000006],"1600":[6.8312479999999999e-05,6.9232000000000004e-05],"136":[5.6002099999999992e-06,6.0198000000000004e-06],"232":[9.4943600000000007e-06,9.5992100000000002e-06],"7077888":[1.581304568,1.7362970290000002],"86016":[0.0058949419999999994,0.0061607349999999988],"31744":[0.001607296,0.001714681],"168":[8.3361199999999994e-06,8.4804799999999998e-06],"622592":[0.060778849000000003,0.075283763000000004],"108":[4.1861600000000004e-06,4.2415699999999998e-06],"327680":[0.027704152000000003,0.028038443],"2176":[0.00010830100000000002,0.0001108095],"3328":[0.00015444022580645165,0.00017828318181818185],"1":[1.1773000000000001e-07,1.2334000000000002e-07],"2":[1.9817000000000001e-07,1.9837e-07],"3":[2.2751999999999999e-07,2.2903999999999999e-07],"4":[2.3703999999999998e-07,2.3779000000000001e-07],"7424":[0.00034759199999999997,0.00038073249999999995],"5":[2.5952000000000004e-07,2.6024999999999996e-07],"23552":[0.0016406680000000001,0.0017181220000000003],"6":[2.7604999999999999e-07,2.8010000000000003e-07],"61440":[0.00329758,0.0035134879999999995],"491520":[0.037746347,0.058412660999999998],"77824":[0.0048500090000000006,0.0048663979999999992],"7":[3.1089e-07,3.1483999999999998e-07],"8":[3.157e-07,3.2957000000000001e-07],"208":[7.9795000000000004e-06,8.2290000000000003e-06],"9":[3.4611999999999998e-07,3.5158999999999999e-07],"73728":[0.0045007909999999996,0.0046705034999999992],"304":[1.361174e-05,1.510335e-05],"400":[1.5836870000000002e-05,1.7337069999999998e-05],"1310720":[0.20450228300000001,0.26645621200000003],"336":[1.6598809999999998e-05,1.9476549999999999e-05],"3670016":[0.74611160300000001,0.76849370800000005],"6656":[0.0003065220000000001,0.00030790600000000004],"15360":[0.00073225200000000008,0.000772626],"432":[1.730833e-05,1.7691440000000001e-05],"950272":[0.10057978200000001,0.169179103],"655360":[0.064038584000000023,0.0907310385],"69632":[0.0039762189999999996,0.0052263240000000009],"11264":[0.00072715576923076931,0.00072825299999999999],"2752512":[0.68431354999999994,0.69225435300000004],"8126464":[1.9297415790000001,1.998580864],"27648":[0.001338431,0.0013769260000000001],"368":[2.0927979999999999e-05,2.2778000000000001e-05],"65536":[0.0037395270000000003,0.0038430694999999999],"16252928":[4.1262964120000003,4.2407419764999998],"464":[1.9197666666666667e-05,1.9680380000000001e-05],"1015808":[0.13132924700000001,0.17261254100000001],"3072":[0.00023643658536585361,0.00023806133333333334],"110592":[0.0063869680000000015,0.006628681],"237568":[0.015989372000000009,0.017768537000000001],"278528":[0.021821847999999998,0.022381310999999997],"496":[2.1759639999999997e-05,2.1997050000000003e-05],"13107200":[2.9237971389999999,3.2310126800000001],"9961472":[2.7559602834999999,2.7599347184999998],"5888":[0.000369883,0.00038648900000000001],"11010048":[3.268575083,3.4171899235000001],"1920":[8.8632676767676758e-05,8.9914239999999997e-05],"2490368":[0.48736908599999995,0.55104038],"19456":[0.001156168,0.0011775209999999999],"57344":[0.0030576733333333335,0.0037920710000000002],"1179648":[0.17028290400000001,0.24097004300000002],"4718592":[1.1243720669999999,1.1800930380000001],"360448":[0.035831990000000001,0.036768315000000003],"1572864":[0.37169239399999998,0.42072172899999999],"53248":[0.0025965899999999997,0.0027837896666666659],"3456":[0.000152015,0.00018211599999999999],"40960":[0.002467318,0.0025530730000000003],"4608":[0.00023631000000000005,0.00024749499999999992],"13824":[0.0006382540000000001,0.00068147078571428584],"819200":[0.089876040500000004,0.126349986],"983040":[0.126647695,0.16288351400000001],"8704":[0.00045777900000000001,0.00045789600000000001],"120":[4.7459300000000001e-06,4.9068799999999999e-06],"1024":[4.3400769230769229e-05,5.1699000000000001e-05],"49152":[0.0037406940000000006,0.0040861970000000006],"524288":[0.044633218000000002,0.067228991500000015],"45056":[0.0030062400000000007,0.003070559],"229376":[0.015110709,0.017596006000000004],"2688":[0.00015391999999999999,0.00016676900000000002],"152":[6.4840600000000001e-06,7.2730000000000005e-06],"5120":[0.00028186033333333336,0.00028398900000000001],"1507328":[0.30932940799999997,0.40031724299999999],"1216":[6.0311550000000004e-05,6.4197049999999999e-05],"1966080":[0.31635765599999999,0.31972714099999999],"1900544":[0.31347657200000001,0.32504658199999997],"184":[9.4708700000000007e-06,1.0143475e-05],"7936":[0.000400543,0.00040719618181818174],"3801088":[0.75207717600000001,0.77985680950000003],"6815744":[1.5000883604999999,1.7822565260000001],"124":[5.0759199999999997e-06,5.2506700000000008e-06],"102400":[0.005671022999999999,0.0059611940000000013],"311296":[0.026312177499999999,0.0265220075],"1408":[8.2416000000000005e-05,8.5552999999999999e-05],"393216":[0.045045846,0.046452584000000012],"4352":[0.000227514,0.0002347811463414634],"6553600":[1.4143433970000001,1.480916643],"20480":[0.0012541710000000001,0.001289171],"608":[3.0362439999999999e-05,3.163735e-05],"2228224":[0.43443702000000001,0.44626398049999999],"36864":[0.0020154159999999999,0.0021458560000000002],"704":[3.8143630000000001e-05,4.1538709999999997e-05],"720896":[0.080759422999999997,0.11211584450000001],"800":[3.2334920000000002e-05,3.3313623529411762e-05],"2621440":[0.54262018899999998,0.58467736349999999],"425984":[0.032279950000000002,0.034215447999999996],"32768":[0.0017414387999999995,0.0018064929999999997],"12058624":[4.3050310510000003,4.3155710100000002],"128":[5.1432599999999993e-06,5.7697291666666667e-06],"180224":[0.015544056000000001,0.017173908000000005],"224":[9.0138300000000004e-06,1.027417e-05],"736":[4.1612000000000001e-05,4.3318074074074078e-05],"320":[1.4636639999999999e-05,1.5475749999999998e-05],"557056":[0.045647519000000011,0.056486833],"832":[3.2857000000000001e-05,3.4083149999999996e-05],"9437184":[2.447817895,2.5274465230000001],"3584":[0.00016638550000000002,0.00017467194642857144],"6291456":[2.2983603009999998,2.3815417490000002],"256":[1.0646379999999999e-05,1.0827e-05],"15204352":[3.8049789070000002,4.0408013934999998],"28672":[0.001397499,0.0014544039999999999],"768":[5.1595870000000003e-05,5.2567e-05],"212992":[0.013980256,0.0144976705],"864":[3.5279720000000002e-05,4.0055000000000002e-05],"352":[1.9156780000000001e-05,1.9786379999999999e-05],"253952":[0.018158054999999999,0.019643471500000002],"960":[4.4411820000000002e-05,4.4942857142857143e-05],"24576":[0.0018658610000000003,0.00189337975],"7680":[0.00037881999999999998,0.00039201399999999999],"294912":[0.023152532,0.023778489],"1048576":[0.13961892000000001,0.180444666],"10485760":[2.8695964869999999,3.024789417],"344064":[0.031374409999999998,0.032639755999999999],"288":[1.2011000000000001e-05,1.4308159999999999e-05],"1152":[5.6342397260273976e-05,5.7099603174603177e-05],"384":[2.2397760000000002e-05,2.347595e-05],"2304":[0.00012836876811594204,0.00013124592105263157],"896":[3.5003999999999999e-05,4.0428179999999999e-05],"480":[2.0211045977011495e-05,2.0370999999999999e-05],"1441792":[0.25474504899999995,0.35652214700000001],"992":[4.3912999999999998e-05,4.4073000000000003e-05],"3968":[0.00018763499999999999,0.00020489131249999999],"6400":[0.00029229800000000013,0.00030573299999999998],"1344":[7.6098517241379314e-05,7.613916129032258e-05],"126976":[0.0080880439999999991,0.0082244240000000027],"2883584":[0.68610505700000002,0.77952831200000006],"753664":[0.095317475999999984,0.13232973299999995],"16384":[0.00087344218181818203,0.00090753829999999994],"131072":[0.0083192759999999987,0.008443318],"458752":[0.032864162000000002,0.0580563755],"172032":[0.014295122,0.014541980500000001],"12288":[0.00092097399999999997,0.00096457000000000021],"14680064":[3.6288386500000001,4.630705625],"1536":[0.00010533533333333335,0.000120826],"25600":[0.0012226477142857144,0.0012407881428571428],"1835008":[0.28350442599999998,0.32089908099999997],"10752":[0.00062880199999999981,0.00064603300000000007],"21504":[0.0013554777142857142,0.0014101852857142856],"7602176":[1.7989859575,1.8009882415],"5632":[0.000369343,0.00037211699999999993],"10":[3.5571999999999996e-07,3.6974000000000003e-07],"3145728":[0.97166100399999999,0.97936320349999995],"245760":[0.017097609999999999,0.018684752499999999],"1728":[7.7251110000000004e-05,7.8083384615384616e-05],"11":[3.8142999999999999e-07,4.0384e-07],"1114112":[0.15221948099999999,0.23436096499999998],"12":[3.9731000000000006e-07,4.1711000000000001e-07],"7340032":[1.614203091,1.80020015],"7168":[0.00034558000000000012,0.00037202176000000016],"13":[4.5680000000000001e-07,4.7469999999999998e-07],"6029312":[1.9110585149999999,1.964185582],"14":[4.7549999999999999e-07,4.9904000000000005e-07],"3200":[0.00014520076190476183,0.000154241625],"20":[6.3968999999999993e-07,7.2973999999999992e-07],"204800":[0.013400683,0.013606943999999999],"15":[5.3389000000000002e-07,5.7120999999999999e-07],"13312":[0.00062677800000000004,0.00067684600000000015],"4980736":[1.174629089,1.3120237050000001],"118784":[0.0074009919999999995,0.0075137590000000001],"51200":[0.0025417410000000001,0.0026037463333333328],"16":[5.3323000000000002e-07,5.7103999999999996e-07],"21":[6.8058000000000008e-07,6.9533999999999998e-07],"917504":[0.107925062,0.13810420849999999],"22":[7.7454999999999996e-07,8.5488000000000004e-07],"4864":[0.00027160999999999998,0.00028361125],"17":[5.7040000000000008e-07,6.2969000000000002e-07],"14848":[0.00069167000000000002,0.00076734308333333348],"23":[7.6293999999999997e-07,1.20275e-06],"786432":[0.11271914149999999,0.13740883700000001],"18":[5.8556999999999997e-07,6.2791000000000002e-07],"1638400":[0.264947351,0.32083632350000002],"7864320":[1.810500727,1.8471082830000001],"24":[8.527800000000001e-07,8.9901000000000005e-07],"14155776":[3.3674263130000002,3.6408007489999998],"19":[5.7865000000000006e-07,6.8558000000000003e-07],"30":[8.3967e-07,8.5498000000000005e-07],"25":[7.0078000000000001e-07,7.3129999999999999e-07],"31":[1.4136699999999999e-06,1.4202900000000001e-06],"1280":[6.9986000000000004e-05,7.2373969999999993e-05],"26":[7.6351000000000004e-07,7.7102061855670113e-07],"3932160":[0.81810825099999995,0.83607908100000006],"2432":[0.00013244099999999999,0.00014665475384615387],"32":[1.42666e-06,1.4446300000000001e-06],"27":[7.512999999999999e-07,7.5709000000000006e-07],"409600":[0.03105258,0.034736426000000001]}},{"title":"OrderedSet intersection with Array (75% overlap)","results":{"28":[1.53531e-06,1.6002900000000001e-06],"34":[1.7798600000000001e-06,1.8597700000000002e-06],"29":[1.5761799999999999e-06,1.77056e-06],"40":[2.1166799999999999e-06,2.4321500000000001e-06],"17408":[0.0010543863333333334,0.0010812040000000001],"1472":[0.00010175269791666668,0.000105964],"112":[5.3852100000000004e-06,5.8270000000000003e-06],"1376256":[0.27529595400000001,0.37815376550000002],"5242880":[1.5048541179999999,1.539955384],"36":[1.8435799999999999e-06,2.0505499999999998e-06],"42":[2.4461499999999999e-06,2.6716100000000002e-06],"11534336":[3.8662240450000001,4.1973645624999998],"114688":[0.0084028740000000011,0.008681032],"144":[6.9788300000000004e-06,7.8035200000000005e-06],"38":[1.9597399999999999e-06,2.1720499999999998e-06],"240":[1.276974e-05,1.319721e-05],"9216":[0.00057203541176470603,0.00060130006666666669],"44":[2.3248000000000002e-06,2.5708200000000001e-06],"1664":[9.0505305263157893e-05,9.3800000000000003e-05],"196608":[0.0200356745,0.022160257999999995],"155648":[0.0127383935,0.013522726000000002],"2816":[0.00017613499999999995,0.00019092713725490189],"50":[2.4748311688311689e-06,2.5934e-06],"2359296":[0.49145009499999998,0.53357310300000005],"46":[2.5485100000000001e-06,2.6467100000000003e-06],"176":[9.8163999999999997e-06,1.1554280000000001e-05],"52":[2.6518899999999997e-06,3.2017500000000003e-06],"272":[1.3621390000000001e-05,1.457374e-05],"116":[5.6636600000000003e-06,6.112847826086957e-06],"47104":[0.0034170699999999999,0.0035573715000000007],"6912":[0.00039314199999999997,0.00042123400000000004],"1856":[0.000102192,0.00010529916666666668],"48":[2.62502e-06,3.22156e-06],"2097152":[0.434544404,0.49092706699999999],"54":[2.8789300000000001e-06,2.9723599999999999e-06],"2031616":[0.34947736699999998,0.41682604700000003],"43008":[0.0028540190000000002,0.0030378800000000006],"60":[3.1616800000000004e-06,3.1754000000000001e-06],"30720":[0.001986271,0.0019890127500000001],"56":[2.9702400000000002e-06,3.1532799999999998e-06],"62":[3.5735900000000001e-06,3.6409799999999998e-06],"58":[3.0272800000000001e-06,3.12659e-06],"3014656":[0.85107610649999998,0.92707870699999995],"64":[3.4632666666666665e-06,3.4863199999999997e-06],"8388608":[2.2979861870000002,2.311904798],"29696":[0.0018443090000000001,0.0018649039999999999],"216":[1.1055e-05,1.1753750000000001e-05],"106496":[0.007638751,0.0082504980000000019],"72":[3.6565700000000003e-06,3.9935900000000003e-06],"442368":[0.041852360999999998,0.042079834999999996],"147456":[0.01168571,0.011742608],"4456448":[1.0791303940000001,1.1231409050000001],"63488":[0.0043579859999999995,0.0045984584999999994],"38912":[0.0024990920000000001,0.002631679],"68":[3.3242200000000004e-06,3.63e-06],"188416":[0.018460549,0.018507414],"248":[1.2819999999999999e-05,1.3716098765432099e-05],"80":[4.2599700000000003e-06,4.3430099999999996e-06],"2560":[0.00015765899999999999,0.00016552],"34816":[0.00211746125,0.0022241814999999993],"3712":[0.00021754700000000001,0.00023721248780487792],"3538944":[0.76251183150000001,0.88356554050000002],"76":[3.8606400000000002e-06,4.0117199999999998e-06],"4194304":[0.99680896200000002,1.057427323],"851968":[0.097997555,0.16197350599999999],"4096":[0.00026159799999999998,0.00027320299999999997],"59392":[0.0039809944999999996,0.004293364],"84":[4.4492000000000005e-06,5.2860400000000001e-06],"3276800":[0.66696344400000007,0.81241373049999999],"55296":[0.0035046580000000008,0.003647155],"688128":[0.075875698999999991,0.117813904],"8192":[0.00055043099999999988,0.00059172026666666673],"10240":[0.00063941600000000007,0.00068341000000000007],"15872":[0.0010541042222222225,0.001085302],"92":[5.2035600000000002e-06,7.38141e-06],"26624":[0.001552007,0.0016607046],"1792":[9.8893000000000003e-05,0.00010823650000000001],"11776":[0.00086660519999999985,0.00088248244444444454],"2944":[0.00019143400000000004,0.00020739399999999999],"88":[4.9550699999999998e-06,5.4628800000000001e-06],"22528":[0.0015969746000000003,0.001650182],"1245184":[0.18981355799999999,0.24701385100000001],"15728640":[4.5337237469999998,4.5653367810000001],"96":[5.5536666666666665e-06,7.0742600000000008e-06],"1984":[0.00011815875,0.00012268120987654323],"139264":[0.010635996999999999,0.011798262],"475136":[0.046021854000000008,0.054216458000000002],"13631488":[3.7431805000000002,4.0186690115000001],"416":[2.0310999999999999e-05,2.1878617647058823e-05],"928":[5.4547279999999997e-05,5.5408565789473692e-05],"512":[3.0698190000000003e-05,3.1404923076923078e-05],"18432":[0.0011578340000000002,0.001201185],"16777216":[5.1456612939999999],"9728":[0.00061813173333333325,0.00064536599999999987],"1769472":[0.29927523099999997,0.32587020500000002],"1703936":[0.29414542099999996,0.34995473199999999],"2048":[0.00012875164864864866,0.00012966],"14336":[0.00082676499999999992,0.00086998300000000006],"448":[2.3315850000000001e-05,2.3653666666666667e-05],"5505024":[1.651714626,1.6678627214999999],"544":[2.9196309999999998e-05,2.9578433333333335e-05],"221184":[0.017671441999999999,0.019847496999999999],"90112":[0.007000086,0.007615012],"640":[3.6195980000000002e-05,3.7432360000000002e-05],"12800":[0.00072325000000000004,0.00081187100000000025],"262144":[0.022554999999999999,0.023997492999999998],"589824":[0.062813794000000006,0.090046066999999994],"884736":[0.119878416,0.159018352],"6144":[0.00047396599999999998,0.00047500799999999996],"1088":[5.8335000000000003e-05,6.0195789999999996e-05],"576":[3.041584e-05,3.1433999999999998e-05],"160":[8.3734199999999999e-06,9.8104899999999996e-06],"672":[3.9008000000000003e-05,4.0657349999999998e-05],"8912896":[2.4759175500000001,2.606277618],"100":[4.7370300000000001e-06,5.0270899999999998e-06],"507904":[0.04831519699999999,0.072129362999999974],"3840":[0.00023217150000000002,0.00024760399999999996],"192":[1.2443232142857144e-05,1.2705769999999999e-05],"376832":[0.040074555999999997,0.040909976000000001],"98304":[0.0088598909999999566,0.0089359809999999991],"5376":[0.000339289,0.00036144816000000001],"94208":[0.0077145730000000006,0.0080184080000000012],"81920":[0.0059693190000000007,0.0060763759999999988],"3407872":[0.72142053800000006,0.76777082749999992],"104":[4.9234199999999999e-06,5.1945300000000004e-06],"122880":[0.0097628889999999986,0.011763589499999998],"200":[9.8749999999999995e-06,1.0520140000000001e-05],"163840":[0.013886825,0.014780072999999999],"4063232":[0.91379987399999996,0.95380258600000001],"5767168":[1.8029433479999999,1.818813282],"12582912":[4.8919556899999996,9.8893183585000006],"1600":[8.632987e-05,8.7151999999999995e-05],"136":[6.4680499999999998e-06,7.3735100000000005e-06],"232":[1.1695119999999999e-05,1.278632e-05],"7077888":[1.7402358179999999,2.1000796589999999],"86016":[0.006434375,0.006793477],"31744":[0.0021212570000000001,0.0021986607499999999],"168":[8.7247400000000008e-06,9.5983999999999994e-06],"622592":[0.068302863000000019,0.079471227999999991],"108":[5.2131699999999999e-06,5.3551200000000003e-06],"327680":[0.030699227999999995,0.031081472000000006],"2176":[0.000117277,0.000126647],"3328":[0.000188815,0.00019766299999999997],"1":[1.1771e-07,1.2328e-07],"2":[1.3502e-07,1.3540000000000001e-07],"3":[1.5259000000000002e-07,1.5776e-07],"4":[2.4513000000000003e-07,2.5474999999999997e-07],"7424":[0.00045403500000000004,0.00048572050000000009],"5":[2.6962e-07,2.8521e-07],"23552":[0.0017135953999999991,0.001761763],"6":[2.9206000000000004e-07,2.9344000000000001e-07],"61440":[0.004039099,0.004421332],"491520":[0.045984461999999997,0.063369368999999967],"77824":[0.0053863369999999989,0.0055951360000000006],"7":[3.2296999999999999e-07,3.3522000000000001e-07],"8":[3.3809000000000003e-07,3.5518000000000003e-07],"208":[1.0275760000000001e-05,1.059082e-05],"9":[3.5998000000000002e-07,3.6874000000000001e-07],"73728":[0.0049963029999999988,0.0053247960000000006],"304":[1.6011999999999998e-05,1.60235e-05],"400":[2.0473333333333336e-05,2.1613959999999997e-05],"1310720":[0.21292543899999999,0.28956766900000003],"336":[1.8617639999999999e-05,1.9793499999999999e-05],"3670016":[0.83970172399999998,0.89132683800000001],"6656":[0.00038089999999999999,0.00039775632],"15360":[0.00095307999999999992,0.0010316519999999999],"432":[2.3012869999999999e-05,2.4347969999999999e-05],"950272":[0.12138409299999997,0.18220457400000001],"655360":[0.074472707000000013,0.099761158499999988],"69632":[0.0046923389999999994,0.005026394],"11264":[0.00077491933333333326,0.00077621000000000005],"2752512":[0.68725038399999994,0.80187222199999997],"8126464":[2.16755773,2.2833318180000002],"27648":[0.0017347424,0.0018406239999999997],"368":[2.2672700000000001e-05,2.2839929999999997e-05],"65536":[0.00465782,0.0047379050000000006],"16252928":[4.6831085330000004,4.8680230489999996],"464":[2.5191359999999998e-05,2.6867539999999999e-05],"1015808":[0.150120596,0.17766836599999999],"3072":[0.000226522575,0.0002331],"110592":[0.0079103309999999996,0.0082657259999999975],"237568":[0.019711441499999996,0.021544556499999999],"278528":[0.024899919999999999,0.025265846000000002],"496":[2.7230510000000004e-05,3.0579900000000002e-05],"13107200":[3.3814466835000001,3.8476366909999999],"9961472":[2.9216043384999999,3.1357645655000002],"5888":[0.00040931599999999996,0.00041142300000000006],"11010048":[3.242238623,3.56616424],"1920":[0.000105612,0.000119615],"2490368":[0.53447657900000001,0.587732068],"19456":[0.0012376939999999999,0.001280013285714286],"57344":[0.0036589064999999997,0.0041989199999999992],"1179648":[0.20660490100000001,0.24499289599999996],"4718592":[1.242458611,1.283973977],"360448":[0.038647371000000035,0.040495740000000009],"1572864":[0.35897480250000002,0.376138109],"53248":[0.0032588180000000001,0.0034545720000000004],"3456":[0.000198715,0.000208591],"40960":[0.0027030396666666667,0.0027879650000000008],"4608":[0.00027320349999999987,0.00027798800000000001],"13824":[0.00082697299999999994,0.00085631100000000001],"819200":[0.093555844000000013,0.14592859999999999],"983040":[0.13887728299999999,0.19313878800000001],"8704":[0.00050164999999999997,0.00050698400000000004],"120":[6.2458900000000008e-06,6.4158499999999997e-06],"1024":[6.0534e-05,6.8157000000000005e-05],"49152":[0.0037748104999999997,0.0040075555000000001],"524288":[0.054320513000000001,0.068281601999999997],"45056":[0.0031617350000000002,0.003417677],"229376":[0.018479466,0.021461340000000002],"2688":[0.00016900299999999998,0.00018377699999999996],"152":[7.4495100000000003e-06,8.0151099999999996e-06],"5120":[0.00031532050000000002,0.00032685133333333339],"1507328":[0.30335539350000001,0.44614736500000002],"1216":[7.068941463414634e-05,7.1074089999999997e-05],"1966080":[0.34711624299999999,0.38174632399999997],"1900544":[0.36141838900000001,0.39039871799999998],"184":[1.041019e-05,1.1159239999999999e-05],"7936":[0.000495255,0.00050612815789473679],"3801088":[0.81246793900000003,0.91387218800000003],"6815744":[1.7423485765,1.9737188889999999],"124":[6.6689699999999996e-06,7.0512999999999997e-06],"102400":[0.0071483740000000016,0.0077314670000000005],"311296":[0.028659332000000003,0.029661127999999998],"1408":[8.8138000000000002e-05,8.9598222222222223e-05],"393216":[0.044159148499999988,0.045217195000000002],"4352":[0.00023995700000000001,0.00026537516666666667],"6553600":[1.7175102715000001,1.776203067],"20480":[0.0013864119999999998,0.0014234611666666666],"608":[3.1386333333333335e-05,3.3983000000000003e-05],"2228224":[0.48552659199999998,0.51021062949999996],"36864":[0.0022650165000000005,0.002377667],"704":[4.0971560000000003e-05,4.1625589999999996e-05],"720896":[0.092694734000000015,0.123804833],"800":[4.1584980000000001e-05,4.4629363636363638e-05],"2621440":[0.58038150499999996,0.64082541999999998],"425984":[0.039454080000000002,0.042938270000000001],"32768":[0.0022707492499999997,0.002311507],"12058624":[4.1814612379999998,4.3626196440000005],"128":[6.5730499999999997e-06,6.7751400000000008e-06],"180224":[0.0164515865,0.017131602500000002],"224":[1.1430629999999999e-05,1.2163530000000002e-05],"736":[4.5628650000000002e-05,4.6551200000000002e-05],"320":[1.814094e-05,1.8209770000000001e-05],"557056":[0.052396591000000006,0.065378255999999996],"832":[4.2432800000000005e-05,4.3482000000000001e-05],"9437184":[2.5641379954999999,2.948425801],"3584":[0.00021021899999999999,0.00022772575609756102],"6291456":[2.2984375419999998,2.346773808],"256":[1.3077900000000001e-05,1.4782650000000002e-05],"15204352":[4.4633355950000002,4.5677089305000003],"28672":[0.0017979270000000002,0.001864402],"768":[4.7135000000000002e-05,5.2207549999999994e-05],"212992":[0.016690400000000001,0.017681560999999995],"864":[4.5497000000000002e-05,5.2238199999999997e-05],"352":[2.0965250000000001e-05,2.1069499999999999e-05],"253952":[0.021797393999999998,0.022552717],"960":[5.2478000000000001e-05,6.0647469999999996e-05],"24576":[0.0018852680000000001,0.0019118920000000005],"7680":[0.00045364400000000012,0.00047661099999999994],"294912":[0.025983007499999995,0.027847797000000007],"1048576":[0.15597187899999998,0.20159277900000006],"10485760":[3.273967699,3.3341192954999999],"344064":[0.037480270499999996,0.038257563999999994],"288":[1.5092250000000001e-05,1.6285830000000001e-05],"1152":[6.218676785714285e-05,6.4706e-05],"384":[2.2685359999999999e-05,2.3337545454545453e-05],"2304":[0.00013329799999999998,0.0001410302142857143],"896":[4.6668000000000001e-05,5.1155790697674416e-05],"480":[2.643088e-05,2.74238e-05],"1441792":[0.270072217,0.399976251],"992":[5.7522000000000003e-05,5.9020829999999998e-05],"3968":[0.000247586,0.00025789999999999998],"6400":[0.00036261599999999996,0.00037995299999999999],"1344":[8.1045238095238099e-05,8.1489799999999994e-05],"126976":[0.010059865999999999,0.010259504000000001],"2883584":[0.77120651100000004,0.80524240300000005],"753664":[0.097421416000000011,0.143748814],"16384":[0.0010924330000000001,0.0011433773750000001],"131072":[0.0105268785,0.011593959000000001],"458752":[0.041277398999999999,0.052010569500000006],"172032":[0.015418165000000001,0.0155321555],"12288":[0.00089131099999999988,0.0010026072222222172],"14680064":[3.9699716309999999,5.0159637774999997],"1536":[0.0001078466896551724,0.000116748],"25600":[0.0015146665,0.0015800975000000001],"1835008":[0.30902586500000001,0.31894206550000004],"10752":[0.00071460099999999993,0.00071995076923076938],"21504":[0.0014647423333333332,0.0015240869999999999],"7602176":[1.938029344,1.9634260750000001],"5632":[0.00038667143999999997,0.00039983800000000002],"10":[3.9517000000000001e-07,3.9591e-07],"3145728":[0.95410873200000001,0.96227255749999996],"245760":[0.021749898,0.022648591000000003],"1728":[9.2900999999999997e-05,0.00010101400000000001],"11":[4.1339999999999998e-07,4.2406e-07],"1114112":[0.17820670199999999,0.27729188599999999],"12":[4.2888000000000001e-07,4.5110000000000001e-07],"7340032":[1.882169145,1.9810219069999999],"7168":[0.000433213,0.000471936],"13":[4.7481999999999996e-07,4.8398000000000002e-07],"6029312":[1.9724664359999999,1.9905272875],"14":[5.1513999999999999e-07,5.4317000000000007e-07],"3200":[0.00018200986000000002,0.00018524900000000004],"20":[6.3361000000000002e-07,7.3189999999999993e-07],"204800":[0.016322702000000001,0.016453156],"15":[5.5899999999999996e-07,5.9516999999999995e-07],"13312":[0.00079230300000000006,0.00084539990909090893],"4980736":[1.30495253,1.357299123],"118784":[0.0092234240000000009,0.0094542849999999998],"51200":[0.003138437,0.0032667780000000001],"16":[5.3820999999999995e-07,5.6718999999999999e-07],"21":[1.3166400000000001e-06,1.3745299999999999e-06],"917504":[0.12057000900000001,0.160336601],"22":[1.4263399999999998e-06,1.5123699999999999e-06],"4864":[0.00030140800000000008,0.00031850651724137926],"17":[5.6064000000000002e-07,5.9897999999999998e-07],"14848":[0.00093598499999999996,0.00093943200000000014],"23":[1.43922e-06,1.8406499999999999e-06],"786432":[0.104130823,0.13352491899999999],"18":[6.1530000000000006e-07,6.2895000000000003e-07],"1638400":[0.26673372049999999,0.34540566699999997],"7864320":[1.9951027480000001,2.2005768310000002],"24":[1.44851e-06,1.5476699999999998e-06],"14155776":[4.1728059819999999,4.3067275499999997],"19":[6.0342000000000004e-07,7.0178000000000008e-07],"30":[1.64573e-06,1.7630700000000001e-06],"25":[1.37876e-06,1.40192e-06],"31":[1.7489999999999999e-06,1.7763499999999999e-06],"1280":[7.5397999999999999e-05,7.6372000000000007e-05],"26":[1.50678e-06,1.61537e-06],"3932160":[0.92234337399999999,0.97339264449999996],"2432":[0.00014553142647058865,0.00016370862068965509],"32":[1.7185400000000002e-06,1.7565100000000001e-06],"27":[1.5191e-06,1.52401e-06],"409600":[0.035123343999999994,0.037429096000000002]}},{"title":"OrderedSet intersection with Array (100% overlap)","results":{"28":[6.6391999999999993e-07,6.7553999999999997e-07],"34":[7.4972000000000002e-07,7.7542857142857147e-07],"29":[6.6706999999999995e-07,6.8909000000000004e-07],"40":[9.281899999999999e-07,1.0148100000000001e-06],"17408":[0.000482437,0.0005247880000000001],"1472":[4.3643000000000002e-05,4.8465499999999999e-05],"112":[2.33357e-06,2.3480899999999997e-06],"1376256":[0.16149234100000001,0.27200759899999999],"5242880":[1.04787597,1.0698776935000001],"36":[7.9571000000000002e-07,8.4941000000000003e-07],"42":[9.7011999999999995e-07,1.04922e-06],"11534336":[2.5553537369999999,2.6721979560000002],"114688":[0.0042999580000000004,0.0045112405000000012],"144":[3.1544299999999998e-06,3.4131599999999999e-06],"38":[8.5636000000000003e-07,9.0811e-07],"240":[4.9894999999999994e-06,5.34871e-06],"9216":[0.00027415285714285718,0.00028357499999999999],"44":[1.0075600000000001e-06,1.12434e-06],"1664":[3.7225799999999999e-05,3.9673319999999993e-05],"196608":[0.011348281999999998,0.011422740000000001],"155648":[0.0073024469999999984,0.0079387039999999996],"2816":[8.4020929999999996e-05,8.8886000000000002e-05],"50":[1.0392999999999999e-06,1.0560600000000001e-06],"2359296":[0.38567234950000001,0.44228306399999995],"46":[1.0786299999999999e-06,1.1040900000000001e-06],"176":[4.2983700000000007e-06,5.5399000000000001e-06],"52":[1.1241899999999999e-06,1.1381599999999999e-06],"272":[5.8114600000000008e-06,6.1977600000000008e-06],"116":[2.3903900000000002e-06,2.5591799999999999e-06],"47104":[0.0016832379999999997,0.0018613772000000001],"6912":[0.000176625,0.00018429900000000005],"1856":[4.2865129999999999e-05,4.4290666666666666e-05],"48":[1.1241899999999999e-06,1.2155000000000001e-06],"2097152":[0.34702083350000001,0.36916037300000004],"54":[1.1273800000000001e-06,1.1588400000000001e-06],"2031616":[0.32617105800000001,0.33181287399999998],"43008":[0.0014399511666666664,0.001479342],"60":[1.3002099999999999e-06,1.31271e-06],"30720":[0.00085062345454545423,0.00086537233333333337],"56":[1.2116900000000001e-06,1.2217099999999999e-06],"62":[1.36239e-06,1.4941199999999999e-06],"58":[1.26768e-06,1.2735500000000001e-06],"3014656":[0.62160026299999993,0.66802840750000003],"64":[1.3442599999999999e-06,1.48273e-06],"8388608":[1.4352006495,1.56969925],"29696":[0.00081173199999999991,0.000840824],"216":[4.74732e-06,4.7711299999999995e-06],"106496":[0.0039180975000000003,0.0044364210000000003],"72":[1.5680699999999999e-06,1.58367e-06],"442368":[0.028156375000000018,0.036559697000000002],"147456":[0.0065124299999999996,0.006533976999999999],"4456448":[0.79285632100000003,0.82522600149999992],"63488":[0.0019996512500000002,0.00205195875],"38912":[0.0012356229999999999,0.0012821040000000001],"68":[1.4856499999999999e-06,1.55699e-06],"188416":[0.010775429,0.0113183485],"248":[5.2094499999999997e-06,5.3952000000000005e-06],"80":[1.81547e-06,1.8654599999999999e-06],"2560":[7.222644e-05,7.7255000000000005e-05],"34816":[0.0010219247777777777,0.0010740560000000001],"3712":[9.1379399999999995e-05,9.4620602150537642e-05],"3538944":[0.5119836525,0.69009854999999998],"76":[1.72e-06,1.75656e-06],"4194304":[0.63661496750000002,0.71199724149999999],"851968":[0.061278493499999989,0.11844521],"4096":[0.00010591600000000002,0.000112716],"59392":[0.0017833219999999999,0.0019032897999999999],"84":[1.9244199999999999e-06,2.0099099999999999e-06],"3276800":[0.59942571999999994,0.63724109900000003],"55296":[0.0015994691666666664,0.0017387209999999999],"688128":[0.051340879000000006,0.070220148999999996],"8192":[0.00021512199999999996,0.00023597200000000001],"10240":[0.00032530803448275862,0.0003422535714285715],"15872":[0.00041557200000000001,0.0006040186666666686],"92":[2.3189700000000002e-06,3.0030999999999997e-06],"26624":[0.00071995399999999986,0.000727234],"1792":[4.1959000000000003e-05,4.2526289999999999e-05],"11776":[0.00040808000000000006,0.00043199999999999998],"2944":[9.42405e-05,9.5931159574468087e-05],"88":[2.1376399999999999e-06,2.1838600000000001e-06],"22528":[0.00074351499999999993,0.00080215700000000007],"1245184":[0.1365883755,0.183623592],"15728640":[2.810586502,3.298265523],"96":[2.49568e-06,3.2688299999999999e-06],"1984":[4.5293000000000002e-05,4.6459285714285717e-05],"139264":[0.0059707190000000011,0.0065723480000000013],"475136":[0.0274450145,0.032029781],"13631488":[2.5594169,2.7779076730000001],"416":[8.5750899999999996e-06,8.7602400000000007e-06],"928":[2.171484e-05,2.212986e-05],"512":[1.1830385714285715e-05,1.2172109999999999e-05],"18432":[0.00055167699999999998,0.00057766899999999973],"16777216":[3.5916827434999998],"9728":[0.00029154300000000001,0.00030943999999999996],"1769472":[0.24794660099999999,0.27590907749999999],"1703936":[0.20605534700000006,0.28886404799999998],"2048":[5.0326785714285713e-05,5.147775e-05],"14336":[0.00036383200000000002,0.00038645627999999999],"448":[9.7908200000000009e-06,9.8407599999999996e-06],"5505024":[1.1299849829999999,1.1513611715000001],"544":[1.325602e-05,1.3372e-05],"221184":[0.0096466910000000006,0.011320491],"90112":[0.0035846809999999993,0.0040552854999999994],"640":[1.5779460000000001e-05,1.7201989999999998e-05],"12800":[0.00030902399999999987,0.00034948999999999994],"262144":[0.012380381000000003,0.014379412999999999],"589824":[0.033402053000000001,0.044189252999999998],"884736":[0.066502258499999967,0.12854293450000001],"6144":[0.000214494,0.00022323200000000002],"1088":[2.6546500000000001e-05,2.6744149999999997e-05],"576":[1.3406830000000001e-05,1.4524242857142857e-05],"160":[3.5935899999999999e-06,4.0559800000000001e-06],"672":[1.7306900000000002e-05,1.7601859999999999e-05],"8912896":[1.6709319395,1.7661039199999999],"100":[2.0085599999999999e-06,2.0613099999999999e-06],"507904":[0.026643594999999999,0.0613344215],"3840":[9.7038428571428578e-05,0.00010650078494623656],"192":[4.9329400000000001e-06,5.5417599999999998e-06],"376832":[0.023458337999999995,0.023581162499999996],"98304":[0.0045162899999999992,0.0046645100000000002],"5376":[0.000172669,0.00017606192857142858],"94208":[0.0040708330000000003,0.004278685],"81920":[0.0030314929999999997,0.0036059159999999994],"3407872":[0.53653633599999995,0.62090650449999996],"104":[2.1524200000000001e-06,2.1646800000000001e-06],"122880":[0.0051674960000000006,0.0053137950000000014],"200":[4.0674299999999998e-06,4.2412199999999999e-06],"163840":[0.0079560450000000001,0.0083354620000000001],"4063232":[0.63495619000000003,0.74886733650000004],"5767168":[1.238491002,1.256250842],"12582912":[3.0164894974999998,6.5693347444999999],"1600":[3.5978e-05,3.7094770000000001e-05],"136":[2.9858100000000001e-06,3.1309899999999999e-06],"232":[4.8608499999999994e-06,5.2748200000000004e-06],"7077888":[1.2606084209999999,1.360186237],"86016":[0.0032413125000000003,0.0034903820000000002],"31744":[0.000894851,0.00096895399999999995],"168":[3.8028900000000002e-06,4.1392399999999995e-06],"622592":[0.043140209999999998,0.053755857500000004],"108":[2.2027999999999999e-06,2.2448600000000001e-06],"327680":[0.017863799499999999,0.018141442000000001],"2176":[5.2594666666666666e-05,5.707735135135135e-05],"3328":[7.9148520000000004e-05,8.3459000000000002e-05],"1":[1.1767999999999999e-07,1.2337999999999998e-07],"2":[1.3519999999999999e-07,1.3543000000000002e-07],"3":[1.5383000000000002e-07,1.5786000000000001e-07],"4":[1.6973000000000002e-07,1.7125999999999999e-07],"7424":[0.00019823399999999999,0.00020675500000000004],"5":[1.8825999999999999e-07,1.8902999999999999e-07],"23552":[0.00082538899999999983,0.0008756730000000001],"6":[2.0633999999999998e-07,2.0979999999999999e-07],"61440":[0.0018685402,0.0019388420000000003],"491520":[0.027397549,0.041670614000000009],"77824":[0.0027199363333333336,0.0028135429999999999],"7":[2.3368000000000001e-07,2.4680999999999997e-07],"8":[2.3977000000000004e-07,2.5880999999999997e-07],"208":[4.2933300000000004e-06,4.4900000000000002e-06],"9":[2.5885000000000002e-07,2.9115000000000001e-07],"73728":[0.0025168293333333335,0.0026011706666666662],"304":[6.7805999999999999e-06,7.0675384615384616e-06],"400":[8.5210000000000002e-06,9.0666599999999997e-06],"1310720":[0.14390507599999999,0.21878825900000001],"336":[8.2926200000000006e-06,9.3193499999999991e-06],"3670016":[0.652407293,0.68282986899999998],"6656":[0.00016725445762711861,0.000174465],"15360":[0.00042889290000000004,0.0004365690476190478],"432":[8.8039799999999994e-06,9.4188200000000001e-06],"950272":[0.078717255,0.15829786200000001],"655360":[0.0492000935,0.053379587999999999],"69632":[0.0022849435,0.0024050486666666671],"11264":[0.00035385199999999988,0.00037961879999999992],"2752512":[0.48652908900000003,0.59182416699999996],"8126464":[1.442158472,1.5553599519999999],"27648":[0.0007167670000000001,0.00072581199999999994],"368":[9.6316600000000002e-06,9.6507599999999997e-06],"65536":[0.0021766282500000006,0.0024328429999999996],"16252928":[3.1040677689999998,3.4776010980000001],"464":[1.0306650000000001e-05,1.102522e-05],"1015808":[0.090588838000000005,0.13461743449999999],"3072":[0.000106489,0.00010793839560439559],"110592":[0.0041431910000000001,0.0043061649999999998],"237568":[0.0108052635,0.010941823],"278528":[0.01548979,0.0169294405],"496":[1.1115159999999999e-05,1.193742e-05],"13107200":[2.2966856500000001,2.6038460794999998],"9961472":[1.9758993785000001,2.0617706739999999],"5888":[0.00019816181250000001,0.00019911700000000004],"11010048":[2.3297955460000002,2.3405189220000002],"1920":[4.2493999999999997e-05,5.0893010000000003e-05],"2490368":[0.39481985500000005,0.42901457249999997],"19456":[0.00058833999999999991,0.00062242139999999987],"57344":[0.0016918888,0.0021676740000000005],"1179648":[0.13876636349999999,0.18853251599999998],"4718592":[0.77073483300000001,0.94744548849999999],"360448":[0.023574623499999999,0.023938175499999999],"1572864":[0.24833654449999998,0.25167540350000001],"53248":[0.0014928333333333332,0.0015972460000000001],"3456":[8.4005937500000001e-05,9.5227428571428578e-05],"40960":[0.00132281,0.0015013489999999999],"4608":[0.00013228200000000001,0.00013394900000000001],"13824":[0.000361441,0.00037745999999999993],"819200":[0.059945438000000004,0.1138414775],"983040":[0.082513306499999994,0.14097209799999999],"8704":[0.00024508700000000001,0.0002592966578947368],"120":[2.6134799999999999e-06,2.6221300000000003e-06],"1024":[2.3930800000000001e-05,2.7614e-05],"49152":[0.0018740751999999999,0.0019565349999999997],"524288":[0.034881377499999998,0.047602965000000011],"45056":[0.0015482970000000001,0.0016529159999999997],"229376":[0.010027884000000001,0.010848992],"2688":[7.5729120000000001e-05,8.723846153846155e-05],"152":[3.4110500000000001e-06,3.4162699999999998e-06],"5120":[0.00015413300000000001,0.00015934200000000003],"1507328":[0.231716122,0.307846591],"1216":[3.0707764705882353e-05,3.1295240000000001e-05],"1966080":[0.30274820099999999,0.30860872900000003],"1900544":[0.267980408,0.29620903100000001],"184":[4.5298299999999998e-06,4.7753300000000002e-06],"7936":[0.000206369,0.000213475],"3801088":[0.56280449499999996,0.60797128499999997],"6815744":[1.3002910564999999,1.3273160399999999],"124":[2.68099e-06,2.7163600000000001e-06],"102400":[0.0036243810000000003,0.004030591],"311296":[0.016754579499999995,0.018163798500000002],"1408":[4.0394e-05,4.0577000000000001e-05],"393216":[0.024950948000000001,0.028540067000000002],"4352":[0.000125327,0.00012613677027027026],"6553600":[1.1623591174999999,1.1975547950000001],"20480":[0.00067707999999999983,0.00071053399999999975],"608":[1.5147149999999999e-05,1.5644529999999998e-05],"2228224":[0.32376413999999998,0.39901680399999995],"36864":[0.0011226179999999999,0.001207944625],"704":[1.7418000000000002e-05,1.8445583333333332e-05],"720896":[0.052446078,0.081370193999999993],"800":[1.7171479999999998e-05,1.9095339999999999e-05],"2621440":[0.4308204175,0.46627262800000002],"425984":[0.023768616499999999,0.025312159000000001],"32768":[0.00096921479999999998,0.00097839900000000002],"12058624":[2.795436907,2.8312174964999999],"128":[2.6909699999999997e-06,2.8343200000000002e-06],"180224":[0.0093385740000000023,0.010172886000000001],"224":[4.7242800000000001e-06,5.13477e-06],"736":[1.9395990000000001e-05,2.0482520000000001e-05],"320":[7.5512599999999998e-06,7.7771500000000006e-06],"557056":[0.035602767,0.040393366],"832":[1.701758823529412e-05,1.8257299999999999e-05],"9437184":[1.8865419345000001,1.906213766],"3584":[9.1393199999999998e-05,9.2390000000000001e-05],"6291456":[1.4900439190000001,1.514644283],"256":[5.3300499999999999e-06,5.8285900000000006e-06],"15204352":[2.6598244245,3.185792862],"28672":[0.00079498700000000015,0.00080001783333333331],"768":[2.1953309999999999e-05,2.4344470000000002e-05],"212992":[0.0095395480000000001,0.0104383905],"864":[1.848524e-05,2.136879e-05],"352":[8.9598500000000003e-06,9.3807499999999999e-06],"253952":[0.012132331999999999,0.012542303000000001],"960":[2.2509969999999998e-05,2.3476812499999999e-05],"24576":[0.00093698420000000015,0.00096428050000000004],"7680":[0.000202878,0.00021377841304347835],"294912":[0.015143986,0.015869177000000005],"1048576":[0.11142734899999999,0.14060285449999999],"10485760":[2.0146468980000001,2.3363686069999998],"344064":[0.021644475,0.023340859499999977],"288":[6.6116999999999997e-06,7.2375599999999997e-06],"1152":[2.7856339999999999e-05,2.9841310000000002e-05],"384":[1.0207070000000001e-05,1.0377120000000001e-05],"2304":[6.2897930000000002e-05,6.4911538461538462e-05],"896":[1.9506600000000001e-05,2.1009349999999999e-05],"480":[1.0581989999999999e-05,1.07088e-05],"1441792":[0.1756473365,0.297231368],"992":[2.2007000000000001e-05,2.4006150000000001e-05],"3968":[0.0001017125,0.00010511869230769234],"6400":[0.000152003,0.00016686700000000001],"1344":[3.6729e-05,3.8620279999999999e-05],"126976":[0.00520784,0.0054623889999999998],"2883584":[0.49881456299999999,0.58639666200000007],"753664":[0.060106232500000002,0.087211349000000007],"16384":[0.00046586499999999993,0.00048689699999999986],"131072":[0.0054919169999999998,0.0055436180000000002],"458752":[0.022317816000000001,0.030557372000000006],"172032":[0.0087236009999999992,0.0091675870000000013],"12288":[0.00045582985714285706,0.00047932405000000012],"14680064":[2.4673906560000001,3.749248326],"1536":[4.624672e-05,5.5615999999999997e-05],"25600":[0.00066021600000000004,0.00068587292857142843],"1835008":[0.22617068300000001,0.24922511650000001],"10752":[0.00035057107142857138,0.00036063740740740737],"21504":[0.00069459899999999974,0.00073653100000000001],"7602176":[1.3791086799999999,1.4339882395000001],"5632":[0.00017873800000000004,0.0001929],"10":[2.7740999999999999e-07,2.8682000000000002e-07],"3145728":[0.62578415649999997,0.65279249499999992],"245760":[0.0112838685,0.0128250325],"1728":[3.8998909999999998e-05,4.2295281250000002e-05],"11":[2.9243999999999999e-07,2.9906000000000003e-07],"1114112":[0.12923334749999998,0.16900142000000001],"12":[3.1493999999999999e-07,3.2374000000000001e-07],"7340032":[1.208856275,1.3972515125],"7168":[0.00018509599999999999,0.0002037050681818182],"13":[3.5312999999999999e-07,3.6357999999999998e-07],"6029312":[1.330288285,1.3327643835],"14":[3.5868999999999999e-07,3.5973000000000001e-07],"3200":[7.3790999999999999e-05,7.9392549999999986e-05],"20":[4.6970999999999999e-07,5.2575999999999996e-07],"204800":[0.0089696600000000008,0.0095390539999999999],"15":[3.7493999999999999e-07,4.0973e-07],"13312":[0.00033683000000000004,0.000339816],"4980736":[1.0082101319999999,1.0773273804999999],"118784":[0.0049565809999999998,0.0052182399999999999],"51200":[0.001413318,0.0015281470000000001],"16":[4.1172999999999999e-07,4.2157999999999999e-07],"21":[4.9456000000000006e-07,5.3297000000000004e-07],"917504":[0.085046076999999998,0.11129620950000001],"22":[5.7064999999999999e-07,6.4797999999999996e-07],"4864":[0.000138434,0.00014992799999999999],"17":[4.2535999999999999e-07,4.4916000000000003e-07],"14848":[0.00037906099999999998,0.00041351999999999996],"23":[5.7265000000000004e-07,5.7698999999999998e-07],"786432":[0.061915424000000052,0.092733766999999981],"18":[4.5288999999999997e-07,4.5331999999999999e-07],"1638400":[0.2173708895,0.29726714300000001],"7864320":[1.494349478,1.600852103],"24":[6.4298e-07,6.627299999999999e-07],"14155776":[2.641545818,3.0137963999999999],"19":[4.3887000000000001e-07,4.8683999999999998e-07],"30":[6.8103999999999996e-07,6.9183999999999993e-07],"25":[5.6407812499999998e-07,5.6955999999999997e-07],"31":[6.7324999999999997e-07,6.8323000000000006e-07],"1280":[3.2994666666666664e-05,3.4724420000000004e-05],"26":[5.9710000000000007e-07,6.4369000000000002e-07],"3932160":[0.584236054,0.59555252950000004],"2432":[6.788415217391304e-05,7.4273349999999996e-05],"32":[6.9919999999999991e-07,7.0396999999999997e-07],"27":[6.0668999999999999e-07,6.0742000000000002e-07],"409600":[0.022052872500000004,0.0227940765]}},{"title":"OrderedSet symmetricDifference with Array (0% overlap)","results":{"28":[4.9416909090909091e-06,5.7113200000000004e-06],"34":[6.1732599999999996e-06,6.5490476190476189e-06],"29":[5.2283999999999998e-06,5.3366799999999995e-06],"40":[6.9943000000000001e-06,8.3050579710144915e-06],"17408":[0.0036658659999999994,0.0038617650000000005],"1472":[0.00033133300000000006,0.00034862000000000006],"112":[2.0710329999999999e-05,2.1225630000000001e-05],"1376256":[0.75843040100000003,0.98746972349999995],"5242880":[4.1816434610000002,4.2685520930000003],"36":[6.6525799999999999e-06,7.0989999999999993e-06],"42":[7.3914699999999999e-06,7.9496999999999995e-06],"11534336":[10.742239932,10.947289973],"114688":[0.028011071000000005,0.029991322000000004],"144":[2.6393660000000002e-05,2.6852130000000002e-05],"38":[6.51071e-06,7.3043100000000004e-06],"240":[4.4525640000000002e-05,4.627646e-05],"9216":[0.0019085020000000001,0.0021635420000000005],"44":[8.3533000000000001e-06,9.1281900000000011e-06],"1664":[0.000344908,0.00035181144444444435],"196608":[0.061646813999999994,0.065325039000000001],"155648":[0.041741907499999995,0.04175933200000001],"2816":[0.00062032099999999996,0.00064847373333333318],"50":[9.1834999999999994e-06,9.2735599999999994e-06],"2359296":[1.4767068535000001,1.5077609494999999],"46":[8.4429399999999995e-06,8.9345833333333324e-06],"176":[3.5798849315068495e-05,3.8546619047619047e-05],"52":[9.7812900000000017e-06,9.7965899999999997e-06],"272":[4.8130999999999997e-05,5.4892400000000003e-05],"116":[2.1897510000000002e-05,2.2395770000000001e-05],"47104":[0.011313180500000002,0.0124858035],"6912":[0.0014217861666666668,0.0014871284999999994],"1856":[0.00037715961538461529,0.000392548],"48":[9.1743900000000008e-06,1.0812110000000002e-05],"2097152":[1.2796084845,1.3748758990000001],"54":[9.9835200000000016e-06,1.037559e-05],"2031616":[1.170838233,1.2106376409999999],"43008":[0.0097086080000000022,0.010260413000000001],"60":[1.113828e-05,1.1218840000000001e-05],"30720":[0.0065130230000000015,0.0066104650000000003],"56":[1.0359029999999999e-05,1.0618999999999999e-05],"62":[1.1167009999999999e-05,1.1646280000000001e-05],"58":[1.0515e-05,1.0598240000000001e-05],"3014656":[2.4025575190000001,2.5241744000000002],"64":[1.1072e-05,1.2187e-05],"8388608":[6.7058289450000004,6.8090891769999997],"29696":[0.0063692250000000009,0.0064180250000000008],"216":[4.2228000000000003e-05,4.2666409999999996e-05],"106496":[0.028992339500000002,0.029384728999999998],"72":[1.3178e-05,1.3720927083333332e-05],"442368":[0.14212523399999999,0.22258109100000001],"147456":[0.037997547,0.038010186999999994],"4456448":[3.2119589660000001,3.2788840690000001],"63488":[0.014403118500000001,0.015125626999999999],"38912":[0.0085227169999999991,0.0089861280000000012],"68":[1.2454670000000001e-05,1.3179769999999998e-05],"188416":[0.055951028,0.057492093499999994],"248":[4.5710624999999997e-05,4.8600500000000003e-05],"80":[1.5335889999999999e-05,1.5400760000000001e-05],"2560":[0.00051779400000000002,0.0005792909999999999],"34816":[0.0074665160000000012,0.007624507],"3712":[0.00075140699999999994,0.0007740206666666668],"3538944":[2.4762593565,2.520716229],"76":[1.414005e-05,1.4544509803921568e-05],"4194304":[2.9576693039999999,2.977477962],"851968":[0.363298228,0.46758358899999997],"4096":[0.00085035709090909106,0.00086306872727272732],"59392":[0.013503101,0.014772013000000001],"84":[1.6641089999999998e-05,1.6728509999999998e-05],"3276800":[2.3064443730000002,2.5663372560000002],"55296":[0.012376930999999999,0.013378589499999999],"688128":[0.26395707800000001,0.374026939],"8192":[0.00166231,0.001776342],"10240":[0.0021688979999999998,0.0023002410000000002],"15872":[0.0033122869999999997,0.0037867369999999997],"92":[1.772e-05,2.1506160000000001e-05],"26624":[0.0058568550000000011,0.0061342110000000005],"1792":[0.00036034800000000003,0.000383266],"11776":[0.002780528,0.0029135370000000003],"2944":[0.00068122138461538444,0.000681388],"88":[1.7511269999999997e-05,1.8086282608695651e-05],"22528":[0.005092849,0.0055618590000000006],"1245184":[0.62007636099999996,0.82177278349999994],"15728640":[13.373361885,13.613559227],"96":[2.0558049999999999e-05,2.2902190000000002e-05],"1984":[0.00040132599999999992,0.00040488599999999997],"139264":[0.035302398999999998,0.037818622999999996],"475136":[0.158214573,0.19767813449999999],"13631488":[11.664576938,12.194164661],"416":[8.2044000000000003e-05,8.4605956989247308e-05],"928":[0.00019519133333333334,0.00019650089795918363],"512":[0.00010174328888888886,0.00010197192857142856],"18432":[0.0039515090000000006,0.004183675999999999],"16777216":[14.509221827999999],"9728":[0.00209258775,0.0022033277500000002],"1769472":[1.0377051230000001,1.066430524],"1703936":[0.98114366900000005,1.073863695],"2048":[0.0004177037999999999,0.0004212873478260869],"14336":[0.0029694729999999994,0.003037568],"448":[8.9670166666666661e-05,9.3133889999999999e-05],"5505024":[4.5149284625000004,4.6087479425],"544":[0.000112092,0.00011757855555555554],"221184":[0.059616564999999996,0.065297806],"90112":[0.023125065,0.026115434499999986],"640":[0.000121889,0.00013797237499999998],"12800":[0.002702262,0.0029181879999999999],"262144":[0.073618489999999995,0.077717805000000001],"589824":[0.21316743199999999,0.2825570275],"884736":[0.38252999700000001,0.53966962600000001],"6144":[0.0015146200000000004,0.001552863],"1088":[0.00021971499999999997,0.00022896699999999998],"576":[0.00011668474074074074,0.00011750725],"160":[2.9391130000000003e-05,3.2021319999999999e-05],"672":[0.00013329600000000001,0.000141967],"8912896":[7.2473030155,7.2480173680000002],"100":[1.9143890000000001e-05,1.9630659999999999e-05],"507904":[0.17474842300000001,0.24831083850000002],"3840":[0.000760121,0.00087311130000000019],"192":[4.2831489999999997e-05,4.2869510000000001e-05],"376832":[0.12808262200000001,0.131192419],"98304":[0.0283607765,0.029236041499999997],"5376":[0.001135694,0.001174928],"94208":[0.025526595000000003,0.027285294000000009],"81920":[0.020238604,0.023249874],"3407872":[2.3444763979999999,2.4257419850000002],"104":[1.9201000000000001e-05,1.9208999999999999e-05],"122880":[0.031009282999999992,0.032652677000000005],"200":[3.7546070000000001e-05,3.7991679999999996e-05],"163840":[0.043640274499999999,0.04627978],"4063232":[2.8894615190000001,2.9003693369999999],"5767168":[4.9966265864999997,5.0684712049999998],"12582912":[13.30674928,29.512168597999999],"1600":[0.00033382100000000004,0.000338862],"136":[2.4376538461538461e-05,2.6251010000000001e-05],"232":[4.4024420000000006e-05,4.6190169999999995e-05],"7077888":[5.5490126609999999,6.120567297],"86016":[0.0213662965,0.0229848915],"31744":[0.00669478,0.0070398759999999987],"168":[3.2482822916666666e-05,3.3039729999999997e-05],"622592":[0.23275242200000001,0.32294029599999996],"108":[2.0574472222222222e-05,2.1832689999999998e-05],"327680":[0.096247849999999996,0.106828379],"2176":[0.00046627038095238115,0.00047170040000000027],"3328":[0.00071756000000000001,0.00081670690909090883],"1":[4.8949999999999993e-07,5.2732000000000004e-07],"2":[5.3046e-07,5.6415999999999999e-07],"3":[9.2185999999999997e-07,9.3555999999999994e-07],"4":[8.5751999999999997e-07,8.6428000000000011e-07],"7424":[0.0015618470000000001,0.0015704524999999997],"5":[1.1319699999999999e-06,1.13721e-06],"23552":[0.0055090979999999996,0.0059575519999999996],"6":[1.0464800000000001e-06,1.0535900000000001e-06],"61440":[0.0139265095,0.014451826000000001],"491520":[0.16829108100000001,0.22912843099999999],"77824":[0.0183871985,0.019519160000000001],"7":[1.2946999999999999e-06,1.30942e-06],"8":[1.2375200000000001e-06,1.30092e-06],"208":[3.8274e-05,4.0829159999999996e-05],"9":[1.55531e-06,1.60617e-06],"73728":[0.017127814999999998,0.018082103999999995],"304":[5.7995999999999998e-05,6.2149614035087727e-05],"400":[7.7228699999999995e-05,8.0981089999999995e-05],"1310720":[0.68676155400000005,0.89918121500000003],"336":[6.9682290000000008e-05,7.5913229999999992e-05],"3670016":[2.559218633,2.804973317],"6656":[0.001403502,0.0014130602857142854],"15360":[0.0031856893333333338,0.0032722419999999994],"432":[8.3273687500000004e-05,8.7223440000000005e-05],"950272":[0.42140870400000002,0.55585344199999998],"655360":[0.25448763200000002,0.3234988855],"69632":[0.016131738999999999,0.017424984000000001],"11264":[0.002583807,0.0025862760000000002],"2752512":[2.0106324849999999,2.0938736365000001],"8126464":[6.569872836,6.6161530500000003],"27648":[0.0059073240000000003,0.0063572770000000015],"368":[7.7788209999999996e-05,8.0866500000000002e-05],"65536":[0.015750169000000001,0.017939476000000003],"16252928":[13.818874292,13.9919594325],"464":[9.1355428571428571e-05,9.2577000000000005e-05],"1015808":[0.461493816,0.63423377800000003],"3072":[0.00075760533333333311,0.00079198966666666653],"110592":[0.027424572500000001,0.029541104500000009],"237568":[0.064624348999999998,0.072655533499999994],"278528":[0.078190502000000023,0.090262141000000004],"496":[9.8392199999999989e-05,0.00010128001136363637],"13107200":[11.291418219500001,11.760117126000001],"9961472":[8.1544689130000005,8.5321092934999996],"5888":[0.0013509360000000001,0.001400632],"11010048":[9.6037741570000001,9.9073621200000002],"1920":[0.00040577800000000003,0.00044421347368421051],"2490368":[1.6154028885,1.8216904795],"19456":[0.0041770110000000004,0.004216468499999999],"57344":[0.012738652499999999,0.014404764],"1179648":[0.57676625950000004,0.70891427299999998],"4718592":[3.6077054909999999,3.6102121650000001],"360448":[0.117681804,0.131569407],"1572864":[1.074958361,1.177814583],"53248":[0.011862629,0.012702277],"3456":[0.0007161060000000001,0.00081560399999999994],"40960":[0.0091427190000000023,0.01000825],"4608":[0.00095603599999999984,0.0010067107777777776],"13824":[0.0029141573333333328,0.0030382323333333324],"819200":[0.34781508100000003,0.46492422700000002],"983040":[0.43259958649999997,0.58125606100000005],"8704":[0.001857434,0.0019364348],"120":[2.1514509999999999e-05,2.2517159999999999e-05],"1024":[0.00020401600000000001,0.00023223700000000002],"49152":[0.012313543,0.01350280199999998],"524288":[0.18352792350000002,0.23905025899999999],"45056":[0.010322517999999999,0.011259421],"229376":[0.062354886999999991,0.076181029000000025],"2688":[0.00057184300000000016,0.00065348006666666666],"152":[2.7588414634146341e-05,2.9370249999999999e-05],"5120":[0.00105152,0.001095922],"1507328":[0.92570859100000003,1.182341442],"1216":[0.00025298289743589742,0.00026361199999999998],"1966080":[1.12697881,1.1524196565],"1900544":[1.080132144,1.1037745919999999],"184":[3.6225500000000001e-05,3.8484315789473685e-05],"7936":[0.0016184980000000001,0.0016894613999999994],"3801088":[2.669225763,2.7439433630000001],"6815744":[5.3818426014999998,5.9824121865000004],"124":[2.3503370000000001e-05,2.3847000000000001e-05],"102400":[0.025392121,0.028262378999999997],"311296":[0.09649066399999999,0.10077907999999999],"1408":[0.00030230000000000003,0.00032118237931034479],"393216":[0.14090704400000001,0.15257319899999999],"4352":[0.00094544399999999982,0.00095678669999999986],"6553600":[5.2853531074999998,5.6719790400000001],"20480":[0.0046712114999999995,0.0047200769999999996],"608":[0.00012370099999999999,0.000124191],"2228224":[1.3597358065,1.3929296579999999],"36864":[0.0078606939999999997,0.0084895790000000006],"704":[0.000145258,0.000151502],"720896":[0.28910289099999997,0.40649792900000004],"800":[0.00015978799999999998,0.00016091725000000004],"2621440":[1.749522011,1.8408508770000001],"425984":[0.13653948699999999,0.17348197600000001],"32768":[0.0071785440000000002,0.0075979490000000014],"12058624":[11.842261966500001,12.186911359],"128":[2.2920580000000001e-05,2.4194529999999999e-05],"180224":[0.051812700499999996,0.052342858499999992],"224":[4.2366900000000003e-05,4.6453550000000002e-05],"736":[0.00016129099999999998,0.00016463600000000001],"320":[6.4490739999999998e-05,7.0228540000000003e-05],"557056":[0.19689712450000002,0.25111599399999995],"832":[0.000168796,0.00017147917241379311],"9437184":[7.6669802879999995,7.8795837459999998],"3584":[0.00077274499999999992,0.00077720074999999985],"6291456":[6.2993211615,6.3727895219999997],"256":[4.5225857142857147e-05,4.7972666666666662e-05],"15204352":[12.926914187,13.363154558],"28672":[0.0061521869999999999,0.0063276949999999995],"768":[0.00017943750000000002,0.00018229299999999998],"212992":[0.058672759000000005,0.06296669000000002],"864":[0.00018117821999999998,0.00020144999999999999],"352":[7.6525109999999998e-05,7.7797166666666675e-05],"253952":[0.073129942000000003,0.079721341500000015],"960":[0.00018979033333333333,0.0001963362083333333],"24576":[0.0061404170000000004,0.0063845430000000012],"7680":[0.001585052,0.0016838704],"294912":[0.084842372999999999,0.10229542],"1048576":[0.48805600800000004,0.60801100649999995],"10485760":[8.8338423329999998,8.9302791460000002],"344064":[0.105732121,0.139769906],"288":[5.1804000000000001e-05,5.8203969999999998e-05],"1152":[0.00023376700000000001,0.00023550099999999999],"384":[8.7361999999999995e-05,8.7515000000000005e-05],"2304":[0.00050057516666666675,0.00053181738888888883],"896":[0.00018588319999999998,0.00019381034883720922],"480":[9.2347666666666657e-05,0.000102568],"1441792":[0.85825211400000001,1.114361744],"992":[0.00019339299999999998,0.00021221921428571426],"3968":[0.00080654099999999981,0.00085345645454545471],"6400":[0.0013588331428571433,0.0014090610000000001],"1344":[0.00028967217647058824,0.00029532287499999996],"126976":[0.031447524999999983,0.033151566],"2883584":[2.1163905855,2.274554561],"753664":[0.35605334700000002,0.43381340200000001],"16384":[0.0034435259999999997,0.0037743404999999995],"131072":[0.032781493000000002,0.037067225999999995],"458752":[0.150919207,0.17159465500000004],"172032":[0.047803600000000002,0.049940674000000004],"12288":[0.003058341,0.0032898550000000004],"14680064":[12.531164228,14.300026626499999],"1536":[0.00036820224999999996,0.000380381],"25600":[0.00560437,0.0058954060000000006],"1835008":[1.012816468,1.0743552574999999],"10752":[0.002338742,0.0024702027499999999],"21504":[0.0047677029999999999,0.0049446390000000007],"7602176":[5.9101698999999996,6.1566007384999999],"5632":[0.0012451529999999999,0.001298743],"10":[1.58271e-06,1.6242900000000002e-06],"3145728":[2.6950316289999998,2.783123373],"245760":[0.070762479499999975,0.074455039000000015],"1728":[0.00035362350000000002,0.00036743812],"11":[1.8363999999999999e-06,1.8636400000000001e-06],"1114112":[0.51989416499999996,0.68664204200000001],"12":[1.6999800000000001e-06,1.8147599999999999e-06],"7340032":[5.7380864750000002,5.8383192790000003],"7168":[0.0014888879999999998,0.0016579894],"13":[1.9859821428571426e-06,2.0405100000000001e-06],"6029312":[5.5644960189999999,5.5883517554999997],"14":[2.08462e-06,2.2093500000000003e-06],"3200":[0.00068225600000000012,0.00068742200000000003],"20":[3.4930600000000002e-06,3.6782900000000001e-06],"204800":[0.055779233000000004,0.062661359999999999],"15":[2.20202e-06,2.3397899999999998e-06],"13312":[0.002801801,0.002948273],"4980736":[3.7670428949999999,3.945977445],"118784":[0.029567231000000006,0.034798139999999998],"51200":[0.01165684,0.012142129],"16":[2.8721800000000001e-06,2.8904799999999996e-06],"21":[3.7991900000000001e-06,3.8186600000000001e-06],"917504":[0.40208723600000001,0.51158545499999997],"22":[3.8872499999999999e-06,4.1011899999999999e-06],"4864":[0.0010128067777777775,0.0011114860000000001],"17":[3.0647600000000005e-06,3.1620100000000002e-06],"14848":[0.0031630386666666671,0.0032548],"23":[4.0374285714285716e-06,4.1953500000000004e-06],"786432":[0.36467738399999999,0.51379142100000008],"18":[3.2124900000000003e-06,3.4962794117647063e-06],"1638400":[0.91977468200000001,1.0178277515],"7864320":[6.2511659699999997,6.3529066429999999],"24":[4.2560599999999995e-06,4.6835000000000001e-06],"14155776":[12.285692647499999,12.883256714],"19":[3.3121200000000001e-06,3.5841200000000003e-06],"30":[5.1444027777777783e-06,5.4354499999999998e-06],"25":[4.6655999999999998e-06,4.7421099999999997e-06],"31":[5.3851500000000004e-06,5.5903599999999996e-06],"1280":[0.00026331999999999999,0.00026573000000000005],"26":[4.7837800000000001e-06,4.8961199999999993e-06],"3932160":[2.7290325869999998,2.9029046850000002],"2432":[0.00050221872222222226,0.0005497924375],"32":[5.7084899999999998e-06,6.0166500000000002e-06],"27":[4.9183699999999998e-06,5.0579499999999996e-06],"409600":[0.13179243600000001,0.15702074399999999]}},{"title":"OrderedSet symmetricDifference with Array (25% overlap)","results":{"28":[3.8377200000000002e-06,4.0849700000000003e-06],"34":[5.27887e-06,5.7369500000000002e-06],"29":[3.8987800000000001e-06,4.3270700000000001e-06],"40":[6.0153200000000004e-06,7.1156599999999992e-06],"17408":[0.0032574326666666674,0.0033116305],"1472":[0.00026601200000000004,0.00028296099999999998],"112":[1.5601199999999999e-05,1.6564329999999999e-05],"1376256":[0.61503875399999997,0.81222559900000002],"5242880":[3.5089334145,3.6205507890000002],"36":[5.69584e-06,6.0498000000000001e-06],"42":[6.1322299999999999e-06,6.8971999999999998e-06],"11534336":[8.8481250204999995,9.2480521719999995],"114688":[0.021540106999999996,0.023133056000000006],"144":[2.2336059999999998e-05,2.4239999999999998e-05],"38":[5.6323400000000005e-06,6.5567900000000006e-06],"240":[3.5513559999999995e-05,3.7625410000000001e-05],"9216":[0.001642651,0.0018722599999999995],"44":[6.7003500000000001e-06,7.6282799999999997e-06],"1664":[0.000277543,0.000279871],"196608":[0.050717258999999994,0.051573058000000019],"155648":[0.0341464925,0.034963719499999976],"2816":[0.00048105800000000003,0.00054299141176470593],"50":[6.9280000000000004e-06,7.3259999999999998e-06],"2359296":[1.235249762,1.260294408],"46":[7.0185500000000008e-06,7.4754999999999998e-06],"176":[2.9443669999999999e-05,2.9958812499999999e-05],"52":[7.2913333333333334e-06,7.5881400000000005e-06],"272":[4.1715999999999998e-05,4.9410505376344082e-05],"116":[1.70265e-05,1.7303200000000001e-05],"47104":[0.009378885,0.010070285999999999],"6912":[0.0011418405,0.001192301],"1856":[0.00030405464516129033,0.00031398045161290327],"48":[7.5931500000000003e-06,8.8653600000000004e-06],"2097152":[0.9216601485,0.99027365499999997],"54":[7.8976700000000002e-06,7.9465799999999997e-06],"2031616":[0.83507202150000004,0.89211057900000001],"43008":[0.0078748999999999989,0.0083431300000000007],"60":[8.6617200000000001e-06,9.1400200000000003e-06],"30720":[0.005191892,0.0054208860000000006],"56":[8.0826100000000002e-06,8.1933699999999998e-06],"62":[9.5759499999999993e-06,1.005726e-05],"58":[8.360480000000001e-06,8.6084499999999989e-06],"3014656":[1.9766506054999999,2.0686889850000001],"64":[9.1797600000000004e-06,1.0230009999999999e-05],"8388608":[5.0866259185000002,5.1999669675],"29696":[0.0050592010000000001,0.0050904619999999996],"216":[3.0559124999999999e-05,3.0683199999999998e-05],"106496":[0.020554560000000006,0.0219124755],"72":[1.1114799999999999e-05,1.206313e-05],"442368":[0.105518137,0.13461487],"147456":[0.03283990199999999,0.033336190000000002],"4456448":[2.7681434249999999,2.8294197749999999],"63488":[0.011549263000000001,0.012212933],"38912":[0.0074100609999999982,0.0078930630000000005],"68":[1.071331e-05,1.170785e-05],"188416":[0.0468715725,0.047314965],"248":[3.7626186440677968e-05,4.0480369999999997e-05],"80":[1.2839450000000001e-05,1.2885990000000001e-05],"2560":[0.00048952000000000002,0.00050699399999999998],"34816":[0.006374729,0.0067555149999999993],"3712":[0.00060699199999999999,0.00061578566666666674],"3538944":[1.746670524,1.804856808],"76":[1.1922409999999999e-05,1.25684e-05],"4194304":[2.2264231125,2.3245757055],"851968":[0.25762995300000002,0.326316418],"4096":[0.00070820699999999998,0.00073729750000000043],"59392":[0.010755539999999999,0.011572845],"84":[1.3335899999999999e-05,1.3643939999999999e-05],"3276800":[1.6138751075,1.787453441],"55296":[0.009613066,0.010116963],"688128":[0.21398671300000005,0.32675396200000001],"8192":[0.00137539,0.0014703990000000001],"10240":[0.0018321574,0.0019278089999999997],"15872":[0.0027371879999999998,0.0031208610000000004],"92":[1.4854999999999999e-05,1.5641000000000002e-05],"26624":[0.0044996814999999999,0.0047110499999999996],"1792":[0.00029742156666666669,0.000304729],"11776":[0.0022629029999999997,0.0023485370000000004],"2944":[0.0005399230000000001,0.00056280441176470596],"88":[1.4356530000000001e-05,1.4366820000000001e-05],"22528":[0.0042473909999999988,0.0047239199999999995],"1245184":[0.51264437299999999,0.68198243400000003],"15728640":[10.057488198,10.584964505],"96":[1.5846787234042552e-05,1.884263e-05],"1984":[0.00033425600000000001,0.00033785338461538467],"139264":[0.029529948,0.031553863000000001],"475136":[0.12960684300000003,0.141621314],"13631488":[8.4938654119999999,8.9603191545000005],"416":[6.1955539999999996e-05,6.7063910000000001e-05],"928":[0.0001484104,0.00015672200000000001],"512":[8.5075083333333338e-05,8.6236000000000006e-05],"18432":[0.0033604969999999996,0.0034644540000000001],"16777216":[11.183102848000001],"9728":[0.001715371,0.0017413830000000013],"1769472":[0.698380114,0.75962237700000002],"1703936":[0.65906247099999993,0.82700497900000003],"2048":[0.0003399439999999999,0.00034538100000000002],"14336":[0.0023940369999999999,0.002447308],"448":[7.1486230000000002e-05,7.2340329999999998e-05],"5505024":[3.7901576939999999,3.862107409],"544":[9.6404999999999996e-05,9.6816230000000005e-05],"221184":[0.046846939499999997,0.049897555999999996],"90112":[0.019258414499999994,0.020626189999999996],"640":[0.00011032675,0.00011235080000000001],"12800":[0.0021259080000000001,0.0024700920000000001],"262144":[0.061497229,0.0648318695],"589824":[0.17071858600000001,0.23649555999999999],"884736":[0.27859599299999999,0.35278109600000002],"6144":[0.001224022,0.001239792],"1088":[0.00018866,0.00019002519999999993],"576":[9.70372e-05,0.00010055434939759035],"160":[2.4744333333333336e-05,2.7547040000000002e-05],"672":[0.00011413600000000001,0.000119436],"8912896":[6.2354787094999997,6.2371422860000001],"100":[1.4470500000000001e-05,1.5322e-05],"507904":[0.13339052600000001,0.17068539999999999],"3840":[0.00070154146153846161,0.00071730553846153827],"192":[3.4411e-05,3.5190149999999997e-05],"376832":[0.10519713450000001,0.10803025400000001],"98304":[0.022807776000000005,0.023539132000000001],"5376":[0.00099394566666666695,0.0010021917777777781],"94208":[0.0206759075,0.021566775],"81920":[0.016784932000000002,0.017780096000000002],"3407872":[1.689349607,1.69640685],"104":[1.5075100000000001e-05,1.5196210000000001e-05],"122880":[0.024052452000000005,0.025454766],"200":[2.9287660000000001e-05,3.1824320000000001e-05],"163840":[0.037092444000000009,0.037347396499999998],"4063232":[2.1500879555000001,2.174730587],"5767168":[4.1485319414999999,4.1783936559999999],"12582912":[10.76167008,20.670276722000001],"1600":[0.00026175662857142866,0.00026549200000000004],"136":[2.0975379999999998e-05,2.2340410000000001e-05],"232":[3.4388750000000002e-05,3.8168789999999999e-05],"7077888":[4.0029141250000002,4.5655923620000003],"86016":[0.017666131000000012,0.018886196500000001],"31744":[0.0054113709999999999,0.0058019619999999991],"168":[2.7459555555555558e-05,2.8258220000000001e-05],"622592":[0.18340867599999999,0.26617796049999998],"108":[1.5818039999999999e-05,1.6506000000000001e-05],"327680":[0.083830280000000007,0.08517086500000004],"2176":[0.00039805199999999998,0.0004008829166666667],"3328":[0.00056080429411764694,0.00063191007142857146],"1":[1.4573e-07,1.5251000000000001e-07],"2":[3.7744999999999998e-07,3.8098000000000001e-07],"3":[3.8354000000000001e-07,3.9488e-07],"4":[6.3096999999999999e-07,6.7909000000000003e-07],"7424":[0.001243594,0.0012694800000000001],"5":[6.5904e-07,6.7993999999999999e-07],"23552":[0.0044807904999999999,0.0047053340000000003],"6":[6.7991999999999996e-07,6.8293000000000004e-07],"61440":[0.011006041499999999,0.0116799655],"491520":[0.12756231100000001,0.17042665300000001],"77824":[0.015347192000000001,0.016617548500000003],"7":[8.8876999999999998e-07,8.9851000000000002e-07],"8":[9.019e-07,9.1414285714285718e-07],"208":[3.022118e-05,3.0832420000000001e-05],"9":[8.8806000000000008e-07,9.0459999999999999e-07],"73728":[0.014633772,0.015186294999999999],"304":[5.0206189999999993e-05,5.278166e-05],"400":[5.6798000000000001e-05,6.2407879999999994e-05],"1310720":[0.55278819099999998,0.73672242199999993],"336":[5.8105e-05,6.5471789999999998e-05],"3670016":[1.8816853824999999,1.930694691],"6656":[0.0010897050000000001,0.0011346301250000001],"15360":[0.0027038123333333339,0.0027073890000000001],"432":[6.5261571428571423e-05,6.8030939999999995e-05],"950272":[0.31160876599999998,0.38764228550000002],"655360":[0.202963589,0.261490526],"69632":[0.013600698500000003,0.0147298345],"11264":[0.0021412167500000001,0.0021503389999999998],"2752512":[1.6347760819999999,1.7260637345000001],"8126464":[5.0035179530000002,5.0868357069999997],"27648":[0.004697957,0.004780795],"368":[6.0844000000000002e-05,6.1921000000000006e-05],"65536":[0.012582973000000003,0.013091438],"16252928":[10.536254038999999,10.843948188000001],"464":[7.3418579999999994e-05,7.4783999999999994e-05],"1015808":[0.33322444399999995,0.44599715899999998],"3072":[0.000599783,0.00060911343749999998],"110592":[0.020708727,0.021978010000000006],"237568":[0.051697600999999996,0.054227684999999991],"278528":[0.068892521000000012,0.075565350000000003],"496":[8.2331539999999992e-05,8.3939866666666666e-05],"13107200":[8.2025231489999992,8.6288461440000006],"9961472":[6.9157348110000001,7.2227500784999998],"5888":[0.0010928610000000001,0.0011290640000000002],"11010048":[7.9156992869999998,8.288723246],"1920":[0.00031669400000000001,0.00036853599999999993],"2490368":[1.321239719,1.3810914429999999],"19456":[0.0035587450000000007,0.0035839159999999995],"57344":[0.01015798,0.0116732955],"1179648":[0.47505001000000002,0.65108183800000008],"4718592":[3.0625471559999999,3.0678541720000001],"360448":[0.093204707499999984,0.106976457],"1572864":[0.84188971000000001,1.059018123],"53248":[0.0091651199999999971,0.009822664],"3456":[0.000545357,0.00071385633333333339],"40960":[0.0075055589999999993,0.0077974759999999994],"4608":[0.00084497645454545476,0.00085306499999999986],"13824":[0.0023707982500000007,0.0024137329999999995],"819200":[0.25201919499999997,0.32435285550000004],"983040":[0.32161097500000002,0.41566152249999999],"8704":[0.001560421,0.0016267121999999994],"120":[1.6817333333333332e-05,1.7673719999999998e-05],"1024":[0.00017109300000000001,0.000199524],"49152":[0.0097709779999999996,0.01027581],"524288":[0.14156608000000001,0.18028696699999999],"45056":[0.0085944359999999987,0.0088199680000000009],"229376":[0.0500305105,0.052321313000000001],"2688":[0.00048207000000000008,0.00052743744444444431],"152":[2.3703329999999999e-05,2.5124370000000001e-05],"5120":[0.00088801000000000006,0.00093620500000000007],"1507328":[0.76501452650000001,0.95927417699999995],"1216":[0.00021371300000000001,0.00021618457777777773],"1966080":[0.81358870299999997,0.83400294100000005],"1900544":[0.75363670150000006,0.80053259600000004],"184":[3.1029199999999998e-05,3.2526510000000002e-05],"7936":[0.001355836,0.0013630420000000001],"3801088":[1.8862716909999999,2.0250868674999998],"6815744":[3.8920676730000001,4.3209069649999998],"124":[1.9595530000000001e-05,2.0053120000000001e-05],"102400":[0.018784203000000003,0.021648031999999998],"311296":[0.078049774999999974,0.079060964999999997],"1408":[0.00026127499999999994,0.00026459633333333335],"393216":[0.11452159799999995,0.135152567],"4352":[0.00080498858333333311,0.00081583658333333336],"6553600":[3.8269806095000001,4.1205040110000004],"20480":[0.0038607099999999998,0.0039064029999999993],"608":[0.0001030341,0.00010665099999999999],"2228224":[1.1446479059999999,1.1666504170000001],"36864":[0.0066949750000000006,0.0071544099999999999],"704":[0.00012858149999999999,0.00012944884210526315],"720896":[0.24527702100000001,0.35485759750000001],"800":[0.00012265799999999996,0.00012763099999999998],"2621440":[1.453327571,1.5646356779999999],"425984":[0.101199045,0.129787707],"32768":[0.005784717,0.0060838109999999989],"12058624":[9.6519079320000003,9.8181110470000004],"128":[1.88836e-05,2.0750999999999998e-05],"180224":[0.042806643499999998,0.043467730500000003],"224":[3.2206999999999998e-05,3.4178799999999999e-05],"736":[0.00012663799999999996,0.0001328],"320":[5.5508759999999997e-05,5.5751999999999997e-05],"557056":[0.154606412,0.21917868600000001],"832":[0.00013532999999999997,0.00013632762295081967],"9437184":[6.4901774300000001,6.7230857090000002],"3584":[0.00058316599999999998,0.00067631614285714272],"6291456":[5.0950040730000001,5.1351834165000003],"256":[3.6749999999999999e-05,4.1625950000000001e-05],"15204352":[9.8725381040000002,10.174180099499999],"28672":[0.0048366150000000007,0.0049752979999999995],"768":[0.00013867466666666668,0.00014618050819672129],"212992":[0.044640047000000002,0.055565648000000023],"864":[0.00014471086153846155,0.000158061],"352":[6.2789785714285719e-05,6.3346230000000002e-05],"253952":[0.05774133599999999,0.059195948000000012],"960":[0.00015852999999999999,0.000165969],"24576":[0.0049400220000000005,0.0050711770000000005],"7680":[0.0013097884285714287,0.001331196],"294912":[0.072468061,0.076012138000000007],"1048576":[0.35291280400000002,0.49040338249999998],"10485760":[7.4585330120000002,7.6236240300000002],"344064":[0.088386092999999999,0.114467675],"288":[4.5729999999999998e-05,4.890006e-05],"1152":[0.00019489299999999994,0.00020051199999999999],"384":[6.7775955555555561e-05,7.4595060000000004e-05],"2304":[0.00041898099999999997,0.00045234699999999992],"896":[0.00014501742857142859,0.00014690799999999998],"480":[8.2458199999999989e-05,8.4309999999999997e-05],"1441792":[0.67395903599999996,0.87486706599999997],"992":[0.000164029,0.000171383],"3968":[0.00069067192857142864,0.00069422871428571431],"6400":[0.0010575682222222227,0.001089766],"1344":[0.00023906099999999997,0.00024452100000000004],"126976":[0.025232864000000001,0.025934146000000002],"2883584":[1.7581989815000001,1.8923321115],"753664":[0.2695833185,0.34734701599999995],"16384":[0.0029766190000000007,0.0030781110000000001],"131072":[0.026627162500000003,0.029150734000000001],"458752":[0.108086842,0.14696811800000001],"172032":[0.0396554,0.040937662499999999],"12288":[0.0024036859999999999,0.0025584750000000002],"14680064":[9.1597161220000007,15.703359267],"1536":[0.00027312799999999998,0.00031340399999999998],"25600":[0.0042950330000000002,0.0043866949999999995],"1835008":[0.71520521400000003,0.73492895699999994],"10752":[0.0019516598,0.0020083890000000002],"21504":[0.0039416935000000002,0.0040712580000000003],"7602176":[4.4769925930000003,4.5060974180000004],"5632":[0.0010494514444444444,0.0011046616250000004],"10":[9.8312000000000008e-07,1.0119399999999998e-06],"3145728":[2.2163195330000001,2.2502817849999999],"245760":[0.053754791999999996,0.05644296],"1728":[0.00027380000000000004,0.00029916999999999992],"11":[1.45545e-06,1.5783099999999998e-06],"1114112":[0.43393601500000001,0.59791245900000001],"12":[1.8323800000000001e-06,1.8508199999999998e-06],"7340032":[4.3124206860000003,4.4793645805000004],"7168":[0.0012121649999999999,0.0013237074999999997],"13":[1.80423e-06,1.8825499999999999e-06],"6029312":[4.5423988015000001,4.5797819525000003],"14":[1.9658700000000001e-06,2.0060299999999999e-06],"3200":[0.00052833900000000007,0.00054018555555555554],"20":[2.3901499999999999e-06,2.5856700000000001e-06],"204800":[0.041900991000000005,0.047201005999999997],"15":[2.1076299999999999e-06,2.1275909090909092e-06],"13312":[0.0021826459999999999,0.0023566490000000002],"4980736":[3.128263075,3.1884027760000002],"118784":[0.0231884215,0.02559461],"51200":[0.0088169850000000011,0.0095837970000000015],"16":[2.2302899999999998e-06,2.42182e-06],"21":[2.6124299999999997e-06,2.7909499999999999e-06],"917504":[0.28219739700000002,0.38787550199999998],"22":[3.3915200000000002e-06,3.4283000000000003e-06],"4864":[0.00087140490000000019,0.0010270108888888884],"17":[2.23372e-06,2.29426e-06],"14848":[0.0025803699999999994,0.0026700580000000003],"23":[3.5471299999999999e-06,3.8048823529411766e-06],"786432":[0.28731749400000001,0.42688867149999998],"18":[2.2736499999999998e-06,2.37992e-06],"1638400":[0.63956579600000008,0.73718975799999997],"7864320":[4.6830231500000004,4.8162630975000003],"24":[3.7086999999999997e-06,3.9182777777777783e-06],"14155776":[9.0894305365000001,9.4614513405],"19":[2.2434800000000001e-06,2.62347e-06],"30":[4.0690100000000002e-06,4.1715099999999996e-06],"25":[3.4534499999999999e-06,3.8483500000000002e-06],"31":[4.1806081081081081e-06,4.3304900000000004e-06],"1280":[0.00022403500000000003,0.00023070571428571431],"26":[3.82476e-06,3.8850000000000001e-06],"3932160":[2.0426006160000001,2.1661885925000002],"2432":[0.00042033399999999996,0.00045368585000000002],"32":[4.4062700000000001e-06,4.8997000000000007e-06],"27":[3.7648599999999999e-06,3.8446899999999999e-06],"409600":[0.094594577999999999,0.11414943800000001]}},{"title":"OrderedSet symmetricDifference with Array (50% overlap)","results":{"28":[2.4952900000000002e-06,2.6038500000000001e-06],"34":[3.5080900000000001e-06,3.7795899999999999e-06],"29":[2.5094199999999998e-06,2.5603000000000003e-06],"40":[4.1677900000000003e-06,4.4712800000000002e-06],"17408":[0.0021710499999999999,0.0022775019999999998],"1472":[0.00019628900000000002,0.00019684238775510209],"112":[1.200217e-05,1.2045000000000001e-05],"1376256":[0.41575575199999998,0.57521743450000007],"5242880":[2.445554145,2.582011279],"36":[3.83929e-06,3.90614e-06],"42":[4.3427599999999999e-06,4.6242700000000004e-06],"11534336":[6.4669109349999996,6.6531073699999999],"114688":[0.016149933999999998,0.016854872],"144":[1.5627000000000001e-05,1.7223352941176472e-05],"38":[3.88575e-06,4.4472899999999999e-06],"240":[2.627677e-05,2.7516270000000001e-05],"9216":[0.001122547,0.001303193],"44":[4.6172999999999998e-06,5.0979499999999992e-06],"1664":[0.00019858499999999998,0.00020566965957446803],"196608":[0.036334021499999994,0.037689704500000004],"155648":[0.024040677,0.024357265999999995],"2816":[0.00036980865384615388,0.0003828280000000001],"50":[5.2955099999999994e-06,5.4581499999999996e-06],"2359296":[0.81295663799999995,0.84608603500000001],"46":[4.8187799999999998e-06,5.6826666666666664e-06],"176":[2.0765030000000001e-05,2.1479020833333335e-05],"52":[5.5480000000000001e-06,5.8100000000000003e-06],"272":[2.8521e-05,2.9995400000000001e-05],"116":[1.25816e-05,1.292913e-05],"47104":[0.0065566619999999996,0.0074773740000000002],"6912":[0.0008615405454545453,0.0008826289999999999],"1856":[0.00021888699999999999,0.000221898],"48":[5.0778800000000004e-06,6.4730000000000005e-06],"2097152":[0.67149653600000003,0.806155179],"54":[5.677e-06,5.8197346938775514e-06],"2031616":[0.62609143150000002,0.66713936750000002],"43008":[0.0057337909999999976,0.0060021000000000007],"60":[6.3086e-06,6.5846600000000004e-06],"30720":[0.0037671800000000006,0.0038958265],"56":[6.0399499999999997e-06,6.2933899999999999e-06],"62":[6.4897299999999994e-06,7.1533899999999993e-06],"58":[6.0598e-06,6.3458500000000004e-06],"3014656":[1.4009880960000001,1.4578361530000001],"64":[6.7766699999999994e-06,7.2995099999999992e-06],"8388608":[3.8908937770000001,4.0927668229999998],"29696":[0.0037191984999999997,0.0038277210000000005],"216":[2.2531000000000002e-05,2.3425e-05],"106496":[0.015191831999999999,0.016399697500000001],"72":[7.6350799999999994e-06,7.8858100000000007e-06],"442368":[0.076805853000000007,0.112145284],"147456":[0.022699546999999994,0.024939040499999999],"4456448":[1.8781283965,1.907236715],"63488":[0.0086619209999999978,0.0086772939999999986],"38912":[0.0051013860000000012,0.0052447250000000013],"68":[7.2064299999999997e-06,7.481e-06],"188416":[0.034049715500000001,0.034687892999999984],"248":[2.76141e-05,2.8722e-05],"80":[9.1790899999999992e-06,9.5905499999999992e-06],"2560":[0.00034203799999999997,0.00036632],"34816":[0.0043773649999999994,0.0044664770000000008],"3712":[0.000448035,0.00046716300000000004],"3538944":[1.3514279149999999,1.388239403],"76":[8.2286600000000003e-06,9.0762999999999998e-06],"4194304":[1.649382581,1.6980380955000001],"851968":[0.19284743699999995,0.26313562150000003],"4096":[0.00051344100000000011,0.00051385105555555545],"59392":[0.0077314440000000014,0.0084443970000000011],"84":[9.4504000000000002e-06,9.4684299999999994e-06],"3276800":[1.2158960235,1.2970956650000001],"55296":[0.007208969,0.0075305190000000011],"688128":[0.149734953,0.22532677899999998],"8192":[0.001001923,0.001041382],"10240":[0.0012986900000000001,0.0013602304285714286],"15872":[0.0019939249999999997,0.0022477899999999999],"92":[1.0066117647058824e-05,1.1139526315789475e-05],"26624":[0.0033298540000000001,0.0034557824999999994],"1792":[0.00021379600000000004,0.00022372700000000003],"11776":[0.0016412810000000001,0.0017517893999999992],"2944":[0.00038237299999999998,0.00040103399999999993],"88":[1.0167069999999999e-05,1.1097710000000001e-05],"22528":[0.0030869933333333333,0.0033113089999999997],"1245184":[0.35883454300000001,0.45340539000000002],"15728640":[8.1193705989999998,8.1434353809999998],"96":[1.0997570000000001e-05,1.1875749999999999e-05],"1984":[0.000224334,0.00023535800000000002],"139264":[0.020307651999999999,0.021727499000000001],"475136":[0.085385099000000006,0.1136782215],"13631488":[6.8260162559999999,7.1792726360000003],"416":[4.3674000000000002e-05,4.7030666666666663e-05],"928":[0.000109348,0.00011148489534883723],"512":[6.1053698412698415e-05,6.1462539999999999e-05],"18432":[0.0024079959999999999,0.0025823403333333338],"16777216":[8.8343207499999998],"9728":[0.0012258799999999999,0.0012680297142857145],"1769472":[0.53631526200000001,0.60670020000000002],"1703936":[0.51255261200000002,0.67901720300000001],"2048":[0.000231492,0.00025462900000000003],"14336":[0.0017754280000000003,0.0017910798000000002],"448":[5.1908099999999999e-05,5.2537999999999997e-05],"5505024":[2.63043374,2.6829835119999998],"544":[6.4461330000000001e-05,6.7106000000000004e-05],"221184":[0.034030501000000005,0.037040898499999989],"90112":[0.013649646999999997,0.014283667],"640":[7.7634660000000001e-05,8.0157300000000006e-05],"12800":[0.0015633700000000001,0.0018417070000000002],"262144":[0.041207798999999996,0.046296885999999995],"589824":[0.118067831,0.14819845400000001],"884736":[0.202106385,0.26211336350000003],"6144":[0.00091135000000000001,0.00093806149999999997],"1088":[0.00013106500000000003,0.000137047],"576":[6.8114550000000003e-05,6.9219000000000003e-05],"160":[1.739376e-05,1.9340880000000002e-05],"672":[8.4815727272727264e-05,8.8760969999999997e-05],"8912896":[4.2620547059999998,4.3234012039999996],"100":[1.0652999999999999e-05,1.1420869999999999e-05],"507904":[0.095438380500000017,0.15015973799999999],"3840":[0.00048246500000000006,0.00050293605263157905],"192":[2.4549000000000002e-05,2.4818000000000002e-05],"376832":[0.07194547699999998,0.073991569999999993],"98304":[0.0165642355,0.017152504499999999],"5376":[0.00070279200000000004,0.00070828099999999973],"94208":[0.014843924999999997,0.015739547499999999],"81920":[0.011732770999999999,0.012191689],"3407872":[1.3213782919999999,1.377392467],"104":[1.0975000000000001e-05,1.1073333333333333e-05],"122880":[0.0173937685,0.018113519000000005],"200":[2.196019e-05,2.309672e-05],"163840":[0.025641631999999998,0.025889664],"4063232":[1.6126335585,1.7036352945],"5767168":[2.9073283440000002,3.0074916754999999],"12582912":[8.1193440839999997,21.431329964500001],"1600":[0.00019814097777777774,0.00020586733333333331],"136":[1.4583669999999999e-05,1.600325e-05],"232":[2.5646000000000001e-05,2.6779030000000001e-05],"7077888":[3.1379903439999999,3.6498361670000001],"86016":[0.012401631,0.013479577],"31744":[0.0038625340000000008,0.0041985605000000002],"168":[2.001e-05,2.0230460000000003e-05],"622592":[0.12778568000000001,0.17316458700000001],"108":[1.1678339999999999e-05,1.3105669999999998e-05],"327680":[0.056499003999999999,0.058424091999999997],"2176":[0.00024998750000000008,0.00026551999999999999],"3328":[0.000395471,0.00045945100000000004],"1":[1.4573e-07,1.5267e-07],"2":[3.7109000000000002e-07,3.9587000000000001e-07],"3":[3.7533999999999997e-07,4.0059999999999997e-07],"4":[4.0442999999999998e-07,4.2110000000000003e-07],"7424":[0.0008917310000000001,0.0009353740000000001],"5":[4.2258000000000002e-07,4.5277e-07],"23552":[0.0033391289999999997,0.0036301055],"6":[6.6766000000000004e-07,6.9676e-07],"61440":[0.008020679000000001,0.0083932199999999981],"491520":[0.086667501000000008,0.11650514499999998],"77824":[0.010884966499999999,0.011492478],"7":[6.7746000000000003e-07,7.2590999999999997e-07],"8":[7.0609000000000004e-07,7.1719999999999999e-07],"208":[2.2804000000000001e-05,2.3120139999999998e-05],"9":[7.1101999999999997e-07,7.4691999999999991e-07],"73728":[0.010061027,0.010630186],"304":[3.294795e-05,3.6057099999999997e-05],"400":[4.4357999999999998e-05,4.5061729999999998e-05],"1310720":[0.37680084400000002,0.48678198900000003],"336":[3.8146999999999999e-05,4.3850000000000002e-05],"3670016":[1.4196916420000001,1.5100703449999999],"6656":[0.00081883900000000003,0.0008516299090909089],"15360":[0.001880285,0.0019780310000000003],"432":[4.816204e-05,5.1983309999999995e-05],"950272":[0.22891325200000001,0.29039952899999999],"655360":[0.13919149550000001,0.17396131200000001],"69632":[0.0093613089999999982,0.0097786999999999995],"11264":[0.0014694509999999999,0.0015414923333333336],"2752512":[1.1338535185,1.2218962069999999],"8126464":[3.8248412250000001,3.8343763165000002],"27648":[0.0034641335000000001,0.0037266845000000007],"368":[4.6348625e-05,4.7199549999999998e-05],"65536":[0.008828898,0.0094668180000000001],"16252928":[8.2279293940000002,8.2961840329999994],"464":[5.3561290697674419e-05,5.3828e-05],"1015808":[0.24856215949999999,0.33889956500000001],"3072":[0.00043222599999999996,0.00046409042857142852],"110592":[0.015559791999999999,0.016586651000000001],"237568":[0.037063506000000003,0.038495491],"278528":[0.044118623999999995,0.053066036000000004],"496":[5.4489e-05,5.7527178082191781e-05],"13107200":[6.5343675179999998,6.9768635249999997],"9961472":[4.9570877009999998,5.000373884],"5888":[0.00077464500000000002,0.0008338769999999999],"11010048":[5.9202206540000004,6.1808687630000003],"1920":[0.00023678180000000006,0.00025712618421052622],"2490368":[0.87335371950000007,0.94703115700000007],"19456":[0.0025521660000000007,0.002553774333333334],"57344":[0.0074597749999999992,0.0080278050000000024],"1179648":[0.31897139699999999,0.42054562500000003],"4718592":[1.993499667,2.0671978179999999],"360448":[0.067416938999999967,0.075521594999999997],"1572864":[0.60693712,0.70509429450000005],"53248":[0.0068666909999999994,0.007303988],"3456":[0.000420278,0.00047540700000000006],"40960":[0.0053860400000000008,0.005485012],"4608":[0.00058266499999999979,0.00058603312499999974],"13824":[0.0017315124000000001,0.001771456],"819200":[0.18050238099999999,0.23576249999999999],"983040":[0.22843682499999995,0.29675203699999997],"8704":[0.0011431142500000001,0.00116754425],"120":[1.2656999999999999e-05,1.2678349999999999e-05],"1024":[0.00011831500000000002,0.000141151],"49152":[0.00708561,0.0075362210000000001],"524288":[0.098251781999999982,0.12877166900000001],"45056":[0.006177821,0.0064268000000000007],"229376":[0.037180370000000004,0.044629526999999995],"2688":[0.00032361800000000002,0.00036083974074074078],"152":[1.6401530000000001e-05,1.823218e-05],"5120":[0.00065972399999999999,0.00066128386666666663],"1507328":[0.53551256650000001,0.71082827500000001],"1216":[0.00015164865573770496,0.00015692395238095237],"1966080":[0.62226884699999996,0.65367558000000003],"1900544":[0.59994675799999997,0.62972161199999999],"184":[2.258735e-05,2.6475520000000002e-05],"7936":[0.00098556399999999997,0.001010821888888889],"3801088":[1.4324870615,1.5978456240000001],"6815744":[3.063494334,3.4476399259999999],"124":[1.387492e-05,1.504198e-05],"102400":[0.014181404,0.015346485999999998],"311296":[0.054451417500000002,0.064347142999999982],"1408":[0.00018879659615384615,0.00018972300000000001],"393216":[0.081791660999999988,0.088982249999999999],"4352":[0.00055237999999999999,0.00056706900000000012],"6553600":[3.0001997249999999,3.3375386025],"20480":[0.002771698,0.0028184690000000001],"608":[7.1015999999999999e-05,7.5657070000000002e-05],"2228224":[0.74825681600000005,0.74922491899999999],"36864":[0.0047412870000000011,0.0049402700000000001],"704":[8.9515179999999998e-05,9.1544269999999995e-05],"720896":[0.17215360099999999,0.25523809200000003],"800":[9.0917769230769235e-05,9.9161999999999997e-05],"2621440":[0.98705239899999997,1.0898350569999999],"425984":[0.078950245999999988,0.083954556999999999],"32768":[0.0041725470000000004,0.0043635829999999999],"12058624":[7.0711945500000004,7.2935062730000002],"128":[1.3540710000000001e-05,1.432864e-05],"180224":[0.030940129,0.031023291000000008],"224":[2.4389469999999999e-05,2.4877579999999999e-05],"736":[9.3415499999999994e-05,9.9091022222222222e-05],"320":[3.7886000000000003e-05,3.8279689999999998e-05],"557056":[0.102141842,0.15854270500000001],"832":[9.6836600000000007e-05,0.00010015178947368423],"9437184":[4.5818288965000002,4.5990140110000004],"3584":[0.000449512,0.00049376999999999993],"6291456":[3.6746035319999999,3.6892056709999999],"256":[2.8251079999999997e-05,2.9017999999999999e-05],"15204352":[7.7661958159999998,8.5370510209999999],"28672":[0.0035311879999999998,0.0037017],"768":[0.00010463974444444443,0.000105342],"212992":[0.033953048,0.036255137],"864":[0.000102817,0.000115711],"352":[4.4036000000000003e-05,4.4752368421052632e-05],"253952":[0.040772454,0.051813163000000037],"960":[0.00011333,0.0001159392588235294],"24576":[0.003592235,0.0037374595],"7680":[0.00091597,0.00097318100000000005],"294912":[0.050589002000000008,0.052394577999999983],"1048576":[0.27068149499999999,0.35378921500000005],"10485760":[5.3133940280000003,5.4109924244999998],"344064":[0.062485799999999994,0.078248190499999995],"288":[2.9994000000000001e-05,3.3246635294117646e-05],"1152":[0.000136623,0.00013921800000000003],"384":[4.9573190000000001e-05,5.1978040000000006e-05],"2304":[0.00029490899999999999,0.00031797599999999992],"896":[0.00010551905882352937,0.00011001396551724137],"480":[5.7935030000000002e-05,6.0223999999999998e-05],"1441792":[0.47590443300000002,0.60934542749999998],"992":[0.00011654816470588232,0.00011944237500000001],"3968":[0.0004918460000000001,0.00050040999999999996],"6400":[0.00079124000000000002,0.00079432199999999987],"1344":[0.00017401799999999999,0.00017842000000000004],"126976":[0.018177901999999999,0.018842307999999999],"2883584":[1.235134518,1.243453309],"753664":[0.18349829500000003,0.24274251099999999],"16384":[0.0021184265000000002,0.0021634975000000001],"131072":[0.019382198,0.019980601000000001],"458752":[0.083042910000000011,0.15279566250000001],"172032":[0.027929074000000005,0.028264828999999998],"12288":[0.001802325,0.0020387230000000001],"14680064":[7.3754205424999997,13.541510241999999],"1536":[0.00020930633333333333,0.000217486],"25600":[0.003168859,0.0033776689999999998],"1835008":[0.54859003399999995,0.61361514299999997],"10752":[0.0014379686666666665,0.0014435175],"21504":[0.0028825460000000006,0.0028944879999999997],"7602176":[3.3443763569999998,3.6312780770000002],"5632":[0.00074008799999999986,0.00080526558333333335],"10":[9.3313999999999995e-07,9.3852999999999997e-07],"3145728":[1.530786116,1.6109528945],"245760":[0.039486630000000002,0.039910262000000002],"1728":[0.00020958075000000005,0.00021761],"11":[9.1280999999999993e-07,9.6886999999999997e-07],"1114112":[0.288817881,0.37847457299999998],"12":[9.7498999999999992e-07,9.9265000000000014e-07],"7340032":[3.2650945149999999,3.4639181030000001],"7168":[0.00085012800000000002,0.00098685960000000007],"13":[1.02182e-06,1.03842e-06],"6029312":[3.199397458,3.2135951710000001],"14":[1.0762e-06,1.1086699999999999e-06],"3200":[0.00039229499999999997,0.00040458054166666669],"20":[2.0542199999999999e-06,2.1996500000000002e-06],"204800":[0.031383804000000001,0.034427963000000006],"15":[1.0171200000000001e-06,1.14737e-06],"13312":[0.0016319659999999997,0.001757134],"4980736":[2.1869186210000002,2.2533657284999999],"118784":[0.016948426999999999,0.018051431499999999],"51200":[0.0065375990000000007,0.0069898910000000007],"16":[1.6492399999999999e-06,1.76365e-06],"21":[2.1555899999999999e-06,2.2594100000000002e-06],"917504":[0.228011768,0.28532822800000002],"22":[2.3650400000000001e-06,2.4688400000000002e-06],"4864":[0.00058729099999999998,0.00067541200000000002],"17":[1.7159500000000001e-06,1.7192e-06],"14848":[0.0018742023999999996,0.0019226970000000003],"23":[2.3531800000000001e-06,2.7770900000000002e-06],"786432":[0.20020067799999999,0.2956624015],"18":[1.9632199999999998e-06,2.0363400000000001e-06],"1638400":[0.53024722899999999,0.55052130649999997],"7864320":[3.6985037470000002,3.7088455914999998],"24":[2.42937e-06,2.68584e-06],"14155776":[7.0047360850000002,7.5265750295],"19":[1.94167e-06,2.23682e-06],"30":[2.59162e-06,2.6451699999999997e-06],"25":[2.3213749999999999e-06,2.4532999999999999e-06],"31":[2.6848500000000002e-06,2.7148700000000001e-06],"1280":[0.000149359,0.00016789184745762711],"26":[2.3506099999999998e-06,2.3954599999999999e-06],"3932160":[1.58076785,1.642715395],"2432":[0.00030968499999999992,0.00031637499999999998],"32":[3.19304e-06,3.2546900000000001e-06],"27":[2.3893800000000002e-06,2.4207200000000001e-06],"409600":[0.073140322000000008,0.094418238000000015]}},{"title":"OrderedSet symmetricDifference with Array (75% overlap)","results":{"28":[1.32714e-06,1.3870800000000001e-06],"34":[1.9936899999999998e-06,2.0309899999999998e-06],"29":[1.3227200000000002e-06,1.38753e-06],"40":[2.5439700000000001e-06,2.80674e-06],"17408":[0.001330934,0.0013677609999999999],"1472":[0.00012008899999999998,0.00012299766666666666],"112":[7.09332e-06,7.3766399999999992e-06],"1376256":[0.29140343600000002,0.36943151200000002],"5242880":[1.6947655230000001,1.705712085],"36":[2.3320599999999998e-06,2.4982599999999996e-06],"42":[2.6019599999999996e-06,2.7104599999999999e-06],"11534336":[4.1906310920000003,4.4433842444999998],"114688":[0.010093222000000002,0.010313688],"144":[9.295333333333334e-06,9.9225731707317064e-06],"38":[2.3772700000000001e-06,2.6794800000000002e-06],"240":[1.5304000000000001e-05,1.6604670000000002e-05],"9216":[0.00072016107692307704,0.00079948299999999981],"44":[2.7413300000000003e-06,3.0550899999999999e-06],"1664":[0.0001237242857142857,0.00012481660256410254],"196608":[0.022975684,0.024149766],"155648":[0.015183781,0.015890883000000001],"2816":[0.000237805,0.00024024999999999996],"50":[2.7792700000000002e-06,2.8074399999999998e-06],"2359296":[0.55501079050000002,0.56844724199999996],"46":[2.8943800000000001e-06,2.89688e-06],"176":[1.2775299999999999e-05,1.3540480000000001e-05],"52":[2.94906e-06,3.1033500000000001e-06],"272":[1.800919e-05,1.8363999999999999e-05],"116":[7.2811800000000001e-06,7.5203300000000002e-06],"47104":[0.0043356890000000002,0.0044749760000000003],"6912":[0.000482778,0.00052862150000000012],"1856":[0.00012856900000000001,0.00013374563513513508],"48":[3.05112e-06,3.4301600000000004e-06],"2097152":[0.46684817299999998,0.48270293600000003],"54":[2.9009e-06,3.0311000000000001e-06],"2031616":[0.435426855,0.468609202],"43008":[0.0035990919999999995,0.00373209],"60":[3.2775300000000004e-06,3.3970700000000001e-06],"30720":[0.0023771700000000005,0.0024564657500000002],"56":[3.0279799999999999e-06,3.1402200000000001e-06],"62":[3.3538600000000004e-06,3.84612e-06],"58":[3.1123300000000002e-06,3.2215100000000003e-06],"3014656":[0.9510823705,0.95382967600000002],"64":[3.8101500000000003e-06,4.1563333333333337e-06],"8388608":[2.5799342059999999,2.721471153],"29696":[0.0022261469999999999,0.0023443350000000003],"216":[1.4614739999999999e-05,1.4737489999999998e-05],"106496":[0.0093159909999999992,0.0095377870000000007],"72":[4.6801500000000004e-06,5.0131999999999997e-06],"442368":[0.050181222999999997,0.068776959999999984],"147456":[0.014445051,0.0146052245],"4456448":[1.2249137585000001,1.3151033590000001],"63488":[0.0050905729999999993,0.005297141],"38912":[0.0031634579999999996,0.0032287699999999997],"68":[4.3070000000000004e-06,4.7496000000000002e-06],"188416":[0.020778460000000002,0.022451089],"248":[1.671231e-05,1.697651e-05],"80":[5.4174300000000004e-06,5.4666000000000003e-06],"2560":[0.00020817982978723406,0.00022169999999999994],"34816":[0.0027812840000000006,0.0028761899999999998],"3712":[0.00027840906060606067,0.00028277608823529412],"3538944":[0.84220047200000003,0.93401970950000002],"76":[4.7808699999999998e-06,4.8453699999999998e-06],"4194304":[1.1056921565,1.1084385465],"851968":[0.14092638800000001,0.17175566449999999],"4096":[0.00030662000000000002,0.00032153783333333332],"59392":[0.0047979319999999995,0.0049292860000000006],"84":[5.5185499999999999e-06,5.59872e-06],"3276800":[0.74770444000000003,0.88968909649999994],"55296":[0.0043890069999999986,0.0046081409999999988],"688128":[0.097281786999999981,0.136542629],"8192":[0.00061582312499999998,0.000662775],"10240":[0.0008098230000000001,0.00085729909999999988],"15872":[0.0011900530000000002,0.00132361],"92":[6.0639999999999999e-06,6.4522499999999999e-06],"26624":[0.00205979275,0.0020996230000000001],"1792":[0.00012954791666666666,0.00013556499999999998],"11776":[0.0010490879999999999,0.001055519],"2944":[0.00025023899999999992,0.00026351],"88":[6.0586400000000002e-06,6.45414e-06],"22528":[0.001896086,0.0020306790000000001],"1245184":[0.2291239565,0.3248032985],"15728640":[5.089667135,5.4483857259999997],"96":[7.05484e-06,8.1414222222222225e-06],"1984":[0.00014238442028985507,0.000144933],"139264":[0.012981137,0.013377311000000003],"475136":[0.050541941999999992,0.062197806000000001],"13631488":[4.6624208285000002,4.8605699209999997],"416":[2.6514500000000002e-05,2.791075e-05],"928":[6.5503739999999997e-05,6.5900000000000003e-05],"512":[3.5206999999999997e-05,3.596323188405797e-05],"18432":[0.0014518070000000003,0.0015079310000000001],"16777216":[6.0378949420000003],"9728":[0.00075208100000000004,0.00076194399999999997],"1769472":[0.35148863699999999,0.39763548900000001],"1703936":[0.37320784200000001,0.43540416599999998],"2048":[0.00014961280303030306,0.000154864],"14336":[0.001053116,0.001084177],"448":[3.0135620000000001e-05,3.2144959999999995e-05],"5505024":[1.7137158860000001,1.729534599],"544":[3.8519420000000004e-05,3.9569500000000001e-05],"221184":[0.020952053999999998,0.022376274999999998],"90112":[0.0084370410000000028,0.0091109880000000004],"640":[4.6861583333333335e-05,4.8415370000000002e-05],"12800":[0.00098762000000000003,0.0010917960000000001],"262144":[0.025532875,0.0278473305],"589824":[0.077841867500000009,0.094539945],"884736":[0.12503824499999999,0.17748276700000001],"6144":[0.00057123841176470584,0.00057492399999999999],"1088":[7.918795833333333e-05,7.9418409090909088e-05],"576":[3.9608340000000001e-05,4.2042449999999999e-05],"160":[1.0984420000000001e-05,1.2760709999999999e-05],"672":[5.2250599999999997e-05,5.3415650000000001e-05],"8912896":[2.8141040285000001,2.8394352359999999],"100":[6.4647900000000005e-06,6.73275e-06],"507904":[0.058277144999999995,0.097355025999999997],"3840":[0.0002959901875,0.00030008299999999998],"192":[1.4799846153846153e-05,1.5307499999999999e-05],"376832":[0.046073534999999992,0.0475909235],"98304":[0.010284299,0.010792799],"5376":[0.00044648295454545445,0.00044983600000000001],"94208":[0.0092409620000000001,0.0099165374999999993],"81920":[0.00725035,0.007475977],"3407872":[0.771318909,0.83010432550000002],"104":[6.6197300000000007e-06,6.9154899999999994e-06],"122880":[0.011022087,0.011690643000000001],"200":[1.2601e-05,1.352343e-05],"163840":[0.016166916,0.016493098999999997],"4063232":[1.025046165,1.099681991],"5767168":[1.9269244809999999,1.9993921585000001],"12582912":[5.2400279879999996,14.191663191],"1600":[0.00011500109756097563,0.00011784114285714289],"136":[8.7936e-06,9.6878700000000005e-06],"232":[1.5273714285714283e-05,1.561754e-05],"7077888":[2.1352218679999999,2.3543979830000001],"86016":[0.0077859009999999996,0.0080074379999999987],"31744":[0.0024592009999999998,0.002632672],"168":[1.1637830000000001e-05,1.221574e-05],"622592":[0.077090785000000023,0.108308905],"108":[6.9197499999999993e-06,7.4892500000000003e-06],"327680":[0.037738381999999994,0.040937487000000002],"2176":[0.00016404599999999999,0.00017468400000000001],"3328":[0.00023343999999999999,0.00025278399999999998],"1":[1.5026e-07,1.5262999999999998e-07],"2":[1.6300999999999998e-07,1.7139999999999999e-07],"3":[1.8091999999999998e-07,2.0307999999999999e-07],"4":[4.1452000000000004e-07,4.1820999999999998e-07],"7424":[0.00055608000000000003,0.00057511800000000001],"5":[4.2590999999999998e-07,4.4172000000000001e-07],"23552":[0.0021488779999999999,0.0021924187499999998],"6":[4.4419000000000001e-07,4.4835000000000001e-07],"61440":[0.0048600190000000001,0.0054762450000000002],"491520":[0.052641042999999985,0.066170694000000002],"77824":[0.0065184610000000006,0.0069108540000000027],"7":[4.6986e-07,5.2025000000000002e-07],"8":[4.9615999999999996e-07,5.0114e-07],"208":[1.3451999999999999e-05,1.4239030000000001e-05],"9":[5.2603000000000001e-07,5.4229000000000002e-07],"73728":[0.0064251299999999994,0.007163804000000001],"304":[2.1013e-05,2.1573239999999998e-05],"400":[2.7209112903225804e-05,2.7273000000000001e-05],"1310720":[0.25068919550000002,0.33355993],"336":[2.2978000000000003e-05,2.6174369999999999e-05],"3670016":[0.89274473799999998,0.97554727399999996],"6656":[0.00049540399999999996,0.00051004531578947366],"15360":[0.0011707,0.0011719096249999997],"432":[2.8949560975609755e-05,3.0501520000000001e-05],"950272":[0.15715051099999999,0.20446378649999999],"655360":[0.088010711999999991,0.105429949],"69632":[0.0057769250000000005,0.0061292570000000008],"11264":[0.0009266560000000002,0.00096231509999999997],"2752512":[0.82082615199999998,0.82806735100000006],"8126464":[2.5140171059999998,2.6280541130000001],"27648":[0.0020738420000000002,0.002285865666666667],"368":[2.7267000000000002e-05,2.913581e-05],"65536":[0.0054056680000000006,0.0061027809999999998],"16252928":[5.6331984034999998,6.1242108569999996],"464":[3.0758120000000001e-05,3.0985999999999998e-05],"1015808":[0.15778108900000001,0.247302982],"3072":[0.00028159700000000002,0.00028809499999999993],"110592":[0.0097193560000000019,0.0103635585],"237568":[0.022976102999999998,0.023087840999999994],"278528":[0.027607208999999994,0.032689520999999999],"496":[3.3588542168674699e-05,3.5420999999999998e-05],"13107200":[4.1929555860000001,4.643088734],"9961472":[3.1365826325000001,3.269038793],"5888":[0.00051199784210526306,0.00052541799999999994],"11010048":[3.671124346,4.0840371035],"1920":[0.00013284499999999998,0.000139896],"2490368":[0.65055238100000001,0.66749861499999996],"19456":[0.0015633013333333334,0.0015854350000000001],"57344":[0.0044918680000000013,0.0048964340000000007],"1179648":[0.20296145199999999,0.27983438999999999],"4718592":[1.3702134610000001,1.4225289400000001],"360448":[0.044513102500000006,0.044879272999999997],"1572864":[0.421133176,0.450804757],"53248":[0.0041345379999999992,0.0045029644999999997],"3456":[0.00025410300000000004,0.00026817200000000001],"40960":[0.0033335979999999992,0.003435638],"4608":[0.00035716200000000001,0.00036089096296296295],"13824":[0.0010456272222222223,0.0010720238888888883],"819200":[0.12696603100000003,0.152851869],"983040":[0.16099555199999999,0.190229761],"8704":[0.00066233057142857127,0.00079022800000000013],"120":[7.5602400000000003e-06,8.2249499999999999e-06],"1024":[7.0056589999999995e-05,7.5162791666666666e-05],"49152":[0.0044978249999999996,0.0047581824999999994],"524288":[0.062400447000000005,0.079337801999999985],"45056":[0.0038465800000000009,0.0039978815000000006],"229376":[0.022514298500000002,0.026433402000000002],"2688":[0.00020923799999999999,0.000225536],"152":[1.0234829999999999e-05,1.0834600000000001e-05],"5120":[0.00039714299999999998,0.00040143000000000004],"1507328":[0.33913135799999999,0.4729314905],"1216":[8.8020666666666655e-05,9.2774000000000003e-05],"1966080":[0.44211105399999995,0.45708132200000001],"1900544":[0.44399690749999998,0.44552576399999999],"184":[1.3776820000000001e-05,1.5778609999999999e-05],"7936":[0.00061357625000000009,0.00061956900000000004],"3801088":[1.041769299,1.0708141695],"6815744":[1.8966222230000001,2.2755661959999998],"124":[7.8620700000000001e-06,8.7207600000000002e-06],"102400":[0.0086660569999999978,0.0097277265000000022],"311296":[0.034898993000000024,0.036902044000000002],"1408":[0.00011633600000000002,0.000117244],"393216":[0.053673973999999999,0.05436388000000001],"4352":[0.0003253480000000001,0.00034617899999999995],"6553600":[1.932962614,2.1157793050000002],"20480":[0.0016932399999999999,0.0016942910000000001],"608":[4.4159999999999997e-05,4.5297153846153844e-05],"2228224":[0.51551543050000004,0.55370066200000001],"36864":[0.0028456590000000004,0.003013698],"704":[5.4173911392405065e-05,5.4715270000000006e-05],"720896":[0.1087587,0.15294743299999999],"800":[5.3510000000000001e-05,5.5789119999999999e-05],"2621440":[0.63779977499999996,0.72915622899999999],"425984":[0.046766786000000005,0.058657512000000009],"32768":[0.002521803,0.0026378040000000001],"12058624":[4.8427592580000001,4.8467130244999996],"128":[8.1775499999999993e-06,8.6247900000000001e-06],"180224":[0.020034788999999997,0.020291548999999999],"224":[1.4637050000000001e-05,1.5092420000000001e-05],"736":[5.7170999999999999e-05,5.7730979999999999e-05],"320":[2.2364000000000001e-05,2.2843970000000001e-05],"557056":[0.06413803999999998,0.096616605500000008],"832":[5.5831810810810814e-05,5.7164999999999999e-05],"9437184":[2.9846318384999999,3.0254712480000001],"3584":[0.00027428100000000008,0.00029980499999999999],"6291456":[2.4935488179999998,2.5656646090000002],"256":[1.6404000000000001e-05,1.7405999999999999e-05],"15204352":[5.0929296080000004,5.7803369169999996],"28672":[0.0021932125000000005,0.0023759319999999999],"768":[6.2230000000000006e-05,6.5632979999999999e-05],"212992":[0.021290980499999994,0.022178402],"864":[6.0331000000000002e-05,6.7428999999999994e-05],"352":[2.587129e-05,2.790707e-05],"253952":[0.0259375965,0.0262613945],"960":[6.5688500000000006e-05,6.9606500000000005e-05],"24576":[0.0022538189999999998,0.0022908970000000001],"7680":[0.000582417,0.0006508388000000001],"294912":[0.032364057999999987,0.033824900999999991],"1048576":[0.19400980700000001,0.241702942],"10485760":[3.4657087519999998,3.571975465],"344064":[0.040759649000000009,0.044107519000000012],"288":[1.9767099999999999e-05,2.0442820000000002e-05],"1152":[8.2185e-05,8.39663125e-05],"384":[2.8997780000000001e-05,3.2747179999999996e-05],"2304":[0.00018708200000000001,0.00019615376595744682],"896":[6.2278760000000001e-05,6.4443999999999995e-05],"480":[3.427946e-05,3.683846e-05],"1441792":[0.35152296500000002,0.44083399600000001],"992":[6.9350530000000002e-05,7.0870000000000004e-05],"3968":[0.00029972606250000002,0.000311229],"6400":[0.0004782775499999999,0.00049081699999999984],"1344":[0.000101567,0.000103834],"126976":[0.012061848,0.012122547000000001],"2883584":[0.81097774900000008,0.85058135599999996],"753664":[0.109705873,0.15114566500000001],"16384":[0.001256804,0.0013699188571428573],"131072":[0.012464469000000001,0.012822742],"458752":[0.049528036999999997,0.11945828999999999],"172032":[0.0178918195,0.018224952999999999],"12288":[0.0010992999999999999,0.0012758415714285713],"14680064":[4.7420591270000001,7.4885241010000003],"1536":[0.00013236900000000002,0.00014574117647058824],"25600":[0.001950043,0.0020578332500000001],"1835008":[0.39326733300000005,0.40255042299999999],"10752":[0.00087024600000000008,0.00087979099999999978],"21504":[0.0018004975999999992,0.001807442],"7602176":[2.3387592225000002,2.4421588934999998],"5632":[0.00047308800000000009,0.00049041099999999984],"10":[5.2369e-07,5.4285000000000002e-07],"3145728":[1.0251351209999999,1.111386414],"245760":[0.025412083000000002,0.0272802355],"1728":[0.00012508300000000001,0.00013084781690140843],"11":[5.5463000000000004e-07,5.7209000000000004e-07],"1114112":[0.18415509699999999,0.27068253799999997],"12":[8.1582999999999997e-07,8.2472999999999989e-07],"7340032":[2.1393905740000001,2.1877424765],"7168":[0.00053198850000000012,0.00055486500000000009],"13":[7.8103999999999996e-07,8.6661000000000006e-07],"6029312":[2.1180104110000002,2.1356241630000001],"14":[8.1737999999999998e-07,9.0403999999999999e-07],"3200":[0.0002400925609756099,0.000245679],"20":[1.15359e-06,1.23097e-06],"204800":[0.019188503000000003,0.020321367999999999],"15":[8.1335000000000001e-07,9.0191000000000006e-07],"13312":[0.00096349700000000001,0.0010364270000000001],"4980736":[1.3486791359999999,1.514476921],"118784":[0.010981131999999998,0.011848533999999999],"51200":[0.003917734,0.004449433],"16":[9.1981000000000003e-07,9.6276999999999993e-07],"21":[1.15612e-06,1.2748999999999999e-06],"917504":[0.14891228100000001,0.18530007600000001],"22":[1.24854e-06,1.2882400000000001e-06],"4864":[0.00038344172000000009,0.00044304299999999984],"17":[9.1446000000000005e-07,9.344e-07],"14848":[0.0010786399999999999,0.001174328125],"23":[1.3002000000000001e-06,1.5212599999999999e-06],"786432":[0.12979515900000005,0.193997636],"18":[9.6685999999999996e-07,1.0174200000000001e-06],"1638400":[0.33046171099999999,0.36873182599999998],"7864320":[2.2485946640000001,2.500756301],"24":[1.2760700000000002e-06,1.5190200000000001e-06],"14155776":[4.5829586520000003,4.8541704179999998],"19":[9.854299999999999e-07,1.04972e-06],"30":[1.36146e-06,1.38489e-06],"25":[1.26915e-06,1.2827400000000001e-06],"31":[1.35231e-06,1.4026899999999999e-06],"1280":[9.3132000000000002e-05,0.00010203754651162793],"26":[1.2364200000000001e-06,1.2578000000000001e-06],"3932160":[1.0513039725,1.0777153605000001],"2432":[0.00018348400000000003,0.00018897599999999996],"32":[1.8746600000000002e-06,1.9319999999999999e-06],"27":[1.18868e-06,1.2992900000000001e-06],"409600":[0.042968075999999952,0.055943455500000031]}},{"title":"OrderedSet symmetricDifference with Array (100% overlap)","results":{"28":[6.9650999999999998e-07,7.0335999999999997e-07],"34":[8.0187999999999998e-07,8.4775000000000006e-07],"29":[6.9889999999999999e-07,7.0715000000000008e-07],"40":[9.8282999999999991e-07,1.0660100000000001e-06],"17408":[0.00051510399999999974,0.00054602899999999996],"1472":[4.4496826086956519e-05,4.8058119999999994e-05],"112":[2.4333099999999999e-06,2.5352399999999997e-06],"1376256":[0.15661434599999999,0.26201457950000001],"5242880":[1.0565698795,1.0597005239999999],"36":[8.4189000000000008e-07,9.1000000000000008e-07],"42":[1.02109e-06,1.1641099999999999e-06],"11534336":[2.5517385369999999,2.5954591255000001],"114688":[0.0043951119999999996,0.004513533499999999],"144":[3.3492499999999997e-06,3.4853599999999999e-06],"38":[8.9240999999999998e-07,1.00367e-06],"240":[5.17497e-06,5.3093400000000004e-06],"9216":[0.00027802258823529414,0.00030911300000000002],"44":[1.0634100000000001e-06,1.1247399999999998e-06],"1664":[3.9649374999999998e-05,4.0463000000000002e-05],"196608":[0.011188429,0.011954797],"155648":[0.0077129549999999988,0.0078686439999999993],"2816":[8.4802999999999994e-05,9.3103790000000007e-05],"50":[1.0890000000000001e-06,1.1634599999999999e-06],"2359296":[0.33136308799999997,0.371099285],"46":[1.13482e-06,1.1675799999999999e-06],"176":[4.5405199999999997e-06,4.7265600000000004e-06],"52":[1.1749200000000001e-06,1.2069399999999999e-06],"272":[6.0331052631578946e-06,6.8814099999999997e-06],"116":[2.5240800000000004e-06,2.5834600000000001e-06],"47104":[0.0017066410000000001,0.0018518949999999999],"6912":[0.00018264400000000004,0.000191406],"1856":[4.4227270000000007e-05,4.7251150000000002e-05],"48":[1.17082e-06,1.4690499999999999e-06],"2097152":[0.28157621799999999,0.41258083000000001],"54":[1.20505e-06,1.2292100000000001e-06],"2031616":[0.26834314300000001,0.350303645],"43008":[0.0014469789999999999,0.001526948],"60":[1.30997e-06,1.3585600000000002e-06],"30720":[0.00088783999999999998,0.00089311949999999946],"56":[1.2855399999999999e-06,1.3033200000000002e-06],"62":[1.43209e-06,1.5087000000000001e-06],"58":[1.2676000000000002e-06,1.3189199999999999e-06],"3014656":[0.61645017950000003,0.66490813500000001],"64":[1.4038333333333334e-06,1.4965200000000001e-06],"8388608":[1.3603775554999999,1.4958758624999999],"29696":[0.00083353300000000002,0.00084908218181818185],"216":[4.6213999999999995e-06,4.6957499999999999e-06],"106496":[0.0039268590000000004,0.0042228604999999999],"72":[1.6417800000000002e-06,2.2473999999999999e-06],"442368":[0.025261478,0.028586523999999995],"147456":[0.0070595620000000001,0.0071668209999999986],"4456448":[0.83680684100000002,0.86041367300000005],"63488":[0.0019526579999999999,0.0020966420000000001],"38912":[0.0012697127142857144,0.001278944],"68":[1.5435300000000001e-06,1.6844999999999999e-06],"188416":[0.010039621,0.011471492],"248":[5.4279000000000002e-06,5.7931400000000007e-06],"80":[1.88603e-06,1.9283599999999998e-06],"2560":[7.7380259999999999e-05,8.3435000000000003e-05],"34816":[0.0010312030000000001,0.001062281],"3712":[9.2967999999999995e-05,9.6006084337349403e-05],"3538944":[0.51212031199999997,0.67115620549999999],"76":[1.8197800000000002e-06,1.9968300000000001e-06],"4194304":[0.65406759400000003,0.82277620250000005],"851968":[0.0623444425,0.13402517549999998],"4096":[0.000108281,0.00011722348717948717],"59392":[0.0019367910000000002,0.0019537892499999999],"84":[1.9946666666666667e-06,2.0729999999999999e-06],"3276800":[0.45598539100000002,0.48767252000000005],"55296":[0.001627989,0.0017103470000000003],"688128":[0.0520889405,0.081528926000000015],"8192":[0.00023507972500000002,0.000242885],"10240":[0.00030787700000000002,0.00032654599999999999],"15872":[0.00044818700000000006,0.00051035800000000004],"92":[2.4200599999999997e-06,2.4741200000000003e-06],"26624":[0.00074261999999999993,0.000748443],"1792":[4.356518e-05,4.4632969999999996e-05],"11776":[0.00042080863636363637,0.00044869619047619038],"2944":[9.5069222222222226e-05,9.58415e-05],"88":[2.2397899999999999e-06,2.4347199999999999e-06],"22528":[0.0007856105833333332,0.00082619527272727279],"1245184":[0.14117007249999999,0.20056384899999999],"15728640":[3.1216810945,3.2367315130000001],"96":[2.7115199999999999e-06,3.2242399999999998e-06],"1984":[4.8124810000000005e-05,5.0600666666666665e-05],"139264":[0.0060316469999999994,0.0061166409999999991],"475136":[0.028081156999999995,0.031437254999999997],"13631488":[2.3836584329999999,2.7360163905000001],"416":[9.0950000000000002e-06,9.104360000000001e-06],"928":[2.1187659999999998e-05,2.3180480000000001e-05],"512":[1.2473999999999999e-05,1.261451e-05],"18432":[0.00058376199999999993,0.00059322400000000038],"16777216":[3.7546983229999999],"9728":[0.000282267,0.00030775903125000004],"1769472":[0.21378085699999999,0.31094398699999998],"1703936":[0.21677737050000001,0.36437461999999998],"2048":[5.0792579999999997e-05,5.2897609999999994e-05],"14336":[0.00038884400000000001,0.00040662404347826088],"448":[1.0078000000000001e-05,1.040055e-05],"5505024":[1.0698227819999999,1.1016466140000001],"544":[1.311385e-05,1.359196e-05],"221184":[0.0096581230000000011,0.0097440689999999993],"90112":[0.0037030970000000011,0.0040450099999999999],"640":[1.6346333333333333e-05,1.72905e-05],"12800":[0.00031524999999999999,0.00038576800000000009],"262144":[0.012244974,0.01405313],"589824":[0.043207449000000009,0.045703079000000014],"884736":[0.075219985000000003,0.11772273950000001],"6144":[0.00022341950000000005,0.00023317799999999996],"1088":[2.761618e-05,2.7648e-05],"576":[1.378857e-05,1.535488e-05],"160":[3.7610699999999999e-06,4.5027799999999998e-06],"672":[1.8253189999999999e-05,1.860284e-05],"8912896":[1.7520166909999999,1.7859276079999999],"100":[2.0955999999999999e-06,2.1490300000000001e-06],"507904":[0.030192564000000005,0.055589914000000004],"3840":[9.7874999999999994e-05,0.00010603900000000001],"192":[5.1914900000000003e-06,5.8875400000000002e-06],"376832":[0.0231885865,0.036493722499999999],"98304":[0.0045320020000000003,0.0047572725000000014],"5376":[0.000174623,0.00018034352],"94208":[0.0039726764999999994,0.0043437345000000007],"81920":[0.0030955163333333336,0.0032518409999999997],"3407872":[0.59425985950000004,0.62489946100000004],"104":[2.24791e-06,2.2569699999999998e-06],"122880":[0.0048739739999999997,0.0052455290000000005],"200":[4.2763099999999999e-06,4.59558e-06],"163840":[0.0078450799999999488,0.0080715759999999987],"4063232":[0.60893011749999992,0.65555336099999995],"5767168":[1.168118553,1.1780772669999999],"12582912":[3.0016109100000001,8.6844116615000004],"1600":[3.8331580000000003e-05,3.8660270000000004e-05],"136":[3.1865700000000001e-06,3.3835899999999998e-06],"232":[5.0130000000000001e-06,5.2774399999999999e-06],"7077888":[1.0771202310000001,1.370961944],"86016":[0.0033246830000000006,0.0035510819999999997],"31744":[0.00093215069999999999,0.00094068900000000009],"168":[3.94577e-06,4.3290800000000001e-06],"622592":[0.037362487499999986,0.060422073999999992],"108":[2.3075400000000002e-06,2.6199600000000001e-06],"327680":[0.020500181000000003,0.020544899500000002],"2176":[6.1708869999999992e-05,6.2761365384615391e-05],"3328":[8.1370947368421045e-05,8.5714e-05],"1":[1.5117e-07,1.5260999999999999e-07],"2":[1.6316000000000001e-07,1.6453e-07],"3":[1.8111000000000001e-07,2.0322999999999997e-07],"4":[1.9845999999999999e-07,1.9905e-07],"7424":[0.000199903,0.00020638900000000002],"5":[2.1684999999999999e-07,2.2623999999999999e-07],"23552":[0.00087129581818181832,0.00088390099999999998],"6":[2.3456999999999999e-07,2.3929000000000002e-07],"61440":[0.0018553466000000001,0.0020383710000000002],"491520":[0.025077486999999999,0.0497360175],"77824":[0.0027652529999999996,0.0028686243333333325],"7":[2.5717999999999998e-07,2.8932e-07],"8":[2.7691000000000001e-07,2.9009999999999998e-07],"208":[4.51994e-06,4.60735e-06],"9":[2.9096000000000001e-07,2.9229000000000003e-07],"73728":[0.0026075910000000002,0.0026848336666666674],"304":[7.0901250000000002e-06,7.6528099999999997e-06],"400":[8.8942599999999994e-06,9.0847900000000008e-06],"1310720":[0.14226511,0.236822064],"336":[8.6213333333333333e-06,9.7680000000000003e-06],"3670016":[0.53311740399999996,0.57848487599999998],"6656":[0.00017145099999999995,0.00017403700000000001],"15360":[0.00043417950000000009,0.00043575690909090914],"432":[9.4105799999999996e-06,1.026186e-05],"950272":[0.081376839499999992,0.12811485950000001],"655360":[0.047772693500000019,0.082360583000000001],"69632":[0.0023139840000000003,0.0024702329999999996],"11264":[0.00037633300000000007,0.00037803900000000004],"2752512":[0.46785352099999999,0.51847143699999998],"8126464":[1.492163278,1.590672214],"27648":[0.00073772699999999998,0.000777267],"368":[9.9641500000000001e-06,1.0141636363636363e-05],"65536":[0.0021661970000000003,0.0023134642500000002],"16252928":[3.1844018489999999,3.3330849730000001],"464":[1.068206e-05,1.1177839999999999e-05],"1015808":[0.105024325,0.1631103545],"3072":[0.0001034899230769231,0.0001099775],"110592":[0.0041759319999999994,0.0043499680000000001],"237568":[0.010690658,0.010855017999999998],"278528":[0.013499761000000004,0.015248333999999999],"496":[1.1834930000000001e-05,1.1966150000000001e-05],"13107200":[2.4723810670000002,2.5614632235000001],"9961472":[1.8921919469999999,2.0564079030000002],"5888":[0.00019695833333333333,0.00020198299999999993],"11010048":[2.4268020644999999,2.4850129344999998],"1920":[4.6347545454545452e-05,4.8199999999999999e-05],"2490368":[0.37380868749999996,0.49225949050000001],"19456":[0.00062146946666666661,0.00064014200000000001],"57344":[0.0017128912000000003,0.001818227],"1179648":[0.140073682,0.187723168],"4718592":[0.87485560399999995,0.91501417350000003],"360448":[0.02335537,0.023855309999999998],"1572864":[0.25230534900000001,0.29016940800000002],"53248":[0.0014919186666666664,0.0016263479999999997],"3456":[9.0902616279069773e-05,9.7883852631578958e-05],"40960":[0.0013520750000000001,0.001416746],"4608":[0.000126057,0.00013277699999999999],"13824":[0.00037683139130434792,0.00038500400000000004],"819200":[0.059316219000000003,0.103853074],"983040":[0.090235094000000002,0.15687503250000001],"8704":[0.000240769,0.00029292775757575756],"120":[2.7388400000000002e-06,2.7794e-06],"1024":[2.484563e-05,2.6251e-05],"49152":[0.0019725417999999998,0.0020000417499999998],"524288":[0.0327948375,0.042211181],"45056":[0.0016061273999999996,0.001629007],"229376":[0.010277428,0.0125950035],"2688":[7.7470639999999993e-05,8.4544129999999991e-05],"152":[3.54778e-06,3.9162599999999998e-06],"5120":[0.000158596,0.00016094000000000004],"1507328":[0.22873481899999998,0.30613506099999999],"1216":[3.1745319999999997e-05,3.2759999999999998e-05],"1966080":[0.31227288650000001,0.31894429800000001],"1900544":[0.240928531,0.33107621799999998],"184":[4.6505300000000002e-06,4.9471700000000003e-06],"7936":[0.00021280999999999999,0.00022738313953488365],"3801088":[0.57716256499999996,0.77020796550000004],"6815744":[1.2596642069999999,1.3159189150000001],"124":[2.8504099999999997e-06,2.8593400000000001e-06],"102400":[0.0035726910000000002,0.0044051920000000005],"311296":[0.016314417000000029,0.020195110500000009],"1408":[4.138e-05,4.369509e-05],"393216":[0.028067497,0.028712610500000003],"4352":[0.000125974,0.00013503194520547945],"6553600":[1.1406000700000001,1.2284993239999999],"20480":[0.00066882907142857152,0.00069822000000000026],"608":[1.5235611111111111e-05,1.5800009999999999e-05],"2228224":[0.34253328750000001,0.38740059300000002],"36864":[0.0011305701249999999,0.0011783049999999999],"704":[1.9122779999999998e-05,1.9276253012048192e-05],"720896":[0.056728285499999996,0.091182577999999945],"800":[1.7902220000000001e-05,1.853735e-05],"2621440":[0.403884097,0.57473928299999999],"425984":[0.023984631999999999,0.024406887999999998],"32768":[0.00095913030000000041,0.001030462],"12058624":[2.7346551419999998,2.9265267979999998],"128":[2.9562300000000002e-06,3.0188699999999996e-06],"180224":[0.0101251065,0.0102431295],"224":[4.8845899999999999e-06,4.8874200000000005e-06],"736":[2.003393e-05,2.1587320000000001e-05],"320":[7.8347400000000008e-06,8.1851599999999997e-06],"557056":[0.030380931999999999,0.049864074500000001],"832":[1.8553111111111113e-05,1.8908760000000002e-05],"9437184":[1.7545791230000001,1.9601444969999999],"3584":[9.4035499999999998e-05,9.6004250000000002e-05],"6291456":[1.4237467515,1.4862906119999999],"256":[5.7652500000000004e-06,6.2372899999999997e-06],"15204352":[2.9050571979999997,3.1605518300000002],"28672":[0.00079553583333333321,0.00082758199999999999],"768":[2.2664339999999999e-05,2.4000549999999998e-05],"212992":[0.010563484,0.0107090195],"864":[1.953643e-05,2.1303276595744683e-05],"352":[8.9017899999999994e-06,9.6717199999999989e-06],"253952":[0.012319217,0.013603684],"960":[2.2748279999999999e-05,2.361147e-05],"24576":[0.00093152900000000006,0.00096541999999999982],"7680":[0.00020700299999999996,0.00022368900000000006],"294912":[0.015465627000000001,0.017203034999999995],"1048576":[0.11572471199999999,0.15360310200000005],"10485760":[2.1413446464999999,2.4299385820000001],"344064":[0.021359656999999997,0.021856431000000003],"288":[6.6465700000000005e-06,6.9075400000000006e-06],"1152":[2.8773999999999999e-05,2.9275999999999999e-05],"384":[1.058975e-05,1.140468e-05],"2304":[6.6526980000000007e-05,7.0611570000000005e-05],"896":[2.0729839999999999e-05,2.195654761904762e-05],"480":[1.104199e-05,1.1879049999999999e-05],"1441792":[0.20828973649999999,0.26644851800000002],"992":[2.3736000000000001e-05,2.428691e-05],"3968":[0.00010642597727272727,0.00011083360000000002],"6400":[0.00015765000000000001,0.0001598715],"1344":[3.7476269999999997e-05,3.8322540000000001e-05],"126976":[0.005489728000000001,0.0056014920000000004],"2883584":[0.53346714949999996,0.65703655449999998],"753664":[0.062360012000000006,0.074674627999999993],"16384":[0.00048530300000000003,0.00048558299999999993],"131072":[0.005482387,0.0057717019999999992],"458752":[0.022203477499999996,0.036559339000000003],"172032":[0.0087028850000000005,0.0090917180000000004],"12288":[0.00044088199999999992,0.000479758],"14680064":[2.911514194,4.6138941129999997],"1536":[4.8624833333333336e-05,4.8739150000000006e-05],"25600":[0.00066614799999999998,0.00067127100000000019],"1835008":[0.28142914299999999,0.299572387],"10752":[0.00033881599999999998,0.00035340399999999998],"21504":[0.00068447399999999991,0.00071143400000000015],"7602176":[1.2775878549999999,1.4686255484999999],"5632":[0.00018248400000000001,0.00019095566666666667],"10":[3.1764000000000003e-07,3.2104999999999998e-07],"3145728":[0.65670520249999997,0.67334503499999998],"245760":[0.011434001000000001,0.01295982],"1728":[4.0469039999999998e-05,4.2320409999999996e-05],"11":[3.2488999999999999e-07,3.2972000000000002e-07],"1114112":[0.116962609,0.188158416],"12":[3.5129999999999998e-07,3.5525999999999997e-07],"7340032":[1.3009066665,1.392683208],"7168":[0.000188467,0.00020393599999999997],"13":[3.8710000000000002e-07,3.9532000000000002e-07],"6029312":[1.2505441849999999,1.3292730749999999],"14":[4.0037000000000003e-07,4.2175000000000003e-07],"3200":[7.6965999999999995e-05,8.2807829999999999e-05],"20":[5.0602000000000003e-07,5.8617999999999997e-07],"204800":[0.008787424000000002,0.0095597119999999997],"15":[4.0241000000000001e-07,4.0843999999999997e-07],"13312":[0.00034713300000000001,0.00038604300000000003],"4980736":[0.87178016650000001,1.0648918650000001],"118784":[0.004929241,0.0052664599999999989],"51200":[0.0014580959999999999,0.0015206310000000004],"16":[4.4533000000000003e-07,4.5429999999999999e-07],"21":[5.3023e-07,5.6356000000000005e-07],"917504":[0.091084993999999961,0.13813099500000001],"22":[5.9682999999999993e-07,6.2594000000000006e-07],"4864":[0.000147756,0.00016935600000000001],"17":[4.5885000000000001e-07,4.7960999999999999e-07],"14848":[0.00042357539130434785,0.00043619271428571425],"23":[6.1032000000000003e-07,6.8323000000000006e-07],"786432":[0.066157915999999997,0.097008290000000025],"18":[4.8755999999999995e-07,5.5580000000000004e-07],"1638400":[0.19432092950000002,0.26705268449999997],"7864320":[1.3938877599999999,1.497567788],"24":[6.8680999999999999e-07,6.9801999999999995e-07],"14155776":[2.3732305419999999,2.8319645315000002],"19":[4.7454999999999997e-07,5.6174e-07],"30":[7.2198000000000001e-07,7.4692999999999998e-07],"25":[5.9658999999999997e-07,6.0655000000000004e-07],"31":[7.1460000000000001e-07,7.6374999999999999e-07],"1280":[3.5435319999999997e-05,3.5934669999999998e-05],"26":[6.3488999999999999e-07,6.5827999999999999e-07],"3932160":[0.67453209400000003,0.74319561199999995],"2432":[6.8015999999999994e-05,7.2570999999999993e-05],"32":[7.4069e-07,7.4522e-07],"27":[6.3806999999999989e-07,6.4422000000000003e-07],"409600":[0.020157541000000001,0.0227354975]}},{"title":"OrderedSet subtracting Array (0% overlap)","results":{"28":[6.3324000000000008e-07,6.6560000000000003e-07],"34":[8.4603000000000001e-07,9.1429999999999997e-07],"29":[6.7840000000000004e-07,7.2768999999999997e-07],"40":[1.07133e-06,1.47443e-06],"17408":[0.00062129799999999973,0.00069782542857142857],"1472":[7.0432999999999995e-05,7.3992592592592597e-05],"112":[2.3567799999999999e-06,2.35686e-06],"1376256":[0.202166915,0.31792500950000002],"5242880":[1.189660105,1.220161378],"36":[9.4884999999999992e-07,1.0637399999999999e-06],"42":[1.14684e-06,1.3054900000000002e-06],"11534336":[3.5595763040000001,3.6654520870000002],"114688":[0.0043502509999999994,0.004511738999999999],"144":[3.4713499999999998e-06,4.4013333333333331e-06],"38":[9.7509999999999999e-07,1.12296e-06],"240":[5.0287400000000009e-06,5.0645000000000004e-06],"9216":[0.000332558,0.00034976899999999999],"44":[1.3793999999999999e-06,1.5702372881355932e-06],"1664":[4.0365999999999999e-05,4.3786541666666663e-05],"196608":[0.018600291999999997,0.019017992000000001],"155648":[0.0087899220000000021,0.0088148739999999986],"2816":[0.0001333776666666667,0.00014220907352941177],"50":[1.0367200000000001e-06,1.0368499999999999e-06],"2359296":[0.38793547099999998,0.3910003165],"46":[1.39962e-06,1.5776599999999999e-06],"176":[5.908e-06,7.34408e-06],"52":[1.0597100000000001e-06,1.1197000000000001e-06],"272":[6.3090099999999999e-06,6.973692307692308e-06],"116":[2.4546499999999999e-06,2.4697700000000001e-06],"47104":[0.0026901249999999998,0.0027348249999999998],"6912":[0.00020880242222222215,0.00021892733333333335],"1856":[5.2268899999999997e-05,5.2877499999999996e-05],"48":[1.5762700000000001e-06,2.41042e-06],"2097152":[0.29346335699999998,0.32587465999999998],"54":[1.08316e-06,1.2100299999999998e-06],"2031616":[0.26114303750000001,0.27020086099999996],"43008":[0.0020265777499999999,0.0020873829999999999],"60":[1.37847e-06,1.50853e-06],"30720":[0.00099319399999999976,0.0010051630000000001],"56":[1.1634200000000001e-06,1.2487100000000001e-06],"62":[1.4052300000000001e-06,1.5447499999999999e-06],"58":[1.2339e-06,1.33751e-06],"3014656":[0.89053834799999998,0.89169833799999998],"64":[1.3994461538461539e-06,1.62304e-06],"8388608":[1.527199398,1.537623145],"29696":[0.00095528419999999501,0.00095974500000000002],"216":[4.3962200000000001e-06,4.7961599999999997e-06],"106496":[0.0038496774999999999,0.0039455470000000006],"72":[1.8091900000000001e-06,2.5924200000000001e-06],"442368":[0.0212822945,0.024985959500000005],"147456":[0.007703882999999999,0.0077344369999999994],"4456448":[0.78573418500000003,0.82609617449999995],"63488":[0.0022837530000000003,0.0023757742500000001],"38912":[0.001638214,0.0016572878],"68":[1.5146699999999999e-06,1.7935800000000002e-06],"188416":[0.015790571,0.01604692900000004],"248":[5.3431599999999997e-06,6.0197400000000004e-06],"80":[2.3979599999999999e-06,2.6097400000000004e-06],"2560":[0.0001129989431818182,0.00011307900000000001],"34816":[0.001263595,0.0012767],"3712":[0.00011604133333333333,0.00011624433333333334],"3538944":[0.51676460849999994,0.5282803895],"76":[1.82304e-06,2.1143499999999999e-06],"4194304":[0.698894609,0.72941360600000005],"851968":[0.065329856500000033,0.098041244499999999],"4096":[0.00013841040845070425,0.00014154346874999997],"59392":[0.0020443272499999997,0.0022275560000000003],"84":[3.0587099999999999e-06,3.1857100000000001e-06],"3276800":[0.45429995699999998,0.48072209449999997],"55296":[0.0017665489999999999,0.0018581349999999997],"688128":[0.059452755499999989,0.093219639999999993],"8192":[0.00027006600000000001,0.00030302948387096761],"10240":[0.000439169,0.00046930495238095224],"15872":[0.00053730199999999981,0.00063640399999999992],"92":[3.55169e-06,4.2238699999999999e-06],"26624":[0.00081088100000000028,0.00084418981818181838],"1792":[4.8320757575757577e-05,5.4902889999999998e-05],"11776":[0.00066170699999999999,0.00073464200000000009],"2944":[0.00014243400000000001,0.0001688495],"88":[2.9724299999999997e-06,3.2176900000000003e-06],"22528":[0.001177932,0.0012990021428571428],"1245184":[0.151903126,0.21455484400000002],"15728640":[2.8708473369999998,2.889981074],"96":[4.2140400000000001e-06,7.7652352941176479e-06],"1984":[5.8634000000000001e-05,5.9822019999999999e-05],"139264":[0.0065512869999999985,0.0066072810000000013],"475136":[0.0239946485,0.031491842999999999],"13631488":[2.2363016789999999,2.2741290850000002],"416":[8.5824999999999996e-06,9.16261e-06],"928":[2.3976199999999999e-05,2.46195e-05],"512":[1.2985690000000001e-05,1.3088319999999999e-05],"18432":[0.00074001600000000013,0.00075599500000000008],"16777216":[3.2701131614999999],"9728":[0.000390269,0.00042101560869565216],"1769472":[0.201601903,0.22745169500000001],"1703936":[0.19375278500000001,0.255161849],"2048":[6.5442590000000002e-05,6.7849690000000001e-05],"14336":[0.00042067900000000003,0.00044578900000000009],"448":[1.0039e-05,1.0541599999999999e-05],"5505024":[1.4263931059999999,1.4429753409999999],"544":[1.4544e-05,1.524213e-05],"221184":[0.0094320910000000001,0.010265521],"90112":[0.0051522870000000002,0.0056035159999999994],"640":[2.1579270833333334e-05,2.3386333333333333e-05],"12800":[0.00037174500000000004,0.00042172300000000004],"262144":[0.012917065,0.0134191265],"589824":[0.039286873999999999,0.053812209999999992],"884736":[0.060388611500000008,0.102230058],"6144":[0.00040234800000000013,0.00042511426086956541],"1088":[3.3002e-05,3.3157599999999996e-05],"576":[1.6719269999999999e-05,1.802203e-05],"160":[5.4890099999999993e-06,6.26386e-06],"672":[2.62e-05,2.6866549999999998e-05],"8912896":[1.7383504754999999,1.7476435000000001],"100":[1.9882400000000001e-06,2.07934e-06],"507904":[0.027424433999999998,0.04412365],"3840":[0.00012089100000000001,0.000130195],"192":[1.0668330000000001e-05,1.0712329999999999e-05],"376832":[0.036116901999999992,0.036164782999999999],"98304":[0.0076420819999999988,0.0080255480000000004],"5376":[0.00024939099999999996,0.00025512400000000002],"94208":[0.0062148359999999996,0.006590584],"81920":[0.0039501140000000002,0.0041767209999999987],"3407872":[0.47757481699999998,0.50785490600000005],"104":[2.0498499999999999e-06,2.2435384615384612e-06],"122880":[0.0050662680000000005,0.0051550730000000005],"200":[4.03278e-06,4.0920599999999999e-06],"163840":[0.0099504940000000007,0.0100072875],"4063232":[0.65513249849999999,0.66710383800000006],"5767168":[1.6746892390000001,1.7177865455000001],"12582912":[5.2969282780000002,12.1745176205],"1600":[3.8901840000000004e-05,4.0879849999999998e-05],"136":[3.1448499999999996e-06,3.47593e-06],"232":[4.9378571428571427e-06,5.3465999999999998e-06],"7077888":[1.1241123225,1.1991811975],"86016":[0.0045559444999999999,0.0048318700000000003],"31744":[0.0010644210000000001,0.0010956060000000003],"168":[5.1986100000000004e-06,5.4780799999999996e-06],"622592":[0.043702449999999997,0.064491631999999965],"108":[2.1598799999999997e-06,2.6972200000000003e-06],"327680":[0.022127662000000003,0.024356770999999999],"2176":[7.5856703703703707e-05,7.586610344827586e-05],"3328":[9.4293999999999989e-05,9.6997999999999995e-05],"1":[1.2916e-07,1.349e-07],"2":[1.4854000000000001e-07,1.5755999999999999e-07],"3":[1.6381000000000001e-07,1.7549000000000002e-07],"4":[1.7447999999999998e-07,1.7645000000000002e-07],"7424":[0.000237366,0.00024433800000000003],"5":[1.9004e-07,1.959e-07],"23552":[0.0013743339999999998,0.001420869],"6":[2.1094999999999999e-07,2.1143000000000001e-07],"61440":[0.0021745670000000001,0.0022087260000000003],"491520":[0.025395500999999997,0.035870412999999983],"77824":[0.0035491645000000002,0.0035518240000000007],"7":[2.3056000000000002e-07,2.3108e-07],"8":[2.3892000000000002e-07,2.5049000000000001e-07],"208":[4.2109300000000002e-06,4.2600599999999998e-06],"9":[2.5287000000000001e-07,2.7452e-07],"73728":[0.0032252186666666669,0.0033798740000000006],"304":[8.8602799999999991e-06,9.3455000000000006e-06],"400":[7.9744999999999996e-06,8.5073500000000008e-06],"1310720":[0.177529573,0.25473964049999998],"336":[1.090565e-05,1.4287999999999999e-05],"3670016":[0.53941611200000006,0.55952823100000004],"6656":[0.00018474600000000001,0.00019523199999999999],"15360":[0.00048021100000000003,0.000515403],"432":[9.18932e-06,9.4194199999999997e-06],"950272":[0.075563130999999992,0.10920661449999999],"655360":[0.048691366,0.083771307500000017],"69632":[0.0027558420000000005,0.0029266099999999996],"11264":[0.00054872000000000026,0.00059334100000000016],"2752512":[0.60985753700000001,0.65075936999999995],"8126464":[1.47573774,1.4864755325000001],"27648":[0.00083537581818181827,0.00093392329999999991],"368":[1.3902250000000001e-05,1.6670579999999998e-05],"65536":[0.0025123699999999999,0.002846978],"16252928":[3.0659922430000002,3.1226879505],"464":[1.0812560000000001e-05,1.1352000000000001e-05],"1015808":[0.086029101499999996,0.133407677],"3072":[0.00018532999999999999,0.00019503514000000002],"110592":[0.0040617270000000002,0.0049244090000000003],"237568":[0.010885316000000001,0.010886033999999998],"278528":[0.0145680385,0.0156884885],"496":[1.220806e-05,1.2663999999999999e-05],"13107200":[2.0954976969999999,2.1136846780000003],"9961472":[2.2464610345000002,2.2618460219999998],"5888":[0.00032650413333333339,0.00032974783333333335],"11010048":[2.946242384,3.0348186450000001],"1920":[5.2032666666666667e-05,5.5783394736842108e-05],"2490368":[0.4429619595,0.51514130400000002],"19456":[0.00077858700000000007,0.00088458000000000005],"57344":[0.0019279653999999999,0.0019927542500000001],"1179648":[0.129369446,0.19954812199999999],"4718592":[0.92726807199999994,0.95858865800000004],"360448":[0.029162743999999997,0.031243373000000001],"1572864":[0.36868907699999998,0.451168976],"53248":[0.0016595852000000008,0.0017291069999999999],"3456":[0.00010066799999999998,0.00010140329999999999],"40960":[0.0017440450000000003,0.001776524],"4608":[0.00017495600000000001,0.00017534182978723407],"13824":[0.00042264800000000002,0.00044359999999999999],"819200":[0.055673540000000001,0.08396954199999998],"983040":[0.085116854499999978,0.13433933200000001],"8704":[0.00031736046666666672,0.00035793200000000004],"120":[2.4739599999999997e-06,2.84172e-06],"1024":[2.8598139999999999e-05,3.0662749999999997e-05],"49152":[0.0030852793333333334,0.0033340090000000002],"524288":[0.0296493725,0.039073446000000005],"45056":[0.0023589690000000003,0.0025068276666666668],"229376":[0.010211269,0.011047285],"2688":[0.00011568766666666666,0.00011807733333333331],"152":[4.0465199999999998e-06,4.0829600000000003e-06],"5120":[0.00020738499999999998,0.00022757499999999999],"1507328":[0.32714105799999998,0.43345950099999997],"1216":[4.2270749999999998e-05,4.3779124999999997e-05],"1966080":[0.24598261900000001,0.25615184999999996],"1900544":[0.23015654699999999,0.24238264300000001],"184":[7.78431e-06,8.3414299999999999e-06],"7936":[0.000262811,0.00027002800000000001],"3801088":[0.58176429299999999,0.58347378999999999],"6815744":[1.096763001,1.1227369505],"124":[2.88034e-06,2.9032199999999997e-06],"102400":[0.0035490830000000006,0.0037532645000000002],"311296":[0.018982378000000001,0.019840566],"1408":[6.0693912280701756e-05,7.2964159999999999e-05],"393216":[0.044048838999999992,0.044575627999999999],"4352":[0.00015678574999999998,0.00015695756666666666],"6553600":[1.025872549,1.0487525120000001],"20480":[0.00089347500000000002,0.00093046022222222199],"608":[1.8664750000000001e-05,2.0487690000000003e-05],"2228224":[0.34213433800000004,0.34562521600000001],"36864":[0.0014444243333333333,0.0014807188333333336],"704":[2.676265e-05,2.7679800000000002e-05],"720896":[0.069836688999999966,0.10918225500000001],"800":[1.78358e-05,1.8713189999999998e-05],"2621440":[0.51447136199999999,0.56072872949999997],"425984":[0.019287849000000003,0.021148882500000001],"32768":[0.0011504706249999999,0.001176842],"12058624":[4.3438739130000004,4.3745904910000002],"128":[2.7685999999999996e-06,3.1064399999999999e-06],"180224":[0.013477155499999999,0.013555681999999999],"224":[4.7617100000000004e-06,4.8275238095238096e-06],"736":[3.2155079999999998e-05,3.8166949152542376e-05],"320":[1.0010340000000001e-05,1.0516779999999999e-05],"557056":[0.033738129500000005,0.050717933999999999],"832":[1.8913e-05,1.973186170212766e-05],"9437184":[1.9806828845,2.0682760390000001],"3584":[0.00010788256097560979,0.00010991722727272726],"6291456":[2.486594218,2.545519182],"256":[5.6648095238095241e-06,6.48096e-06],"15204352":[2.6751062019999998,2.788884135],"28672":[0.00087920699999999991,0.00091565499999999992],"768":[4.05919e-05,4.3129851851851854e-05],"212992":[0.0089869700000000004,0.0092556369999999989],"864":[2.0403392857142858e-05,2.2296989999999999e-05],"352":[1.4211333333333332e-05,1.4548250000000001e-05],"253952":[0.012684215,0.012791022000000003],"960":[2.6388910000000001e-05,2.6437259999999999e-05],"24576":[0.00168143,0.001748435],"7680":[0.00025187281578947378,0.00026942200000000006],"294912":[0.017358078999999992,0.017406046000000001],"1048576":[0.102168751,0.149353759],"10485760":[2.555843394,2.5602580480000001],"344064":[0.025723725000000003,0.026690631000000003],"288":[7.4097699999999994e-06,7.6297894736842116e-06],"1152":[3.4551000000000002e-05,4.0513889999999998e-05],"384":[2.1192369999999998e-05,2.1470280000000002e-05],"2304":[8.3875000000000006e-05,8.5297600000000523e-05],"896":[2.2376999999999999e-05,2.2399609999999999e-05],"480":[1.168727e-05,1.2175409999999999e-05],"1441792":[0.25526843099999996,0.36270523700000001],"992":[2.7693580000000001e-05,2.8723849999999774e-05],"3968":[0.00012603700000000001,0.000136644],"6400":[0.000175093,0.00018785471153846155],"1344":[5.6770429999999996e-05,5.9309930000000002e-05],"126976":[0.0054626099999999997,0.0056246290000000008],"2883584":[0.71203172650000002,0.75674784399999995],"753664":[0.085979385000000019,0.13204805999999999],"16384":[0.00053774699999999999,0.00060415928571428573],"131072":[0.0057540120000000011,0.0058519220000000007],"458752":[0.022378782999999996,0.030035246500000001],"172032":[0.011349501,0.011394531499999997],"12288":[0.00081636600000000012,0.00090279619999999972],"14680064":[2.5258558199999999,2.8830932945000001],"1536":[8.4264142857142868e-05,8.7651000000000005e-05],"25600":[0.00071040399999999987,0.00075987100000000018],"1835008":[0.21150057,0.22075359],"10752":[0.00051031277777777791,0.000515479],"21504":[0.0010165980000000001,0.001058518],"7602176":[1.269720392,1.301759533],"5632":[0.00027860800000000001,0.00029192500000000006],"10":[3.0632000000000001e-07,3.1318e-07],"3145728":[1.0747311939999999,1.1257099260000001],"245760":[0.0117184835,0.012171721999999999],"1728":[4.5172000000000001e-05,4.8364896907216499e-05],"11":[2.9047999999999999e-07,3.3318000000000002e-07],"1114112":[0.114278241,0.17817497700000001],"12":[3.4530999999999996e-07,3.6176000000000003e-07],"7340032":[1.1978131670000001,1.217848153],"7168":[0.00022037322499999997,0.00024296864102564102],"13":[3.6050999999999999e-07,3.9255999999999996e-07],"6029312":[2.0070485725,2.019376361],"14":[4.0315000000000001e-07,4.1707000000000001e-07],"3200":[8.9203545454545456e-05,9.168228571428572e-05],"20":[5.1823000000000006e-07,5.2626e-07],"204800":[0.0083005329999999971,0.0086761300000000006],"15":[3.8779999999999997e-07,4.5126000000000003e-07],"13312":[0.00040176587499999997,0.00041029899999999998],"4980736":[1.043272859,1.086222528],"118784":[0.0048352230000000005,0.0049761579999999996],"51200":[0.0015379910000000003,0.001548443],"16":[4.1726000000000002e-07,4.3173999999999997e-07],"21":[6.0035e-07,6.5473000000000004e-07],"917504":[0.068101452000000035,0.11081127950000003],"22":[6.2549000000000002e-07,7.8644000000000005e-07],"4864":[0.00019546200000000003,0.00021830650000000001],"17":[4.6013999999999999e-07,4.9770999999999997e-07],"14848":[0.00048654200000000007,0.00051957399999999986],"23":[7.5132000000000003e-07,1.0330299999999999e-06],"786432":[0.10463424650000003,0.15783913999999999],"18":[5.1155e-07,5.9396000000000001e-07],"1638400":[0.17709445400000001,0.20133216649999999],"7864320":[1.3410304710000001,1.3681349840000001],"24":[8.4468999999999998e-07,9.2055000000000002e-07],"14155776":[2.3916867609999999,2.4494957729999998],"19":[5.0185999999999997e-07,7.6216000000000004e-07],"30":[6.2304000000000005e-07,7.0994999999999997e-07],"25":[5.4472000000000008e-07,5.7333000000000007e-07],"31":[7.2249999999999996e-07,7.527800000000001e-07],"1280":[4.5260599999999998e-05,5.1012810000000001e-05],"26":[6.4191999999999997e-07,6.4562999999999999e-07],"3932160":[0.62374620400000003,0.63118559200000002],"2432":[9.0890571428571418e-05,0.000104534],"32":[7.2870999999999997e-07,8.0826000000000001e-07],"27":[5.9090999999999999e-07,6.2814999999999997e-07],"409600":[0.018628987499999999,0.018857566499999999]}},{"title":"OrderedSet subtracting Array (25% overlap)","results":{"28":[1.5738300000000001e-06,1.6636400000000001e-06],"34":[1.8879899999999999e-06,1.9884400000000001e-06],"29":[1.6096400000000001e-06,1.6877099999999998e-06],"40":[2.3192800000000003e-06,2.7043000000000001e-06],"17408":[0.00107833,0.001164533625],"1472":[0.00010780100000000001,0.000116184],"112":[5.7080000000000002e-06,5.7198800000000004e-06],"1376256":[0.2714193265,0.37757089900000002],"5242880":[1.6451084364999999,1.6851460775],"36":[1.9874499999999999e-06,2.14177e-06],"42":[2.3459400000000001e-06,2.7144600000000002e-06],"11534336":[4.4006297070000002,4.4871853005000002],"114688":[0.0082699980000000006,0.0085720759999999997],"144":[7.3019999999999997e-06,8.5481599999999995e-06],"38":[2.0890300000000002e-06,2.3428000000000003e-06],"240":[1.2173666666666667e-05,1.3118e-05],"9216":[0.00056966499999999991,0.00062145399999999991],"44":[2.4380499999999999e-06,2.8452903225806453e-06],"1664":[9.4411000000000001e-05,9.9430649999999993e-05],"196608":[0.023294654000000001,0.024130775],"155648":[0.013581082499999999,0.013664611],"2816":[0.000194088,0.00021970100000000002],"50":[2.4562500000000004e-06,2.4887100000000003e-06],"2359296":[0.50858577100000002,0.54381825700000008],"46":[2.6725799999999999e-06,2.7664399999999997e-06],"176":[1.1399929999999999e-05,1.2319049999999999e-05],"52":[2.7329600000000001e-06,2.7498099999999998e-06],"272":[1.400528e-05,1.5046510000000001e-05],"116":[5.9515599999999996e-06,6.1271999999999995e-06],"47104":[0.0039135860000000001,0.003933312999999999],"6912":[0.000420309,0.00042450000000000007],"1856":[0.00010836299999999999,0.00011937212048192775],"48":[2.8976799999999997e-06,3.5295799999999999e-06],"2097152":[0.39156315800000002,0.46719085399999999],"54":[2.6975099999999999e-06,2.8818399999999999e-06],"2031616":[0.37245929100000003,0.37704947899999997],"43008":[0.0032090670000000003,0.0034919844999999989],"60":[3.2238600000000003e-06,3.3096800000000001e-06],"30720":[0.00207441425,0.0021452504999999993],"56":[2.7466799999999998e-06,3.0037800000000002e-06],"62":[3.4002300000000001e-06,3.4007900000000003e-06],"58":[2.9908799999999999e-06,3.1636499999999998e-06],"3014656":[1.0023989550000001,1.0656291900000001],"64":[3.3444699999999999e-06,3.6434000000000001e-06],"8388608":[2.2253460939999998,2.2730845964999999],"29696":[0.0019499385,0.0020065270000000001],"216":[1.1233320000000001e-05,1.1340090000000001e-05],"106496":[0.007468087,0.0078095209999999981],"72":[3.8573999999999997e-06,4.1789099999999998e-06],"442368":[0.038737438000000006,0.051475932000000002],"147456":[0.012652180000000002,0.0127547775],"4456448":[1.1196962205000001,1.1541834870000001],"63488":[0.0045348429999999993,0.0045584129999999999],"38912":[0.0026747859999999993,0.0028946360000000012],"68":[3.38665e-06,3.7913999999999998e-06],"188416":[0.020775116000000038,0.020999676499999995],"248":[1.3115970000000001e-05,1.4187889999999999e-05],"80":[4.6998700000000001e-06,4.7786299999999999e-06],"2560":[0.00017596449999999995,0.00019066599999999998],"34816":[0.0022563679999999995,0.0022871102500000001],"3712":[0.00023404,0.000238278],"3538944":[0.75442857799999996,0.79735591350000001],"76":[3.9744700000000003e-06,4.2930100000000001e-06],"4194304":[0.99076249949999995,1.0202668895],"851968":[0.099392159999999993,0.148370697],"4096":[0.00028385700000000004,0.00029117300000000004],"59392":[0.0041782250000000007,0.0043781149999999993],"84":[5.1894099999999997e-06,5.21403e-06],"3276800":[0.69830679299999998,0.73926978450000003],"55296":[0.003563933,0.0037238330000000002],"688128":[0.087524846999999989,0.12400556000000001],"8192":[0.00057291323529411783,0.00059049106250000003],"10240":[0.00072574230769230775,0.00078931933333333307],"15872":[0.001060299,0.0012176509999999999],"92":[6.0047500000000004e-06,6.7802352941176472e-06],"26624":[0.0017105620000000005,0.0017156349999999994],"1792":[0.00010875660674157303,0.0001105],"11776":[0.00094496599999999999,0.001041251],"2944":[0.00022056199999999997,0.000229108],"88":[5.5597600000000003e-06,5.9273599999999999e-06],"22528":[0.0017957703999999998,0.001871904],"1245184":[0.20773935700000001,0.26498770599999999],"15728640":[4.3920405559999995,4.5091628884999997],"96":[6.3347100000000004e-06,7.4973600000000002e-06],"1984":[0.000126208,0.000126501],"139264":[0.01072859,0.011779644000000001],"475136":[0.04334864400000004,0.053517768],"13631488":[3.5877467799999998,3.7360663905],"416":[2.0370999999999999e-05,2.1641059999999999e-05],"928":[5.6028250000000004e-05,5.6727400000000002e-05],"512":[3.1218009999999999e-05,3.2362739999999997e-05],"18432":[0.0012386839999999999,0.001279767],"16777216":[5.0248661009999998],"9728":[0.000617652,0.00067958999999999988],"1769472":[0.313199383,0.35295408900000003],"1703936":[0.2763602235,0.37006391800000005],"2048":[0.00013234400000000001,0.00013806700000000002],"14336":[0.00090996389999999994,0.000916734],"448":[2.4315270000000002e-05,2.5687619999999999e-05],"5505024":[1.832230445,1.8447324469999999],"544":[2.9847000000000001e-05,2.9961990000000001e-05],"221184":[0.017417454999999998,0.018364849999999995],"90112":[0.007855939000000001,0.0092291100000000004],"640":[4.0491000000000002e-05,4.1811999999999999e-05],"12800":[0.0007363430000000002,0.00086692900000000001],"262144":[0.022950907,0.023547458],"589824":[0.063730561000000019,0.076976894999999976],"884736":[0.11295454299999996,0.155115745],"6144":[0.00058102893749999998,0.00058845350000000002],"1088":[5.9948999999999998e-05,6.5008789999999999e-05],"576":[3.2148200000000005e-05,3.3724079999999996e-05],"160":[1.0096032258064517e-05,1.0716740000000001e-05],"672":[4.5043399999999996e-05,4.7514539999999997e-05],"8912896":[2.5896457165000002,2.5965800429999999],"100":[4.9999400000000004e-06,5.1518600000000003e-06],"507904":[0.050503794000000005,0.072335549999999998],"3840":[0.00025665942105263146,0.00028058280000000003],"192":[1.3366999999999999e-05,1.624348e-05],"376832":[0.045879750999999996,0.054622021],"98304":[0.010139664,0.0106810905],"5376":[0.00037341699999999997,0.00039144000000000001],"94208":[0.008819726,0.0090356819999999997],"81920":[0.0064921800000000002,0.006585418],"3407872":[0.71901329300000005,0.71966407750000005],"104":[5.0114799999999997e-06,5.2776799999999998e-06],"122880":[0.0095327820000000001,0.009829427],"200":[9.9289999999999993e-06,1.004883e-05],"163840":[0.015084561999999999,0.015446949],"4063232":[0.89530725349999996,0.946663052],"5767168":[2.0590461539999998,2.114004526],"12582912":[6.0670971979999999,13.404350235500001],"1600":[8.8327030000000012e-05,9.8424040404040402e-05],"136":[6.9154700000000006e-06,7.4996399999999996e-06],"232":[1.192889e-05,1.209543e-05],"7077888":[1.7741867870000001,1.951533835],"86016":[0.0069149219999999996,0.0074243690000000001],"31744":[0.002125797,0.0023388040000000003],"168":[1.0010421052631579e-05,1.1518999999999999e-05],"622592":[0.066645078999999996,0.101433623],"108":[5.4415700000000001e-06,5.8237100000000005e-06],"327680":[0.0327466795,0.03526700499999999],"2176":[0.00013673099999999999,0.00013811700000000002],"3328":[0.00020004802040816326,0.00020569299999999998],"1":[7.7209999999999988e-08,7.7370000000000011e-08],"2":[2.1622000000000001e-07,2.2379999999999998e-07],"3":[2.3453999999999998e-07,2.3674000000000001e-07],"4":[2.5667999999999999e-07,2.7544999999999999e-07],"7424":[0.00047963740000000007,0.00049359400000000009],"5":[2.7858e-07,3.0984000000000003e-07],"23552":[0.0020032927499999999,0.0020674535000000001],"6":[3.0071e-07,3.0272e-07],"61440":[0.004250607,0.004476491],"491520":[0.046573582000000002,0.060311557999999987],"77824":[0.0057970190000000013,0.0062380039999999993],"7":[3.2991999999999998e-07,3.3182000000000002e-07],"8":[3.5714999999999999e-07,3.5933000000000003e-07],"208":[1.0373e-05,1.0636260000000001e-05],"9":[3.5585e-07,3.9717e-07],"73728":[0.0053467359999999995,0.005719015],"304":[1.679581e-05,2.0524301369863013e-05],"400":[1.99809e-05,2.0433690000000003e-05],"1310720":[0.23887396799999999,0.33809177400000001],"336":[1.9273500000000001e-05,2.310979e-05],"3670016":[0.77985577950000007,0.82919461900000002],"6656":[0.00040174599999999997,0.00040863413636363626],"15360":[0.0010377912222222219,0.0010682409999999999],"432":[2.2213499999999997e-05,2.234243e-05],"950272":[0.11799631099999996,0.18134950000000005],"655360":[0.073370042999999982,0.11465165099999999],"69632":[0.0047937209999999991,0.0051043410000000001],"11264":[0.00087695199999999996,0.00088537400000000008],"2752512":[0.79290736949999996,0.84339794899999998],"8126464":[2.1724081910000002,2.248047557],"27648":[0.0017063780000000001,0.0018581436],"368":[2.5038420000000002e-05,2.5593069444444444e-05],"65536":[0.0048458959999999997,0.005209104],"16252928":[4.6148177690000001,4.8747065279999999],"464":[2.5707859999999999e-05,2.809009e-05],"1015808":[0.136605061,0.18933956749999997],"3072":[0.00026768524999999996,0.00027175163888888893],"110592":[0.0078730569999999993,0.0094647359999999996],"237568":[0.020678100499999998,0.020755434],"278528":[0.023882352000000003,0.0257486655],"496":[2.8428e-05,2.9922920000000003e-05],"13107200":[3.4421651204999999,3.5944765395],"9961472":[3.0383101259999998,3.12383845],"5888":[0.00047687763157894752,0.00049894300000000006],"11010048":[3.8508081590000001,3.8816606980000001],"1920":[0.000112345,0.00012431899999999999],"2490368":[0.57830628449999999,0.66612629749999996],"19456":[0.001308708,0.0013779128571428574],"57344":[0.0038112759999999997,0.0039506669999999997],"1179648":[0.17966030599999999,0.26088594799999998],"4718592":[1.278383593,1.3324321215000001],"360448":[0.041343446000000006,0.042979332000000009],"1572864":[0.40994207500000002,0.50250939849999998],"53248":[0.0033206035000000003,0.0035577409999999997],"3456":[0.000205496,0.00020902],"40960":[0.002950257,0.0029554800000000003],"4608":[0.00029363800000000004,0.00029667799999999998],"13824":[0.00086260600000000014,0.00088388999999999981],"819200":[0.097164609000000013,0.13897760000000001],"983040":[0.13177388500000001,0.185564222],"8704":[0.00054094500000000003,0.00061293300000000008],"120":[6.39992e-06,6.7650100000000003e-06],"1024":[6.0460000000000001e-05,6.8484000000000004e-05],"49152":[0.0044888649999999999,0.0047974050000000002],"524288":[0.053251295999999983,0.062015152000000004],"45056":[0.0034591114999999997,0.003582675999999999],"229376":[0.018705361,0.019771644000000001],"2688":[0.00017808599999999999,0.00019129299999999999],"152":[7.9711200000000003e-06,8.0519900000000012e-06],"5120":[0.00034977599999999999,0.00036575000000000003],"1507328":[0.34296244799999998,0.46738124999999997],"1216":[7.3362645161290324e-05,7.7502214285714286e-05],"1966080":[0.33887746400000002,0.360115356],"1900544":[0.3409341555,0.35658798199999997],"184":[1.3157449999999999e-05,1.3570000000000001e-05],"7936":[0.00053932100000000016,0.00056029982352941187],"3801088":[0.80527670100000004,0.91442811300000004],"6815744":[1.7651873220000001,1.8360805545000001],"124":[6.4372699999999998e-06,7.0830700000000004e-06],"102400":[0.0069725999999999998,0.0076170350000000012],"311296":[0.029019031000000001,0.032424214],"1408":[0.00010402475,0.000107339],"393216":[0.054018530999999981,0.055347404000000003],"4352":[0.00027726700000000004,0.00027773961764705898],"6553600":[1.61675784,1.7546903760000001],"20480":[0.0014465840000000003,0.001453991],"608":[3.3961999999999998e-05,3.7260259999999997e-05],"2228224":[0.46295331699999998,0.46466909200000001],"36864":[0.0023931249999999999,0.002587046],"704":[4.4440999999999997e-05,4.7783e-05],"720896":[0.098629930000000005,0.14418502699999999],"800":[4.2812139999999999e-05,4.4446000000000001e-05],"2621440":[0.63912263899999999,0.69843845400000004],"425984":[0.036984617999999997,0.047222384999999992],"32768":[0.0023335439999999999,0.0023858260000000002],"12058624":[5.0458242735000001,5.3026085890000001],"128":[7.0914399999999998e-06,7.1545599999999998e-06],"180224":[0.019072874,0.019158768999999999],"224":[1.1527045454545455e-05,1.1825769999999999e-05],"736":[5.1679799999999999e-05,5.7138590000000001e-05],"320":[1.846577e-05,1.9523339999999999e-05],"557056":[0.054853319999999997,0.073288192000000002],"832":[4.4739999999999995e-05,4.4808999999999997e-05],"9437184":[2.8357101784999998,3.0425112905000002],"3584":[0.00022835099999999998,0.00022990525000000001],"6291456":[2.8079933609999999,2.843000623],"256":[1.3573249999999999e-05,1.586275e-05],"15204352":[4.1222156889999999,4.6481814884999997],"28672":[0.0018911539999999997,0.0019137340000000003],"768":[5.7338279999999998e-05,6.386365e-05],"212992":[0.017014880999999999,0.017683539000000005],"864":[4.6446000000000002e-05,5.0747094736842456e-05],"352":[2.3862559999999998e-05,2.4838210000000003e-05],"253952":[0.0225032405,0.0233920725],"960":[5.8553838235294117e-05,5.9098499999999997e-05],"24576":[0.0022882550000000003,0.0023233920000000005],"7680":[0.000480395,0.00054903849999999991],"294912":[0.027887132000000002,0.027995691],"1048576":[0.14341336099999999,0.20569659800000001],"10485760":[3.349064689,3.501356344],"344064":[0.037421736999999997,0.042126511000000005],"288":[1.5525499999999999e-05,1.5763140000000001e-05],"1152":[7.0536410000000005e-05,7.1012000000000004e-05],"384":[2.9202899999999998e-05,3.0568519999999998e-05],"2304":[0.0001473902089552239,0.000150846],"896":[5.2735079999999995e-05,5.3959280000000002e-05],"480":[2.7506999999999999e-05,2.8088149999999996e-05],"1441792":[0.29733860849999999,0.42959346599999998],"992":[5.9431640625000002e-05,6.4340870370370378e-05],"3968":[0.00024730800000000001,0.00027081299999999996],"6400":[0.00037762599999999994,0.00038343300000000003],"1344":[8.8603999999999994e-05,9.5723200000000005e-05],"126976":[0.010522526500000001,0.010666963],"2883584":[0.83809340199999993,0.90607522549999997],"753664":[0.11062804699999999,0.15724956100000001],"16384":[0.001111578,0.0012247598571428573],"131072":[0.010877412999999999,0.010964314999999999],"458752":[0.042459407000000005,0.054936106999999998],"172032":[0.016410378999999999,0.016447526000000004],"12288":[0.0010955920000000001,0.001190864],"14680064":[4.0127399539999997,4.4074741460000002],"1536":[0.000126969,0.00013225700000000002],"25600":[0.001544618,0.001546761],"1835008":[0.31261676500000002,0.32087300000000002],"10752":[0.00077230300000000012,0.00080517318181818167],"21504":[0.0016089189999999997,0.0016471783999999999],"7602176":[2.0113874250000001,2.0445832890000002],"5632":[0.00043477019047619039,0.00045257700000000001],"10":[3.9895999999999997e-07,4.1160000000000001e-07],"3145728":[1.2100051715,1.2375911294999999],"245760":[0.021473718499999999,0.022443461000000005],"1728":[0.000100746,0.000105171],"11":[4.1366999999999997e-07,4.5296e-07],"1114112":[0.16446775599999996,0.239608178],"12":[4.4983e-07,4.7695000000000005e-07],"7340032":[1.8062697430000001,1.9509320590000001],"7168":[0.00046903210000000001,0.00050299421052631588],"13":[5.2613000000000001e-07,5.5201000000000003e-07],"6029312":[2.3189470989999998,2.3215619869999999],"14":[5.0676000000000002e-07,5.4982000000000004e-07],"3200":[0.000191845,0.00019539944444444445],"20":[6.6507999999999997e-07,6.8064000000000004e-07],"204800":[0.015563607,0.017222735999999999],"15":[5.1755999999999998e-07,5.7581999999999998e-07],"13312":[0.00082760158333333343,0.00085280399999999987],"4980736":[1.454757375,1.488555131],"118784":[0.0090404449999999994,0.0094622539999999998],"51200":[0.003178714,0.0033078170000000002],"16":[5.6863000000000003e-07,6.2500000000000005e-07],"21":[7.1460000000000001e-07,7.8787000000000003e-07],"917504":[0.10986120200000001,0.177747871],"22":[1.30216e-06,1.4878800000000001e-06],"4864":[0.00031257599999999996,0.00036549],"17":[6.1761999999999994e-07,6.5563e-07],"14848":[0.0009607210000000001,0.001023752],"23":[1.4768100000000001e-06,1.9551799999999998e-06],"786432":[0.12944152,0.19158675],"18":[6.5692999999999999e-07,7.0175999999999995e-07],"1638400":[0.25689748899999998,0.29562733549999998],"7864320":[2.088680563,2.105386336],"24":[1.6145299999999999e-06,1.69829e-06],"14155776":[3.823755094,4.1431735090000004],"19":[6.4489999999999996e-07,8.2852000000000001e-07],"30":[1.6093499999999999e-06,1.6582000000000001e-06],"25":[1.35313e-06,1.3721900000000001e-06],"31":[1.7124100000000002e-06,1.7921500000000001e-06],"1280":[8.0254521739130436e-05,8.300138e-05],"26":[1.4841999999999999e-06,1.5124600000000001e-06],"3932160":[0.90553356500000004,0.93218045800000005],"2432":[0.00015683200000000003,0.00017224100000000001],"32":[1.8174e-06,1.8734599999999999e-06],"27":[1.4961600000000001e-06,1.5365299999999998e-06],"409600":[0.036032639000000005,0.036321467999999996]}},{"title":"OrderedSet subtracting Array (50% overlap)","results":{"28":[8.1006000000000004e-07,8.4132000000000002e-07],"34":[1.4603100000000001e-06,1.63546e-06],"29":[8.2732999999999998e-07,8.7404000000000006e-07],"40":[1.97785e-06,2.00166e-06],"17408":[0.00093278400000000009,0.0010073329999999996],"1472":[9.3280499999999996e-05,9.761064e-05],"112":[4.41983e-06,4.4677100000000003e-06],"1376256":[0.23590618250000001,0.30280870100000001],"5242880":[1.312526128,1.3292543290000001],"36":[1.6116200000000001e-06,1.7774300000000001e-06],"42":[2.07615e-06,2.1805699999999999e-06],"11534336":[3.7019205144999998,3.8604913105000001],"114688":[0.006750876999999998,0.007194799],"144":[6.1580714285714284e-06,6.7694699999999997e-06],"38":[1.8312900000000001e-06,1.84818e-06],"240":[9.706333333333334e-06,1.0259030000000002e-05],"9216":[0.00051229600000000008,0.000526758],"44":[2.1503099999999998e-06,2.4548900000000001e-06],"1664":[7.2733480000000003e-05,7.4058300000000009e-05],"196608":[0.019710237999999998,0.020820443000000001],"155648":[0.0118471145,0.011986518],"2816":[0.00017071499999999999,0.00017623399999999999],"50":[2.0762558139534881e-06,2.0842368421052632e-06],"2359296":[0.43477020900000002,0.49014681400000004],"46":[2.3289900000000002e-06,2.5092799999999997e-06],"176":[9.7783000000000009e-06,1.0252429999999999e-05],"52":[2.1476199999999997e-06,2.21534e-06],"272":[1.1694229999999999e-05,1.2707e-05],"116":[4.6952700000000002e-06,4.8609600000000003e-06],"47104":[0.0033315459999999999,0.0035618545000000003],"6912":[0.000329177,0.00033898499999999998],"1856":[8.4251050000000007e-05,8.4480000000000004e-05],"48":[2.3663199999999998e-06,2.8597300000000003e-06],"2097152":[0.35644040100000002,0.39775002549999999],"54":[2.3674500000000001e-06,2.3692699999999999e-06],"2031616":[0.35310795950000001,0.37796194700000002],"43008":[0.002657876,0.002817183],"60":[2.5475900000000001e-06,2.6584499999999999e-06],"30720":[0.001555465,0.0016390706666666664],"56":[2.39158e-06,2.4242200000000001e-06],"62":[2.6366699999999997e-06,2.75752e-06],"58":[2.5323099999999997e-06,2.6723100000000001e-06],"3014656":[0.86784690799999997,0.91377993700000004],"64":[2.6151800000000003e-06,2.7903200000000003e-06],"8388608":[1.9637937240000001,2.0753146550000001],"29696":[0.001494553,0.0015575605000000001],"216":[8.5755699999999993e-06,8.9316400000000004e-06],"106496":[0.006137374000000001,0.0065432500000000005],"72":[3.1689400000000001e-06,3.43561e-06],"442368":[0.031912784,0.049510146000000033],"147456":[0.010986619,0.011215843],"4456448":[0.92575811399999997,0.98075248000000004],"63488":[0.0034380155000000002,0.0035256759999999997],"38912":[0.0022459177499999992,0.002385739],"68":[2.84829e-06,3.1742400000000003e-06],"188416":[0.017525693999999998,0.017804110000000001],"248":[1.0365310000000001e-05,1.175316e-05],"80":[3.76273e-06,3.9692200000000006e-06],"2560":[0.00014265419999999999,0.00015726299999999999],"34816":[0.0018490989999999994,0.0019031616000000002],"3712":[0.00016726200000000003,0.00017936100000000001],"3538944":[0.64519570449999997,0.75588198299999998],"76":[3.4047500000000003e-06,3.4149999999999999e-06],"4194304":[0.8975283745,0.91112843649999997],"851968":[0.08471743499999998,0.132519953],"4096":[0.00019899799999999998,0.00021654948888888886],"59392":[0.0031839510000000008,0.0033469770000000001],"84":[4.3644300000000005e-06,4.6776100000000006e-06],"3276800":[0.65378562849999999,0.73281146850000001],"55296":[0.002854054,0.0030091893333333329],"688128":[0.075635828000000016,0.1082188355],"8192":[0.00043478599999999994,0.00045211710000000002],"10240":[0.00062147000000000016,0.00062592139999999991],"15872":[0.00084984799999999994,0.00088071099999999995],"92":[4.6860700000000004e-06,5.5580833333333335e-06],"26624":[0.001304571,0.0013236179999999999],"1792":[8.0523380952380957e-05,8.3985142857142853e-05],"11776":[0.00081441800000000013,0.00086471599999999997],"2944":[0.000192857,0.000199562],"88":[4.5155000000000002e-06,4.6743333333333329e-06],"22528":[0.0014993271666666663,0.001538801],"1245184":[0.20043345000000001,0.238093577],"15728640":[3.9742825074999999,4.2066558145000004],"96":[5.29076e-06,6.8699899999999996e-06],"1984":[8.7690500000000003e-05,9.3535571428571431e-05],"139264":[0.009255366000000001,0.0097218909999999999],"475136":[0.035101313999999995,0.062029807000000006],"13631488":[3.2765729540000001,3.4280729160000001],"416":[1.6586699999999998e-05,1.6908979999999999e-05],"928":[3.9088534883720929e-05,4.2122037037037033e-05],"512":[2.2493999999999998e-05,2.2876699999999997e-05],"18432":[0.0010640768888888882,0.0010777649999999998],"16777216":[4.2994118029999999],"9728":[0.00054664699999999993,0.00057230494117647068],"1769472":[0.28133417900000002,0.32460156299999998],"1703936":[0.25529527699999999,0.31642156900000001],"2048":[9.6804000000000004e-05,0.00010385099999999999],"14336":[0.00069550361538461554,0.00070268999999999996],"448":[1.8571249999999999e-05,2.0434189999999998e-05],"5505024":[1.522902899,1.5471396239999999],"544":[2.4665781609195404e-05,2.5783809999999999e-05],"221184":[0.014326661000000001,0.01560745],"90112":[0.0065722290000000015,0.0073462349999999996],"640":[3.3250240000000005e-05,3.6021059999999997e-05],"12800":[0.00058719200000000005,0.00067268200000000018],"262144":[0.018753059999999995,0.019809019000000001],"589824":[0.052184336500000005,0.088169737500000012],"884736":[0.092245548000000024,0.162635262],"6144":[0.00046184999999999992,0.00047665959999999998],"1088":[4.9250499999999999e-05,5.3669440000000001e-05],"576":[2.631876e-05,2.7564049999999999e-05],"160":[7.2466600000000002e-06,8.9641600000000002e-06],"672":[3.5620000000000001e-05,3.7100369999999999e-05],"8912896":[2.1369294669999999,2.1528715950000001],"100":[3.9361299999999999e-06,4.138e-06],"507904":[0.042704836999999995,0.066400050000000002],"3840":[0.000187586,0.000213811],"192":[1.0644499999999999e-05,1.3079820000000001e-05],"376832":[0.038459867999999994,0.040579354999999998],"98304":[0.0083620750000000001,0.0087285539999999995],"5376":[0.000326826,0.00033558860714285715],"94208":[0.007440711,0.007591034],"81920":[0.0053093489999999988,0.0056447729999999996],"3407872":[0.67067894799999994,0.73196189349999996],"104":[4.0878888888888889e-06,4.4735499999999997e-06],"122880":[0.0075668160000000014,0.0079361529999999996],"200":[7.7530000000000001e-06,8.1983599999999999e-06],"163840":[0.012832575000000002,0.0129706635],"4063232":[0.84040680999999995,0.87646039899999995],"5767168":[1.702506082,1.7675745869999999],"12582912":[4.756496888,11.553071725000001],"1600":[6.6652163265306126e-05,6.9882000000000006e-05],"136":[5.6112100000000004e-06,6.2709099999999994e-06],"232":[9.6922599999999993e-06,9.9342799999999994e-06],"7077888":[1.596355231,1.7181910810000001],"86016":[0.0058398900000000012,0.0062236519999999997],"31744":[0.001596168,0.001698143],"168":[8.3230399999999992e-06,8.6989599999999998e-06],"622592":[0.063508271500000019,0.088968201999999982],"108":[4.1975199999999998e-06,4.2336700000000002e-06],"327680":[0.028194897,0.030636440000000004],"2176":[0.0001127905,0.00011546683333333338],"3328":[0.000152332,0.00015699999999999997],"1":[8.0830000000000003e-08,8.0979999999999988e-08],"2":[2.1637999999999998e-07,2.2364000000000001e-07],"3":[2.3710000000000003e-07,2.4427e-07],"4":[2.5186999999999999e-07,2.5329999999999997e-07],"7424":[0.00036355764000000007,0.00037898553846153857],"5":[2.6988999999999999e-07,2.9186999999999998e-07],"23552":[0.0017041964,0.0018184102],"6":[2.9129000000000001e-07,2.966e-07],"61440":[0.0032510684999999999,0.0034576699999999995],"491520":[0.040118293000000006,0.046923847000000005],"77824":[0.0048557559999999993,0.0051519729999999998],"7":[3.2086999999999999e-07,3.2379999999999997e-07],"8":[3.3249999999999999e-07,3.4644999999999998e-07],"208":[8.1811999999999989e-06,8.2241400000000008e-06],"9":[3.5534999999999996e-07,3.9990000000000003e-07],"73728":[0.00446825,0.0046069800000000001],"304":[1.37357e-05,1.6514590000000002e-05],"400":[1.577005e-05,1.5802080000000001e-05],"1310720":[0.19560616,0.294387022],"336":[1.6271999999999999e-05,1.9530333333333335e-05],"3670016":[0.74710691949999997,0.77402468400000002],"6656":[0.00029241800000000002,0.00030851799999999992],"15360":[0.00075466600000000008,0.00083396309090909087],"432":[1.6996979999999999e-05,1.7520339999999998e-05],"950272":[0.119609426,0.16718342999999999],"655360":[0.062455596999999995,0.11203483],"69632":[0.004040484999999999,0.0042488179999999997],"11264":[0.000707251,0.00074014953846153844],"2752512":[0.65380044199999998,0.68254579399999993],"8126464":[1.9924664599999999,2.0330699640000001],"27648":[0.0013019030000000001,0.001414586],"368":[2.0418880597014924e-05,2.074913e-05],"65536":[0.0037454580000000001,0.0039202630000000002],"16252928":[4.0823236879999998,4.4640725225000004],"464":[1.9438389999999999e-05,2.050532e-05],"1015808":[0.114668203,0.15405010999999999],"3072":[0.00021014200000000002,0.00022094900000000002],"110592":[0.0064617069999999988,0.0081430089999999979],"237568":[0.017081805000000012,0.017264906],"278528":[0.020296957000000004,0.022824517999999995],"496":[2.1606790000000001e-05,2.2584969999999999e-05],"13107200":[2.9554216599999998,3.2211455689999999],"9961472":[2.6206071120000001,2.8085888400000001],"5888":[0.00037133699999999996,0.00040717274999999995],"11010048":[3.2829835439999999,3.3465773670000001],"1920":[8.1828000000000003e-05,8.4786357142857142e-05],"2490368":[0.51126571649999997,0.63513671199999999],"19456":[0.0011463525,0.001179641625],"57344":[0.0029689309999999997,0.003062408],"1179648":[0.152743763,0.226881468],"4718592":[1.0997553165,1.2278611859999999],"360448":[0.035440751,0.03574949849999997],"1572864":[0.35765412099999999,0.41043740400000001],"53248":[0.0026623873333333327,0.0027750043333333325],"3456":[0.00015296899999999998,0.00016653100000000004],"40960":[0.0025241366666666665,0.002579412666666666],"4608":[0.00023567400000000003,0.00024816299999999998],"13824":[0.00063542299999999998,0.00068423878571428551],"819200":[0.089178746000000003,0.11219228000000001],"983040":[0.119703632,0.17429382500000001],"8704":[0.00043811400000000003,0.00053273447058823525],"120":[4.9794399999999995e-06,5.2720700000000003e-06],"1024":[4.517013333333333e-05,4.8797989999999995e-05],"49152":[0.0036628570000000007,0.0039412189999999993],"524288":[0.045511325999999991,0.053319690999999989],"45056":[0.0029492823333333333,0.0030193390000000002],"229376":[0.015335527,0.016417761000000003],"2688":[0.00015912700000000001,0.00016368466666666665],"152":[6.5238099999999991e-06,6.7863799999999994e-06],"5120":[0.00029273599999999998,0.00030910099999999994],"1507328":[0.323841779,0.39437714000000001],"1216":[6.3313754385965515e-05,6.4764999999999994e-05],"1966080":[0.34742933050000002,0.34801237950000002],"1900544":[0.29785045049999997,0.33655213299999998],"184":[9.2722098765432113e-06,1.050965e-05],"7936":[0.00039879100000000001,0.00040169039130434782],"3801088":[0.79852104149999992,0.85195244349999999],"6815744":[1.5945432369999999,1.6538124475],"124":[4.9861000000000004e-06,5.5331700000000003e-06],"102400":[0.0055994919999999993,0.0059452580000000001],"311296":[0.024641498999999997,0.026631339],"1408":[8.626899000000001e-05,9.0391999999999998e-05],"393216":[0.04378172000000001,0.046645423499999991],"4352":[0.000229715487804878,0.00023378469047619053],"6553600":[1.4929685065,1.56901136],"20480":[0.001217267,0.0012349559999999999],"608":[2.9767919999999998e-05,3.1390363636363638e-05],"2228224":[0.38853026400000001,0.4081136185],"36864":[0.0020429402499999999,0.0021732830000000002],"704":[3.953132e-05,4.1505680000000003e-05],"720896":[0.084210104000000022,0.1309335975],"800":[3.2943430000000002e-05,3.3829060000000002e-05],"2621440":[0.55180815999999999,0.57555497700000002],"425984":[0.0302436045,0.037530325499999996],"32768":[0.0017658769999999997,0.0018151599999999997],"12058624":[4.2039632129999998,4.4025035209999999],"128":[5.1486000000000001e-06,5.4174300000000004e-06],"180224":[0.015902916,0.016416297],"224":[8.7724999999999994e-06,9.0684999999999997e-06],"736":[4.3199980000000005e-05,4.4095499999999998e-05],"320":[1.4690930000000001e-05,1.5695970000000001e-05],"557056":[0.046787904999999998,0.061231448000000001],"832":[3.3698999999999997e-05,3.4268040000000001e-05],"9437184":[2.387559956,2.7456220060000001],"3584":[0.00016640400000000007,0.00017248161403508774],"6291456":[2.2386815045000001,2.3440602940000002],"256":[1.0504e-05,1.11045e-05],"15204352":[3.997359715,4.0636891520000002],"28672":[0.0014152911666666665,0.0014715541666666669],"768":[4.8331930000000006e-05,5.4302590361445781e-05],"212992":[0.0145540545,0.015221441],"864":[3.70038e-05,3.9886019999999999e-05],"352":[1.94058e-05,1.989788e-05],"253952":[0.019130548000000004,0.019343270500000002],"960":[4.2945999999999998e-05,4.4659360000000005e-05],"24576":[0.0018731959999999999,0.0019211626000000003],"7680":[0.00038137300000000006,0.00040220700000000007],"294912":[0.023562377999999998,0.0239586265],"1048576":[0.12659705600000001,0.202930746],"10485760":[3.0443498569999998,3.147210984],"344064":[0.032040075000000001,0.036765580499999992],"288":[1.2903190000000001e-05,1.3304530000000002e-05],"1152":[5.5058e-05,5.8575000000000001e-05],"384":[2.230106e-05,2.3450509999999999e-05],"2304":[0.00011527,0.00012559088157894734],"896":[3.7136032786885245e-05,4.0110627906976739e-05],"480":[2.045495e-05,2.135745e-05],"1441792":[0.25962601699999999,0.35028928250000002],"992":[4.4333333333333331e-05,4.6244846153846154e-05],"3968":[0.00019676400000000002,0.00020478400000000001],"6400":[0.00028019200000000002,0.00028903300000000001],"1344":[7.5782193548387089e-05,7.6944000000000001e-05],"126976":[0.0080705619999999999,0.0086106159999999998],"2883584":[0.68855701000000002,0.76940776399999999],"753664":[0.096307038000000011,0.14093902749999998],"16384":[0.00085419999999999995,0.0008880549999999999],"131072":[0.0086418059999999984,0.0087370350000000006],"458752":[0.037737527,0.053202200500000005],"172032":[0.014059434500000001,0.014316216],"12288":[0.000916521,0.00098959600000000014],"14680064":[3.3902103719999999,4.032517597],"1536":[0.00010558550000000001,0.00010585399999999999],"25600":[0.001177153,0.0012458085714285711],"1835008":[0.27119382400000003,0.28793611050000001],"10752":[0.0006576389999999999,0.00067064792857142853],"21504":[0.0013701375714285711,0.0013998645000000004],"7602176":[1.74900722,1.8839821745000001],"5632":[0.00034409499999999994,0.00037072800000000002],"10":[3.6941999999999998e-07,3.8788999999999996e-07],"3145728":[0.94481167300000002,0.96053994399999998],"245760":[0.018300884,0.018402316999999998],"1728":[7.7518074074074076e-05,7.8049799999999999e-05],"11":[3.9382999999999997e-07,4.1511000000000002e-07],"1114112":[0.152336422,0.21646105199999999],"12":[4.2317e-07,4.3590000000000003e-07],"7340032":[1.6437691889999999,1.659781341],"7168":[0.00032615700000000004,0.00037024999999999997],"13":[4.3683999999999999e-07,4.8861999999999999e-07],"6029312":[1.9269523515,1.9911167235],"14":[4.9157e-07,5.1078999999999998e-07],"3200":[0.000144232,0.00014679496969696964],"20":[6.3285000000000001e-07,7.2891000000000009e-07],"204800":[0.012901133,0.014503225],"15":[4.8752999999999997e-07,5.5696999999999994e-07],"13312":[0.00064346886666666694,0.00065457199999999975],"4980736":[1.2500159320000002,1.3008655645],"118784":[0.0074017680000000013,0.007618548000000001],"51200":[0.002493196,0.0026054160000000002],"16":[5.8016000000000003e-07,5.8461000000000004e-07],"21":[7.0759000000000005e-07,7.1142e-07],"917504":[0.1023841915,0.15337614100000002],"22":[7.3244000000000001e-07,8.5296999999999994e-07],"4864":[0.000286536,0.000309962],"17":[5.8737999999999996e-07,6.1732999999999998e-07],"14848":[0.00073847000000000008,0.00079485549999999997],"23":[7.7682000000000004e-07,1.2015400000000001e-06],"786432":[0.11029879200000001,0.15536854850000001],"18":[6.3634999999999995e-07,6.4707000000000004e-07],"1638400":[0.231741901,0.24796900299999999],"7864320":[1.892903362,1.9604320664999999],"24":[8.5235999999999994e-07,1.07821e-06],"14155776":[3.2330447449999999,3.7593435149999999],"19":[6.1182999999999999e-07,7.8945000000000002e-07],"30":[8.6201999999999999e-07,9.5435000000000002e-07],"25":[7.1671999999999998e-07,7.1806000000000001e-07],"31":[9.1107999999999992e-07,1.1008399999999999e-06],"1280":[6.4497499999999997e-05,6.8281999999999994e-05],"26":[7.7507000000000002e-07,7.9198999999999993e-07],"3932160":[0.80475546900000006,0.84557525350000007],"2432":[0.00013019400000000001,0.000143397],"32":[1.4427299999999999e-06,1.47038e-06],"27":[7.6991999999999995e-07,7.7220999999999995e-07],"409600":[0.028749419999999998,0.035686673000000002]}},{"title":"OrderedSet subtracting Array (75% overlap)","results":{"28":[7.8595000000000007e-07,8.0620999999999996e-07],"34":[8.9874000000000001e-07,9.5907000000000008e-07],"29":[7.6606000000000002e-07,8.5219999999999997e-07],"40":[1.1148599999999999e-06,1.11514e-06],"17408":[0.00071568099999999991,0.00077532758333333327],"1472":[6.9343878048780484e-05,7.0023499999999998e-05],"112":[3.4990100000000001e-06,3.6071299999999997e-06],"1376256":[0.22670524450000001,0.27272192299999998],"5242880":[1.141926891,1.228050839],"36":[9.7742000000000008e-07,1.02284e-06],"42":[1.1738000000000001e-06,1.2409699999999999e-06],"11534336":[3.2029443689999999,3.2047100464999998],"114688":[0.0054926180000000003,0.0056282770000000001],"144":[4.7424599999999997e-06,5.0326699999999997e-06],"38":[1.0348400000000001e-06,1.33751e-06],"240":[7.5990416666666672e-06,7.7464999999999994e-06],"9216":[0.000383841,0.00042579800000000007],"44":[1.2510200000000001e-06,1.2988799999999998e-06],"1664":[5.3677999999999997e-05,5.7833319444444441e-05],"196608":[0.015677909,0.016209042999999999],"155648":[0.0099790390000000003,0.010053882],"2816":[0.00013241699999999999,0.000133146],"50":[1.1940600000000001e-06,1.2068700000000001e-06],"2359296":[0.41188205899999997,0.43760817900000004],"46":[1.3891800000000001e-06,1.4703299999999999e-06],"176":[7.1010000000000003e-06,7.1261399999999997e-06],"52":[1.29703e-06,1.31267e-06],"272":[8.8254444444444442e-06,9.7358799999999997e-06],"116":[3.5881099999999999e-06,3.8521799999999996e-06],"47104":[0.0025582396666666675,0.002721808],"6912":[0.00025482493939393933,0.00026679570270270273],"1856":[6.2361186440677968e-05,6.3301999999999998e-05],"48":[1.4096099999999999e-06,1.9514300000000001e-06],"2097152":[0.35536688750000001,0.380658265],"54":[1.2779299999999999e-06,1.3708899999999998e-06],"2031616":[0.28816060799999998,0.32406488700000002],"43008":[0.0020171970000000005,0.0022116334999999999],"60":[1.4484099999999998e-06,1.5570499999999998e-06],"30720":[0.0011876180000000001,0.0012263104285714283],"56":[1.41417e-06,1.4229299999999999e-06],"62":[1.58172e-06,1.6425700000000002e-06],"58":[1.47252e-06,1.50151e-06],"3014656":[0.71243171700000008,0.7676538235],"64":[2.1100200000000003e-06,2.2310099999999998e-06],"8388608":[1.6063830955,1.6203498965000001],"29696":[0.001151271375,0.001200862125],"216":[6.56757e-06,6.7386300000000006e-06],"106496":[0.0049419479999999998,0.0053536530000000008],"72":[2.4403900000000001e-06,2.5287800000000001e-06],"442368":[0.026513305000000004,0.038474148],"147456":[0.0088968319999999969,0.0090101089999999988],"4456448":[0.79815394100000003,0.95245921150000001],"63488":[0.0027242173333333333,0.0027649113333333328],"38912":[0.001694641,0.001872372],"68":[2.1989700000000001e-06,2.4581899999999998e-06],"188416":[0.014106677,0.0144002405],"248":[7.8780400000000009e-06,8.7482700000000002e-06],"80":[3.0128199999999999e-06,3.0768599999999999e-06],"2560":[0.000107643,0.00011963385365853658],"34816":[0.0014675308333333334,0.0014886820000000003],"3712":[0.00013900718840579711,0.00014211399999999999],"3538944":[0.56464623400000002,0.60660420800000003],"76":[2.7013299999999999e-06,2.7301899999999999e-06],"4194304":[0.73156732049999995,0.78767339450000007],"851968":[0.074041579999999996,0.11429458300000001],"4096":[0.0001586495087719298,0.00016667599999999999],"59392":[0.0025679736666666666,0.0026878289999999984],"84":[3.1649199999999997e-06,3.4047500000000003e-06],"3276800":[0.50405898000000005,0.56822899000000004],"55296":[0.0022136833333333333,0.0023283449999999999],"688128":[0.06320179699999999,0.091170481999999997],"8192":[0.00033449099999999997,0.00036716400000000012],"10240":[0.00046355800000000004,0.000481156],"15872":[0.00065213400000000007,0.00065354633333333345],"92":[3.31454e-06,3.9806999999999999e-06],"26624":[0.00097291899999999982,0.00099423799999999994],"1792":[6.329486e-05,6.5651469387755103e-05],"11776":[0.00063035486666666667,0.00065989399999999974],"2944":[0.000141132,0.00014322599999999999],"88":[3.2944000000000002e-06,3.4319599999999997e-06],"22528":[0.001125476875,0.0011901461249999999],"1245184":[0.15207106200000001,0.24152917400000001],"15728640":[3.5507123979999999,3.6471407679999999],"96":[3.9551700000000003e-06,4.4795500000000002e-06],"1984":[6.6612999999999994e-05,6.9102000000000003e-05],"139264":[0.0074463840000000003,0.0080139549999999997],"475136":[0.028956196,0.04299231600000001],"13631488":[2.9382817509999999,3.1769599479999999],"416":[1.2782277777777778e-05,1.29578e-05],"928":[3.1268239999999996e-05,3.2831470000000004e-05],"512":[1.738834e-05,1.7437940000000001e-05],"18432":[0.00080800800000000003,0.00083188774999999983],"16777216":[4.3402302234999999],"9728":[0.00041833399999999992,0.00042589400000000012],"1769472":[0.249074354,0.29780359349999996],"1703936":[0.28229939199999998,0.32302250399999999],"2048":[6.9106500000000007e-05,7.2836999999999994e-05],"14336":[0.00053802699999999973,0.00055428847058823537],"448":[1.454269e-05,1.6301829999999999e-05],"5505024":[1.2133679934999999,1.3345847449999999],"544":[1.7846416666666666e-05,1.9292000000000001e-05],"221184":[0.012029939,0.0142573675],"90112":[0.0052197779999999996,0.0056660960000000007],"640":[2.4692179999999999e-05,2.7855999999999999e-05],"12800":[0.0004729205,0.00054869100000000002],"262144":[0.015984708,0.017724815999999997],"589824":[0.041813090000000011,0.076919042999999993],"884736":[0.09064178199999999,0.1523247365],"6144":[0.00034187599999999996,0.00036164111111111109],"1088":[3.9205999999999997e-05,4.0667819999999999e-05],"576":[1.9753818181818183e-05,2.151771e-05],"160":[5.2317300000000006e-06,6.5403900000000002e-06],"672":[2.57815e-05,2.7792676470588236e-05],"8912896":[1.9199824214999999,1.9241994094999999],"100":[3.1307999999999997e-06,3.1421599999999999e-06],"507904":[0.0363116915,0.050924546500000001],"3840":[0.00014695953731343281,0.00015952371186440673],"192":[7.8512000000000003e-06,9.2668400000000002e-06],"376832":[0.030599167999999954,0.031868994999999983],"98304":[0.0064098569999999997,0.0067084680000000004],"5376":[0.00025173300000000002,0.00025646600000000001],"94208":[0.0057797440000000016,0.0058419690000000007],"81920":[0.0041449940000000008,0.004297439000000001],"3407872":[0.54640508799999998,0.56190762599999999],"104":[3.1815299999999999e-06,3.2847200000000002e-06],"122880":[0.0061409199999999994,0.0066220230000000021],"200":[6.0432e-06,6.1430899999999998e-06],"163840":[0.010414086999999999,0.0106264015],"4063232":[0.74906907,0.89681178900000003],"5767168":[1.3511555184999999,1.4873325545],"12582912":[3.9443090330000001,10.647433120000001],"1600":[5.281908974358974e-05,5.371648648648649e-05],"136":[4.3911999999999996e-06,4.8160199999999998e-06],"232":[7.1975000000000001e-06,7.4339500000000002e-06],"7077888":[1.5283463155000001,1.5702479894999999],"86016":[0.0046398769999999997,0.004978461],"31744":[0.0012739671428571432,0.001324757],"168":[6.2327800000000001e-06,6.6165400000000004e-06],"622592":[0.055594008,0.071306156999999967],"108":[3.2933399999999997e-06,3.3792199999999999e-06],"327680":[0.022571526499999998,0.02354324],"2176":[8.5222000000000005e-05,8.7039000000000005e-05],"3328":[0.00011625780000000001,0.00012362633750000001],"1":[7.7400000000000005e-08,7.7940000000000008e-08],"2":[9.6290000000000011e-08,1.0076e-07],"3":[1.1617000000000001e-07,1.1875e-07],"4":[2.5012999999999998e-07,2.5839999999999998e-07],"7424":[0.00028193105882352946,0.00029214399999999999],"5":[2.6691e-07,2.8354000000000001e-07],"23552":[0.001249509,0.001363835857142857],"6":[2.8499000000000001e-07,2.9539e-07],"61440":[0.0025766220000000006,0.0026646159999999994],"491520":[0.032755711,0.039947227999999994],"77824":[0.003870213,0.0039998919999999997],"7":[3.0883000000000005e-07,3.2196999999999996e-07],"8":[3.3114000000000004e-07,3.4718000000000002e-07],"208":[6.3808099999999998e-06,6.4919629629629629e-06],"9":[3.4656999999999996e-07,3.5999999999999999e-07],"73728":[0.0034956405000000001,0.003564551],"304":[1.0285000000000001e-05,1.254438e-05],"400":[1.2255999999999999e-05,1.2503489999999999e-05],"1310720":[0.17434994449999999,0.26049959499999997],"336":[1.2978677419354838e-05,1.4351100000000001e-05],"3670016":[0.64417126999999996,0.70920151099999995],"6656":[0.000227285,0.00024985749999999998],"15360":[0.00058771599999999974,0.00059182099999999997],"432":[1.3147e-05,1.369761e-05],"950272":[0.097862680999999993,0.14898209900000001],"655360":[0.052432204000000003,0.089129670000000008],"69632":[0.0031648219999999999,0.003286817],"11264":[0.00055982764705882356,0.00057681952941176487],"2752512":[0.61700099500000005,0.63481506199999993],"8126464":[1.6571998345000001,1.6959888080000001],"27648":[0.001012195,0.001113118],"368":[1.5607780000000002e-05,1.568186e-05],"65536":[0.0028770689999999999,0.003057766],"16252928":[3.3221728719999999,4.0297274029999999],"464":[1.4983369999999999e-05,1.6040469999999998e-05],"1015808":[0.10443179800000001,0.147574645],"3072":[0.00016117899999999996,0.00016196899999999995],"110592":[0.0052316929999999999,0.0061738130000000002],"237568":[0.015054676999999999,0.015201669000000001],"278528":[0.016809299999999999,0.0188177325],"496":[1.6073e-05,1.6949e-05],"13107200":[2.8870676290000001,2.9563922814999999],"9961472":[2.3525158230000001,2.3998392824999999],"5888":[0.00030116831250000004,0.00030694700000000001],"11010048":[2.603829599,2.9645530715000001],"1920":[6.2611333333333335e-05,6.6576219999999996e-05],"2490368":[0.42111174000000001,0.54200825900000005],"19456":[0.0008477999999999999,0.00089342100000000015],"57344":[0.002310318,0.0024596113333333327],"1179648":[0.14108065999999997,0.20529034350000003],"4718592":[1.0061314145,1.030484489],"360448":[0.028565165,0.029314042499999998],"1572864":[0.30164769749999998,0.34642046949999999],"53248":[0.0020561925000000003,0.0022810694999999999],"3456":[0.00012578599999999999,0.000128071],"40960":[0.0019034742000000001,0.00197357],"4608":[0.000182673,0.000189958],"13824":[0.00052128299999999999,0.00053336499999999973],"819200":[0.074046548000000004,0.10339440499999999],"983040":[0.10855537799999999,0.174868939],"8704":[0.00035092400000000013,0.00037658550000000009],"120":[3.9821399999999998e-06,4.20669e-06],"1024":[3.436916e-05,3.822131e-05],"49152":[0.0028644400000000002,0.0029622223333333328],"524288":[0.034501005000000001,0.050665829000000009],"45056":[0.002281628,0.0025057186666666664],"229376":[0.012659165500000014,0.014265197],"2688":[0.000118631,0.0001261965],"152":[5.0841099999999992e-06,5.7991799999999998e-06],"5120":[0.00022395099999999993,0.00023454900000000005],"1507328":[0.25123406250000002,0.33566647550000001],"1216":[4.6088999999999999e-05,4.6518019999999999e-05],"1966080":[0.27229028199999999,0.32810763249999997],"1900544":[0.2741320075,0.33062878600000001],"184":[7.2855e-06,7.7236799999999989e-06],"7936":[0.00029459200000000004,0.00030595299999999998],"3801088":[0.71899634899999998,0.74227816700000004],"6815744":[1.4664503735000001,1.482672258],"124":[4.0327700000000002e-06,4.2059400000000001e-06],"102400":[0.0045698400000000012,0.0048838425],"311296":[0.020297094499999994,0.021498246999999998],"1408":[6.1877350000000001e-05,7.0520124999999998e-05],"393216":[0.035048467999999999,0.037266745000000004],"4352":[0.00017357900000000004,0.00017711685454545456],"6553600":[1.2896853829999999,1.4019400355],"20480":[0.00093792350000000018,0.0009743102],"608":[2.295604347826087e-05,2.36398e-05],"2228224":[0.356896414,0.40475250200000001],"36864":[0.0015613249999999999,0.0016503238],"704":[2.8150050000000003e-05,3.1659470000000002e-05],"720896":[0.072116418499999987,0.104496042],"800":[2.4608666666666664e-05,2.5117226190476194e-05],"2621440":[0.48584949500000002,0.55326683799999998],"425984":[0.026745132999999997,0.030008865000000006],"32768":[0.0013603090000000001,0.0013706689999999999],"12058624":[3.5450842735000001,3.7387048800000002],"128":[4.08315e-06,4.2755e-06],"180224":[0.012597018999999997,0.0133666975],"224":[6.8899599999999998e-06,6.9723199999999998e-06],"736":[2.99935e-05,3.1605e-05],"320":[1.1341210000000001e-05,1.1838169999999999e-05],"557056":[0.038526191000000001,0.060240605000000003],"832":[2.57193e-05,2.6677340000000002e-05],"9437184":[2.0095467079999998,2.4357252310000002],"3584":[0.000128493,0.00013465870833333332],"6291456":[1.835778624,1.8436770229999999],"256":[8.158142857142857e-06,9.0516399999999993e-06],"15204352":[3.0448160510000002,3.8925406479999998],"28672":[0.001096557,0.0011408550000000001],"768":[3.5371635135135136e-05,3.8771230000000001e-05],"212992":[0.0126164165,0.013092286],"864":[2.855902e-05,2.9812419999999997e-05],"352":[1.409832e-05,1.46521e-05],"253952":[0.016256616000000005,0.016577823999999998],"960":[3.198288e-05,3.4636546511627902e-05],"24576":[0.001402702,0.0014271426666666667],"7680":[0.00027918700000000002,0.00031114199999999998],"294912":[0.018907538999999994,0.021297522500000002],"1048576":[0.1173036325,0.16998919200000001],"10485760":[2.5633722539999999,2.6754991294999999],"344064":[0.025609699,0.027264343],"288":[9.5830100000000003e-06,9.7079499999999991e-06],"1152":[4.1218468750000001e-05,4.4182850000000003e-05],"384":[1.57975625e-05,1.5962142857142857e-05],"2304":[8.974575e-05,9.3383941176470591e-05],"896":[2.8229511627906979e-05,3.0754555555555556e-05],"480":[1.6430209999999998e-05,1.666625e-05],"1441792":[0.24476398799999999,0.28180648699999999],"992":[3.3669569999999998e-05,3.6236229999999999e-05],"3968":[0.00014902200000000001,0.00015803245614035087],"6400":[0.00022318800000000003,0.00022877452499999996],"1344":[5.3356999999999998e-05,5.7395090000000001e-05],"126976":[0.006572882999999999,0.0070066129999999992],"2883584":[0.62055819649999999,0.69864492],"753664":[0.080083674999999993,0.117307945],"16384":[0.00064330700000000008,0.00069226421428571422],"131072":[0.0069376900000000007,0.0073585299999999994],"458752":[0.031802684000000005,0.039146901999999997],"172032":[0.011338493,0.0117118825],"12288":[0.00069338800000000008,0.00072906700000000013],"14680064":[3.0481931389999999,3.6898736049999998],"1536":[7.3399999999999995e-05,7.7988939999999997e-05],"25600":[0.00091753800000000008,0.00094753900000000017],"1835008":[0.2587026335,0.29253288399999999],"10752":[0.00047916800000000003,0.00052362066666666678],"21504":[0.0010014759999999998,0.0011145745000000001],"7602176":[1.483416461,1.6039581764999999],"5632":[0.00027936603225806451,0.00030272300000000002],"10":[3.6712999999999998e-07,3.7197000000000001e-07],"3145728":[0.75893101499999993,0.78456936700000002],"245760":[0.014599477999999999,0.015706708999999999],"1728":[5.6650000000000001e-05,5.9966000000000002e-05],"11":[3.8658999999999997e-07,3.9281999999999999e-07],"1114112":[0.146717125,0.209373644],"12":[4.1511000000000002e-07,4.2877000000000005e-07],"7340032":[1.311107442,1.4162509679999999],"7168":[0.000261,0.00027751400000000014],"13":[4.2354999999999995e-07,4.5685000000000002e-07],"6029312":[1.5695006199999999,1.6421675665],"14":[4.7216999999999997e-07,4.8925000000000002e-07],"3200":[0.0001117899882352941,0.00011865679761904764],"20":[5.9212000000000004e-07,6.9715999999999992e-07],"204800":[0.010653038,0.011187540500000001],"15":[4.6657999999999999e-07,5.3099000000000002e-07],"13312":[0.00049040164999999991,0.00051683747368421037],"4980736":[1.0536938135,1.0746533970000001],"118784":[0.0061127119999999993,0.0062490280000000011],"51200":[0.0019666187499999999,0.0020620425000000002],"16":[5.3044999999999994e-07,5.3806000000000004e-07],"21":[6.8172999999999995e-07,6.8754000000000003e-07],"917504":[0.084767143000000017,0.15448510800000001],"22":[6.8355e-07,6.9486999999999992e-07],"4864":[0.00021986999999999997,0.00023828799999999999],"17":[5.2170000000000002e-07,5.6196000000000004e-07],"14848":[0.00056939699999999992,0.00062466428571428582],"23":[7.2596999999999993e-07,1.0187000000000001e-06],"786432":[0.082441009999999967,0.13450347150000003],"18":[5.8508999999999995e-07,6.2119000000000002e-07],"1638400":[0.21136137399999999,0.26170870099999999],"7864320":[1.6310831155000001,1.6358268470000001],"24":[7.3870999999999998e-07,8.5890000000000005e-07],"14155776":[3.0722829489999999,3.2630946180000002],"19":[5.5433999999999997e-07,6.7137000000000006e-07],"30":[8.0592000000000001e-07,9.0281000000000002e-07],"25":[6.7526000000000008e-07,7.398000000000001e-07],"31":[9.1309000000000003e-07,9.6514000000000013e-07],"1280":[4.8822000000000001e-05,5.0988e-05],"26":[7.1368999999999998e-07,7.3533000000000006e-07],"3932160":[0.72393872000000004,0.76767002849999999],"2432":[9.9445200000000008e-05,0.00010681401111111113],"32":[8.3593e-07,8.6421000000000009e-07],"27":[7.1078999999999997e-07,7.4292000000000004e-07],"409600":[0.023431581,0.030633118000000004]}},{"title":"OrderedSet subtracting Array (100% overlap)","results":{"28":[6.3472000000000006e-07,6.4466e-07],"34":[7.3208999999999999e-07,8.1415999999999993e-07],"29":[6.3153999999999995e-07,6.7022999999999993e-07],"40":[8.2944999999999995e-07,8.5284000000000006e-07],"17408":[0.00050940999999999996,0.00053715300000000007],"1472":[4.397861e-05,4.7199629999999997e-05],"112":[2.3976299999999997e-06,2.441e-06],"1376256":[0.15732921699999999,0.22899109249999999],"5242880":[1.063850572,1.1079778250000001],"36":[7.6975999999999998e-07,8.4809999999999998e-07],"42":[9.5056999999999997e-07,9.5384999999999998e-07],"11534336":[2.450473057,2.6975107720000002],"114688":[0.0044784830000000001,0.0045515349999999998],"144":[3.2795600000000001e-06,3.3795e-06],"38":[8.3050000000000003e-07,9.4906e-07],"240":[5.1287599999999997e-06,5.3321000000000002e-06],"9216":[0.00027899225714285713,0.00030431499999999999],"44":[9.928099999999999e-07,1.1408000000000002e-06],"1664":[3.8324819999999997e-05,3.9666700000000004e-05],"196608":[0.011339545000000003,0.011927435],"155648":[0.007806075,0.007923804999999999],"2816":[8.6713461538461537e-05,8.8681499999999994e-05],"50":[1.0256899999999999e-06,1.03756e-06],"2359296":[0.42191877900000002,0.43049259200000001],"46":[1.0619599999999999e-06,1.17948e-06],"176":[4.5100899999999995e-06,4.8091799999999999e-06],"52":[1.0989899999999999e-06,1.15866e-06],"272":[5.9145052631578954e-06,6.4649999999999999e-06],"116":[2.42845e-06,2.54148e-06],"47104":[0.0017212939999999995,0.001970926],"6912":[0.00017821100000000001,0.00017948500000000001],"1856":[4.3166875e-05,4.4007000000000001e-05],"48":[1.11323e-06,1.1723599999999999e-06],"2097152":[0.33778209100000001,0.408885361],"54":[1.10497e-06,1.1371399999999999e-06],"2031616":[0.25614366,0.27659769699999998],"43008":[0.001474178166666667,0.0015247870000000001],"60":[1.2887200000000002e-06,1.3424500000000002e-06],"30720":[0.00081281999999999991,0.00086297499999999998],"56":[1.17635e-06,1.23588e-06],"62":[1.3581899999999999e-06,1.37355e-06],"58":[1.24363e-06,1.25123e-06],"3014656":[0.612739645,0.63005484450000004],"64":[1.33155e-06,1.4570599999999999e-06],"8388608":[1.5115817730000001,1.5581929620000001],"29696":[0.00083904736363636374,0.00084648827272727301],"216":[4.5303399999999999e-06,4.7188200000000002e-06],"106496":[0.0039647500000000004,0.0044120434999999998],"72":[1.55742e-06,1.65197e-06],"442368":[0.021202231999999998,0.024902107],"147456":[0.0070847209999999996,0.007161045999999999],"4456448":[0.73234805400000003,0.85479185000000002],"63488":[0.0019838955,0.0020024962500000002],"38912":[0.0012540535714285713,0.0013201122857142858],"68":[1.4682399999999998e-06,1.5289512195121952e-06],"188416":[0.010698825,0.0114210005],"248":[5.2615400000000006e-06,5.6591099999999996e-06],"80":[1.8043799999999999e-06,1.8464150943396227e-06],"2560":[6.8997499999999998e-05,7.7967249999999998e-05],"34816":[0.001024711,0.0010407892222222223],"3712":[9.1600799999999992e-05,9.3910069999999992e-05],"3538944":[0.62071445599999997,0.63878121200000004],"76":[1.7106799999999999e-06,1.8049700000000001e-06],"4194304":[0.64740935199999994,0.71871434899999997],"851968":[0.064690728499999989,0.114685852],"4096":[0.00010813979999999996,0.00011699799999999999],"59392":[0.0018226849999999999,0.00190670425],"84":[1.9752600000000001e-06,2.11575e-06],"3276800":[0.470205027,0.55756392200000005],"55296":[0.0015965271666666665,0.0017057455999999992],"688128":[0.054874110999999989,0.07542196000000001],"8192":[0.00023807200000000003,0.00023910650000000003],"10240":[0.00031729499999999994,0.00033491599999999994],"15872":[0.00045034890909090921,0.00051906363157894751],"92":[2.25931e-06,2.3558500000000001e-06],"26624":[0.00072287300000000007,0.00073636853846153843],"1792":[4.3577599999999994e-05,4.5005333333333334e-05],"11776":[0.00040603299999999998,0.00043403399999999997],"2944":[9.3483809999999988e-05,9.8771385416666674e-05],"88":[2.1687200000000002e-06,2.3568800000000001e-06],"22528":[0.00077946100000000006,0.00080142399999999991],"1245184":[0.13010632599999999,0.2142645735],"15728640":[2.8936703824999999,3.372429382],"96":[2.46558e-06,2.5612999999999999e-06],"1984":[4.7280000000000001e-05,4.8272999999999997e-05],"139264":[0.0059149189999999994,0.0066003549999999996],"475136":[0.023251721,0.040313728],"13631488":[2.6706263859999999,2.9770055649999998],"416":[8.8896200000000001e-06,9.3370000000000006e-06],"928":[2.1162899999999997e-05,2.3407839999999999e-05],"512":[1.195476e-05,1.2268520000000001e-05],"18432":[0.00054139399999999984,0.00057799799999999992],"16777216":[3.2838501610000002],"9728":[0.00029555262499999992,0.00029591799999999999],"1769472":[0.29617510749999998,0.31490616250000003],"1703936":[0.206890141,0.30392559499999999],"2048":[4.7889000000000002e-05,5.0456666666666668e-05],"14336":[0.00037771300000000012,0.00039065412499999992],"448":[1.0231730000000001e-05,1.0681259999999999e-05],"5505024":[1.0705539589999999,1.1822851999999999],"544":[1.362094e-05,1.3633189999999999e-05],"221184":[0.0095893240000000015,0.0107278915],"90112":[0.0037162220000000008,0.0040390740000000019],"640":[1.6638519999999998e-05,1.768736e-05],"12800":[0.000324667,0.00038022199999999994],"262144":[0.012273148000000001,0.013637125],"589824":[0.04117092,0.060778257000000016],"884736":[0.084711400000000006,0.136189279],"6144":[0.00022375279545454535,0.00022411499999999999],"1088":[2.6732449999999998e-05,2.702389e-05],"576":[1.368158e-05,1.49937e-05],"160":[3.7743199999999997e-06,3.8198500000000004e-06],"672":[1.7362937499999999e-05,1.830565e-05],"8912896":[1.6622169695,1.9476551519999998],"100":[2.0112099999999998e-06,2.0597352941176468e-06],"507904":[0.028874742000000009,0.048409019000000005],"3840":[0.00010265775,0.00010298986956521738],"192":[4.9004300000000001e-06,5.0378499999999995e-06],"376832":[0.023928382000000005,0.0262496355],"98304":[0.0044793185000000001,0.0047765759999999985],"5376":[0.000168357,0.000175978320754717],"94208":[0.0040473490000000004,0.0043444930000000005],"81920":[0.0030270663333333337,0.0032692304999999999],"3407872":[0.49614549500000005,0.51362463950000004],"104":[2.15357e-06,2.1767600000000002e-06],"122880":[0.0048471439999999994,0.0052326300000000003],"200":[4.1795624999999997e-06,4.2618099999999994e-06],"163840":[0.0080762519999999973,0.0080810309999999989],"4063232":[0.77524072099999997,0.83746611300000007],"5767168":[1.1625343830000001,1.2531666850000001],"12582912":[3.1509875334999999,8.3225499710000008],"1600":[3.6980390000000002e-05,3.7670949999999995e-05],"136":[3.0931200000000002e-06,3.4241315789473682e-06],"232":[4.8985365853658537e-06,4.9547500000000003e-06],"7077888":[1.1820743069999999,1.4090032670000001],"86016":[0.0032876245,0.003473921],"31744":[0.0008499060000000001,0.00096315080000000002],"168":[3.8192499999999999e-06,4.4990200000000002e-06],"622592":[0.038142242,0.070013038],"108":[2.20348e-06,2.2662100000000003e-06],"327680":[0.0207626115,0.021020121000000006],"2176":[5.7519999999999998e-05,5.8574109999999999e-05],"3328":[7.9110000000000007e-05,8.6301642857142857e-05],"1":[7.7530000000000007e-08,8.0700000000000001e-08],"2":[9.6550000000000001e-08,1.009e-07],"3":[1.1549000000000001e-07,1.1868e-07],"4":[1.3255999999999999e-07,1.3336999999999998e-07],"7424":[0.00019514400000000004,0.000197591],"5":[1.5031999999999999e-07,1.7266000000000001e-07],"23552":[0.00084990927272727277,0.00088126990000000004],"6":[1.6782e-07,1.6798999999999998e-07],"61440":[0.0018405120000000003,0.00193209575],"491520":[0.024825022999999995,0.041473811999999999],"77824":[0.0027512753333333332,0.0028673736666666671],"7":[1.8992e-07,2.0942999999999999e-07],"8":[2.0367e-07,2.2113999999999998e-07],"208":[4.3108499999999996e-06,4.403428571428572e-06],"9":[2.2574999999999999e-07,2.3090000000000001e-07],"73728":[0.0025186049999999993,0.0026140403333333334],"304":[7.0590999999999999e-06,7.1429700000000005e-06],"400":[8.9065599999999993e-06,9.2417899999999995e-06],"1310720":[0.144668885,0.23418790249999999],"336":[8.7030199999999992e-06,9.261166666666667e-06],"3670016":[0.63717192600000006,0.65356663800000003],"6656":[0.000160691,0.000172256],"15360":[0.00042446181818181814,0.00044098899999999998],"432":[9.1096666666666668e-06,9.1892699999999999e-06],"950272":[0.099914211000000003,0.14219992149999999],"655360":[0.047986349000000005,0.075137241499999993],"69632":[0.0022872112499999994,0.0023904065],"11264":[0.000388878,0.000389167],"2752512":[0.47598367000000003,0.61303281949999999],"8126464":[1.5373060629999999,1.743962799],"27648":[0.00074599446153846168,0.00078318399999999992],"368":[1.004048e-05,1.0090607142857143e-05],"65536":[0.0021294840000000001,0.00235593],"16252928":[2.9980013665,3.6263700735],"464":[1.0546419999999999e-05,1.0778969999999999e-05],"1015808":[0.088630689999999984,0.146990275],"3072":[0.00010126175,0.000105604],"110592":[0.0041334315000000005,0.0047618375000000003],"237568":[0.012811094,0.012900172],"278528":[0.013369752,0.014049625999999999],"496":[1.140241e-05,1.1944220000000001e-05],"13107200":[2.4547745614999998,2.6284600039999999],"9961472":[1.85608178,2.1715760250000002],"5888":[0.0002066181875,0.00020831499999999999],"11010048":[2.2252114789999999,2.3863726160000001],"1920":[4.5079259999999998e-05,4.7225329999999999e-05],"2490368":[0.39039586399999998,0.49412592950000001],"19456":[0.00061645099999999996,0.0006188056874999999],"57344":[0.0016830950000000003,0.0017359004],"1179648":[0.118501039,0.154006684],"4718592":[0.88935985100000003,0.91657209399999995],"360448":[0.021123243,0.023722483000000003],"1572864":[0.2189970215,0.237331773],"53248":[0.0014606668333333333,0.0016355109999999999],"3456":[8.628158000000001e-05,8.7328000000000001e-05],"40960":[0.00135648,0.0013727019999999997],"4608":[0.00013391600000000001,0.00013513699999999999],"13824":[0.0003474385,0.00038705648000000002],"819200":[0.073631404500000011,0.10838854000000001],"983040":[0.083754401499999992,0.1638498675],"8704":[0.00024676200000000003,0.00025759700000000003],"120":[2.5294199999999996e-06,2.7080700000000004e-06],"1024":[2.3076142857142857e-05,2.604366e-05],"49152":[0.0019605307999999997,0.0019791827499999999],"524288":[0.027554337999999994,0.038451397000000012],"45056":[0.001552709,0.0016802184000000004],"229376":[0.0102228475,0.0122819685],"2688":[8.0649727272727277e-05,8.4317470000000005e-05],"152":[3.4868199999999999e-06,3.9644399999999999e-06],"5120":[0.00015660399999999999,0.00016288000000000001],"1507328":[0.225658621,0.32331409750000001],"1216":[3.1074400000000002e-05,3.1627000000000001e-05],"1966080":[0.24353095200000002,0.33411815],"1900544":[0.31774960699999999,0.32154869799999997],"184":[4.7451100000000004e-06,4.9229700000000006e-06],"7936":[0.00021539499999999995,0.000217204],"3801088":[0.57874113699999996,0.63112477],"6815744":[1.2930283965,1.3087057770000001],"124":[2.7455100000000001e-06,2.7477200000000001e-06],"102400":[0.0036316,0.0038118120000000004],"311296":[0.015931392999999999,0.017206128999999997],"1408":[3.8649999999999998e-05,4.2466111111111112e-05],"393216":[0.025644699,0.028382679500000008],"4352":[0.000116401,0.000121237],"6553600":[1.0989006625,1.200090018],"20480":[0.00066970135714285715,0.0006743649999999999],"608":[1.5834409999999999e-05,1.6446333333333336e-05],"2228224":[0.30412800750000002,0.30484605499999995],"36864":[0.0011228760000000001,0.0011844889999999999],"704":[1.8554000000000002e-05,1.9616719999999999e-05],"720896":[0.066866657999999982,0.085038913000000022],"800":[1.7383339999999999e-05,1.8348000000000001e-05],"2621440":[0.40275521999999997,0.463664203],"425984":[0.019917459999999998,0.028267043000000002],"32768":[0.00096645800000000044,0.000980229],"12058624":[2.8600896360000001,3.0217851040000001],"128":[2.8674700000000001e-06,2.8752600000000004e-06],"180224":[0.0094778210000000009,0.0102242815],"224":[4.7836799999999999e-06,4.7907800000000002e-06],"736":[1.9667230000000002e-05,2.0177179999999999e-05],"320":[7.7669500000000002e-06,8.7507400000000002e-06],"557056":[0.030680952499999997,0.050841934999999991],"832":[1.8372999999999998e-05,1.8558260000000002e-05],"9437184":[1.720168143,2.1586272394999999],"3584":[9.0380640000000003e-05,9.7367000000000005e-05],"6291456":[1.362635482,1.4980647899999999],"256":[5.417730769230769e-06,5.7489499999999994e-06],"15204352":[2.7537424100000001,3.331187049],"28672":[0.00076878100000000007,0.00081592545454545434],"768":[2.2331640000000001e-05,2.3875640000000002e-05],"212992":[0.0092816740000000002,0.010751142999999999],"864":[1.9278000000000001e-05,1.9473000000000001e-05],"352":[8.635990000000001e-06,1.055416e-05],"253952":[0.013796786,0.014105237],"960":[2.235492e-05,2.4034350000000001e-05],"24576":[0.000919668,0.00092459889999999998],"7680":[0.00020307800000000004,0.00022916580952380946],"294912":[0.014870374,0.015649541999999995],"1048576":[0.095741303999999999,0.14329484100000001],"10485760":[2.0612564789999999,2.218704732],"344064":[0.021503587500000001,0.021963534],"288":[6.39303e-06,7.1658000000000001e-06],"1152":[2.7776999999999998e-05,2.8058638297872339e-05],"384":[1.011024e-05,1.032976e-05],"2304":[5.9638500000000002e-05,6.3611260000000003e-05],"896":[1.9821933333333334e-05,2.167706e-05],"480":[1.0945270000000001e-05,1.173487e-05],"1441792":[0.20972012649999999,0.23793290700000003],"992":[2.3316489999999999e-05,2.3717999999999999e-05],"3968":[0.0001037365774647887,0.00011019467532467533],"6400":[0.00016044261016949149,0.00016218483333333331],"1344":[3.6298000000000004e-05,3.6954099999999999e-05],"126976":[0.0051699610000000007,0.0052328620000000005],"2883584":[0.53069113200000007,0.59640003900000005],"753664":[0.054588534499999994,0.10885956099999999],"16384":[0.00046022599999999989,0.00048967989473684215],"131072":[0.0052804490000000004,0.005915844],"458752":[0.027137809500000006,0.033048908000000002],"172032":[0.0088522219999999999,0.0091754040000000016],"12288":[0.00044099345454545454,0.00047029200000000008],"14680064":[2.5780976325,3.2600414579999999],"1536":[4.7038419999999995e-05,4.7988000000000002e-05],"25600":[0.00063921799999999999,0.00069502100000000009],"1835008":[0.24585535,0.25264427],"10752":[0.000344605,0.00036110866666666665],"21504":[0.00072375838461538448,0.00073616299999999996],"7602176":[1.4312674505,1.4796965769999999],"5632":[0.00018834544230769226,0.00020762299999999996],"10":[2.5484999999999998e-07,2.7511999999999999e-07],"3145728":[0.64577952400000005,0.70232186549999998],"245760":[0.0120554145,0.013204938500000003],"1728":[3.9523000000000001e-05,4.2194140000000006e-05],"11":[2.6338000000000002e-07,2.8201999999999998e-07],"1114112":[0.13017928699999998,0.16772168749999999],"12":[2.8841999999999998e-07,2.8897999999999998e-07],"7340032":[1.207812763,1.451922975],"7168":[0.000185532,0.000197371],"13":[2.9788000000000002e-07,3.1817e-07],"6029312":[1.2821983434999999,1.307552024],"14":[3.4760000000000002e-07,3.5457999999999999e-07],"3200":[7.5938999999999992e-05,7.8368833333333334e-05],"20":[4.3693000000000004e-07,4.6785e-07],"204800":[0.0086773319999999977,0.0088941639999999995],"15":[3.3170000000000004e-07,3.6599000000000001e-07],"13312":[0.00035115603571428573,0.00036208399999999993],"4980736":[0.94709186400000001,1.0603243120000001],"118784":[0.0047692545000000012,0.0049505270000000006],"51200":[0.0014594843333333334,0.001497778],"16":[4.0234999999999995e-07,4.1352000000000001e-07],"21":[4.6279000000000003e-07,4.9442999999999996e-07],"917504":[0.071504828500000034,0.1384778425],"22":[5.0429999999999998e-07,5.4030000000000004e-07],"4864":[0.00014717699999999996,0.00015539996666666663],"17":[3.9888000000000004e-07,4.2745999999999999e-07],"14848":[0.00041831765217391294,0.000420918],"23":[5.4135000000000001e-07,6.6873999999999999e-07],"786432":[0.069415126999999965,0.099883299499999995],"18":[4.2039999999999998e-07,4.2266e-07],"1638400":[0.194586909,0.21140255099999999],"7864320":[1.375660213,1.661891783],"24":[5.9202999999999999e-07,5.9701999999999998e-07],"14155776":[2.3365610390000002,3.0888523659999998],"19":[4.0830000000000002e-07,5.1298999999999994e-07],"30":[6.4611999999999996e-07,6.8345e-07],"25":[5.3906000000000001e-07,5.5527000000000002e-07],"31":[6.9179999999999999e-07,7.5430000000000002e-07],"1280":[3.5243230000000004e-05,3.5397349999999997e-05],"26":[5.5446999999999996e-07,5.6774999999999999e-07],"3932160":[0.60551855200000004,0.65678890300000003],"2432":[6.7605000000000001e-05,7.0718749999999994e-05],"32":[6.6922999999999996e-07,6.7723000000000004e-07],"27":[5.7262000000000005e-07,5.778e-07],"409600":[0.0225263635,0.02425151]}},{"title":"OrderedSet formUnion with Self (0% overlap)","results":{"28":[2.8739999999999999e-06,3.393e-06],"34":[3.1659999999999998e-06,3.4400000000000001e-06],"29":[2.9270000000000001e-06,3.5750000000000001e-06],"40":[3.433e-06,3.5719999999999999e-06],"17408":[0.0018115399999999999,0.00184625],"1472":[0.00013399000000000001,0.00014056499999999999],"112":[1.1799e-05,1.1804000000000001e-05],"1376256":[0.35352652200000001,0.45275635199999997],"5242880":[1.9145361219999999,1.939637447],"36":[3.3079999999999999e-06,3.3170000000000002e-06],"42":[3.5750000000000001e-06,3.8750000000000002e-06],"11534336":[4.4522235920000002,4.4692486259999997],"114688":[0.015648593999999995,0.016056829999999998],"144":[1.3142999999999999e-05,1.3623e-05],"38":[3.3340000000000002e-06,3.4300000000000002e-06],"240":[2.4613e-05,2.4924000000000001e-05],"9216":[0.00091881899999999986,0.00095549299999999997],"44":[3.8130000000000002e-06,4.2180000000000001e-06],"1664":[0.00017787200000000003,0.00019372900000000001],"196608":[0.023873196000000003,0.025544500999999997],"155648":[0.019606970000000001,0.019737462000000001],"2816":[0.00024773200000000002,0.00029058599999999996],"50":[5.4600000000000002e-06,5.6699999999999999e-06],"2359296":[0.77373577999999998,0.77697216099999999],"46":[3.9230000000000004e-06,4.0219999999999998e-06],"176":[1.6495999999999999e-05,1.6884e-05],"52":[5.4299999999999997e-06,5.5310000000000001e-06],"272":[2.5391000000000001e-05,2.7217e-05],"116":[1.2048000000000001e-05,1.2167000000000001e-05],"47104":[0.0045860900000000001,0.00676868],"6912":[0.000759543,0.00077626399999999993],"1856":[0.000190089,0.00021050500000000002],"48":[4.0550000000000001e-06,4.9420000000000003e-06],"2097152":[0.71677266900000003,0.774651329],"54":[5.1610000000000002e-06,5.322e-06],"2031616":[0.65590721399999996,0.70130814699999999],"43008":[0.0042308150000000006,0.0048944820000000003],"60":[5.7520000000000002e-06,5.7740000000000001e-06],"30720":[0.0033264659999999988,0.0034445169999999998],"56":[5.4990000000000002e-06,5.5010000000000004e-06],"62":[5.9889999999999997e-06,6.2990000000000002e-06],"58":[5.5480000000000001e-06,5.8629999999999996e-06],"3014656":[0.98653877700000003,1.058706266],"64":[5.6470000000000003e-06,6.4339999999999997e-06],"8388608":[3.4872913419999998,3.5566035710000001],"29696":[0.0033274669999999998,0.0034838669999999994],"216":[2.2195999999999999e-05,2.2756999999999999e-05],"106496":[0.015228011999999996,0.016392614999999999],"72":[6.4790000000000001e-06,7.2030000000000003e-06],"442368":[0.082492182999999983,0.102167279],"147456":[0.018541756999999999,0.018737947999999997],"4456448":[1.690872653,1.6931953260000001],"63488":[0.0074589839999999992,0.007496969],"38912":[0.0039651979999999996,0.0041819070000000003],"68":[6.2929999999999997e-06,6.3929999999999996e-06],"188416":[0.023944417999999995,0.024521590999999999],"248":[2.4145999999999999e-05,2.7498999999999999e-05],"80":[6.9879999999999998e-06,7.1169999999999998e-06],"2560":[0.00024150499999999999,0.00025520599999999996],"34816":[0.0035471909999999995,0.003636869],"3712":[0.00039259100000000002,0.00039474699999999998],"3538944":[1.4807161660000001,1.5253772699999999],"76":[7.0929999999999997e-06,8.4619999999999996e-06],"4194304":[1.6359754559999999,1.636112292],"851968":[0.22124200899999999,0.31695955499999995],"4096":[0.00042298800000000001,0.00044129400000000006],"59392":[0.0072137269999999988,0.0076811240000000018],"84":[7.0929999999999997e-06,7.6229999999999997e-06],"3276800":[1.427178963,1.5334406039999999],"55296":[0.0069792130000000023,0.0071531170000000005],"688128":[0.12598599999999999,0.171484208],"8192":[0.00088402500000000009,0.00088628000000000003],"10240":[0.00095575799999999991,0.00097673700000000031],"15872":[0.0016503039999999913,0.0017420719999999997],"92":[7.6199999999999999e-06,8.422e-06],"26624":[0.003097907,0.0032489430000000007],"1792":[0.000184888,0.000209533],"11776":[0.0011180669999999999,0.0011699270000000001],"2944":[0.000273856,0.00028011400000000004],"88":[7.6170000000000001e-06,7.6290000000000001e-06],"22528":[0.002140318,0.0021816729999999999],"1245184":[0.30966042599999999,0.41731537400000002],"15728640":[7.1539323819999998,7.1570359190000001],"96":[8.1480000000000006e-06,8.4679999999999992e-06],"1984":[0.00020662100000000001,0.000212031],"139264":[0.018095029000000002,0.019625155999999998],"475136":[0.082829988999999993,0.11764872799999999],"13631488":[6.7425551029999999,6.9360516560000001],"416":[4.5525000000000002e-05,4.6362000000000001e-05],"928":[9.4927999999999996e-05,0.000104329],"512":[4.9734999999999997e-05,5.3730999999999998e-05],"18432":[0.001800612,0.001880758],"16777216":[7.4482365379999997],"9728":[0.00090672700000000008,0.00093838699999999995],"1769472":[0.64520774800000003,0.678437917],"1703936":[0.61306820299999998,0.77104946299999999],"2048":[0.00020164599999999999,0.00021087300000000001],"14336":[0.0015637590000000001,0.001597675],"448":[5.0707000000000001e-05,5.2234999999999997e-05],"5505024":[2.006910821,2.0516350129999998],"544":[5.5992000000000002e-05,6.4314999999999997e-05],"221184":[0.034379923,0.038043745000000004],"90112":[0.010152416000000001,0.010997514999999998],"640":[5.9077999999999999e-05,6.1960999999999998e-05],"12800":[0.0015355429999999999,0.0015700100000000002],"262144":[0.038543940000000006,0.041282593999999999],"589824":[0.106952877,0.15587319499999999],"884736":[0.22943425100000001,0.33483695400000002],"6144":[0.00055199699999999982,0.00058521100000000009],"1088":[0.000114138,0.000115407],"576":[5.3497e-05,5.7905999999999998e-05],"160":[1.5350999999999999e-05,1.5437000000000001e-05],"672":[5.8739000000000001e-05,6.3767000000000001e-05],"8912896":[3.6733749499999999,3.6853561959999999],"100":[1.0334e-05,1.1625e-05],"507904":[0.091939808999999997,0.130900774],"3840":[0.00039494900000000002,0.00040674800000000002],"192":[1.7844999999999999e-05,1.804e-05],"376832":[0.052417581000000005,0.063865111999999988],"98304":[0.010791798,0.011664927],"5376":[0.00048038400000000004,0.00054513900000000004],"94208":[0.010571313000000001,0.010576433999999999],"81920":[0.0091514069999999986,0.0097292060000000007],"3407872":[1.4589046699999999,1.4826383839999999],"104":[1.0251000000000001e-05,1.0834e-05],"122880":[0.016447342,0.016884215000000001],"200":[2.1858999999999999e-05,2.2838999999999999e-05],"163840":[0.020263708999999998,0.020498703],"4063232":[1.5991117100000001,1.609271685],"5767168":[2.0973669080000001,2.110398156],"12582912":[4.9591433680000003,10.467899032],"1600":[0.000179741,0.00019812199999999996],"136":[1.3081999999999999e-05,1.3183999999999999e-05],"232":[2.3153e-05,2.4675999999999999e-05],"7077888":[3.2005973550000002,3.3968916469999999],"86016":[0.0094151789999999992,0.010031924999999997],"31744":[0.0033566940000000003,0.0035371630000000003],"168":[1.4836e-05,1.6770999999999999e-05],"622592":[0.108112755,0.154719673],"108":[1.1627000000000001e-05,1.1783999999999999e-05],"327680":[0.045595207000000006,0.053535653000000002],"2176":[0.00022477799999999999,0.00022721699999999999],"3328":[0.00037614400000000002,0.00040872900000000004],"1":[1.98e-07,2.0900000000000001e-07],"2":[2.7799999999999997e-07,2.8599999999999999e-07],"3":[3.8500000000000002e-07,4.2599999999999998e-07],"4":[3.2099999999999998e-07,3.2599999999999998e-07],"7424":[0.00081325099999999986,0.00085951199999999999],"5":[4.8999999999999997e-07,5.7299999999999996e-07],"23552":[0.002121913,0.0023973979999999998],"6":[4.4499999999999997e-07,4.46e-07],"61440":[0.0071331699999999994,0.0075416159999999993],"491520":[0.089008905000000055,0.112669072],"77824":[0.0086365690000000002,0.0091737989999999998],"7":[5.68e-07,6.2500000000000005e-07],"8":[5.4000000000000002e-07,5.6700000000000003e-07],"208":[2.2204999999999998e-05,2.3176e-05],"9":[7.2799999999999995e-07,7.5600000000000005e-07],"73728":[0.008442212000000001,0.0085577029999999998],"304":[2.8625000000000001e-05,3.0341999999999999e-05],"400":[4.6023999999999998e-05,4.9283999999999998e-05],"1310720":[0.32895323500000001,0.41897725499999999],"336":[3.0790000000000002e-05,3.3036e-05],"3670016":[1.5042881260000001,1.5386969269999999],"6656":[0.00072365699999999995,0.00075727200000000002],"15360":[0.001621574,0.0016808439999999997],"432":[4.5484e-05,4.7364000000000003e-05],"950272":[0.243828711,0.341842227],"655360":[0.120601555,0.17089490600000001],"69632":[0.0079505979999999997,0.008552479],"11264":[0.0010657819999999999,0.0010760260000000003],"2752512":[0.881587071,0.95574512300000003],"8126464":[3.486136219,3.5135274220000001],"27648":[0.003180357,0.0033202049999999997],"368":[3.2319e-05,3.6260000000000002e-05],"65536":[0.0077428369999999998,0.0079097430000000003],"16252928":[7.2779952379999999,7.4275904270000002],"464":[4.7595000000000001e-05,4.9227000000000001e-05],"1015808":[0.25977779600000001,0.333862989],"3072":[0.00027341300000000002,0.00027743599999999994],"110592":[0.015170158,0.016285541000000001],"237568":[0.037033275000000004,0.037237720000000002],"278528":[0.038849652999999998,0.042034080000000008],"496":[5.2846000000000002e-05,5.4098000000000003e-05],"13107200":[6.6431054520000004,6.8442395779999998],"9961472":[3.9214130250000001,4.0232324249999998],"5888":[0.00052109699999999999,0.00061155900000000002],"11010048":[4.2930796549999997,4.3466380659999997],"1920":[0.00019440400000000004,0.00020909800000000001],"2490368":[0.82594209399999996,0.85551330299999995],"19456":[0.001900798,0.001925909],"57344":[0.006892472000000001,0.007028300999999999],"1179648":[0.29679137700000002,0.37637913499999998],"4718592":[1.7676589970000001,1.803565885],"360448":[0.049730481999999999,0.052647553],"1572864":[0.41696155200000001,0.417740683],"53248":[0.0065370970000000004,0.0069268810000000002],"3456":[0.000372579,0.00040469800000000005],"40960":[0.004128367,0.0041706160000000003],"4608":[0.000446293,0.00045326900000000007],"13824":[0.0015830219999999999,0.001591266],"819200":[0.220201961,0.318367964],"983040":[0.24271071799999999,0.34802703299999999],"8704":[0.00087636599999999995,0.00087667799999999998],"120":[1.1197e-05,1.1858000000000001e-05],"1024":[9.7528999999999994e-05,0.00011496],"49152":[0.0050167459999999999,0.0051577290000000015],"524288":[0.092384071999999998,0.11915695599999999],"45056":[0.0043754679999999995,0.0046247470000000011],"229376":[0.035808353999999994,0.037200692],"2688":[0.00025168800000000002,0.00026067400000000002],"152":[1.4266e-05,1.5361000000000001e-05],"5120":[0.00047619099999999994,0.00054266699999999993],"1507328":[0.39240240599999998,0.51997226500000004],"1216":[0.00011487199999999999,0.000121149],"1966080":[0.64971573299999996,0.68030558499999993],"1900544":[0.64256108099999998,0.66959242399999996],"184":[1.5971e-05,1.666e-05],"7936":[0.000832265,0.00083294399999999974],"3801088":[1.5379865429999999,1.561805417],"6815744":[3.1779976759999999,3.3774230279999999],"124":[1.1753000000000001e-05,1.3482999999999999e-05],"102400":[0.014626553,0.015813559000000001],"311296":[0.042118408000000003,0.050369770999999994],"1408":[0.00012686300000000001,0.00012794],"393216":[0.057736275000000004,0.058958719],"4352":[0.0004437,0.000445332],"6553600":[3.1867782870000001,3.3114633929999999],"20480":[0.0019330950000000003,0.0020562639999999999],"608":[5.8276000000000002e-05,6.2070999999999996e-05],"2228224":[0.72897435099999996,0.73540641699999998],"36864":[0.0038190569999999994,0.0040107829999999995],"704":[6.3831000000000006e-05,6.4591999999999994e-05],"720896":[0.13586240899999999,0.187612262],"800":[9.4106999999999999e-05,0.000101665],"2621440":[0.84046689500000005,0.86680217199999998],"425984":[0.077405968000000006,0.08994007200000001],"32768":[0.0034123559999999996,0.0037466970000000002],"12058624":[4.6506139060000002,4.7989197629999998],"128":[1.2176e-05,1.3030999999999999e-05],"180224":[0.022519328999999998,0.022540640000000001],"224":[2.2677e-05,2.3904999999999999e-05],"736":[6.6248000000000007e-05,6.9237000000000001e-05],"320":[2.8337e-05,3.1600000000000002e-05],"557056":[0.098062354000000018,0.134180667],"832":[8.9696000000000003e-05,9.6587000000000002e-05],"9437184":[3.8266859210000002,4.0073924730000003],"3584":[0.00037167299999999999,0.00039208500000000002],"6291456":[2.2951709839999999,2.3138584390000001],"256":[2.4703999999999999e-05,2.8561e-05],"15204352":[7.0896739230000003,7.3756939629999998],"28672":[0.0031567409999999998,0.0033111130000000001],"768":[6.9305000000000001e-05,7.0512999999999994e-05],"212992":[0.033378813,0.03904883599999999],"864":[9.3269000000000004e-05,9.3535999999999993e-05],"352":[3.2629999999999998e-05,3.5169999999999997e-05],"253952":[0.037948105999999995,0.038623572000000009],"960":[9.8177000000000005e-05,9.9574000000000006e-05],"24576":[0.0022058030000000001,0.0022885739999999994],"7680":[0.00080206899999999987,0.000852675],"294912":[0.040979566000000009,0.046376528],"1048576":[0.26624766100000002,0.35128054399999997],"10485760":[4.088126903,4.1019751360000001],"344064":[0.048446694999999998,0.054820569999999992],"288":[2.5588999999999998e-05,2.6267000000000001e-05],"1152":[0.000107599,0.000111542],"384":[3.4276000000000002e-05,3.4434999999999998e-05],"2304":[0.000218645,0.000224272],"896":[9.7792000000000002e-05,9.9970999999999995e-05],"480":[5.0399000000000003e-05,5.4968e-05],"1441792":[0.371272359,0.47291774200000003],"992":[9.6175000000000007e-05,0.000108237],"3968":[0.00039464899999999995,0.00043913300000000008],"6400":[0.00073123000000000003,0.0007953350000000001],"1344":[0.000120167,0.00012319500000000002],"126976":[0.017017761999999999,0.017377178],"2883584":[0.93098679600000001,0.99105816999999996],"753664":[0.14153662,0.20419330599999999],"16384":[0.001782175,0.0018393160000000001],"131072":[0.017451148999999996,0.017555134],"458752":[0.085265584000000005,0.107255856],"172032":[0.020939128000000001,0.022152910000000001],"12288":[0.0011634800000000002,0.0011932170000000003],"14680064":[6.9641373150000003,8.401753888],"1536":[0.00013224799999999998,0.00014915600000000001],"25600":[0.002963285,0.0030967729999999997],"1835008":[0.65144380199999996,0.66576880700000007],"10752":[0.0010061390000000001,0.001044449],"21504":[0.0019827080000000001,0.002086082],"7602176":[3.335974453,3.3555392250000002],"5632":[0.00052500099999999998,0.00062210500000000008],"10":[6.4799999999999998e-07,7.0699999999999996e-07],"3145728":[1.0334372409999999,1.039497033],"245760":[0.037128273999999996,0.039970529999999997],"1728":[0.000180865,0.000201647],"11":[8.3099999999999996e-07,9.16e-07],"1114112":[0.27500355500000001,0.37029800599999996],"12":[7.7400000000000002e-07,8.2099999999999995e-07],"7340032":[3.2360458539999999,3.2905740039999998],"7168":[0.00078291500000000002,0.0008254540000000001],"13":[1.64e-06,1.655e-06],"6029312":[2.2136996149999999,2.214370234],"14":[1.6759999999999999e-06,1.9350000000000001e-06],"3200":[0.00038122000000000004,0.00039256299999999996],"20":[1.7999999999999999e-06,1.8980000000000001e-06],"204800":[0.03264975199999999,0.036535488000000005],"15":[1.739e-06,1.798e-06],"13312":[0.0015176089999999998,0.0015901260000000001],"4980736":[1.8337777040000001,1.863928024],"118784":[0.016240494000000001,0.017513714999999999],"51200":[0.006429611,0.0069365939999999991],"16":[1.784e-06,1.995e-06],"21":[2.1900000000000002e-06,2.2419999999999999e-06],"917504":[0.232819902,0.32045744900000001],"22":[1.886e-06,2.1009999999999999e-06],"4864":[0.00045016000000000007,0.00050271699999999996],"17":[1.9149999999999999e-06,2.2529999999999999e-06],"14848":[0.001659878,0.0016665430000000001],"23":[2.165e-06,2.4530000000000001e-06],"786432":[0.155003319,0.20279451199999998],"18":[1.6390000000000001e-06,1.9580000000000001e-06],"1638400":[0.60685337000000006,0.62435937699999999],"7864320":[3.3771760749999999,3.4127462299999998],"24":[2.0590000000000001e-06,2.3910000000000001e-06],"14155776":[6.8730688539999996,7.2881949339999998],"19":[2.0779999999999998e-06,2.1830000000000001e-06],"30":[2.9160000000000001e-06,3.4230000000000001e-06],"25":[3.0189999999999998e-06,3.0869999999999998e-06],"31":[3.3969999999999998e-06,3.8750000000000002e-06],"1280":[0.00011755400000000001,0.00012327799999999999],"26":[2.7439999999999999e-06,2.8509999999999999e-06],"3932160":[1.573519822,1.6175512219999999],"2432":[0.000231719,0.00024429700000000004],"32":[2.988e-06,3.118e-06],"27":[2.9529999999999999e-06,3.326e-06],"409600":[0.077080685999999995,0.084525166999999984]}},{"title":"OrderedSet formUnion with Self (25% overlap)","results":{"28":[2.6110000000000001e-06,2.8439999999999998e-06],"34":[2.824e-06,3.4199999999999999e-06],"29":[2.6350000000000002e-06,3.1420000000000002e-06],"40":[3.118e-06,3.3790000000000002e-06],"17408":[0.0016020139999999999,0.001725657],"1472":[0.00012318999999999999,0.00012481299999999999],"112":[1.0699e-05,1.0749e-05],"1376256":[0.31170946300000002,0.42978368499999997],"5242880":[1.812296525,1.8223885069999999],"36":[2.9179999999999998e-06,3.1030000000000002e-06],"42":[3.1530000000000001e-06,3.286e-06],"11534336":[4.0441224690000004,4.0959987619999998],"114688":[0.014968131000000001,0.015214287],"144":[1.1589e-05,1.2208999999999999e-05],"38":[3.01e-06,3.3119999999999998e-06],"240":[2.0349000000000001e-05,2.2062999999999999e-05],"9216":[0.00079772899999999995,0.00085091500000000005],"44":[3.3100000000000001e-06,4.1659999999999996e-06],"1664":[9.0932000000000003e-05,9.2020000000000003e-05],"196608":[0.021131099,0.021634735000000009],"155648":[0.018155651000000002,0.018209265999999998],"2816":[0.00021887,0.00023551299999999999],"50":[2.3640000000000002e-06,2.4049999999999998e-06],"2359296":[0.72036346299999998,0.74644880700000005],"46":[3.3680000000000002e-06,3.7019999999999999e-06],"176":[1.3560999999999999e-05,1.3959e-05],"52":[2.4839999999999998e-06,2.4940000000000002e-06],"272":[2.3884e-05,2.4094e-05],"116":[1.1001e-05,1.1590000000000001e-05],"47104":[0.004122026,0.0044475309999999994],"6912":[0.00037743099999999996,0.00039778200000000001],"1856":[0.00017248100000000002,0.000175422],"48":[3.3400000000000002e-06,4.0160000000000002e-06],"2097152":[0.69172003900000001,0.74845057599999998],"54":[2.475e-06,2.593e-06],"2031616":[0.64213711900000003,0.65390394600000001],"43008":[0.0037875000000000005,0.0040071619999999999],"60":[4.9280000000000001e-06,5.789e-06],"30720":[0.0030601960000000003,0.0031116629999999998],"56":[4.9459999999999997e-06,4.9830000000000004e-06],"62":[5.3240000000000002e-06,5.8039999999999998e-06],"58":[5.0930000000000002e-06,5.322e-06],"3014656":[0.90856107799999997,0.98271407899999996],"64":[5.1059999999999999e-06,5.6620000000000002e-06],"8388608":[3.3924756729999999,3.4209482749999998],"29696":[0.0030459690000000004,0.0030502820000000005],"216":[1.1143e-05,1.2425999999999999e-05],"106496":[0.0075216900000000001,0.0075253580000000002],"72":[5.6319999999999996e-06,6.2110000000000003e-06],"442368":[0.042559630999999987,0.053177857999999988],"147456":[0.017247428000000002,0.017296510000000005],"4456448":[1.6327551259999999,1.635770672],"63488":[0.0068932209999999997,0.006937459],"38912":[0.0035444360000000002,0.0037159469999999998],"68":[5.7189999999999998e-06,5.8309999999999997e-06],"188416":[0.020385075999999999,0.02150382],"248":[2.1806000000000001e-05,2.482e-05],"80":[6.1109999999999996e-06,6.4099999999999996e-06],"2560":[0.000228342,0.00023081499999999996],"34816":[0.0033010490000000003,0.0033544460000000005],"3712":[0.00034720699999999998,0.00035743800000000007],"3538944":[0.80361787100000004,0.81650921200000004],"76":[6.0349999999999998e-06,7.7849999999999992e-06],"4194304":[1.5657052060000001,1.569409708],"851968":[0.113086556,0.15913733099999999],"4096":[0.000372703,0.000407611],"59392":[0.0063789490000000001,0.006843654000000002],"84":[6.0889999999999996e-06,6.5690000000000001e-06],"3276800":[0.661802695,0.68340319999999999],"55296":[0.003395061,0.0036256219999999998],"688128":[0.10702706100000001,0.14265612900000002],"8192":[0.000806229,0.00081603999999999986],"10240":[0.00088551000000000016,0.000896125],"15872":[0.0015499679999999999,0.0017030179999999999],"92":[6.8569999999999997e-06,7.4789999999999999e-06],"26624":[0.001394316,0.0015111479999999999],"1792":[0.000177441,0.000188808],"11776":[0.00099678399999999969,0.0010504689999999998],"2944":[0.00022847399999999999,0.00025225099999999994],"88":[6.5939999999999999e-06,6.7560000000000002e-06],"22528":[0.001941695,0.0019953870000000004],"1245184":[0.28236034399999999,0.38978475099999998],"15728640":[6.9882622520000002,7.0283078980000004],"96":[6.8539999999999999e-06,7.0110000000000003e-06],"1984":[0.000180485,0.00018587500000000001],"139264":[0.016907296000000002,0.017315571999999998],"475136":[0.079044819000000044,0.108556579],"13631488":[3.3245064900000001,3.4185591639999999],"416":[2.0608999999999999e-05,2.1534000000000001e-05],"928":[8.8485000000000004e-05,9.6759e-05],"512":[4.4910999999999997e-05,4.8602e-05],"18432":[0.001643325,0.0017263069999999998],"16777216":[7.2150431509999997],"9728":[0.00082517799999999998,0.00084103100000000011],"1769472":[0.358975979,0.359474929],"1703936":[0.31394634999999999,0.373633881],"2048":[0.000185582,0.00018797800000000005],"14336":[0.001466525,0.001498381],"448":[4.5997e-05,4.6891999999999998e-05],"5505024":[1.8894950660000001,1.892376582],"544":[5.02e-05,5.6881e-05],"221184":[0.018081177,0.020845551],"90112":[0.0089690509999999987,0.009225922000000001],"640":[5.2108999999999999e-05,6.2502000000000006e-05],"12800":[0.00071550500000000007,0.00072221600000000013],"262144":[0.035695606000000005,0.037063286000000001],"589824":[0.096946045999999994,0.13784986099999999],"884736":[0.12791697399999999,0.17590952800000001],"6144":[0.00048752099999999998,0.00051979099999999981],"1088":[9.9168999999999999e-05,0.000104905],"576":[4.7095999999999998e-05,5.0701999999999997e-05],"160":[1.3213999999999999e-05,1.3862e-05],"672":[5.2812999999999997e-05,5.5133999999999998e-05],"8912896":[3.5386802209999999,3.5394059799999997],"100":[4.4739999999999999e-06,5.011e-06],"507904":[0.08276707300000001,0.113733686],"3840":[0.00037177499999999997,0.00037358999999999992],"192":[1.4795e-05,1.4979e-05],"376832":[0.046595658999999998,0.051676737],"98304":[0.0095509850000000014,0.0099839260000000006],"5376":[0.00042726099999999996,0.00048230000000000007],"94208":[0.0091059769999999995,0.0096336940000000017],"81920":[0.0080390329999999992,0.008683531999999999],"3407872":[0.71754022299999998,0.727087504],"104":[4.9400000000000001e-06,5.305e-06],"122880":[0.015251196,0.01552127],"200":[1.0003000000000001e-05,1.0200999999999999e-05],"163840":[0.018389375999999999,0.018737420000000005],"4063232":[1.5531881059999999,1.5710591190000001],"5767168":[1.950855743,1.9588532649999999],"12582912":[4.365951291,8.9155730749999993],"1600":[8.5186999999999996e-05,8.9065000000000002e-05],"136":[1.1571e-05,1.1768e-05],"232":[2.0712000000000001e-05,2.2334e-05],"7077888":[1.6697493969999999,1.7777122809999999],"86016":[0.0082916819999999981,0.0089179229999999995],"31744":[0.003063503,0.0035212450000000005],"168":[1.2792999999999999e-05,1.4632e-05],"622592":[0.095602956999999988,0.128713405],"108":[5.4190000000000001e-06,5.8669999999999999e-06],"327680":[0.042309786000000002,0.045952125999999996],"2176":[0.00020817200000000001,0.00023252899999999998],"3328":[0.000180526,0.00018647099999999998],"1":[1.05e-07,1.11e-07],"2":[2.4400000000000001e-07,2.53e-07],"3":[3.6399999999999998e-07,3.9400000000000001e-07],"4":[2.8799999999999998e-07,3.1399999999999998e-07],"7424":[0.00071502000000000002,0.00077222599999999999],"5":[4.2899999999999999e-07,4.8800000000000003e-07],"23552":[0.0019215220000000002,0.0020834460000000001],"6":[3.8299999999999998e-07,3.9200000000000002e-07],"61440":[0.0065965750000000004,0.007032445],"491520":[0.082854042999999974,0.105729965],"77824":[0.0078388069999999997,0.0078632579999999997],"7":[5.0999999999999999e-07,5.5199999999999997e-07],"8":[4.58e-07,4.9100000000000004e-07],"208":[1.0903999999999999e-05,1.1134e-05],"9":[6.0100000000000005e-07,6.4000000000000001e-07],"73728":[0.0075893239999999997,0.0079164149999999996],"304":[2.6735999999999999e-05,2.6755999999999999e-05],"400":[1.9774000000000001e-05,2.1365999999999998e-05],"1310720":[0.30106198099999998,0.37812889],"336":[2.6397000000000002e-05,2.9009e-05],"3670016":[1.4831527759999998,1.515911561],"6656":[0.00034943399999999998,0.000371119],"15360":[0.001491186,0.00155955],"432":[2.2410999999999999e-05,2.4553999999999999e-05],"950272":[0.23128085900000001,0.33168061199999999],"655360":[0.10502061,0.14779930799999999],"69632":[0.007288023000000002,0.0075164970000000013],"11264":[0.00093662499999999996,0.00094210300000000002],"2752512":[0.83837078200000004,0.87674081500000001],"8126464":[3.3509705470000002,3.3951022019999999],"27648":[0.0015823159999999998,0.0015896230000000001],"368":[2.7937999999999999e-05,3.1476000000000002e-05],"65536":[0.0070311750000000006,0.0077916910000000008],"16252928":[7.0658209000000003,7.1485985870000004],"464":[4.2599000000000003e-05,4.5340000000000003e-05],"1015808":[0.233863987,0.33568679899999998],"3072":[0.00023110200000000001,0.00023715999999999999],"110592":[0.007794192000000001,0.008804573999999999],"237568":[0.034219312999999994,0.035722642999999998],"278528":[0.036190047000000003,0.039204188000000001],"496":[4.7097e-05,4.8628000000000003e-05],"13107200":[3.0748769899999999,3.111791872],"9961472":[3.7376005289999998,3.7891268560000002],"5888":[0.00047726799999999998,0.000486682],"11010048":[4.0057326160000004,4.0606101399999996],"1920":[0.000185496,0.000189917],"2490368":[0.75044195700000005,0.80768566399999997],"19456":[0.001683787,0.0017262740000000003],"57344":[0.0064912499999999996,0.0066966180000000014],"1179648":[0.27121029899999999,0.37050779599999994],"4718592":[1.7049295360000001,1.716189661],"360448":[0.044757827,0.047509315000000003],"1572864":[0.35162915099999997,0.35661718199999998],"53248":[0.0030935469999999999,0.0033192709999999999],"3456":[0.00017970900000000001,0.000205293],"40960":[0.0037195980000000002,0.0038717680000000003],"4608":[0.00040912699999999991,0.00045533200000000002],"13824":[0.00079434900000000007,0.00081629099999999991],"819200":[0.10411192499999999,0.14959679699999995],"983040":[0.23052298600000001,0.315514446],"8704":[0.0007966980000000002,0.00085645600000000023],"120":[1.0222e-05,1.1059e-05],"1024":[9.4765000000000005e-05,0.000105278],"49152":[0.0043286689999999994,0.0044267029999999988],"524288":[0.084591409999999992,0.112994068],"45056":[0.0039566950000000005,0.003994297],"229376":[0.033906595000000005,0.034792597000000001],"2688":[0.00022147200000000006,0.000225632],"152":[1.2615e-05,1.3403e-05],"5120":[0.00041870500000000012,0.00044086400000000001],"1507328":[0.33839265000000002,0.43039691599999996],"1216":[0.000104083,0.000104103],"1966080":[0.63277317399999999,0.64129117499999999],"1900544":[0.63994885599999995,0.64230943000000007],"184":[1.3740000000000001e-05,1.3773e-05],"7936":[0.00076172199999999994,0.00076482100000000027],"3801088":[1.4898337150000001,1.5441241400000001],"6815744":[1.5415051719999999,1.6386298479999999],"124":[1.0637e-05,1.1413999999999999e-05],"102400":[0.0066618830000000004,0.0076861940000000004],"311296":[0.041111061999999997,0.045797525999999998],"1408":[0.000109961,0.000117005],"393216":[0.050150156000000001,0.050690307000000011],"4352":[0.00040393199999999991,0.00040411099999999997],"6553600":[1.4481113460000001,1.514409449],"20480":[0.001740047,0.0017829549999999999],"608":[4.8896000000000001e-05,5.4842000000000001e-05],"2228224":[0.69969694100000002,0.70577948200000007],"36864":[0.003426985,0.0035698880000000002],"704":[5.3616000000000003e-05,5.7027999999999997e-05],"720896":[0.115224256,0.15243464800000001],"800":[4.2732999999999999e-05,4.5493e-05],"2621440":[0.77376259000000003,0.83501255500000005],"425984":[0.037414035999999998,0.042329064],"32768":[0.0031484360000000001,0.003296579],"12058624":[4.2032340970000002,4.2797570570000003],"128":[1.1085e-05,1.2272999999999999e-05],"180224":[0.019615159,0.020341508000000001],"224":[2.0531e-05,2.1869e-05],"736":[5.6422999999999998e-05,6.0180000000000003e-05],"320":[2.4929000000000001e-05,2.6128000000000001e-05],"557056":[0.087779114999999991,0.125364419],"832":[4.3668000000000003e-05,4.4743999999999997e-05],"9437184":[3.6738527809999999,3.8258598670000001],"3584":[0.000344309,0.00036960599999999997],"6291456":[2.0366686559999998,2.0695535679999999],"256":[2.2662000000000001e-05,2.5851999999999999e-05],"15204352":[6.8868289530000002,7.1638375419999996],"28672":[0.0029621680000000003,0.0031043829999999996],"768":[5.7444000000000001e-05,6.0668999999999998e-05],"212992":[0.016834109,0.017994333999999997],"864":[4.7308999999999997e-05,4.8130000000000002e-05],"352":[2.8789000000000002e-05,3.0712e-05],"253952":[0.034399498000000001,0.036035194999999999],"960":[9.2641999999999998e-05,9.2861000000000004e-05],"24576":[0.0019544980000000003,0.0020020279999999994],"7680":[0.0007573949999999999,0.00075787100000000002],"294912":[0.039956238999999991,0.04300208400000001],"1048576":[0.23557076399999999,0.32967091199999998],"10485760":[3.8556908490000001,3.8759482200000002],"344064":[0.050418225000000004,0.056457415999999996],"288":[2.2878999999999999e-05,2.4678999999999999e-05],"1152":[9.8739000000000004e-05,0.00010587300000000003],"384":[2.9043999999999998e-05,3.0168e-05],"2304":[0.00019796700000000001,0.00020347900000000004],"896":[8.6194999999999997e-05,9.2231999999999994e-05],"480":[4.3716e-05,5.0053999999999999e-05],"1441792":[0.33281823899999996,0.43553533899999997],"992":[8.8306000000000005e-05,9.7925999999999997e-05],"3968":[0.00036255900000000004,0.000392459],"6400":[0.00032992900000000007,0.00034145099999999999],"1344":[0.000111692,0.000114045],"126976":[0.015919160000000005,0.015936786000000001],"2883584":[0.847424964,0.87323426900000001],"753664":[0.11769042100000005,0.16775917200000001],"16384":[0.001641792,0.0016645950000000001],"131072":[0.016248598999999999,0.016830194999999999],"458752":[0.080513840000000003,0.097381854000000018],"172032":[0.019118351999999998,0.019584108999999999],"12288":[0.00097650600000000025,0.0010808],"14680064":[6.7189756550000004,7.0528291980000004],"1536":[0.00012653299999999999,0.00012707800000000001],"25600":[0.0013126120000000001,0.001398098],"1835008":[0.632755717,0.642748926],"10752":[0.00091752800000000014,0.00091894399999999999],"21504":[0.0017881569999999999,0.0019206620000000005],"7602176":[3.212993306,3.3441840420000002],"5632":[0.00049555499999999974,0.00055598599999999996],"10":[5.2499999999999995e-07,5.6899999999999997e-07],"3145728":[0.89904043,0.91537627499999996],"245760":[0.034825625000000006,0.036969291000000001],"1728":[9.5147000000000002e-05,9.5532000000000006e-05],"11":[7.5099999999999999e-07,8.23e-07],"1114112":[0.25240268399999999,0.34070778699999998],"12":[6.92e-07,6.9699999999999995e-07],"7340032":[3.1972073239999999,3.1992337310000001],"7168":[0.00072797399999999983,0.00079666299999999986],"13":[7.4399999999999999e-07,7.9699999999999995e-07],"6029312":[1.994358426,2.0099291379999999],"14":[7.9899999999999999e-07,9.3900000000000003e-07],"3200":[0.00016661600000000002,0.000173158],"20":[1.6199999999999999e-06,1.7710000000000001e-06],"204800":[0.015027514,0.017245061999999999],"15":[1.5960000000000001e-06,1.714e-06],"13312":[0.00070588699999999988,0.00075236600000000019],"4980736":[1.7258947870000001,1.795549821],"118784":[0.015308242999999999,0.015664954999999998],"51200":[0.0029166640000000002,0.0031380140000000002],"16":[1.691e-06,1.781e-06],"21":[1.9630000000000001e-06,1.9889999999999999e-06],"917504":[0.224516189,0.303964279],"22":[1.68e-06,1.8199999999999999e-06],"4864":[0.00041030099999999996,0.00045043500000000001],"17":[1.7069999999999999e-06,1.9999999999999999e-06],"14848":[0.0015902900000000001,0.0016602450000000001],"23":[1.9130000000000001e-06,2.0600000000000002e-06],"786432":[0.12642866,0.16040816399999999],"18":[1.477e-06,1.761e-06],"1638400":[0.28395220999999998,0.287581007],"7864320":[3.2773034139999999,3.2958941030000002],"24":[1.8479999999999999e-06,2.1009999999999999e-06],"14155776":[3.6070886560000002,3.7143603870000002],"19":[1.8929999999999999e-06,1.9099999999999999e-06],"30":[2.6740000000000001e-06,2.898e-06],"25":[1.3829999999999999e-06,1.4309999999999999e-06],"31":[2.9119999999999998e-06,3.208e-06],"1280":[0.000105955,0.00010619400000000002],"26":[1.33e-06,1.4100000000000001e-06],"3932160":[1.522167759,1.5887717019999998],"2432":[0.00020106799999999999,0.00020851499999999999],"32":[2.7020000000000001e-06,2.7690000000000001e-06],"27":[1.516e-06,1.561e-06],"409600":[0.036460474,0.038235726000000012]}},{"title":"OrderedSet formUnion with Self (50% overlap)","results":{"28":[1.192e-06,1.291e-06],"34":[2.5280000000000002e-06,2.8909999999999999e-06],"29":[1.251e-06,1.5e-06],"40":[2.7310000000000002e-06,3.1609999999999999e-06],"17408":[0.00154715,0.0015599049999999999],"1472":[0.000110549,0.000110933],"112":[4.6310000000000002e-06,4.8550000000000001e-06],"1376256":[0.28873574899999999,0.403797344],"5242880":[1.7333115480000001,1.778692892],"36":[2.6730000000000001e-06,3.0429999999999999e-06],"42":[2.8030000000000001e-06,3.1089999999999998e-06],"11534336":[3.8709824180000001,3.9678656380000001],"114688":[0.0065423319999999997,0.0069615059999999993],"144":[1.0539e-05,1.1137e-05],"38":[2.6639999999999998e-06,2.9390000000000002e-06],"240":[9.302e-06,9.7100000000000002e-06],"9216":[0.00079682400000000001,0.000816152],"44":[2.9849999999999998e-06,3.6239999999999999e-06],"1664":[6.8127999999999996e-05,6.9406000000000006e-05],"196608":[0.019420989999999996,0.019485284999999998],"155648":[0.016745921,0.016849409999999999],"2816":[0.00020710700000000005,0.00023449199999999999],"50":[1.8950000000000001e-06,2.1289999999999999e-06],"2359296":[0.70009085399999993,0.71407559199999993],"46":[2.9689999999999999e-06,3.2899999999999998e-06],"176":[1.1571e-05,1.1572e-05],"52":[2.029e-06,2.2079999999999999e-06],"272":[2.1010999999999999e-05,2.2804000000000001e-05],"116":[5.1250000000000001e-06,5.5049999999999998e-06],"47104":[0.0036332140000000001,0.0039218280000000005],"6912":[0.00028921199999999995,0.00029484000000000004],"1856":[7.4875000000000004e-05,8.1161000000000004e-05],"48":[2.9380000000000001e-06,3.4340000000000001e-06],"2097152":[0.39818805000000002,0.42695300600000002],"54":[1.951e-06,2.3259999999999998e-06],"2031616":[0.352143857,0.35470327699999998],"43008":[0.0034821589999999999,0.0037511330000000002],"60":[2.2350000000000002e-06,2.6170000000000001e-06],"30720":[0.0014169829999999997,0.0014262319999999999],"56":[2.0789999999999999e-06,2.17e-06],"62":[2.4320000000000002e-06,2.694e-06],"58":[2.2189999999999998e-06,2.3999999999999999e-06],"3014656":[0.83988594599999999,0.93794583200000003],"64":[2.4679999999999999e-06,2.6240000000000002e-06],"8388608":[1.853030728,1.876496253],"29696":[0.001349659,0.001397155],"216":[8.456e-06,8.9129999999999992e-06],"106496":[0.0059387900000000011,0.0060864539999999998],"72":[5.0710000000000002e-06,5.4489999999999998e-06],"442368":[0.031644543999999983,0.036524017999999998],"147456":[0.016014061,0.016133023999999999],"4456448":[1.58261656,1.6164815190000001],"63488":[0.0033835520000000006,0.0034365159999999993],"38912":[0.0032173220000000003,0.0035072439999999996],"68":[5.1549999999999998e-06,5.2159999999999997e-06],"188416":[0.018785275000000001,0.020360252000000002],"248":[1.031e-05,1.1769e-05],"80":[5.4970000000000001e-06,5.7409999999999998e-06],"2560":[0.00019707499999999998,0.00020893800000000001],"34816":[0.0029899779999999999,0.0031172929999999997],"3712":[0.000159829,0.000163031],"3538944":[0.63494018200000002,0.64843041899999998],"76":[5.3759999999999999e-06,6.455e-06],"4194304":[0.88033380900000002,0.91219324300000004],"851968":[0.091591034000000016,0.12358786300000001],"4096":[0.00019013099999999999,0.00020229100000000001],"59392":[0.002911847,0.003155897],"84":[5.4099999999999999e-06,5.9150000000000001e-06],"3276800":[0.55415674999999998,0.56459064399999992],"55296":[0.0026048389999999999,0.0026922170000000002],"688128":[0.096482737000000013,0.123569156],"8192":[0.00039623699999999997,0.00043018500000000003],"10240":[0.000794826,0.00079656699999999998],"15872":[0.00073806899999999994,0.00079555500000000009],"92":[5.9510000000000003e-06,6.6549999999999998e-06],"26624":[0.001136424,0.0011726079999999999],"1792":[7.2531000000000001e-05,8.2270999999999999e-05],"11776":[0.000867273,0.00091788800000000017],"2944":[0.00020427799999999996,0.00022179600000000002],"88":[5.7180000000000001e-06,6.2879999999999998e-06],"22528":[0.0017661840000000001,0.001767387],"1245184":[0.25750252899999998,0.35154993499999998],"15728640":[3.4864396929999999,3.515057101],"96":[5.9270000000000002e-06,6.455e-06],"1984":[8.9031999999999997e-05,9.5330999999999999e-05],"139264":[0.016163993999999998,0.016314551],"475136":[0.036240046000000005,0.056699237999999999],"13631488":[2.7183086439999999,2.8431147650000002],"416":[1.5455999999999999e-05,1.6592999999999999e-05],"928":[4.0686999999999999e-05,4.3096000000000002e-05],"512":[2.1792000000000001e-05,2.4476000000000001e-05],"18432":[0.0015180739999999999,0.001586346],"16777216":[4.0050634580000004],"9728":[0.00075936499999999991,0.00078840300000000002],"1769472":[0.27308427600000001,0.27884665399999997],"1703936":[0.25780431199999998,0.313727168],"2048":[9.7300999999999996e-05,0.000109015],"14336":[0.00062800499999999973,0.00063984100000000004],"448":[1.9415999999999998e-05,1.9862999999999999e-05],"5505024":[1.8033515389999999,1.8166423300000001],"544":[4.5491000000000002e-05,5.2157999999999998e-05],"221184":[0.014248162000000009,0.016628689000000002],"90112":[0.0079631780000000013,0.0084772910000000014],"640":[4.5126000000000001e-05,5.2692000000000003e-05],"12800":[0.00055446100000000012,0.00061431799999999998],"262144":[0.019251226,0.020437750000000001],"589824":[0.087230890999999991,0.12539600200000001],"884736":[0.097152971000000005,0.14238405400000001],"6144":[0.00045160399999999998,0.00046569500000000002],"1088":[8.6345000000000001e-05,0.000100244],"576":[4.2604000000000001e-05,4.6740000000000003e-05],"160":[1.2301e-05,1.287e-05],"672":[4.6782e-05,4.7394000000000001e-05],"8912896":[3.4510245930000001,3.5197138620000001],"100":[3.3890000000000001e-06,3.8099999999999999e-06],"507904":[0.043276645999999995,0.055664619000000005],"3840":[0.00017449799999999998,0.00018322300000000002],"192":[1.2300000000000001e-05,1.3096e-05],"376832":[0.042794487999999999,0.046386571999999994],"98304":[0.0084597119999999994,0.0090283339999999972],"5376":[0.00038526400000000002,0.00040369199999999993],"94208":[0.0081001179999999999,0.0085215050000000021],"81920":[0.0073718120000000002,0.0083115670000000006],"3407872":[0.60186262299999993,0.60252820099999993],"104":[3.8650000000000003e-06,4.6929999999999998e-06],"122880":[0.0076538440000000017,0.0077016350000000001],"200":[7.515e-06,8.0949999999999996e-06],"163840":[0.016648137,0.018121154],"4063232":[0.83219038400000001,0.88004132300000004],"5767168":[1.868876142,1.906054863],"12582912":[4.0792116390000004,8.4283364699999996],"1600":[6.5741000000000006e-05,6.8113000000000003e-05],"136":[1.0369e-05,1.0601999999999999e-05],"232":[9.003e-06,9.9650000000000003e-06],"7077888":[1.3414620859999999,1.427483839],"86016":[0.0077449630000000005,0.0079784780000000007],"31744":[0.0014654339999999998,0.001553977],"168":[1.1562e-05,1.3175e-05],"622592":[0.090202059000000001,0.11301302400000002],"108":[4.2980000000000002e-06,4.3039999999999998e-06],"327680":[0.037733215000000042,0.041842303999999997],"2176":[0.00019017199999999998,0.000194093],"3328":[0.00013263399999999999,0.00014494099999999999],"1":[1.02e-07,1.09e-07],"2":[2.34e-07,2.36e-07],"3":[2.4699999999999998e-07,2.7700000000000001e-07],"4":[2.6300000000000001e-07,2.7599999999999998e-07],"7424":[0.00034854499999999996,0.00035288699999999997],"5":[4.0200000000000003e-07,4.6499999999999999e-07],"23552":[0.001763108,0.0018569139999999999],"6":[3.58e-07,3.6300000000000001e-07],"61440":[0.0030901769999999995,0.0032615669999999999],"491520":[0.041172213999999999,0.052996004999999999],"77824":[0.0070569839999999997,0.0071569880000000004],"7":[4.5200000000000002e-07,4.9800000000000004e-07],"8":[3.8299999999999998e-07,4.4000000000000002e-07],"208":[7.7149999999999998e-06,8.2600000000000005e-06],"9":[5.44e-07,5.82e-07],"73728":[0.0068311319999999993,0.0070769470000000001],"304":[2.3635e-05,2.4905999999999998e-05],"400":[1.5903999999999999e-05,1.6884e-05],"1310720":[0.274525625,0.36169992000000001],"336":[2.3946000000000001e-05,2.5673999999999998e-05],"3670016":[0.66503031000000001,0.694109525],"6656":[0.00027029100000000003,0.00029425499999999999],"15360":[0.00072211599999999997,0.00075981399999999993],"432":[1.6818000000000001e-05,1.7978999999999998e-05],"950272":[0.11348879000000001,0.15072604599999995],"655360":[0.093644270999999987,0.12984151599999999],"69632":[0.006700244000000001,0.006849949000000001],"11264":[0.000843069,0.00086986700000000008],"2752512":[0.78921912500000002,0.84832169199999996],"8126464":[1.7701816379999999,1.78647468],"27648":[0.001192832,0.001316378],"368":[2.2972e-05,2.5588e-05],"65536":[0.0036478540000000003,0.0038846029999999995],"16252928":[3.7314418169999999,3.7954213399999999],"464":[1.9089e-05,1.9862999999999999e-05],"1015808":[0.130210507,0.18191305899999999],"3072":[0.00021566199999999998,0.00022292899999999997],"110592":[0.0061426040000000003,0.0065182240000000013],"237568":[0.016065370999999991,0.016177529999999999],"278528":[0.034154599000000008,0.037082639999999951],"496":[2.2753999999999999e-05,2.3589000000000001e-05],"13107200":[2.5894882290000001,2.5992700929999999],"9961472":[3.5841450930000001,3.6620349939999999],"5888":[0.000410603,0.00044797899999999993],"11010048":[3.8485081249999999,3.8876922509999998],"1920":[8.6459999999999996e-05,8.7174000000000003e-05],"2490368":[0.74116312400000006,0.75271034299999995],"19456":[0.0015335259999999999,0.0016612969999999997],"57344":[0.002795919,0.0029053870000000002],"1179648":[0.24761201599999999,0.352091602],"4718592":[1.6495442,1.6532183059999999],"360448":[0.041305860999999992,0.043242952000000001],"1572864":[0.32015735400000001,0.32319489899999998],"53248":[0.0024452709999999997,0.0025404360000000005],"3456":[0.00014602900000000002,0.00015431700000000001],"40960":[0.003447987,0.0034762210000000003],"4608":[0.00037889999999999999,0.00038926899999999998],"13824":[0.00062182600000000002,0.000627898],"819200":[0.085232658000000003,0.118978269],"983040":[0.120720934,0.162820927],"8704":[0.00072002199999999985,0.00085963400000000007],"120":[4.6940000000000003e-06,5.6099999999999997e-06],"1024":[4.7089000000000003e-05,4.8276000000000003e-05],"49152":[0.0038624169999999999,0.0039517700000000003],"524288":[0.045443817000000011,0.057139167000000005],"45056":[0.003558851,0.0037559289999999994],"229376":[0.015181125,0.015296719],"2688":[0.00020456599999999999,0.00021011400000000001],"152":[1.1165999999999999e-05,1.2574e-05],"5120":[0.00041418200000000003,0.000416146],"1507328":[0.30833713899999998,0.414144807],"1216":[9.4975000000000005e-05,9.5298999999999997e-05],"1966080":[0.33243579899999998,0.34132240200000002],"1900544":[0.30803545300000001,0.31598879199999996],"184":[1.1806e-05,1.1929e-05],"7936":[0.00035995600000000003,0.00039113099999999997],"3801088":[0.72210982499999998,0.74042095200000002],"6815744":[1.2704923859999999,1.3396747069999999],"124":[4.9690000000000002e-06,5.2079999999999999e-06],"102400":[0.0053133690000000001,0.005840538000000001],"311296":[0.038535678999999996,0.040539501000000006],"1408":[9.8311000000000001e-05,0.00010596],"393216":[0.042842599000000002,0.047129729999999995],"4352":[0.00035510099999999992,0.00037706399999999998],"6553600":[1.217107551,1.261663228],"20480":[0.001595045,0.001648271],"608":[4.4638000000000002e-05,4.9595999999999997e-05],"2228224":[0.68726657699999993,0.69729375699999996],"36864":[0.0031654580000000003,0.003322139],"704":[4.8282000000000003e-05,5.1177999999999997e-05],"720896":[0.100125964,0.13682074799999999],"800":[3.1513000000000001e-05,3.2795e-05],"2621440":[0.73914482100000001,0.80660616399999996],"425984":[0.029696760999999999,0.037790206],"32768":[0.0016227289999999998,0.001675644],"12058624":[3.954339493,4.1358017910000004],"128":[5.3519999999999997e-06,5.5820000000000001e-06],"180224":[0.017831091,0.018558151000000002],"224":[8.2800000000000003e-06,9.5550000000000008e-06],"736":[5.0467000000000003e-05,5.2796000000000001e-05],"320":[2.1954e-05,2.2161999999999999e-05],"557056":[0.082669526999999993,0.11450604],"832":[3.3420000000000002e-05,3.4644999999999998e-05],"9437184":[3.5593374959999999,3.6994285310000001],"3584":[0.00016100200000000001,0.00016191099999999996],"6291456":[1.953913676,1.992847995],"256":[1.0967e-05,1.3012e-05],"15204352":[3.2681815470000002,3.3830063579999998],"28672":[0.0012453590000000001,0.0012910319999999999],"768":[5.0895e-05,5.3463e-05],"212992":[0.013652885,0.014440722],"864":[3.4823000000000002e-05,4.0030000000000001e-05],"352":[2.3762999999999999e-05,2.4621999999999999e-05],"253952":[0.017320701000000001,0.017912315999999998],"960":[4.4793000000000003e-05,4.6452000000000002e-05],"24576":[0.001786117,0.001796041],"7680":[0.000350269,0.00036508100000000001],"294912":[0.037258807000000005,0.040097077999999994],"1048576":[0.14512649799999999,0.194626151],"10485760":[3.6772996070000001,3.7034622399999999],"344064":[0.043983204999999997,0.048462795999999995],"288":[2.0596999999999999e-05,2.3144000000000001e-05],"1152":[8.8512999999999998e-05,9.7670000000000005e-05],"384":[2.4977000000000002e-05,2.5252000000000001e-05],"2304":[0.00017755199999999998,0.00019425599999999999],"896":[3.6032000000000003e-05,4.1010000000000002e-05],"480":[2.0029000000000001e-05,2.2489000000000001e-05],"1441792":[0.291815453,0.41525508799999999],"992":[4.4502000000000002e-05,4.6273999999999998e-05],"3968":[0.00017671599999999999,0.00020498699999999995],"6400":[0.00026845600000000003,0.00026949999999999994],"1344":[9.6459000000000006e-05,0.00010186699999999999],"126976":[0.0080725769999999992,0.008214121999999999],"2883584":[0.78032393600000005,0.86238031100000001],"753664":[0.103225468,0.146763848],"16384":[0.00085586400000000013,0.00093560500000000016],"131072":[0.0086654100000000001,0.0089975350000000009],"458752":[0.035227264000000008,0.045318903000000001],"172032":[0.017522089000000001,0.018251527],"12288":[0.00088131099999999986,0.00093966199999999975],"14680064":[3.0442727660000002,5.9059282480000004],"1536":[0.000107569,0.00011448],"25600":[0.0010468610000000003,0.00108563],"1835008":[0.28067725399999999,0.29339566700000003],"10752":[0.00080458500000000002,0.00082381100000000014],"21504":[0.0016333210000000001,0.001720259],"7602176":[1.5609254029999999,1.57779297],"5632":[0.000427973,0.00049594000000000005],"10":[4.7199999999999999e-07,4.9100000000000004e-07],"3145728":[0.84294159899999999,0.859157218],"245760":[0.017378641,0.018116442],"1728":[6.9774e-05,7.3054999999999998e-05],"11":[5.8999999999999996e-07,6.0500000000000003e-07],"1114112":[0.235433692,0.34126684899999998],"12":[5.7199999999999999e-07,6.0200000000000002e-07],"7340032":[1.4433022630000001,1.454615381],"7168":[0.000304154,0.00033021300000000005],"13":[6.6000000000000003e-07,6.7100000000000001e-07],"6029312":[1.907990053,1.918102338],"14":[6.6899999999999997e-07,7.6199999999999997e-07],"3200":[0.000138085,0.00013934900000000001],"20":[1.5039999999999999e-06,1.6530000000000001e-06],"204800":[0.012632926000000003,0.013369300000000001],"15":[7.9500000000000001e-07,8.0200000000000001e-07],"13312":[0.00055592199999999993,0.00059319800000000018],"4980736":[1.692624288,1.7194710560000002],"118784":[0.0071534390000000002,0.0072110019999999985],"51200":[0.0022873150000000003,0.002477272],"16":[8.1900000000000001e-07,8.1900000000000001e-07],"21":[1.807e-06,1.815e-06],"917504":[0.102799101,0.144777343],"22":[1.502e-06,1.624e-06],"4864":[0.00040383599999999997,0.00041861199999999996],"17":[1.5460000000000001e-06,1.891e-06],"14848":[0.00070881999999999987,0.00071278300000000004],"23":[1.7630000000000001e-06,2.0049999999999999e-06],"786432":[0.10526611600000001,0.13457770499999999],"18":[1.3370000000000001e-06,1.5969999999999999e-06],"1638400":[0.24087860800000005,0.25758182400000001],"7864320":[1.662593693,1.6672723890000001],"24":[1.703e-06,1.9319999999999999e-06],"14155776":[2.8646875660000002,2.937396229],"19":[1.6980000000000001e-06,1.7320000000000001e-06],"30":[1.2529999999999999e-06,1.3200000000000001e-06],"25":[1.156e-06,1.164e-06],"31":[1.4559999999999999e-06,1.624e-06],"1280":[9.5169999999999999e-05,9.6329000000000006e-05],"26":[1.032e-06,1.1620000000000001e-06],"3932160":[0.77234395300000003,0.79481995599999999],"2432":[0.00019896700000000003,0.00020027000000000001],"32":[1.344e-06,1.3960000000000001e-06],"27":[1.2729999999999999e-06,1.311e-06],"409600":[0.028553137999999999,0.031008879999999999]}},{"title":"OrderedSet formUnion with Self (75% overlap)","results":{"28":[9.3500000000000005e-07,1.0580000000000001e-06],"34":[1.094e-06,1.1799999999999999e-06],"29":[1.037e-06,1.1969999999999999e-06],"40":[2.4219999999999999e-06,2.6850000000000001e-06],"17408":[0.000644583,0.00070541199999999999],"1472":[9.0180999999999996e-05,0.000100251],"112":[3.444e-06,3.4829999999999999e-06],"1376256":[0.27787582900000002,0.37902940699999998],"5242880":[1.6836232209999999,1.713252282],"36":[1.1790000000000001e-06,1.254e-06],"42":[2.463e-06,2.932e-06],"11534336":[3.7600419459999999,3.7728129130000001],"114688":[0.0052693000000000002,0.0053589619999999992],"144":[4.2740000000000001e-06,4.673e-06],"38":[1.2780000000000001e-06,1.3710000000000001e-06],"240":[6.9349999999999997e-06,7.4669999999999998e-06],"9216":[0.000339771,0.00037783499999999998],"44":[2.5969999999999999e-06,3.0680000000000001e-06],"1664":[5.0699999999999999e-05,5.3122999999999999e-05],"196608":[0.018061321999999998,0.018837627000000003],"155648":[0.0090417029999999999,0.0093636640000000024],"2816":[0.00017875400000000002,0.00021814299999999999],"50":[1.437e-06,1.5489999999999999e-06],"2359296":[0.38752118599999996,0.39638076099999997],"46":[2.5629999999999999e-06,2.8229999999999999e-06],"176":[1.0020000000000001e-05,1.013e-05],"52":[1.5990000000000001e-06,1.686e-06],"272":[8.8699999999999998e-06,9.4439999999999997e-06],"116":[3.636e-06,3.6370000000000001e-06],"47104":[0.0033392930000000001,0.0035743430000000007],"6912":[0.00023219500000000001,0.00025348599999999998],"1856":[5.8891999999999998e-05,5.9150000000000001e-05],"48":[2.588e-06,3.269e-06],"2097152":[0.30745597200000002,0.34032964199999999],"54":[1.5600000000000001e-06,1.629e-06],"2031616":[0.28557534600000001,0.28975049000000003],"43008":[0.0031809240000000003,0.0033117479999999989],"60":[1.714e-06,2.142e-06],"30720":[0.001082174,0.0011060200000000001],"56":[1.733e-06,1.7349999999999999e-06],"62":[1.891e-06,2.0829999999999998e-06],"58":[1.7990000000000001e-06,1.8360000000000001e-06],"3014656":[0.7927824,0.91639982799999997],"64":[1.858e-06,2.1150000000000001e-06],"8388608":[1.48788009,1.5248132810000001],"29696":[0.0010235310000000001,0.0010645840000000001],"216":[6.297e-06,6.8719999999999996e-06],"106496":[0.0047858559999999998,0.0049310479999999995],"72":[2.272e-06,2.3609999999999999e-06],"442368":[0.025766862000000001,0.031045709999999994],"147456":[0.008153113,0.0082288070000000012],"4456448":[0.78382564099999996,0.82265259700000004],"63488":[0.0025867439999999998,0.0025976509999999999],"38912":[0.001599907,0.001724405],"68":[2.1129999999999999e-06,2.1600000000000001e-06],"188416":[0.017539909999999999,0.017954568000000001],"248":[7.6229999999999997e-06,8.5979999999999997e-06],"80":[4.746e-06,5.0479999999999998e-06],"2560":[0.00017787200000000003,0.00019099999999999998],"34816":[0.0013299939999999997,0.001346765],"3712":[0.00012529799999999998,0.00012607000000000002],"3538944":[0.55144022199999998,0.57005458899999994],"76":[2.4760000000000001e-06,3.0469999999999998e-06],"4194304":[0.70047910999999996,0.70143504899999998],"851968":[0.075714427000000001,0.10361664499999999],"4096":[0.00014705,0.000151805],"59392":[0.0022965519999999999,0.0024268049999999998],"84":[4.8069999999999999e-06,5.2639999999999999e-06],"3276800":[0.49801362199999999,0.50690373899999996],"55296":[0.0020486379999999998,0.0022027940000000001],"688128":[0.089647428000000001,0.109360892],"8192":[0.00030377799999999999,0.00033576499999999991],"10240":[0.00073515799999999986,0.00076803500000000003],"15872":[0.00056318599999999981,0.00063612500000000008],"92":[5.2889999999999997e-06,6.1929999999999998e-06],"26624":[0.00088747500000000009,0.00094276800000000008],"1792":[5.3931000000000003e-05,6.1548000000000001e-05],"11776":[0.00079312899999999984,0.00083749500000000027],"2944":[0.00019356000000000001,0.00021435700000000003],"88":[5.1399999999999999e-06,5.3199999999999999e-06],"22528":[0.0016243500000000001,0.0016259790000000001],"1245184":[0.15585402000000001,0.20501032499999999],"15728640":[2.8822033870000001,2.9338185889999999],"96":[5.2569999999999998e-06,6.5339999999999996e-06],"1984":[6.6041e-05,6.9060000000000006e-05],"139264":[0.0076246019999999986,0.0078555090000000001],"475136":[0.028934118999999998,0.045683904000000004],"13631488":[2.3688115679999999,2.5111106649999999],"416":[1.1790999999999999e-05,1.2116999999999999e-05],"928":[2.9257000000000001e-05,3.1563000000000003e-05],"512":[1.5704000000000001e-05,1.7274000000000001e-05],"18432":[0.00068521100000000002,0.00075125799999999998],"16777216":[3.141055347],"9728":[0.00036720999999999987,0.00039157900000000008],"1769472":[0.234482845,0.23910568900000001],"1703936":[0.22486430199999996,0.25446030400000003],"2048":[7.2166e-05,7.3020000000000002e-05],"14336":[0.000462774,0.00049103000000000016],"448":[1.4688999999999999e-05,1.4883e-05],"5505024":[1.7755318769999999,1.792337721],"544":[1.9993e-05,2.2072000000000001e-05],"221184":[0.012140157,0.012253299],"90112":[0.007290029,0.0078895440000000001],"640":[4.0651000000000001e-05,4.7617000000000002e-05],"12800":[0.00041279899999999999,0.00043938800000000003],"262144":[0.014898814,0.016055907000000001],"589824":[0.044607160999999999,0.067884562000000009],"884736":[0.080765469000000006,0.113531617],"6144":[0.00038078900000000003,0.00040375999999999997],"1088":[3.6772e-05,4.2376000000000002e-05],"576":[1.9015e-05,2.0477000000000001e-05],"160":[1.0682999999999999e-05,1.1148999999999999e-05],"672":[4.2048000000000001e-05,4.473e-05],"8912896":[1.6795887490000001,1.69101436],"100":[2.6450000000000001e-06,2.9909999999999998e-06],"507904":[0.033379680999999987,0.044280156000000001],"3840":[0.00013153399999999999,0.000137875],"192":[1.0596e-05,1.1348e-05],"376832":[0.039748507000000002,0.043100594000000006],"98304":[0.0077972059999999992,0.0080039320000000001],"5376":[0.00036557799999999998,0.00037863600000000001],"94208":[0.007391234,0.007847939],"81920":[0.0067772500000000003,0.007219006],"3407872":[0.52432518400000006,0.52823789300000001],"104":[2.954e-06,3.1839999999999999e-06],"122880":[0.0058731239999999995,0.0059939720000000011],"200":[5.4600000000000002e-06,6.0440000000000001e-06],"163840":[0.015671859999999999,0.016488648000000005],"4063232":[0.66293333399999999,0.68051075500000002],"5767168":[1.840585438,1.8734542809999999],"12582912":[4.0046139969999999,8.295682244],"1600":[4.7929000000000001e-05,4.9592000000000002e-05],"136":[4.1670000000000001e-06,4.2359999999999998e-06],"232":[6.4659999999999996e-06,7.5320000000000001e-06],"7077888":[1.167424496,1.236235974],"86016":[0.0072298069999999978,0.0072962679999999999],"31744":[0.0011201710000000001,0.001213078],"168":[1.0074999999999999e-05,1.1996e-05],"622592":[0.051454849999999996,0.06276759400000001],"108":[3.2349999999999999e-06,3.3280000000000002e-06],"327680":[0.036700595000000009,0.038695983999999996],"2176":[7.7410999999999995e-05,8.229e-05],"3328":[0.000104688,0.000111358],"1":[1.04e-07,1.08e-07],"2":[1.2499999999999999e-07,1.2599999999999999e-07],"3":[1.31e-07,1.4600000000000001e-07],"4":[2.41e-07,2.53e-07],"7424":[0.00024363999999999999,0.00027225700000000003],"5":[2.6899999999999999e-07,3.0400000000000002e-07],"23552":[0.0016020750000000001,0.0017426029999999999],"6":[2.96e-07,3.0600000000000001e-07],"61440":[0.0023634189999999994,0.002485382],"491520":[0.030797951,0.038512461999999997],"77824":[0.003630855000000001,0.0039108789999999999],"7":[2.8799999999999998e-07,3.1300000000000001e-07],"8":[3.3599999999999999e-07,3.5999999999999999e-07],"208":[5.7509999999999997e-06,6.1759999999999998e-06],"9":[4.89e-07,5.1500000000000005e-07],"73728":[0.003245623,0.0034026940000000004],"304":[1.0730999999999999e-05,1.2741999999999999e-05],"400":[1.1687e-05,1.2855e-05],"1310720":[0.25202348400000002,0.37952039100000001],"336":[2.1943999999999999e-05,2.2277e-05],"3670016":[0.59128238499999997,0.59950419300000002],"6656":[0.00020759400000000002,0.00020858300000000003],"15360":[0.00053043099999999983,0.00056349700000000004],"432":[1.236e-05,1.3319000000000001e-05],"950272":[0.092110506999999994,0.12388192100000001],"655360":[0.085050378999999995,0.12094252900000002],"69632":[0.0028766259999999997,0.0031578470000000005],"11264":[0.00076005799999999987,0.00081168100000000008],"2752512":[0.77692208699999998,0.81580325099999995],"8126464":[1.42369788,1.4432083259999999],"27648":[0.00094549399999999985,0.00097272000000000005],"368":[2.0483999999999999e-05,2.2994e-05],"65536":[0.0027867449999999998,0.002809116],"16252928":[2.9694487060000001,3.0414793059999998],"464":[1.4104000000000001e-05,1.4579000000000001e-05],"1015808":[0.10181058900000001,0.15063600699999999],"3072":[0.00020228100000000004,0.00020336400000000001],"110592":[0.0049572149999999992,0.0052849769999999997],"237568":[0.012830438999999999,0.012944081999999999],"278528":[0.016286203999999999,0.018329531],"496":[1.6656000000000001e-05,1.6943e-05],"13107200":[2.3214259080000001,2.3264321610000001],"9961472":[2.0429291090000001,2.0841408370000001],"5888":[0.00040107800000000002,0.00041693700000000004],"11010048":[3.7429585420000002,3.752346352],"1920":[6.1563000000000007e-05,6.3928000000000002e-05],"2490368":[0.44206030099999999,0.46029239799999999],"19456":[0.0007815299999999999,0.0008277619999999999],"57344":[0.0021415790000000002,0.0022131210000000002],"1179648":[0.13768487600000001,0.19281002799999999],"4718592":[0.87318210299999999,0.89142755299999998],"360448":[0.038444568999999998,0.039967710999999996],"1572864":[0.28919534800000002,0.31466048000000002],"53248":[0.0019147739999999999,0.002040587],"3456":[0.000107236,0.00011896300000000001],"40960":[0.0031743330000000001,0.0032644549999999994],"4608":[0.000166052,0.00018749199999999999],"13824":[0.00046474500000000002,0.00048556800000000002],"819200":[0.069801399,0.101339663],"983040":[0.096776628000000003,0.13186827100000001],"8704":[0.00030350400000000001,0.000341317],"120":[3.6909999999999999e-06,3.709e-06],"1024":[3.3887000000000003e-05,3.5165e-05],"49152":[0.0034997820000000008,0.0035763610000000001],"524288":[0.035856912000000005,0.042741784999999997],"45056":[0.0033410849999999997,0.0034623869999999995],"229376":[0.01222262,0.012361505],"2688":[0.00017757599999999995,0.00018842300000000001],"152":[5.2780000000000001e-06,5.7790000000000001e-06],"5120":[0.00037296000000000003,0.00037664900000000001],"1507328":[0.27775736000000001,0.40379784600000002],"1216":[4.7488999999999999e-05,4.9092999999999999e-05],"1966080":[0.26611778399999997,0.27438254699999998],"1900544":[0.25627769499999997,0.259544618],"184":[1.061e-05,1.1106e-05],"7936":[0.00026503100000000004,0.000267211],"3801088":[0.61982347100000001,0.62669167199999998],"6815744":[1.122365343,1.1756901040000001],"124":[3.5860000000000001e-06,4.4240000000000003e-06],"102400":[0.004290131,0.0046830809999999995],"311296":[0.020702114000000001,0.022987400999999998],"1408":[9.2031e-05,9.7931999999999997e-05],"393216":[0.040743425,0.042259055000000004],"4352":[0.00016981400000000001,0.00017130199999999997],"6553600":[1.0677951430000001,1.109028015],"20480":[0.001466672,0.001532285],"608":[2.1682999999999999e-05,2.3288000000000001e-05],"2228224":[0.34253247599999997,0.35300971399999997],"36864":[0.0014583949999999999,0.001543439],"704":[4.3758999999999999e-05,4.5197000000000001e-05],"720896":[0.090427950000000007,0.121349387],"800":[2.4136000000000001e-05,2.5181000000000002e-05],"2621440":[0.73986707899999993,0.77149791300000004],"425984":[0.02550241,0.029641404],"32768":[0.00122762,0.001271646],"12058624":[3.8757858270000001,3.9467192739999999],"128":[3.7610000000000001e-06,4.2479999999999998e-06],"180224":[0.016998437000000005,0.01740121],"224":[6.2210000000000002e-06,7.2150000000000004e-06],"736":[4.4761000000000001e-05,4.4975999999999998e-05],"320":[1.9483999999999998e-05,1.9942999999999999e-05],"557056":[0.039441237000000004,0.053592221000000037],"832":[2.6101e-05,2.6774000000000001e-05],"9437184":[1.888720744,1.9314740180000001],"3584":[0.00012220999999999998,0.00012344299999999999],"6291456":[1.947557859,1.982758078],"256":[7.7510000000000008e-06,9.3279999999999995e-06],"15204352":[2.7582497630000002,2.891172756],"28672":[0.00097791400000000008,0.0010233270000000001],"768":[4.8612999999999997e-05,4.8925999999999999e-05],"212992":[0.010880278,0.013136008000000001],"864":[2.7733999999999999e-05,2.9935999999999999e-05],"352":[2.0489999999999999e-05,2.1699e-05],"253952":[0.013914385,0.01437657],"960":[3.2203999999999999e-05,3.2252999999999998e-05],"24576":[0.0016360210000000003,0.0016379470000000001],"7680":[0.00026343199999999997,0.000275529],"294912":[0.018929305,0.020139954999999994],"1048576":[0.10847849599999999,0.15415648400000001],"10485760":[3.5393560509999999,3.626831041],"344064":[0.039426593999999995,0.040216056],"288":[1.0355e-05,1.0455000000000001e-05],"1152":[4.4555999999999998e-05,4.8409999999999999e-05],"384":[2.2050999999999999e-05,2.3543000000000001e-05],"2304":[7.9616000000000005e-05,8.8906000000000006e-05],"896":[2.6954e-05,3.1387000000000003e-05],"480":[1.4439e-05,1.645e-05],"1441792":[0.27405170300000004,0.39067295600000002],"992":[3.2669999999999997e-05,3.3563999999999999e-05],"3968":[0.00014241699999999999,0.00014532999999999999],"6400":[0.00019526599999999998,0.00019721199999999999],"1344":[8.8603000000000005e-05,9.3734999999999996e-05],"126976":[0.0061065609999999991,0.0062806430000000007],"2883584":[0.77327705199999996,0.84639361899999999],"753664":[0.094115965999999995,0.12627624900000001],"16384":[0.00062547900000000018,0.00063079200000000003],"131072":[0.0066457559999999983,0.0067827439999999985],"458752":[0.028397606000000002,0.033922336999999983],"172032":[0.016425136,0.016933491999999998],"12288":[0.00079862999999999983,0.00084498699999999995],"14680064":[2.608157576,7.7461115019999998],"1536":[9.6785000000000003e-05,0.000102422],"25600":[0.000827004,0.00084088400000000029],"1835008":[0.241758106,0.25431428099999998],"10752":[0.00071742899999999979,0.00076465000000000007],"21504":[0.0014963510000000004,0.001632437],"7602176":[1.324480678,1.336967359],"5632":[0.000371422,0.00042811000000000005],"10":[3.9299999999999999e-07,4.0600000000000001e-07],"3145728":[0.809834359,0.85785635000000005],"245760":[0.013284236,0.014445082],"1728":[5.2336999999999997e-05,5.6653999999999997e-05],"11":[5.1799999999999995e-07,5.1799999999999995e-07],"1114112":[0.121825695,0.17386223100000001],"12":[4.7700000000000005e-07,4.7899999999999999e-07],"7340032":[1.2469349160000001,1.252124016],"7168":[0.000249628,0.00026578700000000002],"13":[5.82e-07,6.2500000000000005e-07],"6029312":[1.8788578039999999,1.9049068520000001],"14":[5.4600000000000005e-07,6.1099999999999995e-07],"3200":[0.000100901,0.000101455],"20":[1.3349999999999999e-06,1.4720000000000001e-06],"204800":[0.010374714,0.010669297000000003],"15":[6.6000000000000003e-07,6.6400000000000002e-07],"13312":[0.000414246,0.00045973000000000005],"4980736":[0.99503689799999995,1.005027353],"118784":[0.005466444,0.0056806280000000009],"51200":[0.0017819659999999998,0.0018069689999999998],"16":[6.8800000000000002e-07,6.9599999999999999e-07],"21":[1.6050000000000001e-06,1.6649999999999999e-06],"917504":[0.084334684000000007,0.123102858],"22":[1.3710000000000001e-06,1.5069999999999999e-06],"4864":[0.00019514400000000004,0.00020535600000000002],"17":[7.4300000000000002e-07,8.1900000000000001e-07],"14848":[0.00054001599999999993,0.00057644899999999993],"23":[1.5829999999999999e-06,1.699e-06],"786432":[0.09431962100000002,0.12180302600000004],"18":[6.0999999999999998e-07,7.2799999999999995e-07],"1638400":[0.20760389400000001,0.219244039],"7864320":[1.3793744729999999,1.3829538100000001],"24":[1.502e-06,1.7460000000000001e-06],"14155776":[2.4759405650000001,2.5148830850000001],"19":[8.3399999999999998e-07,8.3600000000000002e-07],"30":[9.5799999999999998e-07,1.0020000000000001e-06],"25":[9.7100000000000011e-07,1.0270000000000001e-06],"31":[1.1429999999999999e-06,1.3680000000000001e-06],"1280":[8.7780000000000003e-05,9.2263999999999996e-05],"26":[7.9899999999999999e-07,8.85e-07],"3932160":[0.637764357,0.65707065799999997],"2432":[8.7744999999999994e-05,9.6226999999999999e-05],"32":[1.0759999999999999e-06,1.0809999999999999e-06],"27":[1.0580000000000001e-06,1.111e-06],"409600":[0.023178650000000002,0.024871688999999995]}},{"title":"OrderedSet formUnion with Self (100% overlap)","results":{"28":[6.2900000000000003e-07,6.7700000000000004e-07],"34":[7.3099999999999997e-07,7.9500000000000001e-07],"29":[5.82e-07,7.0800000000000004e-07],"40":[8.3600000000000002e-07,9.0500000000000002e-07],"17408":[0.00046086599999999988,0.000531888],"1472":[4.0772000000000002e-05,5.1177000000000001e-05],"112":[2.446e-06,2.4540000000000001e-06],"1376256":[0.14866544700000001,0.20427151099999999],"5242880":[0.86454713800000005,0.86854398399999999],"36":[7.4600000000000004e-07,8.8199999999999998e-07],"42":[9.2399999999999996e-07,9.7000000000000003e-07],"11534336":[2.1011562210000001,2.1656092180000002],"114688":[0.004026043,0.0041206229999999995],"144":[2.7750000000000001e-06,3.23e-06],"38":[8.1500000000000003e-07,8.9899999999999999e-07],"240":[4.7480000000000001e-06,5.169e-06],"9216":[0.000242847,0.00026608799999999999],"44":[1.0020000000000001e-06,1.33e-06],"1664":[3.646e-05,3.7756999999999998e-05],"196608":[0.010643939999999996,0.010811321],"155648":[0.0067964360000000003,0.006933486],"2816":[7.9815999999999996e-05,8.7245999999999998e-05],"50":[9.7000000000000003e-07,1.139e-06],"2359296":[0.32198565400000001,0.32348703700000003],"46":[1.023e-06,1.265e-06],"176":[3.6839999999999998e-06,4.4519999999999999e-06],"52":[1.052e-06,1.1030000000000001e-06],"272":[6.1500000000000004e-06,6.4819999999999999e-06],"116":[2.379e-06,2.6359999999999998e-06],"47104":[0.001602848,0.0016772900000000001],"6912":[0.000167753,0.000173611],"1856":[4.1152000000000002e-05,4.2907000000000001e-05],"48":[1.0610000000000001e-06,1.4950000000000001e-06],"2097152":[0.26851028900000001,0.29646989899999998],"54":[1.091e-06,1.24e-06],"2031616":[0.24934325000000002,0.25330672900000001],"43008":[0.001354222,0.0014258809999999999],"60":[1.1939999999999999e-06,1.2419999999999999e-06],"30720":[0.00080695300000000001,0.000812117],"56":[1.203e-06,1.212e-06],"62":[1.2330000000000001e-06,1.3540000000000001e-06],"58":[1.2309999999999999e-06,1.313e-06],"3014656":[0.491805822,0.55617965199999997],"64":[1.33e-06,1.356e-06],"8388608":[1.2920629400000001,1.3258336129999999],"29696":[0.00077578900000000004,0.000822707],"216":[4.408e-06,4.6650000000000002e-06],"106496":[0.0036979119999999998,0.003768314],"72":[1.5719999999999999e-06,1.672e-06],"442368":[0.019201266000000002,0.022768316],"147456":[0.0062728530000000018,0.0063024649999999984],"4456448":[0.678818849,0.685317387],"63488":[0.001870867,0.0019035220000000002],"38912":[0.001136693,0.001239066],"68":[1.5039999999999999e-06,1.5230000000000001e-06],"188416":[0.0097989540000000003,0.010125041],"248":[5.3789999999999997e-06,5.8560000000000003e-06],"80":[1.7740000000000001e-06,1.8500000000000001e-06],"2560":[6.6785000000000005e-05,7.9697000000000006e-05],"34816":[0.00096804699999999998,0.0010913869999999999],"3712":[8.6541999999999999e-05,9.5798000000000007e-05],"3538944":[0.49371241200000004,0.49403345100000001],"76":[1.5549999999999999e-06,2.0329999999999998e-06],"4194304":[0.61673163399999997,0.61764530799999995],"851968":[0.057781195,0.089822384999999977],"4096":[0.00010594000000000001,0.00010666299999999998],"59392":[0.0016259920000000001,0.0017658319999999997],"84":[1.872e-06,1.9410000000000001e-06],"3276800":[0.44228145000000002,0.46168510699999998],"55296":[0.001471055,0.001585883],"688128":[0.041050385999999994,0.057113305999999989],"8192":[0.00022211,0.000227619],"10240":[0.00028890700000000003,0.000311787],"15872":[0.000394941,0.000453936],"92":[2.119e-06,2.6350000000000002e-06],"26624":[0.000627657,0.00068614999999999974],"1792":[4.0404000000000001e-05,4.6044999999999997e-05],"11776":[0.00036858000000000003,0.00040303600000000001],"2944":[8.8630999999999999e-05,0.000103121],"88":[1.9130000000000001e-06,2.165e-06],"22528":[0.00070237699999999991,0.00075217399999999988],"1245184":[0.11936374900000001,0.16618195799999999],"15728640":[2.5510620980000001,2.5887438019999998],"96":[2.3420000000000002e-06,2.3920000000000001e-06],"1984":[4.3896000000000001e-05,4.9580999999999998e-05],"139264":[0.0056179050000000012,0.0059904859999999989],"475136":[0.020988825000000003,0.033577451000000001],"13631488":[2.1223215870000001,2.3042343999999999],"416":[8.1999999999999994e-06,8.3180000000000007e-06],"928":[2.0276999999999999e-05,2.1128000000000002e-05],"512":[1.0771000000000001e-05,1.1644000000000001e-05],"18432":[0.00050706999999999998,0.00053668999999999993],"16777216":[2.7651857949999998],"9728":[0.00026430400000000004,0.00026572900000000003],"1769472":[0.209176326,0.215832361],"1703936":[0.19643463799999999,0.213673216],"2048":[4.8096999999999997e-05,5.0445000000000002e-05],"14336":[0.00034138800000000003,0.000362426],"448":[9.6889999999999999e-06,1.0939e-05],"5505024":[0.94662254599999995,0.96058368800000005],"544":[1.3838e-05,1.4035e-05],"221184":[0.0092101660000000005,0.0092155600000000011],"90112":[0.0033974040000000006,0.003778427],"640":[1.5903999999999999e-05,1.7447000000000001e-05],"12800":[0.00030680600000000002,0.00035092200000000004],"262144":[0.011734072,0.01231047],"589824":[0.031712188999999953,0.049408913999999998],"884736":[0.063967136999999979,0.095935076000000008],"6144":[0.00019894199999999999,0.00020775899999999999],"1088":[2.6494000000000001e-05,2.9322000000000001e-05],"576":[1.3808999999999999e-05,1.3875e-05],"160":[3.6229999999999999e-06,4.3780000000000003e-06],"672":[1.6690000000000001e-05,1.8513e-05],"8912896":[1.4192513120000001,1.4450587669999999],"100":[1.875e-06,2.249e-06],"507904":[0.0247263,0.03368518999999999],"3840":[9.3404000000000002e-05,9.8995999999999999e-05],"192":[5.1649999999999997e-06,5.2140000000000004e-06],"376832":[0.021590614999999997,0.021783280999999995],"98304":[0.0041518740000000016,0.0043743380000000002],"5376":[0.00015762799999999999,0.00016159899999999998],"94208":[0.0038323419999999999,0.003874294999999999],"81920":[0.002933761,0.0029354070000000001],"3407872":[0.465886888,0.468978548],"104":[2.075e-06,2.092e-06],"122880":[0.0045931620000000005,0.0046887169999999994],"200":[3.9269999999999998e-06,4.1640000000000003e-06],"163840":[0.007282031999999999,0.0076011100000000012],"4063232":[0.59286494599999995,0.59367934099999997],"5767168":[1.033161196,1.0424316499999999],"12582912":[2.5552402980000002,6.0140030150000001],"1600":[3.3417000000000002e-05,3.4199000000000002e-05],"136":[2.7810000000000001e-06,2.8700000000000001e-06],"232":[4.5639999999999998e-06,5.0470000000000001e-06],"7077888":[1.046824441,1.092917288],"86016":[0.0031392640000000001,0.0033860640000000003],"31744":[0.00080530100000000013,0.00087226000000000003],"168":[3.7110000000000001e-06,3.7440000000000001e-06],"622592":[0.034769817999999994,0.043130921000000003],"108":[2.272e-06,2.295e-06],"327680":[0.017154860000000001,0.017279965999999997],"2176":[5.5686999999999997e-05,5.8421000000000002e-05],"3328":[7.2124000000000003e-05,8.0568999999999994e-05],"1":[1.03e-07,1.08e-07],"2":[1.2599999999999999e-07,1.29e-07],"3":[1.3199999999999999e-07,1.43e-07],"4":[1.49e-07,1.5699999999999999e-07],"7424":[0.00017705599999999995,0.000198906],"5":[1.74e-07,1.9999999999999999e-07],"23552":[0.00079657700000000003,0.00083857199999999989],"6":[2.0100000000000001e-07,2.0699999999999999e-07],"61440":[0.0017335650000000001,0.001758391],"491520":[0.022407051000000004,0.030393115999999998],"77824":[0.0025245580000000001,0.0025275649999999998],"7":[1.9600000000000001e-07,2.17e-07],"8":[2.22e-07,2.3799999999999999e-07],"208":[4.2370000000000003e-06,4.2540000000000003e-06],"9":[2.5800000000000001e-07,2.6300000000000001e-07],"73728":[0.0022988589999999995,0.0024853620000000001],"304":[7.3270000000000003e-06,8.3680000000000002e-06],"400":[8.0160000000000008e-06,8.4379999999999995e-06],"1310720":[0.13144249499999999,0.19952356299999999],"336":[7.9999999999999996e-06,8.4300000000000006e-06],"3670016":[0.50952420600000004,0.51830643300000001],"6656":[0.00015287999999999999,0.00017828200000000004],"15360":[0.00039654499999999999,0.00041297699999999997],"432":[8.6410000000000008e-06,9.1460000000000002e-06],"950272":[0.073304079000000022,0.10806062299999999],"655360":[0.037838639,0.060644025999999997],"69632":[0.0020840950000000002,0.0022385360000000002],"11264":[0.00034000600000000001,0.00034215999999999988],"2752512":[0.41560790199999997,0.41924253500000003],"8126464":[1.2423060859999999,1.2803791879999999],"27648":[0.00070536399999999977,0.00077233100000000012],"368":[9.6900000000000004e-06,1.0581000000000001e-05],"65536":[0.0018912459999999999,0.0019861990000000001],"16252928":[2.6478321559999998,2.6780721610000002],"464":[9.3700000000000001e-06,1.0319000000000001e-05],"1015808":[0.081199525000000009,0.126780796],"3072":[9.5041e-05,9.7906999999999996e-05],"110592":[0.0038282200000000002,0.0040882469999999997],"237568":[0.010029329,0.010258373000000003],"278528":[0.013287087999999999,0.013383062000000001],"496":[1.1069e-05,1.1107000000000001e-05],"13107200":[2.0249431850000001,2.1150458799999998],"9961472":[1.6704435960000001,1.702659648],"5888":[0.000191351,0.00019944],"11010048":[1.9774207690000001,1.983996461],"1920":[4.4181999999999998e-05,4.5172000000000001e-05],"2490368":[0.35250869099999999,0.36897758600000002],"19456":[0.00055855499999999997,0.00056480799999999998],"57344":[0.0015388839999999997,0.001548233],"1179648":[0.10800683,0.15318389099999999],"4718592":[0.72682259100000002,0.74788580700000007],"360448":[0.019732848000000001,0.019986038000000001],"1572864":[0.20311454700000001,0.216304354],"53248":[0.001438637,0.001442378],"3456":[8.4828999999999997e-05,8.5247000000000006e-05],"40960":[0.001261065,0.00127855],"4608":[0.00011835199999999999,0.000130574],"13824":[0.00034270399999999999,0.00035786500000000007],"819200":[0.054272844000000008,0.090416473999999969],"983040":[0.074652458000000005,0.108822372],"8704":[0.00024174600000000001,0.00024454499999999998],"120":[2.5019999999999999e-06,2.5150000000000001e-06],"1024":[2.2554000000000001e-05,2.5060000000000001e-05],"49152":[0.0017493299999999997,0.0018323739999999999],"524288":[0.025703694999999999,0.034183264000000005],"45056":[0.0014783939999999998,0.0015003360000000001],"229376":[0.0097237220000000006,0.0097959280000000006],"2688":[7.5259000000000006e-05,7.6358000000000003e-05],"152":[3.0740000000000001e-06,3.9480000000000001e-06],"5120":[0.000143506,0.00015572399999999996],"1507328":[0.18131990600000003,0.25666835499999996],"1216":[3.0488999999999999e-05,3.3121999999999999e-05],"1966080":[0.23178125199999999,0.24490779200000001],"1900544":[0.22057047799999999,0.238467559],"184":[4.4329999999999997e-06,4.549e-06],"7936":[0.00019485800000000006,0.00020461699999999998],"3801088":[0.53827708100000005,0.55549025600000002],"6815744":[0.99133600300000002,1.0450489089999999],"124":[2.5550000000000001e-06,2.8909999999999999e-06],"102400":[0.0033220960000000009,0.0035417559999999992],"311296":[0.015401729999999999,0.015515466],"1408":[3.9505000000000002e-05,4.2570000000000001e-05],"393216":[0.023678214,0.024229202999999998],"4352":[0.000116144,0.000118427],"6553600":[0.96036536400000005,0.99575317699999999],"20480":[0.00060519199999999973,0.00061440500000000027],"608":[1.4868000000000001e-05,1.5116000000000001e-05],"2228224":[0.29717628299999999,0.297329811],"36864":[0.001025623,0.0011110030000000002],"704":[1.8575000000000001e-05,1.8881000000000001e-05],"720896":[0.046448929,0.069005876999999979],"800":[1.6773999999999999e-05,1.7612e-05],"2621440":[0.38161893400000002,0.396543647],"425984":[0.018637090000000002,0.022757697],"32768":[0.00088520600000000014,0.0010194430000000001],"12058624":[2.346717945,2.390519292],"128":[2.678e-06,2.9409999999999999e-06],"180224":[0.0089011789999999986,0.009179029],"224":[4.2880000000000003e-06,4.9620000000000001e-06],"736":[1.9769e-05,2.0381999999999999e-05],"320":[7.1430000000000001e-06,7.2239999999999998e-06],"557056":[0.028877755000000015,0.041754118999999999],"832":[1.8705000000000001e-05,1.9392999999999999e-05],"9437184":[1.5767645260000001,1.6140271479999999],"3584":[8.1886999999999997e-05,8.4770000000000003e-05],"6291456":[1.2453602269999999,1.2479997410000001],"256":[5.6760000000000004e-06,6.3300000000000004e-06],"15204352":[2.4348126429999999,2.5371088840000002],"28672":[0.00069387100000000009,0.00075226600000000002],"768":[2.3819999999999999e-05,2.3941e-05],"212992":[0.0086304580000000006,0.0093116070000000013],"864":[1.9119000000000001e-05,2.1263999999999998e-05],"352":[8.3899999999999993e-06,9.0610000000000002e-06],"253952":[0.011217158999999999,0.011448696],"960":[2.1764e-05,2.2059999999999999e-05],"24576":[0.000814031,0.00085899099999999992],"7680":[0.00018356500000000001,0.000192237],"294912":[0.01446222,0.014611101999999997],"1048576":[0.08734080700000002,0.13121922999999999],"10485760":[1.809996038,1.819198321],"344064":[0.018416446999999996,0.019049415],"288":[6.3539999999999996e-06,6.4810000000000003e-06],"1152":[2.9428999999999999e-05,3.1043000000000001e-05],"384":[1.0162e-05,1.0910000000000001e-05],"2304":[5.5213999999999997e-05,6.1175999999999998e-05],"896":[2.0149e-05,2.2418000000000001e-05],"480":[9.7229999999999999e-06,1.1301000000000001e-05],"1441792":[0.164966056,0.22387853699999999],"992":[2.3042000000000001e-05,2.3099999999999999e-05],"3968":[9.9230999999999999e-05,0.000101785],"6400":[0.000144241,0.00014479900000000001],"1344":[3.9530999999999998e-05,4.0339999999999997e-05],"126976":[0.0048517810000000003,0.0048545320000000008],"2883584":[0.45426496500000002,0.48144330400000002],"753664":[0.049731645000000012,0.063944300999999967],"16384":[0.00045879800000000001,0.00045947699999999996],"131072":[0.0051097499999999997,0.0051434599999999999],"458752":[0.021391167000000003,0.024049157000000002],"172032":[0.0081450700000000008,0.0083144389999999999],"12288":[0.00040497500000000002,0.00044402499999999996],"14680064":[2.3088447009999999,2.9166119830000001],"1536":[4.6968999999999997e-05,5.1882999999999998e-05],"25600":[0.00059306599999999973,0.00065432100000000003],"1835008":[0.21633873300000001,0.21834998800000005],"10752":[0.00032960200000000002,0.00034531900000000007],"21504":[0.00063642400000000002,0.00069574100000000015],"7602176":[1.169635051,1.1772435130000001],"5632":[0.000167465,0.00019596899999999997],"10":[2.5800000000000001e-07,2.8299999999999998e-07],"3145728":[0.53576557299999994,0.55896841399999997],"245760":[0.010665793,0.011149974999999998],"1728":[3.6653000000000003e-05,3.8284000000000001e-05],"11":[2.9700000000000003e-07,3.0699999999999998e-07],"1114112":[0.097000126999999978,0.15281545899999999],"12":[3.2399999999999999e-07,3.3099999999999999e-07],"7340032":[1.07248867,1.106497708],"7168":[0.000175601,0.00018385800000000001],"13":[3.1800000000000002e-07,3.2599999999999998e-07],"6029312":[1.1264351699999999,1.1404469340000001],"14":[3.6600000000000002e-07,3.9000000000000002e-07],"3200":[7.0423e-05,7.7175000000000006e-05],"20":[4.4099999999999999e-07,5.1799999999999995e-07],"204800":[0.0083135149999999988,0.008428813999999998],"15":[3.6800000000000001e-07,3.7599999999999998e-07],"13312":[0.00030560600000000004,0.000322271],"4980736":[0.79897004199999999,0.81420236200000007],"118784":[0.0043260169999999997,0.0046370659999999996],"51200":[0.0013102740000000002,0.0013220650000000001],"16":[4.3500000000000002e-07,4.6199999999999998e-07],"21":[5.0699999999999997e-07,5.44e-07],"917504":[0.066928381999999981,0.10709896000000001],"22":[5.0800000000000005e-07,5.44e-07],"4864":[0.00013333800000000002,0.00013579799999999999],"17":[3.9999999999999998e-07,4.5200000000000002e-07],"14848":[0.00039562899999999994,0.00043090100000000003],"23":[5.1500000000000005e-07,5.7700000000000004e-07],"786432":[0.057342551000000005,0.074893316999999987],"18":[4.0200000000000003e-07,4.5200000000000002e-07],"1638400":[0.18598714,0.19364611200000001],"7864320":[1.2154543279999999,1.220852837],"24":[5.9299999999999998e-07,7.1099999999999995e-07],"14155776":[2.2124993509999999,2.2332057449999998],"19":[4.4099999999999999e-07,4.7399999999999998e-07],"30":[6.4499999999999997e-07,6.7700000000000004e-07],"25":[5.9200000000000001e-07,6.0699999999999997e-07],"31":[6.8800000000000002e-07,8.2200000000000003e-07],"1280":[3.4072999999999997e-05,3.5200999999999997e-05],"26":[5.3799999999999997e-07,6.0200000000000002e-07],"3932160":[0.56202427900000007,0.57438029899999998],"2432":[6.4036999999999997e-05,6.8042999999999999e-05],"32":[6.5000000000000002e-07,6.6700000000000003e-07],"27":[6.0500000000000003e-07,6.6899999999999997e-07],"409600":[0.017384059,0.017968094999999969]}},{"title":"OrderedSet formIntersection with Self (0% overlap)","results":{"28":[7.4600000000000004e-07,7.85e-07],"34":[8.9999999999999996e-07,1.0330000000000001e-06],"29":[6.8100000000000002e-07,8.09e-07],"40":[1.1570000000000001e-06,1.342e-06],"17408":[0.00062939199999999999,0.00066595999999999973],"1472":[6.9555999999999996e-05,8.6098000000000001e-05],"112":[2.5629999999999999e-06,2.8569999999999999e-06],"1376256":[0.21859335899999999,0.29484743499999999],"5242880":[1.2119851349999999,1.2180984719999999],"36":[9.02e-07,1.029e-06],"42":[1.415e-06,1.854e-06],"11534336":[3.4580440509999999,3.5634890220000002],"114688":[0.0044003809999999992,0.0045322629999999999],"144":[3.6600000000000001e-06,3.941e-06],"38":[1.023e-06,1.1489999999999999e-06],"240":[5.7209999999999999e-06,5.8379999999999998e-06],"9216":[0.00036643400000000006,0.00037299800000000009],"44":[1.4789999999999999e-06,1.592e-06],"1664":[4.6502999999999998e-05,4.9667999999999999e-05],"196608":[0.018703819999999999,0.018976958000000006],"155648":[0.0085874279999999994,0.0087333899999999989],"2816":[0.00012914600000000004,0.00013556200000000001],"50":[1.088e-06,1.159e-06],"2359296":[0.38596975100000003,0.39051689099999998],"46":[1.3599999999999999e-06,1.6509999999999999e-06],"176":[6.6599999999999998e-06,8.1589999999999993e-06],"52":[1.2219999999999999e-06,1.2300000000000001e-06],"272":[7.4329999999999998e-06,8.1319999999999994e-06],"116":[2.74e-06,2.9730000000000002e-06],"47104":[0.0025827409999999995,0.002756217],"6912":[0.000199796,0.00021562799999999999],"1856":[5.5937000000000003e-05,5.7633000000000002e-05],"48":[1.7379999999999999e-06,3.5839999999999999e-06],"2097152":[0.29903466699999998,0.33246974600000001],"54":[1.1650000000000001e-06,1.2810000000000001e-06],"2031616":[0.27096945500000003,0.27285857699999999],"43008":[0.001949686,0.0021249869999999996],"60":[1.364e-06,1.409e-06],"30720":[0.0009894560000000001,0.00099086600000000019],"56":[1.342e-06,1.375e-06],"62":[1.392e-06,2.0020000000000001e-06],"58":[1.3990000000000001e-06,1.4300000000000001e-06],"3014656":[0.85328364099999998,0.94235127299999999],"64":[1.4529999999999999e-06,1.5549999999999999e-06],"8388608":[1.5198834109999999,1.5496521250000002],"29696":[0.00089440799999999997,0.00094664100000000002],"216":[4.9030000000000003e-06,5.2050000000000001e-06],"106496":[0.0039037860000000002,0.0041163099999999998],"72":[1.697e-06,1.7940000000000001e-06],"442368":[0.024521302999999994,0.031002563],"147456":[0.0075083439999999984,0.0075931700000000006],"4456448":[0.80092927000000003,0.82328027400000003],"63488":[0.0023373700000000001,0.0023812030000000001],"38912":[0.0015202740000000001,0.0016905960000000002],"68":[1.6869999999999999e-06,1.823e-06],"188416":[0.015335682,0.015673427],"248":[6.2160000000000003e-06,7.4839999999999998e-06],"80":[2.402e-06,2.4030000000000001e-06],"2560":[0.00010618799999999998,0.000109447],"34816":[0.0013173849999999997,0.0013202660000000001],"3712":[0.00011294899999999999,0.000116789],"3538944":[0.51317993200000001,0.51760989899999998],"76":[2.5689999999999999e-06,3.6219999999999998e-06],"4194304":[0.70399199800000001,0.70757060299999996],"851968":[0.068066110000000013,0.089838611999999984],"4096":[0.00014308299999999999,0.00014482900000000002],"59392":[0.0020815720000000003,0.0022485349999999999],"84":[2.4899999999999999e-06,2.5739999999999998e-06],"3276800":[0.451122931,0.46803525700000004],"55296":[0.001826416,0.0019005339999999999],"688128":[0.064532680999999981,0.086510965999999995],"8192":[0.000281861,0.00029515499999999996],"10240":[0.000449405,0.000464041],"15872":[0.00054301100000000004,0.00056759599999999996],"92":[3.5480000000000002e-06,4.2529999999999998e-06],"26624":[0.00075635999999999998,0.00081231099999999991],"1792":[5.4465000000000001e-05,6.0769e-05],"11776":[0.00066094700000000038,0.00067302899999999979],"2944":[0.00015418700000000002,0.000161347],"88":[2.8270000000000002e-06,4.3959999999999999e-06],"22528":[0.0011591260000000001,0.001276148],"1245184":[0.17054248000000005,0.224692797],"15728640":[2.9175440780000002,2.9523948089999998],"96":[3.563e-06,5.3360000000000002e-06],"1984":[6.2006000000000002e-05,6.3144000000000004e-05],"139264":[0.0064942050000000003,0.0067294779999999997],"475136":[0.027637879000000032,0.041781254000000004],"13631488":[2.294607472,2.3152110939999999],"416":[9.1460000000000002e-06,9.2639999999999997e-06],"928":[2.6197999999999999e-05,2.8201999999999999e-05],"512":[1.4673e-05,1.5469e-05],"18432":[0.0007049249999999998,0.00075590100000000001],"16777216":[3.3278574170000002],"9728":[0.00037842100000000004,0.00041411700000000014],"1769472":[0.21491812299999999,0.22920676700000001],"1703936":[0.20013313499999999,0.217892742],"2048":[6.4214999999999994e-05,6.7008000000000006e-05],"14336":[0.00042633700000000005,0.00043657599999999999],"448":[1.1987000000000001e-05,1.2673999999999999e-05],"5505024":[1.414206659,1.414957332],"544":[1.9188e-05,2.0146e-05],"221184":[0.0096608389999999992,0.010890770000000001],"90112":[0.0052844299999999997,0.0057183799999999995],"640":[2.4284999999999999e-05,2.6381e-05],"12800":[0.000359234,0.00037100700000000002],"262144":[0.013242142,0.015161262],"589824":[0.044915379999999991,0.06688709800000002],"884736":[0.074804340000000025,0.100846964],"6144":[0.00035687800000000003,0.00038207000000000009],"1088":[3.7715000000000001e-05,3.9014999999999998e-05],"576":[1.8301999999999999e-05,1.9582e-05],"160":[5.7359999999999998e-06,5.9209999999999997e-06],"672":[3.0312999999999999e-05,3.2703999999999997e-05],"8912896":[1.7348475489999999,1.7722047160000001],"100":[2.1090000000000001e-06,2.2249999999999999e-06],"507904":[0.03278912400000001,0.04245873],"3840":[0.000116453,0.00012307999999999999],"192":[9.4439999999999997e-06,1.1864e-05],"376832":[0.036615061000000004,0.036957468],"98304":[0.0076201319999999991,0.0081633720000000003],"5376":[0.00023346199999999998,0.00023616000000000002],"94208":[0.0063176050000000013,0.0065794790000000018],"81920":[0.0042437129999999997,0.0043059990000000005],"3407872":[0.48426628800000004,0.48584568400000006],"104":[2.1040000000000001e-06,2.2929999999999999e-06],"122880":[0.0051367190000000005,0.0053367149999999997],"200":[4.1339999999999997e-06,4.5789999999999997e-06],"163840":[0.0094989940000000002,0.010068488],"4063232":[0.66373486199999998,0.66756434600000003],"5767168":[1.6486493630000001,1.6927459740000002],"12582912":[5.03740217,11.048608772],"1600":[4.3139000000000002e-05,4.3838999999999998e-05],"136":[3.4520000000000002e-06,3.9940000000000002e-06],"232":[5.5010000000000004e-06,6.5200000000000003e-06],"7077888":[1.1297283680000001,1.197320387],"86016":[0.0045516409999999995,0.0050087540000000007],"31744":[0.0010652490000000001,0.0011142980000000001],"168":[5.9939999999999997e-06,6.951e-06],"622592":[0.048169892999999971,0.067900765000000002],"108":[2.5610000000000001e-06,2.5780000000000001e-06],"327680":[0.023269967999999999,0.025693968000000001],"2176":[7.7707999999999995e-05,8.0978999999999998e-05],"3328":[9.1391000000000006e-05,9.8696000000000005e-05],"1":[1.43e-07,1.5099999999999999e-07],"2":[1.68e-07,1.6999999999999999e-07],"3":[1.7100000000000001e-07,1.8400000000000001e-07],"4":[1.8199999999999999e-07,1.9500000000000001e-07],"7424":[0.00023758000000000004,0.00026315099999999999],"5":[2.1299999999999999e-07,2.4699999999999998e-07],"23552":[0.001327852,0.0014399510000000001],"6":[2.3799999999999999e-07,2.4499999999999998e-07],"61440":[0.0022729439999999998,0.0022814670000000001],"491520":[0.029649926,0.040619229999999999],"77824":[0.0035209859999999994,0.003650861],"7":[2.34e-07,2.5899999999999998e-07],"8":[2.48e-07,2.7599999999999998e-07],"208":[4.6229999999999996e-06,4.7840000000000003e-06],"9":[2.8900000000000001e-07,2.9400000000000001e-07],"73728":[0.0031833460000000001,0.0032584790000000003],"304":[9.8719999999999997e-06,1.0818999999999999e-05],"400":[8.9069999999999996e-06,9.3950000000000007e-06],"1310720":[0.177765752,0.25844371199999999],"336":[1.3336000000000001e-05,1.4398e-05],"3670016":[0.55290258000000003,0.56384178499999993],"6656":[0.00018659700000000002,0.000195465],"15360":[0.00048307500000000002,0.00054078700000000015],"432":[1.022e-05,1.0482999999999999e-05],"950272":[0.083514292999999989,0.111467845],"655360":[0.056369018999999999,0.076424119000000013],"69632":[0.0028775580000000001,0.002893002],"11264":[0.00056046600000000002,0.0005891519999999999],"2752512":[0.59758809800000001,0.60987977999999998],"8126464":[1.445959583,1.465130579],"27648":[0.00083598799999999997,0.00085668300000000012],"368":[1.5315000000000002e-05,1.6705e-05],"65536":[0.0025185470000000003,0.002598422],"16252928":[3.051869194,3.0864585149999999],"464":[1.1623999999999999e-05,1.3016999999999999e-05],"1015808":[0.094805535999999996,0.13940335000000001],"3072":[0.000169629,0.000195105],"110592":[0.0041808700000000006,0.004418206],"237568":[0.011131335000000003,0.011665981000000002],"278528":[0.015595202000000002,0.016982398999999999],"496":[1.3920999999999999e-05,1.4195999999999999e-05],"13107200":[2.1317296539999999,2.1892602829999999],"9961472":[2.2108786490000001,2.259757553],"5888":[0.00031759799999999999,0.00034551999999999999],"11010048":[2.9724358720000001,2.996053817],"1920":[5.6580999999999999e-05,5.9654000000000002e-05],"2490368":[0.45343753499999995,0.48352194100000001],"19456":[0.00077415600000000013,0.00077490100000000004],"57344":[0.001902391,0.0019192670000000001],"1179648":[0.13389856,0.18159867199999999],"4718592":[0.91044154899999996,0.91860209500000001],"360448":[0.029344546999999999,0.031183477000000005],"1572864":[0.35970527899999999,0.41533995400000001],"53248":[0.001720325,0.001792049],"3456":[9.6539000000000005e-05,0.000102488],"40960":[0.001806883,0.0019783190000000001],"4608":[0.000163029,0.00017402000000000002],"13824":[0.00041101700000000007,0.00042413100000000001],"819200":[0.063985337000000003,0.090945830000000005],"983040":[0.088014023000000025,0.12713969899999999],"8704":[0.00030420299999999996,0.00031356799999999996],"120":[2.8420000000000001e-06,2.8710000000000001e-06],"1024":[3.0698000000000003e-05,3.4813e-05],"49152":[0.0030808889999999998,0.0032476420000000007],"524288":[0.034523578999999999,0.049187529000000001],"45056":[0.0022798389999999997,0.0023237760000000005],"229376":[0.010609903,0.010801142999999999],"2688":[0.000111965,0.00012073],"152":[4.3900000000000003e-06,5.2190000000000003e-06],"5120":[0.000217989,0.000221227],"1507328":[0.29830305699999998,0.41562366099999998],"1216":[4.3325999999999998e-05,4.4227000000000002e-05],"1966080":[0.24768207099999995,0.25407761099999998],"1900544":[0.231256241,0.25080198199999998],"184":[8.1899999999999995e-06,9.3039999999999994e-06],"7936":[0.00025193500000000001,0.00026244299999999995],"3801088":[0.57904292199999996,0.58398589899999997],"6815744":[1.0535709049999999,1.1220330350000001],"124":[3.0079999999999998e-06,3.6150000000000001e-06],"102400":[0.0035807180000000001,0.0037652439999999996],"311296":[0.019600900000000004,0.024208748999999998],"1408":[6.1162999999999997e-05,6.8961999999999995e-05],"393216":[0.042201020000000006,0.046867205000000002],"4352":[0.000146828,0.00016084999999999998],"6553600":[1.0219453569999999,1.062727089],"20480":[0.00086727499999999982,0.00086737299999999995],"608":[2.1500000000000001e-05,2.3422999999999999e-05],"2228224":[0.33512067200000001,0.347434939],"36864":[0.0014273600000000003,0.0015118200000000001],"704":[2.9912000000000001e-05,3.7293999999999999e-05],"720896":[0.077736605,0.10229292600000001],"800":[2.0988e-05,2.1101999999999999e-05],"2621440":[0.50271903100000004,0.52791034999999997],"425984":[0.023176423000000002,0.028978377],"32768":[0.0011469689999999999,0.001262624],"12058624":[4.0877485460000003,4.3009913659999999],"128":[2.9289999999999998e-06,3.4850000000000001e-06],"180224":[0.01279274,0.013507792999999995],"224":[5.1569999999999999e-06,5.5289999999999999e-06],"736":[3.6263999999999997e-05,3.6581000000000001e-05],"320":[1.1484999999999999e-05,1.1576999999999999e-05],"557056":[0.039405058,0.051913458999999995],"832":[2.2042999999999999e-05,2.5162000000000001e-05],"9437184":[2.0262125279999998,2.0811586219999998],"3584":[0.000107927,0.00011168200000000002],"6291456":[2.4825948000000002,2.5265211340000002],"256":[6.584e-06,7.8879999999999997e-06],"15204352":[2.7734586509999999,2.8402190279999999],"28672":[0.00088217199999999997,0.00091532999999999979],"768":[4.6335999999999998e-05,4.9481000000000003e-05],"212992":[0.0089851790000000011,0.010505090999999999],"864":[2.3879e-05,2.4447000000000002e-05],"352":[1.3478e-05,1.6563e-05],"253952":[0.012935779,0.013137297000000001],"960":[2.9374999999999999e-05,3.0127000000000001e-05],"24576":[0.0016146330000000001,0.0016514400000000001],"7680":[0.000253618,0.00026146600000000002],"294912":[0.018117314000000002,0.020133242999999999],"1048576":[0.101944795,0.14886677200000001],"10485760":[2.535776475,2.5510764369999999],"344064":[0.027856903999999995,0.029295155],"288":[9.2450000000000004e-06,9.4749999999999999e-06],"1152":[4.0036000000000001e-05,4.8284000000000001e-05],"384":[1.588e-05,1.7492000000000001e-05],"2304":[8.3033000000000003e-05,9.9346999999999996e-05],"896":[2.6208999999999999e-05,2.7866000000000001e-05],"480":[1.2269999999999999e-05,1.4195999999999999e-05],"1441792":[0.25241143999999999,0.34730148399999999],"992":[3.1112999999999998e-05,3.1174999999999999e-05],"3968":[0.00012485,0.000135306],"6400":[0.00017396799999999999,0.00017632500000000002],"1344":[6.1586000000000003e-05,6.1692999999999994e-05],"126976":[0.0054858419999999995,0.0055098269999999993],"2883584":[0.71551959600000004,0.73257083099999998],"753664":[0.090804954000000007,0.118607379],"16384":[0.00058995900000000014,0.00059111700000000027],"131072":[0.0058332660000000001,0.0059051800000000003],"458752":[0.027180269,0.034557286],"172032":[0.011157623,0.011354875],"12288":[0.00078689299999999999,0.0008240919999999999],"14680064":[2.5763328909999998,2.849830163],"1536":[8.8158999999999994e-05,9.6898999999999995e-05],"25600":[0.00068764899999999992,0.000770478],"1835008":[0.21424924000000001,0.23061567699999999],"10752":[0.00049307399999999981,0.00053070799999999996],"21504":[0.0010168740000000001,0.0011287339999999997],"7602176":[1.273658924,1.3026978219999998],"5632":[0.000293701,0.00032235899999999998],"10":[3.1199999999999999e-07,3.3599999999999999e-07],"3145728":[1.0209949949999999,1.070436178],"245760":[0.01181897,0.012962312],"1728":[5.0195000000000003e-05,5.0376e-05],"11":[3.2899999999999999e-07,3.3999999999999997e-07],"1114112":[0.11864272300000001,0.186930977],"12":[3.53e-07,4.0699999999999998e-07],"7340032":[1.202905503,1.237224294],"7168":[0.000221549,0.000221788],"13":[3.9700000000000002e-07,4.34e-07],"6029312":[1.977403507,1.988470009],"14":[4.51e-07,4.8599999999999998e-07],"3200":[9.1150999999999995e-05,9.3168e-05],"20":[5.2600000000000002e-07,6.3300000000000002e-07],"204800":[0.0085892639999999992,0.0093878820000000002],"15":[4.7399999999999998e-07,5.3300000000000002e-07],"13312":[0.00039509899999999999,0.00040084500000000004],"4980736":[1.0542446089999999,1.0779224649999999],"118784":[0.004854545,0.0050762819999999997],"51200":[0.0016222889999999996,0.001703104],"16":[4.6899999999999998e-07,5.1099999999999996e-07],"21":[6.9299999999999997e-07,6.9400000000000005e-07],"917504":[0.07712134000000001,0.11233006700000001],"22":[6.6599999999999996e-07,7.9699999999999995e-07],"4864":[0.000183642,0.00019922400000000002],"17":[4.4999999999999998e-07,5.5400000000000001e-07],"14848":[0.00049651100000000004,0.00050612499999999985],"23":[7.7599999999999996e-07,9.8599999999999996e-07],"786432":[0.10303056300000001,0.160201171],"18":[5.3200000000000005e-07,5.5000000000000003e-07],"1638400":[0.181315421,0.190423596],"7864320":[1.3480961900000001,1.3576528880000001],"24":[1.0410000000000001e-06,1.1620000000000001e-06],"14155776":[2.4522185250000001,2.4744575950000001],"19":[5.06e-07,5.5899999999999996e-07],"30":[6.9100000000000003e-07,7.3799999999999996e-07],"25":[6.0900000000000001e-07,6.5400000000000001e-07],"31":[7.7300000000000005e-07,9.0500000000000002e-07],"1280":[5.0739999999999999e-05,5.2051e-05],"26":[6.8500000000000001e-07,6.8800000000000002e-07],"3932160":[0.62341523899999995,0.64535498300000005],"2432":[9.1215e-05,9.8894000000000006e-05],"32":[7.8800000000000002e-07,8.1800000000000005e-07],"27":[7.06e-07,7.2699999999999999e-07],"409600":[0.021685826000000019,0.023148202]}},{"title":"OrderedSet formIntersection with Self (25% overlap)","results":{"28":[1.1379999999999999e-06,1.195e-06],"34":[1.491e-06,1.575e-06],"29":[9.8899999999999998e-07,1.2899999999999999e-06],"40":[1.821e-06,2.1610000000000001e-06],"17408":[0.0010092810000000001,0.0010976250000000001],"1472":[9.4598000000000005e-05,9.9889000000000005e-05],"112":[5.0610000000000003e-06,5.2610000000000001e-06],"1376256":[0.26380558499999995,0.34286515299999998],"5242880":[1.3999784690000001,1.4204312400000001],"36":[1.539e-06,1.544e-06],"42":[1.8369999999999999e-06,1.9649999999999998e-06],"11534336":[3.81023646,3.8505345649999998],"114688":[0.0079992139999999993,0.0081361190000000007],"144":[6.2929999999999997e-06,7.5660000000000001e-06],"38":[1.598e-06,2.3130000000000001e-06],"240":[1.1258e-05,1.1766000000000001e-05],"9216":[0.000536612,0.00054501599999999984],"44":[1.8250000000000001e-06,2.2579999999999998e-06],"1664":[8.9503e-05,9.2983000000000001e-05],"196608":[0.021187031999999998,0.021788895000000003],"155648":[0.012244990000000001,0.01355636],"2816":[0.00017160499999999997,0.000176121],"50":[1.722e-06,1.778e-06],"2359296":[0.48779909500000002,0.49882658000000002],"46":[2.046e-06,2.1179999999999999e-06],"176":[9.8139999999999995e-06,1.0575e-05],"52":[1.7570000000000001e-06,1.8479999999999999e-06],"272":[1.4102e-05,1.5926e-05],"116":[5.259e-06,5.8279999999999999e-06],"47104":[0.003326889,0.0037350340000000004],"6912":[0.00039064199999999991,0.00039708800000000003],"1856":[9.8054999999999995e-05,0.000102203],"48":[2.176e-06,3.6509999999999999e-06],"2097152":[0.39501344900000002,0.43103702700000002],"54":[1.722e-06,1.829e-06],"2031616":[0.35709349099999999,0.37076708199999997],"43008":[0.0027814129999999999,0.0029654009999999999],"60":[2.029e-06,2.0640000000000001e-06],"30720":[0.0018071319999999999,0.0018197250000000001],"56":[1.9709999999999998e-06,1.9920000000000002e-06],"62":[2.4889999999999998e-06,3.0589999999999998e-06],"58":[2.0099999999999998e-06,2.0700000000000001e-06],"3014656":[0.90755337300000005,0.97898748999999996],"64":[2.5469999999999999e-06,2.6740000000000001e-06],"8388608":[2.0134452349999998,2.0720381680000002],"29696":[0.0016753830000000001,0.0017170670000000003],"216":[1.0217000000000001e-05,1.2058999999999999e-05],"106496":[0.0073238649999999988,0.0077939469999999999],"72":[2.9019999999999999e-06,3.1319999999999998e-06],"442368":[0.041278029000000001,0.050517012],"147456":[0.011031922,0.011074726],"4456448":[1.011985535,1.045816817],"63488":[0.0040651200000000002,0.0040970220000000005],"38912":[0.0023264180000000002,0.0025990799999999997],"68":[2.8890000000000002e-06,3.1530000000000001e-06],"188416":[0.01849924,0.019226363],"248":[1.1671999999999999e-05,1.4028e-05],"80":[3.3840000000000001e-06,3.8689999999999997e-06],"2560":[0.00016191600000000001,0.00016640200000000001],"34816":[0.0020444529999999999,0.002079787],"3712":[0.00019786700000000006,0.000199631],"3538944":[0.72851648200000008,0.73547624200000006],"76":[2.9840000000000001e-06,4.746e-06],"4194304":[0.91988511699999997,0.925864303],"851968":[0.106820285,0.142577115],"4096":[0.00024170700000000002,0.000242038],"59392":[0.0037570500000000005,0.003856108],"84":[3.5420000000000001e-06,3.9129999999999996e-06],"3276800":[0.656492148,0.67419468100000002],"55296":[0.003443134,0.0036037690000000006],"688128":[0.083210019999999982,0.112674065],"8192":[0.00047025999999994445,0.00048553400000000003],"10240":[0.00066560199999999984,0.00066781399999999986],"15872":[0.00090961199999999996,0.001059801],"92":[4.1060000000000002e-06,5.7370000000000003e-06],"26624":[0.0015344450000000002,0.001582069],"1792":[0.000104378,0.000106197],"11776":[0.00082198699999999993,0.00082838600000000007],"2944":[0.000189352,0.000194475],"88":[3.703e-06,4.6750000000000001e-06],"22528":[0.0015388839999999997,0.0016073320000000002],"1245184":[0.20156452300000005,0.27714570900000002],"15728640":[4.0643687770000003,4.0917880899999997],"96":[5.553e-06,6.2659999999999998e-06],"1984":[0.000109984,0.000111359],"139264":[0.010289618,0.010315626],"475136":[0.044530003999999998,0.065577081999999967],"13631488":[3.3851471860000002,3.4390750890000001],"416":[2.0489999999999999e-05,2.0565999999999999e-05],"928":[4.7683999999999999e-05,5.1823000000000002e-05],"512":[2.6998000000000001e-05,2.8031e-05],"18432":[0.0010852749999999999,0.00115284],"16777216":[4.4982527540000001],"9728":[0.00055926800000000003,0.00058499099999999987],"1769472":[0.30992350899999999,0.33035024999999996],"1703936":[0.28939330800000002,0.301144254],"2048":[0.000114523,0.000117694],"14336":[0.00080429700000000004,0.00081101799999999994],"448":[2.4189000000000002e-05,2.6186e-05],"5505024":[1.5695196199999999,1.5861421359999999],"544":[3.2814999999999997e-05,3.3136999999999998e-05],"221184":[0.017058712,0.019072843999999999],"90112":[0.0069635929999999997,0.0074938939999999992],"640":[3.8730999999999999e-05,3.9928000000000001e-05],"12800":[0.00074481999999999999,0.00082898100000000001],"262144":[0.020982215000000002,0.023822745000000003],"589824":[0.062997425999999981,0.092753435999999995],"884736":[0.114306484,0.147487866],"6144":[0.00045162199999999994,0.00047803599999999999],"1088":[6.0911e-05,6.3769000000000006e-05],"576":[2.9533e-05,3.2657000000000003e-05],"160":[8.2479999999999996e-06,8.9639999999999992e-06],"672":[4.1981999999999999e-05,4.316e-05],"8912896":[2.2515520100000002,2.295639741],"100":[4.1930000000000003e-06,4.7439999999999998e-06],"507904":[0.05005598,0.06595583200000002],"3840":[0.00021450399999999999,0.000224627],"192":[1.2269999999999999e-05,1.4314000000000001e-05],"376832":[0.041344011,0.045405358],"98304":[0.0091350259999999992,0.0093456949999999994],"5376":[0.00032356400000000003,0.00035016099999999998],"94208":[0.0080276070000000008,0.0082791059999999979],"81920":[0.0058316819999999995,0.006169359000000001],"3407872":[0.681236179,0.69551605100000002],"104":[4.2220000000000004e-06,4.7840000000000003e-06],"122880":[0.008803687000000001,0.0089438060000000021],"200":[8.9479999999999997e-06,1.1223000000000001e-05],"163840":[0.013115166000000003,0.014127296000000001],"4063232":[0.87098243600000003,0.91262021999999998],"5767168":[1.8187570229999999,1.8293900439999999],"12582912":[5.0638751490000002,11.074287023],"1600":[9.2670000000000006e-05,9.3559000000000003e-05],"136":[6.1879999999999999e-06,7.464e-06],"232":[1.1151999999999999e-05,1.2305e-05],"7077888":[1.6572029129999999,1.759005084],"86016":[0.006407396000000001,0.0068720490000000007],"31744":[0.0018059180000000001,0.001940151],"168":[8.9250000000000001e-06,9.0739999999999999e-06],"622592":[0.066219021000000003,0.093637985999999993],"108":[4.9520000000000002e-06,5.5899999999999998e-06],"327680":[0.03125003199999999,0.034062851999999998],"2176":[0.00012856099999999999,0.00013323800000000001],"3328":[0.00019494599999999996,0.00021227],"1":[2.04e-07,2.1400000000000001e-07],"2":[2.29e-07,2.34e-07],"3":[2.2700000000000001e-07,2.4600000000000001e-07],"4":[2.4499999999999998e-07,2.67e-07],"7424":[0.00040276299999999999,0.00040784800000000004],"5":[2.7599999999999998e-07,3.1800000000000002e-07],"23552":[0.001697645,0.001766477],"6":[3.1e-07,3.1e-07],"61440":[0.0039333770000000001,0.0039411899999999998],"491520":[0.046955146000000003,0.061022409],"77824":[0.0052353419999999996,0.005431140000000001],"7":[2.9999999999999999e-07,3.5699999999999998e-07],"8":[3.2800000000000003e-07,3.41e-07],"208":[9.4229999999999994e-06,9.6369999999999994e-06],"9":[5.4799999999999998e-07,5.8599999999999998e-07],"73728":[0.0048839179999999992,0.0050482320000000006],"304":[1.6492999999999999e-05,1.7645000000000001e-05],"400":[1.9607999999999999e-05,2.0517999999999999e-05],"1310720":[0.23159637799999999,0.29051721899999999],"336":[1.8445999999999999e-05,1.9738e-05],"3670016":[0.76699581100000003,0.78225917300000003],"6656":[0.00036118499999999998,0.00038180199999999999],"15360":[0.000876266,0.00089408999999999984],"432":[2.0611e-05,2.3501000000000001e-05],"950272":[0.125198752,0.17686872100000001],"655360":[0.076947785000000005,0.095646733000000012],"69632":[0.0045486729999999996,0.0047463309999999995],"11264":[0.0007115829999999999,0.00079407899999999994],"2752512":[0.67487643399999997,0.73424613999999999],"8126464":[1.939830698,1.9692847579999999],"27648":[0.001577677,0.0016659239999999998],"368":[2.2597999999999999e-05,2.4088e-05],"65536":[0.0042885659999999989,0.0047377699999999997],"16252928":[4.1893633120000002,4.2437685800000002],"464":[2.4746999999999999e-05,2.5718e-05],"1015808":[0.13945987800000001,0.18133150200000001],"3072":[0.000234856,0.000242799],"110592":[0.0077058670000000008,0.0082032149999999998],"237568":[0.018683200000000004,0.019557266],"278528":[0.023383279999999999,0.025266482],"496":[2.7254e-05,2.8419e-05],"13107200":[3.210136855,3.3907201909999998],"9961472":[2.727263255,2.7411896630000001],"5888":[0.00041947600000000006,0.00046375800000000004],"11010048":[3.365164842,3.3760241930000001],"1920":[0.000100055,0.00010641599999999999],"2490368":[0.54156547899999996,0.57236268999999995],"19456":[0.0011748209999999999,0.0011802060000000001],"57344":[0.003508724,0.0037257009999999992],"1179648":[0.18231771200000002,0.23849900600000001],"4718592":[1.1547547419999999,1.157963182],"360448":[0.036483151000000005,0.037837989000000002],"1572864":[0.40673928999999998,0.40751472399999999],"53248":[0.0032901639999999995,0.0036426940000000006],"3456":[0.00018775000000000001,0.000193542],"40960":[0.002624712,0.0028386699999999997],"4608":[0.00025770600000000002,0.000268805],"13824":[0.00078175800000000013,0.00083487000000000003],"819200":[0.102090556,0.13318780799999999],"983040":[0.13053763400000001,0.190506235],"8704":[0.00047984899999999991,0.000529602],"120":[4.9760000000000003e-06,5.5319999999999997e-06],"1024":[5.5186000000000003e-05,5.8882999999999998e-05],"49152":[0.0038160479999999998,0.0039573000000000004],"524288":[0.051657172999999987,0.072165826000000002],"45056":[0.003033698,0.0030781459999999999],"229376":[0.018028905000000001,0.018523744000000002],"2688":[0.00017329500000000004,0.00017693300000000002],"152":[7.1779999999999997e-06,8.8140000000000007e-06],"5120":[0.000296077,0.00029797899999999987],"1507328":[0.341332776,0.44986292400000005],"1216":[6.6923999999999998e-05,7.1290000000000004e-05],"1966080":[0.33501666299999999,0.35471562299999998],"1900544":[0.35310500899999997,0.38625312599999995],"184":[1.0183999999999999e-05,1.1157e-05],"7936":[0.00044025200000000003,0.00046971000000000008],"3801088":[0.79833767099999997,0.82273126699999999],"6815744":[1.5150624420000001,1.702377655],"124":[5.4140000000000002e-06,5.8850000000000004e-06],"102400":[0.0069359290000000021,0.0072977959999999996],"311296":[0.027076102000000001,0.032020983999999995],"1408":[8.8018999999999999e-05,8.8539000000000001e-05],"393216":[0.049145514000000008,0.052498189000000008],"4352":[0.000240697,0.00026190099999999993],"6553600":[1.502570513,1.6198782350000001],"20480":[0.0012894060000000003,0.001372369],"608":[3.5567e-05,3.6267999999999999e-05],"2228224":[0.437978376,0.44256864200000001],"36864":[0.0022109360000000002,0.0023598180000000005],"704":[4.2002000000000002e-05,4.5964000000000002e-05],"720896":[0.091883858000000013,0.13116033399999999],"800":[4.3674000000000002e-05,4.5395999999999997e-05],"2621440":[0.617069702,0.63257660999999998],"425984":[0.040478642000000009,0.050867020999999991],"32768":[0.0020046259999999998,0.0021483610000000001],"12058624":[4.3713875870000001,4.4622411690000003],"128":[5.5099999999999998e-06,6.5339999999999996e-06],"180224":[0.016316481000000001,0.016669547],"224":[9.7999999999999993e-06,1.1358e-05],"736":[4.8395e-05,5.3693000000000002e-05],"320":[1.6388e-05,1.7210999999999998e-05],"557056":[0.05776328599999999,0.092702119000000013],"832":[4.6817999999999998e-05,5.1020999999999998e-05],"9437184":[2.469456106,2.6495565540000001],"3584":[0.00019459600000000001,0.00020716799999999998],"6291456":[2.4614414600000001,2.5151409089999999],"256":[1.2615e-05,1.4836e-05],"15204352":[3.890407991,4.2050556549999998],"28672":[0.001626698,0.0017388600000000001],"768":[5.6943e-05,5.9215999999999997e-05],"212992":[0.016789844999999998,0.019975501999999999],"864":[4.7231999999999998e-05,4.7719000000000002e-05],"352":[2.0228e-05,2.2498e-05],"253952":[0.020398126999999995,0.020793025],"960":[4.9521000000000002e-05,5.8310000000000002e-05],"24576":[0.0019109140000000001,0.0019326929999999999],"7680":[0.00043864000000000002,0.00046027399999999994],"294912":[0.025392578999999992,0.029072397],"1048576":[0.14508460400000001,0.205717078],"10485760":[2.9800562909999999,3.0358699160000002],"344064":[0.036952872000000005,0.037336104999999994],"288":[1.5291999999999999e-05,1.541e-05],"1152":[6.3688000000000004e-05,7.0086999999999995e-05],"384":[2.3787000000000001e-05,2.6054000000000002e-05],"2304":[0.000129169,0.00015441199999999998],"896":[4.9641000000000001e-05,5.1088000000000003e-05],"480":[2.4649999999999999e-05,2.7834000000000002e-05],"1441792":[0.297139035,0.40064171199999998],"992":[5.1168000000000002e-05,5.6409999999999997e-05],"3968":[0.000211883,0.00022245499999999996],"6400":[0.00036145699999999998,0.00038035199999999998],"1344":[7.8442999999999994e-05,7.9915999999999999e-05],"126976":[0.0089705480000000001,0.0091878639999999987],"2883584":[0.77247086399999998,0.80391144699999995],"753664":[0.106512288,0.14924057900000001],"16384":[0.0010002819999999999,0.00100369],"131072":[0.0094684259999999985,0.0096078970000000007],"458752":[0.044268090000000003,0.054799665000000011],"172032":[0.014581842999999997,0.015590155],"12288":[0.00093375399999999986,0.001029086],"14680064":[3.708666746,12.121591875],"1536":[0.000111202,0.00012064400000000001],"25600":[0.0014772210000000003,0.001556619],"1835008":[0.30752307800000001,0.32118418399999998],"10752":[0.00066021600000000004,0.00068758100000000004],"21504":[0.0013968399999999997,0.0015061010000000004],"7602176":[1.7758189010000001,1.802263704],"5632":[0.00037370199999999995,0.00041082599999999999],"10":[5.4899999999999995e-07,6.3e-07],"3145728":[1.072935991,1.0866989570000001],"245760":[0.019873658999999998,0.021198687000000001],"1728":[9.3222999999999998e-05,9.7989e-05],"11":[5.5000000000000003e-07,6.1399999999999997e-07],"1114112":[0.16132912699999999,0.24653000300000005],"12":[5.9100000000000004e-07,6.3200000000000005e-07],"7340032":[1.6406464729999999,1.688644067],"7168":[0.00039584400000000007,0.00040211500000000004],"13":[6.0800000000000004e-07,6.0900000000000001e-07],"6029312":[2.0860800899999998,2.0929238560000001],"14":[7.3200000000000004e-07,7.3900000000000004e-07],"3200":[0.00018763300000000001,0.00018990000000000001],"20":[9.4799999999999997e-07,1.066e-06],"204800":[0.015942461000000005,0.017175863999999996],"15":[6.8100000000000002e-07,7.4600000000000004e-07],"13312":[0.00075720200000000001,0.00080780700000000012],"4980736":[1.2553841910000001,1.2756649100000002],"118784":[0.0083689589999999987,0.0086437319999999995],"51200":[0.003225384,0.0033089230000000005],"16":[7.9400000000000004e-07,7.9899999999999999e-07],"21":[1.0189999999999999e-06,1.096e-06],"917504":[0.120313262,0.16821303700000001],"22":[1.023e-06,1.316e-06],"4864":[0.00027551399999999998,0.00030280700000000004],"17":[8.9999999999999996e-07,1.004e-06],"14848":[0.00089710799999999998,0.00090161499999999993],"23":[9.6899999999999996e-07,1.291e-06],"786432":[0.120077714,0.18185166899999999],"18":[9.5000000000000001e-07,9.5900000000000005e-07],"1638400":[0.273750088,0.29643755100000002],"7864320":[1.845387474,1.9104042919999999],"24":[1.3859999999999999e-06,1.4920000000000001e-06],"14155776":[3.5476004670000001,3.6775854880000001],"19":[9.0999999999999997e-07,9.1999999999999998e-07],"30":[1.0729999999999999e-06,1.1370000000000001e-06],"25":[1.0139999999999999e-06,1.1209999999999999e-06],"31":[1.1519999999999999e-06,1.376e-06],"1280":[7.6093000000000005e-05,8.0895000000000004e-05],"26":[1.082e-06,1.1200000000000001e-06],"3932160":[0.83306883600000003,0.85927524700000002],"2432":[0.00013550699999999999,0.00016248399999999996],"32":[1.147e-06,1.204e-06],"27":[1.06e-06,1.122e-06],"409600":[0.03844813100000001,0.040126743999999999]}},{"title":"OrderedSet formIntersection with Self (50% overlap)","results":{"28":[1.308e-06,1.4869999999999999e-06],"34":[2.0729999999999999e-06,2.1260000000000001e-06],"29":[1.296e-06,1.604e-06],"40":[2.4569999999999999e-06,2.5579999999999999e-06],"17408":[0.0013880279999999999,0.001424975],"1472":[0.000113151,0.00012391799999999999],"112":[7.807e-06,8.1359999999999997e-06],"1376256":[0.30893728200000004,0.41898391099999999],"5242880":[1.6554065609999999,1.6573962769999999],"36":[2.1449999999999998e-06,2.2089999999999999e-06],"42":[2.5490000000000001e-06,2.599e-06],"11534336":[4.3493556289999997,4.3641898130000003],"114688":[0.01101797,0.011216775],"144":[9.5380000000000008e-06,1.0017000000000001e-05],"38":[2.3769999999999999e-06,2.729e-06],"240":[1.6106000000000001e-05,1.6453e-05],"9216":[0.00071194400000000016,0.00076373399999999996],"44":[2.5500000000000001e-06,3.1e-06],"1664":[0.000129744,0.00013710399999999998],"196608":[0.024110102999999997,0.024393250999999998],"155648":[0.015810689999999999,0.015953134000000001],"2816":[0.000214537,0.000221203],"50":[3.1429999999999998e-06,3.5999999999999998e-06],"2359296":[0.60109865100000004,0.61043077400000001],"46":[2.8439999999999998e-06,2.8490000000000002e-06],"176":[1.2656999999999999e-05,1.2865e-05],"52":[3.331e-06,3.7450000000000001e-06],"272":[1.9326000000000001e-05,2.1379e-05],"116":[8.0290000000000005e-06,8.0369999999999995e-06],"47104":[0.004135029000000001,0.0044243829999999996],"6912":[0.00054274199999999992,0.000568996],"1856":[0.000133144,0.00014852100000000004],"48":[2.8030000000000001e-06,3.8689999999999997e-06],"2097152":[0.508067771,0.55702927099999999],"54":[3.591e-06,3.7400000000000002e-06],"2031616":[0.48665280600000005,0.492156865],"43008":[0.003591084,0.0037345950000000003],"60":[3.664e-06,4.4290000000000003e-06],"30720":[0.0024112510000000005,0.0024675880000000002],"56":[3.7459999999999998e-06,3.8089999999999999e-06],"62":[3.8e-06,4.656e-06],"58":[3.6370000000000001e-06,3.8410000000000002e-06],"3014656":[0.96162259400000005,1.0392370689999999],"64":[4.3449999999999999e-06,4.7040000000000002e-06],"8388608":[2.6805979,2.799004681],"29696":[0.0023351379999999996,0.0023806329999999992],"216":[1.5866e-05,1.7892000000000001e-05],"106496":[0.010422175000000001,0.010834223],"72":[4.9790000000000001e-06,5.7409999999999998e-06],"442368":[0.060935945999999984,0.074576896000000004],"147456":[0.014366611,0.01459447],"4456448":[1.2759854719999999,1.333790909],"63488":[0.0054794930000000002,0.0055471420000000006],"38912":[0.0030926599999999992,0.0034742919999999995],"68":[4.9649999999999999e-06,5.242e-06],"188416":[0.021766008999999999,0.022730677000000008],"248":[1.6458999999999999e-05,1.9139000000000001e-05],"80":[5.7370000000000003e-06,5.7849999999999997e-06],"2560":[0.00019375700000000002,0.00019623499999999998],"34816":[0.0028093049999999998,0.002821395],"3712":[0.00027409900000000003,0.000299599],"3538944":[0.95544432899999998,0.97994196099999997],"76":[4.7600000000000002e-06,6.7490000000000001e-06],"4194304":[1.1704750269999999,1.2148923789999999],"851968":[0.147455373,0.19062289800000001],"4096":[0.00031290700000000002,0.00031869999999999999],"59392":[0.0051420240000000002,0.0055321580000000006],"84":[6.2929999999999997e-06,6.6769999999999998e-06],"3276800":[0.86117479699999999,0.91811783999999996],"55296":[0.0047813860000000003,0.0050672029999999993],"688128":[0.104024956,0.14248154299999999],"8192":[0.00064363000000000007,0.00066387300000000005],"10240":[0.00077894500000000007,0.00084861600000000017],"15872":[0.001255146,0.001292746],"92":[5.9549999999999997e-06,6.8850000000000001e-06],"26624":[0.0021749010000000008,0.0022994549999999997],"1792":[0.000134246,0.00014566399999999997],"11776":[0.00099054399999999989,0.0010479949999999999],"2944":[0.000239072,0.00026295500000000005],"88":[6.1290000000000001e-06,7.1040000000000001e-06],"22528":[0.0018724879999999998,0.0019461400000000001],"1245184":[0.25469773000000001,0.34900554299999997],"15728640":[5.5433553040000003,5.5598493189999996],"96":[6.674e-06,7.6930000000000007e-06],"1984":[0.00014125299999999998,0.000149352],"139264":[0.013577007,0.013721957],"475136":[0.062404044000000013,0.087124367000000008],"13631488":[4.773454278,4.8299238610000002],"416":[2.9300999999999999e-05,3.0661999999999999e-05],"928":[6.5548000000000003e-05,7.1765000000000002e-05],"512":[3.8186000000000003e-05,3.8352999999999997e-05],"18432":[0.0014562970000000003,0.001520483],"16777216":[5.979190483],"9728":[0.00072054599999999997,0.00074533199999999992],"1769472":[0.40597961700000001,0.41666252300000001],"1703936":[0.38586849700000003,0.41946019099999998],"2048":[0.00014710300000000002,0.00016298799999999998],"14336":[0.001112797,0.0011276649999999999],"448":[3.4053000000000001e-05,3.7197999999999999e-05],"5505024":[1.842467654,1.8570184030000001],"544":[4.4941999999999998e-05,4.5852000000000001e-05],"221184":[0.023866778999999998,0.026340662000000004],"90112":[0.0085404529999999999,0.0090950519999999993],"640":[4.9814000000000001e-05,5.2234999999999997e-05],"12800":[0.001047627,0.001161226],"262144":[0.02848007,0.031362811999999983],"589824":[0.08569655399999998,0.123177707],"884736":[0.155896541,0.199546364],"6144":[0.000550459,0.00056888100000000003],"1088":[7.7633999999999996e-05,8.8299000000000003e-05],"576":[4.1758000000000002e-05,4.3847000000000002e-05],"160":[1.1325000000000001e-05,1.3515e-05],"672":[4.9320000000000002e-05,5.2667999999999998e-05],"8912896":[2.9555114300000001,3.0474698280000001],"100":[6.5969999999999997e-06,7.3819999999999998e-06],"507904":[0.067458408999999997,0.093860532999999996],"3840":[0.00028566099999999993,0.0003412030000000001],"192":[1.6354e-05,1.6813999999999999e-05],"376832":[0.047538192,0.053450994999999987],"98304":[0.010505201,0.010524443],"5376":[0.00042245900000000003,0.000429185],"94208":[0.0093812029999999994,0.0097559209999999973],"81920":[0.0075182620000000004,0.0077989640000000002],"3407872":[0.918570679,0.93771879700000005],"104":[7.0759999999999997e-06,7.3150000000000003e-06],"122880":[0.011909625,0.012324043],"200":[1.3974e-05,1.5605000000000001e-05],"163840":[0.016574510000000004,0.017336437],"4063232":[1.1260854419999999,1.2173642600000001],"5767168":[2.016753783,2.0491339169999998],"12582912":[5.3781204799999998,10.602534346000001],"1600":[0.000132597,0.00013374100000000002],"136":[9.2089999999999994e-06,9.7899999999999994e-06],"232":[1.6297999999999999e-05,1.8023999999999999e-05],"7077888":[2.2803378840000001,2.4693344489999998],"86016":[0.0082960480000000003,0.0083204719999999989],"31744":[0.0025342940000000003,0.0026636620000000007],"168":[1.2381000000000001e-05,1.2703e-05],"622592":[0.088177953000000017,0.118921358],"108":[8.5809999999999997e-06,8.8750000000000006e-06],"327680":[0.038484682000000006,0.042792710999999997],"2176":[0.00017143900000000004,0.00017667300000000005],"3328":[0.00025895199999999996,0.00028115099999999994],"1":[2.03e-07,2.1500000000000001e-07],"2":[2.29e-07,2.35e-07],"3":[2.29e-07,2.5499999999999999e-07],"4":[2.4499999999999998e-07,2.5899999999999998e-07],"7424":[0.00055588400000000009,0.00061942599999999996],"5":[4.5699999999999998e-07,4.8999999999999997e-07],"23552":[0.0020081460000000001,0.002099751],"6":[5.0399999999999996e-07,5.0399999999999996e-07],"61440":[0.0052669910000000004,0.0054056069999999989],"491520":[0.063615598000000051,0.087908470999999988],"77824":[0.0068751319999999991,0.0071232559999999997],"7":[4.8999999999999997e-07,5.3600000000000004e-07],"8":[4.7899999999999999e-07,5.37e-07],"208":[1.395e-05,1.5084e-05],"9":[7.4199999999999995e-07,7.5000000000000002e-07],"73728":[0.0065980420000000001,0.0067379180000000007],"304":[2.2643999999999999e-05,2.5105000000000001e-05],"400":[2.9754e-05,3.0273999999999998e-05],"1310720":[0.28032349300000003,0.36102687300000003],"336":[2.5082000000000001e-05,2.5270999999999999e-05],"3670016":[0.98545658899999999,1.0205351230000002],"6656":[0.00050863199999999986,0.00052104899999999999],"15360":[0.001175485,0.0012595169999999999],"432":[2.9385000000000001e-05,3.2772999999999999e-05],"950272":[0.17090588000000001,0.23039311200000001],"655360":[0.095417941000000006,0.12594598300000001],"69632":[0.0060700270000000004,0.0064670140000000018],"11264":[0.00090395800000000006,0.00092561199999999981],"2752512":[0.787875145,0.80547941899999997],"8126464":[2.5837026060000001,2.6536383959999998],"27648":[0.0022498399999999999,0.002375037],"368":[2.6987000000000001e-05,2.8918e-05],"65536":[0.0057987749999999991,0.0060345289999999994],"16252928":[5.6907877969999996,5.7654322450000004],"464":[3.4344000000000002e-05,3.5633000000000003e-05],"1015808":[0.18687630299999999,0.238863245],"3072":[0.00026382700000000001,0.000274682],"110592":[0.010598722,0.011674226000000001],"237568":[0.025225485999999998,0.026646949],"278528":[0.030807029999999996,0.032939467],"496":[3.4516e-05,3.5802e-05],"13107200":[4.5734644519999996,4.8777964000000003],"9961472":[3.446951469,3.5130836059999999],"5888":[0.00051474300000000001,0.00051668500000000002],"11010048":[3.9600548999999998,4.1253444119999996],"1920":[0.00014626400000000001,0.000151965],"2490368":[0.65681528900000008,0.66808783199999999],"19456":[0.0015133240000000001,0.0015167220000000003],"57344":[0.0049456490000000007,0.0051461700000000003],"1179648":[0.23581074799999999,0.29765709200000001],"4718592":[1.3907089479999999,1.45648351],"360448":[0.044089402,0.046048474999999998],"1572864":[0.43155512699999998,0.44379929299999998],"53248":[0.0047883300000000004,0.0048587370000000001],"3456":[0.00025716500000000006,0.000270585],"40960":[0.0033233069999999997,0.0038269179999999999],"4608":[0.00033685299999999991,0.00035787199999999996],"13824":[0.0010964600000000001,0.001147662],"819200":[0.141735732,0.18091228000000001],"983040":[0.17660362800000001,0.24876432100000001],"8704":[0.00064656299999999996,0.00067789399999999996],"120":[7.357e-06,7.7680000000000008e-06],"1024":[7.5539999999999998e-05,7.9080999999999997e-05],"49152":[0.0044646540000000002,0.0049615409999999981],"524288":[0.070424450999999999,0.102962679],"45056":[0.003801109,0.0039215220000000011],"229376":[0.024696119999999988,0.025643120000000019],"2688":[0.000197052,0.00022615100000000001],"152":[1.0266e-05,1.3264e-05],"5120":[0.000378043,0.00039948699999999991],"1507328":[0.38184011499999998,0.49487830300000002],"1216":[8.8735999999999999e-05,9.0500000000000004e-05],"1966080":[0.44096894399999997,0.45799608200000003],"1900544":[0.443185891,0.44464515999999998],"184":[1.2217e-05,1.3747000000000001e-05],"7936":[0.00058984899999999993,0.00060432599999999997],"3801088":[1.0353760599999999,1.048861431],"6815744":[2.1575111009999999,2.3888144090000001],"124":[8.2549999999999997e-06,8.5639999999999997e-06],"102400":[0.0096684480000000014,0.010433018],"311296":[0.034628036000000001,0.042710290999999997],"1408":[0.00010539699999999999,0.000111482],"393216":[0.053689488,0.060243684999999991],"4352":[0.00031425499999999999,0.00034454100000000002],"6553600":[2.108553691,2.2995464810000001],"20480":[0.0016452890000000001,0.0016880620000000006],"608":[4.4666999999999998e-05,4.7985000000000002e-05],"2228224":[0.55235456799999993,0.55414638800000005],"36864":[0.0030188819999999996,0.0031044090000000002],"704":[4.9833999999999998e-05,5.4561999999999997e-05],"720896":[0.114030937,0.17545581399999999],"800":[6.2865000000000002e-05,6.4256000000000003e-05],"2621440":[0.71438091599999998,0.74587563499999998],"425984":[0.056160424,0.067013145999999996],"32768":[0.0028174659999999998,0.0029396309999999998],"12058624":[4.778063232,5.0469311760000002],"128":[8.2339999999999994e-06,8.9630000000000004e-06],"180224":[0.019651026000000002,0.020089783],"224":[1.5826000000000001e-05,1.6127999999999999e-05],"736":[5.7612000000000003e-05,6.4692999999999999e-05],"320":[2.2150999999999998e-05,2.2371999999999999e-05],"557056":[0.076940486999999988,0.104191539],"832":[5.9321999999999999e-05,6.5691999999999994e-05],"9437184":[3.167178517,3.4364842649999998],"3584":[0.00026868400000000005,0.000281616],"6291456":[2.5570415770000001,2.5801746890000001],"256":[1.8016000000000002e-05,2.0658000000000001e-05],"15204352":[5.3180411850000002,5.8247570179999997],"28672":[0.002260092,0.0023795870000000003],"768":[6.3186000000000001e-05,7.0339999999999994e-05],"212992":[0.023036150000000002,0.028802370000000001],"864":[6.8058999999999993e-05,6.8250000000000006e-05],"352":[2.4505999999999999e-05,2.8348999999999999e-05],"253952":[0.027343513,0.028734800999999997],"960":[7.1093000000000005e-05,8.0230999999999998e-05],"24576":[0.002241898,0.0022770019999999998],"7680":[0.00062108999999999992,0.00062387899999999993],"294912":[0.034155427000000002,0.038882932999999995],"1048576":[0.19252196599999999,0.25457991700000004],"10485760":[3.6545153199999998,3.7603130039999999],"344064":[0.042130044000000012,0.046642182999999997],"288":[2.1246999999999998e-05,2.1780000000000002e-05],"1152":[8.3971e-05,9.9110000000000005e-05],"384":[2.9249999999999999e-05,2.9505e-05],"2304":[0.00016683600000000001,0.000184642],"896":[6.6715000000000001e-05,7.1462000000000001e-05],"480":[3.5188000000000003e-05,4.0778000000000002e-05],"1441792":[0.34167898499999999,0.46215503400000002],"992":[7.1184000000000002e-05,7.7244999999999996e-05],"3968":[0.00031794099999999997,0.00031915700000000003],"6400":[0.00050439499999999993,0.00051807100000000016],"1344":[9.9584000000000001e-05,0.000101541],"126976":[0.012220754,0.012598961000000002],"2883584":[0.86531424499999998,0.90226129099999997],"753664":[0.122825368,0.171580977],"16384":[0.0013483379999999999,0.0013574079999999998],"131072":[0.012872462000000001,0.013111157],"458752":[0.062237889999999997,0.078080449999999996],"172032":[0.018396908999999999,0.019041838999999998],"12288":[0.0010822130000000001,0.0011449030000000001],"14680064":[5.1066692739999997,7.0629658449999999],"1536":[0.00012957600000000001,0.00013675999999999998],"25600":[0.0021459750000000001,0.0021958010000000003],"1835008":[0.40818599,0.424217697],"10752":[0.00086110499999999981,0.00089533899999999988],"21504":[0.0017545810000000003,0.001869346],"7602176":[2.4294232789999999,2.4464685089999998],"5632":[0.000429398,0.0005143630000000001],"10":[7.0900000000000001e-07,7.5700000000000002e-07],"3145728":[1.1142298450000001,1.1224917830000001],"245760":[0.026410363000000003,0.029067699000000002],"1728":[0.000126854,0.00014061],"11":[7.2200000000000003e-07,7.3e-07],"1114112":[0.211786013,0.28643249599999998],"12":[7.7599999999999996e-07,8.5199999999999995e-07],"7340032":[2.242594676,2.3940412360000001],"7168":[0.0005363369999999999,0.00062027700000000002],"13":[7.4600000000000004e-07,7.7100000000000001e-07],"6029312":[2.2382809620000002,2.267335326],"14":[9.4200000000000004e-07,9.7000000000000003e-07],"3200":[0.00024102699999999999,0.00025223200000000002],"20":[1.0920000000000001e-06,1.3009999999999999e-06],"204800":[0.022522809000000001,0.025967139],"15":[7.9500000000000001e-07,8.7700000000000003e-07],"13312":[0.001070828,0.001109996],"4980736":[1.547730161,1.559488843],"118784":[0.011415679,0.012068179],"51200":[0.0045772440000000003,0.0046357590000000006],"16":[1.0160000000000001e-06,1.057e-06],"21":[1.237e-06,1.3689999999999999e-06],"917504":[0.16375149899999999,0.222461927],"22":[1.2160000000000001e-06,1.356e-06],"4864":[0.00037424300000000001,0.00039562199999999999],"17":[1.119e-06,1.2720000000000001e-06],"14848":[0.0011541349999999999,0.001241175],"23":[1.203e-06,1.815e-06],"786432":[0.135925989,0.19928484399999999],"18":[1.1000000000000001e-06,1.1069999999999999e-06],"1638400":[0.367493191,0.39062342900000002],"7864320":[2.4830643189999999,2.5290417659999997],"24":[1.2899999999999999e-06,1.505e-06],"14155776":[4.954727557,5.1430011330000003],"19":[1.102e-06,1.2270000000000001e-06],"30":[1.3570000000000001e-06,1.497e-06],"25":[1.2249999999999999e-06,1.342e-06],"31":[1.9139999999999998e-06,2.2069999999999998e-06],"1280":[9.6677999999999998e-05,9.8752000000000006e-05],"26":[1.238e-06,1.3090000000000001e-06],"3932160":[1.076928412,1.1008628009999999],"2432":[0.000193914,0.00019530600000000002],"32":[1.779e-06,1.875e-06],"27":[1.2550000000000001e-06,1.3650000000000001e-06],"409600":[0.053598584000000005,0.05625593000000001]}},{"title":"OrderedSet formIntersection with Self (75% overlap)","results":{"28":[2.227e-06,2.3690000000000001e-06],"34":[3.3189999999999999e-06,3.58e-06],"29":[2.0279999999999999e-06,2.463e-06],"40":[3.9729999999999999e-06,3.9740000000000004e-06],"17408":[0.0018839520000000002,0.001979377],"1472":[0.00014095400000000005,0.00015306400000000001],"112":[9.4010000000000003e-06,9.9729999999999992e-06],"1376256":[0.37623976799999997,0.49540192700000002],"5242880":[2.0907626339999998,2.1013953089999999],"36":[3.455e-06,3.6849999999999999e-06],"42":[3.8480000000000003e-06,4.1679999999999997e-06],"11534336":[5.266798348,5.3175730919999999],"114688":[0.012773653999999999,0.013108256],"144":[1.3043e-05,1.5593000000000001e-05],"38":[3.7740000000000002e-06,4.3710000000000002e-06],"240":[1.9222e-05,1.9347999999999998e-05],"9216":[0.00098704000000000001,0.0010159470000000001],"44":[4.0249999999999996e-06,4.5680000000000001e-06],"1664":[0.00014490100000000001,0.00015348899999999995],"196608":[0.028016507,0.031822583999999994],"155648":[0.021405167999999995,0.021468833999999999],"2816":[0.00027313700000000001,0.00030269500000000007],"50":[3.8589999999999998e-06,4.279e-06],"2359296":[0.76198915700000003,0.78012281100000003],"46":[4.6519999999999997e-06,5.0799999999999996e-06],"176":[1.6552999999999999e-05,1.9046e-05],"52":[4.1389999999999997e-06,4.5909999999999998e-06],"272":[2.9771999999999999e-05,3.0571999999999998e-05],"116":[9.1579999999999994e-06,9.2010000000000005e-06],"47104":[0.0051377009999999997,0.0054785509999999999],"6912":[0.00059154999999999993,0.00071362800000000022],"1856":[0.00016734200000000001,0.000173182],"48":[4.3159999999999998e-06,5.0499999999999999e-06],"2097152":[0.57542776699999998,0.62252526200000002],"54":[4.4100000000000001e-06,4.6319999999999999e-06],"2031616":[0.53527423600000001,0.55784013600000004],"43008":[0.0046180690000000007,0.0051571970000000005],"60":[4.4730000000000002e-06,5.3720000000000004e-06],"30720":[0.0028203720000000007,0.0028496140000000003],"56":[4.5900000000000001e-06,4.6619999999999996e-06],"62":[4.8280000000000002e-06,5.4739999999999996e-06],"58":[4.5190000000000003e-06,4.9849999999999997e-06],"3014656":[1.0944178879999999,1.1897442599999999],"64":[5.1560000000000003e-06,5.6869999999999999e-06],"8388608":[3.0693325169999999,3.1722201390000002],"29696":[0.0026994670000000005,0.0027379150000000001],"216":[1.9091999999999999e-05,1.9510000000000001e-05],"106496":[0.011953742999999999,0.012765486999999997],"72":[7.4830000000000002e-06,7.9270000000000005e-06],"442368":[0.066624741000000001,0.084295164000000006],"147456":[0.019349353,0.019649369],"4456448":[1.7295276079999999,1.766005131],"63488":[0.0062592669999999989,0.0063596160000000002],"38912":[0.004167965,0.0045801120000000008],"68":[7.2119999999999997e-06,7.8909999999999995e-06],"188416":[0.026985308,0.027066335],"248":[1.9142000000000001e-05,2.2362999999999999e-05],"80":[7.875e-06,7.926e-06],"2560":[0.00024867999999999998,0.00027511300000000001],"34816":[0.0038774360000000002,0.0041260360000000013],"3712":[0.000311377,0.00033178999999999999],"3538944":[1.103898158,1.189669651],"76":[6.8449999999999997e-06,9.5459999999999997e-06],"4194304":[1.3518438640000001,1.3653560929999999],"851968":[0.17593088700000004,0.24871916199999999],"4096":[0.00034897900000000002,0.00041157499999999996],"59392":[0.005841171,0.0062652879999999991],"84":[8.1960000000000008e-06,8.8550000000000008e-06],"3276800":[1.0120438899999999,1.0519289460000001],"55296":[0.005485130999999999,0.0056414519999999991],"688128":[0.13339867899999999,0.18507152199999999],"8192":[0.00075341800000000016,0.00075480699999999992],"10240":[0.0010591839999999999,0.0011126280000000003],"15872":[0.0014914140000000002,0.0014946720000000001],"92":[9.1470000000000007e-06,1.0183999999999999e-05],"26624":[0.0024386809999999998,0.0025993819999999999],"1792":[0.00015016999999999998,0.00016520099999999997],"11776":[0.0012588439999999998,0.0013032810000000001],"2944":[0.00028502099999999999,0.00031895300000000002],"88":[8.2649999999999996e-06,9.3589999999999997e-06],"22528":[0.002361822,0.0024791739999999998],"1245184":[0.32287592199999998,0.40997052499999997],"15728640":[6.33132216,6.3369994099999998],"96":[9.4669999999999993e-06,9.7720000000000006e-06],"1984":[0.000165573,0.00018374800000000002],"139264":[0.018690985,0.018765576999999999],"475136":[0.072774342000000006,0.10421050599999999],"13631488":[5.453919097,5.6638109100000005],"416":[3.3794999999999997e-05,3.5246000000000001e-05],"928":[7.7429999999999996e-05,8.2531e-05],"512":[4.4907000000000002e-05,4.5008e-05],"18432":[0.0019937420000000006,0.0020387729999999998],"16777216":[6.7967591550000002],"9728":[0.00099835000000000006,0.001002115],"1769472":[0.47880075999999999,0.49135963400000005],"1703936":[0.44960688000000004,0.47002477499999995],"2048":[0.00018850900000000003,0.00018864899999999999],"14336":[0.0012776860000000005,0.0013064630000000003],"448":[3.9045000000000003e-05,4.1019000000000001e-05],"5505024":[2.2751434110000002,2.3052335770000001],"544":[5.9935999999999997e-05,6.0273999999999999e-05],"221184":[0.027401526999999998,0.031763698999999999],"90112":[0.010777130999999999,0.011702232],"640":[6.3281000000000006e-05,7.1369000000000001e-05],"12800":[0.0011660869999999999,0.0012104329999999999],"262144":[0.033458396000000008,0.037225768000000006],"589824":[0.11122343799999999,0.15386785999999997],"884736":[0.178547294,0.24552950299999998],"6144":[0.00064730600000000005,0.00066779899999999974],"1088":[0.000108261,0.00012896700000000001],"576":[5.7927999999999998e-05,6.0328999999999998e-05],"160":[1.4591e-05,1.8529000000000002e-05],"672":[6.2076000000000007e-05,6.4925999999999995e-05],"8912896":[3.974726515,4.0530617610000004],"100":[7.5410000000000003e-06,8.4400000000000005e-06],"507904":[0.077354640999999988,0.109472967],"3840":[0.000358384,0.00038409800000000009],"192":[1.8953e-05,2.0018999999999999e-05],"376832":[0.058309307000000012,0.065341970999999985],"98304":[0.012854587000000001,0.012883458],"5376":[0.00052975599999999993,0.00055770199999999998],"94208":[0.011655305999999999,0.012275523],"81920":[0.009755059,0.010133777],"3407872":[1.0728089750000001,1.0982736820000001],"104":[8.1890000000000007e-06,8.2879999999999993e-06],"122880":[0.01388589,0.014856872],"200":[1.6430999999999999e-05,1.8099999999999999e-05],"163840":[0.022371673000000002,0.022494036999999974],"4063232":[1.2933919709999999,1.3549855980000001],"5767168":[2.4752530770000001,2.5082633680000002],"12582912":[6.0442378430000003,11.389774168000001],"1600":[0.00014035099999999998,0.000146117],"136":[1.3309000000000001e-05,1.4769999999999999e-05],"232":[1.9088000000000001e-05,2.0322e-05],"7077888":[2.5473297829999999,2.8835219169999999],"86016":[0.010158628000000003,0.010935863000000001],"31744":[0.0028862709999999997,0.003081501999999999],"168":[1.5979999999999999e-05,1.7638999999999998e-05],"622592":[0.11747696699999999,0.15045575],"108":[8.7609999999999996e-06,9.577e-06],"327680":[0.048948914999999996,0.056388970999999996],"2176":[0.00024030000000000001,0.00024390600000000003],"3328":[0.00028298400000000001,0.00031437000000000001],"1":[2.04e-07,2.1299999999999999e-07],"2":[2.3300000000000001e-07,2.41e-07],"3":[3.8700000000000001e-07,4.4299999999999998e-07],"4":[4.1699999999999999e-07,4.1800000000000001e-07],"7424":[0.00065559899999999998,0.00068013399999999988],"5":[4.5200000000000002e-07,5.2200000000000004e-07],"23552":[0.0024882239999999998,0.002597336],"6":[6.7700000000000004e-07,7.4700000000000001e-07],"61440":[0.0060405709999999998,0.0064292940000000003],"491520":[0.075112578999999985,0.100713661],"77824":[0.0095754880000000018,0.0099897650000000393],"7":[6.5700000000000002e-07,7.0399999999999995e-07],"8":[6.5899999999999996e-07,8.1200000000000002e-07],"208":[1.6388999999999998e-05,1.7068e-05],"9":[7.5300000000000003e-07,7.7800000000000001e-07],"73728":[0.0088207600000000004,0.008886663000000003],"304":[3.0762999999999997e-05,3.3467999999999999e-05],"400":[3.3980000000000003e-05,3.4873000000000003e-05],"1310720":[0.34634621500000001,0.436942151],"336":[3.4016000000000001e-05,3.4638999999999998e-05],"3670016":[1.1620773799999999,1.1658712179999999],"6656":[0.00056975600000000004,0.00059634200000000003],"15360":[0.001443911,0.0014469090000000001],"432":[3.5126000000000002e-05,3.6078000000000003e-05],"950272":[0.19992289599999999,0.26917537200000002],"655360":[0.124522936,0.16350271399999999],"69632":[0.0082828769999999993,0.0090668369999999995],"11264":[0.001160931,0.0011789439999999999],"2752512":[0.95283634699999997,0.97141707200000005],"8126464":[2.9876439000000001,3.094212379],"27648":[0.0025663220000000002,0.0027468379999999993],"368":[3.3118999999999999e-05,3.7211e-05],"65536":[0.0066151069999999994,0.0068781490000000001],"16252928":[6.5152976020000004,6.5798441170000004],"464":[3.9045999999999999e-05,4.0417000000000003e-05],"1015808":[0.217552472,0.28185591999999998],"3072":[0.00030333699999999999,0.000337113],"110592":[0.012322139999999999,0.013165203],"237568":[0.028968915000000001,0.030590297999999998],"278528":[0.042397925999999996,0.045153297999999994],"496":[3.9758000000000001e-05,4.1446000000000003e-05],"13107200":[5.2534504149999997,5.5257337800000004],"9961472":[4.5292973820000002,4.5442777159999999],"5888":[0.00061548099999999997,0.00063574300000000003],"11010048":[4.909285219,5.1161624239999997],"1920":[0.00016527099999999996,0.00017590499999999999],"2490368":[0.822015155,0.849343391],"19456":[0.0020379929999999997,0.0020395560000000001],"57344":[0.0056223420000000007,0.0057850269999999999],"1179648":[0.30404019599999998,0.417062243],"4718592":[1.8622094250000001,1.9530692030000001],"360448":[0.054879148999999995,0.058513624],"1572864":[0.47743238399999999,0.52494262700000005],"53248":[0.005296920000000001,0.0056397440000000004],"3456":[0.00029259800000000003,0.00031798500000000001],"40960":[0.0044458680000000004,0.0050231470000000004],"4608":[0.00048068299999999998,0.00049458199999999992],"13824":[0.0012425380000000001,0.001298043],"819200":[0.16703879499999999,0.214847596],"983040":[0.207058135,0.29331711699999996],"8704":[0.00093484199999999996,0.0009837969999999998],"120":[8.9979999999999992e-06,9.9389999999999992e-06],"1024":[8.6817999999999994e-05,9.3221999999999996e-05],"49152":[0.0055270780000000004,0.0057996899999999997],"524288":[0.082113323000000002,0.11532209],"45056":[0.004987875000000001,0.0051937749999999994],"229376":[0.028451203000000001,0.030196148999999995],"2688":[0.00026178099999999999,0.00027305199999999992],"152":[1.3918e-05,1.7484000000000001e-05],"5120":[0.00052537900000000008,0.00052649800000000003],"1507328":[0.44357654700000004,0.58431913899999999],"1216":[0.000116209,0.00012061],"1966080":[0.50818823899999999,0.531468999],"1900544":[0.51962712300000002,0.52129213200000002],"184":[1.6226999999999999e-05,1.6676000000000001e-05],"7936":[0.00072838600000000014,0.0007523339999999999],"3801088":[1.2240475230000001,1.246910631],"6815744":[2.4843076379999998,2.7363441370000001],"124":[1.0268999999999999e-05,1.0981e-05],"102400":[0.011116431,0.011762043],"311296":[0.045815926,0.060721861000000009],"1408":[0.00014611100000000004,0.00014781900000000002],"393216":[0.062842428000000033,0.069807390999999983],"4352":[0.00047181300000000002,0.00049068400000000013],"6553600":[2.4290721340000001,2.63900275],"20480":[0.0021468989999999999,0.0022325579999999999],"608":[6.3893999999999995e-05,6.7595000000000006e-05],"2228224":[0.71797263200000006,0.73087517300000004],"36864":[0.0040300470000000001,0.0042279879999999994],"704":[6.6538000000000006e-05,6.745e-05],"720896":[0.139786676,0.22215379499999999],"800":[6.4622999999999994e-05,6.8484000000000004e-05],"2621440":[0.87133657799999997,0.89796862700000002],"425984":[0.063128857999999982,0.076753948999999988],"32768":[0.0032572210000000002,0.0034410360000000006],"12058624":[5.6044775920000003,5.8626110909999998],"128":[9.9559999999999992e-06,1.0539e-05],"180224":[0.024829502999999996,0.025094250000000002],"224":[1.7271000000000001e-05,1.9496000000000001e-05],"736":[7.8639000000000004e-05,8.5161000000000007e-05],"320":[3.0298e-05,3.0315e-05],"557056":[0.103770315,0.134765834],"832":[6.5797999999999996e-05,7.2723000000000002e-05],"9437184":[4.2883296929999997,4.3741511370000001],"3584":[0.00030091199999999997,0.00033360399999999999],"6291456":[2.8470104799999998,2.860500118],"256":[2.1005999999999998e-05,2.1931000000000001e-05],"15204352":[6.0906798640000002,6.7406916749999999],"28672":[0.0026250919999999999,0.0027334240000000004],"768":[7.7170999999999997e-05,8.2421000000000003e-05],"212992":[0.026462813000000002,0.031193239000000005],"864":[7.7218999999999994e-05,7.7325999999999998e-05],"352":[3.3667999999999997e-05,3.6603999999999997e-05],"253952":[0.031647215000000006,0.033175384999999988],"960":[8.3537999999999999e-05,8.6457000000000002e-05],"24576":[0.0026811510000000001,0.0027038319999999998],"7680":[0.000723151,0.00073262300000000006],"294912":[0.044878011000000009,0.051904234],"1048576":[0.22996622,0.29597723999999997],"10485760":[4.617028028,4.6784392989999999],"344064":[0.053389792000000005,0.057202205000000006],"288":[2.8646e-05,3.099e-05],"1152":[0.000109001,0.000133986],"384":[3.6324e-05,3.8272000000000002e-05],"2304":[0.000237216,0.000237748],"896":[7.1654000000000002e-05,8.0584e-05],"480":[4.1616000000000003e-05,4.4314000000000003e-05],"1441792":[0.409451909,0.51788293100000005],"992":[8.3875000000000006e-05,8.9084000000000003e-05],"3968":[0.00033976600000000013,0.00035368199999999997],"6400":[0.00057936999999999973,0.00058622399999999988],"1344":[0.00013850599999999999,0.00015348],"126976":[0.014203935000000001,0.014473375],"2883584":[1.029030152,1.0687851779999999],"753664":[0.154048252,0.204554343],"16384":[0.0015540619999999999,0.001560533],"131072":[0.015023701,0.015417904],"458752":[0.070785535000000011,0.096022864000000013],"172032":[0.022891106000000001,0.023840164],"12288":[0.0012991930000000001,0.0013648570000000001],"14680064":[5.878489064,9.4450841309999998],"1536":[0.00014935999999999999,0.000157894],"25600":[0.0023394359999999999,0.0024958630000000001],"1835008":[0.47363903100000004,0.48831327899999999],"10752":[0.001093512,0.001134808],"21504":[0.0022442230000000001,0.00237222],"7602176":[2.8488912420000001,2.849395178],"5632":[0.00057692500000000016,0.00066052999999999999],"10":[7.5000000000000002e-07,7.8400000000000003e-07],"3145728":[1.188618572,1.2129319460000001],"245760":[0.030050092,0.033442657000000001],"1728":[0.000149004,0.00016127900000000001],"11":[9.3600000000000002e-07,9.5199999999999995e-07],"1114112":[0.27774943900000004,0.35548035700000002],"12":[9.5000000000000001e-07,1.091e-06],"7340032":[2.5690383400000001,2.6864421549999999],"7168":[0.00063943300000000012,0.00066990100000000009],"13":[9.3699999999999999e-07,9.7699999999999992e-07],"6029312":[2.6285000080000001,2.6334537730000003],"14":[1.099e-06,1.1739999999999999e-06],"3200":[0.00026714399999999998,0.00030487400000000001],"20":[1.049e-06,1.2720000000000001e-06],"204800":[0.025412699,0.028137181000000001],"15":[9.9800000000000002e-07,1.079e-06],"13312":[0.0012719910000000001,0.0012848270000000001],"4980736":[1.979235359,1.9949229449999999],"118784":[0.013206476,0.013744793],"51200":[0.0051518120000000004,0.005367302],"16":[1.1739999999999999e-06,1.2219999999999999e-06],"21":[1.686e-06,1.875e-06],"917504":[0.189445633,0.245548986],"22":[1.9570000000000001e-06,1.9700000000000002e-06],"4864":[0.00047771799999999997,0.00050315199999999987],"17":[1.1289999999999999e-06,1.373e-06],"14848":[0.0013715860000000002,0.0014042729999999999],"23":[1.9530000000000002e-06,2.1660000000000001e-06],"786432":[0.169012462,0.239088619],"18":[1.1200000000000001e-06,1.1850000000000001e-06],"1638400":[0.435094282,0.48115260199999998],"7864320":[2.8423288640000002,2.8733095720000001],"24":[2.0490000000000002e-06,2.458e-06],"14155776":[5.6395239689999999,5.8076623630000004],"19":[1.08e-06,1.1370000000000001e-06],"30":[2.136e-06,2.221e-06],"25":[1.9690000000000001e-06,2.1679999999999998e-06],"31":[2.401e-06,2.5799999999999999e-06],"1280":[0.000131447,0.000132884],"26":[1.8929999999999999e-06,2.024e-06],"3932160":[1.2427831039999999,1.3090891570000001],"2432":[0.00024913400000000003,0.000260986],"32":[2.199e-06,2.2079999999999999e-06],"27":[1.9010000000000001e-06,2.1830000000000001e-06],"409600":[0.061155922999999987,0.064230326000000004]}},{"title":"OrderedSet formIntersection with Self (100% overlap)","results":{"28":[3.2169999999999999e-06,3.9060000000000004e-06],"34":[3.7000000000000002e-06,3.856e-06],"29":[3.2459999999999999e-06,3.8489999999999999e-06],"40":[4.2830000000000003e-06,4.5580000000000002e-06],"17408":[0.0020805370000000008,0.0023093720000000001],"1472":[0.000158283,0.00018578400000000001],"112":[1.3618000000000001e-05,1.3882e-05],"1376256":[0.42097690900000001,0.53996612499999996],"5242880":[2.350191411,2.3581912100000002],"36":[3.89e-06,4.2459999999999997e-06],"42":[4.3540000000000002e-06,4.7140000000000001e-06],"11534336":[5.6962223170000001,5.8754316429999998],"114688":[0.017533909,0.017847073000000001],"144":[1.4327e-05,1.5835e-05],"38":[4.2180000000000001e-06,4.9339999999999997e-06],"240":[2.6461e-05,2.7585000000000001e-05],"9216":[0.0010475480000000001,0.0010842219999999999],"44":[4.4959999999999998e-06,5.5269999999999998e-06],"1664":[0.000217092,0.00021912400000000001],"196608":[0.030251626,0.032910060000000005],"155648":[0.024125709999999998,0.024201173000000003],"2816":[0.000306161,0.00033611099999999994],"50":[5.7490000000000004e-06,6.3589999999999996e-06],"2359296":[0.87514781600000002,0.88570719600000003],"46":[4.9389999999999996e-06,5.1000000000000003e-06],"176":[1.9247999999999999e-05,2.0678000000000001e-05],"52":[6.0619999999999997e-06,7.2459999999999997e-06],"272":[3.1823999999999999e-05,3.3636000000000001e-05],"116":[1.3086e-05,1.3327e-05],"47104":[0.0057042550000000001,0.0060025310000000002],"6912":[0.00089515899999999986,0.00092276399999999985],"1856":[0.000211141,0.00023759000000000003],"48":[4.8450000000000002e-06,5.879e-06],"2097152":[0.76529206799999994,0.85048292000000003],"54":[6.2580000000000001e-06,6.8480000000000003e-06],"2031616":[0.71848102199999997,0.76070729199999998],"43008":[0.0051469480000000001,0.0056319260000000006],"60":[6.4790000000000001e-06,7.5870000000000004e-06],"30720":[0.003821484,0.0039335720000000006],"56":[6.8040000000000004e-06,6.849e-06],"62":[6.8460000000000002e-06,8.1450000000000008e-06],"58":[6.6420000000000001e-06,7.0679999999999999e-06],"3014656":[1.189010905,1.287215894],"64":[7.0999999999999998e-06,7.4630000000000004e-06],"8388608":[4.136741132,4.2987679539999997],"29696":[0.003784866,0.003790688],"216":[2.5355999999999999e-05,2.7192999999999999e-05],"106496":[0.016687621,0.017390243],"72":[8.1629999999999996e-06,8.7909999999999993e-06],"442368":[0.094218964000000016,0.109371683],"147456":[0.021618342000000006,0.022034849999999998],"4456448":[1.936946396,2.0136650089999999],"63488":[0.0086026459999999985,0.0089370060000000008],"38912":[0.0046590579999999998,0.0050206530000000008],"68":[8.2179999999999999e-06,8.2810000000000008e-06],"188416":[0.029057618,0.029775324000000002],"248":[2.6157999999999999e-05,2.9672e-05],"80":[8.2840000000000006e-06,9.0580000000000004e-06],"2560":[0.00029259399999999997,0.00030386599999999997],"34816":[0.0042403670000000001,0.0045044099999999995],"3712":[0.00044814999999999992,0.00045618500000000012],"3538944":[1.5648477000000001,1.6446002769999999],"76":[7.7349999999999996e-06,9.6029999999999994e-06],"4194304":[1.8366380840000001,1.8577622360000001],"851968":[0.24210225699999999,0.32116272899999998],"4096":[0.00047504900000000007,0.00049895400000000002],"59392":[0.0082124899999999994,0.0091095700000000026],"84":[8.7260000000000008e-06,9.9729999999999992e-06],"3276800":[1.45262147,1.471764096],"55296":[0.0077279549999999999,0.0078891090000000001],"688128":[0.15182145999999999,0.22055174499999999],"8192":[0.001008847,0.0010297450000000001],"10240":[0.0011668639999999999,0.001179149],"15872":[0.0020080639999999999,0.002055332],"92":[1.0448000000000001e-05,1.164e-05],"26624":[0.003452269,0.0037732159999999994],"1792":[0.00021130000000000004,0.00024469900000000002],"11776":[0.001369985,0.0014430810000000001],"2944":[0.00031918099999999998,0.00035373500000000004],"88":[9.2050000000000008e-06,9.927e-06],"22528":[0.0026715670000000006,0.0028254620000000008],"1245184":[0.37383497100000002,0.46336208700000003],"15728640":[8.6129285850000006,8.6611235739999994],"96":[1.0831e-05,1.1011e-05],"1984":[0.00022252799999999997,0.000245097],"139264":[0.021031585000000002,0.021845057000000005],"475136":[0.100454417,0.14377912100000001],"13631488":[7.6203064000000005,7.9143153499999999],"416":[4.8372999999999999e-05,5.3520999999999998e-05],"928":[0.00010786,0.000117389],"512":[5.9196e-05,6.4337000000000004e-05],"18432":[0.002253414,0.0022792519999999998],"16777216":[9.1396383130000007],"9728":[0.001104472,0.001125097],"1769472":[0.64706709600000001,0.66899678200000001],"1703936":[0.62671468200000002,0.65595476699999999],"2048":[0.00023014900000000002,0.00023124499999999999],"14336":[0.00174745,0.00180484],"448":[5.0139999999999998e-05,5.9514e-05],"5505024":[2.5134617930000003,2.5340412460000001],"544":[6.2174000000000005e-05,6.6995999999999993e-05],"221184":[0.039180614000000002,0.044637988999999996],"90112":[0.012061374,0.013350631],"640":[6.9648999999999997e-05,7.7828000000000001e-05],"12800":[0.001673669,0.001889801],"262144":[0.043760008000000003,0.049822250000000005],"589824":[0.128590127,0.17250044],"884736":[0.25180725199999998,0.34143740300000003],"6144":[0.000721436,0.00073017699999999993],"1088":[0.00012359799999999999,0.000139262],"576":[6.2268999999999996e-05,6.5035000000000003e-05],"160":[1.6821e-05,1.8556e-05],"672":[6.9852999999999997e-05,7.2492999999999999e-05],"8912896":[4.4773487039999997,4.5246950999999997],"100":[1.1345000000000001e-05,1.3049e-05],"507904":[0.10893801,0.139438547],"3840":[0.0004447530000000001,0.00051193400000000002],"192":[2.1342999999999999e-05,2.1948000000000001e-05],"376832":[0.064741272000000002,0.073213737999999959],"98304":[0.014065524999999999,0.014159773],"5376":[0.000609031,0.00062197900000000015],"94208":[0.013123968,0.013505664000000001],"81920":[0.011105821,0.011543310000000003],"3407872":[1.494117803,1.5311015299999999],"104":[1.2313000000000001e-05,1.2512e-05],"122880":[0.018869661999999999,0.019676497000000001],"200":[2.5137e-05,2.5380000000000001e-05],"163840":[0.025094841,0.025410293],"4063232":[1.7435810599999999,1.8272770949999999],"5767168":[2.7044217800000001,2.7116603440000002],"12582912":[6.3880334220000003,12.258793843999999],"1600":[0.00020155600000000001,0.00020906599999999999],"136":[1.5223e-05,1.5523e-05],"232":[2.6718999999999999e-05,2.7667000000000001e-05],"7077888":[3.5381338370000002,3.9899549350000001],"86016":[0.011582547,0.012222893],"31744":[0.0039616009999999995,0.0042512410000000002],"168":[1.7473999999999999e-05,1.8989999999999999e-05],"622592":[0.13262346999999997,0.19275730999999999],"108":[1.2449000000000001e-05,1.4032000000000001e-05],"327680":[0.054486140000000002,0.068046803999999989],"2176":[0.00023841700000000002,0.000262904],"3328":[0.00041404800000000003,0.00048831599999999992],"1":[2.04e-07,2.1400000000000001e-07],"2":[2.35e-07,2.3799999999999999e-07],"3":[3.7899999999999999e-07,4.1199999999999998e-07],"4":[4.1699999999999999e-07,4.2599999999999998e-07],"7424":[0.00091478900000000005,0.00096285100000000003],"5":[6.0100000000000005e-07,6.7400000000000003e-07],"23552":[0.0027918680000000003,0.0029113240000000003],"6":[6.5799999999999999e-07,6.8199999999999999e-07],"61440":[0.0084540119999999986,0.0086843370000000003],"491520":[0.104221751,0.14959045800000004],"77824":[0.010642848,0.010688959],"7":[6.7100000000000001e-07,6.8999999999999996e-07],"8":[6.9299999999999997e-07,7.0100000000000004e-07],"208":[2.5162000000000001e-05,2.6495999999999998e-05],"9":[9.3900000000000003e-07,9.4900000000000004e-07],"73728":[0.010045120999999999,0.010327454],"304":[3.4273999999999997e-05,3.4632999999999999e-05],"400":[4.7066e-05,5.1609e-05],"1310720":[0.40043987400000003,0.51557214399999995],"336":[3.7602999999999999e-05,3.8427000000000003e-05],"3670016":[1.591001967,1.637000078],"6656":[0.00083895200000000012,0.00086856199999999981],"15360":[0.001885957,0.0019536179999999998],"432":[5.0949999999999998e-05,5.2154999999999998e-05],"950272":[0.27947208800000001,0.35857570900000002],"655360":[0.142895262,0.195412011],"69632":[0.0092834180000000016,0.009810789000000002],"11264":[0.0012780130000000002,0.001353571],"2752512":[1.054084765,1.0709562800000001],"8126464":[4.0458032099999999,4.2359977710000001],"27648":[0.0036578310000000003,0.0040283389999999997],"368":[3.7469000000000003e-05,4.0670999999999997e-05],"65536":[0.0090156110000000015,0.0094571429999999977],"16252928":[8.7670989949999996,8.997324592],"464":[5.6345999999999999e-05,5.7154000000000002e-05],"1015808":[0.29739472500000003,0.37100750199999999],"3072":[0.00033927399999999998,0.00034083900000000006],"110592":[0.016950554999999999,0.018432256000000001],"237568":[0.039211111999999999,0.042527809],"278528":[0.046775036999999992,0.052121090000000002],"496":[5.5631000000000003e-05,5.6711e-05],"13107200":[7.4106064639999998,7.8055323950000002],"9961472":[5.0124736409999997,5.0295043530000001],"5888":[0.00070361399999999987,0.00070580899999999973],"11010048":[5.3767664980000003,5.6884758839999998],"1920":[0.00021654400000000002,0.00023829],"2490368":[0.93586907600000002,0.95625513100000004],"19456":[0.0022722989999999998,0.0023153360000000003],"57344":[0.0079281580000000011,0.0082444269999999986],"1179648":[0.35126294299999999,0.49274573300000002],"4718592":[2.0665110759999998,2.1195993469999999],"360448":[0.061463422999999982,0.065359140999999996],"1572864":[0.51088584199999998,0.56817878499999996],"53248":[0.0076721360000000004,0.0080036320000000001],"3456":[0.00040738900000000008,0.000452748],"40960":[0.0050514069999999999,0.005524536],"4608":[0.00051012099999999999,0.00055810500000000004],"13824":[0.0017486839999999999,0.0018442129999999997],"819200":[0.23391668099999999,0.29115108199999995],"983040":[0.28182272900000005,0.38436822000000004],"8704":[0.0010243019999999999,0.001082195],"120":[1.2682e-05,1.3239e-05],"1024":[0.00011500099999999999,0.000122946],"49152":[0.0060341630000000012,0.0063586619999999993],"524288":[0.11132199,0.15668185400000001],"45056":[0.0057148389999999993,0.0057257460000000003],"229376":[0.039359752000000005,0.041282437999999998],"2688":[0.00028940899999999997,0.00032117099999999998],"152":[1.5311999999999998e-05,1.8465999999999999e-05],"5120":[0.00057740000000000027,0.00058774800000000002],"1507328":[0.48514147000000002,0.61116850899999997],"1216":[0.00013458200000000003,0.00013984500000000001],"1966080":[0.686296825,0.71199020599999996],"1900544":[0.68974446099999998,0.69281302],"184":[1.8640000000000001e-05,1.8938999999999999e-05],"7936":[0.00094830000000000001,0.00096674],"3801088":[1.6518499360000001,1.68616118],"6815744":[3.4582657829999999,3.872764423],"124":[1.4416000000000001e-05,1.4601e-05],"102400":[0.015947111,0.017059711999999998],"311296":[0.052945376999999995,0.063356638000000021],"1408":[0.000155828,0.00015816799999999998],"393216":[0.069943083000000003,0.079208747999999982],"4352":[0.00047624099999999997,0.00053255800000000003],"6553600":[3.4475340920000002,3.743975737],"20480":[0.002387924,0.0025274070000000002],"608":[6.9663e-05,7.5313000000000002e-05],"2228224":[0.81934651299999994,0.82662306399999996],"36864":[0.0044111460000000003,0.004637543],"704":[7.4719000000000001e-05,8.1358000000000003e-05],"720896":[0.161783752,0.24322118400000001],"800":[9.6028999999999998e-05,0.00010271499999999999],"2621440":[0.99397184999999999,1.0215293249999999],"425984":[0.089466540999999997,0.10960323499999999],"32768":[0.0041411770000000011,0.0043203870000000011],"12058624":[6.0018946670000002,6.1457730460000004],"128":[1.3473e-05,1.4632e-05],"180224":[0.027116015,0.027374789],"224":[2.5143e-05,2.8276000000000002e-05],"736":[8.6212999999999996e-05,9.4740000000000004e-05],"320":[3.4239000000000002e-05,3.7255000000000002e-05],"557056":[0.11979225,0.16012905499999999],"832":[9.9092999999999995e-05,9.9481999999999994e-05],"9437184":[4.7465382290000004,4.8103722180000004],"3584":[0.00041622800000000009,0.00045807699999999999],"6291456":[3.026633168,3.061295597],"256":[2.7753999999999999e-05,2.8351e-05],"15204352":[8.3109403660000005,9.0045013560000005],"28672":[0.0035873979999999995,0.00378984],"768":[9.0535e-05,9.8859999999999999e-05],"212992":[0.036534487999999997,0.042099015999999996],"864":[0.000105135,0.000109409],"352":[3.9804e-05,4.1063999999999999e-05],"253952":[0.043128657000000001,0.045263246],"960":[0.000109713,0.000120356],"24576":[0.0029501370000000007,0.0030289099999999997],"7680":[0.00096699699999999982,0.0009939110000000001],"294912":[0.050894324000000005,0.058763254000000001],"1048576":[0.30683566200000001,0.38192813399999997],"10485760":[5.1501708669999999,5.1647059720000001],"344064":[0.059279621000000005,0.068173303000000046],"288":[3.1211000000000003e-05,3.2313e-05],"1152":[0.000121903,0.00014011000000000001],"384":[3.9736e-05,4.4493000000000002e-05],"2304":[0.00025230399999999996,0.00027554900000000004],"896":[0.000102401,0.000111326],"480":[5.8749999999999998e-05,6.2199999999999994e-05],"1441792":[0.44590422699999999,0.58071420100000004],"992":[0.00011834500000000002,0.000119185],"3968":[0.00045290399999999996,0.000475279],"6400":[0.00083017599999999996,0.00084738700000000001],"1344":[0.00014150799999999999,0.000154363],"126976":[0.018997541,0.019556047],"2883584":[1.088869613,1.168958186],"753664":[0.167542054,0.25542425699999999],"16384":[0.0020626590000000001,0.002149354],"131072":[0.019833767999999998,0.019951030999999998],"458752":[0.095475522000000007,0.12542593099999999],"172032":[0.025819336000000005,0.026970148999999999],"12288":[0.001449122,0.001505326],"14680064":[8.1248084489999997,12.513522912999999],"1536":[0.00017370299999999999,0.00018390400000000001],"25600":[0.0034841050000000004,0.0034882029999999996],"1835008":[0.64627581000000001,0.66822130199999996],"10752":[0.0012356820000000001,0.0012948480000000001],"21504":[0.0025995969999999999,0.002603667],"7602176":[3.8441290549999998,3.9013771579999998],"5632":[0.00064072399999999985,0.00071782300000000003],"10":[9.569999999999999e-07,1.02e-06],"3145728":[1.2641158369999999,1.2726648709999999],"245760":[0.040996806000000004,0.046531878999999998],"1728":[0.00022085799999999999,0.00022183000000000004],"11":[9.2800000000000005e-07,9.8299999999999995e-07],"1114112":[0.32296953900000003,0.44800682599999997],"12":[9.5199999999999995e-07,1.04e-06],"7340032":[3.5559228360000001,3.756599805],"7168":[0.00087884700000000009,0.00092395999999999993],"13":[9.33e-07,9.6200000000000006e-07],"6029312":[2.8011836539999999,2.8154767270000001],"14":[1.1090000000000001e-06,1.2669999999999999e-06],"3200":[0.00038853599999999998,0.00042925400000000012],"20":[1.8199999999999999e-06,2.1629999999999999e-06],"204800":[0.035981789,0.040212537],"15":[1.0109999999999999e-06,1.068e-06],"13312":[0.0017702500000000003,0.0017925859999999999],"4980736":[2.2057558269999999,2.29507444],"118784":[0.018195973000000004,0.018714190999999998],"51200":[0.0072658040000000007,0.0080080749999999999],"16":[1.781e-06,1.84e-06],"21":[2.1569999999999998e-06,2.1619999999999998e-06],"917504":[0.26218025499999997,0.32703164799999995],"22":[2.1280000000000002e-06,2.2570000000000002e-06],"4864":[0.00055363900000000008,0.00058113999999999996],"17":[1.824e-06,2.1220000000000002e-06],"14848":[0.0018421429999999999,0.0021501709999999993],"23":[2.0470000000000001e-06,2.7369999999999998e-06],"786432":[0.18477903500000001,0.260055802],"18":[1.6899999999999999e-06,2.0159999999999998e-06],"1638400":[0.59034773299999999,0.63949585099999995],"7864320":[3.8897276619999999,4.0056334920000003],"24":[2.2419999999999999e-06,2.7030000000000002e-06],"14155776":[7.8835625240000002,8.263203334],"19":[1.7990000000000001e-06,2.1019999999999999e-06],"30":[3.4850000000000001e-06,3.5839999999999999e-06],"25":[3.123e-06,3.1750000000000001e-06],"31":[3.5310000000000002e-06,3.9820000000000002e-06],"1280":[0.00013398899999999997,0.000148553],"26":[2.932e-06,3.2270000000000002e-06],"3932160":[1.7176276660000001,1.8336079869999999],"2432":[0.00026428900000000007,0.000287056],"32":[3.4640000000000002e-06,3.8859999999999997e-06],"27":[3.242e-06,3.5090000000000002e-06],"409600":[0.087730223999999996,0.102781787]}},{"title":"OrderedSet formSymmetricDifference with Self (0% overlap)","results":{"28":[3.3359999999999999e-06,3.653e-06],"34":[4.0860000000000004e-06,4.4780000000000002e-06],"29":[3.1930000000000002e-06,3.8299999999999998e-06],"40":[5.0660000000000003e-06,5.5500000000000002e-06],"17408":[0.0025362889999999997,0.0026368619999999998],"1472":[0.00025851999999999998,0.00028741800000000001],"112":[1.2833000000000001e-05,1.2952999999999999e-05],"1376256":[0.61997892899999996,0.93963018200000004],"5242880":[3.6635682200000002,3.6793006899999998],"36":[4.3830000000000002e-06,4.7169999999999999e-06],"42":[5.6060000000000002e-06,6.5180000000000001e-06],"11534336":[9.9377925840000003,10.070694519],"114688":[0.018662236000000002,0.018965912000000001],"144":[1.7422999999999999e-05,1.8431999999999999e-05],"38":[4.6450000000000004e-06,5.079e-06],"240":[2.836e-05,2.8739999999999999e-05],"9216":[0.001433101,0.0014850709999999999],"44":[6.1489999999999999e-06,6.9779999999999999e-06],"1664":[0.00020264400000000001,0.00020881199999999998],"196608":[0.057598947999999997,0.061872705],"155648":[0.031886827,0.031988411000000001],"2816":[0.00047334999999999999,0.00049906799999999997],"50":[5.3519999999999997e-06,5.3669999999999996e-06],"2359296":[1.213397461,1.2450602200000001],"46":[6.6900000000000003e-06,7.6369999999999999e-06],"176":[2.8263999999999999e-05,3.0215000000000001e-05],"52":[5.5029999999999997e-06,5.5849999999999999e-06],"272":[3.5815000000000002e-05,3.9001000000000001e-05],"116":[1.2818e-05,1.3740999999999999e-05],"47104":[0.0092967740000000042,0.010181621],"6912":[0.00090314999999999992,0.00092595899999999996],"1856":[0.00023309700000000004,0.000248815],"48":[7.0369999999999997e-06,9.7569999999999999e-06],"2097152":[0.97327179699999999,1.085232778],"54":[5.7450000000000001e-06,5.9959999999999999e-06],"2031616":[0.89070326199999994,0.92346176700000004],"43008":[0.0075724309999999993,0.0083229589999999996],"60":[6.9129999999999997e-06,7.029e-06],"30720":[0.0042750799999999997,0.0044283959999999994],"56":[6.0190000000000003e-06,6.6229999999999999e-06],"62":[6.8630000000000002e-06,7.4710000000000001e-06],"58":[6.1140000000000002e-06,6.438e-06],"3014656":[2.3136071239999998,2.5503554660000001],"64":[6.8329999999999996e-06,7.4370000000000001e-06],"8388608":[5.0789039169999999,5.2575968949999998],"29696":[0.0039531279999999993,0.004033778],"216":[2.3694999999999999e-05,2.5914e-05],"106496":[0.016643715,0.017561583000000002],"72":[8.3990000000000004e-06,8.8599999999999999e-06],"442368":[0.09306758200000001,0.097165524000000017],"147456":[0.027649752,0.028083246999999999],"4456448":[2.6054501710000002,2.6645820539999998],"63488":[0.0095753450000000007,0.0098051730000000004],"38912":[0.006219352,0.0066664689999999995],"68":[8.2560000000000002e-06,8.7350000000000002e-06],"188416":[0.049405402999999994,0.052294644000000001],"248":[3.0519999999999999e-05,3.1996000000000003e-05],"80":[1.0558e-05,1.0828e-05],"2560":[0.00039274699999999999,0.00042216499999999995],"34816":[0.0052620699999999998,0.0054376430000000007],"3712":[0.00048255199999999992,0.00048937799999999973],"3538944":[1.8155536190000001,1.88337288],"76":[1.0709e-05,1.1814000000000001e-05],"4194304":[2.3498231039999999,2.3518541100000001],"851968":[0.239800815,0.363363143],"4096":[0.00055682699999999997,0.00056265899999999997],"59392":[0.008649772,0.0093123420000000012],"84":[1.0658e-05,1.2734999999999999e-05],"3276800":[1.6408531979999998,1.6517988219999999],"55296":[0.0077695079999999996,0.0079213530000000008],"688128":[0.19505041999999995,0.28064633299999997],"8192":[0.0011798430000000001,0.0012287840000000001],"10240":[0.001707945,0.0017119779999999999],"15872":[0.0022588789999999997,0.0022770199999999998],"92":[1.3662999999999999e-05,1.6923999999999999e-05],"26624":[0.0034966490000000001,0.003572839],"1792":[0.00021371500000000001,0.00025464199999999997],"11776":[0.0023601939999999999,0.002373123],"2944":[0.00052412199999999991,0.00055057999999999973],"88":[1.2191999999999999e-05,1.4814000000000001e-05],"22528":[0.0042225759999999987,0.004390143],"1245184":[0.473857052,0.671561187],"15728640":[9.7966295260000003,9.9175471880000003],"96":[1.6232e-05,1.8655e-05],"1984":[0.00025985400000000001,0.00026319199999999998],"139264":[0.025459312000000001,0.025526210000000001],"475136":[0.100952132,0.12933431000000001],"13631488":[7.927158049,8.1587733199999999],"416":[4.5102999999999998e-05,5.3545999999999999e-05],"928":[0.000112176,0.00012270599999999999],"512":[6.6327000000000004e-05,6.7837999999999997e-05],"18432":[0.002842289,0.0029161270000000006],"16777216":[10.920877213000001],"9728":[0.0015182310000000001,0.0015434770000000001],"1769472":[0.75231725799999993,0.801524562],"1703936":[0.70126634200000004,0.84571209299999994],"2048":[0.00026322200000000002,0.000264095],"14336":[0.0018455939999999997,0.0018900799999999999],"448":[5.0773999999999999e-05,6.0368000000000002e-05],"5505024":[4.2062217970000004,4.2088120240000002],"544":[7.6097e-05,7.7398999999999995e-05],"221184":[0.040437267000000061,0.044019747999999997],"90112":[0.018056082000000001,0.019399124],"640":[9.8523000000000005e-05,0.00010985],"12800":[0.0016000109999999997,0.0016525579999999997],"262144":[0.052189967999999996,0.056931457000000005],"589824":[0.13974175599999999,0.183351439],"884736":[0.24746768399999997,0.393253515],"6144":[0.001297035,0.001347841],"1088":[0.000145413,0.000160106],"576":[7.4958999999999998e-05,8.4202000000000005e-05],"160":[2.3400999999999998e-05,2.5128999999999999e-05],"672":[0.000110221,0.000114202],"8912896":[5.7267714979999997,5.7862596350000004],"100":[1.0138e-05,1.1063999999999999e-05],"507904":[0.111305538,0.176256414],"3840":[0.00049859100000000027,0.00057754400000000015],"192":[3.7908999999999999e-05,4.1910999999999999e-05],"376832":[0.108100654,0.111728814],"98304":[0.025001362999999999,0.026450379],"5376":[0.00086968699999999985,0.00091926000000000009],"94208":[0.020975042999999999,0.022215393],"81920":[0.014884348,0.015668275000000002],"3407872":[1.723615543,1.75027749],"104":[1.0941000000000001e-05,1.1191e-05],"122880":[0.020442181,0.021592548],"200":[2.2529999999999999e-05,2.2897000000000001e-05],"163840":[0.034905448999999998,0.035502326000000001],"4063232":[2.2334698080000002,2.302968328],"5767168":[4.7906868380000001,4.8101299920000002],"12582912":[13.510759898,26.879793019000001],"1600":[0.000188092,0.000199402],"136":[1.7558999999999999e-05,1.8652e-05],"232":[2.7543999999999999e-05,2.8770000000000001e-05],"7077888":[3.958819412,4.2172972660000001],"86016":[0.016352930000000005,0.019087121000000002],"31744":[0.0044657760000000003,0.0046951550000000012],"168":[2.3828e-05,2.6078e-05],"622592":[0.15394401299999999,0.22515647599999999],"108":[1.1813e-05,1.2309e-05],"327680":[0.07930371700000001,0.085218492999999992],"2176":[0.00029883500000000001,0.00032056400000000002],"3328":[0.00040845199999999996,0.00047388199999999996],"1":[4.0999999999999999e-07,4.2800000000000002e-07],"2":[5.0699999999999997e-07,5.9100000000000004e-07],"3":[6.37e-07,7.0999999999999998e-07],"4":[5.8999999999999996e-07,6.4600000000000004e-07],"7424":[0.00096812700000000027,0.0010145039999999998],"5":[8.2799999999999995e-07,9.3900000000000003e-07],"23552":[0.0047019500000000007,0.0047900809999999999],"6":[8.54e-07,8.6400000000000001e-07],"61440":[0.009106467,0.0094074880000000003],"491520":[0.10825945100000001,0.15263120499999999],"77824":[0.013516927,0.013759752],"7":[9.5900000000000005e-07,1.015e-06],"8":[9.8200000000000008e-07,9.9300000000000006e-07],"208":[2.2802999999999998e-05,2.4468e-05],"9":[1.26e-06,1.277e-06],"73728":[0.012274772999999999,0.012363895],"304":[4.2685000000000002e-05,4.4839000000000002e-05],"400":[4.2517e-05,4.6536999999999998e-05],"1310720":[0.53090547799999999,0.81156758699999998],"336":[5.2902999999999998e-05,5.5999999999999999e-05],"3670016":[1.9150286839999999,1.925960919],"6656":[0.00082497600000000005,0.00082664000000000001],"15360":[0.0020520629999999994,0.0021371099999999994],"432":[5.0489999999999999e-05,5.0599000000000001e-05],"950272":[0.28132900599999999,0.40200707999999996],"655360":[0.176168411,0.229674449],"69632":[0.010950140000000001,0.011483499999999999],"11264":[0.0021420659999999998,0.002176496],"2752512":[1.763255046,1.828611722],"8126464":[4.8700498669999996,4.9984187789999996],"27648":[0.0036562740000000002,0.003758146],"368":[6.6681999999999996e-05,6.9678000000000006e-05],"65536":[0.010025309,0.010894257000000001],"16252928":[10.370885394,10.529692612],"464":[5.8150999999999999e-05,5.8777999999999999e-05],"1015808":[0.31709964200000001,0.492944508],"3072":[0.00057916800000000002,0.00065980600000000009],"110592":[0.017298792,0.019590693999999999],"237568":[0.044747132000000002,0.050099096999999995],"278528":[0.057156575000000001,0.061981289000000009],"496":[6.1017999999999998e-05,6.4356999999999994e-05],"13107200":[7.4955369259999998,7.6930997699999999],"9961472":[7.1208984439999998,7.1442244349999999],"5888":[0.0011812580000000001,0.0011825639999999997],"11010048":[8.6722290209999997,8.9814140340000002],"1920":[0.00023978699999999999,0.00025986300000000004],"2490368":[1.3725441709999999,1.4749794010000001],"19456":[0.0031025779999999995,0.0031360059999999993],"57344":[0.0082075019999999967,0.0083295720000000004],"1179648":[0.42108164599999998,0.60690654200000005],"4718592":[2.9843238539999999,3.0422659589999999],"360448":[0.098183018000000025,0.101682089],"1572864":[0.95457588100000001,1.098984529],"53248":[0.0073762839999999994,0.0076108769999999977],"3456":[0.000411178,0.00047980599999999999],"40960":[0.0068877749999999988,0.0076447440000000002],"4608":[0.00065189200000000027,0.00067694299999999973],"13824":[0.0017498420000000004,0.0018302659999999999],"819200":[0.223351772,0.31417020899999998],"983040":[0.29407126900000002,0.43422618300000004],"8704":[0.0012367770000000001,0.0013517850000000001],"120":[1.3318e-05,1.3518e-05],"1024":[0.000131252,0.000136117],"49152":[0.010846599,0.011262611],"524288":[0.11690977399999999,0.15825752200000001],"45056":[0.0083012819999999984,0.0088156250000000005],"229376":[0.041771957000000005,0.043605249999999998],"2688":[0.000448083,0.00046017300000000816],"152":[2.0183999999999999e-05,2.1290000000000001e-05],"5120":[0.00083852000000000004,0.00085893600000000003],"1507328":[0.80341085899999998,1.1520555859999999],"1216":[0.000171082,0.000187584],"1966080":[0.84947784699999995,0.88589330899999996],"1900544":[0.85410058599999994,0.858517741],"184":[2.8839999999999998e-05,2.9957000000000001e-05],"7936":[0.001085768,0.001098232],"3801088":[2.012637099,2.054581942],"6815744":[3.752974424,3.9997218569999999],"124":[1.5094e-05,1.5586e-05],"102400":[0.016053507000000005,0.016393063000000003],"311296":[0.072164803999999999,0.077428509000000006],"1408":[0.00023234000000000007,0.00025626000000000002],"393216":[0.12905678600000001,0.131606165],"4352":[0.000598647,0.00060349699999999993],"6553600":[3.636364001,3.7872834499999999],"20480":[0.0033919969999999999,0.0035170099999999997],"608":[9.3387999999999994e-05,9.7900999999999997e-05],"2228224":[1.095578728,1.1032101439999999],"36864":[0.0056255460000000012,0.0058793100000000004],"704":[0.00012308299999999999,0.000133237],"720896":[0.22282133800000001,0.36364462500000005],"800":[8.9143999999999999e-05,9.3462999999999996e-05],"2621440":[1.5426523699999999,1.665676586],"425984":[0.087007247999999995,0.096906110999999989],"32768":[0.0047002120000000005,0.0050315760000000003],"12058624":[11.479648458,11.955484808],"128":[1.4076999999999999e-05,1.6203999999999999e-05],"180224":[0.042592063999999999,0.043485072],"224":[2.5839000000000001e-05,2.6080000000000001e-05],"736":[0.00012912499999999998,0.00014616999999999999],"320":[4.8730999999999998e-05,4.9633999999999999e-05],"557056":[0.13051933800000001,0.16667198299999997],"832":[9.5013999999999995e-05,0.000101879],"9437184":[6.2797934829999997,6.6732387979999999],"3584":[0.00042871200000000004,0.00046714099999999991],"6291456":[6.4817621479999996,6.6538815590000002],"256":[3.1633e-05,3.4326999999999998e-05],"15204352":[9.3323373059999994,9.6462779839999993],"28672":[0.0039080900000000003,0.0039646020000000002],"768":[0.00015400799999999997,0.00015817199999999999],"212992":[0.038022142999999994,0.044513645000000011],"864":[0.000106198,0.00010974],"352":[5.9644e-05,6.6162999999999997e-05],"253952":[0.048644863000000003,0.05105849400000001],"960":[0.00011793,0.00012954000000000004],"24576":[0.00533462,0.0063018790000000007],"7680":[0.001044763,0.0010794649999999999],"294912":[0.064971575000000004,0.070079562000000012],"1048576":[0.33795303399999999,0.51215521799999997],"10485760":[7.7811371249999999,7.7817084019999996],"344064":[0.088025056000000004,0.091910653000000023],"288":[4.0587999999999998e-05,4.0593999999999998e-05],"1152":[0.000164573,0.00016661700000000003],"384":[6.5161999999999997e-05,8.1756999999999997e-05],"2304":[0.00034886000000000004,0.00035271900000000004],"896":[0.000115535,0.000118233],"480":[6.2003999999999998e-05,6.5877000000000006e-05],"1441792":[0.69627563100000001,1.0469588940000001],"992":[0.00013484200000000001,0.000135036],"3968":[0.00053167399999999999,0.00054543000000000007],"6400":[0.00077984399999999991,0.000783003],"1344":[0.00021602200000000001,0.00022578599999999996],"126976":[0.021627938999999995,0.022145748],"2883584":[2.0031028740000001,2.090679143],"753664":[0.24428867300000001,0.387249014],"16384":[0.0022895459999999995,0.002445563],"131072":[0.022578499000000002,0.023349871000000001],"458752":[0.097239031000000004,0.11307476399999999],"172032":[0.038227269000000001,0.040054922999999992],"12288":[0.0026400590000000002,0.002831793],"14680064":[8.8229429499999998,25.401125429],"1536":[0.00029294,0.00032438700000000004],"25600":[0.0032066880000000001,0.0033506019999999998],"1835008":[0.752853298,0.79222959800000003],"10752":[0.0018541829999999999,0.001888137],"21504":[0.0037263800000000001,0.003867194],"7602176":[4.447573309,4.4778154390000005],"5632":[0.001047292,0.001135023],"10":[1.1400000000000001e-06,1.1620000000000001e-06],"3145728":[2.8058724929999999,2.8852949739999998],"245760":[0.047780778000000003,0.050631713000000002],"1728":[0.00021231099999999997,0.00021593300000000002],"11":[1.322e-06,1.393e-06],"1114112":[0.38332068000000002,0.57333771899999997],"12":[1.37e-06,1.412e-06],"7340032":[4.0797473100000001,4.2272271400000001],"7168":[0.00092488399999999995,0.00097293800000000012],"13":[1.5880000000000001e-06,1.6840000000000001e-06],"6029312":[5.5019842179999996,5.5203562909999997],"14":[1.875e-06,1.979e-06],"3200":[0.00036639999999999996,0.00038127199999999999],"20":[2.5100000000000001e-06,2.7970000000000001e-06],"204800":[0.035956938000000008,0.039245667000000005],"15":[1.9039999999999999e-06,2.0250000000000001e-06],"13312":[0.0016641640000000003,0.0017410870000000001],"4980736":[3.282664279,3.344760505],"118784":[0.019366743999999998,0.020586709000000002],"51200":[0.0068990030000000008,0.0080319609999999989],"16":[2.243e-06,2.508e-06],"21":[2.9009999999999998e-06,2.9560000000000002e-06],"917504":[0.27230220999999999,0.37947969400000003],"22":[2.8559999999999998e-06,3.0900000000000001e-06],"4864":[0.00070606899999999992,0.00076501],"17":[2.1320000000000001e-06,2.554e-06],"14848":[0.001975503,0.0020754509999999999],"23":[2.9859999999999999e-06,3.6229999999999999e-06],"786432":[0.28920516200000002,0.39702790399999999],"18":[2.2340000000000001e-06,2.74e-06],"1638400":[0.66325143500000006,0.79256229199999995],"7864320":[4.6732735229999998,4.6919882780000002],"24":[3.5860000000000001e-06,5.152e-06],"14155776":[8.3556212439999999,8.585503117],"19":[2.3020000000000002e-06,2.385e-06],"30":[3.4790000000000001e-06,3.4960000000000001e-06],"25":[2.8710000000000001e-06,2.9699999999999999e-06],"31":[3.6059999999999999e-06,5.0590000000000002e-06],"1280":[0.00020079199999999998,0.00020253299999999997],"26":[2.869e-06,3.0869999999999998e-06],"3932160":[2.0829818150000001,2.1792763710000003],"2432":[0.00035058300000000001,0.00038553399999999999],"32":[3.7780000000000001e-06,3.8859999999999997e-06],"27":[3.1219999999999999e-06,3.2959999999999999e-06],"409600":[0.082492808000000001,0.087818610000000005]}},{"title":"OrderedSet formSymmetricDifference with Self (25% overlap)","results":{"28":[3.3790000000000002e-06,3.6279999999999998e-06],"34":[3.698e-06,3.873e-06],"29":[3.0620000000000001e-06,3.9530000000000001e-06],"40":[4.5879999999999999e-06,5.8680000000000004e-06],"17408":[0.0022462430000000002,0.0024709139999999998],"1472":[0.00021279799999999999,0.00024008000000000002],"112":[1.2499e-05,1.2652e-05],"1376256":[0.55185565599999997,0.79274833300000003],"5242880":[3.2848493059999999,3.3672250410000002],"36":[3.9439999999999998e-06,4.0879999999999997e-06],"42":[4.7140000000000001e-06,5.1930000000000001e-06],"11534336":[8.6886424529999999,8.7885520770000003],"114688":[0.018004767999999997,0.018167771999999999],"144":[1.4620999999999999e-05,1.6804e-05],"38":[4.1389999999999997e-06,4.746e-06],"240":[2.7137000000000001e-05,2.7409000000000001e-05],"9216":[0.0012577860000000001,0.001295399],"44":[5.1880000000000001e-06,6.5440000000000004e-06],"1664":[0.00019012799999999999,0.000200602],"196608":[0.048655887999999994,0.050922303000000002],"155648":[0.028290674999999998,0.030720693999999993],"2816":[0.00040127699999999991,0.00042762900000000001],"50":[5.2889999999999997e-06,5.6459999999999998e-06],"2359296":[1.118367358,1.1191199460000001],"46":[5.4650000000000002e-06,5.9190000000000004e-06],"176":[2.4256e-05,2.4759000000000001e-05],"52":[5.7139999999999998e-06,5.9190000000000004e-06],"272":[2.8928000000000002e-05,3.2236000000000001e-05],"116":[1.2880999999999999e-05,1.2886e-05],"47104":[0.0080018930000000012,0.0082766920000000004],"6912":[0.00090003399999999986,0.00090056399999999986],"1856":[0.00022162500000000003,0.000226596],"48":[5.9120000000000003e-06,8.0369999999999995e-06],"2097152":[0.88690914399999998,0.99191353500000001],"54":[5.9889999999999997e-06,6.0900000000000001e-06],"2031616":[0.77292354500000005,0.80494440599999995],"43008":[0.0065488069999999985,0.0074751059999999996],"60":[7.1110000000000002e-06,7.1720000000000001e-06],"30720":[0.0041540980000000002,0.0042220979999999996],"56":[6.4799999999999998e-06,6.9099999999999999e-06],"62":[7.0079999999999996e-06,8.0649999999999999e-06],"58":[6.3060000000000003e-06,6.7909999999999999e-06],"3014656":[2.0426375700000001,2.130734296],"64":[7.3710000000000002e-06,7.9920000000000007e-06],"8388608":[4.729133912,4.8268732510000003],"29696":[0.0038871329999999996,0.0039014479999999996],"216":[2.2439e-05,2.5630999999999999e-05],"106496":[0.015860334,0.016977696],"72":[7.5610000000000001e-06,8.3080000000000008e-06],"442368":[0.087893020000000016,0.098600908000000015],"147456":[0.024654303999999998,0.025403186000000001],"4456448":[2.4006275970000002,2.5202835760000002],"63488":[0.0093356270000000043,0.0094032850000000008],"38912":[0.0055027159999999995,0.0056016020000000015],"68":[7.2570000000000001e-06,7.7149999999999998e-06],"188416":[0.041565008000000001,0.044262922000000003],"248":[2.9924e-05,3.1288999999999998e-05],"80":[8.6549999999999993e-06,9.0240000000000003e-06],"2560":[0.000348761,0.00037680800000000001],"34816":[0.0046634010000000002,0.0046717169999999988],"3712":[0.00046046500000000002,0.00049585900000000008],"3538944":[1.6779140290000001,1.7650862979999999],"76":[8.4409999999999993e-06,1.0288999999999999e-05],"4194304":[2.108277159,2.1550253210000001],"851968":[0.214311223,0.28987497400000001],"4096":[0.00052595599999999984,0.00057077199999999999],"59392":[0.0085207939999999982,0.0095530010000000002],"84":[9.0480000000000004e-06,1.1028e-05],"3276800":[1.4559741819999998,1.549947749],"55296":[0.007518831000000001,0.0080223769999999989],"688128":[0.17527904699999999,0.25938871600000002],"8192":[0.001169298,0.001266997],"10240":[0.0014396109999999999,0.001538839],"15872":[0.002277528,0.0023490569999999994],"92":[1.1398e-05,1.4188e-05],"26624":[0.0033701400000000006,0.003458689],"1792":[0.00021966600000000001,0.00024935999999999996],"11776":[0.0019581450000000001,0.001985306],"2944":[0.00046129499999999991,0.00048970100000000016],"88":[9.961e-06,1.1747e-05],"22528":[0.0035099580000000005,0.0037201550000000006],"1245184":[0.43940404799999999,0.64459865199999999],"15728640":[9.0330525710000007,9.3446312809999998],"96":[1.4048e-05,1.4348000000000001e-05],"1984":[0.00024958400000000001,0.000274014],"139264":[0.022890281999999998,0.023144751000000002],"475136":[0.099241747000000005,0.116760428],"13631488":[7.5067812070000004,7.8102242669999997],"416":[4.6042999999999999e-05,5.2884999999999999e-05],"928":[0.000109882,0.000115951],"512":[6.3738999999999994e-05,7.0036999999999994e-05],"18432":[0.002467323,0.0026094899999999999],"16777216":[10.210001910000001],"9728":[0.0013897810000000001,0.001398229],"1769472":[0.66462742699999999,0.68079334299999994],"1703936":[0.589790378,0.84787647499999996],"2048":[0.00027519299999999997,0.00028693299999999996],"14336":[0.0018462629999999997,0.0018929839999999997],"448":[5.0634999999999999e-05,6.0937999999999998e-05],"5505024":[3.7290791799999998,3.8031621919999998],"544":[6.7503999999999996e-05,6.7558999999999995e-05],"221184":[0.038567085000000001,0.041392607000000012],"90112":[0.015585907999999999,0.017285632000000002],"640":[8.6104000000000001e-05,9.4569999999999997e-05],"12800":[0.0015820980000000001,0.0016775010000000001],"262144":[0.049365663000000011,0.05406505100000001],"589824":[0.130412318,0.181086788],"884736":[0.22345032100000001,0.35957467900000001],"6144":[0.0010485220000000001,0.0010952609999999999],"1088":[0.00013367400000000002,0.00013997699999999998],"576":[6.8139999999999995e-05,7.3671999999999995e-05],"160":[1.9712999999999999e-05,2.1148000000000001e-05],"672":[8.9517000000000004e-05,9.3716999999999997e-05],"8912896":[5.2021953950000004,5.3574907730000003],"100":[9.6010000000000001e-06,1.0922e-05],"507904":[0.107770164,0.14436796599999999],"3840":[0.00050431900000000014,0.00057088499999999993],"192":[2.9326999999999999e-05,3.3405999999999998e-05],"376832":[0.095539927999999996,0.100930693],"98304":[0.020428445999999999,0.020482325000000003],"5376":[0.00076314600000000014,0.00080403899999999977],"94208":[0.017810579,0.018611701000000001],"81920":[0.01309956,0.013895474],"3407872":[1.5283146379999999,1.583370352],"104":[1.0464e-05,1.0903e-05],"122880":[0.019958292999999998,0.020739641],"200":[2.2387000000000001e-05,2.2906999999999999e-05],"163840":[0.030623989000000001,0.03119034],"4063232":[2.0247351610000002,2.1027857559999998],"5767168":[4.1679136640000003,4.2049456970000003],"12582912":[11.868443366999999,12.402087893000001],"1600":[0.00017808899999999998,0.00019392699999999999],"136":[1.5003e-05,1.5860000000000001e-05],"232":[2.7385999999999998e-05,2.8291000000000001e-05],"7077888":[3.6734961090000002,3.9682332339999999],"86016":[0.014214727,0.014739168],"31744":[0.0044054820000000005,0.0045682960000000003],"168":[1.9624999999999999e-05,2.1662999999999999e-05],"622592":[0.141510472,0.19811614799999999],"108":[1.1420000000000001e-05,1.2225000000000001e-05],"327680":[0.071940435000000011,0.082499477999999987],"2176":[0.00027038700000000008,0.000280742],"3328":[0.00039606500000000002,0.00042233099999999991],"1":[2.5199999999999998e-07,2.6600000000000003e-07],"2":[3.5999999999999999e-07,3.72e-07],"3":[3.9700000000000002e-07,4.5400000000000002e-07],"4":[4.2300000000000002e-07,4.5299999999999999e-07],"7424":[0.00098363699999999988,0.001004369],"5":[4.9999999999999998e-07,5.3600000000000004e-07],"23552":[0.0039364259999999998,0.0042023679999999997],"6":[5.5300000000000004e-07,5.6100000000000001e-07],"61440":[0.008707345,0.0093463680000000007],"491520":[0.106235752,0.13866056199999999],"77824":[0.011872564,0.012125855],"7":[5.6599999999999996e-07,5.9599999999999999e-07],"8":[5.8800000000000002e-07,6.4899999999999995e-07],"208":[2.2246e-05,2.3297000000000001e-05],"9":[6.7999999999999995e-07,6.9500000000000002e-07],"73728":[0.010922574000000001,0.011241141999999999],"304":[3.396e-05,3.8399999999999998e-05],"400":[4.4180000000000001e-05,4.4267999999999997e-05],"1310720":[0.50509849799999995,0.68595577900000004],"336":[4.4814000000000002e-05,4.6014999999999999e-05],"3670016":[1.7396995369999999,1.8473901159999999],"6656":[0.00082945699999999992,0.00084895700000000001],"15360":[0.0021250459999999998,0.0021455609999999998],"432":[4.8721000000000003e-05,5.1291000000000001e-05],"950272":[0.25121156,0.33993668100000002],"655360":[0.16669532500000001,0.241315638],"69632":[0.009925591000000001,0.010482203000000001],"11264":[0.0017448349999999995,0.001884829],"2752512":[1.5410040980000002,1.614954491],"8126464":[4.5180612599999996,4.6298304000000003],"27648":[0.0035836710000000001,0.0037740220000000006],"368":[5.2082e-05,5.7578000000000003e-05],"65536":[0.009850892,0.010697431],"16252928":[9.5523058570000003,9.9734564040000002],"464":[5.8347999999999998e-05,5.8789999999999998e-05],"1015808":[0.280799941,0.42958754200000004],"3072":[0.00051428600000000008,0.00054507199999999996],"110592":[0.016525953999999995,0.018043128999999998],"237568":[0.04193479700000001,0.04870907300000004],"278528":[0.051990528999999994,0.056745619999999997],"496":[6.3777999999999998e-05,6.4129999999999998e-05],"13107200":[7.039389291,7.2097866359999996],"9961472":[6.3253180840000001,6.409526262],"5888":[0.00095576199999999997,0.00098250399999999993],"11010048":[7.7660638000000004,8.0892954400000008],"1920":[0.00023672499999999999,0.000247373],"2490368":[1.260941343,1.3148143349999999],"19456":[0.0026467920000000007,0.0027339510000000001],"57344":[0.0080109569999999991,0.0082947379999999994],"1179648":[0.39139114200000003,0.549160274],"4718592":[2.7495927619999998,2.7931022630000002],"360448":[0.086308382999999989,0.089822258000000002],"1572864":[0.87759685900000006,1.050388917],"53248":[0.007214954,0.0075042019999999997],"3456":[0.00043003099999999999,0.00045066400000000003],"40960":[0.0059742280000000016,0.0064195520000000002],"4608":[0.00060153599999999995,0.00063170999999999974],"13824":[0.0017978060000000001,0.001830024],"819200":[0.20081468,0.30362999200000002],"983040":[0.27276555600000002,0.36643652999999998],"8704":[0.0011029379999999999,0.0012083669999999999],"120":[1.2717e-05,1.3882e-05],"1024":[0.00013442799999999999,0.00013631799999999999],"49152":[0.009027775,0.0094473760000000004],"524288":[0.117519452,0.14540420300000001],"45056":[0.0073368579999999991,0.0075682179999999998],"229376":[0.039981259000000005,0.042217827999999992],"2688":[0.00036497799999999996,0.00038076399999999996],"152":[1.7119e-05,1.9695999999999999e-05],"5120":[0.00071480799999999994,0.00074046600000000017],"1507328":[0.73630784699999996,1.0723281730000001],"1216":[0.00015324100000000001,0.000159328],"1966080":[0.74330945299999995,0.77603731600000003],"1900544":[0.74624179599999996,0.74778200799999994],"184":[2.2943999999999999e-05,2.5060999999999999e-05],"7936":[0.0010715759999999999,0.001097425],"3801088":[1.7952862789999999,1.927513467],"6815744":[3.5172464720000001,3.7707598820000001],"124":[1.4531e-05,1.5548000000000001e-05],"102400":[0.014791696999999998,0.015608289000000001],"311296":[0.067952388000000016,0.069050721999999981],"1408":[0.000207219,0.00021270500000000002],"393216":[0.11182263000000001,0.116143071],"4352":[0.00051401599999999995,0.00056499899999999984],"6553600":[3.3978933659999999,3.5699197639999998],"20480":[0.0029161430000000004,0.0029496079999999998],"608":[8.0700999999999999e-05,8.2070000000000005e-05],"2228224":[1.0486049660000001,1.049538114],"36864":[0.0049891790000000007,0.0052916730000000011],"704":[0.000104196,0.000106294],"720896":[0.197307171,0.29037979400000002],"800":[8.8576e-05,9.268e-05],"2621440":[1.4189636920000002,1.4994555119999999],"425984":[0.086761961999999984,0.091513533000000008],"32768":[0.0047965619999999999,0.0052706960000000001],"12058624":[9.8685859950000001,10.138031113],"128":[1.4864e-05,1.6643999999999999e-05],"180224":[0.038130436999999996,0.038568265000000004],"224":[2.3955e-05,2.4539999999999999e-05],"736":[0.00011033499999999999,0.00012544700000000002],"320":[4.0197999999999997e-05,4.2092999999999998e-05],"557056":[0.119432696,0.15426229599999997],"832":[9.2070000000000004e-05,9.8014e-05],"9437184":[5.7482296379999998,5.7922885989999999],"3584":[0.00044408000000000002,0.00044488199999999991],"6291456":[5.5016970179999998,5.7394952759999995],"256":[3.0861999999999997e-05,3.3006999999999998e-05],"15204352":[8.6371669959999995,9.1354530409999999],"28672":[0.0036745529999999992,0.0038685550000000001],"768":[0.000125112,0.00013053199999999999],"212992":[0.036666967000000009,0.041641107999999996],"864":[9.9801000000000002e-05,0.00011012499999999998],"352":[5.0426000000000001e-05,5.5232000000000002e-05],"253952":[0.04731171,0.048992835999999998],"960":[0.000125401,0.00012783200000000003],"24576":[0.0044288840000000001,0.004934384],"7680":[0.0010461469999999999,0.001072368],"294912":[0.059962586999999998,0.064463275],"1048576":[0.303785203,0.44259800999999999],"10485760":[6.938906985,7.0052231190000001],"344064":[0.078823978000000017,0.080018130999999992],"288":[3.4456999999999999e-05,3.5085e-05],"1152":[0.00013933700000000001,0.000144036],"384":[5.7246e-05,7.0204999999999996e-05],"2304":[0.000291594,0.00031779300000000013],"896":[0.00011328,0.000121953],"480":[6.3231000000000005e-05,6.4338000000000006e-05],"1441792":[0.65476918100000003,0.89239856500000003],"992":[0.00013436500000000001,0.00013699200000000001],"3968":[0.000502685,0.000545281],"6400":[0.00076367600000000013,0.00079245300000000025],"1344":[0.00018201600000000001,0.000191375],"126976":[0.020814227000000001,0.021267227999999996],"2883584":[1.7528436140000001,1.8950508829999999],"753664":[0.225413743,0.32985199099999996],"16384":[0.0024160140000000002,0.002424042],"131072":[0.022142033999999998,0.022932983000000011],"458752":[0.090533648000000008,0.11905181500000001],"172032":[0.033933873000000017,0.035344216999999976],"12288":[0.0021607139999999998,0.0023050099999999997],"14680064":[8.1676848379999996,9.8977168009999996],"1536":[0.000243143,0.00028028100000000001],"25600":[0.003167249,0.0032557889999999998],"1835008":[0.68503238399999999,0.70580090800000006],"10752":[0.0015683229999999999,0.0015838990000000002],"21504":[0.0032830480000000002,0.00335301],"7602176":[4.05666277,4.1855951319999996],"5632":[0.00091536300000000009,0.0009796039999999998],"10":[7.1600000000000001e-07,7.7100000000000001e-07],"3145728":[2.3544802709999999,2.3692105959999998],"245760":[0.044553521999999998,0.048244287999999996],"1728":[0.00021915500000000004,0.00022237900000000003],"11":[1.3659999999999999e-06,1.381e-06],"1114112":[0.365411924,0.49743143400000001],"12":[1.4360000000000001e-06,1.5409999999999999e-06],"7340032":[3.9069159500000001,3.9411428270000002],"7168":[0.00090165899999999997,0.00096410300000000001],"13":[1.418e-06,1.5e-06],"6029312":[4.7839347490000002,4.8047413639999998],"14":[1.7379999999999999e-06,1.7540000000000001e-06],"3200":[0.00036209400000000003,0.00040055400000000001],"20":[2.2299999999999998e-06,2.571e-06],"204800":[0.034231619000000005,0.037141824000000004],"15":[1.762e-06,1.7829999999999999e-06],"13312":[0.0016392479999999998,0.001728479],"4980736":[2.993267296,3.0600251510000001],"118784":[0.018723831,0.019684898999999999],"51200":[0.0067573440000000011,0.007344775999999999],"16":[2.2460000000000002e-06,2.4329999999999998e-06],"21":[2.4380000000000002e-06,2.8009999999999999e-06],"917504":[0.23648729800000001,0.32064208800000005],"22":[2.4700000000000001e-06,2.9380000000000001e-06],"4864":[0.00063139500000000009,0.00066607199999999997],"17":[1.9199999999999998e-06,2.5890000000000001e-06],"14848":[0.0019748970000000006,0.002049281],"23":[2.5739999999999998e-06,3.016e-06],"786432":[0.24878741900000001,0.33897059600000001],"18":[1.902e-06,2.1569999999999998e-06],"1638400":[0.57251946599999992,0.68075165500000001],"7864320":[4.2687611160000003,4.3781579559999999],"24":[3.185e-06,3.9079999999999997e-06],"14155776":[7.7303334719999999,8.0370493100000004],"19":[2.182e-06,2.1840000000000002e-06],"30":[3.3000000000000002e-06,3.3809999999999999e-06],"25":[2.9299999999999999e-06,2.9450000000000002e-06],"31":[3.7929999999999999e-06,5.0660000000000003e-06],"1280":[0.00017068699999999999,0.00019400299999999999],"26":[2.807e-06,3.27e-06],"3932160":[1.944523156,1.999148038],"2432":[0.00031470900000000004,0.00033325],"32":[3.7929999999999999e-06,3.9929999999999997e-06],"27":[3.2100000000000002e-06,3.3950000000000001e-06],"409600":[0.079064074999999984,0.082335907]}},{"title":"OrderedSet formSymmetricDifference with Self (50% overlap)","results":{"28":[2.5569999999999998e-06,3.0350000000000002e-06],"34":[3.2229999999999999e-06,3.4060000000000001e-06],"29":[2.3489999999999999e-06,3.134e-06],"40":[3.8820000000000003e-06,4.5929999999999999e-06],"17408":[0.001863137,0.002019561],"1472":[0.00019216,0.00020652100000000001],"112":[9.2909999999999996e-06,9.9820000000000003e-06],"1376256":[0.47576493399999997,0.66481828600000004],"5242880":[2.7217857940000001,2.7508982419999999],"36":[3.3550000000000001e-06,4.1169999999999997e-06],"42":[4.2010000000000001e-06,4.5900000000000001e-06],"11534336":[7.2827303700000003,7.6405849100000003],"114688":[0.01401586,0.015964135000000001],"144":[1.3029e-05,1.3642000000000001e-05],"38":[3.6540000000000001e-06,4.1880000000000004e-06],"240":[2.0783000000000001e-05,2.1115999999999999e-05],"9216":[0.0010408869999999999,0.0010511170000000001],"44":[4.4259999999999996e-06,5.1540000000000001e-06],"1664":[0.00015347000000000001,0.00015717799999999995],"196608":[0.041469120999999998,0.041542361],"155648":[0.023465937999999999,0.024215432999999998],"2816":[0.00033742100000000002,0.00035998700000000003],"50":[4.0759999999999996e-06,4.2300000000000002e-06],"2359296":[0.88842188700000002,0.92389337000000005],"46":[4.6569999999999996e-06,5.6420000000000004e-06],"176":[1.9437e-05,1.9851999999999999e-05],"52":[4.3030000000000001e-06,4.51e-06],"272":[2.3427000000000001e-05,2.7701000000000001e-05],"116":[9.3770000000000002e-06,9.859e-06],"47104":[0.0064865110000000004,0.0068050150000000002],"6912":[0.00067600399999999991,0.00068776699999999994],"1856":[0.000168627,0.00017339299999999993],"48":[4.9429999999999999e-06,6.3219999999999998e-06],"2097152":[0.76835765,0.86647321899999996],"54":[4.5990000000000004e-06,4.6840000000000004e-06],"2031616":[0.68855111499999999,0.75549883800000006],"43008":[0.0053378449999999999,0.0058244509999999996],"60":[5.4620000000000004e-06,5.7409999999999998e-06],"30720":[0.003136682,0.0031840990000000001],"56":[5.0130000000000001e-06,5.045e-06],"62":[5.3040000000000004e-06,6.1109999999999996e-06],"58":[4.9080000000000003e-06,5.1569999999999999e-06],"3014656":[1.6300181540000001,1.86149378],"64":[5.468e-06,6.5679999999999996e-06],"8388608":[4.0194182439999997,4.1383365679999997],"29696":[0.0029952809999999998,0.003015888],"216":[1.7025999999999999e-05,1.8119000000000001e-05],"106496":[0.012552842,0.013401306],"72":[7.1110000000000002e-06,7.2830000000000004e-06],"442368":[0.075924696999999999,0.084628850000000005],"147456":[0.020604830000000001,0.022110672999999997],"4456448":[2.0022576619999999,2.0268673239999999],"63488":[0.0072184059999999993,0.0074365719999999998],"38912":[0.0044547090000000011,0.0046928569999999999],"68":[6.3489999999999997e-06,6.6869999999999997e-06],"188416":[0.034338105000000022,0.037025506],"248":[2.2688999999999999e-05,2.2745e-05],"80":[7.6000000000000001e-06,8.1969999999999996e-06],"2560":[0.000282835,0.000303455],"34816":[0.0038786199999999993,0.0039046890000000002],"3712":[0.00035743900000000003,0.00035826900000000009],"3538944":[1.361621553,1.4280236479999999],"76":[7.7610000000000007e-06,9.1649999999999995e-06],"4194304":[1.9051423670000001,1.9395673229999999],"851968":[0.184909501,0.25610651499999998],"4096":[0.000409002,0.00042367499999999993],"59392":[0.0062949400000000006,0.007106074999999999],"84":[8.1280000000000008e-06,9.3729999999999999e-06],"3276800":[1.2676106890000001,1.345830418],"55296":[0.0058740530000000015,0.0061951409999999995],"688128":[0.15512474800000001,0.21842917500000003],"8192":[0.00088048499999999997,0.00094271600000000002],"10240":[0.0011839819999999997,0.001228799],"15872":[0.0016294300000000001,0.001729317],"92":[9.6180000000000001e-06,1.2602999999999999e-05],"26624":[0.0025477479999999999,0.0027340009999999998],"1792":[0.000174742,0.00018884900000000002],"11776":[0.001595059,0.0016772860000000001],"2944":[0.000380133,0.00041506900000000001],"88":[8.9879999999999993e-06,1.1036000000000001e-05],"22528":[0.002971684,0.0031058309999999994],"1245184":[0.36381275400000002,0.52043238599999997],"15728640":[7.8392360600000002,8.0081070190000005],"96":[1.1834999999999999e-05,1.2588999999999999e-05],"1984":[0.000192504,0.00019866799999999999],"139264":[0.019279311,0.019600392000000001],"475136":[0.083241865999999984,0.093698754000000023],"13631488":[6.4958249959999996,6.9579783669999999],"416":[3.5228000000000002e-05,3.9765999999999998e-05],"928":[8.9931000000000003e-05,9.0179999999999994e-05],"512":[4.7487999999999997e-05,5.0359999999999999e-05],"18432":[0.0020472570000000002,0.0021782959999999997],"16777216":[8.6278811690000001],"9728":[0.001128677,0.00115245],"1769472":[0.54286496699999998,0.61967411900000002],"1703936":[0.55411444199999993,0.65408101900000004],"2048":[0.000194766,0.000201814],"14336":[0.001416891,0.0014448690000000001],"448":[3.888e-05,4.3582999999999999e-05],"5505024":[3.1379906260000001,3.1789886520000001],"544":[5.5455999999999999e-05,5.7210999999999998e-05],"221184":[0.030720252999999996,0.036111163000000002],"90112":[0.013007068,0.014600122],"640":[7.1808000000000001e-05,7.5791999999999995e-05],"12800":[0.0012087480000000002,0.001275588],"262144":[0.039074827999999992,0.042344303],"589824":[0.11970438999999999,0.15090908800000002],"884736":[0.18847443,0.283753215],"6144":[0.00086860699999999986,0.00090545799999999994],"1088":[0.000111006,0.000114922],"576":[5.8526000000000002e-05,6.2719999999999996e-05],"160":[1.6728999999999999e-05,1.8430000000000001e-05],"672":[7.3863999999999996e-05,7.4232000000000003e-05],"8912896":[4.4617172270000003,4.7988165030000003],"100":[7.435e-06,8.5709999999999998e-06],"507904":[0.087791698000000001,0.124350053],"3840":[0.00038706299999999999,0.00042395399999999999],"192":[2.4023e-05,2.8289999999999998e-05],"376832":[0.079964160000000006,0.088714511999999995],"98304":[0.016788523,0.017179276],"5376":[0.00064525699999999999,0.00065225700000000027],"94208":[0.014617204999999998,0.015933828000000001],"81920":[0.010871834,0.01139752],"3407872":[1.286084325,1.368968897],"104":[8.4440000000000008e-06,8.85e-06],"122880":[0.015822003999999997,0.016616687000000005],"200":[1.7303e-05,1.7467000000000001e-05],"163840":[0.025491832999999998,0.026790749999999995],"4063232":[1.7097175280000001,1.7582347920000001],"5767168":[3.4717899970000001,3.5223952330000001],"12582912":[9.8249301060000001,10.783492874],"1600":[0.00013726,0.000149202],"136":[1.261e-05,1.3317e-05],"232":[2.0041999999999999e-05,2.0724999999999999e-05],"7077888":[2.969035045,3.4802151769999998],"86016":[0.011888136000000001,0.012415486999999999],"31744":[0.0033395929999999996,0.0034369090000000006],"168":[1.6419e-05,1.9106999999999998e-05],"622592":[0.12283665000000001,0.16774726000000001],"108":[8.7700000000000007e-06,9.3999999999999998e-06],"327680":[0.057760290000000013,0.061449964000000003],"2176":[0.000214995,0.000235968],"3328":[0.00030369700000000002,0.000336511],"1":[2.5100000000000001e-07,2.65e-07],"2":[3.5499999999999999e-07,3.58e-07],"3":[3.5900000000000003e-07,3.9799999999999999e-07],"4":[4.5400000000000002e-07,4.7199999999999999e-07],"7424":[0.00072073099999999995,0.00076905300000000012],"5":[5.1500000000000005e-07,5.9100000000000004e-07],"23552":[0.003245478,0.003443308],"6":[5.3499999999999996e-07,5.4799999999999998e-07],"61440":[0.0068825529999999996,0.0070580519999999996],"491520":[0.08983199,0.116681111],"77824":[0.009901751999999998,0.01034319],"7":[5.5899999999999996e-07,5.8500000000000001e-07],"8":[5.7199999999999999e-07,6.2300000000000001e-07],"208":[1.7136999999999999e-05,1.8122999999999999e-05],"9":[6.6199999999999997e-07,6.6300000000000005e-07],"73728":[0.0091585190000000004,0.0094214399999999997],"304":[2.8269999999999999e-05,3.2084e-05],"400":[3.4616999999999997e-05,3.4706999999999998e-05],"1310720":[0.43227038699999998,0.65964383900000001],"336":[3.6341999999999999e-05,4.0262999999999997e-05],"3670016":[1.513309835,1.56089297],"6656":[0.00060189200000000014,0.00064161199999999974],"15360":[0.001544924,0.0016081370000000002],"432":[3.7113000000000002e-05,3.7160999999999999e-05],"950272":[0.21515499699999999,0.295634854],"655360":[0.13797647400000002,0.194771532],"69632":[0.008217752,0.008571759],"11264":[0.0014305540000000001,0.0015793000000000001],"2752512":[1.226977411,1.3376502139999999],"8126464":[3.8182824549999999,3.858634549],"27648":[0.0026801259999999993,0.0027937259999999998],"368":[4.5145000000000002e-05,4.5454000000000002e-05],"65536":[0.007507845,0.0079740760000000001],"16252928":[8.3564342830000005,8.935961314],"464":[4.2735000000000003e-05,4.2741000000000003e-05],"1015808":[0.23709914700000001,0.35296623999999999],"3072":[0.000439813,0.00046475000000000005],"110592":[0.013472488000000001,0.014142185],"237568":[0.034018825000000009,0.039908835999999989],"278528":[0.042575294,0.04680155500000005],"496":[4.9044e-05,4.9339000000000003e-05],"13107200":[6.3349652120000002,6.469608064],"9961472":[5.2520903680000002,5.6671751480000001],"5888":[0.00078634500000000014,0.00082288099999999992],"11010048":[6.4376288449999999,6.9104136299999999],"1920":[0.000182814,0.00018837200000000007],"2490368":[1.1086252059999999,1.114303984],"19456":[0.0023007730000000003,0.002304211],"57344":[0.0061310599999999989,0.0064063129999999994],"1179648":[0.33055656200000005,0.46806542900000003],"4718592":[2.2426502789999998,2.3971073629999999],"360448":[0.071525809999999954,0.080531471999999993],"1572864":[0.67449147700000001,0.75455741399999998],"53248":[0.0055189000000000002,0.0058817100000000001],"3456":[0.000312665,0.00033086899999999997],"40960":[0.004892731,0.0051126460000000002],"4608":[0.00048746900000000003,0.00048776200000000009],"13824":[0.0013403289999999999,0.0014036390000000001],"819200":[0.186500206,0.260400297],"983040":[0.229066134,0.343340374],"8704":[0.00087124399999999986,0.00096658699999999987],"120":[9.6819999999999998e-06,1.0132999999999999e-05],"1024":[9.5032999999999996e-05,0.000102767],"49152":[0.0072926880000000003,0.0084356380000000005],"524288":[0.096295660000000005,0.12854929000000001],"45056":[0.0059539329999999989,0.0062394119999999997],"229376":[0.032148094000000002,0.033523780000000017],"2688":[0.00031828200000000008,0.00033019800000000008],"152":[1.4487e-05,1.6066000000000002e-05],"5120":[0.00057108199999999999,0.000622651],"1507328":[0.59060596799999998,0.844684137],"1216":[0.00013124300000000002,0.00014013099999999999],"1966080":[0.67220365299999996,0.70503361200000003],"1900544":[0.63603328400000003,0.75406667000000005],"184":[2.0064999999999998e-05,2.1070999999999999e-05],"7936":[0.00079756,0.00079805499999999999],"3801088":[1.673173901,1.696215585],"6815744":[3.15410513,3.3416240990000001],"124":[1.0957e-05,1.1122e-05],"102400":[0.011744916000000001,0.012447582],"311296":[0.051984745999999991,0.056438334999999992],"1408":[0.00016673399999999998,0.00017366499999999998],"393216":[0.090048298000000013,0.098938826999999979],"4352":[0.00042329500000000002,0.000468011],"6553600":[2.8253492740000001,3.0926950780000002],"20480":[0.0024360659999999998,0.0025192550000000002],"608":[6.7162000000000005e-05,7.1062999999999994e-05],"2228224":[0.84987427900000001,0.87690030200000002],"36864":[0.0041097860000000007,0.004268595],"704":[8.2140999999999998e-05,8.7185e-05],"720896":[0.16286842300000001,0.225071096],"800":[6.9145000000000003e-05,6.9311000000000001e-05],"2621440":[1.1952269259999999,1.252348569],"425984":[0.071741963000000006,0.074710660000000012],"32768":[0.0035709019999999999,0.0036830839999999997],"12058624":[8.2989217170000007,8.4199936599999994],"128":[1.0336000000000001e-05,1.1347e-05],"180224":[0.032587368999999998,0.032628167999999999],"224":[1.7782e-05,1.9009999999999999e-05],"736":[9.4401000000000006e-05,9.5495999999999995e-05],"320":[3.2756000000000003e-05,3.3175e-05],"557056":[0.101354653,0.12926521899999999],"832":[7.4036999999999996e-05,7.4299000000000001e-05],"9437184":[4.9913196820000003,4.993749394],"3584":[0.00032566400000000003,0.00033699199999999999],"6291456":[4.546444492,4.6412249030000003],"256":[2.1807e-05,2.3521000000000001e-05],"15204352":[7.352764659,8.1101080220000004],"28672":[0.0028037769999999999,0.0029360599999999999],"768":[0.000103977,0.000111495],"212992":[0.03092255,0.033711455000000001],"864":[7.3833999999999998e-05,8.2682000000000006e-05],"352":[4.0639000000000002e-05,4.4357999999999998e-05],"253952":[0.039963602000000001,0.041827027999999995],"960":[9.3632000000000001e-05,9.5098000000000003e-05],"24576":[0.0036559000000000001,0.0037286610000000003],"7680":[0.00076926800000000004,0.00078017399999999991],"294912":[0.048386224999999991,0.055127614000000005],"1048576":[0.25541986100000003,0.362446088],"10485760":[5.8554782970000003,5.9633997409999999],"344064":[0.065146003999999966,0.065327144000000004],"288":[2.8711e-05,2.9657000000000001e-05],"1152":[0.000114354,0.000118263],"384":[4.7253000000000003e-05,5.5804000000000003e-05],"2304":[0.000231857,0.00025306599999999998],"896":[8.4560000000000004e-05,8.5224999999999998e-05],"480":[4.2889999999999998e-05,4.9626000000000002e-05],"1441792":[0.52318555,0.72452880200000003],"992":[0.00010124,0.000101408],"3968":[0.00037510000000000001,0.00040727899999999997],"6400":[0.00058935500000000007,0.00059634800000000013],"1344":[0.00015647099999999999,0.00016564000000000002],"126976":[0.016319279999999999,0.016946163],"2883584":[1.4213982679999999,1.5677882750000001],"753664":[0.18855556800000001,0.24772274799999999],"16384":[0.001711546,0.001790392],"131072":[0.017760234,0.017934886000000001],"458752":[0.076925202000000012,0.1049996],"172032":[0.028523414,0.029161389000000003],"12288":[0.0017668719999999998,0.0018013600000000001],"14680064":[7.1601593929999998,7.8871976650000004],"1536":[0.00021376500000000001,0.000216393],"25600":[0.0024108429999999998,0.002596966],"1835008":[0.61383993999999997,0.65102993399999998],"10752":[0.0013062239999999997,0.0013836860000000001],"21504":[0.0026291819999999994,0.0028019400000000002],"7602176":[3.4971672360000001,3.6620541900000001],"5632":[0.00070232900000000002,0.00081590299999999998],"10":[6.9400000000000005e-07,7.1699999999999997e-07],"3145728":[1.895482162,1.8988299719999999],"245760":[0.035187176000000001,0.038911699000000001],"1728":[0.000161442,0.000164172],"11":[7.4399999999999999e-07,7.5600000000000005e-07],"1114112":[0.31044271600000001,0.38500910199999999],"12":[7.85e-07,8.4799999999999997e-07],"7340032":[3.3088186090000002,3.4270015730000001],"7168":[0.00069970600000000013,0.00076888299999999994],"13":[7.8899999999999998e-07,9.3099999999999996e-07],"6029312":[3.9471611819999999,3.9840434469999999],"14":[9.9099999999999991e-07,1.0419999999999999e-06],"3200":[0.00027879000000000001,0.00033114199999999998],"20":[1.894e-06,2.334e-06],"204800":[0.026908127,0.03020821100000004],"15":[9.4499999999999995e-07,1.004e-06],"13312":[0.001252162,0.0013568859999999999],"4980736":[2.529174555,2.5989116270000001],"118784":[0.015272899,0.015340104],"51200":[0.0053081020000000003,0.0054974309999999988],"16":[1.761e-06,1.8470000000000001e-06],"21":[2.075e-06,2.2539999999999999e-06],"917504":[0.223817129,0.32492976500000004],"22":[2.1390000000000002e-06,2.559e-06],"4864":[0.00053744899999999996,0.0005595550000000001],"17":[1.5889999999999999e-06,1.8929999999999999e-06],"14848":[0.00147196,0.0015564299999999997],"23":[2.1220000000000002e-06,3.1870000000000001e-06],"786432":[0.225898666,0.28044200200000002],"18":[1.7129999999999999e-06,1.832e-06],"1638400":[0.49720730200000002,0.58340364199999994],"7864320":[3.708780322,3.7668968400000002],"24":[2.5069999999999999e-06,3.01e-06],"14155776":[6.787746276,7.1686715330000004],"19":[1.7579999999999999e-06,2.0090000000000002e-06],"30":[2.6469999999999998e-06,2.8339999999999999e-06],"25":[2.2469999999999998e-06,2.3039999999999999e-06],"31":[3.0410000000000002e-06,3.2389999999999998e-06],"1280":[0.000149887,0.00016348600000000001],"26":[2.1579999999999999e-06,2.3829999999999999e-06],"3932160":[1.6726421089999999,1.80930477],"2432":[0.00027554800000000013,0.000275629],"32":[2.9179999999999998e-06,3.1889999999999999e-06],"27":[2.3929999999999998e-06,2.486e-06],"409600":[0.066180660000000016,0.067746661000000041]}},{"title":"OrderedSet formSymmetricDifference with Self (75% overlap)","results":{"28":[1.5680000000000001e-06,1.689e-06],"34":[2.3970000000000001e-06,2.5620000000000002e-06],"29":[1.451e-06,1.796e-06],"40":[2.853e-06,2.864e-06],"17408":[0.001426828,0.0014482239999999999],"1472":[0.000132471,0.00014612700000000002],"112":[7.1400000000000002e-06,7.7409999999999992e-06],"1376256":[0.37610666199999998,0.57391756100000002],"5242880":[2.2373658970000001,2.2890149260000001],"36":[2.4439999999999998e-06,2.7999999999999999e-06],"42":[3.0010000000000002e-06,3.1879999999999998e-06],"11534336":[5.926133149,6.2448483640000001],"114688":[0.011183143,0.011226748999999999],"144":[9.7580000000000004e-06,1.0609e-05],"38":[2.7080000000000002e-06,3.027e-06],"240":[1.6092000000000001e-05,1.6209e-05],"9216":[0.00076036000000000007,0.00079617399999999997],"44":[3.4309999999999998e-06,3.8410000000000002e-06],"1664":[0.00011066200000000001,0.000113318],"196608":[0.032611561999999983,0.033629728999999983],"155648":[0.018272976,0.019511458000000002],"2816":[0.00024982100000000001,0.00027093100000000019],"50":[3.1429999999999998e-06,3.3239999999999999e-06],"2359296":[0.75701547300000005,0.80053229199999998],"46":[3.4060000000000001e-06,4.0890000000000002e-06],"176":[1.4895999999999999e-05,1.5384e-05],"52":[3.4209999999999999e-06,3.506e-06],"272":[1.8059000000000001e-05,2.0185000000000001e-05],"116":[7.2459999999999997e-06,8.4279999999999996e-06],"47104":[0.0049407460000000002,0.0050814329999999998],"6912":[0.00052420500000000003,0.00052983299999999974],"1856":[0.00012817899999999999,0.00013405700000000001],"48":[3.613e-06,4.301e-06],"2097152":[0.66480744299999994,0.72092450699999999],"54":[3.5559999999999999e-06,3.5829999999999998e-06],"2031616":[0.56302775500000002,0.59284772100000005],"43008":[0.004108192000000001,0.0042811730000000001],"60":[4.2989999999999998e-06,4.3200000000000001e-06],"30720":[0.0024485900000000001,0.0026212040000000002],"56":[3.619e-06,3.9430000000000002e-06],"62":[4.0960000000000003e-06,4.262e-06],"58":[3.6890000000000002e-06,3.7179999999999998e-06],"3014656":[1.302650611,1.4757421019999999],"64":[4.1359999999999999e-06,4.6149999999999999e-06],"8388608":[3.5931141740000001,3.6009586059999998],"29696":[0.0022932599999999997,0.0023690490000000002],"216":[1.3360000000000001e-05,1.3713000000000001e-05],"106496":[0.010039496,0.010571018999999997],"72":[5.0509999999999996e-06,5.383e-06],"442368":[0.057770581000000001,0.067350326000000016],"147456":[0.016808518000000001,0.017412473000000001],"4456448":[1.639002413,1.787232715],"63488":[0.0054101619999999979,0.0057542909999999991],"38912":[0.0034011090000000007,0.003556905],"68":[4.69e-06,4.8049999999999997e-06],"188416":[0.026736159999999998,0.028372846],"248":[1.77e-05,1.7965000000000002e-05],"80":[5.5559999999999998e-06,5.7570000000000001e-06],"2560":[0.00021801199999999999,0.00021932399999999999],"34816":[0.002926934,0.0029349349999999996],"3712":[0.00027409800000000002,0.00027417199999999994],"3538944":[1.1473622780000001,1.315252289],"76":[5.767e-06,6.5420000000000002e-06],"4194304":[1.4198529309999999,1.5794268169999999],"851968":[0.16832186800000001,0.229329438],"4096":[0.00029971299999999995,0.00032351199999999987],"59392":[0.0049121029999999993,0.0055604600000000006],"84":[5.6489999999999996e-06,7.0539999999999997e-06],"3276800":[1.18874725,1.205633025],"55296":[0.0045326240000000007,0.0046341210000000006],"688128":[0.13034101100000001,0.176532104],"8192":[0.00067438899999999996,0.00073938200000000002],"10240":[0.00090058600000000009,0.00094761300000000025],"15872":[0.001233652,0.001336159],"92":[7.0400000000000004e-06,7.8679999999999999e-06],"26624":[0.0019645090000000001,0.0020710310000000001],"1792":[0.00013288299999999998,0.000144578],"11776":[0.001205554,0.0012421789999999997],"2944":[0.00028309400000000001,0.00031860199999999997],"88":[6.1469999999999998e-06,7.3440000000000003e-06],"22528":[0.0021955540000000002,0.0022665339999999997],"1245184":[0.30250603500000001,0.44728268599999998],"15728640":[6.6769311030000003,7.068802056],"96":[8.1140000000000006e-06,8.2830000000000001e-06],"1984":[0.00014164199999999998,0.00014169599999999999],"139264":[0.015490204,0.016091233],"475136":[0.064288055999999996,0.081594515999999978],"13631488":[5.2987897010000005,6.0402520610000003],"416":[2.7821999999999999e-05,3.0158000000000002e-05],"928":[6.6919000000000001e-05,6.8510999999999995e-05],"512":[3.6785000000000001e-05,3.8649000000000002e-05],"18432":[0.0015461489999999997,0.0016340700000000003],"16777216":[7.4798116490000002],"9728":[0.00081375899999999984,0.000828264],"1769472":[0.47304879799999999,0.55873833100000003],"1703936":[0.45612141900000003,0.56944356200000001],"2048":[0.000151779,0.00015422300000000004],"14336":[0.0010437419999999998,0.0010563880000000001],"448":[2.9515000000000001e-05,3.3458999999999999e-05],"5505024":[2.4605923860000001,2.5667144589999999],"544":[4.0559999999999998e-05,4.2951999999999998e-05],"221184":[0.024794136000000001,0.027452549],"90112":[0.010452729000000001,0.010855476000000001],"640":[5.2595e-05,5.6263e-05],"12800":[0.00093339500000000027,0.000975588],"262144":[0.034811098999999998,0.036452490000000004],"589824":[0.101416929,0.143818793],"884736":[0.18467322799999999,0.234863405],"6144":[0.00065086899999999988,0.00067534599999999985],"1088":[7.9053000000000004e-05,8.5698999999999994e-05],"576":[4.3322000000000003e-05,4.8545999999999999e-05],"160":[1.1773999999999999e-05,1.3349999999999999e-05],"672":[5.4107999999999998e-05,5.9985999999999998e-05],"8912896":[3.7313045649999999,3.9699925889999998],"100":[5.9689999999999999e-06,6.6189999999999996e-06],"507904":[0.075349807000000005,0.10404427500000001],"3840":[0.00028782799999999996,0.000323686],"192":[1.6441999999999999e-05,1.8039000000000001e-05],"376832":[0.063607099,0.065563601999999999],"98304":[0.012643821,0.012986843],"5376":[0.00045521200000000009,0.00050107899999999998],"94208":[0.010943141999999999,0.011753101],"81920":[0.0083488630000000015,0.0089299959999999991],"3407872":[1.100949417,1.229143855],"104":[6.5740000000000001e-06,6.8140000000000003e-06],"122880":[0.012839821,0.013016167],"200":[1.3359e-05,1.3458999999999999e-05],"163840":[0.02048579,0.021786070000000005],"4063232":[1.358119605,1.5390366119999999],"5767168":[2.8607292850000001,2.9268156460000001],"12582912":[7.4655865889999999,8.1940482499999998],"1600":[0.00011348099999999998,0.000114363],"136":[9.6600000000000007e-06,1.0458999999999999e-05],"232":[1.5106000000000001e-05,1.6167e-05],"7077888":[2.9870035829999999,3.0685136160000002],"86016":[0.0092802519999999993,0.010137294],"31744":[0.0025684480000000001,0.002634646],"168":[1.2092999999999999e-05,1.4138000000000001e-05],"622592":[0.096585610000000016,0.14725459199999999],"108":[6.6150000000000002e-06,6.7689999999999999e-06],"327680":[0.049189413000000001,0.049692206999999995],"2176":[0.00016786700000000006,0.000182554],"3328":[0.00022367200000000001,0.00023579299999999998],"1":[2.5199999999999998e-07,2.65e-07],"2":[2.9999999999999999e-07,3.1e-07],"3":[3.1600000000000002e-07,3.4900000000000001e-07],"4":[4.0999999999999999e-07,4.2300000000000002e-07],"7424":[0.00055779000000000007,0.00055971499999999991],"5":[4.7999999999999996e-07,5.1600000000000001e-07],"23552":[0.0024781669999999999,0.0025108110000000008],"6":[5.1500000000000005e-07,5.1799999999999995e-07],"61440":[0.0051718979999999994,0.0054335040000000013],"491520":[0.068851478999999952,0.10368962499999999],"77824":[0.0075625189999999993,0.0079759879999999998],"7":[5.37e-07,5.6100000000000001e-07],"8":[6.13e-07,6.3300000000000002e-07],"208":[1.3426e-05,1.4192999999999999e-05],"9":[6.9699999999999995e-07,7.0200000000000001e-07],"73728":[0.0069550409999999995,0.0075237760000000011],"304":[2.1617e-05,2.3730000000000001e-05],"400":[2.5785000000000001e-05,2.6625999999999999e-05],"1310720":[0.33848805199999998,0.52146327199999998],"336":[2.8897000000000001e-05,2.9243000000000001e-05],"3670016":[1.190791841,1.311302929],"6656":[0.00047820599999999995,0.000493265],"15360":[0.0011793330000000001,0.0012642419999999998],"432":[2.6951e-05,2.8115000000000001e-05],"950272":[0.21258885,0.31366669600000002],"655360":[0.10781059699999995,0.15554557199999999],"69632":[0.0063672959999999997,0.0065048390000000001],"11264":[0.0010679229999999999,0.001107771],"2752512":[1.0820020260000001,1.12808815],"8126464":[3.0995490800000001,3.1150510059999998],"27648":[0.0021779959999999998,0.0021818530000000001],"368":[3.2975999999999997e-05,3.4419999999999999e-05],"65536":[0.0056542490000000018,0.0060275180000000017],"16252928":[6.9461220260000003,8.6830546200000001],"464":[3.1446999999999999e-05,3.3300000000000003e-05],"1015808":[0.206091416,0.305820009],"3072":[0.00030731200000000001,0.00031275400000000005],"110592":[0.010558876,0.011147633000000001],"237568":[0.027039822999999998,0.03181126699999999],"278528":[0.034353228,0.039764958999999989],"496":[3.5522000000000003e-05,3.5886999999999997e-05],"13107200":[4.9552617320000003,5.6092996570000002],"9961472":[4.7682430580000004,4.8928784590000003],"5888":[0.0005800899999999999,0.00060734000000000027],"11010048":[5.4331734130000005,5.6538978789999996],"1920":[0.00013355999999999996,0.000140001],"2490368":[0.83448930199999993,0.96348695500000003],"19456":[0.0016970539999999999,0.0016993450000000003],"57344":[0.0047426919999999997,0.004878149],"1179648":[0.27179122,0.43419810000000003],"4718592":[1.95986441,2.0433674169999998],"360448":[0.055199555000000011,0.062721246999999966],"1572864":[0.58301157300000006,0.621265493],"53248":[0.0041926790000000004,0.0043924599999999991],"3456":[0.00023645800000000002,0.00026202099999999998],"40960":[0.0039322369999999999,0.0042891479999999996],"4608":[0.00035659599999999999,0.00037085500000000007],"13824":[0.001042425,0.0010443799999999999],"819200":[0.15839493900000001,0.23209914000000001],"983040":[0.19482445400000001,0.31353755699999997],"8704":[0.00068363499999999993,0.00072263199999999996],"120":[7.5660000000000001e-06,7.9959999999999993e-06],"1024":[7.3967000000000005e-05,7.8752999999999996e-05],"49152":[0.0054698990000000003,0.0056607420000000007],"524288":[0.073887051999999995,0.098288916000000004],"45056":[0.0044615710000000001,0.0046351759999999995],"229376":[0.027016611999999995,0.029505582000000009],"2688":[0.00023394900000000006,0.00024504799999999999],"152":[1.0910000000000001e-05,1.1867e-05],"5120":[0.00042787099999999997,0.00044516199999999998],"1507328":[0.47994994700000004,0.67775680599999999],"1216":[9.7417999999999995e-05,0.00011241799999999998],"1966080":[0.64563126599999998,0.66846400799999994],"1900544":[0.52949860699999995,0.732160213],"184":[1.5500999999999999e-05,1.5664000000000001e-05],"7936":[0.00058194799999999999,0.00061012299999999996],"3801088":[1.2394106199999999,1.2543199899999999],"6815744":[2.568509997,2.9448536440000002],"124":[8.4659999999999999e-06,8.7020000000000007e-06],"102400":[0.0093377679999999998,0.010282207],"311296":[0.042011984000000002,0.049713133],"1408":[0.00012267499999999999,0.00013119500000000002],"393216":[0.074417978999999995,0.078079384999999987],"4352":[0.000323748,0.00035534900000000008],"6553600":[2.4709457329999998,2.7396601450000002],"20480":[0.001838566,0.0018961660000000001],"608":[4.9960999999999998e-05,5.291e-05],"2228224":[0.68593285900000001,0.68983089600000003],"36864":[0.003207068,0.003333927999999999],"704":[6.1612999999999994e-05,6.3597999999999997e-05],"720896":[0.13395771200000001,0.18475398300000001],"800":[5.3041000000000003e-05,5.6224000000000002e-05],"2621440":[0.915856,0.97253161600000004],"425984":[0.063373846999999997,0.06510182099999999],"32768":[0.0027441890000000002,0.0027551120000000005],"12058624":[6.6639980599999999,6.7319224379999998],"128":[7.9440000000000005e-06,8.9940000000000006e-06],"180224":[0.025447833,0.02602051],"224":[1.3949e-05,1.4314999999999999e-05],"736":[6.7945000000000001e-05,7.3430999999999995e-05],"320":[2.3645000000000001e-05,2.7012000000000002e-05],"557056":[0.080928475999999999,0.115388955],"832":[5.486e-05,5.7602999999999997e-05],"9437184":[4.0127732260000002,4.1238392560000001],"3584":[0.00024827300000000014,0.00027434400000000004],"6291456":[3.721757524,3.7295395820000001],"256":[1.6739e-05,1.8488999999999999e-05],"15204352":[6.4563861520000003,7.2792255250000002],"28672":[0.0022507030000000002,0.0022752249999999996],"768":[7.2010999999999999e-05,7.9537999999999996e-05],"212992":[0.025646329000000002,0.027440118999999995],"864":[5.7917000000000001e-05,6.1816999999999994e-05],"352":[3.0531000000000003e-05,3.4690999999999997e-05],"253952":[0.032042227999999992,0.033079056000000009],"960":[6.4833999999999996e-05,7.1606999999999994e-05],"24576":[0.0026944920000000006,0.002739708],"7680":[0.00058134499999999993,0.00061430199999999973],"294912":[0.038631264999999998,0.040971354999999994],"1048576":[0.216886986,0.30819266400000001],"10485760":[4.925341231,4.9680336369999996],"344064":[0.051367029000000008,0.055935440999999989],"288":[2.1342999999999999e-05,2.3295e-05],"1152":[8.9245000000000004e-05,9.3002000000000002e-05],"384":[3.3787e-05,3.7395999999999999e-05],"2304":[0.00018439299999999998,0.00019377400000000002],"896":[6.2022999999999999e-05,6.3751999999999995e-05],"480":[3.1581000000000001e-05,3.6266000000000001e-05],"1441792":[0.47267994099999999,0.63298981199999993],"992":[7.3590999999999994e-05,7.5117000000000006e-05],"3968":[0.000288151,0.00031266200000000001],"6400":[0.00043242300000000008,0.00046088699999999999],"1344":[0.000111308,0.000112235],"126976":[0.013015015999999999,0.013149437],"2883584":[1.129460294,1.300793562],"753664":[0.15521007099999995,0.22470542600000001],"16384":[0.0013633110000000001,0.0013659799999999999],"131072":[0.014691132000000001,0.014980324999999999],"458752":[0.069104157999999999,0.084007742999999996],"172032":[0.022106496,0.022832603999999999],"12288":[0.0012974760000000001,0.0013635279999999999],"14680064":[6.0513831600000003,7.0129844840000004],"1536":[0.00015010300000000001,0.00015830299999999999],"25600":[0.001910964,0.0019814089999999999],"1835008":[0.51915126,0.578582873],"10752":[0.001022373,0.0010243399999999999],"21504":[0.0019888979999999994,0.0020901320000000002],"7602176":[2.9676769890000001,3.0675510949999998],"5632":[0.000558392,0.000598812],"10":[7.0900000000000001e-07,7.6300000000000004e-07],"3145728":[1.485827282,1.6441004669999999],"245760":[0.028118048,0.032004681999999944],"1728":[0.000117837,0.00012783899999999998],"11":[7.06e-07,7.4300000000000002e-07],"1114112":[0.254169906,0.34320285399999995],"12":[7.6499999999999998e-07,8.0100000000000004e-07],"7340032":[3.0656934179999999,3.0848133789999999],"7168":[0.0005293050000000001,0.000554446],"13":[8.0999999999999997e-07,8.6099999999999999e-07],"6029312":[3.1019350020000003,3.1971920549999999],"14":[9.3099999999999996e-07,9.4300000000000001e-07],"3200":[0.00022249800000000001,0.000235589],"20":[1.0979999999999999e-06,1.246e-06],"204800":[0.022634330000000001,0.025632408000000002],"15":[8.9500000000000001e-07,9.4900000000000004e-07],"13312":[0.00096722500000000005,0.001008255],"4980736":[2.0816240229999998,2.0966379059999998],"118784":[0.012294237999999999,0.012963977],"51200":[0.0041181940000000004,0.0043530069999999999],"16":[1.0419999999999999e-06,1.111e-06],"21":[1.291e-06,1.294e-06],"917504":[0.20267411099999999,0.288292194],"22":[1.2950000000000001e-06,1.5570000000000001e-06],"4864":[0.000413757,0.000425074],"17":[9.7499999999999998e-07,1.1850000000000001e-06],"14848":[0.0011396399999999997,0.0011540000000000001],"23":[1.2890000000000001e-06,1.5120000000000001e-06],"786432":[0.180571394,0.26174211000000003],"18":[1.0160000000000001e-06,1.0809999999999999e-06],"1638400":[0.43056952900000001,0.54245403800000003],"7864320":[3.1577935660000001,3.1891139179999999],"24":[1.5889999999999999e-06,1.641e-06],"14155776":[5.4167522720000001,6.4147221080000003],"19":[1.1000000000000001e-06,1.1880000000000001e-06],"30":[1.5260000000000001e-06,1.547e-06],"25":[1.423e-06,1.4300000000000001e-06],"31":[1.7179999999999999e-06,1.9429999999999999e-06],"1280":[0.00010236,0.000119602],"26":[1.296e-06,1.42e-06],"3932160":[1.365482407,1.5344942480000001],"2432":[0.00020705300000000001,0.00021052900000000002],"32":[2.142e-06,2.4370000000000001e-06],"27":[1.4300000000000001e-06,1.4899999999999999e-06],"409600":[0.053723567999999999,0.058632077999999997]}},{"title":"OrderedSet formSymmetricDifference with Self (100% overlap)","results":{"28":[1.455e-06,1.595e-06],"34":[1.7400000000000001e-06,1.765e-06],"29":[1.3260000000000001e-06,1.688e-06],"40":[1.9319999999999999e-06,1.9769999999999999e-06],"17408":[0.0010248939999999997,0.0010599210000000001],"1472":[8.8639000000000003e-05,9.7231000000000005e-05],"112":[5.0509999999999996e-06,5.553e-06],"1376256":[0.35236140400000004,0.50664127300000006],"5242880":[1.982588617,2.0233666229999998],"36":[1.623e-06,1.9269999999999999e-06],"42":[2.057e-06,2.182e-06],"11534336":[4.84473881,5.0604977209999999],"114688":[0.00871684,0.0093675370000000004],"144":[6.8929999999999999e-06,7.5229999999999998e-06],"38":[1.7999999999999999e-06,1.9879999999999999e-06],"240":[1.0725e-05,1.1647e-05],"9216":[0.00053935699999999997,0.00058765100000000002],"44":[2.193e-06,2.6869999999999999e-06],"1664":[7.5798999999999997e-05,8.0526999999999997e-05],"196608":[0.022748766,0.025478641],"155648":[0.014466057000000001,0.015602290999999999],"2816":[0.00017114000000000002,0.00018550499999999998],"50":[2.1519999999999999e-06,2.2960000000000001e-06],"2359296":[0.68649223199999998,0.73270142999999999],"46":[2.3e-06,2.4940000000000002e-06],"176":[1.0356999999999999e-05,1.0739e-05],"52":[2.4059999999999999e-06,2.531e-06],"272":[1.2829e-05,1.4064e-05],"116":[5.0610000000000003e-06,6.1349999999999997e-06],"47104":[0.0034543690000000001,0.0035495909999999999],"6912":[0.00035586400000000006,0.00036200099999999998],"1856":[8.9689000000000001e-05,9.0698999999999993e-05],"48":[2.3099999999999999e-06,2.8279999999999999e-06],"2097152":[0.608475455,0.61792448200000005],"54":[2.3439999999999999e-06,2.5490000000000001e-06],"2031616":[0.53823998799999995,0.67067648499999999],"43008":[0.0028375469999999997,0.0030322140000000005],"60":[2.9409999999999999e-06,3.0070000000000002e-06],"30720":[0.0017296870000000006,0.001797866],"56":[2.6070000000000002e-06,2.8030000000000001e-06],"62":[2.9500000000000001e-06,3.0630000000000002e-06],"58":[2.5660000000000001e-06,2.728e-06],"3014656":[1.038548499,1.1912770530000001],"64":[2.9900000000000002e-06,3.2049999999999998e-06],"8388608":[3.0705490950000001,3.1084538899999998],"29696":[0.001585269,0.0016425649999999999],"216":[9.5929999999999995e-06,9.9660000000000008e-06],"106496":[0.0077767779999999998,0.0081314459999999988],"72":[3.4759999999999998e-06,3.8299999999999998e-06],"442368":[0.046365197000000004,0.058367354000000003],"147456":[0.013421512999999999,0.013550089],"4456448":[1.522112447,1.586357145],"63488":[0.0040447019999999998,0.0042012029999999988],"38912":[0.0024433890000000002,0.002552412],"68":[3.3639999999999999e-06,3.3969999999999998e-06],"188416":[0.020245393,0.021961019999999998],"248":[1.2320000000000001e-05,1.238e-05],"80":[3.9049999999999999e-06,3.9750000000000001e-06],"2560":[0.000142996,0.000158092],"34816":[0.0020393059999999998,0.0021641870000000006],"3712":[0.000181581,0.00019278400000000002],"3538944":[1.071675999,1.0878954999999999],"76":[3.9559999999999999e-06,4.2590000000000002e-06],"4194304":[1.3507926960000001,1.410273106],"851968":[0.154028782,0.18862863499999999],"4096":[0.000213642,0.000231425],"59392":[0.0035745239999999999,0.0038120940000000007],"84":[3.9779999999999999e-06,4.9520000000000002e-06],"3276800":[0.92184940699999995,1.0209152020000001],"55296":[0.0032947080000000004,0.0033901109999999999],"688128":[0.10052897199999999,0.14135228600000005],"8192":[0.00047708599999999999,0.00048700600000000001],"10240":[0.00060332099999999998,0.00060862500000000001],"15872":[0.00085844399999999966,0.00094766700000000013],"92":[5.0209999999999999e-06,5.3750000000000002e-06],"26624":[0.001405653,0.0014535000000000001],"1792":[8.8394999999999996e-05,0.000100049],"11776":[0.00080043000000000009,0.00085338300000000009],"2944":[0.00018096200000000001,0.00021927900000000001],"88":[4.369e-06,4.7979999999999996e-06],"22528":[0.001508512,0.0015772029999999999],"1245184":[0.26302226000000001,0.37033687399999998],"15728640":[6.1535789369999998,6.5965033259999997],"96":[5.2909999999999998e-06,5.378e-06],"1984":[9.6929999999999995e-05,0.00010002500000000001],"139264":[0.012469333000000003,0.01251886],"475136":[0.059765021000000008,0.075780107000000013],"13631488":[5.0596439719999999,5.4340475960000001],"416":[1.9572000000000002e-05,1.9737000000000001e-05],"928":[4.5071999999999998e-05,4.6774999999999999e-05],"512":[2.5324999999999999e-05,2.6067999999999998e-05],"18432":[0.001074008,0.0011580340000000003],"16777216":[6.661816215],"9728":[0.0005876910000000001,0.00060677300000000001],"1769472":[0.45678153599999999,0.50561941100000007],"1703936":[0.41178743600000001,0.46440072199999999],"2048":[0.00010157099999999999,0.00010699100000000001],"14336":[0.00075861500000000003,0.00076771800000000013],"448":[2.0823e-05,2.3858000000000001e-05],"5505024":[2.1590246230000001,2.2146892789999999],"544":[2.7358000000000001e-05,2.9011000000000001e-05],"221184":[0.020764158000000005,0.023304078999999995],"90112":[0.0073332829999999986,0.0076738120000000003],"640":[3.4096e-05,3.8850999999999998e-05],"12800":[0.00063478199999999997,0.00071070200000000001],"262144":[0.028229355999999994,0.029001310000000002],"589824":[0.077897901000000006,0.14363230399999999],"884736":[0.17447388699999999,0.25054801100000001],"6144":[0.000432459,0.00044406800000000005],"1088":[5.5324000000000001e-05,5.8627e-05],"576":[2.9743e-05,3.2418e-05],"160":[7.5390000000000002e-06,9.3689999999999996e-06],"672":[4.0741999999999997e-05,4.1198000000000001e-05],"8912896":[3.0686083100000001,3.601557911],"100":[4.1540000000000004e-06,4.7090000000000001e-06],"507904":[0.060851944999999998,0.085095736000000005],"3840":[0.00019440199999999999,0.000231492],"192":[1.0689999999999999e-05,1.2679e-05],"376832":[0.048307337999999998,0.05264249],"98304":[0.0091176239999999995,0.0093097979999999993],"5376":[0.00032216800000000001,0.00033233300000000003],"94208":[0.0081346609999999996,0.0083202980000000003],"81920":[0.0062787809999999998,0.0064476430000000003],"3407872":[1.073612681,1.263853659],"104":[4.5669999999999996e-06,4.7530000000000001e-06],"122880":[0.010048112,0.010586134000000001],"200":[9.4490000000000005e-06,9.5389999999999996e-06],"163840":[0.017362537000000001,0.017512352999999998],"4063232":[1.2194765219999999,1.4096844289999999],"5767168":[2.2821719460000001,2.5613675690000002],"12582912":[5.9983167599999998,6.6001511639999997],"1600":[7.3193000000000002e-05,7.4098999999999996e-05],"136":[6.6590000000000001e-06,6.9380000000000003e-06],"232":[1.0662999999999999e-05,1.1618e-05],"7077888":[2.4217910530000002,2.7283144579999998],"86016":[0.0066440569999999992,0.0075353769999999985],"31744":[0.001774929,0.0018812870000000002],"168":[7.8620000000000003e-06,1.0497e-05],"622592":[0.078181816000000001,0.124553861],"108":[4.8629999999999999e-06,4.9239999999999998e-06],"327680":[0.040169302000000004,0.042182838],"2176":[0.00012238,0.00013250299999999999],"3328":[0.000156663,0.000167586],"1":[2.4900000000000002e-07,2.6300000000000001e-07],"2":[2.9999999999999999e-07,3.03e-07],"3":[3.1399999999999998e-07,3.4799999999999999e-07],"4":[3.46e-07,3.6199999999999999e-07],"7424":[0.00037591999999999997,0.00042687200000000002],"5":[4.0499999999999999e-07,4.6199999999999998e-07],"23552":[0.0016333819999999998,0.0017378059999999997],"6":[4.6600000000000002e-07,4.7599999999999997e-07],"61440":[0.0038212530000000001,0.0039693110000000005],"491520":[0.053903067000000006,0.093969403000000007],"77824":[0.005671138,0.0057415190000000022],"7":[4.8500000000000002e-07,5.1500000000000005e-07],"8":[5.0500000000000004e-07,5.5799999999999999e-07],"208":[9.4229999999999994e-06,9.7270000000000002e-06],"9":[5.8500000000000001e-07,5.99e-07],"73728":[0.0050525599999999993,0.0055357619999999996],"304":[1.4878000000000001e-05,1.5676e-05],"400":[1.9103999999999999e-05,1.9151999999999999e-05],"1310720":[0.35111174499999998,0.45226403399999998],"336":[1.9145999999999999e-05,2.0256999999999999e-05],"3670016":[1.1514709999999999,1.2121638080000001],"6656":[0.00032192199999999999,0.00032415999999999993],"15360":[0.00083257000000000014,0.00090802899999999998],"432":[1.8936e-05,1.9780999999999999e-05],"950272":[0.19922525799999999,0.27619662299999997],"655360":[0.088119209000000004,0.156821828],"69632":[0.0047978730000000002,0.0048389520000000005],"11264":[0.00074559500000000005,0.000775897],"2752512":[0.87429530099999997,1.014626467],"8126464":[2.762275652,2.9129948950000002],"27648":[0.0014597220000000003,0.001525771],"368":[2.1608999999999999e-05,2.3468999999999998e-05],"65536":[0.0043404420000000008,0.0043841119999999999],"16252928":[6.041778399,8.0688734639999993],"464":[2.1914999999999999e-05,2.3132000000000001e-05],"1015808":[0.206733793,0.31161048600000002],"3072":[0.00021097599999999995,0.00022048099999999996],"110592":[0.0081970020000000001,0.009263037],"237568":[0.024472833999999999,0.024772246999999997],"278528":[0.027776284999999994,0.033276661000000006],"496":[2.4627e-05,2.5193000000000001e-05],"13107200":[4.4323505890000003,5.2117319489999998],"9961472":[3.943684755,4.2262789539999996],"5888":[0.000404984,0.00041189500000000007],"11010048":[4.4624721300000001,4.6964149480000001],"1920":[9.3348000000000001e-05,9.3406000000000007e-05],"2490368":[0.72550705000000004,0.80818666299999997],"19456":[0.0012029900000000001,0.0012553270000000001],"57344":[0.0034198750000000002,0.0034374199999999992],"1179648":[0.237350914,0.40759840400000003],"4718592":[1.581589454,1.7557516789999998],"360448":[0.045293652999999996,0.049899117999999999],"1572864":[0.467110315,0.53590758199999999],"53248":[0.0030749480000000001,0.003370563],"3456":[0.000174043,0.00018190099999999999],"40960":[0.0027596320000000001,0.0030181640000000003],"4608":[0.00025397499999999998,0.00026506099999999992],"13824":[0.00074093199999999992,0.00075830099999999996],"819200":[0.124447286,0.21947541000000001],"983040":[0.17063298399999999,0.28979268699999999],"8704":[0.00048001199999999998,0.00055771499999999986],"120":[5.2680000000000002e-06,5.4759999999999997e-06],"1024":[5.1612e-05,5.3464000000000002e-05],"49152":[0.0037536829999999998,0.003844132000000001],"524288":[0.060187742999999981,0.084061509999999992],"45056":[0.0031883889999999998,0.0034210900000000003],"229376":[0.020709453999999999,0.021082246000000006],"2688":[0.000153282,0.000162194],"152":[7.3289999999999996e-06,8.303e-06],"5120":[0.00030765499999999999,0.00032883599999999999],"1507328":[0.38610681300000005,0.61528155699999998],"1216":[6.7407e-05,7.0417e-05],"1966080":[0.62720653000000004,0.63187502799999995],"1900544":[0.54936360499999992,0.57990761400000002],"184":[9.8689999999999999e-06,1.0448999999999999e-05],"7936":[0.00041330799999999993,0.00043612300000000007],"3801088":[1.1926868370000001,1.265652499],"6815744":[2.3551422569999998,2.5543968910000001],"124":[5.9399999999999999e-06,6.0909999999999998e-06],"102400":[0.0072500749999999999,0.0075615159999999999],"311296":[0.032437771999999983,0.039822895000000004],"1408":[8.3504999999999994e-05,8.4934999999999999e-05],"393216":[0.053281677,0.056075276],"4352":[0.00024162900000000001,0.00027389600000000004],"6553600":[2.2199770440000002,2.4380029969999999],"20480":[0.0012734460000000003,0.0013056110000000001],"608":[3.4008999999999999e-05,3.6470000000000001e-05],"2228224":[0.71152554899999998,0.77318783800000002],"36864":[0.0022712209999999995,0.0023199370000000002],"704":[4.0630000000000002e-05,4.1158000000000001e-05],"720896":[0.12264399400000001,0.14488321800000001],"800":[3.8766000000000001e-05,3.9070999999999999e-05],"2621440":[0.80247075099999998,0.98851487699999996],"425984":[0.053275370000000002,0.058284776000000003],"32768":[0.0019125070000000001,0.0019705909999999998],"12058624":[5.0970376579999996,5.509754139],"128":[5.7540000000000003e-06,6.3380000000000001e-06],"180224":[0.019812007999999999,0.020484686999999946],"224":[9.8360000000000004e-06,1.0294e-05],"736":[5.1190999999999998e-05,6.1988000000000003e-05],"320":[1.6730000000000001e-05,1.8546000000000002e-05],"557056":[0.06614349999999998,0.117001887],"832":[3.7824000000000002e-05,3.9926999999999999e-05],"9437184":[3.581462894,3.6186396439999999],"3584":[0.00017468900000000003,0.00019020499999999999],"6291456":[2.9644639920000002,2.9797366900000002],"256":[1.1813e-05,1.2867000000000001e-05],"15204352":[6.1050669080000004,6.8815672699999997],"28672":[0.001510097,0.001600602],"768":[4.6993000000000002e-05,5.3043e-05],"212992":[0.018171788000000001,0.021785134000000001],"864":[3.9928999999999997e-05,4.0825999999999998e-05],"352":[1.8663000000000001e-05,2.143e-05],"253952":[0.024550881,0.024840518999999998],"960":[4.5334999999999999e-05,5.0331000000000003e-05],"24576":[0.0018039569999999997,0.001895063],"7680":[0.00039022300000000009,0.00042893899999999998],"294912":[0.030358881000000004,0.031915912000000005],"1048576":[0.19372400200000001,0.27026773799999998],"10485760":[4.0734071580000002,4.3389716390000004],"344064":[0.044949664,0.045976100999999998],"288":[1.4537e-05,1.5571999999999999e-05],"1152":[6.1027999999999999e-05,6.3657000000000004e-05],"384":[2.3002000000000001e-05,2.3076000000000001e-05],"2304":[0.00012750000000000001,0.00013518100000000001],"896":[4.1946999999999997e-05,4.2861000000000002e-05],"480":[2.1962000000000001e-05,2.5564000000000001e-05],"1441792":[0.35487260399999998,0.53834189700000001],"992":[4.8695e-05,5.1004000000000002e-05],"3968":[0.00020826500000000001,0.000210557],"6400":[0.000326216,0.00033499199999999994],"1344":[7.8510000000000006e-05,7.9887000000000003e-05],"126976":[0.010204831000000001,0.010280644],"2883584":[0.99845860900000005,1.0250091370000001],"753664":[0.13115675900000001,0.15378127599999999],"16384":[0.00095472100000000017,0.00096936900000000009],"131072":[0.010859264,0.011779007999999999],"458752":[0.049739567000000005,0.075695307000000003],"172032":[0.017135588,0.017769675000000002],"12288":[0.00089341000000000008,0.00089864099999999983],"14680064":[5.2906343959999997,6.2576781119999998],"1536":[0.000103359,0.00010497599999999998],"25600":[0.001363857,0.0013833460000000001],"1835008":[0.51969894599999999,0.57665366000000007],"10752":[0.00066258099999999998,0.0006880539999999999],"21504":[0.001423657,0.0014720879999999997],"7602176":[2.757591283,2.8517938919999999],"5632":[0.00035021,0.00041606100000000001],"10":[6.0900000000000001e-07,6.3099999999999997e-07],"3145728":[1.2489152100000001,1.3182838079999999],"245760":[0.022292313000000001,0.025255072999999999],"1728":[8.6374999999999999e-05,8.7925999999999998e-05],"11":[6.4499999999999997e-07,6.6899999999999997e-07],"1114112":[0.21031729099999999,0.35912496599999999],"12":[6.9599999999999999e-07,7.3600000000000003e-07],"7340032":[2.5969279909999998,2.631000228],"7168":[0.000355013,0.00039180500000000001],"13":[7.4399999999999999e-07,7.6499999999999998e-07],"6029312":[2.7044643160000001,2.7221021479999998],"14":[8.5199999999999995e-07,9.0699999999999996e-07],"3200":[0.00014937999999999998,0.000167028],"20":[9.9399999999999993e-07,1.1519999999999999e-06],"204800":[0.017900188000000004,0.022494383999999999],"15":[8.3200000000000004e-07,8.6700000000000002e-07],"13312":[0.00069120500000000007,0.00072256299999999996],"4980736":[1.906423953,2.0285338479999999],"118784":[0.009252904000000001,0.0094627230000000027],"51200":[0.0029255290000000001,0.0030659680000000001],"16":[9.7499999999999998e-07,1.0020000000000001e-06],"21":[1.1319999999999999e-06,1.159e-06],"917504":[0.15728239699999999,0.28325201799999999],"22":[1.1650000000000001e-06,1.3120000000000001e-06],"4864":[0.000275085,0.00029817],"17":[9.2500000000000004e-07,1.08e-06],"14848":[0.00082046399999999992,0.00082939199999999998],"23":[1.161e-06,1.6640000000000001e-06],"786432":[0.13486266899999999,0.20245224000000001],"18":[9.0999999999999997e-07,1.0330000000000001e-06],"1638400":[0.43600470299999999,0.55945881499999994],"7864320":[2.7840562630000001,2.883058004],"24":[1.3260000000000001e-06,1.5689999999999999e-06],"14155776":[5.4466034590000003,5.6438952809999998],"19":[9.6700000000000002e-07,1.0979999999999999e-06],"30":[1.4500000000000001e-06,1.5880000000000001e-06],"25":[1.234e-06,1.327e-06],"31":[1.5549999999999999e-06,1.72e-06],"1280":[7.0149999999999998e-05,7.7213999999999996e-05],"26":[1.2300000000000001e-06,1.372e-06],"3932160":[1.3686326639999999,1.3941703489999999],"2432":[0.00013259800000000002,0.00013894999999999999],"32":[1.4920000000000001e-06,1.629e-06],"27":[1.3969999999999999e-06,1.3990000000000001e-06],"409600":[0.041128737999999991,0.058438746]}},{"title":"OrderedSet subtract Self (0% overlap)","results":{"28":[7.3600000000000003e-07,9.3200000000000003e-07],"34":[9.5900000000000005e-07,1.0210000000000001e-06],"29":[7.5199999999999996e-07,9.4799999999999997e-07],"40":[1.1659999999999999e-06,1.203e-06],"17408":[0.00060182699999999987,0.00066105800000000007],"1472":[7.8960000000000003e-05,8.2779000000000001e-05],"112":[2.554e-06,2.756e-06],"1376256":[0.207918728,0.30199099200000001],"5242880":[1.196728373,1.2137948750000001],"36":[9.2500000000000004e-07,1.043e-06],"42":[1.2529999999999999e-06,1.5349999999999999e-06],"11534336":[3.590687118,3.6663483100000001],"114688":[0.0042992080000000005,0.0043434479999999998],"144":[4.386e-06,5.1479999999999997e-06],"38":[1.1069999999999999e-06,1.226e-06],"240":[5.7529999999999998e-06,6.0730000000000001e-06],"9216":[0.00036881699999999996,0.000389157],"44":[1.4300000000000001e-06,1.6920000000000001e-06],"1664":[4.4985999999999999e-05,4.7342000000000002e-05],"196608":[0.018717267999999999,0.019547024],"155648":[0.0084871010000000004,0.0085571949999999983],"2816":[0.000134752,0.000138157],"50":[1.119e-06,1.3120000000000001e-06],"2359296":[0.37854290600000001,0.38412854800000001],"46":[1.4589999999999999e-06,3.4039999999999999e-06],"176":[6.5359999999999998e-06,7.0960000000000003e-06],"52":[1.1069999999999999e-06,1.198e-06],"272":[7.8110000000000003e-06,7.8949999999999998e-06],"116":[2.588e-06,3.0450000000000001e-06],"47104":[0.002561785,0.002658002],"6912":[0.00020614299999999994,0.00020635],"1856":[5.2902999999999998e-05,5.3601999999999999e-05],"48":[1.72e-06,2.5320000000000001e-06],"2097152":[0.29383573799999996,0.32618748400000003],"54":[1.235e-06,1.53e-06],"2031616":[0.25410130600000003,0.27006093799999997],"43008":[0.0019368810000000003,0.0021309390000000001],"60":[1.5430000000000001e-06,1.598e-06],"30720":[0.00096473199999999994,0.0010295149999999997],"56":[1.3880000000000001e-06,1.4050000000000001e-06],"62":[1.562e-06,1.7489999999999999e-06],"58":[1.3650000000000001e-06,1.5120000000000001e-06],"3014656":[0.84919020999999995,0.88049032900000002],"64":[1.564e-06,1.756e-06],"8388608":[1.5284201159999999,1.542984777],"29696":[0.00089685700000000004,0.00091316800000000001],"216":[4.7809999999999996e-06,4.8029999999999996e-06],"106496":[0.003678680000000001,0.0039261289999999987],"72":[1.9209999999999999e-06,2.7030000000000002e-06],"442368":[0.020891885000000002,0.022502546000000005],"147456":[0.0072733919999999992,0.0073167420000000011],"4456448":[0.79637351099999998,0.81494622699999997],"63488":[0.0022466860000000003,0.0022540849999999999],"38912":[0.0015062890000000001,0.0016267829999999997],"68":[1.722e-06,1.843e-06],"188416":[0.015106748,0.015304006],"248":[6.4250000000000003e-06,6.8329999999999996e-06],"80":[2.368e-06,2.5409999999999999e-06],"2560":[0.00010396900000000001,0.000106802],"34816":[0.0012118530000000001,0.00126344],"3712":[0.000115073,0.000118857],"3538944":[0.50987144200000001,0.53724246799999997],"76":[2.4839999999999998e-06,2.5399999999999998e-06],"4194304":[0.69108169699999999,0.698130221],"851968":[0.054895517000000005,0.093200000000000005],"4096":[0.000130922,0.000150882],"59392":[0.0020159520000000001,0.0021015090000000001],"84":[2.6230000000000001e-06,2.8040000000000002e-06],"3276800":[0.44183753100000001,0.46799984300000003],"55296":[0.001739326,0.0018007089999999997],"688128":[0.059819934000000005,0.080849653000000021],"8192":[0.00028883900000000004,0.00029053300000000005],"10240":[0.00041224699999999997,0.00042058599999999997],"15872":[0.000537989,0.00055771800000000002],"92":[3.3419999999999999e-06,3.9829999999999998e-06],"26624":[0.00075789100000000012,0.00075831300000000004],"1792":[4.8646999999999997e-05,5.8140999999999998e-05],"11776":[0.00064863099999999999,0.00068589499999999973],"2944":[0.000152504,0.00016460000000000004],"88":[3.083e-06,3.4809999999999998e-06],"22528":[0.00120286,0.0012132860000000001],"1245184":[0.14486227800000001,0.22710188099999995],"15728640":[2.862650554,2.8846062639999999],"96":[3.822e-06,5.4179999999999996e-06],"1984":[5.9920000000000002e-05,6.2580000000000001e-05],"139264":[0.0065021240000000006,0.0066462650000000002],"475136":[0.023663091000000001,0.031428834000000017],"13631488":[2.2249274790000002,2.248263261],"416":[1.0720000000000001e-05,1.082e-05],"928":[2.6242999999999999e-05,2.7192999999999999e-05],"512":[1.5012e-05,1.5773e-05],"18432":[0.00069135699999999987,0.00075166899999999995],"16777216":[3.230759274],"9728":[0.000384516,0.00039350800000000004],"1769472":[0.20554188200000001,0.20928786299999999],"1703936":[0.18775756199999999,0.209717869],"2048":[6.3441999999999993e-05,6.5901999999999993e-05],"14336":[0.00043929,0.00044178300000000001],"448":[1.1192999999999999e-05,1.2353e-05],"5505024":[1.4187423880000001,1.4216250989999999],"544":[1.7904999999999999e-05,1.7948000000000002e-05],"221184":[0.0095465800000000007,0.0098610949999999985],"90112":[0.005043395,0.0054565719999999981],"640":[2.4485e-05,2.6866e-05],"12800":[0.00036680000000000003,0.000368327],"262144":[0.013330537,0.013694675999999999],"589824":[0.037725462000000001,0.061899717],"884736":[0.061556507999999989,0.094663411999999988],"6144":[0.00039216899999999994,0.0004218300000000001],"1088":[3.4561999999999999e-05,3.8748999999999998e-05],"576":[1.8623000000000001e-05,2.0993e-05],"160":[5.8900000000000004e-06,6.8070000000000002e-06],"672":[2.9393000000000001e-05,2.9493999999999999e-05],"8912896":[1.727305783,1.7679614379999999],"100":[2.0389999999999999e-06,2.2749999999999998e-06],"507904":[0.026761991000000002,0.039247924000000003],"3840":[0.000113471,0.00013658399999999998],"192":[9.7650000000000005e-06,1.0779e-05],"376832":[0.034102500000000001,0.034141511999999999],"98304":[0.0075178449999999996,0.0076877149999999995],"5376":[0.000233234,0.000242002],"94208":[0.0060838840000000003,0.0063522490000000017],"81920":[0.0038615519999999999,0.0039970839999999997],"3407872":[0.47482584799999999,0.47488105599999997],"104":[2.3949999999999999e-06,2.5890000000000001e-06],"122880":[0.0050275599999999995,0.0051275269999999998],"200":[4.7679999999999999e-06,4.9450000000000001e-06],"163840":[0.0096890529999999996,0.0099010940000000009],"4063232":[0.655763867,0.66942521799999999],"5767168":[1.661914922,1.6868061380000001],"12582912":[5.3474397490000003,5.7352053439999997],"1600":[4.0148999999999998e-05,4.1226999999999997e-05],"136":[3.9450000000000003e-06,4.3970000000000004e-06],"232":[5.823e-06,7.3900000000000004e-06],"7077888":[1.1126270789999999,1.187702985],"86016":[0.0043367909999999996,0.0047267230000000004],"31744":[0.0010151100000000001,0.0010840450000000001],"168":[5.7169999999999996e-06,6.8299999999999998e-06],"622592":[0.041556777000000003,0.063652858000000048],"108":[2.4990000000000001e-06,2.5339999999999998e-06],"327680":[0.021077656,0.02308224],"2176":[7.6982000000000003e-05,8.4425000000000006e-05],"3328":[9.0722000000000003e-05,9.1546999999999996e-05],"1":[1.5900000000000001e-07,1.6899999999999999e-07],"2":[1.8699999999999999e-07,1.9999999999999999e-07],"3":[1.86e-07,2.0200000000000001e-07],"4":[2.0699999999999999e-07,2.2100000000000001e-07],"7424":[0.000221459,0.00025140000000000004],"5":[2.3900000000000001e-07,2.7500000000000001e-07],"23552":[0.0013439000000000001,0.0013871350000000001],"6":[2.5899999999999998e-07,2.6e-07],"61440":[0.0021165189999999999,0.0021888770000000001],"491520":[0.025615998000000001,0.037433232000000004],"77824":[0.0034175,0.0038175179999999998],"7":[2.4999999999999999e-07,2.8900000000000001e-07],"8":[2.7700000000000001e-07,3.0600000000000001e-07],"208":[4.7979999999999996e-06,4.8709999999999996e-06],"9":[3.1399999999999998e-07,3.3200000000000001e-07],"73728":[0.0029287559999999998,0.0033963259999999994],"304":[9.8989999999999996e-06,1.3509000000000001e-05],"400":[9.4569999999999994e-06,1.0225e-05],"1310720":[0.177585982,0.25657699499999997],"336":[1.2608e-05,1.447e-05],"3670016":[0.53504964799999999,0.55037973400000006],"6656":[0.000185062,0.00019539900000000004],"15360":[0.000481239,0.00050889200000000015],"432":[1.0458e-05,1.0733e-05],"950272":[0.072467902000000015,0.11837619100000001],"655360":[0.048839828000000002,0.08329819099999998],"69632":[0.0027162849999999997,0.002930003],"11264":[0.00055713300000000013,0.000558006],"2752512":[0.59005744900000001,0.62394980799999999],"8126464":[1.4173953940000001,1.4511554129999999],"27648":[0.00082156000000000004,0.00083664099999999995],"368":[1.6829000000000001e-05,2.0789999999999999e-05],"65536":[0.0024595159999999997,0.002464581],"16252928":[3.0451380430000001,4.399581779],"464":[1.2115e-05,1.2581e-05],"1015808":[0.086154059000000033,0.12278705600000001],"3072":[0.000174031,0.000214525],"110592":[0.0039758069999999996,0.0041980009999999998],"237568":[0.010837141,0.01114915],"278528":[0.015089170000000002,0.015160368],"496":[1.4358e-05,1.4425e-05],"13107200":[2.0867670970000001,2.1331281149999999],"9961472":[2.219317953,2.2828851590000001],"5888":[0.000316669,0.000326922],"11010048":[2.9547379619999998,3.0201256609999998],"1920":[5.7086000000000002e-05,6.3230000000000003e-05],"2490368":[0.439645646,0.45551350000000002],"19456":[0.00076013800000000005,0.00078004699999999997],"57344":[0.0018610860000000001,0.0018780089999999999],"1179648":[0.12472978,0.17464638099999996],"4718592":[0.93861290399999997,0.96141595199999996],"360448":[0.029372942000000003,0.030195377000000002],"1572864":[0.37123192500000002,0.44189448100000001],"53248":[0.001626883,0.0017120739999999998],"3456":[9.6349999999999997e-05,0.000105602],"40960":[0.0017800049999999999,0.001855141],"4608":[0.00015897700000000001,0.000170373],"13824":[0.00039500000000000006,0.000431116],"819200":[0.052382068999999996,0.088270628000000004],"983040":[0.078010488999999988,0.12688818599999999],"8704":[0.00030891299999999996,0.00035085500000000007],"120":[3.0019999999999998e-06,3.2169999999999999e-06],"1024":[3.3034000000000003e-05,3.3358999999999997e-05],"49152":[0.0031374520000000002,0.0032759029999999993],"524288":[0.028737908,0.039273353999999996],"45056":[0.0022092409999999998,0.0022992719999999998],"229376":[0.010220264,0.01053597],"2688":[0.000118421,0.00012129],"152":[4.3640000000000001e-06,4.4780000000000002e-06],"5120":[0.000222871,0.00022432599999999995],"1507328":[0.28757189900000002,0.43565254499999995],"1216":[4.6458000000000001e-05,4.8878999999999997e-05],"1966080":[0.23950617099999999,0.25225946900000001],"1900544":[0.23638600900000001,0.23667153899999999],"184":[6.8009999999999998e-06,7.2740000000000002e-06],"7936":[0.00024987400000000008,0.00027176999999999995],"3801088":[0.56783741599999993,0.58388208500000005],"6815744":[1.042847759,1.111287286],"124":[3.101e-06,3.3510000000000002e-06],"102400":[0.0034698590000000009,0.003786002000000001],"311296":[0.018986019,0.019547789999999999],"1408":[6.6229000000000006e-05,7.8152000000000007e-05],"393216":[0.040928492999999996,0.042837256999999997],"4352":[0.00014743500000000001,0.000149438],"6553600":[1.0194805680000001,1.0442817129999999],"20480":[0.00088737499999999993,0.00094621099999999997],"608":[2.2413e-05,2.2912e-05],"2228224":[0.32892755899999998,0.33397649800000001],"36864":[0.0013674150000000001,0.0014466680000000001],"704":[3.0156999999999999e-05,3.2607999999999997e-05],"720896":[0.067924980999999968,0.12083504099999998],"800":[2.1178999999999998e-05,2.302e-05],"2621440":[0.51590676099999999,0.55073837999999997],"425984":[0.020095882999999998,0.021701155],"32768":[0.0010917379999999999,0.001159916],"12058624":[4.3387110240000002,4.3917715680000002],"128":[3.0589999999999998e-06,3.303e-06],"180224":[0.013113725,0.013291459],"224":[5.0679999999999996e-06,5.2410000000000003e-06],"736":[3.7724e-05,6.2108999999999998e-05],"320":[1.1182999999999999e-05,1.1654999999999999e-05],"557056":[0.033753321000000017,0.047639323999999997],"832":[2.2056999999999999e-05,2.2858e-05],"9437184":[1.9577280130000001,1.989378619],"3584":[0.000100957,0.000112626],"6291456":[2.4438108669999998,2.456362521],"256":[6.7789999999999998e-06,7.7780000000000007e-06],"15204352":[2.6703832909999998,3.0325212389999998],"28672":[0.000908017,0.00090985100000000004],"768":[4.3260000000000003e-05,4.3541999999999997e-05],"212992":[0.0086827220000000004,0.009217444],"864":[2.2925000000000002e-05,2.3298999999999998e-05],"352":[1.396e-05,1.7022999999999999e-05],"253952":[0.011998518999999999,0.012343872000000001],"960":[2.8866000000000001e-05,3.1242999999999999e-05],"24576":[0.001552964,0.0016684410000000001],"7680":[0.000247211,0.00025356599999999994],"294912":[0.016625238000000004,0.017001871000000005],"1048576":[0.093287488000000016,0.151041486],"10485760":[2.5314331810000001,2.5632769149999999],"344064":[0.025455267,0.025705073000000002],"288":[9.0240000000000003e-06,9.1039999999999996e-06],"1152":[3.9326999999999998e-05,4.2351999999999997e-05],"384":[2.2345e-05,2.8702999999999999e-05],"2304":[8.3251000000000006e-05,8.6347999999999994e-05],"896":[2.4082000000000001e-05,2.5363000000000001e-05],"480":[1.3089e-05,1.3906e-05],"1441792":[0.24541315599999999,0.33976471800000002],"992":[2.9173e-05,3.1535999999999998e-05],"3968":[0.00012764799999999998,0.000128572],"6400":[0.000171695,0.00019054799999999999],"1344":[6.0649000000000002e-05,6.2052999999999997e-05],"126976":[0.0052507330000000005,0.0052855949999999988],"2883584":[0.70115202399999998,0.74787759300000001],"753664":[0.080948164000000017,0.11254952299999998],"16384":[0.00056362299999999997,0.00056983900000000015],"131072":[0.0057217199999999987,0.0058634669999999989],"458752":[0.022135678999999998,0.029319094],"172032":[0.011098433,0.011176227],"12288":[0.00077159700000000006,0.00081645599999999991],"14680064":[2.533100379,2.672725786],"1536":[8.0438999999999993e-05,9.1011e-05],"25600":[0.000749042,0.00075999399999999995],"1835008":[0.22225405500000001,0.235945352],"10752":[0.00047854100000000002,0.00051169799999999999],"21504":[0.000992665,0.001070218],"7602176":[1.28247209,1.2848743009999999],"5632":[0.00029487300000000002,0.00032563500000000001],"10":[3.2500000000000001e-07,3.6300000000000001e-07],"3145728":[1.0248983250000001,1.085051698],"245760":[0.011301778,0.011742031],"1728":[4.7695999999999999e-05,5.1514999999999997e-05],"11":[3.2899999999999999e-07,3.89e-07],"1114112":[0.105538015,0.169826226],"12":[3.7399999999999999e-07,4.2300000000000002e-07],"7340032":[1.1971878819999999,1.2047298959999999],"7168":[0.00021004899999999999,0.000228388],"13":[3.8700000000000001e-07,3.9400000000000001e-07],"6029312":[2.0110183159999999,2.02267514],"14":[4.34e-07,5.1600000000000001e-07],"3200":[8.6998999999999998e-05,9.0296000000000004e-05],"20":[6.1500000000000004e-07,7.0299999999999998e-07],"204800":[0.0081081469999999996,0.0091244159999999998],"15":[4.4099999999999999e-07,4.6100000000000001e-07],"13312":[0.00037012699999999993,0.00040394200000000002],"4980736":[1.042226104,1.0549567710000001],"118784":[0.0045191129999999991,0.004953850000000001],"51200":[0.0015391420000000003,0.0016175370000000001],"16":[5.5499999999999998e-07,5.7199999999999999e-07],"21":[6.9800000000000003e-07,7.6700000000000003e-07],"917504":[0.066477543,0.113646684],"22":[6.6400000000000002e-07,9.1900000000000001e-07],"4864":[0.00018549900000000002,0.00018991799999999997],"17":[5.2e-07,5.5499999999999998e-07],"14848":[0.00045024999999999997,0.00049460999999999993],"23":[6.9699999999999995e-07,8.2399999999999997e-07],"786432":[0.100677881,0.15910139300000001],"18":[4.89e-07,5.4300000000000003e-07],"1638400":[0.173900312,0.182300569],"7864320":[1.366470053,1.3673424540000001],"24":[1.0440000000000001e-06,1.06e-06],"14155776":[2.3835237239999998,2.4422333919999999],"19":[5.1699999999999998e-07,5.7199999999999999e-07],"30":[7.9999999999999996e-07,8.1500000000000003e-07],"25":[6.4700000000000001e-07,6.5199999999999996e-07],"31":[7.8700000000000005e-07,9.1299999999999998e-07],"1280":[5.0702999999999999e-05,5.2441000000000002e-05],"26":[6.1500000000000004e-07,6.8199999999999999e-07],"3932160":[0.61205209100000002,0.62348718599999997],"2432":[8.5377000000000006e-05,9.7159999999999998e-05],"32":[8.6000000000000002e-07,8.78e-07],"27":[6.7400000000000003e-07,7.0399999999999995e-07],"409600":[0.018081225999999999,0.019519707000000004]}},{"title":"OrderedSet subtract Self (25% overlap)","results":{"28":[1.7010000000000001e-06,1.8419999999999999e-06],"34":[2.0190000000000001e-06,2.3999999999999999e-06],"29":[1.6309999999999999e-06,2.0169999999999999e-06],"40":[2.5019999999999999e-06,2.6539999999999999e-06],"17408":[0.001088959,0.001205755],"1472":[0.000116857,0.00012233799999999999],"112":[6.0870000000000003e-06,6.3450000000000002e-06],"1376256":[0.25887752200000003,0.355633906],"5242880":[1.5636167949999999,1.639389795],"36":[2.0770000000000002e-06,2.277e-06],"42":[2.5569999999999998e-06,3.0070000000000002e-06],"11534336":[4.3583942569999996,4.5294683190000002],"114688":[0.0084300290000000021,0.0087074969999999998],"144":[8.0979999999999994e-06,9.1940000000000004e-06],"38":[2.2900000000000001e-06,2.4760000000000001e-06],"240":[1.2877000000000001e-05,1.3642000000000001e-05],"9216":[0.00057334200000000001,0.00067010400000000003],"44":[2.734e-06,3.3620000000000002e-06],"1664":[9.5935999999999998e-05,0.000107494],"196608":[0.024371559000000001,0.024627534999999999],"155648":[0.013430873999999999,0.013506357],"2816":[0.00019612700000000001,0.00021187699999999999],"50":[2.514e-06,2.723e-06],"2359296":[0.50572086300000008,0.56094588600000006],"46":[2.9749999999999999e-06,4.0049999999999998e-06],"176":[1.1972e-05,1.2344000000000001e-05],"52":[2.897e-06,2.931e-06],"272":[1.4715000000000001e-05,1.7566000000000001e-05],"116":[6.0990000000000004e-06,7.1509999999999998e-06],"47104":[0.0038447719999999998,0.0040851540000000006],"6912":[0.00043479599999999999,0.00044056900000000014],"1856":[0.00010926500000000002,0.00011042199999999999],"48":[3.0259999999999999e-06,3.9260000000000002e-06],"2097152":[0.39130204600000001,0.43253343099999997],"54":[2.9239999999999999e-06,3.2040000000000002e-06],"2031616":[0.354738836,0.38311597400000003],"43008":[0.0031296620000000005,0.0033298060000000003],"60":[3.3979999999999999e-06,3.5240000000000001e-06],"30720":[0.00200454,0.00210509],"56":[2.9519999999999999e-06,3.2169999999999999e-06],"62":[3.7859999999999998e-06,3.7890000000000001e-06],"58":[3.1609999999999999e-06,3.2059999999999999e-06],"3014656":[0.94111006900000005,1.0147610439999999],"64":[3.579e-06,3.7000000000000002e-06],"8388608":[2.2939557439999998,2.3712446749999998],"29696":[0.0019739900000000001,0.0019799549999999998],"216":[1.0706999999999999e-05,1.1671999999999999e-05],"106496":[0.0073578300000000001,0.0077847990000000002],"72":[4.2470000000000002e-06,4.4950000000000002e-06],"442368":[0.038762542000000004,0.039967717999999999],"147456":[0.01184677,0.011905015],"4456448":[1.1102623060000001,1.1739056729999999],"63488":[0.0044295110000000006,0.0045378839999999998],"38912":[0.0026201329999999993,0.0027505730000000001],"68":[3.9169999999999999e-06,4.0319999999999997e-06],"188416":[0.020122193,0.021014726000000001],"248":[1.4654000000000001e-05,1.5075000000000001e-05],"80":[4.8280000000000002e-06,5.4879999999999998e-06],"2560":[0.00016158399999999999,0.00017972099999999998],"34816":[0.0021739730000000001,0.0021743050000000001],"3712":[0.00022346700000000003,0.00023232400000000003],"3538944":[0.71882813499999998,0.76852125399999993],"76":[5.2329999999999997e-06,5.5330000000000002e-06],"4194304":[0.94381440999999999,0.95817998699999996],"851968":[0.092137833000000016,0.14751661800000004],"4096":[0.00026611799999999998,0.000269208],"59392":[0.003940509,0.004126223],"84":[4.8849999999999998e-06,5.6280000000000002e-06],"3276800":[0.647949153,0.67420042000000002],"55296":[0.0035357889999999997,0.0036957639999999998],"688128":[0.083240277000000001,0.10381938099999999],"8192":[0.00057991,0.00058659999999999984],"10240":[0.00071243299999999984,0.00073283500000000004],"15872":[0.001076951,0.001144335],"92":[6.2190000000000001e-06,8.439e-06],"26624":[0.001602203,0.001672899],"1792":[0.000101563,0.000120488],"11776":[0.00096405300000000009,0.00099620700000000004],"2944":[0.000220903,0.00024002100000000007],"88":[5.7450000000000001e-06,6.3810000000000004e-06],"22528":[0.001772961,0.0018273689999999999],"1245184":[0.194945375,0.29583652999999999],"15728640":[4.3543057799999998,4.6318116939999996],"96":[7.0639999999999996e-06,7.9710000000000004e-06],"1984":[0.00012278499999999998,0.00012778099999999996],"139264":[0.010873954999999999,0.011100583000000001],"475136":[0.042070822000000001,0.051963567000000002],"13631488":[3.4862260960000002,3.8565899090000002],"416":[2.3292e-05,2.3575e-05],"928":[5.2247999999999998e-05,6.3077000000000006e-05],"512":[3.1769e-05,3.3701000000000001e-05],"18432":[0.0011923049999999998,0.0012756530000000003],"16777216":[4.8507788190000003],"9728":[0.000617652,0.0006524469999999999],"1769472":[0.29084379500000002,0.30774365100000001],"1703936":[0.26629871500000002,0.29727424899999999],"2048":[0.00013172800000000001,0.00013945099999999999],"14336":[0.00087440399999999985,0.00088243299999999996],"448":[2.4973999999999998e-05,2.6877999999999999e-05],"5505024":[1.777274274,1.8598493869999999],"544":[3.2339000000000003e-05,3.4099e-05],"221184":[0.018038914,0.018341450000000002],"90112":[0.0075796580000000004,0.0079456790000000006],"640":[3.9782e-05,4.4387e-05],"12800":[0.00075284700000000006,0.00085668500000000004],"262144":[0.023980850000000001,0.024455767999999999],"589824":[0.059281063999999981,0.099406661999999993],"884736":[0.101747792,0.15727084299999999],"6144":[0.00052450199999999982,0.000560327],"1088":[6.4618999999999999e-05,6.7111000000000002e-05],"576":[3.3352999999999997e-05,3.6959000000000003e-05],"160":[1.0885e-05,1.198e-05],"672":[4.7224000000000001e-05,4.7861000000000001e-05],"8912896":[2.5266771050000001,2.5412997150000001],"100":[4.9949999999999996e-06,5.434e-06],"507904":[0.048266320999999994,0.063550284999999998],"3840":[0.000256025,0.00027437700000000002],"192":[1.4936000000000001e-05,1.5102999999999999e-05],"376832":[0.045323597,0.045589269000000002],"98304":[0.010036749999999999,0.010811853],"5376":[0.000374621,0.00039815499999999997],"94208":[0.008615939999999999,0.0091572700000000003],"81920":[0.0062231959999999994,0.0065494420000000008],"3407872":[0.70430085599999992,0.71333196899999995],"104":[5.3920000000000002e-06,5.6629999999999998e-06],"122880":[0.009578184,0.0097753240000000002],"200":[1.0839000000000001e-05,1.1488000000000001e-05],"163840":[0.014810768,0.015026933000000003],"4063232":[0.90395754799999994,0.99251336700000004],"5767168":[2.0086633960000002,2.034125709],"12582912":[5.8671498590000004,6.5035693510000003],"1600":[8.6218999999999996e-05,8.7940000000000002e-05],"136":[7.6499999999999996e-06,8.3219999999999993e-06],"232":[1.3362e-05,1.3703000000000001e-05],"7077888":[1.6809459950000001,1.9141161369999999],"86016":[0.006812055,0.0077148149999999999],"31744":[0.0021472520000000001,0.0022082399999999998],"168":[9.6330000000000008e-06,1.5770999999999999e-05],"622592":[0.06404770500000001,0.084411818999999999],"108":[5.6890000000000001e-06,5.9270000000000002e-06],"327680":[0.031740936999999983,0.03476449899999999],"2176":[0.00013483899999999999,0.00013545300000000001],"3328":[0.00019680899999999999,0.00020525],"1":[1.4399999999999999e-07,1.5200000000000001e-07],"2":[2.6899999999999999e-07,2.79e-07],"3":[2.6800000000000002e-07,2.91e-07],"4":[3.4700000000000002e-07,3.5400000000000002e-07],"7424":[0.00045121099999999997,0.0004958269999999999],"5":[3.58e-07,4.1199999999999998e-07],"23552":[0.001949253,0.0020304470000000003],"6":[3.84e-07,4.3300000000000003e-07],"61440":[0.004213568,0.0043294620000000009],"491520":[0.047246827000000005,0.066982029999999998],"77824":[0.0057503680000000014,0.006106162],"7":[3.6699999999999999e-07,3.9999999999999998e-07],"8":[3.9900000000000001e-07,4.4299999999999998e-07],"208":[1.1467e-05,1.1731e-05],"9":[4.27e-07,4.4700000000000002e-07],"73728":[0.0051197629999999994,0.005423415],"304":[1.6782999999999998e-05,2.1401000000000001e-05],"400":[2.1801e-05,2.2070999999999999e-05],"1310720":[0.232992695,0.34638029399999998],"336":[2.3102999999999999e-05,2.3819999999999999e-05],"3670016":[0.76189232800000006,0.79305674800000003],"6656":[0.00038284099999999998,0.00039072400000000001],"15360":[0.0010008079999999999,0.0010950250000000001],"432":[2.2878e-05,2.4360999999999999e-05],"950272":[0.113592631,0.17203665900000001],"655360":[0.071482121999999981,0.106716388],"69632":[0.004786762,0.0053044190000000003],"11264":[0.0008544300000000001,0.00089166500000000014],"2752512":[0.73374924899999994,0.77770256900000001],"8126464":[2.0965624410000001,2.142927078],"27648":[0.0017171320000000001,0.0017933160000000001],"368":[2.8552e-05,3.0272000000000001e-05],"65536":[0.004666295,0.0049553759999999992],"16252928":[4.5344475989999999,7.2301571180000002],"464":[2.6401999999999999e-05,2.8017999999999998e-05],"1015808":[0.13772178500000001,0.17582990400000001],"3072":[0.00025073599999999994,0.0002627240000000001],"110592":[0.0078411590000000003,0.0082270499999999996],"237568":[0.019874758000000003,0.020030829],"278528":[0.024524413999999998,0.024890651999999996],"496":[3.0871000000000003e-05,3.2659e-05],"13107200":[3.350159305,3.5690256379999998],"9961472":[3.0608912570000002,3.1697832940000001],"5888":[0.00048048699999999993,0.00048994200000000026],"11010048":[3.7800614590000001,3.9017583519999999],"1920":[0.00012649199999999999,0.000126678],"2490368":[0.56319138499999999,0.58024120200000007],"19456":[0.0013003119999999999,0.00133113],"57344":[0.0037757570000000002,0.0038256800000000006],"1179648":[0.17341746799999999,0.240494769],"4718592":[1.2375618989999999,1.324610952],"360448":[0.040147476000000001,0.042902700999999988],"1572864":[0.42559033300000004,0.42803918200000002],"53248":[0.0033252220000000001,0.0035804459999999997],"3456":[0.00020049900000000003,0.00021780500000000001],"40960":[0.0029069970000000001,0.002974361],"4608":[0.00027402499999999995,0.00028240300000000014],"13824":[0.00083607600000000005,0.00086757700000000013],"819200":[0.087724361000000015,0.13078277299999999],"983040":[0.12614077500000001,0.165525529],"8704":[0.00051574200000000002,0.00059502800000000027],"120":[6.9619999999999996e-06,7.7279999999999995e-06],"1024":[6.8836000000000003e-05,6.8844999999999996e-05],"49152":[0.0044394990000000013,0.0045565019999999996],"524288":[0.051333172000000003,0.060329702000000006],"45056":[0.0034306440000000001,0.0035009529999999998],"229376":[0.018365881000000001,0.019276177999999998],"2688":[0.000179357,0.000195446],"152":[8.5669999999999995e-06,1.0105000000000001e-05],"5120":[0.000344598,0.00034697999999999999],"1507328":[0.32877559499999998,0.48022888200000002],"1216":[7.4376999999999996e-05,8.2729e-05],"1966080":[0.33124884300000002,0.35511433100000001],"1900544":[0.32333900799999998,0.35619136099999998],"184":[1.1114999999999999e-05,1.2153999999999999e-05],"7936":[0.000526875,0.00053943100000000016],"3801088":[0.79740543100000005,0.82298382199999998],"6815744":[1.687976836,1.814160929],"124":[7.0570000000000004e-06,7.0879999999999997e-06],"102400":[0.0071498279999999996,0.007548448000000001],"311296":[0.030595235999999991,0.030760602999999997],"1408":[0.000102303,0.000109984],"393216":[0.051374876999999999,0.054171243999999966],"4352":[0.00024854900000000009,0.00024984999999999992],"6553600":[1.5590006380000001,1.708402714],"20480":[0.0014399899999999999,0.00144053],"608":[3.8210999999999997e-05,3.9592000000000003e-05],"2228224":[0.44971165300000004,0.46278738800000002],"36864":[0.0024041799999999997,0.0025277439999999993],"704":[4.7046999999999999e-05,5.1031e-05],"720896":[0.091938035000000001,0.138746962],"800":[4.5389999999999997e-05,5.0655000000000002e-05],"2621440":[0.63749387300000004,0.66465930099999992],"425984":[0.036287072999999996,0.038888669000000001],"32768":[0.0022406040000000002,0.0023632140000000002],"12058624":[5.0110003880000002,5.0656425440000001],"128":[7.2660000000000004e-06,8.1499999999999999e-06],"180224":[0.018102674000000003,0.018622866000000002],"224":[1.2243e-05,1.2850000000000001e-05],"736":[5.8582000000000003e-05,7.6246000000000001e-05],"320":[1.8725000000000001e-05,2.1671e-05],"557056":[0.056116237999999999,0.073197574000000001],"832":[4.3411999999999997e-05,4.7182000000000003e-05],"9437184":[2.7413883750000001,2.8124048359999998],"3584":[0.00020737200000000002,0.00022134499999999996],"6291456":[2.7090838179999999,2.9211620630000001],"256":[1.4025999999999999e-05,1.6405e-05],"15204352":[4.1256414729999999,4.7831847769999998],"28672":[0.0017867360000000001,0.001891319],"768":[6.1795e-05,6.2889e-05],"212992":[0.016362196999999995,0.017828732],"864":[4.9082999999999997e-05,5.1983e-05],"352":[2.2572999999999999e-05,2.6911e-05],"253952":[0.022497401,0.022642834999999965],"960":[5.9451999999999999e-05,6.2545000000000005e-05],"24576":[0.0021862260000000003,0.002259109],"7680":[0.00050509399999999999,0.00052320000000000014],"294912":[0.026489331999999997,0.027506987],"1048576":[0.14907339,0.20770205500000005],"10485760":[3.3855524020000001,3.4986307459999999],"344064":[0.035955572999999956,0.036375166],"288":[1.5665999999999999e-05,1.7983e-05],"1152":[7.0184000000000004e-05,7.2525000000000001e-05],"384":[2.8532999999999999e-05,3.6436999999999997e-05],"2304":[0.00013687500000000001,0.00014187100000000004],"896":[4.9234000000000003e-05,5.1499999999999998e-05],"480":[2.9609000000000001e-05,2.9992e-05],"1441792":[0.29267840899999997,0.414913741],"992":[6.2668000000000004e-05,6.4811e-05],"3968":[0.00024701999999999998,0.00025795500000000009],"6400":[0.00035838499999999996,0.00036380399999999996],"1344":[9.0215000000000003e-05,9.8220000000000005e-05],"126976":[0.0099766620000000007,0.010078923],"2883584":[0.81206222900000002,0.91059328299999998],"753664":[0.107499041,0.13652337800000003],"16384":[0.0011273700000000002,0.0012063659999999999],"131072":[0.010765436999999999,0.010904288999999998],"458752":[0.040581205999999995,0.047063338000000003],"172032":[0.016245188000000001,0.016462109000000003],"12288":[0.001109439,0.0011288700000000001],"14680064":[3.9275949360000002,4.5865999229999996],"1536":[0.000118162,0.00013280099999999999],"25600":[0.001543532,0.0015474320000000003],"1835008":[0.30454678400000001,0.30869678499999997],"10752":[0.00076684500000000005,0.00078136200000000007],"21504":[0.0015696429999999997,0.0016790329999999999],"7602176":[1.91569594,1.9324303920000001],"5632":[0.00042898000000000008,0.00048786199999999993],"10":[4.4299999999999998e-07,4.7700000000000005e-07],"3145728":[1.1141674340000001,1.1408425849999999],"245760":[0.020390593000000005,0.022051561000000001],"1728":[0.000102217,0.000107639],"11":[4.9599999999999999e-07,5.0100000000000005e-07],"1114112":[0.161741896,0.235967226],"12":[5.2799999999999996e-07,5.3900000000000005e-07],"7340032":[1.72117619,1.885779855],"7168":[0.00044479600000000002,0.00046777],"13":[5.0500000000000004e-07,5.1200000000000003e-07],"6029312":[2.3255696270000001,2.3330890549999999],"14":[5.8100000000000003e-07,6.4600000000000004e-07],"3200":[0.00017387999999999998,0.00019399599999999999],"20":[7.4399999999999999e-07,7.8999999999999995e-07],"204800":[0.015418169000000001,0.016329635000000002],"15":[5.9200000000000001e-07,6.0800000000000004e-07],"13312":[0.00080512499999999996,0.00085151599999999986],"4980736":[1.4236966680000001,1.431786526],"118784":[0.0090027990000000023,0.009357169000000002],"51200":[0.0031785389999999998,0.0033138059999999999],"16":[7.37e-07,7.6700000000000003e-07],"21":[8.3399999999999998e-07,8.5899999999999995e-07],"917504":[0.111402982,0.16350081799999999],"22":[1.426e-06,1.4789999999999999e-06],"4864":[0.00029986799999999996,0.00031574499999999998],"17":[6.7100000000000001e-07,7.8999999999999995e-07],"14848":[0.00097034499999999984,0.00098710399999999993],"23":[1.4449999999999999e-06,1.609e-06],"786432":[0.127846022,0.19380993199999996],"18":[6.7700000000000004e-07,6.9400000000000005e-07],"1638400":[0.26022752299999996,0.2775146],"7864320":[2.057530839,2.116723516],"24":[1.7880000000000001e-06,1.9580000000000001e-06],"14155776":[3.6655254930000001,4.0520484440000004],"19":[6.8500000000000001e-07,7.5199999999999996e-07],"30":[1.762e-06,1.7630000000000001e-06],"25":[1.404e-06,1.5260000000000001e-06],"31":[2.0080000000000001e-06,2.1490000000000001e-06],"1280":[8.9728999999999994e-05,8.9838000000000003e-05],"26":[1.4389999999999999e-06,1.756e-06],"3932160":[0.84216005400000005,0.89651978799999998],"2432":[0.00014823899999999996,0.000155348],"32":[1.8419999999999999e-06,2.1679999999999998e-06],"27":[1.6190000000000001e-06,1.6390000000000001e-06],"409600":[0.033855319000000002,0.036854149999999995]}},{"title":"OrderedSet subtract Self (50% overlap)","results":{"28":[8.9299999999999996e-07,1.108e-06],"34":[1.575e-06,1.7940000000000001e-06],"29":[8.8800000000000001e-07,1.083e-06],"40":[1.8950000000000001e-06,2.3029999999999998e-06],"17408":[0.00090507700000000001,0.00095967800000000005],"1472":[9.4863000000000003e-05,0.000110419],"112":[4.741e-06,5.1930000000000001e-06],"1376256":[0.21827940800000001,0.34525224900000001],"5242880":[1.353677477,1.420817328],"36":[1.6640000000000001e-06,1.7850000000000001e-06],"42":[2.0449999999999999e-06,2.3520000000000001e-06],"11534336":[3.6851392089999999,3.8205861219999999],"114688":[0.0066904739999999992,0.007044899000000002],"144":[6.5250000000000002e-06,7.7000000000000008e-06],"38":[1.7990000000000001e-06,1.911e-06],"240":[1.0129000000000001e-05,1.0504e-05],"9216":[0.00048026599999999992,0.00056965],"44":[2.3750000000000001e-06,2.847e-06],"1664":[7.0511000000000003e-05,7.5133e-05],"196608":[0.020475360999999997,0.021235413999999998],"155648":[0.011698333999999999,0.011745204],"2816":[0.00016789599999999998,0.00018263400000000004],"50":[2.148e-06,2.2069999999999998e-06],"2359296":[0.42910755,0.46654614100000003],"46":[2.2900000000000001e-06,2.5000000000000002e-06],"176":[9.9359999999999994e-06,1.0057e-05],"52":[2.3180000000000001e-06,2.3259999999999998e-06],"272":[1.2424e-05,1.3946e-05],"116":[4.7559999999999999e-06,5.6210000000000001e-06],"47104":[0.0032420109999999986,0.0033861],"6912":[0.00032932400000000003,0.00033609600000000003],"1856":[8.3298000000000001e-05,9.1083999999999997e-05],"48":[2.4650000000000001e-06,3.0929999999999999e-06],"2097152":[0.35657039099999999,0.42746645699999997],"54":[2.3420000000000002e-06,2.447e-06],"2031616":[0.31497888200000002,0.33163419500000002],"43008":[0.0026929860000000001,0.0028066300000000001],"60":[2.819e-06,2.9790000000000002e-06],"30720":[0.0015038499999999999,0.0015977910000000001],"56":[2.452e-06,2.5840000000000002e-06],"62":[2.7499999999999999e-06,3.2890000000000002e-06],"58":[2.4530000000000001e-06,2.4870000000000001e-06],"3014656":[0.78763881499999999,0.84118721799999996],"64":[2.7819999999999998e-06,2.8880000000000001e-06],"8388608":[1.9366814699999999,2.0945665880000002],"29696":[0.0014318970000000003,0.001478762],"216":[8.6519999999999995e-06,9.2830000000000007e-06],"106496":[0.005956346999999999,0.0063318520000000007],"72":[3.2660000000000002e-06,3.478e-06],"442368":[0.031782768999999995,0.033216020999999998],"147456":[0.010140563,0.010175406],"4456448":[1.0186132189999999,1.1011955490000001],"63488":[0.0033700939999999997,0.0034743449999999993],"38912":[0.0022057779999999994,0.0023514220000000001],"68":[3.128e-06,3.326e-06],"188416":[0.017203400000000001,0.019085081],"248":[1.1430000000000001e-05,1.1649e-05],"80":[3.7060000000000002e-06,3.7969999999999998e-06],"2560":[0.00014476499999999999,0.00015228100000000004],"34816":[0.0018269220000000004,0.001866415],"3712":[0.000170256,0.00017820599999999998],"3538944":[0.67890406400000003,0.74722079800000007],"76":[3.7799999999999998e-06,4.3649999999999997e-06],"4194304":[0.87399865300000001,0.88094871100000005],"851968":[0.082376878000000001,0.13248785499999999],"4096":[0.00019512800000000001,0.000200793],"59392":[0.003030278,0.0032757230000000003],"84":[3.7850000000000002e-06,5.0499999999999999e-06],"3276800":[0.61694301699999998,0.61703478199999995],"55296":[0.0027554620000000011,0.0029036070000000003],"688128":[0.069749427000000003,0.085158326999999992],"8192":[0.000436666,0.00044319300000000004],"10240":[0.00062009800000000003,0.00062873700000000009],"15872":[0.00080554999999999982,0.00084152000000000033],"92":[4.7400000000000004e-06,6.1480000000000003e-06],"26624":[0.0012593599999999999,0.0013135340000000001],"1792":[8.1191000000000002e-05,9.2948000000000005e-05],"11776":[0.00080510200000000003,0.00083367899999999982],"2944":[0.00018956799999999998,0.00020499200000000003],"88":[4.5419999999999999e-06,5.1880000000000001e-06],"22528":[0.0014865120000000002,0.0015378949999999998],"1245184":[0.17713005500000001,0.25639514200000002],"15728640":[3.7110422449999998,3.8818483879999999],"96":[5.7599999999999999e-06,5.964e-06],"1984":[9.4976999999999995e-05,9.6617e-05],"139264":[0.0093597130000000004,0.0095560280000000011],"475136":[0.034669292999999976,0.042910012999999997],"13631488":[3.1508171140000001,3.346183092],"416":[1.7700999999999999e-05,1.8105999999999999e-05],"928":[4.1489000000000002e-05,4.7336000000000002e-05],"512":[2.3198e-05,2.4706999999999999e-05],"18432":[0.0010069250000000001,0.001033366],"16777216":[4.4517634480000003],"9728":[0.00051782100000000001,0.00054653799999999973],"1769472":[0.25850424999999999,0.28485036699999999],"1703936":[0.25564027899999997,0.264608018],"2048":[9.4271000000000006e-05,9.4547000000000001e-05],"14336":[0.00070581000000000007,0.00070762100000000007],"448":[1.8456000000000001e-05,2.1022999999999998e-05],"5505024":[1.4589591689999999,1.609096434],"544":[2.6183e-05,2.7206e-05],"221184":[0.014078692,0.015724686000000005],"90112":[0.0063061460000000003,0.0067827719999999994],"640":[3.3127999999999999e-05,3.6690999999999998e-05],"12800":[0.00058834999999999985,0.00061303399999999993],"262144":[0.018496517000000001,0.025883580999999999],"589824":[0.050005426999999991,0.079957159],"884736":[0.097898921999999985,0.13657651100000001],"6144":[0.00042746800000000002,0.00047600300000000002],"1088":[5.3362999999999997e-05,5.5739999999999998e-05],"576":[2.7015000000000001e-05,3.1077000000000001e-05],"160":[7.7200000000000006e-06,8.9700000000000005e-06],"672":[3.8566999999999999e-05,3.9561000000000003e-05],"8912896":[2.1879419479999997,2.2298816050000001],"100":[3.8630000000000001e-06,4.4649999999999996e-06],"507904":[0.037954682999999996,0.055268957000000021],"3840":[0.00017543099999999998,0.00019306],"192":[1.2152e-05,1.3392e-05],"376832":[0.037437717000000009,0.038561697999999991],"98304":[0.0084022469999999981,0.0088785540000000003],"5376":[0.00030211099999999998,0.000344722],"94208":[0.0072006509999999998,0.0076691569999999985],"81920":[0.005268928,0.0053705979999999999],"3407872":[0.61085908799999999,0.64270571900000006],"104":[4.3540000000000002e-06,4.9509999999999997e-06],"122880":[0.0078008600000000015,0.008050713000000001],"200":[8.4870000000000002e-06,8.7539999999999995e-06],"163840":[0.012773763,0.013014164999999998],"4063232":[0.81043843000000004,0.83663610700000002],"5767168":[1.693834533,1.8135202640000001],"12582912":[4.9093673740000003,5.2444152050000001],"1600":[7.0106999999999998e-05,7.1167000000000005e-05],"136":[6.331e-06,6.6760000000000001e-06],"232":[9.9990000000000003e-06,1.0514e-05],"7077888":[1.544852178,1.7047811290000001],"86016":[0.0058232649999999993,0.0063650240000000012],"31744":[0.001637056,0.0016823629999999999],"168":[8.1419999999999993e-06,1.039e-05],"622592":[0.054585196999999995,0.072906058999999995],"108":[4.284e-06,4.5090000000000004e-06],"327680":[0.026906311999999995,0.03060067],"2176":[0.000109786,0.000114022],"3328":[0.000151135,0.00015677199999999998],"1":[1.4499999999999999e-07,1.5099999999999999e-07],"2":[2.7000000000000001e-07,2.7799999999999997e-07],"3":[2.67e-07,2.8700000000000002e-07],"4":[2.9499999999999998e-07,2.9900000000000002e-07],"7424":[0.00034243499999999998,0.000373502],"5":[3.2500000000000001e-07,3.5499999999999999e-07],"23552":[0.0016566720000000001,0.001666079],"6":[3.8799999999999998e-07,4.0999999999999999e-07],"61440":[0.003211724,0.0032608249999999993],"491520":[0.036809317999999994,0.055642011000000005],"77824":[0.0047500780000000005,0.0051949460000000006],"7":[3.89e-07,3.9700000000000002e-07],"8":[4.27e-07,4.7700000000000005e-07],"208":[8.2879999999999993e-06,9.3340000000000008e-06],"9":[4.7300000000000001e-07,4.7700000000000005e-07],"73728":[0.0042440429999999994,0.0045494250000000002],"304":[1.4056999999999999e-05,1.4586000000000001e-05],"400":[1.7314000000000001e-05,1.7354e-05],"1310720":[0.19929664899999999,0.29922368599999999],"336":[1.8898000000000001e-05,2.0426999999999999e-05],"3670016":[0.67693260199999994,0.69798082799999994],"6656":[0.00028963700000000003,0.000324285],"15360":[0.00076659199999999997,0.00078848699999999983],"432":[1.7144999999999999e-05,1.7968000000000001e-05],"950272":[0.103039775,0.15189710000000001],"655360":[0.060975501000000008,0.091675961],"69632":[0.0039373139999999991,0.0040980630000000007],"11264":[0.00071176300000000002,0.00072707000000000002],"2752512":[0.60509670300000007,0.65228597399999999],"8126464":[1.8171898049999999,1.9430912679999999],"27648":[0.001362088,0.001365039],"368":[2.2086000000000002e-05,2.3657000000000001e-05],"65536":[0.003587715999999999,0.0037597539999999997],"16252928":[3.9979280319999999,4.326326248],"464":[1.9358e-05,2.0971999999999998e-05],"1015808":[0.126162683,0.172774394],"3072":[0.00020934800000000004,0.00023822899999999996],"110592":[0.0063660969999999994,0.006790585],"237568":[0.016004696999999991,0.017504643],"278528":[0.020684583000000006,0.020775838000000001],"496":[2.0781e-05,2.2070999999999999e-05],"13107200":[2.8783384949999999,3.3710015850000001],"9961472":[2.6286284549999999,2.7115474019999999],"5888":[0.000409763,0.00043673799999999999],"11010048":[3.197091602,3.4047890550000002],"1920":[8.6837999999999998e-05,9.5626999999999998e-05],"2490368":[0.48829089299999995,0.54495123099999998],"19456":[0.001125069,0.0011387440000000001],"57344":[0.0028826540000000001,0.0028909499999999998],"1179648":[0.16142669700000001,0.20509028900000001],"4718592":[1.067146945,1.106759488],"360448":[0.033229082,0.034403207000000005],"1572864":[0.34267999999999998,0.35733667000000002],"53248":[0.0025486099999999993,0.0027237710000000007],"3456":[0.00015235199999999999,0.000159097],"40960":[0.0024651170000000002,0.0025753149999999995],"4608":[0.000229786,0.000242764],"13824":[0.00067505100000000008,0.00068271499999999986],"819200":[0.077295542999999994,0.117756763],"983040":[0.119983175,0.15024391300000001],"8704":[0.00045300599999999999,0.00047976599999999996],"120":[5.1850000000000003e-06,5.4229999999999996e-06],"1024":[4.9733e-05,5.1217000000000001e-05],"49152":[0.0037524780000000001,0.003781909],"524288":[0.04352938499999999,0.05079557400000001],"45056":[0.0031079430000000002,0.0031252709999999998],"229376":[0.01519001,0.016102720000000001],"2688":[0.00015106200000000001,0.00016112100000000002],"152":[7.0029999999999997e-06,7.9349999999999994e-06],"5120":[0.00028088499999999998,0.00030943099999999993],"1507328":[0.31137650500000003,0.40641062400000005],"1216":[6.1706999999999997e-05,7.5196000000000003e-05],"1966080":[0.29849321200000001,0.31395826199999999],"1900544":[0.29551631099999998,0.314013704],"184":[1.04e-05,1.0572e-05],"7936":[0.00038361500000000002,0.0003914849999999999],"3801088":[0.72788355199999999,0.79754467900000003],"6815744":[1.4699952940000001,1.6496257249999999],"124":[5.4369999999999998e-06,5.6230000000000002e-06],"102400":[0.005897699000000001,0.0059284139999999999],"311296":[0.025058416,0.027422484],"1408":[8.3137e-05,8.6460999999999998e-05],"393216":[0.043273855,0.046592996000000012],"4352":[0.00023037099999999999,0.000232678],"6553600":[1.437725718,1.511998105],"20480":[0.001209693,0.001237405],"608":[3.1063999999999999e-05,3.2397999999999997e-05],"2228224":[0.388746117,0.38972360399999995],"36864":[0.0020380620000000006,0.0021234189999999997],"704":[3.9159999999999998e-05,4.2935999999999997e-05],"720896":[0.077247841999999997,0.114883613],"800":[3.5249000000000001e-05,3.8469e-05],"2621440":[0.54458399099999999,0.57272637300000007],"425984":[0.029285526999999999,0.030916002999999997],"32768":[0.0016770379999999994,0.001780277],"12058624":[4.374313495,4.4079644450000002],"128":[5.3959999999999997e-06,6.2179999999999996e-06],"180224":[0.015602174,0.015985052999999999],"224":[8.9279999999999999e-06,9.2599999999999994e-06],"736":[4.6551999999999997e-05,6.1387e-05],"320":[1.6038000000000001e-05,1.7705000000000001e-05],"557056":[0.044652859000000003,0.070055095999999997],"832":[3.3210999999999998e-05,3.7948000000000003e-05],"9437184":[2.2897796480000001,2.388178463],"3584":[0.00016510100000000002,0.00016782400000000004],"6291456":[2.2200421810000002,2.3454703930000003],"256":[1.1049e-05,1.2024e-05],"15204352":[3.6482783909999998,4.2690123589999995],"28672":[0.0014039019999999998,0.0014476140000000003],"768":[5.0136999999999998e-05,5.2883999999999997e-05],"212992":[0.013475521000000004,0.015457349],"864":[3.5892999999999997e-05,3.9771000000000003e-05],"352":[1.8646000000000001e-05,2.0360000000000002e-05],"253952":[0.018138492999999999,0.018909328],"960":[4.4786000000000001e-05,4.7330999999999998e-05],"24576":[0.0017929,0.001851386],"7680":[0.000377964,0.0003940830000000001],"294912":[0.022924533,0.023943852999999998],"1048576":[0.12579818800000001,0.19680714999999999],"10485760":[2.9542842810000001,2.9980847659999998],"344064":[0.030648512999999999,0.032651159999999992],"288":[1.3074000000000001e-05,1.5543e-05],"1152":[6.1619999999999996e-05,6.1761999999999996e-05],"384":[2.4283000000000001e-05,2.9337999999999999e-05],"2304":[0.000123504,0.00012570100000000001],"896":[3.7497999999999999e-05,4.0988000000000001e-05],"480":[2.1492e-05,2.2626999999999999e-05],"1441792":[0.25397515500000001,0.379887961],"992":[4.5988000000000001e-05,4.8248000000000003e-05],"3968":[0.00019524500000000001,0.000204234],"6400":[0.00028188000000000003,0.00028928100000000001],"1344":[7.5605999999999994e-05,7.8739999999999995e-05],"126976":[0.0079396670000000009,0.0080856259999999985],"2883584":[0.71745718699999994,0.72931079799999998],"753664":[0.086726361000000002,0.14019793699999999],"16384":[0.00085336699999999984,0.00087681],"131072":[0.0086159900000000005,0.0086254880000000006],"458752":[0.03325983200000001,0.044283886000000001],"172032":[0.01397867,0.014247815],"12288":[0.00087391999999999993,0.0009462460000000002],"14680064":[3.369314996,4.0808120649999999],"1536":[0.00010994500000000001,0.00011214600000000001],"25600":[0.001164029,0.0012194039999999999],"1835008":[0.27857551899999999,0.30326155199999999],"10752":[0.00064447000000000007,0.00066446399999999981],"21504":[0.001335735,0.0013723139999999999],"7602176":[1.6853125879999999,1.726269939],"5632":[0.000386337,0.00039978699999999997],"10":[4.4799999999999999e-07,4.4999999999999998e-07],"3145728":[0.907534599,0.94716962500000002],"245760":[0.016557395000000003,0.017633579999999999],"1728":[7.8259999999999999e-05,8.2887999999999997e-05],"11":[4.51e-07,4.7300000000000001e-07],"1114112":[0.13804079599999999,0.21703862100000004],"12":[4.9200000000000001e-07,5.0500000000000004e-07],"7340032":[1.5693136220000001,1.687773685],"7168":[0.00032546499999999999,0.00035441299999999993],"13":[4.89e-07,5.1500000000000005e-07],"6029312":[1.9437156120000001,1.9465071650000001],"14":[5.7000000000000005e-07,6.3499999999999996e-07],"3200":[0.00013468099999999999,0.00014931999999999996],"20":[7.06e-07,8.6199999999999996e-07],"204800":[0.013566509000000001,0.013667456999999999],"15":[5.6400000000000002e-07,5.68e-07],"13312":[0.00061653500000000009,0.00062760300000000002],"4980736":[1.164264451,1.265590808],"118784":[0.0071484509999999984,0.0075928689999999995],"51200":[0.0025212390000000002,0.0025762139999999998],"16":[6.7700000000000004e-07,6.8100000000000002e-07],"21":[8.1200000000000002e-07,8.1299999999999999e-07],"917504":[0.096879184000000007,0.137154098],"22":[7.85e-07,8.1999999999999998e-07],"4864":[0.00025063800000000002,0.00026602599999999999],"17":[6.3799999999999997e-07,7.1099999999999995e-07],"14848":[0.0007228689999999999,0.00075525399999999991],"23":[8.1200000000000002e-07,8.8899999999999998e-07],"786432":[0.10203999800000001,0.157250955],"18":[6.2099999999999996e-07,6.5600000000000005e-07],"1638400":[0.23296214999999998,0.26226559799999999],"7864320":[1.821829964,1.8562495160000001],"24":[1.035e-06,1.4219999999999999e-06],"14155776":[3.2137007149999999,3.4781236579999999],"19":[7.4000000000000001e-07,7.4199999999999995e-07],"30":[9.2900000000000002e-07,9.3200000000000003e-07],"25":[8.0500000000000002e-07,8.3699999999999999e-07],"31":[1.009e-06,1.094e-06],"1280":[6.8238000000000006e-05,7.4824000000000001e-05],"26":[7.85e-07,1.071e-06],"3932160":[0.76793696499999997,0.85480140599999999],"2432":[0.000121334,0.000138391],"32":[1.5430000000000001e-06,1.6509999999999999e-06],"27":[9.1800000000000004e-07,1.0389999999999999e-06],"409600":[0.028185675,0.030461722]}},{"title":"OrderedSet subtract Self (75% overlap)","results":{"28":[8.4399999999999999e-07,9.7499999999999998e-07],"34":[1.0610000000000001e-06,1.1939999999999999e-06],"29":[8.4499999999999996e-07,9.7300000000000004e-07],"40":[1.207e-06,1.3599999999999999e-06],"17408":[0.000707561,0.0007169469999999999],"1472":[7.0773999999999997e-05,7.6229999999999994e-05],"112":[3.6430000000000001e-06,3.929e-06],"1376256":[0.213800883,0.28324105399999999],"5242880":[1.0706634319999999,1.168855599],"36":[9.9699999999999994e-07,1.091e-06],"42":[1.257e-06,1.361e-06],"11534336":[2.9428361029999999,3.132074185],"114688":[0.005505559000000001,0.0059649669999999998],"144":[4.8339999999999998e-06,5.5310000000000001e-06],"38":[1.079e-06,1.229e-06],"240":[8.0250000000000002e-06,8.2539999999999992e-06],"9216":[0.00040272800000000004,0.00043741800000000002],"44":[1.4720000000000001e-06,1.711e-06],"1664":[5.3633e-05,5.8137999999999998e-05],"196608":[0.015415556,0.016083765],"155648":[0.009757476999999997,0.0097623650000000506],"2816":[0.00013286999999999999,0.00013660700000000002],"50":[1.2750000000000001e-06,1.3230000000000001e-06],"2359296":[0.41609901799999999,0.421741423],"46":[1.37e-06,1.807e-06],"176":[6.7560000000000002e-06,7.0299999999999996e-06],"52":[1.4899999999999999e-06,1.5579999999999999e-06],"272":[9.5840000000000001e-06,1.0155e-05],"116":[3.7299999999999999e-06,4.4449999999999998e-06],"47104":[0.0024560350000000001,0.0025818379999999995],"6912":[0.00024312499999999999,0.00025045999999999998],"1856":[6.6120999999999999e-05,6.7812999999999996e-05],"48":[1.542e-06,1.916e-06],"2097152":[0.31660164899999999,0.34718138799999998],"54":[1.511e-06,1.5370000000000001e-06],"2031616":[0.284745629,0.33084536899999994],"43008":[0.0021595800000000004,0.0021606379999999999],"60":[1.716e-06,1.725e-06],"30720":[0.001170576,0.00130276],"56":[1.559e-06,1.7409999999999999e-06],"62":[1.672e-06,1.756e-06],"58":[1.626e-06,1.8619999999999999e-06],"3014656":[0.65880228900000004,0.71514757399999995],"64":[2.2960000000000001e-06,2.4420000000000001e-06],"8388608":[1.6755241750000001,1.773932397],"29696":[0.0011241720000000001,0.0011376420000000001],"216":[6.7989999999999996e-06,7.3309999999999998e-06],"106496":[0.0049389530000000003,0.0053212090000000012],"72":[2.5629999999999999e-06,2.6589999999999999e-06],"442368":[0.025292857000000002,0.027900239],"147456":[0.0084600040000000019,0.008883476999999999],"4456448":[0.840707329,0.863995815],"63488":[0.0027599980000000005,0.0027611509999999999],"38912":[0.0016825430000000003,0.001841901],"68":[2.4590000000000001e-06,2.7800000000000001e-06],"188416":[0.013531108,0.014055942],"248":[8.9479999999999997e-06,9.268e-06],"80":[2.9040000000000001e-06,3.3919999999999999e-06],"2560":[0.000114854,0.00012503499999999996],"34816":[0.001445886,0.0014717299999999999],"3712":[0.00013737299999999999,0.00015267699999999999],"3538944":[0.61579954399999992,0.63466885100000003],"76":[2.9550000000000001e-06,3.315e-06],"4194304":[0.72654971600000007,0.86092080400000004],"851968":[0.071087429999999979,0.138691602],"4096":[0.00015956999999999999,0.00016155599999999998],"59392":[0.0024920179999999995,0.0026028640000000003],"84":[2.8650000000000001e-06,3.3670000000000001e-06],"3276800":[0.51322505699999998,0.55673653700000003],"55296":[0.0021687390000000003,0.0022823050000000001],"688128":[0.055639335999999998,0.080317424999999998],"8192":[0.00031943999999999999,0.00031972600000000005],"10240":[0.00044706199999999997,0.000474415],"15872":[0.00065362300000000009,0.00069867599999999996],"92":[3.5700000000000001e-06,4.6349999999999997e-06],"26624":[0.00098270800000000032,0.001027266],"1792":[5.9911000000000003e-05,7.2659999999999999e-05],"11776":[0.00060190299999999999,0.0006031980000000001],"2944":[0.000145222,0.00015195599999999999],"88":[3.4659999999999999e-06,3.8139999999999998e-06],"22528":[0.001104046,0.001171748],"1245184":[0.15173205200000001,0.22772469300000001],"15728640":[3.3157509539999999,3.5864877750000002],"96":[4.065e-06,4.279e-06],"1984":[7.3571000000000004e-05,7.6403999999999996e-05],"139264":[0.0076028789999999999,0.0079114730000000005],"475136":[0.027921588000000004,0.039791649999999998],"13631488":[2.717119775,3.157205249],"416":[1.4216000000000001e-05,1.4385e-05],"928":[3.2540999999999999e-05,3.6832999999999998e-05],"512":[1.8422000000000001e-05,1.9684e-05],"18432":[0.00074573099999999991,0.00082509800000000002],"16777216":[3.589476484],"9728":[0.00039951199999999998,0.00040600599999999999],"1769472":[0.240430169,0.250671857],"1703936":[0.22892219,0.23563944400000003],"2048":[7.5554000000000002e-05,7.7171999999999999e-05],"14336":[0.00051362900000000004,0.000538099],"448":[1.4643e-05,1.6569999999999999e-05],"5505024":[1.2103060969999999,1.3273973020000001],"544":[2.0582e-05,2.1733e-05],"221184":[0.011942043000000003,0.012134337],"90112":[0.0050725339999999992,0.0052301559999999988],"640":[2.6557e-05,2.9255999999999999e-05],"12800":[0.00044818799999999986,0.00046229000000000002],"262144":[0.015140491000000001,0.017654501999999999],"589824":[0.041843177000000002,0.091113794999999997],"884736":[0.091255069000000008,0.140480087],"6144":[0.00031693800000000001,0.00034737],"1088":[3.8381999999999999e-05,4.2540000000000003e-05],"576":[2.1403000000000002e-05,2.2945000000000001e-05],"160":[6.6200000000000001e-06,7.1280000000000002e-06],"672":[3.1044999999999998e-05,3.1127000000000002e-05],"8912896":[1.856058526,1.9490736639999999],"100":[3.2559999999999998e-06,3.4379999999999999e-06],"507904":[0.031518962999999997,0.046211969000000006],"3840":[0.00013776899999999999,0.00015053700000000001],"192":[8.5369999999999997e-06,9.3589999999999997e-06],"376832":[0.030354824999999995,0.032975540999999983],"98304":[0.0065627329999999994,0.0068016230000000023],"5376":[0.000231287,0.00023381999999999995],"94208":[0.0055716439999999997,0.0059556099999999983],"81920":[0.0041263710000000011,0.00420931],"3407872":[0.54715388300000001,0.55739750799999999],"104":[3.4510000000000001e-06,3.8229999999999997e-06],"122880":[0.0064526520000000006,0.0066768850000000005],"200":[6.6460000000000004e-06,6.781e-06],"163840":[0.010097726999999997,0.010394789999999996],"4063232":[0.775071026,0.84083588100000006],"5767168":[1.462093436,1.56968302],"12582912":[3.7234495270000001,4.1747819259999996],"1600":[5.0983999999999998e-05,5.4375e-05],"136":[4.7890000000000002e-06,5.0189999999999997e-06],"232":[7.8429999999999993e-06,8.2060000000000007e-06],"7077888":[1.2934255720000001,1.536859244],"86016":[0.004645349,0.0050325350000000003],"31744":[0.0012359420000000001,0.0012882049999999997],"168":[6.4169999999999997e-06,7.909e-06],"622592":[0.044794707999999996,0.058185339999999974],"108":[3.3689999999999998e-06,3.7160000000000001e-06],"327680":[0.022023114,0.023404018999999998],"2176":[8.4308999999999995e-05,8.7594000000000002e-05],"3328":[0.000121395,0.00013137000000000001],"1":[1.4600000000000001e-07,1.5099999999999999e-07],"2":[1.7100000000000001e-07,1.73e-07],"3":[1.7700000000000001e-07,1.91e-07],"4":[2.8900000000000001e-07,2.9700000000000003e-07],"7424":[0.000265899,0.000311794],"5":[3.22e-07,3.58e-07],"23552":[0.001229323,0.0012877030000000001],"6":[3.4999999999999998e-07,3.6800000000000001e-07],"61440":[0.002580321,0.0026184800000000003],"491520":[0.029783311999999996,0.044313462999999997],"77824":[0.0037889819999999998,0.0039754639999999997],"7":[3.4999999999999998e-07,3.7899999999999999e-07],"8":[3.6600000000000002e-07,3.9900000000000001e-07],"208":[6.4080000000000003e-06,7.2189999999999998e-06],"9":[4.2300000000000002e-07,4.3099999999999998e-07],"73728":[0.0033205800000000009,0.003630079],"304":[1.0872e-05,1.2991e-05],"400":[1.3236e-05,1.3424000000000001e-05],"1310720":[0.17373919999999998,0.26534890100000003],"336":[1.4032000000000001e-05,1.4543e-05],"3670016":[0.65142439399999996,0.67537001299999999],"6656":[0.00023490700000000005,0.00023839400000000001],"15360":[0.00059986499999999999,0.00060203299999999987],"432":[1.3940999999999999e-05,1.4289e-05],"950272":[0.092745100000000011,0.123750692],"655360":[0.050412115,0.068976780999999987],"69632":[0.003062777,0.003390578],"11264":[0.00052713300000000027,0.00056883599999999997],"2752512":[0.55458582899999997,0.57218647599999994],"8126464":[1.554948277,1.8097128680000001],"27648":[0.0010496469999999997,0.0010758899999999999],"368":[1.6894000000000001e-05,1.7215999999999999e-05],"65536":[0.0028739410000000001,0.0030361640000000001],"16252928":[3.7047626989999998,3.7607745609999998],"464":[1.5384999999999999e-05,1.6175999999999999e-05],"1015808":[0.100909068,0.164175032],"3072":[0.00015282800000000003,0.00015433999999999999],"110592":[0.005228707,0.0056996369999999996],"237568":[0.013912263999999999,0.014747517999999998],"278528":[0.017083498999999999,0.019472871000000006],"496":[1.5947000000000002e-05,1.7156999999999999e-05],"13107200":[2.673327317,2.9822653899999998],"9961472":[2.1728086950000001,2.3902484250000002],"5888":[0.00030334199999999996,0.00030900099999999999],"11010048":[2.6617879809999998,2.8071030500000003],"1920":[7.3689000000000005e-05,7.5548000000000002e-05],"2490368":[0.45232937200000001,0.52048709399999993],"19456":[0.00082265800000000009,0.00082510499999999991],"57344":[0.0022710389999999999,0.002360914],"1179648":[0.13902252800000001,0.23288631800000001],"4718592":[0.92300722800000001,0.996811895],"360448":[0.026671967000000008,0.030182904999999999],"1572864":[0.28558339300000002,0.365588731],"53248":[0.0020610209999999997,0.0021406039999999999],"3456":[0.000123452,0.000140755],"40960":[0.0019236709999999996,0.0019850689999999999],"4608":[0.00019664299999999995,0.000197295],"13824":[0.00050743099999999981,0.00052588199999999987],"819200":[0.066447969999999995,0.102291808],"983040":[0.107226813,0.14099358200000001],"8704":[0.00033734600000000003,0.00039878899999999998],"120":[3.9750000000000001e-06,4.2259999999999999e-06],"1024":[3.5491999999999998e-05,3.7162000000000001e-05],"49152":[0.0028033019999999997,0.0028320390000000006],"524288":[0.033909578000000017,0.041074189999999997],"45056":[0.0022305569999999998,0.0024205839999999999],"229376":[0.014019038000000001,0.014060498999999999],"2688":[0.000113652,0.000116662],"152":[5.2750000000000003e-06,5.7350000000000001e-06],"5120":[0.00021361499999999998,0.000227533],"1507328":[0.26708489300000005,0.37460850699999998],"1216":[4.6879000000000003e-05,5.6802000000000003e-05],"1966080":[0.27165457300000001,0.34682969400000002],"1900544":[0.26921590299999998,0.32206108],"184":[8.3529999999999995e-06,8.4169999999999992e-06],"7936":[0.00029296699999999999,0.00030447600000000003],"3801088":[0.63034528999999995,0.70940594000000001],"6815744":[1.3363153560000001,1.449851663],"124":[4.4240000000000003e-06,4.5449999999999997e-06],"102400":[0.0048182620000000011,0.0049832080000000003],"311296":[0.020676721000000002,0.021219877000000005],"1408":[6.2032000000000005e-05,6.4367000000000002e-05],"393216":[0.033981340000000006,0.038279246000000003],"4352":[0.00016956099999999998,0.000172094],"6553600":[1.231353111,1.355715405],"20480":[0.00093297500000000017,0.00097436800000000009],"608":[2.5168999999999999e-05,2.5316999999999998e-05],"2228224":[0.34984265399999998,0.35241934899999999],"36864":[0.0015787659999999999,0.0016131799999999999],"704":[3.0179e-05,3.3725e-05],"720896":[0.064307349,0.10570553000000001],"800":[2.6761999999999999e-05,2.9235e-05],"2621440":[0.49991500499999997,0.56151091500000005],"425984":[0.023986855000000001,0.025601092000000002],"32768":[0.001315767,0.0013342579999999998],"12058624":[3.3216552460000002,3.408614177],"128":[4.0899999999999998e-06,4.3630000000000004e-06],"180224":[0.012802687,0.012954983],"224":[7.328e-06,7.605e-06],"736":[3.4793999999999999e-05,4.1350000000000002e-05],"320":[1.2057e-05,1.2695e-05],"557056":[0.037342765,0.055732721999999991],"832":[2.5763999999999999e-05,2.9901999999999999e-05],"9437184":[1.98363497,2.4060758369999999],"3584":[0.00012280899999999998,0.00013710399999999998],"6291456":[1.869625332,1.9221301850000001],"256":[8.5129999999999996e-06,1.0101e-05],"15204352":[3.3292727659999999,3.9922155969999999],"28672":[0.0010762249999999997,0.001156816],"768":[3.5748999999999999e-05,3.8841999999999998e-05],"212992":[0.011325513000000001,0.012327026],"864":[2.7617e-05,3.1050000000000003e-05],"352":[1.3834e-05,1.6554000000000001e-05],"253952":[0.014490570000000003,0.016324068000000001],"960":[3.3173999999999998e-05,3.6291000000000002e-05],"24576":[0.0013613570000000001,0.001377098],"7680":[0.00029012300000000004,0.00033219100000000002],"294912":[0.018350129999999996,0.020200275],"1048576":[0.10981408600000001,0.16990286700000001],"10485760":[2.568929222,2.6336192199999999],"344064":[0.024972354000000002,0.02715097],"288":[9.9620000000000005e-06,1.2371000000000001e-05],"1152":[4.6065e-05,4.6560000000000001e-05],"384":[1.8423999999999998e-05,1.9245999999999998e-05],"2304":[8.7541999999999996e-05,9.4493999999999993e-05],"896":[2.9461000000000001e-05,3.2397000000000002e-05],"480":[1.6682999999999999e-05,1.7571000000000002e-05],"1441792":[0.21771395000000004,0.32438330300000001],"992":[3.5064999999999997e-05,3.7110999999999998e-05],"3968":[0.00014806199999999999,0.00015653500000000002],"6400":[0.00021604300000000002,0.00022906400000000001],"1344":[5.9474e-05,5.9645999999999998e-05],"126976":[0.0065037159999999997,0.0067947709999999998],"2883584":[0.593225899,0.654832949],"753664":[0.068626582000000019,0.117499557],"16384":[0.00065903700000000001,0.00067946900000000004],"131072":[0.0070264939999999994,0.0073713200000000006],"458752":[0.027467986,0.04256667900000001],"172032":[0.011282512,0.011400135],"12288":[0.000651882,0.00070051],"14680064":[2.942597803,3.8367517659999999],"1536":[8.2179e-05,8.8403e-05],"25600":[0.00090535400000000003,0.0009244539999999999],"1835008":[0.253599519,0.25605296900000002],"10752":[0.000475196,0.00049562800000000002],"21504":[0.001032984,0.001098302],"7602176":[1.4077253280000002,1.5818564049999999],"5632":[0.00028377400000000004,0.00030132499999999997],"10":[4.1800000000000001e-07,4.51e-07],"3145728":[0.77514751699999995,0.78926122900000006],"245760":[0.013638893000000003,0.014041033999999999],"1728":[5.9227000000000001e-05,5.9654999999999997e-05],"11":[4.2100000000000002e-07,4.4799999999999999e-07],"1114112":[0.12096836800000001,0.16203097299999999],"12":[5.1099999999999996e-07,5.3099999999999998e-07],"7340032":[1.480752649,1.531860749],"7168":[0.00027878799999999992,0.00029988999999999998],"13":[5.3399999999999999e-07,5.4199999999999996e-07],"6029312":[1.5827293490000001,1.6156576440000001],"14":[5.5899999999999996e-07,6.4600000000000004e-07],"3200":[0.00010505600000000001,0.000115679],"20":[6.8500000000000001e-07,7.8700000000000005e-07],"204800":[0.011422482999999999,0.011845427],"15":[6.0100000000000005e-07,6.13e-07],"13312":[0.00045781700000000001,0.00049636199999999998],"4980736":[1.0239581289999999,1.0252664869999999],"118784":[0.0058635889999999989,0.0064355969999999995],"51200":[0.0019546839999999999,0.0020302090000000003],"16":[7.6000000000000003e-07,8.0800000000000004e-07],"21":[7.6599999999999995e-07,9.3200000000000003e-07],"917504":[0.08198399499999999,0.12699381000000001],"22":[7.5799999999999998e-07,8.0599999999999999e-07],"4864":[0.00020134499999999996,0.000204174],"17":[6.7199999999999998e-07,7.0900000000000001e-07],"14848":[0.00056035199999999986,0.00057207999999999998],"23":[7.2200000000000003e-07,7.4000000000000001e-07],"786432":[0.089966086999999972,0.115201875],"18":[6.4799999999999998e-07,7.2500000000000005e-07],"1638400":[0.230668076,0.266935537],"7864320":[1.621623217,1.6575084449999999],"24":[8.9500000000000001e-07,1.1620000000000001e-06],"14155776":[2.836250825,3.2123500849999997],"19":[7.2600000000000002e-07,7.3e-07],"30":[8.6700000000000002e-07,8.9299999999999996e-07],"25":[8.47e-07,8.78e-07],"31":[9.5000000000000001e-07,1.0499999999999999e-06],"1280":[5.1882999999999998e-05,5.7713000000000001e-05],"26":[8.2099999999999995e-07,8.78e-07],"3932160":[0.76011124200000002,0.77605716499999999],"2432":[0.000102686,0.00011415],"32":[9.4499999999999995e-07,1.0529999999999999e-06],"27":[9.1200000000000001e-07,9.1299999999999998e-07],"409600":[0.025184144999999998,0.025271118999999998]}},{"title":"OrderedSet subtract Self (100% overlap)","results":{"28":[7.2900000000000003e-07,7.9999999999999996e-07],"34":[8.6000000000000002e-07,8.7899999999999997e-07],"29":[6.9299999999999997e-07,8.0800000000000004e-07],"40":[9.7499999999999998e-07,1.127e-06],"17408":[0.000485446,0.00055521399999999962],"1472":[4.6461000000000001e-05,5.0123000000000001e-05],"112":[2.5280000000000002e-06,2.6819999999999999e-06],"1376256":[0.17131011600000001,0.26806973499999998],"5242880":[1.005309556,1.0204096899999999],"36":[8.2399999999999997e-07,1.0070000000000001e-06],"42":[1.063e-06,1.094e-06],"11534336":[2.4371052730000002,2.6004945739999998],"114688":[0.004243990999999999,0.0048562069999999995],"144":[3.3469999999999999e-06,3.9380000000000002e-06],"38":[8.7300000000000005e-07,1.054e-06],"240":[5.2689999999999999e-06,5.5169999999999999e-06],"9216":[0.000257822,0.00031300399999999986],"44":[1.1319999999999999e-06,1.3400000000000001e-06],"1664":[3.8203e-05,4.1270000000000003e-05],"196608":[0.011321855,0.012218351000000001],"155648":[0.0079609879999999987,0.0080033259999999998],"2816":[8.8886000000000002e-05,9.1865000000000002e-05],"50":[1.111e-06,1.1230000000000001e-06],"2359296":[0.33948786399999997,0.41430087599999998],"46":[1.1990000000000001e-06,1.2440000000000001e-06],"176":[4.3980000000000001e-06,5.2469999999999999e-06],"52":[1.2300000000000001e-06,1.251e-06],"272":[6.7780000000000002e-06,7.2309999999999999e-06],"116":[2.553e-06,2.9960000000000002e-06],"47104":[0.001676833,0.0017559470000000001],"6912":[0.00018685800000000003,0.00018744500000000001],"1856":[4.5722e-05,4.6162000000000003e-05],"48":[1.2240000000000001e-06,1.691e-06],"2097152":[0.28015812699999998,0.31061127100000002],"54":[1.277e-06,1.42e-06],"2031616":[0.26252242999999997,0.30694641700000003],"43008":[0.001514652,0.00161652],"60":[1.5009999999999999e-06,1.5340000000000001e-06],"30720":[0.00084064899999999995,0.00094164799999999979],"56":[1.331e-06,1.3990000000000001e-06],"62":[1.4500000000000001e-06,1.542e-06],"58":[1.316e-06,1.4130000000000001e-06],"3014656":[0.56573023700000002,0.67793708400000008],"64":[1.5680000000000001e-06,1.5680000000000001e-06],"8388608":[1.4608384640000001,1.6136702810000001],"29696":[0.00080502600000000003,0.00081852200000000002],"216":[4.8380000000000001e-06,5.1080000000000001e-06],"106496":[0.0038595230000000001,0.0039119250000000001],"72":[1.7010000000000001e-06,1.7320000000000001e-06],"442368":[0.020925862999999996,0.022986925000000005],"147456":[0.0070950500000000003,0.0071573260000000003],"4456448":[0.74258545900000006,0.85943765999999999],"63488":[0.0019292549999999999,0.0020310800000000002],"38912":[0.0011752710000000003,0.0013722210000000003],"68":[1.7129999999999999e-06,1.731e-06],"188416":[0.010318332,0.010450347],"248":[6.2469999999999997e-06,6.3550000000000001e-06],"80":[1.9690000000000001e-06,2.0669999999999999e-06],"2560":[7.4190000000000006e-05,7.8310000000000001e-05],"34816":[0.0010249810000000001,0.0010997859999999999],"3712":[9.1340000000000003e-05,9.1848000000000006e-05],"3538944":[0.50694942199999993,0.52649074500000004],"76":[1.967e-06,2.2180000000000002e-06],"4194304":[0.63481573400000002,0.636352484],"851968":[0.060698633000000002,0.117313793],"4096":[0.000108842,0.000108991],"59392":[0.0017505489999999999,0.0019237220000000003],"84":[1.9740000000000001e-06,2.2069999999999998e-06],"3276800":[0.47078722699999997,0.547366401],"55296":[0.0015923929999999999,0.001667506],"688128":[0.043868314000000005,0.077045440999999992],"8192":[0.00022708100000000002,0.00023748900000000002],"10240":[0.00030634199999999998,0.00033300400000000013],"15872":[0.000437417,0.0004423430000000001],"92":[2.3089999999999998e-06,2.7319999999999998e-06],"26624":[0.00070542899999999993,0.00073776700000000007],"1792":[4.1399000000000001e-05,5.1499000000000003e-05],"11776":[0.000400987,0.000423927],"2944":[9.1143999999999993e-05,9.7418999999999997e-05],"88":[2.3300000000000001e-06,2.401e-06],"22528":[0.00075704199999999998,0.00080986900000000006],"1245184":[0.12847450699999999,0.19129656900000003],"15728640":[2.7203432379999999,3.202557337],"96":[2.6340000000000001e-06,3.1269999999999999e-06],"1984":[5.0024000000000001e-05,5.3508999999999999e-05],"139264":[0.0060515560000000005,0.0062966969999999987],"475136":[0.023614947000000004,0.029301915000000001],"13631488":[2.4305884820000001,2.6248821119999999],"416":[9.7180000000000008e-06,1.0013000000000001e-05],"928":[2.2413999999999999e-05,2.3952999999999999e-05],"512":[1.1929e-05,1.3944999999999999e-05],"18432":[0.00051831200000000016,0.00057799999999999974],"16777216":[3.2268211149999999],"9728":[0.00028324000000000003,0.00030497600000000004],"1769472":[0.24391238700000001,0.28329760599999998],"1703936":[0.20389911899999999,0.20911997399999999],"2048":[5.1539000000000002e-05,5.6165999999999997e-05],"14336":[0.00037322000000000001,0.00038180399999999997],"448":[1.0505e-05,1.2045000000000001e-05],"5505024":[1.0398677199999999,1.062133413],"544":[1.4195e-05,1.4847e-05],"221184":[0.0098004310000000001,0.0099624190000000001],"90112":[0.003536951,0.0037183990000000007],"640":[1.7436999999999999e-05,1.8893999999999999e-05],"12800":[0.000311897,0.000343321],"262144":[0.012206702,0.013083659000000001],"589824":[0.034150452000000012,0.05787971900000001],"884736":[0.069193776999999998,0.12456207900000001],"6144":[0.00020864000000000001,0.00023199600000000002],"1088":[2.7815999999999999e-05,3.0012999999999999e-05],"576":[1.4695000000000001e-05,1.4916000000000001e-05],"160":[3.8800000000000001e-06,4.7400000000000004e-06],"672":[1.9562999999999999e-05,2.1089000000000001e-05],"8912896":[1.5952325439999999,1.709108638],"100":[2.1880000000000001e-06,2.4099999999999998e-06],"507904":[0.025657042999999997,0.039768375000000009],"3840":[9.5540999999999999e-05,0.000105447],"192":[5.4369999999999998e-06,5.9680000000000003e-06],"376832":[0.023256706999999998,0.023334004999999998],"98304":[0.0044272019999999999,0.0046799930000000003],"5376":[0.00016324499999999999,0.00016584999999999999],"94208":[0.0039683119999999999,0.0041203350000000001],"81920":[0.0029604710000000001,0.0031111900000000007],"3407872":[0.49605771799999998,0.67019878799999999],"104":[2.3939999999999999e-06,2.8229999999999999e-06],"122880":[0.0050090109999999998,0.0051898199999999995],"200":[4.6929999999999998e-06,4.7400000000000004e-06],"163840":[0.008085676,0.0081603579999999978],"4063232":[0.62297798100000001,0.70644786299999995],"5767168":[1.2142812489999999,1.2401689469999999],"12582912":[3.0997976839999999,3.1838396449999999],"1600":[3.6730999999999998e-05,3.8365000000000003e-05],"136":[3.3189999999999999e-06,3.5379999999999998e-06],"232":[5.4199999999999998e-06,5.8200000000000002e-06],"7077888":[1.197474833,1.3949210889999999],"86016":[0.0032867770000000003,0.0035099460000000008],"31744":[0.00087475399999999994,0.00092167700000000009],"168":[4.2230000000000001e-06,5.0180000000000001e-06],"622592":[0.037247512999999996,0.052138282999999987],"108":[2.3350000000000001e-06,2.5270000000000001e-06],"327680":[0.017336047000000014,0.018050771],"2176":[5.9871000000000003e-05,6.1828999999999994e-05],"3328":[8.3287000000000004e-05,9.0816000000000006e-05],"1":[1.4399999999999999e-07,1.5300000000000001e-07],"2":[1.72e-07,1.72e-07],"3":[1.7599999999999999e-07,1.91e-07],"4":[1.92e-07,2.0200000000000001e-07],"7424":[0.00018979000000000004,0.000206756],"5":[2.2000000000000001e-07,2.5600000000000002e-07],"23552":[0.0008685269999999998,0.00086969900000000004],"6":[2.4999999999999999e-07,2.5199999999999998e-07],"61440":[0.0018348570000000001,0.001870132],"491520":[0.024543791000000002,0.036404668000000001],"77824":[0.0027810700000000005,0.0028075370000000006],"7":[2.5800000000000001e-07,2.84e-07],"8":[2.7099999999999998e-07,3.0199999999999998e-07],"208":[4.5190000000000003e-06,4.9520000000000002e-06],"9":[3.2300000000000002e-07,3.2899999999999999e-07],"73728":[0.0023848720000000006,0.0026261340000000031],"304":[7.8099999999999998e-06,8.4679999999999992e-06],"400":[9.4099999999999997e-06,9.4290000000000007e-06],"1310720":[0.14327285100000001,0.23236879799999999],"336":[9.3819999999999993e-06,9.5060000000000001e-06],"3670016":[0.547791476,0.69121965699999999],"6656":[0.000162972,0.000167152],"15360":[0.00040488199999999991,0.00044453900000000003],"432":[1.0071000000000001e-05,1.0441e-05],"950272":[0.076031217999999984,0.114175215],"655360":[0.040585411000000002,0.062641373],"69632":[0.0022386999999999997,0.0023060279999999999],"11264":[0.00037040199999999987,0.00039060600000000005],"2752512":[0.43890276900000003,0.51079110699999997],"8126464":[1.53160173,1.6595179660000001],"27648":[0.00073921000000000013,0.0007682050000000001],"368":[1.0736e-05,1.1392e-05],"65536":[0.002097116,0.002171086],"16252928":[2.898110714,3.7909828069999998],"464":[1.1065e-05,1.1508000000000001e-05],"1015808":[0.088819011999999975,0.14085702999999999],"3072":[0.000101425,0.00011036600000000001],"110592":[0.0041072669999999995,0.004562272],"237568":[0.012464438,0.013308971000000003],"278528":[0.013897105999999998,0.015697803999999999],"496":[1.1421e-05,1.2092e-05],"13107200":[2.5343719600000001,2.704868206],"9961472":[1.8850968079999999,1.921223678],"5888":[0.000197911,0.00020820999999999996],"11010048":[2.1863214539999998,2.4533837969999999],"1920":[4.6597000000000001e-05,5.5034000000000002e-05],"2490368":[0.422392408,0.44483937899999998],"19456":[0.00059437300000000004,0.00062273299999999999],"57344":[0.001689117,0.0017385459999999999],"1179648":[0.11470116900000001,0.20789516399999997],"4718592":[0.80438932600000002,0.92466207700000003],"360448":[0.02127737,0.024469222999999998],"1572864":[0.21249286100000001,0.27993975100000001],"53248":[0.001462496,0.0015918950000000001],"3456":[8.7241e-05,9.8510000000000004e-05],"40960":[0.0013344299999999997,0.0013931659999999999],"4608":[0.00013060100000000002,0.000133177],"13824":[0.00037476699999999992,0.00038003599999999994],"819200":[0.058037289000000006,0.10284605099999999],"983040":[0.085049656000000001,0.117026701],"8704":[0.00023976999999999996,0.00028289999999999999],"120":[2.8090000000000001e-06,2.9069999999999999e-06],"1024":[2.6114000000000001e-05,2.7756999999999999e-05],"49152":[0.0018220620000000004,0.00190416],"524288":[0.027586948999999993,0.038998780999999996],"45056":[0.0015424340000000001,0.0016060579999999998],"229376":[0.010407354000000002,0.010729882],"2688":[8.0440999999999998e-05,8.2966000000000005e-05],"152":[3.5250000000000001e-06,4.2139999999999998e-06],"5120":[0.00014994100000000001,0.00015088499999999999],"1507328":[0.19544630499999999,0.30292936100000001],"1216":[3.4595999999999999e-05,3.5840999999999998e-05],"1966080":[0.25677339999999998,0.296269793],"1900544":[0.234206935,0.31456264499999997],"184":[5.3199999999999999e-06,5.4140000000000002e-06],"7936":[0.00020775699999999998,0.00022483800000000005],"3801088":[0.55515439199999994,0.63280139499999999],"6815744":[1.18056878,1.269823097],"124":[3.0489999999999999e-06,3.0750000000000002e-06],"102400":[0.003900766,0.0040303409999999998],"311296":[0.016482978999999991,0.018100379],"1408":[4.3013999999999998e-05,4.5989999999999998e-05],"393216":[0.026110157000000002,0.026694184999999999],"4352":[0.000126458,0.00012661200000000001],"6553600":[1.1034186049999999,1.225910482],"20480":[0.00063934800000000019,0.00069252100000000009],"608":[1.6796999999999999e-05,1.7121000000000001e-05],"2228224":[0.31053214899999998,0.38551100500000002],"36864":[0.001119823,0.001150365],"704":[2.0409999999999999e-05,2.2648999999999999e-05],"720896":[0.050365398000000006,0.080446080999999989],"800":[1.7847e-05,1.9162999999999999e-05],"2621440":[0.39411162999999999,0.46943727800000001],"425984":[0.019401498,0.020389813],"32768":[0.00094518399999999995,0.000947652],"12058624":[2.6286158770000001,2.6418856119999998],"128":[2.858e-06,3.191e-06],"180224":[0.0099728069999999985,0.0099891589999999992],"224":[5.0660000000000003e-06,5.2279999999999998e-06],"736":[2.2877000000000001e-05,2.9034e-05],"320":[8.0870000000000007e-06,8.6430000000000001e-06],"557056":[0.036446753999999998,0.058435380000000002],"832":[1.8056000000000001e-05,2.0880999999999999e-05],"9437184":[1.7410077429999999,2.1683135130000002],"3584":[9.5045999999999998e-05,9.7559000000000006e-05],"6291456":[1.4345870590000001,1.4473453519999999],"256":[6.0449999999999997e-06,7.2790000000000001e-06],"15204352":[2.6242378500000001,3.4671434369999998],"28672":[0.00076470300000000015,0.00080295300000000013],"768":[2.3048e-05,2.711e-05],"212992":[0.0092578230000000018,0.0097864489999999957],"864":[1.9187000000000001e-05,2.1953000000000001e-05],"352":[9.9180000000000006e-06,1.0803e-05],"253952":[0.011834604,0.012152457],"960":[2.2163000000000001e-05,2.3453000000000001e-05],"24576":[0.00087530399999999982,0.0008876820000000001],"7680":[0.00020520299999999999,0.00021761400000000003],"294912":[0.015128347,0.017075669000000009],"1048576":[0.090691938,0.16326062099999999],"10485760":[2.072466709,2.0790521150000001],"344064":[0.019441837,0.019665686999999998],"288":[6.8449999999999997e-06,8.0209999999999999e-06],"1152":[2.9060999999999998e-05,3.0263000000000001e-05],"384":[1.1173e-05,1.1229999999999999e-05],"2304":[5.9038e-05,6.5753999999999994e-05],"896":[2.0492e-05,2.3110000000000001e-05],"480":[1.2016e-05,1.2554999999999999e-05],"1441792":[0.20866618300000001,0.27867076899999998],"992":[2.5516000000000001e-05,2.5732e-05],"3968":[0.000101581,0.000102908],"6400":[0.000155346,0.000160867],"1344":[4.1459999999999999e-05,4.2236e-05],"126976":[0.0051014159999999992,0.0056304699999999985],"2883584":[0.494705636,0.52926527699999992],"753664":[0.054872990999999996,0.093671340000000006],"16384":[0.00044473599999999994,0.00052420900000000009],"131072":[0.0058755939999999996,0.0060579760000000005],"458752":[0.023342750000000002,0.036041384999999995],"172032":[0.0086771480000000008,0.008744389],"12288":[0.000426592,0.00046074900000000004],"14680064":[2.6792205300000003,3.442579399],"1536":[4.7586000000000001e-05,5.5346999999999997e-05],"25600":[0.000637442,0.000662658],"1835008":[0.23195186300000001,0.23560935999999999],"10752":[0.00033039800000000003,0.00034437900000000002],"21504":[0.00069797900000000037,0.00080820000000000002],"7602176":[1.2379534620000001,1.4014696259999999],"5632":[0.00019263900000000001,0.000208657],"10":[3.2300000000000002e-07,3.3700000000000001e-07],"3145728":[0.57426929500000001,0.58305843899999998],"245760":[0.011203591000000002,0.013948792999999998],"1728":[4.1381000000000002e-05,4.2991000000000002e-05],"11":[3.34e-07,3.5400000000000002e-07],"1114112":[0.12556660200000003,0.15472175600000004],"12":[3.65e-07,3.8700000000000001e-07],"7340032":[1.277082257,1.3310797830000001],"7168":[0.00017802199999999996,0.00019758700000000002],"13":[3.77e-07,3.77e-07],"6029312":[1.2854513060000001,1.287234518],"14":[4.4400000000000001e-07,4.6100000000000001e-07],"3200":[7.5723999999999995e-05,7.9765000000000006e-05],"20":[5.0900000000000002e-07,5.8599999999999998e-07],"204800":[0.0093016290000000005,0.010141599999999999],"15":[4.32e-07,4.4400000000000001e-07],"13312":[0.00032467599999999998,0.000359596],"4980736":[0.89834375799999999,0.93469593299999998],"118784":[0.0045704910000000003,0.004720686],"51200":[0.001398809,0.0014744789999999999],"16":[5.13e-07,5.2099999999999997e-07],"21":[5.9100000000000004e-07,5.9999999999999997e-07],"917504":[0.070217179000000032,0.115858172],"22":[5.8500000000000001e-07,6.8800000000000002e-07],"4864":[0.000145869,0.00015977499999999997],"17":[4.7700000000000005e-07,5.3600000000000004e-07],"14848":[0.00041449599999999987,0.000420715],"23":[6.06e-07,6.8500000000000001e-07],"786432":[0.061010867999999996,0.084638541000000012],"18":[4.5200000000000002e-07,5.5300000000000004e-07],"1638400":[0.19355673000000001,0.23781423300000001],"7864320":[1.3362342199999999,1.434698638],"24":[7.0800000000000004e-07,8.0100000000000004e-07],"14155776":[2.6302282180000001,2.877975535],"19":[5.0999999999999999e-07,5.3000000000000001e-07],"30":[7.5000000000000002e-07,7.8299999999999996e-07],"25":[6.9299999999999997e-07,7.0500000000000003e-07],"31":[7.9800000000000003e-07,8.8999999999999995e-07],"1280":[3.5460999999999998e-05,3.9246000000000003e-05],"26":[6.2399999999999998e-07,6.7299999999999995e-07],"3932160":[0.63283020299999992,0.696898401],"2432":[6.4623999999999997e-05,7.2581000000000002e-05],"32":[7.8100000000000002e-07,8.2099999999999995e-07],"27":[7.4399999999999999e-07,7.4900000000000005e-07],"409600":[0.020964996,0.023436284999999998]}},{"title":"OrderedSet formUnion with Array (0% overlap)","results":{"28":[2.9229999999999998e-06,3.2499999999999998e-06],"34":[3.1209999999999998e-06,3.2949999999999998e-06],"29":[2.8449999999999999e-06,3.6940000000000001e-06],"40":[3.4309999999999998e-06,3.6890000000000002e-06],"17408":[0.00174497,0.0020244299999999998],"1472":[0.00013835899999999998,0.000140536],"112":[1.1422e-05,1.1612e-05],"1376256":[0.359316266,0.45818622200000003],"5242880":[1.925050615,2.0063447760000002],"36":[3.2040000000000002e-06,3.4149999999999999e-06],"42":[3.579e-06,3.9600000000000002e-06],"11534336":[4.5358928980000002,4.6546847790000001],"114688":[0.015917905,0.016681315000000002],"144":[1.3162e-05,1.3783e-05],"38":[3.2169999999999999e-06,3.8550000000000004e-06],"240":[2.2492000000000001e-05,2.3309e-05],"9216":[0.00092890399999999982,0.0010318440000000001],"44":[3.8e-06,4.2660000000000003e-06],"1664":[0.00021570899999999999,0.00021681000000000001],"196608":[0.026274031,0.028245024000000001],"155648":[0.020592485000000001,0.021316371000000004],"2816":[0.00024757499999999999,0.00024806300000000008],"50":[5.2070000000000003e-06,5.2249999999999999e-06],"2359296":[0.80334318299999996,0.80785151300000002],"46":[3.9670000000000003e-06,4.0099999999999997e-06],"176":[1.5968e-05,1.6013000000000001e-05],"52":[5.6319999999999996e-06,5.8799999999999996e-06],"272":[2.6801e-05,2.8586999999999999e-05],"116":[1.1433999999999999e-05,1.3335e-05],"47104":[0.004701925,0.0049397779999999997],"6912":[0.00077556999999999995,0.00078529399999999997],"1856":[0.00019512700000000002,0.00020990199999999996],"48":[4.0260000000000001e-06,4.7790000000000003e-06],"2097152":[0.73849922300000004,0.79712736699999998],"54":[5.5720000000000002e-06,6.1079999999999998e-06],"2031616":[0.69292723600000006,0.72569506299999997],"43008":[0.0043402600000000003,0.0049614180000000004],"60":[6.3539999999999996e-06,6.3670000000000002e-06],"30720":[0.003314614,0.003688682],"56":[6.1099999999999999e-06,6.1149999999999999e-06],"62":[6.4779999999999996e-06,7.1049999999999997e-06],"58":[5.7250000000000002e-06,6.003e-06],"3014656":[1.0071289109999999,1.0710445500000001],"64":[6.1539999999999999e-06,6.331e-06],"8388608":[3.6262601449999998,3.7092260389999998],"29696":[0.0033083049999999997,0.0033663619999999999],"216":[2.1387999999999999e-05,2.368e-05],"106496":[0.015606455,0.016384458000000001],"72":[6.7290000000000003e-06,6.9539999999999998e-06],"442368":[0.084719218000000013,0.091921988999999996],"147456":[0.019786246,0.020167049999999999],"4456448":[1.724442815,1.7489955479999999],"63488":[0.0077094600000000013,0.0078284700000000006],"38912":[0.0038890979999999997,0.004310754],"68":[6.6039999999999998e-06,6.7719999999999997e-06],"188416":[0.023838621000000004,0.025231457999999995],"248":[2.5468000000000001e-05,2.5548999999999999e-05],"80":[7.1770000000000001e-06,7.4429999999999997e-06],"2560":[0.000245255,0.000252134],"34816":[0.0036967889999999998,0.0037067629999999996],"3712":[0.000392858,0.00039912500000000001],"3538944":[1.5097030920000001,1.5340879430000001],"76":[6.8809999999999998e-06,8.1419999999999993e-06],"4194304":[1.6728138320000001,1.683396267],"851968":[0.228826207,0.32709145299999998],"4096":[0.00040327699999999995,0.00043516000000000008],"59392":[0.0071824800000000006,0.00802953],"84":[6.968e-06,7.9529999999999999e-06],"3276800":[1.471714561,1.5337305620000001],"55296":[0.0069275059999999982,0.0071126559999999993],"688128":[0.12989570900000003,0.187629509],"8192":[0.00089300800000000004,0.00090738400000000012],"10240":[0.00096008499999999995,0.001030602],"15872":[0.0016424720000000001,0.0017228110000000001],"92":[7.6899999999999992e-06,8.6640000000000004e-06],"26624":[0.0030889159999999997,0.003304371],"1792":[0.000185284,0.000226233],"11776":[0.0010917280000000004,0.001143343],"2944":[0.00025838400000000001,0.00026901999999999997],"88":[8.0649999999999999e-06,8.0779999999999996e-06],"22528":[0.00209223,0.00217045],"1245184":[0.32631297100000001,0.408042338],"15728640":[7.344305265,7.3715186670000001],"96":[7.8930000000000005e-06,9.7189999999999996e-06],"1984":[0.000199089,0.00022779300000000001],"139264":[0.018211159000000001,0.018223342999999999],"475136":[0.089479031000000001,0.109080183],"13631488":[6.9164155210000002,7.0967286649999997],"416":[4.7404000000000002e-05,4.9551e-05],"928":[9.7021000000000005e-05,9.8857999999999994e-05],"512":[5.0457000000000002e-05,5.7898e-05],"18432":[0.0017875999999999996,0.0020310110000000001],"16777216":[7.6054489160000003],"9728":[0.00092316300000000007,0.00094325499999999994],"1769472":[0.64996228900000008,0.68699430800000005],"1703936":[0.62908346800000003,0.65373277799999996],"2048":[0.00019618200000000004,0.00021149999999999996],"14336":[0.0015556420000000001,0.0015623290000000001],"448":[4.6360000000000003e-05,5.3066999999999999e-05],"5505024":[2.0617600139999999,2.0742182250000001],"544":[5.5622999999999999e-05,5.6280000000000003e-05],"221184":[0.036093442000000003,0.037436509999999992],"90112":[0.0099953520000000008,0.010758373],"640":[5.8647000000000003e-05,6.7032000000000005e-05],"12800":[0.0014852979999999999,0.0015754739999999997],"262144":[0.040421758999999988,0.046379825999999992],"589824":[0.110392449,0.165664433],"884736":[0.235654167,0.34012520400000001],"6144":[0.00057031399999999993,0.00059776399999999998],"1088":[0.000102574,0.00011693599999999999],"576":[5.5541000000000002e-05,5.6508000000000002e-05],"160":[1.3832000000000001e-05,1.6198999999999999e-05],"672":[6.0235999999999997e-05,6.1796000000000003e-05],"8912896":[3.7764420080000001,3.8131070149999999],"100":[1.0434999999999999e-05,1.0978000000000001e-05],"507904":[0.095211381999999983,0.116713357],"3840":[0.000408754,0.00041982600000000004],"192":[1.7011999999999999e-05,1.7266e-05],"376832":[0.055891324000000006,0.058004447000000001],"98304":[0.012040307,0.01226788],"5376":[0.00048364300000000002,0.00055960100000000007],"94208":[0.010575711,0.011098213000000001],"81920":[0.0092466810000000014,0.0098772210000000003],"3407872":[1.4956645909999999,1.5261195700000001],"104":[1.0862999999999999e-05,1.2336e-05],"122880":[0.016886590999999999,0.018480690000000001],"200":[2.0520999999999999e-05,2.2904999999999998e-05],"163840":[0.021707477999999999,0.022011764999999999],"4063232":[1.6382686899999999,1.646173544],"5767168":[2.1719956489999999,2.178546388],"12582912":[5.0639029459999998,5.1778902379999998],"1600":[0.00018065799999999999,0.000187534],"136":[1.3227000000000001e-05,1.3643e-05],"232":[2.4219999999999999e-05,2.4796000000000001e-05],"7077888":[3.2881236879999998,3.4538815989999998],"86016":[0.0096368489999999994,0.011117181],"31744":[0.0034379239999999998,0.0035260559999999996],"168":[1.5741999999999999e-05,1.6895e-05],"622592":[0.11986893699999999,0.15346426099999999],"108":[1.0417e-05,1.1326e-05],"327680":[0.047175971999999997,0.049186805],"2176":[0.00022956100000000001,0.00023021199999999998],"3328":[0.00036171400000000007,0.00038594999999999998],"1":[1.7599999999999999e-07,1.8400000000000001e-07],"2":[2.6100000000000002e-07,2.6899999999999999e-07],"3":[3.4900000000000001e-07,3.9900000000000001e-07],"4":[2.9400000000000001e-07,3.0800000000000001e-07],"7424":[0.000795632,0.00085429600000000005],"5":[4.5999999999999999e-07,5.3600000000000004e-07],"23552":[0.0021340780000000002,0.0022540170000000001],"6":[4.2500000000000001e-07,4.8100000000000003e-07],"61440":[0.0074241399999999983,0.0083152499999999997],"491520":[0.091194640000000007,0.12224477],"77824":[0.0091207579999999979,0.009309801999999999],"7":[5.4300000000000003e-07,5.9599999999999999e-07],"8":[5.4099999999999999e-07,5.44e-07],"208":[2.1492999999999999e-05,2.3121000000000001e-05],"9":[6.8599999999999998e-07,7.0299999999999998e-07],"73728":[0.0083585400000000011,0.0093056849999999993],"304":[2.8328000000000001e-05,2.9006e-05],"400":[4.6487999999999999e-05,4.9981000000000001e-05],"1310720":[0.34203732099999995,0.44447716900000001],"336":[3.1143999999999999e-05,3.4409999999999998e-05],"3670016":[1.546324853,1.579118789],"6656":[0.00072492699999999999,0.00078521299999999988],"15360":[0.001627566,0.0016607549999999994],"432":[4.7459000000000001e-05,4.7707000000000002e-05],"950272":[0.24897031999999997,0.32873992200000002],"655360":[0.12743523700000001,0.16686440299999999],"69632":[0.0081074029999999957,0.0085963299999999992],"11264":[0.0010522560000000003,0.0011038689999999999],"2752512":[0.88767575600000004,0.94436903800000005],"8126464":[3.5199992369999999,3.5852475749999999],"27648":[0.003157942,0.003335626],"368":[3.2428000000000002e-05,3.5315000000000003e-05],"65536":[0.0077477810000000005,0.0081244669999999998],"16252928":[7.4277123639999996,7.4489302640000004],"464":[4.8102999999999997e-05,5.1229e-05],"1015808":[0.268089774,0.37157120899999996],"3072":[0.00027280700000000002,0.00029208000000000001],"110592":[0.015543672,0.017100461000000004],"237568":[0.038116349000000001,0.041706452999999991],"278528":[0.043020969000000006,0.045531343000000002],"496":[4.9842999999999997e-05,5.482e-05],"13107200":[6.8309278979999997,6.9337083079999999],"9961472":[4.005560569,4.0266103810000002],"5888":[0.00055783000000000004,0.00057343500000000007],"11010048":[4.3552382060000001,4.4677480909999998],"1920":[0.000193959,0.00020848400000000002],"2490368":[0.82738863699999998,0.83738449000000004],"19456":[0.001869644,0.0019121989999999998],"57344":[0.006951652,0.007165664999999999],"1179648":[0.30209464399999997,0.409895012],"4718592":[1.8148214309999999,1.85607145],"360448":[0.052372224999999994,0.060460039],"1572864":[0.43204337299999995,0.46117998400000004],"53248":[0.0066432550000000007,0.0074195390000000002],"3456":[0.00038851199999999998,0.00040185999999999998],"40960":[0.004079165,0.0042631779999999994],"4608":[0.00043252899999999996,0.00047009499999999996],"13824":[0.001541536,0.001626408],"819200":[0.230231143,0.30513300599999998],"983040":[0.252297995,0.340685197],"8704":[0.000896352,0.0010069339999999999],"120":[1.1663e-05,1.1683e-05],"1024":[0.00010076,0.00010527899999999998],"49152":[0.0048568439999999999,0.0053549519999999996],"524288":[0.100365446,0.132359802],"45056":[0.0044425789999999995,0.0045411089999999998],"229376":[0.037802941,0.038412097000000027],"2688":[0.00023855799999999999,0.000269053],"152":[1.3563e-05,1.4633e-05],"5120":[0.00049158700000000004,0.00049210999999999992],"1507328":[0.41210539000000002,0.50740705600000002],"1216":[0.000110919,0.00012794999999999999],"1966080":[0.66562298099999995,0.70479016799999994],"1900544":[0.68037811400000003,0.69819842300000001],"184":[1.5749000000000001e-05,1.6475999999999999e-05],"7936":[0.00079461800000000008,0.00083298599999999997],"3801088":[1.5709355280000001,1.582756799],"6815744":[3.3183327309999999,3.4362228859999999],"124":[1.2498e-05,1.2744e-05],"102400":[0.015277017,0.015939127000000001],"311296":[0.046527742000000004,0.048052990999999989],"1408":[0.000121291,0.000138109],"393216":[0.059038122000000005,0.062469303000000011],"4352":[0.000471922,0.00047292899999999997],"6553600":[3.247310073,3.3582848649999999],"20480":[0.0019164010000000003,0.0020081359999999998],"608":[5.9791999999999999e-05,6.1694999999999998e-05],"2228224":[0.76814798299999998,0.76819019300000002],"36864":[0.0038231290000000002,0.0039187830000000003],"704":[6.5357000000000005e-05,6.5783000000000004e-05],"720896":[0.141884176,0.19616672399999999],"800":[8.9868000000000001e-05,9.3169000000000002e-05],"2621440":[0.85898054400000001,0.88500804199999994],"425984":[0.085880669000000007,0.099857635],"32768":[0.003521658,0.0035753849999999995],"12058624":[4.7657043579999998,4.8052491880000003],"128":[1.1270999999999999e-05,1.2862e-05],"180224":[0.022877137000000002,0.023826347000000001],"224":[2.2183000000000001e-05,2.2322000000000001e-05],"736":[6.7843999999999996e-05,7.6067000000000002e-05],"320":[2.8721000000000002e-05,3.0224999999999999e-05],"557056":[0.102779852,0.14816136099999999],"832":[9.6902000000000002e-05,0.00010605199999999999],"9437184":[3.9393928969999998,4.0959230130000002],"3584":[0.00037362300000000001,0.00043349800000000004],"6291456":[2.4092675809999999,2.4835860790000002],"256":[2.4803999999999998e-05,2.8143000000000001e-05],"15204352":[7.1954039779999999,7.3650020099999995],"28672":[0.0031936500000000001,0.0033694949999999993],"768":[6.5269000000000001e-05,7.8310000000000001e-05],"212992":[0.034934448,0.038467071000000005],"864":[9.3592999999999997e-05,9.7754e-05],"352":[3.2780000000000001e-05,3.2879000000000001e-05],"253952":[0.039765226000000001,0.040730023000000004],"960":[9.7021000000000005e-05,9.9036000000000005e-05],"24576":[0.0022440469999999999,0.0022698470000000006],"7680":[0.00078633299999999985,0.00087563500000000015],"294912":[0.044126463999999997,0.046256169],"1048576":[0.27219818400000001,0.349620826],"10485760":[4.1600253509999998,4.233599313],"344064":[0.052753881999999995,0.053492685000000005],"288":[2.6378000000000001e-05,3.0159e-05],"1152":[0.00010377699999999999,0.000107378],"384":[3.2818000000000003e-05,3.4643e-05],"2304":[0.00023638399999999999,0.000237495],"896":[9.8725000000000001e-05,0.000102598],"480":[5.1644999999999998e-05,5.5139999999999997e-05],"1441792":[0.38722507699999997,0.47466463599999997],"992":[0.000106196,0.000106617],"3968":[0.00039985800000000001,0.00040709000000000003],"6400":[0.00073533300000000002,0.00075824400000000004],"1344":[0.000117723,0.000118399],"126976":[0.017137792999999995,0.019254460000000001],"2883584":[0.955863668,0.98796335400000002],"753664":[0.14909225500000001,0.20773332799999999],"16384":[0.0016842820000000001,0.0017758470000000001],"131072":[0.017972738999999998,0.019081652999999997],"458752":[0.087775240999999976,0.12186683],"172032":[0.021638675,0.023162215999999996],"12288":[0.0011524879999999999,0.001199383],"14680064":[7.1360140430000003,7.7335084319999998],"1536":[0.00014160599999999999,0.000156303],"25600":[0.0030427130000000003,0.0031528939999999998],"1835008":[0.66509945599999998,0.67149287199999996],"10752":[0.0010237760000000001,0.001027804],"21504":[0.001970706,0.0020742439999999994],"7602176":[3.3766074050000001,3.4580989559999997],"5632":[0.00055366000000000009,0.00059354299999999998],"10":[6.3799999999999997e-07,6.4099999999999998e-07],"3145728":[1.0611602440000001,1.0892419419999999],"245760":[0.03782249,0.050562629999999997],"1728":[0.000180743,0.00020226700000000003],"11":[8.4600000000000003e-07,8.5300000000000003e-07],"1114112":[0.29617752200000003,0.36656887100000002],"12":[7.9999999999999996e-07,9.2800000000000005e-07],"7340032":[3.3686362050000001,3.4296757209999997],"7168":[0.00074852800000000015,0.00083404500000000006],"13":[1.579e-06,1.818e-06],"6029312":[2.2530644909999999,2.2825334530000001],"14":[1.7370000000000001e-06,1.7600000000000001e-06],"3200":[0.000354562,0.000382226],"20":[1.745e-06,2.0480000000000001e-06],"204800":[0.034942463999999999,0.038185115000000006],"15":[1.812e-06,1.9039999999999999e-06],"13312":[0.001529157,0.001575477],"4980736":[1.878468582,1.912010889],"118784":[0.016410859,0.017972449000000001],"51200":[0.006539497,0.0070550409999999997],"16":[1.889e-06,1.99e-06],"21":[2.2189999999999998e-06,2.3309999999999998e-06],"917504":[0.24502211500000001,0.32540981800000002],"22":[1.95e-06,1.9980000000000002e-06],"4864":[0.00048970700000000003,0.00049709100000000007],"17":[1.849e-06,2.2970000000000002e-06],"14848":[0.0015800160000000001,0.001676238],"23":[2.1509999999999998e-06,2.475e-06],"786432":[0.15974793399999998,0.21127874299999999],"18":[1.6470000000000001e-06,1.8679999999999999e-06],"1638400":[0.62768922599999999,0.65378929900000005],"7864320":[3.4388388050000001,3.47917838],"24":[2.0190000000000001e-06,2.2869999999999999e-06],"14155776":[6.986782442,7.1398948930000001],"19":[1.9609999999999999e-06,2.0310000000000001e-06],"30":[2.824e-06,2.9790000000000002e-06],"25":[3.021e-06,3.4800000000000001e-06],"31":[3.1860000000000001e-06,3.5310000000000002e-06],"1280":[0.00012240599999999998,0.000128357],"26":[2.6560000000000001e-06,2.903e-06],"3932160":[1.5958646380000001,1.6231644039999999],"2432":[0.000226338,0.00024637899999999997],"32":[3.1240000000000001e-06,3.196e-06],"27":[2.9129999999999999e-06,3.1719999999999999e-06],"409600":[0.082368336,0.093270821000000004]}},{"title":"OrderedSet formUnion with Array (25% overlap)","results":{"28":[2.6649999999999999e-06,3.0879999999999999e-06],"34":[2.7319999999999998e-06,2.8499999999999998e-06],"29":[2.5239999999999999e-06,3.0469999999999998e-06],"40":[3.0759999999999999e-06,3.2550000000000002e-06],"17408":[0.0016315030000000001,0.001714377],"1472":[0.00012352700000000001,0.00013672200000000001],"112":[1.0417999999999999e-05,1.0577999999999999e-05],"1376256":[0.32882631200000001,0.43284714200000002],"5242880":[1.828375423,1.8387094070000001],"36":[2.8399999999999999e-06,2.9670000000000001e-06],"42":[3.0989999999999999e-06,3.32e-06],"11534336":[4.1604729970000003,4.2471055209999999],"114688":[0.015367146,0.015797689],"144":[1.1600000000000001e-05,1.2357e-05],"38":[2.8830000000000002e-06,3.3900000000000002e-06],"240":[2.0610000000000001e-05,2.0701000000000001e-05],"9216":[0.00084381799999999998,0.00095083100000000029],"44":[3.2969999999999999e-06,3.9439999999999998e-06],"1664":[9.6576999999999994e-05,9.9343000000000001e-05],"196608":[0.022458276000000003,0.024477296000000003],"155648":[0.018563758,0.019951112],"2816":[0.00021842300000000001,0.00022000599999999997],"50":[2.3319999999999999e-06,2.4980000000000001e-06],"2359296":[0.75269004900000003,0.75917510700000002],"46":[3.3579999999999999e-06,3.6710000000000001e-06],"176":[1.3549e-05,1.3951000000000001e-05],"52":[2.6180000000000002e-06,2.8700000000000001e-06],"272":[2.3862999999999998e-05,2.4862e-05],"116":[1.0258000000000001e-05,1.2029e-05],"47104":[0.004078089,0.0042255880000000006],"6912":[0.00038759999999999999,0.00038895600000000003],"1856":[0.000171681,0.00019041199999999999],"48":[3.405e-06,3.8029999999999998e-06],"2097152":[0.70710404999999998,0.75732197199999995],"54":[2.6309999999999999e-06,3.0800000000000002e-06],"2031616":[0.66040025599999996,0.68370512100000003],"43008":[0.0038613020000000014,0.004180858],"60":[5.7690000000000002e-06,5.8379999999999998e-06],"30720":[0.003053016,0.003316318],"56":[5.0300000000000001e-06,5.66e-06],"62":[5.575e-06,5.8719999999999999e-06],"58":[5.2220000000000001e-06,5.2959999999999998e-06],"3014656":[0.91957345199999996,0.95220837299999994],"64":[5.694e-06,5.7030000000000003e-06],"8388608":[3.5130722510000001,3.5554195919999998],"29696":[0.0030451799999999993,0.0033198720000000002],"216":[1.0669999999999999e-05,1.1541e-05],"106496":[0.007723972,0.0082238980000000021],"72":[5.733e-06,5.9050000000000002e-06],"442368":[0.044901432999999998,0.049897872000000003],"147456":[0.017801996,0.018471627000000001],"4456448":[1.6620108949999999,1.7127665329999999],"63488":[0.0069179020000000009,0.0070671680000000004],"38912":[0.0036649580000000003,0.0038854290000000006],"68":[5.9200000000000001e-06,6.1550000000000004e-06],"188416":[0.021270739,0.022332097000000006],"248":[2.1716999999999999e-05,2.3221999999999999e-05],"80":[6.438e-06,6.4529999999999999e-06],"2560":[0.000224243,0.00022791400000000001],"34816":[0.0032533340000000001,0.0034297110000000007],"3712":[0.00036211199999999999,0.00037941799999999996],"3538944":[0.80248021400000003,0.83539903199999999],"76":[6.302e-06,7.559e-06],"4194304":[1.5993896909999998,1.599966746],"851968":[0.121050237,0.15699018300000001],"4096":[0.000370021,0.00037861400000000004],"59392":[0.0067008990000000015,0.007350296000000001],"84":[6.1179999999999997e-06,6.5440000000000004e-06],"3276800":[0.68279780899999998,0.68825190800000002],"55296":[0.0035245760000000002,0.0036140009999999995],"688128":[0.109790048,0.15779077399999999],"8192":[0.0008032419999999998,0.00082861400000000009],"10240":[0.00086808699999999981,0.000886498],"15872":[0.001524659,0.001586212],"92":[7.0140000000000001e-06,7.9820000000000008e-06],"26624":[0.00145798,0.0014744879999999999],"1792":[0.00018244299999999996,0.00021128800000000001],"11776":[0.00097119699999999982,0.0010089159999999999],"2944":[0.00024886400000000001,0.00026967400000000007],"88":[7.0820000000000001e-06,7.0899999999999999e-06],"22528":[0.001858338,0.0020149650000000001],"1245184":[0.29083254400000003,0.37818994700000003],"15728640":[7.1022240249999999,7.1160870789999997],"96":[6.917e-06,6.9360000000000002e-06],"1984":[0.000186095,0.000199345],"139264":[0.016557239999999997,0.017306472],"475136":[0.082283913000000056,0.10478399400000001],"13631488":[3.4384814050000001,3.4892929060000002],"416":[2.2436999999999999e-05,2.3666e-05],"928":[8.8572000000000005e-05,9.0441999999999999e-05],"512":[4.6415999999999997e-05,5.2386000000000003e-05],"18432":[0.0016296680000000001,0.0017372360000000001],"16777216":[7.3247309889999999],"9728":[0.00083589699999999983,0.0008592980000000002],"1769472":[0.35747838399999998,0.37210878600000002],"1703936":[0.32178141199999999,0.33366630600000002],"2048":[0.000184014,0.000190469],"14336":[0.0014557610000000003,0.001456251],"448":[4.2879000000000001e-05,4.8384000000000003e-05],"5505024":[1.930848865,1.9395769409999999],"544":[5.0547000000000002e-05,5.0597999999999999e-05],"221184":[0.018586854999999999,0.019856319000000001],"90112":[0.0088826250000000016,0.009493548000000001],"640":[5.2318000000000003e-05,5.9721e-05],"12800":[0.00068825500000000014,0.00068874400000000003],"262144":[0.03785469100000001,0.042653351999999999],"589824":[0.096916715000000001,0.148874073],"884736":[0.131544314,0.17476918200000002],"6144":[0.00048055199999999998,0.00049519199999999998],"1088":[9.7345999999999999e-05,0.000110219],"576":[4.9602999999999999e-05,5.0473000000000003e-05],"160":[1.2146e-05,1.4535999999999999e-05],"672":[5.4925e-05,5.5943999999999998e-05],"8912896":[3.601419784,3.6499884919999999],"100":[4.6720000000000003e-06,5.1970000000000004e-06],"507904":[0.086639093,0.107179471],"3840":[0.00036266199999999998,0.00038968199999999997],"192":[1.4397e-05,1.4986e-05],"376832":[0.04880141100000001,0.049466970999999998],"98304":[0.0099937169999999992,0.010233256],"5376":[0.000437844,0.00049525699999999992],"94208":[0.0090416919999999987,0.0097636119999999979],"81920":[0.0081819980000000011,0.0086232339999999987],"3407872":[0.74731520500000004,0.75603583500000004],"104":[4.8890000000000001e-06,5.524e-06],"122880":[0.015691510999999998,0.016732217000000001],"200":[9.1209999999999996e-06,1.0487e-05],"163840":[0.018998330000000001,0.020013038],"4063232":[1.5758058049999999,1.5849554459999999],"5767168":[1.974714399,2.0071791499999998],"12582912":[4.4182933340000003,4.550834858],"1600":[7.8071000000000005e-05,8.9355000000000001e-05],"136":[1.1573000000000001e-05,1.1837e-05],"232":[2.1608999999999999e-05,2.2038000000000001e-05],"7077888":[1.6959268619999999,1.8119227840000001],"86016":[0.0084257350000000002,0.0095055819999999985],"31744":[0.0031259109999999999,0.0032714140000000003],"168":[1.3518e-05,1.4951e-05],"622592":[0.10395212199999999,0.13142171699999999],"108":[4.9019999999999998e-06,5.3140000000000003e-06],"327680":[0.043846323999999992,0.044079279000000006],"2176":[0.000192728,0.00020311299999999999],"3328":[0.00017433299999999999,0.000183244],"1":[8.2000000000000006e-08,8.6000000000000002e-08],"2":[2.3099999999999999e-07,2.3799999999999999e-07],"3":[3.3799999999999998e-07,3.58e-07],"4":[2.7000000000000001e-07,2.8099999999999999e-07],"7424":[0.00073802199999999996,0.00075668999999999997],"5":[4.0499999999999999e-07,4.6499999999999999e-07],"23552":[0.0019006139999999997,0.0020156420000000006],"6":[3.7300000000000002e-07,3.7500000000000001e-07],"61440":[0.0067755549999999999,0.0074962299999999996],"491520":[0.087463350999999995,0.108629826],"77824":[0.0079164830000000002,0.0081271609999999991],"7":[4.9800000000000004e-07,5.3200000000000005e-07],"8":[4.4099999999999999e-07,4.6600000000000002e-07],"208":[1.0584999999999999e-05,1.1469e-05],"9":[5.8400000000000004e-07,6.0999999999999998e-07],"73728":[0.0077157999999999992,0.008434599000000001],"304":[2.4746999999999999e-05,2.5282999999999998e-05],"400":[2.0397000000000001e-05,2.1637e-05],"1310720":[0.30369344599999998,0.40994797799999999],"336":[2.7107999999999999e-05,2.8496e-05],"3670016":[1.4982665100000001,1.512419607],"6656":[0.00036754599999999995,0.000377275],"15360":[0.001522919,0.0015330369999999999],"432":[2.2319000000000001e-05,2.3856999999999999e-05],"950272":[0.23507070699999999,0.31362228399999997],"655360":[0.110336016,0.141940602],"69632":[0.0074556910000000004,0.0077650180000000003],"11264":[0.0009353810000000001,0.00099034099999999983],"2752512":[0.85173105999999998,0.86227413600000002],"8126464":[3.402985352,3.4449877529999999],"27648":[0.001567833,0.0015996489999999999],"368":[2.7673000000000001e-05,2.9609000000000001e-05],"65536":[0.0070785650000000002,0.0072836860000000002],"16252928":[7.1913096049999998,7.207984519],"464":[4.3506e-05,4.6761999999999997e-05],"1015808":[0.24194991800000001,0.33145998399999999],"3072":[0.000238044,0.00024422699999999996],"110592":[0.0080739680000000008,0.0084737279999999981],"237568":[0.035664017999999999,0.037860705000000001],"278528":[0.039642162999999994,0.041281487999999998],"496":[4.5289e-05,5.0241000000000002e-05],"13107200":[3.15907662,3.3005023539999998],"9961472":[3.7491053120000002,3.8400392750000001],"5888":[0.00047953900000000007,0.00048627999999999996],"11010048":[3.9954687309999999,4.1468402409999996],"1920":[0.000191874,0.00019451000000000003],"2490368":[0.773474722,0.83381206600000002],"19456":[0.001688482,0.0017169469999999999],"57344":[0.0065086110000000001,0.0066342149999999989],"1179648":[0.27921393000000005,0.37217830200000002],"4718592":[1.7067487969999999,1.760926475],"360448":[0.047355352000000003,0.052856249000000001],"1572864":[0.35438830600000004,0.36269887499999998],"53248":[0.0032135309999999995,0.003397672],"3456":[0.00019062499999999998,0.00021697099999999997],"40960":[0.0036390279999999999,0.0038560169999999998],"4608":[0.00039163699999999996,0.000431285],"13824":[0.00078142999999999995,0.00080114800000000012],"819200":[0.110200496,0.15527272299999995],"983040":[0.23062049699999998,0.34076345699999999],"8704":[0.00078427200000000014,0.00092032399999999982],"120":[1.0498e-05,1.0545e-05],"1024":[8.7955999999999996e-05,9.7200000000000004e-05],"49152":[0.0042246819999999996,0.0044952659999999995],"524288":[0.089007934000000011,0.123629604],"45056":[0.0040557949999999992,0.0041051509999999996],"229376":[0.035200267,0.037041104000000005],"2688":[0.00021692899999999998,0.00024751299999999999],"152":[1.2159e-05,1.3191e-05],"5120":[0.000418212,0.00042517900000000003],"1507328":[0.35740109499999995,0.442276746],"1216":[0.00010259599999999998,0.000107834],"1966080":[0.64508890699999999,0.66947761400000005],"1900544":[0.63304636999999997,0.66195799499999997],"184":[1.4457999999999999e-05,1.45e-05],"7936":[0.00076201100000000016,0.00080286099999999998],"3801088":[1.5217041500000001,1.533543036],"6815744":[1.6151676749999999,1.6783624800000001],"124":[1.1151e-05,1.1377e-05],"102400":[0.0071530830000000002,0.0078059010000000014],"311296":[0.042937745999999999,0.042940078],"1408":[0.000111082,0.000116929],"393216":[0.052638232,0.053554752999999997],"4352":[0.00040583900000000012,0.0004256629999999999],"6553600":[1.478401184,1.5443167360000001],"20480":[0.0017836599999999998,0.00186338],"608":[5.3272000000000001e-05,5.4926000000000002e-05],"2228224":[0.72271607999999998,0.73780493000000003],"36864":[0.0035277020000000006,0.003611483],"704":[5.4895999999999998e-05,5.7042e-05],"720896":[0.12162583199999999,0.17298301799999999],"800":[4.0945000000000002e-05,4.227e-05],"2621440":[0.81205706200000005,0.82369813800000002],"425984":[0.042104565999999989,0.049839215000000006],"32768":[0.0031094579999999994,0.0033485250000000002],"12058624":[4.2955596030000001,4.3965117219999996],"128":[1.0094e-05,1.1321999999999999e-05],"180224":[0.020411901,0.021367017999999998],"224":[1.9392e-05,2.1894000000000001e-05],"736":[5.4172999999999998e-05,6.6537000000000003e-05],"320":[2.5326000000000001e-05,2.5670999999999999e-05],"557056":[0.090987029000000011,0.14025034],"832":[4.6505999999999998e-05,5.2261e-05],"9437184":[3.7214548199999999,3.7367194709999998],"3584":[0.000346461,0.00037657200000000004],"6291456":[2.0982961819999999,2.1197613899999999],"256":[2.2464e-05,2.5287999999999999e-05],"15204352":[7.0342228359999996,7.0674913100000003],"28672":[0.0029502770000000003,0.0032646809999999993],"768":[5.7197999999999997e-05,6.2071999999999998e-05],"212992":[0.017605795,0.023292222000000001],"864":[4.6499999999999999e-05,4.6526000000000001e-05],"352":[2.8076999999999999e-05,2.8861e-05],"253952":[0.036691428000000005,0.038536044000000005],"960":[9.4897999999999998e-05,9.7004999999999997e-05],"24576":[0.0019625179999999999,0.0019640980000000001],"7680":[0.00074985300000000009,0.00077768400000000006],"294912":[0.041315454999999994,0.041788646999999998],"1048576":[0.25108443400000002,0.32525839000000001],"10485760":[3.9010007020000002,3.967262957],"344064":[0.047005168999999972,0.047128693000000006],"288":[2.3481000000000001e-05,2.6614e-05],"1152":[9.5394000000000002e-05,0.000101458],"384":[2.7477000000000001e-05,2.9187e-05],"2304":[0.000197476,0.00021543200000000005],"896":[9.1354000000000007e-05,0.000101183],"480":[4.2527000000000001e-05,4.9481999999999998e-05],"1441792":[0.34070687799999999,0.43464385500000002],"992":[9.7329000000000003e-05,9.7645000000000004e-05],"3968":[0.00036538400000000006,0.00039192199999999995],"6400":[0.00032728099999999996,0.00034423400000000007],"1344":[0.00010498800000000001,0.00010543399999999999],"126976":[0.015646501999999958,0.016489642999999991],"2883584":[0.87907622900000004,0.90029936399999999],"753664":[0.12637089099999999,0.179246301],"16384":[0.001569204,0.001669926],"131072":[0.016352137999999999,0.017328548999999999],"458752":[0.081202079999999996,0.11528142600000001],"172032":[0.019357241000000004,0.020288924999999999],"12288":[0.00099834199999999972,0.001048256],"14680064":[6.914844585,8.8628195880000007],"1536":[0.000117726,0.00012489900000000001],"25600":[0.001383663,0.001418721],"1835008":[0.64042384900000004,0.70061354499999995],"10752":[0.0009418889999999999,0.00095568699999999988],"21504":[0.001796141,0.001918302],"7602176":[3.2917375720000002,3.3148704169999998],"5632":[0.00045344499999999997,0.00053033599999999996],"10":[5.5000000000000003e-07,5.99e-07],"3145728":[0.928078717,0.97785159399999999],"245760":[0.035117196000000017,0.037290538999999998],"1728":[9.3036999999999997e-05,0.000100009],"11":[6.6300000000000005e-07,6.6400000000000002e-07],"1114112":[0.25936260300000002,0.36547911700000002],"12":[5.8699999999999995e-07,7.5300000000000003e-07],"7340032":[3.2328211969999998,3.3096557390000001],"7168":[0.000713566,0.00083228000000000002],"13":[7.7700000000000004e-07,9.0999999999999997e-07],"6029312":[2.05258692,2.062340136],"14":[7.8599999999999997e-07,9.47e-07],"3200":[0.000167548,0.00018818599999999996],"20":[1.53e-06,1.7460000000000001e-06],"204800":[0.016400973000000003,0.017948889000000003],"15":[1.5239999999999999e-06,1.6309999999999999e-06],"13312":[0.000712478,0.00074705799999999999],"4980736":[1.783519512,1.7860765709999999],"118784":[0.015239701999999999,0.017449091999999996],"51200":[0.0030913469999999999,0.0031494179999999997],"16":[1.663e-06,1.7090000000000001e-06],"21":[2.0020000000000001e-06,2.2419999999999999e-06],"917504":[0.232827746,0.31369740899999998],"22":[1.6899999999999999e-06,1.9099999999999999e-06],"4864":[0.00042048500000000006,0.000442058],"17":[1.702e-06,1.8300000000000001e-06],"14848":[0.0015083710000000001,0.0015609529999999999],"23":[1.8899999999999999e-06,2.0980000000000001e-06],"786432":[0.130680464,0.16786391000000001],"18":[1.545e-06,1.699e-06],"1638400":[0.298144042,0.30977740600000003],"7864320":[3.3357266729999999,3.3890234860000001],"24":[1.869e-06,2.0880000000000002e-06],"14155776":[3.7236523940000001,3.8343060410000001],"19":[1.725e-06,1.8759999999999999e-06],"30":[2.5689999999999999e-06,2.9040000000000001e-06],"25":[1.265e-06,1.3570000000000001e-06],"31":[2.9349999999999999e-06,3.3869999999999999e-06],"1280":[0.00010493299999999998,0.00011348],"26":[1.2550000000000001e-06,1.4500000000000001e-06],"3932160":[1.548574685,1.5584163],"2432":[0.00020199500000000003,0.00022286499999999999],"32":[2.7499999999999999e-06,2.7769999999999998e-06],"27":[1.5600000000000001e-06,1.5880000000000001e-06],"409600":[0.038691051999999997,0.043743847999999995]}},{"title":"OrderedSet formUnion with Array (50% overlap)","results":{"28":[1.207e-06,1.362e-06],"34":[2.5210000000000001e-06,2.841e-06],"29":[1.2079999999999999e-06,1.548e-06],"40":[2.605e-06,2.8389999999999998e-06],"17408":[0.0015220780000000001,0.001677025],"1472":[0.000101502,0.000113831],"112":[4.3259999999999997e-06,4.5379999999999996e-06],"1376256":[0.292265993,0.41763383900000001],"5242880":[1.7641535670000001,1.7800310159999999],"36":[2.548e-06,3.0529999999999998e-06],"42":[2.7659999999999999e-06,3.174e-06],"11534336":[3.9435432970000002,3.9978323740000001],"114688":[0.0068685169999999993,0.0069597980000000014],"144":[1.046e-05,1.1029000000000001e-05],"38":[2.525e-06,3.0089999999999999e-06],"240":[9.4020000000000008e-06,9.4290000000000007e-06],"9216":[0.00077683500000000003,0.00086632799999999987],"44":[2.9859999999999999e-06,3.4450000000000001e-06],"1664":[7.1816000000000005e-05,7.3159999999999997e-05],"196608":[0.021244289,0.021851086999999998],"155648":[0.016965681,0.018074069000000002],"2816":[0.000199299,0.000218154],"50":[1.8309999999999999e-06,1.934e-06],"2359296":[0.72648292599999997,0.72848032399999996],"46":[2.9469999999999999e-06,3.4309999999999998e-06],"176":[1.1676e-05,1.1748e-05],"52":[2.1119999999999999e-06,2.2189999999999998e-06],"272":[2.0750999999999998e-05,2.2892999999999999e-05],"116":[4.51e-06,5.3430000000000003e-06],"47104":[0.0036437430000000001,0.0038359099999999992],"6912":[0.00028811400000000001,0.00031368500000000002],"1856":[7.6310999999999995e-05,8.3331999999999994e-05],"48":[2.9220000000000001e-06,3.4070000000000002e-06],"2097152":[0.41297780900000003,0.41502020100000003],"54":[2.2060000000000001e-06,2.4549999999999998e-06],"2031616":[0.35365679699999997,0.37416382500000001],"43008":[0.0034945669999999996,0.0038963510000000002],"60":[2.553e-06,2.8700000000000001e-06],"30720":[0.0014113629999999997,0.0015161560000000001],"56":[2.142e-06,2.5959999999999998e-06],"62":[2.5330000000000001e-06,2.8439999999999998e-06],"58":[2.384e-06,2.4830000000000002e-06],"3014656":[0.83316109299999996,0.88463152499999997],"64":[2.8049999999999998e-06,2.9079999999999999e-06],"8388608":[1.9197412330000001,1.9467103020000001],"29696":[0.001322855,0.0014008760000000001],"216":[7.7719999999999994e-06,8.8130000000000002e-06],"106496":[0.0061654230000000015,0.006289336999999999],"72":[5.293e-06,5.3580000000000002e-06],"442368":[0.035723552000000006,0.036697531000000005],"147456":[0.016402740000000002,0.016419653999999999],"4456448":[1.5963596249999998,1.62550058],"63488":[0.0034439639999999999,0.0034755520000000007],"38912":[0.0033097770000000007,0.0034395349999999992],"68":[5.4049999999999999e-06,5.5550000000000002e-06],"188416":[0.019295254999999997,0.021394650000000005],"248":[1.0278999999999999e-05,1.0817e-05],"80":[5.6300000000000003e-06,5.7740000000000001e-06],"2560":[0.000206861,0.00020797200000000006],"34816":[0.0030559990000000011,0.0031800799999999996],"3712":[0.000156584,0.00016175799999999996],"3538944":[0.64902300700000004,0.67840725599999996],"76":[5.7420000000000003e-06,6.5660000000000003e-06],"4194304":[0.89383746200000003,0.92069250999999996],"851968":[0.093804941000000003,0.123105987],"4096":[0.00018816700000000002,0.000200962],"59392":[0.003183037000000001,0.003188218],"84":[5.463e-06,5.7849999999999997e-06],"3276800":[0.56997574200000001,0.57630657900000004],"55296":[0.0026678599999999998,0.0027558019999999999],"688128":[0.101537317,0.14687524499999999],"8192":[0.00041867300000000016,0.00042037199999999991],"10240":[0.0008077729999999998,0.00081575199999999999],"15872":[0.00079093400000000008,0.00081008999999999996],"92":[6.0889999999999996e-06,7.0160000000000003e-06],"26624":[0.001129856,0.001178438],"1792":[7.6534999999999998e-05,9.3948000000000002e-05],"11776":[0.00085254099999999985,0.0009701270000000001],"2944":[0.00021248599999999996,0.000224918],"88":[6.0610000000000001e-06,6.1909999999999997e-06],"22528":[0.00170751,0.0017603569999999995],"1245184":[0.26417520300000003,0.36555078699999999],"15728640":[3.5946862749999999,3.595685214],"96":[6.0580000000000003e-06,6.3810000000000004e-06],"1984":[8.8177999999999995e-05,8.8774000000000001e-05],"139264":[0.015549495,0.015570409],"475136":[0.039338039000000005,0.054665240999999989],"13631488":[2.8238041319999998,2.8403864560000001],"416":[1.6663e-05,1.7946000000000001e-05],"928":[3.8053999999999999e-05,3.9127e-05],"512":[2.332e-05,2.6312000000000002e-05],"18432":[0.001516955,0.0016069049999999998],"16777216":[4.0595794060000001],"9728":[0.00078994099999999995,0.00079363200000000006],"1769472":[0.28493203099999997,0.296862774],"1703936":[0.26239641600000002,0.27230143600000001],"2048":[9.2427000000000001e-05,9.2538000000000001e-05],"14336":[0.00062489100000000003,0.00062735000000000015],"448":[1.8627e-05,2.0803000000000001e-05],"5505024":[1.8371437770000001,1.849687662],"544":[4.5964999999999998e-05,4.6038000000000002e-05],"221184":[0.014426384,0.016920134],"90112":[0.0079516230000000014,0.0086373130000000006],"640":[4.6641999999999998e-05,5.0031999999999998e-05],"12800":[0.00051657500000000013,0.000538409],"262144":[0.020320444999999999,0.02252353],"589824":[0.088171586999999968,0.120948837],"884736":[0.099822922000000008,0.138968436],"6144":[0.00044765899999999999,0.000458756],"1088":[9.2748e-05,9.2965000000000002e-05],"576":[4.4489e-05,4.5355000000000002e-05],"160":[1.0822000000000001e-05,1.2883e-05],"672":[4.9325e-05,5.0439999999999998e-05],"8912896":[3.4842637669999998,3.5414551530000002],"100":[3.8139999999999998e-06,3.8539999999999999e-06],"507904":[0.045183237000000001,0.058418208999999999],"3840":[0.00018724599999999999,0.00019693400000000004],"192":[1.2981e-05,1.3169999999999999e-05],"376832":[0.044351667999999997,0.045258410999999991],"98304":[0.0089395199999999994,0.009696171],"5376":[0.000395089,0.00043156599999999998],"94208":[0.0081181780000000002,0.008768606],"81920":[0.0075271640000000003,0.007697354],"3407872":[0.61224661599999997,0.61317319100000001],"104":[3.8809999999999998e-06,4.3499999999999999e-06],"122880":[0.0077402189999999996,0.0080337929999999957],"200":[7.126e-06,8.3650000000000004e-06],"163840":[0.018014285000000001,0.018248778],"4063232":[0.84919100300000006,0.85857252399999995],"5767168":[1.899423777,1.9165315000000001],"12582912":[4.1666124409999998,4.2512551040000002],"1600":[6.0049000000000001e-05,6.8806000000000005e-05],"136":[1.0467e-05,1.0635999999999999e-05],"232":[9.3810000000000005e-06,9.9720000000000004e-06],"7077888":[1.3902532139999999,1.495083226],"86016":[0.0077436270000000003,0.00804501],"31744":[0.0014854130000000001,0.0015816230000000001],"168":[1.1909000000000001e-05,1.3298e-05],"622592":[0.09525106199999997,0.114190614],"108":[3.7749999999999999e-06,4.0779999999999997e-06],"327680":[0.039571413,0.041058298999999999],"2176":[0.00019286299999999999,0.000193938],"3328":[0.000133845,0.00014125000000000002],"1":[8.2000000000000006e-08,8.6999999999999998e-08],"2":[2.2000000000000001e-07,2.28e-07],"3":[2.35e-07,2.4299999999999999e-07],"4":[2.4499999999999998e-07,2.5800000000000001e-07],"7424":[0.00032212799999999998,0.00035764199999999992],"5":[3.8099999999999998e-07,4.4299999999999998e-07],"23552":[0.001740449,0.001822578],"6":[3.4400000000000001e-07,3.4400000000000001e-07],"61440":[0.0031447040000000003,0.0032803249999999997],"491520":[0.043536589000000007,0.053859652000000001],"77824":[0.007192637,0.0079090819999999996],"7":[4.5299999999999999e-07,4.9100000000000004e-07],"8":[3.6699999999999999e-07,4.0999999999999999e-07],"208":[8.0560000000000005e-06,8.4109999999999996e-06],"9":[5.2099999999999997e-07,5.5799999999999999e-07],"73728":[0.0072111329999999998,0.007307250999999999],"304":[2.2192999999999999e-05,2.2353000000000001e-05],"400":[1.5797000000000001e-05,1.5959000000000001e-05],"1310720":[0.286381514,0.406673646],"336":[2.4355e-05,2.5817e-05],"3670016":[0.69292789300000002,0.69899985600000003],"6656":[0.00028456500000000002,0.00029794100000000008],"15360":[0.00072720100000000002,0.00073340299999999998],"432":[1.7136e-05,1.7215999999999999e-05],"950272":[0.116285021,0.16997979199999999],"655360":[0.098312009000000006,0.12845307],"69632":[0.0067459519999999995,0.0070228660000000191],"11264":[0.00084426799999999991,0.00089582700000000008],"2752512":[0.79914269900000001,0.80828747499999998],"8126464":[1.8211443030000001,1.8311364449999998],"27648":[0.0011767629999999999,0.001251615],"368":[2.4366999999999999e-05,2.5780999999999999e-05],"65536":[0.0036459050000000005,0.003671746],"16252928":[3.8132485169999999,3.8295085150000001],"464":[1.9627e-05,2.0210000000000001e-05],"1015808":[0.133921333,0.17804693699999999],"3072":[0.000209595,0.00023249799999999998],"110592":[0.006450843999999999,0.0064544499999999987],"237568":[0.017689238000000003,0.018601325000000002],"278528":[0.036677215999999999,0.038862140000000003],"496":[2.1852e-05,2.4845999999999999e-05],"13107200":[2.6305793670000002,2.7149522180000001],"9961472":[3.6043035099999998,3.7085168680000002],"5888":[0.00041234400000000009,0.00046785400000000002],"11010048":[3.8663313600000002,3.947440947],"1920":[8.0743999999999998e-05,8.0995999999999995e-05],"2490368":[0.74159807200000005,0.77605085699999998],"19456":[0.001573215,0.0015883],"57344":[0.0028720760000000003,0.0029672460000000002],"1179648":[0.25465679200000002,0.34496327100000002],"4718592":[1.6707102730000001,1.7177393160000001],"360448":[0.043894123,0.047839793000000005],"1572864":[0.324903518,0.33123501300000002],"53248":[0.0025914459999999999,0.0026217950000000001],"3456":[0.00014245600000000001,0.00015517599999999998],"40960":[0.003465193000000001,0.0034806200000000002],"4608":[0.00036323999999999997,0.00037970199999999988],"13824":[0.00058479000000000007,0.00063024800000000014],"819200":[0.090372625000000012,0.12793697900000001],"983040":[0.125893748,0.17538163100000001],"8704":[0.00074067600000000001,0.00082992199999999997],"120":[4.6260000000000003e-06,4.7639999999999996e-06],"1024":[4.4972000000000002e-05,4.8501000000000002e-05],"49152":[0.003786635,0.003849178],"524288":[0.048595369000000013,0.061711919000000018],"45056":[0.0036642519999999998,0.0037956219999999998],"229376":[0.016427421000000005,0.018471189999999998],"2688":[0.00018991599999999999,0.00021996],"152":[1.0145e-05,1.1685000000000001e-05],"5120":[0.00037900599999999993,0.00042161899999999998],"1507328":[0.32297298499999999,0.44038888700000001],"1216":[9.2891000000000002e-05,9.7230000000000003e-05],"1966080":[0.34000327299999999,0.35045238099999998],"1900544":[0.319984086,0.32739516800000001],"184":[1.2537e-05,1.2721999999999999e-05],"7936":[0.00036124300000000013,0.000364781],"3801088":[0.72585669200000003,0.73944069700000004],"6815744":[1.2989345750000001,1.376707173],"124":[5.1039999999999998e-06,5.3979999999999998e-06],"102400":[0.005616172,0.0059007699999999996],"311296":[0.039045692999999999,0.039574993999999995],"1408":[9.5289000000000002e-05,0.00010915499999999999],"393216":[0.046228458,0.047303062],"4352":[0.00036659099999999999,0.00038349599999999999],"6553600":[1.251613614,1.2853407240000001],"20480":[0.0016133389999999997,0.0016891410000000003],"608":[4.7871000000000003e-05,4.8279000000000003e-05],"2228224":[0.70011845799999994,0.70493004500000001],"36864":[0.0033342379999999998,0.003335293],"704":[4.8060999999999999e-05,4.9450999999999998e-05],"720896":[0.10164150600000001,0.13782075000000005],"800":[3.0524000000000001e-05,3.2632000000000002e-05],"2621440":[0.773261427,0.797329446],"425984":[0.032813205000000005,0.040023974000000004],"32768":[0.0016308870000000004,0.0016832940000000001],"12058624":[4.0504467550000003,4.0795490809999997],"128":[4.9130000000000002e-06,5.4210000000000003e-06],"180224":[0.018501483000000003,0.019445143000000005],"224":[8.3620000000000006e-06,9.2150000000000007e-06],"736":[4.8439000000000002e-05,5.9608000000000003e-05],"320":[2.2425999999999998e-05,2.3247999999999998e-05],"557056":[0.084417243999999947,0.12007142],"832":[3.4072000000000002e-05,3.9585000000000001e-05],"9437184":[3.6008388350000002,3.6250178110000002],"3584":[0.00015060800000000005,0.00016822499999999998],"6291456":[1.9834460970000001,2.083502186],"256":[1.0767999999999999e-05,1.2254e-05],"15204352":[3.366514333,3.4073178930000001],"28672":[0.0012712439999999997,0.0013412209999999996],"768":[5.1885999999999998e-05,5.5560000000000003e-05],"212992":[0.014599086000000002,0.015340388],"864":[3.5193e-05,3.6225e-05],"352":[2.4774e-05,2.5406e-05],"253952":[0.019240591000000001,0.020542635],"960":[4.4168000000000001e-05,4.5562000000000002e-05],"24576":[0.0017696879999999997,0.0018638209999999994],"7680":[0.000355096,0.00037401900000000001],"294912":[0.037648272000000003,0.038981517],"1048576":[0.14698449400000002,0.19067540399999999],"10485760":[3.7172852120000002,3.796472853],"344064":[0.042684182000000001,0.043033566000000002],"288":[2.0868000000000001e-05,2.3708999999999999e-05],"1152":[9.0566e-05,9.2003000000000007e-05],"384":[2.402e-05,2.5145000000000001e-05],"2304":[0.000188486,0.000191325],"896":[3.7361999999999999e-05,4.2633999999999999e-05],"480":[1.9740000000000001e-05,2.2351999999999999e-05],"1441792":[0.30697213200000001,0.42848140099999998],"992":[4.7339999999999997e-05,4.7985999999999998e-05],"3968":[0.00017932999999999998,0.00018104000000000001],"6400":[0.000257254,0.00026660299999999997],"1344":[9.9083e-05,0.00010456299999999998],"126976":[0.0081593690000000031,0.008409363999999999],"2883584":[0.82500714399999997,0.89095710900000002],"753664":[0.11247772,0.15506903699999999],"16384":[0.00080776800000000005,0.00086355099999999995],"131072":[0.0088408610000000002,0.0094004310000000008],"458752":[0.037469927,0.052275941999999964],"172032":[0.017940866999999999,0.018227158],"12288":[0.0009355539999999999,0.00098943200000000016],"14680064":[3.1343047460000002,3.4896395010000001],"1536":[0.00010416600000000002,0.000110251],"25600":[0.001075894,0.0010841259999999999],"1835008":[0.31390987100000001,0.33009187899999998],"10752":[0.00082206499999999997,0.00084372700000000006],"21504":[0.0016517120000000003,0.001828966],"7602176":[1.5615198699999999,1.6068672829999999],"5632":[0.00040044699999999996,0.00047902900000000006],"10":[4.6699999999999999e-07,4.6800000000000001e-07],"3145728":[0.861843684,0.89749246599999999],"245760":[0.017272677,0.018733093999999999],"1728":[7.1119999999999997e-05,7.5327000000000006e-05],"11":[5.6599999999999996e-07,5.8800000000000002e-07],"1114112":[0.24027689799999999,0.35027556799999998],"12":[4.9800000000000004e-07,5.4799999999999998e-07],"7340032":[1.4715051589999999,1.508338433],"7168":[0.00030251599999999996,0.00036322699999999998],"13":[6.3499999999999996e-07,6.9999999999999997e-07],"6029312":[1.942415491,1.9522961780000001],"14":[6.3600000000000003e-07,8.1200000000000002e-07],"3200":[0.00012521900000000004,0.00014867],"20":[1.378e-06,1.4959999999999999e-06],"204800":[0.013033316,0.014397129999999998],"15":[8.1800000000000005e-07,8.9100000000000002e-07],"13312":[0.00054501800000000009,0.00059330599999999982],"4980736":[1.7054409989999999,1.7265405490000001],"118784":[0.0072940629999999991,0.0074249889999999999],"51200":[0.0023710000000000003,0.0024364160000000003],"16":[8.1100000000000005e-07,8.5600000000000004e-07],"21":[1.8250000000000001e-06,1.8679999999999999e-06],"917504":[0.10706381,0.15710539400000001],"22":[1.6160000000000001e-06,1.624e-06],"4864":[0.000382533,0.00040895199999999992],"17":[1.5549999999999999e-06,1.8789999999999999e-06],"14848":[0.00067321900000000007,0.000682717],"23":[1.756e-06,1.9369999999999998e-06],"786432":[0.10772994299999999,0.144468705],"18":[1.3689999999999999e-06,1.4899999999999999e-06],"1638400":[0.24701819899999999,0.255287545],"7864320":[1.695252161,1.718770366],"24":[1.621e-06,1.9580000000000001e-06],"14155776":[2.922932131,2.9880664989999999],"19":[1.5910000000000001e-06,1.5939999999999999e-06],"30":[1.201e-06,1.2389999999999999e-06],"25":[1.1370000000000001e-06,1.144e-06],"31":[1.443e-06,1.7349999999999999e-06],"1280":[9.4499000000000004e-05,9.6304999999999994e-05],"26":[1.0210000000000001e-06,1.1519999999999999e-06],"3932160":[0.78472196799999994,0.798093265],"2432":[0.00019334299999999998,0.00020266700000000004],"32":[1.3459999999999999e-06,1.3650000000000001e-06],"27":[1.268e-06,1.406e-06],"409600":[0.031873921,0.034667583999999994]}},{"title":"OrderedSet formUnion with Array (75% overlap)","results":{"28":[9.7100000000000011e-07,1.0160000000000001e-06],"34":[1.074e-06,1.189e-06],"29":[9.7900000000000007e-07,1.2330000000000001e-06],"40":[2.3190000000000002e-06,2.7989999999999998e-06],"17408":[0.00064707800000000004,0.00070796300000000004],"1472":[9.1217000000000004e-05,0.000101714],"112":[3.2969999999999999e-06,3.3730000000000001e-06],"1376256":[0.27192962100000001,0.405333043],"5242880":[1.7210763820000001,1.763276157],"36":[1.1570000000000001e-06,1.274e-06],"42":[2.4959999999999999e-06,2.7039999999999999e-06],"11534336":[3.7663361630000001,3.8708963819999997],"114688":[0.0055815039999999993,0.0055972579999999991],"144":[4.4440000000000001e-06,4.6789999999999996e-06],"38":[1.1820000000000001e-06,1.393e-06],"240":[6.7719999999999997e-06,6.9299999999999997e-06],"9216":[0.00034462099999999992,0.00040679999999999997],"44":[2.5770000000000001e-06,3.2679999999999999e-06],"1664":[5.1700999999999998e-05,5.3198999999999997e-05],"196608":[0.018592169000000002,0.019465628000000002],"155648":[0.0093428880000000006,0.0097797910000000012],"2816":[0.00018030999999999999,0.000187164],"50":[1.3829999999999999e-06,1.4419999999999999e-06],"2359296":[0.40095386200000005,0.40900641999999998],"46":[2.5509999999999998e-06,2.9469999999999999e-06],"176":[1.0277e-05,1.057e-05],"52":[1.5859999999999999e-06,1.672e-06],"272":[8.3750000000000003e-06,9.4239999999999999e-06],"116":[3.2789999999999999e-06,4.0400000000000003e-06],"47104":[0.0033584360000000002,0.003692135],"6912":[0.000219705,0.00024236900000000001],"1856":[5.7207000000000003e-05,5.9338e-05],"48":[2.587e-06,3.1379999999999999e-06],"2097152":[0.30935058999999998,0.314325678],"54":[1.767e-06,1.7910000000000001e-06],"2031616":[0.28883447600000001,0.29451659400000002],"43008":[0.0032293870000000002,0.0036143349999999998],"60":[2.0020000000000001e-06,2.131e-06],"30720":[0.001090658,0.0011486110000000001],"56":[1.6789999999999999e-06,1.8649999999999999e-06],"62":[1.9039999999999999e-06,1.9800000000000001e-06],"58":[1.742e-06,1.8479999999999999e-06],"3014656":[0.82689407000000004,0.85569243299999997],"64":[1.8950000000000001e-06,2.0719999999999998e-06],"8388608":[1.529594246,1.5423759289999999],"29696":[0.0010092130000000001,0.001041574],"216":[5.9859999999999999e-06,6.861e-06],"106496":[0.00504105,0.005672542],"72":[2.2220000000000001e-06,2.4669999999999998e-06],"442368":[0.027216139,0.028594080000000001],"147456":[0.0084223330000000006,0.0099017030000000412],"4456448":[0.79504978400000004,0.80197244700000003],"63488":[0.0025615669999999998,0.00263277],"38912":[0.001658028,0.001706534],"68":[2.2189999999999998e-06,2.249e-06],"188416":[0.018074657000000001,0.019972779],"248":[7.4259999999999997e-06,7.9929999999999995e-06],"80":[4.9590000000000003e-06,5.0540000000000002e-06],"2560":[0.00017040499999999999,0.00020043200000000004],"34816":[0.00132555,0.0013346719999999999],"3712":[0.00011799,0.00011807899999999999],"3538944":[0.55711529199999998,0.572902099],"76":[2.7719999999999999e-06,3.0910000000000001e-06],"4194304":[0.715737705,0.71854777999999997],"851968":[0.075406135000000041,0.103259615],"4096":[0.000144707,0.00015033700000000001],"59392":[0.0023165460000000001,0.0024176969999999999],"84":[4.9180000000000002e-06,5.2179999999999998e-06],"3276800":[0.50600847999999998,0.51103580000000004],"55296":[0.002165176,0.0021735999999999995],"688128":[0.091156200999999992,0.12751912600000001],"8192":[0.00029283200000000003,0.00029454999999999998],"10240":[0.00073372699999999977,0.00074729000000000006],"15872":[0.00058704899999999986,0.00060186499999999993],"92":[5.4979999999999997e-06,6.0379999999999996e-06],"26624":[0.00087995100000000013,0.00092044499999999999],"1792":[5.8145e-05,6.7997999999999995e-05],"11776":[0.00079550999999999992,0.00083699699999999991],"2944":[0.00019951800000000001,0.00020279900000000003],"88":[5.2399999999999998e-06,5.5820000000000001e-06],"22528":[0.001536316,0.0016397269999999999],"1245184":[0.159565604,0.217629341],"15728640":[2.9611868170000002,2.9683984080000001],"96":[5.305e-06,5.7389999999999996e-06],"1984":[6.3020000000000003e-05,6.3955999999999995e-05],"139264":[0.007344873,0.007400285999999999],"475136":[0.03075025,0.043321705000000002],"13631488":[2.4603907679999999,2.4932323159999998],"416":[1.2393e-05,1.3329000000000001e-05],"928":[2.9238999999999999e-05,2.9522e-05],"512":[1.6697999999999998e-05,1.8892000000000001e-05],"18432":[0.00072052100000000012,0.00079371900000000002],"16777216":[3.2104158530000002],"9728":[0.00038981299999999998,0.000401059],"1769472":[0.24069006400000001,0.247858777],"1703936":[0.22904675799999999,0.246126285],"2048":[6.9025999999999999e-05,7.9256000000000001e-05],"14336":[0.00047893400000000003,0.000483511],"448":[1.3767e-05,1.5503999999999999e-05],"5505024":[1.7629597539999999,1.7927882319999999],"544":[1.9049e-05,2.0146e-05],"221184":[0.011618791,0.012685967000000003],"90112":[0.0071540350000000013,0.0077496630000000013],"640":[4.0521e-05,4.5068999999999998e-05],"12800":[0.00041181999999999997,0.000471423],"262144":[0.015413019,0.017448928999999995],"589824":[0.046252169000000017,0.057579615000000008],"884736":[0.082430282000000007,0.112427953],"6144":[0.00038621,0.00041871600000000008],"1088":[3.9811999999999998e-05,4.0108000000000003e-05],"576":[1.9633e-05,2.0299e-05],"160":[1.0156999999999999e-05,1.1731e-05],"672":[4.4295000000000002e-05,4.4632999999999998e-05],"8912896":[1.6876105269999999,1.695684712],"100":[2.9129999999999999e-06,2.9390000000000002e-06],"507904":[0.03585252600000001,0.043254546999999997],"3840":[0.000128045,0.000139257],"192":[1.1104000000000001e-05,1.1456e-05],"376832":[0.040506802000000001,0.040805250000000001],"98304":[0.0078421080000000004,0.0080220629999999994],"5376":[0.000374948,0.00039350699999999997],"94208":[0.0073946869999999996,0.0078391009999999994],"81920":[0.0068461469999999995,0.0071265009999999986],"3407872":[0.52462176599999999,0.53560750999999995],"104":[2.9849999999999998e-06,3.303e-06],"122880":[0.0061027929999999996,0.0061824489999999996],"200":[5.2780000000000001e-06,5.417e-06],"163840":[0.016211389,0.016483414000000002],"4063232":[0.66813145600000001,0.68727947300000003],"5767168":[1.836730347,1.876302307],"12582912":[4.0190272619999998,4.1589978680000002],"1600":[4.5850000000000003e-05,5.1057999999999998e-05],"136":[4.1989999999999999e-06,4.2969999999999997e-06],"232":[7.0620000000000003e-06,7.3289999999999996e-06],"7077888":[1.175157008,1.250902207],"86016":[0.006991031,0.007525861],"31744":[0.0011235520000000003,0.001199486],"168":[1.041e-05,1.1817000000000001e-05],"622592":[0.055799716999999992,0.073653784],"108":[2.8399999999999999e-06,3.0599999999999999e-06],"327680":[0.036917096999999996,0.037644109999999995],"2176":[8.0098999999999993e-05,8.3566999999999995e-05],"3328":[0.000102527,0.000110226],"1":[8.0999999999999997e-08,8.6000000000000002e-08],"2":[1.05e-07,1.0700000000000001e-07],"3":[1.12e-07,1.24e-07],"4":[2.1799999999999999e-07,2.2700000000000001e-07],"7424":[0.00025471599999999999,0.00026854100000000002],"5":[2.48e-07,2.8099999999999999e-07],"23552":[0.0016029500000000001,0.001630977],"6":[2.7599999999999998e-07,2.8700000000000002e-07],"61440":[0.0024208859999999997,0.0025400129999999998],"491520":[0.032960357999999995,0.041019653000000003],"77824":[0.003719151,0.0040289699999999998],"7":[2.9700000000000003e-07,3.1199999999999999e-07],"8":[3.1399999999999998e-07,3.6699999999999999e-07],"208":[5.9050000000000002e-06,6.2439999999999998e-06],"9":[4.6699999999999999e-07,4.9399999999999995e-07],"73728":[0.0034356200000000003,0.00344941],"304":[1.0169e-05,1.0885e-05],"400":[1.1747e-05,1.2081e-05],"1310720":[0.26131716799999999,0.38405952499999996],"336":[2.1121e-05,2.3110999999999999e-05],"3670016":[0.59538212400000001,0.59556809499999996],"6656":[0.00021746300000000004,0.00021822499999999998],"15360":[0.00053929499999999997,0.00054755699999999973],"432":[1.2731999999999999e-05,1.2867999999999999e-05],"950272":[0.093259902999999977,0.134599575],"655360":[0.089688026000000004,0.11701838099999995],"69632":[0.0029347659999999997,0.0030766349999999999],"11264":[0.00075935399999999985,0.00082776899999999968],"2752512":[0.76857157399999998,0.78625747999999995],"8126464":[1.4608009749999999,1.468516725],"27648":[0.00093733899999999992,0.00097528999999999997],"368":[2.2393000000000001e-05,2.3617000000000001e-05],"65536":[0.0026963390000000003,0.0027560309999999999],"16252928":[3.0409852000000002,3.0528763290000001],"464":[1.437e-05,1.4973e-05],"1015808":[0.105576717,0.13883963999999999],"3072":[0.000190643,0.00019875000000000001],"110592":[0.0051526740000000003,0.0053893360000000015],"237568":[0.013313927,0.014061524000000001],"278528":[0.017795761,0.019154305],"496":[1.6041000000000001e-05,1.7561e-05],"13107200":[2.284220565,2.4261188150000002],"9961472":[2.0812051880000002,2.1018775330000001],"5888":[0.00039168500000000001,0.00041187199999999992],"11010048":[3.7348948210000001,3.8110501929999998],"1920":[5.9178999999999997e-05,6.0251999999999998e-05],"2490368":[0.45299495200000001,0.45606639700000001],"19456":[0.00078528199999999999,0.00079874799999999995],"57344":[0.0021868550000000001,0.0022304819999999781],"1179648":[0.14264342399999999,0.191515623],"4718592":[0.88005107599999999,0.90892869300000001],"360448":[0.039644109999999996,0.041532074000000002],"1572864":[0.29856863300000003,0.33938454400000001],"53248":[0.001943209,0.0020232289999999997],"3456":[0.00011315299999999999,0.00012771000000000001],"40960":[0.0031126249999999999,0.0032224620000000002],"4608":[0.000164222,0.000177706],"13824":[0.00044711700000000002,0.00046419799999999998],"819200":[0.075475861000000005,0.10924704],"983040":[0.097801421000000013,0.14715167900000001],"8704":[0.00030925700000000001,0.000338621],"120":[3.535e-06,3.5640000000000001e-06],"1024":[3.3670000000000001e-05,3.5329e-05],"49152":[0.0034670729999999998,0.003554101],"524288":[0.036180660000000003,0.046747449000000003],"45056":[0.0033367149999999996,0.0033465170000000002],"229376":[0.012689454000000003,0.014155987],"2688":[0.00018891099999999999,0.00019549299999999998],"152":[4.7890000000000002e-06,5.5400000000000003e-06],"5120":[0.00035458799999999976,0.000358869],"1507328":[0.29136047100000001,0.42322634599999998],"1216":[4.5782000000000003e-05,4.6835999999999997e-05],"1966080":[0.27352583800000002,0.27912631599999999],"1900544":[0.27130343899999998,0.275099971],"184":[1.1022999999999999e-05,1.1377e-05],"7936":[0.00027221,0.00028213100000000014],"3801088":[0.61454060200000005,0.61881812999999997],"6815744":[1.138814956,1.1892579670000001],"124":[3.7900000000000001e-06,3.9489999999999998e-06],"102400":[0.0045130479999999995,0.0046880660000000003],"311296":[0.021456555999999998,0.021570258000000002],"1408":[8.5642000000000004e-05,9.9613999999999999e-05],"393216":[0.04145322600000001,0.042705944000000003],"4352":[0.00016479900000000006,0.00017713200000000004],"6553600":[1.0791304399999999,1.124756611],"20480":[0.001480229,0.001491313],"608":[2.3132000000000001e-05,2.4034000000000001e-05],"2228224":[0.34415146699999999,0.35673116399999999],"36864":[0.001524725,0.0015335870000000001],"704":[4.3523000000000003e-05,4.5609000000000003e-05],"720896":[0.093648163999999964,0.11973077999999999],"800":[2.3504000000000001e-05,2.3828e-05],"2621440":[0.73891311400000004,0.77201483400000004],"425984":[0.025580923999999998,0.033395246000000003],"32768":[0.0011994410000000001,0.0012774139999999997],"12058624":[3.926711794,4.0250278699999997],"128":[3.6049999999999998e-06,3.9750000000000001e-06],"180224":[0.017179373000000005,0.017715212000000001],"224":[6.2960000000000004e-06,6.7320000000000001e-06],"736":[4.6471999999999998e-05,4.9007e-05],"320":[1.9848e-05,2.0897999999999999e-05],"557056":[0.041065574000000001,0.059226607000000001],"832":[2.5414000000000001e-05,2.6806999999999999e-05],"9437184":[1.8477888259999999,1.867823107],"3584":[0.000114102,0.00012397300000000001],"6291456":[1.9859635179999999,2.0097275419999998],"256":[7.6599999999999995e-06,8.9250000000000001e-06],"15204352":[2.7821905080000002,2.8696676619999999],"28672":[0.0009921200000000002,0.0010203369999999998],"768":[4.5759e-05,5.3486999999999998e-05],"212992":[0.011956053999999997,0.012014331999999999],"864":[2.6191e-05,2.9502999999999999e-05],"352":[2.1980999999999998e-05,2.2459999999999998e-05],"253952":[0.014675121999999999,0.015643284],"960":[3.0741999999999998e-05,3.1973e-05],"24576":[0.001655002,0.0016588989999999997],"7680":[0.00025435799999999999,0.00028247999999999999],"294912":[0.019373043,0.019492018999999999],"1048576":[0.10933285399999999,0.156782424],"10485760":[3.5974249829999998,3.6945257140000001],"344064":[0.039158196999999999,0.041153245999999997],"288":[9.0499999999999997e-06,1.0541e-05],"1152":[3.9419000000000003e-05,4.2392999999999999e-05],"384":[2.1523e-05,2.2013000000000001e-05],"2304":[8.3561999999999997e-05,9.2584999999999995e-05],"896":[2.7786000000000001e-05,2.8762e-05],"480":[1.4640999999999999e-05,1.6541999999999998e-05],"1441792":[0.279086852,0.406100301],"992":[3.349e-05,3.3677999999999998e-05],"3968":[0.000132294,0.000136914],"6400":[0.00020419700000000001,0.00020462200000000006],"1344":[8.9301000000000004e-05,9.4468000000000004e-05],"126976":[0.0063035309999999994,0.0064506999999999993],"2883584":[0.77384008500000001,0.87351248100000001],"753664":[0.098975219000000017,0.12824419099999995],"16384":[0.00056774800000000008,0.00063411299999999973],"131072":[0.0065560439999999996,0.0070024219999999995],"458752":[0.029262889,0.039040077000000013],"172032":[0.016557016000000032,0.017555991999999996],"12288":[0.00081455000000000004,0.00087087500000000012],"14680064":[2.6420992610000003,9.4342860680000005],"1536":[9.9591000000000002e-05,0.000100589],"25600":[0.00083582399999999999,0.00084340200000000004],"1835008":[0.25974551899999998,0.27439088099999998],"10752":[0.00075530300000000025,0.00076775000000000009],"21504":[0.0015312539999999999,0.001635145],"7602176":[1.3167633809999999,1.341625735],"5632":[0.00036349400000000007,0.00043023599999999996],"10":[3.7899999999999999e-07,4.4200000000000001e-07],"3145728":[0.82975178900000002,0.92532915800000004],"245760":[0.013489181999999999,0.014204641],"1728":[5.1542000000000002e-05,5.7219999999999998e-05],"11":[4.8100000000000003e-07,5.1099999999999996e-07],"1114112":[0.12425087700000004,0.17825461899999995],"12":[4.1399999999999997e-07,4.6699999999999999e-07],"7340032":[1.256892315,1.2724570850000001],"7168":[0.00022902400000000004,0.000256538],"13":[5.6599999999999996e-07,5.99e-07],"6029312":[1.898358462,1.9017707100000001],"14":[5.2300000000000001e-07,5.7199999999999999e-07],"3200":[9.6056000000000003e-05,0.000116233],"20":[1.2559999999999999e-06,1.423e-06],"204800":[0.010583232,0.011485098000000003],"15":[7.0500000000000003e-07,7.3499999999999995e-07],"13312":[0.00043728400000000002,0.000439214],"4980736":[0.98889788700000003,0.99950634299999996],"118784":[0.0056863880000000014,0.005831691],"51200":[0.0018677030000000001,0.001930895],"16":[6.6400000000000002e-07,6.9299999999999997e-07],"21":[1.632e-06,1.7400000000000001e-06],"917504":[0.086466285999999989,0.12850805099999996],"22":[1.4410000000000001e-06,1.4589999999999999e-06],"4864":[0.00018404599999999999,0.00018927699999999998],"17":[7.1999999999999999e-07,8.1299999999999999e-07],"14848":[0.00049177800000000012,0.00054236900000000012],"23":[1.6020000000000001e-06,1.8560000000000001e-06],"786432":[0.096078509999999978,0.141762576],"18":[6.1600000000000001e-07,6.7100000000000001e-07],"1638400":[0.216549938,0.22692351699999999],"7864320":[1.39907805,1.4175089829999998],"24":[1.471e-06,1.7549999999999999e-06],"14155776":[2.5169747650000001,2.584943553],"19":[7.4000000000000001e-07,7.85e-07],"30":[9.3500000000000005e-07,9.3799999999999996e-07],"25":[9.2500000000000004e-07,1.0079999999999999e-06],"31":[1.1489999999999999e-06,1.3200000000000001e-06],"1280":[8.5525000000000005e-05,8.6567e-05],"26":[7.8899999999999998e-07,8.6799999999999999e-07],"3932160":[0.64253060900000003,0.66269636199999993],"2432":[0.00010009,0.00010918499999999997],"32":[1.0419999999999999e-06,1.052e-06],"27":[9.7100000000000011e-07,1.1400000000000001e-06],"409600":[0.024201627,0.027635359999999998]}},{"title":"OrderedSet formUnion with Array (100% overlap)","results":{"28":[6.5300000000000004e-07,6.8599999999999998e-07],"34":[7.2600000000000002e-07,8.09e-07],"29":[5.7199999999999999e-07,7.2600000000000002e-07],"40":[7.8299999999999996e-07,9.4600000000000003e-07],"17408":[0.0004614149999999999,0.00054437400000000003],"1472":[4.3587999999999997e-05,4.723e-05],"112":[2.2570000000000002e-06,2.3259999999999998e-06],"1376256":[0.147043276,0.21800846900000004],"5242880":[0.878219521,0.88577998899999999],"36":[7.1699999999999997e-07,8.0400000000000005e-07],"42":[9.1900000000000001e-07,1.063e-06],"11534336":[2.1416104709999999,2.1795119280000002],"114688":[0.0040185659999999995,0.0040832560000000004],"144":[3.0860000000000002e-06,3.2349999999999999e-06],"38":[7.4600000000000004e-07,8.6499999999999998e-07],"240":[4.6110000000000004e-06,4.899e-06],"9216":[0.00024605499999999996,0.00029337100000000001],"44":[9.9300000000000006e-07,1.203e-06],"1664":[3.6127000000000002e-05,3.6445000000000001e-05],"196608":[0.010643175,0.010833782],"155648":[0.0069539329999999981,0.0072270450000000014],"2816":[8.1479999999999999e-05,8.4226000000000003e-05],"50":[9.5000000000000001e-07,9.9699999999999994e-07],"2359296":[0.32066291999999996,0.32204129199999998],"46":[9.64e-07,1.125e-06],"176":[4.2930000000000002e-06,4.4410000000000003e-06],"52":[1.063e-06,1.1230000000000001e-06],"272":[5.699e-06,6.3080000000000004e-06],"116":[2.3369999999999998e-06,2.717e-06],"47104":[0.0016017410000000003,0.001699859],"6912":[0.00017635900000000001,0.000177536],"1856":[4.1758999999999998e-05,4.2731000000000001e-05],"48":[1.068e-06,1.184e-06],"2097152":[0.26800066,0.268397473],"54":[1.229e-06,1.2440000000000001e-06],"2031616":[0.24087087900000004,0.25334605700000001],"43008":[0.001423239,0.0014381020000000003],"60":[1.2440000000000001e-06,1.4079999999999999e-06],"30720":[0.00080845099999999996,0.0008572670000000001],"56":[1.1379999999999999e-06,1.3340000000000001e-06],"62":[1.339e-06,1.4699999999999999e-06],"58":[1.207e-06,1.2580000000000001e-06],"3014656":[0.49853598100000002,0.53188183599999994],"64":[1.2979999999999999e-06,1.42e-06],"8388608":[1.3339921109999999,1.346259761],"29696":[0.000761168,0.00076862100000000015],"216":[4.3170000000000003e-06,4.6870000000000002e-06],"106496":[0.003766232,0.0040473449999999999],"72":[1.5179999999999999e-06,1.6130000000000001e-06],"442368":[0.019084033,0.01976143],"147456":[0.0064148930000000022,0.0064586879999999989],"4456448":[0.66710560100000005,0.67965677400000002],"63488":[0.001812021,0.001825082],"38912":[0.0011449909999999999,0.0012489320000000001],"68":[1.474e-06,1.491e-06],"188416":[0.0097896860000000006,0.0098634220000000002],"248":[5.0239999999999997e-06,5.4659999999999998e-06],"80":[1.686e-06,1.7570000000000001e-06],"2560":[6.8163000000000005e-05,7.0486000000000002e-05],"34816":[0.00096290200000000007,0.00098451900000000076],"3712":[8.6767999999999993e-05,9.3441000000000002e-05],"3538944":[0.49088892900000003,0.50723150699999997],"76":[1.897e-06,2.063e-06],"4194304":[0.61178047800000002,0.62290408000000008],"851968":[0.06035735200000001,0.087126395999999995],"4096":[9.9357000000000004e-05,0.000111215],"59392":[0.0016428649999999999,0.0017023160000000002],"84":[1.857e-06,1.9870000000000002e-06],"3276800":[0.44169770399999997,0.45767400499999999],"55296":[0.001506517,0.001552933],"688128":[0.042439433999999998,0.065387244999999997],"8192":[0.00021589099999999996,0.00022269],"10240":[0.000304071,0.00031457299999999996],"15872":[0.00044014900000000003,0.00044058300000000003],"92":[2.3300000000000001e-06,2.418e-06],"26624":[0.00066833100000000009,0.00068945999999999992],"1792":[4.1077e-05,4.6482e-05],"11776":[0.00037543099999999996,0.00042424300000000004],"2944":[9.3906999999999994e-05,9.7059999999999996e-05],"88":[2.1579999999999999e-06,2.2639999999999998e-06],"22528":[0.00072388599999999997,0.00075357699999999996],"1245184":[0.12306359,0.17214538200000001],"15728640":[2.5612311480000001,2.5943524390000001],"96":[2.3800000000000001e-06,2.4509999999999999e-06],"1984":[4.3977999999999998e-05,4.7240999999999997e-05],"139264":[0.0056546000000000009,0.005749667],"475136":[0.021852238,0.030775417999999999],"13631488":[2.2197308769999999,2.2409962549999998],"416":[8.1829999999999994e-06,8.6980000000000004e-06],"928":[2.0159000000000001e-05,2.0933000000000001e-05],"512":[1.1436e-05,1.3023000000000001e-05],"18432":[0.00049857700000000026,0.00054815699999999996],"16777216":[2.7691625179999999],"9728":[0.00027654100000000005,0.00029179],"1769472":[0.20756735100000001,0.21718939300000001],"1703936":[0.19737792600000001,0.20222084500000004],"2048":[4.9175000000000003e-05,5.6799999999999998e-05],"14336":[0.000343049,0.00034658599999999996],"448":[9.5740000000000002e-06,1.0505e-05],"5505024":[0.94880672499999996,0.95751015900000003],"544":[1.2683999999999999e-05,1.4307e-05],"221184":[0.0091738240000000006,0.0094865590000000003],"90112":[0.003389815,0.0036412129999999999],"640":[1.6005999999999999e-05,1.7373000000000001e-05],"12800":[0.000294307,0.000330317],"262144":[0.011714449,0.012571546999999999],"589824":[0.030620161999999999,0.041486567999999995],"884736":[0.063481198999999988,0.093542902999999983],"6144":[0.000200745,0.00021704],"1088":[2.5066e-05,2.6084e-05],"576":[1.3084e-05,1.3668e-05],"160":[3.3569999999999998e-06,4.1869999999999999e-06],"672":[1.7730000000000001e-05,1.7762e-05],"8912896":[1.4252940330000001,1.4487189379999998],"100":[1.9939999999999999e-06,2.137e-06],"507904":[0.024782599999999995,0.030949750000000005],"3840":[0.00010135999999999996,0.000109177],"192":[5.0939999999999998e-06,5.2469999999999999e-06],"376832":[0.021249962000000004,0.021747848],"98304":[0.0042624250000000002,0.0043502409999999995],"5376":[0.00016401400000000003,0.00016718900000000001],"94208":[0.0037403609999999998,0.0039742350000000004],"81920":[0.0028841539999999999,0.0029253229999999996],"3407872":[0.461712026,0.46373406699999997],"104":[2.069e-06,2.3709999999999998e-06],"122880":[0.0045287890000000001,0.0047177800000000004],"200":[3.7919999999999999e-06,3.794e-06],"163840":[0.0074032589999999997,0.0075091739999999987],"4063232":[0.58410862099999994,0.60766775899999992],"5767168":[1.036266811,1.0473497650000001],"12582912":[2.579891478,2.6526462899999999],"1600":[3.3584000000000002e-05,3.6158000000000002e-05],"136":[3.0309999999999999e-06,3.0970000000000002e-06],"232":[4.6739999999999996e-06,5.0259999999999998e-06],"7077888":[1.056191433,1.099662116],"86016":[0.0031432000000000001,0.0033694199999999993],"31744":[0.00082451699999999998,0.00089713100000000012],"168":[3.6899999999999998e-06,4.4000000000000002e-06],"622592":[0.035566614000000017,0.049816592999999999],"108":[1.9759999999999998e-06,2.2369999999999999e-06],"327680":[0.016734735000000001,0.016972866],"2176":[5.6764000000000001e-05,5.8035000000000003e-05],"3328":[7.4005999999999996e-05,8.0840999999999994e-05],"1":[8.3000000000000002e-08,8.6000000000000002e-08],"2":[1.04e-07,1.04e-07],"3":[1.1600000000000001e-07,1.24e-07],"4":[1.29e-07,1.3400000000000001e-07],"7424":[0.00017698600000000002,0.00019702500000000003],"5":[1.5200000000000001e-07,1.68e-07],"23552":[0.00078130300000000023,0.00082658100000000017],"6":[1.7599999999999999e-07,1.91e-07],"61440":[0.001756552,0.0018220420000000001],"491520":[0.023487101,0.030825211000000002],"77824":[0.0025665739999999994,0.002687924],"7":[1.9500000000000001e-07,2.0100000000000001e-07],"8":[1.9299999999999999e-07,2.1400000000000001e-07],"208":[3.9500000000000003e-06,4.3490000000000002e-06],"9":[2.2999999999999999e-07,2.3900000000000001e-07],"73728":[0.0023735309999999999,0.0024490129999999999],"304":[6.691e-06,6.7730000000000002e-06],"400":[7.9179999999999994e-06,8.6100000000000006e-06],"1310720":[0.132092231,0.19816550599999999],"336":[8.4819999999999994e-06,8.884e-06],"3670016":[0.51681504199999995,0.51765662800000001],"6656":[0.000159751,0.00016143899999999996],"15360":[0.000380904,0.00039665399999999992],"432":[8.6559999999999998e-06,8.9239999999999996e-06],"950272":[0.072764372000000008,0.11355185700000001],"655360":[0.038173836999999981,0.049332928000000005],"69632":[0.0021024220000000001,0.0021727780000000002],"11264":[0.00035098900000000001,0.000375795],"2752512":[0.40956804599999996,0.42552211299999998],"8126464":[1.267415891,1.2685174560000001],"27648":[0.00068328600000000007,0.00072746700000000009],"368":[9.7159999999999998e-06,1.0652000000000001e-05],"65536":[0.00191354,0.0020167200000000005],"16252928":[2.6630606060000002,2.682013972],"464":[9.8470000000000008e-06,1.0363000000000001e-05],"1015808":[0.082128708999999994,0.114353152],"3072":[0.000100555,0.00010275700000000002],"110592":[0.003952174000000001,0.0040742690000000002],"237568":[0.010297668000000001,0.010969125],"278528":[0.013295401,0.013394846],"496":[1.0908e-05,1.1392e-05],"13107200":[2.0396463689999997,2.1864112690000002],"9961472":[1.6679407529999999,1.7056968029999999],"5888":[0.000183217,0.000197424],"11010048":[1.9745153580000001,1.980098804],"1920":[4.3868000000000001e-05,4.4095999999999999e-05],"2490368":[0.34770206100000001,0.35314051400000002],"19456":[0.00055279299999999999,0.000567674],"57344":[0.0016416500000000004,0.0016423049999999997],"1179648":[0.110084087,0.16366335400000001],"4718592":[0.73742105999999996,0.74728878300000001],"360448":[0.019859803999999998,0.019982989],"1572864":[0.20507333999999999,0.22417188399999999],"53248":[0.001376001,0.0014672109999999999],"3456":[7.8443999999999996e-05,8.5606999999999995e-05],"40960":[0.001256563,0.0013113579999999997],"4608":[0.000122062,0.000129777],"13824":[0.00033038699999999997,0.00034219800000000005],"819200":[0.054598306999999992,0.091888634999999996],"983040":[0.078775655,0.12110948000000001],"8704":[0.00022381700000000002,0.000264584],"120":[2.4590000000000001e-06,2.4940000000000002e-06],"1024":[2.3394999999999999e-05,2.4159e-05],"49152":[0.001821128,0.0018332140000000001],"524288":[0.02554872,0.032760806000000017],"45056":[0.001464061,0.0014953970000000001],"229376":[0.0098328080000000019,0.01006115],"2688":[7.5322999999999997e-05,8.1578999999999999e-05],"152":[3.2830000000000002e-06,3.5559999999999999e-06],"5120":[0.000143282,0.00014751],"1507328":[0.18415132100000001,0.24679794899999999],"1216":[3.1368000000000002e-05,3.2276000000000001e-05],"1966080":[0.23080364,0.24841113400000003],"1900544":[0.230226339,0.23225423099999998],"184":[4.7149999999999997e-06,5.135e-06],"7936":[0.00019652,0.00019999000000000001],"3801088":[0.53281866700000002,0.53862883700000008],"6815744":[0.97156031200000004,1.048021487],"124":[2.689e-06,2.7489999999999999e-06],"102400":[0.0035450740000000009,0.0035890840000000006],"311296":[0.015455695,0.015689238000000001],"1408":[3.9057000000000002e-05,4.2154000000000003e-05],"393216":[0.023156463999999998,0.024408221000000004],"4352":[0.000115015,0.00012015599999999999],"6553600":[0.96322464799999996,0.98948828],"20480":[0.00060578499999999996,0.000616984],"608":[1.5452999999999999e-05,1.6084000000000001e-05],"2228224":[0.28713805699999995,0.29499381499999999],"36864":[0.0010471439999999999,0.001092731],"704":[1.9296999999999998e-05,1.9553000000000001e-05],"720896":[0.046310496,0.063317357000000005],"800":[1.5716e-05,1.664e-05],"2621440":[0.38067923300000001,0.38845816900000002],"425984":[0.018468669,0.020324338000000004],"32768":[0.00086338199999999999,0.00094417899999999985],"12058624":[2.330634238,2.3862442489999998],"128":[2.672e-06,2.8509999999999999e-06],"180224":[0.0088082669999999981,0.0099734019999999975],"224":[4.3449999999999999e-06,4.4970000000000003e-06],"736":[2.1673000000000001e-05,2.249e-05],"320":[7.5159999999999997e-06,7.6890000000000004e-06],"557056":[0.028853527,0.042797803000000009],"832":[1.6719e-05,1.7716000000000001e-05],"9437184":[1.553737334,1.5582187950000002],"3584":[8.6831999999999998e-05,9.0464999999999995e-05],"6291456":[1.252106612,1.2563028809999999],"256":[5.2390000000000002e-06,6.0020000000000003e-06],"15204352":[2.444720217,2.5140116990000001],"28672":[0.00071323700000000003,0.000737129],"768":[2.2433e-05,2.6475999999999999e-05],"212992":[0.008400854000000001,0.0087785779999999987],"864":[1.7965000000000002e-05,2.031e-05],"352":[9.1849999999999993e-06,9.302e-06],"253952":[0.011382778999999999,0.011392714],"960":[2.1446000000000001e-05,2.3008000000000001e-05],"24576":[0.00084809999999999985,0.00087732999999999995],"7680":[0.00018536199999999998,0.00021379299999999996],"294912":[0.014305851,0.014341006],"1048576":[0.086196132000000009,0.13089609799999999],"10485760":[1.8284044850000001,1.8586583619999999],"344064":[0.018755171999999997,0.018961689],"288":[6.2400000000000004e-06,6.878e-06],"1152":[2.6061999999999999e-05,3.2020999999999997e-05],"384":[9.3980000000000005e-06,9.7419999999999992e-06],"2304":[5.8578000000000001e-05,6.4345999999999997e-05],"896":[1.9434000000000001e-05,2.0007999999999999e-05],"480":[9.8789999999999998e-06,1.1178999999999999e-05],"1441792":[0.17165313800000001,0.23067282],"992":[2.2507999999999999e-05,2.3578e-05],"3968":[9.5224999999999997e-05,0.000105815],"6400":[0.000144105,0.000145081],"1344":[3.4895999999999999e-05,3.82e-05],"126976":[0.0048683829999999996,0.0050558900000000004],"2883584":[0.45785474000000004,0.48948097400000001],"753664":[0.052393706999999998,0.06856300999999998],"16384":[0.000414452,0.00046298199999999997],"131072":[0.0051356190000000001,0.0053117630000000006],"458752":[0.021304864999999999,0.028511339],"172032":[0.0081510990000000002,0.0084302540000000016],"12288":[0.00043156499999999997,0.00047564699999999994],"14680064":[2.3241892580000001,4.1310720400000003],"1536":[4.8785000000000001e-05,4.9499999999999997e-05],"25600":[0.00065923299999999974,0.00065991999999999982],"1835008":[0.21422437899999999,0.22154870099999999],"10752":[0.00031733400000000001,0.00033775800000000007],"21504":[0.00064991000000000007,0.00070948800000000009],"7602176":[1.1548494279999999,1.1635790420000001],"5632":[0.000174344,0.00019627100000000003],"10":[2.4699999999999998e-07,2.5699999999999999e-07],"3145728":[0.56301343999999998,0.56331388799999993],"245760":[0.010351232,0.011038283999999999],"1728":[3.6908e-05,4.2293000000000003e-05],"11":[2.4499999999999998e-07,2.6399999999999998e-07],"1114112":[0.096525025,0.14633569099999999],"12":[2.6199999999999999e-07,2.9700000000000003e-07],"7340032":[1.0846449140000001,1.114152405],"7168":[0.000175885,0.00020104700000000004],"13":[2.9499999999999998e-07,2.9999999999999999e-07],"6029312":[1.1360581279999999,1.137385581],"14":[3.4499999999999998e-07,3.7800000000000002e-07],"3200":[7.2156000000000005e-05,7.9064000000000001e-05],"20":[4.0900000000000002e-07,4.5499999999999998e-07],"204800":[0.008049479,0.0084150830000000003],"15":[3.3500000000000002e-07,3.6300000000000001e-07],"13312":[0.00030935199999999999,0.00032489800000000001],"4980736":[0.79543527000000003,0.836685664],"118784":[0.004371593,0.004394645],"51200":[0.0012966079999999999,0.001392077],"16":[3.9900000000000001e-07,4.2899999999999999e-07],"21":[4.9299999999999998e-07,5.2600000000000002e-07],"917504":[0.066968886000000033,0.106779121],"22":[4.9500000000000003e-07,5.3600000000000004e-07],"4864":[0.000132557,0.00014347599999999997],"17":[3.84e-07,4.7700000000000005e-07],"14848":[0.000380326,0.00039506200000000001],"23":[5.0999999999999999e-07,5.9100000000000004e-07],"786432":[0.054412847,0.089377485000000007],"18":[3.9900000000000001e-07,4.0999999999999999e-07],"1638400":[0.18898467699999999,0.19533059999999999],"7864320":[1.2138634450000001,1.2239991610000001],"24":[5.8699999999999995e-07,6.2300000000000001e-07],"14155776":[2.2098017969999999,2.2840501839999998],"19":[3.9999999999999998e-07,4.3300000000000003e-07],"30":[6.1900000000000002e-07,6.3099999999999997e-07],"25":[5.2099999999999997e-07,5.7800000000000001e-07],"31":[7.0399999999999995e-07,7.3799999999999996e-07],"1280":[3.4335999999999998e-05,3.5111000000000003e-05],"26":[5.1399999999999997e-07,5.9999999999999997e-07],"3932160":[0.56454537100000002,0.56614932800000006],"2432":[6.8273000000000002e-05,6.9849000000000002e-05],"32":[6.5000000000000002e-07,7.1800000000000005e-07],"27":[5.5000000000000003e-07,6.0299999999999999e-07],"409600":[0.018161785999999999,0.019049868999999997]}},{"title":"OrderedSet formIntersection with Array (0% overlap)","results":{"28":[7.4399999999999999e-07,8.2799999999999995e-07],"34":[8.8700000000000004e-07,1.1459999999999999e-06],"29":[6.9500000000000002e-07,8.54e-07],"40":[1.082e-06,1.9819999999999998e-06],"17408":[0.00064227200000000026,0.00067134300000000013],"1472":[7.6877000000000003e-05,9.0063999999999997e-05],"112":[2.4200000000000001e-06,2.543e-06],"1376256":[0.20382238999999999,0.29108667399999999],"5242880":[1.2172345600000001,1.2186368400000001],"36":[9.5999999999999991e-07,1.1340000000000001e-06],"42":[1.342e-06,1.409e-06],"11534336":[3.6302925630000002,3.75172624],"114688":[0.0043854270000000008,0.0043945160000000002],"144":[3.8630000000000001e-06,4.1930000000000003e-06],"38":[1.0270000000000001e-06,1.192e-06],"240":[5.446e-06,5.8359999999999997e-06],"9216":[0.00033358699999999999,0.00040907699999999988],"44":[1.4920000000000001e-06,2.2749999999999998e-06],"1664":[4.1332999999999999e-05,4.7979000000000003e-05],"196608":[0.018941934000000001,0.019491156999999999],"155648":[0.008642093,0.0086572530000000002],"2816":[0.00013166099999999999,0.00014371799999999998],"50":[1.0049999999999999e-06,1.3039999999999999e-06],"2359296":[0.38336579700000001,0.38622681199999997],"46":[1.393e-06,2.1449999999999998e-06],"176":[6.8499999999999996e-06,8.9509999999999995e-06],"52":[1.2270000000000001e-06,1.2279999999999999e-06],"272":[7.4830000000000002e-06,8.4670000000000004e-06],"116":[2.762e-06,3.146e-06],"47104":[0.002658423,0.0028258049999999998],"6912":[0.00020835099999999993,0.00021627500000000001],"1856":[5.2867000000000001e-05,5.5043999999999997e-05],"48":[1.7290000000000001e-06,2.8650000000000001e-06],"2097152":[0.29195992999999998,0.29520217799999998],"54":[1.2559999999999999e-06,1.3939999999999999e-06],"2031616":[0.25919910600000001,0.270666615],"43008":[0.0020834489999999994,0.0021300389999999998],"60":[1.604e-06,1.6169999999999999e-06],"30720":[0.0010333409999999997,0.001033654],"56":[1.277e-06,1.424e-06],"62":[1.688e-06,1.7e-06],"58":[1.3179999999999999e-06,1.3960000000000001e-06],"3014656":[0.84534194200000001,0.91946056399999998],"64":[1.544e-06,1.9120000000000001e-06],"8388608":[1.5506086139999999,1.576594332],"29696":[0.000919537,0.00093008899999999994],"216":[5.5480000000000001e-06,5.5690000000000004e-06],"106496":[0.0038723069999999993,0.0042588529999999999],"72":[1.9690000000000001e-06,2.1940000000000001e-06],"442368":[0.020522967,0.021148207000000002],"147456":[0.0074049600000000004,0.0075986790000000014],"4456448":[0.79854135900000001,0.83734052000000003],"63488":[0.0022373360000000004,0.002364555],"38912":[0.001559887,0.001609065],"68":[1.72e-06,1.854e-06],"188416":[0.015420734,0.015953970000000001],"248":[6.083e-06,6.776e-06],"80":[2.4710000000000001e-06,2.8430000000000001e-06],"2560":[0.000109004,0.00011259700000000001],"34816":[0.0012442270000000001,0.0012444299999999999],"3712":[0.00011234400000000001,0.000113219],"3538944":[0.50354157899999996,0.53462698099999995],"76":[2.503e-06,2.8820000000000001e-06],"4194304":[0.699597684,0.70806948400000003],"851968":[0.056372167000000015,0.085742676000000004],"4096":[0.00013257499999999996,0.00014459],"59392":[0.0020272329999999998,0.0021124479999999994],"84":[2.9019999999999999e-06,5.0880000000000002e-06],"3276800":[0.442681781,0.47558439600000002],"55296":[0.0018325430000000001,0.00183779],"688128":[0.058002360999999988,0.092747402000000007],"8192":[0.00028080800000000001,0.00032217200000000002],"10240":[0.00042449799999999999,0.00044603999999999998],"15872":[0.0005438219999999999,0.00054853700000000009],"92":[3.907e-06,4.87e-06],"26624":[0.00074169299999999997,0.00081253399999999985],"1792":[4.9076000000000002e-05,6.0050000000000003e-05],"11776":[0.00068160399999999983,0.00073180199999999993],"2944":[0.00014797399999999999,0.0001827],"88":[3.6009999999999999e-06,3.7419999999999999e-06],"22528":[0.001170171,0.001228243],"1245184":[0.14986219199999995,0.223426387],"15728640":[2.885241588,2.9062062320000002],"96":[4.0910000000000003e-06,4.7890000000000002e-06],"1984":[6.1113999999999998e-05,6.2207999999999998e-05],"139264":[0.0065425830000000003,0.0067422510000000341],"475136":[0.023858347999999995,0.032791384999999992],"13631488":[2.2654308890000001,2.2981397499999998],"416":[9.4520000000000003e-06,1.0338e-05],"928":[2.6548000000000001e-05,2.6832e-05],"512":[1.5118e-05,1.6512999999999999e-05],"18432":[0.00071189400000000003,0.00074673100000000004],"16777216":[3.2474618030000002],"9728":[0.00038704599999999999,0.00039435500000000004],"1769472":[0.20920380099999999,0.211064473],"1703936":[0.19194033499999999,0.19884499],"2048":[6.6120999999999999e-05,6.7594000000000004e-05],"14336":[0.00042096700000000006,0.00044957800000000007],"448":[1.1391e-05,1.3397999999999999e-05],"5505024":[1.4100567370000001,1.4224596379999999],"544":[1.7686e-05,1.9743999999999999e-05],"221184":[0.0095436059999999996,0.0095601550000000007],"90112":[0.0051607479999999997,0.0055873240000000003],"640":[2.5519000000000001e-05,2.7841999999999999e-05],"12800":[0.00036664400000000001,0.00037047800000000004],"262144":[0.013125863,0.013416946000000003],"589824":[0.037056792999999998,0.056707076999999974],"884736":[0.06313883200000002,0.098994785000000002],"6144":[0.000380164,0.00038169700000000002],"1088":[3.6022000000000002e-05,4.0110000000000001e-05],"576":[1.8301999999999999e-05,2.0058e-05],"160":[4.9450000000000001e-06,6.3960000000000003e-06],"672":[2.5443e-05,2.8558e-05],"8912896":[1.7357995850000001,1.7921294429999999],"100":[2.1789999999999998e-06,2.3300000000000001e-06],"507904":[0.027305809,0.033294367000000005],"3840":[0.00012464900000000001,0.000137405],"192":[1.06e-05,1.1460999999999999e-05],"376832":[0.034579626000000009,0.035994341999999999],"98304":[0.0077301569999999997,0.0078072339999999988],"5376":[0.00023670700000000006,0.00025720700000000002],"94208":[0.006048711,0.0064863400000000002],"81920":[0.0038386650000000002,0.00405961],"3407872":[0.47393852400000003,0.48119076400000005],"104":[2.4619999999999999e-06,2.711e-06],"122880":[0.0049714319999999996,0.0051912919999999993],"200":[4.1829999999999996e-06,4.2529999999999998e-06],"163840":[0.0097102890000000004,0.01011802],"4063232":[0.67031023999999995,0.67434365299999999],"5767168":[1.656469814,1.689101781],"12582912":[5.2983808720000001,5.4735720140000002],"1600":[4.1878000000000001e-05,4.5283e-05],"136":[3.602e-06,3.7680000000000002e-06],"232":[5.3669999999999996e-06,6.1809999999999998e-06],"7077888":[1.1161908110000001,1.199338963],"86016":[0.0045619979999999994,0.0046059330000000004],"31744":[0.0010506560000000001,0.00110559],"168":[5.6849999999999998e-06,7.0230000000000004e-06],"622592":[0.043659504000000002,0.066747667000000011],"108":[2.261e-06,2.5050000000000002e-06],"327680":[0.021796237,0.022040374000000001],"2176":[7.7406999999999999e-05,8.2824000000000005e-05],"3328":[9.5305999999999999e-05,9.5493000000000002e-05],"1":[1.7700000000000001e-07,1.8799999999999999e-07],"2":[2.03e-07,2.05e-07],"3":[1.9999999999999999e-07,2.1899999999999999e-07],"4":[2.1500000000000001e-07,2.2700000000000001e-07],"7424":[0.000225892,0.0002455],"5":[2.5600000000000002e-07,2.8999999999999998e-07],"23552":[0.0013589239999999999,0.0013939689999999999],"6":[2.6600000000000003e-07,2.8099999999999999e-07],"61440":[0.0021791150000000001,0.0022586579999999993],"491520":[0.025371291000000008,0.033646536000000005],"77824":[0.0034080570000000004,0.003588005],"7":[2.7500000000000001e-07,2.9299999999999999e-07],"8":[2.8000000000000002e-07,3.1199999999999999e-07],"208":[4.5179999999999998e-06,4.9690000000000002e-06],"9":[3.3299999999999998e-07,3.4700000000000002e-07],"73728":[0.0030857620000000001,0.003276789],"304":[9.9830000000000008e-06,1.0206e-05],"400":[8.6680000000000007e-06,9.7489999999999993e-06],"1310720":[0.16844445,0.25569775099999997],"336":[1.1989e-05,1.3525e-05],"3670016":[0.54374150899999996,0.55072210399999999],"6656":[0.000186038,0.000205465],"15360":[0.00049640699999999992,0.00050453600000000009],"432":[1.0339e-05,1.0431000000000001e-05],"950272":[0.074703394999999978,0.11956504899999998],"655360":[0.049345704999999997,0.081753661999999991],"69632":[0.002686501,0.002793032],"11264":[0.00056353799999999993,0.00060303499999999992],"2752512":[0.59909608600000008,0.60313551300000001],"8126464":[1.4492540709999999,1.4570568910000001],"27648":[0.00083909999999999996,0.00085311100000000015],"368":[1.5639999999999999e-05,2.0531e-05],"65536":[0.0024535810000000003,0.0027426629999999998],"16252928":[3.077475857],"464":[1.1796e-05,1.3256e-05],"1015808":[0.087479799999999996,0.136996594],"3072":[0.000184272,0.00018724900000000004],"110592":[0.0041082659999999993,0.0043405979999999993],"237568":[0.010947584999999999,0.011280327],"278528":[0.015148043,0.015564458],"496":[1.3858e-05,1.4878000000000001e-05],"13107200":[2.112936871,2.1647607949999998],"9961472":[2.195952283,2.2327784789999998],"5888":[0.00033563500000000003,0.00034897199999999996],"11010048":[2.9712337889999998,2.9967949229999999],"1920":[5.8109000000000002e-05,6.2150000000000006e-05],"2490368":[0.44981296100000001,0.45774853900000001],"19456":[0.00079255600000000014,0.00084778200000000005],"57344":[0.0018821629999999998,0.0019016110000000003],"1179648":[0.126050254,0.193977227],"4718592":[0.91916848900000003,0.95506089400000005],"360448":[0.028421986999999999,0.030337210999999996],"1572864":[0.35767383799999997,0.45042106699999995],"53248":[0.001635425,0.001725898],"3456":[0.000106883,0.000107318],"40960":[0.0017470469999999998,0.001817822],"4608":[0.00016604199999999998,0.00016954400000000002],"13824":[0.00040575300000000012,0.00042242900000000004],"819200":[0.051994626999999995,0.091453374999999976],"983040":[0.07722416,0.12920109299999999],"8704":[0.00031434900000000012,0.000333247],"120":[2.5890000000000001e-06,2.9510000000000002e-06],"1024":[3.1992000000000001e-05,3.2963000000000003e-05],"49152":[0.003138114,0.0031631440000000005],"524288":[0.028668798000000002,0.043007575999999992],"45056":[0.0023035489999999998,0.0023094179999999997],"229376":[0.010247711,0.010795938],"2688":[0.000110504,0.000121884],"152":[4.5369999999999999e-06,4.6430000000000003e-06],"5120":[0.000207278,0.000215878],"1507328":[0.29058398699999999,0.41589286999999997],"1216":[4.3825999999999997e-05,4.6925000000000002e-05],"1966080":[0.24157373800000001,0.25405349900000002],"1900544":[0.23481067899999999,0.24449942],"184":[8.7870000000000007e-06,9.0359999999999995e-06],"7936":[0.00025901799999999997,0.00027926899999999996],"3801088":[0.57875855700000001,0.59557660999999995],"6815744":[1.0442804109999999,1.124547763],"124":[3.056e-06,3.3830000000000001e-06],"102400":[0.00363861,0.0036941299999999995],"311296":[0.019435148000000003,0.019939108000000001],"1408":[6.7759e-05,7.6678e-05],"393216":[0.041448759000000009,0.043375128999999998],"4352":[0.000155818,0.00017232599999999996],"6553600":[1.0062361040000001,1.0583601629999999],"20480":[0.00091409399999999963,0.000932014],"608":[2.1047e-05,2.3203000000000001e-05],"2228224":[0.33300666299999998,0.34006266600000001],"36864":[0.001394434,0.001503643],"704":[3.2023000000000002e-05,3.3674000000000003e-05],"720896":[0.06848944400000001,0.096925001999999982],"800":[1.8771999999999999e-05,2.1642e-05],"2621440":[0.51586657499999999,0.52619250699999998],"425984":[0.019371778999999995,0.021201595],"32768":[0.0010981950000000002,0.0011547490000000001],"12058624":[4.3037145959999998,4.4254021950000002],"128":[2.8499999999999998e-06,3.3730000000000001e-06],"180224":[0.013056201,0.013969098000000003],"224":[5.0980000000000001e-06,5.3600000000000004e-06],"736":[3.9368e-05,3.9526000000000001e-05],"320":[1.1110999999999999e-05,1.1555e-05],"557056":[0.033932490000000017,0.043786454000000009],"832":[2.0916000000000001e-05,2.1882000000000002e-05],"9437184":[1.944459642,1.997089278],"3584":[0.000108321,0.000112413],"6291456":[2.4266507719999999,2.4989320949999998],"256":[6.4810000000000003e-06,7.8879999999999997e-06],"15204352":[2.690616495,2.769507859],"28672":[0.00087238400000000003,0.00092724999999999991],"768":[4.0497000000000002e-05,4.8965000000000003e-05],"212992":[0.0087010430000000021,0.0089767199999999971],"864":[2.1724000000000001e-05,2.603e-05],"352":[1.7133e-05,1.7479999999999999e-05],"253952":[0.012426546,0.012434028],"960":[2.9281999999999998e-05,3.0436000000000001e-05],"24576":[0.0016244160000000001,0.0016576],"7680":[0.000247476,0.00028942699999999998],"294912":[0.016872069,0.016992260000000002],"1048576":[0.09261298300000001,0.141941712],"10485760":[2.5413724360000001,2.6077095990000001],"344064":[0.025819966,0.02603925],"288":[9.4530000000000008e-06,1.0132000000000001e-05],"1152":[4.0141000000000001e-05,4.4771000000000002e-05],"384":[1.8151e-05,2.279e-05],"2304":[8.5583999999999999e-05,8.9136999999999997e-05],"896":[2.5041e-05,2.5071000000000001e-05],"480":[1.2266000000000001e-05,1.4049000000000001e-05],"1441792":[0.24789098700000001,0.338791377],"992":[3.1893000000000001e-05,3.2118e-05],"3968":[0.00012438299999999999,0.00013480500000000002],"6400":[0.00017122599999999996,0.000174511],"1344":[6.1308000000000003e-05,6.4388999999999996e-05],"126976":[0.0052990110000000002,0.0054436780000000004],"2883584":[0.71138962900000002,0.76997190800000004],"753664":[0.085659290000000013,0.110762956],"16384":[0.00057588500000000016,0.00065162899999999992],"131072":[0.0057510319999999988,0.0059184349999999997],"458752":[0.022465014000000005,0.032926127999999999],"172032":[0.011165193,0.011525901],"12288":[0.00080312699999999983,0.0009016400000000001],"14680064":[2.5408708579999999,3.5539397209999999],"1536":[8.4165000000000005e-05,8.6469000000000002e-05],"25600":[0.00073711200000000005,0.00075587899999999999],"1835008":[0.21768344500000003,0.22032785699999999],"10752":[0.000486579,0.00050335899999999999],"21504":[0.00099917499999999993,0.001058881],"7602176":[1.2878668790000001,1.29040771],"5632":[0.0002837169999999999,0.000312427],"10":[3.4499999999999998e-07,3.9099999999999999e-07],"3145728":[1.0553114859999999,1.0585534780000001],"245760":[0.011334456,0.012037195000000001],"1728":[5.13e-05,5.5424000000000003e-05],"11":[3.5999999999999999e-07,3.72e-07],"1114112":[0.107951743,0.155405761],"12":[4.0999999999999999e-07,4.4099999999999999e-07],"7340032":[1.162960397,1.2272197299999998],"7168":[0.000211578,0.00025234999999999998],"13":[3.9900000000000001e-07,4.03e-07],"6029312":[1.980363235,2.013930437],"14":[4.51e-07,5.2200000000000004e-07],"3200":[9.0916999999999997e-05,9.1855999999999996e-05],"20":[5.6100000000000001e-07,5.8400000000000004e-07],"204800":[0.0081976180000000003,0.0085826630000000008],"15":[5.0399999999999996e-07,5.1799999999999995e-07],"13312":[0.00039258000000000001,0.000414325],"4980736":[1.04986439,1.066375412],"118784":[0.0047278779999999996,0.004759587],"51200":[0.0015241720000000001,0.00162184],"16":[5.2399999999999998e-07,5.8599999999999998e-07],"21":[7.1900000000000002e-07,7.5600000000000005e-07],"917504":[0.066347507999999986,0.109290097],"22":[7.3200000000000004e-07,7.3300000000000001e-07],"4864":[0.000199254,0.000199734],"17":[5.2600000000000002e-07,6.1900000000000002e-07],"14848":[0.00045363899999999993,0.00050025600000000003],"23":[8.2699999999999998e-07,9.9999999999999995e-07],"786432":[0.097807824000000015,0.14871802200000001],"18":[5.2499999999999995e-07,6.8800000000000002e-07],"1638400":[0.17525212400000001,0.20595375399999999],"7864320":[1.372848063,1.381098572],"24":[8.5899999999999995e-07,1.001e-06],"14155776":[2.3843399459999999,2.4835246710000001],"19":[5.6499999999999999e-07,6.2600000000000002e-07],"30":[7.7000000000000004e-07,7.8999999999999995e-07],"25":[6.6499999999999999e-07,6.7199999999999998e-07],"31":[8.8100000000000001e-07,9.0800000000000003e-07],"1280":[4.9413000000000003e-05,5.4395999999999999e-05],"26":[6.1500000000000004e-07,7.9699999999999995e-07],"3932160":[0.6203263,0.63179166600000003],"2432":[9.4576999999999999e-05,9.9783000000000003e-05],"32":[8.7400000000000002e-07,8.8899999999999998e-07],"27":[6.7100000000000001e-07,7.2900000000000003e-07],"409600":[0.018312738999999998,0.020005803999999995]}},{"title":"OrderedSet formIntersection with Array (25% overlap)","results":{"28":[8.6300000000000004e-07,8.9700000000000005e-07],"34":[9.6200000000000006e-07,1.155e-06],"29":[7.9500000000000001e-07,1.0279999999999999e-06],"40":[1.1379999999999999e-06,1.437e-06],"17408":[0.00078903600000000012,0.0008272389999999999],"1472":[8.1767999999999994e-05,9.611e-05],"112":[3.641e-06,3.7110000000000001e-06],"1376256":[0.216341015,0.30659579100000001],"5242880":[1.220837741,1.277677859],"36":[1.035e-06,1.8479999999999999e-06],"42":[1.2619999999999999e-06,1.869e-06],"11534336":[3.6758977910000001,3.6879106469999998],"114688":[0.0055201039999999996,0.0056666480000000007],"144":[5.3229999999999997e-06,5.7590000000000003e-06],"38":[1.083e-06,1.299e-06],"240":[7.7829999999999999e-06,7.8089999999999993e-06],"9216":[0.00042375399999999998,0.00049262799999999984],"44":[1.5269999999999999e-06,1.756e-06],"1664":[5.4954999999999998e-05,6.3473999999999996e-05],"196608":[0.019804798000000002,0.019873083],"155648":[0.010060267999999999,0.010198763],"2816":[0.00015018400000000001,0.00015733200000000002],"50":[1.2979999999999999e-06,1.341e-06],"2359296":[0.40697798800000001,0.44638596399999997],"46":[1.432e-06,1.5960000000000001e-06],"176":[7.5560000000000002e-06,9.4280000000000002e-06],"52":[1.4330000000000001e-06,1.5209999999999999e-06],"272":[9.5719999999999992e-06,1.1090999999999999e-05],"116":[3.8229999999999997e-06,4.4900000000000002e-06],"47104":[0.0029655690000000004,0.0030908049999999999],"6912":[0.00025631800000000001,0.00027631599999999987],"1856":[6.7025000000000003e-05,6.7866000000000004e-05],"48":[1.654e-06,2.3769999999999999e-06],"2097152":[0.324596567,0.36050958],"54":[1.5999999999999999e-06,1.756e-06],"2031616":[0.28592354099999995,0.30158510100000002],"43008":[0.0023244629999999997,0.0024625369999999999],"60":[1.7069999999999999e-06,1.821e-06],"30720":[0.0012621359999999999,0.0013160349999999997],"56":[1.612e-06,1.629e-06],"62":[2.2790000000000001e-06,2.4540000000000001e-06],"58":[1.5460000000000001e-06,1.578e-06],"3014656":[0.83527617900000006,0.89711183399999994],"64":[2.2019999999999998e-06,2.3439999999999999e-06],"8388608":[1.794837051,1.81905271],"29696":[0.0011701069999999999,0.0011703450000000002],"216":[7.3560000000000004e-06,7.5630000000000003e-06],"106496":[0.0048552450000000002,0.0053090950000000007],"72":[2.6450000000000001e-06,3.2100000000000002e-06],"442368":[0.026175153,0.026913649000000001],"147456":[0.0087149109999999988,0.0090779999999999993],"4456448":[0.85819431899999998,0.94248870399999995],"63488":[0.0028224030000000002,0.0029322899999999997],"38912":[0.0018852600000000001,0.0019629299999999994],"68":[2.446e-06,3.039e-06],"188416":[0.016333796000000001,0.017026348],"248":[8.3019999999999995e-06,9.1759999999999999e-06],"80":[3.568e-06,3.9199999999999997e-06],"2560":[0.000120944,0.000132115],"34816":[0.001542807,0.00155605],"3712":[0.00013935100000000001,0.00015254099999999999],"3538944":[0.583758746,0.58834637599999995],"76":[3.4170000000000001e-06,3.5829999999999998e-06],"4194304":[0.76576904800000001,0.82675797900000003],"851968":[0.07005851099999999,0.105511914],"4096":[0.00016368699999999998,0.00017772099999999996],"59392":[0.0025834489999999994,0.0027388769999999998],"84":[3.6059999999999999e-06,3.6569999999999999e-06],"3276800":[0.509185365,0.53983136900000006],"55296":[0.0023289700000000005,0.0023691720000000001],"688128":[0.062636955999999994,0.096746765999999956],"8192":[0.00033692900000000013,0.00036844899999999997],"10240":[0.00052557100000000007,0.00054734500000000008],"15872":[0.00069621800000000008,0.0006967220000000001],"92":[4.5170000000000001e-06,5.9030000000000001e-06],"26624":[0.0009809879999999997,0.001042327],"1792":[6.4950000000000007e-05,7.6873999999999996e-05],"11776":[0.0007321360000000002,0.00079100799999999995],"2944":[0.00016704599999999996,0.00018686399999999999],"88":[4.4669999999999998e-06,4.8049999999999997e-06],"22528":[0.001378794,0.001396422],"1245184":[0.16675896300000001,0.208483592],"15728640":[3.287499038,3.4512526719999999],"96":[4.4469999999999999e-06,5.5450000000000003e-06],"1984":[8.1477000000000006e-05,8.1942999999999998e-05],"139264":[0.0078053580000000001,0.0083653169999999989],"475136":[0.030151342000000008,0.044198115000000003],"13631488":[2.6282003459999999,2.7011714050000002],"416":[1.2794e-05,1.4121000000000001e-05],"928":[3.4011999999999999e-05,3.5021999999999998e-05],"512":[2.0543e-05,2.3266999999999999e-05],"18432":[0.00085030999999999995,0.00090346000000000003],"16777216":[3.7302234319999998],"9728":[0.00044597700000000002,0.00046173599999999992],"1769472":[0.23525538200000001,0.24994275399999999],"1703936":[0.22183605399999995,0.22958504400000002],"2048":[8.2516999999999996e-05,8.7175999999999993e-05],"14336":[0.00056623399999999999,0.00057208200000000002],"448":[1.5662e-05,1.7526000000000001e-05],"5505024":[1.4264548110000002,1.4817114650000001],"544":[2.3255e-05,2.3771e-05],"221184":[0.01186981,0.012413275],"90112":[0.0057668630000000014,0.0060974440000000005],"640":[2.9855000000000001e-05,3.3754000000000002e-05],"12800":[0.00049287000000000007,0.00049894200000000016],"262144":[0.015495039,0.016413619000000001],"589824":[0.045786738,0.060330914000000013],"884736":[0.078736749999999994,0.10929377],"6144":[0.00039810900000000006,0.000405883],"1088":[4.4827000000000003e-05,4.7948999999999998e-05],"576":[2.3164e-05,2.5907000000000001e-05],"160":[6.2809999999999997e-06,7.8930000000000005e-06],"672":[3.1649000000000001e-05,3.4727999999999997e-05],"8912896":[1.902128635,1.983193955],"100":[3.2339999999999999e-06,3.3160000000000001e-06],"507904":[0.033224244,0.042785599000000014],"3840":[0.00015030300000000001,0.000162554],"192":[1.1799e-05,1.2927e-05],"376832":[0.035761105000000001,0.037438200999999997],"98304":[0.0081648719999999984,0.0081742150000000003],"5376":[0.00027593600000000001,0.00029235199999999995],"94208":[0.0066205389999999991,0.0070391080000000005],"81920":[0.0045630710000000001,0.0047403330000000011],"3407872":[0.53336785499999995,0.56491704200000004],"104":[3.3799999999999998e-06,3.7479999999999999e-06],"122880":[0.0061003720000000006,0.0064629199999999996],"200":[5.9920000000000004e-06,6.1099999999999999e-06],"163840":[0.011371928,0.011980207],"4063232":[0.71528417799999999,0.71744074599999996],"5767168":[1.640081092,1.6833009109999999],"12582912":[5.0867542300000004,5.2960783329999996],"1600":[5.7540999999999997e-05,6.1029000000000001e-05],"136":[4.9350000000000002e-06,5.0039999999999999e-06],"232":[7.7800000000000001e-06,8.2989999999999997e-06],"7077888":[1.2564944929999999,1.4478529760000001],"86016":[0.0051824649999999989,0.0054398250000000006],"31744":[0.0013595980000000003,0.0013912730000000002],"168":[7.1049999999999997e-06,7.9270000000000005e-06],"622592":[0.051467697999999992,0.069896709000000001],"108":[3.275e-06,3.4249999999999998e-06],"327680":[0.024118124999999997,0.024664336000000002],"2176":[9.1682999999999996e-05,9.5335999999999997e-05],"3328":[0.00011896,0.000120364],"1":[1.5300000000000001e-07,1.5900000000000001e-07],"2":[2.5699999999999999e-07,2.5899999999999998e-07],"3":[2.4999999999999999e-07,2.7399999999999999e-07],"4":[2.6800000000000002e-07,2.7799999999999997e-07],"7424":[0.00028448600000000014,0.00030658599999999997],"5":[3.1199999999999999e-07,3.39e-07],"23552":[0.0014922519999999999,0.0015328399999999997],"6":[3.3599999999999999e-07,3.6600000000000002e-07],"61440":[0.0026761190000000002,0.0027621920000000001],"491520":[0.03248463,0.039197914],"77824":[0.0040728229999999997,0.0042542109999999999],"7":[3.3099999999999999e-07,3.4700000000000002e-07],"8":[3.3299999999999998e-07,3.7899999999999999e-07],"208":[6.4880000000000004e-06,7.092e-06],"9":[4.1899999999999998e-07,4.39e-07],"73728":[0.0036755529999999994,0.0038279030000000006],"304":[1.2091e-05,1.2150999999999999e-05],"400":[1.2026e-05,1.3390000000000001e-05],"1310720":[0.186354618,0.27123204000000001],"336":[1.4734e-05,1.6387000000000001e-05],"3670016":[0.59834740600000003,0.61030690600000004],"6656":[0.000241136,0.00026339899999999999],"15360":[0.00063248799999999963,0.000658988],"432":[1.3900000000000001e-05,1.4156e-05],"950272":[0.091753911999999979,0.14265265999999999],"655360":[0.058224374999999995,0.082978898999999995],"69632":[0.0033268779999999997,0.0034796800000000002],"11264":[0.0006318579999999999,0.00069010700000000003],"2752512":[0.59518531100000005,0.65678873799999993],"8126464":[1.5846202389999999,1.6178257380000001],"27648":[0.001072478,0.0011161860000000001],"368":[1.9043999999999999e-05,2.2087999999999999e-05],"65536":[0.0029613070000000003,0.0032256609999999999],"16252928":[3.4952501040000001],"464":[1.6163000000000001e-05,1.7184999999999999e-05],"1015808":[0.106663545,0.16283235900000001],"3072":[0.000197923,0.000206634],"110592":[0.0053329600000000012,0.0053418769999999992],"237568":[0.013845128,0.013870842],"278528":[0.017744970000000002,0.018955050999999997],"496":[1.8051999999999999e-05,1.9063e-05],"13107200":[2.4964324900000001,2.6976032920000002],"9961472":[2.411190811,2.4295464419999999],"5888":[0.00037004300000000002,0.000376828],"11010048":[3.0057702759999998,3.101706836],"1920":[7.0560000000000002e-05,7.6401000000000003e-05],"2490368":[0.47926623299999999,0.50551782499999998],"19456":[0.00094617799999999999,0.00096661199999999972],"57344":[0.002439171,0.0025345319999999999],"1179648":[0.139073221,0.21391743399999999],"4718592":[0.98901647000000004,1.0357051180000001],"360448":[0.03209961900000001,0.032615918000000001],"1572864":[0.34391186600000001,0.37758591899999999],"53248":[0.0021786430000000001,0.0022471229999999997],"3456":[0.00012675500000000002,0.00013750000000000001],"40960":[0.0021104770000000004,0.0021565099999999995],"4608":[0.00020537599999999995,0.00021274400000000001],"13824":[0.0005377689999999999,0.00056349500000000001],"819200":[0.06427598499999998,0.10018685099999999],"983040":[0.097515557000000003,0.13538769],"8704":[0.00038848800000000004,0.00039094500000000002],"120":[3.6509999999999999e-06,3.968e-06],"1024":[3.8859999999999997e-05,4.0843999999999997e-05],"49152":[0.0034983460000000003,0.0035550359999999997],"524288":[0.034856024999999999,0.049380191000000004],"45056":[0.0025854859999999997,0.0026571490000000001],"229376":[0.013033209,0.013038118999999997],"2688":[0.000135136,0.00014180700000000001],"152":[5.9370000000000001e-06,6.0560000000000001e-06],"5120":[0.00024337099999999998,0.00025474900000000002],"1507328":[0.28693717600000002,0.402495555],"1216":[5.6360999999999998e-05,6.2575000000000003e-05],"1966080":[0.26795794099999998,0.28303869599999998],"1900544":[0.26066893499999999,0.27536170000000004],"184":[9.8109999999999997e-06,1.0834e-05],"7936":[0.00031864699999999992,0.00033506200000000001],"3801088":[0.643598,0.64404763700000001],"6815744":[1.1970704400000001,1.3842439479999999],"124":[4.3490000000000002e-06,4.4220000000000002e-06],"102400":[0.0046712360000000005,0.0046812290000000003],"311296":[0.021732444,0.022486374],"1408":[7.5162999999999998e-05,7.9217999999999999e-05],"393216":[0.042023154,0.045433108],"4352":[0.000194532,0.00020122900000000003],"6553600":[1.1471778109999999,1.2765754739999999],"20480":[0.0010570549999999999,0.001060409],"608":[2.6957e-05,2.8376000000000001e-05],"2228224":[0.390504974,0.39300178699999999],"36864":[0.0017198180000000001,0.00183819],"704":[3.8411000000000002e-05,4.0487e-05],"720896":[0.071512724,0.098418895999999978],"800":[2.5712e-05,2.8248000000000001e-05],"2621440":[0.55627283900000002,0.56600103600000007],"425984":[0.025176249000000032,0.027290877000000002],"32768":[0.001414958,0.0014940089999999999],"12058624":[4.2767162240000003,4.3799833279999998],"128":[4.109e-06,4.437e-06],"180224":[0.014321624,0.014498551],"224":[6.939e-06,7.5700000000000004e-06],"736":[4.1819000000000001e-05,4.5745999999999999e-05],"320":[1.3410999999999999e-05,1.3611999999999999e-05],"557056":[0.039241106999999997,0.049177539000000006],"832":[2.7311999999999999e-05,2.8523000000000001e-05],"9437184":[2.1452892860000001,2.155585876],"3584":[0.00013326200000000001,0.000145907],"6291456":[2.3624258500000002,2.365315039],"256":[8.7190000000000007e-06,1.0227999999999999e-05],"15204352":[3.0879451449999999,3.2991830480000002],"28672":[0.0011093640000000001,0.001202924],"768":[4.4412000000000001e-05,4.9913999999999997e-05],"212992":[0.010888591,0.011602527999999997],"864":[2.7789000000000001e-05,3.3623e-05],"352":[1.8870999999999999e-05,1.9267e-05],"253952":[0.015315255999999999,0.015512652],"960":[3.4486000000000002e-05,3.5954999999999997e-05],"24576":[0.0017272840000000004,0.001729129],"7680":[0.00030218000000000004,0.00035273499999999996],"294912":[0.020193464000000001,0.020685211000000002],"1048576":[0.10977929500000005,0.16206299499999999],"10485760":[2.6069020730000001,2.7245137069999998],"344064":[0.027876327000000006,0.029024964],"288":[1.0548e-05,1.1382999999999999e-05],"1152":[4.7868999999999999e-05,5.5430000000000003e-05],"384":[2.0723000000000001e-05,2.2646999999999998e-05],"2304":[9.8649999999999999e-05,0.00010936399999999999],"896":[3.0122999999999999e-05,3.2546000000000003e-05],"480":[1.5923e-05,1.8236999999999998e-05],"1441792":[0.24680698300000001,0.34653470800000002],"992":[3.9097000000000002e-05,4.0068000000000003e-05],"3968":[0.00015596499999999999,0.00016762099999999996],"6400":[0.00022585500000000007,0.00024461600000000002],"1344":[7.2517999999999999e-05,7.4300000000000004e-05],"126976":[0.006567906000000001,0.0069369470000000015],"2883584":[0.69497598900000002,0.76720370500000001],"753664":[0.085582728999999996,0.11347702999999998],"16384":[0.00067696899999999992,0.00077441200000000015],"131072":[0.0070390110000000004,0.0072888059999999992],"458752":[0.027939652999999998,0.033672393000000002],"172032":[0.012446830000000001,0.012784502],"12288":[0.00083101600000000007,0.00090790299999999984],"14680064":[2.9142767520000001,6.2384012310000001],"1536":[9.5209000000000003e-05,0.00011049499999999999],"25600":[0.00093597500000000002,0.000937165],"1835008":[0.25179325800000002,0.28531178700000004],"10752":[0.0005698700000000001,0.00058233199999999997],"21504":[0.0011771960000000001,0.001248582],"7602176":[1.477770665,1.526509321],"5632":[0.00031701099999999996,0.00035868799999999996],"10":[4.7399999999999998e-07,5.0900000000000002e-07],"3145728":[0.991291845,1.0325271220000001],"245760":[0.014062956,0.014928561999999998],"1728":[6.5933999999999996e-05,7.2065999999999997e-05],"11":[4.4299999999999998e-07,4.4799999999999999e-07],"1114112":[0.122794373,0.17620371100000001],"12":[4.8999999999999997e-07,5.5599999999999995e-07],"7340032":[1.3196067440000001,1.357100864],"7168":[0.00026832599999999994,0.00029393599999999996],"13":[5.4000000000000002e-07,5.4000000000000002e-07],"6029312":[1.925762376,1.9545833100000001],"14":[6.1200000000000003e-07,6.7199999999999998e-07],"3200":[0.00011816000000000001,0.00013107200000000004],"20":[6.3900000000000004e-07,7.6700000000000003e-07],"204800":[0.010430049,0.010988713000000001],"15":[6.0800000000000004e-07,6.5199999999999996e-07],"13312":[0.00048354800000000004,0.00052462500000000003],"4980736":[1.0986170749999999,1.1403303469999999],"118784":[0.0060219499999999999,0.0060425260000000003],"51200":[0.0020547599999999992,0.0020854720000000001],"16":[7.4799999999999997e-07,7.5799999999999998e-07],"21":[7.37e-07,7.6599999999999995e-07],"917504":[0.086384633000000002,0.12814883199999999],"22":[7.1900000000000002e-07,7.85e-07],"4864":[0.00021972700000000002,0.00022941300000000001],"17":[5.7700000000000004e-07,7.0299999999999998e-07],"14848":[0.00057548300000000001,0.00060011000000000027],"23":[8.1800000000000005e-07,1.015e-06],"786432":[0.098513083000000015,0.14770218900000001],"18":[6.3399999999999999e-07,7.5799999999999998e-07],"1638400":[0.20711790200000002,0.21832447199999999],"7864320":[1.5449679709999999,1.621881642],"24":[1.003e-06,1.1370000000000001e-06],"14155776":[2.9142418440000002,2.9345529030000002],"19":[6.2900000000000003e-07,6.99e-07],"30":[8.7300000000000005e-07,9.1999999999999998e-07],"25":[7.4000000000000001e-07,7.6799999999999999e-07],"31":[9.9199999999999999e-07,1.1170000000000001e-06],"1280":[6.0965999999999999e-05,6.5442000000000001e-05],"26":[7.0500000000000003e-07,8.85e-07],"3932160":[0.67268647100000001,0.73415630499999995],"2432":[0.00010861100000000002,0.00011994599999999998],"32":[9.5799999999999998e-07,1.136e-06],"27":[7.7199999999999998e-07,8.16e-07],"409600":[0.023002584,0.025173699000000004]}},{"title":"OrderedSet formIntersection with Array (50% overlap)","results":{"28":[9.0999999999999997e-07,9.6599999999999994e-07],"34":[1.5230000000000001e-06,1.6759999999999999e-06],"29":[8.7400000000000002e-07,1.0219999999999999e-06],"40":[1.8470000000000001e-06,2.3369999999999998e-06],"17408":[0.00093018000000000007,0.00095782500000000004],"1472":[9.3096000000000004e-05,0.000106944],"112":[4.7480000000000001e-06,4.7960000000000003e-06],"1376256":[0.23671066099999999,0.303785517],"5242880":[1.293303739,1.3281237420000001],"36":[1.6130000000000001e-06,1.9549999999999999e-06],"42":[2.1220000000000002e-06,2.3970000000000001e-06],"11534336":[3.8573215150000002,3.899479564],"114688":[0.0066582480000000003,0.0070586019999999989],"144":[6.6290000000000004e-06,7.2629999999999997e-06],"38":[1.753e-06,1.9010000000000001e-06],"240":[9.7909999999999999e-06,1.0396e-05],"9216":[0.00047999699999999996,0.00057125100000000027],"44":[2.2670000000000001e-06,2.4420000000000001e-06],"1664":[7.0413000000000005e-05,7.7105000000000001e-05],"196608":[0.019849311000000001,0.020074587999999997],"155648":[0.011650241,0.011749762],"2816":[0.00017554299999999998,0.000177789],"50":[2.012e-06,2.3530000000000002e-06],"2359296":[0.43427784699999999,0.47369381700000002],"46":[2.2689999999999998e-06,3.287e-06],"176":[1.0515e-05,1.1131000000000001e-05],"52":[2.2560000000000001e-06,2.289e-06],"272":[1.1433e-05,1.3872e-05],"116":[4.8010000000000003e-06,5.4999999999999999e-06],"47104":[0.003430223,0.0034522990000000011],"6912":[0.000329635,0.00034977200000000004],"1856":[8.3026000000000001e-05,8.5853000000000006e-05],"48":[2.5320000000000001e-06,3.5360000000000001e-06],"2097152":[0.35002236399999997,0.35653697299999998],"54":[2.5330000000000001e-06,2.5380000000000001e-06],"2031616":[0.32173983,0.327932206],"43008":[0.0027064430000000007,0.00277933],"60":[2.7329999999999999e-06,2.914e-06],"30720":[0.001506687,0.0016784],"56":[2.463e-06,2.6709999999999999e-06],"62":[2.8049999999999998e-06,2.9780000000000001e-06],"58":[2.5469999999999999e-06,3.0189999999999998e-06],"3014656":[0.803906291,0.87333535399999995],"64":[2.9739999999999998e-06,3.016e-06],"8388608":[2.0133074400000002,2.0514763079999998],"29696":[0.001501786,0.001551642],"216":[9.2110000000000004e-06,9.6090000000000007e-06],"106496":[0.0059485780000000004,0.0068028430000000003],"72":[3.4209999999999999e-06,3.4659999999999999e-06],"442368":[0.031901615000000008,0.037423593999999991],"147456":[0.010194139,0.010734298],"4456448":[0.99538470599999995,1.002511457],"63488":[0.0034673449999999993,0.0035314949999999999],"38912":[0.0022116430000000001,0.0023452060000000003],"68":[3.1e-06,3.444e-06],"188416":[0.017439761999999998,0.017912641],"248":[1.0023999999999999e-05,1.1454000000000001e-05],"80":[4.1570000000000002e-06,4.2930000000000002e-06],"2560":[0.0001439,0.00014992899999999998],"34816":[0.001843229,0.0018993],"3712":[0.000165045,0.00017476299999999995],"3538944":[0.64426157299999998,0.70792982999999998],"76":[4.138e-06,4.3309999999999997e-06],"4194304":[0.83781238099999999,0.84708356500000004],"851968":[0.089278247000000005,0.13756474099999999],"4096":[0.00021310399999999998,0.00021492200000000007],"59392":[0.0030356560000000003,0.0032999000000000001],"84":[4.2889999999999999e-06,4.6330000000000004e-06],"3276800":[0.58731681599999996,0.63322015599999992],"55296":[0.002789157,0.0029035810000000001],"688128":[0.068950899999999996,0.094162509000000019],"8192":[0.00040238300000000008,0.000440536],"10240":[0.00057797699999999992,0.00063453100000000003],"15872":[0.000797326,0.00083225899999999991],"92":[5.3689999999999998e-06,6.088e-06],"26624":[0.001293881,0.001328716],"1792":[7.8557e-05,9.2189999999999997e-05],"11776":[0.00081650499999999981,0.00086267700000000006],"2944":[0.000205701,0.000208533],"88":[4.8590000000000004e-06,5.3249999999999998e-06],"22528":[0.0015207549999999997,0.0015227910000000001],"1245184":[0.17457113899999999,0.23744997300000001],"15728640":[3.7289553600000001,3.9795525170000001],"96":[5.3569999999999997e-06,5.8780000000000003e-06],"1984":[9.0004000000000001e-05,0.000100394],"139264":[0.0094738670000000004,0.0098222920000000016],"475136":[0.036760463,0.044851239000000001],"13631488":[3.0392837090000002,3.5303294630000002],"416":[1.6078000000000001e-05,1.7929000000000001e-05],"928":[4.0153e-05,4.2460999999999999e-05],"512":[2.3691999999999999e-05,2.6403000000000001e-05],"18432":[0.0010459239999999997,0.0010584469999999999],"16777216":[4.316436972],"9728":[0.00051996599999999996,0.00053206200000000003],"1769472":[0.300883762,0.30236092399999998],"1703936":[0.259313126,0.27300081100000001],"2048":[9.9778000000000006e-05,0.000102934],"14336":[0.00068264299999999992,0.00068937499999999999],"448":[1.9021999999999998e-05,2.1508000000000001e-05],"5505024":[1.464596708,1.5557578940000001],"544":[2.7191000000000001e-05,2.7715000000000001e-05],"221184":[0.014323336000000002,0.015274911],"90112":[0.0064390279999999994,0.0070657009999999989],"640":[3.6037000000000001e-05,3.8732000000000001e-05],"12800":[0.00056350900000000002,0.00058940000000000012],"262144":[0.018134722000000002,0.021804861000000002],"589824":[0.054130622999999989,0.066333008999999998],"884736":[0.089135004000000004,0.13198142400000001],"6144":[0.00043525400000000004,0.00045216599999999994],"1088":[5.4252000000000002e-05,5.5767000000000003e-05],"576":[2.7284000000000002e-05,2.8282000000000001e-05],"160":[7.7800000000000001e-06,9.0999999999999993e-06],"672":[3.9391000000000003e-05,4.2035e-05],"8912896":[2.199474521,2.3517886429999999],"100":[4.0899999999999998e-06,4.4530000000000004e-06],"507904":[0.039231729999999999,0.048318350999999995],"3840":[0.00017916200000000002,0.00018610499999999999],"192":[1.1072e-05,1.4511999999999999e-05],"376832":[0.037354308999999995,0.040194321000000005],"98304":[0.0084904890000000004,0.0087742340000000005],"5376":[0.00030980500000000002,0.00032456599999999998],"94208":[0.0072597339999999995,0.0075252310000000003],"81920":[0.0052475119999999984,0.0055262940000000002],"3407872":[0.64356112199999993,0.73446526999999995],"104":[4.2479999999999998e-06,4.9389999999999996e-06],"122880":[0.0073923240000000005,0.0077921939999999997],"200":[7.5120000000000002e-06,7.9119999999999998e-06],"163840":[0.013015611,0.013306672],"4063232":[0.81065970399999998,0.84743322799999998],"5767168":[1.655256128,1.6915710859999999],"12582912":[4.8257612319999996,5.3004649520000005],"1600":[7.3026000000000002e-05,8.0562999999999994e-05],"136":[6.3049999999999998e-06,7.345e-06],"232":[9.7440000000000002e-06,1.0078000000000001e-05],"7077888":[1.497754019,1.71395538],"86016":[0.0058829119999999988,0.0061346609999999987],"31744":[0.0016014639999999999,0.00183483],"168":[8.7280000000000001e-06,9.9299999999999998e-06],"622592":[0.059868781000000003,0.078039539000000005],"108":[4.0759999999999996e-06,4.2320000000000003e-06],"327680":[0.027620094000000001,0.027648277999999998],"2176":[0.000108812,0.000113639],"3328":[0.00014356900000000002,0.000150879],"1":[1.5200000000000001e-07,1.5900000000000001e-07],"2":[2.5499999999999999e-07,2.5800000000000001e-07],"3":[2.5699999999999999e-07,2.96e-07],"4":[2.84e-07,2.9400000000000001e-07],"7424":[0.00034658700000000003,0.00035985900000000003],"5":[3.6600000000000002e-07,4.0999999999999999e-07],"23552":[0.001641078,0.001676608],"6":[3.6300000000000001e-07,4.15e-07],"61440":[0.0032350640000000002,0.0033325759999999994],"491520":[0.037811648000000003,0.048916295999999998],"77824":[0.0047560409999999982,0.0049828449999999988],"7":[3.9799999999999999e-07,4.2199999999999999e-07],"8":[4.0400000000000002e-07,4.8100000000000003e-07],"208":[8.1170000000000004e-06,8.8990000000000007e-06],"9":[4.1600000000000002e-07,4.32e-07],"73728":[0.0044184660000000002,0.004529277],"304":[1.4268e-05,1.4620000000000001e-05],"400":[1.5688e-05,1.7045e-05],"1310720":[0.209192139,0.28914237500000001],"336":[1.7235e-05,1.9550000000000001e-05],"3670016":[0.68863439400000004,0.704497759],"6656":[0.00029445599999999996,0.00031999600000000002],"15360":[0.00074404799999999998,0.00075871200000000004],"432":[1.7320999999999999e-05,1.7986e-05],"950272":[0.101192147,0.15906108600000002],"655360":[0.065241478000000033,0.084775317000000003],"69632":[0.0040239259999999989,0.0041836879999999996],"11264":[0.00070712500000000007,0.00075634899999999991],"2752512":[0.61724222399999995,0.66846264700000002],"8126464":[1.861954927,1.9562255930000001],"27648":[0.00131255,0.001380994],"368":[2.1827e-05,2.402e-05],"65536":[0.003535875,0.0037809849999999997],"16252928":[4.1234819849999997],"464":[1.9766999999999999e-05,2.1024000000000001e-05],"1015808":[0.114585564,0.17939693000000001],"3072":[0.00021970100000000002,0.00023107799999999996],"110592":[0.0065706660000000002,0.0067813579999999995],"237568":[0.016527085,0.016902546000000001],"278528":[0.020762355,0.022547735000000003],"496":[2.1999000000000001e-05,2.2396e-05],"13107200":[3.0110447140000001,3.233926485],"9961472":[2.4874860729999999,2.76889954],"5888":[0.00038196400000000004,0.00039723599999999992],"11010048":[3.1327670009999999,3.1708922290000001],"1920":[8.5513999999999995e-05,8.8102000000000005e-05],"2490368":[0.484820841,0.56872998200000002],"19456":[0.0010929189999999997,0.00112652],"57344":[0.0029082929999999997,0.0030128360000000001],"1179648":[0.188113892,0.23237354199999999],"4718592":[1.075141436,1.1390686510000001],"360448":[0.036258169,0.037471333000000002],"1572864":[0.33475682600000001,0.37047093199999998],"53248":[0.0025965269999999995,0.0026402829999999998],"3456":[0.00015946800000000001,0.00016638299999999998],"40960":[0.0024391130000000001,0.0024898810000000002],"4608":[0.000231599,0.000236159],"13824":[0.00065718000000000026,0.000669861],"819200":[0.07641761100000001,0.12659437100000001],"983040":[0.114079521,0.15202739800000001],"8704":[0.00044210099999999997,0.000475651],"120":[5.0819999999999998e-06,5.2750000000000003e-06],"1024":[4.6681999999999998e-05,4.8347000000000003e-05],"49152":[0.0036048230000000001,0.0037581509999999999],"524288":[0.040958122,0.052489627999999997],"45056":[0.0029738499999999992,0.003167384000000001],"229376":[0.015663972000000005,0.015758956000000001],"2688":[0.00015791199999999999,0.00016837700000000004],"152":[6.8759999999999999e-06,7.8420000000000005e-06],"5120":[0.00028136700000000003,0.00029380900000000002],"1507328":[0.28604143799999998,0.43299988300000003],"1216":[6.5526999999999998e-05,7.2071999999999997e-05],"1966080":[0.30300730799999998,0.32781808499999998],"1900544":[0.292350424,0.30438283300000002],"184":[1.1253999999999999e-05,1.2289e-05],"7936":[0.000377217,0.00038091300000000008],"3801088":[0.71821339000000006,0.75679319999999994],"6815744":[1.4338717160000001,1.590688906],"124":[5.49e-06,5.7010000000000001e-06],"102400":[0.0058098579999999993,0.0058435589999999999],"311296":[0.024704316,0.026397843000000032],"1408":[8.1298999999999995e-05,8.9561999999999994e-05],"393216":[0.043341895000000005,0.043825665],"4352":[0.00021391000000000002,0.00022142899999999998],"6553600":[1.3235838170000001,1.4834802220000001],"20480":[0.001211185,0.001226946],"608":[3.0378e-05,3.2926999999999998e-05],"2228224":[0.38782807000000002,0.44158985299999998],"36864":[0.0020983020000000002,0.0021653640000000004],"704":[3.9437000000000002e-05,4.4481999999999999e-05],"720896":[0.076892350000000012,0.113163638],"800":[3.2632999999999997e-05,3.4891000000000002e-05],"2621440":[0.543791421,0.58818203499999999],"425984":[0.031650464000000017,0.034552966999999976],"32768":[0.0016844829999999994,0.001814567],"12058624":[4.1505847710000001,4.3320390570000002],"128":[5.2140000000000004e-06,5.8250000000000001e-06],"180224":[0.015729147999999991,0.015991617],"224":[8.9940000000000006e-06,9.5570000000000001e-06],"736":[5.0442999999999998e-05,5.1501e-05],"320":[1.5379999999999998e-05,1.6711e-05],"557056":[0.044697608999999999,0.056287521],"832":[3.3362999999999999e-05,3.5975e-05],"9437184":[2.3317159690000002,2.7051601079999998],"3584":[0.000160889,0.00017644399999999997],"6291456":[2.3213419860000002,2.3573062939999998],"256":[1.1136e-05,1.2711000000000001e-05],"15204352":[3.6387671269999999,3.9549361379999999],"28672":[0.0013775079999999999,0.0014461600000000002],"768":[5.0766999999999997e-05,5.5637999999999998e-05],"212992":[0.013276384,0.013891634],"864":[3.5887999999999999e-05,4.1437000000000003e-05],"352":[2.0571e-05,2.1849999999999999e-05],"253952":[0.018560813000000002,0.019117573999999998],"960":[4.4328e-05,4.6805000000000003e-05],"24576":[0.001874807,0.001922244],"7680":[0.00036842999999999999,0.00043070100000000002],"294912":[0.023170342,0.023679666000000005],"1048576":[0.121774602,0.18541748399999999],"10485760":[2.778578837,2.8325267329999999],"344064":[0.031465907000000001,0.03263609499999999],"288":[1.2991e-05,1.3782e-05],"1152":[5.6963999999999999e-05,6.1131999999999997e-05],"384":[2.4532000000000002e-05,2.4715999999999998e-05],"2304":[0.000119988,0.00013166600000000001],"896":[3.8287999999999997e-05,3.9839000000000003e-05],"480":[1.9823e-05,2.2317e-05],"1441792":[0.26189164200000004,0.37058479799999999],"992":[4.8328999999999998e-05,5.1950000000000002e-05],"3968":[0.00019698599999999999,0.000202816],"6400":[0.00027804099999999998,0.00028759199999999998],"1344":[8.0122000000000003e-05,8.5365999999999995e-05],"126976":[0.0079678759999999987,0.0082778290000000004],"2883584":[0.70721261000000002,0.78767855200000003],"753664":[0.089725210999999999,0.117264574],"16384":[0.00082800399999999991,0.00091235999999999986],"131072":[0.008584244999999999,0.0088061219999999753],"458752":[0.03342009700000001,0.039416860999999997],"172032":[0.014086448,0.014384513],"12288":[0.00088556500000000016,0.00098867600000000018],"14680064":[3.4694784460000001,10.159041668],"1536":[0.000106644,0.000121889],"25600":[0.0011743679999999999,0.00119849],"1835008":[0.28245109200000001,0.31026416599999995],"10752":[0.00063308900000000009,0.000686986],"21504":[0.0013257120000000002,0.001386452],"7602176":[1.685969337,1.694820607],"5632":[0.00033853999999999991,0.00037199200000000003],"10":[4.4499999999999997e-07,4.5400000000000002e-07],"3145728":[0.92622948599999999,0.941611584],"245760":[0.017035672000000009,0.018390783000000004],"1728":[7.8270999999999997e-05,8.7847000000000001e-05],"11":[4.4400000000000001e-07,4.5600000000000001e-07],"1114112":[0.14081180300000001,0.18725673500000001],"12":[4.9999999999999998e-07,5.0399999999999996e-07],"7340032":[1.6332925760000001,1.7230915709999999],"7168":[0.00033194800000000004,0.00037854800000000009],"13":[4.8100000000000003e-07,5.3399999999999999e-07],"6029312":[1.88911911,1.952559041],"14":[5.4499999999999997e-07,6.0800000000000004e-07],"3200":[0.00014318099999999998,0.00015129600000000004],"20":[6.5499999999999998e-07,7.1999999999999999e-07],"204800":[0.013339463999999999,0.013882056],"15":[5.5400000000000001e-07,6.3099999999999997e-07],"13312":[0.00061935400000000013,0.00064291700000000001],"4980736":[1.1930811590000001,1.283308154],"118784":[0.0072893190000000007,0.0073384380000000001],"51200":[0.002460711,0.0027819290000000003],"16":[6.0999999999999998e-07,6.8500000000000001e-07],"21":[7.9999999999999996e-07,8.0299999999999998e-07],"917504":[0.097014970000000006,0.13979687900000001],"22":[7.9500000000000001e-07,8.3099999999999996e-07],"4864":[0.00025519200000000001,0.00029749699999999992],"17":[6.13e-07,7.2900000000000003e-07],"14848":[0.00075407600000000001,0.00075774900000000005],"23":[8.2500000000000004e-07,1.1930000000000001e-06],"786432":[0.116211707,0.15094053399999999],"18":[6.7999999999999995e-07,6.8599999999999998e-07],"1638400":[0.23471671799999999,0.243163244],"7864320":[1.8382024480000001,1.8923616750000001],"24":[1.0079999999999999e-06,1.031e-06],"14155776":[3.364326149,3.5042885180000001],"19":[6.4499999999999997e-07,7.8199999999999999e-07],"30":[9.5300000000000002e-07,9.5499999999999996e-07],"25":[8.0299999999999998e-07,8.3099999999999996e-07],"31":[1.5990000000000001e-06,1.824e-06],"1280":[6.7742000000000003e-05,7.0852000000000005e-05],"26":[7.6700000000000003e-07,8.4499999999999996e-07],"3932160":[0.79182550500000004,0.86463736899999999],"2432":[0.00013174899999999996,0.00013796500000000001],"32":[1.486e-06,1.7069999999999999e-06],"27":[8.1900000000000001e-07,8.1900000000000001e-07],"409600":[0.028222901000000002,0.030537040000000005]}},{"title":"OrderedSet formIntersection with Array (75% overlap)","results":{"28":[1.756e-06,2.007e-06],"34":[1.979e-06,2.0389999999999999e-06],"29":[1.7129999999999999e-06,2.0509999999999999e-06],"40":[2.3539999999999998e-06,2.4559999999999999e-06],"17408":[0.00102717,0.001058095],"1472":[9.8678999999999995e-05,0.000105215],"112":[5.8719999999999999e-06,6.0109999999999997e-06],"1376256":[0.22990893300000001,0.34026605599999998],"5242880":[1.367708207,1.48254785],"36":[1.9439999999999999e-06,2.1900000000000002e-06],"42":[2.5639999999999999e-06,2.9009999999999998e-06],"11534336":[3.6943321899999999,3.9403886699999999],"114688":[0.0082745730000000003,0.0086530319999999997],"144":[7.4569999999999999e-06,8.2849999999999995e-06],"38":[2.1220000000000002e-06,2.5639999999999999e-06],"240":[1.2439000000000001e-05,1.3421000000000001e-05],"9216":[0.00053121800000000018,0.00062640300000000009],"44":[2.5830000000000001e-06,3.326e-06],"1664":[9.4846000000000006e-05,9.6522999999999997e-05],"196608":[0.020173447000000004,0.021345914000000001],"155648":[0.012915421,0.013288926],"2816":[0.00018277999999999998,0.000186391],"50":[2.5100000000000001e-06,2.666e-06],"2359296":[0.49582210399999999,0.49945351000000004],"46":[2.7719999999999999e-06,3.2550000000000002e-06],"176":[1.0467e-05,1.164e-05],"52":[2.7760000000000002e-06,2.7779999999999999e-06],"272":[1.3345e-05,1.6116e-05],"116":[5.823e-06,7.1149999999999996e-06],"47104":[0.0034207080000000002,0.0036701659999999999],"6912":[0.00039101499999999993,0.0004283440000000001],"1856":[0.00010529699999999999,0.00011033499999999999],"48":[2.8049999999999998e-06,3.2490000000000001e-06],"2097152":[0.38659659299999999,0.40030207299999998],"54":[3.0630000000000002e-06,3.1939999999999998e-06],"2031616":[0.35199311599999999,0.38443313400000001],"43008":[0.0028683049999999998,0.0030040879999999998],"60":[3.5269999999999999e-06,3.529e-06],"30720":[0.001938433,0.0020956339999999999],"56":[3.0369999999999999e-06,3.2590000000000001e-06],"62":[3.4520000000000002e-06,4.0330000000000002e-06],"58":[3.0690000000000002e-06,3.4970000000000001e-06],"3014656":[0.77804454700000003,0.84671520300000003],"64":[3.6880000000000001e-06,3.7100000000000001e-06],"8388608":[2.3559815510000002,2.422265763],"29696":[0.001870926,0.0019207060000000005],"216":[1.1907e-05,1.2075e-05],"106496":[0.0075889159999999994,0.0076601619999999999],"72":[4.0319999999999997e-06,4.6269999999999999e-06],"442368":[0.039003916999999999,0.048066112999999994],"147456":[0.011353569000000001,0.012001404],"4456448":[1.064831708,1.1607143790000001],"63488":[0.0042076479999999987,0.0043633249999999995],"38912":[0.0024282069999999995,0.0025388860000000002],"68":[3.8929999999999998e-06,4.1980000000000003e-06],"188416":[0.018021845000000002,0.019717256000000002],"248":[1.3165e-05,1.4344e-05],"80":[4.4349999999999999e-06,4.8729999999999998e-06],"2560":[0.00015817900000000002,0.00016454799999999998],"34816":[0.002074195,0.0021678859999999999],"3712":[0.00022412000000000002,0.000231203],"3538944":[0.71321837500000007,0.746763277],"76":[4.8450000000000002e-06,4.9690000000000002e-06],"4194304":[0.93174889699999996,0.99756693500000004],"851968":[0.10493230200000001,0.160511822],"4096":[0.000272193,0.00027431499999999996],"59392":[0.003765806,0.0040835920000000005],"84":[4.916e-06,5.3040000000000004e-06],"3276800":[0.66283024899999998,0.68490649700000006],"55296":[0.0034186360000000005,0.0036225099999999998],"688128":[0.074840779999999996,0.094184415999999993],"8192":[0.00052833900000000007,0.00056103200000000037],"10240":[0.00064970200000000016,0.00067781200000000008],"15872":[0.0010129289999999999,0.001059611],"92":[5.7119999999999997e-06,6.353e-06],"26624":[0.0016039629999999999,0.0016544360000000364],"1792":[0.000109101,0.000116273],"11776":[0.00082535099999999999,0.00087697399999999998],"2944":[0.00020771600000000001,0.00022831899999999999],"88":[5.6080000000000003e-06,5.8470000000000001e-06],"22528":[0.001570564,0.001653755],"1245184":[0.19095771,0.26547689800000002],"15728640":[4.2488337270000001,4.5791926170000004],"96":[6.0739999999999998e-06,6.9630000000000001e-06],"1984":[0.00011631,0.000118832],"139264":[0.010657415,0.010723176000000001],"475136":[0.045582625000000002,0.059084879],"13631488":[3.530201769,4.0514480690000001],"416":[2.1356e-05,2.2773e-05],"928":[5.1155000000000001e-05,5.5281000000000001e-05],"512":[3.0802000000000001e-05,3.4425999999999999e-05],"18432":[0.0011119469999999998,0.0012064979999999999],"16777216":[4.722550118],"9728":[0.00059845799999999974,0.000603302],"1769472":[0.29572674799999998,0.40348703899999999],"1703936":[0.27511266099999998,0.28494270700000002],"2048":[0.000123268,0.000134855],"14336":[0.00084317000000000007,0.00086215900000000015],"448":[2.3901999999999999e-05,2.7429000000000001e-05],"5505024":[1.5688514900000001,1.6877745740000001],"544":[3.0267e-05,3.3871000000000001e-05],"221184":[0.017616159999999999,0.017653202999999999],"90112":[0.0068368959999999994,0.0070148659999999998],"640":[3.8581999999999998e-05,4.1019000000000001e-05],"12800":[0.00074196499999999981,0.0008136189999999998],"262144":[0.022287468999999997,0.024659455],"589824":[0.062660924000000034,0.070499370000000033],"884736":[0.116552317,0.16822921099999999],"6144":[0.00043214099999999993,0.000460626],"1088":[6.1080000000000005e-05,6.2343999999999998e-05],"576":[3.0627999999999999e-05,3.1489000000000003e-05],"160":[8.7010000000000002e-06,1.0730999999999999e-05],"672":[4.2289000000000001e-05,4.4282000000000001e-05],"8912896":[2.4018639390000001,2.4364424069999999],"100":[4.9869999999999999e-06,5.536e-06],"507904":[0.047394885999999997,0.061394803000000012],"3840":[0.00023616900000000005,0.00025140700000000004],"192":[1.243e-05,1.3324e-05],"376832":[0.039183877999999991,0.042715104000000018],"98304":[0.0084146919999999979,0.0085474509999999993],"5376":[0.00033689099999999992,0.00034262699999999997],"94208":[0.007663558,0.0079048309999999993],"81920":[0.0057565759999999985,0.0060266139999999987],"3407872":[0.68505868699999994,0.76063730100000004],"104":[5.2270000000000001e-06,6.2689999999999996e-06],"122880":[0.0093495390000000022,0.0099467290000000014],"200":[9.3999999999999998e-06,1.007e-05],"163840":[0.014159626,0.014480992],"4063232":[0.87881254600000003,0.93218526599999996],"5767168":[1.7670387000000001,1.8282641260000001],"12582912":[4.7786064469999996,5.0562883049999998],"1600":[9.1300999999999999e-05,9.1695999999999998e-05],"136":[7.2150000000000004e-06,7.7659999999999998e-06],"232":[1.2035000000000001e-05,1.2847000000000001e-05],"7077888":[1.827135475,1.982673342],"86016":[0.0064927240000000009,0.0066331100000000002],"31744":[0.0020667949999999997,0.0021698940000000003],"168":[9.2720000000000003e-06,1.0553999999999999e-05],"622592":[0.065220181999999988,0.09163023599999999],"108":[5.3369999999999999e-06,5.4539999999999998e-06],"327680":[0.030351308,0.030710345],"2176":[0.00012350500000000002,0.000129462],"3328":[0.00017950100000000001,0.000212284],"1":[1.5200000000000001e-07,1.5900000000000001e-07],"2":[1.8e-07,1.8300000000000001e-07],"3":[1.8099999999999999e-07,1.99e-07],"4":[3.22e-07,3.5900000000000003e-07],"7424":[0.00043515199999999996,0.00047601500000000004],"5":[3.5699999999999998e-07,3.77e-07],"23552":[0.0016733849999999999,0.0017654670000000004],"6":[3.7500000000000001e-07,3.9900000000000001e-07],"61440":[0.0040617050000000005,0.0040886890000000359],"491520":[0.048783655999999995,0.053642624999999999],"77824":[0.0053417819999999989,0.005621021999999999],"7":[3.6800000000000001e-07,4.03e-07],"8":[3.9499999999999998e-07,4.4000000000000002e-07],"208":[1.0581000000000001e-05,1.1095e-05],"9":[4.5299999999999999e-07,4.6400000000000003e-07],"73728":[0.0049679110000000002,0.0051266250000000001],"304":[1.6429000000000001e-05,1.6772000000000001e-05],"400":[1.9627999999999999e-05,2.1664000000000001e-05],"1310720":[0.22530575,0.32748438299999999],"336":[1.9287e-05,2.1396999999999999e-05],"3670016":[0.75844540500000002,0.790148293],"6656":[0.00036818000000000002,0.00040410499999999998],"15360":[0.00094172200000000009,0.00096320399999999995],"432":[2.3315999999999998e-05,2.3723999999999999e-05],"950272":[0.11865547999999999,0.17808473999999999],"655360":[0.068416585000000002,0.097177818999999999],"69632":[0.0046356090000000006,0.0047517830000000007],"11264":[0.000759467,0.00077151100000000001],"2752512":[0.66372926399999999,0.71930576299999993],"8126464":[2.2119995700000001,2.2274238749999999],"27648":[0.001665637,0.0017478770000000001],"368":[2.2135000000000001e-05,2.5673e-05],"65536":[0.0045138069999999999,0.004674994],"16252928":[4.6259059530000002],"464":[2.5616999999999999e-05,2.6752000000000001e-05],"1015808":[0.13231501000000001,0.20328007300000001],"3072":[0.00020905500000000001,0.000230332],"110592":[0.0082350519999999997,0.0082495660000000016],"237568":[0.020347181999999998,0.020953982000000003],"278528":[0.025246529,0.026206773999999995],"496":[2.8629999999999999e-05,3.0698000000000003e-05],"13107200":[3.310321268,3.8162461350000001],"9961472":[2.9202825190000001,2.998585335],"5888":[0.00042364099999999994,0.000426203],"11010048":[3.3421771329999999,3.5330784479999999],"1920":[0.000113515,0.000121468],"2490368":[0.52765654399999995,0.620039495],"19456":[0.001220882,0.0012604510000000003],"57344":[0.003692893,0.0036976750000000001],"1179648":[0.171573947,0.23566373399999996],"4718592":[1.253116213,1.2533496290000001],"360448":[0.038475741000000008,0.040088817000000013],"1572864":[0.343834164,0.403946158],"53248":[0.0032464850000000003,0.003351719999999999],"3456":[0.000189989,0.00020841800000000001],"40960":[0.0027014450000000002,0.00273865],"4608":[0.000261444,0.00026917],"13824":[0.0008231810000000003,0.00086466700000000006],"819200":[0.089722043999999973,0.15155748299999999],"983040":[0.13475516800000001,0.17550731899999999],"8704":[0.00050725,0.00056813800000000004],"120":[6.8050000000000001e-06,7.1099999999999997e-06],"1024":[5.8059000000000001e-05,6.5048000000000005e-05],"49152":[0.0036718390000000005,0.0038213559999999993],"524288":[0.049149749,0.065184505000000018],"45056":[0.0030779190000000006,0.0032719709999999998],"229376":[0.019544939000000001,0.020750237999999997],"2688":[0.000171058,0.00018134999999999999],"152":[7.8599999999999993e-06,9.0629999999999995e-06],"5120":[0.00031735699999999999,0.00031942400000000001],"1507328":[0.28348139500000002,0.42544895399999999],"1216":[7.2558000000000006e-05,7.9290999999999997e-05],"1966080":[0.32633183199999999,0.34963701199999997],"1900544":[0.32780494300000002,0.35526537199999997],"184":[1.1987000000000001e-05,1.2459999999999999e-05],"7936":[0.00050701800000000003,0.00052531099999999999],"3801088":[0.80274098500000002,0.86051698500000007],"6815744":[1.6285144360000001,1.9003770339999999],"124":[7.3520000000000001e-06,7.374e-06],"102400":[0.0072442389999999995,0.0072600330000000017],"311296":[0.027816664000000001,0.029760191000000002],"1408":[8.9751000000000002e-05,9.4000999999999997e-05],"393216":[0.045001060999999995,0.047289166000000001],"4352":[0.000238707,0.00026171800000000003],"6553600":[1.586580745,1.766072511],"20480":[0.0014002979999999999,0.0014409969999999999],"608":[3.3667000000000001e-05,3.6362000000000002e-05],"2228224":[0.43478417899999999,0.437840538],"36864":[0.0022685690000000002,0.002368972],"704":[4.2865999999999999e-05,4.5945000000000001e-05],"720896":[0.08180030100000002,0.121311032],"800":[4.2437e-05,4.4477000000000001e-05],"2621440":[0.56957164299999996,0.66326149400000001],"425984":[0.039202071000000005,0.039865143999999998],"32768":[0.0021371130000000004,0.0022544610000000001],"12058624":[4.317279954,4.438690952],"128":[6.6889999999999998e-06,7.7929999999999998e-06],"180224":[0.016585661999999998,0.016996696000000006],"224":[1.1297999999999999e-05,1.1379000000000001e-05],"736":[5.1950999999999998e-05,5.3767000000000002e-05],"320":[1.7816e-05,1.8448e-05],"557056":[0.051183132999999992,0.068635230000000019],"832":[4.2982999999999998e-05,4.5742999999999999e-05],"9437184":[2.7633426440000002,3.0634375550000001],"3584":[0.00021088199999999999,0.00022265100000000001],"6291456":[2.1324703079999998,2.2495114279999999],"256":[1.4211e-05,1.717e-05],"15204352":[4.2570135999999996,4.6996027859999998],"28672":[0.0017469969999999997,0.0018486189999999999],"768":[5.0192000000000003e-05,5.3563000000000002e-05],"212992":[0.016299889000000001,0.017174576],"864":[4.9305000000000003e-05,4.9459999999999997e-05],"352":[2.1974999999999999e-05,2.2291000000000001e-05],"253952":[0.022032886999999998,0.022863458999999996],"960":[5.6227999999999998e-05,6.0458000000000003e-05],"24576":[0.0019154180000000003,0.0019554000000000004],"7680":[0.00046589200000000003,0.00055077699999999991],"294912":[0.025406214,0.027158307],"1048576":[0.13791729100000005,0.21280269100000004],"10485760":[3.229283927,3.2311522510000001],"344064":[0.035097929,0.035820324000000001],"288":[1.4007e-05,1.5894999999999999e-05],"1152":[6.4684999999999995e-05,6.9061999999999997e-05],"384":[2.3932999999999999e-05,2.6026000000000001e-05],"2304":[0.00012844700000000001,0.000141235],"896":[5.0617e-05,5.2868999999999998e-05],"480":[2.6707e-05,2.9847000000000001e-05],"1441792":[0.26495518800000001,0.38984005700000002],"992":[6.2644999999999994e-05,6.8631000000000001e-05],"3968":[0.000235045,0.00024434000000000001],"6400":[0.00034452199999999999,0.00036510399999999999],"1344":[7.8841e-05,7.9313000000000004e-05],"126976":[0.0098388940000000008,0.010228335],"2883584":[0.71319356200000006,0.77719123300000004],"753664":[0.099993238000000026,0.11522744900000004],"16384":[0.0010676100000000003,0.0011234090000000001],"131072":[0.010714339999999999,0.010944407999999999],"458752":[0.040555682999999995,0.047404061999999997],"172032":[0.014847811000000002,0.015022003000000001],"12288":[0.00091482399999999985,0.00091903299999999998],"14680064":[3.8822459569999999,7.0847281039999999],"1536":[0.000101236,0.00012566299999999998],"25600":[0.0014834800000000001,0.0015354400000000001],"1835008":[0.30982690400000001,0.35849571200000002],"10752":[0.00068514900000000002,0.00074396600000000009],"21504":[0.001384925,0.0015409149999999999],"7602176":[1.992664234,2.0206618660000002],"5632":[0.00037708000000000001,0.000415206],"10":[4.5400000000000002e-07,4.8500000000000002e-07],"3145728":[0.922085347,0.93199819900000003],"245760":[0.020574473000000006,0.021594013999999998],"1728":[0.000103124,0.00010590400000000001],"11":[4.7300000000000001e-07,5.2499999999999995e-07],"1114112":[0.162412414,0.21387513700000005],"12":[5.1099999999999996e-07,5.5400000000000001e-07],"7340032":[1.8454879070000001,1.9197847219999999],"7168":[0.00041368699999999998,0.00045059899999999999],"13":[5.1799999999999995e-07,5.2499999999999995e-07],"6029312":[1.931483351,1.947588796],"14":[5.8299999999999997e-07,6.2099999999999996e-07],"3200":[0.00017665199999999999,0.000193554],"20":[6.6400000000000002e-07,8.3399999999999998e-07],"204800":[0.015758678000000005,0.016878291],"15":[6.1799999999999995e-07,6.5400000000000001e-07],"13312":[0.00074686800000000014,0.00079309900000000002],"4980736":[1.287044262,1.3008111389999999],"118784":[0.009027865999999999,0.0091105209999999982],"51200":[0.0030289650000000002,0.0031979550000000002],"16":[6.3799999999999997e-07,6.9800000000000003e-07],"21":[1.446e-06,1.474e-06],"917504":[0.11161501699999998,0.14360139100000002],"22":[1.418e-06,1.5820000000000001e-06],"4864":[0.00029652899999999997,0.000307752],"17":[6.3499999999999996e-07,7.5300000000000003e-07],"14848":[0.00088943399999999993,0.0009571400000000001],"23":[1.4419999999999999e-06,1.6640000000000001e-06],"786432":[0.101034556,0.158880831],"18":[6.6899999999999997e-07,7.3399999999999998e-07],"1638400":[0.264048369,0.26878748299999999],"7864320":[2.0564276100000001,2.0658452249999999],"24":[1.6509999999999999e-06,1.765e-06],"14155776":[3.96200646,4.1472316359999999],"19":[6.7299999999999995e-07,6.8899999999999999e-07],"30":[1.764e-06,1.807e-06],"25":[1.516e-06,1.5570000000000001e-06],"31":[2.007e-06,2.137e-06],"1280":[7.9574999999999996e-05,7.9713000000000001e-05],"26":[1.4410000000000001e-06,1.7099999999999999e-06],"3932160":[0.81837798699999997,0.87037711500000003],"2432":[0.00013769800000000004,0.00015106400000000002],"32":[1.8309999999999999e-06,2.2520000000000002e-06],"27":[1.6130000000000001e-06,1.7799999999999999e-06],"409600":[0.034317667000000017,0.039616069000000004]}},{"title":"OrderedSet formIntersection with Array (100% overlap)","results":{"28":[7.4099999999999998e-07,8.1699999999999997e-07],"34":[8.2099999999999995e-07,9.2999999999999999e-07],"29":[7.2200000000000003e-07,7.8899999999999998e-07],"40":[9.2500000000000004e-07,1.077e-06],"17408":[0.00048259700000000008,0.00054781299999999997],"1472":[4.7307e-05,4.7444000000000002e-05],"112":[2.4739999999999999e-06,2.571e-06],"1376256":[0.15714419299999999,0.26288398899999998],"5242880":[0.95902576299999998,0.96690418],"36":[8.2500000000000004e-07,9.6700000000000002e-07],"42":[1.0279999999999999e-06,1.158e-06],"11534336":[2.2937110839999999,2.5657321820000001],"114688":[0.004534672,0.0046576590000000006],"144":[3.4170000000000001e-06,3.6519999999999999e-06],"38":[9.0400000000000005e-07,1.051e-06],"240":[5.3900000000000001e-06,5.5219999999999998e-06],"9216":[0.00028144300000000004,0.00030320500000000008],"44":[1.062e-06,1.294e-06],"1664":[3.8720000000000002e-05,4.0142999999999998e-05],"196608":[0.011258026000000003,0.011696758],"155648":[0.0078739900000000008,0.0079443220000000002],"2816":[9.1693000000000005e-05,9.1906999999999999e-05],"50":[1.074e-06,1.1179999999999999e-06],"2359296":[0.37230104399999997,0.400551926],"46":[1.093e-06,1.3340000000000001e-06],"176":[4.8359999999999999e-06,4.9429999999999999e-06],"52":[1.206e-06,1.2500000000000001e-06],"272":[5.9139999999999996e-06,7.4610000000000002e-06],"116":[2.5019999999999999e-06,2.9890000000000001e-06],"47104":[0.0016518799999999997,0.001781517],"6912":[0.000178505,0.00018404699999999998],"1856":[4.5652000000000003e-05,4.7027000000000002e-05],"48":[1.1999999999999999e-06,1.5340000000000001e-06],"2097152":[0.27512628300000003,0.34512153499999998],"54":[1.2950000000000001e-06,1.313e-06],"2031616":[0.25720734099999998,0.26770841700000003],"43008":[0.0014415559999999999,0.001505248],"60":[1.474e-06,1.513e-06],"30720":[0.000858528,0.00088894899999999977],"56":[1.2729999999999999e-06,1.367e-06],"62":[1.5099999999999999e-06,1.576e-06],"58":[1.3090000000000001e-06,1.401e-06],"3014656":[0.57523217900000001,0.59322529000000002],"64":[1.4589999999999999e-06,1.5579999999999999e-06],"8388608":[1.451901898,1.551580535],"29696":[0.000787858,0.00080061199999999981],"216":[5.0250000000000002e-06,5.1850000000000003e-06],"106496":[0.0038750240000000004,0.0039367990000000004],"72":[1.697e-06,1.7770000000000001e-06],"442368":[0.020336426999999997,0.027608968000000001],"147456":[0.0065379930000000006,0.0067403560000000003],"4456448":[0.78444522800000005,0.85895994399999998],"63488":[0.001886502,0.001954978],"38912":[0.0011886430000000001,0.001234254],"68":[1.6780000000000001e-06,1.7829999999999999e-06],"188416":[0.010404578000000001,0.010744658000000001],"248":[5.3589999999999999e-06,6.1199999999999999e-06],"80":[1.8780000000000001e-06,2.4380000000000002e-06],"2560":[7.4348e-05,7.6928000000000006e-05],"34816":[0.0010072779999999999,0.0011439360000000003],"3712":[9.0952999999999995e-05,9.4159000000000004e-05],"3538944":[0.505404301,0.64336454700000001],"76":[2.0530000000000001e-06,2.2249999999999999e-06],"4194304":[0.63739079199999993,0.71879678599999997],"851968":[0.066470453000000013,0.12324542199999999],"4096":[0.000103743,0.00011758],"59392":[0.001664879,0.001852883],"84":[2.0650000000000001e-06,2.1430000000000001e-06],"3276800":[0.44971836799999998,0.46876209000000002],"55296":[0.001546836,0.00163233],"688128":[0.050084147000000002,0.061730350000000003],"8192":[0.00022136400000000002,0.00025519600000000001],"10240":[0.00030183900000000004,0.00031526900000000007],"15872":[0.00042977199999999998,0.00045922699999999999],"92":[2.559e-06,2.6599999999999999e-06],"26624":[0.00066607100000000018,0.00071702399999999992],"1792":[4.3776999999999998e-05,4.8863000000000003e-05],"11776":[0.000403197,0.00040634299999999998],"2944":[9.7666999999999998e-05,0.000101072],"88":[2.447e-06,2.7269999999999999e-06],"22528":[0.00074211699999999993,0.00080515699999999992],"1245184":[0.12518364600000001,0.20755177400000002],"15728640":[3.095307665,3.250707674],"96":[2.565e-06,2.7599999999999998e-06],"1984":[4.9682000000000003e-05,4.9870999999999997e-05],"139264":[0.0059751199999999987,0.0061483870000000008],"475136":[0.027479590000000005,0.042683819000000005],"13631488":[2.3381968400000002,2.7955078110000002],"416":[8.5969999999999992e-06,9.3070000000000008e-06],"928":[2.0656e-05,2.1617999999999999e-05],"512":[1.2478e-05,1.4151000000000001e-05],"18432":[0.00054468699999999997,0.00055853500000000009],"16777216":[3.012003354],"9728":[0.00027553499999999998,0.0002864679999999999],"1769472":[0.22331210500000001,0.26848792199999999],"1703936":[0.20270405999999999,0.21246867899999999],"2048":[5.0494999999999997e-05,5.3195999999999997e-05],"14336":[0.000358143,0.00037926499999999994],"448":[1.0284e-05,1.1416999999999999e-05],"5505024":[1.028798731,1.0905974190000001],"544":[1.4079e-05,1.4319e-05],"221184":[0.0095557980000000008,0.0096289089999999997],"90112":[0.003481727,0.0036885399999999997],"640":[1.8768999999999999e-05,1.8825e-05],"12800":[0.000321603,0.00034517800000000002],"262144":[0.012126549,0.013129122],"589824":[0.034835614000000001,0.048533177999999996],"884736":[0.080971794999999985,0.12157953899999996],"6144":[0.00020692800000000002,0.000214036],"1088":[2.7093e-05,2.8938e-05],"576":[1.3689999999999999e-05,1.4837e-05],"160":[3.6610000000000002e-06,4.4780000000000002e-06],"672":[1.9077999999999999e-05,2.0262999999999999e-05],"8912896":[1.6252687029999999,1.625863772],"100":[2.2010000000000002e-06,2.2579999999999998e-06],"507904":[0.027477397000000008,0.031260007999999992],"3840":[9.4275000000000001e-05,0.000106308],"192":[5.2490000000000001e-06,5.4809999999999997e-06],"376832":[0.02250069,0.023090245000000002],"98304":[0.0043908590000000013,0.0044596270000000007],"5376":[0.000161989,0.000165916],"94208":[0.0038950220000000002,0.004077443],"81920":[0.0029506109999999997,0.00301681],"3407872":[0.48150488699999999,0.49459527599999997],"104":[2.2529999999999999e-06,2.6280000000000001e-06],"122880":[0.0047159630000000001,0.0052786309999999989],"200":[4.1169999999999997e-06,4.1350000000000002e-06],"163840":[0.008164916000000003,0.0083566149999999995],"4063232":[0.63469494999999998,0.71295974699999998],"5767168":[1.098392746,1.2104927670000001],"12582912":[2.917267372,3.449021959],"1600":[3.8550000000000002e-05,3.9106000000000001e-05],"136":[3.2389999999999998e-06,3.349e-06],"232":[5.3109999999999996e-06,5.3920000000000002e-06],"7077888":[1.158079149,1.3000349610000002],"86016":[0.0032709900000000001,0.0033790970000000002],"31744":[0.00088638600000000007,0.00091867899999999972],"168":[4.0810000000000004e-06,4.6580000000000001e-06],"622592":[0.036631118000000004,0.058229835000000008],"108":[2.1739999999999999e-06,2.362e-06],"327680":[0.017571039,0.018200727999999996],"2176":[5.8349e-05,5.9793999999999997e-05],"3328":[7.7723000000000001e-05,8.5771000000000003e-05],"1":[1.5200000000000001e-07,1.6e-07],"2":[1.7700000000000001e-07,1.8400000000000001e-07],"3":[1.8099999999999999e-07,1.9999999999999999e-07],"4":[1.98e-07,2.0800000000000001e-07],"7424":[0.00019411299999999999,0.00019563099999999998],"5":[2.2600000000000001e-07,2.6300000000000001e-07],"23552":[0.00078373099999999997,0.00082283899999999991],"6":[2.5499999999999999e-07,2.65e-07],"61440":[0.001797828,0.001834832],"491520":[0.023972051000000001,0.031032781999999998],"77824":[0.002669134000000001,0.0028155579999999997],"7":[2.8099999999999999e-07,2.8299999999999998e-07],"8":[2.7399999999999999e-07,2.9999999999999999e-07],"208":[4.3619999999999999e-06,4.7600000000000002e-06],"9":[3.2399999999999999e-07,3.2899999999999999e-07],"73728":[0.002458755,0.0025572809999999994],"304":[7.4619999999999999e-06,7.943e-06],"400":[8.5750000000000001e-06,9.3079999999999997e-06],"1310720":[0.16586083200000001,0.232096672],"336":[9.3589999999999997e-06,9.7569999999999999e-06],"3670016":[0.52941603100000001,0.56176695900000007],"6656":[0.00015960899999999996,0.000168999],"15360":[0.00040003199999999998,0.00043830199999999995],"432":[9.4239999999999999e-06,9.6080000000000002e-06],"950272":[0.080493017,0.12923166799999999],"655360":[0.04065153199999999,0.068287658000000001],"69632":[0.0022941799999999998,0.0023200429999999999],"11264":[0.00036323099999999999,0.00037706099999999999],"2752512":[0.44975984099999999,0.495989295],"8126464":[1.299538957,1.3659161129999999],"27648":[0.00073866700000000003,0.00077212899999999987],"368":[9.9920000000000002e-06,1.2505e-05],"65536":[0.0020026510000000003,0.0020750289999999999],"16252928":[3.041707578],"464":[1.0890000000000001e-05,1.1286e-05],"1015808":[0.10632641,0.14271547900000001],"3072":[9.7324000000000005e-05,0.000104799],"110592":[0.0044622300000000011,0.0045347979999999996],"237568":[0.012319797,0.012581445],"278528":[0.014305973,0.015460962],"496":[1.1902000000000001e-05,1.1905999999999999e-05],"13107200":[2.280931432,2.6212382449999998],"9961472":[1.7949967,2.1500965440000002],"5888":[0.000195546,0.00019869200000000001],"11010048":[2.1762705860000002,2.3008319749999999],"1920":[4.7194000000000002e-05,4.7670000000000003e-05],"2490368":[0.38372971700000003,0.45372815100000002],"19456":[0.00057700199999999996,0.00061207899999999997],"57344":[0.0016784219999999999,0.0017112200000000001],"1179648":[0.121564224,0.18129064699999997],"4718592":[0.89228690499999996,0.920178889],"360448":[0.020868900000000003,0.024376634000000001],"1572864":[0.21420361500000001,0.281073397],"53248":[0.001424699,0.0014727640000000001],"3456":[8.5653000000000001e-05,8.9368000000000002e-05],"40960":[0.001314815,0.001355476],"4608":[0.000135499,0.00013926699999999999],"13824":[0.0003586930000000001,0.00036082200000000001],"819200":[0.057652216999999992,0.112480683],"983040":[0.094889338000000018,0.12350475],"8704":[0.00023539499999999995,0.00025619900000000003],"120":[2.7030000000000002e-06,2.773e-06],"1024":[2.3710000000000002e-05,2.8184999999999999e-05],"49152":[0.0018491920000000002,0.0018971349999999999],"524288":[0.026821253,0.047864765999999989],"45056":[0.0015355879999999998,0.0015471700000000001],"229376":[0.011829769,0.012144133],"2688":[7.6890000000000004e-05,8.4702000000000003e-05],"152":[3.6490000000000001e-06,3.8240000000000001e-06],"5120":[0.000145861,0.000156816],"1507328":[0.19313159899999999,0.28758049499999999],"1216":[3.0608999999999998e-05,3.7450999999999998e-05],"1966080":[0.239035477,0.27197981999999998],"1900544":[0.24060582500000005,0.29762628999999996],"184":[5.4280000000000004e-06,5.4820000000000002e-06],"7936":[0.000216197,0.00022218799999999998],"3801088":[0.615759638,0.72030628499999994],"6815744":[1.181079107,1.3234909849999998],"124":[2.8499999999999998e-06,3.0230000000000001e-06],"102400":[0.003806083,0.0038575659999999998],"311296":[0.016067275000000002,0.018600330000000002],"1408":[4.2998999999999999e-05,4.6139e-05],"393216":[0.025421237000000003,0.027913512000000001],"4352":[0.000117772,0.000124041],"6553600":[1.0209263930000001,1.245417284],"20480":[0.00063577799999999982,0.00066768899999999996],"608":[1.6032000000000002e-05,1.7390000000000001e-05],"2228224":[0.31118284299999999,0.33740942600000001],"36864":[0.001115822,0.001179551],"704":[2.0662e-05,2.1081e-05],"720896":[0.05463449699999999,0.101910298],"800":[1.6954000000000001e-05,1.7711999999999999e-05],"2621440":[0.39667185100000002,0.420604535],"425984":[0.019269521000000001,0.021830310999999998],"32768":[0.00092878600000000002,0.00097467199999999999],"12058624":[2.4981762719999998,2.8485474630000001],"128":[2.8909999999999999e-06,3.3050000000000001e-06],"180224":[0.0098145689999999987,0.010859047],"224":[4.8110000000000002e-06,4.9760000000000003e-06],"736":[2.3898000000000001e-05,2.5252000000000001e-05],"320":[8.2859999999999999e-06,8.3890000000000005e-06],"557056":[0.029391535999999985,0.040412821000000002],"832":[1.8785000000000001e-05,1.8958999999999999e-05],"9437184":[1.8189232230000001,2.1063399349999998],"3584":[9.5204999999999994e-05,9.5208000000000001e-05],"6291456":[1.381928534,1.421416432],"256":[5.728e-06,6.3810000000000004e-06],"15204352":[2.72717192,3.2270644530000001],"28672":[0.00076416599999999993,0.00086283100000000032],"768":[2.3584999999999999e-05,2.4119000000000001e-05],"212992":[0.0089167709999999987,0.010424862],"864":[2.0560999999999998e-05,2.0613000000000001e-05],"352":[9.927e-06,1.0013000000000001e-05],"253952":[0.012684806999999998,0.013483139],"960":[2.3360999999999999e-05,2.4615000000000001e-05],"24576":[0.00090066100000000019,0.00095921899999999965],"7680":[0.00019322100000000001,0.000231342],"294912":[0.014968954,0.016517728999999998],"1048576":[0.090622051000000009,0.130666164],"10485760":[2.0338504319999999,2.1822910769999999],"344064":[0.020022589,0.02135432],"288":[6.4339999999999997e-06,7.1369999999999996e-06],"1152":[3.1000999999999997e-05,3.201e-05],"384":[1.1447999999999999e-05,1.1449e-05],"2304":[5.8832000000000002e-05,6.6079000000000002e-05],"896":[2.0353999999999999e-05,2.1546999999999999e-05],"480":[1.1192000000000001e-05,1.2225999999999999e-05],"1441792":[0.18437105300000001,0.27453816599999997],"992":[2.5411000000000001e-05,2.7801e-05],"3968":[9.9493000000000004e-05,0.00011044700000000002],"6400":[0.000151681,0.00015200700000000001],"1344":[3.6536999999999999e-05,3.6862e-05],"126976":[0.0052493869999999995,0.0056035349999999998],"2883584":[0.49480764099999996,0.65254922400000004],"753664":[0.055992750000000001,0.076701920000000007],"16384":[0.00045314900000000002,0.00048388800000000003],"131072":[0.0055413470000000003,0.0057085130000000001],"458752":[0.022300731000000001,0.031937093],"172032":[0.0086564379999999989,0.0088897219999999992],"12288":[0.00043254599999999996,0.00045793300000000005],"14680064":[2.801199204,9.8024929099999998],"1536":[4.7373000000000002e-05,5.4812000000000003e-05],"25600":[0.00062434300000000008,0.00066421099999999984],"1835008":[0.23339684799999999,0.25577962599999998],"10752":[0.00032849699999999997,0.00036392499999999991],"21504":[0.00066115300000000004,0.00075056100000000007],"7602176":[1.2544454250000001,1.341810419],"5632":[0.00018516499999999999,0.000206608],"10":[3.3000000000000002e-07,3.4700000000000002e-07],"3145728":[0.62063851199999998,0.62270592000000002],"245760":[0.011075167,0.011613986999999999],"1728":[4.0805e-05,4.1783000000000003e-05],"11":[3.2599999999999998e-07,3.5699999999999998e-07],"1114112":[0.102520709,0.17855204399999999],"12":[3.6300000000000001e-07,3.8599999999999999e-07],"7340032":[1.21173073,1.3292357429999999],"7168":[0.000183678,0.000213842],"13":[3.8500000000000002e-07,3.8599999999999999e-07],"6029312":[1.2014757279999999,1.2991977000000001],"14":[4.39e-07,4.7100000000000002e-07],"3200":[7.3244999999999994e-05,8.9829999999999999e-05],"20":[5.0399999999999996e-07,6.1999999999999999e-07],"204800":[0.0086574410000000018,0.0088000790000000023],"15":[4.3300000000000003e-07,4.5699999999999998e-07],"13312":[0.00032267200000000003,0.0003399819999999999],"4980736":[0.85404022000000002,1.025807243],"118784":[0.0046895129999999993,0.0049416180000000001],"51200":[0.001367437,0.0014350529999999997],"16":[4.7800000000000002e-07,5.3300000000000002e-07],"21":[5.7000000000000005e-07,6.2900000000000003e-07],"917504":[0.088743149999999993,0.11608874399999999],"22":[5.8999999999999996e-07,7.92e-07],"4864":[0.00013900199999999999,0.000147627],"17":[4.7999999999999996e-07,5.4099999999999999e-07],"14848":[0.00037863600000000001,0.00043930900000000003],"23":[6.1200000000000003e-07,7.4499999999999996e-07],"786432":[0.067117034000000034,0.093330270000000048],"18":[4.8400000000000005e-07,5.13e-07],"1638400":[0.191589658,0.20008100300000001],"7864320":[1.298069769,1.414217917],"24":[6.8800000000000002e-07,7.9800000000000003e-07],"14155776":[2.4013034640000002,2.704941593],"19":[4.9999999999999998e-07,5.3200000000000005e-07],"30":[7.8100000000000002e-07,8.5099999999999998e-07],"25":[6.3099999999999997e-07,6.8400000000000004e-07],"31":[8.1800000000000005e-07,8.71e-07],"1280":[3.7030999999999998e-05,3.7524000000000002e-05],"26":[6.2699999999999999e-07,6.99e-07],"3932160":[0.59534610600000004,0.69224317800000001],"2432":[6.4778999999999998e-05,6.8905000000000005e-05],"32":[7.6700000000000003e-07,9.09e-07],"27":[6.7199999999999998e-07,6.75e-07],"409600":[0.01894475,0.020413957]}},{"title":"OrderedSet formSymmetricDifference with Array (0% overlap)","results":{"28":[5.8200000000000002e-06,6.348e-06],"34":[6.4370000000000004e-06,7.0160000000000003e-06],"29":[5.6319999999999996e-06,6.3380000000000001e-06],"40":[7.4170000000000003e-06,8.8810000000000002e-06],"17408":[0.0036048079999999997,0.003831807],"1472":[0.00032802800000000007,0.00034282099999999999],"112":[2.1682999999999999e-05,2.2243e-05],"1376256":[0.74807818599999998,0.96033750900000003],"5242880":[4.0650712770000004,4.1614199650000003],"36":[6.438e-06,8.9150000000000002e-06],"42":[7.9820000000000008e-06,9.8959999999999998e-06],"11534336":[10.733796681999999,11.040431086],"114688":[0.028318691,0.028576298],"144":[2.6985e-05,2.9754999999999999e-05],"38":[7.25e-06,7.7819999999999994e-06],"240":[4.6539000000000003e-05,4.8347999999999999e-05],"9216":[0.0019264849999999999,0.0023089220000000001],"44":[8.0660000000000004e-06,1.0464e-05],"1664":[0.00033631699999999993,0.00033774],"196608":[0.061979103000000015,0.066420203999999983],"155648":[0.041668692,0.042755886],"2816":[0.00058929900000000027,0.00061571200000000003],"50":[9.5300000000000002e-06,1.0033e-05],"2359296":[1.4655396220000001,1.6114378499999999],"46":[8.4610000000000008e-06,1.0992000000000001e-05],"176":[3.6702000000000002e-05,3.7475999999999998e-05],"52":[1.0127e-05,1.0526000000000001e-05],"272":[4.9622e-05,6.1459999999999998e-05],"116":[2.1455999999999999e-05,2.5403000000000001e-05],"47104":[0.011242361000000001,0.011887868000000001],"6912":[0.001418243,0.0014925380000000003],"1856":[0.00039178299999999999,0.00042647199999999979],"48":[9.285e-06,1.2655e-05],"2097152":[1.2396383850000001,1.2519585790000001],"54":[1.0983e-05,1.1061e-05],"2031616":[1.1584758609999999,1.1639501029999999],"43008":[0.0097555139999999999,0.010426276999999998],"60":[1.2227e-05,1.2782000000000001e-05],"30720":[0.0065443790000000012,0.006782026],"56":[1.0777e-05,1.1575e-05],"62":[1.1867e-05,1.2064e-05],"58":[1.0638999999999999e-05,1.1401e-05],"3014656":[2.3045725250000002,2.4914618649999998],"64":[1.1921e-05,1.3008e-05],"8388608":[6.7534688330000003,6.7895424980000003],"29696":[0.0062910249999999987,0.0063291290000000002],"216":[4.4620999999999999e-05,4.5330999999999997e-05],"106496":[0.026473671000000004,0.027509765000000009],"72":[1.3609e-05,1.4582e-05],"442368":[0.14068502999999999,0.15478354400000005],"147456":[0.037247290000000009,0.039713317000000005],"4456448":[3.1995081929999998,3.35821953],"63488":[0.014201142999999999,0.014460636000000002],"38912":[0.0085279699999999993,0.0088140839999999998],"68":[1.3455000000000001e-05,1.3864e-05],"188416":[0.055111986000000002,0.058689972],"248":[4.5631999999999999e-05,5.0890999999999998e-05],"80":[1.5150000000000001e-05,1.6787999999999999e-05],"2560":[0.00052065,0.00057402199999999988],"34816":[0.0073532320000000012,0.0084711229999999728],"3712":[0.00076992299999999994,0.00077180100000000013],"3538944":[2.4616496689999998,2.5376146209999999],"76":[1.6201999999999998e-05,1.6858e-05],"4194304":[2.9824757119999998,2.9842929410000001],"851968":[0.35333204099999999,0.50241127799999996],"4096":[0.00082497999999999979,0.00090002700000000008],"59392":[0.013364101999999997,0.014004898],"84":[1.6733999999999999e-05,1.6888000000000002e-05],"3276800":[2.2646340469999999,2.3194257980000001],"55296":[0.012425175,0.013030672],"688128":[0.26484902100000002,0.34767914799999999],"8192":[0.0016825639999999999,0.0017681300000000001],"10240":[0.0021974749999999999,0.0022839729999999999],"15872":[0.0032728419999999993,0.0034324640000000005],"92":[1.9052e-05,2.2526000000000001e-05],"26624":[0.005671008,0.0059916819999999999],"1792":[0.00034530999999999999,0.000406265],"11776":[0.0027478200000000002,0.0029130529999999996],"2944":[0.00068058500000000004,0.00070962100000000001],"88":[1.9357000000000001e-05,2.0893000000000001e-05],"22528":[0.005153576,0.0053682350000000007],"1245184":[0.61075254599999995,0.835016812],"15728640":[13.263096994,13.563878861999999],"96":[1.9632000000000001e-05,2.1563e-05],"1984":[0.00038237000000000004,0.00041208800000000002],"139264":[0.034847479000000001,0.035269704999999998],"475136":[0.14887261700000001,0.20601436400000001],"13631488":[11.664569063,12.127118655],"416":[7.9740000000000006e-05,8.2026000000000004e-05],"928":[0.00017950799999999996,0.00019463],"512":[0.000101199,0.000115825],"18432":[0.0039226759999999999,0.0040406609999999992],"16777216":[14.383776361000001],"9728":[0.0020184529999999999,0.0020559000000000003],"1769472":[1.011126561,1.1226100269999999],"1703936":[0.95999431199999996,0.99902400099999999],"2048":[0.00041081200000000009,0.00041486000000000008],"14336":[0.0029530770000000001,0.0030489330000000002],"448":[9.0502999999999997e-05,0.000101041],"5505024":[4.4546609100000003,4.5122524760000005],"544":[0.00010864,0.000118551],"221184":[0.059822280000000005,0.06350325599999998],"90112":[0.023410057000000001,0.024422080999999998],"640":[0.00013349400000000001,0.00014839399999999999],"12800":[0.002692032,0.0028314569999999995],"262144":[0.070816174999999967,0.081065986999999992],"589824":[0.20563796400000001,0.26450317899999998],"884736":[0.37471313399999995,0.53003870399999997],"6144":[0.001399417,0.0015133189999999999],"1088":[0.00021138099999999999,0.000229552],"576":[0.000115742,0.00012732099999999998],"160":[3.1834e-05,3.6411000000000001e-05],"672":[0.000137572,0.000142335],"8912896":[7.2075818749999998,7.4321078979999999],"100":[1.9701e-05,2.0837000000000001e-05],"507904":[0.16542357199999999,0.22117431700000001],"3840":[0.00078944399999999993,0.00081209999999999995],"192":[4.1424000000000002e-05,4.1831e-05],"376832":[0.12566007300000001,0.12685519200000001],"98304":[0.028064525,0.028336037999999997],"5376":[0.0011703920000000001,0.0012089659999999999],"94208":[0.025489216000000002,0.027765745000000001],"81920":[0.019875911,0.020483971],"3407872":[2.375732164,2.390810063],"104":[2.0730999999999999e-05,2.3201999999999999e-05],"122880":[0.029883505999999997,0.031723810999999998],"200":[3.6627e-05,3.7190000000000001e-05],"163840":[0.043870950999999998,0.046519761999999999],"4063232":[2.831858129,2.9539474349999999],"5767168":[4.9729611059999996,5.0088915390000004],"12582912":[13.269851963000001,14.023125002],"1600":[0.00031645099999999998,0.00034998000000000006],"136":[2.5177e-05,2.8197000000000001e-05],"232":[4.5352999999999998e-05,4.7286000000000001e-05],"7077888":[5.5870461389999999,6.0991386519999997],"86016":[0.021435194000000001,0.022939813999999996],"31744":[0.006785666000000001,0.0070768160000000014],"168":[3.3702999999999999e-05,3.7981000000000001e-05],"622592":[0.224921551,0.31267892000000003],"108":[1.9745000000000002e-05,2.2472000000000001e-05],"327680":[0.096326202,0.10006674],"2176":[0.00044128700000000001,0.00046784599999999995],"3328":[0.000688625,0.00070805100000000012],"1":[5.2900000000000004e-07,5.3600000000000004e-07],"2":[6.1799999999999995e-07,6.2600000000000002e-07],"3":[9.2600000000000001e-07,9.9600000000000008e-07],"4":[8.6199999999999996e-07,8.9999999999999996e-07],"7424":[0.001539852,0.0016274549999999999],"5":[1.198e-06,1.362e-06],"23552":[0.0055212229999999996,0.0059403619999999994],"6":[1.1990000000000001e-06,1.246e-06],"61440":[0.013891915999999999,0.014101236],"491520":[0.15679866200000001,0.20111567900000005],"77824":[0.018593303999999998,0.019231814],"7":[1.2839999999999999e-06,1.4309999999999999e-06],"8":[1.186e-06,1.3489999999999999e-06],"208":[3.8837000000000001e-05,4.4336999999999999e-05],"9":[1.759e-06,1.7630000000000001e-06],"73728":[0.017267141,0.017806826000000001],"304":[5.6703999999999998e-05,6.3774000000000003e-05],"400":[7.8900999999999996e-05,8.2979000000000006e-05],"1310720":[0.68926931899999999,0.88139128599999994],"336":[6.7312999999999997e-05,7.1400000000000001e-05],"3670016":[2.542601973,2.5468160310000001],"6656":[0.001370951,0.0014192300000000001],"15360":[0.0031738829999999997,0.0033133719999999998],"432":[8.4278999999999997e-05,8.5520999999999997e-05],"950272":[0.40698239400000003,0.53201038099999998],"655360":[0.24624304999999999,0.34509536000000002],"69632":[0.016138705999999996,0.016531177000000001],"11264":[0.0025442189999999995,0.0026592870000000002],"2752512":[1.9186337950000001,1.9857019389999999],"8126464":[6.3906204180000001,6.4966835830000003],"27648":[0.006041668,0.0062491000000000005],"368":[7.4048000000000007e-05,9.3591000000000006e-05],"65536":[0.014767513999999999,0.015747361999999997],"16252928":[13.84127812],"464":[9.2781000000000005e-05,9.3553000000000004e-05],"1015808":[0.45645535000000004,0.58167190400000002],"3072":[0.00074689299999999999,0.00074707100000000008],"110592":[0.027587262999999994,0.027626952],"237568":[0.065442784000000004,0.069878845999999981],"278528":[0.07989738099999999,0.087277083000000005],"496":[0.000101573,0.00010675599999999999],"13107200":[11.321651121,11.669437931999999],"9961472":[8.2387450090000005,8.2962198469999997],"5888":[0.0013027899999999999,0.0014278730000000001],"11010048":[9.6215267430000004,9.6686081189999999],"1920":[0.00038522300000000008,0.00039439999999999994],"2490368":[1.605549501,1.7292172539999999],"19456":[0.0041453620000000005,0.0042588309999999994],"57344":[0.013249293000000001,0.013286471999999999],"1179648":[0.56639697600000005,0.70704433100000008],"4718592":[3.5292926740000001,3.6923223250000001],"360448":[0.11355488599999999,0.12814995399999995],"1572864":[1.033381007,1.0967312419999999],"53248":[0.01206258,0.012221457],"3456":[0.00072038100000000019,0.0007212439999999999],"40960":[0.0092502219999999989,0.0092679640000000001],"4608":[0.00094817899999999984,0.00097907600000000016],"13824":[0.0028765489999999999,0.0030330329999999996],"819200":[0.34278446499999998,0.44896350099999999],"983040":[0.423959172,0.54929324299999993],"8704":[0.0018051549999999999,0.001913889],"120":[2.3105e-05,2.3397e-05],"1024":[0.00019833200000000001,0.00021383699999999998],"49152":[0.012485376999999997,0.01276088],"524288":[0.17053638500000001,0.23996221400000001],"45056":[0.010377050000000002,0.010805081999999997],"229376":[0.063242376999999989,0.068814787000000002],"2688":[0.00057724800000000004,0.00059482100000000004],"152":[2.9093000000000001e-05,3.2743000000000001e-05],"5120":[0.001080922,0.001088302],"1507328":[0.92117029100000003,1.1638494939999999],"1216":[0.000248781,0.00026181400000000008],"1966080":[1.1008289309999999,1.144856726],"1900544":[1.0969649770000001,1.1001268040000001],"184":[4.0592e-05,4.1736999999999997e-05],"7936":[0.001619767,0.0016904350000000001],"3801088":[2.6448034360000001,2.7475471699999998],"6815744":[5.3897268389999997,5.9445193659999997],"124":[2.4892000000000002e-05,2.5837e-05],"102400":[0.025450974999999997,0.026597724],"311296":[0.091926631000000009,0.093831623000000003],"1408":[0.00031564800000000008,0.00031801900000000001],"393216":[0.14020216899999999,0.145306451],"4352":[0.00088670700000000014,0.00093453199999999985],"6553600":[5.1585296510000003,5.6729442199999998],"20480":[0.0044046689999999999,0.0046372900000000005],"608":[0.00013125499999999999,0.00013143700000000001],"2228224":[1.3578055259999999,1.361035491],"36864":[0.008122716999999998,0.008329035000000002],"704":[0.00015497800000000001,0.00015964399999999999],"720896":[0.30112034700000001,0.41749839],"800":[0.00015656099999999999,0.00016229100000000001],"2621440":[1.754756599,1.7587013059999999],"425984":[0.132299321,0.16191128499999999],"32768":[0.0069335860000000003,0.0072265410000000004],"12058624":[11.830976184000001,12.153745033],"128":[2.3726e-05,2.5545999999999999e-05],"180224":[0.052032490000000008,0.057390158999999996],"224":[4.2228999999999998e-05,4.4206999999999999e-05],"736":[0.00016462700000000004,0.00016583200000000003],"320":[6.1674000000000006e-05,6.5265999999999995e-05],"557056":[0.18922552300000001,0.24418400400000001],"832":[0.000168066,0.000176983],"9437184":[7.9176353620000004,8.3085823990000005],"3584":[0.00070256699999999997,0.0007672200000000001],"6291456":[6.1826767409999999,6.384610962],"256":[5.1431000000000003e-05,5.3035000000000003e-05],"15204352":[12.918243237,13.493381716],"28672":[0.0062005059999999989,0.006367162],"768":[0.000168772,0.00017523200000000005],"212992":[0.056898134000000003,0.061453819999999992],"864":[0.000183926,0.000186131],"352":[8.0518000000000004e-05,8.1169999999999997e-05],"253952":[0.07030186699999999,0.078634111999999992],"960":[0.000182764,0.00021922200000000004],"24576":[0.0061744290000000004,0.0061902169999999996],"7680":[0.0015869879999999997,0.0018259649999999999],"294912":[0.08404489599999998,0.08935805799999999],"1048576":[0.46519166000000001,0.59053151500000001],"10485760":[8.8403250129999993,9.0046424480000002],"344064":[0.106222832,0.11514603199999995],"288":[5.5256000000000001e-05,5.8607999999999999e-05],"1152":[0.00025192900000000002,0.00026718299999999999],"384":[8.8218000000000001e-05,8.8420999999999999e-05],"2304":[0.00049322999999999988,0.0005281140000000001],"896":[0.000172199,0.00018741299999999999],"480":[9.7354000000000003e-05,0.00011087200000000001],"1441792":[0.82048351799999997,1.059255955],"992":[0.00020798300000000004,0.000224508],"3968":[0.00077771100000000016,0.00085364699999999991],"6400":[0.0013266389999999997,0.001334385],"1344":[0.00028681099999999999,0.00028757399999999997],"126976":[0.03139156500000001,0.032113588000000005],"2883584":[2.0920995759999998,2.3449601109999998],"753664":[0.33411608000000004,0.46632810499999999],"16384":[0.003368153,0.0036542659999999998],"131072":[0.033045577,0.035622493000000005],"458752":[0.14681585799999999,0.19421940100000001],"172032":[0.046870661000000001,0.050154209000000005],"12288":[0.0029863569999999998,0.0031773690000000002],"14680064":[12.413722570000001,34.025832033],"1536":[0.000351212,0.00035637699999999995],"25600":[0.005614507999999999,0.0057301130000000002],"1835008":[1.0298132369999999,1.0828603750000001],"10752":[0.0023864059999999998,0.0024370209999999997],"21504":[0.0047196429999999999,0.0050329560000000008],"7602176":[5.981954247,6.0063330500000003],"5632":[0.00131701,0.001420992],"10":[1.7060000000000001e-06,1.778e-06],"3145728":[2.6623506209999999,2.700424613],"245760":[0.06590702200000001,0.070432009999999989],"1728":[0.00033356599999999998,0.0003562359999999999],"11":[1.8920000000000001e-06,2.4339999999999999e-06],"1114112":[0.52021597799999997,0.68721003599999997],"12":[1.793e-06,2.0600000000000002e-06],"7340032":[5.8062618029999999,5.8396117610000005],"7168":[0.0014815760000000001,0.0016478],"13":[2.0260000000000002e-06,2.1830000000000001e-06],"6029312":[5.5097894189999996,5.5240193460000002],"14":[2.2129999999999998e-06,2.5689999999999999e-06],"3200":[0.00066123399999999991,0.00072297699999999986],"20":[3.5310000000000002e-06,4.374e-06],"204800":[0.055255007000000002,0.064046165999999988],"15":[2.2850000000000001e-06,2.3690000000000001e-06],"13312":[0.0027548950000000007,0.0029441379999999998],"4980736":[3.816832942,3.8349164440000001],"118784":[0.029344091000000006,0.031760118000000018],"51200":[0.011621326,0.012502364],"16":[3.0149999999999999e-06,3.5499999999999999e-06],"21":[4.425e-06,4.5449999999999997e-06],"917504":[0.38928663899999999,0.48672058699999998],"22":[4.6229999999999996e-06,4.9320000000000004e-06],"4864":[0.00098899900000000017,0.0010645160000000002],"17":[3.3629999999999998e-06,3.9439999999999998e-06],"14848":[0.0031053590000000002,0.0032040039999999999],"23":[4.2579999999999997e-06,5.1460000000000004e-06],"786432":[0.36966339500000001,0.47861922600000001],"18":[3.3380000000000001e-06,4.1019999999999999e-06],"1638400":[0.91707413800000004,0.99156744200000002],"7864320":[6.2592633649999998,6.4038036910000002],"24":[5.6799999999999998e-06,6.0909999999999998e-06],"14155776":[12.042460751,12.502523877],"19":[3.5130000000000001e-06,4.092e-06],"30":[6.1929999999999998e-06,6.2179999999999996e-06],"25":[4.8269999999999997e-06,5.6999999999999996e-06],"31":[6.3690000000000003e-06,6.4189999999999999e-06],"1280":[0.00026732699999999998,0.00027144000000000002],"26":[4.899e-06,5.4790000000000004e-06],"3932160":[2.7521403420000001,2.7865103489999998],"2432":[0.00049180199999999984,0.00052666099999999999],"32":[5.9859999999999999e-06,6.8650000000000003e-06],"27":[5.4099999999999999e-06,6.5139999999999998e-06],"409600":[0.13085218500000001,0.14634659]}},{"title":"OrderedSet formSymmetricDifference with Array (25% overlap)","results":{"28":[4.9130000000000002e-06,5.7559999999999996e-06],"34":[5.4319999999999998e-06,6.2720000000000003e-06],"29":[4.5029999999999999e-06,5.536e-06],"40":[6.0789999999999997e-06,7.3660000000000003e-06],"17408":[0.0030834510000000001,0.0032895719999999997],"1472":[0.00025531099999999993,0.000280253],"112":[1.6730000000000001e-05,1.8393000000000002e-05],"1376256":[0.61477780199999998,0.76583061399999997],"5242880":[3.3705451850000001,3.4883154379999999],"36":[5.4820000000000002e-06,7.2080000000000003e-06],"42":[6.4670000000000001e-06,7.4000000000000003e-06],"11534336":[8.8585020290000003,9.0191974899999998],"114688":[0.022004685999999999,0.022175035999999999],"144":[2.2802999999999998e-05,2.5987e-05],"38":[5.9510000000000003e-06,6.8530000000000003e-06],"240":[3.7224000000000001e-05,3.8269999999999998e-05],"9216":[0.0016189820000000004,0.0020432150000000001],"44":[6.7610000000000002e-06,9.8039999999999996e-06],"1664":[0.00025706399999999999,0.00027550900000000001],"196608":[0.049846299000000004,0.051936469999999998],"155648":[0.034152253,0.035722421999999983],"2816":[0.00050777900000000009,0.00051085200000000012],"50":[7.8420000000000005e-06,8.2609999999999993e-06],"2359296":[1.2078046579999999,1.383742773],"46":[6.9650000000000002e-06,9.5470000000000002e-06],"176":[2.9581e-05,2.9617000000000001e-05],"52":[8.0560000000000005e-06,8.7490000000000004e-06],"272":[4.1910999999999999e-05,5.2738000000000002e-05],"116":[1.6932e-05,1.9873000000000001e-05],"47104":[0.0092006480000000022,0.0097747979999999995],"6912":[0.0011369430000000001,0.0011876089999999998],"1856":[0.00030488499999999997,0.00032491400000000004],"48":[7.4660000000000002e-06,8.4169999999999992e-06],"2097152":[0.91906258900000004,0.94129232299999999],"54":[9.1109999999999997e-06,9.4700000000000008e-06],"2031616":[0.80014684999999997,0.84853811300000004],"43008":[0.0081181110000000008,0.008545348999999999],"60":[1.0006e-05,1.1405e-05],"30720":[0.005179139000000001,0.0054409490000000005],"56":[9.5780000000000005e-06,9.8800000000000003e-06],"62":[1.0992000000000001e-05,1.147e-05],"58":[8.8920000000000006e-06,9.6520000000000001e-06],"3014656":[1.8828206860000001,2.0653143040000002],"64":[1.0132000000000001e-05,1.2014999999999999e-05],"8388608":[5.1496213160000002,5.2935915140000001],"29696":[0.005079704,0.0051137770000000008],"216":[3.4218999999999999e-05,3.5234000000000002e-05],"106496":[0.020283389000000002,0.020351971999999999],"72":[1.1462e-05,1.2941e-05],"442368":[0.104619843,0.116533018],"147456":[0.031429208,0.032852276],"4456448":[2.690154369,2.905145895],"63488":[0.011573889000000004,0.011786694],"38912":[0.007260921,0.00753675],"68":[1.1527e-05,1.1584e-05],"188416":[0.045640485999999994,0.047550213000000001],"248":[3.6578000000000001e-05,4.2066e-05],"80":[1.2489e-05,1.3304e-05],"2560":[0.00045738000000000002,0.00049540399999999996],"34816":[0.0063367830000000003,0.007337255],"3712":[0.00060428400000000007,0.00064654100000000004],"3538944":[1.7106786409999999,1.740209415],"76":[1.3522e-05,1.5231999999999999e-05],"4194304":[2.2095584709999998,2.2317581459999998],"851968":[0.24991722199999999,0.33460694700000004],"4096":[0.00070805199999999981,0.000723316],"59392":[0.010624461999999998,0.011131837],"84":[1.3557000000000001e-05,1.4656e-05],"3276800":[1.5681718120000001,1.629631313],"55296":[0.0097088910000000007,0.010345007],"688128":[0.21512141400000001,0.28781757799999996],"8192":[0.00139035,0.0014988859999999998],"10240":[0.001826224,0.0019141310000000001],"15872":[0.0027513940000000003,0.0028533900000000008],"92":[1.5628999999999999e-05,1.806e-05],"26624":[0.0044683070000000004,0.0048367850000000006],"1792":[0.00029154099999999998,0.000335316],"11776":[0.002233133,0.0023368709999999999],"2944":[0.00054259700000000002,0.00056656000000000002],"88":[1.518e-05,1.5531000000000001e-05],"22528":[0.004318040999999999,0.004366834],"1245184":[0.50514650700000008,0.65459079500000006],"15728640":[10.187769803,10.314394865000001],"96":[1.6078000000000001e-05,1.7439999999999999e-05],"1984":[0.00032941399999999999,0.0003397430000000001],"139264":[0.029615404000000001,0.029981146],"475136":[0.11656339299999996,0.15174706499999999],"13631488":[8.6229081240000003,8.9538358030000005],"416":[6.3719000000000004e-05,6.4806000000000003e-05],"928":[0.00015111200000000001,0.00015755500000000003],"512":[8.9398e-05,0.0001009],"18432":[0.0032798290000000002,0.003436677],"16777216":[11.005444536000001],"9728":[0.0017125649999999999,0.0017247270000000001],"1769472":[0.690281327,0.69379521],"1703936":[0.66665058199999994,0.69031960999999997],"2048":[0.00033569900000000007,0.00036137399999999997],"14336":[0.002351658,0.0024499489999999994],"448":[7.2292000000000005e-05,7.9343000000000003e-05],"5505024":[3.5936907389999999,3.7463796889999998],"544":[9.1495000000000004e-05,0.000101777],"221184":[0.045051138999999997,0.047062277999999999],"90112":[0.018949185,0.020251934999999999],"640":[0.000106573,0.00012571199999999999],"12800":[0.0020937180000000001,0.0022147619999999999],"262144":[0.059310755,0.062590464000000012],"589824":[0.16858214899999999,0.23681581100000004],"884736":[0.26433999800000002,0.33929689899999999],"6144":[0.0011156510000000001,0.001197692],"1088":[0.00018756799999999999,0.000198183],"576":[9.8504000000000004e-05,0.00010935],"160":[2.6171999999999999e-05,2.8697999999999999e-05],"672":[0.000108688,0.00012205400000000002],"8912896":[6.1093116509999996,6.1577052209999996],"100":[1.4775e-05,1.6209e-05],"507904":[0.12783929199999999,0.18910585499999999],"3840":[0.00062604400000000008,0.00066765500000000007],"192":[3.3791000000000002e-05,3.4913000000000003e-05],"376832":[0.100804034,0.115373876],"98304":[0.022257126999999998,0.023532327000000002],"5376":[0.00099989999999999996,0.0010138860000000001],"94208":[0.020602564,0.021733974999999999],"81920":[0.016269481000000002,0.017179252000000002],"3407872":[1.649120363,1.720915972],"104":[1.5512999999999999e-05,1.8139e-05],"122880":[0.023477624999999995,0.024954389],"200":[2.8152000000000001e-05,2.8809000000000001e-05],"163840":[0.036788704999999998,0.037734047999999992],"4063232":[2.1333972920000002,2.1885670240000001],"5767168":[4.1699953719999998,4.1746576500000003],"12582912":[10.694593165000001,11.029582271000001],"1600":[0.00025748000000000004,0.00027083499999999998],"136":[2.1092000000000001e-05,2.2758000000000001e-05],"232":[3.366e-05,3.8358000000000001e-05],"7077888":[3.9892730460000001,4.4800821190000004],"86016":[0.017578929,0.018050198],"31744":[0.0055040760000000001,0.0056587540000000002],"168":[2.7712000000000002e-05,3.1038999999999999e-05],"622592":[0.18510985599999999,0.26140370899999998],"108":[1.6235e-05,1.7428999999999999e-05],"327680":[0.079283184999999992,0.081898336000000002],"2176":[0.0003782019999999999,0.00039934999999999998],"3328":[0.00054953900000000004,0.00056083299999999962],"1":[2.23e-07,2.3200000000000001e-07],"2":[4.5900000000000002e-07,4.5900000000000002e-07],"3":[4.9100000000000004e-07,5.2699999999999999e-07],"4":[6.8999999999999996e-07,7.1900000000000002e-07],"7424":[0.001283541,0.0012866849999999999],"5":[6.8500000000000001e-07,8.4300000000000002e-07],"23552":[0.0046573539999999998,0.0046864109999999997],"6":[7.8700000000000005e-07,8.1399999999999996e-07],"61440":[0.011048840000000001,0.011300104],"491520":[0.119920783,0.16111531000000001],"77824":[0.015356317,0.015874596000000001],"7":[9.2699999999999998e-07,1.113e-06],"8":[9.6099999999999999e-07,1.0720000000000001e-06],"208":[3.1260000000000002e-05,3.3337999999999998e-05],"9":[1.006e-06,1.0589999999999999e-06],"73728":[0.014609241,0.015007348],"304":[4.7274999999999997e-05,5.321e-05],"400":[6.2262999999999997e-05,6.3820999999999998e-05],"1310720":[0.54465123900000001,0.73434119899999994],"336":[5.5982e-05,6.0093999999999998e-05],"3670016":[1.801696652,1.8349511439999999],"6656":[0.0010843929999999999,0.0010924159999999999],"15360":[0.0026304059999999996,0.002656701],"432":[6.5786999999999999e-05,7.7094000000000004e-05],"950272":[0.29457642100000003,0.36639350199999998],"655360":[0.20011969399999999,0.28416882900000001],"69632":[0.013728311,0.014074380000000001],"11264":[0.002078599,0.002184629],"2752512":[1.5531657079999999,1.779520446],"8126464":[4.8361893089999999,4.960633294],"27648":[0.0046284240000000008,0.0048875870000000005],"368":[6.0109000000000003e-05,7.4795999999999993e-05],"65536":[0.012099969,0.014990544],"16252928":[10.605451115999999],"464":[7.5536000000000003e-05,7.7354999999999994e-05],"1015808":[0.33254636800000004,0.40683197199999999],"3072":[0.00062140599999999991,0.00063857499999999984],"110592":[0.020834236999999999,0.021283795000000001],"237568":[0.050149963000000006,0.054941671999999997],"278528":[0.067757070000000003,0.07287594],"496":[8.3904000000000002e-05,8.8551e-05],"13107200":[8.0575030220000006,8.5134868689999994],"9961472":[7.0058554739999996,7.3053841980000005],"5888":[0.001118137,0.0011582230000000001],"11010048":[7.9490168639999998,8.0347937149999993],"1920":[0.0003047490000000001,0.00032210600000000001],"2490368":[1.304490661,1.4397405650000001],"19456":[0.0034893789999999999,0.0036850900000000007],"57344":[0.010230415,0.010293968000000001],"1179648":[0.46879884399999999,0.62216042199999999],"4718592":[2.9951906269999999,3.020416064],"360448":[0.093514329000000007,0.101348987],"1572864":[0.81584753899999995,0.82198308399999997],"53248":[0.0091426930000000021,0.0095885190000000002],"3456":[0.00057152500000000003,0.00063433400000000007],"40960":[0.0076810069999999992,0.0079184310000000001],"4608":[0.000781096,0.00082044799999999999],"13824":[0.0022766279999999997,0.0024215349999999998],"819200":[0.23592386300000001,0.302258739],"983040":[0.32263945599999999,0.429812851],"8704":[0.0015497129999999999,0.001638556],"120":[1.8261999999999999e-05,1.8342000000000002e-05],"1024":[0.00017091299999999997,0.000183893],"49152":[0.009892960000000001,0.010187215000000001],"524288":[0.130554376,0.183942209],"45056":[0.0084493889999999999,0.0088490389999999995],"229376":[0.047606387999999999,0.052083399000000009],"2688":[0.00045922699999999999,0.00050043600000000004],"152":[2.4117e-05,2.6074000000000001e-05],"5120":[0.00086611000000000012,0.00093299699999999997],"1507328":[0.74661361800000003,0.99214026600000005],"1216":[0.00022221300000000005,0.00022432299999999996],"1966080":[0.81271553100000005,0.81903867399999997],"1900544":[0.78065272200000002,0.78516477200000001],"184":[3.2385999999999998e-05,3.3427999999999999e-05],"7936":[0.0013654140000000001,0.0013720870000000001],"3801088":[1.887648274,1.9856208339999999],"6815744":[3.9698170230000001,4.3255620029999999],"124":[1.9573999999999999e-05,2.0043000000000001e-05],"102400":[0.01954726,0.019820934000000002],"311296":[0.076791556999999955,0.077363955999999984],"1408":[0.000252045,0.00026402200000000004],"393216":[0.111990572,0.117853582],"4352":[0.00078267600000000005,0.00079974099999999997],"6553600":[3.7325424370000002,4.0915099699999997],"20480":[0.0036747210000000002,0.003829977],"608":[0.000110547,0.000110894],"2228224":[1.122007626,1.133426099],"36864":[0.0068958080000000007,0.0070053660000000007],"704":[0.000127973,0.000130238],"720896":[0.23537778100000001,0.334621212],"800":[0.000122829,0.00012668299999999999],"2621440":[1.436562844,1.4416661899999998],"425984":[0.099466067000000005,0.114861798],"32768":[0.005689141,0.0057219039999999999],"12058624":[9.6648370759999995,9.8991414940000002],"128":[1.927e-05,2.2053999999999999e-05],"180224":[0.044845422999999995,0.045039799000000005],"224":[3.2722000000000003e-05,3.6225e-05],"736":[0.00012657799999999999,0.00012900100000000001],"320":[5.1555999999999999e-05,5.3480000000000003e-05],"557056":[0.15721976600000001,0.19404804200000003],"832":[0.00012834899999999999,0.000140152],"9437184":[6.58976439,7.1357875750000002],"3584":[0.00055821199999999999,0.00058738900000000001],"6291456":[4.9638361450000001,5.0609912509999999],"256":[3.9431000000000002e-05,4.5293000000000002e-05],"15204352":[9.5638396730000004,10.39971845],"28672":[0.0048456929999999999,0.0049752800000000003],"768":[0.000135702,0.00014877],"212992":[0.042584250000000004,0.045555254000000003],"864":[0.00013632499999999997,0.000145062],"352":[6.0532999999999998e-05,6.2389000000000002e-05],"253952":[0.054269888000000002,0.056900354],"960":[0.000153361,0.000163549],"24576":[0.0049145070000000003,0.0050841640000000004],"7680":[0.0013096,0.001450357],"294912":[0.070868997999999989,0.075126671000000006],"1048576":[0.35056264300000001,0.43692551600000001],"10485760":[7.3481073449999998,7.4899022710000001],"344064":[0.087329828000000026,0.092296895999999989],"288":[4.6236000000000003e-05,4.9527999999999997e-05],"1152":[0.00018969200000000004,0.000205353],"384":[6.5343000000000001e-05,7.1125999999999996e-05],"2304":[0.00038608999999999996,0.000427391],"896":[0.00013877299999999997,0.00014477899999999999],"480":[7.9511999999999994e-05,8.0178000000000004e-05],"1441792":[0.66808843500000004,0.90938653899999999],"992":[0.000170032,0.00017372000000000001],"3968":[0.00065799499999999987,0.00066301199999999993],"6400":[0.0010224239999999999,0.00104733],"1344":[0.00023866599999999995,0.000249184],"126976":[0.024885583999999999,0.025322357],"2883584":[1.723631554,1.9424544100000001],"753664":[0.25448660499999998,0.36706131199999997],"16384":[0.002838887,0.0032667299999999998],"131072":[0.026386595999999995,0.027227699000000005],"458752":[0.111291742,0.13887785499999999],"172032":[0.038581244000000001,0.044408018],"12288":[0.0023716570000000001,0.0026945809999999993],"14680064":[9.1868225989999992,24.545032183],"1536":[0.00030191199999999999,0.00032422400000000002],"25600":[0.00426802,0.0043169669999999997],"1835008":[0.71525501400000002,0.78474628999999996],"10752":[0.0019590950000000001,0.0019961889999999998],"21504":[0.0038786990000000002,0.0041819170000000003],"7602176":[4.3964281300000003,4.4912614340000001],"5632":[0.0010356460000000003,0.001151848],"10":[1.046e-06,1.141e-06],"3145728":[2.1117870029999999,2.1135059869999999],"245760":[0.052097050999999991,0.054429028999999997],"1728":[0.00027985900000000003,0.00028295599999999995],"11":[1.5510000000000001e-06,1.5549999999999999e-06],"1114112":[0.42480645500000003,0.55745938100000003],"12":[1.9290000000000001e-06,2.091e-06],"7340032":[4.1516993869999999,4.2434678110000004],"7168":[0.0011748819999999999,0.0012493439999999999],"13":[1.81e-06,2.119e-06],"6029312":[4.4721542489999999,4.5200382690000005],"14":[2.4059999999999999e-06,2.5129999999999999e-06],"3200":[0.00049565500000000001,0.00058204699999999982],"20":[2.4380000000000002e-06,2.7700000000000002e-06],"204800":[0.042095895000000001,0.044751259000000009],"15":[2.1519999999999999e-06,2.3740000000000001e-06],"13312":[0.0022246620000000001,0.002308891],"4980736":[3.1581537380000002,3.1880786290000001],"118784":[0.02358118,0.024481487],"51200":[0.0089700580000000012,0.0095171330000000005],"16":[2.5730000000000002e-06,2.977e-06],"21":[2.92e-06,3.0120000000000001e-06],"917504":[0.27942954900000005,0.38346732700000002],"22":[3.2830000000000002e-06,3.8709999999999999e-06],"4864":[0.00082496199999999994,0.00094349500000000014],"17":[2.3350000000000001e-06,2.6220000000000001e-06],"14848":[0.002464403,0.0025901689999999994],"23":[3.5389999999999999e-06,4.6410000000000001e-06],"786432":[0.28454469199999999,0.366882759],"18":[2.4109999999999999e-06,2.5730000000000002e-06],"1638400":[0.64035594000000007,0.64427614499999997],"7864320":[4.7019683099999998,4.7275286439999995],"24":[4.0409999999999999e-06,4.3619999999999999e-06],"14155776":[8.8215423919999996,9.3317522850000003],"19":[2.3949999999999999e-06,2.5069999999999999e-06],"30":[5.0610000000000003e-06,5.2449999999999998e-06],"25":[4.4819999999999996e-06,4.5090000000000004e-06],"31":[5.4709999999999998e-06,6.3470000000000004e-06],"1280":[0.00022773499999999996,0.000233303],"26":[4.16e-06,4.7609999999999998e-06],"3932160":[2.0374029980000001,2.1583084779999999],"2432":[0.000433953,0.00043615100000000007],"32":[5.0320000000000003e-06,5.8669999999999999e-06],"27":[4.5600000000000004e-06,4.8860000000000003e-06],"409600":[0.096176611000000009,0.10933632999999998]}},{"title":"OrderedSet formSymmetricDifference with Array (50% overlap)","results":{"28":[2.982e-06,3.569e-06],"34":[4.0459999999999999e-06,4.8289999999999998e-06],"29":[2.74e-06,3.3249999999999999e-06],"40":[4.4580000000000003e-06,5.5509999999999999e-06],"17408":[0.0021536610000000003,0.0022379769999999999],"1472":[0.00020385599999999995,0.00021730600000000001],"112":[1.186e-05,1.2221999999999999e-05],"1376256":[0.40194385399999999,0.58441679299999993],"5242880":[2.350787264,2.5150382310000001],"36":[3.929e-06,4.8570000000000003e-06],"42":[4.899e-06,5.6710000000000004e-06],"11534336":[6.3300289379999999,6.5386131750000001],"114688":[0.016181879,0.016325696000000001],"144":[1.5815e-05,1.7838000000000001e-05],"38":[4.5240000000000002e-06,5.4859999999999997e-06],"240":[2.6591999999999999e-05,2.853e-05],"9216":[0.0011343460000000001,0.001301993],"44":[5.057e-06,6.8140000000000003e-06],"1664":[0.000199328,0.00020741000000000002],"196608":[0.037224525999999994,0.037467887000000033],"155648":[0.024196221,0.025027856999999997],"2816":[0.00036491699999999992,0.00039105900000000002],"50":[6.1210000000000003e-06,6.2029999999999997e-06],"2359296":[0.81743877399999998,0.82015326],"46":[5.2830000000000001e-06,6.0220000000000001e-06],"176":[2.2059999999999999e-05,2.3337999999999999e-05],"52":[5.9710000000000001e-06,6.5629999999999997e-06],"272":[2.9048999999999999e-05,3.6100000000000003e-05],"116":[1.2830000000000001e-05,1.5383000000000002e-05],"47104":[0.0065703769999999979,0.006945375000000001],"6912":[0.0008229960000000001,0.000865703],"1856":[0.00021909999999999999,0.00025063900000000009],"48":[5.5570000000000003e-06,6.9149999999999999e-06],"2097152":[0.67621161100000005,0.69607261799999998],"54":[6.5640000000000002e-06,7.43e-06],"2031616":[0.59693949000000002,0.63763126999999997],"43008":[0.0057163449999999985,0.0062187069999999987],"60":[7.2609999999999996e-06,7.6879999999999999e-06],"30720":[0.0038403339999999995,0.0039454979999999995],"56":[6.7839999999999998e-06,7.0940000000000002e-06],"62":[7.2629999999999997e-06,8.5399999999999996e-06],"58":[6.6749999999999996e-06,7.7049999999999999e-06],"3014656":[1.3272197139999999,1.4813361549999999],"64":[7.2289999999999997e-06,8.1640000000000001e-06],"8388608":[3.9382375939999998,4.0114914199999996],"29696":[0.0036354830000000006,0.003758099],"216":[2.5420000000000001e-05,2.5505999999999999e-05],"106496":[0.015034591999999996,0.015411718],"72":[8.4929999999999998e-06,9.7990000000000005e-06],"442368":[0.076532354000000011,0.082631272000000006],"147456":[0.022162735000000006,0.022412833],"4456448":[1.781317652,1.935069283],"63488":[0.0083050879999999987,0.0084675930000000007],"38912":[0.0049445820000000012,0.0051348059999999996],"68":[8.3110000000000006e-06,8.5979999999999997e-06],"188416":[0.033046891000000002,0.035235680000000005],"248":[2.6832999999999999e-05,2.9714e-05],"80":[9.3740000000000004e-06,1.0603e-05],"2560":[0.00034098400000000007,0.00036976399999999997],"34816":[0.0042749159999999993,0.0049709030000000005],"3712":[0.00042172199999999992,0.00045336999999999998],"3538944":[1.3951856540000001,1.396722601],"76":[9.961e-06,1.1552000000000001e-05],"4194304":[1.6348235070000001,1.639137812],"851968":[0.19545356,0.246966678],"4096":[0.00051067099999999998,0.00052002100000000007],"59392":[0.0077535660000000008,0.0082352629999999996],"84":[1.0236e-05,1.1433e-05],"3276800":[1.232404971,1.259343852],"55296":[0.0071309600000000013,0.007383500999999998],"688128":[0.14366822700000001,0.20626419699999998],"8192":[0.001010433,0.0010451530000000001],"10240":[0.001307353,0.001321701],"15872":[0.0019297959999999997,0.0020525320000000001],"92":[1.1345000000000001e-05,1.483e-05],"26624":[0.003286607,0.0034042849999999999],"1792":[0.00020405799999999996,0.00023435],"11776":[0.00164649,0.001690527],"2944":[0.00037310900000000005,0.000414514],"88":[1.1275e-05,1.2673999999999999e-05],"22528":[0.0030696129999999997,0.0032221999999999993],"1245184":[0.35046749600000004,0.43425307800000001],"15728640":[8.0562400319999998,8.0778776049999994],"96":[1.2189e-05,1.4455e-05],"1984":[0.000235491,0.00024961799999999995],"139264":[0.020208227000000002,0.020926558000000001],"475136":[0.084192348,0.113135689],"13631488":[6.6650721869999998,7.0201022059999998],"416":[4.8711000000000002e-05,5.1971000000000001e-05],"928":[0.000103868,0.000108923],"512":[6.3452000000000002e-05,6.8516999999999995e-05],"18432":[0.0022938329999999999,0.002415202],"16777216":[8.4770397129999999],"9728":[0.001178258,0.0012105170000000001],"1769472":[0.53169454299999996,0.54797053299999998],"1703936":[0.50265767500000003,0.53246861400000001],"2048":[0.000234527,0.00024960800000000001],"14336":[0.0017221719999999999,0.0018113750000000001],"448":[5.0793e-05,5.8477000000000003e-05],"5505024":[2.5573320129999999,2.598358841],"544":[6.9325000000000005e-05,7.2491999999999996e-05],"221184":[0.034242362000000005,0.034890566999999983],"90112":[0.013354633000000001,0.013837789999999999],"640":[7.6440999999999995e-05,8.6760000000000003e-05],"12800":[0.0015914430000000001,0.0016820819999999997],"262144":[0.042413896,0.042674925000000002],"589824":[0.11774934200000001,0.16539106800000003],"884736":[0.20704420999999995,0.26518318299999999],"6144":[0.00084913700000000013,0.000896779],"1088":[0.00012943399999999999,0.00014874500000000001],"576":[6.9232000000000004e-05,7.1505000000000001e-05],"160":[1.8651000000000002e-05,2.0678000000000001e-05],"672":[7.7892999999999994e-05,8.8393999999999994e-05],"8912896":[4.0914340300000003,4.4109763040000001],"100":[1.1192000000000001e-05,1.2252999999999999e-05],"507904":[0.090654319000000011,0.120273584],"3840":[0.000442113,0.00048308099999999995],"192":[2.5746999999999999e-05,2.8306e-05],"376832":[0.072236113000000005,0.075102870999999988],"98304":[0.016197835000000001,0.016544779999999999],"5376":[0.00065188300000000002,0.00070441900000000007],"94208":[0.014814839999999999,0.015132938],"81920":[0.011478069,0.012037930000000001],"3407872":[1.3032434180000001,1.342381448],"104":[1.1119e-05,1.3233e-05],"122880":[0.017370429,0.017866388],"200":[2.1373e-05,2.162e-05],"163840":[0.025884092000000004,0.026827198],"4063232":[1.5363089350000001,1.6480982339999999],"5767168":[2.8571915410000002,2.9712825770000002],"12582912":[7.7834443330000003,8.4175969689999999],"1600":[0.000183542,0.000201957],"136":[1.467e-05,1.6376999999999999e-05],"232":[2.5575000000000002e-05,2.7338000000000002e-05],"7077888":[3.1472807720000002,3.564074792],"86016":[0.012556861000000002,0.013091205],"31744":[0.003873086,0.0041550989999999998],"168":[2.0242e-05,2.2016999999999999e-05],"622592":[0.12547507499999999,0.149365207],"108":[1.2139e-05,1.3301e-05],"327680":[0.055405892999999984,0.057969886999999984],"2176":[0.00024926400000000007,0.000278046],"3328":[0.00038115300000000007,0.00042371199999999997],"1":[2.2000000000000001e-07,2.3099999999999999e-07],"2":[4.6400000000000003e-07,4.6400000000000003e-07],"3":[4.1199999999999998e-07,4.7300000000000001e-07],"4":[5.4000000000000002e-07,5.5499999999999998e-07],"7424":[0.00089664900000000001,0.00091507199999999974],"5":[5.4199999999999996e-07,6.4799999999999998e-07],"23552":[0.0033036379999999989,0.003442301],"6":[7.9100000000000003e-07,8.1999999999999998e-07],"61440":[0.0080068400000000012,0.008137038000000001],"491520":[0.087277749000000002,0.11879450900000001],"77824":[0.010770101000000001,0.011251024],"7":[7.4499999999999996e-07,7.7899999999999997e-07],"8":[7.5099999999999999e-07,8.3300000000000001e-07],"208":[2.3261e-05,2.4085999999999999e-05],"9":[8.4799999999999997e-07,9.0800000000000003e-07],"73728":[0.0099471339999999998,0.010470525999999999],"304":[3.2404999999999999e-05,3.7027000000000003e-05],"400":[4.7345999999999997e-05,4.8829000000000003e-05],"1310720":[0.36641736899999999,0.53355576100000002],"336":[4.053e-05,4.2493000000000001e-05],"3670016":[1.3704736049999999,1.3916121100000001],"6656":[0.00079049300000000008,0.0007979450000000001],"15360":[0.001889389,0.0019253479999999999],"432":[5.0404000000000001e-05,5.1688999999999999e-05],"950272":[0.214769133,0.30302799400000002],"655360":[0.13404534800000001,0.168121681],"69632":[0.0094245419999999993,0.0096054720000000003],"11264":[0.0014869009999999999,0.001590288],"2752512":[1.0347805139999999,1.163294724],"8126464":[3.6373882330000002,3.7799387640000002],"27648":[0.003388271,0.0036082520000000002],"368":[4.7144999999999997e-05,5.1363000000000003e-05],"65536":[0.0086563149999999978,0.0090867589999999981],"16252928":[8.2484088609999997],"464":[5.2899999999999998e-05,5.6156999999999998e-05],"1015808":[0.25042994200000002,0.32034792000000001],"3072":[0.00041529800000000014,0.00041947300000000007],"110592":[0.015493050999999999,0.016022391999999996],"237568":[0.037729408999999998,0.039143001000000004],"278528":[0.044774382000000001,0.050962244000000011],"496":[5.9964999999999999e-05,6.1131999999999997e-05],"13107200":[6.4893435930000001,6.9013876749999996],"9961472":[4.8561947700000001,4.8635422449999997],"5888":[0.00082263300000000002,0.00082649600000000002],"11010048":[5.6556168810000003,5.8007176889999998],"1920":[0.000216073,0.00023095799999999999],"2490368":[0.87021210699999996,0.99616366499999998],"19456":[0.0024817979999999999,0.0025082910000000002],"57344":[0.0073746890000000011,0.007692745],"1179648":[0.30575732300000003,0.41790960700000002],"4718592":[2.0182103690000002,2.113208867],"360448":[0.066851181999999967,0.068426270999999997],"1572864":[0.57096453400000002,0.69263492999999998],"53248":[0.006883999,0.0070262000000000007],"3456":[0.00040023199999999993,0.000449877],"40960":[0.0053462169999999995,0.0055496680000000007],"4608":[0.00056002000000000027,0.0005689759999999999],"13824":[0.0017046659999999999,0.001774702],"819200":[0.18054288600000001,0.25071445599999997],"983040":[0.23564682699999995,0.31170217099999997],"8704":[0.0010714770000000001,0.0011353100000000001],"120":[1.3348e-05,1.4204e-05],"1024":[0.00011399,0.00012724600000000002],"49152":[0.0072817109999999989,0.0073523690000000001],"524288":[0.096461498000000007,0.12889085],"45056":[0.0061678369999999998,0.0063256730000000013],"229376":[0.036455554999999994,0.037621063999999982],"2688":[0.00034765699999999997,0.00036051099999999994],"152":[1.6784999999999999e-05,1.8583000000000001e-05],"5120":[0.00063528,0.000673586],"1507328":[0.53484724299999997,0.67505790700000001],"1216":[0.00015066399999999995,0.00015763999999999999],"1966080":[0.61034337800000005,0.61697011000000002],"1900544":[0.57719699699999993,0.58545741899999992],"184":[2.4153999999999999e-05,2.4763999999999999e-05],"7936":[0.00095249100000000008,0.00098740899999999986],"3801088":[1.44498945,1.5192460410000002],"6815744":[3.1591740919999998,3.4289343489999999],"124":[1.3805000000000001e-05,1.5318000000000001e-05],"102400":[0.014613822,0.015128341999999999],"311296":[0.053733109000000015,0.054531061000000006],"1408":[0.000180757,0.00019023899999999998],"393216":[0.08119737500000003,0.084107288000000016],"4352":[0.00052878500000000015,0.00053104200000000002],"6553600":[3.0016030360000001,3.2835981869999999],"20480":[0.0026234019999999995,0.0027306079999999998],"608":[7.1614999999999998e-05,7.8737000000000002e-05],"2228224":[0.72384816900000004,0.77337028500000005],"36864":[0.0046532489999999999,0.0048458419999999986],"704":[9.3304e-05,9.3954000000000002e-05],"720896":[0.162049945,0.22929952100000001],"800":[9.0155000000000007e-05,9.8023999999999995e-05],"2621440":[0.964298722,0.97218004400000002],"425984":[0.073872680999999982,0.082502697000000028],"32768":[0.0041128090000000003,0.0041890640000000002],"12058624":[7.0660988270000002,7.2750182030000001],"128":[1.3723000000000001e-05,1.5736e-05],"180224":[0.031376134999999993,0.031714522999999994],"224":[2.4598000000000001e-05,2.6531999999999999e-05],"736":[9.4222999999999996e-05,0.00010150899999999999],"320":[3.6331999999999997e-05,3.7589999999999998e-05],"557056":[0.104467252,0.140614192],"832":[9.4804999999999998e-05,0.000100294],"9437184":[4.5311572900000003,5.0367587770000002],"3584":[0.00042839699999999996,0.00043679599999999998],"6291456":[3.5768232210000002,3.7004129089999998],"256":[2.8517000000000002e-05,3.1312000000000001e-05],"15204352":[7.5917717360000001,8.0677796120000007],"28672":[0.0035112350000000001,0.003679833],"768":[0.000105121,0.000116407],"212992":[0.032207448,0.03406812599999999],"864":[0.00010074,0.000104472],"352":[4.4509999999999999e-05,4.6848000000000003e-05],"253952":[0.039439724999999995,0.041876783000000001],"960":[0.000114813,0.000120486],"24576":[0.003668667,0.003730391],"7680":[0.00093238200000000005,0.0010605409999999999],"294912":[0.049623972000000002,0.050014106999999995],"1048576":[0.24831403099999999,0.35419183899999995],"10485760":[5.2855424590000002,5.3884955720000001],"344064":[0.059774771999999997,0.065142392000000063],"288":[3.1494e-05,3.2848999999999997e-05],"1152":[0.00013510700000000003,0.000148787],"384":[4.7441999999999997e-05,5.2095999999999997e-05],"2304":[0.00029333199999999999,0.00029630699999999999],"896":[0.00010398,0.000104112],"480":[5.5138e-05,5.6538e-05],"1441792":[0.47585740199999998,0.60107413300000001],"992":[0.00011108299999999999,0.000122512],"3968":[0.00045998400000000009,0.00050639899999999993],"6400":[0.00074995399999999994,0.00080657400000000001],"1344":[0.00017022699999999998,0.00017056599999999995],"126976":[0.018022962999999996,0.018346743999999998],"2883584":[1.242755134,1.3640805519999999],"753664":[0.17628612199999999,0.25477053399999999],"16384":[0.0020010560000000002,0.0021792739999999997],"131072":[0.019269944000000004,0.019908709],"458752":[0.078322938999999994,0.101913421],"172032":[0.027525232999999993,0.029909474000000002],"12288":[0.001759512,0.001842383],"14680064":[7.2614379009999999,8.5339694680000004],"1536":[0.00020604299999999999,0.00022452400000000003],"25600":[0.0032379800000000001,0.0032784469999999994],"1835008":[0.56121259999999995,0.59115130500000002],"10752":[0.0014015059999999998,0.0014539689999999998],"21504":[0.0028158329999999998,0.002961659000000001],"7602176":[3.3687584180000001,3.5182371099999998],"5632":[0.00075963499999999993,0.00084601199999999994],"10":[1.0499999999999999e-06,1.125e-06],"3145728":[1.491687422,1.491982226],"245760":[0.039393406999999998,0.039803617999999999],"1728":[0.000196164,0.00021840800000000001],"11":[1.063e-06,1.094e-06],"1114112":[0.279300463,0.36882350800000002],"12":[1.0809999999999999e-06,1.153e-06],"7340032":[3.2744452810000002,3.3833160790000001],"7168":[0.00086198100000000016,0.00094790499999999997],"13":[1.031e-06,1.2929999999999999e-06],"6029312":[3.1575976689999998,3.2421200639999999],"14":[1.2190000000000001e-06,1.311e-06],"3200":[0.00039039800000000003,0.00042098800000000007],"20":[2.0370000000000001e-06,2.2979999999999999e-06],"204800":[0.032274083999999995,0.03267988799999999],"15":[1.156e-06,1.336e-06],"13312":[0.001666807,0.001711558],"4980736":[2.1742772239999999,2.2154291220000002],"118784":[0.01706912,0.017456553],"51200":[0.006646262,0.007015004],"16":[1.8390000000000001e-06,1.902e-06],"21":[2.3779999999999999e-06,2.429e-06],"917504":[0.20482588700000001,0.28164140299999996],"22":[2.4229999999999999e-06,2.6929999999999999e-06],"4864":[0.00061478899999999992,0.00063429999999999986],"17":[1.844e-06,2.0049999999999999e-06],"14848":[0.00186246,0.0019224370000000004],"23":[2.3489999999999999e-06,2.531e-06],"786432":[0.20432574100000001,0.26307853699999995],"18":[2.0200000000000001e-06,2.2239999999999998e-06],"1638400":[0.49077395800000001,0.50512630700000005],"7864320":[3.5811985480000001,3.7149708050000001],"24":[2.5919999999999999e-06,2.9900000000000002e-06],"14155776":[7.0801405559999999,8.0650767319999996],"19":[1.9889999999999999e-06,2.1679999999999998e-06],"30":[3.0800000000000002e-06,3.168e-06],"25":[2.5790000000000002e-06,2.689e-06],"31":[3.326e-06,3.3289999999999998e-06],"1280":[0.00015000200000000002,0.00016273700000000001],"26":[2.3649999999999998e-06,2.6419999999999999e-06],"3932160":[1.540156477,1.606548796],"2432":[0.00028245399999999996,0.00031866999999999996],"32":[3.6459999999999999e-06,3.9709999999999998e-06],"27":[2.5859999999999999e-06,2.6599999999999999e-06],"409600":[0.073197764999999998,0.075189629000000008]}},{"title":"OrderedSet formSymmetricDifference with Array (75% overlap)","results":{"28":[1.5519999999999999e-06,1.649e-06],"34":[2.2299999999999998e-06,2.9330000000000001e-06],"29":[1.389e-06,1.7090000000000001e-06],"40":[2.6359999999999998e-06,3.3469999999999999e-06],"17408":[0.0013186129999999995,0.001390042],"1472":[0.00011608899999999997,0.00013255100000000001],"112":[7.413e-06,7.4819999999999997e-06],"1376256":[0.27270297999999998,0.39563564800000001],"5242880":[1.531291615,1.6570403579999999],"36":[2.2809999999999998e-06,2.8550000000000002e-06],"42":[2.79e-06,3.1439999999999999e-06],"11534336":[4.3482496209999999,4.4581134159999998],"114688":[0.010122441999999999,0.010259506999999998],"144":[9.9660000000000008e-06,1.1319e-05],"38":[2.4779999999999998e-06,3.2619999999999999e-06],"240":[1.6494000000000002e-05,1.7146000000000002e-05],"9216":[0.00071137700000000002,0.00073338500000000003],"44":[3.022e-06,3.495e-06],"1664":[0.000115247,0.00012625000000000001],"196608":[0.024014765,0.024170325000000003],"155648":[0.015309937000000001,0.015650252],"2816":[0.00023095199999999998,0.000263737],"50":[3.027e-06,3.0620000000000001e-06],"2359296":[0.54252467900000001,0.54578967499999997],"46":[2.8839999999999998e-06,3.2109999999999998e-06],"176":[1.3844e-05,1.5812e-05],"52":[2.943e-06,3.1209999999999998e-06],"272":[1.7918999999999999e-05,1.9967999999999999e-05],"116":[7.6109999999999996e-06,8.7749999999999998e-06],"47104":[0.0042074779999999997,0.004309519999999999],"6912":[0.0004865780000000001,0.00050873299999999993],"1856":[0.000127658,0.00014176399999999998],"48":[3.1379999999999999e-06,4.0860000000000004e-06],"2097152":[0.45129874199999997,0.49299927300000002],"54":[3.2669999999999998e-06,3.287e-06],"2031616":[0.40560361099999998,0.41393137400000002],"43008":[0.0037311100000000002,0.0039398690000000004],"60":[3.641e-06,3.7050000000000001e-06],"30720":[0.002299911,0.0024540180000000001],"56":[3.3289999999999998e-06,3.4400000000000001e-06],"62":[3.563e-06,3.7749999999999999e-06],"58":[3.2310000000000001e-06,3.9009999999999996e-06],"3014656":[0.86992129100000004,0.984594898],"64":[4.2069999999999997e-06,4.6399999999999996e-06],"8388608":[2.4918348429999999,2.5664831590000001],"29696":[0.0022593410000000002,0.0022652600000000003],"216":[1.56e-05,1.6395000000000001e-05],"106496":[0.0092568610000000016,0.0093519699999999976],"72":[4.9239999999999998e-06,5.3249999999999998e-06],"442368":[0.047332179000000016,0.050147834000000002],"147456":[0.014305961000000002,0.014499641000000002],"4456448":[1.2347371149999999,1.2887823869999999],"63488":[0.0050849550000000004,0.0051411240000000004],"38912":[0.003018574,0.003206941],"68":[4.746e-06,4.8910000000000003e-06],"188416":[0.021385339,0.021784781],"248":[1.6504e-05,1.7711e-05],"80":[5.3290000000000001e-06,5.5470000000000004e-06],"2560":[0.00020105400000000004,0.00022549200000000002],"34816":[0.002659224,0.003013530999999999],"3712":[0.00026836500000000001,0.000310971],"3538944":[0.87108819999999998,0.88311511799999998],"76":[5.4219999999999999e-06,5.9320000000000001e-06],"4194304":[1.068254456,1.1013846949999999],"851968":[0.118335443,0.15902680999999999],"4096":[0.00029568800000000001,0.00031254600000000013],"59392":[0.004645199,0.004854708000000001],"84":[6.156e-06,6.2790000000000004e-06],"3276800":[0.77447507100000001,0.83676149899999996],"55296":[0.0043854599999999999,0.0045026759999999989],"688128":[0.087188665000000012,0.12990802100000001],"8192":[0.00060734099999999996,0.00064124400000000012],"10240":[0.0008092030000000002,0.00082435700000000006],"15872":[0.0011975899999999999,0.001226277],"92":[6.7070000000000003e-06,6.7750000000000004e-06],"26624":[0.001952463,0.0021153950000000004],"1792":[0.000125604,0.00014724200000000001],"11776":[0.00099700200000000052,0.0010846340000000001],"2944":[0.00025343800000000004,0.00025704900000000008],"88":[6.4239999999999998e-06,7.0149999999999998e-06],"22528":[0.001978123,0.0020050749999999998],"1245184":[0.243736534,0.27518112900000002],"15728640":[5.0282514640000002,5.5383038640000004],"96":[6.9009999999999997e-06,7.2509999999999997e-06],"1984":[0.00014249600000000001,0.00014503699999999999],"139264":[0.01310038,0.013473284],"475136":[0.050175706,0.065314560999999979],"13631488":[4.4209237840000002,4.6072118160000004],"416":[2.7053e-05,3.0043e-05],"928":[6.2753e-05,6.9012999999999998e-05],"512":[3.6946000000000002e-05,4.0011e-05],"18432":[0.001442158,0.0014881150000000001],"16777216":[5.4326961770000004],"9728":[0.000734664,0.00074551399999999975],"1769472":[0.37986019199999999,0.39790530599999996],"1703936":[0.32884849500000002,0.33378266099999998],"2048":[0.000141244,0.00014840799999999999],"14336":[0.0010482780000000001,0.0010758930000000003],"448":[2.9801000000000001e-05,3.2098000000000003e-05],"5505024":[1.6282521559999998,1.653638441],"544":[4.0881999999999999e-05,4.1156999999999999e-05],"221184":[0.022299060000000002,0.022734312999999996],"90112":[0.0084104399999999982,0.0084333289999999998],"640":[4.8989000000000001e-05,5.2144000000000001e-05],"12800":[0.00092177700000000003,0.00099983499999999992],"262144":[0.026476057000000008,0.027533006000000006],"589824":[0.076850068999999993,0.100190023],"884736":[0.13098568199999999,0.182257007],"6144":[0.00052368500000000008,0.00056187299999999973],"1088":[7.9013999999999999e-05,8.6460999999999998e-05],"576":[4.3003999999999997e-05,4.3770000000000003e-05],"160":[1.1224e-05,1.2109e-05],"672":[4.9990000000000001e-05,5.3090999999999997e-05],"8912896":[2.61913931,2.6555258899999998],"100":[6.7909999999999999e-06,7.2869999999999999e-06],"507904":[0.055440161000000029,0.08227208699999998],"3840":[0.00028257,0.00031559300000000013],"192":[1.562e-05,1.6518999999999999e-05],"376832":[0.046362740999999999,0.047863960999999997],"98304":[0.010012505999999999,0.010441254000000001],"5376":[0.00043740800000000008,0.00045674300000000001],"94208":[0.0093416699999999998,0.0096458769999999989],"81920":[0.0071642199999999989,0.0073881559999999999],"3407872":[0.77345988799999998,0.81147312299999996],"104":[6.6540000000000002e-06,8.1799999999999996e-06],"122880":[0.011120106000000001,0.011283528000000001],"200":[1.3366999999999999e-05,1.4489e-05],"163840":[0.016815731,0.017184345999999955],"4063232":[1.00463825,1.0194385379999999],"5767168":[1.9577118600000001,1.999635045],"12582912":[5.1719242799999998,5.6243444269999996],"1600":[0.00011995,0.00012181200000000001],"136":[9.0710000000000001e-06,9.8819999999999996e-06],"232":[1.5489e-05,1.6662000000000001e-05],"7077888":[1.9779881130000001,2.323009581],"86016":[0.0077322300000000014,0.0080265069999999987],"31744":[0.002441829,0.0024823029999999999],"168":[1.1925e-05,1.4389999999999999e-05],"622592":[0.08039405799999999,0.096778174999999994],"108":[7.3969999999999997e-06,7.8159999999999994e-06],"327680":[0.035220368000000002,0.035946139000000002],"2176":[0.00016165400000000001,0.00016781200000000004],"3328":[0.00023344900000000002,0.00024640699999999987],"1":[2.1899999999999999e-07,2.3200000000000001e-07],"2":[2.4900000000000002e-07,2.5199999999999998e-07],"3":[2.4499999999999998e-07,2.7099999999999998e-07],"4":[4.3000000000000001e-07,4.82e-07],"7424":[0.00053187500000000001,0.000577872],"5":[4.9999999999999998e-07,5.44e-07],"23552":[0.0020453070000000001,0.0021486890000000001],"6":[5.5599999999999995e-07,5.6400000000000002e-07],"61440":[0.0048844909999999995,0.0048998429999999992],"491520":[0.052505174000000002,0.071807085000000034],"77824":[0.0067743599999999984,0.0069156700000000005],"7":[5.6100000000000001e-07,5.6599999999999996e-07],"8":[5.8400000000000004e-07,6.4000000000000001e-07],"208":[1.4301000000000001e-05,1.6815000000000001e-05],"9":[6.6199999999999997e-07,6.9100000000000003e-07],"73728":[0.0061658340000000011,0.0065838509999999999],"304":[2.0893000000000001e-05,2.3221999999999999e-05],"400":[2.7365e-05,2.8802999999999998e-05],"1310720":[0.26109600700000002,0.35998918400000002],"336":[2.4145e-05,2.7769000000000001e-05],"3670016":[0.89802697200000003,0.90619256500000001],"6656":[0.00049696300000000011,0.00051662300000000013],"15360":[0.0011562689999999997,0.0011640159999999999],"432":[2.9003999999999999e-05,3.0809999999999998e-05],"950272":[0.14106265600000001,0.20688818],"655360":[0.081614129000000007,0.101515914],"69632":[0.0057775040000000001,0.0059317580000000005],"11264":[0.00092848500000000005,0.00098229700000000003],"2752512":[0.69475783599999996,0.80579560299999997],"8126464":[2.3279432720000002,2.376636408],"27648":[0.0021030879999999995,0.002210545],"368":[2.8873999999999998e-05,2.8989999999999999e-05],"65536":[0.0051574150000000003,0.005469911],"16252928":[5.4519105139999997],"464":[3.0514999999999998e-05,3.4394000000000003e-05],"1015808":[0.17243076700000001,0.22770408799999997],"3072":[0.000257602,0.00025797599999999993],"110592":[0.0096955130000000028,0.0099285659999999998],"237568":[0.022519657999999998,0.024089248000000001],"278528":[0.028493503,0.030236521999999998],"496":[3.5240999999999997e-05,3.7808000000000001e-05],"13107200":[4.0355069520000004,4.6420986700000002],"9961472":[3.0727771759999998,3.1670522910000001],"5888":[0.00049722699999999993,0.00050773599999999984],"11010048":[3.6198790550000002,3.8529905960000002],"1920":[0.000132084,0.00013569400000000006],"2490368":[0.57531726800000005,0.58749373999999999],"19456":[0.00151925,0.00161403],"57344":[0.0044619200000000003,0.0045808470000000007],"1179648":[0.20136880800000001,0.26420813599999998],"4718592":[1.364073329,1.403054507],"360448":[0.041957307999999999,0.044240912],"1572864":[0.374136468,0.43322345299999998],"53248":[0.0041425000000000003,0.0042619759999999989],"3456":[0.00024175799999999998,0.00028144800000000001],"40960":[0.003315854,0.003433218],"4608":[0.00033932900000000003,0.00034878599999999996],"13824":[0.0010077969999999999,0.0010745360000000001],"819200":[0.12838661800000001,0.16072160999999999],"983040":[0.14850608800000001,0.22047346600000001],"8704":[0.00065557600000000027,0.00066542000000000012],"120":[8.0190000000000006e-06,8.3000000000000002e-06],"1024":[7.2034999999999997e-05,7.6767999999999994e-05],"49152":[0.004601356,0.0047656190000000005],"524288":[0.057291781,0.087830884000000012],"45056":[0.0038325289999999999,0.004009997999999999],"229376":[0.022997682999999998,0.023267849],"2688":[0.00020269100000000001,0.00024347800000000002],"152":[1.0625000000000001e-05,1.2729e-05],"5120":[0.00037484200000000001,0.00038576300000000001],"1507328":[0.36631311200000005,0.46288459999999998],"1216":[9.1850999999999999e-05,9.5780999999999997e-05],"1966080":[0.39059785600000002,0.40225479099999994],"1900544":[0.39999286000000001,0.44663895899999995],"184":[1.5262999999999999e-05,1.7033000000000001e-05],"7936":[0.00056781400000000004,0.00059746099999999998],"3801088":[0.88916538099999998,0.96292435099999996],"6815744":[1.8785511749999999,2.2217665489999998],"124":[8.1659999999999994e-06,9.9110000000000005e-06],"102400":[0.009132111,0.009653989],"311296":[0.034604442999999999,0.035011269000000005],"1408":[0.000106759,0.000117786],"393216":[0.051463251000000002,0.052152553999999997],"4352":[0.000323441,0.00034349599999999994],"6553600":[1.7934120689999999,2.0365616769999999],"20480":[0.0016250679999999997,0.001721169],"608":[4.3819999999999997e-05,5.0624999999999997e-05],"2228224":[0.48011194699999998,0.48381881100000002],"36864":[0.0029092320000000003,0.0030349999999999999],"704":[5.6971000000000001e-05,5.8096000000000001e-05],"720896":[0.098096611,0.140469388],"800":[5.4598000000000001e-05,5.9234999999999998e-05],"2621440":[0.637600104,0.70778061299999995],"425984":[0.04692920099999999,0.048230450999999994],"32768":[0.0024857879999999992,0.0025303930000000001],"12058624":[4.5447564600000003,4.8946409339999999],"128":[8.4619999999999996e-06,8.9889999999999998e-06],"180224":[0.019648260000000001,0.019752281],"224":[1.5167999999999999e-05,1.5383000000000002e-05],"736":[5.8269000000000001e-05,6.2719999999999996e-05],"320":[2.1855999999999999e-05,2.4547999999999999e-05],"557056":[0.062841969999999997,0.08983228800000001],"832":[6.0170999999999997e-05,6.2098000000000001e-05],"9437184":[3.033961052,3.4495418980000001],"3584":[0.00025054600000000004,0.00026235099999999997],"6291456":[2.393696367,2.4288317839999998],"256":[1.7520000000000002e-05,1.9436000000000002e-05],"15204352":[4.8446858390000003,5.4161111139999996],"28672":[0.0021451840000000001,0.002228416],"768":[6.4016000000000005e-05,6.5191999999999995e-05],"212992":[0.019939469000000005,0.020645900000000002],"864":[6.1733e-05,6.3569000000000001e-05],"352":[2.7174000000000001e-05,3.0593999999999999e-05],"253952":[0.024800862,0.027207334],"960":[6.7832999999999999e-05,7.2300999999999998e-05],"24576":[0.00231212,0.0023477509999999999],"7680":[0.0005783880000000001,0.00064953600000000004],"294912":[0.030579988000000002,0.032120076999999997],"1048576":[0.160980599,0.23742202200000001],"10485760":[3.5014536650000001,3.6312833800000002],"344064":[0.039016855999999996,0.041640755999999994],"288":[1.8834e-05,2.1467e-05],"1152":[8.4431999999999994e-05,8.4864000000000006e-05],"384":[2.9391999999999999e-05,3.7323999999999997e-05],"2304":[0.000173788,0.000179753],"896":[6.3187000000000003e-05,6.6987000000000001e-05],"480":[3.2410999999999999e-05,3.6754000000000001e-05],"1441792":[0.30116717300000001,0.39168097600000001],"992":[6.7856999999999998e-05,8.0289000000000003e-05],"3968":[0.00029512899999999999,0.00030919500000000001],"6400":[0.00046814999999999997,0.00048895700000000004],"1344":[9.8973000000000003e-05,0.000106193],"126976":[0.011457241,0.01171634],"2883584":[0.78160288499999997,0.88923756300000001],"753664":[0.107290108,0.14281861000000001],"16384":[0.001214375,0.001305411],"131072":[0.012360803,0.012372635],"458752":[0.047487951,0.059141830999999992],"172032":[0.017665313999999998,0.01855801],"12288":[0.001089904,0.001148034],"14680064":[4.7808190890000004,5.6231713589999996],"1536":[0.000131853,0.00013336200000000002],"25600":[0.0018987100000000001,0.0019608799999999999],"1835008":[0.38104920799999997,0.38394661499999999],"10752":[0.00084579199999999994,0.00091585600000000016],"21504":[0.0017445,0.0018253170000000006],"7602176":[2.1557501530000001,2.2028521510000001],"5632":[0.000450183,0.000534174],"10":[6.75e-07,7.0100000000000004e-07],"3145728":[0.98618416899999994,1.017472044],"245760":[0.024385881000000002,0.025311391999999995],"1728":[0.00012420399999999999,0.00012988299999999999],"11":[6.9400000000000005e-07,7.3600000000000003e-07],"1114112":[0.18227685800000001,0.23752147600000001],"12":[8.85e-07,1.0219999999999999e-06],"7340032":[2.0702670489999999,2.2010751759999998],"7168":[0.00051985200000000001,0.00056790499999999984],"13":[8.7000000000000003e-07,8.9100000000000002e-07],"6029312":[2.097270408,2.1188121350000002],"14":[1.0389999999999999e-06,1.062e-06],"3200":[0.00022277400000000002,0.00026534199999999995],"20":[1.145e-06,1.466e-06],"204800":[0.020317025000000002,0.020968451999999999],"15":[9.3699999999999999e-07,9.6500000000000008e-07],"13312":[0.00097487100000000009,0.001026009],"4980736":[1.371958845,1.513029183],"118784":[0.010811897000000001,0.010864292000000001],"51200":[0.0040133590000000002,0.0042347110000000004],"16":[1.043e-06,1.0979999999999999e-06],"21":[1.3740000000000001e-06,1.539e-06],"917504":[0.141540894,0.193278061],"22":[1.4270000000000001e-06,1.559e-06],"4864":[0.00035687199999999994,0.00040337599999999989],"17":[1.048e-06,1.145e-06],"14848":[0.001073891,0.0011638779999999999],"23":[1.404e-06,1.4720000000000001e-06],"786432":[0.12009368400000001,0.16124707399999999],"18":[9.850000000000001e-07,1.063e-06],"1638400":[0.31259563000000001,0.323987896],"7864320":[2.314230056,2.33267252],"24":[1.339e-06,1.826e-06],"14155776":[4.4747817559999996,10.899537153000001],"19":[1.0249999999999999e-06,1.1009999999999999e-06],"30":[1.471e-06,1.5740000000000001e-06],"25":[1.451e-06,1.469e-06],"31":[1.5969999999999999e-06,1.6559999999999999e-06],"1280":[9.5023000000000001e-05,9.7022999999999996e-05],"26":[1.3909999999999999e-06,1.4300000000000001e-06],"3932160":[0.95302750599999997,1.077542684],"2432":[0.00019119699999999999,0.00019589299999999999],"32":[2.0669999999999999e-06,2.328e-06],"27":[1.3999999999999999e-06,1.497e-06],"409600":[0.045426659000000001,0.045750438000000004]}},{"title":"OrderedSet formSymmetricDifference with Array (100% overlap)","results":{"28":[8.3500000000000005e-07,8.9899999999999999e-07],"34":[8.9800000000000002e-07,1.141e-06],"29":[7.7899999999999997e-07,9.3600000000000002e-07],"40":[1.0139999999999999e-06,1.159e-06],"17408":[0.00049397000000000004,0.00058866000000000007],"1472":[4.5153e-05,4.7701999999999998e-05],"112":[2.5579999999999999e-06,2.8329999999999998e-06],"1376256":[0.16609343799999998,0.21234747300000001],"5242880":[0.96547122600000002,1.05002526],"36":[9.0800000000000003e-07,1.001e-06],"42":[1.1489999999999999e-06,1.2359999999999999e-06],"11534336":[2.2684497850000001,2.6678537200000001],"114688":[0.0043326120000000004,0.0046000320000000004],"144":[3.6890000000000002e-06,3.9360000000000001e-06],"38":[9.9600000000000008e-07,1.0580000000000001e-06],"240":[5.6620000000000002e-06,5.818e-06],"9216":[0.00025986800000000001,0.00031220199999999998],"44":[1.1689999999999999e-06,1.389e-06],"1664":[3.8859000000000002e-05,4.1622000000000002e-05],"196608":[0.012025141,0.012160008999999998],"155648":[0.0072238769999999983,0.0074268009999999994],"2816":[9.4085000000000005e-05,0.000102834],"50":[1.2440000000000001e-06,1.3430000000000001e-06],"2359296":[0.34059850200000003,0.43250453799999999],"46":[1.2109999999999999e-06,1.3179999999999999e-06],"176":[5.113e-06,5.4519999999999996e-06],"52":[1.313e-06,1.3850000000000001e-06],"272":[6.251e-06,7.0990000000000001e-06],"116":[2.7750000000000001e-06,3.405e-06],"47104":[0.001688756,0.0017968700000000001],"6912":[0.00017283399999999997,0.000187734],"1856":[4.6601000000000003e-05,5.2995000000000003e-05],"48":[1.2929999999999999e-06,1.697e-06],"2097152":[0.27979229300000003,0.29597946100000005],"54":[1.3659999999999999e-06,1.418e-06],"2031616":[0.264176678,0.27651559100000001],"43008":[0.0015068810000000005,0.0015685929999999996],"60":[1.567e-06,1.624e-06],"30720":[0.00087855399999999992,0.000902467],"56":[1.389e-06,1.522e-06],"62":[1.578e-06,1.697e-06],"58":[1.4050000000000001e-06,1.4929999999999999e-06],"3014656":[0.54538002900000004,0.604172233],"64":[1.5510000000000001e-06,1.742e-06],"8388608":[1.502263125,1.5869823860000001],"29696":[0.00081481700000000002,0.00082246999999999995],"216":[5.3190000000000002e-06,5.3340000000000001e-06],"106496":[0.003885777,0.0039582800000000007],"72":[1.8109999999999999e-06,1.9549999999999999e-06],"442368":[0.021443812999999999,0.024310452],"147456":[0.0070410079999999996,0.007392906000000002],"4456448":[0.71010511199999993,0.7511352],"63488":[0.001974843,0.0019769180000000003],"38912":[0.0011919650000000001,0.0012681389999999997],"68":[1.8339999999999999e-06,1.875e-06],"188416":[0.010391101,0.010582025],"248":[5.6210000000000001e-06,6.4080000000000003e-06],"80":[1.9659999999999999e-06,2.154e-06],"2560":[7.5717999999999996e-05,8.6473999999999999e-05],"34816":[0.0010429860000000003,0.001183244],"3712":[9.5830999999999998e-05,0.000103076],"3538944":[0.57358748199999998,0.69600666200000005],"76":[2.0320000000000002e-06,2.0439999999999998e-06],"4194304":[0.648380022,0.64952906799999999],"851968":[0.071145555999999999,0.102890527],"4096":[0.000107799,0.000116808],"59392":[0.0017798010000000003,0.0018588389999999997],"84":[2.2929999999999999e-06,2.2970000000000002e-06],"3276800":[0.45659473900000003,0.46172478400000005],"55296":[0.0015835560000000003,0.0016320060000000001],"688128":[0.043381675000000008,0.070787476999999988],"8192":[0.000218509,0.00022949799999999999],"10240":[0.00030466300000000005,0.00031179300000000004],"15872":[0.00045130100000000004,0.00046292399999999997],"92":[2.5749999999999999e-06,3.1870000000000001e-06],"26624":[0.000677745,0.000716313],"1792":[4.4725999999999998e-05,5.0532999999999999e-05],"11776":[0.00041210299999999993,0.00044633500000000007],"2944":[9.9439999999999997e-05,0.000106884],"88":[2.537e-06,2.672e-06],"22528":[0.00073172699999999994,0.00080838399999999988],"1245184":[0.132006451,0.19791631900000001],"15728640":[2.9601651919999998,3.2144641090000001],"96":[2.7580000000000001e-06,3.0130000000000002e-06],"1984":[5.0195000000000003e-05,5.0825999999999998e-05],"139264":[0.0059645140000000006,0.0065400600000000003],"475136":[0.023491977000000004,0.034772289000000012],"13631488":[2.6110077079999998,2.6903357639999999],"416":[9.2560000000000008e-06,9.8509999999999994e-06],"928":[2.2280999999999999e-05,2.3519e-05],"512":[1.3101999999999999e-05,1.4523e-05],"18432":[0.00056657300000000012,0.00058997400000000027],"16777216":[3.120576695],"9728":[0.00028050799999999995,0.00030972500000000001],"1769472":[0.232827794,0.26535786500000003],"1703936":[0.20452861999999999,0.23429541100000001],"2048":[5.2021000000000002e-05,5.5853000000000002e-05],"14336":[0.00036382500000000002,0.00040752099999999999],"448":[1.0332999999999999e-05,1.0908e-05],"5505024":[1.060530126,1.0726656399999999],"544":[1.4741e-05,1.5775999999999999e-05],"221184":[0.0097907419999999669,0.011213417],"90112":[0.0035173960000000003,0.003707718],"640":[1.8048000000000001e-05,1.8101000000000002e-05],"12800":[0.00032445500000000002,0.00033698699999999996],"262144":[0.014302312999999997,0.014789043999999998],"589824":[0.04025091900000001,0.056466449999999987],"884736":[0.082099184000000019,0.11709383199999999],"6144":[0.000216154,0.00022705700000000005],"1088":[3.0636999999999998e-05,3.2246000000000003e-05],"576":[1.5443000000000001e-05,1.5477000000000001e-05],"160":[3.8770000000000003e-06,4.4710000000000001e-06],"672":[1.8491e-05,1.9867000000000001e-05],"8912896":[1.6300406889999999,1.658532044],"100":[2.328e-06,2.4370000000000001e-06],"507904":[0.032419851,0.052661957000000002],"3840":[0.000108451,0.00010909],"192":[5.553e-06,6.5180000000000001e-06],"376832":[0.023149194999999997,0.023773042000000001],"98304":[0.004298563,0.0046388750000000006],"5376":[0.000168791,0.000174439],"94208":[0.0040118290000000006,0.0041435330000000005],"81920":[0.0030462810000000001,0.0031077929999999998],"3407872":[0.48487504699999995,0.48525601200000001],"104":[2.3e-06,2.728e-06],"122880":[0.004975195,0.0050656060000000003],"200":[4.5970000000000002e-06,4.8289999999999998e-06],"163840":[0.0085735179999999987,0.0086449600000000019],"4063232":[0.62002189200000002,0.68881459499999997],"5767168":[1.1698469460000001,1.190730574],"12582912":[2.9579511570000001,3.27567619],"1600":[3.6748000000000001e-05,3.9583999999999999e-05],"136":[3.4829999999999999e-06,3.5370000000000002e-06],"232":[5.2920000000000003e-06,5.6779999999999997e-06],"7077888":[1.092910212,1.3456718269999999],"86016":[0.0033650449999999992,0.0034099199999999994],"31744":[0.00089187800000000014,0.00094622500000000019],"168":[4.3329999999999998e-06,5.3360000000000002e-06],"622592":[0.043458603999999998,0.049376410999999995],"108":[2.5790000000000002e-06,2.6410000000000002e-06],"327680":[0.017810314000000001,0.018020954999999998],"2176":[5.5557999999999999e-05,6.3070000000000004e-05],"3328":[8.0883999999999993e-05,9.2546999999999993e-05],"1":[2.1899999999999999e-07,2.29e-07],"2":[2.48e-07,2.4999999999999999e-07],"3":[2.4400000000000001e-07,2.72e-07],"4":[2.6600000000000003e-07,2.8500000000000002e-07],"7424":[0.000190158,0.000231475],"5":[2.9799999999999999e-07,3.3200000000000001e-07],"23552":[0.00083124000000000013,0.00088973399999999999],"6":[3.2500000000000001e-07,3.4499999999999998e-07],"61440":[0.0018430389999999999,0.00187116],"491520":[0.024438661000000035,0.03480957400000001],"77824":[0.0027459049999999994,0.0029467530000000003],"7":[3.22e-07,3.5199999999999998e-07],"8":[3.3700000000000001e-07,3.8000000000000001e-07],"208":[4.9139999999999999e-06,5.1440000000000002e-06],"9":[3.9099999999999999e-07,3.9799999999999999e-07],"73728":[0.0025083290000000001,0.0026619440000000003],"304":[7.4529999999999996e-06,9.1670000000000005e-06],"400":[9.3179999999999996e-06,9.7419999999999992e-06],"1310720":[0.16728027999999995,0.23036353600000001],"336":[9.2029999999999998e-06,9.9340000000000001e-06],"3670016":[0.55820294400000003,0.62638043999999993],"6656":[0.000163795,0.00018155999999999999],"15360":[0.00041228200000000003,0.00045116900000000007],"432":[9.8390000000000002e-06,1.0454e-05],"950272":[0.073865255000000005,0.132406518],"655360":[0.046663955,0.060963147000000009],"69632":[0.002281108,0.0023642159999999997],"11264":[0.000358718,0.00039677900000000004],"2752512":[0.434769299,0.53236195600000003],"8126464":[1.556684825,1.617717335],"27648":[0.00073452400000000007,0.00074369499999999995],"368":[1.0791999999999999e-05,1.0944000000000001e-05],"65536":[0.0020719250000000001,0.0021348180000000001],"16252928":[3.3229001990000002],"464":[1.0813e-05,1.1715999999999999e-05],"1015808":[0.104880823,0.149348868],"3072":[0.00010012499999999999,0.000106382],"110592":[0.0041447519999999998,0.004412343],"237568":[0.010736205,0.012679602],"278528":[0.013946423000000038,0.015981655000000001],"496":[1.2231e-05,1.3332e-05],"13107200":[2.249029835,2.5660543689999997],"9961472":[1.909743773,1.9517171339999999],"5888":[0.000202015,0.00022805299999999998],"11010048":[2.138577583,2.2288189819999999],"1920":[5.0099000000000003e-05,5.2175000000000001e-05],"2490368":[0.36728397200000001,0.38972548699999998],"19456":[0.00059657000000000004,0.00061247000000000027],"57344":[0.0016783239999999997,0.001702816],"1179648":[0.115401051,0.160799422],"4718592":[0.81827519699999995,0.88569583200000002],"360448":[0.020775104000000006,0.021194177000000005],"1572864":[0.21369503300000001,0.230714102],"53248":[0.0014699560000000003,0.0015363589999999999],"3456":[8.8323000000000001e-05,9.8721000000000006e-05],"40960":[0.0013273619999999999,0.0013756810000000003],"4608":[0.00012940100000000002,0.00014002900000000001],"13824":[0.00035505399999999994,0.00037954899999999997],"819200":[0.071384955,0.10035624999999999],"983040":[0.088765916,0.14472917599999999],"8704":[0.00024084700000000003,0.00026114700000000009],"120":[2.8909999999999999e-06,2.9840000000000001e-06],"1024":[2.5735e-05,2.6758e-05],"49152":[0.0018613150000000001,0.0019483910000000001],"524288":[0.02760484799999996,0.044059776000000002],"45056":[0.001565859,0.0016572610000000002],"229376":[0.010832319,0.011592996],"2688":[8.0235999999999995e-05,8.7007000000000002e-05],"152":[3.9829999999999998e-06,4.1010000000000002e-06],"5120":[0.00015067100000000001,0.00015684999999999999],"1507328":[0.193992999,0.30285914600000002],"1216":[3.5213000000000003e-05,3.5772000000000002e-05],"1966080":[0.25313186199999999,0.282300738],"1900544":[0.22891335300000001,0.24960928199999999],"184":[5.2240000000000003e-06,5.7819999999999999e-06],"7936":[0.00021225399999999999,0.000219803],"3801088":[0.55679345300000005,0.64858966100000004],"6815744":[1.03429963,1.272640287],"124":[3.112e-06,3.4690000000000002e-06],"102400":[0.0039243940000000003,0.004080633000000001],"311296":[0.01833007,0.018715416999999995],"1408":[3.9808999999999998e-05,4.5686999999999998e-05],"393216":[0.025483537000000007,0.025991184000000007],"4352":[0.00012208,0.00012813899999999999],"6553600":[0.99844229699999998,1.1665003860000001],"20480":[0.00062098899999999996,0.00064928000000000002],"608":[1.6232999999999999e-05,1.9253999999999999e-05],"2228224":[0.30609341000000001,0.31105574000000002],"36864":[0.001099725,0.001150398],"704":[2.1529e-05,2.1863000000000001e-05],"720896":[0.049449536000000002,0.072812211000000002],"800":[1.7467000000000001e-05,1.9262999999999998e-05],"2621440":[0.398274146,0.40395839200000005],"425984":[0.019804548000000005,0.026354572],"32768":[0.000946378,0.000961369],"12058624":[2.649259067,2.7190688669999998],"128":[3.2679999999999999e-06,3.5319999999999998e-06],"180224":[0.0095713660000000013,0.0096111880000000014],"224":[5.2410000000000003e-06,5.5060000000000003e-06],"736":[2.3155000000000001e-05,2.3186000000000001e-05],"320":[8.2379999999999997e-06,9.3070000000000008e-06],"557056":[0.034999957000000012,0.046932984000000004],"832":[1.9757000000000001e-05,2.0412e-05],"9437184":[1.7607409469999999,2.1860125450000001],"3584":[8.8949000000000005e-05,9.4191000000000007e-05],"6291456":[1.4481960599999999,1.5037628789999999],"256":[5.9850000000000003e-06,6.7580000000000003e-06],"15204352":[2.692307344,3.3240079649999998],"28672":[0.00079701399999999986,0.00081942699999999996],"768":[2.4589000000000001e-05,2.4964999999999999e-05],"212992":[0.009066368,0.0093301800000000004],"864":[2.0463999999999999e-05,2.1324000000000001e-05],"352":[9.7350000000000008e-06,1.0977e-05],"253952":[0.012041173000000001,0.014058429000000001],"960":[2.3805e-05,2.7129999999999999e-05],"24576":[0.00092189600000000017,0.00093012100000000012],"7680":[0.00019679800000000004,0.00024232],"294912":[0.016608385,0.016695656],"1048576":[0.090126521000000001,0.16232011099999999],"10485760":[1.965550318,2.028274213],"344064":[0.021892623,0.022045710999999999],"288":[7.126e-06,7.6020000000000002e-06],"1152":[2.9964999999999999e-05,3.1442000000000002e-05],"384":[1.1306e-05,1.184e-05],"2304":[5.9824999999999997e-05,6.5784000000000006e-05],"896":[2.0262e-05,2.3598999999999999e-05],"480":[1.1266e-05,1.1834999999999999e-05],"1441792":[0.17439379999999999,0.26842432500000002],"992":[2.3773000000000001e-05,2.8430000000000001e-05],"3968":[0.000101283,0.000108557],"6400":[0.000156129,0.00016259999999999999],"1344":[3.7452e-05,3.9042999999999999e-05],"126976":[0.0051743839999999998,0.005390143],"2883584":[0.48741711300000001,0.58347737200000005],"753664":[0.061415766999999996,0.081034671999999988],"16384":[0.00045876599999999994,0.00048921400000000008],"131072":[0.0058568959999999986,0.006008058000000001],"458752":[0.022498607,0.028684514000000001],"172032":[0.0087337519999999974,0.0091452169999999989],"12288":[0.00045120700000000002,0.000460254],"14680064":[2.4860092470000001,3.4334243510000002],"1536":[4.7123000000000003e-05,5.2040999999999999e-05],"25600":[0.00065723400000000003,0.00067643399999999985],"1835008":[0.227919819,0.25366184600000002],"10752":[0.000334937,0.000365972],"21504":[0.00070134800000000008,0.00073807399999999991],"7602176":[1.2870749319999999,1.3762351370000001],"5632":[0.000185067,0.00021111799999999999],"10":[3.9299999999999999e-07,4.2e-07],"3145728":[0.64871910200000005,0.65378114300000001],"245760":[0.013054005,0.013337048000000001],"1728":[3.9650999999999997e-05,4.5853999999999998e-05],"11":[4.08e-07,4.1600000000000002e-07],"1114112":[0.118271742,0.16982381699999999],"12":[4.2399999999999999e-07,4.63e-07],"7340032":[1.198985067,1.2210007780000001],"7168":[0.00018662599999999998,0.000197271],"13":[4.63e-07,4.7100000000000002e-07],"6029312":[1.237810217,1.249179421],"14":[5.4799999999999998e-07,5.4899999999999995e-07],"3200":[8.2169000000000006e-05,8.3158000000000006e-05],"20":[5.7400000000000003e-07,6.92e-07],"204800":[0.0090214349999999995,0.0099073580000000015],"15":[5.2e-07,5.8699999999999995e-07],"13312":[0.00034673699999999996,0.000390978],"4980736":[0.85809369499999999,0.897537056],"118784":[0.004772447,0.0048656469999999999],"51200":[0.0014485329999999999,0.0015217969999999996],"16":[5.7400000000000003e-07,6.2200000000000004e-07],"21":[6.6000000000000003e-07,7.6499999999999998e-07],"917504":[0.084477420000000011,0.12734572799999999],"22":[6.8299999999999996e-07,7.5600000000000005e-07],"4864":[0.00014670499999999999,0.00015334499999999999],"17":[5.6599999999999996e-07,6.3799999999999997e-07],"14848":[0.00040711100000000004,0.00042757299999999999],"23":[7.2200000000000003e-07,7.5700000000000002e-07],"786432":[0.066779696999999999,0.10984505899999999],"18":[5.5700000000000002e-07,6.3200000000000005e-07],"1638400":[0.198215423,0.20756387900000001],"7864320":[1.3641659939999999,1.4344067869999999],"24":[7.61e-07,8.4799999999999997e-07],"14155776":[2.5779571109999999,3.2118646650000002],"19":[5.6700000000000003e-07,6.2300000000000001e-07],"30":[8.3200000000000004e-07,8.3300000000000001e-07],"25":[7.54e-07,7.7000000000000004e-07],"31":[9.1500000000000003e-07,9.3900000000000003e-07],"1280":[3.6390999999999998e-05,3.8427999999999999e-05],"26":[7.0200000000000001e-07,7.8000000000000005e-07],"3932160":[0.69547596499999997,0.69854279200000002],"2432":[7.0759999999999993e-05,7.9536999999999994e-05],"32":[8.6099999999999999e-07,9.2699999999999998e-07],"27":[7.5199999999999996e-07,8.4499999999999996e-07],"409600":[0.018732204999999998,0.022647339000000006]}},{"title":"OrderedSet subtract Array (0% overlap)","results":{"28":[7.7000000000000004e-07,8.23e-07],"34":[8.6400000000000001e-07,1.0410000000000001e-06],"29":[7.2200000000000003e-07,8.7300000000000005e-07],"40":[1.0589999999999999e-06,1.1480000000000001e-06],"17408":[0.00064051199999999998,0.00066825500000000009],"1472":[8.0007999999999997e-05,8.8517000000000006e-05],"112":[2.463e-06,2.497e-06],"1376256":[0.20313263000000001,0.28673148799999998],"5242880":[1.2067960549999999,1.216374149],"36":[9.47e-07,9.9300000000000006e-07],"42":[1.328e-06,1.4470000000000001e-06],"11534336":[3.5754301059999998,3.6136921539999998],"114688":[0.0042763439999999996,0.0044231649999999997],"144":[3.8589999999999998e-06,5.0839999999999999e-06],"38":[1.0839999999999999e-06,1.1000000000000001e-06],"240":[5.976e-06,6.0279999999999997e-06],"9216":[0.00033457800000000003,0.000403982],"44":[1.412e-06,1.9039999999999999e-06],"1664":[4.5475000000000001e-05,4.9011999999999998e-05],"196608":[0.019332964999999997,0.019408328000000002],"155648":[0.008450249,0.0087415800000000023],"2816":[0.00013131200000000002,0.00015472400000000002],"50":[1.054e-06,1.238e-06],"2359296":[0.37868172099999997,0.39935902699999998],"46":[1.3820000000000001e-06,3.3100000000000001e-06],"176":[8.1450000000000008e-06,8.5059999999999995e-06],"52":[1.2079999999999999e-06,1.246e-06],"272":[7.2320000000000004e-06,8.371e-06],"116":[2.9100000000000001e-06,2.9110000000000002e-06],"47104":[0.0026614440000000007,0.002727134],"6912":[0.00019865700000000001,0.00021234199999999999],"1856":[5.4486e-05,6.3573999999999998e-05],"48":[1.6899999999999999e-06,2.728e-06],"2097152":[0.29138751099999999,0.296103173],"54":[1.3829999999999999e-06,1.3990000000000001e-06],"2031616":[0.26177568800000001,0.26862744799999999],"43008":[0.002003276,0.002120102],"60":[1.559e-06,1.5850000000000001e-06],"30720":[0.00098884500000000013,0.001011437],"56":[1.4619999999999999e-06,1.4649999999999999e-06],"62":[1.547e-06,1.6080000000000001e-06],"58":[1.3999999999999999e-06,1.6509999999999999e-06],"3014656":[0.85732942200000006,0.89506286000000002],"64":[1.5519999999999999e-06,2.165e-06],"8388608":[1.529719008,1.5332534019999999],"29696":[0.00091481499999999992,0.00097656400000000008],"216":[4.8690000000000003e-06,5.575e-06],"106496":[0.003754425,0.0038318690000000003],"72":[1.9819999999999998e-06,2.4949999999999998e-06],"442368":[0.020878851,0.025092527999999996],"147456":[0.0075185459999999992,0.0078169079999999974],"4456448":[0.79207428599999996,0.83541364000000007],"63488":[0.0023076249999999998,0.0023363520000000003],"38912":[0.001544499,0.001556701],"68":[1.722e-06,1.996e-06],"188416":[0.015462531,0.015821724999999995],"248":[5.9800000000000003e-06,6.4309999999999999e-06],"80":[2.8849999999999999e-06,3.1860000000000001e-06],"2560":[0.00010718900000000001,0.00012068100000000001],"34816":[0.0012339220000000001,0.0014325200000000001],"3712":[0.00010845600000000001,0.000112574],"3538944":[0.50500601099999998,0.515423297],"76":[2.26e-06,2.4569999999999999e-06],"4194304":[0.700009667,0.70015225800000003],"851968":[0.056644292999999991,0.086326768999999998],"4096":[0.00013149,0.000142659],"59392":[0.0019863529999999997,0.0020999730000000002],"84":[3.0690000000000002e-06,3.2150000000000001e-06],"3276800":[0.44605719300000002,0.461100976],"55296":[0.0017540870000000003,0.001831154],"688128":[0.055119534000000005,0.085962012000000004],"8192":[0.000282274,0.00029900099999999997],"10240":[0.00042545699999999991,0.00047159799999999999],"15872":[0.000505467,0.0005537239999999999],"92":[3.6940000000000001e-06,3.9400000000000004e-06],"26624":[0.00077224199999999992,0.00080889699999999994],"1792":[5.1714e-05,5.9524999999999997e-05],"11776":[0.00067511200000000006,0.00070790100000000015],"2944":[0.000162969,0.000185961],"88":[3.6780000000000002e-06,3.9670000000000003e-06],"22528":[0.0011855799999999999,0.001196262],"1245184":[0.146917355,0.221346406],"15728640":[2.8625779549999999,2.8802381549999998],"96":[4.0389999999999998e-06,4.6659999999999999e-06],"1984":[6.0405000000000002e-05,6.2106999999999993e-05],"139264":[0.0064365919999999997,0.0073764619999999986],"475136":[0.023891652999999995,0.031485785999999995],"13631488":[2.2144107709999998,2.2930502509999999],"416":[9.6670000000000008e-06,1.0322e-05],"928":[2.6695000000000001e-05,2.7651999999999999e-05],"512":[1.5096000000000001e-05,1.6922000000000002e-05],"18432":[0.00070970699999999996,0.00074374],"16777216":[3.2421377630000001],"9728":[0.00037867699999999995,0.00040999],"1769472":[0.20631407399999999,0.23102578300000001],"1703936":[0.19233820400000001,0.19905645199999999],"2048":[6.9176000000000003e-05,7.0007999999999998e-05],"14336":[0.00044157500000000004,0.00047168899999999996],"448":[1.0786e-05,1.2595000000000001e-05],"5505024":[1.4011179979999999,1.4174043329999999],"544":[1.8071e-05,1.9470000000000002e-05],"221184":[0.009494279999999999,0.0097038630000000018],"90112":[0.0052697080000000006,0.0053756170000000009],"640":[2.6540999999999999e-05,2.7316000000000001e-05],"12800":[0.00036487599999999998,0.00038396200000000006],"262144":[0.013186556,0.013560210999999999],"589824":[0.03948633,0.063668122999999979],"884736":[0.063559255999999981,0.107412243],"6144":[0.00033576199999999987,0.00040124000000000008],"1088":[3.7632000000000002e-05,4.0064000000000001e-05],"576":[2.0236000000000001e-05,2.0242999999999999e-05],"160":[4.8949999999999997e-06,4.9849999999999997e-06],"672":[2.6721999999999999e-05,2.9575999999999999e-05],"8912896":[1.7134221190000001,1.7307075350000001],"100":[2.1409999999999999e-06,2.689e-06],"507904":[0.027918987000000006,0.040554047000000003],"3840":[0.00012681000000000001,0.00013022499999999998],"192":[1.0703000000000001e-05,1.1802e-05],"376832":[0.034240696000000001,0.035712840999999995],"98304":[0.0072244560000000015,0.0077317250000000001],"5376":[0.000240979,0.00024770199999999998],"94208":[0.0061824469999999998,0.006377530000000001],"81920":[0.0038630319999999998,0.0041173620000000003],"3407872":[0.46498971600000005,0.50315860199999995],"104":[2.3949999999999999e-06,2.526e-06],"122880":[0.0050875099999999991,0.005154156],"200":[4.5580000000000002e-06,4.6460000000000001e-06],"163840":[0.010005801999999999,0.010250204000000001],"4063232":[0.659968534,0.66132352100000003],"5767168":[1.688009332,1.7005158680000001],"12582912":[5.3434694570000003,5.5261330400000004],"1600":[3.9734999999999998e-05,4.1012e-05],"136":[3.484e-06,3.7249999999999999e-06],"232":[5.429e-06,5.835e-06],"7077888":[1.1157272,1.18873988],"86016":[0.0044248459999999996,0.0047099240000000007],"31744":[0.001043385,0.0011040069999999999],"168":[5.6899999999999997e-06,7.0040000000000002e-06],"622592":[0.044235154999999998,0.055468809000000008],"108":[2.4710000000000001e-06,2.7439999999999999e-06],"327680":[0.021815404,0.021958686000000002],"2176":[7.5271999999999994e-05,8.2704e-05],"3328":[9.2102999999999996e-05,9.8864999999999996e-05],"1":[1.6400000000000001e-07,1.8199999999999999e-07],"2":[1.86e-07,1.9000000000000001e-07],"3":[1.8900000000000001e-07,2.1199999999999999e-07],"4":[2.1199999999999999e-07,2.1400000000000001e-07],"7424":[0.000225255,0.000242456],"5":[2.35e-07,2.6800000000000002e-07],"23552":[0.001340181,0.001376436],"6":[2.6100000000000002e-07,2.7399999999999999e-07],"61440":[0.00215855,0.0022143849999999997],"491520":[0.026138169000000006,0.036049022],"77824":[0.003430813,0.0035396670000000007],"7":[2.53e-07,2.8500000000000002e-07],"8":[2.6899999999999999e-07,3.0499999999999999e-07],"208":[4.7690000000000004e-06,5.1080000000000001e-06],"9":[3.2800000000000003e-07,3.3099999999999999e-07],"73728":[0.003080761,0.0031802779999999995],"304":[9.7990000000000005e-06,1.0447e-05],"400":[9.2240000000000001e-06,9.7589999999999992e-06],"1310720":[0.17826894300000001,0.25305220099999998],"336":[1.1831000000000001e-05,1.1942e-05],"3670016":[0.548695249,0.55541131600000004],"6656":[0.000193919,0.000202807],"15360":[0.00050317000000000016,0.00053206200000000003],"432":[1.0386e-05,1.0943e-05],"950272":[0.071806996999999997,0.11723148800000005],"655360":[0.048197511000000012,0.068164670999999996],"69632":[0.002696422,0.0028101019999999997],"11264":[0.00056329300000000008,0.00059754699999999992],"2752512":[0.60627326699999995,0.65114640699999993],"8126464":[1.43263524,1.442803335],"27648":[0.00082732600000000008,0.00085226200000000001],"368":[1.4871e-05,1.6259000000000001e-05],"65536":[0.002377657,0.0024977939999999998],"16252928":[3.0476877779999998],"464":[1.1762e-05,1.2918999999999999e-05],"1015808":[0.087458477999999978,0.13892713599999995],"3072":[0.000186756,0.00018688799999999999],"110592":[0.0040613630000000001,0.0040741729999999995],"237568":[0.010836086,0.011283380000000003],"278528":[0.015299628000000004,0.015589093],"496":[1.3424999999999999e-05,1.4038e-05],"13107200":[2.071853747,2.1438964889999998],"9961472":[2.204637999,2.2718649690000001],"5888":[0.000318408,0.00034699400000000005],"11010048":[2.9370758449999999,3.0216572070000001],"1920":[5.5390999999999999e-05,6.1877000000000004e-05],"2490368":[0.44316785299999994,0.44873102100000001],"19456":[0.00079627399999999992,0.00079971600000000001],"57344":[0.0018581100000000001,0.001878062],"1179648":[0.12760771500000001,0.18027290400000001],"4718592":[0.92188586500000003,0.954297438],"360448":[0.028152282000000008,0.029273496],"1572864":[0.38605645300000002,0.38767109399999999],"53248":[0.0016418020000000001,0.00167548],"3456":[9.8257000000000005e-05,0.00010325199999999999],"40960":[0.001781358,0.001846531],"4608":[0.00017019999999999999,0.000174291],"13824":[0.0004086640000000001,0.00043559000000000002],"819200":[0.053183073999999997,0.082607824999999996],"983040":[0.077914234999999984,0.11983612799999999],"8704":[0.00031522400000000007,0.00035656999999999996],"120":[2.8660000000000002e-06,2.9699999999999999e-06],"1024":[3.1486000000000003e-05,3.3445999999999998e-05],"49152":[0.003242745,0.0032560600000000003],"524288":[0.029047372999999998,0.039473065000000009],"45056":[0.002242782,0.0023813810000000001],"229376":[0.010175346,0.010520299],"2688":[0.000117525,0.00012781200000000002],"152":[4.5850000000000001e-06,4.8400000000000002e-06],"5120":[0.00021514099999999999,0.00021708200000000001],"1507328":[0.30171555900000002,0.43717165099999999],"1216":[4.6221999999999999e-05,4.7786e-05],"1966080":[0.251547256,0.25787222900000001],"1900544":[0.23614457899999999,0.26048081000000001],"184":[7.9840000000000001e-06,8.9460000000000004e-06],"7936":[0.00025328200000000002,0.00025926299999999992],"3801088":[0.57054589700000002,0.58696885200000004],"6815744":[1.0749367670000001,1.1175865119999999],"124":[3.1650000000000002e-06,3.304e-06],"102400":[0.0035688930000000001,0.0037733979999999994],"311296":[0.019731560000000002,0.019795924999999999],"1408":[7.0022000000000001e-05,7.2453000000000006e-05],"393216":[0.040575321999999997,0.041707759999999997],"4352":[0.00014810300000000002,0.000154747],"6553600":[0.97816632599999997,1.050788643],"20480":[0.00090304899999999984,0.000923648],"608":[2.1863999999999999e-05,2.3652e-05],"2228224":[0.33434786999999999,0.33918897100000001],"36864":[0.0013966429999999997,0.001448822],"704":[3.1244000000000001e-05,3.3349999999999997e-05],"720896":[0.065497930999999981,0.093977326],"800":[1.9862000000000001e-05,2.0656999999999999e-05],"2621440":[0.50596416900000007,0.53277711500000002],"425984":[0.019487727999999999,0.021259986000000002],"32768":[0.0011010319999999998,0.0011631899999999999],"12058624":[4.3251467950000002,4.6181312620000003],"128":[3.1370000000000002e-06,3.9539999999999998e-06],"180224":[0.013179061000000001,0.013285385],"224":[5.2000000000000002e-06,5.507e-06],"736":[3.4455999999999997e-05,3.7381e-05],"320":[1.0739e-05,1.1214e-05],"557056":[0.032604269000000005,0.050112577999999998],"832":[2.1946999999999998e-05,2.2787999999999999e-05],"9437184":[1.9949053329999999,2.0644910529999998],"3584":[0.000112083,0.000112946],"6291456":[2.4837225470000002,2.498831198],"256":[6.5019999999999998e-06,7.5569999999999998e-06],"15204352":[2.6761180379999998,2.728233973],"28672":[0.000862074,0.00092449999999999997],"768":[4.0036000000000001e-05,4.2509999999999998e-05],"212992":[0.0085975490000000012,0.0090959230000000023],"864":[2.3402000000000001e-05,2.3669999999999999e-05],"352":[1.5665999999999999e-05,1.5670000000000001e-05],"253952":[0.012455288,0.012951404],"960":[3.0066e-05,3.2923999999999999e-05],"24576":[0.001658503,0.0016625070000000001],"7680":[0.000240425,0.00028415800000000001],"294912":[0.016974112,0.018766511],"1048576":[0.093034909999999998,0.14944591500000001],"10485760":[2.5464646110000002,2.5711292559999999],"344064":[0.025779566,0.026423089],"288":[9.2690000000000005e-06,9.4169999999999998e-06],"1152":[3.9335999999999997e-05,3.9601000000000003e-05],"384":[2.2501999999999999e-05,2.4901000000000001e-05],"2304":[8.0671000000000001e-05,8.8709999999999996e-05],"896":[2.3765e-05,2.6659e-05],"480":[1.2622e-05,1.3256e-05],"1441792":[0.24965753900000001,0.36161657000000003],"992":[2.9065999999999999e-05,3.3976000000000001e-05],"3968":[0.00012987200000000001,0.00014552100000000002],"6400":[0.00017134600000000001,0.00017349799999999998],"1344":[6.0531e-05,6.0786999999999999e-05],"126976":[0.0053397969999999994,0.005357255],"2883584":[0.72212151000000002,0.78582163299999996],"753664":[0.083525649999999979,0.10598348],"16384":[0.00058786299999999999,0.00064638300000000037],"131072":[0.0057661209999999999,0.0060389040000000003],"458752":[0.022367411,0.028677472999999998],"172032":[0.011209496000000001,0.011904068],"12288":[0.00078851799999999999,0.00081421],"14680064":[2.541904835,2.6284643550000002],"1536":[8.3461999999999995e-05,9.9881000000000001e-05],"25600":[0.00072030200000000003,0.00073152700000000005],"1835008":[0.21388773299999997,0.22088174099999999],"10752":[0.00047808299999999997,0.00050173500000000001],"21504":[0.00097901100000000012,0.0010791569999999999],"7602176":[1.261435168,1.2982526999999999],"5632":[0.00026575200000000007,0.00031085299999999993],"10":[3.2300000000000002e-07,3.6699999999999999e-07],"3145728":[1.033899296,1.043268313],"245760":[0.011777095,0.011826673999999999],"1728":[4.7064000000000002e-05,5.4320000000000002e-05],"11":[3.46e-07,3.8799999999999998e-07],"1114112":[0.111296202,0.16749552200000001],"12":[3.4799999999999999e-07,4.4400000000000001e-07],"7340032":[1.171375931,1.2122192810000001],"7168":[0.000218254,0.00022773300000000001],"13":[3.8099999999999998e-07,3.8700000000000001e-07],"6029312":[2.0068310629999999,2.0337752010000001],"14":[4.9500000000000003e-07,5.2499999999999995e-07],"3200":[8.6007000000000005e-05,9.7999999999999997e-05],"20":[5.5499999999999998e-07,6.61e-07],"204800":[0.0083485399999999998,0.0083685590000000011],"15":[4.4200000000000001e-07,4.5499999999999998e-07],"13312":[0.00037418300000000005,0.00041506399999999998],"4980736":[1.0462893019999999,1.0602093239999999],"118784":[0.0046874279999999996,0.0049209370000000002],"51200":[0.001568184,0.001613022],"16":[5.4199999999999996e-07,5.4899999999999995e-07],"21":[6.9599999999999999e-07,8.1299999999999999e-07],"917504":[0.066172669000000017,0.10883298299999999],"22":[7.3499999999999995e-07,8.1299999999999999e-07],"4864":[0.00019882300000000002,0.00020106],"17":[5.2e-07,5.5899999999999996e-07],"14848":[0.00047615099999999991,0.00049158899999999996],"23":[8.0699999999999996e-07,8.8400000000000003e-07],"786432":[0.100877655,0.157807475],"18":[5.6899999999999997e-07,6.3900000000000004e-07],"1638400":[0.17787608799999999,0.18461096799999999],"7864320":[1.358821654,1.3594972169999999],"24":[1.0330000000000001e-06,1.3289999999999999e-06],"14155776":[2.364192214,4.6197663120000003],"19":[5.7999999999999995e-07,7.1699999999999997e-07],"30":[7.1800000000000005e-07,7.92e-07],"25":[6.5099999999999999e-07,6.7999999999999995e-07],"31":[8.7300000000000005e-07,1.096e-06],"1280":[4.8989999999999997e-05,4.9416000000000003e-05],"26":[5.99e-07,7.4300000000000002e-07],"3932160":[0.61313444800000005,0.61959152699999998],"2432":[9.3991000000000002e-05,0.000108099],"32":[8.4399999999999999e-07,1.0690000000000001e-06],"27":[6.61e-07,6.9699999999999995e-07],"409600":[0.018255469,0.018552394]}},{"title":"OrderedSet subtract Array (25% overlap)","results":{"28":[1.765e-06,1.9640000000000002e-06],"34":[2.0729999999999999e-06,2.1679999999999998e-06],"29":[1.6780000000000001e-06,1.888e-06],"40":[2.3470000000000001e-06,2.841e-06],"17408":[0.0010965789999999999,0.0012748529999999998],"1472":[0.000118847,0.00012861799999999999],"112":[5.5289999999999999e-06,5.8150000000000002e-06],"1376256":[0.253063818,0.36723594900000001],"5242880":[1.5495370939999999,1.555401319],"36":[2.0770000000000002e-06,2.4779999999999998e-06],"42":[2.5550000000000001e-06,3.1130000000000001e-06],"11534336":[4.3686764470000004,4.4993578809999999],"114688":[0.008409299999999998,0.0086166869999999979],"144":[7.8089999999999993e-06,8.8019999999999998e-06],"38":[2.3e-06,2.458e-06],"240":[1.3772e-05,1.3973e-05],"9216":[0.000612811,0.00067958500000000013],"44":[2.649e-06,3.388e-06],"1664":[9.9432999999999995e-05,9.9662999999999998e-05],"196608":[0.024656833,0.024785793],"155648":[0.013302546,0.013567446],"2816":[0.0001984,0.000236777],"50":[2.6000000000000001e-06,3.1470000000000001e-06],"2359296":[0.50770742300000005,0.54555173700000004],"46":[2.8329999999999998e-06,3.4199999999999999e-06],"176":[1.1946e-05,1.2814e-05],"52":[2.7310000000000002e-06,2.965e-06],"272":[1.5444e-05,1.5981000000000002e-05],"116":[6.4649999999999999e-06,7.3560000000000004e-06],"47104":[0.0039176570000000006,0.0041899670000000002],"6912":[0.00040506899999999998,0.000420271],"1856":[0.000111313,0.00011346],"48":[3.0860000000000002e-06,3.8469999999999998e-06],"2097152":[0.40425663699999997,0.41587912199999999],"54":[3.1669999999999999e-06,3.1949999999999999e-06],"2031616":[0.35637012899999998,0.393111341],"43008":[0.0032530709999999997,0.003486626],"60":[3.4529999999999998e-06,3.5049999999999999e-06],"30720":[0.002016299,0.0021281500000000001],"56":[3.2310000000000001e-06,3.3739999999999998e-06],"62":[3.602e-06,4.16e-06],"58":[3.1999999999999999e-06,3.2550000000000002e-06],"3014656":[0.92376081700000001,1.0399460140000001],"64":[3.4999999999999999e-06,4.3239999999999996e-06],"8388608":[2.2664249139999999,2.275429468],"29696":[0.0019024930000000003,0.0020233650000000005],"216":[1.1596999999999999e-05,1.257e-05],"106496":[0.0074545499999999999,0.0075454720000000001],"72":[4.2939999999999999e-06,5.0780000000000003e-06],"442368":[0.037632062000000001,0.043847523000000006],"147456":[0.012153155000000002,0.012410964999999999],"4456448":[1.131775518,1.1549206780000001],"63488":[0.0044536710000000011,0.004466505],"38912":[0.002613045,0.002673562],"68":[4.0029999999999996e-06,4.5759999999999999e-06],"188416":[0.020666133999999996,0.02211836],"248":[1.3269e-05,1.5125e-05],"80":[4.9960000000000001e-06,5.8259999999999998e-06],"2560":[0.00016969199999999999,0.00019797899999999998],"34816":[0.0021813890000000002,0.002502467],"3712":[0.000232155,0.000235744],"3538944":[0.74171516100000001,0.75768625300000003],"76":[4.8829999999999997e-06,5.2340000000000002e-06],"4194304":[0.94825502900000003,0.96338617299999996],"851968":[0.094296436000000011,0.14331805],"4096":[0.000263634,0.00028037900000000003],"59392":[0.0040090489999999998,0.004144844],"84":[5.4179999999999996e-06,5.507e-06],"3276800":[0.65332910200000005,0.66826409899999994],"55296":[0.0035079220000000001,0.0037003909999999995],"688128":[0.080480334000000001,0.11706388],"8192":[0.00056744400000000006,0.00058110400000000004],"10240":[0.00069901800000000004,0.0007234269999999999],"15872":[0.001052718,0.001089617],"92":[6.2280000000000003e-06,7.3300000000000001e-06],"26624":[0.001627849,0.0017367249999999997],"1792":[0.000102864,0.000124206],"11776":[0.00095131100000000015,0.001037954],"2944":[0.00021278699999999995,0.000239893],"88":[6.3550000000000001e-06,6.5379999999999999e-06],"22528":[0.001754505,0.0018544689999999996],"1245184":[0.198841449,0.28587313199999997],"15728640":[4.4197176459999996,4.5473186410000004],"96":[7.1300000000000003e-06,8.6710000000000005e-06],"1984":[0.000122261,0.00012767800000000002],"139264":[0.010782653999999999,0.011155139],"475136":[0.042596463000000008,0.054066916],"13631488":[3.5236564499999998,3.638536738],"416":[2.1038000000000001e-05,2.4655e-05],"928":[5.9215000000000001e-05,6.0072999999999999e-05],"512":[3.2833000000000002e-05,3.5791999999999999e-05],"18432":[0.0012301880000000001,0.001267036],"16777216":[4.9361023040000003],"9728":[0.00063856700000000004,0.00066744900000000008],"1769472":[0.292644346,0.30179042599999995],"1703936":[0.27963326799999999,0.29102008099999999],"2048":[0.00013607999999999998,0.000139586],"14336":[0.000899602,0.00093436500000000004],"448":[2.4219999999999999e-05,2.675e-05],"5505024":[1.7750476980000001,1.8113792640000002],"544":[3.1967000000000001e-05,3.6563000000000002e-05],"221184":[0.017592740000000003,0.018018733000000002],"90112":[0.0078036660000000008,0.0079528580000000001],"640":[4.1289999999999999e-05,4.6854000000000002e-05],"12800":[0.00076708000000000006,0.00078347999999999992],"262144":[0.02318508,0.024312167999999995],"589824":[0.061441855999999982,0.090791052000000011],"884736":[0.106861651,0.14848091899999999],"6144":[0.00052407800000000009,0.00054161200000000002],"1088":[6.3814999999999998e-05,7.2688999999999995e-05],"576":[3.5698000000000003e-05,3.6538999999999997e-05],"160":[9.4329999999999993e-06,9.9920000000000002e-06],"672":[4.3995000000000001e-05,4.8547999999999997e-05],"8912896":[2.488020669,2.5008765139999998],"100":[5.1649999999999997e-06,5.4249999999999997e-06],"507904":[0.047927467999999994,0.067671185999999967],"3840":[0.00023666799999999994,0.000256056],"192":[1.3568e-05,1.5911999999999999e-05],"376832":[0.044981865999999988,0.04567105400000001],"98304":[0.0097232209999999989,0.010223856999999999],"5376":[0.00038683400000000002,0.00038758400000000006],"94208":[0.0086491339999999993,0.0090841770000000006],"81920":[0.006275826,0.006523839],"3407872":[0.72692203899999996,0.82151080200000004],"104":[5.1819999999999997e-06,6.5889999999999999e-06],"122880":[0.0094961550000000026,0.0097183250000000242],"200":[1.0773e-05,1.1051e-05],"163840":[0.014697997000000001,0.015385906],"4063232":[0.89202172700000004,0.904908351],"5767168":[2.0363415759999999,2.0744478420000001],"12582912":[5.9674664030000004,6.2068576440000003],"1600":[8.6160000000000002e-05,9.1125000000000006e-05],"136":[7.2139999999999999e-06,7.6299999999999998e-06],"232":[1.2917e-05,1.3064999999999999e-05],"7077888":[1.8110189129999998,1.920875323],"86016":[0.0070440880000000013,0.007495888],"31744":[0.002131853,0.0022445500000000001],"168":[1.0278000000000001e-05,1.2323999999999999e-05],"622592":[0.068467897,0.079604269999999991],"108":[5.7880000000000003e-06,6.2779999999999999e-06],"327680":[0.032620481,0.03263661100000001],"2176":[0.000138512,0.000139956],"3328":[0.000186424,0.00020795900000000002],"1":[1.4600000000000001e-07,1.55e-07],"2":[2.6899999999999999e-07,2.7099999999999998e-07],"3":[2.7399999999999999e-07,2.9400000000000001e-07],"4":[3.27e-07,3.58e-07],"7424":[0.00048086800000000007,0.00048768599999999992],"5":[3.58e-07,3.7599999999999998e-07],"23552":[0.001918966,0.0020569939999999995],"6":[3.8599999999999999e-07,4.03e-07],"61440":[0.0042155409999999997,0.0042816639999999993],"491520":[0.047233357999999989,0.057321353000000005],"77824":[0.0057785700000000011,0.0059006469999999993],"7":[3.6699999999999999e-07,3.9400000000000001e-07],"8":[4.0499999999999999e-07,4.2100000000000002e-07],"208":[1.1089e-05,1.1807000000000001e-05],"9":[4.46e-07,4.8100000000000003e-07],"73728":[0.005174444000000002,0.0053872319999999996],"304":[1.7561999999999999e-05,1.8706e-05],"400":[1.9673999999999998e-05,2.1970000000000001e-05],"1310720":[0.225493889,0.324279437],"336":[2.0290999999999999e-05,2.3255999999999999e-05],"3670016":[0.756321256,0.80288296699999995],"6656":[0.00038454099999999996,0.00040333399999999998],"15360":[0.0010108419999999999,0.0010275389999999998],"432":[2.3393000000000001e-05,2.4097e-05],"950272":[0.11408545,0.17058361899999999],"655360":[0.072601871000000012,0.093383116000000016],"69632":[0.0046683610000000002,0.0049094169999999993],"11264":[0.00086010200000000007,0.00090463499999999999],"2752512":[0.74005859800000007,0.80440972399999999],"8126464":[2.130279458,2.1811452839999999],"27648":[0.0017103770000000001,0.001778993],"368":[2.6633000000000001e-05,3.1384999999999999e-05],"65536":[0.0046089150000000008,0.0048487020000000007],"16252928":[4.5677060540000003],"464":[2.5643000000000002e-05,2.8479999999999998e-05],"1015808":[0.13286633,0.191298036],"3072":[0.00026479000000000004,0.00029554800000000002],"110592":[0.0079683089999999998,0.0080540980000000009],"237568":[0.019439591999999999,0.020954348000000001],"278528":[0.023976367999999998,0.024669879999999998],"496":[2.9739000000000001e-05,3.0139000000000001e-05],"13107200":[3.3279936389999998,3.5571175429999999],"9961472":[2.9660229469999999,3.0752424920000001],"5888":[0.00048369800000000002,0.00049012299999999997],"11010048":[3.7341080230000001,3.7566802020000001],"1920":[0.000113089,0.00012477399999999997],"2490368":[0.57137428700000004,0.60063776800000002],"19456":[0.00131971,0.0013545650000000001],"57344":[0.003780569000000001,0.0038348599999999998],"1179648":[0.176817945,0.24604626299999999],"4718592":[1.320918362,1.3389617549999999],"360448":[0.040324317999999991,0.040703019],"1572864":[0.41443975700000002,0.47104252000000002],"53248":[0.00330277,0.0033339149999999998],"3456":[0.00020583800000000007,0.00020593400000000001],"40960":[0.0028596940000000003,0.0030529850000000002],"4608":[0.00029183699999999998,0.000292589],"13824":[0.0008648439999999997,0.00087808100000000017],"819200":[0.092519298999999985,0.13279721799999999],"983040":[0.120711658,0.16517997400000001],"8704":[0.00052390399999999973,0.00056419800000000002],"120":[7.204e-06,7.3660000000000003e-06],"1024":[6.4480999999999995e-05,6.8244000000000006e-05],"49152":[0.0044817750000000003,0.004506599],"524288":[0.051359282999999992,0.058831110000000006],"45056":[0.0034566099999999989,0.0035330640000000003],"229376":[0.019069756,0.019281938999999998],"2688":[0.00017869700000000001,0.000200411],"152":[8.5529999999999993e-06,8.8820000000000007e-06],"5120":[0.00033873200000000001,0.00036597500000000005],"1507328":[0.33798930599999999,0.46045064800000002],"1216":[7.5939999999999995e-05,8.0264000000000003e-05],"1966080":[0.35532455100000004,0.35554464200000002],"1900544":[0.31983366899999999,0.32661419400000002],"184":[1.4457000000000001e-05,1.448e-05],"7936":[0.00052024800000000006,0.000553978],"3801088":[0.81814870299999998,0.86960726700000002],"6815744":[1.6512334609999999,1.8335944319999999],"124":[6.6900000000000003e-06,7.7680000000000008e-06],"102400":[0.0070779660000000006,0.0071280740000000007],"311296":[0.03062911400000002,0.030710397],"1408":[0.00010322099999999999,0.00012872],"393216":[0.052408234000000012,0.052843992999999992],"4352":[0.000268788,0.00026919199999999997],"6553600":[1.4929080100000001,1.7135218320000001],"20480":[0.0014492019999999999,0.001465626],"608":[3.8101e-05,4.2138000000000002e-05],"2228224":[0.453864304,0.46591881899999998],"36864":[0.0023967040000000004,0.0025701830000000002],"704":[5.1875000000000001e-05,5.2750000000000001e-05],"720896":[0.090728042999999994,0.124104651],"800":[4.3696000000000003e-05,4.4091000000000002e-05],"2621440":[0.63419204699999998,0.69280715199999998],"425984":[0.037530608999999993,0.043205349999999997],"32768":[0.002272563,0.0022905999999999998],"12058624":[5.016287911,5.2548398689999996],"128":[7.374e-06,7.5560000000000002e-06],"180224":[0.018383885000000003,0.018921947000000001],"224":[1.2431e-05,1.2568999999999999e-05],"736":[5.3239999999999998e-05,5.5732000000000001e-05],"320":[1.9398e-05,2.1267000000000002e-05],"557056":[0.053273251000000001,0.077327785000000038],"832":[4.4601000000000002e-05,4.8418000000000003e-05],"9437184":[2.8021623980000001,2.9996287559999999],"3584":[0.00022064399999999996,0.00023004200000000002],"6291456":[2.7627747309999999,2.836997754],"256":[1.4603000000000001e-05,1.6028999999999998e-05],"15204352":[4.1032611350000003,4.4999245600000002],"28672":[0.001795194,0.001908203],"768":[5.7101000000000001e-05,6.3640999999999996e-05],"212992":[0.016174709000000002,0.017267775000000003],"864":[5.0000000000000002e-05,5.1533000000000003e-05],"352":[2.4592000000000001e-05,2.4856999999999999e-05],"253952":[0.021975577999999992,0.023322241],"960":[6.3219999999999994e-05,6.7914000000000001e-05],"24576":[0.0021929670000000005,0.0022889670000000003],"7680":[0.0004762399999999999,0.00056350900000000002],"294912":[0.027254955000000004,0.027263097],"1048576":[0.140415121,0.19260180499999999],"10485760":[3.4068818190000001,3.4310611240000002],"344064":[0.037326606000000005,0.037372426],"288":[1.6246999999999999e-05,1.7805999999999999e-05],"1152":[6.8200000000000004e-05,7.0885999999999999e-05],"384":[3.0425000000000001e-05,3.1378999999999999e-05],"2304":[0.000143714,0.00015271700000000002],"896":[5.1066000000000002e-05,5.7567e-05],"480":[2.8146000000000001e-05,2.8639000000000001e-05],"1441792":[0.29639489099999999,0.42925685600000002],"992":[6.5152000000000002e-05,7.1957000000000002e-05],"3968":[0.00024681599999999996,0.00025813099999999999],"6400":[0.00036355800000000005,0.00039709700000000001],"1344":[9.5729000000000005e-05,0.000105318],"126976":[0.010029362,0.010036764],"2883584":[0.83245416100000003,0.95132934800000002],"753664":[0.104260652,0.13753090900000001],"16384":[0.0011216920000000001,0.001175218],"131072":[0.010726693000000001,0.011344491],"458752":[0.04072659700000001,0.048029492],"172032":[0.016197173000000002,0.017515798999999999],"12288":[0.0010627599999999998,0.0011372939999999998],"14680064":[3.9093630140000002,4.161757089],"1536":[0.000129975,0.000132867],"25600":[0.001514671,0.001564459],"1835008":[0.29889670400000001,0.31471634100000001],"10752":[0.0007979879999999998,0.00081464800000000006],"21504":[0.001570854,0.0016805500000000001],"7602176":[1.8936599789999999,1.9231738309999999],"5632":[0.000405187,0.00046993500000000005],"10":[4.5900000000000002e-07,4.8599999999999998e-07],"3145728":[1.1126590160000001,1.125121928],"245760":[0.021290891999999999,0.021363633],"1728":[0.00010228,0.00010819700000000002],"11":[5.2099999999999997e-07,5.2799999999999996e-07],"1114112":[0.16268581200000001,0.23389381300000001],"12":[4.9800000000000004e-07,5.7400000000000003e-07],"7340032":[1.7859278280000002,1.847531888],"7168":[0.00042935599999999999,0.00046027699999999993],"13":[5.1799999999999995e-07,5.7800000000000001e-07],"6029312":[2.3031911389999999,2.3495900779999999],"14":[6.5099999999999999e-07,6.6899999999999997e-07],"3200":[0.000178297,0.000195961],"20":[7.1099999999999995e-07,8.6499999999999998e-07],"204800":[0.015798915,0.01597703],"15":[6.13e-07,6.1500000000000004e-07],"13312":[0.00078438600000000009,0.0008383720000000001],"4980736":[1.3856457550000001,1.421521072],"118784":[0.0090134940000000004,0.009099506999999998],"51200":[0.0032599030000000002,0.0032899190000000001],"16":[6.6300000000000005e-07,7.5700000000000002e-07],"21":[8.2999999999999999e-07,9.3799999999999996e-07],"917504":[0.107863054,0.14769643099999999],"22":[1.392e-06,1.5349999999999999e-06],"4864":[0.000318101,0.000337158],"17":[6.4600000000000004e-07,8.1699999999999997e-07],"14848":[0.00093533500000000003,0.00098200200000000027],"23":[1.6360000000000001e-06,1.795e-06],"786432":[0.12505513600000001,0.184302937],"18":[7.4199999999999995e-07,7.8299999999999996e-07],"1638400":[0.27039171299999998,0.274748516],"7864320":[2.0828317439999999,2.1373195699999998],"24":[1.764e-06,2.1349999999999999e-06],"14155776":[3.7015429950000001,7.2079030240000002],"19":[7.2099999999999996e-07,8.1100000000000005e-07],"30":[1.762e-06,1.7880000000000001e-06],"25":[1.5290000000000001e-06,1.539e-06],"31":[2.0499999999999999e-06,2.0789999999999999e-06],"1280":[8.0835999999999997e-05,8.1520999999999994e-05],"26":[1.454e-06,1.576e-06],"3932160":[0.85686840200000003,0.85972139199999997],"2432":[0.000150519,0.00016677900000000001],"32":[1.838e-06,2.148e-06],"27":[1.545e-06,1.6649999999999999e-06],"409600":[0.034562414,0.035707642000000005]}},{"title":"OrderedSet subtract Array (50% overlap)","results":{"28":[9.2699999999999998e-07,9.78e-07],"34":[1.5510000000000001e-06,1.866e-06],"29":[8.71e-07,1.1030000000000001e-06],"40":[1.827e-06,2.1110000000000002e-06],"17408":[0.00095495600000000019,0.0009801590000000002],"1472":[9.5564999999999997e-05,0.000107131],"112":[4.5680000000000001e-06,4.6430000000000003e-06],"1376256":[0.23302931400000004,0.32761079900000001],"5242880":[1.296736372,1.311284444],"36":[1.5939999999999999e-06,2.086e-06],"42":[1.9300000000000002e-06,2.5330000000000001e-06],"11534336":[3.6883916160000001,3.7817657489999998],"114688":[0.0067777210000000004,0.0070937749999999992],"144":[6.5860000000000001e-06,7.5469999999999999e-06],"38":[1.812e-06,2.2029999999999999e-06],"240":[1.0372e-05,1.0593e-05],"9216":[0.00047825999999999999,0.00057142800000000002],"44":[2.2790000000000001e-06,2.7080000000000002e-06],"1664":[7.292e-05,7.7442999999999997e-05],"196608":[0.020646256000000002,0.021830696],"155648":[0.011547011999999999,0.011793901000000002],"2816":[0.000175933,0.000197524],"50":[2.1849999999999998e-06,2.2859999999999998e-06],"2359296":[0.44154432700000001,0.50385154500000007],"46":[2.1600000000000001e-06,2.5349999999999999e-06],"176":[1.0169e-05,1.0339e-05],"52":[2.1830000000000001e-06,2.3250000000000002e-06],"272":[1.2863e-05,1.3227000000000001e-05],"116":[5.0180000000000001e-06,5.8050000000000003e-06],"47104":[0.0032835209999999989,0.0034345620000000008],"6912":[0.00032630199999999999,0.00036365200000000001],"1856":[8.2143000000000003e-05,9.8723999999999999e-05],"48":[2.4789999999999999e-06,3.478e-06],"2097152":[0.349003701,0.41245089700000004],"54":[2.4739999999999999e-06,2.627e-06],"2031616":[0.33647670200000002,0.36842280399999999],"43008":[0.0027068180000000006,0.002766115],"60":[2.819e-06,2.847e-06],"30720":[0.001530598,0.001626913],"56":[2.5160000000000001e-06,2.6989999999999999e-06],"62":[2.7199999999999998e-06,3.0809999999999998e-06],"58":[2.5730000000000002e-06,2.796e-06],"3014656":[0.78455530800000006,0.91045384500000004],"64":[2.8449999999999999e-06,3.0340000000000001e-06],"8388608":[1.9313318239999999,1.9473914299999999],"29696":[0.0014478120000000001,0.0014579860000000003],"216":[8.8400000000000001e-06,1.0202e-05],"106496":[0.0060591670000000007,0.0061594910000000013],"72":[3.3560000000000001e-06,3.4470000000000002e-06],"442368":[0.030819362999999999,0.034702694999999992],"147456":[0.010623637,0.010743131999999999],"4456448":[0.92905346899999997,0.96789673600000004],"63488":[0.003388463,0.0034850710000000002],"38912":[0.0022035179999999998,0.0022552990000000001],"68":[3.1559999999999999e-06,3.2499999999999998e-06],"188416":[0.017594816999999992,0.018337988],"248":[1.0797e-05,1.1216999999999999e-05],"80":[4.1919999999999998e-06,4.2629999999999997e-06],"2560":[0.00014953900000000002,0.000165224],"34816":[0.0018358349999999999,0.002119447],"3712":[0.00017580199999999997,0.00017994999999999996],"3538944":[0.64844298,0.71993847199999994],"76":[3.6550000000000002e-06,3.8940000000000003e-06],"4194304":[0.85579196099999999,0.90003058199999997],"851968":[0.09100834599999999,0.12484327200000001],"4096":[0.000197157,0.00021281099999999998],"59392":[0.0030360280000000001,0.0032176779999999994],"84":[4.2379999999999999e-06,4.3780000000000003e-06],"3276800":[0.60125916400000001,0.61612700300000001],"55296":[0.0027176520000000001,0.002884326],"688128":[0.067532275000000003,0.10934420700000003],"8192":[0.00040444,0.00043562199999999993],"10240":[0.00059901400000000004,0.00062362000000000008],"15872":[0.00080657999999999999,0.00083272700000000012],"92":[4.8350000000000003e-06,5.553e-06],"26624":[0.0012551660000000001,0.001350794],"1792":[8.2682000000000006e-05,9.3215999999999997e-05],"11776":[0.00082607299999999976,0.00086000200000000001],"2944":[0.000202871,0.000221828],"88":[4.8600000000000001e-06,4.9099999999999996e-06],"22528":[0.0014531310000000003,0.0015381710000000001],"1245184":[0.175031883,0.238682111],"15728640":[3.7966980870000002,3.950385635],"96":[5.874e-06,6.4250000000000003e-06],"1984":[9.3992000000000004e-05,9.9860999999999998e-05],"139264":[0.0094055709999999997,0.009620277],"475136":[0.03530311500000001,0.039181419999999995],"13631488":[3.285597713,3.3101838940000001],"416":[1.6123000000000001e-05,1.7680999999999999e-05],"928":[4.2967999999999999e-05,4.4676999999999999e-05],"512":[2.3544999999999999e-05,2.5607999999999999e-05],"18432":[0.001022586,0.001063575],"16777216":[4.4952576359999998],"9728":[0.00055440899999999996,0.00057009899999999991],"1769472":[0.29080995899999995,0.29245785600000002],"1703936":[0.26339087900000002,0.29181950199999995],"2048":[0.000101063,0.00010393],"14336":[0.00066269899999999988,0.000716864],"448":[1.8244e-05,2.0526999999999998e-05],"5505024":[1.4888512249999999,1.519803091],"544":[2.6888000000000001e-05,2.8901e-05],"221184":[0.014622186000000004,0.014749803000000001],"90112":[0.006659894999999999,0.0067045350000000019],"640":[3.3803000000000001e-05,3.8043000000000002e-05],"12800":[0.00056322399999999997,0.00060128500000000012],"262144":[0.019274398000000002,0.019685174999999996],"589824":[0.052466038999999999,0.078516434999999996],"884736":[0.086591997999999989,0.14499903],"6144":[0.00045327099999999999,0.00045774600000000003],"1088":[5.1925999999999997e-05,5.6115000000000001e-05],"576":[2.9196999999999998e-05,2.9300999999999999e-05],"160":[7.7330000000000003e-06,8.388e-06],"672":[3.6740999999999999e-05,3.9659000000000001e-05],"8912896":[2.1120507339999999,2.119482729],"100":[4.1740000000000002e-06,4.403e-06],"507904":[0.042226412999999956,0.054174610000000012],"3840":[0.00017724599999999999,0.00018524400000000004],"192":[1.274e-05,1.322e-05],"376832":[0.037497467,0.039638618],"98304":[0.0083650509999999983,0.0085121300000000014],"5376":[0.00033286999999999998,0.000338053],"94208":[0.0072447739999999998,0.0075942930000000002],"81920":[0.005305153,0.0054376069999999988],"3407872":[0.62278885699999997,0.70345593099999992],"104":[4.121e-06,4.8210000000000001e-06],"122880":[0.0076373790000000014,0.0079217770000000014],"200":[8.2660000000000001e-06,8.636e-06],"163840":[0.012549908,0.012950392999999999],"4063232":[0.82029275599999996,0.82091719500000004],"5767168":[1.7612055440000001,1.7823768950000001],"12582912":[4.9310734329999999,5.3262052530000004],"1600":[7.3014000000000003e-05,7.9346999999999998e-05],"136":[5.9399999999999999e-06,6.6660000000000002e-06],"232":[9.3470000000000005e-06,1.0334e-05],"7077888":[1.601901239,1.696785489],"86016":[0.0059295200000000006,0.0059877840000000003],"31744":[0.001617449,0.0016920989999999996],"168":[8.524e-06,1.0750999999999999e-05],"622592":[0.055358849000000002,0.069920789000000011],"108":[4.5349999999999998e-06,4.8539999999999996e-06],"327680":[0.027898928,0.029679607],"2176":[0.000108047,0.00011910499999999999],"3328":[0.00015720900000000001,0.000158376],"1":[1.4499999999999999e-07,1.5099999999999999e-07],"2":[2.6800000000000002e-07,2.6800000000000002e-07],"3":[2.6600000000000003e-07,3.03e-07],"4":[2.84e-07,2.9400000000000001e-07],"7424":[0.00034647999999999998,0.000382519],"5":[3.2399999999999999e-07,3.7e-07],"23552":[0.0016539160000000001,0.0017042160000000002],"6":[3.9000000000000002e-07,4.0900000000000002e-07],"61440":[0.0032375470000000003,0.003263134],"491520":[0.040145317999999999,0.051964299999999963],"77824":[0.0047202569999999994,0.0051248699999999993],"7":[3.8799999999999998e-07,4.2100000000000002e-07],"8":[4.1899999999999998e-07,4.4700000000000002e-07],"208":[8.6160000000000002e-06,8.9870000000000005e-06],"9":[4.6800000000000001e-07,4.8599999999999998e-07],"73728":[0.0043269240000000011,0.0045118620000000002],"304":[1.4369000000000001e-05,1.5931999999999999e-05],"400":[1.5478e-05,1.7119e-05],"1310720":[0.21496103999999999,0.27361391099999999],"336":[1.7226000000000001e-05,1.9737000000000001e-05],"3670016":[0.67544160800000008,0.78356108899999999],"6656":[0.00029427300000000001,0.00032160700000000007],"15360":[0.00073015999999999999,0.00080396999999999999],"432":[1.7606000000000001e-05,1.8552000000000001e-05],"950272":[0.099099129999999994,0.153440464],"655360":[0.061307338000000003,0.087392726999999976],"69632":[0.0041293430000000006,0.0043695020000000008],"11264":[0.000695036,0.00077205399999999977],"2752512":[0.62381372699999993,0.71646228300000003],"8126464":[1.912920363,1.929439237],"27648":[0.001319317,0.00140773],"368":[2.2857000000000002e-05,2.3499999999999999e-05],"65536":[0.0035591379999999999,0.0036817899999999995],"16252928":[3.9629391639999998],"464":[1.9232000000000002e-05,2.1203e-05],"1015808":[0.114016797,0.16804777500000001],"3072":[0.00021788099999999998,0.000231103],"110592":[0.0063821030000000018,0.0066871559999999997],"237568":[0.015957130999999996,0.01739684],"278528":[0.020331813000000004,0.020938987000000003],"496":[2.1525000000000001e-05,2.2141e-05],"13107200":[3.1140803830000001,3.1864229009999998],"9961472":[2.6756418379999998,2.7980784569999999],"5888":[0.00038020400000000003,0.00039657599999999994],"11010048":[3.2252497309999999,3.2322270670000002],"1920":[8.8739999999999994e-05,9.1878000000000004e-05],"2490368":[0.48214249999999997,0.50731796299999998],"19456":[0.0011148589999999997,0.001119704],"57344":[0.002878018,0.002947744],"1179648":[0.15577118300000001,0.233993909],"4718592":[1.1031725729999999,1.138173783],"360448":[0.03465933899999999,0.035972064000000005],"1572864":[0.35185726399999995,0.46139611200000002],"53248":[0.0026134740000000002,0.0026966159999999998],"3456":[0.000152836,0.000179409],"40960":[0.0024801250000000006,0.0025965669999999997],"4608":[0.00023701900000000004,0.00024918599999999998],"13824":[0.00066119699999999987,0.00067470799999999999],"819200":[0.086645591999999994,0.115324682],"983040":[0.109158857,0.15200391199999996],"8704":[0.00046313599999999995,0.00047695600000000006],"120":[5.1070000000000004e-06,5.3680000000000001e-06],"1024":[4.4839999999999998e-05,5.1285000000000001e-05],"49152":[0.0037429780000000001,0.003817572],"524288":[0.041627610000000002,0.049580870999999992],"45056":[0.0029423959999999999,0.00298139],"229376":[0.016049672000000001,0.016178854999999999],"2688":[0.00015577700000000001,0.00016989699999999999],"152":[6.9639999999999997e-06,8.2339999999999994e-06],"5120":[0.00029092099999999987,0.00029575700000000001],"1507328":[0.304253363,0.39929043799999997],"1216":[6.5340999999999997e-05,6.5359999999999998e-05],"1966080":[0.315969791,0.33563750999999997],"1900544":[0.30032241599999998,0.32607488600000001],"184":[1.0577000000000001e-05,1.1630999999999999e-05],"7936":[0.00037599699999999998,0.00039195900000000005],"3801088":[0.71381618499999999,0.82265138700000007],"6815744":[1.4189343970000001,1.6472501820000001],"124":[5.3770000000000004e-06,5.976e-06],"102400":[0.0058337709999999997,0.005932413000000001],"311296":[0.025563764999999999,0.026808686000000005],"1408":[9.0853000000000006e-05,0.00010174400000000001],"393216":[0.045530723000000002,0.046172686999999997],"4352":[0.00022290099999999996,0.000224126],"6553600":[1.3733836429999999,1.529254493],"20480":[0.001214358,0.001236563],"608":[3.2530999999999997e-05,3.4362000000000001e-05],"2228224":[0.39984154300000002,0.41551445199999998],"36864":[0.00201863,0.0021652220000000005],"704":[4.0219999999999998e-05,4.3766000000000001e-05],"720896":[0.083051668999999995,0.104514041],"800":[3.3271e-05,3.3695000000000002e-05],"2621440":[0.53623451,0.58069694799999994],"425984":[0.030051068,0.032258753999999994],"32768":[0.001689491,0.0017380270000000003],"12058624":[4.1210057750000004,4.2252911969999998],"128":[5.3970000000000002e-06,5.4380000000000003e-06],"180224":[0.015751670000000002,0.016290459],"224":[9.2380000000000003e-06,1.0159e-05],"736":[4.6343e-05,4.7151000000000003e-05],"320":[1.5398999999999999e-05,1.6886999999999999e-05],"557056":[0.045869739999999999,0.060036107999999991],"832":[3.4220000000000001e-05,3.6006000000000001e-05],"9437184":[2.431857988,2.7114230570000002],"3584":[0.000164196,0.00019178500000000001],"6291456":[2.2439270009999999,2.255521162],"256":[1.1285e-05,1.2106000000000001e-05],"15204352":[3.5333797909999998,3.9344349759999999],"28672":[0.0013700820000000003,0.0014511050000000001],"768":[5.1551000000000002e-05,5.4252999999999997e-05],"212992":[0.013303289999999999,0.014526010000000002],"864":[3.8634000000000003e-05,3.9603e-05],"352":[2.0355000000000001e-05,2.0854000000000001e-05],"253952":[0.017855099999999999,0.017910542999999994],"960":[4.6739000000000001e-05,4.6950999999999998e-05],"24576":[0.0019091139999999999,0.001918917],"7680":[0.0003619169999999999,0.00042499300000000008],"294912":[0.022918491000000003,0.024609075000000001],"1048576":[0.135649151,0.16350383000000002],"10485760":[2.8522481490000002,2.8555352630000002],"344064":[0.030585036000000003,0.032744139000000005],"288":[1.3671e-05,1.5760000000000002e-05],"1152":[5.6177000000000001e-05,5.8754e-05],"384":[2.4621999999999999e-05,2.6628e-05],"2304":[0.000114716,0.00012858299999999999],"896":[3.7104000000000003e-05,4.0216000000000003e-05],"480":[2.1656000000000001e-05,2.2399e-05],"1441792":[0.25205898399999999,0.34951802900000001],"992":[4.8569000000000002e-05,4.9252999999999998e-05],"3968":[0.000187302,0.00019705300000000004],"6400":[0.000289797,0.00029172600000000002],"1344":[7.2379000000000006e-05,8.3347e-05],"126976":[0.0080117920000000002,0.0082298530000000005],"2883584":[0.69860254499999996,0.79214755700000006],"753664":[0.094814191000000006,0.119848782],"16384":[0.00082431500000000016,0.00088135000000000004],"131072":[0.008566611,0.0086035940000000026],"458752":[0.033256714999999999,0.039533349000000002],"172032":[0.014062296,0.014991215],"12288":[0.00090652700000000018,0.00093386400000000007],"14680064":[3.4552849569999999,3.638177083],"1536":[0.000102107,0.000110244],"25600":[0.001173192,0.0012211839999999997],"1835008":[0.28707959799999999,0.32129581099999999],"10752":[0.00065847000000000019,0.00067331499999999985],"21504":[0.0013463710000000001,0.001399569],"7602176":[1.691826552,1.709540501],"5632":[0.00037550300000000001,0.00039762099999999991],"10":[4.5900000000000002e-07,4.6499999999999999e-07],"3145728":[0.90780762100000001,0.92845018099999999],"245760":[0.017240016,0.017935316999999999],"1728":[8.1301e-05,8.1977999999999993e-05],"11":[4.7399999999999998e-07,5.1699999999999998e-07],"1114112":[0.14854852499999999,0.20923477900000001],"12":[4.9299999999999998e-07,5.2200000000000004e-07],"7340032":[1.6762160859999999,1.7604236659999999],"7168":[0.00034322699999999999,0.00038638300000000002],"13":[5.0200000000000002e-07,5.1900000000000003e-07],"6029312":[1.885669813,1.928745529],"14":[6.13e-07,6.1699999999999998e-07],"3200":[0.000148651,0.000150483],"20":[6.61e-07,7.5000000000000002e-07],"204800":[0.013307058,0.013826534999999997],"15":[5.4700000000000001e-07,6.5700000000000002e-07],"13312":[0.00062573200000000015,0.00064593000000000007],"4980736":[1.1590011069999999,1.2463538789999999],"118784":[0.0073164339999999993,0.007420201999999999],"51200":[0.0025677349999999998,0.002594809],"16":[6.5700000000000002e-07,7.0699999999999996e-07],"21":[7.8899999999999998e-07,7.92e-07],"917504":[0.094941521000000001,0.143309665],"22":[8.1200000000000002e-07,8.1200000000000002e-07],"4864":[0.00025601599999999997,0.00030353699999999994],"17":[6.4000000000000001e-07,7.2900000000000003e-07],"14848":[0.00072513000000000005,0.000758007],"23":[9.1500000000000003e-07,9.9300000000000006e-07],"786432":[0.106564226,0.15078459899999999],"18":[6.9599999999999999e-07,7.1500000000000004e-07],"1638400":[0.245770813,0.27113526399999999],"7864320":[1.7688693070000001,1.826615541],"24":[9.9199999999999999e-07,1.142e-06],"14155776":[3.183056901,7.5302768540000002],"19":[6.8500000000000001e-07,7.0100000000000004e-07],"30":[9.2900000000000002e-07,1.0729999999999999e-06],"25":[8.0699999999999996e-07,8.1500000000000003e-07],"31":[1.068e-06,1.0860000000000001e-06],"1280":[6.7374999999999998e-05,7.1037000000000004e-05],"26":[7.8199999999999999e-07,9.09e-07],"3932160":[0.765405746,0.77436601900000002],"2432":[0.00013670700000000002,0.00013941799999999999],"32":[1.5120000000000001e-06,1.646e-06],"27":[8.4900000000000005e-07,9.9199999999999999e-07],"409600":[0.029005772999999995,0.030581243000000001]}},{"title":"OrderedSet subtract Array (75% overlap)","results":{"28":[8.8899999999999998e-07,1.0049999999999999e-06],"34":[9.8299999999999995e-07,1.418e-06],"29":[8.3799999999999996e-07,9.5999999999999991e-07],"40":[1.1400000000000001e-06,1.248e-06],"17408":[0.00072154300000000005,0.00075070099999999999],"1472":[7.1173000000000004e-05,7.8057000000000002e-05],"112":[3.4999999999999999e-06,3.5410000000000001e-06],"1376256":[0.21325306699999999,0.28602348100000002],"5242880":[1.161736069,1.1834918759999999],"36":[1.0210000000000001e-06,1.223e-06],"42":[1.198e-06,1.288e-06],"11534336":[3.1031731740000001,3.1839365829999999],"114688":[0.0055471990000000009,0.0056196710000000014],"144":[5.0440000000000003e-06,5.6250000000000004e-06],"38":[1.1230000000000001e-06,1.1659999999999999e-06],"240":[8.0579999999999998e-06,8.3459999999999994e-06],"9216":[0.00036705,0.00043830300000000002],"44":[1.4139999999999999e-06,1.6270000000000001e-06],"1664":[5.6113000000000003e-05,5.8489000000000002e-05],"196608":[0.015411339,0.015948802000000005],"155648":[0.0092331460000000011,0.0095913209999999999],"2816":[0.00013794499999999997,0.000152607],"50":[1.319e-06,1.5290000000000001e-06],"2359296":[0.38604117500000001,0.42777480000000001],"46":[1.3289999999999999e-06,1.6670000000000001e-06],"176":[7.3010000000000001e-06,7.4329999999999998e-06],"52":[1.4419999999999999e-06,1.491e-06],"272":[9.8609999999999993e-06,1.0686999999999999e-05],"116":[3.8550000000000004e-06,4.5349999999999998e-06],"47104":[0.0024569739999999998,0.002743409],"6912":[0.00025042,0.00026285600000000001],"1856":[6.3699000000000001e-05,6.9552000000000001e-05],"48":[1.559e-06,1.6080000000000001e-06],"2097152":[0.314061125,0.32983349899999997],"54":[1.6750000000000001e-06,1.6810000000000001e-06],"2031616":[0.28573130699999999,0.29920848300000003],"43008":[0.0020726579999999998,0.0022051460000000003],"60":[1.683e-06,1.6929999999999999e-06],"30720":[0.001190298,0.0012606780000000001],"56":[1.629e-06,1.736e-06],"62":[1.646e-06,1.854e-06],"58":[1.6419999999999999e-06,1.8920000000000001e-06],"3014656":[0.66055138499999999,0.73955161299999994],"64":[2.2010000000000002e-06,2.379e-06],"8388608":[1.6856624710000001,1.7954647929999998],"29696":[0.0011243240000000001,0.0011441399999999997],"216":[6.9149999999999999e-06,7.559e-06],"106496":[0.0048852109999999995,0.0049500840000000004],"72":[2.5409999999999999e-06,3.061e-06],"442368":[0.028002737,0.028967713999999999],"147456":[0.0086882380000000009,0.0088266379999999995],"4456448":[0.84046695699999996,0.84053489000000003],"63488":[0.0026727959999999994,0.002755492],"38912":[0.0017268470000000001,0.001809125],"68":[2.4530000000000001e-06,2.627e-06],"188416":[0.013932967000000001,0.014411195],"248":[8.3930000000000008e-06,9.0610000000000002e-06],"80":[3.1599999999999998e-06,3.2710000000000001e-06],"2560":[0.000111023,0.000124246],"34816":[0.0014341690000000001,0.0016285779999999999],"3712":[0.00013647899999999995,0.000144435],"3538944":[0.57392120300000005,0.65808160299999996],"76":[2.79e-06,2.9679999999999998e-06],"4194304":[0.72942671599999998,0.77810375399999998],"851968":[0.081321892000000007,0.125365423],"4096":[0.00016225000000000001,0.000166083],"59392":[0.0023826999999999997,0.0025534899999999998],"84":[3.2459999999999999e-06,3.3519999999999998e-06],"3276800":[0.51785900000000007,0.55016382399999997],"55296":[0.002139532,0.0022424810000000002],"688128":[0.056070003,0.089103169999999982],"8192":[0.00032342500000000001,0.00033667799999999998],"10240":[0.000441703,0.000467329],"15872":[0.00061792100000000001,0.00064539600000000001],"92":[3.721e-06,4.0550000000000001e-06],"26624":[0.001020069,0.0010245090000000003],"1792":[6.7026000000000005e-05,7.1149000000000006e-05],"11776":[0.000583732,0.00063787300000000006],"2944":[0.000145146,0.00015284400000000002],"88":[3.6150000000000001e-06,3.7929999999999999e-06],"22528":[0.0011023560000000001,0.001156652],"1245184":[0.17283731699999999,0.214329408],"15728640":[3.195389509,3.3674463939999999],"96":[4.4329999999999997e-06,4.7180000000000004e-06],"1984":[7.0370000000000006e-05,7.6749999999999995e-05],"139264":[0.0076906940000000005,0.007991189000000001],"475136":[0.028478670000000001,0.033703995],"13631488":[2.6122446319999999,3.039356057],"416":[1.2901999999999999e-05,1.3916e-05],"928":[2.9822e-05,3.3816000000000003e-05],"512":[1.8831e-05,2.0775999999999999e-05],"18432":[0.00077534700000000002,0.00081712699999999996],"16777216":[3.8871931150000001],"9728":[0.00040024600000000004,0.00040153599999999997],"1769472":[0.25444724100000005,0.26611719499999997],"1703936":[0.23066531300000004,0.23380031200000001],"2048":[7.7423999999999996e-05,8.0086000000000005e-05],"14336":[0.00051096799999999999,0.00051158099999999999],"448":[1.4457000000000001e-05,1.5514000000000001e-05],"5505024":[1.24918781,1.299095331],"544":[2.1508000000000001e-05,2.3227e-05],"221184":[0.012234976,0.013409984999999999],"90112":[0.0052550830000000007,0.005380742],"640":[2.5905e-05,2.9349999999999999e-05],"12800":[0.00043590300000000007,0.0004756269999999999],"262144":[0.015447456,0.017120722000000001],"589824":[0.041538471,0.075194464000000016],"884736":[0.085395396000000012,0.12586697099999999],"6144":[0.00032546400000000008,0.00034909700000000004],"1088":[3.9273999999999997e-05,4.2036000000000002e-05],"576":[2.2337e-05,2.2952999999999999e-05],"160":[6.1399999999999997e-06,6.6880000000000002e-06],"672":[2.7549999999999999e-05,3.1409999999999999e-05],"8912896":[1.7798656559999999,1.8382546390000001],"100":[3.2739999999999999e-06,3.5310000000000002e-06],"507904":[0.032055646,0.049317359999999991],"3840":[0.00013782900000000004,0.000151772],"192":[9.1099999999999992e-06,9.3270000000000007e-06],"376832":[0.029778141000000008,0.031290356000000005],"98304":[0.0064152290000000015,0.0064648839999999997],"5376":[0.00023921199999999999,0.00026216],"94208":[0.0057006230000000001,0.0057609810000000001],"81920":[0.0041635090000000001,0.0042723529999999996],"3407872":[0.56573929999999995,0.60441650400000002],"104":[3.225e-06,3.8850000000000001e-06],"122880":[0.0065290680000000007,0.0065774759999999988],"200":[6.4869999999999999e-06,7.1620000000000002e-06],"163840":[0.010073051,0.010592338999999997],"4063232":[0.72878998499999992,0.77859394299999996],"5767168":[1.424508023,1.43617986],"12582912":[3.84285488,4.2510402559999996],"1600":[5.3300000000000001e-05,5.9925e-05],"136":[4.6519999999999997e-06,5.4040000000000003e-06],"232":[7.7020000000000001e-06,8.0790000000000001e-06],"7077888":[1.3642929930000001,1.4706929020000001],"86016":[0.0046752879999999988,0.0047590419999999989],"31744":[0.001262663,0.001308481],"168":[6.3980000000000004e-06,7.5730000000000002e-06],"622592":[0.045833668000000008,0.060211068],"108":[3.5810000000000001e-06,3.8580000000000002e-06],"327680":[0.023006861,0.024641579],"2176":[8.4130999999999998e-05,8.5181999999999999e-05],"3328":[0.00011401300000000001,0.000124974],"1":[1.4399999999999999e-07,1.5099999999999999e-07],"2":[1.7100000000000001e-07,1.7100000000000001e-07],"3":[1.7599999999999999e-07,2.11e-07],"4":[2.8700000000000002e-07,2.9900000000000002e-07],"7424":[0.00026565700000000004,0.00028443899999999999],"5":[3.27e-07,3.72e-07],"23552":[0.0012105450000000002,0.001279063],"6":[3.53e-07,3.5699999999999998e-07],"61440":[0.0025565469999999997,0.0025799320000000005],"491520":[0.030512167,0.044388232],"77824":[0.0037435709999999998,0.004012194000000001],"7":[3.5499999999999999e-07,3.7500000000000001e-07],"8":[3.7399999999999999e-07,4.2599999999999998e-07],"208":[6.8959999999999997e-06,7.1069999999999999e-06],"9":[4.2100000000000002e-07,4.51e-07],"73728":[0.0035183419999999998,0.0036243070000000002],"304":[1.1123e-05,1.2121e-05],"400":[1.2334000000000001e-05,1.3266e-05],"1310720":[0.17363384800000001,0.25932917700000002],"336":[1.3799e-05,1.3808999999999999e-05],"3670016":[0.60183162199999996,0.65191938800000004],"6656":[0.00022631000000000002,0.00022821299999999998],"15360":[0.00059770899999999998,0.00064061499999999998],"432":[1.4146e-05,1.4565e-05],"950272":[0.088756617999999995,0.13112554200000001],"655360":[0.050200373,0.068261890000000019],"69632":[0.0032437489999999998,0.0033234840000000002],"11264":[0.000554639,0.00057559400000000002],"2752512":[0.53681412099999992,0.62024341900000002],"8126464":[1.605465286,1.75391191],"27648":[0.0010494360000000004,0.001054342],"368":[1.5874000000000001e-05,1.6875999999999999e-05],"65536":[0.0028423009999999998,0.0029374589999999999],"16252928":[3.4552068359999999],"464":[1.5279000000000001e-05,1.6745999999999999e-05],"1015808":[0.09932350199999998,0.15695378300000001],"3072":[0.00015425600000000002,0.000156076],"110592":[0.0052538690000000013,0.005492785],"237568":[0.013262425999999999,0.013581234000000001],"278528":[0.016753383,0.018749551],"496":[1.6589999999999999e-05,1.7422999999999999e-05],"13107200":[2.5665312710000001,2.9426155519999999],"9961472":[2.1089265340000001,2.368174813],"5888":[0.00028512600000000002,0.000314517],"11010048":[2.6621818039999998,2.7062051349999998],"1920":[6.6563999999999995e-05,6.8264999999999998e-05],"2490368":[0.42025985399999999,0.51590481399999999],"19456":[0.000856779,0.00085771199999999984],"57344":[0.0023062870000000002,0.0023891119999999997],"1179648":[0.135118136,0.21695931900000001],"4718592":[0.89566123900000005,1.03545826],"360448":[0.027478696,0.030137267000000002],"1572864":[0.27810071800000002,0.31327106100000002],"53248":[0.0020426369999999999,0.002097032],"3456":[0.00012218399999999998,0.00012944700000000001],"40960":[0.0018988430000000001,0.0019720200000000001],"4608":[0.00018018600000000001,0.00018234500000000002],"13824":[0.00049436200000000003,0.00050784400000000013],"819200":[0.068824719000000034,0.10580856600000001],"983040":[0.109274235,0.13449407499999999],"8704":[0.00035553399999999996,0.00036552599999999997],"120":[4.0770000000000001e-06,4.1330000000000001e-06],"1024":[3.5049000000000003e-05,3.807e-05],"49152":[0.0028018610000000001,0.0028590829999999992],"524288":[0.03412862400000001,0.043704700999999999],"45056":[0.0022583310000000001,0.002300042],"229376":[0.013912111,0.014517785],"2688":[0.00011617000000000003,0.000131283],"152":[5.2580000000000003e-06,5.6099999999999997e-06],"5120":[0.00021318800000000001,0.00022508599999999994],"1507328":[0.26273282199999998,0.34485141799999997],"1216":[4.6987000000000003e-05,4.9954999999999999e-05],"1966080":[0.28695581999999997,0.34244658500000003],"1900544":[0.26595265699999998,0.30359787799999999],"184":[7.6380000000000004e-06,8.9230000000000008e-06],"7936":[0.00028730099999999995,0.00029378300000000004],"3801088":[0.674095636,0.76079906500000005],"6815744":[1.253383253,1.4402708829999999],"124":[4.2699999999999998e-06,4.5059999999999997e-06],"102400":[0.0048338370000000005,0.0050617809999999996],"311296":[0.022241670000000005,0.022825277000000001],"1408":[6.4207000000000004e-05,6.6886999999999998e-05],"393216":[0.034887803999999994,0.036846781999999995],"4352":[0.00017408200000000002,0.00018066600000000004],"6553600":[1.1618731769999999,1.3624943919999999],"20480":[0.00092346799999999999,0.00095482499999999997],"608":[2.5451000000000001e-05,2.5972000000000001e-05],"2228224":[0.34823313,0.40883753099999998],"36864":[0.0015685440000000003,0.0016588739999999999],"704":[2.9101000000000001e-05,3.2830000000000002e-05],"720896":[0.069855370999999986,0.08300329699999999],"800":[2.5735999999999999e-05,2.5969000000000002e-05],"2621440":[0.47470742499999996,0.49463530900000002],"425984":[0.027265716000000006,0.027902807999999991],"32768":[0.0013058619999999999,0.0013214400000000001],"12058624":[3.3689600369999999,3.6041639320000001],"128":[4.2880000000000003e-06,4.6360000000000002e-06],"180224":[0.012618559,0.013294227],"224":[7.4479999999999997e-06,7.5290000000000003e-06],"736":[3.2419000000000003e-05,3.5485999999999999e-05],"320":[1.1738e-05,1.2856e-05],"557056":[0.041316773999999987,0.06180123299999999],"832":[2.6312000000000002e-05,2.7705999999999999e-05],"9437184":[2.0012920799999998,2.2274577180000001],"3584":[0.00013665500000000001,0.00013716100000000001],"6291456":[1.8212595440000001,1.8642659029999999],"256":[8.8210000000000008e-06,9.3659999999999998e-06],"15204352":[3.369255753,3.5453744270000001],"28672":[0.001088461,0.0011378930000000001],"768":[3.8855e-05,3.9566e-05],"212992":[0.011085679000000001,0.012411258],"864":[2.9867999999999999e-05,2.9938999999999999e-05],"352":[1.4090000000000001e-05,1.713e-05],"253952":[0.014827089,0.016201353999999998],"960":[3.3535999999999999e-05,3.5438000000000002e-05],"24576":[0.0013287920000000003,0.001392929],"7680":[0.00027813600000000001,0.000332744],"294912":[0.018867353999999996,0.020397560000000002],"1048576":[0.11339418699999999,0.15007875200000001],"10485760":[2.4640307200000002,2.6138038909999999],"344064":[0.025152696000000009,0.02745306799999999],"288":[1.0532e-05,1.1382999999999999e-05],"1152":[4.5327999999999997e-05,4.8594999999999998e-05],"384":[1.7445e-05,1.84e-05],"2304":[8.7621999999999996e-05,0.00010487699999999999],"896":[2.9334000000000001e-05,3.0939000000000003e-05],"480":[1.6511000000000002e-05,1.7350000000000002e-05],"1441792":[0.213947518,0.31042005499999997],"992":[3.6545000000000003e-05,3.7051000000000002e-05],"3968":[0.00015628899999999997,0.00015751099999999999],"6400":[0.00021324899999999999,0.000223117],"1344":[5.6483000000000001e-05,6.7533999999999994e-05],"126976":[0.0066740559999999977,0.0068092459999999997],"2883584":[0.64897427200000002,0.67013687],"753664":[0.071092770999999999,0.097964323000000006],"16384":[0.00067266899999999987,0.00067812899999999975],"131072":[0.0069394880000000006,0.0076378219999999998],"458752":[0.031371979000000001,0.034432933999999991],"172032":[0.011227973,0.011602374],"12288":[0.00065550599999999993,0.00070274600000000008],"14680064":[3.1950372680000001,3.255267221],"1536":[7.5530000000000004e-05,8.2052999999999995e-05],"25600":[0.00092397599999999996,0.00095057300000000002],"1835008":[0.26515675599999999,0.285555744],"10752":[0.00048342300000000002,0.00052159599999999993],"21504":[0.0010217049999999999,0.00107518],"7602176":[1.5224046869999999,1.553844561],"5632":[0.00027427699999999996,0.00030401999999999995],"10":[4.46e-07,4.6100000000000001e-07],"3145728":[0.77320277199999998,0.78594192399999996],"245760":[0.014197899,0.015524701],"1728":[5.9848e-05,6.1476999999999994e-05],"11":[4.5999999999999999e-07,4.89e-07],"1114112":[0.13886727800000001,0.19218275000000001],"12":[4.9999999999999998e-07,5.2399999999999998e-07],"7340032":[1.4793627200000001,1.4855747880000001],"7168":[0.00024957799999999992,0.00027426999999999996],"13":[5.6899999999999997e-07,5.75e-07],"6029312":[1.5672693180000001,1.5957326519999999],"14":[6.2200000000000004e-07,6.9299999999999997e-07],"3200":[0.00011013800000000001,0.000114703],"20":[6.3399999999999999e-07,7.4099999999999998e-07],"204800":[0.011009178999999999,0.011885435],"15":[5.7599999999999997e-07,5.8999999999999996e-07],"13312":[0.00046034600000000004,0.00050314999999999984],"4980736":[1.099179071,1.107211315],"118784":[0.0059206040000000003,0.0060615280000000009],"51200":[0.0019930129999999996,0.002038752],"16":[6.9800000000000003e-07,7.2699999999999999e-07],"21":[7.92e-07,8.8100000000000001e-07],"917504":[0.097054217999999998,0.118777313],"22":[7.6000000000000003e-07,7.9100000000000003e-07],"4864":[0.00020508900000000004,0.000214143],"17":[6.4899999999999995e-07,7.4099999999999998e-07],"14848":[0.00055597399999999999,0.00057682399999999998],"23":[8.4e-07,8.4300000000000002e-07],"786432":[0.08613873900000002,0.12772230500000001],"18":[6.7400000000000003e-07,7.0100000000000004e-07],"1638400":[0.22340892400000001,0.26371613000000005],"7864320":[1.597586459,1.7090524140000001],"24":[7.61e-07,1.068e-06],"14155776":[2.9468309010000002,6.9922202550000003],"19":[7.1099999999999995e-07,7.5000000000000002e-07],"30":[8.9999999999999996e-07,9.0100000000000003e-07],"25":[8.6199999999999996e-07,8.6199999999999996e-07],"31":[9.8400000000000002e-07,1.0720000000000001e-06],"1280":[5.2340999999999999e-05,5.6268999999999999e-05],"26":[8.2799999999999995e-07,9.1999999999999998e-07],"3932160":[0.65817485100000006,0.70288881299999995],"2432":[9.4071000000000001e-05,0.000113645],"32":[9.5499999999999996e-07,1.063e-06],"27":[8.5899999999999995e-07,8.8199999999999998e-07],"409600":[0.026725481000000002,0.027058782999999993]}},{"title":"OrderedSet subtract Array (100% overlap)","results":{"28":[7.5799999999999998e-07,8.4499999999999996e-07],"34":[9.7199999999999997e-07,1.127e-06],"29":[7.3499999999999995e-07,8.9599999999999998e-07],"40":[9.16e-07,1.1119999999999999e-06],"17408":[0.00050794600000000001,0.00052621899999999997],"1472":[4.5602000000000001e-05,4.9994000000000003e-05],"112":[2.4040000000000002e-06,2.5189999999999999e-06],"1376256":[0.16020579500000001,0.247765762],"5242880":[1.057834049,1.092347655],"36":[8.2699999999999998e-07,9.3500000000000005e-07],"42":[1.02e-06,1.175e-06],"11534336":[2.3520574010000002,2.507267283],"114688":[0.004277566,0.0043316759999999996],"144":[3.5260000000000002e-06,4.0060000000000003e-06],"38":[9.5900000000000005e-07,1.04e-06],"240":[5.4650000000000002e-06,5.4999999999999999e-06],"9216":[0.00025903299999999998,0.00030899600000000002],"44":[1.0669999999999999e-06,1.308e-06],"1664":[3.8838000000000003e-05,3.9245000000000001e-05],"196608":[0.011355173999999999,0.011379995],"155648":[0.0072490850000000006,0.0074060630000000001],"2816":[9.2535999999999996e-05,0.000101469],"50":[1.1459999999999999e-06,1.1930000000000001e-06],"2359296":[0.333429582,0.36494499199999997],"46":[1.1200000000000001e-06,1.299e-06],"176":[5.0039999999999999e-06,5.0989999999999998e-06],"52":[1.1650000000000001e-06,1.2240000000000001e-06],"272":[6.7669999999999998e-06,6.8959999999999997e-06],"116":[2.6730000000000001e-06,3.0690000000000002e-06],"47104":[0.0016743279999999999,0.0017628869999999999],"6912":[0.000169502,0.00017770199999999996],"1856":[4.587e-05,4.8928000000000003e-05],"48":[1.316e-06,1.398e-06],"2097152":[0.28190936999999999,0.282599771],"54":[1.3379999999999999e-06,1.3650000000000001e-06],"2031616":[0.26661098599999999,0.33166259100000001],"43008":[0.0014510899999999999,0.001487852],"60":[1.418e-06,1.736e-06],"30720":[0.00084156599999999997,0.00088868699999999977],"56":[1.2869999999999999e-06,1.4419999999999999e-06],"62":[1.455e-06,1.618e-06],"58":[1.327e-06,1.457e-06],"3014656":[0.51935279499999998,0.59319060300000004],"64":[1.486e-06,1.6619999999999999e-06],"8388608":[1.4236571410000001,1.479137307],"29696":[0.00078787799999999999,0.00080406200000000014],"216":[4.9219999999999996e-06,5.383e-06],"106496":[0.0038096359999999995,0.0039338849999999998],"72":[1.7209999999999999e-06,2.0430000000000002e-06],"442368":[0.022466019,0.024638145],"147456":[0.0067297660000000007,0.0072449000000000003],"4456448":[0.715574763,0.74711102200000001],"63488":[0.00191325,0.001938731],"38912":[0.0011756940000000001,0.001193908],"68":[1.6840000000000001e-06,1.79e-06],"188416":[0.010369949,0.010499114],"248":[5.7189999999999998e-06,6.319e-06],"80":[2.0200000000000001e-06,2.339e-06],"2560":[7.4553000000000003e-05,8.4161999999999998e-05],"34816":[0.0010023219999999999,0.001151034],"3712":[9.0793999999999998e-05,9.6312999999999998e-05],"3538944":[0.597180606,0.64043855900000002],"76":[1.9099999999999999e-06,1.9470000000000002e-06],"4194304":[0.646193829,0.77436154200000007],"851968":[0.074311629000000018,0.11830732400000001],"4096":[0.00010474799999999999,0.000108997],"59392":[0.001712908,0.001836814],"84":[2.154e-06,2.2170000000000001e-06],"3276800":[0.45765211100000003,0.461099696],"55296":[0.0015271010000000001,0.001624105],"688128":[0.049999909999999995,0.070186217999999967],"8192":[0.000215448,0.00024765600000000002],"10240":[0.000302873,0.00031304299999999999],"15872":[0.00041538000000000002,0.00046166000000000002],"92":[2.481e-06,2.7640000000000001e-06],"26624":[0.00068365499999999992,0.00071641000000000001],"1792":[4.2082999999999997e-05,4.9673999999999999e-05],"11776":[0.00038896300000000009,0.000403428],"2944":[9.3270000000000007e-05,0.00010027899999999997],"88":[2.3429999999999998e-06,2.5550000000000001e-06],"22528":[0.00072668899999999998,0.00079266100000000006],"1245184":[0.15373346500000001,0.206030511],"15728640":[2.9130216949999999,3.1109524240000002],"96":[2.802e-06,2.8669999999999998e-06],"1984":[5.0102999999999998e-05,5.295e-05],"139264":[0.0064285389999999987,0.0064391840000000006],"475136":[0.023006079000000002,0.035825422000000016],"13631488":[2.2720738030000001,2.8284548049999998],"416":[9.1649999999999995e-06,9.5850000000000006e-06],"928":[2.0840999999999999e-05,2.3504999999999999e-05],"512":[1.3013000000000001e-05,1.4024e-05],"18432":[0.00055362399999999996,0.00058049400000000008],"16777216":[3.3255884839999998],"9728":[0.000279151,0.00028684799999999987],"1769472":[0.25503972500000005,0.29775025700000002],"1703936":[0.207552722,0.235625482],"2048":[5.0219000000000001e-05,5.3482000000000001e-05],"14336":[0.00035935699999999998,0.00036444500000000003],"448":[1.0516000000000001e-05,1.0716999999999999e-05],"5505024":[1.056448126,1.0852475450000001],"544":[1.4593000000000001e-05,1.5413e-05],"221184":[0.0099822639999999994,0.011301379],"90112":[0.003607659,0.0036997080000000003],"640":[1.7289e-05,1.9153000000000001e-05],"12800":[0.00032064099999999998,0.00032359000000000001],"262144":[0.012441259,0.014642301],"589824":[0.033127859999999995,0.062245722999999996],"884736":[0.067077256000000002,0.12481893300000001],"6144":[0.000215601,0.00022155800000000001],"1088":[2.8254000000000001e-05,3.0083999999999999e-05],"576":[1.4813e-05,1.5115e-05],"160":[4.002e-06,4.6879999999999998e-06],"672":[1.7462999999999999e-05,2.0173000000000002e-05],"8912896":[1.6041958649999999,1.6498088050000002],"100":[2.2469999999999998e-06,2.3879999999999998e-06],"507904":[0.026327049999999998,0.048221337000000003],"3840":[9.5723000000000005e-05,0.000102632],"192":[5.2519999999999999e-06,5.9669999999999998e-06],"376832":[0.022322819000000001,0.026747033],"98304":[0.0044234249999999999,0.0045615300000000003],"5376":[0.00016060399999999996,0.00016382199999999999],"94208":[0.0039673529999999999,0.0039768320000000005],"81920":[0.0029445039999999997,0.0030473190000000006],"3407872":[0.499245879,0.65157411700000001],"104":[2.2129999999999998e-06,2.6929999999999999e-06],"122880":[0.0051350690000000008,0.00528861],"200":[4.6120000000000001e-06,4.6269999999999999e-06],"163840":[0.007830109,0.0081127060000000008],"4063232":[0.64378379399999996,0.74474025600000004],"5767168":[1.1591115320000001,1.1616196089999999],"12582912":[2.9798627190000002,3.2077942429999999],"1600":[3.7169999999999998e-05,3.9665000000000001e-05],"136":[3.3780000000000001e-06,3.6830000000000001e-06],"232":[5.2769999999999996e-06,5.5169999999999999e-06],"7077888":[1.2754930230000001,1.342463712],"86016":[0.0032444490000000008,0.0034777229999999998],"31744":[0.00088643700000000001,0.000934376],"168":[4.0099999999999997e-06,5.3870000000000003e-06],"622592":[0.037045861999999999,0.051982386999999998],"108":[2.4820000000000001e-06,2.514e-06],"327680":[0.017828409999999999,0.020779997000000001],"2176":[5.6882000000000002e-05,5.8520000000000002e-05],"3328":[8.5958000000000006e-05,8.6013000000000005e-05],"1":[1.4499999999999999e-07,1.4999999999999999e-07],"2":[1.7100000000000001e-07,1.72e-07],"3":[1.7599999999999999e-07,1.9500000000000001e-07],"4":[1.9000000000000001e-07,1.9999999999999999e-07],"7424":[0.00019655700000000006,0.000208359],"5":[2.22e-07,2.4900000000000002e-07],"23552":[0.00078536799999999983,0.00086834899999999981],"6":[2.6e-07,2.6800000000000002e-07],"61440":[0.001802522,0.0018510029999999999],"491520":[0.024712544999999995,0.03618851],"77824":[0.0026869319999999995,0.0029454310000000001],"7":[2.6300000000000001e-07,2.8500000000000002e-07],"8":[2.72e-07,3.27e-07],"208":[4.8250000000000004e-06,4.9359999999999998e-06],"9":[3.2399999999999999e-07,3.34e-07],"73728":[0.0024506699999999998,0.0026065340000000002],"304":[7.5499999999999997e-06,8.5380000000000002e-06],"400":[8.8480000000000007e-06,9.5389999999999996e-06],"1310720":[0.14706485699999999,0.237308465],"336":[8.8659999999999995e-06,1.0199e-05],"3670016":[0.54180132000000003,0.60487109800000005],"6656":[0.000177157,0.00017837299999999995],"15360":[0.00040156499999999999,0.00041930199999999998],"432":[9.2660000000000007e-06,1.0329999999999999e-05],"950272":[0.098036786999999972,0.12767620599999999],"655360":[0.040422278999999985,0.063219960000000006],"69632":[0.0023650279999999995,0.0023680490000000001],"11264":[0.00035364099999999992,0.00039526200000000007],"2752512":[0.48890563599999998,0.54871532599999995],"8126464":[1.5427970580000001,1.623288922],"27648":[0.00072299499999999993,0.00076897599999999999],"368":[1.0502e-05,1.1438e-05],"65536":[0.0020540739999999995,0.0021626060000000001],"16252928":[3.2295077230000002],"464":[1.1484000000000001e-05,1.1605e-05],"1015808":[0.085390711999999994,0.13247715400000001],"3072":[0.000101372,0.000104344],"110592":[0.004095853,0.0044473289999999999],"237568":[0.010779268999999999,0.01093394],"278528":[0.013700909000000001,0.014155414999999999],"496":[1.1610999999999999e-05,1.2128e-05],"13107200":[2.176290839,2.5782238020000001],"9961472":[1.9287205620000001,2.074132852],"5888":[0.00018745900000000001,0.00020964099999999994],"11010048":[2.0349357100000001,2.1087898350000001],"1920":[4.4764e-05,4.5745999999999999e-05],"2490368":[0.39573547100000001,0.47749556799999998],"19456":[0.00059168299999999997,0.00060189300000000026],"57344":[0.0016522010000000003,0.0016838929999999999],"1179648":[0.117485216,0.19213283800000003],"4718592":[0.89043574199999997,0.95159928199999999],"360448":[0.023862641,0.024128975],"1572864":[0.21355086300000001,0.250330883],"53248":[0.0014509689999999997,0.0014564249999999997],"3456":[8.2861000000000005e-05,8.9732000000000001e-05],"40960":[0.001316528,0.0013188539999999999],"4608":[0.00013054199999999998,0.00013510700000000003],"13824":[0.00034863400000000001,0.00036051699999999998],"819200":[0.056220197999999999,0.10712779100000003],"983040":[0.089964279999999994,0.14591971300000001],"8704":[0.000233735,0.000255667],"120":[2.8329999999999998e-06,2.835e-06],"1024":[2.6307000000000001e-05,2.6373999999999999e-05],"49152":[0.001886626,0.001922284],"524288":[0.027771260999999998,0.037298409000000005],"45056":[0.0015486849999999999,0.0015579179999999997],"229376":[0.010490569,0.011780103],"2688":[7.8703999999999997e-05,8.2738000000000006e-05],"152":[3.7740000000000002e-06,4.0450000000000002e-06],"5120":[0.00014823700000000001,0.000162504],"1507328":[0.22979406699999999,0.312551093],"1216":[3.4276999999999997e-05,3.4916999999999998e-05],"1966080":[0.25617415199999999,0.31511612499999997],"1900544":[0.23776534299999999,0.24229039599999999],"184":[5.558e-06,5.6620000000000002e-06],"7936":[0.00021487400000000002,0.00022295799999999996],"3801088":[0.59692877499999997,0.68285931600000005],"6815744":[1.079472558,1.272694107],"124":[2.994e-06,3.1439999999999999e-06],"102400":[0.0036922809999999999,0.0038853270000000001],"311296":[0.018617874,0.018982195],"1408":[4.2472000000000003e-05,4.2911999999999998e-05],"393216":[0.025378932,0.028133175999999999],"4352":[0.000129641,0.000136713],"6553600":[1.1074972350000001,1.215463983],"20480":[0.00064580599999999985,0.00064785899999999998],"608":[1.7638e-05,1.7946999999999999e-05],"2228224":[0.37695433099999998,0.38333153200000003],"36864":[0.001091344,0.001161514],"704":[1.9038e-05,2.1452000000000001e-05],"720896":[0.057261258000000002,0.074732390999999981],"800":[1.8084000000000002e-05,1.8142999999999999e-05],"2621440":[0.39877965399999998,0.41051967700000003],"425984":[0.024080591000000002,0.027346968000000006],"32768":[0.00091606299999999995,0.00092761500000000002],"12058624":[2.5512629220000003,2.8251726599999998],"128":[3.0979999999999998e-06,3.145e-06],"180224":[0.0097387309999999987,0.010193877],"224":[5.2070000000000003e-06,5.5670000000000002e-06],"736":[2.2212e-05,2.353e-05],"320":[8.3839999999999997e-06,9.0860000000000008e-06],"557056":[0.029555711000000002,0.050887322000000013],"832":[1.8308000000000002e-05,1.9332000000000001e-05],"9437184":[1.7208483139999999,1.807988701],"3584":[8.7650000000000003e-05,9.6181999999999995e-05],"6291456":[1.327697554,1.457923606],"256":[5.8649999999999998e-06,6.4420000000000003e-06],"15204352":[2.752484151,3.270199861],"28672":[0.0007548269999999998,0.00081213999999999993],"768":[2.5164000000000002e-05,2.5531e-05],"212992":[0.008934638,0.010564825],"864":[2.0733999999999998e-05,2.0920999999999998e-05],"352":[9.2229999999999996e-06,9.9199999999999999e-06],"253952":[0.01370077599999997,0.013758108],"960":[2.3417e-05,2.4984999999999999e-05],"24576":[0.00088834499999999991,0.00091582600000000001],"7680":[0.00019405099999999999,0.000228932],"294912":[0.015154925999999999,0.017244894],"1048576":[0.109512943,0.154575559],"10485760":[2.1020904229999999,2.1178497009999999],"344064":[0.021255706000000003,0.022402588999999997],"288":[7.3849999999999996e-06,7.3980000000000002e-06],"1152":[3.1097999999999999e-05,3.3062999999999998e-05],"384":[1.2254e-05,1.2366e-05],"2304":[6.1890999999999994e-05,6.6612999999999994e-05],"896":[2.0551999999999999e-05,2.1895999999999998e-05],"480":[1.1603000000000001e-05,1.2136e-05],"1441792":[0.17494597700000003,0.238288423],"992":[2.4513999999999999e-05,2.5850000000000002e-05],"3968":[0.000104812,0.000117423],"6400":[0.000152466,0.00016669800000000001],"1344":[3.9004000000000001e-05,4.3575999999999997e-05],"126976":[0.005272625999999999,0.0054618280000000002],"2883584":[0.52694999399999998,0.616149277],"753664":[0.054526754999999996,0.077759493999999998],"16384":[0.000459297,0.00051372100000000019],"131072":[0.0054562569999999991,0.0061296090000000003],"458752":[0.021743635000000004,0.030145027999999997],"172032":[0.0086114650000000004,0.0086510300000000005],"12288":[0.00043905400000000003,0.0004718709999999999],"14680064":[2.468398493,3.114701964],"1536":[4.9212999999999998e-05,6.1829999999999996e-05],"25600":[0.00065476900000000003,0.00065543900000000006],"1835008":[0.23842483999999997,0.26084213000000001],"10752":[0.000330286,0.00034382],"21504":[0.00066355199999999987,0.00074064900000000002],"7602176":[1.2089098250000001,1.4237630860000001],"5632":[0.000175866,0.00020562599999999993],"10":[3.2000000000000001e-07,3.3999999999999997e-07],"3145728":[0.60672568100000002,0.62880184799999994],"245760":[0.011482882999999999,0.01325835],"1728":[3.9363000000000002e-05,4.2382999999999997e-05],"11":[3.4299999999999999e-07,3.58e-07],"1114112":[0.103858425,0.166965223],"12":[3.5499999999999999e-07,3.8299999999999998e-07],"7340032":[1.2841879779999998,1.3535435300000001],"7168":[0.00018565400000000002,0.00019692400000000007],"13":[3.89e-07,4.27e-07],"6029312":[1.2386733519999999,1.2597515750000001],"14":[4.7300000000000001e-07,4.8100000000000003e-07],"3200":[7.7658999999999996e-05,8.1542e-05],"20":[5.1699999999999998e-07,5.9200000000000001e-07],"204800":[0.0088500200000000001,0.010167705000000001],"15":[4.2100000000000002e-07,4.3099999999999998e-07],"13312":[0.000332837,0.00035739999999999996],"4980736":[0.93797409200000004,1.0715352249999999],"118784":[0.0046343559999999992,0.0050119229999999997],"51200":[0.0014342420000000001,0.0014372460000000001],"16":[4.9599999999999999e-07,5.2300000000000001e-07],"21":[5.8699999999999995e-07,6.37e-07],"917504":[0.089484438999999999,0.110884468],"22":[6.0200000000000002e-07,6.8199999999999999e-07],"4864":[0.00013335199999999999,0.00014853799999999998],"17":[4.8500000000000002e-07,5.3099999999999998e-07],"14848":[0.00038109099999999996,0.00041493599999999997],"23":[6.6899999999999997e-07,6.7100000000000001e-07],"786432":[0.066910838,0.098159643000000033],"18":[4.8699999999999995e-07,5.6199999999999998e-07],"1638400":[0.19927452200000001,0.20305722800000003],"7864320":[1.3372658559999999,1.3747867949999999],"24":[6.6599999999999996e-07,8.5899999999999995e-07],"14155776":[2.407306927,6.2550825349999997],"19":[4.9599999999999999e-07,5.3099999999999998e-07],"30":[7.8599999999999997e-07,8.0500000000000002e-07],"25":[6.8100000000000002e-07,7.5199999999999996e-07],"31":[8.3099999999999996e-07,9.33e-07],"1280":[3.6295999999999999e-05,3.7379999999999998e-05],"26":[6.2399999999999998e-07,6.8899999999999999e-07],"3932160":[0.59077771699999992,0.59262532899999998],"2432":[6.4555999999999997e-05,7.3127000000000006e-05],"32":[7.7899999999999997e-07,8.6099999999999999e-07],"27":[6.8999999999999996e-07,7.2399999999999997e-07],"409600":[0.018963466999999998,0.024348244000000002]}},{"title":"OrderedDictionary init(uniqueKeysWithValues:)","results":{"28":[2.4655100000000002e-06,2.5306400000000002e-06],"34":[2.9967299999999996e-06,3.0252900000000002e-06],"29":[2.58272e-06,2.6340300000000001e-06],"40":[3.2859399999999996e-06,3.6837800000000001e-06],"17408":[0.0015600431666666665,0.0016377268],"1472":[0.000130285,0.00013281299999999999],"112":[8.6160000000000002e-06,8.9381800000000005e-06],"1376256":[0.214681545,0.274862414],"5242880":[1.093448703,1.1654477525],"36":[2.9877600000000002e-06,3.1840399999999998e-06],"42":[3.5127299999999998e-06,3.871740740740741e-06],"11534336":[2.6489213789999999,2.7264140690000001],"114688":[0.010677537500000001,0.010914603],"144":[1.1573363636363636e-05,1.289314e-05],"38":[3.1289300000000002e-06,3.38625e-06],"240":[1.9249000000000002e-05,1.9454400000000001e-05],"9216":[0.00080265799999999982,0.00082518018181818172],"44":[3.6804500000000001e-06,4.0962599999999998e-06],"1664":[0.000131497,0.00013823700000000004],"196608":[0.021407233999999997,0.0215086845],"155648":[0.015292794,0.016379716999999999],"2816":[0.00025306299999999999,0.00028363234285714293],"50":[3.9685299999999998e-06,3.9948499999999995e-06],"2359296":[0.41177591149999998,0.442793137],"46":[3.8426799999999999e-06,3.9110299999999999e-06],"176":[1.523332e-05,1.5889429999999999e-05],"52":[4.1617399999999997e-06,4.1934700000000002e-06],"272":[2.2087e-05,2.3285469999999997e-05],"116":[9.3519499999999995e-06,9.9455000000000016e-06],"47104":[0.0043840939999999998,0.0045425129999999998],"6912":[0.00057885650000000027,0.00059540674999999997],"1856":[0.00015152699999999999,0.00015839400000000002],"48":[4.2601099999999999e-06,4.40731e-06],"2097152":[0.34875011450000004,0.34968011899999996],"54":[4.2499900000000001e-06,4.2981899999999999e-06],"2031616":[0.314159994,0.32822254150000002],"43008":[0.003896568,0.0040781315000000002],"60":[4.9675999999999997e-06,4.9742600000000006e-06],"30720":[0.002616756,0.002751763],"56":[4.5192700000000005e-06,4.8274700000000004e-06],"62":[4.88757e-06,5.5420199999999993e-06],"58":[4.7415100000000001e-06,4.7455099999999996e-06],"3014656":[0.61434644149999995,0.67313117350000007],"64":[5.1210600000000006e-06,5.3160399999999998e-06],"8388608":[1.7601879810000001,1.8058052335000001],"29696":[0.0025598366666666665,0.0026989873333333331],"216":[1.7288770000000001e-05,1.7842999999999998e-05],"106496":[0.0097671800000000003,0.010209735500000001],"72":[5.84241e-06,6.1608899999999999e-06],"442368":[0.047514305500000006,0.049499011500000009],"147456":[0.0145834125,0.014984210500000001],"4456448":[0.87980078750000001,0.91598482650000002],"63488":[0.005748243000000001,0.0058477800000000003],"38912":[0.0034802180000000002,0.0035088909999999992],"68":[5.3919102564102561e-06,5.8092899999999997e-06],"188416":[0.020020113499999999,0.021374972000000002],"248":[1.9908429999999999e-05,2.033397e-05],"80":[6.5355100000000002e-06,7.28917e-06],"2560":[0.00020855600000000001,0.00025102205128205136],"34816":[0.0030177909999999997,0.0031690819999999993],"3712":[0.00028615800000000001,0.000311339],"3538944":[0.64997863500000008,0.66732778500000001],"76":[6.1776300000000003e-06,6.5758099999999996e-06],"4194304":[0.80357253849999999,0.82241581850000001],"851968":[0.102280331,0.15191339100000001],"4096":[0.000354858,0.00037606099999999996],"59392":[0.005159238,0.0056231580000000014],"84":[7.2748571428571433e-06,7.4182100000000002e-06],"3276800":[0.60680575999999997,0.61544591900000001],"55296":[0.0047961745,0.0051431799999999989],"688128":[0.082383006500000008,0.110844967],"8192":[0.00071123300000000003,0.00073854300000000003],"10240":[0.00085750700000000008,0.00092864],"15872":[0.001358047,0.001479113],"92":[7.8004999999999993e-06,7.9046666666666673e-06],"26624":[0.0023025239999999998,0.002396399],"1792":[0.00014559499999999999,0.00014868000000000002],"11776":[0.00109271,0.001121106],"2944":[0.000266512,0.00026702240540540532],"88":[7.5961199999999997e-06,7.9538399999999994e-06],"22528":[0.0020761145000000002,0.0021743977499999998],"1245184":[0.177607611,0.24170991200000003],"15728640":[3.3225007695,3.3814148400000001],"96":[8.4528499999999999e-06,8.5335700000000004e-06],"1984":[0.00016192000000000002,0.00016379200000000001],"139264":[0.013663465999999999,0.014411038000000001],"475136":[0.053232068,0.061318580000000025],"13631488":[2.795726632,2.843189331],"416":[3.3662999999999999e-05,3.4609949999999999e-05],"928":[7.2310000000000004e-05,7.6467270833333324e-05],"512":[4.2188999999999999e-05,4.2935150000000005e-05],"18432":[0.00169527,0.0017140949999999999],"16777216":[3.7007970370000001],"9728":[0.00080964000000000003,0.00084367600000000013],"1769472":[0.27661236850000004,0.33303932400000003],"1703936":[0.27794940550000002,0.28290300800000001],"2048":[0.00016437799999999999,0.000174053],"14336":[0.0012198129999999999,0.001250541],"448":[3.6371000000000001e-05,3.7809160000000001e-05],"5505024":[1.2125693559999999,1.2138294949999999],"544":[4.6643e-05,4.7036539999999999e-05],"221184":[0.022392947999999996,0.023756946000000001],"90112":[0.0087353449999999985,0.0089168350000000014],"640":[5.2439999999999999e-05,5.2766999999999998e-05],"12800":[0.0010579719999999999,0.001130799],"262144":[0.0271799205,0.028138357499999999],"589824":[0.067638847000000002,0.095277834000000006],"884736":[0.10934544299999999,0.15001232649999999],"6144":[0.00057241000000000008,0.00057511999999999993],"1088":[9.3278176470588234e-05,9.5530499999999996e-05],"576":[4.8147969999999998e-05,5.0633999999999997e-05],"160":[1.259022e-05,1.406001e-05],"672":[5.4815000000000003e-05,5.8529935483870972e-05],"8912896":[1.882211002,1.8945171629999999],"100":[7.9151800000000003e-06,8.5457800000000007e-06],"507904":[0.056434971,0.076693896500000011],"3840":[0.00032497100000000002,0.00033341600000000001],"192":[1.6254333333333335e-05,1.6970090000000001e-05],"376832":[0.042242708000000011,0.045849237000000001],"98304":[0.0098820760000000001,0.010220607500000001],"5376":[0.00047603240000000007,0.00049722614999999997],"94208":[0.0092349569999999985,0.0093070840000000002],"81920":[0.007750583000000001,0.0084635500000000002],"3407872":[0.62193296599999992,0.66143306149999992],"104":[8.0080000000000002e-06,8.4416500000000007e-06],"122880":[0.011722255000000001,0.012005855000000001],"200":[1.5676640000000001e-05,1.6061700000000002e-05],"163840":[0.016119407000000002,0.017597514499999994],"4063232":[0.76956232849999995,0.83590664999999997],"5767168":[1.296604656,1.3274197725000001],"12582912":[3.1102300984999998,3.2193016390000002],"1600":[0.000126348,0.00013110633333333329],"136":[1.108866e-05,1.1630779999999999e-05],"232":[1.8836210000000002e-05,1.8846149999999999e-05],"7077888":[1.4120531009999999,1.5032377415],"86016":[0.0081624090000000007,0.0085162769999999992],"31744":[0.0027815983333333329,0.0029948226666666679],"168":[1.348206e-05,1.5038289999999999e-05],"622592":[0.073584901499999994,0.084962127999999984],"108":[8.5169800000000002e-06,8.6306153846153837e-06],"327680":[0.036524032999999997,0.036957219999999999],"2176":[0.00018906589583333333,0.00019315760784313732],"3328":[0.00027852777142857145,0.00028325699999999992],"1":[2.5167000000000003e-07,2.8350000000000002e-07],"2":[2.9138000000000001e-07,3.0303000000000003e-07],"3":[3.0465000000000002e-07,3.3624e-07],"4":[3.2953000000000001e-07,3.3073e-07],"7424":[0.0006405250000000003,0.00064692921428571447],"5":[3.6565e-07,3.7101000000000004e-07],"23552":[0.0021586500000000002,0.0022653079999999997],"6":[3.8201999999999998e-07,4.2631000000000001e-07],"61440":[0.005757519,0.005813223000000001],"491520":[0.055858804500000005,0.067429601500000033],"77824":[0.0072102920000000001,0.0075839449999999999],"7":[4.1186999999999999e-07,4.2104999999999998e-07],"8":[4.3165999999999999e-07,4.7401999999999995e-07],"208":[1.6430519999999999e-05,1.674795294117647e-05],"9":[4.7272999999999997e-07,5.1496e-07],"73728":[0.0069597049999999992,0.0073828600000000006],"304":[2.4986000000000001e-05,2.50164e-05],"400":[3.0054099999999997e-05,3.1958000000000001e-05],"1310720":[0.18909457700000001,0.26790499400000001],"336":[2.8183000000000001e-05,3.0378999999999998e-05],"3670016":[0.67687159499999994,0.719194216],"6656":[0.00055691300000000003,0.00056972094117647054],"15360":[0.0013132560000000001,0.0013624142857142857],"432":[3.3824e-05,3.4765689189189188e-05],"950272":[0.118112417,0.158620865],"655360":[0.077272292500000034,0.098419882000000028],"69632":[0.0065041790000000014,0.0066701949999999994],"11264":[0.0010391396666666667,0.001098250875],"2752512":[0.508408258,0.58394384050000003],"8126464":[1.6943121475,1.7040940204999999],"27648":[0.0024132885000000001,0.0024957876666666674],"368":[3.1623810000000001e-05,3.2455722222222219e-05],"65536":[0.0057945959999999999,0.0061505640000000007],"16252928":[3.4496248239999998],"464":[3.7542640000000005e-05,3.9228359999999996e-05],"1015808":[0.134830276,0.16842534100000001],"3072":[0.00027860108571428572,0.00028353409090909091],"110592":[0.010123526000000001,0.010609713],"237568":[0.024361285,0.025552508500000005],"278528":[0.028927004500000002,0.030334444500000002],"496":[4.0166999999999997e-05,4.2348000000000002e-05],"13107200":[2.6811469025000001,2.7546852734999998],"9961472":[2.1517501365,2.2147139364999999],"5888":[0.00051822199999999993,0.00055484764705882364],"11010048":[2.4775914385000002,2.5008156609999999],"1920":[0.000147138,0.00015487500000000001],"2490368":[0.43730720599999995,0.49356250350000003],"19456":[0.0017149070000000003,0.0017965539999999999],"57344":[0.0050224169999999995,0.0052966030000000013],"1179648":[0.16283311,0.221218946],"4718592":[0.96555385599999999,1.012980344],"360448":[0.040937116000000009,0.042134739000000004],"1572864":[0.253271576,0.25553606649999999],"53248":[0.0045856639999999988,0.0046754550000000002],"3456":[0.00028286299999999995,0.00029124699999999996],"40960":[0.003740752,0.003897849000000001],"4608":[0.00040001749999999997,0.00041924321739130431],"13824":[0.0012040969999999999,0.00122125025],"819200":[0.099061943999999999,0.131353418],"983040":[0.133172281,0.17189770400000001],"8704":[0.00074983100000000007,0.0007590889999999999],"120":[9.5484899999999994e-06,9.6599099999999995e-06],"1024":[8.3956411764705876e-05,8.5330066666666678e-05],"49152":[0.004572619,0.0048109300000000006],"524288":[0.058482402999999995,0.068437712000000012],"45056":[0.0040446409999999999,0.0041647824999999994],"229376":[0.023061362000000002,0.027410546000000001],"2688":[0.000238137,0.00024657938888888889],"152":[1.2614807692307691e-05,1.322854e-05],"5120":[0.00043404699999999991,0.00045220731578947361],"1507328":[0.23619768599999999,0.337368112],"1216":[0.00010095899999999999,0.00010580143478260864],"1966080":[0.32376032599999999,0.38370613050000002],"1900544":[0.29550422700000001,0.30355911200000002],"184":[1.5050999999999999e-05,1.5905879999999998e-05],"7936":[0.00066580100000000004,0.00068907800000000009],"3801088":[0.70948955749999998,0.74174932100000002],"6815744":[1.3394585779999999,1.4419916079999999],"124":[9.9867699999999986e-06,1.039799e-05],"102400":[0.0095892219999999997,0.0097877459999999999],"311296":[0.033595994999999976,0.034380959000000016],"1408":[0.00012443400000000001,0.00012456500000000001],"393216":[0.046561416000000001,0.053936108499999989],"4352":[0.00037737825000000002,0.00039030712000000001],"6553600":[1.285618234,1.369757296],"20480":[0.0018380920000000002,0.0018499159999999996],"608":[5.3521979999999999e-05,5.5102450000000006e-05],"2228224":[0.38608954299999998,0.39394810099999999],"36864":[0.0031554550000000002,0.0034438709999999998],"704":[5.8687999999999998e-05,6.233836206896552e-05],"720896":[0.090491317000000002,0.114412693],"800":[6.3959000000000002e-05,6.4383450000000001e-05],"2621440":[0.46441914400000001,0.51997562600000002],"425984":[0.048167671500000002,0.050472905999999998],"32768":[0.002797557,0.0028511420000000001],"12058624":[2.8797620290000001,2.9162603740000002],"128":[1.044971e-05,1.0539950000000001e-05],"180224":[0.018949926000000009,0.019345194999999999],"224":[1.7623999999999999e-05,1.814738e-05],"736":[6.1322666666666675e-05,6.5748450980392158e-05],"320":[2.728674e-05,2.748216e-05],"557056":[0.062346055499999997,0.080974507000000015],"832":[6.6514999999999996e-05,6.6696e-05],"9437184":[2.0213189140000001,2.0498186070000002],"3584":[0.00030282200000000001,0.00030777106451612902],"6291456":[1.510665814,1.5479501305000001],"256":[1.98215e-05,2.1442823529411767e-05],"15204352":[3.2009844164999999,3.3463859449999998],"28672":[0.0024369220000000002,0.0025418459999999995],"768":[6.7433148936170217e-05,6.9820081081081077e-05],"212992":[0.020677105999999997,0.024520729999999998],"864":[7.2934940000000001e-05,7.3851389999999995e-05],"352":[2.97291e-05,3.1071000000000001e-05],"253952":[0.026485482999999994,0.027555481499999999],"960":[8.0666000000000003e-05,8.084240909090908e-05],"24576":[0.0023677329999999999,0.0023712059999999998],"7680":[0.00066575,0.00071338846153846155],"294912":[0.031750037999999994,0.034172168000000017],"1048576":[0.13874695549999999,0.17650219099999997],"10485760":[2.3239697289999999,2.4290568480000001],"344064":[0.039301425000000015,0.042402745999999991],"288":[2.3763850000000001e-05,2.4261819999999997e-05],"1152":[9.9137454545454549e-05,0.00010106],"384":[3.2485499999999999e-05,3.3254129999999999e-05],"2304":[0.00019928099999999999,0.00020503700000000001],"896":[7.0508150000000007e-05,7.3460939393939391e-05],"480":[3.9039244897959181e-05,4.1177000000000002e-05],"1441792":[0.23322091099999998,0.31023787850000001],"992":[8.1860099999999999e-05,8.2205000000000003e-05],"3968":[0.00032508073333333335,0.00035094507692307687],"6400":[0.00052807449999999997,0.00053388900000000006],"1344":[0.000114188,0.00011462041025641026],"126976":[0.012183814499999997,0.012228075],"2883584":[0.57005750050000004,0.63336798449999998],"753664":[0.092070844000000013,0.12061929049999998],"16384":[0.001411788,0.0016066920000000003],"131072":[0.012604694999999999,0.0133646155],"458752":[0.052264240999999989,0.065449281500000012],"172032":[0.017279283999999999,0.018833385000000001],"12288":[0.0011458250000000001,0.0012182410000000001],"14680064":[3.0792320864999998,3.1772437185000002],"1536":[0.00013569299999999996,0.00014155678947368419],"25600":[0.0022116239999999997,0.0022336599999999993],"1835008":[0.290891234,0.30449103899999996],"10752":[0.00095895139999999991,0.00097157999999999988],"21504":[0.0019345330000000167,0.0020287779999999997],"7602176":[1.534474012,1.5780066829999999],"5632":[0.00051760300000000016,0.00057804500000000001],"10":[5.0198999999999996e-07,5.0414000000000001e-07],"3145728":[0.6474628805,0.65802832450000004],"245760":[0.025311765,0.025325642999999998],"1728":[0.00014028400000000001,0.00014064000000000001],"11":[5.2151000000000007e-07,5.2367999999999994e-07],"1114112":[0.14872577149999999,0.19422826200000001],"12":[5.5509000000000003e-07,5.5568000000000001e-07],"7340032":[1.440709105,1.5004545929999999],"7168":[0.00060871000000000026,0.00065216000000000004],"13":[5.7621000000000005e-07,5.8263000000000002e-07],"6029312":[1.4105210215000001,1.4219399669999999],"14":[6.1154000000000004e-07,6.1705000000000009e-07],"3200":[0.00024409399999999998,0.00026735299999999996],"20":[1.7977600000000001e-06,1.8750599999999998e-06],"204800":[0.020723620000000047,0.021201904000000001],"15":[6.3436999999999993e-07,6.4002999999999999e-07],"13312":[0.0011178499999999999,0.0011585719999999999],"4980736":[1.0364557235,1.0399202585],"118784":[0.0114071785,0.0156405235],"51200":[0.0045555490000000008,0.0046400110000000012],"16":[1.5714299999999999e-06,1.5979000000000002e-06],"21":[1.91252e-06,2.0414000000000001e-06],"917504":[0.115380489,0.1570560325],"22":[1.9861999999999997e-06,2.1280600000000002e-06],"4864":[0.00040473799999999986,0.00043803499999999998],"17":[1.63553e-06,1.6750399999999999e-06],"14848":[0.0013064095714285713,0.001308584],"23":[2.1234210526315787e-06,2.2764200000000001e-06],"786432":[0.1081218865,0.13516536500000001],"18":[1.7428804347826087e-06,1.74329e-06],"1638400":[0.24902880099999999,0.26927311949999999],"7864320":[1.613319306,1.6294299329999999],"24":[2.2198599999999999e-06,2.2648100000000002e-06],"14155776":[2.9501478835000001,5.7051517355000003],"19":[1.7011599999999999e-06,1.8720400000000001e-06],"30":[2.4897399999999999e-06,2.6351899999999999e-06],"25":[2.1806399999999998e-06,2.19435e-06],"31":[2.5958600000000002e-06,2.8365100000000001e-06],"1280":[0.00011035133707865169,0.00011290290804597699],"26":[2.2330099999999999e-06,2.2679100000000002e-06],"3932160":[0.75772547850000005,0.77758539599999998],"2432":[0.000193279,0.00021127033333333327],"32":[2.7028700000000004e-06,2.7883699999999999e-06],"27":[2.3686399999999999e-06,2.4395499999999998e-06],"409600":[0.043949373,0.045324047499999999]}},{"title":"OrderedDictionary init(uncheckedUniqueKeysWithValues:)","results":{"28":[1.39128e-06,1.46497e-06],"34":[1.73168e-06,1.7677499999999999e-06],"29":[1.4960599999999999e-06,1.5088400000000001e-06],"40":[1.8585800000000002e-06,2.0029899999999999e-06],"17408":[0.00082189391666666659,0.00082252600000000018],"1472":[7.0277000000000005e-05,7.6886929999999993e-05],"112":[4.4804299999999999e-06,4.9756799999999999e-06],"1376256":[0.091527136499999995,0.12515722700000001],"5242880":[0.6326365035,0.68190381950000001],"36":[1.6894399999999999e-06,1.8811699999999999e-06],"42":[2.01039e-06,2.0473333333333333e-06],"11534336":[1.546908451,1.597640781],"114688":[0.0053359150000000001,0.0055127590000000008],"144":[6.3552300000000001e-06,6.5841600000000002e-06],"38":[1.77148e-06,1.9242200000000003e-06],"240":[9.7178300000000008e-06,1.0069199999999998e-05],"9216":[0.000415206,0.00042988599999999998],"44":[2.0633300000000002e-06,2.3818499999999999e-06],"1664":[6.8025e-05,7.0244840000000005e-05],"196608":[0.0109761415,0.012271377],"155648":[0.0077806970000000005,0.0082759609999999983],"2816":[0.00012726,0.00015037369230769233],"50":[2.2226600000000001e-06,2.2524499999999999e-06],"2359296":[0.20670816549999999,0.21996778550000001],"46":[2.1983793103448276e-06,2.2220399999999999e-06],"176":[8.0526800000000003e-06,8.0929099999999991e-06],"52":[2.3161500000000003e-06,2.3226200000000001e-06],"272":[1.111946e-05,1.1726629999999999e-05],"116":[4.7641799999999995e-06,5.0270399999999997e-06],"47104":[0.0023472710000000002,0.002473865],"6912":[0.00029739345454545446,0.0002986060625],"1856":[7.8125820000000005e-05,7.8632230769230767e-05],"48":[2.3408500000000002e-06,2.5439800000000004e-06],"2097152":[0.1776477565,0.180653646],"54":[2.2990200000000001e-06,2.30356e-06],"2031616":[0.1713049995,0.1748482875],"43008":[0.0020480870000000001,0.002276705],"60":[2.6878100000000002e-06,2.7330600000000003e-06],"30720":[0.0013239129999999999,0.001377725],"56":[2.5313899999999997e-06,2.5613099999999998e-06],"62":[2.6377300000000002e-06,2.9885900000000002e-06],"58":[2.5926551724137932e-06,2.6434e-06],"3014656":[0.27209626399999998,0.32773652549999999],"64":[2.7743800000000004e-06,2.8890699999999996e-06],"8388608":[1.1160933420000001,1.1719220809999999],"29696":[0.0012723610000000001,0.0013089079999999999],"216":[8.4166666666666668e-06,8.5528700000000003e-06],"106496":[0.0048823860000000007,0.0049294259999999989],"72":[3.1518099999999999e-06,3.2879699999999997e-06],"442368":[0.023821881,0.028002522999999994],"147456":[0.0072653319999999993,0.0075469279999999996],"4456448":[0.51709835500000001,0.52507145600000005],"63488":[0.0028693863333333338,0.0030165019999999999],"38912":[0.001807157,0.0018469387999999996],"68":[2.9303899999999997e-06,3.2274400000000001e-06],"188416":[0.010235138,0.014975687499999996],"248":[1.000483e-05,1.049594e-05],"80":[3.5780099999999997e-06,3.8102e-06],"2560":[0.00012460000000000002,0.00013286300000000002],"34816":[0.0015654129999999999,0.0015911301666666662],"3712":[0.00015660199999999999,0.00016037596491228073],"3538944":[0.39561829000000004,0.410940676],"76":[3.3907899999999999e-06,3.7276699999999999e-06],"4194304":[0.48317476999999998,0.55122108299999995],"851968":[0.0502160995,0.071586910000000017],"4096":[0.00017705599999999995,0.00019061259999999998],"59392":[0.002692921,0.0028300933333333333],"84":[3.7693999999999999e-06,4.8696200000000005e-06],"3276800":[0.36197468799999999,0.36857474000000001],"55296":[0.0024121313333333332,0.0024991310000000008],"688128":[0.041147589999999998,0.050088615000000017],"8192":[0.00036356715999999998,0.00036766700000000002],"10240":[0.00044862900000000003,0.00050237100000000026],"15872":[0.0007217110000000001,0.00072647299999999994],"92":[4.3951599999999996e-06,4.4492000000000005e-06],"26624":[0.001121581,0.001187497],"1792":[7.0939999999999995e-05,7.7150999999999994e-05],"11776":[0.00058819999999999999,0.00060429600000000004],"2944":[0.000136969,0.00014979000000000004],"88":[4.1393000000000003e-06,4.3180300000000004e-06],"22528":[0.00111196325,0.001170014],"1245184":[0.079353996500000024,0.11365036100000001],"15728640":[2.1560178515000001,2.2257676024999999],"96":[4.47594e-06,5.3676000000000001e-06],"1984":[7.9301000000000005e-05,8.2155000000000002e-05],"139264":[0.0067932109999999987,0.0069763740000000022],"475136":[0.025959802000000004,0.029173668],"13631488":[1.8549254865,1.9072372310000001],"416":[1.6881999999999999e-05,1.714845e-05],"928":[3.8232899999999998e-05,3.9688999999999999e-05],"512":[2.1428710000000001e-05,2.2421000000000001e-05],"18432":[0.000881086,0.0008845499999999999],"16777216":[2.3711350355],"9728":[0.00043464300000000002,0.00044830252380952389],"1769472":[0.14810098499999999,0.18701141399999999],"1703936":[0.14339814799999995,0.14953874700000003],"2048":[8.4173999999999997e-05,8.4380000000000002e-05],"14336":[0.00060904899999999996,0.00063177060000000013],"448":[1.8173999999999999e-05,1.9353479999999999e-05],"5505024":[0.68649023100000006,0.69137705449999998],"544":[2.1923e-05,2.4081689999999999e-05],"221184":[0.011280486000000001,0.011401361],"90112":[0.0048403245000000006,0.0048484259999999986],"640":[2.7407500000000001e-05,2.9062400000000001e-05],"12800":[0.00053473727777777775,0.00057499470588235301],"262144":[0.013892565500000001,0.013945391499999998],"589824":[0.034988694000000001,0.043066726999999999],"884736":[0.050923760999999998,0.078320700000000021],"6144":[0.000313529,0.00032516158620689653],"1088":[4.8918646464646464e-05,4.8987999999999999e-05],"576":[2.4280000000000001e-05,2.5553623529411765e-05],"160":[6.4662099999999999e-06,7.1540600000000004e-06],"672":[3.007588e-05,3.0783e-05],"8912896":[1.1699261220000001,1.1837217954999999],"100":[4.09596e-06,4.1096800000000001e-06],"507904":[0.029262135999999994,0.030709110999999994],"3840":[0.000169968,0.00017467171428571428],"192":[9.2633600000000007e-06,9.4866199999999996e-06],"376832":[0.022118798500000002,0.022815739000000002],"98304":[0.005149084,0.0052628450000000004],"5376":[0.00025730300000000001,0.00026123799999999995],"94208":[0.004849239,0.0050345900000000002],"81920":[0.0039347499999999999,0.0042646350000000001],"3407872":[0.39617935399999998,0.41344788799999999],"104":[4.2240599999999997e-06,4.5346800000000003e-06],"122880":[0.0059280050000000009,0.0059866609999999999],"200":[7.8875000000000003e-06,8.0924999999999992e-06],"163840":[0.0082740350000000025,0.0085672869999999998],"4063232":[0.45876152399999998,0.49003388050000002],"5767168":[0.70371914199999996,0.75758376599999999],"12582912":[1.7257375804999999,1.8519414279999999],"1600":[6.6207430000000001e-05,6.6219169999999996e-05],"136":[6.0372800000000001e-06,6.1700000000000002e-06],"232":[9.5087700000000008e-06,9.5972500000000003e-06],"7077888":[0.90864143750000004,0.99271612450000002],"86016":[0.0042645644999999999,0.0044669705000000004],"31744":[0.0013523680000000001,0.001453207],"168":[7.2551500000000003e-06,7.8906399999999997e-06],"622592":[0.036492785999999999,0.053150720999999998],"108":[4.2827000000000005e-06,4.5772599999999999e-06],"327680":[0.018412631500000002,0.018943781999999999],"2176":[9.4764500000000011e-05,9.8456124999999996e-05],"3328":[0.00013520177464788761,0.00014175599999999999],"1":[2.4264000000000001e-07,2.6122000000000001e-07],"2":[2.5303999999999999e-07,2.6694999999999999e-07],"3":[2.4881000000000002e-07,2.7010999999999997e-07],"4":[2.5890000000000002e-07,2.8285999999999998e-07],"7424":[0.00031600000000000004,0.00032240685714285714],"5":[2.8384000000000003e-07,2.9647000000000001e-07],"23552":[0.0011790539999999999,0.001260073],"6":[3.1213000000000003e-07,3.3745000000000005e-07],"61440":[0.002755923,0.002944548],"491520":[0.027720129,0.032341150000000006],"77824":[0.0037674689999999999,0.0041929050000000011],"7":[3.0932000000000002e-07,3.1058000000000002e-07],"8":[3.0185000000000002e-07,3.3274e-07],"208":[8.3311900000000001e-06,8.5553299999999996e-06],"9":[3.3300000000000003e-07,3.5862000000000002e-07],"73728":[0.0035216830000000003,0.0037956489999999995],"304":[1.299871e-05,1.3199833333333334e-05],"400":[1.5674569999999999e-05,1.6232700000000001e-05],"1310720":[0.08488872900000001,0.123717647],"336":[1.48505e-05,1.4905e-05],"3670016":[0.41947736050000001,0.44981422900000001],"6656":[0.000265018,0.00028262400000000004],"15360":[0.00063815499999999973,0.00069148507142857143],"432":[1.7019000000000001e-05,1.7287369999999998e-05],"950272":[0.054964345500000032,0.070676528000000002],"655360":[0.038729917999999995,0.053998386499999995],"69632":[0.0033006629999999997,0.003379768],"11264":[0.00052230199999999988,0.00056612199999999985],"2752512":[0.244833988,0.27927759099999999],"8126464":[1.081667465,1.117762833],"27648":[0.0011586109999999999,0.001200219],"368":[1.7229912280701754e-05,1.8610040000000002e-05],"65536":[0.0029975090000000002,0.0031350500000000003],"16252928":[2.252556131],"464":[1.8953660000000002e-05,2.0741169999999998e-05],"1015808":[0.062102775999999991,0.088123605000000008],"3072":[0.000147472,0.00015829279999999996],"110592":[0.0050691829999999997,0.0053194569999999997],"237568":[0.0122119015,0.01252255],"278528":[0.015008154499999999,0.015302254999999997],"496":[2.0529900000000001e-05,2.08585e-05],"13107200":[1.794036089,1.8266086635000001],"9961472":[1.3182587365,1.3777388230000001],"5888":[0.00029189499999999997,0.00030080300000000004],"11010048":[1.4661661239999999,1.4883894520000001],"1920":[7.8159545454545458e-05,8.1699790000000006e-05],"2490368":[0.21450056749999999,0.24205234950000001],"19456":[0.00093548730000000014,0.00094271199999999985],"57344":[0.002624431,0.0026481579999999994],"1179648":[0.077533084000000002,0.110473904],"4718592":[0.569850466,0.61440462200000001],"360448":[0.020802483,0.022362864],"1572864":[0.1124444835,0.119296764],"53248":[0.0023121064999999997,0.0023531170000000001],"3456":[0.00013999000000000002,0.00014199469999999999],"40960":[0.001918646,0.00197369775],"4608":[0.00020026200000000001,0.00021062683333333338],"13824":[0.00060700724999999999,0.00061313268750000003],"819200":[0.047905074999999998,0.059696382000000006],"983040":[0.059668754499999997,0.09583159300000002],"8704":[0.00038900499999999999,0.000402326],"120":[4.9116899999999992e-06,5.0231899999999998e-06],"1024":[4.1491e-05,4.5114999999999997e-05],"49152":[0.0025847439999999999,0.0026070540000000001],"524288":[0.029724303000000001,0.032107680999999999],"45056":[0.0022159767500000002,0.0022701079999999994],"229376":[0.011815581,0.012215306],"2688":[0.00012422545454545455,0.0001255352857142857],"152":[6.5081899999999999e-06,7.1531999999999995e-06],"5120":[0.00022130500000000004,0.00023930199999999999],"1507328":[0.10335773600000001,0.15297886250000001],"1216":[5.3043160919540226e-05,5.4932410000000004e-05],"1966080":[0.17519906950000003,0.199402987],"1900544":[0.15988956100000001,0.17787488600000001],"184":[8.805650000000001e-06,8.9077499999999995e-06],"7936":[0.000324192,0.00034217064285714283],"3801088":[0.42486684750000003,0.46818494449999998],"6815744":[0.87014217000000005,0.95079149949999997],"124":[5.2723099999999993e-06,5.6798299999999998e-06],"102400":[0.0048225430000000003,0.0049220540000000004],"311296":[0.017195170000000003,0.018775931499999999],"1408":[6.5382580000000005e-05,7.0076547619047613e-05],"393216":[0.023971329,0.025487346000000004],"4352":[0.00018825100000000001,0.000191688],"6553600":[0.83350844700000004,0.91348439300000006],"20480":[0.00096524500000000021,0.00098265600000000015],"608":[2.6963320000000001e-05,2.7923549999999998e-05],"2228224":[0.19573447499999999,0.19909473649999998],"36864":[0.0016444879999999999,0.0017466109999999999],"704":[3.2162590000000002e-05,3.3868380000000001e-05],"720896":[0.0438384125,0.049836671500000006],"800":[3.1730129999999998e-05,3.3142419999999998e-05],"2621440":[0.23626138500000005,0.25509542499999999],"425984":[0.023074811000000001,0.025111917000000004],"32768":[0.001451679,0.0014742889999999999],"12058624":[1.628250599,1.6712145119999999],"128":[5.3970500000000003e-06,5.8882400000000009e-06],"180224":[0.009970507,0.010095405],"224":[8.8901739130434779e-06,9.1915400000000011e-06],"736":[3.3840000000000001e-05,3.4767000000000001e-05],"320":[1.3951669999999999e-05,1.4668269999999999e-05],"557056":[0.031713401000000009,0.035977083999999999],"832":[3.2812560000000002e-05,3.3185000000000002e-05],"9437184":[1.275231572,1.301562203],"3584":[0.00015244099999999999,0.000155928],"6291456":[0.80325178149999998,0.88437571999999998],"256":[9.9720000000000004e-06,1.08843e-05],"15204352":[2.0701769680000002,2.1713343529999998],"28672":[0.0012587724285714288,0.0012951532857142863],"768":[3.622064e-05,3.8952629999999999e-05],"212992":[0.010605700500000001,0.013213316000000003],"864":[3.5735000000000003e-05,3.6545129999999999e-05],"352":[1.5549120000000001e-05,1.5894000000000001e-05],"253952":[0.013296598999999997,0.013447773999999999],"960":[4.0129620000000004e-05,4.1631050000000005e-05],"24576":[0.0013040152857142855,0.0013248324285714285],"7680":[0.0003293830000000001,0.00036645100000000001],"294912":[0.016315507999999999,0.016531018500000001],"1048576":[0.065596309000000019,0.088783474500000042],"10485760":[1.417145729,1.4935220629999999],"344064":[0.020221814999999997,0.0202222785],"288":[1.2008899999999999e-05,1.2822720000000001e-05],"1152":[5.0863579999999997e-05,5.1883046511627907e-05],"384":[1.7662340000000001e-05,1.82408e-05],"2304":[9.9679000000000006e-05,0.00010337433333333331],"896":[3.6402600000000003e-05,3.6476000000000001e-05],"480":[1.9689704081632654e-05,2.1995970000000002e-05],"1441792":[0.097213188000000034,0.143278195],"992":[4.1551999999999998e-05,4.360132e-05],"3968":[0.0001583953333333333,0.000173475],"6400":[0.00025131300000000002,0.00025501566666666668],"1344":[6.1750629629629626e-05,6.1906280000000006e-05],"126976":[0.006019244,0.0060488019999999998],"2883584":[0.27518631900000001,0.33354785799999997],"753664":[0.046533812000000001,0.061133187500000005],"16384":[0.00076033899999999985,0.00080886791666666641],"131072":[0.0064549659999999977,0.0066541500000000002],"458752":[0.02798612100000001,0.031272441000000005],"172032":[0.0087221769999999994,0.0093235449999999991],"12288":[0.00064170640000000016,0.00066837857142857142],"14680064":[2.0022666519999999,2.107667889],"1536":[7.4271999999999996e-05,7.9042999999999995e-05],"25600":[0.0010371429999999999,0.001125521],"1835008":[0.14688506699999998,0.15651660100000001],"10752":[0.00051283800000000005,0.00051510373684210517],"21504":[0.0010311874444444444,0.0010869969999999997],"7602176":[1.0089130399999999,1.01889213],"5632":[0.00027226782857142856,0.00030058906060606073],"10":[3.4410999999999998e-07,3.4486000000000003e-07],"3145728":[0.30877522200000002,0.31088616299999999],"245760":[0.013032339,0.013113174999999999],"1728":[6.7236000000000005e-05,7.4295679999999999e-05],"11":[3.4331000000000002e-07,3.5410999999999999e-07],"1114112":[0.074370777000000013,0.08757218300000004],"12":[3.6145e-07,3.6325000000000003e-07],"7340032":[0.98136398650000001,0.99789515900000003],"7168":[0.000317688,0.00033828370370370375],"13":[3.5872999999999998e-07,3.7595999999999999e-07],"6029312":[0.77319566250000005,0.79114128500000003],"14":[3.8612999999999998e-07,3.9076000000000004e-07],"3200":[0.00012347500000000001,0.00012813500000000001],"20":[1.07028e-06,1.16551e-06],"204800":[0.010651101999999999,0.010777089],"15":[3.8638e-07,3.8856999999999999e-07],"13312":[0.00055180500000000005,0.00059114353333333325],"4980736":[0.60804199250000002,0.62902131999999999],"118784":[0.0055115390000000011,0.005905052],"51200":[0.0022153202500000001,0.0022913579999999994],"16":[9.8690000000000003e-07,1.04484e-06],"21":[1.1817800000000001e-06,1.2270799999999999e-06],"917504":[0.053702335499999997,0.07039118749999998],"22":[1.2026000000000001e-06,1.2874300000000001e-06],"4864":[0.000219681,0.000235386],"17":[1.05374e-06,1.1010999999999999e-06],"14848":[0.0006336489999999998,0.0006688769999999999],"23":[1.2764800000000001e-06,1.3409300000000001e-06],"786432":[0.049826082000000008,0.054683983499999977],"18":[1.0712199999999999e-06,1.0940499999999999e-06],"1638400":[0.132692264,0.141729726],"7864320":[1.0681895095,1.071804714],"24":[1.3350499999999998e-06,1.3757099999999999e-06],"14155776":[1.9399106205000001,3.5567996590000002],"19":[1.0164699999999999e-06,1.18733e-06],"30":[1.5404899999999998e-06,1.5848100000000001e-06],"25":[1.3082600000000002e-06,1.3276499999999999e-06],"31":[1.4668999999999999e-06,1.6827899999999999e-06],"1280":[5.7958999999999999e-05,5.8097419999999998e-05],"26":[1.2911100000000001e-06,1.37003e-06],"3932160":[0.4500158575,0.49043013950000003],"2432":[0.000107227,0.00011654000000000001],"32":[1.5274799999999999e-06,1.6234800000000001e-06],"27":[1.3225699999999999e-06,1.3758499999999999e-06],"409600":[0.022228969999999997,0.022792775499999997]}},{"title":"OrderedDictionary init(uncheckedUniqueKeys:values:)","results":{"28":[6.7925999999999996e-07,7.0416999999999999e-07],"34":[8.7315384615384621e-07,8.8949000000000006e-07],"29":[7.2811999999999998e-07,7.3519000000000001e-07],"40":[9.2246000000000002e-07,1.00251e-06],"17408":[0.00052583238888888903,0.00053214600000000016],"1472":[4.7159130000000003e-05,5.0779000000000003e-05],"112":[2.5844199999999999e-06,2.7177700000000001e-06],"1376256":[0.062891231500000019,0.076059302000000009],"5242880":[0.496360674,0.49950475800000005],"36":[8.5435999999999998e-07,1.0299000000000001e-06],"42":[9.8548000000000001e-07,1.0677599999999999e-06],"11534336":[1.280773436,1.3466515585000001],"114688":[0.0033751565,0.0035293754999999997],"144":[3.491666666666667e-06,3.7276799999999998e-06],"38":[8.8439999999999995e-07,9.5562000000000014e-07],"240":[5.5055299999999996e-06,5.6341886792452833e-06],"9216":[0.000272606,0.00028725287499999997],"44":[1.0932e-06,1.1224099999999999e-06],"1664":[4.0821399999999995e-05,4.2252000000000001e-05],"196608":[0.0074998290000000013,0.0089228050000000007],"155648":[0.0051510140000000006,0.005280959],"2816":[8.9451500000000002e-05,9.8851000000000006e-05],"50":[1.17267e-06,1.19688e-06],"2359296":[0.13408100749999999,0.13884284199999999],"46":[1.1178900000000001e-06,1.29472e-06],"176":[4.4068599999999999e-06,4.8816400000000002e-06],"52":[1.229e-06,1.2458200000000001e-06],"272":[6.1981799999999997e-06,6.7022500000000001e-06],"116":[2.6788400000000003e-06,2.8336799999999999e-06],"47104":[0.0016076703333333339,0.0017133533999999988],"6912":[0.000184475,0.00019259599999999998],"1856":[4.7206999999999997e-05,4.7209200000000002e-05],"48":[1.2259e-06,1.36239e-06],"2097152":[0.11672132,0.12803397750000001],"54":[1.2381699999999999e-06,1.28797e-06],"2031616":[0.104176905,0.111898998],"43008":[0.0013952872857142856,0.0014846450000000001],"60":[1.41497e-06,1.4367300000000001e-06],"30720":[0.00084975800000000015,0.00089735699999999989],"56":[1.3203299999999999e-06,1.3495599999999999e-06],"62":[1.40449e-06,1.53077e-06],"58":[1.35518e-06,1.37029e-06],"3014656":[0.203079914,0.22746327199999999],"64":[1.4961900000000001e-06,1.5349100000000002e-06],"8388608":[0.89709455599999999,0.93077528850000002],"29696":[0.00081837833333333351,0.00084829200000000016],"216":[4.91296e-06,4.9247999999999998e-06],"106496":[0.0030763519999999988,0.0031531669999999997],"72":[1.66363e-06,1.7846700000000001e-06],"442368":[0.0160051745,0.017090592000000009],"147456":[0.0046721949999999996,0.0049076594999999997],"4456448":[0.3934561775,0.43214289299999997],"63488":[0.0018772916000000001,0.001935162],"38912":[0.0011655789999999999,0.0012115030000000001],"68":[1.5509000000000001e-06,1.7400099999999999e-06],"188416":[0.0068028000000000003,0.0080820240000000019],"248":[5.6299099999999999e-06,5.9966600000000003e-06],"80":[1.8727399999999999e-06,2.1452600000000002e-06],"2560":[7.5482740740740752e-05,8.9115799999999991e-05],"34816":[0.0010047460000000002,0.0010144780000000001],"3712":[0.00010121758163265308,0.00010363133333333332],"3538944":[0.30792090249999998,0.33894487500000003],"76":[1.7682700000000001e-06,1.8873499999999998e-06],"4194304":[0.36160704700000001,0.38893496599999999],"851968":[0.032742420000000001,0.043810212999999987],"4096":[0.00011118200000000003,0.000118477],"59392":[0.0017084309999999998,0.0018015646000000003],"84":[2.0686500000000001e-06,2.10119e-06],"3276800":[0.27683754399999999,0.28341692900000004],"55296":[0.0015554563333333331,0.001621688],"688128":[0.028793227000000005,0.031768998],"8192":[0.00023367986842105266,0.00023771899999999995],"10240":[0.00032225200000000003,0.00032833165517241389],"15872":[0.00044950000000000008,0.0004717530000000001],"92":[2.3113499999999999e-06,2.5158199999999998e-06],"26624":[0.00072136023076923065,0.00074768000000000002],"1792":[4.3396071428571427e-05,4.900225e-05],"11776":[0.00038646900000000007,0.00042806300000000007],"2944":[9.605208e-05,9.8642999999999997e-05],"88":[2.2496500000000001e-06,2.2644100000000001e-06],"22528":[0.00075414000000000015,0.00079338663636363657],"1245184":[0.053457642499999999,0.069901879],"15728640":[1.7916557605000001,1.8409425525000001],"96":[2.6789400000000001e-06,3.5006799999999997e-06],"1984":[5.2941e-05,5.2968931818181818e-05],"139264":[0.0043422464999999999,0.0045019324999999999],"475136":[0.018347141000000001,0.019010968999999999],"13631488":[1.5385524509999999,1.5961830100000001],"416":[9.4631900000000004e-06,9.5219999999999996e-06],"928":[2.2557229999999997e-05,2.461325e-05],"512":[1.26505e-05,1.2985250000000001e-05],"18432":[0.00055578599999999974,0.00060233056250000273],"16777216":[1.9042638219999999],"9728":[0.00029870199999999992,0.00030493416666666667],"1769472":[0.096598526999999976,0.1474776045],"1703936":[0.095136275500000006,0.1041248775],"2048":[5.0464999999999999e-05,5.4875263888888889e-05],"14336":[0.00038883500000000003,0.000413674],"448":[1.056205e-05,1.1394e-05],"5505024":[0.51792422299999996,0.52463869149999998],"544":[1.35675e-05,1.414831e-05],"221184":[0.007226714999999999,0.0074731230000000008],"90112":[0.0031380546666666662,0.0032521110000000007],"640":[1.6717529999999999e-05,1.795558e-05],"12800":[0.00033910199999999993,0.00035031],"262144":[0.0089797749999999989,0.0090013910000000009],"589824":[0.024483849500000005,0.027253418499999998],"884736":[0.034887406000000024,0.045562120000000005],"6144":[0.00022035699999999996,0.00022453713636363631],"1088":[2.835226666666667e-05,3.1575470000000001e-05],"576":[1.4187469999999999e-05,1.5260479999999999e-05],"160":[3.8792999999999994e-06,4.1290800000000003e-06],"672":[1.7484000000000001e-05,1.9129533333333334e-05],"8912896":[0.95209064600000004,0.95475678799999997],"100":[2.2682799999999998e-06,2.2762599999999999e-06],"507904":[0.019030776500000006,0.022041245000000004],"3840":[0.000107305,0.000108236],"192":[5.3506666666666669e-06,5.7124999999999999e-06],"376832":[0.015112061999999999,0.015840475],"98304":[0.0035918395000000005,0.0036780434999999999],"5376":[0.00017032200000000001,0.000174294],"94208":[0.0033807544999999994,0.0034109369999999993],"81920":[0.0026606359999999996,0.0028668490000000003],"3407872":[0.28627728499999999,0.32227101400000002],"104":[2.3697500000000001e-06,2.4222299999999998e-06],"122880":[0.0036783990000000002,0.0038551789999999994],"200":[4.59351e-06,4.6844399999999998e-06],"163840":[0.0055323830000000001,0.0057400400000000001],"4063232":[0.3510677975,0.36763159499999998],"5767168":[0.56904428750000002,0.60634496599999999],"12582912":[1.4242473470000001,1.5152994310000001],"1600":[3.7023500000000002e-05,4.050665e-05],"136":[3.2088600000000001e-06,3.3199764705882351e-06],"232":[5.2213899999999998e-06,5.3190000000000002e-06],"7077888":[0.72181065300000002,0.81379205200000004],"86016":[0.0028978709999999998,0.0030789603333333331],"31744":[0.00091244869999999986,0.00093166499999999992],"168":[4.1944500000000001e-06,4.8337e-06],"622592":[0.025833398,0.028314798499999995],"108":[2.42693e-06,2.47414e-06],"327680":[0.012417909,0.013180032],"2176":[5.8716671641791044e-05,6.3363727272727267e-05],"3328":[8.5065e-05,9.0567461538461545e-05],"1":[3.4429999999999998e-08,3.77e-08],"2":[3.4459999999999999e-08,3.62e-08],"3":[3.4450000000000001e-08,3.6040000000000004e-08],"4":[3.4340000000000002e-08,3.4450000000000001e-08],"7424":[0.000193475,0.00020510799999999999],"5":[3.4480000000000002e-08,3.6020000000000001e-08],"23552":[0.00083633309090909089,0.00084592499999999998],"6":[3.442e-08,3.6020000000000001e-08],"61440":[0.001768709,0.0018352049999999999],"491520":[0.018719264499999996,0.020284651000000004],"77824":[0.0025071169999999997,0.002644352],"7":[3.4459999999999999e-08,3.6099999999999999e-08],"8":[3.4450000000000001e-08,3.6020000000000001e-08],"208":[4.7730199999999996e-06,5.2554100000000004e-06],"9":[3.442e-08,3.627e-08],"73728":[0.0023357870000000002,0.0025781396666666673],"304":[7.2919499999999997e-06,7.8461299999999997e-06],"400":[8.8902600000000008e-06,9.3333299999999996e-06],"1310720":[0.057278960499999997,0.085083627000000009],"336":[8.996349999999999e-06,9.1157499999999999e-06],"3670016":[0.307284114,0.3396802605],"6656":[0.000176229,0.000186159],"15360":[0.00044110071428571428,0.00045147899999999996],"432":[9.6430000000000007e-06,1.004268e-05],"950272":[0.037685549999999998,0.044509270999999996],"655360":[0.027481891000000008,0.029103850000000004],"69632":[0.0021874132499999999,0.0022817275000000001],"11264":[0.000372899,0.00039229],"2752512":[0.16305328100000005,0.19280688099999999],"8126464":[0.86968108700000002,0.87323033699999997],"27648":[0.00072341700000000007,0.00080098800000000009],"368":[1.031097e-05,1.060436e-05],"65536":[0.0019749279999999999,0.00207428325],"16252928":[1.8631984620000002],"464":[1.0859970000000001e-05,1.1830569999999999e-05],"1015808":[0.041404183999999997,0.053932658000000022],"3072":[0.00010426730952380956,0.000109898],"110592":[0.0031973706666666669,0.0033485905],"237568":[0.0078777759999999995,0.0082105249999999998],"278528":[0.0097720900000000006,0.010009792],"496":[1.1622666666666666e-05,1.26634e-05],"13107200":[1.4765342495,1.5187246139999999],"9961472":[1.0725001064999999,1.1253596260000001],"5888":[0.0001994854893617021,0.000209237],"11010048":[1.2007272115000001,1.2176310699999999],"1920":[4.8461110000000003e-05,4.8877e-05],"2490368":[0.14374683399999999,0.15220430800000001],"19456":[0.00062927099999999982,0.00063787699999999991],"57344":[0.0016636850000000005,0.0017096851999999999],"1179648":[0.050155833000000004,0.066246676500000018],"4718592":[0.49084655500000002,0.53256860149999996],"360448":[0.014185886999999998,0.0142806415],"1572864":[0.075798919499999992,0.085754808000000016],"53248":[0.0014939643333333331,0.001519051],"3456":[8.8669666666666669e-05,9.2215999999999999e-05],"40960":[0.001294054,0.0013162],"4608":[0.00012906699999999999,0.00013707199999999999],"13824":[0.000357327,0.00037176699999999995],"819200":[0.03125688950000001,0.038138696],"983040":[0.039582977500000005,0.05084203399999998],"8704":[0.00025594405405405412,0.00026365299999999998],"120":[2.79626e-06,2.9932e-06],"1024":[2.5360430000000001e-05,2.770064e-05],"49152":[0.001755052,0.0018365935999999999],"524288":[0.019780941,0.021221652000000004],"45056":[0.0015019175000000001,0.0015425579999999999],"229376":[0.0075261290000000012,0.007793187],"2688":[8.0729999999999994e-05,8.5989923076923078e-05],"152":[3.6885100000000002e-06,3.9269499999999997e-06],"5120":[0.000150889,0.000159813],"1507328":[0.070650500000000033,0.10139474599999998],"1216":[3.2854000000000001e-05,3.4961923076923078e-05],"1966080":[0.114544589,0.118818171],"1900544":[0.10118113400000001,0.12272897100000001],"184":[5.0046700000000001e-06,5.0826699999999992e-06],"7936":[0.00021087099999999998,0.00022179933333333333],"3801088":[0.31642471,0.37033430649999999],"6815744":[0.70377953000000004,0.78428308699999993],"124":[2.9243000000000001e-06,2.95282e-06],"102400":[0.0029010236666666667,0.0029860046666666668],"311296":[0.0115166985,0.012447574500000006],"1408":[4.4768999999999998e-05,4.5169149999999998e-05],"393216":[0.016431198500000001,0.017514886],"4352":[0.00012748266666666664,0.0001290695],"6553600":[0.66692291199999998,0.7538241805],"20480":[0.00066435100000000009,0.00068044546153846143],"608":[1.6199289999999999e-05,1.675891e-05],"2228224":[0.124778202,0.1370089055],"36864":[0.001115324,0.001146881],"704":[1.9727569999999999e-05,2.043834e-05],"720896":[0.03163123000000001,0.033635789999999999],"800":[1.896007e-05,1.9138770000000002e-05],"2621440":[0.15882840349999999,0.190990302],"425984":[0.015249235,0.021841296],"32768":[0.00092596099999999999,0.0009650411111111108],"12058624":[1.349808399,1.4084912245000001],"128":[3.10626e-06,3.2643899999999998e-06],"180224":[0.0065090680000000015,0.006629262999999999],"224":[5.0144199999999995e-06,5.2957400000000002e-06],"736":[2.147417e-05,2.2320999999999999e-05],"320":[8.1104699999999993e-06,8.2616299999999994e-06],"557056":[0.021694999,0.025579005500000002],"832":[2.053588e-05,2.2575999999999999e-05],"9437184":[1.0289968905,1.0751938299999999],"3584":[9.7309e-05,9.813055670103092e-05],"6291456":[0.62313387350000005,0.73385348099999992],"256":[6.0595400000000004e-06,6.1835899999999997e-06],"15204352":[1.7125190045000001,1.8485941975],"28672":[0.00078417581818181811,0.00083270172727272743],"768":[2.3235980000000001e-05,2.5279769999999999e-05],"212992":[0.0066480009999999989,0.0071382210000000001],"864":[2.1338789999999999e-05,2.2410000000000001e-05],"352":[9.1932099999999993e-06,1.0007499999999999e-05],"253952":[0.0086174909999999997,0.0088028860000000011],"960":[2.3756689999999998e-05,2.5098630000000003e-05],"24576":[0.00088146100000000005,0.00089547299999999993],"7680":[0.00021158099999999997,0.000243336],"294912":[0.010987868,0.011129064500000001],"1048576":[0.042966664000000036,0.062507204000000011],"10485760":[1.1393864395,1.2204684880000001],"344064":[0.013573377000000001,0.0136029745],"288":[6.79461e-06,6.8376899999999999e-06],"1152":[3.0410089999999998e-05,3.065911e-05],"384":[1.0605386666666666e-05,1.0852189999999998e-05],"2304":[6.3411894736842105e-05,6.7200978260869562e-05],"896":[2.0887299999999999e-05,2.2628990000000002e-05],"480":[1.1326929999999999e-05,1.2150710000000001e-05],"1441792":[0.066677466500000004,0.094292770999999984],"992":[2.3425500000000001e-05,2.5934959999999999e-05],"3968":[0.00010918869620253165,0.000114691],"6400":[0.000166725,0.00016849599999999999],"1344":[3.9162579999999995e-05,3.9189765957446809e-05],"126976":[0.0038501609999999999,0.0038962300000000005],"2883584":[0.205160589,0.24152390000000001],"753664":[0.033286178,0.036267964999999999],"16384":[0.00050467066666666667,0.00052901977777777788],"131072":[0.0041386749999999996,0.0042469665000000011],"458752":[0.017180177500000008,0.019947234000000001],"172032":[0.0058991079999999993,0.006199818000000001],"12288":[0.00044002099999999997,0.00046884699999999994],"14680064":[1.664501953,1.7359868359999999],"1536":[5.0047390000000004e-05,5.2972436781609193e-05],"25600":[0.00068917700000000002,0.00069209199999999984],"1835008":[0.093196067500000007,0.1139529135],"10752":[0.00035414329629629632,0.0003577718461538461],"21504":[0.000713786,0.00072935300000000008],"7602176":[0.83236647500000005,0.84584928199999998],"5632":[0.000183315,0.000193246],"10":[3.4440000000000003e-08,3.4470000000000004e-08],"3145728":[0.19811917649999999,0.21547903299999999],"245760":[0.0081393540000000014,0.0082872589999999999],"1728":[4.0933999999999998e-05,4.5098266666666668e-05],"11":[3.4429999999999998e-08,3.5999999999999998e-08],"1114112":[0.046766644499999996,0.05646605200000001],"12":[3.4440000000000003e-08,3.4450000000000001e-08],"7340032":[0.73418119299999995,0.78349480799999993],"7168":[0.00018167900000000005,0.00021510461363636368],"13":[3.4319999999999999e-08,3.4450000000000001e-08],"6029312":[0.58536579099999997,0.60171204450000004],"14":[3.4429999999999998e-08,3.4440000000000003e-08],"3200":[7.8651666666666671e-05,8.3309933333333333e-05],"20":[4.9820000000000005e-07,5.3471999999999996e-07],"204800":[0.0065993200000000005,0.0066055359999999978],"15":[3.4389999999999999e-08,3.9960000000000002e-08],"13312":[0.00033859800000000012,0.00037357900000000002],"4980736":[0.45629012000000002,0.49228693849999999],"118784":[0.0034720595000000006,0.0038060455000000007],"51200":[0.0014207060000000003,0.0014948310000000001],"16":[4.3359999999999997e-07,4.6744000000000001e-07],"21":[5.2977000000000001e-07,5.8940000000000002e-07],"917504":[0.036835741500000019,0.048741637999999997],"22":[5.7469000000000002e-07,6.2376000000000002e-07],"4864":[0.00014335899999999997,0.00015293300000000001],"17":[4.3649999999999997e-07,4.82e-07],"14848":[0.00042152047826087203,0.00042770699999999999],"23":[6.0250000000000005e-07,6.3652000000000009e-07],"786432":[0.035259696,0.037973374499999997],"18":[4.8762999999999998e-07,4.9337000000000003e-07],"1638400":[0.090628784500000018,0.09403547000000001],"7864320":[0.82134552900000002,0.87248429550000006],"24":[6.2612000000000005e-07,6.8379000000000006e-07],"14155776":[1.6022835234999999,2.779081857],"19":[4.6397000000000004e-07,5.6970000000000003e-07],"30":[7.350400000000001e-07,7.6489999999999997e-07],"25":[6.0910000000000002e-07,7.0419999999999997e-07],"31":[7.4591999999999995e-07,7.6158999999999998e-07],"1280":[3.6860260000000001e-05,3.8402517241379308e-05],"26":[6.2576999999999992e-07,6.3656000000000003e-07],"3932160":[0.33661289700000002,0.36114710500000002],"2432":[7.4083339999999999e-05,7.4103303030303031e-05],"32":[7.5484e-07,9.0210999999999997e-07],"27":[6.5619999999999996e-07,6.5687999999999999e-07],"409600":[0.0147314205,0.0149740975]}},{"title":"OrderedDictionary sequential iteration","results":{"28":[9.3629999999999999e-08,9.7890000000000012e-08],"34":[1.0461000000000001e-07,1.0962e-07],"29":[9.5580000000000013e-08,9.9769999999999999e-08],"40":[1.1604e-07,1.2293e-07],"17408":[3.266975e-05,3.7277180000000001e-05],"1472":[2.74721e-06,2.9122900000000002e-06],"112":[2.4936999999999996e-07,2.6441999999999998e-07],"1376256":[0.0029922333333333336,0.0031182026666666677],"5242880":[0.0114303915,0.0117255585],"36":[1.0845999999999999e-07,1.1347e-07],"42":[1.1984000000000002e-07,1.2641e-07],"11534336":[0.025322354499999998,0.026086746000000004],"114688":[0.00023018873809523818,0.000237378],"144":[3.1159e-07,3.2621000000000001e-07],"38":[1.1246e-07,1.1705000000000001e-07],"240":[4.8879999999999998e-07,5.3260999999999995e-07],"9216":[1.7226000000000001e-05,1.7557000000000001e-05],"44":[1.2344999999999998e-07,1.3095000000000002e-07],"1664":[3.1644900000000001e-06,3.4565000000000003e-06],"196608":[0.00038840666666666669,0.00041043500000000012],"155648":[0.00029099900000000001,0.00031740800000000003],"2816":[5.3491600000000001e-06,5.51986e-06],"50":[1.3638999999999999e-07,1.3668e-07],"2359296":[0.0051356690000000007,0.0051542130000000004],"46":[1.2592000000000001e-07,1.3322e-07],"176":[3.6675999999999998e-07,3.8529000000000003e-07],"52":[1.3829e-07,1.385e-07],"272":[5.5176999999999997e-07,5.6626000000000004e-07],"116":[2.5587999999999999e-07,2.6953000000000001e-07],"47104":[9.0997923076923068e-05,9.6599000000000001e-05],"6912":[1.3394920000000001e-05,1.3711190000000001e-05],"1856":[3.5274999999999997e-06,3.5469400000000001e-06],"48":[1.3082e-07,1.4559e-07],"2097152":[0.0045768170000000004,0.0046176249999999993],"54":[1.4199000000000002e-07,1.4406000000000001e-07],"2031616":[0.0043328245000000005,0.0044228929999999998],"43008":[8.4825012048192781e-05,9.2667166666666673e-05],"60":[1.529e-07,1.5330999999999999e-07],"30720":[6.0668841269841275e-05,6.3312999999999995e-05],"56":[1.4586000000000001e-07,1.4789000000000001e-07],"62":[1.5651999999999997e-07,1.6466000000000002e-07],"58":[1.4946000000000002e-07,1.4956e-07],"3014656":[0.0065988619999999996,0.0066323480000000006],"64":[1.6044999999999998e-07,1.6818000000000001e-07],"8388608":[0.018820383,0.018824131000000001],"29696":[5.5578999999999998e-05,5.8378000000000002e-05],"216":[4.4406000000000002e-07,4.4471999999999997e-07],"106496":[0.00022047200000000007,0.000220835711111111],"72":[1.7531e-07,1.8340000000000001e-07],"442368":[0.00087354999999999985,0.00089156063636363638],"147456":[0.00030328253125000003,0.00030436100000000001],"4456448":[0.0097066300000000008,0.010154878500000001],"63488":[0.00012568099999999999,0.0001267156842105263],"38912":[7.2312999999999997e-05,7.8517375e-05],"68":[1.6963999999999998e-07,1.7627e-07],"188416":[0.00038848878260869566,0.00040268500000000001],"248":[5.0458999999999994e-07,5.2444000000000006e-07],"80":[1.8958999999999999e-07,2.0145000000000002e-07],"2560":[4.7624899999999999e-06,5.3006300000000001e-06],"34816":[6.4795999999999994e-05,7.3480569999999994e-05],"3712":[6.8971800000000001e-06,7.1524499999999996e-06],"3538944":[0.007692361,0.0078567309999999987],"76":[1.8272000000000001e-07,1.9104e-07],"4194304":[0.0091931750000000013,0.0093826890000000013],"851968":[0.0018037011999999999,0.0019678679999999998],"4096":[7.6660000000000008e-06,8.2783300000000004e-06],"59392":[0.000115534,0.00012220850000000001],"84":[1.9753e-07,2.0951999999999999e-07],"3276800":[0.007021004,0.0070629969999999997],"55296":[0.00010908692045454543,0.00011431985057471267],"688128":[0.0013972639999999998,0.0014650938333333335],"8192":[1.5748270000000001e-05,1.6644489999999999e-05],"10240":[1.99082e-05,1.9968379999999999e-05],"15872":[2.9329750000000002e-05,3.2204650000000003e-05],"92":[2.1194e-07,2.1257999999999999e-07],"26624":[5.1629409999999998e-05,5.4267000000000001e-05],"1792":[3.4262899999999999e-06,3.5646900000000001e-06],"11776":[2.2771559999999998e-05,2.3965349999999999e-05],"2944":[5.4743200000000008e-06,5.9814400000000003e-06],"88":[2.0445999999999999e-07,2.1605999999999999e-07],"22528":[4.3819000000000002e-05,4.4181000000000003e-05],"1245184":[0.002784248,0.0027844799999999998],"15728640":[0.034862313500000006,0.034952748999999991],"96":[2.1963999999999997e-07,2.1976e-07],"1984":[3.7634899999999998e-06,3.7984400000000002e-06],"139264":[0.00028081858823529349,0.00028779102941176471],"475136":[0.0009582627,0.0010338761111111114],"13631488":[0.029862244999999999,0.031678724999999998],"416":[8.1608999999999994e-07,8.2521999999999997e-07],"928":[1.7541700000000001e-06,1.85457e-06],"512":[1.0364899999999999e-06,1.0380800000000001e-06],"18432":[3.4295999999999998e-05,3.7586099999999996e-05],"16777216":[0.036719058999999998],"9728":[1.8778099999999999e-05,1.999073e-05],"1769472":[0.0038468280000000001,0.0039522015000000004],"1703936":[0.003699875,0.0036999999999999997],"2048":[3.8836600000000004e-06,3.9636666666666664e-06],"14336":[2.6679e-05,2.8276000000000002e-05],"448":[8.6984999999999992e-07,9.0472999999999998e-07],"5505024":[0.012221645,0.012255488],"544":[1.0498000000000001e-06,1.09884e-06],"221184":[0.00044385290909090922,0.00046884325000000007],"90112":[0.00017225399999999999,0.00018539900000000005],"640":[1.2277999999999999e-06,1.2296599999999998e-06],"12800":[2.5102150000000002e-05,2.6132999999999999e-05],"262144":[0.00051696636842105256,0.00053139047058823534],"589824":[0.0012466579999999999,0.0013780211666666671],"884736":[0.0019266539999999999,0.0020693072500000001],"6144":[1.1406000000000001e-05,1.235661971830986e-05],"1088":[2.03595e-06,2.1948999999999999e-06],"576":[1.1063600000000001e-06,1.15349e-06],"160":[3.3709000000000001e-07,3.5345999999999999e-07],"672":[1.2736600000000001e-06,1.2860899999999998e-06],"8912896":[0.019615023999999998,0.019643382000000004],"100":[2.2671e-07,2.3142999999999998e-07],"507904":[0.0010357634444444444,0.0011259339999999955],"3840":[7.2813900000000004e-06,7.4624800000000004e-06],"192":[3.9851000000000004e-07,4.0068999999999997e-07],"376832":[0.00077669399999999997,0.00078823341666666683],"98304":[0.00018295,0.00018968279999999997],"5376":[1.028637e-05,1.0487777777777777e-05],"94208":[0.00018373,0.00018386999999999999],"81920":[0.00016519469491525426,0.00017548600000000001],"3407872":[0.0076179389999999998,0.0076410749999999998],"104":[2.3459000000000001e-07,2.3499999999999997e-07],"122880":[0.000228698,0.00024541500000000002],"200":[4.1050000000000003e-07,4.1479000000000002e-07],"163840":[0.000325717,0.00033656703448275857],"4063232":[0.0089614569999999991,0.0089806029999999985],"5767168":[0.0125529265,0.012935226999999999],"12582912":[0.02770266,0.028193401999999999],"1600":[3.0163800000000003e-06,3.3413399999999999e-06],"136":[2.9606000000000002e-07,3.0894000000000001e-07],"232":[4.6782000000000002e-07,4.6786000000000001e-07],"7077888":[0.015487664999999998,0.015898315],"86016":[0.00016087099999999998,0.00017600500000000002],"31744":[6.2312009999999996e-05,6.5048999999999993e-05],"168":[3.5455000000000001e-07,3.6833999999999998e-07],"622592":[0.0012678918571428573,0.0014010310000000001],"108":[2.4465000000000001e-07,2.5282999999999997e-07],"327680":[0.00064909899999999999,0.00067916541666666679],"2176":[4.1403300000000004e-06,4.3314699999999995e-06],"3328":[6.2085199999999996e-06,6.6688000000000004e-06],"1":[3.1669999999999998e-08,3.3080000000000002e-08],"2":[3.3190000000000001e-08,3.32e-08],"3":[3.4760000000000002e-08,3.4760000000000002e-08],"4":[3.5000000000000002e-08,3.5000000000000002e-08],"7424":[1.424457e-05,1.4358e-05],"5":[3.6139999999999998e-08,3.6150000000000003e-08],"23552":[4.6437989999999998e-05,4.8441739999999997e-05],"6":[3.7409999999999996e-08,3.997e-08],"61440":[0.000120328,0.000126456],"491520":[0.00099839344444444434,0.001143076125],"77824":[0.0001562736333333333,0.000162053],"7":[3.9620000000000007e-08,4.034567901234568e-08],"8":[4.1899999999999998e-08,4.3610000000000005e-08],"208":[4.3455000000000004e-07,4.6897999999999996e-07],"9":[4.3229999999999997e-08,4.7610000000000001e-08],"73728":[0.00014596742857142858,0.0001662445],"304":[6.3117999999999996e-07,6.4099000000000002e-07],"400":[7.7539000000000006e-07,7.9176000000000004e-07],"1310720":[0.002816664,0.002913962],"336":[6.6919999999999998e-07,6.9347000000000003e-07],"3670016":[0.0080466050000000018,0.0081297080000000011],"6656":[1.2890060000000001e-05,1.3828621052631581e-05],"15360":[3.0164620000000001e-05,3.0331580000000001e-05],"432":[8.3903000000000002e-07,8.4875438596491224e-07],"950272":[0.0020365337500000006,0.00212656],"655360":[0.001363567428571429,0.001453338],"69632":[0.00013628499999999999,0.00014460866666666668],"11264":[2.0982e-05,2.304e-05],"2752512":[0.0059018809999999994,0.0060346530000000009],"8126464":[0.017754991000000001,0.018278836],"27648":[5.4942790000000005e-05,5.6535e-05],"368":[7.1508999999999998e-07,7.2621999999999995e-07],"65536":[0.00013171316216216219,0.00013473200000000001],"16252928":[0.036438926500000024],"464":[9.0009999999999997e-07,9.8355999999999995e-07],"1015808":[0.0021800629999999994,0.0022619962499999999],"3072":[5.71215e-06,5.74575e-06],"110592":[0.00021745299999999999,0.00021758112820512821],"237568":[0.0004854506666666666,0.00049020778947368433],"278528":[0.00055968100000000002,0.00059267726666666662],"496":[9.5785999999999992e-07,1.00768e-06],"13107200":[0.0284198955,0.029125313],"9961472":[0.021724126999999999,0.022283077999999994],"5888":[1.112e-05,1.1481392857142858e-05],"11010048":[0.0239620145,0.024078795],"1920":[3.6875900000000002e-06,3.71408e-06],"2490368":[0.0053342719999999993,0.0055237540000000005],"19456":[3.8278999999999997e-05,3.9999959999999994e-05],"57344":[0.00011338,0.00011920585542168679],"1179648":[0.002555702,0.002587981],"4718592":[0.010336541000000001,0.010567420499999999],"360448":[0.00072023949999999975,0.00072736230769230767],"1572864":[0.0033572389999999993,0.003402221],"53248":[9.9963999999999994e-05,0.000108386],"3456":[6.4504500000000002e-06,6.7350400000000001e-06],"40960":[7.6235000000000004e-05,8.1392999999999998e-05],"4608":[8.6549499999999992e-06,8.7584200000000004e-06],"13824":[2.695396e-05,2.8104920000000001e-05],"819200":[0.0018298036000000001,0.0019221068000000001],"983040":[0.00211181825,0.0022435790000000003],"8704":[1.6685750000000002e-05,1.8543199999999999e-05],"120":[2.6342999999999997e-07,2.6693000000000002e-07],"1024":[1.9371699999999999e-06,2.0344699999999998e-06],"49152":[9.5500000000000004e-05,0.00010213869230769231],"524288":[0.001027753,0.001096798],"45056":[8.7644000000000003e-05,8.8115399999999993e-05],"229376":[0.00046769857142857135,0.000468555],"2688":[4.99463e-06,5.2530299999999999e-06],"152":[3.2306999999999999e-07,3.4082999999999996e-07],"5120":[9.7008800000000009e-06,1.027514e-05],"1507328":[0.0033554170000000003,0.0034507319999999993],"1216":[2.3321999999999999e-06,2.3446299999999999e-06],"1966080":[0.0043650549999999996,0.0043911970000000003],"1900544":[0.004037059,0.0040863774999999993],"184":[3.7981000000000001e-07,3.8793000000000001e-07],"7936":[1.4898e-05,1.530515e-05],"3801088":[0.0083809500000000016,0.0087480660000000023],"6815744":[0.014940475999999999,0.015616496000000002],"124":[2.7039999999999999e-07,2.8475000000000001e-07],"102400":[0.00019091233333333335,0.00021434641463414635],"311296":[0.000643419,0.00065416200000000002],"1408":[2.6215599999999998e-06,2.6332599999999996e-06],"393216":[0.00078358299999999981,0.000808185],"4352":[8.1750099999999995e-06,8.82237e-06],"6553600":[0.014494191,0.0151542525],"20480":[3.8077999999999997e-05,3.8892e-05],"608":[1.1638599999999999e-06,1.28329e-06],"2228224":[0.0048384540000000007,0.0049258500000000007],"36864":[6.8591999999999997e-05,7.5204999999999996e-05],"704":[1.3341699999999999e-06,1.3494200000000001e-06],"720896":[0.001463469,0.001477697],"800":[1.52895e-06,1.53695e-06],"2621440":[0.0057227949999999993,0.005731117],"425984":[0.00085343800000000031,0.00093486519999999974],"32768":[6.1035000000000001e-05,6.8024450000000002e-05],"12058624":[0.0264356795,0.026641890000000001],"128":[2.7891e-07,2.9451999999999997e-07],"180224":[0.000357623,0.00037312400000000012],"224":[4.5779000000000002e-07,4.5821000000000002e-07],"736":[1.4081900000000001e-06,1.47986e-06],"320":[6.3501999999999998e-07,6.6034e-07],"557056":[0.0011238288749999999,0.0012352807142857144],"832":[1.5677700000000001e-06,1.8821428571428571e-06],"9437184":[0.021049871500000004,0.021560081500000002],"3584":[6.7175000000000005e-06,7.3259999999999998e-06],"6291456":[0.014099037,0.014209174499999999],"256":[5.2017000000000003e-07,5.3873999999999997e-07],"15204352":[0.033215366000000003,0.034021541999999995],"28672":[5.3433000000000002e-05,5.9259000000000003e-05],"768":[1.4589299999999999e-06,1.4689600000000002e-06],"212992":[0.00041788699999999992,0.00044164400000000004],"864":[1.6478700000000002e-06,1.7181699999999999e-06],"352":[6.9930000000000002e-07,7.1533333333333325e-07],"253952":[0.00050154099999999999,0.00052514499999999997],"960":[1.8080599999999998e-06,1.8846499999999998e-06],"24576":[4.7655999999999999e-05,4.7877999999999998e-05],"7680":[1.4538e-05,1.673081e-05],"294912":[0.00057387999999999992,0.00061457106666666672],"1048576":[0.0022327610000000002,0.0023974764999999997],"10485760":[0.023109035,0.023454989999999998],"344064":[0.00070033574999999999,0.00072480253846153835],"288":[5.8019000000000001e-07,5.9872999999999996e-07],"1152":[2.1519799999999998e-06,2.2886099999999998e-06],"384":[7.4709999999999991e-07,7.5759e-07],"2304":[4.3344299999999999e-06,4.5271299999999998e-06],"896":[1.70158e-06,1.7897e-06],"480":[9.3249000000000001e-07,9.7764999999999986e-07],"1441792":[0.0031088613333333237,0.0032633914999999998],"992":[1.8647299999999999e-06,1.9611199999999999e-06],"3968":[7.3738700000000003e-06,8.0588199999999995e-06],"6400":[1.2432050000000001e-05,1.247999e-05],"1344":[2.5471999999999999e-06,2.5710099999999999e-06],"126976":[0.00024246249999999996,0.00025655855263157889],"2883584":[0.0063074409999999996,0.0063530409999999994],"753664":[0.0015669846666666667,0.0017230137999999999],"16384":[3.335798e-05,3.5726780000000004e-05],"131072":[0.00026822199999999998,0.00028775824999999991],"458752":[0.00094830229999999982,0.0010618452222222227],"172032":[0.00032508900000000009,0.00035780000000000002],"12288":[2.3708870000000001e-05,2.5244000000000001e-05],"14680064":[0.031975904999999999,0.033410184999999995],"1536":[2.8920500000000001e-06,3.0681600000000003e-06],"25600":[4.7726999999999999e-05,5.2086010000000003e-05],"1835008":[0.0039169115000000001,0.0040182920000000006],"10752":[2.085330769230769e-05,2.1200400000000001e-05],"21504":[4.0507999999999999e-05,4.4957999999999999e-05],"7602176":[0.016614176500000001,0.017062773],"5632":[1.0640510000000002e-05,1.150119e-05],"10":[4.5879999999999998e-08,4.608e-08],"3145728":[0.0068469000000000004,0.006856605],"245760":[0.000483635,0.00049847778947368423],"1728":[3.27635e-06,3.5652799999999999e-06],"11":[4.6759999999999997e-08,4.6849999999999999e-08],"1114112":[0.0023288229999999998,0.0024005427499999995],"12":[4.8930000000000002e-08,4.8970000000000001e-08],"7340032":[0.015812789000000001,0.015896832],"7168":[1.3946659999999999e-05,1.489541e-05],"13":[5.0420000000000004e-08,5.1889999999999997e-08],"6029312":[0.013276537,0.0135177795],"14":[5.2929999999999998e-08,5.3260000000000002e-08],"3200":[6.1198800000000008e-06,6.4824399999999994e-06],"20":[7.8439999999999993e-08,8.2099999999999987e-08],"204800":[0.00040372800000000001,0.00041205885714285716],"15":[5.4730000000000001e-08,6.4799999999999998e-08],"13312":[2.534221e-05,2.6811349999999999e-05],"4980736":[0.010936195500000001,0.011068307499999999],"118784":[0.00023824280487804887,0.00024204049999999996],"51200":[0.00010118700000000001,0.00010120000000000001],"16":[6.6800000000000003e-08,7.0169999999999999e-08],"21":[8.008e-08,8.399e-08],"917504":[0.0020073825,0.0021015970000000002],"22":[8.2179999999999999e-08,8.6529999999999995e-08],"4864":[9.4271199999999996e-06,9.8017099999999987e-06],"17":[7.0119999999999995e-08,7.4179999999999993e-08],"14848":[2.8764009999999998e-05,3.0406e-05],"23":[8.3340000000000004e-08,8.7050000000000002e-08],"786432":[0.001581673,0.0017471494000000001],"18":[7.0640000000000003e-08,7.5559999999999996e-08],"1638400":[0.0035297229999999998,0.0036011050000000003],"7864320":[0.017402287999999995,0.017460866999999998],"24":[8.5920000000000004e-08,8.9949999999999995e-08],"14155776":[0.030686147,0.056196034499999992],"19":[7.2520000000000004e-08,7.5930000000000006e-08],"30":[9.7030000000000003e-08,9.7210000000000008e-08],"25":[8.7560000000000011e-08,8.7890000000000002e-08],"31":[9.8970000000000005e-08,1.0909000000000001e-07],"1280":[2.56293e-06,2.5869599999999997e-06],"26":[8.9679999999999993e-08,8.9889999999999993e-08],"3932160":[0.0086323400000000005,0.0086669099999999999],"2432":[4.6266400000000001e-06,4.9324799999999992e-06],"32":[1.0101999999999999e-07,1.0573000000000001e-07],"27":[9.1679999999999998e-08,9.2990000000000001e-08],"409600":[0.00077096800000000013,0.00083215245454545483]}},{"title":"OrderedDictionary.Keys sequential iteration","results":{"28":[5.4359999999999998e-08,5.4840000000000007e-08],"34":[6.8299999999999996e-08,7.1509999999999996e-08],"29":[5.6999999999999994e-08,5.9649999999999995e-08],"40":[7.1180000000000006e-08,7.4490000000000001e-08],"17408":[2.0455890000000001e-05,2.1577e-05],"1472":[1.7001500000000001e-06,1.7587399999999998e-06],"112":[1.5130000000000001e-07,1.5531999999999999e-07],"1376256":[0.0017992386000000003,0.001929828],"5242880":[0.0072305309999999984,0.0072346419999999995],"36":[6.6390000000000001e-08,6.9479999999999997e-08],"42":[7.2740000000000002e-08,7.6119999999999996e-08],"11534336":[0.016006027999999999,0.016043980999999999],"114688":[0.00012887699999999998,0.000136604],"144":[1.8938000000000002e-07,1.9635999999999999e-07],"38":[6.828e-08,7.1459999999999993e-08],"240":[2.9344000000000001e-07,3.2218000000000004e-07],"9216":[1.03828e-05,1.1424569999999999e-05],"44":[7.4950000000000006e-08,7.8460000000000002e-08],"1664":[1.91562e-06,1.97966e-06],"196608":[0.00023176300000000001,0.00024399799999999999],"155648":[0.00017546100000000002,0.00019334577999999999],"2816":[3.1996299999999998e-06,3.47869e-06],"50":[8.1629999999999997e-08,8.2860000000000002e-08],"2359296":[0.0032325216666666662,0.0032661650000000001],"46":[7.7849999999999986e-08,8.1530000000000003e-08],"176":[2.3230999999999999e-07,2.3474e-07],"52":[8.4519999999999992e-08,8.4570000000000009e-08],"272":[3.3327999999999998e-07,3.4425999999999999e-07],"116":[1.5508999999999999e-07,1.5511000000000002e-07],"47104":[5.5362000000000003e-05,5.6687999999999997e-05],"6912":[7.8882399999999995e-06,8.1491621621621615e-06],"1856":[2.13947e-06,2.14105e-06],"48":[7.952e-08,8.3210000000000002e-08],"2097152":[0.0028448203333333332,0.0029158700000000001],"54":[8.6190000000000006e-08,8.6420000000000002e-08],"2031616":[0.0026859919999999999,0.0027753579999999999],"43008":[4.8334000000000002e-05,5.7966014084507046e-05],"60":[9.2859999999999999e-08,9.2869999999999997e-08],"30720":[3.6226999999999997e-05,3.8586710000000002e-05],"56":[8.8300000000000003e-08,9.0189999999999989e-08],"62":[9.5029999999999998e-08,9.9410000000000001e-08],"58":[9.1189999999999998e-08,9.1200000000000009e-08],"3014656":[0.0041453004999999991,0.0041779629999999998],"64":[9.7909999999999995e-08,1.0243e-07],"8388608":[0.011791253,0.011970597499999999],"29696":[3.3504000000000003e-05,3.49026e-05],"216":[2.6665000000000002e-07,2.7908000000000003e-07],"106496":[0.0001192335,0.000130655],"72":[1.0627e-07,1.1116e-07],"442368":[0.00053245099999999997,0.00053738899999999999],"147456":[0.00017466399999999999,0.00018870250000000002],"4456448":[0.0062127280000000007,0.0063070550000000006],"63488":[7.584651e-05,7.8545000000000001e-05],"38912":[4.3900999999999999e-05,4.5649999999999998e-05],"68":[1.0165e-07,1.0759e-07],"188416":[0.00021359800000000001,0.00023862900000000002],"248":[3.0226000000000001e-07,3.1635e-07],"80":[1.2037000000000001e-07,1.2106999999999998e-07],"2560":[2.9182699999999997e-06,3.4420099999999997e-06],"34816":[4.0443263157894739e-05,4.6858940000000002e-05],"3712":[4.1882799999999996e-06,4.3762300000000001e-06],"3538944":[0.004868804,0.0049461469999999997],"76":[1.1122e-07,1.1640999999999999e-07],"4194304":[0.0057350710000000004,0.0058538150000000009],"851968":[0.0010634069999999999,0.001079523],"4096":[4.6532631578947371e-06,4.8652800000000001e-06],"59392":[6.9927999999999999e-05,7.1092000000000003e-05],"84":[1.1957e-07,1.2520000000000001e-07],"3276800":[0.0045029739999999999,0.0045643160000000006],"55296":[6.5046e-05,6.8527111111111105e-05],"688128":[0.00083090627272727291,0.00087496269999999998],"8192":[9.7564600000000011e-06,9.9017099999999994e-06],"10240":[1.1969689999999999e-05,1.2243090000000001e-05],"15872":[1.7815521739130436e-05,1.9437260000000002e-05],"92":[1.2837e-07,1.2837999999999999e-07],"26624":[2.9912000000000001e-05,3.2671549999999997e-05],"1792":[2.0714299999999997e-06,2.1298700000000002e-06],"11776":[1.3610490000000001e-05,1.437928e-05],"2944":[3.3424399999999998e-06,3.5145599999999999e-06],"88":[1.2457999999999999e-07,1.2970999999999999e-07],"22528":[2.5420000000000001e-05,2.7912089999999999e-05],"1245184":[0.0015713020000000001,0.0017297788000000009],"15728640":[0.0216178455,0.022581648500000003],"96":[1.3298000000000002e-07,1.3299999999999999e-07],"1984":[2.252153846153846e-06,2.29012e-06],"139264":[0.00016489400000000001,0.000173074],"475136":[0.00055882149999999999,0.00060322800000000014],"13631488":[0.018807446000000005,0.018895072500000002],"416":[4.9114999999999995e-07,5.0071794871794875e-07],"928":[1.0625e-06,1.1173999999999999e-06],"512":[6.1144999999999999e-07,6.6028999999999999e-07],"18432":[2.142322e-05,2.250294e-05],"16777216":[0.023725695999999963],"9728":[1.1120049999999999e-05,1.1146400000000001e-05],"1769472":[0.0023519420000000001,0.0023652626666666671],"1703936":[0.0022263259999999998,0.0023113327499999997],"2048":[2.3364262295081964e-06,2.34026e-06],"14336":[1.6108750000000001e-05,1.6897920000000001e-05],"448":[5.3304000000000007e-07,5.5153000000000002e-07],"5505024":[0.0075704499999999994,0.0076873949999999996],"544":[6.4646000000000003e-07,6.6352e-07],"221184":[0.00026183000000000006,0.00027078161764705893],"90112":[0.000106093,0.00011079591358024695],"640":[7.4094000000000002e-07,7.4397999999999997e-07],"12800":[1.4849839999999999e-05,1.561940625e-05],"262144":[0.00029716200000000001,0.00031605150000000004],"589824":[0.00066535200000000002,0.00078279200000000004],"884736":[0.0010905672857142857,0.0012542392857142859],"6144":[6.9252899999999997e-06,7.60127e-06],"1088":[1.2489e-06,1.3059000000000001e-06],"576":[6.8163000000000005e-07,7.0073999999999996e-07],"160":[2.0619e-07,2.1437999999999999e-07],"672":[7.8673999999999996e-07,7.8772000000000002e-07],"8912896":[0.0124920925,0.012567638500000001],"100":[1.3794e-07,1.4154000000000001e-07],"507904":[0.00061612837499999999,0.00066326316666666667],"3840":[4.3575299999999998e-06,4.5555599999999998e-06],"192":[2.3989999999999997e-07,2.4081e-07],"376832":[0.000450514,0.00047079338888888898],"98304":[0.000110962,0.000116218],"5376":[6.0554700000000003e-06,6.2775699999999994e-06],"94208":[0.000111031,0.000115177],"81920":[9.2312999999999995e-05,0.00010142],"3407872":[0.0046970889999999998,0.0049404459999999994],"104":[1.4172e-07,1.4177e-07],"122880":[0.00014574500000000002,0.00015175392307692305],"200":[2.487e-07,2.5167999999999999e-07],"163840":[0.00020151457446808516,0.000203993],"4063232":[0.0056484630000000003,0.0059577410000000008],"5767168":[0.007888054000000002,0.0082179490000000004],"12582912":[0.0176297695,0.017842427000000001],"1600":[1.8476199999999998e-06,1.90447e-06],"136":[1.8103e-07,1.8638000000000001e-07],"232":[2.8505999999999999e-07,2.8588000000000002e-07],"7077888":[0.0097438250000000011,0.010197841000000001],"86016":[9.61935e-05,0.00010581375],"31744":[3.6942459999999998e-05,4.1493199999999998e-05],"168":[2.145e-07,2.2308000000000001e-07],"622592":[0.00072441999999999993,0.00081523927272727278],"108":[1.4629e-07,1.4634e-07],"327680":[0.00038867800000000005,0.00040925662500000004],"2176":[2.4784600000000002e-06,2.5902199999999999e-06],"3328":[3.8058599999999996e-06,3.9362592592592595e-06],"1":[1.8320000000000001e-08,1.9160000000000001e-08],"2":[1.92e-08,1.92e-08],"3":[1.9870000000000002e-08,1.9870000000000002e-08],"4":[2.0750000000000001e-08,2.0770000000000003e-08],"7424":[8.3856800000000003e-06,8.4705499999999997e-06],"5":[2.1430000000000001e-08,2.1430000000000001e-08],"23552":[2.6410999999999998e-05,2.8784549999999999e-05],"6":[2.2309999999999999e-08,2.3360000000000002e-08],"61440":[7.1828000000000004e-05,7.2819999999999997e-05],"491520":[0.00059679712500000008,0.00060546499999999991],"77824":[9.315541e-05,0.00010207495121951221],"7":[2.2979999999999998e-08,2.2979999999999998e-08],"8":[2.367e-08,2.4979999999999999e-08],"208":[2.6061e-07,2.6286000000000001e-07],"9":[2.4600000000000002e-08,2.5730000000000003e-08],"73728":[8.7068833333333329e-05,0.00010196699999999998],"304":[3.8359000000000001e-07,4.0639000000000003e-07],"400":[4.8276999999999997e-07,5.1813000000000005e-07],"1310720":[0.0016586388000000001,0.0019209784],"336":[4.0227000000000001e-07,4.2095999999999998e-07],"3670016":[0.005001709,0.0051773979999999997],"6656":[7.6454899999999992e-06,7.9720799999999997e-06],"15360":[1.8053608695652172e-05,1.8111570000000003e-05],"432":[5.1519e-07,5.1526999999999998e-07],"950272":[0.001213556,0.0012782748571428572],"655360":[0.00080598809090909101,0.00082727600000000005],"69632":[8.2026705882352939e-05,8.6333000000000002e-05],"11264":[1.2664366666666667e-05,1.375636e-05],"2752512":[0.003784702,0.0040664135000000002],"8126464":[0.0111738275,0.0112997655],"27648":[3.099e-05,3.4010731707317073e-05],"368":[4.3581999999999999e-07,4.4258000000000004e-07],"65536":[7.7335000000000004e-05,8.0681079999999987e-05],"16252928":[0.023058687000000001],"464":[5.5201999999999999e-07,5.7089000000000005e-07],"1015808":[0.0012705632857142857,0.0013227163333333334],"3072":[3.4718900000000003e-06,3.48578e-06],"110592":[0.000123635,0.00012981633333333337],"237568":[0.000292823,0.00030125075862068957],"278528":[0.00031633100000000004,0.00034758400000000001],"496":[5.8882999999999996e-07,6.0940000000000004e-07],"13107200":[0.018232432,0.018990140999999999],"9961472":[0.0137318145,0.013927519999999999],"5888":[6.63724e-06,6.8880199999999997e-06],"11010048":[0.015250043499999999,0.015362069000000001],"1920":[2.1798299999999998e-06,2.18726e-06],"2490368":[0.0033871645,0.0037487485000000003],"19456":[2.2022e-05,2.3964999999999998e-05],"57344":[6.7564282608695661e-05,6.9989609999999999e-05],"1179648":[0.0014786633333333332,0.0016925992],"4718592":[0.0065495200000000005,0.0068240390000000014],"360448":[0.000411698,0.00042170949999999988],"1572864":[0.00210496975,0.0021194079999999997],"53248":[6.3963789999999998e-05,6.7870129999999995e-05],"3456":[3.9175799999999999e-06,4.1000499999999998e-06],"40960":[4.6186999999999997e-05,5.0524970000000006e-05],"4608":[5.1970800000000001e-06,5.4388999999999997e-06],"13824":[1.6077380000000002e-05,1.6995510000000001e-05],"819200":[0.00099608612499999969,0.001116233125],"983040":[0.001209676142857143,0.0013346639999999997],"8704":[1.0183690000000001e-05,1.0756999999999999e-05],"120":[1.5968000000000001e-07,1.6089999999999999e-07],"1024":[1.17603e-06,1.2295499999999999e-06],"49152":[5.7828000000000003e-05,6.0883e-05],"524288":[0.00060310699999999997,0.00063714626666666661],"45056":[5.0383999999999997e-05,5.0504999999999998e-05],"229376":[0.00028495299999999995,0.00029369254545454548],"2688":[3.0538899999999998e-06,3.2062600000000003e-06],"152":[1.9817999999999999e-07,2.0428000000000003e-07],"5120":[5.7847400000000001e-06,6.3425899999999994e-06],"1507328":[0.0019986552499999997,0.002248253],"1216":[1.39111e-06,1.4040100000000001e-06],"1966080":[0.0026651043333333329,0.0027856956666666667],"1900544":[0.0025473900000000005,0.0025906086666666662],"184":[2.3155999999999999e-07,2.3302e-07],"7936":[9.1423700000000004e-06,9.4420200000000001e-06],"3801088":[0.005137959000000001,0.0052230240000000006],"6815744":[0.0095153120000000015,0.0096909639999999998],"124":[1.6467e-07,1.7240999999999999e-07],"102400":[0.00012198202564102565,0.00012630763636363636],"311296":[0.00038075731999999998,0.00038510744000000001],"1408":[1.6022599999999998e-06,1.6312100000000002e-06],"393216":[0.00045790150000000004,0.000484699],"4352":[4.9199000000000001e-06,5.08141e-06],"6553600":[0.0091005119999999981,0.0094333690000000005],"20480":[2.2947555555555558e-05,2.3618999999999999e-05],"608":[7.1550000000000007e-07,7.8243e-07],"2228224":[0.0030288479999999998,0.0031176003333333335],"36864":[4.2952770000000004e-05,4.5491790000000003e-05],"704":[8.1438000000000007e-07,8.2542999999999995e-07],"720896":[0.00084642300000000001,0.00090357999999999986],"800":[9.1977000000000009e-07,9.3625000000000004e-07],"2621440":[0.0035639315,0.0036482985000000001],"425984":[0.00050411599999999998,0.0005223193333333333],"32768":[3.8720000000000002e-05,3.9405539999999997e-05],"12058624":[0.016464251499999995,0.016988415],"128":[1.6937000000000001e-07,1.8491000000000001e-07],"180224":[0.000212501,0.000227541],"224":[2.7548000000000003e-07,2.7758000000000003e-07],"736":[8.5161999999999995e-07,8.5186999999999996e-07],"320":[3.8235000000000003e-07,4.0145000000000004e-07],"557056":[0.00064394400000000003,0.00077835899999999984],"832":[9.5713999999999995e-07,9.5791999999999988e-07],"9437184":[0.013459752,0.013555883500000001],"3584":[4.0654899999999996e-06,4.0811900000000001e-06],"6291456":[0.0088404239999999995,0.0090536760000000001],"256":[3.1463000000000001e-07,3.2635000000000001e-07],"15204352":[0.020825852999999998,0.021546356500000002],"28672":[3.3743190000000005e-05,3.5288461538461541e-05],"768":[8.9392000000000005e-07,9.0172e-07],"212992":[0.00024036700000000007,0.00027197748484848484],"864":[1.01266e-06,1.0433100000000001e-06],"352":[4.2432999999999999e-07,4.3810000000000004e-07],"253952":[0.00031402099999999999,0.00031439287096774197],"960":[1.1105800000000001e-06,1.1527e-06],"24576":[2.9026999999999998e-05,3.0528070000000001e-05],"7680":[8.8320200000000009e-06,1.0234610000000001e-05],"294912":[0.00036067407999999996,0.00036269300000000003],"1048576":[0.001241909,0.0014718843333333333],"10485760":[0.015001513999999999,0.015835821],"344064":[0.00042574140909090914,0.00043397934999999993],"288":[3.5070999999999994e-07,3.6300000000000001e-07],"1152":[1.3290599999999999e-06,1.33475e-06],"384":[4.5634999999999998e-07,4.6044999999999997e-07],"2304":[2.6213499999999999e-06,2.7331900000000001e-06],"896":[1.0294100000000001e-06,1.07795e-06],"480":[5.6857999999999992e-07,5.9070999999999997e-07],"1441792":[0.0018558848,0.0020688614999999997],"992":[1.15033e-06,1.19059e-06],"3968":[4.5093400000000004e-06,4.8939899999999994e-06],"6400":[7.4742899999999999e-06,7.5499400000000006e-06],"1344":[1.5341899999999998e-06,1.54397e-06],"126976":[0.00014898960000000002,0.00015829534999999999],"2883584":[0.0040507525000000001,0.0040868120000000004],"753664":[0.00092101430000000005,0.00093531199999999999],"16384":[1.9397000000000001e-05,2.0755589999999998e-05],"131072":[0.000162313,0.00017724090566037734],"458752":[0.00055268247058823513,0.00056753625000000008],"172032":[0.00020658006521739135,0.0002154325],"12288":[1.393e-05,1.514893e-05],"14680064":[0.020116537,0.021083524500000003],"1536":[1.76506e-06,1.8407400000000001e-06],"25600":[2.8829000000000001e-05,3.09426875e-05],"1835008":[0.0024456035000000004,0.0024550399999999999],"10752":[1.249217e-05,1.2668040000000001e-05],"21504":[2.533e-05,2.558912e-05],"7602176":[0.010415198000000001,0.0106397695],"5632":[6.3467900000000001e-06,6.6457799999999994e-06],"10":[2.5480000000000001e-08,2.5480000000000001e-08],"3145728":[0.0042625199999999997,0.0043887304999999993],"245760":[0.00029426846875000001,0.00029474900000000007],"1728":[1.99207e-06,2.0742599999999999e-06],"11":[2.648e-08,2.681e-08],"1114112":[0.001415721,0.0015734065],"12":[2.7949999999999999e-08,2.805e-08],"7340032":[0.009716822,0.010056490999999997],"7168":[8.44733e-06,8.5786499999999996e-06],"13":[2.9050000000000002e-08,2.9050000000000002e-08],"6029312":[0.0081160670000000011,0.0084600839999999979],"14":[3.0960000000000001e-08,3.0969999999999999e-08],"3200":[3.6512699999999997e-06,3.8387299999999998e-06],"20":[4.7690000000000006e-08,4.9910000000000002e-08],"204800":[0.0002429675,0.00025043061538461539],"15":[3.1489999999999999e-08,3.4550000000000002e-08],"13312":[1.5386520000000001e-05,1.6409829999999999e-05],"4980736":[0.0068106649999999979,0.0068365540000000016],"118784":[0.000140808,0.00014720800000000002],"51200":[5.9791637931034478e-05,6.3862999999999995e-05],"16":[4.1229999999999999e-08,4.269e-08],"21":[4.8570000000000004e-08,5.0839999999999997e-08],"917504":[0.001155230625,0.0011937739999999999],"22":[4.9719999999999998e-08,5.1989999999999998e-08],"4864":[5.4920900000000005e-06,5.9171999999999999e-06],"17":[4.2669999999999998e-08,4.454e-08],"14848":[1.7254830000000002e-05,1.8147989999999999e-05],"23":[5.0799999999999998e-08,5.3159999999999994e-08],"786432":[0.00095719799999999992,0.00095992655555555593],"18":[4.7430000000000002e-08,5.0590000000000005e-08],"1638400":[0.00218585575,0.0023468255],"7864320":[0.01086283,0.01121694],"24":[5.1900000000000002e-08,5.7030000000000002e-08],"14155776":[0.019836257,0.045346300999999992],"19":[4.908e-08,5.1429999999999998e-08],"30":[5.7450000000000002e-08,5.7470000000000004e-08],"25":[5.0900000000000006e-08,5.0969999999999999e-08],"31":[5.791e-08,6.1890000000000007e-08],"1280":[1.4602100000000001e-06,1.4603500000000001e-06],"26":[5.2460000000000001e-08,5.2889999999999999e-08],"3932160":[0.0054968380000000004,0.0055444719999999999],"2432":[2.7703800000000001e-06,3.0221099999999997e-06],"32":[5.9159999999999995e-08,6.3500000000000006e-08],"27":[5.2410000000000004e-08,5.4670000000000006e-08],"409600":[0.00048579999999999994,0.00049476764705882353]}},{"title":"OrderedDictionary.Values sequential iteration","results":{"28":[6.5089999999999996e-08,6.5100000000000007e-08],"34":[7.4690000000000002e-08,7.8209999999999997e-08],"29":[6.6119999999999999e-08,6.9210000000000009e-08],"40":[8.1339999999999999e-08,8.748e-08],"17408":[2.0386459999999999e-05,2.0528999999999999e-05],"1472":[1.68813e-06,1.76558e-06],"112":[1.6157999999999999e-07,1.6923000000000001e-07],"1376256":[0.0018173026000000002,0.0018697516],"5242880":[0.0071952500000000003,0.0072458760000000001],"36":[7.6920000000000003e-08,8.0509999999999998e-08],"42":[8.357e-08,8.7329999999999989e-08],"11534336":[0.015748353,0.015934428],"114688":[0.00013260799999999999,0.00013277888888888885],"144":[2.0064e-07,2.0655000000000001e-07],"38":[7.9149999999999991e-08,8.2840000000000006e-08],"240":[3.0479000000000002e-07,3.1959999999999998e-07],"9216":[1.0538e-05,1.1451549999999999e-05],"44":[8.5790000000000003e-08,9.0319999999999991e-08],"1664":[1.9013600000000001e-06,1.9864500000000003e-06],"196608":[0.000222117,0.00024056416666666663],"155648":[0.000180896,0.00019179249999999999],"2816":[3.1921400000000002e-06,3.1967600000000002e-06],"50":[9.2760000000000005e-08,9.3079999999999997e-08],"2359296":[0.003231004,0.0032335529999999993],"46":[8.8359999999999992e-08,9.2180000000000009e-08],"176":[2.3298999999999997e-07,2.4467000000000003e-07],"52":[9.4690000000000009e-08,9.4720000000000004e-08],"272":[3.4388999999999999e-07,3.5568000000000002e-07],"116":[1.6602e-07,1.6602e-07],"47104":[5.5388184210526321e-05,5.9332070000000005e-05],"6912":[7.943e-06,8.1547199999999997e-06],"1856":[2.1119099999999999e-06,2.1161500000000001e-06],"48":[9.0310000000000006e-08,9.4499999999999993e-08],"2097152":[0.0028471633333333338,0.0028956616666666662],"54":[9.6940000000000006e-08,9.6989999999999997e-08],"2031616":[0.002639726666666667,0.0027735799999999999],"43008":[5.2626349999999998e-05,5.9742130000000001e-05],"60":[1.0363000000000001e-07,1.0366999999999999e-07],"30720":[3.4477000000000002e-05,3.8338170000000003e-05],"56":[9.9250000000000005e-08,9.932999999999999e-08],"62":[1.0614000000000001e-07,1.1110999999999999e-07],"58":[1.0139999999999999e-07,1.0146000000000001e-07],"3014656":[0.0041769440000000001,0.0041980919999999996],"64":[1.0809e-07,1.1325000000000001e-07],"8388608":[0.011515916999999997,0.011794489],"29696":[3.5104812500000001e-05,3.5126409999999997e-05],"216":[2.7744999999999999e-07,2.7810999999999999e-07],"106496":[0.000120881,0.000131187],"72":[1.1691999999999999e-07,1.2242000000000001e-07],"442368":[0.00052616099999999982,0.00053886800000000018],"147456":[0.000179412,0.00018242699999999998],"4456448":[0.0062272020000000003,0.0062417819999999995],"63488":[7.1711999999999994e-05,7.6353999999999994e-05],"38912":[4.3664142857142857e-05,4.78046e-05],"68":[1.1253999999999999e-07,1.1794999999999999e-07],"188416":[0.000229108,0.00023232866666666671],"248":[3.1343000000000002e-07,3.2813000000000001e-07],"80":[1.3176000000000001e-07,1.3176000000000001e-07],"2560":[2.9072599999999998e-06,3.1866799999999998e-06],"34816":[3.9103000000000002e-05,4.610655e-05],"3712":[4.1968299999999998e-06,4.2012100000000004e-06],"3538944":[0.0048838625000000007,0.0049690680000000001],"76":[1.2134e-07,1.2919999999999999e-07],"4194304":[0.0058087970000000001,0.0059252009999999997],"851968":[0.0010634660000000001,0.0011744519999999999],"4096":[4.6362699999999996e-06,4.8595900000000002e-06],"59392":[6.6921999999999994e-05,7.5332859999999996e-05],"84":[1.3035e-07,1.3647e-07],"3276800":[0.0045202270000000008,0.0045309759999999999],"55296":[6.6060600000000002e-05,6.8214999999999997e-05],"688128":[0.00077220700000000001,0.00085375181818181844],"8192":[9.4700400000000002e-06,1.0104650000000002e-05],"10240":[1.158275e-05,1.188679e-05],"15872":[1.8671055555555556e-05,1.9465019999999999e-05],"92":[1.392e-07,1.3923999999999999e-07],"26624":[3.1346000000000001e-05,3.1464999999999998e-05],"1792":[2.0452400000000002e-06,2.1361199999999999e-06],"11776":[1.3332e-05,1.4073000000000001e-05],"2944":[3.33344e-06,3.3414899999999998e-06],"88":[1.3479e-07,1.4097999999999998e-07],"22528":[2.6472999999999999e-05,2.6495666666666668e-05],"1245184":[0.0015909027999999998,0.0017564840000000009],"15728640":[0.021641341000000005,0.022228206500000007],"96":[1.4368e-07,1.4375999999999998e-07],"1984":[2.2552800000000001e-06,2.2593300000000001e-06],"139264":[0.00016394775000000005,0.00017250095918367342],"475136":[0.00055889300000000009,0.00060083033333333349],"13631488":[0.018703716999999998,0.018966820000000002],"416":[5.0294999999999999e-07,5.0457000000000002e-07],"928":[1.0726300000000001e-06,1.12131e-06],"512":[6.1375000000000005e-07,6.3763999999999998e-07],"18432":[2.1854000000000001e-05,2.2725e-05],"16777216":[0.023755903500000002],"9728":[1.1100999999999999e-05,1.1461189999999999e-05],"1769472":[0.0023068110000000002,0.0024378760000000003],"1703936":[0.0022823825000000001,0.0023146629999999994],"2048":[2.3273999999999999e-06,2.3283900000000002e-06],"14336":[1.6665630000000001e-05,1.7121190000000001e-05],"448":[5.4005999999999998e-07,5.6069999999999998e-07],"5505024":[0.007501624000000001,0.0075783199999999995],"544":[6.4949000000000003e-07,6.7224000000000004e-07],"221184":[0.00025216599999999996,0.00026954011764705889],"90112":[0.00010639799999999999,0.000106745],"640":[7.4998e-07,7.5537000000000002e-07],"12800":[1.4446e-05,1.5764980000000001e-05],"262144":[0.00029548699999999993,0.00032139940000000002],"589824":[0.00071009545454545477,0.00077454066666666653],"884736":[0.001061532,0.0012025038571428569],"6144":[6.9577400000000006e-06,7.4232499999999996e-06],"1088":[1.2564900000000001e-06,1.3120600000000001e-06],"576":[6.8325999999999994e-07,7.1024000000000004e-07],"160":[2.1633000000000001e-07,2.2501e-07],"672":[7.8814999999999992e-07,7.8986999999999997e-07],"8912896":[0.012335153499999999,0.012819261],"100":[1.4826000000000001e-07,1.5048000000000001e-07],"507904":[0.00058260300000000011,0.00067653546153846166],"3840":[4.34465e-06,4.6934900000000002e-06],"192":[2.5088000000000003e-07,2.5460000000000002e-07],"376832":[0.0004449085,0.00047992152631578936],"98304":[0.00011587299999999999,0.000116334],"5376":[6.0643800000000002e-06,6.1920499999999994e-06],"94208":[0.000111094,0.00011347999999999998],"81920":[0.00010065684693877555,0.00010401161842105267],"3407872":[0.004698654,0.0048002209999999995],"104":[1.5294999999999998e-07,1.5398000000000001e-07],"122880":[0.00014434999999999999,0.00014643500000000002],"200":[2.5998000000000003e-07,2.6187e-07],"163840":[0.00019965579999999997,0.00020249174999999999],"4063232":[0.0055461449999999989,0.0055765740000000008],"5767168":[0.0080073910000000043,0.0080424759999999981],"12582912":[0.017315328999999997,0.017807083000000001],"1600":[1.8310999999999999e-06,1.9099699999999999e-06],"136":[1.9049000000000001e-07,1.9847e-07],"232":[2.9528999999999999e-07,2.9618e-07],"7077888":[0.0098270184999999996,0.010186465],"86016":[0.00010251859574468081,0.000105818],"31744":[3.5608999999999997e-05,3.9077527777777772e-05],"168":[2.2517000000000002e-07,2.3438000000000001e-07],"622592":[0.00076844975000000008,0.00083337099999999996],"108":[1.5713e-07,1.5718999999999999e-07],"327680":[0.000387539,0.00041080066666666665],"2176":[2.4726099999999997e-06,2.5944000000000001e-06],"3328":[3.7641399999999999e-06,3.9434000000000002e-06],"1":[3.0969999999999999e-08,3.2420000000000002e-08],"2":[3.1860000000000002e-08,3.187e-08],"3":[3.2749999999999999e-08,3.2760000000000004e-08],"4":[3.3640000000000002e-08,3.3640000000000002e-08],"7424":[8.4041904761904771e-06,9.2064200000000002e-06],"5":[3.4200000000000002e-08,3.4240000000000001e-08],"23552":[2.7654e-05,2.8833700000000001e-05],"6":[3.3990000000000002e-08,3.4259999999999997e-08],"61440":[7.2716e-05,7.714555555555556e-05],"491520":[0.00059479543750000038,0.00061122500000000007],"77824":[8.7235400000000002e-05,9.9334210526315789e-05],"7":[3.4329999999999997e-08,3.477e-08],"8":[3.6569999999999996e-08,3.7779999999999998e-08],"208":[2.7109999999999999e-07,2.7126000000000001e-07],"9":[3.6720000000000001e-08,3.8579999999999999e-08],"73728":[8.9804799999999998e-05,0.00010529572413793102],"304":[3.7713000000000004e-07,3.9292999999999996e-07],"400":[4.8582999999999995e-07,4.8687000000000007e-07],"1310720":[0.0016788225999999999,0.0018637930000000001],"336":[4.1228999999999999e-07,4.3436000000000003e-07],"3670016":[0.0049307509999999988,0.0050389849999999993],"6656":[7.5396499999999999e-06,7.54424e-06],"15360":[1.8047390000000002e-05,1.8119000000000001e-05],"432":[5.1931999999999997e-07,5.2253000000000006e-07],"950272":[0.0011542367142857142,0.0012608491428571429],"655360":[0.0007666960000000002,0.00086586379999999998],"69632":[8.1750999999999997e-05,8.3551649999999991e-05],"11264":[1.2661285714285714e-05,1.367449e-05],"2752512":[0.0038428909999999998,0.0039002999999999998],"8126464":[0.011197887,0.011682373000000001],"27648":[3.1296e-05,3.4928190000000001e-05],"368":[4.4694e-07,4.5186999999999998e-07],"65536":[7.6468730769230773e-05,8.0555238095238096e-05],"16252928":[0.022770494999999998],"464":[5.5812999999999998e-07,5.8427999999999994e-07],"1015808":[0.00126833,0.001290212],"3072":[3.4803900000000003e-06,3.6313699999999997e-06],"110592":[0.00012670300000000001,0.0001346694305555555],"237568":[0.00028783917241379306,0.00028860399999999998],"278528":[0.00033969332142857144,0.00034287666666666674],"496":[5.9456000000000005e-07,6.1936000000000001e-07],"13107200":[0.018120535,0.0186277605],"9961472":[0.013764692,0.014006506],"5888":[6.6431875000000002e-06,6.9688400000000003e-06],"11010048":[0.015069348999999996,0.0164652975],"1920":[2.18318e-06,2.1879400000000001e-06],"2490368":[0.00338537,0.0033982450000000003],"19456":[2.3562439999999999e-05,2.398469e-05],"57344":[6.7737000000000006e-05,6.7941000000000006e-05],"1179648":[0.001440537,0.001573912],"4718592":[0.006582234000000001,0.006857564],"360448":[0.00042917200000000007,0.00043049500000000003],"1572864":[0.0020867712500000002,0.0021821647500000004],"53248":[5.9653333333333334e-05,6.1945199999999991e-05],"3456":[3.9116900000000003e-06,4.2339999999999996e-06],"40960":[4.9024270000000002e-05,5.0476170000000001e-05],"4608":[5.2356899999999998e-06,5.3378900000000003e-06],"13824":[1.6010140000000001e-05,1.6478e-05],"819200":[0.0010151345,0.001092462],"983040":[0.001209393,0.0013811361666666664],"8704":[1.0043540000000001e-05,1.0247666666666667e-05],"120":[1.7044999999999999e-07,1.7044999999999999e-07],"1024":[1.18156e-06,1.2379700000000001e-06],"49152":[5.8025000000000001e-05,6.0034709999999997e-05],"524288":[0.00064266978571428574,0.00064758800000000037],"45056":[5.0584000000000002e-05,5.2868000000000003e-05],"229376":[0.00027023300000000004,0.00027987650000000004],"2688":[3.0479800000000002e-06,3.1868899999999997e-06],"152":[2.0832999999999999e-07,2.1603000000000001e-07],"5120":[5.7959099999999997e-06,6.0583333333333335e-06],"1507328":[0.0019896895,0.0021670700000000005],"1216":[1.3948300000000002e-06,1.39816e-06],"1966080":[0.0025910720000000007,0.0027165459999999994],"1900544":[0.0025733410000000011,0.0026116176666666669],"184":[2.4209999999999998e-07,2.4357e-07],"7936":[9.03993e-06,9.1876800000000004e-06],"3801088":[0.0051369650000000003,0.0053321600000000007],"6815744":[0.0092775420000000015,0.009788326],"124":[1.7669999999999999e-07,1.8306e-07],"102400":[0.000123447,0.00012653265714285714],"311296":[0.00036316999999999995,0.0003717495],"1408":[1.6133099999999999e-06,1.6152500000000001e-06],"393216":[0.00046384300000000008,0.0005031844999999999],"4352":[4.9375700000000004e-06,4.9407900000000003e-06],"6553600":[0.0091506780000000006,0.0097998169999999989],"20480":[2.3927400000000001e-05,2.529992e-05],"608":[7.1575000000000009e-07,7.8837000000000006e-07],"2228224":[0.0030355783333333337,0.0031208626666666666],"36864":[4.1319000000000002e-05,4.5265000000000001e-05],"704":[8.2394999999999996e-07,8.2613e-07],"720896":[0.00088075566666666674,0.00091785200000000003],"800":[9.2905000000000002e-07,9.3072000000000006e-07],"2621440":[0.0035439810000000003,0.0037246279999999998],"425984":[0.000497844,0.00052407849999999993],"32768":[3.6927000000000001e-05,4.0073839999999998e-05],"12058624":[0.016401283999999999,0.016683359500000005],"128":[1.8066e-07,1.8946e-07],"180224":[0.00020313900000000002,0.00021978049999999997],"224":[2.8640000000000002e-07,2.8691000000000002e-07],"736":[8.9744000000000002e-07,9.0030000000000009e-07],"320":[3.9379999999999999e-07,4.1403000000000001e-07],"557056":[0.00066385399999999996,0.00071686600000000025],"832":[9.6983e-07,1.0120199999999999e-06],"9437184":[0.012909656,0.01335012],"3584":[4.0491599999999999e-06,4.05047e-06],"6291456":[0.0085967319999999993,0.0089649530000000012],"256":[3.2625e-07,3.4060999999999998e-07],"15204352":[0.020530021000000002,0.020798893999999998],"28672":[3.3220609999999999e-05,3.660791e-05],"768":[8.9688999999999998e-07,9.3815999999999993e-07],"212992":[0.00025205700000000008,0.000262945],"864":[1.0041000000000001e-06,1.10078e-06],"352":[4.334e-07,4.4929000000000002e-07],"253952":[0.00030452409999999995,0.00031223999999999998],"960":[1.1113000000000001e-06,1.16308e-06],"24576":[2.9085909999999999e-05,2.9715610000000001e-05],"7680":[8.6402307692307699e-06,1.0214820000000001e-05],"294912":[0.00035372710714285706,0.00037373809523809517],"1048576":[0.0012961579999999997,0.0013872363333333336],"10485760":[0.014310649,0.014712683000000001],"344064":[0.00039966600000000002,0.00043575610526315792],"288":[3.6186000000000004e-07,3.7435999999999997e-07],"1152":[1.32397e-06,1.3300800000000001e-06],"384":[4.6482e-07,4.6575e-07],"2304":[2.6190799999999999e-06,2.73977e-06],"896":[1.03657e-06,1.08444e-06],"480":[5.7558999999999998e-07,5.9844999999999996e-07],"1441792":[0.0018739336000000001,0.002045654],"992":[1.1473799999999999e-06,1.19806e-06],"3968":[4.4950600000000001e-06,4.92347e-06],"6400":[7.2259999999999999e-06,7.5820800000000001e-06],"1344":[1.5377199999999998e-06,1.5384599999999999e-06],"126976":[0.000150051,0.00015208336507936503],"2883584":[0.0039990759999999998,0.00420113],"753664":[0.00088555600000000002,0.0010484214444444443],"16384":[1.9067080000000001e-05,2.0208666666666665e-05],"131072":[0.00016171759999999996,0.00016176866666666671],"458752":[0.00054068049999999993,0.00061178749999999987],"172032":[0.000203031,0.00020624825],"12288":[1.3826500000000001e-05,1.5356e-05],"14680064":[0.020061270999999999,0.020775497],"1536":[1.75524e-06,1.83856e-06],"25600":[3.0125999999999999e-05,3.1050339999999999e-05],"1835008":[0.0023439100000000003,0.0023582580000000002],"10752":[1.216e-05,1.2559909999999999e-05],"21504":[2.5049059999999998e-05,2.64360625e-05],"7602176":[0.010553507,0.010735964000000001],"5632":[6.3484500000000002e-06,6.8614900000000004e-06],"10":[3.7669999999999999e-08,3.7680000000000004e-08],"3145728":[0.0042769884999999995,0.0043518580000000001],"245760":[0.00029188950000000005,0.000293632],"1728":[1.9738999999999999e-06,2.0610400000000001e-06],"11":[3.8439999999999999e-08,3.861e-08],"1114112":[0.0014581268333333337,0.001550011666666667],"12":[3.9639999999999996e-08,3.9670000000000004e-08],"7340032":[0.0097385135000000005,0.010125832],"7168":[8.0686799999999998e-06,8.8910400000000012e-06],"13":[4.0429999999999999e-08,4.0439999999999997e-08],"6029312":[0.008286433000000001,0.008304851999999998],"14":[4.0630000000000001e-08,4.1600000000000002e-08],"3200":[3.6206900000000001e-06,3.78691e-06],"20":[5.6080000000000003e-08,5.8730000000000004e-08],"204800":[0.00024623327027027025,0.00024880036363636351],"15":[4.2660000000000006e-08,4.9719999999999998e-08],"13312":[1.5039307692307691e-05,1.5903e-05],"4980736":[0.0068163550000000014,0.0068955910000000013],"118784":[0.00014065600000000002,0.00014365958208955223],"51200":[5.7603999999999999e-05,6.8087099999999994e-05],"16":[5.1749999999999997e-08,5.3310000000000006e-08],"21":[5.7270000000000003e-08,5.9610000000000002e-08],"917504":[0.001085225,0.0012499991428571431],"22":[5.8420000000000003e-08,6.1140000000000004e-08],"4864":[5.4869399999999993e-06,5.77619e-06],"17":[5.2759999999999997e-08,5.4589999999999995e-08],"14848":[1.6741000000000001e-05,1.8241659999999999e-05],"23":[5.9440000000000002e-08,6.2380000000000007e-08],"786432":[0.00091727999999999981,0.0010151548749999999],"18":[5.3909999999999998e-08,5.641e-08],"1638400":[0.0021651032500000006,0.002252212],"7864320":[0.010852326000000001,0.011620716],"24":[6.0520000000000002e-08,6.6429999999999993e-08],"14155776":[0.0192519045,0.034365438000000005],"19":[5.5019999999999999e-08,5.7590000000000002e-08],"30":[6.7200000000000006e-08,6.7209999999999991e-08],"25":[6.1700000000000003e-08,6.779e-08],"31":[6.8379999999999994e-08,7.1620000000000002e-08],"1280":[1.4668099999999999e-06,1.4694099999999999e-06],"26":[6.2809999999999991e-08,6.2830000000000001e-08],"3932160":[0.0053828599999999989,0.005452603000000002],"2432":[2.88537e-06,3.0348799999999998e-06],"32":[6.9489999999999996e-08,7.6290000000000004e-08],"27":[6.3899999999999996e-08,6.3959999999999998e-08],"409600":[0.00047363049999999996,0.00050078199999999996]}},{"title":"OrderedDictionary subscript, unsuccessful lookups","results":{"28":[5.2264999999999998e-07,6.1867999999999998e-07],"34":[7.1646e-07,7.3701999999999991e-07],"29":[5.7316999999999999e-07,6.158e-07],"40":[9.6927e-07,1.1003000000000001e-06],"17408":[0.00060673900000000002,0.00071525123076923074],"1472":[7.0029259999999994e-05,8.0035047619047623e-05],"112":[2.2512600000000001e-06,2.41174e-06],"1376256":[0.22406675200000001,0.32036371600000002],"5242880":[1.2371222365000001,1.2408258829999999],"36":[8.0086999999999994e-07,9.4908999999999998e-07],"42":[1.0593499999999999e-06,1.5910600000000001e-06],"11534336":[3.5615710405000001,3.6108987694999999],"114688":[0.004496677000000001,0.0045396840000000004],"144":[3.3100200000000002e-06,3.56214e-06],"38":[8.6095999999999995e-07,8.9594000000000001e-07],"240":[5.3268999999999998e-06,5.8764699999999992e-06],"9216":[0.00034980953571428573,0.00038376999999999997],"44":[1.2212400000000001e-06,1.4190300000000001e-06],"1664":[3.9944999999999998e-05,4.3024576923076925e-05],"196608":[0.0205794485,0.020704965999999998],"155648":[0.0086707959999999997,0.0088422889999999997],"2816":[0.0001376955,0.00013875101562499996],"50":[8.9794000000000006e-07,1.06111e-06],"2359296":[0.39105449199999998,0.43479510050000003],"46":[1.29558e-06,2.5269000000000003e-06],"176":[5.7745100000000002e-06,6.9806599999999997e-06],"52":[9.9689999999999993e-07,1.0511e-06],"272":[6.1449499999999995e-06,6.8734799999999998e-06],"116":[2.27958e-06,2.4926199999999998e-06],"47104":[0.0026899749999999998,0.0027395976666666666],"6912":[0.000198257,0.00021217599999999996],"1856":[5.1558289999999997e-05,5.3217609195402296e-05],"48":[1.5092299999999999e-06,1.7020899999999999e-06],"2097152":[0.29801632300000003,0.31304711699999999],"54":[1.06668e-06,1.15089e-06],"2031616":[0.27545675349999998,0.28265832000000002],"43008":[0.0019603120000000005,0.0020913000000000004],"60":[1.29001e-06,1.3392199999999999e-06],"30720":[0.00098244999999999995,0.0010387787777777775],"56":[1.0516199999999999e-06,1.20178e-06],"62":[1.3288399999999999e-06,1.46356e-06],"58":[1.1514795918367346e-06,1.29811e-06],"3014656":[0.86717158500000002,0.94806415150000001],"64":[1.28866e-06,1.51867e-06],"8388608":[1.5612333185,1.5622835099999999],"29696":[0.00094064490000000055,0.00095078769999999994],"216":[4.6112e-06,4.6842800000000005e-06],"106496":[0.0039453635000000001,0.0039684800000000008],"72":[1.69235e-06,1.88774e-06],"442368":[0.025176906500000002,0.025417374],"147456":[0.0083643579999999988,0.0084401839999999981],"4456448":[0.82161081299999994,0.92067230050000004],"63488":[0.0022716660000000003,0.0023876444999999997],"38912":[0.0015470480000000001,0.0016022365999999999],"68":[1.41424e-06,1.51476e-06],"188416":[0.018187988999999998,0.018313376999999999],"248":[5.2474099999999998e-06,5.70566e-06],"80":[2.5220199999999999e-06,2.6105100000000001e-06],"2560":[0.000104955,0.0001142165],"34816":[0.0012273970000000001,0.001300636],"3712":[0.000110865,0.00011523099999999999],"3538944":[0.53096943249999995,0.54025648699999995],"76":[1.9096400000000002e-06,2.0030499999999998e-06],"4194304":[0.71859703900000005,0.73711444500000001],"851968":[0.061076710000000013,0.102004935],"4096":[0.000130321,0.00014209299999999998],"59392":[0.0019457140000000001,0.0020915745000000003],"84":[2.4360099999999999e-06,2.6490100000000002e-06],"3276800":[0.45760641099999999,0.46691035400000003],"55296":[0.0017454379999999995,0.001852636],"688128":[0.06401589299999999,0.086649108500000044],"8192":[0.00027255299999999998,0.00029525349999999994],"10240":[0.00043503500000000012,0.000439393],"15872":[0.00053311500000000002,0.00055407899999999996],"92":[3.4206400000000002e-06,4.3242500000000001e-06],"26624":[0.00076920600000000003,0.00079586000000000001],"1792":[4.74185e-05,5.1394000000000003e-05],"11776":[0.00066430899999999986,0.00067290442857142866],"2944":[0.000150017640625,0.00015521321311475405],"88":[2.45217e-06,3.1026199999999999e-06],"22528":[0.0011432700000000001,0.0012190137142857143],"1245184":[0.159899495,0.234369886],"15728640":[2.9815204550000001,2.9967788565000002],"96":[3.1865000000000003e-06,3.37864e-06],"1984":[5.78545e-05,6.2773964912280709e-05],"139264":[0.0070140079999999995,0.0070506890000000006],"475136":[0.028076987500000001,0.036811257999999993],"13631488":[2.2620898130000002,2.3312418175],"416":[8.3482142857142851e-06,8.5845099999999996e-06],"928":[2.2232294117647056e-05,2.490529e-05],"512":[1.2681735294117647e-05,1.271857e-05],"18432":[0.00069140199999999982,0.00075256999999999993],"16777216":[3.2943499429999998],"9728":[0.000393788,0.00040436595833333343],"1769472":[0.21393762,0.21746143350000002],"1703936":[0.19461599399999999,0.21753678800000001],"2048":[5.9928333333333327e-05,6.5449000000000003e-05],"14336":[0.00045351157142857148,0.00046653800000000012],"448":[1.001481e-05,1.0787250000000001e-05],"5505024":[1.4432405290000001,1.45199517],"544":[1.509875e-05,1.5146090000000002e-05],"221184":[0.010086201,0.010202229],"90112":[0.0052593219999999994,0.0054459539999999985],"640":[2.0851499999999998e-05,2.1447400000000001e-05],"12800":[0.00036768799999999997,0.00038528291999999998],"262144":[0.0136967245,0.014257701000000003],"589824":[0.043183111500000017,0.0604136625],"884736":[0.071053380999999999,0.100688333],"6144":[0.00037640199999999996,0.00039781052173913038],"1088":[3.3684209999999999e-05,3.5929000000000001e-05],"576":[1.6340370000000002e-05,1.7101069999999999e-05],"160":[4.1226899999999997e-06,4.7335100000000004e-06],"672":[2.2824666666666665e-05,2.343996e-05],"8912896":[1.7649294129999999,1.773823253],"100":[1.86761e-06,1.92131e-06],"507904":[0.0304676805,0.057532002000000006],"3840":[0.000117528,0.000126131],"192":[6.2373188405797103e-06,1.0473259999999999e-05],"376832":[0.036315525500000001,0.040443822999999997],"98304":[0.0074149329999999986,0.0080893519999999993],"5376":[0.00024605799999999995,0.00026389400000000003],"94208":[0.0062772319999999989,0.0063295740000000001],"81920":[0.0039620695000000001,0.004108231999999999],"3407872":[0.48148004999999999,0.54000779450000003],"104":[1.9733899999999998e-06,2.117709090909091e-06],"122880":[0.0050408919999999999,0.0052627439999999989],"200":[4.0141799999999999e-06,4.0708699999999999e-06],"163840":[0.010077879,0.011178190500000001],"4063232":[0.67229011999999999,0.67735930700000002],"5767168":[1.6992547775,1.743732872],"12582912":[5.2130095409999999,5.4155011650000002],"1600":[3.6801999999999998e-05,3.9191874999999998e-05],"136":[3.0227700000000001e-06,3.27661e-06],"232":[4.76357e-06,4.9789354838709675e-06],"7077888":[1.128547226,1.209862156],"86016":[0.004612115,0.0048703009999999996],"31744":[0.0010279180000000003,0.0010976919999999997],"168":[4.98429e-06,7.2425500000000006e-06],"622592":[0.0520731745,0.0744112985],"108":[2.0352800000000001e-06,2.0432199999999999e-06],"327680":[0.023184119999999999,0.025837981999999999],"2176":[7.4812968750000006e-05,7.6305166666666669e-05],"3328":[8.8067999999999998e-05,8.9567999999999994e-05],"1":[3.8799999999999998e-09,3.8900000000000004e-09],"2":[5.4700000000000003e-09,5.4700000000000003e-09],"3":[7.6799999999999999e-09,7.6899999999999997e-09],"4":[1.124e-08,1.124e-08],"7424":[0.000233804,0.00023741800000000001],"5":[1.4580000000000001e-08,1.4589999999999999e-08],"23552":[0.001364524,0.0014266320000000002],"6":[2.014e-08,2.1069999999999999e-08],"61440":[0.0021671770000000002,0.002430471],"491520":[0.028049220499999993,0.041153139500000005],"77824":[0.003556109,0.0036625310000000001],"7":[2.5959999999999999e-08,2.5959999999999999e-08],"8":[3.299e-08,3.6210000000000005e-08],"208":[4.06041e-06,4.3536000000000001e-06],"9":[4.1289999999999995e-08,4.1309999999999997e-08],"73728":[0.0030831890000000009,0.0034205834999999998],"304":[9.2620899999999999e-06,1.005551e-05],"400":[7.9136666666666667e-06,8.265329999999999e-06],"1310720":[0.1835815445,0.26529030349999999],"336":[1.0819309999999999e-05,1.4419041666666667e-05],"3670016":[0.56117910900000001,0.59650122100000003],"6656":[0.000184589,0.00019982999999999996],"15360":[0.00049384400000000001,0.00056667152941176468],"432":[8.9060000000000008e-06,1.0010069999999999e-05],"950272":[0.082264481,0.11314416099999999],"655360":[0.055106581500000015,0.081600465999999969],"69632":[0.0027793910000000013,0.0029370989999999994],"11264":[0.00058520800000000004,0.00058888899999999999],"2752512":[0.62306478100000007,0.67191007400000002],"8126464":[1.4616876335,1.4665879175000001],"27648":[0.00084742499999999996,0.00085848299999999995],"368":[1.4237640000000002e-05,1.5950549999999999e-05],"65536":[0.0023649300000000003,0.0025952266666666667],"16252928":[3.1828868730000002],"464":[1.03351e-05,1.1021519999999999e-05],"1015808":[0.092597416000000002,0.12906025799999998],"3072":[0.000174017,0.00019066100000000001],"110592":[0.0042499519999999995,0.0042574139999999993],"237568":[0.0111878455,0.0121756825],"278528":[0.015691487,0.017331679999999999],"496":[1.1946269999999999e-05,1.2391134615384615e-05],"13107200":[2.1212324150000001,2.1556422524999999],"9961472":[2.2797384890000001,2.3089109990000001],"5888":[0.00030991800000000006,0.00032660000000000008],"11010048":[3.0182822429999998,3.035154924],"1920":[5.4042525641025635e-05,5.7848469999999998e-05],"2490368":[0.462337997,0.49454948700000001],"19456":[0.00081618445454545473,0.00081694990909090908],"57344":[0.0018698370000000003,0.0019079820000000001],"1179648":[0.143535988,0.187624443],"4718592":[0.96919913599999996,0.98002377500000004],"360448":[0.032074660499999998,0.032155412499999994],"1572864":[0.388574586,0.423127111],"53248":[0.0016428655999999996,0.0016654424000000008],"3456":[9.5153000000000002e-05,0.00010185325000000001],"40960":[0.001768532,0.0017788770000000003],"4608":[0.00016543999999999999,0.00016846400000000001],"13824":[0.0004220090000000001,0.00043126768181818182],"819200":[0.060018813000000004,0.085336893999999996],"983040":[0.087540191999999989,0.1348768625],"8704":[0.00031325,0.00033321499999999999],"120":[2.39764e-06,2.5275100000000002e-06],"1024":[2.7727723404255319e-05,2.971772e-05],"49152":[0.0032808149999999994,0.003432914],"524288":[0.032570418000000038,0.040176822000000001],"45056":[0.0022526680000000002,0.0022939099999999997],"229376":[0.01104436,0.0123750115],"2688":[0.0001151005,0.00013420199999999999],"152":[3.7426499999999996e-06,4.2063799999999995e-06],"5120":[0.00020338599999999998,0.00021543522727272732],"1507328":[0.31659248649999999,0.42282826800000001],"1216":[4.2796479999999994e-05,4.4133460000000004e-05],"1966080":[0.25969062700000001,0.26369210199999998],"1900544":[0.24307077899999999,0.24759566599999999],"184":[7.0074899999999995e-06,7.8105900000000004e-06],"7936":[0.00025856400000000008,0.00027049513888888893],"3801088":[0.59476293299999994,0.60374635199999993],"6815744":[1.0653966994999999,1.1293764079999999],"124":[2.7548900000000002e-06,2.965e-06],"102400":[0.0035903199999999997,0.00376801],"311296":[0.020766182500000004,0.021287904999999989],"1408":[6.309419999999999e-05,6.9931756756756765e-05],"393216":[0.044188963499999998,0.047110045500000003],"4352":[0.00014718900000000007,0.000154418],"6553600":[1.0170274079999999,1.074411239],"20480":[0.00088672300000000007,0.00093200850000000018],"608":[1.9202710000000002e-05,1.9970999999999999e-05],"2228224":[0.342550725,0.35645870300000004],"36864":[0.0014127468333333332,0.0014313629999999997],"704":[2.626262e-05,2.724663e-05],"720896":[0.073416671500000003,0.11459841900000001],"800":[1.7822569999999999e-05,1.8200739999999999e-05],"2621440":[0.52802731400000003,0.57069351599999996],"425984":[0.021326661,0.022908111999999998],"32768":[0.001121665,0.0011268539999999996],"12058624":[4.1958958209999997,4.3240975649999998],"128":[2.6296000000000002e-06,2.9091799999999999e-06],"180224":[0.0140104415,0.015099162000000003],"224":[4.6044999999999997e-06,4.61987e-06],"736":[3.0334499999999999e-05,3.3949168539325843e-05],"320":[9.5486200000000001e-06,1.0370731707317072e-05],"557056":[0.037750736999999999,0.053881232500000001],"832":[1.8610171052631579e-05,1.942096e-05],"9437184":[2.0480959765,2.1147008930000002],"3584":[0.00010441893258426966,0.00010900166666666666],"6291456":[2.5155275239999999,2.6035288639999998],"256":[5.6003636363636368e-06,7.0052899999999998e-06],"15204352":[2.799970359,2.8661697435],"28672":[0.00088152618181818149,0.00092172],"768":[3.8998729166666664e-05,3.9054000000000003e-05],"212992":[0.0088894969999999997,0.010474608],"864":[2.04565e-05,2.1412010000000002e-05],"352":[1.36245e-05,1.6041169999999999e-05],"253952":[0.013098881,0.013755455],"960":[2.4932666666666666e-05,2.5942449999999998e-05],"24576":[0.001594072,0.0016534074000000003],"7680":[0.00024972200000000007,0.00025921000000000001],"294912":[0.018255048999999999,0.019894738500000002],"1048576":[0.099590798000000008,0.14971003299999999],"10485760":[2.5820999800000002,2.6600143895000001],"344064":[0.026178204500000024,0.029560232000000002],"288":[7.1809600000000001e-06,8.1680100000000011e-06],"1152":[3.6232948275862064e-05,3.6971046153846155e-05],"384":[1.7927647058823531e-05,2.0831000000000001e-05],"2304":[7.7767000000000003e-05,8.8682121212121221e-05],"896":[2.253069e-05,2.2979580000000001e-05],"480":[1.0980339999999998e-05,1.1785089999999999e-05],"1441792":[0.25736618100000003,0.380025363],"992":[2.5063999999999999e-05,2.7394999999999998e-05],"3968":[0.00012565059999999995,0.00013121459999999998],"6400":[0.00018359999999999996,0.00018594486792452826],"1344":[5.4110999999999997e-05,5.7697699999999995e-05],"126976":[0.0054110780000000006,0.0055602919999999997],"2883584":[0.75428601200000001,0.81509770999999998],"753664":[0.090683798999999995,0.13681267950000001],"16384":[0.00055888305882352942,0.00059037800000000013],"131072":[0.0063157449999999993,0.007262442],"458752":[0.024865368499999999,0.040358376500000015],"172032":[0.011399277999999999,0.012693003999999999],"12288":[0.00076848800000000022,0.001009963],"14680064":[2.5679141960000003,2.6273740055000001],"1536":[8.5137999999999997e-05,9.6664009999999995e-05],"25600":[0.00071269400000000004,0.00072832807692307705],"1835008":[0.223244358,0.23209026899999999],"10752":[0.00049269899999999987,0.00049514289473684208],"21504":[0.001040586,0.001068659],"7602176":[1.2896546705,1.3170562525],"5632":[0.00027316799999999996,0.00028466199999999998],"10":[4.9830000000000003e-08,5.0189999999999995e-08],"3145728":[1.0797862185,1.096652269],"245760":[0.0126446345,0.016142154999999998],"1728":[4.518370588235294e-05,4.7289700000000002e-05],"11":[6.6000000000000009e-08,7.2439999999999992e-08],"1114112":[0.12129733199999999,0.16894567199999999],"12":[8.3729999999999996e-08,8.3739999999999994e-08],"7340032":[1.196489694,1.2253061869999999],"7168":[0.000221726,0.000230459],"13":[9.4669999999999987e-08,9.4760000000000009e-08],"6029312":[2.0398246965000002,2.0563997509999998],"14":[1.067e-07,1.067e-07],"3200":[8.8862069999999995e-05,8.9278000000000008e-05],"20":[4.0803000000000003e-07,5.0797000000000007e-07],"204800":[0.0085342009999999999,0.0089722630000000012],"15":[1.2116999999999999e-07,1.3299e-07],"13312":[0.00038924639999999997,0.00040703199999999999],"4980736":[1.0756935009999999,1.0772343499999999],"118784":[0.0048293295,0.0050473549999999999],"51200":[0.0015278620000000001,0.0016532092000000006],"16":[2.8270000000000001e-07,4.2591999999999999e-07],"21":[4.9615999999999996e-07,5.3216000000000002e-07],"917504":[0.081274776499999993,0.123271521],"22":[5.4280999999999997e-07,6.6896000000000003e-07],"4864":[0.00018485000000000002,0.00020282066666666665],"17":[3.4941000000000006e-07,3.7821999999999995e-07],"14848":[0.00046913800000000002,0.00049256499999999993],"23":[6.1867999999999998e-07,7.6779999999999998e-07],"786432":[0.108890162,0.14898013999999998],"18":[3.6421e-07,3.8420000000000001e-07],"1638400":[0.179726565,0.19392994399999999],"7864320":[1.3718560399999999,1.3809883940000001],"24":[8.6104000000000004e-07,9.0928999999999996e-07],"14155776":[2.3966557919999998,4.8592922730000003],"19":[3.8096000000000004e-07,4.1094000000000005e-07],"30":[5.9004000000000001e-07,6.7757999999999996e-07],"25":[4.5312000000000002e-07,4.5474000000000001e-07],"31":[5.9989000000000001e-07,6.4394999999999999e-07],"1280":[4.9289280000000001e-05,5.0084839999999995e-05],"26":[4.6369000000000004e-07,4.9368999999999997e-07],"3932160":[0.63122523900000005,0.64164865800000004],"2432":[9.7739021276595754e-05,0.00010082649999999999],"32":[6.7981999999999996e-07,8.3027000000000004e-07],"27":[4.9159000000000002e-07,5.0780999999999999e-07],"409600":[0.0192660825,0.021550140499999999]}},{"title":"OrderedDictionary subscript, noop setter","results":{"28":[6.1600000000000001e-07,7.0800000000000004e-07],"34":[8.1699999999999997e-07,8.2399999999999997e-07],"29":[6.2300000000000001e-07,7.4799999999999997e-07],"40":[1.035e-06,1.071e-06],"17408":[0.00063094699999999997,0.00070420500000000007],"1472":[7.3660999999999998e-05,7.5705999999999996e-05],"112":[2.2970000000000002e-06,2.4559999999999999e-06],"1376256":[0.21052789799999999,0.29556498799999997],"5242880":[1.203803314,1.2364774359999999],"36":[8.7000000000000003e-07,1.029e-06],"42":[1.1149999999999999e-06,1.2860000000000001e-06],"11534336":[3.405865634,3.4923745849999999],"114688":[0.0043849810000000005,0.0045397960000000005],"144":[3.5329999999999999e-06,3.9870000000000001e-06],"38":[9.4900000000000004e-07,1.269e-06],"240":[5.7919999999999998e-06,6.725e-06],"9216":[0.00033713099999999995,0.00036958900000000003],"44":[1.2839999999999999e-06,1.372e-06],"1664":[4.5689999999999998e-05,4.6647000000000002e-05],"196608":[0.018793728999999974,0.019549979000000002],"155648":[0.0085894530000000004,0.0092485190000000002],"2816":[0.00013793600000000002,0.000144127],"50":[1.0189999999999999e-06,1.164e-06],"2359296":[0.38358968999999998,0.40148620000000002],"46":[1.5379999999999999e-06,1.832e-06],"176":[6.4740000000000002e-06,7.2840000000000001e-06],"52":[1.031e-06,1.1379999999999999e-06],"272":[7.515e-06,7.9249999999999995e-06],"116":[2.5229999999999998e-06,3.0010000000000002e-06],"47104":[0.0026980209999999997,0.0028355289999999998],"6912":[0.000201747,0.00020614100000000002],"1856":[5.4097000000000001e-05,5.7827e-05],"48":[1.7749999999999999e-06,1.84e-06],"2097152":[0.291186693,0.29392689700000002],"54":[1.1930000000000001e-06,1.297e-06],"2031616":[0.251892799,0.27044954200000004],"43008":[0.0019940069999999999,0.0022335439999999996],"60":[1.35e-06,1.429e-06],"30720":[0.00097872699999999998,0.001044969],"56":[1.172e-06,1.2419999999999999e-06],"62":[1.384e-06,1.5820000000000001e-06],"58":[1.285e-06,1.31e-06],"3014656":[0.85062340199999997,0.93073771299999997],"64":[1.443e-06,1.66e-06],"8388608":[1.521776048,1.5505943250000001],"29696":[0.00092420700000000002,0.00096118400000000002],"216":[4.8919999999999999e-06,5.8039999999999998e-06],"106496":[0.0039208900000000007,0.0042671540000000004],"72":[1.8419999999999999e-06,2.2189999999999998e-06],"442368":[0.023037546000000002,0.025288977000000008],"147456":[0.0076964980000000004,0.008283426],"4456448":[0.81126189800000004,0.83950347000000003],"63488":[0.0022801269999999998,0.0023434800000000006],"38912":[0.001567326,0.001578033],"68":[1.4920000000000001e-06,2.0880000000000002e-06],"188416":[0.016052205,0.016568543000000005],"248":[6.0499999999999997e-06,6.5950000000000004e-06],"80":[2.6539999999999999e-06,2.7669999999999999e-06],"2560":[0.000104318,0.000117531],"34816":[0.0012447880000000004,0.001252923],"3712":[0.00011671299999999999,0.00012317299999999999],"3538944":[0.49971800599999999,0.51970210999999999],"76":[2.1969999999999999e-06,2.232e-06],"4194304":[0.69811725400000002,0.73688397900000002],"851968":[0.058984197999999988,0.094712673000000025],"4096":[0.00013936100000000001,0.000142893],"59392":[0.0020041210000000002,0.0021466699999999998],"84":[2.6019999999999998e-06,3.1470000000000001e-06],"3276800":[0.43817265900000002,0.45589139199999995],"55296":[0.001830087,0.001904382],"688128":[0.06256287100000002,0.080618982999999991],"8192":[0.00029705500000000001,0.00029986499999999996],"10240":[0.00042693400000000007,0.00046917400000000005],"15872":[0.00052422700000000016,0.00053934400000000009],"92":[3.6040000000000001e-06,4.8359999999999999e-06],"26624":[0.00079736600000000009,0.00081165100000000026],"1792":[5.4336999999999998e-05,5.6416999999999999e-05],"11776":[0.000647096,0.00066081699999999996],"2944":[0.00014819599999999999,0.00016310200000000004],"88":[3.4429999999999999e-06,4.3789999999999999e-06],"22528":[0.001153528,0.001207241],"1245184":[0.14580335699999999,0.22198252299999999],"15728640":[2.9231905540000001,2.9471350319999998],"96":[3.7570000000000002e-06,5.186e-06],"1984":[6.2453000000000007e-05,6.6228000000000004e-05],"139264":[0.0068226700000000003,0.0073479719999999995],"475136":[0.026495813999999999,0.032764359],"13631488":[2.2481291369999998,2.2795058259999998],"416":[9.6250000000000002e-06,9.7739999999999999e-06],"928":[2.4899999999999999e-05,2.8781000000000001e-05],"512":[1.5092999999999999e-05,1.6104999999999999e-05],"18432":[0.0007167199999999999,0.00075249300000000013],"16777216":[3.2446668490000001],"9728":[0.000383304,0.00041929800000000008],"1769472":[0.200453359,0.23604676899999999],"1703936":[0.18915896600000001,0.20247441399999999],"2048":[6.5541000000000001e-05,7.0693999999999998e-05],"14336":[0.00045392100000000003,0.00046065500000000003],"448":[1.1238e-05,1.2296999999999999e-05],"5505024":[1.3952535290000001,1.404466496],"544":[1.7229999999999999e-05,1.8158000000000001e-05],"221184":[0.010004836999999999,0.010731662000000001],"90112":[0.005231861,0.0053790190000000014],"640":[2.4328000000000002e-05,2.5167000000000001e-05],"12800":[0.00037207400000000002,0.00038978200000000008],"262144":[0.013534861,0.014526947],"589824":[0.041608419000000001,0.049190235999999991],"884736":[0.062082382999999998,0.092389626000000002],"6144":[0.000380081,0.00038094499999999999],"1088":[3.7188999999999999e-05,3.9099e-05],"576":[1.9148e-05,1.9548e-05],"160":[4.4959999999999998e-06,4.9180000000000002e-06],"672":[2.5309000000000001e-05,2.8887999999999999e-05],"8912896":[1.7124209050000001,1.72630858],"100":[2.0760000000000001e-06,2.0959999999999999e-06],"507904":[0.029795702,0.037735715000000003],"3840":[0.00012283200000000002,0.00013039],"192":[1.0411000000000001e-05,1.2078e-05],"376832":[0.035085322000000002,0.037987525000000001],"98304":[0.0074217169999999987,0.0078546410000000007],"5376":[0.00023749,0.00025467799999999994],"94208":[0.0061714630000000012,0.0062492889999999999],"81920":[0.0039972539999999996,0.0041248990000000004],"3407872":[0.47676207199999998,0.51672837599999999],"104":[2.131e-06,2.2630000000000002e-06],"122880":[0.0050129040000000003,0.005261394],"200":[4.4950000000000002e-06,4.7029999999999997e-06],"163840":[0.0099733480000000017,0.011010169],"4063232":[0.64656336000000003,0.66768301600000002],"5767168":[1.6360123880000002,1.7024395779999999],"12582912":[4.9811198829999999,5.2763587540000003],"1600":[4.2178999999999997e-05,4.5425e-05],"136":[3.552e-06,3.5559999999999999e-06],"232":[5.0749999999999997e-06,6.2299999999999996e-06],"7077888":[1.113686138,1.1869053119999999],"86016":[0.0045969490000000003,0.0050418770000000019],"31744":[0.0010328680000000002,0.001086881],"168":[5.412e-06,7.4590000000000001e-06],"622592":[0.046489904000000006,0.068476179999999998],"108":[2.3470000000000001e-06,2.6460000000000002e-06],"327680":[0.023347722999999994,0.024160492000000006],"2176":[7.4855000000000001e-05,7.6256999999999999e-05],"3328":[9.4085000000000005e-05,9.8737e-05],"1":[5.2000000000000002e-08,5.8000000000000003e-08],"2":[5.1e-08,5.8999999999999999e-08],"3":[5.8000000000000003e-08,5.8000000000000003e-08],"4":[5.7000000000000001e-08,5.8999999999999999e-08],"7424":[0.000227953,0.00025520499999999999],"5":[5.8999999999999999e-08,7.0000000000000005e-08],"23552":[0.0013526270000000001,0.001433108],"6":[7.9000000000000006e-08,8.6000000000000002e-08],"61440":[0.0022244690000000002,0.0025487739999999997],"491520":[0.027897319,0.038219204999999999],"77824":[0.00357734,0.0039143429999999998],"7":[7.3000000000000005e-08,8.0000000000000002e-08],"8":[7.7999999999999997e-08,8.9000000000000003e-08],"208":[4.5940000000000004e-06,4.6879999999999998e-06],"9":[1.12e-07,1.17e-07],"73728":[0.0031532440000000004,0.003537241],"304":[1.0329000000000001e-05,1.1677e-05],"400":[8.5979999999999997e-06,9.3899999999999999e-06],"1310720":[0.17544884599999999,0.24738977600000001],"336":[1.2931e-05,1.3264999999999999e-05],"3670016":[0.53753593900000007,0.54319731000000004],"6656":[0.00018693799999999999,0.00020433000000000002],"15360":[0.00050731000000000018,0.00053411599999999984],"432":[9.8740000000000007e-06,1.1525000000000001e-05],"950272":[0.075061872999999987,0.124061906],"655360":[0.052528902000000002,0.08006437600000002],"69632":[0.002784243,0.0031017309999999999],"11264":[0.000606917,0.000608549],"2752512":[0.59867623000000003,0.636380163],"8126464":[1.430504021,1.4459695930000001],"27648":[0.00082067000000000012,0.00089012],"368":[1.558e-05,2.0339e-05],"65536":[0.0024487609999999998,0.0025313930000000003],"16252928":[3.0488168820000001],"464":[1.2213e-05,1.2422000000000001e-05],"1015808":[0.086927231999999979,0.120602073],"3072":[0.00017478699999999998,0.00018345199999999999],"110592":[0.0040842379999999996,0.0042010010000000002],"237568":[0.011125846,0.01186916],"278528":[0.015376374,0.016417984],"496":[1.3899e-05,1.4535000000000001e-05],"13107200":[2.095448625,2.1514494669999999],"9961472":[2.2217038210000002,2.2287453849999999],"5888":[0.00031733500000000008,0.00031773199999999999],"11010048":[2.948770815,2.9573307899999999],"1920":[5.7265999999999997e-05,5.8427000000000002e-05],"2490368":[0.44699736800000001,0.45801868299999998],"19456":[0.0007937100000000001,0.00085773499999999988],"57344":[0.0019469929999999997,0.002009027],"1179648":[0.12934434,0.18305313100000001],"4718592":[0.944327747,0.96163586599999995],"360448":[0.030112144,0.031307461999999994],"1572864":[0.36265039799999998,0.37168648100000001],"53248":[0.0017077120000000001,0.0017554560000000003],"3456":[9.6127999999999998e-05,0.000107489],"40960":[0.001748192,0.0018223580000000001],"4608":[0.000168114,0.000179316],"13824":[0.00043088700000000013,0.00043905699999999991],"819200":[0.055939703,0.080018972999999993],"983040":[0.084172096999999987,0.129204124],"8704":[0.00030476499999999981,0.00033368600000000003],"120":[2.7269999999999999e-06,2.881e-06],"1024":[3.3321000000000002e-05,3.5689999999999999e-05],"49152":[0.0032379959999999999,0.0033572490000000005],"524288":[0.031891163,0.038899441],"45056":[0.0023523419999999999,0.0023874669999999999],"229376":[0.010476431,0.012039619999999999],"2688":[0.000121703,0.00018724],"152":[4.1960000000000001e-06,4.5399999999999997e-06],"5120":[0.000206794,0.000221726],"1507328":[0.303730155,0.406153916],"1216":[4.4487999999999998e-05,4.5708999999999999e-05],"1966080":[0.23805240599999999,0.25157512500000001],"1900544":[0.22791460399999999,0.233535676],"184":[8.276e-06,9.0780000000000002e-06],"7936":[0.00025585700000000007,0.000265913],"3801088":[0.58051057799999994,0.600189521],"6815744":[1.0486082269999999,1.120038665],"124":[3.2389999999999998e-06,3.3799999999999998e-06],"102400":[0.0036009569999999997,0.0037135640000000004],"311296":[0.019672927,0.021555547000000001],"1408":[6.2718000000000005e-05,7.0093999999999997e-05],"393216":[0.043294557999999997,0.045637579999999997],"4352":[0.000150727,0.000163547],"6553600":[1.0051629230000001,1.0514714780000001],"20480":[0.00090434799999999991,0.00093691499999999997],"608":[2.1554999999999999e-05,2.1722e-05],"2228224":[0.33468452100000001,0.33518849899999997],"36864":[0.0013923259999999997,0.0014661050000000001],"704":[2.6866e-05,2.9679000000000002e-05],"720896":[0.070920253999999988,0.103674506],"800":[1.9341999999999999e-05,1.9952000000000001e-05],"2621440":[0.51357931800000001,0.54314358299999999],"425984":[0.021702031,0.023098805],"32768":[0.001119295,0.0011399510000000002],"12058624":[4.0576426679999997,4.1434720949999999],"128":[2.8789999999999999e-06,3.0869999999999998e-06],"180224":[0.01322708,0.013685124],"224":[5.4199999999999998e-06,5.4979999999999997e-06],"736":[3.735e-05,3.7595000000000002e-05],"320":[1.0560999999999999e-05,1.1649e-05],"557056":[0.037156226000000001,0.048630882],"832":[2.1926999999999999e-05,2.3257000000000001e-05],"9437184":[1.997145306,2.0601707029999998],"3584":[0.000113424,0.000115152],"6291456":[2.4384408089999998,2.5060838429999999],"256":[6.2990000000000002e-06,7.2010000000000002e-06],"15204352":[2.7630000240000001,2.827350896],"28672":[0.00089093400000000002,0.00093056500000000006],"768":[4.0886999999999997e-05,4.1493999999999999e-05],"212992":[0.0089630140000000001,0.010600786000000003],"864":[2.2716000000000001e-05,2.4754999999999999e-05],"352":[1.4414e-05,1.6750999999999999e-05],"253952":[0.01281097,0.013644389999999998],"960":[2.7368e-05,3.1217000000000003e-05],"24576":[0.0015902920000000001,0.0016343429999999999],"7680":[0.00024208499999999996,0.00028981900000000008],"294912":[0.017787373000000002,0.019230805],"1048576":[0.094667425999999999,0.147849379],"10485760":[2.4981988180000001,2.6044708669999999],"344064":[0.025465809999999998,0.028410615],"288":[8.1340000000000004e-06,8.6649999999999992e-06],"1152":[3.8547000000000002e-05,4.3198999999999998e-05],"384":[1.8924e-05,2.1954e-05],"2304":[8.2851999999999999e-05,9.3638e-05],"896":[2.4189000000000002e-05,2.5177e-05],"480":[1.2558000000000001e-05,1.2850999999999999e-05],"1441792":[0.24251387799999999,0.35200045499999999],"992":[2.8072000000000002e-05,3.0128999999999999e-05],"3968":[0.000124931,0.000135902],"6400":[0.000177412,0.000191798],"1344":[5.6075000000000001e-05,5.8286999999999999e-05],"126976":[0.005412605,0.0055537159999999993],"2883584":[0.73151221600000005,0.78972272300000002],"753664":[0.083196703000000011,0.126791299],"16384":[0.00054742000000000007,0.00064908199999999994],"131072":[0.0059645990000000001,0.0060992599999999996],"458752":[0.025568067,0.032953282],"172032":[0.011330373000000001,0.012142487],"12288":[0.00078634600000000005,0.0008927020000000001],"14680064":[2.5939965579999997,2.6201881089999999],"1536":[8.3308999999999998e-05,9.7190999999999998e-05],"25600":[0.00073150999999999999,0.00073562699999999998],"1835008":[0.21791657399999997,0.21995251199999999],"10752":[0.00050051299999999996,0.00052393000000000003],"21504":[0.001039679,0.0010462539999999997],"7602176":[1.266640749,1.2824611909999999],"5632":[0.00026442499999999999,0.000288323],"10":[1.14e-07,1.2200000000000001e-07],"3145728":[1.0482371589999999,1.0705850100000001],"245760":[0.011920754,0.01266077],"1728":[4.9014999999999997e-05,5.1530000000000003e-05],"11":[1.2599999999999999e-07,1.42e-07],"1114112":[0.109241704,0.155094023],"12":[1.4399999999999999e-07,1.5300000000000001e-07],"7340032":[1.166116478,1.2119135999999999],"7168":[0.00021378400000000001,0.00023754000000000001],"13":[1.55e-07,1.5800000000000001e-07],"6029312":[1.978905951,1.9868114379999999],"14":[1.6299999999999999e-07,1.79e-07],"3200":[8.7713000000000005e-05,9.5408999999999994e-05],"20":[4.6699999999999999e-07,5.1399999999999997e-07],"204800":[0.0084985069999999989,0.0094061479999999996],"15":[1.7599999999999999e-07,2.1e-07],"13312":[0.000380405,0.00039767999999999997],"4980736":[1.048990474,1.049259291],"118784":[0.0047873859999999994,0.0048941639999999995],"51200":[0.0015759960000000001,0.001654029],"16":[3.96e-07,4.0600000000000001e-07],"21":[5.7299999999999996e-07,5.7999999999999995e-07],"917504":[0.069576497999999987,0.112766007],"22":[5.7400000000000003e-07,6.8100000000000002e-07],"4864":[0.00018711700000000002,0.00021969700000000003],"17":[4.4299999999999998e-07,4.4900000000000001e-07],"14848":[0.000458312,0.00050484300000000015],"23":[6.2799999999999996e-07,6.8400000000000004e-07],"786432":[0.103274623,0.14960975400000001],"18":[5.1099999999999996e-07,5.3200000000000005e-07],"1638400":[0.17562667800000001,0.186144961],"7864320":[1.365835382,1.37934523],"24":[9.2500000000000004e-07,1.5230000000000001e-06],"14155776":[2.4245985650000001,4.4291918780000001],"19":[4.6199999999999998e-07,5.8100000000000003e-07],"30":[7.2200000000000003e-07,7.3099999999999997e-07],"25":[5.3499999999999996e-07,5.9400000000000005e-07],"31":[6.7400000000000003e-07,7.2600000000000002e-07],"1280":[4.5028999999999999e-05,5.7565000000000002e-05],"26":[5.4499999999999997e-07,6.1200000000000003e-07],"3932160":[0.61628558,0.62656309200000004],"2432":[9.9134000000000003e-05,9.9827000000000005e-05],"32":[7.8400000000000003e-07,8.5099999999999998e-07],"27":[5.6300000000000005e-07,5.9800000000000003e-07],"409600":[0.020108576,0.021496068]}},{"title":"OrderedDictionary subscript, set existing","results":{"28":[6.7000000000000004e-07,6.7599999999999997e-07],"34":[8.0999999999999997e-07,8.1399999999999996e-07],"29":[6.6199999999999997e-07,6.9800000000000003e-07],"40":[9.1699999999999997e-07,1.2729999999999999e-06],"17408":[0.00054871800000000001,0.00054903599999999993],"1472":[4.5655000000000002e-05,4.7889000000000002e-05],"112":[2.2929999999999999e-06,2.4700000000000001e-06],"1376256":[0.188718517,0.27288885600000001],"5242880":[1.0679456469999999,1.078490674],"36":[8.0999999999999997e-07,9.9000000000000005e-07],"42":[9.2299999999999999e-07,1.097e-06],"11534336":[2.5745179120000001,2.6646319489999999],"114688":[0.0049161540000000007,0.0049710880000000002],"144":[3.3840000000000001e-06,3.6890000000000002e-06],"38":[8.4499999999999996e-07,1.0389999999999999e-06],"240":[5.6409999999999999e-06,6.032e-06],"9216":[0.000276307,0.000288134],"44":[1.062e-06,1.125e-06],"1664":[3.8943000000000003e-05,3.9039999999999999e-05],"196608":[0.012666753000000003,0.014179795],"155648":[0.0087928120000000005,0.0091110710000000001],"2816":[8.5438000000000004e-05,9.5452999999999996e-05],"50":[1.1739999999999999e-06,1.2449999999999999e-06],"2359296":[0.36625323599999998,0.38025614600000002],"46":[1.173e-06,1.3570000000000001e-06],"176":[4.78e-06,5.2379999999999997e-06],"52":[1.0920000000000001e-06,1.2190000000000001e-06],"272":[6.6449999999999999e-06,6.8310000000000003e-06],"116":[2.8210000000000002e-06,2.9490000000000001e-06],"47104":[0.0018406539999999999,0.0020417510000000001],"6912":[0.000171881,0.000184558],"1856":[4.6217999999999997e-05,4.6647999999999998e-05],"48":[1.175e-06,1.28e-06],"2097152":[0.30476437699999998,0.30889692699999999],"54":[1.279e-06,1.33e-06],"2031616":[0.28596333800000001,0.30420600199999998],"43008":[0.0015133799999999999,0.0016333750000000001],"60":[1.39e-06,1.4640000000000001e-06],"30720":[0.00088112499999999996,0.00091222500000000002],"56":[1.2270000000000001e-06,1.2529999999999999e-06],"62":[1.359e-06,1.5239999999999999e-06],"58":[1.277e-06,1.361e-06],"3014656":[0.60527854599999997,0.71630775599999996],"64":[1.4050000000000001e-06,1.553e-06],"8388608":[1.500814439,1.572161916],"29696":[0.00084020300000000009,0.00084793499999999996],"216":[4.7110000000000003e-06,5.6280000000000002e-06],"106496":[0.0043809829999999998,0.0053213750000000006],"72":[1.734e-06,1.9420000000000002e-06],"442368":[0.027705916000000008,0.035969235999999995],"147456":[0.0078404050000000017,0.0091889880000000021],"4456448":[0.81002385599999993,0.84680557400000001],"63488":[0.002361536,0.0023623430000000003],"38912":[0.001272776,0.0013215599999999998],"68":[1.5e-06,1.6160000000000001e-06],"188416":[0.011629797000000001,0.013220745000000002],"248":[5.6149999999999996e-06,6.4309999999999999e-06],"80":[1.9290000000000001e-06,2.0339999999999999e-06],"2560":[7.6233e-05,8.2810000000000002e-05],"34816":[0.001043193,0.001053163],"3712":[9.4518999999999994e-05,9.7943999999999996e-05],"3538944":[0.54922403200000003,0.63367900700000002],"76":[1.8369999999999999e-06,2.1600000000000001e-06],"4194304":[0.81028070099999994,0.83308831800000005],"851968":[0.090550677999999996,0.106422541],"4096":[0.000117698,0.000118266],"59392":[0.0021143720000000006,0.002221163],"84":[2.2579999999999998e-06,2.294e-06],"3276800":[0.51143256400000003,0.52244389200000008],"55296":[0.001819078,0.0019893979999999999],"688128":[0.061282186000000002,0.086492579999999999],"8192":[0.00023888199999999999,0.00023941200000000004],"10240":[0.00031021099999999996,0.00031171299999999981],"15872":[0.00045308800000000004,0.00047674099999999998],"92":[2.469e-06,3.1159999999999999e-06],"26624":[0.00071307199999999982,0.00074799900000000006],"1792":[4.5711999999999999e-05,4.6897000000000002e-05],"11776":[0.00043697800000000003,0.000441283],"2944":[9.2468999999999998e-05,0.000104614],"88":[2.3769999999999999e-06,2.3970000000000001e-06],"22528":[0.00078113300000000004,0.00098903800000000003],"1245184":[0.15828408299999999,0.220857831],"15728640":[3.1625825789999999,3.2536456149999999],"96":[2.599e-06,2.6290000000000002e-06],"1984":[4.8795999999999998e-05,5.6830000000000003e-05],"139264":[0.0066799900000000011,0.0083482339999999995],"475136":[0.033991735999999995,0.048478285999999995],"13631488":[2.7364581920000002,2.899938567],"416":[9.2140000000000002e-06,9.5899999999999997e-06],"928":[2.2932999999999999e-05,2.5151999999999999e-05],"512":[1.2935000000000001e-05,1.3131e-05],"18432":[0.0005912519999999999,0.00060542800000000009],"16777216":[3.1866232659999998],"9728":[0.000297378,0.000310451],"1769472":[0.23703083899999999,0.24649330999999997],"1703936":[0.23685841899999999,0.241467601],"2048":[5.5659999999999999e-05,5.6273999999999997e-05],"14336":[0.00037218800000000002,0.00038972600000000007],"448":[1.0625000000000001e-05,1.1046000000000001e-05],"5505024":[1.046674519,1.1004283459999999],"544":[1.3606e-05,1.4250000000000001e-05],"221184":[0.011639967000000003,0.012222878999999997],"90112":[0.0043605440000000001,0.0046314189999999995],"640":[1.8002000000000001e-05,1.8694000000000001e-05],"12800":[0.00031758999999999986,0.000348888],"262144":[0.014345057999999999,0.016661348999999999],"589824":[0.05310325199999999,0.061859767999999996],"884736":[0.092847813000000001,0.11668503],"6144":[0.00021505500000000002,0.000232673],"1088":[2.9175000000000001e-05,3.0125e-05],"576":[1.5432000000000001e-05,1.5826999999999999e-05],"160":[4.0040000000000001e-06,4.5020000000000003e-06],"672":[1.8737e-05,1.8831e-05],"8912896":[1.5777807779999999,1.649248139],"100":[2.182e-06,2.4210000000000002e-06],"507904":[0.036121313000000002,0.053128157000000009],"3840":[0.00010354200000000001,0.00010611999999999999],"192":[5.3170000000000001e-06,6.4710000000000004e-06],"376832":[0.026272634999999999,0.031359083000000017],"98304":[0.0053157150000000004,0.0053499240000000007],"5376":[0.00016613200000000001,0.00018526799999999999],"94208":[0.0047051619999999997,0.0048897439999999997],"81920":[0.0036391259999999995,0.0037937770000000008],"3407872":[0.55834632699999998,0.57941817899999992],"104":[2.1239999999999999e-06,2.1880000000000001e-06],"122880":[0.0053208330000000005,0.0062413740000000009],"200":[4.4270000000000001e-06,4.7690000000000004e-06],"163840":[0.0087008180000000025,0.0096660759999999974],"4063232":[0.64976920400000004,0.76359294499999997],"5767168":[1.213279923,1.2720346039999999],"12582912":[2.8392956890000001,3.2823632730000001],"1600":[3.7879000000000001e-05,3.8955999999999998e-05],"136":[3.4000000000000001e-06,3.5420000000000001e-06],"232":[5.006e-06,5.1059999999999999e-06],"7077888":[1.150757926,1.3673190879999999],"86016":[0.0039915660000000002,0.0041966370000000013],"31744":[0.00090200200000000006,0.00096721699999999992],"168":[4.053e-06,4.8749999999999999e-06],"622592":[0.052217780000000005,0.072875800000000004],"108":[2.345e-06,2.5000000000000002e-06],"327680":[0.020372386999999999,0.022811434999999998],"2176":[5.8814000000000003e-05,5.8836999999999999e-05],"3328":[8.0014999999999999e-05,8.3404000000000003e-05],"1":[5.2999999999999998e-08,5.8999999999999999e-08],"2":[5.2999999999999998e-08,6.1000000000000004e-08],"3":[5.8000000000000003e-08,5.9999999999999995e-08],"4":[5.9999999999999995e-08,5.9999999999999995e-08],"7424":[0.00019838000000000001,0.00021177300000000001],"5":[6.5e-08,6.8999999999999996e-08],"23552":[0.00084930300000000025,0.00089426700000000013],"6":[7.3000000000000005e-08,8.0999999999999997e-08],"61440":[0.0022533949999999996,0.00273449],"491520":[0.038266556,0.057492404999999983],"77824":[0.0034323539999999999,0.003826655],"7":[7.0000000000000005e-08,8.3000000000000002e-08],"8":[8.6000000000000002e-08,9.2999999999999999e-08],"208":[4.6589999999999998e-06,4.8239999999999999e-06],"9":[8.9999999999999999e-08,1.0700000000000001e-07],"73728":[0.0031766909999999997,0.003499364],"304":[8.2609999999999993e-06,9.5540000000000003e-06],"400":[8.7080000000000003e-06,9.5990000000000008e-06],"1310720":[0.172812412,0.231586871],"336":[9.7829999999999993e-06,1.0594999999999999e-05],"3670016":[0.67830329899999997,0.70570727],"6656":[0.00016373600000000005,0.00017720400000000001],"15360":[0.00041609899999999996,0.00046860899999999993],"432":[9.2949999999999999e-06,1.0263e-05],"950272":[0.103758187,0.152587895],"655360":[0.063317915000000002,0.084963345999999967],"69632":[0.0028433350000000002,0.0029949220000000006],"11264":[0.00038215500000000007,0.00040284799999999992],"2752512":[0.51626864500000003,0.55464412299999999],"8126464":[1.487064291,1.5347837989999999],"27648":[0.00074403699999999991,0.00078591399999999986],"368":[1.0587e-05,1.1246e-05],"65536":[0.0024679189999999998,0.0026235859999999994],"16252928":[3.516718569],"464":[1.0976e-05,1.1626e-05],"1015808":[0.114423464,0.16220431699999999],"3072":[0.00010286200000000001,0.000104943],"110592":[0.0051839659999999999,0.0052769800000000014],"237568":[0.013253076000000003,0.014128879],"278528":[0.015406990000000004,0.016803703],"496":[1.2007e-05,1.2542e-05],"13107200":[2.7423853189999998,2.8223759369999999],"9961472":[1.8413663730000001,1.9335327259999999],"5888":[0.00020065600000000001,0.00020598599999999993],"11010048":[2.275476845,2.2851237900000001],"1920":[4.5314e-05,4.7552000000000001e-05],"2490368":[0.40314295900000002,0.41880735099999999],"19456":[0.00058930100000000008,0.00061727699999999984],"57344":[0.0020607849999999999,0.00209283],"1179648":[0.146478568,0.179222732],"4718592":[0.87244317500000002,0.92860569100000001],"360448":[0.026124215999999999,0.028357754999999995],"1572864":[0.26285152899999997,0.27697380399999999],"53248":[0.001753608,0.0017913880000000001],"3456":[8.7824999999999993e-05,8.7937999999999997e-05],"40960":[0.0013711189999999999,0.001406095],"4608":[0.00013258700000000004,0.00014012600000000002],"13824":[0.00035693600000000019,0.00036624100000000001],"819200":[0.102610756,0.113054882],"983040":[0.13935117399999999,0.14256554699999999],"8704":[0.00025435099999999999,0.00026508399999999996],"120":[2.6180000000000002e-06,2.875e-06],"1024":[2.6486e-05,2.8844e-05],"49152":[0.0019802999999999999,0.0021841230000000005],"524288":[0.037608272000000005,0.056022083999999972],"45056":[0.0016563489999999992,0.001699297],"229376":[0.011260687,0.014515784],"2688":[7.8459000000000002e-05,9.5594999999999995e-05],"152":[3.7850000000000002e-06,3.9060000000000004e-06],"5120":[0.00015080700000000004,0.00016778100000000001],"1507328":[0.22495647299999999,0.29116535300000002],"1216":[3.4168000000000002e-05,3.4471000000000003e-05],"1966080":[0.281363211,0.306251838],"1900544":[0.26911865400000001,0.33773699499999998],"184":[5.463e-06,5.6450000000000002e-06],"7936":[0.00020760700000000001,0.00020875000000000001],"3801088":[0.71920250699999999,0.73484082699999997],"6815744":[1.280717168,1.354628197],"124":[3.01e-06,3.1200000000000002e-06],"102400":[0.0043572200000000002,0.0043808880000000012],"311296":[0.019019952999999999,0.024890101000000005],"1408":[4.2134e-05,4.4923999999999999e-05],"393216":[0.030874391000000001,0.031086321],"4352":[0.000117896,0.000129696],"6553600":[1.135361608,1.2789302870000001],"20480":[0.00063954099999999998,0.00066579699999999987],"608":[1.5809000000000001e-05,1.7028e-05],"2228224":[0.33604663400000001,0.336258061],"36864":[0.0011357979999999999,0.0012240509999999999],"704":[1.9388000000000001e-05,2.0231e-05],"720896":[0.073516178999999987,0.108873946],"800":[1.7346e-05,1.8033000000000002e-05],"2621440":[0.45908890199999997,0.47682038299999996],"425984":[0.029161715000000005,0.031901593999999998],"32768":[0.00098532100000000016,0.00099023100000000005],"12058624":[2.7826304730000002,3.0012447390000001],"128":[3.044e-06,3.1530000000000001e-06],"180224":[0.011010547000000001,0.011755895000000001],"224":[5.1379999999999998e-06,5.2580000000000003e-06],"736":[2.2073999999999999e-05,2.3385000000000001e-05],"320":[8.8969999999999997e-06,9.1230000000000006e-06],"557056":[0.047905220999999998,0.061570111000000004],"832":[1.9721e-05,1.9916999999999999e-05],"9437184":[2.0055960000000002,2.1440519569999998],"3584":[9.7104999999999999e-05,9.7722999999999999e-05],"6291456":[1.457609425,1.52894354],"256":[5.84e-06,6.37e-06],"15204352":[2.941281349,3.3095054770000001],"28672":[0.000787975,0.00083101799999999988],"768":[2.4651000000000002e-05,2.5856000000000001e-05],"212992":[0.010853266,0.011263672000000002],"864":[1.9930999999999999e-05,2.0256999999999999e-05],"352":[9.2220000000000008e-06,1.0428000000000001e-05],"253952":[0.013153289,0.015363924000000001],"960":[2.2240000000000001e-05,2.6916000000000001e-05],"24576":[0.00092979,0.00095514500000000013],"7680":[0.00019748700000000002,0.00023546300000000005],"294912":[0.019225089000000001,0.019666878000000006],"1048576":[0.12344781800000004,0.18200817],"10485760":[2.2348792159999999,2.3256381739999998],"344064":[0.02564347799999999,0.026763471],"288":[7.058e-06,7.8769999999999993e-06],"1152":[2.9589000000000001e-05,3.1773000000000002e-05],"384":[1.0976e-05,1.1387e-05],"2304":[6.2759e-05,6.9307000000000006e-05],"896":[1.9573e-05,2.2223000000000001e-05],"480":[1.0849000000000001e-05,1.1511e-05],"1441792":[0.20368222699999999,0.27898245999999999],"992":[2.4944e-05,2.5571e-05],"3968":[0.000107291,0.000111716],"6400":[0.000156262,0.000185164],"1344":[3.8058000000000001e-05,3.9150999999999998e-05],"126976":[0.0057213280000000012,0.0061676180000000006],"2883584":[0.53501597000000001,0.57993679099999995],"753664":[0.07222409199999999,0.10579633300000001],"16384":[0.00044925100000000001,0.00047062900000000002],"131072":[0.0067583850000000013,0.0069812339999999985],"458752":[0.029769394999999994,0.053633821999999998],"172032":[0.0094896089999999579,0.010987699],"12288":[0.000433771,0.00051621000000000013],"14680064":[2.6436648759999999,3.1066248280000002],"1536":[4.9829e-05,5.5723999999999997e-05],"25600":[0.00065337900000000016,0.00068073099999999996],"1835008":[0.26308757599999999,0.263898195],"10752":[0.00033586499999999997,0.000351095],"21504":[0.00068749300000000018,0.00078149600000000012],"7602176":[1.3750956160000001,1.4861663470000002],"5632":[0.00017819999999999999,0.00020536900000000001],"10":[9.2000000000000003e-08,9.3999999999999995e-08],"3145728":[0.61239503500000003,0.67513843899999992],"245760":[0.012841919,0.014917531000000001],"1728":[4.1477000000000003e-05,4.1600000000000002e-05],"11":[1.12e-07,1.54e-07],"1114112":[0.13819223599999997,0.16558416300000001],"12":[1.15e-07,1.15e-07],"7340032":[1.192551634,1.3333494749999999],"7168":[0.000188133,0.000197226],"13":[1.1899999999999999e-07,1.24e-07],"6029312":[1.308981022,1.3531737640000001],"14":[1.23e-07,1.42e-07],"3200":[7.7352000000000001e-05,8.2435999999999995e-05],"20":[4.2199999999999999e-07,4.8599999999999998e-07],"204800":[0.01120059,0.012119896],"15":[1.3899999999999999e-07,1.5099999999999999e-07],"13312":[0.00033280400000000002,0.00036823300000000004],"4980736":[0.924178006,0.95501973500000004],"118784":[0.0054435199999999994,0.0057780100000000001],"51200":[0.0017013659999999997,0.001758033],"16":[3.7599999999999998e-07,4.2199999999999999e-07],"21":[5.3799999999999997e-07,5.6400000000000002e-07],"917504":[0.100587204,0.14109799899999997],"22":[5.3300000000000002e-07,5.6100000000000001e-07],"4864":[0.000143349,0.00016883799999999999],"17":[3.9900000000000001e-07,4.1199999999999998e-07],"14848":[0.000388768,0.00042798499999999998],"23":[5.1799999999999995e-07,5.5899999999999996e-07],"786432":[0.080471524999999988,0.114958504],"18":[4.3700000000000001e-07,4.6600000000000002e-07],"1638400":[0.22580657800000001,0.231901948],"7864320":[1.408788583,1.413085573],"24":[6.8400000000000004e-07,6.9299999999999997e-07],"14155776":[2.6555945840000001,6.2835532479999996],"19":[4.1600000000000002e-07,5.0299999999999999e-07],"30":[7.3799999999999996e-07,7.7599999999999996e-07],"25":[5.9500000000000002e-07,5.9699999999999996e-07],"31":[6.92e-07,7.1800000000000005e-07],"1280":[3.4183000000000001e-05,3.8095e-05],"26":[6.13e-07,6.5600000000000005e-07],"3932160":[0.63358850799999999,0.665276957],"2432":[7.7025000000000002e-05,8.1948999999999998e-05],"32":[6.9500000000000002e-07,8.2099999999999995e-07],"27":[5.8899999999999999e-07,6.5600000000000005e-07],"409600":[0.028338077999999999,0.030412231000000001]}},{"title":"OrderedDictionary subscript, _modify","results":{"28":[1.015e-06,1.1200000000000001e-06],"34":[1.274e-06,1.544e-06],"29":[1.0860000000000001e-06,1.111e-06],"40":[1.5060000000000001e-06,1.796e-06],"17408":[0.00082574300000000009,0.00087927299999999986],"1472":[6.5148999999999996e-05,7.0957000000000005e-05],"112":[3.8929999999999998e-06,4.1860000000000002e-06],"1376256":[0.30599087699999999,0.40365821200000002],"5242880":[1.572879922,1.5755860230000001],"36":[1.3489999999999999e-06,1.8339999999999999e-06],"42":[1.6270000000000001e-06,1.7969999999999999e-06],"11534336":[3.813527949,3.828982597],"114688":[0.007275915,0.0074675969999999994],"144":[5.7019999999999998e-06,5.8560000000000003e-06],"38":[1.3829999999999999e-06,1.573e-06],"240":[9.5300000000000002e-06,9.8230000000000006e-06],"9216":[0.00039343000000000001,0.00042421599999999999],"44":[1.7579999999999999e-06,1.9879999999999999e-06],"1664":[6.4603999999999993e-05,6.4659000000000006e-05],"196608":[0.016984246000000001,0.018386523000000005],"155648":[0.011700406,0.011736485],"2816":[0.00012647599999999999,0.00014003399999999998],"50":[1.9149999999999999e-06,1.9470000000000002e-06],"2359296":[0.60139867600000008,0.63454107100000001],"46":[1.9609999999999999e-06,2.0849999999999999e-06],"176":[7.6140000000000003e-06,8.4239999999999993e-06],"52":[1.854e-06,1.9470000000000002e-06],"272":[1.1065e-05,1.1389000000000001e-05],"116":[4.6469999999999997e-06,4.9239999999999998e-06],"47104":[0.0025514000000000001,0.002812714],"6912":[0.00026788400000000008,0.00027647400000000008],"1856":[7.1730999999999995e-05,7.7929999999999994e-05],"48":[2.1210000000000001e-06,2.3159999999999999e-06],"2097152":[0.50850184700000001,0.52685025299999999],"54":[2.1409999999999999e-06,2.2060000000000001e-06],"2031616":[0.46471348400000001,0.49227724299999998],"43008":[0.0021690209999999997,0.0023211459999999996],"60":[2.3360000000000002e-06,2.3590000000000002e-06],"30720":[0.001319108,0.00184877],"56":[2.0439999999999998e-06,2.0820000000000001e-06],"62":[2.3439999999999999e-06,2.599e-06],"58":[2.1919999999999999e-06,2.3070000000000001e-06],"3014656":[0.89471517499999997,0.93454985400000001],"64":[2.4959999999999999e-06,2.508e-06],"8388608":[2.4324015819999998,2.4658873200000002],"29696":[0.001283427,0.001284026],"216":[7.7279999999999995e-06,9.3729999999999999e-06],"106496":[0.0066252740000000004,0.0069964930000000012],"72":[2.852e-06,3.1350000000000001e-06],"442368":[0.040895397999999999,0.079227623999999983],"147456":[0.010646338,0.011080276999999998],"4456448":[1.231115586,1.271409902],"63488":[0.0033219260000000002,0.0034500219999999996],"38912":[0.001852876,0.001897209],"68":[2.4940000000000002e-06,2.977e-06],"188416":[0.015682616999999999,0.016780976],"248":[9.3279999999999995e-06,1.0437e-05],"80":[3.2480000000000001e-06,3.5659999999999998e-06],"2560":[0.000115559,0.000122349],"34816":[0.001589727,0.001708249],"3712":[0.000146704,0.00015417500000000002],"3538944":[0.900547773,0.93078395599999997],"76":[3.0599999999999999e-06,3.568e-06],"4194304":[1.1407367129999999,1.1417188620000001],"851968":[0.14572161800000005,0.18819028900000001],"4096":[0.00016384,0.000180073],"59392":[0.0030569069999999998,0.0033447169999999992],"84":[3.7110000000000001e-06,3.7340000000000002e-06],"3276800":[0.81530686499999994,0.83820230600000001],"55296":[0.00272171099999996,0.0028322200000000003],"688128":[0.099797285000000027,0.147051032],"8192":[0.000346802,0.00034891300000000001],"10240":[0.00045850400000000004,0.00047027400000000002],"15872":[0.00067692800000000003,0.00072632600000000001],"92":[3.9049999999999999e-06,4.8790000000000002e-06],"26624":[0.0010955509999999997,0.001164345],"1792":[7.3446000000000001e-05,7.5025999999999996e-05],"11776":[0.00062042399999999963,0.00062539399999999993],"2944":[0.00013410399999999999,0.00013575799999999998],"88":[3.8e-06,3.9190000000000001e-06],"22528":[0.001143053,0.0012077659999999999],"1245184":[0.26458578199999999,0.32474006799999999],"15728640":[4.7506688879999999,4.7625368899999998],"96":[4.1559999999999997e-06,4.3749999999999996e-06],"1984":[7.6658999999999999e-05,8.6598e-05],"139264":[0.0097522570000000003,0.011006092],"475136":[0.049067309000000017,0.074988565999999993],"13631488":[3.9157627069999998,3.9936645400000002],"416":[1.5132e-05,1.5954999999999999e-05],"928":[3.7676999999999999e-05,4.1366999999999999e-05],"512":[2.137e-05,2.1535999999999998e-05],"18432":[0.00085310499999999984,0.00089157699999999995],"16777216":[5.1451285880000004],"9728":[0.00042432800000000002,0.00046672800000000013],"1769472":[0.39067026500000002,0.406357727],"1703936":[0.37750595599999998,0.38565550400000004],"2048":[7.9054000000000006e-05,8.7766e-05],"14336":[0.00058578099999999963,0.00060608400000000001],"448":[1.7835000000000001e-05,1.7957000000000001e-05],"5505024":[1.690429234,1.7030928359999999],"544":[2.3181e-05,2.3816e-05],"221184":[0.016054172999999998,0.018813475],"90112":[0.00610781,0.0063007180000000012],"640":[2.8503000000000001e-05,2.9050000000000001e-05],"12800":[0.0005140940000000001,0.00054565100000000008],"262144":[0.020173921000000001,0.020514481000000001],"589824":[0.072772348999999958,0.10951652100000001],"884736":[0.15362367800000001,0.19353738500000001],"6144":[0.00030473099999999998,0.00031582399999999998],"1088":[4.3742000000000002e-05,4.6607999999999998e-05],"576":[2.3587e-05,2.4411999999999999e-05],"160":[6.4840000000000001e-06,7.3039999999999999e-06],"672":[2.9391e-05,3.0303000000000001e-05],"8912896":[2.6260582590000001,2.63220528],"100":[3.7129999999999999e-06,4.2139999999999998e-06],"507904":[0.054195380000000015,0.085788636999999973],"3840":[0.000167512,0.000175859],"192":[8.7280000000000001e-06,8.8449999999999992e-06],"376832":[0.037750139000000002,0.042839039000000002],"98304":[0.007251843,0.0072803109999999994],"5376":[0.00024499600000000004,0.000256751],"94208":[0.0065960149999999993,0.0068337889999999981],"81920":[0.0051768939999999996,0.0055007480000000015],"3407872":[0.85591425700000001,0.91380030700000003],"104":[3.6820000000000001e-06,3.771e-06],"122880":[0.0079269620000000009,0.0083636080000000015],"200":[7.4100000000000002e-06,8.0059999999999992e-06],"163840":[0.012423537,0.012888452],"4063232":[1.096815361,1.1474141389999999],"5767168":[1.8511002809999999,1.865586035],"12582912":[4.4238938929999998,4.4795740259999999],"1600":[6.1013e-05,6.1725999999999998e-05],"136":[5.6890000000000001e-06,5.7559999999999996e-06],"232":[8.3999999999999992e-06,8.8890000000000008e-06],"7077888":[1.9283323450000001,2.0240807639999998],"86016":[0.0055613190000000012,0.0059455429999999993],"31744":[0.0013879459999999999,0.0014668939999999996],"168":[6.4649999999999999e-06,8.2989999999999997e-06],"622592":[0.083127890999999982,0.12973189500000001],"108":[3.8870000000000002e-06,4.1250000000000003e-06],"327680":[0.028510382000000001,0.03169099999999999],"2176":[8.6575000000000004e-05,9.5007999999999996e-05],"3328":[0.00012729700000000001,0.000138868],"1":[6.5999999999999995e-08,7.1e-08],"2":[7.3000000000000005e-08,9.5999999999999999e-08],"3":[9.9999999999999995e-08,1.1300000000000001e-07],"4":[1.0700000000000001e-07,1.14e-07],"7424":[0.00029256799999999999,0.0003340769999999999],"5":[1.2100000000000001e-07,1.35e-07],"23552":[0.0012121600000000001,0.0013034770000000002],"6":[1.49e-07,1.67e-07],"61440":[0.0032040599999999995,0.0033447340000000007],"491520":[0.050993273999999998,0.087741271999999995],"77824":[0.004870915,0.0048714869999999999],"7":[1.5800000000000001e-07,1.8099999999999999e-07],"8":[1.8799999999999999e-07,1.92e-07],"208":[7.8609999999999998e-06,7.8609999999999998e-06],"9":[1.97e-07,2.05e-07],"73728":[0.0043466269999999996,0.0047043130000000008],"304":[1.3134e-05,1.4938e-05],"400":[1.4586999999999999e-05,1.6005e-05],"1310720":[0.28762480400000001,0.36197693799999997],"336":[1.537e-05,1.6358000000000002e-05],"3670016":[0.95614076599999998,0.95797912500000004],"6656":[0.00025614499999999994,0.00026557599999999995],"15360":[0.00066218899999999999,0.00074698199999999998],"432":[1.5475e-05,1.7130999999999999e-05],"950272":[0.166442909,0.230082288],"655360":[0.088919784000000029,0.142119367],"69632":[0.0038929479999999994,0.0040303409999999998],"11264":[0.00055491200000000007,0.00058419200000000009],"2752512":[0.76619136099999996,0.78472269100000003],"8126464":[2.3389416110000001,2.3426607669999999],"27648":[0.0011644229999999999,0.00123759],"368":[1.6286e-05,1.6866000000000001e-05],"65536":[0.0036165299999999997,0.0036678410000000002],"16252928":[4.9064198689999996],"464":[1.8448999999999999e-05,1.9368000000000002e-05],"1015808":[0.190047137,0.249955709],"3072":[0.00014680799999999998,0.00016003599999999998],"110592":[0.0068869629999999986,0.0069822999999999994],"237568":[0.017309524999999999,0.018832596],"278528":[0.021434151000000005,0.024868472999999999],"496":[1.9632000000000001e-05,2.0380000000000001e-05],"13107200":[3.7206698390000001,3.8079817340000002],"9961472":[3.0316248520000002,3.087370822],"5888":[0.00027740099999999993,0.00030827400000000004],"11010048":[3.5468308149999999,3.5516077670000001],"1920":[7.5932000000000004e-05,8.0939000000000006e-05],"2490368":[0.65768491200000001,0.68864068499999997],"19456":[0.00091533600000000032,0.00098132800000000006],"57344":[0.0029193040000000002,0.0029984960000000007],"1179648":[0.24237740099999999,0.29936792699999998],"4718592":[1.343433635,1.3705805180000001],"360448":[0.035955959000000023,0.038515145000000008],"1572864":[0.38368052000000002,0.38788954899999994],"53248":[0.0025817030000000003,0.0026377449999999995],"3456":[0.000130989,0.00013723300000000001],"40960":[0.00205893,0.0020876860000000005],"4608":[0.00019781900000000004,0.000210225],"13824":[0.00057189000000000003,0.00059795599999999996],"819200":[0.13584807300000001,0.17457789600000001],"983040":[0.18363178300000005,0.24786169799999999],"8704":[0.00036324599999999996,0.00038295800000000003],"120":[4.4360000000000004e-06,4.7829999999999998e-06],"1024":[4.1539000000000003e-05,4.6329000000000003e-05],"49152":[0.0027305070000000005,0.0029648670000000004],"524288":[0.057222505000000035,0.086465674999999992],"45056":[0.0024501310000000004,0.0024629220000000002],"229376":[0.016689941,0.017897652],"2688":[0.00012283800000000001,0.000141781],"152":[6.2609999999999999e-06,6.3389999999999998e-06],"5120":[0.000227951,0.000241461],"1507328":[0.35811713700000003,0.46489377799999998],"1216":[5.2791999999999999e-05,5.3582999999999998e-05],"1966080":[0.47038504599999997,0.47274885500000002],"1900544":[0.44384552099999997,0.44820634299999995],"184":[8.5930000000000006e-06,8.901e-06],"7936":[0.00031831600000000002,0.00031910700000000001],"3801088":[0.98610778099999996,1.001993817],"6815744":[1.8306346069999999,1.9345891040000001],"124":[4.9640000000000002e-06,5.2170000000000002e-06],"102400":[0.0062192869999999996,0.0062874840000000012],"311296":[0.026479074000000002,0.034761462],"1408":[6.0344999999999999e-05,7.0174999999999998e-05],"393216":[0.039768012000000005,0.046755003000000003],"4352":[0.00017801200000000002,0.00019710999999999999],"6553600":[1.78642305,1.8417671979999999],"20480":[0.00099212800000000032,0.001011489],"608":[2.5191999999999999e-05,2.7231999999999999e-05],"2228224":[0.55450220400000005,0.55838127599999998],"36864":[0.0016988160000000001,0.001816268],"704":[3.0491e-05,3.1035999999999999e-05],"720896":[0.109090836,0.169564089],"800":[2.8721000000000002e-05,3.0074999999999999e-05],"2621440":[0.70297721300000005,0.70674393700000004],"425984":[0.042068527000000008,0.043312359999999994],"32768":[0.0014696430000000001,0.001502305],"12058624":[4.0978983979999999,4.1199641680000001],"128":[5.1080000000000001e-06,5.1150000000000002e-06],"180224":[0.01448904,0.014769493],"224":[8.6920000000000008e-06,8.7730000000000005e-06],"736":[3.3714999999999998e-05,3.4962000000000002e-05],"320":[1.3709999999999999e-05,1.4503e-05],"557056":[0.063514294999999998,0.103348459],"832":[3.2261000000000002e-05,3.3018999999999997e-05],"9437184":[2.8832090199999998,2.9663944889999998],"3584":[0.00015138899999999998,0.00015314299999999998],"6291456":[2.1166882500000002,2.1390827250000002],"256":[9.8109999999999997e-06,1.0603e-05],"15204352":[4.5280698289999997,4.5676065799999996],"28672":[0.0012238489999999999,0.0012768269999999999],"768":[3.6726e-05,3.8152000000000003e-05],"212992":[0.015082531999999999,0.015879161000000003],"864":[3.3161999999999999e-05,3.4987000000000002e-05],"352":[1.4589999999999999e-05,1.7620000000000001e-05],"253952":[0.019434361000000004,0.020607896000000001],"960":[3.6226000000000002e-05,4.3881999999999998e-05],"24576":[0.001304036,0.001340174],"7680":[0.00031963400000000001,0.000361999],"294912":[0.024421821,0.026220315000000001],"1048576":[0.201595723,0.26341768200000004],"10485760":[3.3042918600000002,3.3777792280000001],"344064":[0.030862341000000005,0.035003846000000005],"288":[1.1817999999999999e-05,1.2429000000000001e-05],"1152":[4.8863000000000003e-05,5.0235999999999998e-05],"384":[1.6682000000000001e-05,1.791e-05],"2304":[9.2814999999999998e-05,0.00010521],"896":[3.2614000000000003e-05,3.6229999999999997e-05],"480":[1.7977000000000001e-05,1.8851e-05],"1441792":[0.33532479999999998,0.40810610600000002],"992":[4.0849000000000001e-05,4.1294999999999997e-05],"3968":[0.00016322300000000005,0.00017053900000000004],"6400":[0.000244794,0.00026681900000000001],"1344":[5.7284000000000002e-05,6.1051999999999998e-05],"126976":[0.0083089209999999986,0.0085289360000000008],"2883584":[0.82448186099999998,0.88961673600000002],"753664":[0.11998561500000005,0.17813249],"16384":[0.00072446299999999995,0.00075464399999999995],"131072":[0.0089915290000000016,0.0092056529999999994],"458752":[0.045857664000000006,0.080768099999999995],"172032":[0.013471545,0.015765078999999998],"12288":[0.00062985000000000016,0.000728391],"14680064":[4.2793317110000002,4.4202503029999995],"1536":[7.7313999999999999e-05,8.0727000000000001e-05],"25600":[0.001063601,0.0010832509999999999],"1835008":[0.42409144500000001,0.43432336199999999],"10752":[0.00049048199999999988,0.00050428499999999993],"21504":[0.0010393260000000001,0.001111896],"7602176":[2.1138727990000001,2.1508776639999998],"5632":[0.000271966,0.000273205],"10":[2.2100000000000001e-07,2.5400000000000002e-07],"3145728":[0.95198343299999999,0.95582660100000005],"245760":[0.018434167999999994,0.018796245],"1728":[6.6711000000000006e-05,6.9017999999999995e-05],"11":[2.6899999999999999e-07,2.8000000000000002e-07],"1114112":[0.21833557100000001,0.28769989600000001],"12":[2.6300000000000001e-07,2.67e-07],"7340032":[1.952104963,2.0501746500000002],"7168":[0.00027824599999999995,0.00030277499999999992],"13":[2.79e-07,3.0400000000000002e-07],"6029312":[1.9695488839999999,1.979159079],"14":[2.9700000000000003e-07,3.46e-07],"3200":[0.000118819,0.00013172300000000001],"20":[7.1099999999999995e-07,8.8299999999999995e-07],"204800":[0.014372719000000001,0.016544269],"15":[3.2399999999999999e-07,3.8599999999999999e-07],"13312":[0.00052138100000000001,0.00054626400000000008],"4980736":[1.4443805860000001,1.4726561139999998],"118784":[0.0077642049999999989,0.0078031660000000003],"51200":[0.0024597340000000003,0.0026453890000000002],"16":[5.82e-07,7.0399999999999995e-07],"21":[8.47e-07,8.5899999999999995e-07],"917504":[0.16406187999999999,0.22053141900000001],"22":[8.4900000000000005e-07,9.540000000000001e-07],"4864":[0.000211144,0.00024538299999999995],"17":[6.5099999999999999e-07,7.3399999999999998e-07],"14848":[0.00060156900000000015,0.00064860899999999997],"23":[8.7199999999999997e-07,8.9800000000000002e-07],"786432":[0.13002369199999997,0.18190479100000001],"18":[6.8999999999999996e-07,7.7899999999999997e-07],"1638400":[0.36223803900000001,0.38048494799999999],"7864320":[2.2142060969999999,2.2492295919999998],"24":[1.0839999999999999e-06,1.223e-06],"14155776":[4.1086494,7.6220281100000005],"19":[6.8400000000000004e-07,7.5099999999999999e-07],"30":[1.2270000000000001e-06,1.2720000000000001e-06],"25":[8.9100000000000002e-07,9.9000000000000005e-07],"31":[1.156e-06,1.2160000000000001e-06],"1280":[5.6087e-05,6.1781999999999999e-05],"26":[9.8599999999999996e-07,1.0070000000000001e-06],"3932160":[1.042579973,1.0786109450000001],"2432":[0.000114156,0.00012280799999999999],"32":[1.144e-06,1.2470000000000001e-06],"27":[1.0049999999999999e-06,1.0499999999999999e-06],"409600":[0.035955510000000017,0.040365770000000002]}},{"title":"OrderedDictionary subscript, append","results":{"28":[3.4131800000000001e-06,3.4632300000000001e-06],"34":[4.0007126436781607e-06,4.4555599999999999e-06],"29":[3.4525400000000002e-06,3.5823899999999999e-06],"40":[4.2951898734177219e-06,4.8026600000000004e-06],"17408":[0.0019132692000000001,0.0019893579999999997],"1472":[0.000135525,0.0001452855],"112":[1.2630969999999999e-05,1.2757588235294118e-05],"1376256":[0.23242052999999996,0.33008034400000003],"5242880":[1.501821388,1.5824586565000001],"36":[4.0525300000000001e-06,4.3653200000000001e-06],"42":[4.39806e-06,4.8070217391304347e-06],"11534336":[3.8297669349999999,3.9284712394999999],"114688":[0.014174173,0.0144246735],"144":[1.455918e-05,1.5915969999999999e-05],"38":[4.2575000000000003e-06,4.6420700000000004e-06],"240":[2.5927000000000001e-05,2.701944e-05],"9216":[0.00094918639999999979,0.0010731060000000003],"44":[4.7880370370370367e-06,5.2282600000000002e-06],"1664":[0.00020100000000000001,0.00020122683673469383],"196608":[0.021798836499999998,0.024511251000000001],"155648":[0.018289494,0.018982236],"2816":[0.00026751599999999998,0.00027937725714285712],"50":[6.0450300000000001e-06,6.2195600000000003e-06],"2359296":[0.54162556799999995,0.58223395199999994],"46":[4.8471499999999998e-06,5.5276200000000008e-06],"176":[1.7136469999999999e-05,1.7969660000000002e-05],"52":[6.2993099999999998e-06,6.6666400000000001e-06],"272":[2.8580023255813956e-05,3.0183879999999999e-05],"116":[1.3284060000000001e-05,1.3644659999999999e-05],"47104":[0.0049222909999999996,0.0049797319999999997],"6912":[0.00079194699999999977,0.00082921500000000001],"1856":[0.00020019800000000001,0.00020290574418604652],"48":[4.9786299999999996e-06,5.2769500000000004e-06],"2097152":[0.47162275799999998,0.48205997700000003],"54":[6.4151800000000003e-06,6.5629999999999997e-06],"2031616":[0.43774948349999998,0.45940404200000001],"43008":[0.0043887695000000004,0.004571683],"60":[6.8958799999999998e-06,6.8974100000000001e-06],"30720":[0.0034169679999999994,0.003656571],"56":[6.62409e-06,6.6352600000000004e-06],"62":[7.3993599999999996e-06,7.4065600000000001e-06],"58":[6.70616e-06,6.7285099999999999e-06],"3014656":[0.68903836500000004,0.76825032700000007],"64":[7.1196800000000001e-06,7.8391900000000004e-06],"8388608":[3.0078949530000001,3.1687899110000002],"29696":[0.0034353220000000002,0.0034825429999999998],"216":[2.4926369999999997e-05,2.510479e-05],"106496":[0.013473437,0.014153569],"72":[7.6636900000000001e-06,7.9490400000000007e-06],"442368":[0.065626875499999987,0.087386695],"147456":[0.017509017499999998,0.018172458999999995],"4456448":[1.3032441619999999,1.3981432865000001],"63488":[0.007119518,0.0072000480000000006],"38912":[0.0040677830000000002,0.004084074],"68":[7.6526599999999993e-06,8.2953699999999998e-06],"188416":[0.020629469000000001,0.022400234000000002],"248":[2.7778719999999997e-05,2.7944919999999999e-05],"80":[8.2322799999999994e-06,8.5595800000000005e-06],"2560":[0.00023817550000000001,0.00026661700000000003],"34816":[0.0036684,0.0038470944999999999],"3712":[0.000410851,0.00042492057142857147],"3538944":[1.0933648124999999,1.1264660019999999],"76":[8.1975599999999998e-06,8.3632499999999999e-06],"4194304":[1.2131681050000001,1.253407945],"851968":[0.15835423100000001,0.18265532900000001],"4096":[0.00043697500000000004,0.00047816557894736847],"59392":[0.0067400749999999982,0.0072210599999999988],"84":[8.7007600000000004e-06,9.1229799999999992e-06],"3276800":[1.0280406025,1.0961354765],"55296":[0.006452223,0.0068729500000000001],"688128":[0.09718648249999999,0.12512558800000001],"8192":[0.0009008642000000002,0.0009335217],"10240":[0.0010121570000000001,0.0010193385555555554],"15872":[0.001758248,0.0018120726000000001],"92":[9.1331599999999998e-06,9.5139000000000005e-06],"26624":[0.0032055059999999995,0.00326736],"1792":[0.00020822946341463416,0.00021844479069767437],"11776":[0.001178132625,0.0011968526250000001],"2944":[0.00028723376470588235,0.00029748269696969697],"88":[8.7590399999999997e-06,9.8627400000000007e-06],"22528":[0.00219263025,0.0023687084999999995],"1245184":[0.21955059299999999,0.25969102199999999],"15728640":[6.2906055744999998,6.4969380790000004],"96":[9.8292700000000005e-06,1.016907e-05],"1984":[0.000218414,0.0002236418604651163],"139264":[0.016342921,0.0176645315],"475136":[0.069317943000000048,0.077083143499999979],"13631488":[5.8659390734999999,6.2373424350000004],"416":[4.8695e-05,4.9009134020618555e-05],"928":[0.0001030952857142857,0.0001062882222222222],"512":[5.5250190000000001e-05,5.5572999999999998e-05],"18432":[0.0019772970000000454,0.0020041049999999999],"16777216":[6.6124015695000002],"9728":[0.0009653200000000002,0.0010596894444444449],"1769472":[0.39278343699999996,0.39806412099999999],"1703936":[0.40719920999999998,0.41237101199999998],"2048":[0.000215334,0.00022448799999999998],"14336":[0.0016468959999999997,0.0016571560000000003],"448":[5.0373e-05,5.1577019999999999e-05],"5505024":[1.6128504324999999,1.621025395],"544":[5.7314410958904114e-05,5.9612209999999999e-05],"221184":[0.030753212999999995,0.031076340500000001],"90112":[0.0095504050000000014,0.0096904350000000007],"640":[6.1121e-05,6.42145e-05],"12800":[0.0015674888333333339,0.0016098845000000004],"262144":[0.033609997500000002,0.036877659],"589824":[0.082817516499999994,0.103927747],"884736":[0.153673009,0.192281012],"6144":[0.0006007894375,0.00063055286666666664],"1088":[0.00011715212500000001,0.00011738099999999999],"576":[5.5961000000000002e-05,6.1464344262295083e-05],"160":[1.5179e-05,1.714821e-05],"672":[6.6452120000000002e-05,6.8490909999999999e-05],"8912896":[3.1046880049999999,3.1151113234999999],"100":[1.1887e-05,1.2538510000000001e-05],"507904":[0.072610269500000019,0.093964193500000029],"3840":[0.00042050099999999994,0.00044164095454545438],"192":[1.766677e-05,1.8482129999999999e-05],"376832":[0.048357193,0.049349316000000004],"98304":[0.0103303895,0.010459763],"5376":[0.00053850141176470571,0.00054217800000000004],"94208":[0.0095868610000000021,0.0096570649999999994],"81920":[0.0085176830000000016,0.009114891],"3407872":[1.088433582,1.2403161279999999],"104":[1.1727333333333334e-05,1.2359770000000001e-05],"122880":[0.014518149499999997,0.016211926499999998],"200":[2.283271e-05,2.3220350000000002e-05],"163840":[0.018283392499999999,0.019639162000000005],"4063232":[1.1835713700000001,1.2328832025000001],"5767168":[1.7497404570000001,1.861719269],"12582912":[4.2256711295000002,4.6354130419999997],"1600":[0.00018748062,0.00020431799999999999],"136":[1.4238670000000001e-05,1.5310119999999999e-05],"232":[2.5184330000000001e-05,2.6542800000000003e-05],"7077888":[2.7023797825,3.0175797394999999],"86016":[0.0088644180000000024,0.009483254],"31744":[0.0034491320000000006,0.0037137189999999999],"168":[1.5088e-05,1.6594899999999999e-05],"622592":[0.085872005000000015,0.118328503],"108":[1.23675e-05,1.2391126984126983e-05],"327680":[0.0403214805,0.042855259],"2176":[0.00021809000000000005,0.00023258300000000002],"3328":[0.00039457200000000004,0.00040888529166666668],"1":[3.1411999999999996e-07,3.1742999999999995e-07],"2":[3.2227999999999995e-07,3.2917999999999999e-07],"3":[5.7967000000000005e-07,6.4133000000000009e-07],"4":[6.2928000000000003e-07,6.3584000000000006e-07],"7424":[0.00085571336363636367,0.00088850719999999993],"5":[9.8190999999999993e-07,9.9761000000000005e-07],"23552":[0.0023699579999999993,0.0024181879999999995],"6":[9.3447000000000003e-07,1.0042000000000001e-06],"61440":[0.0069648459999999994,0.007286158],"491520":[0.072287596999999995,0.087797725499999993],"77824":[0.008337812,0.009272904000000002],"7":[9.6058000000000004e-07,9.9046000000000004e-07],"8":[9.9251000000000009e-07,1.01746e-06],"208":[2.4142999999999999e-05,2.4607e-05],"9":[1.24113e-06,1.2546200000000002e-06],"73728":[0.007828125,0.0092734879999999999],"304":[3.037408e-05,3.1613380000000003e-05],"400":[4.7089750000000001e-05,4.7849249999999999e-05],"1310720":[0.22770431499999999,0.3160278755],"336":[3.4224770000000003e-05,3.4280869047619048e-05],"3670016":[1.102340879,1.170751637],"6656":[0.00077730200000000001,0.00078249299999999988],"15360":[0.0017443910000000001,0.0018294305999999999],"432":[4.6125999999999998e-05,4.9723179999999997e-05],"950272":[0.16562922999999999,0.215409929],"655360":[0.093778009999999995,0.119176674],"69632":[0.0077313969999999992,0.0084422539999999997],"11264":[0.001081221,0.0011431273750000001],"2752512":[0.63161173299999995,0.68039536950000001],"8126464":[2.9540946789999998,3.0010873364999999],"27648":[0.0033843800000000002,0.0034054615],"368":[3.4992e-05,3.5584999999999999e-05],"65536":[0.0076439640000000005,0.0078855799999999997],"16252928":[6.3787899399999999],"464":[5.2474741176470593e-05,5.392673913043478e-05],"1015808":[0.16631617650000002,0.22364450999999999],"3072":[0.00029494051612903225,0.00029667141935483865],"110592":[0.0138223945,0.014114340999999999],"237568":[0.0314894155,0.033565175000000017],"278528":[0.035593208000000001,0.044091500999999998],"496":[5.2813630000000001e-05,5.4863450000000004e-05],"13107200":[5.7254373760000004,6.0197488520000002],"9961472":[3.3564856385000001,3.4402799465],"5888":[0.00054295500000000013,0.0005874660625],"11010048":[3.6130090250000002,3.7099175770000001],"1920":[0.00020948214893617016,0.0002174096744186046],"2490368":[0.56848044649999996,0.60497669450000002],"19456":[0.0019877319999999999,0.002037142],"57344":[0.0069285569999999975,0.0070901619999999997],"1179648":[0.20966325899999999,0.28139297949999997],"4718592":[1.417008273,1.4842427040000001],"360448":[0.045531322500000027,0.048226626499999994],"1572864":[0.27549138399999995,0.29531052499999999],"53248":[0.0063688690000000018,0.0067929780000000007],"3456":[0.000376759,0.00041609999999999998],"40960":[0.0042237919999999997,0.0042367959999999993],"4608":[0.00047341199999999999,0.00050761005263157892],"13824":[0.001586388,0.0016593910000000001],"819200":[0.14991543900000001,0.21187166699999999],"983040":[0.16839905999999999,0.218347919],"8704":[0.00089578899999999992,0.0009579145999999998],"120":[1.3097e-05,1.362128e-05],"1024":[0.000104935,0.00010857454545454546],"49152":[0.0048599949999999998,0.0050622150000000001],"524288":[0.075952637000000017,0.094149346999999994],"45056":[0.0046129689999999998,0.0046918615],"229376":[0.030353824500000005,0.032442277000000005],"2688":[0.00026382454054054056,0.000301751],"152":[1.507308e-05,1.622551e-05],"5120":[0.00050163699999999998,0.00053066311111111121],"1507328":[0.27163489499999999,0.37191472199999998],"1216":[0.00011940581690140842,0.00012277699999999999],"1966080":[0.42934781249999998,0.47593677499999998],"1900544":[0.42507013999999999,0.43151482399999996],"184":[1.7609980000000001e-05,1.8442359999999999e-05],"7936":[0.00084222500000000005,0.00088139900000000005],"3801088":[1.122663698,1.1576876115000001],"6815744":[2.636174569,2.9772870509999998],"124":[1.389623e-05,1.407139e-05],"102400":[0.013210778999999997,0.014149044499999999],"311296":[0.039173324999999995,0.043219067],"1408":[0.000134062,0.00014133446969696964],"393216":[0.049217262499999997,0.052170850999999963],"4352":[0.00044978699999999994,0.00046740809999999992],"6553600":[2.7787497779999999,2.9151463514999998],"20480":[0.0021047317500000003,0.0022525732499999998],"608":[6.1279999999999996e-05,6.3016500000000002e-05],"2228224":[0.489902277,0.51004029100000003],"36864":[0.0038946040000000003,0.0040433650000000002],"704":[6.8536659090909083e-05,7.0372973684210526e-05],"720896":[0.099527958,0.13493869750000001],"800":[9.9728000000000005e-05,0.000100592],"2621440":[0.56845083149999998,0.64704510299999995],"425984":[0.065415296999999997,0.068741874999999966],"32768":[0.0035801815000000002,0.0036260655000000001],"12058624":[3.9872582419999998,4.1084566960000002],"128":[1.3838288659793815e-05,1.4355290000000001e-05],"180224":[0.020632604499999995,0.021645325],"224":[2.4258999999999999e-05,2.4807000000000002e-05],"736":[7.0401209999999546e-05,7.0724825000000006e-05],"320":[3.0956149999999997e-05,3.3069989999999999e-05],"557056":[0.078630952000000004,0.097440718000000023],"832":[9.6671968749999988e-05,9.8181159090909081e-05],"9437184":[3.3579817360000002,3.610648968],"3584":[0.00040766921739130433,0.00041641308695652176],"6291456":[1.9356792115000001,1.9493406090000001],"256":[2.6775446153846154e-05,2.8729472222222224e-05],"15204352":[6.2047992570000003,6.4370175960000005],"28672":[0.0033424090000000002,0.0033506309999999997],"768":[6.7051000000000006e-05,7.2272000000000002e-05],"212992":[0.029597671000000002,0.031341108999999992],"864":[9.9677157894736837e-05,0.00010795258888888888],"352":[3.3497739999999999e-05,3.5871119999999997e-05],"253952":[0.033787154999999999,0.034506301000000017],"960":[0.00010567418181818184,0.00010815625],"24576":[0.0024077040000000001,0.0024822139999999999],"7680":[0.00084302599999999998,0.00092194180000000018],"294912":[0.037250172999999998,0.045129117999999996],"1048576":[0.17940088300000001,0.22613790499999997],"10485760":[3.4987157464999998,3.7373271350000001],"344064":[0.041816639999999995,0.046314138999999997],"288":[2.8673000000000001e-05,3.1228430000000003e-05],"1152":[0.00012005629870129875,0.00012226336363636362],"384":[3.6520080000000002e-05,3.814139e-05],"2304":[0.00023242400000000004,0.00024754900000000001],"896":[9.3807000000000005e-05,0.0001034885],"480":[5.0201999999999998e-05,5.1543709999999993e-05],"1441792":[0.25457512650000003,0.35150197350000001],"992":[0.00010492814285714287,0.00010778200000000002],"3968":[0.00043259508695652171,0.0004580797142857142],"6400":[0.00073814799999999999,0.00080801800000000008],"1344":[0.00013193953521126764,0.00013366841891891885],"126976":[0.014777611499999996,0.01535837],"2883584":[0.68852313099999995,0.76357808800000004],"753664":[0.1074236095,0.13650372699999999],"16384":[0.0018193201999999996,0.0019412888000000001],"131072":[0.015581091,0.016942341],"458752":[0.068244609000000012,0.081420763000000007],"172032":[0.019911555000000001,0.020862100000000001],"12288":[0.0012162060000000001,0.0013158728571428574],"14680064":[6.0670519829999998,6.6902159299999999],"1536":[0.00014148166666666664,0.00015471999999999998],"25600":[0.0031732190000000006,0.0031781096666666669],"1835008":[0.41971562100000004,0.45014511749999997],"10752":[0.0010483279999999998,0.0011004419999999999],"21504":[0.0021840510000000002,0.002276611],"7602176":[2.7573524895000001,2.8749860429999998],"5632":[0.00051998799999999998,0.00057749458823529404],"10":[1.30753e-06,1.3856999999999999e-06],"3145728":[0.72288578049999996,0.75202595700000008],"245760":[0.031928313,0.0328526585],"1728":[0.00020463577777777775,0.00022129716279069772],"11":[1.3527799999999999e-06,1.3936600000000001e-06],"1114112":[0.18992440899999999,0.24752837],"12":[1.36904e-06,1.4053899999999999e-06],"7340032":[2.6768624335000002,2.8202444830000002],"7168":[0.00083582999999999986,0.00089718118181818154],"13":[1.3765000000000001e-06,1.4148e-06],"6029312":[1.8091288379999999,1.823493891],"14":[1.3466199999999999e-06,1.3793599999999998e-06],"3200":[0.00039026699999999991,0.00039171888],"20":[2.3332899999999999e-06,2.41139e-06],"204800":[0.029012976499999999,0.029027127],"15":[1.3473200000000001e-06,1.5078499999999999e-06],"13312":[0.001569575833333333,0.001624489],"4980736":[1.526782681,1.5571238759999999],"118784":[0.014463921000000001,0.014844332],"51200":[0.0063847520000000005,0.0066888600000000005],"16":[1.8733783783783784e-06,1.9555899999999997e-06],"21":[2.42486e-06,2.4339199999999998e-06],"917504":[0.16126749900000001,0.21743332800000001],"22":[2.5006600000000002e-06,2.56971e-06],"4864":[0.00050154394736842093,0.00053924959999999999],"17":[2.17336e-06,2.33271e-06],"14848":[0.001660836,0.001800107],"23":[2.5187799999999998e-06,2.6985699999999999e-06],"786432":[0.1142927945,0.14495073999999999],"18":[2.17109e-06,2.30253e-06],"1638400":[0.38050711449999997,0.41541028800000002],"7864320":[2.813124819,2.8954172040000001],"24":[2.4752894736842108e-06,2.9679400000000003e-06],"14155776":[5.9952038385000002,11.312830225999999],"19":[2.2814100000000002e-06,2.2882200000000001e-06],"30":[3.5073700000000001e-06,3.5518500000000001e-06],"25":[3.2187799999999999e-06,3.4885899999999997e-06],"31":[3.4123299999999999e-06,3.6600800000000002e-06],"1280":[0.000121014,0.00012622237499999999],"26":[3.4392800000000001e-06,3.4999000000000002e-06],"3932160":[1.135496702,1.2325149],"2432":[0.000243396,0.0002568393157894737],"32":[3.8788500000000001e-06,3.8910499999999998e-06],"27":[3.3244299999999999e-06,3.3903900000000003e-06],"409600":[0.065028918000000033,0.068882552999999999]}},{"title":"OrderedDictionary subscript, remove existing","results":{"28":[3.4379999999999999e-06,4.5070000000000002e-06],"2432":[0.025182270999999999,0.026819523999999994],"29":[3.8229999999999997e-06,4.899e-06],"704":[0.0022007319999999999,0.0022595370000000003],"54":[1.5412000000000001e-05,1.5568000000000001e-05],"640":[0.0017318519999999997,0.0018407860000000001],"7424":[0.226031539,0.23885248100000001],"80":[3.0806000000000003e-05,3.1526999999999998e-05],"1792":[0.012903448,0.013103628000000001],"12800":[0.67954415199999996,0.69583699700000001],"480":[0.00094506199999999977,0.000990379],"544":[0.001196435,0.0012650700000000001],"608":[0.001605581,0.0016996749999999999],"56":[1.3882e-05,1.5722e-05],"464":[0.00094124600000000007,0.00094667899999999997],"58":[1.5769000000000001e-05,1.6022e-05],"1984":[0.015030853,0.015485552],"448":[0.00080921899999999991,0.00085933699999999973],"384":[0.00067091700000000004,0.00073277899999999981],"4352":[0.078211804999999995,0.081170095999999997],"84":[3.5009999999999999e-05,3.6798999999999998e-05],"368":[0.00062298900000000001,0.00062453899999999991],"2816":[0.037086085999999997,0.037518762999999997],"288":[0.00033086699999999988,0.00039189999999999998],"14336":[0.85311931299999999,0.86961838899999999],"88":[4.4808000000000002e-05,4.6026000000000003e-05],"1088":[0.004796682,0.0054220229999999998],"1280":[0.0067689639999999997,0.007204480000000001],"832":[0.0025811970000000008,0.0026413540000000003],"9728":[0.42682448099999998,0.43763564899999996],"1472":[0.0096482930000000005,0.010416220999999951],"672":[0.0019196599999999997,0.0020809939999999996],"736":[0.0023824750000000002,0.0025141390000000003],"2304":[0.021434150000000003,0.022545059999999999],"576":[0.001319495,0.001433683],"8192":[0.275917945,0.29767718300000001],"1664":[0.010742266,0.011134254],"496":[0.00099587500000000002,0.0010031339999999999],"6656":[0.17720233699999999,0.18543539099999995],"30":[3.7749999999999999e-06,3.9879999999999998e-06],"1856":[0.013241596999999999,0.013807492999999999],"31":[4.4499999999999997e-06,4.481e-06],"9216":[0.36762989199999996,0.38719089200000001],"32":[4.7010000000000004e-06,5.062e-06],"3584":[0.051465463000000003,0.052930933999999999],"960":[0.003679426,0.0038483720000000005],"34":[5.3469999999999998e-06,7.5769999999999996e-06],"10752":[0.53994188799999998,0.55396007800000002],"864":[0.0028539190000000003,0.0030252550000000006],"928":[0.0034190050000000001,0.003446345],"60":[1.6473e-05,2.0004e-05],"1152":[0.0052306639999999995,0.0053058670000000006],"36":[6.5560000000000004e-06,6.8199999999999999e-06],"6144":[0.18381499100000001,0.19537563799999999],"4608":[0.091029434000000006,0.097705021000000003],"768":[0.0026639259999999996,0.0029075780000000001],"62":[1.9958000000000001e-05,2.0103999999999999e-05],"38":[6.3210000000000001e-06,7.0149999999999998e-06],"3968":[0.063393541999999997,0.066619249000000019],"1344":[0.0077541579999999997,0.007894402],"64":[1.696e-05,2.2226e-05],"3072":[0.045328688999999991,0.047527970999999995],"1":[7.1999999999999996e-08,7.7999999999999997e-08],"1536":[0.011419927,0.011497309000000001],"2":[8.6999999999999998e-08,8.9000000000000003e-08],"92":[4.4128000000000002e-05,5.3915999999999997e-05],"3":[1.02e-07,1.04e-07],"4":[1.1899999999999999e-07,1.42e-07],"68":[2.1739999999999999e-05,2.3710000000000002e-05],"5888":[0.16236366999999999,0.170107746],"5":[1.42e-07,1.4600000000000001e-07],"12288":[0.75033799599999995,0.78980538199999994],"6":[1.6299999999999999e-07,1.8400000000000001e-07],"7":[1.8099999999999999e-07,2.34e-07],"1920":[0.014272244,0.014568652],"1728":[0.011499348,0.012056734],"6912":[0.195018678,0.20204965999999999],"8":[2.2100000000000001e-07,2.34e-07],"992":[0.0040028340000000003,0.0041148479999999999],"9":[2.8299999999999998e-07,3.1199999999999999e-07],"96":[4.1980000000000001e-05,4.7525000000000003e-05],"3456":[0.047336925000000002,0.049530092000000005],"10240":[0.482284887,0.49302884499999999],"896":[0.002971736,0.0032372130000000001],"13824":[0.80349705699999996,0.817991515],"3840":[0.059296659000000015,0.061420040999999995],"1024":[0.0041753270000000004,0.0042748400000000002],"100":[4.4177000000000001e-05,5.1533000000000003e-05],"5376":[0.13356105600000001,0.13681254700000001],"10":[2.9799999999999999e-07,3.9000000000000002e-07],"1216":[0.0063150639999999996,0.0065588930000000005],"11":[3.46e-07,3.5999999999999999e-07],"6400":[0.16654915100000001,0.16859956300000001],"12":[3.2399999999999999e-07,6.0100000000000005e-07],"13":[4.2100000000000002e-07,4.9999999999999998e-07],"1408":[0.0093968549999999991,0.0095024820000000013],"1600":[0.0096640029999999957,0.010066184000000001],"14":[4.0400000000000002e-07,4.9800000000000004e-07],"200":[0.00017100699999999998,0.00017269299999999997],"15":[4.15e-07,6.2900000000000003e-07],"40":[6.1580000000000002e-06,8.6670000000000002e-06],"120":[6.5937000000000002e-05,7.3219000000000005e-05],"112":[5.6033999999999999e-05,6.7306999999999998e-05],"16":[1.711e-06,2.1160000000000002e-06],"104":[4.9728999999999998e-05,5.4731999999999997e-05],"17":[1.7060000000000001e-06,2.3829999999999999e-06],"42":[7.1740000000000003e-06,9.3179999999999996e-06],"7680":[0.238882908,0.25578926099999999],"18":[2.1799999999999999e-06,2.4830000000000002e-06],"13312":[0.72655546299999996,0.73949119500000005],"3328":[0.042811195000000003,0.046654350999999997],"19":[2.3709999999999998e-06,2.6469999999999998e-06],"44":[9.0920000000000004e-06,1.083e-05],"2688":[0.031638918000000002,0.032712605999999998],"46":[1.0738e-05,1.3876000000000001e-05],"72":[2.3923000000000001e-05,2.6389000000000001e-05],"3712":[0.055812094,0.056652817000000008],"124":[7.7126000000000007e-05,7.8669000000000002e-05],"8704":[0.32115918700000001,0.33916485600000001],"48":[1.0728e-05,1.3858e-05],"116":[6.1786999999999996e-05,6.5986000000000001e-05],"108":[5.486e-05,5.8635999999999999e-05],"15872":[1.0689553940000001],"400":[0.00068226700000000007,0.00069260100000000015],"320":[0.00043469800000000002,0.000485026],"76":[2.8750000000000001e-05,2.9762999999999999e-05],"240":[0.00024792599999999998,0.000251446],"304":[0.00037414699999999991,0.00042606500000000005],"232":[0.00021204700000000001,0.000222952],"5632":[0.14956863300000001,0.15488184299999999],"160":[0.000105647,0.00013134299999999997],"224":[0.000212559,0.00021671799999999999],"152":[0.000111996,0.00012747600000000001],"216":[0.000196212,0.00020086],"144":[9.0889000000000003e-05,0.000112457],"208":[0.00019311900000000001,0.00020022899999999998],"7168":[0.20663963699999999,0.223230558],"136":[8.6854999999999994e-05,9.6464000000000003e-05],"2176":[0.019244826,0.019776571],"11776":[0.6843321,0.69370384900000004],"128":[8.2615999999999996e-05,8.6466999999999997e-05],"3200":[0.040286646000000009,0.042065500999999991],"2560":[0.027401868000000003,0.030215083],"4096":[0.066303512999999981,0.071304880999999987],"5120":[0.11808965299999996,0.12217386700000001],"512":[0.0011244720000000001,0.0011512689999999995],"15360":[0.99033402800000003,1.0378937260000001],"432":[0.00069061300000000008,0.00077453000000000005],"20":[2.5859999999999999e-06,2.7350000000000001e-06],"2944":[0.04071146199999999,0.041282583999999969],"352":[0.00054717900000000007,0.00063881099999999998],"416":[0.00068776600000000003,0.00075642400000000001],"21":[2.4600000000000002e-06,2.9579999999999999e-06],"7936":[0.26015291100000004,0.26794780400000001],"272":[0.000315185,0.00035622300000000008],"336":[0.00051674800000000003,0.00053449900000000013],"22":[2.9270000000000001e-06,3.016e-06],"192":[0.00019033200000000001,0.00020146299999999998],"256":[0.00027466000000000003,0.00030137799999999999],"23":[3.2650000000000001e-06,3.3900000000000002e-06],"184":[0.00017476200000000002,0.00018854599999999997],"248":[0.00026309199999999998,0.00027252800000000002],"11264":[0.60190850100000004,0.63447642199999998],"176":[0.000162666,0.00016917500000000001],"24":[4.0219999999999998e-06,5.1819999999999997e-06],"168":[0.000130223,0.00015058999999999998],"25":[2.5909999999999998e-06,3.5439999999999999e-06],"50":[1.322e-05,1.3305000000000001e-05],"4864":[0.10581689699999997,0.106993671],"2048":[0.016138133999999998,0.016607598000000005],"14848":[0.935068605,0.94813183599999995],"26":[2.571e-06,2.9210000000000001e-06],"27":[2.4880000000000001e-06,3.0759999999999999e-06],"800":[0.0024993069999999997,0.0026822299999999999],"52":[1.1951e-05,1.341e-05]}},{"title":"OrderedDictionary subscript, remove missing","results":{"28":[6.0399999999999996e-07,7.1399999999999996e-07],"34":[8.5000000000000001e-07,9.9600000000000008e-07],"29":[6.7299999999999995e-07,7.8000000000000005e-07],"40":[9.7600000000000006e-07,1.19e-06],"17408":[0.00063274200000000027,0.00067708200000000007],"1472":[7.5362000000000001e-05,7.7751999999999997e-05],"112":[2.4839999999999998e-06,2.7769999999999998e-06],"1376256":[0.208787641,0.29528462599999999],"5242880":[1.198327312,1.2039853789999999],"36":[9.7399999999999991e-07,1.1739999999999999e-06],"42":[1.1039999999999999e-06,2.131e-06],"11534336":[3.4749375970000003,3.5165421430000001],"114688":[0.0044197339999999998,0.0044909820000000001],"144":[3.7009999999999998e-06,4.5070000000000002e-06],"38":[1.009e-06,1.252e-06],"240":[5.7300000000000002e-06,6.117e-06],"9216":[0.00033530800000000004,0.00037240199999999992],"44":[1.266e-06,2.3070000000000001e-06],"1664":[4.5461999999999999e-05,4.6403999999999998e-05],"196608":[0.019011473000000004,0.019587048000000003],"155648":[0.0087431160000000004,0.008825678],"2816":[0.00013909299999999996,0.000156448],"50":[1.037e-06,1.158e-06],"2359296":[0.38138390500000002,0.39499994100000002],"46":[1.2389999999999999e-06,1.658e-06],"176":[6.1580000000000002e-06,8.3480000000000004e-06],"52":[1.1519999999999999e-06,1.189e-06],"272":[7.0559999999999999e-06,8.0080000000000002e-06],"116":[2.6259999999999999e-06,2.7779999999999999e-06],"47104":[0.0027086759999999997,0.00272668],"6912":[0.000200075,0.00020742699999999996],"1856":[5.4721e-05,5.8257999999999997e-05],"48":[1.5430000000000001e-06,2.1239999999999999e-06],"2097152":[0.28844029199999999,0.29141372100000001],"54":[1.1650000000000001e-06,1.3289999999999999e-06],"2031616":[0.25662216500000001,0.26897839000000001],"43008":[0.0020061709999999997,0.0020882129999999994],"60":[1.39e-06,1.468e-06],"30720":[0.00098147399999999997,0.0010251730000000001],"56":[1.2240000000000001e-06,1.2580000000000001e-06],"62":[1.468e-06,1.5629999999999999e-06],"58":[1.3179999999999999e-06,1.375e-06],"3014656":[0.853598792,0.88482439199999996],"64":[1.457e-06,1.903e-06],"8388608":[1.530304487,1.5402039059999999],"29696":[0.00093040600000000016,0.00095560600000000012],"216":[4.9989999999999999e-06,5.1429999999999997e-06],"106496":[0.003828138,0.0040755800000000005],"72":[1.9580000000000001e-06,2.1349999999999999e-06],"442368":[0.022276052999999997,0.041819117000000003],"147456":[0.0082819149999999991,0.0083476340000000013],"4456448":[0.79511966599999995,0.82681549399999998],"63488":[0.0023190860000000006,0.0023536129999999996],"38912":[0.0015424119999999999,0.001586723],"68":[1.562e-06,1.691e-06],"188416":[0.015745323000000002,0.016793783],"248":[6.0399999999999998e-06,6.5150000000000003e-06],"80":[2.2869999999999999e-06,2.9330000000000001e-06],"2560":[0.000114101,0.000114418],"34816":[0.001239034,0.0013123],"3712":[0.000110715,0.000113955],"3538944":[0.50997983199999997,0.53731397800000003],"76":[2.2649999999999999e-06,2.8770000000000002e-06],"4194304":[0.69060135700000003,0.71024030900000001],"851968":[0.060253334000000013,0.08474371],"4096":[0.00012982400000000001,0.00013824100000000002],"59392":[0.0020230819999999998,0.0023678730000000004],"84":[2.948e-06,3.5310000000000002e-06],"3276800":[0.443752696,0.45522653899999999],"55296":[0.0018610739999999997,0.001867851],"688128":[0.060436332999999988,0.089638831000000002],"8192":[0.00027073899999999998,0.00030112900000000008],"10240":[0.00042503000000000001,0.0004449989999999999],"15872":[0.00051830400000000003,0.00056358499999999991],"92":[3.596e-06,6.4880000000000004e-06],"26624":[0.00076039400000000007,0.00081106700000000006],"1792":[5.1650999999999997e-05,6.0364e-05],"11776":[0.00063771699999999999,0.00072623800000000004],"2944":[0.00015643699999999999,0.00016987300000000002],"88":[3.3890000000000001e-06,3.6380000000000002e-06],"22528":[0.0012146080000000001,0.0012651369999999999],"1245184":[0.14771010000000001,0.21004563200000004],"15728640":[2.89780199,2.9599336699999999],"96":[3.783e-06,4.3139999999999997e-06],"1984":[5.9861000000000002e-05,6.1852000000000003e-05],"139264":[0.0066449790000000005,0.0073443309999999999],"475136":[0.026517518000000018,0.032838143],"13631488":[2.2282246190000001,2.2965614649999999],"416":[8.9199999999999993e-06,1.0325e-05],"928":[2.4771999999999999e-05,2.7070999999999999e-05],"512":[1.4892000000000001e-05,1.5364999999999999e-05],"18432":[0.00068991799999999998,0.00074326799999999995],"16777216":[3.2398897350000002],"9728":[0.00038025500000000002,0.00041301],"1769472":[0.201093402,0.21095065099999999],"1703936":[0.19019968800000001,0.19988821099999998],"2048":[6.5681999999999999e-05,6.7831999999999997e-05],"14336":[0.00043928700000000001,0.00047793299999999999],"448":[1.0789e-05,1.1928e-05],"5505024":[1.4091627680000001,1.41352805],"544":[1.6059e-05,1.7275e-05],"221184":[0.0097018690000000001,0.0099433940000000012],"90112":[0.0053437460000000008,0.0053678550000000004],"640":[2.2977999999999999e-05,2.4953e-05],"12800":[0.00037365,0.00037449199999999998],"262144":[0.013338664,0.013969538],"589824":[0.040207906000000002,0.050496339999999994],"884736":[0.064978246999999975,0.090597983000000007],"6144":[0.00041334600000000004,0.00042754100000000003],"1088":[3.6832999999999998e-05,3.9833000000000003e-05],"576":[1.8448e-05,1.8893e-05],"160":[4.4240000000000003e-06,5.2089999999999996e-06],"672":[2.5998000000000001e-05,3.1705999999999998e-05],"8912896":[1.7341629519999999,1.7474056149999999],"100":[1.9630000000000001e-06,2.131e-06],"507904":[0.030019122000000002,0.035987105999999998],"3840":[0.00011848699999999999,0.00012894],"192":[9.5869999999999999e-06,1.1114999999999999e-05],"376832":[0.035673558000000001,0.036927457999999996],"98304":[0.0072641519999999985,0.0076103279999999995],"5376":[0.00024183900000000004,0.00024703099999999999],"94208":[0.0061694949999999988,0.006314489999999999],"81920":[0.0038951479999999998,0.004065183],"3407872":[0.47670538200000001,0.50470499599999996],"104":[2.2510000000000001e-06,2.401e-06],"122880":[0.0048914890000000006,0.0052743880000000005],"200":[4.0679999999999998e-06,4.1470000000000003e-06],"163840":[0.010428144,0.010827592],"4063232":[0.65110492099999995,0.65854167200000002],"5767168":[1.641961985,1.6626448489999999],"12582912":[4.9397030409999996,5.293446994],"1600":[4.0061000000000002e-05,4.0463000000000002e-05],"136":[3.5650000000000002e-06,3.9140000000000001e-06],"232":[5.3310000000000003e-06,5.8080000000000001e-06],"7077888":[1.104227487,1.1884390580000002],"86016":[0.0045280659999999999,0.0046840220000000004],"31744":[0.001045919,0.001110045],"168":[5.4450000000000004e-06,5.6269999999999997e-06],"622592":[0.047388834000000005,0.066816635999999985],"108":[2.4660000000000002e-06,2.5950000000000001e-06],"327680":[0.023493707000000006,0.024679199000000002],"2176":[7.4684999999999994e-05,8.0381000000000002e-05],"3328":[9.3029000000000007e-05,9.4760999999999996e-05],"1":[5.2999999999999998e-08,5.5000000000000003e-08],"2":[5.5999999999999999e-08,5.7000000000000001e-08],"3":[5.5000000000000003e-08,5.8000000000000003e-08],"4":[5.5999999999999999e-08,5.8000000000000003e-08],"7424":[0.000227135,0.00025318899999999996],"5":[6.1999999999999999e-08,6.8999999999999996e-08],"23552":[0.0014020899999999999,0.0014387759999999999],"6":[6.8999999999999996e-08,8.0000000000000002e-08],"61440":[0.0021600510000000001,0.0023326090000000002],"491520":[0.027919269,0.036201416],"77824":[0.0036100640000000005,0.0037288809999999999],"7":[7.3000000000000005e-08,8.9000000000000003e-08],"8":[8.4999999999999994e-08,1.06e-07],"208":[4.8720000000000001e-06,5.2449999999999998e-06],"9":[1.1000000000000001e-07,1.14e-07],"73728":[0.0031176490000000001,0.003526221],"304":[9.3430000000000002e-06,1.0176e-05],"400":[8.8270000000000004e-06,8.8710000000000003e-06],"1310720":[0.173432696,0.269148214],"336":[1.1891e-05,1.4508999999999999e-05],"3670016":[0.54153019899999999,0.551269228],"6656":[0.00019603400000000001,0.00021063000000000001],"15360":[0.00052826700000000002,0.00053482300000000003],"432":[1.0516000000000001e-05,1.102e-05],"950272":[0.074851655999999975,0.121962986],"655360":[0.052977112,0.080449602999999995],"69632":[0.0027870170000000001,0.0028421969999999999],"11264":[0.00058821999999999998,0.00059501200000000001],"2752512":[0.59709516500000004,0.63926933600000002],"8126464":[1.45323563,1.4540036119999999],"27648":[0.00083443700000000005,0.00084758499999999987],"368":[1.5218000000000001e-05,1.9456000000000001e-05],"65536":[0.0024573779999999996,0.0025749939999999997],"16252928":[3.054326804],"464":[1.1668000000000001e-05,1.3437e-05],"1015808":[0.086738886000000015,0.14067149500000001],"3072":[0.00018728700000000001,0.00020129300000000001],"110592":[0.0041276479999999994,0.0041355480000000002],"237568":[0.010976668,0.011859558000000001],"278528":[0.015216084,0.016799013000000008],"496":[1.3336000000000001e-05,1.3866000000000001e-05],"13107200":[2.096006402,2.1512203209999998],"9961472":[2.2129911509999998,2.2491325820000001],"5888":[0.00032361,0.00032938100000000001],"11010048":[2.8613645390000002,2.9861421369999999],"1920":[6.0949999999999998e-05,6.3015999999999994e-05],"2490368":[0.43614167799999998,0.483398667],"19456":[0.00080955999999999997,0.00083772100000000015],"57344":[0.00203068,0.0020553560000000004],"1179648":[0.12907640499999995,0.195148353],"4718592":[0.92044298999999996,0.97716614999999996],"360448":[0.029953628,0.030742061999999997],"1572864":[0.35730198000000002,0.37440788300000005],"53248":[0.0016742620000000004,0.001708958],"3456":[9.9074999999999996e-05,0.000116505],"40960":[0.001763803,0.001801181],"4608":[0.00016851999999999999,0.00018007099999999999],"13824":[0.00043128999999999997,0.00044313099999999998],"819200":[0.056106500999999996,0.087138103000000022],"983040":[0.085435021999999999,0.116136106],"8704":[0.000306722,0.00033200900000000013],"120":[2.5660000000000001e-06,2.8229999999999999e-06],"1024":[3.2709000000000001e-05,3.4703999999999998e-05],"49152":[0.0030932620000000003,0.0031564970000000012],"524288":[0.032231527000000017,0.040067402000000002],"45056":[0.002257116,0.0023025770000000005],"229376":[0.010570898,0.01178998],"2688":[0.000111826,0.00012626900000000001],"152":[4.2749999999999997e-06,4.4660000000000001e-06],"5120":[0.00021009800000000001,0.000226059],"1507328":[0.29715911699999997,0.44797919899999999],"1216":[4.3922999999999999e-05,5.2788999999999999e-05],"1966080":[0.24055922800000001,0.25251183700000002],"1900544":[0.22287870400000001,0.236609079],"184":[8.6689999999999995e-06,8.6899999999999998e-06],"7936":[0.00026024499999999999,0.00027168500000000013],"3801088":[0.57689951000000006,0.58762576500000008],"6815744":[1.03943889,1.1225510249999999],"124":[2.9519999999999999e-06,3.1930000000000002e-06],"102400":[0.0035895650000000003,0.003661161],"311296":[0.020222508,0.022004705999999995],"1408":[7.0105999999999996e-05,9.4046e-05],"393216":[0.043832692999999999,0.04574165999999999],"4352":[0.000150426,0.00015491099999999998],"6553600":[1.0026332120000001,1.0511923000000001],"20480":[0.00092097299999999974,0.00096334200000000006],"608":[2.0095999999999999e-05,2.6842000000000002e-05],"2228224":[0.33027005799999998,0.33665621499999998],"36864":[0.001397363,0.001470809],"704":[2.7701000000000001e-05,3.0911000000000003e-05],"720896":[0.070563870000000001,0.115166437],"800":[1.8436000000000001e-05,1.9383999999999999e-05],"2621440":[0.51228074000000001,0.54511933700000004],"425984":[0.021225384,0.023225136],"32768":[0.0011360929999999999,0.001187664],"12058624":[4.1346800659999996,4.1498424829999996],"128":[3.0170000000000001e-06,3.771e-06],"180224":[0.013181613999999998,0.013727063999999997],"224":[5.0209999999999999e-06,5.1189999999999996e-06],"736":[3.4495000000000001e-05,3.6613999999999999e-05],"320":[1.1846e-05,1.2510999999999999e-05],"557056":[0.034713648999999999,0.045567764999999996],"832":[2.0268999999999999e-05,2.1475e-05],"9437184":[1.9866913020000001,2.0617063519999999],"3584":[0.000114403,0.000117228],"6291456":[2.4298584600000002,2.47091942],"256":[6.0079999999999999e-06,8.7150000000000004e-06],"15204352":[2.7452735420000001,2.7545203030000001],"28672":[0.00086986099999999988,0.00093161600000000002],"768":[4.0973000000000002e-05,4.3472e-05],"212992":[0.0098389959999999992,0.00984844],"864":[2.3144999999999999e-05,2.4346999999999999e-05],"352":[1.4634000000000001e-05,1.4919000000000001e-05],"253952":[0.012712940000000001,0.013194143],"960":[2.8544999999999999e-05,3.0235000000000001e-05],"24576":[0.0015897399999999999,0.001682869],"7680":[0.00024339000000000007,0.00026763699999999999],"294912":[0.017451636,0.018943312],"1048576":[0.091575084000000029,0.13085321999999999],"10485760":[2.510512334,2.625582428],"344064":[0.025348302,0.027815277000000006],"288":[7.9670000000000001e-06,8.1750000000000005e-06],"1152":[4.0515000000000001e-05,4.1739999999999997e-05],"384":[2.2810999999999999e-05,2.9454999999999998e-05],"2304":[8.6040999999999998e-05,8.6300999999999999e-05],"896":[2.5089999999999999e-05,2.6993999999999999e-05],"480":[1.1807999999999999e-05,1.4561e-05],"1441792":[0.243561263,0.36047945000000003],"992":[3.1012000000000001e-05,3.4853e-05],"3968":[0.00012492800000000001,0.00013263000000000001],"6400":[0.000177095,0.00019164600000000001],"1344":[5.7506999999999997e-05,6.101e-05],"126976":[0.0054314489999999997,0.005483819],"2883584":[0.73118796200000002,0.803463708],"753664":[0.083725479999999991,0.13035431500000005],"16384":[0.00060486900000000007,0.00060909699999999996],"131072":[0.0059475730000000003,0.0061543250000000004],"458752":[0.025182794000000001,0.035604494],"172032":[0.011304765,0.011802729],"12288":[0.000775456,0.00079840399999999995],"14680064":[2.5733192890000001,2.671302904],"1536":[8.7818000000000005e-05,0.000112044],"25600":[0.00071442599999999999,0.00071871999999999962],"1835008":[0.21812404599999999,0.22950001200000003],"10752":[0.00049235799999999992,0.00051522900000000008],"21504":[0.00099954100000000006,0.00104984],"7602176":[1.2570555159999999,1.2792596949999999],"5632":[0.00026517899999999994,0.00028768100000000019],"10":[1.17e-07,1.1899999999999999e-07],"3145728":[1.0454828329999999,1.0533866169999999],"245760":[0.011799153999999997,0.01223773],"1728":[4.7067999999999997e-05,4.9326000000000002e-05],"11":[1.24e-07,1.35e-07],"1114112":[0.10951947300000001,0.16404189499999999],"12":[1.3799999999999999e-07,1.4600000000000001e-07],"7340032":[1.160841886,1.2093636679999999],"7168":[0.000214897,0.00023228499999999999],"13":[1.4000000000000001e-07,1.5599999999999999e-07],"6029312":[1.9828748789999999,2.002322393],"14":[1.61e-07,1.7800000000000001e-07],"3200":[8.6013999999999993e-05,9.2523999999999997e-05],"20":[4.9399999999999995e-07,5.4499999999999997e-07],"204800":[0.0084015920000000011,0.0093535119999999979],"15":[1.7599999999999999e-07,2.0699999999999999e-07],"13312":[0.00039156299999999999,0.0004091840000000001],"4980736":[1.0564332970000001,1.0606932120000001],"118784":[0.0047836390000000001,0.0048275570000000378],"51200":[0.0015808740000000001,0.0017029040000000003],"16":[3.34e-07,4.9399999999999995e-07],"21":[5.5799999999999999e-07,7.8299999999999996e-07],"917504":[0.073348898999999995,0.111382699],"22":[6.2099999999999996e-07,8.2799999999999995e-07],"4864":[0.00018279200000000003,0.00019483899999999998],"17":[4.2199999999999999e-07,5.4099999999999999e-07],"14848":[0.000482096,0.00048480599999999995],"23":[7.2200000000000003e-07,9.879999999999999e-07],"786432":[0.09912509500000001,0.15852353999999999],"18":[4.4200000000000001e-07,4.9599999999999999e-07],"1638400":[0.17407519500000002,0.20293286399999999],"7864320":[1.36740661,1.3689461600000001],"24":[9.8700000000000004e-07,1.136e-06],"14155776":[2.47944195,4.4182656790000001],"19":[4.7800000000000002e-07,5.7999999999999995e-07],"30":[6.7000000000000004e-07,6.7700000000000004e-07],"25":[5.7800000000000001e-07,5.8699999999999995e-07],"31":[6.8500000000000001e-07,7.4099999999999998e-07],"1280":[5.0614e-05,5.6085999999999998e-05],"26":[5.2900000000000004e-07,6.8199999999999999e-07],"3932160":[0.61044986999999995,0.63620956100000003],"2432":[9.3552000000000001e-05,9.3770999999999994e-05],"32":[7.61e-07,7.9699999999999995e-07],"27":[5.3600000000000004e-07,6.1900000000000002e-07],"409600":[0.019645765999999999,0.021421828]}},{"title":"OrderedDictionary defaulted subscript, successful lookups","results":{"28":[5.1274999999999998e-07,5.4042999999999992e-07],"34":[6.7533999999999996e-07,7.1350000000000003e-07],"29":[5.5513999999999993e-07,5.6125999999999998e-07],"40":[7.4326999999999996e-07,8.7790999999999995e-07],"17408":[0.000510692947368421,0.0005284253529411764],"1472":[4.0545441860465113e-05,4.3433750000000001e-05],"112":[2.0464200000000001e-06,2.0903499999999998e-06],"1376256":[0.21762593250000001,0.26884385199999999],"5242880":[1.043852244,1.069117976],"36":[6.5920999999999993e-07,6.7786000000000006e-07],"42":[7.9612000000000001e-07,8.6088999999999992e-07],"11534336":[2.6321022169999999,2.6411324860000001],"114688":[0.0048057645000000003,0.0049690029999999987],"144":[2.8759499999999995e-06,3.05109e-06],"38":[6.9164000000000002e-07,7.7498999999999993e-07],"240":[4.8767399999999997e-06,5.0061199999999999e-06],"9216":[0.00024505700000000002,0.00027130700000000004],"44":[8.4402999999999997e-07,8.9907999999999997e-07],"1664":[3.627468918918919e-05,3.8435159999999998e-05],"196608":[0.0124543745,0.012614427500000001],"155648":[0.0079288129999999998,0.0080378459999999978],"2816":[8.3109722222222233e-05,9.1096999999999999e-05],"50":[8.8949999999999991e-07,9.3928000000000003e-07],"2359296":[0.41680073200000001,0.42788540399999997],"46":[8.9655999999999998e-07,9.9548999999999998e-07],"176":[3.7265900000000002e-06,3.9363599999999999e-06],"52":[9.6626000000000013e-07,9.7897999999999994e-07],"272":[5.3925000000000005e-06,5.7104899999999999e-06],"116":[2.1604399999999999e-06,2.2743899999999999e-06],"47104":[0.0016891395999999999,0.0019145169999999999],"6912":[0.00017320564285714288,0.000177259],"1856":[4.2264879999999994e-05,4.2969030000000004e-05],"48":[9.6424000000000006e-07,1.0682499999999999e-06],"2097152":[0.33414236400000003,0.34200326400000003],"54":[1.01987e-06,1.0345099999999999e-06],"2031616":[0.31061128449999997,0.32505768899999998],"43008":[0.0014639469999999997,0.0014912060000000001],"60":[1.16493e-06,1.1930799999999999e-06],"30720":[0.00080772599999999993,0.00090205999999999999],"56":[1.0024199999999998e-06,1.0872299999999999e-06],"62":[1.13425e-06,1.2065799999999999e-06],"58":[1.0886400000000001e-06,1.1162899999999999e-06],"3014656":[0.63775987899999997,0.65700039600000004],"64":[1.2045099999999999e-06,1.2406099999999999e-06],"8388608":[1.535267664,1.550647957],"29696":[0.00078811463636363629,0.00083145600000000017],"216":[4.13875e-06,4.3608400000000001e-06],"106496":[0.0043063520000000011,0.0045114430000000004],"72":[1.4115e-06,1.4299099999999999e-06],"442368":[0.024831268,0.053556199499999999],"147456":[0.007278886,0.0075610310000000002],"4456448":[0.79403926150000004,0.82593409299999998],"63488":[0.0022999622499999999,0.0023920599999999997],"38912":[0.0011863080000000001,0.001202276],"68":[1.2814999999999999e-06,1.4477000000000001e-06],"188416":[0.011366975,0.011668456000000001],"248":[4.9454699999999999e-06,5.1190199999999993e-06],"80":[1.5941600000000001e-06,1.71054e-06],"2560":[6.9901880000000001e-05,7.3228569999999997e-05],"34816":[0.001013761,0.001107935],"3712":[8.7783375000000002e-05,9.2787619999999994e-05],"3538944":[0.57486653900000007,0.59196085300000001],"76":[1.4961900000000001e-06,1.5745900000000001e-06],"4194304":[0.71739315999999997,0.72193356600000003],"851968":[0.10356523799999995,0.1187793545],"4096":[0.000102149,0.000108695],"59392":[0.002000286,0.0021213372499999999],"84":[1.7516400000000001e-06,1.8620999999999999e-06],"3276800":[0.507340719,0.51914009800000005],"55296":[0.0018022310000000003,0.0018904986000000002],"688128":[0.071188667000000011,0.10145354400000001],"8192":[0.00020805999999999998,0.000229309],"10240":[0.00030671400000000003,0.0003074706],"15872":[0.00043264663636363634,0.00044405900000000001],"92":[1.9294699999999999e-06,2.1237200000000002e-06],"26624":[0.00064843599999999996,0.00069977199999999987],"1792":[4.0940219999999999e-05,4.1727409090909093e-05],"11776":[0.00039631240000000004,0.00039688599999999994],"2944":[9.0346000000000005e-05,9.1137000000000005e-05],"88":[1.8725400000000001e-06,1.93943e-06],"22528":[0.00076229299999999982,0.00079481399999999992],"1245184":[0.18594676800000001,0.21715870749999999],"15728640":[2.9672444499999999,2.978128066],"96":[2.12244e-06,2.4579600000000002e-06],"1984":[4.482773e-05,4.8441990000000007e-05],"139264":[0.0064451940000000013,0.0064471059999999993],"475136":[0.030820623999999998,0.043348240000000003],"13631488":[2.5808318689999998,2.5835518325],"416":[8.2507099999999995e-06,8.5797899999999997e-06],"928":[1.9615549999999999e-05,1.9824360000000003e-05],"512":[1.1112380000000001e-05,1.1657440000000001e-05],"18432":[0.00054257199999999963,0.0005627169999999999],"16777216":[3.253266123],"9728":[0.00028205500000000002,0.00029573799999999993],"1769472":[0.26253704100000003,0.27285550250000001],"1703936":[0.2496774665,0.25053936100000002],"2048":[4.8176240000000004e-05,4.9930175257731963e-05],"14336":[0.0003916350454545455,0.00041812699999999991],"448":[8.9280600000000007e-06,9.3892800000000003e-06],"5505024":[1.1488471035000001,1.1524798110000001],"544":[1.1741620000000001e-05,1.243914e-05],"221184":[0.0096827610000000015,0.0097753480000000014],"90112":[0.0044279790000000003,0.0044636260000000001],"640":[1.543519e-05,1.5744999999999999e-05],"12800":[0.00031441999999999999,0.00031672299999999998],"262144":[0.012696365000000001,0.0144476595],"589824":[0.067392519499999998,0.067581100500000019],"884736":[0.098758868,0.13310044049999997],"6144":[0.00022452599999999998,0.000236047],"1088":[2.5488210000000002e-05,2.8386149999999999e-05],"576":[1.2977189999999999e-05,1.329121e-05],"160":[3.0821699999999999e-06,3.6899099999999999e-06],"672":[1.602195e-05,1.7519709999999998e-05],"8912896":[1.685015854,1.6974769679999999],"100":[1.8305300000000001e-06,1.93756e-06],"507904":[0.033844784500000002,0.051777410499999996],"3840":[0.00010018585714285713,0.000101306],"192":[4.5104799999999997e-06,4.6901600000000002e-06],"376832":[0.026088796000000004,0.028521505499999999],"98304":[0.0052045120000000014,0.0053288280000000007],"5376":[0.00016780013793103447,0.000168154],"94208":[0.0048675764999999999,0.0048883640000000001],"81920":[0.0035504219999999997,0.0038548219999999999],"3407872":[0.52311505700000005,0.55091099700000001],"104":[1.9001499999999999e-06,1.9116999999999998e-06],"122880":[0.0052153089999999996,0.005346946],"200":[3.7591499999999998e-06,3.7931800000000002e-06],"163840":[0.0085406450000000012,0.0087998929999999996],"4063232":[0.69164276499999999,0.70193546299999998],"5767168":[1.2541039265,1.2602449885],"12582912":[3.1153251879999999,3.4212554239999999],"1600":[3.4829230000000004e-05,3.5412649999999997e-05],"136":[2.69463e-06,2.84008e-06],"232":[4.4622000000000002e-06,4.8463700000000003e-06],"7077888":[1.1999791529999999,1.233258527],"86016":[0.0040263949999999995,0.0042143610000000007],"31744":[0.00092241280000000499,0.00092982399999999988],"168":[3.3896900000000001e-06,4.0528260869565216e-06],"622592":[0.055509516999999967,0.08688115099999999],"108":[1.9113299999999998e-06,2.0185100000000001e-06],"327680":[0.022461360499999999,0.0290988805],"2176":[5.2353965517241386e-05,5.558523e-05],"3328":[7.6450109999999996e-05,8.3671000000000006e-05],"1":[4.2400000000000002e-09,4.4299999999999998e-09],"2":[5.6800000000000002e-09,5.69e-09],"3":[7.0299999999999999e-09,7.5899999999999988e-09],"4":[9.2400000000000004e-09,9.46e-09],"7424":[0.00018787200000000001,0.000196479],"5":[1.18e-08,1.1880000000000001e-08],"23552":[0.00081979999999999987,0.00085577499999999992],"6":[1.503e-08,1.503e-08],"61440":[0.00217643175,0.0022800870000000005],"491520":[0.031968653,0.045685405999999998],"77824":[0.0033568389999999995,0.003565462000000001],"7":[1.8580000000000002e-08,1.8629999999999999e-08],"8":[2.3120000000000001e-08,2.482e-08],"208":[3.9175833333333337e-06,3.9341899999999997e-06],"9":[2.887e-08,3.0319999999999996e-08],"73728":[0.0029417089999999998,0.0034309574999999994],"304":[6.5803400000000006e-06,6.8560300000000005e-06],"400":[7.7184300000000009e-06,7.7581299999999999e-06],"1310720":[0.209765333,0.24959208999999999],"336":[7.9003199999999993e-06,8.0109400000000009e-06],"3670016":[0.60294125899999995,0.60802193900000001],"6656":[0.00016121739344262292,0.00017192099999999998],"15360":[0.00041646900000000004,0.0004183730000000001],"432":[8.4441900000000005e-06,8.56294e-06],"950272":[0.11331499849999999,0.14785504099999999],"655360":[0.059419469999999974,0.095604570999999999],"69632":[0.0027036859999999994,0.0027328249999999999],"11264":[0.000346261,0.00037663700000000003],"2752512":[0.51931301299999999,0.55316594750000003],"8126464":[1.4632799890000001,1.4757727109999998],"27648":[0.00074111100000000014,0.00074384784615384616],"368":[8.9112500000000004e-06,9.3390300000000003e-06],"65536":[0.0024143312499999999,0.0025504933333333332],"16252928":[3.115326166],"464":[9.6184799999999998e-06,9.9482600000000015e-06],"1015808":[0.12807729749999999,0.160581211],"3072":[0.0001018555,0.00010944749999999999],"110592":[0.0045964830000000002,0.0047557120000000005],"237568":[0.011075788999999999,0.011995644999999999],"278528":[0.014309597,0.015830624499999998],"496":[1.043763e-05,1.06909e-05],"13107200":[2.4035228050000002,2.4468212879999998],"9961472":[1.9711037199999999,1.980998405],"5888":[0.00018943236538461543,0.00019506450000000001],"11010048":[2.3514400814999998,2.4025457480000001],"1920":[4.1573999999999999e-05,4.3526889999999998e-05],"2490368":[0.44351560750000002,0.45353259899999998],"19456":[0.00056277600000000007,0.000595376],"57344":[0.0020442800000000086,0.0020446230000000002],"1179648":[0.16423607949999999,0.2071761855],"4718592":[0.87453742999999995,0.95388938499999998],"360448":[0.024978275000000005,0.025881644999999998],"1572864":[0.29558016300000001,0.29660606099999998],"53248":[0.0017033506000000004,0.0017890896],"3456":[8.0136949999999992e-05,8.6311200000000008e-05],"40960":[0.001338283,0.0013912483333333337],"4608":[0.00012374800000000002,0.00013535999999999998],"13824":[0.00035997899999999996,0.00036663500000000003],"819200":[0.090247126000000011,0.11270538400000001],"983040":[0.123658327,0.14474970399999998],"8704":[0.00023584100000000003,0.00024706199999999999],"120":[2.25299e-06,2.2751200000000002e-06],"1024":[2.2419906250000001e-05,2.3552749999999999e-05],"49152":[0.001921896,0.0019649357499999997],"524288":[0.039447704,0.064729715000000021],"45056":[0.0015774136666666667,0.0016474025999999996],"229376":[0.010840794499999999,0.010992867],"2688":[7.3916000000000002e-05,7.7560460000000001e-05],"152":[3.0946199999999997e-06,3.5764800000000003e-06],"5120":[0.00015608257142857139,0.000156317],"1507328":[0.27225724000000001,0.32281007449999999],"1216":[3.0267990000000002e-05,3.0349571428571426e-05],"1966080":[0.285778529,0.30249616400000001],"1900544":[0.27486296049999998,0.29445629950000002],"184":[4.0322051282051278e-06,4.3368800000000002e-06],"7936":[0.00019589500000000002,0.00021439388888888888],"3801088":[0.62489079599999997,0.63693995799999992],"6815744":[1.125096584,1.168732712],"124":[2.4798500000000001e-06,2.6131800000000001e-06],"102400":[0.0041351424999999994,0.0041407715000000012],"311296":[0.017303019499999999,0.0193668535],"1408":[4.0561520000000003e-05,4.2979925925925928e-05],"393216":[0.030671026499999983,0.032616929500000016],"4352":[0.000110612,0.00011610274999999999],"6553600":[1.0703706184999999,1.1046244750000001],"20480":[0.00067279664285714287,0.000672918],"608":[1.4212680000000001e-05,1.429469e-05],"2228224":[0.3636808305,0.36676516300000001],"36864":[0.0011106810000000001,0.001205508625],"704":[1.7406279999999998e-05,1.8089860000000002e-05],"720896":[0.08151225400000002,0.120527711],"800":[1.6156660000000001e-05,1.6864909999999999e-05],"2621440":[0.49084048149999998,0.49781980999999997],"425984":[0.024241033500000002,0.027259583],"32768":[0.00094856400000000005,0.00095216289999999998],"12058624":[2.8511902039999999,2.8528127445],"128":[2.53852e-06,2.6593800000000002e-06],"180224":[0.0102360065,0.0104314375],"224":[4.30008e-06,4.3358999999999994e-06],"736":[1.9245270000000001e-05,2.0173290000000001e-05],"320":[7.1397999999999998e-06,8.099519999999999e-06],"557056":[0.0409769065,0.062398045499999985],"832":[1.6863979999999998e-05,1.6909930000000001e-05],"9437184":[1.8758133564999999,1.922627579],"3584":[8.5152860000000007e-05,9.0749599999999996e-05],"6291456":[1.4800308595,1.5608260970000001],"256":[4.9246600000000002e-06,5.5176100000000002e-06],"15204352":[2.8061794080000002,2.859614514],"28672":[0.00076857683333333309,0.000770023],"768":[2.0235000000000002e-05,2.1231000000000001e-05],"212992":[0.0094568839999999987,0.0097509020000000005],"864":[1.7585180000000001e-05,2.0299999999999999e-05],"352":[7.9637399999999991e-06,8.73197e-06],"253952":[0.012594925,0.0126638845],"960":[2.1279300000000001e-05,2.17686e-05],"24576":[0.00091519930000000054,0.00093979520000000006],"7680":[0.000194911,0.00021334246511627903],"294912":[0.016367548500000002,0.016377621999999998],"1048576":[0.13286328950000001,0.16230331649999999],"10485760":[2.1958941680000001,2.24209434],"344064":[0.022392924000000002,0.022546028999999995],"288":[5.7329600000000006e-06,6.1519899999999999e-06],"1152":[2.8470790000000001e-05,2.8580260000000002e-05],"384":[9.5851200000000005e-06,1.085749e-05],"2304":[5.6464e-05,5.9811649999999998e-05],"896":[1.844063e-05,2.00085e-05],"480":[1.0194119999999999e-05,1.0405115789473685e-05],"1441792":[0.24983585200000002,0.29677932200000001],"992":[2.2391059999999997e-05,2.2631029999999999e-05],"3968":[0.000102428,0.00010310900000000002],"6400":[0.00015142190566037734,0.00016026999999999998],"1344":[3.5337189999999997e-05,3.569322e-05],"126976":[0.0055489670000000001,0.005567794],"2883584":[0.59704014149999995,0.61211710500000005],"753664":[0.096789929499999997,0.13095003799999999],"16384":[0.00046617100000000003,0.00046740099999999999],"131072":[0.0061190019999999993,0.0062514770000000001],"458752":[0.030392052999999995,0.049899259999999987],"172032":[0.0092551509999999997,0.0098214085],"12288":[0.00044658400000000003,0.00044824800000000016],"14680064":[2.6778433599999998,2.7917420750000002],"1536":[4.5699299999999998e-05,5.0418340659340659e-05],"25600":[0.00065950686666666663,0.00066542621428571438],"1835008":[0.27430655000000004,0.27902711349999998],"10752":[0.0003398648518518518,0.00034040042857142854],"21504":[0.00069516569230769249,0.00075803599999999991],"7602176":[1.3330661070000001,1.3411902265],"5632":[0.00017759900000000002,0.000182957],"10":[3.5299999999999998e-08,3.5700000000000002e-08],"3145728":[0.67793202399999997,0.69704033750000005],"245760":[0.011501918999999998,0.012251346],"1728":[3.773301724137931e-05,3.9632999999999998e-05],"11":[4.1760000000000005e-08,4.196e-08],"1114112":[0.14749965400000001,0.18326560650000001],"12":[4.8640000000000004e-08,5.1039999999999999e-08],"7340032":[1.2390117890000001,1.26467788],"7168":[0.00017622099999999995,0.00018630799999999999],"13":[5.7310000000000002e-08,5.8189999999999994e-08],"6029312":[1.337247077,1.3819629899999999],"14":[6.6000000000000009e-08,6.6460000000000001e-08],"3200":[7.0361416666666664e-05,7.7587890000000009e-05],"20":[3.4819e-07,4.1717000000000002e-07],"204800":[0.0090137140000000008,0.0091236860000000006],"15":[7.8479999999999999e-08,8.2919999999999991e-08],"13312":[0.00032989099999999996,0.00034551199999999997],"4980736":[0.96465287799999999,0.98366281],"118784":[0.0051917449999999993,0.0052742130000000016],"51200":[0.0016021689999999999,0.0016739120000000003],"16":[2.9699000000000001e-07,3.2320000000000004e-07],"21":[3.8206000000000002e-07,4.1486e-07],"917504":[0.11133219599999999,0.13559114900000002],"22":[4.1971000000000004e-07,4.7183000000000001e-07],"4864":[0.00014005335211267605,0.00014446660000000001],"17":[3.1091999999999998e-07,3.2887000000000001e-07],"14848":[0.00040144600000000007,0.00040194899999999997],"23":[4.3966000000000001e-07,5.0081e-07],"786432":[0.097199834499999999,0.13848371200000001],"18":[3.0689999999999998e-07,3.4107999999999998e-07],"1638400":[0.23025046800000001,0.25138282899999997],"7864320":[1.4175424160000001,1.4442366954999999],"24":[4.9292e-07,5.6130000000000003e-07],"14155776":[2.573633686,6.720295256],"19":[3.2411000000000001e-07,3.8811e-07],"30":[5.4904999999999996e-07,5.5163999999999998e-07],"25":[4.5419000000000002e-07,4.5763999999999996e-07],"31":[5.6156000000000001e-07,5.8171000000000004e-07],"1280":[3.0672500000000002e-05,3.1337139999999998e-05],"26":[4.7292000000000003e-07,4.7338000000000002e-07],"3932160":[0.65032582049999998,0.68359171900000004],"2432":[6.3275000000000007e-05,6.5596e-05],"32":[5.8889999999999999e-07,6.0009000000000002e-07],"27":[4.8797000000000005e-07,4.9515999999999999e-07],"409600":[0.021939430499999996,0.023690341]}},{"title":"OrderedDictionary defaulted subscript, unsuccessful lookups","results":{"28":[5.2346999999999996e-07,5.3354e-07],"34":[7.3126000000000005e-07,7.3807999999999995e-07],"29":[5.7357999999999998e-07,6.1204999999999993e-07],"40":[9.8641999999999991e-07,1.1748899999999999e-06],"17408":[0.00064101399999999997,0.000732564],"1472":[7.3031156249999998e-05,7.7453999999999994e-05],"112":[2.27358e-06,2.2746800000000003e-06],"1376256":[0.202122212,0.29354399399999997],"5242880":[1.2075204225,1.2270768009999999],"36":[8.0060000000000001e-07,8.4981000000000006e-07],"42":[1.0564900000000001e-06,1.20578e-06],"11534336":[3.4839233255000002,3.5073777719999999],"114688":[0.0044801305000000003,0.0045234009999999998],"144":[3.3752400000000001e-06,4.0289411764705877e-06],"38":[8.6382000000000002e-07,9.0699999999999996e-07],"240":[4.9423399999999995e-06,5.6308400000000006e-06],"9216":[0.000348537,0.000387394],"44":[1.1365799999999999e-06,1.1667500000000001e-06],"1664":[4.0540000000000001e-05,4.3157430000000003e-05],"196608":[0.0187218525,0.0195615105],"155648":[0.0086203579999999981,0.0087354299999999989],"2816":[0.00014102,0.00014771382089552235],"50":[8.9950000000000003e-07,9.0824999999999994e-07],"2359296":[0.38617416400000004,0.43375843599999997],"46":[1.29772e-06,1.47753e-06],"176":[5.8546599999999998e-06,6.2287499999999994e-06],"52":[1.0097100000000001e-06,1.0524100000000001e-06],"272":[6.2438999999999996e-06,7.4589199999999996e-06],"116":[2.2760299999999999e-06,2.5289099999999999e-06],"47104":[0.002610757,0.0032834675000000002],"6912":[0.00021048230434782606,0.00021550199999999996],"1856":[5.0419e-05,5.206653086419753e-05],"48":[1.35547e-06,1.7457099999999999e-06],"2097152":[0.29078684399999999,0.29818919500000002],"54":[1.02729e-06,1.15919e-06],"2031616":[0.25569324100000002,0.27079028599999999],"43008":[0.0020380897499999999,0.0022801045],"60":[1.3418e-06,1.3578299999999999e-06],"30720":[0.00099244999999999997,0.0011191411250000001],"56":[1.1416400000000001e-06,1.21809e-06],"62":[1.3338799999999999e-06,1.39994e-06],"58":[1.19899e-06,1.3581500000000001e-06],"3014656":[0.85989078399999996,0.89521201800000005],"64":[1.2873900000000001e-06,1.5311700000000001e-06],"8388608":[1.5298460949999999,1.532722374],"29696":[0.00092703000000000002,0.0009552095555555556],"216":[4.4191900000000001e-06,4.6106499999999996e-06],"106496":[0.0037738199999999993,0.0040048920000000003],"72":[1.7155800000000002e-06,1.7399200000000002e-06],"442368":[0.026287269000000002,0.039041028999999991],"147456":[0.0076093800000000007,0.0076208029999999998],"4456448":[0.79454154900000007,0.83150613100000004],"63488":[0.002348082,0.0023796372500000003],"38912":[0.0016372170000000003,0.0016652988],"68":[1.41652e-06,1.6333699999999999e-06],"188416":[0.015631414500000003,0.015928951],"248":[5.6895299999999999e-06,6.3527699999999991e-06],"80":[2.1302899999999999e-06,2.7643600000000003e-06],"2560":[0.000106222,0.00011535475000000002],"34816":[0.0012488880000000003,0.0012900398571428569],"3712":[0.00011082899999999998,0.000112055],"3538944":[0.51499187400000002,0.55275741349999996],"76":[1.74065e-06,2.01444e-06],"4194304":[0.68573301899999994,0.71132068599999998],"851968":[0.060628662,0.087682944000000013],"4096":[0.00013133360000000001,0.00013952600000000001],"59392":[0.0020074939999999999,0.0022780420000000001],"84":[2.6719100000000001e-06,2.8851999999999999e-06],"3276800":[0.451617145,0.45845482700000001],"55296":[0.0018430620000000001,0.0018524256],"688128":[0.0577163095,0.106504354],"8192":[0.0002816450588235294,0.00029919000000000001],"10240":[0.00043972474999999999,0.00045333294999999997],"15872":[0.00055688700000000016,0.0005581145625000001],"92":[3.4910200000000002e-06,3.8844700000000003e-06],"26624":[0.00077602833333333327,0.00081266941666666669],"1792":[4.9863620000000003e-05,5.2074000000000003e-05],"11776":[0.00068382799999999993,0.000720679],"2944":[0.00016301399999999998,0.00017367727777777779],"88":[2.4143299999999999e-06,3.1662799999999999e-06],"22528":[0.0011663820000000001,0.0012193830000000001],"1245184":[0.14696495100000001,0.23857052499999998],"15728640":[2.9168454064999998,2.9719298639999998],"96":[3.3858400000000001e-06,4.7630099999999998e-06],"1984":[6.0291360000000001e-05,6.1462640000000006e-05],"139264":[0.0065070090000000011,0.0066525680000000002],"475136":[0.024262641000000001,0.034073100000000002],"13631488":[2.2272264379999998,2.2942124060000002],"416":[8.4765882352941179e-06,8.8860600000000001e-06],"928":[2.4293969999999999e-05,2.527131e-05],"512":[1.3089309999999999e-05,1.3456500000000001e-05],"18432":[0.00072880176923076942,0.00075427653846153839],"16777216":[3.3208256789999999],"9728":[0.00040991308333333343,0.00042208600000000001],"1769472":[0.214675479,0.2221854845],"1703936":[0.18529343300000001,0.21065069],"2048":[6.3998229999999995e-05,6.4487890000000002e-05],"14336":[0.00046023285,0.00050743999999999984],"448":[9.9385500000000016e-06,1.004738e-05],"5505024":[1.4123755485,1.4264591385000001],"544":[1.496185e-05,1.5194320000000001e-05],"221184":[0.0092560000000000003,0.0094070189999999991],"90112":[0.0052357929999999999,0.0052417309999999995],"640":[2.20916e-05,2.2976000000000002e-05],"12800":[0.00037038199999999994,0.00038874335999999996],"262144":[0.012901874000000002,0.013063514],"589824":[0.0396666725,0.049860179000000004],"884736":[0.063641673500000009,0.10161105400000001],"6144":[0.00042536499999999992,0.0004290390434782608],"1088":[3.4428835616438358e-05,3.5875140624999998e-05],"576":[1.6790830000000001e-05,1.7361150000000002e-05],"160":[4.1668965517241384e-06,4.6186600000000001e-06],"672":[2.41e-05,2.6015690000000002e-05],"8912896":[1.7279695205000001,1.733925282],"100":[1.89525e-06,1.9108100000000003e-06],"507904":[0.026955617999999997,0.054890662],"3840":[0.00012359799999999999,0.0001278265],"192":[1.0805280000000002e-05,1.291646e-05],"376832":[0.036241960499999996,0.036599882],"98304":[0.0073997480000000029,0.0076855870000000007],"5376":[0.000238757075,0.000252527],"94208":[0.0061841540000000016,0.0062322269999999999],"81920":[0.0039277509999999993,0.004098328],"3407872":[0.48309466099999998,0.51675172400000002],"104":[2.0168974358974359e-06,2.1426099999999999e-06],"122880":[0.0049238710000000007,0.0053123440000000001],"200":[3.7748333333333337e-06,3.8714300000000003e-06],"163840":[0.009922321999999999,0.0103909335],"4063232":[0.64973026599999995,0.65570920649999997],"5767168":[1.677648756,1.6818261080000001],"12582912":[5.0069391999999997,5.6905742940000001],"1600":[3.7215999999999997e-05,3.9522951219512193e-05],"136":[3.0258200000000004e-06,3.8778700000000002e-06],"232":[4.7209900000000003e-06,5.40235e-06],"7077888":[1.1288321795,1.18856999],"86016":[0.0045059159999999996,0.0046413490000000003],"31744":[0.0010618769999999999,0.0010989691111111112],"168":[5.09399e-06,5.9573199999999994e-06],"622592":[0.046645830499999992,0.071445156999999981],"108":[2.0825599999999999e-06,2.1264799999999998e-06],"327680":[0.022539532000000001,0.025012101500000002],"2176":[6.9503000000000002e-05,7.5988299999999999e-05],"3328":[9.4224422680412384e-05,9.5719500000000004e-05],"1":[4.1199999999999998e-09,4.3000000000000005e-09],"2":[5.0600000000000003e-09,5.1300000000000003e-09],"3":[6.7999999999999997e-09,6.8100000000000003e-09],"4":[9.2599999999999999e-09,9.2699999999999996e-09],"7424":[0.00023922049999999996,0.00024599799999999998],"5":[1.48e-08,1.48e-08],"23552":[0.001354823,0.001416832],"6":[2.014e-08,2.0169999999999998e-08],"61440":[0.0021436340000000002,0.0022586152499999993],"491520":[0.025521482500000005,0.03292745100000001],"77824":[0.0035687664999999999,0.0039605790000000005],"7":[2.7319999999999999e-08,2.751e-08],"8":[3.6179999999999997e-08,3.7859999999999996e-08],"208":[4.1138899999999998e-06,4.3273299999999996e-06],"9":[4.6630000000000001e-08,4.6859999999999997e-08],"73728":[0.0031501599999999999,0.0031950184999999997],"304":[8.8110000000000009e-06,8.9307900000000003e-06],"400":[8.0479999999999999e-06,8.1290416666666663e-06],"1310720":[0.19381895299999999,0.27367707299999999],"336":[1.081855e-05,1.363203e-05],"3670016":[0.54528863299999997,0.54847089000000004],"6656":[0.00020088200000000002,0.00020339299999999998],"15360":[0.00048381900000000008,0.00053436599999999999],"432":[9.4297200000000002e-06,9.4815900000000001e-06],"950272":[0.074934569999999992,0.11577968],"655360":[0.048955509499999994,0.084250544000000024],"69632":[0.0028140629999999999,0.0028742363333333332],"11264":[0.00058680699999999974,0.00062800399999999982],"2752512":[0.58768176799999994,0.63988097899999996],"8126464":[1.4302858140000001,1.445044099],"27648":[0.00083758699999999988,0.00084337100000000009],"368":[1.4393699999999999e-05,1.7077859999999998e-05],"65536":[0.002422961,0.002523268],"16252928":[3.057265009],"464":[1.0735020000000001e-05,1.111804e-05],"1015808":[0.088593432,0.13893672200000001],"3072":[0.00018577413207547169,0.00021819800000000004],"110592":[0.0041142175000000005,0.0041418990000000001],"237568":[0.010762496999999999,0.013937089],"278528":[0.0148867155,0.015938701499999999],"496":[1.2025219999999999e-05,1.2094980000000001e-05],"13107200":[2.111046596,2.1595557589999999],"9961472":[2.2102718760000002,2.2486609720000001],"5888":[0.00031460499999999987,0.00031738900000000001],"11010048":[2.9690595040000001,3.0048630765],"1920":[5.5680282051282052e-05,5.8637409090909092e-05],"2490368":[0.44783935699999999,0.48000648550000002],"19456":[0.00079629400000000002,0.00080283199999999985],"57344":[0.00199103575,0.00200311875],"1179648":[0.124096857,0.19716366499999999],"4718592":[0.931080452,0.955519377],"360448":[0.029218765000000001,0.029549592499999999],"1572864":[0.36092969799999997,0.37496950649999999],"53248":[0.001630636,0.0017259612000000001],"3456":[9.5965999999999996e-05,0.00010873778021978022],"40960":[0.0017785020000000002,0.0018265906000000001],"4608":[0.00017480100000000001,0.00018393563265306118],"13824":[0.0004382155,0.0004760422000000001],"819200":[0.052048844500000004,0.094077116500000016],"983040":[0.078925113500000005,0.119116531],"8704":[0.00031654399999999998,0.00032761299999999998],"120":[2.4179199999999999e-06,2.5337999999999998e-06],"1024":[2.8908489999999999e-05,3.0041730000000003e-05],"49152":[0.0031514159999999998,0.0031688229999999999],"524288":[0.031054953999999996,0.054866011499999999],"45056":[0.0022587220000000003,0.0025588343333333334],"229376":[0.010296615,0.0104918485],"2688":[0.000115794,0.00013074588157894733],"152":[3.8680000000000001e-06,4.2657684210526317e-06],"5120":[0.00022196099999999996,0.00022311846511627906],"1507328":[0.33596800199999999,0.41110751000000001],"1216":[4.1092220000000001e-05,4.4729899999999993e-05],"1966080":[0.23939041,0.24599037000000001],"1900544":[0.22178903599999999,0.23564080099999996],"184":[7.6833749999999999e-06,8.6167800000000005e-06],"7936":[0.00026728399999999996,0.00027187120000000004],"3801088":[0.579914665,0.60644791900000006],"6815744":[1.06997604,1.118156787],"124":[2.7477200000000001e-06,2.862921052631579e-06],"102400":[0.00359363,0.0038513764999999998],"311296":[0.019365316,0.020636006999999998],"1408":[7.0925552631578956e-05,8.8425444444444444e-05],"393216":[0.043897401000000003,0.046435104000000012],"4352":[0.000154888,0.00016069244262295086],"6553600":[0.98647059299999995,1.0490075839999999],"20480":[0.00089455100000000005,0.00090255399999999964],"608":[1.8532090000000001e-05,1.909225e-05],"2228224":[0.34257591050000002,0.35170440600000002],"36864":[0.0014426118333333334,0.0014743039999999998],"704":[2.5882999999999999e-05,2.8963159999999998e-05],"720896":[0.069360559000000044,0.12009853249999999],"800":[1.8322010000000002e-05,1.8817450000000001e-05],"2621440":[0.51726004550000004,0.53948724999999997],"425984":[0.019150809000000001,0.020674722499999999],"32768":[0.001108043,0.0011543769999999998],"12058624":[4.1702002115000001,4.2179383530000001],"128":[2.6475000000000001e-06,3.3445600000000003e-06],"180224":[0.013332057,0.01340939],"224":[4.6746299999999997e-06,4.7233199999999999e-06],"736":[3.281447e-05,3.5348000000000001e-05],"320":[9.8223499999999992e-06,1.2080500000000001e-05],"557056":[0.031898298499999998,0.042343697499999999],"832":[1.9493489999999998e-05,1.9544850000000003e-05],"9437184":[2.0074059050000002,2.0624848849999999],"3584":[0.00010366591666666669,0.00010973597468354429],"6291456":[2.4623280875,2.6875701154999998],"256":[5.6054399999999991e-06,8.2737599999999992e-06],"15204352":[2.7537136040000001,2.8104834479999998],"28672":[0.00087403300000000008,0.00088642300000000012],"768":[3.7815000000000003e-05,4.043991e-05],"212992":[0.0087910339999999997,0.008883491000000002],"864":[2.0739640000000003e-05,2.1430156249999999e-05],"352":[1.2692379999999999e-05,1.4057989999999999e-05],"253952":[0.012472195,0.012690452999999999],"960":[2.6257500000000001e-05,2.741271e-05],"24576":[0.0017307940000000001,0.0018254129999999997],"7680":[0.00024047400000000002,0.000266068],"294912":[0.017415748000000009,0.017583949000000001],"1048576":[0.09825525800000004,0.13383002799999999],"10485760":[2.5599875710000002,2.6490757454999998],"344064":[0.025341890499999999,0.027046409],"288":[7.1415499999999994e-06,7.8491099999999998e-06],"1152":[3.7436589999999999e-05,3.9663999999999998e-05],"384":[2.0959949999999999e-05,2.8201099999999997e-05],"2304":[8.1218900000000003e-05,8.2277050000000002e-05],"896":[2.2083820000000002e-05,2.3084272727272726e-05],"480":[1.1169730000000001e-05,1.198581e-05],"1441792":[0.25594983500000001,0.37106055100000002],"992":[2.8200523809523813e-05,2.8472660000000003e-05],"3968":[0.00013414516438356162,0.00013514115068493152],"6400":[0.00017880987272727276,0.000204351],"1344":[5.4800999999999999e-05,6.0626100000000006e-05],"126976":[0.005357672,0.0053908249999999993],"2883584":[0.72960444550000003,0.79494987799999994],"753664":[0.083022698500000006,0.11621479700000004],"16384":[0.00060046800000000027,0.0006018079999999999],"131072":[0.005785773000000001,0.0058417599999999997],"458752":[0.022879788500000005,0.033815905],"172032":[0.011243512000000001,0.012049229],"12288":[0.00082651254545454563,0.00086693430000000008],"14680064":[2.5768615850000001,2.6990413759999998],"1536":[8.4295166666666665e-05,8.5758000000000001e-05],"25600":[0.00072423399999999982,0.0007465133076923078],"1835008":[0.21934842399999999,0.240754203],"10752":[0.00049990699999999996,0.00053001283333333317],"21504":[0.0010366500000000001,0.001088772375],"7602176":[1.2841442889999999,1.2906747875],"5632":[0.000275225375,0.00027777300000000004],"10":[5.798e-08,5.798e-08],"3145728":[1.0499304549999999,1.0657328500000001],"245760":[0.011479253999999998,0.011808126],"1728":[4.4489461538461543e-05,4.6724289999999995e-05],"11":[8.622e-08,8.6249999999999995e-08],"1114112":[0.11554463149999999,0.17431371849999999],"12":[1.0044999999999999e-07,1.0050000000000001e-07],"7340032":[1.1864582669999999,1.1931279180000001],"7168":[0.00021928400000000006,0.000233126],"13":[1.1603e-07,1.1603e-07],"6029312":[2.018087988,2.0345286969999998],"14":[1.3295000000000001e-07,1.3295999999999999e-07],"3200":[8.7719940000000003e-05,9.1887359999999994e-05],"20":[4.0840000000000003e-07,4.8963000000000002e-07],"204800":[0.0083765019999999992,0.0085742559999999989],"15":[1.5120999999999999e-07,1.5828000000000001e-07],"13312":[0.00038326699999999991,0.00039622800000000004],"4980736":[1.0545113779999999,1.0641022655000001],"118784":[0.0047139355000000004,0.004766518],"51200":[0.001578648,0.0017422291999999999],"16":[2.8354000000000001e-07,3.0772000000000001e-07],"21":[4.9688000000000004e-07,6.6649000000000003e-07],"917504":[0.070745362000000048,0.10203488099999999],"22":[5.4316e-07,6.7958e-07],"4864":[0.00018959099999999999,0.00020269],"17":[3.4987999999999995e-07,4.1335999999999999e-07],"14848":[0.000456432,0.00048451199999999999],"23":[5.4475000000000006e-07,6.3176999999999995e-07],"786432":[0.0982630315,0.16638130800000001],"18":[3.4857e-07,4.3967000000000002e-07],"1638400":[0.175354964,0.19927599299999998],"7864320":[1.3870430279999999,1.3930483505],"24":[8.2887999999999999e-07,8.9216999999999992e-07],"14155776":[2.3895053280000003,4.4328371009999996],"19":[3.8176e-07,4.0512000000000002e-07],"30":[5.9884999999999999e-07,6.4030999999999999e-07],"25":[4.3317000000000001e-07,5.0793000000000002e-07],"31":[6.2237999999999994e-07,6.4282000000000003e-07],"1280":[4.6659000000000002e-05,5.2026420000000002e-05],"26":[4.6891000000000003e-07,5.1292000000000002e-07],"3932160":[0.61990809850000006,0.641823484],"2432":[9.6639999999999996e-05,9.6985104166666673e-05],"32":[6.4779000000000001e-07,8.3622000000000006e-07],"27":[4.8202999999999998e-07,4.9930999999999999e-07],"409600":[0.0180633815,0.018483294500000001]}},{"title":"OrderedDictionary defaulted subscript, _modify existing","results":{"28":[7.0200000000000001e-07,8.6499999999999998e-07],"34":[8.5499999999999997e-07,8.7599999999999996e-07],"29":[6.9800000000000003e-07,7.6499999999999998e-07],"40":[9.5900000000000005e-07,1.2240000000000001e-06],"17408":[0.0005488899999999999,0.00056580300000000003],"1472":[4.5636000000000001e-05,5.0871999999999997e-05],"112":[2.689e-06,2.6979999999999998e-06],"1376256":[0.24589245100000001,0.32612617700000002],"5242880":[1.3114739879999999,1.3184237919999999],"36":[9.0599999999999999e-07,1.0100000000000001e-06],"42":[1.063e-06,1.1710000000000001e-06],"11534336":[3.0982523770000001,3.25963914],"114688":[0.0056053079999999998,0.0057775690000000015],"144":[3.8149999999999999e-06,4.0180000000000003e-06],"38":[8.8999999999999995e-07,1.141e-06],"240":[5.8780000000000003e-06,6.2890000000000003e-06],"9216":[0.00027141400000000004,0.000305851],"44":[1.0869999999999999e-06,1.2049999999999999e-06],"1664":[4.0735000000000002e-05,4.4898000000000003e-05],"196608":[0.013040847,0.013156928999999998],"155648":[0.0088647190000000018,0.009234166000000002],"2816":[8.8485000000000004e-05,8.9808999999999993e-05],"50":[1.2249999999999999e-06,1.2300000000000001e-06],"2359296":[0.48690845500000002,0.51984507099999999],"46":[1.175e-06,1.218e-06],"176":[4.8189999999999999e-06,5.5570000000000003e-06],"52":[1.3820000000000001e-06,1.3990000000000001e-06],"272":[7.0180000000000004e-06,7.4089999999999997e-06],"116":[2.6989999999999999e-06,2.858e-06],"47104":[0.001908388,0.002089652],"6912":[0.00017932700000000001,0.00019719299999999997],"1856":[4.8517999999999999e-05,4.9419999999999998e-05],"48":[1.4190000000000001e-06,1.6020000000000001e-06],"2097152":[0.405183128,0.40567551299999999],"54":[1.325e-06,1.3650000000000001e-06],"2031616":[0.37843602200000004,0.40961445600000002],"43008":[0.0015865950000000001,0.001844774],"60":[1.4729999999999999e-06,1.6139999999999999e-06],"30720":[0.00088929799999999985,0.0009785830000000001],"56":[1.2810000000000001e-06,1.4929999999999999e-06],"62":[1.502e-06,1.612e-06],"58":[1.4190000000000001e-06,1.474e-06],"3014656":[0.705353377,0.802469129],"64":[1.5570000000000001e-06,1.73e-06],"8388608":[1.9902331419999999,2.0326391250000002],"29696":[0.00086325099999999999,0.000903224],"216":[5.2379999999999997e-06,5.6370000000000004e-06],"106496":[0.004818427000000001,0.0053353940000000002],"72":[2.0930000000000001e-06,2.0980000000000001e-06],"442368":[0.034398447999999991,0.060693527999999997],"147456":[0.0087686720000000017,0.0091548029999999996],"4456448":[0.98508910000000005,0.99341608599999998],"63488":[0.0025206070000000002,0.0026189610000000008],"38912":[0.001310266,0.001415215],"68":[1.734e-06,1.767e-06],"188416":[0.01250017,0.012894335],"248":[6.0329999999999997e-06,6.2910000000000004e-06],"80":[2.3530000000000002e-06,2.396e-06],"2560":[7.5953999999999998e-05,8.1111000000000003e-05],"34816":[0.001118642,0.0011572350000000002],"3712":[9.9339999999999994e-05,0.000108272],"3538944":[0.74216248299999998,0.77986920999999998],"76":[2.0190000000000001e-06,2.0509999999999999e-06],"4194304":[0.91898937599999997,0.973302059],"851968":[0.122354449,0.157191414],"4096":[0.00011785700000000001,0.000119064],"59392":[0.0022513500000000001,0.0023857799999999997],"84":[2.2019999999999998e-06,2.6369999999999999e-06],"3276800":[0.67271540100000005,0.69332385099999994],"55296":[0.0019886970000000002,0.0020530099999999996],"688128":[0.079781646999999983,0.128078725],"8192":[0.000232069,0.00024940500000000002],"10240":[0.00032591400000000006,0.000335361],"15872":[0.00044734400000000002,0.000491612],"92":[2.6840000000000001e-06,2.7389999999999999e-06],"26624":[0.00075644299999999998,0.00077853299999999998],"1792":[4.7259000000000003e-05,4.9202000000000001e-05],"11776":[0.000413189,0.00043241900000000002],"2944":[9.7928000000000002e-05,0.000108698],"88":[2.4169999999999999e-06,2.6639999999999998e-06],"22528":[0.00082404699999999984,0.00085969200000000012],"1245184":[0.20600919200000001,0.28311446200000001],"15728640":[3.8107302750000001,4.0335264009999996],"96":[2.8380000000000002e-06,3.1030000000000002e-06],"1984":[5.003e-05,5.4758e-05],"139264":[0.007333980999999999,0.0074144410000000008],"475136":[0.039152138000000003,0.055100663000000008],"13631488":[3.383186351,3.5388879520000001],"416":[9.8239999999999995e-06,1.0900999999999999e-05],"928":[2.3254000000000001e-05,2.3904999999999999e-05],"512":[1.3737000000000001e-05,1.4078e-05],"18432":[0.00060269000000000002,0.00060314400000000012],"16777216":[4.282113861],"9728":[0.0002968,0.00032541299999999998],"1769472":[0.34441161200000003,0.36464297000000001],"1703936":[0.30535694400000002,0.31722893000000002],"2048":[5.5438e-05,5.7493e-05],"14336":[0.00039468800000000008,0.00046858499999999999],"448":[1.1034e-05,1.131e-05],"5505024":[1.3741945709999999,1.407728976],"544":[1.4531e-05,1.5444e-05],"221184":[0.014030287000000002,0.01444873],"90112":[0.0048552340000000008,0.0048795969999999994],"640":[1.9264000000000001e-05,2.0429999999999999e-05],"12800":[0.00033588899999999997,0.00035173599999999995],"262144":[0.014957118,0.015392532],"589824":[0.059961131000000001,0.083411056999999997],"884736":[0.128514718,0.16799607],"6144":[0.00022407800000000001,0.000256541],"1088":[3.1817999999999999e-05,3.4307999999999997e-05],"576":[1.6646999999999998e-05,1.7377e-05],"160":[3.8979999999999998e-06,4.8330000000000001e-06],"672":[1.9848e-05,2.0769000000000001e-05],"8912896":[2.1587357210000002,2.2184787259999998],"100":[2.2699999999999999e-06,2.5959999999999998e-06],"507904":[0.042721884000000009,0.064717660999999996],"3840":[0.00010695399999999999,0.000111851],"192":[6.1750000000000002e-06,7.3329999999999999e-06],"376832":[0.029308789000000002,0.036507236999999991],"98304":[0.0057505450000000001,0.0057805860000000008],"5376":[0.00017176499999999999,0.00018858899999999999],"94208":[0.0053390949999999994,0.0055750959999999999],"81920":[0.0038787019999999991,0.0042640069999999993],"3407872":[0.70211741800000005,0.73261851499999997],"104":[2.3350000000000001e-06,2.3819999999999998e-06],"122880":[0.005889222999999999,0.0064135500000000014],"200":[4.4750000000000004e-06,4.578e-06],"163840":[0.0099384959999999998,0.010272168],"4063232":[0.86824609699999999,0.936462829],"5767168":[1.4902561090000002,1.5013404879999999],"12582912":[3.674320426,3.8494726589999999],"1600":[3.8282999999999999e-05,4.6056000000000001e-05],"136":[3.3510000000000002e-06,3.8120000000000001e-06],"232":[5.5140000000000001e-06,6.037e-06],"7077888":[1.63076398,1.7224494319999999],"86016":[0.0044196690000000002,0.0045025029999999997],"31744":[0.00096626100000000005,0.0010171099999999999],"168":[4.4669999999999998e-06,4.9930000000000003e-06],"622592":[0.066967242999999982,0.103397778],"108":[2.475e-06,2.632e-06],"327680":[0.022103419999999999,0.028505542000000005],"2176":[6.2150000000000006e-05,6.3256000000000006e-05],"3328":[8.9209999999999995e-05,9.2645999999999994e-05],"1":[5.4e-08,5.7000000000000001e-08],"2":[6.1999999999999999e-08,6.4000000000000004e-08],"3":[6.1000000000000004e-08,7.0000000000000005e-08],"4":[6.4000000000000004e-08,6.8e-08],"7424":[0.00020898499999999999,0.00021813900000000006],"5":[7.4999999999999997e-08,7.6000000000000006e-08],"23552":[0.00086841199999999983,0.00093264500000000018],"6":[8.0000000000000002e-08,8.3000000000000002e-08],"61440":[0.0024007110000000007,0.0024164489999999989],"491520":[0.039402146999999998,0.061852135999999988],"77824":[0.003702702,0.0037029419999999999],"7":[8.4999999999999994e-08,8.6000000000000002e-08],"8":[9.5999999999999999e-08,1.2100000000000001e-07],"208":[5.006e-06,5.0270000000000003e-06],"9":[1.15e-07,1.23e-07],"73728":[0.0031948840000000011,0.0035739729999999998],"304":[8.7129999999999994e-06,8.918e-06],"400":[9.2280000000000004e-06,9.4229999999999994e-06],"1310720":[0.22801408999999995,0.30332987900000002],"336":[9.7440000000000002e-06,1.0532e-05],"3670016":[0.76107772299999998,0.79340196600000001],"6656":[0.000180786,0.00018332],"15360":[0.00045319999999999996,0.00047055700000000003],"432":[1.0352e-05,1.2454e-05],"950272":[0.14582239699999999,0.17824090200000001],"655360":[0.069856819000000001,0.111715459],"69632":[0.0030507870000000001,0.0031990740000000005],"11264":[0.000379059,0.00041870300000000014],"2752512":[0.60188298699999998,0.70388271999999996],"8126464":[1.8904622689999999,1.902209367],"27648":[0.00079940600000000012,0.00080088299999999996],"368":[1.1636e-05,1.2004000000000001e-05],"65536":[0.0026676529999999999,0.0027438379999999993],"16252928":[4.029182155],"464":[1.2388999999999999e-05,1.243e-05],"1015808":[0.15200527,0.18978160899999999],"3072":[0.00011445,0.00011510599999999999],"110592":[0.0053793160000000003,0.005533217],"237568":[0.012636375,0.015168870000000001],"278528":[0.017484609000000005,0.018824860000000002],"496":[1.2787e-05,1.3528e-05],"13107200":[3.2579683350000002,3.3292225379999998],"9961472":[2.5008766800000002,2.6046946430000002],"5888":[0.00020835799999999999,0.000209555],"11010048":[2.8259017790000001,3.087237403],"1920":[4.7953e-05,5.8252999999999999e-05],"2490368":[0.52967128500000005,0.55499203500000005],"19456":[0.00063627300000000013,0.00066080799999999992],"57344":[0.002241308,0.0022967900000000004],"1179648":[0.19175724,0.263105329],"4718592":[1.125226195,1.130949773],"360448":[0.026784158999999995,0.027738652000000003],"1572864":[0.31996714799999998,0.37969607100000002],"53248":[0.0018352189999999997,0.0023027150000000003],"3456":[8.8386000000000004e-05,9.3997000000000001e-05],"40960":[0.0014703310000000003,0.0014897759999999999],"4608":[0.00014311,0.00014886899999999999],"13824":[0.00037499300000000001,0.00041170300000000013],"819200":[0.106549248,0.15388706799999999],"983040":[0.14530658600000002,0.192435983],"8704":[0.00026131099999999997,0.00029738399999999998],"120":[2.9720000000000001e-06,3.0769999999999999e-06],"1024":[2.6777000000000001e-05,2.7175e-05],"49152":[0.0021085929999999998,0.002113668],"524288":[0.048994355000000003,0.080556786999999991],"45056":[0.0016991979999999996,0.001857757],"229376":[0.013324611,0.014681312],"2688":[8.5927999999999995e-05,9.0818999999999999e-05],"152":[3.9349999999999996e-06,4.0659999999999997e-06],"5120":[0.000156642,0.000176465],"1507328":[0.29583516999999998,0.31803473599999998],"1216":[3.4467000000000001e-05,3.7422000000000002e-05],"1966080":[0.37563786899999996,0.40236949200000005],"1900544":[0.35039868099999999,0.35271661599999998],"184":[5.1499999999999998e-06,5.626e-06],"7936":[0.000219946,0.00023249799999999998],"3801088":[0.82965424300000001,0.87617709499999996],"6815744":[1.552810204,1.6388484679999999],"124":[3.0479999999999999e-06,3.241e-06],"102400":[0.0045792139999999999,0.005074238],"311296":[0.020121003000000002,0.025398841999999998],"1408":[4.6681999999999998e-05,4.7222000000000003e-05],"393216":[0.037690530999999999,0.042125209000000059],"4352":[0.000125711,0.00013045300000000002],"6553600":[1.5233170390000002,1.5399449700000001],"20480":[0.00068784399999999996,0.00073432599999999999],"608":[1.6813e-05,1.8377e-05],"2228224":[0.44046272900000005,0.45584811800000002],"36864":[0.001189617,0.0013101389999999999],"704":[2.1265000000000001e-05,2.4199999999999999e-05],"720896":[0.085912259000000019,0.14028965099999999],"800":[1.9473000000000001e-05,1.984e-05],"2621440":[0.57026734000000001,0.57655664200000001],"425984":[0.029654900000000005,0.034485541999999994],"32768":[0.00097691800000000001,0.001059443],"12058624":[3.281354334,3.4881112280000002],"128":[3.4489999999999999e-06,3.5200000000000002e-06],"180224":[0.011305783999999999,0.013657257000000001],"224":[5.6740000000000002e-06,5.789e-06],"736":[2.3612e-05,2.5621000000000001e-05],"320":[8.619e-06,9.2969999999999992e-06],"557056":[0.049705257999999988,0.073226666999999995],"832":[2.0463999999999999e-05,2.0789e-05],"9437184":[2.3289648459999999,2.5527955540000002],"3584":[9.3416000000000001e-05,0.00010166],"6291456":[1.752013778,1.8326010510000001],"256":[6.054e-06,6.6959999999999999e-06],"15204352":[3.7634684759999999,3.866846781],"28672":[0.00080932600000000019,0.00082377399999999988],"768":[2.5493000000000001e-05,2.6922000000000001e-05],"212992":[0.011558573000000001,0.01183859],"864":[2.0231999999999999e-05,2.2436e-05],"352":[1.0284e-05,1.165e-05],"253952":[0.015503217999999999,0.015510886],"960":[2.6071000000000002e-05,2.6684999999999999e-05],"24576":[0.0010285470000000001,0.0010305639999999999],"7680":[0.00020907,0.00022277899999999993],"294912":[0.018461303999999994,0.020384798000000003],"1048576":[0.16500622400000001,0.20593238899999999],"10485760":[2.752339868,2.8239060650000001],"344064":[0.026833178999999995,0.027090299999999994],"288":[7.3549999999999999e-06,7.7030000000000006e-06],"1152":[3.0957999999999997e-05,3.3995999999999998e-05],"384":[1.2632999999999999e-05,1.3243e-05],"2304":[6.2679000000000001e-05,7.0018000000000006e-05],"896":[2.2204999999999998e-05,2.3813000000000001e-05],"480":[1.2432999999999999e-05,1.2968e-05],"1441792":[0.27325536900000003,0.34683400399999997],"992":[2.7336999999999999e-05,2.8187999999999998e-05],"3968":[0.000106943,0.000113651],"6400":[0.00017198100000000001,0.00018008099999999999],"1344":[4.1566999999999997e-05,4.3062000000000002e-05],"126976":[0.0063597530000000001,0.0070110680000000005],"2883584":[0.67547667700000003,0.70980647299999999],"753664":[0.098322121000000012,0.131622555],"16384":[0.00051786499999999995,0.00052345799999999997],"131072":[0.0066993849999999995,0.006791918000000001],"458752":[0.035876228999999982,0.066158748999999989],"172032":[0.010564948999999999,0.011354636999999997],"12288":[0.000448369,0.00053079600000000026],"14680064":[3.5802280500000001,3.855678723],"1536":[5.1876000000000003e-05,5.3792999999999998e-05],"25600":[0.0007240180000000001,0.00076184500000000004],"1835008":[0.35201966000000001,0.36191442500000004],"10752":[0.00034852099999999997,0.00036653800000000002],"21504":[0.0007368889999999999,0.00081822999999999998],"7602176":[1.703925404,1.8023355640000001],"5632":[0.000194382,0.000201561],"10":[1.2700000000000001e-07,1.2700000000000001e-07],"3145728":[0.75712487699999997,0.75888139499999996],"245760":[0.014618596000000001,0.015130705999999999],"1728":[4.3056999999999998e-05,4.6928999999999997e-05],"11":[1.1999999999999999e-07,1.2800000000000001e-07],"1114112":[0.17424943400000001,0.21804087999999999],"12":[1.36e-07,1.6400000000000001e-07],"7340032":[1.6455297440000001,1.7416866129999999],"7168":[0.000191375,0.000209779],"13":[1.54e-07,1.8099999999999999e-07],"6029312":[1.6464153930000001,1.67107944],"14":[1.5800000000000001e-07,1.6500000000000001e-07],"3200":[8.1705000000000005e-05,8.7161000000000001e-05],"20":[4.7e-07,5.4000000000000002e-07],"204800":[0.010661316000000002,0.010996044],"15":[1.7599999999999999e-07,1.97e-07],"13312":[0.00035332300000000006,0.00037873799999999999],"4980736":[1.1726512659999999,1.2330383889999998],"118784":[0.0061210689999999998,0.0063745069999999989],"51200":[0.001801359,0.001914479],"16":[4.39e-07,4.8299999999999997e-07],"21":[4.9699999999999996e-07,5.6300000000000005e-07],"917504":[0.13721071900000001,0.164714422],"22":[6.2500000000000005e-07,6.9400000000000005e-07],"4864":[0.00014776900000000001,0.00016246299999999998],"17":[4.7399999999999998e-07,4.8500000000000002e-07],"14848":[0.00043000199999999991,0.00043165199999999993],"23":[5.7700000000000004e-07,6.7000000000000004e-07],"786432":[0.10424634300000001,0.16050569000000001],"18":[4.5999999999999999e-07,5.5799999999999999e-07],"1638400":[0.29840933400000003,0.328376626],"7864320":[1.8565519779999999,1.907530696],"24":[6.7999999999999995e-07,8.8800000000000001e-07],"14155776":[3.4529466100000001,7.2742620699999998],"19":[4.4499999999999997e-07,5.9500000000000002e-07],"30":[7.1200000000000002e-07,7.54e-07],"25":[6.2099999999999996e-07,6.8800000000000002e-07],"31":[7.8100000000000002e-07,8.7400000000000002e-07],"1280":[3.7283999999999997e-05,4.0685000000000001e-05],"26":[6.2099999999999996e-07,6.2500000000000005e-07],"3932160":[0.851737034,0.89236970599999998],"2432":[7.6817000000000007e-05,7.8410000000000003e-05],"32":[7.7599999999999996e-07,7.7800000000000001e-07],"27":[6.5600000000000005e-07,6.7999999999999995e-07],"409600":[0.030382217,0.031838721]}},{"title":"OrderedDictionary defaulted subscript, _modify missing","results":{"28":[2.9909999999999998e-06,3.6150000000000001e-06],"34":[3.529e-06,4.0459999999999999e-06],"29":[3.0410000000000002e-06,3.3280000000000002e-06],"40":[3.7359999999999999e-06,4.3170000000000003e-06],"17408":[0.0018695090000000001,0.001930717],"1472":[0.00013772800000000002,0.000148498],"112":[1.1715999999999999e-05,1.1746000000000001e-05],"1376256":[0.36843157199999998,0.49807713100000001],"5242880":[1.9820848250000001,1.989087147],"36":[3.534e-06,4.3320000000000002e-06],"42":[4.0910000000000003e-06,4.1269999999999996e-06],"11534336":[4.5889630690000001,4.6319809190000001],"114688":[0.017202659000000002,0.017562781999999999],"144":[1.3705e-05,1.4447000000000001e-05],"38":[3.5700000000000001e-06,4.2139999999999998e-06],"240":[2.5029999999999999e-05,2.6499000000000002e-05],"9216":[0.00097778100000000005,0.0010402549999999999],"44":[4.194e-06,4.4519999999999999e-06],"1664":[0.00018636099999999999,0.00021919099999999996],"196608":[0.026105944000000002,0.027498121],"155648":[0.021160158999999998,0.021687062],"2816":[0.00026493399999999998,0.00029134199999999999],"50":[5.6470000000000003e-06,5.9819999999999996e-06],"2359296":[0.81505754399999997,0.82274523899999996],"46":[4.5549999999999996e-06,4.5730000000000001e-06],"176":[1.5899000000000001e-05,1.8916e-05],"52":[6.5189999999999998e-06,6.5400000000000001e-06],"272":[2.7826000000000001e-05,2.8753000000000001e-05],"116":[1.2208999999999999e-05,1.2675e-05],"47104":[0.0051938690000000011,0.0053799],"6912":[0.00084519299999999994,0.00086479899999999997],"1856":[0.00019326799999999997,0.00019989700000000001],"48":[5.2660000000000001e-06,5.4319999999999998e-06],"2097152":[0.73141888200000005,0.73257352399999998],"54":[6.2770000000000002e-06,6.6649999999999997e-06],"2031616":[0.69234942499999996,0.71701290299999998],"43008":[0.0046472579999999996,0.0050444139999999988],"60":[6.5139999999999998e-06,6.9129999999999997e-06],"30720":[0.0036143999999999994,0.0037383659999999999],"56":[6.2859999999999996e-06,6.764e-06],"62":[7.2389999999999996e-06,7.6960000000000005e-06],"58":[6.3840000000000002e-06,7.041e-06],"3014656":[1.0210629229999999,1.0852227889999999],"64":[6.8249999999999999e-06,6.8929999999999999e-06],"8388608":[3.6707446419999998,3.6729110569999999],"29696":[0.0034704919999999999,0.0035701080000000002],"216":[2.4366e-05,2.6633000000000001e-05],"106496":[0.015959483999999999,0.018054763999999997],"72":[7.8269999999999998e-06,7.9419999999999995e-06],"442368":[0.087641669000000005,0.15149580300000001],"147456":[0.021845050000000001,0.026556307000000008],"4456448":[1.744716513,1.803272312],"63488":[0.0082226620000000004,0.0082503679999999992],"38912":[0.0042277620000000004,0.0043251940000000001],"68":[6.657e-06,7.131e-06],"188416":[0.026336155,0.026350788999999996],"248":[2.6313e-05,2.6441e-05],"80":[8.8100000000000004e-06,8.8880000000000003e-06],"2560":[0.00024712200000000001,0.00026817999999999997],"34816":[0.0039569470000000006,0.0039699040000000007],"3712":[0.00040610500000000003,0.00044223],"3538944":[1.53659458,1.5806112560000001],"76":[7.2819999999999999e-06,7.7340000000000008e-06],"4194304":[1.690808925,1.6981391539999999],"851968":[0.229803808,0.32762233099999999],"4096":[0.00043026400000000008,0.00046555400000000008],"59392":[0.007648256,0.0084785759999999998],"84":[8.3809999999999999e-06,9.0669999999999998e-06],"3276800":[1.454226647,1.51734444],"55296":[0.007297164999999997,0.0076856880000000004],"688128":[0.13408456999999999,0.188373027],"8192":[0.00091903500000000001,0.00092117899999999994],"10240":[0.001052564,0.0010593059999999999],"15872":[0.0017999650000000002,0.001894639],"92":[7.6920000000000002e-06,8.6419999999999996e-06],"26624":[0.003240925,0.00345729],"1792":[0.00020146899999999999,0.00021373799999999999],"11776":[0.0011495000000000001,0.0011568920000000001],"2944":[0.00029827400000000001,0.00030940399999999999],"88":[8.0369999999999995e-06,9.0839999999999998e-06],"22528":[0.0022112720000000002,0.002353478],"1245184":[0.32600003300000002,0.435519251],"15728640":[7.3409639210000002,7.4521750950000003],"96":[8.8920000000000006e-06,9.4979999999999995e-06],"1984":[0.000211719,0.000222735],"139264":[0.019364903999999999,0.020017409],"475136":[0.092956381000000005,0.12131879499999999],"13631488":[6.9248471660000002,7.1655419680000003],"416":[4.5170000000000003e-05,4.9843999999999999e-05],"928":[0.000103655,0.000105679],"512":[5.6150000000000003e-05,5.7385e-05],"18432":[0.0019375,0.0019733089999999999],"16777216":[7.6964906949999996],"9728":[0.00099095699999999978,0.0010306],"1769472":[0.67129139900000001,0.68752930700000003],"1703936":[0.64546678700000004,0.66010166199999998],"2048":[0.00021179399999999996,0.000222704],"14336":[0.0016737829999999999,0.001782004],"448":[4.9851000000000001e-05,5.2713999999999997e-05],"5505024":[2.0441371450000001,2.0979668660000002],"544":[5.9144999999999997e-05,6.0426e-05],"221184":[0.037058822999999998,0.041316592999999999],"90112":[0.010824465,0.011219617000000001],"640":[6.3946000000000001e-05,6.5293e-05],"12800":[0.00160461,0.0016671920000000003],"262144":[0.04185453900000001,0.042205199000000013],"589824":[0.112050635,0.155170055],"884736":[0.236287569,0.34656123999999999],"6144":[0.00064342200000000016,0.00068575999999999999],"1088":[0.000121185,0.00012630199999999996],"576":[5.7043999999999998e-05,6.6521999999999998e-05],"160":[1.4921e-05,1.5875999999999998e-05],"672":[6.2583999999999996e-05,6.4547000000000004e-05],"8912896":[3.783885492,3.9153681439999999],"100":[1.0755e-05,1.1919999999999999e-05],"507904":[0.095193009999999995,0.127916219],"3840":[0.00041268099999999992,0.00042571299999999998],"192":[1.9278000000000001e-05,2.2191000000000001e-05],"376832":[0.058910521,0.06524989099999999],"98304":[0.012036003,0.012488068],"5376":[0.00051560600000000027,0.00059181400000000008],"94208":[0.011462033,0.011480226],"81920":[0.0096933590000000021,0.010585868999999999],"3407872":[1.487979599,1.567274533],"104":[1.0795000000000001e-05,1.1077000000000001e-05],"122880":[0.017340934000000002,0.017938076000000004],"200":[2.1565000000000001e-05,2.1776e-05],"163840":[0.022180709999999999,0.023385283],"4063232":[1.6511007719999999,1.6532849779999998],"5767168":[2.1775628029999998,2.1852483400000002],"12582912":[5.0546729030000002,5.1997124670000003],"1600":[0.00020048900000000001,0.00020067899999999999],"136":[1.2741e-05,1.4851999999999999e-05],"232":[2.4448999999999999e-05,2.7027000000000001e-05],"7077888":[3.4361296550000002,3.5063023109999998],"86016":[0.010879692,0.010934121],"31744":[0.0036236459999999999,0.0038186590000000007],"168":[1.6368e-05,1.6430999999999999e-05],"622592":[0.11944018000000001,0.16442353000000001],"108":[1.1744e-05,1.2704000000000001e-05],"327680":[0.049813784999999999,0.058228310999999998],"2176":[0.00022436099999999991,0.00023813100000000001],"3328":[0.00038416199999999996,0.000408692],"1":[5.9999999999999995e-08,6.1999999999999999e-08],"2":[3.4400000000000001e-07,3.8500000000000002e-07],"3":[3.3000000000000002e-07,3.3799999999999998e-07],"4":[3.6300000000000001e-07,4.0200000000000003e-07],"7424":[0.00082027800000000013,0.00085631599999999998],"5":[3.2899999999999999e-07,4.2599999999999998e-07],"23552":[0.002259516,0.0023966180000000001],"6":[3.8700000000000001e-07,3.8799999999999998e-07],"61440":[0.0078727749999999985,0.0084251689999999997],"491520":[0.094040501999999984,0.12784685100000001],"77824":[0.0095678440000000007,0.010542328],"7":[4.3000000000000001e-07,4.63e-07],"8":[8.7700000000000003e-07,9.1299999999999998e-07],"208":[2.3317999999999999e-05,2.4409e-05],"9":[1.003e-06,1.176e-06],"73728":[0.0090026850000000016,0.0096854769999999996],"304":[3.0917000000000002e-05,3.3362999999999999e-05],"400":[4.3405000000000002e-05,4.6409000000000002e-05],"1310720":[0.34071732999999998,0.43746739099999998],"336":[3.2888000000000001e-05,3.3186999999999999e-05],"3670016":[1.5505012419999999,1.582506985],"6656":[0.00078314900000000002,0.00082819899999999995],"15360":[0.001718729,0.0018034050000000003],"432":[4.7466999999999998e-05,5.2172999999999997e-05],"950272":[0.252264247,0.33404996200000003],"655360":[0.12785862200000001,0.17508373999999999],"69632":[0.008915694,0.0090648529999999995],"11264":[0.0011220009999999999,0.0012520750000000001],"2752512":[0.92451883899999998,0.97887553400000005],"8126464":[3.5418338870000001,3.576087163],"27648":[0.003425291,0.0035596590000000006],"368":[3.4235e-05,3.5506999999999997e-05],"65536":[0.0081778490000000009,0.0083697239999999985],"16252928":[7.5766554739999998],"464":[5.2929000000000001e-05,5.3876999999999999e-05],"1015808":[0.26717303000000003,0.34697083000000001],"3072":[0.000302019,0.00031846899999999994],"110592":[0.016412752000000003,0.016870886999999998],"237568":[0.038196265,0.039956776000000006],"278528":[0.043665025999999996,0.047067866],"496":[5.2964999999999999e-05,5.4017999999999997e-05],"13107200":[6.8393038419999996,6.9528003150000002],"9961472":[4.0075691539999996,4.1090126060000003],"5888":[0.00057476300000000016,0.00058648100000000002],"11010048":[4.3701612890000003,4.3886855110000003],"1920":[0.00020569099999999998,0.00021862199999999999],"2490368":[0.84375076900000001,0.86948639100000003],"19456":[0.002001643,0.0020821670000000007],"57344":[0.007559192000000001,0.0077069880000000006],"1179648":[0.30883144699999998,0.38493230699999997],"4718592":[1.8303216879999999,1.8620204039999999],"360448":[0.054444120999999991,0.055849394999999989],"1572864":[0.44291023799999996,0.44624237700000002],"53248":[0.0073283559999999994,0.0081669880000000399],"3456":[0.000383493,0.00042305500000000003],"40960":[0.0044989610000000001,0.004548023],"4608":[0.00047746100000000004,0.00054683300000000004],"13824":[0.001683602,0.001729628],"819200":[0.22263798600000001,0.32210053300000002],"983040":[0.26151099799999999,0.347676765],"8704":[0.00095880899999999992,0.00097013399999999988],"120":[1.3283e-05,1.3642000000000001e-05],"1024":[0.000106186,0.000108644],"49152":[0.005342248,0.0054049409999999999],"524288":[0.102374385,0.13447627600000001],"45056":[0.0047699200000000013,0.0050039609999999995],"229376":[0.038448906000000005,0.041089750000000022],"2688":[0.00025309699999999998,0.00026629300000000002],"152":[1.4904e-05,1.5362999999999998e-05],"5120":[0.00051070399999999985,0.00055461599999999996],"1507328":[0.42692451199999998,0.44925709599999997],"1216":[0.00011783299999999999,0.00012673299999999999],"1966080":[0.68364383399999995,0.70337970700000008],"1900544":[0.65593709599999994,0.68870438],"184":[1.6351999999999999e-05,1.7295999999999998e-05],"7936":[0.000868533,0.00093197500000000014],"3801088":[1.558548877,1.5808005600000001],"6815744":[3.272858974,3.4551816529999999],"124":[1.2877000000000001e-05,1.308e-05],"102400":[0.015623069999999999,0.016419791999999996],"311296":[0.048229072999999997,0.052859583000000002],"1408":[0.000134988,0.00013843699999999999],"393216":[0.068027955999999987,0.069280744000000033],"4352":[0.00046779500000000002,0.00047281000000000005],"6553600":[3.2094706469999998,3.347663893],"20480":[0.0021168239999999998,0.0021597309999999998],"608":[5.6771000000000002e-05,6.6141000000000003e-05],"2228224":[0.75579801199999996,0.76355909399999999],"36864":[0.0039728490000000014,0.0041976259999999986],"704":[6.6307000000000001e-05,7.6369e-05],"720896":[0.145172615,0.194301258],"800":[9.0142000000000005e-05,9.6337999999999998e-05],"2621440":[0.87314192499999999,0.89069246599999996],"425984":[0.085372872999999988,0.090665308],"32768":[0.0037209299999999999,0.0037773849999999999],"12058624":[4.825230286,4.9130324549999997],"128":[1.3448999999999999e-05,1.3857e-05],"180224":[0.024320647000000029,0.025220519],"224":[2.4105e-05,2.5888999999999999e-05],"736":[7.0290999999999995e-05,7.1959999999999995e-05],"320":[2.9357e-05,3.1795999999999998e-05],"557056":[0.104312979,0.137409324],"832":[9.3593999999999999e-05,9.9080999999999995e-05],"9437184":[3.9728455089999999,4.0980832420000004],"3584":[0.00039424499999999999,0.00042558200000000003],"6291456":[2.3891223419999998,2.5219730560000002],"256":[2.4445999999999999e-05,2.8333000000000001e-05],"15204352":[7.2155402649999996,7.3485133349999998],"28672":[0.0033190680000000001,0.003504517],"768":[7.1378000000000007e-05,7.1724999999999995e-05],"212992":[0.036303052999999995,0.040418977000000002],"864":[9.8517999999999994e-05,0.000103847],"352":[3.6233999999999999e-05,3.6520000000000003e-05],"253952":[0.040591889000000006,0.042195628999999998],"960":[0.000104554,0.000108161],"24576":[0.0024170050000000003,0.0025887849999999997],"7680":[0.00086756099999999998,0.00091322899999999999],"294912":[0.045634440999999998,0.04940080899999999],"1048576":[0.28211035600000001,0.35352789400000001],"10485760":[4.1807618240000002,4.3295257429999996],"344064":[0.051550984000000008,0.05615158],"288":[2.8280999999999999e-05,2.9822e-05],"1152":[0.000112074,0.000121859],"384":[3.5958999999999999e-05,3.8062000000000003e-05],"2304":[0.00023858399999999996,0.000247555],"896":[9.5094999999999997e-05,9.7409000000000002e-05],"480":[5.2210999999999999e-05,5.2689999999999999e-05],"1441792":[0.39545768799999997,0.49174520799999999],"992":[0.00010864100000000001,0.000109953],"3968":[0.00042531000000000009,0.00047383699999999996],"6400":[0.00078728500000000009,0.00088045599999999995],"1344":[0.00012903200000000001,0.00013883499999999997],"126976":[0.018125017,0.018376476000000003],"2883584":[0.99630133099999996,1.0714712],"753664":[0.15250248399999999,0.19491439799999999],"16384":[0.0018862179999999998,0.001886848],"131072":[0.018614723,0.019008233000000003],"458752":[0.090148505000000004,0.12215079],"172032":[0.023292026,0.024643090999999999],"12288":[0.0012055049999999997,0.0013221800000000001],"14680064":[7.0781836690000004,7.3690500280000002],"1536":[0.00014121500000000001,0.00014949000000000001],"25600":[0.0032682280000000006,0.0034086120000000005],"1835008":[0.67080688199999994,0.67363354499999994],"10752":[0.0010748839999999999,0.0011168969999999997],"21504":[0.0021247979999999998,0.0023173760000000003],"7602176":[3.4698691090000002,3.473871484],"5632":[0.000540957,0.00055422700000000002],"10":[1.031e-06,1.062e-06],"3145728":[1.0709036489999999,1.0834094480000001],"245760":[0.040137618,0.041089835000000005],"1728":[0.00019897599999999996,0.00020830000000000002],"11":[1.279e-06,1.3069999999999999e-06],"1114112":[0.29793687099999999,0.37400464899999997],"12":[1.2780000000000001e-06,1.3799999999999999e-06],"7340032":[3.3022609749999998,3.4247822339999998],"7168":[0.00082302600000000014,0.0008679460000000003],"13":[2.2639999999999998e-06,2.7219999999999999e-06],"6029312":[2.2658999729999998,2.2862290440000002],"14":[2.2790000000000001e-06,2.6400000000000001e-06],"3200":[0.00037438700000000001,0.00038848699999999997],"20":[2.17e-06,2.351e-06],"204800":[0.035588147999999993,0.036703847999999997],"15":[2.249e-06,2.8559999999999998e-06],"13312":[0.0016037670000000001,0.0016668200000000001],"4980736":[1.926617966,1.962533106],"118784":[0.017653802999999999,0.018551349000000002],"51200":[0.0069780099999999998,0.0076288840000000007],"16":[1.939e-06,2.3089999999999998e-06],"21":[2.0669999999999999e-06,2.4040000000000002e-06],"917504":[0.240570429,0.33081790700000002],"22":[2.3829999999999999e-06,2.4940000000000002e-06],"4864":[0.000477255,0.0005061960000000001],"17":[2.0420000000000001e-06,2.159e-06],"14848":[0.0017063970000000001,0.0017073730000000003],"23":[2.2740000000000002e-06,2.6460000000000002e-06],"786432":[0.16541636000000001,0.23078827300000004],"18":[2.1660000000000001e-06,2.2180000000000002e-06],"1638400":[0.63569905199999999,0.70050780800000001],"7864320":[3.5001126459999998,3.5753053050000001],"24":[2.4590000000000001e-06,3.2899999999999998e-06],"14155776":[7.0029459559999996,14.718123117999999],"19":[2.1380000000000001e-06,2.3470000000000001e-06],"30":[3.3100000000000001e-06,3.4429999999999999e-06],"25":[3.1300000000000001e-06,3.252e-06],"31":[3.3759999999999999e-06,3.6389999999999998e-06],"1280":[0.000130543,0.00014251700000000002],"26":[2.9840000000000001e-06,3.535e-06],"3932160":[1.6215490720000001,1.644565603],"2432":[0.0002509150000000001,0.00027170999999999999],"32":[3.3979999999999999e-06,3.771e-06],"27":[2.9119999999999998e-06,3.123e-06],"409600":[0.080311026000000008,0.084907911999999988]}},{"title":"OrderedDictionary successful index(forKey:)","results":{"28":[4.8983000000000004e-07,5.3606999999999996e-07],"34":[6.844899999999999e-07,7.0052999999999999e-07],"29":[5.3651999999999999e-07,5.5128e-07],"40":[7.2336999999999995e-07,8.1543000000000004e-07],"17408":[0.000475971,0.00049173399999999996],"1472":[4.1746589999999997e-05,4.5596349999999999e-05],"112":[2.0484000000000002e-06,2.0834700000000001e-06],"1376256":[0.15163367799999999,0.22446743450000001],"5242880":[0.86870063750000004,0.87188530249999996],"36":[6.7828000000000001e-07,7.2755000000000003e-07],"42":[7.8184999999999998e-07,8.3145e-07],"11534336":[2.1423885175000001,2.1431646120000001],"114688":[0.0041938629999999991,0.0044035059999999997],"144":[2.8017899999999997e-06,2.9078699999999997e-06],"38":[6.8071000000000006e-07,7.8749000000000002e-07],"240":[4.4588200000000001e-06,4.9721499999999995e-06],"9216":[0.00023840800000000001,0.00027499099999999998],"44":[8.2899999999999992e-07,8.5631999999999998e-07],"1664":[3.5423219999999998e-05,3.6041100000000003e-05],"196608":[0.0104980105,0.010849112499999997],"155648":[0.0067196480000000017,0.006783199000000001],"2816":[7.8960239999999993e-05,8.2145156250000006e-05],"50":[9.2360000000000004e-07,9.2603999999999995e-07],"2359296":[0.32651044099999998,0.35028997500000003],"46":[8.8305000000000006e-07,1.07462e-06],"176":[3.6447800000000001e-06,4.2610599999999995e-06],"52":[9.1588999999999992e-07,9.6329999999999995e-07],"272":[5.2608999999999999e-06,5.6231000000000004e-06],"116":[2.1322600000000001e-06,2.2360100000000001e-06],"47104":[0.0016691099999999997,0.001695275],"6912":[0.00016418999999999998,0.000171865],"1856":[3.9394000000000003e-05,3.956246428571429e-05],"48":[9.3413999999999992e-07,9.6925000000000008e-07],"2097152":[0.26900364700000001,0.26917318950000002],"54":[9.8991999999999996e-07,1.02036e-06],"2031616":[0.24703877699999999,0.25588867599999998],"43008":[0.001377009,0.001461068],"60":[1.14011e-06,1.16526e-06],"30720":[0.0008018909166666666,0.00083701399999999997],"56":[1.0610399999999999e-06,1.07024e-06],"62":[1.11436e-06,1.2580699999999999e-06],"58":[1.0720799999999999e-06,1.1523e-06],"3014656":[0.506270518,0.53740275800000004],"64":[1.17237e-06,1.24007e-06],"8388608":[1.3286060289999999,1.329593206],"29696":[0.00075716100000000023,0.00076104499999999991],"216":[4.0546799999999998e-06,4.2041899999999996e-06],"106496":[0.0036419264999999999,0.0038525349999999998],"72":[1.3722e-06,1.4301299999999998e-06],"442368":[0.019795247999999994,0.044603695999999998],"147456":[0.006198584,0.006437359000000001],"4456448":[0.68828394699999995,0.69065455399999998],"63488":[0.0018506079999999997,0.001880215],"38912":[0.0011461473749999999,0.0012207699999999999],"68":[1.2609099999999999e-06,1.37263e-06],"188416":[0.009756565,0.0097570900000000012],"248":[4.63877e-06,4.8362499999999996e-06],"80":[1.5703e-06,1.6984199999999998e-06],"2560":[6.3911000000000005e-05,7.1789339999999997e-05],"34816":[0.00095647700000000017,0.0010339518888888885],"3712":[8.8135460000000001e-05,9.0192550000000004e-05],"3538944":[0.48995426199999997,0.49975648],"76":[1.48925e-06,1.5537400000000001e-06],"4194304":[0.62063994950000001,0.62309582800000007],"851968":[0.062157734000000006,0.098108113000000011],"4096":[0.00010220473626373631,0.00010567750000000001],"59392":[0.0016281624999999994,0.0017652569999999999],"84":[1.6957900000000001e-06,1.74954e-06],"3276800":[0.44447703100000002,0.45614161050000002],"55296":[0.0014494920000000004,0.00152301],"688128":[0.041125283500000012,0.063555493499999977],"8192":[0.00021095004878048793,0.00021811700000000004],"10240":[0.00028767100000000003,0.00029716400000000004],"15872":[0.00042050379999999997,0.00042518800000000006],"92":[2.06504e-06,2.08149e-06],"26624":[0.00065085700000000002,0.0006786269999999999],"1792":[3.86524693877551e-05,4.0313090000000005e-05],"11776":[0.00038619868000000003,0.00038643599999999998],"2944":[9.2155788888888894e-05,9.5816040000000008e-05],"88":[1.8379599999999998e-06,1.9064300000000001e-06],"22528":[0.00071530900000000013,0.00077867175000000002],"1245184":[0.1235067385,0.17812140800000001],"15728640":[2.551568171,2.5970337639999999],"96":[1.971275e-06,2.0458100000000002e-06],"1984":[4.3369166666666665e-05,4.6726079999999998e-05],"139264":[0.0055346549999999994,0.0055708269999999987],"475136":[0.022778910499999999,0.047659912000000006],"13631488":[2.236745263,2.3265130100000002],"416":[8.1725300000000005e-06,8.1853999999999996e-06],"928":[1.914795e-05,1.9317000000000002e-05],"512":[1.03434e-05,1.1233339999999999e-05],"18432":[0.00049608299999999992,0.00052863900000000002],"16777216":[2.7840941450000001],"9728":[0.00028258599999999993,0.00028499937499999999],"1769472":[0.212081777,0.24480936449999999],"1703936":[0.201203837,0.20739241350000001],"2048":[4.6122699999999998e-05,4.7965990000000001e-05],"14336":[0.00033724599999999992,0.000340694],"448":[8.9612100000000006e-06,9.2144799999999999e-06],"5505024":[0.963818646,0.97601354600000001],"544":[1.202039e-05,1.2410113924050633e-05],"221184":[0.0088066720000000015,0.0091621059999999997],"90112":[0.0033684680000000003,0.0034804440000000005],"640":[1.4729509999999999e-05,1.4876e-05],"12800":[0.000299165,0.00031818699999999999],"262144":[0.011517003,0.0118960075],"589824":[0.034782157999999994,0.044192577999999989],"884736":[0.068541217000000002,0.103948676],"6144":[0.000217796,0.000231201],"1088":[2.5145999999999999e-05,2.637019e-05],"576":[1.2521774999999999e-05,1.293272e-05],"160":[3.0028999999999997e-06,3.6484999999999999e-06],"672":[1.569629e-05,1.6281329999999998e-05],"8912896":[1.4290768549999999,1.4918288635000001],"100":[1.7884300000000001e-06,1.8070599999999998e-06],"507904":[0.026077020999999985,0.030411933500000005],"3840":[8.7771642857142868e-05,9.7777320000000005e-05],"192":[4.5026300000000003e-06,6.5240000000000006e-06],"376832":[0.021430892,0.021972779999999997],"98304":[0.0041667954999999998,0.0041673335000000002],"5376":[0.00015155599999999996,0.000166026],"94208":[0.0038191229999999998,0.0038359270000000003],"81920":[0.0028255580000000001,0.0029167616666666667],"3407872":[0.46966177100000001,0.47314118849999998],"104":[1.8692799999999999e-06,1.8961200000000001e-06],"122880":[0.0045264270000000004,0.0045428059999999999],"200":[3.7309999999999999e-06,3.7319700000000005e-06],"163840":[0.0074482490000000014,0.0077020540000000016],"4063232":[0.59375760900000008,0.59931055950000001],"5767168":[1.0279115525,1.045357621],"12582912":[2.5464757759999999,2.6967776539999999],"1600":[3.2911540000000001e-05,3.5324300000000003e-05],"136":[2.6457700000000002e-06,2.6604e-06],"232":[4.3865600000000002e-06,4.40421e-06],"7077888":[1.080719397,1.1020304540000001],"86016":[0.0031287583333333333,0.0031633079999999992],"31744":[0.000813418,0.00087024300000000004],"168":[3.35337e-06,4.5368999999999997e-06],"622592":[0.03411019249999999,0.044894111],"108":[1.8765200000000001e-06,2.0055399999999999e-06],"327680":[0.0169611915,0.018470207000000002],"2176":[4.9969979999999996e-05,5.2683999999999999e-05],"3328":[7.4663e-05,8.0833000000000003e-05],"1":[4.1300000000000004e-09,4.32e-09],"2":[5.0300000000000002e-09,5.2900000000000006e-09],"3":[6.7599999999999998e-09,6.7899999999999999e-09],"4":[8.3500000000000003e-09,8.3600000000000001e-09],"7424":[0.00018438980769230768,0.00018923957142857141],"5":[1.102e-08,1.102e-08],"23552":[0.00078390999999999997,0.00082882118181818181],"6":[1.4349999999999999e-08,1.4349999999999999e-08],"61440":[0.0017629137999999995,0.001828269],"491520":[0.024342932000000001,0.03039483149999999],"77824":[0.0026320766666666669,0.0028153969999999999],"7":[1.857e-08,1.8580000000000002e-08],"8":[2.3470000000000001e-08,2.3479999999999999e-08],"208":[3.8700300000000006e-06,3.8717300000000001e-06],"9":[2.8629999999999999e-08,2.8629999999999999e-08],"73728":[0.0024071400000000003,0.002679292666666667],"304":[6.1765599999999992e-06,6.5755100000000007e-06],"400":[7.4169399999999995e-06,7.6697500000000006e-06],"1310720":[0.14357845800000002,0.18532901600000001],"336":[7.4535200000000004e-06,7.5689999999999999e-06],"3670016":[0.51348569399999999,0.53492450199999997],"6656":[0.00015695500000000002,0.00016737800000000001],"15360":[0.00038962599999999996,0.00039658782608695644],"432":[8.3135555555555555e-06,8.5277900000000009e-06],"950272":[0.070908117000000034,0.10359916349999999],"655360":[0.037942636500000002,0.050486343000000003],"69632":[0.002164175,0.0021914582500000002],"11264":[0.00036421992,0.00037172250000000001],"2752512":[0.41828416999999996,0.44684474350000003],"8126464":[1.2699313655,1.2917099519999999],"27648":[0.00069279050000000005,0.000708911],"368":[8.9802700000000007e-06,9.0840300000000002e-06],"65536":[0.0018845260000000003,0.0019698329999999998],"16252928":[2.6859007865],"464":[9.2984299999999993e-06,9.7528700000000007e-06],"1015808":[0.081197817499999991,0.1190027675],"3072":[9.7855000000000004e-05,0.00010127279545454546],"110592":[0.0039120600000000002,0.0039444279999999998],"237568":[0.0098880580000000017,0.01015602],"278528":[0.012796608500000001,0.013120497],"496":[1.0326360000000001e-05,1.058893e-05],"13107200":[2.1281614150000001,2.189987404],"9961472":[1.6857207624999999,1.736550756],"5888":[0.0001823045,0.00019355199999999999],"11010048":[1.9458830199999999,2.035504784],"1920":[4.1061228571428575e-05,4.3582150000000001e-05],"2490368":[0.35782508699999999,0.38662453799999996],"19456":[0.00053595500000000007,0.00059242299999999991],"57344":[0.0016274240000000001,0.0016616100000000004],"1179648":[0.10848653,0.15354950899999997],"4718592":[0.747496783,0.75170095800000003],"360448":[0.019881009499999998,0.019989386500000001],"1572864":[0.20015743850000001,0.24450690949999998],"53248":[0.001383074,0.001568994],"3456":[7.8453700000000011e-05,8.2348660000000011e-05],"40960":[0.00122966,0.001357678],"4608":[0.000120188,0.00012788053333333331],"13824":[0.00033902899999999997,0.00034846199999999996],"819200":[0.055347394999999987,0.090980353],"983040":[0.078624989999999992,0.12853757399999999],"8704":[0.00023212599999999995,0.000242685],"120":[2.23625e-06,2.4474199999999998e-06],"1024":[2.2155059999999998e-05,2.376645e-05],"49152":[0.001692802,0.0018806288000000001],"524288":[0.03224179449999999,0.037906121000000001],"45056":[0.0014950025,0.0015803533333333334],"229376":[0.009513617999999998,0.0095663559999999998],"2688":[7.3021000000000004e-05,7.9040136363636368e-05],"152":[3.0272699999999998e-06,3.2053700000000003e-06],"5120":[0.00014593899999999999,0.000154437],"1507328":[0.18178886350000001,0.25232276349999999],"1216":[3.0331979999999999e-05,3.0365868686868686e-05],"1966080":[0.23855476,0.24386250100000001],"1900544":[0.2253522345,0.23314806800000001],"184":[3.9699599999999998e-06,4.2476699999999996e-06],"7936":[0.000203186,0.00021094002127659573],"3801088":[0.542265624,0.54860192600000002],"6815744":[0.99676783550000003,1.049850902],"124":[2.4144300000000001e-06,2.54596e-06],"102400":[0.0034115170000000002,0.0035973709999999998],"311296":[0.015513897,0.015823103000000008],"1408":[4.0436359999999995e-05,4.2329000000000001e-05],"393216":[0.0236966155,0.026455549000000002],"4352":[0.00011233187837837837,0.00011738277777777781],"6553600":[0.95649101700000005,1.0107480790000001],"20480":[0.00058764699999999963,0.00065340164285714291],"608":[1.349925e-05,1.4782409090909091e-05],"2228224":[0.29127881849999998,0.29690959099999997],"36864":[0.001060227,0.0011002899999999999],"704":[1.6390666666666669e-05,1.669139e-05],"720896":[0.050791488500000002,0.062679876999999967],"800":[1.5855960000000003e-05,1.6986999999999998e-05],"2621440":[0.38414437200000001,0.40468581300000001],"425984":[0.0191433165,0.0191436405],"32768":[0.00086741400000000005,0.00088564699999999982],"12058624":[2.3141463230000001,2.3722440819999999],"128":[2.4888461538461535e-06,2.6129499999999997e-06],"180224":[0.0087916560000000001,0.0092835600000000015],"224":[4.2238799999999998e-06,4.3866200000000002e-06],"736":[1.8881680000000001e-05,1.9320380000000001e-05],"320":[6.6406699999999994e-06,7.8866e-06],"557056":[0.02841291,0.036984074999999991],"832":[1.6605019999999999e-05,1.691989e-05],"9437184":[1.5711922615,1.6269284915],"3584":[7.8097999999999997e-05,8.4647290000000011e-05],"6291456":[1.25843181,1.31601488],"256":[4.88384e-06,5.1112499999999996e-06],"15204352":[2.4507313709999998,2.4654876579999998],"28672":[0.00071307300000000016,0.00076500899999999987],"768":[2.0605029999999999e-05,2.31685e-05],"212992":[0.0088368990000000005,0.009034488000000002],"864":[1.7337360000000002e-05,1.917527e-05],"352":[8.0159000000000006e-06,8.3144499999999997e-06],"253952":[0.0112750035,0.0114872025],"960":[2.0536980000000002e-05,2.1480879999999998e-05],"24576":[0.000880115,0.00089821309999999995],"7680":[0.000192065,0.00019398900000000004],"294912":[0.014293933,0.014818771999999999],"1048576":[0.096253682000000007,0.130576679],"10485760":[1.8174146645,1.8655642285],"344064":[0.018117089499999999,0.019100917999999995],"288":[5.6201099999999996e-06,6.1815e-06],"1152":[2.6644379999999997e-05,2.6774101694915257e-05],"384":[9.3540900000000001e-06,1.0082896551724138e-05],"2304":[5.5259500000000002e-05,5.9463238095238095e-05],"896":[1.7934259999999999e-05,1.981787e-05],"480":[9.6549122807017543e-06,1.0017069999999999e-05],"1441792":[0.17067824000000001,0.23701077700000001],"992":[2.12121e-05,2.228595e-05],"3968":[9.7184797619047629e-05,0.000102027],"6400":[0.00014754162686567165,0.000168099],"1344":[3.5036729999999998e-05,3.6475594202898547e-05],"126976":[0.0047406710000000001,0.0048522189999999996],"2883584":[0.46857816200000002,0.49447403550000002],"753664":[0.051525033499999998,0.073208050999999996],"16384":[0.000449732,0.000459844],"131072":[0.004968529000000001,0.0052470869999999992],"458752":[0.021345601499999995,0.029693563499999999],"172032":[0.0081421070000000026,0.0085232170000000013],"12288":[0.00043049747619047627,0.00043880599999999992],"14680064":[2.3291104924999999,2.385541522],"1536":[4.2558999999999997e-05,4.4975000000000002e-05],"25600":[0.00063136380000000018,0.00070723923076923057],"1835008":[0.2171967645,0.2291094155],"10752":[0.000322133,0.00032668200000000001],"21504":[0.00063604600000000014,0.00070573238461538472],"7602176":[1.1717879410000001,1.1909060730000001],"5632":[0.00017734900000000004,0.00017742309803921573],"10":[3.4410000000000002e-08,3.463e-08],"3145728":[0.55488537800000004,0.560178976],"245760":[0.010856938,0.011042934000000001],"1728":[3.6609000000000001e-05,3.6762060000000002e-05],"11":[4.1069999999999997e-08,4.1520000000000004e-08],"1114112":[0.097472895500000017,0.136524592],"12":[4.8629999999999999e-08,4.8650000000000002e-08],"7340032":[1.0704568045,1.1254122849999999],"7168":[0.00017422099999999996,0.00018036027777777776],"13":[5.6650000000000001e-08,5.6750000000000002e-08],"6029312":[1.1319554304999999,1.1348542314999999],"14":[6.5529999999999992e-08,6.5760000000000001e-08],"3200":[6.5352999999999996e-05,7.3756289999999996e-05],"20":[3.4347999999999995e-07,4.1671999999999999e-07],"204800":[0.0080813779999999984,0.008232264999999999],"15":[7.4880000000000006e-08,7.842000000000001e-08],"13312":[0.00031154300000000001,0.00031666700000000008],"4980736":[0.81442839300000003,0.81984491800000003],"118784":[0.004552614,0.0045602984999999997],"51200":[0.0013202027142857145,0.001501098],"16":[2.7763999999999999e-07,3.0555999999999999e-07],"21":[3.7448e-07,4.01e-07],"917504":[0.0690673485,0.103127939],"22":[4.1242999999999999e-07,4.4314000000000004e-07],"4864":[0.00013600540579710146,0.0001361],"17":[3.0548000000000001e-07,3.2863e-07],"14848":[0.00038484028000000003,0.00038963499999999999],"23":[4.3244000000000003e-07,4.6143999999999998e-07],"786432":[0.055844729000000003,0.094971072999999989],"18":[3.0331000000000003e-07,3.5588999999999999e-07],"1638400":[0.1861921195,0.20802949000000001],"7864320":[1.2097763850000001,1.236346387],"24":[4.8174000000000002e-07,5.4212999999999995e-07],"14155776":[2.2128921670000001,6.0232919450000004],"19":[3.1973000000000002e-07,3.7808999999999997e-07],"30":[5.3845999999999997e-07,5.6214999999999999e-07],"25":[4.4610999999999996e-07,4.8387000000000006e-07],"31":[5.5262000000000003e-07,5.6054000000000002e-07],"1280":[3.1206959999999998e-05,3.152933333333333e-05],"26":[4.5571e-07,4.6508999999999999e-07],"3932160":[0.56671332500000005,0.57548744799999996],"2432":[6.5061620000000009e-05,6.5438379999999992e-05],"32":[5.7927000000000002e-07,6.0717e-07],"27":[4.8011000000000003e-07,4.8126999999999997e-07],"409600":[0.017584185000000002,0.033512109500000012]}},{"title":"OrderedDictionary unsuccessful index(forKey:)","results":{"28":[5.228e-07,5.7442000000000008e-07],"34":[7.3794e-07,8.2025e-07],"29":[5.6336999999999999e-07,5.7327999999999996e-07],"40":[9.6837999999999999e-07,1.0223999999999999e-06],"17408":[0.00066482892857142842,0.00066976700000000004],"1472":[8.1335999999999995e-05,8.7300330000000004e-05],"112":[2.2600800000000001e-06,2.3325000000000001e-06],"1376256":[0.206790631,0.31690320750000001],"5242880":[1.2113057860000001,1.2529059215],"36":[8.3708999999999993e-07,8.3739000000000006e-07],"42":[1.0535500000000001e-06,1.42689e-06],"11534336":[3.4855236275000001,3.5457544379999999],"114688":[0.004342495,0.0045349969999999998],"144":[3.3166000000000001e-06,3.5545200000000001e-06],"38":[8.1633999999999996e-07,8.6153000000000001e-07],"240":[4.8937000000000003e-06,5.4642999999999995e-06],"9216":[0.00034364699999999998,0.00036960249999999997],"44":[1.12746e-06,1.4587600000000001e-06],"1664":[4.2181730000000005e-05,4.3238703703703702e-05],"196608":[0.018172716999999998,0.018914238999999999],"155648":[0.0084537080000000007,0.0085705629999999998],"2816":[0.000132452,0.00013855420833333332],"50":[8.9841000000000001e-07,9.8734999999999996e-07],"2359296":[0.38396598999999998,0.40892567499999999],"46":[1.2926999999999999e-06,1.62759e-06],"176":[5.8177999999999996e-06,6.4779799999999999e-06],"52":[9.6635999999999993e-07,1.0707599999999999e-06],"272":[6.4759799999999998e-06,7.2426100000000006e-06],"116":[2.4033899999999999e-06,2.5186899999999999e-06],"47104":[0.0026591469999999997,0.0027573059999999989],"6912":[0.00021423300000000003,0.00021476699999999999],"1856":[4.9657399999999997e-05,5.338473493975903e-05],"48":[1.3179899999999999e-06,2.0909199999999999e-06],"2097152":[0.29079004899999999,0.29550679800000001],"54":[1.04873e-06,1.1670500000000001e-06],"2031616":[0.25273772300000003,0.27272197300000001],"43008":[0.0020317989999999999,0.0021022950000000001],"60":[1.2703700000000002e-06,1.35666e-06],"30720":[0.00098839555555555554,0.0010101749999999999],"56":[1.1932399999999999e-06,1.22356e-06],"62":[1.3193499999999999e-06,1.3801199999999998e-06],"58":[1.1992299999999999e-06,1.3192e-06],"3014656":[0.87431451550000006,0.90981104550000003],"64":[1.28737e-06,1.3756400000000001e-06],"8388608":[1.5364443395,1.545431263],"29696":[0.00092463700000000007,0.00092866720000000006],"216":[4.6719900000000005e-06,4.7832299999999998e-06],"106496":[0.0038070500000000002,0.0039864930000000007],"72":[1.6755599999999998e-06,1.8728899999999998e-06],"442368":[0.020541278499999996,0.031594578999999998],"147456":[0.007643712999999999,0.0077302890000000013],"4456448":[0.80025898500000003,0.836106091],"63488":[0.0022644400000000004,0.002349818],"38912":[0.0015690148333333338,0.0015889510000000003],"68":[1.4113900000000001e-06,1.56569e-06],"188416":[0.015505911000000001,0.015553266999999999],"248":[5.36565e-06,5.81829e-06],"80":[2.6380799999999997e-06,3.1996388888888885e-06],"2560":[0.00010230600000000001,0.00010785166666666666],"34816":[0.0012464260000000001,0.0013251604285714285],"3712":[0.000106612,0.000110744],"3538944":[0.51594219350000003,0.51836074399999998],"76":[1.9865599999999999e-06,2.0562299999999999e-06],"4194304":[0.70176534000000002,0.70839106649999994],"851968":[0.056183562000000006,0.099705952],"4096":[0.0001352501232876712,0.00014214514705882349],"59392":[0.001985236,0.0023196340000000001],"84":[2.7345000000000002e-06,2.8269e-06],"3276800":[0.44010164299999999,0.45551603000000002],"55296":[0.0017756732,0.0018068120000000003],"688128":[0.057152032500000005,0.093902134499999984],"8192":[0.00026351199999999998,0.000288282],"10240":[0.00043730400000000001,0.00043973800000000001],"15872":[0.00054947100000000027,0.00055886294117647077],"92":[3.63201e-06,4.8846100000000005e-06],"26624":[0.00076070100000000002,0.00080622100000000019],"1792":[4.7434333333333334e-05,5.0560666666666665e-05],"11776":[0.00063820299999999973,0.00070221499999999996],"2944":[0.00015656349999999998,0.00016222771186440681],"88":[2.3488299999999998e-06,3.2506899999999998e-06],"22528":[0.001145067,0.0011931940000000001],"1245184":[0.14575882800000001,0.2192246605],"15728640":[2.9340156435,2.9729936045000001],"96":[3.43004e-06,4.4747800000000002e-06],"1984":[6.0059029999999997e-05,6.0900859999999995e-05],"139264":[0.0064492619999999999,0.0065064200000000006],"475136":[0.024405866000000002,0.033164238499999998],"13631488":[2.2520155910000001,2.3842769575],"416":[8.3804090909090917e-06,8.9461599999999997e-06],"928":[2.3708240000000001e-05,2.4148080000000002e-05],"512":[1.2817069999999999e-05,1.356127e-05],"18432":[0.00067463600000000016,0.00072660341666666659],"16777216":[3.2384530095000001],"9728":[0.00041324500000000002,0.00041824499999999998],"1769472":[0.20543367500000001,0.226823362],"1703936":[0.19735217399999999,0.19879499299999998],"2048":[6.2282415094339622e-05,6.2382614035087723e-05],"14336":[0.00044201600000000005,0.00045911700000000004],"448":[9.687950000000001e-06,1.045829e-05],"5505024":[1.4213339920000001,1.4459178735],"544":[1.493754e-05,1.518862e-05],"221184":[0.0092934650000000008,0.0094884634999999988],"90112":[0.005086727000000001,0.0053622269999999989],"640":[2.0479000000000002e-05,2.1577229999999999e-05],"12800":[0.00036084800000000015,0.00036626599999999997],"262144":[0.012906000000000001,0.013308964],"589824":[0.038745788500000003,0.048712239999999997],"884736":[0.060361842499999999,0.10358281],"6144":[0.00041342900000000004,0.00041604633333333348],"1088":[3.5503000000000002e-05,3.5713831168831171e-05],"576":[1.668098e-05,1.7692823529411764e-05],"160":[4.1259199999999995e-06,5.9056666666666666e-06],"672":[2.4244e-05,2.5762969999999998e-05],"8912896":[1.73078507,1.7995176429999999],"100":[1.76661e-06,1.8683499999999999e-06],"507904":[0.028119430000000001,0.036044457999999995],"3840":[0.00011988317283950615,0.0001275221756756757],"192":[1.0839529999999999e-05,2.4854e-05],"376832":[0.034513750000000017,0.03563673299999999],"98304":[0.0075820939999999993,0.007688719000000001],"5376":[0.00023123499999999999,0.00023312079999999997],"94208":[0.0061553619999999993,0.0062733189999999994],"81920":[0.0038697319999999999,0.0040422745],"3407872":[0.46594743699999996,0.48955303700000002],"104":[2.11647e-06,2.1194099999999998e-06],"122880":[0.0048593714999999992,0.004969872000000001],"200":[3.7547499999999999e-06,3.8465157894736845e-06],"163840":[0.0096515240000000033,0.009893370999999998],"4063232":[0.65291237200000007,0.69279565949999999],"5767168":[1.66721114,1.6734319485],"12582912":[5.1802954119999995,5.2899645494999996],"1600":[3.8744239999999997e-05,4.0306844444444447e-05],"136":[3.0163414634146336e-06,3.08443e-06],"232":[5.0806899999999996e-06,5.1331500000000001e-06],"7077888":[1.1797879574999999,1.190034386],"86016":[0.0044739415000000209,0.0045499729999999997],"31744":[0.0010602785555555553,0.001079829],"168":[4.7112400000000001e-06,5.0535599999999999e-06],"622592":[0.044941818000000001,0.061400080000000003],"108":[2.0361100000000001e-06,2.10748e-06],"327680":[0.021970278500000003,0.024668802],"2176":[6.8589175000000009e-05,7.3702999999999996e-05],"3328":[9.5144755319148924e-05,0.00010364406451612902],"1":[4.5800000000000003e-09,4.5800000000000003e-09],"2":[6.3499999999999998e-09,6.3499999999999998e-09],"3":[8.57e-09,8.57e-09],"4":[1.213e-08,1.213e-08],"7424":[0.000232315,0.00024232300000000002],"5":[1.6009999999999999e-08,1.6020000000000001e-08],"23552":[0.0014003329999999999,0.0014460930000000001],"6":[2.1019999999999999e-08,2.1019999999999999e-08],"61440":[0.002149977,0.0022633705],"491520":[0.025612701499999994,0.034586011999999992],"77824":[0.0035630700000000002,0.0035682789999999997],"7":[2.7059999999999999e-08,2.707e-08],"8":[3.407e-08,3.5650000000000005e-08],"208":[4.1035300000000002e-06,4.1214300000000005e-06],"9":[4.2189999999999996e-08,4.2200000000000001e-08],"73728":[0.0031154520000000003,0.0032342043333333332],"304":[8.6459999999999999e-06,9.4098300000000014e-06],"400":[7.7570000000000004e-06,7.9672799999999994e-06],"1310720":[0.17443689099999998,0.27310516799999995],"336":[1.0516999999999999e-05,1.3799699999999999e-05],"3670016":[0.54473631300000003,0.55501813600000005],"6656":[0.00019130699999999999,0.00020036654545454541],"15360":[0.00049880200000000001,0.000520113],"432":[8.8279999999999992e-06,9.0727083333333337e-06],"950272":[0.072678913000000039,0.1158293775],"655360":[0.049414738499999993,0.066831595999999965],"69632":[0.0027742973333333329,0.0027782693333333339],"11264":[0.00057856999999999993,0.00059623900000000004],"2752512":[0.61060446899999998,0.63662464499999993],"8126464":[1.4461173940000001,1.4781183135],"27648":[0.00083720845454545475,0.00083884699999999999],"368":[1.444123e-05,1.7053830000000001e-05],"65536":[0.002363843,0.0024440129999999997],"16252928":[3.1294523079999998],"464":[1.0576540000000001e-05,1.0996820000000001e-05],"1015808":[0.085310126999999999,0.12638548499999999],"3072":[0.00018424000000000004,0.000194258875],"110592":[0.0041031610000000001,0.004162774000000001],"237568":[0.010453136999999998,0.011093055000000001],"278528":[0.0148290985,0.015186241],"496":[1.16345e-05,1.2602083333333334e-05],"13107200":[2.087657283,2.1486552964999999],"9961472":[2.2268676620000001,2.2750074649999998],"5888":[0.00031388899999999998,0.00033455524137931058],"11010048":[2.9460622975000001,3.0472631130000001],"1920":[5.4714879999999999e-05,5.6935229999999999e-05],"2490368":[0.44699073,0.48825397100000001],"19456":[0.00076180300000000024,0.00082539600000000016],"57344":[0.001902127,0.0019347387999999999],"1179648":[0.12527579699999999,0.17708263299999999],"4718592":[0.91463451799999995,0.92767968249999999],"360448":[0.029311570499999995,0.029622009999999997],"1572864":[0.37107781500000003,0.42956778849999999],"53248":[0.00170695,0.001876583],"3456":[9.4536333333333325e-05,9.9608199999999999e-05],"40960":[0.0017924191999999987,0.001931463],"4608":[0.00017245211111111108,0.00017605357692307693],"13824":[0.00041123900000000004,0.00042862391304347887],"819200":[0.053594869000000003,0.098762671999999968],"983040":[0.081778631000000004,0.13057435100000001],"8704":[0.00030016800000000002,0.00030794200000000001],"120":[2.3939999999999999e-06,2.42842e-06],"1024":[2.7787409999999998e-05,2.9727379999999998e-05],"49152":[0.0033865220000000003,0.0038050914999999998],"524288":[0.028888254999999995,0.043532814999999996],"45056":[0.0022397172500000003,0.0023681975],"229376":[0.0099249230000000004,0.0099909259999999972],"2688":[0.00011475816666666665,0.00011939000000000001],"152":[3.9061800000000003e-06,4.63463e-06],"5120":[0.00021980337777777778,0.00022213500000000004],"1507328":[0.30282535700000002,0.36132754750000001],"1216":[4.2964999999999999e-05,4.4132770000000003e-05],"1966080":[0.24918831,0.25022399899999997],"1900544":[0.226116711,0.234543165],"184":[6.9202100000000001e-06,7.7912099999999999e-06],"7936":[0.00026370035294117651,0.00026503699999999998],"3801088":[0.582803399,0.59164511799999997],"6815744":[1.047598813,1.118733577],"124":[2.6840799999999997e-06,2.7184699999999999e-06],"102400":[0.003481662,0.0035186979999999994],"311296":[0.018513334500000003,0.019893989500000001],"1408":[7.1027999999999998e-05,8.3211210000000001e-05],"393216":[0.04205822599999999,0.044244417000000008],"4352":[0.00015004180000000001,0.00015399600000000005],"6553600":[1.010275399,1.057178025],"20480":[0.00090241700000000019,0.000908595],"608":[2.0178539999999999e-05,2.1548380000000001e-05],"2228224":[0.34011586900000002,0.34382863200000002],"36864":[0.0013809440000000001,0.0014872899999999998],"704":[2.6551999999999999e-05,2.7358790000000002e-05],"720896":[0.069577747999999967,0.092501323999999982],"800":[1.7416999999999999e-05,1.8765949999999999e-05],"2621440":[0.51257966200000005,0.53658145400000001],"425984":[0.019748810999999998,0.019953947],"32768":[0.0010945600000000001,0.0011208458750000001],"12058624":[4.1484285214999996,4.2562906869999999],"128":[2.6111500000000004e-06,3.11858e-06],"180224":[0.012977566999999999,0.013752436],"224":[4.6218499999999996e-06,4.7153899999999999e-06],"736":[3.3238590000000003e-05,3.355956e-05],"320":[9.99018e-06,1.2901970000000001e-05],"557056":[0.032994015000000002,0.042311122],"832":[1.943530612244898e-05,1.9691339999999998e-05],"9437184":[1.9882541520000001,2.0650692400000001],"3584":[0.00010241,0.00010631413580246911],"6291456":[2.4537838060000001,2.6164893784999999],"256":[5.5274367816091955e-06,6.0088899999999995e-06],"15204352":[2.7664976270000001,2.7666790204999998],"28672":[0.00086633800000000013,0.00087249300000000001],"768":[4.0279119047619051e-05,4.3679060000000004e-05],"212992":[0.0089840960000000004,0.0091900689999999986],"864":[2.1125509999999997e-05,2.1169460000000002e-05],"352":[1.4281479999999999e-05,1.6606429999999999e-05],"253952":[0.012362420000000001,0.012416172],"960":[2.5795875e-05,2.589459e-05],"24576":[0.001609617,0.0016957382000000003],"7680":[0.00025328518421052624,0.00026097400000000003],"294912":[0.017107833000000003,0.017829584000000002],"1048576":[0.094877149000000008,0.152264711],"10485760":[2.5534960725000002,2.6542955299999997],"344064":[0.024918149000000001,0.026064214000000002],"288":[7.2351100000000003e-06,8.5618199999999996e-06],"1152":[4.0688549999999999e-05,4.076626e-05],"384":[1.8407791666666669e-05,2.1230049999999998e-05],"2304":[8.1507000000000004e-05,8.552278571428572e-05],"896":[2.0823500000000001e-05,2.2588380000000001e-05],"480":[1.0747999999999999e-05,1.2077889999999999e-05],"1441792":[0.24980809450000002,0.35628114999999999],"992":[2.7037245614035087e-05,2.73527e-05],"3968":[0.00012831999999999999,0.00012846399999999998],"6400":[0.00017872466037735849,0.00019404622448979594],"1344":[5.1671749999999999e-05,5.7179787878787876e-05],"126976":[0.0051634070000000001,0.0055042889999999999],"2883584":[0.74409889000000007,0.80066701100000004],"753664":[0.078812931000000003,0.1168653675],"16384":[0.00058466799999999999,0.00060095700000000016],"131072":[0.0057952009999999998,0.0058402269999999999],"458752":[0.022732187500000004,0.030973175500000005],"172032":[0.011188904,0.012276401499999996],"12288":[0.000797932,0.00086637600000000008],"14680064":[2.529848715,2.6227381285],"1536":[8.4192999999999998e-05,8.8541000000000005e-05],"25600":[0.00073837938461538452,0.00081152899999999985],"1835008":[0.22050761699999999,0.23478065300000001],"10752":[0.00049406599999999993,0.00049424199999999999],"21504":[0.00097857299999999994,0.0010694669999999999],"7602176":[1.2842535335,1.3051621930000001],"5632":[0.00026068700000000001,0.00028392800000000002],"10":[5.0640000000000002e-08,5.0640000000000002e-08],"3145728":[1.067615301,1.0676256285000001],"245760":[0.011775499,0.012108931],"1728":[4.3050000000000003e-05,4.9303220000000001e-05],"11":[6.6429999999999993e-08,6.6579999999999991e-08],"1114112":[0.107301758,0.179052987],"12":[8.4549999999999999e-08,8.4940000000000005e-08],"7340032":[1.1623407910000001,1.2114742175],"7168":[0.000217617,0.000231756525],"13":[9.6129999999999988e-08,9.6209999999999999e-08],"6029312":[2.0104010319999999,2.0118255459999999],"14":[1.0912e-07,1.0916000000000001e-07],"3200":[8.5062000000000007e-05,8.8931900000000001e-05],"20":[4.0896000000000003e-07,6.6965999999999998e-07],"204800":[0.0082415529999999987,0.0089975655000000005],"15":[1.2225999999999998e-07,1.2816e-07],"13312":[0.00039095600000000003,0.00039588999999999998],"4980736":[1.0713979315,1.080163397],"118784":[0.0047341350000000004,0.0048435989999999996],"51200":[0.0015669519999999999,0.0017505609999999999],"16":[3.2936999999999999e-07,3.7747e-07],"21":[4.9587999999999996e-07,5.2333999999999997e-07],"917504":[0.067674300000000021,0.1196927475],"22":[5.4321999999999996e-07,5.6737999999999994e-07],"4864":[0.0001799475,0.00019549766666666666],"17":[3.4938000000000002e-07,4.3291000000000003e-07],"14848":[0.000444912,0.00048612315000000003],"23":[6.3212000000000008e-07,8.2373000000000003e-07],"786432":[0.099159279000000003,0.16571855600000002],"18":[3.4897999999999999e-07,4.1890000000000003e-07],"1638400":[0.16933921299999999,0.20803781299999999],"7864320":[1.35720935,1.3608362875],"24":[7.9618999999999993e-07,8.8139000000000009e-07],"14155776":[2.393269632,4.6912312235],"19":[3.8210000000000001e-07,6.5883000000000003e-07],"30":[5.9312999999999996e-07,6.7202e-07],"25":[4.3297000000000004e-07,4.5193e-07],"31":[6.3176999999999995e-07,6.4424000000000006e-07],"1280":[4.4577611111111114e-05,4.9759061855670104e-05],"26":[4.6639999999999999e-07,4.7897999999999997e-07],"3932160":[0.61300479299999999,0.62697700499999998],"2432":[9.4703000000000005e-05,9.7454999999999994e-05],"32":[6.1925000000000004e-07,6.4231000000000004e-07],"27":[4.8024000000000002e-07,4.8136999999999998e-07],"409600":[0.018158942000000001,0.019557342999999998]}},{"title":"OrderedDictionary updateValue(_:forKey:), existing","results":{"28":[7.2699999999999999e-07,8.4e-07],"34":[1.017e-06,1.063e-06],"29":[7.9599999999999998e-07,8.4600000000000003e-07],"40":[1.113e-06,1.2810000000000001e-06],"17408":[0.00057981999999999999,0.000665729],"1472":[5.2626000000000001e-05,5.6202000000000002e-05],"112":[2.909e-06,3.1269999999999999e-06],"1376256":[0.28910510699999997,0.37377597099999998],"5242880":[1.4521132859999999,1.4762764829999999],"36":[9.7600000000000006e-07,1.1179999999999999e-06],"42":[1.1769999999999999e-06,1.187e-06],"11534336":[3.5828361600000003,3.62612801],"114688":[0.0062640249999999995,0.0065305070000000161],"144":[4.301e-06,4.3630000000000004e-06],"38":[1.1629999999999999e-06,1.207e-06],"240":[6.9210000000000003e-06,7.1060000000000002e-06],"9216":[0.00029629499999999997,0.00031612399999999998],"44":[1.3209999999999999e-06,1.4109999999999999e-06],"1664":[4.5692000000000002e-05,4.9805999999999997e-05],"196608":[0.01476975,0.016495363999999995],"155648":[0.010124207,0.010205081],"2816":[0.00010320300000000002,0.00011524800000000002],"50":[1.3629999999999999e-06,1.364e-06],"2359296":[0.560361895,0.56422323099999994],"46":[1.407e-06,1.519e-06],"176":[5.5180000000000004e-06,5.976e-06],"52":[1.3549999999999999e-06,1.4419999999999999e-06],"272":[7.8299999999999996e-06,8.2190000000000004e-06],"116":[3.1590000000000002e-06,3.2600000000000001e-06],"47104":[0.0021337070000000003,0.002167993999999999],"6912":[0.00020033400000000001,0.00022200900000000001],"1856":[5.4355999999999999e-05,5.4763999999999999e-05],"48":[1.4589999999999999e-06,1.6559999999999999e-06],"2097152":[0.46413054300000001,0.46524016400000001],"54":[1.53e-06,1.6759999999999999e-06],"2031616":[0.42739764699999999,0.44757719600000001],"43008":[0.0018325079999999996,0.0019792819999999997],"60":[1.7039999999999999e-06,1.7460000000000001e-06],"30720":[0.00099158199999999997,0.001041064],"56":[1.466e-06,1.6050000000000001e-06],"62":[1.6449999999999999e-06,1.7e-06],"58":[1.6220000000000001e-06,1.719e-06],"3014656":[0.83792989100000004,0.86590734599999997],"64":[1.734e-06,1.8190000000000001e-06],"8388608":[2.239118172,2.2699830350000001],"29696":[0.000944216,0.00094622800000000013],"216":[5.9340000000000003e-06,6.2550000000000003e-06],"106496":[0.0054316710000000008,0.0062785039999999999],"72":[1.973e-06,1.9769999999999999e-06],"442368":[0.038773687000000001,0.071460164000000034],"147456":[0.0099620430000000003,0.010715718000000001],"4456448":[1.1599461099999999,1.168151602],"63488":[0.0029299090000000005,0.0029991980000000002],"38912":[0.001395924,0.0015022739999999998],"68":[1.9069999999999999e-06,2.0549999999999998e-06],"188416":[0.013650733,0.014941524999999997],"248":[6.8040000000000004e-06,8.1890000000000007e-06],"80":[2.3939999999999999e-06,2.4480000000000001e-06],"2560":[8.7200999999999994e-05,9.4164000000000002e-05],"34816":[0.001169748,0.0012251990000000002],"3712":[0.000108231,0.000112518],"3538944":[0.83045225999999994,0.857103061],"76":[2.2539999999999999e-06,2.537e-06],"4194304":[1.0345142350000001,1.0470660380000001],"851968":[0.13005640900000001,0.17900598099999998],"4096":[0.000128835,0.00013479099999999999],"59392":[0.0024489589999999997,0.0031537650000000006],"84":[2.6120000000000001e-06,2.616e-06],"3276800":[0.74334214399999998,0.76957960199999997],"55296":[0.002216572,0.0022293689999999997],"688128":[0.091986683,0.140539461],"8192":[0.000264436,0.000277581],"10240":[0.00035448699999999996,0.00036811300000000004],"15872":[0.00052059100000000004,0.00052152899999999996],"92":[3.0029999999999999e-06,3.1659999999999998e-06],"26624":[0.00083355700000000007,0.00084919899999999992],"1792":[5.2120000000000002e-05,5.8182e-05],"11776":[0.000490166,0.00049597600000000008],"2944":[0.000107,0.000115812],"88":[2.6429999999999999e-06,2.6800000000000002e-06],"22528":[0.0008936110000000001,0.00092510699999999999],"1245184":[0.240534523,0.29866954400000001],"15728640":[4.335958647,4.3716606479999998],"96":[3.4589999999999998e-06,3.591e-06],"1984":[5.5126e-05,6.1327000000000004e-05],"139264":[0.0082015370000000001,0.008379938],"475136":[0.043601221999999995,0.076484328000000004],"13631488":[3.6284631530000002,3.7094558160000002],"416":[1.1212999999999999e-05,1.2164000000000001e-05],"928":[2.5194999999999998e-05,2.6145000000000001e-05],"512":[1.5806000000000001e-05,1.6035000000000001e-05],"18432":[0.00064910100000000002,0.00065438299999999992],"16777216":[4.6958336230000004],"9728":[0.00035724900000000002,0.00035802800000000009],"1769472":[0.36651125699999998,0.368838781],"1703936":[0.34744523299999996,0.34977015499999997],"2048":[5.9895000000000002e-05,6.6045999999999998e-05],"14336":[0.00042848500000000004,0.00047346399999999999],"448":[1.2446000000000001e-05,1.2706e-05],"5505024":[1.5922684060000001,1.599570838],"544":[1.6384000000000001e-05,1.7331999999999999e-05],"221184":[0.013689079999999998,0.017290521],"90112":[0.005042617000000001,0.0053955219999999981],"640":[2.0653e-05,2.2259000000000002e-05],"12800":[0.000371116,0.00039948699999999991],"262144":[0.017676561,0.017794181999999999],"589824":[0.067957800999999998,0.098193890999999991],"884736":[0.13495338100000001,0.18820202899999999],"6144":[0.000266016,0.00028178200000000006],"1088":[3.4254000000000001e-05,3.6235999999999997e-05],"576":[1.7244e-05,1.8139999999999999e-05],"160":[4.5159999999999996e-06,5.1889999999999998e-06],"672":[2.1899000000000002e-05,2.5837999999999999e-05],"8912896":[2.4578032799999998,2.4759901659999999],"100":[2.5660000000000001e-06,2.7410000000000001e-06],"507904":[0.05198049200000001,0.074452065999999983],"3840":[0.000110832,0.000122545],"192":[6.6590000000000001e-06,8.3329999999999997e-06],"376832":[0.033945023000000005,0.034650075999999995],"98304":[0.0063198600000000009,0.0066539950000000002],"5376":[0.000188011,0.000202969],"94208":[0.0057855669999999993,0.0058375469999999985],"81920":[0.0044069820000000003,0.0046253370000000002],"3407872":[0.78723837799999996,0.80394026600000001],"104":[2.9919999999999999e-06,3.0869999999999998e-06],"122880":[0.006534565,0.0068451080000000008],"200":[5.1460000000000004e-06,5.2850000000000002e-06],"163840":[0.010910919,0.011969517000000001],"4063232":[1.0035535950000001,1.029525751],"5767168":[1.7085573030000001,1.717276778],"12582912":[4.1835433359999996,4.305657343],"1600":[4.2518000000000002e-05,4.6754e-05],"136":[3.7400000000000002e-06,3.8940000000000003e-06],"232":[6.1970000000000001e-06,7.1409999999999999e-06],"7077888":[1.7753903170000001,1.8501731079999999],"86016":[0.0047338190000000002,0.0050419420000000006],"31744":[0.001049524,0.001122734],"168":[4.9219999999999996e-06,5.5929999999999996e-06],"622592":[0.074962203000000019,0.1067818],"108":[2.802e-06,2.8119999999999999e-06],"327680":[0.027156607999999992,0.032054634999999998],"2176":[6.5735999999999995e-05,7.1540999999999998e-05],"3328":[9.7785e-05,0.000112595],"1":[5.4e-08,5.8000000000000003e-08],"2":[5.7000000000000001e-08,6.4000000000000004e-08],"3":[6.5999999999999995e-08,6.8e-08],"4":[7.1e-08,7.4999999999999997e-08],"7424":[0.00021946999999999998,0.000237245],"5":[8.0999999999999997e-08,8.2000000000000006e-08],"23552":[0.00096609599999999995,0.0010151799999999999],"6":[9.0999999999999994e-08,9.9999999999999995e-08],"61440":[0.0026436009999999998,0.003195294],"491520":[0.04618389400000001,0.068753259999999983],"77824":[0.0041086820000000007,0.0045434020000000002],"7":[1.02e-07,1.04e-07],"8":[1.1300000000000001e-07,1.1999999999999999e-07],"208":[5.631e-06,5.7069999999999997e-06],"9":[1.2700000000000001e-07,1.43e-07],"73728":[0.003698587000000001,0.0037004329999999995],"304":[9.4690000000000003e-06,9.7440000000000002e-06],"400":[1.0726e-05,1.1007e-05],"1310720":[0.26708511599999996,0.34463628899999998],"336":[1.0842999999999999e-05,1.1911e-05],"3670016":[0.86617337100000003,0.87971831099999998],"6656":[0.00018968499999999998,0.000199946],"15360":[0.00047270999999999999,0.00049461399999999999],"432":[1.1191e-05,1.2277e-05],"950272":[0.15218071699999999,0.19769536900000001],"655360":[0.084372930999999998,0.12075163899999999],"69632":[0.0033881700000000002,0.0034201430000000005],"11264":[0.000430297,0.00045008199999999998],"2752512":[0.71465035399999999,0.74170595800000005],"8126464":[2.1557566970000002,2.1600739710000001],"27648":[0.00088080099999999996,0.00088141199999999982],"368":[1.3169999999999999e-05,1.3776e-05],"65536":[0.002902445,0.0029638530000000002],"16252928":[4.5363470679999995],"464":[1.3920000000000001e-05,1.3971999999999999e-05],"1015808":[0.173906487,0.21757193999999999],"3072":[0.00012544999999999999,0.000125943],"110592":[0.0056429770000000004,0.0061580619999999997],"237568":[0.015788808999999997,0.016169434],"278528":[0.019348859,0.023818612000000003],"496":[1.3743999999999999e-05,1.5413e-05],"13107200":[3.4288265099999999,3.4607169120000001],"9961472":[2.8577232449999999,2.8922102619999999],"5888":[0.000216763,0.00023576199999999998],"11010048":[3.312000308,3.3529516510000001],"1920":[5.3328000000000002e-05,5.6697999999999998e-05],"2490368":[0.61221133000000005,0.63178798599999997],"19456":[0.00069823200000000002,0.00073182500000000008],"57344":[0.0024427569999999998,0.0025734909999999998],"1179648":[0.21855954899999999,0.26758747799999999],"4718592":[1.253341104,1.2790826900000001],"360448":[0.031110408999999995,0.03310279599999999],"1572864":[0.36320019599999998,0.37546112799999998],"53248":[0.0020887789999999998,0.0027869909999999999],"3456":[9.7143000000000001e-05,0.000109129],"40960":[0.0016050460000000002,0.001647304],"4608":[0.00014968299999999998,0.00016105500000000001],"13824":[0.00040741600000000002,0.00044157399999999997],"819200":[0.122990614,0.156018873],"983040":[0.16301380400000001,0.21873609900000002],"8704":[0.00029233199999999997,0.00030498400000000001],"120":[3.2049999999999998e-06,3.4060000000000001e-06],"1024":[3.2153000000000002e-05,3.2472999999999999e-05],"49152":[0.0022357329999999997,0.0025521770000000001],"524288":[0.052573109999999999,0.084846424999999989],"45056":[0.0018781079999999999,0.0019173670000000001],"229376":[0.014361503999999997,0.015214148],"2688":[9.4728999999999994e-05,9.5565999999999999e-05],"152":[4.8029999999999996e-06,4.809e-06],"5120":[0.000185133,0.00018988699999999999],"1507328":[0.34065696000000001,0.35691563100000001],"1216":[3.9097999999999997e-05,4.2589000000000002e-05],"1966080":[0.40766977500000001,0.42667272699999997],"1900544":[0.40300910000000001,0.40482543300000001],"184":[6.2589999999999997e-06,6.9319999999999999e-06],"7936":[0.00024081000000000002,0.00024267099999999999],"3801088":[0.91649353300000003,0.94404374000000002],"6815744":[1.6832772149999999,1.7838050430000001],"124":[3.3809999999999999e-06,3.5779999999999999e-06],"102400":[0.0051960720000000004,0.0052776689999999996],"311296":[0.023011316,0.027153787000000002],"1408":[5.0098e-05,5.6319000000000001e-05],"393216":[0.042819944999999998,0.043881063999999997],"4352":[0.000142624,0.000142817],"6553600":[1.635315509,1.678449517],"20480":[0.00074698800000000008,0.00075800899999999981],"608":[2.1529e-05,2.1971e-05],"2228224":[0.50886010699999995,0.51207088300000003],"36864":[0.0013333239999999999,0.0015132629999999999],"704":[2.2674e-05,2.6222999999999999e-05],"720896":[0.102872828,0.14076506899999999],"800":[2.0579000000000001e-05,2.3821000000000001e-05],"2621440":[0.65170287599999999,0.67863028700000005],"425984":[0.03499907700000001,0.037067175000000008],"32768":[0.0010673670000000001,0.0011017900000000001],"12058624":[3.8584880410000002,3.9399124919999999],"128":[3.58e-06,3.6119999999999999e-06],"180224":[0.013556537,0.01375879],"224":[6.1120000000000001e-06,6.3400000000000003e-06],"736":[2.6361000000000001e-05,2.747e-05],"320":[9.8640000000000008e-06,1.1871e-05],"557056":[0.060393196999999996,0.085482698999999995],"832":[2.2900000000000001e-05,2.3349999999999998e-05],"9437184":[2.6695359359999999,2.7477072109999998],"3584":[0.000102229,0.000114041],"6291456":[1.995603427,2.1135567329999998],"256":[6.793e-06,7.4649999999999997e-06],"15204352":[4.1239580890000003,4.1712378719999998],"28672":[0.00089651399999999995,0.00089838899999999976],"768":[2.8588000000000001e-05,2.9615999999999999e-05],"212992":[0.013051955000000001,0.015351729999999999],"864":[2.4680000000000001e-05,2.6477000000000001e-05],"352":[1.2031000000000001e-05,1.2483999999999999e-05],"253952":[0.017967712,0.0184811],"960":[2.756e-05,2.9252e-05],"24576":[0.0010067559999999999,0.0011145129999999999],"7680":[0.00022924099999999996,0.00025151299999999998],"294912":[0.022022687999999995,0.024505011],"1048576":[0.18167987799999999,0.23534113000000001],"10485760":[3.0691272509999998,3.1639846550000001],"344064":[0.028803504999999958,0.029906461999999995],"288":[8.1859999999999992e-06,9.4909999999999994e-06],"1152":[3.8411000000000002e-05,4.0263999999999999e-05],"384":[1.2418e-05,1.5034e-05],"2304":[7.4395999999999997e-05,7.5606999999999996e-05],"896":[2.3567e-05,2.7427e-05],"480":[1.4051e-05,1.4562000000000001e-05],"1441792":[0.31255171699999995,0.40235996200000002],"992":[2.8558e-05,2.9572000000000001e-05],"3968":[0.000123504,0.00012874800000000001],"6400":[0.00018740299999999999,0.00019937399999999999],"1344":[4.5216000000000002e-05,4.7095000000000002e-05],"126976":[0.0071701050000000013,0.0074713830000000007],"2883584":[0.787637437,0.836526141],"753664":[0.108076801,0.151300824],"16384":[0.00051285100000000015,0.00057464899999999999],"131072":[0.007596139,0.0079346969999999992],"458752":[0.041703832999999989,0.067198144999999987],"172032":[0.011725637000000001,0.012959479999999999],"12288":[0.00051734100000000015,0.00057165700000000026],"14680064":[3.9590423019999998,4.0329095559999999],"1536":[5.8755999999999998e-05,5.9848e-05],"25600":[0.00074460300000000015,0.00087564099999999992],"1835008":[0.38713563799999995,0.39574311299999998],"10752":[0.000398873,0.00041921700000000005],"21504":[0.000803007,0.0008587],"7602176":[1.971198268,1.973927277],"5632":[0.00020270800000000001,0.00020829299999999997],"10":[1.29e-07,1.3300000000000001e-07],"3145728":[0.89761941000000001,0.90748046699999996],"245760":[0.016281325000000003,0.016625145000000001],"1728":[4.6835999999999997e-05,5.2312999999999999e-05],"11":[1.4399999999999999e-07,1.5099999999999999e-07],"1114112":[0.20157119600000001,0.26204567599999995],"12":[1.6e-07,1.6500000000000001e-07],"7340032":[1.8150274319999999,1.8888372310000001],"7168":[0.00020942999999999998,0.00023176799999999998],"13":[1.73e-07,1.9600000000000001e-07],"6029312":[1.85649302,1.860943206],"14":[1.8e-07,1.9600000000000001e-07],"3200":[8.6373999999999997e-05,9.6620999999999995e-05],"20":[5.2799999999999996e-07,5.8400000000000004e-07],"204800":[0.01220628,0.013428422000000001],"15":[1.92e-07,2.35e-07],"13312":[0.00038909399999999999,0.00042836100000000004],"4980736":[1.357060645,1.3717157960000002],"118784":[0.0080042919999999997,0.0080493449999999994],"51200":[0.001995854,0.002106386],"16":[4.39e-07,4.8100000000000003e-07],"21":[6.2200000000000004e-07,6.37e-07],"917504":[0.14615857600000001,0.20263816500000001],"22":[6.5499999999999998e-07,7.3e-07],"4864":[0.000162084,0.00017294900000000001],"17":[4.9100000000000004e-07,5.5000000000000003e-07],"14848":[0.00044778100000000007,0.00046218500000000005],"23":[7.0299999999999998e-07,8.3799999999999996e-07],"786432":[0.123359543,0.16604432999999999],"18":[4.9999999999999998e-07,5.3200000000000005e-07],"1638400":[0.32803625400000003,0.344097557],"7864320":[2.044937435,2.0729062030000001],"24":[8.1399999999999996e-07,1.0729999999999999e-06],"14155776":[3.7773605190000001,6.8458194649999999],"19":[4.7300000000000001e-07,5.9999999999999997e-07],"30":[8.1800000000000005e-07,9.0800000000000003e-07],"25":[6.9100000000000003e-07,7.9699999999999995e-07],"31":[8.2600000000000001e-07,8.3799999999999996e-07],"1280":[4.2197000000000003e-05,4.4866e-05],"26":[7.0699999999999996e-07,7.4399999999999999e-07],"3932160":[0.96437195899999995,0.968736284],"2432":[7.8906000000000007e-05,8.4364999999999996e-05],"32":[8.9800000000000002e-07,9.1299999999999998e-07],"27":[6.9100000000000003e-07,7.0800000000000004e-07],"409600":[0.033270214999999999,0.040690628]}},{"title":"OrderedDictionary updateValue(_:forKey:), append","results":{"28":[3.365e-06,3.518e-06],"34":[3.8070000000000001e-06,4.3490000000000002e-06],"29":[3.2710000000000001e-06,3.6799999999999999e-06],"40":[4.1080000000000003e-06,4.4000000000000002e-06],"17408":[0.001950011,0.0020660090000000002],"1472":[0.00014574500000000002,0.00015919900000000003],"112":[1.2526e-05,1.3284e-05],"1376256":[0.37266753399999997,0.47530739399999999],"5242880":[2.0108108580000001,2.0203710469999998],"36":[3.8249999999999998e-06,4.5449999999999997e-06],"42":[4.1559999999999997e-06,4.4839999999999998e-06],"11534336":[4.6325551860000003,4.7403538029999996],"114688":[0.017654508999999999,0.017817365999999998],"144":[1.4882000000000001e-05,1.6316000000000001e-05],"38":[4.1489999999999996e-06,4.5349999999999998e-06],"240":[2.7756999999999999e-05,2.8078000000000001e-05],"9216":[0.001017085,0.0010208720000000001],"44":[4.8690000000000003e-06,4.8899999999999998e-06],"1664":[0.000195069,0.00021413999999999998],"196608":[0.027437556000000002,0.028493822000000002],"155648":[0.021896545,0.022384084999999998],"2816":[0.000291136,0.000293357],"50":[5.9499999999999998e-06,6.9720000000000003e-06],"2359296":[0.80661256300000006,0.82595859599999999],"46":[4.4830000000000001e-06,4.8149999999999996e-06],"176":[1.7632999999999999e-05,1.8728000000000001e-05],"52":[6.4169999999999997e-06,6.4609999999999996e-06],"272":[2.885e-05,3.0332e-05],"116":[1.3653e-05,1.3732e-05],"47104":[0.0053463740000000001,0.0056497759999999996],"6912":[0.00086188899999999991,0.00089740100000000014],"1856":[0.00020535399999999999,0.00023072199999999999],"48":[5.3140000000000003e-06,6.1229999999999997e-06],"2097152":[0.74426427299999998,0.74840904200000002],"54":[6.7889999999999997e-06,6.8560000000000001e-06],"2031616":[0.69525423799999997,0.73454656899999993],"43008":[0.0049850020000000005,0.0050817340000000001],"60":[7.199e-06,7.5399999999999998e-06],"30720":[0.0037301190000000005,0.0040729310000000001],"56":[6.5440000000000004e-06,6.9210000000000003e-06],"62":[7.1439999999999997e-06,7.6960000000000005e-06],"58":[7.0400000000000004e-06,7.0469999999999996e-06],"3014656":[1.03252429,1.0618768750000001],"64":[7.2320000000000004e-06,7.5240000000000003e-06],"8388608":[3.6545683320000002,3.6982815809999998],"29696":[0.003645583,0.003747106],"216":[2.4535000000000001e-05,2.7931000000000001e-05],"106496":[0.016601169000000002,0.017489797000000001],"72":[7.1749999999999999e-06,7.6569999999999997e-06],"442368":[0.089112645000000004,0.14318940199999999],"147456":[0.022048841999999999,0.022579815999999999],"4456448":[1.7893648230000001,1.790107605],"63488":[0.008581343,0.0087387279999999977],"38912":[0.0044020279999999997,0.0044220009999999992],"68":[7.1919999999999999e-06,7.8250000000000005e-06],"188416":[0.026291509000000001,0.027007559],"248":[2.7047999999999999e-05,3.0926999999999997e-05],"80":[8.7930000000000003e-06,8.8189999999999998e-06],"2560":[0.00027398800000000002,0.00028036000000000006],"34816":[0.0041285639999999995,0.004175921],"3712":[0.000426072,0.00044322900000000001],"3538944":[1.5477509540000001,1.5869851740000001],"76":[8.3240000000000003e-06,8.8589999999999994e-06],"4194304":[1.706880943,1.7139941859999999],"851968":[0.24102547399999999,0.34059569899999997],"4096":[0.00047261000000000015,0.00050619500000000008],"59392":[0.0078818139999999974,0.0086633790000000023],"84":[8.4689999999999997e-06,9.7070000000000004e-06],"3276800":[1.501253875,1.5474529029999999],"55296":[0.0075609750000000002,0.0078987999999999992],"688128":[0.14072247199999999,0.19359843400000001],"8192":[0.00095676500000000005,0.00099087000000000003],"10240":[0.001089972,0.001102083],"15872":[0.0018485439999999999,0.0019399840000000001],"92":[8.6549999999999993e-06,9.3100000000000006e-06],"26624":[0.0034508429999999999,0.003557307],"1792":[0.00022328200000000005,0.000223771],"11776":[0.0012115369999999999,0.001229625],"2944":[0.00030433100000000002,0.00031904600000000002],"88":[8.5609999999999999e-06,8.6889999999999993e-06],"22528":[0.0024498549999999999,0.0025037920000000003],"1245184":[0.33352359799999998,0.41844557900000001],"15728640":[7.3787406930000001,7.5369903889999996],"96":[1.0111e-05,1.0236e-05],"1984":[0.00022340900000000002,0.000227526],"139264":[0.019520288,0.021063720000000001],"475136":[0.093760605999999996,0.12693832799999999],"13631488":[6.9544858039999999,7.2432395190000003],"416":[4.9639999999999999e-05,5.1418000000000001e-05],"928":[0.000104102,0.000108502],"512":[5.9239e-05,5.9799999999999997e-05],"18432":[0.0020642909999999998,0.0020687500000000003],"16777216":[7.736902325],"9728":[0.0010856359999999998,0.0011074959999999999],"1769472":[0.65618757900000002,0.67080804800000005],"1703936":[0.65558370799999999,0.68667277900000001],"2048":[0.000233651,0.000234334],"14336":[0.0017623229999999997,0.0018709829999999997],"448":[5.2704000000000002e-05,5.5716e-05],"5505024":[2.098482621,2.1252462090000002],"544":[6.0618000000000001e-05,6.3046999999999995e-05],"221184":[0.037977180999999992,0.039932971999999997],"90112":[0.011353228999999998,0.011532860000000001],"640":[6.9264999999999995e-05,7.0290999999999995e-05],"12800":[0.001658695,0.001725278],"262144":[0.043168480000000002,0.044481277999999999],"589824":[0.115648557,0.15896734000000001],"884736":[0.243393886,0.32646149400000002],"6144":[0.00067559,0.00073425899999999991],"1088":[0.00013513199999999999,0.00013711800000000001],"576":[5.9719000000000002e-05,6.3013000000000001e-05],"160":[1.592e-05,1.6143000000000001e-05],"672":[6.9915999999999999e-05,7.2509999999999995e-05],"8912896":[3.9029474359999998,4.0016298069999996],"100":[1.1446e-05,1.1977000000000001e-05],"507904":[0.098392499999999994,0.13879755499999999],"3840":[0.00043278099999999998,0.000471154],"192":[1.9658000000000001e-05,1.9871e-05],"376832":[0.058826587999999999,0.061015642999999994],"98304":[0.01257633,0.012629113000000003],"5376":[0.00058751300000000012,0.00059604200000000008],"94208":[0.011786062,0.012064636],"81920":[0.010652517,0.011500389],"3407872":[1.521458368,1.5470443760000001],"104":[1.3508e-05,1.3645999999999999e-05],"122880":[0.017868120000000005,0.018723377000000034],"200":[2.3003e-05,2.3915999999999999e-05],"163840":[0.022686072999999998,0.024283968999999999],"4063232":[1.674603649,1.6821122979999998],"5767168":[2.197410976,2.2211793630000001],"12582912":[5.0815468780000002,5.1966370690000003],"1600":[0.000193599,0.00020216900000000004],"136":[1.3669000000000001e-05,1.4999e-05],"232":[2.4700999999999999e-05,3.0963000000000002e-05],"7077888":[3.3804165820000001,3.5640340670000001],"86016":[0.010677242,0.011417623],"31744":[0.0037578399999999997,0.0040229659999999993],"168":[1.7626999999999999e-05,1.9008000000000002e-05],"622592":[0.12259347700000001,0.167114016],"108":[1.1668000000000001e-05,1.2928000000000001e-05],"327680":[0.052028580999999963,0.062172813],"2176":[0.00023315599999999999,0.00025607599999999994],"3328":[0.00040550300000000004,0.00043244899999999984],"1":[6.5999999999999995e-08,7.0000000000000005e-08],"2":[3.0100000000000001e-07,3.3299999999999998e-07],"3":[3.3999999999999997e-07,3.7500000000000001e-07],"4":[3.8500000000000002e-07,3.9200000000000002e-07],"7424":[0.00089733599999999999,0.00093709099999999992],"5":[3.96e-07,4.2800000000000002e-07],"23552":[0.0024321539999999997,0.0025694150000000007],"6":[4.1699999999999999e-07,4.1699999999999999e-07],"61440":[0.0081207940000000006,0.0086378769999999987],"491520":[0.096848653999999951,0.12595005500000001],"77824":[0.0098126089999999999,0.010423844],"7":[4.9100000000000004e-07,4.9500000000000003e-07],"8":[9.9800000000000002e-07,1.004e-06],"208":[2.4803e-05,2.5024999999999998e-05],"9":[1.077e-06,1.248e-06],"73728":[0.0094121919999999998,0.010206225999999999],"304":[3.0709e-05,3.2722999999999998e-05],"400":[4.6081999999999997e-05,4.8841000000000002e-05],"1310720":[0.35537759000000002,0.47024210799999999],"336":[3.2592000000000002e-05,3.6052e-05],"3670016":[1.5772410130000001,1.6027131350000001],"6656":[0.00080411199999999984,0.000856827],"15360":[0.001812957,0.001884812],"432":[4.8167000000000001e-05,4.9820000000000001e-05],"950272":[0.25861621299999998,0.35543987100000002],"655360":[0.13396213200000001,0.16657243199999999],"69632":[0.0092696719999999996,0.009518361999999999],"11264":[0.0012367930000000001,0.0013102180000000001],"2752512":[0.93657117700000003,0.99015731299999998],"8126464":[3.5793891179999999,3.6139720529999999],"27648":[0.0035097040000000011,0.003626967],"368":[3.6313000000000003e-05,3.8142999999999997e-05],"65536":[0.008475359,0.0088106630000000016],"16252928":[7.63456929],"464":[5.6023999999999998e-05,5.7028999999999999e-05],"1015808":[0.27538884800000002,0.36819409700000005],"3072":[0.00031931199999999998,0.00033465599999999996],"110592":[0.016686723000000001,0.017638702999999999],"237568":[0.039854535999999996,0.040343807000000009],"278528":[0.044865861,0.048896495999999998],"496":[5.4533000000000001e-05,6.0850000000000002e-05],"13107200":[6.8338887440000002,6.9979222329999997],"9961472":[4.0991856770000004,4.1642749950000004],"5888":[0.00059080199999999986,0.00060385799999999998],"11010048":[4.3987427769999998,4.4453314429999997],"1920":[0.00020879000000000001,0.000231437],"2490368":[0.85612578900000003,0.90035093200000005],"19456":[0.0021571529999999998,0.0022498069999999999],"57344":[0.007887247,0.0079218050000000005],"1179648":[0.32533787199999997,0.42542493199999998],"4718592":[1.845213735,1.8836762389999999],"360448":[0.056145318999999992,0.057902753000000008],"1572864":[0.45641992300000001,0.45723906199999997],"53248":[0.0074924630000000004,0.0086935540000000009],"3456":[0.00041480100000000007,0.00045110699999999991],"40960":[0.0046560000000000004,0.0046920349999999998],"4608":[0.00052318099999999984,0.00052503999999999973],"13824":[0.0017147729999999999,0.0019531310000000003],"819200":[0.23700011300000001,0.30650483499999998],"983040":[0.27454561899999996,0.37281968599999998],"8704":[0.00097002700000000004,0.001035348],"120":[1.2996000000000001e-05,1.3782e-05],"1024":[0.000117009,0.000118595],"49152":[0.0057611280000000008,0.0065285280000000005],"524288":[0.10113451800000001,0.15319533499999999],"45056":[0.0050112869999999997,0.0051777250000000011],"229376":[0.039462267999999995,0.041418837999999999],"2688":[0.000266099,0.00028258800000000001],"152":[1.6432000000000001e-05,1.6962000000000001e-05],"5120":[0.00054135299999999984,0.00058190100000000001],"1507328":[0.42070006599999998,0.42550161200000003],"1216":[0.000120457,0.00012321700000000001],"1966080":[0.68864067500000004,0.71494615299999997],"1900544":[0.66921096199999996,0.69986321499999993],"184":[1.7855000000000001e-05,2.0743000000000001e-05],"7936":[0.000916886,0.00092027400000000011],"3801088":[1.6024663810000002,1.6528115460000001],"6815744":[3.278403763,3.5362159069999999],"124":[1.3742e-05,1.4633e-05],"102400":[0.016331897000000001,0.017466486],"311296":[0.048125294000000006,0.056767774],"1408":[0.00015177299999999998,0.00016475600000000001],"393216":[0.062695496000000003,0.072130232999999988],"4352":[0.00047929299999999999,0.00051459699999999999],"6553600":[3.1954685629999999,3.385765192],"20480":[0.002218622,0.0022869220000000003],"608":[7.2415000000000004e-05,7.3229e-05],"2228224":[0.76597938200000004,0.77838974599999999],"36864":[0.0042723889999999997,0.0044241050000000011],"704":[6.9245000000000005e-05,7.5343e-05],"720896":[0.14867560399999999,0.19591781899999999],"800":[9.6302000000000001e-05,0.00011003899999999997],"2621440":[0.88816045600000004,0.90881531900000001],"425984":[0.086144193999999993,0.089744280999999995],"32768":[0.0038404090000000017,0.0039430740000000004],"12058624":[4.8847043159999997,4.9457772059999998],"128":[1.3597999999999999e-05,1.4035e-05],"180224":[0.026009694999999999,0.026157903],"224":[2.4366999999999999e-05,2.6338000000000001e-05],"736":[7.0530000000000004e-05,8.1637999999999993e-05],"320":[3.269e-05,3.8269999999999998e-05],"557056":[0.110665796,0.13537452],"832":[9.8491000000000003e-05,0.0001036],"9437184":[3.994600664,4.1588908800000004],"3584":[0.00041426200000000004,0.00044689700000000003],"6291456":[2.4526662539999999,2.566051673],"256":[2.6162000000000001e-05,2.9933e-05],"15204352":[7.2220256159999998,7.3682225880000001],"28672":[0.0035940500000000001,0.0037546430000000007],"768":[8.0502999999999998e-05,8.0980000000000001e-05],"212992":[0.037756647999999997,0.038147407000000001],"864":[0.000104287,0.000116258],"352":[3.6220999999999998e-05,3.8108999999999997e-05],"253952":[0.041721379000000003,0.043250167999999992],"960":[0.00010545300000000001,0.000116564],"24576":[0.0025176089999999996,0.002922301],"7680":[0.00088470699999999988,0.00094216799999999996],"294912":[0.046288969000000006,0.052154622999999997],"1048576":[0.28870974599999999,0.37120719299999999],"10485760":[4.1745264869999996,4.3906948379999999],"344064":[0.054301663,0.055032634999999996],"288":[3.0079000000000001e-05,3.2045000000000002e-05],"1152":[0.00012984200000000002,0.00013014399999999998],"384":[3.7827000000000002e-05,4.3656999999999999e-05],"2304":[0.00024383599999999996,0.00026199099999999994],"896":[0.00010106399999999999,0.000109331],"480":[5.5529999999999999e-05,5.8697999999999999e-05],"1441792":[0.39286253300000001,0.49689302800000001],"992":[0.000109728,0.00011798100000000001],"3968":[0.00046378900000000004,0.00047712199999999996],"6400":[0.0007977049999999999,0.00087899699999999996],"1344":[0.00013822499999999999,0.00014588899999999999],"126976":[0.018302356999999998,0.019067463999999999],"2883584":[1.013137411,1.073150316],"753664":[0.15275332799999999,0.22062378099999999],"16384":[0.001878186,0.001993931],"131072":[0.019177799000000002,0.019857436999999999],"458752":[0.091949701000000009,0.12884573499999999],"172032":[0.023752097999999992,0.025415251999999999],"12288":[0.001319024,0.001384854],"14680064":[7.1263211709999998,7.5023282839999998],"1536":[0.00016150600000000001,0.000164461],"25600":[0.0033785410000000001,0.0038887650000000162],"1835008":[0.69040174700000001,0.69568225699999997],"10752":[0.0011692649999999996,0.0011982820000000002],"21504":[0.0022504529999999999,0.002411215],"7602176":[3.5130410599999999,3.531163523],"5632":[0.000578251,0.00059099500000000008],"10":[1.0759999999999999e-06,1.2100000000000001e-06],"3145728":[1.0955115440000001,1.1038171490000002],"245760":[0.040394414000000003,0.042107469999999994],"1728":[0.00020929,0.00020980700000000001],"11":[1.3510000000000001e-06,1.378e-06],"1114112":[0.29896390699999997,0.38996302900000002],"12":[1.3969999999999999e-06,1.4330000000000001e-06],"7340032":[3.2968618639999998,3.4516956849999998],"7168":[0.00088786699999999997,0.00091927400000000009],"13":[2.4150000000000002e-06,2.4779999999999998e-06],"6029312":[2.2935936909999999,2.3244265300000002],"14":[2.4439999999999998e-06,2.463e-06],"3200":[0.000396625,0.00042759499999999996],"20":[2.2859999999999998e-06,2.4590000000000001e-06],"204800":[0.036616694999999998,0.038239410000000001],"15":[2.306e-06,2.8600000000000001e-06],"13312":[0.001685572,0.001785423],"4980736":[1.931806036,1.9723941730000001],"118784":[0.017951079999999998,0.018768534],"51200":[0.0072735279999999996,0.0090398480000000031],"16":[2.159e-06,2.2409999999999998e-06],"21":[2.3779999999999999e-06,2.4719999999999998e-06],"917504":[0.24609365400000005,0.36295760300000002],"22":[2.5270000000000001e-06,2.7099999999999999e-06],"4864":[0.00052223000000000016,0.00055167699999999998],"17":[2.137e-06,2.2919999999999998e-06],"14848":[0.0017702010000000001,0.00181339],"23":[2.5720000000000001e-06,3.1990000000000002e-06],"786432":[0.166362977,0.22167516799999998],"18":[2.3080000000000002e-06,2.4420000000000001e-06],"1638400":[0.64342099900000005,0.660648507],"7864320":[3.532069168,3.5411805689999998],"24":[2.8109999999999999e-06,3.0429999999999999e-06],"14155776":[7.0476029469999997,15.061555032999999],"19":[2.1459999999999999e-06,2.379e-06],"30":[3.569e-06,3.6049999999999998e-06],"25":[3.2040000000000002e-06,4.0509999999999998e-06],"31":[3.4860000000000002e-06,3.5700000000000001e-06],"1280":[0.000133535,0.000139963],"26":[3.2540000000000001e-06,3.5769999999999998e-06],"3932160":[1.631168857,1.692720757],"2432":[0.000253763,0.000273264],"32":[3.5769999999999998e-06,3.777e-06],"27":[3.066e-06,3.4489999999999999e-06],"409600":[0.083775488000000009,0.09837455299999999]}},{"title":"OrderedDictionary random swaps","results":{"28":[1.483e-06,1.5600000000000001e-06],"34":[1.891e-06,1.9080000000000002e-06],"29":[1.418e-06,1.4330000000000001e-06],"40":[1.8080000000000001e-06,2.1289999999999999e-06],"17408":[0.0010771330000000001,0.0010938739999999999],"1472":[9.5463000000000004e-05,0.000102588],"112":[5.3410000000000002e-06,5.9669999999999998e-06],"1376256":[0.245927164,0.31448205299999998],"5242880":[1.3019330419999999,1.3070401839999999],"36":[1.872e-06,1.9889999999999999e-06],"42":[2.0719999999999998e-06,2.2400000000000002e-06],"11534336":[3.1042936189999999,3.144577913],"114688":[0.0087936420000000008,0.011044653999999998],"144":[7.6249999999999998e-06,7.6680000000000001e-06],"38":[2.1490000000000001e-06,2.3860000000000001e-06],"240":[1.2177e-05,1.2578999999999999e-05],"9216":[0.00054339799999999984,0.00058925099999999973],"44":[2.4150000000000002e-06,2.503e-06],"1664":[9.0519999999999994e-05,9.5047e-05],"196608":[0.018526958,0.018834759999999999],"155648":[0.013166677,0.013509041000000003],"2816":[0.00017474799999999999,0.00018960800000000002],"50":[2.526e-06,2.5770000000000001e-06],"2359296":[0.50115770299999995,0.52353870199999997],"46":[2.362e-06,2.4090000000000001e-06],"176":[9.6099999999999995e-06,1.0491e-05],"52":[2.4269999999999998e-06,2.4880000000000001e-06],"272":[1.4239e-05,1.4994000000000001e-05],"116":[5.6509999999999998e-06,6.0859999999999998e-06],"47104":[0.0034834190000000002,0.0035995600000000003],"6912":[0.00039004399999999993,0.000409157],"1856":[9.9411000000000001e-05,0.000107336],"48":[2.6520000000000002e-06,2.7939999999999998e-06],"2097152":[0.43337136900000001,0.437875652],"54":[2.6860000000000002e-06,2.7310000000000002e-06],"2031616":[0.418195174,0.42426590600000003],"43008":[0.0028849100000000001,0.0032220220000000002],"60":[3.0400000000000001e-06,3.1209999999999998e-06],"30720":[0.0018623770000000001,0.00192823],"56":[2.6529999999999998e-06,2.835e-06],"62":[3.0580000000000002e-06,3.1109999999999999e-06],"58":[2.892e-06,2.942e-06],"3014656":[0.67782785599999995,0.73455841399999999],"64":[3.3500000000000001e-06,3.4379999999999999e-06],"8388608":[2.128665239,2.1476361229999998],"29696":[0.00170017,0.0017505370000000004],"216":[1.0514e-05,1.1282e-05],"106496":[0.007765002,0.0082055419999999997],"72":[3.5300000000000001e-06,3.5990000000000002e-06],"442368":[0.045159062,0.067965474999999997],"147456":[0.012504049,0.012959366999999999],"4456448":[1.062474857,1.0808681440000001],"63488":[0.0044199959999999998,0.0046140720000000003],"38912":[0.0024690549999999999,0.002573873],"68":[3.405e-06,3.7170000000000002e-06],"188416":[0.016975356,0.019218771000000003],"248":[1.2842e-05,1.4735999999999999e-05],"80":[4.3470000000000001e-06,4.3919999999999996e-06],"2560":[0.00015197800000000001,0.00016193699999999996],"34816":[0.0021933540000000002,0.002200928],"3712":[0.00020292800000000001,0.00021185299999999997],"3538944":[0.81929180000000001,0.820198973],"76":[3.8970000000000001e-06,4.994e-06],"4194304":[0.99809426000000001,1.0127667229999999],"851968":[0.13154448999999999,0.168732983],"4096":[0.00022820099999999998,0.00024608999999999997],"59392":[0.0039546809999999998,0.0044860400000000002],"84":[4.5870000000000003e-06,5.0259999999999998e-06],"3276800":[0.746108577,0.76245844500000004],"55296":[0.0036022159999999997,0.0037320699999999997],"688128":[0.096714405000000017,0.12758239599999999],"8192":[0.000465081,0.00051453999999999996],"10240":[0.00063458799999999962,0.000660558],"15872":[0.00094636799999999984,0.0010170869999999999],"92":[5.181e-06,5.6749999999999999e-06],"26624":[0.0014662360000000003,0.0015663679999999998],"1792":[9.7745999999999996e-05,0.000104571],"11776":[0.0008093079999999999,0.00081153799999999999],"2944":[0.000197715,0.00020868500000000004],"88":[4.6999999999999999e-06,4.809e-06],"22528":[0.0016286689999999999,0.0016291950000000006],"1245184":[0.21967286999999999,0.27816376399999998],"15728640":[4.3045876200000004,4.382701763],"96":[5.8900000000000004e-06,6.2940000000000002e-06],"1984":[0.000108386,0.00010982200000000001],"139264":[0.011015691999999997,0.011524013],"475136":[0.049967929999999994,0.076810504000000016],"13631488":[3.6982247699999999,3.890342703],"416":[2.1702e-05,2.2359000000000001e-05],"928":[4.7633000000000003e-05,5.2398999999999998e-05],"512":[2.9300000000000001e-05,3.1077000000000001e-05],"18432":[0.0011366669999999998,0.001159635],"16777216":[4.5705513],"9728":[0.00061558800000000003,0.00064493300000000009],"1769472":[0.348544733,0.35012906999999999],"1703936":[0.34332232900000004,0.345907823],"2048":[0.000115788,0.000118513],"14336":[0.00081592500000000001,0.00082793199999999997],"448":[2.3411e-05,2.4070000000000002e-05],"5505024":[1.395906965,1.43561845],"544":[2.8625000000000001e-05,3.2036999999999998e-05],"221184":[0.018262486000000001,0.019623355999999998],"90112":[0.007349848,0.0075496549999999997],"640":[3.9567000000000003e-05,3.9739e-05],"12800":[0.0007116510000000001,0.0007199639999999998],"262144":[0.021518833000000001,0.022829413999999996],"589824":[0.075794951999999999,0.103728111],"884736":[0.13991463700000001,0.173038424],"6144":[0.00046263499999999998,0.000490469],"1088":[6.9954000000000001e-05,7.0644999999999999e-05],"576":[3.2910000000000002e-05,3.3796e-05],"160":[8.3089999999999996e-06,9.0000000000000002e-06],"672":[3.9511000000000002e-05,4.3056999999999998e-05],"8912896":[2.2825272399999998,2.3954671570000001],"100":[4.617e-06,4.904e-06],"507904":[0.059957940999999994,0.081205009999999994],"3840":[0.00020710299999999993,0.00023121799999999999],"192":[1.1676e-05,1.2982999999999999e-05],"376832":[0.038995558,0.040086198000000003],"98304":[0.0085991550000000007,0.0088484619999999979],"5376":[0.00033661499999999996,0.00038182400000000006],"94208":[0.0079588300000000018,0.0080757649999999986],"81920":[0.0064208420000000004,0.0078476809999999987],"3407872":[0.78254393,0.80086172200000005],"104":[5.2209999999999996e-06,5.5879999999999997e-06],"122880":[0.0093331910000000011,0.0096190350000000015],"200":[1.0101999999999999e-05,1.0162e-05],"163840":[0.013902575,0.015641479],"4063232":[0.93505461400000001,0.94662713799999998],"5767168":[1.4841568760000001,1.5007794409999999],"12582912":[3.497718023,3.5585686430000001],"1600":[8.0520999999999997e-05,8.8422000000000001e-05],"136":[7.1210000000000001e-06,7.2230000000000001e-06],"232":[1.1328000000000001e-05,1.3206e-05],"7077888":[1.734722396,1.8432304580000001],"86016":[0.0069504099999999997,0.0073344180000000005],"31744":[0.0018730649999999997,0.0019670570000000004],"168":[9.1249999999999999e-06,1.0198e-05],"622592":[0.081286644999999991,0.10442928],"108":[5.1420000000000001e-06,5.215e-06],"327680":[0.031211540000000003,0.039782795000000003],"2176":[0.00012545300000000001,0.000134816],"3328":[0.00017541400000000001,0.00019463799999999999],"1":[5.2000000000000002e-08,5.2000000000000002e-08],"2":[5.1e-08,5.1e-08],"3":[6.1000000000000004e-08,6.8999999999999996e-08],"4":[7.1e-08,7.4000000000000001e-08],"7424":[0.00040598000000000007,0.00041814900000000004],"5":[7.3000000000000005e-08,8.0999999999999997e-08],"23552":[0.001675682,0.0017323100000000001],"6":[7.7999999999999997e-08,7.9000000000000006e-08],"61440":[0.0041523230000000003,0.0045618339999999999],"491520":[0.053569997999999994,0.076317225000000002],"77824":[0.0060294059999999993,0.0062537009999999978],"7":[8.9000000000000003e-08,9.0999999999999994e-08],"8":[8.7999999999999994e-08,9.2000000000000003e-08],"208":[1.0387000000000001e-05,1.0474e-05],"9":[1.1600000000000001e-07,1.1600000000000001e-07],"73728":[0.0054718560000000006,0.0062461940000000009],"304":[1.5987000000000001e-05,1.7547e-05],"400":[1.9409999999999999e-05,2.1571000000000001e-05],"1310720":[0.232706411,0.29464985500000002],"336":[1.8632999999999999e-05,2.1095999999999999e-05],"3670016":[0.842397638,0.85693335900000001],"6656":[0.00035557299999999998,0.00038594999999999998],"15360":[0.00086641099999999987,0.00093814599999999995],"432":[2.1026000000000002e-05,2.1911000000000001e-05],"950272":[0.154254733,0.194038819],"655360":[0.090116535999999997,0.11207985600000001],"69632":[0.0051510130000000012,0.0053532690000000008],"11264":[0.00074740100000000019,0.00079546700000000001],"2752512":[0.59899899700000003,0.633364343],"8126464":[2.0158130459999999,2.0889485799999998],"27648":[0.0015420939999999999,0.001632667],"368":[2.1413e-05,2.2137000000000002e-05],"65536":[0.004590289,0.004739732],"16252928":[4.3500982029999999],"464":[2.5505999999999999e-05,2.6931e-05],"1015808":[0.171456003,0.21194516299999999],"3072":[0.00021503199999999998,0.00022056800000000003],"110592":[0.0082507610000000006,0.0085502550000000031],"237568":[0.019515485000000003,0.019705621999999999],"278528":[0.026727191000000004,0.027069111],"496":[2.7044000000000001e-05,2.9760999999999998e-05],"13107200":[3.546132251,3.6178234599999999],"9961472":[2.5670132419999998,2.5970634920000002],"5888":[0.00038332500000000001,0.00040517499999999997],"11010048":[2.9217115300000001,3.009477307],"1920":[0.000101636,0.000106304],"2490368":[0.52895144400000005,0.54661185000000001],"19456":[0.0012132829999999999,0.001232768],"57344":[0.0037833089999999999,0.0038217920000000001],"1179648":[0.20303516999999999,0.256625029],"4718592":[1.1506259889999999,1.1671347299999999],"360448":[0.035240445999999988,0.043029165999999994],"1572864":[0.29762988499999998,0.31989210000000001],"53248":[0.0034432730000000002,0.0036330680000000006],"3456":[0.00019963900000000002,0.000203523],"40960":[0.0027082360000000006,0.0027392290000000001],"4608":[0.00027371300000000008,0.00028145299999999998],"13824":[0.00080546899999999995,0.0008452100000000001],"819200":[0.128993042,0.15742757499999999],"983040":[0.161362903,0.20781978600000001],"8704":[0.00050606800000000003,0.00052850199999999992],"120":[5.8880000000000002e-06,6.4320000000000004e-06],"1024":[5.5605e-05,5.9389999999999999e-05],"49152":[0.003746938,0.004001976],"524288":[0.060230698000000006,0.086751215999999992],"45056":[0.003192159,0.0032568899999999997],"229376":[0.018882691,0.021243986999999999],"2688":[0.000179039,0.000180352],"152":[8.5730000000000008e-06,8.6209999999999993e-06],"5120":[0.00031857700000000001,0.000340095],"1507328":[0.28052339399999998,0.280583474],"1216":[7.0450000000000005e-05,7.3051000000000002e-05],"1966080":[0.39171736000000001,0.398674482],"1900544":[0.37310449699999998,0.38697653100000001],"184":[1.0754000000000001e-05,1.2184000000000001e-05],"7936":[0.00044511699999999997,0.000448145],"3801088":[0.89195744399999999,0.90100110999999994],"6815744":[1.6823735389999999,1.780069431],"124":[6.2339999999999999e-06,6.793e-06],"102400":[0.0074029730000000002,0.007769415],"311296":[0.027855277999999994,0.033911027000000024],"1408":[8.8534000000000003e-05,9.6395000000000001e-05],"393216":[0.041958279000000036,0.051829383999999999],"4352":[0.00026532699999999999,0.000276848],"6553600":[1.634285022,1.693361863],"20480":[0.0013228389999999997,0.0014163280000000001],"608":[3.9829000000000001e-05,4.0782999999999999e-05],"2228224":[0.47161783299999999,0.47313027099999999],"36864":[0.0022743870000000001,0.0024023959999999994],"704":[4.2688000000000002e-05,4.5200000000000001e-05],"720896":[0.103910155,0.13150657800000001],"800":[4.3180999999999999e-05,4.7580000000000002e-05],"2621440":[0.55999080199999995,0.59926059399999998],"425984":[0.041111304000000001,0.044970015000000009],"32768":[0.00193725,0.0019885510000000003],"12058624":[3.2635527049999999,3.3261264690000001],"128":[6.4649999999999999e-06,6.5660000000000003e-06],"180224":[0.015908954999999995,0.016927573000000001],"224":[1.1297e-05,1.1435e-05],"736":[4.8390999999999998e-05,4.8520999999999998e-05],"320":[1.7401000000000002e-05,2.1284000000000002e-05],"557056":[0.065222880000000011,0.091670693999999983],"832":[4.1693000000000002e-05,4.2540000000000003e-05],"9437184":[2.4677842920000002,2.5581364660000001],"3584":[0.000192709,0.00021441400000000007],"6291456":[1.679154901,1.7831351980000001],"256":[1.3304e-05,1.3797e-05],"15204352":[4.1440035689999997,4.1555810209999997],"28672":[0.0016513540000000001,0.001705221],"768":[4.7241999999999999e-05,4.7500000000000003e-05],"212992":[0.017445374999999999,0.019473981999999997],"864":[4.5611000000000001e-05,5.0918000000000003e-05],"352":[2.0185000000000001e-05,2.1263e-05],"253952":[0.021098052999999999,0.023956371000000004],"960":[5.2371999999999999e-05,5.5810000000000003e-05],"24576":[0.0017986669999999999,0.0020404730000000001],"7680":[0.00045393299999999995,0.00046908999999999997],"294912":[0.026470775000000002,0.029455366],"1048576":[0.17869997700000001,0.22024091500000001],"10485760":[2.7611017050000002,2.8344811399999998],"344064":[0.033336523,0.035429970000000005],"288":[1.4664000000000001e-05,1.7135000000000001e-05],"1152":[6.8715999999999997e-05,7.1595999999999997e-05],"384":[2.3195000000000001e-05,2.6801e-05],"2304":[0.00013473200000000001,0.000144027],"896":[4.7521999999999997e-05,5.0481e-05],"480":[2.5176000000000001e-05,2.6251e-05],"1441792":[0.26927135899999999,0.327690918],"992":[5.4824999999999998e-05,5.5262e-05],"3968":[0.00022679299999999995,0.00023892],"6400":[0.00033778399999999999,0.00037428599999999993],"1344":[7.8571000000000004e-05,7.8986999999999994e-05],"126976":[0.0097508279999999978,0.010090956],"2883584":[0.66189011200000003,0.71104979099999999],"753664":[0.11513983799999999,0.141694816],"16384":[0.000965101,0.001039767],"131072":[0.010317056,0.010868664],"458752":[0.049577072999999999,0.068913178000000033],"172032":[0.014902148,0.015706754999999996],"12288":[0.00084993500000000012,0.00092496800000000019],"14680064":[3.9400098109999999,4.1281056500000002],"1536":[9.8812000000000002e-05,0.0001115],"25600":[0.001401942,0.001611634],"1835008":[0.37084287599999999,0.37794555000000002],"10752":[0.00070344699999999995,0.0007467760000000001],"21504":[0.0014258670000000001,0.0015199970000000001],"7602176":[1.8985657739999999,1.924058311],"5632":[0.00035855800000000003,0.00039563000000000001],"10":[1.12e-07,1.1899999999999999e-07],"3145728":[0.71182029599999996,0.72097233700000007],"245760":[0.020678402000000002,0.023809859999999995],"1728":[8.8214999999999995e-05,9.5798000000000007e-05],"11":[1.1899999999999999e-07,1.29e-07],"1114112":[0.186013029,0.23812033699999999],"12":[1.11e-07,1.3e-07],"7340032":[1.789917684,1.861775145],"7168":[0.000442416,0.00046239499999999999],"13":[1.3899999999999999e-07,1.42e-07],"6029312":[1.562314118,1.586972445],"14":[1.23e-07,1.3899999999999999e-07],"3200":[0.00016362700000000001,0.00018675400000000002],"20":[7.6599999999999995e-07,9.5600000000000004e-07],"204800":[0.016481744,0.020993412999999999],"15":[1.4000000000000001e-07,1.6899999999999999e-07],"13312":[0.00073940699999999998,0.00075703700000000001],"4980736":[1.219337058,1.235922854],"118784":[0.0091643470000000015,0.009385741999999999],"51200":[0.0032616959999999993,0.0037807209999999995],"16":[7.8599999999999997e-07,8.6000000000000002e-07],"21":[9.6800000000000009e-07,1.083e-06],"917504":[0.14536691300000004,0.188859266],"22":[1.248e-06,1.305e-06],"4864":[0.00029217499999999999,0.00032131999999999994],"17":[7.2699999999999999e-07,8.6000000000000002e-07],"14848":[0.00084846100000000001,0.00087124899999999994],"23":[1.226e-06,1.279e-06],"786432":[0.12017624100000002,0.14606547999999997],"18":[8.0500000000000002e-07,1.063e-06],"1638400":[0.324920708,0.334961016],"7864320":[1.9969622039999999,1.998561005],"24":[1.3570000000000001e-06,1.5460000000000001e-06],"14155776":[3.8110565049999998,8.9557135169999995],"19":[7.8199999999999999e-07,1.009e-06],"30":[1.486e-06,1.5120000000000001e-06],"25":[1.2279999999999999e-06,1.3999999999999999e-06],"31":[1.449e-06,1.609e-06],"1280":[7.7902000000000001e-05,8.1578999999999999e-05],"26":[1.3400000000000001e-06,1.3939999999999999e-06],"3932160":[0.89450280500000001,0.92654484000000004],"2432":[0.00014401100000000004,0.00014999100000000006],"32":[1.5489999999999999e-06,1.5820000000000001e-06],"27":[1.175e-06,1.3200000000000001e-06],"409600":[0.039569052,0.053155918000000003]}},{"title":"OrderedDictionary partitioning around middle","results":{"28":[3.6100000000000002e-07,4.0400000000000002e-07],"34":[4.5299999999999999e-07,4.5499999999999998e-07],"29":[3.84e-07,4.58e-07],"40":[3.9299999999999999e-07,4.2199999999999999e-07],"17408":[0.00029423999999999987,0.000311835],"1472":[2.3791e-05,2.4340000000000001e-05],"112":[1.2440000000000001e-06,1.4360000000000001e-06],"1376256":[0.034609484999999995,0.045523131999999994],"5242880":[0.21920757900000001,0.22885702999999999],"36":[4.34e-07,6.7700000000000004e-07],"42":[4.9299999999999998e-07,7.1299999999999999e-07],"11534336":[0.54638827700000003,0.55652951399999995],"114688":[0.0019922959999999997,0.002171231],"144":[1.561e-06,1.663e-06],"38":[3.15e-07,5.3099999999999998e-07],"240":[2.6460000000000002e-06,2.762e-06],"9216":[0.000152318,0.000155],"44":[5.5000000000000003e-07,6.1999999999999999e-07],"1664":[2.2272999999999998e-05,2.5250999999999999e-05],"196608":[0.0042604979999999997,0.0042924640000000002],"155648":[0.0030658159999999999,0.003066568],"2816":[4.9595999999999997e-05,5.1928999999999997e-05],"50":[5.75e-07,5.8400000000000004e-07],"2359296":[0.073491464000000006,0.073530280000000003],"46":[5.2799999999999996e-07,5.7000000000000005e-07],"176":[2.1550000000000001e-06,2.289e-06],"52":[4.4200000000000001e-07,4.82e-07],"272":[3.1429999999999998e-06,3.5360000000000001e-06],"116":[1.223e-06,1.4050000000000001e-06],"47104":[0.00089548800000000006,0.00094421100000000003],"6912":[0.000104289,0.000109986],"1856":[2.6352000000000001e-05,2.8021000000000002e-05],"48":[5.9400000000000005e-07,6.2099999999999996e-07],"2097152":[0.062991889999999967,0.064219222000000034],"54":[5.9500000000000002e-07,7.3600000000000003e-07],"2031616":[0.05717135700000002,0.060592843],"43008":[0.00076915699999999991,0.00079158500000000003],"60":[6.9800000000000003e-07,8.6899999999999996e-07],"30720":[0.00050074099999999997,0.00053548500000000015],"56":[6.6599999999999996e-07,7.0900000000000001e-07],"62":[6.1500000000000004e-07,8.0599999999999999e-07],"58":[5.0399999999999996e-07,7.0900000000000001e-07],"3014656":[0.10298877300000001,0.11999570800000001],"64":[7.5199999999999996e-07,8.8400000000000003e-07],"8388608":[0.36553850599999999,0.36557614199999999],"29696":[0.000454587,0.00047380100000000009],"216":[2.3159999999999999e-06,2.407e-06],"106496":[0.001805755,0.0018259560000000001],"72":[7.2900000000000003e-07,9.0100000000000003e-07],"442368":[0.0090333089999999998,0.010372779],"147456":[0.0027964499999999998,0.002877952],"4456448":[0.17572042700000001,0.18072585399999999],"63488":[0.0010715799999999997,0.0010924560000000001],"38912":[0.00066799100000000027,0.00067972400000000004],"68":[7.0800000000000004e-07,8.5600000000000004e-07],"188416":[0.0039110389999999998,0.0041588800000000011],"248":[2.5679999999999998e-06,3.061e-06],"80":[9.879999999999999e-07,1.052e-06],"2560":[4.2391000000000001e-05,4.4316000000000001e-05],"34816":[0.00058674499999999984,0.0005918430000000001],"3712":[5.6589999999999999e-05,5.7927999999999998e-05],"3538944":[0.13210755800000001,0.13420387499999997],"76":[8.6099999999999999e-07,1.063e-06],"4194304":[0.16151108999999997,0.17486465500000004],"851968":[0.018334962,0.023382864999999996],"4096":[6.4201000000000004e-05,6.8719000000000004e-05],"59392":[0.0009841330000000001,0.001019891],"84":[1.1069999999999999e-06,1.223e-06],"3276800":[0.121703878,0.130020152],"55296":[0.000892076,0.00093473600000000003],"688128":[0.016309135999999995,0.018006853999999996],"8192":[0.00013405099999999999,0.00013663999999999999],"10240":[0.00017502800000000003,0.00017716500000000002],"15872":[0.00026524400000000004,0.00026695900000000004],"92":[9.7300000000000004e-07,1.015e-06],"26624":[0.00040256500000000002,0.00043770199999999999],"1792":[2.3830999999999999e-05,2.7498999999999999e-05],"11776":[0.00022035199999999999,0.00022047699999999996],"2944":[5.2064000000000002e-05,5.605e-05],"88":[9.9000000000000005e-07,1.0330000000000001e-06],"22528":[0.00044993600000000001,0.00045070899999999998],"1245184":[0.030767676000000001,0.038873379999999999],"15728640":[0.68666897199999999,0.70156435800000005],"96":[1.4529999999999999e-06,1.6500000000000001e-06],"1984":[2.7682999999999999e-05,2.8008999999999999e-05],"139264":[0.0025420809999999999,0.0027087600000000002],"475136":[0.010129483999999999,0.011287769999999999],"13631488":[0.58820584200000003,0.63738630400000007],"416":[4.1540000000000004e-06,4.7690000000000004e-06],"928":[1.163e-05,1.2149e-05],"512":[6.1449999999999996e-06,6.6730000000000003e-06],"18432":[0.00032224599999999988,0.000325648],"16777216":[0.74292107100000004],"9728":[0.00016612900000000005,0.000179681],"1769472":[0.047920852999999999,0.051657577999999996],"1703936":[0.049250167999999997,0.051641785000000009],"2048":[2.9371000000000001e-05,3.4374e-05],"14336":[0.00022353799999999999,0.000235424],"448":[4.3270000000000002e-06,5.2290000000000002e-06],"5505024":[0.23958248100000001,0.246551408],"544":[6.3409999999999999e-06,6.8109999999999997e-06],"221184":[0.0041258390000000001,0.0043553000000000012],"90112":[0.0017300150000000003,0.0018171860000000001],"640":[8.5250000000000005e-06,9.1470000000000007e-06],"12800":[0.00019442100000000001,0.000212981],"262144":[0.0049913860000000004,0.0052870620000000004],"589824":[0.013065,0.014742162],"884736":[0.019846455999999995,0.023967868],"6144":[0.000116439,0.000133662],"1088":[1.5359e-05,1.5401e-05],"576":[7.1539999999999996e-06,7.8509999999999999e-06],"160":[1.7740000000000001e-06,2.407e-06],"672":[8.6519999999999995e-06,1.0225e-05],"8912896":[0.41636920100000002,0.42474687899999997],"100":[1.0499999999999999e-06,1.175e-06],"507904":[0.010492944000000001,0.012497633000000001],"3840":[5.9685000000000002e-05,6.1208000000000001e-05],"192":[2.2050000000000001e-06,2.4959999999999999e-06],"376832":[0.0085990569999999985,0.0092452610000000011],"98304":[0.0020388680000000001,0.00208063],"5376":[9.2499999999999999e-05,9.9461000000000002e-05],"94208":[0.0018585709999999998,0.0018714820000000001],"81920":[0.001584167,0.001754593],"3407872":[0.12623601100000001,0.130526639],"104":[1.26e-06,1.3340000000000001e-06],"122880":[0.0021344489999999996,0.002257167],"200":[2.058e-06,2.1550000000000001e-06],"163840":[0.0031815899999999993,0.003301811],"4063232":[0.15474938899999999,0.15814014700000001],"5767168":[0.25959154000000001,0.26115018899999998],"12582912":[0.62419050700000001,0.65594122700000002],"1600":[2.0143e-05,2.1104999999999999e-05],"136":[1.513e-06,1.6759999999999999e-06],"232":[2.2170000000000001e-06,2.695e-06],"7077888":[0.293445069,0.31078456600000004],"86016":[0.001615029,0.00171079],"31744":[0.00051321600000000015,0.00058831599999999997],"168":[1.7090000000000001e-06,2.199e-06],"622592":[0.01407187,0.015297399999999999],"108":[1.3039999999999999e-06,1.358e-06],"327680":[0.0072676919999999992,0.0074446080000000001],"2176":[3.3835999999999999e-05,3.7119999999999997e-05],"3328":[4.6202999999999998e-05,5.7621999999999998e-05],"1":[6.1999999999999999e-08,6.4000000000000004e-08],"2":[6.5e-08,6.5e-08],"3":[6.7000000000000004e-08,8.0999999999999997e-08],"4":[7.3000000000000005e-08,8.4999999999999994e-08],"7424":[0.000112456,0.000115661],"5":[6.8999999999999996e-08,8.0000000000000002e-08],"23552":[0.00046278900000000007,0.00047919199999999998],"6":[6.8999999999999996e-08,7.7000000000000001e-08],"61440":[0.001037891,0.0010902100000000001],"491520":[0.01076685,0.011485391000000001],"77824":[0.0014692189999999999,0.0014906189999999999],"7":[7.1999999999999996e-08,7.4000000000000001e-08],"8":[7.1999999999999996e-08,7.7999999999999997e-08],"208":[1.968e-06,2.5730000000000002e-06],"9":[7.3000000000000005e-08,8.9999999999999999e-08],"73728":[0.001299414,0.001444971],"304":[3.7100000000000001e-06,3.7749999999999999e-06],"400":[4.0010000000000003e-06,4.3710000000000002e-06],"1310720":[0.033003206,0.042884985],"336":[4.048e-06,4.2130000000000002e-06],"3670016":[0.13749799700000001,0.13841780699999995],"6656":[9.8597000000000005e-05,0.000103904],"15360":[0.000253739,0.000255949],"432":[4.6260000000000003e-06,4.7029999999999997e-06],"950272":[0.021231574,0.028741612999999999],"655360":[0.015257697000000001,0.016274833999999992],"69632":[0.0012376539999999999,0.0012946449999999999],"11264":[0.00020530900000000001,0.00022599500000000002],"2752512":[0.097974734999999993,0.103198212],"8126464":[0.34794193499999998,0.35723343600000002],"27648":[0.00041622800000000009,0.00045635900000000009],"368":[4.5689999999999998e-06,4.8579999999999999e-06],"65536":[0.0011575369999999997,0.0011894709999999999],"16252928":[0.72102396099999999],"464":[5.4310000000000002e-06,5.7470000000000002e-06],"1015808":[0.023611711000000028,0.030650746999999999],"3072":[5.7259000000000002e-05,5.7989999999999999e-05],"110592":[0.0018842210000000002,0.0019488870000000003],"237568":[0.0045073800000000001,0.0046429289999999606],"278528":[0.0056205409999999989,0.0060451979999999999],"496":[5.9830000000000001e-06,6.6359999999999997e-06],"13107200":[0.57701144900000001,0.58594808600000003],"9961472":[0.440370602,0.452133495],"5888":[0.00010726299999999998,0.00011164600000000001],"11010048":[0.51299583400000004,0.54534307599999998],"1920":[2.5870000000000001e-05,2.7115e-05],"2490368":[0.078778258000000018,0.091680171000000005],"19456":[0.00035420300000000004,0.00035725000000000004],"57344":[0.00093572000000000013,0.00095685099999999988],"1179648":[0.028157965,0.040041096999999998],"4718592":[0.18971057099999999,0.19735657300000001],"360448":[0.0080158790000000001,0.0082776110000000007],"1572864":[0.041770874000000013,0.044334638000000003],"53248":[0.00085313499999999998,0.00097039200000000015],"3456":[5.1675999999999998e-05,5.3399999999999997e-05],"40960":[0.00071097899999999993,0.00076599200000000006],"4608":[7.5587999999999995e-05,8.1732999999999998e-05],"13824":[0.000223482,0.00023452599999999996],"819200":[0.017870298999999999,0.022021425000000001],"983040":[0.022326286999999952,0.029272296],"8704":[0.000142993,0.00015454500000000002],"120":[1.2529999999999999e-06,1.4729999999999999e-06],"1024":[1.4049000000000001e-05,1.5273000000000001e-05],"49152":[0.00094787499999999993,0.001074888],"524288":[0.010904936,0.012764968999999998],"45056":[0.00079513300000000017,0.00084288699999999995],"229376":[0.0042125719999999995,0.0045357649999999989],"2688":[4.3661000000000001e-05,5.0951000000000001e-05],"152":[1.6700000000000001e-06,1.8560000000000001e-06],"5120":[8.5734000000000003e-05,8.9213000000000001e-05],"1507328":[0.039590547000000004,0.044565876999999997],"1216":[1.7339000000000001e-05,1.8298999999999999e-05],"1966080":[0.054948677999999994,0.059032501000000029],"1900544":[0.053126734000000009,0.05563655200000002],"184":[2.5579999999999999e-06,2.5629999999999999e-06],"7936":[0.000122803,0.00013819799999999999],"3801088":[0.14503206599999999,0.155064707],"6815744":[0.27658429000000001,0.30091177300000005],"124":[1.217e-06,1.283e-06],"102400":[0.00172072,0.0017874010000000003],"311296":[0.006375698,0.0067676390000000006],"1408":[2.2184e-05,2.4425000000000001e-05],"393216":[0.0092330810000000006,0.0098396640000000014],"4352":[7.1425000000000001e-05,7.6802000000000001e-05],"6553600":[0.275528622,0.28591134299999998],"20480":[0.00035730399999999997,0.00037624099999999998],"608":[8.5399999999999996e-06,9.2140000000000002e-06],"2228224":[0.067276747999999983,0.068169115000000002],"36864":[0.00062666200000000027,0.00062774400000000007],"704":[8.8529999999999998e-06,9.7119999999999995e-06],"720896":[0.017386749,0.018791186999999997],"800":[9.8400000000000007e-06,1.0017000000000001e-05],"2621440":[0.08304012899999999,0.087542260999999996],"425984":[0.0084262829999999997,0.0092739820000000001],"32768":[0.00052737999999999993,0.0005378920000000001],"12058624":[0.58704583600000004,0.62018105700000004],"128":[1.376e-06,1.468e-06],"180224":[0.0036514429999999999,0.0038909449999999998],"224":[2.3920000000000001e-06,2.4660000000000002e-06],"736":[1.0637e-05,1.1250000000000001e-05],"320":[3.5860000000000001e-06,4.5750000000000002e-06],"557056":[0.011827076000000001,0.013713006],"832":[9.0529999999999996e-06,1.1049e-05],"9437184":[0.42679012700000002,0.44650894100000005],"3584":[5.6412000000000001e-05,6.2824999999999996e-05],"6291456":[0.28720816399999999,0.33065540599999999],"256":[2.543e-06,2.9529999999999999e-06],"15204352":[0.66540018199999995,0.67161758900000001],"28672":[0.00043367300000000014,0.00043834400000000007],"768":[1.0559e-05,1.0917000000000001e-05],"212992":[0.0039246340000000006,0.0039673190000000013],"864":[1.0723999999999999e-05,1.0909e-05],"352":[4.3059999999999999e-06,4.8520000000000003e-06],"253952":[0.004947379,0.0051728210000000011],"960":[1.2581e-05,1.3067999999999999e-05],"24576":[0.0004681030000000001,0.00050997099999999991],"7680":[0.00011923,0.00012700999999999999],"294912":[0.0060846369999999995,0.0067219689999999995],"1048576":[0.024330927999999995,0.033544721999999999],"10485760":[0.47237430600000002,0.50083968499999998],"344064":[0.007482987,0.0075218409999999996],"288":[2.8590000000000001e-06,3.574e-06],"1152":[1.7065999999999999e-05,1.7643e-05],"384":[5.5010000000000004e-06,6.1469999999999998e-06],"2304":[3.4932999999999999e-05,3.5573e-05],"896":[1.0814e-05,1.1229999999999999e-05],"480":[5.7880000000000003e-06,5.964e-06],"1441792":[0.037048603999999999,0.048028275999999988],"992":[1.2938e-05,1.5722e-05],"3968":[6.0939e-05,6.3356999999999997e-05],"6400":[9.4887000000000001e-05,0.000105618],"1344":[1.8783999999999998e-05,2.1078999999999999e-05],"126976":[0.0022416570000000002,0.002290009],"2883584":[0.106797011,0.115476674],"753664":[0.018916790999999999,0.020590886999999995],"16384":[0.00026154200000000008,0.00027754900000000009],"131072":[0.0023497990000000001,0.0025175390000000001],"458752":[0.009539131000000001,0.010319499000000001],"172032":[0.0033849900000000313,0.0036159289999999995],"12288":[0.00023716999999999995,0.000282112],"14680064":[0.64049162800000004,0.66110620799999997],"1536":[2.6029000000000001e-05,2.6631999999999998e-05],"25600":[0.00038235399999999995,0.0004512819999999999],"1835008":[0.052047676999999994,0.052986205999999994],"10752":[0.00018853000000000001,0.000203623],"21504":[0.00038369600000000005,0.00041643000000000002],"7602176":[0.32663482700000002,0.32721233399999999],"5632":[9.8027000000000002e-05,0.000108126],"10":[7.1999999999999996e-08,7.4000000000000001e-08],"3145728":[0.10853506199999996,0.11142521399999999],"245760":[0.0046841729999999989,0.0049097719999999997],"1728":[2.1977999999999999e-05,2.4786e-05],"11":[8.0000000000000002e-08,8.6000000000000002e-08],"1114112":[0.026089582,0.033912122000000017],"12":[7.4000000000000001e-08,7.6000000000000006e-08],"7340032":[0.29575531099999997,0.31172708399999999],"7168":[0.000117939,0.000121002],"13":[7.7000000000000001e-08,7.7999999999999997e-08],"6029312":[0.27453870800000002,0.276582671],"14":[8.6000000000000002e-08,9.9999999999999995e-08],"3200":[4.7003999999999999e-05,5.0034000000000002e-05],"20":[2.2100000000000001e-07,2.2399999999999999e-07],"204800":[0.003800192,0.0046215029999999999],"15":[7.3000000000000005e-08,8.6000000000000002e-08],"13312":[0.00020588599999999996,0.00020806400000000005],"4980736":[0.208881287,0.21058717199999999],"118784":[0.0020932670000000002,0.0021898099999999999],"51200":[0.00083575800000000003,0.00087734200000000003],"16":[1.6e-07,2.5600000000000002e-07],"21":[3.41e-07,3.72e-07],"917504":[0.020812984,0.028879428999999995],"22":[2.65e-07,4.6800000000000001e-07],"4864":[8.0909999999999996e-05,8.9222999999999996e-05],"17":[2.0900000000000001e-07,2.35e-07],"14848":[0.00023395999999999999,0.000245596],"23":[2.8700000000000002e-07,3.8500000000000002e-07],"786432":[0.020176410999999998,0.021370426000000001],"18":[2.3300000000000001e-07,3.2399999999999999e-07],"1638400":[0.047484644999999999,0.04978257299999999],"7864320":[0.33017259300000001,0.34285365499999998],"24":[4.03e-07,4.3300000000000003e-07],"14155776":[0.610731091,1.551873496],"19":[2.4200000000000002e-07,2.8000000000000002e-07],"30":[2.7799999999999997e-07,3.3999999999999997e-07],"25":[3.22e-07,4.1300000000000001e-07],"31":[4.2199999999999999e-07,4.6800000000000001e-07],"1280":[1.8824000000000001e-05,2.3337e-05],"26":[3.4900000000000001e-07,4.01e-07],"3932160":[0.14974649200000001,0.15531526300000001],"2432":[4.1273999999999998e-05,4.2443e-05],"32":[3.89e-07,5.6300000000000005e-07],"27":[2.5199999999999998e-07,2.96e-07],"409600":[0.0080040110000000001,0.008667382999999999]}},{"title":"OrderedDictionary sort","results":{"28":[2.244e-06,2.305e-06],"34":[2.9450000000000002e-06,3.146e-06],"29":[2.3590000000000002e-06,2.4899999999999999e-06],"40":[3.3270000000000001e-06,3.7500000000000001e-06],"17408":[0.0024013839999999999,0.0024978259999999999],"1472":[0.00017630599999999999,0.00018354100000000001],"112":[1.1304000000000001e-05,1.1718e-05],"1376256":[0.29539367100000002,0.33415839899999999],"5242880":[1.462383408,1.4740800539999999],"36":[3.179e-06,3.715e-06],"42":[3.5030000000000002e-06,4.1450000000000001e-06],"11534336":[3.5638773239999999,3.6019176929999999],"114688":[0.020050827,0.020841447999999999],"144":[1.3227000000000001e-05,1.3842000000000001e-05],"38":[3.6500000000000002e-06,3.9600000000000002e-06],"240":[2.5466e-05,2.7427999999999999e-05],"9216":[0.001230791,0.0012973380000000003],"44":[4.1910000000000002e-06,4.9830000000000004e-06],"1664":[0.000195632,0.00021008800000000004],"196608":[0.036359506000000034,0.036487593000000006],"155648":[0.026486282,0.027328072999999998],"2816":[0.00036047900000000003,0.00036637199999999995],"50":[4.5449999999999997e-06,4.7709999999999997e-06],"2359296":[0.540784351,0.56721051199999994],"46":[4.1570000000000002e-06,4.391e-06],"176":[1.7963000000000001e-05,2.0818999999999998e-05],"52":[4.7530000000000001e-06,4.8740000000000003e-06],"272":[2.5012e-05,2.6970000000000001e-05],"116":[1.1868999999999999e-05,1.2532e-05],"47104":[0.0077039659999999996,0.0084432320000000002],"6912":[0.00096206500000000001,0.001008756],"1856":[0.000240385,0.00025020900000000004],"48":[4.4349999999999999e-06,5.5419999999999996e-06],"2097152":[0.47787586599999998,0.48016945300000002],"54":[5.1120000000000004e-06,5.7139999999999998e-06],"2031616":[0.47196360199999998,0.50479922399999999],"43008":[0.0066384209999999985,0.0071602000000000011],"60":[6.0789999999999997e-06,6.3369999999999996e-06],"30720":[0.0051066779999999999,0.0051924559999999998],"56":[5.0889999999999999e-06,5.3789999999999997e-06],"62":[6.2319999999999998e-06,6.6989999999999997e-06],"58":[5.6019999999999999e-06,5.9519999999999999e-06],"3014656":[0.74484675199999995,0.81264621100000001],"64":[5.6219999999999997e-06,6.455e-06],"8388608":[2.4975543569999998,2.5552712199999998],"29696":[0.0046853829999999996,0.0047455529999999987],"216":[2.1673000000000001e-05,2.2906000000000001e-05],"106496":[0.018032090000000001,0.018567628999999995],"72":[5.8610000000000003e-06,6.4710000000000004e-06],"442368":[0.086824298999999994,0.097501423000000018],"147456":[0.025290099,0.025417169999999999],"4456448":[1.219688568,1.26843752],"63488":[0.010948312,0.011185738000000001],"38912":[0.0058138009999999995,0.0060184709999999992],"68":[5.9819999999999996e-06,6.0630000000000002e-06],"188416":[0.033708305000000008,0.035136774999999995],"248":[2.7739999999999999e-05,3.1349000000000001e-05],"80":[8.0430000000000008e-06,8.1270000000000003e-06],"2560":[0.00030469900000000002,0.00033472500000000002],"34816":[0.0049595359999999996,0.0051638649999999993],"3712":[0.00050255099999999984,0.00050709299999999991],"3538944":[0.97755498299999999,0.99384175799999996],"76":[7.0910000000000004e-06,8.1089999999999998e-06],"4194304":[1.1260852889999999,1.1311778399999999],"851968":[0.17470748,0.19302642400000003],"4096":[0.00050968200000000002,0.00051800299999999974],"59392":[0.0098687740000000003,0.010466497],"84":[8.5120000000000008e-06,9.9769999999999995e-06],"3276800":[0.89664085999999998,0.91813584599999998],"55296":[0.0089589410000000015,0.0093925499999999978],"688128":[0.136953187,0.149347437],"8192":[0.001029512,0.0011201380000000001],"10240":[0.001415871,0.0014201230000000001],"15872":[0.0024256260000000002,0.0025746249999999997],"92":[9.2720000000000003e-06,9.7790000000000007e-06],"26624":[0.0040196149999999998,0.004165409000000001],"1792":[0.000237517,0.00024263299999999997],"11776":[0.001717629,0.00174774],"2944":[0.000373626,0.00040765100000000003],"88":[8.4970000000000001e-06,8.9250000000000001e-06],"22528":[0.0034159900000000007,0.003557714],"1245184":[0.25735839199999999,0.29028174000000001],"15728640":[5.1452639480000002,5.2669918960000004],"96":[1.0587e-05,1.0943e-05],"1984":[0.00026103699999999999,0.00027265700000000004],"139264":[0.022631647999999949,0.023897967000000003],"475136":[0.096833097999999992,0.103689778],"13631488":[4.3420086170000003,4.5363754419999998],"416":[4.5192999999999999e-05,4.7490000000000001e-05],"928":[0.00011284400000000001,0.00011287499999999999],"512":[5.1962000000000002e-05,5.4778999999999998e-05],"18432":[0.0025962670000000002,0.0026773270000000006],"16777216":[5.2243009450000004],"9728":[0.0013045019999999999,0.0013566120000000001],"1769472":[0.40923761600000003,0.42185447399999998],"1703936":[0.39221989600000001,0.40621301799999998],"2048":[0.0002232,0.000232623],"14336":[0.0021066909999999999,0.0022258569999999999],"448":[5.1820000000000002e-05,5.2342000000000001e-05],"5505024":[1.56232343,1.5750268890000001],"544":[5.3884000000000001e-05,5.7732999999999998e-05],"221184":[0.040436863000000003,0.043104722000000005],"90112":[0.015065413999999999,0.015651643999999999],"640":[6.8083000000000005e-05,7.2935000000000006e-05],"12800":[0.0018236329999999999,0.0019030410000000001],"262144":[0.04496748099999999,0.046474188999999999],"589824":[0.11258636499999999,0.124210353],"884736":[0.188882297,0.20283167699999999],"6144":[0.00087867499999999999,0.0010174869999999999],"1088":[0.00012426000000000001,0.00012696100000000003],"576":[5.7388e-05,6.2691e-05],"160":[1.5311e-05,1.5437000000000001e-05],"672":[7.7152999999999998e-05,7.8364999999999999e-05],"8912896":[2.7451857230000001,2.8558826659999998],"100":[9.4429999999999992e-06,9.7259999999999997e-06],"507904":[0.10640899199999999,0.112196211],"3840":[0.00053697800000000002,0.00055355499999999963],"192":[2.0166e-05,2.0826e-05],"376832":[0.072831449999999992,0.075571844000000013],"98304":[0.017089093999999999,0.017985389000000001],"5376":[0.00071448099999999988,0.00079272399999999986],"94208":[0.016149980000000001,0.016594256000000005],"81920":[0.013527624,0.014269764000000001],"3407872":[0.93603207700000002,0.955817951],"104":[1.0679000000000001e-05,1.0738e-05],"122880":[0.021716594000000002,0.022955598000000004],"200":[2.0511999999999999e-05,2.1546999999999999e-05],"163840":[0.027932192999999994,0.029934084],"4063232":[1.1609620389999999,1.164832058],"5767168":[1.690682834,1.691515586],"12582912":[3.9613465400000001,4.1124077410000002],"1600":[0.00018946099999999998,0.00020221200000000001],"136":[1.1976e-05,1.2463000000000001e-05],"232":[2.3489000000000002e-05,2.8153e-05],"7077888":[2.1526512950000001,2.3125309199999999],"86016":[0.014164177999999999,0.01494703],"31744":[0.0051621699999999989,0.005524625],"168":[1.6228000000000001e-05,1.6643e-05],"622592":[0.121034658,0.13017230599999999],"108":[1.0516999999999999e-05,1.0550999999999999e-05],"327680":[0.059969864999999997,0.067582145999999996],"2176":[0.00025132699999999997,0.00025173700000000003],"3328":[0.000413874,0.00045336000000000004],"1":[4.1800000000000001e-07,4.2100000000000002e-07],"2":[4.3300000000000003e-07,4.6899999999999998e-07],"3":[4.7199999999999999e-07,4.9900000000000001e-07],"4":[4.3599999999999999e-07,4.9900000000000001e-07],"7424":[0.001077045,0.0011923279999999999],"5":[5.0299999999999999e-07,5.1600000000000001e-07],"23552":[0.0035990130000000003,0.0037479380000000001],"6":[4.89e-07,4.9900000000000001e-07],"61440":[0.010396405000000001,0.010905755999999999],"491520":[0.100375639,0.10669496999999994],"77824":[0.012578198000000002,0.013225476],"7":[5.2399999999999998e-07,5.6599999999999996e-07],"8":[5.9400000000000005e-07,6.3e-07],"208":[2.0959e-05,2.1413999999999999e-05],"9":[5.8299999999999997e-07,6.6300000000000005e-07],"73728":[0.011426024,0.012384865],"304":[2.8557000000000001e-05,3.0948000000000003e-05],"400":[4.2725999999999997e-05,4.4397000000000002e-05],"1310720":[0.27768036400000001,0.29941737600000001],"336":[3.2657999999999998e-05,3.7401000000000003e-05],"3670016":[1.0211746800000001,1.054186627],"6656":[0.00091138299999999998,0.0009995239999999999],"15360":[0.0023279529999999998,0.0024536470000000002],"432":[4.6090000000000001e-05,4.8284000000000001e-05],"950272":[0.20344370000000001,0.23570221299999999],"655360":[0.128688951,0.136822676],"69632":[0.010851906999999997,0.011185076],"11264":[0.0015988459999999999,0.0017151549999999999],"2752512":[0.68869271199999993,0.720580585],"8126464":[2.5442623859999998,2.5857798220000001],"27648":[0.0043063890000000007,0.004440884],"368":[4.0475999999999997e-05,4.6343e-05],"65536":[0.0099995640000000007,0.010351287000000001],"16252928":[5.391823778],"464":[5.4184000000000002e-05,5.6329000000000002e-05],"1015808":[0.221040819,0.252633781],"3072":[0.00043459499999999997,0.00043602500000000004],"110592":[0.018827791999999993,0.019419973],"237568":[0.045213673999999981,0.045475400999999999],"278528":[0.048879937999999998,0.050087375999999996],"496":[6.0251999999999998e-05,6.6518000000000002e-05],"13107200":[4.1535087099999997,4.2672268639999995],"9961472":[2.9851631420000002,3.044298902],"5888":[0.00081737699999999999,0.00082667699999999984],"11010048":[3.3534835350000001,3.470442077],"1920":[0.00026276799999999998,0.00027470800000000008],"2490368":[0.58494453199999996,0.61366737599999999],"19456":[0.0027603909999999992,0.0027877359999999999],"57344":[0.0095842959999999991,0.0097281219999999988],"1179648":[0.24432811300000001,0.27209751900000001],"4718592":[1.304987796,1.3302295210000001],"360448":[0.067775054000000001,0.072452808999999993],"1572864":[0.351101422,0.36930594700000002],"53248":[0.0087072919999999984,0.0088151339999999988],"3456":[0.00045676000000000007,0.00048147000000000001],"40960":[0.0063432389999999988,0.0064341269999999996],"4608":[0.00057600399999999997,0.00059706799999999986],"13824":[0.0020367839999999998,0.0021015060000000004],"819200":[0.16932357000000001,0.18459786300000003],"983040":[0.21664541100000001,0.230440222],"8704":[0.001117647,0.0011750810000000001],"120":[1.2463000000000001e-05,1.3822000000000001e-05],"1024":[0.000109412,0.000113646],"49152":[0.0081626200000000006,0.008388462000000001],"524288":[0.097990405999999974,0.109977063],"45056":[0.0070802490000000011,0.0073517600000000006],"229376":[0.042631832999999994,0.044264812000000001],"2688":[0.00035598499999999996,0.00037210699999999999],"152":[1.4344e-05,1.4921e-05],"5120":[0.000676058,0.00069163099999999973],"1507328":[0.32519414600000002,0.33596904999999999],"1216":[0.00013250600000000001,0.000139166],"1966080":[0.455393041,0.48248557299999995],"1900544":[0.43072271899999998,0.46066542099999996],"184":[1.8059000000000001e-05,2.0177e-05],"7936":[0.0011547979999999998,0.001189234],"3801088":[1.0772099580000001,1.1119546790000001],"6815744":[2.0687210999999999,2.2097439950000002],"124":[1.3709999999999999e-05,1.4e-05],"102400":[0.017011552999999999,0.017697419999999991],"311296":[0.055963174999999997,0.061712052000000003],"1408":[0.000167381,0.000182888],"393216":[0.077739140999999984,0.079187967999999984],"4352":[0.00053149700000000002,0.00055727099999999992],"6553600":[1.983735732,2.095342107],"20480":[0.003024035,0.0030900299999999997],"608":[6.8780000000000002e-05,7.3456999999999998e-05],"2228224":[0.50999618599999996,0.51177068400000003],"36864":[0.0054635180000000023,0.0056725449999999993],"704":[7.8924000000000005e-05,7.9232000000000003e-05],"720896":[0.14496422,0.16006843400000004],"800":[9.3233999999999995e-05,9.4636000000000007e-05],"2621440":[0.62308443700000005,0.62968012400000006],"425984":[0.082558443000000009,0.086225746000000006],"32768":[0.0046961160000000002,0.0048494919999999995],"12058624":[3.729337138,3.9882596440000002],"128":[1.0889e-05,1.1336e-05],"180224":[0.031621231999999999,0.033488496],"224":[2.2031999999999998e-05,2.2935e-05],"736":[8.6698000000000002e-05,9.2932999999999999e-05],"320":[3.1642e-05,3.6062000000000001e-05],"557056":[0.10505401,0.11484425099999999],"832":[9.7549999999999999e-05,0.000100531],"9437184":[2.888323121,3.0486562660000001],"3584":[0.00045501999999999988,0.00050212900000000003],"6291456":[1.8590385629999999,2.0334599710000001],"256":[2.4481000000000002e-05,2.4811999999999999e-05],"15204352":[4.9288068489999999,5.0033543680000001],"28672":[0.004438529000000001,0.004526838],"768":[8.9646000000000002e-05,9.4228999999999995e-05],"212992":[0.038586827000000004,0.038898341000000003],"864":[0.000105534,0.000107037],"352":[3.6034000000000001e-05,3.9205000000000002e-05],"253952":[0.04880411099999999,0.050697692000000003],"960":[0.00011974800000000001,0.00012348200000000001],"24576":[0.0038573129999999998,0.0041351029999999993],"7680":[0.001141703,0.00117482],"294912":[0.052676376999999996,0.055243328999999994],"1048576":[0.20944248700000001,0.22217785400000001],"10485760":[3.1909332109999999,3.390932748],"344064":[0.063935834999999996,0.066425629],"288":[2.7016999999999999e-05,2.7226999999999999e-05],"1152":[0.00012896700000000001,0.000136544],"384":[4.5065000000000003e-05,4.8665000000000002e-05],"2304":[0.00026811400000000002,0.00027996600000000004],"896":[0.000105544,0.000106574],"480":[5.6663999999999998e-05,5.6666000000000003e-05],"1441792":[0.31222619799999995,0.340132938],"992":[0.00012239400000000001,0.00012539700000000002],"3968":[0.00052981099999999993,0.000583436],"6400":[0.00085289700000000003,0.00091743800000000013],"1344":[0.00015589400000000004,0.000169953],"126976":[0.022742150000000003,0.023118907000000001],"2883584":[0.71968378999999993,0.76875526900000002],"753664":[0.15383459899999999,0.16783546299999996],"16384":[0.0021840410000000003,0.0023209700000000008],"131072":[0.021211392000000003,0.023313613],"458752":[0.091221113999999992,0.095706696999999993],"172032":[0.029829658999999998,0.03138058400000001],"12288":[0.0018204459999999999,0.0019793010000000002],"14680064":[4.7342032930000002,4.9867005180000001],"1536":[0.000189929,0.00019719599999999996],"25600":[0.0038262640000000002,0.0043347020000000002],"1835008":[0.42828090499999999,0.439185779],"10752":[0.001503519,0.001665422],"21504":[0.0031635399999999994,0.003352627],"7602176":[2.3821945260000001,2.3891025969999999],"5632":[0.00078327399999999993,0.00080766999999999992],"10":[5.4700000000000001e-07,6.3900000000000004e-07],"3145728":[0.78158129600000004,0.78491391999999993],"245760":[0.04695103099999999,0.049530969000000001],"1728":[0.000208898,0.000226813],"11":[6.0299999999999999e-07,6.9500000000000002e-07],"1114112":[0.22721782900000001,0.237577125],"12":[6.37e-07,6.5000000000000002e-07],"7340032":[2.1769877179999999,2.25808287],"7168":[0.001066067,0.00106988],"13":[6.4499999999999997e-07,7.0100000000000004e-07],"6029312":[1.7631679309999999,1.7662681789999999],"14":[7.0699999999999996e-07,8.3500000000000005e-07],"3200":[0.00040768200000000003,0.00040812499999999996],"20":[1.415e-06,1.699e-06],"204800":[0.036711450999999992,0.03883474],"15":[7.1500000000000004e-07,7.9899999999999999e-07],"13312":[0.001906849,0.0019141659999999997],"4980736":[1.3819152560000001,1.3895786619999999],"118784":[0.020828573,0.02157077],"51200":[0.0081292499999999993,0.0088690829999999998],"16":[1.254e-06,1.344e-06],"21":[1.7260000000000001e-06,1.796e-06],"917504":[0.19698102300000001,0.217101301],"22":[1.832e-06,1.8819999999999999e-06],"4864":[0.00059991700000000027,0.00065454599999999999],"17":[1.3689999999999999e-06,1.387e-06],"14848":[0.0022066389999999998,0.0022327090000000003],"23":[1.7370000000000001e-06,2.03e-06],"786432":[0.162890967,0.17589452500000002],"18":[1.426e-06,1.578e-06],"1638400":[0.36717195000000002,0.39292933899999999],"7864320":[2.48594801,2.5060722379999998],"24":[2.2340000000000001e-06,2.2579999999999998e-06],"14155776":[4.553274289,8.1458458720000007],"19":[1.3379999999999999e-06,1.5269999999999999e-06],"30":[2.261e-06,2.4150000000000002e-06],"25":[1.8369999999999999e-06,2.2419999999999999e-06],"31":[2.6060000000000001e-06,2.7010000000000001e-06],"1280":[0.000144432,0.00015083099999999998],"26":[2.0250000000000001e-06,2.0279999999999999e-06],"3932160":[1.1142024930000001,1.1226150189999999],"2432":[0.00029645799999999999,0.00031580300000000013],"32":[2.6639999999999998e-06,2.8600000000000001e-06],"27":[1.9309999999999998e-06,2.0250000000000001e-06],"409600":[0.07910030799999998,0.08314613999999998]}},{"title":"OrderedDictionary removeLast","results":{"28":[1.466e-06,1.513e-06],"34":[1.9530000000000002e-06,2.1689999999999999e-06],"29":[1.4470000000000001e-06,1.4500000000000001e-06],"40":[2.4669999999999998e-06,3.1659999999999998e-06],"17408":[0.0026176940000000003,0.0026511310000000001],"1472":[0.00022192199999999999,0.000225536],"112":[1.2296999999999999e-05,1.3370000000000001e-05],"1376256":[0.29982763199999996,0.39362846699999998],"5242880":[1.5277321939999999,1.5746361150000001],"36":[2.1629999999999999e-06,2.5129999999999999e-06],"42":[2.6960000000000001e-06,2.8550000000000002e-06],"11534336":[3.9298833649999998,3.9802870220000002],"114688":[0.017980893000000005,0.019281784],"144":[1.6288000000000001e-05,1.7812000000000002e-05],"38":[2.5170000000000002e-06,2.6800000000000002e-06],"240":[2.7770999999999999e-05,2.9556e-05],"9216":[0.001315625,0.001344144],"44":[3.3100000000000001e-06,4.2239999999999997e-06],"1664":[0.000225687,0.00024836900000000002],"196608":[0.034902036999999983,0.035349212000000005],"155648":[0.025147520999999999,0.025548641],"2816":[0.000410221,0.00041959699999999985],"50":[4.1350000000000002e-06,4.4800000000000003e-06],"2359296":[0.56799787899999998,0.59064483700000003],"46":[3.3869999999999999e-06,3.7740000000000002e-06],"176":[2.0760000000000001e-05,2.6217e-05],"52":[4.2810000000000002e-06,4.5220000000000001e-06],"272":[3.2097000000000001e-05,3.5549000000000001e-05],"116":[1.2121e-05,1.3158e-05],"47104":[0.0074246259999999984,0.0077292569999999989],"6912":[0.001019084,0.0010295999999999999],"1856":[0.00026725000000000002,0.00027196799999999993],"48":[3.608e-06,5.4960000000000004e-06],"2097152":[0.48053118800000005,0.48742943000000005],"54":[4.9690000000000002e-06,5.2209999999999996e-06],"2031616":[0.45669900899999999,0.46324542200000002],"43008":[0.006578432999999999,0.006778400999999999],"60":[5.5520000000000004e-06,5.7060000000000001e-06],"30720":[0.0044498049999999994,0.0046924320000000007],"56":[4.9679999999999997e-06,5.1989999999999997e-06],"62":[5.7590000000000003e-06,6.4450000000000001e-06],"58":[5.3360000000000002e-06,5.6219999999999997e-06],"3014656":[0.82517687799999995,0.89658718999999998],"64":[6.2729999999999999e-06,6.7569999999999998e-06],"8388608":[2.7082794539999999,3.184713935],"29696":[0.0043201119999999992,0.004456476],"216":[2.4723999999999999e-05,2.9818000000000001e-05],"106496":[0.01678207,0.019869711000000005],"72":[6.409e-06,7.0650000000000001e-06],"442368":[0.077672089,0.092736686999999984],"147456":[0.023493426000000039,0.023953648000000001],"4456448":[1.2585849790000001,1.3199510759999999],"63488":[0.0096356059999999997,0.0097819330000000013],"38912":[0.0057668019999999997,0.0058255980000000004],"68":[6.1840000000000004e-06,6.2079999999999997e-06],"188416":[0.03247004299999999,0.033845832999999978],"248":[2.9779999999999999e-05,3.1288000000000003e-05],"80":[8.4400000000000005e-06,9.0059999999999998e-06],"2560":[0.00037272600000000004,0.00038886600000000008],"34816":[0.0050587309999999995,0.0052632809999999999],"3712":[0.0005063899999999999,0.00055130199999999993],"3538944":[0.94662824300000004,0.96852429399999995],"76":[7.1940000000000001e-06,8.2849999999999995e-06],"4194304":[1.157534686,1.1704198589999999],"851968":[0.16589630599999999,0.19586000000000001],"4096":[0.000602021,0.00060860600000000003],"59392":[0.008888623,0.0096386170000000004],"84":[8.5569999999999996e-06,1.0115000000000001e-05],"3276800":[0.87450521000000003,0.92926820600000004],"55296":[0.0084466530000000019,0.0087342940000000001],"688128":[0.12878690700000001,0.15402312300000001],"8192":[0.0011617189999999996,0.001222353],"10240":[0.00148292,0.0014998939999999999],"15872":[0.0023213499999999998,0.0024229260000000002],"92":[1.0407999999999999e-05,1.0689e-05],"26624":[0.0039513450000000002,0.0041496949999999993],"1792":[0.00024516499999999999,0.00026532499999999996],"11776":[0.001804267,0.0018515720000000003],"2944":[0.00042264000000000001,0.00045961800000000002],"88":[8.8570000000000001e-06,9.5599999999999999e-06],"22528":[0.0034338090000000003,0.0037232569999999993],"1245184":[0.25709813999999998,0.33307459699999997],"15728640":[5.5309065640000004,5.7127481229999999],"96":[1.1284000000000001e-05,1.1382e-05],"1984":[0.00026688800000000006,0.000279003],"139264":[0.022038028000000001,0.022726856],"475136":[0.083164687999999987,0.098702572000000016],"13631488":[4.8979167889999999,5.1569661599999996],"416":[5.4459000000000002e-05,5.7312999999999998e-05],"928":[0.000123447,0.00013009],"512":[6.9473000000000004e-05,6.9845000000000006e-05],"18432":[0.002812213,0.0028209159999999993],"16777216":[5.909841997],"9728":[0.0014026220000000001,0.001409338],"1769472":[0.38405952900000001,0.39991970900000001],"1703936":[0.38173463899999999,0.39665129599999999],"2048":[0.000284102,0.00028970899999999987],"14336":[0.0021227560000000004,0.0021893679999999997],"448":[5.8454e-05,6.5649999999999997e-05],"5505024":[1.699701755,1.749947227],"544":[6.8903000000000001e-05,7.5888000000000003e-05],"221184":[0.036140099999999994,0.038424113999999995],"90112":[0.01435377,0.014784056],"640":[8.2621999999999996e-05,8.7596000000000006e-05],"12800":[0.0019134620000000001,0.0020041920000000001],"262144":[0.042942411999999999,0.043670972999999988],"589824":[0.104055853,0.13292543900000001],"884736":[0.17101070600000001,0.205479777],"6144":[0.001016622,0.001084736],"1088":[0.00015344600000000001,0.00016280400000000001],"576":[7.2296e-05,7.8108999999999994e-05],"160":[1.7699000000000001e-05,1.9205999999999999e-05],"672":[8.8566000000000006e-05,9.7608000000000005e-05],"8912896":[2.9194520000000002,3.2820709410000002],"100":[1.0332e-05,1.0651e-05],"507904":[0.090558999000000001,0.107302668],"3840":[0.00054332300000000018,0.00059097200000000026],"192":[2.3532000000000001e-05,2.5222e-05],"376832":[0.068610124999999966,0.069861812999999967],"98304":[0.016467113000000002,0.016637042999999997],"5376":[0.00079158400000000002,0.00083199799999999992],"94208":[0.015345692999999999,0.016224686000000002],"81920":[0.013022522,0.013400265999999999],"3407872":[0.89375035299999994,0.94119037500000002],"104":[1.2108e-05,1.2689e-05],"122880":[0.019152145999999998,0.020579726999999999],"200":[2.4235000000000001e-05,2.5829999999999998e-05],"163840":[0.026712495000000003,0.027703894],"4063232":[1.1029692520000001,1.117352538],"5767168":[1.8291590090000001,1.857245327],"12582912":[4.5649139810000001,4.8595822929999999],"1600":[0.000213852,0.00023877299999999999],"136":[1.4759e-05,1.6084999999999999e-05],"232":[2.6560999999999999e-05,3.1217999999999998e-05],"7077888":[2.2283752489999999,2.6143661480000002],"86016":[0.013486776000000002,0.014238833000000003],"31744":[0.0046862790000000007,0.0048145129999999994],"168":[2.0400000000000001e-05,2.3765999999999999e-05],"622592":[0.113951174,0.13424852900000001],"108":[1.1612e-05,1.2203e-05],"327680":[0.055977503999999997,0.061241044999999994],"2176":[0.00029609600000000003,0.00032603499999999996],"3328":[0.00047276300000000007,0.00050299699999999993],"1":[4.6000000000000002e-08,4.6999999999999997e-08],"2":[5.7000000000000001e-08,5.8999999999999999e-08],"3":[7.3000000000000005e-08,7.6000000000000006e-08],"4":[9.8000000000000004e-08,1.06e-07],"7424":[0.001079663,0.001117299],"5":[1.08e-07,1.09e-07],"23552":[0.0037005099999999997,0.0038004990000000002],"6":[1.15e-07,1.1600000000000001e-07],"61440":[0.0096040030000000016,0.0096094529999999987],"491520":[0.08612094499999999,0.11040061499999999],"77824":[0.012076826000000001,0.012599885],"7":[1.36e-07,1.3799999999999999e-07],"8":[1.5099999999999999e-07,1.5200000000000001e-07],"208":[2.4888e-05,2.5533000000000001e-05],"9":[1.6299999999999999e-07,1.7599999999999999e-07],"73728":[0.011167686,0.012060971],"304":[3.8300000000000003e-05,3.9181999999999999e-05],"400":[5.2933999999999998e-05,5.6678000000000002e-05],"1310720":[0.278591107,0.35227623900000005],"336":[4.3925999999999999e-05,4.7039000000000001e-05],"3670016":[0.98073885100000002,1.0459640299999999],"6656":[0.00096218500000000017,0.0010310950000000001],"15360":[0.00221718,0.0023418920000000004],"432":[5.5686999999999997e-05,5.8148e-05],"950272":[0.18401079200000001,0.236941663],"655360":[0.121382059,0.16274308100000001],"69632":[0.010534448,0.010931152],"11264":[0.001697414,0.0018067409999999999],"2752512":[0.76160642599999995,0.76957823000000003],"8126464":[2.5709840239999999,2.6747573239999998],"27648":[0.0040553000000000004,0.0042764439999999999],"368":[5.1897999999999997e-05,5.3885000000000003e-05],"65536":[0.0098972539999999994,0.010428062],"16252928":[5.7391289409999997],"464":[5.7784000000000001e-05,6.5871999999999995e-05],"1015808":[0.196878635,0.25868404899999997],"3072":[0.000465704,0.00048663200000000003],"110592":[0.017170972999999999,0.017800621000000003],"237568":[0.039009554999999994,0.039301275999999996],"278528":[0.046508902000000005,0.046876181000000003],"496":[6.4309999999999999e-05,7.3515000000000003e-05],"13107200":[4.7405476630000001,4.9739155860000004],"9961472":[3.2530758300000002,3.2950222309999999],"5888":[0.000897578,0.00089838899999999976],"11010048":[3.678538842,3.951360518],"1920":[0.00025355499999999998,0.00028120600000000004],"2490368":[0.610727939,0.64917141099999998],"19456":[0.0028775099999999998,0.0029286],"57344":[0.0087589420000000005,0.0089511539999999994],"1179648":[0.23977975200000001,0.30018880599999997],"4718592":[1.330472635,1.377909568],"360448":[0.063545472000000033,0.068782340999999983],"1572864":[0.37846007100000001,0.43195214900000001],"53248":[0.0083786950000000002,0.0084531080000000008],"3456":[0.00048235300000000014,0.00055761500000000002],"40960":[0.00613965,0.0061625259999999998],"4608":[0.00063462699999999991,0.00069033700000000007],"13824":[0.0020705039999999999,0.0021047599999999998],"819200":[0.160099573,0.18797202299999999],"983040":[0.19435323500000001,0.231741692],"8704":[0.001259556,0.0012956390000000001],"120":[1.4048e-05,1.4798e-05],"1024":[0.000137689,0.00013875699999999999],"49152":[0.007957922000000001,0.0082174959999999995],"524288":[0.092509548999999996,0.118577981],"45056":[0.006911263,0.0070396240000000013],"229376":[0.037647104000000001,0.038943401000000002],"2688":[0.00039509899999999999,0.00040476599999999998],"152":[1.7873e-05,2.0058e-05],"5120":[0.00075400800000000002,0.00076850200000000012],"1507328":[0.34537284200000001,0.380488149],"1216":[0.00016840799999999996,0.000190657],"1966080":[0.43993017099999998,0.44642069000000001],"1900544":[0.426658698,0.43068298500000002],"184":[2.3039000000000001e-05,2.5341e-05],"7936":[0.001130711,0.001175293],"3801088":[1.0137657369999999,1.100842144],"6815744":[2.171372903,2.5616028690000001],"124":[1.4422e-05,1.4541e-05],"102400":[0.016390568000000001,0.016680882000000001],"311296":[0.052325040000000003,0.058726890999999989],"1408":[0.00021147900000000004,0.00021444900000000002],"393216":[0.073976305000000006,0.074779108999999996],"4352":[0.00059496699999999985,0.00064360100000000005],"6553600":[2.1278682230000001,2.47566592],"20480":[0.0031153069999999995,0.0035288279999999999],"608":[8.5436e-05,9.2465000000000003e-05],"2228224":[0.52269944000000002,0.52318441699999996],"36864":[0.005323553,0.0057349710000000002],"704":[9.4628000000000003e-05,9.7405999999999995e-05],"720896":[0.13913224199999999,0.18695267600000001],"800":[0.00011629,0.000117446],"2621440":[0.65444431299999994,0.68047612700000004],"425984":[0.07502096300000001,0.079832480999999997],"32768":[0.0047708550000000001,0.0048505290000000001],"12058624":[4.2327540519999998,4.6845585820000002],"128":[1.3363000000000001e-05,1.4884e-05],"180224":[0.03024777,0.031520917000000002],"224":[2.5687e-05,2.8333000000000001e-05],"736":[0.00010647200000000001,0.000110166],"320":[4.1047000000000002e-05,4.7089999999999998e-05],"557056":[0.098481236999999985,0.12456752000000004],"832":[0.000113214,0.00012232599999999999],"9437184":[3.1493518840000001,3.4392565930000001],"3584":[0.00050896100000000027,0.00051874699999999996],"6291456":[2.1354353540000002,2.3868617329999999],"256":[3.2774000000000002e-05,3.2966000000000003e-05],"15204352":[5.3595375040000004,5.4605811629999996],"28672":[0.0042847939999999998,0.0043057049999999999],"768":[0.000110482,0.000117966],"212992":[0.035267623000000005,0.035357277999999992],"864":[0.000118059,0.00012427200000000001],"352":[4.3878000000000002e-05,5.3387000000000002e-05],"253952":[0.041885267000000004,0.043311583000000001],"960":[0.000125506,0.000135575],"24576":[0.003881439,0.0039507400000000003],"7680":[0.0010903670000000001,0.0011540789999999999],"294912":[0.049014813999999997,0.051691429000000011],"1048576":[0.20505958099999999,0.24877643599999999],"10485760":[3.4518745879999999,3.8753241690000002],"344064":[0.059729339000000006,0.065527971000000004],"288":[3.4020999999999998e-05,3.8065000000000002e-05],"1152":[0.00016666900000000001,0.00016798600000000004],"384":[5.3421999999999998e-05,5.5662999999999999e-05],"2304":[0.00031228499999999998,0.00033956599999999991],"896":[0.000121846,0.000126024],"480":[5.9148999999999999e-05,6.6152e-05],"1441792":[0.32263903100000002,0.40957560500000001],"992":[0.00013329299999999999,0.00014146500000000002],"3968":[0.00053523799999999973,0.00056045699999999999],"6400":[0.00092557700000000002,0.00103254],"1344":[0.00017948399999999999,0.00019196999999999999],"126976":[0.01982652,0.020367292999999998],"2883584":[0.80018314599999996,0.85842682199999998],"753664":[0.14786313400000001,0.197772477],"16384":[0.0023851850000000002,0.002498292],"131072":[0.020504365,0.021383151],"458752":[0.080182059,0.096893555999999992],"172032":[0.028167224999999997,0.029617829999999994],"12288":[0.001925628,0.0020160459999999996],"14680064":[5.1974553480000001,5.6377079730000004],"1536":[0.0002274,0.00023884399999999999],"25600":[0.003907219,0.004364517],"1835008":[0.41668351800000003,0.43718188000000002],"10752":[0.0016152110000000001,0.001664004],"21504":[0.0032406150000000009,0.0033708319999999998],"7602176":[2.4034637449999998,2.4518174890000002],"5632":[0.00081736199999999997,0.000884963],"10":[1.6500000000000001e-07,1.68e-07],"3145728":[0.90754973999999999,0.91978934099999998],"245760":[0.040387965999999997,0.04184150100000001],"1728":[0.000236114,0.00025629599999999993],"11":[1.85e-07,1.8699999999999999e-07],"1114112":[0.22437149999999995,0.26449577800000001],"12":[1.8900000000000001e-07,2.04e-07],"7340032":[2.2318448740000001,2.3675080660000001],"7168":[0.0010676309999999999,0.0011276020000000001],"13":[2.1199999999999999e-07,2.16e-07],"6029312":[1.9596073329999999,1.9908856269999999],"14":[2.22e-07,2.3099999999999999e-07],"3200":[0.00046870800000000008,0.0004852630000000001],"20":[1.3960000000000001e-06,1.6619999999999999e-06],"204800":[0.033974432999999998,0.034480492000000008],"15":[2.2600000000000001e-07,2.6600000000000003e-07],"13312":[0.001974951,0.0019864699999999997],"4980736":[1.470793512,1.4882810580000001],"118784":[0.018483692999999999,0.019294863000000002],"51200":[0.0080155830000000015,0.0084583480000000009],"16":[9.1399999999999995e-07,1.0559999999999999e-06],"21":[1.5290000000000001e-06,1.68e-06],"917504":[0.17752400800000001,0.216622121],"22":[1.832e-06,1.9700000000000002e-06],"4864":[0.00070497000000000008,0.00073191299999999983],"17":[1.0270000000000001e-06,1.0899999999999999e-06],"14848":[0.0021764470000000002,0.0022314739999999994],"23":[1.9360000000000002e-06,2.4200000000000001e-06],"786432":[0.160768629,0.21621964599999999],"18":[1.1540000000000001e-06,1.2640000000000001e-06],"1638400":[0.369613213,0.37441556300000001],"7864320":[2.5972062760000001,2.7019597019999999],"24":[2.0490000000000002e-06,2.7750000000000001e-06],"14155776":[5.0629507289999998,10.149002251000001],"19":[1.2419999999999999e-06,1.4619999999999999e-06],"30":[1.5889999999999999e-06,1.762e-06],"25":[1.0449999999999999e-06,1.3230000000000001e-06],"31":[1.5269999999999999e-06,1.5549999999999999e-06],"1280":[0.00017643200000000002,0.00019929999999999997],"26":[1.1039999999999999e-06,1.2130000000000001e-06],"3932160":[1.047188421,1.1017508069999999],"2432":[0.00032808499999999999,0.00036094400000000009],"32":[1.668e-06,1.897e-06],"27":[1.243e-06,1.485e-06],"409600":[0.074153163000000008,0.076193219999999992]}},{"title":"OrderedDictionary removeFirst","results":{"28":[1.6270000000000001e-06,1.8619999999999999e-06],"2432":[0.00080441999999999992,0.00086865899999999971],"29":[1.8989999999999999e-06,2.1059999999999998e-06],"704":[0.000152702,0.00015677600000000002],"54":[5.5690000000000004e-06,6.6239999999999996e-06],"640":[0.00012351200000000005,0.00013086],"7424":[0.0069032700000000013,0.0073829809999999994],"80":[1.0489000000000001e-05,1.0913e-05],"1792":[0.00050093900000000005,0.00053442599999999963],"12800":[0.019465707000000002,0.020626022000000001],"22528":[0.058392080000000013,0.060043075000000001],"480":[8.5687999999999997e-05,9.3082000000000001e-05],"544":[0.000105561,0.000108069],"608":[0.000127658,0.000128529],"56":[5.2959999999999998e-06,5.7350000000000001e-06],"464":[8.1458999999999994e-05,9.1905999999999997e-05],"18432":[0.039235294999999989,0.040214309999999996],"58":[5.7300000000000002e-06,6.5420000000000002e-06],"1984":[0.00057633999999999984,0.00058718599999999996],"448":[8.2126999999999995e-05,8.8932999999999997e-05],"384":[7.5888000000000003e-05,8.0527999999999999e-05],"4352":[0.0025643479999999997,0.002645615],"84":[1.1103e-05,1.1314999999999999e-05],"36864":[0.14738874299999999,0.15663400899999999],"368":[6.8596999999999994e-05,7.7092e-05],"2816":[0.00112509,0.001198862],"288":[4.6085999999999999e-05,5.2902000000000003e-05],"14336":[0.024067794,0.024589080999999995],"88":[1.0288999999999999e-05,1.1911e-05],"1088":[0.00026082299999999998,0.00026395900000000013],"1280":[0.000301444,0.00031002200000000008],"32768":[0.119105923,0.121434502],"832":[0.000172996,0.00018671599999999997],"9728":[0.011588724,0.012140247],"1472":[0.00039247699999999991,0.00042107500000000003],"672":[0.00013267000000000002,0.00014964700000000001],"736":[0.000172819,0.00018458599999999998],"28672":[0.092591008000000002,0.093537902000000006],"30720":[0.10322445500000001,0.11032098],"2304":[0.00072349100000000015,0.00078476199999999994],"576":[0.000110664,0.00011875399999999997],"8192":[0.0082817589999999996,0.0089652959999999976],"1664":[0.00043528700000000002,0.00046436200000000001],"496":[8.9102000000000002e-05,9.5054000000000002e-05],"6656":[0.0057235609999999994,0.0060177590000000001],"24576":[0.069236549999999966,0.069747332999999967],"30":[1.8020000000000001e-06,1.9609999999999999e-06],"1856":[0.000510411,0.00051106899999999974],"31":[1.9970000000000001e-06,2.0619999999999999e-06],"9216":[0.010338284,0.010878231],"32":[2.1349999999999999e-06,2.638e-06],"3584":[0.001771417,0.001853015],"960":[0.00022331,0.0002418],"17408":[0.035424839,0.037325762999999998],"77824":[0.78303274599999995,0.85161276799999996],"34":[2.5600000000000001e-06,3.1020000000000001e-06],"10752":[0.014010643,0.015301594],"864":[0.000181504,0.00019292799999999998],"928":[0.000201244,0.000214088],"60":[5.998e-06,6.0650000000000004e-06],"1152":[0.000285073,0.00028786999999999997],"40960":[0.181147169,0.19144001799999999],"36":[3.0139999999999999e-06,3.569e-06],"6144":[0.0054957070000000007,0.0058148969999999986],"4608":[0.0028395809999999994,0.0031224299999999998],"768":[0.00016348300000000002,0.00016494400000000004],"62":[7.0509999999999999e-06,7.1269999999999997e-06],"16384":[0.031301042000000008,0.033204372000000017],"38":[2.977e-06,3.2669999999999998e-06],"3968":[0.0021128170000000003,0.002225248],"1344":[0.00032891700000000002,0.000329291],"73728":[0.68674163799999999,0.72387992299999993],"64":[6.2489999999999998e-06,8.7069999999999998e-06],"3072":[0.001443012,0.001476319],"1":[5.2999999999999998e-08,5.4e-08],"1536":[0.00041148599999999997,0.00046268600000000002],"2":[5.5999999999999999e-08,5.7000000000000001e-08],"92":[1.1416e-05,1.4144999999999999e-05],"3":[6.8999999999999996e-08,7.1999999999999996e-08],"69632":[0.57022444300000008,0.60855410599999993],"4":[8.6999999999999998e-08,8.9999999999999999e-08],"68":[7.7279999999999995e-06,7.9780000000000005e-06],"5888":[0.0045779529999999992,0.0046651060000000005],"5":[9.2000000000000003e-08,9.9999999999999995e-08],"12288":[0.018245247999999999,0.01951814],"27648":[0.085401279000000024,0.090457382999999975],"6":[1.09e-07,1.11e-07],"7":[1.1999999999999999e-07,1.3400000000000001e-07],"1920":[0.00053617499999999985,0.00058762199999999988],"1728":[0.00049154999999999999,0.00051169300000000002],"6912":[0.006103402,0.0064630500000000006],"8":[1.42e-07,1.79e-07],"992":[0.000225885,0.00022916000000000001],"9":[1.66e-07,1.8099999999999999e-07],"96":[1.3783e-05,1.4075e-05],"47104":[0.244435707,0.25589259800000003],"3456":[0.001645437,0.0017623650000000005],"10240":[0.012708887,0.013030922],"25600":[0.074309730000000018,0.075470312000000012],"65536":[0.49266340800000002,0.51308906600000004],"896":[0.00019145999999999996,0.00019882799999999999],"13824":[0.022986650000000004,0.023388625],"3840":[0.0020053639999999999,0.0021258360000000003],"1024":[0.000224961,0.00023067000000000001],"43008":[0.203968282,0.21575135400000001],"100":[1.2177e-05,1.2432000000000001e-05],"5376":[0.0037697020000000006,0.0042363009999999996],"19456":[0.043624928,0.044560897000000002],"21504":[0.052923077000000006,0.056252055999999995],"10":[1.5800000000000001e-07,1.61e-07],"81920":[0.94127851600000001,0.97391341499999995],"1216":[0.00029880599999999998,0.00030702100000000004],"11":[1.7100000000000001e-07,2.03e-07],"6400":[0.005257569000000001,0.0055258969999999984],"12":[2.1299999999999999e-07,2.3900000000000001e-07],"57344":[0.355719169,0.36860433500000001],"13":[2.29e-07,2.29e-07],"1408":[0.00036726,0.000405277],"1600":[0.00041210199999999997,0.00045659599999999992],"14":[2.2700000000000001e-07,2.4999999999999999e-07],"200":[3.3093999999999999e-05,3.3181e-05],"20480":[0.048441777000000005,0.050788464000000012],"15":[2.9299999999999999e-07,3.1199999999999999e-07],"40":[3.004e-06,3.427e-06],"120":[1.6325e-05,1.7095000000000001e-05],"112":[1.4758e-05,1.5330999999999999e-05],"16":[1.0189999999999999e-06,1.099e-06],"104":[1.4439e-05,1.5024999999999999e-05],"17":[1.128e-06,1.1930000000000001e-06],"42":[3.2909999999999999e-06,3.8589999999999998e-06],"7680":[0.007445419,0.007709034],"53248":[0.30830650800000003,0.325081693],"18":[1.2929999999999999e-06,1.683e-06],"13312":[0.020875551999999999,0.021215303999999997],"3328":[0.0015458329999999997,0.0016361979999999997],"19":[1.2219999999999999e-06,1.719e-06],"44":[4.0720000000000001e-06,4.0990000000000001e-06],"29696":[0.096633326000000005,0.100677788],"31744":[0.110490775,0.114821996],"2688":[0.00099035900000000012,0.001047433],"46":[4.1919999999999998e-06,4.4649999999999996e-06],"49152":[0.26429955299999996,0.27218255800000002],"51200":[0.29188566799999999,0.30455557999999999],"72":[8.2349999999999999e-06,9.037e-06],"3712":[0.0018730959999999999,0.001914551],"124":[1.6220999999999999e-05,1.7672999999999998e-05],"8704":[0.0092774999999999993,0.0097891440000000014],"48":[4.4569999999999998e-06,6.0000000000000002e-06],"116":[1.5270000000000001e-05,1.5515999999999998e-05],"108":[1.3678e-05,1.3906e-05],"15872":[0.029617886,0.030474757000000002],"400":[7.3541000000000006e-05,7.6095999999999998e-05],"320":[5.5492999999999999e-05,6.1884999999999994e-05],"76":[9.0720000000000006e-06,9.3519999999999996e-06],"240":[3.4891999999999997e-05,3.8707000000000001e-05],"304":[5.0166e-05,5.0306000000000003e-05],"45056":[0.22080657100000001,0.22851543799999999],"232":[3.3612000000000003e-05,4.0677999999999999e-05],"5632":[0.0041492179999999997,0.0044315610000000005],"160":[2.1563e-05,2.7684000000000001e-05],"224":[3.4539999999999998e-05,3.6066000000000003e-05],"23552":[0.06404025200000002,0.066865861000000013],"152":[2.3394e-05,2.3595e-05],"216":[3.3055000000000001e-05,3.3782999999999998e-05],"38912":[0.167190008,0.16818512899999999],"144":[2.0738999999999999e-05,2.1600999999999999e-05],"208":[3.2385000000000002e-05,3.3872999999999999e-05],"7168":[0.0064963629999999998,0.007045570000000001],"136":[1.8610999999999999e-05,2.012e-05],"2176":[0.00065070900000000018,0.00071801000000000037],"11776":[0.016853029999999998,0.017303127000000001],"128":[1.7470999999999999e-05,1.9083999999999999e-05],"63488":[0.45426519799999998,0.45891725900000002],"3200":[0.0014382379999999997,0.001535146],"59392":[0.390432481,0.414543675],"61440":[0.40601608099999997,0.43438389099999997],"2560":[0.000922078,0.00099552699999999996],"34816":[0.13448891399999999,0.13888362800000001],"4096":[0.0023330930000000001,0.0023472079999999999],"5120":[0.003503375,0.0035566090000000009],"55296":[0.33595072199999998,0.35142854099999998],"512":[0.000101297,0.000106069],"15360":[0.027513091,0.028624495],"432":[7.5377999999999996e-05,8.4309999999999997e-05],"20":[1.482e-06,1.773e-06],"2944":[0.0012251340000000003,0.0012469079999999999],"352":[6.1663999999999998e-05,7.2576000000000004e-05],"416":[7.3361000000000005e-05,8.1965000000000006e-05],"21":[1.8950000000000001e-06,2.199e-06],"7936":[0.0077812110000000014,0.0079744000000000013],"272":[4.2261000000000001e-05,4.6020000000000003e-05],"336":[6.0696000000000003e-05,6.5446999999999999e-05],"22":[1.734e-06,2.4990000000000001e-06],"192":[3.2084e-05,3.4715999999999998e-05],"256":[4.2082000000000001e-05,4.3331999999999998e-05],"23":[2.3920000000000001e-06,2.7089999999999998e-06],"184":[3.0642999999999998e-05,3.0732000000000003e-05],"248":[3.9983e-05,4.1072999999999998e-05],"11264":[0.015289439,0.016559221999999995],"176":[2.7222000000000001e-05,3.5342999999999997e-05],"24":[2.48e-06,2.7750000000000001e-06],"26624":[0.080365454999999988,0.082776555999999987],"168":[2.4584e-05,2.7424999999999999e-05],"25":[1.3149999999999999e-06,1.3540000000000001e-06],"50":[4.78e-06,5.0019999999999997e-06],"4864":[0.0031033340000000001,0.0032944939999999998],"2048":[0.00061763599999999997,0.00063616200000000001],"14848":[0.025870977,0.026685742000000005],"26":[1.474e-06,1.482e-06],"86016":[1.1285513279999999,1.1635873779999999],"27":[1.339e-06,1.404e-06],"800":[0.000170831,0.00017429200000000002],"52":[4.7940000000000002e-06,5.1880000000000001e-06]}},{"title":"OrderedDictionary random removals (offset-based)","results":{"28":[3.456e-06,3.9920000000000001e-06],"2432":[0.025445567000000002,0.026633424000000006],"29":[3.9160000000000003e-06,3.9600000000000002e-06],"704":[0.002215622,0.002315522],"54":[1.4369000000000001e-05,1.7431999999999998e-05],"640":[0.001734595,0.0018023820000000004],"7424":[0.22411329699999999,0.230746742],"80":[3.4557000000000001e-05,3.5058000000000002e-05],"1792":[0.012973430000000003,0.013431812],"12800":[0.67125465399999995,0.69374557799999992],"480":[0.00094551300000000004,0.001006945],"544":[0.001267769,0.001272888],"608":[0.0016482719999999999,0.001738418],"56":[1.6033e-05,1.6529e-05],"464":[0.00085952000000000012,0.00089632899999999985],"58":[1.6161e-05,1.8709999999999999e-05],"1984":[0.015032737000000001,0.015741181],"448":[0.00077556399999999996,0.00087820999999999993],"384":[0.00064048599999999979,0.000671789],"4352":[0.078691915000000015,0.081416242],"84":[3.4133e-05,4.2660000000000002e-05],"368":[0.00063927800000000007,0.00065142600000000009],"2816":[0.035178282999999998,0.037024738999999994],"288":[0.000377592,0.00039939800000000003],"14336":[0.85640367900000003,0.90159834000000005],"88":[3.9743999999999998e-05,4.1533999999999999e-05],"1088":[0.004954623,0.0049886129999999985],"1280":[0.0069358029999999999,0.0073112250000000002],"832":[0.0025623739999999996,0.0026543879999999997],"9728":[0.42024134800000001,0.440061378],"1472":[0.0097091249999999886,0.01048781],"672":[0.0019392459999999999,0.0020645559999999999],"736":[0.0023473499999999998,0.002475349],"2304":[0.021795317000000005,0.021974879999999999],"576":[0.001366054,0.001463766],"8192":[0.28032948099999999,0.290918436],"1664":[0.010496663,0.011600918999999998],"496":[0.0009880589999999999,0.0010368969999999999],"6656":[0.180625811,0.189259438],"30":[3.286e-06,4.4560000000000002e-06],"1856":[0.013097091999999999,0.013694273],"31":[3.6049999999999998e-06,3.7459999999999998e-06],"9216":[0.36410653100000001,0.39682389499999998],"32":[4.267e-06,5.181e-06],"3584":[0.050820124999999994,0.053169051000000002],"960":[0.0037700809999999993,0.0038238040000000001],"34":[6.02e-06,6.5980000000000002e-06],"10752":[0.53312574199999996,0.57431175299999992],"864":[0.003022959,0.0031704540000000005],"928":[0.0033631389999999998,0.0034368469999999998],"60":[1.7770000000000001e-05,1.8496e-05],"1152":[0.0057428399999999991,0.0057870810000000012],"36":[5.6380000000000001e-06,6.3180000000000003e-06],"6144":[0.184377233,0.200222229],"4608":[0.088591630000000005,0.095888008999999982],"768":[0.0027926890000000001,0.002805887],"62":[1.7734e-05,2.1137000000000001e-05],"38":[5.7189999999999998e-06,7.024e-06],"3968":[0.06430719700000001,0.066340344999999995],"1344":[0.0079214379999999994,0.0082024980000000025],"64":[1.6934000000000001e-05,2.3325000000000001e-05],"3072":[0.046551939000000001,0.047129656999999998],"1":[4.6000000000000002e-08,4.6000000000000002e-08],"1536":[0.011069539,0.011260361],"2":[5.5000000000000003e-08,5.8000000000000003e-08],"92":[4.4802999999999998e-05,4.8551000000000003e-05],"3":[7.6000000000000006e-08,8.3999999999999998e-08],"4":[7.6000000000000006e-08,9.2000000000000003e-08],"68":[1.9961000000000001e-05,2.5049999999999999e-05],"5888":[0.163473285,0.168018789],"5":[9.3999999999999995e-08,9.5999999999999999e-08],"12288":[0.74951912600000004,0.77984367099999996],"6":[1.04e-07,1.14e-07],"7":[1.2700000000000001e-07,1.4000000000000001e-07],"1920":[0.014469913000000001,0.014725703],"1728":[0.011803981,0.012568468999999999],"6912":[0.19492029599999999,0.200566205],"8":[1.3400000000000001e-07,1.3799999999999999e-07],"992":[0.0038285350000000001,0.0041331759999999997],"9":[1.54e-07,1.72e-07],"96":[4.8106000000000003e-05,4.8164000000000002e-05],"3456":[0.04753651100000001,0.049293135999999987],"10240":[0.48149377199999999,0.50868727800000002],"896":[0.003091725,0.0033526129999999999],"13824":[0.79185781,0.80176504100000001],"3840":[0.058086123999999996,0.061170561999999998],"1024":[0.003983874000000001,0.0042502019999999998],"100":[4.3288000000000003e-05,5.0058000000000001e-05],"5376":[0.13150802,0.13431126199999999],"10":[1.7700000000000001e-07,1.79e-07],"1216":[0.0058711080000000007,0.0066907009999999986],"11":[1.7700000000000001e-07,1.9500000000000001e-07],"6400":[0.16209088000000005,0.167626302],"12":[2.03e-07,2.29e-07],"13":[2.0800000000000001e-07,2.5100000000000001e-07],"1408":[0.0096571070000000016,0.0097644589999999996],"1600":[0.0098560490000000004,0.010608701],"14":[2.22e-07,2.22e-07],"200":[0.00016623499999999998,0.00017825799999999996],"15":[2.4200000000000002e-07,2.7099999999999998e-07],"40":[7.1550000000000001e-06,7.7160000000000003e-06],"120":[7.0139e-05,7.4554000000000005e-05],"112":[5.6728000000000003e-05,6.1623000000000003e-05],"16":[1.5510000000000001e-06,2.0260000000000002e-06],"104":[5.1400000000000003e-05,5.4926999999999998e-05],"17":[1.9130000000000001e-06,1.916e-06],"42":[8.2560000000000002e-06,1.1078e-05],"7680":[0.24254624199999997,0.25663429999999998],"18":[2.2730000000000001e-06,2.2910000000000002e-06],"13312":[0.72542277900000007,0.75631052900000006],"3328":[0.043247952999999999,0.047645012],"19":[2.103e-06,2.898e-06],"44":[9.7659999999999993e-06,1.0539e-05],"2688":[0.032042033999999997,0.032084717000000006],"46":[1.2648e-05,1.2918000000000001e-05],"72":[2.2472000000000001e-05,2.9275999999999999e-05],"3712":[0.054716220000000003,0.054846957999999987],"124":[7.0550999999999996e-05,7.3996000000000001e-05],"8704":[0.32369855700000005,0.33856362899999998],"48":[1.2305e-05,1.6796999999999999e-05],"116":[5.8406999999999998e-05,6.0630000000000001e-05],"108":[5.0290000000000001e-05,5.5359999999999999e-05],"15872":[1.076430824],"400":[0.0006229880000000001,0.00064910499999999997],"320":[0.00042316400000000002,0.00049925200000000016],"76":[3.0343999999999999e-05,3.6674000000000002e-05],"240":[0.00024060299999999999,0.00026209199999999996],"304":[0.00039624799999999998,0.00044193899999999997],"232":[0.00022420399999999998,0.00025524200000000003],"5632":[0.14735483399999999,0.156919328],"160":[0.000113885,0.000133879],"224":[0.00020694799999999998,0.000225775],"152":[0.00011426599999999999,0.00011593],"216":[0.00018748499999999998,0.00019781099999999999],"144":[9.9839000000000004e-05,0.000102686],"208":[0.000167112,0.00018757499999999999],"7168":[0.21072522899999999,0.22070568800000001],"136":[7.6417999999999999e-05,8.6929999999999996e-05],"2176":[0.019491604000000003,0.019801546999999999],"11776":[0.67906460800000001,0.68504927599999998],"128":[7.5858000000000005e-05,7.7409000000000004e-05],"3200":[0.040299031999999999,0.042389099999999999],"2560":[0.028523666,0.030157812999999995],"4096":[0.069126812999999981,0.071447584999999966],"5120":[0.11589244999999999,0.121298559],"512":[0.0011454590000000001,0.0011563880000000002],"15360":[0.993661083,1.023684459],"432":[0.00070593000000000001,0.000736489],"20":[2.1780000000000002e-06,2.977e-06],"2944":[0.039988317000000002,0.040147648999999994],"352":[0.00056776199999999987,0.00063001799999999998],"416":[0.00066951000000000001,0.0007536699999999999],"21":[2.9249999999999999e-06,3.0819999999999999e-06],"7936":[0.253987886,0.26466083899999998],"272":[0.00031169799999999996,0.00032423199999999998],"336":[0.00050680100000000008,0.00052686999999999992],"22":[2.7879999999999998e-06,3.6270000000000002e-06],"192":[0.00017218000000000002,0.00018575799999999998],"256":[0.00030000099999999994,0.000300167],"23":[3.4999999999999999e-06,5.31e-06],"184":[0.00017570000000000004,0.000184451],"248":[0.00027231800000000002,0.00028998499999999998],"11264":[0.61308951999999994,0.64217597400000004],"176":[0.000154504,0.00016660400000000002],"24":[4.5469999999999998e-06,4.7990000000000001e-06],"168":[0.00012751100000000002,0.000148765],"25":[2.199e-06,2.7020000000000001e-06],"50":[1.1781e-05,1.2877000000000001e-05],"4864":[0.10240487700000001,0.10940219900000001],"2048":[0.016711050000000009,0.017404958000000005],"14848":[0.93898817800000001,0.95311891500000001],"26":[2.7420000000000002e-06,2.8499999999999998e-06],"27":[2.959e-06,2.9840000000000001e-06],"800":[0.002445123,0.002585291],"52":[1.2577e-05,1.3854e-05]}},{"title":"OrderedDictionary random removals (existing keys)","results":{"28":[3.6770000000000001e-06,3.704e-06],"2432":[0.024693543000000002,0.026502431],"29":[3.641e-06,4.3100000000000002e-06],"704":[0.0021429739999999997,0.0022890779999999999],"54":[1.4712000000000001e-05,1.7621999999999998e-05],"640":[0.001801766,0.0018491600000000001],"7424":[0.22556620199999999,0.23293134599999998],"80":[3.1205999999999999e-05,3.1915000000000002e-05],"1792":[0.012659683,0.012967328],"12800":[0.67893742499999998,0.67907905800000001],"480":[0.00092670100000000004,0.001003522],"544":[0.0012442739999999999,0.0012625499999999999],"608":[0.001638469,0.0016509229999999999],"56":[1.4003e-05,1.4836e-05],"464":[0.00092044299999999996,0.00097527500000000006],"58":[1.6674999999999999e-05,1.7598e-05],"1984":[0.015014328,0.015486321000000003],"448":[0.00080869299999999987,0.00086447599999999998],"384":[0.00066897700000000007,0.00068348600000000008],"4352":[0.079756305999999999,0.080625109],"84":[3.5122e-05,3.8334999999999998e-05],"368":[0.00060533400000000002,0.00064395799999999981],"2816":[0.036914761000000004,0.037510024999999995],"288":[0.00034722799999999999,0.00042826800000000015],"14336":[0.84996806499999999,0.87595999800000002],"88":[4.0092000000000002e-05,4.0299000000000002e-05],"1088":[0.0047977520000000006,0.0048894029999999996],"1280":[0.0067224419999999995,0.0069086459999999992],"832":[0.0025892850000000002,0.002619363],"9728":[0.42710854899999995,0.43331602999999996],"1472":[0.0098807989999999939,0.010507906000000001],"672":[0.0019917170000000001,0.002064597],"736":[0.0024923569999999997,0.0025182059999999998],"2304":[0.022332985999999999,0.022673462000000005],"576":[0.001302632,0.001461258],"8192":[0.27613998100000003,0.28804531100000003],"1664":[0.010664546,0.011266443000000001],"496":[0.001001669,0.001012558],"6656":[0.178775664,0.18535075400000001],"30":[4.0010000000000003e-06,4.0489999999999997e-06],"1856":[0.013257201,0.013473931],"31":[3.9060000000000004e-06,4.2560000000000004e-06],"9216":[0.369200376,0.38198009900000002],"32":[4.2010000000000001e-06,4.2100000000000003e-06],"3584":[0.050536088,0.051169187000000005],"960":[0.0036648050000000001,0.0038541250000000008],"34":[5.6210000000000001e-06,6.7440000000000001e-06],"10752":[0.54042870700000001,0.57615062100000003],"864":[0.003011831,0.0031094319999999996],"928":[0.0033896270000000001,0.0035594899999999998],"60":[1.6558e-05,1.8861000000000001e-05],"1152":[0.0055125590000000002,0.005547645999999999],"36":[6.4500000000000001e-06,6.8739999999999997e-06],"6144":[0.18275464900000005,0.19700698899999999],"4608":[0.088764953000000008,0.096342720999999992],"768":[0.002703076,0.0028052959999999997],"62":[2.0228e-05,2.0594e-05],"38":[6.0140000000000004e-06,7.5979999999999999e-06],"3968":[0.063621727000000003,0.06603216100000002],"1344":[0.0075849810000000002,0.0079188809999999974],"64":[1.9279999999999998e-05,1.9335999999999999e-05],"3072":[0.045689066,0.048047324000000009],"1":[6.5e-08,6.8e-08],"1536":[0.011184259,0.011440105000000034],"2":[8.2000000000000006e-08,9.5000000000000004e-08],"92":[4.5410000000000001e-05,4.5859999999999998e-05],"3":[1.06e-07,1.08e-07],"4":[1.1899999999999999e-07,1.4499999999999999e-07],"68":[2.2382999999999999e-05,2.4006e-05],"5888":[0.16701258999999999,0.167854158],"5":[1.4600000000000001e-07,1.6400000000000001e-07],"12288":[0.74746720999999994,0.75664572799999996],"6":[1.67e-07,1.72e-07],"7":[1.86e-07,1.98e-07],"1920":[0.014282708999999999,0.015293570000000003],"1728":[0.011484905,0.012038504],"6912":[0.19683752500000001,0.19830136099999995],"8":[2.2700000000000001e-07,2.4999999999999999e-07],"992":[0.003837858,0.0042182949999999995],"9":[2.6800000000000002e-07,2.7799999999999997e-07],"96":[4.5578999999999998e-05,4.6456999999999999e-05],"3456":[0.047310847999999996,0.048929416999999996],"10240":[0.48219203700000002,0.50932774000000003],"896":[0.0029775079999999994,0.0031391729999999994],"13824":[0.79858665900000003,0.80414579100000005],"3840":[0.059115515,0.061467957000000004],"1024":[0.0042092169999999995,0.0043163029999999996],"100":[4.5380000000000003e-05,5.0436999999999998e-05],"5376":[0.13342166599999999,0.13929597599999999],"10":[2.4999999999999999e-07,2.7399999999999999e-07],"1216":[0.0062196740000000014,0.0063700650000000011],"11":[2.8999999999999998e-07,3.0100000000000001e-07],"6400":[0.16493771099999999,0.17291242900000001],"12":[3.0600000000000001e-07,3.0899999999999997e-07],"13":[3.3599999999999999e-07,3.46e-07],"1408":[0.009206464000000001,0.0094177720000000013],"1600":[0.010021732,0.010128317],"14":[3.5199999999999998e-07,3.7899999999999999e-07],"200":[0.00017187700000000002,0.00017256199999999999],"15":[3.6699999999999999e-07,4.15e-07],"40":[6.1539999999999999e-06,9.0359999999999995e-06],"120":[7.1892999999999998e-05,7.7183999999999998e-05],"112":[5.6317000000000003e-05,5.8544000000000001e-05],"16":[1.7799999999999999e-06,1.857e-06],"104":[5.1625000000000001e-05,5.7904e-05],"17":[1.542e-06,2.9639999999999999e-06],"42":[7.2239999999999998e-06,1.0655e-05],"7680":[0.23979013900000001,0.25197486800000002],"18":[2.1610000000000001e-06,2.1969999999999999e-06],"13312":[0.72452051200000001,0.76002745100000002],"3328":[0.043104904000000013,0.049107129999999992],"19":[2.0710000000000002e-06,2.818e-06],"44":[9.4860000000000003e-06,9.9620000000000005e-06],"2688":[0.031526403999999994,0.032688478999999993],"46":[1.0849999999999999e-05,1.4115e-05],"72":[2.1274999999999999e-05,2.5918000000000002e-05],"3712":[0.056039804000000006,0.056483560000000002],"124":[7.2862999999999997e-05,7.2940000000000003e-05],"8704":[0.32134505299999999,0.34583544300000002],"48":[1.0805000000000001e-05,1.4205e-05],"116":[5.9339999999999998e-05,6.0673e-05],"108":[5.3597999999999997e-05,5.4607000000000001e-05],"15872":[1.0719195370000001],"400":[0.00063256300000000027,0.00067119800000000024],"320":[0.00042343699999999992,0.00048059099999999999],"76":[2.8884999999999999e-05,3.1636e-05],"240":[0.00024903699999999997,0.000256455],"304":[0.00041544199999999997,0.00041601399999999998],"232":[0.000208896,0.00022049100000000001],"5632":[0.15030126399999999,0.15411698400000001],"160":[0.000112799,0.00012653500000000002],"224":[0.0002195,0.00022139800000000004],"152":[0.00010704000000000001,0.00012337000000000001],"216":[0.00019816299999999998,0.00019991100000000002],"144":[9.4914999999999995e-05,0.000107256],"208":[0.00019027599999999999,0.000196233],"7168":[0.20735915599999999,0.22104263599999999],"136":[8.1670999999999998e-05,9.2285000000000002e-05],"2176":[0.019380189999999999,0.019652301],"11776":[0.68838455799999998,0.68893800800000005],"128":[7.8441000000000003e-05,8.2453000000000005e-05],"3200":[0.040786587000000034,0.042731796000000002],"2560":[0.027551243,0.029502278],"4096":[0.067396307999999988,0.070612929000000033],"5120":[0.116510262,0.119534592],"512":[0.0011245810000000004,0.001131962],"15360":[0.993530523,1.0073385539999999],"432":[0.00073901700000000002,0.00074756699999999987],"20":[2.4530000000000001e-06,2.9299999999999999e-06],"2944":[0.041088059999999996,0.041428476000000006],"352":[0.00055598500000000038,0.00063132899999999992],"416":[0.00071664100000000007,0.00077920400000000003],"21":[2.5780000000000001e-06,3.4240000000000002e-06],"7936":[0.26191504300000001,0.27291705500000002],"272":[0.00032911299999999996,0.00033711100000000007],"336":[0.00050425699999999993,0.00052833800000000027],"22":[3.1700000000000001e-06,3.3699999999999999e-06],"192":[0.00016751100000000002,0.000183303],"256":[0.000273319,0.00028850999999999996],"23":[3.1099999999999999e-06,3.36e-06],"184":[0.00016297299999999999,0.00018006700000000004],"248":[0.00027247799999999993,0.00028496499999999998],"11264":[0.602232357,0.62440224499999997],"176":[0.000153475,0.00015413799999999998],"24":[4.1409999999999998e-06,4.9690000000000002e-06],"168":[0.00013209799999999998,0.00014108],"25":[2.4480000000000001e-06,3.219e-06],"50":[1.3195e-05,1.3699e-05],"4864":[0.106844735,0.107955405],"2048":[0.016436424000000005,0.016853825999999999],"14848":[0.93834231999999995,0.96844783999999995],"26":[2.841e-06,3.0860000000000002e-06],"27":[2.6240000000000002e-06,3.0910000000000001e-06],"800":[0.0024688209999999995,0.0027118980000000003],"52":[1.1583000000000001e-05,1.3089e-05]}},{"title":"OrderedDictionary random removals (missing keys)","results":{"28":[5.5899999999999996e-07,6.5600000000000005e-07],"34":[7.7400000000000002e-07,9.6899999999999996e-07],"29":[6.3300000000000002e-07,6.9800000000000003e-07],"40":[1.105e-06,1.1930000000000001e-06],"17408":[0.00062639599999999988,0.00072995000000000004],"1472":[7.9454000000000002e-05,8.4796999999999995e-05],"112":[2.4389999999999999e-06,2.7719999999999999e-06],"1376256":[0.20879709499999999,0.30900112599999996],"5242880":[1.200308913,1.2601871419999999],"36":[9.64e-07,1.052e-06],"42":[1.3790000000000001e-06,1.517e-06],"11534336":[3.4195618699999999,3.544825887],"114688":[0.0043161359999999999,0.0052586869999999997],"144":[3.963e-06,3.9639999999999997e-06],"38":[1.1519999999999999e-06,1.263e-06],"240":[5.4280000000000004e-06,7.1620000000000002e-06],"9216":[0.00034465899999999993,0.00035145099999999997],"44":[1.223e-06,1.688e-06],"1664":[4.4537999999999999e-05,4.4909e-05],"196608":[0.018741122999999998,0.019499099999999998],"155648":[0.0086349040000000023,0.0090688759999999514],"2816":[0.000144404,0.00014907700000000001],"50":[1.0279999999999999e-06,1.062e-06],"2359296":[0.38730085000000003,0.39008227299999998],"46":[1.381e-06,1.745e-06],"176":[6.64e-06,7.5159999999999997e-06],"52":[1.1370000000000001e-06,1.2640000000000001e-06],"272":[7.1890000000000001e-06,7.2080000000000003e-06],"116":[2.6180000000000002e-06,2.779e-06],"47104":[0.0026012800000000001,0.0028019290000000003],"6912":[0.000208259,0.00020888100000000001],"1856":[5.4209999999999998e-05,5.7354e-05],"48":[1.86e-06,1.8670000000000001e-06],"2097152":[0.29144279699999998,0.29236019999999996],"54":[1.105e-06,1.274e-06],"2031616":[0.25880397499999996,0.27162020100000001],"43008":[0.0019965960000000002,0.00232635],"60":[1.381e-06,1.39e-06],"30720":[0.00098170699999999985,0.0010477750000000001],"56":[1.184e-06,1.238e-06],"62":[1.4610000000000001e-06,1.655e-06],"58":[1.31e-06,1.499e-06],"3014656":[0.87181343600000005,0.87872317600000005],"64":[1.5149999999999999e-06,1.689e-06],"8388608":[1.533124274,1.63528388],"29696":[0.00093954999999999993,0.000978439],"216":[4.7230000000000004e-06,4.9910000000000002e-06],"106496":[0.0038524170000000003,0.0045513039999999999],"72":[1.6610000000000001e-06,1.9999999999999999e-06],"442368":[0.022525865999999999,0.036796088000000005],"147456":[0.0074885749999999999,0.0077632780000000002],"4456448":[0.79664462899999999,0.80298783400000007],"63488":[0.0022733359999999999,0.0023292400000000007],"38912":[0.0015865950000000001,0.0016337049999999998],"68":[1.548e-06,1.6190000000000001e-06],"188416":[0.015800294999999999,0.01676451],"248":[5.5790000000000003e-06,6.2759999999999997e-06],"80":[2.3120000000000001e-06,2.8619999999999999e-06],"2560":[0.000103049,0.000109888],"34816":[0.001265153,0.001417881],"3712":[0.000114583,0.000115256],"3538944":[0.50679417900000001,0.51148147799999999],"76":[2.131e-06,2.3580000000000001e-06],"4194304":[0.686860464,0.70941751799999997],"851968":[0.059876319000000025,0.090973596000000018],"4096":[0.00012824399999999999,0.000130359],"59392":[0.002193104,0.0022875030000000002],"84":[2.4490000000000002e-06,3.1709999999999998e-06],"3276800":[0.443036029,0.45739990200000002],"55296":[0.0018709409999999999,0.0019671110000000001],"688128":[0.063139587999999996,0.083519559999999993],"8192":[0.00026871000000000002,0.00028045700000000002],"10240":[0.00045293900000000002,0.000463012],"15872":[0.00053130099999999997,0.000568535],"92":[3.1779999999999999e-06,3.467e-06],"26624":[0.00074044600000000018,0.00081121999999999997],"1792":[5.3445000000000001e-05,5.8829000000000002e-05],"11776":[0.00063650600000000001,0.00069144699999999987],"2944":[0.00015389400000000001,0.00015519500000000001],"88":[2.8430000000000001e-06,2.931e-06],"22528":[0.0011535810000000003,0.001193244],"1245184":[0.14895641000000001,0.20794041599999999],"15728640":[2.9199250179999998,2.9525079829999998],"96":[3.5470000000000001e-06,5.6289999999999998e-06],"1984":[5.8486000000000002e-05,5.8872999999999997e-05],"139264":[0.0066787559999999992,0.007583682999999999],"475136":[0.026273257000000001,0.035183664000000003],"13631488":[2.2479289480000002,2.3097617619999999],"416":[8.5720000000000003e-06,1.0342e-05],"928":[2.6438999999999999e-05,2.6650000000000001e-05],"512":[1.5395000000000001e-05,1.5770999999999999e-05],"18432":[0.00070906599999999973,0.00073530899999999996],"16777216":[3.2515698720000001],"9728":[0.00039582800000000009,0.00041547600000000002],"1769472":[0.18984980700000001,0.202357748],"1703936":[0.189169593,0.203005883],"2048":[6.2730000000000004e-05,6.4481999999999997e-05],"14336":[0.00042964400000000002,0.00046416800000000005],"448":[1.0471e-05,1.2085e-05],"5505024":[1.4317572750000001,1.4366663800000001],"544":[1.5620999999999998e-05,1.6620999999999999e-05],"221184":[0.0095189660000000002,0.01098417],"90112":[0.0051342039999999999,0.0052739139999999993],"640":[2.4654000000000001e-05,2.7059e-05],"12800":[0.00038273099999999998,0.00039405199999999993],"262144":[0.013021178999999999,0.013904016],"589824":[0.039534747000000002,0.059379112999999997],"884736":[0.063252826000000012,0.09474669500000002],"6144":[0.00038765500000000004,0.00038851099999999991],"1088":[3.5340999999999999e-05,3.6831e-05],"576":[1.8046999999999998e-05,1.9643000000000001e-05],"160":[4.904e-06,5.096e-06],"672":[2.9606000000000001e-05,3.6257999999999997e-05],"8912896":[1.733223782,1.832463191],"100":[2.057e-06,2.063e-06],"507904":[0.030221221,0.041055360999999992],"3840":[0.000121357,0.00012758600000000004],"192":[8.8259999999999999e-06,9.8609999999999993e-06],"376832":[0.036245502999999998,0.037213872999999995],"98304":[0.007339094,0.0076256819999999991],"5376":[0.00022659499999999995,0.00026138400000000003],"94208":[0.006156346,0.0063130439999999994],"81920":[0.0039806500000000005,0.004057204],"3407872":[0.47546815499999995,0.499917895],"104":[2.3140000000000002e-06,2.6029999999999999e-06],"122880":[0.0049680810000000001,0.0057174139999999997],"200":[4.2939999999999999e-06,4.3680000000000004e-06],"163840":[0.0099951580000000005,0.010477543000000001],"4063232":[0.64692819800000001,0.66922295899999995],"5767168":[1.6527840220000001,1.6809718890000001],"12582912":[5.0443795170000003,5.3309008249999996],"1600":[4.4709999999999997e-05,4.5374999999999998e-05],"136":[3.1559999999999999e-06,3.264e-06],"232":[5.023e-06,5.7790000000000001e-06],"7077888":[1.1141192849999999,1.1901168819999999],"86016":[0.0048071520000000003,0.004916068],"31744":[0.0010677850000000003,0.0010792199999999999],"168":[5.9320000000000001e-06,6.1330000000000004e-06],"622592":[0.047854760999999982,0.062866291000000032],"108":[2.4600000000000002e-06,2.65e-06],"327680":[0.023147682999999999,0.024262852999999994],"2176":[7.4386000000000002e-05,7.7558999999999994e-05],"3328":[9.9927999999999996e-05,0.000100519],"1":[3.7e-08,3.7e-08],"2":[3.8000000000000003e-08,4.1999999999999999e-08],"3":[4.8e-08,4.9999999999999998e-08],"4":[4.6999999999999997e-08,5.4e-08],"7424":[0.00022343499999999999,0.00024072899999999999],"5":[5.7000000000000001e-08,6.2999999999999995e-08],"23552":[0.0013445060000000003,0.0013539299999999995],"6":[6.2999999999999995e-08,6.8e-08],"61440":[0.0021933569999999995,0.002249446],"491520":[0.028849236,0.037626093999999999],"77824":[0.0034740349999999994,0.0037134430000000003],"7":[8.3000000000000002e-08,8.6999999999999998e-08],"8":[7.7999999999999997e-08,8.6999999999999998e-08],"208":[4.459e-06,5.1059999999999999e-06],"9":[8.6999999999999998e-08,1.03e-07],"73728":[0.0031668299999999998,0.0033286219999999998],"304":[9.1479999999999995e-06,9.9019999999999994e-06],"400":[8.5590000000000006e-06,8.9190000000000005e-06],"1310720":[0.17666077899999999,0.273396784],"336":[1.3308e-05,1.3443e-05],"3670016":[0.53741940499999996,0.55438493],"6656":[0.00019922599999999997,0.00020340900000000002],"15360":[0.00051085499999999984,0.00053015700000000007],"432":[9.7589999999999992e-06,1.1277999999999999e-05],"950272":[0.075480334999999996,0.107877369],"655360":[0.054387868000000006,0.081220212],"69632":[0.002735309,0.0031067709999999999],"11264":[0.00056164799999999999,0.00060892600000000009],"2752512":[0.596420493,0.629771992],"8126464":[1.4236677879999999,1.4496110070000001],"27648":[0.00084372899999999999,0.00085552299999999985],"368":[1.5603e-05,1.6229999999999999e-05],"65536":[0.0025582579999999999,0.0026538319999999996],"16252928":[3.050055537],"464":[1.1779e-05,1.1878999999999999e-05],"1015808":[0.084257448999999998,0.12367029299999999],"3072":[0.000180617,0.00020088699999999999],"110592":[0.0040279779999999998,0.0047311720000000005],"237568":[0.010986138000000001,0.011185515],"278528":[0.016170848000000002,0.01644607],"496":[1.3315e-05,1.6155999999999999e-05],"13107200":[2.097292779,2.1469241729999999],"9961472":[2.2137762240000001,2.2467194429999999],"5888":[0.00032137499999999999,0.00034675800000000002],"11010048":[2.939272248,2.9959696490000001],"1920":[6.1091000000000002e-05,6.6902000000000004e-05],"2490368":[0.43741901699999997,0.46907259300000004],"19456":[0.00080645799999999981,0.00080721899999999986],"57344":[0.0018975680000000001,0.0019467689999999999],"1179648":[0.12740390100000001,0.18306997999999999],"4718592":[0.90301928500000006,0.92675243600000001],"360448":[0.029648951999999999,0.031926533999999993],"1572864":[0.36183235800000002,0.40810184100000002],"53248":[0.00168322,0.0017321120000000003],"3456":[9.9615000000000001e-05,0.000112563],"40960":[0.001736984,0.0018276270000000001],"4608":[0.00017263199999999998,0.000180934],"13824":[0.000424447,0.00052590500000000001],"819200":[0.055381677000000004,0.091688969000000023],"983040":[0.08200120100000001,0.11572566400000001],"8704":[0.00031407800000000002,0.00033057700000000003],"120":[2.942e-06,3.4139999999999998e-06],"1024":[3.3869999999999999e-05,3.4168000000000002e-05],"49152":[0.0030244449999999997,0.0032248980000000003],"524288":[0.032560206999999945,0.041312088999999996],"45056":[0.0022614139999999998,0.002283359],"229376":[0.010443489,0.01099294],"2688":[0.000109671,0.000113411],"152":[4.3359999999999997e-06,4.7929999999999997e-06],"5120":[0.00021230500000000003,0.000224241],"1507328":[0.29832652399999998,0.36179540700000001],"1216":[4.4073000000000003e-05,4.5228000000000001e-05],"1966080":[0.25066104199999995,0.25457534500000001],"1900544":[0.22359748400000001,0.23743689700000004],"184":[6.8510000000000001e-06,8.1100000000000003e-06],"7936":[0.00026839700000000013,0.00027735500000000007],"3801088":[0.57804707600000005,0.59596219299999997],"6815744":[1.0431052970000001,1.11799081],"124":[2.9019999999999999e-06,3.2600000000000001e-06],"102400":[0.0035324650000000007,0.0035783720000000007],"311296":[0.019863637999999999,0.021796711],"1408":[6.4530999999999996e-05,6.8978000000000003e-05],"393216":[0.042453606999999997,0.046140467999999997],"4352":[0.00014647799999999999,0.00015338799999999996],"6553600":[0.97574645699999996,1.0457550819999999],"20480":[0.00091783899999999983,0.00096874199999999987],"608":[2.1412000000000001e-05,2.4769999999999998e-05],"2228224":[0.32849626100000001,0.33070039900000003],"36864":[0.001458132,0.001465779],"704":[3.6698e-05,3.6807000000000002e-05],"720896":[0.071675407999999996,0.10233808599999999],"800":[1.999e-05,2.0948e-05],"2621440":[0.50929584800000005,0.53567190899999995],"425984":[0.02152728700000001,0.023340242000000004],"32768":[0.0010835160000000001,0.001089905],"12058624":[4.1773975270000001,4.379948164],"128":[2.9179999999999998e-06,3.4740000000000001e-06],"180224":[0.012999532999999999,0.014356494000000003],"224":[5.2259999999999996e-06,5.2850000000000002e-06],"736":[3.7854e-05,3.8424999999999999e-05],"320":[1.1590000000000001e-05,1.1783000000000001e-05],"557056":[0.036460215000000004,0.049277277000000001],"832":[2.1169999999999999e-05,2.1427e-05],"9437184":[2.0104738279999999,2.0671822990000002],"3584":[0.00010043399999999998,0.00010754],"6291456":[2.4477690270000001,2.6121443119999999],"256":[6.0959999999999997e-06,6.6889999999999998e-06],"15204352":[2.7478456929999999,2.7917534239999999],"28672":[0.00089013999999999999,0.00089307999999999987],"768":[4.6332000000000003e-05,5.9036999999999997e-05],"212992":[0.0091384510000000006,0.0096256349999999987],"864":[2.4100999999999998e-05,2.4470000000000001e-05],"352":[1.2991e-05,1.5471000000000001e-05],"253952":[0.013209251,0.013789632],"960":[2.6936000000000001e-05,2.8442e-05],"24576":[0.0016426659999999999,0.001713078],"7680":[0.000238435,0.00025143099999999999],"294912":[0.018230956,0.019111601999999998],"1048576":[0.093671497000000006,0.13647862099999999],"10485760":[2.5019080489999999,2.6431320650000001],"344064":[0.025851647000000005,0.028206254],"288":[7.6860000000000006e-06,8.3939999999999996e-06],"1152":[4.1301999999999999e-05,4.2058999999999998e-05],"384":[1.5916000000000001e-05,1.9193000000000001e-05],"2304":[8.3023999999999997e-05,8.7923999999999994e-05],"896":[2.3887e-05,2.4791999999999999e-05],"480":[1.1466e-05,1.1953000000000001e-05],"1441792":[0.24794008300000001,0.36028573699999999],"992":[3.2336999999999999e-05,3.3578999999999998e-05],"3968":[0.00013299200000000002,0.00013570799999999998],"6400":[0.000174685,0.000174742],"1344":[5.6140000000000001e-05,5.8882999999999998e-05],"126976":[0.0053701010000000004,0.0065094630000000018],"2883584":[0.73111540900000005,0.78615423400000006],"753664":[0.080924217000000007,0.12841970799999999],"16384":[0.000558943,0.00062432600000000003],"131072":[0.0057985180000000008,0.0060473740000000012],"458752":[0.024617966000000005,0.029135892],"172032":[0.011144202000000001,0.011844036],"12288":[0.00075828399999999991,0.00082791499999999992],"14680064":[2.5822949409999998,2.6258754689999999],"1536":[9.4841999999999998e-05,9.7040000000000006e-05],"25600":[0.00069115800000000009,0.00071597999999999996],"1835008":[0.220911678,0.22185675399999999],"10752":[0.00050974199999999999,0.00056864100000000016],"21504":[0.0010211110000000001,0.0010433929999999999],"7602176":[1.2641701249999999,1.2792531710000001],"5632":[0.000280349,0.00028323400000000005],"10":[9.2000000000000003e-08,9.5000000000000004e-08],"3145728":[1.0334535819999999,1.0685694729999999],"245760":[0.011705946,0.013060314999999998],"1728":[5.0877000000000001e-05,5.1654999999999999e-05],"11":[1.1999999999999999e-07,1.24e-07],"1114112":[0.106694679,0.153366633],"12":[1.2800000000000001e-07,1.3e-07],"7340032":[1.151385474,1.166773888],"7168":[0.00021458100000000001,0.00023193400000000005],"13":[1.4600000000000001e-07,1.4700000000000001e-07],"6029312":[1.9869818800000001,1.997058233],"14":[1.4499999999999999e-07,1.4999999999999999e-07],"3200":[8.6057999999999995e-05,9.1575000000000003e-05],"20":[4.7399999999999998e-07,8.4399999999999999e-07],"204800":[0.0087420780000000003,0.0093983199999999999],"15":[1.5800000000000001e-07,1.7599999999999999e-07],"13312":[0.00039462600000000003,0.00041910500000000002],"4980736":[1.0371410329999999,1.069505264],"118784":[0.0048265170000000007,0.0050435500000000008],"51200":[0.001617601,0.0016342660000000001],"16":[3.8700000000000001e-07,4.8800000000000003e-07],"21":[6.0299999999999999e-07,7.2099999999999996e-07],"917504":[0.068292476000000046,0.100988381],"22":[9.6500000000000008e-07,1.0109999999999999e-06],"4864":[0.00019047400000000002,0.00020761],"17":[3.7899999999999999e-07,5.0800000000000005e-07],"14848":[0.00049929900000000003,0.00050350600000000003],"23":[7.37e-07,7.7700000000000004e-07],"786432":[0.108234726,0.16970600499999999],"18":[4.5299999999999999e-07,5.3099999999999998e-07],"1638400":[0.17494253400000001,0.178438445],"7864320":[1.3604973,1.368843456],"24":[8.1500000000000003e-07,9.7199999999999997e-07],"14155776":[2.4205971669999999,4.6702532640000003],"19":[4.51e-07,5.1099999999999996e-07],"30":[6.68e-07,6.8800000000000002e-07],"25":[5.5300000000000004e-07,6.1999999999999999e-07],"31":[6.8199999999999999e-07,7.6300000000000004e-07],"1280":[4.7682000000000002e-05,5.2234000000000002e-05],"26":[5.7000000000000005e-07,5.8899999999999999e-07],"3932160":[0.61031688299999998,0.61954112699999997],"2432":[8.8490000000000001e-05,9.8914999999999997e-05],"32":[7.8299999999999996e-07,8.1900000000000001e-07],"27":[5.2399999999999998e-07,5.4600000000000005e-07],"409600":[0.020958786000000014,0.021995190999999997]}},{"title":"Array successful contains","results":{"57344":[0.78925788600000002,0.79076035099999997,0.79087714549999999,0.79249336950000004,0.79351245500000001,0.79409037000000005,0.79419445700000002,0.79510024749999997,0.79513553100000001,0.79524303799999996,0.79597970799999995,0.79639000199999999,0.79649578649999997,0.79670258299999996,0.796946088,0.79778509099999995,0.79787021299999994,0.79804819599999999,0.79812635700000001,0.79832470099999997,0.79850005700000004,0.79874700300000001,0.79883789999999999,0.79894407499999998,0.79909263349999993,0.79936266349999996,0.79941134449999995,0.79947654599999995,0.79956257100000006,0.79970519399999995,0.79972479299999999,0.79984945499999993,0.79991277100000002,0.80027170450000007,0.800342832,0.80037432450000001,0.80057956099999994,0.80065188300000001,0.80075562899999997,0.80080842099999994,0.80089541149999999,0.80134845899999996,0.80141573999999993,0.80153184,0.801615878,0.80175141599999999,0.80178443599999993,0.80188750200000003,0.80211875600000004,0.80213706500000004,0.80218574799999998,0.80218706299999998,0.80231151300000003,0.80232155299999997,0.80235039499999994,0.80236155399999998,0.802445081,0.80250524749999996,0.80252871999999997,0.80277888749999993,0.80292133499999996,0.80304260150000006,0.80327394499999993,0.80327835300000006,0.80329577799999996,0.803422529,0.80346000149999997,0.80346761099999997,0.80353068400000005,0.80359910300000004,0.80372898999999998,0.803771711,0.80384617550000004,0.80393303599999999,0.804004673,0.80405560549999999,0.80406660050000001,0.80408669649999998,0.80421229900000002,0.80424834899999997,0.80437857599999996,0.80442678649999999,0.804430651,0.8045542,0.80461854599999993,0.80469148899999998,0.80470756199999993,0.80474170850000004,0.80476974700000004,0.80480507300000004,0.80485741200000005,0.805098604,0.80524957699999999,0.80525018599999998,0.80540783199999999,0.80541781449999994,0.80542258700000002,0.80545414549999994,0.80553581349999992,0.80556850749999998,0.80582463000000004,0.80589326350000001,0.80595657649999997,0.80597612399999996,0.80601401799999994,0.80609244599999996,0.80614742500000003,0.8061687125,0.80619259799999998,0.80632948900000001,0.806614002,0.80662189299999998,0.80666415400000002,0.80695777199999996,0.80700352649999996,0.80726631999999998,0.80726761499999999,0.80727899299999994,0.807310097,0.807367159,0.80744780500000002,0.80745064799999999,0.80745124800000001,0.80752097,0.80752928099999999,0.80755263350000006,0.80767767800000001,0.80771029400000005,0.80775065400000001,0.80776839,0.80782100750000008,0.80787538000000003,0.80796917400000001,0.80802678100000003,0.80821641150000001,0.80827389799999994,0.80828168099999997,0.80828539899999996,0.80843602199999998,0.80844263599999999,0.808593915,0.80865562749999997,0.80900869850000001,0.80910353950000002,0.80927894749999996,0.80930585200000005,0.809321654,0.80933876199999999,0.80938896299999996,0.80956163800000003,0.80982727199999993,0.80983602899999996,0.80996321049999997,0.80998332650000004,0.81022638699999994,0.81025874549999999,0.81038525400000005,0.810498037,0.81053281749999995,0.81089476800000004,0.81108881649999998,0.81122272699999998,0.81126168899999995,0.81131751949999997,0.81155191999999998,0.81168446350000001,0.81178209300000004,0.81186413000000002,0.81189029000000001,0.81200134099999999,0.81201428500000006,0.81203942600000001,0.81216529300000007,0.81238717849999997,0.81240450050000002,0.81245432900000003,0.812587061,0.81267106649999998,0.81269086800000001,0.81277492299999998,0.81291254400000001,0.81298164449999999,0.81301781549999996,0.81303586100000003,0.81328235250000003,0.81332668500000005,0.81347389599999997,0.81362648950000005,0.81388175400000007,0.81389440800000001,0.81403492499999996,0.81409112399999994,0.81414888699999999,0.814168326,0.81428531949999994,0.81431381300000005,0.81435566199999998,0.81458574800000005,0.814603772,0.81466477900000001,0.81471781750000005,0.81477767850000005,0.81500437100000001,0.81519465999999996,0.81532797300000004,0.815340171,0.81547317249999995,0.81547323699999996,0.81554772349999993,0.81560888099999995,0.81595147000000001,0.81600191850000003,0.81624162499999997,0.81632066700000006,0.816648665,0.81712347200000002,0.81735657350000002,0.8174826355,0.81788026299999994,0.81797791900000005,0.81823256199999994,0.81825251700000001,0.81830082199999998,0.81847370499999994,0.81854610399999994,0.8186628225,0.81873190549999997,0.81910821449999993,0.81927357199999995,0.81992152299999999,0.81996785500000002,0.82028951900000002,0.82037772399999997,0.82122423700000002,0.82139577200000002,0.82141587100000002,0.82153924200000006,0.82154222900000007,0.82229747500000006,0.82233427599999998,0.8225360115,0.82263072550000005,0.82269477349999998,0.823013051,0.82315563599999997,0.82327591999999994,0.82350925149999998,0.82599062300000003,0.82623574099999997,0.82643632850000004,0.826689071,0.82690508299999999,0.82710524699999999,0.82901712399999994,0.82909328650000003,0.82973086200000001,0.8298553675,0.83050110799999999,0.83055540299999997,0.83118756699999996,0.83236581100000007,0.83286406950000003,0.83311080849999997,0.83474075199999997,0.83653852650000005,0.839224109,0.83982609750000004,0.84100131199999995,0.87100179499999997,0.87236906000000003,0.88213633999999996,0.88857556500000001,0.90540617499999998,0.96754185000000004],"1280":[0.00037277600000000001,0.000372789,0.00037287799999999999,0.00038899600000000001,0.00039008400000000001,0.00039011200000000002,0.00039011599999999998,0.000390128,0.00039013600000000002,0.00039014099999999999,0.000390145,0.00039015099999999999,0.00039015600000000001,0.000390159,0.00039017300000000001,0.00039017400000000002,0.00039017799999999998,0.00039018000000000001,0.00039018199999999999,0.00039018899999999999,0.00039019100000000002,0.00039019199999999998,0.000390193,0.00039019499999999997,0.00039019599999999999,0.00039019599999999999,0.00039019599999999999,0.00039020400000000001,0.00039020800000000002,0.00039020899999999998,0.00039021800000000001,0.00039022299999999998,0.00039022500000000001,0.00039023500000000001,0.000390255,0.00039170200000000001,0.00039175000000000001,0.00039205899999999999,0.00039248100000000003,0.000393557,0.00039372799999999998,0.00039395400000000002,0.00039395499999999998,0.000394631,0.00039515912499999995,0.00039558300000000002,0.00039713150000000001,0.00039751404166666666,0.000398491,0.00039888070833333334,0.00039914300000000002,0.00039925162500000004,0.00039963145833333337,0.00040059041666666665,0.00040089349999999999,0.00040108387499999997,0.00040128860869565217,0.00040174583333333334,0.00040185729166666671,0.00040186587499999998,0.00040191866666666672,0.000401951,0.00040214474999999999,0.00040249499999999995,0.00040287100000000001,0.00040329604545454549,0.00040331945833333333,0.00040342091304347826,0.00040357458333333332,0.00040367991304347822,0.00040371200000000003,0.00040376359090909094,0.00040382900000000003,0.00040384299999999998,0.00040390499999999998,0.00040392720833333333,0.00040411095833333332,0.00040448099999999999,0.00040462274999999997,0.00040463700000000001,0.00040487329166666671,0.00040507899999999998,0.00040532587499999997,0.00040534266666666469,0.00040539487500000003,0.0004054642727272727,0.00040553283333333328,0.00040557009090909092,0.00040567315,0.00040567733333333333,0.00040570599999999998,0.00040571704166666669,0.00040576513043478259,0.00040577204166666664,0.00040580320833333332,0.00040606375,0.00040608625000000003,0.00040635399999999999,0.00040685147826086956,0.00040690470833333337,0.0004070851666666667,0.00040714987500000001,0.000407236,0.00040746395833333332,0.00040780622727272731,0.00040780925,0.00040784162499999998,0.00040799400000000001,0.00040802895454545456,0.00040809891666666875,0.0004082233333333333,0.0004083531739130435,0.00040844049999999999,0.00040864504761904766,0.00040884041666666666,0.00040900974999999998,0.00040902466666666671,0.00040905424999999998,0.00040906299999999998,0.000409119,0.00040911950000000001,0.00040914104166666666,0.00040914599999999999,0.00040915400000000001,0.00040916200000000002,0.00040916599999999998,0.00040916800000000001,0.000409174,0.00040917599999999997,0.00040917699999999999,0.000409178,0.000409178,0.00040918200000000001,0.00040918600000000002,0.00040918600000000002,0.00040918600000000002,0.000409188,0.000409188,0.00040918900000000002,0.00040919099999999999,0.000409195,0.00040919799999999999,0.00040919799999999999,0.000409202,0.00040920300000000002,0.000409205,0.00040920699999999997,0.00040920900000000001,0.00040920900000000001,0.00040920900000000001,0.00040921099999999998,0.000409212,0.00040921600000000001,0.00040922000000000002,0.00040922099999999998,0.00040922199999999999,0.00040922300000000001,0.00040923429166666664,0.00040923700000000001,0.00040923700000000001,0.00040924100000000002,0.00040924400000000001,0.00040924400000000001,0.00040924599999999999,0.00040924700000000001,0.00040924800000000002,0.00040924899999999998,0.00040925,0.00040925299999999999,0.00040925400000000001,0.000409257,0.00040925999999999999,0.00040926299999999999,0.000409264,0.000409267,0.000409274,0.00040927599999999998,0.00040927699999999999,0.00040927900000000002,0.00040927999999999998,0.00040927999999999998,0.00040928299999999998,0.00040928699999999999,0.00040928900000000002,0.00040931000000000002,0.00040931300000000002,0.00040932400000000003,0.00040933000000000001,0.00040934400000000002,0.00040934400000000002,0.000409344125,0.00040934499999999998,0.00040935,0.00040937999999999999,0.000409405,0.000409412,0.00040943670833333334,0.00040946100000000002,0.000409508,0.00040952000000000002,0.000409563,0.00040960299999999997,0.00040971699999999998,0.00040973700000000002,0.00040974099999999998,0.00040981999999999998,0.00040996521739130438,0.00041008872727272725,0.00041067866666666663,0.000410858,0.00041087200000000001,0.000411233,0.00041136233333333334,0.00041176,0.00041200699999999999,0.00041200900000000002,0.00041220699999999999,0.00041284382608695652,0.00041315999999999998,0.00041334436363636365,0.00041344299999999999,0.00041399659090909089,0.00041421068181818175,0.00041423608333333335,0.00041489899999999999,0.00041505122727272722,0.00041530100000000003,0.00041546966666666666,0.00041551617391304347,0.00041567934782608696,0.00041596899999999997,0.00041648299999999999,0.00041717791304347825,0.00041786649999999998,0.00041803590909090908,0.00041907322727272733,0.0004197787391304348,0.00041984882608695655,0.00042067899999999997,0.00042139100000000002,0.00042225722727272727,0.000423039,0.00042415100000000005,0.00042425960869565222,0.00042497722727272732,0.00042546499999999998,0.00042642936363636362,0.00042690243478260868,0.00042867518181818187,0.00043159931818181815,0.00043275845454545455,0.00043373913636363635,0.00043588963636363633,0.0004369057727272727,0.00043725190476190471,0.00043789563636363637,0.00043806281818181816,0.00043923081818181818,0.00043998872727272727,0.00044053509523809528,0.00044147000000000001,0.00044147400000000002,0.000441524,0.00044153200000000001,0.00044153699999999998,0.000441583,0.00044160400000000001,0.00044173500000000001,0.00044186699999999998,0.00044194999999999998,0.00044273899999999999,0.00044286199999999998,0.00044530900000000002,0.00081096550000000003,0.00081400099999999996,0.00081845799999999999,0.00083065899999999998,0.000831762,0.00084530399999999996,0.00092032500000000005,0.00093658299999999995],"48":[6.3955999999999994e-07,6.4626000000000002e-07,6.5118999999999994e-07,6.5176000000000001e-07,6.5237000000000001e-07,6.525e-07,6.5258000000000009e-07,6.6430000000000004e-07,6.6459999999999996e-07,6.6528999999999994e-07,6.6625000000000008e-07,6.6825000000000002e-07,6.6847999999999991e-07,6.6894000000000001e-07,6.6964999999999991e-07,6.6998999999999998e-07,6.7063999999999992e-07,6.7141e-07,6.7174000000000001e-07,6.7218999999999993e-07,6.7240000000000001e-07,6.7276999999999996e-07,6.7281e-07,6.7349999999999999e-07,6.7490000000000009e-07,6.7586000000000002e-07,6.7647000000000002e-07,6.7699000000000008e-07,6.7914000000000003e-07,6.7929000000000004e-07,6.8017999999999994e-07,6.8108000000000001e-07,6.8181000000000004e-07,6.8227999999999999e-07,6.8403000000000002e-07,6.8417000000000007e-07,6.8471000000000005e-07,6.849e-07,6.8500000000000001e-07,6.8510999999999997e-07,6.8511999999999993e-07,6.8514000000000006e-07,6.8522000000000004e-07,6.8607e-07,6.8626000000000006e-07,6.8633999999999994e-07,6.8652000000000004e-07,6.8722999999999994e-07,6.8747e-07,6.8781000000000007e-07,6.87972972972973e-07,6.8940999999999998e-07,6.8949999999999992e-07,6.9003000000000005e-07,6.9017999999999995e-07,6.9073999999999995e-07,6.9079999999999991e-07,6.9100999999999999e-07,6.9115000000000004e-07,6.9129999999999995e-07,6.9182000000000001e-07,6.9258999999999998e-07,6.9313999999999992e-07,6.9335e-07,6.9365000000000002e-07,6.9369000000000007e-07,6.9419999999999996e-07,6.9452999999999996e-07,6.9497999999999999e-07,6.9503e-07,6.9536000000000011e-07,6.9601000000000005e-07,6.9605999999999995e-07,6.9612999999999997e-07,6.9630000000000001e-07,6.9636999999999993e-07,6.9658000000000001e-07,6.9664000000000008e-07,6.9675000000000004e-07,6.9701000000000002e-07,6.9717999999999995e-07,6.976499999999999e-07,6.9823000000000003e-07,6.9846999999999998e-07,6.9877999999999996e-07,6.9882999999999997e-07,6.9901999999999992e-07,6.9930000000000002e-07,6.9933999999999996e-07,6.9940999999999999e-07,7.0092999999999991e-07,7.0116000000000001e-07,7.0117999999999993e-07,7.0153000000000006e-07,7.0182999999999998e-07,7.0227000000000005e-07,7.0238000000000002e-07,7.0290000000000008e-07,7.0314999999999989e-07,7.0315999999999995e-07,7.0342000000000003e-07,7.0342000000000003e-07,7.0359999999999992e-07,7.0396999999999997e-07,7.0398000000000003e-07,7.0404e-07,7.0422999999999995e-07,7.0426999999999999e-07,7.0434000000000002e-07,7.0434999999999998e-07,7.0462000000000002e-07,7.0463999999999994e-07,7.0485000000000002e-07,7.0487000000000004e-07,7.0487000000000004e-07,7.0490999999999998e-07,7.0579000000000002e-07,7.0606999999999992e-07,7.0625999999999997e-07,7.0643999999999997e-07,7.0648000000000001e-07,7.0654999999999993e-07,7.0721000000000004e-07,7.0735999999999995e-07,7.0750999999999996e-07,7.0765000000000001e-07,7.0847999999999995e-07,7.0882000000000002e-07,7.0910999999999998e-07,7.0955000000000005e-07,7.0970000000000006e-07,7.1022000000000002e-07,7.1060000000000002e-07,7.1083000000000002e-07,7.1146000000000005e-07,7.1155999999999995e-07,7.1211000000000009e-07,7.1260000000000007e-07,7.1303000000000008e-07,7.1320000000000001e-07,7.1327000000000003e-07,7.1358000000000001e-07,7.1361999999999995e-07,7.1364000000000008e-07,7.138400000000001e-07,7.140899999999999e-07,7.1435999999999995e-07,7.1438000000000007e-07,7.1453999999999994e-07,7.1528999999999999e-07,7.1557999999999995e-07,7.1570999999999994e-07,7.159e-07,7.1649000000000008e-07,7.1686000000000003e-07,7.1766000000000009e-07,7.1775999999999999e-07,7.1791e-07,7.1798999999999999e-07,7.1804999999999995e-07,7.1807407407407412e-07,7.1915000000000003e-07,7.2032000000000003e-07,7.2044000000000006e-07,7.2048e-07,7.2076999999999996e-07,7.2078999999999998e-07,7.2124000000000002e-07,7.2175000000000001e-07,7.2187000000000004e-07,7.2190000000000003e-07,7.224399999999999e-07,7.2289000000000004e-07,7.2307999999999999e-07,7.2349999999999993e-07,7.2493000000000002e-07,7.2504999999999994e-07,7.2524e-07,7.2526000000000002e-07,7.2564999999999999e-07,7.2636e-07,7.2767000000000006e-07,7.2814000000000001e-07,7.2828000000000006e-07,7.2848000000000008e-07,7.2892000000000004e-07,7.2921e-07,7.2959000000000001e-07,7.2969999999999998e-07,7.2971000000000004e-07,7.2989000000000003e-07,7.2989000000000003e-07,7.2997999999999998e-07,7.3012999999999999e-07,7.3056e-07,7.3104000000000001e-07,7.3114999999999998e-07,7.3149000000000005e-07,7.3152999999999999e-07,7.3165999999999998e-07,7.3180999999999999e-07,7.3201000000000011e-07,7.3245999999999993e-07,7.3398000000000006e-07,7.3473000000000002e-07,7.3522000000000009e-07,7.3565e-07,7.3602000000000005e-07,7.3603999999999997e-07,7.3646999999999998e-07,7.3676000000000004e-07,7.3722999999999999e-07,7.3730999999999998e-07,7.3755999999999999e-07,7.3839999999999999e-07,7.3868999999999995e-07,7.3957999999999996e-07,7.3986999999999991e-07,7.4022000000000005e-07,7.4112000000000001e-07,7.4112999999999997e-07,7.4160999999999998e-07,7.4245999999999994e-07,7.4252999999999997e-07,7.4274000000000005e-07,7.4319000000000008e-07,7.4321e-07,7.4422999999999999e-07,7.4478000000000003e-07,7.4483000000000003e-07,7.4575000000000002e-07,7.4636999999999998e-07,7.472799999999999e-07,7.4827999999999997e-07,7.4842000000000003e-07,7.4876999999999995e-07,7.4896999999999996e-07,7.4969000000000004e-07,7.5000999999999998e-07,7.5084000000000002e-07,7.5282000000000004e-07,7.5289000000000007e-07,7.5424000000000006e-07,7.5619999999999996e-07,7.5859999999999992e-07,7.5964000000000004e-07,7.5976000000000007e-07,7.6044999999999996e-07,7.6133999999999996e-07,7.6160000000000004e-07,7.6275999999999998e-07,7.6313793103448271e-07,7.6461000000000002e-07,7.6493000000000006e-07,7.6508000000000007e-07,7.6662000000000002e-07,7.6849999999999993e-07,7.6872999999999992e-07,7.6944000000000004e-07,7.6973999999999996e-07,7.7181999999999999e-07,7.7193000000000006e-07,7.7249999999999991e-07,7.7499999999999999e-07,7.8464999999999998e-07,7.8617999999999996e-07,7.9028000000000006e-07,8.0589999999999998e-07,8.215000000000001e-07,8.3417000000000001e-07,8.3953000000000005e-07,8.5441999999999994e-07,8.5469000000000009e-07,8.9313000000000006e-07,9.4988000000000009e-07,1.13788e-06,1.14173e-06,1.1640100000000001e-06,1.2513499999999999e-06,1.30006e-06,1.3750599999999999e-06],"56":[9.0263999999999999e-07,9.2065999999999999e-07,9.2404999999999997e-07,9.2457000000000003e-07,9.3164000000000005e-07,9.3636e-07,9.3717999999999998e-07,9.4067999999999992e-07,9.4157000000000003e-07,9.499e-07,9.4999000000000005e-07,9.5514999999999987e-07,9.5865999999999998e-07,9.5877000000000005e-07,9.5916999999999987e-07,9.6035000000000005e-07,9.6128999999999995e-07,9.6163999999999987e-07,9.6229000000000002e-07,9.6229000000000002e-07,9.638199999999999e-07,9.6395999999999996e-07,9.6397999999999987e-07,9.6501999999999999e-07,9.6533999999999993e-07,9.6589999999999993e-07,9.6669999999999999e-07,9.670799999999999e-07,9.6826000000000007e-07,9.6977000000000003e-07,9.6983e-07,9.7033000000000003e-07,9.7037999999999993e-07,9.7040000000000006e-07,9.7072e-07,9.7201000000000003e-07,9.7285999999999999e-07,9.7304285714285716e-07,9.7320999999999991e-07,9.7344999999999997e-07,9.7395000000000001e-07,9.7412000000000004e-07,9.7426999999999995e-07,9.7443999999999998e-07,9.7485000000000008e-07,9.7497999999999985e-07,9.7551999999999994e-07,9.7567999999999991e-07,9.765000000000001e-07,9.7664000000000015e-07,9.7726000000000011e-07,9.7738999999999989e-07,9.7789999999999999e-07,9.7830000000000002e-07,9.7873000000000003e-07,9.7883000000000004e-07,9.7884999999999995e-07,9.7919999999999987e-07,9.7985000000000003e-07,9.8059000000000013e-07,9.8081000000000006e-07,9.8087000000000002e-07,9.8100000000000001e-07,9.8124999999999992e-07,9.8138999999999998e-07,9.8165000000000016e-07,9.8166000000000002e-07,9.8180000000000007e-07,9.8204999999999998e-07,9.8246999999999993e-07,9.8391000000000008e-07,9.8440000000000005e-07,9.8480999999999994e-07,9.8487999999999996e-07,9.8512999999999988e-07,9.8545000000000003e-07,9.8560000000000014e-07,9.8568000000000002e-07,9.8575000000000005e-07,9.8606999999999999e-07,9.8614000000000001e-07,9.8637000000000001e-07,9.8641999999999991e-07,9.8642999999999997e-07,9.8648999999999994e-07,9.8751999999999999e-07,9.8790999999999996e-07,9.8793000000000009e-07,9.8833999999999997e-07,9.8928000000000008e-07,9.8935999999999996e-07,9.8951999999999993e-07,9.9008999999999999e-07,9.9054999999999999e-07,9.905699999999999e-07,9.9086999999999993e-07,9.9092999999999989e-07,9.9153000000000014e-07,9.9253999999999986e-07,9.9261999999999995e-07,9.9320000000000008e-07,9.9422000000000007e-07,9.9422000000000007e-07,9.9426999999999997e-07,9.9431000000000001e-07,9.9435000000000006e-07,9.9439999999999996e-07,9.9442000000000009e-07,9.9452999999999995e-07,9.9458000000000006e-07,9.9512999999999999e-07,9.9547000000000006e-07,9.9548999999999998e-07,9.9570000000000006e-07,9.9613999999999992e-07,9.9648999999999984e-07,9.9734000000000001e-07,9.9734000000000001e-07,9.9757142857142865e-07,9.9873000000000005e-07,9.9880999999999993e-07,9.9907000000000012e-07,9.9909000000000003e-07,9.9916999999999991e-07,9.9919000000000004e-07,9.9957000000000016e-07,9.9962000000000005e-07,1.0003e-06,1.0005199999999999e-06,1.00067e-06,1.0008100000000001e-06,1.0014999999999999e-06,1.0017099999999999e-06,1.00191e-06,1.00192e-06,1.0025900000000001e-06,1.00271e-06,1.00343e-06,1.0035499999999999e-06,1.00366e-06,1.0036799999999999e-06,1.00452e-06,1.00504e-06,1.00504e-06,1.0055500000000001e-06,1.00557e-06,1.0058500000000001e-06,1.0062899999999999e-06,1.00784e-06,1.0083200000000001e-06,1.0084600000000001e-06,1.0088200000000001e-06,1.0094699999999998e-06,1.0097e-06,1.0098000000000001e-06,1.0098399999999999e-06,1.01012e-06,1.0107900000000001e-06,1.0111200000000001e-06,1.0117599999999999e-06,1.0128000000000001e-06,1.0131428571428572e-06,1.01321e-06,1.01335e-06,1.0134999999999999e-06,1.01358e-06,1.01408e-06,1.0143599999999999e-06,1.01678e-06,1.01846e-06,1.01878e-06,1.01961e-06,1.01994e-06,1.0201599999999999e-06,1.02092e-06,1.0211799999999999e-06,1.0213300000000001e-06,1.0215000000000001e-06,1.0233e-06,1.02399e-06,1.02449e-06,1.0245400000000001e-06,1.0254285714285713e-06,1.0256199999999999e-06,1.02564e-06,1.0258899999999999e-06,1.02715e-06,1.0278200000000001e-06,1.02785e-06,1.0284900000000001e-06,1.02863e-06,1.02867e-06,1.02976e-06,1.03143e-06,1.0315499999999999e-06,1.03203e-06,1.0323999999999998e-06,1.03305e-06,1.0332600000000001e-06,1.03328e-06,1.0340299999999999e-06,1.03413e-06,1.03443e-06,1.0345e-06,1.03535e-06,1.03624e-06,1.03628e-06,1.0368800000000001e-06,1.0382083333333332e-06,1.0387300000000001e-06,1.0396e-06,1.03973e-06,1.04023e-06,1.04161e-06,1.0432631578947369e-06,1.0440399999999999e-06,1.0447599999999999e-06,1.0455199999999999e-06,1.0461400000000001e-06,1.0461499999999999e-06,1.04632e-06,1.0471300000000001e-06,1.0476200000000001e-06,1.0505999999999999e-06,1.05107e-06,1.0520700000000001e-06,1.05383e-06,1.05453e-06,1.0600400000000001e-06,1.06055e-06,1.0609099999999999e-06,1.0625800000000001e-06,1.06289e-06,1.0656400000000001e-06,1.06589e-06,1.06688e-06,1.06866e-06,1.0695400000000001e-06,1.06998e-06,1.07403e-06,1.07436e-06,1.07788e-06,1.08049e-06,1.08105e-06,1.08111e-06,1.0819899999999999e-06,1.0838275862068965e-06,1.0858799999999999e-06,1.0862641509433961e-06,1.08701e-06,1.08705e-06,1.0872299999999999e-06,1.0886400000000001e-06,1.08994e-06,1.0928599999999999e-06,1.09699e-06,1.10322e-06,1.10734e-06,1.1073800000000001e-06,1.1077899999999999e-06,1.1094299999999999e-06,1.10967e-06,1.11389e-06,1.1174300000000001e-06,1.1223800000000001e-06,1.1255700000000001e-06,1.1313300000000001e-06,1.1334099999999999e-06,1.13866e-06,1.1469e-06,1.15507e-06,1.16742e-06,1.1908399999999999e-06,1.2287899999999999e-06,1.55785e-06,1.56993e-06,1.59395e-06,1.6216666666666667e-06,1.6236e-06,1.6697000000000001e-06,1.8059400000000002e-06],"64":[1.2392300000000001e-06,1.23964e-06,1.2431500000000001e-06,1.2435100000000001e-06,1.2439100000000001e-06,1.2453500000000001e-06,1.25206e-06,1.2542799999999999e-06,1.2545800000000001e-06,1.2549999999999998e-06,1.2564499999999998e-06,1.2574099999999999e-06,1.2583000000000001e-06,1.2596666666666668e-06,1.2624899999999999e-06,1.2631250000000001e-06,1.2632982456140353e-06,1.26372e-06,1.2640300000000001e-06,1.2642900000000001e-06,1.26646e-06,1.2678500000000001e-06,1.2687100000000001e-06,1.26886e-06,1.26912e-06,1.2697199999999998e-06,1.27035e-06,1.27255e-06,1.2754399999999999e-06,1.2762900000000001e-06,1.2765899999999999e-06,1.2771799999999999e-06,1.2784299999999999e-06,1.2785699999999999e-06,1.2788299999999999e-06,1.2792200000000001e-06,1.2794600000000002e-06,1.2797e-06,1.28009e-06,1.2803200000000002e-06,1.2803700000000001e-06,1.2809099999999999e-06,1.28188e-06,1.2845900000000001e-06,1.2849000000000002e-06,1.28494e-06,1.2851799999999999e-06,1.2855099999999999e-06,1.28636e-06,1.28661e-06,1.2868399999999999e-06,1.2868600000000001e-06,1.2885800000000001e-06,1.2892000000000001e-06,1.28945e-06,1.2899999999999999e-06,1.2903400000000002e-06,1.2911500000000001e-06,1.29123e-06,1.2924299999999999e-06,1.2924400000000002e-06,1.29298e-06,1.2933899999999999e-06,1.29354e-06,1.29548e-06,1.2957299999999999e-06,1.29584e-06,1.2961029411764706e-06,1.2961500000000001e-06,1.2964699999999998e-06,1.2968499999999999e-06,1.2970399999999999e-06,1.2973333333333333e-06,1.29739e-06,1.29805e-06,1.29877e-06,1.29946e-06,1.2995100000000001e-06,1.2996199999999999e-06,1.3001428571428572e-06,1.3003799999999999e-06,1.3011199999999998e-06,1.3017605633802818e-06,1.3026100000000001e-06,1.3039700000000002e-06,1.3043333333333331e-06,1.3043899999999999e-06,1.30484e-06,1.3048899999999999e-06,1.3050200000000001e-06,1.30507e-06,1.30618e-06,1.3068199999999998e-06,1.30728e-06,1.3084399999999999e-06,1.30892e-06,1.3102200000000001e-06,1.3102299999999999e-06,1.31067e-06,1.3110800000000001e-06,1.31162e-06,1.31222e-06,1.3132700000000002e-06,1.313372549019608e-06,1.3135499999999999e-06,1.3143900000000002e-06,1.31455e-06,1.3145699999999999e-06,1.3154599999999999e-06,1.31564e-06,1.3157500000000001e-06,1.3158800000000001e-06,1.3159e-06,1.31591e-06,1.31636e-06,1.3166e-06,1.3171700000000001e-06,1.31745e-06,1.31761e-06,1.32028e-06,1.3204499999999998e-06,1.32085e-06,1.3212299999999999e-06,1.32206e-06,1.3225100000000001e-06,1.32259e-06,1.3231500000000002e-06,1.32328e-06,1.32335e-06,1.3236000000000001e-06,1.32408e-06,1.3248399999999998e-06,1.3251499999999999e-06,1.3256699999999999e-06,1.3261399999999999e-06,1.3261699999999999e-06,1.3264299999999999e-06,1.3264999999999999e-06,1.3273978494623656e-06,1.3279500000000001e-06,1.3290526315789474e-06,1.32918e-06,1.33201e-06,1.3325599999999999e-06,1.3325599999999999e-06,1.3328200000000001e-06,1.3354600000000001e-06,1.3358799999999999e-06,1.33594e-06,1.33623e-06,1.33636e-06,1.33662e-06,1.3372300000000001e-06,1.3374599999999999e-06,1.3375699999999999e-06,1.33827e-06,1.33831e-06,1.3394099999999999e-06,1.3394399999999999e-06,1.3409199999999999e-06,1.3413600000000001e-06,1.3417600000000002e-06,1.3422e-06,1.3430399999999999e-06,1.34335e-06,1.34371e-06,1.3437999999999999e-06,1.3443200000000001e-06,1.34552e-06,1.34559e-06,1.3458000000000001e-06,1.34661e-06,1.3466500000000001e-06,1.3467599999999999e-06,1.34707e-06,1.3470800000000001e-06,1.3474400000000001e-06,1.34849e-06,1.3509199999999998e-06,1.3514000000000001e-06,1.3532799999999999e-06,1.3533199999999999e-06,1.36008e-06,1.3617300000000002e-06,1.36272e-06,1.36325e-06,1.36436e-06,1.3643999999999998e-06,1.36456e-06,1.36486e-06,1.3653800000000002e-06,1.36618e-06,1.3674499999999999e-06,1.3686199999999998e-06,1.36997e-06,1.3726600000000002e-06,1.3747299999999999e-06,1.3804500000000001e-06,1.3815499999999999e-06,1.3827600000000001e-06,1.3827699999999999e-06,1.3843100000000001e-06,1.3845e-06,1.3845700000000001e-06,1.3857900000000001e-06,1.38772e-06,1.3881399999999999e-06,1.3902799999999999e-06,1.3915299999999999e-06,1.3922899999999999e-06,1.3926100000000001e-06,1.3930799999999999e-06,1.39316e-06,1.3962299999999998e-06,1.3980899999999999e-06,1.39886e-06,1.4009999999999998e-06,1.4025699999999999e-06,1.40818e-06,1.4082100000000002e-06,1.4091200000000001e-06,1.40999e-06,1.4101000000000001e-06,1.4111300000000001e-06,1.4126699999999999e-06,1.41316e-06,1.41786e-06,1.4184799999999999e-06,1.41865e-06,1.4187400000000001e-06,1.4215300000000001e-06,1.4220699999999999e-06,1.4222700000000001e-06,1.4264e-06,1.42706e-06,1.42861e-06,1.42979e-06,1.4312099999999998e-06,1.4339499999999998e-06,1.4343799999999999e-06,1.43678e-06,1.43714e-06,1.4381100000000001e-06,1.43931e-06,1.4394599999999999e-06,1.4421000000000001e-06,1.4432e-06,1.4434594594594595e-06,1.4445500000000002e-06,1.4490499999999999e-06,1.4496800000000002e-06,1.4511200000000001e-06,1.4521099999999999e-06,1.4528399999999999e-06,1.45568e-06,1.45812e-06,1.45921e-06,1.45938e-06,1.4768899999999999e-06,1.4814900000000001e-06,1.4827800000000001e-06,1.4919000000000001e-06,1.4986000000000001e-06,1.5313999999999999e-06,1.53156e-06,1.54296e-06,1.54931e-06,1.5505900000000002e-06,1.5713700000000001e-06,1.5754500000000001e-06,1.5783799999999999e-06,1.5840499999999999e-06,1.5908700000000001e-06,1.5975000000000002e-06,1.9393499999999999e-06,2.0080000000000001e-06,2.02521e-06,2.11136e-06,2.15923e-06,2.21985e-06,2.25081e-06],"20480":[0.099954747499999996,0.100163101,0.100639409,0.10069499699999999,0.100907842,0.10102293699999999,0.101039084,0.1010444735,0.10124148600000001,0.10128197100000003,0.101317032,0.1013443445,0.101379146,0.101411693,0.10141474699999997,0.101468932,0.10147320900000001,0.10147384149999999,0.10148130099999997,0.101495218,0.101501889,0.1015020735,0.10151858499999999,0.101519452,0.1015445005,0.10154835500000001,0.1015728,0.10160841399999999,0.10162770600000004,0.10164468399999999,0.1016628915,0.101691064,0.101708808,0.101718028,0.1017225605,0.101729402,0.10173028100000001,0.1017606945,0.101766655,0.10183202249999999,0.101854166,0.1018565585,0.10186046100000001,0.10186437299999999,0.101874219,0.101890919,0.10189772699999999,0.101898934,0.101927314,0.101931536,0.10193690850000001,0.101976386,0.10198021299999999,0.101981288,0.101998405,0.10202185599999999,0.10204671799999999,0.1020530175,0.102057673,0.102079107,0.10208165,0.10208434,0.10210756949999999,0.102113729,0.10212521900000004,0.10214016200000001,0.102148513,0.102149134,0.10217107850000001,0.10217251199999999,0.102174849,0.10218033,0.102184093,0.102188132,0.1021916435,0.102198334,0.102201765,0.10221159099999999,0.102218973,0.10222364,0.10223844250000003,0.10225261500000001,0.1022789585,0.102281205,0.102288613,0.102292439,0.10229273500000002,0.1023227635,0.102323237,0.10233672050000001,0.102354842,0.10237178199999999,0.1023847765,0.1023914095,0.102397476,0.10240010200000005,0.102413937,0.10241473,0.10241700500000001,0.102423678,0.10243506899999999,0.102440874,0.1024489675,0.102466183,0.10247711249999999,0.102490841,0.102493892,0.102512914,0.10251578150000001,0.10251645650000001,0.10253243300000001,0.102536616,0.102550452,0.10255999,0.10256203749999999,0.1025892885,0.102608766,0.102641892,0.102650616,0.10265208150000001,0.102655201,0.1026748435,0.102680413,0.10268759700000001,0.102693385,0.10272061,0.10278873400000001,0.102820698,0.1028261785,0.1028353425,0.10284096049999999,0.102882539,0.102895545,0.10292253150000003,0.102927984,0.10295805399999999,0.102975344,0.1029805565,0.103031023,0.10303385499999999,0.103034152,0.103050537,0.10308329250000001,0.103089342,0.10310148,0.1031029475,0.103104976,0.10311669399999999,0.10312287050000001,0.103129184,0.10315644300000004,0.10316765100000003,0.10317520299999999,0.103180749,0.10318496200000001,0.103188062,0.103231475,0.1032874755,0.103303958,0.103309471,0.10332398499999999,0.10332580700000001,0.10332867699999999,0.103367348,0.1033714365,0.10337415900000002,0.103381509,0.1033829595,0.10338562750000002,0.103398532,0.103415638,0.103419753,0.1034607095,0.1035050525,0.1035083945,0.10352148899999999,0.10354847150000002,0.103563488,0.10357385700000001,0.103576586,0.10359610449999999,0.103626062,0.103659716,0.1036758035,0.10373007150000001,0.103757162,0.10375812449999999,0.10375941049999998,0.10378059100000001,0.10379654100000001,0.1038035185,0.103858899,0.103864521,0.1038682665,0.10390744800000001,0.103915969,0.10394942,0.103955355,0.1039757135,0.103980642,0.1039858555,0.103988491,0.10402494349999999,0.10403145699999999,0.104051774,0.104073205,0.1040753895,0.1041123015,0.10411379900000001,0.104116851,0.104131907,0.104145059,0.1041792055,0.104254123,0.104267017,0.104309815,0.104315835,0.104333592,0.10433437499999999,0.104343942,0.104359858,0.10437302800000001,0.10438510350000001,0.104509981,0.104520842,0.104569051,0.1045852375,0.104586217,0.104602423,0.1046062215,0.10460702,0.104625252,0.1046416205,0.10466308749999997,0.104696939,0.10470710749999999,0.104730158,0.10479820300000001,0.10481062150000001,0.104832094,0.1048412365,0.104886325,0.10488768850000001,0.10493301249999998,0.1049468945,0.104969995,0.10497948999999999,0.10498033,0.10499399399999999,0.1050045605,0.1050114015,0.1050140005,0.10549397199999999,0.1055591915,0.10569574900000001,0.105700351,0.10571894599999999,0.105848227,0.1058566635,0.10599130499999999,0.106003765,0.106139304,0.106278383,0.10653847599999999,0.1069976985,0.10716967350000001,0.107759961,0.1098956665,0.11060737399999999,0.110919875,0.1117810535,0.1122139655,0.119167919,0.155395958,0.238813473,0.24798218499999999,0.258533505,0.269402107,0.27735028249999999,0.30109185999999999,0.30786158549999998],"80":[1.8541299999999999e-06,1.8691399999999999e-06,1.8760599999999999e-06,1.8845283018867924e-06,1.8884699999999998e-06,1.89094e-06,1.89147e-06,1.8939799999999999e-06,1.8941100000000001e-06,1.89439e-06,1.8954000000000001e-06,1.8954700000000001e-06,1.8972300000000002e-06,1.8972499999999999e-06,1.89756e-06,1.89818e-06,1.89838e-06,1.8994e-06,1.90029e-06,1.90092e-06,1.9029400000000001e-06,1.9033700000000001e-06,1.9045499999999998e-06,1.9055e-06,1.9056699999999998e-06,1.90623e-06,1.90741e-06,1.90916e-06,1.9091999999999999e-06,1.9099500000000002e-06,1.9103900000000001e-06,1.9109300000000002e-06,1.91149e-06,1.9119700000000001e-06,1.9128499999999998e-06,1.9131428571428575e-06,1.9143500000000001e-06,1.9144100000000001e-06,1.91442e-06,1.9148900000000002e-06,1.9160699999999998e-06,1.91608e-06,1.9171400000000001e-06,1.9172399999999999e-06,1.91864e-06,1.9191e-06,1.92002e-06,1.9206400000000001e-06,1.9207800000000002e-06,1.9225599999999998e-06,1.9225899999999997e-06,1.92283e-06,1.9229300000000002e-06,1.9232200000000002e-06,1.9232799999999997e-06,1.92369e-06,1.92461e-06,1.9246300000000002e-06,1.9247200000000001e-06,1.9249500000000001e-06,1.9251399999999998e-06,1.92579e-06,1.9268099999999998e-06,1.92711e-06,1.92846e-06,1.9286699999999999e-06,1.9293700000000001e-06,1.9294000000000001e-06,1.9297899999999999e-06,1.9306299999999998e-06,1.9318400000000001e-06,1.9321799999999998e-06,1.9323600000000001e-06,1.9334399999999998e-06,1.9347400000000001e-06,1.9348300000000001e-06,1.9353099999999998e-06,1.9369e-06,1.93725e-06,1.9379900000000001e-06,1.9382700000000002e-06,1.9389199999999999e-06,1.9393300000000002e-06,1.94204e-06,1.94227e-06,1.9424100000000001e-06,1.9425200000000002e-06,1.9428600000000002e-06,1.9436299999999999e-06,1.94428e-06,1.9447199999999999e-06,1.9448999999999998e-06,1.9450399999999998e-06,1.9458000000000001e-06,1.9459400000000001e-06,1.9460500000000002e-06,1.9465400000000002e-06,1.9466000000000001e-06,1.9470499999999998e-06,1.9484600000000002e-06,1.9487199999999998e-06,1.9487999999999999e-06,1.94951e-06,1.9495800000000002e-06,1.95011e-06,1.9504800000000001e-06,1.9510999999999998e-06,1.9518399999999999e-06,1.95267e-06,1.95356e-06,1.9545200000000002e-06,1.9545999999999999e-06,1.9546700000000001e-06,1.9551999999999999e-06,1.9561499999999999e-06,1.9563600000000002e-06,1.9576999999999999e-06,1.9596700000000001e-06,1.9603699999999999e-06,1.9605000000000001e-06,1.962e-06,1.9621600000000002e-06,1.96387e-06,1.9641899999999999e-06,1.9652700000000001e-06,1.9661499999999998e-06,1.96697e-06,1.9677199999999999e-06,1.9679499999999999e-06,1.9682200000000002e-06,1.9685899999999998e-06,1.9703e-06,1.97191e-06,1.9722299999999999e-06,1.9723000000000002e-06,1.9742000000000001e-06,1.9744699999999999e-06,1.9750599999999997e-06,1.9751299999999999e-06,1.97702e-06,1.9780899999999999e-06,1.9795599999999998e-06,1.98193e-06,1.98411e-06,1.9846e-06,1.9846399999999999e-06,1.9850799999999997e-06,1.9857599999999999e-06,1.9874799999999999e-06,1.98963e-06,1.9896599999999999e-06,1.9901499999999999e-06,1.9915599999999999e-06,1.9922300000000002e-06,1.9925200000000001e-06,1.9939300000000001e-06,1.9943000000000001e-06,1.9943300000000001e-06,1.99445e-06,1.9955900000000001e-06,1.99583e-06,1.9969100000000002e-06,1.9982499999999999e-06,2.0027299999999999e-06,2.0032900000000001e-06,2.0035200000000001e-06,2.0035899999999999e-06,2.0045499999999997e-06,2.0075799999999999e-06,2.0087999999999997e-06,2.00884e-06,2.0091700000000002e-06,2.0158599999999998e-06,2.0181800000000003e-06,2.0256153846153847e-06,2.02587e-06,2.02621e-06,2.0270100000000001e-06,2.02848e-06,2.0291511627906977e-06,2.0295299999999998e-06,2.0373999999999998e-06,2.0374799999999998e-06,2.0377428571428571e-06,2.0389500000000002e-06,2.0394099999999998e-06,2.0449800000000002e-06,2.0450599999999999e-06,2.0460899999999999e-06,2.0474800000000002e-06,2.0475599999999998e-06,2.0489899999999999e-06,2.0501199999999998e-06,2.05249e-06,2.0532099999999999e-06,2.05407e-06,2.0588399999999999e-06,2.0592799999999998e-06,2.0730299999999999e-06,2.0734299999999999e-06,2.0744e-06,2.07555e-06,2.0766199999999999e-06,2.0798599999999999e-06,2.0815899999999998e-06,2.0852200000000001e-06,2.0852500000000001e-06,2.0856e-06,2.0907799999999998e-06,2.0930999999999999e-06,2.0982300000000001e-06,2.1030699999999998e-06,2.1034999999999999e-06,2.1110100000000001e-06,2.1118888888888886e-06,2.1131999999999999e-06,2.1140500000000001e-06,2.1156500000000002e-06,2.1174499999999999e-06,2.1190899999999999e-06,2.1216599999999997e-06,2.12557e-06,2.12761e-06,2.1277e-06,2.1289000000000001e-06,2.1301199999999999e-06,2.1322000000000001e-06,2.1344899999999998e-06,2.1356700000000002e-06,2.13755e-06,2.1387099999999998e-06,2.1392600000000002e-06,2.1404099999999997e-06,2.1406600000000003e-06,2.1444900000000001e-06,2.1453999999999998e-06,2.1478899999999999e-06,2.1508100000000001e-06,2.1516100000000001e-06,2.1529600000000001e-06,2.1567799999999997e-06,2.1568799999999999e-06,2.1572299999999998e-06,2.1623e-06,2.1637900000000001e-06,2.1698999999999998e-06,2.2222099999999999e-06,2.2298199999999999e-06,2.2361818181818184e-06,2.2442e-06,2.24725e-06,2.2517899999999999e-06,2.2542100000000002e-06,2.2582400000000001e-06,2.2583699999999999e-06,2.2621100000000002e-06,2.2764200000000001e-06,2.2797599999999999e-06,2.2817900000000001e-06,2.2847100000000002e-06,2.2889600000000002e-06,2.2925800000000002e-06,2.2957400000000001e-06,2.2987199999999998e-06,2.30135e-06,2.3017700000000002e-06,2.30333e-06,2.31192e-06,2.3147959183673472e-06,2.3264700000000001e-06,2.3278200000000001e-06,2.3338899999999999e-06,2.3478299999999998e-06,2.3774100000000002e-06,3.2592000000000001e-06,3.3041800000000004e-06,3.3889100000000001e-06,3.4082600000000002e-06,3.411e-06,3.4209699999999995e-06,3.5018700000000003e-06],"1":[3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.65e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6600000000000002e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6699999999999999e-09,3.6800000000000001e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8200000000000005e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.8299999999999994e-09,3.84e-09,3.8599999999999995e-09,3.9999999999999994e-09,3.9999999999999994e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.01e-09,4.0200000000000006e-09,4.0200000000000006e-09,4.1000000000000003e-09,4.32e-09,4.32e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3599999999999998e-09,4.3599999999999998e-09,5.4800000000000001e-09,5.4899999999999999e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.52e-09,5.5700000000000004e-09,5.6300000000000006e-09],"2":[3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.8900000000000004e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9000000000000002e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9099999999999999e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9200000000000005e-09,3.9299999999999995e-09,3.9299999999999995e-09,3.94e-09,3.94e-09,3.94e-09,3.94e-09,3.9700000000000001e-09,3.9799999999999999e-09,3.9900000000000005e-09,3.9900000000000005e-09,4.0200000000000006e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.08e-09,4.0900000000000006e-09,4.0900000000000006e-09,4.0900000000000006e-09,4.0900000000000006e-09,4.0900000000000006e-09,4.0900000000000006e-09,4.1000000000000003e-09,4.1000000000000003e-09,4.1000000000000003e-09,4.1100000000000001e-09,4.1100000000000001e-09,4.1100000000000001e-09,4.1100000000000001e-09,4.1199999999999998e-09,4.1499999999999999e-09,4.2700000000000004e-09,4.2700000000000004e-09,4.2800000000000001e-09,4.2800000000000001e-09,4.2800000000000001e-09,4.2800000000000001e-09,4.2800000000000001e-09,4.2899999999999999e-09,4.2899999999999999e-09,4.3000000000000005e-09,4.32e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3300000000000006e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3400000000000003e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3500000000000001e-09,4.3599999999999998e-09,4.3599999999999998e-09,4.4500000000000001e-09,4.4500000000000001e-09,4.4599999999999999e-09,4.4700000000000005e-09,4.49e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5299999999999999e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5400000000000005e-09,4.5500000000000002e-09,4.5500000000000002e-09,4.5500000000000002e-09,4.6100000000000004e-09,4.66e-09,4.7500000000000003e-09,4.7500000000000003e-09,4.7500000000000003e-09,4.7500000000000003e-09,4.7500000000000003e-09,4.7500000000000003e-09,4.7600000000000001e-09,4.7600000000000001e-09,4.9e-09,4.9399999999999999e-09,5.0100000000000007e-09,5.1200000000000005e-09,5.1200000000000005e-09,5.1300000000000003e-09,5.1300000000000003e-09,6.1e-09,6.2300000000000002e-09,6.2500000000000005e-09,6.34e-09,6.5100000000000001e-09,6.9900000000000001e-09,7.4499999999999997e-09],"768":[0.00013609933333333333,0.00013611100000000001,0.000136112,0.00013611299999999999,0.000136119,0.000136126,0.000136131,0.00013613199999999999,0.00013615599999999999,0.00013662816666666668,0.00013818833333333332,0.00013949218181818181,0.00013960137500000001,0.00014022354545454544,0.0001406805,0.00014092280000000001,0.0001419615,0.00014201424999999999,0.00014218166666666668,0.00014242599999999999,0.00014242700000000001,0.00014243200000000001,0.00014243725000000001,0.00014244,0.00014244050000000001,0.00014244099999999999,0.00014244299999999999,0.000142449,0.00014245149999999999,0.00014245300000000001,0.00014245499999999999,0.00014245533333333334,0.00014245600000000001,0.00014245699999999999,0.000142459,0.00014246199999999999,0.00014246699999999999,0.00014246800000000001,0.000142473,0.000142473,0.00014247500000000001,0.00014248099999999999,0.00014249,0.00014249999999999999,0.000142502,0.00014250299999999999,0.000142507,0.000142511,0.000142516,0.00014251800000000001,0.00014252500000000001,0.00014252500000000001,0.000142528,0.00014254900000000001,0.00014256199999999999,0.00014256499999999999,0.000142583,0.00014259949999999999,0.0001426,0.000142733,0.00014284883333333333,0.00014338,0.00014368933333333333,0.00014397522727272729,0.000144067,0.00014413688888888888,0.000144652,0.000144683,0.00014526473015873015,0.00014530783333333334,0.00014571825000000001,0.00014604639393939395,0.00014629561904761905,0.00014632351515151513,0.00014637912698412699,0.00014658337704918033,0.0001465973787878788,0.00014665310344827586,0.00014669193220338982,0.00014679328787878788,0.000146927796875,0.00014721312698412698,0.00014727133333333333,0.00014734587878787879,0.00014738244444444443,0.00014740107812500001,0.00014744609090909091,0.0001475131212121212,0.00014761099999999999,0.00014764775,0.00014769077272727273,0.00014769410606060607,0.00014772355555555555,0.00014778815151515151,0.0001479366212121212,0.00014795633333333332,0.00014810515151515149,0.0001481795,0.00014827290163934426,0.0001483385303030303,0.00014840249999999999,0.00014841046428571428,0.0001484113181818182,0.00014843319696969696,0.00014851875,0.00014861773770491804,0.00014867679365079364,0.0001487235,0.0001487395303030303,0.00014894631147540982,0.00014898009090909091,0.00014908278787878785,0.0001490870303030303,0.00014909316666666665,0.00014910071212121212,0.0001491460909090909,0.00014916756060606061,0.00014921334848484849,0.0001492769696969704,0.00014934536363636364,0.00014934895081967215,0.00014936800000000001,0.00014937233333333334,0.00014937466666666666,0.00014938325000000001,0.000149386,0.000149386,0.00014938699999999998,0.00014939233333333333,0.00014940400000000001,0.00014940600000000001,0.000149417,0.00014941999999999999,0.00014941999999999999,0.00014942422222222223,0.00014942800000000001,0.00014943000000000001,0.000149433,0.00014943399999999999,0.00014943399999999999,0.00014943399999999999,0.00014943500000000001,0.00014943500000000001,0.000149436,0.0001494365,0.000149438,0.00014944200000000001,0.000149445,0.000149448,0.000149448,0.00014945022727272728,0.00014945034782608697,0.00014945299999999999,0.000149457,0.00014945799999999999,0.000149462,0.00014946999999999999,0.00014947100000000001,0.00014947199999999999,0.00014947300000000001,0.000149474,0.000149479,0.000149479,0.00014947925,0.000149481,0.00014949200000000001,0.000149493,0.000149493,0.00014949399999999999,0.00014949599999999999,0.00014949700000000001,0.000149498,0.000149498,0.00014949900000000001,0.00014950099999999999,0.00014950200000000001,0.00014950400000000001,0.00014951,0.00014951,0.00014951,0.00014951,0.00014951100000000001,0.00014951100000000001,0.000149512,0.000149524,0.00014952462121212121,0.00014952499999999999,0.000149526,0.00014952699999999999,0.000149529,0.00014953000000000001,0.00014953000000000001,0.000149534,0.00014953699999999999,0.00014954500000000001,0.00014954599999999999,0.000149553,0.00014955599999999999,0.000149557,0.00014956,0.000149562,0.00014956400000000001,0.000149572,0.000149574,0.00014957499999999999,0.00014959199999999999,0.000149596,0.00014963800000000001,0.000149655,0.00014965876190476191,0.000149691,0.00014969699999999999,0.00014973100000000001,0.00014976767213114754,0.00014978999999999999,0.00014981900000000001,0.00014982385714285714,0.00014982490909090909,0.00014982896874999999,0.000149887,0.00014997866666666666,0.00015002200000000001,0.00015008600000000001,0.00015014116666666664,0.00015068850000000001,0.00015088791666666667,0.000151173,0.00015127200000000001,0.00015162800000000001,0.00015172800000000001,0.00015186900000000001,0.00015195662499999999,0.00015206125,0.0001522494,0.00015237316393442623,0.00015248544262295083,0.00015250772131147542,0.00015277283333333332,0.00015283935384615384,0.00015284360344827586,0.00015286937704918035,0.00015349800000000001,0.00015384443103448278,0.0001540482156862745,0.00015421818965517239,0.00015491637704918032,0.00015520006557377049,0.00015559787096774193,0.00015666626229508197,0.00015680288524590164,0.00015786914516129034,0.00015827454098360657,0.00016088925,0.00016119640000000001,0.00016123400000000001,0.00016123999999999999,0.00016127000000000001,0.000161273,0.00016127399999999999,0.00016127399999999999,0.00016128599999999999,0.00016129,0.000161311,0.00016131399999999999,0.000161325,0.00016133599999999999,0.00016134499999999999,0.00016134718032786885,0.000161366,0.00016146500000000001,0.00016194548214285717,0.00016254400000000001,0.000162969,0.000276803,0.000279034,0.00027950799999999998,0.00028126600000000001,0.00028684150000000004,0.00029741799999999998,0.00031226099999999998,0.00033217400000000002],"3":[5.2300000000000003e-09,5.2300000000000003e-09,5.2400000000000001e-09,5.2400000000000001e-09,5.2400000000000001e-09,5.2400000000000001e-09,5.2400000000000001e-09,5.2499999999999999e-09,5.2499999999999999e-09,5.2499999999999999e-09,5.2600000000000004e-09,5.2600000000000004e-09,5.2900000000000006e-09,5.3600000000000005e-09,5.3700000000000003e-09,5.3900000000000006e-09,5.4100000000000001e-09,5.4100000000000001e-09,5.4300000000000005e-09,5.45e-09,5.45e-09,5.4600000000000006e-09,5.4600000000000006e-09,5.4600000000000006e-09,5.4600000000000006e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4700000000000003e-09,5.4800000000000001e-09,5.4800000000000001e-09,5.4800000000000001e-09,5.4800000000000001e-09,5.4800000000000001e-09,5.4800000000000001e-09,5.4899999999999999e-09,5.4899999999999999e-09,5.4899999999999999e-09,5.4899999999999999e-09,5.4899999999999999e-09,5.5000000000000004e-09,5.5000000000000004e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.5100000000000002e-09,5.52e-09,5.52e-09,5.5500000000000001e-09,5.5500000000000001e-09,5.5700000000000004e-09,5.5800000000000002e-09,5.5800000000000002e-09,5.5800000000000002e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.5899999999999999e-09,5.6000000000000005e-09,5.6400000000000004e-09,5.6500000000000001e-09,5.6500000000000001e-09,5.6599999999999999e-09,5.6599999999999999e-09,5.6599999999999999e-09,5.6599999999999999e-09,5.6599999999999999e-09,5.6599999999999999e-09,5.6700000000000005e-09,5.6800000000000002e-09,5.6800000000000002e-09,5.69e-09,5.69e-09,5.69e-09,5.69e-09,5.7100000000000003e-09,5.7100000000000003e-09,5.7400000000000004e-09,5.7400000000000004e-09,5.7400000000000004e-09,5.76e-09,5.76e-09,5.7800000000000003e-09,5.7800000000000003e-09,5.7800000000000003e-09,5.7900000000000001e-09,5.7900000000000001e-09,5.7999999999999998e-09,5.7999999999999998e-09,5.7999999999999998e-09,5.7999999999999998e-09,5.8100000000000004e-09,5.8200000000000002e-09,5.8200000000000002e-09,5.8200000000000002e-09,5.8400000000000005e-09,5.8400000000000005e-09,5.8500000000000003e-09,5.8500000000000003e-09,5.8500000000000003e-09,5.8500000000000003e-09,5.86e-09,5.86e-09,5.8699999999999998e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8800000000000004e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8900000000000001e-09,5.8999999999999999e-09,5.8999999999999999e-09,5.8999999999999999e-09,5.8999999999999999e-09,5.8999999999999999e-09,5.9100000000000005e-09,5.9100000000000005e-09,5.9100000000000005e-09,5.9100000000000005e-09,5.9100000000000005e-09,5.9200000000000002e-09,5.9200000000000002e-09,5.9200000000000002e-09,5.9200000000000002e-09,5.9200000000000002e-09,5.93e-09,5.93e-09,5.9400000000000006e-09,5.9500000000000003e-09,5.9500000000000003e-09,5.9600000000000001e-09,5.9900000000000002e-09,6e-09,6e-09,6.0100000000000005e-09,6.0200000000000003e-09,6.0300000000000001e-09,6.0399999999999998e-09,6.0500000000000004e-09,6.0600000000000002e-09,6.1e-09,6.1e-09,6.1e-09,6.1e-09,6.1e-09,6.1e-09,6.1099999999999998e-09,6.1099999999999998e-09,6.1200000000000004e-09,6.1300000000000001e-09,6.1300000000000001e-09,6.1500000000000005e-09,6.1500000000000005e-09,6.1600000000000002e-09,6.1600000000000002e-09,6.1600000000000002e-09,6.1600000000000002e-09,6.1600000000000002e-09,6.1600000000000002e-09,6.17e-09,6.17e-09,6.17e-09,6.17e-09,6.17e-09,6.1799999999999998e-09,6.1799999999999998e-09,6.1799999999999998e-09,6.1900000000000003e-09,6.1900000000000003e-09,6.2200000000000004e-09,6.2200000000000004e-09,6.24e-09,6.2799999999999998e-09,6.2900000000000004e-09,6.3099999999999999e-09,6.3600000000000004e-09,6.3700000000000001e-09,6.3700000000000001e-09,6.3799999999999999e-09,6.3799999999999999e-09,6.3900000000000005e-09,6.3900000000000005e-09,6.3900000000000005e-09,6.4499999999999999e-09,6.4499999999999999e-09,6.4499999999999999e-09,6.4499999999999999e-09,6.4600000000000004e-09,6.4600000000000004e-09,6.4600000000000004e-09,6.4600000000000004e-09,6.4700000000000002e-09,6.4700000000000002e-09,6.48e-09,6.4899999999999997e-09,6.5000000000000003e-09,6.6700000000000003e-09,6.72e-09,6.9699999999999997e-09,6.9800000000000003e-09,6.9900000000000001e-09,7.6799999999999999e-09,7.9599999999999998e-09,8.1100000000000012e-09,8.1599999999999999e-09,8.3600000000000001e-09,8.6900000000000004e-09],"4":[7.44e-09,7.44e-09,7.44e-09,7.44e-09,7.4499999999999997e-09,7.4499999999999997e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6599999999999988e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6700000000000002e-09,7.6799999999999999e-09,7.6899999999999997e-09,7.7800000000000008e-09,7.8000000000000004e-09,7.8100000000000001e-09,7.8700000000000003e-09,7.8800000000000001e-09,7.8800000000000001e-09,7.8800000000000001e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8899999999999998e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.8999999999999996e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.910000000000001e-09,7.9200000000000008e-09,7.9200000000000008e-09,7.9299999999999989e-09,7.9299999999999989e-09,7.9299999999999989e-09,7.9400000000000003e-09,7.9500000000000001e-09,8.02e-09,8.02e-09,8.02e-09,8.02e-09,8.02e-09,8.02e-09,8.02e-09,8.02e-09,8.0299999999999998e-09,8.0299999999999998e-09,8.0500000000000009e-09,8.0600000000000007e-09,8.0600000000000007e-09,8.1100000000000012e-09,8.1100000000000012e-09,8.1100000000000012e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1200000000000009e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1300000000000007e-09,8.1399999999999988e-09,8.1399999999999988e-09,8.1399999999999988e-09,8.1399999999999988e-09,8.1500000000000002e-09,8.1500000000000002e-09,8.1500000000000002e-09,8.1500000000000002e-09,8.1500000000000002e-09,8.1500000000000002e-09,8.1599999999999999e-09,8.1599999999999999e-09,8.1599999999999999e-09,8.1699999999999997e-09,8.1800000000000011e-09,8.2500000000000011e-09,8.2600000000000008e-09,8.2600000000000008e-09,8.2600000000000008e-09,8.2600000000000008e-09,8.2700000000000006e-09,8.2799999999999987e-09,8.2999999999999999e-09,8.3300000000000008e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3400000000000006e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3500000000000003e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3600000000000001e-09,8.3699999999999998e-09,8.3699999999999998e-09,8.3699999999999998e-09,8.3699999999999998e-09,8.3699999999999998e-09,8.3699999999999998e-09,8.3799999999999996e-09,8.3799999999999996e-09,8.390000000000001e-09,8.4100000000000005e-09,8.4200000000000003e-09,8.4200000000000003e-09,8.4200000000000003e-09,8.460000000000001e-09,8.4800000000000005e-09,8.4900000000000003e-09,8.5e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5099999999999998e-09,8.5199999999999995e-09,8.5199999999999995e-09,8.5300000000000009e-09,8.5400000000000007e-09,8.5500000000000005e-09,8.5500000000000005e-09,8.5500000000000005e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.5600000000000002e-09,8.57e-09,8.57e-09,8.57e-09,8.5799999999999997e-09,8.5799999999999997e-09,8.5799999999999997e-09,8.6399999999999999e-09,8.6800000000000006e-09,8.6900000000000004e-09,8.7000000000000001e-09,8.7300000000000011e-09,8.7300000000000011e-09,8.7300000000000011e-09,8.7400000000000008e-09,8.7400000000000008e-09,8.7500000000000006e-09,8.7500000000000006e-09,8.7500000000000006e-09,8.7600000000000004e-09,8.7600000000000004e-09,8.7600000000000004e-09,8.7700000000000001e-09,8.7700000000000001e-09,8.7799999999999999e-09,8.7799999999999999e-09,8.7799999999999999e-09,8.7899999999999996e-09,8.9199999999999998e-09,8.9199999999999998e-09,8.940000000000001e-09,8.9500000000000007e-09,8.9500000000000007e-09,8.9600000000000005e-09,8.9700000000000003e-09,8.98e-09,9.0800000000000009e-09,9.1500000000000009e-09,9.1600000000000006e-09,9.1600000000000006e-09,9.1600000000000006e-09,9.1600000000000006e-09,9.1800000000000001e-09,9.1800000000000001e-09,9.1899999999999999e-09,9.1999999999999997e-09,9.1999999999999997e-09,9.3999999999999998e-09,9.420000000000001e-09,9.6299999999999992e-09,1.007e-08,1.013e-08,1.069e-08,1.0780000000000001e-08,1.1149999999999999e-08,1.118e-08,1.15e-08],"320":[2.4803e-05,2.4814500000000001e-05,2.4817500000000001e-05,2.4820500000000001e-05,2.48265e-05,2.4830000000000001e-05,2.4833333333333332e-05,2.4837666666666664e-05,2.4838249999999999e-05,2.4842e-05,2.4843000000000003e-05,2.4847000000000001e-05,2.4848e-05,2.4851e-05,2.4868e-05,2.4893e-05,2.4902e-05,2.4922999999999998e-05,2.4927999999999999e-05,2.4933e-05,2.4936999999999999e-05,2.4943000000000002e-05,2.4953999999999999e-05,2.4958000000000001e-05,2.4961999999999999e-05,2.4966000000000001e-05,2.4973e-05,2.4973999999999998e-05,2.4981999999999999e-05,2.5011000000000002e-05,2.5676718750000001e-05,2.5713101449275361e-05,2.5718509433962263e-05,2.5779621621621621e-05,2.5794899999999999e-05,2.5809700000000001e-05,2.5880209999999997e-05,2.589085e-05,2.589643e-05,2.593309230769231e-05,2.5949499999999999e-05,2.5955369230769231e-05,2.597309e-05,2.5973999999999999e-05,2.5973999999999999e-05,2.5974666666666664e-05,2.5984000000000001e-05,2.5986000000000002e-05,2.5986499999999999e-05,2.5989333333333332e-05,2.5989889999999999e-05,2.5996e-05,2.5996e-05,2.5999999999999998e-05,2.6001500000000002e-05,2.6003499999999999e-05,2.6010999999999999e-05,2.6016750000000001e-05,2.6021999999999999e-05,2.6026000000000001e-05,2.6041e-05,2.6041e-05,2.6047e-05,2.605e-05,2.6058449999999998e-05,2.6066000000000001e-05,2.6067e-05,2.6069000000000001e-05,2.6069999999999999e-05,2.6072e-05,2.6075999999999999e-05,2.608773e-05,2.6089e-05,2.6092e-05,2.6101269999999998e-05,2.6109e-05,2.6113660000000001e-05,2.6122000000000002e-05,2.612362e-05,2.6125000000000001e-05,2.6126e-05,2.6126999999999999e-05,2.6128000000000001e-05,2.6137000000000001e-05,2.6139000000000002e-05,2.6139000000000002e-05,2.6143e-05,2.6152e-05,2.6156000000000002e-05,2.6162939999999999e-05,2.6163e-05,2.6171999999999999e-05,2.6171999999999999e-05,2.6184530000000002e-05,2.6212760000000001e-05,2.6233900000000003e-05,2.6270680000000001e-05,2.6281770000000001e-05,2.6293000000000001e-05,2.6320530000000002e-05,2.6336e-05,2.6351569999999998e-05,2.6352709999999997e-05,2.637135e-05,2.637339e-05,2.6377910000000001e-05,2.6383079999999997e-05,2.6423359999999999e-05,2.642453e-05,2.6427899999999998e-05,2.6437790000000002e-05,2.6468929999999999e-05,2.6478579999999999e-05,2.648139e-05,2.6497749999999999e-05,2.651045e-05,2.6513299999999999e-05,2.65259e-05,2.6540090000000003e-05,2.6544419999999998e-05,2.6565179104477615e-05,2.6584328124999998e-05,2.659327e-05,2.6602300000000001e-05,2.663416e-05,2.6639609999999999e-05,2.6674099999999999e-05,2.668917e-05,2.6706590000000002e-05,2.670961e-05,2.6714629999999999e-05,2.6721039999999996e-05,2.674773e-05,2.6758440000000001e-05,2.6760938461538462e-05,2.6769772727272727e-05,2.6779870000000002e-05,2.67811e-05,2.6781906976744183e-05,2.6792899999999999e-05,2.6795980000000001e-05,2.6817499999999999e-05,2.6822438596491226e-05,2.6826079999999999e-05,2.684527e-05,2.6859150000000002e-05,2.6871220000000003e-05,2.6885780000000001e-05,2.689569e-05,2.6897200000000001e-05,2.6917600000000001e-05,2.691933e-05,2.6923709999999998e-05,2.6924305084745761e-05,2.693613e-05,2.6939210000000002e-05,2.6944857142857144e-05,2.69449e-05,2.694999e-05,2.6984930000000002e-05,2.6999110000000001e-05,2.7007690000000002e-05,2.7032159999999999e-05,2.70391e-05,2.7041609999999999e-05,2.7050120000000002e-05,2.7057959999999998e-05,2.7064090909090908e-05,2.706492e-05,2.707266e-05,2.7081269999999999e-05,2.7086589999999998e-05,2.7086660000000003e-05,2.7123500000000002e-05,2.7124131147540984e-05,2.7132609999999999e-05,2.713582e-05,2.716871e-05,2.7185740000000002e-05,2.7189050847457626e-05,2.719094e-05,2.7193970000000002e-05,2.7197749999999999e-05,2.7205440677966101e-05,2.7216280701754387e-05,2.7221460000000001e-05,2.7226339999999997e-05,2.7232039999999999e-05,2.7233000000000002e-05,2.7239000000000001e-05,2.7240210000000001e-05,2.7240909090909092e-05,2.7241172413793104e-05,2.7242499999999999e-05,2.7243124999999998e-05,2.7245499999999999e-05,2.7250040000000001e-05,2.725366666666667e-05,2.7255333333333333e-05,2.7257649999999998e-05,2.7265350000000001e-05,2.7265999999999999e-05,2.7266600000000001e-05,2.7268333333333331e-05,2.727317e-05,2.727545e-05,2.7279000000000001e-05,2.7280999999999999e-05,2.7282000000000001e-05,2.7287000000000001e-05,2.72894e-05,2.7291500000000001e-05,2.7291999999999999e-05,2.729293e-05,2.72955e-05,2.7296459999999999e-05,2.7297999999999999e-05,2.7300319999999998e-05,2.7300999999999998e-05,2.7305e-05,2.7322999999999999e-05,2.7356e-05,2.7361000000000001e-05,2.7365e-05,2.7365999999999999e-05,2.7373e-05,2.7378000000000001e-05,2.738244e-05,2.7385e-05,2.7385999999999998e-05,2.7392190000000001e-05,2.7401000000000001e-05,2.7402e-05,2.7416999999999999e-05,2.7433499999999997e-05,2.7468229999999998e-05,2.7552160000000001e-05,2.7904919999999999e-05,2.8100349999999999e-05,2.811814e-05,2.8147329999999999e-05,2.8201849999999998e-05,2.8444269999999999e-05,2.8474820000000002e-05,2.8719079999999999e-05,2.8780659999999998e-05,2.9006859999999999e-05,2.9066048780487807e-05,2.9187739999999998e-05,2.9196949999999998e-05,2.9358529999999999e-05,2.9367040000000001e-05,2.9367809999999998e-05,2.9369309999999997e-05,2.9377329999999999e-05,2.9379358974358974e-05,2.9383990000000001e-05,2.9388289473684213e-05,2.9389379999999999e-05,2.9392923076923078e-05,2.9396222222222219e-05,2.9399559999999999e-05,2.940840625e-05,2.940897e-05,2.941173e-05,2.9416400000000002e-05,2.942063e-05,2.9435339999999999e-05,2.943685714285714e-05,2.945386e-05,2.9459e-05,2.9476e-05,2.9505e-05,2.9533999999999999e-05,4.8968999999999998e-05,5.0619714285714287e-05,5.1390000000000001e-05,5.1841000000000001e-05,5.3635999999999999e-05,5.4468057142857145e-05,6.2172058823529408e-05],"5":[9.9200000000000005e-09,9.9200000000000005e-09,1.0109999999999999e-08,1.0120000000000001e-08,1.013e-08,1.013e-08,1.013e-08,1.013e-08,1.013e-08,1.014e-08,1.014e-08,1.015e-08,1.034e-08,1.035e-08,1.035e-08,1.035e-08,1.035e-08,1.035e-08,1.035e-08,1.035e-08,1.037e-08,1.0449999999999999e-08,1.0460000000000001e-08,1.049e-08,1.049e-08,1.05e-08,1.0509999999999999e-08,1.055e-08,1.055e-08,1.056e-08,1.056e-08,1.056e-08,1.056e-08,1.056e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.057e-08,1.0580000000000001e-08,1.0589999999999999e-08,1.0600000000000001e-08,1.0600000000000001e-08,1.061e-08,1.0640000000000001e-08,1.0649999999999999e-08,1.0649999999999999e-08,1.0669999999999999e-08,1.077e-08,1.077e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0780000000000001e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0789999999999999e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0800000000000001e-08,1.0809999999999999e-08,1.082e-08,1.082e-08,1.082e-08,1.082e-08,1.083e-08,1.084e-08,1.084e-08,1.085e-08,1.0860000000000001e-08,1.0860000000000001e-08,1.088e-08,1.088e-08,1.0929999999999999e-08,1.0929999999999999e-08,1.096e-08,1.0989999999999999e-08,1.0989999999999999e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1000000000000001e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.1009999999999999e-08,1.102e-08,1.102e-08,1.102e-08,1.102e-08,1.102e-08,1.102e-08,1.102e-08,1.103e-08,1.104e-08,1.105e-08,1.105e-08,1.105e-08,1.1060000000000001e-08,1.1060000000000001e-08,1.1060000000000001e-08,1.1060000000000001e-08,1.1080000000000001e-08,1.109e-08,1.109e-08,1.111e-08,1.111e-08,1.111e-08,1.1129999999999999e-08,1.1140000000000001e-08,1.1200000000000001e-08,1.1209999999999999e-08,1.1209999999999999e-08,1.1209999999999999e-08,1.1209999999999999e-08,1.1209999999999999e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.1220000000000001e-08,1.123e-08,1.123e-08,1.123e-08,1.123e-08,1.123e-08,1.123e-08,1.123e-08,1.123e-08,1.124e-08,1.124e-08,1.1269999999999999e-08,1.1280000000000001e-08,1.1280000000000001e-08,1.1280000000000001e-08,1.1280000000000001e-08,1.1289999999999999e-08,1.1289999999999999e-08,1.1289999999999999e-08,1.13e-08,1.132e-08,1.137e-08,1.137e-08,1.137e-08,1.1420000000000001e-08,1.1429999999999999e-08,1.1429999999999999e-08,1.1429999999999999e-08,1.1429999999999999e-08,1.1429999999999999e-08,1.1429999999999999e-08,1.144e-08,1.144e-08,1.145e-08,1.145e-08,1.145e-08,1.145e-08,1.15e-08,1.151e-08,1.151e-08,1.151e-08,1.151e-08,1.152e-08,1.152e-08,1.152e-08,1.152e-08,1.152e-08,1.152e-08,1.159e-08,1.16e-08,1.16e-08,1.1629999999999999e-08,1.164e-08,1.165e-08,1.165e-08,1.165e-08,1.165e-08,1.165e-08,1.165e-08,1.166e-08,1.167e-08,1.1680000000000001e-08,1.174e-08,1.174e-08,1.1749999999999999e-08,1.1749999999999999e-08,1.1829999999999999e-08,1.186e-08,1.1880000000000001e-08,1.1880000000000001e-08,1.192e-08,1.1960000000000001e-08,1.1960000000000001e-08,1.1969999999999999e-08,1.198e-08,1.199e-08,1.207e-08,1.208e-08,1.208e-08,1.2089999999999999e-08,1.22e-08,1.232e-08,1.232e-08,1.233e-08,1.234e-08,1.242e-08,1.2429999999999999e-08,1.2440000000000001e-08,1.254e-08,1.255e-08,1.256e-08,1.28e-08,1.2920000000000001e-08,1.303e-08,1.303e-08,1.304e-08,1.4100000000000001e-08,1.418e-08,1.448e-08,1.466e-08,1.4810000000000002e-08,1.4929999999999999e-08],"6":[1.323e-08,1.323e-08,1.323e-08,1.3329999999999999e-08,1.344e-08,1.344e-08,1.344e-08,1.345e-08,1.345e-08,1.345e-08,1.3459999999999999e-08,1.3459999999999999e-08,1.3480000000000001e-08,1.3599999999999999e-08,1.3669999999999999e-08,1.3669999999999999e-08,1.3669999999999999e-08,1.3669999999999999e-08,1.3669999999999999e-08,1.3680000000000001e-08,1.3689999999999999e-08,1.3689999999999999e-08,1.3689999999999999e-08,1.3710000000000002e-08,1.3749999999999999e-08,1.3749999999999999e-08,1.376e-08,1.3769999999999999e-08,1.3769999999999999e-08,1.3769999999999999e-08,1.379e-08,1.3799999999999999e-08,1.3799999999999999e-08,1.3809999999999999e-08,1.3809999999999999e-08,1.3820000000000001e-08,1.3869999999999999e-08,1.3880000000000001e-08,1.3880000000000001e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.3889999999999999e-08,1.39e-08,1.39e-08,1.3960000000000001e-08,1.3969999999999999e-08,1.4009999999999999e-08,1.4009999999999999e-08,1.4029999999999999e-08,1.4079999999999999e-08,1.4089999999999999e-08,1.4089999999999999e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4100000000000001e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.4109999999999999e-08,1.412e-08,1.4130000000000001e-08,1.4130000000000001e-08,1.4149999999999999e-08,1.4149999999999999e-08,1.4160000000000001e-08,1.418e-08,1.418e-08,1.421e-08,1.421e-08,1.4219999999999999e-08,1.4219999999999999e-08,1.4219999999999999e-08,1.4249999999999999e-08,1.4249999999999999e-08,1.426e-08,1.426e-08,1.426e-08,1.4270000000000001e-08,1.4300000000000001e-08,1.4309999999999999e-08,1.4309999999999999e-08,1.432e-08,1.432e-08,1.432e-08,1.432e-08,1.432e-08,1.432e-08,1.432e-08,1.432e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.4330000000000002e-08,1.434e-08,1.434e-08,1.434e-08,1.434e-08,1.4349999999999999e-08,1.4349999999999999e-08,1.4360000000000001e-08,1.4369999999999999e-08,1.4369999999999999e-08,1.44e-08,1.44e-08,1.4410000000000001e-08,1.4440000000000001e-08,1.4470000000000002e-08,1.448e-08,1.452e-08,1.4529999999999998e-08,1.4529999999999998e-08,1.454e-08,1.454e-08,1.454e-08,1.454e-08,1.454e-08,1.454e-08,1.454e-08,1.454e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4550000000000001e-08,1.4559999999999999e-08,1.4559999999999999e-08,1.4559999999999999e-08,1.4559999999999999e-08,1.4559999999999999e-08,1.4559999999999999e-08,1.4569999999999999e-08,1.4569999999999999e-08,1.4569999999999999e-08,1.4580000000000001e-08,1.46e-08,1.4610000000000001e-08,1.4649999999999999e-08,1.466e-08,1.466e-08,1.468e-08,1.468e-08,1.4750000000000001e-08,1.4750000000000001e-08,1.4759999999999999e-08,1.4759999999999999e-08,1.4759999999999999e-08,1.4759999999999999e-08,1.4759999999999999e-08,1.4769999999999999e-08,1.4769999999999999e-08,1.4769999999999999e-08,1.4769999999999999e-08,1.4769999999999999e-08,1.4769999999999999e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4780000000000001e-08,1.4789999999999999e-08,1.4789999999999999e-08,1.482e-08,1.4830000000000001e-08,1.486e-08,1.4869999999999998e-08,1.4869999999999998e-08,1.4890000000000001e-08,1.4890000000000001e-08,1.4899999999999999e-08,1.4970000000000001e-08,1.4970000000000001e-08,1.4980000000000002e-08,1.4980000000000002e-08,1.4980000000000002e-08,1.4980000000000002e-08,1.4990000000000001e-08,1.4990000000000001e-08,1.4990000000000001e-08,1.4990000000000001e-08,1.4990000000000001e-08,1.5000000000000002e-08,1.5000000000000002e-08,1.5000000000000002e-08,1.5000000000000002e-08,1.5000000000000002e-08,1.501e-08,1.501e-08,1.5019999999999998e-08,1.5069999999999999e-08,1.5110000000000001e-08,1.5110000000000001e-08,1.5110000000000001e-08,1.5140000000000002e-08,1.5179999999999998e-08,1.5179999999999998e-08,1.5179999999999998e-08,1.5189999999999999e-08,1.5189999999999999e-08,1.5189999999999999e-08,1.5189999999999999e-08,1.5189999999999999e-08,1.52e-08,1.52e-08,1.5209999999999999e-08,1.5209999999999999e-08,1.5209999999999999e-08,1.522e-08,1.522e-08,1.522e-08,1.5230000000000001e-08,1.5299999999999998e-08,1.541e-08,1.543e-08,1.5439999999999998e-08,1.5439999999999998e-08,1.5439999999999998e-08,1.5449999999999999e-08,1.5460000000000001e-08,1.5469999999999999e-08,1.548e-08,1.548e-08,1.5489999999999998e-08,1.5519999999999999e-08,1.5530000000000001e-08,1.5670000000000001e-08,1.569e-08,1.571e-08,1.5729999999999999e-08,1.5729999999999999e-08,1.5749999999999999e-08,1.576e-08,1.5859999999999998e-08,1.5880000000000001e-08,1.59e-08,1.597e-08,1.597e-08,1.597e-08,1.6149999999999999e-08,1.6199999999999999e-08,1.6210000000000001e-08,1.6419999999999997e-08,1.6429999999999999e-08,1.6449999999999998e-08,1.6700000000000001e-08,1.6709999999999999e-08,1.6759999999999999e-08,1.6969999999999999e-08,1.7620000000000002e-08,1.8259999999999999e-08,1.8749999999999999e-08,1.9300000000000001e-08,1.9309999999999999e-08,1.9329999999999998e-08,1.9510000000000001e-08,1.9709999999999999e-08,1.9800000000000002e-08],"10240":[0.024821856,0.024876698999999999,0.024889477,0.024996721,0.025021358,0.025057346000000001,0.025098227000000001,0.025110271999999999,0.025188832000000001,0.025199355999999999,0.025200771,0.025202182,0.025217827000000002,0.025219649,0.025223427999999999,0.025226114000000001,0.025232294999999998,0.025233421999999998,0.02523479,0.025250284000000001,0.025251717999999999,0.025252470499999999,0.025282008000000002,0.025289900000000001,0.025291349000000001,0.025291605000000002,0.025297221000000002,0.025306493999999999,0.025312556999999999,0.025323842999999999,0.025333502000000001,0.025339539000000001,0.025339759,0.025341498,0.025348992000000001,0.025349778,0.025359123000000001,0.025363967000000001,0.025371336000000001,0.025373293000000002,0.025373841000000001,0.025374502,0.025379815999999999,0.025380778999999999,0.025386901999999999,0.025401623000000002,0.025404157,0.025414570000000001,0.025422009999999998,0.025423370000000001,0.025429887000000002,0.025430436000000001,0.025434579999999998,0.025435683000000001,0.0254377735,0.025449100999999998,0.025454633000000001,0.025457117000000001,0.025458332,0.025458419999999999,0.025471528,0.025473076000000039,0.025473404000000002,0.025483710999999999,0.025484456999999999,0.025484795000000001,0.025491672999999999,0.025493005999999999,0.025499759,0.025504367,0.025505176000000001,0.025507790999999998,0.025519894000000001,0.025524333999999999,0.025533937999999999,0.0255374365,0.025538700000000001,0.025539643000000001,0.025542243999999999,0.025547944999999999,0.025557071000000001,0.025558052000000001,0.025561871,0.025565846,0.025565856000000001,0.025567414,0.02557250350000001,0.025573420999999999,0.025574817,0.025575036999999998,0.025577806000000002,0.025579971999999999,0.0255845645,0.02558945,0.025589961000000001,0.025595777,0.025595844,0.025597564499999999,0.025602902,0.025611805000000001,0.02561182,0.025615822999999999,0.025618868999999999,0.025621258000000001,0.025627886999999999,0.025629209999999999,0.025641107,0.025645037999999998,0.025658601999999999,0.025661562999999998,0.025663689999999999,0.025665614999999999,0.025668239499999999,0.025670135,0.025677392,0.025688003500000001,0.025691974999999999,0.025692265499999999,0.025702323499999999,0.025710429,0.025719339500000001,0.025720079999999999,0.025729188,0.025741160499999999,0.02574236299999999,0.025745695499999999,0.025751323,0.025751567999999999,0.025761007499999999,0.0257642745,0.025768765999999999,0.025773190000000001,0.025782328,0.025782557500000001,0.02578749,0.025788181,0.025789576000000002,0.025794023999999999,0.025794551499999999,0.025797226999999999,0.025799748000000001,0.025805735999999999,0.02581025,0.025813466,0.02581615,0.025816822999999999,0.025817647999999999,0.025834843999999999,0.025835840999999998,0.025836475000000001,0.025837026999999999,0.025840488000000002,0.025846320999999998,0.025848079999999999,0.025849247499999999,0.025855484000000001,0.025856264,0.025862747500000002,0.025864590999999999,0.025867336000000001,0.025869204,0.025890872999999998,0.025892813000000001,0.025900495999999999,0.025912098500000001,0.025922633,0.025924348999999999,0.025931331500000002,0.025932838,0.025934295,0.025934589500000001,0.0259356195,0.025935988,0.0259533765,0.025961284000000001,0.025963666,0.025968657999999999,0.025975161,0.025976773000000002,0.0259781075,0.026022123000000001,0.026026672000000001,0.026028941999999999,0.026031991000000001,0.026032371499999998,0.026035892000000001,0.026043336,0.026044075999999999,0.0260455585,0.026047076999999998,0.026049177999999999,0.026060255000000001,0.026063843999999999,0.026070131999999999,0.026070314000000001,0.026070945000000002,0.026085601999999999,0.026093877000000001,0.026094881000000014,0.026102073,0.026105919000000002,0.026108790999999999,0.026119300000000002,0.026119486000000001,0.026120783000000002,0.026124185000000001,0.026154078000000025,0.026162113000000001,0.026164179999999999,0.026165715999999999,0.026171574,0.026180354499999999,0.026188996999999999,0.026196277,0.026197581000000001,0.026200205000000001,0.026226289999999999,0.026228347999999999,0.026244067999999999,0.026264288,0.026268590000000001,0.026278797999999999,0.026282047499999999,0.026294013500000001,0.026302525,0.026303621999999999,0.026305788,0.026315303000000002,0.026334184,0.026336393,0.026341962,0.026350404000000001,0.026369852999999999,0.026372066499999999,0.026378136,0.026388937500000001,0.026394062999999999,0.026396922,0.026398893999999999,0.026400370999999999,0.026427428999999999,0.0264741665,0.026480865999999999,0.026481036499999999,0.0264929985,0.026515672000000001,0.026536402000000001,0.026560099,0.026586413,0.026664352499999999,0.026666922999999999,0.026738841999999999,0.026773950000000001,0.026822945000000001,0.026829183,0.026861741000000001,0.026872857999999999,0.0269506955,0.027011734499999999,0.027061539499999999,0.027118083000000001,0.027179487499999998,0.027194493,0.027307672000000002,0.027341639000000001,0.027348234999999999,0.027368974500000001,0.027388369999999995,0.027452824000000001,0.027849820000000001,0.028029090999999999,0.028119551499999999,0.028235685999999982,0.0282539435,0.054183348999999999,0.054656991000000002,0.059871112999999997,0.065512541499999993,0.070420149000000001,0.075180891,0.081605535000000007],"7":[1.658e-08,1.7e-08,1.7e-08,1.7039999999999999e-08,1.7220000000000001e-08,1.7229999999999999e-08,1.7229999999999999e-08,1.7240000000000001e-08,1.7340000000000002e-08,1.7369999999999999e-08,1.7439999999999999e-08,1.7439999999999999e-08,1.7450000000000001e-08,1.7450000000000001e-08,1.7450000000000001e-08,1.7460000000000002e-08,1.7509999999999999e-08,1.754e-08,1.754e-08,1.756e-08,1.756e-08,1.7649999999999999e-08,1.7649999999999999e-08,1.7660000000000001e-08,1.7660000000000001e-08,1.7669999999999999e-08,1.768e-08,1.768e-08,1.768e-08,1.768e-08,1.768e-08,1.768e-08,1.775e-08,1.777e-08,1.7780000000000001e-08,1.7789999999999999e-08,1.784e-08,1.7870000000000001e-08,1.7880000000000002e-08,1.7880000000000002e-08,1.7880000000000002e-08,1.789e-08,1.789e-08,1.789e-08,1.789e-08,1.789e-08,1.789e-08,1.789e-08,1.791e-08,1.791e-08,1.791e-08,1.7920000000000001e-08,1.7929999999999999e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.7940000000000001e-08,1.796e-08,1.7990000000000001e-08,1.7990000000000001e-08,1.7999999999999999e-08,1.7999999999999999e-08,1.7999999999999999e-08,1.7999999999999999e-08,1.7999999999999999e-08,1.801e-08,1.8020000000000002e-08,1.8040000000000001e-08,1.8060000000000001e-08,1.808e-08,1.81e-08,1.81e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8109999999999998e-08,1.8119999999999999e-08,1.8119999999999999e-08,1.8119999999999999e-08,1.8119999999999999e-08,1.8119999999999999e-08,1.8130000000000001e-08,1.8139999999999999e-08,1.8139999999999999e-08,1.815e-08,1.8160000000000002e-08,1.817e-08,1.817e-08,1.8200000000000001e-08,1.8200000000000001e-08,1.8209999999999999e-08,1.8229999999999998e-08,1.8229999999999998e-08,1.8250000000000001e-08,1.8250000000000001e-08,1.8279999999999999e-08,1.8320000000000001e-08,1.8320000000000001e-08,1.8320000000000001e-08,1.8320000000000001e-08,1.8320000000000001e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8329999999999999e-08,1.8340000000000001e-08,1.8340000000000001e-08,1.8349999999999999e-08,1.8349999999999999e-08,1.8349999999999999e-08,1.836e-08,1.8369999999999998e-08,1.838e-08,1.838e-08,1.8390000000000001e-08,1.8399999999999999e-08,1.8410000000000001e-08,1.843e-08,1.843e-08,1.8440000000000002e-08,1.8440000000000002e-08,1.845e-08,1.845e-08,1.845e-08,1.8460000000000001e-08,1.8480000000000001e-08,1.8489999999999999e-08,1.8489999999999999e-08,1.8530000000000001e-08,1.8530000000000001e-08,1.8539999999999999e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8550000000000001e-08,1.8560000000000002e-08,1.8560000000000002e-08,1.8560000000000002e-08,1.8560000000000002e-08,1.8560000000000002e-08,1.8560000000000002e-08,1.857e-08,1.857e-08,1.8580000000000002e-08,1.859e-08,1.8600000000000001e-08,1.8609999999999999e-08,1.8620000000000001e-08,1.8620000000000001e-08,1.8629999999999999e-08,1.8629999999999999e-08,1.866e-08,1.8670000000000001e-08,1.8670000000000001e-08,1.8670000000000001e-08,1.8670000000000001e-08,1.8670000000000001e-08,1.871e-08,1.8720000000000002e-08,1.8720000000000002e-08,1.8720000000000002e-08,1.8720000000000002e-08,1.8749999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.8769999999999999e-08,1.878e-08,1.878e-08,1.8789999999999998e-08,1.8789999999999998e-08,1.8789999999999998e-08,1.8810000000000001e-08,1.8819999999999999e-08,1.8830000000000001e-08,1.8840000000000002e-08,1.8840000000000002e-08,1.8860000000000001e-08,1.89e-08,1.8909999999999999e-08,1.892e-08,1.8929999999999998e-08,1.8929999999999998e-08,1.894e-08,1.894e-08,1.8959999999999999e-08,1.8959999999999999e-08,1.8959999999999999e-08,1.897e-08,1.899e-08,1.899e-08,1.9000000000000001e-08,1.9009999999999999e-08,1.9009999999999999e-08,1.9029999999999999e-08,1.904e-08,1.9049999999999999e-08,1.9049999999999999e-08,1.906e-08,1.9080000000000003e-08,1.9120000000000002e-08,1.9139999999999998e-08,1.9139999999999998e-08,1.9160000000000001e-08,1.9169999999999999e-08,1.9209999999999998e-08,1.9209999999999998e-08,1.9219999999999999e-08,1.9219999999999999e-08,1.9219999999999999e-08,1.9219999999999999e-08,1.9230000000000001e-08,1.9240000000000002e-08,1.9240000000000002e-08,1.927e-08,1.9280000000000001e-08,1.9309999999999999e-08,1.941e-08,1.9440000000000001e-08,1.9449999999999999e-08,1.9449999999999999e-08,1.946e-08,1.948e-08,1.948e-08,1.9530000000000003e-08,1.962e-08,1.9630000000000001e-08,1.9649999999999997e-08,1.9649999999999997e-08,1.9659999999999999e-08,1.9659999999999999e-08,1.9680000000000002e-08,1.9709999999999999e-08,1.9720000000000001e-08,1.9750000000000001e-08,1.9750000000000001e-08,1.9769999999999998e-08,1.9779999999999999e-08,1.9849999999999999e-08,1.9870000000000002e-08,1.9920000000000002e-08,2e-08,2.0030000000000001e-08,2.0109999999999999e-08,2.0120000000000001e-08,2.0120000000000001e-08,2.0120000000000001e-08,2.0120000000000001e-08,2.016e-08,2.0329999999999997e-08,2.0360000000000002e-08,2.0400000000000001e-08,2.0600000000000002e-08,2.0930000000000003e-08,2.131e-08,2.1710000000000001e-08,2.391e-08,2.4080000000000001e-08,2.4310000000000001e-08,2.5289999999999997e-08,2.543e-08,2.576e-08,2.5880000000000001e-08],"24576":[0.144373221,0.14512333299999999,0.14513242600000001,0.14517244600000001,0.145411555,0.145466807,0.145505201,0.14553428099999999,0.14555552350000001,0.14555688,0.14555894599999999,0.14560956899999999,0.14564674,0.14576090550000001,0.14590362100000001,0.145908227,0.14595302700000001,0.145957428,0.14595789300000001,0.145978359,0.14598490650000001,0.14599418049999999,0.14605108850000001,0.1460522595,0.14615017650000001,0.14616530750000001,0.14617664499999999,0.14622378899999999,0.14626744349999998,0.146281415,0.14628549099999999,0.14633686300000001,0.14641686200000001,0.1465037585,0.14652492099999997,0.1465862345,0.146603346,0.14661221799999999,0.14671167299999999,0.146725041,0.14672663799999999,0.14682521600000001,0.14683819200000001,0.146844954,0.146864145,0.14687499800000001,0.146891459,0.146894949,0.14689817199999999,0.146926478,0.146931642,0.1469442785,0.14696097,0.146967548,0.14700596699999999,0.14702334149999999,0.14703780599999999,0.14707133850000001,0.14707240150000001,0.147072432,0.147099221,0.14711088700000002,0.14713035399999996,0.14713969299999999,0.14714993600000004,0.14717087700000001,0.14717849499999999,0.14719246850000001,0.14720395999999999,0.14720746800000001,0.147229217,0.14726152000000001,0.147266015,0.14727116200000001,0.14728195650000001,0.14728515149999999,0.147291853,0.1472964625,0.147307722,0.14731346400000001,0.14732039699999999,0.14733813300000001,0.1473451825,0.14735193699999999,0.14736382050000002,0.14737043449999998,0.14738853099999999,0.147388716,0.14740350999999999,0.14741258700000004,0.14741573999999999,0.14741693499999997,0.14744965799999998,0.14749419,0.14752337200000001,0.147524768,0.147531143,0.147541334,0.14755515599999999,0.1475703575,0.14757662799999999,0.1475989905,0.14761145000000001,0.14764687700000001,0.14767914400000001,0.14768653600000001,0.14769413849999999,0.14772862049999999,0.1477298245,0.14773629099999999,0.14774311500000001,0.147769822,0.147773083,0.14777604499999999,0.14777870100000001,0.147783314,0.1477849195,0.14778960900000004,0.14779360499999999,0.14780304699999999,0.1478066495,0.14780868699999999,0.14784842799999998,0.14786346,0.147875059,0.14787934800000002,0.147895572,0.147934226,0.14794468699999999,0.14794822099999999,0.147948834,0.14797569899999999,0.147984008,0.14802682850000001,0.14806335749999999,0.148064802,0.14808429649999999,0.14810346999999999,0.14815276300000002,0.1481701785,0.14817702050000001,0.14818842099999999,0.148190181,0.14820834250000001,0.1482267525,0.14824599399999999,0.14824956650000001,0.14828195399999999,0.14830281949999999,0.14836104900000002,0.14836263649999998,0.1484056265,0.14842150099999996,0.14844054600000001,0.1484462365,0.1484543545,0.14846048000000001,0.148496659,0.148500717,0.148576927,0.1486166625,0.14862180400000002,0.14862488149999997,0.14862784400000001,0.148642209,0.1486638485,0.14871638200000001,0.14872517699999999,0.148773778,0.148797911,0.14879858300000001,0.14882103400000002,0.14884806649999999,0.14888267899999999,0.14888792049999999,0.14893928000000001,0.14896182150000001,0.14897403949999999,0.149013383,0.14901639699999999,0.14902480900000001,0.14910473149999998,0.14910516500000001,0.14910719750000001,0.149187824,0.14921068700000001,0.14924711500000001,0.14925088800000003,0.14925175199999999,0.1492630845,0.14928018300000001,0.149338423,0.14934017399999999,0.14935037900000001,0.14942196299999999,0.14943369100000001,0.14944470200000001,0.149528309,0.1495318555,0.14954241500000001,0.14956058999999999,0.14964138399999999,0.14965087199999999,0.149670624,0.14968297650000001,0.149691136,0.14969352850000001,0.14970254699999999,0.14973698499999999,0.14975113649999999,0.14977880700000001,0.14978405349999999,0.14980543700000004,0.1498069635,0.14981338,0.1498475645,0.14986310550000001,0.14995673700000001,0.14996334150000001,0.14998153,0.14998181399999999,0.14999925349999998,0.15004311100000001,0.150125384,0.15017787199999999,0.1502222235,0.15023009650000002,0.15024762899999999,0.1502524475,0.1502864985,0.15031208600000001,0.15033768049999999,0.15035324799999999,0.150416826,0.15044187099999995,0.150454374,0.15045983799999996,0.15047556100000001,0.15049987100000001,0.1505427855,0.15068787150000001,0.15068958099999999,0.15072701900000002,0.150745191,0.15077795399999999,0.15084299000000001,0.15090199599999998,0.15100481199999999,0.15107316600000001,0.151141211,0.15147756800000001,0.15148531700000001,0.151485813,0.151640263,0.15170218199999999,0.15176341400000001,0.15182603699999997,0.15204458700000001,0.15205735400000001,0.1520690465,0.15216929300000001,0.15230280000000002,0.15353978099999999,0.15385135550000001,0.15403582800000001,0.15628651199999999,0.15657385200000001,0.15695664500000001,0.1588935165,0.15906097550000001,0.16044225000000001,0.16157473550000001,0.16270037900000001,0.18354643800000001,0.31756847300000002,0.36841730099999997,0.392608083,0.40581798400000002,0.41467811799999998,0.41804355700000001,0.42582196100000003],"10":[3.173e-08,3.2119999999999999e-08,3.2160000000000005e-08,3.2160000000000005e-08,3.2169999999999996e-08,3.2169999999999996e-08,3.2350000000000002e-08,3.2380000000000003e-08,3.2390000000000001e-08,3.2390000000000001e-08,3.2390000000000001e-08,3.2399999999999999e-08,3.2399999999999999e-08,3.257e-08,3.2600000000000001e-08,3.2600000000000001e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2609999999999999e-08,3.2619999999999997e-08,3.2619999999999997e-08,3.2619999999999997e-08,3.2660000000000003e-08,3.2660000000000003e-08,3.2660000000000003e-08,3.2670000000000001e-08,3.2679999999999999e-08,3.2689999999999997e-08,3.2720000000000004e-08,3.2740000000000001e-08,3.2770000000000002e-08,3.2770000000000002e-08,3.2819999999999999e-08,3.2819999999999999e-08,3.2819999999999999e-08,3.2819999999999999e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.2830000000000003e-08,3.285e-08,3.285e-08,3.285e-08,3.2889999999999999e-08,3.2910000000000002e-08,3.2940000000000002e-08,3.2950000000000001e-08,3.2969999999999997e-08,3.299e-08,3.3040000000000003e-08,3.3040000000000003e-08,3.3040000000000003e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.3050000000000001e-08,3.306e-08,3.306e-08,3.306e-08,3.306e-08,3.306e-08,3.3069999999999998e-08,3.3069999999999998e-08,3.3069999999999998e-08,3.3069999999999998e-08,3.3069999999999998e-08,3.3069999999999998e-08,3.3080000000000002e-08,3.3099999999999999e-08,3.3110000000000003e-08,3.3110000000000003e-08,3.3110000000000003e-08,3.3119999999999995e-08,3.316e-08,3.3169999999999999e-08,3.3169999999999999e-08,3.32e-08,3.3209999999999998e-08,3.3209999999999998e-08,3.3220000000000002e-08,3.3220000000000002e-08,3.3220000000000002e-08,3.323e-08,3.3260000000000001e-08,3.3269999999999999e-08,3.3269999999999999e-08,3.3269999999999999e-08,3.3269999999999999e-08,3.3269999999999999e-08,3.3269999999999999e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3280000000000004e-08,3.3289999999999996e-08,3.33e-08,3.3309999999999999e-08,3.3330000000000001e-08,3.3339999999999999e-08,3.3360000000000002e-08,3.337e-08,3.3379999999999998e-08,3.3419999999999998e-08,3.3419999999999998e-08,3.3449999999999998e-08,3.3459999999999997e-08,3.3479999999999999e-08,3.3479999999999999e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3489999999999997e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.3500000000000002e-08,3.351e-08,3.351e-08,3.3549999999999999e-08,3.3589999999999998e-08,3.3600000000000003e-08,3.3670000000000003e-08,3.3670000000000003e-08,3.3699999999999997e-08,3.3710000000000002e-08,3.372e-08,3.372e-08,3.372e-08,3.372e-08,3.372e-08,3.372e-08,3.372e-08,3.3729999999999998e-08,3.3729999999999998e-08,3.3729999999999998e-08,3.3739999999999996e-08,3.3759999999999999e-08,3.3780000000000002e-08,3.3869999999999998e-08,3.3890000000000001e-08,3.3890000000000001e-08,3.3890000000000001e-08,3.3899999999999999e-08,3.393e-08,3.393e-08,3.393e-08,3.393e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3939999999999998e-08,3.3950000000000003e-08,3.3950000000000003e-08,3.3960000000000001e-08,3.4030000000000001e-08,3.4039999999999999e-08,3.4039999999999999e-08,3.4060000000000002e-08,3.4079999999999998e-08,3.4089999999999996e-08,3.4120000000000004e-08,3.4120000000000004e-08,3.414e-08,3.414e-08,3.4149999999999998e-08,3.4149999999999998e-08,3.4149999999999998e-08,3.4160000000000003e-08,3.4160000000000003e-08,3.4160000000000003e-08,3.4170000000000001e-08,3.4170000000000001e-08,3.4240000000000001e-08,3.4240000000000001e-08,3.4259999999999997e-08,3.4300000000000003e-08,3.4319999999999999e-08,3.4369999999999996e-08,3.4380000000000001e-08,3.4380000000000001e-08,3.4550000000000002e-08,3.4569999999999998e-08,3.4580000000000003e-08,3.4590000000000001e-08,3.4590000000000001e-08,3.4599999999999999e-08,3.4599999999999999e-08,3.463e-08,3.463e-08,3.4660000000000001e-08,3.47e-08,3.477e-08,3.4779999999999998e-08,3.4819999999999997e-08,3.4819999999999997e-08,3.4860000000000002e-08,3.4949999999999999e-08,3.4960000000000003e-08,3.5040000000000001e-08,3.505e-08,3.5059999999999998e-08,3.5059999999999998e-08,3.5140000000000002e-08,3.5269999999999998e-08,3.5280000000000002e-08,3.5280000000000002e-08,3.5280000000000002e-08,3.5509999999999998e-08,3.5520000000000003e-08,3.5549999999999997e-08,3.5619999999999997e-08,3.5650000000000005e-08,3.5740000000000001e-08,3.5749999999999999e-08,3.5789999999999998e-08,3.5880000000000001e-08,3.5980000000000002e-08,3.5999999999999998e-08,3.6029999999999999e-08,3.6040000000000004e-08,3.6040000000000004e-08,3.627e-08,3.6519999999999999e-08,3.6529999999999997e-08,3.6529999999999997e-08,3.662e-08,3.6710000000000002e-08,3.6739999999999997e-08,3.6770000000000004e-08,3.6770000000000004e-08,3.6860000000000001e-08,3.6990000000000002e-08,3.7e-08,3.7e-08,3.7039999999999999e-08,3.7249999999999999e-08,3.7310000000000001e-08,3.7369999999999996e-08,3.777e-08,3.861e-08,3.934e-08,3.9720000000000001e-08,4.0560000000000001e-08,4.07e-08,4.4449999999999998e-08,4.4759999999999998e-08,4.5120000000000003e-08,4.6110000000000007e-08,4.629e-08,5.0689999999999999e-08],"8":[2.1299999999999999e-08,2.1670000000000001e-08,2.1670000000000001e-08,2.1699999999999999e-08,2.1710000000000001e-08,2.1710000000000001e-08,2.1720000000000002e-08,2.1720000000000002e-08,2.1720000000000002e-08,2.1760000000000001e-08,2.1840000000000002e-08,2.1890000000000003e-08,2.194e-08,2.194e-08,2.194e-08,2.194e-08,2.194e-08,2.1950000000000001e-08,2.1950000000000001e-08,2.1959999999999999e-08,2.1969999999999998e-08,2.199e-08,2.2000000000000002e-08,2.2019999999999998e-08,2.2050000000000002e-08,2.2089999999999998e-08,2.2099999999999999e-08,2.2139999999999998e-08,2.215e-08,2.215e-08,2.215e-08,2.215e-08,2.215e-08,2.215e-08,2.2160000000000001e-08,2.2160000000000001e-08,2.2160000000000001e-08,2.2160000000000001e-08,2.2160000000000001e-08,2.2170000000000003e-08,2.2170000000000003e-08,2.2170000000000003e-08,2.2170000000000003e-08,2.2170000000000003e-08,2.2180000000000001e-08,2.2189999999999999e-08,2.22e-08,2.222e-08,2.2230000000000001e-08,2.2259999999999999e-08,2.227e-08,2.227e-08,2.2299999999999998e-08,2.2320000000000001e-08,2.2320000000000001e-08,2.2320000000000001e-08,2.2350000000000002e-08,2.236e-08,2.2369999999999998e-08,2.2369999999999998e-08,2.2369999999999998e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2379999999999999e-08,2.2390000000000001e-08,2.2390000000000001e-08,2.2390000000000001e-08,2.2409999999999997e-08,2.2409999999999997e-08,2.2419999999999998e-08,2.2419999999999998e-08,2.243e-08,2.2440000000000001e-08,2.2440000000000001e-08,2.2460000000000001e-08,2.2460000000000001e-08,2.2460000000000001e-08,2.2529999999999997e-08,2.2539999999999999e-08,2.2539999999999999e-08,2.255e-08,2.2560000000000002e-08,2.2560000000000002e-08,2.2560000000000002e-08,2.2570000000000003e-08,2.2570000000000003e-08,2.2570000000000003e-08,2.2579999999999998e-08,2.2589999999999999e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2600000000000001e-08,2.2610000000000002e-08,2.2610000000000002e-08,2.2610000000000002e-08,2.2610000000000002e-08,2.262e-08,2.262e-08,2.2649999999999998e-08,2.2649999999999998e-08,2.2659999999999999e-08,2.2699999999999998e-08,2.2699999999999998e-08,2.2699999999999998e-08,2.271e-08,2.2720000000000001e-08,2.2720000000000001e-08,2.2720000000000001e-08,2.2730000000000002e-08,2.2749999999999999e-08,2.2749999999999999e-08,2.276e-08,2.2769999999999998e-08,2.2769999999999998e-08,2.2790000000000001e-08,2.2790000000000001e-08,2.2809999999999997e-08,2.2809999999999997e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.2819999999999999e-08,2.283e-08,2.283e-08,2.283e-08,2.283e-08,2.283e-08,2.283e-08,2.2840000000000001e-08,2.2850000000000003e-08,2.2850000000000003e-08,2.29e-08,2.29e-08,2.2919999999999999e-08,2.2929999999999998e-08,2.2929999999999998e-08,2.2929999999999998e-08,2.2929999999999998e-08,2.295e-08,2.295e-08,2.295e-08,2.2970000000000003e-08,2.2970000000000003e-08,2.2979999999999998e-08,2.302e-08,2.3029999999999998e-08,2.3029999999999998e-08,2.3029999999999998e-08,2.3029999999999998e-08,2.3029999999999998e-08,2.3029999999999998e-08,2.304e-08,2.304e-08,2.304e-08,2.304e-08,2.304e-08,2.3049999999999998e-08,2.3049999999999998e-08,2.3049999999999998e-08,2.3059999999999999e-08,2.3059999999999999e-08,2.3070000000000001e-08,2.311e-08,2.3130000000000003e-08,2.3130000000000003e-08,2.318e-08,2.3190000000000001e-08,2.3199999999999999e-08,2.3199999999999999e-08,2.3199999999999999e-08,2.3209999999999997e-08,2.3209999999999997e-08,2.3209999999999997e-08,2.3219999999999999e-08,2.323e-08,2.3250000000000003e-08,2.3259999999999998e-08,2.3269999999999999e-08,2.3280000000000001e-08,2.3290000000000002e-08,2.3290000000000002e-08,2.33e-08,2.33e-08,2.332e-08,2.332e-08,2.3350000000000001e-08,2.3379999999999998e-08,2.3420000000000001e-08,2.3420000000000001e-08,2.3429999999999999e-08,2.3429999999999999e-08,2.346e-08,2.3470000000000001e-08,2.3479999999999999e-08,2.3479999999999999e-08,2.3489999999999997e-08,2.3489999999999997e-08,2.351e-08,2.3520000000000001e-08,2.3530000000000003e-08,2.3560000000000001e-08,2.36e-08,2.3609999999999998e-08,2.3640000000000002e-08,2.3649999999999997e-08,2.3659999999999998e-08,2.3659999999999998e-08,2.367e-08,2.37e-08,2.3709999999999999e-08,2.3750000000000001e-08,2.3769999999999997e-08,2.379e-08,2.3800000000000001e-08,2.3850000000000002e-08,2.3879999999999999e-08,2.3889999999999998e-08,2.3889999999999998e-08,2.3920000000000002e-08,2.3920000000000002e-08,2.3939999999999998e-08,2.3989999999999998e-08,2.407e-08,2.4080000000000001e-08,2.4109999999999999e-08,2.412e-08,2.412e-08,2.414e-08,2.4229999999999999e-08,2.4310000000000001e-08,2.4339999999999998e-08,2.4339999999999998e-08,2.4360000000000001e-08,2.4360000000000001e-08,2.4410000000000002e-08,2.4459999999999999e-08,2.4520000000000001e-08,2.4570000000000001e-08,2.4570000000000001e-08,2.4570000000000001e-08,2.4570000000000001e-08,2.4690000000000001e-08,2.4779999999999998e-08,2.4810000000000002e-08,2.4859999999999999e-08,2.4930000000000002e-08,2.5019999999999998e-08,2.5040000000000001e-08,2.5040000000000001e-08,2.5050000000000003e-08,2.5179999999999998e-08,2.5280000000000002e-08,2.5959999999999999e-08,2.627e-08,2.6499999999999999e-08,2.655e-08,2.679e-08,2.7459999999999999e-08,2.7930000000000003e-08,3.0059999999999999e-08,3.0249999999999996e-08,3.0639999999999995e-08,3.1349999999999999e-08,3.1360000000000004e-08,3.173e-08,3.229e-08],"896":[0.00018431624999999999,0.00018477666666666666,0.00018817533333333333,0.00018972814285714287,0.00019038499999999997,0.00019056666666666665,0.00019122424999999999,0.00019164833333333334,0.00019168666666666666,0.00019244466666666667,0.00019272966666666666,0.000192876,0.00019288549999999999,0.00019289599999999999,0.00019290425000000001,0.00019290900000000001,0.000192914,0.000192914,0.00019292100000000001,0.00019292100000000001,0.00019292499999999999,0.000192929,0.00019293000000000001,0.000192933,0.00019293466666666669,0.00019293500000000001,0.000192936,0.000192938,0.00019293899999999999,0.00019294000000000001,0.00019294200000000001,0.000192943,0.00019294700000000001,0.00019295,0.00019295400000000001,0.00019295900000000001,0.00019296600000000001,0.000192969,0.00019297100000000001,0.00019297199999999999,0.00019297199999999999,0.000192976,0.000192976,0.00019298699999999999,0.00019299399999999999,0.00019299599999999999,0.000193012,0.00019302300000000001,0.000193029,0.00019303199999999999,0.00019305099999999999,0.00019305799999999999,0.00019306799999999999,0.00019390600000000001,0.000194129,0.00019459979591836734,0.000194747,0.00019553300000000001,0.000195535275,0.00019641146808510639,0.00019655755555555556,0.00019669679591836735,0.00019709475609756095,0.0001975345918367347,0.00019794833333333333,0.00019800725531914892,0.00019808716666666666,0.00019835489795918366,0.00019839293617021278,0.00019845045454545452,0.00019847777551020409,0.00019848188372093023,0.00019859429787234042,0.00019878434693877551,0.00019892153061224491,0.00019893148979591838,0.00019898075000000001,0.00019910234042553191,0.0001991037142857143,0.00019912779591836733,0.00019915418367346939,0.00019922960000000003,0.00019930722448979591,0.00019937787755102042,0.0001994352244897959,0.00019955071428571429,0.00019956600000000001,0.00019996832653061225,0.00020009183673469388,0.00020011534693877551,0.00020014244897959184,0.00020014414285714284,0.0002003252448979592,0.00020032836734693875,0.00020034038775510203,0.00020042767346938777,0.00020045983673469387,0.00020057195918367346,0.00020058899999999999,0.00020062024999999999,0.00020067055319148935,0.00020074522448979592,0.00020075209999999998,0.00020076716326530611,0.00020097755102040815,0.00020100497959183673,0.00020110630434782607,0.00020110936734693877,0.00020112832653061224,0.00020114010204081632,0.00020116350000000001,0.00020118425000000001,0.00020133131249999999,0.00020142971111111112,0.00020146310204081631,0.00020147948979591838,0.00020155241860465118,0.0002015835625,0.0002015995306122449,0.00020165557142857145,0.0002016614693877551,0.00020171857142857141,0.00020177163265306121,0.0002018742448979592,0.00020199806122448981,0.00020202533333333334,0.00020205104444444443,0.00020212212244897959,0.00020213300000000001,0.00020214960000000001,0.00020221273469387758,0.00020223081632652956,0.00020227900000000001,0.00020230749999999999,0.00020231025000000001,0.00020231099999999999,0.00020231166666666666,0.00020231399999999999,0.00020232099999999999,0.00020232238775510204,0.00020232799999999999,0.00020232799999999999,0.00020233299999999999,0.000202334,0.00020233800000000001,0.00020234100000000001,0.00020234349999999999,0.00020234450000000001,0.000202351,0.00020235399999999999,0.00020235460000000001,0.00020235500000000001,0.00020235699999999999,0.00020235699999999999,0.000202358,0.00020236200000000001,0.00020236599999999999,0.00020236700000000001,0.00020236900000000001,0.00020237,0.00020237400000000001,0.00020237400000000001,0.000202375,0.000202377,0.00020238,0.000202382,0.000202387,0.000202389,0.000202394,0.000202394,0.000202394,0.000202396,0.000202399,0.00020239999999999999,0.00020240199999999999,0.00020240300000000001,0.00020240699999999999,0.000202411,0.00020241399999999999,0.00020241700000000001,0.00020242,0.00020242400000000001,0.00020242599999999999,0.00020242599999999999,0.00020242599999999999,0.00020242799999999999,0.00020243299999999999,0.00020243299999999999,0.000202435,0.00020243600000000001,0.00020243600000000001,0.00020243600000000001,0.000202437,0.00020243799999999999,0.00020243799999999999,0.000202439,0.000202444,0.00020244499999999999,0.00020244699999999999,0.000202451,0.00020245300000000001,0.000202454,0.000202454,0.00020246000000000001,0.000202461,0.00020247099999999999,0.00020247400000000001,0.00020247400000000001,0.00020247900000000001,0.00020252582222222222,0.00020254299999999999,0.000202549,0.00020274624999999999,0.00020276783333333332,0.00020277871111111111,0.00020298899999999999,0.00020302763829787234,0.00020303104166666667,0.00020309770212765957,0.00020334355319148937,0.00020358873333333334,0.00020360254166666667,0.00020368639583333333,0.000203718,0.00020391272340425533,0.00020409363636363635,0.00020413060465116278,0.00020456900000000001,0.00020482599999999999,0.00020486793478260868,0.00020514015555555553,0.00020517329545454544,0.00020603918181818183,0.00020636999999999999,0.0002064369069767442,0.00020648800000000001,0.00020657004545454545,0.00020674093333333332,0.00020702760526315788,0.00020728042222222223,0.00020740934782608695,0.00020742449999999998,0.00020762011363636363,0.00020778044444444446,0.00020787799999999999,0.00020803400000000001,0.00020826800000000001,0.000208273,0.00020988848888888888,0.0002099903777777778,0.00021010064285714286,0.00021115993333333335,0.00021116838297872341,0.00021143980000000001,0.00021164759999999999,0.00021699022222222223,0.00021729025000000001,0.000218366,0.00021837700000000001,0.00021837899999999999,0.00021842500000000001,0.000218426,0.00021845299999999999,0.00021848000000000001,0.00021848500000000001,0.00021849700000000001,0.00021856922222222223,0.00022087499999999999,0.00022113076744186049,0.00022119806818181816,0.00022291252380952383,0.00022533000000000001,0.000233024,0.00036945800000000003,0.00037364499999999998,0.00037461599999999998,0.00039081800000000002,0.00041117150000000001,0.00041916799999999998,0.000422409,0.0015244900000000001],"3584":[0.0030026100000000002,0.0030153509999999999,0.0030219829999999998,0.0030249169999999998,0.0030273510000000002,0.0030280350000000001,0.0030308850000000001,0.0030359060000000001,0.0030393830000000001,0.0030433600000000002,0.0030452293333333331,0.0030492370000000002,0.0030506980000000001,0.0030527369999999998,0.0030546670000000001,0.003054686,0.003056886,0.0030568980000000002,0.0030571029999999998,0.0030612576666666663,0.0030651400000000001,0.0030663399999999999,0.0030690779999999998,0.003069273,0.0030694939999999999,0.0030705379999999998,0.0030705870000000001,0.003072048,0.003073414,0.003076299666666667,0.003076788,0.0030769743333333333,0.0030775273333333332,0.0030784250000000001,0.0030785399999999998,0.0030813820000000001,0.003081402,0.0030824160000000001,0.0030843929999999999,0.0030844996666666668,0.0030860169999999999,0.0030885180000000002,0.0030901006666666665,0.0030913260000000001,0.0030917129999999998,0.0030922063333333333,0.00309254,0.003093967,0.003094084,0.0030940949999999998,0.003096419,0.0030977350000000003,0.0030979795,0.0030981189999999999,0.0030985370000000002,0.0030989530000000002,0.0030991289999999999,0.0030994809999999999,0.0031016833333333336,0.0031026343333333331,0.0031028559999999998,0.0031034230000000001,0.0031035669999999998,0.0031059690000000001,0.0031075359999999997,0.0031092710000000003,0.0031100839999999999,0.0031108636666666665,0.0031121233333333332,0.0031124019999999998,0.003113266,0.0031132880000000001,0.0031136480000000001,0.0031141446666666669,0.0031144099999999997,0.0031157543333333333,0.003116667,0.0031184103333333334,0.003120107,0.0031202999999999999,0.0031203406666666668,0.003120874,0.0031210156666666663,0.003121909,0.0031232270000000001,0.0031233630000000001,0.0031234616666666669,0.0031256330000000001,0.0031257886666666668,0.0031264776666666667,0.0031266079999999999,0.00312846,0.0031291016666666668,0.0031297,0.0031300719999999998,0.0031324136666666669,0.0031327600000000001,0.003132761,0.0031331363333333331,0.0031347240000000002,0.0031358386666666665,0.0031359690000000002,0.0031363816666666669,0.0031365909999999998,0.0031366549999999999,0.0031377499999999999,0.0031383413333333329,0.0031385993333333333,0.0031399286666666665,0.0031401936666666671,0.0031404916666666668,0.0031419159999999998,0.0031423470000000002,0.0031425396666666665,0.0031426933333333334,0.0031452910000000001,0.0031454569999999999,0.003147047,0.0031488086666666671,0.00314906,0.0031490646666666668,0.0031494359999999998,0.0031494553333333334,0.0031496409999999999,0.0031501749999999999,0.0031504990000000002,0.0031524159999999999,0.0031530446666666666,0.0031533499999999996,0.0031535903333333331,0.0031539755,0.0031544164999999999,0.0031549719999999998,0.0031561666666666665,0.0031563833333333336,0.0031572330000000002,0.0031581090000000001,0.0031590199999999998,0.003159505,0.0031595360000000001,0.0031597840000000001,0.00316103,0.0031611579999999998,0.0031616610000000001,0.0031627180000000001,0.0031640736666666666,0.0031664969999999999,0.0031665600000000001,0.0031672450000000004,0.003167362,0.0031682609999999999,0.0031690429999999999,0.0031701916666666669,0.0031707213333333332,0.003171084333333333,0.0031719840000000001,0.0031721490000000004,0.0031735579999999999,0.0031735999999999999,0.003174518333333333,0.0031746656666666664,0.0031763373333333332,0.0031770449999999999,0.0031782856666666671,0.0031787393333333335,0.0031789576666666664,0.0031791635000000002,0.0031793713333333334,0.0031802969999999999,0.0031803779999999998,0.0031807290000000002,0.0031820199999999998,0.0031828120000000001,0.0031851739999999998,0.0031857369999999997,0.003186192,0.0031862763333333332,0.0031870589999999999,0.0031877699999999999,0.0031885580000000002,0.0031891250000000001,0.0031899739999999999,0.0031902215000000002,0.0031904010000000003,0.0031928199999999999,0.0031937523333333329,0.0031949719999999999,0.0031968629999999999,0.003196969,0.0031970166666666668,0.0031971295000000001,0.0031975939999999998,0.0031978503333333335,0.0031991070000000001,0.00320003,0.0032000499999999999,0.003200063,0.0032001669999999999,0.0032031210000000002,0.0032032166666666668,0.0032049153333333336,0.003205313,0.0032065209999999999,0.0032071119999999998,0.00320843,0.0032088429999999999,0.003209089,0.0032102695000000001,0.0032112260000000002,0.0032129930000000004,0.003218023,0.003218463,0.0032196423333333331,0.0032207,0.0032207920000000001,0.0032233603333333334,0.003225491,0.0032256720000000002,0.0032292126666666667,0.0032294963333333333,0.003229637,0.0032311903333333333,0.0032331170000000002,0.0032348379999999999,0.0032355800000000001,0.0032361649999999996,0.0032406499999999999,0.0032419549999999999,0.0032427773333333332,0.003244528,0.0032489283333333335,0.0032499360000000001,0.0032585123333333335,0.0032590090000000002,0.0032594045000000002,0.0032679969999999999,0.0032726610000000001,0.003273258333333333,0.0032785350000000004,0.0032820176666666667,0.0032867665000000002,0.0032908390000000003,0.0032943310000000002,0.003294595,0.0033036063333333333,0.0033476690000000002,0.0033514514999999998,0.003351962,0.0033543230000000002,0.0033611890000000001,0.0033772609999999999,0.0033942680000000002,0.003398023,0.0034006269999999998,0.0034013400000000001,0.0034070910000000001,0.0034148220000000001,0.0034152649999999998,0.0034158270000000002,0.0034161619999999999,0.003416611,0.0034182779999999999,0.0034186300000000002,0.0034209349999999999,0.0034223249999999999,0.0034371919999999999,0.0034388374999999999,0.0034406710000000002,0.003442184,0.003466514,0.0034705000000000001,0.0034980935,0.0035385770000000002,0.0049246150000000002,0.0063965259999999996,0.006543409,0.0068958689999999998,0.0074633800000000004,0.0080006859999999999,0.0086532139999999994,0.0097036275000000009],"40960":[0.40164273499999997,0.40323229300000002,0.40335641700000002,0.40363936899999997,0.40455317099999999,0.40499997500000001,0.405079297,0.40529101150000002,0.40531024599999999,0.40533479500000003,0.405420699,0.40543918400000001,0.40578456399999996,0.40579284399999999,0.40584989500000002,0.40622482900000001,0.40630857799999998,0.40649369800000001,0.40654389400000002,0.40661521849999999,0.406648654,0.4066492585,0.40665078199999999,0.40693352399999999,0.40696355100000003,0.40698843600000001,0.40704079500000001,0.407122767,0.40713333899999998,0.40719127399999999,0.40720246299999996,0.40721709299999997,0.40722366700000001,0.40724174749999997,0.40728232250000002,0.40732520799999999,0.4074177645,0.40747245899999995,0.40751499000000002,0.40763507249999997,0.40763789800000005,0.40773081150000001,0.40780923200000002,0.40787511099999996,0.40789186500000002,0.40796960300000001,0.40804729649999999,0.40806383099999999,0.40817519600000002,0.4083058645,0.40830865700000002,0.40835283049999999,0.40835707500000001,0.40838381300000004,0.40844629500000001,0.40850896199999998,0.40856581800000003,0.40856710499999999,0.40866050700000001,0.40868821499999997,0.40874070699999998,0.40875690149999999,0.408792816,0.40879415699999999,0.40880289349999999,0.40880376549999997,0.40883244600000002,0.40894722350000001,0.40902159300000002,0.409097865,0.40910834299999999,0.40914525899999998,0.40916105899999999,0.409201017,0.40920560150000002,0.40922274999999997,0.40926551300000003,0.40930936299999998,0.40935986200000002,0.40946159100000001,0.40951388899999996,0.409519613,0.409521048,0.40952268800000002,0.40955568799999997,0.40960705400000003,0.40968335500000003,0.409717267,0.40981392799999999,0.40983678649999999,0.40984180799999997,0.40984809550000001,0.40991268749999998,0.41003142100000001,0.41005654600000002,0.41010940000000001,0.410129996,0.41015825950000001,0.41019398600000001,0.41022365100000002,0.41023824199999998,0.41024548399999999,0.41025381449999998,0.41030964400000003,0.41035261150000002,0.41038137499999999,0.41052256300000001,0.410542301,0.41057154899999998,0.41060498299999998,0.41064121100000001,0.41066003449999999,0.410683558,0.41081835550000001,0.41082435899999997,0.410826998,0.41085351299999995,0.41085531500000005,0.410879575,0.41094196550000001,0.41096183749999998,0.41100164300000003,0.41101726150000001,0.41104639100000001,0.41105890899999997,0.41107669499999999,0.41111029900000001,0.41111380050000002,0.41115770100000004,0.411174439,0.41118804599999997,0.41140330700000005,0.411414528,0.41142773999999999,0.41146088600000003,0.411473592,0.41151888800000003,0.411560013,0.411567022,0.41158821700000003,0.41172624400000002,0.411794879,0.41180341650000002,0.41187539449999999,0.41189486199999997,0.41194893700000002,0.41195632300000001,0.41205756650000003,0.41224104099999997,0.412293623,0.41235672699999998,0.41242574399999998,0.41252817399999997,0.41265954399999999,0.412713422,0.41273810399999999,0.41284483000000005,0.4128769155,0.412904779,0.41295874850000003,0.41297063099999998,0.41297915149999997,0.41310530150000002,0.41310908899999998,0.41319411649999999,0.41322793400000002,0.41325100149999999,0.41327357199999998,0.4133579725,0.4134236745,0.413517988,0.41368763650000001,0.41370797300000001,0.41371475050000001,0.41374073700000003,0.41380514700000004,0.414007083,0.41416269699999997,0.414174292,0.41421865600000002,0.41430066399999999,0.41431056199999999,0.41455067400000001,0.41456487800000003,0.41469708399999999,0.41472483049999997,0.41473525700000002,0.41480370999999999,0.41483819350000001,0.41494697600000002,0.414962469,0.41524742650000002,0.41526071199999998,0.41531191099999998,0.41540832900000002,0.415542368,0.41558064950000001,0.41580837850000002,0.41586903099999994,0.41586972900000002,0.41588070700000002,0.41594072900000001,0.41594621399999998,0.416023531,0.41629716900000002,0.41635298599999998,0.41641236399999998,0.416517955,0.41657293900000003,0.41660894199999998,0.41662393949999998,0.41666063600000003,0.41666796449999999,0.416691592,0.416746905,0.41677982400000002,0.41688805600000001,0.41695205499999999,0.41697697600000005,0.4170256275,0.41722154099999997,0.41723949650000003,0.41724154200000002,0.41741834550000001,0.41744968399999999,0.4175074205,0.41787571000000001,0.41790243199999999,0.41796223500000002,0.41798506749999997,0.418102001,0.41810781600000002,0.418245437,0.41846218199999996,0.41847329350000001,0.41862581049999997,0.41868733050000001,0.41869522749999999,0.41885583999999998,0.41898701900000002,0.41902632750000002,0.41904187599999998,0.41932911500000003,0.41936833600000001,0.41937048399999999,0.419427143,0.41947029499999999,0.41955127749999999,0.4196657225,0.41992391499999998,0.42016094399999998,0.42023975600000002,0.42065693199999998,0.42097205599999998,0.420974705,0.42117691899999998,0.42141713549999998,0.42167500299999999,0.422006461,0.42265189299999995,0.42329449750000003,0.42564909200000001,0.42730100700000001,0.42880874699999999,0.42888490000000001,0.42961861749999997,0.43997650799999999,0.44507810799999997,0.44736031100000001,0.44826458499999999,0.44869713600000005,0.44893164899999999,0.46431683099999999,0.49875015249999999,0.95975509599999997,1.0263068845000001,1.0531117940000001,1.084540093,1.1221192325,1.1897620634999999,1.247039228],"1536":[0.00053489100000000001,0.00053489200000000003,0.00053492000000000004,0.00053492199999999996,0.00053544900000000002,0.00053786600000000002,0.00055415399999999995,0.00055975399999999998,0.00055976799999999998,0.00055977900000000005,0.00055978400000000002,0.00055978699999999996,0.00055979399999999996,0.00055979499999999998,0.00055979800000000002,0.00055980199999999998,0.00055981,0.00055981200000000003,0.00055981300000000004,0.000559817,0.00055982500000000001,0.00055983200000000002,0.00055983400000000005,0.000559845,0.00055984999999999997,0.00055985500000000005,0.00055987400000000003,0.00055987599999999995,0.00055987599999999995,0.00055988499999999998,0.00055988999999999995,0.00055989600000000005,0.00055990399999999996,0.00055992300000000004,0.00055993099999999995,0.00056131499999999995,0.00056148400000000001,0.00056192700000000004,0.00056301699999999997,0.00056358999999999999,0.00056373800000000004,0.00056404299999999997,0.00056458400000000003,0.00056543700000000001,0.00056573300000000001,0.00056573500000000004,0.00056594299999999996,0.000566028,0.00056626435294117642,0.00056631599999999998,0.00056703011764705881,0.00056823479999999998,0.00056831399999999999,0.00056841900000000002,0.00056944660000000002,0.00056959112499999998,0.00056974499999999997,0.00056978711764705885,0.00057068199999999998,0.00057084947058823527,0.00057094899999999996,0.00057102800000000001,0.00057110005882352944,0.00057116899999999995,0.0005712791764705882,0.00057131800000000002,0.00057137156250000002,0.00057140000000000001,0.00057194099999999996,0.00057249370588235299,0.00057257217647058818,0.00057279513333333327,0.00057310258823529405,0.00057311500000000002,0.00057317035294117652,0.00057353299999999999,0.0005736594375,0.00057368299999999996,0.00057438400000000005,0.00057500800000000001,0.00057514874999999997,0.00057520381250000005,0.00057569299999999995,0.00057577599999999996,0.0005760981176470588,0.00057691899999999996,0.00057699599999999998,0.00057715533333333325,0.00057728281250000004,0.00057732129411764701,0.00057738568749999999,0.00057798500000000004,0.00057824937499999999,0.00057850399999999998,0.00057866235294117647,0.00057885306250000002,0.00057896879999999996,0.00057910899999999996,0.00057922500000000005,0.00057941933333333334,0.00057959364705882361,0.00057969552941176472,0.00058130182352941176,0.00058134799999999998,0.00058138099999999996,0.00058150152941176475,0.00058248788235294117,0.000582527,0.00058266087500000001,0.00058274743749999998,0.00058276200000000002,0.00058281052941176476,0.00058298900000000001,0.00058307147058823526,0.00058352162500000004,0.00058359247058823523,0.00058368694117647067,0.00058381399999999999,0.0005839358823529412,0.00058433882352941177,0.00058489700000000002,0.00058492135294117647,0.00058497949999999996,0.00058553200000000004,0.00058577456249999998,0.00058583993333333336,0.00058593999999999996,0.00058595105882352941,0.00058597900000000004,0.00058608512500000001,0.0005862866470588235,0.00058634033333333324,0.00058650800000000002,0.0005865301176470588,0.00058708499999999999,0.00058708600000000001,0.00058708600000000001,0.00058708899999999995,0.00058709099999999998,0.00058709099999999998,0.00058709500000000004,0.00058709799999999998,0.00058710299999999995,0.00058711099999999997,0.00058711600000000005,0.00058711699999999996,0.00058712200000000003,0.000587127,0.00058713400000000001,0.00058713500000000002,0.00058713999999999999,0.00058714100000000001,0.00058714100000000001,0.00058714300000000004,0.00058714699999999999,0.00058714800000000001,0.00058714800000000001,0.00058717000000000003,0.00058717100000000005,0.00058718400000000003,0.00058718599999999996,0.00058718699999999997,0.00058718900000000001,0.00058719000000000002,0.00058719899999999995,0.00058719999999999996,0.00058720099999999998,0.00058720300000000001,0.00058720400000000002,0.00058721700000000001,0.00058721900000000004,0.00058722199999999998,0.00058723,0.000587244,0.00058724700000000005,0.00058725300000000004,0.00058726187500000003,0.00058726399999999999,0.000587299,0.000587306,0.00058737700000000004,0.00058739399999999998,0.00058741499999999999,0.00058744199999999998,0.00058744500000000002,0.00058747200000000002,0.00058747300000000003,0.000587547,0.00058754900000000004,0.00058766350000000005,0.00058797275000000001,0.00058823299999999996,0.0005882364375,0.000588467125,0.00058848825000000005,0.00058856331250000001,0.00058861600000000003,0.00058862300000000003,0.00058862300000000003,0.00058877099999999998,0.00058887418749999998,0.00058911862500000002,0.00058919400000000002,0.00058936737499999995,0.000589874,0.00059022999999999996,0.00059032699999999997,0.00059046593750000003,0.00059050400000000005,0.00059051299999999998,0.00059077299999999995,0.00059081300000000004,0.00059092499999999996,0.00059111099999999996,0.00059130825,0.00059132812499999995,0.00059150031249999996,0.00059164973333333327,0.00059214000000000001,0.000592498,0.00059266837499999999,0.00059281899999999996,0.00059327256249999997,0.00059361112500000001,0.00059437974999999995,0.00059661218749999996,0.00059672499999999999,0.000597063,0.00059736312499999999,0.00059751993749999996,0.00059846318750000004,0.00059865025000000003,0.00059909012499999997,0.00059930824999999998,0.00059984399999999998,0.00060021100000000002,0.00060048125000000002,0.00060140400000000004,0.00060348300000000004,0.00060397624999999997,0.00060398506666666668,0.000604445,0.00060530818750000005,0.00060548713333333335,0.00060581331250000002,0.0006086403333333334,0.00061035681249999995,0.00061071156250000003,0.00061227899999999997,0.00061526646666666663,0.0006158564666666667,0.00061764419999999994,0.00061840460000000001,0.00061941753333333326,0.00062584266666666658,0.0006280491333333333,0.00062824153333333342,0.00062987406666666665,0.000630687,0.00063134866666666664,0.00063327806666666668,0.000633524,0.00063354899999999996,0.000633586,0.00063360499999999998,0.00063365000000000003,0.00063365350000000003,0.00063369999999999995,0.00063376100000000005,0.00063395053333333332,0.00064062799999999997,0.00064346599999999998,0.00064555000000000005,0.0011311405000000001,0.0011842671428571427,0.0012017040000000001,0.001238889,0.0012449130000000001,0.001331846,0.001355818,0.0018760018],"12":[4.1969999999999998e-08,4.4390000000000002e-08,4.4390000000000002e-08,4.461e-08,4.461e-08,4.4619999999999999e-08,4.4630000000000003e-08,4.4780000000000001e-08,4.4829999999999998e-08,4.4839999999999997e-08,4.4839999999999997e-08,4.4850000000000001e-08,4.489e-08,4.5040000000000005e-08,4.5050000000000003e-08,4.5050000000000003e-08,4.5059999999999995e-08,4.5069999999999999e-08,4.5079999999999997e-08,4.5120000000000003e-08,4.5279999999999999e-08,4.5279999999999999e-08,4.5279999999999999e-08,4.5290000000000004e-08,4.5290000000000004e-08,4.5290000000000004e-08,4.5360000000000004e-08,4.5370000000000002e-08,4.5370000000000002e-08,4.5389999999999998e-08,4.5410000000000001e-08,4.5460000000000005e-08,4.5460000000000005e-08,4.5469999999999996e-08,4.5480000000000001e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5499999999999997e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.5510000000000002e-08,4.552e-08,4.552e-08,4.5569999999999997e-08,4.5569999999999997e-08,4.566e-08,4.5680000000000003e-08,4.5709999999999997e-08,4.5719999999999995e-08,4.5719999999999995e-08,4.5719999999999995e-08,4.5719999999999995e-08,4.5719999999999995e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.573e-08,4.5739999999999998e-08,4.5820000000000003e-08,4.5830000000000001e-08,4.5830000000000001e-08,4.5859999999999995e-08,4.5879999999999998e-08,4.5889999999999996e-08,4.5889999999999996e-08,4.5900000000000001e-08,4.5920000000000004e-08,4.5930000000000002e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5940000000000006e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5949999999999998e-08,4.5959999999999996e-08,4.5959999999999996e-08,4.5959999999999996e-08,4.5959999999999996e-08,4.5959999999999996e-08,4.5959999999999996e-08,4.5970000000000001e-08,4.5970000000000001e-08,4.6059999999999997e-08,4.608e-08,4.608e-08,4.6129999999999997e-08,4.6140000000000002e-08,4.615e-08,4.615e-08,4.6160000000000004e-08,4.6160000000000004e-08,4.6160000000000004e-08,4.6160000000000004e-08,4.6160000000000004e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6170000000000002e-08,4.6179999999999994e-08,4.6229999999999998e-08,4.6229999999999998e-08,4.6250000000000001e-08,4.6280000000000001e-08,4.6340000000000003e-08,4.6349999999999995e-08,4.6349999999999995e-08,4.6349999999999995e-08,4.6369999999999998e-08,4.6369999999999998e-08,4.6380000000000002e-08,4.6380000000000002e-08,4.6380000000000002e-08,4.639e-08,4.639e-08,4.639e-08,4.639e-08,4.639e-08,4.639e-08,4.639e-08,4.6399999999999999e-08,4.6399999999999999e-08,4.6439999999999998e-08,4.646e-08,4.6480000000000003e-08,4.6480000000000003e-08,4.6490000000000001e-08,4.6509999999999998e-08,4.6560000000000001e-08,4.6569999999999999e-08,4.6609999999999998e-08,4.6609999999999998e-08,4.6609999999999998e-08,4.6609999999999998e-08,4.6609999999999998e-08,4.6609999999999998e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6619999999999997e-08,4.6630000000000001e-08,4.6700000000000001e-08,4.6709999999999999e-08,4.6820000000000005e-08,4.6820000000000005e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6829999999999996e-08,4.6840000000000001e-08,4.6840000000000001e-08,4.6840000000000001e-08,4.6929999999999997e-08,4.7010000000000002e-08,4.7010000000000002e-08,4.7050000000000001e-08,4.7060000000000006e-08,4.7060000000000006e-08,4.7060000000000006e-08,4.716e-08,4.7269999999999999e-08,4.7280000000000004e-08,4.7380000000000005e-08,4.7400000000000001e-08,4.7489999999999997e-08,4.751e-08,4.758e-08,4.758e-08,4.7589999999999998e-08,4.7620000000000006e-08,4.7620000000000006e-08,4.7629999999999997e-08,4.7639999999999995e-08,4.7859999999999993e-08,4.7859999999999993e-08,4.7859999999999993e-08,4.7859999999999993e-08,4.8080000000000004e-08,4.8080000000000004e-08,4.8090000000000002e-08,4.8090000000000002e-08,4.8099999999999994e-08,4.8189999999999997e-08,4.8319999999999999e-08,4.8319999999999999e-08,4.8319999999999999e-08,4.8429999999999998e-08,4.8480000000000001e-08,4.8480000000000001e-08,4.8500000000000004e-08,4.8539999999999997e-08,4.8539999999999997e-08,4.8559999999999999e-08,4.8690000000000001e-08,4.8740000000000005e-08,4.901e-08,4.901e-08,4.9119999999999999e-08,4.9239999999999996e-08,4.9370000000000005e-08,4.9470000000000006e-08,4.964e-08,5.0150000000000002e-08,5.016e-08,5.0189999999999995e-08,5.0189999999999995e-08,5.0189999999999995e-08,5.0479999999999999e-08,5.0919999999999995e-08,5.0919999999999995e-08,5.1070000000000007e-08,5.1089999999999996e-08,5.1240000000000001e-08,5.1270000000000002e-08,5.1380000000000001e-08,5.1410000000000002e-08,5.1889999999999997e-08,5.3179999999999997e-08,5.3600000000000004e-08,5.4459999999999999e-08,5.4609999999999997e-08,5.4679999999999997e-08,5.4720000000000003e-08,5.4940000000000001e-08,5.4949999999999999e-08,5.5799999999999997e-08,6.3080000000000006e-08,6.3549999999999997e-08,6.4140000000000004e-08,6.4899999999999992e-08,6.5919999999999997e-08,6.8120000000000004e-08],"2560":[0.001526382,0.001530977,0.00153242,0.0015392629999999999,0.0015424670000000001,0.0015439780000000001,0.001543986,0.0015440289999999999,0.0015440359999999999,0.0015440759999999999,0.0015440810000000001,0.001544141,0.001544197,0.0015463499999999999,0.0015488539999999999,0.0015515069999999999,0.0015526369999999999,0.001552875,0.0015548300000000001,0.001555007,0.0015567179999999999,0.001558959,0.0015596760000000001,0.001559775,0.001560309,0.001560318,0.0015622819999999999,0.0015623480000000001,0.0015635,0.001563638,0.0015638,0.0015648070000000001,0.0015650340000000001,0.001565688,0.0015680329999999999,0.0015682035000000002,0.0015682205000000001,0.001568582,0.0015688449999999999,0.001568971,0.001569897,0.001570269,0.0015705966666666668,0.0015708208333333334,0.0015712460000000001,0.0015713610000000001,0.0015723308333333334,0.001572543,0.001573086,0.0015730919999999999,0.0015756353333333335,0.001575765,0.001576537,0.0015777113333333332,0.001577808,0.0015792355,0.0015799950000000001,0.001580459,0.0015819220000000001,0.001582516,0.0015838676666666666,0.0015841659999999999,0.0015852476666666667,0.0015853620000000001,0.0015855929999999999,0.0015856690000000001,0.0015863990000000001,0.001586484,0.00158691,0.00158708,0.0015876130000000001,0.00159034,0.001590342,0.0015904393333333333,0.0015908891666666666,0.0015909839999999999,0.0015915121666666666,0.0015922711666666667,0.0015930713333333335,0.0015938618333333333,0.0015943839999999999,0.001594792,0.0015949414999999998,0.001595576,0.001596332,0.0015967366666666666,0.001597069,0.0015971895999999999,0.0015973873333333334,0.0015980790000000001,0.001598092,0.0015981223333333334,0.0015984780000000002,0.0015987591666666665,0.0015996271666666667,0.0016000719999999999,0.0016006611666666665,0.0016013220000000001,0.001601437,0.0016014901666666665,0.001601704,0.0016018779999999999,0.0016020105,0.0016020681666666667,0.0016022328333333332,0.0016025366666666669,0.0016032450000000001,0.00160472,0.001604833,0.0016054699999999999,0.0016054998000000001,0.0016055010000000001,0.0016062291666666666,0.0016063384,0.0016066800000000001,0.0016069351666666667,0.0016076928333333335,0.0016078049999999999,0.001608707,0.001609945,0.0016102121666666666,0.001610345,0.0016108901666666666,0.001610942,0.00161097,0.001611705,0.00161174,0.0016119309999999998,0.001612252,0.0016123356666666666,0.0016132379999999999,0.0016134016000000002,0.0016136339999999999,0.0016137664999999999,0.0016138540000000001,0.0016140214999999999,0.0016142755,0.0016148746666666666,0.0016150540000000001,0.001616964,0.001617243,0.0016172777999999999,0.0016177469999999999,0.0016179,0.001618139,0.0016188723333333333,0.0016192870000000001,0.001619313,0.001619321,0.001619363,0.0016193749999999999,0.00161951,0.0016196019999999999,0.001619641,0.0016196419999999999,0.0016196520000000001,0.0016196769999999999,0.001619758,0.0016197841666666666,0.0016198,0.001619933,0.0016209079999999999,0.0016210370000000001,0.0016211349999999999,0.001621188,0.001621424,0.0016215145999999999,0.0016221010000000001,0.0016222540000000001,0.0016223100000000001,0.0016226935000000001,0.0016228211666666666,0.0016228239999999999,0.0016246559999999999,0.0016247989999999999,0.0016258660000000001,0.0016261738333333334,0.0016272751666666667,0.0016273920000000001,0.001627512,0.0016284206666666665,0.0016288539999999999,0.001629548,0.001630034,0.0016301373333333334,0.001630184,0.0016304745000000002,0.0016305033333333333,0.0016307070000000001,0.0016312722000000001,0.001631932,0.0016321370000000001,0.0016321759999999999,0.0016325613333333334,0.0016330973333333334,0.0016332926666666667,0.0016336513333333332,0.0016343410000000001,0.0016346389999999998,0.0016351530000000001,0.001635379,0.0016372105,0.0016374945000000001,0.001638029,0.0016389851666666667,0.0016392659999999999,0.0016394579999999999,0.0016399349999999999,0.0016401373333333332,0.0016410998333333331,0.0016420827999999998,0.0016422788333333334,0.001642496,0.001642957,0.0016438773999999999,0.0016448692,0.0016448751666666669,0.0016470409999999999,0.0016471025999999999,0.0016481883333333332,0.0016485378333333334,0.001648905,0.0016514218,0.001654649,0.001655358,0.0016555478333333334,0.0016566328000000002,0.0016569499999999999,0.001656986,0.0016593681999999999,0.0016648520000000001,0.0016654082,0.0016694899999999998,0.001673983,0.0016743470000000001,0.0016762171999999999,0.0016768372000000001,0.0016768585999999998,0.0016782666000000001,0.0016791250000000001,0.0016825610000000002,0.0016835698000000001,0.0016852938000000001,0.0016863105999999999,0.0016868759999999999,0.001686976,0.00168921,0.0016907604000000001,0.0016913729999999999,0.00169337,0.0016967326,0.0016980318000000001,0.0017058259999999999,0.0017096368000000001,0.0017309838,0.0017450006,0.0017464726,0.0017467202000000001,0.0017469528000000002,0.001747214,0.001747251,0.001747326,0.001748891,0.0017498696,0.0017553919999999999,0.0017610354000000001,0.0017662489999999999,0.001769671,0.0017709567999999998,0.001776031,0.0017784649999999999,0.001785685,0.0018747239999999999,0.0032942980000000002,0.0033458095000000001,0.0034183019999999998,0.0035295449999999998,0.0035469490000000002,0.0038459940000000001,0.0039926930000000003,0.0042735560000000004],"65536":[1.0282885669999999,1.029121323,1.0329623299999999,1.0342680989999999,1.035937887,1.0363244825,1.03900667,1.0399146210000001,1.0402279700000001,1.0404016819999999,1.040747753,1.040897929,1.0418716884999999,1.041952856,1.042112377,1.0422993270000001,1.0424335204999999,1.0424926354999999,1.0429331850000001,1.0429737365,1.043011643,1.0431065115,1.0431420890000001,1.043307617,1.043411179,1.0436152460000001,1.0438991479999999,1.0442111519999999,1.0442207109999999,1.044554848,1.044955732,1.045098128,1.045760005,1.0458028800000001,1.046232922,1.0468810660000001,1.046981312,1.047115861,1.0471377449999999,1.0471854205,1.047425611,1.0474907899999999,1.0476423214999999,1.0479775339999999,1.047998422,1.0480210699999999,1.0480700860000001,1.0481458260000001,1.048357819,1.048520052,1.0485357959999999,1.048627191,1.0488500810000001,1.0488605440000001,1.0489078839999999,1.0489497409999999,1.049052289,1.049222954,1.049379029,1.049485003,1.0495386760000001,1.0496680759999999,1.049739486,1.0497716500000001,1.0497879509999999,1.0498499880000001,1.0498678319999999,1.0499984135,1.0500788210000001,1.0500812319999999,1.050106263,1.050163159,1.0502746110000001,1.050628216,1.0507456099999999,1.050795119,1.0508375885000001,1.0512219250000001,1.051252912,1.0514300505,1.0515249659999999,1.0515624964999999,1.0516092685,1.051669591,1.0517240839999999,1.051753108,1.0517589489999999,1.05181463,1.051904285,1.05195489,1.0522554930000001,1.052259378,1.0522958935,1.0523457064999999,1.0523509965,1.0526742150000001,1.0529343010000001,1.0529363985,1.053003492,1.0530172849999999,1.0530372159999999,1.0530454364999999,1.0530533945,1.053099456,1.0531991009999999,1.053404367,1.053510291,1.053527552,1.0537366379999999,1.0538274889999999,1.0538695250000001,1.0539857210000001,1.0540294335,1.0541139580000001,1.054160379,1.054287207,1.0543118,1.0543504100000001,1.0544231909999999,1.05451842,1.0545306910000001,1.0545569335,1.0545986890000001,1.054757674,1.054815565,1.0549347600000001,1.0549359515000001,1.0550038930000001,1.0550727689999999,1.055105449,1.0552735435,1.0557814480000001,1.055863574,1.0561389640000001,1.0561558310000001,1.0561870435,1.0561975370000001,1.0562169115,1.0563902965,1.0567963360000001,1.0568308310000001,1.0568795820000001,1.0569441610000001,1.0570288065,1.057273425,1.0573565705000001,1.0574409929999999,1.0575341924999999,1.0576249680000001,1.0577825220000001,1.0578744449999999,1.058145989,1.058227947,1.0582554710000001,1.0587581895,1.0587937324999999,1.058887248,1.0589358465000001,1.058953536,1.0590354449999999,1.0592018915000001,1.0593313790000001,1.0594779409999999,1.059550242,1.0595905955,1.0596175839999999,1.0597918705,1.059832122,1.0598496035,1.0601689649999999,1.0606416285,1.0606661694999999,1.060680552,1.0607027515,1.060721815,1.0611229179999999,1.0612693955000001,1.061395417,1.0618403510000001,1.0620235849999999,1.062143142,1.0622244970000001,1.0624216165,1.062429759,1.0625541970000001,1.0626213855,1.0626959519999999,1.062720227,1.0627658659999999,1.062793052,1.062855031,1.0634896820000002,1.0635082469999999,1.063531762,1.0635663120000001,1.0637587405,1.0641620510000001,1.0644427890000001,1.0645242374999999,1.0645243170000001,1.0646145629999999,1.0650499485,1.0652238365,1.0652999599999999,1.0653616989999999,1.0656347184999999,1.0658874014999999,1.065923991,1.066011847,1.0661872214999999,1.0663809559999999,1.0665128165,1.066563178,1.0671966500000001,1.067783908,1.067835892,1.0678910159999999,1.067965418,1.0681987390000001,1.0689834229999999,1.0690197225,1.0691775379999999,1.0696863459999999,1.0698242229999999,1.069832001,1.06993885,1.070114365,1.0702241885000001,1.0708216159999999,1.0718476035,1.0722514460000001,1.0722825170000001,1.0722997350000001,1.072795454,1.073446036,1.073576715,1.074418442,1.074981253,1.075174903,1.0754219165000001,1.075664148,1.0757487434999999,1.0763824529999999,1.0768173565000001,1.0770243100000001,1.0783068070000001,1.0792711690000001,1.0804535849999999,1.0805337344999999,1.0807209959999999,1.0808249575,1.0813672320000001,1.0813876040000001,1.081847886,1.081903093,1.0819397820000001,1.0821635995000001,1.083154548,1.0838486825,1.0851279759999999,1.0889059240000001,1.091936413,1.0931776390000001,1.096113144,1.109986283,1.1109156490000001,1.111591139,1.132832984,1.1448355160000001,1.1466391629999999,1.153657822,1.1630794799999999,1.1746996734999999,2.0000064169999998],"512":[6.1562000000000005e-05,6.1563000000000007e-05,6.1564999999999998e-05,6.1581000000000006e-05,6.1582500000000002e-05,6.1583500000000004e-05,6.1587000000000005e-05,6.1591e-05,6.1605000000000004e-05,6.1606000000000006e-05,6.1606000000000006e-05,6.1606999999999995e-05,6.1610000000000001e-05,6.1610000000000001e-05,6.1618999999999994e-05,6.1620999999999998e-05,6.1630000000000005e-05,6.4298081632653057e-05,6.4327312499999994e-05,6.4415499999999993e-05,6.4420999999999999e-05,6.4432500000000004e-05,6.4438000000000009e-05,6.4443999999999995e-05,6.4445999999999999e-05,6.4448000000000004e-05,6.4448000000000004e-05,6.4448000000000004e-05,6.4449999999999994e-05,6.4449999999999994e-05,6.4451999999999999e-05,6.4453000000000001e-05,6.4455000000000005e-05,6.4456999999999996e-05,6.4456999999999996e-05,6.4459499999999995e-05,6.4461000000000005e-05,6.4462999999999996e-05,6.4463999999999998e-05,6.4466000000000002e-05,6.4467999999999993e-05,6.4468999999999995e-05,6.4469500000000003e-05,6.4472000000000002e-05,6.4473000000000004e-05,6.4474000000000006e-05,6.4474999999999995e-05,6.4474999999999995e-05,6.4482999999999999e-05,6.4487999999999996e-05,6.4488999999999999e-05,6.4491000000000003e-05,6.4492000000000005e-05,6.4492000000000005e-05,6.4494999999999998e-05,6.4498000000000005e-05,6.4498999999999994e-05,6.4499999999999996e-05,6.4499999999999996e-05,6.4502e-05,6.4505999999999995e-05,6.4512999999999997e-05,6.4515000000000001e-05,6.4534000000000002e-05,6.4548999999999995e-05,6.4549999999999997e-05,6.4553000000000003e-05,6.4561999999999996e-05,6.4566000000000005e-05,6.4571000000000002e-05,6.4572000000000005e-05,6.4580999999999997e-05,6.4589000000000001e-05,6.4589000000000001e-05,6.4596000000000003e-05,6.4599999999999998e-05,6.4617999999999997e-05,6.4689000000000004e-05,6.4738333333333337e-05,6.4781849999999994e-05,6.4845999999999995e-05,6.4911000000000002e-05,6.5063333333333331e-05,6.5123638888888889e-05,6.5394574468085112e-05,6.5401306122448983e-05,6.5452222222222214e-05,6.5644069767441861e-05,6.5772249999999997e-05,6.580540540540541e-05,6.5815999999999995e-05,6.5882612244897958e-05,6.5925840909090912e-05,6.5950430000000007e-05,6.5955934782608702e-05,6.5996229999999999e-05,6.5997549999999996e-05,6.6022709999999995e-05,6.6130599999999993e-05,6.6133894736843479e-05,6.6164719999999995e-05,6.6188236842105265e-05,6.6192990000000007e-05,6.6229772727272732e-05,6.623113333333333e-05,6.6438400000000004e-05,6.6472090000000003e-05,6.6568122448979589e-05,6.6570377777777778e-05,6.6572749999999997e-05,6.6601569999999994e-05,6.6620173913043481e-05,6.6708312499999997e-05,6.6728050000000006e-05,6.6803615384615381e-05,6.6809089999999996e-05,6.6857133333333334e-05,6.6871583333333342e-05,6.6923209999999997e-05,6.6926170212765963e-05,6.6956711111111118e-05,6.7075750000000002e-05,6.7106583333333329e-05,6.7112350000000001e-05,6.7211510638297872e-05,6.7223059999999994e-05,6.7241020000000004e-05,6.7263311111111112e-05,6.7274500000000001e-05,6.7298886363636369e-05,6.7304708333333331e-05,6.7319909999999993e-05,6.7320108695652169e-05,6.7336765957446809e-05,6.7341439999999995e-05,6.7357909090909091e-05,6.7419220000000001e-05,6.743067999999999e-05,6.7432499999999995e-05,6.7486399999999998e-05,6.7508200000000005e-05,6.752324e-05,6.7555640000000004e-05,6.7562553191489362e-05,6.7573978260869567e-05,6.7587000000000002e-05,6.7588000000000004e-05,6.7590500000000003e-05,6.759589e-05,6.7600000000000003e-05,6.7600499999999998e-05,6.7602500000000002e-05,6.7602500000000002e-05,6.7602999999999996e-05,6.7605000000000001e-05,6.7607333333333326e-05,6.7608999999999996e-05,6.7612000000000003e-05,6.7612000000000003e-05,6.7612000000000003e-05,6.7612610000000005e-05,6.7614999999999996e-05,6.7615999999999998e-05,6.761911111111112e-05,6.7620999999999995e-05,6.7623e-05,6.7625000000000004e-05,6.7626000000000006e-05,6.7626000000000006e-05,6.7628999999999999e-05,6.7630000000000001e-05,6.7630000000000001e-05,6.7632000000000006e-05,6.7633999999999997e-05,6.7637000000000003e-05,6.7640999999999998e-05,6.7644000000000005e-05,6.7645999999999996e-05,6.7648e-05,6.7648e-05,6.7655000000000002e-05,6.7659999999999999e-05,6.7661000000000002e-05,6.7663999999999995e-05,6.7664999999999997e-05,6.7667000000000001e-05,6.7675999999999994e-05,6.7676999999999996e-05,6.7676999999999996e-05,6.7677999999999998e-05,6.7677999999999998e-05,6.7679404255319148e-05,6.7681000000000005e-05,6.7681999999999993e-05,6.7683999999999998e-05,6.7685e-05,6.7688000000000007e-05,6.7691e-05,6.7691e-05,6.7694629999999996e-05,6.7696999999999999e-05,6.7698000000000001e-05,6.7700000000000006e-05,6.7700999999999994e-05,6.7701999999999997e-05,6.7708999999999998e-05,6.7710000000000001e-05,6.7713999999999996e-05,6.7714999999999998e-05,6.7719000000000007e-05,6.7721500000000005e-05,6.7722e-05,6.7733999999999999e-05,6.7737000000000006e-05,6.7743000000000005e-05,6.7763999999999997e-05,6.7763999999999997e-05,6.7773000000000003e-05,6.7780000000000005e-05,6.7803963636363631e-05,6.7809529999999997e-05,6.7894199999999998e-05,6.7943452380952383e-05,6.7986625000000006e-05,6.8015833333333334e-05,6.8088990000000004e-05,6.814106818181818e-05,6.824643e-05,6.824856e-05,6.8545689999999996e-05,6.8817280000000008e-05,6.8930839999999997e-05,6.9019975609756093e-05,6.9093090000000004e-05,6.9132729999999998e-05,6.9221500000000001e-05,6.9385450000000005e-05,6.9515230000000004e-05,6.9587999999999998e-05,6.9624889999999991e-05,6.9639450000000006e-05,6.9795039999999994e-05,6.9931073170731713e-05,7.022160975609756e-05,7.037485294117647e-05,7.0498529999999998e-05,7.0640599999999989e-05,7.0653550000000001e-05,7.0785680000000001e-05,7.1076110000000003e-05,7.1106639999999997e-05,7.1150000000000008e-05,7.1158220000000001e-05,7.1596880000000004e-05,7.1735617647058827e-05,7.2115342857142847e-05,7.2378369999999989e-05,7.2743729729729732e-05,7.277935e-05,7.2884694444444442e-05,7.2904972972972975e-05,7.2916758620689655e-05,7.2921729729729729e-05,7.2933555555555567e-05,7.2967249999999998e-05,7.299741666666667e-05,7.3028999999999995e-05,7.3029999999999997e-05,7.3054989999999997e-05,7.3082000000000003e-05,7.3096999999999995e-05,7.3139360000000004e-05,7.3169028571428565e-05,0.000122249,0.00012748499999999999,0.00013277800000000001,0.00013997599999999999,0.00014068500000000001,0.00014421599999999999,0.000144783,0.00015837300000000001],"20":[1.0635999999999999e-07,1.1294e-07,1.1333e-07,1.1338e-07,1.138e-07,1.1381e-07,1.1381e-07,1.1381e-07,1.1381e-07,1.1382000000000001e-07,1.1403000000000001e-07,1.1403000000000001e-07,1.1403000000000001e-07,1.1403000000000001e-07,1.1403999999999999e-07,1.1423000000000001e-07,1.1424e-07,1.1424e-07,1.1424e-07,1.1424999999999999e-07,1.1424999999999999e-07,1.1424999999999999e-07,1.1426000000000001e-07,1.1426000000000001e-07,1.1426000000000001e-07,1.1426000000000001e-07,1.1426000000000001e-07,1.1444e-07,1.1446000000000001e-07,1.1446000000000001e-07,1.1446000000000001e-07,1.1447000000000001e-07,1.1447000000000001e-07,1.1447999999999999e-07,1.1447999999999999e-07,1.1467000000000001e-07,1.1469e-07,1.1469e-07,1.1469e-07,1.1469e-07,1.1469e-07,1.147e-07,1.147e-07,1.147e-07,1.1471000000000001e-07,1.1471000000000001e-07,1.1471000000000001e-07,1.1471000000000001e-07,1.1472e-07,1.1474000000000001e-07,1.1488999999999999e-07,1.1491e-07,1.1491e-07,1.1491e-07,1.1491e-07,1.1491e-07,1.1491e-07,1.1491e-07,1.1492e-07,1.1492e-07,1.1492e-07,1.1492e-07,1.1492e-07,1.1492e-07,1.1492e-07,1.1493e-07,1.1493e-07,1.1493e-07,1.1499e-07,1.1501999999999999e-07,1.1504e-07,1.151e-07,1.151e-07,1.1513e-07,1.1513e-07,1.1513e-07,1.1513e-07,1.1513e-07,1.1513e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1514e-07,1.1515000000000001e-07,1.1515000000000001e-07,1.1515000000000001e-07,1.1515000000000001e-07,1.1515000000000001e-07,1.1515999999999999e-07,1.1517e-07,1.152e-07,1.1534e-07,1.1535000000000001e-07,1.1536e-07,1.1536e-07,1.1536e-07,1.1536e-07,1.1536e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1536999999999999e-07,1.1538e-07,1.1538e-07,1.1539e-07,1.1541e-07,1.1542000000000001e-07,1.1556000000000001e-07,1.1557e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1558000000000001e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559e-07,1.1559999999999999e-07,1.1559999999999999e-07,1.1559999999999999e-07,1.1561e-07,1.1561e-07,1.1564e-07,1.1564e-07,1.1566999999999999e-07,1.1579999999999999e-07,1.1579999999999999e-07,1.1579999999999999e-07,1.1581e-07,1.1581e-07,1.1581e-07,1.1581e-07,1.1582e-07,1.1582e-07,1.1582e-07,1.1582e-07,1.1583000000000001e-07,1.1583000000000001e-07,1.1583000000000001e-07,1.1586000000000001e-07,1.1586999999999999e-07,1.1592e-07,1.1599000000000001e-07,1.1603e-07,1.1603e-07,1.1603e-07,1.1603e-07,1.1603e-07,1.1603e-07,1.1604e-07,1.1604e-07,1.1604e-07,1.1604e-07,1.1604e-07,1.1604e-07,1.1606000000000001e-07,1.1607999999999999e-07,1.1623999999999999e-07,1.1625e-07,1.1625e-07,1.1625e-07,1.1627000000000001e-07,1.1637999999999999e-07,1.1646e-07,1.1647000000000001e-07,1.1647999999999999e-07,1.1654000000000001e-07,1.1670000000000001e-07,1.1670000000000001e-07,1.1691999999999999e-07,1.1719000000000001e-07,1.1892999999999999e-07,1.1904e-07,1.1912000000000001e-07,1.1957999999999999e-07,1.1960000000000001e-07,1.1978e-07,1.1978999999999999e-07,1.1982e-07,1.1983000000000001e-07,1.1984000000000002e-07,1.2003e-07,1.2004000000000001e-07,1.2004000000000001e-07,1.2022e-07,1.2048999999999999e-07,1.205e-07,1.205e-07,1.205e-07,1.2051000000000001e-07,1.2051000000000001e-07,1.2052e-07,1.2052e-07,1.2069999999999999e-07,1.2073e-07,1.2073e-07,1.2088000000000001e-07,1.2090999999999999e-07,1.2095000000000001e-07,1.2096000000000002e-07,1.2097999999999999e-07,1.2097999999999999e-07,1.2109999999999999e-07,1.2115e-07,1.212e-07,1.2130999999999999e-07,1.2136999999999998e-07,1.2137999999999999e-07,1.2140000000000002e-07,1.2140000000000002e-07,1.2143e-07,1.2144999999999999e-07,1.215e-07,1.216e-07,1.2160999999999999e-07,1.2160999999999999e-07,1.2167e-07,1.2167999999999999e-07,1.2192e-07,1.2192e-07,1.2207000000000001e-07,1.23e-07,1.2328e-07,1.2351999999999998e-07,1.2492000000000001e-07,1.254e-07,1.2559e-07,1.2566e-07,1.2590999999999999e-07,1.2603e-07,1.2639000000000001e-07,1.2660000000000001e-07,1.2663000000000002e-07,1.2664e-07,1.2664999999999999e-07,1.2683999999999999e-07,1.2686000000000001e-07,1.2687999999999998e-07,1.269e-07,1.2711e-07,1.2711999999999999e-07,1.2727e-07,1.2734999999999999e-07,1.2734999999999999e-07,1.2764e-07,1.2779999999999999e-07,1.2784000000000001e-07,1.3197999999999999e-07,1.3559000000000001e-07,1.3612e-07,1.3633e-07,1.3638000000000001e-07,1.3644e-07,1.3717999999999999e-07,1.5641999999999999e-07,1.6586e-07,1.7785999999999998e-07,1.8e-07,1.8175000000000002e-07,1.8309000000000001e-07,1.8484000000000001e-07],"14336":[0.049385203000000003,0.049420914000000003,0.049422383000000014,0.049522545000000001,0.049532166000000002,0.049613674000000003,0.049615872999999998,0.049616668000000003,0.049627511999999999,0.049634134000000003,0.049658698000000001,0.049686569,0.049693741,0.049693920500000002,0.049722286999999997,0.049728797999999998,0.049734965999999999,0.049743160500000001,0.049762655000000003,0.049764724000000003,0.049795436499999998,0.049806710999999997,0.049814742000000002,0.049819757499999999,0.0498223535,0.049847087000000012,0.049872982999999982,0.0498739645,0.049882302000000003,0.049883304000000003,0.049903570500000001,0.049910794500000001,0.0499245465,0.049924944999999998,0.049952529500000002,0.049957913999999999,0.049962538000000001,0.049964189999999999,0.049975224499999998,0.049980566499999997,0.049985274000000003,0.049993396500000009,0.049996864000000002,0.049997440999999997,0.050006947500000003,0.050010158999999998,0.050014168999999997,0.050014861000000001,0.050051608499999997,0.050053430000000003,0.050083237999999974,0.050085332000000003,0.050089916999999998,0.050094633,0.050110498000000003,0.050114431000000001,0.050117456999999997,0.050130239,0.050136194000000002,0.050137135999999999,0.050140392999999998,0.050149168500000008,0.050167192999999999,0.050176485,0.050180537999999997,0.050182827999999999,0.050184949999999999,0.050199637999999998,0.050207904999999997,0.050212158,0.050212648500000012,0.050214780000000001,0.050218296000000003,0.050227183500000001,0.050238389500000001,0.050242787999999997,0.050253742999999997,0.050255330000000001,0.050258110000000002,0.050262306499999999,0.050268014499999999,0.050278117999999997,0.050287474499999985,0.050309246000000002,0.050310585999999997,0.050329218000000002,0.050330182500000001,0.050333108000000001,0.050340309499999999,0.050344478999999998,0.050344557499999998,0.050348727500000003,0.050354993000000001,0.050356349000000002,0.050357744000000003,0.050361569500000002,0.050369634000000003,0.050382958999999998,0.050386465999999998,0.050391098500000002,0.050402745999999998,0.050411202500000002,0.050424772999999999,0.050430073999999998,0.050431799499999999,0.0504484735,0.050491560499999998,0.050492194499999976,0.050510038,0.050511264,0.050513701999999994,0.050534108500000001,0.050536112500000001,0.050547206499999997,0.050548149000000001,0.050551279499999997,0.050551651000000003,0.050551662999999997,0.050560478499999999,0.050571730000000002,0.050571769000000003,0.050597402,0.050615627000000003,0.050619826499999999,0.050638000000000002,0.050639256000000001,0.050659723500000003,0.050670463999999998,0.050671709500000002,0.050687636500000022,0.0506932675,0.050705882000000001,0.050713353000000003,0.050717469000000001,0.050717608999999997,0.050722014000000003,0.050733593,0.05073478,0.050735893999999997,0.050738450999999997,0.050750185000000003,0.0507592475,0.050762813499999997,0.050785780000000003,0.050787071500000003,0.050800567499999998,0.050800994000000002,0.050805640999999999,0.050812333000000001,0.05081575,0.050816475,0.050829957000000002,0.050859602999999975,0.050863683,0.050876032000000002,0.050899266999999998,0.050899544499999998,0.050910839999999999,0.050917707499999999,0.050923685000000003,0.050928953999999999,0.050938256000000001,0.050963369000000001,0.050967021000000001,0.050967751999999977,0.050972349,0.050984007999999997,0.050993477500000002,0.051005201,0.051014627999999999,0.051014724999999997,0.051043076999999999,0.051047545999999999,0.051049658999999997,0.051057723499999999,0.051058147499999998,0.051060027500000001,0.051060832,0.0510743185,0.051081934500000002,0.051097644999999997,0.051103754500000001,0.0511041395,0.051110735499999997,0.051125671999999997,0.051128053499999999,0.051138966000000001,0.051141283500000002,0.051141397999999998,0.051143991999999999,0.051149757999999997,0.051152021999999998,0.051158434500000002,0.051160010999999998,0.051162997500000001,0.051172020999999998,0.051188420999999998,0.051189853,0.051207651999999999,0.051220948499999974,0.051231527499999999,0.051241986000000003,0.051244692500000001,0.051245585000000003,0.051262079500000002,0.051274088000000002,0.051281365999999995,0.051293882999999998,0.051297146000000002,0.051303174,0.051321989999999998,0.051333697999999997,0.051341633499999997,0.051345540999999995,0.051355337500000001,0.051382566999999997,0.051384697,0.051413428999999997,0.051420821999999998,0.051421078000000002,0.051425825000000001,0.051430589999999998,0.051436456999999998,0.051457160000000002,0.051463500000000002,0.051471945999999998,0.051498308,0.051509034499999995,0.0515314625,0.051577012499999998,0.051580422000000001,0.051585822500000003,0.051639543500000003,0.051647248999999999,0.051653240500000003,0.051676384999999998,0.051680772999999999,0.051686013000000003,0.051700407499999997,0.051721647000000003,0.051745798499999995,0.051748997499999998,0.051767239500000006,0.051814707000000002,0.051839883500000003,0.051915251000000003,0.051924346500000003,0.051929398000000002,0.051989137999999997,0.052052760500000017,0.052096766000000017,0.052117762999999998,0.052144279500000001,0.052207591499999983,0.052213025000000003,0.0523036365,0.052340169999999998,0.052357580500000001,0.052389995000000002,0.052393417999999997,0.052628605000000002,0.052696961,0.052852595000000002,0.053728924499999997,0.053885316000000003,0.053897472999999974,0.054715424499999998,0.055010968,0.055274625500000001,0.055799544999999999,0.056069135999999964,0.056126860000000001,0.058033619500000001,0.061187319999999989,0.111404763,0.11589108799999998,0.118335127,0.120706151,0.131628571,0.135844559,0.13884970099999999],"14":[5.5960000000000006e-08,5.8629999999999996e-08,5.8850000000000001e-08,5.9060000000000001e-08,5.9070000000000006e-08,5.9070000000000006e-08,5.9279999999999999e-08,5.9279999999999999e-08,5.9290000000000004e-08,5.9290000000000004e-08,5.9300000000000002e-08,5.9510000000000001e-08,5.9510000000000001e-08,5.9510000000000001e-08,5.952e-08,5.952e-08,5.952e-08,5.9529999999999998e-08,5.9529999999999998e-08,5.9529999999999998e-08,5.9649999999999995e-08,5.969e-08,5.9699999999999999e-08,5.9719999999999995e-08,5.9730000000000006e-08,5.9740000000000004e-08,5.9740000000000004e-08,5.9740000000000004e-08,5.9750000000000002e-08,5.9810000000000004e-08,5.9849999999999997e-08,5.992000000000001e-08,5.992000000000001e-08,5.9929999999999995e-08,5.9950000000000004e-08,5.9950000000000004e-08,5.9950000000000004e-08,5.9960000000000002e-08,5.9960000000000002e-08,5.9960000000000002e-08,5.9960000000000002e-08,5.9960000000000002e-08,5.997e-08,5.997e-08,5.997e-08,5.9979999999999998e-08,6.0020000000000004e-08,6.0079999999999993e-08,6.0119999999999998e-08,6.0129999999999996e-08,6.0129999999999996e-08,6.0129999999999996e-08,6.0140000000000008e-08,6.0159999999999991e-08,6.0170000000000002e-08,6.0170000000000002e-08,6.0170000000000002e-08,6.0170000000000002e-08,6.018e-08,6.018e-08,6.018e-08,6.018e-08,6.018e-08,6.018e-08,6.018e-08,6.018e-08,6.0189999999999998e-08,6.0189999999999998e-08,6.0189999999999998e-08,6.0189999999999998e-08,6.0189999999999998e-08,6.0189999999999998e-08,6.0199999999999996e-08,6.0290000000000006e-08,6.0349999999999994e-08,6.039e-08,6.039e-08,6.039e-08,6.0399999999999998e-08,6.0399999999999998e-08,6.0399999999999998e-08,6.0399999999999998e-08,6.0399999999999998e-08,6.0399999999999998e-08,6.0409999999999996e-08,6.0409999999999996e-08,6.0409999999999996e-08,6.0409999999999996e-08,6.0569999999999992e-08,6.0580000000000004e-08,6.06e-08,6.0609999999999998e-08,6.0609999999999998e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0619999999999996e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0630000000000008e-08,6.0730000000000002e-08,6.0790000000000004e-08,6.0800000000000002e-08,6.0800000000000002e-08,6.0800000000000002e-08,6.0829999999999996e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0839999999999994e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0850000000000006e-08,6.0860000000000004e-08,6.0860000000000004e-08,6.0860000000000004e-08,6.0860000000000004e-08,6.0860000000000004e-08,6.095e-08,6.102e-08,6.1049999999999994e-08,6.1059999999999992e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1070000000000004e-08,6.1080000000000002e-08,6.1080000000000002e-08,6.1080000000000002e-08,6.1080000000000002e-08,6.1080000000000002e-08,6.1080000000000002e-08,6.109e-08,6.1099999999999998e-08,6.1109999999999996e-08,6.1109999999999996e-08,6.1199999999999992e-08,6.1239999999999998e-08,6.127999999999999e-08,6.127999999999999e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.1290000000000002e-08,6.13e-08,6.1319999999999996e-08,6.1399999999999994e-08,6.1420000000000003e-08,6.1469999999999994e-08,6.1469999999999994e-08,6.1469999999999994e-08,6.1490000000000003e-08,6.1500000000000001e-08,6.151e-08,6.151e-08,6.151e-08,6.151e-08,6.151e-08,6.151e-08,6.151e-08,6.1519999999999998e-08,6.1630000000000003e-08,6.1680000000000007e-08,6.1729999999999998e-08,6.1729999999999998e-08,6.1729999999999998e-08,6.1739999999999996e-08,6.1900000000000005e-08,6.1949999999999996e-08,6.1959999999999994e-08,6.1959999999999994e-08,6.1970000000000005e-08,6.2110000000000005e-08,6.2169999999999994e-08,6.2200000000000001e-08,6.2299999999999995e-08,6.2519999999999993e-08,6.2530000000000005e-08,6.2540000000000003e-08,6.2670000000000005e-08,6.2750000000000003e-08,6.2929999999999995e-08,6.3010000000000006e-08,6.3119999999999999e-08,6.3189999999999999e-08,6.3219999999999993e-08,6.3219999999999993e-08,6.3240000000000002e-08,6.3439999999999991e-08,6.3439999999999991e-08,6.3450000000000002e-08,6.3450000000000002e-08,6.3679999999999998e-08,6.3679999999999998e-08,6.369000000000001e-08,6.3699999999999995e-08,6.3790000000000004e-08,6.3849999999999993e-08,6.3910000000000008e-08,6.3910000000000008e-08,6.3910000000000008e-08,6.3990000000000006e-08,6.4140000000000004e-08,6.4140000000000004e-08,6.4150000000000002e-08,6.4150000000000002e-08,6.416e-08,6.4599999999999996e-08,6.4780000000000002e-08,6.4780000000000002e-08,6.5320000000000005e-08,6.5569999999999998e-08,6.5649999999999996e-08,6.5799999999999994e-08,6.6049999999999999e-08,6.6059999999999997e-08,6.6080000000000007e-08,6.6290000000000007e-08,6.6300000000000005e-08,6.6539999999999999e-08,6.6539999999999999e-08,6.6730000000000003e-08,6.6769999999999995e-08,6.6790000000000004e-08,6.6950000000000001e-08,6.6969999999999997e-08,6.6969999999999997e-08,6.7039999999999997e-08,6.7209999999999991e-08,6.7270000000000006e-08,6.7750000000000008e-08,6.8e-08,7.1270000000000002e-08,7.1270000000000002e-08,7.1530000000000006e-08,7.1799999999999994e-08,7.2010000000000008e-08,7.3099999999999999e-08,8.385e-08,8.4270000000000013e-08,8.6019999999999999e-08,8.7150000000000009e-08,8.8539999999999997e-08,8.8949999999999999e-08,9.5000000000000004e-08],"96":[2.6004900000000001e-06,2.6012700000000004e-06,2.6148099999999998e-06,2.6190300000000002e-06,2.6224999999999999e-06,2.6231099999999998e-06,2.6232700000000004e-06,2.62769e-06,2.6292799999999998e-06,2.6296199999999999e-06,2.6313800000000002e-06,2.63145e-06,2.63191e-06,2.6333700000000001e-06,2.6336699999999999e-06,2.6340000000000001e-06,2.6354500000000003e-06,2.6358099999999997e-06,2.6395400000000001e-06,2.6395900000000003e-06,2.6401400000000002e-06,2.64208e-06,2.6430699999999998e-06,2.6438999999999998e-06,2.6456800000000002e-06,2.6461399999999998e-06,2.6471800000000001e-06,2.6474700000000001e-06,2.6482699999999997e-06,2.6496400000000003e-06,2.64969e-06,2.65032e-06,2.6513300000000003e-06,2.6513900000000003e-06,2.6515200000000001e-06,2.6520899999999997e-06,2.65273e-06,2.6530299999999998e-06,2.6539100000000004e-06,2.6551500000000003e-06,2.6561899999999998e-06,2.6564500000000002e-06,2.6566200000000002e-06,2.6568499999999998e-06,2.6573699999999998e-06,2.6575900000000003e-06,2.6585699999999999e-06,2.6599799999999998e-06,2.6600599999999999e-06,2.6601499999999998e-06,2.6614999999999998e-06,2.6616399999999999e-06,2.6622199999999998e-06,2.6623800000000004e-06,2.6629699999999998e-06,2.6635500000000001e-06,2.6637200000000001e-06,2.6654100000000002e-06,2.6657800000000003e-06,2.6658500000000001e-06,2.66611e-06,2.6664400000000003e-06,2.6673300000000003e-06,2.6676399999999999e-06,2.66778e-06,2.6678500000000002e-06,2.6679299999999999e-06,2.6683399999999998e-06,2.6687999999999998e-06,2.6689e-06,2.6695100000000003e-06,2.66976e-06,2.6700204081632654e-06,2.6705700000000003e-06,2.67263e-06,2.6728199999999998e-06,2.6737499999999996e-06,2.6739100000000002e-06,2.6739700000000002e-06,2.67444e-06,2.6744799999999998e-06,2.6751099999999999e-06,2.6763800000000002e-06,2.6765300000000001e-06,2.6767600000000001e-06,2.6779400000000001e-06,2.6780999999999998e-06,2.6794699999999999e-06,2.6814999999999997e-06,2.6832199999999997e-06,2.6835799999999999e-06,2.6846500000000002e-06,2.6858799999999999e-06,2.6862300000000002e-06,2.6863100000000003e-06,2.6865399999999999e-06,2.68785e-06,2.6880399999999998e-06,2.6885199999999999e-06,2.6887499999999999e-06,2.6891300000000002e-06,2.6898292682926828e-06,2.6904199999999998e-06,2.6910799999999998e-06,2.6913700000000002e-06,2.6920400000000001e-06,2.6926899999999998e-06,2.69331e-06,2.69391e-06,2.6943199999999999e-06,2.6944599999999999e-06,2.6944799999999997e-06,2.6945600000000002e-06,2.6946899999999999e-06,2.6958100000000004e-06,2.6978100000000001e-06,2.6986300000000003e-06,2.6993800000000002e-06,2.6995199999999999e-06,2.6997692307692308e-06,2.6999000000000002e-06,2.7003799999999999e-06,2.7012999999999999e-06,2.70376e-06,2.7046100000000002e-06,2.7056099999999998e-06,2.7074199999999998e-06,2.7080499999999998e-06,2.7089500000000001e-06,2.7099999999999999e-06,2.7106400000000002e-06,2.7112099999999998e-06,2.71134e-06,2.7136800000000002e-06,2.7166599999999999e-06,2.71677e-06,2.7188100000000004e-06,2.71927e-06,2.7193e-06,2.7204600000000002e-06,2.72145e-06,2.7253500000000001e-06,2.7256999999999996e-06,2.72903e-06,2.7353888888888891e-06,2.7355116279069769e-06,2.7427e-06,2.74382e-06,2.7448899999999999e-06,2.7454999999999998e-06,2.751e-06,2.7547299999999996e-06,2.7591600000000004e-06,2.7596800000000003e-06,2.7626400000000003e-06,2.7646000000000002e-06,2.7659699999999999e-06,2.7703e-06,2.7720099999999997e-06,2.7751899999999999e-06,2.7823333333333334e-06,2.7826800000000004e-06,2.7843699999999996e-06,2.7906300000000004e-06,2.7907000000000002e-06,2.7985500000000001e-06,2.7988900000000001e-06,2.7990600000000002e-06,2.8005499999999998e-06,2.8056299999999999e-06,2.8064700000000002e-06,2.8110299999999998e-06,2.8113500000000002e-06,2.81162e-06,2.8124500000000001e-06,2.8134200000000002e-06,2.8170806451612904e-06,2.81946e-06,2.82173e-06,2.82368e-06,2.8254700000000003e-06,2.8283200000000002e-06,2.8336700000000001e-06,2.8424399999999999e-06,2.8537099999999997e-06,2.8537899999999998e-06,2.866032258064516e-06,2.8777499999999997e-06,2.8873100000000001e-06,2.8893e-06,2.8944499999999999e-06,2.8959300000000001e-06,2.89731e-06,2.8984200000000002e-06,2.9005200000000001e-06,2.9023571428571428e-06,2.9029499999999999e-06,2.9038799999999997e-06,2.9057399999999998e-06,2.9076100000000002e-06,2.9079300000000001e-06,2.9096200000000002e-06,2.9126899999999998e-06,2.9164900000000001e-06,2.9189699999999999e-06,2.9189800000000002e-06,2.91902e-06,2.9238300000000003e-06,2.92425e-06,2.9243500000000002e-06,2.9279099999999998e-06,2.92899e-06,2.9290099999999997e-06,2.9315500000000003e-06,2.9327699999999997e-06,2.9338900000000001e-06,2.9346400000000001e-06,2.9349500000000002e-06,2.9358299999999999e-06,2.9396000000000002e-06,2.9402699999999996e-06,2.9429599999999998e-06,2.9431299999999998e-06,2.9446499999999998e-06,2.9454499999999999e-06,2.9461500000000002e-06,2.94757e-06,2.9503400000000002e-06,2.9508900000000001e-06,2.9515599999999996e-06,2.95222e-06,2.9550799999999998e-06,2.9578999999999997e-06,2.95894e-06,2.9596296296296295e-06,2.9599036144578315e-06,2.96035e-06,2.9606999999999999e-06,2.96204e-06,2.9629500000000002e-06,2.9634600000000003e-06,2.9642399999999998e-06,2.9669523809523807e-06,2.9697300000000001e-06,2.9719333333333333e-06,2.9740399999999997e-06,2.9802000000000003e-06,2.99027e-06,2.9912299999999998e-06,3.0027399999999999e-06,3.0751999999999998e-06,3.0847300000000003e-06,3.0917400000000002e-06,3.1035600000000004e-06,3.1206600000000002e-06,3.1251599999999999e-06,3.1370999999999996e-06,3.1416199999999998e-06,3.1417700000000002e-06,3.1444699999999997e-06,3.1483999999999998e-06,3.1485e-06,3.1538999999999996e-06,3.1564599999999999e-06,3.1597800000000001e-06,3.1608899999999998e-06,3.1674300000000004e-06,3.1729399999999996e-06,3.1729799999999998e-06,3.1854500000000001e-06,3.19089e-06,3.1920499999999998e-06,3.1990600000000002e-06,3.22457e-06,4.3268900000000002e-06,4.5959999999999997e-06,4.62418e-06,4.6388999999999997e-06,4.8451100000000003e-06,5.0206599999999998e-06,5.9240000000000004e-06],"12288":[0.036227009999999997,0.036238246000000002,0.036241242,0.036325084000000001,0.036339254000000001,0.036374824,0.036427350999999997,0.036464247999999998,0.036474766999999998,0.03653385050000002,0.036542409999999997,0.036549822000000003,0.036553465,0.036563505000000003,0.036595655999999997,0.036609707999999998,0.036610358000000003,0.036648197,0.036648904000000003,0.036655638999999997,0.036692483999999997,0.036711498000000002,0.036714451000000002,0.036729618999999998,0.036752311000000003,0.036754495499999998,0.036757323000000001,0.036767650999999998,0.036767998000000003,0.036780434000000001,0.036785018000000003,0.036785847000000003,0.036787340000000002,0.036794953999999998,0.036796114999999997,0.036802266,0.036806217000000002,0.036820159999999998,0.036829607,0.036831866999999997,0.036851835999999999,0.036852324999999998,0.036861657999999999,0.036870470000000002,0.036892287000000003,0.036907458999999997,0.036913036000000003,0.036914259999999997,0.036917666000000002,0.036935429499999999,0.036937287499999999,0.036938971000000001,0.036982974000000002,0.036997791000000002,0.037008088000000001,0.037015309000000003,0.037021261,0.037021486499999999,0.037021889000000002,0.03704178300000005,0.037047838,0.037048282000000002,0.037049708000000001,0.037061553999999997,0.037061843999999997,0.037072923000000001,0.037079387999999998,0.037089414000000001,0.037090182999999999,0.037094907000000003,0.037096707,0.037103516000000003,0.037131929500000001,0.037132671999999999,0.037139192000000001,0.037141613500000004,0.037143664,0.037145629999999999,0.037159805499999976,0.037159987999999977,0.0371603405,0.037164543000000001,0.037170376999999998,0.037170706999999997,0.037175794499999998,0.037182693000000003,0.037185005,0.037187732000000001,0.037196773500000002,0.037207035999999999,0.037209495000000002,0.037217897,0.037219965000000001,0.037228049999999999,0.037236046000000002,0.037238862999999997,0.037240698000000003,0.037240959999999997,0.037247484999999997,0.037257658999999999,0.037263188000000003,0.037265354999999944,0.037272326500000001,0.037280213,0.037281434000000002,0.037282268,0.037284309000000002,0.037285016999999997,0.037289659000000003,0.037291761499999999,0.037301168000000003,0.037304397500000003,0.037317476000000002,0.037318368499999997,0.037319020000000001,0.037340663000000003,0.037352453000000001,0.037352744,0.037355517999999997,0.0373589665,0.037360484499999999,0.037380463500000002,0.037382980000000003,0.037405003999999999,0.037411795499999997,0.037415409500000003,0.037415790999999997,0.037423115999999999,0.037423873000000003,0.037430328999999998,0.037433817500000001,0.037442178,0.037451405,0.037451695,0.037453156000000001,0.037462785999999998,0.037469222999999996,0.037470832000000003,0.037472220000000001,0.037481797499999997,0.037501239999999998,0.037527001499999997,0.037543914999999997,0.037547494000000001,0.037555903000000002,0.037558336999999997,0.037560817000000003,0.037565907000000003,0.037588732999999999,0.037597616,0.037610112000000001,0.037620121999999999,0.037648548499999997,0.037649339499999997,0.037649726000000001,0.037654960500000001,0.037654987000000001,0.037656494499999998,0.037660658,0.037660922999999999,0.037663929999999998,0.037664763499999997,0.037668611499999997,0.037670281999999999,0.037674751499999999,0.037679683999999998,0.037684020999999998,0.037688620999999999,0.037708778999999998,0.037722643,0.037725715999999999,0.037726565500000003,0.037735269500000002,0.037735492000000002,0.037736205500000002,0.037739346999999999,0.037740071,0.037743356999999998,0.037744443000000003,0.037744622999999998,0.037756130999999998,0.037761006999999999,0.037761870000000003,0.037769555000000003,0.037780696999999974,0.037798913000000003,0.037799285000000002,0.037815157500000002,0.037815979999999999,0.037816650000000007,0.037834536000000002,0.0378553815,0.037878555000000001,0.037878910500000001,0.037883928499999997,0.037901841999999998,0.037922213000000003,0.037924353000000001,0.037934780000000001,0.037945688499999998,0.037958924999999998,0.037981705999999997,0.0379827675,0.037985762999999999,0.037989482499999998,0.038006512499999999,0.038032974999999997,0.038033526499999998,0.038034390500000001,0.038089282000000002,0.038097802,0.038148803000000002,0.038152235999999999,0.038171271,0.038172389000000001,0.038179082500000003,0.038207731500000001,0.038214073000000015,0.038227121000000003,0.038228831999999997,0.038249861000000003,0.038253867499999997,0.038256756000000003,0.038258262500000001,0.038259290000000001,0.038279142000000002,0.038280017999999999,0.038280871000000001,0.038281058999999999,0.038287518,0.038291609999999997,0.038296208999999998,0.038318083500000003,0.038321789500000002,0.038364275500000003,0.038382261000000001,0.038383088000000003,0.038387163000000002,0.038398903499999998,0.038413247999999997,0.038428161000000002,0.038430467000000003,0.038442617499999998,0.038464308500000002,0.038486966999999997,0.038496147000000001,0.038531958499999998,0.038542647499999999,0.038549409499999999,0.038573379999999997,0.038585121999999999,0.038617606999999998,0.038668210000000001,0.038688829000000036,0.038713763999999998,0.03871608,0.038738615499999997,0.038740471999999998,0.038743218000000024,0.038806522000000003,0.038882920000000001,0.039020871499999998,0.039125356,0.039207846000000046,0.039209726,0.039331317499999997,0.039344366999999998,0.039457972000000001,0.039498039499999998,0.039887704000000003,0.04047398,0.042019618000000002,0.042970435000000001,0.045930533500000002,0.086435977999999997,0.091169736000000001,0.1004590705,0.102688586,0.1034604665,0.108503713,0.11200920000000003],"128":[4.4209999999999997e-06,4.4251600000000002e-06,4.4406666666666671e-06,4.4444400000000004e-06,4.4444900000000005e-06,4.4456799999999999e-06,4.4501666666666668e-06,4.4528873239436617e-06,4.4532599999999999e-06,4.4550100000000004e-06,4.4550200000000002e-06,4.4556400000000004e-06,4.4565399999999999e-06,4.4566249999999999e-06,4.4570200000000004e-06,4.4582222222222219e-06,4.4585000000000006e-06,4.4586099999999998e-06,4.4586599999999999e-06,4.4587600000000001e-06,4.45877e-06,4.4591500000000003e-06,4.4608799999999994e-06,4.4617199999999997e-06,4.4626899999999998e-06,4.46463e-06,4.4647000000000006e-06,4.4659599999999998e-06,4.4660500000000002e-06,4.4661499999999996e-06,4.4662599999999997e-06,4.4675400000000003e-06,4.46842e-06,4.4684799999999999e-06,4.4693199999999994e-06,4.4697567567567572e-06,4.4700800000000001e-06,4.4712099999999995e-06,4.4716999999999999e-06,4.4719999999999997e-06,4.4733199999999997e-06,4.4753333333333336e-06,4.4754999999999998e-06,4.4757400000000005e-06,4.4765000000000003e-06,4.4769599999999994e-06,4.4780937499999999e-06,4.48048e-06,4.4820200000000002e-06,4.4827600000000003e-06,4.4839399999999998e-06,4.4852400000000001e-06,4.4855999999999999e-06,4.4867499999999999e-06,4.4871499999999999e-06,4.4900600000000002e-06,4.49007e-06,4.4915000000000001e-06,4.4922500000000001e-06,4.4929699999999996e-06,4.4938333333333335e-06,4.4939399999999997e-06,4.4941300000000003e-06,4.4944700000000004e-06,4.4950600000000001e-06,4.4950600000000001e-06,4.4951481481481479e-06,4.4964900000000002e-06,4.49788e-06,4.49834e-06,4.49846e-06,4.4988e-06,4.4997600000000003e-06,4.5017599999999996e-06,4.50305e-06,4.5032999999999997e-06,4.5033900000000001e-06,4.5050000000000001e-06,4.5057083333333333e-06,4.5058299999999997e-06,4.5058799999999998e-06,4.5074899999999998e-06,4.5082602739726029e-06,4.5093799999999998e-06,4.5095099999999996e-06,4.5098499999999997e-06,4.5098571428571435e-06,4.5127999999999994e-06,4.5137499999999998e-06,4.5152000000000004e-06,4.51546e-06,4.5154899999999995e-06,4.5194999999999997e-06,4.5196300000000003e-06,4.5202499999999996e-06,4.5209999999999996e-06,4.52195e-06,4.5220699999999999e-06,4.5248000000000003e-06,4.5249500000000006e-06,4.5259799999999998e-06,4.5287499999999996e-06,4.5305900000000004e-06,4.5310899999999998e-06,4.5426600000000003e-06,4.5426999999999997e-06,4.5501099999999997e-06,4.55233e-06,4.5541499999999994e-06,4.5652599999999999e-06,4.5694099999999997e-06,4.5744099999999996e-06,4.57881e-06,4.5820000000000003e-06,4.58524e-06,4.5879999999999999e-06,4.5986500000000004e-06,4.6029999999999998e-06,4.617e-06,4.6229999999999996e-06,4.6251099999999998e-06,4.6257499999999997e-06,4.63182e-06,4.6372299999999998e-06,4.6419999999999998e-06,4.6510900000000004e-06,4.65284e-06,4.6546100000000001e-06,4.6549699999999999e-06,4.6586099999999996e-06,4.6599800000000006e-06,4.6638666666666661e-06,4.6653799999999997e-06,4.6659999999999999e-06,4.6672199999999997e-06,4.66921e-06,4.6712100000000001e-06,4.6723600000000001e-06,4.6742300000000005e-06,4.6755499999999996e-06,4.6791299999999994e-06,4.67926e-06,4.6795599999999998e-06,4.6804399999999995e-06,4.6808400000000004e-06,4.6873815789473683e-06,4.6880900000000002e-06,4.6886600000000003e-06,4.6886899999999998e-06,4.6926599999999997e-06,4.6952857142857146e-06,4.6955899999999997e-06,4.6959899999999997e-06,4.6967700000000001e-06,4.6972000000000005e-06,4.6992699999999996e-06,4.6999700000000003e-06,4.7006200000000001e-06,4.7011249999999998e-06,4.7029700000000001e-06,4.7047899999999996e-06,4.70505e-06,4.7059199999999998e-06,4.7063018867924523e-06,4.7063900000000005e-06,4.7075700000000001e-06,4.7112300000000003e-06,4.7122200000000001e-06,4.7125199999999999e-06,4.713557142857143e-06,4.7158600000000006e-06,4.7167299999999996e-06,4.7173799999999994e-06,4.7241399999999996e-06,4.7273699999999994e-06,4.7315899999999999e-06,4.7411299999999998e-06,4.7487099999999998e-06,4.7508999999999997e-06,4.7589423076923077e-06,4.7731299999999996e-06,4.8058400000000001e-06,4.8201300000000002e-06,4.8471200000000003e-06,4.8609999999999997e-06,4.8641800000000002e-06,4.8657400000000001e-06,4.8725833333333339e-06,4.8752899999999999e-06,4.8761699999999996e-06,4.8766199999999997e-06,4.8789e-06,4.8805400000000004e-06,4.8817600000000002e-06,4.8818200000000001e-06,4.8823200000000004e-06,4.8848999999999996e-06,4.8851500000000001e-06,4.8868299999999999e-06,4.8898823529411763e-06,4.8910299999999998e-06,4.8911578947368422e-06,4.8917000000000001e-06,4.8959800000000005e-06,4.8968899999999998e-06,4.9010000000000002e-06,4.9025500000000002e-06,4.90302e-06,4.9086500000000009e-06,4.9087800000000006e-06,4.9091799999999998e-06,4.9117200000000005e-06,4.9123700000000002e-06,4.9149199999999999e-06,4.9171100000000006e-06,4.91807e-06,4.91813e-06,4.9231199999999992e-06,4.9234400000000004e-06,4.9238099999999992e-06,4.9239899999999999e-06,4.9240799999999994e-06,4.9250000000000003e-06,4.9265199999999999e-06,4.9290909090909094e-06,4.9298600000000006e-06,4.9320000000000004e-06,4.9321100000000005e-06,4.9322199999999997e-06,4.9326299999999996e-06,4.9329599999999998e-06,4.9345499999999992e-06,4.9346500000000003e-06,4.9368700000000006e-06,4.9370000000000003e-06,4.9383499999999999e-06,4.9409800000000001e-06,4.9416100000000001e-06,4.9452999999999999e-06,4.9480699999999997e-06,4.9490500000000005e-06,4.9504000000000001e-06,4.9527399999999994e-06,4.9548500000000005e-06,4.95615e-06,4.9596799999999996e-06,4.9653800000000002e-06,4.9677699999999997e-06,4.9689199999999997e-06,4.9691600000000004e-06,4.9724299999999996e-06,4.9730800000000002e-06,4.9744285714285713e-06,4.9862200000000003e-06,4.9903700000000001e-06,5.0100700000000001e-06,5.0184399999999995e-06,5.0669999999999999e-06,5.0773500000000006e-06,5.0996899999999998e-06,5.1100000000000002e-06,5.1207500000000001e-06,5.1822499999999994e-06,5.2087399999999992e-06,5.2659900000000002e-06,5.2874700000000002e-06,5.2982999999999997e-06,5.2989100000000001e-06,5.3077799999999997e-06,5.3264769230769233e-06,5.32826e-06,5.3289600000000007e-06,5.3450999999999999e-06,5.3464599999999993e-06,7.7700800000000007e-06,8.5091199999999993e-06,8.5636666666666656e-06,8.7582500000000004e-06,8.7919999999999998e-06,9.7637100000000001e-06,1.0505e-05],"49152":[0.57866811299999998,0.57934010599999997,0.58008521800000001,0.58264726099999997,0.58289793899999998,0.58302556100000003,0.58357060100000002,0.58413751200000008,0.58436207399999995,0.58443488200000004,0.58484851100000002,0.58529402500000005,0.58532927950000002,0.58546813399999997,0.58555318499999998,0.58556569299999994,0.58570389999999994,0.58583196500000001,0.58616845849999999,0.58642273050000004,0.58656025099999998,0.58657215299999999,0.58657342499999998,0.58676762999999998,0.58680762600000003,0.58680976600000001,0.58682731700000001,0.586870216,0.58690183500000004,0.58692845999999999,0.58697912699999999,0.58723330699999998,0.58732800200000002,0.58736537649999998,0.587456172,0.58746851,0.58749408599999997,0.58767901099999997,0.58786630500000003,0.58792154499999993,0.587976359,0.58808565199999996,0.58821404799999999,0.58822406549999995,0.58823603099999999,0.58829808900000002,0.58846300949999997,0.58849196999999998,0.58858724800000006,0.58876130900000001,0.58880125699999997,0.58883701600000005,0.58888969999999996,0.58892807400000002,0.58899448799999998,0.58901832249999997,0.58908107499999995,0.58909697500000002,0.58910836499999997,0.58918185000000001,0.58925594599999997,0.5892825035,0.58946107400000003,0.58948750500000002,0.58949269400000004,0.5895312855,0.58953568899999997,0.58957691099999998,0.58959646200000004,0.58966080399999998,0.58968229100000003,0.58969241900000002,0.58975031599999994,0.58975329600000004,0.58977655399999995,0.58988709100000003,0.58990453099999995,0.58994116400000007,0.58994821400000008,0.5899696995,0.58997662299999998,0.59010951199999995,0.59017544599999994,0.59035452499999996,0.59036283000000001,0.59046430599999999,0.59046856999999997,0.59049558899999999,0.59060754100000001,0.59062925300000002,0.59064845249999998,0.59085365550000002,0.59094057300000002,0.59094546400000003,0.5909981835,0.59099947899999994,0.59106043149999998,0.59113291000000001,0.59115690300000001,0.59121944900000001,0.59141369600000004,0.59143065500000003,0.59159791799999994,0.591771202,0.59180093300000003,0.59185455549999999,0.59188186099999995,0.59189369699999994,0.59198195500000006,0.59200845349999998,0.59213808499999998,0.59213881999999995,0.59215456499999997,0.59223150899999999,0.59224542899999999,0.59240127450000002,0.59255335600000003,0.59258548300000002,0.59262279900000003,0.59263734400000001,0.59284498799999996,0.59296072899999996,0.592983394,0.59299252700000005,0.59305264400000002,0.59308808050000006,0.59311763900000003,0.59314961350000006,0.59316945600000004,0.59322180499999999,0.59351981200000004,0.59353194149999999,0.59361203200000001,0.59366775999999999,0.593673652,0.59371386049999997,0.593776203,0.59378639850000003,0.59381643049999999,0.59389605099999998,0.59400982700000005,0.59422531000000001,0.59426837499999996,0.59433667300000004,0.59443429599999997,0.59451059500000003,0.59453230300000004,0.59462536600000004,0.59467144700000008,0.59477260399999998,0.59479179100000001,0.59479548199999999,0.59479720800000002,0.59480192249999997,0.59481617499999995,0.59485060300000003,0.59489869750000002,0.594908145,0.59508521199999997,0.59515183599999999,0.59522942499999998,0.59540536649999998,0.59556993800000002,0.59572380999999996,0.5959536795,0.59608727100000003,0.59610229299999995,0.596120019,0.59617956599999999,0.59623750499999995,0.59634153299999992,0.59637141500000002,0.59637810450000006,0.59650254349999998,0.59655671799999999,0.59663324699999998,0.59671547449999995,0.59681828999999997,0.596839546,0.59693693550000004,0.59697801100000003,0.59701532000000002,0.59705277299999993,0.59715552399999994,0.59717330899999999,0.59720844799999995,0.59726681500000001,0.59727846200000001,0.5974858475,0.59757531200000003,0.59759053500000003,0.59759480050000002,0.59772249099999997,0.59775043299999997,0.59783546499999995,0.59785667549999999,0.59787002499999997,0.59788744650000003,0.59799121399999999,0.59814893300000005,0.59816010200000003,0.59819699999999998,0.59829716499999996,0.59840322199999996,0.59846791750000006,0.59847929900000008,0.59855725999999998,0.59856178100000001,0.59858165900000004,0.59898122300000001,0.59934884150000001,0.59934925999999999,0.59945103100000008,0.59947313899999999,0.599816075,0.59985902600000007,0.59993366100000001,0.60001589099999997,0.60004743650000003,0.60010869,0.60011955750000001,0.60026840800000003,0.600322982,0.60047009400000007,0.6005620585,0.60074068800000002,0.60091377000000001,0.60120319,0.60164888599999999,0.60167180500000006,0.60182659700000007,0.60195017800000006,0.60242264499999998,0.60250761450000001,0.60256690749999997,0.60287469299999996,0.60296132150000004,0.60312013399999997,0.60339880200000007,0.60343582900000003,0.60403973399999999,0.60418678999999997,0.60449347499999995,0.60477834100000005,0.60478874000000005,0.60499718899999999,0.60499962200000001,0.60537653800000002,0.605401411,0.60669234100000002,0.60674804900000001,0.60720599499999994,0.60733578799999999,0.60822944000000001,0.608232989,0.60847211649999999,0.60871409349999994,0.60905417399999995,0.60952635300000002,0.61119189699999998,0.61148207099999996,0.61297636700000002,0.61442279899999996,0.61466613749999999,0.61529254899999997,0.619134929,0.62466176449999999,0.64027732800000003,0.6403555675,0.64514263900000002,0.64719151750000004,0.65365311250000002,0.65969262849999999,0.67603389599999997,1.458721803],"16":[7.5079999999999995e-08,7.5310000000000004e-08,7.5530000000000002e-08,7.554e-08,7.554e-08,7.5719999999999992e-08,7.5759999999999998e-08,7.5759999999999998e-08,7.5920000000000007e-08,7.5969999999999998e-08,7.5969999999999998e-08,7.5979999999999996e-08,7.5979999999999996e-08,7.5989999999999994e-08,7.603e-08,7.603e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6199999999999994e-08,7.6210000000000005e-08,7.6389999999999998e-08,7.6410000000000007e-08,7.6410000000000007e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.6420000000000005e-08,7.642999999999999e-08,7.642999999999999e-08,7.642999999999999e-08,7.6440000000000002e-08,7.645e-08,7.6480000000000007e-08,7.6599999999999998e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6640000000000003e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6650000000000001e-08,7.6660000000000013e-08,7.6660000000000013e-08,7.6660000000000013e-08,7.6669999999999998e-08,7.6729999999999986e-08,7.6749999999999996e-08,7.6799999999999999e-08,7.6850000000000003e-08,7.6860000000000001e-08,7.6860000000000001e-08,7.6860000000000001e-08,7.6860000000000001e-08,7.6860000000000001e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6869999999999999e-08,7.6879999999999998e-08,7.6879999999999998e-08,7.6890000000000009e-08,7.7030000000000009e-08,7.7060000000000003e-08,7.7079999999999999e-08,7.7079999999999999e-08,7.7079999999999999e-08,7.7079999999999999e-08,7.7079999999999999e-08,7.7079999999999999e-08,7.7089999999999997e-08,7.7089999999999997e-08,7.7089999999999997e-08,7.7089999999999997e-08,7.7100000000000009e-08,7.7100000000000009e-08,7.7109999999999994e-08,7.7130000000000003e-08,7.7260000000000005e-08,7.7270000000000003e-08,7.7270000000000003e-08,7.7270000000000003e-08,7.7280000000000001e-08,7.7289999999999999e-08,7.7300000000000011e-08,7.7300000000000011e-08,7.7300000000000011e-08,7.7300000000000011e-08,7.7300000000000011e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7309999999999995e-08,7.7319999999999994e-08,7.7319999999999994e-08,7.7319999999999994e-08,7.7319999999999994e-08,7.7319999999999994e-08,7.7330000000000005e-08,7.7340000000000003e-08,7.7340000000000003e-08,7.7340000000000003e-08,7.740999999999999e-08,7.7490000000000001e-08,7.7499999999999999e-08,7.751000000000001e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7530000000000007e-08,7.7540000000000005e-08,7.7540000000000005e-08,7.7540000000000005e-08,7.7540000000000005e-08,7.7540000000000005e-08,7.7540000000000005e-08,7.754999999999999e-08,7.754999999999999e-08,7.754999999999999e-08,7.754999999999999e-08,7.7560000000000001e-08,7.7680000000000005e-08,7.7700000000000001e-08,7.7719999999999997e-08,7.7719999999999997e-08,7.7729999999999995e-08,7.7729999999999995e-08,7.7749999999999991e-08,7.7749999999999991e-08,7.7760000000000003e-08,7.7760000000000003e-08,7.7760000000000003e-08,7.7760000000000003e-08,7.7770000000000001e-08,7.7770000000000001e-08,7.7770000000000001e-08,7.7789999999999997e-08,7.7789999999999997e-08,7.7880000000000007e-08,7.7889999999999991e-08,7.7959999999999991e-08,7.7970000000000003e-08,7.7970000000000003e-08,7.7980000000000001e-08,7.7980000000000001e-08,7.7980000000000001e-08,7.7980000000000001e-08,7.7980000000000001e-08,7.7989999999999999e-08,7.8040000000000003e-08,7.8089999999999993e-08,7.8120000000000014e-08,7.8189999999999987e-08,7.8189999999999987e-08,7.8199999999999999e-08,7.8199999999999999e-08,7.8199999999999999e-08,7.8209999999999997e-08,7.8220000000000008e-08,7.8269999999999999e-08,7.8269999999999999e-08,7.8310000000000004e-08,7.8369999999999993e-08,7.8409999999999999e-08,7.8409999999999999e-08,7.8439999999999993e-08,7.8439999999999993e-08,7.8580000000000006e-08,7.8619999999999999e-08,7.8669999999999989e-08,7.882e-08,7.8869999999999991e-08,7.9739999999999998e-08,7.9980000000000005e-08,7.9980000000000005e-08,8.0020000000000011e-08,8.0210000000000002e-08,8.0229999999999998e-08,8.0239999999999996e-08,8.0309999999999996e-08,8.0410000000000003e-08,8.0430000000000013e-08,8.0439999999999998e-08,8.0460000000000007e-08,8.0509999999999998e-08,8.0560000000000001e-08,8.0669999999999994e-08,8.0669999999999994e-08,8.0679999999999992e-08,8.0700000000000001e-08,8.0730000000000009e-08,8.0870000000000009e-08,8.0900000000000003e-08,8.0919999999999999e-08,8.0919999999999999e-08,8.0940000000000009e-08,8.0940000000000009e-08,8.0960000000000005e-08,8.1129999999999999e-08,8.1140000000000011e-08,8.1149999999999995e-08,8.1149999999999995e-08,8.131999999999999e-08,8.1429999999999995e-08,8.1600000000000003e-08,8.1610000000000001e-08,8.1610000000000001e-08,8.1620000000000012e-08,8.1750000000000001e-08,8.1829999999999999e-08,8.1859999999999993e-08,8.2369999999999989e-08,8.3399999999999992e-08,8.3579999999999998e-08,8.3879999999999994e-08,8.3999999999999998e-08,8.4120000000000002e-08,8.413e-08,8.4359999999999996e-08,8.4600000000000003e-08,8.4610000000000014e-08,8.4849999999999995e-08,8.4849999999999995e-08,8.4859999999999994e-08,8.4859999999999994e-08,8.4880000000000003e-08,8.5059999999999995e-08,8.5310000000000001e-08,8.5339999999999995e-08,8.5359999999999991e-08,8.5390000000000012e-08,8.5390000000000012e-08,8.5609999999999997e-08,8.5850000000000004e-08,8.5900000000000008e-08,8.643e-08,9.0990000000000009e-08,9.139e-08,9.5689999999999992e-08,1.0816e-07,1.0818999999999999e-07,1.0831e-07,1.1204e-07,1.1253e-07,1.1266e-07,1.1382000000000001e-07],"640":[9.5174799999999995e-05,9.5212999999999998e-05,9.5215000000000002e-05,9.5221000000000002e-05,9.5223999999999995e-05,9.5227000000000002e-05,9.5227000000000002e-05,9.5230999999999997e-05,9.5239000000000001e-05,9.8642187500000005e-05,9.9613999999999999e-05,9.9617000000000005e-05,9.9625999999999998e-05,9.9627833333333342e-05,9.9629000000000004e-05,9.9634000000000002e-05,9.9635000000000004e-05,9.9635000000000004e-05,9.9644999999999999e-05,9.9646000000000001e-05,9.9646000000000001e-05,9.9648000000000005e-05,9.9648999999999994e-05,9.9654999999999994e-05,9.9654999999999994e-05,9.9659000000000002e-05,9.9660000000000005e-05,9.9664e-05,9.9667000000000006e-05,9.9667999999999995e-05,9.9673999999999995e-05,9.9677000000000001e-05,9.9678000000000003e-05,9.9679000000000006e-05,9.9679999999999994e-05,9.9680999999999996e-05,9.9680999999999996e-05,9.9683000000000001e-05,9.9684000000000003e-05,9.9684000000000003e-05,9.9685000000000005e-05,9.9690000000000003e-05,9.9690000000000003e-05,9.9692999999999996e-05,9.9701e-05,9.9709000000000004e-05,9.9711999999999997e-05,9.9712999999999999e-05,9.9715000000000003e-05,9.9716000000000005e-05,9.9721000000000003e-05,9.9722999999999994e-05,9.9722999999999994e-05,9.9735000000000006e-05,9.9735000000000006e-05,9.9736714285714284e-05,9.9736999999999997e-05,9.9738e-05,9.9742999999999997e-05,9.9751000000000001e-05,9.9760999999999996e-05,9.9760999999999996e-05,9.9760999999999996e-05,9.9764000000000002e-05,9.9770000000000002e-05,9.9777000000000004e-05,9.9778000000000006e-05,9.9778999999999995e-05,9.9779999999999997e-05,9.9780999999999999e-05,9.9838000000000002e-05,9.9858000000000005e-05,0.00010050340909090908,0.00010145185714285714,0.00010184346315789473,0.00010195147126436782,0.00010211592631578948,0.00010224865263157895,0.0001023187356321839,0.0001023269894736842,0.00010239143157894737,0.00010248351578947369,0.00010249476000000001,0.00010256274736842105,0.00010256342857142856,0.00010274212631578948,0.00010275546315789474,0.00010287981052631578,0.00010293963414634146,0.00010305207368421052,0.00010309941052631578,0.00010320942696629214,0.000103279,0.00010329551578947368,0.00010333301052631579,0.00010339918181818181,0.00010341254736842106,0.00010343469318181818,0.00010343750574712643,0.00010345351724137931,0.00010354402298850575,0.00010357861627906977,0.00010359745263157895,0.00010359839189189188,0.0001036026,0.00010363112631578946,0.00010375916666666667,0.00010378254838709678,0.00010385551948051949,0.0001038578275862069,0.00010391865909090909,0.00010392499999999999,0.00010399887368421054,0.00010401193684210527,0.00010405957471264367,0.00010407279310344827,0.00010409296842105264,0.00010410412631578948,0.00010414731578947368,0.00010418052380952381,0.00010419606818181819,0.00010423257894736841,0.0001042694,0.00010427257954545455,0.00010431327586206896,0.00010432690000000001,0.00010437997894736842,0.00010438654545454545,0.00010439288764044945,0.000104465,0.00010446520000000001,0.00010447040000000001,0.00010447481818181818,0.00010447675000000001,0.00010447849999999999,0.00010448460000000001,0.000104486,0.00010448666666666667,0.000104487,0.00010448766666666666,0.000104489,0.00010449,0.00010449,0.000104491,0.000104497,0.00010450119999999999,0.00010450732631578947,0.000104509,0.00010451,0.00010451,0.000104512,0.00010451299999999999,0.00010451299999999999,0.000104514,0.000104516,0.000104517,0.000104521,0.000104521,0.000104523,0.00010452500000000001,0.000104527,0.000104528,0.00010453,0.00010453100000000001,0.00010453799999999999,0.00010454399999999999,0.00010454399999999999,0.000104545,0.000104546,0.000104552,0.000104553,0.00010455600000000001,0.00010455766666666666,0.000104559,0.000104566,0.000104566,0.00010456800000000001,0.00010456800000000001,0.00010456899999999999,0.000104573,0.00010457400000000001,0.000104577,0.000104577,0.000104578,0.00010458329885057472,0.000104585,0.000104585,0.00010458699999999999,0.00010458699999999999,0.000104591,0.000104591,0.000104596,0.000104602,0.000104602,0.00010460500000000001,0.00010460599999999999,0.000104608,0.000104609,0.000104609,0.000104617,0.000104619,0.000104621,0.000104628,0.000104633,0.00010463600000000001,0.000104644,0.000104658,0.00010466700000000001,0.000104681,0.00010469318072289223,0.000104694,0.00010469899999999999,0.000104709,0.00010472146067415731,0.000104722,0.00010477200000000001,0.00010482679545454546,0.000104867,0.00010494803488372092,0.00010498899999999999,0.00010510067088607595,0.00010522661176470588,0.00010527878409090909,0.000105294,0.00010531233333333334,0.000105380125,0.00010543893103448275,0.00010555536363636363,0.00010605239772727271,0.00010630552702702703,0.00010634215294117647,0.00010635511363636363,0.00010652454545454545,0.00010712778571428571,0.00010731830379746836,0.00010732582716049382,0.00010759207228915663,0.00010783616049382716,0.00010794333333333333,0.00010807301369863014,0.00010819364772727272,0.00010829200000000001,0.00010835602272727273,0.00010841661363636363,0.00010842120454545456,0.000108672375,0.00010867251136363636,0.00010899379069767443,0.00010948010526315788,0.00011058739759036145,0.00011086818666666667,0.00011196757954545453,0.00011239259090909092,0.00011258060227272728,0.000112792,0.00011280100000000001,0.000112803,0.000112824,0.000112836,0.00011283899999999999,0.000112854,0.000112855,0.00011285699999999999,0.000112861,0.00011287,0.00011299299999999999,0.000113,0.000113,0.000113044,0.000113083,0.00011349,0.00011379200000000001,0.00011416845,0.00019332590196078432,0.000193869,0.00021143400000000001,0.00021177300000000001,0.00021530900000000001,0.00022242299999999999,0.00022750799999999999,0.00024502299999999997],"192":[9.4122499999999995e-06,9.4288000000000003e-06,9.4350000000000003e-06,9.4404000000000003e-06,9.4407200000000006e-06,9.4449454545454536e-06,9.4458000000000003e-06,9.4473333333333336e-06,9.4484999999999994e-06,9.4523333333333327e-06,9.4523333333333327e-06,9.4535000000000002e-06,9.4547499999999996e-06,9.4560000000000006e-06,9.4576666666666675e-06,9.4615000000000008e-06,9.4635000000000001e-06,9.4656666666666664e-06,9.4658333333333335e-06,9.4686835443037986e-06,9.4706470588235301e-06,9.4713333333333337e-06,9.482e-06,9.5009999999999993e-06,9.5300000000000002e-06,9.5429999999999999e-06,9.5470000000000002e-06,9.550589999999999e-06,9.5540000000000003e-06,9.5540000000000003e-06,9.5571500000000005e-06,9.5580000000000006e-06,9.5589999999999994e-06,9.5589999999999994e-06,9.5643799999999997e-06,9.5740000000000002e-06,9.5779299999999989e-06,9.5780000000000005e-06,9.5797799999999996e-06,9.58337e-06,9.5840000000000001e-06,9.5877600000000005e-06,9.5880000000000004e-06,9.5881799999999994e-06,9.5909800000000005e-06,9.6046699999999993e-06,9.6108499999999996e-06,9.611e-06,9.6120000000000005e-06,9.6135700000000002e-06,9.6180000000000001e-06,9.6199999999999994e-06,9.6296699999999999e-06,9.6328700000000002e-06,9.6413500000000004e-06,9.6531199999999988e-06,9.6668299999999991e-06,9.6695100000000002e-06,9.6747099999999997e-06,9.6766599999999989e-06,9.6774600000000007e-06,9.6863999999999993e-06,9.68813e-06,9.69399e-06,9.6952199999999996e-06,9.6961300000000006e-06,9.6999800000000006e-06,9.7005300000000001e-06,9.70077e-06,9.7016399999999998e-06,9.702190000000001e-06,9.702209999999999e-06,9.7024100000000012e-06,9.7028699999999995e-06,9.707256097560976e-06,9.7098100000000005e-06,9.710182926829268e-06,9.7188799999999997e-06,9.7212899999999989e-06,9.7231500000000002e-06,9.7260100000000004e-06,9.726430000000001e-06,9.7335400000000003e-06,9.7389799999999997e-06,9.7468100000000003e-06,9.7478300000000005e-06,9.7488900000000001e-06,9.7585100000000005e-06,9.7660499999999994e-06,9.7722900000000006e-06,9.7726399999999997e-06,9.7777499999999997e-06,9.7878499999999998e-06,9.7914599999999999e-06,9.804499999999999e-06,9.8094099999999986e-06,9.8094099999999986e-06,9.8122899999999985e-06,9.8149400000000009e-06,9.8283599999999995e-06,9.829350000000001e-06,9.8297800000000006e-06,9.8359399999999995e-06,9.8386599999999984e-06,9.8435499999999983e-06,9.8490899999999996e-06,9.8490899999999996e-06,9.8507500000000005e-06,9.8512899999999993e-06,9.8521999999999986e-06,9.85314e-06,9.8541400000000005e-06,9.8554900000000001e-06,9.8562000000000006e-06,9.8563300000000012e-06,9.8588285714285715e-06,9.8595499999999995e-06,9.8606744186046507e-06,9.8627400000000007e-06,9.8633333333333326e-06,9.8666999999999999e-06,9.8686299999999994e-06,9.870571428571428e-06,9.8718200000000006e-06,9.8719400000000006e-06,9.8735714285714278e-06,9.8744900000000011e-06,9.8749999999999995e-06,9.8754399999999998e-06,9.8766999999999998e-06,9.8780900000000005e-06,9.8782399999999991e-06,9.8796800000000016e-06,9.8797100000000003e-06,9.8804300000000016e-06,9.8830000000000001e-06,9.8836999999999999e-06,9.8837199999999996e-06,9.8854799999999991e-06,9.8872698412698413e-06,9.8885500000000004e-06,9.8887600000000015e-06,9.8889399999999989e-06,9.8893700000000002e-06,9.8919999999999995e-06,9.8939800000000008e-06,9.8940000000000005e-06,9.89426e-06,9.8964100000000014e-06,9.896720000000001e-06,9.8984599999999991e-06,9.8988135593220349e-06,9.8995000000000007e-06,9.9008199999999998e-06,9.9015800000000005e-06,9.9018400000000001e-06,9.9023300000000004e-06,9.902870000000001e-06,9.906159999999999e-06,9.9066499999999994e-06,9.9089999999999995e-06,9.9105399999999988e-06,9.9110000000000005e-06,9.9125800000000009e-06,9.9165000000000007e-06,9.9199399999999991e-06,9.9225399999999997e-06,9.9247e-06,9.9289999999999993e-06,9.9296299999999993e-06,9.9306000000000011e-06,9.9339300000000003e-06,9.94015e-06,9.9422500000000012e-06,9.9476600000000002e-06,9.9533500000000002e-06,9.978e-06,9.9799999999999993e-06,9.9994199999999992e-06,1.0013999999999999e-05,1.001881e-05,1.0019e-05,1.001926e-05,1.0023999999999999e-05,1.0030709999999999e-05,1.0040999999999999e-05,1.0047999999999999e-05,1.007504e-05,1.0084040000000001e-05,1.0087909999999999e-05,1.0104809999999999e-05,1.01085e-05,1.011421e-05,1.0122029999999999e-05,1.012335e-05,1.0146169999999999e-05,1.0164340000000001e-05,1.016812e-05,1.0168550000000001e-05,1.0194410000000001e-05,1.019582e-05,1.0195889999999999e-05,1.019651e-05,1.0197579999999999e-05,1.0200269999999999e-05,1.020876e-05,1.021454e-05,1.0215820000000001e-05,1.0223299999999999e-05,1.024923e-05,1.0280860000000001e-05,1.0281949999999999e-05,1.0282749999999999e-05,1.031499e-05,1.0319428571428572e-05,1.0330649999999999e-05,1.0336539999999999e-05,1.033725e-05,1.0338260000000001e-05,1.0339220000000001e-05,1.033979e-05,1.0345179999999999e-05,1.0350170000000001e-05,1.0351110000000001e-05,1.0354699999999999e-05,1.0354870000000001e-05,1.035572e-05,1.035657e-05,1.035866e-05,1.036236e-05,1.0362929999999999e-05,1.0362940000000001e-05,1.036347e-05,1.0364560000000001e-05,1.0365429999999999e-05,1.036629e-05,1.03665e-05,1.03666e-05,1.0368400000000001e-05,1.0369030000000001e-05,1.0372666666666668e-05,1.0374640000000002e-05,1.037808e-05,1.0379933333333334e-05,1.0380000000000001e-05,1.038287e-05,1.0383e-05,1.0385940000000001e-05,1.039253e-05,1.040469e-05,1.0407210000000002e-05,1.0410666666666667e-05,1.04112e-05,1.0441200000000001e-05,1.0446e-05,1.0487260000000001e-05,1.050977e-05,1.0516999999999999e-05,1.05444e-05,1.0591489999999999e-05,1.0771279999999998e-05,1.081899e-05,1.084074e-05,1.0865180000000001e-05,1.10768e-05,1.1096700000000002e-05,1.1153600000000001e-05,1.115603e-05,1.1158609999999999e-05,1.1159720000000001e-05,1.1171589999999999e-05,1.117301e-05,1.122762e-05,1.187352e-05,1.7655710000000002e-05,1.9440780000000001e-05,1.9585649999999998e-05,1.974275e-05,2.0407139999999999e-05,2.06883e-05,2.0931809999999999e-05],"24":[1.5879999999999999e-07,1.5922000000000002e-07,1.5923e-07,1.5927e-07,1.5928000000000001e-07,1.593e-07,1.5945000000000001e-07,1.5946e-07,1.5946e-07,1.5948999999999998e-07,1.5957999999999998e-07,1.5963000000000001e-07,1.5967000000000003e-07,1.5967000000000003e-07,1.5968000000000001e-07,1.5968000000000001e-07,1.5968000000000001e-07,1.5976e-07,1.5979999999999999e-07,1.5984999999999999e-07,1.5988999999999998e-07,1.5990000000000002e-07,1.5990000000000002e-07,1.5991000000000001e-07,1.5991000000000001e-07,1.5993e-07,1.5994999999999997e-07,1.6010000000000001e-07,1.6011999999999998e-07,1.6011999999999998e-07,1.6011999999999998e-07,1.6013000000000002e-07,1.6016999999999998e-07,1.6030999999999998e-07,1.6033000000000001e-07,1.6033000000000001e-07,1.6033999999999999e-07,1.6035e-07,1.6035e-07,1.6035e-07,1.6035e-07,1.6035e-07,1.6036000000000001e-07,1.6036000000000001e-07,1.6036000000000001e-07,1.6037e-07,1.6039e-07,1.6046e-07,1.6051e-07,1.6055000000000002e-07,1.6056e-07,1.6056e-07,1.6056e-07,1.6056999999999999e-07,1.6056999999999999e-07,1.6056999999999999e-07,1.6056999999999999e-07,1.6056999999999999e-07,1.6058e-07,1.6058e-07,1.6058e-07,1.6058e-07,1.6059000000000001e-07,1.6059000000000001e-07,1.6061999999999999e-07,1.6062999999999998e-07,1.6064000000000001e-07,1.6069000000000002e-07,1.607e-07,1.6076999999999998e-07,1.6076999999999998e-07,1.6078000000000001e-07,1.6078000000000001e-07,1.6079e-07,1.6079e-07,1.6079e-07,1.6079e-07,1.6079e-07,1.6081e-07,1.6081e-07,1.6082000000000001e-07,1.6090999999999998e-07,1.6092000000000001e-07,1.6096999999999999e-07,1.6098999999999999e-07,1.6099999999999997e-07,1.6099999999999997e-07,1.6099999999999997e-07,1.6099999999999997e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6101000000000001e-07,1.6102e-07,1.6102e-07,1.6103000000000001e-07,1.6103000000000001e-07,1.6103000000000001e-07,1.6103999999999999e-07,1.6105e-07,1.6105e-07,1.6107e-07,1.6119e-07,1.6123000000000002e-07,1.6123000000000002e-07,1.6123000000000002e-07,1.6124000000000001e-07,1.6124000000000001e-07,1.6124000000000001e-07,1.6124999999999999e-07,1.6124999999999999e-07,1.6130999999999998e-07,1.6130999999999998e-07,1.6144999999999998e-07,1.6144999999999998e-07,1.6146000000000002e-07,1.6146000000000002e-07,1.6146000000000002e-07,1.6147e-07,1.6147e-07,1.6164000000000001e-07,1.6169000000000001e-07,1.617e-07,1.6192000000000001e-07,1.6201000000000001e-07,1.6334000000000001e-07,1.6436999999999998e-07,1.6457e-07,1.6457e-07,1.6458999999999999e-07,1.6478e-07,1.6481e-07,1.6500000000000001e-07,1.6501999999999998e-07,1.6512000000000001e-07,1.6532999999999999e-07,1.6546e-07,1.6548000000000002e-07,1.6548000000000002e-07,1.6565e-07,1.6569e-07,1.6572e-07,1.6572e-07,1.6574e-07,1.6577999999999999e-07,1.659e-07,1.6591000000000001e-07,1.6591000000000001e-07,1.6591999999999999e-07,1.6591999999999999e-07,1.6592999999999998e-07,1.6594000000000002e-07,1.6609999999999999e-07,1.6611e-07,1.6612999999999999e-07,1.6612999999999999e-07,1.6612999999999999e-07,1.6631000000000001e-07,1.6632e-07,1.6635e-07,1.6635e-07,1.6635e-07,1.6639000000000002e-07,1.6639000000000002e-07,1.6640000000000001e-07,1.6645000000000001e-07,1.6654999999999999e-07,1.6656999999999999e-07,1.6656999999999999e-07,1.6658e-07,1.6659000000000001e-07,1.666e-07,1.6677e-07,1.6682000000000001e-07,1.6696999999999999e-07,1.6702999999999998e-07,1.6704000000000002e-07,1.6721000000000003e-07,1.6722000000000001e-07,1.6724999999999999e-07,1.6727000000000001e-07,1.6745999999999999e-07,1.6761e-07,1.6764000000000001e-07,1.6764000000000001e-07,1.6765999999999998e-07,1.6796e-07,1.6798e-07,1.6804000000000001e-07,1.6804000000000001e-07,1.6804000000000001e-07,1.681e-07,1.6824e-07,1.6827000000000001e-07,1.6828e-07,1.6828e-07,1.6843000000000001e-07,1.6849e-07,1.6850000000000001e-07,1.6850999999999999e-07,1.6850999999999999e-07,1.6875e-07,1.6878000000000001e-07,1.6896e-07,1.6898e-07,1.6898e-07,1.6898999999999998e-07,1.6898999999999998e-07,1.6943999999999999e-07,1.7044999999999999e-07,1.7081999999999999e-07,1.7104999999999999e-07,1.7122999999999998e-07,1.7127e-07,1.7136999999999998e-07,1.7152000000000002e-07,1.7153999999999999e-07,1.7176999999999998e-07,1.7198999999999999e-07,1.7223999999999999e-07,1.7227999999999998e-07,1.7248000000000002e-07,1.7263e-07,1.7275000000000001e-07,1.7277e-07,1.7286999999999999e-07,1.7387999999999999e-07,1.7401999999999999e-07,1.7414e-07,1.7422000000000001e-07,1.7433999999999998e-07,1.7433999999999998e-07,1.7455000000000001e-07,1.7459999999999999e-07,1.7464000000000001e-07,1.7465999999999998e-07,1.7478999999999999e-07,1.7478999999999999e-07,1.7529999999999999e-07,1.7552e-07,1.7600000000000001e-07,1.7609000000000001e-07,1.7618999999999999e-07,1.7646000000000001e-07,1.7648999999999999e-07,1.7662e-07,1.7674999999999999e-07,1.7674999999999999e-07,1.7683999999999999e-07,1.7723000000000001e-07,1.7728000000000001e-07,1.7730999999999999e-07,1.7748999999999998e-07,1.7926999999999999e-07,1.7975999999999999e-07,1.8213e-07,1.8230000000000001e-07,1.8260999999999999e-07,1.8281000000000001e-07,1.8291000000000001e-07,1.8308000000000002e-07,1.8314000000000001e-07,1.8334e-07,1.8824000000000002e-07,1.885e-07,1.8994000000000002e-07,1.9071000000000002e-07,1.9119999999999999e-07,1.9177999999999999e-07,1.9697000000000002e-07,2.0247000000000001e-07,2.3529000000000001e-07,2.3624e-07,2.3654e-07,2.3822e-07,2.4176999999999997e-07,2.4578000000000002e-07,2.6402e-07],"4096":[0.0039205500000000001,0.003941178,0.0039513609999999996,0.00397226,0.0039741819999999997,0.0039783919999999999,0.0039797230000000001,0.0039841709999999999,0.0039863759999999998,0.0039874439999999997,0.0039882429999999998,0.003996225,0.0040080719999999997,0.0040085800000000003,0.0040096200000000002,0.0040098764999999996,0.0040131840000000004,0.004015663,0.0040167270000000003,0.0040189969999999998,0.0040193829999999996,0.0040197855000000003,0.0040198830000000001,0.0040205750000000002,0.0040228770000000002,0.0040243585000000002,0.0040256720000000001,0.0040259809999999997,0.0040275665000000004,0.0040278149999999997,0.0040289734999999997,0.0040292230000000002,0.0040295595,0.0040321159999999997,0.0040324354999999997,0.0040357830000000003,0.0040366005000000002,0.0040367270000000004,0.0040373620000000001,0.0040374844999999998,0.0040382120000000002,0.0040424900000000001,0.0040435610000000002,0.0040436600000000001,0.0040453609999999999,0.0040455504999999999,0.0040458220000000001,0.0040460734999999996,0.004048355,0.0040486254999999999,0.0040501605000000003,0.0040507994999999996,0.0040519795000000004,0.0040522904999999998,0.0040525005000000003,0.0040525179999999997,0.0040530434999999998,0.0040539075000000004,0.004055632,0.0040556634999999999,0.0040557780000000003,0.0040563439999999999,0.0040565150000000001,0.0040574399999999998,0.0040574749999999996,0.0040594919999999996,0.0040598939999999997,0.0040606619999999996,0.0040638990000000002,0.0040642320000000001,0.0040643010000000002,0.0040649114999999998,0.0040661595000000003,0.0040673999999999997,0.0040678060000000002,0.0040684570000000001,0.004070761,0.0040715975000000003,0.0040725029999999999,0.0040736885000000004,0.0040737719999999998,0.0040744190000000001,0.0040747530000000004,0.0040751614999999996,0.0040756430000000003,0.0040766615000000003,0.0040766884999999999,0.0040771829999999998,0.0040775634999999999,0.0040776149999999997,0.0040786249999999998,0.0040787334999999999,0.0040820639999999998,0.0040824169999999996,0.0040825799999999997,0.0040830160000000001,0.0040842150000000004,0.0040846175000000002,0.0040863380000000001,0.0040864489999999998,0.0040869770000000003,0.0040872809999999999,0.0040873319999999999,0.0040876369999999999,0.0040885310000000003,0.0040887765000000003,0.0040893185000000004,0.0040901519999999997,0.0040950530000000004,0.0040954540000000001,0.0040963320000000003,0.0040975485000000001,0.0040978919999999997,0.0040981710000000003,0.0040988365000000004,0.0040999425000000003,0.0041010329999999996,0.0041011880000000004,0.004102161,0.0041024369999999996,0.0041027859999999998,0.0041033989999999998,0.0041052450000000004,0.0041058270000000003,0.0041064980000000001,0.0041069310000000003,0.0041071839999999998,0.0041076890000000003,0.004109723,0.0041100434999999996,0.0041113809999999999,0.004112091,0.0041132555000000003,0.0041135959999999997,0.0041143834999999998,0.0041150364999999996,0.0041177549999999999,0.0041190189999999998,0.0041201375,0.0041208929999999996,0.0041227534999999996,0.0041231864999999998,0.0041235990000000004,0.0041263539999999996,0.0041265649999999996,0.004126836,0.0041279410000000004,0.0041282239999999998,0.0041292179999999996,0.0041292999999999998,0.0041295345000000004,0.0041298009999999998,0.004130107,0.0041309739999999999,0.0041324020000000003,0.0041324109999999999,0.00413262,0.0041334804999999999,0.004134408,0.0041375129999999998,0.0041378279999999996,0.0041380085,0.0041399439999999996,0.0041405900000000004,0.0041406780000000001,0.0041413724999999997,0.0041419009999999999,0.0041420824999999998,0.0041425079999999996,0.0041425960000000001,0.0041432645000000004,0.0041434879999999999,0.0041437069999999999,0.0041455765000000004,0.0041460550000000001,0.0041465030000000002,0.0041484900000000003,0.0041493650000000003,0.0041498810000000002,0.0041506199999999998,0.0041523630000000001,0.0041552005000000001,0.0041573199999999999,0.0041598425000000001,0.0041601939999999999,0.0041613709999999996,0.0041629479999999996,0.0041638550000000002,0.0041643849999999996,0.004165045,0.0041672810000000001,0.0041681425000000003,0.0041685079999999996,0.0041690805000000001,0.0041706959999999998,0.0041734959999999996,0.0041739899999999998,0.0041743209999999999,0.0041763349999999998,0.0041764625000000003,0.0041774610000000004,0.0041778405000000001,0.0041783675000000003,0.0041792794999999999,0.0041835470000000001,0.0041841580000000003,0.0041842260000000001,0.0041849230000000001,0.0041852210000000003,0.0041889045,0.0041895220000000002,0.0041943845000000004,0.0042002619999999997,0.0042052260000000003,0.0042108240000000002,0.0042115190000000004,0.0042131299999999998,0.0042150240000000004,0.0042190085000000004,0.0042199094999999997,0.0042210499999999996,0.0042223304999999996,0.0042241735000000001,0.0042347770000000003,0.0042363375000000003,0.0042415350000000003,0.0042476824999999998,0.0042561129999999997,0.0042613319999999996,0.0042640400000000002,0.0042694635,0.0042712319999999998,0.0042823100000000001,0.0042875324999999999,0.0042901689999999999,0.0042920895000000004,0.0042987785000000002,0.0043054879999999997,0.0043099439999999996,0.0043239899999999998,0.004346857,0.0043481659999999997,0.0043536245000000001,0.0043544600000000001,0.0043584690000000002,0.0043587829999999998,0.0043645424999999996,0.0043985049999999996,0.0044406645000000002,0.0044431319999999998,0.0044435619999999999,0.0044461250000000004,0.0044520610000000002,0.004455311,0.0044560670000000002,0.004456471,0.0044575279999999997,0.0044582785000000002,0.0044585149999999997,0.0044592250000000111,0.0044605829999999997,0.004462115,0.0044648939999999996,0.0044680850000000001,0.0044682120000000001,0.0044712830000000004,0.0044849080000000001,0.0044856979999999998,0.0044895335000000001,0.0044968365000000003,0.0045015669999999997,0.0045052740000000001,0.0045121320000000003,0.0052811109999999998,0.0084032589999999997,0.008580664,0.0087959089999999993,0.0088487670000000004,0.008937782,0.011016714,0.0116290145],"32":[2.6688000000000002e-07,2.7291999999999998e-07,2.7291999999999998e-07,2.7291999999999998e-07,2.7315999999999999e-07,2.7338000000000003e-07,2.7380999999999999e-07,2.7659999999999998e-07,2.7670999999999999e-07,2.7710999999999997e-07,2.7735000000000003e-07,2.7738000000000001e-07,2.7742000000000001e-07,2.7746e-07,2.776e-07,2.7779e-07,2.7795000000000002e-07,2.7804999999999998e-07,2.7804999999999998e-07,2.7805999999999999e-07,2.7809999999999998e-07,2.7812e-07,2.7814999999999999e-07,2.7823999999999998e-07,2.7824999999999999e-07,2.7828999999999999e-07,2.7828999999999999e-07,2.7841000000000002e-07,2.7849e-07,2.7850000000000001e-07,2.7871000000000004e-07,2.7873000000000001e-07,2.7875999999999999e-07,2.7879999999999998e-07,2.7891e-07,2.7894000000000003e-07,2.7894000000000003e-07,2.7919e-07,2.7939000000000002e-07,2.7939000000000002e-07,2.7940000000000003e-07,2.7943000000000001e-07,2.7961e-07,2.7962000000000001e-07,2.7963999999999998e-07,2.7980999999999996e-07,2.7982999999999999e-07,2.7994e-07,2.8072000000000004e-07,2.8116999999999997e-07,2.819e-07,2.8201000000000002e-07,2.8206999999999998e-07,2.8229999999999998e-07,2.8234000000000003e-07,2.8238999999999998e-07,2.8252000000000002e-07,2.8275000000000001e-07,2.8285000000000002e-07,2.8296739130434784e-07,2.8297e-07,2.8317999999999997e-07,2.8322000000000002e-07,2.8327999999999998e-07,2.8340000000000001e-07,2.8363000000000001e-07,2.8365000000000003e-07,2.8377000000000001e-07,2.8384999999999999e-07,2.8386e-07,2.8386e-07,2.8396999999999997e-07,2.8398000000000003e-07,2.8401000000000001e-07,2.8407000000000003e-07,2.8410000000000001e-07,2.8411999999999998e-07,2.8414e-07,2.8428999999999996e-07,2.8430000000000002e-07,2.8435999999999999e-07,2.8440999999999999e-07,2.8440999999999999e-07,2.8465e-07,2.8495999999999998e-07,2.8504999999999997e-07,2.8508000000000001e-07,2.8517000000000001e-07,2.8527000000000001e-07,2.8528999999999998e-07,2.8551999999999998e-07,2.8563e-07,2.8564000000000001e-07,2.8603000000000003e-07,2.8611000000000001e-07,2.8699e-07,2.8725999999999999e-07,2.8728000000000002e-07,2.8742000000000002e-07,2.8745e-07,2.8773e-07,2.8788000000000001e-07,2.8789000000000002e-07,2.8832999999999999e-07,2.8834e-07,2.8849000000000001e-07,2.8857e-07,2.8876e-07,2.8899e-07,2.8906999999999998e-07,2.8918e-07,2.8930999999999999e-07,2.8946e-07,2.8951e-07,2.8975999999999997e-07,2.8986999999999999e-07,2.8988e-07,2.8994999999999997e-07,2.8999999999999998e-07,2.903e-07,2.9033000000000003e-07,2.9077e-07,2.9091e-07,2.9107000000000002e-07,2.9116999999999998e-07,2.9125999999999998e-07,2.9149999999999998e-07,2.9166000000000001e-07,2.9166000000000001e-07,2.9181999999999998e-07,2.9189e-07,2.9195999999999998e-07,2.9195999999999998e-07,2.9237000000000002e-07,2.9257000000000003e-07,2.9264999999999996e-07,2.9275000000000002e-07,2.9307000000000002e-07,2.9313999999999999e-07,2.9322000000000003e-07,2.9324e-07,2.9325000000000001e-07,2.9325000000000001e-07,2.9345000000000002e-07,2.9348e-07,2.9354000000000002e-07,2.9368000000000002e-07,2.939e-07,2.9399e-07,2.9400000000000001e-07,2.9400999999999997e-07,2.9418e-07,2.9453000000000003e-07,2.9461000000000002e-07,2.9467999999999999e-07,2.9481000000000003e-07,2.9485999999999998e-07,2.9509000000000003e-07,2.9516999999999996e-07,2.9536000000000002e-07,2.9539e-07,2.9567e-07,2.9578999999999998e-07,2.9583000000000002e-07,2.9666000000000001e-07,2.9691999999999999e-07,2.9703000000000001e-07,2.9723000000000002e-07,2.9764000000000001e-07,2.9783000000000001e-07,2.9807000000000002e-07,2.9811999999999997e-07,2.9838e-07,2.9867999999999997e-07,2.9873999999999999e-07,2.9889e-07,2.9909000000000001e-07,2.9913000000000001e-07,2.9969000000000001e-07,2.9989999999999998e-07,3.0006e-07,3.0012000000000002e-07,3.0029e-07,3.0031000000000002e-07,3.0031999999999998e-07,3.0037999999999999e-07,3.0105999999999997e-07,3.0111999999999999e-07,3.0127e-07,3.0158999999999999e-07,3.0169e-07,3.0199000000000002e-07,3.0204999999999998e-07,3.0205999999999999e-07,3.0236999999999997e-07,3.0272e-07,3.0303000000000003e-07,3.0331000000000003e-07,3.0368999999999999e-07,3.0393e-07,3.0396999999999999e-07,3.0398e-07,3.0432000000000001e-07,3.0435e-07,3.0449e-07,3.0461999999999998e-07,3.0469000000000001e-07,3.0479999999999998e-07,3.0537000000000004e-07,3.0541999999999999e-07,3.0548000000000001e-07,3.0548000000000001e-07,3.0549000000000002e-07,3.0549999999999998e-07,3.0599000000000006e-07,3.0619000000000002e-07,3.065e-07,3.0676999999999999e-07,3.0694999999999998e-07,3.0703000000000002e-07,3.0714999999999999e-07,3.0722999999999998e-07,3.0747000000000004e-07,3.0783000000000002e-07,3.0788999999999999e-07,3.0803000000000004e-07,3.0818e-07,3.0914000000000003e-07,3.0963e-07,3.0970000000000003e-07,3.0972e-07,3.0986e-07,3.0997000000000002e-07,3.1047000000000005e-07,3.107e-07,3.1136999999999996e-07,3.1158000000000004e-07,3.1180000000000003e-07,3.1231000000000002e-07,3.1238e-07,3.1273999999999998e-07,3.1274999999999999e-07,3.1352000000000002e-07,3.1387000000000004e-07,3.1476999999999995e-07,3.1513999999999995e-07,3.1552000000000001e-07,3.1595999999999998e-07,3.1628999999999998e-07,3.1674000000000002e-07,3.1677e-07,3.1677999999999996e-07,3.1685999999999999e-07,3.1739000000000001e-07,3.1917000000000002e-07,3.1946999999999999e-07,3.2298e-07,3.2323999999999997e-07,3.2476e-07,3.2509000000000001e-07,3.2520000000000003e-07,3.2571999999999998e-07,3.2597e-07,3.2706000000000002e-07,3.2969000000000004e-07,3.2984999999999995e-07,3.3167999999999996e-07,3.3272000000000003e-07,3.3544000000000004e-07,3.3704999999999996e-07,3.3873000000000002e-07,3.481e-07,3.5074000000000003e-07,4.298e-07,4.5614000000000001e-07,4.5939000000000004e-07,4.6470000000000003e-07,4.7820999999999999e-07,4.8854999999999996e-07,5.0330000000000001e-07,5.2898000000000002e-07],"2048":[0.00096221499999999999,0.00099084600000000009,0.000990847,0.000990847,0.00099087599999999991,0.00099089899999999995,0.00099097399999999993,0.000990999,0.00099131700000000002,0.00099147100000000006,0.00099281099999999991,0.00099285600000000008,0.00099439600000000004,0.00099452599999999992,0.00099469899999999993,0.00099485299999999997,0.00099520399999999997,0.00099549199999999995,0.00099558599999999991,0.00099597500000000007,0.00099629699999999994,0.00099754800000000001,0.00099772455555555573,0.00099781099999999992,0.001001058,0.0010010640000000001,0.001001523,0.0010015670000000001,0.0010042983333333332,0.001004453,0.001004486,0.001005188,0.0010052570000000001,0.0010054294444444443,0.0010055419999999999,0.0010074649999999999,0.0010080829999999999,0.001008285,0.001009158,0.0010094150000000001,0.0010113870000000001,0.0010122144444444446,0.0010124143333333335,0.0010129270000000001,0.0010132006666666667,0.0010137029999999999,0.00101392,0.0010143089999999999,0.00101442,0.0010151097777777777,0.0010160169999999999,0.00101618375,0.0010183572222222223,0.001018513,0.0010187653333333334,0.0010189943333333332,0.0010192280000000001,0.0010193170000000001,0.0010194595555555557,0.0010196768888888889,0.0010199394444444444,0.0010201215555555557,0.0010201855555555554,0.0010202430000000001,0.0010204890000000001,0.0010209819999999999,0.0010211269999999999,0.0010212229999999999,0.0010215511111111111,0.0010216229999999999,0.0010217500000000001,0.001022506111111111,0.0010226355555555556,0.0010227050000000001,0.0010228920000000001,0.001023454,0.001024007,0.0010240413333333334,0.0010244643333333333,0.0010251084444444444,0.0010256530000000001,0.0010267064444444444,0.001027032,0.001027186,0.0010274552222222222,0.0010275954444444444,0.0010280599999999999,0.0010285372222222221,0.0010288264444444444,0.0010289974444444444,0.0010290779999999999,0.001029346,0.0010294381111111111,0.0010301570000000001,0.001030256111111111,0.0010308439999999999,0.0010309072222222221,0.0010314250000000001,0.0010317029999999999,0.0010318524444444443,0.00103236,0.0010324864444444446,0.0010325004444444444,0.0010325017499999999,0.001032556,0.0010326053333333332,0.0010327436666666666,0.0010328576666666666,0.0010330978888888889,0.0010333567777777778,0.0010336323333333334,0.0010341923333333333,0.001034419,0.001034718,0.0010349490000000001,0.0010356090000000001,0.0010356123333333334,0.0010360588888888888,0.0010361192222222222,0.0010361473333333334,0.0010369214444444445,0.0010372916666666666,0.0010373443333333333,0.001037432888888889,0.0010376427777777778,0.0010376776666666666,0.00103874,0.0010390760000000001,0.0010391630000000001,0.0010391642222222222,0.001039173,0.0010391790000000001,0.0010392000000000001,0.001039218,0.001039218,0.0010392279999999999,0.0010392299999999999,0.0010392400000000001,0.0010392450000000001,0.0010392719999999999,0.001039276,0.001039325,0.0010393959999999999,0.0010394099999999999,0.0010394167777777778,0.001039437,0.001039444,0.0010394715555555557,0.001039526,0.0010395960000000001,0.001039611,0.001039664888888889,0.001039697,0.0010397099999999999,0.0010397550000000001,0.0010397620000000001,0.0010398646666666667,0.00103987,0.0010399300000000001,0.00103995,0.0010400402222222223,0.0010401950000000001,0.0010404144444444445,0.0010405454444444443,0.001041045,0.001041225,0.001041344,0.001041405,0.0010415940000000001,0.0010416410000000001,0.001041658,0.001041698,0.0010417844444444444,0.0010418249999999999,0.0010418818888888889,0.0010420503333333333,0.001042535,0.0010430319999999999,0.0010435959999999999,0.0010436005555555555,0.0010436340000000001,0.001043918,0.0010442170000000001,0.001044409,0.0010444510000000001,0.0010448702222222222,0.0010450419999999999,0.0010451569999999999,0.0010454547777777779,0.001045483,0.001046246,0.0010468431111111112,0.0010471569999999999,0.001047482,0.001047788,0.0010480763333333334,0.0010484686666666666,0.0010485712222222223,0.001048628,0.0010493810000000001,0.0010495381111111112,0.001049555,0.0010495926666666668,0.0010498663333333334,0.001050311,0.001050537,0.001050542,0.0010507856666666666,0.0010512367777777776,0.0010514369999999999,0.0010514669999999999,0.001052079,0.001052157,0.0010523028888888889,0.0010525440000000001,0.0010526952222222222,0.0010527869999999999,0.001054171,0.0010544848888888888,0.001054627,0.001054728,0.0010550819999999999,0.001055191,0.0010552204444444445,0.0010556323749999999,0.0010556490000000001,0.0010565629999999999,0.0010568419999999999,0.001057353888888889,0.0010578129999999999,0.001059396,0.0010607053749999999,0.0010607193333333333,0.0010615147777777779,0.0010616973333333333,0.0010617809999999999,0.0010622425555555555,0.0010623507499999999,0.0010631029999999999,0.0010634033333333332,0.0010651079999999999,0.0010652215555555554,0.00106535875,0.0010654130000000001,0.0010750473333333334,0.001075639,0.001076390875,0.0010767915555555557,0.0010786575555555556,0.0010825004444444445,0.001090993,0.0010948640000000001,0.001098262125,0.0011018252499999999,0.0011095059999999999,0.00111221,0.00111776125,0.0011204315,0.001121223,0.0011213180000000001,0.0011213309999999999,0.001121407,0.0011214389999999999,0.00112214,0.0011260560000000001,0.0011269254999999999,0.0011279257499999999,0.0011281869999999999,0.0011342116250000001,0.001134241,0.0011366792499999999,0.0011568209999999999,0.001259107,0.0019748629999999999,0.0019784519999999999,0.0019798860000000001,0.0019949999999999998,0.0020185419999999999,0.002165452,0.0022970546666666665,0.002406844],"256":[1.6181e-05,1.6206999999999999e-05,1.6214399999999998e-05,1.621975e-05,1.6220749999999999e-05,1.6225000000000001e-05,1.6228249999999998e-05,1.6229999999999999e-05,1.6232e-05,1.6232999999999999e-05,1.6239000000000002e-05,1.6240333333333334e-05,1.6257999999999999e-05,1.6258666666666667e-05,1.6260999999999999e-05,1.6274999999999999e-05,1.6280999999999999e-05,1.6283e-05,1.6290000000000002e-05,1.6299000000000001e-05,1.6311e-05,1.6325999999999999e-05,1.6328999999999999e-05,1.6341000000000002e-05,1.6342e-05,1.6347000000000001e-05,1.6419999999999999e-05,1.6465914893617021e-05,1.6563999999999999e-05,1.6594816666666666e-05,1.6648423076923078e-05,1.6702799999999999e-05,1.6726580000000002e-05,1.6764399999999998e-05,1.6787359999999998e-05,1.6788170000000001e-05,1.679276e-05,1.679314e-05,1.6799529999999999e-05,1.6841250000000001e-05,1.684158e-05,1.685044e-05,1.685965e-05,1.686497e-05,1.6866147540983609e-05,1.687083e-05,1.6874150000000002e-05,1.6878500000000001e-05,1.688691e-05,1.690071e-05,1.6901850000000001e-05,1.6913489999999999e-05,1.6915010000000001e-05,1.692207e-05,1.69304e-05,1.6938500000000001e-05,1.6939489999999999e-05,1.6940540000000001e-05,1.6951000000000001e-05,1.695133e-05,1.695195e-05,1.6956100000000002e-05,1.6959570000000001e-05,1.6962000000000001e-05,1.6967052631578947e-05,1.6967333333333333e-05,1.6969666666666668e-05,1.6973000000000002e-05,1.6982499999999999e-05,1.6984620000000001e-05,1.698514e-05,1.6985349999999998e-05,1.6989030000000002e-05,1.6990000000000002e-05,1.6990499999999999e-05,1.6993000000000001e-05,1.699468e-05,1.6994906250000001e-05,1.7000139999999999e-05,1.7000999999999999e-05,1.7002166666666668e-05,1.7005999999999999e-05,1.7008110000000001e-05,1.7011999999999999e-05,1.7011999999999999e-05,1.7013000000000001e-05,1.701414e-05,1.7016000000000001e-05,1.701879e-05,1.702e-05,1.7022999999999999e-05,1.7028e-05,1.7028999999999999e-05,1.7029049999999999e-05,1.7030000000000001e-05,1.7031999999999999e-05,1.7034839999999998e-05,1.7042e-05,1.7042e-05,1.7042999999999999e-05,1.7042999999999999e-05,1.7044000000000001e-05,1.705251e-05,1.7054520000000002e-05,1.7056000000000001e-05,1.7056999999999999e-05,1.7059e-05,1.705928e-05,1.7059999999999999e-05,1.7063670000000002e-05,1.7064000000000001e-05,1.707135e-05,1.7073000000000001e-05,1.7073000000000001e-05,1.7076e-05,1.7078000000000001e-05,1.7079e-05,1.708267e-05,1.7099019999999998e-05,1.7108999999999998e-05,1.7108999999999998e-05,1.7109349999999999e-05,1.7112000000000002e-05,1.7112770000000001e-05,1.7116999999999999e-05,1.7121000000000001e-05,1.7122999999999999e-05,1.7122999999999999e-05,1.7125999999999998e-05,1.7127999999999999e-05,1.7132000000000001e-05,1.7139e-05,1.7144000000000001e-05,1.7148129999999998e-05,1.7148140000000002e-05,1.715377e-05,1.7154670000000002e-05,1.7156079999999999e-05,1.7156079999999999e-05,1.7157330000000001e-05,1.7160130000000001e-05,1.7163000000000002e-05,1.7164e-05,1.7173320000000002e-05,1.7176999999999998e-05,1.7201999999999999e-05,1.7204320000000002e-05,1.7207e-05,1.7221279999999999e-05,1.7222199999999999e-05,1.72257e-05,1.7234960000000001e-05,1.724004e-05,1.72657e-05,1.7274219999999999e-05,1.7289160000000001e-05,1.7295940000000001e-05,1.729791e-05,1.7312260000000001e-05,1.7314060000000001e-05,1.7377750000000001e-05,1.7383825396825398e-05,1.7396219999999999e-05,1.7416340000000001e-05,1.7454579999999999e-05,1.7475854166666666e-05,1.747929e-05,1.7492289999999998e-05,1.7507460000000002e-05,1.7537150000000002e-05,1.7553219999999998e-05,1.755374e-05,1.7554380000000001e-05,1.756134e-05,1.756357e-05,1.758211e-05,1.7593239999999999e-05,1.7596199999999999e-05,1.7623680000000001e-05,1.7623780000000001e-05,1.7631796296296298e-05,1.7643129999999999e-05,1.765041e-05,1.7652669999999999e-05,1.7657160000000002e-05,1.766857e-05,1.7671499999999998e-05,1.7676190000000001e-05,1.7678969999999999e-05,1.768344e-05,1.7704099999999999e-05,1.770741e-05,1.7708800000000002e-05,1.771729e-05,1.7736630000000001e-05,1.775671e-05,1.7761739999999999e-05,1.7761889999999999e-05,1.7770870370370371e-05,1.7770990000000002e-05,1.7773219999999999e-05,1.777556e-05,1.77821e-05,1.7782785714285714e-05,1.7791429999999999e-05,1.7791479999999999e-05,1.779255e-05,1.7797370370370368e-05,1.7802098039215685e-05,1.780617e-05,1.7807929999999998e-05,1.7808578947368422e-05,1.7809156250000001e-05,1.7809379999999998e-05,1.7813149999999997e-05,1.7814575000000002e-05,1.7815684210526318e-05,1.7816e-05,1.7817139999999999e-05,1.7820156250000001e-05,1.7827854166666665e-05,1.7829099999999998e-05,1.7832589999999999e-05,1.7842666666666668e-05,1.7847999999999999e-05,1.785e-05,1.785411e-05,1.7859999999999998e-05,1.7866000000000001e-05,1.7880000000000002e-05,1.7884999999999999e-05,1.7892000000000001e-05,1.7906780000000001e-05,1.7930419999999998e-05,1.7946999999999999e-05,1.7947769999999999e-05,1.7952999999999999e-05,1.7954000000000001e-05,1.7960000000000001e-05,1.7963999999999999e-05,1.7966999999999999e-05,1.796774e-05,1.7972e-05,1.7980999999999999e-05,1.7989e-05,1.805037e-05,1.8135929999999999e-05,1.8138000000000002e-05,1.815624e-05,1.8230010000000001e-05,1.8530989999999999e-05,1.854448e-05,1.8624590000000001e-05,1.87245e-05,1.8746500000000001e-05,1.8839999999999999e-05,1.8847600000000002e-05,1.887178e-05,1.8971579999999998e-05,1.8975800000000002e-05,1.8986109999999998e-05,1.9146519999999998e-05,1.9159210526315792e-05,1.9185999999999999e-05,1.9191202020202019e-05,1.919124e-05,1.919507e-05,1.9197210526315791e-05,1.9205640000000001e-05,1.9214562500000001e-05,1.9219600000000001e-05,1.92265e-05,1.9298999999999999e-05,1.9487420000000001e-05,2.9056000000000001e-05,3.1376333333333333e-05,3.1587000000000001e-05,3.2678109999999995e-05,3.3458999999999999e-05,3.4288500000000002e-05,3.8300180000000002e-05],"3072":[0.0021975359999999999,0.002203202,0.002223179,0.0022302120000000001,0.0022304099999999999,0.0022326252500000001,0.0022336159999999999,0.0022340350000000001,0.0022358719999999999,0.002236671,0.0022371085,0.0022381817500000002,0.0022389490000000001,0.0022469679999999998,0.0022475120000000001,0.0022498010000000001,0.0022516435,0.0022528130000000002,0.0022537400000000002,0.002254313,0.002254603,0.0022549689999999999,0.0022556422499999998,0.0022557229999999998,0.0022559205,0.0022567009999999998,0.0022575777499999998,0.0022578569999999998,0.0022579272500000002,0.0022581459999999999,0.0022588420000000001,0.0022598480000000001,0.0022598822499999998,0.0022612499999999998,0.0022624310000000001,0.002262652,0.0022639349999999999,0.0022641462500000002,0.002265066,0.0022652745,0.0022662124999999998,0.002266681,0.0022669830000000002,0.00226774225,0.002268347,0.0022696242499999999,0.0022704130000000002,0.0022714749999999998,0.0022717610000000002,0.0022735730000000001,0.0022736334999999999,0.0022747657499999998,0.0022760940000000002,0.0022770529999999998,0.002277135,0.0022773569999999998,0.0022775130000000001,0.0022795322500000002,0.00227995375,0.0022802310000000002,0.002281071,0.0022815510000000002,0.0022818197500000001,0.002282418,0.0022825129999999999,0.00228258375,0.0022829510000000001,0.0022830322499999998,0.002285863,0.0022867485000000001,0.0022869679999999999,0.0022875040000000001,0.00228754375,0.00228877625,0.002288801,0.0022891977499999998,0.0022901322500000001,0.00229131825,0.002291553,0.0022917024999999998,0.0022918679999999999,0.0022923100000000001,0.0022925839999999999,0.0022926629999999999,0.0022929744999999999,0.0022930569999999998,0.0022934407499999999,0.0022938717499999999,0.0022944279999999998,0.0022944969999999999,0.002296031,0.0022964595,0.0022966697499999999,0.0022974035000000001,0.002299644,0.002300088,0.00230034275,0.0023003960000000001,0.002300603,0.0023011139999999999,0.0023011454999999998,0.0023013955000000001,0.00230204,0.0023027935000000002,0.0023044954999999999,0.0023048679999999998,0.0023050082500000002,0.0023052670000000002,0.0023060335,0.002306846,0.0023081120000000002,0.0023087812500000001,0.0023088054999999999,0.0023088409999999998,0.0023109979999999999,0.0023110209999999999,0.0023113640000000002,0.0023115430000000001,0.002311783,0.002312962,0.0023132197500000001,0.002313678,0.0023137729999999999,0.0023146372499999999,0.0023150415000000001,0.0023151472499999999,0.0023153819999999999,0.0023154769999999998,0.0023155070000000001,0.0023172424999999999,0.0023181410000000001,0.0023188869999999999,0.0023196887499999999,0.0023197819999999998,0.0023200009999999999,0.0023211395,0.00232131675,0.0023217680000000001,0.0023231547500000001,0.0023231800000000002,0.0023232077499999999,0.0023235600000000001,0.0023241149999999999,0.0023255179999999999,0.002325733,0.002326154,0.0023263387499999999,0.002326772,0.0023276899999999999,0.0023277200000000001,0.0023277250000000001,0.0023279067499999999,0.002327909,0.0023279260000000001,0.0023280010000000001,0.002328395,0.0023284759999999999,0.0023289019999999999,0.0023294650000000002,0.002329799,0.0023301147499999999,0.002330216,0.0023302520000000001,0.002331119,0.0023320447500000002,0.0023328839999999999,0.00233306675,0.0023335772500000002,0.002333669,0.0023337922500000002,0.0023339020000000001,0.0023340380000000001,0.002335078,0.0023360439999999998,0.0023362884999999999,0.0023370000000000001,0.0023389940000000001,0.0023390920000000001,0.0023398157499999999,0.0023402752499999957,0.0023412452499999999,0.0023416825,0.0023419679999999998,0.00234229225,0.0023423860000000001,0.00234323,0.0023433450000000002,0.0023442319999999999,0.0023444550000000001,0.00234468,0.0023457930000000001,0.0023464250000000001,0.0023467739999999998,0.0023474630000000002,0.0023478309999999999,0.002348092,0.0023488455000000002,0.0023491645000000001,0.002349425,0.0023496695000000001,0.0023500294999999893,0.0023507820000000512,0.002350825,0.00235243075,0.0023528609999999999,0.0023531559999999999,0.0023534182499999998,0.0023537612500000001,0.0023542289999999998,0.0023542659999999998,0.0023543819999999999,0.0023543947500000001,0.0023554877499999999,0.0023563410000000001,0.0023575369999999998,0.0023599099999999998,0.0023607150000000002,0.0023613190000000002,0.0023651570000000001,0.0023654395000000002,0.0023657610000000001,0.0023663780000000001,0.0023674955,0.0023679600000000001,0.0023693277500000001,0.0023694219999999999,0.0023704012500000001,0.0023718010000000002,0.0023732250000000001,0.0023738869999999999,0.0023748229999999999,0.0023751697499999999,0.0023768830000000002,0.0023775469999999998,0.0023814320000000002,0.002383591,0.0023852880000000002,0.0023855723333333335,0.0023865179999999998,0.0023875390000000002,0.002387718,0.0023909090000000001,0.002391415,0.0023978099999999998,0.0024001840000000001,0.0024049067500000001,0.0024056289999999998,0.0024072189999999999,0.0024216477499999999,0.0024230567499999999,0.0024274029999999999,0.0024331406666666666,0.0024377629999999999,0.0024400845000000001,0.0024599800000000001,0.00246497225,0.0024742990000000001,0.0025075100000000001,0.0025088463333333331,0.0025093676666666669,0.0025115850000000002,0.0025143140000000001,0.0025153889999999998,0.0025154413333333334,0.0025175829999999999,0.0025186436666666668,0.0025220856666666666,0.002522257,0.0025257986666666669,0.002526665,0.0025332753333333334,0.002541789,0.0025539336666666667,0.0044515780000000003,0.0044912770000000001,0.004650197,0.0048469259999999997,0.0048716749999999998,0.0055825990000000214,0.00660744,0.0079011359999999996],"1792":[0.00075913399999999996,0.00075999100000000001,0.00076000600000000003,0.00076000799999999995,0.000760011,0.00076001900000000002,0.00076002000000000003,0.00076002000000000003,0.00076002100000000005,0.00076002299999999997,0.00076002800000000005,0.000760032,0.00076003799999999999,0.00076004100000000004,0.00076004299999999996,0.00076004700000000002,0.00076006900000000004,0.00076007099999999997,0.00076008399999999995,0.00076009199999999997,0.00076010499999999996,0.00076011000000000004,0.00076012699999999998,0.00076013199999999995,0.00076018400000000001,0.00076024299999999996,0.00076180699999999998,0.00076181800000000004,0.000763206,0.00076675799999999998,0.00077036100000000001,0.00077064600000000005,0.00077073899999999999,0.000771125,0.000771256,0.00077140499999999996,0.00077143199999999996,0.000771483,0.0007719661666666667,0.00077213949999999998,0.00077229100000000004,0.00077235900000000002,0.00077247299999999997,0.00077397000000000002,0.00077427858333333334,0.00077435258333333331,0.00077493699999999996,0.00077501499999999999,0.0007751343333333334,0.00077633008333333328,0.00077681899999999999,0.00077695525000000005,0.00077710858333333334,0.00077712600000000005,0.00077722299999999995,0.000777625,0.00077795499999999999,0.00077837408333333337,0.00077865374999999996,0.00077897899999999996,0.00077909691666666668,0.00077926999999999998,0.00077951400000000003,0.0007795565,0.0007795687272727273,0.00077965,0.00078034299999999997,0.00078079208333333339,0.00078086099999999999,0.00078113958333333327,0.0007814600000000001,0.00078149399999999998,0.00078162783333333334,0.00078175390909090905,0.00078197474999999999,0.00078213845454545459,0.00078223841666666665,0.00078260299999999999,0.00078270399999999995,0.00078334516666666665,0.00078353908333333338,0.00078362225000000007,0.00078397299999999998,0.00078402500000000004,0.00078413199999999999,0.00078426099999999996,0.00078442799999999999,0.00078454108333333333,0.00078479266666666662,0.00078490499999999991,0.00078493308333333343,0.00078550500000000004,0.00078551300000000005,0.00078607583333333323,0.00078624533333333335,0.00078639854545454546,0.00078664008333333331,0.00078698924999999996,0.0007871163333333333,0.00078739324999999992,0.00078746383333333329,0.00078746791666666665,0.00078766999999999997,0.00078781458333333331,0.00078822233333333336,0.00078845749999999996,0.00078922241666666657,0.00078981600000000004,0.0007898293333333333,0.00079018333333333334,0.00079044491666666668,0.00079044691666666671,0.00079063563636363641,0.00079077800000000001,0.00079103483333333336,0.00079105899999999999,0.00079163641666666663,0.00079215000000000004,0.00079227249999999996,0.00079229133333333336,0.00079349763636363637,0.00079351358333333338,0.00079377099999999997,0.00079378375000000009,0.00079408641666666672,0.00079414100000000005,0.00079416416666666667,0.00079441663636363631,0.00079448300000000002,0.00079456399999999999,0.00079471891666666676,0.00079483499999999992,0.00079506708333333329,0.00079523924999999997,0.00079538600000000003,0.00079538700000000005,0.0007956015833333333,0.00079574550000000011,0.00079617141666666659,0.0007966790833333334,0.00079670800000000003,0.00079671899999999999,0.00079684150000000002,0.00079702799999999997,0.00079707699999999999,0.000797092,0.00079709300000000002,0.00079709799999999999,0.00079709900000000001,0.00079710299999999996,0.00079710299999999996,0.00079710800000000004,0.00079711500000000004,0.00079712299999999995,0.00079712299999999995,0.00079712399999999997,0.00079712499999999998,0.00079712700000000001,0.00079714608333333328,0.00079714900000000003,0.000797154,0.000797154,0.00079716100000000001,0.00079716300000000004,0.00079716900000000002,0.00079717000000000004,0.00079717500000000001,0.00079717600000000003,0.000797181,0.000797181,0.00079718699999999998,0.00079719600000000002,0.00079719800000000005,0.00079719999999999997,0.000797202,0.00079720400000000003,0.00079720699999999997,0.000797209,0.00079722199999999999,0.00079724099999999997,0.00079725300000000005,0.00079726500000000002,0.00079726799999999996,0.00079729900000000001,0.00079730899999999995,0.00079731799999999999,0.00079733199999999999,0.00079736399999999995,0.00079736499999999997,0.00079738308333333332,0.00079740500000000005,0.00079743299999999995,0.00079743900000000005,0.00079755899999999998,0.00079757666666666668,0.00079764899999999999,0.00079800941666666669,0.00079816000000000002,0.00079826358333333336,0.00079837799999999998,0.00079845225000000004,0.00079897799999999999,0.00079901799999999997,0.00079911999999999995,0.00079924800000000002,0.00079945149999999991,0.00079977533333333323,0.00080019441666666661,0.00080031899999999997,0.00080045683333333317,0.00080063400000000005,0.00080089099999999997,0.00080104199999999997,0.00080145208333333342,0.00080147599999999997,0.00080164899999999998,0.00080201800000000005,0.00080239299999999999,0.00080314399999999999,0.00080361400000000002,0.00080388599999999997,0.00080432699999999997,0.00080436500000000003,0.00080440799999999995,0.00080616883333333334,0.00080794899999999997,0.00080829899999999995,0.00080841300000000001,0.000808598,0.00080874699999999996,0.000809011,0.00080902000000000003,0.00080937499999999998,0.00081057899999999997,0.00081094091666666663,0.00081139899999999997,0.00081149263636363629,0.00081200763636363638,0.00081250133333333335,0.00081285299999999999,0.00081403090909090909,0.000817701,0.00081885699999999998,0.00081925800000000001,0.00082011108333333339,0.00082257800000000002,0.00082633200000000004,0.00082792300000000005,0.00082996963636363633,0.00083093499999999999,0.00083120972727272725,0.00083202981818181817,0.00083895699999999998,0.00084015436363636361,0.00084346400000000004,0.00084439045454545454,0.00084502463636363647,0.00085511472727272731,0.00085781599999999996,0.00085894963636363628,0.00086014200000000005,0.00086014499999999999,0.00086016,0.000860731,0.00086241900000000001,0.00086256199999999999,0.00086297227272727278,0.00086832800000000003,0.00086892309090909087,0.00087279399999999998,0.00087889845454545458,0.00088531000000000005,0.00092335900000000001,0.0015040279999999999,0.0015211280000000001,0.0015294410000000001,0.00156201,0.0015657080000000001,0.001621489,0.001644946,0.001861007],"40":[4.3327000000000001e-07,4.3361000000000003e-07,4.3441999999999999e-07,4.3680999999999995e-07,4.3770000000000001e-07,4.3911000000000002e-07,4.3924000000000001e-07,4.3924999999999997e-07,4.3971999999999997e-07,4.3980000000000001e-07,4.3985000000000001e-07,4.3994000000000001e-07,4.4013000000000001e-07,4.4032999999999997e-07,4.4107000000000002e-07,4.4112000000000002e-07,4.4133e-07,4.4300999999999999e-07,4.4351999999999999e-07,4.4362e-07,4.4396000000000001e-07,4.4442000000000001e-07,4.4475999999999997e-07,4.4490000000000002e-07,4.4505000000000003e-07,4.4567999999999995e-07,4.4617999999999999e-07,4.4728999999999998e-07,4.4788000000000001e-07,4.4863000000000001e-07,4.4948999999999998e-07,4.4987999999999995e-07,4.5093999999999999e-07,4.5102999999999998e-07,4.5191999999999999e-07,4.5266999999999999e-07,4.5321000000000002e-07,4.5327999999999999e-07,4.5327999999999999e-07,4.5433999999999998e-07,4.5442999999999997e-07,4.5463000000000004e-07,4.5467999999999999e-07,4.5516000000000001e-07,4.5528000000000004e-07,4.5541999999999998e-07,4.5558000000000001e-07,4.5565000000000003e-07,4.5581e-07,4.5615999999999998e-07,4.5618999999999996e-07,4.5627999999999995e-07,4.5632e-07,4.5646000000000005e-07,4.5698999999999996e-07,4.5703000000000001e-07,4.5721e-07,4.5816999999999998e-07,4.5842168674698795e-07,4.5844999999999998e-07,4.5853000000000002e-07,4.5902999999999995e-07,4.5959e-07,4.6041999999999999e-07,4.6045999999999998e-07,4.6049000000000002e-07,4.6062e-07,4.6091999999999997e-07,4.6137000000000001e-07,4.6149000000000004e-07,4.6174e-07,4.6179000000000001e-07,4.6193000000000001e-07,4.6208000000000002e-07,4.6208999999999998e-07,4.6241000000000002e-07,4.6264000000000002e-07,4.6297000000000002e-07,4.6350000000000004e-07,4.6367999999999998e-07,4.6369000000000004e-07,4.6387000000000004e-07,4.6396000000000003e-07,4.6421999999999996e-07,4.6433000000000003e-07,4.6442000000000003e-07,4.6445000000000001e-07,4.6449e-07,4.6471000000000004e-07,4.6473000000000001e-07,4.6489000000000003e-07,4.6520999999999997e-07,4.6520999999999997e-07,4.6560999999999995e-07,4.658e-07,4.6591999999999998e-07,4.6595999999999997e-07,4.6601000000000003e-07,4.6638999999999998e-07,4.6652000000000002e-07,4.6664e-07,4.6665999999999997e-07,4.6721999999999997e-07,4.6730000000000001e-07,4.6737000000000004e-07,4.6771000000000005e-07,4.6785e-07,4.6835999999999999e-07,4.6839000000000003e-07,4.6863999999999999e-07,4.6883e-07,4.6888e-07,4.6928000000000003e-07,4.6931000000000001e-07,4.6962000000000005e-07,4.6971999999999995e-07,4.6973000000000001e-07,4.6999000000000004e-07,4.6999000000000004e-07,4.7052999999999997e-07,4.7079e-07,4.7086999999999998e-07,4.7126e-07,4.7169000000000001e-07,4.7174000000000001e-07,4.7177e-07,4.7177e-07,4.7222000000000003e-07,4.7226999999999998e-07,4.7274000000000004e-07,4.7336e-07,4.7348000000000003e-07,4.7353999999999999e-07,4.7376000000000003e-07,4.7386000000000004e-07,4.7401000000000005e-07,4.7435999999999997e-07,4.7439e-07,4.7447999999999994e-07,4.7469000000000002e-07,4.7518e-07,4.7524000000000001e-07,4.7549999999999999e-07,4.7563999999999999e-07,4.7579e-07,4.7591999999999999e-07,4.7624999999999999e-07,4.7627999999999997e-07,4.7637999999999998e-07,4.7645999999999997e-07,4.7664999999999997e-07,4.7665999999999998e-07,4.7670999999999999e-07,4.7673999999999997e-07,4.7722999999999994e-07,4.7731000000000003e-07,4.7739999999999997e-07,4.7764999999999999e-07,4.7767000000000001e-07,4.7797000000000004e-07,4.7803e-07,4.7810000000000003e-07,4.7815999999999999e-07,4.7826e-07,4.7871000000000003e-07,4.7883000000000006e-07,4.7884000000000002e-07,4.7981000000000001e-07,4.8005555555555556e-07,4.8062000000000002e-07,4.8077999999999999e-07,4.8095999999999999e-07,4.8112000000000006e-07,4.8192000000000002e-07,4.8251e-07,4.8261999999999996e-07,4.8276000000000002e-07,4.8297999999999995e-07,4.8304999999999997e-07,4.8337999999999998e-07,4.8367000000000004e-07,4.8396e-07,4.8413000000000003e-07,4.8423000000000004e-07,4.8479000000000004e-07,4.8480999999999996e-07,4.8515000000000003e-07,4.8525000000000003e-07,4.8541999999999996e-07,4.8559e-07,4.8569e-07,4.8604999999999999e-07,4.8607000000000001e-07,4.8659000000000007e-07,4.8673999999999998e-07,4.8695000000000006e-07,4.8724999999999997e-07,4.8741000000000005e-07,4.8765e-07,4.8779000000000006e-07,4.8782999999999999e-07,4.8833000000000003e-07,4.8844e-07,4.8860000000000007e-07,4.8894000000000004e-07,4.8935999999999998e-07,4.8938999999999996e-07,4.8940000000000003e-07,4.8943999999999997e-07,4.8965000000000005e-07,4.8971000000000001e-07,4.9090000000000003e-07,4.9113000000000003e-07,4.9128000000000004e-07,4.9187999999999998e-07,4.9273000000000005e-07,4.9312000000000001e-07,4.9411999999999998e-07,4.9457000000000001e-07,4.9538000000000003e-07,4.9592999999999997e-07,4.9658999999999998e-07,4.9725999999999994e-07,4.9806999999999996e-07,4.9830000000000006e-07,4.9905000000000001e-07,4.9905999999999997e-07,4.9938000000000002e-07,4.9943000000000002e-07,4.9966000000000002e-07,4.9997999999999995e-07,5.0103999999999999e-07,5.0134000000000001e-07,5.0279000000000002e-07,5.0320000000000001e-07,5.0334000000000006e-07,5.0345999999999998e-07,5.0510000000000004e-07,5.0541000000000002e-07,5.0582999999999997e-07,5.0642000000000006e-07,5.0712999999999996e-07,5.0716000000000005e-07,5.0850999999999994e-07,5.1017999999999998e-07,5.1073999999999998e-07,5.1177999999999999e-07,5.1190000000000002e-07,5.1511999999999997e-07,5.1544000000000002e-07,5.1588999999999994e-07,5.1722999999999998e-07,5.1732000000000003e-07,5.1735000000000001e-07,5.1763999999999997e-07,5.1882999999999999e-07,5.1979000000000002e-07,5.1984999999999999e-07,5.1984999999999999e-07,5.2129999999999999e-07,5.2206e-07,5.2373000000000004e-07,5.2568999999999994e-07,5.2606999999999995e-07,5.2726000000000008e-07,5.2811000000000004e-07,5.2814999999999997e-07,5.3251000000000005e-07,5.4243999999999993e-07,5.4624e-07,5.4723000000000001e-07,5.5738999999999999e-07,5.7520999999999997e-07,6.9080999999999998e-07,7.1626999999999994e-07,7.2809e-07,7.5904e-07,7.5942000000000001e-07,7.6888000000000004e-07,8.0389999999999994e-07,8.1415000000000007e-07],"28672":[0.19740370799999996,0.19741732300000001,0.19762882800000001,0.19777508699999999,0.198028963,0.198055342,0.19805709899999999,0.198181674,0.19832807999999999,0.19837312750000002,0.19846703099999996,0.19855509900000001,0.198559651,0.198624195,0.19866135900000001,0.19883296150000002,0.19892151599999999,0.198929157,0.198934522,0.19895901099999999,0.19899070299999999,0.19904907699999999,0.19906988349999999,0.19910673000000001,0.19912311699999999,0.19913082450000003,0.19917385300000001,0.19919964400000001,0.19925140199999999,0.19926190399999999,0.199369774,0.19943075699999999,0.19948553599999999,0.19949461299999999,0.19949984100000001,0.199501449,0.19954264299999999,0.19955057800000001,0.199554758,0.19959470200000001,0.19962439600000001,0.19965959899999999,0.19968154500000002,0.199699668,0.19970249600000001,0.19977657500000001,0.19981961199999998,0.19982197099999999,0.19986978850000001,0.199928563,0.19996885,0.199970395,0.19999485750000001,0.200002181,0.2000155065,0.200030245,0.200070311,0.20007309500000001,0.200078486,0.20009836249999999,0.20009905550000001,0.2001022845,0.20015279850000001,0.20019578049999998,0.20020328499999995,0.20023112200000001,0.20026011299999999,0.20028420799999999,0.20029427900000002,0.200304802,0.200308562,0.200356178,0.200360227,0.20038340900000001,0.200400516,0.20040527200000002,0.20041467300000004,0.20042224349999999,0.20046841200000001,0.200496058,0.20050206549999999,0.20050994899999999,0.2005174475,0.20052677499999999,0.20055563650000002,0.20055785800000001,0.20056386400000001,0.20057737949999999,0.2005951845,0.200596107,0.2006009165,0.20063325300000001,0.20065164399999999,0.20065841200000001,0.20066517850000001,0.20067880800000004,0.200684268,0.20074755950000001,0.2007497335,0.20078608349999999,0.200812934,0.20081642299999999,0.20087751000000001,0.20089035150000001,0.20089423449999999,0.20090235000000001,0.2009663625,0.200975456,0.200982208,0.20098384799999999,0.20099820800000001,0.20100646699999999,0.20101169250000001,0.201036401,0.20106212000000001,0.20107996650000001,0.2010838305,0.20112859599999999,0.20113046600000001,0.20116611049999999,0.20117362100000002,0.201217959,0.20127452350000002,0.20127605799999998,0.20129818399999999,0.20131311800000001,0.20131339700000001,0.20132819399999999,0.201392355,0.20140424300000001,0.20142725049999999,0.20144975949999999,0.20146130600000001,0.201468865,0.20148063449999998,0.201481244,0.20149826400000001,0.20151629599999998,0.20157962399999996,0.20158405099999999,0.2015906515,0.20161654600000001,0.201617984,0.20164403550000001,0.20165143599999999,0.2016615585,0.20171143149999998,0.20171785349999999,0.2017249495,0.20176831899999997,0.2018109085,0.20181671900000001,0.20182147850000001,0.20182402399999999,0.20188088600000001,0.2019330755,0.20204271100000001,0.202060615,0.202076056,0.20207618999999999,0.20212047350000001,0.2021572405,0.20216859200000001,0.202226931,0.202261205,0.2022636555,0.20226555199999999,0.20228098350000001,0.20230813800000003,0.202336618,0.20245833050000001,0.20246046649999999,0.20249002399999999,0.202494492,0.20257070099999999,0.2025777215,0.20260327650000001,0.20261289900000001,0.20263946200000005,0.20264893750000001,0.20265805249999999,0.20267069800000001,0.202752983,0.20280731599999999,0.20281317200000004,0.20284057550000001,0.2028607375,0.202861349,0.20288164250000001,0.202942651,0.20295421999999999,0.20296146400000001,0.202977292,0.20298265500000001,0.20298942799999997,0.20299829550000001,0.20300375000000001,0.20301208699999995,0.20301560099999999,0.2030402335,0.2030447125,0.20316540899999999,0.20317295149999998,0.20319944700000001,0.20320543250000001,0.20321819599999999,0.2032932875,0.20331621250000001,0.20334477150000002,0.20342201600000001,0.2034281765,0.20361532500000001,0.203650149,0.20367695699999999,0.20375583549999998,0.20375851700000003,0.20380864849999999,0.20380880500000001,0.20383208950000001,0.20387031999999999,0.20387504200000001,0.20387787800000001,0.203922885,0.2040160245,0.20407135200000001,0.2040804085,0.20413014299999999,0.20422122600000003,0.204330287,0.204402315,0.20445450600000001,0.204500401,0.20458737299999996,0.20468208049999997,0.20476591699999999,0.204833917,0.20486691899999998,0.204870836,0.20497875200000004,0.205174567,0.205185741,0.20519921899999999,0.20524626900000001,0.20528887900000001,0.20542713100000001,0.20563760549999999,0.205749772,0.20586592800000003,0.20589873599999997,0.20594016800000001,0.206100959,0.206488119,0.2065019655,0.20657526600000001,0.20741458600000001,0.20761325799999999,0.20768421549999999,0.207749982,0.20828239200000001,0.20851191499999999,0.20873498400000001,0.20948932549999999,0.20986259700000001,0.210515173,0.210948734,0.211595055,0.21161865999999999,0.21537124399999999,0.21630417600000001,0.21851724,0.2193290675,0.22162247600000001,0.23602624249999998,0.24865272150000001,0.4556219695,0.53835303000000001,0.54795976150000003,0.55593577500000002,0.55768763399999999,0.56682604599999997,0.59676284400000001],"1024":[0.00023982100000000001,0.00023983199999999999,0.00023983300000000001,0.000239848,0.00023984949999999999,0.000239853,0.000239857,0.00023987499999999999,0.0002459758,0.00025100200000000001,0.000251005,0.00025100699999999998,0.00025100900000000001,0.00025101300000000002,0.00025101499999999999,0.00025101700000000003,0.00025102000000000002,0.00025102099999999998,0.00025102700000000002,0.00025102700000000002,0.000251029,0.00025103099999999998,0.00025103099999999998,0.00025103400000000002,0.00025103700000000002,0.00025103899999999999,0.00025103899999999999,0.00025104100000000002,0.00025104199999999999,0.00025104499999999998,0.00025104700000000001,0.00025104700000000001,0.00025104899999999999,0.00025105,0.00025106100000000001,0.00025106400000000001,0.00025106599999999998,0.00025106800000000002,0.00025106899999999998,0.00025107200000000002,0.00025108299999999998,0.00025109500000000001,0.00025109600000000002,0.00025109699999999998,0.00025109900000000002,0.00025109999999999998,0.00025110200000000001,0.00025110900000000001,0.00025111300000000002,0.00025111600000000001,0.00025111699999999997,0.00025111900000000001,0.00025112499999999999,0.00025112799999999998,0.00025114400000000002,0.00025117800000000001,0.00025179800000000002,0.00025212486486486484,0.0002525545,0.00025363650000000002,0.00025375533333333336,0.00025388100000000002,0.00025464599999999997,0.00025488099999999999,0.00025560200000000001,0.0002563286666666667,0.00025746599999999998,0.00025817800000000002,0.00025822818918918916,0.00025830500000000001,0.00025849466666666665,0.00025849594594594595,0.00025854054054054052,0.00025872891428571431,0.00025876633333333333,0.00025894583783783785,0.0002592378108108108,0.00025930837837837836,0.00025945659459459457,0.00025951370588235296,0.00025959580555555558,0.00025961819444444441,0.00025991316216216213,0.00026070116216216218,0.00026082094594594591,0.00026094027027027028,0.00026094210810810814,0.00026103578378378376,0.00026123043243243246,0.00026133833333333333,0.00026145433333333337,0.00026145900000000002,0.00026159555555555554,0.00026161243243243241,0.00026177097142857141,0.00026190399999999998,0.00026193166666666666,0.00026197835135135134,0.00026202308571428572,0.00026207699999999999,0.00026210781081081083,0.00026225297297297295,0.00026236876315789475,0.000262398,0.00026245387878787879,0.00026255970270270271,0.00026263075675675678,0.00026267800000000002,0.00026284524324324325,0.00026291764864864748,0.00026300642857142854,0.00026311647222222224,0.00026322699999999999,0.00026322800000000001,0.00026323999999999998,0.00026324349999999998,0.00026324699999999998,0.000263255,0.00026325900000000001,0.00026326399999999998,0.00026326600000000001,0.00026326799999999999,0.00026326799999999999,0.000263269,0.00026327000000000002,0.000263272,0.00026327399999999997,0.00026327499999999999,0.00026327700000000002,0.000263279,0.00026328199999999999,0.000263286,0.000263286,0.000263286,0.00026328700000000002,0.00026329350000000001,0.00026329499999999998,0.00026329499999999998,0.00026329700000000001,0.00026329700000000001,0.00026329899999999999,0.00026329899999999999,0.0002633,0.0002633,0.00026330199999999998,0.00026330400000000001,0.00026330499999999997,0.0002633067837837838,0.000263317,0.00026331899999999998,0.00026332200000000002,0.000263324,0.000263324,0.00026332500000000002,0.00026332999999999999,0.00026333299999999998,0.00026333900000000002,0.00026334399999999999,0.00026334600000000002,0.00026334900000000002,0.00026335600000000002,0.00026335699999999998,0.00026336000000000003,0.00026336099999999999,0.00026336099999999999,0.000263362,0.000263362,0.00026336300000000002,0.00026336900000000001,0.000263372,0.00026337499999999999,0.00026337600000000001,0.00026337799999999998,0.00026337799999999998,0.00026338000000000002,0.00026338099999999998,0.00026338199999999999,0.00026338300000000001,0.00026338300000000001,0.00026338400000000002,0.00026338499999999999,0.000263386,0.000263389,0.00026339100000000003,0.00026339400000000002,0.00026339700000000001,0.00026340072972972972,0.00026340199999999998,0.00026340899999999998,0.000263417,0.000263424,0.00026342599999999998,0.000263427,0.00026343299999999998,0.00026343299999999998,0.00026343800000000001,0.000263448,0.00026345300000000003,0.000263479,0.00026348399999999997,0.00026348575675675675,0.00026353789189189193,0.00026354500000000001,0.00026356600000000002,0.00026360400000000002,0.00026361700000000001,0.00026367799999999999,0.00026385100000000001,0.00026413199999999998,0.00026423100000000003,0.00026428699999999999,0.00026446299999999999,0.00026498842857142858,0.00026501133333333332,0.00026508,0.00026522999999999998,0.00026536049999999997,0.00026556022857142857,0.00026582949999999999,0.00026583200000000003,0.00026603805405405406,0.00026608300000000002,0.00026609000000000002,0.00026666400000000001,0.00026701200000000001,0.00026726291666666666,0.00026740580000000002,0.00026745799999999999,0.00026751200000000002,0.00026757194444444445,0.00026765777142857144,0.00026783588888888889,0.00026884100000000002,0.00026925093750000001,0.00027002805714285713,0.00027011077142857141,0.00027042791176470589,0.00027054402941176469,0.00027143499999999999,0.00027234280000000002,0.00027309529411764707,0.00027319900000000001,0.00027505991428571427,0.00027519300000000002,0.00027618100000000002,0.0002772542285714286,0.000277495,0.00027793888571428575,0.00027864865714285716,0.00027965782857142853,0.00028177762857142856,0.00028188471428571433,0.00028266214285714288,0.00028281817142857143,0.00028310665714285715,0.0002831378857142857,0.00028316234285714285,0.00028329182352941173,0.00028370902857142852,0.00028410099999999998,0.000284116,0.00028411899999999999,0.00028413000000000001,0.00028413599999999999,0.00028417699999999999,0.00028420300000000002,0.00028426599999999998,0.00028427900000000002,0.000284484,0.00028487199999999998,0.00028670200000000001,0.00029117800000000001,0.00029626700000000001,0.00048853500000000001,0.00051303399999999999,0.00051408750000000005,0.00052967300000000004,0.00055047400000000002,0.00056165299999999996,0.00061126099999999999,0.000711493],"7168":[0.012210746,0.012212534000000001,0.012234811,0.012236453,0.012236772,0.012248037,0.01227571,0.012277458,0.012288281,0.012290924999999999,0.012291283,0.012298919,0.012300902000000001,0.012309676,0.012309703,0.012318239999999999,0.012318842,0.012322181999999999,0.0123222605,0.012323486999999999,0.012325344,0.012329101,0.012345363,0.012348797,0.012362496000000001,0.012372971999999999,0.012374186000000001,0.012376567999999999,0.012379077,0.012391281000000001,0.0123980485,0.012400504999999999,0.012403105500000001,0.012404306,0.0124048465,0.012407278000000001,0.012408914,0.0124129605,0.012413576000000001,0.012413813500000001,0.012414641000000001,0.012415606500000001,0.012425377,0.012428237,0.012430843,0.012436037,0.012436157999999999,0.0124393835,0.01244603,0.012448798000000001,0.012452306,0.0124540185,0.012456213000000001,0.012458716999999999,0.012467443999999999,0.012468633,0.012473316,0.012474862999999999,0.012478977,0.012479993999999999,0.012480194999999999,0.012483012,0.01248499,0.012485794,0.012491458,0.012491712,0.012492325,0.012492849,0.0124974825,0.0124980965,0.0124986275,0.012502019,0.012503801,0.012504757999999999,0.012505952000000001,0.012506636,0.012506734,0.012506982,0.012508956999999999,0.0125094115,0.012509428,0.01250943,0.012511885,0.012512366,0.012512396,0.0125147855,0.012517211,0.0125200985,0.0125209655,0.012521940000000001,0.0125314005,0.012535643000000001,0.012537175999999983,0.012537474999999999,0.012541136,0.012541185,0.012542451,0.012542885,0.012546696499999999,0.012547156,0.012551214,0.012552973,0.0125559225,0.012556639,0.0125574945,0.01255824,0.012560101000000001,0.012560383,0.012561543499999999,0.012561899,0.012561905999999999,0.012562132,0.012562314999999999,0.012563819,0.012564308999999999,0.012568298,0.012571025,0.012573387,0.0125769695,0.012580044,0.012580402500000001,0.012581633,0.012582311000000001,0.012588326,0.012592542,0.012592638,0.012596734,0.012600127500000001,0.012603056,0.012603369999999999,0.012610361999999986,0.012610404,0.012611292,0.012612356,0.012613186,0.012614169999999999,0.012614603,0.012624491999999999,0.012628077999999999,0.012628624999999999,0.012629804,0.012632577000000001,0.012635894999999999,0.012640528999999999,0.0126410975,0.012642538,0.0126427985,0.012651697999999999,0.0126535005,0.012654792,0.012655023,0.012656353,0.012656997,0.0126588615,0.012660005,0.012660096500000001,0.01266108,0.012663755,0.01266455,0.012666248,0.0126700375,0.012671892000000001,0.012672553,0.012673660999999999,0.012675242499999999,0.012680172,0.012680568,0.012680776,0.012681352999999999,0.012683818499999999,0.012684565,0.012685264999999999,0.0126915775,0.012696835,0.012699435000000037,0.0127045275,0.012705065999999999,0.01270751,0.012711475999999999,0.012715258,0.012721092999999999,0.012723488999999999,0.012725958000000001,0.012726616,0.012728444,0.0127322815,0.012733606,0.012734994499999999,0.0127374455,0.012739212499999999,0.012747664000000001,0.012755129,0.012763149,0.0127655205,0.0127659,0.012766659,0.012768675,0.012772323,0.012773165,0.012774361999999999,0.012776232,0.012776976000000001,0.012785514,0.012787817999999999,0.012788104999999999,0.012788287000000001,0.012789390499999999,0.012795188000000001,0.012799050500000001,0.012799247999999999,0.012799346,0.012801080499999999,0.012801854999999999,0.012808697500000001,0.012812186,0.012815822500000001,0.012821838,0.012822633,0.0128243145,0.01282495,0.012839391,0.012839737,0.012855288499999999,0.012860473000000001,0.012883465,0.012884680500000001,0.01288806,0.012889625,0.012891301000000001,0.012897017,0.012904200500000001,0.012921595500000001,0.012926674500000001,0.012930629000000001,0.012934207,0.012935690999999999,0.012950516,0.012970728000000001,0.012979028,0.0129820435,0.012990694000000001,0.012994003,0.0130008355,0.01300228,0.0130152845,0.013021909999999999,0.013026801500000001,0.013059309,0.0130821055,0.013115755999999999,0.013133497500000001,0.013156545,0.013167028000000001,0.01317516,0.013183277,0.013186655,0.013207489500000001,0.013396329,0.0133965575,0.013475275,0.013520302499999999,0.01352799,0.013528086999999999,0.01356686,0.013568925500000001,0.013594881499999999,0.013618553,0.01363527,0.013682033,0.013718592,0.013767814,0.013880473000000001,0.014240732000000001,0.014344542,0.024958621,0.026849822999999998,0.027406056000000002,0.028439906000000001,0.028689145999999999,0.030036521,0.0311739675],"8192":[0.015884826000000001,0.015885748000000002,0.016016967999999999,0.016028071500000001,0.016052321000000001,0.016056066000000001,0.016085502000000002,0.016086026,0.016102702999999999,0.016105164000000002,0.016108283000000001,0.016110939000000001,0.016118621999999999,0.016125901000000002,0.016135420000000001,0.016144215,0.016150905,0.016152470499999998,0.016154161,0.016154393499999999,0.0161635745,0.016180851,0.016183056000000029,0.016183563000000002,0.016198102499999978,0.016199178000000002,0.016207139999999998,0.016208072,0.016215475,0.016216885,0.016218428,0.0162232865,0.016227034000000001,0.016231091,0.016232026,0.016232347000000001,0.016234462000000002,0.016240423,0.016240935000000001,0.016243099,0.016244851000000001,0.016248108999999955,0.016251635,0.016252305000000002,0.016259066999999999,0.016259546999999999,0.016262252000000001,0.016262744999999999,0.0162638295,0.016266684999999999,0.016267083500000001,0.016267729000000002,0.016267746999999999,0.016268811000000001,0.016271006000000001,0.016271500000000001,0.016271760999999999,0.016272662,0.016275577999999999,0.016276526999999999,0.016278482,0.016279809999999999,0.01629015,0.016293999,0.016299292,0.016299484,0.016299803500000001,0.01630177,0.016301979500000001,0.016302278999999999,0.016302800999999999,0.016305380000000001,0.016310541000000001,0.016314636,0.016315198000000031,0.016317015000000001,0.016317491999999999,0.016321259000000001,0.016324358000000001,0.016324673000000001,0.016325014999999998,0.016328124999999999,0.016330806999999999,0.016331444000000001,0.016336013999999999,0.016341173000000001,0.016341791000000001,0.016341851500000001,0.016350211,0.016351480500000001,0.016355235999999999,0.016355913,0.016357644000000001,0.016358247999999999,0.016358359999999999,0.016358866999999999,0.016359535000000001,0.016363895999999999,0.016366113500000001,0.016366867,0.016368372999999999,0.016371696000000002,0.016373723999999999,0.016376208999999999,0.016376535000000001,0.016376631999999999,0.016381304999999999,0.01638133399999997,0.016382687999999999,0.016382787999999999,0.016385117000000001,0.016386464,0.016391824999999999,0.016394092999999998,0.016396137000000002,0.016397034500000001,0.016399542999999999,0.016401457000000001,0.016402379000000002,0.016402450999999998,0.016404607000000002,0.016410612000000002,0.01641126,0.016414979,0.016416493000000001,0.016417141999999999,0.0164178185,0.016420357999999999,0.016433447,0.0164348585,0.016438286999999999,0.016450401,0.016451628999999999,0.016465803000000001,0.016466304500000001,0.016472199,0.016472357999999999,0.016472470999999999,0.016474277499999999,0.016474767000000001,0.016475005000000001,0.016480463000000001,0.016484202,0.016494195999999999,0.016495063000000001,0.016495599,0.016499646499999999,0.016500199,0.016501280499999993,0.016505138999999999,0.016505585999999999,0.016505741500000001,0.016506145,0.016510126999999999,0.016510939499999999,0.016511663999999999,0.016512959000000001,0.016521523999999999,0.016527769500000001,0.016540447999999985,0.016541933000000002,0.016542442000000001,0.016546987999999999,0.016547709000000001,0.016552863500000001,0.016559378,0.016564140000000002,0.016564759500000002,0.016568543000000002,0.016569067999999999,0.016570061000000001,0.0165715385,0.016577359,0.016580612000000002,0.016587746,0.016590878,0.016591087500000001,0.016592483000000002,0.0165932235,0.016593248000000001,0.016595199000000001,0.016596920000000001,0.016604831,0.016608085000000002,0.016611654,0.016611758500000001,0.016620204,0.01662632,0.016631582999999998,0.016633222,0.016644443500000002,0.016646633000000001,0.016647884000000002,0.016651719999999998,0.016655632,0.016658048000000002,0.016670468000000001,0.016671150499999999,0.016672188000000001,0.016672265499999998,0.016675862999999999,0.016678719500000001,0.016679838499999999,0.016688659500000001,0.016713296999999998,0.016728308000000001,0.016733695999999999,0.016737362499999998,0.016741209999999999,0.016741530500000001,0.016741659999999998,0.016751011499999999,0.0167612275,0.016763054999999999,0.016768174,0.016770868000000001,0.016785016999999999,0.016788903000000001,0.016797019999999999,0.016797594499999999,0.016801169500000001,0.016802955000000001,0.016806912,0.016830390500000014,0.01683871,0.016859526999999985,0.016863382,0.016867063500000001,0.016870993500000001,0.016873396999999998,0.016878648499999999,0.016893471,0.016894926000000001,0.0168993845,0.016901859000000002,0.016926739999999999,0.016933889000000001,0.016949167000000001,0.016956607499999998,0.016962339999999999,0.016964749000000001,0.016965188999999999,0.016998216,0.016999156000000001,0.017018821999999999,0.017028733000000001,0.017029841,0.017051907500000001,0.017054765999999999,0.017075349,0.017078063000000001,0.017163122999999999,0.017173311,0.017195373999999999,0.017219215999999999,0.017230328999999999,0.017341988500000016,0.017343250000000001,0.017371344,0.017389387999999999,0.017417255,0.017451778500000001,0.01745503,0.017517762999999999,0.017571232999999999,0.017592956,0.017600124000000002,0.017679619000000001,0.017705255,0.017807274500000001,0.017816456500000001,0.018046888000000001,0.018203063500000002,0.018468713000000001,0.035221904499999998,0.036365004999999999,0.040006164000000011,0.0412992805,0.043921507999999998,0.044396124000000002,0.057916110500000006],"28":[2.1114000000000002e-07,2.1119e-07,2.1138999999999999e-07,2.1226e-07,2.1226999999999998e-07,2.1228000000000002e-07,2.1234000000000001e-07,2.1254e-07,2.1254e-07,2.1270000000000002e-07,2.1270000000000002e-07,2.1273e-07,2.1275e-07,2.1282999999999998e-07,2.1299e-07,2.1299999999999999e-07,2.1304000000000001e-07,2.1308e-07,2.1313999999999999e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1314999999999997e-07,2.1317e-07,2.132e-07,2.1330000000000001e-07,2.1336999999999998e-07,2.1336999999999998e-07,2.1339000000000001e-07,2.1339999999999999e-07,2.1348e-07,2.1353000000000001e-07,2.1359e-07,2.1359e-07,2.1359999999999998e-07,2.1359999999999998e-07,2.1359999999999998e-07,2.1361000000000002e-07,2.1361000000000002e-07,2.1361000000000002e-07,2.1361000000000002e-07,2.1362999999999999e-07,2.1364e-07,2.1366e-07,2.1367000000000001e-07,2.1371e-07,2.1379000000000001e-07,2.1381999999999999e-07,2.1381999999999999e-07,2.1381999999999999e-07,2.1382999999999998e-07,2.1382999999999998e-07,2.1382999999999998e-07,2.1404999999999999e-07,2.1406000000000003e-07,2.1426000000000001e-07,2.1426000000000001e-07,2.1432e-07,2.1432e-07,2.1446e-07,2.1448e-07,2.145e-07,2.1471000000000002e-07,2.1693999999999998e-07,2.1705999999999999e-07,2.1715000000000001e-07,2.1716999999999998e-07,2.1718000000000002e-07,2.1739999999999997e-07,2.1739999999999997e-07,2.1739999999999997e-07,2.1759e-07,2.1759999999999999e-07,2.1763000000000002e-07,2.1763000000000002e-07,2.1764000000000001e-07,2.1769000000000001e-07,2.1772000000000002e-07,2.1778999999999999e-07,2.1784e-07,2.1803e-07,2.1805e-07,2.1806000000000001e-07,2.1806000000000001e-07,2.1806999999999999e-07,2.1827999999999999e-07,2.1827999999999999e-07,2.1827999999999999e-07,2.1829e-07,2.1829e-07,2.1834000000000001e-07,2.185e-07,2.185e-07,2.185e-07,2.185e-07,2.185e-07,2.185e-07,2.1851000000000002e-07,2.1851000000000002e-07,2.1855000000000001e-07,2.1869999999999999e-07,2.1871999999999999e-07,2.1871999999999999e-07,2.1871999999999999e-07,2.1873e-07,2.1873e-07,2.1873e-07,2.1873e-07,2.1875e-07,2.1878e-07,2.1888000000000001e-07,2.1894999999999999e-07,2.1894999999999999e-07,2.1896e-07,2.1896e-07,2.1897000000000001e-07,2.1899e-07,2.1908e-07,2.1917e-07,2.1917e-07,2.1917999999999998e-07,2.1917999999999998e-07,2.1917999999999998e-07,2.1919000000000002e-07,2.1929e-07,2.1934999999999999e-07,2.1939000000000001e-07,2.1939000000000001e-07,2.1939999999999999e-07,2.1939999999999999e-07,2.1940999999999998e-07,2.1945e-07,2.1960999999999999e-07,2.1962e-07,2.1967000000000001e-07,2.1984000000000002e-07,2.1985e-07,2.2006e-07,2.2022e-07,2.2072000000000001e-07,2.2097e-07,2.2101000000000002e-07,2.2181e-07,2.2220000000000002e-07,2.2285000000000001e-07,2.2286e-07,2.2291999999999999e-07,2.2291999999999999e-07,2.2325000000000002e-07,2.2331999999999999e-07,2.2340999999999999e-07,2.2342e-07,2.2345999999999999e-07,2.2354999999999999e-07,2.2356e-07,2.2356999999999998e-07,2.2361000000000003e-07,2.2363e-07,2.2363e-07,2.2374999999999998e-07,2.2374999999999998e-07,2.2382999999999999e-07,2.2384000000000002e-07,2.2407000000000002e-07,2.2408000000000001e-07,2.2419e-07,2.2424999999999999e-07,2.2425999999999997e-07,2.2429000000000001e-07,2.2430000000000002e-07,2.2430000000000002e-07,2.2455000000000001e-07,2.2463000000000002e-07,2.2476999999999999e-07,2.2481000000000001e-07,2.2541999999999999e-07,2.2552999999999998e-07,2.2587e-07,2.2629999999999998e-07,2.2676e-07,2.2679999999999999e-07,2.2739e-07,2.2779999999999999e-07,2.2788e-07,2.2793e-07,2.283e-07,2.2853999999999998e-07,2.2869000000000002e-07,2.2875999999999999e-07,2.2891e-07,2.2891e-07,2.2891e-07,2.2902e-07,2.2906000000000001e-07,2.2911000000000002e-07,2.2916e-07,2.2916e-07,2.2916e-07,2.2935e-07,2.2938000000000001e-07,2.2955999999999997e-07,2.2971000000000001e-07,2.2976000000000001e-07,2.3003999999999999e-07,2.3033000000000002e-07,2.3037999999999998e-07,2.3050999999999999e-07,2.3067000000000001e-07,2.3087e-07,2.3119999999999998e-07,2.3278999999999998e-07,2.3288999999999999e-07,2.3309999999999999e-07,2.3322000000000002e-07,2.3346e-07,2.3356000000000001e-07,2.3382000000000001e-07,2.3388e-07,2.3397999999999998e-07,2.3399000000000002e-07,2.3399000000000002e-07,2.3407e-07,2.3422000000000002e-07,2.3425e-07,2.3439999999999998e-07,2.3474e-07,2.3476999999999998e-07,2.3492000000000002e-07,2.3514e-07,2.3544999999999998e-07,2.3565e-07,2.3570999999999998e-07,2.3575999999999999e-07,2.3579e-07,2.3612e-07,2.3623000000000002e-07,2.3685999999999999e-07,2.3841e-07,2.3859999999999998e-07,2.3892000000000002e-07,2.3914000000000001e-07,2.3937000000000001e-07,2.3942000000000001e-07,2.3961000000000001e-07,2.3985999999999998e-07,2.3989000000000001e-07,2.4007e-07,2.4111000000000002e-07,2.4294000000000003e-07,2.4352e-07,2.4465000000000001e-07,2.4476999999999999e-07,2.4499999999999998e-07,2.4546999999999999e-07,2.4573999999999998e-07,2.4610999999999997e-07,2.4966000000000003e-07,2.5035000000000001e-07,2.5091000000000001e-07,2.5114999999999997e-07,2.5158999999999999e-07,2.5190000000000003e-07,2.5211e-07,2.5317999999999999e-07,2.5354999999999999e-07,2.5701e-07,2.5843000000000002e-07,2.5885999999999998e-07,2.5989999999999999e-07,2.6546e-07,3.1960999999999999e-07,3.3111999999999996e-07,3.3594999999999999e-07,3.5033000000000004e-07,3.5994000000000003e-07,3.7246000000000004e-07,3.8594999999999999e-07,3.9525e-07],"32768":[0.25620212199999998,0.25725927100000001,0.25729754100000002,0.2576772095,0.25806127449999999,0.258976555,0.25929705599999997,0.25933495900000003,0.25938454700000002,0.25947877149999998,0.25959673299999997,0.25972327699999997,0.25977807749999998,0.25981823650000002,0.25988149500000002,0.25994679799999998,0.25997340200000002,0.26005555299999999,0.26010513899999999,0.26011052099999998,0.260113488,0.26013402349999998,0.26016803150000001,0.26018755800000004,0.26019508600000002,0.26024612999999996,0.26028615200000005,0.26029312799999998,0.2603307245,0.26034984400000005,0.26036513849999998,0.26039544549999999,0.26040914300000001,0.26050208549999998,0.260553174,0.26059263600000004,0.26068700449999999,0.26069383699999998,0.26072760499999997,0.26072798699999999,0.26075173750000002,0.26076031300000002,0.26077089200000003,0.26080117300000005,0.26081314450000004,0.26082778699999998,0.26087839000000002,0.26088028200000002,0.26093735099999998,0.26096601400000002,0.26099373999999997,0.26101315600000002,0.26102124999999998,0.26107038599999999,0.26107636200000001,0.261094679,0.2611072995,0.26111283200000002,0.26114352900000004,0.26114508199999997,0.26116508500000002,0.26118774099999997,0.26120701800000001,0.26121598200000001,0.26125543600000001,0.26127410000000001,0.26128704000000003,0.26131715899999997,0.26135122449999998,0.261352158,0.26136127349999999,0.26137540599999998,0.26139613299999997,0.26145879900000002,0.26148593999999997,0.26150234999999999,0.26152958399999998,0.26156090399999998,0.26158921899999998,0.26162724449999997,0.26163241500000001,0.26165239099999998,0.26165289600000002,0.26165919300000001,0.26169928850000002,0.26170396400000001,0.261768528,0.26182298999999998,0.26191447950000002,0.26194044599999999,0.26199201900000002,0.2619956645,0.26200289399999999,0.26206432800000001,0.26212270049999997,0.26222541999999999,0.26225556999999999,0.26226168799999999,0.26227705300000004,0.26232915600000001,0.26241450700000002,0.26242295800000004,0.26242642700000002,0.26243056499999995,0.26247904399999999,0.26249951199999999,0.2625061025,0.26251711,0.26253328450000002,0.262556395,0.26256610550000004,0.26261586399999998,0.26265133949999997,0.26266161500000001,0.262706104,0.26272858700000001,0.26274475200000003,0.26274958100000001,0.26279735000000004,0.26283289450000002,0.26283315500000004,0.26283913250000002,0.26285241400000003,0.26287672200000001,0.26287691549999997,0.26289405599999999,0.26290046950000001,0.262936699,0.26297855299999995,0.26299769299999998,0.26301178400000003,0.2630325275,0.26317247399999999,0.26320904299999998,0.263243803,0.26326666450000002,0.26337292499999998,0.26339454200000001,0.26340125149999999,0.26340547199999997,0.26341723,0.26342403549999999,0.26346280999999999,0.26350212449999999,0.263572523,0.26359073399999999,0.26360478050000002,0.26361953449999997,0.26381094150000001,0.26384011099999999,0.26384485699999999,0.26385059199999999,0.26385097099999999,0.26393707999999999,0.26407067849999999,0.26408561450000001,0.26410024199999999,0.26412302050000003,0.26413011050000001,0.26421396549999998,0.26423934399999999,0.26426290099999999,0.26434441900000005,0.26439067399999999,0.26440749000000002,0.26442297800000003,0.26442967049999999,0.26445668,0.264533658,0.264556022,0.2645780875,0.26458261399999999,0.264592832,0.26466935850000001,0.26467281949999999,0.26469111550000002,0.26475918900000001,0.264774595,0.26484287149999997,0.26492778900000002,0.26494651499999999,0.26500236199999999,0.26503624000000003,0.26531823050000003,0.26532325899999998,0.2653523505,0.26538999750000003,0.265520431,0.26554074249999998,0.26558810599999999,0.26564320900000005,0.26567445200000001,0.26571076599999999,0.26571912399999997,0.26571913600000002,0.265776611,0.26583723100000001,0.26584779400000003,0.26596010149999999,0.26615014599999998,0.2661572485,0.26616637500000001,0.266217712,0.266283783,0.26634932899999997,0.26636218049999999,0.26636252399999999,0.26636393349999998,0.26642870549999997,0.266493164,0.26654963500000001,0.26656586199999999,0.26661982000000001,0.26684292300000001,0.26690100100000003,0.26691456950000003,0.26693552700000001,0.2669766335,0.267020127,0.26721056899999995,0.26725834500000001,0.26729307349999998,0.267318061,0.26732783199999999,0.267502778,0.26752204000000002,0.26761259100000001,0.26764597849999999,0.26792998699999998,0.26795234849999999,0.26799489700000001,0.26800770899999998,0.26800958000000003,0.26802746100000002,0.26806014550000001,0.26827586799999997,0.26871556949999997,0.26877058700000001,0.26878766749999999,0.26885883899999996,0.26887841099999998,0.26888766949999998,0.26894708899999997,0.2692576995,0.26926237350000004,0.26929638150000001,0.2694358905,0.26950935599999998,0.269666454,0.269694294,0.26992486599999999,0.27002575600000001,0.27010231350000002,0.27010556450000001,0.27035675800000003,0.27040639500000002,0.27050995,0.27089337000000002,0.27105789600000002,0.27125440849999999,0.272429317,0.27290644200000003,0.27302456100000005,0.27408935200000001,0.274293707,0.27530240950000001,0.27947361400000004,0.28177360100000004,0.28413241199999995,0.28475876499999997,0.28545371899999999,0.28643334399999998,0.28838594200000001,0.29235981999999999,0.61973087800000004,0.64906451200000004,0.66524295500000008,0.72535700999999997,0.75065529799999997,0.75386803300000005,0.75771637400000003],"6144":[0.0088608019999999992,0.0089105030000000002,0.0089462220000000002,0.0089554030000000007,0.0089660480000000008,0.008981246,0.008984166,0.0089874250000000003,0.0089893890000000004,0.0089928109999999999,0.0089972300000000002,0.0090085459999999992,0.0090091470000000003,0.0090097130000000008,0.0090145690000000001,0.0090153330000000004,0.0090153809999999994,0.0090268569999999992,0.0090327459999999995,0.0090334439999999998,0.0090360690000000007,0.0090394399999999993,0.0090412800000000005,0.0090466169999999999,0.0090474270000000002,0.0090491740000000001,0.0090492939999999994,0.0090519980000000003,0.0090554680000000005,0.0090576279999999999,0.0090585270000000002,0.0090611049999999999,0.0090612290000000005,0.0090618409999999993,0.0090623539999999999,0.0090631640000000003,0.0090633620000000002,0.0090636390000000001,0.0090643040000000005,0.009066691,0.0090705609999999996,0.0090724640000000006,0.0090730159999999997,0.0090798960000000005,0.0090802209999999994,0.0090862909999999998,0.0090876350000000002,0.0090893069999999996,0.0090893269999999995,0.0090930939999999995,0.0090934199999999996,0.0090939539999999996,0.0090963480000000006,0.0090981780000000002,0.0091003590000000006,0.0091008289999999995,0.0091029240000000001,0.009103023,0.0091033599999999996,0.0091034099999999993,0.0091046830000000006,0.0091050369999999999,0.0091051659999999996,0.0091060940000000003,0.0091087419999999995,0.0091109989999999998,0.0091115899999999993,0.0091138279999999992,0.0091193839999999995,0.0091214069999999998,0.0091263460000000005,0.0091285970000000004,0.0091314220000000001,0.0091324119999999995,0.0091329459999999994,0.0091332029999999995,0.0091357620000000004,0.0091366499999999996,0.0091372699999999994,0.009138373,0.009139744,0.0091420830000000005,0.0091429949999999992,0.0091439179999999991,0.0091501150000000003,0.0091516659999999993,0.0091525619999999995,0.0091526409999999996,0.0091563430000000008,0.0091566579999999998,0.0091573209999999995,0.0091583140000000007,0.0091586800000000006,0.0091590749999999992,0.0091591039999999995,0.0091606329999999996,0.0091625539999999998,0.0091646230000000002,0.0091659489999999996,0.0091667039999999995,0.0091693,0.0091702260000000001,0.0091704649999999992,0.0091704979999999992,0.0091724319999999995,0.0091747200000000008,0.0091749750000000001,0.0091759430000000006,0.0091780590000000006,0.0091797300000000005,0.0091861110000000003,0.0091867240000000003,0.0091871839999999993,0.009187275,0.0091877109999999994,0.0091881949999999997,0.0091949760000000005,0.0092001180000000002,0.0092028460000000006,0.0092037960000000002,0.0092049939999999993,0.0092094780000000001,0.0092102550000000005,0.0092124579999999998,0.0092129299999999994,0.0092131729999999998,0.0092144719999999996,0.0092146369999999995,0.0092166339999999996,0.0092174070000000004,0.0092177869999999999,0.0092183379999999995,0.0092188419999999997,0.0092193629999999995,0.0092208240000000007,0.0092230699999999999,0.0092265980000000008,0.0092271369999999998,0.0092297969999999997,0.0092332339999999999,0.0092354989999999994,0.0092361950000000009,0.0092370500000000001,0.0092374250000000005,0.0092382760000000001,0.0092386099999999995,0.0092407329999999992,0.0092424120000000002,0.0092483280000000001,0.0092485060000000001,0.0092495000000000008,0.0092512779999999999,0.0092543279999999992,0.0092543720000000003,0.0092546810000000007,0.0092585459999999994,0.0092594440000000004,0.0092614589999999997,0.0092623480000000001,0.0092628450000000005,0.0092644400000000005,0.0092655719999999997,0.0092689049999999992,0.009273178,0.0092752519999999995,0.0092767160000000008,0.0092773170000000002,0.0092793900000000002,0.0092820060000000006,0.0092834409999999999,0.0092852349999999993,0.0092896109999999997,0.0092905560000000002,0.0092906120000000002,0.0092935569999999992,0.0092953285,0.0093105989999999993,0.0093180799999999994,0.009319651,0.0093203739999999993,0.0093205000000000007,0.0093228770000000002,0.0093245930000000008,0.0093255490000000007,0.0093256060000000002,0.0093259910000000005,0.0093276220000000007,0.0093296899999999999,0.0093300959999999995,0.0093318480000000002,0.0093387420000000006,0.0093438689999999994,0.0093449750000000002,0.0093465349999999996,0.0093503560000000041,0.0093511189999999998,0.009355225,0.0093659269999999996,0.0093660429999999992,0.0093662139999999994,0.0093702430000000003,0.0093739349999999999,0.0093751514999999997,0.0093803949999999858,0.0093830440000000001,0.0093889790000000004,0.0093908749999999999,0.0093912479999999996,0.0093915890000000005,0.0093945390000000004,0.0094079420000000007,0.0094083280000000005,0.0094131790000000007,0.0094213370000000001,0.0094255610000000267,0.0094256289999999996,0.009428634,0.0094297640000000002,0.0094328290000000002,0.0094336469999999999,0.0094356189999999993,0.0094445020000000005,0.0094537460000000007,0.0094557700000000005,0.0094588980000000003,0.0094593850000000007,0.0094626910000000005,0.0094834949999999998,0.0094850170000000001,0.009491424,0.009495323,0.0094991969999999992,0.0095001349999999998,0.0095019059999999992,0.0095195809999999992,0.0095197679999999996,0.0095342399999999994,0.0095409029999999999,0.0095453699999999992,0.009545375,0.0095527589999999992,0.0095582289999999997,0.0095590380000000006,0.0095614900000000006,0.0095678810000000003,0.0095712339999999996,0.0095746900000000003,0.0095889430000000008,0.0095978350000000007,0.0096068379999999995,0.0096253280000000007,0.0096309599999999992,0.0096400930000000006,0.0096788380000000004,0.0096832545000000003,0.0097028199999999992,0.0097137779999999993,0.0097357290000000003,0.0097499630000000004,0.0098127930000000002,0.0098287870000000003,0.0098622290000000001,0.0098788025000000005,0.0099119269999999992,0.009929851,0.0099419420000000005,0.010000670499999999,0.010009472,0.010025350000000001,0.010030891,0.010047886000000001,0.010049091,0.010080733999999999,0.010103532,0.018892876999999999,0.020713893000000001,0.021181096999999999,0.021967737000000001,0.026222882999999999,0.026241206,0.030632504000000001],"384":[3.5210999999999999e-05,3.5228000000000002e-05,3.5238999999999999e-05,3.5244499999999998e-05,3.5250000000000003e-05,3.5250999999999998e-05,3.5256999999999998e-05,3.5256999999999998e-05,3.5265999999999997e-05,3.5265999999999997e-05,3.5275499999999998e-05,3.5281000000000003e-05,3.5286000000000001e-05,3.5289e-05,3.5289e-05,3.5293000000000002e-05,3.5293999999999998e-05,3.5296000000000002e-05,3.5302999999999997e-05,3.5302999999999997e-05,3.5305000000000002e-05,3.5309999999999999e-05,3.5326e-05,3.5332000000054542e-05,3.5336999999999997e-05,3.5339000000000002e-05,3.5349999999999999e-05,3.5358999999999998e-05,3.536e-05,3.5376999999999997e-05,3.5398999999999998e-05,3.5404000000000002e-05,3.5405999999999999e-05,3.5441999999999997e-05,3.6426333333333334e-05,3.6610019230769229e-05,3.6627880000000001e-05,3.6634699999999997e-05,3.6694399999999999e-05,3.6802350000000002e-05,3.685820634920635e-05,3.6872000000000002e-05,3.6881999999999997e-05,3.6896e-05,3.6897999999999998e-05,3.6911333333333334e-05,3.6912000000000002e-05,3.6915999999999997e-05,3.6916999999999999e-05,3.6916999999999999e-05,3.6919999999999999e-05,3.6925999999999998e-05,3.6927000000000001e-05,3.6928979999999997e-05,3.6928999999999998e-05,3.6934000000000002e-05,3.6939e-05,3.6940000000000002e-05,3.6943999999999997e-05,3.6944999999999999e-05,3.6944999999999999e-05,3.6952999999999997e-05,3.6952999999999997e-05,3.6955000000000001e-05,3.6956999999999999e-05,3.6959000000000003e-05,3.6962000000000003e-05,3.6962999999999998e-05,3.6968000000000002e-05,3.697e-05,3.697e-05,3.6971999999999998e-05,3.6980999999999997e-05,3.6984999999999999e-05,3.6990570000000003e-05,3.6993999999999999e-05,3.6996999999999998e-05,3.6996999999999998e-05,3.7005999999999998e-05,3.7013e-05,3.7021999999999999e-05,3.7038e-05,3.7041e-05,3.7044e-05,3.7051999999999997e-05,3.7054999999999997e-05,3.7070000000000003e-05,3.7141779999999996e-05,3.7199130000000003e-05,3.7265089999999996e-05,3.7298429999999997e-05,3.730283e-05,3.7333869999999996e-05,3.7408079999999997e-05,3.7422860000000001e-05,3.7446130000000003e-05,3.7484850000000001e-05,3.7548410000000002e-05,3.7553569999999997e-05,3.7609049180327866e-05,3.7618349999999995e-05,3.762307e-05,3.7694490909090913e-05,3.7710220000000005e-05,3.7727690000000001e-05,3.7735569999999996e-05,3.7773659999999998e-05,3.7776620000000002e-05,3.77826e-05,3.7790157894736838e-05,3.7796790000000003e-05,3.7823729999999997e-05,3.7856399999999999e-05,3.7879380000000001e-05,3.7880719999999999e-05,3.7882240000000004e-05,3.7888362068965522e-05,3.7893688524590164e-05,3.7894649999999998e-05,3.7915840000000003e-05,3.7971469999999998e-05,3.8011730000000003e-05,3.8047889999999998e-05,3.8085910000000001e-05,3.8105660000000001e-05,3.8110759999999998e-05,3.8114009999999995e-05,3.8118017241379307e-05,3.8121719999999999e-05,3.8140050000000001e-05,3.8158249999999993e-05,3.8169381818181815e-05,3.8176380000000001e-05,3.8187299999999999e-05,3.8189370000000002e-05,3.8190830000000002e-05,3.8193330000000001e-05,3.8200079999999999e-05,3.8201618181818183e-05,3.8241229999999998e-05,3.8251129999999999e-05,3.8296530000000004e-05,3.8348130000000002e-05,3.8352042553191488e-05,3.8386210000000003e-05,3.8414280000000001e-05,3.8437745098039221e-05,3.8478872340425535e-05,3.8513390000000002e-05,3.8513539999999999e-05,3.8555839999999997e-05,3.8589279999999999e-05,3.859356e-05,3.8601452830188682e-05,3.8616769999999997e-05,3.8634870000000003e-05,3.8635829999999996e-05,3.8646191489361703e-05,3.865072e-05,3.865168e-05,3.8658600000000003e-05,3.8670462962962963e-05,3.8674377358490561e-05,3.867561e-05,3.8677999999999998e-05,3.8678299999999999e-05,3.8678499999999999e-05,3.8686937500000003e-05,3.8686999999999997e-05,3.8690129999999999e-05,3.8690304347826086e-05,3.8696229999999999e-05,3.8698159999999999e-05,3.87007e-05,3.8702999999999999e-05,3.8704000000000001e-05,3.8704839999999999e-05,3.8707000000000001e-05,3.8708999999999998e-05,3.8709499999999999e-05,3.8710559999999999e-05,3.8712439999999995e-05,3.8714000000000002e-05,3.8714999999999998e-05,3.8717999999999998e-05,3.8718499999999999e-05,3.8719500000000001e-05,3.8722659999999998e-05,3.8723000000000002e-05,3.8723000000000002e-05,3.8727999999999999e-05,3.8727999999999999e-05,3.8727999999999999e-05,3.8733000000000003e-05,3.8741000000000001e-05,3.8741000000000001e-05,3.8742267857142854e-05,3.8744e-05,3.8748999999999998e-05,3.8754000000000002e-05,3.875717e-05,3.8763000000000001e-05,3.8770000000000003e-05,3.8776999999999998e-05,3.8781e-05,3.8788000000000002e-05,3.8788419999999998e-05,3.8792999999999999e-05,3.8794999999999997e-05,3.8794999999999997e-05,3.879843e-05,3.8800999999999997e-05,3.8801999999999999e-05,3.8807000000000003e-05,3.8811350000000002e-05,3.8813000000000003e-05,3.8813999999999998e-05,3.8816000000000002e-05,3.8818e-05,3.8821e-05,3.8826999999999999e-05,3.8835010000000004e-05,3.8838000000000003e-05,3.8844000000000003e-05,3.8863999999999999e-05,3.8909000000000003e-05,3.8933480000000001e-05,3.8961526315789476e-05,3.9146579999999994e-05,3.9315879999999999e-05,3.9381348837209303e-05,3.9741680000000005e-05,4.027244e-05,4.0413269999999999e-05,4.0574119999999996e-05,4.0704523809523807e-05,4.0705979999999998e-05,4.0763559999999994e-05,4.1122249999999994e-05,4.1141570000000004e-05,4.1148069999999998e-05,4.1198153846153848e-05,4.1289009999999998e-05,4.129728e-05,4.1307256410256413e-05,4.139334210526316e-05,4.1510200000000001e-05,4.1515299999999999e-05,4.1623570000000004e-05,4.1658310000000001e-05,4.1719948717948716e-05,4.1726026315789479e-05,4.1727615384615386e-05,4.1737361111111117e-05,4.1737689999999998e-05,4.1737781249999999e-05,4.1744629999999995e-05,4.1752526315789477e-05,4.1758470588235293e-05,4.1760717948717946e-05,4.1762120000000006e-05,4.1765117647058827e-05,4.1766852941176468e-05,4.1794e-05,4.1812480000000005e-05,4.1816789999999995e-05,4.1820190000000003e-05,4.1824447368421054e-05,4.1829000000000002e-05,4.1832000000000002e-05,4.1858679999999998e-05,4.1860999999999998e-05,4.1885000000000003e-05,4.6801999999999997e-05,7.1561000000000001e-05,7.5103000000000002e-05,7.6656000000000006e-05,7.8296999999999999e-05,7.873349e-05,7.9269000000000003e-05,8.1174000000000006e-05],"160":[6.6851800000000003e-06,6.6867999999999992e-06,6.6872500000000002e-06,6.6993300000000008e-06,6.7001666666666664e-06,6.703e-06,6.7132340425531913e-06,6.7154499999999994e-06,6.7178730158730162e-06,6.7187599999999997e-06,6.7190200000000001e-06,6.7221000000000004e-06,6.7236122448979594e-06,6.7241299999999993e-06,6.7245100000000004e-06,6.7246666666666668e-06,6.7312999999999994e-06,6.7333200000000001e-06,6.7338636363636362e-06,6.7339500000000001e-06,6.7347200000000006e-06,6.7353499999999998e-06,6.7356000000000004e-06,6.7386300000000006e-06,6.7391300000000008e-06,6.740399999999999e-06,6.7408900000000003e-06,6.7418100000000003e-06,6.7438800000000002e-06,6.7449999999999998e-06,6.7461304347826082e-06,6.7473333333333332e-06,6.7475000000000002e-06,6.7513100000000008e-06,6.7523333333333331e-06,6.7537600000000002e-06,6.7549500000000004e-06,6.7556299999999997e-06,6.7564899999999997e-06,6.7570300000000003e-06,6.75803125e-06,6.7587500000000003e-06,6.7601399999999993e-06,6.7620799999999995e-06,6.7646399999999998e-06,6.7649999999999996e-06,6.7702400000000003e-06,6.7715000000000003e-06,6.7716200000000002e-06,6.7733099999999999e-06,6.7744699999999997e-06,6.7744799999999996e-06,6.7745900000000005e-06,6.7754999999999998e-06,6.7755900000000001e-06,6.7800000000000003e-06,6.7861699999999999e-06,6.78703e-06,6.8009999999999998e-06,6.8108299999999996e-06,6.8179999999999998e-06,6.8186899999999998e-06,6.8216800000000006e-06,6.8248100000000001e-06,6.8249999999999999e-06,6.8361699999999995e-06,6.8369199999999994e-06,6.8427099999999996e-06,6.8464199999999999e-06,6.8522299999999998e-06,6.8530900000000007e-06,6.8622699999999999e-06,6.8633400000000003e-06,6.8669999999999996e-06,6.8675599999999999e-06,6.8709999999999999e-06,6.8752600000000006e-06,6.8780500000000002e-06,6.8788199999999998e-06,6.8793299999999991e-06,6.8863200000000002e-06,6.8890499999999997e-06,6.8920699999999992e-06,6.8950000000000001e-06,6.8970399999999996e-06,6.9044600000000003e-06,6.9049400000000008e-06,6.9056800000000001e-06,6.9119400000000001e-06,6.9129999999999997e-06,6.9179599999999994e-06,6.9230099999999995e-06,6.9233799999999999e-06,6.9238700000000003e-06,6.9360199999999999e-06,6.9361499999999997e-06,6.9371000000000009e-06,6.9395100000000009e-06,6.9403599999999994e-06,6.9418899999999997e-06,6.9462699999999995e-06,6.9651100000000003e-06,6.9663900000000001e-06,6.9738299999999996e-06,6.9742199999999998e-06,6.97932e-06,6.9804000000000001e-06,6.9820099999999992e-06,6.9827099999999999e-06,6.98466e-06,6.9859200000000009e-06,6.9866500000000003e-06,6.9881699999999999e-06,6.9902800000000001e-06,6.99603e-06,6.9988699999999996e-06,7.00074e-06,7.0016800000000005e-06,7.00585e-06,7.0073599999999998e-06,7.0075555555555556e-06,7.0075599999999994e-06,7.00855e-06,7.0126800000000001e-06,7.0140600000000001e-06,7.0143699999999997e-06,7.0182e-06,7.0208000000000006e-06,7.0250300000000001e-06,7.0268299999999998e-06,7.0301599999999998e-06,7.0311699999999993e-06,7.0329500000000001e-06,7.0334700000000001e-06,7.0338299999999999e-06,7.03451e-06,7.0361600000000002e-06,7.0374200000000003e-06,7.0412600000000004e-06,7.0426899999999997e-06,7.0427399999999998e-06,7.0428499999999998e-06,7.0434500000000003e-06,7.0434899999999997e-06,7.0459499999999999e-06,7.04881e-06,7.0488750000000003e-06,7.0491e-06,7.0536999999999999e-06,7.0543298969072159e-06,7.0554500000000004e-06,7.05599e-06,7.0580100000000007e-06,7.0581199999999999e-06,7.0590099999999995e-06,7.0621666666666673e-06,7.0643400000000005e-06,7.0653800000000004e-06,7.0662100000000009e-06,7.0700099999999999e-06,7.0700500000000002e-06,7.0749099999999997e-06,7.0755999999999996e-06,7.0784000000000007e-06,7.0802699999999994e-06,7.0811699999999997e-06,7.0817142857142855e-06,7.08304e-06,7.0876599999999997e-06,7.0896666666666667e-06,7.0920499999999993e-06,7.0928199999999998e-06,7.0983000000000003e-06,7.0988900000000001e-06,7.0993800000000005e-06,7.0998299999999998e-06,7.1030699999999994e-06,7.11153e-06,7.1180000000000003e-06,7.1289599999999996e-06,7.1292399999999997e-06,7.1481799999999999e-06,7.15644e-06,7.1600000000000001e-06,7.1670000000000002e-06,7.1686899999999998e-06,7.1927600000000006e-06,7.1975600000000001e-06,7.2025500000000002e-06,7.2075199999999997e-06,7.2394200000000002e-06,7.2470000000000002e-06,7.2494400000000007e-06,7.2533000000000005e-06,7.2591800000000002e-06,7.2607499999999999e-06,7.26482e-06,7.2751200000000006e-06,7.2775100000000001e-06,7.2859099999999998e-06,7.2896800000000001e-06,7.2942099999999994e-06,7.2964799999999998e-06,7.3029699999999998e-06,7.3061899999999998e-06,7.3132600000000005e-06,7.3364000000000006e-06,7.33891e-06,7.3503900000000001e-06,7.3525499999999996e-06,7.3530499999999998e-06,7.3532500000000003e-06,7.3621400000000005e-06,7.3630200000000002e-06,7.3644199999999999e-06,7.3694299999999997e-06,7.3713900000000004e-06,7.3716600000000007e-06,7.3719999999999999e-06,7.3737647058823523e-06,7.3737900000000006e-06,7.3755900000000003e-06,7.3759800000000005e-06,7.38329213483146e-06,7.3842000000000004e-06,7.3854599999999996e-06,7.3871578947368426e-06,7.3876899999999997e-06,7.3883800000000006e-06,7.3887000000000001e-06,7.3891500000000002e-06,7.3891699999999999e-06,7.3925399999999994e-06,7.3941899999999996e-06,7.3952599999999999e-06,7.3958899999999999e-06,7.3988899999999997e-06,7.3989700000000002e-06,7.4022500000000002e-06,7.4023100000000001e-06,7.4034100000000008e-06,7.4085999999999997e-06,7.4098499999999999e-06,7.4112899999999998e-06,7.4119899999999997e-06,7.4130799999999997e-06,7.4133700000000005e-06,7.41392e-06,7.4149199999999996e-06,7.4150588235294106e-06,7.42282e-06,7.5399999999999998e-06,7.5442800000000002e-06,7.5512200000000004e-06,7.5690599999999998e-06,7.5699800000000007e-06,7.5979999999999999e-06,7.6284100000000004e-06,7.7538300000000006e-06,7.7805600000000003e-06,7.7913299999999998e-06,7.8133000000000002e-06,7.9227699999999994e-06,7.9242999999999997e-06,7.942360000000001e-06,7.9514199999999995e-06,7.9515800000000005e-06,7.9558400000000004e-06,7.9604299999999996e-06,7.9738100000000005e-06,7.9811000000000005e-06,8.0025e-06,8.0074700000000004e-06,8.0378499999999996e-06,1.2622999999999999e-05,1.3115714285714286e-05,1.322443e-05,1.323097e-05,1.334621e-05,1.437541e-05,1.4475639999999999e-05],"5120":[0.0061659139999999998,0.006174428,0.0061814490000000003,0.0061818239999999998,0.0061932280000000003,0.0061941940000000001,0.0061947989999999731,0.0061987020000000004,0.0061987420000000001,0.0062043350000000001,0.0062050660000000004,0.0062057880000000003,0.0062060939999999997,0.0062062239999999998,0.0062141089999999998,0.0062145840000000004,0.0062213429999999998,0.0062254390000000001,0.0062276459999999999,0.0062317579999999996,0.006232011,0.0062326899999999999,0.0062393229999999997,0.0062394369999999996,0.0062440550000000001,0.0062452619999999997,0.0062466839999999997,0.0062470679999999997,0.0062474039999999998,0.0062486939999999999,0.0062497200000000003,0.0062500769999999997,0.0062522680000000001,0.0062527149999999998,0.0062546729999999997,0.0062562490000000002,0.006257594,0.0062584320000000004,0.0062592359999999996,0.0062599140000000001,0.0062608639999999997,0.0062614039999999999,0.0062625199999999997,0.0062626230000000001,0.00626496,0.006267898,0.0062682370000000003,0.0062693690000000003,0.0062694509999999997,0.0062704919999999999,0.0062707489999999999,0.0062719070000000002,0.0062724670000000003,0.0062730140000000004,0.0062769870000000004,0.0062776519999999999,0.0062787420000000004,0.0062794369999999997,0.0062824020000000003,0.0062825709999999998,0.0062832699999999997,0.0062836719999999997,0.0062837459999999998,0.0062842030000000004,0.0062845740000000002,0.00628817,0.0062885190000000002,0.0062887289999999998,0.0062901520000000002,0.0062907700000000002,0.0062912890000000003,0.0062915519999999997,0.0062971939999999999,0.0063000039999999997,0.0063006060000000003,0.0063013089999999997,0.006301938,0.0063028190000000003,0.006306173,0.0063090159999999998,0.0063093239999999998,0.0063107420000000003,0.0063120329999999999,0.0063130269999999997,0.0063136440000000002,0.0063138150000000004,0.0063140080000000003,0.0063141159999999998,0.006314966,0.0063155490000000002,0.006317362,0.006319056,0.0063190779999999997,0.0063199270000000004,0.0063257499999999998,0.0063272939999999998,0.0063282909999999998,0.0063284400000000003,0.0063290569999999999,0.0063310370000000003,0.0063317319999999996,0.006336988,0.0063377659999999999,0.0063402850000000002,0.0063412019999999998,0.0063417960000000002,0.0063464419999999999,0.006346979,0.0063470050000000002,0.0063480170000000001,0.0063502309999999996,0.0063508499999999999,0.0063533169999999998,0.006355243,0.006355922,0.0063595659999999997,0.0063600339999999997,0.0063601159999999999,0.0063601530000000003,0.0063604220000000001,0.0063629389999999997,0.0063634149999999999,0.0063634750000000004,0.0063637140000000003,0.0063641679999999999,0.006364888,0.006365211,0.0063679050000000001,0.0063699940000000004,0.0063727180000000003,0.0063736449999999998,0.0063780390000000003,0.0063815310000000002,0.0063819619999999997,0.0063835690000000004,0.0063839140000000001,0.00638414,0.0063865930000000003,0.0063868689999999999,0.0063868969999999999,0.0063903520000000002,0.0063908719999999997,0.0063910169999999997,0.0063932099999999999,0.0063942909999999999,0.0063943230000000004,0.0063960110000000001,0.0063977330000000001,0.0063978639999999996,0.0064001099999999997,0.0064026930000000001,0.006403115,0.0064050130000000002,0.0064078659999999999,0.0064086389999999998,0.0064092419999999999,0.0064097620000000003,0.0064155599999999998,0.0064178880000000001,0.006419213,0.006419302,0.0064198570000000002,0.0064219940000000003,0.0064239550000000003,0.0064239550000000367,0.0064243750000000004,0.0064275640000000002,0.0064297410000000001,0.0064307449999999999,0.0064316629999999998,0.0064357349999999997,0.0064372020000000004,0.0064387439999999997,0.0064390530000000001,0.0064432209999999998,0.0064454179999999996,0.0064464860000000004,0.0064473250000000003,0.0064473689999999997,0.0064508899999999999,0.0064521179999999997,0.006457104,0.0064589540000000003,0.0064600059999999999,0.006461222,0.0064623220000000004,0.006463,0.0064646840000000001,0.0064689420000000001,0.006469476,0.0064698230000000004,0.00647015,0.0064724409999999998,0.0064746789999999997,0.0064750399999999996,0.0064752890000000004,0.0064781120000000003,0.0064787730000000002,0.0064825309999999997,0.0064830620000000004,0.0064831410000000004,0.006483974,0.0064843510000000002,0.006487352,0.0064893579999999998,0.0064920860000000002,0.0064922950000000004,0.0064972090000000003,0.0064978520000000001,0.0065005929999999998,0.0065027369999999998,0.006503038,0.0065031280000000004,0.0065034749999999999,0.0065058470000000004,0.006514934,0.0065200170000000003,0.0065208130000000003,0.006529956,0.006530564,0.0065308509999999998,0.0065343909999999996,0.0065365800000000002,0.0065374229999999997,0.0065439110000000003,0.0065443080000000542,0.0065464470000000004,0.0065546950000000001,0.0065554929999999999,0.0065562759999999998,0.0065620059999999996,0.0065651629999999997,0.0065727370000000004,0.0065768019999999996,0.006579891,0.006580547,0.006590182,0.0066030120000000001,0.0066051360000000002,0.0066088090000000002,0.0066186179999999997,0.0066225609999999999,0.0066348580000000004,0.0066369569999999998,0.0066488620000000002,0.0066547719999999998,0.0066684860000000004,0.0066717269999999997,0.0066947120000000002,0.0067083209999999997,0.0067301139999999997,0.0067402809999999999,0.0067490279999999998,0.0067839969999999999,0.0067891719999999996,0.0068423829999999996,0.0068843309999999996,0.0069169779999999998,0.006923111,0.0069234939999999997,0.0069316389999999999,0.00693313,0.0069585309999999996,0.0069592100000000004,0.0069610590000000003,0.0069616069999999999,0.0069665580000000003,0.0069710350000000004,0.0069857160000000003,0.007018369,0.0070303120000000004,0.0070414420000000002,0.0070893960000000004,0.0072943050000000001,0.012793239,0.013231869,0.014002668500000001,0.014172150999999999,0.014561674,0.015279941,0.023075613500000001],"448":[4.7473499999999999e-05,4.7482999999999999e-05,4.7484500000000003e-05,4.7488999999999999e-05,4.7492333333333339e-05,4.7494499999999997e-05,4.7494500000000004e-05,4.7496499999999995e-05,4.7499e-05,4.7500000000000003e-05,4.7500666666666664e-05,4.7506999999999998e-05,4.7513499999999998e-05,4.7521500000000002e-05,4.7523666666666667e-05,4.7536e-05,4.7536e-05,4.7540000000000002e-05,4.7542e-05,4.7543000000000002e-05,4.7543000000000002e-05,4.7546999999999997e-05,4.7552999999999997e-05,4.7555999999999997e-05,4.7559000000000003e-05,4.7559999999999999e-05,4.7561000000000001e-05,4.7568999999999998e-05,4.7583000000000002e-05,4.7589000000000001e-05,4.7590999999999999e-05,4.7605999999999998e-05,4.7621999999999999e-05,4.7627000000000003e-05,4.7672e-05,4.9694999999999998e-05,4.9696e-05,4.969775e-05,4.9698499999999999e-05,4.9700833333333337e-05,4.9703000000000002e-05,4.9710333333333331e-05,4.9717000000000005e-05,4.9719000000000003e-05,4.9719999999999998e-05,4.9720499999999999e-05,4.9722499999999997e-05,4.9725000000000002e-05,4.9728000000000002e-05,4.9728000000000002e-05,4.9728999999999998e-05,4.9733e-05,4.9734000000000002e-05,4.97395e-05,4.9743000000000001e-05,4.9747999999999999e-05,4.9747999999999999e-05,4.9749000000000001e-05,4.9753999999999998e-05,4.9753999999999998e-05,4.9758e-05,4.9759999999999998e-05,4.9759999999999998e-05,4.9761e-05,4.9765999999999998e-05,4.9767e-05,4.9767e-05,4.9768000000000002e-05,4.9777000000000001e-05,4.9790000000000003e-05,4.9790000000000003e-05,4.9805000000000002e-05,4.9812999999999999e-05,4.9815999999999999e-05,4.9821999999999998e-05,4.9824000000000003e-05,4.9832e-05,4.9845000000000001e-05,4.9862689999999999e-05,4.9863e-05,4.9866e-05,4.9869e-05,4.9895000000000003e-05,4.9975999999999997e-05,5.0018599999999996e-05,5.0048797752808995e-05,5.0351483516483517e-05,5.036525e-05,5.0369623655913979e-05,5.0404847058823522e-05,5.0493844444444443e-05,5.0497078651685392e-05,5.0591499999999998e-05,5.065929032258065e-05,5.0668640449438203e-05,5.0703759999999998e-05,5.0717067415730336e-05,5.0742750000000001e-05,5.0749586956521735e-05,5.075842e-05,5.0781863157894735e-05,5.0802886363636363e-05,5.0810680000000003e-05,5.0866089999999997e-05,5.0900072916666666e-05,5.0944263157894732e-05,5.1065120481927711e-05,5.1110369999999996e-05,5.1115339999999998e-05,5.1129799999999993e-05,5.1152639999999998e-05,5.1172833333333332e-05,5.1230879999999996e-05,5.1258110000000004e-05,5.1291790000000002e-05,5.1328500000000002e-05,5.1347956043956046e-05,5.1350358695652182e-05,5.1360337078651683e-05,5.1366227272727279e-05,5.1421695652173908e-05,5.1449200000000002e-05,5.1465199999999996e-05,5.1527318681318683e-05,5.1532440000000004e-05,5.1537489999999998e-05,5.1567505747126439e-05,5.1587670454545451e-05,5.1603362637362637e-05,5.1610420000000005e-05,5.1624899999999994e-05,5.1635711111111113e-05,5.1636494623655915e-05,5.1651124999999999e-05,5.1674839999999998e-05,5.1679176470588235e-05,5.1680859999999999e-05,5.1755509999999997e-05,5.1766900000000001e-05,5.1791775280898879e-05,5.1808215909090908e-05,5.1824369999999996e-05,5.1861470000000003e-05,5.1866670454545459e-05,5.1874199999999999e-05,5.1905211764705881e-05,5.1907593023255816e-05,5.1914097560975613e-05,5.1923357142857149e-05,5.1924500000000001e-05,5.196496470588235e-05,5.1972329999999999e-05,5.2019570000000004e-05,5.2026088607594934e-05,5.2038722222222225e-05,5.2056857142857143e-05,5.206877528089887e-05,5.2076736263736265e-05,5.2104000000000001e-05,5.2122410000000002e-05,5.2132000000000002e-05,5.2132999999999997e-05,5.2135999999999997e-05,5.2136999999999999e-05,5.2139999999999999e-05,5.214449425287356e-05,5.214525e-05,5.2146333333333333e-05,5.2149333333333332e-05,5.215e-05,5.2153e-05,5.215433333333333e-05,5.2160000000000002e-05,5.2160000000000002e-05,5.2160999999999997e-05,5.2161250000000001e-05,5.2162e-05,5.2164999999999999e-05,5.2168930000000003e-05,5.2169999999999997e-05,5.2172000000000001e-05,5.2176000000000003e-05,5.2176999999999999e-05,5.2176999999999999e-05,5.2179999999999998e-05,5.2184e-05,5.2188000000000002e-05,5.219e-05,5.2193e-05,5.2194000000000002e-05,5.2197890243902442e-05,5.2200999999999997e-05,5.2202804878048778e-05,5.2203000000000001e-05,5.2204999999999999e-05,5.2216999999999998e-05,5.2222000000000002e-05,5.2225000000000002e-05,5.2225000000000002e-05,5.2228000000000002e-05,5.223e-05,5.2238999999999999e-05,5.2244000000000003e-05,5.2253000000000003e-05,5.2253999999999998e-05,5.2255e-05,5.2257440000000002e-05,5.2261e-05,5.2262000000000002e-05,5.2262999999999998e-05,5.2262999999999998e-05,5.2264e-05,5.2274999999999997e-05,5.2281000000000003e-05,5.2284999999999998e-05,5.2293000000000002e-05,5.2293000000000002e-05,5.2298e-05,5.2299900000000004e-05,5.2302999999999997e-05,5.2318999999999998e-05,5.2327000000000002e-05,5.2330244444444452e-05,5.2340999999999999e-05,5.2356657534246572e-05,5.2429097560975611e-05,5.2535309999999999e-05,5.284897e-05,5.2877319999999997e-05,5.310528e-05,5.3117354430379746e-05,5.3439428571428571e-05,5.3472060240963861e-05,5.3475841463414639e-05,5.3623387499999995e-05,5.3640929411764707e-05,5.3970890000000001e-05,5.4222840000000001e-05,5.4228172839506165e-05,5.4252000000000002e-05,5.4470730000000002e-05,5.4833770000000001e-05,5.4866480519480522e-05,5.5383899999999997e-05,5.5407441558441564e-05,5.5449825000000001e-05,5.5713866666666662e-05,5.5784935064935068e-05,5.5861559999999998e-05,5.589753e-05,5.5968600000000005e-05,5.617214285714286e-05,5.6226558441558445e-05,5.6233763157894736e-05,5.623515277777778e-05,5.6239319999999983e-05,5.6252919999999999e-05,5.6258766233766238e-05,5.6259649350649353e-05,5.626218421052632e-05,5.6280000000000003e-05,5.6294675324675332e-05,5.6298000000000002e-05,5.6298999999999997e-05,5.6303710526315789e-05,5.6318289999999998e-05,5.6322e-05,5.6332000000000002e-05,5.6341999999999997e-05,5.6355802631578942e-05,5.6357000000000003e-05,5.6441999999999999e-05,5.790274e-05,9.3626000000000001e-05,9.8158000000000004e-05,9.9485e-05,9.9725111111111114e-05,0.00010225099999999999,0.00010773610000000001,0.000109171,0.000110375],"16384":[0.06400793199999999,0.064175833000000002,0.064281564999999999,0.064304027,0.064419752999999996,0.064429842500000001,0.064440375999999994,0.064512023000000002,0.064547858999999999,0.064567380999999993,0.064683200999999996,0.064696306999999995,0.064696765000000003,0.064697609000000003,0.064703087000000006,0.064712418999999993,0.064721308000000005,0.064737249999999996,0.064754492999999996,0.064788309000000002,0.064799187999999994,0.064802625000000003,0.064805970000000004,0.064815446999999971,0.064824415999999996,0.064835148499999995,0.064844365000000001,0.064858698000000006,0.064894041999999999,0.064911292999999995,0.064931438999999994,0.064931663000000001,0.064943475000000001,0.064986232000000005,0.064995545000000002,0.065038573000000002,0.065043168999999998,0.065050040000000003,0.065063224000000003,0.065063713999999995,0.065065465000000003,0.065078665499999994,0.065086938999999996,0.065088164000000004,0.065109337000000003,0.065113900000000002,0.065114903000000002,0.065125560499999999,0.065128629499999979,0.065130582500000006,0.065131276000000002,0.065131943999999997,0.065132188999999993,0.065167428999999999,0.065168330999999996,0.065179457999999996,0.065189293999999995,0.065196668999999999,0.065211733999999993,0.065213529500000006,0.065223086,0.065224686000000004,0.065233446,0.065233478999999997,0.065253648999999997,0.065259130999999998,0.065285542000000002,0.065293840499999978,0.065301698500000005,0.065313147000000002,0.065322675999999996,0.065341529499999995,0.065363590499999999,0.065365925000000005,0.065371126000000002,0.065371895999999999,0.0653749525,0.065380113000000004,0.065390462999999996,0.065391941999999995,0.065399217999999995,0.0654090435,0.065432404499999999,0.065439983500000007,0.065441963500000006,0.065445136000000001,0.065453575,0.065455971000000002,0.065465526499999996,0.065471905999999996,0.065474116999999998,0.065476654499999995,0.065500718499999999,0.065512339000000003,0.065516857499999998,0.065519055000000007,0.0655232075,0.065531559500000003,0.065546734999999995,0.065551586999999994,0.065555268,0.065575103499999995,0.065577610000000008,0.065578567500000004,0.0655836115,0.065599744500000001,0.065604810499999999,0.065610401999999998,0.065614363999999994,0.065617020999999998,0.065617375000000006,0.065617696500000003,0.065624417000000004,0.065627157000000005,0.065628091999999999,0.065638259000000004,0.065641041999999997,0.065665604000000002,0.065678088999999995,0.065685504000000006,0.065715839999999998,0.065731050000000013,0.065735521000000005,0.065744880000000006,0.065748512999999995,0.065748708000000003,0.065749813000000004,0.065761316,0.065766195999999999,0.065766215000000017,0.065794765000000005,0.065813209999999997,0.065816979499999997,0.065817669999999995,0.065824259999999996,0.065836564,0.065847143499999997,0.065858731000000004,0.065896847999999994,0.065899729000000004,0.065926018500000003,0.065926571500000003,0.065932039999999997,0.065934789999999993,0.065942637999999998,0.065956945000000003,0.065972578000000004,0.065975193000000001,0.065981028499999997,0.065982549500000001,0.066005464,0.066016474499999978,0.066022647000000004,0.066024763,0.066030761499999993,0.066033604999999995,0.066041848,0.066048100999999998,0.066066018000000004,0.066076612500000007,0.066078279000000004,0.066082120999999994,0.066093185999999998,0.066096118999999995,0.066097879499999998,0.066111086500000027,0.066131208999999996,0.066136723999999994,0.066141066000000026,0.066147030999999995,0.066154828499999999,0.066183602999999994,0.066190945000000001,0.066197861499999996,0.066200009500000004,0.066200616000000004,0.066204928999999996,0.066206321999999998,0.066233312000000003,0.066289073000000004,0.066291755999999993,0.066318512999999996,0.066340052999999996,0.066340782000000001,0.066354549999999998,0.066362793000000003,0.066371190999999996,0.066371433499999993,0.066375271999999999,0.066377702999999996,0.066385652000000003,0.066387867000000003,0.066396023499999998,0.0664097295,0.066421183999999994,0.066432184000000005,0.066450116000000004,0.066458455,0.066463675999999999,0.066478155499999997,0.066486321000000001,0.066504670000000002,0.066528180000000006,0.066559952500000005,0.066578578999999999,0.066612771000000001,0.066613352000000001,0.066637752999999994,0.066673061000000033,0.066684900000000005,0.066705292499999999,0.066710626999999995,0.066726079999999993,0.066737319000000003,0.066741043499999986,0.066743804500000004,0.066754015,0.066764791000000004,0.066805612,0.066806410999999996,0.066856435500000005,0.066889196999999997,0.066916086999999999,0.066950879000000005,0.066952167500000007,0.066962014,0.066990716500000005,0.067028310999999993,0.067042033500000001,0.067059991999999999,0.067063312,0.067082328999999996,0.067088458000000004,0.067112021500000008,0.067112886999999996,0.067126203999999995,0.067156721000000003,0.067177957999999996,0.067180568999999996,0.06723933,0.067244540000000005,0.067272419,0.067292999000000006,0.067355491500000003,0.067375689000000002,0.067379624999999999,0.067508209500000027,0.067598173999999997,0.067690735000000002,0.067695950000000005,0.067703510000000022,0.067706218999999998,0.067848221,0.067853667000000006,0.067858024000000003,0.067940166999999996,0.068012304999999995,0.068048045000000001,0.068209146999999998,0.068574831500000002,0.069309384000000002,0.069788296999999999,0.069845626499999994,0.070111552999999993,0.070180286500000022,0.070238800000000004,0.070306063000000002,0.070356224999999994,0.070386760000000007,0.070629583499999996,0.070842611999999999,0.070876870999999994,0.072591757000000007,0.0882877985,0.148333784,0.16199745500000001,0.16201523500000001,0.17537610999999997,0.17862641300000001,0.178866417,0.20238467299999999],"112":[3.4604699999999998e-06,3.4618e-06,3.4633899999999999e-06,3.4744499999999998e-06,3.4746315789473688e-06,3.4752799999999999e-06,3.4778599999999999e-06,3.4779000000000002e-06,3.4788499999999997e-06,3.4798499999999998e-06,3.48271e-06,3.48475e-06,3.4853500000000004e-06,3.48584e-06,3.4860900000000001e-06,3.4864299999999998e-06,3.48716e-06,3.48722e-06,3.48854e-06,3.4904800000000002e-06,3.4907700000000001e-06,3.4908800000000002e-06,3.4936299999999999e-06,3.4947299999999997e-06,3.4952099999999999e-06,3.49773e-06,3.49787e-06,3.4979e-06,3.4990299999999999e-06,3.4991000000000001e-06,3.501e-06,3.5036600000000002e-06,3.5040000000000002e-06,3.5040862068965515e-06,3.5045099999999999e-06,3.5055999999999999e-06,3.5059900000000001e-06,3.5076299999999997e-06,3.5088799999999999e-06,3.5097500000000002e-06,3.5101400000000003e-06,3.5108999999999997e-06,3.51091e-06,3.5111400000000004e-06,3.5123300000000002e-06,3.5123437499999999e-06,3.5141099999999998e-06,3.5145400000000002e-06,3.5150699999999996e-06,3.5151099999999999e-06,3.5155499999999997e-06,3.51576e-06,3.5160600000000003e-06,3.5162700000000001e-06,3.5190800000000002e-06,3.5201099999999998e-06,3.5201900000000003e-06,3.52036e-06,3.5204700000000004e-06,3.5205399999999998e-06,3.5206000000000002e-06,3.5213699999999999e-06,3.5215499999999998e-06,3.52156e-06,3.5228199999999997e-06,3.5235000000000002e-06,3.5237400000000001e-06,3.5243600000000003e-06,3.52521e-06,3.5259400000000002e-06,3.52633e-06,3.5265300000000004e-06,3.5266400000000001e-06,3.5274999999999997e-06,3.5279400000000004e-06,3.52831e-06,3.5285500000000003e-06,3.5287900000000001e-06,3.529e-06,3.5296800000000001e-06,3.5304000000000001e-06,3.5307099999999998e-06,3.5313700000000002e-06,3.5316271186440679e-06,3.5325099999999999e-06,3.53265e-06,3.5328399999999997e-06,3.5329399999999999e-06,3.5334199999999996e-06,3.5340500000000001e-06,3.5347799999999999e-06,3.5348999999999998e-06,3.5355925925925926e-06,3.5363000000000003e-06,3.5367100000000002e-06,3.5369299999999999e-06,3.53871e-06,3.5394500000000001e-06,3.54083e-06,3.5419700000000002e-06,3.54284e-06,3.5434799999999999e-06,3.5437462686567163e-06,3.54396e-06,3.5445499999999998e-06,3.5447499999999998e-06,3.5454e-06,3.5467000000000003e-06,3.5496699999999997e-06,3.5498000000000003e-06,3.5498899999999998e-06,3.5499000000000001e-06,3.5514399999999998e-06,3.5524599999999996e-06,3.5527300000000003e-06,3.5536299999999997e-06,3.5577900000000002e-06,3.5587400000000002e-06,3.5588493150684936e-06,3.5597800000000001e-06,3.5624899999999999e-06,3.5629100000000001e-06,3.5636700000000003e-06,3.5638800000000002e-06,3.56432e-06,3.569e-06,3.5690400000000003e-06,3.5707200000000001e-06,3.6056899999999998e-06,3.6177600000000001e-06,3.6361500000000003e-06,3.6453000000000001e-06,3.6453199999999998e-06,3.6483099999999997e-06,3.6494799999999998e-06,3.6515099999999995e-06,3.6519500000000002e-06,3.6528899999999999e-06,3.6536099999999999e-06,3.6539400000000001e-06,3.65441e-06,3.6545099999999998e-06,3.6629600000000001e-06,3.6637900000000001e-06,3.66495e-06,3.6669500000000001e-06,3.6679399999999999e-06,3.6682000000000003e-06,3.6710000000000001e-06,3.6720900000000001e-06,3.67675e-06,3.6768899999999996e-06,3.6772900000000001e-06,3.6779800000000001e-06,3.67945e-06,3.6799999999999999e-06,3.6807499999999999e-06,3.6824999999999999e-06,3.6865200000000003e-06,3.6873100000000001e-06,3.6874000000000001e-06,3.6890600000000001e-06,3.6923000000000002e-06,3.6957100000000003e-06,3.6975000000000002e-06,3.6996300000000001e-06,3.7004600000000001e-06,3.7030299999999999e-06,3.7040700000000003e-06,3.7042800000000001e-06,3.70452e-06,3.7048799999999998e-06,3.7093299999999998e-06,3.7120000000000002e-06,3.7160699999999999e-06,3.7162700000000003e-06,3.7188299999999998e-06,3.7194899999999999e-06,3.72086e-06,3.7215099999999997e-06,3.7222900000000001e-06,3.7257099999999996e-06,3.73697e-06,3.7631299999999996e-06,3.7646100000000002e-06,3.7745600000000004e-06,3.7878500000000001e-06,3.8014800000000002e-06,3.8193699999999998e-06,3.8215300000000002e-06,3.8249200000000001e-06,3.8267799999999998e-06,3.8293400000000002e-06,3.83538e-06,3.8368899999999998e-06,3.83699e-06,3.8403100000000002e-06,3.8404300000000001e-06,3.8418500000000003e-06,3.8419099999999994e-06,3.8429899999999996e-06,3.8433000000000001e-06,3.8456666666666669e-06,3.8464499999999994e-06,3.8471300000000004e-06,3.8475400000000003e-06,3.8496599999999995e-06,3.85313e-06,3.8531899999999999e-06,3.8567599999999998e-06,3.8567799999999995e-06,3.8596600000000002e-06,3.8626699999999999e-06,3.8627299999999999e-06,3.8638399999999996e-06,3.8649799999999997e-06,3.8650499999999995e-06,3.8666399999999998e-06,3.8682800000000002e-06,3.8687111111111113e-06,3.8706699999999997e-06,3.8723823529411772e-06,3.8744900000000001e-06,3.8753700000000006e-06,3.8761e-06,3.8763399999999999e-06,3.8765099999999999e-06,3.87731e-06,3.8803299999999995e-06,3.8817800000000001e-06,3.8855600000000003e-06,3.8877199999999998e-06,3.8918099999999996e-06,3.8919799999999996e-06,3.8922900000000001e-06,3.8929499999999997e-06,3.8959142857142862e-06,3.8959500000000004e-06,3.8967500000000004e-06,3.8977699999999998e-06,3.8980476190476192e-06,3.8991600000000005e-06,3.9004197530864193e-06,3.9123499999999999e-06,3.912948051948052e-06,3.91355e-06,3.9456599999999999e-06,4.0408499999999996e-06,4.0919052631578953e-06,4.1009800000000005e-06,4.1164400000000004e-06,4.1259100000000004e-06,4.1346900000000006e-06,4.1415699999999999e-06,4.14346e-06,4.1450000000000001e-06,4.1455000000000004e-06,4.1464099999999997e-06,4.1561388888888894e-06,4.15615e-06,4.1657000000000006e-06,4.1662400000000003e-06,4.1695647058823526e-06,4.1701699999999999e-06,4.1705000000000001e-06,4.1744000000000002e-06,4.1798600000000002e-06,4.1823099999999996e-06,4.1894099999999999e-06,4.1898400000000004e-06,4.1992599999999995e-06,4.1998799999999997e-06,4.2014899999999996e-06,4.2244700000000004e-06,6.1478200000000004e-06,6.6670399999999993e-06,6.7544999999999995e-06,6.7780000000000002e-06,6.8333000000000003e-06,6.8772272727272725e-06,7.7793800000000007e-06],"224":[1.2570818181818181e-05,1.2579516129032258e-05,1.2583555555555557e-05,1.2586304347826088e-05,1.2595347826086956e-05,1.2598156249999999e-05,1.2601666666666667e-05,1.2603470588235295e-05,1.2607166666666667e-05,1.260904e-05,1.2609333333333333e-05,1.26095e-05,1.2611411764705883e-05,1.2621e-05,1.2627e-05,1.2627e-05,1.2628e-05,1.2638e-05,1.2639333333333335e-05,1.26425e-05,1.2653999999999999e-05,1.2656e-05,1.2659e-05,1.2666999999999999e-05,1.2673e-05,1.2673999999999999e-05,1.2673999999999999e-05,1.2679e-05,1.2683e-05,1.2683e-05,1.2687000000000001e-05,1.2704000000000001e-05,1.2704999999999999e-05,1.2706e-05,1.2724e-05,1.2734e-05,1.2755000000000001e-05,1.2765000000000001e-05,1.2775999999999999e-05,1.2886620000000001e-05,1.289063e-05,1.2913889999999999e-05,1.2933479999999999e-05,1.29408e-05,1.294175e-05,1.295202e-05,1.2952739999999998e-05,1.295664e-05,1.2959239999999999e-05,1.2959549999999999e-05,1.2959969999999999e-05,1.2964300000000001e-05,1.2980870000000001e-05,1.298257e-05,1.299321e-05,1.2996760000000001e-05,1.3009589999999999e-05,1.3012029999999999e-05,1.3015620000000001e-05,1.3021529999999999e-05,1.3028479999999999e-05,1.3030829999999999e-05,1.303418e-05,1.3036020833333333e-05,1.3036350000000001e-05,1.3051880000000001e-05,1.307038e-05,1.3070930000000001e-05,1.307113e-05,1.307244e-05,1.3079599999999999e-05,1.308285e-05,1.308467e-05,1.308586e-05,1.309181e-05,1.309288e-05,1.3098459999999999e-05,1.3098490000000001e-05,1.3099769999999999e-05,1.3103329999999999e-05,1.3104150000000001e-05,1.310969e-05,1.3114809999999999e-05,1.311724e-05,1.3122439999999999e-05,1.3127569999999999e-05,1.3127639999999999e-05,1.312988e-05,1.3131480000000002e-05,1.3139530000000001e-05,1.3145730000000001e-05,1.315325e-05,1.315335294117647e-05,1.3158550000000001e-05,1.3159000000000001e-05,1.3161480000000001e-05,1.3167052631578947e-05,1.3169419999999999e-05,1.3173124999999999e-05,1.3173340000000001e-05,1.3173709677419355e-05,1.3176069999999999e-05,1.3178840000000001e-05,1.3179150000000001e-05,1.318193e-05,1.3182342857142857e-05,1.318611e-05,1.3186875000000001e-05,1.3186894736842105e-05,1.3189490000000001e-05,1.3189709999999999e-05,1.3190700000000001e-05,1.3192333333333332e-05,1.3192483146067414e-05,1.319299e-05,1.3193359999999999e-05,1.3193923076923077e-05,1.3195300000000001e-05,1.3195679999999998e-05,1.3199109999999999e-05,1.3202111111111111e-05,1.3202705882352941e-05,1.3203999999999999e-05,1.320425e-05,1.320713e-05,1.3211340000000001e-05,1.32142e-05,1.3219480000000001e-05,1.322346e-05,1.3223875000000001e-05,1.322869e-05,1.3232330000000001e-05,1.3233e-05,1.3233e-05,1.3234270000000001e-05,1.3236669999999999e-05,1.3239140000000001e-05,1.324031e-05,1.324148e-05,1.3246329999999999e-05,1.3246480000000001e-05,1.3247999999999999e-05,1.3249e-05,1.325e-05,1.3250200000000001e-05,1.3253092783505156e-05,1.3254269999999999e-05,1.325782e-05,1.3259e-05,1.3259e-05,1.327724e-05,1.3279800000000001e-05,1.3296119999999999e-05,1.3300259999999999e-05,1.3309000000000001e-05,1.3309750000000001e-05,1.3313870000000001e-05,1.3314e-05,1.3315999999999999e-05,1.332e-05,1.3322000000000001e-05,1.332235e-05,1.332282e-05,1.3323720000000001e-05,1.3326000000000001e-05,1.3327e-05,1.3335e-05,1.3336070000000001e-05,1.3341930000000001e-05,1.3354129999999998e-05,1.3358e-05,1.336105e-05,1.3362059999999999e-05,1.3366e-05,1.3366999999999999e-05,1.3370039999999998e-05,1.3372810000000001e-05,1.3373999999999999e-05,1.3387659999999999e-05,1.3393e-05,1.3393100000000001e-05,1.339576e-05,1.342951e-05,1.344308e-05,1.3446e-05,1.345106e-05,1.3470719999999999e-05,1.3478439999999999e-05,1.351342e-05,1.3517e-05,1.3520310000000001e-05,1.3532830000000001e-05,1.35329e-05,1.354594e-05,1.356285135135135e-05,1.357161e-05,1.357186e-05,1.3574329999999998e-05,1.3576339999999998e-05,1.3601360000000001e-05,1.360155e-05,1.3612279999999999e-05,1.3622919999999999e-05,1.36309e-05,1.3651959183673469e-05,1.365436e-05,1.365942e-05,1.3661949999999999e-05,1.3666340000000001e-05,1.3694689999999999e-05,1.3695899999999999e-05,1.3698619999999999e-05,1.3729720000000001e-05,1.3769609999999998e-05,1.37721e-05,1.3779379999999999e-05,1.3795124999999999e-05,1.380266e-05,1.3802890000000001e-05,1.380734e-05,1.381053e-05,1.381203e-05,1.3813189999999999e-05,1.3814179999999999e-05,1.381443e-05,1.3815120000000001e-05,1.3815679999999999e-05,1.3818319999999999e-05,1.3824400000000001e-05,1.3827670000000001e-05,1.382852e-05,1.382932e-05,1.383e-05,1.3830430000000001e-05,1.383502e-05,1.3836394736842106e-05,1.383652e-05,1.38369e-05,1.3839042553191489e-05,1.383914e-05,1.3841830000000001e-05,1.384235e-05,1.384354e-05,1.3844669999999999e-05,1.384655e-05,1.384698e-05,1.385456e-05,1.3860500000000001e-05,1.3861590000000001e-05,1.3870097560975611e-05,1.3892710000000001e-05,1.3893340000000001e-05,1.390476e-05,1.3916e-05,1.3944000000000001e-05,1.3949889999999999e-05,1.4001e-05,1.4212779999999999e-05,1.429993e-05,1.469523e-05,1.490432e-05,1.490661e-05,1.4910719999999999e-05,1.4912709999999999e-05,1.491776e-05,1.4924429999999999e-05,1.492534e-05,1.4927090000000001e-05,1.4936439999999999e-05,1.493887e-05,1.494333e-05,1.494558e-05,1.495408e-05,1.5041999999999999e-05,2.3686e-05,2.5378e-05,2.5661220000000002e-05,2.5743000000000001e-05,2.6906e-05,2.7243229999999999e-05,2.797066666666667e-05]}}]} diff --git a/Carthage/Checkouts/swift-collections/Documentation/Deque.md b/Carthage/Checkouts/swift-collections/Documentation/Deque.md new file mode 100644 index 00000000..e86ea793 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Deque.md @@ -0,0 +1,93 @@ +# Deque + +A collection implementing a double-ended queue. + +## Declaration + +```swift +import DequeModule + +@frozen struct Deque +``` + +## Overview + +`Deque` (pronounced "deck") implements an ordered random-access +collection that supports efficient insertions and removals from both +ends. + +```swift +var colors: Deque = ["red", "yellow", "blue"] +``` + +Deques implement the same indexing semantics as arrays: they use integer +indices, and the first element of a nonempty deque is always at index zero. +Like arrays, deques conform to `RangeReplaceableCollection`, +`MutableCollection` and `RandomAccessCollection`, providing a familiar +interface for manipulating their contents: + + +```swift +print(colors[1]) // "yellow" +print(colors[3]) // Runtime error: Index out of range + +colors.insert("green", at: 1) +// ["red", "green", "yellow", "blue"] + +colors.remove(at: 2) // "yellow" +// ["red", "green", "blue"] +``` + +Like all variable-size collections on the standard library, `Deque` +implements value semantics: each deque has an independent value that +includes the values of its elements. Modifying one deque does not affect any +others: + +```swift +var copy = deque +copy[1] = "violet" +print(copy) // ["red", "violet", "blue"] +print(deque) // ["red", "green", "blue"] +``` + +This is implemented with the copy-on-write optimization. Multiple copies of +a deque share the same underlying storage until you modify one of the +copies. When that happens, the deque being modified replaces its storage +with a uniquely owned copy of itself, which is then modified in place. + +`Deque` stores its elements in a circular buffer, which allows efficient +insertions and removals at both ends of the collection; however, this comes +at the cost of potentially discontiguous storage. In contrast, `Array` is +(usually) backed by a contiguous buffer, where new data can be efficiently +appended to the end, but inserting at the front is relatively slow, as +existing elements need to be shifted to make room. + +This difference in implementation means that while the interface of a deque +is very similar to an array, the operations have different performance +characteristics. Mutations near the front are expected to be significantly +faster in deques, but arrays may measure slightly faster for general +random-access lookups. + +Deques provide a handful of additional operations that make it easier to +insert and remove elements at the front. This includes queue operations such +as `popFirst` and `prepend`, including the ability to directly prepend a +sequence of elements: + +```swift +colors.append("green") +colors.prepend("orange") +// colors: ["orange", "red", "blue", "yellow", "green"] + +colors.popLast() // "green" +colors.popFirst() // "orange" +// colors: ["red", "blue", "yellow"] + +colors.prepend(contentsOf: ["purple", "teal"]) +// colors: ["purple", "teal", "red", "blue", "yellow"] +``` + +Unlike arrays, deques do not currently provide direct unsafe access to their +underlying storage. They also lack a `capacity` property -- the size of the +storage buffer at any given point is an unstable implementation detail that +should not affect application logic. (However, deques do provide a +`reserveCapacity` method.) diff --git a/Carthage/Checkouts/swift-collections/Documentation/Internals/README.md b/Carthage/Checkouts/swift-collections/Documentation/Internals/README.md new file mode 100644 index 00000000..a5594c39 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Internals/README.md @@ -0,0 +1,119 @@ +# Package Internals + +## Benchmarks + +The package includes an extensive library of benchmarks in the [Benchmarks](./Benchmarks) directory, driven by a command-line executable target, called `benchmark`. These benchmarks, the executable target, and its command-line interface are not considered part of the public interface of the package. As such, new releases may break them without any special ceremony. We do expect the benchmarks will stabilize with time. + +For more information on our benchmarking tool, please see its dedicated package, [**Swift Collections Benchmark**][swift-collections-benchmark]. + +[swift-collections-benchmark]: https://github.com/apple/swift-collections-benchmark + +## Test Support Library + +The package comes with a rich test support library in the [Sources/_CollectionsTestSupport](./Sources/_CollectionsTestSupport) directory. These were loosely adapted from the contents of the `StdlibUnittest*` modules in the [Swift compiler repository](https://github.com/apple/swift/tree/main/stdlib/private), with some custom additions. + +These components would likely be of interest to the wider Swift community, but they aren't yet stable enough (or documented enough) to publish them. Accordingly, these testing helpers are currently considered implementation details of this package, and are subject to change at whim. + +The test support library currently provides the following functionality: + +- [`AssertionContexts`](./Sources/CollectionsTestSupport/AssertionContexts): Custom test assertions with support for keeping track of nested context information, including stopping execution when the current context matches a particular value. (Useful for debugging combinatorial tests.) + +

+ Click here for a short demonstration + + ```swift + import XCTest + import _CollectionsTestSupport + + final class DequeTests: CollectionTestCase { + func test_demo() { + let values = [0, 10, 20, 30, 42, 50, 60] + for i in values.indices { + context.withTrace("i: \(i)") { + expectEqual(values[i], 10 * i) + } + } + } + } + ``` + + ``` + DemoTests.swift:21: error: -[DemoTests.DemoTests test_demo] : XCTAssertEqual failed: ("42") is not equal to ("40") - + Trace: + - i: 4 + ``` + + To debug issues, copy the trace message into a `context.failIfTraceMatches(_:)` invocation and set a breakpoint on test failures. + + ```swift + let values = [0, 10, 20, 30, 42, 50, 60] + for i in values.indices { + context.withTrace("i: \(i)") { + // This will report a test failure before executing the `i == 4` case, + // letting us investigate what's going on. + context.failIfTraceMatches(""" + Trace: + - i: 4 + """) + expectEqual(values[i], 10 * i) + } + } + ``` + +
+ +- [`Combinatorics`](./Sources/CollectionsTestSupport/AssertionContexts/Combinatorics.swift): Basic support for exhaustive combinatorial testing. This allows us to easily verify that a collection operation works correctly on all possible instances up to a certain size, including behavioral variations such as unique/shared storage. + +
+ Click here for an example + + ```swift + func test_popFirst() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents[...].popFirst() + let actual = deque.popFirst() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + ``` + +
+ +- [`ConformanceCheckers`](./Sources/CollectionsTestSupport/ConformanceCheckers): A set of generic, semi-automated protocol conformance tests for some Standard Library protocols. These can be used to easily validate the custom protocol conformances provided by this package. These checks aren't (can't be) complete -- but when used correctly, they are able to detect most accidental mistakes. + + We currently have conformance checkers for the following protocols: + + - [`Sequence`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckSequence.swift) + - [`Collection`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckCollection.swift) + - [`BidirectionalCollection`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckBidirectionalCollection.swift) + - [`Equatable`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckEquatable.swift) + - [`Hashable`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckHashable.swift) + - [`Comparable`](./Sources/CollectionsTestSupport/ConformanceCheckers/CheckComparable.swift) + +- [`MinimalTypes`](./Sources/CollectionsTestSupport/MinimalTypes): Minimally conforming implementations for standard protocols. These types conform to various standard protocols by implementing the requirements in as narrow-minded way as possible -- sometimes going to extreme lengths to, say, implement collection index invalidation logic in the most unhelpful way possible. + + - [`MinimalSequence`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalSequence.swift) + - [`MinimalCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalCollection.swift) + - [`MinimalBidirectionalCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalBidirectionalCollection.swift) + - [`MinimalRandomAccessCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalRandomAccessCollection.swift) + - [`MinimalMutableRandomAccessCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalMutableRandomAccessCollection.swift) + - [`MinimalRangeReplaceableRandomAccessCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalRangeReplaceableRandomAccessCollection.swift) + - [`MinimalMutableRangeReplaceableRandomAccessCollection`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalMutableRangeReplaceableRandomAccessCollection.swift) + - [`MinimalIterator`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalIterator.swift) + - [`MinimalIndex`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalIndex.swift) + - [`MinimalEncoder`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalEncoder.swift) + - [`MinimalDecoder`](./Sources/CollectionsTestSupport/MinimalTypes/MinimalDecoder.swift) + +- [`Utilities`](./Sources/CollectionsTestSupport/Utilities): Utility types. Wrapper types for boxed values, a simple deterministic random number generator, and a lifetime tracker for catching simple memory management issues such as memory leaks. (The [Address Sanitizer][asan] can be used to catch more serious problems.) + +[asan]: https://developer.apple.com/documentation/xcode/diagnosing_memory_thread_and_crash_issues_early?language=objc + + diff --git a/Carthage/Checkouts/swift-collections/Documentation/Internals/ReleaseChecklist.md b/Carthage/Checkouts/swift-collections/Documentation/Internals/ReleaseChecklist.md new file mode 100644 index 00000000..cee53107 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/Internals/ReleaseChecklist.md @@ -0,0 +1,58 @@ +# Swift Collections Release Checklist + +1. Create a milestone for the new version (if one doesn't exist yet). +2. Collect all issues & PRs that are going to be included in the new tag under the new milestone. +3. If the new release moves code between source files or adds new API that has the potential to cause mutual dependencies between source files, then run the [shuffle-sources.sh](./Utils/shuffle-sources.sh) script for at least a few hundred iterations on the affected module to help catch [nondeterministic build issues with the compiler's MergeModules phase](https://github.com/apple/swift-collections/issues/7). (Note: it's best to do this on a fresh clone. We can stop doing this when MergeModules is no longer used to build debug configurations in SPM.) +4. Run the [full tests script](./Utils/run-full-tests.sh) on the commit that you intend to tag, with all supported (major) toolchain releases, and on as many supported platforms as are practical. (At minimum, run the script with the latest stable toolchain releases on macOS and one Linux distribution.) + The script exercises a tiny subset of the environments this package can be built and run on. + + The full matrix includes the following axes: + + - Toolchains + - All major Swift releases supported by the package, plus a recent toolchain snapshot from swift.org. + E.g., for the Swift Collection 1.0 release, this included: + - Swift 5.3 (from swift.org and Xcode 12) + - Swift 5.4 (from swift.org and Xcode 12.5) + - Prerelease builds of Swift 5.5 (using the latest swift.org snapshot and the latest Xcode 13 beta) + - The latest `main` development snapshot from swift.org. + - Platforms & architectures + - macOS (using SPM, xcodebuild, cmake) + - Intel, Apple Silicon + - Deploying on any macOS release starting from macOS 10.10 + - Mac Catalyst (using xcodebuild) + - Intel, Apple Silicon + - Deploying on any macOS release starting from macOS 10.15 + - iOS (using xcodebuild) + - Device (arm64, armv7), simulator (x86_64, i386, arm64) + - Deploying on any iOS release starting from iOS 8 + - watchOS (using xcodebuild) + - Device (arm64_32, arm7k), simulator (x86_64, i386, arm64) + - Deploying on any watchOS release starting from watchOS 2 + - tvOS (using xcodebuild) + - Device (arm64), simulator (x86_64, arm64) + - Deploying on any tvOS 9 release starting from tvOS 10 + - Linux (using SPM, cmake) + - All supported distributions + - Build systems + - Swift Package Manager + - xcodebuild + - cmake & ninja (note: this support isn't source stable) + - Configurations + - Debug + - Release + - Build settings + - `COLLECTIONS_INTERNAL_CHECKS` + - `COLLECTIONS_DETERMINISTIC_HASHING` + - `BUILD_LIBRARY_FOR_DISTRIBUTION=YES` with xcodebuild (this is unsupported, but why break it) + - `-warnings-as-errors` + - Any combination of the above + - Components + - The swift-collections package + - The private `benchmark` executable under `Benchmarks/` + +5. Submit PRs to fix any issues that pop up, then try again until no issues are found. +6. Update the README if necessary. +7. Draft a new release on GitHub, following the template established by [previous releases](https://github.com/apple/swift-collections/releases/tag/0.0.7). +8. As a final chance to catch issues, generate a diff between the last tagged release and the release candidate commit. Review it in case we landed something that isn't appropriate to include; watch out for potential issues such as source compatibility problems, or new public API without adequate documentation. +9. Double check that the new tag will have the right version number and it will be on the correct branch. +10. Hit publish. diff --git a/Carthage/Checkouts/swift-collections/Documentation/OrderedDictionary.md b/Carthage/Checkouts/swift-collections/Documentation/OrderedDictionary.md new file mode 100644 index 00000000..834613e5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/OrderedDictionary.md @@ -0,0 +1,224 @@ +# `OrderedDictionary` + +An ordered collection of key-value pairs. + +## Declaration + +```swift +import OrderedCollections + +@frozen struct OrderedDictionary +``` + +## Overview + +Like the standard `Dictionary`, ordered dictionaries use a hash table to +ensure that no two entries have the same keys, and to efficiently look up +values corresponding to specific keys. However, like an `Array` (and +unlike `Dictionary`), ordered dictionaries maintain their elements in a +particular user-specified order, and they support efficient random-access +traversal of their entries. + +`OrderedDictionary` is a useful alternative to `Dictionary` when the order +of elements is important, or when you need to be able to efficiently access +elements at various positions within the collection. + +You can create an ordered dictionary with any key type that conforms to the +`Hashable` protocol. + +```swift +let responses: OrderedDictionary = [ + 200: "OK", + 403: "Access forbidden", + 404: "File not found", + 500: "Internal server error", +] +``` + +### Equality of Ordered Dictionaries + +Two ordered dictionaries are considered equal if they contain the same +elements, and *in the same order*. This matches the concept of equality of +an `Array`, and it is different from the unordered `Dictionary`. + +```swift +let a: OrderedDictionary = [1: "one", 2: "two"] +let b: OrderedDictionary = [2: "two", 1: "one"] +a == b // false +b.swapAt(0, 1) // `b` now has value [1: "one", 2: "two"] +a == b // true +``` + +(`OrderedDictionary` only conforms to `Equatable` when its `Value` is +equatable.) + +### Dictionary Operations + +`OrderedDictionary` provides many of the same operations as `Dictionary`. + +For example, you can look up and add/remove values using the familiar +key-based subscript, returning an optional value: + +```swift +var dictionary: OrderedDictionary = [:] +dictionary["one"] = 1 +dictionary["two"] = 2 +dictionary["three"] // nil +// dictionary is now ["one": 1, "two": 2] +``` + +If a new entry is added using the subscript setter, it gets appended to the +end of the dictionary. (So that by default, the dictionary contains its +elements in the order they were originally inserted.) + +`OrderedDictionary` also implements the variant of this subscript that takes +a default value. Like with `Dictionary`, this is useful when you want to +perform in-place mutations on values: + +```swift +let text = "short string" +var counts: OrderedDictionary = [:] +for character in text { + counts[character, default: 0] += 1 +} +// counts is ["s": 2, "h": 1, "o": 1, +// "r": 2, "t": 2, " ": 1, +// "i": 1, "n": 1, "g": 1] +``` + +If the `Value` type implements reference semantics, or when you need to +perform a series of individual mutations on the values, the closure-based +`updateValue(forKey:default:with:)` method provides an easier-to-use +alternative to the defaulted key-based subscript. + +```swift +let text = "short string" +var counts: OrderedDictionary = [:] +for character in text { + counts.updateValue(forKey: character, default: 0) { value in + value += 1 + } +} +// Same result as before +``` + +(This isn't currently available on the regular `Dictionary`.) + +The `Dictionary` type's original `updateValue(_:forKey:)` method is also +available, and so is `index(forKey:)`, grouping/uniquing initializers +(`init(uniqueKeysWithValues:)`, `init(_:uniquingKeysWith:)`, +`init(grouping:by:)`), methods for merging one dictionary with another +(`merge`, `merging`), filtering dictionary entries (`filter(_:)`), +transforming values (`mapValues(_:)`), and a combination of these two +(`compactMapValues(_:)`). + +### Sequence and Collection Operations + +Ordered dictionaries use integer indices representing offsets from the +beginning of the collection. However, to avoid ambiguity between key-based +and indexing subscripts, `OrderedDictionary` doesn't directly conform to +`Collection`. Instead, it only conforms to `Sequence`, and provides a +random-access collection view over its key-value pairs: + +```swift +responses[0] // `nil` (key-based subscript) +responses.elements[0] // `(200, "OK")` (index-based subscript) +``` + +Because ordered dictionaries need to maintain unique keys, neither +`OrderedDictionary` nor its `elements` view can conform to the full +`MutableCollection` or `RangeReplaceableCollection` protocols. However, they +are able to partially implement requirements: they support mutations +that merely change the order of elements, or just remove a subset of +existing members: + +```swift +// Permutation operations from MutableCollection: +func swapAt(_ i: Index, _ j: Index) +func partition(by predicate: (Element) throws -> Bool) -> rethrows Index +func sort() where Element: Comparable +func sort(by predicate: (Element, Element) throws -> Bool) rethrows +func shuffle() +func shuffle(using generator: inout T) + +// Removal operations from RangeReplaceableCollection: +func removeAll(keepingCapacity: Bool = false) +func remove(at index: Index) -> Element +func removeSubrange(_ bounds: Range) +func removeLast() -> Element +func removeLast(_ n: Int) +func removeFirst() -> Element +func removeFirst(_ n: Int) +func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows +``` + +`OrderedDictionary` also implements `reserveCapacity(_)` from +`RangeReplaceableCollection`, to allow for efficient insertion of a known +number of elements. (However, unlike `Array` and `Dictionary`, +`OrderedDictionary` does not provide a `capacity` property.) + +### Keys and Values Views + +Like the standard `Dictionary`, `OrderedDictionary` provides `keys` and +`values` properties that provide lightweight views into the corresponding +parts of the dictionary. + +The `keys` collection is of type `OrderedSet`, containing all the keys +in the original dictionary. + +```swift +let d: OrderedDictionary = [2: "two", 1: "one", 0: "zero"] +d.keys // [2, 1, 0] as OrderedSet +``` + +The `keys` property is read-only, so you cannot mutate the dictionary +through it. However, it returns an ordinary ordered set value, which can be +copied out and then mutated if desired. (Such mutations won't affect the +original dictionary value.) + +The `values` collection is a mutable random-access collection of the values +in the dictionary: + +```swift +d.values // "two", "one", "zero" +d.values[2] = "nada" +// `d` is now [2: "two", 1: "one", 0: "nada"] +d.values.sort() +// `d` is now [2: "nada", 1: "one", 0: "two"] +``` + +Both views store their contents in regular `Array` values, accessible +through their `elements` property. + +## Performance + +Like the standard `Dictionary` type, the performance of hashing operations +in `OrderedDictionary` is highly sensitive to the quality of hashing +implemented by the `Key` type. Failing to correctly implement hashing can +easily lead to unacceptable performance, with the severity of the effect +increasing with the size of the hash table. + +In particular, if a certain set of keys all produce the same hash value, +then hash table lookups regress to searching an element in an unsorted +array, i.e., a linear operation. To ensure hashed collection types exhibit +their target performance, it is important to ensure that such collisions +cannot be induced merely by adding a particular list of keys to the +dictionary. + +The easiest way to achieve this is to make sure `Key` implements hashing +following `Hashable`'s documented best practices. The conformance must +implement the `hash(into:)` requirement, and every bit of information that +is compared in `==` needs to be combined into the supplied `Hasher` value. +When used correctly, `Hasher` produces high-quality, randomly seeded hash +values that prevent repeatable hash collisions. + +When `Key` correctly conforms to `Hashable`, key-based lookups in an ordered +dictionary is expected to take O(1) equality checks on average. Hash +collisions can still occur organically, so the worst-case lookup performance +is technically still O(*n*) (where *n* is the size of the dictionary); +however, long lookup chains are unlikely to occur in practice. + +## Implementation Details + +An ordered dictionary consists of an ordered set of keys, alongside a +regular `Array` value that contains their associated values. diff --git a/Carthage/Checkouts/swift-collections/Documentation/OrderedSet.md b/Carthage/Checkouts/swift-collections/Documentation/OrderedSet.md new file mode 100644 index 00000000..9786a66e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Documentation/OrderedSet.md @@ -0,0 +1,255 @@ +# OrderedSet + +An ordered collection of unique elements. + +## Declaration + +```swift +import OrderedCollections + +@frozen struct OrderedSet +``` + +## Overview + +Similar to the standard `Set`, ordered sets ensure that each element appears +only once in the collection, and they provide efficient tests for +membership. However, like `Array` (and unlike `Set`), ordered sets maintain +their elements in a particular user-specified order, and they support +efficient random-access traversal of their members. + +`OrderedSet` is a useful alternative to `Set` when the order of elements is +important, or when you need to be able to efficiently access elements at +various positions within the collection. It can also be used instead of an +`Array` when each element needs to be unique, or when you need to be able to +quickly determine if a value is a member of the collection. + +You can create an ordered set with any element type that conforms to the +`Hashable` protocol. + +```swift +let buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"] +``` + + +### Equality of Ordered Sets + +Two ordered sets are considered equal if they contain the same elements, and +*in the same order*. This matches the concept of equality of an `Array`, and +it is different from the unordered `Set`. + +```swift +let a: OrderedSet = [1, 2, 3, 4] +let b: OrderedSet = [4, 3, 2, 1] +a == b // false +b.sort() // `b` now has value [1, 2, 3, 4] +a == b // true +``` + +### Set Operations + +`OrderedSet` implements most, but not all, `SetAlgebra` requirements. In +particular, it supports the membership test `contains(_:)` as well as all +high-level set operations such as `union(_:)`, `intersection(_:)` or +`isSubset(of:)`. + +```swift +buildingMaterials.contains("glass") // false +buildingMaterials.intersection(["brick", "straw"]) // ["straw", "brick"] +``` + +Operations that return an ordered set usually preserve the ordering of +elements in their input. For example, in the case of the `intersection` call +above, the ordering of elements in the result is guaranteed to match their +order in the first input set, `buildingMaterials`. + +On the other hand, predicates such as `isSubset(of:)` tend to ignore element +ordering: + +```swift +let moreMaterials: OrderedSet = ["bricks", "glass", "sticks", "straw"] +buildingMaterials.isSubset(of: moreMaterials) // true +``` + +However, `OrderedSet` does not implement `insert(_:)` nor `update(with:)` -- +it provides its own variants for insertion that are more explicit about +where in the collection new elements gets inserted: + +```swift +func insert(_ item: Element, at index: Index) -> (inserted: Bool, index: Int) +func append(_ item: Element) -> (inserted: Bool, index: Int) +func update(at index: Int, with item: Element) -> Element +func updateOrAppend(_ item: Element) -> Element? +``` + +Additionally,`OrderedSet` has an order-sensitive definition of equality (see +above) that is incompatible with `SetAlgebra`'s documented semantic +requirements. Accordingly, `OrderedSet` does not (cannot) itself conform to +`SetAlgebra`. + +### Unordered Set View + +For cases where `SetAlgebra` conformance is desired (such as when passing an +ordered set to a function that is generic over that protocol), `OrderedSet` +provides an efficient *unordered view* of its elements that conforms to +`SetAlgebra`. The unordered view implements the same concept of equality as +the standard `Set`, ignoring element ordering. + +```swift +var a: OrderedSet = [0, 1, 2, 3] +let b: OrderedSet = [3, 2, 1, 0] +a == b // false +a.unordered == b.unordered // true + +func frobnicate(_ set: S) { ... } +frobnicate(a) // error: `OrderedSet` does not conform to `SetAlgebra` +frobnicate(a.unordered) // OK +``` + +The unordered view is mutable. Insertions into it implicitly append new +elements to the end of the collection. + +```swift +buildingMaterials.unordered.insert("glass") // => inserted: true +// buildingMaterials is now ["straw", "sticks", "brick", "glass"] +``` + +Accessing the unordered view is an efficient operation, with constant +(minimal) overhead. Direct mutations of the unordered view (such as the +insertion above) are executed in place when possible. However, as usual with +copy-on-write collections, if you make a copy of the view (such as by +extracting its value into a named variable), the resulting values will share +the same underlying storage, so mutations of either will incur a copy of the +whole set. + +### Sequence and Collection Operations + +Ordered sets are random-access collections. Members are assigned integer +indices, with the first element always being at index `0`: + +```swift +let buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"] +buildingMaterials[1] // "sticks" +buildingMaterials.firstIndex(of: "bricks") // 2 + +for i in 0 ..< buildingMaterials.count { + print("Little piggie #\(i) built a house of \(buildingMaterials[i])") +} +// Little piggie #0 built a house of straw +// Little piggie #1 built a house of sticks +// Little piggie #2 built a house of bricks +``` + +Because `OrderedSet` needs to keep its members unique, it cannot conform to +the full `MutableCollection` or `RangeReplaceableCollection` protocols. +Operations such as `MutableCollection`'s subscript setter or +`RangeReplaceableCollection`'s `replaceSubrange` assume the ability to +insert/replace arbitrary elements in the collection, but allowing that could +lead to duplicate values. + +However, `OrderedSet` is able to partially implement these two protocols; +namely, there is no issue with mutation operations that merely change the +order of elements, or just remove some subset of existing members: + +```swift +// Permutation operations from MutableCollection: +func swapAt(_ i: Int, _ j: Int) +func partition(by predicate: (Element) throws -> Bool) -> rethrows Int +func sort() where Element: Comparable +func sort(by predicate: (Element, Element) throws -> Bool) rethrows +func shuffle() +func shuffle(using generator: inout T) +func reverse() + +// Removal operations from RangeReplaceableCollection: +func removeAll(keepingCapacity: Bool = false) +func remove(at index: Int) -> Element +func removeSubrange(_ bounds: Range) +func removeLast() -> Element +func removeLast(_ n: Int) +func removeFirst() -> Element +func removeFirst(_ n: Int) +func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows +``` + +`OrderedSet` also implements `reserveCapacity(_)` from +`RangeReplaceableCollection`, to allow for efficient insertion of a known +number of elements. (However, unlike `Array` and `Set`, `OrderedSet` does +not provide a `capacity` property.) + +### Accessing The Contents of an Ordered Set as an Array + +In cases where you need to pass the contents of an ordered set to a function +that only takes an array value or (or something that's generic over +`RangeReplaceableCollection` or `MutableCollection`), then the best option +is usually to directly extract the members of the `OrderedSet` as an `Array` +value using its `elements` property. `OrderedSet` uses a standard array +value for element storage, so extracting the array value has minimal +overhead. + +```swift +func pickyFunction(_ items: Array) + +var set: OrderedSet = [0, 1, 2, 3] +pickyFunction(set) // error +pickyFunction(set.elements) // OK +``` + +It is also possible to mutate the set by updating the value of the +`elements` property. This guarantees that direct mutations happen in place +when possible (i.e., without spurious copy-on-write copies). + +However, the set needs to ensure the uniqueness of its members, so every +update to `elements` includes a postprocessing step to detect and remove +duplicates over the entire array. This can be slower than doing the +equivalent updates with direct `OrderedSet` operations, so updating +`elements` is best used in cases where direct implementations aren't +available -- for example, when you need to call a `MutableCollection` +algorithm that isn't directly implemented by `OrderedSet` itself. + +### Performance + +Like the standard `Set` type, the performance of hashing operations in +`OrderedSet` is highly sensitive to the quality of hashing implemented by +the `Element` type. Failing to correctly implement hashing can easily lead +to unacceptable performance, with the severity of the effect increasing with +the size of the hash table. + +In particular, if a certain set of elements all produce the same hash value, +then hash table lookups regress to searching an element in an unsorted +array, i.e., a linear operation. To ensure hashed collection types exhibit +their target performance, it is important to ensure that such collisions +cannot be induced merely by adding a particular list of members to the set. + +The easiest way to achieve this is to make sure `Element` implements hashing +following `Hashable`'s documented best practices. The conformance must +implement the `hash(into:)` requirement, and every bit of information that +is compared in `==` needs to be combined into the supplied `Hasher` value. +When used correctly, `Hasher` produces high-quality, randomly seeded hash +values that prevent repeatable hash collisions. + +When `Element` implements `Hashable` correctly, testing for membership in an +ordered set is expected to take O(1) equality checks on average. Hash +collisions can still occur organically, so the worst-case lookup performance +is technically still O(*n*) (where *n* is the size of the set); however, +long lookup chains are unlikely to occur in practice. + +### Implementation Details + +An `OrderedSet` stores its members in a regular `Array` value (exposed by +the `elements` property). It also maintains a standalone hash table +containing array indices alongside the array; this is used to implement fast +membership tests. The size of the array is limited by the capacity of the +corresponding hash table, so indices stored inside the hash table can be +encoded into fewer bits than a standard `Int` value, leading to a storage +representation that can often be more compact than that of `Set` itself. + +Inserting or removing a single member (or a range of members) needs to +perform the corresponding operation in the storage array, in addition to +renumbering any subsequent members in the hash table. Therefore, these +operations are expected to have performance characteristics similar to an +`Array`: inserting or removing an element to the end of an ordered set is +expected to execute in O(1) operations, while they are expected to take +linear time at the front (or in the middle) of the set. (Note that this is +different to the standard `Set`, where insertions and removals are expected +to take amortized O(1) time.) diff --git a/Carthage/Checkouts/swift-collections/LICENSE.txt b/Carthage/Checkouts/swift-collections/LICENSE.txt new file mode 100644 index 00000000..61b0c781 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/LICENSE.txt @@ -0,0 +1,211 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + +## Runtime Library Exception to the Apache 2.0 License: ## + + + As an exception, if you use this Software to compile your source code and + portions of this Software are embedded into the binary product as a result, + you may redistribute such product without providing attribution as would + otherwise be required by Sections 4(a), 4(b) and 4(d) of the License. diff --git a/Carthage/Checkouts/swift-collections/Package.swift b/Carthage/Checkouts/swift-collections/Package.swift new file mode 100644 index 00000000..52ecce53 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Package.swift @@ -0,0 +1,105 @@ +// swift-tools-version:5.3 +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import PackageDescription + +// This package recognizes the conditional compilation flags listed below. +// To use enable them, uncomment the corresponding lines or define them +// from the package manager command line: +// +// swift build -Xswiftc -DCOLLECTIONS_INTERNAL_CHECKS +var settings: [SwiftSetting]? = [ + + // Enables internal consistency checks at the end of initializers and + // mutating operations. This can have very significant overhead, so enabling + // this setting invalidates all documented performance guarantees. + // + // This is mostly useful while debugging an issue with the implementation of + // the hash table itself. This setting should never be enabled in production + // code. +// .define("COLLECTIONS_INTERNAL_CHECKS"), + + // Hashing collections provided by this package usually seed their hash + // function with the address of the memory location of their storage, + // to prevent some common hash table merge/copy operations from regressing to + // quadratic behavior. This setting turns off this mechanism, seeding + // the hash function with the table's size instead. + // + // When used in conjunction with the SWIFT_DETERMINISTIC_HASHING environment + // variable, this enables reproducible hashing behavior. + // + // This is mostly useful while debugging an issue with the implementation of + // the hash table itself. This setting should never be enabled in production + // code. +// .define("COLLECTIONS_DETERMINISTIC_HASHING"), + +] + +// Prevent SPM 5.3 from throwing an error on empty settings arrays. +// (This has been fixed in 5.4.) +if settings?.isEmpty == true { settings = nil } + +let package = Package( + name: "swift-collections", + products: [ + .library(name: "Collections", targets: ["Collections"]), + .library(name: "DequeModule", targets: ["DequeModule"]), + .library(name: "OrderedCollections", targets: ["OrderedCollections"]), + ], + targets: [ + .target( + name: "Collections", + dependencies: [ + "DequeModule", + "OrderedCollections", + ], + path: "Sources/Collections", + exclude: ["CMakeLists.txt"], + swiftSettings: settings), + + // Testing support module + .target( + name: "_CollectionsTestSupport", + dependencies: [], + swiftSettings: settings, + linkerSettings: [ + .linkedFramework( + "XCTest", + .when(platforms: [.macOS, .iOS, .watchOS, .tvOS])), + ] + ), + .testTarget( + name: "CollectionsTestSupportTests", + dependencies: ["_CollectionsTestSupport"], + swiftSettings: settings), + + // Deque + .target( + name: "DequeModule", + exclude: ["CMakeLists.txt"], + swiftSettings: settings), + .testTarget( + name: "DequeTests", + dependencies: ["DequeModule", "_CollectionsTestSupport"], + swiftSettings: settings), + + // OrderedSet, OrderedDictionary + .target( + name: "OrderedCollections", + exclude: ["CMakeLists.txt"], + swiftSettings: settings), + .testTarget( + name: "OrderedCollectionsTests", + dependencies: ["OrderedCollections", "_CollectionsTestSupport"], + swiftSettings: settings), + ] +) diff --git a/Carthage/Checkouts/swift-collections/README.md b/Carthage/Checkouts/swift-collections/README.md new file mode 100644 index 00000000..0353cd5c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/README.md @@ -0,0 +1,137 @@ +# Swift Collections + +**Swift Collections** is an open-source package of data structure implementations for the Swift programming language. + +Read more about the package, and the intent behind it, in the [announcement on swift.org][announcement]. + +[announcement]: https://swift.org/blog/swift-collections + +## Contents + +The package currently provides the following implementations: + +- [`Deque`][Deque], a double-ended queue backed by a ring buffer. Deques are range-replaceable, mutable, random-access collections. + +- [`OrderedSet`][OrderedSet], a variant of the standard `Set` where the order of items is well-defined and items can be arbitrarily reordered. Uses a `ContiguousArray` as its backing store, augmented by a separate hash table of bit packed offsets into it. + +- [`OrderedDictionary`][OrderedDictionary], an ordered variant of the standard `Dictionary`, providing similar benefits. + +[Deque]: Documentation/Deque.md +[OrderedSet]: Documentation/OrderedSet.md +[OrderedDictionary]: Documentation/OrderedDictionary.md + +Swift Collections uses the same modularization approach as [**Swift Numerics**](https://github.com/apple/swift-numerics): it provides a standalone module for each thematic group of data structures it implements. For instance, if you only need a double-ended queue type, you can pull in only that by importing `DequeModule`. `OrderedSet` and `OrderedDictionary` share much of the same underlying implementation, so they are provided by a single module, called `OrderedCollections`. However, there is also a top-level `Collections` module that gives you every collection type with a single import statement: + +``` swift +import Collections + +var deque: Deque = ["Ted", "Rebecca"] +deque.prepend("Keeley") +deque.append("Nathan") +print(deque) // ["Keeley", "Ted", "Rebecca", "Nathan"] +``` + +## Project Status + +The Swift Collections package is source stable. The version numbers follow [Semantic Versioning][semver] -- source breaking changes to public API can only land in a new major version. + +[semver]: https://semver.org + +The public API of version 1.0 of the `swift-collections` package consists of non-underscored declarations that are marked `public` in the `Collections`, `DequeModule` and `OrderedCollections` modules. + +Interfaces that aren't part of the public API may continue to change in any release, including patch releases. +If you have a use case that requires using underscored APIs, please [submit a Feature Request][enhancement] describing it! We'd like the public interface to be as useful as possible -- although preferably without compromising safety or limiting future evolution. + +By "underscored declarations" we mean declarations that have a leading underscore anywhere in their fully qualified name. For instance, here are some names that wouldn't be considered part of the public API, even if they were technically marked public: + +- `FooModule.Bar._someMember(value:)` (underscored member) +- `FooModule._Bar.someMember` (underscored type) +- `_FooModule.Bar` (underscored module) +- `FooModule.Bar.init(_value:)` (underscored initializer) + +Note that contents of the `Tests`, `Utils` and `Benchmarks` subdirectories aren't public API. We don't make any source compatibility promises about them -- they may change at whim, and code may be removed in any new release. Do not rely on anything about them. + +Future minor versions of the package may update these rules as needed. + +We'd like this package to quickly embrace Swift language and toolchain improvements that are relevant to its mandate. Accordingly, from time to time, we expect that new versions of this package will require clients to upgrade to a more recent Swift toolchain release. (This allows the package to make use of new language/stdlib features, build on compiler bug fixes, and adopt new package manager functionality as soon as they are available.) Requiring a new Swift release will only need a minor version bump. + +## Using **Swift Collections** in your project + +To use this package in a SwiftPM project, you need to set it up as a package dependency: + +```swift +// swift-tools-version:5.6 +import PackageDescription + +let package = Package( + name: "MyPackage", + dependencies: [ + .package( + url: "https://github.com/apple/swift-collections.git", + .upToNextMajor(from: "1.0.3") // or `.upToNextMinor + ) + ], + targets: [ + .target( + name: "MyTarget", + dependencies: [ + .product(name: "Collections", package: "swift-collections") + ] + ) + ] +) +``` + +## Contributing to Swift Collections + +We have a dedicated [Swift Collections Forum][forum] where people can ask and answer questions on how to use or work on this package. It's also a great place to discuss its evolution. + +[forum]: https://forums.swift.org/c/related-projects/collections + +If you find something that looks like a bug, please open a [Bug Report][bugreport]! Fill out as many details as you can. + +### Working on the package + +We have some basic [documentation on package internals](./Documentation/Development/Internals/) that will help you get started. + +By submitting a pull request, you represent that you have the right to license your contribution to Apple and the community, and agree by submitting the patch that your contributions are licensed under the [Swift License](https://swift.org/LICENSE.txt), a copy of which is [provided in this repository](LICENSE.txt). + +#### Fixing a bug or making a small improvement + +1. [Submit a PR][PR] with your change. If there is an [existing issue][issues] for the bug you're fixing, please include a reference to it. +2. Make sure to add tests covering whatever changes you are making. + +[PR]: https://github.com/apple/swift-collections/compare +[issues]: https://github.com/apple/swift-collections/issues + +[bugreport]: https://github.com/apple/swift-collections/issues/new?assignees=&labels=bug&template=BUG_REPORT.md + +#### Proposing a small enhancement + +1. Raise a [Feature Request][enhancement]. Discuss why it would be important to implement it. +2. Submit a PR with your implementation, participate in the review discussion. +3. When there is a consensus that the feature is desirable, and the implementation works well, it is fully tested and documented, then it will be merged. +4. Rejoice! + +[enhancement]: https://github.com/apple/swift-collections/issues/new?assignees=&labels=enhancement&template=FEATURE_REQUEST.md + +#### Proposing the addition of a new data structure + +1. Start a topic on the [forum], explaining why you believe it would be important to implement the data structure. This way we can figure out if it would be right for the package, discuss implementation strategies, and plan to allocate capacity to help. +2. When maintainers agreed to your implementation plan, start work on it, and submit a PR with your implementation as soon as you have something that's ready to show! We'd love to get involved as early as you like. +3. Participate in the review discussion, and adapt the code accordingly. Sometimes we may need to go through several revisions! This is fine -- it makes the end result that much better. +3. When there is a consensus that the feature is ready, and the implementation is fully tested and documented, the PR will be merged by a maintainer. +4. Celebrate! You've achieved something great! + +### Code of Conduct + +Like all Swift.org projects, we would like the Swift Collections project to foster a diverse and friendly community. We expect contributors to adhere to the [Swift.org Code of Conduct](https://swift.org/code-of-conduct/). A copy of this document is [available in this repository][coc]. + +[coc]: CODE_OF_CONDUCT.md + +### Contact information + +The current code owner of this package is Karoy Lorentey ([@lorentey](https://github.com/lorentey)). You can contact him [on the Swift forums](https://forums.swift.org/u/lorentey/summary), or by writing an email to klorentey at apple dot com. (Please keep it related to this project.) + +In case of moderation issues, you can also directly contact a member of the [Swift Core Team](https://swift.org/community/#community-structure). + diff --git a/Carthage/Checkouts/swift-collections/Sources/CMakeLists.txt b/Carthage/Checkouts/swift-collections/Sources/CMakeLists.txt new file mode 100644 index 00000000..fa125f86 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/CMakeLists.txt @@ -0,0 +1,12 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +add_subdirectory(Collections) +add_subdirectory(DequeModule) +add_subdirectory(OrderedCollections) diff --git a/Carthage/Checkouts/swift-collections/Sources/Collections/CMakeLists.txt b/Carthage/Checkouts/swift-collections/Sources/Collections/CMakeLists.txt new file mode 100644 index 00000000..aadba16a --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/Collections/CMakeLists.txt @@ -0,0 +1,19 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +add_library(Collections + Collections.swift) +target_link_libraries(Collections PRIVATE + DequeModule + OrderedCollections) +set_target_properties(Collections PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY}) + +_install_target(Collections) +set_property(GLOBAL APPEND PROPERTY SWIFT_COLLECTIONS_EXPORTS Collections) diff --git a/Carthage/Checkouts/swift-collections/Sources/Collections/Collections.swift b/Carthage/Checkouts/swift-collections/Sources/Collections/Collections.swift new file mode 100644 index 00000000..525b3428 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/Collections/Collections.swift @@ -0,0 +1,13 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@_exported import DequeModule +@_exported import OrderedCollections diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/CMakeLists.txt b/Carthage/Checkouts/swift-collections/Sources/DequeModule/CMakeLists.txt new file mode 100644 index 00000000..3287f3ef --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/CMakeLists.txt @@ -0,0 +1,34 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +add_library(DequeModule + _DequeBuffer.swift + _DequeBufferHeader.swift + _DequeSlot.swift + _UnsafeWrappedBuffer.swift + Compatibility.swift + Deque._Storage.swift + Deque._UnsafeHandle.swift + Deque.swift + Deque+Codable.swift + Deque+Collection.swift + Deque+CustomDebugStringConvertible.swift + Deque+CustomReflectable.swift + Deque+CustomStringConvertible.swift + Deque+Equatable.swift + Deque+ExpressibleByArrayLiteral.swift + Deque+Extras.swift + Deque+Hashable.swift + Deque+Testing.swift + UnsafeMutableBufferPointer+Utilities.swift) +set_target_properties(DequeModule PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY}) + +_install_target(DequeModule) +set_property(GLOBAL APPEND PROPERTY SWIFT_COLLECTIONS_EXPORTS DequeModule) diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Compatibility.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Compatibility.swift new file mode 100644 index 00000000..8ece8f6f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Compatibility.swift @@ -0,0 +1,62 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Array { + /// Returns true if `Array.withContiguousStorageIfAvailable` is broken + /// in the stdlib we're currently running on. + /// + /// See https://bugs.swift.org/browse/SR-14663. + @inlinable + internal static func _isWCSIABroken() -> Bool { + #if _runtime(_ObjC) + guard _isBridgedVerbatimToObjectiveC(Element.self) else { + // SR-14663 only triggers on array values that are verbatim bridged + // from Objective-C, so it cannot ever trigger for element types + // that aren't verbatim bridged. + return false + } + + // SR-14663 was introduced in Swift 5.1. Check if we have a broken stdlib. + + // The bug is caused by a bogus precondition inside a non-inlinable stdlib + // method, so to determine if we're affected, we need to check the currently + // running OS version. + #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) + guard #available(macOS 10.15, iOS 13, watchOS 6, tvOS 13, *) else { + // The OS is too old to be affected by this bug. + return false + } + #endif + // FIXME: When a stdlib is released that contains a fix, add a check for it. + return true + + #else + // Platforms that don't have an Objective-C runtime don't have verbatim + // bridged array values, so the bug doesn't apply to them. + return false + #endif + } +} + +extension Sequence { + // An adjusted version of the standard `withContiguousStorageIfAvailable` + // method that works around https://bugs.swift.org/browse/SR-14663. + @inlinable + internal func _withContiguousStorageIfAvailable_SR14663( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + if Self.self == Array.self && Array._isWCSIABroken() { + return nil + } + + return try self.withContiguousStorageIfAvailable(body) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Codable.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Codable.swift new file mode 100644 index 00000000..2d98587c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Codable.swift @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: Encodable where Element: Encodable { + /// Encodes the elements of this deque into the given encoder in an unkeyed + /// container. + /// + /// This function throws an error if any values are invalid for the given + /// encoder's format. + /// + /// - Parameter encoder: The encoder to write data to. + @inlinable + public func encode(to encoder: Encoder) throws { + var container = encoder.unkeyedContainer() + for element in self { + try container.encode(element) + } + } +} + +extension Deque: Decodable where Element: Decodable { + /// Creates a new deque by decoding from the given decoder. + /// + /// This initializer throws an error if reading from the decoder fails, or + /// if the data read is corrupted or otherwise invalid. + /// + /// - Parameter decoder: The decoder to read data from. + @inlinable + public init(from decoder: Decoder) throws { + self.init() + + var container = try decoder.unkeyedContainer() + if let count = container.count { + self.reserveCapacity(count) + } + while !container.isAtEnd { + let element = try container.decode(Element.self) + self.append(element) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Collection.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Collection.swift new file mode 100644 index 00000000..a5b8c334 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Collection.swift @@ -0,0 +1,913 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: Sequence { + // Implementation note: we could also use the default `IndexingIterator` here. + // This custom implementation performs direct storage access to eliminate any + // and all index validation overhead. It also optimizes away repeated + // conversions from indices to storage slots. + + /// An iterator over the members of a deque. + @frozen + public struct Iterator: IteratorProtocol { + @usableFromInline + internal var _storage: Deque._Storage + + @usableFromInline + internal var _nextSlot: _Slot + + @usableFromInline + internal var _endSlot: _Slot + + @inlinable + internal init(_storage: Deque._Storage, start: _Slot, end: _Slot) { + self._storage = _storage + self._nextSlot = start + self._endSlot = end + } + + @inlinable + internal init(_base: Deque) { + self = _base._storage.read { handle in + let start = handle.startSlot + let end = Swift.min(start.advanced(by: handle.count), handle.limSlot) + return Self(_storage: _base._storage, start: start, end: end) + } + } + + @inlinable + internal init(_base: Deque, from index: Int) { + self = _base._storage.read { handle in + assert(index >= 0 && index <= handle.count) + let start = handle.slot(forOffset: index) + if index == handle.count { + return Self(_storage: _base._storage, start: start, end: start) + } + var end = handle.endSlot + if start >= end { end = handle.limSlot } + return Self(_storage: _base._storage, start: start, end: end) + } + } + + @inlinable + @inline(never) + internal mutating func _swapSegment() -> Bool { + assert(_nextSlot == _endSlot) + return _storage.read { handle in + let end = handle.endSlot + if end == .zero || end == _nextSlot { + return false + } + _endSlot = end + _nextSlot = .zero + return true + } + } + + /// Advances to the next element and returns it, or `nil` if no next element + /// exists. + /// + /// Once `nil` has been returned, all subsequent calls return `nil`. + @inlinable + public mutating func next() -> Element? { + if _nextSlot == _endSlot { + guard _swapSegment() else { return nil } + } + assert(_nextSlot < _endSlot) + let slot = _nextSlot + _nextSlot = _nextSlot.advanced(by: 1) + return _storage.read { handle in + return handle.ptr(at: slot).pointee + } + } + } + + /// Returns an iterator over the elements of the deque. + /// + /// - Complexity: O(1) + @inlinable + public func makeIterator() -> Iterator { + Iterator(_base: self) + } + + @inlinable + public __consuming func _copyToContiguousArray() -> ContiguousArray { + ContiguousArray(unsafeUninitializedCapacity: _storage.count) { target, count in + _storage.read { source in + let segments = source.segments() + let c = segments.first.count + target[.. + ) -> (Iterator, UnsafeMutableBufferPointer.Index) { + _storage.read { source in + let segments = source.segments() + let c1 = Swift.min(segments.first.count, target.count) + target[.. c1, let second = segments.second else { + return (Iterator(_base: self, from: c1), c1) + } + let c2 = Swift.min(second.count, target.count - c1) + target[c1 ..< c1 + c2]._rebased()._initialize(from: second.prefix(c2)._rebased()) + return (Iterator(_base: self, from: c1 + c2), c1 + c2) + } + } + + /// Call `body(b)`, where `b` is an unsafe buffer pointer to the deque's + /// contiguous storage, if available. If the deque's contents aren't stored + /// contiguously, `body` is not called and `nil` is returned. The supplied + /// buffer pointer is only valid for the duration of the call. + /// + /// Often, the optimizer can eliminate bounds- and uniqueness-checks within an + /// algorithm, but when that fails, invoking the same algorithm on the unsafe + /// buffer supplied to `body` lets you trade safety for speed. + /// + /// - Parameters: + /// - body: The function to invoke. + /// + /// - Returns: The value returned by `body`, or `nil` if `body` wasn't called. + /// + /// - Complexity: O(1) when this instance has a unique reference to its + /// underlying storage; O(`count`) otherwise. + @inlinable + public func withContiguousStorageIfAvailable( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + return try _storage.read { handle in + let endSlot = handle.startSlot.advanced(by: handle.count) + guard endSlot.position <= handle.capacity else { return nil } + return try body(handle.buffer(for: handle.startSlot ..< endSlot)) + } + } +} + +extension Deque: RandomAccessCollection { + public typealias Index = Int + public typealias SubSequence = Slice + public typealias Indices = Range + + /// The number of elements in the deque. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _storage.count } + + /// The position of the first element in a nonempty deque. + /// + /// For an instance of `Deque`, `startIndex` is always zero. If the deque is + /// empty, `startIndex` is equal to `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { 0 } + + /// The deque’s “past the end” position—that is, the position one greater than + /// the last valid subscript argument. + /// + /// For an instance of `Deque`, `endIndex` is always equal to its `count`. If + /// the deque is empty, `endIndex` is equal to `startIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { count } + + /// The indices that are valid for subscripting this deque, in ascending order. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var indices: Range { 0 ..< count } + + /// Returns the position immediately after the given index. + /// + /// - Parameter `i`: A valid index of the deque. `i` must be less than + /// `endIndex`. + /// + /// - Returns: The next valid index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { + // Note: Like `Array`, index manipulation methods on deques don't trap on + // invalid indices. (Indices are still validated on element access.) + return i + 1 + } + + /// Replaces the given index with its successor. + /// + /// - Parameter `i`: A valid index of the deque. `i` must be less than + /// `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { + // Note: Like `Array`, index manipulation methods on deques + // don't trap on invalid indices. + // (Indices are still validated on element access.) + i += 1 + } + + /// Returns the position immediately before the given index. + /// + /// - Parameter `i`: A valid index of the deque. `i` must be greater than + /// `startIndex`. + /// + /// - Returns: The preceding valid index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { + // Note: Like `Array`, index manipulation methods on deques don't trap on + // invalid indices. (Indices are still validated on element access.) + return i - 1 + } + + /// Replaces the given index with its predecessor. + /// + /// - Parameter `i`: A valid index of the deque. `i` must be greater than `startIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { + // Note: Like `Array`, index manipulation methods on deques don't trap on + // invalid indices. (Indices are still validated on element access.) + i -= 1 + } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection. + /// + /// - Parameters: + /// - i: A valid index of the deque. + /// - `distance`: The distance by which to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls + /// to `index(after:)`. If `distance` is negative, this is the same value + /// as the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + // Note: Like `Array`, index manipulation methods on deques don't trap on + // invalid indices. (Indices are still validated on element access.) + return i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// - Parameters: + /// - i: A valid index of the array. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the deque to use as a limit. + /// If `distance > 0`, then `limit` has no effect it is less than `i`. + /// Likewise, if `distance < 0`, then `limit` has no effect if it is + /// greater than `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + // Note: Like `Array`, index manipulation methods on deques + // don't trap on invalid indices. + // (Indices are still validated on element access.) + let l = limit - i + if distance > 0 ? l >= 0 && l < distance : l <= 0 && distance < l { + return nil + } + return i + distance + } + + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. + /// + /// - Returns: The distance between `start` and `end`. If `end` is equal to + /// `start`, the result is zero. Otherwise the result is positive if `end` + /// is greater than `start`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + // Note: Like `Array`, index manipulation method on deques + // don't trap on invalid indices. + // (Indices are still validated on element access.) + return end - start + } + + /// Accesses the element at the specified position. + /// + /// - Parameters: + /// - index: The position of the element to access. `index` must be greater + /// than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: Reading an element from a deque is O(1). Writing is O(1) + /// unless the deque’s storage is shared with another deque, in which case + /// writing is O(`count`). + @inlinable + public subscript(index: Int) -> Element { + get { + precondition(index >= 0 && index < count, "Index out of bounds") + return _storage.read { $0.ptr(at: $0.slot(forOffset: index)).pointee } + } + set { + precondition(index >= 0 && index < count, "Index out of bounds") + _storage.ensureUnique() + _storage.update { handle in + let slot = handle.slot(forOffset: index) + handle.ptr(at: slot).pointee = newValue + } + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + precondition(index >= 0 && index < count, "Index out of bounds") + var (slot, value) = _prepareForModify(at: index) + defer { + _finalizeModify(slot, value) + } + yield &value + } + } + + @inlinable + internal mutating func _prepareForModify(at index: Int) -> (_Slot, Element) { + _storage.ensureUnique() + // We technically aren't supposed to escape storage pointers out of a + // managed buffer, so we escape a `(slot, value)` pair instead, leaving + // the corresponding slot temporarily uninitialized. + return _storage.update { handle in + let slot = handle.slot(forOffset: index) + return (slot, handle.ptr(at: slot).move()) + } + } + + @inlinable + internal mutating func _finalizeModify(_ slot: _Slot, _ value: Element) { + _storage.update { handle in + handle.ptr(at: slot).initialize(to: value) + } + } + + /// Accesses a contiguous subrange of the deque's elements. + /// + /// - Parameters: + /// - bounds: A range of the deque's indices. The bounds of the range must + /// be valid indices of the deque (including the `endIndex`). + /// + /// The accessed slice uses the same indices for the same elements as the + /// original collection. + @inlinable + public subscript(bounds: Range) -> Slice { + get { + precondition(bounds.lowerBound >= 0 && bounds.upperBound <= count, + "Invalid bounds") + return Slice(base: self, bounds: bounds) + } + set(source) { + precondition(bounds.lowerBound >= 0 && bounds.upperBound <= count, + "Invalid bounds") + self.replaceSubrange(bounds, with: source) + } + } +} + +extension Deque: MutableCollection { + /// Exchanges the values at the specified indices of the collection. + /// + /// Both parameters must be valid indices of the collection and not equal to + /// `endIndex`. Passing the same index as both `i` and `j` has no effect. + /// + /// - Parameters: + /// - i: The index of the first value to swap. + /// - j: The index of the second value to swap. + /// + /// - Complexity: O(1) when this instance has a unique reference to its + /// underlying storage; O(`count`) otherwise. + @inlinable + public mutating func swapAt(_ i: Int, _ j: Int) { + precondition(i >= 0 && i < count, "Index out of bounds") + precondition(j >= 0 && j < count, "Index out of bounds") + _storage.ensureUnique() + _storage.update { handle in + let slot1 = handle.slot(forOffset: i) + let slot2 = handle.slot(forOffset: j) + handle.mutableBuffer.swapAt(slot1.position, slot2.position) + } + } + + // FIXME: Implement `partition(by:)` by making storage contiguous, + // and partitioning that. + + /// Call `body(b)`, where `b` is an unsafe buffer pointer to the deque's + /// mutable contiguous storage. If the deque's contents aren't stored + /// contiguously, `body` is not called and `nil` is returned. The supplied + /// buffer pointer is only valid for the duration of the call. + /// + /// Often, the optimizer can eliminate bounds- and uniqueness-checks within an + /// algorithm, but when that fails, invoking the same algorithm on the unsafe + /// buffer supplied to `body` lets you trade safety for speed. + /// + /// - Parameters: + /// - body: The function to invoke. + /// + /// - Returns: The value returned by `body`, or `nil` if `body` wasn't called. + /// + /// - Complexity: O(1) when this instance has a unique reference to its + /// underlying storage; O(`count`) otherwise. (Not counting the call to + /// `body`.) + @inlinable + public mutating func withContiguousMutableStorageIfAvailable( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + _storage.ensureUnique() + return try _storage.update { handle in + let endSlot = handle.startSlot.advanced(by: handle.count) + guard endSlot.position <= handle.capacity else { + // FIXME: Rotate storage such that it becomes contiguous. + return nil + } + let original = handle.mutableBuffer(for: handle.startSlot ..< endSlot) + var extract = original + defer { + precondition(extract.baseAddress == original.baseAddress && extract.count == original.count, + "Closure must not replace the provided buffer") + } + return try body(&extract) + } + } + + @inlinable + public mutating func _withUnsafeMutableBufferPointerIfSupported( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + return try withContiguousMutableStorageIfAvailable(body) + } +} + +extension Deque: RangeReplaceableCollection { + /// Creates a new, empty deque. + /// + /// This is equivalent to initializing with an empty array literal. + /// For example: + /// + /// let deque1 = Deque() + /// print(deque1.isEmpty) // true + /// + /// let deque2: Deque = [] + /// print(deque2.isEmpty) // true + /// + /// - Complexity: O(1) + @inlinable + public init() { + _storage = _Storage() + } + + /// Reserves enough space to store the specified number of elements. + /// + /// If you are adding a known number of elements to a deque, use this method + /// to avoid multiple reallocations. It ensures that the deque has unique + /// storage, with space allocated for at least the requested number of + /// elements. + /// + /// - Parameters: + /// - minimumCapacity: The requested number of elements to store. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func reserveCapacity(_ minimumCapacity: Int) { + _storage.ensureUnique(minimumCapacity: minimumCapacity, linearGrowth: true) + } + + /// Replaces a range of elements with the elements in the specified + /// collection. + /// + /// This method has the effect of removing the specified range of elements + /// from the deque and inserting the new elements at the same location. The + /// number of new elements need not match the number of elements being + /// removed. + /// + /// - Parameters: + /// - subrange: The subrange of the deque to replace. The bounds of the + /// subrange must be valid indices of the deque (including the + /// `endIndex`). + /// - newElements: The new elements to add to the deque. + /// + /// - Complexity: O(`self.count + newElements.count`). If the operation needs + /// to change the size of the deque, it minimizes the number of existing + /// items that need to be moved by shifting elements either before or after + /// `subrange`. + @inlinable + public mutating func replaceSubrange( + _ subrange: Range, + with newElements: __owned C + ) where C.Element == Element { + precondition(subrange.lowerBound >= 0 && subrange.upperBound <= count, "Index range out of bounds") + let removalCount = subrange.count + let insertionCount = newElements.count + let deltaCount = insertionCount - removalCount + _storage.ensureUnique(minimumCapacity: count + deltaCount) + + let replacementCount = Swift.min(removalCount, insertionCount) + let targetCut = subrange.lowerBound + replacementCount + let sourceCut = newElements.index(newElements.startIndex, offsetBy: replacementCount) + + _storage.update { target in + target.uncheckedReplaceInPlace( + inOffsets: subrange.lowerBound ..< targetCut, + with: newElements[.. 0 { + target.uncheckedInsert( + contentsOf: newElements[sourceCut...], + count: deltaCount, + atOffset: targetCut) + } + } + } + + /// Creates a new deque containing the specified number of a single, repeated + /// value. + /// + /// - Parameters: + /// - repeatedValue: The element to repeat. + /// - count: The number of times to repeat the element. `count` must be zero + /// or greater. + /// + /// - Complexity: O(`count`) + @inlinable + public init(repeating repeatedValue: Element, count: Int) { + precondition(count >= 0) + self.init(minimumCapacity: count) + _storage.update { handle in + assert(handle.startSlot == .zero) + if count > 0 { + handle.ptr(at: .zero).initialize(repeating: repeatedValue, count: count) + } + handle.count = count + } + } + + /// Creates a deque containing the elements of a sequence. + /// + /// - Parameters: + /// - elements: The sequence of elements to turn into a deque. + /// + /// - Complexity: O(*n*), where *n* is the number of elements in the sequence. + @inlinable + public init(_ elements: S) where S.Element == Element { + self.init() + self.append(contentsOf: elements) + } + + /// Creates a deque containing the elements of a collection. + /// + /// - Parameters: + /// - elements: The collection of elements to turn into a deque. + /// + /// - Complexity: O(`elements.count`) + @inlinable + public init(_ elements: C) where C.Element == Element { + let c = elements.count + guard c > 0 else { _storage = _Storage(); return } + self._storage = _Storage(minimumCapacity: c) + _storage.update { handle in + assert(handle.startSlot == .zero) + let target = handle.mutableBuffer(for: .zero ..< _Slot(at: c)) + let done: Void? = elements._withContiguousStorageIfAvailable_SR14663 { source in + target._initialize(from: source) + } + if done == nil { + target._initialize(from: elements) + } + handle.count = c + } + } + + /// Adds a new element at the end of the deque. + /// + /// Use this method to append a single element to the end of a deque. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.append(100) + /// print(numbers) + /// // Prints "[1, 2, 3, 4, 5, 100]" + /// + /// Because deques increase their allocated capacity using an exponential + /// strategy, appending a single element to a deque is an O(1) operation when + /// averaged over many calls to the `append(_:)` method. When a deque has + /// additional capacity and is not sharing its storage with another instance, + /// appending an element is O(1). When a deque needs to reallocate storage + /// before prepending or its storage is shared with another copy, appending is + /// O(`count`). + /// + /// - Parameters: + /// - newElement: The element to append to the deque. + /// + /// - Complexity: Amortized O(1) + /// + /// - SeeAlso: `prepend(_:)` + @inlinable + public mutating func append(_ newElement: Element) { + _storage.ensureUnique(minimumCapacity: count + 1) + _storage.update { + $0.uncheckedAppend(newElement) + } + } + + /// Adds the elements of a sequence to the end of the deque. + /// + /// Use this method to append the elements of a sequence to the front of this + /// deque. This example appends the elements of a `Range` instance to a + /// deque of integers. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.append(contentsOf: 10...15) + /// print(numbers) + /// // Prints "[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]" + /// + /// - Parameter newElements: The elements to append to the deque. + /// + /// - Complexity: Amortized O(`newElements.count`). + @inlinable + public mutating func append(contentsOf newElements: S) where S.Element == Element { + let done: Void? = newElements._withContiguousStorageIfAvailable_SR14663 { source in + _storage.ensureUnique(minimumCapacity: count + source.count) + _storage.update { $0.uncheckedAppend(contentsOf: source) } + } + if done != nil { + return + } + + let underestimatedCount = newElements.underestimatedCount + _storage.ensureUnique(minimumCapacity: count + underestimatedCount) + var it: S.Iterator = _storage.update { target in + let gaps = target.availableSegments() + let (it, copied) = gaps.initialize(fromSequencePrefix: newElements) + target.count += copied + return it + } + while let next = it.next() { + _storage.ensureUnique(minimumCapacity: count + 1) + _storage.update { target in + target.uncheckedAppend(next) + let gaps = target.availableSegments() + target.count += gaps.initialize(fromPrefixOf: &it) + } + } + } + + /// Adds the elements of a collection to the end of the deque. + /// + /// Use this method to append the elements of a collection to the front of + /// this deque. This example appends the elements of a `Range` instance + /// to a deque of integers. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.append(contentsOf: 10...15) + /// print(numbers) + /// // Prints "[1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15]" + /// + /// - Parameter newElements: The elements to append to the deque. + /// + /// - Complexity: Amortized O(`newElements.count`). + @inlinable + public mutating func append(contentsOf newElements: C) where C.Element == Element { + let done: Void? = newElements._withContiguousStorageIfAvailable_SR14663 { source in + _storage.ensureUnique(minimumCapacity: count + source.count) + _storage.update { $0.uncheckedAppend(contentsOf: source) } + } + guard done == nil else { return } + + let c = newElements.count + guard c > 0 else { return } + _storage.ensureUnique(minimumCapacity: count + c) + _storage.update { target in + let gaps = target.availableSegments().prefix(c) + gaps.initialize(from: newElements) + target.count += c + } + } + + /// Inserts a new element at the specified position. + /// + /// The new element is inserted before the element currently at the specified + /// index. If you pass the deque’s `endIndex` as the `index` parameter, the + /// new element is appended to the deque. + /// + /// - Parameters: + /// - newElement: The new element to insert into the deque. + /// - index: The position at which to insert the new element. `index` must + /// be a valid index of the deque (including `endIndex`). + /// + /// - Complexity: O(`count`). The operation shifts existing elements either + /// towards the beginning or the end of the deque to minimize the number of + /// elements that need to be moved. When inserting at the start or the end, + /// this reduces the complexity to amortized O(1). + @inlinable + public mutating func insert(_ newElement: Element, at index: Int) { + precondition(index >= 0 && index <= count, + "Can't insert element at invalid index") + _storage.ensureUnique(minimumCapacity: count + 1) + _storage.update { target in + if index == 0 { + target.uncheckedPrepend(newElement) + return + } + if index == count { + target.uncheckedAppend(newElement) + return + } + let gap = target.openGap(ofSize: 1, atOffset: index) + assert(gap.first.count == 1) + gap.first.baseAddress!.initialize(to: newElement) + } + } + + /// Inserts the elements of a collection into the deque at the specified + /// position. + /// + /// The new elements are inserted before the element currently at the + /// specified index. If you pass the deque's `endIndex` property as the + /// `index` parameter, the new elements are appended to the deque. + /// + /// - Parameters: + /// - newElements: The new elements to insert into the deque. + /// - index: The position at which to insert the new elements. `index` must + /// be a valid index of the deque (including `endIndex`). + /// + /// - Complexity: O(`count + newElements.count`). The operation shifts + /// existing elements either towards the beginning or the end of the deque + /// to minimize the number of elements that need to be moved. When + /// inserting at the start or the end, this reduces the complexity to + /// amortized O(1). + @inlinable + public mutating func insert( + contentsOf newElements: __owned C, at index: Int + ) where C.Element == Element { + precondition(index >= 0 && index <= count, + "Can't insert elements at an invalid index") + let newCount = newElements.count + _storage.ensureUnique(minimumCapacity: count + newCount) + _storage.update { target in + target.uncheckedInsert(contentsOf: newElements, count: newCount, atOffset: index) + } + } + + /// Removes and returns the element at the specified position. + /// + /// To close the resulting gap, all elements following the specified position + /// are (logically) moved up by one index position. (Internally, the deque may + /// actually decide to shift previous elements forward instead to minimize the + /// number of elements that need to be moved.) + /// + /// - Parameters: + /// - index: The position of the element to remove. `index` must be a valid + /// index of the array. + /// + /// - Returns: The element originally at the specified index. + /// + /// - Complexity: O(`count`). Removing elements from the start or end of the + /// deque costs O(1) if the deque's storage isn't shared. + @inlinable + @discardableResult + public mutating func remove(at index: Int) -> Element { + precondition(index >= 0 && index < self.count, "Index out of bounds") + // FIXME: Implement storage shrinking + _storage.ensureUnique() + return _storage.update { target in + // FIXME: Add direct implementation & see if it makes a difference + let result = self[index] + target.uncheckedRemove(offsets: index ..< index + 1) + return result + } + } + + /// Removes the elements in the specified subrange from the deque. + + /// All elements following the specified range are (logically) moved up to + /// close the resulting gap. (Internally, the deque may actually decide to + /// shift previous elements forward instead to minimize the number of elements + /// that need to be moved.) + /// + /// - Parameters: + /// - bounds: The range of the collection to be removed. The bounds of the + /// range must be valid indices of the collection. + /// + /// - Complexity: O(`count`). Removing elements from the start or end of the + /// deque costs O(`bounds.count`) if the deque's storage isn't shared. + @inlinable + public mutating func removeSubrange(_ bounds: Range) { + precondition(bounds.lowerBound >= 0 && bounds.upperBound <= self.count, + "Index range out of bounds") + _storage.ensureUnique() + _storage.update { $0.uncheckedRemove(offsets: bounds) } + } + + @inlinable + public mutating func _customRemoveLast() -> Element? { + precondition(!isEmpty, "Cannot remove last element of an empty Deque") + _storage.ensureUnique() + return _storage.update { $0.uncheckedRemoveLast() } + } + + @inlinable + public mutating func _customRemoveLast(_ n: Int) -> Bool { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the Collection") + _storage.ensureUnique() + _storage.update { $0.uncheckedRemoveLast(n) } + return true + } + + /// Removes and returns the first element of the deque. + /// + /// The collection must not be empty. + /// + /// - Returns: The removed element. + /// + /// - Complexity: O(1) if the underlying storage isn't shared; otherwise + /// O(`count`). + @inlinable + @discardableResult + public mutating func removeFirst() -> Element { + precondition(!isEmpty, "Cannot remove first element of an empty Deque") + _storage.ensureUnique() + return _storage.update { $0.uncheckedRemoveFirst() } + } + + /// Removes the specified number of elements from the beginning of the deque. + /// + /// - Parameter n: The number of elements to remove from the deque. `n` must + /// be greater than or equal to zero and must not exceed the number of + /// elements in the deque. + /// + /// - Complexity: O(`n`) if the underlying storage isn't shared; otherwise + /// O(`count`). + @inlinable + public mutating func removeFirst(_ n: Int) { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the Collection") + _storage.ensureUnique() + return _storage.update { $0.uncheckedRemoveFirst(n) } + } + + /// Removes all elements from the deque. + /// + /// - Parameter keepCapacity: Pass true to keep the existing storage capacity + /// of the deque after removing its elements. The default value is false. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll(keepingCapacity keepCapacity: Bool = false) { + if keepCapacity { + _storage.ensureUnique() + _storage.update { $0.uncheckedRemoveAll() } + } else { + self = Deque() + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomDebugStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomDebugStringConvertible.swift new file mode 100644 index 00000000..5a8e258f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomDebugStringConvertible.swift @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: CustomDebugStringConvertible { + /// A textual representation of this instance, suitable for debugging. + public var debugDescription: String { + var result = "Deque<\(Element.self)>([" + var first = true + for item in self { + if first { + first = false + } else { + result += ", " + } + debugPrint(item, terminator: "", to: &result) + } + result += "])" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomReflectable.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomReflectable.swift new file mode 100644 index 00000000..df919856 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomReflectable.swift @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: CustomReflectable { + /// The custom mirror for this instance. + public var customMirror: Mirror { + Mirror(self, unlabeledChildren: self, displayStyle: .collection) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomStringConvertible.swift new file mode 100644 index 00000000..915c339b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+CustomStringConvertible.swift @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: CustomStringConvertible { + /// A textual representation of this instance. + public var description: String { + var result = "[" + var first = true + for item in self { + if first { + first = false + } else { + result += ", " + } + print(item, terminator: "", to: &result) + } + result += "]" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Equatable.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Equatable.swift new file mode 100644 index 00000000..f71403e7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Equatable.swift @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: Equatable where Element: Equatable { + /// Returns a Boolean value indicating whether two values are equal. Two + /// deques are considered equal if they contain the same elements in the same + /// order. + /// + /// - Complexity: O(`min(left.count, right.count)`) + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + return left.elementsEqual(right) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+ExpressibleByArrayLiteral.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+ExpressibleByArrayLiteral.swift new file mode 100644 index 00000000..fd7125c9 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+ExpressibleByArrayLiteral.swift @@ -0,0 +1,27 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: ExpressibleByArrayLiteral { + /// Creates a new deque from the contents of an array literal. + /// + /// Do not call this initializer directly. It is used by the compiler when + /// you use an array literal. Instead, create a new deque using an array + /// literal as its value by enclosing a comma-separated list of values in + /// square brackets. You can use an array literal anywhere a deque is expected + /// by the type context. + /// + /// - Parameter elements: A variadic list of elements of the new deque. + @inlinable + @inline(__always) + public init(arrayLiteral elements: Element...) { + self.init(elements) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Extras.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Extras.swift new file mode 100644 index 00000000..fd1c1487 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Extras.swift @@ -0,0 +1,186 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque { + /// Creates a deque with the specified capacity, then calls the given + /// closure with a buffer covering the array's uninitialized memory. + /// + /// Inside the closure, set the `initializedCount` parameter to the number of + /// elements that are initialized by the closure. The memory in the range + /// `buffer[0.., inout Int) throws -> Void + ) rethrows { + self._storage = .init(minimumCapacity: capacity) + try _storage.update { handle in + handle.startSlot = .zero + var count = 0 + var buffer = handle.mutableBuffer(for: .zero ..< _Slot(at: capacity)) + defer { + precondition(count <= capacity, + "Initialized count set to greater than specified capacity") + let b = handle.mutableBuffer(for: .zero ..< _Slot(at: capacity)) + precondition(buffer.baseAddress == b.baseAddress && buffer.count == b.count, + "Initializer relocated Deque storage") + handle.count = count + } + try initializer(&buffer, &count) + } + } +} + +extension Deque { + /// Removes and returns the first element of this deque, if it exists. + /// + /// - Returns: The first element of the original collection if the collection + /// isn't empty; otherwise, `nil`. + /// + /// - Complexity: O(1) when this instance has a unique reference to its + /// underlying storage; O(`count`) otherwise. + @inlinable + public mutating func popFirst() -> Element? { + // FIXME: Add this to the stdlib on BidirectionalCollection + // where Self == Self.SubSequence + guard count > 0 else { return nil } + _storage.ensureUnique() + return _storage.update { + $0.uncheckedRemoveFirst() + } + } + + // Note: `popLast` is implemented by the stdlib as a + // `RangeReplaceableCollection` extension, defined in terms of + // `_customRemoveLast`. + + + /// Adds a new element at the front of the deque. + /// + /// Use this method to append a single element to the front of a deque. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.prepend(100) + /// print(numbers) + /// // Prints "[100, 1, 2, 3, 4, 5]" + /// + /// Because deques increase their allocated capacity using an exponential + /// strategy, prepending a single element to a deque is an O(1) operation when + /// averaged over many calls to the `prepend(_:)` method. When a deque has + /// additional capacity and is not sharing its storage with another instance, + /// prepending an element is O(1). When a deque needs to reallocate storage + /// before prepending or its storage is shared with another copy, prepending + /// is O(`count`). + /// + /// - Parameter newElement: The element to prepend to the deque. + /// + /// - Complexity: Amortized O(1). + /// + /// - SeeAlso: `append(_:)` + @inlinable + public mutating func prepend(_ newElement: Element) { + _storage.ensureUnique(minimumCapacity: count + 1) + return _storage.update { + $0.uncheckedPrepend(newElement) + } + } + + /// Adds the elements of a collection to the front of the deque. + /// + /// Use this method to prepend the elements of a collection to the front of + /// this deque. This example prepends the elements of a `Range` instance + /// to a deque of integers. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.prepend(contentsOf: 10...15) + /// print(numbers) + /// // Prints "[10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5]" + /// + /// - Parameter newElements: The elements to prepend to the deque. + /// + /// - Complexity: Amortized O(`newElements.count`). + /// + /// - SeeAlso: `append(contentsOf:)` + @inlinable + public mutating func prepend(contentsOf newElements: C) where C.Element == Element { + let done: Void? = newElements._withContiguousStorageIfAvailable_SR14663 { source in + _storage.ensureUnique(minimumCapacity: count + source.count) + _storage.update { $0.uncheckedPrepend(contentsOf: source) } + } + guard done == nil else { return } + + let c = newElements.count + guard c > 0 else { return } + _storage.ensureUnique(minimumCapacity: count + c) + _storage.update { target in + let gaps = target.availableSegments().suffix(c) + gaps.initialize(from: newElements) + target.count += c + target.startSlot = target.slot(target.startSlot, offsetBy: -c) + } + } + + /// Adds the elements of a sequence to the front of the deque. + /// + /// Use this method to prepend the elements of a sequence to the front of this + /// deque. This example prepends the elements of a `Range` instance to a + /// deque of integers. + /// + /// var numbers: Deque = [1, 2, 3, 4, 5] + /// numbers.prepend(contentsOf: 10...15) + /// print(numbers) + /// // Prints "[10, 11, 12, 13, 14, 15, 1, 2, 3, 4, 5]" + /// + /// - Parameter newElements: The elements to prepend to the deque. + /// + /// - Complexity: Amortized O(`newElements.count`). + /// + /// - SeeAlso: `append(contentsOf:)` + @inlinable + public mutating func prepend(contentsOf newElements: S) where S.Element == Element { + let done: Void? = newElements._withContiguousStorageIfAvailable_SR14663 { source in + _storage.ensureUnique(minimumCapacity: count + source.count) + _storage.update { $0.uncheckedPrepend(contentsOf: source) } + } + guard done == nil else { return } + + let originalCount = self.count + self.append(contentsOf: newElements) + let newCount = self.count + let c = newCount - originalCount + _storage.update { target in + target.startSlot = target.slot(forOffset: originalCount) + target.count = target.capacity + target.closeGap(offsets: c ..< c + (target.capacity - newCount)) + assert(target.count == newCount) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Hashable.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Hashable.swift new file mode 100644 index 00000000..de050c90 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Hashable.swift @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque: Hashable where Element: Hashable { + /// Hashes the essential components of this value by feeding them into the + /// given hasher. + /// + /// Complexity: O(`count`) + @inlinable + public func hash(into hasher: inout Hasher) { + hasher.combine(count) // discriminator + for element in self { + hasher.combine(element) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Testing.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Testing.swift new file mode 100644 index 00000000..00692981 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque+Testing.swift @@ -0,0 +1,76 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// This file contains exported but non-public entry points to support clear box +// testing. + +extension Deque { + /// The maximum number of elements this deque is currently able to store + /// without reallocating its storage buffer. + /// + /// This information isn't exposed as public, as the returned value isn't + /// guaranteed to be stable, and may even differ between equal deques, + /// violating value semantics. + /// + /// This property isn't intended to be used outside of `Deque`'s own test + /// target. + @_spi(Testing) + public var _capacity: Int { + _storage.capacity + } + + /// The number of the storage slot in this deque that holds the first element. + /// (Or would hold it after an insertion in case the deque is currently + /// empty.) + /// + /// This property isn't intended to be used outside of `Deque`'s own test + /// target. + @_spi(Testing) + public var _startSlot: Int { + _storage.startSlot.position + } + + /// Constructs a deque instance of the specified contents and layout. Exposed + /// as public to allow exhaustive input/output tests for `Deque`'s members. + /// This isn't intended to be used outside of `Deque`'s own test target. + @_spi(Testing) + public init( + _capacity capacity: Int, + startSlot: Int, + contents: S + ) where S.Element == Element { + let contents = ContiguousArray(contents) + precondition(capacity >= 0) + precondition(startSlot >= 0 && (startSlot < capacity || (capacity == 0 && startSlot == 0))) + precondition(contents.count <= capacity) + let startSlot = _Slot(at: startSlot) + let buffer = _DequeBuffer.create(minimumCapacity: capacity) { _ in + _DequeBufferHeader(capacity: capacity, count: contents.count, startSlot: startSlot) + } + let storage = Deque._Storage(unsafeDowncast(buffer, to: _DequeBuffer.self)) + if contents.count > 0 { + contents.withUnsafeBufferPointer { source in + storage.update { target in + let segments = target.mutableSegments() + let c = segments.first.count + segments.first._initialize(from: source.prefix(c)._rebased()) + if let second = segments.second { + second._initialize(from: source.dropFirst(c)._rebased()) + } + } + } + } + self.init(_storage: storage) + assert(self._capacity == capacity) + assert(self._startSlot == startSlot.position) + assert(self.count == contents.count) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._Storage.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._Storage.swift new file mode 100644 index 00000000..2c0a5d33 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._Storage.swift @@ -0,0 +1,214 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque { + @frozen + @usableFromInline + struct _Storage { + @usableFromInline + internal typealias _Buffer = ManagedBufferPointer<_DequeBufferHeader, Element> + + @usableFromInline + internal var _buffer: _Buffer + + @inlinable + @inline(__always) + internal init(_buffer: _Buffer) { + self._buffer = _buffer + } + } +} + +extension Deque._Storage: CustomStringConvertible { + @usableFromInline + internal var description: String { + "Deque<\(Element.self)>._Storage\(_buffer.header)" + } +} + +extension Deque._Storage { + @inlinable + internal init() { + self.init(_buffer: _Buffer(unsafeBufferObject: _emptyDequeStorage)) + } + + @inlinable + internal init(_ object: _DequeBuffer) { + self.init(_buffer: _Buffer(unsafeBufferObject: object)) + } + + @inlinable + internal init(minimumCapacity: Int) { + let object = _DequeBuffer.create( + minimumCapacity: minimumCapacity, + makingHeaderWith: { + #if os(OpenBSD) + let capacity = minimumCapacity + #else + let capacity = $0.capacity + #endif + return _DequeBufferHeader(capacity: capacity, count: 0, startSlot: .zero) + }) + self.init(_buffer: _Buffer(unsafeBufferObject: object)) + } +} + +extension Deque._Storage { + #if COLLECTIONS_INTERNAL_CHECKS + @usableFromInline @inline(never) @_effects(releasenone) + internal func _checkInvariants() { + _buffer.withUnsafeMutablePointerToHeader { $0.pointee._checkInvariants() } + } + #else + @inlinable @inline(__always) + internal func _checkInvariants() {} + #endif // COLLECTIONS_INTERNAL_CHECKS +} + +extension Deque._Storage { + @inlinable + @inline(__always) + internal var identity: AnyObject { _buffer.buffer } + + + @inlinable + @inline(__always) + internal var capacity: Int { + _buffer.withUnsafeMutablePointerToHeader { $0.pointee.capacity } + } + + @inlinable + @inline(__always) + internal var count: Int { + _buffer.withUnsafeMutablePointerToHeader { $0.pointee.count } + } + + @inlinable + @inline(__always) + internal var startSlot: _DequeSlot { + _buffer.withUnsafeMutablePointerToHeader { $0.pointee.startSlot + } + } +} + +extension Deque._Storage { + @usableFromInline + internal typealias Index = Int + + @usableFromInline + internal typealias _UnsafeHandle = Deque._UnsafeHandle + + @inlinable + @inline(__always) + internal func read(_ body: (_UnsafeHandle) throws -> R) rethrows -> R { + try _buffer.withUnsafeMutablePointers { header, elements in + let handle = _UnsafeHandle(header: header, + elements: elements, + isMutable: false) + return try body(handle) + } + } + + @inlinable + @inline(__always) + internal func update(_ body: (_UnsafeHandle) throws -> R) rethrows -> R { + try _buffer.withUnsafeMutablePointers { header, elements in + let handle = _UnsafeHandle(header: header, + elements: elements, + isMutable: true) + return try body(handle) + } + } +} + +extension Deque._Storage { + /// Return a boolean indicating whether this storage instance is known to have + /// a single unique reference. If this method returns true, then it is safe to + /// perform in-place mutations on the deque. + @inlinable + @inline(__always) + internal mutating func isUnique() -> Bool { + _buffer.isUniqueReference() + } + + /// Ensure that this storage refers to a uniquely held buffer by copying + /// elements if necessary. + @inlinable + @inline(__always) + internal mutating func ensureUnique() { + if isUnique() { return } + self._makeUniqueCopy() + } + + @inlinable + @inline(never) + internal mutating func _makeUniqueCopy() { + self = self.read { $0.copyElements() } + } + + /// The growth factor to use to increase storage size to make place for an + /// insertion. + @inlinable + @inline(__always) + internal static var growthFactor: Double { 1.5 } + + @usableFromInline + internal func _growCapacity( + to minimumCapacity: Int, + linearly: Bool + ) -> Int { + if linearly { return Swift.max(capacity, minimumCapacity) } + return Swift.max(Int((Self.growthFactor * Double(capacity)).rounded(.up)), + minimumCapacity) + } + + /// Ensure that we have a uniquely referenced buffer with enough space to + /// store at least `minimumCapacity` elements. + /// + /// - Parameter minimumCapacity: The minimum number of elements the buffer + /// needs to be able to hold on return. + /// + /// - Parameter linearGrowth: If true, then don't use an exponential growth + /// factor when reallocating the buffer -- just allocate space for the + /// requested number of elements + @inlinable + @inline(__always) + internal mutating func ensureUnique( + minimumCapacity: Int, + linearGrowth: Bool = false + ) { + let unique = isUnique() + if _slowPath(capacity < minimumCapacity || !unique) { + _ensureUnique(minimumCapacity: minimumCapacity, linearGrowth: linearGrowth) + } + } + + @inlinable + internal mutating func _ensureUnique( + minimumCapacity: Int, + linearGrowth: Bool + ) { + if capacity >= minimumCapacity { + assert(!self.isUnique()) + self = self.read { $0.copyElements() } + } else if isUnique() { + let minimumCapacity = _growCapacity(to: minimumCapacity, linearly: linearGrowth) + self = self.update { source in + source.moveElements(minimumCapacity: minimumCapacity) + } + } else { + let minimumCapacity = _growCapacity(to: minimumCapacity, linearly: linearGrowth) + self = self.read { source in + source.copyElements(minimumCapacity: minimumCapacity) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._UnsafeHandle.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._UnsafeHandle.swift new file mode 100644 index 00000000..ed32110d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque._UnsafeHandle.swift @@ -0,0 +1,833 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Deque { + @frozen + @usableFromInline + internal struct _UnsafeHandle { + @usableFromInline + let _header: UnsafeMutablePointer<_DequeBufferHeader> + @usableFromInline + let _elements: UnsafeMutablePointer + #if DEBUG + @usableFromInline + let _isMutable: Bool + #endif + + @inlinable + @inline(__always) + init( + header: UnsafeMutablePointer<_DequeBufferHeader>, + elements: UnsafeMutablePointer, + isMutable: Bool + ) { + self._header = header + self._elements = elements + #if DEBUG + self._isMutable = isMutable + #endif + } + } +} + +extension Deque._UnsafeHandle { + @inlinable + @inline(__always) + func assertMutable() { + #if DEBUG + assert(_isMutable) + #endif + } +} + +extension Deque._UnsafeHandle { + @usableFromInline + internal typealias Slot = _DequeSlot + + @inlinable + @inline(__always) + var header: _DequeBufferHeader { + _header.pointee + } + + @inlinable + @inline(__always) + var capacity: Int { + _header.pointee.capacity + } + + @inlinable + @inline(__always) + var count: Int { + get { _header.pointee.count } + nonmutating set { _header.pointee.count = newValue } + } + + @inlinable + @inline(__always) + var startSlot: Slot { + get { _header.pointee.startSlot } + nonmutating set { _header.pointee.startSlot = newValue } + } + + @inlinable + @inline(__always) + func ptr(at slot: Slot) -> UnsafeMutablePointer { + assert(slot.position >= 0 && slot.position <= capacity) + return _elements + slot.position + } +} + +extension Deque._UnsafeHandle { + @inlinable + @inline(__always) + var mutableBuffer: UnsafeMutableBufferPointer { + assertMutable() + return .init(start: _elements, count: _header.pointee.capacity) + } + + @inlinable + internal func buffer(for range: Range) -> UnsafeBufferPointer { + assert(range.upperBound.position <= capacity) + return .init(start: _elements + range.lowerBound.position, count: range._count) + } + + @inlinable + @inline(__always) + internal func mutableBuffer(for range: Range) -> UnsafeMutableBufferPointer { + assertMutable() + return .init(mutating: buffer(for: range)) + } +} + +extension Deque._UnsafeHandle { + /// The slot immediately following the last valid one. (`endSlot` refers to + /// the valid slot corresponding to `endIndex`, which is a different thing + /// entirely.) + @inlinable + @inline(__always) + internal var limSlot: Slot { + Slot(at: capacity) + } + + @inlinable + internal func slot(after slot: Slot) -> Slot { + assert(slot.position < capacity) + let position = slot.position + 1 + if position >= capacity { + return Slot(at: 0) + } + return Slot(at: position) + } + + @inlinable + internal func slot(before slot: Slot) -> Slot { + assert(slot.position < capacity) + if slot.position == 0 { return Slot(at: capacity - 1) } + return Slot(at: slot.position - 1) + } + + @inlinable + internal func slot(_ slot: Slot, offsetBy delta: Int) -> Slot { + assert(slot.position <= capacity) + let position = slot.position + delta + if delta >= 0 { + if position >= capacity { return Slot(at: position - capacity) } + } else { + if position < 0 { return Slot(at: position + capacity) } + } + return Slot(at: position) + } + + @inlinable + @inline(__always) + internal var endSlot: Slot { + slot(startSlot, offsetBy: count) + } + + /// Return the storage slot corresponding to the specified offset, which may + /// or may not address an existing element. + @inlinable + internal func slot(forOffset offset: Int) -> Slot { + assert(offset >= 0) + assert(offset <= capacity) // Not `count`! + + // Note: The use of wrapping addition/subscription is justified here by the + // fact that `offset` is guaranteed to fall in the range `0 ..< capacity`. + // Eliminating the overflow checks leads to a measurable speedup for + // random-access subscript operations. (Up to 2x on some microbenchmarks.) + let position = startSlot.position &+ offset + guard position < capacity else { return Slot(at: position &- capacity) } + return Slot(at: position) + } +} + +extension Deque._UnsafeHandle { + @inlinable + internal func segments() -> _UnsafeWrappedBuffer { + let wrap = capacity - startSlot.position + if count <= wrap { + return .init(start: ptr(at: startSlot), count: count) + } + return .init(first: ptr(at: startSlot), count: wrap, + second: ptr(at: .zero), count: count - wrap) + } + + @inlinable + internal func segments( + forOffsets offsets: Range + ) -> _UnsafeWrappedBuffer { + assert(offsets.lowerBound >= 0 && offsets.upperBound <= count) + let lower = slot(forOffset: offsets.lowerBound) + let upper = slot(forOffset: offsets.upperBound) + if offsets.count == 0 || lower < upper { + return .init(start: ptr(at: lower), count: offsets.count) + } + return .init(first: ptr(at: lower), count: capacity - lower.position, + second: ptr(at: .zero), count: upper.position) + } + + @inlinable + @inline(__always) + internal func mutableSegments() -> _UnsafeMutableWrappedBuffer { + assertMutable() + return .init(mutating: segments()) + } + + @inlinable + @inline(__always) + internal func mutableSegments( + forOffsets range: Range + ) -> _UnsafeMutableWrappedBuffer { + assertMutable() + return .init(mutating: segments(forOffsets: range)) + } +} + +extension Deque._UnsafeHandle { + @inlinable + internal func availableSegments() -> _UnsafeMutableWrappedBuffer { + assertMutable() + let endSlot = self.endSlot + guard count < capacity else { return .init(start: ptr(at: endSlot), count: 0) } + if endSlot < startSlot { return .init(mutableBuffer(for: endSlot ..< startSlot)) } + return .init(mutableBuffer(for: endSlot ..< limSlot), + mutableBuffer(for: .zero ..< startSlot)) + } +} + + + +extension Deque._UnsafeHandle { + @inlinable + @discardableResult + func initialize( + at start: Slot, + from source: UnsafeBufferPointer + ) -> Slot { + assert(start.position + source.count <= capacity) + guard source.count > 0 else { return start } + ptr(at: start).initialize(from: source.baseAddress!, count: source.count) + return Slot(at: start.position + source.count) + } + + @inlinable + @inline(__always) + @discardableResult + func moveInitialize( + at start: Slot, + from source: UnsafeMutableBufferPointer + ) -> Slot { + assert(start.position + source.count <= capacity) + guard source.count > 0 else { return start } + ptr(at: start).moveInitialize(from: source.baseAddress!, count: source.count) + return Slot(at: start.position + source.count) + } + + @inlinable + @inline(__always) + @discardableResult + public func move( + from source: Slot, + to target: Slot, + count: Int + ) -> (source: Slot, target: Slot) { + assert(count >= 0) + assert(source.position + count <= self.capacity) + assert(target.position + count <= self.capacity) + guard count > 0 else { return (source, target) } + ptr(at: target).moveInitialize(from: ptr(at: source), count: count) + return (slot(source, offsetBy: count), slot(target, offsetBy: count)) + } +} + + + +extension Deque._UnsafeHandle { + /// Copy elements into a new storage instance without changing capacity or + /// layout. + @inlinable + internal func copyElements() -> Deque._Storage { + let object = _DequeBuffer.create( + minimumCapacity: capacity, + makingHeaderWith: { _ in header }) + let result = Deque._Storage(_buffer: ManagedBufferPointer(unsafeBufferObject: object)) + guard self.count > 0 else { return result } + result.update { target in + let source = self.segments() + target.initialize(at: startSlot, from: source.first) + if let second = source.second { + target.initialize(at: .zero, from: second) + } + } + return result + } + + /// Copy elements into a new storage instance with the specified minimum + /// capacity. + @inlinable + internal func copyElements(minimumCapacity: Int) -> Deque._Storage { + assert(minimumCapacity >= count) + let object = _DequeBuffer.create( + minimumCapacity: minimumCapacity, + makingHeaderWith: { + #if os(OpenBSD) + let capacity = minimumCapacity + #else + let capacity = $0.capacity + #endif + return _DequeBufferHeader( + capacity: capacity, + count: count, + startSlot: .zero) + }) + let result = Deque._Storage(_buffer: ManagedBufferPointer(unsafeBufferObject: object)) + guard count > 0 else { return result } + result.update { target in + assert(target.count == count && target.startSlot.position == 0) + let source = self.segments() + let next = target.initialize(at: .zero, from: source.first) + if let second = source.second { + target.initialize(at: next, from: second) + } + } + return result + } + + /// Move elements into a new storage instance with the specified minimum + /// capacity. Existing indices in `self` won't necessarily be valid in the + /// result. `self` is left empty. + @inlinable + internal func moveElements(minimumCapacity: Int) -> Deque._Storage { + assertMutable() + let count = self.count + assert(minimumCapacity >= count) + let object = _DequeBuffer.create( + minimumCapacity: minimumCapacity, + makingHeaderWith: { + #if os(OpenBSD) + let capacity = minimumCapacity + #else + let capacity = $0.capacity + #endif + return _DequeBufferHeader( + capacity: capacity, + count: count, + startSlot: .zero) + }) + let result = Deque._Storage(_buffer: ManagedBufferPointer(unsafeBufferObject: object)) + guard count > 0 else { return result } + result.update { target in + let source = self.mutableSegments() + let next = target.moveInitialize(at: .zero, from: source.first) + if let second = source.second { + target.moveInitialize(at: next, from: second) + } + } + self.count = 0 + return result + } +} + +extension Deque._UnsafeHandle { + @inlinable + internal func withUnsafeSegment( + startingAt start: Int, + maximumCount: Int?, + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> (end: Int, result: R) { + assert(start <= count) + guard start < count else { + return try (count, body(UnsafeBufferPointer(start: nil, count: 0))) + } + let endSlot = self.endSlot + + let segmentStart = self.slot(forOffset: start) + let segmentEnd = segmentStart < endSlot ? endSlot : limSlot + let count = Swift.min(maximumCount ?? Int.max, segmentEnd.position - segmentStart.position) + let result = try body(UnsafeBufferPointer(start: ptr(at: segmentStart), count: count)) + return (start + count, result) + } +} + +// MARK: Replacement + +extension Deque._UnsafeHandle { + /// Replace the elements in `range` with `newElements`. The deque's count must + /// not change as a result of calling this function. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func uncheckedReplaceInPlace( + inOffsets range: Range, + with newElements: C + ) where C.Element == Element { + assertMutable() + assert(range.upperBound <= count) + assert(newElements.count == range.count) + guard !range.isEmpty else { return } + let target = mutableSegments(forOffsets: range) + target.assign(from: newElements) + } +} + +// MARK: Appending + +extension Deque._UnsafeHandle { + /// Append `element` to this buffer. The buffer must have enough free capacity + /// to insert one new element. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func uncheckedAppend(_ element: Element) { + assertMutable() + assert(count < capacity) + ptr(at: endSlot).initialize(to: element) + count += 1 + } + + /// Append the contents of `source` to this buffer. The buffer must have + /// enough free capacity to insert the new elements. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func uncheckedAppend(contentsOf source: UnsafeBufferPointer) { + assertMutable() + assert(count + source.count <= capacity) + guard source.count > 0 else { return } + let c = self.count + count += source.count + let gap = mutableSegments(forOffsets: c ..< count) + gap.initialize(from: source) + } +} + +// MARK: Prepending + +extension Deque._UnsafeHandle { + @inlinable + internal func uncheckedPrepend(_ element: Element) { + assertMutable() + assert(count < capacity) + let slot = self.slot(before: startSlot) + ptr(at: slot).initialize(to: element) + startSlot = slot + count += 1 + } + + /// Prepend the contents of `source` to this buffer. The buffer must have + /// enough free capacity to insert the new elements. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func uncheckedPrepend(contentsOf source: UnsafeBufferPointer) { + assertMutable() + assert(count + source.count <= capacity) + guard source.count > 0 else { return } + let oldStart = startSlot + let newStart = self.slot(startSlot, offsetBy: -source.count) + startSlot = newStart + count += source.count + + let gap = mutableWrappedBuffer(between: newStart, and: oldStart) + gap.initialize(from: source) + } +} + +// MARK: Insertion + +extension Deque._UnsafeHandle { + /// Insert all elements from `newElements` into this deque, starting at + /// `offset`. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + /// + /// - Parameter newElements: The elements to insert. + /// - Parameter newCount: Must be equal to `newElements.count`. Used to + /// prevent calling `count` more than once. + /// - Parameter offset: The desired offset from the start at which to place + /// the first element. + @inlinable + internal func uncheckedInsert( + contentsOf newElements: __owned C, + count newCount: Int, + atOffset offset: Int + ) where C.Element == Element { + assertMutable() + assert(offset <= count) + assert(newElements.count == newCount) + guard newCount > 0 else { return } + let gap = openGap(ofSize: newCount, atOffset: offset) + gap.initialize(from: newElements) + } + + @inlinable + internal func mutableWrappedBuffer( + between start: Slot, + and end: Slot + ) -> _UnsafeMutableWrappedBuffer { + assert(start.position <= capacity) + assert(end.position <= capacity) + if start < end { + return .init(start: ptr(at: start), count: end.position - start.position) + } + return .init( + first: ptr(at: start), count: capacity - start.position, + second: ptr(at: .zero), count: end.position) + } + + /// Slide elements around so that there is a gap of uninitialized slots of + /// size `gapSize` starting at `offset`, and return a (potentially wrapped) + /// buffer holding the newly inserted slots. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + /// + /// - Parameter gapSize: The number of uninitialized slots to create. + /// - Parameter offset: The offset from the start at which the uninitialized + /// slots should start. + @inlinable + internal func openGap( + ofSize gapSize: Int, + atOffset offset: Int + ) -> _UnsafeMutableWrappedBuffer { + assertMutable() + assert(offset >= 0 && offset <= self.count) + assert(self.count + gapSize <= capacity) + assert(gapSize > 0) + + let headCount = offset + let tailCount = count - offset + if tailCount <= headCount { + // Open the gap by sliding elements to the right. + + let originalEnd = self.slot(startSlot, offsetBy: count) + let newEnd = self.slot(startSlot, offsetBy: count + gapSize) + let gapStart = self.slot(forOffset: offset) + let gapEnd = self.slot(gapStart, offsetBy: gapSize) + + let sourceIsContiguous = gapStart <= originalEnd.orIfZero(capacity) + let targetIsContiguous = gapEnd <= newEnd.orIfZero(capacity) + + if sourceIsContiguous && targetIsContiguous { + // No need to deal with wrapping; we just need to slide + // elements after the gap. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) ....ABCDE̲F̲G̲H..... EFG̲H̲.̲........ABCD .̲.......ABCDEFGH̲.̲ + // 1) ....ABCD.̲.̲.̲EFGH.. EF.̲.̲.̲GH......ABCD .̲H......ABCDEFG.̲.̲ + move(from: gapStart, to: gapEnd, count: tailCount) + } else if targetIsContiguous { + // The gap itself will be wrapped. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) E̲FGH.........ABC̲D̲ + // 1) .̲..EFGH......ABC̲D̲ + // 2) .̲CDEFGH......AB.̲.̲ + assert(startSlot > originalEnd.orIfZero(capacity)) + move(from: .zero, to: Slot.zero.advanced(by: gapSize), count: originalEnd.position) + move(from: gapStart, to: gapEnd, count: capacity - gapStart.position) + } else if sourceIsContiguous { + // Opening the gap pushes subsequent elements across the wrap. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) ........ABC̲D̲E̲FGH. + // 1) GH......ABC̲D̲E̲F... + // 2) GH......AB.̲.̲.̲CDEF + move(from: limSlot.advanced(by: -gapSize), to: .zero, count: newEnd.position) + move(from: gapStart, to: gapEnd, count: tailCount - newEnd.position) + } else { + // The rest of the items are wrapped, and will remain so. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) GH.........AB̲C̲D̲EF + // 1) ...GH......AB̲C̲D̲EF + // 2) DEFGH......AB̲C̲.̲.. + // 3) DEFGH......A.̲.̲.̲BC + move(from: .zero, to: Slot.zero.advanced(by: gapSize), count: originalEnd.position) + move(from: limSlot.advanced(by: -gapSize), to: .zero, count: gapSize) + move(from: gapStart, to: gapEnd, count: tailCount - gapSize - originalEnd.position) + } + count += gapSize + return mutableWrappedBuffer(between: gapStart, and: gapEnd.orIfZero(capacity)) + } + + // Open the gap by sliding elements to the left. + + let originalStart = self.startSlot + let newStart = self.slot(originalStart, offsetBy: -gapSize) + let gapEnd = self.slot(forOffset: offset) + let gapStart = self.slot(gapEnd, offsetBy: -gapSize) + + let sourceIsContiguous = originalStart <= gapEnd.orIfZero(capacity) + let targetIsContiguous = newStart <= gapStart.orIfZero(capacity) + + if sourceIsContiguous && targetIsContiguous { + // No need to deal with any wrapping. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) ....A̲B̲C̲DEFGH... GH.........̲A̲B̲CDEF .̲A̲B̲CDEFGH.......̲.̲ + // 1) .ABC.̲.̲.̲DEFGH... GH......AB.̲.̲.̲CDEF .̲.̲.̲CDEFGH....AB.̲.̲ + move(from: originalStart, to: newStart, count: headCount) + } else if targetIsContiguous { + // The gap itself will be wrapped. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) C̲D̲EFGH.........A̲B̲ + // 1) C̲D̲EFGH.....AB...̲.̲ + // 2) .̲.̲EFGH.....ABCD.̲.̲ + assert(originalStart >= newStart) + move(from: originalStart, to: newStart, count: capacity - originalStart.position) + move(from: .zero, to: limSlot.advanced(by: -gapSize), count: gapEnd.position) + } else if sourceIsContiguous { + // Opening the gap pushes preceding elements across the wrap. + + // Illustrated steps: (underscores mark eventual gap position) + // + // 0) .AB̲C̲D̲EFGH......... + // 1) ...̲C̲D̲EFGH.......AB + // 2) CD.̲.̲.̲EFGH.......AB + move(from: originalStart, to: newStart, count: capacity - newStart.position) + move(from: Slot.zero.advanced(by: gapSize), to: .zero, count: gapStart.position) + } else { + // The preceding of the items are wrapped, and will remain so. + + // Illustrated steps: (underscores mark eventual gap position) + // 0) CD̲E̲F̲GHIJKL.........AB + // 1) CD̲E̲F̲GHIJKL......AB... + // 2) ..̲.̲F̲GHIJKL......ABCDE + // 3) F.̲.̲.̲GHIJKL......ABCDE + move(from: originalStart, to: newStart, count: capacity - originalStart.position) + move(from: .zero, to: limSlot.advanced(by: -gapSize), count: gapSize) + move(from: Slot.zero.advanced(by: gapSize), to: .zero, count: gapStart.position) + } + startSlot = newStart + count += gapSize + return mutableWrappedBuffer(between: gapStart, and: gapEnd.orIfZero(capacity)) + } +} + +// MARK: Removal + +extension Deque._UnsafeHandle { + @inlinable + internal func uncheckedRemoveFirst() -> Element { + assertMutable() + assert(count > 0) + let result = ptr(at: startSlot).move() + startSlot = slot(after: startSlot) + count -= 1 + return result + } + + @inlinable + internal func uncheckedRemoveLast() -> Element { + assertMutable() + assert(count > 0) + let slot = self.slot(forOffset: count - 1) + let result = ptr(at: slot).move() + count -= 1 + return result + } + + @inlinable + internal func uncheckedRemoveFirst(_ n: Int) { + assertMutable() + assert(count >= n) + guard n > 0 else { return } + let target = mutableSegments(forOffsets: 0 ..< n) + target.deinitialize() + startSlot = slot(startSlot, offsetBy: n) + count -= n + } + + @inlinable + internal func uncheckedRemoveLast(_ n: Int) { + assertMutable() + assert(count >= n) + guard n > 0 else { return } + let target = mutableSegments(forOffsets: count - n ..< count) + target.deinitialize() + count -= n + } + + /// Remove all elements stored in this instance, deinitializing their storage. + /// + /// This method does not ensure that the storage buffer is uniquely + /// referenced. + @inlinable + internal func uncheckedRemoveAll() { + assertMutable() + guard count > 0 else { return } + let target = mutableSegments() + target.deinitialize() + count = 0 + startSlot = .zero + } + + /// Remove all elements in `bounds`, deinitializing their storage and sliding + /// remaining elements to close the resulting gap. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func uncheckedRemove(offsets bounds: Range) { + assertMutable() + assert(bounds.lowerBound >= 0 && bounds.upperBound <= self.count) + + // Deinitialize elements in `bounds`. + mutableSegments(forOffsets: bounds).deinitialize() + closeGap(offsets: bounds) + } + + /// Close the gap of already uninitialized elements in `bounds`, sliding + /// elements outside of the gap to eliminate it. + /// + /// This function does not validate its input arguments in release builds. Nor + /// does it ensure that the storage buffer is uniquely referenced. + @inlinable + internal func closeGap(offsets bounds: Range) { + assertMutable() + assert(bounds.lowerBound >= 0 && bounds.upperBound <= self.count) + let gapSize = bounds.count + guard gapSize > 0 else { return } + + let gapStart = self.slot(forOffset: bounds.lowerBound) + let gapEnd = self.slot(forOffset: bounds.upperBound) + + let headCount = bounds.lowerBound + let tailCount = count - bounds.upperBound + + if headCount >= tailCount { + // Close the gap by sliding elements to the left. + let originalEnd = endSlot + let newEnd = self.slot(forOffset: count - gapSize) + + let sourceIsContiguous = gapEnd < originalEnd.orIfZero(capacity) + let targetIsContiguous = gapStart <= newEnd.orIfZero(capacity) + if tailCount == 0 { + // No need to move any elements. + } else if sourceIsContiguous && targetIsContiguous { + // No need to deal with wrapping. + + // 0) ....ABCD.̲.̲.̲EFGH.. EF.̲.̲.̲GH........ABCD .̲.̲.̲E..........ABCD.̲.̲ .̲.̲.̲EF........ABCD .̲.̲.̲DE.......ABC + // 1) ....ABCDE̲F̲G̲H..... EFG̲H̲.̲..........ABCD .̲.̲.̲...........ABCDE̲.̲ E̲F̲.̲..........ABCD D̲E̲.̲.........ABC + move(from: gapEnd, to: gapStart, count: tailCount) + } else if sourceIsContiguous { + // The gap lies across the wrap from the subsequent elements. + + // 0) .̲.̲.̲EFGH.......ABCD.̲.̲ EFGH.......ABCD.̲.̲.̲ + // 1) .̲.̲.̲..GH.......ABCDE̲F̲ ..GH.......ABCDE̲F̲G̲ + // 2) G̲H̲.̲...........ABCDE̲F̲ GH.........ABCDE̲F̲G̲ + let c = capacity - gapStart.position + assert(tailCount > c) + let next = move(from: gapEnd, to: gapStart, count: c) + move(from: next.source, to: .zero, count: tailCount - c) + } else if targetIsContiguous { + // We need to move elements across a wrap, but the wrap will + // disappear when we're done. + + // 0) HI....ABCDE.̲.̲.̲FG + // 1) HI....ABCDEF̲G̲.̲.. + // 2) ......ABCDEF̲G̲H̲I. + let next = move(from: gapEnd, to: gapStart, count: capacity - gapEnd.position) + move(from: .zero, to: next.target, count: originalEnd.position) + } else { + // We need to move elements across a wrap that won't go away. + + // 0) HIJKL....ABCDE.̲.̲.̲FG + // 1) HIJKL....ABCDEF̲G̲.̲.. + // 2) ...KL....ABCDEF̲G̲H̲IJ + // 3) KL.......ABCDEF̲G̲H̲IJ + var next = move(from: gapEnd, to: gapStart, count: capacity - gapEnd.position) + next = move(from: .zero, to: next.target, count: gapSize) + move(from: next.source, to: .zero, count: newEnd.position) + } + count -= gapSize + } else { + // Close the gap by sliding elements to the right. + let originalStart = startSlot + let newStart = slot(startSlot, offsetBy: gapSize) + + let sourceIsContiguous = originalStart < gapStart.orIfZero(capacity) + let targetIsContiguous = newStart <= gapEnd.orIfZero(capacity) + + if headCount == 0 { + // No need to move any elements. + } else if sourceIsContiguous && targetIsContiguous { + // No need to deal with wrapping. + + // 0) ....ABCD.̲.̲.̲EFGH..... EFGH........AB.̲.̲.̲CD .̲.̲.̲CDEFGH.......AB.̲.̲ DEFGH.......ABC.̲.̲ + // 1) .......AB̲C̲D̲EFGH..... EFGH...........̲A̲B̲CD .̲A̲B̲CDEFGH..........̲.̲ DEFGH.........AB̲C̲ ABCDEFGH........̲.̲.̲ + move(from: originalStart, to: newStart, count: headCount) + } else if sourceIsContiguous { + // The gap lies across the wrap from the preceding elements. + + // 0) .̲.̲DEFGH.......ABC.̲.̲ .̲.̲.̲EFGH.......ABCD + // 1) B̲C̲DEFGH.......A...̲.̲ B̲C̲D̲DEFGH......A... + // 2) B̲C̲DEFGH...........̲A̲ B̲C̲D̲DEFGH.........A + move(from: limSlot.advanced(by: -gapSize), to: .zero, count: gapEnd.position) + move(from: startSlot, to: newStart, count: headCount - gapEnd.position) + } else if targetIsContiguous { + // We need to move elements across a wrap, but the wrap will + // disappear when we're done. + + // 0) CD.̲.̲.̲EFGHI.....AB + // 1) ...̲C̲D̲EFGHI.....AB + // 1) .AB̲C̲D̲EFGHI....... + move(from: .zero, to: gapEnd.advanced(by: -gapStart.position), count: gapStart.position) + move(from: startSlot, to: newStart, count: headCount - gapStart.position) + } else { + // We need to move elements across a wrap that won't go away. + // 0) FG.̲.̲.̲HIJKLMNO....ABCDE + // 1) ...̲F̲G̲HIJKLMNO....ABCDE + // 2) CDE̲F̲G̲HIJKLMNO....AB... + // 3) CDE̲F̲G̲HIJKLMNO.......AB + move(from: .zero, to: Slot.zero.advanced(by: gapSize), count: gapStart.position) + move(from: limSlot.advanced(by: -gapSize), to: .zero, count: gapSize) + move(from: startSlot, to: newStart, count: headCount - gapEnd.position) + } + startSlot = newStart + count -= gapSize + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque.swift new file mode 100644 index 00000000..51d8643f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/Deque.swift @@ -0,0 +1,105 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// A collection implementing a double-ended queue. `Deque` (pronounced "deck") +/// implements an ordered random-access collection that supports efficient +/// insertions and removals from both ends. +/// +/// var colors: Deque = ["red", "yellow", "blue"] +/// +/// Deques implement the same indexing semantics as arrays: they use integer +/// indices, and the first element of a nonempty deque is always at index zero. +/// Like arrays, deques conform to `RangeReplaceableCollection`, +/// `MutableCollection` and `RandomAccessCollection`, providing a familiar +/// interface for manipulating their contents: +/// +/// print(colors[1]) // "yellow" +/// print(colors[3]) // Runtime error: Index out of range +/// +/// colors.insert("green", at: 1) +/// // ["red", "green", "yellow", "blue"] +/// +/// colors.remove(at: 2) // "yellow" +/// // ["red", "green", "blue"] +/// +/// Like all variable-size collections on the standard library, `Deque` +/// implements value semantics: each deque has an independent value that +/// includes the values of its elements. Modifying one deque does not affect any +/// others: +/// +/// var copy = deque +/// copy[1] = "violet" +/// print(copy) // ["red", "violet", "blue"] +/// print(deque) // ["red", "green", "blue"] +/// +/// This is implemented with the copy-on-write optimization. Multiple copies of +/// a deque share the same underlying storage until you modify one of the +/// copies. When that happens, the deque being modified replaces its storage +/// with a uniquely owned copy of itself, which is then modified in place. +/// +/// `Deque` stores its elements in a circular buffer, which allows efficient +/// insertions and removals at both ends of the collection; however, this comes +/// at the cost of potentially discontiguous storage. In contrast, `Array` is +/// (usually) backed by a contiguous buffer, where new data can be efficiently +/// appended to the end, but inserting at the front is relatively slow, as +/// existing elements need to be shifted to make room. +/// +/// This difference in implementation means that while the interface of a deque +/// is very similar to an array, the operations have different performance +/// characteristics. Mutations near the front are expected to be significantly +/// faster in deques, but arrays may measure slightly faster for general +/// random-access lookups. +/// +/// Deques provide a handful of additional operations that make it easier to +/// insert and remove elements at the front. This includes queue operations such +/// as `popFirst` and `prepend`, including the ability to directly prepend a +/// sequence of elements: +/// +/// colors.append("green") +/// colors.prepend("orange") +/// // colors: ["orange", "red", "blue", "yellow", "green"] +/// +/// colors.popLast() // "green" +/// colors.popFirst() // "orange" +/// // colors: ["red", "blue", "yellow"] +/// +/// colors.prepend(contentsOf: ["purple", "teal"]) +/// // colors: ["purple", "teal", "red", "blue", "yellow"] +/// +/// Unlike arrays, deques do not currently provide direct unsafe access to their +/// underlying storage. They also lack a `capacity` property -- the size of the +/// storage buffer at any given point is an unstable implementation detail that +/// should not affect application logic. (However, deques do provide a +/// `reserveCapacity` method.) +@frozen +public struct Deque { + @usableFromInline + internal typealias _Slot = _DequeSlot + + @usableFromInline + internal var _storage: _Storage + + @inlinable + internal init(_storage: _Storage) { + self._storage = _storage + } + + /// Creates and empty deque with preallocated space for at least the specified + /// number of elements. + /// + /// - Parameter minimumCapacity: The minimum number of elements that the + /// newly created deque should be able to store without reallocating its + /// storage buffer. + @inlinable + public init(minimumCapacity: Int) { + self._storage = _Storage(minimumCapacity: minimumCapacity) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/UnsafeMutableBufferPointer+Utilities.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/UnsafeMutableBufferPointer+Utilities.swift new file mode 100644 index 00000000..95b2635a --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/UnsafeMutableBufferPointer+Utilities.swift @@ -0,0 +1,65 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension Collection { + @inlinable + @inline(__always) + internal func _rebased() -> UnsafeBufferPointer + where Self == UnsafeBufferPointer.SubSequence { + .init(rebasing: self) + } +} + +extension Collection { + @inlinable + @inline(__always) + internal func _rebased() -> UnsafeMutableBufferPointer + where Self == UnsafeMutableBufferPointer.SubSequence { + .init(rebasing: self) + } +} + +extension UnsafeMutableBufferPointer { + @inlinable + @inline(__always) + internal func _initialize(from source: UnsafeBufferPointer) { + assert(source.count == count) + guard source.count > 0 else { return } + baseAddress!.initialize(from: source.baseAddress!, count: source.count) + } + + @inlinable + @inline(__always) + internal func _initialize( + from elements: C + ) where C.Element == Element { + assert(elements.count == count) + var (it, copied) = elements._copyContents(initializing: self) + precondition(copied == count) + precondition(it.next() == nil) + } + + @inlinable + @inline(__always) + internal func _deinitializeAll() { + guard count > 0 else { return } + baseAddress!.deinitialize(count: count) + } + + @inlinable + internal func _assign( + from replacement: C + ) where C.Element == Element { + guard self.count > 0 else { return } + self[0 ..< count]._rebased()._deinitializeAll() + _initialize(from: replacement) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBuffer.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBuffer.swift new file mode 100644 index 00000000..bc0df278 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBuffer.swift @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@_fixed_layout +@usableFromInline +internal class _DequeBuffer: ManagedBuffer<_DequeBufferHeader, Element> { + @inlinable + deinit { + self.withUnsafeMutablePointers { header, elements in + header.pointee._checkInvariants() + + let capacity = header.pointee.capacity + let count = header.pointee.count + let startSlot = header.pointee.startSlot + + if startSlot.position + count <= capacity { + (elements + startSlot.position).deinitialize(count: count) + } else { + let firstRegion = capacity - startSlot.position + (elements + startSlot.position).deinitialize(count: firstRegion) + elements.deinitialize(count: count - firstRegion) + } + } + } +} + +extension _DequeBuffer: CustomStringConvertible { + @usableFromInline + internal var description: String { + withUnsafeMutablePointerToHeader { "_DequeStorage<\(Element.self)>\($0.pointee)" } + } +} + +/// The type-punned empty singleton storage instance. +@usableFromInline +internal let _emptyDequeStorage = _DequeBuffer.create( + minimumCapacity: 0, + makingHeaderWith: { _ in + _DequeBufferHeader(capacity: 0, count: 0, startSlot: .init(at: 0)) + }) + diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBufferHeader.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBufferHeader.swift new file mode 100644 index 00000000..37c0ff9c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeBufferHeader.swift @@ -0,0 +1,49 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@usableFromInline +internal struct _DequeBufferHeader { + @usableFromInline + var capacity: Int + + @usableFromInline + var count: Int + + @usableFromInline + var startSlot: _DequeSlot + + @usableFromInline + init(capacity: Int, count: Int, startSlot: _DequeSlot) { + self.capacity = capacity + self.count = count + self.startSlot = startSlot + _checkInvariants() + } + + #if COLLECTIONS_INTERNAL_CHECKS + @usableFromInline @inline(never) @_effects(releasenone) + internal func _checkInvariants() { + precondition(capacity >= 0) + precondition(count >= 0 && count <= capacity) + precondition(startSlot.position >= 0 && startSlot.position <= capacity) + } + #else + @inlinable @inline(__always) + internal func _checkInvariants() {} + #endif // COLLECTIONS_INTERNAL_CHECKS +} + +extension _DequeBufferHeader: CustomStringConvertible { + @usableFromInline + internal var description: String { + "(capacity: \(capacity), count: \(count), startSlot: \(startSlot))" + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeSlot.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeSlot.swift new file mode 100644 index 00000000..321c2f87 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_DequeSlot.swift @@ -0,0 +1,72 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@usableFromInline +@frozen +internal struct _DequeSlot { + @usableFromInline + internal var position: Int + + @inlinable + @inline(__always) + init(at position: Int) { + assert(position >= 0) + self.position = position + } +} + +extension _DequeSlot { + @inlinable + @inline(__always) + internal static var zero: Self { Self(at: 0) } + + @inlinable + @inline(__always) + internal func advanced(by delta: Int) -> Self { + Self(at: position &+ delta) + } + + @inlinable + @inline(__always) + internal func orIfZero(_ value: Int) -> Self { + guard position > 0 else { return Self(at: value) } + return self + } +} + +extension _DequeSlot: CustomStringConvertible { + @usableFromInline + internal var description: String { + "@\(position)" + } +} + +extension _DequeSlot: Equatable { + @inlinable + @inline(__always) + static func ==(left: Self, right: Self) -> Bool { + left.position == right.position + } +} + +extension _DequeSlot: Comparable { + @inlinable + @inline(__always) + static func <(left: Self, right: Self) -> Bool { + left.position < right.position + } +} + +extension Range where Bound == _DequeSlot { + @inlinable + @inline(__always) + internal var _count: Int { upperBound.position - lowerBound.position } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/DequeModule/_UnsafeWrappedBuffer.swift b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_UnsafeWrappedBuffer.swift new file mode 100644 index 00000000..06a0a580 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/DequeModule/_UnsafeWrappedBuffer.swift @@ -0,0 +1,217 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@frozen +@usableFromInline +internal struct _UnsafeWrappedBuffer { + @usableFromInline + internal let first: UnsafeBufferPointer + + @usableFromInline + internal let second: UnsafeBufferPointer? + + @inlinable + @inline(__always) + internal init( + _ first: UnsafeBufferPointer, + _ second: UnsafeBufferPointer? = nil + ) { + self.first = first + self.second = second + assert(first.count > 0 || second == nil) + } + + @inlinable + internal init( + start: UnsafePointer, + count: Int + ) { + self.init(UnsafeBufferPointer(start: start, count: count)) + } + + @inlinable + internal init( + first start1: UnsafePointer, + count count1: Int, + second start2: UnsafePointer, + count count2: Int + ) { + self.init(UnsafeBufferPointer(start: start1, count: count1), + UnsafeBufferPointer(start: start2, count: count2)) + } + + @inlinable + internal var count: Int { first.count + (second?.count ?? 0) } +} + +@frozen +@usableFromInline +internal struct _UnsafeMutableWrappedBuffer { + @usableFromInline + internal let first: UnsafeMutableBufferPointer + + @usableFromInline + internal let second: UnsafeMutableBufferPointer? + + @inlinable + @inline(__always) + internal init( + _ first: UnsafeMutableBufferPointer, + _ second: UnsafeMutableBufferPointer? = nil + ) { + self.first = first + self.second = second?.count == 0 ? nil : second + assert(first.count > 0 || second == nil) + } + + @inlinable + @inline(__always) + internal init( + start: UnsafeMutablePointer, + count: Int + ) { + self.init(UnsafeMutableBufferPointer(start: start, count: count)) + } + + @inlinable + @inline(__always) + internal init( + first start1: UnsafeMutablePointer, + count count1: Int, + second start2: UnsafeMutablePointer, + count count2: Int + ) { + self.init(UnsafeMutableBufferPointer(start: start1, count: count1), + UnsafeMutableBufferPointer(start: start2, count: count2)) + } + + @inlinable + @inline(__always) + internal init(mutating buffer: _UnsafeWrappedBuffer) { + self.init(.init(mutating: buffer.first), + buffer.second.map { .init(mutating: $0) }) + } +} + +extension _UnsafeMutableWrappedBuffer { + @inlinable + @inline(__always) + internal var count: Int { first.count + (second?.count ?? 0) } + + @inlinable + internal func prefix(_ n: Int) -> Self { + assert(n >= 0) + if n >= self.count { + return self + } + if n <= first.count { + return Self(first.prefix(n)._rebased()) + } + return Self(first, second!.prefix(n - first.count)._rebased()) + } + + @inlinable + internal func suffix(_ n: Int) -> Self { + assert(n >= 0) + if n >= self.count { + return self + } + guard let second = second else { + return Self(first.suffix(n)._rebased()) + } + if n <= second.count { + return Self(second.suffix(n)._rebased()) + } + return Self(first.suffix(n - second.count)._rebased(), second) + } +} + +extension _UnsafeMutableWrappedBuffer { + @inlinable + internal func deinitialize() { + first._deinitializeAll() + second?._deinitializeAll() + } + + @inlinable + @discardableResult + internal func initialize( + fromPrefixOf iterator: inout I + ) -> Int + where I.Element == Element { + var copied = 0 + var gap = first + var wrapped = false + while true { + if copied == gap.count { + guard !wrapped, let second = second, second.count > 0 else { break } + gap = second + copied = 0 + wrapped = true + } + guard let next = iterator.next() else { break } + (gap.baseAddress! + copied).initialize(to: next) + copied += 1 + } + return wrapped ? first.count + copied : copied + } + + @inlinable + internal func initialize( + fromSequencePrefix elements: __owned S + ) -> (iterator: S.Iterator, count: Int) + where S.Element == Element { + guard second == nil || first.count >= elements.underestimatedCount else { + var it = elements.makeIterator() + let copied = initialize(fromPrefixOf: &it) + return (it, copied) + } + // Note: Array._copyContents traps when not given enough space, so we + // need to check if we have enough contiguous space available above. + // + // FIXME: Add suppport for segmented (a.k.a. piecewise contiguous) + // collections to the stdlib. + var (it, copied) = elements._copyContents(initializing: first) + if copied == first.count, let second = second { + var i = 0 + while i < second.count { + guard let next = it.next() else { break } + (second.baseAddress! + i).initialize(to: next) + i += 1 + } + copied += i + } + return (it, copied) + } + + @inlinable + internal func initialize( + from elements: __owned C + ) where C.Element == Element { + assert(self.count == elements.count) + if let second = second { + let wrap = elements.index(elements.startIndex, offsetBy: first.count) + first._initialize(from: elements[..( + from elements: C + ) where C.Element == Element { + assert(elements.count == self.count) + deinitialize() + initialize(from: elements) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/CMakeLists.txt b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/CMakeLists.txt new file mode 100644 index 00000000..f595036c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/CMakeLists.txt @@ -0,0 +1,68 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +add_library(OrderedCollections + "HashTable/_HashTable.swift" + "HashTable/_HashTable+Bucket.swift" + "HashTable/_HashTable+BucketIterator.swift" + "HashTable/_HashTable+Constants.swift" + "HashTable/_HashTable+CustomStringConvertible.swift" + "HashTable/_Hashtable+Header.swift" + "HashTable/_HashTable+Testing.swift" + "HashTable/_HashTable+UnsafeHandle.swift" + + "OrderedDictionary/OrderedDictionary.swift" + "OrderedDictionary/OrderedDictionary+Codable.swift" + "OrderedDictionary/OrderedDictionary+CustomDebugStringConvertible.swift" + "OrderedDictionary/OrderedDictionary+CustomReflectable.swift" + "OrderedDictionary/OrderedDictionary+CustomStringConvertible.swift" + "OrderedDictionary/OrderedDictionary+Elements+SubSequence.swift" + "OrderedDictionary/OrderedDictionary+Elements.swift" + "OrderedDictionary/OrderedDictionary+Equatable.swift" + "OrderedDictionary/OrderedDictionary+ExpressibleByDictionaryLiteral.swift" + "OrderedDictionary/OrderedDictionary+Hashable.swift" + "OrderedDictionary/OrderedDictionary+Initializers.swift" + "OrderedDictionary/OrderedDictionary+Invariants.swift" + "OrderedDictionary/OrderedDictionary+Partial MutableCollection.swift" + "OrderedDictionary/OrderedDictionary+Partial RangeReplaceableCollection.swift" + "OrderedDictionary/OrderedDictionary+Sequence.swift" + "OrderedDictionary/OrderedDictionary+Values.swift" + "OrderedDictionary/OrderedDictionary+Deprecations.swift" + + "OrderedSet/OrderedSet.swift" + "OrderedSet/OrderedSet+Codable.swift" + "OrderedSet/OrderedSet+CustomDebugStringConvertible.swift" + "OrderedSet/OrderedSet+CustomReflectable.swift" + "OrderedSet/OrderedSet+CustomStringConvertible.swift" + "OrderedSet/OrderedSet+Diffing.swift" + "OrderedSet/OrderedSet+Equatable.swift" + "OrderedSet/OrderedSet+ExpressibleByArrayLiteral.swift" + "OrderedSet/OrderedSet+Hashable.swift" + "OrderedSet/OrderedSet+Initializers.swift" + "OrderedSet/OrderedSet+Insertions.swift" + "OrderedSet/OrderedSet+Invariants.swift" + "OrderedSet/OrderedSet+Partial MutableCollection.swift" + "OrderedSet/OrderedSet+Partial RangeReplaceableCollection.swift" + "OrderedSet/OrderedSet+Partial SetAlgebra+Basics.swift" + "OrderedSet/OrderedSet+Partial SetAlgebra+Operations.swift" + "OrderedSet/OrderedSet+Partial SetAlgebra+Predicates.swift" + "OrderedSet/OrderedSet+RandomAccessCollection.swift" + "OrderedSet/OrderedSet+ReserveCapacity.swift" + "OrderedSet/OrderedSet+SubSequence.swift" + "OrderedSet/OrderedSet+Testing.swift" + "OrderedSet/OrderedSet+UnorderedView.swift" + "OrderedSet/OrderedSet+UnstableInternals.swift" + + "Utilities/_UnsafeBitset.swift" + "Utilities/RandomAccessCollection+Offsets.swift") +set_target_properties(OrderedCollections PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY}) + +_install_target(OrderedCollections) +set_property(GLOBAL APPEND PROPERTY SWIFT_COLLECTIONS_EXPORTS OrderedCollections) diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Bucket.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Bucket.swift new file mode 100644 index 00000000..b912fe83 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Bucket.swift @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension _HashTable { + /// Identifies a particular bucket within a hash table by its offset. + /// Having a dedicated wrapper type for this prevents passing a bucket number + /// to a function that expects a word index, or vice versa. + @usableFromInline + @frozen + internal struct Bucket { + /// The distance of this bucket from the first bucket in the hash table. + @usableFromInline + internal var offset: Int + + @inlinable + @inline(__always) + internal init(offset: Int) { + assert(offset >= 0) + self.offset = offset + } + } +} + +extension _HashTable.Bucket: Equatable { + @_transparent + public static func == (left: Self, right: Self) -> Bool { + left.offset == right.offset + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+BucketIterator.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+BucketIterator.swift new file mode 100644 index 00000000..c4a62485 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+BucketIterator.swift @@ -0,0 +1,265 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension _HashTable { + /// An iterator construct for visiting a chain of buckets within the hash + /// table. This is a convenient tool for implementing linear probing. + /// + /// Beyond merely providing bucket values, bucket iterators can also tell + /// you their current oposition within the hash table, and (for mutable hash + /// tables) they allow you update the value of the currently visited bucket. + /// (This is useful when implementing simple insertions, for example.) + /// + /// The bucket iterator caches some bucket contents, so if you are looping + /// over an iterator you must be careful to only modify hash table contents + /// through the iterator itself. + /// + /// - Warning: Like `UnsafeHandle`, `BucketIterator` does not have + /// ownership of its underlying storage buffer. You must not escape + /// iterator values outside the closure call that produced the original + /// hash table. + @usableFromInline + internal struct BucketIterator { + @usableFromInline + internal typealias Bucket = _HashTable.Bucket + + /// The hash table we are iterating over. + internal let _hashTable: _UnsafeHashTable + + /// The current position within the hash table. + @usableFromInline + internal var _currentBucket: Bucket + + /// The raw bucket value corresponding to `_currentBucket`. + internal var _currentRawValue: UInt64 + + /// Remaining bits not yet processed from the last word read. + internal var _nextBits: UInt64 + + /// Count of usable bits in `_nextBits`. (They start at bit 0.) + internal var _remainingBitCount: Int + + internal var _wrappedAround = false + + /// Create a new iterator starting at the specified bucket. + @_effects(releasenone) + @usableFromInline + internal init(hashTable: _UnsafeHashTable, startingAt bucket: Bucket) { + assert(hashTable.scale >= _HashTable.minimumScale) + assert(bucket.offset >= 0 && bucket.offset < hashTable.bucketCount) + self._hashTable = hashTable + self._currentBucket = bucket + (self._currentRawValue, self._nextBits, self._remainingBitCount) + = hashTable._startIterator(bucket: bucket) + } + } +} + +extension _HashTable.UnsafeHandle { + @usableFromInline + internal typealias BucketIterator = _HashTable.BucketIterator + + @_effects(releasenone) + @inlinable + @inline(__always) + internal func idealBucket(forHashValue hashValue: Int) -> Bucket { + return Bucket(offset: hashValue & (bucketCount - 1)) + } + + @inlinable + @inline(__always) + internal func idealBucket(for element: Element) -> Bucket { + let hashValue = element._rawHashValue(seed: seed) + return idealBucket(forHashValue: hashValue) + } + + /// Return a bucket iterator for the chain starting at the bucket corresponding + /// to the specified value. + @inlinable + @inline(__always) + internal func bucketIterator(for element: Element) -> BucketIterator { + let bucket = idealBucket(for: element) + return bucketIterator(startingAt: bucket) + } + + /// Return a bucket iterator for the chain starting at the specified bucket. + @inlinable + @inline(__always) + internal func bucketIterator(startingAt bucket: Bucket) -> BucketIterator { + BucketIterator(hashTable: self, startingAt: bucket) + } + + @usableFromInline + @_effects(releasenone) + internal func startFind( + _ startBucket: Bucket + ) -> (iterator: BucketIterator, currentValue: Int?) { + let iterator = bucketIterator(startingAt: startBucket) + return (iterator, iterator.currentValue) + } + + @_effects(readonly) + @usableFromInline + internal func _startIterator( + bucket: Bucket + ) -> (currentBits: UInt64, nextBits: UInt64, remainingBitCount: Int) { + // The `scale == 5` case is special because the last word is only half filled there, + // which is why the code below needs to special case it. + // (For all scales > 5, the last bucket ends exactly on a word boundary.) + + var (word, bit) = self.position(of: bucket) + if bit + scale <= 64 { + // We're in luck, the current bucket is stored entirely within one word. + let w = self[word: word] + let currentRawValue = (w &>> bit) & bucketMask + let c = (scale == 5 && word == wordCount - 1 ? 32 : 64) + let remainingBitCount = c - (bit + scale) + let nextBits = (remainingBitCount == 0 ? 0 : w &>> (bit + scale)) + assert(remainingBitCount >= 0) + assert(bit < c) + return (currentRawValue, nextBits, remainingBitCount) + } else { + // We need to read two words. + assert(scale != 5 || word < wordCount - 1) + assert(bit > 0) + let w1 = self[word: word] + word = self.word(after: word) + let w2 = self[word: word] + let currentRawValue = ((w1 &>> bit) | (w2 &<< (64 - bit))) & bucketMask + let overhang = scale - (64 - bit) + let nextBits = w2 &>> overhang + let c = (scale == 5 && word == wordCount - 1 ? 32 : 64) + let remainingBitCount = c - overhang + return (currentRawValue, nextBits, remainingBitCount) + } + } +} + +extension _HashTable.BucketIterator { + /// The scale of the hash table. A table of scale *n* holds 2^*n* buckets, + /// each of which contain an *n*-bit value. + @inline(__always) + internal var _scale: Int { _hashTable.scale } + + /// The current position within the hash table. + @inlinable + @inline(__always) + internal var currentBucket: Bucket { _currentBucket } + + @usableFromInline + internal var isOccupied: Bool { + @_effects(readonly) + @inline(__always) + get { + _currentRawValue != 0 + } + } + + /// The value of the bucket at the current position in the hash table. + /// Setting this property overwrites the bucket value. + /// + /// A nil value indicates an empty bucket. + @usableFromInline + internal var currentValue: Int? { + @inline(__always) + @_effects(readonly) + get { _hashTable._value(forBucketContents: _currentRawValue) } + @_effects(releasenone) + set { + _hashTable.assertMutable() + let v = _hashTable._bucketContents(for: newValue) + let pattern = v ^ _currentRawValue + + assert(_currentBucket.offset < _hashTable.bucketCount) + let (word, bit) = _hashTable.position(of: _currentBucket) + _hashTable[word: word] ^= pattern &<< bit + let extractedBits = 64 - bit + if extractedBits < _scale { + let word2 = _hashTable.word(after: word) + _hashTable[word: word2] ^= pattern &>> extractedBits + } + _currentRawValue = v + } + } + + /// Advance this iterator to the next bucket within the hash table. + /// The buckets form a cycle, so the last bucket is logically followed + /// by the first. Therefore, the iterator never runs out of buckets -- + /// you must devise some way to guarantee to stop iterating. + /// + /// In the typical case, you stop iterating buckets when you find the + /// element you're looking for, or when you run across an empty bucket + /// (terminating the chain with a negative lookup result). + /// + /// To catch mistakes (and corrupt tables), `advance` traps the second + /// time it needs to wrap around to the beginning of the table. + @usableFromInline + @_effects(releasenone) + internal mutating func advance() { + // Advance to next bucket, checking for wraparound condition. + _currentBucket.offset &+= 1 + if _currentBucket.offset == _hashTable.bucketCount { + guard !_wrappedAround else { + // Prevent wasting battery in an infinite loop if a hash table + // somehow becomes corrupt. + fatalError("Hash table has no unoccupied buckets") + } + _wrappedAround = true + _currentBucket.offset = 0 + } + + // If we have loaded enough bits, eat them and return. + if _remainingBitCount >= _scale { + _currentRawValue = _nextBits & _hashTable.bucketMask + _nextBits &>>= _scale + _remainingBitCount -= _scale + return + } + + // Load the next batch of bits. + var word = _hashTable.position(of: _currentBucket).word + if _remainingBitCount != 0 { + word = _hashTable.word(after: word) + } + let c = (_hashTable.scale == 5 && word == _hashTable.wordCount - 1 ? 32 : 64) + let w = _hashTable[word: word] + _currentRawValue = (_nextBits | (w &<< _remainingBitCount)) & _hashTable.bucketMask + _nextBits = w &>> (_scale - _remainingBitCount) + _remainingBitCount = c - (_scale - _remainingBitCount) + } + + @usableFromInline + @_effects(releasenone) + internal mutating func findNext() -> Int? { + advance() + return currentValue + } + + /// Advance this iterator until it points to an occupied bucket with the + /// specified value, or an unoccupied bucket -- whichever comes first. + @inlinable + @_effects(releasenone) + internal mutating func advance(until expected: Int) { + while isOccupied && currentValue != expected { + advance() + } + } + + /// Advance this iterator until it points to an unoccupied bucket. + /// Useful when inserting an element that we know isn't already in the table. + @inlinable + @_effects(releasenone) + internal mutating func advanceToNextUnoccupiedBucket() { + while isOccupied { + advance() + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Constants.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Constants.swift new file mode 100644 index 00000000..84ef2dd5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Constants.swift @@ -0,0 +1,97 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension _HashTable { + /// The minimum hash table scale. + @usableFromInline + @inline(__always) + internal static var minimumScale: Int { + @_effects(readnone) + get { + 5 + } + } + + /// The maximum hash table scale. + @usableFromInline + @inline(__always) + internal static var maximumScale: Int { + @_effects(readnone) + get { + Swift.min(Int.bitWidth, 56) + } + } + + /// The maximum number of items for which we do not create a hash table. + @usableFromInline + @inline(__always) + internal static var maximumUnhashedCount: Int { + @_effects(readnone) + get { + (1 &<< (minimumScale - 1)) - 1 + } + } + + /// The maximum hash table load factor. + @inline(__always) + internal static var maximumLoadFactor: Double { 3 / 4 } + + /// The minimum hash table load factor. + @inline(__always) + internal static var minimumLoadFactor: Double { 1 / 4 } + + /// The maximum number of items that can be held in a hash table of the given scale. + @usableFromInline + @_effects(readnone) + internal static func minimumCapacity(forScale scale: Int) -> Int { + guard scale >= minimumScale else { return 0 } + let bucketCount = 1 &<< scale + return Int(Double(bucketCount) * minimumLoadFactor) + } + + /// The maximum number of items that can be held in a hash table of the given scale. + @usableFromInline + @_effects(readnone) + internal static func maximumCapacity(forScale scale: Int) -> Int { + guard scale >= minimumScale else { return maximumUnhashedCount } + let bucketCount = 1 &<< scale + return Int(Double(bucketCount) * maximumLoadFactor) + } + + /// The minimum hash table scale that can hold the specified number of elements. + @usableFromInline + @_effects(readnone) + internal static func scale(forCapacity capacity: Int) -> Int { + guard capacity > maximumUnhashedCount else { return 0 } + let capacity = Swift.max(capacity, 1) + // Calculate the minimum number of entries we need to allocate to satisfy + // the maximum load factor. `capacity + 1` below ensures that we always + // leave at least one hole. + let minimumEntries = Swift.max( + Int((Double(capacity) / maximumLoadFactor).rounded(.up)), + capacity + 1) + // The actual number of entries we need to allocate is the lowest power of + // two greater than or equal to the minimum entry count. Calculate its + // exponent. + let scale = (Swift.max(minimumEntries, 2) - 1)._binaryLogarithm() + 1 + assert(scale >= minimumScale && scale < Int.bitWidth) + // The scale is the exponent corresponding to the bucket count. + assert(self.maximumCapacity(forScale: scale) >= capacity) + return scale + } + + /// The count of 64-bit words that a hash table of the specified scale + /// will need to have in its storage. + internal static func wordCount(forScale scale: Int) -> Int { + ((scale &<< scale) + 63) / 64 + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+CustomStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+CustomStringConvertible.swift new file mode 100644 index 00000000..2c466312 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+CustomStringConvertible.swift @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// These are primarily for debugging. + +extension _HashTable.Header: CustomStringConvertible { + @usableFromInline + internal var _description: String { + "(scale: \(scale), reservedScale: \(reservedScale), bias: \(bias), seed: \(String(seed, radix: 16)))" + } + + @usableFromInline + internal var description: String { + "_HashTable.Header\(_description)" + } +} + +extension _HashTable.UnsafeHandle: CustomStringConvertible { + internal func _description(type: String) -> String { + var d = """ + \(type)\(_header.pointee._description) + load factor: \(debugLoadFactor()) + """ + if bucketCount < 128 { + d += "\n " + d += debugContents() + .lazy + .map { $0 == nil ? "_" : "\($0!)" } + .joined(separator: " ") + } + return d + } + + @usableFromInline + internal var description: String { + _description(type: "_HashTable.UnsafeHandle") + } +} + +extension _HashTable: CustomStringConvertible { + @usableFromInline + internal var description: String { + read { $0._description(type: "_HashTable") } + } +} + +extension _HashTable.Storage: CustomStringConvertible { + @usableFromInline + internal var description: String { + _HashTable(self).read { $0._description(type: "_HashTable.Storage") } + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Testing.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Testing.swift new file mode 100644 index 00000000..f27006fa --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+Testing.swift @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension _HashTable.Bucket: CustomStringConvertible { + public var description: String { "Bucket(@\(offset))"} +} + +extension _UnsafeHashTable { + internal func debugOccupiedCount() -> Int { + var count = 0 + var it = bucketIterator(startingAt: Bucket(offset: 0)) + repeat { + if it.isOccupied { + count += 1 + } + it.advance() + } while it.currentBucket.offset != 0 + return count + } + + internal func debugLoadFactor() -> Double { + return Double(debugOccupiedCount()) / Double(bucketCount) + } + + internal func debugContents() -> [Int?] { + var result: [Int?] = [] + result.reserveCapacity(bucketCount) + var it = bucketIterator(startingAt: Bucket(offset: 0)) + repeat { + result.append(it.currentValue) + it.advance() + } while it.currentBucket.offset != 0 + return result + } +} + +extension _UnsafeHashTable.BucketIterator: CustomStringConvertible { + @usableFromInline + var description: String { + func pad(_ s: String, to length: Int, by padding: Character = " ") -> String { + let c = s.count + guard c < length else { return s } + return String(repeating: padding, count: length - c) + s + } + let offset = pad(String(_currentBucket.offset), to: 4) + let value: String + if let v = currentValue { + value = pad(String(v), to: 4) + } else { + value = " nil" + } + let remainingBits = pad(String(_nextBits, radix: 2), to: _remainingBitCount, by: "0") + return "BucketIterator(scale: \(_scale), bucket: \(offset), value: \(value), bits: \(remainingBits) (\(_remainingBitCount) bits))" + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+UnsafeHandle.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+UnsafeHandle.swift new file mode 100644 index 00000000..ba8efcb4 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable+UnsafeHandle.swift @@ -0,0 +1,542 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@usableFromInline +internal typealias _UnsafeHashTable = _HashTable.UnsafeHandle + +extension _HashTable { + /// A non-owning handle to hash table storage, implementing higher-level + /// table operations. + /// + /// - Warning: `_UnsafeHashTable` values do not have ownership of their + /// underlying storage buffer. You must not escape these handles outside + /// the closure call that produced them. + @usableFromInline + @frozen + internal struct UnsafeHandle { + @usableFromInline + internal typealias Bucket = _HashTable.Bucket + + /// A pointer to the table header. + @usableFromInline + internal var _header: UnsafeMutablePointer
+ + /// A pointer to bucket storage. + @usableFromInline + internal var _buckets: UnsafeMutablePointer + + #if DEBUG + /// True when this handle does not support table mutations. + /// (This is only checked in debug builds.) + @usableFromInline + internal let _readonly: Bool + #endif + + /// Initialize a new hash table handle for storage at the supplied locations. + @inlinable + @inline(__always) + internal init( + header: UnsafeMutablePointer
, + buckets: UnsafeMutablePointer, + readonly: Bool + ) { + self._header = header + self._buckets = buckets + #if DEBUG + self._readonly = readonly + #endif + } + + /// Check that this handle supports mutating operations. + /// Every member that mutates table data must start by calling this function. + /// This helps preventing COW violations. + /// + /// Note that this is a noop in release builds. + @inlinable + @inline(__always) + func assertMutable() { + #if DEBUG + assert(!_readonly, "Attempt to mutate a hash table through a read-only handle") + #endif + } + } +} + +extension _HashTable.UnsafeHandle { + /// The scale of the hash table. A table of scale *n* holds 2^*n* buckets, + /// each of which contain an *n*-bit value. + @inlinable + @inline(__always) + internal var scale: Int { _header.pointee.scale } + + /// The scale corresponding to the last call to `reserveCapacity`. + /// We store this to make sure we don't shrink the table below its reserved size. + @inlinable + @inline(__always) + internal var reservedScale: Int { _header.pointee.reservedScale } + + /// The hasher seed to use within this hash table. + @inlinable + @inline(__always) + internal var seed: Int { _header.pointee.seed } + + /// A bias value that needs to be added to buckets to convert them into offsets + /// into element storage. (This allows O(1) insertions at the front when the + /// underlying storage supports it.) + @inlinable + @inline(__always) + internal var bias: Int { + get { _header.pointee.bias } + nonmutating set { _header.pointee.bias = newValue } + } + + /// The number of buckets within this hash table. This is always a power of two. + @inlinable + @inline(__always) + internal var bucketCount: Int { 1 &<< scale } + + @inlinable + @inline(__always) + internal var bucketMask: UInt64 { UInt64(truncatingIfNeeded: bucketCount) - 1 } + + /// The number of bits used to store all the buckets in this hash table. + /// Each bucket holds a value that is `scale` bits wide. + @inlinable + @inline(__always) + internal var bitCount: Int { scale &<< scale } + + /// The number of 64-bit words that are available in the storage buffer, + /// rounded up to the nearest whole number if necessary. + @inlinable + @inline(__always) + internal var wordCount: Int { (bitCount + UInt64.bitWidth - 1) / UInt64.bitWidth } + + /// The maximum number of items that can fit into this table. + @inlinable + @inline(__always) + internal var capacity: Int { _HashTable.maximumCapacity(forScale: scale) } + + /// Return the bucket logically following `bucket` in this hash table. + /// The buckets form a cycle, so the last bucket is logically followed by the first. + @inlinable + @inline(__always) + func bucket(after bucket: Bucket) -> Bucket { + var offset = bucket.offset + 1 + if offset == bucketCount { + offset = 0 + } + return Bucket(offset: offset) + } + + /// Return the bucket logically preceding `bucket` in this hash table. + /// The buckets form a cycle, so the first bucket is logically preceded by the last. + @inlinable + @inline(__always) + func bucket(before bucket: Bucket) -> Bucket { + let offset = (bucket.offset == 0 ? bucketCount : bucket.offset) - 1 + return Bucket(offset: offset) + } + + /// Return the index of the word logically following `word` in this hash table. + /// The buckets form a cycle, so the last word is logically followed by the first. + /// + /// Note that the last word may be only partially filled if `scale` is less than 6. + @inlinable + @inline(__always) + func word(after word: Int) -> Int { + var result = word + 1 + if result == wordCount { + result = 0 + } + return result + } + + /// Return the index of the word logically preceding `word` in this hash table. + /// The buckets form a cycle, so the first word is logically preceded by the first. + /// + /// Note that the last word may be only partially filled if `scale` is less than 6. + @inlinable + @inline(__always) + func word(before word: Int) -> Int { + if word == 0 { + return wordCount - 1 + } + return word - 1 + } + + /// Return the index of the 64-bit storage word that holds the first bit + /// corresponding to `bucket`, along with its bit position within the word. + @inlinable + internal func position(of bucket: Bucket) -> (word: Int, bit: Int) { + let start = bucket.offset &* scale + return (start &>> 6, start & 0x3F) + } +} + +extension _HashTable.UnsafeHandle { + /// Decode and return the logical value corresponding to the specified bucket value. + /// + /// The nil value is represented by an all-zero bit pattern. + /// Other values are stored as the complement of the lowest `scale` bits + /// after taking `bias` into account. + /// The range of representable values is `0 ..< bucketCount - 1`. + /// (Note that the value `bucketCount - 1` is missing from this range, as its + /// encoding is used for `nil`. This isn't an issue, because the maximum load + /// factor guarantees that the hash table will never be completely full.) + @inlinable + func _value(forBucketContents bucketContents: UInt64) -> Int? { + let mask = bucketMask + assert(bucketContents <= mask) + guard bucketContents != 0 else { return nil } + let v = (bucketContents ^ mask) &+ UInt64(truncatingIfNeeded: bias) + return Int(truncatingIfNeeded: v >= mask ? v - mask : v) + } + + /// Encodes the specified logical value into a `scale`-bit bit pattern suitable + /// for storing into a bucket. + /// + /// The nil value is represented by an all-zero bit pattern. + /// Other values are stored as the complement of their lowest `scale` bits. + /// The range of representable values is `0 ..< bucketCount - 1`. + /// (Note that the value `bucketCount - 1` is missing from this range, as it + /// its encoding is used for `nil`. This isn't an issue, because the maximum + /// load factor guarantees that the hash table will never be completely full.) + @inlinable + func _bucketContents(for value: Int?) -> UInt64 { + guard var value = value else { return 0 } + let mask = Int(truncatingIfNeeded: bucketMask) + assert(value >= 0 && value < mask) + value &-= bias + if value < 0 { value += mask } + assert(value >= 0 && value < mask) + return UInt64(truncatingIfNeeded: value ^ mask) + } + + @inlinable + subscript(word word: Int) -> UInt64 { + @inline(__always) get { + assert(word >= 0 && word < bucketCount) + return _buckets[word] + } + @inline(__always) nonmutating set { + assert(word >= 0 && word < bucketCount) + assertMutable() + _buckets[word] = newValue + } + } + + @inlinable + subscript(raw bucket: Bucket) -> UInt64 { + get { + assert(bucket.offset < bucketCount) + let (word, bit) = position(of: bucket) + var value = self[word: word] &>> bit + let extractedBits = 64 - bit + if extractedBits < scale { + let word2 = self.word(after: word) + value &= (1 &<< extractedBits) - 1 + value |= self[word: word2] &<< extractedBits + } + return value & bucketMask + } + nonmutating set { + assertMutable() + assert(bucket.offset < bucketCount) + let mask = bucketMask + assert(newValue <= mask) + let (word, bit) = position(of: bucket) + self[word: word] &= ~(mask &<< bit) + self[word: word] |= newValue &<< bit + let extractedBits = 64 - bit + if extractedBits < scale { + let word2 = self.word(after: word) + self[word: word2] &= ~((1 &<< (scale - extractedBits)) - 1) + self[word: word2] |= newValue &>> extractedBits + } + } + } + + @inlinable + @inline(__always) + func isOccupied(_ bucket: Bucket) -> Bool { + self[raw: bucket] != 0 + } + + /// Return or update the current value stored in the specified bucket. + /// A nil value indicates that the bucket is empty. + @inlinable + internal subscript(bucket: Bucket) -> Int? { + get { + let contents = self[raw: bucket] + return _value(forBucketContents: contents) + } + nonmutating set { + assertMutable() + let v = _bucketContents(for: newValue) + self[raw: bucket] = v + } + } +} + +extension _UnsafeHashTable { + @inlinable + internal func _find( + _ item: Base.Element, + in elements: Base + ) -> (index: Int?, bucket: Bucket) + where Base.Element: Hashable { + let start = idealBucket(for: item) + var (iterator, value) = startFind(start) + while let index = value { + if elements[_offset: index] == item { + return (index, iterator.currentBucket) + } + value = iterator.findNext() + } + return (nil, iterator.currentBucket) + } +} + +extension _UnsafeHashTable { + @usableFromInline + internal func firstOccupiedBucketInChain(with bucket: Bucket) -> Bucket { + var bucket = bucket + repeat { + bucket = self.bucket(before: bucket) + } while isOccupied(bucket) + return self.bucket(after: bucket) + } + + @inlinable + internal func delete( + bucket: Bucket, + hashValueGenerator: (Int, Int) -> Int // (offset, seed) -> hashValue + ) { + assertMutable() + var it = bucketIterator(startingAt: bucket) + assert(it.isOccupied) + it.advance() + guard it.isOccupied else { + // Fast path: Don't get the start bucket when there's nothing to do. + self[bucket] = nil + return + } + // If we've put a hole in the middle of a collision chain, some element after + // the hole may belong where the new hole is. + + // Find the first bucket in the collision chain that contains the entry we've just deleted. + let start = firstOccupiedBucketInChain(with: bucket) + var hole = bucket + + while it.isOccupied { + let hash = hashValueGenerator(it.currentValue!, seed) + let candidate = idealBucket(forHashValue: hash) + + // Does this element belong between start and hole? We need two + // separate tests depending on whether [start, hole] wraps around the + // end of the storage. + let c0 = candidate.offset >= start.offset + let c1 = candidate.offset <= hole.offset + if start.offset <= hole.offset ? (c0 && c1) : (c0 || c1) { + // Fill the hole. Here we are mutating table contents behind the back of + // the iterator; this is okay since we know we are never going to revisit + // `hole` with it. + self[hole] = it.currentValue + hole = it.currentBucket + } + it.advance() + } + self[hole] = nil + } +} + +extension _UnsafeHashTable { + @inlinable + internal func adjustContents( + preparingForInsertionOfElementAtOffset offset: Int, + in elements: Base + ) where Base.Element: Hashable { + assertMutable() + let index = elements._index(at: offset) + if offset < elements.count / 2 { + self.bias += 1 + if offset <= capacity / 3 { + var i = 1 + for item in elements[..= offset { + it.currentValue = value + 1 + } + it.advance() + } while it.currentBucket.offset != 0 + } + } + } +} + +extension _UnsafeHashTable { + @inlinable + @inline(__always) + internal func adjustContents( + preparingForRemovalOf index: Base.Index, + in elements: Base + ) where Base.Element: Hashable { + let next = elements.index(after: index) + adjustContents(preparingForRemovalOf: index ..< next, in: elements) + } + + @inlinable + internal func adjustContents( + preparingForRemovalOf bounds: Range, + in elements: Base + ) where Base.Element: Hashable { + assertMutable() + let startOffset = elements._offset(of: bounds.lowerBound) + let endOffset = elements._offset(of: bounds.upperBound) + let c = endOffset - startOffset + guard c > 0 else { return } + let remainingCount = elements.count - c + + if startOffset >= remainingCount / 2 { + let tailCount = elements.count - endOffset + if tailCount < capacity / 3 { + var i = endOffset + for item in elements[bounds.upperBound...] { + var it = self.bucketIterator(for: item) + it.advance(until: i) + it.currentValue = i - c + i += 1 + } + } else { + var it = bucketIterator(startingAt: Bucket(offset: 0)) + repeat { + if let value = it.currentValue { + if value >= endOffset { + it.currentValue = value - c + } else { + assert(value < startOffset) + } + } + it.advance() + } while it.currentBucket.offset != 0 + } + } else { + if startOffset < capacity / 3 { + var i = 0 + for item in elements[..= endOffset) + } + } + it.advance() + } while it.currentBucket.offset != 0 + } + self.bias -= c + } + } +} + +extension _UnsafeHashTable { + @usableFromInline + internal func clear() { + assertMutable() + _buckets.assign(repeating: 0, count: wordCount) + } +} + +extension _UnsafeHashTable { + /// Fill an empty hash table by populating it with data from `elements`. + /// + /// - Parameter elements: A random-access collection for which this table is being generated. + @inlinable + internal func fill( + uncheckedUniqueElements elements: C + ) where C.Element: Hashable { + assertMutable() + assert(elements.count <= capacity) + // Iterate over elements and insert their offset into the hash table. + var offset = 0 + for index in elements.indices { + // Find the insertion position. We know that we're inserting a new item, + // so there is no need to compare it with any of the existing ones. + var it = bucketIterator(for: elements[index]) + it.advanceToNextUnoccupiedBucket() + it.currentValue = offset + offset += 1 + } + } + + /// Fill an empty hash table by populating it with data from `elements`. + /// + /// - Parameter elements: A random-access collection for which this table is being generated. + /// - Parameter stoppingOnFirstDuplicateValue: If true, check for duplicate values and stop inserting items when one is found. + /// - Returns: `(success, index)` where `success` is a boolean value indicating that every value in `elements` was successfully inserted. A false success indicates that duplicate elements have been found; in this case `index` points to the first duplicate value; otherwise `index` is set to `elements.endIndex`. + @inlinable + internal func fill( + untilFirstDuplicateIn elements: C + ) -> (success: Bool, end: C.Index) + where C.Element: Hashable { + assertMutable() + assert(elements.count <= capacity) + // Iterate over elements and insert their offset into the hash table. + var offset = 0 + for index in elements.indices { + // Find the insertion position. We know that we're inserting a new item, + // so there is no need to compare it with any of the existing ones. + var it = bucketIterator(for: elements[index]) + while let offset = it.currentValue { + guard elements[_offset: offset] != elements[index] else { + return (false, index) + } + it.advance() + } + it.currentValue = offset + offset += 1 + } + return (true, elements.endIndex) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable.swift new file mode 100644 index 00000000..319a65ff --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_HashTable.swift @@ -0,0 +1,202 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +@usableFromInline +@frozen +internal struct _HashTable { + @usableFromInline + internal var _storage: Storage + + @inlinable + @inline(__always) + internal init(_ storage: Storage) { + _storage = storage + } +} + +extension _HashTable { + /// A class holding hash table storage for a `OrderedSet` collection. + /// Values in the hash table are offsets into separate element storage, so + /// this class doesn't need to be generic over `OrderedSet`'s `Element` type. + @usableFromInline + internal final class Storage + : ManagedBuffer + {} +} + +extension _HashTable { + /// Allocate a new empty hash table buffer of the specified scale. + @usableFromInline + @_effects(releasenone) + internal init(scale: Int, reservedScale: Int = 0) { + assert(scale >= Self.minimumScale && scale <= Self.maximumScale) + let wordCount = Self.wordCount(forScale: scale) + let storage = Storage.create( + minimumCapacity: wordCount, + makingHeaderWith: { object in + #if COLLECTIONS_DETERMINISTIC_HASHING + let seed = scale << 6 + #else + let seed = Int(bitPattern: Unmanaged.passUnretained(object).toOpaque()) + #endif + return Header(scale: scale, reservedScale: reservedScale, seed: seed) + }) + storage.withUnsafeMutablePointerToElements { elements in + elements.initialize(repeating: 0, count: wordCount) + } + self.init(unsafeDowncast(storage, to: Storage.self)) + } + + /// Populate a new hash table with data from `elements`. + /// + /// - Parameter scale: The desired hash table scale or nil to use the minimum scale that satisfies invariants. + /// - Parameter reservedScale: The reserved scale to remember in the returned storage. + /// - Parameter duplicates: The strategy to use to handle duplicate items. + /// - Returns: `(storage, index)` where `storage` is a storage instance. The contents of `storage` reflects all elements in `contents[contents.startIndex ..< index]`. `index` is usually `contents.endIndex`, except when the function was asked to reject duplicates, in which case `index` addresses the first duplicate element in `contents` (if any). + @inlinable + @inline(never) + @_effects(releasenone) + static func create( + uncheckedUniqueElements elements: C, + scale: Int? = nil, + reservedScale: Int = 0 + ) -> _HashTable? + where C.Element: Hashable { + let minScale = Self.scale(forCapacity: elements.count) + let scale = Swift.max(Swift.max(scale ?? 0, minScale), + reservedScale) + if scale < Self.minimumScale { return nil } + let hashTable = Self(scale: scale, reservedScale: reservedScale) + hashTable.update { handle in + handle.fill(uncheckedUniqueElements: elements) + } + return hashTable + } + + /// Populate a new hash table with data from `elements`. + /// + /// - Parameter scale: The desired hash table scale or nil to use the minimum scale that satisfies invariants. + /// - Parameter reservedScale: The reserved scale to remember in the returned storage. + /// - Parameter duplicates: The strategy to use to handle duplicate items. + /// - Returns: `(storage, index)` where `storage` is a storage instance. The contents of `storage` reflects all elements in `contents[contents.startIndex ..< index]`. `index` is usually `contents.endIndex`, except when the function was asked to reject duplicates, in which case `index` addresses the first duplicate element in `contents` (if any). + @inlinable + @inline(never) + @_effects(releasenone) + static func create( + untilFirstDuplicateIn elements: C, + scale: Int? = nil, + reservedScale: Int = 0 + ) -> (hashTable: _HashTable?, end: C.Index) + where C.Element: Hashable { + let minScale = Self.scale(forCapacity: elements.count) + let scale = Swift.max(Swift.max(scale ?? 0, minScale), + reservedScale) + if scale < Self.minimumScale { + // Don't hash anything. + if elements.count < 2 { return (nil, elements.endIndex) } + var temp: [C.Element] = [] + temp.reserveCapacity(elements.count) + for i in elements.indices { + let item = elements[i] + guard !temp.contains(item) else { return (nil, i) } + temp.append(item) + } + return (nil, elements.endIndex) + } + let hashTable = Self(scale: scale, reservedScale: reservedScale) + let (_, index) = hashTable.update { handle in + handle.fill(untilFirstDuplicateIn: elements) + } + return (hashTable, index) + } + + /// Create and return a new copy of this instance. The result has the same + /// scale and seed, and contains the exact same bucket data as the original instance. + @usableFromInline + @_effects(releasenone) + internal func copy() -> _HashTable { + self.read { handle in + let wordCount = handle.wordCount + let new = Storage.create( + minimumCapacity: wordCount, + makingHeaderWith: { _ in handle._header.pointee }) + new.withUnsafeMutablePointerToElements { elements in + elements.initialize(from: handle._buckets, count: wordCount) + } + return Self(unsafeDowncast(new, to: Storage.self)) + } + } +} + + + +extension _HashTable { + /// Call `body` with a hash table handle suitable for read-only use. + /// + /// - Warning: The handle supplied to `body` is only valid for the duration of + /// the closure call. The closure must not escape it outside the call. + @inlinable + @inline(__always) + internal func read(_ body: (_UnsafeHashTable) throws -> R) rethrows -> R { + try _storage.withUnsafeMutablePointers { header, elements in + let handle = _UnsafeHashTable(header: header, buckets: elements, readonly: true) + return try body(handle) + } + } + + /// Call `body` with a hash table handle suitable for mutating use. + /// + /// - Warning: The handle supplied to `body` is only valid for the duration of + /// the closure call. The closure must not escape it outside the call. + @inlinable + @inline(__always) + internal func update(_ body: (_UnsafeHashTable) throws -> R) rethrows -> R { + try _storage.withUnsafeMutablePointers { header, elements in + let handle = _UnsafeHashTable(header: header, buckets: elements, readonly: false) + return try body(handle) + } + } +} + +extension _HashTable { + @inlinable + internal var header: Header { + get { _storage.header } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + nonmutating _modify { yield &_storage.header } + } + + @inlinable + internal var capacity: Int { + _storage.header.capacity + } + + @inlinable + internal var minimumCapacity: Int { + if scale == reservedScale { return 0 } + return Self.minimumCapacity(forScale: scale) + } + + @inlinable + internal var scale: Int { + _storage.header.scale + } + + @inlinable + internal var reservedScale: Int { + _storage.header.reservedScale + } + + @inlinable + internal var bias: Int { + _storage.header.bias + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_Hashtable+Header.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_Hashtable+Header.swift new file mode 100644 index 00000000..93ceb246 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/HashTable/_Hashtable+Header.swift @@ -0,0 +1,99 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension _HashTable { + /// The storage header for hash table buffers. + /// + /// Note that we don't store the number of items currently in the table; + /// that information can be easily retrieved from the element storage. + @usableFromInline + internal struct Header { + /// We are packing the scale data into the lower bits of the seed & bias + /// to saves a bit of space that would be otherwise taken up by padding. + /// + /// Layout: + /// + /// 63 6 5 0 + /// ├──────────────────────────────────────────────┼────────┤ + /// │ seed │ scale │ + /// └──────────────────────────────────────────────┴────────┘ + /// 63 6 5 0 + /// ├──────────────────────────────────────────────┼────────┤ + /// │ bias │ rsvd │ + /// └──────────────────────────────────────────────┴────────┘ + @usableFromInline + var _scaleAndSeed: UInt64 + @usableFromInline + var _reservedScaleAndBias: UInt64 + + init(scale: Int, reservedScale: Int, seed: Int) { + assert(scale >= _HashTable.minimumScale && scale <= _HashTable.maximumScale) + assert(reservedScale >= 0 && reservedScale <= _HashTable.maximumScale) + _scaleAndSeed = UInt64(truncatingIfNeeded: seed) << (Swift.max(UInt64.bitWidth - Int.bitWidth, 6)) + _scaleAndSeed &= ~0x3F + _scaleAndSeed |= UInt64(truncatingIfNeeded: scale) + _reservedScaleAndBias = UInt64(truncatingIfNeeded: reservedScale) + assert(self.scale == scale) + assert(self.reservedScale == reservedScale) + assert(self.bias == 0) + } + + /// The scale of the hash table. A table of scale *n* holds 2^*n* buckets, + /// each of which contain an *n*-bit value. + @inlinable + @inline(__always) + var scale: Int { Int(_scaleAndSeed & 0x3F) } + + /// The scale corresponding to the last call to `reserveCapacity`. + /// We remember this here to make sure we don't shrink the table below its reserved size. + @inlinable + var reservedScale: Int { + @inline(__always) + get { Int(_reservedScaleAndBias & 0x3F) } + set { + assert(newValue >= 0 && newValue < 64) + _reservedScaleAndBias &= ~0x3F + _reservedScaleAndBias |= UInt64(truncatingIfNeeded: newValue) & 0x3F + } + } + + /// The hasher seed to use within this hash table. + @inlinable + @inline(__always) + var seed: Int { + Int(truncatingIfNeeded: _scaleAndSeed) + } + + /// A bias value that needs to be added to buckets to convert them into offsets + /// into element storage. (This allows O(1) insertions at the front when the + /// underlying storage supports it.) + @inlinable + var bias: Int { + @inline(__always) + get { Int(truncatingIfNeeded: _reservedScaleAndBias) &>> 6 } + set { + let limit = (1 &<< scale) - 1 + var bias = newValue + if bias < 0 { bias += limit } + if bias >= limit { bias -= limit } + assert(bias >= 0 && bias < limit) + _reservedScaleAndBias &= 0x3F + _reservedScaleAndBias |= UInt64(truncatingIfNeeded: bias) &<< 6 + assert(self.bias >= 0 && self.bias < limit) + } + } + + /// The maximum number of items that can fit into this table. + @inlinable + @inline(__always) + var capacity: Int { _HashTable.maximumCapacity(forScale: scale) } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Codable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Codable.swift new file mode 100644 index 00000000..61a9808c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Codable.swift @@ -0,0 +1,87 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: Encodable where Key: Encodable, Value: Encodable { + /// Encodes the contents of this dictionary into the given encoder. + /// + /// The dictionary's contents are encoded as alternating key-value pairs in + /// an unkeyed container. + /// + /// This function throws an error if any values are invalid for the given + /// encoder's format. + /// + /// - Note: Unlike the standard `Dictionary` type, ordered dictionaries + /// always encode themselves into an unkeyed container, because + /// `Codable`'s keyed containers do not guarantee that they preserve the + /// ordering of the items they contain. (And in popular encoding formats, + /// keyed containers tend to map to unordered data structures -- e.g., + /// JSON's "object" construct is explicitly unordered.) + /// + /// - Parameter encoder: The encoder to write data to. + @inlinable + public func encode(to encoder: Encoder) throws { + // Encode contents as an array of alternating key-value pairs. + var container = encoder.unkeyedContainer() + for (key, value) in self { + try container.encode(key) + try container.encode(value) + } + } +} + +extension OrderedDictionary: Decodable where Key: Decodable, Value: Decodable { + /// Creates a new dictionary by decoding from the given decoder. + /// + /// `OrderedDictionary` expects its contents to be encoded as alternating + /// key-value pairs in an unkeyed container. + /// + /// This initializer throws an error if reading from the decoder fails, or + /// if the decoded contents are not in the expected format. + /// + /// - Note: Unlike the standard `Dictionary` type, ordered dictionaries + /// always encode themselves into an unkeyed container, because + /// `Codable`'s keyed containers do not guarantee that they preserve the + /// ordering of the items they contain. (And in popular encoding formats, + /// keyed containers tend to map to unordered data structures -- e.g., + /// JSON's "object" construct is explicitly unordered.) + /// + /// - Parameter decoder: The decoder to read data from. + @inlinable + public init(from decoder: Decoder) throws { + // We expect to be encoded as an array of alternating key-value pairs. + var container = try decoder.unkeyedContainer() + + self.init() + while !container.isAtEnd { + let key = try container.decode(Key.self) + let (index, bucket) = self._keys._find(key) + guard index == nil else { + let context = DecodingError.Context( + codingPath: container.codingPath, + debugDescription: "Duplicate key at offset \(container.currentIndex - 1)") + throw DecodingError.dataCorrupted(context) + } + + guard !container.isAtEnd else { + throw DecodingError.dataCorrupted( + DecodingError.Context( + codingPath: container.codingPath, + debugDescription: "Unkeyed container reached end before value in key-value pair" + ) + ) + } + let value = try container.decode(Value.self) + _keys._appendNew(key, in: bucket) + _values.append(value) + } + _checkInvariants() + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomDebugStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomDebugStringConvertible.swift new file mode 100644 index 00000000..4bc122a3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomDebugStringConvertible.swift @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: CustomDebugStringConvertible { + /// A textual representation of this instance, suitable for debugging. + public var debugDescription: String { + _debugDescription(typeName: _debugTypeName()) + } + + internal func _debugTypeName() -> String { + "OrderedDictionary<\(Key.self), \(Value.self)>" + } + + internal func _debugDescription(typeName: String) -> String { + var result = "\(typeName)(" + if isEmpty { + result += "[:]" + } else { + result += "[" + var first = true + for (key, value) in self { + if first { + first = false + } else { + result += ", " + } + debugPrint(key, terminator: "", to: &result) + result += ": " + debugPrint(value, terminator: "", to: &result) + } + result += "]" + } + result += ")" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomReflectable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomReflectable.swift new file mode 100644 index 00000000..82a5d37c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomReflectable.swift @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: CustomReflectable { + /// The custom mirror for this instance. + public var customMirror: Mirror { + Mirror(self, unlabeledChildren: self.elements, displayStyle: .dictionary) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomStringConvertible.swift new file mode 100644 index 00000000..eb40ebab --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+CustomStringConvertible.swift @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: CustomStringConvertible { + /// A textual representation of this instance. + public var description: String { + if isEmpty { return "[:]" } + var result = "[" + var first = true + for (key, value) in self { + if first { + first = false + } else { + result += ", " + } + result += "\(key): \(value)" + } + result += "]" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Deprecations.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Deprecations.swift new file mode 100644 index 00000000..a8e531d8 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Deprecations.swift @@ -0,0 +1,52 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + /// Accesses the element at the specified index. + /// + /// - Parameter offset: The offset of the element to access, measured from + /// the start of the collection. `offset` must be greater than or equal to + /// `0` and less than `count`. + /// + /// - Complexity: O(1) + @available(*, unavailable, // deprecated in 0.0.6, obsoleted in 1.0.0 + message: "Please use `elements[offset]`") + @inlinable + @inline(__always) + public subscript(offset offset: Int) -> Element { + fatalError() + } +} + +extension OrderedDictionary { + @available(*, unavailable, // deprecated in 0.0.6, obsoleted in 1.0.0 + renamed: "updateValue(forKey:default:with:)") + @inlinable + public mutating func modifyValue( + forKey key: Key, + default defaultValue: @autoclosure () -> Value, + _ body: (inout Value) throws -> R + ) rethrows -> R { + fatalError() + } + + @available(*, unavailable, // deprecated in 0.0.6, obsoleted in 1.0.0 + renamed: "updateValue(forKey:insertingDefault:at:with:)") + @inlinable + public mutating func modifyValue( + forKey key: Key, + insertingDefault defaultValue: @autoclosure () -> Value, + at index: Int, + _ body: (inout Value) throws -> R + ) rethrows -> R { + fatalError() + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements+SubSequence.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements+SubSequence.swift new file mode 100644 index 00000000..ee7ccc1e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements+SubSequence.swift @@ -0,0 +1,330 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary.Elements { + /// A collection that represents a contiguous slice of an ordered dictionary. + /// + /// Ordered dictionary slices are random access collections that + /// support efficient key-based lookups. + @frozen + public struct SubSequence { + @usableFromInline + internal var _base: OrderedDictionary + @usableFromInline + internal var _bounds: Range + + @inlinable + @inline(__always) + internal init(_base: OrderedDictionary, bounds: Range) { + self._base = _base + self._bounds = bounds + } + } +} + +extension OrderedDictionary.Elements.SubSequence { + /// A read-only collection view containing the keys in this slice. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var keys: OrderedSet.SubSequence { + _base._keys[_bounds] + } + + /// A read-only collection view containing the values in this slice. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var values: OrderedDictionary.Values.SubSequence { + _base.values[_bounds] + } +} + +extension OrderedDictionary.Elements.SubSequence { + /// Returns the index for the given key. + /// + /// If the given key is found in the dictionary slice, this method returns an + /// index into the dictionary that corresponds with the key-value pair. + /// + /// let countryCodes: OrderedDictionary = ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"] + /// let slice = countryCodes.elements[1...] + /// let index = slice.index(forKey: "JP") + /// + /// print("Country code for \(countryCodes[offset: index!].value): '\(countryCodes[offset: index!].key)'.") + /// // Prints "Country code for Japan: 'JP'." + /// + /// - Parameter key: The key to find in the dictionary slice. + /// + /// - Returns: The index for `key` and its associated value if `key` is in + /// the dictionary slice; otherwise, `nil`. + /// + /// - Complexity: Expected to be O(1) on average, if `Key` implements + /// high-quality hashing. + @inlinable + public func index(forKey key: Key) -> Int? { + guard let index = _base.index(forKey: key) else { return nil } + guard _bounds.contains(index) else { return nil } + return index + } +} + +extension OrderedDictionary.Elements.SubSequence: Sequence { + // A type representing the collection’s elements. + public typealias Element = OrderedDictionary.Element + + /// The type that allows iteration over the collection's elements. + @frozen + public struct Iterator: IteratorProtocol { + @usableFromInline + internal var _base: OrderedDictionary + + @usableFromInline + internal var _end: Int + + @usableFromInline + internal var _index: Int + + @inlinable + @inline(__always) + internal init(_base: OrderedDictionary.Elements.SubSequence) { + self._base = _base._base + self._end = _base._bounds.upperBound + self._index = _base._bounds.lowerBound + } + + /// Advances to the next element and returns it, or `nil` if no next + /// element exists. + /// + /// - Complexity: O(1) + @inlinable + public mutating func next() -> Element? { + guard _index < _end else { return nil } + defer { _index += 1 } + return (_base._keys[_index], _base._values[_index]) + } + } + + /// Returns an iterator over the elements of this dictionary slice. + @inlinable + @inline(__always) + public func makeIterator() -> Iterator { + Iterator(_base: self) + } +} + +extension OrderedDictionary.Elements.SubSequence: RandomAccessCollection { + /// The index type for an ordered dictionary: `Int`. + /// + /// The indices are integer offsets from the start of the original + /// (unsliced) collection. + public typealias Index = Int + + /// The type that represents the indices that are valid for subscripting an + /// ordered dictionary, in ascending order. + public typealias Indices = Range + + /// Ordered dictionary subsequences are self-slicing. + public typealias SubSequence = Self + + /// The position of the first element in a nonempty ordered dictionary slice. + /// + /// Note that instances of `OrderedDictionary.SubSequence` generally + /// don't have a `startIndex` with an offset of zero. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { _bounds.lowerBound } + + /// The "past the end" position---that is, the position one greater + /// than the last valid subscript argument. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { _bounds.upperBound } + + /// The indices that are valid for subscripting the collection, + /// in ascending order. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var indices: Range { _bounds } + + /// Returns the position immediately after the given index. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the dictionary. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { i + 1 } + + /// Returns the position immediately before the given index. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the dictionary. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { i - 1 } + + /// Replaces the given index with its successor. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the dictionary. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { i += 1 } + + /// Replaces the given index with its predecessor. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the dictionary. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { i -= 1 } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, or the returned value will not be a valid index. + /// + /// - Parameters: + /// - i: A valid index of the dictionary. + /// - distance: The distance to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls to + /// `index(after:)`. If `distance` is negative, this is the same value as + /// the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, unless the index passed as `limit` prevents offsetting + /// beyond those bounds. (Otherwise the returned value won't be a valid index + /// in the set.) + /// + /// - Parameters: + /// - i: A valid index of the dictionary. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the collection to use as a limit. If + /// `distance > 0`, `limit` has no effect if it is less than `i`. + /// Likewise, if `distance < 0`, `limit` has no effect if it is greater + /// than `i`. + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + _base._values.index(i, offsetBy: distance, limitedBy: limit) + } + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. If `end` is equal to + /// `start`, the result is zero. + /// + /// - Returns: The distance between `start` and `end`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + end - start + } + + /// Accesses the element at the specified position. + /// + /// - Parameter index: The position of the element to access. `index` must be + /// greater than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + public subscript(position: Int) -> Element { + precondition(_bounds.contains(position), "Index out of range") + return (_base._keys[position], _base._values[position]) + } + + /// Accesses a contiguous subrange of the dictionary's elements. + /// + /// The returned `Subsequence` instance uses the same indices for the same + /// elements as the original dictionary. In particular, that slice, unlike an + /// `OrderedDictionary`, may have a nonzero `startIndex.offset` and an + /// `endIndex.offset` that is not equal to `count`. Always use the slice's + /// `startIndex` and `endIndex` properties instead of assuming that its + /// indices start or end at a particular value. + /// + /// - Parameter bounds: A range of valid indices in the dictionary. + /// + /// - Complexity: O(1) + @inlinable + public subscript(bounds: Range) -> SubSequence { + precondition( + bounds.lowerBound >= _bounds.lowerBound + && bounds.upperBound <= _bounds.upperBound, + "Index out of range") + return Self(_base: _base, bounds: bounds) + } + + /// A Boolean value indicating whether the collection is empty. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var isEmpty: Bool { _bounds.isEmpty } + + /// The number of elements in the dictionary. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _bounds.count } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements.swift new file mode 100644 index 00000000..50116a81 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Elements.swift @@ -0,0 +1,653 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + /// A view of the contents of an ordered dictionary as a random-access + /// collection. + @frozen + public struct Elements { + @usableFromInline + internal var _base: OrderedDictionary + + @inlinable + @inline(__always) + internal init(_base: OrderedDictionary) { + self._base = _base + } + } +} + +extension OrderedDictionary { + /// A view of the contents of this dictionary as a random-access collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var elements: Elements { + get { + Elements(_base: self) + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var elements = Elements(_base: self) + self = Self() + defer { self = elements._base } + yield &elements + } + } +} + +extension OrderedDictionary.Elements { + /// A read-only collection view containing the keys in this collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var keys: OrderedSet { + _base._keys + } + + /// A mutable collection view containing the values in this collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var values: OrderedDictionary.Values { + get { + _base.values + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var values = OrderedDictionary.Values(_base: _base) + self = Self(_base: .init()) + defer { self._base = values._base } + yield &values + } + } +} + +extension OrderedDictionary.Elements { + /// Returns the index for the given key. + /// + /// If the given key is found in the dictionary, this method returns an index + /// into the dictionary that corresponds with the key-value pair. + /// + /// let countryCodes: OrderedDictionary = ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"] + /// let index = countryCodes.elements.index(forKey: "JP") + /// + /// print("Country code for \(countryCodes[offset: index!].value): '\(countryCodes[offset: index!].key)'.") + /// // Prints "Country code for Japan: 'JP'." + /// + /// - Parameter key: The key to find in the dictionary. + /// + /// - Returns: The index for `key` and its associated value if `key` is in + /// the dictionary; otherwise, `nil`. + /// + /// - Complexity: Expected to be O(1) on average, if `Key` implements + /// high-quality hashing. + @inlinable + public func index(forKey key: Key) -> Int? { + _base.index(forKey: key) + } +} + +extension OrderedDictionary.Elements: Sequence { + /// The element type of the collection. + public typealias Element = (key: Key, value: Value) + + @inlinable + public var underestimatedCount: Int { _base.count } + + @inlinable + public func makeIterator() -> OrderedDictionary.Iterator { + _base.makeIterator() + } +} + +extension OrderedDictionary.Elements: RandomAccessCollection { + /// The index type for an ordered dictionary: `Int`. + /// + /// Indices in `Elements` are integer offsets from the start of the + /// collection. + public typealias Index = Int + + /// The type that represents the indices that are valid for subscripting the + /// `Elements` collection, in ascending order. + public typealias Indices = Range + + /// The position of the first element in a nonempty dictionary. + /// + /// For an instance of `OrderedDictionary.Elements`, `startIndex` is always + /// zero. If the dictionary is empty, `startIndex` is equal to `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { 0 } + + /// The collection's "past the end" position---that is, the position one + /// greater than the last valid subscript argument. + /// + /// In `OrderedDictionary.Elements`, `endIndex` always equals the count of + /// elements. If the dictionary is empty, `endIndex` is equal to `startIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { _base.count } + + /// Returns the position immediately after the given index. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { i + 1 } + + /// Returns the position immediately before the given index. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { i - 1 } + + /// Replaces the given index with its successor. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { i += 1 } + + /// Replaces the given index with its predecessor. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { i -= 1 } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, or the returned value will not be a valid index. + /// + /// - Parameters: + /// - i: A valid index of the collection. + /// - distance: The distance to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls to + /// `index(after:)`. If `distance` is negative, this is the same value as + /// the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, unless the index passed as `limit` prevents offsetting + /// beyond those bounds. (Otherwise the returned value won't be a valid index + /// in the collection.) + /// + /// - Parameters: + /// - i: A valid index of the collection. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the collection to use as a limit. If + /// `distance > 0`, `limit` has no effect if it is less than `i`. + /// Likewise, if `distance < 0`, `limit` has no effect if it is greater + /// than `i`. + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + _base._values.index(i, offsetBy: distance, limitedBy: limit) + } + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. If `end` is equal to + /// `start`, the result is zero. + /// + /// - Returns: The distance between `start` and `end`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + end - start + } + + /// Accesses the element at the specified position. + /// + /// - Parameter index: The position of the element to access. `index` must be + /// greater than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public subscript(position: Int) -> Element { + (_base._keys[position], _base._values[position]) + } + + /// Accesses a contiguous subrange of the dictionary's elements. + /// + /// The returned `Subsequence` instance uses the same indices for the same + /// elements as the original collection. In particular, the slice, unlike an + /// `Elements`, may have a nonzero `startIndex` and an `endIndex` that is not + /// equal to `count`. Always use the slice's `startIndex` and `endIndex` + /// properties instead of assuming that its indices start or end at a + /// particular value. + /// + /// - Parameter bounds: A range of valid indices in the collection. + /// + /// - Complexity: O(1) + public subscript(bounds: Range) -> SubSequence { + _failEarlyRangeCheck(bounds, bounds: startIndex ..< endIndex) + return SubSequence(_base: _base, bounds: bounds) + } + + /// A Boolean value indicating whether the collection is empty. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var isEmpty: Bool { _base.isEmpty } + + /// The number of elements in the dictionary. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _base.count } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: Range) { + _base._values._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: ClosedRange) { + _base._values._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ range: Range, bounds: Range) { + _base._values._failEarlyRangeCheck(range, bounds: bounds) + } +} + +extension OrderedDictionary.Elements: CustomStringConvertible { + public var description: String { + _base.description + } +} + +extension OrderedDictionary.Elements: CustomDebugStringConvertible { + public var debugDescription: String { + _base._debugDescription( + typeName: "OrderedDictionary<\(Key.self), \(Value.self)>.Elements") + } +} + +extension OrderedDictionary.Elements: CustomReflectable { + public var customMirror: Mirror { + Mirror(self, unlabeledChildren: self, displayStyle: .collection) + } +} + +extension OrderedDictionary.Elements: Equatable where Value: Equatable { + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + left._base == right._base + } +} + +extension OrderedDictionary.Elements: Hashable where Value: Hashable { + @inlinable + public func hash(into hasher: inout Hasher) { + _base.hash(into: &hasher) + } +} + +// MARK: Partial `MutableCollection` + +extension OrderedDictionary.Elements { + /// Exchanges the key-value pairs at the specified indices of the dictionary. + /// + /// Both parameters must be valid indices below `endIndex`. Passing the same + /// index as both `i` and `j` has no effect. + /// + /// - Parameters: + /// - i: The index of the first value to swap. + /// - j: The index of the second value to swap. + /// + /// - Complexity: O(1) when the dictionary's storage isn't shared with another + /// value; O(`count`) otherwise. + @inlinable + @inline(__always) + public mutating func swapAt(_ i: Int, _ j: Int) { + _base.swapAt(i, j) + } + + /// Reorders the elements of the dictionary such that all the elements that + /// match the given predicate are after all the elements that don't match. + /// + /// After partitioning a collection, there is a pivot index `p` where + /// no element before `p` satisfies the `belongsInSecondPartition` + /// predicate and every element at or after `p` satisfies + /// `belongsInSecondPartition`. + /// + /// - Parameter belongsInSecondPartition: A predicate used to partition + /// the collection. All elements satisfying this predicate are ordered + /// after all elements not satisfying it. + /// - Returns: The index of the first element in the reordered collection + /// that matches `belongsInSecondPartition`. If no elements in the + /// collection match `belongsInSecondPartition`, the returned index is + /// equal to the collection's `endIndex`. + /// + /// - Complexity: O(`count`) + @inlinable + @inline(__always) + public mutating func partition( + by belongsInSecondPartition: (Element) throws -> Bool + ) rethrows -> Int { + try _base.partition(by: belongsInSecondPartition) + } +} + +extension OrderedDictionary.Elements { + /// Sorts the collection in place, using the given predicate as the + /// comparison between elements. + /// + /// When you want to sort a collection of elements that don't conform to + /// the `Comparable` protocol, pass a closure to this method that returns + /// `true` when the first element should be ordered before the second. + /// + /// Alternatively, use this method to sort a collection of elements that do + /// conform to `Comparable` when you want the sort to be descending instead + /// of ascending. Pass the greater-than operator (`>`) operator as the + /// predicate. + /// + /// `areInIncreasingOrder` must be a *strict weak ordering* over the + /// elements. That is, for any elements `a`, `b`, and `c`, the following + /// conditions must hold: + /// + /// - `areInIncreasingOrder(a, a)` is always `false`. (Irreflexivity) + /// - If `areInIncreasingOrder(a, b)` and `areInIncreasingOrder(b, c)` are + /// both `true`, then `areInIncreasingOrder(a, c)` is also `true`. + /// (Transitive comparability) + /// - Two elements are *incomparable* if neither is ordered before the other + /// according to the predicate. If `a` and `b` are incomparable, and `b` + /// and `c` are incomparable, then `a` and `c` are also incomparable. + /// (Transitive incomparability) + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements for which + /// `areInIncreasingOrder` does not establish an order. + /// + /// - Parameter areInIncreasingOrder: A predicate that returns `true` if its + /// first argument should be ordered before its second argument; + /// otherwise, `false`. If `areInIncreasingOrder` throws an error during + /// the sort, the elements may be in a different order, but none will be + /// lost. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + @inline(__always) + public mutating func sort( + by areInIncreasingOrder: (Element, Element) throws -> Bool + ) rethrows { + try _base.sort(by: areInIncreasingOrder) + } +} + +extension OrderedDictionary.Elements where Key: Comparable { + /// Sorts the dictionary in place. + /// + /// You can sort an ordered dictionary of keys that conform to the + /// `Comparable` protocol by calling this method. The key-value pairs are + /// sorted in ascending order. (`Value` doesn't need to conform to + /// `Comparable` because the keys are guaranteed to be unique.) + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements that compare equal. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + @inline(__always) + public mutating func sort() { + _base.sort() + } +} + +extension OrderedDictionary.Elements { + /// Shuffles the collection in place. + /// + /// Use the `shuffle()` method to randomly reorder the elements of an ordered + /// dictionary. + /// + /// This method is equivalent to calling `shuffle(using:)`, passing in the + /// system's default random generator. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + @inlinable + public mutating func shuffle() { + _base.shuffle() + } + + /// Shuffles the collection in place, using the given generator as a source + /// for randomness. + /// + /// You use this method to randomize the elements of a collection when you + /// are using a custom random number generator. For example, you can use the + /// `shuffle(using:)` method to randomly reorder the elements of an array. + /// + /// - Parameter generator: The random number generator to use when shuffling + /// the collection. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + /// + /// - Note: The algorithm used to shuffle a collection may change in a future + /// version of Swift. If you're passing a generator that results in the + /// same shuffled order each time you run your program, that sequence may + /// change when your program is compiled using a different version of + /// Swift. + @inlinable + public mutating func shuffle( + using generator: inout T + ) { + _base.shuffle(using: &generator) + } +} + +extension OrderedDictionary.Elements { + /// Reverses the elements of the ordered dictionary in place. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func reverse() { + _base.reverse() + } +} + +// MARK: Partial `RangeReplaceableCollection` + +extension OrderedDictionary.Elements { + /// Removes all members from the dictionary. + /// + /// - Parameter keepingCapacity: If `true`, the dictionary's storage capacity + /// is preserved; if `false`, the underlying storage is released. The + /// default is `false`. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll(keepingCapacity keepCapacity: Bool = false) { + _base.removeAll(keepingCapacity: keepCapacity) + } + + /// Removes and returns the element at the specified position. + /// + /// All the elements following the specified position are moved to close the + /// resulting gap. + /// + /// - Parameter index: The position of the element to remove. `index` must be + /// a valid index of the collection that is not equal to the collection's + /// end index. + /// + /// - Returns: The removed element. + /// + /// - Complexity: O(`count`) + @inlinable + @discardableResult + public mutating func remove(at index: Int) -> Element { + _base.remove(at: index) + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange(_ bounds: Range) { + _base.removeSubrange(bounds) + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange( + _ bounds: R + ) where R.Bound == Int { + _base.removeSubrange(bounds) + } + + + /// Removes the last element of a non-empty dictionary. + /// + /// - Complexity: Expected to be O(`1`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func removeLast() -> Element { + _base.removeLast() + } + + /// Removes the last `n` element of the dictionary. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the collection. + /// + /// - Complexity: Expected to be O(`n`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + public mutating func removeLast(_ n: Int) { + _base.removeLast(n) + } + + /// Removes the first element of a non-empty dictionary. + /// + /// The members following the removed key-value pair need to be moved to close + /// the resulting gaps in the storage arrays. + /// + /// - Complexity: O(`count`). + @inlinable + @discardableResult + public mutating func removeFirst() -> Element { + _base.removeFirst() + } + + /// Removes the first `n` elements of the dictionary. + /// + /// The members following the removed items need to be moved to close the + /// resulting gaps in the storage arrays. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the set. + /// + /// - Complexity: O(`count`). + @inlinable + public mutating func removeFirst(_ n: Int) { + _base.removeFirst(n) + } + + /// Removes all the elements that satisfy the given predicate. + /// + /// Use this method to remove every element in a collection that meets + /// particular criteria. The order of the remaining elements is preserved. + /// + /// - Parameter shouldBeRemoved: A closure that takes an element of the + /// dictionary as its argument and returns a Boolean value indicating + /// whether the element should be removed from the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll( + where shouldBeRemoved: (Self.Element) throws -> Bool + ) rethrows { + try _base.removeAll(where: shouldBeRemoved) + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Equatable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Equatable.swift new file mode 100644 index 00000000..93ed08c6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Equatable.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: Equatable where Value: Equatable { + /// Returns a Boolean value indicating whether two values are equal. + /// + /// Two ordered dictionaries are considered equal if they contain the same + /// key-value pairs, in the same order. + /// + /// - Complexity: O(`min(left.count, right.count)`) + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + left._keys == right._keys && left._values == right._values + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+ExpressibleByDictionaryLiteral.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+ExpressibleByDictionaryLiteral.swift new file mode 100644 index 00000000..8c1ed039 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+ExpressibleByDictionaryLiteral.swift @@ -0,0 +1,31 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: ExpressibleByDictionaryLiteral { + /// Creates a new ordered dictionary from the contents of a dictionary + /// literal. + /// + /// Do not call this initializer directly. It is used by the compiler when you + /// use a dictionary literal. Instead, create a new ordered dictionary using a + /// dictionary literal as its value by enclosing a comma-separated list of + /// key-value pairs in square brackets. You can use a dictionary literal + /// anywhere an ordered dictionary is expected by the type context. + /// + /// - Parameter elements: A variadic list of key-value pairs for the new + /// ordered dictionary. + /// + /// - Complexity: O(`elements.count`) if `Key` implements + /// high-quality hashing. + @inlinable + public init(dictionaryLiteral elements: (Key, Value)...) { + self.init(uniqueKeysWithValues: elements) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Hashable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Hashable.swift new file mode 100644 index 00000000..40375df8 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Hashable.swift @@ -0,0 +1,25 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: Hashable where Value: Hashable { + /// Hashes the essential components of this value by feeding them into the + /// given hasher. + /// + /// Complexity: O(`count`) + @inlinable + public func hash(into hasher: inout Hasher) { + hasher.combine(count) // Discriminator + for (key, value) in self { + hasher.combine(key) + hasher.combine(value) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Initializers.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Initializers.swift new file mode 100644 index 00000000..93352ef7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Initializers.swift @@ -0,0 +1,455 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + /// Creates an empty dictionary. + /// + /// This initializer is equivalent to initializing with an empty dictionary + /// literal. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public init() { + self._keys = OrderedSet() + self._values = [] + } + + /// Creates an empty dictionary with preallocated space for at least the + /// specified number of elements. + /// + /// Use this initializer to avoid intermediate reallocations of a dictionary's + /// storage buffer when you know in advance how many elements you'll insert + /// into it after creation. + /// + /// If you have a good idea of the expected working size of the dictionary, + /// calling this initializer with `persistent` set to true can sometimes + /// improve performance by eliminating churn due to repeated rehashings when + /// the dictionary temporarily shrinks below its regular size. You can cancel + /// any capacity you've previously reserved by persistently reserving a + /// capacity of zero. (This also shrinks the hash table to the ideal size for + /// its current number elements.) + /// + /// - Parameter minimumCapacity: The minimum number of elements that the newly + /// created dictionary should be able to store without reallocating its + /// storage. + /// + /// - Parameter persistent: If set to true, prevent removals from shrinking + /// storage below the specified capacity. By default, removals are allowed + /// to shrink storage below any previously reserved capacity. + /// + /// - Complexity: O(`minimumCapacity`) + @inlinable + @inline(__always) + public init(minimumCapacity: Int, persistent: Bool = false) { + self._keys = OrderedSet(minimumCapacity: minimumCapacity, persistent: persistent) + self._values = [] + _values.reserveCapacity(minimumCapacity) + } +} + +extension OrderedDictionary { + /// Creates a new dictionary from the key-value pairs in the given sequence. + /// + /// You use this initializer to create a dictionary when you have a sequence + /// of key-value tuples with unique keys. Passing a sequence with duplicate + /// keys to this initializer results in a runtime error. If your + /// sequence might have duplicate keys, use the + /// `Dictionary(_:uniquingKeysWith:)` initializer instead. + /// + /// - Parameter keysAndValues: A sequence of key-value pairs to use for + /// the new dictionary. Every key in `keysAndValues` must be unique. + /// + /// - Returns: A new dictionary initialized with the elements of + /// `keysAndValues`. + /// + /// - Precondition: The sequence must not have duplicate keys. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @_disfavoredOverload // https://github.com/apple/swift-collections/issues/125 + @inlinable + public init( + uniqueKeysWithValues keysAndValues: S + ) where S.Element == (key: Key, value: Value) { + if S.self == Dictionary.self { + self.init(_uncheckedUniqueKeysWithValues: keysAndValues) + return + } + self.init() + reserveCapacity(keysAndValues.underestimatedCount) + for (key, value) in keysAndValues { + guard _keys._append(key).inserted else { + preconditionFailure("Duplicate key: '\(key)'") + } + _values.append(value) + } + } + + /// Creates a new dictionary from the key-value pairs in the given sequence. + /// + /// You use this initializer to create a dictionary when you have a sequence + /// of key-value tuples with unique keys. Passing a sequence with duplicate + /// keys to this initializer results in a runtime error. If your + /// sequence might have duplicate keys, use the + /// `Dictionary(_:uniquingKeysWith:)` initializer instead. + /// + /// - Parameter keysAndValues: A sequence of key-value pairs to use for + /// the new dictionary. Every key in `keysAndValues` must be unique. + /// + /// - Returns: A new dictionary initialized with the elements of + /// `keysAndValues`. + /// + /// - Precondition: The sequence must not have duplicate keys. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @inlinable + public init( + uniqueKeysWithValues keysAndValues: S + ) where S.Element == (Key, Value) { + self.init() + reserveCapacity(keysAndValues.underestimatedCount) + for (key, value) in keysAndValues { + guard _keys._append(key).inserted else { + preconditionFailure("Duplicate key: '\(key)'") + } + _values.append(value) + } + } +} + +extension OrderedDictionary { + /// Creates a new dictionary from separate sequences of keys and values. + /// + /// You use this initializer to create a dictionary when you have two + /// sequences with unique keys and their associated values, respectively. + /// Passing a `keys` sequence with duplicate keys to this initializer results + /// in a runtime error. + /// + /// - Parameter keys: A sequence of unique keys. + /// + /// - Parameter values: A sequence of values associated with items in `keys`. + /// + /// - Returns: A new dictionary initialized with the data in + /// `keys` and `values`. + /// + /// - Precondition: The sequence must not have duplicate keys, and `keys` and + /// `values` must contain an equal number of elements. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @inlinable + public init( + uniqueKeys keys: Keys, + values: Values + ) where Keys.Element == Key, Values.Element == Value { + let keys = ContiguousArray(keys) + let values = ContiguousArray(values) + precondition(keys.count == values.count, + "Mismatching element counts between keys and values") + self._keys = .init(keys) + self._values = values + precondition(_keys.count == _values.count, "Duplicate keys") + _checkInvariants() + } +} + +extension OrderedDictionary { + /// Creates a new dictionary from the key-value pairs in the given sequence, + /// using a combining closure to determine the value for any duplicate keys. + /// + /// You use this initializer to create a dictionary when you have a sequence + /// of key-value tuples that might have duplicate keys. As the dictionary is + /// built, the initializer calls the `combine` closure with the current and + /// new values for any duplicate keys. Pass a closure as `combine` that + /// returns the value to use in the resulting dictionary: The closure can + /// choose between the two values, combine them to produce a new value, or + /// even throw an error. + /// + /// let pairsWithDuplicateKeys = [("a", 1), ("b", 2), ("a", 3), ("b", 4)] + /// + /// let firstValues = OrderedDictionary( + /// pairsWithDuplicateKeys, + /// uniquingKeysWith: { (first, _) in first }) + /// // ["a": 1, "b": 2] + /// + /// let lastValues = OrderedDictionary( + /// pairsWithDuplicateKeys, + /// uniquingKeysWith: { (_, last) in last }) + /// // ["a": 3, "b": 4] + /// + /// - Parameters: + /// - keysAndValues: A sequence of key-value pairs to use for the new + /// dictionary. + /// - combine: A closure that is called with the values for any duplicate + /// keys that are encountered. The closure returns the desired value for + /// the final dictionary. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count of + /// key-value pairs, if `Key` implements high-quality hashing. + @_disfavoredOverload // https://github.com/apple/swift-collections/issues/125 + @inlinable + @inline(__always) + public init( + _ keysAndValues: S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows where S.Element == (key: Key, value: Value) { + self.init() + try self.merge(keysAndValues, uniquingKeysWith: combine) + } + + /// Creates a new dictionary from the key-value pairs in the given sequence, + /// using a combining closure to determine the value for any duplicate keys. + /// + /// You use this initializer to create a dictionary when you have a sequence + /// of key-value tuples that might have duplicate keys. As the dictionary is + /// built, the initializer calls the `combine` closure with the current and + /// new values for any duplicate keys. Pass a closure as `combine` that + /// returns the value to use in the resulting dictionary: The closure can + /// choose between the two values, combine them to produce a new value, or + /// even throw an error. + /// + /// let pairsWithDuplicateKeys = [("a", 1), ("b", 2), ("a", 3), ("b", 4)] + /// + /// let firstValues = OrderedDictionary( + /// pairsWithDuplicateKeys, + /// uniquingKeysWith: { (first, _) in first }) + /// // ["a": 1, "b": 2] + /// + /// let lastValues = OrderedDictionary( + /// pairsWithDuplicateKeys, + /// uniquingKeysWith: { (_, last) in last }) + /// // ["a": 3, "b": 4] + /// + /// - Parameters: + /// - keysAndValues: A sequence of key-value pairs to use for the new + /// dictionary. + /// - combine: A closure that is called with the values for any duplicate + /// keys that are encountered. The closure returns the desired value for + /// the final dictionary. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count of + /// key-value pairs, if `Key` implements high-quality hashing. + @inlinable + @inline(__always) + public init( + _ keysAndValues: S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows where S.Element == (Key, Value) { + self.init() + try self.merge(keysAndValues, uniquingKeysWith: combine) + } +} + +extension OrderedDictionary { + /// Creates a new dictionary whose keys are the groupings returned by the + /// given closure and whose values are arrays of the elements that returned + /// each key. + /// + /// The arrays in the "values" position of the new dictionary each contain at + /// least one element, with the elements in the same order as the source + /// sequence. + /// + /// The following example declares an array of names, and then creates a + /// dictionary from that array by grouping the names by first letter: + /// + /// let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"] + /// let studentsByLetter = OrderedDictionary(grouping: students, by: { $0.first! }) + /// // ["K": ["Kofi", "Kweku"], "A": ["Abena", "Akosua"], "E": ["Efua"]] + /// + /// The new `studentsByLetter` dictionary has three entries, with students' + /// names grouped by the keys `"E"`, `"K"`, and `"A"`. + /// + /// - Parameters: + /// - values: A sequence of values to group into a dictionary. + /// - keyForValue: A closure that returns a key for each element in + /// `values`. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count of + /// values, if `Key` implements high-quality hashing. + @inlinable + public init( + grouping values: S, + by keyForValue: (S.Element) throws -> Key + ) rethrows where Value: RangeReplaceableCollection, Value.Element == S.Element { + try self.init(_grouping: values, by: keyForValue) + } + + /// Creates a new dictionary whose keys are the groupings returned by the + /// given closure and whose values are arrays of the elements that returned + /// each key. + /// + /// The arrays in the "values" position of the new dictionary each contain at + /// least one element, with the elements in the same order as the source + /// sequence. + /// + /// The following example declares an array of names, and then creates a + /// dictionary from that array by grouping the names by first letter: + /// + /// let students = ["Kofi", "Abena", "Efua", "Kweku", "Akosua"] + /// let studentsByLetter = OrderedDictionary(grouping: students, by: { $0.first! }) + /// // ["K": ["Kofi", "Kweku"], "A": ["Abena", "Akosua"], "E": ["Efua"]] + /// + /// The new `studentsByLetter` dictionary has three entries, with students' + /// names grouped by the keys `"E"`, `"K"`, and `"A"`. + /// + /// - Parameters: + /// - values: A sequence of values to group into a dictionary. + /// - keyForValue: A closure that returns a key for each element in + /// `values`. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count of + /// values, if `Key` implements high-quality hashing. + @inlinable + public init( + grouping values: S, + by keyForValue: (S.Element) throws -> Key + ) rethrows where Value == [S.Element] { + // Note: this extra overload is necessary to make type inference work + // for the `Value` type -- we want it to default to `[S.Element`]. + // (https://github.com/apple/swift-collections/issues/139) + try self.init(_grouping: values, by: keyForValue) + } + + @inlinable + internal init( + _grouping values: S, + by keyForValue: (S.Element) throws -> Key + ) rethrows where Value: RangeReplaceableCollection, Value.Element == S.Element { + self.init() + for value in values { + let key = try keyForValue(value) + self.updateValue(forKey: key, default: Value()) { array in + array.append(value) + } + } + } +} + +extension OrderedDictionary { + @inlinable + internal init( + _uncheckedUniqueKeysWithValues keysAndValues: S + ) where S.Element == (key: Key, value: Value) { + self.init() + reserveCapacity(keysAndValues.underestimatedCount) + for (key, value) in keysAndValues { + _keys._appendNew(key) + _values.append(value) + } + _checkInvariants() + } + + /// Creates a new dictionary from the key-value pairs in the given sequence, + /// which must not contain duplicate keys. + /// + /// In optimized builds, this initializer does not verify that the keys are + /// actually unique. This makes creating the dictionary somewhat faster if you + /// know for sure that the elements are unique (e.g., because they come from + /// another collection with guaranteed-unique members, such as a + /// `Dictionary`). However, if you accidentally call this initializer with + /// duplicate members, it can return a corrupt dictionary value that may be + /// difficult to debug. + /// + /// - Parameter keysAndValues: A sequence of key-value pairs to use for + /// the new dictionary. Every key in `keysAndValues` must be unique. + /// + /// - Returns: A new dictionary initialized with the elements of + /// `keysAndValues`. + /// + /// - Precondition: The sequence must not have duplicate keys. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @_disfavoredOverload // https://github.com/apple/swift-collections/issues/125 + @inlinable + public init( + uncheckedUniqueKeysWithValues keysAndValues: S + ) where S.Element == (key: Key, value: Value) { +#if DEBUG + self.init(uniqueKeysWithValues: keysAndValues) +#else + self.init(_uncheckedUniqueKeysWithValues: keysAndValues) +#endif + } + + /// Creates a new dictionary from the key-value pairs in the given sequence, + /// which must not contain duplicate keys. + /// + /// In optimized builds, this initializer does not verify that the keys are + /// actually unique. This makes creating the dictionary somewhat faster if you + /// know for sure that the elements are unique (e.g., because they come from + /// another collection with guaranteed-unique members, such as a + /// `Dictionary`). However, if you accidentally call this initializer with + /// duplicate members, it can return a corrupt dictionary value that may be + /// difficult to debug. + /// + /// - Parameter keysAndValues: A sequence of key-value pairs to use for + /// the new dictionary. Every key in `keysAndValues` must be unique. + /// + /// - Returns: A new dictionary initialized with the elements of + /// `keysAndValues`. + /// + /// - Precondition: The sequence must not have duplicate keys. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @inlinable + public init( + uncheckedUniqueKeysWithValues keysAndValues: S + ) where S.Element == (Key, Value) { + // Add tuple labels + let keysAndValues = keysAndValues.lazy.map { (key: $0.0, value: $0.1) } + self.init(uncheckedUniqueKeysWithValues: keysAndValues) + } +} + +extension OrderedDictionary { + /// Creates a new dictionary from separate sequences of unique keys and + /// associated values. + /// + /// In optimized builds, this initializer does not verify that the keys are + /// actually unique. This makes creating the dictionary somewhat faster if you + /// know for sure that the elements are unique (e.g., because they come from + /// another collection with guaranteed-unique members, such as a + /// `Dictionary`). However, if you accidentally call this initializer with + /// duplicate members, it can return a corrupt dictionary value that may be + /// difficult to debug. + /// + /// - Parameter keys: A sequence of unique keys. + /// + /// - Parameter values: A sequence of values associated with items in `keys`. + /// + /// - Returns: A new dictionary initialized with the data in + /// `keys` and `values`. + /// + /// - Precondition: The sequence must not have duplicate keys, and `keys` and + /// `values` must contain an equal number of elements. + /// + /// - Complexity: Expected O(*n*) on average, where *n* is the count if + /// key-value pairs, if `Key` implements high-quality hashing. + @inlinable + @inline(__always) + public init( + uncheckedUniqueKeys keys: Keys, + values: Values + ) where Keys.Element == Key, Values.Element == Value { +#if DEBUG + self.init(uniqueKeys: keys, values: values) +#else + self._keys = .init(uncheckedUniqueElements: keys) + self._values = .init(values) + precondition(_keys.count == _values.count) + _checkInvariants() +#endif + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Invariants.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Invariants.swift new file mode 100644 index 00000000..fa3d01fe --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Invariants.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + #if COLLECTIONS_INTERNAL_CHECKS + @inline(never) @_effects(releasenone) + public func _checkInvariants() { + precondition(_keys.count == _values.count) + self._keys._checkInvariants() + } + #else + @inline(__always) @inlinable + public func _checkInvariants() {} + #endif // COLLECTIONS_INTERNAL_CHECKS +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial MutableCollection.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial MutableCollection.swift new file mode 100644 index 00000000..c01e9686 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial MutableCollection.swift @@ -0,0 +1,193 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + /// Exchanges the key-value pairs at the specified indices of the dictionary. + /// + /// Both parameters must be valid indices below `endIndex`. Passing the same + /// index as both `i` and `j` has no effect. + /// + /// - Parameters: + /// - i: The index of the first value to swap. + /// - j: The index of the second value to swap. + /// + /// - Complexity: O(1) when the dictionary's storage isn't shared with another + /// value; O(`count`) otherwise. + @inlinable + public mutating func swapAt(_ i: Int, _ j: Int) { + _keys.swapAt(i, j) + _values.swapAt(i, j) + } + + /// Reorders the elements of the dictionary such that all the elements that + /// match the given predicate are after all the elements that don't match. + /// + /// After partitioning a collection, there is a pivot index `p` where + /// no element before `p` satisfies the `belongsInSecondPartition` + /// predicate and every element at or after `p` satisfies + /// `belongsInSecondPartition`. + /// + /// - Parameter belongsInSecondPartition: A predicate used to partition + /// the collection. All elements satisfying this predicate are ordered + /// after all elements not satisfying it. + /// - Returns: The index of the first element in the reordered collection + /// that matches `belongsInSecondPartition`. If no elements in the + /// collection match `belongsInSecondPartition`, the returned index is + /// equal to the collection's `endIndex`. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func partition( + by belongsInSecondPartition: (Element) throws -> Bool + ) rethrows -> Int { + let pivot = try _values.withUnsafeMutableBufferPointer { values in + try _keys._partition(values: values, by: belongsInSecondPartition) + } + _checkInvariants() + return pivot + } +} + +extension OrderedDictionary { + /// Sorts the collection in place, using the given predicate as the + /// comparison between elements. + /// + /// When you want to sort a collection of elements that don't conform to + /// the `Comparable` protocol, pass a closure to this method that returns + /// `true` when the first element should be ordered before the second. + /// + /// Alternatively, use this method to sort a collection of elements that do + /// conform to `Comparable` when you want the sort to be descending instead + /// of ascending. Pass the greater-than operator (`>`) operator as the + /// predicate. + /// + /// `areInIncreasingOrder` must be a *strict weak ordering* over the + /// elements. That is, for any elements `a`, `b`, and `c`, the following + /// conditions must hold: + /// + /// - `areInIncreasingOrder(a, a)` is always `false`. (Irreflexivity) + /// - If `areInIncreasingOrder(a, b)` and `areInIncreasingOrder(b, c)` are + /// both `true`, then `areInIncreasingOrder(a, c)` is also `true`. + /// (Transitive comparability) + /// - Two elements are *incomparable* if neither is ordered before the other + /// according to the predicate. If `a` and `b` are incomparable, and `b` + /// and `c` are incomparable, then `a` and `c` are also incomparable. + /// (Transitive incomparability) + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements for which + /// `areInIncreasingOrder` does not establish an order. + /// + /// - Parameter areInIncreasingOrder: A predicate that returns `true` if its + /// first argument should be ordered before its second argument; + /// otherwise, `false`. If `areInIncreasingOrder` throws an error during + /// the sort, the elements may be in a different order, but none will be + /// lost. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + public mutating func sort( + by areInIncreasingOrder: (Element, Element) throws -> Bool + ) rethrows { + // FIXME: Implement in-place sorting. + let temp = try self.sorted(by: areInIncreasingOrder) + precondition(temp.count == self.count) + temp.withUnsafeBufferPointer { source in + _keys = OrderedSet(uncheckedUniqueElements: source.lazy.map { $0.key }) + _values = ContiguousArray(source.lazy.map { $0.value }) + } + _checkInvariants() + } +} + +extension OrderedDictionary where Key: Comparable { + /// Sorts the dictionary in place. + /// + /// You can sort an ordered dictionary of keys that conform to the + /// `Comparable` protocol by calling this method. The key-value pairs are + /// sorted in ascending order. (`Value` doesn't need to conform to + /// `Comparable` because the keys are guaranteed to be unique.) + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements that compare equal. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + public mutating func sort() { + sort { $0.key < $1.key } + } +} + +extension OrderedDictionary { + /// Shuffles the collection in place. + /// + /// Use the `shuffle()` method to randomly reorder the elements of an ordered + /// dictionary. + /// + /// This method is equivalent to calling `shuffle(using:)`, passing in the + /// system's default random generator. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + @inlinable + public mutating func shuffle() { + var generator = SystemRandomNumberGenerator() + shuffle(using: &generator) + } + + /// Shuffles the collection in place, using the given generator as a source + /// for randomness. + /// + /// You use this method to randomize the elements of a collection when you + /// are using a custom random number generator. For example, you can use the + /// `shuffle(using:)` method to randomly reorder the elements of an array. + /// + /// - Parameter generator: The random number generator to use when shuffling + /// the collection. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + /// + /// - Note: The algorithm used to shuffle a collection may change in a future + /// version of Swift. If you're passing a generator that results in the + /// same shuffled order each time you run your program, that sequence may + /// change when your program is compiled using a different version of + /// Swift. + @inlinable + public mutating func shuffle( + using generator: inout T + ) { + guard count > 1 else { return } + var keys = self._keys.elements + var values = self._values + self = [:] + var amount = keys.count + var current = 0 + while amount > 1 { + let random = Int.random(in: 0 ..< amount, using: &generator) + amount -= 1 + keys.swapAt(current, current + random) + values.swapAt(current, current + random) + current += 1 + } + self = OrderedDictionary(uncheckedUniqueKeys: keys, values: values) + } +} + +extension OrderedDictionary { + /// Reverses the elements of the ordered dictionary in place. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func reverse() { + _keys.reverse() + _values.reverse() + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial RangeReplaceableCollection.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial RangeReplaceableCollection.swift new file mode 100644 index 00000000..bc5791ba --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Partial RangeReplaceableCollection.swift @@ -0,0 +1,184 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// The parts of RangeReplaceableCollection that OrderedDictionary is able to implement. + +extension OrderedDictionary { + /// Reserves enough space to store the specified number of elements. + /// + /// This method ensures that the dictionary has unique, mutable, contiguous + /// storage, with space allocated for at least the requested number of + /// elements. + /// + /// If you are adding a known number of elements to a dictionary, call this + /// method once before the first insertion to avoid multiple reallocations. + /// + /// Do not call this method in a loop -- it does not use an exponential + /// allocation strategy, so doing that can result in quadratic instead of + /// linear performance. + /// + /// - Parameter minimumCapacity: The minimum number of elements that the + /// dictionary should be able to store without reallocating its storage. + /// + /// - Complexity: O(`max(count, minimumCapacity)`) + @inlinable + public mutating func reserveCapacity(_ minimumCapacity: Int) { + self._keys.reserveCapacity(minimumCapacity) + self._values.reserveCapacity(minimumCapacity) + } + + /// Removes all members from the dictionary. + /// + /// - Parameter keepingCapacity: If `true`, the dictionary's storage capacity + /// is preserved; if `false`, the underlying storage is released. The + /// default is `false`. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll(keepingCapacity keepCapacity: Bool = false) { + _keys.removeAll(keepingCapacity: keepCapacity) + _values.removeAll(keepingCapacity: keepCapacity) + } + + /// Removes and returns the element at the specified position. + /// + /// All the elements following the specified position are moved to close the + /// resulting gap. + /// + /// - Parameter index: The position of the element to remove. `index` must be + /// a valid index of the collection that is not equal to the collection's + /// end index. + /// + /// - Returns: The removed element. + /// + /// - Complexity: O(`count`) + @inlinable + @discardableResult + public mutating func remove(at index: Int) -> Element { + let key = _keys.remove(at: index) + let value = _values.remove(at: index) + return (key, value) + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange(_ bounds: Range) { + _keys.removeSubrange(bounds) + _values.removeSubrange(bounds) + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange( + _ bounds: R + ) where R.Bound == Int { + removeSubrange(bounds.relative(to: elements)) + } + + + /// Removes the last element of a non-empty dictionary. + /// + /// - Complexity: Expected to be O(`1`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func removeLast() -> Element { + precondition(!isEmpty, "Cannot remove last element of an empty collection") + return remove(at: count - 1) + } + + /// Removes the last `n` element of the dictionary. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the collection. + /// + /// - Complexity: Expected to be O(`n`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + public mutating func removeLast(_ n: Int) { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the collection") + _keys.removeLast(n) + _values.removeLast(n) + } + + /// Removes the first element of a non-empty dictionary. + /// + /// The members following the removed key-value pair need to be moved to close + /// the resulting gaps in the storage arrays. + /// + /// - Complexity: O(`count`). + @inlinable + @discardableResult + public mutating func removeFirst() -> Element { + precondition(!isEmpty, "Cannot remove first element of an empty collection") + return remove(at: 0) + } + + /// Removes the first `n` elements of the dictionary. + /// + /// The members following the removed items need to be moved to close the + /// resulting gaps in the storage arrays. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the set. + /// + /// - Complexity: O(`count`). + @inlinable + public mutating func removeFirst(_ n: Int) { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the collection") + _keys.removeFirst(n) + _values.removeFirst(n) + } + + /// Removes all the elements that satisfy the given predicate. + /// + /// Use this method to remove every element in a collection that meets + /// particular criteria. The order of the remaining elements is preserved. + /// + /// - Parameter shouldBeRemoved: A closure that takes an element of the + /// dictionary as its argument and returns a Boolean value indicating + /// whether the element should be removed from the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll( + where shouldBeRemoved: (Self.Element) throws -> Bool + ) rethrows { + let pivot = try _values.withUnsafeMutableBufferPointer { values in + try _keys._halfStablePartition( + values: values, + by: shouldBeRemoved) + } + removeSubrange(pivot...) + _checkInvariants() + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Sequence.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Sequence.swift new file mode 100644 index 00000000..2e5c5593 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Sequence.swift @@ -0,0 +1,63 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary: Sequence { + /// The element type of a dictionary: a tuple containing an individual + /// key-value pair. + public typealias Element = (key: Key, value: Value) + + /// The type that allows iteration over an ordered dictionary's elements. + @frozen + public struct Iterator: IteratorProtocol { + @usableFromInline + internal let _base: OrderedDictionary + + @usableFromInline + internal var _position: Int + + @inlinable + @inline(__always) + internal init(_base: OrderedDictionary) { + self._base = _base + self._position = 0 + } + + /// Advances to the next element and returns it, or nil if no next + /// element exists. + /// + /// - Complexity: O(1) + @inlinable + public mutating func next() -> Element? { + guard _position < _base._values.count else { return nil } + let result = (_base._keys[_position], _base._values[_position]) + _position += 1 + return result + } + } + + /// The number of elements in the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var underestimatedCount: Int { + count + } + + /// Returns an iterator over the elements of this collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func makeIterator() -> Iterator { + Iterator(_base: self) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Values.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Values.swift new file mode 100644 index 00000000..7181fe61 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary+Values.swift @@ -0,0 +1,381 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedDictionary { + /// A view of an ordered dictionary's values as a standalone collection. + @frozen + public struct Values { + @usableFromInline + internal var _base: OrderedDictionary + + @inlinable + @inline(__always) + internal init(_base: OrderedDictionary) { + self._base = _base + } + } +} + +extension OrderedDictionary.Values { + /// A read-only view of the contents of this collection as an array value. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var elements: Array { + Array(_base._values) + } +} + +extension OrderedDictionary.Values { + /// Calls a closure with a pointer to the collection's contiguous storage. + /// + /// Often, the optimizer can eliminate bounds checks within a collection + /// algorithm, but when that fails, invoking the same algorithm on the + /// buffer pointer passed into your closure lets you trade safety for speed. + /// + /// The pointer passed as an argument to `body` is valid only during the + /// execution of `withUnsafeBufferPointer(_:)`. Do not store or return the + /// pointer for later use. + /// + /// - Parameter body: A closure with an `UnsafeBufferPointer` parameter that + /// points to the contiguous storage for the collection. If `body` has a + /// return value, that value is also used as the return value for the + /// `withUnsafeBufferPointer(_:)` method. The pointer argument is valid only + /// for the duration of the method's execution. + /// + /// - Returns: The return value, if any, of the `body` closure parameter. + /// + /// - Complexity: O(1) (not counting the closure call) + @inlinable + @inline(__always) + public func withUnsafeBufferPointer( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R { + try _base._values.withUnsafeBufferPointer(body) + } + + /// Calls the given closure with a pointer to the collection's mutable + /// contiguous storage. + /// + /// Often, the optimizer can eliminate bounds checks within a collection + /// algorithm, but when that fails, invoking the same algorithm on the buffer + /// pointer passed into your closure lets you trade safety for speed. + /// + /// The pointer passed as an argument to `body` is valid only during the + /// execution of `withUnsafeMutableBufferPointer(_:)`. Do not store or return + /// the pointer for later use. + /// + /// - Parameter body: A closure with an `UnsafeMutableBufferPointer` parameter + /// that points to the contiguous storage for the collection. If `body` has + /// a return value, that value is also used as the return value for the + /// `withUnsafeMutableBufferPointer(_:)` method. The pointer argument is + /// valid only for the duration of the method's execution. + /// + /// - Returns: The return value, if any, of the `body` closure parameter. + /// + /// - Complexity: O(1) (not counting the closure call) + @inlinable + @inline(__always) + public mutating func withUnsafeMutableBufferPointer( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R { + try _base._values.withUnsafeMutableBufferPointer(body) + } +} + +extension OrderedDictionary.Values: Sequence { + /// The element type of the collection. + public typealias Element = Value + + /// The type that allows iteration over the collection's elements. + public typealias Iterator = IndexingIterator +} + +extension OrderedDictionary.Values: RandomAccessCollection { + /// The index type for a dictionary's values view, `Int`. + /// + /// Indices in `Values` are integer offsets from the start of the collection. + public typealias Index = Int + + /// The type that represents the indices that are valid for subscripting the + /// `Values` collection, in ascending order. + public typealias Indices = Range + + /// The position of the first element in a nonempty dictionary. + /// + /// For an instance of `OrderedDictionary.Values`, `startIndex` is always + /// zero. If the dictionary is empty, `startIndex` is equal to `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { 0 } + + /// The collection's "past the end" position---that is, the position one + /// greater than the last valid subscript argument. + /// + /// In `OrderedDictionary.Values`, `endIndex` always equals the count of + /// elements. If the dictionary is empty, `endIndex` is equal to `startIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { _base._values.count } + + /// Returns the position immediately after the given index. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { i + 1 } + + /// Returns the position immediately before the given index. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { i - 1 } + + /// Replaces the given index with its successor. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { i += 1 } + + /// Replaces the given index with its predecessor. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the collection. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { i -= 1 } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, or the returned value will not be a valid index. + /// + /// - Parameters: + /// - i: A valid index of the collection. + /// - distance: The distance to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls to + /// `index(after:)`. If `distance` is negative, this is the same value as + /// the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, unless the index passed as `limit` prevents offsetting + /// beyond those bounds. (Otherwise the returned value won't be a valid index + /// in the collection.) + /// + /// - Parameters: + /// - i: A valid index of the collection. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the collection to use as a limit. If + /// `distance > 0`, `limit` has no effect if it is less than `i`. + /// Likewise, if `distance < 0`, `limit` has no effect if it is greater + /// than `i`. + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + _base._values.index(i, offsetBy: distance, limitedBy: limit) + } + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. If `end` is equal to + /// `start`, the result is zero. + /// + /// - Returns: The distance between `start` and `end`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + end - start + } + + /// Call `body(p)`, where `p` is a buffer pointer to the collection’s + /// contiguous storage. `OrderedDictionary.Values` values always have + /// contiguous storage. + /// + /// - Parameter body: A function to call. The function must not escape its + /// unsafe buffer pointer argument. + /// + /// - Returns: The value returned by `body`. + /// + /// - Complexity: O(1) (ignoring time spent in `body`) + @inlinable + @inline(__always) + public func withContiguousStorageIfAvailable( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + try _base._values.withUnsafeBufferPointer(body) + } +} + +extension OrderedDictionary.Values: MutableCollection { + /// Accesses the element at the specified position. This can be used to + /// perform in-place mutations on dictionary values. + /// + /// - Parameter index: The position of the element to access. `index` must be + /// greater than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public subscript(position: Int) -> Value { + get { + _base._values[position] + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + yield &_base._values[position] + } + } + + /// Exchanges the values at the specified indices of the collection. (Leaving + /// their associated keys in the underlying dictionary at their original + /// position.) + /// + /// Both parameters must be valid indices below `endIndex`. Passing the same + /// index as both `i` and `j` has no effect. + /// + /// - Parameters: + /// - i: The index of the first value to swap. + /// - j: The index of the second value to swap. + /// + /// - Complexity: O(1) when the dictionary's storage isn't shared with another + /// value; O(`count`) otherwise. + @inlinable + @inline(__always) + public mutating func swapAt(_ i: Int, _ j: Int) { + _base._values.swapAt(i, j) + } + + /// Reorders the elements of the collection such that all the elements that + /// match the given predicate are after all the elements that don't match. + /// + /// This operation does not reorder the keys of the underlying dictionary, + /// just their associated values. + /// + /// After partitioning a collection, there is a pivot index `p` where + /// no element before `p` satisfies the `belongsInSecondPartition` + /// predicate and every element at or after `p` satisfies + /// `belongsInSecondPartition`. + /// + /// - Parameter belongsInSecondPartition: A predicate used to partition + /// the collection. All elements satisfying this predicate are ordered + /// after all elements not satisfying it. + /// - Returns: The index of the first element in the reordered collection + /// that matches `belongsInSecondPartition`. If no elements in the + /// collection match `belongsInSecondPartition`, the returned index is + /// equal to the collection's `endIndex`. + /// + /// - Complexity: O(`count`) + @inlinable + @inline(__always) + public mutating func partition( + by belongsInSecondPartition: (Value) throws -> Bool + ) rethrows -> Int { + try _base._values.partition(by: belongsInSecondPartition) + } + + /// Call `body(b)`, where `b` is an unsafe buffer pointer to the collection's + /// mutable contiguous storage. `OrderedDictionary.Values` always stores its + /// elements in contiguous storage. + /// + /// The supplied buffer pointer is only valid for the duration of the call. + /// + /// Often, the optimizer can eliminate bounds- and uniqueness-checks within an + /// algorithm, but when that fails, invoking the same algorithm on the unsafe + /// buffer supplied to `body` lets you trade safety for speed. + /// + /// - Parameters: + /// - body: The function to invoke. + /// + /// - Returns: The value returned by `body`, or `nil` if `body` wasn't called. + /// + /// - Complexity: O(1) when this instance has a unique reference to its + /// underlying storage; O(`count`) otherwise. (Not counting the call to + /// `body`.) + @inlinable + @inline(__always) + public mutating func withContiguousMutableStorageIfAvailable( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + try _base._values.withUnsafeMutableBufferPointer(body) + } +} + +extension OrderedDictionary.Values: Equatable where Value: Equatable { + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + left.elementsEqual(right) + } +} + +extension OrderedDictionary.Values: Hashable where Value: Hashable { + @inlinable + public func hash(into hasher: inout Hasher) { + hasher.combine(count) // Discriminator + for item in self { + hasher.combine(item) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary.swift new file mode 100644 index 00000000..f32222d3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedDictionary/OrderedDictionary.swift @@ -0,0 +1,1060 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// An ordered collection of key-value pairs. +/// +/// Like the standard `Dictionary`, ordered dictionaries use a hash table to +/// ensure that no two entries have the same keys, and to efficiently look up +/// values corresponding to specific keys. However, like an `Array` (and +/// unlike `Dictionary`), ordered dictionaries maintain their elements in a +/// particular user-specified order, and they support efficient random-access +/// traversal of their entries. +/// +/// `OrderedDictionary` is a useful alternative to `Dictionary` when the order +/// of elements is important, or when you need to be able to efficiently access +/// elements at various positions within the collection. +/// +/// You can create an ordered dictionary with any key type that conforms to the +/// `Hashable` protocol. +/// +/// let responses: OrderedDictionary = [ +/// 200: "OK", +/// 403: "Access forbidden", +/// 404: "File not found", +/// 500: "Internal server error", +/// ] +/// +/// ### Equality of Ordered Dictionaries +/// +/// Two ordered dictionaries are considered equal if they contain the same +/// elements, and *in the same order*. This matches the concept of equality of +/// an `Array`, and it is different from the unordered `Dictionary`. +/// +/// let a: OrderedDictionary = [1: "one", 2: "two"] +/// let b: OrderedDictionary = [2: "two", 1: "one"] +/// a == b // false +/// b.swapAt(0, 1) // `b` now has value [1: "one", 2: "two"] +/// a == b // true +/// +/// (`OrderedDictionary` only conforms to `Equatable` when its `Value` is +/// equatable.) +/// +/// ### Dictionary Operations +/// +/// `OrderedDictionary` provides many of the same operations as `Dictionary`. +/// +/// For example, you can look up and add/remove values using the familiar +/// key-based subscript, returning an optional value: +/// +/// var dictionary: OrderedDictionary = [:] +/// dictionary["one"] = 1 +/// dictionary["two"] = 2 +/// dictionary["three"] // nil +/// // dictionary is now ["one": 1, "two": 2] +/// +/// If a new entry is added using the subscript setter, it gets appended to the +/// end of the dictionary. (So that by default, the dictionary contains its +/// elements in the order they were originally inserted.) +/// +/// `OrderedDictionary` also implements the variant of this subscript that takes +/// a default value. Like with `Dictionary`, this is useful when you want to +/// perform in-place mutations on values: +/// +/// let text = "short string" +/// var counts: OrderedDictionary = [:] +/// for character in text { +/// counts[character, default: 0] += 1 +/// } +/// // counts is ["s": 2, "h": 1, "o": 1, +/// // "r": 2, "t": 2, " ": 1, +/// // "i": 1, "n": 1, "g": 1] +/// +/// If the `Value` type implements reference semantics, or when you need to +/// perform a series of individual mutations on the values, the closure-based +/// `updateValue(forKey:default:_:)` method provides an easier-to-use +/// alternative to the defaulted key-based subscript. +/// +/// let text = "short string" +/// var counts: OrderedDictionary = [:] +/// for character in text { +/// counts.updateValue(forKey: character, default: 0) { value in +/// value += 1 +/// } +/// } +/// // Same result as before +/// +/// (This isn't currently available on the regular `Dictionary`.) +/// +/// The `Dictionary` type's original `updateValue(_:forKey:)` method is also +/// available, and so is `index(forKey:)`, grouping/uniquing initializers +/// (`init(uniqueKeysWithValues:)`, `init(_:uniquingKeysWith:)`, +/// `init(grouping:by:)`), methods for merging one dictionary with another +/// (`merge`, `merging`), filtering dictionary entries (`filter(_:)`), +/// transforming values (`mapValues(_:)`), and a combination of these two +/// (`compactMapValues(_:)`). +/// +/// ### Sequence and Collection Operations +/// +/// Ordered dictionaries use integer indices representing offsets from the +/// beginning of the collection. However, to avoid ambiguity between key-based +/// and indexing subscripts, `OrderedDictionary` doesn't directly conform to +/// `Collection`. Instead, it only conforms to `Sequence`, and provides a +/// random-access collection view over its key-value pairs: +/// +/// responses[0] // `nil` (key-based subscript) +/// responses.elements[0] // `(200, "OK")` (index-based subscript) +/// +/// Because ordered dictionaries need to maintain unique keys, neither +/// `OrderedDictionary` nor its `elements` view can conform to the full +/// `MutableCollection` or `RangeReplaceableCollection` protocols. However, they +/// are able to partially implement requirements: they support mutations +/// that merely change the order of elements, or just remove a subset of +/// existing members: +/// +/// // Permutation operations from MutableCollection: +/// func swapAt(_ i: Int, _ j: Int) +/// func partition(by predicate: (Element) throws -> Bool) -> rethrows Int +/// func sort() where Element: Comparable +/// func sort(by predicate: (Element, Element) throws -> Bool) rethrows +/// func shuffle() +/// func shuffle(using generator: inout T) +/// +/// // Removal operations from RangeReplaceableCollection: +/// func removeAll(keepingCapacity: Bool = false) +/// func remove(at index: Int) -> Element +/// func removeSubrange(_ bounds: Range) +/// func removeLast() -> Element +/// func removeLast(_ n: Int) +/// func removeFirst() -> Element +/// func removeFirst(_ n: Int) +/// func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows +/// +/// `OrderedDictionary` also implements `reserveCapacity(_)` from +/// `RangeReplaceableCollection`, to allow for efficient insertion of a known +/// number of elements. (However, unlike `Array` and `Dictionary`, +/// `OrderedDictionary` does not provide a `capacity` property.) +/// +/// ### Keys and Values Views +/// +/// Like the standard `Dictionary`, `OrderedDictionary` provides `keys` and +/// `values` properties that provide lightweight views into the corresponding +/// parts of the dictionary. +/// +/// The `keys` collection is of type `OrderedSet`, containing all the keys +/// in the original dictionary. +/// +/// let d: OrderedDictionary = [2: "two", 1: "one", 0: "zero"] +/// d.keys // [2, 1, 0] as OrderedSet +/// +/// The `keys` property is read-only, so you cannot mutate the dictionary +/// through it. However, it returns an ordinary ordered set value, which can be +/// copied out and then mutated if desired. (Such mutations won't affect the +/// original dictionary value.) +/// +/// The `values` collection is a mutable random-access collection of the values +/// in the dictionary: +/// +/// d.values // "two", "one", "zero" +/// d.values[2] = "nada" +/// // `d` is now [2: "two", 1: "one", 0: "nada"] +/// d.values.sort() +/// // `d` is now [2: "nada", 1: "one", 0: "two"] +/// +/// Both views store their contents in regular `Array` values, accessible +/// through their `elements` property. +/// +/// ## Performance +/// +/// Like the standard `Dictionary` type, the performance of hashing operations +/// in `OrderedDictionary` is highly sensitive to the quality of hashing +/// implemented by the `Key` type. Failing to correctly implement hashing can +/// easily lead to unacceptable performance, with the severity of the effect +/// increasing with the size of the hash table. +/// +/// In particular, if a certain set of keys all produce the same hash value, +/// then hash table lookups regress to searching an element in an unsorted +/// array, i.e., a linear operation. To ensure hashed collection types exhibit +/// their target performance, it is important to ensure that such collisions +/// cannot be induced merely by adding a particular list of keys to the +/// dictionary. +/// +/// The easiest way to achieve this is to make sure `Key` implements hashing +/// following `Hashable`'s documented best practices. The conformance must +/// implement the `hash(into:)` requirement, and every bit of information that +/// is compared in `==` needs to be combined into the supplied `Hasher` value. +/// When used correctly, `Hasher` produces high-quality, randomly seeded hash +/// values that prevent repeatable hash collisions. +/// +/// When `Key` correctly conforms to `Hashable`, key-based lookups in an ordered +/// dictionary is expected to take O(1) equality checks on average. Hash +/// collisions can still occur organically, so the worst-case lookup performance +/// is technically still O(*n*) (where *n* is the size of the dictionary); +/// however, long lookup chains are unlikely to occur in practice. +/// +/// ## Implementation Details +/// +/// An ordered dictionary consists of an ordered set of keys, alongside a +/// regular `Array` value that contains their associated values. +@frozen +public struct OrderedDictionary { + @usableFromInline + internal var _keys: OrderedSet + + @usableFromInline + internal var _values: ContiguousArray + + @inlinable + @inline(__always) + internal init( + _uniqueKeys keys: OrderedSet, + values: ContiguousArray + ) { + self._keys = keys + self._values = values + } +} + +extension OrderedDictionary { + /// A read-only collection view for the keys contained in this dictionary, as + /// an `OrderedSet`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var keys: OrderedSet { _keys } + + /// A mutable collection view containing the values in this dictionary. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var values: Values { + get { Values(_base: self) } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var values = Values(_base: self) + self = [:] + defer { self = values._base } + yield &values + } + } +} + +extension OrderedDictionary { + public typealias Index = Int + + /// A Boolean value indicating whether the dictionary is empty. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var isEmpty: Bool { _values.isEmpty } + + /// The number of elements in the dictionary. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _values.count } + + /// Returns the index for the given key. + /// + /// If the given key is found in the dictionary, this method returns an index + /// into the dictionary that corresponds with the key-value pair. + /// + /// let countryCodes: OrderedDictionary = ["BR": "Brazil", "GH": "Ghana", "JP": "Japan"] + /// let index = countryCodes.index(forKey: "JP") + /// + /// print("Country code for \(countryCodes[offset: index!].value): '\(countryCodes[offset: index!].key)'.") + /// // Prints "Country code for Japan: 'JP'." + /// + /// - Parameter key: The key to find in the dictionary. + /// + /// - Returns: The index for `key` and its associated value if `key` is in + /// the dictionary; otherwise, `nil`. + /// + /// - Complexity: Expected to be O(1) on average, if `Key` implements + /// high-quality hashing. + @inlinable + @inline(__always) + public func index(forKey key: Key) -> Int? { + _keys.firstIndex(of: key) + } +} + +extension OrderedDictionary { + /// Accesses the value associated with the given key for reading and writing. + /// + /// This *key-based* subscript returns the value for the given key if the key + /// is found in the dictionary, or `nil` if the key is not found. + /// + /// The following example creates a new dictionary and prints the value of a + /// key found in the dictionary (`"Coral"`) and a key not found in the + /// dictionary (`"Cerise"`). + /// + /// var hues: OrderedDictionary = ["Heliotrope": 296, "Coral": 16, "Aquamarine": 156] + /// print(hues["Coral"]) + /// // Prints "Optional(16)" + /// print(hues["Cerise"]) + /// // Prints "nil" + /// + /// When you assign a value for a key and that key already exists, the + /// dictionary overwrites the existing value. If the dictionary doesn't + /// contain the key, the key and value are added as a new key-value pair. + /// + /// Here, the value for the key `"Coral"` is updated from `16` to `18` and a + /// new key-value pair is added for the key `"Cerise"`. + /// + /// hues["Coral"] = 18 + /// print(hues["Coral"]) + /// // Prints "Optional(18)" + /// + /// hues["Cerise"] = 330 + /// print(hues["Cerise"]) + /// // Prints "Optional(330)" + /// + /// If you assign `nil` as the value for the given key, the dictionary + /// removes that key and its associated value. + /// + /// In the following example, the key-value pair for the key `"Aquamarine"` + /// is removed from the dictionary by assigning `nil` to the key-based + /// subscript. + /// + /// hues["Aquamarine"] = nil + /// print(hues) + /// // Prints "["Coral": 18, "Heliotrope": 296, "Cerise": 330]" + /// + /// - Parameter key: The key to find in the dictionary. + /// + /// - Returns: The value associated with `key` if `key` is in the dictionary; + /// otherwise, `nil`. + /// + /// - Complexity: Looking up values in the dictionary through this subscript + /// has an expected complexity of O(1) hashing/comparison operations on + /// average, if `Key` implements high-quality hashing. Updating the + /// dictionary also has an amortized expected complexity of O(1) -- + /// although individual updates may need to copy or resize the dictionary's + /// underlying storage. + @inlinable + public subscript(key: Key) -> Value? { + get { + guard let index = _keys.firstIndex(of: key) else { return nil } + return _values[index] + } + set { + // We have a separate `set` in addition to `_modify` in hopes of getting + // rid of `_modify`'s swapAt dance in the usual case where the caller just + // wants to assign a new value. + let (index, bucket) = _keys._find(key) + switch (index, newValue) { + case let (index?, newValue?): // Assign + _values[index] = newValue + case let (index?, nil): // Remove + _keys._removeExistingMember(at: index, in: bucket) + _values.remove(at: index) + case let (nil, newValue?): // Insert + _keys._appendNew(key, in: bucket) + _values.append(newValue) + case (nil, nil): // Noop + break + } + _checkInvariants() + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var value: Value? + let (index, bucket) = _prepareForKeyingModify(key, &value) + defer { + _finalizeKeyingModify(key, index, bucket, &value) + } + yield &value + } + } + + @inlinable + internal mutating func _prepareForKeyingModify( + _ key: Key, + _ value: inout Value? + ) -> (index: Int?, bucket: _HashTable.Bucket) { + let (index, bucket) = _keys._find(key) + + // To support in-place mutations better, we swap the value to the end of + // the array, pop it off, then put things back in place when we're done. + if let index = index { + _values.swapAt(index, _values.count - 1) + value = _values.removeLast() + } + return (index, bucket) + } + + @inlinable + internal mutating func _finalizeKeyingModify( + _ key: Key, + _ index: Int?, + _ bucket: _HashTable.Bucket, + _ value: inout Value? + ) { + switch (index, value) { + case let (index?, value?): // Assign + _values.append(value) + _values.swapAt(index, _values.count - 1) + case let (index?, nil): // Remove + if index < _values.count { + let standin = _values.remove(at: index) + _values.append(standin) + } + _keys._removeExistingMember(at: index, in: bucket) + case let (nil, value?): // Insert + _keys._appendNew(key, in: bucket) + _values.append(value) + case (nil, nil): // Noop + break + } + _checkInvariants() + } + + /// Accesses the value with the given key. If the dictionary doesn't contain + /// the given key, accesses the provided default value as if the key and + /// default value existed in the dictionary. + /// + /// Use this subscript when you want either the value for a particular key + /// or, when that key is not present in the dictionary, a default value. This + /// example uses the subscript with a message to use in case an HTTP response + /// code isn't recognized: + /// + /// var responseMessages: OrderedDictionary = [ + /// 200: "OK", + /// 403: "Access forbidden", + /// 404: "File not found", + /// 500: "Internal server error"] + /// + /// let httpResponseCodes = [200, 403, 301] + /// for code in httpResponseCodes { + /// let message = responseMessages[code, default: "Unknown response"] + /// print("Response \(code): \(message)") + /// } + /// // Prints "Response 200: OK" + /// // Prints "Response 403: Access forbidden" + /// // Prints "Response 301: Unknown response" + /// + /// When a dictionary's `Value` type has value semantics, you can use this + /// subscript to perform in-place operations on values in the dictionary. + /// The following example uses this subscript while counting the occurrences + /// of each letter in a string: + /// + /// let message = "Hello, Elle!" + /// var letterCounts: [Character: Int] = [:] + /// for letter in message { + /// letterCounts[letter, default: 0] += 1 + /// } + /// // letterCounts == ["H": 1, "e": 2, "l": 4, "o": 1, ...] + /// + /// When `letterCounts[letter, defaultValue: 0] += 1` is executed with a + /// value of `letter` that isn't already a key in `letterCounts`, the + /// specified default value (`0`) is returned from the subscript, + /// incremented, and then added to the dictionary under that key. + /// + /// - Note: Do not use this subscript to modify dictionary values if the + /// dictionary's `Value` type is a class. In that case, the default value + /// and key are not written back to the dictionary after an operation. (For + /// a variant of this operation that supports this usecase, see + /// `updateValue(forKey:default:_:)`.) + /// + /// - Parameters: + /// - key: The key the look up in the dictionary. + /// - defaultValue: The default value to use if `key` doesn't exist in the + /// dictionary. + /// + /// - Returns: The value associated with `key` in the dictionary; otherwise, + /// `defaultValue`. + /// + /// - Complexity: Looking up values in the dictionary through this subscript + /// has an expected complexity of O(1) hashing/comparison operations on + /// average, if `Key` implements high-quality hashing. Updating the + /// dictionary also has an amortized expected complexity of O(1) -- + /// although individual updates may need to copy or resize the dictionary's + /// underlying storage. + @inlinable + public subscript( + key: Key, + default defaultValue: @autoclosure () -> Value + ) -> Value { + get { + guard let offset = _keys.firstIndex(of: key) else { return defaultValue() } + return _values[offset] + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var (index, value) = _prepareForDefaultedModify(key, defaultValue) + defer { + _finalizeDefaultedModify(index, &value) + } + yield &value + } + } + + @inlinable + internal mutating func _prepareForDefaultedModify( + _ key: Key, + _ defaultValue: () -> Value + ) -> (index: Int, value: Value) { + let (inserted, index) = _keys.append(key) + if inserted { + assert(index == _values.count) + _values.append(defaultValue()) + } + let value: Value = _values.withUnsafeMutableBufferPointer { buffer in + assert(index < buffer.count) + return (buffer.baseAddress! + index).move() + } + return (index, value) + } + + @inlinable + internal mutating func _finalizeDefaultedModify( + _ index: Int, _ value: inout Value + ) { + _values.withUnsafeMutableBufferPointer { buffer in + assert(index < buffer.count) + (buffer.baseAddress! + index).initialize(to: value) + } + } +} + +extension OrderedDictionary { + /// Updates the value stored in the dictionary for the given key, or appends a + /// new key-value pair if the key does not exist. + /// + /// Use this method instead of key-based subscripting when you need to know + /// whether the new value supplants the value of an existing key. If the + /// value of an existing key is updated, `updateValue(_:forKey:)` returns + /// the original value. + /// + /// var hues: OrderedDictionary = [ + /// "Heliotrope": 296, + /// "Coral": 16, + /// "Aquamarine": 156] + /// + /// if let oldValue = hues.updateValue(18, forKey: "Coral") { + /// print("The old value of \(oldValue) was replaced with a new one.") + /// } + /// // Prints "The old value of 16 was replaced with a new one." + /// + /// If the given key is not present in the dictionary, this method appends the + /// key-value pair and returns `nil`. + /// + /// if let oldValue = hues.updateValue(330, forKey: "Cerise") { + /// print("The old value of \(oldValue) was replaced with a new one.") + /// } else { + /// print("No value was found in the dictionary for that key.") + /// } + /// // Prints "No value was found in the dictionary for that key." + /// + /// - Parameters: + /// - value: The new value to add to the dictionary. + /// - key: The key to associate with `value`. If `key` already exists in + /// the dictionary, `value` replaces the existing associated value. If + /// `key` isn't already a key of the dictionary, the `(key, value)` pair + /// is added. + /// + /// - Returns: The value that was replaced, or `nil` if a new key-value pair + /// was added. + /// + /// - Complexity: expected complexity is amortized O(1), if `Key` implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func updateValue(_ value: Value, forKey key: Key) -> Value? { + let (index, bucket) = _keys._find(key) + if let index = index { + let old = _values[index] + _values[index] = value + return old + } + _keys._appendNew(key, in: bucket) + _values.append(value) + return nil + } + + /// Updates the value stored in the dictionary for the given key, or inserts a + /// new key-value pair at the specified index if the key does not exist. + /// + /// Use this method instead of key-based subscripting when you need to insert + /// new keys at a particular index. You can use the return value to + /// determine whether or not the new value supplanted the value of an existing + /// key. + /// + /// If the value of an existing key is updated, + /// `updateValue(_:forKey:insertingAt:)` returns the original value and its + /// index. + /// + /// var hues: OrderedDictionary = [ + /// "Heliotrope": 296, + /// "Coral": 16, + /// "Aquamarine": 156] + /// let newIndex = hues.startIndex + /// let (old, index) = + /// hues.updateValue(18, forKey: "Coral", insertingAt: newIndex) + /// if let old = old { + /// print("The value '\(old)' at offset \(index.offset) was replaced.") + /// } + /// // Prints "The value '16' at offset 1 was replaced." + /// + /// If the given key is not present in the dictionary, this method inserts the + /// key-value pair at the specified index and returns `nil`. + /// + /// let (old, index) = + /// hues.updateValue(330, forKey: "Cerise", insertingAt: newIndex) + /// if let old = old { + /// print("The value '\(old)' at offset \(index.offset) was replaced.") + /// } else { + /// print("A new value was inserted at offset \(index.offset).") + /// } + /// // Prints "A new value was inserted at offset 0.") + /// + /// - Parameters: + /// - value: The new value to add to the dictionary. + /// - key: The key to associate with `value`. If `key` already exists in + /// the dictionary, `value` replaces the existing associated value. If + /// `key` isn't already a key of the dictionary, the `(key, value)` pair + /// is inserted. + /// - index: The index at which to insert the key, if it doesn't already + /// exist. + /// + /// - Returns: A pair `(old, index)`, where `old` is the value that was + /// replaced, or `nil` if a new key-value pair was added, and `index` + /// is the index corresponding to the updated (or inserted) value. + /// + /// - Complexity: O(`count`) + @inlinable + @discardableResult + public mutating func updateValue( + _ value: Value, + forKey key: Key, + insertingAt index: Int + ) -> (originalMember: Value?, index: Int) { + let (inserted, offset) = _keys.insert(key, at: index) + if inserted { + assert(offset == index) + _values.insert(value, at: offset) + return (nil, offset) + } + let old = _values[offset] + _values[offset] = value + return (old, offset) + } + + /// Ensures that the specified key exists in the dictionary (by appending one + /// with the supplied default value if necessary), then calls `body` to update + /// it in place. + /// + /// You can use this method to perform in-place operations on values in the + /// dictionary, whether or not `Value` has value semantics. The following + /// example uses this method while counting the occurrences of each letter + /// in a string: + /// + /// let message = "Hello, Elle!" + /// var letterCounts: [Character: Int] = [:] + /// for letter in message { + /// letterCounts.updateValue(forKey: letter, default: 0) { count in + /// count += 1 + /// } + /// } + /// // letterCounts == ["H": 1, "e": 2, "l": 4, "o": 1, ...] + /// + /// - Parameters: + /// - key: The key to look up (or append). If `key` does not already exist + /// in the dictionary, it is appended with the supplied default value. + /// - defaultValue: The default value to append if `key` doesn't exist in + /// the dictionary. + /// - body: A function that performs an in-place mutation on the dictionary + /// value. + /// + /// - Returns: The return value of `body`. + /// + /// - Complexity: expected complexity is amortized O(1), if `Key` implements + /// high-quality hashing. (Ignoring the complexity of calling `body`.) + @inlinable + public mutating func updateValue( + forKey key: Key, + default defaultValue: @autoclosure () -> Value, + with body: (inout Value) throws -> R + ) rethrows -> R { + let (index, bucket) = _keys._find(key) + if let index = index { + return try body(&_values[index]) + } + _keys._appendNew(key, in: bucket) + _values.append(defaultValue()) + let i = _values.index(before: _values.endIndex) + return try body(&_values[i]) + } + + /// Ensures that the specified key exists in the dictionary (by inserting one + /// with the specified index and default value if necessary), then calls + /// `body` to update it in place. + /// + /// You can use this method to perform in-place operations on values in the + /// dictionary, whether or not `Value` has value semantics. The following + /// example uses this method while counting the occurrences of each letter + /// in a string: + /// + /// let message = "Hello, Elle!" + /// var letterCounts: [Character: Int] = [:] + /// for letter in message { + /// letterCounts.updateValue(forKey: letter, default: 0) { count in + /// count += 1 + /// } + /// } + /// // letterCounts == ["H": 1, "e": 2, "l": 4, "o": 1, ...] + /// + /// - Parameters: + /// - key: The key to look up (or append). If `key` does not already exist + /// in the dictionary, it is appended with the supplied default value. + /// - defaultValue: The default value to append if `key` doesn't exist in + /// the dictionary. + /// - body: A function that performs an in-place mutation on the dictionary + /// value. + /// + /// - Returns: The return value of `body`. + /// + /// - Complexity: expected complexity is amortized O(1), if `Key` implements + /// high-quality hashing. (Ignoring the complexity of calling `body`.) + @inlinable + public mutating func updateValue( + forKey key: Key, + insertingDefault defaultValue: @autoclosure () -> Value, + at index: Int, + with body: (inout Value) throws -> R + ) rethrows -> R { + let (existingIndex, bucket) = _keys._find(key) + if let existingIndex = existingIndex { + return try body(&_values[existingIndex]) + } + _keys._insertNew(key, at: index, in: bucket) + _values.insert(defaultValue(), at: index) + return try body(&_values[index]) + } +} + +extension OrderedDictionary { + /// Removes the given key and its associated value from the dictionary. + /// + /// If the key is found in the dictionary, this method returns the key's + /// associated value. + /// + /// var hues: OrderedDictionary = [ + /// "Heliotrope": 296, + /// "Coral": 16, + /// "Aquamarine": 156] + /// if let value = hues.removeValue(forKey: "Coral") { + /// print("The value \(value) was removed.") + /// } + /// // Prints "The value 16 was removed." + /// + /// If the key isn't found in the dictionary, `removeValue(forKey:)` returns + /// `nil`. + /// + /// if let value = hues.removeValue(forKey: "Cerise") { + /// print("The value \(value) was removed.") + /// } else { + /// print("No value found for that key.") + /// } + /// // Prints "No value found for that key."" + /// + /// - Parameter key: The key to remove along with its associated value. + /// - Returns: The value that was removed, or `nil` if the key was not + /// present in the dictionary. + /// + /// - Complexity: O(`count`) + @inlinable + @discardableResult + public mutating func removeValue(forKey key: Key) -> Value? { + let (idx, bucket) = _keys._find(key) + guard let index = idx else { return nil } + _keys._removeExistingMember(at: index, in: bucket) + return _values.remove(at: index) + } +} + +extension OrderedDictionary { + /// Merges the key-value pairs in the given sequence into the dictionary, + /// using a combining closure to determine the value for any duplicate keys. + /// + /// Use the `combine` closure to select a value to use in the updated + /// dictionary, or to combine existing and new values. As the key-value + /// pairs are merged with the dictionary, the `combine` closure is called + /// with the current and new values for any duplicate keys that are + /// encountered. + /// + /// This example shows how to choose the current or new values for any + /// duplicate keys: + /// + /// var dictionary: OrderedDictionary = ["a": 1, "b": 2] + /// + /// // Keeping existing value for key "a": + /// dictionary.merge(zip(["a", "c"], [3, 4])) { (current, _) in current } + /// // ["a": 1, "b": 2, "c": 4] + /// + /// // Taking the new value for key "a": + /// dictionary.merge(zip(["a", "d"], [5, 6])) { (_, new) in new } + /// // ["a": 5, "b": 2, "c": 4, "d": 6] + /// + /// This operation preserves the order of keys in the original dictionary. + /// New key-value pairs are appended to the end in the order they appear in + /// the given sequence. + /// + /// - Parameters: + /// - keysAndValues: A sequence of key-value pairs. + /// - combine: A closure that takes the current and new values for any + /// duplicate keys. The closure returns the desired value for the final + /// dictionary. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `keysAndValues`, if `Key` implements high-quality hashing. + @_disfavoredOverload // https://github.com/apple/swift-collections/issues/125 + @inlinable + public mutating func merge( + _ keysAndValues: __owned S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows where S.Element == (key: Key, value: Value) { + for (key, value) in keysAndValues { + let (index, bucket) = _keys._find(key) + if let index = index { + try { $0 = try combine($0, value) }(&_values[index]) + } else { + _keys._appendNew(key, in: bucket) + _values.append(value) + } + } + } + + /// Merges the key-value pairs in the given sequence into the dictionary, + /// using a combining closure to determine the value for any duplicate keys. + /// + /// Use the `combine` closure to select a value to use in the updated + /// dictionary, or to combine existing and new values. As the key-value + /// pairs are merged with the dictionary, the `combine` closure is called + /// with the current and new values for any duplicate keys that are + /// encountered. + /// + /// This example shows how to choose the current or new values for any + /// duplicate keys: + /// + /// var dictionary: OrderedDictionary = ["a": 1, "b": 2] + /// + /// // Keeping existing value for key "a": + /// dictionary.merge(zip(["a", "c"], [3, 4])) { (current, _) in current } + /// // ["a": 1, "b": 2, "c": 4] + /// + /// // Taking the new value for key "a": + /// dictionary.merge(zip(["a", "d"], [5, 6])) { (_, new) in new } + /// // ["a": 5, "b": 2, "c": 4, "d": 6] + /// + /// This operation preserves the order of keys in the original dictionary. + /// New key-value pairs are appended to the end in the order they appear in + /// the given sequence. + /// + /// - Parameters: + /// - keysAndValues: A sequence of key-value pairs. + /// - combine: A closure that takes the current and new values for any + /// duplicate keys. The closure returns the desired value for the final + /// dictionary. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `keysAndValues`, if `Key` implements high-quality hashing. + @inlinable + public mutating func merge( + _ keysAndValues: __owned S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows where S.Element == (Key, Value) { + let mapped: LazyMapSequence = + keysAndValues.lazy.map { (key: $0.0, value: $0.1) } + try merge(mapped, uniquingKeysWith: combine) + } + + /// Creates a dictionary by merging key-value pairs in a sequence into this + /// dictionary, using a combining closure to determine the value for + /// duplicate keys. + /// + /// Use the `combine` closure to select a value to use in the returned + /// dictionary, or to combine existing and new values. As the key-value + /// pairs are merged with the dictionary, the `combine` closure is called + /// with the current and new values for any duplicate keys that are + /// encountered. + /// + /// This example shows how to choose the current or new values for any + /// duplicate keys: + /// + /// let dictionary: OrderedDictionary = ["a": 1, "b": 2] + /// let newKeyValues = zip(["a", "b"], [3, 4]) + /// + /// let keepingCurrent = dictionary.merging(newKeyValues) { (current, _) in current } + /// // ["a": 1, "b": 2] + /// let replacingCurrent = dictionary.merging(newKeyValues) { (_, new) in new } + /// // ["a": 3, "b": 4] + /// + /// - Parameters: + /// - other: A sequence of key-value pairs. + /// - combine: A closure that takes the current and new values for any + /// duplicate keys. The closure returns the desired value for the final + /// dictionary. + /// + /// - Returns: A new dictionary with the combined keys and values of this + /// dictionary and `other`. The order of keys in the result dictionary + /// matches that of `self`, with additional key-value pairs (if any) + /// appended at the end in the order they appear in `other`. + /// + /// - Complexity: Expected to be O(`count` + *n*) on average, where *n* is the + /// number of elements in `keysAndValues`, if `Key` implements high-quality + /// hashing. + @_disfavoredOverload // https://github.com/apple/swift-collections/issues/125 + @inlinable + public __consuming func merging( + _ other: __owned S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows -> Self where S.Element == (key: Key, value: Value) { + var copy = self + try copy.merge(other, uniquingKeysWith: combine) + return copy + } + + /// Creates a dictionary by merging key-value pairs in a sequence into this + /// dictionary, using a combining closure to determine the value for + /// duplicate keys. + /// + /// Use the `combine` closure to select a value to use in the returned + /// dictionary, or to combine existing and new values. As the key-value + /// pairs are merged with the dictionary, the `combine` closure is called + /// with the current and new values for any duplicate keys that are + /// encountered. + /// + /// This example shows how to choose the current or new values for any + /// duplicate keys: + /// + /// let dictionary: OrderedDictionary = ["a": 1, "b": 2] + /// let newKeyValues = zip(["a", "b"], [3, 4]) + /// + /// let keepingCurrent = dictionary.merging(newKeyValues) { (current, _) in current } + /// // ["a": 1, "b": 2] + /// let replacingCurrent = dictionary.merging(newKeyValues) { (_, new) in new } + /// // ["a": 3, "b": 4] + /// + /// - Parameters: + /// - other: A sequence of key-value pairs. + /// - combine: A closure that takes the current and new values for any + /// duplicate keys. The closure returns the desired value for the final + /// dictionary. + /// + /// - Returns: A new dictionary with the combined keys and values of this + /// dictionary and `other`. The order of keys in the result dictionary + /// matches that of `self`, with additional key-value pairs (if any) + /// appended at the end in the order they appear in `other`. + /// + /// - Complexity: Expected to be O(`count` + *n*) on average, where *n* is the + /// number of elements in `keysAndValues`, if `Key` implements high-quality + /// hashing. + @inlinable + public __consuming func merging( + _ other: __owned S, + uniquingKeysWith combine: (Value, Value) throws -> Value + ) rethrows -> Self where S.Element == (Key, Value) { + var copy = self + try copy.merge(other, uniquingKeysWith: combine) + return copy + } +} + +extension OrderedDictionary { + /// Returns a new dictionary containing the key-value pairs of the dictionary + /// that satisfy the given predicate. + /// + /// - Parameter isIncluded: A closure that takes a key-value pair as its + /// argument and returns a Boolean value indicating whether the pair + /// should be included in the returned dictionary. + /// + /// - Returns: A dictionary of the key-value pairs that `isIncluded` allows, + /// in the same order that they appear in `self`. + /// + /// - Complexity: O(`count`) + @inlinable + public func filter( + _ isIncluded: (Element) throws -> Bool + ) rethrows -> Self { + var result: OrderedDictionary = [:] + for element in self where try isIncluded(element) { + result._keys._appendNew(element.key) + result._values.append(element.value) + } + return result + } +} + +extension OrderedDictionary { + /// Returns a new dictionary containing the keys of this dictionary with the + /// values transformed by the given closure. + /// + /// - Parameter transform: A closure that transforms a value. `transform` + /// accepts each value of the dictionary as its parameter and returns a + /// transformed value of the same or of a different type. + /// - Returns: A dictionary containing the keys and transformed values of + /// this dictionary, in the same order. + /// + /// - Complexity: O(`count`) + @inlinable + public func mapValues( + _ transform: (Value) throws -> T + ) rethrows -> OrderedDictionary { + OrderedDictionary( + _uniqueKeys: _keys, + values: ContiguousArray(try _values.map(transform))) + } + + /// Returns a new dictionary containing only the key-value pairs that have + /// non-`nil` values as the result of transformation by the given closure. + /// + /// Use this method to receive a dictionary with non-optional values when + /// your transformation produces optional values. + /// + /// In this example, note the difference in the result of using `mapValues` + /// and `compactMapValues` with a transformation that returns an optional + /// `Int` value. + /// + /// let data: OrderedDictionary = ["a": "1", "b": "three", "c": "///4///"] + /// + /// let m: [String: Int?] = data.mapValues { str in Int(str) } + /// // ["a": Optional(1), "b": nil, "c": nil] + /// + /// let c: [String: Int] = data.compactMapValues { str in Int(str) } + /// // ["a": 1] + /// + /// - Parameter transform: A closure that transforms a value. `transform` + /// accepts each value of the dictionary as its parameter and returns an + /// optional transformed value of the same or of a different type. + /// + /// - Returns: A dictionary containing the keys and non-`nil` transformed + /// values of this dictionary, in the same order. + /// + /// - Complexity: O(`count`) + @inlinable + public func compactMapValues( + _ transform: (Value) throws -> T? + ) rethrows -> OrderedDictionary { + var result: OrderedDictionary = [:] + for (key, value) in self { + if let value = try transform(value) { + result._keys._appendNew(key) + result._values.append(value) + } + } + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Codable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Codable.swift new file mode 100644 index 00000000..365d225f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Codable.swift @@ -0,0 +1,46 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: Encodable where Element: Encodable { + /// Encodes the elements of this ordered set into the given encoder. + /// + /// - Parameter encoder: The encoder to write data to. + @inlinable + public func encode(to encoder: Encoder) throws { + var container = encoder.singleValueContainer() + try container.encode(_elements) + } +} + +extension OrderedSet: Decodable where Element: Decodable { + /// Creates a new ordered set by decoding from the given decoder. + /// + /// This initializer throws an error if reading from the decoder fails, or + /// if the decoded contents contain duplicate values. + /// + /// - Parameter decoder: The decoder to read data from. + @inlinable + public init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + let elements = try container.decode(ContiguousArray.self) + + let (table, end) = _HashTable.create(untilFirstDuplicateIn: elements) + guard end == elements.endIndex else { + let context = DecodingError.Context( + codingPath: container.codingPath, + debugDescription: "Decoded elements aren't unique (first duplicate at offset \(end))") + throw DecodingError.dataCorrupted(context) + } + self.init( + _uniqueElements: elements, + elements.count > _HashTable.maximumUnhashedCount ? table : nil) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomDebugStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomDebugStringConvertible.swift new file mode 100644 index 00000000..effbe7d3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomDebugStringConvertible.swift @@ -0,0 +1,36 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: CustomDebugStringConvertible { + /// A textual representation of this instance, suitable for debugging. + public var debugDescription: String { + _debugDescription(typeName: _debugTypeName()) + } + + internal func _debugTypeName() -> String { + "OrderedSet<\(Element.self)>" + } + + internal func _debugDescription(typeName: String) -> String { + var result = "\(typeName)([" + var first = true + for item in self { + if first { + first = false + } else { + result += ", " + } + debugPrint(item, terminator: "", to: &result) + } + result += "])" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomReflectable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomReflectable.swift new file mode 100644 index 00000000..8b054628 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomReflectable.swift @@ -0,0 +1,17 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: CustomReflectable { + /// The custom mirror for this instance. + public var customMirror: Mirror { + Mirror(self, unlabeledChildren: _elements, displayStyle: .collection) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomStringConvertible.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomStringConvertible.swift new file mode 100644 index 00000000..2678ed60 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+CustomStringConvertible.swift @@ -0,0 +1,28 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: CustomStringConvertible { + /// A textual representation of this instance. + public var description: String { + var result = "[" + var first = true + for item in self { + if first { + first = false + } else { + result += ", " + } + print(item, terminator: "", to: &result) + } + result += "]" + return result + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Diffing.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Diffing.swift new file mode 100644 index 00000000..95b60b5e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Diffing.swift @@ -0,0 +1,100 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// Returns the collection difference between the parameter and the + /// receiver, using an algorithm specialized to exploit fast membership + /// testing and the member uniqueness guarantees of `OrderedSet`. + /// + /// - Complexity: O(`self.count + other.count`) + @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) + public func difference( + from other: Self + ) -> CollectionDifference { + /* While admitting that variables with names like "a", "b", "x", and "y" are not especially readable, their use (and meaning) is standard in the diffing literature and familiarity with that literature will help if you're reading this code anyway. */ + let a = other // The collection we're diffing "from". An element present in this collection but not the other is a "remove" + var x = 0 // The working index into `a` + let b = self // The collection we're diffing "to". An element present in this collection but not the other is an "insert" + var y = 0 // The working index into `b` + + var changes = Array.Change>() + func remove() { + let ax = a[x] + changes.append(.remove(offset: x, element: ax, associatedWith: b.lastIndex(of: ax))) + x += 1 + } + func insert() { + let by = b[y] + changes.append(.insert(offset: y, element: by, associatedWith: a.lastIndex(of: by))) + y += 1 + } + + while x < a.count || y < b.count { + if y == b.count { + // No more elements to process in `b`, `a[x]` must have been removed + remove() + } else if x == a.count { + // No more elements to process in `a`, `b[y]` must have been inserted + insert() + } else if let axinb = b.lastIndex(of: a[x]) { + if axinb < y { + // Element has already been processed as an insertion in `b`, generate associated remove for move + remove() + } + else if let byina = a.lastIndex(of: b[y]) { + if byina < x { + // Element has already been processed as a remove in `a`, generate associated insert for move + insert() + } else if x == byina { + assert(y == axinb) + // `a[x]` == `b[y]` + x += 1; y += 1 + } else if byina - x < axinb - y { + // `a[x]` exists further away from the current position in `b` than `b[y] does in `a` + insert() + } else { + // `b[y]` exists further away from the current position in `a` than `a[x]` does in `b` + remove() + } + } else { + // `b[y]` does not exist in `a`, the element must have been inserted + insert() + } + } else { + // `a[x]` does not exist in `b`, the element must have been removed + remove() + } + } + return CollectionDifference(changes)! + } + + /* Replicating RangeReplaceableCollection.applying here would involve + * duplicating a ton of IPI from the stdlib. Dropping down to Array and back + * to OrderedSet is still O(n)-ish which still beats the naïve application + * algorithm of "remove, then insert" + */ + /// Applies the given difference to this collection. + /// + /// - Parameter difference: The difference to be applied. + /// + /// - Returns: An instance representing the state of the receiver with the + /// difference applied, or `nil` if the difference is incompatible with + /// the receiver's state. + /// + /// - Complexity: O(*n* + *c*), where *n* is `self.count` and *c* + /// is the number of changes contained by the parameter. + @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) + public func applying(_ difference: CollectionDifference) -> Self? { + guard let array = self.elements.applying(difference) else { return nil } + let result = OrderedSet(array) + return result.count == array.count ? result : nil + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Equatable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Equatable.swift new file mode 100644 index 00000000..1190cd6e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Equatable.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: Equatable { + /// Returns a Boolean value indicating whether two values are equal. + /// + /// Two ordered sets are considered equal if they contain the same + /// elements in the same order. + /// + /// - Complexity: O(`min(left.count, right.count)`) + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + left.elementsEqual(right) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ExpressibleByArrayLiteral.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ExpressibleByArrayLiteral.swift new file mode 100644 index 00000000..1d1d6dec --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ExpressibleByArrayLiteral.swift @@ -0,0 +1,32 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: ExpressibleByArrayLiteral { + /// Creates a new ordered set from the contents of an array literal. + /// + /// Duplicate elements in the literal are allowed, but the resulting ordered + /// set will only contain the first occurrence of each. + /// + /// Do not call this initializer directly. It is used by the compiler when + /// you use an array literal. Instead, create a new ordered set using an array + /// literal as its value by enclosing a comma-separated list of values in + /// square brackets. You can use an array literal anywhere an ordered set is + /// expected by the type context. + /// + /// - Parameter elements: A variadic list of elements of the new ordered set. + /// + /// - Complexity: O(`elements.count`) if `Element` implements + /// high-quality hashing. + @inlinable + public init(arrayLiteral elements: Element...) { + self.init(elements) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Hashable.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Hashable.swift new file mode 100644 index 00000000..3acba720 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Hashable.swift @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: Hashable { + /// Hashes the essential components of this value by feeding them into the + /// given hasher. + /// + /// Complexity: O(`count`) + @inlinable + public func hash(into hasher: inout Hasher) { + hasher.combine(count) // Discriminator + for item in _elements { + hasher.combine(item) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Initializers.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Initializers.swift new file mode 100644 index 00000000..e4cf7e94 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Initializers.swift @@ -0,0 +1,150 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// Creates a set with the contents of the given sequence, which + /// must not include duplicate elements. + /// + /// In optimized builds, this initializer does not verify that the + /// elements are actually unique. This makes creating the set + /// somewhat faster if you know for sure that the elements are + /// unique (e.g., because they come from another collection with + /// guaranteed-unique members, such as a `Set`). However, if you + /// accidentally call this initializer with duplicate members, it + /// can return a corrupt set value that may be difficult to debug. + /// + /// - Parameter elements: A finite sequence of unique elements. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the + /// number of elements in the sequence, if `Element` implements + /// high-quality hashing. + @inlinable + @inline(__always) + public init(uncheckedUniqueElements elements: S) + where S.Element == Element { + let elements = ContiguousArray(elements) +#if DEBUG + let (table, firstDupe) = _HashTable.create(untilFirstDuplicateIn: elements) + precondition(firstDupe == elements.endIndex, + "Duplicate elements found in input") +#else + let table = _HashTable.create(uncheckedUniqueElements: elements) +#endif + self.init( + _uniqueElements: elements, + elements.count > _HashTable.maximumUnhashedCount ? table : nil) + _checkInvariants() + } +} + +extension OrderedSet { + /// Creates a new set from a finite sequence of items. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform O(*n*) + /// comparisons on average (where *n* is the number of elements + /// in the sequence), provided that `Element` implements + /// high-quality hashing. + @inlinable + public init(_ elements: S) where S.Element == Element { + if S.self == Self.self { + self = elements as! Self + return + } + // Fast paths for when we know elements are all unique + if S.self == Set.self || S.self == SubSequence.self { + self.init(uncheckedUniqueElements: elements) + return + } + + self.init() + append(contentsOf: elements) + } + + // Specializations + + /// Creates a new set from a an existing set. This is functionally the same as + /// copying the value of `elements` into a new variable. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: O(1) + @inlinable + public init(_ elements: Self) { + self = elements + } + + /// Creates a new set from an existing slice of another set. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform + /// O(`elements.count`) operations on average, provided that + /// `Element` implements high-quality hashing. + @inlinable + public init(_ elements: SubSequence) { + self.init(uncheckedUniqueElements: elements._slice) + } + + /// Creates a new set from an existing `Set` value. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform + /// O(`elements.count`) operations on average, provided that + /// `Element` implements high-quality hashing. + @inlinable + public init(_ elements: Set) { + self.init(uncheckedUniqueElements: elements) + } + + /// Creates a new set from the keys view of a dictionary. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform + /// O(`elements.count`) operations on average, provided that + /// `Element` implements high-quality hashing. + @inlinable + public init(_ elements: Dictionary.Keys) { + self._elements = ContiguousArray(elements) + _regenerateHashTable() + _checkInvariants() + } + + /// Creates a new set from a collection of items. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform O(*n*) + /// comparisons on average (where *n* is the number of elements + /// in the sequence), provided that `Element` implements + /// high-quality hashing. + @inlinable + public init( + _ elements: C + ) where C.Element == Element { + // This code is careful not to copy storage if `C` is an Array + // or ContiguousArray and the elements are already unique. + let (table, firstDupe) = _HashTable.create( + untilFirstDuplicateIn: elements) + if firstDupe == elements.endIndex { + // Fast path: `elements` consists of unique values. + self.init(_uniqueElements: ContiguousArray(elements), table) + return + } + + // Otherwise keep the elements we've processed and add the rest one by one. + self.init(_uniqueElements: ContiguousArray(elements[.. (inserted: Bool, index: Int) { + let (index, bucket) = _find(item) + if let index = index { return (false, index) } + _appendNew(item, in: bucket) + return (true, _elements.index(before: _elements.endIndex)) + } + + /// Append a new member to the end of the set, if the set doesn't + /// already contain it. + /// + /// - Parameter item: The element to add to the set. + /// + /// - Returns: A pair `(inserted, index)`, where `inserted` is a Boolean value + /// indicating whether the operation added a new element, and `index` is + /// the index of `item` in the resulting set. + /// + /// - Complexity: The operation is expected to perform O(1) copy, hash, and + /// compare operations on the `Element` type, if it implements high-quality + /// hashing. + @inlinable + @inline(__always) + @discardableResult + public mutating func append(_ item: Element) -> (inserted: Bool, index: Int) { + let result = _append(item) + _checkInvariants() + return result + } + + /// Append the contents of a sequence to the end of the set, excluding + /// elements that are already members. + /// + /// This is functionally equivalent to `self.formUnion(elements)`, but it's + /// more explicit about how the new members are ordered in the new set. + /// + /// - Parameter elements: A finite sequence of elements to append. + /// + /// - Complexity: The operation is expected to perform amortized O(1) copy, + /// hash, and compare operations on the `Element` type, if it implements + /// high-quality hashing. + @inlinable + public mutating func append( + contentsOf elements: S + ) where S.Element == Element { + for item in elements { + _append(item) + } + _checkInvariants() + } +} + +extension OrderedSet { + @inlinable + internal mutating func _insertNew( + _ item: Element, + at index: Int, + in bucket: _Bucket + ) { + guard _elements.count < _capacity else { + _elements.insert(item, at: index) + _regenerateHashTable() + return + } + guard _table != nil else { + _elements.insert(item, at: index) + return + } + + _ensureUnique() + _table!.update { hashTable in + assert(!hashTable.isOccupied(bucket)) + hashTable.adjustContents(preparingForInsertionOfElementAtOffset: index, in: _elements) + hashTable[bucket] = index + } + _elements.insert(item, at: index) + _checkInvariants() + } + + /// Insert a new member to this set at the specified index, if the set doesn't + /// already contain it. + /// + /// - Parameter item: The element to insert. + /// + /// - Returns: A pair `(inserted, index)`, where `inserted` is a Boolean value + /// indicating whether the operation added a new element, and `index` is + /// the index of `item` in the resulting set. If `inserted` is false, then + /// the returned `index` may be different from the index requested. + /// + /// - Complexity: The operation is expected to perform amortized + /// O(`self.count`) copy, hash, and compare operations on the `Element` + /// type, if it implements high-quality hashing. (Insertions need to make + /// room in the storage array to add the inserted element.) + @inlinable + @discardableResult + public mutating func insert( + _ item: Element, + at index: Int + ) -> (inserted: Bool, index: Int) { + let (existing, bucket) = _find(item) + if let existing = existing { return (false, existing) } + _insertNew(item, at: index, in: bucket) + return (true, index) + } +} + +extension OrderedSet { + /// Replace the member at the given index with a new value that compares equal + /// to it. + /// + /// This is useful when equal elements can be distinguished by identity + /// comparison or some other means. + /// + /// - Parameter item: The new value that should replace the original element. + /// `item` must compare equal to the original value. + /// + /// - Parameter index: The index of the element to be replaced. + /// + /// - Returns: The original element that was replaced. + /// + /// - Complexity: Amortized O(1). + @inlinable + @discardableResult + public mutating func update(_ item: Element, at index: Int) -> Element { + let old = _elements[index] + precondition( + item == old, + "The replacement item must compare equal to the original") + _elements[index] = item + return old + } +} + +extension OrderedSet { + /// Adds the given element to the set unconditionally, either appending it to + /// the set, or replacing an existing value if it's already present. + /// + /// This is useful when equal elements can be distinguished by identity + /// comparison or some other means. + /// + /// - Parameter item: The value to append or replace. + /// + /// - Returns: The original element that was replaced by this operation, or + /// `nil` if the value was appended to the end of the collection. + /// + /// - Complexity: The operation is expected to perform amortized O(1) copy, + /// hash, and compare operations on the `Element` type, if it implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func updateOrAppend(_ item: Element) -> Element? { + let (inserted, index) = _append(item) + if inserted { return nil } + let old = _elements[index] + _elements[index] = item + _checkInvariants() + return old + } + + /// Adds the given element into the set unconditionally, either inserting it + /// at the specified index, or replacing an existing value if it's already + /// present. + /// + /// This is useful when equal elements can be distinguished by identity + /// comparison or some other means. + /// + /// - Parameter item: The value to append or replace. + /// + /// - Parameter index: The index at which to insert the new member if `item` + /// isn't already in the set. + /// + /// - Returns: The original element that was replaced by this operation, or + /// `nil` if the value was newly inserted into the collection. + /// + /// - Complexity: The operation is expected to perform amortized O(1) copy, + /// hash, and compare operations on the `Element` type, if it implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func updateOrInsert( + _ item: Element, + at index: Int + ) -> (originalMember: Element?, index: Int) { + let (existing, bucket) = _find(item) + if let existing = existing { + let old = _elements[existing] + _elements[existing] = item + return (old, existing) + } + _insertNew(item, at: index, in: bucket) + return (nil, index) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Invariants.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Invariants.swift new file mode 100644 index 00000000..51c853b7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Invariants.swift @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + #if COLLECTIONS_INTERNAL_CHECKS + @inlinable + @inline(never) @_effects(releasenone) + public func _checkInvariants() { + if _table == nil { + precondition(_elements.count <= _HashTable.maximumUnhashedCount, + "Oversized set without a hash table") + precondition(Set(_elements).count == _elements.count, + "Duplicate items in set") + return + } + // Check that each element in _elements can be found in the hash table. + for index in _elements.indices { + let item = _elements[index] + let i = _find(item).index + precondition(i != nil, + "Index \(index) not found in hash table (element: \(item))") + precondition( + i == index, + "Offset of element '\(item)' in hash table differs from its position") + } + // Check that the hash table has exactly as many entries as there are elements. + _table!.read { hashTable in + var it = hashTable.bucketIterator(startingAt: _Bucket(offset: 0)) + var c = 0 + repeat { + it.advance() + if it.isOccupied { c += 1 } + } while it.currentBucket.offset != 0 + precondition( + c == _elements.count, + """ + Number of entries in hash table (\(c)) differs + from number of elements (\(_elements.count)) + """) + } + } + #else + @inline(__always) @inlinable + public func _checkInvariants() {} + #endif // COLLECTIONS_INTERNAL_CHECKS +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial MutableCollection.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial MutableCollection.swift new file mode 100644 index 00000000..1103f0cd --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial MutableCollection.swift @@ -0,0 +1,442 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// The parts of MutableCollection that OrderedSet is able to implement. + +extension OrderedSet { + /// Exchanges the values at the specified indices of the set. + /// + /// Both parameters must be valid indices below `endIndex`. Passing the same + /// index as both `i` and `j` has no effect. + /// + /// - Parameters: + /// - i: The index of the first value to swap. + /// - j: The index of the second value to swap. + /// + /// - Complexity: O(1) when the set's storage isn't shared with another + /// value; O(`count`) otherwise. + @inlinable + public mutating func swapAt(_ i: Int, _ j: Int) { + guard i != j else { return } + _elements.swapAt(i, j) + guard _table != nil else { return } + _ensureUnique() + _table!.update { hashTable in + hashTable.swapBucketValues(for: _elements[i], withCurrentValue: j, + and: _elements[j], withCurrentValue: i) + } + _checkInvariants() + } + + /// Reorders the elements of the set such that all the elements that match the + /// given predicate are after all the elements that don't match. + /// + /// After partitioning a collection, there is a pivot index `p` where + /// no element before `p` satisfies the `belongsInSecondPartition` + /// predicate and every element at or after `p` satisfies + /// `belongsInSecondPartition`. + /// + /// In the following example, an ordered set of numbers is partitioned by a + /// predicate that matches elements greater than 30. + /// + /// var numbers: OrderedSet = [30, 40, 20, 30, 30, 60, 10] + /// let p = numbers.partition(by: { $0 > 30 }) + /// // p == 5 + /// // numbers == [30, 10, 20, 30, 30, 60, 40] + /// + /// The `numbers` set is now arranged in two partitions. The first partition, + /// `numbers[.. Bool + ) rethrows -> Int { + try _partition(by: belongsInSecondPartition, callback: { a, b in }) + } +} + +extension OrderedSet { + @inlinable + public mutating func _partition( + by belongsInSecondPartition: (Element) throws -> Bool, + callback: (Int, Int) -> Void + ) rethrows -> Int { + guard _table != nil else { + return try _elements.partition(by: belongsInSecondPartition) + } + _ensureUnique() + let result: Int = try _table!.update { hashTable in + let maybeOffset: Int? = try _elements.withContiguousMutableStorageIfAvailable { buffer in + let pivot = try buffer._partition( + with: hashTable, + by: belongsInSecondPartition, + callback: callback) + return pivot - buffer.startIndex + } + if let offset = maybeOffset { + return _elements.index(startIndex, offsetBy: offset) + } + return try _elements._partition( + with: hashTable, + by: belongsInSecondPartition, + callback: callback) + } + _checkInvariants() + return result + } +} + +extension MutableCollection where Self: RandomAccessCollection, Element: Hashable { + @inlinable + internal mutating func _partition( + with hashTable: _UnsafeHashTable, + by belongsInSecondPartition: (Element) throws -> Bool, + callback: (Int, Int) -> Void + ) rethrows -> Index { + var low = startIndex + var high = endIndex + + while true { + // Invariants at this point: + // - low <= high + // - all elements in `startIndex ..< low` belong in the first partition + // - all elements in `high ..< endIndex` belong in the second partition + + // Find next element from `lo` that may not be in the right place. + while true { + if low == high { return low } + if try belongsInSecondPartition(self[low]) { break } + formIndex(after: &low) + } + + // Find next element down from `hi` that we can swap `lo` with. + while true { + formIndex(before: &high) + if low == high { return low } + if try !belongsInSecondPartition(self[high]) { break } + } + + // Swap the two elements as well as their associated hash table buckets. + swapAt(low, high) + let offsetLow = _offset(of: low) + let offsetHigh = _offset(of: high) + hashTable.swapBucketValues(for: self[low], withCurrentValue: offsetHigh, + and: self[high], withCurrentValue: offsetLow) + callback(offsetLow, offsetHigh) + + formIndex(after: &low) + } + } +} + +extension _UnsafeHashTable { + @inlinable + @inline(__always) + func swapBucketValues( + for left: Element, withCurrentValue leftValue: Int, + and right: Element, withCurrentValue rightValue: Int + ) { + let left = idealBucket(for: left) + let right = idealBucket(for: right) + swapBucketValues(for: left, withCurrentValue: leftValue, + and: right, withCurrentValue: rightValue) + } + + @usableFromInline + @_effects(releasenone) + func swapBucketValues( + for left: Bucket, withCurrentValue leftValue: Int, + and right: Bucket, withCurrentValue rightValue: Int + ) { + var it = bucketIterator(startingAt: left) + it.advance(until: leftValue) + assert(it.isOccupied) + it.currentValue = rightValue + + it = bucketIterator(startingAt: right) + it.advance(until: rightValue) + assert(it.isOccupied) + // Note: this second update may mistake the bucket for `right` with the + // bucket for `left` whose value we just updated. The second update will + // restore the original hash table contents in this case. This is okay! + // When this happens, the lookup chains for both elements include each + // other, so leaving the hash table unchanged still leaves us with a + // working hash table. + it.currentValue = leftValue + } +} + +extension OrderedSet { + /// Sorts the collection in place, using the given predicate as the + /// comparison between elements. + /// + /// When you want to sort a collection of elements that don't conform to + /// the `Comparable` protocol, pass a closure to this method that returns + /// `true` when the first element should be ordered before the second. + /// + /// Alternatively, use this method to sort a collection of elements that do + /// conform to `Comparable` when you want the sort to be descending instead + /// of ascending. Pass the greater-than operator (`>`) operator as the + /// predicate. + /// + /// `areInIncreasingOrder` must be a *strict weak ordering* over the + /// elements. That is, for any elements `a`, `b`, and `c`, the following + /// conditions must hold: + /// + /// - `areInIncreasingOrder(a, a)` is always `false`. (Irreflexivity) + /// - If `areInIncreasingOrder(a, b)` and `areInIncreasingOrder(b, c)` are + /// both `true`, then `areInIncreasingOrder(a, c)` is also `true`. + /// (Transitive comparability) + /// - Two elements are *incomparable* if neither is ordered before the other + /// according to the predicate. If `a` and `b` are incomparable, and `b` + /// and `c` are incomparable, then `a` and `c` are also incomparable. + /// (Transitive incomparability) + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements for which + /// `areInIncreasingOrder` does not establish an order. + /// + /// - Parameter areInIncreasingOrder: A predicate that returns `true` if its + /// first argument should be ordered before its second argument; + /// otherwise, `false`. If `areInIncreasingOrder` throws an error during + /// the sort, the elements may be in a different order, but none will be + /// lost. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + public mutating func sort( + by areInIncreasingOrder: (Element, Element) throws -> Bool + ) rethrows { + defer { + // Note: This assumes that `sort(by:)` won't leave duplicate/missing + // elements in the table when the closure throws. This matches the + // stdlib's behavior in Swift 5.3, and it seems like a reasonable + // long-term assumption. + _regenerateExistingHashTable() + _checkInvariants() + } + try _elements.sort(by: areInIncreasingOrder) + } +} + +extension OrderedSet where Element: Comparable { + /// Sorts the set in place. + /// + /// You can sort an ordered set of elements that conform to the + /// `Comparable` protocol by calling this method. Elements are sorted in + /// ascending order. + /// + /// Here's an example of sorting a list of students' names. Strings in Swift + /// conform to the `Comparable` protocol, so the names are sorted in + /// ascending order according to the less-than operator (`<`). + /// + /// var students: OrderedSet = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"] + /// students.sort() + /// print(students) + /// // Prints "["Abena", "Akosua", "Kofi", "Kweku", "Peter"]" + /// + /// To sort the elements of your collection in descending order, pass the + /// greater-than operator (`>`) to the `sort(by:)` method. + /// + /// students.sort(by: >) + /// print(students) + /// // Prints "["Peter", "Kweku", "Kofi", "Akosua", "Abena"]" + /// + /// The sorting algorithm is not guaranteed to be stable. A stable sort + /// preserves the relative order of elements that compare equal. + /// + /// - Complexity: O(*n* log *n*), where *n* is the length of the collection. + @inlinable + public mutating func sort() { + defer { + // Note: This assumes that `sort(by:)` won't leave duplicate/missing + // elements in the table when the closure throws. This matches the + // stdlib's behavior in Swift 5.3, and it seems like a reasonable + // long-term assumption. + _regenerateExistingHashTable() + _checkInvariants() + } + _elements.sort() + } +} + +extension OrderedSet { + /// Shuffles the collection in place. + /// + /// Use the `shuffle()` method to randomly reorder the elements of an ordered + /// set. + /// + /// var names: OrderedSet + /// = ["Alejandro", "Camila", "Diego", "Luciana", "Luis", "Sofía"] + /// names.shuffle() + /// // names == ["Luis", "Camila", "Luciana", "Sofía", "Alejandro", "Diego"] + /// + /// This method is equivalent to calling `shuffle(using:)`, passing in the + /// system's default random generator. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + @inlinable + public mutating func shuffle() { + var generator = SystemRandomNumberGenerator() + shuffle(using: &generator) + } + + /// Shuffles the collection in place, using the given generator as a source + /// for randomness. + /// + /// You use this method to randomize the elements of a collection when you + /// are using a custom random number generator. For example, you can use the + /// `shuffle(using:)` method to randomly reorder the elements of an array. + /// + /// var names: OrderedSet + /// = ["Alejandro", "Camila", "Diego", "Luciana", "Luis", "Sofía"] + /// names.shuffle(using: &myGenerator) + /// // names == ["Sofía", "Alejandro", "Camila", "Luis", "Diego", "Luciana"] + /// + /// - Parameter generator: The random number generator to use when shuffling + /// the collection. + /// + /// - Complexity: O(*n*), where *n* is the length of the collection. + /// + /// - Note: The algorithm used to shuffle a collection may change in a future + /// version of Swift. If you're passing a generator that results in the + /// same shuffled order each time you run your program, that sequence may + /// change when your program is compiled using a different version of + /// Swift. + @inlinable + public mutating func shuffle( + using generator: inout T + ) { + _elements.shuffle(using: &generator) + _regenerateExistingHashTable() + _checkInvariants() + } +} + +extension OrderedSet { + /// Reverses the elements of the ordered set in place. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func reverse() { + _elements.reverse() + // FIXME: Update hash table contents in place. + _regenerateHashTable() + _checkInvariants() + } +} + +extension OrderedSet { + + /// Moves all elements satisfying `belongsInSecondPartition` into a suffix + /// of the collection, returning the start position of the resulting suffix. + /// On return, the items before this pivot index remain in the order they + /// originally appeared in the collection. + /// + /// - Complexity: O(*n*) where n is the length of the collection. + @inlinable + internal mutating func _halfStablePartition( + values: UnsafeMutableBufferPointer, + by belongsInSecondPartition: ((key: Element, value: Value)) throws -> Bool + ) rethrows -> Int { + precondition(self.count == values.count) + var i = 0 + try _elements.withUnsafeMutableBufferPointer { keys in + while i < keys.count, try !belongsInSecondPartition((keys[i], values[i])) { + i += 1 + } + } + guard i < self.count else { return self.count } + + self._ensureUnique() + let table = _table + self._table = nil + defer { self._table = table } + + return try _elements.withUnsafeMutableBufferPointer { keys in + for j in i + 1 ..< keys.count { + guard try !belongsInSecondPartition((keys[j], values[j])) else { + continue + } + keys.swapAt(i, j) + values.swapAt(i, j) + table?.update { hashTable in + hashTable.swapBucketValues(for: keys[i], withCurrentValue: j, + and: keys[j], withCurrentValue: i) + } + i += 1 + } + return i + } + } + + @inlinable + internal mutating func _partition( + values: UnsafeMutableBufferPointer, + by belongsInSecondPartition: ((key: Element, value: Value)) throws -> Bool + ) rethrows -> Int { + self._ensureUnique() + let table = self._table + self._table = nil + defer { self._table = table } + return try _elements.withUnsafeMutableBufferPointer { keys in + assert(keys.count == values.count) + var low = keys.startIndex + var high = keys.endIndex + + while true { + // Invariants at this point: + // - low <= high + // - all elements in `startIndex ..< low` belong in the first partition + // - all elements in `high ..< endIndex` belong in the second partition + + // Find next element from `lo` that may not be in the right place. + while true { + if low == high { return low } + if try belongsInSecondPartition((keys[low], values[low])) { break } + low += 1 + } + + // Find next element down from `hi` that we can swap `lo` with. + while true { + high -= 1 + if low == high { return low } + if try !belongsInSecondPartition((keys[high], values[high])) { break } + } + + // Swap the two elements as well as their associated hash table buckets. + keys.swapAt(low, high) + values.swapAt(low, high) + table?.update { hashTable in + hashTable.swapBucketValues(for: keys[low], withCurrentValue: high, + and: keys[high], withCurrentValue: low) + } + low += 1 + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial RangeReplaceableCollection.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial RangeReplaceableCollection.swift new file mode 100644 index 00000000..fd8750d0 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial RangeReplaceableCollection.swift @@ -0,0 +1,224 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// The parts of RangeReplaceableCollection that OrderedSet is able to implement. + +extension OrderedSet { + /// Removes all members from the set. + /// + /// - Parameter keepingCapacity: If `true`, the set's storage capacity is + /// preserved; if `false`, the underlying storage is released. The default + /// is `false`. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll(keepingCapacity keepCapacity: Bool = false) { + _elements.removeAll(keepingCapacity: keepCapacity) + guard keepCapacity else { + _table = nil + return + } + guard _table != nil else { return } + _ensureUnique() + _table!.update { hashTable in + hashTable.clear() + } + } + + /// Removes and returns the element at the specified position. + /// + /// All the elements following the specified position are moved to close the + /// resulting gap. + /// + /// - Parameter index: The position of the element to remove. `index` must be + /// a valid index of the collection that is not equal to the collection's + /// end index. + /// + /// - Returns: The removed element. + /// + /// - Complexity: O(`count`) + @inlinable + @discardableResult + public mutating func remove(at index: Int) -> Self.Element { + _elements._failEarlyRangeCheck(index, bounds: startIndex ..< endIndex) + let bucket = _bucket(for: index) + return _removeExistingMember(at: index, in: bucket) + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange(_ bounds: Range) { + _elements._failEarlyRangeCheck( + bounds, + bounds: _elements.startIndex ..< _elements.endIndex) + guard _table != nil else { + _elements.removeSubrange(bounds) + _checkInvariants() + return + } + let c = bounds.count + guard c > 0 else { return } + let remainingCount = _elements.count - c + if remainingCount <= count / 2 || remainingCount < _minimumCapacity { + // Just generate a new table from scratch. + _elements.removeSubrange(bounds) + _regenerateHashTable() + _checkInvariants() + return + } + + _ensureUnique() + _table!.update { hashTable in + // Delete the hash table entries for all members we're removing. + for item in _elements[bounds] { + let (offset, bucket) = hashTable._find(item, in: _elements) + precondition(offset != nil, "Corrupt hash table") + hashTable.delete( + bucket: bucket, + hashValueGenerator: { offset, seed in + return _elements[offset]._rawHashValue(seed: seed) + }) + } + hashTable.adjustContents(preparingForRemovalOf: bounds, in: _elements) + } + _elements.removeSubrange(bounds) + _checkInvariants() + } + + /// Removes the specified subrange of elements from the collection. + /// + /// All the elements following the specified subrange are moved to close the + /// resulting gap. + /// + /// - Parameter bounds: The subrange of the collection to remove. The bounds + /// of the range must be valid indices of the collection. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeSubrange( + _ bounds: R + ) where R.Bound == Int { + removeSubrange(bounds.relative(to: self)) + } + + /// Removes the last element of a non-empty set. + /// + /// - Complexity: Expected to be O(`1`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + @discardableResult + public mutating func removeLast() -> Element { + precondition(!isEmpty, "Cannot remove last element of an empty collection") + guard _table != nil else { + return _elements.removeLast() + } + guard _elements.count - 1 >= _minimumCapacity else { + let old = _elements.removeLast() + _regenerateHashTable() + return old + } + defer { _checkInvariants() } + let old = _elements.removeLast() + _ensureUnique() + _table!.update { hashTable in + var it = hashTable.bucketIterator(for: old) + it.advance(until: _elements.count) + // Delete the entry for the removed member. + hashTable.delete( + bucket: it.currentBucket, + hashValueGenerator: { offset, seed in + _elements[offset]._rawHashValue(seed: seed) + }) + } + return old + } + + /// Removes the last `n` element of the set. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the collection. + /// + /// - Complexity: Expected to be O(`n`) on average, if `Element` implements + /// high-quality hashing. + @inlinable + public mutating func removeLast(_ n: Int) { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the collection") + removeSubrange(count - n ..< count) + } + + /// Removes the first element of a non-empty set. + /// + /// The members following the removed item need to be moved to close the + /// resulting gap in the storage array. + /// + /// - Complexity: O(`count`). + @inlinable + @discardableResult + public mutating func removeFirst() -> Element { + precondition(!isEmpty, "Cannot remove first element of an empty collection") + return remove(at: startIndex) + } + + /// Removes the first `n` elements of the set. + /// + /// The members following the removed items need to be moved to close the + /// resulting gap in the storage array. + /// + /// - Parameter n: The number of elements to remove from the collection. + /// `n` must be greater than or equal to zero and must not exceed the + /// number of elements in the set. + /// + /// - Complexity: O(`count`). + @inlinable + public mutating func removeFirst(_ n: Int) { + precondition(n >= 0, "Can't remove a negative number of elements") + precondition(n <= count, "Can't remove more elements than there are in the collection") + removeSubrange(0 ..< n) + } + + /// Removes all the elements that satisfy the given predicate. + /// + /// Use this method to remove every element in a collection that meets + /// particular criteria. The order of the remaining elements is preserved. + /// + /// This example removes all the odd values from an + /// array of numbers: + /// + /// var numbers: OrderedSet = [5, 6, 7, 8, 9, 10, 11] + /// numbers.removeAll(where: { !$0.isMultiple(of: 2) }) + /// // numbers == [6, 8, 10] + /// + /// - Parameter shouldBeRemoved: A closure that takes an element of the + /// set as its argument and returns a Boolean value indicating + /// whether the element should be removed from the set. + /// + /// - Complexity: O(`count`) + @inlinable + public mutating func removeAll( + where shouldBeRemoved: (Element) throws -> Bool + ) rethrows { + defer { + _regenerateHashTable() + _checkInvariants() + } + try _elements.removeAll(where: shouldBeRemoved) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Basics.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Basics.swift new file mode 100644 index 00000000..cd303b02 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Basics.swift @@ -0,0 +1,76 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// `OrderedSet` does not directly conform to `SetAlgebra` because its definition +// of equality conflicts with `SetAlgebra` requirements. However, it still +// implements most `SetAlgebra` requirements (except `insert`, which is replaced +// by `append`). +// +// `OrderedSet` also provides an `unordered` view that explicitly conforms to +// `SetAlgebra`. That view implements `Equatable` by ignoring element order, +// so it can satisfy `SetAlgebra` requirements. + +extension OrderedSet { + /// Creates an empty set. + /// + /// This initializer is equivalent to initializing with an empty array + /// literal. + /// + /// - Complexity: O(1) + @inlinable + public init() { + __storage = nil + _elements = [] + } +} + +extension OrderedSet { + /// Returns a Boolean value that indicates whether the given element exists + /// in the set. + /// + /// - Parameter element: An element to look for in the set. + /// + /// - Returns: `true` if `member` exists in the set; otherwise, `false`. + /// + /// - Complexity: This operation is expected to perform O(1) comparisons on + /// average, provided that `Element` implements high-quality hashing. + @inlinable + public func contains(_ element: Element) -> Bool { + _find_inlined(element).index != nil + } +} + +extension OrderedSet { + /// Removes the given element from the set. + /// + /// - Parameter member: The element of the set to remove. + /// + /// - Returns: The element equal to `member` if `member` is contained in the + /// set; otherwise, `nil`. In some cases, the returned element may be + /// distinguishable from `newMember` by identity comparison or some other + /// means. + /// + /// - Complexity: O(`count`). Removing an element from the middle of the + /// underlying ordered set needs to rearrange the remaining elements to + /// close the resulting gap. + /// + /// Removing the last element only takes (amortized) O(1) + /// hashing/comparisons operations, if `Element` implements high quality + /// hashing. + @inlinable + @discardableResult + public mutating func remove(_ member: Element) -> Element? { + let (idx, bucket) = _find(member) + guard let index = idx else { return nil } + return _removeExistingMember(at: index, in: bucket) + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Operations.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Operations.swift new file mode 100644 index 00000000..474d7431 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Operations.swift @@ -0,0 +1,589 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// `OrderedSet` does not directly conform to `SetAlgebra` because its definition +// of equality conflicts with `SetAlgebra` requirements. However, it still +// implements most `SetAlgebra` requirements (except `insert`, which is replaced +// by `append`). +// +// `OrderedSet` also provides an `unordered` view that explicitly conforms to +// `SetAlgebra`. That view implements `Equatable` by ignoring element order, +// so it can satisfy `SetAlgebra` requirements. + +extension OrderedSet { + /// Adds the elements of the given set to this set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the set, in the order they appear in `other`. + /// + /// var a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [0, 2, 4, 6] + /// a.formUnion(b) + /// // `a` is now `[1, 2, 3, 4, 0, 6]` + /// + /// - Parameter other: The set of elements to insert. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public mutating func formUnion(_ other: __owned Self) { + append(contentsOf: other) + } + + /// Returns a new set with the elements of both this and the given set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the result, in the order they appear in `other`. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [0, 2, 4, 6] + /// a.union(b) // [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: The set of elements to add. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + public __consuming func union(_ other: __owned Self) -> Self { + var result = self + result.formUnion(other) + return result + } + + // Generalizations + + /// Adds the elements of the given set to this set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the set, in the order they appear in `other`. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [0, 2, 4, 6] + /// a.formUnion(b.unordered) + /// // a is now [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: The set of elements to add. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func formUnion(_ other: __owned UnorderedView) { + formUnion(other._base) + } + + /// Returns a new set with the elements of both this and the given set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the result, in the order they appear in `other`. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [0, 2, 4, 6] + /// a.union(b.unordered) // [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: The set of elements to add. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func union(_ other: __owned UnorderedView) -> Self { + union(other._base) + } + + /// Adds the elements of the given sequence to this set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the set, in the order they appear in `other`. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Array = [0, 2, 4, 6] + /// a.formUnion(b) + /// // a is now [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + public mutating func formUnion( + _ other: __owned S + ) where S.Element == Element { + append(contentsOf: other) + } + + /// Returns a new set with the elements of both this and the given set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the result, in the order they appear in `other`. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Array = [0, 2, 4, 6] + /// a.union(b) // [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + public __consuming func union( + _ other: __owned S + ) -> Self where S.Element == Element { + var result = self + result.formUnion(other) + return result + } +} + +extension OrderedSet { + /// Returns a new set with the elements that are common to both this set and + /// the provided other one, in the order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.intersection(other) // [2, 4] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public __consuming func intersection(_ other: Self) -> Self { + var result = Self() + for item in self { + if other.contains(item) { + result._appendNew(item) + } + } + result._checkInvariants() + return result + } + + /// Removes the elements of this set that aren't also in the given one. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.formIntersection(other) + /// // set is now [2, 4] + /// + /// - Parameter other: A set of elements. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public mutating func formIntersection(_ other: Self) { + self = self.intersection(other) + } + + // Generalizations + + /// Returns a new set with the elements that are common to both this set and + /// the provided other one, in the order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.intersection(other) // [2, 4] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func intersection(_ other: UnorderedView) -> Self { + intersection(other._base) + } + + /// Removes the elements of this set that aren't also in the given one. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.formIntersection(other) + /// // set is now [2, 4] + /// + /// - Parameter other: A set of elements. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func formIntersection(_ other: UnorderedView) { + formIntersection(other._base) + } + + /// Returns a new set with the elements that are common to both this set and + /// the provided sequence, in the order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// set.intersection([6, 4, 2, 0] as Array) // [2, 4] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(*n*) on average where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public __consuming func intersection( + _ other: S + ) -> Self where S.Element == Element { + _UnsafeBitset.withTemporaryBitset(capacity: self.count) { bitset in + for item in other { + if let index = self._find_inlined(item).index { + bitset.insert(index) + } + } + let result = self._extractSubset(using: bitset) + result._checkInvariants() + return result + } + } + + /// Removes the elements of this set that aren't also in the given sequence. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// set.formIntersection([6, 4, 2, 0] as Array) + /// // set is now [2, 4] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(*n*) on average where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public mutating func formIntersection( + _ other: S + ) where S.Element == Element { + self = self.intersection(other) + } +} + +extension OrderedSet { + /// Returns a new set with the elements that are either in this set or in + /// `other`, but not in both. + /// + /// The result contains elements from `self` followed by elements in `other`, + /// in the same order they appeared in the original sets. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.symmetricDifference(other) // [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public __consuming func symmetricDifference(_ other: __owned Self) -> Self { + _UnsafeBitset.withTemporaryBitset(capacity: self.count) { bitset1 in + _UnsafeBitset.withTemporaryBitset(capacity: other.count) { bitset2 in + bitset1.insertAll(upTo: self.count) + for item in other { + if let index = self._find(item).index { + bitset1.remove(index) + } + } + bitset2.insertAll(upTo: other.count) + for item in self { + if let index = other._find(item).index { + bitset2.remove(index) + } + } + var result = self._extractSubset(using: bitset1, + extraCapacity: bitset2.count) + for offset in bitset2 { + result._appendNew(other._elements[offset]) + } + result._checkInvariants() + return result + } + } + } + + /// Replace this set with the elements contained in this set or the given + /// set, but not both. + /// + /// On return, `self` contains elements originally from `self` followed by + /// elements in `other`, in the same order they appeared in the input values. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.formSymmetricDifference(other) + /// // set is now [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public mutating func formSymmetricDifference(_ other: __owned Self) { + self = self.symmetricDifference(other) + } + + // Generalizations + + /// Returns a new set with the elements that are either in this set or in + /// `other`, but not in both. + /// + /// The result contains elements from `self` followed by elements in `other`, + /// in the same order they appeared in the original sets. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.symmetricDifference(other.unordered) // [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func symmetricDifference( + _ other: __owned UnorderedView + ) -> Self { + symmetricDifference(other._base) + } + + /// Replace this set with the elements contained in this set or the given + /// set, but not both. + /// + /// On return, `self` contains elements originally from `self` followed by + /// elements in `other`, in the same order they appeared in the input values. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.formSymmetricDifference(other.unordered) + /// // set is now [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func formSymmetricDifference(_ other: __owned UnorderedView) { + formSymmetricDifference(other._base) + } + + /// Returns a new set with the elements that are either in this set or in + /// `other`, but not in both. + /// + /// The result contains elements from `self` followed by elements in `other`, + /// in the same order they appeared in the original input values. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: Array = [6, 4, 2, 0] + /// set.symmetricDifference(other) // [1, 3, 6, 0] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average where *n* is + /// the number of elements in `other`, if `Element` implements high-quality + /// hashing. + @inlinable + public __consuming func symmetricDifference( + _ other: __owned S + ) -> Self where S.Element == Element { + _UnsafeBitset.withTemporaryBitset(capacity: self.count) { bitset in + var new = Self() + bitset.insertAll(upTo: self.count) + for item in other { + if let index = self._find(item).index { + bitset.remove(index) + } else { + new.append(item) + } + } + var result = _extractSubset(using: bitset, extraCapacity: new.count) + for item in new._elements { + result._appendNew(item) + } + result._checkInvariants() + return result + } + } + + /// Replace this set with the elements contained in this set or the given + /// sequence, but not both. + /// + /// On return, `self` contains elements originally from `self` followed by + /// elements in `other`, in the same order they first appeared in the input + /// values. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// set.formSymmetricDifference([6, 4, 2, 0] as Array) + /// // set is now [1, 3, 6, 0] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average where *n* is + /// the number of elements in `other`, if `Element` implements high-quality + /// hashing. + @inlinable + public mutating func formSymmetricDifference( + _ other: __owned S + ) where S.Element == Element { + self = self.symmetricDifference(other) + } +} + +extension OrderedSet { + /// Returns a new set containing the elements of this set that do not occur + /// in the given set. + /// + /// The result contains elements in the same order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.subtracting(other) // [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func subtracting(_ other: Self) -> Self { + _subtracting(other) + } + + /// Removes the elements of the given set from this set. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.subtract(other) + /// // set is now [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func subtract(_ other: Self) { + self = subtracting(other) + } + + // Generalizations + + /// Returns a new set containing the elements of this set that do not occur + /// in the given set. + /// + /// The result contains elements in the same order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.subtracting(other.unordered) // [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func subtracting(_ other: UnorderedView) -> Self { + subtracting(other._base) + } + + /// Removes the elements of the given set from this set. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// let other: OrderedSet = [6, 4, 2, 0] + /// set.subtract(other.unordered) + /// // set is now [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func subtract(_ other: UnorderedView) { + subtract(other._base) + } + + /// Returns a new set containing the elements of this set that do not occur + /// in the given sequence. + /// + /// The result contains elements in the same order they appear in `self`. + /// + /// let set: OrderedSet = [1, 2, 3, 4] + /// set.subtracting([6, 4, 2, 0] as Array) // [1, 3] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public __consuming func subtracting( + _ other: S + ) -> Self where S.Element == Element { + _subtracting(other) + } + + /// Removes the elements of the given sequence from this set. + /// + /// var set: OrderedSet = [1, 2, 3, 4] + /// set.subtract([6, 4, 2, 0] as Array) + /// // set is now [1, 3] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + @inline(__always) + public mutating func subtract( + _ other: S + ) where S.Element == Element { + self = _subtracting(other) + } + + @inlinable + __consuming func _subtracting( + _ other: S + ) -> Self where S.Element == Element { + guard count > 0 else { return Self() } + return _UnsafeBitset.withTemporaryBitset(capacity: count) { difference in + difference.insertAll(upTo: count) + for item in other { + if let index = self._find(item).index { + if difference.remove(index), difference.count == 0 { + return Self() + } + } + } + assert(difference.count > 0) + let result = _extractSubset(using: difference) + result._checkInvariants() + return result + } + } +} + + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Predicates.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Predicates.swift new file mode 100644 index 00000000..5aa94bb4 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Partial SetAlgebra+Predicates.swift @@ -0,0 +1,551 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +// `OrderedSet` does not directly conform to `SetAlgebra` because its definition +// of equality conflicts with `SetAlgebra` requirements. However, it still +// implements most `SetAlgebra` requirements (except `insert`, which is replaced +// by `append`). +// +// `OrderedSet` also provides an `unordered` view that explicitly conforms to +// `SetAlgebra`. That view implements `Equatable` by ignoring element order, +// so it can satisfy `SetAlgebra` requirements. + +extension OrderedSet { + /// Returns a Boolean value that indicates whether this set is a subset of + /// the given set. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSubset(of other: Self) -> Bool { + guard other.count >= self.count else { return false } + for item in self { + guard other.contains(item) else { return false } + } + return true + } + + // Generalizations + + /// Returns a Boolean value that indicates whether this set is a subset of + /// the given set. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isSubset(of: a.unordered) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public func isSubset(of other: UnorderedView) -> Bool { + isSubset(of: other._base) + } + + /// Returns a Boolean value that indicates whether this set is a subset of + /// the given set. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Set = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSubset(of other: Set) -> Bool { + guard other.count >= self.count else { return false } + for item in self { + guard other.contains(item) else { return false } + } + return true + } + + /// Returns a Boolean value that indicates whether this set is a subset of + /// the elements in the given sequence. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: Array = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: A finite sequence. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isSubset( + of other: S + ) -> Bool where S.Element == Element { + guard !isEmpty else { return true } + return _UnsafeBitset.withTemporaryBitset(capacity: count) { seen in + // Mark elements in `self` that we've seen in `other`. + for item in other { + if let index = _find(item).index { + if seen.insert(index), seen.count == self.count { + // We've seen enough. + return true + } + } + } + return false + } + } +} + +extension OrderedSet { + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given set. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSuperset(of other: Self) -> Bool { + other.isSubset(of: self) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given set. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Set = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSuperset(of other: UnorderedView) -> Bool { + isSuperset(of: other._base) + } + + @inlinable + public func isSuperset(of other: Set) -> Bool { + guard self.count >= other.count else { return false } + return _isSuperset(of: other) + } + + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given sequence. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Array = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public func isSuperset( + of other: S + ) -> Bool where S.Element == Element { + _isSuperset(of: other) + } + + @inlinable + internal func _isSuperset( + of other: S + ) -> Bool where S.Element == Element { + for item in other { + guard self.contains(item) else { return false } + } + return true + } +} + +extension OrderedSet { + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given set. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSubset(of other: Self) -> Bool { + self.count < other.count && self.isSubset(of: other) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given set. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isStrictSubset(of: a.unordered) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public func isStrictSubset(of other: UnorderedView) -> Bool { + isStrictSubset(of: other._base) + } + + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given set. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: Set = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSubset(of other: Set) -> Bool { + self.count < other.count && self.isSubset(of: other) + } + + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given sequence. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: Array = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isStrictSubset( + of other: S + ) -> Bool where S.Element == Element { + _UnsafeBitset.withTemporaryBitset(capacity: count) { seen in + // Mark elements in `self` that we've seen in `other`. + var isKnownStrict = false + for item in other { + if let index = _find(item).index { + if seen.insert(index), seen.count == self.count, isKnownStrict { + // We've seen enough. + return true + } + } else { + if !isKnownStrict, seen.count == self.count { return true } + isKnownStrict = true + } + } + return false + } + } +} + +extension OrderedSet { + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given set. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSuperset(of other: Self) -> Bool { + self.count > other.count && other.isSubset(of: self) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given set. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [4, 2, 1] + /// a.isStrictSuperset(of: b.unordered) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public func isStrictSuperset(of other: UnorderedView) -> Bool { + isStrictSuperset(of: other._base) + } + + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given set. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Set = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSuperset(of other: Set) -> Bool { + self.count > other.count && other.isSubset(of: self) + } + + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given sequence. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Array = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isStrictSuperset( + of other: S + ) -> Bool where S.Element == Element { + _UnsafeBitset.withTemporaryBitset(capacity: count) { seen in + // Mark elements in `self` that we've seen in `other`. + for item in other { + guard let index = _find(item).index else { + return false + } + if seen.insert(index), seen.count == self.count { + // We've seen enough. + return false + } + } + return seen.count < self.count + } + } +} + +extension OrderedSet { + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given set. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(min(`self.count`, `other.count`)) on + /// average, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint(with other: Self) -> Bool { + guard !self.isEmpty && !other.isEmpty else { return true } + if self.count <= other.count { + for item in self { + if other.contains(item) { return false } + } + } else { + for item in other { + if self.contains(item) { return false } + } + } + return true + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given set. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: OrderedSet = [5, 6] + /// a.isDisjoint(with: b.unordered) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(min(`self.count`, `other.count`)) on + /// average, if `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public func isDisjoint(with other: UnorderedView) -> Bool { + isDisjoint(with: other._base) + } + + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given set. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Set = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(min(`self.count`, `other.count`)) on + /// average, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint(with other: Set) -> Bool { + guard !self.isEmpty && !other.isEmpty else { return true } + if self.count <= other.count { + for item in self { + if other.contains(item) { return false } + } + } else { + for item in other { + if self.contains(item) { return false } + } + } + return true + } + + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given sequence. + /// + /// let a: OrderedSet = [1, 2, 3, 4] + /// let b: Array = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint( + with other: S + ) -> Bool where S.Element == Element { + guard !self.isEmpty else { return true } + for item in other { + if self.contains(item) { return false } + } + return true + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+RandomAccessCollection.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+RandomAccessCollection.swift new file mode 100644 index 00000000..7e5eed85 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+RandomAccessCollection.swift @@ -0,0 +1,300 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet: Sequence { + /// The type that allows iteration over an ordered set's elements. + public typealias Iterator = IndexingIterator + + @inlinable + public func _customContainsEquatableElement(_ element: Element) -> Bool? { + _find(element).index != nil + } + + @inlinable + public __consuming func _copyToContiguousArray() -> ContiguousArray { + _elements._copyToContiguousArray() + } + + @inlinable + public __consuming func _copyContents( + initializing ptr: UnsafeMutableBufferPointer + ) -> (Iterator, UnsafeMutableBufferPointer.Index) { + guard !isEmpty else { return (makeIterator(), 0) } + let copied: Int = _elements.withUnsafeBufferPointer { buffer in + guard let p = ptr.baseAddress else { + preconditionFailure("Attempt to copy contents into nil buffer pointer") + } + let c = Swift.min(buffer.count, ptr.count) + p.initialize(from: buffer.baseAddress!, count: c) + return c + } + return (Iterator(_elements: self, _position: copied), copied) + } + + /// Call `body(p)`, where `p` is a buffer pointer to the collection’s + /// contiguous storage. Ordered sets always have contiguous storage. + /// + /// - Parameter body: A function to call. The function must not escape its + /// unsafe buffer pointer argument. + /// + /// - Returns: The value returned by `body`. + /// + /// - Complexity: O(1) (ignoring time spent in `body`) + @inlinable + public func withContiguousStorageIfAvailable( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + try _elements.withContiguousStorageIfAvailable(body) + } +} + +extension OrderedSet: RandomAccessCollection { + /// The index type for ordered sets, `Int`. + /// + /// `OrderedSet` indices are integer offsets from the start of the collection, + /// starting at zero for the first element (if exists). + public typealias Index = Int + + /// The type that represents the indices that are valid for subscripting an + /// ordered set, in ascending order. + public typealias Indices = Range + + // For SubSequence, see OrderedSet+SubSequence.swift. + + /// The position of the first element in a nonempty ordered set. + /// + /// For an instance of `OrderedSet`, `startIndex` is always zero. If the set + /// is empty, `startIndex` is equal to `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { _elements.startIndex } + + /// The set's "past the end" position---that is, the position one greater + /// than the last valid subscript argument. + /// + /// In an `OrderedSet`, `endIndex` always equals the count of elements. + /// If the set is empty, `endIndex` is equal to `startIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { _elements.endIndex } + + /// The indices that are valid for subscripting the collection, in ascending + /// order. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var indices: Indices { _elements.indices } + + /// Returns the position immediately after the given index. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { i + 1 } + + /// Returns the position immediately before the given index. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { i - 1 } + + /// Replaces the given index with its successor. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { i += 1 } + + /// Replaces the given index with its predecessor. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { i -= 1 } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, or the returned value will not be a valid index. + /// + /// - Parameters: + /// - i: A valid index of the set. + /// - distance: The distance to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls to + /// `index(after:)`. If `distance` is negative, this is the same value as + /// the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, unless the index passed as `limit` prevents offsetting + /// beyond those bounds. (Otherwise the returned value won't be a valid index + /// in the set.) + /// + /// - Parameters: + /// - i: A valid index of the set. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the collection to use as a limit. If + /// `distance > 0`, `limit` has no effect if it is less than `i`. + /// Likewise, if `distance < 0`, `limit` has no effect if it is greater + /// than `i`. + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + _elements.index(i, offsetBy: distance, limitedBy: limit) + } + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. If `end` is equal to + /// `start`, the result is zero. + /// + /// - Returns: The distance between `start` and `end`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + end - start + } + + /// Accesses the element at the specified position. + /// + /// - Parameter index: The position of the element to access. `index` must be + /// greater than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public subscript(position: Int) -> Element { + _elements[position] + } + + /// Accesses a contiguous subrange of the set's elements. + /// + /// The returned `Subsequence` instance uses the same indices for the same + /// elements as the original set. In particular, that slice, unlike an + /// `OrderedSet`, may have a nonzero `startIndex` and an `endIndex` that is + /// not equal to `count`. Always use the slice's `startIndex` and `endIndex` + /// properties instead of assuming that its indices start or end at a + /// particular value. + /// + /// - Parameter bounds: A range of valid indices in the set. + /// + /// - Complexity: O(1) + @inlinable + public subscript(bounds: Range) -> SubSequence { + _failEarlyRangeCheck(bounds, bounds: startIndex ..< endIndex) + return SubSequence(_base: self, bounds: bounds) + } + + /// A Boolean value indicating whether the collection is empty. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var isEmpty: Bool { _elements.isEmpty } + + /// The number of elements in the set. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _elements.count } + + @inlinable + public func _customIndexOfEquatableElement(_ element: Element) -> Int?? { + guard let table = _table else { + return _elements._customIndexOfEquatableElement(element) + } + return table.read { hashTable in + let (o, _) = hashTable._find(element, in: _elements) + guard let offset = o else { return .some(nil) } + return offset + } + } + + @inlinable + @inline(__always) + public func _customLastIndexOfEquatableElement(_ element: Element) -> Int?? { + // OrderedSet holds unique elements. + _customIndexOfEquatableElement(element) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: Range) { + _elements._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: ClosedRange) { + _elements._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ range: Range, bounds: Range) { + _elements._failEarlyRangeCheck(range, bounds: bounds) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ReserveCapacity.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ReserveCapacity.swift new file mode 100644 index 00000000..053de8cf --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+ReserveCapacity.swift @@ -0,0 +1,129 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// Creates an empty set with preallocated space for at least the + /// specified number of elements. + /// + /// Use this initializer to avoid intermediate reallocations of a + /// set's storage buffer when you know in advance how many elements + /// you'll insert into the set after creation. + /// + /// If you have a good idea of the expected working size of the set, calling + /// this initializer with `persistent` set to true can sometimes improve + /// performance by eliminating churn due to repeated rehashings when the set + /// temporarily shrinks below its regular size. + /// + /// - Parameter minimumCapacity: The minimum number of elements that the newly + /// created set should be able to store without reallocating its storage. + /// + /// - Parameter persistent: If set to true, prevent removals from shrinking + /// storage below the specified capacity. By default, removals are allowed + /// to shrink storage below any previously reserved capacity. + /// + /// - Complexity: O(`minimumCapacity`) + @inlinable + public init(minimumCapacity: Int, persistent: Bool = false) { + self.init() + self._reserveCapacity(minimumCapacity, persistent: persistent) + } +} + +extension OrderedSet { + /// Reserves enough space to store the specified number of elements. + /// + /// This method ensures that the set has unique mutable storage, with space + /// allocated for at least the requested number of elements. + /// + /// If you are adding a known number of elements to a set, call this method + /// once before the first insertion to avoid multiple reallocations. + /// + /// Do not call this method in a loop -- it does not use an exponential + /// allocation strategy, so doing that can result in quadratic instead of + /// linear performance. + /// + /// - Parameter minimumCapacity: The minimum number of elements that the set + /// should be able to store without reallocating its storage. + /// + /// - Complexity: O(`max(count, minimumCapacity)`) + @inlinable + public mutating func reserveCapacity(_ minimumCapacity: Int) { + self._reserveCapacity(minimumCapacity, persistent: false) + } +} + +extension OrderedSet { + /// Reserves enough space to store the specified number of elements. + /// + /// This method ensures that the set has unique mutable storage, with space + /// allocated for at least the requested number of elements. + /// + /// If you are adding a known number of elements to a set, call this method + /// once before the first insertion to avoid multiple reallocations. + /// + /// Do not call this method in a loop -- it does not use an exponential + /// allocation strategy, so doing that can result in quadratic instead of + /// linear performance. + /// + /// If you have a good idea of the expected working size of the set, calling + /// this method with `persistent` set to true can sometimes improve + /// performance by eliminating churn due to repeated rehashings when the set + /// temporarily shrinks below its regular size. You can cancel any capacity + /// you've previously reserved by persistently reserving a capacity of zero. + /// (This also shrinks the hash table to the ideal size for its current number + /// elements.) + /// + /// - Parameter minimumCapacity: The minimum number of elements that the set + /// should be able to store without reallocating its storage. + /// + /// - Parameter persistent: If set to true, prevent removals from shrinking + /// storage below the specified capacity. By default, removals are allowed + /// to shrink storage below any previously reserved capacity. + /// + /// - Complexity: O(`max(count, minimumCapacity)`) + @inlinable + internal mutating func _reserveCapacity( + _ minimumCapacity: Int, + persistent: Bool + ) { + precondition(minimumCapacity >= 0, "Minimum capacity cannot be negative") + defer { _checkInvariants() } + + _elements.reserveCapacity(minimumCapacity) + + let currentScale = _scale + let newScale = _HashTable.scale(forCapacity: minimumCapacity) + + let reservedScale = persistent ? newScale : _reservedScale + + if currentScale < newScale { + // Grow the table. + _regenerateHashTable(scale: newScale, reservedScale: reservedScale) + return + } + + let requiredScale = _HashTable.scale(forCapacity: self.count) + let minScale = Swift.max(Swift.max(newScale, reservedScale), requiredScale) + if minScale < currentScale { + // Shrink the table. + _regenerateHashTable(scale: minScale, reservedScale: reservedScale) + return + } + + // When we have the right size table, ensure it's unique and it has the + // right persisted reservation. + _ensureUnique() + if _reservedScale != reservedScale { + // Remember reserved scale. + __storage!.header.reservedScale = reservedScale + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+SubSequence.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+SubSequence.swift new file mode 100644 index 00000000..706c8f99 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+SubSequence.swift @@ -0,0 +1,355 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// A collection that represents a contiguous slice of an ordered set. + /// + /// Ordered set slices are random access collections that support efficient + /// membership testing. `contains(_:)` and `firstIndex(of:)`/`lastIndex(of:)` + /// are expected to have a complexity of O(1), as long as `Element` has + /// high-quality hashing. + @frozen + public struct SubSequence { + @usableFromInline + internal var _base: OrderedSet + + @usableFromInline + internal var _bounds: Range + + @inlinable + @inline(__always) + internal init(_base: OrderedSet, bounds: Range) { + self._base = _base + self._bounds = bounds + } + } +} + +extension OrderedSet.SubSequence { + @inlinable + internal var _slice: Array.SubSequence { + _base._elements[_bounds] + } + + @inlinable + internal func _index(of element: Element) -> Int? { + guard let index = _base._find(element).index else { return nil } + guard _bounds.contains(index) else { return nil } + return index + } +} + +extension OrderedSet.SubSequence: Sequence { + // A type representing the collection’s elements. + public typealias Element = OrderedSet.Element + /// The type that allows iteration over the collection's elements. + public typealias Iterator = IndexingIterator + + @inlinable + public func _customContainsEquatableElement(_ element: Element) -> Bool? { + _index(of: element) != nil + } + + @inlinable + public __consuming func _copyToContiguousArray() -> ContiguousArray { + _slice._copyToContiguousArray() + } + + @inlinable + public __consuming func _copyContents( + initializing ptr: UnsafeMutableBufferPointer + ) -> (Iterator, UnsafeMutableBufferPointer.Index) { + guard !isEmpty else { return (makeIterator(), 0) } + let copied: Int = _slice.withUnsafeBufferPointer { buffer in + guard let p = ptr.baseAddress else { + preconditionFailure("Attempt to copy contents into nil buffer pointer") + } + let c = Swift.min(buffer.count, ptr.count) + if c > 0 { + p.initialize(from: buffer.baseAddress!, count: c) + } + return c + } + return (Iterator(_elements: self, _position: _bounds.lowerBound + copied), + copied) + } + + /// Call `body(p)`, where `p` is a buffer pointer to the collection’s + /// contiguous storage. Ordered sets always have contiguous storage. + /// + /// - Parameter body: A function to call. The function must not escape its + /// unsafe buffer pointer argument. + /// + /// - Returns: The value returned by `body`. + /// + /// - Complexity: O(1) (ignoring time spent in `body`) + @inlinable + public func withContiguousStorageIfAvailable( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + try _slice.withContiguousStorageIfAvailable(body) + } +} + +extension OrderedSet.SubSequence: RandomAccessCollection { + /// The index type for ordered sets, `Int`. + /// + /// Indices in the order set are integer offsets from the start of the + /// collection, starting at zero for the first element (if exists). + public typealias Index = Int + + /// The type that represents the indices that are valid for subscripting an + /// ordered set, in ascending order. + public typealias Indices = Array.SubSequence.Indices + + /// Ordered set subsequences are self-slicing. + public typealias SubSequence = Self + + /// The position of the first element in a nonempty ordered set slice. + /// + /// Note that instances of `OrderedSet.SubSequence` generally aren't indexed + /// from zero. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var startIndex: Int { _bounds.lowerBound } + + /// The "past the end" position---that is, the position one greater + /// than the last valid subscript argument. + /// + /// Note that instances of `OrderedSet.SubSequence` generally aren't indexed + /// from zero, so `endIndex` may differ from the `count`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var endIndex: Int { _bounds.upperBound } + + /// The indices that are valid for subscripting the collection, in ascending + /// order. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var indices: Indices { _slice.indices } + + /// Returns the position immediately after the given index. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately after `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(after i: Int) -> Int { i + 1 } + + /// Returns the position immediately before the given index. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Returns: The index immediately before `i`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(before i: Int) -> Int { i - 1 } + + /// Replaces the given index with its successor. + /// + /// The specified index must be a valid index less than `endIndex`, or the + /// returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(after i: inout Int) { i += 1 } + + /// Replaces the given index with its predecessor. + /// + /// The specified index must be a valid index greater than `startIndex`, or + /// the returned value won't be a valid index in the set. + /// + /// - Parameter i: A valid index of the collection. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func formIndex(before i: inout Int) { i -= 1 } + + /// Returns an index that is the specified distance from the given index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, or the returned value will not be a valid index. + /// + /// - Parameters: + /// - i: A valid index of the set. + /// - distance: The distance to offset `i`. + /// + /// - Returns: An index offset by `distance` from the index `i`. If `distance` + /// is positive, this is the same value as the result of `distance` calls to + /// `index(after:)`. If `distance` is negative, this is the same value as + /// the result of `abs(distance)` calls to `index(before:)`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index(_ i: Int, offsetBy distance: Int) -> Int { + i + distance + } + + /// Returns an index that is the specified distance from the given index, + /// unless that distance is beyond a given limiting index. + /// + /// The value passed as `distance` must not offset `i` beyond the bounds of + /// the collection, unless the index passed as `limit` prevents offsetting + /// beyond those bounds. (Otherwise the returned value won't be a valid index + /// in the set.) + /// + /// - Parameters: + /// - i: A valid index of the set. + /// - distance: The distance to offset `i`. + /// - limit: A valid index of the collection to use as a limit. If + /// `distance > 0`, `limit` has no effect if it is less than `i`. + /// Likewise, if `distance < 0`, `limit` has no effect if it is greater + /// than `i`. + /// - Returns: An index offset by `distance` from the index `i`, unless that + /// index would be beyond `limit` in the direction of movement. In that + /// case, the method returns `nil`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func index( + _ i: Int, + offsetBy distance: Int, + limitedBy limit: Int + ) -> Int? { + _slice.index(i, offsetBy: distance, limitedBy: limit) + } + + /// Returns the distance between two indices. + /// + /// - Parameters: + /// - start: A valid index of the collection. + /// - end: Another valid index of the collection. If `end` is equal to + /// `start`, the result is zero. + /// + /// - Returns: The distance between `start` and `end`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public func distance(from start: Int, to end: Int) -> Int { + end - start + } + + /// Accesses the element at the specified position. + /// + /// - Parameter index: The position of the element to access. `index` must be + /// greater than or equal to `startIndex` and less than `endIndex`. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public subscript(position: Int) -> Element { + _slice[position] + } + + /// Accesses a contiguous subrange of the set's elements. + /// + /// The returned `Subsequence` instance uses the same indices for the same + /// elements as the original set. In particular, that slice, unlike an + /// `OrderedSet`, may have a nonzero `startIndex` and an `endIndex` that is + /// not equal to `count`. Always use the slice's `startIndex` and `endIndex` + /// properties instead of assuming that its indices start or end at a + /// particular value. + /// + /// - Parameter bounds: A range of valid indices in the set. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public subscript(bounds: Range) -> SubSequence { + _failEarlyRangeCheck(bounds, bounds: startIndex ..< endIndex) + return SubSequence(_base: _base, bounds: bounds) + } + + /// A Boolean value indicating whether the collection is empty. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var isEmpty: Bool { _bounds.isEmpty } + + /// The number of elements in the set. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public var count: Int { _bounds.count } + + @inlinable + @inline(__always) + public func _customIndexOfEquatableElement(_ element: Element) -> Int?? { + .some(_index(of: element)) + } + + @inlinable + @inline(__always) + public func _customLastIndexOfEquatableElement(_ element: Element) -> Int?? { + .some(_index(of: element)) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: Range) { + _slice._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ index: Int, bounds: ClosedRange) { + _slice._failEarlyRangeCheck(index, bounds: bounds) + } + + @inlinable + @inline(__always) + public func _failEarlyRangeCheck(_ range: Range, bounds: Range) { + _slice._failEarlyRangeCheck(range, bounds: bounds) + } +} + +extension OrderedSet.SubSequence: Equatable { + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + left.elementsEqual(right) + } +} + +extension OrderedSet.SubSequence: Hashable { + @inlinable + public func hash(into hasher: inout Hasher) { + hasher.combine(count) + for item in self { + hasher.combine(item) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Testing.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Testing.swift new file mode 100644 index 00000000..edac2d8b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+Testing.swift @@ -0,0 +1,128 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet._UnstableInternals { + @_spi(Testing) public var capacity: Int { base._capacity } + @_spi(Testing) public var minimumCapacity: Int { base._minimumCapacity } + @_spi(Testing) public var scale: Int { base._scale } + @_spi(Testing) public var reservedScale: Int { base._reservedScale } + @_spi(Testing) public var bias: Int { base._bias } +} + +extension OrderedSet { + @_spi(Testing) + @_alwaysEmitIntoClient + public static var _minimumScale: Int { + _HashTable.minimumScale + } + + @_spi(Testing) + @_alwaysEmitIntoClient + public static func _minimumCapacity(forScale scale: Int) -> Int { + _HashTable.minimumCapacity(forScale: scale) + } + + @_spi(Testing) + @_alwaysEmitIntoClient + public static func _maximumCapacity(forScale scale: Int) -> Int { + _HashTable.maximumCapacity(forScale: scale) + } + + @_spi(Testing) + @_alwaysEmitIntoClient + public static func _scale(forCapacity capacity: Int) -> Int { + _HashTable.scale(forCapacity: capacity) + } + + @_spi(Testing) + @_alwaysEmitIntoClient + public static func _biasRange(scale: Int) -> Range { + guard scale != 0 else { return Range(uncheckedBounds: (0, 1)) } + return Range(uncheckedBounds: (0, (1 &<< scale) - 1)) + } +} + +extension OrderedSet._UnstableInternals { + @_spi(Testing) + @_alwaysEmitIntoClient + public var hasHashTable: Bool { base._table != nil } + + @_spi(Testing) + @_alwaysEmitIntoClient + public var hashTableIdentity: ObjectIdentifier? { + guard let storage = base.__storage else { return nil } + return ObjectIdentifier(storage) + } + + @_spi(Testing) + public var hashTableContents: [Int?] { + guard let table = base._table else { return [] } + return table.read { hashTable in + hashTable.debugContents() + } + } + + @_spi(Testing) + @_alwaysEmitIntoClient + mutating public func _regenerateHashTable(bias: Int) { + base._ensureUnique() + let new = base._table!.copy() + base._table!.read { source in + new.update { target in + target.bias = bias + var it = source.bucketIterator(startingAt: _Bucket(offset: 0)) + repeat { + target[it.currentBucket] = it.currentValue + it.advance() + } while it.currentBucket.offset != 0 + } + } + base._table = new + base._checkInvariants() + } + + @_spi(Testing) + @_alwaysEmitIntoClient + public mutating func reserveCapacity( + _ minimumCapacity: Int, + persistent: Bool + ) { + base._reserveCapacity(minimumCapacity, persistent: persistent) + base._checkInvariants() + } +} + +extension OrderedSet { + @_spi(Testing) + public init( + _scale scale: Int, + bias: Int, + contents: S + ) where S.Element == Element { + let contents = ContiguousArray(contents) + precondition(scale >= _HashTable.scale(forCapacity: contents.count)) + precondition(scale <= _HashTable.maximumScale) + precondition(bias >= 0 && Self._biasRange(scale: scale).contains(bias)) + precondition(scale >= _HashTable.minimumScale || bias == 0) + let table = _HashTable(scale: Swift.max(scale, _HashTable.minimumScale)) + table.header.bias = bias + let (success, index) = table.update { hashTable in + hashTable.fill(untilFirstDuplicateIn: contents) + } + precondition(success, "Duplicate element at index \(index)") + self.init( + _uniqueElements: contents, + scale < _HashTable.minimumScale ? nil : table) + precondition(self._scale == scale) + precondition(self._bias == bias) + _checkInvariants() + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnorderedView.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnorderedView.swift new file mode 100644 index 00000000..88216a6d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnorderedView.swift @@ -0,0 +1,987 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// An unordered view into an ordered set, providing `SetAlgebra` + /// conformance. + @frozen + public struct UnorderedView { + @usableFromInline + internal var _base: OrderedSet + + @inlinable + @inline(__always) + internal init(_base: OrderedSet) { + self._base = _base + } + } + + /// Create a new ordered set with the same members as the supplied + /// unordered view. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public init(_ view: UnorderedView) { + self = view._base + } + + /// Access a view of the members of this set as an unordered + /// `SetAlgebra` value. + /// + /// This is useful when you need to pass an ordered set to a + /// function that is generic over `SetAlgebra`. + /// + /// The unordered view has a definition of equality that ignores the + /// order of members, so that it can satisfy `SetAlgebra` + /// requirements. New elements inserted to the unordered view get + /// appended to the end of the set. + /// + /// - Complexity: O(1) for both the getter and the setter. + @inlinable + public var unordered: UnorderedView { + @inline(__always) + get { + UnorderedView(_base: self) + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var view = UnorderedView(_base: self) + self = OrderedSet() + defer { self = view._base } + yield &view + } + } +} + +extension OrderedSet.UnorderedView: CustomStringConvertible { + /// A textual representation of this instance. + public var description: String { + _base.description + } +} + +extension OrderedSet.UnorderedView: CustomDebugStringConvertible { + /// A textual representation of this instance, suitable for debugging. + public var debugDescription: String { + _base._debugDescription(typeName: "\(_base._debugTypeName()).UnorderedView") + } +} + +extension OrderedSet.UnorderedView: CustomReflectable { + /// The custom mirror for this instance. + public var customMirror: Mirror { + Mirror(self, unlabeledChildren: _base._elements, displayStyle: .collection) + } +} + +extension OrderedSet.UnorderedView: Equatable { + /// Returns a Boolean value indicating whether two values are equal. + /// Two unordered sets are considered equal if they contain the same + /// elements, but not necessarily in the same order. + /// + /// - Complexity: O(`min(left.count, right.count)`) + @inlinable + public static func ==(left: Self, right: Self) -> Bool { + if left._base.__storage != nil, + left._base.__storage === right._base.__storage + { + return true + } + guard left._base.count == right._base.count else { return false } + + for item in left._base { + if !right._base.contains(item) { return false } + } + return true + } +} + +extension OrderedSet.UnorderedView: Hashable { + /// Hashes the essential components of this value by feeding them into the + /// given hasher. + /// + /// Complexity: O(`count`) + @inlinable + public func hash(into hasher: inout Hasher) { + // Generate a seed from a snapshot of the hasher. This makes members' hash + // values depend on the state of the hasher, which improves hashing + // quality. (E.g., it makes it possible to resolve collisions by passing in + // a different hasher.) + let copy = hasher + let seed = copy.finalize() + + var hash = 0 + for member in _base { + hash ^= member._rawHashValue(seed: seed) + } + hasher.combine(hash) + } +} + +extension OrderedSet.UnorderedView: ExpressibleByArrayLiteral { + /// Creates a new unordered set from the contents of an array literal. + @inlinable + @inline(__always) + public init(arrayLiteral elements: Element...) { + _base = OrderedSet(elements) + } +} + +extension OrderedSet.UnorderedView: SetAlgebra { + public typealias Element = OrderedSet.Element +} + +extension OrderedSet.UnorderedView { + /// Creates an empty set. + /// + /// This initializer is equivalent to initializing with an empty array + /// literal. + @inlinable + @inline(__always) + public init() { + _base = OrderedSet() + } + + /// Creates a new set from a finite sequence of items. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform O(*n*) + /// comparisons on average (where *n* is the number of elements + /// in the sequence), provided that `Element` implements + /// high-quality hashing. + @inlinable + @inline(__always) + public init(_ elements: S) where S.Element == Element { + _base = OrderedSet(elements) + } + + // Specializations + + /// Creates a new set from a an existing set. This is functionally the same as + /// copying the value of `elements` into a new variable. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: O(1) + @inlinable + @inline(__always) + public init(_ elements: Self) { + self = elements + } + + /// Creates a new set from an existing `Set` value. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform O(*n*) + /// comparisons on average (where *n* is the number of elements + /// in the set), provided that `Element` implements high-quality + /// hashing. + @inlinable + @inline(__always) + public init(_ elements: Set) { + self._base = OrderedSet(elements) + } + + /// Creates a new set from the keys of a dictionary value. + /// + /// - Parameter elements: The elements to use as members of the new set. + /// + /// - Complexity: This operation is expected to perform O(*n*) + /// comparisons on average (where *n* is the number of elements + /// in the set), provided that `Element` implements high-quality + /// hashing. + @inlinable + @inline(__always) + public init(_ elements: Dictionary.Keys) { + self._base = OrderedSet(elements) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether the given element exists + /// in the set. + /// + /// - Parameter element: An element to look for in the set. + /// + /// - Returns: `true` if `member` exists in the set; otherwise, `false`. + /// + /// - Complexity: This operation is expected to perform O(1) comparisons on + /// average, provided that `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public func contains(_ element: Element) -> Bool { + _base.contains(element) + } +} + +extension OrderedSet.UnorderedView { + /// Inserts the given element in the set if it is not already present. + /// + /// If an element equal to `newMember` is already contained in the set, this + /// method has no effect. + /// + /// If `newMember` was not already a member, it gets appended to the end of + /// the underlying ordered set value. + /// + /// - Parameter newMember: An element to insert into the set. + /// + /// - Returns: `(true, newMember)` if `newMember` was not contained in the + /// set. If an element equal to `newMember` was already contained in the + /// set, the method returns `(false, oldMember)`, where `oldMember` is the + /// element that was equal to `newMember`. In some cases, `oldMember` may + /// be distinguishable from `newMember` by identity comparison or some + /// other means. + /// + /// - Complexity: This operation is expected to perform O(1) + /// hashing/comparison operations on average (over many insertions to the + /// same set), provided that `Element` implements high-quality hashing. + @inlinable + public mutating func insert( + _ newMember: __owned Element + ) -> (inserted: Bool, memberAfterInsert: Element) { + let (inserted, index) = _base.append(newMember) + return (inserted, _base[index]) + } + + /// Inserts the given element into the set unconditionally. + /// + /// If an element equal to `newMember` is already contained in the set, + /// `newMember` replaces the existing element. + /// + /// If `newMember` was not already a member, it gets appended to the end of + /// the underlying ordered set value. + /// + /// - Parameter newMember: An element to insert into the set. + /// + /// - Returns: The original member equal to `newMember` if the set already + /// contained such a member; otherwise, `nil`. In some cases, the returned + /// element may be distinguishable from `newMember` by identity comparison + /// or some other means. + /// + /// - Complexity: This operation is expected to perform O(1) + /// hashing/comparison operations on average (over many insertions to the + /// same set), provided that `Element` implements high-quality hashing. + @inlinable + public mutating func update(with newMember: __owned Element) -> Element? { + let (inserted, index) = _base.append(newMember) + if inserted { return nil } + let old = _base._elements[index] + _base._elements[index] = newMember + return old + } +} + +extension OrderedSet.UnorderedView { + /// Removes the given element from the set. + /// + /// - Parameter member: The element of the set to remove. + /// + /// - Returns: The element equal to `member` if `member` is contained in the + /// set; otherwise, `nil`. In some cases, the returned element may be + /// distinguishable from `newMember` by identity comparison or some other + /// means. + /// + /// - Complexity: O(`count`). Removing an element from the middle of the + /// underlying ordered set needs to rearrange the remaining elements to + /// close the resulting gap. + /// + /// Removing the last element only takes (amortized) O(1) + /// hashing/comparisons operations, if `Element` implements high quality + /// hashing. + @inlinable + @inline(__always) + @discardableResult + public mutating func remove(_ member: Element) -> Element? { + _base.remove(member) + } +} + +extension OrderedSet.UnorderedView { + /// Adds the elements of the given set to this set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the set, in the order they appear in `other`. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [0, 2, 4, 6] + /// set.formUnion(other) + /// // `set` is now `[1, 2, 3, 4, 0, 6]` + /// + /// - Parameter other: The set of elements to insert. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + @inline(__always) + public mutating func formUnion(_ other: __owned Self) { + _base.formUnion(other._base) + } + + /// Returns a new set with the elements of both this and the given set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the result, in the order they appear in `other`. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [0, 2, 4, 6] + /// a.union(b) // [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: The set of elements to add. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + public __consuming func union(_ other: __owned Self) -> Self { + _base.union(other._base).unordered + } + + // Generalizations + + /// Adds the elements of the given sequence to this set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the set, in the order they appear in `other`. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.formUnion([0, 2, 4, 6]) + /// // `set` is now `[1, 2, 3, 4, 0, 6]` + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public mutating func formUnion( + _ other: __owned S + ) where S.Element == Element { + _base.formUnion(other) + } + + /// Returns a new set with the elements of both this and the given set. + /// + /// Members of `other` that aren't already in `self` get appended to the end + /// of the result, in the order they appear in `other`. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// a.union([0, 2, 4, 6]) // [1, 2, 3, 4, 0, 6] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + `other.count`) on average, + /// if `Element` implements high-quality hashing. + @inlinable + public __consuming func union( + _ other: __owned S + ) -> Self where S.Element == Element { + _base.union(other).unordered + } +} + +extension OrderedSet.UnorderedView { + /// Returns a new set with the elements that are common to both this set and + /// the provided other one, in the order they appear in `self`. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.intersection(other) // [2, 4] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public __consuming func intersection(_ other: Self) -> Self { + _base.intersection(other._base).unordered + } + + /// Removes the elements of this set that aren't also in the given one. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.formIntersection(other) + /// // set is now [2, 4] + /// + /// - Parameter other: A set of elements. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public mutating func formIntersection(_ other: Self) { + _base.formIntersection(other._base) + } + + // Generalizations + + /// Returns a new set with the elements that are common to both this set and + /// the provided sequence, in the order they appear in `self`. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.intersection([6, 4, 2, 0] as Array) // [2, 4] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(*n*) on average where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public __consuming func intersection( + _ other: S + ) -> Self where S.Element == Element { + _base.intersection(other).unordered + } + + /// Removes the elements of this set that aren't also in the given sequence. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.formIntersection([6, 4, 2, 0] as Array) + /// // set is now [2, 4] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(*n*) on average where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public mutating func formIntersection( + _ other: S + ) where S.Element == Element { + _base.formIntersection(other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a new set with the elements that are either in this set or in + /// `other`, but not in both. + /// + /// The result contains elements from `self` followed by elements in `other`, + /// in the same order they appeared in the original sets. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.symmetricDifference(other) // [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public __consuming func symmetricDifference(_ other: __owned Self) -> Self { + _base.symmetricDifference(other._base).unordered + } + + /// Replace this set with the elements contained in this set or the given + /// set, but not both. + /// + /// On return, `self` contains elements originally from `self` followed by + /// elements in `other`, in the same order they appeared in the input values. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.formSymmetricDifference(other) + /// // set is now [1, 3, 6, 0] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public mutating func formSymmetricDifference(_ other: __owned Self) { + _base.formSymmetricDifference(other._base) + } + + // Generalizations + + /// Returns a new set with the elements that are either in this set or in the + /// given sequence, but not in both. + /// + /// The result contains elements from `self` followed by elements in `other`, + /// in the same order they first appeared in the input values. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.symmetricDifference([6, 4, 2, 0] as Array) // [1, 3, 6, 0] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average where *n* is + /// the number of elements in `other`, if `Element` implements high-quality + /// hashing. + @inlinable + public __consuming func symmetricDifference( + _ other: __owned S + ) -> Self where S.Element == Element { + _base.symmetricDifference(other).unordered + } + + /// Replace this set with the elements contained in this set or the given + /// sequence, but not both. + /// + /// On return, `self` contains elements originally from `self` followed by + /// elements in `other`, in the same order they first appeared in the input + /// values. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.formSymmetricDifference([6, 4, 2, 0] as Array) + /// // set is now [1, 3, 6, 0] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average where *n* is + /// the number of elements in `other`, if `Element` implements high-quality + /// hashing. + @inlinable + public mutating func formSymmetricDifference( + _ other: __owned S + ) where S.Element == Element { + _base.formSymmetricDifference(other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a new set containing the elements of this set that do not occur + /// in the given set. + /// + /// The result contains elements in the same order they appear in `self`. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.subtracting(other) // [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public __consuming func subtracting(_ other: Self) -> Self { + _base.subtracting(other._base).unordered + } + + /// Removes the elements of the given set from this set. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let other: OrderedSet.UnorderedView = [6, 4, 2, 0] + /// set.subtract(other) + /// // set is now [1, 3] + /// + /// - Parameter other: Another set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public mutating func subtract(_ other: Self) { + _base.subtract(other._base) + } + + // Generalizations + + /// Returns a new set containing the elements of this set that do not occur + /// in the given sequence. + /// + /// The result contains elements in the same order they appear in `self`. + /// + /// let set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.subtracting([6, 4, 2, 0] as Array) // [1, 3] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: A new set. + /// + /// - Complexity: Expected to be O(`self.count + other.count`) on average, if + /// `Element` implements high-quality hashing. + @inlinable + public __consuming func subtracting( + _ other: S + ) -> Self where S.Element == Element { + _base.subtracting(other).unordered + } + + /// Removes the elements of the given sequence from this set. + /// + /// var set: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// set.subtract([6, 4, 2, 0] as Array) + /// // set is now [1, 3] + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public mutating func subtract( + _ other: S + ) where S.Element == Element { + _base.subtract(other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether this set is a subset of + /// the given set. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSubset(of other: Self) -> Bool { + _base.isSubset(of: other._base) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether this set is a subset of + /// the given set. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: Set = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSubset(of other: Set) -> Bool { + _base.isSubset(of: other) + } + + /// Returns a Boolean value that indicates whether this set is a subset of + /// the elements in the given sequence. + /// + /// Set *A* is a subset of another set *B* if every member of *A* is also a + /// member of *B*, ignoring the order they appear in the two sets. + /// + /// let a: Array = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isSubset(of: a) // true + /// + /// - Parameter other: A finite sequence. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isSubset( + of other: S + ) -> Bool where S.Element == Element { + _base.isSubset(of: other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given set. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSuperset(of other: Self) -> Bool { + _base.isSuperset(of: other._base) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given set. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Set = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isSuperset(of other: Set) -> Bool { + _base.isSuperset(of: other) + } + + /// Returns a Boolean value that indicates whether this set is a superset of + /// the given sequence. + /// + /// Set *A* is a superset of another set *B* if every member of *B* is also a + /// member of *A*, ignoring the order they appear in the two sets. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Array = [4, 2, 1] + /// a.isSuperset(of: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if the set is a subset of `other`; otherwise, `false`. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public func isSuperset( + of other: S + ) -> Bool where S.Element == Element { + _base.isSuperset(of: other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given set. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSubset(of other: Self) -> Bool { + _base.isStrictSubset(of: other._base) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given set. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: Set = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSubset(of other: Set) -> Bool { + _base.isStrictSubset(of: other) + } + + /// Returns a Boolean value that indicates whether the set is a strict subset + /// of the given sequence. + /// + /// Set *A* is a strict subset of another set *B* if every member of *A* is + /// also a member of *B* and *B* contains at least one element that is not a + /// member of *A*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: Array = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// b.isStrictSubset(of: a) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` is a strict subset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isStrictSubset( + of other: S + ) -> Bool where S.Element == Element { + _base.isStrictSubset(of: other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given set. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSuperset(of other: Self) -> Bool { + _base.isStrictSuperset(of: other._base) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given set. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Set = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`other.count`) on average, if `Element` + /// implements high-quality hashing. + @inlinable + public func isStrictSuperset(of other: Set) -> Bool { + _base.isStrictSuperset(of: other) + } + + /// Returns a Boolean value that indicates whether the set is a strict + /// superset of the given sequence. + /// + /// Set *A* is a strict superset of another set *B* if every member of *B* is + /// also a member of *A* and *A* contains at least one element that is *not* + /// a member of *B*. (Ignoring the order the elements appear in the sets.) + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Array = [4, 2, 1] + /// a.isStrictSuperset(of: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` is a strict superset of `other`; otherwise, + /// `false`. + /// + /// - Complexity: Expected to be O(`self.count` + *n*) on average, where *n* + /// is the number of elements in `other`, if `Element` implements + /// high-quality hashing. + @inlinable + public func isStrictSuperset( + of other: S + ) -> Bool where S.Element == Element { + _base.isStrictSuperset(of: other) + } +} + +extension OrderedSet.UnorderedView { + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given set. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: OrderedSet.UnorderedView = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(min(`self.count`, `other.count`)) on + /// average, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint(with other: Self) -> Bool { + _base.isDisjoint(with: other._base) + } + + // Generalizations + + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given set. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Set = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: Another set. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(min(`self.count`, `other.count`)) on + /// average, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint(with other: Set) -> Bool { + _base.isDisjoint(with: other) + } + + /// Returns a Boolean value that indicates whether the set has no members in + /// common with the given sequence. + /// + /// let a: OrderedSet.UnorderedView = [1, 2, 3, 4] + /// let b: Array = [5, 6] + /// a.isDisjoint(with: b) // true + /// + /// - Parameter other: A finite sequence of elements. + /// + /// - Returns: `true` if `self` has no elements in common with `other`; + /// otherwise, `false`. + /// + /// - Complexity: Expected to be O(*n*) on average, where *n* is the number of + /// elements in `other`, if `Element` implements high-quality hashing. + @inlinable + public func isDisjoint( + with other: S + ) -> Bool where S.Element == Element { + _base.isDisjoint(with: other) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnstableInternals.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnstableInternals.swift new file mode 100644 index 00000000..7896d0cd --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet+UnstableInternals.swift @@ -0,0 +1,48 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension OrderedSet { + /// Exposes some private implementation details and low-level unsafe + /// operations, primarily to allow clear box testing. + /// + /// This struct is a private implementation detail, therefore it and its + /// members are not covered by any source compatibility promises -- they + /// may disappear in any new release. + @frozen + public struct _UnstableInternals { + @usableFromInline + internal typealias _Bucket = _HashTable.Bucket + + @usableFromInline + internal var base: OrderedSet + + @inlinable + init(_ base: OrderedSet) { + self.base = base + } + } + + @inlinable + public var __unstable: _UnstableInternals { + @inline(__always) + get { + _UnstableInternals(self) + } + + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var view = _UnstableInternals(self) + self = OrderedSet() + defer { self = view.base } + yield &view + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet.swift new file mode 100644 index 00000000..83ca98a3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/OrderedSet/OrderedSet.swift @@ -0,0 +1,497 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// An ordered collection of unique elements. +/// +/// Similar to the standard `Set`, ordered sets ensure that each element appears +/// only once in the collection, and they provide efficient tests for +/// membership. However, like `Array` (and unlike `Set`), ordered sets maintain +/// their elements in a particular user-specified order, and they support +/// efficient random-access traversal of their members. +/// +/// `OrderedSet` is a useful alternative to `Set` when the order of elements is +/// important, or when you need to be able to efficiently access elements at +/// various positions within the collection. It can also be used instead of an +/// `Array` when each element needs to be unique, or when you need to be able to +/// quickly determine if a value is a member of the collection. +/// +/// You can create an ordered set with any element type that conforms to the +/// `Hashable` protocol. +/// +/// let buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"] +/// +/// +/// # Equality of Ordered Sets +/// +/// Two ordered sets are considered equal if they contain the same elements, and +/// *in the same order*. This matches the concept of equality of an `Array`, and +/// it is different from the unordered `Set`. +/// +/// let a: OrderedSet = [1, 2, 3, 4] +/// let b: OrderedSet = [4, 3, 2, 1] +/// a == b // false +/// b.sort() // `b` now has value [1, 2, 3, 4] +/// a == b // true +/// +/// # Set Operations +/// +/// `OrderedSet` implements most, but not all, `SetAlgebra` requirements. In +/// particular, it supports the membership test `contains(_:)` as well as all +/// high-level set operations such as `union(_:)`, `intersection(_:)` or +/// `isSubset(of:)`. +/// +/// buildingMaterials.contains("glass") // false +/// buildingMaterials.intersection(["brick", "straw"]) // ["straw", "brick"] +/// +/// Operations that return an ordered set usually preserve the ordering of +/// elements in their input. For example, in the case of the `intersection` call +/// above, the ordering of elements in the result is guaranteed to match their +/// order in the first input set, `buildingMaterials`. +/// +/// On the other hand, predicates such as `isSubset(of:)` tend to ignore element +/// ordering: +/// +/// let moreMaterials: OrderedSet = ["bricks", "glass", "sticks", "straw"] +/// buildingMaterials.isSubset(of: moreMaterials) // true +/// +/// However, `OrderedSet` does not implement `insert(_:)` nor `update(with:)` -- +/// it provides its own variants for insertion that are more explicit about +/// where in the collection new elements gets inserted: +/// +/// func insert(_ item: Element, at index: Int) -> (inserted: Bool, index: Int) +/// func append(_ item: Element) -> (inserted: Bool, index: Int) +/// func update(at index: Int, with item: Element) -> Element +/// func updateOrAppend(_ item: Element) -> Element? +/// +/// Additionally,`OrderedSet` has an order-sensitive definition of equality (see +/// above) that is incompatible with `SetAlgebra`'s documented semantic +/// requirements. Accordingly, `OrderedSet` does not (cannot) itself conform to +/// `SetAlgebra`. +/// +/// # Unordered Set View +/// +/// For cases where `SetAlgebra` conformance is desired (such as when passing an +/// ordered set to a function that is generic over that protocol), `OrderedSet` +/// provides an efficient *unordered view* of its elements that conforms to +/// `SetAlgebra`. The unordered view implements the same concept of equality as +/// the standard `Set`, ignoring element ordering. +/// +/// var a: OrderedSet = [0, 1, 2, 3] +/// let b: OrderedSet = [3, 2, 1, 0] +/// a == b // false +/// a.unordered == b.unordered // true +/// +/// func frobnicate(_ set: S) { ... } +/// frobnicate(a) // error: `OrderedSet` does not conform to `SetAlgebra` +/// frobnicate(a.unordered) // OK +/// +/// The unordered view is mutable. Insertions into it implicitly append new +/// elements to the end of the collection. +/// +/// buildingMaterials.unordered.insert("glass") // => inserted: true +/// // buildingMaterials is now ["straw", "sticks", "brick", "glass"] +/// +/// Accessing the unordered view is an efficient operation, with constant +/// (minimal) overhead. Direct mutations of the unordered view (such as the +/// insertion above) are executed in place when possible. However, as usual with +/// copy-on-write collections, if you make a copy of the view (such as by +/// extracting its value into a named variable), the resulting values will share +/// the same underlying storage, so mutations of either will incur a copy of the +/// whole set. +/// +/// # Sequence and Collection Operations +/// +/// Ordered sets are random-access collections. Members are assigned integer +/// indices, with the first element always being at index `0`: +/// +/// let buildingMaterials: OrderedSet = ["straw", "sticks", "bricks"] +/// buildingMaterials[1] // "sticks" +/// buildingMaterials.firstIndex(of: "bricks") // 2 +/// +/// for i in 0 ..< buildingMaterials.count { +/// print("Little piggie #\(i) built a house of \(buildingMaterials[i])") +/// } +/// // Little piggie #0 built a house of straw +/// // Little piggie #1 built a house of sticks +/// // Little piggie #2 built a house of bricks +/// +/// Because `OrderedSet` needs to keep its members unique, it cannot conform to +/// the full `MutableCollection` or `RangeReplaceableCollection` protocols. +/// Operations such as `MutableCollection`'s subscript setter or +/// `RangeReplaceableCollection`'s `replaceSubrange` assume the ability to +/// insert/replace arbitrary elements in the collection, but allowing that could +/// lead to duplicate values. +/// +/// However, `OrderedSet` is able to partially implement these two protocols; +/// namely, there is no issue with mutation operations that merely change the +/// order of elements, or just remove some subset of existing members: +/// +/// // Permutation operations from MutableCollection: +/// func swapAt(_ i: Int, _ j: Int) +/// func partition(by predicate: (Element) throws -> Bool) -> rethrows Int +/// func sort() where Element: Comparable +/// func sort(by predicate: (Element, Element) throws -> Bool) rethrows +/// func shuffle() +/// func shuffle(using generator: inout T) +/// func reverse() +/// +/// // Removal operations from RangeReplaceableCollection: +/// func removeAll(keepingCapacity: Bool = false) +/// func remove(at index: Int) -> Element +/// func removeSubrange(_ bounds: Range) +/// func removeLast() -> Element +/// func removeLast(_ n: Int) +/// func removeFirst() -> Element +/// func removeFirst(_ n: Int) +/// func removeAll(where shouldBeRemoved: (Element) throws -> Bool) rethrows +/// +/// `OrderedSet` also implements `reserveCapacity(_)` from +/// `RangeReplaceableCollection`, to allow for efficient insertion of a known +/// number of elements. (However, unlike `Array` and `Set`, `OrderedSet` does +/// not provide a `capacity` property.) +/// +/// # Accessing The Contents of an Ordered Set as an Array +/// +/// In cases where you need to pass the contents of an ordered set to a function +/// that only takes an array value or (or something that's generic over +/// `RangeReplaceableCollection` or `MutableCollection`), then the best option +/// is usually to directly extract the members of the `OrderedSet` as an `Array` +/// value using its `elements` property. `OrderedSet` uses a standard array +/// value for element storage, so extracting the array value has minimal +/// overhead. +/// +/// func pickyFunction(_ items: Array) +/// +/// var set: OrderedSet = [0, 1, 2, 3] +/// pickyFunction(set) // error +/// pickyFunction(set.elements) // OK +/// +/// It is also possible to mutate the set by updating the value of the +/// `elements` property. This guarantees that direct mutations happen in place +/// when possible (i.e., without spurious copy-on-write copies). +/// +/// However, the set needs to ensure the uniqueness of its members, so every +/// update to `elements` includes a postprocessing step to detect and remove +/// duplicates over the entire array. This can be slower than doing the +/// equivalent updates with direct `OrderedSet` operations, so updating +/// `elements` is best used in cases where direct implementations aren't +/// available -- for example, when you need to call a `MutableCollection` +/// algorithm that isn't directly implemented by `OrderedSet` itself. +/// +/// # Performance +/// +/// Like the standard `Set` type, the performance of hashing operations in +/// `OrderedSet` is highly sensitive to the quality of hashing implemented by +/// the `Element` type. Failing to correctly implement hashing can easily lead +/// to unacceptable performance, with the severity of the effect increasing with +/// the size of the hash table. +/// +/// In particular, if a certain set of elements all produce the same hash value, +/// then hash table lookups regress to searching an element in an unsorted +/// array, i.e., a linear operation. To ensure hashed collection types exhibit +/// their target performance, it is important to ensure that such collisions +/// cannot be induced merely by adding a particular list of members to the set. +/// +/// The easiest way to achieve this is to make sure `Element` implements hashing +/// following `Hashable`'s documented best practices. The conformance must +/// implement the `hash(into:)` requirement, and every bit of information that +/// is compared in `==` needs to be combined into the supplied `Hasher` value. +/// When used correctly, `Hasher` produces high-quality, randomly seeded hash +/// values that prevent repeatable hash collisions. +/// +/// When `Element` implements `Hashable` correctly, testing for membership in an +/// ordered set is expected to take O(1) equality checks on average. Hash +/// collisions can still occur organically, so the worst-case lookup performance +/// is technically still O(*n*) (where *n* is the size of the set); however, +/// long lookup chains are unlikely to occur in practice. +/// +/// # Implementation Details +/// +/// An `OrderedSet` stores its members in a regular `Array` value (exposed by +/// the `elements` property). It also maintains a standalone hash table +/// containing array indices alongside the array; this is used to implement fast +/// membership tests. The size of the array is limited by the capacity of the +/// corresponding hash table, so indices stored inside the hash table can be +/// encoded into fewer bits than a standard `Int` value, leading to a storage +/// representation that can often be more compact than that of `Set` itself. +/// +/// Inserting or removing a single member (or a range of members) needs to +/// perform the corresponding operation in the storage array, in addition to +/// renumbering any subsequent members in the hash table. Therefore, these +/// operations are expected to have performance characteristics similar to an +/// `Array`: inserting or removing an element to the end of an ordered set is +/// expected to execute in O(1) operations, while they are expected to take +/// linear time at the front (or in the middle) of the set. (Note that this is +/// different to the standard `Set`, where insertions and removals are expected +/// to take amortized O(1) time.) +@frozen +public struct OrderedSet where Element: Hashable +{ + @usableFromInline + internal typealias _Bucket = _HashTable.Bucket + + @usableFromInline + internal var __storage: _HashTable.Storage? + + @usableFromInline + internal var _elements: ContiguousArray + + @inlinable + internal init( + _uniqueElements: ContiguousArray, + _ table: _HashTable? + ) { + self.__storage = table?._storage + self._elements = _uniqueElements + } + + @inlinable + @inline(__always) + internal var _table: _HashTable? { + get { __storage.map { _HashTable($0) } } + set { __storage = newValue?._storage } + } +} + +extension OrderedSet { + /// A view of the members of this set, as a regular array value. + /// + /// It is possible to mutate the set by updating the value of this property. + /// This guarantees that direct mutations happen in place when possible (i.e., + /// without spurious copy-on-write copies). + /// + /// However, the set needs to ensure the uniqueness of its members, so every + /// update to `elements` includes a postprocessing step to detect and remove + /// duplicates over the entire array. This can be slower than doing the + /// equivalent updates with direct `OrderedSet` operations, so updating + /// `elements` is best used in cases where direct implementations aren't + /// available -- for example, when you need to call a `MutableCollection` + /// algorithm that isn't directly implemented by `OrderedSet` itself. + /// + /// - Complexity: O(1) for the getter. Mutating this property has an expected + /// complexity of O(`count`), if `Element` implements high-quality hashing. + @inlinable + public var elements: [Element] { + get { + Array(_elements) + } + set { + self = .init(newValue) + } + @inline(__always) // https://github.com/apple/swift-collections/issues/164 + _modify { + var members = Array(_elements) + _elements = [] + defer { self = .init(members) } + yield &members + } + } +} + +extension OrderedSet { + /// The maximum number of elements this instance can store before it needs + /// to resize its hash table. + @inlinable + internal var _capacity: Int { + _table?.capacity ?? _HashTable.maximumUnhashedCount + } + + @inlinable + internal var _minimumCapacity: Int { + if _scale == _reservedScale { return 0 } + return _HashTable.minimumCapacity(forScale: _scale) + } + + @inlinable + internal var _scale: Int { + _table?.scale ?? 0 + } + + @inlinable + internal var _reservedScale: Int { + _table?.reservedScale ?? 0 + } + + @inlinable + internal var _bias: Int { + _table?.bias ?? 0 + } +} + +extension OrderedSet { + @inlinable + internal mutating func _regenerateHashTable(scale: Int, reservedScale: Int) { + assert(_HashTable.maximumCapacity(forScale: scale) >= _elements.count) + assert(reservedScale == 0 || reservedScale >= _HashTable.minimumScale) + _table = _HashTable.create( + uncheckedUniqueElements: _elements, + scale: Swift.max(scale, reservedScale), + reservedScale: reservedScale) + } + + @inlinable + internal mutating func _regenerateHashTable() { + let reservedScale = _reservedScale + guard + _elements.count > _HashTable.maximumUnhashedCount || reservedScale != 0 + else { + // We have too few elements; disable hashing. + _table = nil + return + } + let scale = _HashTable.scale(forCapacity: _elements.count) + _regenerateHashTable(scale: scale, reservedScale: reservedScale) + } + + @inlinable + internal mutating func _regenerateExistingHashTable() { + assert(_capacity >= _elements.count) + guard _table != nil else { + return + } + _ensureUnique() + _table!.update { hashTable in + hashTable.clear() + hashTable.fill(uncheckedUniqueElements: _elements) + } + } +} + +extension OrderedSet { + @inlinable + @inline(__always) + internal mutating func _isUnique() -> Bool { + isKnownUniquelyReferenced(&__storage) + } + + @inlinable + internal mutating func _ensureUnique() { + if __storage == nil { return } + if isKnownUniquelyReferenced(&__storage) { return } + _table = _table!.copy() + } +} + +extension OrderedSet { + @inlinable + internal func _find(_ item: Element) -> (index: Int?, bucket: _Bucket) { + _find_inlined(item) + } + + @inlinable + @inline(__always) + internal func _find_inlined(_ item: Element) -> (index: Int?, bucket: _Bucket) { + _elements.withUnsafeBufferPointer { elements in + guard let table = _table else { + return (elements.firstIndex(of: item), _Bucket(offset: 0)) + } + return table.read { hashTable in + hashTable._find(item, in: elements) + } + } + } + + @inlinable + internal func _bucket(for index: Int) -> _Bucket { + guard let table = _table else { return _Bucket(offset: 0) } + return table.read { hashTable in + var it = hashTable.bucketIterator(for: _elements[index]) + it.advance(until: index) + precondition(it.isOccupied, "Corrupt hash table") + return it.currentBucket + } + } + + /// Returns the index of the given element in the set, or `nil` if the element + /// is not a member of the set. + /// + /// `OrderedSet` members are always unique, so the first index of an element + /// is always the same as its last index. + /// + /// - Complexity: This operation is expected to perform O(1) comparisons on + /// average, provided that `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public func firstIndex(of element: Element) -> Int? { + _find(element).index + } + + /// Returns the index of the given element in the set, or `nil` if the element + /// is not a member of the set. + /// + /// `OrderedSet` members are always unique, so the first index of an element + /// is always the same as its last index. + /// + /// - Complexity: This operation is expected to perform O(1) comparisons on + /// average, provided that `Element` implements high-quality hashing. + @inlinable + @inline(__always) + public func lastIndex(of element: Element) -> Int? { + _find(element).index + } +} + +extension OrderedSet { + @inlinable + @inline(never) + internal __consuming func _extractSubset( + using bitset: _UnsafeBitset, + extraCapacity: Int = 0 + ) -> Self { + assert(bitset.count == 0 || bitset.max()! <= count) + if bitset.count == 0 { return Self(minimumCapacity: extraCapacity) } + if bitset.count == self.count { + if extraCapacity <= self._capacity - self.count { + return self + } + var copy = self + copy.reserveCapacity(count + extraCapacity) + return copy + } + var result = Self(minimumCapacity: bitset.count + extraCapacity) + for offset in bitset { + result._appendNew(_elements[offset]) + } + assert(result.count == bitset.count) + return result + } +} + +extension OrderedSet { + @inlinable + @discardableResult + internal mutating func _removeExistingMember( + at index: Int, + in bucket: _Bucket + ) -> Element { + guard _elements.count - 1 >= _minimumCapacity else { + let old = _elements.remove(at: index) + _regenerateHashTable() + return old + } + guard _table != nil else { + return _elements.remove(at: index) + } + + defer { _checkInvariants() } + _ensureUnique() + _table!.update { hashTable in + // Delete the entry for the removed member. + hashTable.delete( + bucket: bucket, + hashValueGenerator: { offset, seed in + _elements[offset]._rawHashValue(seed: seed) + }) + hashTable.adjustContents(preparingForRemovalOf: index, in: _elements) + } + return _elements.remove(at: index) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/RandomAccessCollection+Offsets.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/RandomAccessCollection+Offsets.swift new file mode 100644 index 00000000..54a56fa8 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/RandomAccessCollection+Offsets.swift @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension RandomAccessCollection { + @inlinable + @inline(__always) + internal func _index(at offset: Int) -> Index { + index(startIndex, offsetBy: offset) + } + + @inlinable + @inline(__always) + internal func _offset(of index: Index) -> Int { + distance(from: startIndex, to: index) + } + + @inlinable + @inline(__always) + internal subscript(_offset offset: Int) -> Element { + self[_index(at: offset)] + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/_UnsafeBitset.swift b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/_UnsafeBitset.swift new file mode 100644 index 00000000..aa10c684 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/OrderedCollections/Utilities/_UnsafeBitset.swift @@ -0,0 +1,395 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// A simple bitmap of a fixed number of bits, implementing a sorted set of +/// small nonnegative `Int` values. +/// +/// Because `_UnsafeBitset` implements a flat bit vector, it isn't suitable for +/// holding arbitrarily large integers. The maximal element a bitset can store +/// is fixed at its initialization. +@usableFromInline +@frozen +internal struct _UnsafeBitset { + @usableFromInline + internal let _words: UnsafeMutableBufferPointer + + @usableFromInline + internal var _count: Int + + @inlinable + @inline(__always) + internal init(words: UnsafeMutableBufferPointer, count: Int) { + self._words = words + self._count = count + } + + @inlinable + @inline(__always) + internal init(words: UnsafeMutablePointer, wordCount: Int, count: Int) { + self._words = UnsafeMutableBufferPointer(start: words, count: wordCount) + self._count = count + } + + @inlinable + @inline(__always) + internal var count: Int { + _count + } +} + +extension _UnsafeBitset { + @usableFromInline + internal var _actualCount: Int { + return _words.reduce(0) { $0 + $1.count } + } +} + +extension _UnsafeBitset { + @inlinable + @inline(__always) + static func withTemporaryBitset( + capacity: Int, + run body: (inout _UnsafeBitset) throws -> R + ) rethrows -> R { + var result: R? + try _withTemporaryBitset(capacity: capacity) { bitset in + result = try body(&bitset) + } + return result! + } + + @usableFromInline + @inline(never) + static func _withTemporaryBitset( + capacity: Int, + run body: (inout _UnsafeBitset) throws -> Void + ) rethrows { + let wordCount = _UnsafeBitset.wordCount(forCapacity: capacity) +#if compiler(>=5.6) + return try withUnsafeTemporaryAllocation( + of: Word.self, capacity: wordCount + ) { words in + words.initialize(repeating: .empty) + var bitset = Self(words: words, count: 0) + return try body(&bitset) + } +#else + if wordCount <= 2 { + var buffer: (Word, Word) = (.empty, .empty) + return try withUnsafeMutablePointer(to: &buffer) { p in + // Homogeneous tuples are layout-compatible with their component type. + let words = UnsafeMutableRawPointer(p).assumingMemoryBound(to: Word.self) + var bitset = _UnsafeBitset(words: words, wordCount: wordCount, count: 0) + return try body(&bitset) + } + } + let words = UnsafeMutableBufferPointer.allocate(capacity: wordCount) + words.initialize(repeating: .empty) + defer { words.deallocate() } + var bitset = _UnsafeBitset(words: words, count: 0) + return try body(&bitset) +#endif + } +} + +extension _UnsafeBitset { + @inline(__always) + internal static func word(for element: Int) -> Int { + assert(element >= 0) + // Note: We perform on UInts to get faster unsigned math (shifts). + let element = UInt(bitPattern: element) + let capacity = UInt(bitPattern: Word.capacity) + return Int(bitPattern: element / capacity) + } + + @inline(__always) + internal static func bit(for element: Int) -> Int { + assert(element >= 0) + // Note: We perform on UInts to get faster unsigned math (masking). + let element = UInt(bitPattern: element) + let capacity = UInt(bitPattern: Word.capacity) + return Int(bitPattern: element % capacity) + } + + @inline(__always) + internal static func split(_ element: Int) -> (word: Int, bit: Int) { + return (word(for: element), bit(for: element)) + } + + @inline(__always) + internal static func join(word: Int, bit: Int) -> Int { + assert(bit >= 0 && bit < Word.capacity) + return word &* Word.capacity &+ bit + } +} + +extension _UnsafeBitset { + @usableFromInline + @_effects(readnone) + @inline(__always) + internal static func wordCount(forCapacity capacity: Int) -> Int { + return word(for: capacity &+ Word.capacity &- 1) + } + + internal var capacity: Int { + @inline(__always) + get { + return _words.count &* Word.capacity + } + } + + @inline(__always) + internal func isValid(_ element: Int) -> Bool { + return element >= 0 && element < capacity + } + + @inline(__always) + internal func contains(_ element: Int) -> Bool { + assert(isValid(element)) + let (word, bit) = _UnsafeBitset.split(element) + return _words[word].contains(bit) + } + + @usableFromInline + @_effects(releasenone) + @discardableResult + internal mutating func insert(_ element: Int) -> Bool { + assert(isValid(element)) + let (word, bit) = _UnsafeBitset.split(element) + let inserted = _words[word].insert(bit) + if inserted { _count += 1 } + return inserted + } + + @usableFromInline + @_effects(releasenone) + @discardableResult + internal mutating func remove(_ element: Int) -> Bool { + assert(isValid(element)) + let (word, bit) = _UnsafeBitset.split(element) + let removed = _words[word].remove(bit) + if removed { _count -= 1 } + return removed + } + + @usableFromInline + @_effects(releasenone) + internal mutating func clear() { + guard _words.count > 0 else { return } + _words.baseAddress!.assign(repeating: .empty, count: _words.count) + _count = 0 + } + + @usableFromInline + @_effects(releasenone) + internal mutating func insertAll(upTo max: Int) { + assert(max <= capacity) + guard max > 0 else { return } + let (w, b) = _UnsafeBitset.split(max) + for i in 0 ..< w { + _count += Word.capacity - _words[i].count + _words[i] = .allBits + } + if b > 0 { + _count += _words[w].insert(bitsBelow: b) + } + } + + @usableFromInline + @_effects(releasenone) + internal mutating func removeAll(upTo max: Int) { + assert(max <= capacity) + guard max > 0 else { return } + let (w, b) = _UnsafeBitset.split(max) + for i in 0 ..< w { + _count -= _words[i].count + _words[i] = .empty + } + if b > 0 { + _count -= _words[w].remove(bitsBelow: b) + } + } +} + +extension _UnsafeBitset: Sequence { + @usableFromInline + internal typealias Element = Int + + @inlinable + @inline(__always) + internal var underestimatedCount: Int { + return count + } + + @inlinable + @inline(__always) + func makeIterator() -> Iterator { + return Iterator(self) + } + + @usableFromInline + @frozen + internal struct Iterator: IteratorProtocol { + @usableFromInline + internal let bitset: _UnsafeBitset + + @usableFromInline + internal var index: Int + + @usableFromInline + internal var word: Word + + @inlinable + internal init(_ bitset: _UnsafeBitset) { + self.bitset = bitset + self.index = 0 + self.word = bitset._words.count > 0 ? bitset._words[0] : .empty + } + + @usableFromInline + @_effects(releasenone) + internal mutating func next() -> Int? { + if let bit = word.next() { + return _UnsafeBitset.join(word: index, bit: bit) + } + while (index + 1) < bitset._words.count { + index += 1 + word = bitset._words[index] + if let bit = word.next() { + return _UnsafeBitset.join(word: index, bit: bit) + } + } + return nil + } + } +} + +//////////////////////////////////////////////////////////////////////////////// +extension _UnsafeBitset { + @usableFromInline + @frozen + internal struct Word { + @usableFromInline + internal var value: UInt + + @inlinable + @inline(__always) + internal init(_ value: UInt) { + self.value = value + } + } +} + +extension _UnsafeBitset.Word { + @inlinable + @inline(__always) + internal static var capacity: Int { + return UInt.bitWidth + } + + @inlinable + @inline(__always) + internal var count: Int { + value.nonzeroBitCount + } + + @inlinable + @inline(__always) + internal var isEmpty: Bool { + value == 0 + } + + @inlinable + @inline(__always) + internal func contains(_ bit: Int) -> Bool { + assert(bit >= 0 && bit < UInt.bitWidth) + return value & (1 &<< bit) != 0 + } + + @inlinable + @inline(__always) + @discardableResult + internal mutating func insert(_ bit: Int) -> Bool { + assert(bit >= 0 && bit < UInt.bitWidth) + let mask: UInt = 1 &<< bit + let inserted = value & mask == 0 + value |= mask + return inserted + } + + @inlinable + @inline(__always) + @discardableResult + internal mutating func remove(_ bit: Int) -> Bool { + assert(bit >= 0 && bit < UInt.bitWidth) + let mask: UInt = 1 &<< bit + let removed = value & mask != 0 + value &= ~mask + return removed + } +} + +extension _UnsafeBitset.Word { + @inlinable + @inline(__always) + internal mutating func insert(bitsBelow bit: Int) -> Int { + assert(bit >= 0 && bit < Self.capacity) + let mask: UInt = (1 as UInt &<< bit) &- 1 + let inserted = bit - (value & mask).nonzeroBitCount + value |= mask + return inserted + } + + @inlinable + @inline(__always) + internal mutating func remove(bitsBelow bit: Int) -> Int { + assert(bit >= 0 && bit < Self.capacity) + let mask = UInt.max &<< bit + let removed = (value & ~mask).nonzeroBitCount + value &= mask + return removed + } +} + +extension _UnsafeBitset.Word { + @inlinable + @inline(__always) + internal static var empty: Self { + Self(0) + } + + @inlinable + @inline(__always) + internal static var allBits: Self { + Self(UInt.max) + } +} + +// Word implements Sequence by using a copy of itself as its Iterator. +// Iteration with `next()` destroys the word's value; however, this won't cause +// problems in normal use, because `next()` is usually called on a separate +// iterator, not the original word. +extension _UnsafeBitset.Word: Sequence, IteratorProtocol { + @inlinable + internal var underestimatedCount: Int { + count + } + + /// Return the index of the lowest set bit in this word, + /// and also destructively clear it. + @inlinable + internal mutating func next() -> Int? { + guard value != 0 else { return nil } + let bit = value.trailingZeroBitCount + value &= value &- 1 // Clear lowest nonzero bit. + return bit + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Assertions.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Assertions.swift new file mode 100644 index 00000000..ff2e6e4f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Assertions.swift @@ -0,0 +1,404 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import XCTest + +public func expectFailure( + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + let message = message() + XCTFail( + TestContext.currentTrace(message), + file: file, line: line) + if trapping { + fatalError(message, file: file, line: line) + } +} + +internal func _expectFailure( + _ diagnostic: String, + _ message: () -> String, + trapping: Bool, + file: StaticString, + line: UInt +) { + let message = message() + XCTFail( + TestContext.currentTrace( + """ + \(diagnostic) + \(message) + """), + file: file, line: line) + if trapping { + fatalError(message, file: file, line: line) + } +} + +public func expectTrue( + _ value: Bool, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if value { return } + _expectFailure( + "'\(value)' is not true", + message, trapping: trapping, file: file, line: line) +} + +public func expectFalse( + _ value: Bool, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if !value { return } + _expectFailure( + "'\(value)' is not false", + message, trapping: trapping, file: file, line: line) +} + +public func expectNil( + _ value: Optional, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if value == nil { return } + _expectFailure( + "'\(value!)' is not nil", + message, trapping: trapping, file: file, line: line) +} + +public func expectNotNil( + _ value: Optional, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if value != nil { return } + _expectFailure( + "value is nil", + message, trapping: trapping, file: file, line: line) +} + +public func expectNotNil( + _ value: Optional, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line, + _ handler: (T) throws -> Void = { _ in } +) rethrows { + if let value = value { + try handler(value) + return + } + _expectFailure( + "value is nil", + message, trapping: trapping, file: file, line: line) +} + +public func expectIdentical( + _ left: T?, _ right: T?, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left === right { return } + let l = left.map { "\($0)" } ?? "nil" + let r = right.map { "\($0)" } ?? "nil" + _expectFailure( + "'\(l)' is not identical to '\(r)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectNotIdentical( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left !== right { return } + _expectFailure( + "'\(left)' is identical to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectEquivalent( + _ left: A, _ right: B, + by areEquivalent: (A, B) -> Bool, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if areEquivalent(left, right) { return } + _expectFailure( + "'\(left)' is not equivalent to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectEquivalent( + _ left: A?, _ right: B?, + by areEquivalent: (A, B) -> Bool, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if let left = left, let right = right, areEquivalent(left, right) { return } + let l = left.map { "\($0)" } ?? "nil" + let r = right.map { "\($0)" } ?? "nil" + _expectFailure( + "'\(l)' is not equivalent to '\(r)'", + message, trapping: trapping, file: file, line: line) +} + + +public func expectEqual( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left == right { return } + _expectFailure( + "'\(left)' is not equal to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectEqual( + _ left: (key: Key, value: Value), _ right: (key: Key, value: Value), + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left == right { return } + _expectFailure( + "'\(left)' is not equal to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + + +public func expectEqual( + _ left: T?, _ right: T?, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left == right { return } + let l = left.map { "\($0)" } ?? "nil" + let r = right.map { "\($0)" } ?? "nil" + _expectFailure( + "'\(l)' is not equal to '\(r)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectNotEqual( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left != right { return } + _expectFailure( + "'\(left)' is equal to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectLessThan( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left < right { return } + _expectFailure( + "'\(left)' is not less than '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectLessThanOrEqual( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left <= right { return } + _expectFailure( + "'\(left)' is not less than or equal to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectGreaterThan( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left > right { return } + _expectFailure( + "'\(left)' is not greater than '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectGreaterThanOrEqual( + _ left: T, _ right: T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + if left >= right { return } + _expectFailure( + "'\(left)' is not less than or equal to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +/// Check if `left` and `right` contain equal elements in the same order. +/// Note: `left` and `right` must be restartable sequences. +public func expectEqualElements( + _ left: S1, + _ right: S2, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) where S1.Element == S2.Element, S1.Element: Equatable { + let left = Array(left) + let right = Array(right) + if left.elementsEqual(right) { return } + _expectFailure( + "'\(left)' does not have equal elements to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectEquivalentElements( + _ left: S1, + _ right: S2, + by areEquivalent: (S1.Element, S2.Element) -> Bool, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) { + let left = Array(left) + let right = Array(right) + if left.elementsEqual(right, by: areEquivalent) { return } + _expectFailure( + "'\(left)' does not have equivalent elements to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +/// Check if `left` and `right` contain equal elements in the same order. +/// Note: `left` and `right` must be restartable sequences. +public func expectEqualElements< + S1: Sequence, S2: Sequence, + A: Equatable, B: Equatable +>( + _ left: S1, + _ right: S2, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) where S1.Element == (key: A, value: B), S2.Element == (key: A, value: B) { + let left = Array(left) + let right = Array(right) + if + left.elementsEqual( + right, + by: { $0.key == $1.key && $0.value == $1.value }) + { return } + _expectFailure( + "'\(left)' does not have equal elements to '\(right)'", + message, trapping: trapping, file: file, line: line) +} + +public func expectMonotonicallyIncreasing( + _ items: S, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) where S.Element: Comparable { + let items = Array(items) + var it = items.makeIterator() + guard var prev = it.next() else { return } + while let next = it.next() { + guard prev <= next else { + _expectFailure( + "'\(items)' is not monotonically increasing", + message, trapping: trapping, file: file, line: line) + return + } + prev = next + } +} + +public func expectStrictlyMonotonicallyIncreasing( + _ items: S, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line +) where S.Element: Comparable { + let items = Array(items) + var it = items.makeIterator() + guard var prev = it.next() else { return } + while let next = it.next() { + guard prev < next else { + _expectFailure( + "'\(items)' is not strictly monotonically increasing", + message, trapping: trapping, file: file, line: line) + return + } + prev = next + } +} + +public func expectThrows( + _ expression: @autoclosure () throws -> T, + _ message: @autoclosure () -> String = "", + trapping: Bool = false, + file: StaticString = #file, + line: UInt = #line, + _ errorHandler: (Error) -> Void = { _ in } +) { + do { + let result = try expression() + expectFailure("Expression did not throw" + + (T.self == Void.self ? "" : " (returned '\(result)' instead)"), + trapping: trapping, + file: file, line: line) + } catch { + errorHandler(error) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/CollectionTestCase.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/CollectionTestCase.swift new file mode 100644 index 00000000..044a2c08 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/CollectionTestCase.swift @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import XCTest + +open class CollectionTestCase: XCTestCase { + internal var _context: TestContext? + + public var context: TestContext { _context! } + + public override func setUp() { + super.setUp() + _context = TestContext.pushNew() + } + + public override func tearDown() { + TestContext.pop(context) + _context = nil + super.tearDown() + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Combinatorics.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Combinatorics.swift new file mode 100644 index 00000000..1c3aa0a7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/Combinatorics.swift @@ -0,0 +1,183 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// Run the supplied closure with all values in `items` in a loop, +/// recording the current value in the current test trace stack. +public func withEvery( + _ label: String, + in items: S, + file: StaticString = #file, + line: UInt = #line, + run body: (S.Element) throws -> Void +) rethrows { + let context = TestContext.current + for item in items { + let entry = context.push("\(label): \(item)", file: file, line: line) + var done = false + defer { + context.pop(entry) + if !done { + print(context.currentTrace(title: "Throwing trace")) + } + } + try body(item) + done = true + } +} + +public func withEveryRange( + _ label: String, + in bounds: Range, + file: StaticString = #file, + line: UInt = #line, + run body: (Range) throws -> Void +) rethrows where T.Stride == Int { + let context = TestContext.current + for lowerBound in bounds.lowerBound ... bounds.upperBound { + for upperBound in lowerBound ... bounds.upperBound { + let range = lowerBound ..< upperBound + let entry = context.push("\(label): \(range)", file: file, line: line) + var done = false + defer { + context.pop(entry) + if !done { + print(context.currentTrace(title: "Throwing trace")) + } + } + try body(range) + done = true + } + } +} + +internal func _samples(from items: C) -> [C.Element] { + let c = items.count + guard c > 7 else { return Array(items) } + let offsets = [0, 1, c / 2 - 1, c / 2, c / 2 + 1, c - 2, c - 1] + var offset = 0 + var index = items.startIndex + var result: [C.Element] = [] + result.reserveCapacity(7) + for o in offsets { + items.formIndex(&index, offsetBy: o - offset) + offset = o + result.append(items[index]) + } + return result +} + +/// Run the supplied closure with all values in `items` in a loop, +/// recording the current value in the current test trace stack. +public func withSome( + _ label: String, + in items: C, + file: StaticString = #file, + line: UInt = #line, + run body: (C.Element) throws -> Void +) rethrows { + let context = TestContext.current + for item in _samples(from: items) { + let entry = context.push("\(label): \(item)", file: file, line: line) + var done = false + defer { + context.pop(entry) + if !done { + print(context.currentTrace(title: "Throwing trace")) + } + } + try body(item) + done = true + } +} + +public func withSomeRanges( + _ label: String, + in bounds: Range, + file: StaticString = #file, + line: UInt = #line, + run body: (Range) throws -> Void +) rethrows where T.Stride == Int { + let context = TestContext.current + for lowerBound in _samples(from: bounds) { + for upperBound in _samples(from: lowerBound ... bounds.upperBound) { + let range = lowerBound ..< upperBound + let entry = context.push("\(label): \(range)", file: file, line: line) + var done = false + defer { + context.pop(entry) + if !done { + print(context.currentTrace(title: "Throwing trace")) + } + } + try body(range) + done = true + } + } +} + +/// Utility function for testing mutations with value semantics. +/// +/// Calls `body` with on given collection value, while optionally keeping +/// hidden a hidden copy of it around. Once `body` returns, checks that the copy +/// remain unchanged. +/// +/// - Parameters: +/// - `enabled`: if `false`, then no copies are made -- the values are passed to `body` with no processing. +/// - `value`: The collection value that is being tested. +/// - `checker`: An optional function that is used to check the consistency of the hidden copy. +/// - `body`: A closure performing a mutation on `value`. +public func withHiddenCopies( + if enabled: Bool, + of value: inout S, + checker: (S) -> Void = { _ in }, + file: StaticString = #file, line: UInt = #line, + _ body: (inout S) throws -> R +) rethrows -> R where S.Element: Equatable { + guard enabled else { return try body(&value) } + let copy = value + let expected = Array(value) + let result = try body(&value) + expectEqualElements(copy, expected, file: file, line: line) + checker(copy) + return result +} + +/// Utility function for testing mutations with value semantics. +/// +/// Calls `body` with on given collection value, while optionally keeping +/// hidden a hidden copy of it around. Once `body` returns, checks that the copy +/// remain unchanged. +/// +/// - Parameters: +/// - `enabled`: if `false`, then no copies are made -- the values are passed to `body` with no processing. +/// - `value`: The collection value that is being tested. +/// - `checker`: An optional function that is used to check the consistency of the hidden copy. +/// - `body`: A closure performing a mutation on `value`. +public func withHiddenCopies< + S: Sequence, + Key: Equatable, + Value: Equatable, + R +>( + if enabled: Bool, + of value: inout S, + checker: (S) -> Void = { _ in }, + file: StaticString = #file, line: UInt = #line, + _ body: (inout S) throws -> R +) rethrows -> R where S.Element == (key: Key, value: Value) { + guard enabled else { return try body(&value) } + let copy = value + let expected = Array(value) + let result = try body(&value) + expectEqualElements(copy, expected, file: file, line: line) + checker(copy) + return result +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/TestContext.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/TestContext.swift new file mode 100644 index 00000000..d12ab6db --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/AssertionContexts/TestContext.swift @@ -0,0 +1,259 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest + +public final class TestContext { + internal var _nextStateId = 0 + internal var _nextIndexId = 0 + + /// Stack of labels with associated source positions. + /// Useful for tracking failed cases in combinatorial tests. + internal var _trace: [Entry] = [] + + // FIXME: This ought to be a thread-local variable. + internal static var _current: TestContext? + + public init() {} +} + +extension TestContext { + public static var current: TestContext { + guard let current = _current else { + fatalError("There is no current test context") + } + return current + } + + public static func pushNew() -> TestContext { + let context = TestContext() + push(context) + return context + } + + public static func push(_ context: TestContext) { + precondition(_current == nil, "Can't nest test contexts") + _current = context + } + + public static func pop(_ context: TestContext) { + precondition(_current === context, "Can't pop mismatching context") + _current = nil + } +} + +extension TestContext { + /// An entry in the stack trace. Associates a user-specified label with its associated source position. + public struct Entry: Hashable, CustomStringConvertible { + let label: String + let file: StaticString + let line: UInt + + public init( + label: String, + file: StaticString = #file, + line: UInt = #line + ) { + self.label = label + self.file = file + self.line = line + } + + public var description: String { + "\(label) (\(file):\(line))" + } + + public static func ==(left: Self, right: Self) -> Bool { + left.label == right.label + && left.file.utf8Start == right.file.utf8Start + && left.file.utf8CodeUnitCount == right.file.utf8CodeUnitCount + && left.line == right.line + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(label) + hasher.combine(file.utf8Start) + hasher.combine(file.utf8CodeUnitCount) + hasher.combine(line) + } + } +} + +extension TestContext: Equatable { + public static func ==(left: TestContext, right: TestContext) -> Bool { + return left === right + } +} + +extension TestContext { + internal func nextStateId() -> Int { + defer { _nextStateId += 1 } + return _nextStateId + } + + internal func nextIndexId() -> Int { + defer { _nextIndexId += 1 } + return _nextIndexId + } +} + +extension TestContext { + /// Add the specified trace to the test context trace stack. + /// This call must be paired with a `pop` call with the same value, + /// with no intervening unpopped pushes. + @discardableResult + public func push(_ entry: Entry) -> Entry { + _trace.append(entry) + return entry + } + + /// Add the specified label to the test context trace stack. + /// This call must be paired with a `pop` call with the same value, + /// with no intervening unpopped pushes. + @discardableResult + public func push( + _ label: String, + file: StaticString = #file, + line: UInt = #line + ) -> Entry { + return push(Entry(label: label, file: file, line: line)) + } + + /// Cancel the trace push that returned `trace` and pop the context trace back + /// to the state it was before the push. All pushes since the one that pushed `trace` + /// must have been popped at the time this is called. + public func pop(_ entry: Entry) { + let old = _trace.removeLast() + precondition( + old == entry, + """ + Push/pop pairing violation: top of stack doesn't match expectation. + expected: \(entry) + actual: \(old) + + """) + } + + /// Execute the supplied closure in a new nested trace entry `entry`. + /// Assertion failure messages within the closure will include the specified information to aid with debugging. + public func withTrace( + _ entry: Entry, + _ body: () throws -> R + ) rethrows -> R { + push(entry) + defer { pop(entry) } + return try body() + } + + /// Execute the supplied closure in a new nested trace entry. + /// Assertion failure messages within the closure will include the specified information to aid with debugging. + public func withTrace( + _ label: String, + file: StaticString = #file, + line: UInt = #line, + _ body: () throws -> R + ) rethrows -> R { + let entry = push(label, file: file, line: line) + defer { pop(entry) } + return try body() + } + + /// The current stack of tracing labels with their associated source positions. + public var currentTrace: [Entry] { _trace } + + /// Return a (multi-line) string describing the current trace stack. + /// This string can be used to identify a particular test context, + /// for use in `failIfTraceMatches`. + public func currentTrace( + _ message: String = "", + title: String = "Trace" + ) -> String { + guard !_trace.isEmpty else { + return """ + \(message) + \(title): (empty) + + """ + } + var result = """ + \(message) + \(title): + + """ + for trace in _trace { + result += " - \(trace.label)\n" + } + return result + } + + public static func currentTrace( + _ message: String = "", + title: String = "Trace" + ) -> String { + guard let context = _current else { return message } + return context.currentTrace(message, title: title) + } + + /// Set a breakpoint on this function to stop execution only when `failIfTraceMatches` + /// triggers a test failure. The alternative is to set up a "Test Failure" breakpoint, + /// but if you have lots of test failures, that one might trigger too many times. + @inline(never) + public func debuggerBreak( + _ message: String, + file: StaticString = #file, + line: UInt = #line + ) { + XCTFail(message, file: file, line: line) + } + + /// Call this function to emit a test failure when the current test trace matches + /// the (typically multi-line) string given. By setting a breakpoint on test failures + /// (or on the `debuggerBreak` method above), you can then pause execution to + /// debug the test in that particular context. + /// + /// The string you need to pass to this function can be copy and pasted from + /// the failure message of the `expect` family of assertion methods, or + /// it can be manually generated by calling `currentTrace()` during a debug + /// session. + /// + /// For example, here we trigger a test failure when `count` is 8 and `offset` is 3: + /// + /// func testFoo() { + /// withEvery("count", in: 0 ..< 100) { count in + /// withEvery("offset", in: 0 ... count) { offset in + /// failIfTraceMatches(""" + /// Trace: + /// - count: 8 + /// - offset: 3 + /// """) + /// deque.buggyMethod(...) + /// } + /// } + /// } + /// + public func failIfTraceMatches( + _ expectedTrace: String, + file: StaticString = #file, + line: UInt = #line + ) { + // Filter for lines that match the regex " *- " + let breakOnTrace: [String] = + expectedTrace.split(separator: "\n").compactMap { line in + guard let i = line.firstIndex(where: { $0 != " " }) else { return nil } + guard line[i...].starts(with: "- ") else { return nil } + return String(line[i...].dropFirst(2)) + } + let labels = _trace.map({ $0.label }) + if labels == breakOnTrace { + debuggerBreak(currentTrace(title: "Hit trace"), file: file, line: line) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckBidirectionalCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckBidirectionalCollection.swift new file mode 100644 index 00000000..5c14935d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckBidirectionalCollection.swift @@ -0,0 +1,147 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +// FIXME: Port all of the collection validation tests from the Swift compiler codebase. + +import XCTest + +extension BidirectionalCollection { + func _indicesByIndexBefore() -> [Index] { + var result: [Index] = [] + var i = endIndex + while i != startIndex { + i = index(before: i) + result.append(i) + } + result.reverse() + return result + } + + func _indicesByFormIndexBefore() -> [Index] { + var result: [Index] = [] + var i = endIndex + while i != startIndex { + formIndex(before: &i) + result.append(i) + } + result.reverse() + return result + } +} + +public func checkBidirectionalCollection( + _ collection: C, + expectedContents: S, + file: StaticString = #file, + line: UInt = #line +) where C.Element: Equatable, S.Element == C.Element { + checkBidirectionalCollection( + collection, + expectedContents: expectedContents, + by: ==, + file: file, + line: line) +} + +public func checkBidirectionalCollection( + _ collection: C, + expectedContents: S, + by areEquivalent: (S.Element, S.Element) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where S.Element == C.Element { + checkSequence( + { collection }, expectedContents: expectedContents, + by: areEquivalent, + file: file, line: line) + _checkCollection( + collection, expectedContents: expectedContents, + by: areEquivalent, + file: file, line: line) + _checkBidirectionalCollection( + collection, expectedContents: expectedContents, + by: areEquivalent, + file: file, line: line) +} + +public func _checkBidirectionalCollection( + _ collection: C, + expectedContents: S, + by areEquivalent: (S.Element, S.Element) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where S.Element == C.Element { + let entry = TestContext.current.push("checkBidirectionalCollection", file: file, line: line) + defer { TestContext.current.pop(entry) } + + let expectedContents = Array(expectedContents) + + // Check that `index(before:)` and `formIndex(before:)` are consistent with `index(after:)`. + let indicesByIndexAfter = collection._indicesByIndexAfter() + let indicesByIndexBefore = collection._indicesByIndexBefore() + let indicesByFormIndexBefore = collection._indicesByFormIndexBefore() + expectEqual(indicesByIndexBefore, indicesByIndexAfter) + expectEqual(indicesByFormIndexBefore, indicesByIndexAfter) + + // Check contents using indexing. + let indexContents1 = indicesByIndexBefore.map { collection[$0] } + expectEquivalentElements( + indexContents1, expectedContents, + by: areEquivalent, + "\(expectedContents)") + let indexContents2 = indicesByFormIndexBefore.map { collection[$0] } + expectEquivalentElements( + indexContents2, expectedContents, + by: areEquivalent, + "\(expectedContents)") + + // Check the Indices associated type + if C.self != C.Indices.self { + checkBidirectionalCollection(collection.indices, expectedContents: indicesByIndexAfter) + } + + var allIndices = indicesByIndexAfter + allIndices.append(collection.endIndex) + + // Check `index(_,offsetBy:)` + for (startOffset, start) in allIndices.enumerated() { + for endOffset in 0 ..< allIndices.count { + let end = collection.index(start, offsetBy: endOffset - startOffset) + expectEqual(end, allIndices[endOffset]) + if endOffset < expectedContents.count { + expectEquivalent( + collection[end], expectedContents[endOffset], + by: areEquivalent) + } + } + } + + // Check `distance(from:to:)` + for i in allIndices.indices { + for j in allIndices.indices { + let d = collection.distance(from: allIndices[i], to: allIndices[j]) + expectEqual(d, j - i) + } + } + + // Check slicing. + for i in 0 ..< allIndices.count { + for j in i ..< allIndices.count { + let range = allIndices[i] ..< allIndices[j] + let slice = collection[range] + expectEqualElements(slice._indicesByIndexBefore(), allIndices[i ..< j]) + expectEqualElements(slice._indicesByFormIndexBefore(), allIndices[i ..< j]) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckCollection.swift new file mode 100644 index 00000000..8f5588b3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckCollection.swift @@ -0,0 +1,270 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +// FIXME: Port all of the collection validation tests from the Swift compiler codebase. + +import XCTest + +// FIXME: Port the collection validation tests from the Swift compiler codebase. + +extension Sequence { + func _contentsByIterator() -> [Element] { + var result: [Element] = [] + var it = makeIterator() + while let item = it.next() { + result.append(item) + } + return result + } + + func _contentsByCopyContents(_ count: Int? = nil) -> [Element] { + var it: Iterator? + var result = Array( + unsafeUninitializedCapacity: count ?? self.underestimatedCount + ) { buffer, count in + (it, count) = self._copyContents(initializing: buffer) + } + while let next = it!.next() { + result.append(next) + } + return result + } +} + +extension Collection { + func _indicesByIndexAfter() -> [Index] { + var result: [Index] = [] + var i = startIndex + while i != endIndex { + result.append(i) + i = index(after: i) + } + return result + } + + func _indicesByFormIndexAfter() -> [Index] { + var result: [Index] = [] + var i = startIndex + while i != endIndex { + result.append(i) + formIndex(after: &i) + } + return result + } +} + +public func checkCollection( + _ collection: C, + expectedContents: Expected, + file: StaticString = #file, + line: UInt = #line +) where C.Element: Equatable, Expected.Element == C.Element { + let expectedContents = Array(expectedContents) + + checkCollection( + collection, + expectedContents: expectedContents, + by: ==, + file: file, line: line) + + let indicesByIndexAfter = collection._indicesByIndexAfter() + for item in expectedContents { + if let first = collection._customIndexOfEquatableElement(item) { + expectNotNil(first) { first in + expectEqual(collection[first], item) + let expected = expectedContents.firstIndex(of: item)! + expectEqual(first, indicesByIndexAfter[expected]) + } + } + if let last = collection._customLastIndexOfEquatableElement(item) { + expectNotNil(last) { last in + expectEqual(collection[last], item) + let expected = expectedContents.lastIndex(of: item)! + expectEqual(last, indicesByIndexAfter[expected]) + } + } + } +} + +public func checkCollection( + _ collection: C, + expectedContents: Expected, + by areEquivalent: (C.Element, C.Element) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where Expected.Element == C.Element { + checkSequence( + { collection }, + expectedContents: expectedContents, + by: areEquivalent, + file: file, line: line) + _checkCollection( + collection, + expectedContents: expectedContents, + by: areEquivalent, + file: file, line: line) +} + +public func _checkCollection( + _ collection: C, + expectedContents: Expected, + by areEquivalent: (C.Element, C.Element) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where Expected.Element == C.Element { + let entry = TestContext.current.push("checkCollection", file: file, line: line) + defer { TestContext.current.pop(entry) } + + let expectedContents = Array(expectedContents) + expectEqual(collection.isEmpty, expectedContents.isEmpty) + expectEqual(collection.count, expectedContents.count) + + // Check that `index(after:)` produces the same results as `formIndex(after:)` + let indicesByIndexAfter = collection._indicesByIndexAfter() + let indicesByFormIndexAfter = collection._indicesByFormIndexAfter() + expectEqual(indicesByIndexAfter, indicesByFormIndexAfter) + + // Check contents using the iterator. + expectEquivalentElements( + collection._contentsByIterator(), + expectedContents, + by: areEquivalent) + + // Check _copyContents. + expectEquivalentElements( + collection._contentsByCopyContents(), + expectedContents, + by: areEquivalent) + + // Check contents using indexing. + let indexContents1 = indicesByIndexAfter.map { collection[$0] } + expectEquivalentElements(indexContents1, expectedContents, by: areEquivalent) + let indexContents2 = indicesByFormIndexAfter.map { collection[$0] } + expectEquivalentElements(indexContents2, expectedContents, by: areEquivalent) + + // Check the endIndex. + expectEqual(collection.endIndex, collection.indices.endIndex) + + // Check the Indices associated type + if C.self != C.Indices.self { + checkCollection(collection.indices, expectedContents: indicesByIndexAfter) + } else { + expectEqual(collection.indices.count, collection.count) + expectEqualElements(collection.indices, indicesByIndexAfter) + } + expectEqual(collection.indices.endIndex, collection.endIndex) + + // The sequence of indices must be monotonically increasing. + var allIndices = indicesByIndexAfter + allIndices.append(collection.endIndex) + checkComparable(allIndices, oracle: { .comparing($0, $1) }) + + // Check `index(_,offsetBy:)` + for (offset, start) in allIndices.enumerated() { + for distance in 0 ... indicesByIndexAfter.count - offset { + let end = collection.index(start, offsetBy: distance) + expectEqual(end, allIndices[offset + distance]) + if offset + distance < expectedContents.count { + expectEquivalent(collection[end], expectedContents[offset + distance], + by: areEquivalent) + } + } + } + + // Check `index(_,offsetBy:limitedBy:)` + let limits = + Set([0, allIndices.count - 1, allIndices.count / 2]) + .sorted() + withEvery("limit", in: limits) { limit in + withEvery("i", in: 0 ..< allIndices.count) { i in + let max = allIndices.count - i + (limit >= i ? 2 : 0) + withEvery("delta", in: 0 ..< max) { delta in + let actual = collection.index( + allIndices[i], + offsetBy: delta, + limitedBy: allIndices[limit]) + let j = i + delta + let expected = i > limit || j <= limit ? allIndices[j] : nil + expectEqual(actual, expected) + } + } + } + + // Check `distance(from:to:)` + withEvery("i", in: allIndices.indices) { i in + withEvery("j", in: allIndices.indices[i...]) { j in + let d = collection.distance(from: allIndices[i], to: allIndices[j]) + expectEqual(d, j - i) + } + } + + // Check slicing. + withEvery("i", in: 0 ..< allIndices.count) { i in + withEvery("j", in: i ..< allIndices.count) { j in + let range = allIndices[i] ..< allIndices[j] + let slice = collection[range] + expectEqual(slice.count, j - i) + expectEqual(slice.isEmpty, i == j) + expectEqual(slice.startIndex, allIndices[i]) + expectEqual(slice.endIndex, allIndices[j]) + expectEqual(slice.distance(from: allIndices[i], to: allIndices[j]), j - i) + expectEqual(slice.index(allIndices[i], offsetBy: j - i), allIndices[j]) + + expectEqual(slice.index(allIndices[i], offsetBy: j - i, limitedBy: allIndices[j]), + allIndices[j]) + expectEqual(slice.index(allIndices[i], offsetBy: j - i, limitedBy: allIndices[i]), + j - i > 0 ? nil : allIndices[i]) + expectEqual(slice.index(allIndices[i], offsetBy: j - i, limitedBy: allIndices[0]), + i > 0 || j == 0 ? allIndices[j] : nil) + + expectEquivalentElements(slice, expectedContents[i ..< j], + by: areEquivalent) + + expectEquivalentElements( + slice._contentsByIterator(), expectedContents[i ..< j], + by: areEquivalent) + expectEquivalentElements( + slice._contentsByCopyContents(), expectedContents[i ..< j], + by: areEquivalent) + + // Check _copyContents. + let copyContents = collection._contentsByCopyContents() + expectEquivalentElements( + copyContents, expectedContents, + by: areEquivalent) + + expectEqualElements(slice._indicesByIndexAfter(), allIndices[i ..< j]) + expectEqualElements(slice._indicesByFormIndexAfter(), allIndices[i ..< j]) + expectEqualElements(slice.indices, allIndices[i ..< j]) + expectEqualElements(slice.indices._indicesByIndexAfter(), allIndices[i ..< j]) + expectEqualElements(slice.indices._indicesByFormIndexAfter(), allIndices[i ..< j]) + // Check the subsequence iterator. + expectEquivalentElements( + slice, expectedContents[i ..< j], + by: areEquivalent) + // Check the subsequence subscript. + expectEquivalentElements( + allIndices[i ..< j].map { slice[$0] }, expectedContents[i ..< j], + by: areEquivalent) + // Check _copyToContiguousArray. + expectEquivalentElements( + Array(slice), expectedContents[i ..< j], + by: areEquivalent) + // Check slicing of slices. + expectEquivalentElements( + slice[range], expectedContents[i ..< j], + by: areEquivalent) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckComparable.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckComparable.swift new file mode 100644 index 00000000..5067b35e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckComparable.swift @@ -0,0 +1,176 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibUnittest + +public enum ExpectedComparisonResult: Hashable { + case lt, eq, gt + + public func flip() -> ExpectedComparisonResult { + switch self { + case .lt: + return .gt + case .eq: + return .eq + case .gt: + return .lt + } + } + + public static func comparing(_ left: C, _ right: C) -> Self { + left < right ? .lt + : left > right ? .gt + : .eq + } +} + +extension ExpectedComparisonResult: CustomStringConvertible { + public var description: String { + switch self { + case .lt: + return "<" + case .eq: + return "==" + case .gt: + return ">" + } + } +} + +public func checkComparable( + sortedEquivalenceClasses: [[Instance]], + file: StaticString = #file, line: UInt = #line +) { + let instances = sortedEquivalenceClasses.flatMap { $0 } + // oracle[i] is the index of the equivalence class that contains instances[i]. + let oracle = sortedEquivalenceClasses.indices.flatMap { i in repeatElement(i, count: sortedEquivalenceClasses[i].count) } + checkComparable( + instances, + oracle: { + if oracle[$0] < oracle[$1] { return .lt } + if oracle[$0] > oracle[$1] { return .gt } + return .eq + }, + file: file, line: line) +} + +/// Test that the elements of `instances` satisfy the semantic +/// requirements of `Comparable`, using `oracle` to generate comparison +/// expectations from pairs of positions in `instances`. +public func checkComparable( + _ instances: Instances, + oracle: (Instances.Index, Instances.Index) -> ExpectedComparisonResult, + file: StaticString = #file, line: UInt = #line +) where Instances.Element: Comparable { + checkEquatable(instances, + oracle: { oracle($0, $1) == .eq }, + file: file, line: line) + _checkComparable(instances, oracle: oracle, file: file, line: line) +} + +public func checkComparable( + expected: ExpectedComparisonResult, _ lhs: T, _ rhs: T, + file: StaticString = #file, line: UInt = #line +) { + checkComparable( + [lhs, rhs], + oracle: { [[ .eq, expected], [ expected.flip(), .eq]][$0][$1] }, + file: file, line: line) +} + +/// Same as `checkComparable(_:oracle:file:line:)` but doesn't check +/// `Equatable` conformance. Useful for preventing duplicate testing. +public func _checkComparable( + _ instances: Instances, + oracle: (Instances.Index, Instances.Index) -> ExpectedComparisonResult, + file: StaticString = #file, line: UInt = #line +) where Instances.Element: Comparable { + let entry = TestContext.current.push("checkComparable", file: file, line: line) + defer { TestContext.current.pop(entry) } + for i in instances.indices { + let x = instances[i] + + expectFalse( + x < x, + "found 'x < x' at index \(i): \(String(reflecting: x))") + + expectFalse( + x > x, + "found 'x > x' at index \(i): \(String(reflecting: x))") + + expectTrue(x <= x, + "found 'x <= x' to be false at index \(i): \(String(reflecting: x))") + + expectTrue(x >= x, + "found 'x >= x' to be false at index \(i): \(String(reflecting: x))") + + for j in instances.indices where i != j { + let y = instances[j] + + let expected = oracle(i, j) + + expectEqual( + expected.flip(), oracle(j, i), + """ + bad oracle: missing antisymmetry: + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + expectEqual( + expected == .lt, x < y, + """ + x < y doesn't match oracle + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + expectEqual( + expected != .gt, x <= y, + """ + x <= y doesn't match oracle + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + expectEqual( + expected != .lt, x >= y, + """ + x >= y doesn't match oracle + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + expectEqual( + expected == .gt, x > y, + """ + x > y doesn't match oracle + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + for k in instances.indices { + let expected2 = oracle(j, k) + if expected == expected2 { + expectEqual( + expected, oracle(i, k), + """ + bad oracle: transitivity violation + x (at index \(i)): \(String(reflecting: x)) + y (at index \(j)): \(String(reflecting: y)) + z (at index \(k)): \(String(reflecting: instances[k])) + """) + } + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckEquatable.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckEquatable.swift new file mode 100644 index 00000000..1b58b2e6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckEquatable.swift @@ -0,0 +1,116 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibUnittest + +public func checkEquatable( + equivalenceClasses: [[Instance]], + file: StaticString = #file, + line: UInt = #line +) { + let instances = equivalenceClasses.flatMap { $0 } + let oracle = equivalenceClasses.indices.flatMap { i in repeatElement(i, count: equivalenceClasses[i].count) } + checkEquatable(instances, oracle: { oracle[$0] == oracle[$1] }, file: file, line: line) +} + +public func checkEquatable( + _ instances: C, + oracle: (C.Index, C.Index) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where C.Element: Equatable { + let indices = Array(instances.indices) + checkEquatable( + Array(instances), + oracle: { oracle(indices[$0], indices[$1]) }, + file: file, line: line) +} + +public func checkEquatable( + expectedEqual: Bool, _ lhs: T, _ rhs: T, + file: StaticString = #file, line: UInt = #line +) { + checkEquatable( + [lhs, rhs], + oracle: { expectedEqual || $0 == $1 }, + file: file, line: line) +} + +public func checkEquatable( + _ instances: [Instance], + oracle: (Int, Int) -> Bool, + file: StaticString = #file, + line: UInt = #line +) { + let entry = TestContext.current.push("checkEquatable", file: file, line: line) + defer { TestContext.current.pop(entry) } + // For each index (which corresponds to an instance being tested) track the + // set of equal instances. + var transitivityScoreboard: [Box>] = instances.map { _ in Box([]) } + + for i in instances.indices { + let x = instances[i] + expectTrue(oracle(i, i), + "bad oracle: broken reflexivity at index \(i)") + + for j in instances.indices { + let y = instances[j] + + let expectedXY = oracle(i, j) + expectEqual(oracle(j, i), expectedXY, + "bad oracle: broken symmetry between indices \(i), \(j)") + + let actualXY = (x == y) + expectEqual( + actualXY, expectedXY, + """ + Elements \((expectedXY + ? "expected equal, found not equal" + : "expected not equal, found equal")): + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + // Not-equal is an inverse of equal. + expectNotEqual( + x != y, actualXY, + """ + `!=` returns the same result as `==`: + lhs (at index \(i)): \(String(reflecting: x)) + rhs (at index \(j)): \(String(reflecting: y)) + """) + + // Check transitivity of the predicate represented by the oracle. + // If we are adding the instance `j` into an equivalence set, check that + // it is equal to every other instance in the set. + if expectedXY && i < j && transitivityScoreboard[i].value.insert(j).inserted { + if transitivityScoreboard[i].value.count == 1 { + transitivityScoreboard[i].value.insert(i) + } + for k in transitivityScoreboard[i].value { + expectTrue( + oracle(j, k), + """ + bad oracle: transitivity violation + x (at index \(i)): \(String(reflecting: x)) + y (at index \(j)): \(String(reflecting: y)) + z (at index \(k)): \(String(reflecting: instances[k])) + """) + // No need to check equality between actual values, we will check + // them with the checks above. + } + precondition(transitivityScoreboard[j].value.isEmpty) + transitivityScoreboard[j] = transitivityScoreboard[i] + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckHashable.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckHashable.swift new file mode 100644 index 00000000..e6942c0d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckHashable.swift @@ -0,0 +1,124 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibUnittest + +/// Produce an integer hash value for `value` by feeding it to a dedicated +/// `Hasher`. This is always done by calling the `hash(into:)` method. +/// If a non-nil `seed` is given, it is used to perturb the hasher state; +/// this is useful for resolving accidental hash collisions. +private func _hash(_ value: H, seed: Int? = nil) -> Int { + var hasher = Hasher() + if let seed = seed { + hasher.combine(seed) + } + hasher.combine(value) + return hasher.finalize() +} + +/// Test that the elements of `equivalenceClasses` consist of instances that +/// satisfy the semantic requirements of `Hashable`, with each group defining +/// a distinct equivalence class under `==`. +public func checkHashable( + equivalenceClasses: [[Instance]], + file: StaticString = #file, line: UInt = #line +) { + let instances = equivalenceClasses.flatMap { $0 } + // oracle[i] is the index of the equivalence class that contains instances[i]. + let oracle = equivalenceClasses.indices.flatMap { i in repeatElement(i, count: equivalenceClasses[i].count) } + checkHashable( + instances, + equalityOracle: { oracle[$0] == oracle[$1] }, + file: file, line: line) +} + +public func checkHashable( + expectedEqual: Bool, _ lhs: T, _ rhs: T, + file: StaticString = #file, line: UInt = #line +) { + checkHashable( + [lhs, rhs], equalityOracle: { expectedEqual || $0 == $1 }, file: file, line: line) +} + +/// Test that the elements of `instances` satisfy the semantic requirements of +/// `Hashable`, using `equalityOracle` to generate equality and hashing +/// expectations from pairs of positions in `instances`. +public func checkHashable( + _ instances: Instances, + equalityOracle: (Instances.Index, Instances.Index) -> Bool, + file: StaticString = #file, line: UInt = #line +) where Instances.Element: Hashable { + checkEquatable(instances, oracle: equalityOracle, file: file, line: line) + _checkHashable(instances, equalityOracle: equalityOracle, file: file, line: line) +} + +/// Same as `checkHashable(_:equalityOracle:file:line:)` but doesn't check +/// `Equatable` conformance. Useful for preventing duplicate testing. +public func _checkHashable( + _ instances: Instances, + equalityOracle: (Instances.Index, Instances.Index) -> Bool, + file: StaticString = #file, line: UInt = #line +) where Instances.Element: Hashable { + let entry = TestContext.current.push("checkHashable", file: file, line: line) + defer { TestContext.current.pop(entry) } + for i in instances.indices { + let x = instances[i] + for j in instances.indices { + let y = instances[j] + let expected = equalityOracle(i, j) + if expected { + expectEqual( + _hash(x), _hash(y), + """ + hash(into:) expected to match, found to differ: + lhs (at index \(i)): \(x) + rhs (at index \(j)): \(y) + """) + expectEqual( + x.hashValue, y.hashValue, + """ + hashValue expected to match, found to differ + lhs (at index \(i)): \(x) + rhs (at index \(j)): \(y) + """) + expectEqual( + x._rawHashValue(seed: 0), y._rawHashValue(seed: 0), + """ + _rawHashValue(seed:) expected to match, found to differ + lhs (at index \(i)): \(x) + rhs (at index \(j)): \(y) + """) + } else { + // Try a few different seeds; at least one of them should discriminate + // between the hashes. It is extremely unlikely this check will fail + // all ten attempts, unless the type's hash encoding is not unique, + // or unless the hash equality oracle is wrong. + expectTrue( + (0 ..< 10).contains { _hash(x, seed: $0) != _hash(y, seed: $0) }, + """ + hash(into:) expected to differ, found to match + lhs (at index \(i)): \(x) + rhs (at index \(j)): \(y) + """) + expectTrue( + (0 ..< 10).contains { i in + x._rawHashValue(seed: i) != y._rawHashValue(seed: i) + }, + """ + _rawHashValue(seed:) expected to differ, found to match + lhs (at index \(i)): \(x) + rhs (at index \(j)): \(y) + """) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckSequence.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckSequence.swift new file mode 100644 index 00000000..b46cba71 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/ConformanceCheckers/CheckSequence.swift @@ -0,0 +1,96 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +// FIXME: Port all of the collection validation tests from the Swift compiler codebase. + +import XCTest + +// FIXME: Port the collection validation tests from the Swift compiler codebase. + +public func checkSequence( + _ sequenceGenerator: () -> S, + expectedContents: Expected, + file: StaticString = #file, + line: UInt = #line +) where S.Element == Expected.Element, S.Element: Equatable { + checkSequence( + sequenceGenerator, + expectedContents: expectedContents, + by: ==, + file: file, + line: line) +} + +public func checkSequence( + _ sequenceGenerator: () -> S, + expectedContents: Expected, + by areEquivalent: (S.Element, S.Element) -> Bool, + file: StaticString = #file, + line: UInt = #line +) where S.Element == Expected.Element { + let entry = TestContext.current.push("checkSequence", file: file, line: line) + defer { TestContext.current.pop(entry) } + + let expectedContents = Array(expectedContents) + + do { + let seq = sequenceGenerator() + let underestimatedCount = seq.underestimatedCount + expectLessThanOrEqual(underestimatedCount, expectedContents.count) + expectGreaterThanOrEqual(underestimatedCount, 0) + } + + // Check contiguous storage. + do { + let seq = sequenceGenerator() + let r: Int? = seq.withContiguousStorageIfAvailable { buffer in + expectEquivalentElements(buffer, expectedContents, by: areEquivalent) + return 42 + } + expectTrue(r == 42 || r == nil) + } + + do { + let seq = sequenceGenerator() + var it = seq.makeIterator() + var i = 0 + while i < expectedContents.count { + expectEquivalent(it.next(), expectedContents[i], by: areEquivalent) + i += 1 + } + expectNil(it.next()) + expectNil(it.next()) + } + + do { + let seq = sequenceGenerator() + let underestimatedCount = seq.underestimatedCount + var state: (it: S.Iterator, count: Int)! + var array = Array( + unsafeUninitializedCapacity: underestimatedCount + ) { buffer, count in + state = seq._copyContents(initializing: buffer) + count = state.count + } + expectEqual(state.count, underestimatedCount) + expectEquivalentElements( + array, + expectedContents[.. { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesStartIndexCalled = ResettableValue(0) + public let timesEndIndexCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexAfterCalled = ResettableValue(0) + public let timesIndexBeforeCalled = ResettableValue(0) + public let timesSubscriptCalled = ResettableValue(0) + public let timesRangeSubscriptCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalBidirectionalCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalBidirectionalCollection: BidirectionalCollection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesStartIndexCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesEndIndexCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + // Pretend this is implemented as `startIndex == endIndex`. + timesStartIndexCalled.increment() + timesEndIndexCalled.increment() + return _core.isEmpty + } + + public var count: Int { + // Pretend this is implemented by counting elements using `index(after:)`. + let result = _core.count + timesIndexAfterCalled.increment(by: result) + return result + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexAfterCalled.increment() + return _core.index(after: i) + } + + public func index(before i: MinimalIndex) -> MinimalIndex { + timesIndexBeforeCalled.increment() + return _core.index(before: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + // Pretend this is implemented by counting elements using `index(after:)`/`index(before:). + let result = _core.distance(from: start, to: end) + if result >= 0 { + timesIndexAfterCalled.increment(by: result) + } else { + timesIndexBeforeCalled.increment(by: -result) + } + return result + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + // Pretend this is implemented by iterating elements using `index(after:)`/`index(before:)`. + if n >= 0 { + timesIndexAfterCalled.increment(by: n) + } else { + timesIndexBeforeCalled.increment(by: -n) + } + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + timesSubscriptCalled.increment() + return _core[i] + } + + public subscript(bounds: Range) -> SubSequence { + timesRangeSubscriptCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalCollection.swift new file mode 100644 index 00000000..499397e7 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalCollection.swift @@ -0,0 +1,137 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// A minimal implementation of `Collection` with extra checks. +public struct MinimalCollection { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesStartIndexCalled = ResettableValue(0) + public let timesEndIndexCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexAfterCalled = ResettableValue(0) + public let timesSubscriptCalled = ResettableValue(0) + public let timesRangeSubscriptCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalCollection: Collection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesStartIndexCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesEndIndexCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + // Pretend this is implemented as `startIndex == endIndex`. + timesStartIndexCalled.increment() + timesEndIndexCalled.increment() + return _core.isEmpty + } + + public var count: Int { + // Pretend this is implemented by counting elements using `index(after:)`. + let result = _core.count + timesIndexAfterCalled.increment(by: result) + return result + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexAfterCalled.increment() + return _core.index(after: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + // Pretend this is implemented by counting elements using `index(after:)`. + expectTrue( + start <= end, + "Only BidirectionalCollections can have end come before start", + trapping: true) + let result = _core.distance(from: start, to: end) + timesIndexAfterCalled.increment(by: result) + return result + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + // Pretend this is implemented by iterating elements using `index(after:)`. + expectTrue( + n >= 0, + "Only BidirectionalCollections can be advanced by a negative amount", + trapping: true) + timesIndexAfterCalled.increment(by: n) + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + timesSubscriptCalled.increment() + return _core[i] + } + + public subscript(bounds: Range) -> SubSequence { + timesRangeSubscriptCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalDecoder.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalDecoder.swift new file mode 100644 index 00000000..11b7aa31 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalDecoder.swift @@ -0,0 +1,756 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +public class MinimalDecoder { + public typealias Value = MinimalEncoder.Value + typealias _Key = MinimalEncoder._Key + + public private(set) var userInfo: [CodingUserInfoKey: Any] + + public init(userInfo: [CodingUserInfoKey: Any] = [:]) { + self.userInfo = userInfo + } + + public func decode(_ input: Value, as type: T.Type) throws -> T { + let decoder = Decoder(base: self, parent: nil, input: input, key: nil) + defer { + decoder.finalize() + } + return try T(from: decoder) + } + + public static func decode(_ input: Value, as type: T.Type) throws -> T { + let decoder = MinimalDecoder() + return try decoder.decode(input, as: T.self) + } +} + +protocol _MinimalDecoderContainer: AnyObject { + var base: MinimalDecoder { get } + var parent: _MinimalDecoderContainer? { get } + var key: CodingKey? { get } + var isValid: Bool { get } + func finalize() +} + +extension _MinimalDecoderContainer { + var codingPath: [CodingKey] { + expectTrue(isValid, "Container isn't valid", trapping: true) + var path: [CodingKey] = [] + var encoder: _MinimalDecoderContainer? = self + while let e = encoder { + if let key = e.key { path.append(key) } + encoder = e.parent + } + path.reverse() + return path + } + + var userInfo: [CodingUserInfoKey: Any] { + expectTrue(isValid, "Container isn't valid", trapping: true) + return base.userInfo + } +} + +extension DecodingError { + internal static func _typeMismatch( + at path: [CodingKey], + expectation: Any.Type, + reality: MinimalDecoder.Value + ) -> DecodingError { + let description = "Expected to decode \(expectation) but found `\(reality.typeDescription))`." + return .typeMismatch(expectation, Context(codingPath: path, debugDescription: description)) + } +} + +extension MinimalDecoder { + final class Decoder { + typealias Value = MinimalEncoder.Value + + unowned let base: MinimalDecoder + unowned let parent: _MinimalDecoderContainer? + let key: CodingKey? + var input: Value + var isValid = true + var pendingContainer: _MinimalDecoderContainer? + + init(base: MinimalDecoder, parent: _MinimalDecoderContainer?, input: Value, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + self.input = input + } + } +} + +extension MinimalDecoder.Decoder: _MinimalDecoderContainer { + func finalize() { + expectTrue(isValid, "Container isn't valid", trapping: true) + isValid = false + } +} + +extension MinimalDecoder.Decoder: Decoder { + func container(keyedBy type: Key.Type) throws -> KeyedDecodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(pendingContainer, "Cannot extract multiple containers", trapping: true) + guard case let .dictionary(d) = input else { + throw DecodingError._typeMismatch(at: codingPath, expectation: [String: Value].self, reality: input) + } + let keyed = MinimalDecoder.KeyedContainer(base: base, parent: parent, input: d, key: key) + pendingContainer = keyed + return .init(keyed) + } + + func unkeyedContainer() throws -> UnkeyedDecodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(pendingContainer, "Cannot extract multiple containers", trapping: true) + guard case let .array(a) = input else { + throw DecodingError._typeMismatch(at: codingPath, expectation: [Value].self, reality: input) + } + let unkeyed = MinimalDecoder.UnkeyedContainer(base: base, parent: parent, input: a, key: nil) + pendingContainer = unkeyed + return unkeyed + } + + func singleValueContainer() throws -> SingleValueDecodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(pendingContainer, "Cannot extract multiple containers", trapping: true) + let single = MinimalDecoder.SingleValueContainer(base: base, parent: parent, input: input, key: nil) + pendingContainer = single + return single + } +} + +extension MinimalDecoder { + final class KeyedContainer { + typealias Value = MinimalEncoder.Value + + unowned let base: MinimalDecoder + unowned let parent: _MinimalDecoderContainer? + let key: CodingKey? + var input: [String: Value] + var isValid = true + var pendingContainer: AnyObject? + + init(base: MinimalDecoder, parent: _MinimalDecoderContainer?, input: [String: Value], key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + self.input = input + } + + func commitPendingContainer() { + expectTrue(self.isValid, "Container isn't valid", trapping: true) + guard let c = pendingContainer else { return } + self.pendingContainer = nil + let container = c as! _MinimalDecoderContainer + container.finalize() + } + } +} + +extension MinimalDecoder.KeyedContainer: _MinimalDecoderContainer { + func finalize() { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + isValid = false + } +} + +extension MinimalDecoder.KeyedContainer: KeyedDecodingContainerProtocol { + var allKeys: [Key] { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + return input.keys.compactMap { Key(stringValue: $0) } + } + + func contains(_ key: Key) -> Bool { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + return input[key.stringValue] != nil + } + + func _decode(key: Key) throws -> Value { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + guard let value = input[key.stringValue] else { + let context = DecodingError.Context( + codingPath: codingPath + [key], + debugDescription: "Key not found (\"\(key.stringValue)\")") + throw DecodingError.keyNotFound(key, context) + } + return value + } + + func _decode(_ type: T.Type, forKey key: Key, _ extract: (Value) -> T?) throws -> T { + let value = try _decode(key: key) + guard let v = extract(value) else { + throw DecodingError._typeMismatch(at: codingPath + [key], expectation: T.self, reality: value) + } + return v + } + + func decodeNil(forKey key: Key) throws -> Bool { + let value = try _decode(key: key) + return value == .null + } + + func decode(_ type: Bool.Type, forKey key: Key) throws -> Bool { + try _decode(type, forKey: key) { input in + guard case let .bool(v) = input else { return nil } + return v + } + } + + func decode(_ type: Int.Type, forKey key: Key) throws -> Int { + try _decode(type, forKey: key) { input in + guard case let .int(v) = input else { return nil } + return v + } + } + + func decode(_ type: Int8.Type, forKey key: Key) throws -> Int8 { + try _decode(type, forKey: key) { input in + guard case let .int8(v) = input else { return nil } + return v + } + } + + func decode(_ type: Int16.Type, forKey key: Key) throws -> Int16 { + try _decode(type, forKey: key) { input in + guard case let .int16(v) = input else { return nil } + return v + } + } + + func decode(_ type: Int32.Type, forKey key: Key) throws -> Int32 { + try _decode(type, forKey: key) { input in + guard case let .int32(v) = input else { return nil } + return v + } + } + + func decode(_ type: Int64.Type, forKey key: Key) throws -> Int64 { + try _decode(type, forKey: key) { input in + guard case let .int64(v) = input else { return nil } + return v + } + } + + func decode(_ type: UInt.Type, forKey key: Key) throws -> UInt { + try _decode(type, forKey: key) { input in + guard case let .uint(v) = input else { return nil } + return v + } + } + + func decode(_ type: UInt8.Type, forKey key: Key) throws -> UInt8 { + try _decode(type, forKey: key) { input in + guard case let .uint8(v) = input else { return nil } + return v + } + } + + func decode(_ type: UInt16.Type, forKey key: Key) throws -> UInt16 { + try _decode(type, forKey: key) { input in + guard case let .uint16(v) = input else { return nil } + return v + } + } + + func decode(_ type: UInt32.Type, forKey key: Key) throws -> UInt32 { + try _decode(type, forKey: key) { input in + guard case let .uint32(v) = input else { return nil } + return v + } + } + + func decode(_ type: UInt64.Type, forKey key: Key) throws -> UInt64 { + try _decode(type, forKey: key) { input in + guard case let .uint64(v) = input else { return nil } + return v + } + } + + func decode(_ type: String.Type, forKey key: Key) throws -> String { + try _decode(type, forKey: key) { input in + guard case let .string(v) = input else { return nil } + return v + } + } + + func decode(_ type: Double.Type, forKey key: Key) throws -> Double { + try _decode(type, forKey: key) { input in + guard case let .double(v) = input else { return nil } + return v + } + } + + func decode(_ type: Float.Type, forKey key: Key) throws -> Float { + try _decode(type, forKey: key) { input in + guard case let .float(v) = input else { return nil } + return v + } + } + + func decode(_ type: T.Type, forKey key: Key) throws -> T { + let value = try _decode(key: key) + let decoder = MinimalDecoder.Decoder(base: base, parent: self, input: value, key: key) + pendingContainer = decoder + defer { + expectIdentical(pendingContainer, decoder, trapping: true) + commitPendingContainer() + } + return try T(from: decoder) + } + + func nestedContainer( + keyedBy type: NestedKey.Type, + forKey key: Key + ) throws -> KeyedDecodingContainer { + let value = try _decode(key: key) + guard case let .dictionary(v) = value else { + throw DecodingError._typeMismatch(at: codingPath + [key], + expectation: [String: Value].self, + reality: value) + } + let nested = MinimalDecoder.KeyedContainer(base: base, parent: self, input: v, key: key) + pendingContainer = nested + return .init(nested) + } + + func nestedUnkeyedContainer(forKey key: Key) throws -> UnkeyedDecodingContainer { + let value = try _decode(key: key) + guard case let .array(v) = value else { + throw DecodingError._typeMismatch(at: codingPath + [key], + expectation: [String: Value].self, + reality: value) + } + let nested = MinimalDecoder.UnkeyedContainer(base: base, parent: self, input: v, key: key) + pendingContainer = nested + return nested + } + + func superDecoder() throws -> Decoder { + let value = try _decode(key: MinimalDecoder._Key.super) + let nested = MinimalDecoder.Decoder(base: base, parent: self, input: value, key: key) + pendingContainer = nested + return nested + } + + func superDecoder(forKey key: Key) throws -> Decoder { + let value = try _decode(key: key) + let nested = MinimalDecoder.Decoder(base: base, parent: self, input: value, key: key) + pendingContainer = nested + return nested + } +} + +extension MinimalDecoder { + class UnkeyedContainer { + typealias Value = MinimalEncoder.Value + + unowned let base: MinimalDecoder + unowned let parent: _MinimalDecoderContainer? + let key: CodingKey? + var input: [Value] + var isValid = true + var pendingContainer: AnyObject? + var index: Int = 0 + + init(base: MinimalDecoder, parent: _MinimalDecoderContainer?, input: [Value], key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + self.input = input + } + + func commitPendingContainer() { + expectTrue(self.isValid, "Container isn't valid", trapping: true) + guard let c = pendingContainer else { return } + self.pendingContainer = nil + let container = c as! _MinimalDecoderContainer + container.finalize() + } + } +} + +extension MinimalDecoder.UnkeyedContainer: _MinimalDecoderContainer { + func finalize() { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + isValid = false + } +} + +extension MinimalDecoder.UnkeyedContainer: UnkeyedDecodingContainer { + typealias _Key = MinimalDecoder._Key + + var count: Int? { + expectTrue(isValid, "Container isn't valid", trapping: true) + return input.count + } + + var isAtEnd: Bool { + expectTrue(isValid, "Container isn't valid", trapping: true) + return index == input.count + } + + var currentIndex: Int { + expectTrue(isValid, "Container isn't valid", trapping: true) + return index + } + + func _decodeNext(_ type: T.Type) throws -> Value { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + guard index < input.count else { + let context = DecodingError.Context( + codingPath: codingPath + [_Key(index)], + debugDescription: "Unkeyed container is at end") + throw DecodingError.valueNotFound(T.self, context) + } + let value = input[index] + index += 1 + return value + } + + func _decodeNext(_ type: T.Type = T.self, _ extract: (Value) -> T?) throws -> T { + let value = try _decodeNext(type) + guard let v = extract(value) else { + throw DecodingError._typeMismatch(at: codingPath + [_Key(index - 1)], + expectation: T.self, + reality: value) + } + return v + } + + + func decodeNil() throws -> Bool { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + guard index < input.count else { + let context = DecodingError.Context( + codingPath: codingPath + [_Key(index)], + debugDescription: "Unkeyed container is at end") + throw DecodingError.valueNotFound(Any?.self, context) + } + let value = input[index] + guard value == .null else { return false } + index += 1 + return true + } + + func decode(_ type: Bool.Type) throws -> Bool { + try _decodeNext() { value in + guard case let .bool(v) = value else { return nil } + return v + } + } + + func decode(_ type: Float.Type) throws -> Float { + try _decodeNext() { value in + guard case let .float(v) = value else { return nil } + return v + } + } + + func decode(_ type: Double.Type) throws -> Double { + try _decodeNext() { value in + guard case let .double(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int.Type) throws -> Int { + try _decodeNext() { value in + guard case let .int(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int8.Type) throws -> Int8 { + try _decodeNext() { value in + guard case let .int8(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int16.Type) throws -> Int16 { + try _decodeNext() { value in + guard case let .int16(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int32.Type) throws -> Int32 { + try _decodeNext() { value in + guard case let .int32(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int64.Type) throws -> Int64 { + try _decodeNext() { value in + guard case let .int64(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt.Type) throws -> UInt { + try _decodeNext() { value in + guard case let .uint(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt8.Type) throws -> UInt8 { + try _decodeNext() { value in + guard case let .uint8(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt16.Type) throws -> UInt16 { + try _decodeNext() { value in + guard case let .uint16(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt32.Type) throws -> UInt32 { + try _decodeNext() { value in + guard case let .uint32(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt64.Type) throws -> UInt64 { + try _decodeNext() { value in + guard case let .uint64(v) = value else { return nil } + return v + } + } + + func decode(_ type: String.Type) throws -> String { + try _decodeNext() { value in + guard case let .string(v) = value else { return nil } + return v + } + } + + func decode(_ type: T.Type) throws -> T { + let key = _Key(index) + let value = try _decodeNext(T.self) + let decoder = MinimalDecoder.Decoder(base: base, parent: self, input: value, key: key) + pendingContainer = decoder + defer { + expectIdentical(pendingContainer, decoder, trapping: true) + commitPendingContainer() + } + return try T(from: decoder) + } + + func nestedContainer( + keyedBy type: NestedKey.Type + ) throws -> KeyedDecodingContainer { + let key = _Key(index) + let value = try _decodeNext([String: Value].self) + guard case let .dictionary(v) = value else { + throw DecodingError._typeMismatch(at: codingPath + [key], + expectation: [String: Value].self, + reality: value) + } + let nested = MinimalDecoder.KeyedContainer(base: base, parent: parent, input: v, key: key) + pendingContainer = nested + return .init(nested) + } + + func nestedUnkeyedContainer() throws -> UnkeyedDecodingContainer { + let key = _Key(index) + let value = try _decodeNext([Value].self) + guard case let .array(v) = value else { + throw DecodingError._typeMismatch(at: codingPath + [key], + expectation: [Value].self, + reality: value) + } + let nested = MinimalDecoder.UnkeyedContainer(base: base, parent: parent, input: v, key: key) + pendingContainer = nested + return nested + } + + func superDecoder() throws -> Decoder { + let key = _Key(index) + let value = try _decodeNext(Any.self) + let nested = MinimalDecoder.Decoder(base: base, parent: self, input: value, key: key) + pendingContainer = nested + return nested + } +} + +extension MinimalDecoder { + class SingleValueContainer { + typealias Value = MinimalEncoder.Value + + unowned let base: MinimalDecoder + unowned let parent: _MinimalDecoderContainer? + let key: CodingKey? + var input: Value + var isValid = true + var done = false + + init(base: MinimalDecoder, parent: _MinimalDecoderContainer?, input: Value, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + self.input = input + } + } +} + +extension MinimalDecoder.SingleValueContainer: _MinimalDecoderContainer { + func finalize() { + expectTrue(isValid, "Container isn't valid") + isValid = false + } +} + +extension MinimalDecoder.SingleValueContainer: SingleValueDecodingContainer { + func _decodeNext(_ type: T.Type = T.self, _ extract: (Value) -> T?) throws -> T { + expectTrue(isValid, "Container isn't valid") + expectFalse(done, "Cannot decode multiple values from a single-value container") + guard let v = extract(input) else { + throw DecodingError._typeMismatch(at: codingPath, + expectation: T.self, + reality: input) + } + done = true + return v + } + + func decodeNil() -> Bool { + expectTrue(isValid, "Container isn't valid") + expectFalse(done, "Cannot decode multiple values from a single-value container") + guard input == .null else { return false } + done = true + return true + } + + func decode(_ type: Bool.Type) throws -> Bool { + try _decodeNext { value in + guard case let .bool(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int.Type) throws -> Int { + try _decodeNext { value in + guard case let .int(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int8.Type) throws -> Int8 { + try _decodeNext { value in + guard case let .int8(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int16.Type) throws -> Int16 { + try _decodeNext { value in + guard case let .int16(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int32.Type) throws -> Int32 { + try _decodeNext { value in + guard case let .int32(v) = value else { return nil } + return v + } + } + + func decode(_ type: Int64.Type) throws -> Int64 { + try _decodeNext { value in + guard case let .int64(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt.Type) throws -> UInt { + try _decodeNext { value in + guard case let .uint(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt8.Type) throws -> UInt8 { + try _decodeNext { value in + guard case let .uint8(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt16.Type) throws -> UInt16 { + try _decodeNext { value in + guard case let .uint16(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt32.Type) throws -> UInt32 { + try _decodeNext { value in + guard case let .uint32(v) = value else { return nil } + return v + } + } + + func decode(_ type: UInt64.Type) throws -> UInt64 { + try _decodeNext { value in + guard case let .uint64(v) = value else { return nil } + return v + } + } + + func decode(_ type: Float.Type) throws -> Float { + try _decodeNext { value in + guard case let .float(v) = value else { return nil } + return v + } + } + + func decode(_ type: Double.Type) throws -> Double { + try _decodeNext { value in + guard case let .double(v) = value else { return nil } + return v + } + } + + func decode(_ type: String.Type) throws -> String { + try _decodeNext { value in + guard case let .string(v) = value else { return nil } + return v + } + } + + func decode(_ type: T.Type) throws -> T { + expectTrue(isValid, "Container isn't valid") + expectFalse(done, "Cannot decode multiple values from a single-value container") + let decoder = MinimalDecoder.Decoder(base: base, parent: self, input: input, key: nil) + defer { + done = true + decoder.finalize() + } + return try T(from: decoder) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalEncoder.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalEncoder.swift new file mode 100644 index 00000000..d48061a6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalEncoder.swift @@ -0,0 +1,716 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +/// A Plist-style encoder that attempts to enforce a strict interpretation of +/// the `Encodable` protocol requirements. The encoded value is of an enum type +/// that exactly reflects the values encoded, allowing easy matching of +/// actual vs expected outputs. +/// +/// This encoder verifies that `encoder(to:)` implementations do not keep +/// containers alive beyond their expected lifetime. +/// +/// FIXME: Fix error reporting. We ought to throw errors instead of trapping +/// on validation problems, and we should include context information to help +/// isolating the problem. +public class MinimalEncoder { + public enum Value: Hashable { + case null + case bool(Bool) + case int(Int) + case int8(Int8) + case int16(Int16) + case int32(Int32) + case int64(Int64) + case uint(UInt) + case uint8(UInt8) + case uint16(UInt16) + case uint32(UInt32) + case uint64(UInt64) + case float(Float) + case double(Double) + case string(String) + case array([Value]) + case dictionary([String: Value]) + } + + var userInfo: [CodingUserInfoKey: Any] + + public init(userInfo: [CodingUserInfoKey: Any] = [:]) { + self.userInfo = userInfo + } + + public func encode(_ value: T) throws -> Value { + let encoder = Encoder(base: self, parent: nil, key: nil) + return try encoder._encode(value, key: nil) + } + + public static func encode(_ value: T) throws -> Value { + let base = MinimalEncoder() + return try base.encode(value) + } +} + +extension MinimalEncoder { + struct _Key: CodingKey { + var stringValue: String + var intValue: Int? + + static let `super` = Self("super") + + init(_ string: String) { + self.stringValue = string + self.intValue = nil + } + + init(_ index: Int) { + self.stringValue = "Index \(index)" + self.intValue = index + } + + init?(stringValue: String) { + self.init(stringValue) + } + + init?(intValue: Int) { + self.init(intValue) + } + } +} + +extension MinimalEncoder.Value: CustomStringConvertible { + func _description(prefix: String, indent: String) -> String { + switch self { + case .null: return ".null" + case .bool(let v): return ".bool(\(v))" + case .int(let v): return ".int(\(v))" + case .int8(let v): return ".int8(\(v))" + case .int16(let v): return ".int16(\(v))" + case .int32(let v): return ".int32(\(v))" + case .int64(let v): return ".int64(\(v))" + case .uint(let v): return ".uint(\(v))" + case .uint8(let v): return ".uint8(\(v))" + case .uint16(let v): return ".uint16(\(v))" + case .uint32(let v): return ".uint32(\(v))" + case .uint64(let v): return ".uint64(\(v))" + case .float(let v): return ".float(\(v))" + case .double(let v): return ".double(\(v))" + case .string(let v): return ".string(\(String(reflecting: v)))" + case .array(let value): + if value.count == 0 { return ".array([])" } + var result = ".array([\n" + for v in value { + result += prefix + result += indent + result += v._description(prefix: prefix + indent, indent: indent) + result += ",\n" + } + result += prefix + "])" + return result + case .dictionary(let value): + if value.count == 0 { return ".dictionary([:])" } + var result = ".dictionary([\n" + for (k, v) in value.sorted(by: { $0.key < $1.key }) { + result += prefix + result += indent + result += String(reflecting: k) + result += ": " + result += v._description(prefix: prefix + indent, indent: indent) + result += ",\n" + } + result += prefix + "])" + return result + } + } + + public var description: String { + self._description(prefix: "", indent: " ") + } +} + +extension MinimalDecoder.Value { + public var typeDescription: String { + switch self { + case .null: return ".null" + case .bool(_): return ".bool" + case .int(_): return ".int" + case .int8(_): return ".int8" + case .int16(_): return ".int16" + case .int32(_): return ".int32" + case .int64(_): return ".int64" + case .uint(_): return ".uint" + case .uint8(_): return ".uint8" + case .uint16(_): return ".uint16" + case .uint32(_): return ".uint32" + case .uint64(_): return ".uint64" + case .float(_): return ".float" + case .double(_): return ".double" + case .string(_): return ".string" + case .array(_): return ".array" + case .dictionary(_): return ".dictionary" + } + } +} + +protocol _MinimalEncoderContainer: AnyObject { + var base: MinimalEncoder { get } + var parent: _MinimalEncoderContainer? { get } + var key: CodingKey? { get } + var isValid: Bool { get } + func finalize() -> MinimalEncoder.Value? +} + +extension _MinimalEncoderContainer { + var codingPath: [CodingKey] { + expectTrue(isValid, "Container isn't valid", trapping: true) + var path: [CodingKey] = [] + var encoder: _MinimalEncoderContainer? = self + while let e = encoder { + if let key = e.key { path.append(key) } + encoder = e.parent + } + path.reverse() + return path + } + + func _encode(_ value: T, key: CodingKey?) throws -> MinimalEncoder.Value { + expectTrue(isValid, "Container isn't valid", trapping: true) + var encoder = MinimalEncoder.Encoder(base: base, parent: self, key: key) + try value.encode(to: encoder) + expectTrue(isKnownUniquelyReferenced(&encoder), "\(T.self).encode(to:) retained its encoder", trapping: true) + guard let result = encoder.finalize() else { + preconditionFailure("\(T.self).encode(to:) failed to encode anything") + } + return result + } +} + +extension MinimalEncoder { + final class Encoder { + unowned let base: MinimalEncoder + unowned let parent: _MinimalEncoderContainer? + let key: CodingKey? + var container: _MinimalEncoderContainer? + var isValid = true + + init(base: MinimalEncoder, parent: _MinimalEncoderContainer?, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + } + } +} + +extension MinimalEncoder.Encoder: _MinimalEncoderContainer { + func finalize() -> MinimalEncoder.Value? { + expectTrue(isValid, "Container isn't valid", trapping: true) + let value = container?.finalize() + isValid = false + return value + } +} + +extension MinimalEncoder.Encoder: Encoder { + var userInfo: [CodingUserInfoKey: Any] { base.userInfo } + + func container( + keyedBy type: Key.Type + ) -> KeyedEncodingContainer { + expectTrue(isValid, "Encoder isn't valid", trapping: true) + expectNil(container, "Cannot extract multiple containers", trapping: true) + let keyed = MinimalEncoder.KeyedContainer(base: base, parent: self, key: nil) + self.container = keyed + return .init(keyed) + } + + func unkeyedContainer() -> UnkeyedEncodingContainer { + expectTrue(isValid, "Encoder isn't valid", trapping: true) + expectNil(container, "Cannot extract multiple containers", trapping: true) + let unkeyed = MinimalEncoder.UnkeyedContainer(base: base, parent: self, key: nil) + self.container = unkeyed + return unkeyed + } + + func singleValueContainer() -> SingleValueEncodingContainer { + expectTrue(isValid, "Encoder isn't valid", trapping: true) + expectNil(container, "Cannot extract multiple containers", trapping: true) + let single = MinimalEncoder.SingleValueContainer(base: base, parent: self, key: nil) + self.container = single + return single + } +} + + +extension MinimalEncoder { + final class KeyedContainer { + unowned let base: MinimalEncoder + unowned let parent: _MinimalEncoderContainer? + var key: CodingKey? + var values: [String: Value] = [:] + var isValid = true + var pendingContainer: AnyObject? + + init(base: MinimalEncoder, parent: _MinimalEncoderContainer?, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + } + + func commitPendingContainer() { + expectTrue(self.isValid, "Container isn't valid", trapping: true) + guard var c = pendingContainer else { return } + self.pendingContainer = nil + expectTrue(isKnownUniquelyReferenced(&c), "Container was retained", trapping: true) + let container = c as! _MinimalEncoderContainer + let key = container.key! + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + guard let v = container.finalize() else { preconditionFailure("Container remained empty")} + values[key.stringValue] = v + } + } +} + +extension MinimalEncoder.KeyedContainer: _MinimalEncoderContainer { + func finalize() -> MinimalEncoder.Value? { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + isValid = false + return .dictionary(values) + } +} + +extension MinimalEncoder.KeyedContainer: KeyedEncodingContainerProtocol { + + func encodeNil(forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .null + } + func encode(_ value: Bool, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .bool(value) + } + func encode(_ value: Int, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .int(value) + } + func encode(_ value: Int8, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .int8(value) + } + func encode(_ value: Int16, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .int16(value) + } + func encode(_ value: Int32, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .int32(value) + } + func encode(_ value: Int64, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .int64(value) + } + func encode(_ value: UInt, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .uint(value) + } + func encode(_ value: UInt8, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .uint8(value) + } + func encode(_ value: UInt16, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .uint16(value) + } + func encode(_ value: UInt32, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .uint32(value) + } + func encode(_ value: UInt64, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .uint64(value) + } + func encode(_ value: Float, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .float(value) + } + func encode(_ value: Double, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .double(value) + } + func encode(_ value: String, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = .string(value) + } + func encode(_ value: T, forKey key: Key) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + values[key.stringValue] = try _encode(value, key: key) + } + func nestedContainer( + keyedBy keyType: NestedKey.Type, + forKey key: Key + ) -> KeyedEncodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + let keyed = MinimalEncoder.KeyedContainer(base: base, parent: self, key: key) + pendingContainer = keyed + return .init(keyed) + } + + func nestedUnkeyedContainer(forKey key: Key) -> UnkeyedEncodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key.stringValue) has already been encoded", trapping: true) + let unkeyed = MinimalEncoder.UnkeyedContainer(base: base, parent: self, key: key) + pendingContainer = unkeyed + return unkeyed + } + + func superEncoder() -> Encoder { + let key = MinimalEncoder._Key.super + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key) has already been encoded", trapping: true) + let sup = MinimalEncoder.Encoder(base: base, parent: self, key: key) + pendingContainer = sup + return sup + } + + func superEncoder(forKey key: Key) -> Encoder { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + expectNil(values[key.stringValue], "Key \(key) has already been encoded", trapping: true) + let sup = MinimalEncoder.Encoder(base: base, parent: self, key: key) + pendingContainer = sup + return sup + } +} + + +extension MinimalEncoder { + final class UnkeyedContainer { + unowned let base: MinimalEncoder + unowned let parent: _MinimalEncoderContainer? + let key: CodingKey? + var values: [Value] = [] + var isValid = true + var pendingContainer: AnyObject? + + init(base: MinimalEncoder, parent: _MinimalEncoderContainer?, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + } + + func commitPendingContainer() { + expectTrue(self.isValid, "Container isn't valid", trapping: true) + guard var c = pendingContainer else { return } + self.pendingContainer = nil + expectTrue(isKnownUniquelyReferenced(&c), "Container was retained", trapping: true) + let container = c as! _MinimalEncoderContainer + guard let v = container.finalize() else { preconditionFailure("Container remained empty")} + values.append(v) + } + } +} + +extension MinimalEncoder.UnkeyedContainer: _MinimalEncoderContainer { + func finalize() -> MinimalEncoder.Value? { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + isValid = false + return .array(values) + } +} + +extension MinimalEncoder.UnkeyedContainer: UnkeyedEncodingContainer { + var count: Int { + values.count + } + + func encodeNil() throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.null) + } + + func encode(_ value: Bool) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.bool(value)) + } + + func encode(_ value: Int) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.int(value)) + } + + func encode(_ value: Int8) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.int8(value)) + } + + func encode(_ value: Int16) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.int16(value)) + } + + func encode(_ value: Int32) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.int32(value)) + } + + func encode(_ value: Int64) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.int64(value)) + } + + func encode(_ value: UInt) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.uint(value)) + } + + func encode(_ value: UInt8) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.uint8(value)) + } + + func encode(_ value: UInt16) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.uint16(value)) + } + + func encode(_ value: UInt32) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.uint32(value)) + } + + func encode(_ value: UInt64) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.uint64(value)) + } + + func encode(_ value: Float) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.float(value)) + } + + func encode(_ value: Double) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.double(value)) + } + + func encode(_ value: String) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(.string(value)) + } + + func encode(_ value: T) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + values.append(try _encode(value, key: key)) + } + + func nestedContainer( + keyedBy keyType: NestedKey.Type + ) -> KeyedEncodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + let keyed = MinimalEncoder.KeyedContainer( + base: base, + parent: self, + key: MinimalEncoder._Key(count)) + pendingContainer = keyed + return .init(keyed) + } + + func nestedUnkeyedContainer() -> UnkeyedEncodingContainer { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + let unkeyed = MinimalEncoder.UnkeyedContainer(base: base, parent: self, key: MinimalEncoder._Key(count)) + pendingContainer = unkeyed + return unkeyed + } + + func superEncoder() -> Encoder { + expectTrue(isValid, "Container isn't valid", trapping: true) + commitPendingContainer() + let sup = MinimalEncoder.Encoder(base: base, parent: self, key: MinimalEncoder._Key(count)) + pendingContainer = sup + return sup + } +} + +extension MinimalEncoder { + final class SingleValueContainer { + unowned let base: MinimalEncoder + unowned let parent: _MinimalEncoderContainer? + let key: CodingKey? + var value: Value? + var isValid = true + + init(base: MinimalEncoder, parent: _MinimalEncoderContainer?, key: CodingKey?) { + self.base = base + self.parent = parent + self.key = key + } + } +} + +extension MinimalEncoder.SingleValueContainer: _MinimalEncoderContainer { + func finalize() -> MinimalEncoder.Value? { + expectTrue(isValid, "Container isn't valid", trapping: true) + isValid = false + return value + } +} + +extension MinimalEncoder.SingleValueContainer: SingleValueEncodingContainer { + func encodeNil() throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .null + } + + func encode(_ value: Bool) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .bool(value) + } + + func encode(_ value: Int) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .int(value) + } + + func encode(_ value: Int8) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .int8(value) + } + + func encode(_ value: Int16) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .int16(value) + } + + func encode(_ value: Int32) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .int32(value) + } + + func encode(_ value: Int64) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .int64(value) + } + + func encode(_ value: UInt) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .uint(value) + } + + func encode(_ value: UInt8) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .uint8(value) + } + + func encode(_ value: UInt16) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .uint16(value) + } + + func encode(_ value: UInt32) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .uint32(value) + } + + func encode(_ value: UInt64) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .uint64(value) + } + + func encode(_ value: Float) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .float(value) + } + + func encode(_ value: Double) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .double(value) + } + + func encode(_ value: String) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = .string(value) + } + + func encode(_ value: T) throws { + expectTrue(isValid, "Container isn't valid", trapping: true) + expectNil(self.value, "Cannot encode multiple values into a single-value container", trapping: true) + self.value = try _encode(value, key: nil) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIndex.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIndex.swift new file mode 100644 index 00000000..032b6904 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIndex.swift @@ -0,0 +1,59 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibUnittest + +import XCTest + +public struct MinimalIndex { + internal let _state: _CollectionState + internal let _id: Int + internal var _offset: Int + + internal init(state: _CollectionState, offset: Int) { + _state = state + _id = state.context.nextIndexId() + _offset = offset + precondition(_offset >= 0 && _offset <= state.count) + } + + public var offset: Int { _offset } + public var context: TestContext { _state.context } +} + +extension MinimalIndex: Equatable { + public static func == (left: Self, right: Self) -> Bool { + left._assertCompatible(with: right) + return left._offset == right._offset + } +} + +extension MinimalIndex: Comparable { + public static func < (left: Self, right: Self) -> Bool { + left._assertCompatible(with: right) + return left._offset < right._offset + } +} + +extension MinimalIndex: CustomStringConvertible { + public var description: String { + return "MinimalIndex(offset: \(_offset), state: \(_state.id))" + } +} + +extension MinimalIndex { + func _assertCompatible(with other: Self) { + if self._state === other._state { return } + expectTrue(self._state.isValidIndex(other), "Invalid index", trapping: true) + expectTrue(other._state.isValidIndex(self), "Invalid index", trapping: true) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIterator.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIterator.swift new file mode 100644 index 00000000..32a6734a --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalIterator.swift @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// State shared by all iterators of a MinimalSequence instance. +internal class _MinimalIteratorSharedState { + internal init(_ data: [Element]) { + self.data = data + } + + internal let data: [Element] + internal var i: Int = 0 + internal var underestimatedCount: Int = 0 + + public func next() -> Element? { + if i == data.count { + return nil + } + defer { i += 1 } + return data[i] + } +} + +/// An iterator that implements the IteratorProtocol contract in the most +/// narrow way possible. +public struct MinimalIterator: IteratorProtocol { + internal let _sharedState: _MinimalIteratorSharedState + + public init(_ s: S) where S.Element == Element { + self._sharedState = _MinimalIteratorSharedState(Array(s)) + } + + public init(_ data: [Element]) { + self._sharedState = _MinimalIteratorSharedState(data) + } + + internal init(_ _sharedState: _MinimalIteratorSharedState) { + self._sharedState = _sharedState + } + + public func next() -> Element? { + _sharedState.next() + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRandomAccessCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRandomAccessCollection.swift new file mode 100644 index 00000000..4d2656f8 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRandomAccessCollection.swift @@ -0,0 +1,182 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// A minimal implementation of `RandomAccessCollection & MutableCollection` with extra checks. +public struct MinimalMutableRandomAccessCollection { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexNavigationCalled = ResettableValue(0) + public let timesSubscriptGetterCalled = ResettableValue(0) + public let timesSubscriptSetterCalled = ResettableValue(0) + public let timesRangeSubscriptGetterCalled = ResettableValue(0) + public let timesRangeSubscriptSetterCalled = ResettableValue(0) + public let timesSwapCalled = ResettableValue(0) + public let timesPartitionCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalMutableRandomAccessCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalMutableRandomAccessCollection: RandomAccessCollection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + timesIndexNavigationCalled.increment() + return _core.isEmpty + } + + public var count: Int { + timesIndexNavigationCalled.increment() + return _core.count + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(after: i) + } + + public func index(before i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(before: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + timesIndexNavigationCalled.increment() + return _core.distance(from: start, to: end) + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + timesIndexNavigationCalled.increment() + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + get { + timesSubscriptGetterCalled.increment() + return _core[i] + } + set { + timesSubscriptSetterCalled.increment() + _core[i] = newValue + } + } + + public subscript(bounds: Range) -> SubSequence { + get { + timesRangeSubscriptGetterCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } + set { + timesRangeSubscriptSetterCalled.increment() + _core.assertValid(bounds) + expectEqual(bounds.upperBound._offset - bounds.lowerBound._offset, + newValue.endIndex._offset - newValue.startIndex._offset, + "Range assignment cannot change number of elements in MutableCollection") + _core.elements[bounds.lowerBound._offset ..< bounds.upperBound._offset] = + Self._coreSlice(from: newValue) + // Don't invalidate indices. + } + } + + static func _coreSlice(from slice: SubSequence) -> ArraySlice { + slice.base._core.assertValid(slice.startIndex ..< slice.endIndex) + return slice.base._core.elements[slice.startIndex._offset ..< slice.endIndex._offset] + } +} + +extension MinimalMutableRandomAccessCollection: MutableCollection { + public mutating func partition( + by belongsInSecondPartition: (Element) throws -> Bool + ) rethrows -> Index { + timesPartitionCalled.increment() + let pivot = try _core.elements.partition(by: belongsInSecondPartition) + return _core.index(at: pivot) + } + + public mutating func swapAt(_ i: Index, _ j: Index) { + _core.assertValidIndexBeforeEnd(i) + _core.assertValidIndexBeforeEnd(j) + timesSwapCalled.increment() + _core.elements.swapAt(i._offset, j._offset) + // Don't invalidate indices. + } + + public mutating func _withUnsafeMutableBufferPointerIfSupported( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + return nil + } + + public mutating func withContiguousMutableStorageIfAvailable( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + return nil + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRangeReplaceableRandomAccessCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRangeReplaceableRandomAccessCollection.swift new file mode 100644 index 00000000..1f70e13e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalMutableRangeReplaceableRandomAccessCollection.swift @@ -0,0 +1,249 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// A minimal implementation of `RandomAccessCollection & MutableCollection & RangeReplaceableCollection` with extra checks. +public struct MinimalMutableRangeReplaceableRandomAccessCollection { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexNavigationCalled = ResettableValue(0) + public let timesSubscriptGetterCalled = ResettableValue(0) + public let timesSubscriptSetterCalled = ResettableValue(0) + public let timesRangeSubscriptGetterCalled = ResettableValue(0) + public let timesRangeSubscriptSetterCalled = ResettableValue(0) + public let timesSwapCalled = ResettableValue(0) + public let timesPartitionCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalMutableRangeReplaceableRandomAccessCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalMutableRangeReplaceableRandomAccessCollection: RandomAccessCollection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + timesIndexNavigationCalled.increment() + return _core.isEmpty + } + + public var count: Int { + timesIndexNavigationCalled.increment() + return _core.count + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(after: i) + } + + public func index(before i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(before: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + timesIndexNavigationCalled.increment() + return _core.distance(from: start, to: end) + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + timesIndexNavigationCalled.increment() + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + get { + timesSubscriptGetterCalled.increment() + return _core[i] + } + set { + timesSubscriptSetterCalled.increment() + _core[i] = newValue + } + } + + public subscript(bounds: Range) -> SubSequence { + get { + timesRangeSubscriptGetterCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } + set { + timesRangeSubscriptSetterCalled.increment() + _core.assertValid(bounds) + _core.elements[bounds.lowerBound._offset ..< bounds.upperBound._offset] = + Self._coreSlice(from: newValue) + // Don't invalidate indices. + } + } + + static func _coreSlice(from slice: SubSequence) -> ArraySlice { + slice.base._core.assertValid(slice.startIndex ..< slice.endIndex) + return slice.base._core.elements[slice.startIndex._offset ..< slice.endIndex._offset] + } +} + +extension MinimalMutableRangeReplaceableRandomAccessCollection: MutableCollection { + public mutating func partition( + by belongsInSecondPartition: (Element) throws -> Bool + ) rethrows -> Index { + timesPartitionCalled.increment() + let pivot = try _core.elements.partition(by: belongsInSecondPartition) + return _core.index(at: pivot) + } + + public mutating func swapAt(_ i: Index, _ j: Index) { + _core.assertValidIndexBeforeEnd(i) + _core.assertValidIndexBeforeEnd(j) + timesSwapCalled.increment() + _core.elements.swapAt(i._offset, j._offset) + // Don't invalidate indices. + } + + public mutating func _withUnsafeMutableBufferPointerIfSupported( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + return nil + } + + public mutating func withContiguousMutableStorageIfAvailable( + _ body: (inout UnsafeMutableBufferPointer) throws -> R + ) rethrows -> R? { + return nil + } +} + +extension MinimalMutableRangeReplaceableRandomAccessCollection: RangeReplaceableCollection { + public init() { + self.init([]) + } + + public mutating func replaceSubrange( + _ subrange: Range, + with newElements: C + ) where C.Element == Element { + _core.replaceSubrange(subrange, with: newElements) + } + + public mutating func reserveCapacity(_ n: Int) { + _core.reserveCapacity(minimumCapacity: n) + } + + public init(_ elements: S) where S.Element == Element { + self.init(elements, context: TestContext.current) + } + + public mutating func append(_ newElement: Element) { + _core.append(newElement) + } + + public mutating func append( + contentsOf newElements: S + ) where S.Element == Element { + _core.append(contentsOf: newElements) + } + + public mutating func insert(_ newElement: Element, at i: Index) { + _core.insert(newElement, at: i) + } + + @discardableResult + public mutating func remove(at i: Index) -> Element { + return _core.remove(at: i) + } + + public mutating func removeSubrange(_ bounds: Range) { + _core.removeSubrange(bounds) + } + + public mutating func _customRemoveLast() -> Element? { + return _core._customRemoveLast() + } + + public mutating func _customRemoveLast(_ n: Int) -> Bool { + return _core._customRemoveLast(n) + } + + @discardableResult + public mutating func removeFirst() -> Element { + return _core.removeFirst() + } + + public mutating func removeFirst(_ n: Int) { + _core.removeFirst(n) + } + + public mutating func removeAll(keepingCapacity keepCapacity: Bool) { + _core.removeAll(keepingCapacity: keepCapacity) + } + + public mutating func removeAll( + where shouldBeRemoved: (Element) throws -> Bool) rethrows { + try _core.removeAll(where: shouldBeRemoved) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRandomAccessCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRandomAccessCollection.swift new file mode 100644 index 00000000..773011e4 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRandomAccessCollection.swift @@ -0,0 +1,125 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// A minimal implementation of `RandomAccessCollection` with extra checks. +public struct MinimalRandomAccessCollection { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexNavigationCalled = ResettableValue(0) + public let timesSubscriptCalled = ResettableValue(0) + public let timesRangeSubscriptCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalRandomAccessCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalRandomAccessCollection: RandomAccessCollection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + timesIndexNavigationCalled.increment() + return _core.isEmpty + } + + public var count: Int { + timesIndexNavigationCalled.increment() + return _core.count + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(after: i) + } + + public func index(before i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(before: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + timesIndexNavigationCalled.increment() + return _core.distance(from: start, to: end) + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + timesIndexNavigationCalled.increment() + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + timesSubscriptCalled.increment() + return _core[i] + } + + public subscript(bounds: Range) -> SubSequence { + timesRangeSubscriptCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRangeReplaceableRandomAccessCollection.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRangeReplaceableRandomAccessCollection.swift new file mode 100644 index 00000000..88905b17 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalRangeReplaceableRandomAccessCollection.swift @@ -0,0 +1,204 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +/// A minimal implementation of `RandomAccessCollection & RangeReplaceableCollection` with extra checks. +public struct MinimalRangeReplaceableRandomAccessCollection { + internal var _core: _MinimalCollectionCore + + public let timesMakeIteratorCalled = ResettableValue(0) + public let timesUnderestimatedCountCalled = ResettableValue(0) + public let timesRangeChecksCalled = ResettableValue(0) + public let timesIndexNavigationCalled = ResettableValue(0) + public let timesSubscriptGetterCalled = ResettableValue(0) + public let timesSubscriptSetterCalled = ResettableValue(0) + public let timesRangeSubscriptGetterCalled = ResettableValue(0) + public let timesRangeSubscriptSetterCalled = ResettableValue(0) + public let timesSwapCalled = ResettableValue(0) + public let timesPartitionCalled = ResettableValue(0) + + public init( + _ elements: S, + context: TestContext = TestContext.current, + underestimatedCount: UnderestimatedCountBehavior = .value(0) + ) where S.Element == Element { + self._core = _MinimalCollectionCore(context: context, elements: elements, underestimatedCount: underestimatedCount) + } + + var _context: TestContext { + _core.context + } +} + +extension MinimalRangeReplaceableRandomAccessCollection: Sequence { + public typealias Iterator = MinimalIterator + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.increment() + return MinimalIterator(_core.elements) + } + + public var underestimatedCount: Int { + timesUnderestimatedCountCalled.increment() + return _core.underestimatedCount + } +} + +extension MinimalRangeReplaceableRandomAccessCollection: RandomAccessCollection { + public typealias Index = MinimalIndex + public typealias SubSequence = Slice + public typealias Indices = DefaultIndices + + public var startIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.startIndex + } + + public var endIndex: MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.endIndex + } + + public var isEmpty: Bool { + timesIndexNavigationCalled.increment() + return _core.isEmpty + } + + public var count: Int { + timesIndexNavigationCalled.increment() + return _core.count + } + + public func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(index, bounds: bounds) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + timesRangeChecksCalled.increment() + _core._failEarlyRangeCheck(range, bounds: bounds) + } + + public func index(after i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(after: i) + } + + public func index(before i: MinimalIndex) -> MinimalIndex { + timesIndexNavigationCalled.increment() + return _core.index(before: i) + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) + -> Int { + timesIndexNavigationCalled.increment() + return _core.distance(from: start, to: end) + } + + public func index(_ i: Index, offsetBy n: Int) -> Index { + timesIndexNavigationCalled.increment() + return _core.index(i, offsetBy: n) + } + + public subscript(i: MinimalIndex) -> Element { + timesSubscriptGetterCalled.increment() + return _core[i] + } + + public subscript(bounds: Range) -> SubSequence { + timesRangeSubscriptGetterCalled.increment() + _core.assertValid(bounds) + return Slice(base: self, bounds: bounds) + } + + static func _coreSlice(from slice: SubSequence) -> ArraySlice { + slice.base._core.assertValid(slice.startIndex ..< slice.endIndex) + return slice.base._core.elements[slice.startIndex._offset ..< slice.endIndex._offset] + } +} + +extension MinimalRangeReplaceableRandomAccessCollection: RangeReplaceableCollection { + public init() { + self.init([]) + } + + public mutating func replaceSubrange( + _ subrange: Range, + with newElements: C + ) where C.Element == Element { + _core.replaceSubrange(subrange, with: newElements) + } + + public mutating func reserveCapacity(_ n: Int) { + _core.reserveCapacity(minimumCapacity: n) + } + + public init(_ elements: S) where S.Element == Element { + self.init(elements, context: TestContext.current) + } + + public mutating func append(_ newElement: Element) { + _core.append(newElement) + } + + public mutating func append( + contentsOf newElements: S + ) where S.Element == Element { + _core.append(contentsOf: newElements) + } + + public mutating func insert(_ newElement: Element, at i: Index) { + _core.insert(newElement, at: i) + } + + @discardableResult + public mutating func remove(at i: Index) -> Element { + return _core.remove(at: i) + } + + public mutating func removeSubrange(_ bounds: Range) { + _core.removeSubrange(bounds) + } + + public mutating func _customRemoveLast() -> Element? { + return _core._customRemoveLast() + } + + public mutating func _customRemoveLast(_ n: Int) -> Bool { + return _core._customRemoveLast(n) + } + + @discardableResult + public mutating func removeFirst() -> Element { + return _core.removeFirst() + } + + public mutating func removeFirst(_ n: Int) { + _core.removeFirst(n) + } + + public mutating func removeAll(keepingCapacity keepCapacity: Bool) { + _core.removeAll(keepingCapacity: keepCapacity) + } + + public mutating func removeAll( + where shouldBeRemoved: (Element) throws -> Bool) rethrows { + try _core.removeAll(where: shouldBeRemoved) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalSequence.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalSequence.swift new file mode 100644 index 00000000..98c0f3ea --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/MinimalSequence.swift @@ -0,0 +1,96 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +public enum UnderestimatedCountBehavior { + /// Return the actual number of elements. + case precise + + /// Return the actual number of elements divided by 2. + case half + + /// Return an overestimated count. Useful to test how algorithms reserve + /// memory. + case overestimate + + /// Return the provided value. + case value(Int) + + func value(forCount count: Int) -> Int { + switch self { + case .precise: + return count + case .half: + return count / 2 + case .overestimate: + return count * 3 + 5 + case .value(let count): + return count + } + } +} + +/// A Sequence that implements the protocol contract in the most +/// narrow way possible. +/// +/// This sequence is consumed when its iterator is advanced. +public struct MinimalSequence: Sequence, CustomDebugStringConvertible { + public let timesMakeIteratorCalled = ResettableValue(0) + + internal let _sharedState: _MinimalIteratorSharedState + internal let _isContiguous: Bool + + public init( + elements: S, + underestimatedCount: UnderestimatedCountBehavior = .value(0), + isContiguous: Bool = false + ) where S.Element == T { + let data = Array(elements) + self._sharedState = _MinimalIteratorSharedState(data) + self._isContiguous = isContiguous + switch underestimatedCount { + case .precise: + self._sharedState.underestimatedCount = data.count + + case .half: + self._sharedState.underestimatedCount = data.count / 2 + + case .overestimate: + self._sharedState.underestimatedCount = data.count * 3 + 5 + + case .value(let count): + self._sharedState.underestimatedCount = count + } + } + + public func makeIterator() -> MinimalIterator { + timesMakeIteratorCalled.value += 1 + return MinimalIterator(_sharedState) + } + + public var underestimatedCount: Int { + return Swift.max(0, self._sharedState.underestimatedCount - self._sharedState.i) + } + + public var debugDescription: String { + return "MinimalSequence(\(_sharedState.data[_sharedState.i...]))" + } + + public func withContiguousStorageIfAvailable( + _ body: (UnsafeBufferPointer) throws -> R + ) rethrows -> R? { + guard _isContiguous else { return nil } + return try _sharedState.data[_sharedState.i...] + .withContiguousStorageIfAvailable(body) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/ResettableValue.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/ResettableValue.swift new file mode 100644 index 00000000..aebb0c96 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/ResettableValue.swift @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibUnittest + +public class ResettableValue { + public init(_ value: Value) { + self.defaultValue = value + self.value = value + } + + public func reset() { + value = defaultValue + } + + public let defaultValue: Value + public var value: Value +} + +extension ResettableValue where Value: Strideable { + public func increment(by delta: Value.Stride = 1) { + value = value.advanced(by: delta) + } +} + +extension ResettableValue: CustomStringConvertible { + public var description: String { "\(value)" } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/StringConvertibleValue.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/StringConvertibleValue.swift new file mode 100644 index 00000000..b4e524be --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/StringConvertibleValue.swift @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +public struct StringConvertibleValue { + public var value: Int + public init(_ value: Int) { self.value = value } +} + +extension StringConvertibleValue: ExpressibleByIntegerLiteral { + public init(integerLiteral value: Int) { + self.init(value) + } +} + +extension StringConvertibleValue: CustomStringConvertible { + public var description: String { + "description(\(value))" + } +} + +extension StringConvertibleValue: CustomDebugStringConvertible { + public var debugDescription: String { + "debugDescription(\(value))" + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_CollectionState.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_CollectionState.swift new file mode 100644 index 00000000..fcb05959 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_CollectionState.swift @@ -0,0 +1,241 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +// Loosely adapted from https://github.com/apple/swift/tree/main/stdlib/private/StdlibCollectionUnittest + +final class _CollectionState { + /// The collection context in which this state belongs. + let context: TestContext + /// The unique identifier of this state within its context. + let id: Int + /// The state from which this instance spawned. + private(set) var parent: _CollectionState? + private(set) var count: Int + private(set) var strategy: IndexInvalidationStrategy + /// The identifier of the state in which each currently valid index first became valid. + /// (Note: the end index is tracked separately, in `endIndexValidity`. + /// The identifier tracked here is guaranteed to match one of the states on the `parent` chain. + private var indexValidity: [Int] + /// The identitifer of the state in which the current endIndex first became valid. + private var endIndexValidity: Int + + enum IndexInvalidationStrategy: Hashable { + case allIndices + case afterChange + } + + + init( + context: TestContext, + parent: _CollectionState?, + count: Int, + strategy: IndexInvalidationStrategy = .allIndices, + indexValidity: [Int], + endIndexValidity: Int + ) { + self.context = context + self.id = context.nextStateId() + self.parent = parent + self.count = count + self.strategy = strategy + self.indexValidity = indexValidity + self.endIndexValidity = endIndexValidity + } + + init( + context: TestContext, + parent: _CollectionState?, + count: Int, + strategy: IndexInvalidationStrategy = .allIndices + ) { + self.context = context + self.parent = parent + self.id = context.nextStateId() + self.count = count + self.strategy = strategy + switch strategy { + case .allIndices: + self.indexValidity = [] + self.endIndexValidity = 0 + case .afterChange: + self.indexValidity = Array(repeatElement(id, count: count)) + self.endIndexValidity = id + } + } + + deinit { + // Prevent stack overflow for long parent chains. + var node = self + while isKnownUniquelyReferenced(&node.parent) { + let p = node.parent! + node.parent = nil + node = p + } + } + + func spawnChild() -> _CollectionState { + _CollectionState( + context: context, + parent: self, + count: count, + strategy: strategy, + indexValidity: indexValidity, + endIndexValidity: endIndexValidity) + } +} + +extension _CollectionState: Equatable { + public static func == (left: _CollectionState, right: _CollectionState) -> Bool { + return left.id == right.id + } +} + +extension _CollectionState: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(id) + } +} + +extension _CollectionState { + func isValidIndex(_ index: MinimalIndex) -> Bool { + if index._state === self { return true } + guard index._state.context == context else { return false } + guard index._offset >= 0 && index._offset <= count else { return false } + switch strategy { + case .allIndices: + guard index._state.id == self.id else { return false } + case .afterChange: + if index._offset < count { + guard index._state.id == indexValidity[index._offset] else { return false } + } else { + guard index._state.id == endIndexValidity else { return false } + } + } + return true + } +} + +extension _CollectionState { + internal subscript(validityAt offset: Int) -> Int { + get { + switch strategy { + case .allIndices: + return id + case .afterChange: + precondition(offset >= 0) + if offset > count { + return id + } + if offset == count { + return endIndexValidity + } + return indexValidity[offset] + } + } + set { + precondition(strategy == .allIndices, "Cannot invalidate individual indices") + precondition(offset >= 0 && offset <= count) + if offset == count { + endIndexValidity = newValue + } else { + indexValidity[offset] = newValue + } + } + } +} + +extension _CollectionState { + func insert(count: Int, at offset: Int) { + precondition(count >= 0 && offset >= 0 && offset <= self.count) + guard count > 0 else { return } + self.count += count + switch strategy { + case .allIndices: + // Do nothing + break + case .afterChange: + let rest = offset ..< indexValidity.count + self.indexValidity.replaceSubrange(rest, with: repeatElement(id, count: rest.count + count)) + self.endIndexValidity = self.id + assert(indexValidity.count == self.count) + } + } + + func remove(_ range: Range) { + remove(count: range.upperBound._offset - range.lowerBound._offset, + at: range.lowerBound._offset) + } + + func remove(count: Int, at offset: Int) { + precondition(count >= 0 && offset >= 0 && offset + count <= self.count) + guard count > 0 else { return } + switch strategy { + case .allIndices: + self.count -= count + case .afterChange: + let rest = offset ..< self.count + self.indexValidity.replaceSubrange(rest, with: repeatElement(id, count: rest.count - count)) + self.endIndexValidity = self.id + self.count -= count + assert(indexValidity.count == self.count) + } + } + + func replace(_ range: Range, with newCount: Int) { + replace(oldCount: range.upperBound._offset - range.lowerBound._offset, + at: range.lowerBound._offset, + with: newCount) + } + + func replace(oldCount: Int, at offset: Int, with newCount: Int) { + precondition(oldCount >= 0 && offset >= 0 && newCount >= 0) + precondition(offset + oldCount <= self.count) + guard oldCount > 0 || newCount > 0 else { return } + switch strategy { + case .allIndices: + self.count += newCount - oldCount + case .afterChange: + let rest = offset ..< self.count + self.indexValidity.replaceSubrange( + rest, + with: repeatElement(id, count: rest.count + newCount - oldCount)) + self.endIndexValidity = self.id + self.count += newCount - oldCount + assert(indexValidity.count == self.count) + } + } + + func replaceAll() { + switch strategy { + case .allIndices: + // Do nothing + break + case .afterChange: + self.indexValidity = Array(repeating: id, count: count) + self.endIndexValidity = id + assert(indexValidity.count == self.count) + } + } + + func reset(count: Int) { + self.count = count + switch strategy { + case .allIndices: + // Do nothing + break + case .afterChange: + self.indexValidity = Array(repeating: id, count: count) + self.endIndexValidity = id + assert(indexValidity.count == self.count) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_MinimalCollectionCore.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_MinimalCollectionCore.swift new file mode 100644 index 00000000..4bdc7c63 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/MinimalTypes/_MinimalCollectionCore.swift @@ -0,0 +1,349 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +struct _MinimalCollectionCore { + var state: _CollectionState + var elements: [Element] + var underestimatedCount: Int + + public init( + context: TestContext, + elements: S, + underestimatedCount: UnderestimatedCountBehavior? = nil + ) where S.Element == Element { + self.init(context: context, elements: Array(elements), underestimatedCount: underestimatedCount) + } + + public init( + context: TestContext, + elements: [Element], + underestimatedCount: UnderestimatedCountBehavior? = nil + ) { + self.state = _CollectionState(context: context, parent: nil, count: elements.count) + self.elements = elements + self.underestimatedCount = underestimatedCount?.value(forCount: elements.count) ?? elements.count + } + + var context: TestContext { state.context } +} + +extension _MinimalCollectionCore { + var startIndex: MinimalIndex { + MinimalIndex(state: state, offset: 0) + } + + var endIndex: MinimalIndex { + MinimalIndex(state: state, offset: count) + } + + var count: Int { + elements.count + } + + var isEmpty: Bool { + elements.isEmpty + } +} + +extension _MinimalCollectionCore { + mutating func ensureUniqueState() { + if !isKnownUniquelyReferenced(&state) { + state = state.spawnChild() + } + } +} + +// MARK: Index validation + +extension _MinimalCollectionCore { + internal func index(at offset: Int) -> MinimalIndex { + return MinimalIndex(state: state, offset: offset) + } + + func isValidIndex(_ index: MinimalIndex) -> Bool { + state.isValidIndex(index) + } + + func assertValidIndex( + _ index: MinimalIndex, + _ message: @autoclosure () -> String = "Invalid index", + file: StaticString = #file, + line: UInt = #line + ) { + expectTrue(isValidIndex(index), + message(), trapping: true, + file: file, line: line) + } + + func assertValidIndexBeforeEnd( + _ index: MinimalIndex, + _ message: @autoclosure () -> String = "Invalid index", + file: StaticString = #file, + line: UInt = #line + ) { + expectTrue(isValidIndex(index), + message(), trapping: true, + file: file, line: line) + + expectTrue(index._offset != elements.count, + message(), trapping: true, + file: file, line: line) + } + + func assertValid( + _ range: Range, + message: @autoclosure () -> String = "Invalid index range", + file: StaticString = #file, + line: UInt = #line + ) { + assertValidIndex(range.lowerBound, message()) + assertValidIndex(range.upperBound, message()) + } +} + +// MARK: Index navigation + +extension _MinimalCollectionCore { + func index(after index: MinimalIndex) -> MinimalIndex { + assertValidIndex(index) + expectTrue(index._offset < count, + "Can't advance beyond endIndex", + trapping: true) + return self.index(at: index._offset + 1) + } + + func index(before index: MinimalIndex) -> MinimalIndex { + assertValidIndex(index) + expectTrue(index._offset > 0, + "Can't advance before startIndex", + trapping: true) + return self.index(at: index._offset - 1) + } + + func formIndex(after index: inout MinimalIndex) { + assertValidIndex(index) + expectTrue(index._offset < count, + "Can't advance beyond endIndex", + trapping: true) + index._offset += 1 + } + + func formIndex(before index: inout MinimalIndex) { + assertValidIndex(index) + expectTrue(index._offset > 0, + "Can't advance before startIndex", + trapping: true) + index._offset -= 1 + } + + public func distance(from start: MinimalIndex, to end: MinimalIndex) -> Int { + assertValidIndex(start) + assertValidIndex(end) + return end._offset - start._offset + } + + public func index( + _ index: MinimalIndex, + offsetBy n: Int + ) -> MinimalIndex { + assertValidIndex(index) + expectTrue(index._offset + n >= 0, + "Can't advance before startIndex", + trapping: true) + expectTrue(index._offset + n <= count, + "Can't advance after endIndex", + trapping: true) + return self.index(at: index._offset + n) + } + + func _failEarlyRangeCheck( + _ index: MinimalIndex, + bounds: Range + ) { + assertValidIndex(index) + assertValid(bounds) + expectLessThanOrEqual( + bounds.lowerBound._offset, index._offset, + "Index out of bounds", trapping: true) + expectLessThan( + index._offset, bounds.upperBound._offset, + "Index out of bounds", trapping: true) + } + + public func _failEarlyRangeCheck( + _ range: Range, + bounds: Range + ) { + assertValid(range) + assertValid(bounds) + expectLessThanOrEqual( + bounds.lowerBound._offset, range.lowerBound._offset, + "Index range out of bounds", trapping: true) + expectLessThanOrEqual( + range.upperBound._offset, bounds.upperBound._offset, + "Index range out of bounds", trapping: true) + } + + func _count(of range: Range) -> Int { + range.upperBound._offset - range.lowerBound._offset + } +} + +// MARK: Mutations + +extension _MinimalCollectionCore { + subscript(index: MinimalIndex) -> Element { + get { + assertValidIndexBeforeEnd(index) + return elements[index._offset] + } + set { + assertValidIndexBeforeEnd(index) + elements[index._offset] = newValue + // MutableCollection requires that the subscript setter + // not invalidate any indices. + } + } + + mutating func replaceSubrange( + _ subrange: Range, + with newElements: C + ) where C.Element == Element { + assertValid(subrange) + elements.replaceSubrange( + subrange.lowerBound._offset ..< subrange.upperBound._offset, + with: newElements) + + ensureUniqueState() + state.replace(subrange, with: newElements.count) + } + + mutating func reserveCapacity(minimumCapacity: Int) { + elements.reserveCapacity(minimumCapacity) + state.replaceAll() + } + + mutating func append(_ item: Element) { + elements.append(item) + ensureUniqueState() + state.insert(count: 1, at: state.count) + } + + mutating func append( + contentsOf newElements: S + ) where S.Element == Element { + elements.append(contentsOf: newElements) + ensureUniqueState() + state.insert(count: elements.count - state.count, at: state.count) + } + + mutating func insert( + _ newElement: Element, + at index: MinimalIndex + ) { + assertValidIndex(index) + elements.insert(newElement, at: index._offset) + ensureUniqueState() + state.insert(count: 1, at: index._offset) + } + + mutating func insert( + contentsOf newElements: C, + at index: MinimalIndex + ) where C.Element == Element { + assertValidIndex(index) + elements.insert(contentsOf: newElements, at: index._offset) + ensureUniqueState() + state.insert(count: newElements.count, at: index._offset) + } + + mutating func remove(at index: MinimalIndex) -> Element { + assertValidIndexBeforeEnd(index) + ensureUniqueState() + state.remove(count: 1, at: index._offset) + return elements.remove(at: index._offset) + } + + mutating func removeSubrange(_ bounds: Range) { + assertValid(bounds) + elements.removeSubrange(bounds.lowerBound._offset ..< bounds.upperBound._offset) + ensureUniqueState() + state.remove(count: _count(of: bounds), at: bounds.lowerBound._offset) + } + + mutating func removeFirst() -> Element { + expectTrue( + count > 0, + "Can't remove first element of an empty collection", + trapping: true) + ensureUniqueState() + state.remove(count: 1, at: 0) + return elements.removeFirst() + } + + mutating func removeFirst(_ n: Int) { + expectTrue( + n >= 0, + "Can't remove a negative number of elements", + trapping: true) + expectTrue( + n <= count, + "Can't remove more elements than there are in the collection", + trapping: true) + ensureUniqueState() + state.remove(count: n, at: 0) + elements.removeFirst(n) + } + + public mutating func _customRemoveLast() -> Element? { + expectTrue( + !isEmpty, + "Can't remove last element of an empty collection", + trapping: true) + ensureUniqueState() + state.remove(count: 1, at: state.count) + return elements.removeLast() + } + + public mutating func _customRemoveLast(_ n: Int) -> Bool { + expectTrue( + n >= 0, + "Can't remove a negative number of elements", + trapping: true) + expectTrue( + count >= n, + "Can't remove more elements than there are in the collection", + trapping: true) + elements.removeLast(n) + ensureUniqueState() + state.remove(count: n, at: state.count - n) + return true + } + + + mutating func removeAll(keepingCapacity keepCapacity: Bool) { + elements.removeAll(keepingCapacity: keepCapacity) + ensureUniqueState() + state.remove(count: state.count, at: 0) + } + + mutating func removeAll( + where shouldBeRemoved: (Element) throws -> Bool + ) rethrows { + defer { + ensureUniqueState() + state.reset(count: elements.count) + } + try elements.removeAll(where: shouldBeRemoved) + } +} + diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/Box.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/Box.swift new file mode 100644 index 00000000..15cae71f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/Box.swift @@ -0,0 +1,16 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +public final class Box { + public init(_ value: T) { self.value = value } + public var value: T +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/HashableBox.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/HashableBox.swift new file mode 100644 index 00000000..ed2388e5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/HashableBox.swift @@ -0,0 +1,24 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +public final class HashableBox: Hashable { + public init(_ value: T) { self.value = value } + public var value: T + + public static func ==(left: HashableBox, right: HashableBox) -> Bool { + left.value == right.value + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(value) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracked.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracked.swift new file mode 100644 index 00000000..a53b5795 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracked.swift @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +/// A type that tracks the number of live instances. +/// +/// `LifetimeTracked` conforms to `CustomStringConvertible`, and conditionally +/// conforms to `Equatable`, `Hashable` and `Comparable` when its payload does. +/// +/// `LifetimeTracked` is useful to check for leaks in algorithms and data +/// structures. The easiest way to produce instances is to use the +/// `withLifetimeTracking` function: +/// +/// class FooTests: XCTestCase { +/// func testFoo() { +/// withLifetimeTracking([1, 2, 3]) { instances in +/// _ = instances.sorted(by: >) +/// } +/// } +/// } +public class LifetimeTracked { + public let tracker: LifetimeTracker + internal var serialNumber: Int = 0 + public let payload: Payload + + public init(_ payload: Payload, for tracker: LifetimeTracker) { + tracker.instances += 1 + tracker._nextSerialNumber += 1 + self.tracker = tracker + self.serialNumber = tracker._nextSerialNumber + self.payload = payload + } + + deinit { + precondition(serialNumber != 0, "Double deinit") + tracker.instances -= 1 + serialNumber = -serialNumber + } +} + +extension LifetimeTracked: CustomStringConvertible { + public var description: String { + return "\(payload)" + } +} + +extension LifetimeTracked: Equatable where Payload: Equatable { + public static func == (left: LifetimeTracked, right: LifetimeTracked) -> Bool { + return left.payload == right.payload + } +} + +extension LifetimeTracked: Hashable where Payload: Hashable { + public func hash(into hasher: inout Hasher) { + hasher.combine(payload) + } +} + +extension LifetimeTracked: Comparable where Payload: Comparable { + public static func < (left: LifetimeTracked, right: LifetimeTracked) -> Bool { + return left.payload < right.payload + } +} + +extension LifetimeTracked: Encodable where Payload: Encodable { + public func encode(to encoder: Encoder) throws { + try payload.encode(to: encoder) + } +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracker.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracker.swift new file mode 100644 index 00000000..e920a675 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/LifetimeTracker.swift @@ -0,0 +1,54 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +/// Tracks the life times of `LifetimeTracked` instances, providing a method +/// to validate checkpoints where no instances should exist. +/// +/// - Note: `LifetimeTracker` is not designed for multithreaded use. Trying to +/// instantiate or deinitialize instances belonging to the same tracker +/// from multiple concurrent threads (or reentrantly) will lead to +/// exclusivity violations and therefore undefined behavior. +public class LifetimeTracker { + public internal(set) var instances = 0 + var _nextSerialNumber = 0 + + public init() {} + + deinit { + check() + } + + public func check(file: StaticString = #file, line: UInt = #line) { + expectEqual(instances, 0, + "Potential leak of \(instances) objects", + file: file, line: line) + } + + public func instance(for payload: Payload) -> LifetimeTracked { + LifetimeTracked(payload, for: self) + } + + public func instances(for items: S) -> [LifetimeTracked] { + return items.map { LifetimeTracked($0, for: self) } + } +} + +@inlinable +public func withLifetimeTracking( + file: StaticString = #file, + line: UInt = #line, + _ body: (LifetimeTracker) throws -> R +) rethrows -> R { + let tracker = LifetimeTracker() + defer { tracker.check(file: file, line: line) } + return try body(tracker) +} diff --git a/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/SeedableRandomNumberGenerator.swift b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/SeedableRandomNumberGenerator.swift new file mode 100644 index 00000000..f09b89eb --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Sources/_CollectionsTestSupport/Utilities/SeedableRandomNumberGenerator.swift @@ -0,0 +1,40 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +public struct RepeatableRandomNumberGenerator: RandomNumberGenerator { + // This uses the same linear congruential generator as rand48. + // FIXME: Replace with something better. + internal static let _m: UInt64 = 1 << 48 + internal static let _a: UInt64 = 25214903917 + internal static let _c: UInt64 = 11 + + internal var _state: UInt64 + + public init(seed: Int) { + self.init(seed: UInt64(truncatingIfNeeded: seed)) + } + + public init(seed: UInt64) { + // Perturb the seed a little so that the sequence doesn't start with a + // zero value in the common case of seed == 0. (Using a zero seed is a + // rather silly thing to do, but it's the easy thing.) + _state = seed ^ 0x536f52616e646f6d // "SoRandom" + } + + private mutating func _next() -> UInt64 { + _state = (Self._a &* _state &+ Self._c) & (Self._m - 1) + return _state &>> 16 + } + + public mutating func next() -> UInt64 { + return (_next() &<< 32) | _next() + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/CollectionsTestSupportTests/MinimalTypeConformances.swift b/Carthage/Checkouts/swift-collections/Tests/CollectionsTestSupportTests/MinimalTypeConformances.swift new file mode 100644 index 00000000..21e8534c --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/CollectionsTestSupportTests/MinimalTypeConformances.swift @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +import _CollectionsTestSupport + +final class DequeTests: CollectionTestCase { + func testMinimalSequence() { + withEvery( + "behavior", + in: [ + UnderestimatedCountBehavior.precise, + UnderestimatedCountBehavior.half, + UnderestimatedCountBehavior.value(0) + ] + ) { behavior in + withEvery("isContiguous", in: [false, true]) { isContiguous in + func make() -> MinimalSequence { + MinimalSequence( + elements: 0 ..< 50, + underestimatedCount: behavior, + isContiguous: isContiguous) + } + checkSequence(make, expectedContents: 0 ..< 50) + } + } + } + + func testMinimalCollection() { + checkCollection(MinimalCollection(0 ..< 50), expectedContents: 0 ..< 50) + } + + func testMinimalBidirectionalCollection() { + checkBidirectionalCollection(MinimalBidirectionalCollection(0 ..< 50), expectedContents: 0 ..< 50) + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeInternals.swift b/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeInternals.swift new file mode 100644 index 00000000..1f4e165e --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeInternals.swift @@ -0,0 +1,83 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import _CollectionsTestSupport +@_spi(Testing) import DequeModule + +internal struct DequeLayout: CustomStringConvertible { + let capacity: Int + let startSlot: Int + let count: Int + let startValue: Int + + init(capacity: Int, startSlot: Int, count: Int, startValue: Int = 0) { + self.capacity = capacity + self.startSlot = startSlot + self.count = count + self.startValue = startValue + } + + var valueRange: Range { startValue ..< startValue + count } + + var description: String { + var result = "DequeLayout(capacity: \(capacity), startSlot: \(startSlot), count: \(count)" + if count > 0 { + result += ", startValue: \(startValue)" + } + result += ")" + return result + } + + var isWrapped: Bool { + startSlot + count > capacity + } +} + +extension Deque { + init(layout: DequeLayout, contents: C) where C.Element == Element { + precondition(contents.count == layout.count) + self.init(_capacity: layout.capacity, startSlot: layout.startSlot, contents: Array(contents)) + } +} + +extension LifetimeTracker { + func deque( + with layout: DequeLayout + ) -> (deque: Deque>, contents: [LifetimeTracked]) { + let contents = self.instances(for: layout.valueRange) + let deque = Deque(layout: layout, contents: contents) + return (deque, contents) + } +} + +func withEveryDeque( + _ label: String, + ofCapacities capacities: C, + startValue: Int = 0, + file: StaticString = #file, line: UInt = #line, + _ body: (DequeLayout) throws -> Void +) rethrows -> Void where C.Element == Int { + // Exhaustive tests for all deque layouts of various capacities + for capacity in capacities { + for startSlot in 0 ..< capacity { + for count in 0 ... capacity { + let layout = DequeLayout( + capacity: capacity, + startSlot: startSlot, + count: count, + startValue: startValue) + let entry = TestContext.current.push("\(label): \(layout)", file: file, line: line) + defer { TestContext.current.pop(entry) } + try body(layout) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeTests.swift b/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeTests.swift new file mode 100644 index 00000000..22227a6f --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/DequeTests/DequeTests.swift @@ -0,0 +1,374 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +import _CollectionsTestSupport +@_spi(Testing) import DequeModule + +final class DequeTests: CollectionTestCase { + func test_testingSPIs() { + let deque = Deque(_capacity: 5, startSlot: 2, contents: [10, 20, 30, 40]) + expectEqual(deque.count, 4) + expectEqual(deque._capacity, 5) + expectEqual(deque._startSlot, 2) + expectEqualElements(deque, [10, 20, 30, 40]) + } + + func test_CollectionConformance() { + checkBidirectionalCollection(Deque(), expectedContents: []) + checkBidirectionalCollection(Deque([1]), expectedContents: [1]) + checkBidirectionalCollection(Deque([1, 2, 3]), expectedContents: [1, 2, 3]) + checkBidirectionalCollection(Deque(0 ..< 10), expectedContents: 0 ..< 10) + + // Exhaustive tests for all deque layouts of various capacities + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withLifetimeTracking { tracker in + let (deque, contents) = tracker.deque(with: layout) + checkBidirectionalCollection(deque, expectedContents: contents) + } + } + } + + func test_ExpressibleByArrayLiteral() { + let deque: Deque = [1, 2, 3, 4] + expectEqual(Array(deque), [1, 2, 3, 4]) + } + + func test_description() { + expectEqual("\([] as Deque)", "[]") + expectEqual("\([1, 2, 3] as Deque)", "[1, 2, 3]") + expectEqual("\([1, 2, nil, 3] as Deque)", "[Optional(1), Optional(2), nil, Optional(3)]") + + let deque: Deque = [1, 2, 3] + expectEqual("\(deque)", "[description(1), description(2), description(3)]") + } + + func test_debugDescription() { + expectEqual(String(reflecting: [] as Deque), + "Deque([])") + expectEqual(String(reflecting: [1, 2, 3] as Deque), + "Deque([1, 2, 3])") + expectEqual(String(reflecting: [1, 2, nil, 3] as Deque), + "Deque>([Optional(1), Optional(2), nil, Optional(3)])") + + let deque: Deque = [1, 2, 3] + expectEqual(String(reflecting: deque), "Deque([debugDescription(1), debugDescription(2), debugDescription(3)])") + } + + func test_customMirror() { + let deque: Deque = [1, 2, 3] + let mirror = Mirror(reflecting: deque) + expectEqual(mirror.displayStyle, .collection) + expectNil(mirror.superclassMirror) + expectTrue(mirror.children.compactMap { $0.label }.isEmpty) // No label + expectEqualElements(mirror.children.map { $0.value as? Int }, deque.map { $0 }) + } + + func test_Equatable_Hashable() { + let c1 = [1, 2, 3, 4] + let c2 = [1, 2] + let equivalenceClasses: [[Deque]] = [ + [ + Deque(_capacity: 4, startSlot: 0, contents: c1), + Deque(_capacity: 6, startSlot: 0, contents: c1), + Deque(_capacity: 4, startSlot: 2, contents: c1), + ], + [ + Deque(_capacity: 2, startSlot: 0, contents: c2), + Deque(_capacity: 6, startSlot: 0, contents: c2), + Deque(_capacity: 2, startSlot: 1, contents: c2), + ], + [ + Deque(), + Deque(_capacity: 0, startSlot: 0, contents: []), + Deque(_capacity: 6, startSlot: 0, contents: []), + Deque(_capacity: 2, startSlot: 1, contents: []), + ], + ] + checkHashable(equivalenceClasses: equivalenceClasses) + } + + func test_Encodable() throws { + let d1: Deque = [] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalEncoder.encode(d1), v1) + + let d2: Deque = [0, 1, 2, 3] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalEncoder.encode(d2), v2) + + try withEveryDeque("deque", ofCapacities: [0, 1, 3]) { layout in + try withLifetimeTracking { tracker in + let (deque, contents) = tracker.deque(with: layout) + let encoded = try MinimalEncoder.encode(deque) + expectEqual(encoded, .array(contents.map { .int($0.payload) })) + } + } + } + + func test_Decodable() throws { + let d1: Deque = [] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalDecoder.decode(v1, as: Deque.self), d1) + + let d2: Deque = [0, 1, 2, 3] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalDecoder.decode(v2, as: Deque.self), d2) + + try withEveryDeque("deque", ofCapacities: [0, 1, 3]) { layout in + let contents = Array(0 ..< layout.count) + let deque = Deque(layout: layout, contents: contents) + let input: MinimalDecoder.Value = .array(contents.map { .int($0) }) + let decoded = try MinimalDecoder.decode(input, as: Deque.self) + expectEqual(decoded, deque) + } + } + + func test_copyToContiguousArray() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withLifetimeTracking { tracker in + let (deque, contents) = tracker.deque(with: layout) + let actual = deque._copyToContiguousArray() + expectEqualElements(actual, contents) + } + } + } + + func test_partial_copyContents() { + // `Deque` supports `_copyContents` invocations with buffer sizes below + // `underestimatedCount`. This isn't a requirement, so the `Collection` + // checker doesn't cover this case. + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("prefix", in: 0 ... layout.count) { prefix in + withLifetimeTracking { tracker in + let (deque, contents) = tracker.deque(with: layout) + + var it: Deque>.Iterator? + let head = Array>( + unsafeUninitializedCapacity: prefix + ) { buffer, count in + (it, count) = deque._copyContents(initializing: buffer) + } + let tail = Array(IteratorSequence(it!)) + expectEqualElements(head, contents.prefix(upTo: prefix)) + expectEqualElements(tail, contents.suffix(from: prefix)) + } + } + } + } + + func test_unsafeUninitializedInitializer_nothrow() { + withEvery("capacity", in: 0 ..< 100) { cap in + withEvery("count", in: [0, cap / 3, cap / 2, 2 * cap / 3, cap] as Set) { count in + withLifetimeTracking { tracker in + let contents = tracker.instances(for: 0 ..< count) + let d1 = Deque>( + unsafeUninitializedCapacity: cap, + initializingWith: { target, c in + expectNotNil(target.baseAddress) + expectEqual(target.count, cap) + expectEqual(c, 0) + contents.withUnsafeBufferPointer { source in + precondition(source.count <= target.count) + target.baseAddress!.initialize( + from: source.baseAddress!, + count: source.count) + } + c = count + }) + expectEqualElements(d1, contents) + } + } + } + } + + struct TestError: Error, Equatable { + let value: Int + init(_ value: Int) { self.value = value } + } + + func test_unsafeUninitializedInitializer_throw() { + func workaroundSR14134(cap: Int, count: Int, tracker: LifetimeTracker) { + // This function works around https://bugs.swift.org/browse/SR-14134 + let contents = tracker.instances(for: 0 ..< count) + expectThrows( + try Deque>( + unsafeUninitializedCapacity: cap, + initializingWith: { target, c in + expectNotNil(target.baseAddress) + expectEqual(target.count, cap) + expectEqual(c, 0) + contents.withUnsafeBufferPointer { source in + precondition(source.count <= target.count) + target.baseAddress!.initialize( + from: source.baseAddress!, + count: source.count) + } + c = count + throw TestError(count) + }) + ) { error in + expectEqual(error as? TestError, TestError(count)) + } + } + + withEvery("capacity", in: 0 ..< 100) { cap in + withEvery("count", in: [0, cap / 3, cap / 2, 2 * cap / 3, cap] as Set) { count in + withLifetimeTracking { tracker in + workaroundSR14134(cap: cap, count: count, tracker: tracker) + } + } + } + } + + func test_popFirst() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents[...].popFirst() + let actual = deque.popFirst() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_prependOne() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extra = tracker.instance(for: layout.count) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(extra, at: 0) + deque.prepend(extra) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_prependManyFromMinimalSequence() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("prependCount", in: 0 ..< 10) { prependCount in + withEvery("underestimatedCount", in: [UnderestimatedCountBehavior.precise, .half, .value(min(1, prependCount))]) { underestimatedCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + prependCount) + let sequence = MinimalSequence(elements: extras, underestimatedCount: underestimatedCount) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extras, at: 0) + deque.prepend(contentsOf: sequence) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_prependManyFromMinimalCollection() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("prependCount", in: 0 ..< 10) { prependCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extra = tracker.instances(for: layout.count ..< layout.count + prependCount) + let minimal = MinimalCollection(extra) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extra, at: 0) + deque.prepend(contentsOf: minimal) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_prependManyFromContiguousArray_asCollection() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("prependCount", in: 0 ..< 10) { prependCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extraRange = layout.count ..< layout.count + prependCount + let extra = ContiguousArray(tracker.instances(for: extraRange)) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extra, at: 0) + deque.prepend(contentsOf: extra) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_prependManyFromContiguousArray_asSequence() { + // This calls the Sequence-based `Deque.prepend` overload, even if + // `elements` happens to be of a Collection type. + func prependSequence( + contentsOf elements: S, + to deque: inout Deque + ) { + deque.prepend(contentsOf: elements) + } + + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("prependCount", in: 0 ..< 10) { prependCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extraRange = layout.count ..< layout.count + prependCount + let extra = ContiguousArray(tracker.instances(for: extraRange)) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extra, at: 0) + prependSequence(contentsOf: extra, to: &deque) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_prependManyFromBridgedArray() { + // https://github.com/apple/swift-collections/issues/27 + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("appendCount", in: 0 ..< 10) { appendCount in + withEvery("isShared", in: [false, true]) { isShared in + var contents: [NSObject] = (0 ..< layout.count).map { _ in NSObject() } + var deque = Deque(layout: layout, contents: contents) + let extra: [NSObject] = (0 ..< appendCount) + .map { _ in NSObject() } + .withUnsafeBufferPointer { buffer in + NSArray(objects: buffer.baseAddress, count: buffer.count) as! [NSObject] + } + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extra, at: 0) + deque.prepend(contentsOf: extra) + expectEquivalentElements(deque, contents, by: ===) + } + } + } + } + } + +} + diff --git a/Carthage/Checkouts/swift-collections/Tests/DequeTests/MutableCollectionTests.swift b/Carthage/Checkouts/swift-collections/Tests/DequeTests/MutableCollectionTests.swift new file mode 100644 index 00000000..1d5ea85d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/DequeTests/MutableCollectionTests.swift @@ -0,0 +1,163 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +import _CollectionsTestSupport +@_spi(Testing) import DequeModule + +final class MutableCollectiontests: CollectionTestCase { + // Note: Most of the test below are exhaustively testing the behavior + // of a particular mutation or query on every possible deque layout + // of a small set of capacities. This helps catching issues that may only + // occur within rare constellations of deque state -- such as when the range + // of occupied slots is wrapped at a particular point. + + func test_subscript_assignment() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ..< layout.count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let replacement = tracker.instance(for: layout.count) + contents[offset] = replacement + withHiddenCopies(if: isShared, of: &deque) { deque in + deque[offset] = replacement + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_subscript_inPlaceMutation() { + func checkMutation( + _ item: inout LifetimeTracked, + tracker: LifetimeTracker, + delta: Int, + file: StaticString = #file, + line: UInt = #line + ) { + expectTrue(isKnownUniquelyReferenced(&item)) + item = tracker.instance(for: item.payload + delta) + } + + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ..< layout.count) { offset in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + // Discard `contents` and recreate it from scratch to make sure its + // elements are uniquely referenced. + contents = tracker.instances(for: 0 ..< layout.count) + + checkMutation(&contents[offset], tracker: tracker, delta: 100) + checkMutation(&deque[offset], tracker: tracker, delta: 100) + + expectEqualElements(deque, contents) + } + } + } + } + + func test_subscript_rangeAssignmentAcrossInstances() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 6]) { layout in + withEveryRange("targetRange", in: 0 ..< layout.count) { targetRange in + let replacementCount = 4 + withEvery("replacementStartSlot", in: 0 ..< replacementCount) { replacementStartSlot in + withEveryRange("sourceRange", in: 0 ..< replacementCount) { sourceRange in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let replacementLayout = DequeLayout( + capacity: replacementCount, + startSlot: replacementStartSlot, + count: replacementCount, + startValue: layout.count) + let (replacementDeque, replacementArray) = tracker.deque(with: replacementLayout) + contents[targetRange] = replacementArray[sourceRange] + withHiddenCopies(if: isShared, of: &deque) { deque in + deque[targetRange] = replacementDeque[sourceRange] + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + } + + func test_subscript_rangeAssignmentWithinTheSameInstance() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEveryRange("targetRange", in: 0 ..< layout.count) { targetRange in + withEveryRange("sourceRange", in: 0 ..< layout.count) { sourceRange in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + contents[targetRange] = contents[sourceRange] + withHiddenCopies(if: isShared, of: &deque) { deque in + deque[targetRange] = deque[sourceRange] + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_swapAt() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("i", in: 0 ..< layout.count) { i in + withEvery("j", in: 0 ..< layout.count) { j in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + contents.swapAt(i, j) + withHiddenCopies(if: isShared, of: &deque) { deque in + deque.swapAt(i, j) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_withContiguousMutableStorageIfAvailable() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, expected) = tracker.deque(with: layout) + let replacement = tracker.instances(for: 100 ..< 100 + layout.count) + let actual: [LifetimeTracked]? = withHiddenCopies(if: isShared, of: &deque) { deque in + deque.withContiguousMutableStorageIfAvailable { buffer in + let result = Array(buffer) + expectEqual(buffer.count, replacement.count, trapping: true) + for i in 0 ..< replacement.count { + buffer[i] = replacement[i] + } + return result + } + } + if let actual = actual { + expectFalse(layout.isWrapped) + expectEqualElements(actual, expected) + expectEqualElements(deque, replacement) + } else { + expectTrue(layout.isWrapped) + } + } + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/DequeTests/RangeReplaceableCollectionTests.swift b/Carthage/Checkouts/swift-collections/Tests/DequeTests/RangeReplaceableCollectionTests.swift new file mode 100644 index 00000000..e6271019 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/DequeTests/RangeReplaceableCollectionTests.swift @@ -0,0 +1,496 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +import _CollectionsTestSupport +@_spi(Testing) import DequeModule + +/// Exhaustive tests for `Deque`'s implementations for `RangeReplaceableCollection` +/// requirements. +final class RangeReplaceableCollectionTests: CollectionTestCase { + // Note: Most of the test below are exhaustively testing the behavior + // of a particular mutation or query on every possible deque layout + // of a small set of capacities. This helps catching issues that may only + // occur within rare constellations of deque state -- such as when the range + // of occupied slots is wrapped at a particular point. + + func test_emptyInitializer() { + let deque = Deque() + expectTrue(deque.isEmpty) + expectEqual(deque.count, 0) + expectEqual(deque.startIndex, deque.endIndex) + expectEqual(deque.distance(from: deque.startIndex, to: deque.endIndex), 0) + expectEqual(Array(deque), []) + } + + func test_singleElement() { + let deque = Deque([42]) + expectFalse(deque.isEmpty) + expectEqual(deque.count, 1) + expectLessThan(deque.startIndex, deque.endIndex) + expectEqual(deque.index(after: deque.startIndex), deque.endIndex) + expectEqual(deque.distance(from: deque.startIndex, to: deque.endIndex), 1) + expectEqual(deque[0], 42) + expectEqual(Array(deque), [42]) + } + + func test_sequenceInitializer() { + withEvery("count", in: [0, 1, 2, 10, 100]) { count in + let ucVariants: [UnderestimatedCountBehavior] = [.precise, .half, .value(min(1, count))] + withEvery("underestimatedCount", in: ucVariants) { underestimatedCount in + withLifetimeTracking { tracker in + let contents = tracker.instances(for: 0 ..< count) + let d1 = Deque(MinimalSequence(elements: contents, underestimatedCount: underestimatedCount)) + expectEqualElements(d1, contents) + } + } + } + } + + func test_sequenceInitializer_ContiguousArray() { + withEvery("count", in: [0, 1, 2, 10, 100]) { count in + withLifetimeTracking { tracker in + let contents = ContiguousArray(tracker.instances(for: 0 ..< count)) + let d1 = Deque(contents) + expectEqualElements(d1, contents) + } + } + } + + func test_sequenceInitializer_bridgedArray() { + // https://github.com/apple/swift-collections/issues/27 + withEvery("count", in: [0, 1, 2, 10, 100]) { count in + let contents: [AnyObject] = (0 ..< count).map { _ in NSObject() } + let array: [AnyObject] = contents.withUnsafeBufferPointer { buffer in + NSArray(objects: buffer.baseAddress, count: buffer.count) as [AnyObject] + } + let deque = Deque(array) + expectEquivalentElements(deque, contents, by: ===) + } + } + + func test_replaceSubrange_withMinimalCollection() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEveryRange("range", in: 0 ..< layout.count) { range in + withEvery("replacementCount", in: [0, 1, 2, 3, 5, 10]) { replacementCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + replacementCount) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.replaceSubrange(range, with: extras) + let minimal = MinimalCollection(extras) + deque.replaceSubrange(range, with: minimal) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_replaceSubrange_withArray() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEveryRange("range", in: 0 ..< layout.count) { range in + withEvery("replacementCount", in: [0, 1, 2, 3, 5, 10]) { replacementCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + replacementCount) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.replaceSubrange(range, with: extras) + deque.replaceSubrange(range, with: extras) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_reserveCapacity() { + // FIXME: Implement + } + + func test_repeatingInitializer() { + withEvery("count", in: 0 ..< 10) { count in + withLifetimeTracking { tracker in + let item = tracker.instance(for: 0) + let deque = Deque(repeating: item, count: count) + expectEqual(Array(deque), Array(repeating: item, count: count)) + } + } + } + + func test_appendOne() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extra = tracker.instance(for: layout.count) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.append(extra) + deque.append(extra) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_appendManyFromMinimalSequence() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("appendCount", in: 0 ..< 10) { appendCount in + withEvery("underestimatedCount", in: [UnderestimatedCountBehavior.precise, .half, .value(min(1, appendCount))]) { underestimatedCount in + withEvery("isContiguous", in: [false, true]) { isContiguous in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + appendCount) + let sequence = MinimalSequence( + elements: extras, + underestimatedCount: underestimatedCount, + isContiguous: isContiguous) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.append(contentsOf: extras) + deque.append(contentsOf: sequence) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + } + + + func test_appendManyFromMinimalCollection() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("appendCount", in: 0 ..< 10) { appendCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extra = tracker.instances(for: layout.count ..< layout.count + appendCount) + let minimal = MinimalCollection(extra) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.append(contentsOf: extra) + deque.append(contentsOf: minimal) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_appendManyFromContiguousArray() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("appendCount", in: 0 ..< 10) { appendCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extraRange = layout.count ..< layout.count + appendCount + let extra = ContiguousArray(tracker.instances(for: extraRange)) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.append(contentsOf: extra) + deque.append(contentsOf: extra) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_appendManyFromBridgedArray() { + // https://github.com/apple/swift-collections/issues/27 + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("appendCount", in: 0 ..< 10) { appendCount in + withEvery("isShared", in: [false, true]) { isShared in + var contents: [NSObject] = (0 ..< layout.count).map { _ in NSObject() } + var deque = Deque(layout: layout, contents: contents) + let extra: [NSObject] = (0 ..< appendCount) + .map { _ in NSObject() } + .withUnsafeBufferPointer { buffer in + NSArray(objects: buffer.baseAddress, count: buffer.count) as! [NSObject] + } + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.append(contentsOf: extra) + deque.append(contentsOf: extra) + expectEquivalentElements(deque, contents, by: ===) + } + } + } + } + } + + func test_insertOneElement() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ... layout.count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extra = tracker.instance(for: layout.count) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(extra, at: offset) + deque.insert(extra, at: offset) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_insertFromMinimalCollection() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ... layout.count) { offset in + withEvery("insertCount", in: 0 ..< 10) { insertCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + insertCount) + let minimal = MinimalCollection(extras) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extras, at: offset) + deque.insert(contentsOf: minimal, at: offset) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_insertFromArray() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ... layout.count) { offset in + withEvery("insertCount", in: 0 ..< 10) { insertCount in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + let extras = tracker.instances(for: layout.count ..< layout.count + insertCount) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.insert(contentsOf: extras, at: offset) + deque.insert(contentsOf: extras, at: offset) + expectEqualElements(deque, contents) + } + } + } + } + } + } + } + + func test_removeOne() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("offset", in: 0 ..< layout.count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents.remove(at: offset) + let actual = deque.remove(at: offset) + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_removeSubrange() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEveryRange("range", in: 0 ..< layout.count) { range in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeSubrange(range) + deque.removeSubrange(range) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_customRemoveLast_one() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents._customRemoveLast() + let actual = deque._customRemoveLast() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_removeLast() { + // `removeLast`'s implementation in the stdlib is derived from `_customRemoveLast`. + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents.removeLast() + let actual = deque.removeLast() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_popLast() { + // `popLast`'s implementation in the stdlib is derived from `_customRemoveLast`. + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents.popLast() + let actual = deque.popLast() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_customRemoveLast_many() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("n", in: 0 ... layout.count) { n in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeLast(n) + expectTrue(deque._customRemoveLast(n)) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_removeLast_many() { + // `removeLast`'s implementation in the stdlib is derived from `_customRemoveLast`. + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("n", in: 0 ... layout.count) { n in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeLast(n) + deque.removeLast(n) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_removeFirst_one() { + // `removeLast`'s implementation in the stdlib is derived from `_customRemoveLast`. + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + let expected = contents.removeFirst() + let actual = deque.removeFirst() + expectEqual(actual, expected) + expectEqualElements(deque, contents) + } + } + } + } + } + + func test_removeFirst_many() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + guard layout.count > 0 else { return } + withEvery("n", in: 0 ... layout.count) { n in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeFirst(n) + deque.removeFirst(n) + expectEqualElements(deque, contents) + } + } + } + } + } + } + + func test_removeAll_discardingCapacity() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + guard layout.count > 0 else { return } + var deque: Deque> = [] + withLifetimeTracking { tracker in + var contents: [LifetimeTracked] = [] + (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeAll() + deque.removeAll() + expectEqual(deque.count, 0) + expectEqual(deque._capacity, 0) // This assumes the empty singleton has zero capacity. + } + } // All elements must be deinitialized at this point. + withExtendedLifetime(deque) {} + } + } + } + + func test_removeAll_keepingCapacity() { + withEveryDeque("deque", ofCapacities: [0, 1, 2, 3, 5, 10]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + guard layout.count > 0 else { return } + var deque: Deque> = [] + withLifetimeTracking { tracker in + var contents: [LifetimeTracked] = [] + (deque, contents) = tracker.deque(with: layout) + withHiddenCopies(if: isShared, of: &deque) { deque in + contents.removeAll(keepingCapacity: true) + deque.removeAll(keepingCapacity: true) + expectEqual(deque.count, 0) + expectEqual(deque._capacity, layout.capacity) + } + } // All elements must be deinitialized at this point. + withExtendedLifetime(deque) {} + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/BitsetTests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/BitsetTests.swift new file mode 100644 index 00000000..9c0da263 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/BitsetTests.swift @@ -0,0 +1,187 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#if DEBUG // These unit tests need access to OrderedSet internals +import XCTest +import _CollectionsTestSupport +@_spi(Testing) @testable import OrderedCollections + +class BitsetTests: CollectionTestCase { + typealias Word = _UnsafeBitset.Word + + func test_empty() { + withEvery("capacity", in: 0 ..< 500) { capacity in + _UnsafeBitset.withTemporaryBitset(capacity: capacity) { bitset in + expectGreaterThanOrEqual(bitset.capacity, capacity) + expectEqual(bitset.count, 0) + expectEqual(bitset._actualCount, 0) + withEvery("i", in: 0 ..< capacity) { i in + expectFalse(bitset.contains(i)) + } + } + } + } + + func test_insert() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withEvery("seed", in: 0 ..< 3) { seed in + var rng = RepeatableRandomNumberGenerator(seed: seed) + let items = (0 ..< capacity).shuffled(using: &rng) + _UnsafeBitset.withTemporaryBitset(capacity: capacity) { bitset in + var c = 0 + withEvery("item", in: items) { item in + expectFalse(bitset.contains(item)) + expectTrue(bitset.insert(item)) + + expectTrue(bitset.contains(item)) + expectFalse(bitset.insert(item)) + + c += 1 + expectEqual(bitset.count, c) + } + } + } + } + } + + func withRandomBitsets( + capacity: Int, + loadFactor: Double, + body: (inout _UnsafeBitset, inout Set) throws -> Void + ) rethrows { + precondition(loadFactor >= 0 && loadFactor <= 1) + try withEvery("seed", in: 0 ..< 10) { seed in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var items = (0 ..< capacity).shuffled(using: &rng) + items.removeLast(Int((1 - loadFactor) * Double(capacity))) + try _UnsafeBitset.withTemporaryBitset(capacity: capacity) { bitset in + for item in items { + bitset.insert(item) + } + var set = Set(items) + try body(&bitset, &set) + } + } + } + + func test_remove() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + var c = contents.count + withEvery("item", in: 0 ..< capacity) { item in + if contents.contains(item) { + expectTrue(bitset.remove(item)) + expectFalse(bitset.contains(item)) + c -= 1 + expectEqual(bitset.count, c) + } else { + expectFalse(bitset.remove(item)) + expectEqual(bitset.count, c) + } + } + expectEqual(bitset.count, 0) + withEvery("item", in: 0 ..< capacity) { item in + expectFalse(bitset.contains(item)) + } + } + } + } + + func test_clear() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + bitset.clear() + expectEqual(bitset.count, 0) + withEvery("item", in: 0 ..< capacity) { item in + expectFalse(bitset.contains(item)) + } + } + } + } + + func test_insertAll_upTo() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + + let cutoff = capacity / 2 + bitset.insertAll(upTo: cutoff) + expectEqual( + bitset.count, + capacity / 2 + contents.lazy.filter { $0 >= cutoff }.count) + withEvery("item", in: 0 ..< capacity) { item in + if item < cutoff { + expectTrue(bitset.contains(item)) + } else { + expectEqual(bitset.contains(item), contents.contains(item)) + } + } + + bitset.insertAll(upTo: capacity) + expectEqual(bitset.count, capacity) + withEvery("item", in: 0 ..< capacity) { item in + expectTrue(bitset.contains(item)) + } + } + } + } + + func test_removeAll_upTo() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + + let cutoff = capacity / 2 + bitset.removeAll(upTo: cutoff) + expectEqual( + bitset.count, + contents.lazy.filter { $0 >= cutoff }.count) + withEvery("item", in: 0 ..< capacity) { item in + if item < cutoff { + expectFalse(bitset.contains(item)) + } else { + expectEqual(bitset.contains(item), contents.contains(item)) + } + } + + bitset.removeAll(upTo: capacity) + expectEqual(bitset.count, 0) + withEvery("item", in: 0 ..< capacity) { item in + expectFalse(bitset.contains(item)) + } + } + } + } + + func test_Sequence() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + expectEqual(bitset.underestimatedCount, contents.count) + let expected = contents.sorted() + var actual: [Int] = [] + actual.reserveCapacity(bitset.count) + for item in bitset { + actual.append(item) + } + expectEqual(actual, expected) + } + } + } + + func test_max() { + withEvery("capacity", in: [16, 64, 100, 128, 1000, 1024]) { capacity in + withRandomBitsets(capacity: capacity, loadFactor: 0.5) { bitset, contents in + let max = bitset.max() + expectEqual(max, contents.max()) + } + } + } + +} +#endif // DEBUG diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/HashTableTests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/HashTableTests.swift new file mode 100644 index 00000000..e3289a5b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/HashTable/HashTableTests.swift @@ -0,0 +1,618 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +#if DEBUG // These unit tests need access to OrderedSet internals +import XCTest +import _CollectionsTestSupport +@_spi(Testing) @testable import OrderedCollections + +class HashTableTests: CollectionTestCase { + typealias Bucket = _HashTable.Bucket + + func test_capacity() { + withEvery("capacity", in: 0 ..< 1000) { capacity in + let scale = _HashTable.scale(forCapacity: capacity) + let maximumCapacity = _HashTable.maximumCapacity(forScale: scale) + let minimumCapacity = _HashTable.minimumCapacity(forScale: scale) + + if scale == 0 { + expectEqual(minimumCapacity, 0) + expectEqual(maximumCapacity, _HashTable.maximumUnhashedCount) + expectGreaterThanOrEqual(maximumCapacity, capacity) + } else { + let bucketCount = 1 &<< scale + expectGreaterThanOrEqual(scale, _HashTable.minimumScale) + expectLessThan(scale, _HashTable.maximumScale) + expectGreaterThanOrEqual(maximumCapacity, capacity) + expectGreaterThan(bucketCount, maximumCapacity) + expectLessThan(minimumCapacity, maximumCapacity) + expectLessThanOrEqual(minimumCapacity, capacity) + expectGreaterThan(minimumCapacity, 0) + } + } + } + + func test_Storage_create() { + let s5 = _HashTable(scale: 5) + expectEqual(s5.header.scale, 5) + expectEqual(s5.header.reservedScale, 0) + expectTrue(s5.description.starts(with: "_HashTable(scale: 5, reservedScale: 0, bias: 0, seed: ")) + expectTrue(s5.header.description.starts(with: "_HashTable.Header(scale: 5, reservedScale: 0, bias: 0, seed: ")) + s5.read { hashTable in + for i in 0 ..< 32 { + let bucket = Bucket(offset: i) + expectNil(hashTable[bucket], "\(bucket.offset)") + } + } + + let s6 = _HashTable(scale: 6) + expectEqual(s6.header.scale, 6) + expectEqual(s6.header.reservedScale, 0) + expectTrue(s6.description.starts(with: "_HashTable(scale: 6, reservedScale: 0, bias: 0, seed: ")) + expectTrue(s6.header.description.starts(with: "_HashTable.Header(scale: 6, reservedScale: 0, bias: 0, seed: ")) + s6.read { hashTable in + for i in 0 ..< 64 { + let bucket = Bucket(offset: i) + expectNil(hashTable[bucket], "\(bucket.offset)") + } + } + + expectNotEqual(s6.header.seed, s5.header.seed) // This is somewhat shaky b/c we're losing address bits + + expectEqual(s5.header.capacity, 24) // 0.75 * 2^5 + expectEqual(s6.header.capacity, 48) // 0.75 * 2^6 + } + + func test_Storage_read() { + let s5 = _HashTable(scale: 5) + s5.read { hashTable in + expectEqual(hashTable.scale, 5) + expectEqual(hashTable.reservedScale, 0) + expectEqual(hashTable.seed, s5.header.seed) + expectTrue(hashTable.description.starts(with: "_HashTable.UnsafeHandle(scale: 5, reservedScale: 0, bias: 0, seed: ")) + } + let s6 = _HashTable(scale: 6) + s6.read { hashTable in + expectEqual(hashTable.scale, 6) + expectEqual(hashTable.reservedScale, 0) + expectEqual(hashTable.seed, s6.header.seed) + expectTrue(hashTable.description.starts(with: "_HashTable.UnsafeHandle(scale: 6, reservedScale: 0, bias: 0, seed: ")) + } + } + + func test_counts() { + let s5 = _HashTable(scale: 5) + s5.read { hashTable in + expectEqual(hashTable.bucketCount, 32) + expectEqual(hashTable.bitCount, 5 * 32) + expectEqual(hashTable.wordCount, 3) // 2.5 rounded up + expectEqual(hashTable.capacity, 24) // 0.75 * 32 + } + let s6 = _HashTable(scale: 6) + s6.read { hashTable in + expectEqual(hashTable.bucketCount, 64) + expectEqual(hashTable.bitCount, 6 * 64) + expectEqual(hashTable.wordCount, 6) + expectEqual(hashTable.capacity, 48) // 0.75 * 64 + } + let s12 = _HashTable(scale: 12) + s12.read { hashTable in + expectEqual(hashTable.bucketCount, 4096) + expectEqual(hashTable.bitCount, 12 * 4096) + expectEqual(hashTable.wordCount, 768) + expectEqual(hashTable.capacity, 3072) // 0.75 * 4096 + } + } + + func test_bucket_after() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + withEvery("offset", in: 0 ..< hashTable.bucketCount) { offset in + let input = Bucket(offset: offset) + let expected = Bucket(offset: offset == hashTable.bucketCount - 1 ? 0 : offset + 1) + let actual = hashTable.bucket(after: input) + expectEqual(actual, expected) + } + } + } + } + func test_bucket_before() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + withEvery("offset", in: 0 ..< hashTable.bucketCount) { offset in + let input = Bucket(offset: offset) + let expected = Bucket(offset: offset == 0 ? hashTable.bucketCount - 1 : offset - 1) + let actual = hashTable.bucket(before: input) + expectEqual(actual, expected) + } + } + } + } + func test_word_after() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + withEvery("input", in: 0 ..< hashTable.wordCount) { input in + let expected = (input == hashTable.wordCount - 1 ? 0 : input + 1) + let actual = hashTable.word(after: input) + expectEqual(actual, expected) + } + } + } + } + func test_word_before() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + withEvery("input", in: 0 ..< hashTable.wordCount) { input in + let expected = (input == 0 ? hashTable.wordCount - 1 : input - 1) + let actual = hashTable.word(before: input) + expectEqual(actual, expected) + } + } + } + } + func test_coordinates_for_bucket() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + withEvery("offset", in: 0 ..< hashTable.bucketCount) { offset in + let (word, bit) = hashTable.position(of: Bucket(offset: offset)) + expectGreaterThanOrEqual(bit, 0) + expectGreaterThanOrEqual(word, 0) + expectLessThan(bit, 64) + expectLessThan(word, hashTable.wordCount) + let pos = 64 * word + bit + expectEqual(pos % scale, 0) + expectEqual(pos / scale, offset) + } + } + } + } + + func test_bucketContents_forValue() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + storage.read { hashTable in + expectEqual(hashTable._bucketContents(for: nil), 0) + expectEqual(hashTable._value(forBucketContents: 0), nil) + withEvery("value", in: 0 ..< hashTable.bucketCount - 1) { value in + let contents = hashTable._bucketContents(for: value) + expectEqual(hashTable._value(forBucketContents: contents), value) + } + } + } + } + + func test_subscript_by_bucket() { + withEvery("scale", in: [5, 6, 12]) { scale in + let storage = _HashTable(scale: scale) + let bucketCount = 1 << scale + let contents: [Int?] = Array(0 ..< bucketCount - 1) + [nil] + storage.update { hashTable in + for offset in 0 ..< bucketCount { + let bucket = Bucket(offset: offset) + hashTable[bucket] = contents[offset] + } + } + storage.read { hashTable in + withEvery("offset", in: 0 ..< bucketCount) { offset in + let bucket = Bucket(offset: offset) + expectEqual(hashTable[bucket], contents[offset]) + } + } + } + } + + /// Create hash table storage of scale `scale`, filled with equal-sized lookup chains + /// of length `chainLength`, separated by holes of length `holeLength`, with the + /// first chain starting at `startOffset`. The chains contain bucket values that + /// sequentially count up from 0. + func sampleTable( + scale: Int, + chainLength: Int, + holeLength: Int, + startingAt startOffset: Int + ) -> (table: _HashTable, contents: [Int?]) { + let bucketCount = 1 << scale + + var contents: [Int?] = [] + contents.reserveCapacity(bucketCount + chainLength + holeLength) + contents.append(contentsOf: repeatElement(nil, count: startOffset)) + var i = 0 + while contents.count < bucketCount { + contents.append(contentsOf: (i ..< i + chainLength).map { $0 }) + i += chainLength + contents.append(contentsOf: repeatElement(nil, count: holeLength)) + } + contents.removeLast(contents.count - bucketCount) + + let storage = _HashTable(scale: scale) + storage.update { hashTable in + for offset in 0 ..< bucketCount { + let bucket = Bucket(offset: offset) + hashTable[bucket] = contents[offset] + } + } + return (storage, contents) + } + + /// Call `body` with a hash table of scale `scale`, filled with equal-sized lookup chains + /// of length `chainLength`, separated by holes of length `holeLength`, with the + /// first chain starting at `startOffset`. The chains contain bucket values that + /// sequentially count up from 0. + func withSampleHashTable( + scale: Int, + chainLength: Int, + holeLength: Int, + startingAt startOffset: Int, + body: (_UnsafeHashTable, [Int?]) throws -> R + ) rethrows -> R { + let (storage, contents) = sampleTable( + scale: scale, + chainLength: chainLength, + holeLength: holeLength, + startingAt: startOffset) + return try storage.update { hashTable in + try body(hashTable, contents) + } + } + + /// Create hash table storage of scale `scale`, filled with a single huge lookup chain + /// of buckets counting sequentially up starting at 0, terminating with the penultimate + /// bucket. The last bucket remains unoccupied. + /// + /// This is useful for testing all possible bucket values. + func sampleTable(scale: Int) -> (table: _HashTable, contents: [Int?]) { + sampleTable(scale: scale, chainLength: (1 << scale) - 1, holeLength: 1, startingAt: 0) + } + + /// Call `body` with a hash table of scale `scale`, filled with a single huge lookup chain + /// of buckets counting sequentially up starting at 0, terminating with the penultimate + /// bucket. The last bucket remains unoccupied. + /// + /// This is useful for testing all possible bucket values. + func withSampleHashTable( + scale: Int, + body: (_UnsafeHashTable, [Int?]) throws -> R + ) rethrows -> R { + let (table, contents) = sampleTable(scale: scale) + return try table.update { hashTable in + try body(hashTable, contents) + } + } + + func test_bucketIterator_read() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withSampleHashTable(scale: scale) { hashTable, contents in + // Start an iterator at the first bucket and cycle through + // all buckets twice, checking the values we see at every step. + let bucket = Bucket(offset: 0) + var it = hashTable.bucketIterator(startingAt: bucket) + expectEqual(it.currentBucket, bucket) + expectEqual(it.isOccupied, contents[bucket.offset] != nil) + expectEqual(it.currentValue, contents[bucket.offset]) + withEvery("iteration", in: 0 ..< 2) { iteration in + var c = hashTable.bucketCount + if iteration == 1 { c /= 2 } // Don't let advance() trap + withEvery("offset", in: 0 ..< c) { offset in + let expected = contents[offset] + expectEqual(it.currentBucket, Bucket(offset: offset)) + expectEqual(it.isOccupied, expected != nil) + expectEqual(it.currentValue, expected) + it.advance() + } + } + } + } + } + + func test_bucketIterator_read_with_holes() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withEvery("chainLength", in: [1, 2, 3, 4]) { chainLength in + withEvery("holeLength", in: [1, 2, 3]) { holeLength in + withEvery("startOffset", in: 0 ... chainLength) { startOffset in + withSampleHashTable( + scale: scale, + chainLength: chainLength, + holeLength: holeLength, + startingAt: startOffset + ) { hashTable, contents in + // Start an iterator at the first bucket and cycle through + // all buckets twice, checking the values we see at every step. + let bucket = Bucket(offset: 0) + var it = hashTable.bucketIterator(startingAt: bucket) + expectEqual(it.currentBucket, bucket) + expectEqual(it.isOccupied, contents[bucket.offset] != nil) + expectEqual(it.currentValue, contents[bucket.offset]) + withEvery("iteration", in: 0 ..< 2) { iteration in + var c = hashTable.bucketCount + if iteration == 1 { c /= 2 } // Don't let advance() trap + withEvery("offset", in: 0 ..< c) { offset in + let expected = contents[offset] + expectEqual(it.currentBucket, Bucket(offset: offset)) + expectEqual(it.isOccupied, expected != nil) + expectEqual(it.currentValue, expected) + it.advance() + } + } + } + } + } + } + } + } + + func test_bucketIterator_start_in_middle() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withSampleHashTable(scale: scale) { hashTable, contents in + var expected = hashTable.bucketIterator(startingAt: Bucket(offset: 0)) + // Start a new iterator at every bucket and check that its initial + // state is match exactly what we'd get by starting at the first + // bucket and advancing step by step to the same position. + withEvery("start", in: 0 ..< hashTable.bucketCount) { start in + let bucket = Bucket(offset: start) + let actual = hashTable.bucketIterator(startingAt: bucket) + + expectEqual(expected.currentBucket, bucket) + expectEqual(expected.currentValue, contents[start]) + + expectEqual(actual.currentBucket, bucket) + expectEqual(actual.currentValue, contents[start]) + + expectEqual(actual._currentBucket, expected._currentBucket) + expectEqual(actual._currentRawValue, expected._currentRawValue) + expectEqual(actual._nextBits, expected._nextBits) + expectEqual(actual._remainingBitCount, expected._remainingBitCount) + + expected.advance() + } + } + } + } + + func test_bucketIterator_start_in_middle_with_holes() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withEvery("chainLength", in: [1, 2, 3, 4]) { chainLength in + withEvery("holeLength", in: [1, 2, 3]) { holeLength in + withEvery("startOffset", in: 0 ... chainLength) { startOffset in + withSampleHashTable( + scale: scale, + chainLength: chainLength, + holeLength: holeLength, + startingAt: startOffset + ) { hashTable, contents in + var expected = hashTable.bucketIterator(startingAt: Bucket(offset: 0)) + // Start a new iterator at every bucket and check that its initial + // state is match exactly what we'd get by starting at the first + // bucket and advancing step by step to the same position. + withEvery("start", in: 0 ..< hashTable.bucketCount) { start in + let bucket = Bucket(offset: start) + let actual = hashTable.bucketIterator(startingAt: bucket) + + expectEqual(expected.currentBucket, bucket) + expectEqual(expected.currentValue, contents[start]) + + expectEqual(actual.currentBucket, bucket) + expectEqual(actual.currentValue, contents[start]) + + expectEqual(actual._currentBucket, expected._currentBucket) + expectEqual(actual._currentRawValue, expected._currentRawValue) + expectEqual(actual._nextBits, expected._nextBits) + expectEqual(actual._remainingBitCount, expected._remainingBitCount) + + expected.advance() + } + } + } + } + } + } + } + + func test_bucketIterator_advance_until() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withEvery("chainLength", in: [1, 2, 3, 4]) { chainLength in + withEvery("holeLength", in: [1, 2, 3]) { holeLength in + withEvery("startOffset", in: 0 ... chainLength) { startOffset in + withSampleHashTable( + scale: scale, + chainLength: chainLength, + holeLength: holeLength, + startingAt: startOffset + ) { hashTable, contents in + var offset = 0 + var it = hashTable.bucketIterator(startingAt: Bucket(offset: offset)) + let step = 2 + + for _ in 0 ..< hashTable.bucketCount { + if let value = contents[offset] { + // `advance(until:)` should not move if we're already on the right value. + it.advance(until: value) + expectEqual(it.currentBucket.offset, offset) + + // `advance(until:)` should stop when it find the value we're looking for, + // or at the next hole, whichever comes first. + it.advance(until: value + step) + expectTrue(it.currentValue == nil || it.currentValue == value + step) + var o = offset + while true { + o += 1 + if o == contents.count { o = 0 } + if o == it.currentBucket.offset { break } + expectNotNil(contents[o]) + } + offset = o + } else { + // `advance(until:)` should not move if we're on a hole. + it.advance(until: 0) + expectEqual(it.currentBucket.offset, offset) + + // Move to the next bucket. + offset += 1 + if offset == contents.count { offset = 0 } + it.advance() + } + } + } + } + } + } + } + } + + func test_bucketIterator_advance_toNextUnoccupiedBucket() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withEvery("chainLength", in: [1, 2, 3, 4]) { chainLength in + withEvery("holeLength", in: [1, 2, 3]) { holeLength in + withEvery("startOffset", in: 0 ... chainLength) { startOffset in + withSampleHashTable( + scale: scale, + chainLength: chainLength, + holeLength: holeLength, + startingAt: startOffset + ) { hashTable, contents in + var offset = 0 + var it = hashTable.bucketIterator(startingAt: Bucket(offset: offset)) + + let holeCount = contents.reduce(into: 0) { count, item in + if item == nil { count += 1 } + } + + for _ in 0 ..< holeCount * 3 / 2 { + if contents[offset] != nil { + it.advanceToNextUnoccupiedBucket() + + expectNil(it.currentValue) + + while contents[offset] != nil { + offset += 1 + if offset == contents.count { offset = 0 } + } + expectEqual(it.currentBucket.offset, offset) + } else { + // `advanceToNextUnoccupiedBucket()` should not move if we're already on a hole. + it.advanceToNextUnoccupiedBucket() + expectEqual(it.currentBucket.offset, offset) + + // Move to the next bucket. + offset += 1 + if offset == contents.count { offset = 0 } + it.advance() + } + } + } + } + } + } + } + } + + func test_bucketIterator_write() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + withSampleHashTable(scale: scale) { hashTable, contents in + let storage = _HashTable(scale: scale) + let bucketCount = 1 << scale + let contents: [Int?] = Array(0 ..< bucketCount - 1) + [nil] + storage.update { hashTable in + // Start an iterator at the first bucket and cycle through + // all buckets, updating values at every step. + let bucket = Bucket(offset: 0) + var it = hashTable.bucketIterator(startingAt: bucket) + withEvery("writeOffset", in: 0 ..< contents.count) { writeOffset in + it.currentValue = contents[writeOffset] + it.advance() + } + // Cycle through one more time, verifying that contents match. + it = hashTable.bucketIterator(startingAt: bucket) + withEvery("readOffset", in: 0 ..< contents.count) { readOffset in + expectEqual(it.currentValue, contents[readOffset]) + it.advance() + } + } + } + } + } + + func test_Storage_copy() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + let (s1, contents) = sampleTable(scale: scale) + let s2 = s1.copy() + s1.read { original in + s2.read { copy in + expectEqual(copy.scale, original.scale) + expectEqual(copy.reservedScale, original.reservedScale) + expectEqual(copy.seed, original.seed) + var it = copy.bucketIterator(startingAt: Bucket(offset: 0)) + withEvery("offset", in: 0 ..< contents.count) { offset in + expectEqual(it.currentValue, contents[offset]) + it.advance() + } + } + } + } + } + + func test_bias() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + let (storage, contents) = sampleTable(scale: scale) + withEvery("bias", in: [0, 1, -1, 2, -2, 30, -30]) { bias in + storage.update { hashTable in hashTable.bias = bias } + storage.read { hashTable in + var it = hashTable.bucketIterator(startingAt: Bucket(offset: 0)) + repeat { + if let v = contents[it.currentBucket.offset] { + let m = hashTable.bucketCount - 1 + var expected = (v + bias) % m + if expected < 0 { expected += m } + expectEqual(it.currentValue, expected) + } else { + expectNil(it.currentValue) + } + it.advance() + } while it.currentBucket.offset != 0 + } + } + } + } + + func test_rawSubscript() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + let (storage, contents) = sampleTable(scale: scale) + storage.read { hashTable in + var bucket = Bucket(offset: 0) + repeat { + let expected = hashTable._bucketContents(for: contents[bucket.offset]) + expectEqual(hashTable[raw: bucket], expected) + bucket = hashTable.bucket(after: bucket) + } while bucket.offset != 0 + } + } + } + + func test_isOccupied() { + withEvery("scale", in: [5, 6, 7, 8, 12]) { scale in + let (storage, contents) = sampleTable(scale: scale) + storage.read { hashTable in + var bucket = Bucket(offset: 0) + repeat { + expectEqual(hashTable.isOccupied(bucket), contents[bucket.offset] != nil) + bucket = hashTable.bucket(after: bucket) + } while bucket.offset != 0 + } + } + } + +} + +#endif diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Tests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Tests.swift new file mode 100644 index 00000000..2ede2d57 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Tests.swift @@ -0,0 +1,1364 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +@_spi(Testing) import OrderedCollections + +import _CollectionsTestSupport + +class OrderedDictionaryTests: CollectionTestCase { + func test_empty() { + let d = OrderedDictionary() + expectEqualElements(d, []) + expectEqual(d.count, 0) + } + + func test_init_minimumCapacity() { + let d = OrderedDictionary(minimumCapacity: 1000) + expectGreaterThanOrEqual(d.keys.__unstable.capacity, 1000) + expectGreaterThanOrEqual(d.values.elements.capacity, 1000) + expectEqual(d.keys.__unstable.reservedScale, 0) + } + + func test_init_minimumCapacity_persistent() { + let d = OrderedDictionary(minimumCapacity: 1000, persistent: true) + expectGreaterThanOrEqual(d.keys.__unstable.capacity, 1000) + expectGreaterThanOrEqual(d.values.elements.capacity, 1000) + expectNotEqual(d.keys.__unstable.reservedScale, 0) + } + + func test_uniqueKeysWithValues_Dictionary() { + let items: Dictionary = [ + "zero": 0, + "one": 1, + "two": 2, + "three": 3, + ] + let d = OrderedDictionary(uncheckedUniqueKeysWithValues: items) + expectEqualElements(d, items) + } + + func test_uniqueKeysWithValues_labeled_tuples() { + let items: KeyValuePairs = [ + "zero": 0, + "one": 1, + "two": 2, + "three": 3, + ] + let d = OrderedDictionary(uncheckedUniqueKeysWithValues: items) + expectEqualElements(d, items) + } + + func test_uniqueKeysWithValues_unlabeled_tuples() { + let items: [(String, Int)] = [ + ("zero", 0), + ("one", 1), + ("two", 2), + ("three", 3), + ] + let d = OrderedDictionary(uncheckedUniqueKeysWithValues: items) + expectEqualElements(d, items) + } + + func test_uniqueKeys_values() { + let d = OrderedDictionary( + uncheckedUniqueKeys: ["zero", "one", "two", "three"], + values: [0, 1, 2, 3]) + expectEqualElements(d, [ + (key: "zero", value: 0), + (key: "one", value: 1), + (key: "two", value: 2), + (key: "three", value: 3), + ]) + } + + func test_uniquing_initializer_labeled_tuples() { + let items: KeyValuePairs = [ + "a": 1, + "b": 1, + "c": 1, + "a": 2, + "a": 2, + "b": 1, + "d": 3, + ] + let d = OrderedDictionary(items, uniquingKeysWith: +) + expectEqualElements(d, [ + (key: "a", value: 5), + (key: "b", value: 2), + (key: "c", value: 1), + (key: "d", value: 3) + ]) + } + + func test_uniquing_initializer_unlabeled_tuples() { + let items: [(String, Int)] = [ + ("a", 1), + ("b", 1), + ("c", 1), + ("a", 2), + ("a", 2), + ("b", 1), + ("d", 3), + ] + let d = OrderedDictionary(items, uniquingKeysWith: +) + expectEqualElements(d, [ + (key: "a", value: 5), + (key: "b", value: 2), + (key: "c", value: 1), + (key: "d", value: 3) + ]) + } + + func test_grouping_initializer() { + let items: [String] = [ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "ten" + ] + let d = OrderedDictionary>( + grouping: items, by: { $0.count }) + expectEqualElements(d, [ + (key: 3, value: ["one", "two", "six", "ten"]), + (key: 5, value: ["three", "seven", "eight"]), + (key: 4, value: ["four", "five", "nine"]), + ] as [(key: Int, value: ContiguousArray)]) + } + + func test_grouping_initializer_inference() { + struct StatEvent: Equatable { + var name: String + var date: String + var hours: Int + } + + let statEvents = [ + StatEvent(name: "lunch", date: "01-01-2015", hours: 1), + StatEvent(name: "dinner", date: "01-01-2015", hours: 1), + StatEvent(name: "dinner", date: "01-01-2015", hours: 1), + StatEvent(name: "lunch", date: "01-01-2015", hours: 1), + StatEvent(name: "dinner", date: "01-01-2015", hours: 1) + ] + + // We expect this to be inferred to `OrderedDictionary` + let d = OrderedDictionary(grouping: statEvents, by: { $0.name }) + let expected = [ + (key: "lunch", value: [statEvents[0], statEvents[3]]), + (key: "dinner", value: [statEvents[1], statEvents[2], statEvents[4]]), + ] + expectEqualElements(d, expected) + } + + + func test_uncheckedUniqueKeysWithValues_labeled_tuples() { + let items: KeyValuePairs = [ + "zero": 0, + "one": 1, + "two": 2, + "three": 3, + ] + let d = OrderedDictionary(uncheckedUniqueKeysWithValues: items) + expectEqualElements(d, items) + } + + func test_uncheckedUniqueKeysWithValues_unlabeled_tuples() { + let items: [(String, Int)] = [ + ("zero", 0), + ("one", 1), + ("two", 2), + ("three", 3), + ] + let d = OrderedDictionary(uncheckedUniqueKeysWithValues: items) + expectEqualElements(d, items) + } + + func test_uncheckedUniqueKeys_values() { + let d = OrderedDictionary( + uncheckedUniqueKeys: ["zero", "one", "two", "three"], + values: [0, 1, 2, 3]) + expectEqualElements(d, [ + (key: "zero", value: 0), + (key: "one", value: 1), + (key: "two", value: 2), + (key: "three", value: 3), + ]) + } + + func test_ExpressibleByDictionaryLiteral() { + let d0: OrderedDictionary = [:] + expectTrue(d0.isEmpty) + + let d1: OrderedDictionary = [ + "one": 1, + "two": 2, + "three": 3, + "four": 4, + ] + expectEqualElements(d1.map { $0.key }, ["one", "two", "three", "four"]) + expectEqualElements(d1.map { $0.value }, [1, 2, 3, 4]) + } + + func test_keys() { + let d: OrderedDictionary = [ + "one": 1, + "two": 2, + "three": 3, + "four": 4, + ] + expectEqual(d.keys, ["one", "two", "three", "four"] as OrderedSet) + } + + func test_counts() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, _) = tracker.orderedDictionary(keys: 0 ..< count) + expectEqual(d.isEmpty, count == 0) + expectEqual(d.count, count) + expectEqual(d.underestimatedCount, count) + } + } + } + + func test_index_forKey() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEvery("offset", in: 0 ..< count) { offset in + expectEqual(d.index(forKey: reference[offset].key), offset) + } + expectNil(d.index(forKey: tracker.instance(for: -1))) + expectNil(d.index(forKey: tracker.instance(for: count))) + } + } + } + + func test_subscript_getter() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEvery("offset", in: 0 ..< count) { offset in + expectEqual(d[reference[offset].key], reference[offset].value) + } + expectNil(d[tracker.instance(for: -1)]) + expectNil(d[tracker.instance(for: count)]) + } + } + } + + func test_subscript_setter_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d[reference[offset].key] = replacement + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_subscript_setter_remove() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d[reference[offset].key] = nil + reference.remove(at: offset) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_subscript_setter_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d[keys[offset]] = values[offset] + expectEqualElements(d, reference.prefix(offset + 1)) + } + } + } + } + } + } + + func test_subscript_setter_noop() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let key = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d[key] = nil + } + expectEqualElements(d, reference) + } + } + } + } + + func mutate( + _ value: inout T, + _ body: (inout T) throws -> R + ) rethrows -> R { + try body(&value) + } + + func test_subscript_modify_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + mutate(&d[reference[offset].key]) { $0 = replacement } + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_subscript_modify_remove() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = reference[offset].key + mutate(&d[key]) { v in + expectEqual(v, reference[offset].value) + v = nil + } + reference.remove(at: offset) + } + } + } + } + } + } + + func test_subscript_modify_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + mutate(&d[keys[offset]]) { v in + expectNil(v) + v = values[offset] + } + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.prefix(offset + 1)) + } + } + } + } + } + } + + func test_subscript_modify_noop() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let key = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + mutate(&d[key]) { v in + expectNil(v) + v = nil + } + } + expectEqualElements(d, reference) + } + } + } + } + + func test_defaulted_subscript_getter() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let fallback = tracker.instance(for: -1) + withEvery("offset", in: 0 ..< count) { offset in + let key = reference[offset].key + expectEqual(d[key, default: fallback], reference[offset].value) + } + expectEqual( + d[tracker.instance(for: -1), default: fallback], + fallback) + expectEqual( + d[tracker.instance(for: count), default: fallback], + fallback) + } + } + } + } + + func test_defaulted_subscript_modify_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + let fallback = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = reference[offset].key + mutate(&d[key, default: fallback]) { v in + expectEqual(v, reference[offset].value) + v = replacement + } + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_defaulted_subscript_modify_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + let fallback = tracker.instance(for: -1) + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = keys[offset] + mutate(&d[key, default: fallback]) { v in + expectEqual(v, fallback) + v = values[offset] + } + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.prefix(offset + 1)) + } + } + } + } + } + } + + func test_updateValue_forKey_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = reference[offset].key + let old = d.updateValue(replacement, forKey: key) + expectEqual(old, reference[offset].value) + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_updateValue_forKey_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = keys[offset] + let old = d.updateValue(values[offset], forKey: key) + expectNil(old) + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.prefix(offset + 1)) + } + } + } + } + } + } + + func test_updateValue_forKey_insertingAt_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = reference[offset].key + let (old, index) = + d.updateValue(replacement, forKey: key, insertingAt: 0) + expectEqual(old, reference[offset].value) + expectEqual(index, offset) + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_updateValue_forKey_insertingAt_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = keys[count - 1 - offset] + let value = values[count - 1 - offset] + let (old, index) = + d.updateValue(value, forKey: key, insertingAt: 0) + expectNil(old) + expectEqual(index, 0) + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.suffix(offset + 1)) + } + } + } + } + } + } + + func test_updateValue_forKey_default_closure_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + let fallback = tracker.instance(for: -2) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = reference[offset].key + d.updateValue(forKey: key, default: fallback) { value in + expectEqual(value, reference[offset].value) + value = replacement + } + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_updateValue_forKey_default_closure_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + let fallback = tracker.instance(for: -2) + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let key = keys[offset] + d.updateValue(forKey: key, default: fallback) { value in + expectEqual(value, fallback) + value = values[offset] + } + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.prefix(offset + 1)) + } + } + } + } + } + } + + func test_updateValue_forKey_insertingDefault_at_closure_update() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + let fallback = tracker.instance(for: -2) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let (key, value) = reference[offset] + d.updateValue(forKey: key, insertingDefault: fallback, at: 0) { v in + expectEqual(v, value) + v = replacement + } + reference[offset].value = replacement + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_updateValue_forKey_insertingDefault_at_closure_insert() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + let keys = tracker.instances(for: 0 ..< count) + let values = tracker.instances(for: (0 ..< count).map { 100 + $0 }) + let reference = zip(keys, values).map { (key: $0.0, value: $0.1) } + var d: OrderedDictionary, LifetimeTracked> = [:] + let fallback = tracker.instance(for: -2) + withEvery("offset", in: 0 ..< count) { offset in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let (key, value) = reference[count - 1 - offset] + d.updateValue(forKey: key, insertingDefault: fallback, at: 0) { v in + expectEqual(v, fallback) + v = value + } + expectEqual(d.count, offset + 1) + expectEqualElements(d, reference.suffix(offset + 1)) + } + } + } + } + } + } + + func test_removeValue_forKey() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let (key, value) = reference.remove(at: offset) + let actual = d.removeValue(forKey: key) + expectEqual(actual, value) + + expectEqualElements(d, reference) + expectNil(d.removeValue(forKey: key)) + } + } + } + } + } + } + + func test_merge_labeled_tuple() { + var d: OrderedDictionary = [ + "one": 1, + "two": 1, + "three": 1, + ] + + let items: KeyValuePairs = [ + "one": 1, + "one": 1, + "three": 1, + "four": 1, + "one": 1, + ] + + d.merge(items, uniquingKeysWith: +) + + expectEqualElements(d, [ + "one": 4, + "two": 1, + "three": 2, + "four": 1, + ] as KeyValuePairs) + } + + func test_merge_unlabeled_tuple() { + var d: OrderedDictionary = [ + "one": 1, + "two": 1, + "three": 1, + ] + + let items: [(String, Int)] = [ + ("one", 1), + ("one", 1), + ("three", 1), + ("four", 1), + ("one", 1), + ] + + d.merge(items, uniquingKeysWith: +) + + expectEqualElements(d, [ + "one": 4, + "two": 1, + "three": 2, + "four": 1, + ] as KeyValuePairs) + } + + func test_merging_labeled_tuple() { + let d: OrderedDictionary = [ + "one": 1, + "two": 1, + "three": 1, + ] + + let items: KeyValuePairs = [ + "one": 1, + "one": 1, + "three": 1, + "four": 1, + "one": 1, + ] + + let d2 = d.merging(items, uniquingKeysWith: +) + + expectEqualElements(d, [ + "one": 1, + "two": 1, + "three": 1, + ] as KeyValuePairs) + + expectEqualElements(d2, [ + "one": 4, + "two": 1, + "three": 2, + "four": 1, + ] as KeyValuePairs) + } + + func test_merging_unlabeled_tuple() { + let d: OrderedDictionary = [ + "one": 1, + "two": 1, + "three": 1, + ] + + let items: [(String, Int)] = [ + ("one", 1), + ("one", 1), + ("three", 1), + ("four", 1), + ("one", 1), + ] + + let d2 = d.merging(items, uniquingKeysWith: +) + + expectEqualElements(d, [ + "one": 1, + "two": 1, + "three": 1, + ] as KeyValuePairs) + + expectEqualElements(d2, [ + "one": 4, + "two": 1, + "three": 2, + "four": 1, + ] as KeyValuePairs) + } + + func test_filter() { + let items = (0 ..< 100).map { ($0, 100 * $0) } + let d = OrderedDictionary(uniqueKeysWithValues: items) + + var c = 0 + let d2 = d.filter { item in + c += 1 + expectEqual(item.value, 100 * item.key) + return item.key.isMultiple(of: 2) + } + expectEqual(c, 100) + expectEqualElements(d, items) + + expectEqualElements(d2, (0 ..< 50).compactMap { key in + return (key: 2 * key, value: 200 * key) + }) + } + + func test_mapValues() { + let items = (0 ..< 100).map { ($0, 100 * $0) } + let d = OrderedDictionary(uniqueKeysWithValues: items) + + var c = 0 + let d2 = d.mapValues { value -> String in + c += 1 + expectTrue(value.isMultiple(of: 100)) + return "\(value)" + } + expectEqual(c, 100) + expectEqualElements(d, items) + + expectEqualElements(d2, (0 ..< 100).compactMap { key in + (key: key, value: "\(100 * key)") + }) + } + + func test_compactMapValue() { + let items = (0 ..< 100).map { ($0, 100 * $0) } + let d = OrderedDictionary(uniqueKeysWithValues: items) + + var c = 0 + let d2 = d.compactMapValues { value -> String? in + c += 1 + guard value.isMultiple(of: 200) else { return nil } + expectTrue(value.isMultiple(of: 100)) + return "\(value)" + } + expectEqual(c, 100) + expectEqualElements(d, items) + + expectEqualElements(d2, (0 ..< 50).map { key in + (key: 2 * key, value: "\(200 * key)") + }) + } + + func test_CustomStringConvertible() { + let a: OrderedDictionary = [:] + expectEqual(a.description, "[:]") + + let b: OrderedDictionary = [0: 1] + expectEqual(b.description, "[0: 1]") + + let c: OrderedDictionary = [0: 1, 2: 3, 4: 5] + expectEqual(c.description, "[0: 1, 2: 3, 4: 5]") + } + + func test_CustomDebugStringConvertible() { + let a: OrderedDictionary = [:] + expectEqual(a.debugDescription, + "OrderedDictionary([:])") + + let b: OrderedDictionary = [0: 1] + expectEqual(b.debugDescription, + "OrderedDictionary([0: 1])") + + let c: OrderedDictionary = [0: 1, 2: 3, 4: 5] + expectEqual(c.debugDescription, + "OrderedDictionary([0: 1, 2: 3, 4: 5])") + } + + func test_customReflectable() { + do { + let d: OrderedDictionary = [1: 2, 3: 4, 5: 6] + let mirror = Mirror(reflecting: d) + expectEqual(mirror.displayStyle, .dictionary) + expectNil(mirror.superclassMirror) + expectTrue(mirror.children.compactMap { $0.label }.isEmpty) // No label + expectEqualElements( + mirror.children.compactMap { $0.value as? (key: Int, value: Int) }, + d.map { $0 }) + } + } + + func test_Equatable_Hashable() { + let samples: [[OrderedDictionary]] = [ + [[:], [:]], + [[1: 100], [1: 100]], + [[2: 200], [2: 200]], + [[3: 300], [3: 300]], + [[100: 1], [100: 1]], + [[1: 1], [1: 1]], + [[100: 100], [100: 100]], + [[1: 100, 2: 200], [1: 100, 2: 200]], + [[2: 200, 1: 100], [2: 200, 1: 100]], + [[1: 100, 2: 200, 3: 300], [1: 100, 2: 200, 3: 300]], + [[2: 200, 1: 100, 3: 300], [2: 200, 1: 100, 3: 300]], + [[3: 300, 2: 200, 1: 100], [3: 300, 2: 200, 1: 100]], + [[3: 300, 1: 100, 2: 200], [3: 300, 1: 100, 2: 200]] + ] + checkHashable(equivalenceClasses: samples) + } + + func test_Encodable() throws { + let d1: OrderedDictionary = [:] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalEncoder.encode(d1), v1) + + let d2: OrderedDictionary = [0: 1] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1)]) + expectEqual(try MinimalEncoder.encode(d2), v2) + + let d3: OrderedDictionary = [0: 1, 2: 3] + let v3: MinimalEncoder.Value = + .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalEncoder.encode(d3), v3) + + let d4 = OrderedDictionary( + uniqueKeys: 0 ..< 100, + values: (0 ..< 100).map { 100 * $0 }) + let v4: MinimalEncoder.Value = + .array((0 ..< 100).flatMap { [.int($0), .int(100 * $0)] }) + expectEqual(try MinimalEncoder.encode(d4), v4) + } + + func test_Decodable() throws { + typealias OD = OrderedDictionary + let d1: OD = [:] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalDecoder.decode(v1, as: OD.self), d1) + + let d2: OD = [0: 1] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1)]) + expectEqual(try MinimalDecoder.decode(v2, as: OD.self), d2) + + let d3: OD = [0: 1, 2: 3] + let v3: MinimalEncoder.Value = + .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalDecoder.decode(v3, as: OD.self), d3) + + let d4 = OrderedDictionary( + uniqueKeys: 0 ..< 100, + values: (0 ..< 100).map { 100 * $0 }) + let v4: MinimalEncoder.Value = + .array((0 ..< 100).flatMap { [.int($0), .int(100 * $0)] }) + expectEqual(try MinimalDecoder.decode(v4, as: OD.self), d4) + + let v5: MinimalEncoder.Value = .array([.int(0), .int(1), .int(2)]) + expectThrows(try MinimalDecoder.decode(v5, as: OD.self)) { error in + guard case DecodingError.dataCorrupted(let context) = error else { + expectFailure("Unexpected error \(error)") + return + } + expectEqual(context.debugDescription, + "Unkeyed container reached end before value in key-value pair") + + } + + let v6: MinimalEncoder.Value = .array([.int(0), .int(1), .int(0), .int(2)]) + expectThrows(try MinimalDecoder.decode(v6, as: OD.self)) { error in + guard case DecodingError.dataCorrupted(let context) = error else { + expectFailure("Unexpected error \(error)") + return + } + expectEqual(context.debugDescription, "Duplicate key at offset 2") + } + } + + func test_swapAt() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("i", in: 0 ..< count) { i in + withEvery("j", in: 0 ..< count) { j in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + reference.swapAt(i, j) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.swapAt(i, j) + expectEqualElements(d, reference) + expectEqual(d[reference[i].key], reference[i].value) + expectEqual(d[reference[j].key], reference[j].value) + } + } + } + } + } + } + } + + func test_partition() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + let expectedPivot = reference.partition { $0.key.payload < count / 2 } + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actualPivot = d.partition { $0.key.payload < count / 2 } + expectEqual(actualPivot, expectedPivot) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_sort() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + reference.sort(by: { $0.key < $1.key }) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.sort() + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_sort_by() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + reference.sort(by: { $0.key > $1.key }) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.sort(by: { $0.key > $1.key }) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_shuffle() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withEvery("seed", in: 0 ..< 10) { seed in + var d = OrderedDictionary( + uniqueKeys: 0 ..< count, + values: 100 ..< 100 + count) + var items = (0 ..< count).map { (key: $0, value: 100 + $0) } + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + expectEqualElements(d, items) + + var rng1 = RepeatableRandomNumberGenerator(seed: seed) + items.shuffle(using: &rng1) + + var rng2 = RepeatableRandomNumberGenerator(seed: seed) + d.shuffle(using: &rng2) + + items.sort(by: { $0.key < $1.key }) + d.sort() + expectEqualElements(d, items) + } + } + } + if count >= 2 { + // Check that shuffling with the system RNG does permute the elements. + var d = OrderedDictionary( + uniqueKeys: 0 ..< count, + values: 100 ..< 100 + count) + let original = d + var success = false + for _ in 0 ..< 1000 { + d.shuffle() + if !d.elementsEqual( + original, + by: { $0.key == $1.key && $0.value == $1.value} + ) { + success = true + break + } + } + expectTrue(success) + } + } + } + + func test_reverse() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + reference.reverse() + d.reverse() + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeAll() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, _) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeAll() + expectEqual(d.keys.__unstable.scale, 0) + expectEqualElements(d, []) + } + } + } + } + } + + func test_removeAll_keepCapacity() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, _) = tracker.orderedDictionary(keys: 0 ..< count) + let origScale = d.keys.__unstable.scale + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeAll(keepingCapacity: true) + expectEqual(d.keys.__unstable.scale, origScale) + expectEqualElements(d, []) + } + } + } + } + } + + func test_remove_at() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.remove(at: offset) + let expectedItem = reference.remove(at: offset) + expectEqual(actual.key, expectedItem.key) + expectEqual(actual.value, expectedItem.value) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeSubrange() { + withEvery("count", in: 0 ..< 30) { count in + withEveryRange("range", in: 0 ..< count) { range in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeSubrange(range) + reference.removeSubrange(range) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeSubrange_rangeExpression() { + let d = OrderedDictionary(uniqueKeys: 0 ..< 30, values: 100 ..< 130) + let item = (0 ..< 30).map { (key: $0, value: 100 + $0) } + + var d1 = d + d1.removeSubrange(...10) + expectEqualElements(d1, item[11...]) + + var d2 = d + d2.removeSubrange(..<10) + expectEqualElements(d2, item[10...]) + + var d3 = d + d3.removeSubrange(10...) + expectEqualElements(d3, item[0 ..< 10]) + } + + func test_removeLast() { + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< 30) + withEvery("i", in: 0 ..< d.count) { i in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.removeLast() + let ref = reference.removeLast() + expectEqual(actual.key, ref.key) + expectEqual(actual.value, ref.value) + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeFirst() { + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< 30) + withEvery("i", in: 0 ..< d.count) { i in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.removeFirst() + let expected = reference.removeFirst() + expectEqual(actual.key, expected.key) + expectEqual(actual.value, expected.value) + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeLast_n() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("suffix", in: 0 ..< count) { suffix in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeLast(suffix) + reference.removeLast(suffix) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeFirst_n() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("prefix", in: 0 ..< count) { prefix in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeFirst(prefix) + reference.removeFirst(prefix) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeAll_where() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("n", in: [2, 3, 4]) { n in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.removeAll(where: { !$0.key.payload.isMultiple(of: n) }) + reference.removeAll(where: { !$0.key.payload.isMultiple(of: n) }) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_Sequence() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + checkSequence( + { d }, + expectedContents: reference, + by: { $0.key == $1.0 && $0.value == $1.1 }) + } + } + } + + func test_uniqueKeysWithValues_initializer_ambiguity() { + // https://github.com/apple/swift-collections/issues/125 + + let names = ["dylan", "bob", "aaron", "carol"] + let expected = names.map { (key: $0, value: 0) } + + let d1 = OrderedDictionary(uniqueKeysWithValues: names.map { ($0, 0) }) + expectEqualElements(d1, expected) + + let d2 = OrderedDictionary( + uniqueKeysWithValues: ["dylan", "bob", "aaron", "carol"].map { ($0, 0) }) + expectEqualElements(d2, expected) + + let d3 = OrderedDictionary( + uniqueKeysWithValues: names.map { (key: $0, value: 0) }) + expectEqualElements(d3, expected) + + let d4 = OrderedDictionary( + uniqueKeysWithValues: ["dylan", "bob", "aaron", "carol"].map { (key: $0, value: 0) }) + expectEqualElements(d4, expected) + } + + func test_uniquingKeysWith_initializer_ambiguity() { + // https://github.com/apple/swift-collections/issues/125 + let d1 = OrderedDictionary( + ["a", "b", "a"].map { ($0, 1) }, + uniquingKeysWith: +) + expectEqualElements(d1, ["a": 2, "b": 1] as KeyValuePairs) + + let d2 = OrderedDictionary( + ["a", "b", "a"].map { (key: $0, value: 1) }, + uniquingKeysWith: +) + expectEqualElements(d2, ["a": 2, "b": 1] as KeyValuePairs) + } + + func test_merge_ambiguity() { + // https://github.com/apple/swift-collections/issues/125 + + var d1: OrderedDictionary = ["a": 1, "b": 2] + d1.merge( + ["c", "a"].map { ($0, 1) }, + uniquingKeysWith: + + ) + expectEqualElements(d1, ["a": 2, "b": 2, "c": 1] as KeyValuePairs) + + var d2: OrderedDictionary = ["a": 1, "b": 2] + d2.merge( + ["c", "a"].map { (key: $0, value: 1) }, + uniquingKeysWith: + + ) + expectEqualElements(d2, ["a": 2, "b": 2, "c": 1] as KeyValuePairs) + } + + func test_merging_ambiguity() { + // https://github.com/apple/swift-collections/issues/125 + + let d1: OrderedDictionary = ["a": 1, "b": 2] + let d1m = d1.merging( + ["c", "a"].map { ($0, 1) }, + uniquingKeysWith: + + ) + expectEqualElements(d1m, ["a": 2, "b": 2, "c": 1] as KeyValuePairs) + + let d2: OrderedDictionary = ["a": 1, "b": 2] + let d2m = d2.merging( + ["c", "a"].map { (key: $0, value: 1) }, + uniquingKeysWith: + + ) + expectEqualElements(d2m, ["a": 2, "b": 2, "c": 1] as KeyValuePairs) + } +} + diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Utils.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Utils.swift new file mode 100644 index 00000000..a79c993b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary Utils.swift @@ -0,0 +1,30 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import _CollectionsTestSupport +import OrderedCollections + +extension LifetimeTracker { + func orderedDictionary( + keys: Keys + ) -> ( + dictionary: OrderedDictionary, LifetimeTracked>, + expected: [(key: LifetimeTracked, value: LifetimeTracked)] + ) + where Keys.Element == Int + { + let k = Array(keys) + let keys = self.instances(for: k) + let values = self.instances(for: k.map { $0 + 100 }) + let dictionary = OrderedDictionary(uniqueKeys: keys, values: values) + return (dictionary, (0 ..< k.count).map { (key: keys[$0], value: values[$0]) }) + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Elements Tests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Elements Tests.swift new file mode 100644 index 00000000..ae07e1e6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Elements Tests.swift @@ -0,0 +1,493 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +@_spi(Testing) import OrderedCollections + +import _CollectionsTestSupport + +class OrderedDictionaryElementsTests: CollectionTestCase { + func test_elements_getter() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + expectEqualElements(d.elements, reference) + } + } + } + + func test_elements_modify() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + + var d2 = OrderedDictionary, LifetimeTracked>() + + swap(&d.elements, &d2.elements) + + expectEqualElements(d, []) + expectEqualElements(d2, reference) + } + } + } + + func test_keys_values() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let keys = reference.map { $0.key } + var values = reference.map { $0.value } + expectEqualElements(d.elements.keys, keys) + expectEqualElements(d.elements.values, values) + + values.reverse() + d.elements.values.reverse() + + for i in 0 ..< count { reference[i].value = values[i] } + expectEqualElements(d.elements.values, values) + expectEqualElements(d.elements, reference) + expectEqualElements(d, reference) + } + } + } + + func test_index_forKey() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEvery("offset", in: 0 ..< count) { offset in + expectEqual(d.elements.index(forKey: reference[offset].key), offset) + } + expectNil(d.elements.index(forKey: tracker.instance(for: -1))) + expectNil(d.elements.index(forKey: tracker.instance(for: count))) + } + } + } + + func test_RandomAccessCollection() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + checkBidirectionalCollection( + d.elements, expectedContents: reference, + by: { $0 == $1 }) + } + } + } + + func test_CustomStringConvertible() { + let a: OrderedDictionary = [:] + expectEqual(a.elements.description, "[:]") + + let b: OrderedDictionary = [0: 1] + expectEqual(b.elements.description, "[0: 1]") + + let c: OrderedDictionary = [0: 1, 2: 3, 4: 5] + expectEqual(c.elements.description, "[0: 1, 2: 3, 4: 5]") + } + + func test_CustomDebugStringConvertible() { + let a: OrderedDictionary = [:] + expectEqual(a.elements.debugDescription, + "OrderedDictionary.Elements([:])") + + let b: OrderedDictionary = [0: 1] + expectEqual(b.elements.debugDescription, + "OrderedDictionary.Elements([0: 1])") + + let c: OrderedDictionary = [0: 1, 2: 3, 4: 5] + expectEqual(c.elements.debugDescription, + "OrderedDictionary.Elements([0: 1, 2: 3, 4: 5])") + } + + func test_customReflectable() { + do { + let d: OrderedDictionary = [1: 2, 3: 4, 5: 6] + let mirror = Mirror(reflecting: d.elements) + expectEqual(mirror.displayStyle, .collection) + expectNil(mirror.superclassMirror) + expectTrue(mirror.children.compactMap { $0.label }.isEmpty) // No label + expectEqualElements( + mirror.children.compactMap { $0.value as? (key: Int, value: Int) }, + d.map { $0 }) + } + } + + func test_Equatable_Hashable() { + let samples: [[OrderedDictionary]] = [ + [[:], [:]], + [[1: 100], [1: 100]], + [[2: 200], [2: 200]], + [[3: 300], [3: 300]], + [[100: 1], [100: 1]], + [[1: 1], [1: 1]], + [[100: 100], [100: 100]], + [[1: 100, 2: 200], [1: 100, 2: 200]], + [[2: 200, 1: 100], [2: 200, 1: 100]], + [[1: 100, 2: 200, 3: 300], [1: 100, 2: 200, 3: 300]], + [[2: 200, 1: 100, 3: 300], [2: 200, 1: 100, 3: 300]], + [[3: 300, 2: 200, 1: 100], [3: 300, 2: 200, 1: 100]], + [[3: 300, 1: 100, 2: 200], [3: 300, 1: 100, 2: 200]] + ] + checkHashable(equivalenceClasses: samples.map { $0.map { $0.elements }}) + } + + func test_swapAt() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("i", in: 0 ..< count) { i in + withEvery("j", in: 0 ..< count) { j in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + reference.swapAt(i, j) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.swapAt(i, j) + expectEquivalentElements( + d, reference, + by: { $0.key == $1.key && $0.value == $1.value }) + expectEqual(d[reference[i].key], reference[i].value) + expectEqual(d[reference[j].key], reference[j].value) + } + } + } + } + } + } + } + + func test_partition() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + let expectedPivot = reference.partition { $0.key.payload < count / 2 } + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actualPivot = d.elements.partition { $0.key.payload < count / 2 } + expectEqual(actualPivot, expectedPivot) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_sort() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + reference.sort(by: { $0.key < $1.key }) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.sort() + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_sort_by() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + reference.sort(by: { $0.key > $1.key }) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.sort(by: { $0.key > $1.key }) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_shuffle() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withEvery("seed", in: 0 ..< 10) { seed in + var d = OrderedDictionary( + uniqueKeys: 0 ..< count, + values: 100 ..< 100 + count) + var items = (0 ..< count).map { (key: $0, value: 100 + $0) } + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + expectEqualElements(d.elements, items) + + var rng1 = RepeatableRandomNumberGenerator(seed: seed) + items.shuffle(using: &rng1) + + var rng2 = RepeatableRandomNumberGenerator(seed: seed) + d.elements.shuffle(using: &rng2) + + items.sort(by: { $0.key < $1.key }) + d.elements.sort() + expectEqualElements(d, items) + } + } + } + if count >= 2 { + // Check that shuffling with the system RNG does permute the elements. + var d = OrderedDictionary( + uniqueKeys: 0 ..< count, + values: 100 ..< 100 + count) + let original = d + var success = false + for _ in 0 ..< 1000 { + d.elements.shuffle() + if !d.elementsEqual( + original, + by: { $0.key == $1.key && $0.value == $1.value} + ) { + success = true + break + } + } + expectTrue(success) + } + } + } + + func test_reverse() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + reference.reverse() + d.elements.reverse() + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeAll() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, _) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeAll() + expectEqual(d.keys.__unstable.scale, 0) + expectEqualElements(d, []) + } + } + } + } + } + + func test_removeAll_keepCapacity() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, _) = tracker.orderedDictionary(keys: 0 ..< count) + let origScale = d.keys.__unstable.scale + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeAll(keepingCapacity: true) + expectEqual(d.keys.__unstable.scale, origScale) + expectEqualElements(d, []) + } + } + } + } + } + + func test_remove_at() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.elements.remove(at: offset) + let expected = reference.remove(at: offset) + expectEqual(actual.key, expected.key) + expectEqual(actual.value, expected.value) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeSubrange() { + withEvery("count", in: 0 ..< 30) { count in + withEveryRange("range", in: 0 ..< count) { range in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeSubrange(range) + reference.removeSubrange(range) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeSubrange_rangeExpression() { + let d = OrderedDictionary(uniqueKeys: 0 ..< 30, values: 100 ..< 130) + let item = (0 ..< 30).map { (key: $0, value: 100 + $0) } + + var d1 = d + d1.elements.removeSubrange(...10) + expectEqualElements(d1, item[11...]) + + var d2 = d + d2.elements.removeSubrange(..<10) + expectEqualElements(d2, item[10...]) + + var d3 = d + d3.elements.removeSubrange(10...) + expectEqualElements(d3, item[0 ..< 10]) + } + + func test_removeLast() { + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< 30) + withEvery("i", in: 0 ..< d.count) { i in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.elements.removeLast() + let expected = reference.removeLast() + expectEqual(actual.key, expected.key) + expectEqual(actual.value, expected.value) + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeFirst() { + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< 30) + withEvery("i", in: 0 ..< d.count) { i in + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actual = d.elements.removeFirst() + let expected = reference.removeFirst() + expectEqual(actual.key, expected.key) + expectEqual(actual.value, expected.value) + expectEqualElements(d, reference) + } + } + } + } + } + + func test_removeLast_n() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("suffix", in: 0 ..< count) { suffix in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeLast(suffix) + reference.removeLast(suffix) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeFirst_n() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("prefix", in: 0 ..< count) { prefix in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeFirst(prefix) + reference.removeFirst(prefix) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_removeAll_where() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("n", in: [2, 3, 4]) { n in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.elements.removeAll(where: { !$0.key.payload.isMultiple(of: n) }) + reference.removeAll(where: { !$0.key.payload.isMultiple(of: n) }) + expectEqualElements(d, reference) + } + } + } + } + } + } + + func test_slice_keys() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEveryRange("range", in: 0 ..< count) { range in + expectEqual(d.elements[range].keys, d.keys[range]) + expectEqualElements(d.elements[range].keys, reference[range].map { $0.key }) + } + } + } + } + + func test_slice_values() { + withEvery("count", in: 0 ..< 30) { count in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEveryRange("range", in: 0 ..< count) { range in + expectEqualElements(d.elements[range].values, d.values[range]) + expectEqualElements(d.elements[range].values, reference[range].map { $0.value }) + } + } + } + } + + func test_slice_index_forKey() { + withEvery("count", in: 0 ..< 30) { count in + withEveryRange("range", in: 0 ..< count) { range in + withLifetimeTracking { tracker in + let (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + withEvery("offset", in: 0 ..< count) { offset in + let actual = d.elements[range].index(forKey: reference[offset].key) + let expected = range.contains(offset) ? offset : nil + expectEqual(actual, expected) + } + expectNil(d.elements[range].index(forKey: tracker.instance(for: -1))) + expectNil(d.elements[range].index(forKey: tracker.instance(for: count))) + } + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Values Tests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Values Tests.swift new file mode 100644 index 00000000..d10c1528 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedDictionary/OrderedDictionary+Values Tests.swift @@ -0,0 +1,212 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +@_spi(Testing) import OrderedCollections + +import _CollectionsTestSupport + +class OrderedDictionaryValueTests: CollectionTestCase { + func test_values_getter() { + let d: OrderedDictionary = [ + "one": 1, + "two": 2, + "three": 3, + "four": 4, + ] + expectEqualElements(d.values, [1, 2, 3, 4]) + } + + func test_values_RandomAccessCollection() { + withEvery("count", in: 0 ..< 30) { count in + let keys = 0 ..< count + let values = keys.map { $0 + 100 } + let d = OrderedDictionary(uniqueKeys: keys, values: values) + checkBidirectionalCollection(d.values, expectedContents: values) + } + } + + func test_values_subscript_assignment() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instance(for: -1) + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.values[offset] = replacement + reference[offset].value = replacement + expectEqualElements(d.values, reference.map { $0.value }) + expectEqual(d[reference[offset].key], reference[offset].value) + } + } + } + } + } + } + + func test_values_subscript_inPlaceMutation() { + func checkMutation( + _ item: inout LifetimeTracked, + tracker: LifetimeTracker, + delta: Int, + file: StaticString = #file, + line: UInt = #line + ) { + expectTrue(isKnownUniquelyReferenced(&item)) + item = tracker.instance(for: item.payload + delta) + } + + withEvery("count", in: 0 ..< 30) { count in + withEvery("offset", in: 0 ..< count) { offset in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + // Discard reference values and recreate them from scratch to make + // sure values are all uniquely referenced. + for i in 0 ..< count { + reference[i].value = tracker.instance(for: reference[i].value.payload) + } + + checkMutation(&reference[offset].value, tracker: tracker, delta: 10) + checkMutation(&d.values[offset], tracker: tracker, delta: 10) + + expectEqualElements(d.values, reference.map { $0.value }) + expectEqual(d[reference[offset].key], reference[offset].value) + } + } + } + } + + func test_swapAt() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("i", in: 0 ..< count) { i in + withEvery("j", in: 0 ..< count) { j in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let t = reference[i].value + reference[i].value = reference[j].value + reference[j].value = t + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + d.values.swapAt(i, j) + expectEqualElements(d.values, reference.map { $0.value }) + expectEqual(d[reference[i].key], reference[i].value) + expectEqual(d[reference[j].key], reference[j].value) + } + } + } + } + } + } + } + + func test_partition() { + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var rng = RepeatableRandomNumberGenerator(seed: seed) + var (d, reference) = tracker.orderedDictionary( + keys: (0 ..< count).shuffled(using: &rng)) + var values = reference.map { $0.value } + let expectedPivot = values.partition { $0.payload < 100 + count / 2 } + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d in + let actualPivot = d.values.partition { $0.payload < 100 + count / 2 } + expectEqual(actualPivot, expectedPivot) + expectEqualElements(d.values, values) + withEvery("i", in: 0 ..< count) { i in + expectEqual(d[reference[i].key], values[i]) + } + } + } + } + } + } + } + + func test_withUnsafeBufferPointer() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + typealias R = [LifetimeTracked] + let actual = + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d -> R in + d.values.withUnsafeBufferPointer { buffer -> R in + Array(buffer) + } + } + expectEqualElements(actual, reference.map { $0.value }) + } + } + } + } + + func test_withUnsafeMutableBufferPointer() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instances(for: (0 ..< count).map { -$0 }) + typealias R = [LifetimeTracked] + let actual = + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d -> R in + d.values.withUnsafeMutableBufferPointer { buffer -> R in + let result = Array(buffer) + expectEqual(buffer.count, replacement.count, trapping: true) + for i in 0 ..< replacement.count { + buffer[i] = replacement[i] + } + return result + } + } + expectEqualElements(actual, reference.map { $0.value }) + expectEqualElements(d.values, replacement) + withEvery("i", in: 0 ..< count) { i in + expectEqual(d[reference[i].key], replacement[i]) + } + } + } + } + } + + func test_withContiguousMutableStorageIfAvailable() { + withEvery("count", in: 0 ..< 30) { count in + withEvery("isShared", in: [false, true]) { isShared in + withLifetimeTracking { tracker in + var (d, reference) = tracker.orderedDictionary(keys: 0 ..< count) + let replacement = tracker.instances(for: (0 ..< count).map { -$0 }) + typealias R = [LifetimeTracked] + let actual = + withHiddenCopies(if: isShared, of: &d, checker: { $0._checkInvariants() }) { d -> R? in + d.values.withContiguousMutableStorageIfAvailable { buffer -> R in + let result = Array(buffer) + expectEqual(buffer.count, replacement.count, trapping: true) + for i in 0 ..< replacement.count { + buffer[i] = replacement[i] + } + return result + } + } + if let actual = actual { + expectEqualElements(actual, reference.map { $0.value }) + expectEqualElements(d.values, replacement) + withEvery("i", in: 0 ..< count) { i in + expectEqual(d[reference[i].key], replacement[i]) + } + } else { + expectFailure("OrderedDictionary.Value isn't contiguous?") + } + } + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet Diffing Tests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet Diffing Tests.swift new file mode 100644 index 00000000..1f06a148 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet Diffing Tests.swift @@ -0,0 +1,143 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +import OrderedCollections +import _CollectionsTestSupport + +class MeasuringHashable: Hashable { + static var equalityChecks = 0 + static func == (lhs: MeasuringHashable, rhs: MeasuringHashable) -> Bool { + MeasuringHashable.equalityChecks += 1 + return lhs._inner == rhs._inner + } + + static var hashChecks = 0 + func hash(into hasher: inout Hasher) { + MeasuringHashable.hashChecks += 1 + _inner.hash(into: &hasher) + } + + let _inner: AnyHashable + + init(_ wrapped: T) { + _inner = AnyHashable(wrapped) + } +} + +@available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) +class OrderedSetDiffingTests: CollectionTestCase { + + func _validatePerformance(from a: OrderedSet, to b: OrderedSet) { + MeasuringHashable.equalityChecks = 0 + MeasuringHashable.hashChecks = 0 + + let _ = OrderedSet(a.map({MeasuringHashable($0)})).difference(from: OrderedSet(b.map({MeasuringHashable($0)}))) + let n = a.count + b.count + + /* Expect linear performance, which we can fence in testing as + * "less than nlogn" since diffing generally tends to be at least n**2 + */ + expectLessThan(MeasuringHashable.equalityChecks, n * n.bitWidth) + expectLessThan(MeasuringHashable.hashChecks, n * n.bitWidth) + } + + func _validate(from a: Array, to b: Array, mutations: Int? = nil) { + _validate(from: OrderedSet(a), to: OrderedSet(b), mutations: mutations) + } + + func _validate(from a: OrderedSet, to b: OrderedSet, mutations: Int? = nil) { + _validatePerformance(from: a, to: b) + _validatePerformance(from: b, to: a) + + let d = b.difference(from: a) + let e = a.difference(from: b) + + if let mutations = mutations { + if mutations >= 0 { + expectEqual(d.count, mutations) + expectEqual(d.count, e.count) + } + } else { + expectEqual(d.count, e.count) + } + expectEqual(a.applying(d), b) + expectEqual(b.applying(d.inverse()), a) + expectEqual(a.applying(e.inverse()), b) + expectEqual(b.applying(e), a) + } + + func test_equal() { + let a = [1, 2, 3, 4, 5] + _validate(from: a, to: a, mutations: 0) + } + + func test_moveTrap() { + let a = [1, 2, 3] + let b = [3, 2] + _validate(from: a, to: b, mutations: 3) + } + + func test_minimalish() { + let a = ["g", "1", "2", "w", "o", "a", "e", "t", "4", "8"] + let b = [ "1", "2", "3", "e", "4", "5", "6", "7"] + _validate(from: a, to: b, mutations: 10) + } + + func test_arrowDefeatingMinimalDiff() { + // Arrow diff only finds one match ("n") instead of two ("o", "c") + let a = [ "o", "c", "n"] + let b = ["n", "d", "y", "o", "c"] + _validate(from: a, to: b, mutations: 4) + } + + func test_disparate() { + let a = OrderedSet(0..<1000) + let b = OrderedSet(1000..<2000) + _validate(from: a, to: b, mutations: 2000) + } + + func test_reversed() { + let a = OrderedSet(0..<1000) + let b = OrderedSet((0..<1000).reversed()) + _validate(from: a, to: b, mutations: 1998) + } + + func test_fuzzerDiscovered00() { + // X X X + let a = [3, 5, 8, 0, 7, 9] + let b = [8, 5, 9, 7, 0, 6] + // X X X + _validate(from: a, to: b) + } + + /* Good example of greedy match seeking resulting in a non-minimal diff. + * Luckily, the API contract doesn't promise the shortest edit script, just an + * accurate one. + */ + func test_fuzzerDiscovered01() { + // b → a X X X X X X + // a → b X X X X X X X + let a = [3, 7, 2, 5, 9, 1, 8, 4] + let b = [4, 2, 1, 7, 8, 6] + // a → b X X X X X + // b → a X X X X + _validate(from: a, to: b, mutations: -1) + } + + func test_fuzz() { + for _ in 0..<1000 { + let a = (0..<10).map { _ in Int.random(in: 0..<10) } + let b = (0..<10).map { _ in Int.random(in: 0..<10) } + _validate(from: OrderedSet(a), to: OrderedSet(b), mutations: -1) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet.UnorderedView Tests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet.UnorderedView Tests.swift new file mode 100644 index 00000000..b9021ca6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSet.UnorderedView Tests.swift @@ -0,0 +1,78 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +@_spi(Testing) import OrderedCollections +import _CollectionsTestSupport + +class OrderedSetUnorderedViewTests: CollectionTestCase { + func test_unordered_insert() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("dupes", in: 1 ... 3) { dupes in + withLifetimeTracking { tracker in + let input = (0 ..< dupes * count) + .map { tracker.instance(for: $0 / dupes) } + .shuffled() + let reference: [Int: LifetimeTracked] = + .init(input.lazy.map { ($0.payload, $0) }, + uniquingKeysWith: { a, b in a }) + var set = OrderedSet>() + withEvery("offset", in: input.indices) { offset in + let item = input[offset] + let ref = reference[item.payload] + let (inserted, member) = set.unordered.insert(item) + expectEqual(inserted, ref === item) + expectEqual(member, item) + expectIdentical(member, ref) + expectTrue(set.contains(item)) + } + } + } + } + // Check CoW copying behavior + do { + var set = OrderedSet(0 ..< 30) + let copy = set + expectTrue(set.unordered.insert(30).inserted) + expectTrue(set.contains(30)) + expectFalse(copy.contains(30)) + } + } + + func test_unordered_update() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("dupes", in: 1 ... 3) { dupes in + withLifetimeTracking { tracker in + let input = (0 ..< dupes * count) + .map { tracker.instance(for: $0 / dupes) } + .shuffled() + var reference: [Int: LifetimeTracked] = [:] + var set = OrderedSet>() + withEvery("offset", in: input.indices) { offset in + let item = input[offset] + let old = set.unordered.update(with: item) + expectIdentical(old, reference[item.payload]) + reference[item.payload] = item + expectTrue(set.contains(item)) + } + } + } + } + // Check CoW copying behavior + do { + var set = OrderedSet(0 ..< 30) + let copy = set + expectNil(set.unordered.update(with: 30)) + expectTrue(set.contains(30)) + expectFalse(copy.contains(30)) + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetInternals.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetInternals.swift new file mode 100644 index 00000000..397db56d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetInternals.swift @@ -0,0 +1,81 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import _CollectionsTestSupport +@_spi(Testing) import OrderedCollections + +struct OrderedSetLayout: Hashable, CustomStringConvertible { + let scale: Int + let bias: Int + let count: Int + + var description: String { + "OrderedSetLayout(scale: \(scale), bias: \(bias), count: \(count))" + } +} + +func withOrderedSetLayouts( + scales: [Int], + file: StaticString = #file, + line: UInt = #line, + run body: (OrderedSetLayout) throws -> Void +) rethrows { + for scale in scales { + for count in _interestingCounts(forScale: scale) { + for bias in _interestingBiases(forScale: scale) { + let layout = OrderedSetLayout(scale: scale, bias: bias, count: count) + let entry = TestContext.current.push("layout: \(layout)") + defer { TestContext.current.pop(entry) } + try body(layout) + } + } + } +} + +func _interestingCounts(forScale scale: Int) -> [Int] { + precondition(scale == 0 || scale >= OrderedSet._minimumScale) + let min = OrderedSet._minimumCapacity(forScale: scale) + let max = OrderedSet._maximumCapacity(forScale: scale) + return [min, min + (max - min) / 2, max] +} + +func _interestingBiases(forScale scale: Int) -> [Int] { + // If we have no hash table, we can only use a bias of 0. + if scale < OrderedSet._minimumScale { return [0] } + let range = OrderedSet._biasRange(scale: scale) + // For the minimum scale, try all biases. + if scale == OrderedSet._minimumScale { return Array(range) } + // Otherwise try 3 biases each from the start, middle, and end of range. + var result: [Int] = [] + result += range.prefix(3) + result += range.prefix(range.count / 2 + 1).suffix(3) + result += range.suffix(3) + return result +} + +extension OrderedSet { + init(layout: OrderedSetLayout, contents: [Element]) { + self.init(_scale: layout.scale, bias: layout.bias, contents: contents) + } +} + +extension OrderedSet { + init(layout: OrderedSetLayout, contents: C) + where C.Element == Element { + self.init(_scale: layout.scale, bias: layout.bias, contents: contents) + } +} + +extension OrderedSet where Element == Int { + init(layout: OrderedSetLayout) { + self.init(layout: layout, contents: 0 ..< layout.count) + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetTests.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetTests.swift new file mode 100644 index 00000000..f2161dc3 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/OrderedSetTests.swift @@ -0,0 +1,1363 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +import XCTest +@_spi(Testing) import OrderedCollections +import _CollectionsTestSupport + +class OrderedSetTests: CollectionTestCase { + func test_init_uncheckedUniqueElements_concrete() { + withEvery("count", in: 0 ..< 20) { count in + let contents = Array(0 ..< count) + let set = OrderedSet(uncheckedUniqueElements: contents) + expectEqual(set.count, count) + expectEqual(set.isEmpty, count == 0) + expectEqualElements(set, 0 ..< count) + for i in 0 ..< count { + expectTrue(set.contains(i)) + } + } + } + + func test_init_empty() { + let set = OrderedSet() + expectEqual(set.count, 0) + expectTrue(set.isEmpty) + expectEqualElements(set, []) + } + + func test_init_self() { + withEvery("count", in: 0 ..< 20) { count in + let set = OrderedSet(0 ..< count) + let copy = OrderedSet(set) + expectEqualElements(copy, set) + expectEqual(set.__unstable.hashTableIdentity, copy.__unstable.hashTableIdentity) + } + } + + func test_init_set() { + withEvery("count", in: 0 ..< 20) { count in + let set = Set(0 ..< count) + let ordered = OrderedSet(set) + expectEqual(ordered.count, count) + expectEqualElements(ordered, set) + } + } + + func test_init_dictionary_keys() { + withEvery("count", in: 0 ..< 20) { count in + let dict: [Int: Int] + = .init(uniqueKeysWithValues: (0 ..< count).lazy.map { (key: $0, value: 2 * $0) }) + let ordered = OrderedSet(dict.keys) + expectEqual(ordered.count, count) + expectEqualElements(ordered, dict.keys) + } + } + + /// Create a new `OrderedSet` instance using the generic initializer. + static func _genericInitializer( + from elements: S + ) -> OrderedSet { + return OrderedSet(elements) + } + + + func test_generic_init_self() { + withEvery("count", in: 0 ..< 20) { count in + let set = OrderedSet(0 ..< count) + let copy: OrderedSet = Self._genericInitializer(from: set) + expectEqualElements(copy, set) + expectEqual(set.__unstable.hashTableIdentity, copy.__unstable.hashTableIdentity) + } + } + + func test_generic_init_set() { + withEvery("count", in: 0 ..< 20) { count in + let expected = Set(0 ..< count) + let actual = Self._genericInitializer(from: expected) + expectEqualElements(actual, expected) + } + } + + func test_generic_init_array() { + withEvery("count", in: 0 ..< 20) { count in + let expected = Array(0 ..< count) + withEvery("dupes", in: 1 ... 3) { dupes in + let input = (0 ..< count).flatMap { repeatElement($0, count: dupes) } + let actual = Self._genericInitializer(from: input) + expectEqualElements(actual, expected) + } + } + } + + func test_firstIndexOf_lastIndexOf() { + withEvery("count", in: 0 ..< 20) { count in + let contents = Array(0 ..< count) + withEvery("dupes", in: 1 ... 3) { dupes in + let input = (0 ..< count).flatMap { repeatElement($0, count: dupes) } + let set = OrderedSet(input) + withEvery("item", in: contents) { item in + expectNotNil(set.firstIndex(of: item)) { index in + expectEqual(set[index], item) + expectEqual(contents[index], item) + expectEqual(set.lastIndex(of: item), index) + } + } + expectNil(set.firstIndex(of: count)) + expectNil(set.lastIndex(of: count)) + } + } + } + + func test_Collection() { + withEvery("count", in: [0, 1, 15, 16, 20]) { count in + let scale = OrderedSet._scale(forCapacity: count) + withEvery("bias", in: OrderedSet._biasRange(scale: scale)) { bias in + let contents = Array(0 ..< count) + let set = OrderedSet(_scale: scale, bias: bias, contents: contents) + checkBidirectionalCollection(set, expectedContents: contents) + } + } + } + + func test_CustomStringConvertible() { + let a: OrderedSet = [] + expectEqual(a.description, "[]") + + let b: OrderedSet = [0] + expectEqual(b.description, "[0]") + + let c: OrderedSet = [0, 1, 2, 3, 4] + expectEqual(c.description, "[0, 1, 2, 3, 4]") + } + + func test_CustomDebugStringConvertible() { + let a: OrderedSet = [] + expectEqual(a.debugDescription, "OrderedSet([])") + + let b: OrderedSet = [0] + expectEqual(b.debugDescription, "OrderedSet([0])") + + let c: OrderedSet = [0, 1, 2, 3, 4] + expectEqual(c.debugDescription, "OrderedSet([0, 1, 2, 3, 4])") + } + + func test_customReflectable() { + do { + let set: OrderedSet = [1, 2, 3] + let mirror = Mirror(reflecting: set) + expectEqual(mirror.displayStyle, .collection) + expectNil(mirror.superclassMirror) + expectTrue(mirror.children.compactMap { $0.label }.isEmpty) // No label + expectEqualElements(mirror.children.map { $0.value as? Int }, set.map { $0 }) + } + } + + func test_Equatable_Hashable() { + let samples: [[OrderedSet]] = [ + [[1, 2, 3], + [1, 2, 3]], + [[3, 2, 1], + [3, 2, 1]], + [[1, 1, 1], + [1, 1, 1], + [1, 1], + [1]], + [[1, 2], + [1, 2, 2], + [1, 1, 2], + [1, 1, 2, 2]], + ] + checkHashable(equivalenceClasses: samples) + + // Check that hash encoding matches that of the underlying arrays. + for equivalenceClass in samples { + for item in equivalenceClass { + expectEqual(item.hashValue, item.elements.hashValue) + } + } + } + + func test_ExpressibleByArrayLiteral() { + do { + let set: OrderedSet = [] + expectEqualElements(set, [] as [Int]) + } + + do { + let set: OrderedSet = [1, 2, 3] + expectEqualElements(set, 1 ... 3) + } + + do { + let set: OrderedSet = [ + 1, 2, 3, 4, 5, 6, 7, 8, + 1, 2, 3, 4, 5, 6, 7, 8, + 1, 2, 3, 4, 5, 6, 7, 8, + 1, 2, 3, 4, 5, 6, 7, 8, + ] + expectEqualElements(set, 1 ... 8) + } + + do { + let set: OrderedSet = [ + 1, 1, 1, 1, + 2, 2, 2, 2, + 3, 3, 3, 3, + 4, 4, 4, 4, + 5, 5, 5, 5, + 6, 6, 6, 6, + 7, 7, 7, 7, + 8, 8, 8, 8, + ] + expectEqualElements(set, 1 ... 8) + } + + do { + let set: OrderedSet = [ + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32] + expectEqualElements(set, 1 ... 32) + } + } + + func test_Encodable() throws { + let s1: OrderedSet = [] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalEncoder.encode(s1), v1) + + let s2: OrderedSet = [0, 1, 2, 3] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalEncoder.encode(s2), v2) + + let s3: OrderedSet = [3, 2, 1, 0] + let v3: MinimalEncoder.Value = .array([.int(3), .int(2), .int(1), .int(0)]) + expectEqual(try MinimalEncoder.encode(s3), v3) + + let s4 = OrderedSet(0 ..< 100) + let v4: MinimalEncoder.Value = .array((0 ..< 100).map { .int($0) }) + expectEqual(try MinimalEncoder.encode(s4), v4) + } + + func test_Decodable() throws { + let s1: OrderedSet = [] + let v1: MinimalEncoder.Value = .array([]) + expectEqual(try MinimalDecoder.decode(v1, as: OrderedSet.self), s1) + + let s2: OrderedSet = [0, 1, 2, 3] + let v2: MinimalEncoder.Value = .array([.int(0), .int(1), .int(2), .int(3)]) + expectEqual(try MinimalDecoder.decode(v2, as: OrderedSet.self), s2) + + let s3 = OrderedSet(0 ..< 100) + let v3: MinimalEncoder.Value = .array((0 ..< 100).map { .int($0) }) + expectEqual(try MinimalDecoder.decode(v3, as: OrderedSet.self), s3) + + expectThrows(try MinimalDecoder.decode(.int(0), as: OrderedSet.self)) + + let v4: MinimalEncoder.Value = .array([.int(0), .int(1), .int(0)]) + expectThrows(try MinimalDecoder.decode(v4, as: OrderedSet.self)) { error in + expectNotNil(error as? DecodingError) { error in + guard case .dataCorrupted(let context) = error else { + expectFailure("Unexpected error \(error)") + return + } + expectEqual(context.debugDescription, + "Decoded elements aren't unique (first duplicate at offset 2)") + } + } + } + + func test_append_many() { + #if COLLECTIONS_INTERNAL_CHECKS + // This test just takes too long with O(n) appends. + let count = 1_000 + #else + let count = 10_000 + #endif + + var set: OrderedSet = [] + withEvery("item", in: 0 ..< count) { item in + let res1 = set.append(item) + expectTrue(res1.inserted) + expectEqual(set[res1.index], item) + + let res2 = set.append(item) + expectFalse(res2.inserted) + expectEqual(res2.index, res1.index) + + expectEqual(set[res1.index], item) // Original index must remain valid. + expectEqual(set[res2.index], item) + } + } + + func test_append() { + withEvery("count", in: 0 ..< 20) { count in + withEvery("dupes", in: 1 ... 3) { dupes in + let input = (0 ..< count).flatMap { repeatElement($0, count: dupes) }.shuffled() + var reference: [Int: Int] = [:] // Value to expected offset + var actual: OrderedSet = [] + withEvery("offset", in: input.indices) { offset in + let item = input[offset] + let (inserted, index) = actual.append(item) + expectEqual(actual[index], item) + if let expectedOffset = reference[item] { + // Existing item + expectFalse(inserted) + expectEqual(index, expectedOffset) + } else { + expectTrue(inserted) + expectEqual(index, reference.count) + reference[item] = reference.count + } + } + } + } + // Check CoW copying behavior + do { + var set = OrderedSet(0 ..< 30) + let copy = set + expectTrue(set.append(30).inserted) + expectTrue(set.contains(30)) + expectFalse(copy.contains(30)) + } + } + + func test_append_contentsOf() { + withEvery("chunkLength", in: 1 ..< 10) { chunkLength in + withEvery("chunkOverlap", in: 0 ... chunkLength) { chunkOverlap in + var actual: OrderedSet = [] + var chunkStart = 0 + var expectedCount = 0 + withEvery("iteration", in: 0 ..< 100) { _ in + let chunk = chunkStart ..< chunkStart + chunkLength + actual.append(contentsOf: chunk) + expectedCount = chunk.upperBound + expectEqual(actual.count, expectedCount) + chunkStart += chunkLength - chunkOverlap + } + expectEqualElements(actual, 0 ..< expectedCount) + } + } + } + + func test_insert_at() { + withOrderedSetLayouts(scales: [0, 5, 6]) { layout in + withEvery("isShared", in: [false, true]) { isShared in + let count = layout.count + withEvery("offset", in: 0 ... count) { offset in + var set = OrderedSet(layout: layout) + withHiddenCopies(if: isShared, of: &set, checker: { $0._checkInvariants() }) { set in + let i = set.index(set.startIndex, offsetBy: offset) + let (inserted, index) = set.insert(count, at: i) + expectTrue(inserted) + expectEqual(set.count, count + 1) + expectEqual(set[index], count) + expectEqualElements(set[..) + expectEqualElements(set, (0 ..< count).reversed()) + } + } + } + } + } + + func test_shuffle() { + withOrderedSetLayouts(scales: [0, 5, 6]) { layout in + guard layout.count > 1 else { return } + withEvery("seed", in: 0 ..< 10) { seed in + withEvery("isShared", in: [false, true]) { isShared in + let count = layout.count + var contents = Array(0 ..< count) + var set = OrderedSet(layout: layout, contents: 0 ..< count) + withHiddenCopies(if: isShared, of: &set, checker: { $0._checkInvariants() }) { set in + var rng1 = RepeatableRandomNumberGenerator(seed: seed) + contents.shuffle(using: &rng1) + + var rng2 = RepeatableRandomNumberGenerator(seed: seed) + set.shuffle(using: &rng2) + + expectEqualElements(set, contents) + + // Check that shuffling with system RNG does permute the elements. + var success = false + for _ in 0 ..< 1000 { + set.shuffle() + if !set.elementsEqual(contents) { + success = true + break + } + } + expectTrue(success) + } + } + } + } + } + + func test_reverse() { + withOrderedSetLayouts(scales: [0, 5, 6]) { layout in + guard layout.count > 1 else { return } + withEvery("isShared", in: [false, true]) { isShared in + let count = layout.count + var contents = Array(0 ..< count) + var set = OrderedSet(layout: layout, contents: 0 ..< count) + withHiddenCopies(if: isShared, of: &set, checker: { $0._checkInvariants() }) { set in + contents.reverse() + set.reverse() + expectEqualElements(set, contents) + } + } + } + } + + func test_remove_at() { + withOrderedSetLayouts(scales: [0, 5, 6]) { layout in + withEvery("offset", in: 0 ..< layout.count) { offset in + withEvery("isShared", in: [false, true]) { isShared in + var set = OrderedSet(layout: layout) + withHiddenCopies(if: isShared, of: &set, checker: { $0._checkInvariants() }) { set in + let count = layout.count + let index = set._index(at: offset) + let old = set.remove(at: index) + expectEqual(old, offset) + expectEqualElements(set[..._minimumCapacity(forScale: scale) { + expectLessThan(set.__unstable.scale, scale) + } else { + expectEqual(set.__unstable.scale, scale) + } + } + } + } + + + + func test_remove_existing_element() { + withOrderedSetLayouts(scales: [0, 5, 6]) { layout in + withEvery("item", in: 0 ..< layout.count) { item in + withEvery("isShared", in: [false, true]) { isShared in + var set = OrderedSet(layout: layout) + withHiddenCopies(if: isShared, of: &set, checker: { $0._checkInvariants() }) { set in + let count = layout.count + let old = set.remove(item) + expectEqual(old, item) + expectEqualElements(set[..._minimumCapacity(forScale: layout.scale) { + expectLessThan(set.__unstable.scale, layout.scale) + } + + expectEqualElements(set[_offsets: ..= offsetRange.upperBound { + expectEqual(set.firstIndex(of: i), + set._index(at: i - offsetRange.count)) + } else { + expectNil(set.firstIndex(of: i)) + } + } + } + } + } + } + } + + func test_init_minimumCapacity() { + withEvery("capacity", in: 0 ..< 1000) { capacity in + let expectedScale = OrderedSet._scale(forCapacity: capacity) + let set = OrderedSet(minimumCapacity: capacity) + expectEqual(set.__unstable.scale, expectedScale) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, + OrderedSet._minimumCapacity(forScale: expectedScale)) + } + } + + func test_init_minimumCapacity_persistent() { + withEvery("capacity", in: 0 ..< 1000) { capacity in + let expectedScale = OrderedSet._scale(forCapacity: capacity) + let set = OrderedSet(minimumCapacity: capacity, persistent: true) + expectEqual(set.__unstable.scale, expectedScale) + expectEqual(set.__unstable.reservedScale, expectedScale) + expectEqual(set.__unstable.minimumCapacity, 0) + } + } + + func test_reserveCapacity_empty() { + withEvery("capacity", in: 0 ..< 1000) { capacity in + let expectedScale = OrderedSet._scale(forCapacity: capacity) + var set = OrderedSet() + expectEqual(set.__unstable.scale, 0) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, 0) + + set.reserveCapacity(capacity) + expectEqual(set.__unstable.scale, expectedScale) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, + OrderedSet._minimumCapacity(forScale: expectedScale)) + + set.reserveCapacity(0) + expectEqual(set.__unstable.scale, 0) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, 0) + } + } + + func test_reserveCapacity_empty_persistent() { + withEvery("capacity", in: 0 ..< 1000) { capacity in + let scale = OrderedSet._scale(forCapacity: capacity) + var set = OrderedSet(minimumCapacity: capacity, persistent: true) + expectEqual(set.__unstable.scale, scale) + expectEqual(set.__unstable.reservedScale, scale) + expectEqual(set.__unstable.minimumCapacity, 0) + + set.reserveCapacity(capacity) + expectEqual(set.__unstable.scale, scale) + expectEqual(set.__unstable.reservedScale, scale) + expectEqual(set.__unstable.minimumCapacity, 0) + + let scale2 = OrderedSet._scale(forCapacity: 2 * capacity) + set.reserveCapacity(2 * capacity) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, scale) + let minimum2 = OrderedSet._minimumCapacity(forScale: scale2) + expectEqual(set.__unstable.minimumCapacity, (scale == scale2 ? 0 : minimum2)) + + let expectedScale3 = OrderedSet._scale(forCapacity: 2 * capacity + 100) + set.reserveCapacity(2 * capacity + 100) + expectEqual(set.__unstable.scale, expectedScale3) + expectEqual(set.__unstable.reservedScale, scale) + let minimum3 = OrderedSet._minimumCapacity(forScale: expectedScale3) + expectEqual(set.__unstable.minimumCapacity, minimum3) + + set.reserveCapacity(0) + expectEqual(set.__unstable.scale, scale) + expectEqual(set.__unstable.reservedScale, scale) + expectEqual(set.__unstable.minimumCapacity, 0) + } + } + + func test_reserveCapacity_behavior() { + let scale1 = 6 + let range1 = 16 ... 48 + let count1 = 32 + + let scale2 = 8 + let range2 = 64 ... 192 + let count2 = 128 + + var set = OrderedSet(0 ..< count1) + expectEqual(set.__unstable.scale, scale1) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, range1.lowerBound) + expectEqual(set.__unstable.capacity, range1.upperBound) + + set.__unstable.reserveCapacity(count2, persistent: false) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, + OrderedSet._minimumCapacity(forScale: scale2)) + expectEqual(set.__unstable.capacity, range2.upperBound) + + set.__unstable.reserveCapacity(count2, persistent: true) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, scale2) + expectEqual(set.__unstable.minimumCapacity, 0) + expectEqual(set.__unstable.capacity, range2.upperBound) + + set.append(contentsOf: count1 ..< count2) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, scale2) + expectEqual(set.__unstable.minimumCapacity, 0) + expectEqual(set.__unstable.capacity, range2.upperBound) + + set.__unstable.reserveCapacity(0, persistent: false) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, scale2) + expectEqual(set.__unstable.minimumCapacity, 0) + expectEqual(set.__unstable.capacity, range2.upperBound) + + set.removeSubrange(set._indexRange(at: count1...)) + expectEqual(set.__unstable.scale, scale2) + expectEqual(set.__unstable.reservedScale, scale2) + expectEqual(set.__unstable.minimumCapacity, 0) + expectEqual(set.__unstable.capacity, range2.upperBound) + + set.__unstable.reserveCapacity(0, persistent: true) + expectEqual(set.__unstable.scale, scale1) + expectEqual(set.__unstable.reservedScale, 0) + expectEqual(set.__unstable.minimumCapacity, range1.lowerBound) + expectEqual(set.__unstable.capacity, range1.upperBound) + } + + func withSampleRanges( + file: StaticString = #file, + line: UInt = #line, + _ body: (Range, Range) throws -> Void + ) rethrows { + for c1 in [0, 10, 32, 64, 128, 256] { + for c2 in [0, 10, 32, 64, 128, 256] { + for overlap in Set([0, 1, c1 / 2, c1, -5]) { + let r1 = 0 ..< c1 + let r2 = c1 - overlap ..< c1 - overlap + c2 + if r1.lowerBound <= r2.lowerBound { + let e1 = context.push("range1: \(r1)", file: file, line: line) + let e2 = context.push("range2: \(r2)", file: file, line: line) + defer { + context.pop(e2) + context.pop(e1) + } + try body(r1, r2) + } else { + let e1 = context.push("range1: \(r2)", file: file, line: line) + let e2 = context.push("range2: \(r1)", file: file, line: line) + defer { + context.pop(e2) + context.pop(e1) + } + try body(r2, r1) + } + } + } + } + } + + func test_union_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).union(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + let actual1 = u1.union(u2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.union(u2).union(u1) + expectEqualElements(actual2, expected) + } + } + + func test_formUnion_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).union(r2).sorted() + + var res: OrderedSet = [] + + let u1 = OrderedSet(r1) + res.formUnion(u1) + expectEqualElements(res, r1) + + let u2 = OrderedSet(r2) + res.formUnion(u2) + expectEqualElements(res, expected) + + res.formUnion(u1) + res.formUnion(u2) + expectEqualElements(res, expected) + } + } + + func test_union_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).union(r2).sorted() + let u1 = OrderedSet(r1) + let u2 = u1.union(r2) + expectEqualElements(u2, expected) + + let u3 = u2.union(r1) + expectEqualElements(u3, expected) + } + } + + func test_formUnion_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).union(r2).sorted() + + var res = OrderedSet() + + res.formUnion(r1) + expectEqualElements(res, r1) + + res.formUnion(r2) + expectEqualElements(res, expected) + + res.formUnion(r1) + res.formUnion(r2) + expectEqualElements(res, expected) + } + } + + func test_intersection_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).intersection(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + let actual1 = u1.intersection(u2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.intersection(r1) + expectEqualElements(actual2, expected) + } + } + + func test_formIntersection_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).intersection(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + var res = u1 + res.formIntersection(u2) + expectEqualElements(res, expected) + expectEqualElements(u1, r1) + + res.formIntersection(u1) + res.formIntersection(u2) + expectEqualElements(res, expected) + } + } + + func test_intersection_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).intersection(r2).sorted() + + let u1 = OrderedSet(r1) + let actual1 = u1.intersection(r2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.intersection(r1).intersection(r2) + expectEqualElements(actual2, expected) + } + } + + func test_formIntersection_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).intersection(r2).sorted() + + var res = OrderedSet(r1) + res.formIntersection(r2) + expectEqualElements(res, expected) + + res.formIntersection(r1) + res.formIntersection(r2) + expectEqualElements(res, expected) + } + } + + func test_symmetricDifference_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).symmetricDifference(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + let actual1 = u1.symmetricDifference(u2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.symmetricDifference(u1).symmetricDifference(u2) + expectEqual(actual2.count, 0) + } + } + + func test_formSymmetricDifference_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).symmetricDifference(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + var res = u1 + res.formSymmetricDifference(u2) + expectEqualElements(res, expected) + expectEqualElements(u1, r1) + + res.formSymmetricDifference(u1) + res.formSymmetricDifference(u2) + expectEqual(res.count, 0) + } + } + + func test_symmetricDifference_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).symmetricDifference(r2).sorted() + + let u1 = OrderedSet(r1) + let actual1 = u1.symmetricDifference(r2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.symmetricDifference(r1).symmetricDifference(r2) + expectEqual(actual2.count, 0) + } + } + + func test_formSymmetricDifference_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).symmetricDifference(r2).sorted() + + var res = OrderedSet(r1) + res.formSymmetricDifference(r2) + expectEqualElements(res, expected) + + res.formSymmetricDifference(r1) + res.formSymmetricDifference(r2) + expectEqual(res.count, 0) + } + } + + func test_subtracting_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).subtracting(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + let actual1 = u1.subtracting(u2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.subtracting(u2) + expectEqualElements(actual2, expected) + } + } + + func test_subtract_Self() { + withSampleRanges { r1, r2 in + let expected = Set(r1).subtracting(r2).sorted() + + let u1 = OrderedSet(r1) + let u2 = OrderedSet(r2) + var res = u1 + res.subtract(u2) + expectEqualElements(res, expected) + expectEqualElements(u1, r1) + + res.subtract(u2) + expectEqualElements(res, expected) + } + } + + func test_subtracting_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).subtracting(r2).sorted() + + let u1 = OrderedSet(r1) + let actual1 = u1.subtracting(r2) + expectEqualElements(actual1, expected) + + let actual2 = actual1.subtracting(r2) + expectEqualElements(actual2, expected) + } + } + + func test_subtract_generic() { + withSampleRanges { r1, r2 in + let expected = Set(r1).subtracting(r2).sorted() + + var res = OrderedSet(r1) + res.subtract(r2) + expectEqualElements(res, expected) + + res.subtract(r2) + expectEqualElements(res, expected) + } + } + + struct SampleRanges { + let unit: Int + + init(unit: Int) { + self.unit = unit + } + + var empty: Range { unit ..< unit } + + var a: Range { 0 ..< unit } + var b: Range { unit ..< 2 * unit } + var c: Range { 2 * unit ..< 3 * unit } + + var ab: Range { 0 ..< 2 * unit } + var bc: Range { unit ..< 3 * unit } + + var abc: Range { 0 ..< 3 * unit } + + var ranges: [Range] { [empty, a, b, c, ab, bc, abc] } + + func withEveryPair( + _ body: (Range, Range) throws -> Void + ) rethrows { + try withEvery("range1", in: ranges) { range1 in + try withEvery("range2", in: ranges) { range2 in + try body(range1, range2) + } + } + } + } + + func test_isSubset_Self() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSubset(of: r2) + let a = OrderedSet(r1) + let b = OrderedSet(r2) + expectEqual(a.isSubset(of: b), expected) + } + } + } + + func test_isSubset_Set() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSubset(of: r2) + let a = OrderedSet(r1) + let b = Set(r2) + expectEqual(a.isSubset(of: b), expected) + } + } + } + + func test_isSubset_generic() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSubset(of: r2) + let a = OrderedSet(r1) + let b = r2 + expectEqual(a.isSubset(of: b), expected) + } + } + } + + func test_isSuperset_Self() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSuperset(of: r2) + let a = OrderedSet(r1) + let b = OrderedSet(r2) + expectEqual(a.isSuperset(of: b), expected) + } + } + } + + func test_isSuperset_Set() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSuperset(of: r2) + let a = OrderedSet(r1) + let b = Set(r2) + expectEqual(a.isSuperset(of: b), expected) + } + } + } + + func test_isSuperset_generic() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isSuperset(of: r2) + let a = OrderedSet(r1) + let b = r2 + expectEqual(a.isSuperset(of: b), expected) + } + } + } + + func test_isStrictSubset_Self() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSubset(of: r2) + let a = OrderedSet(r1) + let b = OrderedSet(r2) + expectEqual(a.isStrictSubset(of: b), expected) + } + } + } + + func test_isStrictSubset_Set() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSubset(of: r2) + let a = OrderedSet(r1) + let b = Set(r2) + expectEqual(a.isStrictSubset(of: b), expected) + } + } + } + + func test_isStrictSubset_generic() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSubset(of: r2) + let a = OrderedSet(r1) + let b = r2 + expectEqual(a.isStrictSubset(of: b), expected) + } + } + } + + func test_isStrictSuperset_Self() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSuperset(of: r2) + let a = OrderedSet(r1) + let b = OrderedSet(r2) + expectEqual(a.isStrictSuperset(of: b), expected) + } + } + } + + func test_isStrictSuperset_Set() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSuperset(of: r2) + let a = OrderedSet(r1) + let b = Set(r2) + expectEqual(a.isStrictSuperset(of: b), expected) + } + } + } + + func test_isStrictSuperset_generic() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isStrictSuperset(of: r2) + let a = OrderedSet(r1) + let b = r2 + expectEqual(a.isStrictSuperset(of: b), expected) + } + } + } + + func test_isDisjoint_Self() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isDisjoint(with: r2) + let a = OrderedSet(r1) + let b = OrderedSet(r2) + expectEqual(a.isDisjoint(with: b), expected) + } + } + } + + func test_isDisjoint_Set() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isDisjoint(with: r2) + let a = OrderedSet(r1) + let b = Set(r2) + expectEqual(a.isDisjoint(with: b), expected) + } + } + } + + func test_isDisjoint_generic() { + withEvery("unit", in: [1, 3, 7, 10, 20, 50]) { unit in + SampleRanges(unit: unit).withEveryPair { r1, r2 in + let expected = Set(r1).isDisjoint(with: r2) + let a = OrderedSet(r1) + let b = r2 + expectEqual(a.isDisjoint(with: b), expected) + } + } + } +} diff --git a/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/RandomAccessCollection+Offsets.swift b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/RandomAccessCollection+Offsets.swift new file mode 100644 index 00000000..79db7ede --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Tests/OrderedCollectionsTests/OrderedSet/RandomAccessCollection+Offsets.swift @@ -0,0 +1,61 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + +extension RandomAccessCollection { + @inline(__always) + internal func _index(at offset: Int) -> Index { + index(startIndex, offsetBy: offset) + } + + @inline(__always) + internal func _offset(of index: Index) -> Int { + distance(from: startIndex, to: index) + } + + @inline(__always) + internal func _indexRange(at offsets: Range) -> Range { + _index(at: offsets.lowerBound) ..< _index(at: offsets.upperBound) + } + + @inline(__always) + internal func _indexRange(at offsets: R) -> Range + where R.Bound == Int { + return _indexRange(at: offsets.relative(to: 0 ..< self.count)) + } + + @inline(__always) + internal func _offsetRange(of range: Range) -> Range { + _offset(of: range.lowerBound) ..< _offset(of: range.upperBound) + } + + @inline(__always) + internal func _offsetRange(of range: R) -> Range + where R.Bound == Index { + return _offsetRange(of: range.relative(to: self)) + } + + @inline(__always) + internal subscript(_offset offset: Int) -> Element { + self[_index(at: offset)] + } + + @inline(__always) + internal subscript(_offsets range: Range) -> SubSequence { + self[_indexRange(at: range)] + } + + @inline(__always) + internal subscript(_offsets range: R) -> SubSequence + where R.Bound == Int { + self[_offsets: range.relative(to: 0 ..< count)] + } +} + diff --git a/Carthage/Checkouts/swift-collections/Utils/run-benchmarks.sh b/Carthage/Checkouts/swift-collections/Utils/run-benchmarks.sh new file mode 100755 index 00000000..d38bc7e6 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/run-benchmarks.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +set -eu + +srcroot="$(dirname "$0")/../Benchmarks" +results="batch.results" + +command="${1:-help}" +shift || : + +run() { + local flags + flags="-c release" + flags="$flags -Xswiftc -Xllvm -Xswiftc -align-module-to-page-size" + swift run --package-path "$srcroot" $flags benchmark "$@" +} + +case "$command" in + batch-run) + revision="$(git rev-parse HEAD)" + run library run "$results" \ + --source-url "https://github.com/apple/swift-collections/tree/$revision" \ + --mode replace-all \ + --max-size 4M --cycles 3 \ + --amortized-cutoff 10us \ + "$@" + ;; + batch-render) + run library render "$results" \ + --min-time 100ps --max-time 10us \ + --min-size 1 --max-size 4M \ + "$@" + ;; + batch-clean) + rm -rf "$out"/results + ;; + *) + run "$command" "$@" + ;; +esac diff --git a/Carthage/Checkouts/swift-collections/Utils/run-full-tests.sh b/Carthage/Checkouts/swift-collections/Utils/run-full-tests.sh new file mode 100755 index 00000000..98df0c61 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/run-full-tests.sh @@ -0,0 +1,145 @@ +#!/bin/sh +#===---------------------------------------------------------------------- +# +# This source file is part of the Swift Collections open source project +# +# Copyright (c) 2021 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# +#===---------------------------------------------------------------------- + +# Build & test this package in as many configurations as possible. +# It is a good idea to run this script before each release to uncover +# potential problems not covered by the usual CI runs. +# +# Note that this is not a fully automated solution -- some manual editing will +# sometimes be required when e.g. testing the package on older Xcode releases. + +set -eu + +cd "$(dirname $0)/.." + +build_dir="$(mktemp -d "/tmp/$(basename $0).XXXXX")" + +bold_on="$(tput bold)" +bold_off="$(tput sgr0)" + +red_on="$(tput setaf 1)" +red_off="$(tput sgr0)" + +spm_flags="" + +if [ "$(uname)" = "Darwin" ]; then + swift="xcrun swift" +else + swift="swift" + spm_flags="$spm_flags -j 1" + + if $swift --version | grep 'Swift version 5\.3\.' > /dev/null; then + spm_flags="$spm_flags --enable-test-discovery" + fi +fi + +echo "Build output logs are saved in $bold_on$build_dir$bold_off" +$swift --version + +_count=0 +try() { + label="$1" + shift + _count=$(($_count + 1)) + count="$(printf "%02d" $_count)" + output="$build_dir/$count.$label.log" + echo "$bold_on[$count $label]$bold_off $@" + start="$(date +%s)" + if "$@" >"$output" 2>&1; then + end="$(date +%s)" + echo " Completed in $(($end - $start))s" + else + end="$(date +%s)" + echo " ${red_on}${bold_on}Failed in $(($end - $start))s.${bold_off}${red_off}" \ + "${red_on}See $output for full console output.${red_off}" + tail -10 "$output" | sed 's/^/ /' + fi +} + +# Build using SPM +try "spm.debug" $swift test -c debug $spm_flags --build-path "$build_dir/spm.debug" +try "spm.release" $swift test -c release $spm_flags --build-path "$build_dir/spm.release" + +# Build with CMake +cmake_build_dir="$build_dir/cmake" +try "cmake.generate" cmake -S . -B "$cmake_build_dir" -G Ninja +try "cmake.build-with-ninja" ninja -C "$cmake_build_dir" + +# Build using xcodebuild +try_xcodebuild() { + label="$1" + destination="$2" + shift 2 + + try "$label" \ + xcrun xcodebuild -scheme swift-collections-Package \ + -configuration Release \ + -destination "$destination" \ + -derivedDataPath "$build_dir/xcodebuild" \ + "$@" +} + +if [ "$(uname)" = "Darwin" ]; then + # Build using xcodebuild + try_xcodebuild "xcodebuild.build.macOS" "generic/platform=macOS" build + try_xcodebuild "xcodebuild.build.macCatalyst" "generic/platform=macOS,variant=Mac Catalyst" build + try_xcodebuild "xcodebuild.build.iOS" "generic/platform=iOS" build + try_xcodebuild "xcodebuild.build.iOS-simulator" "generic/platform=iOS Simulator" build + try_xcodebuild "xcodebuild.build.watchOS" "generic/platform=watchOS" build + try_xcodebuild "xcodebuild.build.watchOS-simulator" "generic/platform=watchOS Simulator" build + try_xcodebuild "xcodebuild.build.tvOS" "generic/platform=tvOS" build + try_xcodebuild "xcodebuild.build.tvOS-simulator" "generic/platform=tvOS Simulator" build + + try_xcodebuild "xcodebuild.test.macOS" "platform=macOS" test + try_xcodebuild "xcodebuild.test.macCatalyst" "platform=macOS,variant=Mac Catalyst" test + try_xcodebuild "xcodebuild.test.iOS-simulator" "platform=iOS Simulator,name=iPhone 12" test + try_xcodebuild "xcodebuild.test.watchOS-simulator" "platform=watchOS Simulator,name=Apple Watch Series 6 - 44mm" test + try_xcodebuild "xcodebuild.test.tvOS-simulator" "platform=tvOS Simulator,name=Apple TV 4K (at 1080p) (2nd generation)" test +fi + +# Build benchmarks +cd Benchmarks +try "benchmarks.debug" $swift run -c debug $spm_flags --build-path "$build_dir/benchmarks.debug" benchmark --help +try "benchmarks.release" $swift run -c release $spm_flags --build-path "$build_dir/benchmarks.release" benchmark --help +cd .. +if [ "$(uname)" = "Darwin" ]; then + # FIXME: This should just work on Linux, too + try "run-benchmarks" ./Utils/run-benchmarks.sh run --max-size 128 "$build_dir/benchmark.results" --cycles 3 +fi + +# Build with custom configurations +try "spm.internal-checks" $swift test -c debug -Xswiftc -DCOLLECTIONS_INTERNAL_CHECKS $spm_flags --build-path "$build_dir/spm.internal-checks" +try "spm.deterministic-hashing" $swift test -c debug -Xswiftc -DCOLLECTIONS_DETERMINISTIC_HASHING $spm_flags --build-path "$build_dir/spm.deterministic-hashing" +try "spm.internal-checks+deterministic-hashing" $swift test -c debug -Xswiftc -DCOLLECTIONS_INTERNAL_CHECKS -Xswiftc -DCOLLECTIONS_DETERMINISTIC_HASHING $spm_flags --build-path "$build_dir/spm.internal-checks+deterministic-hashing" + +# Some people like to build their dependencies in warnings-as-errors mode. +# (This won't work with tests on Linux as we have some tests for deprecated APIs that will produce a warning there.) +try "spm.warnings-as-errors.debug" $swift build -c debug -Xswiftc -warnings-as-errors $spm_flags --build-path "$build_dir/spm.warnings-as-errors" +try "spm.warnings-as-errors.release" $swift build -c release -Xswiftc -warnings-as-errors $spm_flags --build-path "$build_dir/spm.warnings-as-errors" + +# Build with library evolution enabled. (This configuration is +# unsupported, but let's make some effort not to break it.) +if [ "$(uname)" = "Darwin" ]; then + try "spm.library-evolution" \ + $swift build \ + -c release \ + $spm_flags \ + --build-path "$build_dir/spm.library-evolution" \ + -Xswiftc -enable-library-evolution + try "xcodebuild.library-evolution" \ + xcodebuild -scheme swift-collections-Package \ + -destination "generic/platform=macOS" \ + -destination "generic/platform=iOS" \ + BUILD_LIBRARY_FOR_DISTRIBUTION=YES +fi + +$swift package clean diff --git a/Carthage/Checkouts/swift-collections/Utils/shuffle-sources.sh b/Carthage/Checkouts/swift-collections/Utils/shuffle-sources.sh new file mode 100755 index 00000000..8eb0a356 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/shuffle-sources.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# +# Randomly reorder Swift source files in the specified directory, then +# try rebuilding the package, in a loop. +# +# This script is useful to help reproducing nondeterministic issues +# with the Swift compiler's MergeModules phase, as in +# https://github.com/apple/swift-collections/issues/7 +# + +set -eu + + +function shuffle() { + input="$1" + + tmp="$(dirname "$input")/tmp" + mkdir "$tmp" + local i=0 + ls "$input"/*.swift | sort -R | while read file; do + mv "$file" "$tmp/$i.swift" + i=$(($i + 1)) + done + + mv "$tmp"/*.swift "$input" + rmdir "$tmp" +} + +if [[ -z "${1+set}" || ! -d "$1" ]]; then + echo "Usage: $0 ..." >&2 + exit 1 +fi + +dir="$1" +shift + +cd "$(dirname "$0")/.." + +i=0 +while true; do + echo + echo "$i" + + rm -rf .build + shuffle "$dir" + xcrun swift build "$@" + i="$(($i + 1))" +done diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/contents.xcworkspacedata b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..8beb57f1 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDETemplateMacros.plist b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDETemplateMacros.plist new file mode 100644 index 00000000..26d96226 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDETemplateMacros.plist @@ -0,0 +1,17 @@ + + + + + FILEHEADER + ===----------------------------------------------------------------------===// +// +// This source file is part of the Swift Collections open source project +// +// Copyright (c) 2022 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// +//===----------------------------------------------------------------------===// + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/Collections.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/Collections.xcscheme new file mode 100644 index 00000000..87bb7432 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/Collections.xcscheme @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsBenchmark.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsBenchmark.xcscheme new file mode 100644 index 00000000..461eb642 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsBenchmark.xcscheme @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsTestSupport.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsTestSupport.xcscheme new file mode 100644 index 00000000..eff5e75b --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/CollectionsTestSupport.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/DequeModule.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/DequeModule.xcscheme new file mode 100644 index 00000000..3e6ac8b4 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/DequeModule.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/OrderedCollections.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/OrderedCollections.xcscheme new file mode 100644 index 00000000..035f4ee0 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/OrderedCollections.xcscheme @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/benchmark.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/benchmark.xcscheme new file mode 100644 index 00000000..6b143694 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/benchmark.xcscheme @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-Package.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-Package.xcscheme new file mode 100644 index 00000000..81438290 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-Package.xcscheme @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-benchmark-Package.xcscheme b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-benchmark-Package.xcscheme new file mode 100644 index 00000000..a4191ca5 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/Utils/swift-collections.xcworkspace/xcshareddata/xcschemes/swift-collections-benchmark-Package.xcscheme @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Carthage/Checkouts/swift-collections/cmake/modules/CMakeLists.txt b/Carthage/Checkouts/swift-collections/cmake/modules/CMakeLists.txt new file mode 100644 index 00000000..e07591af --- /dev/null +++ b/Carthage/Checkouts/swift-collections/cmake/modules/CMakeLists.txt @@ -0,0 +1,19 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +set(SWIFT_COLLECTIONS_EXPORTS_FILE ${CMAKE_CURRENT_BINARY_DIR}/SwiftCollectionsExports.cmake) + +configure_file(SwiftCollectionsConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/SwiftCollectionsConfig.cmake) + +get_property(SWIFT_COLLECTIONS_EXPORTS GLOBAL PROPERTY SWIFT_COLLECTIONS_EXPORTS) +export(TARGETS ${SWIFT_COLLECTIONS_EXPORTS} + NAMESPACE SwiftCollections:: + FILE ${SWIFT_COLLECTIONS_EXPORTS_FILE} + EXPORT_LINK_INTERFACE_LIBRARIES) diff --git a/Carthage/Checkouts/swift-collections/cmake/modules/SwiftCollectionsConfig.cmake.in b/Carthage/Checkouts/swift-collections/cmake/modules/SwiftCollectionsConfig.cmake.in new file mode 100644 index 00000000..3343244d --- /dev/null +++ b/Carthage/Checkouts/swift-collections/cmake/modules/SwiftCollectionsConfig.cmake.in @@ -0,0 +1,12 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +if(NOT TARGET SwiftCollections) + include(@SWIFT_COLLECTIONS_EXPORTS_FILE@) +endif() diff --git a/Carthage/Checkouts/swift-collections/cmake/modules/SwiftSupport.cmake b/Carthage/Checkouts/swift-collections/cmake/modules/SwiftSupport.cmake new file mode 100644 index 00000000..d3d40591 --- /dev/null +++ b/Carthage/Checkouts/swift-collections/cmake/modules/SwiftSupport.cmake @@ -0,0 +1,100 @@ +#[[ +This source file is part of the Swift Collections Open Source Project + +Copyright (c) 2021 Apple Inc. and the Swift project authors +Licensed under Apache License v2.0 with Runtime Library Exception + +See https://swift.org/LICENSE.txt for license information +#]] + +# Returns the architecture name in a variable +# +# Usage: +# get_swift_host_arch(result_var_name) +# +# Sets ${result_var_name} with the converted architecture name derived from +# CMAKE_SYSTEM_PROCESSOR. +function(get_swift_host_arch result_var_name) + if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64") + set("${result_var_name}" "x86_64" PARENT_SCOPE) + elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "AArch64|aarch64|arm64") + if(CMAKE_SYSTEM_NAME MATCHES Darwin) + set("${result_var_name}" "arm64" PARENT_SCOPE) + else() + set("${result_var_name}" "aarch64" PARENT_SCOPE) + endif() + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64") + set("${result_var_name}" "powerpc64" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le") + set("${result_var_name}" "powerpc64le" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x") + set("${result_var_name}" "s390x" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l") + set("${result_var_name}" "armv6" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l") + set("${result_var_name}" "armv7" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a") + set("${result_var_name}" "armv7" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "amd64") + set("${result_var_name}" "amd64" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64") + set("${result_var_name}" "x86_64" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64") + set("${result_var_name}" "itanium" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86") + set("${result_var_name}" "i686" PARENT_SCOPE) + elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686") + set("${result_var_name}" "i686" PARENT_SCOPE) + else() + message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}") + endif() +endfunction() + +# Returns the os name in a variable +# +# Usage: +# get_swift_host_os(result_var_name) +# +# +# Sets ${result_var_name} with the converted OS name derived from +# CMAKE_SYSTEM_NAME. +function(get_swift_host_os result_var_name) + if(CMAKE_SYSTEM_NAME STREQUAL Darwin) + set(${result_var_name} macosx PARENT_SCOPE) + else() + string(TOLOWER ${CMAKE_SYSTEM_NAME} cmake_system_name_lc) + set(${result_var_name} ${cmake_system_name_lc} PARENT_SCOPE) + endif() +endfunction() + +function(_install_target module) + get_swift_host_os(swift_os) + get_target_property(type ${module} TYPE) + + if(type STREQUAL STATIC_LIBRARY) + set(swift swift_static) + else() + set(swift swift) + endif() + + install(TARGETS ${module} + ARCHIVE DESTINATION lib/${swift}/${swift_os} + LIBRARY DESTINATION lib/${swift}/${swift_os} + RUNTIME DESTINATION bin) + if(type STREQUAL EXECUTABLE) + return() + endif() + + get_swift_host_arch(swift_arch) + get_target_property(module_name ${module} Swift_MODULE_NAME) + if(NOT module_name) + set(module_name ${module}) + endif() + + install(FILES $/${module_name}.swiftdoc + DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule + RENAME ${swift_arch}.swiftdoc) + install(FILES $/${module_name}.swiftmodule + DESTINATION lib/${swift}/${swift_os}/${module_name}.swiftmodule + RENAME ${swift_arch}.swiftmodule) +endfunction() diff --git a/Carthage/Checkouts/websocket-kit/.github/workflows/api-docs.yml b/Carthage/Checkouts/websocket-kit/.github/workflows/api-docs.yml new file mode 100644 index 00000000..d521498e --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/.github/workflows/api-docs.yml @@ -0,0 +1,18 @@ +name: deploy-api-docs +on: + push: + branches: + - main + +jobs: + deploy: + name: api.vapor.codes + runs-on: ubuntu-latest + steps: + - name: Deploy api-docs + uses: appleboy/ssh-action@master + with: + host: vapor.codes + username: vapor + key: ${{ secrets.VAPOR_CODES_SSH_KEY }} + script: ./github-actions/deploy-api-docs.sh diff --git a/Carthage/Checkouts/websocket-kit/.github/workflows/main-codecov.yml b/Carthage/Checkouts/websocket-kit/.github/workflows/main-codecov.yml new file mode 100644 index 00000000..1d0fe384 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/.github/workflows/main-codecov.yml @@ -0,0 +1,9 @@ +name: Update code coverage baselines +on: + push: { branches: [ main ] } +jobs: + update-main-codecov: + uses: vapor/ci/.github/workflows/run-unit-tests.yml@reusable-workflows + with: + with_coverage: true + with_tsan: true diff --git a/Carthage/Checkouts/websocket-kit/.github/workflows/projectboard.yml b/Carthage/Checkouts/websocket-kit/.github/workflows/projectboard.yml new file mode 100644 index 00000000..0e4e66f6 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/.github/workflows/projectboard.yml @@ -0,0 +1,31 @@ +name: issue-to-project-board-workflow +on: + # Trigger when an issue gets labeled or deleted + issues: + types: [reopened, closed, labeled, unlabeled, assigned, unassigned] + +jobs: + setup_matrix_input: + runs-on: ubuntu-latest + + steps: + - id: set-matrix + run: | + output=$(curl ${{ github.event.issue.url }}/labels | jq '.[] | .name') || output="" + + echo '======================' + echo 'Process incoming data' + echo '======================' + json=$(echo $output | sed 's/"\s"/","/g') + echo $json + echo "::set-output name=matrix::$(echo $json)" + outputs: + issueTags: ${{ steps.set-matrix.outputs.matrix }} + + Manage_project_issues: + needs: setup_matrix_input + uses: vapor/ci/.github/workflows/issues-to-project-board.yml@main + with: + labelsJson: ${{ needs.setup_matrix_input.outputs.issueTags }} + secrets: + PROJECT_BOARD_AUTOMATION_PAT: "${{ secrets.PROJECT_BOARD_AUTOMATION_PAT }}" diff --git a/Carthage/Checkouts/websocket-kit/.github/workflows/test.yml b/Carthage/Checkouts/websocket-kit/.github/workflows/test.yml new file mode 100644 index 00000000..2dcc7191 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/.github/workflows/test.yml @@ -0,0 +1,41 @@ +name: test +on: +- pull_request +jobs: + vapor-integration: + runs-on: ubuntu-latest + container: + image: swift:5.6-focal + steps: + - name: Check out package + uses: actions/checkout@v3 + with: { path: 'websocket-kit' } + - name: Check out Vapor + uses: actions/checkout@v3 + with: { repository: 'vapor/vapor', path: 'vapor' } + - name: Use local package in Vapor + run: | + swift package --package-path vapor edit websocket-kit --path websocket-kit + - name: Run Vapor tests + run: swift test --package-path vapor + + unit-tests: + uses: vapor/ci/.github/workflows/run-unit-tests.yml@reusable-workflows + with: + with_coverage: true + with_tsan: false + coverage_ignores: '/Tests/' + + api-breakage: + runs-on: ubuntu-latest + container: + image: swift:5.6-focal + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Mark the workspace as safe + run: git config --global --add safe.directory ${GITHUB_WORKSPACE} + - name: API breaking changes + run: swift package diagnose-api-breaking-changes origin/main diff --git a/Carthage/Checkouts/websocket-kit/.gitignore b/Carthage/Checkouts/websocket-kit/.gitignore new file mode 100644 index 00000000..68b8b308 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +DerivedData +.swiftpm +Package.resolved diff --git a/Carthage/Checkouts/websocket-kit/LICENSE b/Carthage/Checkouts/websocket-kit/LICENSE new file mode 100644 index 00000000..1593c318 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2020 Qutheory, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Carthage/Checkouts/websocket-kit/NOTICES.txt b/Carthage/Checkouts/websocket-kit/NOTICES.txt new file mode 100644 index 00000000..52e13d63 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/NOTICES.txt @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Vapor open source project +// +// Copyright (c) 2017-2022 Vapor project authors +// Licensed under MIT +// +// See LICENSE for license information +// +// SPDX-License-Identifier: MIT +// +//===----------------------------------------------------------------------===// + +This product contains a derivation of `NIOSSLTestHelpers.swift` from SwiftNIO SSL. + + * LICENSE (Apache License 2.0): + * https://www.apache.org/licenses/LICENSE-2.0 + * HOMEPAGE: + * https://github.com/apple/swift-nio-ssl diff --git a/Carthage/Checkouts/websocket-kit/Package.swift b/Carthage/Checkouts/websocket-kit/Package.swift new file mode 100644 index 00000000..74dcbd6b --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Package.swift @@ -0,0 +1,36 @@ +// swift-tools-version:5.4 +import PackageDescription + +let package = Package( + name: "websocket-kit", + platforms: [ + .macOS(.v10_15), + .iOS(.v13), + .tvOS(.v13), + ], + products: [ + .library(name: "WebSocketKit", targets: ["WebSocketKit"]), + ], + dependencies: [ + .package(url: "https://github.com/apple/swift-nio.git", from: "2.33.0"), + .package(url: "https://github.com/apple/swift-nio-ssl.git", from: "2.14.0"), + .package(url: "https://github.com/apple/swift-nio-transport-services.git", from: "1.11.4"), + .package(url: "https://github.com/apple/swift-atomics.git", from: "1.0.2"), + ], + targets: [ + .target(name: "WebSocketKit", dependencies: [ + .product(name: "NIO", package: "swift-nio"), + .product(name: "NIOCore", package: "swift-nio"), + .product(name: "NIOConcurrencyHelpers", package: "swift-nio"), + .product(name: "NIOFoundationCompat", package: "swift-nio"), + .product(name: "NIOHTTP1", package: "swift-nio"), + .product(name: "NIOSSL", package: "swift-nio-ssl"), + .product(name: "NIOWebSocket", package: "swift-nio"), + .product(name: "NIOTransportServices", package: "swift-nio-transport-services"), + .product(name: "Atomics", package: "swift-atomics") + ]), + .testTarget(name: "WebSocketKitTests", dependencies: [ + .target(name: "WebSocketKit"), + ]), + ] +) diff --git a/Carthage/Checkouts/websocket-kit/README.md b/Carthage/Checkouts/websocket-kit/README.md new file mode 100644 index 00000000..71370ce1 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/README.md @@ -0,0 +1,24 @@ +

+ NIOWebSocketClient +
+
+
+ API Docs + + + Team Chat + + + MIT License + + + Continuous Integration + + + Swift 5.2 + +

diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Concurrency/WebSocket+Concurrency.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Concurrency/WebSocket+Concurrency.swift new file mode 100644 index 00000000..06f8b9ef --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Concurrency/WebSocket+Concurrency.swift @@ -0,0 +1,145 @@ +#if compiler(>=5.5) && canImport(_Concurrency) +import NIOCore +import NIOWebSocket +import Foundation + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +extension WebSocket { + public func send(_ text: S) async throws + where S: Collection, S.Element == Character + { + let promise = eventLoop.makePromise(of: Void.self) + send(text, promise: promise) + return try await promise.futureResult.get() + } + + public func send(_ binary: [UInt8]) async throws { + let promise = eventLoop.makePromise(of: Void.self) + send(binary, promise: promise) + return try await promise.futureResult.get() + } + + public func sendPing() async throws { + let promise = eventLoop.makePromise(of: Void.self) + sendPing(promise: promise) + return try await promise.futureResult.get() + } + + public func send( + raw data: Data, + opcode: WebSocketOpcode, + fin: Bool = true + ) async throws + where Data: DataProtocol + { + let promise = eventLoop.makePromise(of: Void.self) + send(raw: data, opcode: opcode, fin: fin, promise: promise) + return try await promise.futureResult.get() + } + + public func close(code: WebSocketErrorCode = .goingAway) async throws { + try await close(code: code).get() + } + + public func onText(_ callback: @escaping (WebSocket, String) async -> ()) { + onText { socket, text in + Task { + await callback(socket, text) + } + } + } + + public func onBinary(_ callback: @escaping (WebSocket, ByteBuffer) async -> ()) { + onBinary { socket, binary in + Task { + await callback(socket, binary) + } + } + } + + public func onPong(_ callback: @escaping (WebSocket) async -> ()) { + onPong { socket in + Task { + await callback(socket) + } + } + } + + public func onPing(_ callback: @escaping (WebSocket) async -> ()) { + onPing { socket in + Task { + await callback(socket) + } + } + } + + public static func connect( + to url: String, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) async -> () + ) async throws { + return try await self.connect( + to: url, + headers: headers, + configuration: configuration, + on: eventLoopGroup, + onUpgrade: { ws in + Task { + await onUpgrade(ws) + } + } + ).get() + } + + public static func connect( + to url: URL, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) async -> () + ) async throws { + return try await self.connect( + to: url, + headers: headers, + configuration: configuration, + on: eventLoopGroup, + onUpgrade: { ws in + Task { + await onUpgrade(ws) + } + } + ).get() + } + + public static func connect( + scheme: String = "ws", + host: String, + port: Int = 80, + path: String = "/", + query: String? = nil, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) async -> () + ) async throws { + return try await self.connect( + scheme: scheme, + host: host, + port: port, + path: path, + query: query, + headers: headers, + configuration: configuration, + on: eventLoopGroup, + onUpgrade: { ws in + Task { + await onUpgrade(ws) + } + } + ).get() + } +} + +#endif diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Exports.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Exports.swift new file mode 100644 index 00000000..4afa1012 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/Exports.swift @@ -0,0 +1,10 @@ +@_exported import struct NIO.ByteBuffer +@_exported import protocol NIO.Channel +@_exported import protocol NIO.EventLoop +@_exported import protocol NIO.EventLoopGroup +@_exported import struct NIO.EventLoopPromise +@_exported import class NIO.EventLoopFuture + +@_exported import struct NIOHTTP1.HTTPHeaders + +@_exported import struct Foundation.URL diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/HTTPInitialRequestHandler.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/HTTPInitialRequestHandler.swift new file mode 100644 index 00000000..9dbe9368 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/HTTPInitialRequestHandler.swift @@ -0,0 +1,61 @@ +import NIO +import NIOHTTP1 + +final class HTTPInitialRequestHandler: ChannelInboundHandler, RemovableChannelHandler { + typealias InboundIn = HTTPClientResponsePart + typealias OutboundOut = HTTPClientRequestPart + + let host: String + let path: String + let query: String? + let headers: HTTPHeaders + let upgradePromise: EventLoopPromise + + init(host: String, path: String, query: String?, headers: HTTPHeaders, upgradePromise: EventLoopPromise) { + self.host = host + self.path = path + self.query = query + self.headers = headers + self.upgradePromise = upgradePromise + } + + func channelActive(context: ChannelHandlerContext) { + var headers = self.headers + headers.add(name: "Content-Type", value: "text/plain; charset=utf-8") + headers.add(name: "Host", value: self.host) + + var uri = self.path.hasPrefix("/") ? self.path : "/" + self.path + if let query = self.query { + uri += "?\(query)" + } + let requestHead = HTTPRequestHead( + version: HTTPVersion(major: 1, minor: 1), + method: .GET, + uri: uri, + headers: headers + ) + context.write(self.wrapOutboundOut(.head(requestHead)), promise: nil) + + let emptyBuffer = context.channel.allocator.buffer(capacity: 0) + let body = HTTPClientRequestPart.body(.byteBuffer(emptyBuffer)) + context.write(self.wrapOutboundOut(body), promise: nil) + + context.writeAndFlush(self.wrapOutboundOut(.end(nil)), promise: nil) + } + + func channelRead(context: ChannelHandlerContext, data: NIOAny) { + let clientResponse = self.unwrapInboundIn(data) + switch clientResponse { + case .head(let responseHead): + self.upgradePromise.fail(WebSocketClient.Error.invalidResponseStatus(responseHead)) + case .body: break + case .end: + context.close(promise: nil) + } + } + + func errorCaught(context: ChannelHandlerContext, error: Error) { + self.upgradePromise.fail(error) + context.close(promise: nil) + } +} diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket+Connect.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket+Connect.swift new file mode 100644 index 00000000..4bc74942 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket+Connect.swift @@ -0,0 +1,66 @@ +extension WebSocket { + public static func connect( + to url: String, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + guard let url = URL(string: url) else { + return eventLoopGroup.next().makeFailedFuture(WebSocketClient.Error.invalidURL) + } + return self.connect( + to: url, + headers: headers, + configuration: configuration, + on: eventLoopGroup, + onUpgrade: onUpgrade + ) + } + + public static func connect( + to url: URL, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + let scheme = url.scheme ?? "ws" + return self.connect( + scheme: scheme, + host: url.host ?? "localhost", + port: url.port ?? (scheme == "wss" ? 443 : 80), + path: url.path, + query: url.query, + headers: headers, + configuration: configuration, + on: eventLoopGroup, + onUpgrade: onUpgrade + ) + } + + public static func connect( + scheme: String = "ws", + host: String, + port: Int = 80, + path: String = "/", + query: String? = nil, + headers: HTTPHeaders = [:], + configuration: WebSocketClient.Configuration = .init(), + on eventLoopGroup: EventLoopGroup, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + return WebSocketClient( + eventLoopGroupProvider: .shared(eventLoopGroup), + configuration: configuration + ).connect( + scheme: scheme, + host: host, + port: port, + path: path, + query: query, + headers: headers, + onUpgrade: onUpgrade + ) + } +} diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket.swift new file mode 100644 index 00000000..26c7f6d6 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocket.swift @@ -0,0 +1,323 @@ +import NIO +import NIOWebSocket +import NIOHTTP1 +import NIOSSL +import Foundation +import NIOFoundationCompat + +public final class WebSocket { + enum PeerType { + case server + case client + } + + public var eventLoop: EventLoop { + return channel.eventLoop + } + + public var isClosed: Bool { + !self.channel.isActive + } + public private(set) var closeCode: WebSocketErrorCode? + + public var onClose: EventLoopFuture { + self.channel.closeFuture + } + + private let channel: Channel + private var onTextCallback: (WebSocket, String) -> () + private var onBinaryCallback: (WebSocket, ByteBuffer) -> () + private var onPongCallback: (WebSocket) -> () + private var onPingCallback: (WebSocket) -> () + private var frameSequence: WebSocketFrameSequence? + private let type: PeerType + private var waitingForPong: Bool + private var waitingForClose: Bool + private var scheduledTimeoutTask: Scheduled? + + init(channel: Channel, type: PeerType) { + self.channel = channel + self.type = type + self.onTextCallback = { _, _ in } + self.onBinaryCallback = { _, _ in } + self.onPongCallback = { _ in } + self.onPingCallback = { _ in } + self.waitingForPong = false + self.waitingForClose = false + self.scheduledTimeoutTask = nil + } + + public func onText(_ callback: @escaping (WebSocket, String) -> ()) { + self.onTextCallback = callback + } + + public func onBinary(_ callback: @escaping (WebSocket, ByteBuffer) -> ()) { + self.onBinaryCallback = callback + } + + public func onPong(_ callback: @escaping (WebSocket) -> ()) { + self.onPongCallback = callback + } + + public func onPing(_ callback: @escaping (WebSocket) -> ()) { + self.onPingCallback = callback + } + + /// If set, this will trigger automatic pings on the connection. If ping is not answered before + /// the next ping is sent, then the WebSocket will be presumed innactive and will be closed + /// automatically. + /// These pings can also be used to keep the WebSocket alive if there is some other timeout + /// mechanism shutting down innactive connections, such as a Load Balancer deployed in + /// front of the server. + public var pingInterval: TimeAmount? { + didSet { + if pingInterval != nil { + if scheduledTimeoutTask == nil { + waitingForPong = false + self.pingAndScheduleNextTimeoutTask() + } + } else { + scheduledTimeoutTask?.cancel() + } + } + } + + public func send(_ text: S, promise: EventLoopPromise? = nil) + where S: Collection, S.Element == Character + { + let string = String(text) + var buffer = channel.allocator.buffer(capacity: text.count) + buffer.writeString(string) + self.send(raw: buffer.readableBytesView, opcode: .text, fin: true, promise: promise) + + } + + public func send(_ binary: [UInt8], promise: EventLoopPromise? = nil) { + self.send(raw: binary, opcode: .binary, fin: true, promise: promise) + } + + public func sendPing(promise: EventLoopPromise? = nil) { + self.send( + raw: Data(), + opcode: .ping, + fin: true, + promise: promise + ) + } + + public func send( + raw data: Data, + opcode: WebSocketOpcode, + fin: Bool = true, + promise: EventLoopPromise? = nil + ) + where Data: DataProtocol + { + var buffer = channel.allocator.buffer(capacity: data.count) + buffer.writeBytes(data) + let frame = WebSocketFrame( + fin: fin, + opcode: opcode, + maskKey: self.makeMaskKey(), + data: buffer + ) + self.channel.writeAndFlush(frame, promise: promise) + } + + public func close(code: WebSocketErrorCode = .goingAway) -> EventLoopFuture { + let promise = self.eventLoop.makePromise(of: Void.self) + self.close(code: code, promise: promise) + return promise.futureResult + } + + public func close( + code: WebSocketErrorCode = .goingAway, + promise: EventLoopPromise? + ) { + guard !self.isClosed else { + promise?.succeed(()) + return + } + guard !self.waitingForClose else { + promise?.succeed(()) + return + } + self.waitingForClose = true + self.closeCode = code + + let codeAsInt = UInt16(webSocketErrorCode: code) + let codeToSend: WebSocketErrorCode + if codeAsInt == 1005 || codeAsInt == 1006 { + /// Code 1005 and 1006 are used to report errors to the application, but must never be sent over + /// the wire (per https://tools.ietf.org/html/rfc6455#section-7.4) + codeToSend = .normalClosure + } else { + codeToSend = code + } + + var buffer = channel.allocator.buffer(capacity: 2) + buffer.write(webSocketErrorCode: codeToSend) + + self.send(raw: buffer.readableBytesView, opcode: .connectionClose, fin: true, promise: promise) + } + + func makeMaskKey() -> WebSocketMaskingKey? { + switch type { + case .client: + var bytes: [UInt8] = [] + for _ in 0..<4 { + bytes.append(.random(in: .min ..< .max)) + } + return WebSocketMaskingKey(bytes) + case .server: + return nil + } + } + + func handle(incoming frame: WebSocketFrame) { + switch frame.opcode { + case .connectionClose: + if self.waitingForClose { + // peer confirmed close, time to close channel + self.channel.close(mode: .all, promise: nil) + } else { + // peer asking for close, confirm and close output side channel + let promise = self.eventLoop.makePromise(of: Void.self) + var data = frame.data + let maskingKey = frame.maskKey + if let maskingKey = maskingKey { + data.webSocketUnmask(maskingKey) + } + self.close( + code: data.readWebSocketErrorCode() ?? .unknown(1005), + promise: promise + ) + promise.futureResult.whenComplete { _ in + self.channel.close(mode: .all, promise: nil) + } + } + case .ping: + if frame.fin { + var frameData = frame.data + let maskingKey = frame.maskKey + if let maskingKey = maskingKey { + frameData.webSocketUnmask(maskingKey) + } + self.onPingCallback(self) + self.send( + raw: frameData.readableBytesView, + opcode: .pong, + fin: true, + promise: nil + ) + } else { + self.close(code: .protocolError, promise: nil) + } + case .pong: + if frame.fin { + var frameData = frame.data + let maskingKey = frame.maskKey + if let maskingKey = maskingKey { + frameData.webSocketUnmask(maskingKey) + } + self.waitingForPong = false + self.onPongCallback(self) + } else { + self.close(code: .protocolError, promise: nil) + } + case .text, .binary: + // create a new frame sequence or use existing + var frameSequence: WebSocketFrameSequence + if let existing = self.frameSequence { + frameSequence = existing + } else { + frameSequence = WebSocketFrameSequence(type: frame.opcode) + } + // append this frame and update the sequence + frameSequence.append(frame) + self.frameSequence = frameSequence + case .continuation: + // we must have an existing sequence + if var frameSequence = self.frameSequence { + // append this frame and update + frameSequence.append(frame) + self.frameSequence = frameSequence + } else { + self.close(code: .protocolError, promise: nil) + } + default: + // We ignore all other frames. + break + } + + // if this frame was final and we have a non-nil frame sequence, + // output it to the websocket and clear storage + if let frameSequence = self.frameSequence, frame.fin { + switch frameSequence.type { + case .binary: + self.onBinaryCallback(self, frameSequence.binaryBuffer) + case .text: + self.onTextCallback(self, frameSequence.textBuffer) + case .ping, .pong: + assertionFailure("Control frames never have a frameSequence") + default: break + } + self.frameSequence = nil + } + } + + private func pingAndScheduleNextTimeoutTask() { + guard channel.isActive, let pingInterval = pingInterval else { + return + } + + if waitingForPong { + // We never received a pong from our last ping, so the connection has timed out + let promise = self.eventLoop.makePromise(of: Void.self) + self.close(code: .unknown(1006), promise: promise) + promise.futureResult.whenComplete { _ in + // Usually, closing a WebSocket is done by sending the close frame and waiting + // for the peer to respond with their close frame. We are in a timeout situation, + // so the other side likely will never send the close frame. We just close the + // channel ourselves. + self.channel.close(mode: .all, promise: nil) + } + } else { + self.sendPing() + self.waitingForPong = true + self.scheduledTimeoutTask = self.eventLoop.scheduleTask( + deadline: .now() + pingInterval, + self.pingAndScheduleNextTimeoutTask + ) + } + } + + deinit { + assert(self.isClosed, "WebSocket was not closed before deinit.") + } +} + +private struct WebSocketFrameSequence { + var binaryBuffer: ByteBuffer + var textBuffer: String + var type: WebSocketOpcode + + init(type: WebSocketOpcode) { + self.binaryBuffer = ByteBufferAllocator().buffer(capacity: 0) + self.textBuffer = .init() + self.type = type + } + + mutating func append(_ frame: WebSocketFrame) { + var data = frame.unmaskedData + switch type { + case .binary: + self.binaryBuffer.writeBuffer(&data) + case .text: + if let string = data.readString(length: data.readableBytes) { + self.textBuffer += string + } + default: break + } + } +} diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketClient.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketClient.swift new file mode 100644 index 00000000..2f13cfc7 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketClient.swift @@ -0,0 +1,173 @@ +import Foundation +import NIO +import NIOConcurrencyHelpers +import NIOHTTP1 +import NIOWebSocket +import NIOSSL +import NIOTransportServices +import Atomics + +public final class WebSocketClient { + public enum Error: Swift.Error, LocalizedError { + case invalidURL + case invalidResponseStatus(HTTPResponseHead) + case alreadyShutdown + public var errorDescription: String? { + return "\(self)" + } + } + + public enum EventLoopGroupProvider { + case shared(EventLoopGroup) + case createNew + } + + public struct Configuration { + public var tlsConfiguration: TLSConfiguration? + public var maxFrameSize: Int + + public init( + tlsConfiguration: TLSConfiguration? = nil, + maxFrameSize: Int = 1 << 14 + ) { + self.tlsConfiguration = tlsConfiguration + self.maxFrameSize = maxFrameSize + } + } + + let eventLoopGroupProvider: EventLoopGroupProvider + let group: EventLoopGroup + let configuration: Configuration + let isShutdown = ManagedAtomic(false) + + public init(eventLoopGroupProvider: EventLoopGroupProvider, configuration: Configuration = .init()) { + self.eventLoopGroupProvider = eventLoopGroupProvider + switch self.eventLoopGroupProvider { + case .shared(let group): + self.group = group + case .createNew: + self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1) + } + self.configuration = configuration + } + + public func connect( + scheme: String, + host: String, + port: Int, + path: String = "/", + query: String? = nil, + headers: HTTPHeaders = [:], + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + assert(["ws", "wss"].contains(scheme)) + let upgradePromise = self.group.next().makePromise(of: Void.self) + let bootstrap = WebSocketClient.makeBootstrap(on: self.group) + .channelOption(ChannelOptions.socket(SocketOptionLevel(IPPROTO_TCP), TCP_NODELAY), value: 1) + .channelInitializer { channel in + let httpHandler = HTTPInitialRequestHandler( + host: host, + path: path, + query: query, + headers: headers, + upgradePromise: upgradePromise + ) + + var key: [UInt8] = [] + for _ in 0..<16 { + key.append(.random(in: .min ..< .max)) + } + let websocketUpgrader = NIOWebSocketClientUpgrader( + requestKey: Data(key).base64EncodedString(), + maxFrameSize: self.configuration.maxFrameSize, + automaticErrorHandling: true, + upgradePipelineHandler: { channel, req in + return WebSocket.client(on: channel, onUpgrade: onUpgrade) + } + ) + + let config: NIOHTTPClientUpgradeConfiguration = ( + upgraders: [websocketUpgrader], + completionHandler: { context in + upgradePromise.succeed(()) + channel.pipeline.removeHandler(httpHandler, promise: nil) + } + ) + + if scheme == "wss" { + do { + let context = try NIOSSLContext( + configuration: self.configuration.tlsConfiguration ?? .makeClientConfiguration() + ) + let tlsHandler: NIOSSLClientHandler + do { + tlsHandler = try NIOSSLClientHandler(context: context, serverHostname: host) + } catch let error as NIOSSLExtraError where error == .cannotUseIPAddressInSNI { + tlsHandler = try NIOSSLClientHandler(context: context, serverHostname: nil) + } + return channel.pipeline.addHandler(tlsHandler).flatMap { + channel.pipeline.addHTTPClientHandlers(leftOverBytesStrategy: .forwardBytes, withClientUpgrade: config) + }.flatMap { + channel.pipeline.addHandler(httpHandler) + } + } catch { + return channel.pipeline.close(mode: .all) + } + } else { + return channel.pipeline.addHTTPClientHandlers( + leftOverBytesStrategy: .forwardBytes, + withClientUpgrade: config + ).flatMap { + channel.pipeline.addHandler(httpHandler) + } + } + } + + let connect = bootstrap.connect(host: host, port: port) + connect.cascadeFailure(to: upgradePromise) + return connect.flatMap { channel in + return upgradePromise.futureResult + } + } + + + public func syncShutdown() throws { + switch self.eventLoopGroupProvider { + case .shared: + return + case .createNew: + if self.isShutdown.compareExchange( + expected: false, + desired: true, + ordering: .relaxed + ).exchanged { + try self.group.syncShutdownGracefully() + } else { + throw WebSocketClient.Error.alreadyShutdown + } + } + } + + private static func makeBootstrap(on eventLoop: EventLoopGroup) -> NIOClientTCPBootstrapProtocol { + #if canImport(Network) + if let tsBootstrap = NIOTSConnectionBootstrap(validatingGroup: eventLoop) { + return tsBootstrap + } + #endif + + if let nioBootstrap = ClientBootstrap(validatingGroup: eventLoop) { + return nioBootstrap + } + + fatalError("No matching bootstrap found") + } + + deinit { + switch self.eventLoopGroupProvider { + case .shared: + return + case .createNew: + assert(self.isShutdown.load(ordering: .relaxed), "WebSocketClient not shutdown before deinit.") + } + } +} diff --git a/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketHandler.swift b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketHandler.swift new file mode 100644 index 00000000..b54f9fb7 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Sources/WebSocketKit/WebSocketHandler.swift @@ -0,0 +1,77 @@ +import NIO +import NIOWebSocket + +extension WebSocket { + public static func client( + on channel: Channel, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + return self.handle(on: channel, as: .client, onUpgrade: onUpgrade) + } + + public static func server( + on channel: Channel, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + return self.handle(on: channel, as: .server, onUpgrade: onUpgrade) + } + + private static func handle( + on channel: Channel, + as type: PeerType, + onUpgrade: @escaping (WebSocket) -> () + ) -> EventLoopFuture { + let webSocket = WebSocket(channel: channel, type: type) + return channel.pipeline.addHandler(WebSocketHandler(webSocket: webSocket)).map { _ in + onUpgrade(webSocket) + } + } +} + +extension WebSocketErrorCode { + init(_ error: NIOWebSocketError) { + switch error { + case .invalidFrameLength: + self = .messageTooLarge + case .fragmentedControlFrame, + .multiByteControlFrameLength: + self = .protocolError + } + } +} + +private final class WebSocketHandler: ChannelInboundHandler { + typealias InboundIn = WebSocketFrame + typealias OutboundOut = WebSocketFrame + private var webSocket: WebSocket + + init(webSocket: WebSocket) { + self.webSocket = webSocket + } + + func channelRead(context: ChannelHandlerContext, data: NIOAny) { + let frame = self.unwrapInboundIn(data) + self.webSocket.handle(incoming: frame) + } + + func errorCaught(context: ChannelHandlerContext, error: Error) { + let errorCode: WebSocketErrorCode + if let error = error as? NIOWebSocketError { + errorCode = WebSocketErrorCode(error) + } else { + errorCode = .unexpectedServerError + } + _ = webSocket.close(code: errorCode) + + // We always forward the error on to let others see it. + context.fireErrorCaught(error) + } + + func channelInactive(context: ChannelHandlerContext) { + let closedAbnormally = WebSocketErrorCode.unknown(1006) + _ = webSocket.close(code: closedAbnormally) + + // We always forward the error on to let others see it. + context.fireChannelInactive() + } +} diff --git a/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/AsyncWebSocketKitTests.swift b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/AsyncWebSocketKitTests.swift new file mode 100644 index 00000000..04538f65 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/AsyncWebSocketKitTests.swift @@ -0,0 +1,55 @@ +#if compiler(>=5.5) && canImport(_Concurrency) +import XCTest +import NIO +import NIOHTTP1 +import NIOWebSocket +@testable import WebSocketKit + +@available(macOS 12, iOS 15, watchOS 8, tvOS 15, *) +final class AsyncWebSocketKitTests: XCTestCase { + func testWebSocketEcho() async throws { + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.onText { ws, text in + ws.send(text) + } + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + let promise = elg.next().makePromise(of: String.self) + + try await WebSocket.connect(to: "ws://localhost:\(port)", on: elg) { ws in + do { + try await ws.send("hello") + ws.onText { ws, string in + promise.succeed(string) + do { + try await ws.close() + } catch { + XCTFail("Failed to close websocket, error: \(error)") + } + } + } catch { + promise.fail(error) + } + } + + let result = try await promise.futureResult.get() + XCTAssertEqual(result, "hello") + try await server.close(mode: .all) + } + + var elg: EventLoopGroup! + override func setUp() { + // needs to be at least two to avoid client / server on same EL timing issues + self.elg = MultiThreadedEventLoopGroup(numberOfThreads: 2) + } + override func tearDown() { + try! self.elg.syncShutdownGracefully() + } +} + +#endif diff --git a/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/SSLTestHelpers.swift b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/SSLTestHelpers.swift new file mode 100644 index 00000000..574da640 --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/SSLTestHelpers.swift @@ -0,0 +1,142 @@ +//===----------------------------------------------------------------------===// +// +// This source file is based on NIOSSLTestHelpers.swift from +// the SwiftNIO open source project +// +// Copyright (c) 2017-2021 Apple Inc. and the SwiftNIO project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftNIO project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import Foundation +@_implementationOnly import CNIOBoringSSL +@testable import NIOSSL + +// This function generates a random number suitable for use in an X509 +// serial field. This needs to be a positive number less than 2^159 +// (such that it will fit into 20 ASN.1 bytes). +// This also needs to be portable across operating systems, and the easiest +// way to do that is to use either getentropy() or read from urandom. Sadly +// we need to support old Linuxes which may not possess getentropy as a syscall +// (and definitely don't support it in glibc), so we need to read from urandom. +// In the future we should just use getentropy and be happy. +func randomSerialNumber() -> ASN1_INTEGER { + let bytesToRead = 20 + let fd = open("/dev/urandom", O_RDONLY) + precondition(fd != -1) + defer { + close(fd) + } + + var readBytes = Array.init(repeating: UInt8(0), count: bytesToRead) + let readCount = readBytes.withUnsafeMutableBytes { + return read(fd, $0.baseAddress, bytesToRead) + } + precondition(readCount == bytesToRead) + + // Our 20-byte number needs to be converted into an integer. This is + // too big for Swift's numbers, but BoringSSL can handle it fine. + let bn = CNIOBoringSSL_BN_new() + defer { + CNIOBoringSSL_BN_free(bn) + } + + _ = readBytes.withUnsafeBufferPointer { + CNIOBoringSSL_BN_bin2bn($0.baseAddress, $0.count, bn) + } + + // We want to bitshift this right by 1 bit to ensure it's smaller than + // 2^159. + CNIOBoringSSL_BN_rshift1(bn, bn) + + // Now we can turn this into our ASN1_INTEGER. + var asn1int = ASN1_INTEGER() + CNIOBoringSSL_BN_to_ASN1_INTEGER(bn, &asn1int) + + return asn1int +} + +func generateRSAPrivateKey() -> UnsafeMutablePointer { + let exponent = CNIOBoringSSL_BN_new() + defer { + CNIOBoringSSL_BN_free(exponent) + } + + CNIOBoringSSL_BN_set_u64(exponent, 0x10001) + + let rsa = CNIOBoringSSL_RSA_new()! + let generateRC = CNIOBoringSSL_RSA_generate_key_ex(rsa, CInt(2048), exponent, nil) + precondition(generateRC == 1) + + let pkey = CNIOBoringSSL_EVP_PKEY_new()! + let assignRC = CNIOBoringSSL_EVP_PKEY_assign(pkey, EVP_PKEY_RSA, rsa) + + precondition(assignRC == 1) + return pkey +} + +func addExtension(x509: OpaquePointer, nid: CInt, value: String) { + var extensionContext = X509V3_CTX() + + CNIOBoringSSL_X509V3_set_ctx(&extensionContext, x509, x509, nil, nil, 0) + let ext = value.withCString { (pointer) in + return CNIOBoringSSL_X509V3_EXT_nconf_nid(nil, &extensionContext, nid, UnsafeMutablePointer(mutating: pointer)) + }! + CNIOBoringSSL_X509_add_ext(x509, ext, -1) + CNIOBoringSSL_X509_EXTENSION_free(ext) +} + +func generateSelfSignedCert(keygenFunction: () -> UnsafeMutablePointer = generateRSAPrivateKey) -> (NIOSSLCertificate, NIOSSLPrivateKey) { + let pkey = keygenFunction() + let x = CNIOBoringSSL_X509_new()! + CNIOBoringSSL_X509_set_version(x, 2) + + // NB: X509_set_serialNumber uses an internal copy of the ASN1_INTEGER, so this is + // safe, there will be no use-after-free. + var serial = randomSerialNumber() + CNIOBoringSSL_X509_set_serialNumber(x, &serial) + + let notBefore = CNIOBoringSSL_ASN1_TIME_new()! + var now = time(nil) + CNIOBoringSSL_ASN1_TIME_set(notBefore, now) + CNIOBoringSSL_X509_set_notBefore(x, notBefore) + CNIOBoringSSL_ASN1_TIME_free(notBefore) + + now += 60 * 60 // Give ourselves an hour + let notAfter = CNIOBoringSSL_ASN1_TIME_new()! + CNIOBoringSSL_ASN1_TIME_set(notAfter, now) + CNIOBoringSSL_X509_set_notAfter(x, notAfter) + CNIOBoringSSL_ASN1_TIME_free(notAfter) + + CNIOBoringSSL_X509_set_pubkey(x, pkey) + + let commonName = "localhost" + let name = CNIOBoringSSL_X509_get_subject_name(x) + commonName.withCString { (pointer: UnsafePointer) -> Void in + pointer.withMemoryRebound(to: UInt8.self, capacity: commonName.lengthOfBytes(using: .utf8)) { (pointer: UnsafePointer) -> Void in + CNIOBoringSSL_X509_NAME_add_entry_by_NID(name, + NID_commonName, + MBSTRING_UTF8, + UnsafeMutablePointer(mutating: pointer), + CInt(commonName.lengthOfBytes(using: .utf8)), + -1, + 0) + } + } + CNIOBoringSSL_X509_set_issuer_name(x, name) + + addExtension(x509: x, nid: NID_basic_constraints, value: "critical,CA:FALSE") + addExtension(x509: x, nid: NID_subject_key_identifier, value: "hash") + addExtension(x509: x, nid: NID_subject_alt_name, value: "DNS:localhost") + addExtension(x509: x, nid: NID_ext_key_usage, value: "critical,serverAuth,clientAuth") + + CNIOBoringSSL_X509_sign(x, pkey, CNIOBoringSSL_EVP_sha256()) + + return (NIOSSLCertificate.fromUnsafePointer(takingOwnership: x), NIOSSLPrivateKey.fromUnsafePointer(takingOwnership: pkey)) +} + diff --git a/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/WebSocketKitTests.swift b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/WebSocketKitTests.swift new file mode 100644 index 00000000..b0e080ed --- /dev/null +++ b/Carthage/Checkouts/websocket-kit/Tests/WebSocketKitTests/WebSocketKitTests.swift @@ -0,0 +1,341 @@ +import XCTest +import NIO +import NIOHTTP1 +import NIOSSL +import NIOWebSocket +@testable import WebSocketKit + +final class WebSocketKitTests: XCTestCase { + func testWebSocketEcho() throws { + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.onText { ws, text in + ws.send(text) + } + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + let promise = elg.next().makePromise(of: String.self) + let closePromise = elg.next().makePromise(of: Void.self) + WebSocket.connect(to: "ws://localhost:\(port)", on: elg) { ws in + ws.send("hello") + ws.onText { ws, string in + promise.succeed(string) + ws.close(promise: closePromise) + } + }.cascadeFailure(to: promise) + try XCTAssertEqual(promise.futureResult.wait(), "hello") + XCTAssertNoThrow(try closePromise.futureResult.wait()) + try server.close(mode: .all).wait() + } + + func testBadHost() throws { + XCTAssertThrowsError(try WebSocket.connect(host: "asdf", on: elg) { _ in }.wait()) + } + + func testServerClose() throws { + let sendPromise = self.elg.next().makePromise(of: Void.self) + let serverClose = self.elg.next().makePromise(of: Void.self) + let clientClose = self.elg.next().makePromise(of: Void.self) + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.onText { ws, text in + if text == "close" { + ws.close(promise: serverClose) + } + } + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect(to: "ws://localhost:\(port)", on: self.elg) { ws in + ws.send("close", promise: sendPromise) + ws.onClose.cascade(to: clientClose) + }.cascadeFailure(to: sendPromise) + + XCTAssertNoThrow(try sendPromise.futureResult.wait()) + XCTAssertNoThrow(try serverClose.futureResult.wait()) + XCTAssertNoThrow(try clientClose.futureResult.wait()) + try server.close(mode: .all).wait() + } + + func testClientClose() throws { + let sendPromise = self.elg.next().makePromise(of: Void.self) + let serverClose = self.elg.next().makePromise(of: Void.self) + let clientClose = self.elg.next().makePromise(of: Void.self) + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.onText { ws, text in + ws.send(text) + } + ws.onClose.cascade(to: serverClose) + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect(to: "ws://localhost:\(port)", on: self.elg) { ws in + ws.send("close", promise: sendPromise) + ws.onText { ws, text in + if text == "close" { + ws.close(promise: clientClose) + } + } + }.cascadeFailure(to: sendPromise) + + XCTAssertNoThrow(try sendPromise.futureResult.wait()) + XCTAssertNoThrow(try serverClose.futureResult.wait()) + XCTAssertNoThrow(try clientClose.futureResult.wait()) + try server.close(mode: .all).wait() + } + + func testImmediateSend() throws { + let promise = self.elg.next().makePromise(of: String.self) + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.send("hello") + ws.onText { ws, string in + promise.succeed(string) + ws.close(promise: nil) + } + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect(to: "ws://localhost:\(port)", on: self.elg) { ws in + ws.onText { ws, string in + ws.send("goodbye") + ws.close(promise: nil) + } + }.cascadeFailure(to: promise) + + try XCTAssertEqual(promise.futureResult.wait(), "goodbye") + try server.close(mode: .all).wait() + } + + func testWebSocketPingPong() throws { + let pingPromise = self.elg.next().makePromise(of: String.self) + let pongPromise = self.elg.next().makePromise(of: String.self) + let pingPongData = ByteBuffer(bytes: "Vapor rules".utf8) + + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.onPing { ws in + pingPromise.succeed("ping") + } + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect(to: "ws://localhost:\(port)", on: self.elg) { ws in + ws.send(raw: pingPongData.readableBytesView, opcode: .ping) + ws.onPong { ws in + pongPromise.succeed("pong") + ws.close(promise: nil) + } + }.cascadeFailure(to: pongPromise) + + try XCTAssertEqual(pingPromise.futureResult.wait(), "ping") + try XCTAssertEqual(pongPromise.futureResult.wait(), "pong") + try server.close(mode: .all).wait() + } + + func testErrorCode() throws { + let promise = self.elg.next().makePromise(of: WebSocketErrorCode.self) + + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.close(code: .normalClosure, promise: nil) + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect(to: "ws://localhost:\(port)", on: self.elg) { ws in + ws.onText { ws, string in + ws.send("goodbye") + } + ws.onClose.whenSuccess { + promise.succeed(ws.closeCode!) + XCTAssertEqual(ws.closeCode, WebSocketErrorCode.normalClosure) + } + }.cascadeFailure(to: promise) + + try XCTAssertEqual(promise.futureResult.wait(), WebSocketErrorCode.normalClosure) + try server.close(mode: .all).wait() + } + + func testHeadersAreSent() throws { + let promiseAuth = self.elg.next().makePromise(of: String.self) + + // make sure there is no content-length header + let promiseNoContentLength = self.elg.next().makePromise(of: Bool.self) + + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + promiseAuth.succeed(req.headers.first(name: "Auth")!) + promiseNoContentLength.succeed(req.headers.contains(name: "content-length")) + ws.close(promise: nil) + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect( + to: "ws://localhost:\(port)", + headers: ["Auth": "supersecretsauce"], + on: self.elg) { ws in + _ = ws.close() + }.cascadeFailure(to: promiseAuth) + + try XCTAssertEqual(promiseAuth.futureResult.wait(), "supersecretsauce") + try XCTAssertFalse(promiseNoContentLength.futureResult.wait()) + try server.close(mode: .all).wait() + } + + func testQueryParamsAreSent() throws { + let promise = self.elg.next().makePromise(of: String.self) + + let server = try ServerBootstrap.webSocket(on: self.elg) { req, ws in + promise.succeed(req.uri) + ws.close(promise: nil) + }.bind(host: "localhost", port: 0).wait() + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + WebSocket.connect( + to: "ws://localhost:\(port)?foo=bar&bar=baz", + on: self.elg) { ws in + _ = ws.close() + }.cascadeFailure(to: promise) + + try XCTAssertEqual(promise.futureResult.wait(), "/?foo=bar&bar=baz") + try server.close(mode: .all).wait() + } + + func testLocally() throws { + // swap to test websocket server against local client + try XCTSkipIf(true) + + let port = Int(1337) + let shutdownPromise = self.elg.next().makePromise(of: Void.self) + + let server = try! ServerBootstrap.webSocket(on: self.elg) { req, ws in + ws.send("welcome!") + + ws.onClose.whenComplete { + print("ws.onClose done: \($0)") + } + + ws.onText { ws, text in + switch text { + case "shutdown": + shutdownPromise.succeed(()) + case "close": + ws.close().whenComplete { + print("ws.close() done \($0)") + } + default: + ws.send(text.reversed()) + } + } + }.bind(host: "localhost", port: port).wait() + print("Serving at ws://localhost:\(port)") + + print("Waiting for server shutdown...") + try shutdownPromise.futureResult.wait() + + print("Waiting for server close...") + try server.close(mode: .all).wait() + } + + func testIPWithTLS() throws { + let server = try ServerBootstrap.webSocket(on: self.elg, tls: true) { req, ws in + _ = ws.close() + }.bind(host: "127.0.0.1", port: 0).wait() + + var tlsConfiguration = TLSConfiguration.makeClientConfiguration() + tlsConfiguration.certificateVerification = .none + + let client = WebSocketClient( + eventLoopGroupProvider: .shared(self.elg), + configuration: .init( + tlsConfiguration: tlsConfiguration + ) + ) + + guard let port = server.localAddress?.port else { + XCTFail("couldn't get port from \(server.localAddress.debugDescription)") + return + } + + try client.connect(scheme: "wss", host: "127.0.0.1", port: port) { ws in + ws.close(promise: nil) + }.wait() + + try server.close(mode: .all).wait() + } + + var elg: EventLoopGroup! + override func setUp() { + // needs to be at least two to avoid client / server on same EL timing issues + self.elg = MultiThreadedEventLoopGroup(numberOfThreads: 2) + } + override func tearDown() { + try! self.elg.syncShutdownGracefully() + } +} + +extension ServerBootstrap { + static func webSocket( + on eventLoopGroup: EventLoopGroup, + tls: Bool = false, + onUpgrade: @escaping (HTTPRequestHead, WebSocket) -> () + ) -> ServerBootstrap { + return ServerBootstrap(group: eventLoopGroup).childChannelInitializer { channel in + if tls { + let (cert, key) = generateSelfSignedCert() + let configuration = TLSConfiguration.makeServerConfiguration( + certificateChain: [.certificate(cert)], + privateKey: .privateKey(key) + ) + let sslContext = try! NIOSSLContext(configuration: configuration) + let handler = NIOSSLServerHandler(context: sslContext) + _ = channel.pipeline.addHandler(handler) + } + let webSocket = NIOWebSocketServerUpgrader( + shouldUpgrade: { channel, req in + return channel.eventLoop.makeSucceededFuture([:]) + }, + upgradePipelineHandler: { channel, req in + return WebSocket.server(on: channel) { ws in + onUpgrade(req, ws) + } + } + ) + return channel.pipeline.configureHTTPServerPipeline( + withServerUpgrade: ( + upgraders: [webSocket], + completionHandler: { ctx in + // complete + } + ) + ) + } + } +} diff --git a/Web3.xcodeproj/project.pbxproj b/Web3.xcodeproj/project.pbxproj new file mode 100644 index 00000000..a074e77e --- /dev/null +++ b/Web3.xcodeproj/project.pbxproj @@ -0,0 +1,864 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 374130812B6792EE00F3F066 /* Web3.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 374130782B6792EE00F3F066 /* Web3.framework */; }; + 374130862B6792EE00F3F066 /* Web3Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130852B6792EE00F3F066 /* Web3Tests.swift */; }; + 374130872B6792EE00F3F066 /* Web3.h in Headers */ = {isa = PBXBuildFile; fileRef = 3741307B2B6792EE00F3F066 /* Web3.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 374130E52B67934B00F3F066 /* Web3+PromiseKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130922B67934B00F3F066 /* Web3+PromiseKit.swift */; }; + 374130E62B67934B00F3F066 /* Exports+PromiseKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130932B67934B00F3F066 /* Exports+PromiseKit.swift */; }; + 374130E72B67934B00F3F066 /* Promisable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130942B67934B00F3F066 /* Promisable.swift */; }; + 374130E82B67934B00F3F066 /* ContractPromiseExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130952B67934B00F3F066 /* ContractPromiseExtensions.swift */; }; + 374130E92B67934B00F3F066 /* EthereumPublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130982B67934B00F3F066 /* EthereumPublicKey.swift */; }; + 374130EA2B67934B00F3F066 /* EthereumAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130992B67934B00F3F066 /* EthereumAddress.swift */; }; + 374130EB2B67934B00F3F066 /* EthereumPrivateKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3741309A2B67934B00F3F066 /* EthereumPrivateKey.swift */; }; + 374130EC2B67934B00F3F066 /* EthereumTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3741309B2B67934B00F3F066 /* EthereumTransaction.swift */; }; + 374130ED2B67934B00F3F066 /* Web3Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3741309D2B67934B00F3F066 /* Web3Provider.swift */; }; + 374130EE2B67934B00F3F066 /* Web3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3741309F2B67934B00F3F066 /* Web3.swift */; }; + 374130EF2B67934B00F3F066 /* RLPItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A12B67934B00F3F066 /* RLPItem.swift */; }; + 374130F02B67934B00F3F066 /* RLPEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A22B67934B00F3F066 /* RLPEncoder.swift */; }; + 374130F12B67934B00F3F066 /* RLPItemConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A32B67934B00F3F066 /* RLPItemConvertible.swift */; }; + 374130F22B67934B00F3F066 /* RLPDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A42B67934B00F3F066 /* RLPDecoder.swift */; }; + 374130F32B67934B00F3F066 /* Types+RLPItemConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A52B67934B00F3F066 /* Types+RLPItemConvertible.swift */; }; + 374130F42B67934B00F3F066 /* EthereumBlockObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A72B67934B00F3F066 /* EthereumBlockObject.swift */; }; + 374130F52B67934B00F3F066 /* EthereumTransactionReceiptObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A82B67934B00F3F066 /* EthereumTransactionReceiptObject.swift */; }; + 374130F62B67934B00F3F066 /* EthereumData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130A92B67934B00F3F066 /* EthereumData.swift */; }; + 374130F72B67934B00F3F066 /* RPCRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AA2B67934B00F3F066 /* RPCRequest.swift */; }; + 374130F82B67934B00F3F066 /* EthereumSyncStatusObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AB2B67934B00F3F066 /* EthereumSyncStatusObject.swift */; }; + 374130F92B67934B00F3F066 /* EthereumValueConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AC2B67934B00F3F066 /* EthereumValueConvertible.swift */; }; + 374130FA2B67934B00F3F066 /* EthereumQuantity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AD2B67934B00F3F066 /* EthereumQuantity.swift */; }; + 374130FB2B67934B00F3F066 /* EthereumTransactionObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AE2B67934B00F3F066 /* EthereumTransactionObject.swift */; }; + 374130FC2B67934B00F3F066 /* EthereumValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130AF2B67934B00F3F066 /* EthereumValue.swift */; }; + 374130FD2B67934B00F3F066 /* RPCResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B02B67934B00F3F066 /* RPCResponse.swift */; }; + 374130FE2B67934B00F3F066 /* EthereumCall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B12B67934B00F3F066 /* EthereumCall.swift */; }; + 374130FF2B67934B00F3F066 /* EthereumTypedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B22B67934B00F3F066 /* EthereumTypedData.swift */; }; + 374131002B67934B00F3F066 /* EthereumQuantityTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B32B67934B00F3F066 /* EthereumQuantityTag.swift */; }; + 374131012B67934B00F3F066 /* Types+EthereumValueConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B42B67934B00F3F066 /* Types+EthereumValueConvertible.swift */; }; + 374131022B67934B00F3F066 /* EthereumLogObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B52B67934B00F3F066 /* EthereumLogObject.swift */; }; + 374131032B67934B00F3F066 /* String+BytesConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B72B67934B00F3F066 /* String+BytesConvertible.swift */; }; + 374131042B67934B00F3F066 /* Bytes+HexString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B82B67934B00F3F066 /* Bytes+HexString.swift */; }; + 374131052B67934B00F3F066 /* UInt+BytesRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130B92B67934B00F3F066 /* UInt+BytesRepresentable.swift */; }; + 374131062B67934B00F3F066 /* Bytes+TrimLeadingZeros.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BA2B67934B00F3F066 /* Bytes+TrimLeadingZeros.swift */; }; + 374131072B67934B00F3F066 /* Bytes+SecureRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BB2B67934B00F3F066 /* Bytes+SecureRandom.swift */; }; + 374131082B67934B00F3F066 /* EthereumUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BC2B67934B00F3F066 /* EthereumUtils.swift */; }; + 374131092B67934B00F3F066 /* String+HexBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BD2B67934B00F3F066 /* String+HexBytes.swift */; }; + 3741310A2B67934B00F3F066 /* BytesConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BE2B67934B00F3F066 /* BytesConvertible.swift */; }; + 3741310B2B67934B00F3F066 /* String+Conversion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130BF2B67934B00F3F066 /* String+Conversion.swift */; }; + 3741310C2B67934B00F3F066 /* Data+BytesConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C02B67934B00F3F066 /* Data+BytesConvertible.swift */; }; + 3741310D2B67934B00F3F066 /* CharacterSet+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C12B67934B00F3F066 /* CharacterSet+Hex.swift */; }; + 3741310E2B67934B00F3F066 /* BigUInt+BytesConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C22B67934B00F3F066 /* BigUInt+BytesConvertible.swift */; }; + 3741310F2B67934B00F3F066 /* Bytes+UInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C32B67934B00F3F066 /* Bytes+UInt.swift */; }; + 374131102B67934B00F3F066 /* Exports+Web3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C42B67934B00F3F066 /* Exports+Web3.swift */; }; + 374131112B67934B00F3F066 /* Int+ETH.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C52B67934B00F3F066 /* Int+ETH.swift */; }; + 374131122B67934B00F3F066 /* SynchronizedArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C62B67934B00F3F066 /* SynchronizedArray.swift */; }; + 374131132B67934B00F3F066 /* UnsignedInteger+BytesConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C72B67934B00F3F066 /* UnsignedInteger+BytesConvertible.swift */; }; + 374131142B67934B00F3F066 /* SynchronizedDictionary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C82B67934B00F3F066 /* SynchronizedDictionary.swift */; }; + 374131152B67934B00F3F066 /* Secp256k1+CTXCreator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130C92B67934B00F3F066 /* Secp256k1+CTXCreator.swift */; }; + 374131162B67934B00F3F066 /* UnsignedInteger+Shifting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130CA2B67934B00F3F066 /* UnsignedInteger+Shifting.swift */; }; + 374131172B67934B00F3F066 /* Eth+Contract.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130CD2B67934B00F3F066 /* Eth+Contract.swift */; }; + 374131182B67934B00F3F066 /* SolidityEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130CE2B67934B00F3F066 /* SolidityEvent.swift */; }; + 374131192B67934B00F3F066 /* ABIObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130CF2B67934B00F3F066 /* ABIObject.swift */; }; + 3741311A2B67934B00F3F066 /* ERC20.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D02B67934B00F3F066 /* ERC20.swift */; }; + 3741311B2B67934B00F3F066 /* ERC721.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D12B67934B00F3F066 /* ERC721.swift */; }; + 3741311C2B67934B00F3F066 /* ERC165.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D22B67934B00F3F066 /* ERC165.swift */; }; + 3741311D2B67934B00F3F066 /* SolidityFunction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D32B67934B00F3F066 /* SolidityFunction.swift */; }; + 3741311E2B67934B00F3F066 /* EthereumContract.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D42B67934B00F3F066 /* EthereumContract.swift */; }; + 3741311F2B67934B00F3F066 /* SolidityInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D52B67934B00F3F066 /* SolidityInvocation.swift */; }; + 374131202B67934B00F3F066 /* Eth+ABI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D72B67934B00F3F066 /* Eth+ABI.swift */; }; + 374131212B67934B00F3F066 /* ABIEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D82B67934B00F3F066 /* ABIEncoder.swift */; }; + 374131222B67934B00F3F066 /* ABIDecoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130D92B67934B00F3F066 /* ABIDecoder.swift */; }; + 374131232B67934B00F3F066 /* SolidityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DA2B67934B00F3F066 /* SolidityType.swift */; }; + 374131242B67934B00F3F066 /* SolidityType+Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DB2B67934B00F3F066 /* SolidityType+Codable.swift */; }; + 374131252B67934B00F3F066 /* SolidityWrappedValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DC2B67934B00F3F066 /* SolidityWrappedValue.swift */; }; + 374131262B67934B00F3F066 /* ABI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DD2B67934B00F3F066 /* ABI.swift */; }; + 374131272B67934B00F3F066 /* SolidityTuple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DE2B67934B00F3F066 /* SolidityTuple.swift */; }; + 374131282B67934B00F3F066 /* ABIConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130DF2B67934B00F3F066 /* ABIConvertible.swift */; }; + 374131292B67934B00F3F066 /* Web3WebSocketProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130E12B67934B00F3F066 /* Web3WebSocketProvider.swift */; }; + 3741312A2B67934B00F3F066 /* Web3+WebSocketInitializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130E22B67934B00F3F066 /* Web3+WebSocketInitializer.swift */; }; + 3741312B2B67934B00F3F066 /* Web3+HTTPInitializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130E32B67934B00F3F066 /* Web3+HTTPInitializer.swift */; }; + 3741312C2B67934B00F3F066 /* Web3HttpProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 374130E42B67934B00F3F066 /* Web3HttpProvider.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 374130822B6792EE00F3F066 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 3741306F2B6792EE00F3F066 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 374130772B6792EE00F3F066; + remoteInfo = Web3; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 374130782B6792EE00F3F066 /* Web3.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Web3.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3741307B2B6792EE00F3F066 /* Web3.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Web3.h; sourceTree = ""; }; + 374130802B6792EE00F3F066 /* Web3Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Web3Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 374130852B6792EE00F3F066 /* Web3Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Web3Tests.swift; sourceTree = ""; }; + 374130922B67934B00F3F066 /* Web3+PromiseKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Web3+PromiseKit.swift"; sourceTree = ""; }; + 374130932B67934B00F3F066 /* Exports+PromiseKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Exports+PromiseKit.swift"; sourceTree = ""; }; + 374130942B67934B00F3F066 /* Promisable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Promisable.swift; sourceTree = ""; }; + 374130952B67934B00F3F066 /* ContractPromiseExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContractPromiseExtensions.swift; sourceTree = ""; }; + 374130982B67934B00F3F066 /* EthereumPublicKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumPublicKey.swift; sourceTree = ""; }; + 374130992B67934B00F3F066 /* EthereumAddress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumAddress.swift; sourceTree = ""; }; + 3741309A2B67934B00F3F066 /* EthereumPrivateKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumPrivateKey.swift; sourceTree = ""; }; + 3741309B2B67934B00F3F066 /* EthereumTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumTransaction.swift; sourceTree = ""; }; + 3741309D2B67934B00F3F066 /* Web3Provider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Web3Provider.swift; sourceTree = ""; }; + 3741309F2B67934B00F3F066 /* Web3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Web3.swift; sourceTree = ""; }; + 374130A12B67934B00F3F066 /* RLPItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLPItem.swift; sourceTree = ""; }; + 374130A22B67934B00F3F066 /* RLPEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLPEncoder.swift; sourceTree = ""; }; + 374130A32B67934B00F3F066 /* RLPItemConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLPItemConvertible.swift; sourceTree = ""; }; + 374130A42B67934B00F3F066 /* RLPDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLPDecoder.swift; sourceTree = ""; }; + 374130A52B67934B00F3F066 /* Types+RLPItemConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Types+RLPItemConvertible.swift"; sourceTree = ""; }; + 374130A72B67934B00F3F066 /* EthereumBlockObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumBlockObject.swift; sourceTree = ""; }; + 374130A82B67934B00F3F066 /* EthereumTransactionReceiptObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumTransactionReceiptObject.swift; sourceTree = ""; }; + 374130A92B67934B00F3F066 /* EthereumData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumData.swift; sourceTree = ""; }; + 374130AA2B67934B00F3F066 /* RPCRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RPCRequest.swift; sourceTree = ""; }; + 374130AB2B67934B00F3F066 /* EthereumSyncStatusObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumSyncStatusObject.swift; sourceTree = ""; }; + 374130AC2B67934B00F3F066 /* EthereumValueConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumValueConvertible.swift; sourceTree = ""; }; + 374130AD2B67934B00F3F066 /* EthereumQuantity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumQuantity.swift; sourceTree = ""; }; + 374130AE2B67934B00F3F066 /* EthereumTransactionObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumTransactionObject.swift; sourceTree = ""; }; + 374130AF2B67934B00F3F066 /* EthereumValue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumValue.swift; sourceTree = ""; }; + 374130B02B67934B00F3F066 /* RPCResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RPCResponse.swift; sourceTree = ""; }; + 374130B12B67934B00F3F066 /* EthereumCall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumCall.swift; sourceTree = ""; }; + 374130B22B67934B00F3F066 /* EthereumTypedData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumTypedData.swift; sourceTree = ""; }; + 374130B32B67934B00F3F066 /* EthereumQuantityTag.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumQuantityTag.swift; sourceTree = ""; }; + 374130B42B67934B00F3F066 /* Types+EthereumValueConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Types+EthereumValueConvertible.swift"; sourceTree = ""; }; + 374130B52B67934B00F3F066 /* EthereumLogObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumLogObject.swift; sourceTree = ""; }; + 374130B72B67934B00F3F066 /* String+BytesConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+BytesConvertible.swift"; sourceTree = ""; }; + 374130B82B67934B00F3F066 /* Bytes+HexString.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bytes+HexString.swift"; sourceTree = ""; }; + 374130B92B67934B00F3F066 /* UInt+BytesRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UInt+BytesRepresentable.swift"; sourceTree = ""; }; + 374130BA2B67934B00F3F066 /* Bytes+TrimLeadingZeros.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bytes+TrimLeadingZeros.swift"; sourceTree = ""; }; + 374130BB2B67934B00F3F066 /* Bytes+SecureRandom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bytes+SecureRandom.swift"; sourceTree = ""; }; + 374130BC2B67934B00F3F066 /* EthereumUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumUtils.swift; sourceTree = ""; }; + 374130BD2B67934B00F3F066 /* String+HexBytes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+HexBytes.swift"; sourceTree = ""; }; + 374130BE2B67934B00F3F066 /* BytesConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BytesConvertible.swift; sourceTree = ""; }; + 374130BF2B67934B00F3F066 /* String+Conversion.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Conversion.swift"; sourceTree = ""; }; + 374130C02B67934B00F3F066 /* Data+BytesConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+BytesConvertible.swift"; sourceTree = ""; }; + 374130C12B67934B00F3F066 /* CharacterSet+Hex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "CharacterSet+Hex.swift"; sourceTree = ""; }; + 374130C22B67934B00F3F066 /* BigUInt+BytesConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "BigUInt+BytesConvertible.swift"; sourceTree = ""; }; + 374130C32B67934B00F3F066 /* Bytes+UInt.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Bytes+UInt.swift"; sourceTree = ""; }; + 374130C42B67934B00F3F066 /* Exports+Web3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Exports+Web3.swift"; sourceTree = ""; }; + 374130C52B67934B00F3F066 /* Int+ETH.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Int+ETH.swift"; sourceTree = ""; }; + 374130C62B67934B00F3F066 /* SynchronizedArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizedArray.swift; sourceTree = ""; }; + 374130C72B67934B00F3F066 /* UnsignedInteger+BytesConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UnsignedInteger+BytesConvertible.swift"; sourceTree = ""; }; + 374130C82B67934B00F3F066 /* SynchronizedDictionary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SynchronizedDictionary.swift; sourceTree = ""; }; + 374130C92B67934B00F3F066 /* Secp256k1+CTXCreator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Secp256k1+CTXCreator.swift"; sourceTree = ""; }; + 374130CA2B67934B00F3F066 /* UnsignedInteger+Shifting.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UnsignedInteger+Shifting.swift"; sourceTree = ""; }; + 374130CD2B67934B00F3F066 /* Eth+Contract.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Eth+Contract.swift"; sourceTree = ""; }; + 374130CE2B67934B00F3F066 /* SolidityEvent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityEvent.swift; sourceTree = ""; }; + 374130CF2B67934B00F3F066 /* ABIObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ABIObject.swift; sourceTree = ""; }; + 374130D02B67934B00F3F066 /* ERC20.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ERC20.swift; sourceTree = ""; }; + 374130D12B67934B00F3F066 /* ERC721.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ERC721.swift; sourceTree = ""; }; + 374130D22B67934B00F3F066 /* ERC165.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ERC165.swift; sourceTree = ""; }; + 374130D32B67934B00F3F066 /* SolidityFunction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityFunction.swift; sourceTree = ""; }; + 374130D42B67934B00F3F066 /* EthereumContract.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumContract.swift; sourceTree = ""; }; + 374130D52B67934B00F3F066 /* SolidityInvocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityInvocation.swift; sourceTree = ""; }; + 374130D72B67934B00F3F066 /* Eth+ABI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Eth+ABI.swift"; sourceTree = ""; }; + 374130D82B67934B00F3F066 /* ABIEncoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ABIEncoder.swift; sourceTree = ""; }; + 374130D92B67934B00F3F066 /* ABIDecoder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ABIDecoder.swift; sourceTree = ""; }; + 374130DA2B67934B00F3F066 /* SolidityType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityType.swift; sourceTree = ""; }; + 374130DB2B67934B00F3F066 /* SolidityType+Codable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SolidityType+Codable.swift"; sourceTree = ""; }; + 374130DC2B67934B00F3F066 /* SolidityWrappedValue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityWrappedValue.swift; sourceTree = ""; }; + 374130DD2B67934B00F3F066 /* ABI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ABI.swift; sourceTree = ""; }; + 374130DE2B67934B00F3F066 /* SolidityTuple.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SolidityTuple.swift; sourceTree = ""; }; + 374130DF2B67934B00F3F066 /* ABIConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ABIConvertible.swift; sourceTree = ""; }; + 374130E12B67934B00F3F066 /* Web3WebSocketProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Web3WebSocketProvider.swift; sourceTree = ""; }; + 374130E22B67934B00F3F066 /* Web3+WebSocketInitializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Web3+WebSocketInitializer.swift"; sourceTree = ""; }; + 374130E32B67934B00F3F066 /* Web3+HTTPInitializer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Web3+HTTPInitializer.swift"; sourceTree = ""; }; + 374130E42B67934B00F3F066 /* Web3HttpProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Web3HttpProvider.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 374130752B6792EE00F3F066 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3741307D2B6792EE00F3F066 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 374130812B6792EE00F3F066 /* Web3.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3741306E2B6792EE00F3F066 = { + isa = PBXGroup; + children = ( + 374130902B67934B00F3F066 /* Sources */, + 3741307A2B6792EE00F3F066 /* Web3 */, + 374130842B6792EE00F3F066 /* Web3Tests */, + 374130792B6792EE00F3F066 /* Products */, + ); + sourceTree = ""; + }; + 374130792B6792EE00F3F066 /* Products */ = { + isa = PBXGroup; + children = ( + 374130782B6792EE00F3F066 /* Web3.framework */, + 374130802B6792EE00F3F066 /* Web3Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 3741307A2B6792EE00F3F066 /* Web3 */ = { + isa = PBXGroup; + children = ( + 3741307B2B6792EE00F3F066 /* Web3.h */, + ); + path = Web3; + sourceTree = ""; + }; + 374130842B6792EE00F3F066 /* Web3Tests */ = { + isa = PBXGroup; + children = ( + 374130852B6792EE00F3F066 /* Web3Tests.swift */, + ); + path = Web3Tests; + sourceTree = ""; + }; + 374130902B67934B00F3F066 /* Sources */ = { + isa = PBXGroup; + children = ( + 374130912B67934B00F3F066 /* PromiseKit */, + 374130962B67934B00F3F066 /* Core */, + 374130CB2B67934B00F3F066 /* ContractABI */, + 374130E02B67934B00F3F066 /* FoundationHTTP */, + ); + path = Sources; + sourceTree = ""; + }; + 374130912B67934B00F3F066 /* PromiseKit */ = { + isa = PBXGroup; + children = ( + 374130922B67934B00F3F066 /* Web3+PromiseKit.swift */, + 374130932B67934B00F3F066 /* Exports+PromiseKit.swift */, + 374130942B67934B00F3F066 /* Promisable.swift */, + 374130952B67934B00F3F066 /* ContractPromiseExtensions.swift */, + ); + path = PromiseKit; + sourceTree = ""; + }; + 374130962B67934B00F3F066 /* Core */ = { + isa = PBXGroup; + children = ( + 374130972B67934B00F3F066 /* Transaction */, + 3741309C2B67934B00F3F066 /* Providers */, + 3741309E2B67934B00F3F066 /* Web3 */, + 374130A02B67934B00F3F066 /* RLP */, + 374130A62B67934B00F3F066 /* Json */, + 374130B62B67934B00F3F066 /* Toolbox */, + ); + path = Core; + sourceTree = ""; + }; + 374130972B67934B00F3F066 /* Transaction */ = { + isa = PBXGroup; + children = ( + 374130982B67934B00F3F066 /* EthereumPublicKey.swift */, + 374130992B67934B00F3F066 /* EthereumAddress.swift */, + 3741309A2B67934B00F3F066 /* EthereumPrivateKey.swift */, + 3741309B2B67934B00F3F066 /* EthereumTransaction.swift */, + ); + path = Transaction; + sourceTree = ""; + }; + 3741309C2B67934B00F3F066 /* Providers */ = { + isa = PBXGroup; + children = ( + 3741309D2B67934B00F3F066 /* Web3Provider.swift */, + ); + path = Providers; + sourceTree = ""; + }; + 3741309E2B67934B00F3F066 /* Web3 */ = { + isa = PBXGroup; + children = ( + 3741309F2B67934B00F3F066 /* Web3.swift */, + ); + path = Web3; + sourceTree = ""; + }; + 374130A02B67934B00F3F066 /* RLP */ = { + isa = PBXGroup; + children = ( + 374130A12B67934B00F3F066 /* RLPItem.swift */, + 374130A22B67934B00F3F066 /* RLPEncoder.swift */, + 374130A32B67934B00F3F066 /* RLPItemConvertible.swift */, + 374130A42B67934B00F3F066 /* RLPDecoder.swift */, + 374130A52B67934B00F3F066 /* Types+RLPItemConvertible.swift */, + ); + path = RLP; + sourceTree = ""; + }; + 374130A62B67934B00F3F066 /* Json */ = { + isa = PBXGroup; + children = ( + 374130A72B67934B00F3F066 /* EthereumBlockObject.swift */, + 374130A82B67934B00F3F066 /* EthereumTransactionReceiptObject.swift */, + 374130A92B67934B00F3F066 /* EthereumData.swift */, + 374130AA2B67934B00F3F066 /* RPCRequest.swift */, + 374130AB2B67934B00F3F066 /* EthereumSyncStatusObject.swift */, + 374130AC2B67934B00F3F066 /* EthereumValueConvertible.swift */, + 374130AD2B67934B00F3F066 /* EthereumQuantity.swift */, + 374130AE2B67934B00F3F066 /* EthereumTransactionObject.swift */, + 374130AF2B67934B00F3F066 /* EthereumValue.swift */, + 374130B02B67934B00F3F066 /* RPCResponse.swift */, + 374130B12B67934B00F3F066 /* EthereumCall.swift */, + 374130B22B67934B00F3F066 /* EthereumTypedData.swift */, + 374130B32B67934B00F3F066 /* EthereumQuantityTag.swift */, + 374130B42B67934B00F3F066 /* Types+EthereumValueConvertible.swift */, + 374130B52B67934B00F3F066 /* EthereumLogObject.swift */, + ); + path = Json; + sourceTree = ""; + }; + 374130B62B67934B00F3F066 /* Toolbox */ = { + isa = PBXGroup; + children = ( + 374130B72B67934B00F3F066 /* String+BytesConvertible.swift */, + 374130B82B67934B00F3F066 /* Bytes+HexString.swift */, + 374130B92B67934B00F3F066 /* UInt+BytesRepresentable.swift */, + 374130BA2B67934B00F3F066 /* Bytes+TrimLeadingZeros.swift */, + 374130BB2B67934B00F3F066 /* Bytes+SecureRandom.swift */, + 374130BC2B67934B00F3F066 /* EthereumUtils.swift */, + 374130BD2B67934B00F3F066 /* String+HexBytes.swift */, + 374130BE2B67934B00F3F066 /* BytesConvertible.swift */, + 374130BF2B67934B00F3F066 /* String+Conversion.swift */, + 374130C02B67934B00F3F066 /* Data+BytesConvertible.swift */, + 374130C12B67934B00F3F066 /* CharacterSet+Hex.swift */, + 374130C22B67934B00F3F066 /* BigUInt+BytesConvertible.swift */, + 374130C32B67934B00F3F066 /* Bytes+UInt.swift */, + 374130C42B67934B00F3F066 /* Exports+Web3.swift */, + 374130C52B67934B00F3F066 /* Int+ETH.swift */, + 374130C62B67934B00F3F066 /* SynchronizedArray.swift */, + 374130C72B67934B00F3F066 /* UnsignedInteger+BytesConvertible.swift */, + 374130C82B67934B00F3F066 /* SynchronizedDictionary.swift */, + 374130C92B67934B00F3F066 /* Secp256k1+CTXCreator.swift */, + 374130CA2B67934B00F3F066 /* UnsignedInteger+Shifting.swift */, + ); + path = Toolbox; + sourceTree = ""; + }; + 374130CB2B67934B00F3F066 /* ContractABI */ = { + isa = PBXGroup; + children = ( + 374130CC2B67934B00F3F066 /* Contract */, + 374130D62B67934B00F3F066 /* ABI */, + ); + path = ContractABI; + sourceTree = ""; + }; + 374130CC2B67934B00F3F066 /* Contract */ = { + isa = PBXGroup; + children = ( + 374130CD2B67934B00F3F066 /* Eth+Contract.swift */, + 374130CE2B67934B00F3F066 /* SolidityEvent.swift */, + 374130CF2B67934B00F3F066 /* ABIObject.swift */, + 374130D02B67934B00F3F066 /* ERC20.swift */, + 374130D12B67934B00F3F066 /* ERC721.swift */, + 374130D22B67934B00F3F066 /* ERC165.swift */, + 374130D32B67934B00F3F066 /* SolidityFunction.swift */, + 374130D42B67934B00F3F066 /* EthereumContract.swift */, + 374130D52B67934B00F3F066 /* SolidityInvocation.swift */, + ); + path = Contract; + sourceTree = ""; + }; + 374130D62B67934B00F3F066 /* ABI */ = { + isa = PBXGroup; + children = ( + 374130D72B67934B00F3F066 /* Eth+ABI.swift */, + 374130D82B67934B00F3F066 /* ABIEncoder.swift */, + 374130D92B67934B00F3F066 /* ABIDecoder.swift */, + 374130DA2B67934B00F3F066 /* SolidityType.swift */, + 374130DB2B67934B00F3F066 /* SolidityType+Codable.swift */, + 374130DC2B67934B00F3F066 /* SolidityWrappedValue.swift */, + 374130DD2B67934B00F3F066 /* ABI.swift */, + 374130DE2B67934B00F3F066 /* SolidityTuple.swift */, + 374130DF2B67934B00F3F066 /* ABIConvertible.swift */, + ); + path = ABI; + sourceTree = ""; + }; + 374130E02B67934B00F3F066 /* FoundationHTTP */ = { + isa = PBXGroup; + children = ( + 374130E12B67934B00F3F066 /* Web3WebSocketProvider.swift */, + 374130E22B67934B00F3F066 /* Web3+WebSocketInitializer.swift */, + 374130E32B67934B00F3F066 /* Web3+HTTPInitializer.swift */, + 374130E42B67934B00F3F066 /* Web3HttpProvider.swift */, + ); + path = FoundationHTTP; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 374130732B6792EE00F3F066 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 374130872B6792EE00F3F066 /* Web3.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 374130772B6792EE00F3F066 /* Web3 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3741308A2B6792EE00F3F066 /* Build configuration list for PBXNativeTarget "Web3" */; + buildPhases = ( + 374130732B6792EE00F3F066 /* Headers */, + 374130742B6792EE00F3F066 /* Sources */, + 374130752B6792EE00F3F066 /* Frameworks */, + 374130762B6792EE00F3F066 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Web3; + productName = Web3; + productReference = 374130782B6792EE00F3F066 /* Web3.framework */; + productType = "com.apple.product-type.framework"; + }; + 3741307F2B6792EE00F3F066 /* Web3Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3741308D2B6792EE00F3F066 /* Build configuration list for PBXNativeTarget "Web3Tests" */; + buildPhases = ( + 3741307C2B6792EE00F3F066 /* Sources */, + 3741307D2B6792EE00F3F066 /* Frameworks */, + 3741307E2B6792EE00F3F066 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 374130832B6792EE00F3F066 /* PBXTargetDependency */, + ); + name = Web3Tests; + productName = Web3Tests; + productReference = 374130802B6792EE00F3F066 /* Web3Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 3741306F2B6792EE00F3F066 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1520; + LastUpgradeCheck = 1520; + TargetAttributes = { + 374130772B6792EE00F3F066 = { + CreatedOnToolsVersion = 15.2; + }; + 3741307F2B6792EE00F3F066 = { + CreatedOnToolsVersion = 15.2; + }; + }; + }; + buildConfigurationList = 374130722B6792EE00F3F066 /* Build configuration list for PBXProject "Web3" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 3741306E2B6792EE00F3F066; + productRefGroup = 374130792B6792EE00F3F066 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 374130772B6792EE00F3F066 /* Web3 */, + 3741307F2B6792EE00F3F066 /* Web3Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 374130762B6792EE00F3F066 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3741307E2B6792EE00F3F066 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 374130742B6792EE00F3F066 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 374131152B67934B00F3F066 /* Secp256k1+CTXCreator.swift in Sources */, + 374130E72B67934B00F3F066 /* Promisable.swift in Sources */, + 374131212B67934B00F3F066 /* ABIEncoder.swift in Sources */, + 374130EC2B67934B00F3F066 /* EthereumTransaction.swift in Sources */, + 374131062B67934B00F3F066 /* Bytes+TrimLeadingZeros.swift in Sources */, + 374131252B67934B00F3F066 /* SolidityWrappedValue.swift in Sources */, + 374131002B67934B00F3F066 /* EthereumQuantityTag.swift in Sources */, + 374130FC2B67934B00F3F066 /* EthereumValue.swift in Sources */, + 3741311E2B67934B00F3F066 /* EthereumContract.swift in Sources */, + 374130EE2B67934B00F3F066 /* Web3.swift in Sources */, + 374131202B67934B00F3F066 /* Eth+ABI.swift in Sources */, + 374131102B67934B00F3F066 /* Exports+Web3.swift in Sources */, + 374130EB2B67934B00F3F066 /* EthereumPrivateKey.swift in Sources */, + 3741310C2B67934B00F3F066 /* Data+BytesConvertible.swift in Sources */, + 374130F52B67934B00F3F066 /* EthereumTransactionReceiptObject.swift in Sources */, + 374130E92B67934B00F3F066 /* EthereumPublicKey.swift in Sources */, + 374131092B67934B00F3F066 /* String+HexBytes.swift in Sources */, + 374130F42B67934B00F3F066 /* EthereumBlockObject.swift in Sources */, + 374130FF2B67934B00F3F066 /* EthereumTypedData.swift in Sources */, + 3741310F2B67934B00F3F066 /* Bytes+UInt.swift in Sources */, + 374131022B67934B00F3F066 /* EthereumLogObject.swift in Sources */, + 374131272B67934B00F3F066 /* SolidityTuple.swift in Sources */, + 374130FA2B67934B00F3F066 /* EthereumQuantity.swift in Sources */, + 3741311D2B67934B00F3F066 /* SolidityFunction.swift in Sources */, + 374130FD2B67934B00F3F066 /* RPCResponse.swift in Sources */, + 374131072B67934B00F3F066 /* Bytes+SecureRandom.swift in Sources */, + 374131132B67934B00F3F066 /* UnsignedInteger+BytesConvertible.swift in Sources */, + 374130FE2B67934B00F3F066 /* EthereumCall.swift in Sources */, + 374130E62B67934B00F3F066 /* Exports+PromiseKit.swift in Sources */, + 374130F62B67934B00F3F066 /* EthereumData.swift in Sources */, + 374131012B67934B00F3F066 /* Types+EthereumValueConvertible.swift in Sources */, + 374131112B67934B00F3F066 /* Int+ETH.swift in Sources */, + 374130F12B67934B00F3F066 /* RLPItemConvertible.swift in Sources */, + 374131172B67934B00F3F066 /* Eth+Contract.swift in Sources */, + 374130F22B67934B00F3F066 /* RLPDecoder.swift in Sources */, + 374131182B67934B00F3F066 /* SolidityEvent.swift in Sources */, + 3741311B2B67934B00F3F066 /* ERC721.swift in Sources */, + 3741312C2B67934B00F3F066 /* Web3HttpProvider.swift in Sources */, + 374130FB2B67934B00F3F066 /* EthereumTransactionObject.swift in Sources */, + 3741310E2B67934B00F3F066 /* BigUInt+BytesConvertible.swift in Sources */, + 374131142B67934B00F3F066 /* SynchronizedDictionary.swift in Sources */, + 374130EF2B67934B00F3F066 /* RLPItem.swift in Sources */, + 374130F82B67934B00F3F066 /* EthereumSyncStatusObject.swift in Sources */, + 374131162B67934B00F3F066 /* UnsignedInteger+Shifting.swift in Sources */, + 374131222B67934B00F3F066 /* ABIDecoder.swift in Sources */, + 374131282B67934B00F3F066 /* ABIConvertible.swift in Sources */, + 3741310A2B67934B00F3F066 /* BytesConvertible.swift in Sources */, + 374130F32B67934B00F3F066 /* Types+RLPItemConvertible.swift in Sources */, + 374130EA2B67934B00F3F066 /* EthereumAddress.swift in Sources */, + 374131262B67934B00F3F066 /* ABI.swift in Sources */, + 3741310B2B67934B00F3F066 /* String+Conversion.swift in Sources */, + 374131082B67934B00F3F066 /* EthereumUtils.swift in Sources */, + 374131192B67934B00F3F066 /* ABIObject.swift in Sources */, + 374130ED2B67934B00F3F066 /* Web3Provider.swift in Sources */, + 374130F02B67934B00F3F066 /* RLPEncoder.swift in Sources */, + 3741311F2B67934B00F3F066 /* SolidityInvocation.swift in Sources */, + 3741311C2B67934B00F3F066 /* ERC165.swift in Sources */, + 374131292B67934B00F3F066 /* Web3WebSocketProvider.swift in Sources */, + 3741311A2B67934B00F3F066 /* ERC20.swift in Sources */, + 3741310D2B67934B00F3F066 /* CharacterSet+Hex.swift in Sources */, + 374130E52B67934B00F3F066 /* Web3+PromiseKit.swift in Sources */, + 374131052B67934B00F3F066 /* UInt+BytesRepresentable.swift in Sources */, + 374130E82B67934B00F3F066 /* ContractPromiseExtensions.swift in Sources */, + 374131122B67934B00F3F066 /* SynchronizedArray.swift in Sources */, + 3741312A2B67934B00F3F066 /* Web3+WebSocketInitializer.swift in Sources */, + 374131232B67934B00F3F066 /* SolidityType.swift in Sources */, + 374131032B67934B00F3F066 /* String+BytesConvertible.swift in Sources */, + 374130F72B67934B00F3F066 /* RPCRequest.swift in Sources */, + 374131242B67934B00F3F066 /* SolidityType+Codable.swift in Sources */, + 374131042B67934B00F3F066 /* Bytes+HexString.swift in Sources */, + 374130F92B67934B00F3F066 /* EthereumValueConvertible.swift in Sources */, + 3741312B2B67934B00F3F066 /* Web3+HTTPInitializer.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3741307C2B6792EE00F3F066 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 374130862B6792EE00F3F066 /* Web3Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 374130832B6792EE00F3F066 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 374130772B6792EE00F3F066 /* Web3 */; + targetProxy = 374130822B6792EE00F3F066 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 374130882B6792EE00F3F066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 374130892B6792EE00F3F066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 3741308B2B6792EE00F3F066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ZBLH3G5C33; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.lambda256.walletsdk.Web3; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3741308C2B6792EE00F3F066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = ZBLH3G5C33; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.lambda256.walletsdk.Web3; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 3741308E2B6792EE00F3F066 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ZBLH3G5C33; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.lambda256.walletsdk.Web3Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3741308F2B6792EE00F3F066 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ZBLH3G5C33; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.lambda256.walletsdk.Web3Tests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 374130722B6792EE00F3F066 /* Build configuration list for PBXProject "Web3" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 374130882B6792EE00F3F066 /* Debug */, + 374130892B6792EE00F3F066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3741308A2B6792EE00F3F066 /* Build configuration list for PBXNativeTarget "Web3" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3741308B2B6792EE00F3F066 /* Debug */, + 3741308C2B6792EE00F3F066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3741308D2B6792EE00F3F066 /* Build configuration list for PBXNativeTarget "Web3Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3741308E2B6792EE00F3F066 /* Debug */, + 3741308F2B6792EE00F3F066 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 3741306F2B6792EE00F3F066 /* Project object */; +} diff --git a/Web3.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Web3.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/Web3.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Web3.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Web3.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Web3.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Web3/Web3.h b/Web3/Web3.h new file mode 100644 index 00000000..b1f7299b --- /dev/null +++ b/Web3/Web3.h @@ -0,0 +1,18 @@ +// +// Web3.h +// Web3 +// +// Created by colin.jo on 1/29/24. +// + +#import + +//! Project version number for Web3. +FOUNDATION_EXPORT double Web3VersionNumber; + +//! Project version string for Web3. +FOUNDATION_EXPORT const unsigned char Web3VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Web3Tests/Web3Tests.swift b/Web3Tests/Web3Tests.swift new file mode 100644 index 00000000..460dd64c --- /dev/null +++ b/Web3Tests/Web3Tests.swift @@ -0,0 +1,36 @@ +// +// Web3Tests.swift +// Web3Tests +// +// Created by colin.jo on 1/29/24. +// + +import XCTest +@testable import Web3 + +final class Web3Tests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + self.measure { + // Put the code you want to measure the time of here. + } + } + +}

Uj#N&!&pGE7^6urqop)G!k34RTawDNf(Q|-3nAU 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

uEAPfnbji?{ShZCkl-f6KI2@26#kJCE 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̎|!)8wJ&cL3lV?X6iCd^jP59%acdqT%@u}cgJ)rZ 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